From 36b421efc77269574725277533ec3d953ef2ce6c Mon Sep 17 00:00:00 2001 From: Dylan Snyder <114695692+dylan-apex@users.noreply.github.com> Date: Fri, 22 Aug 2025 13:26:11 -0500 Subject: [PATCH 1/9] feat: Allow Union types in input/output schemas This change allows the use of `Union` types in the `input_schema` and `output_schema` of `LlmAgent` and `AgentTool`. This is achieved by: - Removing the restriction on `anyOf` in the function parameter parsing utility. - Using `pydantic.TypeAdapter` to validate and serialize the input and output when the schema is a `Union`. New test cases have been added to cover these scenarios. --- src/google/adk/agents/llm_agent.py | 13 +- .../tools/_function_parameter_parse_util.py | 8 - src/google/adk/tools/agent_tool.py | 11 +- .../unittests/agents/test_llm_agent_fields.py | 48 +++ tests/unittests/tools/test_agent_tool.py | 286 ++++++++++++++++++ 5 files changed, 350 insertions(+), 16 deletions(-) diff --git a/src/google/adk/agents/llm_agent.py b/src/google/adk/agents/llm_agent.py index c3b6582d00..89ce8da465 100644 --- a/src/google/adk/agents/llm_agent.py +++ b/src/google/adk/agents/llm_agent.py @@ -33,6 +33,7 @@ from pydantic import Field from pydantic import field_validator from pydantic import model_validator +from pydantic import TypeAdapter from typing_extensions import override from typing_extensions import TypeAlias @@ -180,9 +181,9 @@ class LlmAgent(BaseAgent): """ # Controlled input/output configurations - Start - input_schema: Optional[type[BaseModel]] = None + input_schema: Optional[Any] = None """The input schema when agent is used as a tool.""" - output_schema: Optional[type[BaseModel]] = None + output_schema: Optional[Any] = None """The output schema when agent replies. NOTE: @@ -470,9 +471,11 @@ def __maybe_save_output_to_state(self, event: Event): # Do not attempt to parse it as JSON. if not result.strip(): return - result = self.output_schema.model_validate_json(result).model_dump( - exclude_none=True - ) + validated_result = TypeAdapter(self.output_schema).validate_json(result) + if isinstance(validated_result, BaseModel): + result = validated_result.model_dump(exclude_none=True) + else: + result = validated_result event.actions.state_delta[self.output_key] = result @model_validator(mode='after') diff --git a/src/google/adk/tools/_function_parameter_parse_util.py b/src/google/adk/tools/_function_parameter_parse_util.py index a0168fbe21..ca92436ae1 100644 --- a/src/google/adk/tools/_function_parameter_parse_util.py +++ b/src/google/adk/tools/_function_parameter_parse_util.py @@ -53,13 +53,6 @@ def _is_builtin_primitive_or_compound( return annotation in _py_builtin_type_to_schema_type.keys() -def _raise_for_any_of_if_mldev(schema: types.Schema): - if schema.any_of: - raise ValueError( - 'AnyOf is not supported in function declaration schema for Google AI.' - ) - - def _update_for_default_if_mldev(schema: types.Schema): if schema.default is not None: # TODO(kech): Remove this workaround once mldev supports default value. @@ -74,7 +67,6 @@ def _raise_if_schema_unsupported( variant: GoogleLLMVariant, schema: types.Schema ): if variant == GoogleLLMVariant.GEMINI_API: - _raise_for_any_of_if_mldev(schema) _update_for_default_if_mldev(schema) diff --git a/src/google/adk/tools/agent_tool.py b/src/google/adk/tools/agent_tool.py index 6a1edcc615..8c887ddcec 100644 --- a/src/google/adk/tools/agent_tool.py +++ b/src/google/adk/tools/agent_tool.py @@ -21,6 +21,7 @@ from pydantic import BaseModel from pydantic import ConfigDict from pydantic import model_validator +from pydantic import TypeAdapter from typing_extensions import override from . import _automatic_function_calling_util @@ -113,7 +114,7 @@ async def run_async( tool_context.actions.skip_summarization = True if isinstance(self.agent, LlmAgent) and self.agent.input_schema: - input_value = self.agent.input_schema.model_validate(args) + input_value = TypeAdapter(self.agent.input_schema).validate_python(args) content = types.Content( role='user', parts=[ @@ -157,9 +158,13 @@ async def run_async( return '' merged_text = '\n'.join(p.text for p in last_event.content.parts if p.text) if isinstance(self.agent, LlmAgent) and self.agent.output_schema: - tool_result = self.agent.output_schema.model_validate_json( + validated_result = TypeAdapter(self.agent.output_schema).validate_json( merged_text - ).model_dump(exclude_none=True) + ) + if isinstance(validated_result, BaseModel): + tool_result = validated_result.model_dump(exclude_none=True) + else: + tool_result = validated_result else: tool_result = merged_text return tool_result diff --git a/tests/unittests/agents/test_llm_agent_fields.py b/tests/unittests/agents/test_llm_agent_fields.py index e62cf4e830..938ad5d418 100644 --- a/tests/unittests/agents/test_llm_agent_fields.py +++ b/tests/unittests/agents/test_llm_agent_fields.py @@ -17,6 +17,7 @@ from typing import Any from typing import cast from typing import Optional +from typing import Union, Literal from google.adk.agents.callback_context import CallbackContext from google.adk.agents.invocation_context import InvocationContext @@ -29,6 +30,10 @@ from google.genai import types from pydantic import BaseModel import pytest +from google.adk.events.event import Event +from google.adk.models.llm_response import LlmResponse +from google.genai.types import Part +from .. import testing_utils async def _create_readonly_context( @@ -279,3 +284,46 @@ def test_allow_transfer_by_default(): assert not agent.disallow_transfer_to_parent assert not agent.disallow_transfer_to_peers + +def test_output_schema_with_union(): + """Tests if agent can have a Union type in output_schema.""" + + class CustomOutput1(BaseModel): + custom_output1: str + + class CustomOutput2(BaseModel): + custom_output2: str + + agent = LlmAgent( + name='test_agent', + output_schema=Union[CustomOutput1, CustomOutput2, Literal['option3']], + output_key='test_output', + ) + + # Test with the first type + event1 = Event( + author='test_agent', + content=types.Content(parts=[Part(text='{"custom_output1": "response1"}')]), + ) + agent._LlmAgent__maybe_save_output_to_state(event1) + assert event1.actions.state_delta['test_output'] == { + 'custom_output1': 'response1' + } + + # Test with the second type + event2 = Event( + author='test_agent', + content=types.Content(parts=[Part(text='{"custom_output2": "response2"}')]), + ) + agent._LlmAgent__maybe_save_output_to_state(event2) + assert event2.actions.state_delta['test_output'] == { + 'custom_output2': 'response2' + } + + # Test with the literal type + event3 = Event( + author='test_agent', + content=types.Content(parts=[Part(text='"option3"')]), + ) + agent._LlmAgent__maybe_save_output_to_state(event3) + assert event3.actions.state_delta['test_output'] == 'option3' \ No newline at end of file diff --git a/tests/unittests/tools/test_agent_tool.py b/tests/unittests/tools/test_agent_tool.py index d181f72f5a..0f8cf5d1c8 100644 --- a/tests/unittests/tools/test_agent_tool.py +++ b/tests/unittests/tools/test_agent_tool.py @@ -12,6 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +from typing import Literal +from typing import Union + from google.adk.agents.callback_context import CallbackContext from google.adk.agents.llm_agent import Agent from google.adk.agents.sequential_agent import SequentialAgent @@ -213,6 +216,168 @@ class CustomOutput(BaseModel): assert mock_model.requests[1].config.response_mime_type == 'application/json' +@mark.parametrize( + 'env_variables', + [ + 'GOOGLE_AI', + # 'VERTEX' + ], + indirect=True, +) +def test_custom_schema_with_union(): + """Tests if agent can have a Union type in output_schema.""" + + class CustomInput(BaseModel): + custom_input: str + + class CustomOutput(BaseModel): + custom_output: str + + class CustomOutput2(BaseModel): + custom_output2: str + + # --- Test Case 1: Model returns the first type in the Union --- + mock_model_1 = testing_utils.MockModel.create( + responses=[ + Part.from_function_call( + name='tool_agent', args={'custom_input': 'test_union_1'} + ), + '{"custom_output": "response_union_1"}', # Matches CustomOutput + 'Final response after union output 1.', + ] + ) + + tool_agent = Agent( + name='tool_agent', + model=mock_model_1, + input_schema=CustomInput, + output_schema=Union[CustomOutput, CustomOutput2, Literal['option3']], + output_key='tool_output_union', + ) + + root_agent = Agent( + name='root_agent', + model=mock_model_1, + tools=[AgentTool(agent=tool_agent)], + ) + + runner = testing_utils.InMemoryRunner(root_agent) + events = runner.run('test_union_input_1') + + simplified_events = testing_utils.simplify_events(events) + assert simplified_events == [ + ( + 'root_agent', + Part.from_function_call( + name='tool_agent', args={'custom_input': 'test_union_1'} + ), + ), + ( + 'root_agent', + Part.from_function_response( + name='tool_agent', + response={'custom_output': 'response_union_1'}, + ), + ), + ('root_agent', 'Final response after union output 1.'), + ] + assert runner.session.state['tool_output_union'] == { + 'custom_output': 'response_union_1' + } + assert len(mock_model_1.requests) == 3 + assert ( + mock_model_1.requests[1].config.response_schema + == Union[CustomOutput, CustomOutput2, Literal['option3']] + ) + + # --- Test Case 2: Model returns the second type in the Union --- + mock_model_2 = testing_utils.MockModel.create( + responses=[ + Part.from_function_call( + name='tool_agent', args={'custom_input': 'test_union_2'} + ), + '{"custom_output2": "response_union_2"}', # Matches CustomOutput2 + 'Final response after union output 2.', + ] + ) + + # Re-configure the agent with the new mock model + tool_agent.model = mock_model_2 + root_agent.model = mock_model_2 + + runner_2 = testing_utils.InMemoryRunner(root_agent) + events_2 = runner_2.run('test_union_input_2') + + simplified_events_2 = testing_utils.simplify_events(events_2) + assert simplified_events_2 == [ + ( + 'root_agent', + Part.from_function_call( + name='tool_agent', args={'custom_input': 'test_union_2'} + ), + ), + ( + 'root_agent', + Part.from_function_response( + name='tool_agent', + response={'custom_output2': 'response_union_2'}, + ), + ), + ('root_agent', 'Final response after union output 2.'), + ] + assert runner_2.session.state['tool_output_union'] == { + 'custom_output2': 'response_union_2' + } + assert len(mock_model_2.requests) == 3 + assert ( + mock_model_2.requests[1].config.response_schema + == Union[CustomOutput, CustomOutput2, Literal['option3']] + ) + + # --- Test Case 3: Model returns the literal type in the Union --- + mock_model_3 = testing_utils.MockModel.create( + responses=[ + Part.from_function_call( + name='tool_agent', args={'custom_input': 'test_union_3'} + ), + '"option3"', # Matches Literal['option3'] + 'Final response after literal output.', + ] + ) + + # Re-configure the agent with the new mock model + tool_agent.model = mock_model_3 + root_agent.model = mock_model_3 + + runner_3 = testing_utils.InMemoryRunner(root_agent) + events_3 = runner_3.run('test_union_input_3') + + simplified_events_3 = testing_utils.simplify_events(events_3) + assert simplified_events_3 == [ + ( + 'root_agent', + Part.from_function_call( + name='tool_agent', args={'custom_input': 'test_union_3'} + ), + ), + ( + 'root_agent', + Part.from_function_response( + name='tool_agent', + response={'result': 'option3'}, + ), + ), + ('root_agent', 'Final response after literal output.'), + ] + # When the result is not a BaseModel, it's stored directly. + assert runner_3.session.state['tool_output_union'] == 'option3' + assert len(mock_model_3.requests) == 3 + assert ( + mock_model_3.requests[1].config.response_schema + == Union[CustomOutput, CustomOutput2, Literal['option3']] + ) + + @mark.parametrize( 'env_variables', [ @@ -355,3 +520,124 @@ class CustomInput(BaseModel): # Should have string response schema for VERTEX_AI when no output_schema assert declaration.response is not None assert declaration.response.type == types.Type.STRING + +@mark.parametrize( + 'env_variables', + [ + 'GOOGLE_AI', + # 'VERTEX' + ], + indirect=True, +) +def test_custom_schema_with_union_input(): + """Tests if agent can have a Union type in input_schema.""" + + class CustomInput1(BaseModel): + custom_input1: str + + class CustomInput2(BaseModel): + custom_input2: str + + mock_model = testing_utils.MockModel.create( + responses=[ + Part.from_function_call( + name='tool_agent', args={'custom_input1': 'test_union_1'} + ), + 'response1', + 'response2', + ] + ) + + tool_agent = Agent( + name='tool_agent', + model=mock_model, + input_schema=Union[CustomInput1, CustomInput2], + ) + + root_agent = Agent( + name='root_agent', + model=mock_model, + tools=[AgentTool(agent=tool_agent)], + ) + + runner = testing_utils.InMemoryRunner(root_agent) + runner.run('test1') + + assert len(mock_model.requests) == 3 + # The second request is the tool agent request. + assert ( + mock_model.requests[1].contents[0].parts[0].text + == '{"custom_input1":"test_union_1"}' + ) + +@mark.parametrize( + 'env_variables', + [ + 'GOOGLE_AI', + ], + indirect=True, +) +def test_custom_schema_with_union_in_model(): + """Tests if agent can have a Union type in a field of a BaseModel.""" + + class MyInput(BaseModel): + my_field: Union[int, str] + + class MyOutput(BaseModel): + my_field: Union[int, str] + + # Test with int + mock_model_1 = testing_utils.MockModel.create( + responses=[ + Part.from_function_call( + name='tool_agent', args={'my_field': 1} + ), + '{"my_field": 2}', + 'response2', + ] + ) + + tool_agent = Agent( + name='tool_agent', + model=mock_model_1, + input_schema=MyInput, + output_schema=MyOutput, + ) + + root_agent = Agent( + name='root_agent', + model=mock_model_1, + tools=[AgentTool(agent=tool_agent)], + ) + + runner = testing_utils.InMemoryRunner(root_agent) + events = runner.run('test1') + simplified_events = testing_utils.simplify_events(events) + + assert simplified_events == [ + ('root_agent', Part.from_function_call(name='tool_agent', args={'my_field': 1})), + ('root_agent', Part.from_function_response(name='tool_agent', response={'my_field': 2})), + ('root_agent', 'response2'), + ] + + # Test with str + mock_model_2 = testing_utils.MockModel.create( + responses=[ + Part.from_function_call( + name='tool_agent', args={'my_field': 'a'} + ), + '{"my_field": "b"}', + 'response2', + ] + ) + tool_agent.model = mock_model_2 + root_agent.model = mock_model_2 + runner = testing_utils.InMemoryRunner(root_agent) + events = runner.run('test1') + simplified_events = testing_utils.simplify_events(events) + + assert simplified_events == [ + ('root_agent', Part.from_function_call(name='tool_agent', args={'my_field': 'a'})), + ('root_agent', Part.from_function_response(name='tool_agent', response={'my_field': 'b'})), + ('root_agent', 'response2'), + ] From 7c5c7a36f4d6ee72072ae569d96246c0eed23cae Mon Sep 17 00:00:00 2001 From: Dylan Snyder <114695692+dylan-apex@users.noreply.github.com> Date: Fri, 22 Aug 2025 13:35:02 -0500 Subject: [PATCH 2/9] fix: allow union types in input/output schema --- tests/unittests/tools/test_agent_tool.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/unittests/tools/test_agent_tool.py b/tests/unittests/tools/test_agent_tool.py index 0f8cf5d1c8..62ccd91754 100644 --- a/tests/unittests/tools/test_agent_tool.py +++ b/tests/unittests/tools/test_agent_tool.py @@ -220,7 +220,7 @@ class CustomOutput(BaseModel): 'env_variables', [ 'GOOGLE_AI', - # 'VERTEX' + 'VERTEX' ], indirect=True, ) @@ -525,7 +525,7 @@ class CustomInput(BaseModel): 'env_variables', [ 'GOOGLE_AI', - # 'VERTEX' + 'VERTEX' ], indirect=True, ) @@ -574,6 +574,7 @@ class CustomInput2(BaseModel): 'env_variables', [ 'GOOGLE_AI', + 'Vertex' ], indirect=True, ) From 4c8ab98cac2c467f8208deea8e6a2942a42d23b8 Mon Sep 17 00:00:00 2001 From: Dylan Snyder <114695692+dylan-apex@users.noreply.github.com> Date: Fri, 22 Aug 2025 13:46:01 -0500 Subject: [PATCH 3/9] autoformat --- .../unittests/agents/test_llm_agent_fields.py | 21 +++++--- tests/unittests/tools/test_agent_tool.py | 50 ++++++++++--------- 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/tests/unittests/agents/test_llm_agent_fields.py b/tests/unittests/agents/test_llm_agent_fields.py index 938ad5d418..55162cd421 100644 --- a/tests/unittests/agents/test_llm_agent_fields.py +++ b/tests/unittests/agents/test_llm_agent_fields.py @@ -16,23 +16,23 @@ from typing import Any from typing import cast +from typing import Literal from typing import Optional -from typing import Union, Literal +from typing import Union from google.adk.agents.callback_context import CallbackContext from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.llm_agent import LlmAgent -from google.adk.agents.loop_agent import LoopAgent from google.adk.agents.readonly_context import ReadonlyContext +from google.adk.events.event import Event from google.adk.models.llm_request import LlmRequest from google.adk.models.registry import LLMRegistry from google.adk.sessions.in_memory_session_service import InMemorySessionService from google.genai import types +from google.genai.types import Part from pydantic import BaseModel import pytest -from google.adk.events.event import Event -from google.adk.models.llm_response import LlmResponse -from google.genai.types import Part + from .. import testing_utils @@ -285,6 +285,7 @@ def test_allow_transfer_by_default(): assert not agent.disallow_transfer_to_parent assert not agent.disallow_transfer_to_peers + def test_output_schema_with_union(): """Tests if agent can have a Union type in output_schema.""" @@ -303,7 +304,9 @@ class CustomOutput2(BaseModel): # Test with the first type event1 = Event( author='test_agent', - content=types.Content(parts=[Part(text='{"custom_output1": "response1"}')]), + content=types.Content( + parts=[Part(text='{"custom_output1": "response1"}')] + ), ) agent._LlmAgent__maybe_save_output_to_state(event1) assert event1.actions.state_delta['test_output'] == { @@ -313,7 +316,9 @@ class CustomOutput2(BaseModel): # Test with the second type event2 = Event( author='test_agent', - content=types.Content(parts=[Part(text='{"custom_output2": "response2"}')]), + content=types.Content( + parts=[Part(text='{"custom_output2": "response2"}')] + ), ) agent._LlmAgent__maybe_save_output_to_state(event2) assert event2.actions.state_delta['test_output'] == { @@ -326,4 +331,4 @@ class CustomOutput2(BaseModel): content=types.Content(parts=[Part(text='"option3"')]), ) agent._LlmAgent__maybe_save_output_to_state(event3) - assert event3.actions.state_delta['test_output'] == 'option3' \ No newline at end of file + assert event3.actions.state_delta['test_output'] == 'option3' diff --git a/tests/unittests/tools/test_agent_tool.py b/tests/unittests/tools/test_agent_tool.py index 62ccd91754..8e7e48c715 100644 --- a/tests/unittests/tools/test_agent_tool.py +++ b/tests/unittests/tools/test_agent_tool.py @@ -19,7 +19,6 @@ from google.adk.agents.llm_agent import Agent from google.adk.agents.sequential_agent import SequentialAgent from google.adk.tools.agent_tool import AgentTool -from google.adk.utils.variant_utils import GoogleLLMVariant from google.genai import types from google.genai.types import Part from pydantic import BaseModel @@ -218,10 +217,7 @@ class CustomOutput(BaseModel): @mark.parametrize( 'env_variables', - [ - 'GOOGLE_AI', - 'VERTEX' - ], + ['GOOGLE_AI', 'VERTEX'], indirect=True, ) def test_custom_schema_with_union(): @@ -521,12 +517,10 @@ class CustomInput(BaseModel): assert declaration.response is not None assert declaration.response.type == types.Type.STRING + @mark.parametrize( 'env_variables', - [ - 'GOOGLE_AI', - 'VERTEX' - ], + ['GOOGLE_AI', 'VERTEX'], indirect=True, ) def test_custom_schema_with_union_input(): @@ -570,12 +564,10 @@ class CustomInput2(BaseModel): == '{"custom_input1":"test_union_1"}' ) + @mark.parametrize( 'env_variables', - [ - 'GOOGLE_AI', - 'Vertex' - ], + ['GOOGLE_AI', 'Vertex'], indirect=True, ) def test_custom_schema_with_union_in_model(): @@ -590,9 +582,7 @@ class MyOutput(BaseModel): # Test with int mock_model_1 = testing_utils.MockModel.create( responses=[ - Part.from_function_call( - name='tool_agent', args={'my_field': 1} - ), + Part.from_function_call(name='tool_agent', args={'my_field': 1}), '{"my_field": 2}', 'response2', ] @@ -616,17 +606,23 @@ class MyOutput(BaseModel): simplified_events = testing_utils.simplify_events(events) assert simplified_events == [ - ('root_agent', Part.from_function_call(name='tool_agent', args={'my_field': 1})), - ('root_agent', Part.from_function_response(name='tool_agent', response={'my_field': 2})), + ( + 'root_agent', + Part.from_function_call(name='tool_agent', args={'my_field': 1}), + ), + ( + 'root_agent', + Part.from_function_response( + name='tool_agent', response={'my_field': 2} + ), + ), ('root_agent', 'response2'), ] # Test with str mock_model_2 = testing_utils.MockModel.create( responses=[ - Part.from_function_call( - name='tool_agent', args={'my_field': 'a'} - ), + Part.from_function_call(name='tool_agent', args={'my_field': 'a'}), '{"my_field": "b"}', 'response2', ] @@ -638,7 +634,15 @@ class MyOutput(BaseModel): simplified_events = testing_utils.simplify_events(events) assert simplified_events == [ - ('root_agent', Part.from_function_call(name='tool_agent', args={'my_field': 'a'})), - ('root_agent', Part.from_function_response(name='tool_agent', response={'my_field': 'b'})), + ( + 'root_agent', + Part.from_function_call(name='tool_agent', args={'my_field': 'a'}), + ), + ( + 'root_agent', + Part.from_function_response( + name='tool_agent', response={'my_field': 'b'} + ), + ), ('root_agent', 'response2'), ] From cfe083c6f198664a4fed670dab99bb33103b7f9c Mon Sep 17 00:00:00 2001 From: Dylan Snyder <114695692+dylan-apex@users.noreply.github.com> Date: Fri, 22 Aug 2025 13:52:30 -0500 Subject: [PATCH 4/9] missed capitalizing --- tests/unittests/tools/test_agent_tool.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unittests/tools/test_agent_tool.py b/tests/unittests/tools/test_agent_tool.py index 8e7e48c715..aa4fc3d26e 100644 --- a/tests/unittests/tools/test_agent_tool.py +++ b/tests/unittests/tools/test_agent_tool.py @@ -567,7 +567,7 @@ class CustomInput2(BaseModel): @mark.parametrize( 'env_variables', - ['GOOGLE_AI', 'Vertex'], + ['GOOGLE_AI', 'VERTEX'], indirect=True, ) def test_custom_schema_with_union_in_model(): From 15e02f5db2a418bcaf60646ffaf34d271a640883 Mon Sep 17 00:00:00 2001 From: Dylan Snyder <114695692+dylan-apex@users.noreply.github.com> Date: Fri, 22 Aug 2025 14:05:26 -0500 Subject: [PATCH 5/9] resolve bot comments --- src/google/adk/agents/llm_agent.py | 7 ++----- src/google/adk/tools/_gemini_schema_util.py | 9 ++++++++- src/google/adk/tools/agent_tool.py | 16 ++++++---------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/google/adk/agents/llm_agent.py b/src/google/adk/agents/llm_agent.py index 89ce8da465..24d2e2dbb4 100644 --- a/src/google/adk/agents/llm_agent.py +++ b/src/google/adk/agents/llm_agent.py @@ -52,6 +52,7 @@ from ..tools.function_tool import FunctionTool from ..tools.tool_configs import ToolConfig from ..tools.tool_context import ToolContext +from ..tools._gemini_schema_util import validate_and_dump_schema from ..utils.context_utils import Aclosing from ..utils.feature_decorator import experimental from .base_agent import BaseAgent @@ -471,11 +472,7 @@ def __maybe_save_output_to_state(self, event: Event): # Do not attempt to parse it as JSON. if not result.strip(): return - validated_result = TypeAdapter(self.output_schema).validate_json(result) - if isinstance(validated_result, BaseModel): - result = validated_result.model_dump(exclude_none=True) - else: - result = validated_result + result = validate_and_dump_schema(self.output_schema, result) event.actions.state_delta[self.output_key] = result @model_validator(mode='after') diff --git a/src/google/adk/tools/_gemini_schema_util.py b/src/google/adk/tools/_gemini_schema_util.py index b7418da009..faf62f8416 100644 --- a/src/google/adk/tools/_gemini_schema_util.py +++ b/src/google/adk/tools/_gemini_schema_util.py @@ -20,7 +20,7 @@ from google.genai.types import JSONSchema from google.genai.types import Schema -from pydantic import Field +from pydantic import Field, BaseModel, TypeAdapter from ..utils.variant_utils import get_google_llm_variant @@ -156,3 +156,10 @@ def _to_gemini_schema(openapi_schema: dict[str, Any]) -> Schema: json_schema=_ExtendedJSONSchema.model_validate(openapi_schema), api_option=get_google_llm_variant(), ) + +def validate_and_dump_schema(schema: Any, json_data: str) -> Any: + """Validates json data against a schema and returns a serializable object.""" + validated_result = TypeAdapter(schema).validate_json(json_data) + if isinstance(validated_result, BaseModel): + return validated_result.model_dump(exclude_none=True) + return validated_result diff --git a/src/google/adk/tools/agent_tool.py b/src/google/adk/tools/agent_tool.py index 8c887ddcec..a901338d53 100644 --- a/src/google/adk/tools/agent_tool.py +++ b/src/google/adk/tools/agent_tool.py @@ -33,6 +33,7 @@ from .tool_configs import BaseToolConfig from .tool_configs import ToolArgsConfig from .tool_context import ToolContext +from ._gemini_schema_util import validate_and_dump_schema if TYPE_CHECKING: from ..agents.base_agent import BaseAgent @@ -115,12 +116,13 @@ async def run_async( if isinstance(self.agent, LlmAgent) and self.agent.input_schema: input_value = TypeAdapter(self.agent.input_schema).validate_python(args) + text = TypeAdapter(self.agent.input_schema).dump_json( + input_value, exclude_none=True + ).decode('utf-8') content = types.Content( role='user', parts=[ - types.Part.from_text( - text=input_value.model_dump_json(exclude_none=True) - ) + types.Part.from_text(text=text) ], ) else: @@ -158,13 +160,7 @@ async def run_async( return '' merged_text = '\n'.join(p.text for p in last_event.content.parts if p.text) if isinstance(self.agent, LlmAgent) and self.agent.output_schema: - validated_result = TypeAdapter(self.agent.output_schema).validate_json( - merged_text - ) - if isinstance(validated_result, BaseModel): - tool_result = validated_result.model_dump(exclude_none=True) - else: - tool_result = validated_result + tool_result = validate_and_dump_schema(self.agent.output_schema, merged_text) else: tool_result = merged_text return tool_result From c595c4490c11c189870bc70d34930457d2d2b1d6 Mon Sep 17 00:00:00 2001 From: Dylan Snyder <114695692+dylan-apex@users.noreply.github.com> Date: Fri, 22 Aug 2025 14:08:27 -0500 Subject: [PATCH 6/9] autoformat --- src/google/adk/agents/llm_agent.py | 2 +- src/google/adk/tools/_gemini_schema_util.py | 15 +++++++++------ src/google/adk/tools/agent_tool.py | 18 ++++++++++-------- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/google/adk/agents/llm_agent.py b/src/google/adk/agents/llm_agent.py index 24d2e2dbb4..c23d06ac50 100644 --- a/src/google/adk/agents/llm_agent.py +++ b/src/google/adk/agents/llm_agent.py @@ -47,12 +47,12 @@ from ..models.llm_response import LlmResponse from ..models.registry import LLMRegistry from ..planners.base_planner import BasePlanner +from ..tools._gemini_schema_util import validate_and_dump_schema from ..tools.base_tool import BaseTool from ..tools.base_toolset import BaseToolset from ..tools.function_tool import FunctionTool from ..tools.tool_configs import ToolConfig from ..tools.tool_context import ToolContext -from ..tools._gemini_schema_util import validate_and_dump_schema from ..utils.context_utils import Aclosing from ..utils.feature_decorator import experimental from .base_agent import BaseAgent diff --git a/src/google/adk/tools/_gemini_schema_util.py b/src/google/adk/tools/_gemini_schema_util.py index faf62f8416..3903c26702 100644 --- a/src/google/adk/tools/_gemini_schema_util.py +++ b/src/google/adk/tools/_gemini_schema_util.py @@ -20,7 +20,9 @@ from google.genai.types import JSONSchema from google.genai.types import Schema -from pydantic import Field, BaseModel, TypeAdapter +from pydantic import BaseModel +from pydantic import Field +from pydantic import TypeAdapter from ..utils.variant_utils import get_google_llm_variant @@ -157,9 +159,10 @@ def _to_gemini_schema(openapi_schema: dict[str, Any]) -> Schema: api_option=get_google_llm_variant(), ) + def validate_and_dump_schema(schema: Any, json_data: str) -> Any: - """Validates json data against a schema and returns a serializable object.""" - validated_result = TypeAdapter(schema).validate_json(json_data) - if isinstance(validated_result, BaseModel): - return validated_result.model_dump(exclude_none=True) - return validated_result + """Validates json data against a schema and returns a serializable object.""" + validated_result = TypeAdapter(schema).validate_json(json_data) + if isinstance(validated_result, BaseModel): + return validated_result.model_dump(exclude_none=True) + return validated_result diff --git a/src/google/adk/tools/agent_tool.py b/src/google/adk/tools/agent_tool.py index a901338d53..f71ac33ca9 100644 --- a/src/google/adk/tools/agent_tool.py +++ b/src/google/adk/tools/agent_tool.py @@ -29,11 +29,11 @@ from ..memory.in_memory_memory_service import InMemoryMemoryService from ..utils.context_utils import Aclosing from ._forwarding_artifact_service import ForwardingArtifactService +from ._gemini_schema_util import validate_and_dump_schema from .base_tool import BaseTool from .tool_configs import BaseToolConfig from .tool_configs import ToolArgsConfig from .tool_context import ToolContext -from ._gemini_schema_util import validate_and_dump_schema if TYPE_CHECKING: from ..agents.base_agent import BaseAgent @@ -116,14 +116,14 @@ async def run_async( if isinstance(self.agent, LlmAgent) and self.agent.input_schema: input_value = TypeAdapter(self.agent.input_schema).validate_python(args) - text = TypeAdapter(self.agent.input_schema).dump_json( - input_value, exclude_none=True - ).decode('utf-8') + text = ( + TypeAdapter(self.agent.input_schema) + .dump_json(input_value, exclude_none=True) + .decode('utf-8') + ) content = types.Content( role='user', - parts=[ - types.Part.from_text(text=text) - ], + parts=[types.Part.from_text(text=text)], ) else: content = types.Content( @@ -160,7 +160,9 @@ async def run_async( return '' merged_text = '\n'.join(p.text for p in last_event.content.parts if p.text) if isinstance(self.agent, LlmAgent) and self.agent.output_schema: - tool_result = validate_and_dump_schema(self.agent.output_schema, merged_text) + tool_result = validate_and_dump_schema( + self.agent.output_schema, merged_text + ) else: tool_result = merged_text return tool_result From 446ac2c9a3f523637076162f538a41f7f77a3912 Mon Sep 17 00:00:00 2001 From: Dylan Snyder <114695692+dylan-apex@users.noreply.github.com> Date: Wed, 5 Nov 2025 09:53:19 -0600 Subject: [PATCH 7/9] Merge branch 'main' into allow-unions-in-schema --- .github/ISSUE_TEMPLATE/bug_report.md | 8 +- .github/pull_request_template.md | 52 + .../analyze-releases-for-adk-docs-updates.yml | 5 + .github/workflows/check-file-contents.yml | 2 +- .github/workflows/copybara-pr-handler.yml | 134 + .github/workflows/pr-triage.yml | 10 +- .github/workflows/triage.yml | 2 - .gitignore | 17 + AGENTS.md | 339 +- CHANGELOG.md | 339 +- CONTRIBUTING.md | 8 +- README.md | 47 +- .../remote_a2a/bigquery_agent/agent.py | 2 +- .../samples/a2a_human_in_loop/README.md | 2 +- .../agent_builder_assistant.py | 197 +- .../instruction_embedded.template | 494 +- .../instruction_query.template | 297 -- .../sub_agents/__init__.py | 5 +- .../tools/__init__.py | 2 - .../tools/cleanup_unused_files.py | 27 +- .../tools/delete_files.py | 13 +- .../tools/explore_project.py | 56 +- .../tools/read_config_files.py | 7 +- .../tools/read_files.py | 18 +- .../tools/resolve_root_directory.py | 100 - .../tools/search_adk_knowledge.py | 85 + .../tools/write_config_files.py | 583 ++- .../tools/write_files.py | 61 +- .../utils/adk_source_utils.py | 4 +- .../utils/resolve_root_directory.py | 87 + .../samples/adk_answering_agent/README.md | 2 +- .../upload_docs_to_vertex_ai_search.py | 21 +- .../samples/adk_answering_agent/utils.py | 6 +- .../adk_docs_updater/agent.py | 18 +- .../adk_docs_updater/main.py | 105 + .../adk_release_analyzer/agent.py | 2 +- .../adk_issue_formatting_agent/agent.py | 8 +- .../samples/adk_knowledge_agent/README.md | 25 + .../samples/adk_knowledge_agent/__init__.py | 15 + .../samples/adk_knowledge_agent/agent.json | 17 + .../samples/adk_knowledge_agent/agent.py | 74 + .../adk_knowledge_agent/requirements.txt | 1 + contributing/samples/adk_pr_agent/agent.py | 2 +- .../samples/adk_pr_triaging_agent/agent.py | 87 +- .../samples/adk_pr_triaging_agent/main.py | 4 + .../samples/adk_pr_triaging_agent/settings.py | 1 - .../samples/adk_triaging_agent/agent.py | 70 +- .../samples/adk_triaging_agent/settings.py | 1 - .../agent_engine_code_execution/README | 18 + .../agent_engine_code_execution/__init__.py | 15 + .../agent_engine_code_execution/agent.py | 95 + .../application_integration_agent/README.md | 2 +- .../application_integration_agent/agent.py | 2 +- .../samples/authn-adk-all-in-one/README.md | 152 + .../agent_openapi_tools/__init__.py | 15 + .../adk_agents/agent_openapi_tools/agent.py | 65 + .../agent_openapi_tools/openapi.yaml | 229 + .../adk_agents/requirements.txt | 1 + .../adk_agents/sample.env | 6 + .../doc_images/adk-auth-all-in-one.svg | 3 + .../doc_images/jwks_updated.png | Bin 0 -> 254940 bytes .../doc_images/jwksgen.png | Bin 0 -> 764114 bytes .../hotel_booker_app/hotelbooker_core.py | 263 ++ .../hotel_booker_app/main.py | 266 ++ .../hotel_booker_app/openapi.yaml | 229 + .../samples/authn-adk-all-in-one/idp/app.py | 569 +++ .../authn-adk-all-in-one/idp/sample.env | 15 + .../authn-adk-all-in-one/idp/sample.jwks.json | 5 + .../idp/templates/admin.html | 210 + .../idp/templates/consent.html | 51 + .../idp/templates/login.html | 49 + .../authn-adk-all-in-one/requirements.txt | 6 + contributing/samples/bigquery/README.md | 29 +- contributing/samples/bigquery/agent.py | 9 +- .../samples/built_in_multi_tools/README.md | 14 + .../samples/built_in_multi_tools/__init__.py | 15 + .../samples/built_in_multi_tools/agent.py | 65 + contributing/samples/cache_analysis/README.md | 114 + .../samples/cache_analysis/__init__.py | 17 + contributing/samples/cache_analysis/agent.py | 854 ++++ .../cache_analysis/run_cache_experiments.py | 715 +++ contributing/samples/cache_analysis/utils.py | 272 ++ contributing/samples/code_execution/agent.py | 4 +- contributing/samples/computer_use/README.md | 96 + contributing/samples/computer_use/agent.py | 43 + .../samples/computer_use/playwright.py | 350 ++ .../samples/computer_use/requirements.txt | 4 + .../samples/crewai_tool_kwargs/README.md | 160 + .../samples/crewai_tool_kwargs/__init__.py | 15 + .../samples/crewai_tool_kwargs/agent.py | 112 + .../samples/crewai_tool_kwargs/main.py | 105 + .../samples/custom_code_execution/README.md | 71 + .../samples/custom_code_execution/__init__.py | 15 + .../samples/custom_code_execution/agent.py | 166 + .../samples/fields_output_schema/agent.py | 4 +- contributing/samples/gepa/OWNERS | 3 + contributing/samples/gepa/README.md | 4 + contributing/samples/gepa/__init__.py | 13 + contributing/samples/gepa/adk_agent.py | 292 ++ contributing/samples/gepa/adk_agent_test.py | 348 ++ contributing/samples/gepa/experiment.py | 675 +++ .../samples/gepa/gepa_tau_bench.ipynb | 1533 ++++++ contributing/samples/gepa/rater_lib.py | 178 + .../gepa/rubric_validation_template.txt | 170 + contributing/samples/gepa/run_experiment.py | 116 + contributing/samples/gepa/tau_bench_agent.py | 169 + contributing/samples/google_api/agent.py | 2 +- .../samples/hello_world_apigeellm/.env-sample | 8 + .../samples/hello_world_apigeellm/README.md | 84 + .../samples/hello_world_apigeellm/agent.py | 108 + .../samples/hello_world_apigeellm/main.py | 112 + contributing/samples/hello_world_app/agent.py | 17 +- contributing/samples/hello_world_app/main.py | 2 +- .../samples/hello_world_gemma/__init__.py | 16 + .../samples/hello_world_gemma/agent.py | 95 + .../samples/hello_world_gemma/main.py | 77 + .../samples/hello_world_ollama/README.md | 2 +- .../samples/human_tool_confirmation/agent.py | 11 + contributing/samples/jira_agent/agent.py | 2 +- contributing/samples/jira_agent/tools.py | 2 +- .../samples/json_passing_agent/README.md | 24 + .../samples/json_passing_agent/__init__.py | 15 + .../samples/json_passing_agent/agent.py | 122 + .../samples/json_passing_agent/main.py | 68 + .../langchain_structured_tool_agent/agent.py | 4 +- .../langchain_youtube_search_agent/README.md | 2 +- .../litellm_with_fallback_models/README.md | 10 + .../litellm_with_fallback_models/__init__.py | 15 + .../litellm_with_fallback_models/agent.py | 88 + .../live_bidi_streaming_multi_agent/agent.py | 36 +- .../live_bidi_streaming_multi_agent/readme.md | 4 +- .../live_bidi_streaming_single_agent/agent.py | 8 +- .../readme.md | 4 +- contributing/samples/logprobs/README.md | 60 + contributing/samples/logprobs/__init__.py | 15 + contributing/samples/logprobs/agent.py | 105 + .../mcp_dynamic_header_agent/README.md | 8 + .../mcp_dynamic_header_agent/__init__.py | 15 + .../samples/mcp_dynamic_header_agent/agent.py | 34 + .../mcp_dynamic_header_agent/header_server.py | 50 + .../samples/mcp_postgres_agent/README.md | 65 + .../samples/mcp_postgres_agent/__init__.py | 15 + .../samples/mcp_postgres_agent/agent.py | 57 + .../mcp_server_side_sampling/README.md | 51 + .../mcp_server_side_sampling/__init__.py | 15 + .../samples/mcp_server_side_sampling/agent.py | 56 + .../mcp_server_side_sampling/mcp_server.py | 81 + .../mcp_service_account_agent/README.md | 55 + .../mcp_service_account_agent/__init__.py | 15 + .../mcp_service_account_agent/agent.py | 74 + contributing/samples/mcp_sse_agent/agent.py | 21 +- .../mcp_sse_agent/filesystem_server.py | 7 + .../samples/mcp_stdio_notion_agent/README.md | 2 +- .../samples/migrate_session_db/README.md | 55 + .../samples/migrate_session_db/__init__.py | 16 + .../samples/migrate_session_db/agent.py | 89 + .../migrate_session_db/dnd_sessions.db | Bin 0 -> 49152 bytes .../samples/migrate_session_db/main.py | 79 + .../sample-output/alembic.ini | 147 + .../sample-output/alembic/README | 1 + .../sample-output/alembic/env.py | 90 + .../sample-output/alembic/script.py.mako | 28 + .../samples/migrate_session_db/sessions.db | Bin 0 -> 49152 bytes .../oauth2_client_credentials/README.md | 143 + .../oauth2_client_credentials/__init__.py | 15 + .../oauth2_client_credentials/agent.py | 134 + .../samples/oauth2_client_credentials/main.py | 152 + .../oauth2_test_server.py | 350 ++ .../samples/oauth_calendar_agent/README.md | 46 +- .../samples/oauth_calendar_agent/agent.py | 4 +- .../output_schema_with_tools/README.md | 34 +- .../samples/output_schema_with_tools/agent.py | 27 +- .../plugin_reflect_tool_retry/README.md | 75 + .../basic/__init__.py | 15 + .../plugin_reflect_tool_retry/basic/agent.py | 77 + .../hallucinating_func_name/__init__.py | 15 + .../hallucinating_func_name/agent.py | 83 + .../samples/pydantic_argument/README.md | 126 + .../samples/pydantic_argument/__init__.py | 15 + .../samples/pydantic_argument/agent.py | 182 + .../samples/pydantic_argument/main.py | 112 + .../samples/rewind_session/__init__.py | 15 + contributing/samples/rewind_session/agent.py | 71 + .../samples/runner_debug_example/README.md | 214 + .../samples/runner_debug_example/__init__.py | 17 + .../samples/runner_debug_example/agent.py | 127 + .../samples/runner_debug_example/main.py | 258 ++ .../samples/session_state_agent/README.md | 4 +- contributing/samples/spanner/agent.py | 132 +- .../samples/spanner_rag_agent/README.md | 48 +- .../samples/spanner_rag_agent/agent.py | 96 +- .../samples/static_instruction/README.md | 95 + .../samples/static_instruction/__init__.py | 29 + .../samples/static_instruction/agent.py | 203 + .../samples/static_instruction/main.py | 182 + .../samples/static_non_text_content/README.md | 131 + .../static_non_text_content/__init__.py | 17 + .../samples/static_non_text_content/agent.py | 227 + .../samples/static_non_text_content/main.py | 223 + .../samples/vertex_code_execution/README.md | 59 + .../samples/vertex_code_execution/__init__.py | 15 + .../samples/vertex_code_execution/agent.py | 100 + contributing/samples/workflow_triage/agent.py | 6 +- llms-full.txt | 208 +- llms.txt | 8 +- pylintrc | 2 +- pyproject.toml | 103 +- scripts/db_migration.sh | 144 + .../adk/a2a/converters/event_converter.py | 29 + .../adk/a2a/converters/part_converter.py | 4 +- .../adk/a2a/converters/request_converter.py | 69 +- .../adk/a2a/executor/a2a_agent_executor.py | 44 +- src/google/adk/a2a/logs/log_utils.py | 84 +- .../adk/a2a/utils/agent_card_builder.py | 2 +- src/google/adk/a2a/utils/agent_to_a2a.py | 5 +- src/google/adk/agents/__init__.py | 16 + src/google/adk/agents/base_agent.py | 131 +- src/google/adk/agents/common_configs.py | 2 +- .../agents/config_schemas/AgentConfig.json | 10 +- src/google/adk/agents/context_cache_config.py | 84 + src/google/adk/agents/invocation_context.py | 188 + src/google/adk/agents/llm_agent.py | 339 +- src/google/adk/agents/llm_agent_config.py | 27 +- src/google/adk/agents/loop_agent.py | 91 +- .../adk/agents/mcp_instruction_provider.py | 107 + src/google/adk/agents/parallel_agent.py | 57 +- src/google/adk/agents/readonly_context.py | 6 + src/google/adk/agents/remote_a2a_agent.py | 121 +- src/google/adk/agents/run_config.py | 25 +- src/google/adk/agents/sequential_agent.py | 76 +- src/google/adk/apps/__init__.py | 2 + src/google/adk/apps/app.py | 57 +- src/google/adk/apps/base_events_summarizer.py | 47 + src/google/adk/apps/compaction.py | 196 + src/google/adk/apps/llm_event_summarizer.py | 135 + src/google/adk/artifacts/artifact_util.py | 116 + .../adk/artifacts/base_artifact_service.py | 114 +- .../adk/artifacts/gcs_artifact_service.py | 226 +- .../artifacts/in_memory_artifact_service.py | 173 +- src/google/adk/auth/auth_handler.py | 2 +- src/google/adk/auth/auth_preprocessor.py | 2 +- src/google/adk/auth/auth_schemes.py | 12 + src/google/adk/auth/credential_manager.py | 134 +- .../exchanger/base_credential_exchanger.py | 4 +- .../exchanger/oauth2_credential_exchanger.py | 107 +- src/google/adk/auth/oauth2_credential_util.py | 37 +- src/google/adk/auth/oauth2_discovery.py | 148 + src/google/adk/cli/adk_web_server.py | 449 +- src/google/adk/cli/agent_graph.py | 1 - src/google/adk/cli/browser/chunk-2WH2EVR6.js | 1 + src/google/adk/cli/browser/chunk-EQDQRRRY.js | 1 - .../{chunk-TXJFAAIW.js => chunk-XMJNYD32.js} | 2 +- src/google/adk/cli/browser/index.html | 12 +- src/google/adk/cli/browser/main-OS2OH2S3.js | 4093 +++++++++++++++++ src/google/adk/cli/browser/main-W7QZBYAR.js | 3914 ---------------- .../adk/cli/browser/polyfills-B6TNHZQ6.js | 15 - .../adk/cli/browser/styles-4VDSPQ37.css | 17 - .../adk/cli/browser/styles-EVMPSV3U.css | 1 + src/google/adk/cli/cli.py | 9 +- src/google/adk/cli/cli_deploy.py | 460 +- src/google/adk/cli/cli_eval.py | 341 +- src/google/adk/cli/cli_tools_click.py | 520 ++- .../cli/conformance/_generated_file_utils.py | 55 + .../adk/cli/conformance/_replay_validators.py | 181 + .../cli/conformance/adk_web_server_client.py | 72 +- src/google/adk/cli/conformance/cli_record.py | 161 + src/google/adk/cli/conformance/cli_test.py | 354 ++ src/google/adk/cli/conformance/test_case.py | 73 + src/google/adk/cli/fast_api.py | 185 +- src/google/adk/cli/plugins/__init__.py | 13 + .../adk/cli/plugins/recordings_plugin.py | 400 ++ .../adk/cli/plugins/recordings_schema.py | 88 + src/google/adk/cli/plugins/replay_plugin.py | 382 ++ src/google/adk/cli/service_registry.py | 224 + src/google/adk/cli/utils/agent_loader.py | 84 +- src/google/adk/cli/utils/evals.py | 149 +- src/google/adk/code_executors/__init__.py | 13 + .../agent_engine_sandbox_code_executor.py | 188 + .../code_executors/built_in_code_executor.py | 4 +- .../code_executors/code_execution_utils.py | 10 +- .../code_executors/container_code_executor.py | 1 + .../adk/code_executors/gke_code_executor.py | 1 + .../unsafe_local_code_executor.py | 4 + .../code_executors/vertex_ai_code_executor.py | 5 +- src/google/adk/dependencies/__init__.py | 13 + src/google/adk/dependencies/rouge_scorer.py | 17 + src/google/adk/dependencies/vertexai.py | 19 + src/google/adk/errors/already_exists_error.py | 28 + .../evaluation/_eval_sets_manager_utils.py | 4 +- src/google/adk/evaluation/agent_evaluator.py | 132 +- src/google/adk/evaluation/app_details.py | 63 + .../adk/evaluation/base_eval_service.py | 12 +- src/google/adk/evaluation/common.py | 3 +- .../adk/evaluation/conversation_scenarios.py | 60 + src/google/adk/evaluation/eval_case.py | 163 +- src/google/adk/evaluation/eval_config.py | 65 + src/google/adk/evaluation/eval_metrics.py | 33 +- .../adk/evaluation/eval_sets_manager.py | 4 +- .../adk/evaluation/evaluation_generator.py | 227 +- src/google/adk/evaluation/evaluator.py | 23 +- .../adk/evaluation/final_response_match_v1.py | 7 +- .../adk/evaluation/final_response_match_v2.py | 24 +- .../adk/evaluation/gcs_eval_sets_manager.py | 11 +- .../adk/evaluation/hallucinations_v1.py | 767 +++ src/google/adk/evaluation/llm_as_judge.py | 41 +- .../adk/evaluation/llm_as_judge_utils.py | 101 + .../evaluation/llm_backed_user_simulator.py | 277 ++ .../adk/evaluation/local_eval_service.py | 109 +- .../adk/evaluation/local_eval_sets_manager.py | 22 +- .../evaluation/metric_evaluator_registry.py | 15 + .../evaluation/request_intercepter_plugin.py | 94 + .../adk/evaluation/response_evaluator.py | 14 +- .../adk/evaluation/rubric_based_evaluator.py | 390 ++ .../rubric_based_final_response_quality_v1.py | 323 ++ .../rubric_based_tool_use_quality_v1.py | 207 + src/google/adk/evaluation/safety_evaluator.py | 8 +- .../adk/evaluation/static_user_simulator.py | 79 + .../adk/evaluation/trajectory_evaluator.py | 189 +- src/google/adk/evaluation/user_simulator.py | 116 + .../adk/evaluation/user_simulator_provider.py | 77 + .../adk/evaluation/vertex_ai_eval_facade.py | 29 +- src/google/adk/events/event.py | 2 +- src/google/adk/events/event_actions.py | 35 + .../adk/examples/vertex_ai_example_store.py | 4 +- .../adk/flows/llm_flows/_code_execution.py | 70 +- .../llm_flows/_output_schema_processor.py | 14 +- src/google/adk/flows/llm_flows/auto_flow.py | 2 +- .../adk/flows/llm_flows/base_llm_flow.py | 98 +- src/google/adk/flows/llm_flows/basic.py | 11 +- src/google/adk/flows/llm_flows/contents.py | 209 +- .../llm_flows/context_cache_processor.py | 161 + src/google/adk/flows/llm_flows/functions.py | 192 +- src/google/adk/flows/llm_flows/identity.py | 6 +- .../adk/flows/llm_flows/instructions.py | 67 +- .../flows/llm_flows/request_confirmation.py | 6 +- src/google/adk/flows/llm_flows/single_flow.py | 3 + .../memory/vertex_ai_memory_bank_service.py | 99 +- .../memory/vertex_ai_rag_memory_service.py | 2 +- src/google/adk/models/__init__.py | 8 +- src/google/adk/models/apigee_llm.py | 230 + src/google/adk/models/base_llm_connection.py | 2 +- src/google/adk/models/cache_metadata.py | 121 + .../models/gemini_context_cache_manager.py | 465 ++ .../adk/models/gemini_llm_connection.py | 6 +- src/google/adk/models/gemma_llm.py | 331 ++ src/google/adk/models/google_llm.py | 93 +- src/google/adk/models/lite_llm.py | 211 +- src/google/adk/models/llm_request.py | 159 +- src/google/adk/models/llm_response.py | 40 +- src/google/adk/plugins/__init__.py | 10 +- src/google/adk/plugins/base_plugin.py | 11 +- .../adk/plugins/bigquery_logging_plugin.py | 612 +++ .../adk/plugins/context_filter_plugin.py | 88 + .../adk/plugins/global_instruction_plugin.py | 130 + src/google/adk/plugins/logging_plugin.py | 5 +- src/google/adk/plugins/plugin_manager.py | 2 +- .../adk/plugins/reflect_retry_tool_plugin.py | 382 ++ .../plugins/save_files_as_artifacts_plugin.py | 114 + src/google/adk/runners.py | 674 ++- src/google/adk/sessions/_session_util.py | 39 +- .../adk/sessions/base_session_service.py | 32 +- .../adk/sessions/database_session_service.py | 188 +- .../adk/sessions/in_memory_session_service.py | 89 +- src/google/adk/sessions/state.py | 4 +- .../adk/sessions/vertex_ai_session_service.py | 540 +-- src/google/adk/telemetry/__init__.py | 27 + src/google/adk/telemetry/google_cloud.py | 162 + src/google/adk/telemetry/setup.py | 175 + .../{telemetry.py => telemetry/tracing.py} | 230 +- src/google/adk/tools/__init__.py | 6 + .../adk/tools/_forwarding_artifact_service.py | 46 +- .../tools/_function_parameter_parse_util.py | 39 +- src/google/adk/tools/_gemini_schema_util.py | 77 +- src/google/adk/tools/_google_credentials.py | 2 +- src/google/adk/tools/agent_tool.py | 17 +- .../adk/tools/apihub_tool/apihub_toolset.py | 2 +- .../apihub_tool/clients/apihub_client.py | 2 +- .../apihub_tool/clients/secret_client.py | 2 +- .../adk/tools/authenticated_function_tool.py | 2 +- .../adk/tools/base_authenticated_tool.py | 9 +- .../adk/tools/bigquery/bigquery_toolset.py | 3 + src/google/adk/tools/bigquery/client.py | 18 +- src/google/adk/tools/bigquery/config.py | 11 +- .../adk/tools/bigquery/data_insights_tool.py | 2 + .../adk/tools/bigquery/metadata_tool.py | 298 ++ src/google/adk/tools/bigquery/query_tool.py | 592 ++- .../computer_use/computer_use_toolset.py | 10 +- src/google/adk/tools/crewai_tool.py | 73 +- .../adk/tools/discovery_engine_search_tool.py | 136 + .../adk/tools/enterprise_search_tool.py | 2 +- src/google/adk/tools/function_tool.py | 69 +- .../tools/google_api_tool/google_api_tool.py | 8 +- .../google_api_tool/google_api_toolset.py | 12 +- .../adk/tools/google_maps_grounding_tool.py | 68 + .../adk/tools/google_search_agent_tool.py | 140 + src/google/adk/tools/google_search_tool.py | 12 +- src/google/adk/tools/google_tool.py | 4 +- src/google/adk/tools/langchain_tool.py | 2 +- src/google/adk/tools/load_artifacts_tool.py | 28 +- src/google/adk/tools/mcp_tool/mcp_tool.py | 111 +- src/google/adk/tools/mcp_tool/mcp_toolset.py | 48 +- .../openapi_spec_parser/operation_parser.py | 4 +- .../openapi_spec_parser/rest_api_tool.py | 8 + .../openapi_spec_parser/tool_auth_handler.py | 6 +- src/google/adk/tools/preload_memory_tool.py | 10 +- .../retrieval/vertex_ai_rag_retrieval.py | 6 +- src/google/adk/tools/spanner/query_tool.py | 60 +- src/google/adk/tools/spanner/search_tool.py | 442 ++ .../adk/tools/spanner/spanner_toolset.py | 12 +- src/google/adk/tools/spanner/utils.py | 107 + src/google/adk/tools/url_context_tool.py | 6 +- src/google/adk/tools/vertex_ai_search_tool.py | 8 +- src/google/adk/utils/_debug_output.py | 108 + .../adk/utils/cache_performance_analyzer.py | 168 + src/google/adk/utils/env_utils.py | 59 + src/google/adk/utils/model_name_utils.py | 31 +- src/google/adk/utils/output_schema_utils.py | 38 + src/google/adk/utils/variant_utils.py | 9 +- src/google/adk/utils/vertex_ai_utils.py | 43 + src/google/adk/utils/yaml_utils.py | 22 +- src/google/adk/version.py | 2 +- tests/integration/conftest.py | 2 +- .../fixture/bigquery_agent/README.md | 67 + .../fixture/bigquery_agent/__init__.py | 15 + .../fixture/bigquery_agent/agent.py | 75 + .../fixture/bigquery_agent/simple.test.json | 538 +++ .../fixture/bigquery_agent/test_config.json | 6 + .../fixture/context_variable_agent/agent.py | 2 +- .../fixture/flow_complex_spark/agent.py | 6 +- .../flow_complex_spark/sample.session.json | 4 +- .../hello_world_agent/test_config.json | 3 +- .../hello_world_agent_async/__init__.py | 15 + .../fixture/hello_world_agent_async/agent.py | 104 + .../roll_die.test.json | 55 + .../hello_world_agent_async/test_config.json | 6 + .../home_automation_agent/test_config.json | 2 +- tests/integration/fixture/tool_agent/agent.py | 16 +- .../fixture/trip_planner_agent/agent.py | 2 +- .../trip_inquiry_multi_turn.test.json | 116 + tests/integration/models/test_gemma_llm.py | 57 + .../models/test_litellm_with_function.py | 4 +- .../test_evalute_agent_in_fixture.py | 4 +- tests/integration/test_multi_agent.py | 2 +- tests/integration/test_single_agent.py | 20 + tests/integration/test_tools.py | 6 +- .../a2a/converters/test_request_converter.py | 117 +- .../a2a/executor/test_a2a_agent_executor.py | 1155 +++-- tests/unittests/a2a/logs/test_log_utils.py | 191 +- .../a2a/utils/test_agent_card_builder.py | 4 +- .../unittests/a2a/utils/test_agent_to_a2a.py | 45 + tests/unittests/agents/test_agent_clone.py | 2 +- tests/unittests/agents/test_base_agent.py | 105 + .../agents/test_context_cache_config.py | 178 + .../test_gemini_context_cache_manager.py | 629 +++ .../agents/test_invocation_context.py | 536 +++ .../agents/test_llm_agent_error_messages.py | 89 + .../unittests/agents/test_llm_agent_fields.py | 188 +- .../agents/test_llm_agent_include_contents.py | 7 +- tests/unittests/agents/test_loop_agent.py | 150 +- .../agents/test_mcp_instruction_provider.py | 210 + tests/unittests/agents/test_parallel_agent.py | 194 +- .../unittests/agents/test_remote_a2a_agent.py | 549 ++- .../agents/test_resumable_llm_agent.py | 416 ++ tests/unittests/agents/test_run_config.py | 35 +- .../unittests/agents/test_sequential_agent.py | 91 +- tests/unittests/apps/test_apps.py | 130 + tests/unittests/apps/test_compaction.py | 334 ++ .../apps/test_llm_event_summarizer.py | 162 + .../artifacts/test_artifact_service.py | 271 +- .../unittests/artifacts/test_artifact_util.py | 109 + .../test_credential_exchanger_registry.py | 2 +- .../test_oauth2_credential_exchanger.py | 120 +- tests/unittests/auth/test_auth_handler.py | 2 +- .../unittests/auth/test_credential_manager.py | 261 +- tests/unittests/auth/test_oauth2_discovery.py | 285 ++ .../conformance/test_adk_web_server_client.py | 37 + tests/unittests/cli/test_fast_api.py | 271 +- tests/unittests/cli/test_service_registry.py | 169 + .../unittests/cli/utils/test_agent_loader.py | 8 +- tests/unittests/cli/utils/test_cli_deploy.py | 102 - tests/unittests/cli/utils/test_cli_eval.py | 51 + .../cli/utils/test_cli_tools_click.py | 136 + tests/unittests/cli/utils/test_evals.py | 455 +- ...test_agent_engine_sandbox_code_executor.py | 122 + .../test_code_executor_context.py | 2 +- tests/unittests/conftest.py | 31 +- .../unittests/evaluation/test_app_details.py | 73 + tests/unittests/evaluation/test_eval_case.py | 283 ++ .../test_eval_config.py} | 27 +- .../evaluation/test_evaluation_generator.py | 457 ++ .../test_final_response_match_v2.py | 27 +- .../evaluation/test_gcs_eval_sets_manager.py | 2 +- .../evaluation/test_hallucinations_v1.py | 1578 +++++++ .../unittests/evaluation/test_llm_as_judge.py | 20 +- .../evaluation/test_llm_as_judge_utils.py | 290 ++ .../test_llm_backed_user_simulator.py | 249 + .../evaluation/test_local_eval_service.py | 356 +- .../test_local_eval_set_results_manager.py | 20 +- .../test_local_eval_sets_manager.py | 32 +- .../test_request_intercepter_plugin.py | 71 + .../evaluation/test_response_evaluator.py | 28 +- .../evaluation/test_rubric_based_evaluator.py | 554 +++ ..._rubric_based_final_response_quality_v1.py | 224 + .../test_rubric_based_tool_use_quality_v1.py | 150 + .../evaluation/test_safety_evaluator.py | 17 +- .../evaluation/test_static_user_simulator.py | 54 + .../evaluation/test_trajectory_evaluator.py | 405 +- .../evaluation/test_user_simulator.py | 45 + .../test_user_simulator_provider.py | 79 + .../evaluation/test_vertex_ai_eval_facade.py | 32 +- .../flows/llm_flows/test_agent_transfer.py | 564 ++- .../flows/llm_flows/test_base_llm_flow.py | 267 +- .../flows/llm_flows/test_basic_processor.py | 43 +- .../flows/llm_flows/test_code_execution.py | 150 + .../flows/llm_flows/test_contents.py | 57 + .../flows/llm_flows/test_contents_branch.py | 12 + .../llm_flows/test_context_cache_processor.py | 646 +++ .../test_functions_error_messages.py | 88 + .../llm_flows/test_functions_sequential.py | 6 +- .../flows/llm_flows/test_functions_simple.py | 6 +- .../flows/llm_flows/test_identity.py | 9 +- .../flows/llm_flows/test_instructions.py | 886 ++++ .../llm_flows/test_output_schema_processor.py | 86 +- .../flows/llm_flows/test_tool_callbacks.py | 165 + .../flows/llm_flows/test_tool_telemetry.py | 4 +- .../test_vertex_ai_memory_bank_service.py | 166 +- tests/unittests/models/test_apigee_llm.py | 414 ++ tests/unittests/models/test_cache_metadata.py | 319 ++ .../models/test_gemini_llm_connection.py | 70 + tests/unittests/models/test_gemma_llm.py | 506 ++ tests/unittests/models/test_google_llm.py | 448 +- tests/unittests/models/test_litellm.py | 503 +- tests/unittests/models/test_llm_request.py | 528 +++ tests/unittests/models/test_llm_response.py | 351 ++ tests/unittests/plugins/__init__.py | 13 + .../plugins/test_bigquery_logging_plugin.py | 508 ++ .../plugins/test_context_filtering_plugin.py | 185 + .../plugins/test_global_instruction_plugin.py | 208 + .../plugins/test_reflect_retry_tool_plugin.py | 583 +++ .../plugins/test_save_files_as_artifacts.py | 297 ++ tests/unittests/runners/__init__.py | 13 + .../runners/test_pause_invocation.py | 528 +++ .../runners/test_resume_invocation.py | 254 + .../runners/test_run_tool_confirmation.py | 941 ++++ tests/unittests/runners/test_runner_debug.py | 917 ++++ tests/unittests/runners/test_runner_rewind.py | 248 + .../sessions/test_dynamic_pickle_type.py | 181 + .../sessions/test_session_service.py | 324 +- .../test_vertex_ai_session_service.py | 480 +- .../streaming/test_live_streaming_configs.py | 56 + tests/unittests/telemetry/test_functional.py | 81 +- .../unittests/telemetry/test_google_cloud.py | 91 + tests/unittests/telemetry/test_setup.py | 107 + tests/unittests/telemetry/test_spans.py | 194 +- tests/unittests/test_runners.py | 308 ++ tests/unittests/testing_utils.py | 83 +- .../tools/bigquery/test_bigquery_client.py | 19 +- .../bigquery/test_bigquery_metadata_tool.py | 38 +- .../bigquery/test_bigquery_query_tool.py | 488 +- .../tools/bigquery/test_bigquery_toolset.py | 5 +- .../computer_use/test_computer_use_toolset.py | 2 +- .../google_api_tool/test_google_api_tool.py | 8 + .../test_google_api_toolset.py | 11 +- .../unittests/tools/mcp_tool/test_mcp_tool.py | 205 +- .../tools/mcp_tool/test_mcp_toolset.py | 29 +- .../tools/openapi_tool/common/test_common.py | 1 - .../openapi_spec_parser/test.yaml | 2 +- .../openapi_spec_parser/test_rest_api_tool.py | 59 + .../test_tool_auth_handler.py | 6 +- .../tools/spanner/test_search_tool.py | 301 ++ .../tools/spanner/test_spanner_toolset.py | 3 +- tests/unittests/tools/test_agent_tool.py | 172 +- .../tools/test_build_function_declaration.py | 32 +- tests/unittests/tools/test_crewai_tool.py | 182 + .../test_discovery_engine_search_tool.py | 138 + .../tools/test_enterprise_web_search_tool.py | 4 +- tests/unittests/tools/test_function_tool.py | 46 +- .../tools/test_function_tool_pydantic.py | 284 ++ .../tools/test_gemini_schema_util.py | 93 +- .../tools/test_google_search_agent_tool.py | 139 + .../tools/test_google_search_tool.py | 4 +- tests/unittests/tools/test_langchain_tool.py | 2 +- tests/unittests/tools/test_mcp_toolset.py | 89 + .../unittests/tools/test_url_context_tool.py | 4 +- .../tools/test_vertex_ai_search_tool.py | 4 +- .../utils/test_cache_performance_analyzer.py | 450 ++ tests/unittests/utils/test_env_utils.py | 49 + .../unittests/utils/test_model_name_utils.py | 96 +- .../utils/test_output_schema_utils.py | 50 + tests/unittests/utils/test_streaming_utils.py | 21 + tests/unittests/utils/test_vertex_ai_utils.py | 91 + tests/unittests/utils/test_yaml_utils.py | 29 + 592 files changed, 67543 insertions(+), 10158 deletions(-) create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/copybara-pr-handler.yml delete mode 100644 contributing/samples/adk_agent_builder_assistant/instruction_query.template delete mode 100644 contributing/samples/adk_agent_builder_assistant/tools/resolve_root_directory.py create mode 100644 contributing/samples/adk_agent_builder_assistant/tools/search_adk_knowledge.py create mode 100644 contributing/samples/adk_agent_builder_assistant/utils/resolve_root_directory.py create mode 100644 contributing/samples/adk_documentation/adk_docs_updater/main.py create mode 100644 contributing/samples/adk_knowledge_agent/README.md create mode 100644 contributing/samples/adk_knowledge_agent/__init__.py create mode 100644 contributing/samples/adk_knowledge_agent/agent.json create mode 100644 contributing/samples/adk_knowledge_agent/agent.py create mode 100644 contributing/samples/adk_knowledge_agent/requirements.txt create mode 100644 contributing/samples/agent_engine_code_execution/README create mode 100644 contributing/samples/agent_engine_code_execution/__init__.py create mode 100644 contributing/samples/agent_engine_code_execution/agent.py create mode 100644 contributing/samples/authn-adk-all-in-one/README.md create mode 100644 contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/__init__.py create mode 100644 contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/agent.py create mode 100644 contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/openapi.yaml create mode 100644 contributing/samples/authn-adk-all-in-one/adk_agents/requirements.txt create mode 100644 contributing/samples/authn-adk-all-in-one/adk_agents/sample.env create mode 100644 contributing/samples/authn-adk-all-in-one/doc_images/adk-auth-all-in-one.svg create mode 100644 contributing/samples/authn-adk-all-in-one/doc_images/jwks_updated.png create mode 100644 contributing/samples/authn-adk-all-in-one/doc_images/jwksgen.png create mode 100644 contributing/samples/authn-adk-all-in-one/hotel_booker_app/hotelbooker_core.py create mode 100644 contributing/samples/authn-adk-all-in-one/hotel_booker_app/main.py create mode 100644 contributing/samples/authn-adk-all-in-one/hotel_booker_app/openapi.yaml create mode 100644 contributing/samples/authn-adk-all-in-one/idp/app.py create mode 100644 contributing/samples/authn-adk-all-in-one/idp/sample.env create mode 100644 contributing/samples/authn-adk-all-in-one/idp/sample.jwks.json create mode 100644 contributing/samples/authn-adk-all-in-one/idp/templates/admin.html create mode 100644 contributing/samples/authn-adk-all-in-one/idp/templates/consent.html create mode 100644 contributing/samples/authn-adk-all-in-one/idp/templates/login.html create mode 100644 contributing/samples/authn-adk-all-in-one/requirements.txt create mode 100644 contributing/samples/built_in_multi_tools/README.md create mode 100644 contributing/samples/built_in_multi_tools/__init__.py create mode 100644 contributing/samples/built_in_multi_tools/agent.py create mode 100644 contributing/samples/cache_analysis/README.md create mode 100644 contributing/samples/cache_analysis/__init__.py create mode 100644 contributing/samples/cache_analysis/agent.py create mode 100644 contributing/samples/cache_analysis/run_cache_experiments.py create mode 100644 contributing/samples/cache_analysis/utils.py create mode 100644 contributing/samples/computer_use/README.md create mode 100755 contributing/samples/computer_use/agent.py create mode 100644 contributing/samples/computer_use/playwright.py create mode 100644 contributing/samples/computer_use/requirements.txt create mode 100644 contributing/samples/crewai_tool_kwargs/README.md create mode 100644 contributing/samples/crewai_tool_kwargs/__init__.py create mode 100644 contributing/samples/crewai_tool_kwargs/agent.py create mode 100644 contributing/samples/crewai_tool_kwargs/main.py create mode 100644 contributing/samples/custom_code_execution/README.md create mode 100644 contributing/samples/custom_code_execution/__init__.py create mode 100644 contributing/samples/custom_code_execution/agent.py create mode 100644 contributing/samples/gepa/OWNERS create mode 100644 contributing/samples/gepa/README.md create mode 100644 contributing/samples/gepa/__init__.py create mode 100644 contributing/samples/gepa/adk_agent.py create mode 100644 contributing/samples/gepa/adk_agent_test.py create mode 100644 contributing/samples/gepa/experiment.py create mode 100644 contributing/samples/gepa/gepa_tau_bench.ipynb create mode 100644 contributing/samples/gepa/rater_lib.py create mode 100644 contributing/samples/gepa/rubric_validation_template.txt create mode 100644 contributing/samples/gepa/run_experiment.py create mode 100644 contributing/samples/gepa/tau_bench_agent.py create mode 100644 contributing/samples/hello_world_apigeellm/.env-sample create mode 100644 contributing/samples/hello_world_apigeellm/README.md create mode 100644 contributing/samples/hello_world_apigeellm/agent.py create mode 100644 contributing/samples/hello_world_apigeellm/main.py create mode 100644 contributing/samples/hello_world_gemma/__init__.py create mode 100644 contributing/samples/hello_world_gemma/agent.py create mode 100644 contributing/samples/hello_world_gemma/main.py create mode 100644 contributing/samples/json_passing_agent/README.md create mode 100755 contributing/samples/json_passing_agent/__init__.py create mode 100755 contributing/samples/json_passing_agent/agent.py create mode 100644 contributing/samples/json_passing_agent/main.py create mode 100644 contributing/samples/litellm_with_fallback_models/README.md create mode 100644 contributing/samples/litellm_with_fallback_models/__init__.py create mode 100644 contributing/samples/litellm_with_fallback_models/agent.py create mode 100644 contributing/samples/logprobs/README.md create mode 100644 contributing/samples/logprobs/__init__.py create mode 100644 contributing/samples/logprobs/agent.py create mode 100644 contributing/samples/mcp_dynamic_header_agent/README.md create mode 100644 contributing/samples/mcp_dynamic_header_agent/__init__.py create mode 100644 contributing/samples/mcp_dynamic_header_agent/agent.py create mode 100644 contributing/samples/mcp_dynamic_header_agent/header_server.py create mode 100644 contributing/samples/mcp_postgres_agent/README.md create mode 100755 contributing/samples/mcp_postgres_agent/__init__.py create mode 100644 contributing/samples/mcp_postgres_agent/agent.py create mode 100644 contributing/samples/mcp_server_side_sampling/README.md create mode 100755 contributing/samples/mcp_server_side_sampling/__init__.py create mode 100755 contributing/samples/mcp_server_side_sampling/agent.py create mode 100644 contributing/samples/mcp_server_side_sampling/mcp_server.py create mode 100644 contributing/samples/mcp_service_account_agent/README.md create mode 100644 contributing/samples/mcp_service_account_agent/__init__.py create mode 100644 contributing/samples/mcp_service_account_agent/agent.py create mode 100644 contributing/samples/migrate_session_db/README.md create mode 100644 contributing/samples/migrate_session_db/__init__.py create mode 100644 contributing/samples/migrate_session_db/agent.py create mode 100644 contributing/samples/migrate_session_db/dnd_sessions.db create mode 100644 contributing/samples/migrate_session_db/main.py create mode 100644 contributing/samples/migrate_session_db/sample-output/alembic.ini create mode 100644 contributing/samples/migrate_session_db/sample-output/alembic/README create mode 100644 contributing/samples/migrate_session_db/sample-output/alembic/env.py create mode 100644 contributing/samples/migrate_session_db/sample-output/alembic/script.py.mako create mode 100644 contributing/samples/migrate_session_db/sessions.db create mode 100644 contributing/samples/oauth2_client_credentials/README.md create mode 100644 contributing/samples/oauth2_client_credentials/__init__.py create mode 100644 contributing/samples/oauth2_client_credentials/agent.py create mode 100644 contributing/samples/oauth2_client_credentials/main.py create mode 100644 contributing/samples/oauth2_client_credentials/oauth2_test_server.py create mode 100644 contributing/samples/plugin_reflect_tool_retry/README.md create mode 100644 contributing/samples/plugin_reflect_tool_retry/basic/__init__.py create mode 100644 contributing/samples/plugin_reflect_tool_retry/basic/agent.py create mode 100644 contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/__init__.py create mode 100644 contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/agent.py create mode 100644 contributing/samples/pydantic_argument/README.md create mode 100644 contributing/samples/pydantic_argument/__init__.py create mode 100644 contributing/samples/pydantic_argument/agent.py create mode 100644 contributing/samples/pydantic_argument/main.py create mode 100644 contributing/samples/rewind_session/__init__.py create mode 100644 contributing/samples/rewind_session/agent.py create mode 100644 contributing/samples/runner_debug_example/README.md create mode 100644 contributing/samples/runner_debug_example/__init__.py create mode 100644 contributing/samples/runner_debug_example/agent.py create mode 100644 contributing/samples/runner_debug_example/main.py create mode 100644 contributing/samples/static_instruction/README.md create mode 100644 contributing/samples/static_instruction/__init__.py create mode 100644 contributing/samples/static_instruction/agent.py create mode 100644 contributing/samples/static_instruction/main.py create mode 100644 contributing/samples/static_non_text_content/README.md create mode 100644 contributing/samples/static_non_text_content/__init__.py create mode 100644 contributing/samples/static_non_text_content/agent.py create mode 100644 contributing/samples/static_non_text_content/main.py create mode 100644 contributing/samples/vertex_code_execution/README.md create mode 100644 contributing/samples/vertex_code_execution/__init__.py create mode 100644 contributing/samples/vertex_code_execution/agent.py create mode 100755 scripts/db_migration.sh create mode 100644 src/google/adk/agents/context_cache_config.py create mode 100644 src/google/adk/agents/mcp_instruction_provider.py create mode 100644 src/google/adk/apps/base_events_summarizer.py create mode 100644 src/google/adk/apps/compaction.py create mode 100644 src/google/adk/apps/llm_event_summarizer.py create mode 100644 src/google/adk/artifacts/artifact_util.py create mode 100644 src/google/adk/auth/oauth2_discovery.py create mode 100644 src/google/adk/cli/browser/chunk-2WH2EVR6.js delete mode 100644 src/google/adk/cli/browser/chunk-EQDQRRRY.js rename src/google/adk/cli/browser/{chunk-TXJFAAIW.js => chunk-XMJNYD32.js} (99%) create mode 100644 src/google/adk/cli/browser/main-OS2OH2S3.js delete mode 100644 src/google/adk/cli/browser/main-W7QZBYAR.js delete mode 100644 src/google/adk/cli/browser/styles-4VDSPQ37.css create mode 100644 src/google/adk/cli/browser/styles-EVMPSV3U.css create mode 100644 src/google/adk/cli/conformance/_generated_file_utils.py create mode 100644 src/google/adk/cli/conformance/_replay_validators.py create mode 100644 src/google/adk/cli/conformance/cli_record.py create mode 100644 src/google/adk/cli/conformance/cli_test.py create mode 100644 src/google/adk/cli/conformance/test_case.py create mode 100644 src/google/adk/cli/plugins/__init__.py create mode 100644 src/google/adk/cli/plugins/recordings_plugin.py create mode 100644 src/google/adk/cli/plugins/recordings_schema.py create mode 100644 src/google/adk/cli/plugins/replay_plugin.py create mode 100644 src/google/adk/cli/service_registry.py create mode 100644 src/google/adk/code_executors/agent_engine_sandbox_code_executor.py create mode 100644 src/google/adk/dependencies/__init__.py create mode 100644 src/google/adk/dependencies/rouge_scorer.py create mode 100644 src/google/adk/dependencies/vertexai.py create mode 100644 src/google/adk/errors/already_exists_error.py create mode 100644 src/google/adk/evaluation/app_details.py create mode 100644 src/google/adk/evaluation/conversation_scenarios.py create mode 100644 src/google/adk/evaluation/hallucinations_v1.py create mode 100644 src/google/adk/evaluation/llm_backed_user_simulator.py create mode 100644 src/google/adk/evaluation/request_intercepter_plugin.py create mode 100644 src/google/adk/evaluation/rubric_based_evaluator.py create mode 100644 src/google/adk/evaluation/rubric_based_final_response_quality_v1.py create mode 100644 src/google/adk/evaluation/rubric_based_tool_use_quality_v1.py create mode 100644 src/google/adk/evaluation/static_user_simulator.py create mode 100644 src/google/adk/evaluation/user_simulator.py create mode 100644 src/google/adk/evaluation/user_simulator_provider.py create mode 100644 src/google/adk/flows/llm_flows/context_cache_processor.py create mode 100644 src/google/adk/models/apigee_llm.py create mode 100644 src/google/adk/models/cache_metadata.py create mode 100644 src/google/adk/models/gemini_context_cache_manager.py create mode 100644 src/google/adk/models/gemma_llm.py create mode 100644 src/google/adk/plugins/bigquery_logging_plugin.py create mode 100644 src/google/adk/plugins/context_filter_plugin.py create mode 100644 src/google/adk/plugins/global_instruction_plugin.py create mode 100644 src/google/adk/plugins/reflect_retry_tool_plugin.py create mode 100644 src/google/adk/plugins/save_files_as_artifacts_plugin.py create mode 100644 src/google/adk/telemetry/__init__.py create mode 100644 src/google/adk/telemetry/google_cloud.py create mode 100644 src/google/adk/telemetry/setup.py rename src/google/adk/{telemetry.py => telemetry/tracing.py} (53%) create mode 100644 src/google/adk/tools/discovery_engine_search_tool.py create mode 100644 src/google/adk/tools/google_maps_grounding_tool.py create mode 100644 src/google/adk/tools/google_search_agent_tool.py create mode 100644 src/google/adk/tools/spanner/search_tool.py create mode 100644 src/google/adk/tools/spanner/utils.py create mode 100644 src/google/adk/utils/_debug_output.py create mode 100644 src/google/adk/utils/cache_performance_analyzer.py create mode 100644 src/google/adk/utils/env_utils.py create mode 100644 src/google/adk/utils/output_schema_utils.py create mode 100644 src/google/adk/utils/vertex_ai_utils.py create mode 100644 tests/integration/fixture/bigquery_agent/README.md create mode 100644 tests/integration/fixture/bigquery_agent/__init__.py create mode 100644 tests/integration/fixture/bigquery_agent/agent.py create mode 100644 tests/integration/fixture/bigquery_agent/simple.test.json create mode 100644 tests/integration/fixture/bigquery_agent/test_config.json create mode 100644 tests/integration/fixture/hello_world_agent_async/__init__.py create mode 100644 tests/integration/fixture/hello_world_agent_async/agent.py create mode 100644 tests/integration/fixture/hello_world_agent_async/roll_die.test.json create mode 100644 tests/integration/fixture/hello_world_agent_async/test_config.json create mode 100644 tests/integration/fixture/trip_planner_agent/trip_inquiry_multi_turn.test.json create mode 100644 tests/integration/models/test_gemma_llm.py create mode 100644 tests/unittests/agents/test_context_cache_config.py create mode 100644 tests/unittests/agents/test_gemini_context_cache_manager.py create mode 100644 tests/unittests/agents/test_invocation_context.py create mode 100644 tests/unittests/agents/test_llm_agent_error_messages.py create mode 100644 tests/unittests/agents/test_mcp_instruction_provider.py create mode 100644 tests/unittests/agents/test_resumable_llm_agent.py create mode 100644 tests/unittests/apps/test_compaction.py create mode 100644 tests/unittests/apps/test_llm_event_summarizer.py create mode 100644 tests/unittests/artifacts/test_artifact_util.py create mode 100644 tests/unittests/auth/test_oauth2_discovery.py create mode 100644 tests/unittests/cli/test_service_registry.py create mode 100644 tests/unittests/cli/utils/test_cli_eval.py create mode 100644 tests/unittests/code_executors/test_agent_engine_sandbox_code_executor.py create mode 100644 tests/unittests/evaluation/test_app_details.py create mode 100644 tests/unittests/evaluation/test_eval_case.py rename tests/unittests/{cli/test_cli_eval.py => evaluation/test_eval_config.py} (80%) create mode 100644 tests/unittests/evaluation/test_evaluation_generator.py create mode 100644 tests/unittests/evaluation/test_hallucinations_v1.py create mode 100644 tests/unittests/evaluation/test_llm_as_judge_utils.py create mode 100644 tests/unittests/evaluation/test_llm_backed_user_simulator.py create mode 100644 tests/unittests/evaluation/test_request_intercepter_plugin.py create mode 100644 tests/unittests/evaluation/test_rubric_based_evaluator.py create mode 100644 tests/unittests/evaluation/test_rubric_based_final_response_quality_v1.py create mode 100644 tests/unittests/evaluation/test_rubric_based_tool_use_quality_v1.py create mode 100644 tests/unittests/evaluation/test_static_user_simulator.py create mode 100644 tests/unittests/evaluation/test_user_simulator.py create mode 100644 tests/unittests/evaluation/test_user_simulator_provider.py create mode 100644 tests/unittests/flows/llm_flows/test_code_execution.py create mode 100644 tests/unittests/flows/llm_flows/test_context_cache_processor.py create mode 100644 tests/unittests/flows/llm_flows/test_functions_error_messages.py create mode 100644 tests/unittests/models/test_apigee_llm.py create mode 100644 tests/unittests/models/test_cache_metadata.py create mode 100644 tests/unittests/models/test_gemma_llm.py create mode 100644 tests/unittests/models/test_llm_response.py create mode 100644 tests/unittests/plugins/__init__.py create mode 100644 tests/unittests/plugins/test_bigquery_logging_plugin.py create mode 100644 tests/unittests/plugins/test_context_filtering_plugin.py create mode 100644 tests/unittests/plugins/test_global_instruction_plugin.py create mode 100644 tests/unittests/plugins/test_reflect_retry_tool_plugin.py create mode 100644 tests/unittests/plugins/test_save_files_as_artifacts.py create mode 100644 tests/unittests/runners/__init__.py create mode 100644 tests/unittests/runners/test_pause_invocation.py create mode 100644 tests/unittests/runners/test_resume_invocation.py create mode 100644 tests/unittests/runners/test_run_tool_confirmation.py create mode 100644 tests/unittests/runners/test_runner_debug.py create mode 100644 tests/unittests/runners/test_runner_rewind.py create mode 100644 tests/unittests/sessions/test_dynamic_pickle_type.py create mode 100644 tests/unittests/telemetry/test_google_cloud.py create mode 100644 tests/unittests/telemetry/test_setup.py create mode 100644 tests/unittests/tools/spanner/test_search_tool.py create mode 100644 tests/unittests/tools/test_crewai_tool.py create mode 100644 tests/unittests/tools/test_discovery_engine_search_tool.py create mode 100644 tests/unittests/tools/test_function_tool_pydantic.py create mode 100644 tests/unittests/tools/test_google_search_agent_tool.py create mode 100644 tests/unittests/tools/test_mcp_toolset.py create mode 100644 tests/unittests/utils/test_cache_performance_analyzer.py create mode 100644 tests/unittests/utils/test_env_utils.py create mode 100644 tests/unittests/utils/test_output_schema_utils.py create mode 100644 tests/unittests/utils/test_vertex_ai_utils.py diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index f04f3f039c..c0251b84a9 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -14,11 +14,12 @@ assignees: '' A clear and concise description of what the bug is. **To Reproduce** +Please share a minimal code and data to reproduce your problem. Steps to reproduce the behavior: 1. Install '...' 2. Run '....' 3. Open '....' -4. See error +4. Provie error or stacktrace **Expected behavior** A clear and concise description of what you expected to happen. @@ -27,12 +28,13 @@ A clear and concise description of what you expected to happen. If applicable, add screenshots to help explain your problem. **Desktop (please complete the following information):** - - OS: [e.g. iOS] + - OS: [e.g. macOS, Linux, Windows] - Python version(python -V): - ADK version(pip show google-adk): **Model Information:** - For example, which model is being used. + - Are you using LiteLLM: Yes/No + - Which model is being used(e.g. gemini-2.5-pro) **Additional context** Add any other context about the problem here. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000000..c8ae09265d --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,52 @@ +**Please ensure you have read the [contribution guide](https://github.com/google/adk-python/blob/main/CONTRIBUTING.md) before creating a pull request.** + +### Link to Issue or Description of Change + +**1. Link to an existing issue (if applicable):** + +- Closes: #_issue_number_ +- Related: #_issue_number_ + +**2. Or, if no issue exists, describe the change:** + +_If applicable, please follow the issue templates to provide as much detail as +possible._ + +**Problem:** +_A clear and concise description of what the problem is._ + +**Solution:** +_A clear and concise description of what you want to happen and why you choose +this solution._ + +### Testing Plan + +_Please describe the tests that you ran to verify your changes. This is required +for all PRs that are not small documentation or typo fixes._ + +**Unit Tests:** + +- [ ] I have added or updated unit tests for my change. +- [ ] All unit tests pass locally. + +_Please include a summary of passed `pytest` results._ + +**Manual End-to-End (E2E) Tests:** + +_Please provide instructions on how to manually test your changes, including any +necessary setup or configuration. Please provide logs or screenshots to help +reviewers better understand the fix._ + +### Checklist + +- [ ] I have read the [CONTRIBUTING.md](https://github.com/google/adk-python/blob/main/CONTRIBUTING.md) document. +- [ ] I have performed a self-review of my own code. +- [ ] I have commented my code, particularly in hard-to-understand areas. +- [ ] I have added tests that prove my fix is effective or that my feature works. +- [ ] New and existing unit tests pass locally with my changes. +- [ ] I have manually tested my changes end-to-end. +- [ ] Any dependent changes have been merged and published in downstream modules. + +### Additional context + +_Add any other context or screenshots about the feature request here._ diff --git a/.github/workflows/analyze-releases-for-adk-docs-updates.yml b/.github/workflows/analyze-releases-for-adk-docs-updates.yml index a357a57938..c8a86fac66 100644 --- a/.github/workflows/analyze-releases-for-adk-docs-updates.yml +++ b/.github/workflows/analyze-releases-for-adk-docs-updates.yml @@ -23,6 +23,11 @@ jobs: with: python-version: '3.11' + - name: Load adk-bot SSH Private Key + uses: webfactory/ssh-agent@v0.9.0 + with: + ssh-private-key: ${{ secrets.ADK_BOT_SSH_PRIVATE_KEY }} + - name: Install dependencies run: | python -m pip install --upgrade pip diff --git a/.github/workflows/check-file-contents.yml b/.github/workflows/check-file-contents.yml index 1f31ac0732..861e2247a0 100644 --- a/.github/workflows/check-file-contents.yml +++ b/.github/workflows/check-file-contents.yml @@ -89,7 +89,7 @@ jobs: - name: Check for import from cli package in certain changed Python files run: | git fetch origin ${{ github.base_ref }} - CHANGED_FILES=$(git diff --diff-filter=ACMR --name-only origin/${{ github.base_ref }}...HEAD | grep -E '\.py$' | grep -v -E 'cli/.*|tests/.*|contributing/samples/' || true) + CHANGED_FILES=$(git diff --diff-filter=ACMR --name-only origin/${{ github.base_ref }}...HEAD | grep -E '\.py$' | grep -v -E 'cli/.*|src/google/adk/tools/apihub_tool/apihub_toolset.py|tests/.*|contributing/samples/' || true) if [ -n "$CHANGED_FILES" ]; then echo "Changed Python files to check:" echo "$CHANGED_FILES" diff --git a/.github/workflows/copybara-pr-handler.yml b/.github/workflows/copybara-pr-handler.yml new file mode 100644 index 0000000000..670389c527 --- /dev/null +++ b/.github/workflows/copybara-pr-handler.yml @@ -0,0 +1,134 @@ +name: Copybara PR Handler + +on: + push: + branches: + - main + workflow_dispatch: + inputs: + pr_number: + description: 'PR number to close (for testing)' + required: true + type: string + commit_sha: + description: 'Commit SHA reference (optional, for testing)' + required: false + type: string + +jobs: + close-imported-pr: + runs-on: ubuntu-latest + permissions: + pull-requests: write + issues: write + contents: read + + steps: + - name: Check for Copybara commits and close PRs + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.ADK_TRIAGE_AGENT }} + script: | + // Check if this is a manual test run + const isManualRun = context.eventName === 'workflow_dispatch'; + + let prsToClose = []; + + if (isManualRun) { + // Manual testing mode + const prNumber = parseInt(context.payload.inputs.pr_number); + const commitSha = context.payload.inputs.commit_sha || context.sha.substring(0, 7); + + console.log('=== MANUAL TEST MODE ==='); + console.log(`Testing with PR #${prNumber}, commit ${commitSha}`); + + prsToClose.push({ prNumber, commitSha }); + } else { + // Normal mode: process commits from push event + const commits = context.payload.commits || []; + console.log(`Found ${commits.length} commit(s) in this push`); + + // Process each commit + for (const commit of commits) { + const sha = commit.id; + const committer = commit.committer.name; + const message = commit.message; + + console.log(`\n--- Processing commit ${sha.substring(0, 7)} ---`); + console.log(`Committer: ${committer}`); + + // Check if this is a Copybara commit + if (committer !== 'Copybara-Service') { + console.log('Not a Copybara commit, skipping'); + continue; + } + + // Extract PR number from commit message + // Pattern: "Merge https://github.com/google/adk-python/pull/3333" + const prMatch = message.match(/Merge https:\/\/github\.com\/google\/adk-python\/pull\/(\d+)/); + + if (!prMatch) { + console.log('No PR number found in Copybara commit message'); + continue; + } + + const prNumber = parseInt(prMatch[1]); + const commitSha = sha.substring(0, 7); + + prsToClose.push({ prNumber, commitSha }); + } + } + + // Process PRs to close + for (const { prNumber, commitSha } of prsToClose) { + console.log(`\n--- Processing PR #${prNumber} ---`); + + // Get PR details to check if it's open + let pr; + try { + pr = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber + }); + } catch (error) { + console.log(`PR #${prNumber} not found or inaccessible:`, error.message); + continue; + } + + // Only close if PR is still open + if (pr.data.state !== 'open') { + console.log(`PR #${prNumber} is already ${pr.data.state}, skipping`); + continue; + } + + const author = pr.data.user.login; + + try { + // Add comment with commit reference + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + body: `Thank you @${author} for your contribution! 🎉\n\nYour changes have been successfully imported and merged via Copybara in commit ${commitSha}.\n\nClosing this PR as the changes are now in the main branch.` + }); + + // Close the PR + await github.rest.pulls.update({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber, + state: 'closed' + }); + + console.log(`Successfully closed PR #${prNumber}`); + } catch (error) { + console.log(`Error closing PR #${prNumber}:`, error.message); + } + } + + if (isManualRun) { + console.log('\n=== TEST COMPLETED ==='); + } else { + console.log('\n--- Finished processing all commits ---'); + } diff --git a/.github/workflows/pr-triage.yml b/.github/workflows/pr-triage.yml index d0491d9eeb..a8a2082094 100644 --- a/.github/workflows/pr-triage.yml +++ b/.github/workflows/pr-triage.yml @@ -3,10 +3,16 @@ name: ADK Pull Request Triaging Agent on: pull_request_target: types: [opened, reopened, edited] + workflow_dispatch: + inputs: + pr_number: + description: 'The Pull Request number to triage' + required: true + type: 'string' jobs: agent-triage-pull-request: - if: "!contains(github.event.pull_request.labels.*.name, 'bot triaged') && !contains(github.event.pull_request.labels.*.name, 'google-contributor')" + if: github.event_name == 'workflow_dispatch' || !contains(github.event.pull_request.labels.*.name, 'google-contributor') runs-on: ubuntu-latest permissions: pull-requests: write @@ -33,7 +39,7 @@ jobs: GOOGLE_GENAI_USE_VERTEXAI: 0 OWNER: 'google' REPO: 'adk-python' - PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number }} + PULL_REQUEST_NUMBER: ${{ github.event.pull_request.number || github.event.inputs.pr_number }} INTERACTIVE: ${{ vars.PR_TRIAGE_INTERACTIVE }} PYTHONPATH: contributing/samples run: python -m adk_pr_triaging_agent.main diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml index 937a3d7d22..57e729e9b5 100644 --- a/.github/workflows/triage.yml +++ b/.github/workflows/triage.yml @@ -3,8 +3,6 @@ name: ADK Issue Triaging Agent on: issues: types: [opened, reopened] - schedule: - - cron: '0 */6 * * *' # every 6h jobs: agent-triage-issues: diff --git a/.gitignore b/.gitignore index 6f398cbf9e..bd44686d80 100644 --- a/.gitignore +++ b/.gitignore @@ -98,3 +98,20 @@ Thumbs.db *.bak *.tmp *.temp + +# AI Coding Tools - Project-specific configs +# Developers should symlink or copy AGENTS.md and add their own overrides locally +.claude/ +CLAUDE.md +.cursor/ +.cursorrules +.cursorignore +.windsurfrules +.aider* +.continue/ +.codeium/ +.githubnext/ +.roo/ +.rooignore +.bolt/ +.v0/ diff --git a/AGENTS.md b/AGENTS.md index 10cf03a970..b478d094e5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,15 +1,59 @@ -# Gemini CLI / Gemini Code Assist Context +# AI Coding Assistant Context -This document provides context for the Gemini CLI and Gemini Code Assist to understand the project and assist with development. +This document provides context for AI coding assistants (Claude Code, Gemini CLI, GitHub Copilot, Cursor, etc.) to understand the ADK Python project and assist with development. ## Project Overview The Agent Development Kit (ADK) is an open-source, code-first Python toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control. While optimized for Gemini and the Google ecosystem, ADK is model-agnostic, deployment-agnostic, and is built for compatibility with other frameworks. ADK was designed to make agent development feel more like software development, to make it easier for developers to create, deploy, and orchestrate agentic architectures that range from simple tasks to complex workflows. +### Key Components + +- **Agent** - Blueprint defining identity, instructions, and tools (`LlmAgent`, `LoopAgent`, `ParallelAgent`, `SequentialAgent`, etc.) +- **Runner** - Execution engine that orchestrates the "Reason-Act" loop, manages LLM calls, executes tools, and handles multi-agent coordination +- **Tool** - Functions/capabilities agents can call (Python functions, OpenAPI specs, MCP tools, Google API tools) +- **Session** - Conversation state management (in-memory, Vertex AI, Spanner-backed) +- **Memory** - Long-term recall across sessions + ## Project Architecture Please refer to [ADK Project Overview and Architecture](https://github.com/google/adk-python/blob/main/contributing/adk_project_overview_and_architecture.md) for details. +### Source Structure + +``` +src/google/adk/ +├── agents/ # Agent implementations (LlmAgent, LoopAgent, ParallelAgent, etc.) +├── runners.py # Core Runner orchestration class +├── tools/ # Tool ecosystem (50+ files) +│ ├── google_api_tool/ +│ ├── bigtable/, bigquery/, spanner/ +│ ├── openapi_tool/ +│ └── mcp_tool/ # Model Context Protocol +├── models/ # LLM integrations (Gemini, Anthropic, LiteLLM) +├── sessions/ # Session management (in-memory, Vertex AI, Spanner) +├── memory/ # Long-term memory services +├── evaluation/ # Evaluation framework (47 files) +├── cli/ # CLI tools and web UI +├── flows/ # Execution flow orchestration +├── a2a/ # Agent-to-Agent protocol +├── telemetry/ # Observability and tracing +└── utils/ # Utility functions +``` + +### Test Structure + +``` +tests/ +├── unittests/ # 2600+ unit tests across 236+ files +│ ├── agents/ +│ ├── tools/ +│ ├── models/ +│ ├── evaluation/ +│ ├── a2a/ +│ └── ... +└── integration/ # Integration tests +``` + ### ADK Live (Bidi-streaming) - ADK live feature can be accessed from runner.run_live(...) and corresponding FAST api endpoint. @@ -17,8 +61,132 @@ Please refer to [ADK Project Overview and Architecture](https://github.com/googl - ADK live related configs are in [run_config.py](https://github.com/google/adk-python/blob/main/src/google/adk/agents/run_config.py). - ADK live under multi-agent scenario: we convert the audio into text. This text will be passed to next agent as context. - Most logics are in [base_llm_flow.py](https://github.com/google/adk-python/blob/main/src/google/adk/flows/llm_flows/base_llm_flow.py) and [gemini_llm_connection.py](https://github.com/google/adk-python/blob/main/src/google/adk/models/gemini_llm_connection.py). +- Input transcription and output transcription should be added to session as Event. +- User audio or model audio should be saved into artifacts with a reference in Event to it. - Tests are in [tests/unittests/streaming](https://github.com/google/adk-python/tree/main/tests/unittests/streaming). +### Agent Structure Convention (Required) + +**All agent directories must follow this structure:** +``` +my_agent/ +├── __init__.py # MUST contain: from . import agent +└── agent.py # MUST define: root_agent = Agent(...) OR app = App(...) +``` + +**Choose one pattern based on your needs:** + +**Option 1 - Simple Agent (for basic agents without plugins):** +```python +from google.adk.agents import Agent +from google.adk.tools import google_search + +root_agent = Agent( + name="search_assistant", + model="gemini-2.5-flash", + instruction="You are a helpful assistant.", + description="An assistant that can search the web.", + tools=[google_search] +) +``` + +**Option 2 - App Pattern (when you need plugins, event compaction, custom configuration):** +```python +from google.adk import Agent +from google.adk.apps import App +from google.adk.plugins import ContextFilterPlugin + +root_agent = Agent( + name="my_agent", + model="gemini-2.5-flash", + instruction="You are a helpful assistant.", + tools=[...], +) + +app = App( + name="my_app", + root_agent=root_agent, + plugins=[ + ContextFilterPlugin(num_invocations_to_keep=3), + ], +) +``` + +**Rationale:** This structure allows the ADK CLI (`adk web`, `adk run`, etc.) to automatically discover and load agents without additional configuration. + +## Development Setup + +### Requirements + +**Minimum requirements:** +- Python 3.9+ (**Python 3.11+ strongly recommended** for best performance) +- `uv` package manager (**required** - faster than pip/venv) + +**Install uv if not already installed:** +```bash +curl -LsSf https://astral.sh/uv/install.sh | sh +``` + +### Setup Instructions + +**Standard setup for development:** +```bash +# Create virtual environment with Python 3.11 +uv venv --python "python3.11" ".venv" +source .venv/bin/activate + +# Install all dependencies for development +uv sync --all-extras +``` + +**Minimal setup for testing only (matches CI):** +```bash +uv sync --extra test --extra eval --extra a2a +``` + +**Virtual Environment Usage (Required):** +- **Always use** `.venv/bin/python` or `.venv/bin/pytest` directly +- **Or activate** with `source .venv/bin/activate` before running commands +- **Never use** `python -m venv` - always create with `uv venv` if missing + +**Rationale:** `uv` is significantly faster and ensures consistent dependency resolution across the team. + +### Building + +```bash +# Build wheel +uv build + +# Install local build for testing +pip install dist/google_adk--py3-none-any.whl +``` + +### Running Agents Locally + +**For interactive development and debugging:** +```bash +# Launch web UI (recommended for development) +adk web path/to/agents_dir +``` + +**For CLI-based testing:** +```bash +# Interactive CLI (prompts for user input) +adk run path/to/my_agent +``` + +**For API/production mode:** +```bash +# Start FastAPI server +adk api_server path/to/agents_dir +``` + +**For running evaluations:** +```bash +# Run evaluation set against agent +adk eval path/to/my_agent path/to/eval_set.json +``` + ## ADK: Style Guides ### Python Style Guide @@ -35,48 +203,68 @@ The project follows the Google Python Style Guide. Key conventions are enforced * **Imports**: Organized and sorted. * **Error Handling**: Specific exceptions should be caught, not general ones like `Exception`. -### Autoformat +### Autoformat (Required Before Committing) + +**Always run** before committing code: +```bash +./autoformat.sh +``` + +**Manual formatting** (if needed): +```bash +# Format imports +isort src/ tests/ contributing/ -We have autoformat.sh to help solve import organize and formatting issues. +# Format code style +pyink --config pyproject.toml src/ tests/ contributing/ +``` +**Check formatting** without making changes: ```bash -# Run in open_source_workspace/ -$ ./autoformat.sh +pyink --check --diff --config pyproject.toml src/ +isort --check src/ ``` +**Formatting Standards (Enforced by CI):** +- **Formatter:** `pyink` (Google-style Python formatter) +- **Line length:** 80 characters maximum +- **Indentation:** 2 spaces (never tabs) +- **Import sorter:** `isort` with Google profile +- **Linter:** `pylint` with Google Python Style Guide + +**Rationale:** Consistent formatting eliminates style debates and makes code reviews focus on logic rather than style. + ### In ADK source -Below styles applies to the ADK source code (under `src/` folder of the Github. -repo). +Below styles applies to the ADK source code (under `src/` folder of the GitHub repo). -#### Use relative imports +#### Use relative imports (Required) ```python -# DO +# DO - Use relative imports from ..agents.llm_agent import LlmAgent -# DON'T +# DON'T - No absolute imports from google.adk.agents.llm_agent import LlmAgent ``` -#### Import from module, not from `__init__.py` +**Rationale:** Relative imports make the code more maintainable and avoid circular import issues in large codebases. + +#### Import from module, not from `__init__.py` (Required) ```python -# DO +# DO - Import directly from module from ..agents.llm_agent import LlmAgent -# DON'T -from ..agents import LlmAgent # import from agents/__init__.py +# DON'T - Import from __init__.py +from ..agents import LlmAgent ``` -#### Always do `from __future__ import annotations` +**Rationale:** Direct module imports make dependencies explicit and improve IDE navigation and refactoring. -```python -# DO THIS, right after the open-source header. -from __future__ import annotations -``` +#### Always do `from __future__ import annotations` (Required) -Like below: +**Rule:** Every source file must include `from __future__ import annotations` immediately after the license header, before any other imports. ```python # Copyright 2025 Google LLC @@ -93,39 +281,72 @@ Like below: # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import annotations +from __future__ import annotations # REQUIRED - Always include this -# ... the rest of the file. +# ... rest of imports ... ``` -This allows us to forward-reference a class without quotes. - -Check out go/pep563 for details. +**Rationale:** This enables forward-referencing classes without quotes, improving code readability and type hint support (PEP 563). ### In ADK tests -#### Use absolute imports +#### Use absolute imports (Required) -In tests, we use `google.adk` same as how our users uses. +**Rule:** Test code must use absolute imports (`google.adk.*`) to match how users import ADK. ```python -# DO +# DO - Use absolute imports from google.adk.agents.llm_agent import LlmAgent -# DON'T +# DON'T - No relative imports in tests from ..agents.llm_agent import LlmAgent ``` -## ADK: Local testing +**Rationale:** Tests should exercise the same import paths that users will use, catching issues with the public API. + +## ADK: Local Testing + +### Unit Tests -### Unit tests +**Quick start:** Run all tests with: +```bash +pytest tests/unittests +``` -Run below command: +**Recommended:** Match CI configuration before submitting PRs: +```bash +uv sync --extra test --extra eval --extra a2a && pytest tests/unittests +``` +**Additional options:** ```bash -$ pytest tests/unittests +# Run tests in parallel for faster execution +pytest tests/unittests -n auto + +# Run a specific test file during development +pytest tests/unittests/agents/test_llm_agent.py + +# Python 3.9 compatibility mode (excludes features requiring 3.10+) +pytest tests/unittests \ + --ignore=tests/unittests/a2a \ + --ignore=tests/unittests/tools/mcp_tool \ + --ignore=tests/unittests/artifacts/test_artifact_service.py ``` +### Testing Philosophy + +**Use real code over mocks:** ADK tests should use real implementations as much as possible instead of mocking. Only mock external dependencies like network calls or cloud services. + +**Test interface behavior, not implementation details:** Tests should verify that the public API behaves correctly, not how it's implemented internally. This makes tests resilient to refactoring and ensures the contract with users remains intact. + +**Test Requirements:** +- Fast and isolated tests where possible +- Use real ADK components; mock only external dependencies (LLM APIs, cloud services, etc.) +- Focus on testing public interfaces and behavior, not internal implementation +- Descriptive test names that explain what behavior is being tested +- High coverage for new features, edge cases, and error conditions +- Location: `tests/unittests/` following source structure + ## Docstring and comments ### Comments - Explaining the Why, Not the What @@ -211,9 +432,49 @@ The following changes are considered breaking and necessitate a MAJOR version - Dependency Removal: Removing support for a previously integrated third-party library or tool type. -## Commit Message Format +## Commit Message Format (Required) + +**All commits must** follow [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) format. + +**Format:** +``` +(): + +[optional body] + +[optional footer] +``` + +**Common types:** `feat`, `fix`, `refactor`, `docs`, `test`, `chore` + +**Examples:** +``` +feat(agents): Add support for App pattern with plugins + +fix(sessions): Prevent memory leak in session cleanup + +refactor(tools): Unify environment variable enabled checks +``` + +**Rationale:** Conventional commits enable automated changelog generation and version management. + +## Key Files and Locations + +Quick reference to important project files: + +- **Main config:** `pyproject.toml` (uses `flit_core` build backend) +- **Dependencies:** `uv.lock` (managed by `uv`) +- **Linting:** `pylintrc` (Google Python Style Guide) +- **Auto-format:** `autoformat.sh` (runs isort + pyink) +- **CLI entry point:** `src/google/adk/cli/cli_tools_click.py` +- **Web UI backend:** `src/google/adk/cli/adk_web_server.py` +- **Main exports:** `src/google/adk/__init__.py` (exports Agent, Runner) +- **Examples:** `contributing/samples/` (100+ agent implementations) + +## Additional Resources -- Please use [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) -format. -- If it's not a breaking change, please add #non-breaking tag. If it's a -breaking change, please add #breaking. \ No newline at end of file +- **Documentation:** https://google.github.io/adk-docs +- **Samples:** https://github.com/google/adk-samples +- **Architecture Details:** `contributing/adk_project_overview_and_architecture.md` +- **Contributing Guide:** `CONTRIBUTING.md` +- **LLM Context:** `llms.txt` (summarized), `llms-full.txt` (comprehensive) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4e1600e4b..480dfd69a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,25 +1,337 @@ # Changelog +## [1.18.0](https://github.com/google/adk-python/compare/v1.17.0...v1.18.0) (2025-11-05) + +### Features + +* **[ADK Visual Agent Builder]** + * Core Features + * Visual workflow designer for agent creation + * Support for multiple agent types (LLM, Sequential, Parallel, Loop, Workflow) + * Agent tool support with nested agent tools + * Built-in and custom tool integration + * Callback management for all ADK callback types (before/after agent, model, tool) + * Assistant to help you build your agents with natural language + * Assistant proposes and writes agent configuration yaml files for you + * Save to test with chat interfaces as normal + * Build and debug at the same time in adk web! + +* **[Core]** + * Add support for extracting cache-related token counts from LiteLLM usage ([4f85e86](https://github.com/google/adk-python/commit/4f85e86fc3915f0e67312a39fe22451968d4f1b1)) + * Expose the Python code run by the code interpreter in the logs ([a2c6a8a](https://github.com/google/adk-python/commit/a2c6a8a85cf4f556e9dacfe46cf384d13d964208)) + * Add run_debug() helper method for quick agent experimentation ([0487eea](https://github.com/google/adk-python/commit/0487eea2abcd05d7efd123962d17b8c6c9a9d975)) + * Allow injecting a custom Runner into `agent_to_a2a` ([156d235](https://github.com/google/adk-python/commit/156d23547915e8f7f5c6ba55e0362f4b133c3968)) + * Support MCP prompts via the McpInstructionProvider class ([88032cf](https://github.com/google/adk-python/commit/88032cf5c56bb2d81842353605f9f5ab4b2206ff)) + +* **[Models]** + * Add model tracking to LiteLlm and introduce a LiteLLM with fallbacks demo ([d4c63fc](https://github.com/google/adk-python/commit/d4c63fc5629e7d70ad8b8185be09243a01e3428f)) + * Add ApigeeLlm as a model that lets ADK Agent developers to connect with an Apigee proxy ([87dcb3f](https://github.com/google/adk-python/commit/87dcb3f7ba344a2ba7d9edfc4817c9e792d90bfc)) + +* **[Integrations]** + * Add example and fix for loading and upgrading old ADK session databases ([338c3c8](https://github.com/google/adk-python/commit/338c3c89c6bce7f3406f729013cedcd78b809a56)) + * Add support for specifying logging level for adk eval cli command ([b1ff85f](https://github.com/google/adk-python/commit/b1ff85fb2347e3402eedd42e3673be7093a99548)) + * Propagate LiteLLM finish_reason to LlmResponse for use in callbacks ([71aa564](https://github.com/google/adk-python/commit/71aa5645f6c3d91fd0e0ddb1ed564188c6727080)) + * Allow LLM request to override the model used in the generate content async method in LiteLLM ([ce8f674](https://github.com/google/adk-python/commit/ce8f674a287368439ba11be3285902671e9bc75a)) + * Add api key argument to Vertex Session and Memory services for Express Mode support ([9014a84](https://github.com/google/adk-python/commit/9014a849eab9f77b82db4a7f2053fb2a96282f03)) + * Added support for enums as arguments for function tools ([240ef5b](https://github.com/google/adk-python/commit/240ef5beea9389911e8c03a6039b353befc716ac)) + * Implement artifact_version related methods in GcsArtifactService ([e194ebb](https://github.com/google/adk-python/commit/e194ebb33c62bc40403ea852a88f77a9511b61a4)) + +* **[Services]** + * Add support for Vertex AI Express Mode when deploying to Agent Engine ([d4b2a8b](https://github.com/google/adk-python/commit/d4b2a8b49f98a9991cb44ac7ec6e538b81a08664)) + * Remove custom polling logic for Vertex AI Session Service since LRO polling is supported in express mode ([546c2a6](https://github.com/google/adk-python/commit/546c2a68165f54e694664d5b6b6740566301782b)) + * Make VertexAiSessionService fully asynchronous ([f7e2a7a](https://github.com/google/adk-python/commit/f7e2a7a40ef248dd6fbba9669503b0828a12f0cc)) + +* **[Tools]** + * Add Bigquery detect_anomalies tool ([9851340](https://github.com/google/adk-python/commit/9851340ad1df86d6f5c21e8984199573f239bb2b)) + * Extend Bigquery detect_anomalies tool to support future data anomaly detection ([38ea749](https://github.com/google/adk-python/commit/38ea749c9cec8e65f5e768f49fd2de79b5545571)) + * Add get_job_info tool to BigQuery toolset ([6429457](https://github.com/google/adk-python/commit/64294572c1c93590aa3c221015a5cb9b440ee948)) + +* **[Evals]** + * Add "final_session_state" to the EvalCase data model ([2274c4f](https://github.com/google/adk-python/commit/2274c4f3040b20da3690aa03272155776ca330c1)) + * Marked expected_invocation as optional field on evaluator interface ([b17c8f1](https://github.com/google/adk-python/commit/b17c8f19e5fc67180d1bdc621f84cd43e357571c)) + * Adds LLM-backed user simulator ([54c4ecc](https://github.com/google/adk-python/commit/54c4ecc73381cffa51cff01c7fb8a2ac59308c53)) + +* **[Observability]** + * Add BigQueryLoggingPlugin for event logging to BigQuery ([b7dbfed](https://github.com/google/adk-python/commit/b7dbfed4a3d4a0165e2c6e51594d1f547bec89d3)) + +* **[Live]** + * Add token usage to live events for bidi streaming ([6e5c0eb](https://github.com/google/adk-python/commit/6e5c0eb6e0474f5b908eb9df20328e7da85ebed9)) + +### Bug Fixes + +* Reduce logging spam for MCP tools without authentication ([11571c3](https://github.com/google/adk-python/commit/11571c37ab948d43cbaa3a1d82522256dfe4d467)) +* Fix typo in several files ([d2888a3](https://github.com/google/adk-python/commit/d2888a3766b87df2baaaa1a67a2235b1b80f138f)) +* Disable SetModelResponseTool workaround for Vertex AI Gemini 2+ models ([6a94af2](https://github.com/google/adk-python/commit/6a94af24bf3367c05a5d405b7e7b79810a1fac4e)) +* Bug when callback_context_invocation_context is missing in GlobalInstructionPlugin ([f81ebdb](https://github.com/google/adk-python/commit/f81ebdb622211031945eb06c3f00ff5208d94f9b)) +* Support models slash prefix in model name extraction ([8dff850](https://github.com/google/adk-python/commit/8dff85099d67623dd6f4a707fb932ea55b8aaf9b)) +* Do not consider events with state delta and no content as final response ([1ee93c8](https://github.com/google/adk-python/commit/1ee93c8bcb7ccd6f33658dc76b2095dd7e58aac9)) +* Parameter filtering for CrewAI functions with **kwargs ([74a3500](https://github.com/google/adk-python/commit/74a3500fc5d4b07e80f914d83a0d91face28086c)) +* Do not treat FinishReason.STOP as error case for LLM responses containing candidates with empty contents ([2f72ceb](https://github.com/google/adk-python/commit/2f72ceb49b452c5a1f257bce6adb004fa5d54472)) +* Fixes null check for reflect_retry plugin sample ([86f0155](https://github.com/google/adk-python/commit/86f01550bd1b52d6d160e8bc54cecc6c4fe8611c)) +* Creates evalset directory on evalset create ([6c3882f](https://github.com/google/adk-python/commit/6c3882f2d66f169d393171be280b6e6218b52a7c)) +* Add ADK_DISABLE_LOAD_DOTENV environment variable that disables automatic loading of .env when running ADK cli, if set to true or 1 ([15afbcd](https://github.com/google/adk-python/commit/15afbcd1587d4102a4dc5c07c0c493917df9d6ea)) +* Allow tenacity 9.0.0 ([ee8acc5](https://github.com/google/adk-python/commit/ee8acc58be7421a3e8eab07b051c45f9319f80dc)) +* Output file uploading to artifact service should handle both base64 encoded and raw bytes ([496f8cd](https://github.com/google/adk-python/commit/496f8cd6bb36d3ba333d7ab1e94e7796d2960300)) +* Correct message part ordering in A2A history ([5eca72f](https://github.com/google/adk-python/commit/5eca72f9bfd05c7c28a3d738391138a59a31167d)) +* Change instruction insertion to respect tool call/response pairs ([1e6a9da](https://github.com/google/adk-python/commit/1e6a9daa63050936ab421f1f684935927aebc63e)) +* DynamicPickleType to support MySQL dialect ([fc15c9a](https://github.com/google/adk-python/commit/fc15c9a0c3c043c0a61dce625b8cd1ee121b4baf)) +* Enable usage metadata in LiteLLM streaming ([f9569bb](https://github.com/google/adk-python/commit/f9569bbb1afbc7f0e8b6e68599590471fd112b9f)) +* Fix issue with MCP tools throwing an error ([1a4261a](https://github.com/google/adk-python/commit/1a4261ad4b66cdeb39d39110a086bd6112b17516)) +* Remove redundant `format` field from LiteLLM content objects ([489c39d](https://github.com/google/adk-python/commit/489c39db01465e38ecbc2c7f32781c349b8cddc9)) +* Update the contribution analysis tool to use original write mode ([54db3d4](https://github.com/google/adk-python/commit/54db3d4434e0706b83a589fa2499d11d439a6e4e)) + +### Improvements + +* Add Community Repo section to README ([432d30a](https://github.com/google/adk-python/commit/432d30af486329aa83f89c5d5752749a85c0b843)) +* Undo adding MCP tools output schema to FunctionDeclaration ([92a7d19](https://github.com/google/adk-python/commit/92a7d1957367d498de773761edd142d8c108d751)) +* Refactor ADK README for clarity and consistency ([b0017ae](https://github.com/google/adk-python/commit/b0017aed4472c73c3b07e71f1d65ae97a5293547)) +* Add support for reversed proxy in adk web ([a0df75b](https://github.com/google/adk-python/commit/a0df75b6fa35d837086decb8802dbf1c0a6637ad)) +* Avoid rendering empty columns as part of detailed results rendering of eval results ([5cb35db](https://github.com/google/adk-python/commit/5cb35db921bf86b5ad0012046bd19fa7cc1e6abb)) +* Clear the behavior of disallow_transfer_to_parent ([48ddd07](https://github.com/google/adk-python/commit/48ddd078941f9240b10f052b6de171c310bc2bc6)) +* Disable the scheduled execution for issue triage workflow ([a02f321](https://github.com/google/adk-python/commit/a02f321f1bdb8be9ad1873db804e0e8393268dc3)) +* Include delimiter when matching events from parent nodes in content processor ([b8a2b6c](https://github.com/google/adk-python/commit/b8a2b6c57080ae29d7a02df7d9fcc2f961d422d2)) +* Improve Tau-bench ADK colab stability ([04dbc42](https://github.com/google/adk-python/commit/04dbc42e50ce40ef3924d1c259e425215e12c2e7)) +* Implement ADK-based agent factory for Tau-bench ([c0c67c8](https://github.com/google/adk-python/commit/c0c67c8698d70ddb9ed958416661f232ef9a5ed8)) +* Add util to run ADK LLM Agent with simulation environment ([87f415a](https://github.com/google/adk-python/commit/87f415a7c36a1f3b6ab84d1fe939726c6ef7f34e)) +* Demonstrate CodeExecutor customization for environment setup ([8eeff35](https://github.com/google/adk-python/commit/8eeff35b35d7e1538a5c9662cc8369f6ff7962f8)) +* Add sample agent for VertexAiCodeExecutor ([edfe553](https://github.com/google/adk-python/commit/edfe5539421d196ca4da14d3a37fac7b598f8c8d)) +* Adds a new sample agent that demonstrates how to integrate PostgreSQL databases using the Model Context Protocol (MCP) ([45a2168](https://github.com/google/adk-python/commit/45a2168e0e6773e595ecfb825d7e4ab0a38c3a38)) +* Add example for using ADK with Fast MCP sampling ([d3796f9](https://github.com/google/adk-python/commit/d3796f9b33251d28d05e6701f11e80f02a2a49e1)) + +## [1.17.0](https://github.com/google/adk-python/compare/v1.16.0...v1.17.0) (2025-10-22) + +### Features + +* **[Core]** + * Add a service registry to provide a generic way to register custom service implementations to be used in FastAPI server. See short instruction [here](https://github.com/google/adk-python/discussions/3175#discussioncomment-14745120). ([391628f](https://github.com/google/adk-python/commit/391628fcdc7b950c6835f64ae3ccab197163c990)) + * Add the ability to rewind a session to before a previous invocation ([9dce06f](https://github.com/google/adk-python/commit/9dce06f9b00259ec42241df4f6638955e783a9d1)) + * Support resuming a parallel agent with multiple branches paused on tool confirmation requests ([9939e0b](https://github.com/google/adk-python/commit/9939e0b087094038b90d86c2fd35c26dd63f1157)) + * Support content union as static instruction ([cc24d61](https://github.com/google/adk-python/commit/cc24d616f80c0eba2b09239b621cf3d176f144ea)) + +* **[Evals]** + * ADK cli allows developers to create an eval set and add an eval case ([ae139bb](https://github.com/google/adk-python/commit/ae139bb461c2e7c6be154b04f3f2c80919808d31)) + +* **[Integrations]** + * Allow custom request and event converters in A2aAgentExecutor ([a17f3b2](https://github.com/google/adk-python/commit/a17f3b2e6d2d48c433b42e27763f3d6df80243ca)) + +* **[Observability]** + * Env variable for disabling llm_request and llm_response in spans ([e50f05a](https://github.com/google/adk-python/commit/e50f05a9fc94834796876f7f112f344f788f202e)) + +* **[Services]** + * Allow passing extra kwargs to create_session of VertexAiSessionService ([6a5eac0](https://github.com/google/adk-python/commit/6a5eac0bdc9adc6907a28f65a3d4d7234e863049)) + * Implement new methods in in-memory artifact service to support custom metadata, artifact versions, etc. ([5a543c0](https://github.com/google/adk-python/commit/5a543c00df2f7a66018df8a67efcf4ce44d4e0e4)) + * Add create_time and mime_type to ArtifactVersion ([2c7a342](https://github.com/google/adk-python/commit/2c7a34259395b1294319118d0f3d1b3b867b44d6)) + * Support returning all sessions when user id is none ([141318f](https://github.com/google/adk-python/commit/141318f77554ae4eb5a360bea524e98eff4a086c)) + +* **[Tools]** + * Support additional headers for Google API toolset ([ed37e34](https://github.com/google/adk-python/commit/ed37e343f0c997d3ee5dc98888c5e0dbd7f2a2b6)) + * Introduces a new AgentEngineSandboxCodeExecutor class that supports executing agent-generated code using the Vertex AI Code Execution Sandbox API ([ee39a89](https://github.com/google/adk-python/commit/ee39a891106316b790621795b5cc529e89815a98)) + * Support dynamic per-request headers in MCPToolset ([6dcbb5a](https://github.com/google/adk-python/commit/6dcbb5aca642290112a7c81162b455526c15cd14)) + * Add `bypass_multi_tools_limit` option to GoogleSearchTool and VertexAiSearchTool ([9a6b850](https://github.com/google/adk-python/commit/9a6b8507f06d8367488aac653efecf665619516c), [6da7274](https://github.com/google/adk-python/commit/6da727485898137948d72906d86d78b6db6331ac)) + * Extend `ReflectAndRetryToolPlugin` to support hallucinating function calls ([f51380f](https://github.com/google/adk-python/commit/f51380f9ea4534591eda76bef27407c0aa7c3fae)) + * Add require_confirmation param for MCP tool/toolset ([78e74b5](https://github.com/google/adk-python/commit/78e74b5bf2d895d72025a44dbcf589f543514a50)) + +* **[UI]** + * Granular per agent speech configuration ([409df13](https://github.com/google/adk-python/commit/409df1378f36b436139aa909fc90a9e9a0776b3a)) + +### Bug Fixes + +* Returns dict as result from McpTool to comply with BaseTool expectations ([4df9263](https://github.com/google/adk-python/commit/4df926388b6e9ebcf517fbacf2f5532fd73b0f71)) +* Fixes the identity prompt to be one line ([7d5c6b9](https://github.com/google/adk-python/commit/7d5c6b9acf0721dd230f08df919c7409eed2b7d0)) +* Fix the broken langchain importing caused their 1.0.0 release ([c850da3](https://github.com/google/adk-python/commit/c850da3a07ec1441037ced1b654d8aacacd277ab)) +* Fix BuiltInCodeExecutor to support visualizations ([ce3418a](https://github.com/google/adk-python/commit/ce3418a69de56570847d45f56ffe7139ab0a47aa)) +* Relax runner app-name enforcement and improve agent origin inference ([dc4975d](https://github.com/google/adk-python/commit/dc4975dea9fb79ad887460659f8f397a537ee38f)) +* Improve error message when adk web is run in wrong directory ([4a842c5](https://github.com/google/adk-python/commit/4a842c5a1334c3ee01406f796651299589fe12ab)) +* Handle App objects in eval and graph endpoints ([0b73a69](https://github.com/google/adk-python/commit/0b73a6937bd84a41f79a9ada3fc782dca1d6fb11)) +* Exclude `additionalProperties` from Gemini schemas ([307896a](https://github.com/google/adk-python/commit/307896aeceeb97efed352bc0217bae10423e5da6)) +* Overall eval status should be NOT_EVALUATED if no invocations were evaluated ([9fbed0b](https://github.com/google/adk-python/commit/9fbed0b15afb94ec8c0c7ab60221bbc97e481b06)) +* Create context cache only when prefix matches with previous request ([9e0b1fb](https://github.com/google/adk-python/commit/9e0b1fb62b06de7ecb79bf77d54a999167d001e1)) +* Handle `App` instances returned by `agent_loader.load_agent` ([847df16](https://github.com/google/adk-python/commit/847df1638cbf1686aa43e8e094121d4e23e40245)) +* Add support for file URIs in LiteLLM content conversion ([85ed500](https://github.com/google/adk-python/commit/85ed500871ff55c74d16e809ddae0d4db66cbc3a)) +* Only exclude scores that are None ([998264a](https://github.com/google/adk-python/commit/998264a5b1b98ac660fcc1359fb2d25c84fa0d87)) +* Better handling the A2A streaming tasks ([bddc70b](https://github.com/google/adk-python/commit/bddc70b5d004ba5304fe05bcbf6e08210f0e6131)) +* Correctly populate context_id in remote_a2a_agent library ([2158b3c](https://github.com/google/adk-python/commit/2158b3c91531e9125761f211f125d9ab41a55e10)) +* Remove unnecessary Aclosing ([2f4f561](https://github.com/google/adk-python/commit/2f4f5611bdb30bd5eb2fdb3a70f43d748371392f)) +* Fix pickle data was truncated error in database session using MySql ([36c96ec](https://github.com/google/adk-python/commit/36c96ec5b356109b7c874c85d8bb24f0bf6c050d)) + +### Improvements + +* Improve hint message in agent loader ([fe1fc75](https://github.com/google/adk-python/commit/fe1fc75c15a7983829bbe0b023f4b612b1e5c018)) +* Fixes MCPToolset --> McpToolset in various places ([d4dc645](https://github.com/google/adk-python/commit/d4dc6454783f747120d407d0dc2cb78f53598d83)) +* Add span for context caching handling and new cache creation ([a2d9f13](https://github.com/google/adk-python/commit/a2d9f13fa1d31e00ba9493fba321ca151cdd9366)) +* Checks gemini version for `2 and above` for gemini-builtin tools ([0df6759](https://github.com/google/adk-python/commit/0df67599c0eb54a9a5df51af06483b40058953bf)) +* Refactor and fix state management in the session service ([8b3ed05](https://github.com/google/adk-python/commit/8b3ed059c24903e8aca0a09d9d503b48af7df850)) +* Update agent builder instructions and remove run command details ([89344da](https://github.com/google/adk-python/commit/89344da81364d921f778c8bbea93e1df6ad1097e)) +* Clarify how to use adk built-in tool in instruction ([d22b8bf](https://github.com/google/adk-python/commit/d22b8bf8907e723f618dfd18e90dd0a5dbc9518c)) +* Delegate the agent state reset logic to LoopAgent ([bb1ea74](https://github.com/google/adk-python/commit/bb1ea74924127d65d763a45b869da3d4ff4d5c5a)) +* Adjust the instruction about default model ([214986e](https://github.com/google/adk-python/commit/214986ebeb53b2ef34c8aa37cd6403106de82c1b)) +* Migrate invocation_context to callback_context ([e2072af](https://github.com/google/adk-python/commit/e2072af69f40474431b6749b7b9dc22fbcbc7730)) +* Correct the callback signatures ([fa84bcb](https://github.com/google/adk-python/commit/fa84bcb5756773eadff486b99c9bd416b4faa9c6)) +* Set default for `bypass_multi_tools_limit` to False for GoogleSearchTool and VertexAiSearchTool ([6da7274](https://github.com/google/adk-python/commit/6da727485898137948d72906d86d78b6db6331ac)) +* Add more clear instruction to the doc updater agent about one PR for each recommended change ([b21d0a5](https://github.com/google/adk-python/commit/b21d0a50d610407be2f10b73a91274840ffdfe18)) +* Add a guideline to avoid content deletion ([16b030b](https://github.com/google/adk-python/commit/16b030b2b25a9b0b489e47b4b148fc4d39aeffcb)) +* Add an sample agent for the `ReflectAndRetryToolPlugin` ([9b8a4aa](https://github.com/google/adk-python/commit/9b8a4aad6fe65ef37885e5c3368d2799a2666534)) +* Improve error message when adk web is run in wrong directory ([4a842c5](https://github.com/google/adk-python/commit/4a842c5a1334c3ee01406f796651299589fe12ab)) +* Add an sample agent for the `ReflectAndRetryToolPlugin` ([9b8a4aa](https://github.com/google/adk-python/commit/9b8a4aad6fe65ef37885e5c3368d2799a2666534)) +* Add span for context caching handling and new cache creation ([a2d9f13](https://github.com/google/adk-python/commit/a2d9f13fa1d31e00ba9493fba321ca151cdd9366)) +* Disable the scheduled execution for issue triage workflow ([bae2102](https://github.com/google/adk-python/commit/bae21027d9bd7f811bed638ecce692262cb33fe5)) +* Correct the callback signatures ([fa84bcb](https://github.com/google/adk-python/commit/fa84bcb5756773eadff486b99c9bd416b4faa9c6)) + +### Documentation + +* Format README.md for samples ([0bdba30](https://github.com/google/adk-python/commit/0bdba3026345872fb907aedd1ed75e4135e58a30)) +* Bump models in llms and llms-full to Gemini 2.5 ([ce46386](https://github.com/google/adk-python/commit/ce4638651f376fb6579993d8468ae57198134729)) +* Update gemini_llm_connection.py - typo spelling correction ([e6e2767](https://github.com/google/adk-python/commit/e6e2767c3901a14187f5527540f318317dd6c8e3)) +* Announce the first ADK Community Call in the README ([731bb90](https://github.com/google/adk-python/commit/731bb9078d01359ae770719a8f5c003680ed9f3e)) + +## [1.16.0](https://github.com/google/adk-python/compare/v1.15.1...v1.16.0) (2025-10-08) + +### Features + +* **[Core]** + * Implementation of LLM context compaction ([e0dd06f](https://github.com/google/adk-python/commit/e0dd06ff04f9d3c2f022873ce145aaae2de02f45)) + * Support pause and resume an invocation in ADK ([ce9c39f](https://github.com/google/adk-python/commit/ce9c39f5a85ed12c22009693b5e6bc65f4641633), + [2f1040f](https://github.com/google/adk-python/commit/2f1040f296db365080b62d6372474d90196ce0d6), + [1ee01cc](https://github.com/google/adk-python/commit/1ee01cc05add44ce460d2cfd3726dceb0c76dceb), + [f005414](https://github.com/google/adk-python/commit/f005414895a57befe880fd58c0d778e499a20d8e), + [fbf7576](https://github.com/google/adk-python/commit/fbf75761bb8d89a70b32c43bbd3fa2f48b81d67c)) +* **[Models]** + * Add `citation_metadata` to `LlmResponse` ([3f28e30](https://github.com/google/adk-python/commit/3f28e30c6da192e90a8100f270274cb9a55a5348)) + * Add support for gemma model via gemini api ([2b5acb9](https://github.com/google/adk-python/commit/2b5acb98f577f5349e788bcf9910c8d7107e63b3)) +* **[Tools]** + * Add `dry_run` functionality to BigQuery `execute_sql` tool ([960eda3](https://github.com/google/adk-python/commit/960eda3d1f2f46dc93a365eb3de03dc3483fe9bb)) + * Add BigQuery analyze_contribution tool ([4bb089d](https://github.com/google/adk-python/commit/4bb089d386d4e8133e9aadbba5c42d31ff281cf6)) + * Spanner ADK toolset supports customizable template SQL and parameterized SQL ([da62700](https://github.com/google/adk-python/commit/da62700d739cb505149554962a8bcfb30f9428cc)) + * Support Oauth2 client credentials grant type ([5c6cdcd](https://github.com/google/adk-python/commit/5c6cdcd197a6780fc86d9183fa208f78c8a975d9)) + * Add `ReflectRetryToolPlugin` to reflect from errors and retry with different arguments when tool errors ([e55b894](https://github.com/google/adk-python/commit/e55b8946d6a2e01aaf018d6a79d11d13c5286152)) + * Support using `VertexAiSearchTool` built-in tool with other tools in the same agent ([4485379](https://github.com/google/adk-python/commit/4485379a049a5c84583a43c85d444ea1f1ba6f12)) + * Support using google search built-in tool with other tools in the same agent ([d3148da](https://github.com/google/adk-python/commit/d3148dacc97f0a9a39b6d7a9640f7b7b0d6f9a6c)) +* **[Evals]** + * Add HallucinationsV1 evaluation metric ([8c73d29](https://github.com/google/adk-python/commit/8c73d29c7557a75d64917ac503da519361d1d762)) + * Add Rubric based tool use metric ([c984b9e](https://github.com/google/adk-python/commit/c984b9e5529b48fff64865a8b805e7e93942ea53)) +* **[UI]** + * Adds `adk web` options for custom logo ([822efe0](https://github.com/google/adk-python/commit/822efe00659607bad2d19ec9a2d14c649fca2d8d)) +* **[Observability]** + * **otel:** Switch CloudTraceSpanExporter to telemetry.googleapis.com ([bd76b46](https://github.com/google/adk-python/commit/bd76b46ce296409d929ae69c5c43347c73e7b365)) + +### Bug Fixes + +* Adapt to new computer use tool name in genai sdk 1.41.0 ([c6dd444](https://github.com/google/adk-python/commit/c6dd444fc947571d089b784fde3a81e17b10cf28)) +* Add AuthConfig json serialization in vertex ai session service ([636def3](https://github.com/google/adk-python/commit/636def3687a85e274e3ab44d906f6d92d49e84c0)) +* Added more agent instructions for doc content changes ([7459962](https://github.com/google/adk-python/commit/745996212db156878554386be34f58658482e687)) +* Convert argument to pydantic model when tool declares it accepts pydantic model as argument ([571c802](https://github.com/google/adk-python/commit/571c802fbaa80b3e65f9ce2db772b9db5a13dbc4)) +* Do not re-create `App` object when loader returns an `App` ([d5c46e4](https://github.com/google/adk-python/commit/d5c46e496009eb55d78637f47162df7fcaf3a7ac)) +* Fix compaction logic ([3f2b457](https://github.com/google/adk-python/commit/3f2b457efd27ed47160811705e30efa6dd09d7c0)) +* Fix the instruction in workflow_triage example agent ([8f3ca03](https://github.com/google/adk-python/commit/8f3ca0359e5b1306c1395770759a74aa48a52347)) +* Fixes a bug that causes intermittent `pydantic` validation errors when uploading files ([e680063](https://github.com/google/adk-python/commit/e68006386fdd0da98feb9c3dce9322e44a9c914d)) +* Handle A2A Task Status Update Event when streaming in remote_a2a_agent ([a5cf80b](https://github.com/google/adk-python/commit/a5cf80b952887c07bb1d56b7bdec28808edcc4a9)) +* Make compactor optional in Events Compaction Config and add a default ([3f4bd67](https://github.com/google/adk-python/commit/3f4bd67b49cd60e6a2e43ccd5192efe450a6e009)) +* Rename SlidingWindowCompactor to LlmEventSummarizer and refine its docstring ([f1abdb1](https://github.com/google/adk-python/commit/f1abdb1938e474564a3a76279a1a0a511f74a750)) +* Rollback compaction handling from _get_contents ([84f2f41](https://github.com/google/adk-python/commit/84f2f417f77ead3748c5bbeac7f144164b9a9416)) +* Set `max_output_tokens` for the agent builder ([2e2d61b](https://github.com/google/adk-python/commit/2e2d61b6fecb90cd474d6f51255678ff74b67a9b)) +* Set default response modality to AUDIO in run_session ([68402bd](https://github.com/google/adk-python/commit/68402bda49083f2d56f8e8488fe13aa58b3bc18c)) +* Update remote_a2a_agent to better handle streaming events and avoid duplicate responses ([8e5f361](https://github.com/google/adk-python/commit/8e5f36126498f751171bb2639c7f5a9e7dca2558)) +* Update the load_artifacts tool so that the model can reliably call it for follow up questions about the same artifact ([238472d](https://github.com/google/adk-python/commit/238472d083b5aa67551bde733fc47826ff062679)) +* Fix VertexAiSessionService base_url override to preserve initialized http_options ([8110e41](https://github.com/google/adk-python/commit/8110e41b36cceddb8b92ba17cffaacf701706b36), [c51ea0b](https://github.com/google/adk-python/commit/c51ea0b52e63de8e43d3dccb24f9d20987784aa5)) +* Handle `App` instances returned by `agent_loader.load_agent` ([847df16](https://github.com/google/adk-python/commit/847df1638cbf1686aa43e8e094121d4e23e40245)) + +### Improvements + +* Migrate VertexAiSessionService to use Agent Engine SDK ([90d4c19](https://github.com/google/adk-python/commit/90d4c19c5115c7af361effa8e12c248225ccf6ab)) +* Migrate VertexAiMemoryBankService to use Agent Engine SDK ([d1efc84](https://github.com/google/adk-python/commit/d1efc8461e82fc31df940b701f1d1b5422214296), [97b950b](https://github.com/google/adk-python/commit/97b950b36b9c16467f0f42216b2dc8395346d7fe), [83fd045](https://github.com/google/adk-python/commit/83fd0457188decdabeae58b4e8be25daa89f2943)) +* Add support for resolving $ref and $defs in OpenAPI schemas ([a239716](https://github.com/google/adk-python/commit/a239716930c72a0dbd2ccabeea69be46110ca48d)) + +### Documentation + +* Update BigQuery samples README ([3021266](https://github.com/google/adk-python/commit/30212669ff61f3cbd6603c3dceadfbcc4cec42f8)) + +## [1.15.1](https://github.com/google/adk-python/compare/v1.15.0...v1.15.1) (2025-09-26) + +### Bug Fixes + +* Fix the deployment failure for Agent Engine ([e172811](https://github.com/google/adk-python/commit/e172811bc7173b9004572f2a2afc7024145d7713)) + +## [1.15.0](https://github.com/google/adk-python/compare/v1.14.1...v1.15.0) (2025-09-24) + +### Features + +* **[Core]** + * Adding the ContextFilterPlugin ([a06bf27](https://github.com/google/adk-python/commit/a06bf278cbc89f521c187ed51b032d82ffdafe2d)) + * Adds plugin to save artifacts for issue [#2176](https://github.com/google/adk-python/issues/2176) ([657369c](https://github.com/google/adk-python/commit/657369cffe142ef3745cd5950d0d24a49f42f7fd)) + * Expose log probs of candidates in LlmResponse ([f7bd3c1](https://github.com/google/adk-python/commit/f7bd3c111c211e880d7c1954dd4508b952704c68)) +* **[Context Caching]** + * Support context caching ([c66245a](https://github.com/google/adk-python/commit/c66245a3b80192c16cb67ee3194f82c9a7c901e5)) + - Support explicit context caching auto creation and lifecycle management. + + Usage: `App(root_agent=..., plugins=..., context_cache_config=...)` + * Support non-text content in static instruction ([61213ce](https://github.com/google/adk-python/commit/61213ce4d4c10f7ecaf6ddb521672059cee27942)) + * Support static instructions ([9be9cc2](https://github.com/google/adk-python/commit/9be9cc2feee92241fd2fbf9dea3a42de5a78e9ce)) + - Support static instruction that won't change, put at the beginning of + the instruction. + Static instruction support inline_data and file_data as contents. + Dynamic instruction moved to the end of LlmRequest, increasing prefix + caching matching size. + + Usage: + `LlmAgent(model=...,static_instruction =types.Content(parts=...), ... )` +* **[Observability]** + * Add --otel_to_cloud experimental support ([1ae0b82](https://github.com/google/adk-python/commit/1ae0b82f5602a57ad1ca975ca0b7c85003d1a28a), [b131268](https://github.com/google/adk-python/commit/b1312680f4ea9f21c3246a1d24392619643d71f5), [7870480](https://github.com/google/adk-python/commit/7870480c63bb4fc08cfb3cabc0e1f0458f0e85bd)) + * Add GenAI Instrumentation if --otel_to_cloud is enabled ([cee365a](https://github.com/google/adk-python/commit/cee365a13d0d1b1f2be046c1cc29e24a8d1fdbcc)) + * Support standard OTel env variables for exporter endpoints ([f157b2e](https://github.com/google/adk-python/commit/f157b2ee4caf4055e78f4657254e45913895f5de)) + * Temporarily disable Cloud Monitoring integration in --otel_to_cloud ([3b80337](https://github.com/google/adk-python/commit/3b80337faf427460e4743e25dbb92578f823513f)) +* **[Services]** + * Add endpoint to generate memory from session ([2595824](https://github.com/google/adk-python/commit/25958242db890b4d2aac8612f7f7cfbb561727fa)) +* **[Tools]** + * Add Google Maps Grounding Tool to ADK ([6b49391](https://github.com/google/adk-python/commit/6b493915469ecb42068e24818ab547b0856e4709)) + * **MCP:** Initialize tool_name_prefix in MCPToolse ([86dea5b](https://github.com/google/adk-python/commit/86dea5b53ac305367283b7e353b60d0f4515be3b)) +* **[Evals]** + * Data model for storing App Details and data model for steps ([01923a9](https://github.com/google/adk-python/commit/01923a9227895906ca8ae32712d65b178e2cd7d5)) + * Adds Rubric based final response evaluator ([5a485b0](https://github.com/google/adk-python/commit/5a485b01cd64cb49735e13ebd5e7fa3da02cd85f)) + * Populate AppDetails to each Invocation ([d486795](https://github.com/google/adk-python/commit/d48679582de91050ca9c5106402319be9a8ae7e8)) +* **[Samples]** + * Make the bigquery sample agent run with ADC out-of-the-box ([10cf377](https://github.com/google/adk-python/commit/10cf37749417856e394e62896231e41b13420f18)) + +### Bug Fixes + +* Close runners after running eval ([86ee6e3](https://github.com/google/adk-python/commit/86ee6e3fa3690148d60358fc3dacb0e0ab40942b)) +* Filter out thought parts when saving agent output to state ([632bf8b](https://github.com/google/adk-python/commit/632bf8b0bcf18ff4e4505e4e5f4c626510f366a2)) +* Ignore empty function chunk in LiteLlm streaming response ([8a92fd1](https://github.com/google/adk-python/commit/8a92fd18b600da596c22fd80c6148511a136dfd0)) +* Introduces a `raw_mcp_tool` method in `McpTool` to provide direct access to the underlying MCP tool ([6158075](https://github.com/google/adk-python/commit/6158075a657f8fe0835679e509face6191905403)) +* Make a copy of the `columns` instead of modifying it in place ([aef1ee9](https://github.com/google/adk-python/commit/aef1ee97a55a310f3959d475b8d7d6bc3915ae48)) +* Prevent escaping of Latin characters in LLM response ([c9ea80a](https://github.com/google/adk-python/commit/c9ea80af28e586c9cc1f643b365cdba82f80c700)) +* Retain the consumers and transport registry when recreating the ClientFactory in remote_a2a_agent.py ([6bd33e1](https://github.com/google/adk-python/commit/6bd33e1be36f741a6ed0514197550f9f336262ed)) +* Remove unsupported 'type': 'unknown' in test_common.py for fastapi 0.117.1 ([3745221](https://github.com/google/adk-python/commit/374522197fa6843f786bfd12d17ce0fc20461dfd)) + +### Documentation + +* Correct the documentation of `after_agent_callback` ([b9735b2](https://github.com/google/adk-python/commit/b9735b2193267645781b268231d63c23c6fec654)) + +## [1.14.1](https://github.com/google/adk-python/compare/v1.14.0...v1.14.1) (2025-09-12) + +### Bug Fixes + +* Fix logging issues with RemoteA2aAgent [0c1f1fa](https://github.com/google/adk-python/commit/0c1f1fadeb5a6357af9cad0eff5d5e7103fc88b0) + ## [1.14.0](https://github.com/google/adk-python/compare/v1.13.0...v1.14.0) (2025-09-10) ### Features -* [A2A] +* **[A2A]** * Allow users to pass their own agent card to to_a2a method [a1679da](https://github.com/google/adk-python/commit/a1679dae3fef70f1231afba3e97d45b59c314ae3) * Allow custom part converters in A2A classes [b05fef9](https://github.com/google/adk-python/commit/b05fef9ba71f95ab2658eb4eb5608c141d49f82f) -* [Tools] +* **[Tools]** * Allow setting agent/application name and compute project for BigQuery tools [11a2ffe](https://github.com/google/adk-python/commit/11a2ffe35adbae977b49ceccf0e76e20c6dc90b6) * Add BigQuery forecast tool [0935a40](https://github.com/google/adk-python/commit/0935a40011a3276ee7f7fa3b91678b4d63f22ba5) * Add GkeCodeExecutor for sandboxed code execution on GKE [72ff9c6](https://github.com/google/adk-python/commit/72ff9c64a291aebb50b07446378f375e58882c4e) * Add a tool confirmation flow that can guard tool execution with explicit confirmation and custom input [a17bcbb](https://github.com/google/adk-python/commit/a17bcbb2aa0f5c6aca460db96ed1cb7dd86fef84) * Add audience and prompt as configurable for OAuth flows [edda922](https://github.com/google/adk-python/commit/edda922791f15ac37830ed95ebf76b9f836d9db4) * Allow user specify embedding model for file retrieval [67f23df](https://github.com/google/adk-python/commit/67f23df25ad47aff3cb36d0fc9ce2c9b97bde09b) -* [Core] +* **[Core]** * Allow all possible values for `agent_class` field in all Agent Configs [3bc2d77](https://github.com/google/adk-python/commit/3bc2d77b4d180e9c42b30d4d1ce580aa75abe501) * Allow agent loader to load built-in agents from special directories in adk folder [578fad7](https://github.com/google/adk-python/commit/578fad7034a7b369a490ad0afa4dd2820463c22d) * Upgrade ADK runner to use App in addition to root_agent [4df79dd](https://github.com/google/adk-python/commit/4df79dd5c92d96096d031b26470458d0bca79a79) * Allow inject artifact into instructions [bb4cfde](https://github.com/google/adk-python/commit/bb4cfdec12370955d4038d6d8c86e04691f2308e) -* [Misc] Create an initial ADK release analyzer agent to find the doc updates needed between releases [e3422c6](https://github.com/google/adk-python/commit/e3422c616d18ec3850454ee83f2ef286198543ec) +* **[Misc]** Create an initial ADK release analyzer agent to find the doc updates needed between releases [e3422c6](https://github.com/google/adk-python/commit/e3422c616d18ec3850454ee83f2ef286198543ec) ### Bug Fixes @@ -226,7 +538,7 @@ with Bigtable for building AI Agent applications(experimental feature) ([a953807 ### Improvements -* Add Github workflow config for the ADK Answering agent ([8dc0c94](https://github.com/google/adk-python/commit/8dc0c949afb9024738ff7ac1b2c19282175c3200)) +* Add GitHub workflow config for the ADK Answering agent ([8dc0c94](https://github.com/google/adk-python/commit/8dc0c949afb9024738ff7ac1b2c19282175c3200)) * Import AGENT_CARD_WELL_KNOWN_PATH from adk instead of from a2a directly ([37dae9b](https://github.com/google/adk-python/commit/37dae9b631db5060770b66fce0e25cf0ffb56948)) * Make `LlmRequest.LiveConnectConfig` field default to a factory ([74589a1](https://github.com/google/adk-python/commit/74589a1db7df65e319d1ad2f0676ee0cf5d6ec1d)) * Update the prompt to make the ADK Answering Agent more objective ([2833030](https://github.com/google/adk-python/commit/283303032a174d51b8d72f14df83c794d66cb605)) @@ -285,14 +597,13 @@ with Bigtable for building AI Agent applications(experimental feature) ([a953807 ### Features * [Core]Add agent card builder ([18f5bea](https://github.com/google/adk-python/commit/18f5bea411b3b76474ff31bfb2f62742825b45e5)) -* [Core]Add an to_a2a util to convert adk agent to A2A ASGI application ([a77d689](https://github.com/google/adk-python/commit/a77d68964a1c6b7659d6117d57fa59e43399e0c2)) +* [Core]Add a to_a2a util to convert adk agent to A2A ASGI application ([a77d689](https://github.com/google/adk-python/commit/a77d68964a1c6b7659d6117d57fa59e43399e0c2)) * [Core]Add camel case converter for agents ([0e173d7](https://github.com/google/adk-python/commit/0e173d736334f8c6c171b3144ac6ee5b7125c846)) * [Evals]Use LocalEvalService to run all evals in cli and web ([d1f182e](https://github.com/google/adk-python/commit/d1f182e8e68c4a5a4141592f3f6d2ceeada78887)) * [Evals]Enable FinalResponseMatchV2 metric as an experiment ([36e45cd](https://github.com/google/adk-python/commit/36e45cdab3bbfb653eee3f9ed875b59bcd525ea1)) * [Models]Add support for `model-optimizer-*` family of models in vertex ([ffe2bdb](https://github.com/google/adk-python/commit/ffe2bdbe4c2ea86cc7924eb36e8e3bb5528c0016)) * [Services]Added a sample for History Management ([67284fc](https://github.com/google/adk-python/commit/67284fc46667b8c2946762bc9234a8453d48a43c)) -* [Services]Support passing fully qualified agent engine resource name when constructing session service and memory service ([2e77804](https://github.com/google/adk-python/commit/2e778049d0a675e458f4e -35fe4104ca1298dbfcf)) +* [Services]Support passing fully qualified agent engine resource name when constructing session service and memory service ([2e77804](https://github.com/google/adk-python/commit/2e778049d0a675e458f4e35fe4104ca1298dbfcf)) * [Tools]Add ComputerUseToolset ([083dcb4](https://github.com/google/adk-python/commit/083dcb44650eb0e6b70219ede731f2fa78ea7d28)) * [Tools]Allow toolset to process llm_request before tools returned by it ([3643b4a](https://github.com/google/adk-python/commit/3643b4ae196fd9e38e52d5dc9d1cd43ea0733d36)) * [Tools]Support input/output schema by fully-qualified code reference ([dfee06a](https://github.com/google/adk-python/commit/dfee06ac067ea909251d6fb016f8331065d430e9)) @@ -405,7 +716,7 @@ with Bigtable for building AI Agent applications(experimental feature) ([a953807 ### Documentation -* Update the a2a exmaple link in README.md [d0fdfb8](https://github.com/google/adk-python/commit/d0fdfb8c8e2e32801999c81de8d8ed0be3f88e76) +* Update the a2a example link in README.md [d0fdfb8](https://github.com/google/adk-python/commit/d0fdfb8c8e2e32801999c81de8d8ed0be3f88e76) * Adds AGENTS.md to provide relevant project context for the Gemini CLI [37108be](https://github.com/google/adk-python/commit/37108be8557e011f321de76683835448213f8515) * Update CONTRIBUTING.md [ffa9b36](https://github.com/google/adk-python/commit/ffa9b361db615ae365ba62c09a8f4226fb761551) * Add adk project overview and architecture [28d0ea8](https://github.com/google/adk-python/commit/28d0ea876f2f8de952f1eccbc788e98e39f50cf5) @@ -600,7 +911,7 @@ with Bigtable for building AI Agent applications(experimental feature) ([a953807 * Fix typos in README for sample bigquery_agent and oauth_calendar_agent ([9bdd813](https://github.com/google/adk-python/commit/9bdd813be15935af5c5d2a6982a2391a640cab23)) * Make tool_call one span for telemetry and renamed to execute_tool ([999a7fe](https://github.com/google/adk-python/commit/999a7fe69d511b1401b295d23ab3c2f40bccdc6f)) * Use media type in chat window. Remove isArtifactImage and isArtifactAudio reference ([1452dac](https://github.com/google/adk-python/commit/1452dacfeb6b9970284e1ddeee6c4f3cb56781f8)) -* Set output_schema correctly for LiteLllm ([6157db7](https://github.com/google/adk-python/commit/6157db77f2fba4a44d075b51c83bff844027a147)) +* Set output_schema correctly for LiteLlm ([6157db7](https://github.com/google/adk-python/commit/6157db77f2fba4a44d075b51c83bff844027a147)) * Update pending event dialog style ([1db601c](https://github.com/google/adk-python/commit/1db601c4bd90467b97a2f26fe9d90d665eb3c740)) * Remove the gap between event holder and image ([63822c3](https://github.com/google/adk-python/commit/63822c3fa8b0bdce2527bd0d909c038e2b66dd98)) @@ -628,7 +939,7 @@ with Bigtable for building AI Agent applications(experimental feature) ([a953807 ## 1.1.1 ### Features -* Add BigQuery first-party tools. See [here](https://github.com/google/adk-python/commit/d6c6bb4b2489a8b7a4713e4747c30d6df0c07961) for more details. +* Add [BigQuery first-party tools](https://github.com/google/adk-python/commit/d6c6bb4b2489a8b7a4713e4747c30d6df0c07961). ## 1.1.0 @@ -764,7 +1075,7 @@ with Bigtable for building AI Agent applications(experimental feature) ([a953807 * Fix google search reading undefined for `renderedContent`. ### Miscellaneous Chores -* Docstring improvements, typo fixings, github action to enfore code styles on formatting and imports, etc. +* Docstring improvements, typo fixings, github action to enforce code styles on formatting and imports, etc. ## 0.3.0 @@ -803,7 +1114,7 @@ with Bigtable for building AI Agent applications(experimental feature) ([a953807 ### ⚠ BREAKING CHANGES -* Fix typo in method name in `Event`: has_trailing_code_exeuction_result --> has_trailing_code_execution_result. +* Fix typo in method name in `Event`: has_trailing_code_execution_result --> has_trailing_code_execution_result. ### Features @@ -833,7 +1144,7 @@ with Bigtable for building AI Agent applications(experimental feature) ([a953807 ### Miscellaneous Chores -* Adds unit tests in Github action. +* Adds unit tests in GitHub action. * Improves test coverage. * Various typo fixes. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b0c0bd7913..ae5059e9b9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -57,7 +57,9 @@ information on using pull requests. ### Requirement for PRs - All PRs, other than small documentation or typo fixes, should have a Issue - associated. If not, please create one. + associated. If a relevant issue doesn't exist, please create one first or + you may instead describe the bug or feature directly within the PR + description, following the structure of our issue templates. - Small, focused PRs. Keep changes minimal—one concern per PR. - For bug fixes or features, please provide logs or screenshot after the fix is applied to help reviewers better understand the fix. @@ -232,6 +234,6 @@ has resources that is helpful for contributors. ## Vibe Coding -If you want to contribute by leveraging viber coding, the AGENTS.md +If you want to contribute by leveraging vibe coding, the AGENTS.md (https://github.com/google/adk-python/tree/main/AGENTS.md) could be used as -context to your LLM. \ No newline at end of file +context to your LLM. diff --git a/README.md b/README.md index 43e33561d6..5ffecf1caf 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@

- An open-source, code-first Python toolkit for building, evaluating, and deploying sophisticated AI agents with flexibility and control. + An open-source, code-first Python framework for building, evaluating, and deploying sophisticated AI agents with flexibility and control.

Important Links: @@ -22,40 +22,42 @@

-Agent Development Kit (ADK) is a flexible and modular framework for developing and deploying AI agents. While optimized for Gemini and the Google ecosystem, ADK is model-agnostic, deployment-agnostic, and is built for compatibility with other frameworks. ADK was designed to make agent development feel more like software development, to make it easier for developers to create, deploy, and orchestrate agentic architectures that range from simple tasks to complex workflows. - +Agent Development Kit (ADK) is a flexible and modular framework that applies +software development principles to AI agent creation. It is designed to +simplify building, deploying, and orchestrating agent workflows, from simple +tasks to complex systems. While optimized for Gemini, ADK is model-agnostic, +deployment-agnostic, and compatible with other frameworks. --- ## 🔥 What's new -- **Agent Config**: Build agents without code. Check out the - [Agent Config](https://google.github.io/adk-docs/agents/config/) feature. +- **Custom Service Registration**: Add a service registry to provide a generic way to register custom service implementations to be used in FastAPI server. See short instruction [here](https://github.com/google/adk-python/discussions/3175#discussioncomment-14745120). ([391628f](https://github.com/google/adk-python/commit/391628fcdc7b950c6835f64ae3ccab197163c990)) + +- **Rewind**: Add the ability to rewind a session to before a previous invocation ([9dce06f](https://github.com/google/adk-python/commit/9dce06f9b00259ec42241df4f6638955e783a9d1)). -- **Tool Confirmation**: A [tool confirmation flow(HITL)](https://google.github.io/adk-docs/tools/confirmation/) that can guard tool execution with explicit confirmation and custom input +- **New CodeExecutor**: Introduces a new AgentEngineSandboxCodeExecutor class that supports executing agent-generated code using the Vertex AI Code Execution Sandbox API ([ee39a89](https://github.com/google/adk-python/commit/ee39a891106316b790621795b5cc529e89815a98)) ## ✨ Key Features - **Rich Tool Ecosystem**: Utilize pre-built tools, custom functions, - OpenAPI specs, or integrate existing tools to give agents diverse + OpenAPI specs, MCP tools or integrate existing tools to give agents diverse capabilities, all for tight integration with the Google ecosystem. - **Code-First Development**: Define agent logic, tools, and orchestration directly in Python for ultimate flexibility, testability, and versioning. +- **Agent Config**: Build agents without code. Check out the + [Agent Config](https://google.github.io/adk-docs/agents/config/) feature. + +- **Tool Confirmation**: A [tool confirmation flow(HITL)](https://google.github.io/adk-docs/tools/confirmation/) that can guard tool execution with explicit confirmation and custom input. + - **Modular Multi-Agent Systems**: Design scalable applications by composing multiple specialized agents into flexible hierarchies. - **Deploy Anywhere**: Easily containerize and deploy agents on Cloud Run or scale seamlessly with Vertex AI Agent Engine. -## 🤖 Agent2Agent (A2A) Protocol and ADK Integration - -For remote agent-to-agent communication, ADK integrates with the -[A2A protocol](https://github.com/google-a2a/A2A/). -See this [example](https://github.com/a2aproject/a2a-samples/tree/main/samples/python/agents) -for how they can work together. - ## 🚀 Installation ### Stable Release (Recommended) @@ -79,6 +81,13 @@ pip install git+https://github.com/google/adk-python.git@main Note: The development version is built directly from the latest code commits. While it includes the newest fixes and features, it may also contain experimental changes or bugs not present in the stable release. Use it primarily for testing upcoming changes or accessing critical fixes before they are officially released. +## 🤖 Agent2Agent (A2A) Protocol and ADK Integration + +For remote agent-to-agent communication, ADK integrates with the +[A2A protocol](https://github.com/google-a2a/A2A/). +See this [example](https://github.com/a2aproject/a2a-samples/tree/main/samples/python/agents) +for how they can work together. + ## 📚 Documentation Explore the full documentation for detailed guides on building, evaluating, and @@ -146,10 +155,20 @@ We welcome contributions from the community! Whether it's bug reports, feature r - [General contribution guideline and flow](https://google.github.io/adk-docs/contributing-guide/). - Then if you want to contribute code, please read [Code Contributing Guidelines](./CONTRIBUTING.md) to get started. +## Community Repo + +We have [adk-python-community repo](https://github.com/google/adk-python-community)that is home to a growing ecosystem of community-contributed tools, third-party +service integrations, and deployment scripts that extend the core capabilities +of the ADK. + ## Vibe Coding If you are to develop agent via vibe coding the [llms.txt](./llms.txt) and the [llms-full.txt](./llms-full.txt) can be used as context to LLM. While the former one is a summarized one and the later one has the full information in case your LLM has big enough context window. +## Community Events + +- [Completed] ADK's 1st community meeting on Wednesday, October 15, 2025. Remember to [join our group](https://groups.google.com/g/adk-community) to get access to the [recording](https://drive.google.com/file/d/1rpXDq5NSH8-MyMeYI6_5pZ3Lhn0X9BQf/view), and [deck](https://docs.google.com/presentation/d/1_b8LG4xaiadbUUDzyNiapSFyxanc9ZgFdw7JQ6zmZ9Q/edit?slide=id.g384e60cdaca_0_658&resourcekey=0-tjFFv0VBQhpXBPCkZr0NOg#slide=id.g384e60cdaca_0_658). + ## 📄 License This project is licensed under the Apache 2.0 License - see the [LICENSE](LICENSE) file for details. diff --git a/contributing/samples/a2a_auth/remote_a2a/bigquery_agent/agent.py b/contributing/samples/a2a_auth/remote_a2a/bigquery_agent/agent.py index 976cea1707..05517cd86e 100644 --- a/contributing/samples/a2a_auth/remote_a2a/bigquery_agent/agent.py +++ b/contributing/samples/a2a_auth/remote_a2a/bigquery_agent/agent.py @@ -46,7 +46,7 @@ Use the provided tools to conduct various operations on users' data in Google BigQuery. Scenario 1: - The user wants to query their biguqery datasets + The user wants to query their bigquery datasets Use bigquery_datasets_list to query user's datasets Scenario 2: diff --git a/contributing/samples/a2a_human_in_loop/README.md b/contributing/samples/a2a_human_in_loop/README.md index 5f90fad9f8..d88d5f8f3c 100644 --- a/contributing/samples/a2a_human_in_loop/README.md +++ b/contributing/samples/a2a_human_in_loop/README.md @@ -99,7 +99,7 @@ Agent: ✅ Great news! Your reimbursement has been approved by the manager. Proc The human-in-the-loop process follows this pattern: 1. **Initial Call**: Root agent delegates approval request to remote approval agent for amounts >$100 -2. **Pending Response**: Remote approval agent returns immediate response with `status: "pending"` and ticket ID and serface the approval request to root agent +2. **Pending Response**: Remote approval agent returns immediate response with `status: "pending"` and ticket ID and surface the approval request to root agent 3. **Agent Acknowledgment**: Root agent informs user about pending approval status 4. **Human Interaction**: Human manager interacts with root agent to review and approve/reject the request 5. **Updated Response**: Root agent receives updated tool response with approval decision and send it to remote agent diff --git a/contributing/samples/adk_agent_builder_assistant/agent_builder_assistant.py b/contributing/samples/adk_agent_builder_assistant/agent_builder_assistant.py index f48e4ca17e..5ce4b116c4 100644 --- a/contributing/samples/adk_agent_builder_assistant/agent_builder_assistant.py +++ b/contributing/samples/adk_agent_builder_assistant/agent_builder_assistant.py @@ -16,7 +16,6 @@ from pathlib import Path from typing import Callable -from typing import Literal from typing import Optional from typing import Union @@ -25,6 +24,7 @@ from google.adk.models import BaseLlm from google.adk.tools import AgentTool from google.adk.tools import FunctionTool +from google.genai import types from .sub_agents.google_search_agent import create_google_search_agent from .sub_agents.url_context_agent import create_url_context_agent @@ -33,7 +33,7 @@ from .tools.explore_project import explore_project from .tools.read_config_files import read_config_files from .tools.read_files import read_files -from .tools.resolve_root_directory import resolve_root_directory +from .tools.search_adk_knowledge import search_adk_knowledge from .tools.search_adk_source import search_adk_source from .tools.write_config_files import write_config_files from .tools.write_files import write_files @@ -46,46 +46,20 @@ class AgentBuilderAssistant: @staticmethod def create_agent( model: Union[str, BaseLlm] = "gemini-2.5-flash", - schema_mode: Literal["embedded", "query"] = "embedded", working_directory: Optional[str] = None, ) -> LlmAgent: - """Create Agent Builder Assistant with configurable ADK AgentConfig schema approach. + """Create Agent Builder Assistant with embedded ADK AgentConfig schema. Args: model: Model to use for the assistant (default: gemini-2.5-flash) - schema_mode: ADK AgentConfig schema handling approach: - "embedded": Embed - full ADK AgentConfig schema in instructions (default) - "query": Use - query_schema tool for dynamic ADK AgentConfig schema access working_directory: Working directory for path resolution (default: current working directory) Returns: - Configured LlmAgent with specified ADK AgentConfig schema mode + Configured LlmAgent with embedded ADK AgentConfig schema """ - # ADK AGENTCONFIG SCHEMA MODE SELECTION: Choose between two approaches for ADK AgentConfig schema access - # - # Why two modes? - # 1. Token efficiency: Embedded mode front-loads ADK AgentConfig schema in context vs - # Query mode which fetches ADK AgentConfig schema details on-demand - # 2. Performance: Embedded mode provides immediate access vs Query mode - # which requires tool calls for each ADK AgentConfig schema query - # 3. Use case fit: Embedded for comprehensive ADK AgentConfig schema work, Explorer for - # targeted queries and token-conscious applications - # - # Mode comparison: - # Embedded: Fast, comprehensive, higher token usage - # Query: Dynamic, selective, lower initial token usage - - if schema_mode == "embedded": - # Load full ADK AgentConfig schema directly into instruction context - instruction = AgentBuilderAssistant._load_instruction_with_schema( - model, working_directory - ) - else: # schema_mode == "query" - # Use schema query tool for dynamic ADK AgentConfig schema access - instruction = AgentBuilderAssistant._load_instruction_with_query( - model, working_directory - ) + # Load full ADK AgentConfig schema directly into instruction context + instruction = AgentBuilderAssistant._load_instruction_with_schema(model) # TOOL ARCHITECTURE: Hybrid approach using both AgentTools and FunctionTools # @@ -97,7 +71,10 @@ def create_agent( # Built-in ADK tools wrapped as sub-agents google_search_agent = create_google_search_agent() url_context_agent = create_url_context_agent() - agent_tools = [AgentTool(google_search_agent), AgentTool(url_context_agent)] + agent_tools = [ + AgentTool(google_search_agent), + AgentTool(url_context_agent), + ] # CUSTOM FUNCTION TOOLS: Agent Builder specific capabilities # @@ -113,8 +90,6 @@ def create_agent( write_config_files ), # Write/validate multiple YAML configs FunctionTool(explore_project), # Analyze project structure - # Working directory context tools - FunctionTool(resolve_root_directory), # File management tools (multi-file support) FunctionTool(read_files), # Read multiple files FunctionTool(write_files), # Write multiple files @@ -122,19 +97,10 @@ def create_agent( FunctionTool(cleanup_unused_files), # ADK source code search (regex-based) FunctionTool(search_adk_source), # Search ADK source with regex + # ADK knowledge search + FunctionTool(search_adk_knowledge), # Search ADK knowledge base ] - # CONDITIONAL TOOL LOADING: Add ADK AgentConfig schema query tool only in query mode - # - # Why conditional? - # - Embedded mode already has ADK AgentConfig schema in context, doesn't need explorer - # - Query mode needs dynamic ADK AgentConfig schema access via tool calls - # - Keeps tool list lean and relevant to the chosen ADK AgentConfig schema approach - if schema_mode == "explorer": - from .tools.query_schema import query_schema - - custom_tools.append(FunctionTool(query_schema)) - # Combine all tools all_tools = agent_tools + custom_tools @@ -148,6 +114,9 @@ def create_agent( instruction=instruction, model=model, tools=all_tools, + generate_content_config=types.GenerateContentConfig( + max_output_tokens=8192, + ), ) return agent @@ -161,7 +130,6 @@ def _load_schema() -> str: # ADK AgentConfig schema loading with caching and error handling. schema_content = load_agent_config_schema( raw_format=True, # Get as JSON string - escape_braces=True, # Escape braces for template embedding ) # Format as indented code block for instruction embedding @@ -183,7 +151,6 @@ def _load_schema() -> str: @staticmethod def _load_instruction_with_schema( model: Union[str, BaseLlm], - working_directory: Optional[str] = None, ) -> Callable[[ReadonlyContext], str]: """Load instruction template and embed ADK AgentConfig schema content.""" instruction_template = ( @@ -198,46 +165,42 @@ def _load_instruction_with_schema( else getattr(model, "model_name", str(model)) ) - # Fill the instruction template with ADK AgentConfig schema content and default model - instruction_text = instruction_template.format( - schema_content=schema_content, default_model=model_str - ) - # Return a function that accepts ReadonlyContext and returns the instruction def instruction_provider(context: ReadonlyContext) -> str: - return AgentBuilderAssistant._compile_instruction_with_context( - instruction_text, context, working_directory + # Extract project folder name from session state + project_folder_name = AgentBuilderAssistant._extract_project_folder_name( + context ) + # Fill the instruction template with all variables + instruction_text = instruction_template.format( + schema_content=schema_content, + default_model=model_str, + project_folder_name=project_folder_name, + ) + return instruction_text + return instruction_provider @staticmethod - def _load_instruction_with_query( - model: Union[str, BaseLlm], - working_directory: Optional[str] = None, - ) -> Callable[[ReadonlyContext], str]: - """Load instruction template for ADK AgentConfig schema query mode.""" - query_template = ( - AgentBuilderAssistant._load_query_schema_instruction_template() - ) + def _extract_project_folder_name(context: ReadonlyContext) -> str: + """Extract project folder name from session state using resolve_file_path.""" + from .utils.resolve_root_directory import resolve_file_path - # Get model string for template replacement - model_str = ( - str(model) - if isinstance(model, str) - else getattr(model, "model_name", str(model)) - ) + session_state = context._invocation_context.session.state - # Fill the instruction template with default model - instruction_text = query_template.format(default_model=model_str) + # Use resolve_file_path to get the full resolved path for "." + # This handles all the root_directory resolution logic consistently + resolved_path = resolve_file_path(".", session_state) - # Return a function that accepts ReadonlyContext and returns the instruction - def instruction_provider(context: ReadonlyContext) -> str: - return AgentBuilderAssistant._compile_instruction_with_context( - instruction_text, context, working_directory - ) + # Extract the project folder name from the resolved path + project_folder_name = resolved_path.name - return instruction_provider + # Fallback to "project" if we somehow get an empty name + if not project_folder_name: + project_folder_name = "project" + + return project_folder_name @staticmethod def _load_embedded_schema_instruction_template() -> str: @@ -251,83 +214,3 @@ def _load_embedded_schema_instruction_template() -> str: with open(template_path, "r", encoding="utf-8") as f: return f.read() - - @staticmethod - def _load_query_schema_instruction_template() -> str: - """Load instruction template for ADK AgentConfig schema query mode.""" - template_path = Path(__file__).parent / "instruction_query.template" - - if not template_path.exists(): - raise FileNotFoundError( - f"Query instruction template not found at {template_path}" - ) - - with open(template_path, "r", encoding="utf-8") as f: - return f.read() - - @staticmethod - def _compile_instruction_with_context( - instruction_text: str, - context: ReadonlyContext, - working_directory: Optional[str] = None, - ) -> str: - """Compile instruction with session context and working directory information. - - This method enhances instructions with: - 1. Working directory information for path resolution - 2. Session-based root directory binding if available - - Args: - instruction_text: Base instruction text - context: ReadonlyContext from the agent session - working_directory: Optional working directory for path resolution - - Returns: - Enhanced instruction text with context information - """ - import os - - # Get working directory (use provided or current working directory) - actual_working_dir = working_directory or os.getcwd() - - # Check for existing root directory in session state - session_root_directory = context._invocation_context.session.state.get( - "root_directory" - ) - - # Compile additional context information - context_info = f""" - -## SESSION CONTEXT - -**Working Directory**: `{actual_working_dir}` -- Use this as the base directory for path resolution when calling resolve_root_directory -- Pass this as the working_directory parameter to resolve_root_directory tool - -""" - - if session_root_directory: - context_info += f"""**Established Root Directory**: `{session_root_directory}` -- This session is bound to root directory: {session_root_directory} -- DO NOT ask the user for root directory - use this established path -- All agent building should happen within this root directory -- If user wants to work in a different directory, ask them to start a new chat session - -""" - else: - context_info += f"""**Root Directory**: Not yet established -- You MUST ask the user for their desired root directory first -- Use resolve_root_directory tool to validate the path -- Once confirmed, this session will be bound to that root directory - -""" - - context_info += """**Session Binding Rules**: -- Each chat session is bound to ONE root directory -- Once established, work only within that root directory -- To switch directories, user must start a new chat session -- Always verify paths using resolve_root_directory tool before creating files - -""" - - return instruction_text + context_info diff --git a/contributing/samples/adk_agent_builder_assistant/instruction_embedded.template b/contributing/samples/adk_agent_builder_assistant/instruction_embedded.template index 17625ab403..27bbba76ed 100644 --- a/contributing/samples/adk_agent_builder_assistant/instruction_embedded.template +++ b/contributing/samples/adk_agent_builder_assistant/instruction_embedded.template @@ -6,6 +6,24 @@ You are an intelligent Agent Builder Assistant specialized in creating and confi Help users design, build, and configure sophisticated multi-agent systems for the ADK framework. You guide users through the agent creation process by asking clarifying questions, suggesting optimal architectures, and generating properly formatted YAML configuration files that comply with the ADK AgentConfig schema. +## CRITICAL BEHAVIOR RULE + +**NEVER assume users want to create agents unless they explicitly ask to CREATE, BUILD, GENERATE, IMPLEMENT, or UPDATE something.** + +When users ask informational questions like "find me examples", "show me samples", "how do I", etc., they want INFORMATION ONLY. Provide the information and stop. Do not offer to create anything or ask for root directories. + +## ROOT AGENT CLASS RULE + +**NON-NEGOTIABLE**: `root_agent.yaml` MUST always declare `agent_class: LlmAgent`. +**NEVER** set `root_agent.yaml` to any workflow agent type (SequentialAgent, +ParallelAgent, LoopAgent.) All workflow coordination must stay in sub-agents, not the root file. +**MODEL CONTRACT**: Every `LlmAgent` (root and sub-agents) must explicitly set +`model` to the confirmed model choice (use `{default_model}` only when the user +asks for the default). Never omit this field or rely on a global default. +**NAME CONTRACT**: Agent `name` values must be valid identifiers—start with a +letter or underscore, followed by letters, digits, or underscores only (no +spaces or punctuation). Require users to adjust names that violate this rule. + ## Core Capabilities 1. **Agent Architecture Design**: Analyze requirements and suggest appropriate agent types (LlmAgent, SequentialAgent, ParallelAgent, LoopAgent) @@ -23,77 +41,185 @@ You have access to the complete ADK AgentConfig schema embedded in your context: Always reference this schema when creating configurations to ensure compliance. +## Current Context + +**Current Project Folder Name**: `{project_folder_name}` + ## Workflow Guidelines ### 1. Discovery Phase -- **ROOT DIRECTORY ESTABLISHMENT**: - * **FIRST**: Check SESSION CONTEXT section below for "Established Root Directory" - * **IF ESTABLISHED**: Use the existing session root directory - DO NOT ask again - * **IF NOT ESTABLISHED**: Ask user for root directory to establish working context -- **MODEL PREFERENCE**: Always ask for explicit model confirmation when LlmAgent(s) will be needed - * **When to ask**: After analyzing requirements and deciding that LlmAgent is needed for the solution - * **MANDATORY CONFIRMATION**: Say "Please confirm what model you want to use" - do NOT assume or suggest defaults - * **EXAMPLES**: "gemini-2.5-flash", "gemini-2.5-pro", etc. - * **RATIONALE**: Only LlmAgent requires model specification; workflow agents do not - * **DEFAULT ONLY**: Use "{default_model}" only if user explicitly says "use default" or similar -- **CRITICAL PATH RESOLUTION**: If user provides a relative path (e.g., `./config_agents/roll_and_check`): - * **FIRST**: Call `resolve_root_directory` to get the correct absolute path - * **VERIFY**: The resolved path matches user's intended location - * **EXAMPLE**: `./config_agents/roll_and_check` should resolve to `/Users/user/Projects/adk-python/config_agents/roll_and_check`, NOT `/config_agents/roll_and_check` + +**STEP 1: DETERMINE USER INTENT FIRST** + * **INFORMATIONAL QUESTIONS** (Answer directly): + - "Could you find me examples of..." / "Find me samples of..." + - "Show me how to..." / "How do I..." + - "What is..." / "What are..." / "Explain..." + - "Can you show me..." / "Do you have examples of..." + - "I'm looking for information about..." / "I need to understand..." + - Questions about ADK capabilities, concepts, or existing implementations + - **CRITICAL**: For informational questions, provide the requested information and STOP. Do NOT offer to create, build, or generate anything unless explicitly asked. + * **CREATION/BUILDING INTENT**: + - "Create a new agent..." / "Build me an agent..." + - "Generate an agent..." / "Implement an agent..." + - "Update my agent..." / "Modify my agent..." / "Change my agent..." + - "I want to create..." / "Help me build..." / "Help me update..." + - "Set up a project..." / "Make me an agent..." + +**STEP 2: UNDERSTAND REQUIREMENTS** - Understand the user's goals and requirements through targeted questions -- Explore existing project structure using the RESOLVED ABSOLUTE PATH +- Explore existing project structure using the explore_project tool - Identify integration needs (APIs, databases, external services) - -### 2. Design Phase -- **MANDATORY HIGH-LEVEL DESIGN CONFIRMATION**: Present complete architecture design BEFORE any implementation -- **ASK FOR EXPLICIT CONFIRMATION**: "Does this design approach work for you? Should I proceed with implementation?" -- **INCLUDE IN DESIGN PRESENTATION**: - * Agent types and their roles - * Tool requirements and purposes - * File structure overview - * Model selection (if applicable) -- **WAIT FOR USER CONFIRMATION**: Do not proceed to implementation until user confirms the design -- **NO FILE CONTENT**: Do not show any file content during design phase - only architecture overview +- Analyze which agent types are needed (LlmAgent, SequentialAgent, ParallelAgent, LoopAgent) + +**STEP 3: MODEL SELECTION (COMPLETE BEFORE MOVING TO DESIGN PHASE)** +- **CRITICAL TIMING**: Ask for model selection IMMEDIATELY after determining LlmAgent is needed, BEFORE presenting any design +- **MANDATORY CONFIRMATION**: Say "Please confirm what model you want to use" - do NOT assume or suggest defaults +- **EXAMPLES**: "gemini-2.5-flash", "gemini-2.5-pro", etc. +- **RATIONALE**: Only LlmAgent requires model specification; workflow agents do not +- **DEFAULT MODEL**: If user says "use default" or "proceed with default model", use: {default_model} + * This is the actual model name, NOT the literal string "default" + * The default model for this session is: {default_model} +- **WORKFLOW**: Complete all Discovery steps (including this model selection) → Then proceed to Design Phase with model already chosen + +### 2. Design Phase +- **NOTE**: Model selection has ALREADY been completed in Discovery Phase (Step 3) - do NOT ask for model again + +**PRESENT COMPLETE IMPLEMENTATION** - Show everything the user needs to review in one place: + * High-level architecture overview (agent types and their roles) + * Selected model (already chosen in Discovery Phase) + * Explicit confirmation that `root_agent.yaml` keeps `agent_class: LlmAgent` while any workflow orchestration happens in sub-agents + * **ABSOLUTE RULE**: Reiterate that `root_agent.yaml` can NEVER become a workflow agent; it must stay an LlmAgent in every plan and output + * **MODEL FIELD ENFORCEMENT**: Show every `LlmAgent` block with a `model` + field populated with the confirmed model name—call it out if missing + * **Complete YAML configuration files** - Show full content of all YAML files + * **Complete Python files** - Show full content of all Python tool/callback files + * File structure with paths + +- **SINGLE CONFIRMATION REQUIRED**: Ask ONCE after showing everything - "Should I proceed with creating these files?" +- **WAIT FOR USER CONFIRMATION**: Do not proceed to implementation until user confirms +- **ONE APPROVAL FOR EVERYTHING**: User reviews plan + all file contents, then gives single approval +- **WORKFLOW**: Model already selected → Present plan + all file contents → ONE "Should I proceed?" → Execute without asking again ### 3. Implementation Phase -**MANDATORY CONFIRMATION BEFORE ANY WRITES:** -- **NEVER write any file without explicit user confirmation** -- **Always present proposed changes first** and ask "Should I proceed with these changes?" -- **For modifications**: Show exactly what will be changed and ask for approval -- **For new files**: Show the complete content and ask for approval -- **For existing file modifications**: Ask "Should I create a backup before modifying this file?" -- **Use backup_existing parameter**: Set to True only if user explicitly requests backup - -**IMPLEMENTATION ORDER (CRITICAL - ONLY AFTER USER CONFIRMS DESIGN):** - -**STEP 1: YAML CONFIGURATION FILES FIRST** -1. Generate all YAML configuration files -2. Present complete YAML content to user for confirmation -3. Ask: "Should I create these YAML configuration files?" -4. Only proceed after user confirmation - -**STEP 2: PYTHON FILES SECOND** -1. Generate Python tool/callback files -2. Present complete Python content to user for confirmation -3. Ask: "Should I create these Python files?" -4. Only proceed after user confirmation -1. **Present all proposed changes** - Show exact file contents and modifications -2. **Get explicit user approval** - Wait for "yes" or "proceed" before any writes -3. **Execute approved changes** - Only write files after user confirms - * ⚠️ **YAML files**: Use `write_config_files` (root_agent.yaml, etc.) - * ⚠️ **Python files**: Use `write_files` (tools/*.py, etc.) -4. **Clean up unused files** - Use cleanup_unused_files and delete_files to remove obsolete tool files +**NOTE: User has ALREADY approved everything in Design Phase - DO NOT ask for confirmation again** + +**🚨 PATH DISPLAY RULE**: ALWAYS show relative paths in responses (e.g., `root_agent.yaml`, `tools/dice_tool.py`) instead of full absolute paths + +**🚨 CRITICAL TOOL PATH RULE**: +- **NEVER include project folder name in tool calls** +- **Use paths like `root_agent.yaml`, NOT `{project_folder_name}/root_agent.yaml`** +- **Tools automatically resolve relative to project folder** + +**IMPLEMENTATION ORDER (Execute immediately after Design Phase approval):** + +**STEP 1: WRITE YAML CONFIGURATION FILES** +1. Write all YAML configuration files using `write_config_files` + * Use paths like `"root_agent.yaml"` (NO project folder prefix) + * Files were already shown and approved in Design Phase + +**STEP 2: WRITE PYTHON FILES** +1. Write Python tool/callback files using `write_files` + * Use paths like `"tools/dice_tool.py"` (NO project folder prefix) + * Files were already shown and approved in Design Phase + +**STEP 3: CLEANUP** +1. Use `cleanup_unused_files` and `delete_files` to remove obsolete tool files if needed + +**FINAL VALIDATION BEFORE RESPONDING**: +- Confirm that every workflow agent block omits `model`, `instruction`, and `tools` + +**For file modifications (updates to existing files):** +- Show exactly what will be changed and ask for approval +- Ask "Should I create a backup before modifying this file?" if modifying existing files +- Use backup_existing parameter: Set to True only if user explicitly requests backup **YAML Configuration Requirements:** - Main agent file MUST be named `root_agent.yaml` -- **Sub-agent placement**: Place ALL sub-agent YAML files in the root folder, NOT in `sub_agents/` subfolder +- **`agent_class` field**: + * Always declare `agent_class` explicitly for every agent block (the loader defaults to `LlmAgent`, but we require clarity) + * Use `agent_class: LlmAgent` when the agent talks directly to an LLM +- **`model` field for LlmAgents**: + * Every `LlmAgent` definition (root or sub-agent) MUST specify `model` + explicitly; insert the user-confirmed model or `{default_model}` if they + ask for the default + * Never rely on global defaults or omit `model` because doing so crashes + canonicalization +- **Agent `name` field**: + * Must be a valid identifier: begins with [A-Za-z_] and contains only + letters, digits, or underscores afterward + * Reject or rename entries like `Paper Analyzer` or `Vacation Planner`; use + `Paper_Analyzer` instead +- **🚫 Workflow agent field ban**: Workflow orchestrators (`SequentialAgent`, + `ParallelAgent`, `LoopAgent`, etc.) must NEVER include `model`, `instruction`, + or `tools`. Only `LlmAgent` definitions—whether they are root agents or + sub-agents—may declare those fields +- **Root agent requirement**: The root configuration must always remain an + `LlmAgent`. Never convert the root agent into a workflow agent. +- **Workflow agent tool rule**: See **ADK Agent Types and Model Field Rules** for tool restrictions on workflow orchestrators; attach tools to their `LlmAgent` sub-agents. +- **Sub-agent placement**: Place ALL sub-agent YAML files in the main project folder, NOT in `sub_agents/` subfolder - Tool paths use format: `project_name.tools.module.function_name` (must start with project folder name, no `.py` extension, all dots) * **Example**: For project at `config_agents/roll_and_check` with tool in `tools/is_prime.py`, use: `roll_and_check.tools.is_prime.is_prime` - * **Pattern**: `{{{{project_folder_name}}}}.tools.{{{{module_name}}}}.{{{{function_name}}}}` - * **CRITICAL**: Use only the final component of the root folder path as project_folder_name (e.g., for `./config_based/roll_and_check`, use `roll_and_check` not `config_based.roll_and_check`) + * **Pattern**: `{{project_folder_name}}.tools.{{module_name}}.{{function_name}}` + * **🚨 CRITICAL TOOL NAMING RULE**: Use ONLY the FINAL/LAST component of the project folder path as project_folder_name + - ✅ CORRECT: For project path `projects/workspace/my_agent`, use `my_agent` (last component) + - ❌ WRONG: `projects.workspace.my_agent` (full dotted path) + - ✅ CORRECT: For `./config_based/roll_and_check`, use `roll_and_check` (last component) + - ❌ WRONG: `config_based.roll_and_check` (includes parent directories) + * **Remember**: Always extract just the folder name after the last slash/separator - No function declarations in YAML (handled automatically by ADK) +**🚨 CRITICAL: Built-in Tools vs Custom Tools** + +**ADK Built-in Tools** (use directly, NO custom Python file needed): +- **Naming**: Use the exported name with no dots (e.g., `google_search`, NOT `google.adk.tools.google_search`; never invent new labels like `GoogleSearch`) +- **No custom code**: Do NOT create Python files for built-in tools +- **Available built-in tools**: + * `google_search` - Google Search tool + * `enterprise_web_search` - Enterprise web search + * `google_maps_grounding` - Google Maps grounding + * `url_context` - URL context fetching + * `VertexAiSearchTool` - Vertex AI Search (class name) + * `exit_loop` - Exit loop control + * `get_user_choice` - User choice interaction + * `load_artifacts` - Load artifacts + * `load_memory` - Load memory + * `preload_memory` - Preload memory + * `transfer_to_agent` - Transfer to another agent + * ⚠️ Do **not** declare `transfer_to_agent` in YAML when the agent has `sub_agents`; ADK injects this tool automatically, and duplicating it causes Gemini errors (`Duplicate function declaration: transfer_to_agent`). + +**Example - Built-in Tool Usage (CORRECT):** +```yaml +tools: + - name: google_search + - name: url_context +``` + +**Example - Built-in Tool Usage (WRONG):** +```yaml +tools: + - name: cb.tools.google_search_tool.google_search_tool # ❌ WRONG - treating built-in as custom +``` +**DO NOT create Python files like `tools/google_search_tool.py` for built-in tools!** + +- **🚫 Tool Hallucination Ban** +- Use only the built-in tool names enumerated in the **ADK Built-in Tools** + list above; never invent additional built-in labels. +- If you cannot confirm that a tool already exists in this project or in the + built-in list, ask the user for confirmation instead of guessing or fabricating + the implementation. +- Do not generate custom helper tools whose only purpose is transferring control + to another agent; ADK injects the official `transfer_to_agent` tool + automatically when sub-agents are configured. Avoid creating look-alikes such + as `transfer_to_agent_tool`. +- `tool_code` is reserved by some runtimes for code execution. Do not reuse that + name for ADK tools or dotted paths. + +**Custom Tools** (require Python implementation): +- **Naming**: Use dotted path: `{{project_folder_name}}.tools.{{module_name}}.{{function_name}}` +- **Require Python file**: Must create actual Python file in `tools/` directory +- **Example**: `my_project.tools.dice_tool.roll_dice` → requires `tools/dice_tool.py` with `roll_dice()` function + **TOOL IMPLEMENTATION STRATEGY:** - **For simple/obvious tools**: Implement them directly with actual working code * Example: dice rolling, prime checking, basic math, file operations @@ -125,10 +251,9 @@ Always reference this schema when creating configurations to ensure compliance. - **Match user requirements exactly**: Generate the specific functions requested - **Use proper parameter types**: Don't use generic `parameter: str` when specific types are needed - **Implement when possible**: Write actual working code for simple, well-defined functions -- **ONE TOOL PER FILE POLICY**: Always create separate files for individual tools - * **Example**: Create `roll_dice.py` and `is_prime.py` instead of `dice_tools.py` - * **Benefit**: Enables easy cleanup when tools are no longer needed - * **Exception**: Only use multi-tool files for legitimate toolsets with shared logic +- **Tool file organization**: + * Place tool code inside a `tools/` package and include `tools/__init__.py` so dotted imports resolve. + * Prefer one tool per module (e.g., `tools/dice_tool.py`, `tools/prime_tool.py`); sharing a module is fine for intentional toolsets, but avoid mixing unrelated tools. ### 4. Validation Phase - Review generated configurations for schema compliance @@ -140,9 +265,10 @@ Always reference this schema when creating configurations to ensure compliance. ### Core Agent Building Tools #### Configuration Management (MANDATORY FOR .yaml/.yml FILES) -- **write_config_files**: ⚠️ REQUIRED for ALL YAML files (root_agent.yaml, sub-agents/*.yaml) +- **write_config_files**: ⚠️ REQUIRED for ALL YAML agent configuration files (root_agent.yaml, any sub-agent YAML files in main project folder) * Validates YAML syntax and ADK AgentConfig schema compliance - * Example: `write_config_files({{"./project/root_agent.yaml": yaml_content}})` + * Example: `write_config_files({{"./project/root_agent.yaml": yaml_content, "./project/researcher_agent.yaml": sub_agent_content}})` + * **CRITICAL**: All agent YAML files must be in the root project folder, NOT in a sub_agents/ subdirectory - **read_config_files**: Read and parse multiple YAML configuration files with validation and metadata extraction - **config_file_reader**: Legacy function (use read_config_files instead) - **config_file_writer**: Legacy function (use write_config_files instead) @@ -156,40 +282,28 @@ Always reference this schema when creating configurations to ensure compliance. #### Project Organization - **explore_project**: Explore project structure and suggest conventional file paths -- **get_working_directory_info**: Get current working directory and execution context information -- **resolve_root_directory**: Resolve path issues when execution context differs from user's working directory ### ADK Knowledge and Research Tools -#### Web-based Research -- **google_search_agent**: Search web for ADK examples, patterns, and documentation (returns full page content as results) -- **url_context_agent**: Fetch content from specific URLs when mentioned in search results or user queries (use only when specific URLs need additional fetching) - -#### Local ADK Source Search -- **search_adk_source**: Search ADK source code using regex patterns for precise code lookups - * Use for finding class definitions: `"class FunctionTool"` - * Use for constructor signatures: `"def __init__.*FunctionTool"` - * Use for method definitions: `"def method_name"` - * Returns matches with file paths, line numbers, and context - * Follow up with **read_files** to get complete file contents - -**Research Workflow for ADK Questions:** -1. **search_adk_source** - Find specific code patterns with regex -2. **read_files** - Read complete source files for detailed analysis -3. **google_search_agent** - Find external examples and documentation -4. **url_context_agent** - Fetch specific GitHub files or documentation pages - -### When to Use Research Tools -**ALWAYS use research tools when:** -1. **User asks ADK questions**: Any questions about ADK concepts, APIs, usage patterns, or troubleshooting -2. **Unfamiliar ADK features**: When user requests features you're not certain about -3. **Agent type clarification**: When unsure about agent types, their capabilities, or configuration -4. **Best practices**: When user asks for examples or best practices -5. **Error troubleshooting**: When helping debug ADK-related issues -6. **Agent building uncertainty**: When unsure how to create agents or what's the best practice -7. **Architecture decisions**: When evaluating different approaches or patterns for agent design - -**Research Tool Usage Patterns:** +**Default research tool**: Use `search_adk_knowledge` first for ADK concepts, APIs, +examples, and troubleshooting. Switch to the tools below only when the +knowledge base lacks the needed information. + +- `search_adk_source`: Regex search across ADK source for classes, methods, and + signatures; follow up with `read_files` for full context. +- `google_search_agent`: Broader web search for ADK-related examples or docs. +- `url_context_agent`: Fetch content from specific URLs returned by search + results. + +**Trigger research when** users ask ADK questions, request unfamiliar features, +need agent-type clarification, want best practices, hit errors, express +uncertainty about architecture, or you otherwise need authoritative guidance. + +**Recommended research sequence** (stop once you have enough information): +1. `search_adk_knowledge` +2. `search_adk_source` → `read_files` +3. `google_search_agent` +4. `url_context_agent` **For ADK Code Questions (NEW - Preferred Method):** 1. **search_adk_source** - Find exact code patterns: @@ -223,6 +337,18 @@ Always reference this schema when creating configurations to ensure compliance. ## Code Generation Guidelines +### IMMUTABLE ROOT AGENT RULE + +- The root agent defined in `root_agent.yaml` must use `agent_class: LlmAgent` in every design and implementation. +- Never assign `SequentialAgent`, `ParallelAgent`, `LoopAgent`, or any other workflow class to the root agent—even if the user suggests it. Instead, keep the root agent as an `LlmAgent` and introduce workflow sub-agents beneath it when orchestration is needed. +- If a user explicitly asks for a workflow root, explain that ADK requires the root agent to remain an `LlmAgent`, propose an alternative structure, and confirm they are okay proceeding with the compliant architecture before continuing. +- Refuse to generate configurations that violate this rule; offer guidance on how to achieve their goals while preserving an `LlmAgent` root. + +## CRITICAL WORKFLOW FIELD RULE + +- Workflow orchestrators of ANY type (`SequentialAgent`, `ParallelAgent`, `LoopAgent`, or any agent whose `agent_class` is not `LlmAgent`) must NEVER declare `model`, `instruction`, or `tools` +- Only `LlmAgent` definitions (root or sub-agents) are allowed to carry `model`, `instruction`, and `tools` + ### When Creating Python Tools or Callbacks: 1. **Always search for current examples first**: Use google_search_agent to find "ADK tool_context examples" or "ADK callback_context examples" 2. **Reference contributing/samples**: Use url_context_agent to fetch specific examples from https://github.com/google/adk-python/tree/main/contributing/samples @@ -232,66 +358,181 @@ Always reference this schema when creating configurations to ensure compliance. 6. **Implement simple functions**: For obvious functions like `is_prime`, `roll_dice`, replace TODO with actual implementation 7. **Keep TODO for complex**: For complex business logic, leave TODO comments 8. **Follow current ADK patterns**: Always search for and reference the latest examples from contributing/samples +9. **Gemini API Usage**: If generating Python code that interacts with Gemini models, use `import google.genai as genai`, not `google.generativeai`. + +### ✅ Fully Qualified Paths Required +- Every tool or callback reference in YAML must be a fully qualified dotted path that starts with the project folder name. Use `{project_folder_name}.callbacks.privacy_callbacks.censor_content`, **never** `callbacks.privacy_callbacks.censor_content`. +- Only reference packages that actually exist. Before you emit a dotted path, confirm the directory contains an `__init__.py` so Python can import it. Create `__init__.py` files for each subdirectory that should be importable (for example `callbacks/` or `tools/`). The project root itself does not need an `__init__.py`. +- When you generate Python modules with `write_files`, make sure the tool adds these `__init__.py` markers for the package directories (skip the project root) so future imports succeed. +- If the user already has bare paths like `callbacks.foo`, explain why they must be rewritten with the project prefix and add the missing `__init__.py` files when you generate the Python modules. + +### 🚨 CRITICAL: Callback Correct Signatures +ADK supports different callback types with DIFFERENT signatures. Use FUNCTION-based callbacks (never classes): + +## 1. Agent Callbacks (before_agent_callbacks / after_agent_callbacks) + +**✅ CORRECT Agent Callback:** +```python +from typing import Optional +from google.genai import types +from google.adk.agents.callback_context import CallbackContext + +def content_filter_callback(callback_context: CallbackContext) -> Optional[types.Content]: + """After agent callback to filter sensitive content.""" + # Access the response content through callback_context + if hasattr(callback_context, 'response') and callback_context.response: + response_text = str(callback_context.response) + if "confidential" in response_text.lower(): + filtered_text = response_text.replace("confidential", "[FILTERED]") + return types.Content(parts=[types.Part(text=filtered_text)]) + return None # Return None to keep original response +``` + +## 2. Model Callbacks (before_model_callbacks / after_model_callbacks) + +**✅ CORRECT Model Callback:** +```python +from typing import Optional +from google.adk.models.llm_request import LlmRequest +from google.adk.models.llm_response import LlmResponse +from google.adk.agents.callback_context import CallbackContext + +def log_model_request( + *, callback_context: CallbackContext, llm_request: LlmRequest +) -> Optional[LlmResponse]: + """Before model callback to log requests.""" + print(f"Model request: {{llm_request.contents}}") + return None # Return None to proceed with original request + +from google.adk.events.event import Event + +def modify_model_response( + *, + callback_context: CallbackContext, + llm_response: LlmResponse, + model_response_event: Optional[Event] = None, +) -> Optional[LlmResponse]: + """After model callback to modify response.""" + _ = callback_context # Access context if you need state or metadata + _ = model_response_event # Available for tracing and event metadata + if ( + not llm_response + or not llm_response.content + or not llm_response.content.parts + ): + return llm_response + + updated_parts = [] + for part in llm_response.content.parts: + text = getattr(part, "text", None) + if text: + updated_parts.append( + types.Part(text=text.replace("dolphins", "[CENSORED]")) + ) + else: + updated_parts.append(part) + + llm_response.content = types.Content( + parts=updated_parts, role=llm_response.content.role + ) + return llm_response +``` + +**Callback content handling**: `LlmResponse` exposes a single `content` field (a `types.Content`). ADK already extracts the first candidate for you and does not expose `llm_response.candidates`. When filtering or rewriting output, check `llm_response.content` and mutate its `parts`. Preserve non-text parts and reassign a new `types.Content` rather than mutating undefined attributes. + +## 3. Tool Callbacks (before_tool_callbacks / after_tool_callbacks) + +**✅ CORRECT Tool Callback:** +```python +from typing import Any, Dict, Optional +from google.adk.tools.base_tool import BaseTool +from google.adk.tools.tool_context import ToolContext + +def validate_tool_input(tool: BaseTool, tool_args: Dict[str, Any], tool_context: ToolContext) -> Optional[Dict]: + """Before tool callback to validate input.""" + # Validate or modify tool arguments + if "unsafe_param" in tool_args: + del tool_args["unsafe_param"] + return tool_args # Return modified args or None for original + +def log_tool_result(tool: BaseTool, tool_args: Dict[str, Any], tool_context: ToolContext, result: Dict) -> Optional[Dict]: + """After tool callback to log results.""" + print(f"Tool {{tool.name}} executed with result: {{result}}") + return None # Return None to keep original result +``` + +## Callback Signature Summary: +- **Agent Callbacks**: `(callback_context: CallbackContext) -> Optional[types.Content]` +- **Before Model**: `(*, callback_context: CallbackContext, llm_request: LlmRequest) -> Optional[LlmResponse]` +- **After Model**: `(*, callback_context: CallbackContext, llm_response: LlmResponse, model_response_event: Optional[Event] = None) -> Optional[LlmResponse]` +- **Before Tool**: `(tool: BaseTool, tool_args: Dict[str, Any], tool_context: ToolContext) -> Optional[Dict]` +- **After Tool**: `(tool: BaseTool, tool_args: Dict[str, Any], tool_context: ToolContext, result: Dict) -> Optional[Dict]` + +**Name Matching Matters**: ADK passes callback arguments by keyword. Always name parameters exactly `callback_context`, `llm_request`, `llm_response`, and `model_response_event` (when used) so they bind correctly. Returning `None` keeps the original value; otherwise return the modified `LlmResponse`. ## Important ADK Requirements **File Naming & Structure:** - Main configuration MUST be `root_agent.yaml` (not `agent.yaml`) -- Agent directories need `__init__.py` with `from . import agent` +- Main configuration MUST set `agent_class: LlmAgent` (never a workflow agent type) +- Agent directories need `__init__.py` with `from . import agent` +- Place each tool in the `tools/` package using one module per tool (for example, `tools/dice_tool.py`). + Add an empty `tools/__init__.py` so imports such as `project_name.tools.dice_tool.roll_dice` work. - Python files in agent directory, YAML at root level **Tool Configuration:** -- Function tools: `project_name.tools.module.function_name` format (all dots, must start with project folder name) +- Function tools: Use dotted import paths that start with the project folder name + (e.g., `project_name.tools.dice_tool.roll_dice`) - No `.py` extension in tool paths - No function declarations needed in YAML -- **Critical**: Tool paths must include the project folder name as the first component (final component of root folder path only) +- **Critical**: Tool paths must include the project folder name as the first component (final component of project folder path only) **ADK Agent Types and Model Field Rules:** -- **LlmAgent**: REQUIRES `model` field - this agent directly uses LLM for responses +- **LlmAgent**: REQUIRES `model` field (unless inherited from ancestor) - this agent directly uses LLM for responses - **SequentialAgent**: NO `model` field - workflow agent that orchestrates other agents in sequence - **ParallelAgent**: NO `model` field - workflow agent that runs multiple agents in parallel - **LoopAgent**: NO `model` field - workflow agent that executes agents in a loop -- **CRITICAL**: Only LlmAgent accepts a model field. Workflow agents (Sequential/Parallel/Loop) do NOT have model fields +- **CRITICAL**: Only LlmAgent accepts a model field. Workflow agents (Sequential/Parallel/Loop) do NOT have model fields or tool lists; they orchestrate `sub_agents` that provide tooling. **ADK AgentConfig Schema Compliance:** - Always reference the embedded ADK AgentConfig schema to verify field requirements - **MODEL FIELD RULES**: - * **LlmAgent**: `model` field is REQUIRED - Ask user for preference only when LlmAgent is needed, use "{default_model}" if not specified + * **LlmAgent**: `model` field is REQUIRED (unless inherited from ancestor) - Ask user for preference only when LlmAgent is needed, use {default_model} if user says to use default * **Workflow Agents**: `model` field is FORBIDDEN - Remove model field entirely for Sequential/Parallel/Loop agents - Optional fields: description, instruction, tools, sub_agents as defined in ADK AgentConfig schema -## Critical Path Handling Rules - -**NEVER assume relative path context** - Always resolve paths first! +## File Operation Guidelines -### For relative paths provided by users: -1. **ALWAYS call `resolve_root_directory`** to convert relative to absolute path -2. **Verify the resolved path** matches user's intended location -3. **Use the resolved absolute path** for all file operations +**CRITICAL PATH RULE FOR TOOL CALLS**: +- **NEVER include the project folder name in paths when calling tools** +- **Tools automatically resolve paths relative to the project folder** +- **Use simple relative paths like `root_agent.yaml`, `tools/dice_tool.py`** +- **WRONG**: `{project_folder_name}/root_agent.yaml` (includes project folder name) +- **CORRECT**: `root_agent.yaml` (just the file path within project) -### Examples: -- **User input**: `./config_agents/roll_and_check` -- **WRONG approach**: Create files at `/config_agents/roll_and_check` -- **CORRECT approach**: - 1. Call `resolve_root_directory("./config_agents/roll_and_check")` - 2. Get resolved path: `/Users/user/Projects/adk-python/config_agents/roll_and_check` - 3. Use the resolved absolute path for all operations +**Examples**: +- Current project folder: `basic` +- ✅ **CORRECT tool calls**: + * `write_config_files({{"root_agent.yaml": "..."}})` + * `write_files({{"tools/dice_tool.py": "..."}})` +- ❌ **WRONG tool calls**: + * `write_config_files({{"basic/root_agent.yaml": "..."}})` (duplicates project folder!) + * This would create `projects/basic/basic/root_agent.yaml` instead of `projects/basic/root_agent.yaml` ## Success Criteria ### Design Phase Success: -1. Root folder path confirmed and analyzed with explore_project -2. Clear understanding of user requirements through targeted questions -3. Well-researched architecture based on proven ADK patterns -4. Comprehensive design proposal with agent relationships, tool mappings, AND specific file paths -5. User approval of both architecture and file structure before any implementation +1. Clear understanding of user requirements through targeted questions +2. Well-researched architecture based on proven ADK patterns +3. Comprehensive design proposal with agent relationships, tool mappings, AND specific file paths +4. User approval of both architecture and file structure before any implementation ### Implementation Phase Success: 1. Files created at exact paths specified in approved design 2. No redundant suggest_file_path calls for pre-approved paths 3. Generated configurations pass schema validation (automatically checked) 4. Follow ADK naming and organizational conventions -5. Be immediately testable with `adk run [root_directory]` or via `adk web` interface +5. Every agent configuration explicitly sets `agent_class` and the value matches the agent role; custom classes use a fully qualified dotted path 6. Include clear, actionable instructions for each agent 7. Use appropriate tools for intended functionality @@ -299,8 +540,8 @@ Always reference this schema when creating configurations to ensure compliance. **Your primary role is to be a collaborative architecture consultant that follows an efficient, user-centric workflow:** -1. **Always ask for root folder first** - Know where to create the project -2. **Design with specific paths** - Include exact file locations in proposals +1. **Understand requirements first** - Know what the user wants to build +2. **Design the architecture** - Plan the agent structure and components 3. **Provide high-level architecture overview** - When confirming design, always include: * Overall system architecture and component relationships * Agent types and their responsibilities @@ -311,14 +552,3 @@ Always reference this schema when creating configurations to ensure compliance. 6. **Focus on collaboration** - Ensure user gets exactly what they need with clear understanding **This workflow eliminates inefficiencies and ensures users get well-organized, predictable file structures in their chosen location.** - -## Running Generated Agents - -**Correct ADK Commands:** -- `adk run [root_directory]` - Run agent from root directory (e.g., `adk run config_agents/roll_and_check`) -- `adk web [parent_directory]` - Start web interface, then select agent from dropdown menu (e.g., `adk web config_agents`) - -**Incorrect Commands to Avoid:** -- `adk run [root_directory]/root_agent.yaml` - Do NOT specify the YAML file directly -- `adk web` without parent directory - Must specify the parent folder containing the agent projects -- Always use the project directory for `adk run`, and parent directory for `adk web` \ No newline at end of file diff --git a/contributing/samples/adk_agent_builder_assistant/instruction_query.template b/contributing/samples/adk_agent_builder_assistant/instruction_query.template deleted file mode 100644 index 30706a47cb..0000000000 --- a/contributing/samples/adk_agent_builder_assistant/instruction_query.template +++ /dev/null @@ -1,297 +0,0 @@ -# Agent Builder Assistant - Query Schema Mode - -You are an intelligent Agent Builder Assistant specialized in creating and configuring ADK (Agent Development Kit) multi-agent systems using YAML configuration files. - -## Your Purpose - -Help users design, build, and configure sophisticated multi-agent systems for the ADK framework. You guide users through the agent creation process by asking clarifying questions, suggesting optimal architectures, and generating properly formatted YAML configuration files that comply with the ADK AgentConfig schema. - -## Core Capabilities - -1. **Agent Architecture Design**: Analyze requirements and suggest appropriate agent types (LlmAgent, SequentialAgent, ParallelAgent, LoopAgent) -2. **YAML Configuration Generation**: Create proper ADK agent configuration files with correct ADK AgentConfig schema compliance -3. **Tool Integration**: Help configure and integrate various tool types (Function tools, Google API tools, MCP tools, etc.) -4. **Python File Management**: Create, update, and delete Python files for custom tools and callbacks per user request -5. **Project Structure**: Guide proper ADK project organization and file placement -6. **ADK AgentConfig Schema Querying**: Use the query_schema to dynamically query ADK AgentConfig schema for accurate field definitions -7. **ADK Knowledge & Q&A**: Answer questions about ADK concepts, APIs, usage patterns, troubleshooting, and best practices using comprehensive research capabilities - -## ADK AgentConfig Schema Information - -Instead of embedding the full ADK AgentConfig schema, you have access to the `query_schema` that allows you to: -- Query ADK AgentConfig schema overview: Use query_type="overview" to get high-level structure -- Explore ADK AgentConfig schema components: Use query_type="component" with component name (e.g., "tools", "model") -- Get ADK AgentConfig schema field details: Use query_type="field" with field_path (e.g., "tools.function_tool.function_path") -- List all ADK AgentConfig schema properties: Use query_type="properties" to get comprehensive property list - -Always use the query_schema tool when you need specific ADK AgentConfig schema information to ensure accuracy. - -## Workflow Guidelines - -### 1. Discovery Phase -- **ROOT DIRECTORY ESTABLISHMENT**: - * **FIRST**: Check SESSION CONTEXT section below for "Established Root Directory" - * **IF ESTABLISHED**: Use the existing session root directory - DO NOT ask again - * **IF NOT ESTABLISHED**: Ask user for root directory to establish working context -- **MODEL PREFERENCE**: Only ask for model preference when you determine that LlmAgent(s) will be needed - * **When to ask**: After analyzing requirements and deciding that LlmAgent is needed for the solution - * **DEFAULT**: Use "{default_model}" (your current model) if user doesn't specify - * **EXAMPLES**: "gemini-2.5-flash", "gemini-2.5-pro", etc. - * **RATIONALE**: Only LlmAgent requires model specification; workflow agents do not -- **CRITICAL PATH RESOLUTION**: If user provides a relative path (e.g., `./config_agents/roll_and_check`): - * **FIRST**: Call `resolve_root_directory` to get the correct absolute path - * **VERIFY**: The resolved path matches user's intended location - * **EXAMPLE**: `./config_agents/roll_and_check` should resolve to `/Users/user/Projects/adk-python/config_agents/roll_and_check`, NOT `/config_agents/roll_and_check` -- Understand the user's goals and requirements through targeted questions -- Explore existing project structure using the RESOLVED ABSOLUTE PATH -- Identify integration needs (APIs, databases, external services) - -### 2. Design Phase -- Present a clear architecture design BEFORE implementation -- Explain your reasoning and ask for user confirmation -- Suggest appropriate agent types and tool combinations -- Consider scalability and maintainability - -### 3. Implementation Phase - -**MANDATORY CONFIRMATION BEFORE ANY WRITES:** -- **NEVER write any file without explicit user confirmation** -- **Always present proposed changes first** and ask "Should I proceed with these changes?" -- **For modifications**: Show exactly what will be changed and ask for approval -- **For new files**: Show the complete content and ask for approval -- **For existing file modifications**: Ask "Should I create a backup before modifying this file?" -- **Use backup_existing parameter**: Set to True only if user explicitly requests backup - -**IMPLEMENTATION ORDER (CRITICAL - ONLY AFTER USER CONFIRMS DESIGN):** - -**STEP 1: YAML CONFIGURATION FILES FIRST** -1. Generate all YAML configuration files -2. Present complete YAML content to user for confirmation -3. Ask: "Should I create these YAML configuration files?" -4. Only proceed after user confirmation - -**STEP 2: PYTHON FILES SECOND** -1. Generate Python tool/callback files -2. Present complete Python content to user for confirmation -3. Ask: "Should I create these Python files?" -4. Only proceed after user confirmation -1. **Present all proposed changes** - Show exact file contents and modifications -2. **Get explicit user approval** - Wait for "yes" or "proceed" before any writes -3. **Execute approved changes** - Only write files after user confirms - * ⚠️ **YAML files**: Use `write_config_files` (root_agent.yaml, etc.) - * ⚠️ **Python files**: Use `write_files` (tools/*.py, etc.) -4. **Clean up unused files** - Use cleanup_unused_files and delete_files to remove obsolete tool files - -**YAML Configuration Requirements:** -- Main agent file MUST be named `root_agent.yaml` -- **Sub-agent placement**: Place ALL sub-agent YAML files in the root folder, NOT in `sub_agents/` subfolder -- Tool paths use format: `project_name.tools.module.function_name` (must start with project folder name, no `.py` extension, all dots) - * **Example**: For project at `config_agents/roll_and_check` with tool in `tools/is_prime.py`, use: `roll_and_check.tools.is_prime.is_prime` - * **Pattern**: `{{{{project_folder_name}}}}.tools.{{{{module_name}}}}.{{{{function_name}}}}` - * **CRITICAL**: Use only the final component of the root folder path as project_folder_name (e.g., for `./config_based/roll_and_check`, use `roll_and_check` not `config_based.roll_and_check`) -- No function declarations in YAML (handled automatically by ADK) - -**TOOL IMPLEMENTATION STRATEGY:** -- **For simple/obvious tools**: Implement them directly with actual working code - * Example: dice rolling, prime checking, basic math, file operations - * Don't ask users to "fill in TODO comments" for obvious implementations -- **For complex/business-specific tools**: Generate proper function signatures with TODO comments - * Example: API integrations requiring API keys, complex business logic -- **Always generate correct function signatures**: If user wants `roll_dice` and `is_prime`, generate those exact functions, not generic `tool_name` - -**CRITICAL: Tool Usage Patterns - MANDATORY FILE TYPE SEPARATION** - -⚠️ **YAML FILES (.yaml, .yml) - MUST USE CONFIG TOOLS:** -- **ALWAYS use `write_config_files`** for writing YAML configuration files (root_agent.yaml, etc.) -- **ALWAYS use `read_config_files`** for reading YAML configuration files -- **NEVER use `write_files` for YAML files** - it lacks validation and schema compliance - -⚠️ **PYTHON/OTHER FILES (.py, .txt, .md) - USE GENERAL FILE TOOLS:** -- **Use `write_files`** for Python tools, scripts, documentation, etc. -- **Use `read_files`** for non-YAML content - -⚠️ **WHY THIS SEPARATION MATTERS:** -- `write_config_files` validates YAML syntax and ADK AgentConfig schema compliance -- `write_files` is raw file writing without validation -- Using wrong tool can create invalid configurations - -- **For ADK code questions**: Use `search_adk_source` then `read_files` for complete context -- **File deletion**: Use `delete_files` for multiple file deletion with backup options - -**TOOL GENERATION RULES:** -- **Match user requirements exactly**: Generate the specific functions requested -- **Use proper parameter types**: Don't use generic `parameter: str` when specific types are needed -- **Implement when possible**: Write actual working code for simple, well-defined functions -- **ONE TOOL PER FILE POLICY**: Always create separate files for individual tools - * **Example**: Create `roll_dice.py` and `is_prime.py` instead of `dice_tools.py` - * **Benefit**: Enables easy cleanup when tools are no longer needed - * **Exception**: Only use multi-tool files for legitimate toolsets with shared logic - -### 4. Validation Phase -- Review generated configurations for schema compliance -- Test basic functionality when possible -- Provide clear next steps for the user - -## Available Tools - -You have access to comprehensive tools for: -- **Configuration Management**: Read/write multiple YAML configs with validation and schema compliance -- **File Management**: Read/write multiple files (Python tools, scripts, documentation) with full content handling -- **Project Exploration**: Analyze directory structures and suggest file locations -- **Schema Exploration**: Query AgentConfig schema dynamically for accurate field information -- **ADK Source Search**: Search ADK source code with regex patterns for precise code lookups -- **ADK Knowledge**: Research ADK concepts using local source search and web-based tools -- **Research**: Search GitHub examples and fetch relevant code samples -- **Working Directory**: Resolve paths and maintain context - -### When to Use Research Tools -**ALWAYS use research tools when:** -1. **User asks ADK questions**: Any questions about ADK concepts, APIs, usage patterns, or troubleshooting -2. **Unfamiliar ADK features**: When user requests features you're not certain about -3. **Agent type clarification**: When unsure about agent types, their capabilities, or configuration -4. **Best practices**: When user asks for examples or best practices -5. **Error troubleshooting**: When helping debug ADK-related issues -6. **Agent building uncertainty**: When unsure how to create agents or what's the best practice -7. **Architecture decisions**: When evaluating different approaches or patterns for agent design - -**Research Tool Usage Patterns:** - -**For ADK Code Questions (NEW - Preferred Method):** -1. **search_adk_source** - Find exact code patterns with regex -2. **read_files** - Get complete file context for detailed analysis -3. **query_schema** - Query AgentConfig schema for field definitions - -**For External Examples and Documentation:** -- **google_search_agent**: Search and analyze web content (returns full page content, not just URLs) - * Search within key repositories: "site:github.com/google/adk-python ADK SequentialAgent examples" - * Search documentation: "site:github.com/google/adk-docs agent configuration patterns" - * General searches: "ADK workflow patterns", "ADK tool integration patterns" - * Returns complete page content as search results - no need for additional URL fetching -- **url_context_agent**: Fetch specific URLs only when: - * Specific URLs are mentioned in search results that need additional content - * User provides specific URLs in their query - * You need to fetch content from URLs found within google_search results - * NOT needed for general searches - google_search_agent already provides page content - -**Research for Agent Building:** -- When user requests complex multi-agent systems: Search for similar patterns in samples -- When unsure about tool integration: Look for tool usage examples in contributing/samples -- When designing workflows: Find SequentialAgent, ParallelAgent, or LoopAgent examples -- When user needs specific integrations: Search for API, database, or service integration examples - -## Code Generation Guidelines - -### When Creating Python Tools or Callbacks: -1. **Always search for current examples first**: Use google_search_agent to find "ADK tool_context examples" or "ADK callback_context examples" -2. **Reference contributing/samples**: Use google_search_agent to find examples, or url_context_agent only if specific URLs are identified that need additional content -3. **Look for similar patterns**: Search for tools or callbacks that match your use case -4. **Use snake_case**: Function names should be snake_case (e.g., `check_prime`, `roll_dice`) -5. **Remove tool suffix**: Don't add "_tool" to function names -6. **Implement simple functions**: For obvious functions like `is_prime`, `roll_dice`, replace TODO with actual implementation -7. **Keep TODO for complex**: For complex business logic, leave TODO comments -8. **Follow current ADK patterns**: Always search for and reference the latest examples from contributing/samples - -### Research and Examples: -- Use google_search_agent to find "ADK [use-case] examples" or "ADK [pattern] configuration" (returns full content) -- Use url_context_agent only when: - * Specific URLs are found in search results that need additional content - * User provides specific URLs to analyze - * You need to fetch specific examples from identified URLs: - * GitHub repositories: https://github.com/google/adk-samples/ - * Contributing examples: https://github.com/google/adk-python/tree/main/contributing - * Documentation: https://github.com/google/adk-docs -- Adapt existing patterns to user requirements while maintaining compliance - -## Important ADK Requirements - -**File Naming & Structure:** -- Main configuration MUST be `root_agent.yaml` (not `agent.yaml`) -- Agent directories need `__init__.py` with `from . import agent` -- Python files in agent directory, YAML at root level - -**Tool Configuration:** -- Function tools: `project_name.tools.module.function_name` format (all dots, must start with project folder name) -- No `.py` extension in tool paths -- No function declarations needed in YAML -- **Critical**: Tool paths must include the project folder name as the first component (final component of root folder path only) - -**ADK Agent Types and Model Field Rules:** -- **LlmAgent**: REQUIRES `model` field - this agent directly uses LLM for responses -- **SequentialAgent**: NO `model` field - workflow agent that orchestrates other agents in sequence -- **ParallelAgent**: NO `model` field - workflow agent that runs multiple agents in parallel -- **LoopAgent**: NO `model` field - workflow agent that executes agents in a loop -- **CRITICAL**: Only LlmAgent accepts a model field. Workflow agents (Sequential/Parallel/Loop) do NOT have model fields - -**ADK AgentConfig Schema Compliance:** -- Always use query_schema to verify ADK AgentConfig schema field requirements -- **MODEL FIELD RULES**: - * **LlmAgent**: `model` field is REQUIRED - Ask user for preference only when LlmAgent is needed, use "{default_model}" if not specified - * **Workflow Agents**: `model` field is FORBIDDEN - Remove model field entirely for Sequential/Parallel/Loop agents -- Optional fields: description, instruction, tools, sub_agents as defined in ADK AgentConfig schema - -## Critical Path Handling Rules - -**NEVER assume relative path context** - Always resolve paths first! - -### For relative paths provided by users: -1. **ALWAYS call `resolve_root_directory`** to convert relative to absolute path -2. **Verify the resolved path** matches user's intended location -3. **Use the resolved absolute path** for all file operations - -### Examples: -- **User input**: `./config_agents/roll_and_check` -- **WRONG approach**: Create files at `/config_agents/roll_and_check` -- **CORRECT approach**: - 1. Call `resolve_root_directory("./config_agents/roll_and_check")` - 2. Get resolved path: `/Users/user/Projects/adk-python/config_agents/roll_and_check` - 3. Use the resolved absolute path for all operations - -### When to use path resolution tools: -- **`resolve_root_directory`**: When user provides relative paths or you need to verify path context -- **`get_working_directory_info`**: When execution context seems incorrect or working directory is unclear - -## Success Criteria - -### Design Phase Success: -1. Root folder path confirmed and analyzed with explore_project -2. Clear understanding of user requirements through targeted questions -3. Well-researched architecture based on proven ADK patterns -4. Comprehensive design proposal with agent relationships, tool mappings, AND specific file paths -5. User approval of both architecture and file structure before any implementation - -### Implementation Phase Success: -1. Files created at exact paths specified in approved design -2. No redundant suggest_file_path calls for pre-approved paths -3. Generated configurations pass schema validation (automatically checked) -4. Follow ADK naming and organizational conventions -5. Be immediately testable with `adk run [root_directory]` or via `adk web` interface -6. Include clear, actionable instructions for each agent -7. Use appropriate tools for intended functionality - -## Key Reminder - -**Your primary role is to be a collaborative architecture consultant that follows an efficient, user-centric workflow:** - -1. **Always ask for root folder first** - Know where to create the project -2. **Design with specific paths** - Include exact file locations in proposals -3. **Provide high-level architecture overview** - When confirming design, always include: - * Overall system architecture and component relationships - * Agent types and their responsibilities - * Tool integration patterns and data flow - * File structure with clear explanations of each component's purpose -4. **Get complete approval** - Architecture, design, AND file structure confirmed together -5. **Implement efficiently** - Use approved paths directly without redundant tool calls -6. **Focus on collaboration** - Ensure user gets exactly what they need with clear understanding - -**This workflow eliminates inefficiencies and ensures users get well-organized, predictable file structures in their chosen location.** - -## Running Generated Agents - -**Correct ADK Commands:** -- `adk run [root_directory]` - Run agent from root directory (e.g., `adk run config_agents/roll_and_check`) -- `adk web [parent_directory]` - Start web interface, then select agent from dropdown menu (e.g., `adk web config_agents`) - -**Incorrect Commands to Avoid:** -- `adk run [root_directory]/root_agent.yaml` - Do NOT specify the YAML file directly -- `adk web` without parent directory - Must specify the parent folder containing the agent projects -- Always use the project directory for `adk run`, and parent directory for `adk web` \ No newline at end of file diff --git a/contributing/samples/adk_agent_builder_assistant/sub_agents/__init__.py b/contributing/samples/adk_agent_builder_assistant/sub_agents/__init__.py index af422f9654..d201f31e8d 100644 --- a/contributing/samples/adk_agent_builder_assistant/sub_agents/__init__.py +++ b/contributing/samples/adk_agent_builder_assistant/sub_agents/__init__.py @@ -17,4 +17,7 @@ from .google_search_agent import create_google_search_agent from .url_context_agent import create_url_context_agent -__all__ = ['create_google_search_agent', 'create_url_context_agent'] +__all__ = [ + 'create_google_search_agent', + 'create_url_context_agent', +] diff --git a/contributing/samples/adk_agent_builder_assistant/tools/__init__.py b/contributing/samples/adk_agent_builder_assistant/tools/__init__.py index 66d5bbd72f..c282cfa45e 100644 --- a/contributing/samples/adk_agent_builder_assistant/tools/__init__.py +++ b/contributing/samples/adk_agent_builder_assistant/tools/__init__.py @@ -19,7 +19,6 @@ from .explore_project import explore_project from .read_config_files import read_config_files from .read_files import read_files -from .resolve_root_directory import resolve_root_directory from .search_adk_source import search_adk_source from .write_config_files import write_config_files from .write_files import write_files @@ -33,5 +32,4 @@ 'write_files', 'search_adk_source', 'explore_project', - 'resolve_root_directory', ] diff --git a/contributing/samples/adk_agent_builder_assistant/tools/cleanup_unused_files.py b/contributing/samples/adk_agent_builder_assistant/tools/cleanup_unused_files.py index 1c8003b0dc..c9d95da48f 100644 --- a/contributing/samples/adk_agent_builder_assistant/tools/cleanup_unused_files.py +++ b/contributing/samples/adk_agent_builder_assistant/tools/cleanup_unused_files.py @@ -14,16 +14,20 @@ """Cleanup unused files tool for Agent Builder Assistant.""" -from pathlib import Path from typing import Any from typing import Dict from typing import List from typing import Optional +from google.adk.tools.tool_context import ToolContext + +from ..utils.resolve_root_directory import resolve_file_path +from ..utils.resolve_root_directory import resolve_file_paths + async def cleanup_unused_files( - root_directory: str, used_files: List[str], + tool_context: ToolContext, file_patterns: Optional[List[str]] = None, exclude_patterns: Optional[List[str]] = None, ) -> Dict[str, Any]: @@ -31,27 +35,32 @@ async def cleanup_unused_files( This tool helps clean up unused tool files when agent configurations change. It identifies files that match patterns but aren't referenced in used_files - list. + list. Paths are resolved automatically using the tool context. Args: - root_directory: Root directory to scan for unused files used_files: List of file paths currently in use (should not be deleted) + tool_context: Tool execution context (provides session state) file_patterns: List of glob patterns to match files (default: ["*.py"]) exclude_patterns: List of patterns to exclude (default: ["__init__.py"]) Returns: Dict containing cleanup results: - success: bool indicating if scan succeeded - - root_directory: absolute path to scanned directory - unused_files: list of unused files found - deleted_files: list of files actually deleted - backup_files: list of backup files created - errors: list of error messages - total_freed_space: total bytes freed by deletions """ + session_state = tool_context.state + root_path = resolve_file_path(".", session_state) + try: - root_path = Path(root_directory).resolve() - used_files_set = {Path(f).resolve() for f in used_files} + root_path = root_path.resolve() + resolved_used_files = { + path.resolve() + for path in resolve_file_paths(used_files or [], session_state) + } # Set defaults if file_patterns is None: @@ -61,7 +70,6 @@ async def cleanup_unused_files( result = { "success": False, - "root_directory": str(root_path), "unused_files": [], "deleted_files": [], "backup_files": [], @@ -85,7 +93,7 @@ async def cleanup_unused_files( # Identify unused files unused_files = [] for file_path in all_files: - if file_path not in used_files_set: + if file_path.resolve() not in resolved_used_files: unused_files.append(file_path) result["unused_files"] = [str(f) for f in unused_files] @@ -99,7 +107,6 @@ async def cleanup_unused_files( except Exception as e: return { "success": False, - "root_directory": root_directory, "unused_files": [], "deleted_files": [], "backup_files": [], diff --git a/contributing/samples/adk_agent_builder_assistant/tools/delete_files.py b/contributing/samples/adk_agent_builder_assistant/tools/delete_files.py index 18a68018f6..170f8e9e9c 100644 --- a/contributing/samples/adk_agent_builder_assistant/tools/delete_files.py +++ b/contributing/samples/adk_agent_builder_assistant/tools/delete_files.py @@ -21,9 +21,14 @@ from typing import Dict from typing import List +from google.adk.tools.tool_context import ToolContext + +from ..utils.resolve_root_directory import resolve_file_paths + async def delete_files( file_paths: List[str], + tool_context: ToolContext, create_backup: bool = False, confirm_deletion: bool = True, ) -> Dict[str, Any]: @@ -54,6 +59,10 @@ async def delete_files( - errors: list of general error messages """ try: + # Resolve file paths using session state + session_state = tool_context._invocation_context.session.state + resolved_paths = resolve_file_paths(file_paths, session_state) + result = { "success": True, "files": {}, @@ -68,8 +77,8 @@ async def delete_files( result["errors"].append("Deletion not confirmed by user") return result - for file_path in file_paths: - file_path_obj = Path(file_path).resolve() + for resolved_path in resolved_paths: + file_path_obj = resolved_path.resolve() file_info = { "existed": False, "backup_created": False, diff --git a/contributing/samples/adk_agent_builder_assistant/tools/explore_project.py b/contributing/samples/adk_agent_builder_assistant/tools/explore_project.py index 22ccc03487..b9beb17277 100644 --- a/contributing/samples/adk_agent_builder_assistant/tools/explore_project.py +++ b/contributing/samples/adk_agent_builder_assistant/tools/explore_project.py @@ -19,23 +19,24 @@ from typing import Dict from typing import List +from google.adk.tools.tool_context import ToolContext -async def explore_project(root_directory: str) -> Dict[str, Any]: +from ..utils.resolve_root_directory import resolve_file_path + + +async def explore_project(tool_context: ToolContext) -> Dict[str, Any]: """Analyze project structure and suggest optimal file paths for ADK agents. This tool performs comprehensive project analysis to understand the existing structure and recommend appropriate locations for new agent configurations, tools, and related files following ADK best practices. - Args: - root_directory: Absolute or relative path to the root directory to explore - and analyze + The tool automatically determines the project directory from session state. Returns: - Dict containing analysis results: + Dict containing analysis results with ALL PATHS RELATIVE TO PROJECT FOLDER: Always included: - success: bool indicating if exploration succeeded - - root_path: absolute path to the analyzed directory Success cases only (success=True): - project_info: dict with basic project metadata. Contains: @@ -54,8 +55,7 @@ async def explore_project(root_directory: str) -> Dict[str, Any]: - existing_configs: list of dicts for found YAML configuration files. Each dict contains: • "filename": name of the config file - • "path": absolute path to the file - • "relative_path": path relative to project root + • "relative_path": path relative to project folder • "size": file size in bytes • "is_valid_yaml": bool indicating if YAML parses correctly @@ -80,7 +80,7 @@ async def explore_project(root_directory: str) -> Dict[str, Any]: Examples: Basic project exploration: - result = await explore_project("/path/to/my_adk_project") + result = await explore_project(tool_context) Check project structure: if result["project_info"]["has_tools_directory"]: @@ -96,20 +96,21 @@ async def explore_project(root_directory: str) -> Dict[str, Any]: directories = result["suggestions"]["directories"]["tools"] """ try: - root_path = Path(root_directory).resolve() + # Resolve root directory using session state (use "." as current project directory) + session_state = tool_context._invocation_context.session.state + resolved_path = resolve_file_path(".", session_state) + root_path = resolved_path.resolve() if not root_path.exists(): return { "success": False, - "error": f"Root directory does not exist: {root_directory}", - "root_path": str(root_path), + "error": f"Project directory does not exist: {root_path}", } if not root_path.is_dir(): return { "success": False, - "error": f"Path is not a directory: {root_directory}", - "root_path": str(root_path), + "error": f"Path is not a directory: {root_path}", } # Analyze project structure @@ -121,7 +122,6 @@ async def explore_project(root_directory: str) -> Dict[str, Any]: return { "success": True, - "root_path": str(root_path), "project_info": project_info, "existing_configs": existing_configs, "directory_structure": directory_structure, @@ -132,14 +132,12 @@ async def explore_project(root_directory: str) -> Dict[str, Any]: except PermissionError: return { "success": False, - "error": f"Permission denied accessing directory: {root_directory}", - "root_path": root_directory, + "error": "Permission denied accessing project directory", } except Exception as e: return { "success": False, "error": f"Error exploring project: {str(e)}", - "root_path": root_directory, } @@ -191,12 +189,12 @@ def _find_existing_configs(root_path: Path) -> List[Dict[str, Any]]: # Look for YAML files in root directory (ADK convention) for yaml_file in root_path.glob("*.yaml"): if yaml_file.is_file(): - config_info = _analyze_config_file(yaml_file) + config_info = _analyze_config_file(yaml_file, root_path) configs.append(config_info) for yml_file in root_path.glob("*.yml"): if yml_file.is_file(): - config_info = _analyze_config_file(yml_file) + config_info = _analyze_config_file(yml_file, root_path) configs.append(config_info) # Sort by name for consistent ordering @@ -209,12 +207,18 @@ def _find_existing_configs(root_path: Path) -> List[Dict[str, Any]]: return configs -def _analyze_config_file(config_path: Path) -> Dict[str, Any]: +def _analyze_config_file(config_path: Path, root_path: Path) -> Dict[str, Any]: """Analyze a single configuration file.""" + # Compute relative path from project root + try: + relative_path = config_path.relative_to(root_path) + except ValueError: + # Fallback if not relative to root_path + relative_path = config_path.name + info = { "filename": config_path.name, - "path": str(config_path), - "relative_path": config_path.name, # In root directory + "relative_path": str(relative_path), "size": 0, "is_valid_yaml": False, "agent_name": None, @@ -300,10 +304,10 @@ def _generate_path_suggestions( "root_agent.yaml", ] - # Directory suggestions + # Directory suggestions (relative paths) directories = { "tools": { - "path": str(root_path / "tools"), + "path": "tools", "exists": (root_path / "tools").exists(), "purpose": "Custom tool implementations", "example_files": [ @@ -312,7 +316,7 @@ def _generate_path_suggestions( ], }, "callbacks": { - "path": str(root_path / "callbacks"), + "path": "callbacks", "exists": (root_path / "callbacks").exists(), "purpose": "Custom callback functions", "example_files": ["logging.py", "security.py"], diff --git a/contributing/samples/adk_agent_builder_assistant/tools/read_config_files.py b/contributing/samples/adk_agent_builder_assistant/tools/read_config_files.py index ad52c52e69..63b1bc5800 100644 --- a/contributing/samples/adk_agent_builder_assistant/tools/read_config_files.py +++ b/contributing/samples/adk_agent_builder_assistant/tools/read_config_files.py @@ -19,12 +19,15 @@ from typing import Dict from typing import List +from google.adk.tools.tool_context import ToolContext import yaml from .read_files import read_files -async def read_config_files(file_paths: List[str]) -> Dict[str, Any]: +async def read_config_files( + file_paths: List[str], tool_context: ToolContext +) -> Dict[str, Any]: """Read multiple YAML configuration files and extract metadata. Args: @@ -49,7 +52,7 @@ async def read_config_files(file_paths: List[str]) -> Dict[str, Any]: - errors: list of general error messages """ # Read all files using the file_manager read_files tool - read_result = await read_files(file_paths) + read_result = await read_files(file_paths, tool_context) result = { "success": True, diff --git a/contributing/samples/adk_agent_builder_assistant/tools/read_files.py b/contributing/samples/adk_agent_builder_assistant/tools/read_files.py index bd06134079..4afaf2711b 100644 --- a/contributing/samples/adk_agent_builder_assistant/tools/read_files.py +++ b/contributing/samples/adk_agent_builder_assistant/tools/read_files.py @@ -19,8 +19,14 @@ from typing import Dict from typing import List +from google.adk.tools.tool_context import ToolContext -async def read_files(file_paths: List[str]) -> Dict[str, Any]: +from ..utils.resolve_root_directory import resolve_file_paths + + +async def read_files( + file_paths: List[str], tool_context: ToolContext +) -> Dict[str, Any]: """Read content from multiple files. This tool reads content from multiple files and returns their contents. @@ -43,6 +49,10 @@ async def read_files(file_paths: List[str]) -> Dict[str, Any]: - errors: list of general error messages """ try: + # Resolve file paths using session state + session_state = tool_context._invocation_context.session.state + resolved_paths = resolve_file_paths(file_paths, session_state) + result = { "success": True, "files": {}, @@ -51,8 +61,8 @@ async def read_files(file_paths: List[str]) -> Dict[str, Any]: "errors": [], } - for file_path in file_paths: - file_path_obj = Path(file_path).resolve() + for resolved_path in resolved_paths: + file_path_obj = resolved_path.resolve() file_info = { "content": "", "file_size": 0, @@ -72,7 +82,7 @@ async def read_files(file_paths: List[str]) -> Dict[str, Any]: result["successful_reads"] += 1 except Exception as e: - file_info["error"] = f"Failed to read {file_path}: {str(e)}" + file_info["error"] = f"Failed to read {file_path_obj}: {str(e)}" result["success"] = False result["files"][str(file_path_obj)] = file_info diff --git a/contributing/samples/adk_agent_builder_assistant/tools/resolve_root_directory.py b/contributing/samples/adk_agent_builder_assistant/tools/resolve_root_directory.py deleted file mode 100644 index 3483a78d8f..0000000000 --- a/contributing/samples/adk_agent_builder_assistant/tools/resolve_root_directory.py +++ /dev/null @@ -1,100 +0,0 @@ -# Copyright 2025 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Working directory helper tool to resolve path context issues.""" - -import os -from pathlib import Path -from typing import Any -from typing import Dict -from typing import Optional - - -async def resolve_root_directory( - root_directory: str, working_directory: Optional[str] = None -) -> Dict[str, Any]: - """Resolve the root directory from user-provided path for agent building. - - This tool determines where to create or update agent configurations by - resolving the user-provided path. It handles both absolute and relative paths, - using the current working directory when needed for relative path resolution. - - Args: - root_directory: Path provided by user (can be relative or absolute) - indicating where to build agents - working_directory: Optional explicit working directory to use as base for - relative path resolution (defaults to os.getcwd()) - - Returns: - Dict containing path resolution results: - Always included: - - success: bool indicating if resolution succeeded - - original_path: the provided root directory path - - resolved_path: absolute path to the resolved location - - resolution_method: explanation of how path was resolved - - path_exists: bool indicating if resolved path exists - - Conditionally included: - - alternative_paths: list of other possible path interpretations - - warnings: list of potential issues or ambiguities - - working_directory_used: the working directory used for resolution - - Examples: - Resolve relative path: - result = await resolve_root_directory("./my_project", - "/home/user/projects") - - Resolve with auto-detection: - result = await resolve_root_directory("my_agent.yaml") - # Will use current working directory for relative paths - """ - try: - current_cwd = os.getcwd() - root_path_obj = Path(root_directory) - - # If user provided an absolute path, use it directly - if root_path_obj.is_absolute(): - resolved_path = root_path_obj - else: - # For relative paths, prefer user-provided working directory - if working_directory: - resolved_path = Path(working_directory) / root_directory - else: - # Fallback to actual current working directory - resolved_path = Path(current_cwd) / root_directory - - return { - "success": True, - "original_path": root_directory, - "resolved_path": str(resolved_path.resolve()), - "exists": resolved_path.exists(), - "is_absolute": root_path_obj.is_absolute(), - "current_cwd": current_cwd, - "working_directory_used": working_directory, - "recommendation": ( - f"Use resolved path: {resolved_path.resolve()}" - if resolved_path.exists() - else ( - "Path does not exist. Create parent directories first:" - f" {resolved_path.parent}" - ) - ), - } - - except Exception as e: - return { - "success": False, - "error": f"Failed to resolve path: {str(e)}", - "original_path": root_directory, - } diff --git a/contributing/samples/adk_agent_builder_assistant/tools/search_adk_knowledge.py b/contributing/samples/adk_agent_builder_assistant/tools/search_adk_knowledge.py new file mode 100644 index 0000000000..fd2db0b666 --- /dev/null +++ b/contributing/samples/adk_agent_builder_assistant/tools/search_adk_knowledge.py @@ -0,0 +1,85 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""ADK knowledge search tool.""" + +from typing import Any +import uuid + +import requests + +KNOWLEDGE_SERVICE_APP_URL = "https://adk-agent-builder-knowledge-service-654646711756.us-central1.run.app" +KNOWLEDGE_SERVICE_APP_NAME = "adk_knowledge_agent" +KNOWLEDGE_SERVICE_APP_USER_NAME = "agent_builder_assistant" + +HEADERS = { + "Content-Type": "application/json", + "Accept": "application/json", +} + + +def search_adk_knowledge( + query: str, +) -> dict[str, Any]: + """Searches ADK knowledge base for relevant information. + + Args: + query: The query to search in ADK knowledge base. + + Returns: + A dict with status and the response from the knowledge service. + """ + # Create a new session + session_id = uuid.uuid4() + create_session_url = f"{KNOWLEDGE_SERVICE_APP_URL}/apps/{KNOWLEDGE_SERVICE_APP_NAME}/users/{KNOWLEDGE_SERVICE_APP_USER_NAME}/sessions/{session_id}" + + try: + create_session_response = post_request( + create_session_url, + {}, + ) + except requests.exceptions.RequestException as e: + return error_response(f"Failed to create session: {e}") + session_id = create_session_response["id"] + + # Search ADK knowledge base + search_url = f"{KNOWLEDGE_SERVICE_APP_URL}/run" + try: + search_response = post_request( + search_url, + { + "app_name": KNOWLEDGE_SERVICE_APP_NAME, + "user_id": KNOWLEDGE_SERVICE_APP_USER_NAME, + "session_id": session_id, + "new_message": {"role": "user", "parts": [{"text": query}]}, + }, + ) + except requests.exceptions.RequestException as e: + return error_response(f"Failed to search ADK knowledge base: {e}") + return { + "status": "success", + "response": search_response, + } + + +def error_response(error_message: str) -> dict[str, Any]: + """Returns an error response.""" + return {"status": "error", "error_message": error_message} + + +def post_request(url: str, payload: dict[str, Any]) -> dict[str, Any]: + """Executes a POST request.""" + response = requests.post(url, headers=HEADERS, json=payload, timeout=60) + response.raise_for_status() + return response.json() diff --git a/contributing/samples/adk_agent_builder_assistant/tools/write_config_files.py b/contributing/samples/adk_agent_builder_assistant/tools/write_config_files.py index 78f17240ac..2ceb1241dd 100644 --- a/contributing/samples/adk_agent_builder_assistant/tools/write_config_files.py +++ b/contributing/samples/adk_agent_builder_assistant/tools/write_config_files.py @@ -14,19 +14,47 @@ """Configuration file writer tool with validation-before-write.""" +from __future__ import annotations + from pathlib import Path +import re from typing import Any from typing import Dict +from typing import List +from typing import Mapping +from typing import Optional +from typing import Sequence +from typing import Tuple +from google.adk.tools.tool_context import ToolContext import jsonschema import yaml from ..utils import load_agent_config_schema +from ..utils.resolve_root_directory import resolve_file_path from .write_files import write_files +INVALID_FILENAME_CHARACTERS = frozenset('<>:"/\\|?*') +PARSED_CONFIG_KEY = "_parsed_config" +WORKFLOW_AGENT_CLASSES = frozenset({ + "SequentialAgent", + "ParallelAgent", + "LoopAgent", +}) +IDENTIFIER_PATTERN = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*$") +CALLBACK_FIELD_NAMES = ( + "before_agent_callbacks", + "after_agent_callbacks", + "before_model_callbacks", + "after_model_callbacks", + "before_tool_callbacks", + "after_tool_callbacks", +) + async def write_config_files( configs: Dict[str, str], + tool_context: ToolContext, backup_existing: bool = False, # Changed default to False - user should decide create_directories: bool = True, ) -> Dict[str, Any]: @@ -38,8 +66,8 @@ async def write_config_files( Args: configs: Dict mapping file_path to config_content (YAML as string) - backup_existing: Whether to create timestamped backup of existing files - before overwriting (default: False - user should be asked) + backup_existing: Whether to create timest amped backup of existing files + before overwriting (default: False, User should decide) create_directories: Whether to create parent directories if they don't exist (default: True) @@ -62,6 +90,9 @@ async def write_config_files( • Missing sub-agent files • Incorrect file extensions (.yaml/.yml) • Mixed tool format consistency + - target_file_path: normalized path used for writing the config + - rename_applied: whether the file name was changed to match agent name + - written_file_path: absolute path that was ultimately written Conditionally included: - backup: dict with backup information (if backup was created). @@ -127,36 +158,129 @@ async def write_config_files( "errors": [], } - validated_configs: Dict[str, str] = {} + validated_config_dicts: Dict[str, Dict[str, Any]] = {} + normalized_path_to_original: Dict[str, str] = {} + canonical_path_to_original: Dict[str, str] = {} + rename_map: Dict[str, str] = {} + + session_state = None + session = getattr(tool_context, "session", None) + if session is not None: + session_state = getattr(session, "state", None) + project_folder_name: Optional[str] = None + if session_state is not None: + try: + project_root = resolve_file_path(".", session_state) + project_folder_name = project_root.name or None + except Exception: + project_folder_name = None # Step 1: Validate all configs before writing any files for file_path, config_content in configs.items(): - file_result = _validate_single_config(file_path, config_content) + file_result = _validate_single_config( + file_path, config_content, project_folder_name + ) result["files"][file_path] = file_result if file_result.get("success", False): - validated_configs[file_path] = config_content + parsed_config = file_result.pop(PARSED_CONFIG_KEY, None) + if parsed_config is None: + file_result["success"] = False + file_result["error_type"] = "INTERNAL_VALIDATION_ERROR" + file_result["error"] = "Failed to parse configuration content." + result["success"] = False + continue + + agent_name = file_result.get("agent_name") + ( + target_path, + rename_applied, + sanitized_name, + rename_warning, + ) = _determine_target_file_path(file_path, agent_name) + + file_result["target_file_path"] = target_path + file_result["rename_applied"] = rename_applied + if rename_warning: + warnings = file_result.get("warnings", []) + warnings.append(rename_warning) + file_result["warnings"] = warnings + + if rename_applied and sanitized_name and sanitized_name != agent_name: + warnings = file_result.get("warnings", []) + warnings.append( + "Agent name normalized for filesystem compatibility:" + f" '{agent_name}' -> '{sanitized_name}'" + ) + file_result["warnings"] = warnings + + normalized_key = target_path + if normalized_key in normalized_path_to_original: + conflict_source = normalized_path_to_original[normalized_key] + file_result["success"] = False + file_result["error_type"] = "FILE_PATH_CONFLICT" + file_result["error"] = ( + "Multiple agent configs target the same file path after" + f" normalization: '{conflict_source}' and '{file_path}'" + ) + result["success"] = False + continue + normalized_path_to_original[normalized_key] = file_path + + canonical_key = _canonical_path_key(normalized_key, session_state) + if canonical_key in canonical_path_to_original: + conflict_source = canonical_path_to_original[canonical_key] + file_result["success"] = False + file_result["error_type"] = "FILE_PATH_CONFLICT" + file_result["error"] = ( + "Multiple agent configs resolve to the same file path after" + f" normalization: '{conflict_source}' and '{file_path}'" + ) + result["success"] = False + continue + canonical_path_to_original[canonical_key] = file_path + + if normalized_key != file_path: + rename_map[file_path] = normalized_key + + validated_config_dicts[normalized_key] = parsed_config else: result["success"] = False - # Step 2: If all validations passed, write all files - if result["success"] and validated_configs: + if result["success"] and validated_config_dicts: + if rename_map: + reference_map = _build_reference_map(rename_map) + for config_dict in validated_config_dicts.values(): + _update_sub_agent_references(config_dict, reference_map) + + validated_configs: Dict[str, str] = {} + for normalized_path, config_dict in validated_config_dicts.items(): + validated_configs[normalized_path] = yaml.safe_dump( + config_dict, + sort_keys=False, + ) + write_result: Dict[str, Any] = await write_files( validated_configs, + tool_context, create_backup=backup_existing, create_directories=create_directories, ) # Merge write results with validation results files_data = write_result.get("files", {}) - for file_path, write_info in files_data.items(): - if file_path in result["files"]: - file_entry = result["files"][file_path] + for written_path, write_info in files_data.items(): + canonical_written_key = _canonical_path_key(written_path, session_state) + original_key = canonical_path_to_original.get(canonical_written_key) + + if original_key and original_key in result["files"]: + file_entry = result["files"][original_key] if isinstance(file_entry, dict): file_entry.update({ "file_size": write_info.get("file_size", 0), "backup_created": write_info.get("backup_created", False), "backup_path": write_info.get("backup_path"), + "written_file_path": written_path, }) if write_info.get("error"): file_entry["success"] = False @@ -168,8 +292,92 @@ async def write_config_files( return result +def _build_reference_map(rename_map: Dict[str, str]) -> Dict[str, str]: + """Build lookup for updating sub-agent config paths after renames.""" + reference_map: Dict[str, str] = {} + for original, target in rename_map.items(): + original_path = Path(original) + target_path = Path(target) + + candidates = { + original: target, + str(original_path): str(target_path), + original_path.as_posix(): target_path.as_posix(), + original_path.name: target_path.name, + } + + # Ensure Windows-style separators are covered when running on POSIX. + candidates.setdefault( + str(original_path).replace("\\", "/"), + str(target_path).replace("\\", "/"), + ) + + for candidate, replacement in candidates.items(): + reference_map[candidate] = replacement + + return reference_map + + +def _update_sub_agent_references( + config_dict: Dict[str, Any], reference_map: Dict[str, str] +) -> None: + """Update sub-agent config_path entries based on rename map.""" + if not reference_map: + return + + sub_agents = config_dict.get("sub_agents") + if not isinstance(sub_agents, list): + return + + for sub_agent in sub_agents: + if not isinstance(sub_agent, dict): + continue + + config_path = sub_agent.get("config_path") + if not isinstance(config_path, str): + continue + + new_path = reference_map.get(config_path) + if new_path is None: + try: + normalized = str(Path(config_path)) + new_path = reference_map.get(normalized) + except (OSError, ValueError): + normalized = None + + if new_path is None and normalized is not None: + new_path = reference_map.get(Path(normalized).as_posix()) + + if new_path is None: + try: + base_name = Path(config_path).name + new_path = reference_map.get(base_name) + except (OSError, ValueError): + new_path = None + + if new_path: + sub_agent["config_path"] = new_path + + +def _canonical_path_key( + path: str, session_state: Optional[Dict[str, Any]] +) -> str: + """Create a canonical absolute path string for consistent lookups.""" + try: + resolved_path = resolve_file_path(path, session_state) + except (OSError, ValueError, RuntimeError): + resolved_path = Path(path) + + try: + return str(resolved_path.resolve()) + except (OSError, RuntimeError): + return str(resolved_path) + + def _validate_single_config( - file_path: str, config_content: str + file_path: str, + config_content: str, + project_folder_name: Optional[str] = None, ) -> Dict[str, Any]: """Validate a single configuration file. @@ -216,7 +424,27 @@ def _validate_single_config( } # Step 3: Additional structural validation + # TODO: b/455645705 - Remove once the frontend performs these validations before calling + # this tool. + name_warning = _normalize_agent_name_field(config_dict, path) structural_validation = _validate_structure(config_dict, path) + warnings = list(structural_validation.get("warnings", [])) + warnings.extend(_strip_workflow_agent_fields(config_dict)) + if name_warning: + warnings.append(name_warning) + name_validation_error = _require_valid_agent_name(config_dict, path) + if name_validation_error is not None: + return name_validation_error + model_validation_error = _require_llm_agent_model(config_dict, path) + if model_validation_error is not None: + return model_validation_error + project_scope_result = _enforce_project_scoped_references( + config_dict, project_folder_name, path + ) + warnings.extend(project_scope_result.get("warnings", [])) + project_scope_error = project_scope_result.get("error") + if project_scope_error is not None: + return project_scope_error # Success response with validation metadata return { @@ -224,7 +452,8 @@ def _validate_single_config( "file_path": str(path), "agent_name": config_dict.get("name", "unknown"), "agent_class": config_dict.get("agent_class", "LlmAgent"), - "warnings": structural_validation.get("warnings", []), + "warnings": warnings, + PARSED_CONFIG_KEY: config_dict, } except Exception as e: @@ -311,13 +540,6 @@ def _validate_structure( """Perform additional structural validation beyond JSON schema.""" warnings = [] - # Check agent name format - name = config.get("name", "") - if name and not name.replace("_", "").replace("-", "").isalnum(): - warnings.append( - "Agent name contains special characters that may cause issues" - ) - # Check for empty instruction instruction = config.get("instruction", "").strip() if config.get("agent_class", "LlmAgent") == "LlmAgent" and not instruction: @@ -359,7 +581,9 @@ def _validate_structure( return {"warnings": warnings, "has_warnings": len(warnings) > 0} -def _generate_retry_suggestion(errors: list) -> str: +def _generate_retry_suggestion( + errors: Sequence[Mapping[str, Any]], +) -> str: """Generate helpful suggestions for fixing validation errors.""" if not errors: return "" @@ -409,3 +633,322 @@ def _generate_retry_suggestion(errors: list) -> str: ) return " | ".join(suggestions[:3]) # Limit to top 3 suggestions + + +def _require_llm_agent_model( + config: Dict[str, Any], file_path: Path +) -> Optional[Dict[str, Any]]: + """Ensure every LlmAgent configuration declares a model.""" + agent_class = config.get("agent_class", "LlmAgent") + if agent_class != "LlmAgent": + return None + + model = config.get("model") + if isinstance(model, str) and model.strip(): + return None + + agent_name = config.get("name", "unknown") + return { + "success": False, + "error_type": "LLM_AGENT_MODEL_REQUIRED", + "error": ( + f"LlmAgent '{agent_name}' in '{file_path}' must define a 'model' " + "field. LlmAgents cannot rely on implicit defaults." + ), + "file_path": str(file_path), + "validation_step": "structure_validation", + "retry_suggestion": ( + "Add a 'model' field with the user-confirmed model " + "(for example, 'model: gemini-2.5-flash')." + ), + } + + +def _require_valid_agent_name( + config: Dict[str, Any], file_path: Path +) -> Optional[Dict[str, Any]]: + """Ensure agent names are valid identifiers.""" + agent_name = config.get("name") + if isinstance(agent_name, str) and IDENTIFIER_PATTERN.match(agent_name): + return None + + return { + "success": False, + "error_type": "INVALID_AGENT_NAME", + "error": ( + f"Found invalid agent name: `{agent_name}` in '{file_path}'. " + "Names must start with a letter or underscore and contain only " + "letters, digits, or underscores." + ), + "file_path": str(file_path), + "validation_step": "structure_validation", + "retry_suggestion": ( + "Rename the agent using only letters, digits, and underscores " + "(e.g., 'Paper_Analyzer')." + ), + } + + +def _normalize_agent_name_field( + config: Dict[str, Any], file_path: Path +) -> Optional[str]: + """Normalize agent name to snake_case and update the config in-place.""" + agent_name = config.get("name") + if not isinstance(agent_name, str): + return None + + sanitized_name, normalization_warning = _sanitize_agent_name_for_filename( + agent_name + ) + if not sanitized_name: + return normalization_warning + + if sanitized_name != agent_name: + config["name"] = sanitized_name + return ( + "Agent name normalized to snake_case in " + f"'{file_path.name}': '{agent_name}' -> '{sanitized_name}'" + ) + + return normalization_warning + + +def _strip_workflow_agent_fields(config: Dict[str, Any]) -> List[str]: + """Remove fields that workflow agents must not define.""" + warnings: List[str] = [] + agent_class = config.get("agent_class") + if agent_class not in WORKFLOW_AGENT_CLASSES: + return warnings + + removed_fields = [] + for field in ("model", "tools", "instruction"): + if field in config: + config.pop(field, None) + removed_fields.append(field) + + if removed_fields: + removed_fields_str = ", ".join(removed_fields) + agent_name = config.get("name", "unknown") + warnings.append( + "Removed " + f"{removed_fields_str}" + f" from workflow agent '{agent_name}'. " + "Workflow agents orchestrate sub-agents and must not define these " + "fields." + ) + + return warnings + + +def _enforce_project_scoped_references( + config: Dict[str, Any], + project_folder_name: Optional[str], + file_path: Path, +) -> Dict[str, Any]: + """Ensure callback/tool references are scoped to the project package.""" + if not project_folder_name: + return {"warnings": [], "error": None} + + prefix = f"{project_folder_name}." + warnings: List[str] = [] + errors: List[str] = [] + + def _normalize_reference_value( + value: str, descriptor: str + ) -> Tuple[str, List[str], List[str]]: + local_warnings: List[str] = [] + local_errors: List[str] = [] + new_value = value + + if not isinstance(value, str) or "." not in value: + return new_value, local_warnings, local_errors + + if value.startswith(prefix): + return new_value, local_warnings, local_errors + + if value.lower().startswith(prefix.lower()): + local_errors.append( + f"{descriptor} '{value}' must use exact-case prefix '{prefix}'." + ) + return new_value, local_warnings, local_errors + + if value.startswith("callbacks.") or value.startswith("tools."): + new_value = prefix + value + local_warnings.append( + f"{descriptor} '{value}' updated to '{new_value}' to include project " + "prefix." + ) + return new_value, local_warnings, local_errors + + if ".callbacks." in value or ".tools." in value: + local_errors.append(f"{descriptor} '{value}' must start with '{prefix}'.") + + return new_value, local_warnings, local_errors + + tools = config.get("tools") + if isinstance(tools, list): + for index, tool in enumerate(tools): + if isinstance(tool, str): + updated, local_warnings, local_errors = _normalize_reference_value( + tool, "Tool reference" + ) + if updated != tool: + tools[index] = updated + warnings.extend(local_warnings) + errors.extend(local_errors) + elif isinstance(tool, dict): + name = tool.get("name") + if isinstance(name, str): + updated, local_warnings, local_errors = _normalize_reference_value( + name, "Tool reference" + ) + if updated != name: + tool["name"] = updated + warnings.extend(local_warnings) + errors.extend(local_errors) + + for field_name in CALLBACK_FIELD_NAMES: + callbacks_field = config.get(field_name) + if not callbacks_field: + continue + + items = ( + callbacks_field + if isinstance(callbacks_field, list) + else [callbacks_field] + ) + + for idx, item in enumerate(items): + if isinstance(item, str): + updated, local_warnings, local_errors = _normalize_reference_value( + item, f"{field_name} entry" + ) + if updated != item: + if isinstance(callbacks_field, list): + callbacks_field[idx] = updated + else: + config[field_name] = updated + warnings.extend(local_warnings) + errors.extend(local_errors) + elif isinstance(item, dict): + name = item.get("name") + if isinstance(name, str): + updated, local_warnings, local_errors = _normalize_reference_value( + name, f"{field_name} entry" + ) + if updated != name: + item["name"] = updated + warnings.extend(local_warnings) + errors.extend(local_errors) + + if errors: + return { + "warnings": warnings, + "error": { + "success": False, + "error_type": "PROJECT_REFERENCE_ERROR", + "error": " | ".join(errors), + "file_path": str(file_path), + "retry_suggestion": ( + "Ensure all callback/tool references start with " + f"'{prefix}' and that referenced directories contain " + "__init__.py files (only for the package directories such as " + "'callbacks/' or 'tools/') so they form importable packages." + ), + }, + } + + return {"warnings": warnings, "error": None} + + +def _determine_target_file_path( + file_path: str, agent_name: Optional[str] +) -> Tuple[str, bool, Optional[str], Optional[str]]: + """Determine desired file path based on agent name.""" + if not agent_name or not agent_name.strip(): + return file_path, False, None, None + + original_path = Path(file_path) + + # Preserve root_agent.yaml naming convention for root workflows. + if original_path.stem == "root_agent": + return file_path, False, None, None + + sanitized_name, sanitize_warning = _sanitize_agent_name_for_filename( + agent_name + ) + if not sanitized_name: + return ( + file_path, + False, + None, + ( + "Agent name could not be converted into a valid file name; original" + " path preserved" + ), + ) + + suffix = original_path.suffix or ".yaml" + target_name = f"{sanitized_name}{suffix}" + target_path = str(original_path.with_name(target_name)) + rename_applied = original_path.name != target_name + + return target_path, rename_applied, sanitized_name, sanitize_warning + + +def _to_snake_case(value: str) -> str: + """Convert arbitrary text to snake_case.""" + value = value.strip() + if not value: + return "" + + value = re.sub(r"[\s\-]+", "_", value) + value = re.sub(r"(.)([A-Z][a-z]+)", r"\1_\2", value) + value = re.sub(r"([a-z0-9])([A-Z])", r"\1_\2", value) + value = re.sub(r"[^A-Za-z0-9_]", "_", value) + value = re.sub(r"_+", "_", value) + return value.lower().strip("_") + + +def _sanitize_agent_name_for_filename( + agent_name: str, +) -> Tuple[str, Optional[str]]: + """Sanitize agent name so it can be safely used as a filename.""" + trimmed_name = agent_name.strip() + if not trimmed_name: + return "", "Agent name is empty after trimming whitespace" + + snake_case = _to_snake_case(trimmed_name) + if not snake_case: + return "", "Agent name is empty after normalization" + + sanitized_chars = [] + replacements_made = snake_case != trimmed_name + + for char in snake_case: + if char in INVALID_FILENAME_CHARACTERS: + sanitized_chars.append("_") + replacements_made = True + elif char.isalnum() or char == "_": + sanitized_chars.append(char) + else: + sanitized_chars.append("_") + replacements_made = True + + sanitized_name = "".join(sanitized_chars) + sanitized_name = re.sub(r"_+", "_", sanitized_name).strip("_") + if not sanitized_name: + return "", "Agent name is empty after removing unsupported characters" + + if sanitized_name[0].isdigit(): + sanitized_name = f"_{sanitized_name}" + replacements_made = True + + warning = None + if replacements_made: + warning = ( + "Agent name normalized to snake_case: " + f"'{agent_name}' -> '{sanitized_name}'" + ) + + return sanitized_name, warning diff --git a/contributing/samples/adk_agent_builder_assistant/tools/write_files.py b/contributing/samples/adk_agent_builder_assistant/tools/write_files.py index d610fe3eba..953a04b2f1 100644 --- a/contributing/samples/adk_agent_builder_assistant/tools/write_files.py +++ b/contributing/samples/adk_agent_builder_assistant/tools/write_files.py @@ -19,10 +19,17 @@ import shutil from typing import Any from typing import Dict +from typing import List +from typing import Optional + +from google.adk.tools.tool_context import ToolContext + +from ..utils.resolve_root_directory import resolve_file_path async def write_files( files: Dict[str, str], + tool_context: ToolContext, create_backup: bool = False, create_directories: bool = True, ) -> Dict[str, Any]: @@ -50,6 +57,15 @@ async def write_files( - errors: list of general error messages """ try: + # Get session state for path resolution + session_state = tool_context._invocation_context.session.state + project_root: Optional[Path] = None + if session_state is not None: + try: + project_root = resolve_file_path(".", session_state).resolve() + except Exception: + project_root = None + result = { "success": True, "files": {}, @@ -59,13 +75,16 @@ async def write_files( } for file_path, content in files.items(): - file_path_obj = Path(file_path).resolve() + # Resolve file path using session state + resolved_path = resolve_file_path(file_path, session_state) + file_path_obj = resolved_path.resolve() file_info = { "file_size": 0, "existed_before": False, "backup_created": False, "backup_path": None, "error": None, + "package_inits_created": [], } try: @@ -76,6 +95,11 @@ async def write_files( if create_directories: file_path_obj.parent.mkdir(parents=True, exist_ok=True) + if file_path_obj.suffix == ".py" and project_root is not None: + created_inits = _ensure_package_inits(file_path_obj, project_root) + if created_inits: + file_info["package_inits_created"] = created_inits + # Create backup if requested and file exists if create_backup and file_info["existed_before"]: timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") @@ -120,3 +144,38 @@ async def write_files( "total_files": len(files) if files else 0, "errors": [f"Write operation failed: {str(e)}"], } + + +def _ensure_package_inits( + file_path: Path, + project_root: Path, +) -> List[str]: + """Ensure __init__.py files exist for importable subpackages (not project root).""" + created_inits: List[str] = [] + try: + target_parent = file_path.parent.resolve() + root_path = project_root.resolve() + relative_parent = target_parent.relative_to(root_path) + except Exception: + return created_inits + + def _touch_init(directory: Path) -> None: + init_file = directory / "__init__.py" + if not init_file.exists(): + init_file.touch() + created_inits.append(str(init_file)) + + root_path.mkdir(parents=True, exist_ok=True) + + if not relative_parent.parts: + return created_inits + + current_path = root_path + for part in relative_parent.parts: + if part in (".", ""): + continue + current_path = current_path / part + current_path.mkdir(parents=True, exist_ok=True) + _touch_init(current_path) + + return created_inits diff --git a/contributing/samples/adk_agent_builder_assistant/utils/adk_source_utils.py b/contributing/samples/adk_agent_builder_assistant/utils/adk_source_utils.py index b2cd3dfc28..ef020e46d9 100644 --- a/contributing/samples/adk_agent_builder_assistant/utils/adk_source_utils.py +++ b/contributing/samples/adk_agent_builder_assistant/utils/adk_source_utils.py @@ -23,7 +23,7 @@ from typing import Optional # Set up logger for ADK source utils -logger = logging.getLogger(__name__) +logger = logging.getLogger("google_adk." + __name__) # Global cache for ADK AgentConfig schema to avoid repeated file reads _schema_cache: Optional[Dict[str, Any]] = None @@ -49,7 +49,7 @@ def find_adk_source_folder(start_path: Optional[str] = None) -> Optional[str]: adk_path = find_adk_source_folder("/path/to/project") """ if start_path is None: - start_path = os.getcwd() + start_path = os.path.dirname(__file__) current_path = Path(start_path).resolve() diff --git a/contributing/samples/adk_agent_builder_assistant/utils/resolve_root_directory.py b/contributing/samples/adk_agent_builder_assistant/utils/resolve_root_directory.py new file mode 100644 index 0000000000..4826b999b5 --- /dev/null +++ b/contributing/samples/adk_agent_builder_assistant/utils/resolve_root_directory.py @@ -0,0 +1,87 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Working directory helper tool to resolve path context issues.""" + +import os +from pathlib import Path +from typing import Any +from typing import Dict +from typing import List +from typing import Optional + + +def resolve_file_path( + file_path: str, + session_state: Optional[Dict[str, Any]] = None, + working_directory: Optional[str] = None, +) -> Path: + """Resolve a file path using root directory from session state. + + This is a helper function that other tools can use to resolve file paths + without needing to be async or return detailed resolution information. + + Args: + file_path: File path (relative or absolute) + session_state: Session state dict that may contain root_directory + working_directory: Working directory to use as base (defaults to cwd) + + Returns: + Resolved absolute Path object + """ + file_path_obj = Path(file_path) + + # If already absolute, use as-is + if file_path_obj.is_absolute(): + return file_path_obj + + # Get root directory from session state, default to "./" + root_directory = "./" + if session_state and "root_directory" in session_state: + root_directory = session_state["root_directory"] + + # Use the same resolution logic as the main function + root_path_obj = Path(root_directory) + + if root_path_obj.is_absolute(): + resolved_root = root_path_obj + else: + if working_directory: + resolved_root = Path(working_directory) / root_directory + else: + resolved_root = Path(os.getcwd()) / root_directory + + # Resolve file path relative to root directory + return resolved_root / file_path + + +def resolve_file_paths( + file_paths: List[str], + session_state: Optional[Dict[str, Any]] = None, + working_directory: Optional[str] = None, +) -> List[Path]: + """Resolve multiple file paths using root directory from session state. + + Args: + file_paths: List of file paths (relative or absolute) + session_state: Session state dict that may contain root_directory + working_directory: Working directory to use as base (defaults to cwd) + + Returns: + List of resolved absolute Path objects + """ + return [ + resolve_file_path(path, session_state, working_directory) + for path in file_paths + ] diff --git a/contributing/samples/adk_answering_agent/README.md b/contributing/samples/adk_answering_agent/README.md index 2941f29744..25694fad56 100644 --- a/contributing/samples/adk_answering_agent/README.md +++ b/contributing/samples/adk_answering_agent/README.md @@ -116,4 +116,4 @@ The following environment variables are required to upload the docs to update th * `ADK_DOCS_ROOT_PATH=YOUR_ADK_DOCS_ROOT_PATH`: **(Required)** Path to the root of the downloaded adk-docs repo. * `ADK_PYTHON_ROOT_PATH=YOUR_ADK_PYTHON_ROOT_PATH`: **(Required)** Path to the root of the downloaded adk-python repo. -For local execution in interactive mode, you can place these variables in a `.env` file in the project's root directory. For the GitHub workflow, they should be configured as repository secrets. \ No newline at end of file +For local execution in interactive mode, you can place these variables in a `.env` file in the project's root directory. For the GitHub workflow, they should be configured as repository secrets. diff --git a/contributing/samples/adk_answering_agent/upload_docs_to_vertex_ai_search.py b/contributing/samples/adk_answering_agent/upload_docs_to_vertex_ai_search.py index 9dd7ca6a2c..96fe6adf0a 100644 --- a/contributing/samples/adk_answering_agent/upload_docs_to_vertex_ai_search.py +++ b/contributing/samples/adk_answering_agent/upload_docs_to_vertex_ai_search.py @@ -72,8 +72,8 @@ def upload_directory_to_gcs( # into hidden directories. dirs[:] = [d for d in dirs if not d.startswith(".")] - # Keep only .md and .py files. - files = [f for f in files if f.endswith(".md") or f.endswith(".py")] + # Keep only .md, .py and .yaml files. + files = [f for f in files if f.endswith((".md", ".py", ".yaml"))] for filename in files: local_path = os.path.join(root, filename) @@ -99,6 +99,19 @@ def upload_directory_to_gcs( bucket.blob(gcs_path).upload_from_string( html_content, content_type=content_type ) + elif filename.lower().endswith(".yaml"): + # Vertex AI search doesn't recognize yaml, + # convert it to text and use text/plain instead + content_type = "text/plain" + with open(local_path, "r", encoding="utf-8") as f: + yaml_content = f.read() + if not yaml_content: + print(" - Skipped empty file: " + local_path) + continue + gcs_path = gcs_path.removesuffix(".yaml") + ".txt" + bucket.blob(gcs_path).upload_from_string( + yaml_content, content_type=content_type + ) else: # Python files bucket.blob(gcs_path).upload_from_filename( local_path, content_type=content_type @@ -117,7 +130,7 @@ def upload_directory_to_gcs( ) return False - print(f"Sucessfully uploaded {file_count} files to GCS.") + print(f"Successfully uploaded {file_count} files to GCS.") return True @@ -135,7 +148,7 @@ def import_from_gcs_to_vertex_ai( # parent has the format of # "projects/{project_number}/locations/{location}/collections/{collection}/dataStores/{datastore_id}/branches/default_branch" parent=full_datastore_id + "/branches/default_branch", - # Specify the GCS source and use "content" for unstructed data. + # Specify the GCS source and use "content" for unstructured data. gcs_source=discoveryengine.GcsSource( input_uris=[gcs_uri], data_schema="content" ), diff --git a/contributing/samples/adk_answering_agent/utils.py b/contributing/samples/adk_answering_agent/utils.py index f4c65fc22f..9393d9c85a 100644 --- a/contributing/samples/adk_answering_agent/utils.py +++ b/contributing/samples/adk_answering_agent/utils.py @@ -115,6 +115,10 @@ def convert_gcs_to_https(gcs_uri: str) -> Optional[str]: if relative_path.endswith(".html"): relative_path = relative_path.removesuffix(".html") + ".md" + # Replace .txt with .yaml + if relative_path.endswith(".txt"): + relative_path = relative_path.removesuffix(".txt") + ".yaml" + # Convert the links for adk-docs if prefix == "adk-docs" and relative_path.startswith("docs/"): path_after_docs = relative_path[len("docs/") :] @@ -139,7 +143,7 @@ def convert_gcs_to_https(gcs_uri: str) -> Optional[str]: if _check_url_exists(potential_url): return potential_url else: - # If it doesn't exist, fallback to the regular github url + # If it doesn't exist, fall back to the regular github url return _generate_github_url(prefix, relative_path) # Convert the links for other cases, e.g. adk-python diff --git a/contributing/samples/adk_documentation/adk_docs_updater/agent.py b/contributing/samples/adk_documentation/adk_docs_updater/agent.py index 1a49a07685..afa5565127 100644 --- a/contributing/samples/adk_documentation/adk_docs_updater/agent.py +++ b/contributing/samples/adk_documentation/adk_docs_updater/agent.py @@ -68,7 +68,8 @@ # 3. Workflow 1. Always call the `clone_or_pull_repo` tool to make sure the ADK docs and codebase repos exist in the local folder {LOCAL_REPOS_DIR_PATH}/repo_name and are the latest version. - 2. Read the issue specified by user using the `get_issue` tool. + 2. Read and analyze the issue specified by user. + - If user only specified the issue number, call the `get_issue` tool to get the issue details, otherwise use the issue details provided by user directly. 3. If the issue contains instructions about how to update the ADK docs, follow the instructions to update the ADK docs. 4. Understand the doc update instructions. - Ignore and skip the instructions about updating API reference docs, since it will be automatically generated by the ADK team. @@ -81,8 +82,18 @@ - You can ignore unit test files, unless you are sure that the test code is uesful to understand the related concepts. - You should read all the the found files to find all the related code, unless you already know the content of the file or you are sure that the file is not related to the ADK doc. 8. Update the ADK doc file according to the doc update instructions and the related code. + - Use active voice phrasing in your doc updates. + - Use second person "you" form of address in your doc updates. 9. Create pull requests to update the ADK doc file using the `create_pull_request_from_changes` tool. - - For each recommended change, create a separate pull request. + - For each recommended change, create a separate pull request. Make sure the recommended change has exactly one pull request. + For example, if the ADK doc issue contains the following 2 recommended changes: + ``` + 1. Title of recommended change 1 + + 2. Title of recommended change 2 + + ``` + Then you should create 2 pull requests, one for each recommended change, even if each recommended change needs to update multiple ADK doc files. - The title of the pull request should be "Update ADK doc according to issue # - ", where is the number of the ADK docs issue and is the id of the recommended change (e.g. "1", "2", etc.). - The body of the pull request should be the instructions about how to update the ADK docs. - **{APPROVAL_INSTRUCTION}** @@ -90,7 +101,10 @@ # 4. Guidelines & Rules - **File Paths:** Always use absolute paths when calling the tools to read files, list directories, or search the codebase. - **Tool Call Parallelism:** Execute multiple independent tool calls in parallel when feasible (i.e. searching the codebase). + - **Avoid deletion:** Do not delete any existing content unless specifically directed to do so. - **Explaination:** Provide concise explanations for your actions and reasoning for each step. + - **Minimize changes:** When making updates to documentation pages, make the minimum amount of changes to achieve the communication goal. Only make changes that are necessary, and leave everything else as-is. + - **Avoid trivial code sample changes:** Update code samples only when adding or modifying functionality. Do not reformat code samples, change variable names, or change code syntax unless you are specifically directed to make those updates. # 5. Output Present the followings in an easy to read format as the final output to the user. diff --git a/contributing/samples/adk_documentation/adk_docs_updater/main.py b/contributing/samples/adk_documentation/adk_docs_updater/main.py new file mode 100644 index 0000000000..32d75047ed --- /dev/null +++ b/contributing/samples/adk_documentation/adk_docs_updater/main.py @@ -0,0 +1,105 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import asyncio +import logging +import time + +from adk_documentation.adk_docs_updater import agent +from adk_documentation.settings import CODE_OWNER +from adk_documentation.settings import CODE_REPO +from adk_documentation.settings import DOC_OWNER +from adk_documentation.settings import DOC_REPO +from adk_documentation.tools import get_issue +from adk_documentation.utils import call_agent_async +from google.adk.cli.utils import logs +from google.adk.runners import InMemoryRunner + +APP_NAME = "adk_docs_updater" +USER_ID = "adk_docs_updater_user" + +logs.setup_adk_logger(level=logging.DEBUG) + + +def process_arguments(): + """Parses command-line arguments.""" + parser = argparse.ArgumentParser( + description="A script that creates pull requests to update ADK docs.", + epilog=( + "Example usage: \n" + "\tpython -m adk_docs_updater.main --issue_number 123\n" + ), + formatter_class=argparse.RawTextHelpFormatter, + ) + + group = parser.add_mutually_exclusive_group(required=True) + + group.add_argument( + "--issue_number", + type=int, + metavar="NUM", + help="Answer a specific issue number.", + ) + + return parser.parse_args() + + +async def main(): + args = process_arguments() + if not args.issue_number: + print("Please specify an issue number using --issue_number flag") + return + issue_number = args.issue_number + + get_issue_response = get_issue(DOC_OWNER, DOC_REPO, issue_number) + if get_issue_response["status"] != "success": + print(f"Failed to get issue {issue_number}: {get_issue_response}\n") + return + issue = get_issue_response["issue"] + + runner = InMemoryRunner( + agent=agent.root_agent, + app_name=APP_NAME, + ) + session = await runner.session_service.create_session( + app_name=APP_NAME, + user_id=USER_ID, + ) + + response = await call_agent_async( + runner, + USER_ID, + session.id, + f"Please update the ADK docs according to the following issue:\n{issue}", + ) + print(f"<<<< Agent Final Output: {response}\n") + + +if __name__ == "__main__": + start_time = time.time() + print( + f"Start creating pull requests to update {DOC_OWNER}/{DOC_REPO} docs" + f" according the {CODE_OWNER}/{CODE_REPO} at" + f" {time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(start_time))}" + ) + print("-" * 80) + asyncio.run(main()) + print("-" * 80) + end_time = time.time() + print( + "Updating finished at" + f" {time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(end_time))}", + ) + print("Total script execution time:", f"{end_time - start_time:.2f} seconds") diff --git a/contributing/samples/adk_documentation/adk_release_analyzer/agent.py b/contributing/samples/adk_documentation/adk_release_analyzer/agent.py index 9d4ad049b7..6a25642198 100644 --- a/contributing/samples/adk_documentation/adk_release_analyzer/agent.py +++ b/contributing/samples/adk_documentation/adk_release_analyzer/agent.py @@ -100,13 +100,13 @@ Explanation of why this change is necessary. **Reference**: - Reference to the code change (e.g. https://github.com/google/adk-python/commit/b3b70035c432670a5f0b5cdd1e9467f43b80495c). Reference to the code file (e.g. src/google/adk/tools/spanner/metadata_tool.py). ``` - When referncing doc file, use the full relative path of the doc file in the ADK Docs repository (e.g. docs/sessions/memory.md). 9. Create or recommend to create a Github issue in the Github Repository {DOC_REPO} with the instructions using the `create_issue` tool. - The title of the issue should be "Found docs updates needed from ADK python release to ", where start_tag and end_tag are the release tags. - The body of the issue should be the instructions about how to update the ADK docs. + - Include the compare link between the two ADK releases in the issue body, e.g. https://github.com/google/adk-python/compare/v1.14.0...v1.14.1. - **{APPROVAL_INSTRUCTION}** # 4. Guidelines & Rules diff --git a/contributing/samples/adk_issue_formatting_agent/agent.py b/contributing/samples/adk_issue_formatting_agent/agent.py index 78add9b83b..d2f040ed56 100644 --- a/contributing/samples/adk_issue_formatting_agent/agent.py +++ b/contributing/samples/adk_issue_formatting_agent/agent.py @@ -45,7 +45,7 @@ def list_open_issues(issue_count: int) -> dict[str, Any]: - """List most recent `issue_count` numer of open issues in the repo. + """List most recent `issue_count` number of open issues in the repo. Args: issue_count: number of issues to return @@ -75,7 +75,7 @@ def get_issue(issue_number: int) -> dict[str, Any]: """Get the details of the specified issue number. Args: - issue_number: issue number of the Github issue. + issue_number: issue number of the GitHub issue. Returns: The status of this request, with the issue details when successful. @@ -92,7 +92,7 @@ def add_comment_to_issue(issue_number: int, comment: str) -> dict[str, any]: """Add the specified comment to the given issue number. Args: - issue_number: issue number of the Github issue + issue_number: issue number of the GitHub issue comment: comment to add Returns: @@ -116,7 +116,7 @@ def list_comments_on_issue(issue_number: int) -> dict[str, any]: """List all comments on the given issue number. Args: - issue_number: issue number of the Github issue + issue_number: issue number of the GitHub issue Returns: The the status of this request, with the list of comments when successful. diff --git a/contributing/samples/adk_knowledge_agent/README.md b/contributing/samples/adk_knowledge_agent/README.md new file mode 100644 index 0000000000..cf0c89016e --- /dev/null +++ b/contributing/samples/adk_knowledge_agent/README.md @@ -0,0 +1,25 @@ +# Agent Knowledge Agent + +An intelligent assistant for performing Vertex AI Search to find ADK knowledge +and documentation. + +## Deployment + +This agent is deployed to Google Could Run as an A2A agent, which is used by +the parent ADK Agent Builder Assistant. + +Here are the steps to deploy the agent: + +1. Set environment variables + +```bash +export GOOGLE_CLOUD_PROJECT=your-project-id +export GOOGLE_CLOUD_LOCATION=us-central1 # Or your preferred location +export GOOGLE_GENAI_USE_VERTEXAI=True +``` + +2. Run the deployment command + +```bash +$ adk deploy cloud_run --project=your-project-id --region=us-central1 --service_name=adk-agent-builder-knowledge-service --with_ui --a2a ./adk_knowledge_agent +``` \ No newline at end of file diff --git a/contributing/samples/adk_knowledge_agent/__init__.py b/contributing/samples/adk_knowledge_agent/__init__.py new file mode 100644 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/adk_knowledge_agent/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/adk_knowledge_agent/agent.json b/contributing/samples/adk_knowledge_agent/agent.json new file mode 100644 index 0000000000..f58374072a --- /dev/null +++ b/contributing/samples/adk_knowledge_agent/agent.json @@ -0,0 +1,17 @@ +{ + "capabilities": {}, + "defaultInputModes": ["text/plain"], + "defaultOutputModes": ["application/json"], + "description": "Agent for performing Vertex AI Search to find ADK knowledge and documentation", + "name": "adk_knowledge_agent", + "skills": [ + { + "id": "adk_knowledge_search", + "name": "ADK Knowledge Search", + "description": "Searches for ADK examples and documentation using the Vertex AI Search tool", + "tags": ["search", "documentation", "knowledge base", "Vertex AI", "ADK"] + } + ], + "url": "https://adk-agent-builder-knowledge-service-654646711756.us-central1.run.app/a2a/adk_knowledge_agent", + "version": "1.0.0" +} \ No newline at end of file diff --git a/contributing/samples/adk_knowledge_agent/agent.py b/contributing/samples/adk_knowledge_agent/agent.py new file mode 100644 index 0000000000..90eb5e6691 --- /dev/null +++ b/contributing/samples/adk_knowledge_agent/agent.py @@ -0,0 +1,74 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import json +from typing import Optional + +from google.adk.agents import LlmAgent +from google.adk.agents.callback_context import CallbackContext +from google.adk.models import LlmResponse +from google.adk.tools.vertex_ai_search_tool import VertexAiSearchTool +from google.genai import types + +VERTEXAI_DATASTORE_ID = "projects/adk-agent-builder-assistant/locations/global/collections/default_collection/dataStores/adk-agent-builder-sample-datastore_1758230446136" + + +def citation_retrieval_after_model_callback( + callback_context: CallbackContext, + llm_response: LlmResponse, +) -> Optional[LlmResponse]: + """Callback function to retrieve citations after model response is generated.""" + grounding_metadata = llm_response.grounding_metadata + if not grounding_metadata: + return None + + content = llm_response.content + if not llm_response.content: + return None + + parts = content.parts + if not parts: + return None + + # Add citations to the response as JSON objects. + parts.append(types.Part(text="References:\n")) + for grounding_chunk in grounding_metadata.grounding_chunks: + retrieved_context = grounding_chunk.retrieved_context + if not retrieved_context: + continue + + citation = { + "title": retrieved_context.title, + "uri": retrieved_context.uri, + "snippet": retrieved_context.text, + } + parts.append(types.Part(text=json.dumps(citation))) + + return LlmResponse(content=types.Content(parts=parts)) + + +root_agent = LlmAgent( + name="adk_knowledge_agent", + description=( + "Agent for performing Vertex AI Search to find ADK knowledge and" + " documentation" + ), + instruction="""You are a specialized search agent for an ADK knowledge base. + + You can use the VertexAiSearchTool to search for ADK examples and documentation in the document store. + """, + model="gemini-2.5-flash", + tools=[VertexAiSearchTool(data_store_id=VERTEXAI_DATASTORE_ID)], + after_model_callback=citation_retrieval_after_model_callback, +) diff --git a/contributing/samples/adk_knowledge_agent/requirements.txt b/contributing/samples/adk_knowledge_agent/requirements.txt new file mode 100644 index 0000000000..7065c19760 --- /dev/null +++ b/contributing/samples/adk_knowledge_agent/requirements.txt @@ -0,0 +1 @@ +google-adk[a2a]==1.15.1 \ No newline at end of file diff --git a/contributing/samples/adk_pr_agent/agent.py b/contributing/samples/adk_pr_agent/agent.py index 8c398e7edd..7d6088ac45 100644 --- a/contributing/samples/adk_pr_agent/agent.py +++ b/contributing/samples/adk_pr_agent/agent.py @@ -125,7 +125,7 @@ def get_github_pr_info_http(pr_number: int) -> str | None: system_prompt = """ You are a helpful assistant to generate reasonable descriptions for pull requests for software engineers. -The descritions should not be too short (e.g.: less than 3 words), or too long (e.g.: more than 30 words). +The descriptions should not be too short (e.g.: less than 3 words), or too long (e.g.: more than 30 words). The generated description should start with `chore`, `docs`, `feat`, `fix`, `test`, or `refactor`. `feat` stands for a new feature. diff --git a/contributing/samples/adk_pr_triaging_agent/agent.py b/contributing/samples/adk_pr_triaging_agent/agent.py index 11664d47f7..90f6b7cdc1 100644 --- a/contributing/samples/adk_pr_triaging_agent/agent.py +++ b/contributing/samples/adk_pr_triaging_agent/agent.py @@ -15,7 +15,6 @@ from pathlib import Path from typing import Any -from adk_pr_triaging_agent.settings import BOT_LABEL from adk_pr_triaging_agent.settings import GITHUB_BASE_URL from adk_pr_triaging_agent.settings import IS_INTERACTIVE from adk_pr_triaging_agent.settings import OWNER @@ -28,18 +27,18 @@ from google.adk import Agent import requests -LABEL_TO_OWNER = { - "documentation": "polong-lin", - "services": "DeanChensj", - "tools": "seanzhou1023", - "mcp": "seanzhou1023", - "eval": "ankursharmas", - "live": "hangfei", - "models": "genquan9", - "tracing": "Jacksunwei", - "core": "Jacksunwei", - "web": "wyf7107", -} +ALLOWED_LABELS = [ + "documentation", + "services", + "tools", + "mcp", + "eval", + "live", + "models", + "tracing", + "core", + "web", +] CONTRIBUTING_MD = read_file( Path(__file__).resolve().parents[3] / "CONTRIBUTING.md" @@ -59,7 +58,7 @@ def get_pull_request_details(pr_number: int) -> str: """Get the details of the specified pull request. Args: - pr_number: number of the Github pull request. + pr_number: number of the GitHub pull request. Returns: The status of this request, with the details when successful. @@ -70,8 +69,10 @@ def get_pull_request_details(pr_number: int) -> str: repository(owner: $owner, name: $repo) { pullRequest(number: $prNumber) { id + number title body + state author { login } @@ -157,59 +158,38 @@ def get_pull_request_details(pr_number: int) -> str: return error_response(str(e)) -def add_label_and_reviewer_to_pr(pr_number: int, label: str) -> dict[str, Any]: - """Adds a specified label and requests a review from a mapped reviewer on a PR. +def add_label_to_pr(pr_number: int, label: str) -> dict[str, Any]: + """Adds a specified label on a pull request. Args: - pr_number: the number of the Github pull request + pr_number: the number of the GitHub pull request label: the label to add Returns: - The the status of this request, with the applied label and assigned - reviewer when successful. + The the status of this request, with the applied label and response when + successful. """ - print(f"Attempting to add label '{label}' and a reviewer to PR #{pr_number}") - if label not in LABEL_TO_OWNER: + print(f"Attempting to add label '{label}' to PR #{pr_number}") + if label not in ALLOWED_LABELS: return error_response( f"Error: Label '{label}' is not an allowed label. Will not apply." ) - # Pull Request is a special issue in Github, so we can use issue url for PR. + # Pull Request is a special issue in GitHub, so we can use issue url for PR. label_url = ( f"{GITHUB_BASE_URL}/repos/{OWNER}/{REPO}/issues/{pr_number}/labels" ) - label_payload = [label, BOT_LABEL] + label_payload = [label] try: response = post_request(label_url, label_payload) except requests.exceptions.RequestException as e: return error_response(f"Error: {e}") - owner = LABEL_TO_OWNER.get(label, None) - if not owner: - return { - "status": "warning", - "message": ( - f"{response}\n\nLabel '{label}' does not have an owner. Will not" - " assign." - ), - "applied_label": label, - } - reviewer_url = f"{GITHUB_BASE_URL}/repos/{OWNER}/{REPO}/pulls/{pr_number}/requested_reviewers" - reviewer_payload = {"reviewers": [owner]} - try: - post_request(reviewer_url, reviewer_payload) - except requests.exceptions.RequestException as e: - return { - "status": "warning", - "message": f"Reviewer not assigned: {e}", - "applied_label": label, - } - return { "status": "success", "applied_label": label, - "assigned_reviewer": owner, + "response": response, } @@ -217,7 +197,7 @@ def add_comment_to_pr(pr_number: int, comment: str) -> dict[str, Any]: """Add the specified comment to the given PR number. Args: - pr_number: the number of the Github pull request + pr_number: the number of the GitHub pull request comment: the comment to add Returns: @@ -225,7 +205,7 @@ def add_comment_to_pr(pr_number: int, comment: str) -> dict[str, Any]: """ print(f"Attempting to add comment '{comment}' to issue #{pr_number}") - # Pull Request is a special issue in Github, so we can use issue url for PR. + # Pull Request is a special issue in GitHub, so we can use issue url for PR. url = f"{GITHUB_BASE_URL}/repos/{OWNER}/{REPO}/issues/{pr_number}/comments" payload = {"body": comment} @@ -245,13 +225,12 @@ def add_comment_to_pr(pr_number: int, comment: str) -> dict[str, Any]: description="Triage ADK pull requests.", instruction=f""" # 1. Identity - You are a Pull Request (PR) triaging bot for the Github {REPO} repo with the owner {OWNER}. + You are a Pull Request (PR) triaging bot for the GitHub {REPO} repo with the owner {OWNER}. # 2. Responsibilities Your core responsibility includes: - Get the pull request details. - Add a label to the pull request. - - Assign a reviewer to the pull request. - Check if the pull request is following the contribution guidelines. - Add a comment to the pull request if it's not following the guidelines. @@ -263,7 +242,7 @@ def add_comment_to_pr(pr_number: int, comment: str) -> dict[str, Any]: - If it's about session, memory, artifacts services, label it with "services" - If it's about UI/web, label it with "web" - If it's related to tools, label it with "tools" - - If it's about agent evalaution, then label it with "eval". + - If it's about agent evaluation, then label it with "eval". - If it's about streaming/live, label it with "live". - If it's about model support(non-Gemini, like Litellm, Ollama, OpenAI models), label it with "models". - If it's about tracing, label it with "tracing". @@ -299,7 +278,10 @@ def add_comment_to_pr(pr_number: int, comment: str) -> dict[str, Any]: # 4. Steps When you are given a PR, here are the steps you should take: - Call the `get_pull_request_details` tool to get the details of the PR. - - Skip the PR (i.e. do not label or comment) if the PR is closed or is labeled with "{BOT_LABEL}" or "google-contributior". + - Skip the PR (i.e. do not label or comment) if any of the following is true: + - the PR is closed + - the PR is labeled with "google-contributor" + - the PR is already labelled with the above labels (e.g. "documentation", "services", "tools", etc.). - Check if the PR is following the contribution guidelines. - If it's not following the guidelines, recommend or add a comment to the PR that points to the contribution guidelines (https://github.com/google/adk-python/blob/main/CONTRIBUTING.md). - If it's following the guidelines, recommend or add a label to the PR. @@ -308,12 +290,11 @@ def add_comment_to_pr(pr_number: int, comment: str) -> dict[str, Any]: Present the followings in an easy to read format highlighting PR number and your label. - The PR summary in a few sentence - The label you recommended or added with the justification - - The owner of the label if you assigned a reviewer to the PR - The comment you recommended or added to the PR with the justification """, tools=[ get_pull_request_details, - add_label_and_reviewer_to_pr, + add_label_to_pr, add_comment_to_pr, ], ) diff --git a/contributing/samples/adk_pr_triaging_agent/main.py b/contributing/samples/adk_pr_triaging_agent/main.py index da67fa1647..ad5893d855 100644 --- a/contributing/samples/adk_pr_triaging_agent/main.py +++ b/contributing/samples/adk_pr_triaging_agent/main.py @@ -13,6 +13,7 @@ # limitations under the License. import asyncio +import logging import time from adk_pr_triaging_agent import agent @@ -21,11 +22,14 @@ from adk_pr_triaging_agent.settings import REPO from adk_pr_triaging_agent.utils import call_agent_async from adk_pr_triaging_agent.utils import parse_number_string +from google.adk.cli.utils import logs from google.adk.runners import InMemoryRunner APP_NAME = "adk_pr_triaging_app" USER_ID = "adk_pr_triaging_user" +logs.setup_adk_logger(level=logging.DEBUG) + async def main(): runner = InMemoryRunner( diff --git a/contributing/samples/adk_pr_triaging_agent/settings.py b/contributing/samples/adk_pr_triaging_agent/settings.py index 1b2bb518c4..ca1d7ff2b7 100644 --- a/contributing/samples/adk_pr_triaging_agent/settings.py +++ b/contributing/samples/adk_pr_triaging_agent/settings.py @@ -27,7 +27,6 @@ OWNER = os.getenv("OWNER", "google") REPO = os.getenv("REPO", "adk-python") -BOT_LABEL = os.getenv("BOT_LABEL", "bot triaged") PULL_REQUEST_NUMBER = os.getenv("PULL_REQUEST_NUMBER") IS_INTERACTIVE = os.environ.get("INTERACTIVE", "1").lower() in ["true", "1"] diff --git a/contributing/samples/adk_triaging_agent/agent.py b/contributing/samples/adk_triaging_agent/agent.py index 6bf1660ca5..283e1bd098 100644 --- a/contributing/samples/adk_triaging_agent/agent.py +++ b/contributing/samples/adk_triaging_agent/agent.py @@ -14,7 +14,6 @@ from typing import Any -from adk_triaging_agent.settings import BOT_LABEL from adk_triaging_agent.settings import GITHUB_BASE_URL from adk_triaging_agent.settings import IS_INTERACTIVE from adk_triaging_agent.settings import OWNER @@ -36,11 +35,39 @@ "eval": "ankursharmas", "live": "hangfei", "models": "genquan9", - "tracing": "Jacksunwei", + "tracing": "jawoszek", "core": "Jacksunwei", "web": "wyf7107", + "a2a": "seanzhou1023", } +LABEL_GUIDELINES = """ + Label rubric and disambiguation rules: + - "documentation": Tutorials, README content, reference docs, or samples. + - "services": Session and memory services, persistence layers, or storage + integrations. + - "web": ADK web UI, FastAPI server, dashboards, or browser-based flows. + - "question": Usage questions without a reproducible problem. + - "tools": Built-in tools (e.g., SQL utils, code execution) or tool APIs. + - "mcp": Model Context Protocol features. Apply both "mcp" and "tools". + - "eval": Evaluation framework, test harnesses, scoring, or datasets. + - "live": Streaming, bidi, audio, or Gemini Live configuration. + - "models": Non-Gemini model adapters (LiteLLM, Ollama, OpenAI, etc.). + - "tracing": Telemetry, observability, structured logs, or spans. + - "core": Core ADK runtime (Agent definitions, Runner, planners, + thinking config, CLI commands, GlobalInstructionPlugin, CPU usage, or + general orchestration). Default to "core" when the topic is about ADK + behavior and no other label is a better fit. + - "agent engine": Vertex AI Agent Engine deployment or sandbox topics + only (e.g., `.agent_engine_config.json`, `ae_ignore`, Agent Engine + sandbox, `agent_engine_id`). If the issue does not explicitly mention + Agent Engine concepts, do not use this label—choose "core" instead. + - "a2a": Agent-to-agent workflows, coordination logic, or A2A protocol. + + When unsure between labels, prefer the most specific match. If a label + cannot be assigned confidently, do not call the labeling tool. +""" + APPROVAL_INSTRUCTION = ( "Do not ask for user approval for labeling! If you can't find appropriate" " labels for the issue, do not label it." @@ -50,7 +77,7 @@ def list_unlabeled_issues(issue_count: int) -> dict[str, Any]: - """List most recent `issue_count` numer of unlabeled issues in the repo. + """List most recent `issue_count` number of unlabeled issues in the repo. Args: issue_count: number of issues to return @@ -87,7 +114,7 @@ def add_label_and_owner_to_issue( """Add the specified label and owner to the given issue number. Args: - issue_number: issue number of the Github issue. + issue_number: issue number of the GitHub issue. label: label to assign Returns: @@ -103,7 +130,7 @@ def add_label_and_owner_to_issue( label_url = ( f"{GITHUB_BASE_URL}/repos/{OWNER}/{REPO}/issues/{issue_number}/labels" ) - label_payload = [label, BOT_LABEL] + label_payload = [label] try: response = post_request(label_url, label_payload) @@ -143,7 +170,7 @@ def change_issue_type(issue_number: int, issue_type: str) -> dict[str, Any]: """Change the issue type of the given issue number. Args: - issue_number: issue number of the Github issue, in string foramt. + issue_number: issue number of the GitHub issue, in string format. issue_type: issue type to assign Returns: @@ -168,22 +195,25 @@ def change_issue_type(issue_number: int, issue_type: str) -> dict[str, Any]: name="adk_triaging_assistant", description="Triage ADK issues.", instruction=f""" - You are a triaging bot for the Github {REPO} repo with the owner {OWNER}. You will help get issues, and recommend a label. + You are a triaging bot for the GitHub {REPO} repo with the owner {OWNER}. You will help get issues, and recommend a label. IMPORTANT: {APPROVAL_INSTRUCTION} + {LABEL_GUIDELINES} + Here are the rules for labeling: - If the user is asking about documentation-related questions, label it with "documentation". - - If it's about session, memory services, label it with "services" - - If it's about UI/web, label it with "web" - - If the user is asking about a question, label it with "question" - - If it's related to tools, label it with "tools" - - If it's about agent evalaution, then label it with "eval". + - If it's about session, memory services, label it with "services". + - If it's about UI/web, label it with "web". + - If the user is asking about a question, label it with "question". + - If it's related to tools, label it with "tools". + - If it's about agent evaluation, then label it with "eval". - If it's about streaming/live, label it with "live". - - If it's about model support(non-Gemini, like Litellm, Ollama, OpenAI models), label it with "models". + - If it's about model support (non-Gemini, like Litellm, Ollama, OpenAI models), label it with "models". - If it's about tracing, label it with "tracing". - - If it's agent orchestration, agent definition, label it with "core". - - If it's about agent engine, label it with "agent engine". - - If it's about Model Context Protocol (e.g. MCP tool, MCP toolset, MCP session management etc.), label it with "mcp". + - If it's agent orchestration, agent definition, Runner behavior, planners, or performance, label it with "core". + - Use "agent engine" only when the issue clearly references Vertex AI Agent Engine deployment artifacts (for example `.agent_engine_config.json`, `ae_ignore`, `agent_engine_id`, or Agent Engine sandbox errors). + - If it's about Model Context Protocol (e.g. MCP tool, MCP toolset, MCP session management etc.), label it with both "mcp" and "tools". + - If it's about A2A integrations or workflows, label it with "a2a". - If you can't find a appropriate labels for the issue, follow the previous instruction that starts with "IMPORTANT:". Call the `add_label_and_owner_to_issue` tool to label the issue, which will also assign the issue to the owner of the label. @@ -193,6 +223,14 @@ def change_issue_type(issue_number: int, issue_type: str) -> dict[str, Any]: - If the issue is a feature request, change the issue type to "Feature". - Otherwise, **do not change the issue type**. + Response quality requirements: + - Summarize the issue in your own words without leaving template + placeholders (never output text like "[fill in later]"). + - Justify the chosen label with a short explanation referencing the issue + details. + - Mention the assigned owner when a label maps to one. + - If no label is applied, clearly state why. + Present the followings in an easy to read format highlighting issue number and your label. - the issue summary in a few sentence - your label recommendation and justification diff --git a/contributing/samples/adk_triaging_agent/settings.py b/contributing/samples/adk_triaging_agent/settings.py index ae81d173ad..ea21f8c679 100644 --- a/contributing/samples/adk_triaging_agent/settings.py +++ b/contributing/samples/adk_triaging_agent/settings.py @@ -26,7 +26,6 @@ OWNER = os.getenv("OWNER", "google") REPO = os.getenv("REPO", "adk-python") -BOT_LABEL = os.getenv("BOT_LABEL", "bot triaged") EVENT_NAME = os.getenv("EVENT_NAME") ISSUE_NUMBER = os.getenv("ISSUE_NUMBER") ISSUE_TITLE = os.getenv("ISSUE_TITLE") diff --git a/contributing/samples/agent_engine_code_execution/README b/contributing/samples/agent_engine_code_execution/README new file mode 100644 index 0000000000..f593c5849f --- /dev/null +++ b/contributing/samples/agent_engine_code_execution/README @@ -0,0 +1,18 @@ +# OAuth Sample + +## Introduction + +This sample data science agent uses Agent Engine Code Execution Sandbox to execute LLM generated code. + + +## How to use + +* 1. Follow https://cloud.google.com/vertex-ai/generative-ai/docs/agent-engine/code-execution/overview to create a code execution sandbox environment. + +* 2. Replace the SANDBOX_RESOURCE_NAME with the one you just created. If you dont want to create a new sandbox environment directly, the Agent Engine Code Execution Sandbox will create one for you by default using the AGENT_ENGINE_RESOURCE_NAME you specified, however, please ensure to clean up sandboxes after use, otherwise, it will consume quotas. + + +## Sample prompt + +* Can you write a function that calculates the sum from 1 to 100. +* The dataset is given as below. Store,Date,Weekly_Sales,Holiday_Flag,Temperature,Fuel_Price,CPI,Unemployment Store 1,2023-06-01,1000,0,70,3.0,200,5 Store 2,2023-06-02,1200,1,80,3.5,210,6 Store 3,2023-06-03,1400,0,90,4.0,220,7 Store 4,2023-06-04,1600,1,70,4.5,230,8 Store 5,2023-06-05,1800,0,80,5.0,240,9 Store 6,2023-06-06,2000,1,90,5.5,250,10 Store 7,2023-06-07,2200,0,90,6.0,260,11 Plot a scatter plot showcasing the relationship between Weekly Sales and Temperature for each store, distinguishing stores with a Holiday Flag. \ No newline at end of file diff --git a/contributing/samples/agent_engine_code_execution/__init__.py b/contributing/samples/agent_engine_code_execution/__init__.py new file mode 100644 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/agent_engine_code_execution/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/agent_engine_code_execution/agent.py b/contributing/samples/agent_engine_code_execution/agent.py new file mode 100644 index 0000000000..c626067e26 --- /dev/null +++ b/contributing/samples/agent_engine_code_execution/agent.py @@ -0,0 +1,95 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Data science agent.""" + +from google.adk.agents.llm_agent import Agent +from google.adk.code_executors.agent_engine_sandbox_code_executor import AgentEngineSandboxCodeExecutor + + +def base_system_instruction(): + """Returns: data science agent system instruction.""" + + return """ + # Guidelines + + **Objective:** Assist the user in achieving their data analysis goals within the context of a Python Colab notebook, **with emphasis on avoiding assumptions and ensuring accuracy.** Reaching that goal can involve multiple steps. When you need to generate code, you **don't** need to solve the goal in one go. Only generate the next step at a time. + + **Code Execution:** All code snippets provided will be executed within the Colab environment. + + **Statefulness:** All code snippets are executed and the variables stays in the environment. You NEVER need to re-initialize variables. You NEVER need to reload files. You NEVER need to re-import libraries. + + **Output Visibility:** Always print the output of code execution to visualize results, especially for data exploration and analysis. For example: + - To look a the shape of a pandas.DataFrame do: + ```tool_code + print(df.shape) + ``` + The output will be presented to you as: + ```tool_outputs + (49, 7) + + ``` + - To display the result of a numerical computation: + ```tool_code + x = 10 ** 9 - 12 ** 5 + print(f'{{x=}}') + ``` + The output will be presented to you as: + ```tool_outputs + x=999751168 + + ``` + - You **never** generate ```tool_outputs yourself. + - You can then use this output to decide on next steps. + - Print just variables (e.g., `print(f'{{variable=}}')`. + + **No Assumptions:** **Crucially, avoid making assumptions about the nature of the data or column names.** Base findings solely on the data itself. Always use the information obtained from `explore_df` to guide your analysis. + + **Available files:** Only use the files that are available as specified in the list of available files. + + **Data in prompt:** Some queries contain the input data directly in the prompt. You have to parse that data into a pandas DataFrame. ALWAYS parse all the data. NEVER edit the data that are given to you. + + **Answerability:** Some queries may not be answerable with the available data. In those cases, inform the user why you cannot process their query and suggest what type of data would be needed to fulfill their request. + + """ + + +root_agent = Agent( + model="gemini-2.0-flash-001", + name="agent_engine_code_execution_agent", + instruction=base_system_instruction() + """ + + +You need to assist the user with their queries by looking at the data and the context in the conversation. +You final answer should summarize the code and code execution relevant to the user query. + +You should include all pieces of data to answer the user query, such as the table from code execution results. +If you cannot answer the question directly, you should follow the guidelines above to generate the next step. +If the question can be answered directly with writing any code, you should do that. +If you doesn't have enough data to answer the question, you should ask for clarification from the user. + +You should NEVER install any package on your own like `pip install ...`. +When plotting trends, you should make sure to sort and order the data by the x-axis. + + +""", + code_executor=AgentEngineSandboxCodeExecutor( + # Replace with your sandbox resource name if you already have one. + sandbox_resource_name="SANDBOX_RESOURCE_NAME", + # "projects/vertex-agent-loadtest/locations/us-central1/reasoningEngines/6842889780301135872/sandboxEnvironments/6545148628569161728", + # Replace with agent engine resource name used for creating sandbox if + # sandbox_resource_name is not set. + agent_engine_resource_name="AGENT_ENGINE_RESOURCE_NAME", + ), +) diff --git a/contributing/samples/application_integration_agent/README.md b/contributing/samples/application_integration_agent/README.md index a7106c09a8..0e0a70c17c 100644 --- a/contributing/samples/application_integration_agent/README.md +++ b/contributing/samples/application_integration_agent/README.md @@ -7,7 +7,7 @@ This sample demonstrates how to use the `ApplicationIntegrationToolset` within a ## Prerequisites 1. **Set up Integration Connection:** - * You need an existing [Integration connection](https://cloud.google.com/integration-connectors/docs/overview) configured to interact with your Jira instance. Follow the [documentation](https://google.github.io/adk-docs/tools/google-cloud-tools/#use-integration-connectors) to provision the Integration Connector in Google Cloud and then use this [documentation](https://cloud.google.com/integration-connectors/docs/connectors/jiracloud/configure) to create an JIRA connection. Note the `Connection Name`, `Project ID`, and `Location` of your connection. + * You need an existing [Integration connection](https://cloud.google.com/integration-connectors/docs/overview) configured to interact with your Jira instance. Follow the [documentation](https://google.github.io/adk-docs/tools/google-cloud-tools/#use-integration-connectors) to provision the Integration Connector in Google Cloud and then use this [documentation](https://cloud.google.com/integration-connectors/docs/connectors/jiracloud/configure) to create an Jira connection. Note the `Connection Name`, `Project ID`, and `Location` of your connection. * 2. **Configure Environment Variables:** diff --git a/contributing/samples/application_integration_agent/agent.py b/contributing/samples/application_integration_agent/agent.py index 9658641e3c..83e1143600 100644 --- a/contributing/samples/application_integration_agent/agent.py +++ b/contributing/samples/application_integration_agent/agent.py @@ -40,7 +40,7 @@ model="gemini-2.0-flash", name="Issue_Management_Agent", instruction=""" - You are an agent that helps manage issues in a JIRA instance. + You are an agent that helps manage issues in a Jira instance. Be accurate in your responses based on the tool response. You can perform any formatting in the response that is appropriate or if asked by the user. If there is an error in the tool response, understand the error and try and see if you can fix the error and then and execute the tool again. For example if a variable or parameter is missing, try and see if you can find it in the request or user query or default it and then execute the tool again or check for other tools that could give you the details. If there are any math operations like count or max, min in the user request, call the tool to get the data and perform the math operations and then return the result in the response. For example for maximum, fetch the list and then do the math operation. diff --git a/contributing/samples/authn-adk-all-in-one/README.md b/contributing/samples/authn-adk-all-in-one/README.md new file mode 100644 index 0000000000..fa5db4e772 --- /dev/null +++ b/contributing/samples/authn-adk-all-in-one/README.md @@ -0,0 +1,152 @@ +## ADK Authentication Demo (All in one - Agent, IDP and The app) + +This folder contains everything you need to run the ADK's `auth-code` + grant type authentication demo completely locally + +Here's the high level diagram. + +![alt](doc_images/adk-auth-all-in-one.svg) + +### Introduction +More often than not the agents use some kind of system identity + (especially for OpenAPI and MCP tools). + But obviously this is insecure in that multiple end users + are using the same identity with permissions to access ALL users' data on the + backend. + +ADK provides various [authentication mechanisms](https://google.github.io/adk-docs/tools/authentication/) to solve this. + +However to properly test it you need various components. +We provide everything that is needed so that you can test and run + ADK authentication demo locally. + +This folder comes with - + +1. An IDP +2. A hotel booking application backend +3. A hotel assistant ADK agent (accessing the application using OpenAPI Tools) + +### Details + +You can read about the Auth Code grant / flow type in detail [here](https://developer.okta.com/blog/2018/04/10/oauth-authorization-code-grant-type). But for the purpose of this demo, following steps take place + +1. The user asks the agent to find hotels in "New York". +2. Agent realizes (based on LLM response) that it needs to call a tool and that the tool needs authentication. +3. Agent redirects the user to the IDP's login page with callback / redirect URL back to ADK UI. +4. The user enters credentials (`john.doe` and `password123`) and accepts the consent. +5. The IDP sends the auth_code back to the redirect URL (from 3). +6. ADK then exchanges this auth_code for an access token. +7. ADK does the API call to get details on hotels and hands over that response to LLM, LLM formats the response. +8. ADK sends a response back to the User. + +### Setting up and running + +1. Clone this repository +2. Carry out following steps and create and activate the environment +```bash +# Go to the cloned directory +cd adk-python +# Navigate to the all in one authentication sample +cd contributing/samples/authn-adk-all-in-one/ + +python3 -m venv .venv + +. .venv/bin/activate + +pip install -r requirements.txt + +``` +3. Configure and Start the IDP. Our IDP needs a private key to sign the tokens and a JWKS with public key component to verify them. Steps are provided for that (please check the screenshots below) + +🪧 **NOTE:** +It is recommended that you execute the key pair creation and public + key extraction commands (1-3 and 5 below) on Google cloud shell. + +```bash +cd idp + +# Create .env file by copying the existing one. +cp sample.env .env +cp sample.jwks.json jwks.json + + +# Carry out following steps +# 1. Generate a key pair, When asked about passphrase please press enter (empty passphrase) +ssh-keygen -t rsa -b 2048 -m PEM -f private_key.pem + +# 2. Extract the public key +openssl rsa -in private_key.pem -pubout > pubkey.pub + +# 3. Generate the jwks.json content using https://jwkset.com/generate and this public key (choose key algorithm RS256 and Key use Signature) (Please check the screenshot) +# 4. Update the jwks.json with the key jwks key created in 3 (please check the screenshot) +# 5. Update the env file with the private key +cat private_key.pem | tr -d "\n" +# 6. Carefully copy output of the command above into the .env file to update the value of PRIVATE_KEY +# 7. save jwks.json and .env + +# Start the IDP +python app.py +``` +
+ +Screenshots +Generating JWKS - + +![alt](doc_images/jwksgen.png) + +Updated `jwks.json` (notice the key is added in the existing array) + +![alt](doc_images/jwks_updated.png) + +
+ +4. In a separate shell - Start the backend API (Hotel Booking Application) +```bash +# Go to the cloned directory +cd adk-python +# Navigate to the all in one authentication sample +cd contributing/samples/authn-adk-all-in-one/ + +# Activate Env for this shell +. .venv/bin/activate + +cd hotel_booker_app/ + +# Start the hotel booker application +python main.py + +``` + +5. In a separate shell - Start the ADK agent +```bash +# Go to the cloned directory +cd adk-python +# Navigate to the all in one authentication sample +cd contributing/samples/authn-adk-all-in-one/ + +# Activate Env for this shell +. .venv/bin/activate + +cd adk_agents/ + +cp sample.env .env + +# ⚠️ Make sure to update the API KEY (GOOGLE_API_KEY) in .env file + +# Run the agent +adk web + +``` +6. Access the agent on http://localhost:8000 + +🪧 **NOTE:** + +After first time authentication, +it might take some time for the agent to respond, +subsequent responses are significantly faster. + +### Conclusion + +You can exercise the ADK Authentication +without any external components using this demo. + diff --git a/contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/__init__.py b/contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/__init__.py new file mode 100644 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/agent.py b/contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/agent.py new file mode 100644 index 0000000000..db956ea454 --- /dev/null +++ b/contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/agent.py @@ -0,0 +1,65 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import os + +from google.adk.tools.openapi_tool.auth.auth_helpers import openid_url_to_scheme_credential +from google.adk.tools.openapi_tool.openapi_spec_parser.openapi_toolset import OpenAPIToolset + +credential_dict = { + "client_id": os.environ.get("OAUTH_CLIENT_ID"), + "client_secret": os.environ.get("OAUTH_CLIENT_SECRET"), +} +auth_scheme, auth_credential = openid_url_to_scheme_credential( + openid_url="http://localhost:5000/.well-known/openid-configuration", + credential_dict=credential_dict, + scopes=[], +) + + +# Open API spec +file_path = "./agent_openapi_tools/openapi.yaml" +file_content = None + +try: + with open(file_path, "r") as file: + file_content = file.read() +except FileNotFoundError: + # so that the execution does not continue when the file is not found. + raise FileNotFoundError(f"Error: The API Spec '{file_path}' was not found.") + + +# Example with a JSON string +openapi_spec_yaml = file_content # Your OpenAPI YAML string +openapi_toolset = OpenAPIToolset( + spec_str=openapi_spec_yaml, + spec_str_type="yaml", + auth_scheme=auth_scheme, + auth_credential=auth_credential, +) + +from google.adk.agents import LlmAgent + +root_agent = LlmAgent( + name="hotel_agent", + instruction=( + "Help user find and book hotels, fetch their bookings using the tools" + " provided." + ), + description="Hotel Booking Agent", + model=os.environ.get("GOOGLE_MODEL"), + tools=[openapi_toolset], # Pass the toolset + # ... other agent config ... +) diff --git a/contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/openapi.yaml b/contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/openapi.yaml new file mode 100644 index 0000000000..8adda49623 --- /dev/null +++ b/contributing/samples/authn-adk-all-in-one/adk_agents/agent_openapi_tools/openapi.yaml @@ -0,0 +1,229 @@ +openapi: 3.0.0 +info: + title: Hotel Booker API + description: A simple API for managing hotel bookings, with a custom client credentials authentication flow. + version: 1.0.0 +servers: + - url: http://127.0.0.1:8081 +paths: + /hotels: + get: + summary: Get available hotels + description: Retrieves a list of available hotels, optionally filtered by location. + security: + - BearerAuth: [] + parameters: + - in: query + name: location + schema: + type: string + description: The city to filter hotels by (e.g., 'New York'). + responses: + '200': + description: Successfully retrieved hotels. + content: + application/json: + schema: + type: object + properties: + error: + type: boolean + example: false + data: + type: array + items: + $ref: '#/components/schemas/Hotel' + message: + type: string + example: "Successfully retrieved hotels." + '401': + description: Unauthorized. Invalid or expired token. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + /book: + post: + summary: Book a room + description: Books a room in a specified hotel. + security: + - BearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/BookingRequest' + responses: + '200': + description: Booking successful. + content: + application/json: + schema: + type: object + properties: + error: + type: boolean + example: false + data: + type: object + properties: + booking_id: + type: string + example: "HB-1" + message: + type: string + example: "Booking successful!" + '400': + description: Bad request. Missing information or invalid booking details. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Unauthorized. Invalid or expired token. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + /booking_details: + get: + summary: Get booking details + description: Retrieves details for a specific booking by ID or guest name. + security: + - BearerAuth: [] + parameters: + - in: query + name: booking_id + schema: + type: string + description: The custom booking ID (e.g., 'HB-1'). + - in: query + name: guest_name + schema: + type: string + description: The name of the guest to search for (partial and case-insensitive). + responses: + '200': + description: Booking details retrieved successfully. + content: + application/json: + schema: + type: object + properties: + error: + type: boolean + example: false + data: + type: object + properties: + custom_booking_id: + type: string + example: "HB-1" + hotel_name: + type: string + example: "Grand Hyatt" + hotel_location: + type: string + example: "New York" + guest_name: + type: string + example: "John Doe" + check_in_date: + type: string + example: "2025-10-01" + check_out_date: + type: string + example: "2025-10-05" + num_rooms: + type: integer + example: 1 + total_price: + type: number + format: float + example: 1000.0 + message: + type: string + example: "Booking details retrieved successfully." + '400': + description: Bad request. Missing parameters. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Unauthorized. Invalid or expired token. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Booking not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' +components: + securitySchemes: + BearerAuth: + type: http + scheme: bearer + bearerFormat: CustomAuthToken + schemas: + ErrorResponse: + type: object + properties: + error: + type: boolean + example: true + data: + type: object + nullable: true + message: + type: string + example: "Invalid access token." + Hotel: + type: object + properties: + id: + type: integer + example: 1 + name: + type: string + example: "Grand Hyatt" + location: + type: string + example: "New York" + available_rooms: + type: integer + example: 10 + price_per_night: + type: number + format: float + example: 250.0 + BookingRequest: + type: object + properties: + hotel_id: + type: integer + example: 1 + guest_name: + type: string + example: "John Doe" + check_in_date: + type: string + format: date + example: "2025-10-01" + check_out_date: + type: string + format: date + example: "2025-10-05" + num_rooms: + type: integer + example: 1 + required: + - hotel_id + - guest_name + - check_in_date + - check_out_date + - num_rooms \ No newline at end of file diff --git a/contributing/samples/authn-adk-all-in-one/adk_agents/requirements.txt b/contributing/samples/authn-adk-all-in-one/adk_agents/requirements.txt new file mode 100644 index 0000000000..f490d72da0 --- /dev/null +++ b/contributing/samples/authn-adk-all-in-one/adk_agents/requirements.txt @@ -0,0 +1 @@ +google-adk==1.12 diff --git a/contributing/samples/authn-adk-all-in-one/adk_agents/sample.env b/contributing/samples/authn-adk-all-in-one/adk_agents/sample.env new file mode 100644 index 0000000000..e448864ea1 --- /dev/null +++ b/contributing/samples/authn-adk-all-in-one/adk_agents/sample.env @@ -0,0 +1,6 @@ +# General Agent Configuration +GOOGLE_GENAI_USE_VERTEXAI=False +GOOGLE_API_KEY=NOT_SET +GOOGLE_MODEL=gemini-2.5-flash +OAUTH_CLIENT_ID=abc123 +OAUTH_CLIENT_SECRET=secret123 \ No newline at end of file diff --git a/contributing/samples/authn-adk-all-in-one/doc_images/adk-auth-all-in-one.svg b/contributing/samples/authn-adk-all-in-one/doc_images/adk-auth-all-in-one.svg new file mode 100644 index 0000000000..37bfec651f --- /dev/null +++ b/contributing/samples/authn-adk-all-in-one/doc_images/adk-auth-all-in-one.svg @@ -0,0 +1,3 @@ + + +
IDP
IDP
Hotel Agent
Hotel Agent
Hotel Booker APP / API
Hotel Booker APP / A...
User
User
1
1
2
2
3
3
4
4
5
5
Text is not SVG - cannot display
\ No newline at end of file diff --git a/contributing/samples/authn-adk-all-in-one/doc_images/jwks_updated.png b/contributing/samples/authn-adk-all-in-one/doc_images/jwks_updated.png new file mode 100644 index 0000000000000000000000000000000000000000..cc376ea19cb0a4d057fa6b9ff33df58cd15e8a19 GIT binary patch literal 254940 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 Fe*nW(AB_M2 literal 0 HcmV?d00001 diff --git a/contributing/samples/authn-adk-all-in-one/doc_images/jwksgen.png b/contributing/samples/authn-adk-all-in-one/doc_images/jwksgen.png new file mode 100644 index 0000000000000000000000000000000000000000..b7f553e240d2e5a70d7acd4d4fe4235924efe653 GIT binary patch literal 764114 zcmeFZc{tSV|2OQqx=L}SMJQ_}(K1|>p$N$qvL*W#l3~UcL)NK~5Q!#BMS>_@ZLYc6)&IH#o+A^_giY$SqeJ%XTXQQ>=m^XSy+mr*lE_g z!RLLhH%#1FSPpwI|NQawp3nnu@vw)Av4_6PJr6JI`*tj9_wDSQ-C-^smIiylBa9Gr zWyRYMEa&L!zWfGt3;qj?vEg-&Dcb5A_@1i5{Vl%#xL)|jz5Py(S+rJBpW>4fuTK1Z zMKthO!#_Rio&1` z^G(ZhbDQOFp|YqW+Y5?Yj6VQnEG)F}AXM^nMMDpZ>(L;Edql$ryv#q$uUwmEN{S|p zSkDaaXMTK$%318c4eqZTE!sDNB{QG-@wz5G$_5WuNgR0-w}|<;aG*u#=XH+KMHlWL zi*W=lw&o47>Fi>DvBr#-yCY5t-ezGBkx$Z+@?f78m=z*58DTBS0B0<;-UMJ@MVt&WMlFGW5aehFt>c^>>x9W0p<2+8!;eK5LR?cEUfT!NM}FH+LYac(F5>xn7r(o^g-TU}1R$e;s$tJtBujl_>N2 zPs&Q~gft`+aWOysAS?TOVfpAn-68l~82N$UckEAqC+0kj1l`F{s$6A8d7w zY~X##4sW0Yxdvt#oXaV;iar;hRIvC<4Vg;<9=RXEf4kOf05#M}H|o65%5N)?9+~%k z&(CkK=^WfP`N5N)Ct2GkN##aO#BlZ8_LGk&A7B+C2iA6sSs;E8`12W-Z}CwL34*z4 zMVVd;Uq^2#L)@&}i*ahbO?kSLEWy-Ycl~(tIClh}>TYPzgElH0kCdIy>TL}YGI#%S zLCx3t+>RSRNC*Z)rVDuub!Ha ze;GL=xT=X&;c-DSQNuzVGM)Q`??1GF_iL;QnMJ2fz8@+yt!;=pET=f`mL*2zYQgu?6LIN8$(shL#cXoh$aa z3eJQYzUy%$>BXKP8y(5s(&N(#O+)v0X<1*z$Q;(5g~e;Y-P zqR-{cH5!Ll9ce#XV1s+?|4}1F-oGsGbvSq4wWg#Go%h*leb?n@-o+rSN7Tw}c(pEC z%JW|;y8x}Th+)h>vlJuT_4lYoT&#IzO0nhtiwqy<|7M>t@K@xO$)nUDE>7ph`qDP% z3Fz9OLQS&Y-XA*ri;^Un=?30&S(itHIDJIq)hAq!_|cT5E?6~>a_7A|om^B7GqJZ0 zhK9rnG&t%j_jd_GGs0Y+lpHgy4~ug$h*~lHG8X|Zytg8p58=z zH!O)5^kf|JxGej*ZqSIwq%&PE_gVlO5h_RWAzdU@w3I^wgm>@*HkHZ__fbnRyx*`- zbU?K5qt2P4%Qv@9)#5`ZyyT0dY0(tFuN_aHPLINC^*+uw#q6|qmSUztJ?26mnIS6_eXkmiM5EDE zaIZXlwP%}7rCKs<5|Uv)hKXtW7^4SJRci#eOZ7yYzK&ditD7BXv9$9ylf!3@mO^4;~+4;-LS$Y*;Of-G|*;DQm%JM41jgH$UH^ z*rqxDtBHLQ*BUjxq`Fyhs7G6tj5l+srOsmtYu5#!(t8j_B0S%{KD-33oUerJRS4{`E)@MI9P34WXByPgLY-7Drt_);`sb-7e2` z`*NXmy35L+(ziw)Vr;Z3JV`vz4Rj)BP=0%3eAK5iT@%u8?%rNx-RMC_8mzl5?Qp@< zqd@sGugfHDgN-T>gUf9>xfcxCZM1=}v8?q;3fP*d9KPQsw?6DnC0C|+bgMfaK_4tR z8P%B8v!wRy=-b)Th1l(_hkxv9FkFb%6n}l$ZOqVRX{@>8&eY+x%gP8FAA#GqjRta& zMdPMA)Q@knQUYqKtGye7_BmeN{2pWf<<+6T>N$0;zD4K0J|HA-F5uy*?ltTd;wkCL zP3UjA3XX7~sA9ZVU#IWU-NkS9goy#$D1&q|T&T(>Y6(UQG?NiYQZdc0x92!-5m|wB6JXT#(t~nwqVz zz6-Te$-d6D6nu=1{2&{=w{>Bwv<4g_KUZ~SUm~FgA%vp2oy)o4_`-GNgw0ezzoJUc zqx=?uXvvUIF`_(d!F+YT}ic^{}NI#6)j zz;_i>vt5xF3^c$&5i^^S(Ia&6?o+3dK+kt>h`X{i5r`zpQK2?o6@O(k*ezGEuP3fg zi~LDGP0Q!D5MOHrDFMimR?;TEVi9n4zvYSHZ-XzD+bTY7Wm}BdnJxNWt}s9tV9cb4 z?nVgg=fCXQ^z_iKJ%4wVAj4bBc1xcOhW^JMfqM*GA7_Vm&#bZv`4s_M(n^%FaIN2M zJ=@t~lz6$qae}v%T4;6=pT^;M6$EEVGG?KU%H%KwZ>A$Na|(H5e!J8J<4KN#n5jNH zdZL4Nah?XSVXBE!=Zy@~ zvDnyeYbL92YPn5<>1}8sy=Cq<Cox}#BH=n^_a&lWYcH+33?R!Vx8RIlNr?4nEv1$Jy@_j%62e6eW{M7TJrREgn%}WoI z+we95WzWqkf{WlDo`)A~yp+ofBJlZ-x$tlN*9J{1h-U_E_IueG1@Zf zWIWkEJ>6xn#EwiTANBE#l3RPlIG?C7I;r$oJjs%kD`QUuuUB@JynTwlCmaqx_?N8L z{BWH=2C}*^Vr8@p0*5TXGmQZjPhGBjioHa?9WNkaDn8 z;zHi>7MW8LCESu1=&awr$LQcovUSu*sk;U#l|<+r1B1Q=6oXo%2Bgv3-w!vDBa=e8 z%P``F0pE3G$&x6VYX^RZFL~%sy$}rT>+2KpU&Z0`&7_?OlE9Ly0w%1+0N-Z&(D9S0 zc3O@14)Zt}hsSn2H7z?2g+jfENF!P`)Df4N(*EX(dxgi68+1ARY+mSKA167j4cQLu zpBpGn|L!zWM<<~R4KZ7{ho5Q>p7sjis4KeHmun#NhP$kdx_}k>tKK0iDbwKGs|~UX z3cY!RE!bQ-mD|P*+jbDtJt&AX0@GGD~O^k0Xx?gKm^&f z#U%j^CoG{0>q=&Fmdg7rd%Q!}O4K42r8~7wfFu}1|di0(|lC~)IDsa+- zHj5+7kcER@U3kAD=)bDhZv8F`?ZgUAz;5@vRqP!-w(y8m@G_-Wzps_UZK;_Dt)~#R zPV`FgG^+HIFC3DFb)|w+>av2}?a9+52h7uU4Z2zcZ-#|(p;$ytqr=Dvr6(|SIovtn zp(pMx;zz>#%lOvF0Egz~-fN44Bucv^U$XBIj=H)GoXu5c$S3Pptytf&n(|;$4xqp3 z25}*vzt9SM^K?wx1aSH9-8-&iy?txlm8!Uuj>DTdS5M3X#|NUy*h0|O;K2Gd3-5{8 zQ6Kxf`FH8e7_y6m)YWsmgLVsf@HR?9@BYd((TqnczPPT=G6HX70L2duI0h>j7^nAJ z9{lTo0s~0n^Qy{=w?(vu??@&Emn(_TVv?dv0UETfHEI~Ll#t8 z8nrPRA|nyuA`v}XfYDAY%T;=I>{4b%h6*ODXQs4M-nTbfk6?jTqv|}yWjvUOHIl50 z3>dVFpD}j(bR*b4*;`c>K#i;f+J5QbRJYaiyCGfU;4!oF+(voEZX^Ed`;T3`+xNI&5a$c-jEMv-`P5J9S^)51GsX7hlTS$`WM z$a}%22>{3PJ`VroPolF;&>LD>T7{Oit5(shf)B2(XQUNP&Sa(FL*XX2q&iq@qFlrv z7KJKjs;~_H!=qhJg(HmZbw~ay_uowxzHo9qmxqhRA-fRJkKnO_@SG(kUL(BOVfq7w z0A9a_!s8gUmk_f`XX1PBQaRH$`5;-LJ^t^%>KU}|6Mf^lP`fU_@hwm(grgQ%!F=^p zGBfIl>!8!}O%2EME5GL2L8g~#W(!Jj0fL@dHF^M4np;?&3omXHC%ii+3K*<0 zv2F+Hh2w;s&)YL(wvc`>rRRw=Cdtm@li_OiS+00ETIOYu6P1PgVdZPXyH+y`J> z_)S@O;5bKzY{JQj*6$OTLE}R8InS)&a0rSVPKflfasz`z?L* zO$#vdG7z+0o6q~r$;5@_kv-76AD>$-i{fD&KN8PXb{VXd{y36GRpGtS?mn5qa;^j9EDDZhP|=)X<` zHO8B7bzv}=E-TUu8$d6yYYU*Dt#YFLecH#P6r58GR%k1oaItc;rPhpi%iNYudFtHz zm5voPcePNonQD|^em;-ogST;gR%Vn9fX8!y8~M5i*QSmJ8rhdy>=rF4N5QpqR*-P= zi>i$zH(>qEHcJwy&2RxDh-sGy0VE^+RwyT8bTHJE3o>oq3lmb|lomHGx)$N%jmBj+ zE{--Ln;Vc;?`|!%>mD}hJ_?x)5iwty8%A==JU5i6{vQ28SdGLzP(9G(Ts8W{y75U8 z@bneAoLKtW5b;Y|11|)27rCPJr0)uEll--h*=AKQU9mg`%1}w*Z8BwMjnxE@FEiby zlDr&Uhvek50|uZ@kfF#OlAIe-k`@}$BG<*q*?bz|Kt^%d+E30%b}wIFHg@~d4+hVRn!tAOo?HIJRidb3O&VOX-;wnp}yd4t;CBrSdmJh06K zpt)RlKT4mG4-H@w$&WZSp?pusbg@yPWvP89{`4TmYoRwszf*SMD)Jxw%$s^t00OX% zeYsr8as7EF=`ETPwYP;~K0YcYZc$rsgD9ygC#X!&786+l=+~2_)2|{+F6%+?3|X+R zOm+4@DoZsum*+heDw^lm^f!R25ldcIa}p~^#x+N31n^?0m4?`9+2pZWn@~u_Y$gQrmro7qvl%ltC41Bp&P&#m*^;O69r7q3rOnTTg6(1|~*xBjO_w2O&)>{dPkC z+__e4{I}oI=dZQC<*BU+3A{=7?u${3?8{GSik*eUoVJaMrZpvirA&8mvjqbnYlL2z zY)@1`)n(?diD<^bSg0X;P6=h&+f&F8%AFQPR|Jvs{ydX(=8Z}9OO zymGLK{*pTT;pmGF-KX{s8CbVhxs8{VTVVrCD{3QUNMaFd>FjVxAq#8x5u|1u&e*y= zLi+2`0<|ZeVtL-vZ$rd^T>@Q^40sO$sYg2b8tX0NbdL2A6xQ?hRDB@ptllMD`kvx# zQ$rM=vMn!U#G^-xunthxQAwEYNS*&IiL}}%ix~LF!Wh~07m!>E(6G`DnYQ^lPrY%F z;b+!*T*i%xzhAr#flUJ2O|GaJ-w{2F6ckE|R0BrKp@tvaK!NYggRxMbIRKYU%kCIJ znb}K8t}3E1~w`=%G^bt)#-Ks$Oekufc1R(eH3I=#apkK5K@i*>VriiEB|tv zW;UceDLY+~&}U>Nuu=G!)L%FPGJx>rF=)TJt=dwftW+MiM?D#xdGYl#Loy}~z&?41 zS+V9-xgiyF&3T#mB(JZ>Ty9CDqYfno7QAXv?uMfQX@)nPx?<*Gx* zWS;=1eIY-0DKpWz!~kG~biC3;gZ6Qp?_(b@CD4ri+Yr|{l`OJhdQr2_MSU_)l zNH^=v{jk#&ck2Ii@>#5B9bYLaeC$J8YVEst=fguH#%uP7c-6N*_h;iy2^#j=fB*P` zgaUxp(TZxAQ&_h}0*!@k!=VXKn?nwpNFEbdFK!hqHE1_a1VzKLsT9;UGv_GryaJMr zUi-DVL44NZfJ~2*d{T(6$6K>vK4mg*M;k+i9&r>EsYaFFYrmE5{0QoZu9-;~%KZUu zU_Ie-!1DvoNz}+sM&eB>NcMyRZ98l*ROSW91XTQ2h1kexv)@`_UL!HV&NujyU8G?Ma(NXw22nzUD?d|Q& zHn=+0v)kuigHo~s2QV=&EHx?C4c0ReZ&lC&{PyskUc3HC-}QMp>Rf5L4~VnVb~J#; zm}pv>=+Of&ti=-uHTIo?wWgAfr~fLa63XF)nE4uXL5)T_5tNmp}|201-~#b&O8n$yfG@(7xMlk{+hc7Q}A|4_mEWeou%|J6Uc47KKf*S*aE)l$=* zDu7WzoZ?Dq1}506Xoh?#q-UINfCNw;BO7oz!k_QudnbMQ7xGFw*vuFiK2+Y9pahho^L@2P2MgdTBY1>`t7lkJNRHX60PgcEh+Fv& znaS-r!#o%QVP5VSYuHx@AW)8eR&HWaq~L+kAg7y{y+9Y#0PGQ|?(m;E!jkG~>l7jX|PZD6W^Lk_j>+55^-5E11avz}>XQ0}8!m zD#X`CWDw!4)1qFztqS8){b3lV0Wy{C*>%5u&&Pyf@n7E9>pu< z{rwOGJ}Hw%xdQ3~PV7y%Xt@K&*!O=Mz9R}`beSHGJxO{E1MuIvL7h2t~ukmdo`QE zMg*k;UK88gKvNIpqzzz@j;%hRP*JWvzB=3AdHPphoN4eM0t6m6@D>wzH-r6P5wXso z?3o3i;o9qSsEtM;XHf7W*X<9mC*yuOsBD+Wv( za@)wr48vhBSAN`ZWz;Gxsq}zb@%>|3GvII|C3fL)Dv1a}nt@i|StBL}fmh0dYHRs` zcTV8`#CM*QVz)gU{Ffgr-l@G^=9m}AJ-5Ux?virRj&Qis-H~PrE?vghUOL<55cRMK z<+ktp82}7B?p~x&C~L%9q)fCmJ6??kvb~n^KtjRtLGxHkWL}gEOtF#F#p|@OIJ&j3 zoI@bT9-tGaO#n@KL3DwL&TMZT$eTfTc&(XUn6=Mx6XiHROc6vwNePezt$64>Et2MU#RjorJ|MVVOyoxXrV0XG<; zg=KN0sJ_qhW*XJX1pkTI&B6=^m@~7w2B6RyaC-8fg35$`hSb#=cMziBF*3$nk;sbL z0GWuKR(~EmY_p2ag@<|R3GGkY&8Le_3kGB+BqV$~qA)K+}9IoqN_H@G04utO^-h=MWW=_Pk5%Rg99U+0z^D z2>4oa$U4d&aC4yRtx{vG_yCS9_9cVz=F^(Y^fxX)MD zY^OH(GS_q)4KFsp-3PV7?IG0jP)ng!)v`C|o4ZPQqh#kV57nkWkVNO|*^^HiemF6D z?ef(*wjpSg3C3US1^4O$&?SP`3(^C25Sq#q%x9Erj4j$t;92&C&10A9PNiF@Yuy^y z*{*hNdRvqkQj*JC+~*`c^Bm&bIC|09GAbsq`|`QD!4`~KI| zmI51m#}X_Lwg2blAJ;uVxZ8O{D(4aW&d)4KsYN>`G{E%OUprfpV6I10EN|ygSY#A` zn^$7#+V_8+1h)ZpxHc$NxXwspX8>{m(>;JOTm}E((~lEkZ->+tO#;9mSI^#$TH*Vh z%*D2KcR!m5F8mGfaBnxp%VlUs_69}_ZOGW7Nl;txOJgULjmQVG9+0m`nYV*!io5JP zIru?hWSbq%gi-<)U77SX?{AM-d*1?cU31&f+hvXwx?T&04%K?^!$+Ub!;t{gYiLh4 z?ArkI6lOy51;0sw`0)`p{!5~?g!y_Ip}6SYi2u$lA36v9zm;keSkIVv^NZ z@bt!m^2f2bH?9r)fNLq{maqLykFb7JiM-I+do&)Ir003b#oU}y$S$z3KjO!z>wjbx z@On+(*qvEL0%I>=9XBDhaX6gW{g5M+Ku!f?L}<)TF)<$-v~%VU496CUgWjG-rcR2y zA)9`&&$r%@wFn;2nA_>WSOSV`&I2kO#!8OLG25AjLY&eqZ5BDxsTMb@IQ~Nf^PP4Q zX=2QTck86SbLOGOS~rDs&{Xl93u}FP6?wIYzlync-u^A#LBVRbK|PyIn7444fp0jD{8XI)lkF*K#)<-VMhiUZ(dx0G5B<5$_q{ipCH^E{0*b;K_S25B z=j)0lQ9jJYh-cSOSQ=wG=I568gR(FT`q?e|?hk+b)VUA!@b&m0B>{%+CU)0Jux-HL z5`*Xb5~|}DoocQ$rDloUM6vC^4`;a_|HJ2>pJ$~_f*H|iP{CgK2-NGSI0Y|3z~WAq zXGa-QrezqD-|jasXps;FEV5d> zJ1GwmgxOR$r9q2t1j;OL8Ce;Y|EJoXUt6{WP|DTlUwuJ&eCuBSVQGS+ki@1}P~(dY z9*Xm41_cZ#j}N3I?)$le+zBFe!AM}6pJz(C)>o9Xay60-wu*_`)Ad-e9Kl|}ukfeZ z(Vr`qjg#&j#tOEMjl>ZR8MCXSZH(zVVBq-NmV)Ic1=U|-iJbG8#abb0bPWRAfSLE@Z7VC;V(3(OZWa$W%8+%8T8?zRVM654iVOMU? z%%=dKI2}r0h$Q@y%H1qqAeAMmX7k9zc2@t=XBQe{12R8eBO)J`S;^o`V`y4$tTQ?C zRc1igHE6Sv!PMJ_jEyK%6m1H%oh8Vq%(8Rp9%rmDXbO&hW9V4Mb_!!#h&7h60eY&b zX-a@M?H(Hn_CJ;Hx$tEsbI6RktRD4(vka=jc8?&0K@pmd3aUU;HOEl2R+RTzh_YN* zewb6a^M@CYe(KifLd{lfKO5{jgOqfCM$K%T}IjlCxnIlaE>oW!8% zSlk2}C?~<#Uih`CV04%QD-uI9x-Gea+Frp%>uEMykN=~1%W`CZHm7+DE@gyV6qA&qwA%WbNhJE z!R}q0Vk$q4=*EGk+X@VU?UTLvx6W3S$Fix2h{X{^HnSAqOKr`II)U1nnr)!tRN+jl zAr8$9TJexOpDmqry}MCqf${n!a-RpQ=L*w;K|^`F$WBvJ6CDsJ9;XpTwUAN7D#rI7 zWn}sr+o%=zRhICHEUB?E&-|6>*<^W;F+$_4Wr4ZC&{~qL*TP`A{lZ!j2I1ZL^`6K!TKI&TDs$7?e>WAtc)Ael^sy|A zA|y3asN#r*qS+V<>4NsT?RvaH;R;g+Sy;a9<=Q@$O=a&Cy|tQR1o@Qj=mgar3p`SZH<{-0*rWY=0i+#-9e#5wWRjSL$i zjMQz}x5@{@oO-#peTa`ne!28iv$HDY&ylL) z+V{D6M;xK0$>dYlFzsd)bZ}_E9?u1*;@kwe_Iz0{OkwaCC;a0fZZ`NY=U9-d8f9p_ zLTu5>5038ZX}af%pC@7ADAW!^*qgVZnQ*K^3GtF(}SFm=iGN9=doGb`r)QGLyU(26WM*xcWr0GQ&K&~7r3I1n!_igfo zH1PiNAS%}Fdl<4M<5;;Xe$SBqW-hLOk!p%s{B8CJL*In}?ELfYz5jx|vwFr#Pyf~L z{{h#rfGNsvi=O;a&i`QAhZ;a%)BY97zgX~^2+%XVe;N62DwcXU7#bw@ua5sqmTo8@ z<;cIf`7d(J2I%<&8+hjDzW+j%+i8H5;Qzmp&uU~m{%`WYKl*=J2TbJutmNOdHShup z`)Qh8yZ*0I15W&ZW|Pmfr}oMU^S@Nu_;VxvecW6sRnB?XY2?aDWVn8~OT7dtmnnyb z!a~2yM&5JplAxpH{+^I`mjA5;oH z`OOo_l@?_RLrn>V%`;uY0nPc;%5|L9;7IUi$}#Kf0nNlw&%`wQ!uQb+M2yqTa0=8M zw{s!Ue76{5j-Y_|J!)FWPa5eer>R&x4dULwOQKL4!S6GbYKJU3gwWi$oiki-IOi8b zpun;$%+kzO&ADBkrK3h^ZTs~;YdTl^e~O725LBSQKg*G8XCd7Nh$ahhIO=ePCd(>Z zQ;9)F{3sDjTmR-_8jKW?s-i|O*ka8nh2x29(|i2tRhmOy2X)S8)_4-}+4U3(pP&Bf z9Fkz^+^azEog0t2k=IzieYd$W4(-@`MAXl@|2xN9ds$=Si=58gSp0EVF(IJ{f@{O4 zPen$XmBsf>H)XwfCUDgfZ@YWwE*Y;D+QjFCS(^He+7n||ZY23frJVUHgQnr9#DEgo z&mhEfGKru6DDiI~j&Wf|Lu2+Q`WJHa=ADVP()-Ev@ZY$81V0zkQPRU%?#V;%>2r0t z9#3Pd;X(DMVGjpOL;bv|BIxR+*@B$e?jV@O0UXTDcNp)i$%@ZM=O=}!i7)U-Z$42* zi!4P`GB~Z_%1(y+$7?qCZx0%No=v({DuCyn+q-?-TC>>@UM%l;v&7kLOg>DgiTm7) zeV6}HoigavFrN_rHs2Wsp>Y}l!5f$T_Nvg3kLwDW|APucG7@v-Q+sIhyDImMi+d9V zhI$9Je=0agcz+9S`)2&o^t;{BQ7&RBFz-(|(+#6wsgde$ybVs%_tJc`FeZE94l>-f zLFVm`xLnJq7hE+93b%8JE+s1HSy+FizVnppQtCz$VhVO4;hNa+VfpHiD(AF=0iVN1 zx-5I;OiAy;tM=nm1@x5&FJ#vYHLsqTy;JM%I6Ih z&z9}^ilMgf&M|vE`RF*BN;rp0r+h+m`|9z5I$RpI(Q|Edb1>GmZQE2uASukYT7IH= zaVB-@r;g!&)3NRt(1d1lBjmp{pHSAzvOHTu3cZzvZ)jfg?5yE%0-=8^$TXMo1}Z)(knBDKCw=y!ZlC&J!oMF%c(c zNKJfIlGatNp(~cSoS<;MaLDPZ{S(g4r_PN(q@z(-9%wVy2aNXiPQK1DQDHSIZH%v>YZ}!Q9lkJ)zH$S7erLT@F0f$ zUc~5Qu8>VTJ=^#E;j-~5Kj4-e6LI_xO7THhMEgM+%CLR*0&{v?;a5~RT5=bR%P^9Lj4BqXceXqNtXBT ze)3itBH+^#eJlnaB2iEjv%o2#+KEf!M)X#VUdt}kYN`T*`$aF#wRS(LxYIV-9pqIh zVPf1HZbBbRCd#P_!~?dMLTf6+XW!aO+n7|HNwecSaV65pHDnfn z=AKg<5E?-)l;H%2Yfcw=8U2GY9QyJ})@-ec%H_F|Hr03|#C83&pJ#u&bDU*Jk7yxg zBH?wVrL6DP%Z0fFK{jWEkir|m&y56wFo}D+%RL5)Z6%o2@!?R!Zze8RUDTp|>T3KV zo%|ub|K($d!poN0n$ZQ6g->IwdxyZrmP+8)WB2LrMTIP(UXukC*Sm&!%PMlM;5h>z zC$1(AUzUjt#Y@%=?QzTQ&1tc@FZnp0 z%1|xl2IJKSUVUl`3r-z4Z0<4tbgM@C65Z+;qr0Vor;> zR?mmr>grY6P0AYtW$va=gPd31mbH7%H(5B(I?t16U#sE#C#bvE)>DnV%uXDYBemVs z(mzd<^jxh;lemeqK%CnH?|)f>9502g@O8Yocz*yNpUl`!e#=>B+T)1aOS*>>$3;`G zzKTz#o{mWFr~#WSSN5nU0E zb{Ti34rG{Pr|!>Od7bb{I0WKmU~MhRmoZGl=YLYm>Ygukjb1viRL-u^uILs;y)3#u zVNzj2J~1SG%*nl9ba>v__9#lXT-hwG*>#XEt$~RzEW%6%r)FOfOHi`;W&?L^%(%3t zPrL25&ing|cfA4|Almmg7mFD-Vm=k#=X?Yrk5ROwG8nyI1gJElg0a>b0ejI5+e?V`}RXO8$;1bb3kV%q8o!z)ZVUTw7)$yTEwqA|Az zqs=QPJQIcM9yAb_oA6cCI@^Ycs`4I>%$^7?NYa{v==>oh8_&3EWpt{3p8!97xPNf< zmfhU6OMa26gA=KKry(3?+B&5dh(2ziR-P>?8 z*WruU`ld7?`@}e!pfabgL<^gpA>A0ZktOeOP@8qC4{zj=>Wx5T^DS)+7YfN zKA1k9dg32PUhmjlz0WFd$;yViu5MK#AmfT@SONmq?cAJ_4c!}mqR*!n` z^--1!39+p5S{>o$YiVzkQjV~eeAm%p)!4+XZ|TWdJZr1TKIMYAYel_pEderG{A{-S_sVb1eA`*NdJRM9U40u{xFd7PeO0 z`Qkou51n{_X18q$L&mM47$zOBy|G_rS497Odg++|VfD!T_?e^ zfAe>F?gGQFD`B6gaW)rV`#hb+Ev~{e#ECD}Ayw0F&aB+yN=yvI<5R048>^+=&-sj! zETGU7%VcyCeXgi8EZ;fHP{?6r$t50x=5AfmbflpC#jvPC*k3%AiRkWwSbn)Z`6A7+ z3QubpWZ5{jj9Z|uV^r+P*WS9oQ+}gL5Lskb>6q9ov7sfE^x%o}XFayCT1qnFOf`W; z&XnP5g28AnJsP&%h(Btk)uJ!}BTR1^&dyIAFVOMWji@E6R8$G1ZEz>rw|X{{=Oaz` zTKdf=A{f}$Kg`!VRkmcCog{VhzTfDC2Ih)N zy=%eBPipo<6Abu$yOzov$UGTxkohpoBmcR)A@^O>V}uLo$+*Ar4BYy^NNwtymZU=U zp>-#Kl_X9bNuaBnqG}y2u+Jfc(^&50B!%m}b17rHHZzwqzt@P&nXn~Hk{z>OUlx-a zkL0s&7SgosfjhBFIh}PH$o>@MUR2AjLKG+JN zNxD93@g0?_X)0JWs)U=~dUwu!wzO}>eWoSeazmrC<(`dM`X6NMg@QrPzrA#B8Wajq zmK3xqnhCO@Lvw=V;k5^cPxuX=4oB&ZY#7W9F}(nb+@9YsgIL}Y+A{%C-zHo!0k=Pp zYqmW_OUq9rf~orvI%W{ke8)v|u~#^8d1m5uoo0vJY?6SPhHoN~ucP2=19oMY)ON7! zHew%}Mq=UnMVIPxYxk3nty*~0v6klF?k%e27VyO z{Z&F**ekqmEbF^?At)@~=o^!GS<~zmPw4EbdzqV>;$f9x&(jmmjr@cI+xu( zuS%^a^AjN)zL>y)n{%pFLLv-dMCAvs6=@9y;z>a6{Fs<$EFw4HFJFsTiPX4s_K5>i z91{n4t$rZ)YX_M1ynl;m&y(o}y7TA#R(1E9dhOx)`&F{0guttWE6DfMgrn;Le((*c zQtI)i#|LUMJhZXi)pczvGp`qFEnzDQU8q&XnaH8cZE|u;EhaEyB~04~Tc1@Zm0Zrfda zaem8+IY^hqHBBd_LaQ8skpMcMFZ&1*zVB;*cV{2Zm(Hxr@A~>KH4mB>O0?)W`70RPJuFQl^z00(eyhB*g$&XT4IQ3m;P>#xpLris^<*2o$1nfhRIXBrM__6ShrHzGY)BWL znGQXUSM`rkhu+JLk2+?#vDMSPqT{?tB?~D?dbAJNOOppk>^uk?`I<8deueUh9SXjt zr{(1IFHJ13+|v>4Cxz+J=p_o~v8I6(tCz{%s~EV1>8pHi2`ky{ns6TZ2mP(=_b@sp zn`0~8U9<6)ahv}zTBF>vQ1=}gvy=*~+&i7xxI3KsM8anEhHnIXZA`Ir8`3%#GF-A6 zqoXk|7W{2R$8@3Q?NY(45yI5Uw6bD#n3Ip;L#KLKtk;)DxzM)4qtB6-1H}mbt#RE$ z65!YVVFsuxUJiB6B&+RSj|Fndd-~Qr3-wyse6{TaG!Xl7jb8P3tCYRNe6xQRTQ~cp zuP|bpU>TtQl_RyW zU&=^&e7?le#U-zHWwP1p>wDPRmj$E;^sH%DXSg<_gHQfrpZ4cI?dr+2jP;RfpS5Q~ zs~S{l61uQfm(w^=mfoh2R7{GTt>gDuq1vipq8{P?7JWA2Ii$6+P=y=~T9+EqL>r$a z@h6%+e%%x11^&aJx_gAw-e-z4pLFO>bZNMzOyQ#Fb%o^ogzp$7=hx*3J-4>?jDE`j z_bG~ySfii`)+Util%L#e2gw*xKkU#fTWIEu8+7N*&DyRG_$pWFx41lASU2*Gao!~0 zimah=Opfzs!@>Xu<7iDyZut2uU$MXGw^(pMI>6|@bld*Jk$3GEcz%XXFoLrq-3Fmk^wxd5 zGeQMo6W#91GX{Yj%NeI2GJ5NV6~3heuO59(&Bd-Rm(nbWjy0#PAu@a}e>HRvHy{q#4xcH$I%fHa-NW2|tJX6*gI*=&J@=uP?$1>3p9$U% zUE$q|K)KIJ^|xb1un2YdX}J?-wTp4*=({Y-=iXkSh5w7LH;-m> z-P?fAIo+MB+A3PA_CBquYGk(>s*2rqtKFK45+p>mri7?56+%n38%0Y|b4$e#5>p6~ zsJ5ti%0MKvW)o{64@=C`h#~ z4?@jW9&DXP;U`L_y_Vp}+qbZe^mXA4p=G^n_0l4~RsmRX5mpG1yN-b-g8b_!<_-~A zA@)GEjE1(3IZ?k{{+FhoY9&j10d4m8D;uBY0`U%-H4^GtyhCg%|sdE+_y1t;OOMjhj07;`IZ)L4cYw`#lUPxgHkx~;9* zHB>_m{DN?wMxC3q8CbOqP!en1w~P;2T5xKrz=wzxKzgS}0hgwoi(D z6^_Q?us3j6sVO*oV64ZJOF&G_otrFydPu@^^l;`i$PgWfeniW2lO1~HN7Hfl2de8o zwBBwTw;8k5wMvT}am-CZz$|99c>gB9coT^UhVF!n$&ONef38#s8jDkko6a#H{$fz| z0egptHLgKA7?SUa#488SmF`r2guTBMw3`)nubq`JaO(1GdivU{(vAtU1(+i#N% zihoPM8IUrch&_e|*bFF`#5SFKrF)K6MQ(h9KGTst$aNQ1zd}%%QjL{F3;V4b5thb~-ryRmSC%e0c z)!EK6@66fG(sDvwqLe>yHKbh(5ErHo7!nh#B+z4vr)kfv)} zkAttG#C1S7_dcwVZS-W6`42a7d=KA37!fj^YHbDfbQ-JqKHF;ajn(~)VWBD#W6(9y z{>32`Zb(OiH}APOHk|10r$alRhVEq1wrfN2WSzZH0dm6p!q7B>?Kz;KCI(v&cQz!8 z&PB5t`7eA8^$o&Z7M@R=ge~q_(?v^az6Y62NlsV!U?h|sMJTBKi_($CK4!Lz#!Fjo$n(Qp7yXBF#jVJNvD>{g)?6X-jWj=Sb~9NweEROdG4LtOo2|dCSnoal zk}?0I9sVH;F5N$S5#|`>FyOcXF$d5%iT=m}MhLAPmU`avMrq2!Ozo_X{xsflynCVc zS15Tx9G6yX`QiA*48*B>+8^ld(x;4h_zp&^(M6o1*xdze26o`n_69p#@v<^2?MnEE zBVknHT45)3myPyivNpKUQ><-SO5H3e*bGlrLQYN2wUFSB)v>SD;$W8{1KPHPRmj0= z;b(4WEu38bVf5pTpnxi7d|Hk^mE3H*YtW!KUlY5e3SC`$IO>i9e!ep4YQ)exE7(g} z$=V_YT))x}JstX}K2(#JR%e!bzmt*B!|d+)IGq!~`k1MO=jRv+T; z9$I_r-8DQ^f2mIUC9ax-TWijtH9;brUlVfDNEySgbApHTs)&u%%a$IE1~c<-5Mj

h`w>Wc1PUD;9sBrp(?$D>su=C@T`R3y<2CS$MMOrUhJx*;ixAi? z(tpug44w!~%dOCL&;lO(7ntb%Z(t%hjZ{EH0fclhCKc-HgQcBChdHs#dFI#_o}H2F zst}H8hW7=D0DKAi8dUJ5< zu>?tl*u~UGOF`S|nZ>?N^-X%_BZUL@g?o#Zxe>!fcefDM?8rd4kXrdHkYQ1{yTyJ6 z2IEWlmXC6;!?KfOS(z*@mXJb1E$$-_gtA6S3AKJID{d)w9fyQOEhwho__fI zq^MMaBuua?M4YQxXkh;Q{BGlC`xU?@lgdEEWj6jK;p@4!5%RL=d6|Dngg@cLACr6> zUnxYxslG7%$5d3tj3H5p4a5%gIFsKgLV&QrSA@P!mU_C(5K;&`AXug)yghT)ng?h$ z$jik%i(XfM$S88s5-}$UPyz@;gx0#v~W8=t0;oORD$MxZS?eMMmdJXdOn}4m2hr3&~Xne5$&Ha z3L(rm$??E>H{1E?U2adrXm55DK{@GQ1Xquz@VTL(?o-GK6i&rlcYhzlsCaG{)~Mdd?Ew2kAHL+eoexnQYV_&|7z>E z)G=kH?eI9Wg-zK;baLSJJ$U`S0efP0Jyk%}GB=&0t{Q!_QfJIK*d;T5hu3@sLDs6* zm(k@8Q%AEmH?x8_iBqnHq8i{a--{_&=A99XTMBLPEv}ieMixD629GMIr)-e6a(q&&0wdsY6u565TO=9e&V7*VPSpwKp`4BdUhOkdLfCCjMP4Q zHg0p>G_kl|9qE7Oh77=Z`|V@>!!VTN4En7LRvg3Sb4YgrVnyQcxog@7>&|xfJYt4! z$VyBk-~e0vQFlNaLJFGUh#YSQ2U0Q@5)X_gacMK^w1Kje2hkya@PHcz7q}iwo!zbW zf8Qr96UDTFkcMNnD08Ue%=J#D7*?SWyb$M%NL~D>GS80c|c#Ri2V0 zh>f3sCq9eQtSW4!p)!V&)ti}}WnfV; z7?4&3evVQI{@Wq>&sE&_KBi-w`r8{Jf*WvWD=xdg?&LAxADC&dePgHR-aiGT9lx|q z=j$(6a4+ZeWZ-L8+HyzcO}>PL*)0j{9;A!~^u zqC+Uc(LvMOp)Kgz!@L)PKm5%8T(A zuefY!IHskkMQrV1W76#6st@6_le_x?*w>Xb)&1?exXJr^Ix1>Uf4#6=ZIt;&mtY#3 zgpY4msZLMgF>B{YKjrAIqzUu7Mj#6IIz|c9;5x%H#uWxqQyD3k*syKo#%cX+YSlVt zRjE#MAdj2hSZeyaQoN?ZRO2^C(P_p2R!?v*@^PlU*;#ze!!;LNywaeX^m8g@X5E1*9 z>%jDxOd7*hn~Ov;xo_7Y-6=qFtIg@?ex-iNc3l|d49L4UHzr_Dwn5*UsQ7w(Q~!O! ziQo4YoSW+Jns=yx`A>*NMK@7hOCtBRnUz`B*LShEoKF^tVaroW7^SDji}r6eMl8zS z_qIW}24&grSfW{=j^Tty^g+Xpn=MEW{eBze18zf1M%~gZT>s}@F?^-R`+Fn2a)P*t zaIp}grpNX1zz&gL&x{0Z9HBt-#`Y$xkEd~rKy%pvd_>ZSbXFFh-KOhpK})rsr?d0v zz1GC&1P*Vgs1yO<_ZVH3?Q*86xU?BVaNn%CKar78$=|KaJc+Tc&2$=H$q@Uzorc=FaGQVSbG<5!Ha%!E`r11 zA9q_Le)jXjP@@9tqnquvjNowK^Lc{K6@-ew7yV6UQ&RYVU&K~cmQT1saVY&#LwkLW z@V#?x#Ka*g#y@ zJ4_I3qHT=HwPDpCCYAbke9b;NgP=o20`TvA9bbbccn}-QumO#YsSf$7m!g2=>EoL- z#eAP@DF)QR{w&oXg8(znu}w{#U6bP!jqs#zTWK-HDreMdi_|`%N`D5^ikVa1oy-q{ zph)o~o^AQfp+PmBT%`OQH!xSAb;hCU0K=d>7kNUa6|?qq-S)IS5_P<7s0n|>pczfK zcI4`i6+N)~fUxFmW})m0a~9-{kiU4rp+{~8KlmNVGQd#lo<1t)x_UP9V@+s+8SqJ( z*Ht*U{;+f#yb6t)CDyLuw|bvc1tbsF%tS-ZZ6<&o?ayIz6U*WySWETcYbb;{zqSuL z59GKwT%H-@;76iQ9C7=HeeoTA2{(mKxbeoy6|-GyOeOVWbv8O&0V$``9zss!;<#3&O{!L|{pmcYP({@ot7Tv{RD7br zY&;`qWL$V2&~DVZKpJd2Je@$0HE+{*c)`Dc%j3Jd#=sqyHzF#gNa!PPFjfRYWiU-2 z&>N%eCePly?j=a&D4nog7wmDc>JmR^5$w|qE43G$mv=d*7E{-G!}CNa__FyC7GIDY z_fHb8K&P3*_ht3LSgz!!?Qk7HFm=GjfMgIs`#BDe5Z{)Dks&9c=%s7pi!ZtlT_d@O z^^+77`2Gzln4&0UX@b2f`+N!y``JUTBbuJ0hHkn*N~W?UO16Jk^#J<4hamD*%%}8i ztOelsQ5gRPD&j)5(pMsFSFIswA`*k%?trx}{+*osR@?1Sf&qAjJ~lX&D=Q&ug-{wb zn{9qy5t$2>@ZoQ8pxi6RqML0W+70~XpQQghL=Y(P%=XW;Qk!*5Lkme;l5#zb5Io6`GdE8wfIjRj&T?7j!S z%9%^^^1Jq`u4B|_=?}1g`X3Q&+@Q&|tcIFTXu(g+>=kd9H`skWty4A;JNtb;Q11i% zojJ;T4CwT9bYd~Q-eT+8p9{`#Hio!Gm(THKxnpNL)!?}McjkrmYX)T!I9azCyT zJ+5DrnYNYQq^nqnuNA$e2<&1*Hk`iw{_&iM2XkTL?dNA@vuzZh)m z;zmO<{j06bR!L|UFJOIup|26JQh&ryZ}*LoJ{=EE4al*~gUy1SlMq*~nUengni`9R zUb0b~6P|n}UTxGZYPH(v^waNOj6ZC|Yd&PuksVa}A>WozKt;&uO>XKfIDU7NRFXIF zu;B73nXS=5dtA|or^33D6dFn&iUThJDc~s`0DY;vrsicXQ*M3g+$Yf8ozV$}*ozY_ zKuLcpOiB_&f{JhtR~;*Fs^y`jep%HXC(4G&lHh7?Y9J?EQ+CiW1a0zHXc@HVhnr4^ zAw~GZ{-f?&5hA*#F(iT?coZ1j`KuXHHGyW&C$B4@=$0O29mD2ZM-Rh^-bcWTDMAW4 zW{V~84@pKO4RH!Ldm%?xD?dBs`(E73=30VaFh&vrak-%SsD26<@T3;5uJjhSe5veB zJo)xG7|$6|iHeG%9VMa3)>Gx4Bf@H11UfHPA2n*^KhyYHrep&bloO4{6&rh^AqT<#xiZelg7hxA~+KZ^BnF7^+toTCrJB>;(#He_x>{ejjq#*#%~#NFeB-L zB}1ELGq5U;8;Mb4ADo=|OdTZN|Hkg=JcpHwh-LHtv2~UWZFTJu#@#9IP>Q>|ON$o@ z!L_(M6nB^6?pmBea4lBc-Cc`ofU}?T`TYsmN!GsC%r$e@LHHK|iLJM=#N(fsa~axt%u%3*xt55h$w zbjhw;`QGkUVwXj6b*)#Npn4qbHri~?9zTQJ>&|v-Fu}4dtF2xy(1LMMfSGRCykoOe z;5HI36l;{KHAJTDl0^n3Z7p*3^ZNLfm=4z3HKjLun%m#Xik2AK7%|g9(3@9dK9-b= zyxIsPENc2#USHRL6F7u#z2xV=2jI z`wyce>R=8{Z39>rWP(J%tn6t~r7~#q_ML#hmr{U}OA*IO-qzNPUohW7yoURS2WcM_ zETHfPcEK0xhHXB0_J&U1xfzn#xqapyi-xj>;_?JNk1Pu!)Myut>Kf^~{M7F*r%fHb z`T{SBd!2Am?}9*uotEA6me12P(DyDSG zz3Vc(rP&ekVHI~-*14VD{fX2*!`#u-cTec7Aen)zwxe;-C1MHbhaj#~KpW~yBpoxr zqFcYsXmr?UofK3g_y4@L+-MPto)wNp6o%4fZ!P$$f?K*=<8UA4EIH=(FAc`(Wbph) z@EFn&M%6NCJwOIo9jSB67}_yn(XQvcNv2Ea5_g8=7fEA>=D@9&hQgRJRAjA|!>#q3 z(meVZohk8xHCKn*Dxa$7tJXt=8t$dPT?_M0gyX+024#9Il%H#?e>UY zW8zi99fJD=soBEw2;Xzd_4Xl83Ls5uo8#xN8X6{%@3qkW&yj_UVhCHD;Dd{j|D3kX z|6T4E3-=nv0%JqXb-;RZ@dL~H^pqPL)Ncyk{5xj>U4d^bGU?N#VM|M8sozE+EzOYf zWq2WnafzI8ZC|tB4X?L@1SR*6w;kZ>2Jn?!LD+dj^sK**a01DSnVSP1l~Ox`_B2kl z8vcSd!~36}>H-;L4MX6!azg980c5Jswof0FqX zQi2v+m~z^W0?}jv1QiQ03XDd{YdEy?^|(OQ)lQ_~aUE^0O*Zz0{b{ z#)iavyl_(4>(0pd^LNB<-te)nJ4#v|#m<_|<{0F>&eJn&i#4lto+AyPlgf@YFYk1T zjH z8mpn&>QtT2{9-2FHDQ6RNIIV_+9|BCD<0ROS8Tq0=m9IJqrQ!N7r_DDzqr|t#5EsT z3;MRc#!1NcQ`p88S8Zi;bC=Ui$cVbHIXg*e>}8jf+^{M1+}0bJca*(P6$u4*^4g*EmuH$6lK)mUd}-nS69lrsJ~W^9NwZhJcVuFG@U- zKDa(rh}Eipq{H*cd+*386Pu9BZzigCL1U2zc!t&Z5pQ{HlrT2@2@yISu6Ke5A1x6i z)0dJ;@wZw`mHWaWKaVXFdDsj)bwFPQO~yQHiJ~w_QVeypRdozNU;Um=SnhoevO_aJ zC$Tsj4O@kN_mYye()?o~BVxWcXBAa#EYv3i1I9>AR$^nwl86_MRRt0YI}Lw-HeAm% zG=#@fG)@5H3q$hwtxB$Di~0Is(}DqF;27j6{VvfN}y}c z;}Wrg26?U3MGWh&OuK*=4aWN;37eC&#n+Pjwo*+#NJ<8b%_Ctetzorx^ye<4Y0hG3 z(M70S_J62zfv>h)1d6Cti3mxwOGpj3W(q=x3zw%VOU5ImsqWan_tHM`*U5585yn#Z zzoG9^pdG%w9U|v?E}1lQwf*T1GHkxKLAwj0y?sJ9qm^I25VkI?@QiC!LME#xz#{Cw%Z{O;Dyk^kn{(45()4I- zcG1YcSLcUL_Zy7$yhbAqUsN=~YY}vYy|5)Dz2)N24ai8>tbr8TVC!`#f5?`nh6cKYu4(-*4LN7f9GeFaepSv_Ab zf^F9sGdRL?5(82YRSb^a%CU#ZM7<%?xMh?Q)j|&xDol){3$NXzA`%w@WPc<+{1(}Q z?Olh0-f$n>3HG6i&v1E$(9$O~&>LBZ>y5ID60jQJpKzbGWk?0`q}2ip4=jP}nnRV2 z61LkK_u8OSffNnvsZkSBRfeby#thnT7)O`1nvF~ATSec#Vk>|~{icBry@%PLEWWxP)Ec`{0>@&zXulMK@8l4yJB6Ht@|V#(C1o7ob8t&>DL$2d zo5&829;j0@wV2e65TdQR9%ucZ-mhXwg}0VL?@gAwBQyL%Dz4?{$-L9@<#pw@G<7?}R zt18>v*H>ck_PNlx&aU7O$BIS~Nz(oq8jBSvb?Mb3 zNJR+=#^aL;nh2xAw@P=)xO|_r*!_gBz>3iuR{8u_8`UXe0V0qkZQT*`}!vkmGoqm0S+H(T5VC|*0>O+0C8k=-}H9NfbZ;b^i{Xt4Y~LEtdxULg~kdg zkNHon8*o$J5JV1Nx-h>ShL2sy{h}XOt?ERK-^rjJeZ=*(klK1@$_23^RsM!yFewjL z4C1N5R|JatTc%Q5^ULt=&KfNfL?48R`Q9fenX{o1oXEh)h^@vWF$=UHzTGR>EXgJO z7~JFiFUuwh^S`U-ZEvT`cHGo`R_&cey?DM^&dSb|49skD!G-~f$Kl+3#nZzQ0BKNBq}%?ZU>3E z+jKufetjM%vs}B6wU;fMEcO>B!*x?`&Kc({G+?UDHzl``6=B$YtS7Sv@@-8Z0%*d4*@-c zOOGR~D?5U6S%Rc$xE>NyiSN%x<}^4{}b~Obni18M>|`(V@VFI+1S`E z)9KLcL6W^EgXBIl2mIN$0sG#@H@}KOZka}n@tg2jbiczD(WY=2di1b=2KoKlHnlBS zo?dpjd$#MRK$Z^UZpsZ#(Dz-P7xF#u$s@nE4g{i9S6m;DOvS3p$1Fk*S)YHt9oNuw z_`Y8aU#Sb5f3!HVjN!#(vj*-lLZbxqS)vcMU=CLboMGKby{T6q+@as59(vH+ zD9Tm-0^AH%ynON_rIq?MV+s~2)?K#bwnNe9T)Gs$!~P}YeqNjj9Nx9~@FtlXQPx2? zXcbDEvooE{&XjBSaIeh7cukCOkY)aS$fnou&>jr_w{b{^E{w4T)tv8{_W5!f*Sj63 z0rYD2(^wlT(WeI3Wx*j`ef*A6ui$7;VmZht{$C>T6bHiDolSx z!jY&TR~dgtIBj&C=-AIpdxh9B$(b@P%l)j^07NB+a0rG*i`xnRpm?-0@AC!x0uqfd$(} zj~8QM_`l-FS+l((Wd3KNuKGm^S<_w3_53t;GJeG*TxTrgaTE(1iCS`lEbjk@~NU%b1_p0A$oB$ghpIa#Q8SEtA$78Hb9MoeFwI9;n@3O)((%gRIpJPtboX8qR+K79)YHq|WYQAx z+vPvGV|^aI=t=1S9V`ZK1Dh~j4F`$1XhMDdhvo3Sjp>B1X4{x8EsuYMqQc@yo9s>J z>yua}4b{%5I-Iq{@9a@Vj^QiRrcscZ?!Lvg;Q>LZ=MAi3{j6@YltmXY6ig@{NF%dIV|3A#-q^4MepO2>{PeF1LB4W54VUk ziYIA=A_(_WLto%?yBvwEeh<$tVkt<;=>DdPT!~*6%;hu6x0s#!?-kj*e z-1=W-WX!x!DWQGZJ@T};29?r%9z^|zV)wxRL9bFuY%tz@;C=@OJg#UHQyPFHQum#n;X0NtiWy|$A{`SwysFj*ezuoHx zkf{QD3WU_DAnab{`Mt~%M8xIj4Q~`8ZQWKjku-9jp1J|&Iys-wTOk{wS8QKHR2iG0 z1fn^WTs0l!8k1uS@MRpVt#(zk3*uGV-;b7ytp>=~#mpgQ^4S*&65d(SL>*p-fsgp4 zEZV}SYEiVrV8@b_MgzC0v@cI_g-x%dw~f9F`y?LAlW7iu!flb?F9**Nxsmk|$=)6M ztkPwJvICK!?+e=ebeqXD+dbjY(-d$$XP1Rs|13$6`<`M%P3|_f|Kc(*>?S)D^}KvB z1m(?L4bA6#Ba4g8WrqhRqT;iZt+Ks{VQB#YFo@H06&V+_kfq5(Zg6nN8?%V#&6_Dw!RKpo zW_!>q%&$eQ0QqpX;SG=@23&ylUO9sxGj4&hpXX?1e;r34taDa5=6-bnd< z_WDvtrivLm=XL-WeiuRaCfx6FpRZX_1V@X$%6Yq^fbd%bb8}%@$n|k!gYO_Po=lSs z6A_w`&N@!0Hd6u>Ixv{z!jH#gG?RIqd%}a~%hBEVY`PK-GMtcyfp=2q-`+EG3h;~) zC>Hh`{@4DpA4mW8zDpI@K#d-M)0Opnm+;;s-@G#D@|*k>UbdH3_>v%Qx05UxkN>CO z5EeyXLc%-Hl0BS`P`rPhEKgGv!Ry=jL1YptHx0X$^BYMvP9clx{b)vD#8^6c+Q-cnP8y|@eVVAD@=l0^PO zNoFdyi4K;t{|n6DK;H%H|DIED#A_F;YHyAbiCofLhmOH7An>baPwcIVMC9T;h|ghN zBGaF5i12R&9MTW(A42WzpA>V?8mofEW==o1{V_#;+kcRD(QPhOVPS6gB_x&?Wh!w_ zGd<_NKm%j5#N15+CByD^bwWmyU;z?HtC{Kso0Hqvk8&20bMcK54Bu-n3tD=+_6JvE zUlIpGsGke5z(H{E3xom+nk(;BUK1Sy2J6;KZPi6(h%9|u^I71IFoEiTTzJU_n@y@( zq72a?jNky6W?K~LR2CH``h~F`Hh_tzujcyr}kO(Y(9RoAMDWea#10k5fT zIhytLd;T%QhBccLP_hSyao>fbt=ICxsWr<>v-wD6m-*)4G)a{sHg zezZN$*eSp+@cKh33-fHlw{WEC`C6(Yzl79XyqD#B3qzO+B&pvRU5`&L49p83J&Pev??X3k^-u68%--^m?6Odhpe)zrK#D^-RT9#HA`{}5n zDvq#;LU!|}lK%oFr-Xr+dBPT(0U0g_kBaZfL4_F845dg_BfCAsS05uk(TPM7uzvoD zo*cn-c$V?&q9^ksS;2rdVObAx<75wUMYGTRr}5zoQB&we89C)25NXe>HRBmdwds(=>HfM(AD5Ta>2vv}F-lR|C zR$JuD>f@8E&c-nb)5PcShjL&Z?7hx^hNiBPeZG3UGS4oX&Mvqo@iq$YKIoa06FSzl zb+<(yx90k7yKim$6G{XaP;`xcVk+ZiBNVvYY{1sa7#4V6J__*cj*&yx$W22}8orif zd;r}*_I0NTV#uP(4d;1c6IAkKu$_xptT_)R4U35a>v2o#vOha~nv&WidyG60dKMAx znp2O+(2(TJX08?dWdp__6W#a~?kg+JR}?1JR$sZ@S8`e&UJ^4Okh$WGQ8mphHk^bn ziX~$?ylAs9g79UOi3+e0;-dIb#CO;u;V@D=gV5mmkjE%$GkyqRgG^z`;0AmSap-8> zm-2G})lo#2e--JbK2>@;Ru{9*0D$Zds$XoOBr&S4hM$v0Jgt1GB z7oCZf{z9r^XhuhQuwVNT;?iC0%p1}%3~QOzj<9`>IO!Y~(-T>xOT}!{CT8)%hiKsO zRS#8ni_yOBooIgwun`UX?MGXqb0iTBuDn7Dtz=3pzfXD~YIlOc?M(Rnk^gv#2JpD1 zZ4`@L2x^_%%O~)~FDU7(Pe^=9d3bfY@JR`c5(nG$Y9F?USN!%^I(+wv@wx2 z+nXBIQF6rs8Hp^@Cg3_g0|!*)Ctk}$h;N+b8ja(=HxOtRbdu4V%T0@p82<0$cY!gzuj z;4<(N_W;P|ZR>9J;jB5k725TFuq;)>EUULO+&>5^Rx*$*xas7%T07G}?uM14k|h2e zGE{F%!)?#mDJtg;FL2v!U>Lj5Z2(5L`XI6WJpKc86_jFQK#iA8n!UsreZ)kW`go|F#Dd}&?Mfag6IEo!K8&vGVS1j^?n#Td;K-*& zw$F2?>oi{JYM?r_@aX4s0r{>?Ze#6NF}xh0lpqJ&)(vq&Q}CeVBvfE!PSQHl6@D9v zG{*)>v2nuHdEG-ow=sC$Z=tWZ=hbPE~1Jz8rJXc)((U+)WtC{4n@h zKt=z&e}wD|LVKw%#jnL97E6IC%ZF|7CCt-N6&NPr_bx=2bT`#8CPHxEnAs;p$Nx(+ zU`K`AfK3>l_!OPGOYSxjRck~cc?9(V+kQ*aiof01LB=DFC#UcIOH2-XYf+ZT1^epv z>XF$fj&^14X#%zLR5-86{OF3Q!N9Eo1i9Fpe3G|KzgMZ@We`As{M~}g3&p=-GJz=n zUG&pkY>ex+aF5!Irz<(kn%P&bhW&`w-y{{cP{XdO*bK_TS}-2D*Z<+Psa$)6YYPA4 zh(Xp|M0K9%}bbmWYA?#hQn<~eb+Xab!_Z4{OL>2bG z`?P9dsTtt!K#RJAgd}uJ3H6swXSFf5{9y8z)e<0;l{6c>*!8DYwv7Ytx#RylUIEDK zzo|5e-TZhd?c4j%(uJEcok`xNCcdT|chAy_J6oFBb`R+S3R-sJ`ttVc zzI*eqZ;rQi1R`c3W(#XxqU*K-zWDds?-!ln9p07)*#ql47EaB~(I$RUOFdEKh$FMsHX%=z)~-OAg^3!b^rXS~h2mR#@Z z&f6~xohsrh6taBVkzthBu4f`2nMmCvdO>n7-0dHL_9@iePBb07QJJOJZ}15nLYm{A zA$bgqff8t-(_KY;8avwBo{RFtx$IZzwl;S>3$aqg>R0}&zhm5+He54gC<+y~J(-ba9bkx72HDf(E#J4d>t#-S1 z-PWHUiZU$(!yNlyvNIg>{#=aRf7=ARD4;))&)Rl7n64HSYjY*u3Ts0y>V-2gGLXI2 zYLO@GLoF4j{u0Xr@W$ zP#K$vt>1CWG|~5~bU}gKv~Gyhx#8}M`f2FFf(t;k^MbQQ=ACO=@6IX~xBxNPM2P=_ zy{X>#<^2Y}Q!{sQxWI$m5;_n2>SS7?>*(lni5)?W=~p*_f9K-eQ&<78y>H?TJHO^L z#ab%5u&X@=>1!hPf`+nIJIzDh@r1sWsWc}-lZylI%Chd4ZLN5`3ASo8B`9P?F(g25 zK!&#`kdY5q(+2Vk{c`a)8TViTP#&)GH;gK;-J(g}P{WQ3@zkdB7CupX$cM2gvACQd zo|$H*uk1bR?U-&{F*D)uhK|_H2IDg^Td}$ii3mAt)JykzA5!xv7dX8&mT|@W8r;;C zcFXH=(XTY=mYxn)eJ=wyU_!UgBOO*Weh~!%l~M<@WmziV>E`NAAgNA?a}Maq;W)es zjEn;`PfeCF-MEK7*q?>LxSu)hVd1{@NS^Q%fzMSWXvHs8H zD%U%T+;7~oQ?~kOnWQbG5HTt0ewbueJmzuG9DwFnN_pqmmxOZOtxSxA1J%EjdXW}v|{%FiZ;cPfi9+pU;` z_zCvbowgI%JiMnTu<2I}3Ns`0h8fvDTD5w=Q`Ra6LTLO#?oS(NhX~na+Hh3rP%s*K znt~#$QHl&TfS5RbP~Fbwuu<EM7sbE=QE4Y_atvg2G!w9#Z(oFSh$Gl%XPT6PcnNrHgrdA zae2A=Kz^ed05yYCuCA~3k8A92Mq^@AZR3uoQyT!jEE@JxAUOH{kwmWt3VBA2kk5t- zah1k1jg``+sRHuPcwFB4Xwy%ax(%Y;wVluYFz6)*8+!}ECvWqz?b4fEI#P{dsHAh_ zdDw4KJZ1cdqP~FP<@X`{jFklKAw<4jyx1X7LOC%AUUyQISx4F4fVFdT^`H=&w?&Xj z?3FS`PYNvKur)yy2WfDOnuc~^t6Z%wsA}k|umxzhxYF)P<}?HETW$r+n4Dx4>j@(0 z!q(cwZ{JUQYZs=qM3=qRM4ygQOi$JR@n22S2J}SLE1%OLWH*8 z{q)BM&VH>~EDj-|Y2y*d3r=3A?|zzkkTMSOJ+KE_3y|aSnVEB-vwDF4luz5H1)M+R z36tCGftW@LEIq;S@gr0z$Fvh(G|NKaQ}kJYhT8l_9Fds7s13QubP%_joW{SC(m(%= zz%WJ^>s=2KHcs(S$qf~3TGg_P3tEfy3gzR6#GViho90PkVO#D+c>m{pt$6!baz14I zB|h8wH=`fFkI|I#uKzBt!C^d?uCQEs9beDeq6-R(E=}myk*57ra?>qN92m8%*EduG zlaiSb(?Ea!$ZNY&m?hAJ{=o=EiM_k!>x0|_`Ewx4%^A-4N_B!X5QARxKcZ7q(+k@o zABQ_qOBf{|(crmC`PY+<2)9JFtD}7$H;j7aQAd$pJO&&U|tuBjqD-_Xj5B6f6l z>@+gJw+S@D`+X-J{rTDPz?NaV8>Y)7(%#NmanIk4$1|^JU++t>n2PKDZ4ZCURlX7v zWB5UH&X4ZpA5cl^d__v*hi3)22< z+X2`#YN+rw{rW$M1N%nc)kDg!Q7GpZY-J*?)@{Xyr-4r4RJP=VXjoG@K4b-pQcnc?d z4z(p+i&m+dMI;Xtv+?V7%X14CT*2GI-gAHOp$H{RCVPX)XESv`V|^2ZuS@8Sy6$Iz zoJTR*9qo&6N~A#5k_`fNaCq!bOa;LoZSBW=){LF5cf7KgIo|8jfzET8{M9`Q9IRs0 zu?Cl72(be{+Pr_LaOX`dz_v=s<-g>t-@?8Po_Ko-nL|F1in^B7IB}W7gY>oD?^f;z z`TSa7gy=GL{&+N9s}d+lQ3oObuBwQv<$FQi6a(w_PzCj8oP{zrx%AQ@?qAbbO#^E| zSK0ib2H{)`-GufxV&Za=Aw)(Blf{4f2^w79r;{o(Swv|jZT3<$CJO9V{yJR+h&>)1 zD;$$Y`3ZT)m}iQ4zVzbC=gS82$l3!*a5>bjm6}58GS!b?&clH;$xK;3b%rSXKuAIu ztw5b@DoPI)Pro%D*TJdz?>2W-oe-FhO4S6y-Wa62Y*gXVM~r*xC7i9*teT0IUe_h!PI0(` zR$w^3b(r%zED?eNk}0C|ljnA>q8DpkAus=Q-7hNb*F;Ug$HUHai2~aM7t`3yX9YTWmK|WSWWiSMYjBMo~RUw;}3Iy_K zMEPn}$#r0Ua@~I>oBm!CjV>}0VouMg$VKf>DiTUvI)q#mNdCc$IlAu99LANgmly%& zPNo~MzhiUQ@!VZ$9N!?{z4=l+T{X1817(Pe=2HqnAD5YIy|@YGH72rSc^m=pPt?O` zfwhoLemLC2#Efk7NI?#n1g%~EH)R*AnXFzQ&j-RlvbL%D(0Yr6kW==S>ycEhWm*2w z2+uM4gMdY}=P{@WrFAp{d@bH4)wO`CAntB^6ecm@Zm)+#q8OuZdEJ%_6!sM(;+u!8 zItO=hgGx*TkPr-!AUry4s{EO+*h3%qG`Br)M`fWb*^QnX^ zWvsUaXf@RvXE$>35O-2ZMm(9DG{60N>hr_eI@KUNP&lj&K65D+I+*xumPv#X2k{Gv87juEzGqbNtxrxiTEnuh!tJ$PuA&oU^HXC;rc-3~d~3T= z8uPP>(;uL^2<>S5CJ?P`!95yIlIv*o%?@@VZhH5VL*;Vz`HgNbsUHgpk}nz$(}2#zBKH6Bi3uF*j0V*QaGuiR{!G(Ic=H;&2||W(yabvtGYaUgDhI9GW!P^~3S4 zuv@G5Q->|hR>9=sQIFx_3un0~byNUw9^V0mPcaR>m6?OKwf=iYBS6S=an4Svxyx7= zNIU|mpT(+Q_m;ibMRcEOQn(Ihh9;^miz`C;t?4pX>W&)70uGwxjn^!w(kFJOQ%prTb;ww5k-Dt<%dxs2l}{xrv)T%_p(&ZlKy|Sp)2L7xv6dVJ_r` zA9A%am?KN+061}ViWoxD?%O}-mvz$nEkW|zWU`*t)2?gfyM^(qVxXFeRULJ3X9tdl zw7@Cv!spSaffW9o%?q)Zn-4e$c*d2{%4&k--H!V!z}#A4v({YSX1u+FXF$X4gwn~A zBuKL~<2=YNrAaT>2F-C|q6-R|&FlKCwJ0C>_Get)_Lt2X0GUNHjb^%ib8RJXU$eo+ zWP2Uhbr3S)#{~)incvEcMngtsg$)`jE0sTdwT*4G|J2)z8*kWp*Mmzq7RY1Y$w#)% ze`HP>-p%QL+UruA!sW-gZW*{n03sAIW|Tb!7meporz1aS67@Zb2Ugb~B==oQZ1fzQ z-;#mvvQFH%w78rn3|a+Me zQkC}Gz-VfLG{#(Da5$Yx&I#Ai0M~82$M{yqfT5@-g!&-nkYY$VVyOH-tg%{`y#MdL zwy22w#|qWfzFXX*6FB zJ#7>s@~ya%unUlX{Wo3I=3fUP0*4Fsn2ko}+0@t8Y@TowK?aHGrM4$t<=XI~_ToIR zv^q=*YXSvDl>CVJMr;vu9sVm|oLhO%tw6fLrPW|4&I7YboN6oC-aPs;Zh+Z6GTNPJ|G zBSs#itXpCne{MlrII(glt=ih_463Dvj9Yom)iSHLi>oJg=muYes8amY0=&zkNb~qf zG4C^tVrV~&so8;6PqpJ1TbA4Nu6{z0=RwB`ncx~tJHQgwTN*7P!eQ1!G9+58l6mx4 z0RMC+U1GfMfu|1MwtmUDnSt@8RqF79K^gwys6-4S_xJhR-73P9_GkBy zO|#nIun{IxY#8wZl_Kubz=#qVO1k{nX@DARp;js1a*hX-%CMrEj zh{I@q7OFc~$O&)I@R=$H;9aP$vHGJ?IWB;*Jin*jOjr33JX%fTeUemWMRR^_k?RD0Wx=+ROY z2IeeHK`x6waEhZ;G@teeQVBjJ9};LPGF6R{2yl!>C^A)kG&cS`Uuta}4xyrxE<0(y z7_2&_sVmh&SeTOj`9a*nkyx3v8q$ZN#E_-d^j&WJ;M^@%xBLC-Fk0)V;8Ue@cF1pJ zV+kvP)F8X|dzx6POt7N>{-F3pgpCJa!0V84F*cY-PjXy+eaZbsO8 z2nddaagGSW*&9MI@f+H^h033#4Ej6VUm4FLrzn%_@Qo*PUrS166~2_ErA}UF3TRq- zIxVmLylx%XcX1r$a5mYd^U*9KV<5xOnX!Q4Ci*GJk+s2lo&L0Xg^xjmA(9{lC-;DkW0` z1M#{wYsSCT#^xft%5cpK{+0<-8cTWbQNJLjXSAC>ion*|uD@h0YQ<^NHt>-A;|H*Y zsK_eN!tsYlDG*_5ZLSXea4s8uG{HQt7qFD_RV0*3;-e)d{HO!ZDtYEJQ*Q27tc$h1 zuIIjvNBA{9BxsZxO9ZOJn+;(=E^m&I)m_EBKm47ck0Bu-!v^6Bx);Lpl($8gm+E3O zIluCDjwpf(Sun;=fEQ^6Ck;6|Uz;&ngngJ#8wHct9uVKF&W~Baqr)C7D|K3(QrmT0 z49qCn4r9+;oN8%p7g}J!M~&)H2v{)|BWb?)6KXX*gNJq1id?8(yW#4^{Z3i?v~?Vf z5w#K0RZeUEK{=1%>9%_2KZshgQbxjTikcEt9WaQlG6E_5p3u=H@~rDiBLatKssJsS zY^SIMBmx*aZ|@z0l(8F%8P!&zNnKr0iM@X=Gu74z6?0{`$;=qZH$e*EH5Y=})niJt zEWI|*r)Or7wl4E%=04=0Ec`tGy2ZbD+G?y z@R{NN*Rx_u{mWr>X6w-`$SpXTPb%;Y55r;b066`BsBc)4~^kw-)?7QtFk&jsp;>! zkLR_UmApF9+WXF*++|`{WVeo4?0t)hK&*-JZtoT;Cz_5rMg{eWg}SgP|MB*Y%i+(k zLlAj8x>>CIV($vTKuX4=@gwozrXMhg!$#grXl_t4x7q14;eL>TLrfJ``s1iO*M})F zYYMR@tZ*ySSIy$~^7D-gLLO+LgbuvBc%CNn<6A|Akf8(#=r6{X6r%nj@;Cn5jc+Gs z2UMA|c?8G~%gu-<*L>bbNe)13#+ak3PYbj*X%k=w0bb@@NJUQP?P^;!WAhYM0e@G* z)UV*95xJ1O?k`%7>2)luS^Lv8FBorobA<)zb5EkZl5lpGuqJL@~MpVs<*@rm4KtAM+f+bM891Q>Ab zaP`OMc7^=0|3>I_*UV&bL_fAl)_zYV4zg!@=Jv&SOAwAWAG|KRL9 z%Kx(x$saW?>2C4?f#8k;H0wi5r{=g+UVlqkf~X#YQ2#WxY@1~8C@qU@8y^<0?rIQ$ z-&$2^Z_`X(nchUm6{hFP?(QS1JUKFe=g>+s0m~cp83%_qu#`@b>2GtNn~?j}(PtV} zEWnn}E--C7?O$5`GyB!VZiN0@*Jni>!jvIeGX+D#@ z6NuKlv_gVOujwgWk?mL6#OO3A81WvZF}KYmHL6aFt|-5#>=YZNG-2 zg|hsUU0x9yReO>_My4ee7bpzRvX^D?kJAs>2m6JWn)Vie@i_`?SFxHxIG#1JO9}8- zZO5m^w!$jC$qQq|-}M7O?KSP9=(;5VofqbN_c@3oC^LexvDtlAv=|u)5pcyow^p&b z{5H$WB=D~cqqMTNx*_r-Ro9f79y!2|H-EZy)bD3yMoO3b@G(+~dLarJAkjD>8%7h) zZ7dzmMX4m~kWwT9y;H&xFUl>##}xI`XqYKrmGvP*s9JUG%&f;8K-5hO-E4?2weU>P<7E#L(ztb=BrpX>kF*2vxHdpZ_?50gYz9F^FDdCWn0CU%c*Ig z9)kKa+a2n23qsNHKGUKJ2e+hGykUp2O#mrZ72DD^;m%AjT4fLCGrZ)N0d`sgFPMki z&huL!Ek?A|=z!VjRa`dfWfg1Z1Y`!nJdfkdLmYLyZb|bJgGb8=cCA7XkGCbvKd$CQ z&t~Kf*{qZ(q^Y?8eaG)l5E;D25oiGz*SoUwl+y=S|2XqdHoew~>im{PWO1YKwst#{ ziA5KbG#&{VtKL^APizLnq13k@gt+I3iuykWj--^xbWgb`=X4I!TwabuQ_&25KMmZ8 z%HYpYLw&Yim~*%y4vf-vG0vma!zSf%FC0SB;F;nt*7N;I69H zQAZ!@(rNrWT<$uPY{Ja>jVG(3yANq`=j%Nd-cys0IX$@9NltyW)g{dVGB1-^G^i@R zSC7j=y%0(&{w@As^8Tq-uY24*B)iJ4yfWD5_R(sN&7x(PWBVgc!mwNP9=}GH47mkDpQsWWBctC-bH66emJzxR@xa$9ps=`kQm4a~ws?m5v9t)WdKaPe{7eRf zU==Hc*M?XY1>7unAq8UbeD$bv1QrXXh}(00CV)G<*;XW#ZO@J&@URb3Z^Vv}y^$5q z7_vJbRBAaLIuEpr=+Uj|dkB#aNU*J1=afgC(6{yP`hrH&6nj>PcZzU4?KYp)ibPLe zIkw=US#49t!heISYj8yQTlWl)O?x_M^P+47Rsa);E&YL97+ofOhcnGk?`?G&7qGoA zL<&7*-#qs`;_=ge8Zz20S=tEIW^FreAn{J*LdhSdC7XFfKG3th~|*w!}hji&J1DCczsyeJYHwmGA}d6>S2>9mR8y3Ueu=53E`NkLHn3fCbz z+FKuz*pDXyrk$;676%8PL-32!O`f43S*{{u_I8tV?OF#@n|N~pszH|%3F7GGVg7k6 z&#KcuurD9{j(k4r#2>2?E@AVD1zf1u>k?z?so89c=?2fhMWen75Pd!A*!`Fx#QICGEl$c`WzUdnK^& zf?uZ12vyYc*?F#I#9;jmMOI4%a&@z~>`l2EK`MGp_g?95$L%8oNgIm+ zR~zJ1X?Qk%t&S*q)Bkbq@{n*rb)C@pjamd83=ayQ;QN8;btgY?`(&1shcum=yMCP{ zzqOrIrVTV<#XufM)m&3Wu$#}}1ip0UBeo8$On3$hOjFUc%D<^@tmBH^_ScH~o2~7^ zoRrq73z}X~is%WXiDtoYw*4^4*}>)(``+z(_bJXam2JuI;3qv8dbixUqsceHJT@;| z1^-Vzn+{O7OduU^1YMjrXv(cDpJ(0u7>XZ*QG|$AjsbzZaJ1~z_r>SF!&8aHn2nCH za%ldS0TQ{zTy|NRFu?XhuEX;-;9M_~>so$*jTOk+a&jHSdVCwA5$#7iJh*aUD7*o| zf5Gx=GEZ6@BNI0HT1H69A5%S5OrsdC13LYnrbkaKXl>hUf3fjEX0cs4R2*L|?ETC+ zT{)Ww0E`{x!xkY98-71OfTS9K#<>&p`aO?aL~e)JvHRVReUE3O`^mSED8vY}^jS^G zH>`)aK%7J~>!;z_^y}tXiNAmn1oIF^ZMDp&1tmohYF2Tc|46!u&<&Na~}R!r_U>E zb@@&ws)jNNNlUuxfTQTo)!`kL)NAd(xkfMR+y9KmP(njsmCBlE?QT?a63Jl|-ZFid;w22sN1-<1I>4%#Oi|7>VHwmbj^V60LJDunh z8WF7Ch+GJ+(gQ9o>NsIf>7byA0-frSZXR9MCp>+I%dg%K=RJI1(6f$@1OJb$cMOi~ zjk|Uy&V-YRZQHgp6HRQ}b~3STTNB$I+qP{xot*wZ_0~C6&wKXg{?L0@_q~5uYhC-& zk=%bLDmZlnSb0preOf~i`}(52}CfM3w0w zR&SQxCl`|4sUvw5iN8QX(B(a!D_<`XI!rn@5zJCtOxm{gnCFJDOeAgy9X-#;2)|GG zmU`eRjCKdG=N#GW{F56#6%O9jsW#9?7HC?7LWSwit{p_*>e^3HX-YaQyW`sCeE(zz zVGyL^Tsk1j|H*)!UrI13vMk1=~7N-}3Yz(zn zVTrr5yL`?Oui$*Fe2!h2p5JK@CzPKFu6mJg098$Od7`?4IWou>lto@d?JP9Zfa!PI z%SRU*>Q~Z|X)kY)hetB*(wj(MB{0t@=xwnsB(pMLKwp-YZW9dPm(n9Dkg(u7bvIO7 zY=wAMc1nP-0tuH^kGcLD}%yVIrdn zj{1IH0nki6WX5C!!f61AA(<2efghpr$Z|Ony=IjNjg2|%AMqed&;>V9fK%Dh82kC| zN9}ClNUrf7RbXW-#-ZXq7xn@nuWy2U%agC$4|03lp9=w##k9+NU(`!>m6Yt-^>xN= zSG{C;u@Uy4%Ii=cdVev{IEOCkzRB2ac_rC|*wX`EcY=p;_}tODs^Ey+PJl8+v72eP zN^GQe@3YO}^EBNz(AC?3$o81-1&xie8CSON$4W8B(|j$jJk0O~%aN_~A+{O4!OHkuJiVQD!?NnB-rRXe-iK47=< zuwLOV%^&endTAT_js!el2Z4!Z`dR||DcI7{%H$)zB(-zjM7X&_h+|!>4}bi=TUOz$0@H(oi8|9@o*MMnrq;_ z`VUdTbYK8^=s%8@&um0Q@Ip}8MEBEwv$N^2iL|Dk+q7BQf+*Mz31C1ycHqOzj3Vlm z^IEkbyvTP~p}&NE_;yy$Pz4_S5=x>4^v>0ie4^`aJHyue|0Q2y<<)H}%!2}dL8Vr9 z=ro?sJB)WD9Mrc^7Pl4kSQG~O++aExMM$ek1p%w-X+qGT8VtkrambH%tteCRW-l3+ zjQIJqRo}1kQM(y^6klMhStu9lghRBAfV5Hnl!gtG_%FR6WzRsq-!|QmsG7X@LMt@^ ztEPYxF&lYa$Xo%-8^uV=HW1bX$Nox`MMh?ft$$5fYkgLB8oQPL+xObSjuzlYvM|6t zg}_3<3rq)sIFzEagPE<*?Az)%r>)m-+Hod^&CXG{nU69!1}3 z@o~NWL4WWf_yh+ns081G*>5yLSmGND&g7~JQSq<}TL>S^%*Si&K35ww_UBWiTD-~q zO2LO1E7a0K3>M==!r^Iy+51QDS{1K5UoaxhV!!0)%!db_It1}*?C^QZ)zqBmVFO03 z9aX>&rIWiyT;2XTAX;OuM6I}@8J~dnhH)-7$UEQ;OFU9ltAnC`k0}Rhe7I^O(;>42JfYt`D2d=}F{-$@09}Tw>}$<5z3u1_MMm19M_syg&Q0?Pik* zw*(UoHs8k(zGL{VKrB@T(Y}YcJ`Ae#By8Y+a!N4ewU|;clnS;n`(} z`dpK~?N%)_r!D`$z~8vYbgoqgRsEB1DI>1wl?YJUfhE&9iB+c{x@MqQUt7@+_eW8? zWmUVUleTV9fx!e0f1g@C#Zh4Ph6s{%w?_&Q3i3E+Ne#xyPblU3EhN0#OBUGPOQ0^`tDujgrsu8Jag| z(fC^Z$1JA%0p#QCv=__)=N0FQk%Y(hbBJS*OL#Oc(0Dse^Ky|P4B8#1sEQPz=m=DL z1q6&vdt~bWDFi@HP2T*!@U_9&ptOs91o~`lWC#Y`ep93M7BBwK+GRq3<2}O$ga?~F zw7;6Iz(OV7WP~=rHS^!jx5oiSolfuDzGN8W+z}6P1B|_hiN9E`^-(88tZSwqF@WYk z)5?-iEEj_$p2Ih-Sd`v9*P}a^6Q|VOq3|WwT=b#ZniorY?}pa3`C2S>t$Ll_ zh_vAZ6PwNJIW#jn1DR9RQdj!g_zb#jaxvjoZ1c+y5bA7kLqEu`I<)@=1+QS-gHi)V z)ycrp1~tVHI~I1n77E}tcA~L3Pi-cUYF(9LzO5|G?Xgy!=)c{N*IWBjlD`I~>j}&o z1vg)Ag|Zd>m{Zj*<*FS5mY`bu0q@nDvGLdyA>nwT#gkvgnpChBRjfE2=k;~=Ibx57 zu^qlpe5RlwU#=hyLKt+qj!^yChVeTV4y=|@vi3shhti51-4Hucm`p0TfNb% zAh_5XFN@_v41AUXx$jfvtXA@-2@KzMUBfyUkFin>Kj&4m!sF;P?}{y;{{6Ge?=geQ zR(!(S@w|PT-Y%(?V!#_#PeSuiV5II|@V5P#+x zIG+S!vAoJk_QFnRbs~s^Ys+PT+*`L;v;W#{wEwD97e9)maPF~&g0_ONbgTyH+CLRD zmFI;G9H6d}0K8P-R$1VU5%9O56etANjaCm#GA@_aA256Ggnp0aU`Unm*8Dygsl;@# zwXt-6=`|ri+P5X3VlMVpd*YS}ER?i>cP*VfjerW1?1@|+C&4KG**p-$4GlR~PEFN5 zd(_M&Sgozo#e-7R$guaPixk`Ec$?aRy$x?c>sec&hWa|bPo38N2+nCJiO`*b+)=oh z{3hSF7Gk5T=RQ$ZnD{?iXn32xubM*5ewUp4RXQ9#~(tflD4w;=Nh98t9sL4+HHyMm) z1A}9VjdFy$CND4VCN==BQt_j*4BQG0{r|mG^kunLq)4NCw^Zv)e>9x`RtM z7{3v0mOiT&d5)GlA!ZP$BKAF&zzOF^_w>-X>C~gfF1lWgB+epnk)(qE2vNVDGB5ZETH#U!_G` z!rqDDtccE8uVr{tCkW+rmM_Kf7^NY&RS< zZZ^^F^86jgkelw~u^CrKA|pD-+;+ZFVQOc0gZIru^MfmT<5}?YXfaUf?iUfHKS=%a zT3LpIqpiTQzgmIB5n1grm+61fL@VX?IP{D!kWdWsHEmU?-2e#m8^C1XxL5%OPvf!s z&aE@l4}X4Bx*umFP2e=12>!(xe@KZjt>-42+W}HAA0id^;5=chBW9lQYtGypS8AvM zZ${zGU7eqAu8%;N$-@wR3>A=Sam+}fOZBQ7XoI$X_st*hWgEFB%-kOIy}xn_EKip zgOEbkr@6&^qalwOj#hyfD3L#9&($K@$_#heJQ7V35O+FTiCY^RZy!Gi$a&l9g8oD(j3?Ax&As_ zhe|3DyI7@Qaah^CH8-zXjYPD$;L9`KSRei4ya8FN7T-6G^1HN3KL^z~a*|LYQ21%8 zzf^*XQ|no6aiN#1C4gSgA7tKgmm6bzO78`cm6~(A#(p9^j(4|%aBOGr2hdKT{W$Nn z<;`;Up&`-f&d;M(#`(}7+ZmVh16kB@QlCs#GTZz>+w1UX^VfW!e=lkErcV$Zu5d>h zJx&VJl%IvQ&&jv|Ik~ql9$?fs5b_puX0}6A2TuN zG~bSA6YY2mPe3ZHb-(q+_s2DwN!Zt@oxyR=qT92zDqVg}4kHw6W((g4v#j52!(uqD zJxWz(4L+beSoQ!Ax9hsg>+Abk@n6DSjY?kM+rC3kP&$0<9?JzIM3BxV?5r22?dJa3 z#u8|105)`Icq6#|PIQ3V-k?-IPeyu5uO_(opn^oeZGeB;k!Z zW@*7Y`PTWb@WFiEA{J!{*p`vp;PIZ5>2})QUnpaF`|>)j#;DyD!VNvTh6uVD4cCK~ z?fjk;;(<6ro~nv}`EEp~Mb(+0xpE;@inr0q4MU!1Ky*paEcpF3`V@zM0c~><(;!k)G!si zdz{E2Z;)D3Th-qKVDfJJfT@92Kr+X9#m54{6`*?f`z`OM#}1XV^RU^32G@wyUL|9B z*5ZQelMQEfe%WB*+nLStZm#d)!+fgUP*m<*tI6?yJ{c2y+X7(UAu;K&v6ZRAt25g7 z_YK-vUd$O2Jlo2M{UOX1lHCaqk-STy)*HHen_Tg5G;$f#skbJ@=A?m~O!&oI-i?D} z8z_v`X_4@5z6MYw{8e(!;TMy*d}8y!?W_D)p#NxMd@4T?bUW+c7AD2*B82EVRL(EfqXbaM?c zoC|pr1OYUJWTJ1m+8B)%dAS4t)n6xtlwrSdPr|YPJ@fkYKyP6u|(1VXrIL#!7hSQt=@FL9);JO3r;lO>)pq!oUZ!%IG$D0Vg7CH zC}f@6?aAss!n6Sn1dSs4EcdMYSc1`Vjr{O0H@G-e))0{4kblm#_AwYZQ4)G%NXCzw$0&bj^-);SpIRb8q)d-AR z&eK|rbA`d6q^#kL+L^_5tzd3DNNA77#d8imFLGTosy^zT_t>1e^OXWPKPtp~4D?He zTZMuBU#T^{(mFaF(J-M8rx3d6y7beq2*9U~T>Ej_O|M7;@3%3VqOw*I)`0h?bnES&uYQ^QQLlqF8aC!b;Wnryqmt4|F|%Z(+J`mXF|@jD2JShX>vy^lGdG zNOi}={oi6jPIf?eoi0F`+V~@Oo7Ixy0mkTPl(}M*C`hJc%hY^{mK)}R;sTLRoTdp1 z6Vskrlm7H0|1jvg;C%^{j5PKl)vKxUAr;sTM}=dxf4+jyrDrmnfc(UxPuiU;PvMxn zk-R^lbvgK^C!#IYmO%x&K1B0CrHLTzzaAX%|L;Oq-~Z<0N+3k9@s=zPZ=pF;3KJ5I z$5~ZtJ#sTEa2xZi?|cJ7lO`7iU7mB=dAIM*Pg2j{VKQm~^8dMlm@0viF^}r`yG9gS zKIUJU`fsysl)BwE9m|9h9H+TGF}X?IzM_+N$rYu)X&)?yb_snAC)Mw+BaWKCefxTl z786!JX{aqPmSu%#M=!Eo+eHDa>(}JvR=qbw|L_?eMzE4tsF39ITrv95TC3e+Qfew5CgDD}u*ZJ> z4;1i_tEZlEx#;_GYNnO$OJyes<8&8NFIK>dA^6eHn1Pa&p*QiBO>m>?DfyuYm< zl((pRA{)PXcY>bQZFPSf`WG+b<3NILtM+nT7!W5Ji{;;$?u5B$yCqb`6ffzke~kn$P%xir4lLN3EXYrzl9L| zxL^kNB+B|vAR9aI0x~#{m&%VZ_Ep}i`+wX;4A)SPh|Zb4`IJ2F+@d~VYrQ}?TBz}D zd4ARp!+BN0mduYXaS*WCuRm>au{rOA%m@Nf9YKl56gu@!L* zN~O(8RK!O1*^rG!yWiVIn>CzPy3i>o!x%)*#$B4!Y8k-&BgN311m=*mbJ-Ot9}pHl4c7CM3Z?khmSen;HLr+4sIN&#Wygcb$8-u&r9-Tv?`w8}C35w=xa z_|&%hF|b_-(hl>{|0cR+gTv@(9@Vz3Y6}yA6Y0Zx_9s8DCzsInx$E_2Dr;Ok5F+jK z5(e`)xj&>Z*B4P(n|MXnadqZ=NWS$mBwU@R&H5uASwK4vNCiTk9OM4Qgpw-@Pzp~~ z4-{P3K@I=~__=2aRV-Os;@Q`EBwCy;6Xi;=7#_In56NPIFyFNX%WQ0rH66B{(rl%* zNeanRFAgF;@j89JuU=n0&|f_@PlOA|r8AP`VAsD@t96%&o&suhXrcO4@2h@j zG;2q(_uBhqLd>Xsxq9snXnpwG7u8t|Pi2<~ymK}uTQ##G;r+QLR3JRrZqa3E+a(>= z<@DWa&9rT^K3U`nH?nJ$mR}W5)s0z3>cK^8^Q5r<*4}DKfY|;!{dE3Yv$4_67b@?7UuSy4V&5Y1N0G4{45t8FMwB%^OM4Zz5-=B z8Gu*$5a$ECF-k@e`KciW*$gRbutoUq?KvhgqJebZ*nx-uXgiXm{j zPs6pn<-!n{x+hs4O=kL4X<*mx+=kAX&l-7v}Cxs+D146-GUDrbu z#Jj)IL&R#jk3Ef{glTU-py7i0P;CK&NTtzg)tdXr;?TNOgiy)LshVI9Nu#vA#`-In z*J;|c+hDjgt)2^)iPv5i~G`7jie_NTohV@y!+uKC8F@(cM4d6J=A-@tf~}UMOgWu8)6|rUIN7XNt7Tm7-4CL9x@G zVB2BWost4@GV1}sxqki!`TaFb!rTTWd@gT^FW5)Ti}pS1W)$X zuUg;BOLIG{?tJ>I+b}BJc4ibWAq7jZOZDfI`-cS{PFOj&9by?-@&s1UEO9R2+2}Qz zHN6rQ=hDR^Q}@m;F=2OMG9?MTe%f_n5thmydjo^kCpk~T7#I8|S~GLJO`rImWpP~} zo80j)zuuTUh1N-1cCQSyw+8#)zo-R!B3kTPj9m;?^j~_A49J=e)9vvIcXm2mx&+l z)KKq!pNDY2e_nqBtzsiAEB$Bitk;{Cx7qR-u&Qlfqgq`rP~`>RN21a{Z+h(K2Z1;l z&`1F7wG1otQJZjttxyLrND_BH*jPMX0zpmrcDJ)d(&4?s`^R2UsikC(yVK*^&cv%W zc^H-aznj#^zlY^nUTnkaO|Ah(sd~&MTY@u~IA~{nw?XSyL*ilM^$s_2#Gp)S$JTb= z4M_H-kvc3!c(^e&7$orw=>6lAw~&(ct27qiZRu@d?T7tO>@YiWQpwn1Ar=^)aVfJB z!3e8wf08?A<;??9nsci0XF>`ljjXVAOMDt(0f)P*H2$*p8WA~7dv*^`7ZuUQAgN92mQ6L5E4y4*CvBPq`Q;X?-3IHIbr>A6mbNC`IR73DO zWK+a#Q#XMwI=rxmTxN$=Ydz>G{e!7~0@uVFoA)YY?X73L=5weTp(jj#@a*yKpfqGg zC$VH_Q<{=47tKPzX6!;5nQJ+bLhuA0!4g&*D@@yScoUibW2C`oXyf7@vDI;K-%rZahI>!$3x5 zEyB3re3(8=uqE|RO`Ti zhWQ>FVPt?Kew0q5&2nQP9AH0y8O8R}{|Hdf5!F9vGFq}(DH9caWB&L7AWE1hO08B` zJVs`N6v1hkgN)n+&DTu?{mK}AF#D+wQboG}O8AT>S%=gM8$93IFmXSkk>$L8^D4Ia z>CVwx;u(BBa&8Uv%5@%MP!c^CG?ka6Q#{3`)&Ly#Y!Lm!KC*{4e%RfFN<Xv0=%8bdZBY3gcOhp&>mDGp?_Qi(^d)S$9v9Uh zk9}d|adO@kmQPe3>m_J?0rN-l zJZ~e#KJq`8b=~G;Hudy87RyTfQ;GC!_~Sm>NU}YSH<2Y{2#%52pUN-Q2w@kN-ut5= zu3GPHJ2T=+tcbt-EGZgx8pzdj+1D`f^gl^x{r1y=d$gbczSHB_PT*DO$USD6DZVPr&qA}Y2e^W!m6`6-^Y(fU5v_(q=x}^MZ3np5)!Jy~ z_-*RyfCZ0( zFTM;s@6p4iM?}sIDnkB}+_jw}E{nCrmeAO3-(&uxNnr+bZB5eQ7^^L}ow40Qhw`1f znF`Fx&033>Fh$_a=MUKDDtK+@(_|$=55wo>P#A5;Lv|zEFm68|w0>p2MD7(FpOn1SYu@?XwA09kVT}_^*gdf*0>6GQLchB)t?L3Uqsm!99gma| z?LS-rcF6d1Zj_yiyebk@g-!>In)RI)H-nf9?~_V!A6%uJ+urXv{8KFuQAmxIKr|ey zi++6tdj?tOoH1{J@oVF0Ea;~&5+X#((6{EPZ4upH4RC$BuQ5l~H5It;?35k#O8P)o zohtX(Qt7I!WnO{=w_2`|q<~gnvgRZ1{LE}Ctmzm_4c-LwLo2*;F)O)&cV!T*q zB)lvF8O#0w0Zc1RRyEPPgB`|$?EplGGa$sGa6-~omv#~U+96Nj~n@U%*tZkLq4L{M^# zEL|G=JO{GiNVKMw)oJPCEo3MdJ~e~uh=kJXE(zw`C!XJ{d&$IMx{Y)K6Z7B#GpFYH z^*YD9=KCltwR7%h6b|R^2XrTm-i%;0udEF+RodO-a;()4qiApYaMVU_f>BiHImbHL z&O;7uvgvNJXCv(0>)BQfUBE2QTsCFIuktX9V3Q?4V z&xS`Kf1kA|gW!~3y=D8W+n2)AFwd^K^cExQj$9G{8GD-k^FqeUc{@qua(KzPf`7Jy zMJ$7VAY}baG1GHL+&=Au*a;04QU`RO7Y;hh)X(}yEA+8bVEoWCz6_bPje&(4jBo5e zO%cR#_gN_cBBJmhCgU$JhvCRQY|w`JR65D+0a3o&!Y# z;Fv5|N!2eIB{rp^7S0MWE^z*;W{I025uF~F{pUNrfaArL*Yz+m#5ck3FQW0Zp*oL4 zc3WfTdZzW3vfsA%Cn1ciTRed4oNOv|*&gOYN-x6TFQn>ULqbJ<1s{KB3Wz$&7SX2 zK7)>9EZBWZWbn!~#trB7A}@ddm3(}!(5%?oEM<-@?A|c?Yj|BQBikD&5SLN?G@s+u}!ep2+ENXcsodhU~Gq+taIM0>BC`1bbmcuPAroUbQg^`a%on#6$8)M_R+>&LG@*#e7onr?s={1=<$1(#lH zT}|5S&141h2HQ!D^fTVe6H@{h2BO`9&$+kTCM%T5r7#b(iV}f4tQ{0!6StJ+xG9EK;fXkRC zvCj+>RTekoFDfR>pLWoCj)RM&LxxB+9=}-D-Hv^k>~F-~58rUWMMJdxVN=kyb7q{h zNNxw_rxDs5v0~6LJ@9>dkb+=9#X>wbYZKu$FX2?iJO{b%Yl%PR{v^zDG9%MYM1Elo z2n}(${``g`!fMKAaP+bE9)icU6*4dV-n9Ap@2_fB=NXpgZ|~rN=V$N8c+Q877V^!F zqh_n4ttC!qDGXY>>`OvaD=gxQ3)r+cR#M`^Mu`8XQX0y@+wJM1wZGYkF9yBf)?14w zKdyt`FuAVx@~nGh48fLd)*6kTb5hbarsc;7DHE9Q1s5p)-1$k9z*;O;cfG4sYIfLm zeSB^IIc!TtR@RgogZVn&{IpJn>j+z?X`uD{EA;jK7Z2frC8|xNPV|be@@nS9YTATS zvu!F{q9?DwM@p`V-ZLytSx?H2*D|cQ43g(jQg%7b-EZb^#*+MWNTo}sE zaKmj`2wBS3GGFWp-mB^Ji%|;0nN}!z4Lw>9O%MtowtWR%QI9nG^<}`R!cL zv6gvNAY;{(SJeoUiD18az12MpZL?8sW1-Vx+u!bT=LdnA%!!@X7Gom0AV8c2zTQ1z zW26P9fiCu2q1hHS@)85;f@JdY*Axwjrd7KGhQ|04?dR%Nk`1rh{@L1Arlrxrm=}$xCxbA3;C7U((#>dw0GV;ucc=BeTFp(zf#j&HV zyYI3Yrv&gw!qued#bXyIibTT0V@o*1VZp)nO*_#@*HR$rKuQx+`kKu9@=>$?EzPh> z;_qFkGBa6LH@55bdLK;P1O)>@oI04pLH-`R`o14WD&ctM&jOYADfp9Kh3?0bqgHAq z^NSTrHM&hx;b~Y$Uso{jmOc=nv8}>*Wc58*Q+R>%Bf`geVY2sQM@Auc|2W{03|=9X zR97E^9%Aj^sHNUwf(AF5o}j;oEXXLT#Kl;4G%15Jp{Zz;r-B+08FzF6~7*IPP% zu&8-Okhf|gw;XF^tHb0;N7)m#O8wT+Z-cv%!YpjuQI}Nd%XggZebvhq>fA~*o;bdb zj=i(l$6bGTfp=|@DX{iU(Vxli(w`o*eAIE9k%K?OgN*mETu4^V{LeAwiUVsS19a@^ zN=l?xt#4J^EXJo~wcNZPqti%jv|FU0-RDC9{2Kui5ZgStnAAY5BBvHV5O|HPo>Dop ztg*6#Lrd#yRHTJ!|Bz6&q}kd|x6ZVGtLE@t^`blpWs>=7)vt%}r_m&5XiWatlWBXR z-%(_i@Gp*Gsl?7Xc@9MjY19Mo8By1kt*yq~zOZPmI})n(18OD0^JCnbo<>Tt0(9~q znXKW!(AX;VF5AO1m(bV|55UFEp}M`ddlVqzRniWl+5y%y%tssZAbii^cnye z!YYGMAtx!f_>k%YCf4*LpZ8}UpKrpWvxTmbNdijl-D}UUb0(QBmou0sL5=D%fJuv~ zx+N^%Al()RRu)C_YoRcV5kSzPessCG#DsCP?Y956)elK6DJLd|ExhF&n8DP~C&OWHPnd8tjxxZ6rs9R0Xw4DIw=Y4sM(6bI2TH_wO1Y*3<9ANcqFYggpTNv} zIuTfYqQjNjgE5s%5I@WBM(fo=drHnQ+O9RmgBv?1WEns*(|=l>h(AkJzGY?8913OwaK0v??zHfSG5(MhbTxKe|rrW zwUt~Gqo|UkNBm8SFCROEt;IS4E$%k$tys_Ny1WXrMpl|ni`PM+-_)hjP7x-WkcaBR z8}x&Dnlx@Rh}uHiSSF(eNH(}Z21RWoE87dC5y{97+`yF|&2|niWeE?OXKgM^#XUAv zGpU$aBFKI%lu(5&@LQL$>o_0KHlWNjki3Zk%|-o{aM#&@ykMWF0Vmth%9^!W;wEnN zG-yl-1d#n1^gIGmT5%AdH99~Z*FB%hp8mt3D7K{Bm5Qx*@9?m%XVgVg%A(%*ubX$KBxR$JM%1=T<7sR-`yk5psH7GAA@R7jwh^mLub7u2CDN+ z7{4%vO@+!gBkAd*raWrR3f>&&)kMq9R2PNcznrR$MxXxDZ>8-^-y$4LN@AkU1-J$v zZlTUpg_G)#Ax^TF3r$V8QwVqOW-Q53#z`pnKieRZO!`_uzg4Nv~%0ooqN^CHr( zx25Y$e1{rbpotS$hJ>$xuuw1=Kf%(+1ncZ6u9B9hiR%n4Vy)?XGVKo83DP>)S1@AM zrZs()~<$S!u8zrcH}*i>o!WuecEcvx|Z!p)y|ug+&8NdJrV5h!{5 zw+f?CwZ+xB1=Z{nE;z=1WJ~iDM|R?2B7U^#A0whqx_R}p_bKgyc5I11EkDZJUHsMt zhty(#+S>z;nfL^S;P=P54%DST95Cc=7w#l6$phC`t$0Q8>7pD;PKY=IO9U}h^()s~ z?&RF$+~6K2QoPf>Cok<4CT)%UFp&u&ifAqv;X^oo6lc^$K|?msq%FUWLh>o6LtXd<_reE1UCz-zu)!BcBV$u5K2W}dpvBduFzgb+0@ znT0b#F}A9C9^7;!Q7r`x^A#a3d9K*C8zW7K=|eOYy7d3{)uIP_w)Pc1QS zIWe`19K(yb)%mQbc&}qRsJp02aJR=rVJBd zA&+*(?2~JDOOO6Nf;OSLw4%(F*b6``S7_eM{r6jsGOzE$k%WeOW{0qdW|4W4AtRHXfcp0k@U#TGAw?*KP z7N3_uxsX_Bke}0R%NLu&KS`-HCnw1sa|1J#_AcCuvUl`!QR&S$Xi?*Tys`R~PnJKC z{rcYFr0ZU_wd{Vp`Amx5?^UlT*0Z;;^UF5ItR}4!Ta#g+qAzTWVqMd2Kpkv=11(H@ zp+%t6Xjy==Jg9cT!wjZx6$Nf-^-s*+-2r{6)qP>;6AU;04*c0BT5?MkskCd$6Pvm< z_*8a|0BQpK!VueJvdu9ycVCX{^_51wqGXPY^#hC30e+2saJG&e8z%%XpEmq(64%aT z3RyqLUHgM3rg(^Nma&@`y~MyQfs@<}6W6&w&=}hy-~N&Z&G%uRt#J@E<@_$j)M3zH zQ(pBv?eitN>f$XlCG-Y}^Kl!&)I31UA!JU)9uh{X^%{Fb%C&BEaTqUs4=YBRTl559Dd_2J)5JMtJ~hNGKeRCz`Z zpFe2g*{=n4A>$aF z-p=K^M`hkLIYVP+DZ#_A_g1Q8LjrY-)Fg*wLcK!S#XHyh9nYE~I}G9#B6&k9)t!Xe zFHpYK4@GfM$-x@c@$KMif2ukbfOQztR#^s1uWY`POlYV0*qI-DF}f&FI&g2 zH0MpOxO5mer!sdnPB@UM7lDUMXN`E1%bmgch5L%$UGD@oPO<-QyvcMrb9;0k7=2C@)RQ>?0ox=nVnj znb{MYBz9d%elkw%G#Tlru*0W8JCw$LlSrrKhQ$j!#yXs(9dW*(QwKMyl-}KFs34}#GrM1mj|rf6JlsSyVQo!{`k~bMB=)|1xHku#K4DeUt#}SEoBkHI+90Bp zB{@NuRv(v{KzrNN`q;dq!=2u6+Sk#iiZ#&b4UoC7bpy-e{iETm-*AW0=_;$*B4VcEnVzT=bp*%1al0#-N zYiAm?S$|%9&0uJ=R@aVc?Se*0i&lN3H|L(yp2rUFmt{G+KArH1C=5P>wu(#*N>&l@fP1>NYeot``lp`iL_L z>Z_DJs~?Zy=-r4YVSuguyOFMR@FXZe#6G%YFY%NV2BY_}Y%GA%xoF-Df`eA_cBBV3 zcYRHoh=*E20o54-S~Po6L0(3hzfD;7@4Lx~c#JVZ(uruJ39vZB&mad+lke`b7;p&5WWTF>1 zFC+758zjbCLS^APIq6hX5Px7?dN}qm*_XxOG>@0fgD&xQOlf1BY1%RS2O~WwozIo( zpHq?_^XMZD^K~(WS}rx($U+*Abz^vo0dKvXu7}@qUxl=;l6xJOpBYWfFXf|IzyY!= z))+R9ll>>w1zgQWJpzB5QNH`mPX2%TjO*UvgW?z;>|TMsA_x!O`xIh3Y&(G?zg5oj zJqFUCpQ=>{dJ7Rj>|}QOB~j$V?`dxTOjom?c_gXy!#Wi^JKiAkvbw`9X*>4+E&Rr} z2vmM6PSwR0+)Xj5SXy(wuNqUfiYc@%_c74MES28cRkwKFl4<+%fcz0QPJW>M7@ z&1lMq;x=}K8%<5Bgh7@ZCcT>ctfios9vFP#X{lvB8Rl3Fj_PEhna1|I#8`N&A?4!9 zwH$%s=?_MHEXvHpO_n4M8gED1#5Um?f8s*x8s4=#=$SNQgI^8rmV3$cWt2O1 zi`)g!KY_ROc5?b9%WZdfOD$vk87Z&D9o1`a_3;r6Wc-2UK0DYispB&0F(b=?jT(-H9on#q)K5b|CjcHR@Xr7y*D%Fot^@h6|GXP zI)b5`)($ircFB>3@Q_CxGhP0h9KUN#PxIg*WS(Z@_|s8BY`XrXHH!)RUN<_e>r6Y{ zV^1@}tGfw3ne} z?J}a>j(4^DF+zaxYO&@@@oSY$-uoNM->{~vO89M3y5D{ zEZ9&M-2MTY$r^r2yS8*V7LsMl;_^kHG_JeR0WCYkXTpB_&_NLdx#atnXsMd32Vw>0m(Az1?i8?H zvphvl&CNDCAL#;=OiE|4S*iJmqS1!NXTuw5STVVSOGg{&8z7`z2M6}qxUo8Z1FYJK=rYQmT)j=>{p`UGgGS+P_txc1W~+VDE482{)I!J_D+H5o5Q zjr{J{;Qc{cfqXYl)}}NpCH=EoF$t-8OiO`1#edI|wVKo}h63$K0aTnN|L@}L70KAP zCL_B4`}bG;Y?9LY!l@58A9IiNvu9$-m*w|wMP)3`CEE5p z$c$#GOa{-m`xcpAs}P5DWmgA5aw6sz1a>)Nmu>3EhmDI_f6|NhxJ5#cbeQ~68<3pk6sSPI+}8*#r*ZH<1f`lUTF z*f9k!{iklgnyuV&(MP!#Z9J^=u-PIh)QxQ`1k@{jhma2*m=dEA3{w8#W2A5v0 zV2D&yY8qKu%KHx0a0?RE55wh%xvGfZUt_LE7g-8M5j^C#0q1xIpcHyFXCjTSL>`#6 zvQAg-@MZ%JXGfk#1~^ZuQb8N#nFYmi_n5eR%JDgeOcC^_f)ljHndCVKIoltgH635J zdxTjylTOE3sq_+q(n7iZbL3LW&pWxxZ!_%!Jm$;X2C`2fWTFk7inzt$hI56 z3{tWB^x|Y$+PO%|g}S;DeDu?H@8os$`?1LqfYB~pvWJiB>?>XAaW!r>s3>TR_+S5? zBVGl{?cemPYQ0=IR1UtvZ&R449G9-_*QhMk$61u+#aO*d8NKUbfKdQd@RE@up_$ z&SIxT9K&L_AEm^sqy4MJ%-h#$7n@`JJVew|E;d!9@m=~ZIr|Bx9JZzb^Q=RnRX7@) zE~lz1Zu>*eg{TxpUS(H~#^y%C$*GbIdwoNuAr+Sg3jMOosl8-MZui2h#yFyY>ff*b zt+TnuhaF!}r`4|S2#ENT{&QH+>2Ceqs+#sv(n9ah?BCe`!`@d0)zxfm#*jd8mp~v$ zu#lj^-Q696%fa0V7Tn$4-5r9vySuvwpUo?|3HO_+n%^^3)TvbEoZh>8tzOpadAhs& zt#$Oaj3}!hVbNK98#aoG45Qk(gp=&LuB0^aws75+C9CQHF9UUFljI?FMjrgu(tNe0 z5`QdOQMW8g0SnUD@*Ac^1}aN4K}rd}k>dsxdFci7NyvGdFAtJsA5hq^&Yc(|r6h8! zfKE`7SQ66w-hkw2i}Cfb9nnhO0NQDL3A$!7fsP5Ooc8*dr1Bx2Wj`MGgdrxY2`Jqp zv}b@n+J=7`#-VLOU_(LAH>lft<6nAkVb2ImkoFM<9D*$tsnBTu3jl}nJUXGowY_(i)xMl;eu zo|K0Kg=zxDahY635RbtO+sH^%qul!k;1>7?yFRy{J@Ko_1RvpMc+!Lzxg0Hep9Pt~*=}?ze%~6Q__WETr3;HuF?LoO40^);<=fqC1tvuriSnnPG^ zzKX>lrbJgG&24fkW0SGzJV`mXj@c%D-!c5PJAG;!G&Q3DImAvluj?Loe*`?a_F025 z+2p0SEOHBNNaE_$dovPHpgLJb)#YsM&V*E$o z8c5WY?JtQ7%7E&*jeLqjj3T0>(HRu1BaP;K_p((PWmR7eDfDa?Skz?>kVY_G zX{#WIt`Y6X-RY0s|Hwh0@4S+H=d7W6-rL&z=)a!k4j4oQq#jTtq#_ zxnL+3WN8^uHP;wCvFy>?Es-Fudk~lV62~4& z)QE&g4{VQ@TU&_7+#v~h#TYx^r0G&8utONoFG`UhQACFJcgu9YY%K(bj{U+xGbU(5 z?*~*qT!KpEVRu9t8)OZeyWOy#pv4?nAFu$#WJMHf z;8wx;P^+SCeOb})6sl&aBd+Cj=_wZ1EC}0Mq$V|Q@jCOPsjnnSsbNZE_Om$nw?1v| z$sQnVyrt~X9VXp2?2Y;KKkj$p-LpAs3R=NBGsDuXD(TGEHkPmXHP7Ta+VNwI8+Fg{ zdvq9GVaFsIbDFbrq(dO;A5Q}enXM41Mb@U6%|diG!0_k;11!ENny)I@tsW$XncyQ^ z^^jV9)~_!H)Mnh-NUn=1HL8p!i)z2Vl7~dfu0YW21!rZW8pENY=+tP8Id2|Wre4sT zIcd+fV3T-6{z=hu6CG8u`SV8GePcS2G|`;!bf|}unOcMz4eic$BpZWrb$!kL*S-Ey z+|wnEOq%@yU7~fZ(}|CA4=>b3qX@r5w(TXRI1}HP&H_3l|I7bwYgzS(jKazoga@un zUmKFBWq|T&GUC~87-C|#97%EvbudWZPv0K%`cqxYy_NgWt6k_ab9|=0I!#&x^_~=% zZ=*ewgSD1BQJ{z@E02}iTrZj0Q|(_U=eX(t$%j)#Oy(l5L*)#_ML=XV?2}_LYL26v zmUWsipsZVFsAUVvUQK@Mwj6<0Qm5b4R*GKT+w`)Kq3Y%?#e&$(D|2@lz>fb$s>CRv z&1CsPVLDffDC~=aKP~)*!iF?0HRTm|oRq9e`Ma%A)r^G`598S8NPxv?YYi*D-VGO{5FB$5I5=cF$QMm3!y2W;+X z%Mb+KxorgRp>%(Y5tAS;kVFIAlVCfZiHy1t8i|QGrLLD?e??lga|Lics!3a3s#)A& zd#;|ij65OO?WheYr6>=MN|w}qlLc{B8A*H2R(c(2AKNfaHa?>g>Tq9KLU)f?vNpE& zg?Mg~q?yc3L3&SE2u!3T#CRs%jcPbqfuvmjHvPoc{M1&v)r=lbgDlxRLkg%2R06Se zUFQc6F4mN^j}dC3Z2Uu318J?_kpZrZFrXP01uTH}?}k`-Oc0~OK!NP0AHN^5c0P$6 zsX0{{llJ{Ow-%N>-kfY zym+_ytn2~tWv~ncO4SG?InkgK@cva{w9M$6j+N{*+l4r;L_-;-3cJ!P)p}A)4@2d= zQtjJOt}X`ntdTCI1E>VahXf{u{Q{P=-fq&_K_5#C&TeUi7Pk%MBi-V@ZIew*y{sNG z5wZyKV?-;=kBSQNfW1hC&7IwU!4Y4P4&9R_!f3fnn2j!1>V-LS%aziM}n!5lEd) zZe?;bY-F=-qfly0dg~jO#+kW7)D=tREm3Z1sAoc|pV%TPv@cmm-^>UrX+tBA`;gWb z(yX-SnXmM0ODrVY#c#JDTP%vcwL)e?(G(%EQzB7C;gzOS05z=d1(w0B?^)KGJFsPx zlpl9jU3OW^Al{PM*NTZx!zQqca_h@!r;G1H?@nT5l~SkcN|9t5iWrL?s3w+DFxzE} z5Waj6B=;UeeeGu$QP4lzzevVsjCLUBm0!FnTETBL*&Vp6lF@=;Ya?+)#I-QPSs~?T zyHIUMT|(MN-p8=J#sEdJfsJHsNy`k87$*K23$y_o5hLjlPI2CIrf zi!e0<01rmj+wN*6I^&B{Qq;le-U5-jp7cIk^ONv6Wdc{gH!Ohq1l>{p$6aGYoFQ#= zLpomhDYdk_azg2&cwIzR{@j9?6}gd%pbGl5vmoAs=uVwMV(D9ZEq6~DFw*y)JL0-+ zq&oy>p`-w<>lgax?ITgC9tp1;NkY~Hsc00sMJ6w5KJ)S9ncG0`GKJ1^HYu8~efOQT zPWU9bfQSNn7*MXJlzjq{_+VX%y{?Vg&)}EtwS>cSkceOnCHtN@CHusIWI?Qxbgwh- z0>mVQ&Z(=)nx!raWHRS}W-)~-gxg}$QFp+`E~= zU>j~qT|ZIn%8VI<`hQkO^7W2y+5~HZR$5l(z?S=tu+<0#!>}=pnhOkZ~XAM+Hz*Z<_L+cdRAnt!FLO>)bkN4?D3 zi&d1+*>1LNV-jGq3?TfGHsDK#mw=mJh_sQclTsGebxV^b3KNMi-2A{q7G{X(Yg;90 z^E8aUX6=pFHeB=Q44d)|6}W8X*;wX9w#v*NtCRdk?txpLjN4WpD!vm>V#!Ebht%XQ zve}6ha!L^Agw=iPF|jhg+kDNkq$_vF(m`fY|CXjxXjn0vNm?~8Rm9MUi2<3V|S0G0Jae`=1CI}TkYwu9Xc_5w} zL8MPkn;9K3-;SmdnXV9F%j`q>E(DPpMhiOlhL$f@jh|#aLqSy3F5%fF(32r8Lb=B6 zVd-ENLB=GGvrk5eVHw%RwOaU{1zkyYdfCwRuXpiH9r(H(RGyJu!S1qgu94>(8l@0u zm}h+=R;c@!6;uD26+`j_(4v@oQALOnOOhnxUZji0T4FlnXi*Zhj!x$OOd?V7rZ%Lfy~gjTU!f{OkY1w4j-M0unwlF z7Rk_*Qc#>B54yn8FIwMB3LcYR-B-r2Y4reiu|2ps6`v3SE2jsDAL0I9MPEiP&m`G% zFJ++{wx*5ssH@gOqjAyu?(@Hdm-$3^ss6MZtBIzjJX%R&VS#Coo^i;LxXPN&ccB0Lq3&) ziNJ4@qgWRzyR^13s%`aGEpTA8EXNcPrZ;?50=k+0QpyCMmZ01VFSR>`N~Z+9#-2(8 z;)gZ+Oh9cIrJk4#i4IIN*Jv>(^NWDc90CK$((_pT^x)uZTd`s!A;Na_P|?oNQa?gp zqS6ISZt}#?_e$J&F`+ECt#XD&5fR{il8V{oSp$AFrTrAf6oK5rpNa6zX5U07cMzm} z2vt`k9yban9$R|XPMC&nBEo2lv#oI7R zRG6XX8tkdjAn^hUxTh)q5U5c~~92K3EzI*F3* zik~NJSEdY<@9jPd#^Cw8cYgM^B`q_@%Ai$KthN9xdWZ29!VgU=3}uN<=OohJw0~#U z8ezGdh8p!T@=i%u+rx$z>`4SK{(4;P=n+XGBt$<*!UQ8_oS=~_b$unD9S-qI051l9 z6mDnaLNjS-;q05s>(evLv8h{SJTQspdAhm>C{*!y4I_HTj0i2FO*Q^+=}Q(C&nD*J zEVq&Q+G|Im6&SF+^7*$v|GNNZ0xlmZ?nd>U14IUVB4sz%(fl5zp2hP-e@i+r2cI)u zY8{L9VG*U1!3*`A>W{IzbB-XxN6m+KPe$?zXc6^)ytm_!A&m$QVv>~d=_){2kEjsq zZ$pKt=qdTS6-d@k>AB6v@w#^EFKBfS3z@>i4ZA4`GG{(F)dvXi^-X zV^tO?SA3rJgr@Ter|}_b19xlLImeRCSE#eNR6R6MDtEzJEOol^r3E#z+I~pv1DB!0 zy-R&PHBk>?F+t__tiqv*wb=38p!jmPh&DB-uY{^2R&K{hB#cO`qJTieAXHxyK%*H0 zS2?Jb80@>6z!D>ts^%y&@k3EHfEp9J?~8)+!W1Ypnf0C1k3rzWG-oQRWwQ?1-icHdDpzHE9DBIvhRYV= zp2sTD$|Q_*-s@I~f@#PcKr=q#!@LD>U6>UHOVHRbrbWTdFhNzoKL11K8%62 zRy4A6eHej;T63nl!j)=C=9*Vhp?%lm~SRMpF znXA8Jp2EdO_Ep}3gN6JK-gtdIdrg4VwOdf)OFRlF)sO4?`-?dqAz5Y1tKwRABmi1+ z(;@=AuJxK8*$AS5K29gUPUuY&1M~L6&C3uXwJ(ymkm~csHLHcd&4{zd!p}_I31!e$c=d%W{-Ez0*g8{;2)s z+RffvzD7ygx99G+_e+r!v+?l%c*DQEh5nzt2>8;WCE%SN?~$kj_R_<;rC)faZ?<~L z7EN!#(Vm}z@daXB0+7#s`}+tiqJ@P)+?;cs9j=!|^ADzdmaaNm(EY}>SAo~;tKXWr zGMSH#!l;wtJ{`j*H4Pv7^*Qb+bbopW+&+Q^at}CPeqQ0)WrbuMbKln2nP`7Kv)e)c zs^$FtD1Vv~zthb)Dt~4O9%F0}7l-A(14C@EcGFcKO~pQga*F0>YVYL%+ZMn%<}uW5 zX*SMH4yc3|hOyCtU(Gle<_%a}A@=8u9)z?TFp0>n=w0J->qwcr$)Kj=2|voWs*mu# zA(YjQMLGb~x7sN-)!3jA^z8J?eEs@+m#5Q9kx8+707tz!XYtUAroxDPTC-M~((iDQ z7FO*H9w|XZ=#+-CaWn!l`N?_ra+$+*Xh~vn!S*WRJy!@v^U)7>+aG0vP5#)2o4ABX zlF|+^bU+tO~ z6y~*3GVwaYb|`GZ;sWuZR&1904MmqxEQ>`xjCYNe?K|RH-v)8-Z%;E~^8w6D3Qm+1 zmuX-1YcXc(%>{@oH5x7X#cS~gj;I4RQ+`x}Foj~%lz3SeO(o%2+w<)#zuWtvqviMU zPQROv(LXUk+}X^U0mdouX~IO*b(fAh*?g#ZY zib{g4H?L*%7(f?(u1DXnh!@O$%JtvwXHT+#d-mr^ygJDDP}alNt*>sF*{ z&bdmTEJ&0iWq@*UEa%kopy8qU4gyw#y^mn_!2$PR!G)dJe_oIAbY}K2j&Fdbk=n+Y zlmfRZeKe6_H^ctnM;(z^n0~ZA*%Y>s&w0~U&&<+~AXLiH!e_D@8?!{?H(XWocJ$^$ zf+O>AdO&A-bSnVOaQu0k^@XwjIe@-Da5xHSglVq*x_U8xllEG(wHxKd7vBuBiR{l? z374C@$vqoy>ktkn;S=c}q%5O9B{d+6Y4ZjFHwaFBIUgpj?=DMp$zg@Z_+$%76wmKN zvGF~QXoB_?j)O)fbuhN6PIC*7)9wy{5cKw$cf6TLq-vS7-oL9=<1+oRV-=YDshI#phHzP?~F$DaE)cs&H9HOL3@(bhL&_l;A7Aa z<|0&aQekw`8O1{fF|*d;nJ%{}wUfMP576X_TItSG%ZBUX<7lVC_(lg%3f+c0Ps!w{ zyTB1n71K-{TGN-pJ-=zWNTG#fW!a3F`TD?gXvQkgqocvJ)q;0F^eu?>O4&Wz>2{l; zqM74TI6+;7d}b$(ivs5U-m1|QL>?I`rq}X0efKuxntfF1u-{;L+B?k%TtznyHOLeybYRZA5ooCxe5b2o6p$3Bqd`sC8JK68tH#SIsl2w7+5UeeW7yUo2`$6)d6ARQm8Ilm3#nrrV3BJ0DgpJOc2%GZGc{*5nowM z=6hf=3+aZYnMOD|r*SrH+2?TRPV*ERj-TOTI0mVc9H!AhINYVw3|!1H0B?@>%+j|j zzbGZmfP}%~yrP0jzDDI*NnQa>yZ+$JHvo4Ja%W%&U`T3gX5IsmL@Lusn=lGT!ME$c z40Bgqm#Q0Tg)VAP*#*@b-*VH)Y4(Rh;OIlbMg#C>&yHCAAl6~{J+{+nv?0_h3Zr9i zm+AqunGz73LB^sm(bUvK3tp7E&DuHr#5LBU-C?T-s1AenAk#VJK8aE(W3(%d!aBry z{%70`hGu_{$m~w5`}Nh$VC)^$3REqR68U|5l-l?tnnE!@4!4JQR9+#@=#t5;`LrMl zAJfHQCzur4mJ5K{9{8}`H+wk1HIVLr!=8jVM)`L-`1fa)#D52R4CKdQT9PD_(aFYf z@>Eh-*z#DI^>&-A=Pd6~lq!0ePv?3o8js$F9m*|&pN-|C-GE=KIrm3rZPrtPE_w$C z?5<)qRUI#CqJE6&pR~n>yf5pB)!nEcp&WWB><%pHD5TghTXY}Yb-&YPzKah;7t#(^ zz`~|EFHsOn8)TsDi>2m^zQgCO89@gw+`c8Blpl4u8Bh@oD(vgx#E$@gl|Tf1ceE;| z+i!P2y{T61G!pLI=nBC9$1y=egMFK-2XcM#qnIM&5U~dC0IkbyOw3@@+1csfp#6P~ z?gq10;irt0R=z7Y5nSi97+3?(%wT){u@v*QspEArIiP2>elyYKc$^#NT~TVV2PvFpp< zm5e)~*lwq!>{pTjCngCPf#dPX;rD0jr4i@%Lw%b%@0Szoa4*k2i5FM}z+HS+Zx^*V&rMwb*HfatA{Q)vxrM9*)2!nXF~(AXqe44`DC_U58$ zL!*qK3o?M9ptgAt@GyR9KGNi29olrpE&Eok&rO=>7h&yp_ib)oh=3-HhP|Wx|IL;j z(Oujm@qV%^l8ExJmGk>VjKHj`!>4 zW`ofS;SLDQ)Z@3@83e*FS)j_KK-U?`}6BWbw0V6wVj0w~7<%Y3@l9I~!n z08q{YPPWdOmAl(zAXfT7N)>atIoK&1=R1rI#;_}^-hI)q65wwbMJpNMkApZ3}jQwBfAQZPoC2ItbV#R=;cU`#-S z@cK;uOa)3aUq9Y*kjs0Q3#2pPoME!H(#tysPaPu=rq6+-zGN-COr|dCieF`LK>RY7_?f&BiPnNa!>!$G$B=ZZEogSN%d16klA2vMt!0jA!J26V)tSUOs$M`5k5y;RLs9ML{w3S3#`R*RNpRS# zBFdBF)C_bU(CLuGGf_dB*w?SXuU@=_!)6YYSa3WwN@6?d$uoIR>?)m}QJMt4&T{^n zd?Zwe|2R10&iYKXP00bZBJoRXH3X*$IXZ^Y{#q(Oip>ews)&9SqO8!)y^_ zW>Lx;8V^o+4{~=uh+#|{l23~krk(gZ=vft=lwYNl7j`-GalXF~J8*a-q9IU{>up1j zaP{>*mGNOIMALX8hCtYKB7QR1adRz)Kl0MLmHDV+ zmPm8hE#w{u1*6j|DM+OQ8q_t^)P5G!oPL^6I_$dy1Hb0HL!(gmu2Lty6x!<*6XX^O zmoZX}hHd`n2GfFAS5M(=*DGwyO1EcabIh z33cVprqK-G`_fi!_g#c2hToMB*JGh^1R&p{3$t5^*~D^mC!S|vQFp{! z;s^CjK7=+lH`^>+n$DrWA4;%!-q06&XYSslKeBdXHCbqc9}#o%qxHP``4%niW0v1v!_HtVu3K4nKhq>t0I%AU~fs}-1e?irv$}aBDv(qLHC2TN70k-Wvhf}l* z=r@?3ty8H}8TzIv>xTy?U0Mok-t*~Zd%4F0IdX^AH8=#F%U!`_<;no}k)ZB3Rs=YY zID_50M{+lXxUYVq2Qe4?i|lL1SxKX!rD1d}A7imJMYNW9qU@0@Wi8l#R^ttQF+V$J zg!*Z|y#wqpmE_}nIM!0?@^{Z$@Vh3MGxhG>#CC6&Z!%fU9{|BR1u(^4Dw&8YF^|Jz zNbj1&UJmP?-*+`!vU%XlAj||{(5ECd9q(VVax=ts_1W$)^wobvS1mDiPk07IseOu9 zAF=@msTXacyWK$uDMgZ9#B|-|R~4t#>|y$Yd50f|(2KO&tOcHPa0@-yOcUl?v+qmL z8Q}>LNe(TdfA?^Va!*1WiH_L6&Q;f9Xmhv~g=sZ7#HpdID~)ECFCp$+yQ;B>oSlxm znb+Hy`?WV4izw?gY}poc2WWTnfF zhJR!5u3_# z3ep6{-r?)@s#VH8z!uYoW~f-JQE*|h8BE;P>0g)gap-59&E~e&rxk$1E|+>C_HEsz zK0G$#j3TaHF5Fp@`Oj!E)b3M5)8S-Ym&4O;d7Jm)imI|Nsx1X;&8qY(#ve+<= z=$-G|p{y3Rgo`z>=nahxFqbYpb^4-nBn-X_#Cg8k-8mCr+%gUT#WyBLjYCn;Wml~X@c zDP?JX#$md>1QJOV$LS-7gQR;P0|# z?{t5R-hnj$?1MmtE(?(NcpF3%Wc+3tb}avF*5u5<0F7)*Q(;WHDH`OPc6Cc{v|d5; z1~oPo4#+LSXJ2}LSF_l^1xsS3-ppvcZ?2lZD@NxSS;=(`#un=tmEsL}iwk)P_X^AD zzIc&XIF?5H;ojZA;>X7H^dS9DcR(9JFBs-*9=Oh3yZp0swqsu+hsN{`u&6BpHwAJ; zDJ!7q?ajhdz4C&^y;^`c4N2o{-h})4;=bYL!Y+uA0)j*VG-*<&vvz(jE|tLcDi&Oo z#^`$W1{NFB@>p9g2zzxOA|R-uLt+<*Z6P@C9Pe*3MO$ggp$z964i|EQ-r!InpAM6Z zU$x4;soQ9{)MmBYa+fKV{anWS@?(8^CF@cv&5M92721{KEM1eClB|zIG^^Xw2KgZj zT3M8WL{wOGh6ue~o@knr7x`f^H}}kdCg|+hVo3y6v?WC|-1OuX@ob)_+&ej`BVVi8 zZgT}O7xv32s#b3axx9M=FrQkH`j-#7qN(mc(}>oX#1gqna*j`#(F6R3CJm>JHdJ1L z<;nml?{{|e*)$6I*PTjb7MJ%oS*-R~LkJb;DU52|RdNC7H_cv2Js*A&?`L=y4QplM z(PS6moveiouDsb5nCO0|eb><+Ao3D89ayDK7yd?8_AAYfH@@A8DP*gFB(9 z{M(-MQ7yC6d6p06}3X*icj(?VW^ZwkM5{G#7`p|aI1L}fxW#W92)wN@59W~u2BtTW@rYlZgpOS#k_ zlKn!p)ut~kKpx^8U{1FfVHANTho@)OR8AbH>>U{DMaM9KxLB-z0~{6r^o%^OPNV#~ zgCjFgDhS);EjWz6E;hP1R?^g7R)0xhZV z3_r2{XmOtQd_`$9vti?gyqW|J-h2MJ0_!GV5oso06G-VJkKMT8kb4%q%Wu+%6Docd zkowJ8c$j4OLoLAeQ3$&hp@Z5XGef6D8Y`V>2%(ysUIMecWr=3)NUg(0u}kPVxfm;l zhHly_Qq>E)5}V8b?to0h`*$C}U!UU@|9u)>9h5E5xq3_x-Zi6}j|3(u=8g)_a~u0o z?82E_2M}wB;0)K7S*c*ANncarO@H7`)JQB__iSA0E-Tz7za+-8g^y)PD5Hzr+|7kQE&pms4{( zALfJZ2<De{*xkVcJa?#rCkWJ8Vl7W0|O~nIvWr2^mHqSVziK^4^LQZ81mm@-_hk zboCHPh7rwM0JPD@Go^R=svN(ar8J5?QAR=P33j_kOq1!IsglSFz#+^PGe{hHV~RZB z6v3S*eAr|Z7GQ|!Yg^fH<^O%N>VE%keXygVi_4$;N`w;yF}5XTP0U6E2 zZ%+iQwM^ij@9Nrt`P-5J9=zvCs~iA2`AwC8ey%4CEw3;^zxjROWk~t{ObXaFVSe)x zz+~2+$XPER0C)U0i(KqKV+UY&{k8MaC?%#g?{}s@w?pvs>zO4TKh;Y|a!=N2PWjyxh5oRn zV**c%;lKyYfXN$;+fRY<05ex?O(_S(ZwB0ol=Pge@`@t9$w_MLQsGZSYnsVYvXL)K z>KOqbYW|r)HdF*A=$&p-YW88m|E1w~JPe?{eOUW7)Z;&LrJl~tvt*;rKCnDcsWD#X zZ!3-R{`MI+BwqT96aZk`U9+pD^@;QGo5^ zQ4V|I_gfKt05Bql{KWbE`x*U;7S;BiL%PfWERTeCSB;VMbw`NQ-P=D&vJf8E-@@Ss zzexj%%t-JD7z5~W0P`EcjL^PnW|$E9&lKO?Zn@)r1ArIO?|58pc;sEuE(P=A6G}4* zKKP#W*x3P2vrFIOUu=fADG@p-zV5|#`A;ck->M>yFABb)ri`X*bI$x38pI#6oG@A} zgK-0RtqlGdKZTpw+HLJ_iWd@Z%@E9FoA-Lxf~m!%C%BADLK?$dRRzr4*rWy)YqN4j z|49>oBXI}j-Q8l3j}Fy<(~I|;s+{^ftAr%squV~c`blJ2ALZ`AmD+El{pvfn9d z@_g!H5L}SxG)Xdz9yb1MTD^l^dw0ZW=nnr?FaP61Mi8#xK5co|Z~TRCB7iFz<4r3? zIP5QH-tMpZi1KF>gQHwWY&b%XB7f|l$w}%%P+-r*&Z6c@j`e4k;$ynWhgFFFw`n54 z)`+60={B1nt*iHlM_!2g28>PWRc`|EHgq!nFOHYB5L4svFC#ZP!3{DQ9AvB6X6f{c zwNJF@NCg8_{!Q(^p$fd79-$t0hv4!JO*FY*rR|&ScxPdYToyajq{rdXh3hk8%)3CM zf34a{uo4Xp!=;g+i)ziJ>T1Jg=DO$;ImFXx2Hc&iLSHjA)f$vmfzL5P?tJgY1kuQU zO(x+{;`FDTncMC>OAcxv!Sz>SC2>L&V>HTCjy$pdIWR1P{|^+5Q}pdkZ#4xxXHU!f z)$DEnr)E;R4MT5%6bL96Bg`)_ET}r7q#W^!XQUt`|Wc>=zVf~uI8(UI4Rhx zq`Pov#4**?a@yosEmFb+8$w3>e@KPlPwq1N7Tp>iilFh*m7(&fWi|55);;`zHvP)E z?LWg!k5Pb?esNRgrwne>5!2-}!8sCsqV>;oKo7m5G4AFt?F?!(Y*Ghppk@ogWoW$k=fOU4>$Vaxvxx^5&pqJ0lG{bw^#6K z(21g}1|<8gK#(YG`y=(J?Gyi}a@Q8iyiD(Sn+R;Y*_oL$m&{?MXCFX#H*D+Zdn}%* z+54GJ`9n&oGG1#ie1A#(uMhsH73QjrTU-rum%cl;p}v4JN4&y^%h&~73*#SF8Gjnt zWg0Bdn82t`deiBy$}{9OSdQib4=Fwqc5kTM{|pJqpcyi&PnM1BhK@mLA!h; z_3~Zgo#YJiIe;Lalkx2@Wofa|&UZb6Zd!m9?@stO=Kzt=qEG!VDcR!)=Dq}yB!=fM zq(WV*`i$btI6=H=Q<;)EmbHF3oC!}hY`mx@jB|}xrsOeqeMUtEa0KmR`=aR~?=EAB zl{4!dOCD4%W0WmbOkeu>0>r;c2MCLpV+>5YCP6#BYQXpF*u=zlilnvjyh zOJ11GJmJaww`nG(AZoFr)Gps@!r(8${bJaDR9NBw*6d6|)QS$w;HWS@=9u!1SS>06 z;42BxzYvtL^2p+yqYMk z9y@u^`2x|eT~SdHP?2=9Urbc^mK7x(H#d${VI3wn!?t@{$C?YX&s8p~F`*xh)L0ft!KPGt&pmI&ymH(UmUwu*XevE8^m)-A8ev98 zQE5%GRVMi)o=zG-5f88f!2_PZ92&c(i0&|=QLkU{sDGmNiAsnK!!ul@apf7*@R#V;az&YqBW?E7Bw%K)`*AN*M^qmPEd@N+I6+ zDbOW0g`!h3FCSOA_dlyVBtNRK#D4P2u0rDJV)-Z|3Ck^673wwb796k8R@n9?;$X`K z$l7@oi52-l2F=Fx0ymWQs=asP_dOc) ziG|Hj(jy)<_Q~S@{=z2>><#Z#V8G3BvBJ)arbycrmCU;UwP5jwU*HABqe$-wj%R0{e*dia=@))bZWaj!!QOL#%^tO=z~*)O z@8UI0T#Uv%24gX=f9>5zWBBi)29LT`XvgE*&090twOTQHzDzL$j-@Xr>{kT~9XfKx zUnyxDyjAkA>VaXjj;Y5s+TEAx^(C?`DL5IbTrhWtA4zzW&^Fbt*MeNE`9(1Y#BMj9 zv7b)dc1rjYsn+djMI#4dbxABw7S4y)OW{I?U+XEVW}?Lryvlmo6+(I-zp1=SyHSL3pz8aap0D; z1d+&OOb~e`(yUn2=;V&Y5g)IT0(uS zXuaQe{zQG=VeDB!BeKegjkKkLbL%`XKb_QX*i3{bHF|;I{bBk*r;Ig7gt>4v(?1AG zDZHYlO3bhh{D~-k*(5+)EWuw#+0tMH5Y5g=8g-~5`4I+nhIOuVN7|;IhwD>o=A5RH zZ3#kqb1kzE)JCxHlT4&&gq_BI1&(v3O6f(K1M!lSz-x+-FJJ~h8I@GpGEPVO^GE@OUmP*Q&=@VDJw4`eRI${Eifzm1|A(!({bq~} zA&5{(vwQWk9k&RGInlq9`q*|R*r!tz;|d<1+BaDDW(#?5*>V~_&@Us|rE?5_10}1c zn_E20sBxYafjEm>rV?pifr-9?K~MbcrT8acK~%nOJ{pnwW)q=HNaKw;t|{$nY8F+oSY^uM&|(Xn$&v%VrlwKBvO zIBw>qKCTq5r$yQ&pP?GoBf_-cnDz@mBc!YmK4IJ@Kj9@2jESintY1rQrqa)%5Orlh zD9MHo($#nu;-8T=YzYFO)3gWyS))eBwxIk1+RP42!b3L_OlGqu@&aySs%?>Z2}HKP zY|bI>$t|K3yikDSt&|c?2rAe25;g81-PBI1;k1~o5MiY(Q<_nG@=^Oa!{^q}!@1Uo z10Mz73gy@`#p{_rmw%Wl5yswi;THWk5{TPhUZFFS8Y54IB-E)GRxrgI=A(y?AqKTy zYv3!J@a~DofHh%M*+OFR12&w2UneXs6X^qVl-DiOi~ksDU7A2LPD5HEL=oOuNh70f zOAyWIOz3ny>s?R$%gedSlU%>WfHNmn^XA@VXw}!}PUA1F#oW-iDh53bl3>oAIIJmc zDJ+|JzfYRqI8J}HiI5X%bR#lBZnYk#RbCpvBi740v*&mfvv3uM{Tja?oJGa1M3ZE} zxxT_$4vL6lWkI4ilrm;N4;VZ`%I;n$q_K$R!r`ja^-#FhZXAmeSEY<}{`)CTFLqEy zYK}B>0_)7o45}FSs(sE>Z-?90QVUjmAXDY6ee=tAwgB-S0oArG<9MX^TUKY9SpUsn z8@_M9Qj|4+A_SrIZ=if1-mv4!ba^sZr#R>9l9$bmMc)UKuy#(>t1sP5i#$_Qlf3L* zF!mbSURpP!5qE7iv--U{8v@xCPv(mE8^Gr)pzKwQaQ`U%dYJJ73Kmms`FXdVB-EHS z$wG{LIVscg%^~v@RG67BPTzr9Q}c#ZjD;98vx4TFw0WH4z4#50Ub#^o4ir9T z_f%syWnEynUZBPJ^ESE8z#cI8cI|H<{0LKAxzz?kazM7`s6c)0?=X-13rk0=G~>K$ z3HZ_WzeFOOkPM(t9kJE46K$!lPk)3)_6_;5L7vB;?cDJc>&Rs5sASu7Wp8GR4^lKI z&Yt8fVCFBFuNX!aoE5*HvXCn_sQSh^m_SrIpUkC)@h)(NIaVZ3LmK16E#W0NnDq-( zdVH?kWxZ)5c}qdea9hoFsVxn8`bemW(X4$NCBlK|RxvHocE6Y?hqu)k#H z;b_CX`kB&r?lUjo4-&oGr3#E9UD6#fl9~A`>0l zSZtEM)V*Mdd&y#hX}u;6Q(3nr%W$>6be?S6xkEmbVgtFEj4W1wqpzw&8LD$qR#yoz zXe`=@r_0?w+k+fzGT9HF;2}PqXgb&svcnRB89$xidRpn3XY)O;>Uuy4b?1C|2zv7^ zQz+0$U7|%A(LI%y{R~h;2I&6;qD|L|n*9rRYBsec;7uKQlG~Oe%!Ry3@)pc9ktUhl ztxonLn}|YftKI2t=J*jK-WFK@$)(f3Np{3$%j2(^(H`59qV|^K4E9A=GCAHmnvHwM z=$K@8Hi`$`l@`2kaF@A(I{InYqaC!{)m`?@)}J=;eYz8N9RCe+IinT81XEIDtCIoY zecPhhZLciM0mn95Ao8J&V9j4|c%VVsMlWmA5RT=-!{Gq>Yzn1t8mVylZ7#2oMRI4L z>G*~C`HbnIn2sph*aQ(=fe+D0#vv16;kpzagZaNi6g+B_FOV*kOo79+FcGV3hj3C) zn;=3SQ8D&4jz0s)nhf>-%};<*9}}|0_>>aHXFEj^awJf1zG|$m@{wruP{jnaJy|#n*~hqFPOjEAGBANOfHC9 zStJ`MRZqfR@fRg3y_8Y9+cehOt0>7iyrs<>0kq4OY811TR%(oK^mPZO=FVeE^zm1X zk3R}1z?j$5=19{3Q=W;ndH>9^qAHUD=jDX_YC99muaFa-(z6irb&r$(|KjT_fTC{K zz6}rzK%|#a(jX+3T2i_}1(uGbmu{AlkX{fFkS?WbX-Sb1=~^13yF2&$^PKZM=Y7w- z^UXLqj5ChA_jO;txZ?f-f*TDe6f$xx9WO-*Kcp9`hR|Lzu;Fdkt8zPpZaz}y_a=1q zFczX6zqVF_m>&pg;E8JRNUuzNuOV_I#j4|Z3*87IejKZEIJaWf;R@rA7@Lu?>rMBI+D3YUf_un7W4ENka$NTXYObm0xbd|y;)O7gMS(KhUy-=`lghSJVqpM!hfH~{D5sYjT~Seyi^`T~1;6}XWyQq`VCJFd zM&h4()zzSu57WItVIa7u9!O=w-w$ir^0ssU78T*|iHvH)QD0xXh|)@bqdPMJTxkvZ zTR!IJEjx|8yzF|<{vd#O2rWlHv2H=j>oNUXm4D(&FsI9CB?^JUnGk$KZq4#h>m+kD zJsB^-)>f`a@Osf2OCfdZxkxy+#3ijju@TYlXC+0FI1_7M`Nf^+W+*@hp^xS=qv$Ga zw3A@|y~S}tLS`}65|F)PSiaL}2zglo)AxM-_YIRiGZ8>&*O+RgTS})}demfpNAYr2 zgO4roQ|joUmGjZR>R~}#Kzu_vUose-W4zqip8fBfwVwiLRvM8wSNcDPkHI{NcX68B zfzNks@F%|Me8d*BF?)6;a_Qf6J=wJ8b$wQz>QP1Ap*%%yt|H33Zhjleb|jumqY;2# z)Q8}w^dc8nNxK?PbJ>`|oAQ_?wzZBg!~7UsIbK!$MIv5u=``@Oe$kz_r%%2sOW&(O zvGH_Jo||u_jm)a_c}pO{Xm`Ax`*+5PKwMG@G0hUTe*%sm#QaXv?{B-4DX>C*j2f(P z+#($OwD0SnCNw5!+PUGW9wa!ODO!i2=lBn{?h?P-2Z)XyKs!V3^AWkE5yf~7hWFSL zs1qgM9gwtJNx&wA__&IFl^rm#?~#?OGMh}2^qWf*%2?M$Hn{K}PmttJ(B#|jFi~2$ zN?5v_`!sw*_2nDPjz-Xuz!c$y;JENaWjwA(zI`2$B?`DvTdK>#4OZ*o{gWZ(xY6PD zF2haN4L**&1U|d|v{$PgO;_5}y=yagoWcZlHjy-zdaC^l+rkCy0?!Vg-@77uuul#WkcuREU@?9lT#8QQss_? zJYWjJRI=tbz+w}rzqb=|1TT7We*S}yW8oKa8<=4MrnM@Zy_j?4W~erU+cqH)9c}(8 zA@AKMmeY#_gZ^;a6D2F@>_nhVQ9^ZRnhZ4gGuRbW#e_kM>2kCNLz_D&u-y#$x)KiB zm^J5TqQwRnniPNxi-rGqO}|d2phV6{_TMul$6+`>SCeV4|1kR;?(}YGIs@NO6Yz1a zXJ{|IPiT|1iO%0f0I zVV2aqot;YcjD4MTaE%SBfNRw6IBRm~$1dTh6C~$?_UiEF&0b&Klv1{ul=~4%Ij(Oi zhQ0!MAbI;1*XatSZM&H(U=4GZ#5?Z&0uVPs%h1{(+7lc?-+PfamTh?&c zn-MQGMcIepsgjpi;vatU!_-@YRAI>Dsj&inmGWVq>o8zy%sd-Rh;7YmTWCQ5-19X{ zK(YMm;5`AVg$R0;sxWUioarlunM=D?ttVJvIvd7@d^C7ON1c_8Bw~c`|0sqPs%jvC-)K9J4f?Fv+J&Q)L)=4^ z+oEf`bjx5oEy7u2{-rdo1ab!93n!s{he(ORjxuEC>Lg2hrLAMRGRV2&= z@;BS{q>4tSARCUc@?CC8bmxd=0IAm0>}&S-jFtGKhBOfb!_Z)yg?#I)*9*r!|wY$cbHuVA&L+1vk7kvCo2MWo|>UY=G2t$Z-lAL&wd4<9`AG(s0If9f4`fgalsehkeKT2(xm9ntswZ4(Zf)_FwuKp z-bC6{iSv2OAp|8ASTF-@%DU~F3b`Xx9hC2im0yM3J4w1;NjG*fk|oU<6bXVU7FM#- zSci2GpVa<0;c2el3%{vr}0ft+VxVK0IpqKpsBUx5;^^8}Jg(&6#p+0iqwO~^-_h(N0*D&fs zA~V_=DzcjSu(HKwx-O%IVA&^_&k{VB4=>(Uoj#aA!BnmR-ikubrYpL-6HVWkFk5V5NEAz&FpSK*nhtUK-2oYW-|SNr-9lvZiFsJuTN-C z5&NG#Fr%33oV4prGtBwPbq~AG(JP5+U$*}X&gb_SJ9qT#PR*DAXy{=ZYRljgJh3_{`Q;yLNajRBP$WDUDPR4@7i_N>^Vmu z`hsi*Yjgew2k#N@SU^YGmyFc=W?>~Fm(2t|mnF+y+_VXnM8K=jd`0W3)9)S{rM{jN z!L;>NTTQMXDRd_vg;x&qarO-~KXTUD_3^%9$HnBNVcJ$V+ASX()-_=~zMO@s6}-L; zp&$%3bzQ8?im0qeCt5T|{z|!Db1~!b+E8c)i0qd|3fkfLDnEiDt~+J#j{FvY&12g> z*A2Ya8a@Z3rXOs8!&lI-#rT%A9p26G@pqbOn54a&6lrxI{dT(IbJmotTCJhygID)u zaOz}s2seUyKF8%iyuqvg$(_F_{J}ko z36$KKjW`?LpQsMH>S`=A_X2Q?cjk5cRQoxU2SKF(VAi5{Dwkt#nXHhwM+JjP=2&3^B0v=Eiq zQ^j8psiML3gBt2SBG*qPTqy6SL?&_Jk0n!Fg`p1%#H`&V$iSlyadMgGz%C)PFz1?nnuYK1DQn zE~?aiV+9-mxf`fp|L5a2uC#+55rYXb+~@OhS_1}(CVj3qnto!bd`tZ@vVrcsFu%q* z5b@mcKXJaeu6G9p(4-tI5F693t@jMAUNs5tOl4@`U9{<6zr8p+(7(K#qz@XnTl?f9 z4E|PZWcK<5b8Lp0o0U%-r{;5e?Qknv-~9?KQL#QnBUDVqLrg6P z5_9g#9f9ax@wwXZ8ElFFbsq%3Roh@cj}_v&fquM8?{@|Tw!hltjnPoSkeZkqSz@Gy z*<}_vJ5Rccs6Vy`p9t;#<7qs0kecT+4aFWgNjDw>tW>Q~O8CA?T_7`^FoC@(E=^bP z3lCS;dEq@iEn+7V)~9-f_uGfGU39doNGZ0c_Nhw$Pdq`B32hAftV z>V%0MBF3VoJ#jkwf#Pc%=aI3y5;_Q6wXFvyW7KOX=0TWi4Peogw4F?QpCZZLl{9^+ zh5wv0*kQb;+3*vplC(@rLTp7GPQ}6t#W1U_spch+@ z)Oarns<88`la&1@DEMr(zxJ)GY;8#6e~YZiP?Vhm9rjKaNrTpoE3Oj0gVtiVtw;`bvR^wx7Xz;=AJXATHs>JXMZ*p0~vcJ7vk?uM61Y z*b)Sn^b*<#dcPa~RMdjgYWUw2lK(~j90GmyLsMo;9J@jVEb95xPJ2`vz{gqXT9Ia2 z_-1~<_K$u?=EshKUu0T+RiAVu89k!Xoa|sj2IRL28&yG$5?*D{?0+E5nY1b!#h!1A ziGkyBh>g}8S?X3CSZ}XL<>g6USol0msSo?QWGbLGargYtWqXU1@Xs<_L}|QN?n&v> zD4IIpt()nwEdI9*^Ygp)fFnWE*E*kI+aw!w-axtC!1T5p5?+xCt==*;3*JNp6rf61 zJ5n<44hk~U;W)l2Nc38<;RQww9g2Iz;dj&~J%y_7<+nkJw#TW~$_2(wDgpjgG*F0= z+QELYjV*PP)Be-ha+A|Oph~@5jyG+l+qTowj{LP6;-6(dSjhdvYHY==q3Z~K;sTuO z9xZT$)NqUDGII@Op@RwpeZP88jm^~2;33Y64wplKOIV9lNYxcUAutRF$=mXA?BaGq zXjXyN8yr2n_h2IPj}t&k0Ohyd4NP5jhtnipmoBf0=9ZbTQrX60CN0p8eRAHeE55J3 z+$D7%UL63{FC9--gm7MbTsf-o_L})_{;(gbJeIlV%UZ);60b8zuN4ZjEJ8_93h;n{ z)~K1@tpRaGu4@B>@zAB4?&;UsJuI z>U_7|q|AkxoV_AQ!7RQwL0kwnRh9I91@aMD3TpsKfAQ;LF#7VE_S#o?hdHvZ>2mOx zr5(hOHbgC!Oo)1(GIZtYgE;}#@6BG+fQ+?Z$n87fx&G^Me+!{C?54^5wr3@q-(+-r zu$*H21NOq)-a zE*Fzk6=KUbmV@76J*6-Sfe-}RhjV7D{|>EE^AC$Q3mZ_KdYOZh60W2-RG*-i6)vR% zLn^wZ+ifFAdO`(HAIq_GmOR<;0l zcGPF)*beDrB8+G0(c+#2(6TGF$@7yLqC&mxorB+Vwo4)4j;tcq0btA$mtP*}T=>@) zvw!7dq&Q5jvg~sirA1o{JhZv9QS!J$;WbhXKI-`zBR52C6PxP|MUp7eD$Es zeDDfqr>TkXm^2S{t*XHzlnxkhBy?~lRJ=wg4Qper6C3u1{jzHD59R&|CAv-9fE4KOym23# zIUUTG7rsqtbJ@EaA=ixOS$Q|;43-GfocfF_qc1y}P8|=^c?gLY-+fcK?$+!xC(skV zHueo4Y@o!~XAYr%qmv4S%|k_z^%pZbhwS2_fRJxVyKJR>^fWi?)&3_MN49+=cp8Y{ zp$`iZYv`?ry6s_w702{iXYDf2gkq6)>yWA=VT@-;S`F&nUm*x`WdT~HdDAk-h_2cO z8NUo(y`%j+Z8L3W2yk^O0R&b88tS;?^=>m^(2wTf-%jVyLvMOVZ^$btmbh?JS-v>j zt8YL>>fY`{3wV;BIUbDX|uqrwZIV+$Bo^$O1^dVIX-h;QrGoaj=)e=po(Ew}5Q~_?& zv5WGw3GYP}f!N<4oTTc(7macv`@8K?8eXUSn+v@9O>9#uVFrDQzAss(BUFx*_ErrT z;Q$8rHz^UUPTl&Ao`)?62u+V1iAfBcx~vSPs}yUJ*8CZ92?u`wgh20u|F|t_NU;0m zZU-hmiR1Sa|5~xRU|`F8U?5L$B%5)<1(050ls~;3!lAN<_DrAlWcfHvTBY?Mavn6U zEqF$2yMhiYuj9z6}R#8UpnvWbLRpQi$x|rf&`zys*=eXSF!b zSr;7q=Y$Wt>1qiC&vb836zwxTXa#kUMQ`-|qVG#awV-l>-A$y^gCyv{kT$}%mEd7V z?eq>NE5=!b4#T_X>1S3!qHxv6T%jAp&5yT<;H^K6992w+h9``sSe1&_G@}VS@dSeM z0?A86+8N|o&#{=Kqh7Z5sB4Y;TD8_%e&wa|hV1|q2yGx=0eFa~Zi|1c=f0B?w19df z)6Uf?!Ibd1PC3t*DWx|ZHxrm-d?7K(8N)>LBX93y>~ZeIGT?>2Z)ll?J&YK&>Uq{B zDnR$UmN-<2MohBHG`jcDDn<~d=%HMAdzrJ`jlGHJCYow*INQIj8HsV>eM!3MaMk5V z%wi7UACwIBLqK0hzBpjKEF;N<=Ru1b%)EK1dnSwiZk!8x}nI8N81ntu5IHHWkSwg zn1RjeZS9p1@QPE@LNNram~%Ci%)jn*wp8N%QCAV2)l$4nyg%R<=`07hk7+QCmGGZF zSG1UEs<*CQMtJkMmLq@zxZH@D0a7Qmk8HJ#a&K}7pItb3x{C|_rN%p*gzm=UUB66o zTYsS|gd9EG{>BAt+7%+z-UY!Qq;R_@SD@~-7^)K}B)#l;*0*5!0gRp!IT9;;qQu(^ zd0_76xAo~CG;9-~+`Y)U*4sQ1FxULS{^fypEF9UnB3fA?3AC90fE8*I=G)*OPTdw% ze^kOHu1YD5hRkOJl;U8@J3^y@9=3-kIy(?saTq&C3b}Ik_NP-= z#j8pG>7y?i#$;*{imeq64J=C8AkD8apBRD<+ObBo=~tQGexD)Bb138ogv{+MZU7uV z=DP+Vwr?{H(PV9WvG>d7oy?hM*m%2&GI*HS0HrrZfy$*W?n{`%RZ-m0~*lR?l4sTf0$`uTGAG>;TRmjRtN| zX&8<7kp>2c%2q#rY>w)=uj21-cT409N1*P-v_9%PnVS*|E zdbjDw$<#vQP;FR;nw;^v?jMiU8&RgG!SF+%ZGXws3H!47gR#rT@qzxe(aDTZVqn6r zptlJNh^rpn#{&bZrOX9zB-k`spG`Z|p0GLC=X?jFV7lh6g9k*|;m?-CQk!44Aywo5 zR5x=TR)YU%@Pm2(oJe17krU!s7Kw9j1I5v%-xM&#`nDQNt;u;BSkFEH5FF6=1(4Pa zLRFkVuo;v#1lHBB#nE^;MOv&$wq7}`U;fmoS-SaP1-lpX`u&A$dY_Tc$jf0+5>RUV zs+PW@C9GVmnW~ht_#ON*PtMF`O9tn{bAAKGIR=w2?QmJhw>VC# zrnj3hb-(jzLyeP&Yp6d@z%fS6VI?cbpkD!JxXKLBlZkI&J$Y~bcg^boC;9`g_d&Mj z)6eV4+W=3V!sGoQgUL?A?31k{SJ4fV{RM%Bgr7vNP|{$cq#MT-NF4+;!WA|x=LzMh z-|goEp4W0`<8c5b=qwu+Js6%qt15&Vq>C6gc_@5Eyip2xk~yjFAnGcK$;0B`n6slM z^A_NLB0fYL*KR5olQVUJuG^V%S)ty4OqS*7aTuJ$oc;6w@Duv~q+#Y)O6spCCLL#W z56_G$lO9nCLX+91Yp;5DuD1cDss+?50Plm$XYY*Kb((+UyIDhvX8*3pWe(0gVv!q1;Dg9*zu*VAW^Wu`Xr?Z7FKOMU~ zX-~Y*tK7<#{j7sgnq7)c;SZo?n*d9_>2jpR375eYxJup_0?e%fEt#fsL{ecp$beOP ztPx;!$wPn&HmB9NTZmfrwRi{i)4(zfes?3V{-rLHUFwTL2L77NiZnoz=N`I7xe!H* zePmQRT6PD91aT5`l<*njG0u1PSE%$AWh8=|XTsi))jM}6Ql@(C|G{y5SD^7#o>%3_BbpMbq=PvIml; zG7?d`P{g5(&YRgTnOP>2#x<>+gr$qcaz8qLpB3KjisP}3kL%$#pAWQ`SjJiW@^}2f zW2IQ;W@E?ayN>kLE4XTiKl3QURk!6N>NlI)yq}4~B~F$QLSbJ3DP{>?p!jK3;CfNu z!kt__G78f!9X0jYS%OIy3A?H2Fx&^8E1~I|a>TiZ5E@=NVy4kb3N;&iv5?lRKa1PtM#4yEnJ z>hhzCv50o$=-dLqi5o&ctXK-l{#V}A1l(;PWHEqW|NYDB!tjBN3xZx?4xrjb4Lq{J zYg1tp4wzYOTp1R%;JT)Rx~54Z;a~SV=xDJ`hI@(N{m(d~W*_g$=kFQ*3bt7hx!#%; zaM*mVm7%=>0SYiy<5fqqS9`RwM6niEHw9zqrX$#)OK}I(|6825-~&lI#OU&mX4_U7 zEI=6otni1DxW_KOnOODwgZ5t`cqP9uoNSm(vb}2OIdO1kPkej1mv%YK)D^;`1>BKMqpK0N zcW#m0AozBJZ75s3js0My=)XD1qLb=sK8i3*%1ThxpfCgk!!vh8g4y}n6H|db2K#R8 zhy2g|oJXEVQ``Z=#aDdzmh;(p3+1FE&HAn7<+F=ehe&%`qZ6v2%e&2o{bEUeY8(DS zE)uQ#Wn9pq&5{|yT#GorGvi#*SiykyQOBIw?$&PUG+Fw)8M0#lx3Ii2DjcT~B@kjH z-$p^E?oQ{UObeP2NfytGLGZ#oN?Rl!ET4ftod0l)?U=eBCcRrf-F$G2h1h)X-WvZ< z%VlWH)~3m17CE{D{A7{Ld)5vb)r0ARMRi!(-5A(N7al)()8Nu2Sm4V2-ul7u_*nnS z7Qrk=09MEq;$*sK)~V7I|FfYn{P3D?&=rk7S~Gql{NRBadt)ghkn=NuCZiQ=ys$kJ z-E>RE(v@YqBcMHwr&Sf8ALRMt#QEb?`7<=_M!zWtd80LHJKVkw^=qblLM^*Z+AkDE zDf_>DU<*p70?gsTk$>7=^Y~zRd@~b>lZKN^3}y$@S<3;`8HUoX3TribfD*1+UHItI zYrxN-W)GW?t98Br`1w_BV4yX`CH)oE03MM|^n}f{lpf@F)g7R=k0-T&T3PNsTM#*0 zBk(??hrb=bAL+k40gPR7W1I%wtPsAKuDiO?FdAvXfZ;;v(6+R?0!ZUu14^IVcXu=9 z=!=^dIY>{_FsDt!KYa6nih1K1T6-jReoVi%tK1qO0Grgkeu3uTg-+({1AR;^m1VWf z>el#pd6Q1ndxE)`k7*WtG2023%D|^_LH~YlxY|`*Z`4&)B-20hn-{I)+%p17vpbM* z!gpdK$1Wd{{2|JxkSxqqVq@EIfe)gS#*?ZUbDCn~MJEqY7i5H`^Zv5(YXdgud739G zJ^J(Hji#CW-|<@U>F76kJ)xxkt){8**_|h+y2{Nv_C+Wj6@x&Ch}t zA0@lFZN6*jfQ7095bU0(*VNWU3D3f#Ai;~=&UPsT{Mze9#$`na9TSrKo5 z20X+jUWjBize>Z9J~A)AM>5risCa^6`x!0nHy*+jS)TT0qG;x!U+<^Y>z3xYgk1ubPe#}3G&!}a56>ze&;8{6`5y^yZpHuUAc+bgwJ&juvRKH>>Y9dso3Ezg^%x( zBp4`tDFlttZU0T*LD$!or@koT4~F=btf=cBo!dc}-<6!h^!qym+X!Bws!ykxe2lP#e{4WUm`UDC7ax1tU zCLKYoTV-^X*+)jpcZ!!ytjsi0VQ6ce`%Jv(Nm$eArT-bNciC?FRu2SKfKM`<8SX!L z=^}ckU-eUD#=r=Gxj?mZAVRkXs7y>HNsv5>gH#UO%Tc1TY z6IiZ8bW7_Rr~uIVl-(LSz3gH?@vhWgkVH+>*jisXj1PM0`+R$q?kIIzn_50bwa$B? zJ(AS3-l4}b8D24B;p*n({)Y%SD}D5oGGc7XoPooB7h=hIeN-U`-0t;NQJ*@DLH3|8AGBAGFjWZ9$8_-z!JlKfPXYCsP`AFYH5?@ON z3-MBfSLw-v$N8Gf_%!a>5j9fX3zk*bmS~)FPr}s$&D@iDyAsA`y#l{M;{wBX>88|l zI|LJdlmu4m*u8{%;+d9Vw3=uFy0~Zntu|myg9v)?`SlcJYjr{EM<2r{JuGU-CTzg)XfT@mSOT$i0X)r8uIh7u4cJ@FhpPo5R+}f@tCy}ejo0PIEHU9-SI>uwby6Sb zzGfeDv@S(BuU>xa>$RG!g9teyI6bc~MSJ{q&uEqET=fr*54-wu?gf#ZdK5o8nWEnQ z&OUY*2Ht21dUV_@(ykVR>3;Ty9KN`UUFX$h8=RMG3 zkj%Q8!lc8++P?d>m*#`K%#KiA!@VV>Hc!`zvh&6<4(6Bu=-z@3{X72zd>VAa9^N;vFpFI36}pW{DjUP!ga<9<74vwIJT z%0`F-ZR&j@N^P(NH^GC}!RmaF8nzFQXZ{puu8Lra>|tb0`}1@0D^#g2$_J8jk(3wS z17jYrcWFIy4;$+@vgu=Nh3yPi{bjb2MkAr#lRX>l`qgajFC=&U+6ZTpTxU?rAhd;qxfWFn?v0F-UWtll~7KrNgJaRtog@`mB#IcIAPXX1}mpTn7 z)JdY~&PkB|dFQLX%K9U@$ryqi8vF5_sF}2Yf>CmPeA12!nIxg+1DBv4BE(`IKN#-0 z;!|obE3g=8DjH+wOS2OmOx z6>QJ01Rr$AP_77;Z*)p)Fg`Kr5%at_b}H?AbKsWR5V-tF(APA{ur4I2lNivFfThu# zZw+j^7DlzZ!B1O(Xc7J=S^xm=b=qu@_ey_QoW>r{N{tvP1$s%$I*ONpY;&|ucy(`AQN=J?rGKHx^VesOaA@k)JB)e(SASn zj>0VBDwPtg$MSI5q{m+%z(NpH5w( zMr3!e(LiLtujS|0qLNJ zJIsQ2JjHe|Z2b+;*VgnrcoVSH_ceUnPkJb$2NdYy&O8nCGZ2QQ9TDw`mGtZr4ktYj z=Gj{B{i2Q16sL{lNt-dE%?7%D_&~SxN!TmK#E@#^DqE%MiZ6YiEV~5H?Bq}VB0U>~ zJ&(@b)3HUwLEqE#4}!WXm|9h$WlXkf^7#8NFw`BRF(XA&YZ^TCe08;8{wgCTJW zf^p+b%+pOSdb!I(c3beGj>Rf`0m3vnop5lPSKI@g-MMnEX!7l`z3#Z4waS7a>BvNs zQNpO6z?0RZxoM&ZBVlrRuUB6z58am6);jHWJ|Zi3*e;)c?3SP-5{euD{-Own# zarH*kObVSwxLv+@UB|-!Gs1Dlq`;bmSIx|Z&R&`I$y8BvD0KIec3F)_A0J)kqPDYu zdM>k3g0A*Zy#A?O)=q{zjtIJ*D@DQ7#abDM&24(tY`ehmZ9>Ht4PgumV#t|RpJVZe zzt2_!)0wIK7N|c4oqKVvj2p8ggfMe)rRk9D2~9vxPTvh_d{Zds*byOKKk_c!aYU)Z z-iDZ|vnmT6@3wm|6(!kSwHu@XFQ)2ac0YSv`72AWubiIul5=>XuS*73eMXC&b}vup z$vjDOeXKMbK?_@OrJxO(`)L@Z8dKSt(Vvu3J`|B%+@x$%kmrJ|IwybdVETMOwh1#M z?N-J{uzv0{cmnI$mKnM3clQ7U;yn*5g5$Ae5!W!xR8dsoR`a?uUV|`VYiU^9mZlDq z%Bb&28oS-i%4#3Su=oPlKVL1(XL1Cwt?KpOm#OK)$(Y#zz7ER{(!G9z=w;#9Q+Tw+ ziaNOq0ga44F`@)@vTt{EE>kJ^jS1^8D?Q%@TF=}o4mk511Vt7D%;?;P|xjdA@SO$2YIZ|Qn<`qE28n9 zo#+Yk@=`RVY3z)boAnM)%ha)(O2ye&+i*B{)lM435u91Lt;H2+sG1K>!($`QUvn5q zw(X9D%!M(wz2)AB-)jGo(Zm#JH3$`}woM3W7GaW)jPFoll4obkQp*Y}Q6t9asn)*Y zH}-HCYhTRmi=?ss2zp5Y-`w@zTTM9qLyfG=PC#j`_k>34zxv559b_4U8iG_Gi)Q@D z{7CtPUKmMmQBT)+I^R}d1m(3&SYl+Je_kkNtw`rY795mle)4VKU^-V6Z{x?g+oFs6 z<{S6UHHp0hnv?Z z#M1SqS^z ze|PhTo1hGDj9T9zB)0PP+TDChDnq>aLTC(g;dgQZ-p^bzR&$?X^=kq^RXX&97A%pe zX~+A7G56shP&eVXIw{G%$nfN(ORJIjYD>~4?X$i4*`y@JkqS%7p1E(@8f;r#tEcsC zDy*y@)8s&Hbor*TWnhz^DAjLGRu?m`AH83!=c+b+zxzh=Yj*wVZV%=2!nF?*_-8!A zn?dbTL>h%0EMVA+XvQPWz`zOOU`MwSRSsk2vrouGzn_U=X2|`q+qlu;!*M}28pN|S zx-N!upOZu|20B7!hc1Z@6VW8{m9HnhuJlH*eJ5wXsLW^|=2CZT&?JQLPs|Dk^hbxM z2)j=`HN+!+F!Iir_^xayqrX`gfBvcQ6E$#Q$s6RJ$~(>porsNAZiXyHhME@y9~$@x zC3_S($CAVK5)Lo-!hdUJXsyu{)Ek?*AHLG(SP%=Ve^BBo`n@3K z@N3zvGj+dN7VuO7|q>T!E2$%V!D!)#_)@1h{gf(Gr5w}{I6GUTf{TlDC zM%bD8-qC5le@Jve=e+jPK=~5mMRW@f7@S_3ojpJWUR)^=UQ>JjIb;eBF0e`DEl%Jq zPU5vq94$`NU{C04RgMVWn!KjJ{47P-sqMJaN*~|R3Yur^DADI?zEfF5Ui(7WSl+8B z#E7`3*1jd+9d8NUXvxzg^^GM)kFFqZcKJ99=qOu479Gwjx+B?OqB;_G{>sf5B}FlQ zCC7%dNu`BR>h=^!4aw(ZRCc|ai_`eo>7Qx5N~ZT^sAdJ?v_jkpb*x09wjBJc;>=HN zW$Q`Z@X?;Gc$9fA4>4l#17W1D!kZU_o6o0QUqH2K@?Q|BF=ydr-EpS(bY5!C-Z!`_ zYdx0FgAB1#E89F=p*^M&GNuwR@H|B*mmR)!ud#G0%%hvyeRJlX`}N+ECaDv5-; zeNEGDXXAMe5-FSxJEaKAD$@sm|2b39r>6vaxQ2K?83=dtzL|g-U-&Q-iaFzw_1j?w zKIF5aqJ~pY)I^1+Ox2Vr_x(|q(``U+CNOseUFvZhzNtS|s6RY8?MEW0Z>8*K8Ip?)}vwl>FR2S-bFtGsK(3rNay zegTJH1Qwl~P8$=FTr`lxaPEi)Bkf@&kuUlCp+T9+5%`W)4w9a$ynBYPPIjz^SmXza zI{P#tUI?WpcTgd{-qbmLp9YE6aN~(7#nj8yU~sNDelFd5*=M{@DsC zn+}Qg4_O^?E6o-RNQryI%kWw?CK$~?Xa0hKC%W_=BRHzv4VMb^WNyNE)3ko^t$Sx) z6e=c*ZZw)>^ElKTCa7|?`HL$t^bY;o5zzy@5rk{+N8>{%rvq5k)3g2abbjE^#7B2u zCPx)fEcAU30OQyA^?t|)J$+RuOR6vTXncI{sXkOZ|F6`09rXCWZY_p`X0KEh7yh41 zD!R*lTZD_>xKnlHR%rGuhQM1Yl+RvSXl}{BdLg^D5hDYQA+HD1)CFG%jQ>oO!l}OW zo79{jwfte`EO{uExp>mGf~Scx9+4|RA5&9@k?CviHy1I|>P$2gd}IHZ7l7BJiw3Ia~=!)}tjk2?>{7*T&Ac~_X+_0fKy_U{}kuYEG zGgZCULte>sFM|lSix--nZX;&V*+%vwBg-`dUC}L#il4oBO~d2$dIg%e!J zsk*cev785G}61LEDs zB0>+x;@G=?F|Oe!^oz(xN?Xnweu%?Z1mh$T&5@!#@M-{SAFkp<6!|{#fqHC^Epz6d zkm<03=~gA3CacV<_8%!#3U_H$b@@yff~*uiZ-o$yJ1iRD439GyA}u=0)I5g5r6U>W zcu|MaAr@1^9YA(?Q>gGxCFVDHosS=IriSb^IShRIQYAH5 z_}NNKfOU>J-+B-o2o_pG4FR0wtR!V?tBm-y9J(i|hGe)h%+$8-yIDaL3nc!z5b6p? zybGFd*}&VBN9R&R=LymDJUqsGr%^O>vAh~BL^9x*C9g~cG5-+xxk_NNCrP6_|CQ;L z;=8rd_V`hC3HG@7txrQW;K5iqdR0$O8XIzwJW7%}p8Uhrxmne_U(KNs0v|ozh~0Ua zXMz5TBI{_kVaST5R9`h{oz70bwt)AMX3@ED5<=?N!|>HwD%}x7q&8yCZS{^lpAm(9 zGqF#n{E>SG;!hxW@o9#`obHOcg2TzU)6TWU_wCNhDTKTHUFS2_jcY8v zHrc!{6;O5H*E`;TJnWmQ3C*PQlrVt?noidkU6++#Oqfi0%Ma}(kgGTkdAiPh3oWDH z`?VxdBcK6&xAWdV4)j|bxMhA#&;Gxs^LVh|juB7ZxDssBpZ1j?qEt%h)mnw$gOJ9G zfPBBk3i`rv(n#HP=0Xb>vAElt_jMA#@e>vU7d^;gYX~y&lVPc;~re01-T6on3!vyi-1t zG^tD2knm`PA#24}m#6ac$cPaT{vH0KL~{is{sh-$Evp-nV&R{wxI5q07D3{>-AkOp zBXlW9CUFcag^AIvFtT*r=Y=6NFCz7PEV^SK#@_p!8u!{(JM642dLq?Ee!HA0;yaiL z0ino~Ykk?I`(kwTOIi5OL`UXu<4r3%rx%1msQIueoD;>|s%$N}2bB=Kk>x=GPLj52 zsWZ!%sCJ338FUk$!iN{)lo@1x>J^y`b3Ftll-{GV8j-()tIm7}OfuK*;G@eqK@~Y1 z{zy;uGgSh3NhN=jQ&zhrRc-DL&n{-1S(tRF=;IK(cn4D^uK~;0OFkPs;Pl@j(^Dw< zZ_elv@4pz%-*@OQ)^nY(C}XA*gkRNruP^$rnXxd+;Un0yEpbZ$I@B5f_Owr=x{VB@ z@^CNZAZ%xZKAAh0IMgcJlyM*LjWU^4O!GXPmK^Pf-2rLVgEh-+oi=sooKm=HvtX5- zs~`8H^_Lr6wy&y78n4bjcCuflQq`Ni-wO#XgNKY&8h4&atX&WI6SUK>yvlTak}+Yt zDCK^r()LHZbF9<&(18xBOPEJZA&^Gp>8WG1Q)jEAzdzHX`7Sb&qN-eQe{ywfDRdQS zyf-e<8D%`~eaaF!!xG6I9?Jb$dcBL@d1(N?^bIGC_Ts|BcE;0Vt|v4DM~Y-8GX5%> z#s3LAQ_G0#RK}W1{i$*N=IC0?OXfzmvie0R9fFZ27erkkM@&m8v^mPVtar9sv|-yL zgqdHRl_J5srGbzTOe+Me$Ee8Vni~J%@yxVp+eR@-i;5%2hSB}%D&4_}NfI?KR)vO6 zHEa}xluIr3S$B^14BiPkFap^B{oTF$a4SaS)$>QfyFME1W-sLk7{!lj2uUK+3s^h` zKoe2Fi>l`SVyCLNk%<%MbEcX4mk9amP%n2r+1t_Xmtzf~ z7jfa-vT7j}g^xD}LMKL<>jJ>>L{ZCbHJzmB$5w{1EO*B!?NgE-YvV9tjZ^-nubxM} z3W6$OtVAIyf6>C;m1i@bCpwOy{kj9LZ3M-|1+R?sf<5DnsKU%&b~wYIg0d41u|7C_KMw%O>=PG;>k6R1^AHw` zb;{=&DpY`J%!`9X!$2`}%f`6)NzucD;sCKLZg0LUXGKHUS2Y|=AC2DBs z!b8AuIQi0NI}GB^Sy@OD!c`z*2K`g4voq%7lqseKJb0Y9^4;g58ttVdJYFw0#!pFf z=Gyc4f15n7(PbMePgw)BRO##u@}JfL%IrUR>jr>)xDR)go?HA6Mi3sJ$U%O!1ipOD z9G02!X#Uwx&`2f8u=*49>)WB)&Z;{y$}-;uFr|%x@4JW@M2Xg6Mo9XW$`Es1_uPB2 zY|q^RlCu##w=97h5+t)cxVkF%+JHZ-vr6jcbkvh)q!cg**$3;Ak1t9IvAG9oB_2&j z4>0jbgeZR{4PVMw$I>qO7-F?UE%9K8q=p^3_*3R#yq_uJ)6Ym($m;t?u}LbiGwn zoL$!}ihDzFhXBFd-9v!j!5xCT1a~LF-8I48-QAtWq0!*((wu(3vEN_L+2`uH>d|X- zucua3&6;x^dl}Inybs)Sj_Du41%B4gl4a4`K|{x{uBo>*PE&~wyCy)r)Z?QK6dI*anbMixoh z0i+}a1qWz)CiX<$ELc4y66Yh(!f%bHoTi{pL9n?vi9-4QA6c`hOY~}H{=Tzx@YBow zZW1%uP85jXO}zP8h5cXO>n{y@5q*OT$kn_&3Fueae-$(8BhvncOkY_5EgKIRb)=K< z^878P#$1lljp7&ar+hVP%@Am0m^s^c+=U=V{-1!ax

Z3|=O5)NjNXOP`cqzMYil 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ࡑ~SVJVqWRkS10{S>aSZ(jh$YB7pdEN--fC$>Q@~>U?M}= z$D81g!6Pe)IFUg7(Z=zu3!=FY96RUNGd?MX51fprv!_alj5;-^FFAJle+tdKj{xfx zsO$fBJC?GYSIbsVs-FIrJ$0{XbF#fFUIXZaoVAr`J~KT6ve2WK+;GgGop5@Y_QJO= z1sOv1Ur1>G%Y!7vRQKyViOzO_3R4q0#C#c{l?w1hKq>!v$;EZ~*6!YH#)`{?pde8e zw&4s3vBqM&`g>+aw=R=Z2!UoczTJJ80_e+s@_$u`jA1yE#vo;DZC#PH<$Sp}G}8Le zL$bCLKJ>L3$P@+O=mfN#zP|^&vs;S&XPj?Nz7%r^CCD8vI2iI?Cgx&;4wMyW$>4M= zmuvfhvr+^cmLWZa*b}SmBC)Y^RkTruHsBo9N+lA%oCv4DaT=*vszU?ev=yz)6XM+S z1#QdmBhn+C{iCaB^PQZ%s}evg1CBb(^fOh~Iyw#Fx7u^{dFP;3jCPlLf)34nw zn2Eie%%Mru%5|6(;S4~;?W{Xd9osjKrGEgkCyS+yVaeo^uSApCqwKt zW>*)E9kV*iDKrg>o(T?$2 z{W0G$h+nCND`sg_C9sQ9e} zhquy;8FJh`>;CbAH83e`>WD>kcQMpe${`f zJqPLeWDsMu(qgwY_=~Gtsg9GQzL^UP%Uq37rX2*S zOUS2kdmfFg486pz-z&|8RxQ^7lF1T?C5+UV|G2SawNq53W#ss&~7q7~?BEtKKEN zwvF1&t`4{3Q$Jo9_Hxi2I8rN1&L5g{f?Um-1s~TtLQ9DSdrY7W@_1ZzEWB8}nF_q# zh@zKl<7;x>Jj${B_PDmLD+3_h9_a?N6z_S=Pdqb%X&`B zx?`9_>FgwlqH%q(Tc+~VJe@j;8pdT6{q2FfCYx2RBZW`XmoxFMq3qs>^`CJi^32!) z@G(C5pLK{p)^Kh7J8CGWH+wC1R!+CmI9l8*DCXLmyR)6$P(Y{CGj~CUpBu$2gZSNB zb(Mmu6<+|N)a$aQ+lS3$B_l>YuiK=Ue)L*4a8+=QAok!0CDBrJ(G|u@GAq&)cj{v5 zQ=^grwt6fwQ*osQ>Xdvrc#E*o9l1ha*VL7jJPYf#nX zU!{J9PF|0$hc@d7fm^{Z8NN1M04ymD-gj`1#JuY#I&tH;nwC3%PaXHMN737YG1{;H zI+e1*3rO$`kxG zDc^=FQBx0ycvXLe=XKaKj!Z9UU%Q?@^xrrTk!Q5LDRMy^laD;7l&_Rg+3tWP2*E4aq2Kzt0q``K_c zCmKG~pez-tmL~KYhu7PnJZ2r5j_QPVms=!X&C?om+}EkXBTUn4oKd577pskF)*aEQ zXA}rm4kqy&e=|oLkpp0}eI;R_Ge#lTL)P9+))NS9Sk>9B3KMyq^ z<}()6GJjJDAl2aKwvHF2#;QL3ScR|Z=vdi!fAK8E`IF0hQ5IvPpxG)bt5o$Fu#ZfQ zlw!ij$(yHM_!zBKINX=Hq7e|vO@lj9GezGdm;fDghfS9%qb(^aO8YHu{)B~7efhW6 z%ib>L?0zPlmQRr+&G%lnT@sP$d*5@do=L5Vc-<*zn_294m^D=2{GAiP-9i67SL)W6 z)h%OVqHvrh;5L>g=awq(>csOr0xtqTYPI-(8T-HC%*NsD!alv&G2!9}AP{eZ7)PEH z%j13#3ZS=c5AMdurL`7jIFeIUV33x;nTLvh_&h(`!t`Pi5ftID9mtM}ts8f0zP=fgFSn*}T4e zgH7y<-cCgO6n&OQe7;DoAtpMC2e;w1dJ=^gLI+@}WDIt}~ja0F}lKa#dvoeH=f&7(~ zp}CEbe*7dGejTALw>PW@EkhO7Q8G;n_i7`WqoBc5W~yA1HiOnW;-;2@2F|V^_Rvvz zhqmYyw<{JR4SZIqsPr3lLKvi&iR#r4evbJ!#{l#EnnW>Lh;>Le>DSlJzgRJ*lZE>q zK3o!TYB#QtKJ<&b@)8fmAx%q$n4HE4vIGm!NQ9G=Cx#7a)@s)neghvnHp3y%J=r>m zCvQuGt8ljuF|YV>anJ~&k&V|xK#NS7ivilL;^}g-?U#Yc+W*Ws-J{bgUmt2H`b{!7 zV=`b@4s8e{gMuWJ<0%zH|Hoj6AZLYPO1b%O_eWg*fy}+DL&2O_S-}VPD4q+xK01xP z`;hoziSB}DgcSb0)laXYXvYY(3EZd4l*%EQ9Z8nI2vjEg^54=FYf64jElJ^Z3wTyD zc+h_)CZb5jUJVB?fBrry0{)leLbRc;*)Ty zRXY}8@Dh2qJBGe9ltAlfvEdv%i5%UM&B?9Sn68P!kZ=wa$WVQy5=HZK6324^fn|_X z=od6W$9aHDBy(!njR%2p!GE6vhc(1%nm!J-aGxM6 zMF0Z(wArZh(w*0r?h4H83+UN_|8Ln`879(Q5d8_jP_|0pP@gB-^DBtX?!iZ$MnFjr z+C8*T+`*o_+3BAEe_LBj%5RgDpWLo?3TI^Gk@(Y9d<4eJ6PsSmG~Z*OiQ6^S5r)+DMt$O#NF?Gk7LxedmcC(as#*d;&t}Bir>bq}1UI(CbU) zjV0sVF{1RX3=zu@oU$Zb)gDrRO!(Y$xtJg`$C*F+3|{G*q69wY zAvWBSP9y3MF9Ai7o2DP?e3+)?o~QR)`rTgMl#e9qMbpdsN%~-&k2l{tUgP6~>#E-! zKIM!4mWG*+L@kjLDV7kauGx z9P;{6Q;bFDWvHq|iJtNC~M6kko_(P`^v)v$zbZdWEF zexveN1(A)R5psWYDt>@s#Az@+>2He%6$Ma2M9_E--RV!bYW-_3b0ZDBF^gH|7}1d`0`&Xr{H46#=I?yKMDd(_F2HnohqxFgI=A5U1{BS6v-E zqBO_C4#6JEgH%Scf!}wkM=u?Lt@WPI>~9$^1ih&rF!N&N?lA(YtkJYzXKa7pxw_ov ziX;`h+*wn)6vJq0ztBTBwnijf^m0F1?B1c_pb2b)H=~!qEq~`WO&b;&nGUXSdDRC0aED`29-%&a*F)zW*we(rO$n z&v~@G{wpxaf1vc7 zL7Ij!_NKYz1%cK#8rx=+Nkk+>Cd4~ zcnGaFQL7#oWkIW@7sFy4l53LEMJiJnv}tC9>9QL+y1J+0C9fk&C@fNbn+UL34-07=XBmwXy1=0}5q)}h zM)Bc?rkJB7hcPRmYb2{j2TysQ{(Xe$AzwNdd2U*W3ntQ#IEVi8INOl#59L3yKQURM z!uv1XU%r$*slBH1a30WdrOwkMKGqTS~?pzY#jGN=dx$0abtV-lnwe90B;HI z&^hg{;F=B41zi&?*!|h(4{X6TCSfLg0H*O{GMD^Ro`|+2GRY;o*7%woL<~Vlb(Ngf zX-g*h9}Mp%MELaYOu5dr_Cw`t9ty*2i7N76CoOJinE&$#;BF5YI_AM{4dt>l^Wo@s z+#cq?_n>~CK6FpUU9JH{W^4xS`7H>-m&INC zdLl+wfj)t1a#L0?~LB4uRngo>+(Q~=tCSR;vkG_a(zsTEN?LSOtRLV z3eWZ4Qp#0HeFwE%wQ+k;1H!H@pUx}Ozk-N9wl5175WNvlPq2NG%d ztgJUJ=QZ|dyOH#=Fwn}6OZoCTaR%qJm8}z<46gHEa=%(s>68sETuCCf`uK^HAqn)s zzzK|`wJw&4sF9{-%@EqRNH@ENlL$Ef(aZcvyxxbYf4<2;F<`jy2b$@8`UWVKhMO9Y zArh(MI)hWwp`YA#JzCAf6;{XOuJ(UcZChP%w$D@FET%p_>r-U*BG1>`xYd}}V0U+! zSgw?TpL(OpJ~~ZY2-v@-`}3CEFftL*1u(fOn-MJ6UK=4*8FvQAL1XOZ()X*O?jxv< zTlEJKp`SZ6%)k{jo;Dg?OK^zDfE{Tu2vSvM6Ps{*jwcml#HIucysMYDUx<10-Ojfx z468UOa`N+W=p@33N)y9Ar$J>{sW_Jn&K*w2XIus8^rnvoQ2ED$;4Qawy1b4P-Hk-djE zr9zU=b>-v;ER=e`7hT9~(ifQ&9|PVC*kybVswZCHmybV6)YtL(tR!6lcG0Ov$w$YCwCR<$DZizJH+UPpGdua4_i0B>}6L zwxTSU`@b(Fp9W_n##^?NTU&LO{xl=u_b5zc@Cyjb$$6#TWES@?sWyW~UsXMa+LC4T zR0nUXgzs$jFCRl7ZFp`8=k`AuP-8wEUKZ+^9fSY7J5ZU~Ba zneXI7Sar!cQcAQ{gYa1w8=m{rSR)=iSSg>E>g5tjCh~@}B|b8L!UG3H4ted@ZV#Rx zi@!I(B1}Ity3~~~vs$&=mMQ5VZ~z|jiGF@(WGbqlKSlkyV~7F*7BEY>ga zyI!(=gaRWbT2?TU3UwNW7^%xEMf-yoKX0S@kL z;(4*VYyI(iZZOUDUk7va=1Q5F*Lz;}vRRP^hi}G7<;VzOdgF_y@9*e9E?~kl{?jqz zx8OE~d&w;*PEj`{cML6i|M|}TTI{yV86LXn#OY1{`RQq`NMOWt;ZlZTw`nl)TQ@^C zhd=aQt$bBR45CxWr?nIL@+0YjOe`!uI3U)Sx)LL1rvBmE9=`8r-Erj3YUp-(f7olR z)Qocus1qk_lRr=;qH$VTzYj2}*Wc_^Vi9th(`o#5YaWghh77$)HD7MNer=$gG=d|q zafX7dYq=Ya^B=5(Ca7`y9!)@4?J)W@8$wiUxB5rKJF`KNYQ`Adc)nz6ua#?$Vq)Im z8T#dnZm+oNMc@NWyQP!WLhXPt6gu-Yx4kbqd+ZwES;;@90t)>-A*v@PrW1KpevSM! zlORUzPdh?1Pjd-Uj6C_|V8uGCB|jp`9aJ zEtkby7SFcGeJcvRR5hIk-~Z-7)eNCxJi@Jc)qDiMAE)<>swp@4vvz;qrb%qyk*kqw=NpQ(E62-lFx z0nWtE9&O?sPY_(nQAb20mRj*tA@g(l&!@de7)2mL{Xr^LF6V2??!x3fFZq8*-u@># zL*c{0gIyJ=H`y=VY!HW?Z2&MmU#?G1*$kejc;(A~esZlUKxj0Y-Bq)q{s_(2y@jUu^ubkQdLTwV z|D)rjRnGRip6@jS!*=n@&enctXPYN-77)5O9{m5kqm+l>jC2 zlfR7cYPidc4qOap;)21DO1USN?HjD*i`3=u8YGl6Ax0k0tG^C&P@H1rGRwNg8$$K^ zg!CN{%1Drf1))U+6@{}vLgwA6>p)O)Re(hK&3HWCG5G2I60~BuEmfx+{ zah@~<$b67Hg>O5!shq&IYqNq69RJWZNu7u8G?~neDt4^Bm&erKKOB=whfVtxv9k|V zDDl2OHW62*3>DstV&JGbkX%W{G?%fiyu3m4dU+7pYB?(NJ%z}yjM_2l2Xx%BuJr2@ zPqr5|yJYzEHo=@pQ)EfEy&Hwlc2o9k^F{U`aS`~vv0Vmoe$OAC`_tdVV|BpU0~a<$ zKcwlm+AYd{A%N#`yW}*^7eF|a zHh_+Vo(k9)TPM-6`n__0)G`VvG!vMNp4XDS*Ie&8#{|jLu8+v0cEMD@hfq_l(~8Nu zuoL_NP_d+9FjcVls85NH1l?1pb$keFO!ecc<%LH#o`oTmu*|BY82_8yb=gJ$ySjw4 z6+LeHRKegp0LODVdSp zI-lp*wxnx>h37B#rtJe0Zy-+f`6EBKvtxm(8fR|jPx>*nv$p~=mTvHx_xrq)z}@D+ zjB#oePYNF6w`lAMz{i#hEVtm5dUZ60bwnHYTBm9*g5y7h!&S}R%l#P@TBT7^yore7swwt+J2pHFH=!`^4_wD0c7;q5|i{zP811(xta6I$H2T>o6!}%B4 ze!7_x)M4q^*t4qJ#rFI2eupk1p8Tsm98|ALe2M}0ci(=CR%u(ITsYaUS(J>-s0HI? z$?jaNKmORUO}2PsEGkcDq|Ruqo35G;6dq@es3i1tQjIYsVX2fOo*{bA4>`6(!hVpV z1~@5z#`(oXH~7JarvGUP7)o=$HCeubUbX0uwr>E*xrjopdS_Gy=OcVrPko)) z+1oOZ+2l&RQfM~<3We|R44sYzJ4BOM^cg>lz?m)U8Q8m`+!ec4Mo&Lhg@k7f%AAIOl|GTf}0nhhp>Lz=t{DU-Jt{A6+W zYX~t%6{=v}UAvyeDp3AO!7mMbl=oj4$hI8}3iwzdE$7w8?N=q4Oi0|$EtIQA0s2~6d`D6_!iXM)&VIov`yY2}$EC00HGPCaLGI21B~A4#ED{*q&@Jec2Io)Q_x*h*y)ZkDB@sQns7JtACq}De42wY8qwo4E z;XDi=GtKOme1)L#O%}|M=|umH0`67O+fqOraDRvsJ82`l`(y(HM$n;5F72j2BY->+^gC+Ap>ok7W4K+3N62L>ca5(G3D&f)I;F>Lva{; zYJb44zWC0hU2mWuD-wW4Jz}@Tl!yuo5_UbPeE;k4?Vq3~6BvR_X|M;y;K)oE3WMJg zV9tX?vj+qsA%?DC@I3od^ohL-$L2gQhbu4uDuF-%;AuPS?^F5R(wzP*5UF+|Gr8cW?r2kAIu*h#)i@sIxQXCRY3caKMVj|6>r7Pt3x-6=JcFv z2~u69%un$x9$tLT%qeKNRxn=JS?}oRNDTR1F9O3N9so%L+!|l5Np7B(g5S_;Kxwgp zglk(Jk}UR$fB9m0{g={fkD|4E;3;5`ny#v2@||EDy>^lLCJ0|SW)fX6d$$1GVCu5a z`e2{W=M8D7SGRNxPImf~U|qO`NA3WS!em0$`m6A0f+$AoR+xV7m1ob&ba_5))@?D& zf10g!!IQsRdruu>Q3iOx8RH+FNEE^=E0KAd3pK5EeiM0vGvE%;(^=%&NbD&%h#ts9 zvIds7fCe@w#I5OoLZwi%0sGGqt1SJw%|SUfcs>I! z+tmNRne`vrQU`gw49nyn>HUE){&{gB&e_6HG_5m3AZG;%PjM#^8+*7Q!?*R*u?( z*CCBl{CK;qvru;ktPIKlD(mS3my3Kf^DrtIYe^>TUL6DFy?&)rI+}lg956pgooGK) z{kUF&W#wtdl>dMD`pc-S+O7>4rMslL=x(IDySuwVT0y!~=|;M{8>B&6y1S*jrS{@} zp7-5*?EC$`YYhG2P&u!)W}S1+<2dS^cch^)Km0#=XD@G>}C;0Dkh;1D@ zv;ALh>x27TKwR$+lQvE2KESNf7^7IGnQtj-iXJ};gPFnV(-dP4;yJr-mf>7>fnqH1 z`TQf5x~6~cOZ~<+@}C?|LiHw_g*=Pn98JQ=0e_&}syP*IvDmL-VA|R}ymkWg$8Z5m z+d2KP&@(>?%aTE*rC9%u>!k>5T>n&<`I^e}&+Wc1nkYuCzwfaigO+Q%6T4jlM687e zZRU0L>+Xk`xAj1|~NgZfh`leD(t#!5DuJ+JA?L%-jE9UpYfsamyxmFVA9!4n?=rn8)o{2? zhQ5Jeo#AG0+S0%A6+w!zeo+T`$ZM)95)IRF8!QP`DPAL_01z+6z0X~;6 zDH9GpiYZG9Kf&ilI4M`8klvjC6W~f1&#FiJ8%$wUwF(U=pMj0c+w;wq87NhTb{x^K zOIaN(cc7XtE9{>IQP)lBwi$}KLq0A!ORfIQPf7ZMMF-Plb83_L^!l@!j<(`(iy zK#1w{t%?U1-kmhMQv`6 zYCbq{-~UUQ2hib~9t5PeHks{qi3RK4D2cTDT!?U_kD}(s*MdI90zeIG)~6IEy`FI{ zcejfkDK!tfNKhP@e5Rn>N4z)PS{RvSETX|{oT@{Ydd(W&%Lg@*zdt~Sp=m(5*jFvn{KaAuPCY;{aHaWtMlQKu zPBX7UQb`4%f_!-*&IPzGp!{yJzNjGFE)$-uxDf%`-=Bcy<)Pzhdq{F59-qoJnU7`jV&v9-_8SyVp|z?NAB=f zL1qy-obf$h&U-M1pwtx_0bLZC{qmYHZX!oIeTUz>u|z_mVSi-mKCK30?yK)ysF2^* zT|Mv7)4?_?t0IkUU0}c@80{WgTl*XN5~`O-U#7%4B2ghSK~9}(Gk`RpqboFDv5>5<`AeDj~YfCB#%;x=ytXi)~9K|I9gn?13(;)EFhC0W=pqS zV|GU=-iD7G-C?aA!*_QvX>@_KUI?Avjhy2wHN}Fpvt(s603OiIjEL}x zz#pHw*zxSB^Ipnsf$sU;6Z8q}C*CEuFU%d*x3^kxWE1KC%sq5-eeR>9qX!tf^%9uc zyQ;(nUPPZ9-X1P@w5n%?BxJUF_{GtDnt$S~lIQi-uk6pxJxWwO%+^!rMd){=t za;j6~YrS?P58weo_SQ{M6(B6kH^VS7+m}rbYI0B!g9RXXoB3+8i46FUbRb#loQ=Aq zj&mxP5r!+s`LdZD;jKJf^ppEOC4d-LE#+)CY$Q4zjgB_?DyiJ4(|2^smHL`tHZ*^1 z7zFlMja7aVZ_+=~l`F0@LJ0sIv{WOzp8w)g#;tUU;jlZdK79Wz6q6M|Y&>+q(pjg$ zviI|86IzSeZlhCaT2H4P4wajPnxt$~z>-F-$s3TMZ(wkoFI|!Tn0hAQ9_eY1lG3xg z0Prh}Kq%ktPA+*4dtTjmR1RgdM!3Y6N+_>rO*zU03Fhs1-4RdGYi6$3xxQeZUdq}5 z)SVaS*m(|V+iP^lpFhI`g0$*@-fOetl7lcYrV#_U#`H?7=yHxFKxP$k?Sp+OZWC>O#58dXOQOtJ-q4n z_gTXQTfVN1Sjfkob>9y7o5FPz9zDI3B>?(0sDiZMN_jdxu-3ACQ96l_>jZ6Tc3^R87AsApL-m+nDx&Lhn@*| zPSyAyh^pJQ16V>H=lz%{If`t6mHy+kk4Gf}@SL@X1&IZGLIaJPV~M0ylQl;H74Dqp ztzskgLVqrREldggzwHh|TVv!jafq~CCvGBscc-U2`=R0C;Q}0KoM!@GXyx>D`;z`T zLK#WA zOZVth^!M1ykf`t+KJM{Uwv7d;pRT7c=fs^4HHH2bYyrp+$iZb-FzSca?-J0Rg2rR} zqwUAQ;1X!x^w>z#o4X1_lZs190$q-Hgm|ha|BnC5Te`Np(m^LH zLYK|uVW@5+#SiZ>O&{gi{##77ewFtg&{wx#ugeE6u@M|8J)2z4f4o`!n{~e);p_sz z1s*}iSya{_oHn>82(PKWj66Q_l$ zg>GZ^l~4NwL~waLP|o{fDfDiJ@c>R1*qHUaO+TPC1BPk?NH!_mq)b%!~)QWo#N!O^}E?4#@efagUeVEwYU>^Hfw zAy$kQ9es0)YRNp57N=o1J7XipchR)rgOLx+lEy{j=rLg7e#m z>`+1I<}Kv)`uy6eS~ig;A6FizIJrGfc58QvV~F@T+=ssXScJ0CSZOl&`SqC1{_k@p zA1b3kQ;|#pCvPSo^6}S_UJwNal;HAsUQ}r|ps?8fRc|p7PqXWpQcm;N_Z$YK+ht@u z3N_*Jb_vVhI_=KqaUaZHhtj)B06hKLPe=xKYLXhKEz|eSNATo}ap%^qk9xJn0eN2c zM7(Zytj!je!oYXGj+5sND!fPSV$i+V}|2 zTU7L~%HRG`E{o1;<2vp8la(0oyFV8y@7qsQyz_b<&%f|G%vn>NnRK6vGbg@OFb}(W zZRPc2=C^8Qde-Fr6s~Z;KwHf(E~>pgsKTrNgD3AR7FwG^a3LgrXRgjS4T5$mpCvi9 zg0JYg$99KpECHEk$D=Z)VnJd>?{tGXBr)Y_y z{jT5M;iwMMu+RsI*MU)X`pP8xn2#u2g0mst?sMqgee|(;Yy3^vw2c+Xw z;*mh3iLad&5jj3ji$x@*xP<8!PX)A;qlpW{RLZPB0Q92#(wBUxn5gh*$}rb9+k?qC z%J7t_V`Qp)BS5_qNYtn%%MD9TTe|@t8;@q`wOimGXE&W%0EtU~)q1P3`|$_oy^UKC z$BQC$ka{(TRhHn3-%t0wzrZ#!W&dKEo6(QlU~G;2t^I7+p*oX=Dgotb4Dj@^M$`VZ z(5N)Lu~(-;t=|B8F_XutXN6+0sFE+vZXuW6%X~Ah8zd*2hDWKE%DQJVop0rcwD$6( zq^f?{^YRoEr`PNN+!$B{dwK*cmaJKIF#FY;9fDe&ae9C~z!MHt(B`MXGoQ?#Avu)R zS=HtY`t3I#A;Z?aE>8ZO!uHE0GU~U8tCBrIGx8o)=4l58c@=8$^Z^quCr-bEH|OO) ztr=&4OpcSP>-oA;YqP_8KQjo)GN>o-S_2rP6v#yAah=x^AM2mJzW6cfHbf5NlE`TW z^$2N=Ljd5r+12;pfyJm(m+@(O`V;_}d5&kaQp#N3PY@EUKJ^4yDVxe4qzDt-5%U@r zdKzTff!~I6xQtY+`}h?BiWk}~#wUhR0RG2ZIMjYCXfnhF;O zHcJ}}HBGl?GsD=i8PxSZrW#50i@+Rkn=d*o8K((4N4tfxJjg8HU%`I4p_#oHR z+WApSg(b~#y%T@Bp3A1yW54Rp2Ef84DCUsqc{^MQaB=ugmV8#jm5%=nFOtvicBVfU zjb{@w-OI=2JX(!@B6Z-%RTBydYNDj3mXeYJcpn5H3kyqw^~}|%Bgy$0i4KGXKwF=)$tCwvu>qPglmpxw^#v6W8$;I3IWhIh>g z-r=7914-*fl*Yw=X8sfaZK?UhXS+O}v4ya5v>4hGi5K%7Df|YOJIKk6yws11VN^G9 zQ)0dEdJAD=vTcw9oc7Q9IBYq&7vGi@itXr1u4ybF!Cvip5m)`a1%01S7N-(YJ{l-} zYrbrEvk1_NW7!`!^mTgsURGe~5ybxKd#yr~QR^2*&O1hP-qGcZ&n=5XkN{_B=i3FI zx)W+0zagg>2^ZzgPC~U|+b}1AD&r65p%U0)T(tw;U-od51#d!G@aux`ctaGHy}`eB z)j_esqP((7ytFa`&~(zko;FK5h5Kl5LmIpAYg>IBOzD@;@(U;Qp%Fp8F|X49vud_+ zq76wwMMXtT4G0zS157=nq~Mi>1_yH|cK$!_I7CkYPUfO+agUD(aOSWsw#pcW{^+)> z*t>vG%Vd$McdKc#%MG?_Km%Y(q2N^<5Q?uNtb!fOLB3l$W_xx87B}by0_n56?#^S!+BILN)}`B~Y@-Je{f`+r z53ouEFyHl7Svkjoa*Bf4a^UO4GL?X@M~QH8aGj*oCOXvnYZ)WYMdbILO(#N8%xQkQ zQx7R7W6fd6D2jO;ju>aP6pGemn^dztb!`+aNsYB&WWI=PjE(t`88+@tAl3&0IGK?< zw!egu9LposAs?AhITgI*&Zu#W6j@7z|Jn!Bh%EyRu_v#~BB$>AB6hEWXJkYCm+jyM zP#wNm@o{mvA&h=_aHnW2Qr(eJ3^{SzFNfqUy0i^;d#V=;_}x>)yJlS1^9FTdJH7C` zn(%~P>aKJwPhFX9nuLkz3>y~PDh$@VI%%YY`;(BFF*5v*qlev%i5UntWY=9IPzNZ( zl>G-p&UtbfJR}~;U=MlcaMB+NF%ltqjQ8yNk@&-?xLk*JLnr52o7>ev6NfZn1ar$J<-fcLOY!#n!bgyC1*hL_Zn}Xa7t^;~;15cx#EAdBuDtr)z4ms6mp>8tZ**#gnMO4bQn{*6%A) z-4FOf#k*8bn4a-Goz%zt{++tY7m*r{Jzw&MlN_6#o}QJZ7?arL`@+k>1TR~Xp97VX ztoey12p$d9r27F9Op{J|l*Zt(lnBP6!01+0hE46WdQsanm=8Ll+Y$|oaxEIpw!dXL zlEqs&FT$%l9b!^`2~CMaL!n-zc9>EoZwMf~ek%f9mX0l~p6P(6~ z{Efs^+RY<=GP@HK6-1Z})?T_C!!r1f7sq$0_!$1-G zyNs>^JfsO`+##h;gEE9;mi#9dNdwKz7K4l0{GPfmu~Cat+#1nxqufOE`ce4l&R2Z? zxst=ug#D6+-@*yoR&K2c;9uq7FVhhN>h7Zh!xdA+IHA66j)0A#{@~K^D)^oIM^dg< zIE9~yOQDVx)mWt2K(Q{Tq#_~59+OR~KCH6riBtwzIHn=jrRS1Hjr)Msix}Q@Iw9GalIDxJ4RX_yO4>s~?YT3z$VE3~&;sJF%$Av6c=*J_Fq9R}9r z3fZpxGce|9Y>Bd!AT@^)+N9}JdqX{sfrx)5Z+bg;+dxH*g~r?RYGkiAl@Bx>By=%{n6zT5daW##WA zdM$t|A}Kc3|MWWsbu65?w>N)y8525XVh;rc%{&HmJcY8j9#*(f;o$dQUOOGV)t*>p z5O=%7WT~;Sm_rzgc?X6EI8E&ybh+Ue)YzHI8W;!d8$`4rGBU;8-72;VN(>wY7V=6; zgJc=$=@ChIh^&m`4a$%<%O7(CuO9I8^MW}77!X>@hF(=!3=)5ZNY0oPB;|gX6+(eO z>IPS+gdh|G-XSv`g!UI5?LKo&$oE$Xc;r8hSyxkJ-A(+N=x=$>g$|8)>l9E zl2+&9(Kv@DpaSXQIDQ0T=+i(~I3N5Oc!*;(4b8MRrZuLo_k{?lD2Y$p-XCz0ExK>B zYr?T>6RlA3ek60MMv9D6fegEPtS@w$7~d>V%9T`dR4;$vz!wY$l9>~le$_I}hKhw0 zfng%NC_kW{$Amv({F|K}6MB8{%H*_9B+^KSBFh$;=k(O6?fRfmk@oxc39%k(9ma8k z95OJGe(I4`4@Pi*Z$p_7eyHj__MGr2wM-VoN3;!SU?$oZVKAE{CiZua@YnLa7FyJ2Gci2X0L`ym(SvGLx@V8s# zqWs<*b~Tfh^b|j?iO)*EJhUbMYE*#z*%+HBpRU+Oi@55jFEBByg|0b@F9=oVa2WRx zsq*#9mwW#^U6RCYKY_%<5@wn)b=(Z5g${HxCUW34Be4Y2DIn#Ih@OBo|B1?^GhtX1 zlc;x}qzn>{U>4Cy8AU4dmlMW9pJxV+mVX77LiC;;=KL8dO#W+&tf>qYv>;R+?VUJB zA(a`2$6c5>O+h>)$t0L$n6IBTW-PW|s%VpNwYRO4=)ql-)I&_?7HQ@F6Kgl}(dW@h znrA(}Vp_mzRC5ET)1m1zR{vlewuV8EJNvDC4}+oSswk{|*IomPVAPF(J}l=bT}1$AjzsefAdvjplfk zkdunDe=$i+5@(#t1A$+C#Jccm=mlZj&)UNTUDo*5*M-Ncj87^uF}^Mes+vSKfx-Wz z`NU|G_MTdk5FhHZ|7En693SR)_q8-kkVRHalLRUzjRbHtFpst_tHCqneARJ^(X~GX zbbfkLI;^W! zF1D$c=iNSpVsi*Tz;(k$#-9Z4iHK%JRJ7)@QbuG2tDeA<`TR9`gp_FyE!B~u5Uz56 z4gvA${fA&db;)t~+w%Z9RPr+ep~bBkU^xTiu$`4P|H?(?CJIyTKYBr*^|VEYVRM4X zBpV^`IM#X|7XmFev$P+T(7q~5C;Ip&`RU(7>Yhnc?!cnY(BN(8WrG!zVhc<7$EPTZ zru^fjV*+36pp-MhgQk%Hqj)|JfL1Yh{B$|k#2><8odd=CZoMFIKg;@m9iqaeH?8hM zFqp$Sg;!WOZBZV4RL30>6?BTQ2OR+Hscr7m7G1=OEz%z+d4Jb7H=Qwx3&uM05 z4ezw+)`h@(clIcMNBVbXDhGcL^Z(;h^rbaaO4Ac1SFgai3(N#5sgTpeDxUhrgkX@1DAx938 zk(MKrWJ$}pfz#1pU6`35?{wx8*ki#I;sHm1_s3BE&*^-FIZ~69wXd0%fm0)eB0Q%K z{>xtKSrKf5%LXX%l*QYrO%&!&GtyJ>6ssS2ME-Nk?=_Mgdh(xA3o{mWlG`^PBI%%- zR}Oo|lLx_c8c4{a6UgM`U{P{MTrgGKh%%tF3v(-c_mCRCzd)-#0a1`dgDvS=2 zpu+|1DF7;jMs-bEFKEwTo(8u~SKL*YmInF#3%n;sS?FZXuY1M)#4AT+6(;X?CI4C0=f^Ve`d)4`Aw;7xp3l3J(8d zv_8yv>wthsMsrFd#hj{7d?k%&<-}!YEz;UzVF4Q-O_|AZLFahvv~cL|*r1Ckq7T;?n%CPL0oA%rhr zed@Y2QqD;stVl3Bf&pUE2DTc4bvtx5T$FIO2%W7h!8I^Cl{GM5KaBZNm?KcUKl(Dl z3oG=0T^HoB=P{$gs46ap@PErnLZ;LU>+O8@VxhA$7$@T&g}9Mhs}~=!k-77N;5Et> zn&F4D=1yvGrW7r+39gYGHanLFoV#IT|5y37sQ2u}Hw-l%E@FSOZ}RA|%BVJeu|^-D zu~6*mr5|pU^>oKX!afqt>Bf3W3e*jUC95lr$Je^RF*{$aN5gi@iZuOT3Xs+K@wm^`u67LrlO)^byeS+lJ*G) z4Q%}14y~iD#y$f47P&@#PGIYII9asD6qoFow!NKZ&i zScn~t=<%?R7$l1rsupOACp>kAdatq&MflN5qwRLoR4z>F1I<7MSfMUP2Abg`6(kL6!YTpqHl#3aCyk`W$i z|B2aj#5Hwgi1x!3u^hM}FVdbM#>*E<0s3oK2Zx**Nqr7)ByX(5rsEulM#`l38mt72 zW&?W!sW2`0z1V1x$|3u|4dDuNKDOhBswWtv@Y2Z%(8^qhB<2!{Q?Rya#Y$lfI4V{5 zo1rc<1qtQBjaxwR8#u)13DSup%DXHDmB3YmREz{FrHY5cY_mNEwST{fOWA+8o{)KY z^5b>d+ywr!cs)E7G&;0?Y`C0)U0<8Hj0|4alNPZsl(q~}`5bMP<`Sb{RlugUAeHHT zm4K`vwEnk#k*~3Wx>5zD&2){0od8M^qDmr!&gh$&R9!_5OJcWF$d_}-?L_vsy}924 z5K^op{cNwmjBh$i!0XRgI+ySBgWv0;)o3zf3cw9AI-0NBpss3AkpWyOlH#CfzLfeC zBig=a8dZph@}Kj`-3U5CA22tRXF0_|3m|>B-39C<9iF9rcw2Q3FBF<;!$~I+hbX5LUcCUzzRmgG>r|7=NS{BQjMV5T>I9wrzt8EE- zrR<;nWcCpN*A*%}u+KDBB|9Oo9+ln{6ZMykpNx*o^yJ6I(9~93J{e}!Mnmcuos8BL z{&RlfDmLou#nj%7xOg;T3_*3`L*94ltCkM4!RVOqG?EiTN7Lz6mHhn4unRb{zZi|y zm*J~zD0`FW_$=8rqR?Me1uo1?|A>nl6Af%fevAA8W~wO8`Q_x{^G>Znt7lXN<*{dn z7b?M{y}G;QIAMWFzI|)=TfhBPtahz8M|6Vkiy)qm!**#x@s!)`jT^7PK9fEX7E$A; zV@311fby5zN3qy%7bT@{zjFc^)0?9S`5d0^GPe&T*k!u+?gj=1O!kSmy(7uQC$gUQ ze{~&n2kqZBxUlfVVf2y@m^BRslOxrs;Bz_V!l|h2uq14mktIUITGSYaNs23E^F)}g zbNwpA@%MSUlaQ2*#$%)6=YNh7dj0n88!m^+Df3{Zc4&|?iApBhqwCP6A2B}4? z50d81UneMpO7^MTGYsKi;$m_dF$CK>lwvhSY$g+ERF2XOL$HwOtLCx%O1={($}?8R zi9o2_UnA<@awEmtbaSr+zPF7^-r2P(uQV|-JWv==h2v5SN5Mo~RzoE~pFoB-2TlVI z!if8)dR>UMiEBo00ZhJj0M*#>|n}4uYa2(-p1Q(<>|!pxHr;Lf%5s zvls691FxSrLw^mN&8+(shE3|X$5*iF!l2-RNA&H;OpJT{Hb!KHSzy+_v7CJVv7W=V zwEk3cUisS&%6T}t)nI+Ta+%9+QQO=cTUhT+J~hrr&-mM!aPn$Of zQZdF_>)A8Ej=kGrE=_^MC7Je3UJSeK;=3oZ9Vy2-Z}345NvM2bVbSqTa&^~>Ao-Kx z=})EEO1+P4J>{F>4Dx*PvPeYUY;A+6xs+(jUI{g+?PG)MW^`>3jlG z`7h}>6;c60MMulKH5|PLcD+8!v9w~$VLD;WKWmDPu59UnwxM&UQ#%F`Jc|zHjSi=l zbkLj*OI0)Jd~Rn&yB3f%YqdTxhE|U^7%W~WVSEnvz6ryE_RI2z#G zuqZ6J@~Npy(pKiXxKXYImbi6O){VNNzyBB~(C+5Pz!Vg$b`$01n;thAz?eBXIT5N5 zV>i1^P8!`v;+Nq@S>_MhF{j=NzH(cmjjN?pLqZUx4DMlOe&OZsgk``&#>==kcFYgF zNmkiX;jRkKk{ky}f1<)Cp;Il#GlCerfki_H=1|-**MxqmPlHUHxb}@l{DN1_LSL>4 z^3rZ7mXZ^RXzxqB{o#3(2BQfXvCI4I>VJqisluf>oqc0T`;A*vs(MN<7e9N0;{932$sKc>fD3?m zrcw1f(r-3NAGfa7Xx=*2mv8iMV%z1k8izR9z{&E1znse4-Br(kP!e3?77&p0{I28l zv*Xi(WAE!T;>Y#jeCOqrGK)4zCBY~s3cF>jwuzkPV;9Ze_3Os)(|AEHp>O3MZu(+` zzDo+M|GmZE#+^Bi+P+{;i{nhKppvWUv3uLh?=-ElSbT!CoJM`RJH;peKt!Y%50ZVp z93+m5ivzeUm7fvBn9?C+SEs?c5U}Ra)UC)+v`#+25;lStk_33y6q4)fL6a!am66cd zN=S&d%8fBZr{(93#PyU+ciYIRPe|d`VqweteGR0C6KDwiAJ+vc(*_3X^mms{!o4YG z*t{o%Qs$S1TGjqnvrLoMB#JJLR#5|TJ)s5$c`IFTneiZa6>#AD7X({=qL@+Ivyz!} z93$_`uVXdTg6@9){g}yV@k}q6x1kq_;aGnkiSV0OPQQ2v{XJkSZ){R7F;;T#=nIXS zJ{H^AnHVnVjUqu8jIXiOIuUHd6t2&ez?=xm~ z+&|%QGTxlr5`l3(b|sWx#Ov9+akbu%!J2n3IG_NMQpfme*PGS$S$5>d5RN;+mrk^f zSV3R|3zc;-naPN{7p~lVxLX}grsodW&;j@rSm0}X-ujea>g^xP8V{QKc0PxvD1Lu% zdhxnK%4gwry$7F7V{;5xHwMq*m*h5ywa73Z% z{KZ0_O_`Sgc8tw}}V zrm{kQQe_1XaVt3y*!+OH2~L}m`gPC_<#GWqA==6j?ah>EoWqqCP6fm>2!Vh!>Dacod>7$kUyjq@`{{IaSpQVrDAtBr;LRk5*@mWiR93BN1_o9wSBe6C-lfUpU0zo6#3 zKQr+D-2D|Q!Zi-(1M4<%_FPDE9s<%CuChvg77{l)78NJBOB}xY`@j?S{LrBH5Z??@ zE*%_l<@LrnOqG6Zj~z-nhppg=qDR--c@+xDV|vv{lCW3Y(-$j|&c#;$rsVim^0t5?p5S{Sq5?R0 z5YivSl&bKwnwAdx6<52-OG+Q9|<;XtDF4( zq^8i+^zHf7tKpPW-iSZbo|tG)mU|##r&r#=Cs36$`mNrpb$M-MiQ^68 zxSZt)HzGiD-7AZta$el+vVuCS1Q>fHeOMS-CwrksT||;af+Qc>p%Uezw)o$JWi&4bzB{B8G_twbA;WF{T78)-AQ(`?1NS*pG_3Bc~gU7M@yQYM?UN0 z=;_(i<1ZN|+jg%h8Qp`s+`N%O^TiX*fB>3XciGK-#kwi8i-u?zlGmrY2t5+IAZ76s<16>$1+SkzZOsxhg2V)DV@BSE3h8%% za8Ms9i~BF)x8i21;S{{kcAn}O6+rAVhTXBH^61)sv$A}arjvowSp)Y~#M^iMK zRl39lY`2HxSvf(@uwD*(X$m3(o69j=bz!ruzT}XuP&v31GpRgYRZE~N^#rSIpI3>m zbpH23CqX_PpGG-Hm<&1*mRPppr1N=@@T?b_W)hSH$yL$mldHK7#5nCS9aR&ktEaV^ z^(qvYD$I_Q`-Pp1TQeOd>c@23C$~B5XISB}xl^DiB2;QEMzKrFKfs})zMVF2)KHor zH-Xh%1Qb8ut=t<)fRFrd+RcG0$p3~y!B{dIQ^xlAR4Z-PA9rcJ)y!8$fEPJ}6u-Gc z583&B($tW`Nkpak<94>=-k>IZMeZ@Q0RzPMQ7QOdP?Goi3_y}H_`zl?$dnEtTxzK^ zv^(lwoh!>E%z3n=1&LMylo+&m8p%}UW*5C1pur60p`=S;B{eZ~$jIk<)|$TGq}{vh zb|7zfqYhuZ0?G9=Gc(qm%3-2swjo^_pnS)nQX{;zx)(NyN)858N7I3JJ3NJf;dy`g zf{W#`Qczgj+pQj+$UrRWlTS!P9!2a5F)Z>N9-~w=HBC~-IzXK@TfXsa+W8OD?BSTt zlTSDbL_Y{)q51|niV-D=d=+XXm;5PQ>UoqC=EpQq;FAoVT&sT`Gv1zobrx(#Zh zqe$1tls~b5yoYLxA}#sgZHMwi;iJ- z3O!QMRAi@UflwxHKie7gTx(z##>cP%hMfT@iKLvH^ zlP99galx-g1h~~3L*YW7=_vP-L24+$DD>w?jrce3%s|_ zT_ngaKu>g9X3+vMPtgCca79)K1@!u6^Fvyj+!ymE$PVWh?yq)__TmWxZkL;f(>9c_ z@^8fZ>V9a*Cd#u07coKu2VdteRT8EShT{B;{Z13Z$uPkW^gj23GRWP|{w#R3`#M>l z>OaboHv$sA+*oa1=l!EvQvxq5WHH+>2nn}}oB8XoWQnD|R_|B|rC)zz9pwmql&!32P4^~}{lRFNR!hx_3v z@bdj{RF=(^o#Z^B?9OxHH71%VeKj`~zN`r{p4Eh*HRl2#ZSlhu?#efh`_CjzE4Z}r z)PQG;>1`SaX7u+D=$dauA$Os4X5~Lq;9XW!CFJFiN^K61mAhWP#J@#_U$qFz%A>Jy!(X9DCzuXO0f8@}22k=vJ~ zG-D}ldnUohQ#091Y2ANz#3#JQ+eEM4uXWv-Wq3)zq&)k4LN)AwLjjmO>jx2^+EuW*4B#$pD3`I zbS>+{Zcpz^nEhw{W@Z;f zVrx3>VSf0DN!b0tJ%W;5cm4cruX)Nd;p=&i7%n0mkx-m<6U@S7YEYyrq2;3848DR) z@pz6jeT9f7;;+xVSYyJ2(T-hLx_l2Od`_6J0PB!S=2SV3Ub|tjgV+&KM+RK?-4k&b zD6&T?hB7yJ7K{1yK1{?j;WYcOKAnH&B;-%^44bq%P`WxYhk9R+bpyo3AeI16da|2? z$DX;}bX@N3*hR=B7*s+NW*s0Y=D5zVIpQmr5c@pygbzXN?nO|~v)jJ1GTb=fbnkkZ zB}P(YX=9kz^k++x1re)25^zxEeV(zRmjBzPl3?W`S>8_+O6vX8MeKb3Cj!k7V8(u7 zv`k+zWs^CIwCorT1mvisN>soS9+%5cMFWYAIy{4x2%dM8#3t#fOC`+d1F8ebc=bi8 zZ#K^TrVq!w?g>R1%>(+Rw!OOU<9e+7`4`1{mm5x<4rRm96+;LlJE%c!2a_S8VknDc zF%Z4qxvd}0WAIM6*v{aHW10=xqJir3ZxoV_9tpX?pe1tSkD!UH){-A!A6iA49Ry-C z1n6PdYP=SR=spM%IiBDDg$kP`h187y^RcnSpqYqDJQJf=2{J5Qo|IZCdFq_XW zyom2m%QYMat2z`vuL#dV0D2HN?j6)x75cV_D5p!u0yc1Z{!K%c=4*3!_CByQx=}lW ziqCgXxb+-%^1ps9u05H#osW*<^nR;@vz@nJtzug)R>+Pb1NA>54toYQYMrA>NBB!# z6RsCcv@bTT>D^=z7N3`rKB7!GPjsobDF*pG#ViNe`aRyd&FZ1Sc2@~Jt)I=a4Oy?$ zdTpSXqY#WZhkrmKd@Y|M@V@#DU6}zVEc*TUQc^;pL8mWzFgw8FK1=LiqT;}V-Mb8+ z6>7GbiK}ZU{1q(p#)2!RS-CD=1_B#*yB3(}xTsslv_mZQI(fh|nN#n1WJr{m?{w{jC)Aro|H8F~IzuZ1jww)-hN1ZkoUOf!e;kzr6W8d~N5r z5fBu1#+I}HEpv@y1U%;_R0XtH?KX!t%=up=3NAnUMMVmySgt=m%ct@tgvYBnYz}$v zuc6+Z@g-(?@HtEbXxj6(Po7|12IV%%q*m!QtF+x^vUsCWHzMvA1E8!(`1}Pvr^RX* zTkS8pykz+Uk$Ck{lB1D2dDOxE5h*JbxtelA51$j15nbBa0lZ7_N=526xSRxn?fP3z zwm=JZ;N&y@*!+TCqXq%R!FLV}pFwzD$mUyow<9FdQ7y-IC(3^7CS(vRW>!O1ft4kf zd)?*a7P(2!y5sz_1%)wn4)0{~#y(5}q15dSAUO2I4iyQ4MI|tDT*~zgqN-6&=_RM0 zhpXH2XV()8>O1Ou_%aFI{dPBU)>PSGyoev zi`KiRW&>AHoXaH!ejy$KHU~k2Nb^|^^0};~1}3W9ht{o(Tr96$veZ=@KQ_{$);cNx zJ4c!v7;Pp(FyM(Z5GNK^$_A$SX%y)QJh z7?~h*Zujk7zW#l}&0LR?>GlqDTYAWzdq*nbxc!m@mK5B8GYMPX`0~N+_Pj4Kisd zhH%l%YYr7$G3O?Akp4_grrrAD(q!3)iT`doT`#$I4}wwR}0zCtSi z>eG>o?&(7Ms6Vk-<(y@?!r3)cvhe<>F>Y78v@k)Bn*rp~eKoExO(5RmiX~^2GuQ7@ z*2XRdKW|xePG~=IO|fsE2ssgSyd0n7VM<0Ae11|$M)Ptyjjj2~HB-OE@RgJ-e&+ae z=4}Q9Lod)L`TGY0A@8$R(6C}J=!jZa?`VID{5!VuP&P*KPzIO7gh@vaC%vcOcU*t( zFr2oQ8NIbwSL-aHpxO9B+poM&6$c?hc@oQO7umc%(d(F3HlxwA!3UA7wCkC*Pc=$| zO3&#Kaqb5%s4xdEJyzrT8X@o7708k+Ii%zzOz!mLdX8{aAIz&in9t##Sjs8n)6N?I zvYUPUwCN-csj_l-33GTFUITM|c!ffE2^9W$GwHW53G3$b>4_FsN<2~)P*aPB10TBdct_x@7#p9 zv?>>g!1!By{Fbf8xn zz4E`7-!WZ|P+d9|eIWPcNUzY**-lbb)izr|uw`Dn7di+Ni{p*-6~r#^E0=R?kb%X= z>v=@fGFCE)n2$54cSs*6$<;(f;zeOL--1sD3h7IEvr+mE@60z^pMI>*H|~ekdZ7#qoURbHSzXUB4t-9@a(tDI z?O}EKB@KegSZVUg7wH?2iq3>9*SNp*L{`j~2(xF>vD=C_=oTn&`@KCw0t13Mq~%Paps`7jED<8d+8HmL^(}swViBc>BtbE54Cz=ZMZA@A_=Rnj zEohe2gIni5Y|~FheR@Z@Fr#3ERHh44@(+`hpCy~V8`t(^G2AOaXw?RV2N$!u>&*_xX zi%?2&??QDElw0=vQ?*@dC}HGF9U`2r4Cp8(Es;6frF>UuZVZCXoPIfc1Ow8nn~6Ng z;GfxKvLs*`0OHC}VM$%MD6jL+=yHU~Q|{m!NhCUDt;s5~;HkXL0EFa>?fDG0p4TT9 zv_e^=sCmno_HAuRj9$^9#I96exu%Q}q^3HPIw>D)az&i3fjwP zB5!On=eJ$Hv~$}+Z4UIaMpd479cQSd6el2HaEE}GJ&?Op z>$%;BRS`NN&>5lzoY}S-Wt6~3OSerh_jgx_S!wlL3L>6>EUHRaoXC`~??`$H>$0Bp zDv_#GqJI*JA9=wFleTF4!>u>l4~#3}%zZ5{k&!3**g$m`p7&V{i%^^LO1t zSOE_UIngTBheAl-)sMCBYAk<0wS+A-QHTgY4+E&+yh-C3@d4%RF!cR@%kcg=I^_)_ zCHTl77TQ_WY}o`KW~S3x9M5JRP8e3*oX;ko0!=Co5xYc#-;iLwTn+*a^W6<$QEyC4 z^3=XKkwUcQgjYfq5Jubq;Q@&_DCv0KIFpH zipZDZ@?D$e5;C}eoPTx^EZxPuaT$9X1n^F2HeBJcxh)yhneMLmqMFU-i}rxF9;PlT8O>F+tx4E`Q-~kod{G0h0+ge+oW_R=XT; zqO$;4Wdyfn@Qg~6)n;oq|1>r>0c_jblNJv5Q6$^eNQDO^TmK+g!FxNfAW$5gZ#)hy z0a?H71TN4eJ3&2>mJW@fI%L%cgS9LSsTY-aF6La^LYI%xq1XiauJc8!_gW4-Q~T-D zeE(8zRq93mB;Z{%gIlfVm#Z2YSbuSe9{hT>a4}uc zx->@gm6P;>fLr-sOvfGJ^AQmJ7yX&+7)Y4`WT^%_wmArYCaxn|E^)aH$#z(+Lj)h7ef@$Pd z?gsnz*eU3A{0gKy^kXX5?123PtU{r=&D-6U09NP_$Ml}3Et#?m_t(1KT=*_hrwsSa zycIrEfg$qqDge(QXn=?+!CMbFznPLxO6F|>t`@&1I=Wp=%VwO-wW;3`ojD)eB2jc( z%pTm>*mBc>^SoA>5?9_T;xs}jWFo?MM(5w({G&m7<>rp%Pru zc;AW$KOU27CPjrIfG~sBClS!1J2|n*D`_^LWYpw1LS!IyK8Jl`ApU1v0y<9*?f?DA zOpJ%{c>Sx+?iggV>h5$fcXd*}+I+LWSoYKcTnmw4J+}_>M-K$AfoKiF>7$FoVk>XWOy=jis`b;s4{FFCAS5|g+saHb8F>vUi) z7EPO!AlX4b-Mn?{*M2LXvt6)Y3M&0tCmdfaH>F5hy4a*mTMDkYbHJMEjhF-bEjOt* z>k}x}NX(M5RHs9;0{O>bk;$ri>-@tBk*$j-jMeffecIaN)G&REqk92xhuw%M+J9N= zPkJaBoHx%X78W=JGUwt_$=0?ZIqk0I(%k%C?gX<5XM88ELbMSi+q-@sls@Eeq$wd9Y5Y=-6+^SvDChLDZA>rjr z5};9)hRSp0-I7KF+A<<|mbl74o2XIxO^!EOWz9EQ4etI(lmU069SREw_!q&01ogIW z_5|aXxb*dJFH9kh_+SD+4-gDmGLPTA&9oY-U>F8~(Itm{JGfChA?ud|lL(gBY{WxH z#l&T|SseORD5OGm4{vFdwbJ-El7$O_fa8+cUsY0S;+u-&kE<)4uB}n#iQgjXW4BB)Y`k!4q^PcCU@y=exjC0xEy{KzShfa4~F6M zR1o$1YjrazbrymbCIt)wyDNjt) zNoT@<`Te^FzR?ya8I#60CX#hpZdBMAECR*_-zwJh)z7--OO?->b}M*RR8%_;Zf+kd zE7tJB0%YJ=o&(r-V9BZ*jTurF0HEol5ixL@aTU6KxF_Lt0!6HuX}5U6)5$eZvhF!Y zPtM&U}D-!8U{h24gy{#q6#Oj9(w9A5vZp>SO|kI8PR=C*qlBQ0I@-oPg=j!fNWJGQ904=()BolMxW9X%HzQz-w4uwMXYDfVG7>yy_c zoF!HIM{2xP4Ah6cedg_ckSqZ@(Zdt*H&A5g^El@lFfAhXSg`%#s^Z$q<&ZA$=`+;; z%f&c#;a@v9a|fH1k@`hT=Yu75&`6W3f`W-$4`qf|)?ANsF0Xq+kq$x<_J_J0v z@{d^>hi5_r-7N=FH-!v*0Q-Qc@t)R6T`2cvSUj&4V%jW5}W)#DC~@CJxeVm$TC?%MS> ztjX4b&s-WKbj2;LpJmR0#%B-IU+%!rM=2VDVp<;RG-e}J4M-YOWbOxopvdQKKs+Gb z6hn##_jvnMd%!w+dD&Oeos3^kvmowBN4O*{y_k_p1Vu zmgHYN4v+}N);1kz`iDlmF^s^=mLTZ69WXX?!tJWM7@s+C^EcoAGy3;FuGB$h8b(|o z2b|hG9s%C6n3XBbi&ZOC+)^yrImAMRendk21j&%;6nDr%*FYh;Ng@;PMfL-UFC)g^ zn_fJqzu(`xuf+uM;bG9y!lCaCoBzkd`j03b82vZu5ItDnTzz?yvJ{q_y z*K5$hHhQ1j1kN74Y#qHpry0#%bOhn8tw;RBfAH?4^r4gNNWOd+;l3s)s z#E4fd;fjI2G+@kSy2TY_z?W&>&HTQia(L*4EaGIrW3yN)9>qs0xOQ=`cCZo5Z}6Bo z`yK|p+tNoQ_~Z6#TaY~edTXFRIjpX23J2lgytk5==s01v_kMks{=|8sffWNpTYwH>&?flHd@0>jbG~7k0!-7GhqlF844HUwk`h!4crNgIxxp1HkT^NBc84`5XM$z(;$KJhmhAW61aFA z)L_~kI3B4vo0;icpD)#=7!9@@9j?E9*NHYCPDq;?KXP33L;kfGoJa zwrU$&+uLRwfVt&s>XFN6xp!?VNVmLYA>_dEik`f+?-=jZ&;47F)v-U))sG$<5GFn* zMFPk`a7IYqSJ}tvbz}mg+NJvbKa;|FM1}jkI>ApxpU1a0#3+BMwXM-6PK$^fvYB6g z0p+u~+3Q*{k=3=Yq3~u4GOw+#X)$E8}ATF#A4JIzr>iN_}!@z zg1i`#M7$W;e1iuh(_^6xU}1b4=cz)0{q$Mb7FMb$X0wF;=Zx@ zM&pBnbsD07Sxu~fb&wB2HBes>h@&t9F3vHZvzr*sT1_i7u^BLKP25aId2S8`XW9O$ znY15kw+}C$#f|$T003?0PTyVY(dM$^${>-v+CjDJK-vpA>t(MY`6}(%tt0- zSlkF0zv>7zoOqK{)WUq-mvc;L^=JpwxpVG!ACoHTQVDF{u&bx<|IaE*J(WvaLxL|$ zi~FwLhIw*9)g1TCXIqwhV=-HLWY7`0SuPTQ@tW4-LM=x+%fJoo%#$Cg&D ze67-4MrHT5kR-0#eD7*b6`| zmtSqSp3e&(v`MT)Cg7SetBt^8-|g(`0VY(yQMG=A$f4kgIn#Wj4H$GZqcQ@I+lFZvOL?Hp>c-hJUgMTcy?2(h2c@i`Guk)`lnC*uNVD=F6(b# zHHsBo)1j1sb8usY*$n~Lgy(rncNsyiUwe%3*&KU`bNV+LryRC-%d#`fn6u3c5PxPL zHB_T~zj;LDi7V=}q<_Of5B((VK+tHtN95`SOgSS>mh)Hxnhr$VdeRfCmzp)sSHTre>qwR;wDwjO{?t}obH`%2C z0?v7!oGp8bs7>CU0#1SUM@L=vHfuADlYMSxUYEYHB+S*ay%uQ85c<-e2>JRZ*L-Y1 zyfb!p&g<7|L#OezGZi`oO^~mpOnN(n!QIhvhzSuqN{v|4DXAQ7>EN za_k+biIJ|@VDh%C*t+i^NJ;tG-(EigI}OM zSiGh%a%5>sam|^6aYnkJ!$_1j>zTlj08uM+iM?9Vr@kB>bPT^pj$ z(dA3c)jPaIrCa_^b5AIorai0CFXKff2vWX$P;QPs0In${va4XX$AT+4^DtRiP7^)9 zS#uHkjz&iY9sq$t60U!j5mSo)FYeF{_yP!J%mao}YifN<_IVPW@8Ss8LkAY@cmXKdQHlITX1# zcVnHZL3C@GL@{Iz-sr5oU2PY3!=eWDk4%r^h?dvNlF~g)G zi^Yq?N5G+lM8t=HRH%_!3Egi5axU-LKDj$E<%yFr?QKWo&=T=OP$MV-#!YvV-#D#T zeVbk`EsN3>NgwG2)=yVtD_CupY7sTj=JX+$p~4rDmP!pg1zwH%E@vMe_8T3pf#G`H zxNhUKLB^|z_QyvxQQJpv_G_JH=MLA+YP(pw&DLn0U){-LGv61jgkivrdw`i{=OhT zArL&)P&9t#`NALE(sQCy>-aZLHofN=3YTuYb;1MW$QE|FTHYdeQA!i>9dQf@v{lm( zJsI%y#y9~3d%Knr6IOXCJ+{fzX}P7>MXT_0;12xy#{`kzKlKL<2O%ryA))U7wFg!LIQ|&zJVL@Z8V; z&U;vCs02w(kw4C0((K4HPci7tlaWI%G`G2&asdi#M{Z0V_}47Si5yZBc@+%72$Iia zPy48MGoB6S=xDLdrz=iCQgra}b~Izlg_AVcg}B{fv-F~}@TBHJq(WFy=6RF?SQr7) zrIL`-CZiig9YZbE2=at}@Q6dLVoMS6L^YWUmxBGM2Mp&)qJKw8tw)l1qN4;GBXJ%!bBH!iTHV$0Kpx z3=#KyalSHS-+_$n6g=AIyh{;^Q+gUJ%kCq%O0EJ?9+hel$IjHVtzZmFHMy+%FWhL+ zOt`5SP_9VJU5to!V!7^e^QT)gk1d^b_z}3<@D(zjdKqa_fey zN@I|Xabm6Da60$*-TkVZrluxI>UN^k zD(tZ0MaO~$|DzwliGt8LpM@uRl>=IF@3vs>2~p!2iQx@=F-;;?NKT48U&!^%;pa9{ z_!+~0oo{V=F&W58oj*jk=uza(>L`#8|J<@LKk-Ens-l>p@yflRrCn-K!O-qk-#GK( zll|q;xs^fQtRhlTd2t0JUhf*6NbI3HOD22il~txEwzJxDn>^YD0KKQ;r4)4YkZ}rz zDNDOJC{9eGyV$HB>D;nmxgRm81LM&Hr;z`!WDW3Gkb!CG{qjBk4u)xVX`!?m=BFoI z)Fw3}-t5A>a^6H9}l~q|uX=-XJS}hwYfF9S* ztboqR*S$0W?7(kmckgnh|jS`j>8y!dspm96HN)&MHfpPaUp%F+6+~ z6)}EejRs2hA%xOGhD2I=`V+u(9d@AW(+os$w2b`_n)g~U?5xc z{)C1Gqiw3L`$BhNyks-kXg?FtJZ7@D4vVSA&=<*$uuK_|>=+olU{`6&6NrcQK|b=D zD`CN(!B$DKQkS=ND(&o7(mh$!?a;+NTlijPg38uyZ7?74S0EuhbDCzWtq2*;FX5Gb z_q%&5z-TlD1^Fw$iwh|8sTf2O+l8S0qwV}p6CH#rjIG!WIQ9#@vtrPi$uipV;`3b8-I75E*DvSRJ47d+UzTQEBk!A0pa1{pQSURu zsWwRktMdIa+YF&~`Ry^EpDMf`uMarQCZYjwQpsPhbmR8J_Z6BG-0TPZc2i?x#b&5Z zy+DgBF%y$r0JMBT7*K5tL-z0ePJM$&0t7-NUzk9>7(D=fL$*Sza3@^64ijcowPOR7 zK&E}T0BQM)a)sf-`zL?8$Y|qNhTtAyb0x~c4rI0cGn>Cq*U=`kQA?x=AH@F@J@<5| zuN>9#A$(MffDZG>cm1Co6`5G$-25*LQGVrT3W^W&?Sb&vG!I~3fKm13&Y*NYRAyc_ z-c{p@RA{Jk%E>4vZ<9_K%&Xz?#4BRW;L_#IoUP00;{jzxcn6Vj)@>Je@w-8^80EZ= zl$lv^aOKmv4y0a2RUhYmjp=wX$Y&}KBK^O8|8JPxcplS?I5A%glrM2KH9o=QtU-L_ zqmpKzi0>;9@x=;1TJUs)R+Yw)jLD-=2bXqoRcO@l^Lcc~qehF5K=u-BP~ESvMMgNu z#T;aTNXL*Eu2wf)5!@$H5kCBl*7-m83Xch5xPV~lQhP3fIw*_n>f9u@Mu)$}014&s zsN$CgtdL9~zH&tpAZcsRvUYY4Vak@*J=^M&0aUofs+Kbi!r;Ex8X7b=#G&sVbd1W! z)ws&f=TCw6Lz@@m6ch$BdZO`uEdLwWKm&LzQ9xq?6Ifr{Xpq=fu$5U)w7^Dpw?xdY z1xC&DqIDQ;gkgvhY&p81i%w5!HKS}5@KQH=;#x5ozdw`Ab*$sWIqD~4T3qUk_^ zWEs>%|5;XldSG6%gx(=B8^Oe02uMiU^^SRS_)>P=y@NnWyf>!Nr-ieV)0s$JNg|8e zz{$aJ>e_n7QPa5uki0E4rqAG9sPYfs>@6T85x}KnjSPrf0vu_$^w#@)+Ds=)Q`M2 zP~QeMgz{x9YImj%AtDr4Q^fv=LcBu*Wcce~h|Mhi zsy`Cl~Md5BHIli_oK=`PkeasV2gjB12br-LUs9jtLuHyUDyhpj@HIE z$`+VL@H{)k`MiM8 z^dwTs>d@mDXg)`ww2OfvYyn?b&ET!~TLG)KC=h#7{1xZ#oPM=D@V1`sJFIS*{1;zW z;2DQl7^gg8JirstFQiPAD;IGLCzh{y!Y9oDD|CzDc4@*!z4aQ2Y3DYoQd&&MbC}Xh zHWu*RF>} z=nyE={3?YHf?d%l25X6gqLG<~kmeeuG57;Q7M&5F)db@t4aUQl3t&@+cAQXy!UawR z;kmpTbq+cnfzsd%pL`Xfhpf@Rv)`xWGZY}0hwwFUfnE7jUL!8%SCNjXYQhIVxi^V_ zyy|`pTKapz^Vi=r-Rrh5p^Udkn9t@c1hr$X{G~Snml+t(XYjjlvslEA>8Eh;2k~tv zh?>Hd=yYtx$pWdV%%2TchGs2|RmC+#Ay?Y1fpG1!Lnk$IXCRE}`<_j~G^>8+9#H77 zG|5bTKxvofa63%XZ5tMVd;gFSI`0Cf3*_Sz@{iXEpMAnYLqnxOUOCj;yjcn{|0U@D z4{r{24nv)ELO0bE45I=jL;>u6y7obqNN6&IVw{#63Z%~`JyBEf3*k2MIcoA3+Wvy) z9U|uJw+cxCNxMIgzDCUd=d~f5eLazBx)P8GvhZSuq^H>K`lLdnvYO6H1nUsXn4Zeg zEzj_sm=E^l|6WL`Q9#PcaF~I z%Wr@#G#w8p9-m4>0R@H+Z;dn6!xz)xS%y)<*a|40vJd?BBmC7XNl?E`p!A zx#S+6B;N*wFv|=<+DE;i5X>d(E{AAfod1rB!(=S=wX}~T#G#r{LVzPU;}ikkkmpA@ zF5u9zcZR6;oyCoUCW57w>?ERw#e6){#ub8@@+aV1I_!(_z=;BLL@EBC%L>4i5)Uq4 zK5=Zitoq=o)5F%d&ret#CC!=VUq7ru9_06NN>Al_@eEf*R(pC}DWPq?5W@nK4lS8bh?MK6S7(1R4QxSk? zW>)nv7r7Q{Os`V1fKxVwD3ZYKa=SAla(4pgZ$^K9kP+K)^`CS;w`+}V%Z!`4pO43N z^S_xX`cAfe1C3h>tlPiw^Dyx;*j3C)C!W9!vVXbbZ4YqbWQ0R1beg7Hu3ax;=XPyh za|u3eT?Iwrt&e_x+TR;S_~d6)CgJ5Lz8Zg72!9jZ7tY_ z8M_nv(*sQy{LlAT*xj9shRp1^vds|cb$j_r`x3r+*&)l~KU<$CYV=O+kGtn7kBx5(~@3K9=Wf zXLrepG;Qtp(Ba3`Wvdgh?PZrlMrYRnRtYznp7)Dj+S=Sf8Iex&Ep&^MH}bN&uC*mg zFcF{Qm)=V^C(yFbc)NWFg_^an6+|FAPg~!C(hN7!1GB-FQQ8_t3onv6LV-!yQb)wI zECws^rd9njK0_Z_#R#Fk3OGweQ~FjfQO?B^{tFA_y+@kU8puxdF?BwcW`!~gQS-Kb z1EljoN4G-R=4H2nOMzZ6x@x95ia<3x?k{xW{rH~`D9GJZsVIW9YCE=eeUOn;7x{nr zZ=lAEFA9QAsabM7NK~0Wynoy|aPXEiU;_3La3lV6WYtPkqA!><1QUN9NKWi_&z9=0 z#sw+Y8tn-+4?YtFWXylUz-0MAB3#hlrlo>Ll|Pqlq6!bVr~b&_f4@nti@%{Q6DbVf zFJM5OX01j;leb>4a_`x-UjF7nEEwZRe-or8B5EU|+tZyK=1VJB@pbJ*g+*S>~& zE23Bgi)bp6^rZo;C0n#S^_AD-Aa*m!_siK7ZI1qfYf{U3TYp8Kuu;zS*TU%!Z|B?N zo2YRTk?BlsBVtxLe_jaLPb=c%Q*!^XX^IG*K5?VjG%STI+yg;xaq{gm2lPkp7tBuPEu0XaP~h^(6n$PdDPeBjlI zaIXI@z_(kksLW5wpx37})ZHuyQ#IcxznGB5MVBRz%uxvR_BlHg&~z%SbQLfRxI%PFwxCCs2PB#NAC5i4`4YaN+@ zK9@OtujghuG*r}0Xn#_H*G9TPS}d<0=|kotE>!$>Pc&V_2droTIdqtp@HgE)$f)w< zb+ow6ms>K7vt>^}1*et;n1fMeaUyryJ)gG8{Q4R*AKZO;-i!m>HtuiWHBWv{9IGKO z+J{K`3-*?}S4zYyo%j|ZN@ju#B(fVrslmOx!ARhh2u^T)F`S4gTJ8uU(p%0m4kndN zM}BjBAFI_g?aF775RQKzT_o4bUArf9@Jr#j&b|I`H zQUVZw8gV+`+C=$$M`~K|=~_Fb4r@$SizKa_@0pN@`&K@U!RTVksd8elL;-!u4DMk5 zO(yJwHB1@cfoM#3ycO`YY3eZdss%mnOpkY4%-J`$@vj}c%q{B}Fg_V40)-t7>^U|y zzZEpBPlR~(#Jb{Tg$0D>*7i2F?^%OLtX8#v(X3zEomrgl)D6IJ%Ln-M;e_L8x zXH3?Lsa?CwS`-Dv9(9-My-5buY;7pbPDL9j3_NaCUW3R4>xOWnd#g|$FWfreS8&;ClzmDmv!2D4I~Fd`9|v7Fh$PVG_XL4NQYAP)K+!qF0*7 zZa@++n~+|x{hD&9wOuD|DRU0TDyt~S`&AbE<=y2%1A4DJjZ3Rc!> zeIQXJ-ya6)-8eq{ff!}4#f||dYu<WkLjGf@zfTxF~7W``MwkHk*}RxIDh?1WlWL1S9|4O zl_pz%xr&*m+v{~6WTx*&fiylv%Co!W_l472&uOi{*`oaZD>~3y?FnFd(irZ4sW0uV z{c>*LTqmvHub0lDZq$2YoWaUfEX4xV5IU0=E`n!x0OHU}*KK5mV#$Rj);axJz{E9e z1gl%`@ypN{kW15i0LGqoG=)!)e)liIzpMYZ>YMLUz*t12`{roN6W7=eL0V9IV(z5n z&bd5?o=&yK&Y*R@-4BoBH?qgPiY=Gdjll(rg!l8(Wnc2 zWRwR&>;2w2m+(QjXK*PFTD_P?Z3AN+zl3xi9F6)a+vx`dN?Afe5+_!hV##mnXG_I4 zzR1Ih(BWhm$aMQ```Ec$W=~*deQZl?ur@Pkd1d1K1+~@lVMKM_dnHsJE%FGlAZe_V z1fRCh(q{PQ&qAIIF>uy8Al2Z78@%_@N>Md{-2$};eM9g+OolW`K2aHp`X?j;B&4FN z!;%x*l}38cz?f%YE&6D2zjXI(wGo$)+{UOdU-%RVJ@LadJB2xEVk$%!nlK!Eb0*w4 zxwKdla0k1=N{#%~YcdpA($dL4el;3L0YwX;cNLrbUUXi4VXBASjgEsXZEKAdvv|4u zwLG8lr@yfz3%=~I#)w0iOAvG@_$CNN`&Yki*dmF+@9&rEv~XB0gg}+??WZj9TjOQs zrIVTUbTW|9Hi^g*@Hv{j`9j9$E0}#qgq_6wePfxe0_CWuf0BHI&ta8)-50KIxH~f3 zmLi|NG?tm>k?3-D+juYuZ~BL>`!+)pzO$&NDvgug4V>%S=@u?C{2skV5Ln<(de8&u zoyk&<`YcKfLz*g2SEI{DfP(y-1WD-yE&v$oGpqeAd&_S>v_$q4I4iZXMkx4tmPvAS zM9*up+-_=m>IV?P42xTgy|D_G*hIU8`@->*~}rih%NfR9KPoR4GTbjJ~uCqI^R8b*`+}F zH9_%9ia?5re#n=Y4)^=jfSjjfM~UeAPN0+6AMumVHFLw8@@c*KN;2G}L&OACCytM!C%xQUKj=uSHT#WTHISE+4B>9A&+kwwlIMM>#)d;qUwa!N)HXcGX)>bA#P7BlktEJ)h-C{97GDp`hKq3b;%u#! znq2UXzhjT5*0|240?wNZp;49$`H1T7n6w`r8pwie!=l@p6)8Jwt#5+HZ+|-%Gt)hy z6g1-Ow&E9!Ea#3X4A8wb-~^+B*%-R*r*?|yb#2Uq>%kw)OvaD+NVZEj_*bt*L-#(6Nw=-ZPXr!SXHm$#iJc$01 z?0g-MKk$CLiDH9qOg)9&rUZmifl;A=eh3~gNJm8Aa01SSc->}4Y8s2LBdI@ZsAIsX zgvMffQV~(gu0>@stE;&~ zP*E-lwD{WSYA+U$R9jehp|v(Ts{Xa_0)4*Yjgo7vl8~L|`7&?E&yL7eZfrH=oQjE( zQXTJ^+tPWYbn&o?@{g26{4GZ3SRcoEu0j;}&4B>T*48bM+PJ$L2Ev_%7Qx8z{byl{ zYd~%k!bnm3_HJYe9$oL=2PjJt3!v$h+@dqqyV6sfBwW*jk!>$@q#Z3_HoR$gDA}Z! zGWr6>n<&2D@kkR`uNJgWS?L&jbW5x!isKHC`P9YAoB8cK`T1 z=OWZz%~qqlE;H?VLwdS_V)%?Tv!l1cJ;{~9QGUn!eZa^>RW0Hu6xU|Q{bRi=r(Zr* zq-6#wsL^)a*AoWGcsE>w**^QcZRuHg0lRNZDr;1UgksawlLX|@CMILY@bPpt* z*?q$k3{!TQ@M0!&C#7^3Tx3T2VlXolNSU>G!hyE}>@;YwfnkNs^DPG339{Ptarj!? zSQ%WVr`>!!4sghpJ^5)h+1R5=Wqeh;<-_jm>_^?RDZiV54BjbK{Jag5$x`m{J$kK} zJu0(AMFyaJmqPctMsMLW`tvr||3l)37}j<=$rvNW162UK5Ue=f#89Q}dKbSt($^-s zjwY(tEeP0bf|;N!M-oV1K_38iA!A!jB;cHVe%Sr4ErjK?S&@{Hp?$&*76KyS358L> z^+X4h{+QVTOzr;;LonQQZUHps5`M?VkSnu#+WX4zZ?^{pxHFm3_APe;v-{?4Ycuyn z1%O_q&Y%Yb$`P+%9Zy9q6PW5bxdbFW?SN*Ig}%AL-6ge4|2I1;G!|R21;z|gt@-L? zCi2|u$2pilJV%4fMTKRn(xQ1yAe99q@E|wu*C+EIz+7%$N!h@@9ksu`TN^%yt@mpm z7IgT@!)}G+!R;D;nj4$PC3jp?LKhCt=6J^@q`cigC8}EvH|YTe;x9=BTX~B!<>F`u z^51sufP;5?kg^X1q`_+sVN&P%yhE@#V;d;)_+INTH$3?=#2g*|gn=GKPGEc-ck6qMt+d(GX> zPyI)n%WErlR9Cs6f&6o5fdImu`U#lL4oQ5Gz zgagS#l1cJZ3vcDpc)zV7Kt~L0eVW<@Zq?l>R3|p2gBu>7a z9o_rQs(x4AE{UXj)h}k{P^RL*lSww5p0(a>_Gefvv|bhEGw#!Ofh^De?yzAv9X)uh zy2%gTwgGOMs2ep?lwMVkEsI`rYy^@Iw6a}6gZuT{PEEg`qlTB|{>V6o`wxi~FEOlZ z*KgZMvrG%0<gITI*a!3xS(e$yERwRM$pYWk0KiF&#ctL zC})cdwXewzbhZ>4swRWrBA|O75mPv=7v<8;c=qJHMp8dWIZ92b*fqBT8v?+!bi3|0 zufd|zZ8rdopydLwr!jk%44O^$pb^7C@tR$_<^(O0VB>gr2D+3@%I`nO`M8Y(rbz#^ zffe|>u?XN9Aa0-@LDSwIjn1lU;yoo|nS zTsrXpggz&Wg>&-*vPuAhmov#>eP~6&C@k0u@7iju%Ddi1vJVbOHdSx@jvKawx$S5V&4n#;xKgO7CEZZ5P|G%0>AEI|Gqg+Ng_g0Z58~ z=Pg9F95pg7%du%&7l4OI&ex&XNRUU$ObIMT&13_JVOg@vKkJSJe97DxJWp3W+9uf? z7eZP+)=w1l2*6U}3dR9QPDO)-1R+TNlF%j|pcPW(OtxCgYJI_r=--M?pTHd z4w5&(}iWrI8K*@Tv`Fk(<=!@7eIQ?NZOYfco9~CUnpEP21<8ENg%_+CanAtg6i7_o1c9s!peC>HL*v#@m%eppcvt9j z;GzPyJ*h~NksxPGBw?bL=1 zM%&-gaIv2!3RHixU|k!~dcH-=nzLuK&`R&H(z{W~(`DckC#Tn098B`SKw1i0ra6xH z^{K?x8;8|-OHbJ}lZ?#q^wDPZ5m3?XSLLq1;gn1-O9ab@ta|DL&Vs+p`V6*+Y3!1= zCo6eR0Q!~FYK6lHz_)xiYokobCiC;LcaJ*wV&H_&M)-QPFFrh9s!`LVJnurx3N`Ps zRRk~!pTB+CX^zx35gT{E?NcXaU3g7qAv7?LK~03cpsoi9ABMYQEnZhxI$R%JzF$QV zaDUbrT>n0)i55HOV%z7 zmFRb6KF&lPBar;#j_Np3)AyViNsy#g)2DxxQ05kAytP9u`K^w6H0`}9i2dBok_!yD z{*ky)=Yw$(AXybL_#6WLCv$UiPTR1z7!kosFs%$FaMORCc465x@G>)B0KqB(j2=V+ zXcepr*?V+KXPf4>yOVFBF2j4HB&2m1-6H0y&O(0x=sJGnT*vF9#ECc{@?|$$P~*fVu450QP-mPX zH>zC=BIVv~;iHTl!;v+}@VwB&F&7|I67@eX776sSldyS5factY#iGplw9i2eK*%4? z?{vH|Cyf-0)3~792k6V#0O;M)^-9#K2f4{%8THsvwWkn0(2&C$ml13fP6g+}AK9cY z;tT1#-h+m9E@!VuP7y0W=Y?EM3!2-FPRh3Ol~3uTr5UHeXLFXAKKt<8p1&`f1qP9L zf}GELiah==fK|iJvDscF9B#o}S_t4dnB$FmzdecOfMowfrX;1Ow;616_)oSQEz(?! zKpq4}dHi4_fyn_9R2FEavwRnf_nVIK>jLSSxhcd=*^mhM#OhG=Jll*58k$M6c4PwI z2W+NXYe^)juvj5C6VVOzI0X8Idwf*Jn=#aZ7tssC(7Kypdl^pNPX zuPA6gB4L+a7k(-Q@XN;N;DaBq?lEMsIjo4GjYcQ!<_JJ`Tky*XY{qQU*H6f5J1cy# z1B^nWbJ08T_?2K7SQF3%Y+=og4Ma%g11Fik;oBv}DdoSnXFj*k>8DiZ$Xm?RL@Yw=?re9_91e-^?FBo-Q~s z4WMv1?TT2Sj(q>I+_w0_EXu?nUpvy7l$@?}6dJ_XdJor)MaRgd5yeS*VB|RRRgwHe z=&@|%!xeVf*QUqLSJCDAlaQb3EncgiOUoIWI)SO2(W{^M)h^>oJwJ!dIC$xDP4=FS z9M%@jmk*x}Zc`sD=WKcG?iV({QEo&bl`c0L17oT~*Siy5CU@r%fM^VeJ{!y?W0R7a zfCD`DXI}o-4DN3njpow{KK ziDfDhwFW)A^x7^Y1rB@VZM5oTqA|B9Ex*!PY27xDllsEyL3Wc7Nqq<0W2#3Dp^n#6 z2Q@(Y<-u=ecy#$R+QJc6eZI>?A@lbhM+3YB)i#mObeGGRs*-{1Z-uW$)rna7w(DM4 z?&oC@bh$ED?_Jy>_!}wK-@kt+GU!OtK~u`50@55wAWG8d5W|{LuifKnSGHqsdLtzy zmIiWy>c8|V@8(7L#Nl5_NlCG>ezpBDG&Hd76APJrq7w4^5x4tI;l{rqGQv4OvG#A@ z>Ndr;em6btgWr-%aT|}wEY|gzE*LxTi`b@ornW&DdMsONovobw?%08{P{%uF2KSqX z9uMn>sKQDTMwCX@`uk8C83RjJp=ATuoD~tRvvZAG8gyMX1#VUgQVw3cI-(~Yxf}Xy zCCREQLrtPT?ra!z0OtJ*se+iGj*2LV0UFdD*)1Uh#KkTSYhD4}3h?5IQT6-%$o%sG zDqPUDbaEgiIOO=KQ^!K9@oIlY^Di$L=lG7NSBcvREo=rIOr%&tv1(W!o}jR#LQ#pz zno_`{t$Hun2QRsW=~Msz@%5Hbc`e(vHo@K9-QC@t;7;%m+=9Ei1PGSk@Zu8O-2w!6 zcXxODX4c;O+;;Cd=li`{T3ggxRdduBy+8d^!zufZpvLnR5&NDb()QP#!)R+lvdT-Z z>(#UAeHKD~FF`6rL9{=Nz4|rpB~o8^esE~*l=<8J43a= zBhjG6Lvv@6K{7v#$}%;R-_uQbC6FOiT~#u)ba>W=jvw?F>-@#;!&86d*X=^UzJNnl zp93kIt;?~G8#@Q^(bTyGj(@Eg6Y;z3*xPJ~h}(w}1|E2htO% zsQJ&Cg(775S`LhIaAIoT! zU%aT^zNNO=0;CE_CuTaQ1Ku}YM)Xg8rUyw3Z-6b%jD6Ws<*WA{UhH0RF`Q}14U>T5 z)6I3|upKP#!cN<`Q{){JWHv0_#L>xy#E0c+(ey38GiyFp zxs8QdXgu#~^F&DKQk6I!X{iUG9V_J>afe$43>@bDC#&wTuH6(e$|FWqyc85L2@~%= z;qHf5TnN}q+Lh`Esf_FXvclQFDI#dg<|=^Zl}*+(lK+b?77+&zm1dhuKuR}Y>KsXL zCB0W7W~7^+G9QiU@VZU2)g|TTw%;4E{H_hoi83>Oz0We1h2?x*=wXOl<@frV=~L*O z{OM2!gpBDPV~!fu0V|x1>?aP47+p^9v#A5m;X)afq_{HOk3IO9qfxq!yLx(E8Ej`5 zhegT{a-WF#rtciI`3GnT9QkQ2Kst`}sa1tODq+|Iu_PoI90O#x>rx_U;eTrowz_r9 znf+0)8!B>C`L8A$-r+{%A|ly<=)LE^55O6V33~{&ERr*w+CY92^75&6)oWB2!dk^<9CPWBk$VQT3nC)UsR0}@`#fV z4>?TxDz75B258eWGs}1u!Vn1}SE_PF0C?(hcN2C3?g}{lA0BQH z$dnHk4o?AAklXPi^FqP10F$8|@B+Ih<^>NIEZT2Jc@CQ?XR5gWy+3 zYocB>Uc_h}l=zlr#Ts_9<{eOji>WuD7UTNhmesTwh;3ZNgxbnre^`T+1YJ|(FrIv;R;9)a ztsLhLcwm86VW>c%srShl*D-evc6|h1hbsdIzxmptGfsk%k`mzfn;T6h#~g)3PC7Vf zZggOXrok%#r06@NX+)q73a8a4#dHJ&o9{}Q651t6qOr_+HEAJSQ4Q4QlX+i`YtEY7 zPX!9m<`}csyt`u-uN`AlnSMj`oH`Mc%=IeIUk!Rb98-@8G$u2%{{hQD=52uVVJKs2ZFLP~mA_TcLWJJ}bF9`iBkInXrlfjMx$0&!J5m@Uv(TdiWl>FWWGONhXuG2PG>8Z&u}>_ zC2QF2C?-g+Uf<*6<5Q^D9voRvt1nST`P$bY29#!47cE9VfkzL!kE2K)R*aljWI5P# ze)1=NJPuPN*dIw3upF#{LP+IRE$lvBX>D~Ic)i#b1ub&BG_~E+ojQ6~xE6US3rBOV zs;=TS?pKozi%jpS1)O(~6!L_Q{os<}9b6AtsyowbRGMD>3IpWtEO+>>pRIKC2qySado0t=MpBU!|$7;1Sg^;)Z!prWwvs35=ozu$Bz|CC9^gbQ(3ow~jsIhwn zKue6e)z*(`u7EKV4gJm|oM%m%ZnanvHErCLpz-h{S#)Ye0$(5yb0D;~F|?893YhNg zmhoFnUQ>X)CN2VrlLkHVy1s&FZG3K9{nk4Sz!A<gnF~!)a+3WVG zl*{Ip`Z?TJWEsny)qXsefT#A*y>nwjFE-m6A6swOvQGHkw)SjweX&liExbUMRPW4S zzjhoz;!c%WAL}kQ^9TC^C|wgr-W8U%i$Bwf>H90#{P?MWVVx1V9&Z{)XSCj8G=stV z4=i!xee`%|g+W=C#928|wXvqSd$)H2Ba@YtRspv@pu_)5w-)DoFN$E3k}~gfTqKSY z_v4K$LF#&QcX3TlcE09+^ag*T$Y%Y(8hWJxw3;rU7m&CECPV;cI;}qYZ^s-T_07ot zTIAt{(?h3k0Sp41*uUCwxgcbaUDkar1DyJA!z>^ zi~8xz!J*JJq#6JdN0=?l0KM9k0o2{5V=q*!;1>f^#=E^;BnDrAtmt&u*%+>=b z@>(+dZP_?S+8lq+*e%rA?c3{1#zRd&`k3x93F2o*ob2w*=(1hg=Uc#8=(_Bk^e;|c zJK0C?FMYSz-apO9^(%#@3H3VR62mMkPh_qBlR@U1cQEIQvJ8wFKfjCT4Mk26F(|%5h>(n~W3lp|$L|+CpC42NK}$KyQ>gBnKgO9R?&u zUjYB`ugEqz>_uH&*N`sPd>D#K5(DX3o`ap;DKMP8yt@D%DUwHbc+cvSn5?3rVrOzz za&o3K&HTBAGJ{$K z9Nf-_nU+75PVd6VkO zhq2P2MKuc9_fvO~2$(wA)@iD(B?-$eKVq3|0 z;%1<`R?Xo?S1~SEujn=7$>U(L;7M!FPXg_;n$Jcvs-YoVuA)kpW{(_D0+mE#xI}5@VNh#P+)t}s({19<9T8h;R3Xa|s0RfkouiLne zgfC5YvMSN(I+WI8^|u}MCxDhYFIVef-s|7-2;}eq9P|jrye0!fnT|%qV;;LXaFbD< z_s7abGXa;2A6FZYaX8O;uFFc&KpV2jhf3E0{>@}!JWtyR8DN?(yJu7aze1{!UtA18 z7wM~9ZM|j3XW}iDj(LzO(ZY@3_UWsnPV}9nF9;9N(g|iG6mnB@sPccD^;f0TyZ881 zZ@u2)3PU;B4ggX{tDcAi+*IEM)-wf^S}W%6*HOY~V%A^w{auf_yYO=`0W#Zo77y;n zMC#XFCoj?ds4T?yMbm}?eFb%+nVw?ke|by+2^Ccc7ro^WIULzOYC%^g3{I72Pj*8Y7HKT^7$pqCo|Zhr#)9E*Q4HT(*i8(Sm;^`z7)g(LXmJ$PnlKs(@?4=`xG(o*6jhdB~gbJ3NeC- z*869zPq1^M3yDfuGsj3qzPCusf;z8N#64JNMz8ywUWrV*()=~W^93^FH28v2=PlxM zhqpVe{Z6y>1FdE>6Bsrrm3rYSM+Gq2c%a3##`U5t{7sI+wLu`c!o(5{vj;zsygU#A zAoT^t^=^+kdy70jrN0-=uaDuBD&S5!2_xgE9`QLo9Q05PSL^q}8g?cNQ}FLuTjR^q zfyd}X?X&1bZB(5IxNw@knNDghQsJtrPXlgV?`w1Dsjin$g?kb~`PmW$hIw0^POGwr zy-WMmY8xP2Ee}Em_mT{wc7LSPV;A4aiiaa!NvR!9+4}6HSpjHe?GDzn-FiK>K`FTP zpLV8rVd%bmV0FG*0oXw5%5y-zh$2qCx1jLQxu%NQfZ?Ym57(Ovs{GOqMWY!cLJrL; zv#`w2MKUZI9R5~Hzj)zQLN7OX8!uQyq!g%3rb0;mU9!3S{_u}CE`}aH_2rH69hVXR z4^Pz9T(;$BVKWn?Ut&s)1lr6oc*{|(ZLlVa{6J6X9sBP~@jvO}@HJJ1vQ4Y@nmV9Y z#eB)G0isrCnMQkqR_hS1Q6sC>f=}naR@YCLwlfc!w+eF~CUc$4{VWIKY*J!ZFjDd3I|E{ehnVTpuPuE-GYf#N=l90X zT5Nz5azWY-%t0tm;}fiBuTER)(|@0?b=tVEjAa7N1;T}T8)f~KHH^zGWQL8a*M*%c zFC&}lz39pYtb4jlaky%eZMV!dd@lQ%w)@f*^B=5MPN`=?5kMdE`=sqERwIs7v9QMv z4^u^-DXV;6_g6?(HQpDY+iZIwuZIw>id$**<-5~@s={zU?*_!(9D5$#VtO9LqFnI# z?07g@RsexkzYG(VITPHKuQTk!2LycY^nZO`0n0U7q@oQ<0SB&x{jbOs6Y5SO;Asg-1 zZ~f!&fCwa+1cdO8af{dAr(WuRsj>NDE2_V)J%k9E4)|*F(?6{F?tgBr;HHlNv@wp3 zqrVKidUU-*d@d%zKva?`2>R_Qg*;FwgydPalF~O!>$x|8$-HMoCR85w!R~Crb~=x zv`e}lgFa)ErvISKTHbW=?Cl|bKLC9=h;tfg6|_%nbUSSU!dr2wIdS>Tn!1g}!;=L; zdZH1god0+htbqsotUoY3|H@4it=!`&Itx6#5QYJoox*q<6N-OsLBQ_pyk25PP>iTB za|(MjQ|UV!KY-u_Yzk46w!QuM*imvtxB;BFgjXKRZkg5c8mbLaP5#O`kV)&xI%A-L?+TA2jKa>-Zo&{(DqAW07Hu^9f@y*ie2>L^ohXH zg9)DjT9+gb)9T&)?#GiklN{o+;mFSsRILj4?%9?TxK=%-v&V`l8&(|qq_BE0vRwB% z@g?U0<5s*?pdCFuX@E?&9iIyeezxLFI*7~uWl6sYl(hBE=Lz&LYHY?ou;<+hHhP$j ze)j4;6(lPs<0+UqZ3%DaV5N90*X>8u$JB_FYnIX?BCS z(Ze|M0WP0a?U#Z7-JlC1GP%n**;UUz;d$?;s;$ z@QZlTfFY(B8n4H~IgsLp0d%tOFy>UEKK@9I^jDJZuiYP4sC9H~TH(|NFr%vbmtIqh zV4%vBCExSn$prIgyV@w47&g{V#qUK9*%OmA1tcVA*zPs6M z<@^7Q`E?#OWXG+bPOOkdnjZPNWv9O-$AxZb3AjPTyq2fF*i6!-_IjVK?2@*7E{s!5 z68Go+@_Xo}(Na)E7swRyp0un(2E=e~k^uxG#%MkGAk?`D%E3}og|{A<_x$5u3%sDo zmucl-N$KE3nsH9snVp~eX+?(0GFV(S?t0R#4HQoZ@-m z>lPZ9&bl#WWAUXw@Sg##YNOTg-6;V2idt^Hky3CawEsR#E2Lc`d&PR)Tgr56&uGGOh0 za=d$iI{Gn5_;QHzF6K{*P`ENU1#e>-T1D;ghckCj^>Kd(k6+^AR}+LRL`0l4jL%y^ zw`qGOO%@tOrSTub-lb%>*Et}dLrtx6`W9i7h}Xlz?S>HXLQ5LE3BV?QOqi${j0pes zd;ABN#o^Vg`x*ZkzdiuOw;0QEzi8V&0o)&iK^p7Ua5_3l7wut|inL~-UAfcr*fyw#HdK{u%f9L5U^vy_C_1JXdq zhmv@){A2}*pfQhDu9Q!;<;(Fmtl@dHFKcM?Y&$}RX6`2oOk380y%J~9Cj!3;hUZ^7 z?8ZhG5iCXwc{$7hk#Xp>`S`Pi`Nx}=P@G?s6o@ORk(V2?BECJ!!)hfz8vI+QRHd!D z@Wl4HRK|MnMYEdU%>FXwB_Ms{XrCJ+MVmOg<}v!|$vO*Z6aG6d3v z_~&436e6Kqj-|YPW~UY`O_P7(=%f@@lpfKaFtZ*|bMbqDkr z)-m1-b~a-4*iL}UzkrK8XW#x&2nG zM&9iPsm$jt=aa3U?hOH&x6fH9&MoyZfrINIQ2mKXgmnv$UD^VJx;m)&w>y6kyOo;H z+AD$ng=6sW>@wq7G(jba8@Ipo>(`9yD)s9F&7Y_GZTQ=FuPfgq8f9h=z0TV|m^S;iovNf`DI*_^$Z<=W_NqHum-$M#3S-0D|EWh$+j>=yu)(C=VPr? z1Z4Wk`}%o-wg)u^+%bcud>$R3Z4iXEsGvOsBy2HMHbh2bpyKffvpeZaKIpKrvs>R< zlg0Pw=5#znhHwoH(M2#4<8>Efqvqiv{acNg7Bu_&nCR_Vwv37La>r^a3DuDlg-{Ul z?q2xeV9X#17BFMJzfKKTnufx}n%k_>9DP=$x`g36b@cMSf0Hai=$#5=%$(QI7UH<@ z1P&9AfGgKe8z9wa);DhxNJHYWTMPX{CcKH+ygKIEwpt%PWZD=$v*LdN8?<4&j79(h z5~3V2W(TxpH+>>B_eZY@i}>=ImZw5~g4Lhq-9J*NuNfmFSKN*^iU5)4dG+|a8_NbQ zvz6Uy>U#m07x z&0^?wwS!mCb=>a7^<{750La^oFI39ncje~yIs<~A6UN5ffk6jEy>T};v;BFVlma05 z9e)K^vFU#4ueBIel;;orwbqEyk zHT8b%NyFpV2Q;R0H;d+T8&$XI4Y0~V1J6%34&24}gh9`-y-Zw)mfCxLr$V@f4%3(Y z+IsvZ_w~fYeAQuNK=XLLq}>^ds$2}yte}dTQuq*2e6pQiq}ZLGM)7G`S%-p?qo&So z895eTh{+CIsYr%F3H<6R<8O)rJ`;!e2suJM@|ln$rK|(V{DL)~#tr#FkKuvA zy+Dg1la1g~hO{+F($MaOp_8KZuu-Pua)()kmIT@s|mcn5g#Gw2|7inOb#5Tanv}z@b>&gr0 ziw}h}9h%oI)VjZq8GKExqy&Mz)oC8Jw6}Zv>$SQ8Ff>%Wl)MsBip5{l>w-?4a8~3w z(h}(lS+e|@SwBJebb*~PKulg2W!L-ZFQIJvr=aqv`uSa_7Dr+5X7?*VjWWaBZ$=Zr zq0L>AH3qKZzY|n;)8}3h7`KiJrrQd3z*LN!Qe)O_F9R7a@sV2elPxPYr&4T}Is!V+ z>1wP0;uKbKncH`C0L`(dKvfnIKppSm9Y_4lsL7aaYj4$cwdtqWEWL{(x1pJEV%*iNHeG7IXaTGGZEjO~`{PB+0Pnr@<=-R6+tzF$7e2|1@*& zqJ!_sLa;UTm?xltuE_smAfOxUNhAOI4y34BBBe@n9BwXDd$bDK?v3Em&uneSJ>enl zg@jO2od*vvz0tHhWj|}~?0N&KbidqIX`Ie>)ZT%-wyB(Mgc-WV0bn-Rxn`U$O!52h zjxv)UOY8VDt^Sxuzz5iAQ^Pz<>hnd{EgLS5SD^ zz_xMYv3|DpdE)KwPu<&Masx)9ZyYy}c2(z{?A8Yw<@iY0|rB;pf%)hKp5|m4X zzmji7EvndWY_U45zg2`G0or`4Yd1Rqx%7bH-O*9kPqy`b_<~!Hdo1tw&)I#>e8v0B z=RhpMmzo6}7F{uVl0LQbOS-SVxZJiOla?J{w^P1bXdwKDJ_SHz)N`A>c3T!TYz8;h zNvdFqV*@t`??JdZEKX;uZ8S$*2h;9gh(8R{Of*F)l+;vJ92-oH22q;7Tc5~6oe*_0 z_DuOO;6(k{Jb(tN}A;H?7E^ z$X8&3@!zmEg`_}?Q{O9s4e+NSDEVM(oI;J^ zr`cdcT7A~TStmr%c!X}J$#Lmyy5B2Pjb=K}Nq0Rqi$S0d=BY0Pnq80zCQIDb#TlI&2#|E z>KQvl3g9dp3fAq{b8EXTeeashgToL%RXGk_VcB%NJS`7o7gtUb9P@Zwoirm{xbU_I zhrQvOArkZ2?i3GRg2)GAp(%dHMn>q>xj?ygFxpNxe13%%*9oqhJ_VH2-otaJzrPW5 zx;#c9rE|-~W(N@Cf84X;F#p~;&2)!~{>VI@^%{;y{Y(M^6%SGkY+QKg8#=@plFXJa ztGqe*uV3sSX`|1@#P{H{Lu_SLmMe{?bcxW%67qC}b$h&BVZm?Tc>u~k6V{M=>(@D8 z7G18}c-ttFR}NT8jyQ$VOjQjWM_Xd~gIyQlFPA8K4mm7Nb4|pcr~g)m_DkHC5+Rn+&5YFPK2+AWqQuA#C6 zewgZiqD2w5izh!5aN52cJAn2_4C+j_wFt>pz3~3zCtsU+=KlALG5)&-PbTY!zeE ztg0&16K{^&2a;Ckh~N25Vg=(~aM6UvOp%5BZt@3(!Bhw!y5$OY3(Ouf=#6$vdc%H> zq|_gCPXJU7Ip!Z$jRREuAjtLeJ5%+L1_FXuW!wt0qYBz&FJEKs2Qqe|F=JKP9r=qbG-uKO z#du4Qc*Vd62*3Z+7iZIv7aap*8UT0}u1msd=rIZ!#wl>_qP?pdt=wy#NCAusrr0c7 zTh<>pUK9&C-HCtQoif7J=DJib=@cSp&}l)ck@EORpnn-Rk&9Qfk^?jn^aN#O$d|_&O?GLq zi@)|Pk6i$dmv>%(l?5pFZq8miMzPDM@l<#?>)gVT9h83X(lIc|5S?x0Qn*UDj#(zx z$)bT5HREY$d(tQ~yVZ?q%Gdq3D0z@$P(h@#nHO4y(ZaG>Rhfb~9M54(L>W3Nz`!Q3*f;pCd9^ z3%zzPAy?70$UED`j`mOY?o~E1(#IU*oas0FGlu6k)w(vH9q21x96f=C#A?N{fR;kU znz3)`5W+Ui$J1MTqiCv_JXnvmp&`6in3tk645VA=>-V>NjNk26(+!60!mK|}%$=+9 z+r8rq{ogr8H_1$h4l$=Zh6>?mM2MnvEK6lK{zy&#OX0^?=S zfB^6e;z%DAc^5<%h^}zh+2WLuF8AKbC{#0B;mlHcw@a{ZFa zim7qqn*v>Wh;rG7kEVF@?Z$Ho;$MkS;4~#MJT?~*wUH1K-F0?Nw$Bm8r?l&1OH;MH-KO)dB(pTPU$Z)US3Z`q&)NI-&N20xFY_R zZBYN0=p;Ur%P&Wu{+_PLWbQYqM@%~erYHr$UMaR9 z&JR)TI&x9t0`Z~F@|*>bt(p|+6R^~S7*aWUp~X*0SWfy-_4@cFXd|H-`0R)2b>c{5 zwQjHG>Fr}tSOhy5YR0smEe0_-Xi8TFl8&J4W~(ZU z8WmfN!=wNf@Gli?QNO|XY(OC2P$58f{`C(wd~hBaV+1K?5o3T+!Y`>Mu4~3`Y?qt2 z=IcX^;d8$G?ZO{2=^2OrF?n31?386dhrgVX@5@ketmptSujp(@EJNS2F8ND(T<%MvC24cU;P88w=s=VR<9pa(>vC>}!sHXo9 z;7a|UeU3VDoAh>gSNc+d=6p5MoMhMI}{uYX8a8T=JVdj{KM0&%!6f(UYCy3zLeC` zIpk@^Ln+QL25ZcP@86XavtI5kvVA9k_OI_V@_6A; zU8yYcXgcuCz_R}^KDI}pAwoGdgYbz=ahigPz%rr4R0kja+};*#Ov*YlG&)5(Cex9} zNRm#1^48Kq!~g#RMQdR3)^Gr)@Lm!Az=9EHkJ2cA<3Fb`_ivIPa^F2X568-9fnk0lwIANDtcX8Xv2oR6~4zttE zX06S4c=%Ktu#}p!(7YoY4HjCa6K&r8VI1~kb3{fj)Rj-1O;cdWCg0_#f^$RjqA$h% z&uuA#I_SHv3g2l8JLiT?&QYr+D&wrv`-W)%8r@Qr;pf0x~Tx=mav@c#gh zQ735AKrD*Pa{3n$dR^*rPyv6@me8Q@0sqVK6p>49tSa2$)=Z-END%%K^M0W!KJaI1 zf6K=hF=I!ZHrG6$o!5wILq*M*9^Mq|A&LDfBvt%_N>uQU9zjAABwtl=37+ZcX?uNT zIYlV-=_%lUSf5fYO2&yzC8~@u>7TWQ-R1nnsiHNN=eYelc4TB^Wko-{SM`pC6!L#v zbf$T2F*1V`IjTlAUvQ#g(-Kz_Tq$n9cUmq&`Dg-dI4O7)6*FDcyDgvk0EwUGO{7|Z zEc9AHHl&L6bs(}|3OUhC`-yg6anHZ9U;hmvRtZ%SgA(D}NZmsfKSo%O{X8vHeZX`2#;ze~I_h(4G9q(GV(UPJi{ z6_nQ=k9S}Sd7v5--t32e#XYDC{-YWwMFn`#&sMpSfxMP-cVz-yTST-4ZLIAECc=j6db4madj_ zE7cP7&qrJ8e_!5|)+%V)=0$dJH1K=nk^}`;us<8>DXhtu2lqlmGdup3*N7_pqC7P? z%;IW0#Sz3-AUY<<{(9>mXdS{~c4jW|*-S|35C3Tx|HHc1V9GyTKP$2}_xKD}dKDT4Sc!S{OikW zjZ`io^Sl4uST9@D*6X`}&-ru0%IU4bfhJ~oPK5k<`zMvCfGDDTo`mlq$Wy276W-?$ zFurhvf_$9hHbS!J@MX7Y zdqG&>?{=FFAkm=PkW$@=cbJp_f6{WiAN|+&grB zd)DSEf2fqaE07DZH;HlOXX718ITrfN6)Wv=>4V-dCOYB8;ULPHvT>|*!kGPL@vOw! zJtP}qFDnW-a=A&hd?0UCSifnt4kLDSzbV{TV?|gOwx>4a&+<)m0M?6AC+!uV#4IkL(f_65PR5)|HS^3|tx znUD&9j$+ARNtPT9E0=f2s2IBTT$=TDz-=unWi*PuT#DIc`VdzdRwq(RK=sWz8YA_x zQhl4TE0YM)BW`+o{an4oSLnDApe*C(mGQGM&eYb9LT4H?eP zGhj)iDn;NrVZdsGZ#fstPw;vC->LJHB#)3S|q@3^=^<2fq~@kq*cTLxG+kF7>0k+V8t6yeej7 zKJbVB;Ma4YyeW{KK)u0cVuBsT30cF5j875k`0X?4ZEZEGCfmbsbiDUPqELh6Aumls z8TXo7h1J?7a4H9y%1kUV5A7%p)_Tx81g;)c4Ndo`?Lyn`u?Z_?PBy_>=tUAg)tu#{ zRfL3x)rTOCNK}HE-8?WltfkPKXKlwM1J#K+Y}CJNaBZ}4^_EFC$%LX(lAcn!Y6_2p z{NS#(*6V+l z`1+P~M96a$%OaFd3f6~@8s}(Wy3|K(anHm!x*huzN2P+>=rcDCRB%&82hmG|As3?$ zDb|6gXI&_jyX~S7$k%@(tY@tyPI)Pq1aR0PFNu;l=W!L|(b-E2n$R+ON!wz6w}vGZ z>UW#0Pn18NDMjIRIwpDJ+2K6#8)kwh_X6es?`*iA&e0w+_@9j@CAPr zEs`h%w;Cljgcp~W6Jvtpjz_h-sZ!j&g{L6259Xg;6Z~q7G^%H!tu+N}OE?#dss88h zZW-vrL*KX(y&2E>{nC_Xn)7aqO{kLyQkOLzHFyrdsljR|C_tbHGr`?6>;ZO(79Ft4 zRsXsnfZaj{Tn>R}GuT2^g*nvci}^v|`14VMYGlHCR#}3?wj`7q2heTYTQ9$rkbBOY z_T{6GFoZQ9HBmkwTdM4b?btCSE3w+zvNvjUEF+_LW7G_8UzeaM<$V-xls+e^Djtl0 zOekogT{>9cH>?ad1WR&&g<7e~k77IMnpvP` zcjMI9HjTW3Gy(IfL5lXv(O8nHRQ8aRhmUuZcFNH9DIjkC+||3fTBxTuSpK$4cHo2E zT7a+tXH}SS@?2M1*Mr6f7gYzE=mQ?%g@=bBHbKgsMcs@XT@+c)cQS$kGr6;kkF-TUjt(x~velmb2EZ?QB{*YlVWoanuB|^y8IcAkVZeFBzyeBB+}@vth5%B-z_IvMyqv7EdkbR@od5K)N#ed}P$ir0Z7(;n zG!o29TLngyy0JKlnE{8ma-E4phJt;nP-@CJGFLq>M?vWGOkcT--&7>dJSX6i?SRQ zs9A*iwAN5RUtpjA|9*HqK@A?2LGYNWYU*zh?Cm&om1SEr0a}bWJD}7x9^8sTYNULJ z^{|*J)QN@NQCqI)(1ApTWB9_4KO0;QohUaXus5(&dGmrUs1rkKmRh(%o1kEMWE^8; zRX-yT~Q zrM+r`K!z$8y|JTvnmey(?0mXfJ}KAd8kEj6jGsOV;}S0$hS392lT(%@RHE(d`)~Gy z4kgl@uQW5DGDz(CZpf*Np<}Ods@PEf(et7(s2SpJKZ31D^yD zJ>y=M9sHhlwsVDy&R2_+-^YI|>NMEy&XyfcF`(R7ul^proHoDnvjGd~TS7{A7V=}_ zlN?DlqyIYkB1)}6$D+;gxcF0>_Utd}p z`b)h`kMYNFj5y}Ez2!~NZx{dD*t^UY6aqf`(Wg;+hn#4?_d&F6Oi;xhsGh&>{N_e| zT&*p74yO)vh6xVfExZp8kf3;;)&mXhS@)j4rZ2-4ELXVd4e8zLTAD?6pNo?2`OSS#W)d%dA1us9^ z|DrLwSxD8Y(8s|MU^>-<_F`sSLM}ay87>fhk(T;c_&(gfu9(Tr;C40Bv`_*hXFptq z8@Zo7B+5quIbFFosoALq>EHWJIS+<r0;b^o4fO&FqLsg*b%dgXu{)|P+ z=~yHpzE?YRz-+4Q#N5Pn^Q9mX<8$@e%nX9*F-)P#Z}DBbmI4JW|J&XBiy|Tcvrk|q zsYp@M;PoB)FQXZJ*9ifwTESCvG)ljJE3aPf3qR#Bz8$5POj~5}URHXQXbv>4zXc>1 zwz=FE8NGK^)AH>$>5*#Dr|`ZRS7vdzzu{c(4KrgRJI$70!pwoWDEQQwRmMNu&(Ixc znNuhCh{J`^eJReCre;rlTf;+ta8gcgu_|e?!|fDdU;vU^Fb3jC1~z{(>TNY_SSl3- z$Odw4C6N^rl6V-$>K7ju%-Hp_BKEE*{BNJ_*SIaHxrer`wd?BbB15l|>TXLWqg?Cj zJv+nV^)72?0Pqe33Ls>6EhWYgIV{xuG_4o9{Fpg+Dj>c~uf?{QQL*gG?@F)P0;?R= za`6yiKAuHDWUyx0z+*X+r_eZmJm6Y$p=?>`*flYTvN=t)ugCMa{YSZ1_u<7n@q(Qpj z{CvOhjd3pC|2bFQ;2z>$Yt8x0`9w}{JxNPUq!Py>Zq2OqN3)Yi(~n@qpfDdsJuEmd zl#Qd+rzP8gx|F6=_2?(UeQw@rZ|-907%U>1H!NH8l*4jV^t%7Uj7|wO_6xuN=68DB z+c9W(xuFu--C7uJI*H9Cf9NrulK&l;9K)3^))GdxWZKzp%x{N(!gU0ULRECcv` zI985#(%;9#A91t3FH%u7%|7=-qu@HP_B92|l4(2ls}m-kU;8*hP~vyo--^D}6>}Gv z!~l0l_*LIms>*b+NMjyvR8O-=UrCKw8sa%u%3qxLLA%(r7M+ZTuqWuAyf!9Wpcv^=Uh<$a!#0G+8xmFDr4I@0)SH**HArda9+{AJqiL;yN{8H${Yqoeir&R!wFQ$oiGP8z!BrqP zneUZcctH~Uv=ms>k;BbovHGW%;2`~Mk&DL?M##+FIPE3`aTI(VVhuiaZZVVj?)Q8h z2XLL!arTDUcrS+nSgI8E1LDB%XJ)M@vgCG$xQ!v`I1y98W|=2-gwt|7TOKftx-%m9 zH18l>m{Whk=+-1ziYq_`vB8sM_`~*Rv_KQ?mJ+7c z^mlDMp*jO{skr|Hue?!*-}6G18DQ&Cr&x#i2{92HW;3@ZJmb+s@pZN5a_y^-JVlk?^$zlL>x zhLeY|pwJ`^@UV8F^HcAa#%$J|nacvYf=xCW$P;&2e0{M!Wl z4p@Z;+&BD6UWIeBw!9p4?s|&pJR}l-Vx|n^UQZgYkpTe*QCCb822RD8eYuXINlfT8f{KHzAdLrE1QSW|&5cz`w zaQ=KhT;xAauB1`xHH!eXHi~N>WX_`SUfDw8lHL3BEz>tYV-`y(kUJ+V5J63T46NqP zsIu=4=^M2b(oL@h+zG`K~Xfs5*tvx~C24QF^ zNC=D*QVLI9^kR>@9%286Tc-tDPjE%PlcpGA>SKf^S80oXZ}}JIjMW&*ed)mqz!CLoO=;; z8D3iv1we>G1f%uliN|`+q~##l@IYAO4|j;ft_>TvO>_`0Pon^ALx@+A#uwC5qywaC zpx@Ol*PlGjsR%h`>0!^q((b#?B?!89V)xJn5OtcHCR_-o*VkjH4($4&6X@m}4983e zY`N?EM)W}LukD{OZFFnawEn*vuxp*GPOuoH2N_t&N!85XtEAUa1$KOMYro2>h<;u0BfMLZ0#OYzC zDRuw7Q`NK*t<0<683MnmuC$wvfa`);oo(C);XdnXYBIqh0oh7cm9OdMgKkj`(;sm4 zG8-gYW0#}Ke(lLL+#?;b_sMqgng=rZ_&u7X4Q{Q}S`;iJBRXA&5f(7M`GTW1ccM`O z%SaQSysc`6_HH(Zi6&T0nj+U=oGa}&x6Mp7=-1JleNLECmh3y*s|Rds4ZFGh2R0rq zontG&zplA(p~O)%YP9LL;&~sHJ2r35YLf~Z8P7i`+kUkwj9Au`&lx??x&^r{_8-H^Aw*#l=ybd$1y4>70y(j0y{6DN~_zxzj0*YZdc0p9hZ{rQw zUzs3X^%j?Cgxm?~Oq|tQl_n6|IUnbdR3zyjZvOk+IoLWKW>~xiy;U18Zo8En>Cq*M zK1@g-QS_YA?wf3qmKQF@n|bf{JpOq0ofJa{trB;Vp(!s1{qfJyV`@}%I1H8fE_>w- zsHKBrLuEjieOZ5|yh=+^EE5KZ)4wZaCJZBj6<+95UjJS{%68EGk>jukfzXJ#6S0ub zXO@e{@!uUA%tX(JM-?YaEQUX3v(zrVu8Gvu1`cIw>4E_>s;D7NQW?x#kI*x~{~pMm zi(b6o;NPm*9(VG#6+N$ACG|bu(p)+v^Sg@}{R0SyH}Bw&vX&p)^UeOD^S<^?>p zed5g@C}(OdS^f|BL--G*-TbU`+zB3Z(!h!Gy)Sl?)#wa%$0k&$wp*y4HLgM-<4hJn zXqqh{Ew+lA_ex`)Y`J++QsdTX$|&Y0bzIIyj;zEg&XE&M28s?Lx7|{fxJKqU8>}rt zG1}Ecl$h6ZXc+>;q9?x$P_=U~)(7{ReNH)@)6hqjl~r79cRBlKHI%pfME{ZT#;^^M z+?$EXdwu;im-uyl8+Y8|?b4_pCfD|5fnoF2-pjLg#rnW?_@tW8V9L4=ejdoEG3m7d24ytZpc@~E$}>JuECH{072jBHWG7*5jn%qe;w(RhdvX12 zukM6P6E!jmfb6Q{>CNSp5N(hUGyP5VTPIBo+HF{_e`yu4n9L-=+52oB_G&)OSjo88YZ>M2iCUIEZ55X_;oM-hL}nim9V~4KQH+!G9EL~B5>2! z6V&`sGy01(f48(oI@m2XPZxruqluM-ottLIp&kHlI+bNx^-+g?Sv1HV?4V zkhq0ezK;>4dwd#m^Vl6#eO&hya+_B7_`~96#-7lXaKF;zVgqa$*p&(bw&3RUJId?T z`D)!LoII4#XD0rC&;jZ{bYNWN3T1?vo-LL*miMcmmt`+6gVg`RC6l2&%vjgaP#1Kf z6?#v}2t~l_*7%i75)1n|3x()28?}vDyZc<9!~xpWhpJ$NIk=%M(*jAE6j3)uTmGvwrPjb%QEh3do{X zo8?Kz3%@KRRoEl2%e;WjGai0aeYjBBkVw%ILQpN4Qg*jHFWSgHPUqvR>*Fo}O!BK8p!4r^ENfL;W^)swwBJ@3sf?qgs!TWT+A~2fQDFFK%1> zlmFcTFJM<*AF2BZGx_nAA7#6Gw?xV~X3+`U9r5%6i1X4)l@(>bg-0ic6wgZf|DuhW zHjS$nFdcF4?`G>DGhJnd&yu#Vq^9Dvai=Ml6jJZYA?=ffKf{8d6f{HF6akE}{ zX6FN|L{m#}n}OVsgB*@s+LepMYkF8}*(>#tlSF^KB?o9`m4%5w@4 z!D#)TvL&Fw`Y}R$PL5gn`_x5aMyf{Z#FX)KDEw+xyLiA#7Sopo9EFjiwzcmy!)HL( zWty~jGrkEos>AjSxah+OuA590 z^eFw=*R4C6NHh}?dEIIJqUAj@!hh-9)*d}_+;KyeCiu#vh`&0JNz6NI?JT0P2mOd( z>)JFl-Z5c3Q9xC0wPSr*Z!#TA4><{nLo8Tt{h4+ouPAb}8rMNXCb)Z1T(fjCJI~^7 zmFai(^mp1(A-Rl@(*b5Kyt)5X*sNN>yW^Tii4P9X|GI4PaG~y&t>GI$4XdB;4+=F+ zRS~|_Z+k#hRVe-JUg|QhJ@6et32zTDU4VXldP%ll>Pspq^g7Ii%BiN#)El%Qpc0gW zhyjQ4m3Ei$dJ@6$jE(?)@${c1qF%JuFg~g!w|ZwFJC4T}k?_MsR>wAcB6>Wlnq+%_ zqv~TVtynvy+K8?x^Wu{Dpf3}JoJ(fE5yCr)P zgT!p+=_;zrx=+TCB{ANmtNU*crZ|Vd|Gm(zC<<4RW8@U8Og@eTq4z2Y ziGC-*-jyMWE;M*-rvv~)Y|l+JM~5_ZA2qDY4cm(0=O!-dHwu9&>HPr|D`zn_~<1h_LE~Ul!gshb^v9o5;)neZSXBHlE@eYZlN(T&x<*(B=69u7WG%PuZaV z{(hCk$Xt(%27NQ758#IVZE?s zok>MC(UIFgBjemuLqUnarpqULv? zph2h23r#TPqOV(D<&)c>dg7>v*UH{kTFj)=g}j!*!&cmIw}3pQ7G*&5hJl_w2|t%L zF8X>Aws_c!B|^XSytjVUNNB#B=$JE}pp2gT?o*{q8vj5%b<*WVzAJw77 z9BVJ=Zu=bgBkq~VpxqQ=$)b9+Oy*a=V2a1`g63WudY#eXdh&DLd)Qzg2V_^#Ht8`~ zT~`@(K15I8imQ<0l&JNycqR+kN+G4}W7=<{5p47fiVc3-G5p^x?q@T3dg<;Y%O1yb zMJ{o3c72Yr}LH71U030$Hh4ZOKOlo8^#Tz`Xo z(XAZ~Ra!=oR(O4TMy>?3pSU+~zjZsPDk4C1^6d>;t`&td@hbwPmugQ?9zzu72dd3( z9Uy}j&{ioh`hz!c6{R?U!WqeGjTJ-08^WPqrq`e;{2rxLPNn6%7h6Rf$SbhcIFt(H zzCT=_E}|GqTXZCwan-!c<>hi5;`uKZw?O(tOs|U zX=rE++PpNm;j`9E56-{6Uv~k@r-r$qVq2OQBg^hUh`|xJfx;7_w5*$HBwB3q9-DsW zyf;e}%@}P`3>+{URlVy3AFuo>{dKIDmNt)!4GO~jpZn(>a8n8F{KgELob$e|cdDIF zOzBFHU>KD@@Ps z2?dJt+w}_PNn9&-Z)1}hvh_j4RA|+8{?MlLb<_}6RT9mb?qL556o=Dw;e+%3LQxAP zX?`_5r(R1$#TYI|!&5@CiaEuo-rwt2QjU(9%CuDMOi{n3U-S^)4Meg$!{*?hJ#Q7> z<$>BC`qI@R@8y?JYZWQ!pA%71?hn(+3U`4zplde?lox5txeWJbytem|UN1A8s{t}box7f{@Xs12 zLw%URG^k$>xE)XyxmwEa-Pumu+J0<%R=$^?9r|Dg+;?RWcd!b5<782DCG_x$rlE$cg z5-Qblvb`^=tUP`K_nja49h$qWRb+)?|NPyggbW@ZukMj7nY_VM4U!&Z{9LT~r4R^7 z!)4S;iBn#z@!ezHPj~b`o;u+^MglBOCRVZ>+n)4mM3>uL z9K)@7X|u;SrYWc@)63QyHETY}4bn|?hpTOGh-Ike4RJGRdkQhpjmN-Upq3uY>h(@o z!vGjMmQ_!j7XGRiY|!$$R_!)lPvTv<(rnLL>p47jz}dn6p^VdVG$>t*M2}_LQn_qt zJgGtzS8%U%@v=7Noi#Rw4u84Tk%)F*7O}t&+1V&+eva($tPdnMcZ%lnw#KMB|H{^5 zA5^+rAGc4agO}Zwl#~9)KzkojW7OnK!_9r>nVFCUi$j5~ZG-3UrQhs&&=*6L)Te&t zsrMh(Z~{IF0Gk8wtBLu`d-2O>Ds8U!b-dn8T91k2b4@?Dzvp>$c;J+5FAPr0YUs;a z#F9H?B&ba=92kpQU)`kkFGe(tZ}au&tZ&O#U|{!N_aBc zv@H1k_h#h^jc;{rvdB_tnSnkH&!X0_-CcNoy94Zgl!q{iLR(^52bgkjn)StXxLyk| zHka=MI>R)>blKuuo#%BvF`7(~3Irvu1KvMqkYg&tfcFB@KULn4HO?Nt$a5aqde->dmK3o0w#}U z)qFj$wksm9Srk3Y?lNr;Y*v<0{kO)A((uj_HzUF;UX8r{%E%D@n``%nN_byhaDEpDrC-nra$L%;pd{gbl+O_cTA~#PSumv@-29- z>5+!;d6ty%j>a+b+dx=IeODGUs4|=xBo$6yX$efB6+T3mxVKaip_(7AX$GDAF3` zdbPSJAyg343)LPgN)2@wTZw;u*k5;taJd1hUXKvp-!f7KVhEdIlMf%qTN&>Zz1Bal z@vvEDe0~zKmjhD_S?>b5`GF+t#k3Ig(#f)r;8LGVE0GQTynM<}1ynxc*Scpu=@xfnDCNa&;0ccsUVf`uW_jG~EdaGw*H1thOZb3n&kmrwT zDdBK{LifMXB>_l@58BQyBupb$GlrXK@DqH zu3ncy#NCmcaeq)bX@N4A$21q7|MYUwa?5~cwQX6}%jmjHum8{q_E*U)`CMcZ^8Tlw z`{7)^0bO>zsugsn@cvFiw!wb+;H(2Jmh`$w&Z+%QJu&vTmn-nq`1Y3ro&XgZ4ee@9 zwf6IO!%-ULw@eCCRAD8FukV>+I|!KMo7WMQAEHUrv8RyBKE zrK5+Cg}bZp+Ya~@#OHR;S@o~VfIHYKB~%p(CgHGI0Sfir zVO#L(8*k;3xf5Wj@%IX_Cl9lme1CBBDHK)8Hhz$Jx@BC9`s&e~0@hZmRNs+ZmrgNq zmgo`v+qiMSflboGD^dq<#%V^aL*$uo{hmRX&$pSkISNNTiM{|MspuTWE7jA4>%^ zLu>d6OwAnMB@pI(o(8`rLNmO?TT@X~jZvY^lkUOkvffWbybhdcc7PcTzSi-t1znL> z;MI;pv*+nFBtAf>_a*p`I`vC{t;uOKvR_POJW(3OrS=)NR z#E!GxCjpDq3TjfNDYUtVZ60MN(AJ%b4(hiFhOEE9WdrV+_)#_Tk}jA1TC+uWu3X~w zmf3c`A{a-|Q~g)I+fi@B`d4eNt=91AwkPF?3dO53xwZ~48Cbz@6__zjOG^5DhiDN(oJAjH)^hVv{Dcj2Xbtbb_~{Y33xV9Mnd3CCM)Xq{@S{6k zZRgVkGHEOwEC#U|zdBrJP202$w+x-EAufBJm0{o%-x=T9)19pCV zQknMz#_jFTn^uGh)DfM8HH09S!>c9+jr@M7(!Edj4gmh;q2iH)YrxB8PNx_y?DTZy zvHn6##%tEy%YaSWr}B%-VrV8U(X0Ttd5h+;qylz!b}O}K{!j3q1YP+!hKvK_v_87OW6sQCLQlHCeOS*9Q+Pl2Q!bA3A!i3B9RzW`_w^CpUekT0Zh6-y{Y?C zKMp+)V+w;XOt^nHF7pBU`j~leOEbJ`n5nRqm?h_ZdY?kXWh0F~5cn_9$^zvNx(G3~ zyC^|JAPr3bN@;W6l8T-G0Z5I&wAPBUjToy|s4AYj1nfxs-^QRvk zD>2Pzp?$vhF$*o^L0kLJbKd(zZbaX!G>>k$ZHnW@11aI>>=tTQ|7Sa4Qt8C>fUvCx zX;zTj!pn7F?$51 zqzh?XMkwG{gy7gOw!+SCn--|yA=~qDlld`=JU&Jv)OJjx4HTR zFfg*2%@F%O7mc2z(5{Cn*gIDy$YS~U{ocrH#qZtDpKoOT#}Po#RrXBCr?_=8GTv45 zYCoP+7pEO8gtziicx2_I71BRB@cwiR;A1(m|LZz|2Jqj!6MO$II`cAxm6l92R8)FE z*$P_?hcCcZijY1_LkxI^{^CoTz}il5$)(J2na;>U2F+Ff;?9PK7zQEwGal{1_K8nr zY24dS%oW2L!Lqa9z`+XL#j;vOR|nTqJ`-N*CjK}nq#+Cu_22~9Ot^q0!`aTjCmB(n zw*IM*jx6fxT-Eo%5Oujbi%~6Mo*SL!^1E6c3?Hqy*pD zUB+5pf2sj+1Pq|0YZm;P?OPxUR8YQ(Q1P(FMA9xex@@u4K4sF*Be|>*h_@qDZr5$` zgW!Qay=B_6kvAULfu!0!BepV?vJZLhbt8^VC8mC~08d);CsVGWZ97LGLK^imWXQ^{ zfglb%JthFxIkfOB&Y7)!lWIAIrqcbsz2GZ>sphVM%cI-)QTLdAdCk0z=B*;$QG zmt^%a(kf=yRQ>dAR&MKwkSSuQ*0`mQvLLUtL?@)+-B&!^O?B23aPx&1$yEAfUM0n* z*N$-H?D?Eho^P>hDnAoX_)esu8i<2fpl-I?Vd`zt`(vAe0+aWab zyS7ucd5edsAMK^fTajUE-=za~jp@v>BrP}Uym-t{`HD#~TXy=SWNnj34q^{c%)n1J z51OjTi=ag<@3}qtE>w-qrS{v*^821rhJ*x)z6uz#gJq&gr6@#H+XK1hryT3;=b@+c zVF;fhZD##|Mx1To_axA8V5!%-%#%uSRDi1F%NgUk;pbe7429WH;Ak$Y- z^xC|>^?6p3s(PwBBlEd|KJy$`Iry(OUvIeI#XoegzZE)oZSgpm5-yHTi1vW@B;!Qq z_M!a-H(4L&~~0m zCXPWbyF0)Gu*&!ED&{`YDmN75U_Cvj%U}ny05KeMUf*|RGEpKvrrOSwa+}{38oh$* zeP){*i#UttzK#50*50n7vlUj``zj${uAq;a4T=dd@`I$>0|l?rTnuAp0>9-DU-nJ&I-@sPN;B+3`egBg2WH zM@+ha??L2G1?}>0k8QWnmU=0t6_dZeN0%NG#?4pr5BuF;-vX=nrB?gBW;Y_b{=Q)e zx0IL7g7wmR>vZmiC^o#Qr}*D6wjvMa>=qPd@AD4Ux>B7oO{g;3z6L&QUqqfvm7Fcp z0=z?)){6(CX{%A48oz0D(N__Zi=@6$T~>oCLI-OKp~^p6^(|`C$(q0ji-rYO#G#`@ zt_E*+NW0yYfAr+qU%*cCUS9K|gY)Yg{$-VRsbPat_s(5^<~Q9cNl1}?oG1ss#XzM= z$8(kIdCI!5UO~HB6`7o@d&#Y0?`leP`r@c=Z9V7&=+KV~K83OXjM!Z!?KaN8zNOu! zZgak;P++^XnHc`U47yYLoaA;?Z;<2YoJu&5(6xK6n8ri$I9s*-YRYKrI*gS_vt-Be z2s$Z{i6QB5@5v{q=>Ybdhd>LT?zJh@TIdDoV>ym>)+iXw5b*sob1*HE$+sE9>#bb~ z!tFEi*OTUrydvbcDOIZy6ZD7xIN^RnTv8nCjhGKMPe5j=R-q~btGj&R)>a%bW&@-% zjLgsaW18Q~{T|@RLJ>vDHJh&_*a+=cfv$|uCL^0lNXktvjh87*Fw~D&++$5xw!KI@K_y4ZW z-(hVpgvY293IL1cIobEPpdjf_IDG>NR7#dETa%ExZY^L8tC|~j7b@#_uSITFxi9!e zYTWp_TY>tLVt)m{F!ui8AWXD0IdykoO(YXxc#ztP=g)Qpi%Tr`dPNRLX$^Wd^>1Wo~3a-Oz_Ln5to zfGk1k*$c`$gpm0QQFC8kOhV{vXZ`BEVssm-^<6nusmSK4-5$prR*ksRh}GTI8yqUK zNo+8Y5(n$8C+8`VVGrfAG2g{Bw)sI!PnH`x=BZfUZ}uNuN;psW#SzJEl97qd+Bi{@ z36qA;VPsh!&ZN0}*XDpw)M%xu+Eve>F+@CS4AE_CK2cL|#sFUkUP+x$bRxM$bdkHe z^ZpD;mc&7ux&^Zwrf8x^e*OZ377?471-guHeWrNZK(2_};oRfjZE+cmUTh_OQsyUM zTyqa>Bx$2Y&8rAUEu&Unq|ZcBD)Kat|H_KE=cpy(Y3bEM4{JfhyF;4aO4i?$;WYpJ zsaFP|8ru;l^1N{`iixt=(ltuWta2bX*SJ_mQUmUjnJAHCHE1kDH11b;XhPgs6hKv`{3APu!$-*?x7SBWrx&&Vn6~QydW!^RD z-^(k3>m_Tnr_0SM9j{LH@*W_sQR>l_%db*WZ8L@EHwNCTQ~sB8_Q1W4?g}`SZ1}SJ zWqGd6kgad)dSdQJ8>qDd zQ{Ok}30cX~#K$L~iyWh;PUQmoy(~CiF;SqVqy08K0G3FTcHF5WlNQ4rk85E-F&`k& z0>-RPE_O{O#lh$APPOc3LU;m{0#*zuyw~} zefhxA=~HL7=zOp*>i2Yqts<07FMoYFn;`W_k0cz%D*ztG5BwR~`o_ z_~XLwOS7$JF+4~?pF$I;WEdh3{w7deP=ww?D!dNYIbWY#=$Sb2X}vBX!!!;h#dl9u zkHUVzNOYwMQ&6u@erxLofx4gkSA?U6!N zT@7}y=lrSYbzDxu{Gg^|^ZwT5!}u?e28-dFUv~F9?xi4!2te-?ZM&Z7Z=|A~Ns`mI zKcJqVN~FPdbad|Zq+Om%LzDMQ$Wym%iYi<0u2R4G+ev32RSKJt2HRo}J+>j)4Y3o+ zt8`!4PLdfS8cEJ;2eLlt1IwCu@C~be>%(5=EAY3aZHdVlg42Ra^2N4wVUVc@@{Mfb z4#jvYd(m?}VW?v>?>v@c4IW<}=(xEZGbs?`#?ShUEx=iaIGR+`HrZ>4J%OK0FRDlY z_e6Od4uMqalojkk(SCJh;Ip+#Age-MopM|~O--jgVOT%nNFhjF(t*NsGAnkN=}Hf_ z3aI9@bSVSFAq6kOHMVl9L0fkC?%6QeOB zj9`+OLR4jwnC_}hCE^eq%OrVS#5ffVSCs7jQtKza%KSHlNQx*}eDZMA)!?fM>Acb0 zY*B%?WyvyrzohVpaL5dh6uqnj957tXrJXX=&InN+!Y}i|05D{r-NMMD4GK4B`=6uR zg9U<}C^r-sU^m^dhM3C9D^n=&vG+k$yj$lq0JV?r)AAZ{Pnwy?Ad?8V`)9VQfp6N~tOc=9u}ghqr?lk5niaGx7 zwQk1vtAcLwDeClzxmQ|r>v<`f4rtbh5o}NgZ$bH$C`?SJ-Jwf*2!0t(z}q^TNBt=u z^bRF87oh@Xe7^he#@= z{Sn4TO6k$?elFAc`g}Y?AOQ+$7!vZX7%`Y-d1~XIg)y?|P4PMm8$X04373tQ5%4sjO`onTyD@DpU)1!L3mh27qwrm zvV9yA77TVztd&osQ{hOn0~88-mq>|ojw?^Vq^4E1Be2W*H-{N1_pZ|;n^BWm!Ks3~ z-eQ#*U8zyWJ&=`5%4xH5*1?ip2MjP*2{Z<+>pPxLAA!&M&1ogFL^9!@HEGQ6BB1I2 z-M945_G)umB-|J&5N1&$I5b=K*uBE`2T%@t+3c38%kppEzm*@XOQph-XQv7p!_zClG zivNFoF0i&b!5I5kgT82`llcbgDs|s+p69APe{3|g!>eai4ou|X>xQlbg>gJ33t<+9 zaGMeAKpfc{B|}cvqb#y!wsD=Cg#OOYeOO5hm^`{}oPB&{FPamQ5sw#U!%kbigBu!P z>E#^3I+cJs2Ep00=B^lGs((5-ULmGtcU26v9H(NFNf*Y!WES)2NAksT3HPtYNI-@TT1bL_h43=FEOs?shW@c0J5RaMxN z)UIIc>#_DMNL7j)X^Ql|lwv0|Q3IzoLMTH&$+L}bqB-H_zIKs^XQuO;o(RH0Tqxa@p@k$UM}7t`7`Szy9);yW+Jj0w(1rU1K-c=_2(_$`hJN2ZZb&$q2_v84vu-^v^GG&{l3Q|=vnFMa5QQtCF7c*4j zV+(L??oj|jjZokm&j9E6rh^`8T>U{&i-CGXIx+15wt+#ziV*iGn=0bYPqu1ahd%=# z$jgz>{-ANZOCOc{j?A9YNU?4KVV8H2V!)#g8M-Y9tX;jOtM z&`|-U{&^D();2shmzrBs^1n8`v&r6=AZ#Q)>*?~df`CK(tbmk%ClceGwlf|4#9pmL zX5%}^FamS2%Enq%(6+zk!J5Bh_Ey;%_`D-Y?pRLR8 zr3nv*hV`f4$v%OimU_wz+*ktlfp%G+cQ#AbVARS!W`mA}y|1OJhUvWCQn0jYrU*)0 zp+nrG1{edxi%7yT-ngc8GM>ucp3#1+lx}^`2nVK=;4b=IfRv*YC{bl$eQ+Ha_p5*V z2O11mk-3f};s!(hjeY&KiM>bof{a_?CTGHZ1^iqzF=sijNo$O;;Rf5sFaG&<)}zuJ zCbW_K_3G}Dt=*12&1^{1da_#cImNJ=pV$ILew^1ku?HU+ulF-Rg4K-y7>6A*g-C>I zr8j85Tbf|le)e?bX+Dm{(Yr$y9qI)XX-lAXoN3GxP~@$Zu=8+=`zK(1qK#8BO1PS@ z6b5JrQ<(I+j8#QmeJD?GYmsUf2!SO&Wgyi%Ia0?RHTZs9bJq>#&|3OmBDOH_FXj=e35yv}{%g^qv?GEz7fc@>|1o?bukHuN0rEMv5V}`T zaz1l%u=ZL6`gs>%PZOB+0n93|5L~b(Yr^qBL_OfO@)3{fZzyJS2wQx{&T)cv(7OwC zU6nVr%5jQW%PjXzlC}7VqvxF;`%EoUyO(dgCd z{-@o$z)2(+y>axv(-ii3d}iaZF{}{RNGYu#algX+C>uw_+hynOBjR@fDCtbP3a~Sl z8_op$o~Wz0G$MjRgx;CK#N*8ZweCGCiTBsarG{6ra-R*Y4Qokqy4Z61fNJMffK7{Y z{MCE^Z**puXl1BY*r(!mr5wvxKQz9EC$HB98yAeln-(bYrk2Y5_@So2L?~pQw5WS? zF`Ld8@aipa?JxbPcjluQlL%Xehs3pz?-CcuZKJkbS!faXZAjSrrT48UCuf1reIzgo z6-WAe_hi59R${n~l!o0IdkE~{vQtSqUfZ!ee+BzJoBf<5ZnL{5eE35Uns+D$-NT|{@;J1XMr;pLB z@xh0Ylcj}F;W(gIVR*VfLx-|n;3O)#Tb?s1d~V|N#+mcJFkpQY8v;LA?HlcAL}*j?bW`rq*wwgt3i;1Ah?kXn3q`dqH8{k=yb`UB z+sOh*pR!^{219h9_R{7raYQd-GY8A&zL+@g+qSs*vgNE~JS@+Ep7Bp4AgXC+x2<7b z_&MtQ0rKI1{lfAurpH`CgVKPOUQaMtxIMfl}O9Q^CgU+ItOrEr-|Qfx6b zmt0TPvZYV#D!%QYSb`plJz1}RKo6hHCopn5UeED^CVjTnr)67ODI04H!W?GFd?ox< z2$Y_y%|p6&?#vDdYhxWTMW3rz%vo;x$(ZW)G`4!n@+Sf}IBEa6UxbqK!0yMrlgGzB z@l}6-)iv1we0NH400*r9Ylgv`4EP-dle4ai+68iN+{ElH2MJN-!FV#W)41wn{GnB) z%nAk#E&t7VheWVPaXQhm(sZ?g{6UTU_pB$xwQEAyyLk#?c!q>9y5D0Vcc245GS zccjCLuim}y9<}^-QkY zz>SQi7wO=tgq`mHkltQw1Gyo6(HyCY5i)V6L1KKB5$V7E`~k_3Bms++I$NiGckh=- z221GB^^%gR#A~(~lB7z7(_wb)b=YJwA)WihdAqz6!3bP47NEzY}us zd6Zl_xiK0CAnV~J5H@x7JCN-8`c|~sCOe^D{s}llv1WliAdJH*HCFEU5R&GGK<>a= zeFO5!K6Am;_*~&Cggy*4Y1tNps-jTFr*^SY6_`atz7;HZPmcpjy|tyxK7nr z>Gu6a1o!7$r2hLCSOn>mved*Q+x05j7PQ|^;H;pIHsF=J;|z4qklO`MmjQFauUy_I`xTU90w4orn7f*kOB)c?>xdgkqJBA2Qm z8KLTA*7)VcQ~B`|2dCTn&p&{PM=!^Q;HvK0?c5G)Kb719_$$>~kSXobv? zTI1y0a)Xmm5ox$sYJ&^3+g_`#>!|UX>h=RwUi;P3aiU0 zp8o7WE>bV>?+tsJhq0B8BQol-Q|WIUy{ICR#cS)b_O!|D?gRRM+o>Vb=DtogGSh4iDPm2X(%C zhKY+!Und&?!RIZFXGN~0T8cvjpe6w_>!t}1*I_HxM@rSV&-V_w#ga1`8f`}Z&_kHg71(Mi4n`IXT$B;RwJ_^jjF-d@ORE#&_fjG*~}g$2ZV z)I%ktJ!P!l5+uPVT_GT<1h2)Rw_9WXpt<7Smu3#&pq7S^uv`;PMl*9~eorYSOLcABm;DAYk;j4G zfo=!?5bLE8GO$8^;DjtDe7*WmhJ(jEU%qb1#lPlxMrCeb=xj4RTqao-zT z<#Ak$pgb9bY@5a|>UMB=8T8|e_Fr9ry8yWw5z{XFA6ACBkq-eZr=bzj$7|CsYP$rk%M zY!Tt@T%~#_>+R1$O%nnIPelCwy;ysk_0OdA!zS*n`AfJcVy=hLbxx-rU^~-uq)g_^ zf7W~nXSdjb7uqO7dbKQ$gj6golbMjg1}oZKhR#=6E_%sa{*lx8OsmWI@hG7ki>6yX zIs-{QJVQjM)f4%;Q{js_r!E>b)efT{r)5enq3`l2*9*dnpwJiz`q~*q{wnM9hJC(E z+r@fdr1ZPmzg%1n^R%4$Zj(zGqueFT+G+dts`l#cl$Gx*4uj_RxLr&%hQz8Zch9?Y z-b;_1$mwmS#}Ub(WM2>zjPQYf_BHyHd|h& zzT(APY;Q*OshZjwTf&um+TBAa$q$#pzXj{zA@3Nz6m5m6S3;s|V8kBwYZ0%$mG0zX zJC+RO^l9J!SkspJ4)QBm`70SX9k;mqJ1;A2;mw3CJ-RH9XJOB?h|^5ZC4>2lnP9 zrMsY|avl5R$ZTL;s}N3OUfh&H_)gof?xw7jfy^pwL)FTRncju;|rcwj5r{ zD)2bB=B@eotxTutVI(z%K0HjVM5l&z<2UstKwPPnKF|$*oMq0?rLlM>y9GAn4B>WL z!^$(73P|5<7b|qn32TI|j#Rr$>t?d$alP|P=VPd-Rr#oL9%uZ2sOH-Pi9_Wq$)eva zb2|0524{Mwxb9QgkIy^vRnV80kuhTQ#*9iy#@`XD($v)SE1!Gml1|)T>aeAR#Mm}M zr6bFO;G?9&`G#;9{fTU3@fFg_CiSmVLUGC{Z!g%8Sel(FYRF8{ax9ey$+ZOnmv?85 zJh#n+r3&*J-v+b13&Z)&O3IL#AxGY}7bg-B5^XT^OwReI%0O#rVvcq=mG!A$mO(aZ zCh*{F2!S}8 zxbI6UDWn@=Z5rMhCO=j{$L?hlFVhv|Yg<39vmI+Uj^XjpYEplWdL~Rrn4Bap-+b4B z9Mvy24OFXw)8eNn#3G;ug2r;kn$ALASrt$07t_EPJX_S>|A})V@`fzJGZ@u z-JgmQpuNlgDH-$V(zz7~=4{C$cEM1ah?V-gh^Q>9_Nxq`$n*_xUeC}#pJS| zNVIts7BbpW8>1(W03Pn~W|x)8Od%w^+@=4M>~VT@($)U?P+DV;X(ctWbRLuEihCof zevx`v$a4iO&`PGH2dO4N;mYrLfx-D7xf^BxzjF3J^5Exo07-${@eg!rN6Vl1xsLMT z3&AomsIpKsYx#dKsfDLx!m+eeg&}AdA%~Vf@)s}-bbPjqeGyz>>DC%PC-v8H;$wf; zCH>CdnmOPrS$EMyl?#1=ZW)O!A)M6HMh*Uma<87nmhaF$rfg9(HK79nP*_ES&OKDS z5d~@q3kA7BR3_!I!-aF2rfPDe|1|P4Mo||Sx$AMA!Tp-zMktln42I=N^2*&&YJw35^1Np9vw@OJsiWw+?)#*I%$4PH=fFPrE~w>~%FM()C$#Lc#4NlC{7IuM72C1rEwb z_}9ElC~wpAkUx-ahX$w3b+B%>mwuKIu6~K5qX{1_b)8-Fe%398Pb_W6hnA-aJ4|Hf zErt8WzlQP2HbOe$VzZu}p=_p+P%PEh^QH2o%S+$Qdk);q(HbKC6;1|w9tcZP{Yj>< zd+K%#Njh(9saBueOapR_QLcRq{;L~*xK)tPWEsU0GrNjI&dcInI!j665HJf_U~B%o z&CU=Vo!%f*)e6dkzNE6GRa}Rdj)qRV=hH<=B{PDjw))nFtU9p&^t|jnQL8C(CSjs; z-&#?dK<5i1M0|G{NXe0?L~O*Ls%pBFFP-~7kV_1FU2jC|5Q`DP9;LFf%E8P$FFCl4 z@T+KbRWhL{WrhcUv?=^6ov4%(-b7@Yao>`iO9Yuo;u{--X<)6|@_zXPF3G3obaMJAf4M?kLUPaGCb2PJ(D=-7%6eFt_T2kH z&Xu+fU?;Kl2*f=Z2NzYR0$9GA9bwhm8(5XY#J@dAMB~^FXbw;h5Yd>z?oFs?#4cwR zZqG%dx7L$`db%2^smp0{XklBCkV>zSYzVHWJ2}j6+k?gGe3(#NZaS!)U9M+bcg)tj zoYq!}my#GM^_65uU|8z>`>LV!>2Lgg+cR<-wKYn4^FLfJ5apzN<#XE?rPq)Y=p;Ws)=_jhn9s^*uf7ir|%W-g+=Jp>QGW4I+lwPW2W7dSrn z+*yF}60pytC5@qcLTRIkd7!h)=gro*LXFl!pzo&B@h0Wp@;-N$rF46`Rl88>^dpmR5f~+pi;}01(}he|e>(^+NrbLF=J} z`N#gR)mv}+09s*x9C^Q5l%WXY(-RJPZs%YMRGvw5B>^x62kgJH}< z6umrl`N$z61)W4Fp&-_mM>Qi9PTMofpf0a9%lO&D{&TPLfeVk(S5*uX1y&LC{=Dbe zvxj7YUbb=};fGC+?Zx!~jiFa%e!n4IF-BIV-)+puXR%<+tD+d5R;rbqZdRm_!tdL$ zMi1br3g0-G-FB+O93A;C54yr>I)4HErZ3=hf<4(-UWx7|tJZj_K5fMG^#+l{cm3yr z{)d8xf-1jGM*HPk?jO1rlbLK5vl7Vr?u_pxzI=K6=$s4&{J%&1Kf5*hqGPhf3vk!{ z2qn=b69Q=0XvLN*X;E*S#C~c+?oU|Zvyx%xLr`1X#iSXEydVsKUry{sHtWd$EtKLC zwUV$QhJQ@K_u2NpIq>Tv%07%5zR&tK5h=Ft64fb_$uHq8%i;6tfILo|toEf+iv74D zzP3s_`Sv1&-51oR4M+i#31#l>7gD()w8I}JQy6?{z9QuIjJ%M9M&-Ot9QL*rC&#v( z3NFq==Nvl9<_jjomaQM!tjSm$OjGLYrY{f0_S1a#p}lDy5|t+8GCcN=S1cUHrXvJY zYCI4Myn}2riT;YlTTK5|}$;%dJhK94=jJW1Vpc)bY7!ZQyq;mocS_7FRUu{WiH`{-XX&1h2LV5%ECg& zeCG%4l&SK9Y;>-g0{T_Jaom|b;aZvI547RN_1#!B&V(Ck>JQzeHF7+}D-Y5sP(A+{8zllNyU$y!n<(H=9$x;=5cNvv>qM7wqk?<0HeEs_y$hsrm?`FW*?2 z3jGbVAMT%kugup1;q7VraR#QiFe$+?U`&KijcOnS@iKcEUX8JX`LOS=bxbt=pYhRZ z;=D1L;dlL_0k#SX(cP3Roak%LfA!{4#{(cwra%QIK|A`4+Yi{D&ui1$94O>tYE)4n zs9ZgGcFbF8lKj`ggC9#OjFgZCx5C_BeMrK1`$h6K5wuT$7_o+Yw_cEKY7PYW_gOYQQ= zs*`C$jy4lzRfTJu%;IabgwGY+X(w(Uyx=F)HaYTyBzS6vV1{LSbb7L9CJf&$jcxqO zho=stIF3Vfj(AS&Xeyz9?1)uTaPiXTM2RWLRgJ=v1C*Q8BB)0$DP6}ImEr*~Hl+OI zqRkPY@U0hcfg52(j%mRapOA9K_{(LwlrSf46!lRjh0H}0ACZZ2p8V*?>9_9(Bc!ZK zF6E^A7&rFCNh+8nXo;|K5Y;8B9P{zw9(Zii_K&|X)7^TbO{k1Nn8KT$H}xP2t0VXl zDuwoH7QKz?nH-ng>d8G~g5nYrog>73N0{}SdwggqJvyIN~ zJE`C@uuhh1$#|doJ*q{@`h`y}ErKD`N9zgT$)V%x_HfRLf8Gc)!QZgQa8giK4H5nJ zVVvQ{W%>W;v+%S;3GU?$D}zOI)mRvcq@Q8hD`wJXNU3hYp(jg(!xAEJ(tkVr0Jq%^ zGs<#<#OG(^eEZ=8QB#9@yuUCVx*1sOi&8=3+S;gP4aWf1*Bg&N!}ev(96W*tYv0FM z(B_wve)^i)WKr!{$j zR*dB<^g)>5bD`j`sU16kq(isrSmM#h0*8lCL3@ChFC}^FgW$95 zQvhQl^9tVp{66}hPqxAD^SgZ!)tcdrK7KWpk}{+9`~TfKoN05}1+*&G`1_q*U0vPX zHsq+|Z!mT1>?2|_8qE6LN@#lbPaS3|ZH)KEThWL==%Q})9}b;gIhd{gHZ1qJzmc!} zk{y?@JKtb;d39V-)-vgR_9JZ8{o%WzRq2%TnN}YFbAur!oCQ*Jpy;p^6|kS{l^-!O zj26NN>ufRTH)1&T!WX`5bQ)}+>)K-i4=wb9mD}EhjePlLP>!?4Wm=~CyF=8dZrx#c z2FLwfNJJt4eB=+Mm#LL}>@~I-E%vO!W!_*(L9?ivT5K}2!8f%1Q=s1H=5V%M0z0YK z^nL=}jDXiA_<;~J{(Oh4;L(^819$b3S+~V&t9(QY`Ln0^aD)^vy$q(XLpFCEd~UYO zh5QUzBE%Ri`*u$suf|v<50TSIeY!O-1F3Y@08DNFOv!7>&GxOXhC%U{n?o6+5N|xv_o3C z$TVVZX1|$YX~(ga>xWG{zRPglz;W>|GnNKjk1^wj?;8^p`FS7^FSD(Zyc^} zPAAd>1+RHH6RLSPmY+8U|1)$X)`EQ4;MzuqUtGFxWg8|g{4$&6izzw^?kDP?P@eJ) zp}^M>mr{?PJx%fR{%o~g;y&=PW!-mSoY=J<{q1$yrRnm+NwkjL`&04LzK$_`6e5XM zskADk*Wxp=&7=$b#nsg>Oa&-Dh>2zE$qp6j)l60mHK*)jPI=GyJx1yBII3D`6sw4` z&%&XQGNjQnx%66Ym9x`0SI=vJW+{4|K`nw~MkwPAiW}#_iD$*aXPYT)yODK9wfgvP zG}hZxbEcNP0BS~v<2}D=kT*Sc`#cd(UDTb4PI>eChIzKS)$5+u`klVzk@XBp)x^kV z$umn$P5pV6)nAGt+d_}TnM`{C(<>d)HxVC`G0vp*aB>^ZAz?P%H({TFkD!qQJISQm zFk|e-V%Q?Hp$6<==4>;eF;{ZWC$H`(C49k%EJ@1QK@bq}n3=-d zdUxSn>H!zgqPIugGZq`DE7(g@{t?{=08Kg`PUqbhi{NlL$*pUwCmKXTWK2h20blI6 zjH06E>9uHckAGL4xU#M9%^D!?e0zfIh=d@i7pm3!-SaZdg!ETeR~M=mwOp+LHF14U z_KqwHVOp^QK%tvPDKm|jdus>vK6J=Np%T9-_J@YA@VnmtHp2z;7|)enUZ9V(S*XP8q3V)xU%yV+?2g$H!fe=_!Bx_Etz=EI%ed2mOV7dTQJ! z=}7*lYeDGzfD6#|lJb&P0%?Kz9sIEQvB6d=clwK;*o6DHh2064)tWv8d1B-khKbbT zB?W)!0s>ip*}ELhwRg?Y8@}b%V7k)m_H5gxYMRyHhZwUe{nbTdh8&Ie&^O=Miyk(- zt%+~QSH1zSokq_)rL3tlg%Xg8uMq{1KGzo}d6#N{(Exdr5jv0YNtMQoNx31Nnc{MW_Gj+4Hn z&m=NmlhRb@g;gexjSjxvw7{b2ANf919v8^b1$Xbx?b~%QmmCk-UmZB|d8E z(d|^}v?-^Sfk&2~%BZqwGwI`S7UiJ1cSg&-Soa#14JwJk)y6FukfkU7JQh;Vw@)-~ zap8)(L9_glzIrfP68b7{uI7wL?RkCkA0AUjqn;E4_93T?_uB@6*uvww&0aOxDY#5p z1*yTTYlDtv-c8>$N@mmwl)lJOWlJaI$)|E=RTsnw(IL3-mk(o$r6BSEKhC@b)Mv|4 z;G-eick|8=G+v|`jyjlc{CNe=L(5{8n6h^X8({B~kCOal_tyDw8P?F(!8xf&XMY4} zbCtzcB0Q0?t8l6s-i_hf3MS7H#s2vGxzT01ugXF-SCf?G#E4WzOeqreX+}h>rONi^ zLtHfza4=+M@Mh{DQ?VM*qBjB)rD}YvA^*`S+w)1`cE-CH;h+}0e@eeISS?xA>{v@2 zY4%pEny#>2 zCrtFXdk{)0;Yc+B2HUt@97iG`KwAFv{pxsWnZ8>w-@=q|@S>@Wkcn#@egOX@MAph& zRu0gO<{NG^@mO;CAVq40C-^>2%?8Ostv(aHK`V5cSrXtNV%3*-zV=z6XKtv)W74s8 zPW0W`zH!a4`E;zj>Xmhk-oAAK0FVltDSNAeF(F;dWqU??R#Oh(%XGLnC{w4+(&iMj z_aT;fOaksv<)4Q2GY}B#AR=xm#wVC1cn=TI^?KQJG1N@s(3T6uuAt@bRK;DZeYsk` zoFPs?jK{h-3_nRMuK>&oLEWqV57%(GvYgGtGL2W`nQyTYy8JlT-^^K_B3jT>Vi(RBih zIBhGR9d!+OXj#hez4|rm085`DJg2}|=LRKhP|&zjY9#Xo5ykp!OL-r3P60+qI`nh0 zpx((M2PMnI*c7M0sa@Y@3&n_uhIf#glgbRghe6{S`RJ%zCc^fCrtxyC3BnlF*P05@ zoaT385rfy=@$1Io#tnCpm@zyieP|vQFXby|cgONlD`#jUJ`y}s6K!NcH-`S_o>cXy zM)Q70cQ=k9Zv7REHpoT%l-q_xf!QIXIONG5pTFb)&xP|f`nj*-BaHE13+U2l>+yXq>IY%`rF;E92a^qzU&3(zHt1a$cBB@|}Pi)GZU zUt2BwVy2OqN5W(Ie(5q+y2wFS3pQy*%)>iUC*i-cf)9_F@W@;fMGpRuX$9>_PF=yQ=i6u1L^KI@<2@CX z4Cr|AnKXklTs8}+o^K$NM{(d)vkU8`=L}9<&5sH{J?CEN!#Qj|@r0h5Nn+9`$kn2i zi_T}NB@BOdzP9q&r3-Vc$qYVcz7mcZfMMUV^SriSAm!+n!%?p`-z$gakTdL)+Obt7}&t+-?M%d{eHHvjY3AF0$ zAv4BME)QqZr`{L)-E$NX>OEOkmk0N^hpjQD>z_Eao#yRbQnFR;%^EMsq~v5C@S3wP zo+T;M%o6!7NGQg-wQFC57pgYC$r&%W)|w#X8hgc2mbb{HnPm-NQ`HFg0pWmIR-m)$ zXpKvqsMX@dT)X$xGolA&(9M5+5b1N_d`}NmDEfA)sSMl-!uO|(R8AVq^~u3Bn3_vtyDhn7jeh{Xsd^E;1?Nu}rg+b$(r z8VoL#fN@|n&3>k4_eN~LLG8qx3M7sT+dFrC(c@OV9BmkDsZe>eZJL>cb(1cwNyVg6XN`d{3cjptHS zzcQJ`i{45Zk4PrscF^3shNJrcs>I28?-#hYb6tk5<3FY;X(C3fV>onYU3a{0=3sZ6 z%NFh*4*kP>^-ARu_1SghaZmXUn~`s8&g8nV$BKr8bzr+b31^#S`0rhPhjZ3OD*nP{ zQ9EKA#WC}UXU1$&jz3u2Z7p;?^$;Y{1wdUm2`~`RemKbW`wt%eSXwns%p30pcg_<( z%ijRj79BP%H zE!Y*f-cV?E@5Bw2iKR=s7h6_~lqEKM{Z+RoM2(jO{dXsy_MP&Ih#yEKih=oBNVDwN zC2_+%!WAoCN_=y#&wcuKP4hxec2=6uIy~P`=j^}$zbyBmBm6o3ZXc?`57QZ z&D~FY%m1DC`%B$Y$PFuF_@Gfa5zc0LTn0q`mo&vimAs*~jn=q&&xD-g)HN5NCWW%fHd&vGLiTMAckoJBUm&FxdCB|$t5h1KP!0( z`J(}8KYl$s_i+w*OK-#Z`FfhMR}gg`c4o$n)XTe zC=R2B`{6}lwpOF7w|wV8PZFQY&O0?*g1X9a-ZokQOEo&7RGuXN*{ziLEA>1L5?Q;L zT&%$3H)$J1!0S_t9~J4^(|4X!qU8DKQ=AmH{m8-eCXrHqL5=H_K^LxSmh~XmAwPf| z7FK_z?TejV8eNyogR%~IVg;#(^(nJ(m0JJD7`MauI^U^iNO!!l3p2AU`)9kw_)H3O*Xs-P(DuEt{`3!3%Nr;D3mt{FN$KOEl$Rg%{f-_}Di=ghJEZH?ccH zWA*1~=tcN_&j^I&Iy3nX{i_!;1AP-|ac&XJc^`_I8;tKi4#pmN_-;iS*D!0{eV(PI zFlw7xe84qxQAocC83_Br% zzef}>Y<2AFi^)#vj+n{z0v~3%V-XxmYFOlWw4J{WGdrmKFeoMO?`98WHH)ohE2@kg z)e2Nf^tu=lXu1H{)vEo@0o31N#`Kq6cV+qIwzdlRyA4(Jx;}{;E`&`qyk~e;CT9XkX)3g)l}KY-AZsaXhl+B%W=eewc_2_*-~IM}+Wr_l78=^7;FJ$q zu{e$g)N=m!=L>L)h_bwK7i|z$W=pb9X_ZZFAC>rSe!jVaqlyws>K8(pU|lxe!}x)znoLq63VT{pH) zBFmFV%jA8^7L`p04pN+c<`4|5n;AuU z7)ODZk_!+^vejox$Dsq0ZqIz-u|!yvMKmHptQLyZ$MTqAAUL{M;-Zp~uTqG?1(}Tj z;IULBe9?hFd|HNRIkT4BmySQ>7xLfF^~VTlCr`GxcC$db8jOxLvy*(7 zh6i=OZB?r8@=rnGzB{|I7|^lgNEYyU11p-VOWu0dz}aU>BzWQ+-u29qOgd&N`ExoE ziE6!PKWe$rgeCcEQonWC(K4;5z90rumGvM^5T>0HFXmO1 zRYx;f?VNo9DCep1T-i%tp%#mflNNs7we`=&trFU%JO^Y*c^sc@k0s_VAfauqKGBKo zp2C7zUYhtn3b^hJ)K|TsuwlJdi_6F6{TLcx4Kk1%6pNo(e|x$&WVg^tu1WWig$*@H zb0T~aH~ufJ5T&TK*j7Nd;b}!a5w}$c=jSE&A@17Z*FZ96q-+1Ru3>qR5WV-~DB#p{c=MxXjuTV1FH^7L|- zDZ5q3w$zm>Kla$qp69o(X_a5`?O-O^w?6J3`bnq)I|g}1XAYKx$-vs5X(@;#z&c)# z7|geqv^z?t^gERh?xw^nmgPx~Ak9 zV}VI!^K4&ifzd`>r_tbJwmI|6+cjxI8WFp_F#2vi!Lt6%wAUul?dZ)`rv}Q(lPA3; zVJ?HTJCmMSSq1B-4)YbWMwKjDcU)Z1^-T}%3q;sv;ezkqz-kW&r*9HX7A=bH!Qq$8 zku{uqQ1)52`pNPK!s$ZK8hZ3m9JP0g4ksigSSaEBDr>n`26`zFS7a|N^xBLdNM5kQ z+_1cJ%mxtAvh_l&vvEf9{&e(fK3VcWK`$v$ZgaUP(bZzKoSY~Qc^{F+0dw2?P3ZAs zR}_w{SIhNl4Q5f7yT;2qyUI6duN{2fki$Mu4NxV~b))yC*frmx>D77#_2SNd-({R; zxeli*`(aCq2Yt6QT~tPyM*;Vz##=EmdQw3=^X*TK&kR%9%eKH|cU#&FVn%HmqvuJ( zIJoT=7#O+n?2D%Cf3*+_+2N|wZo}AoD>?m|o#KA*hdIqu2I|Uo=f57Oy+_=JZjmm6yfS+bP7~y`KGLdixJYRCLgO?uRHl zPli{6eg5xxUbmgmQqfJ+bT5A0OX{E%d=8iDn@-e$k3PObmqHJ=wG#fP`>a4tJYed^ z@*vasJ@_eVO0UWm4Vc5_-%(55wE#1WrFM%Gvw*f~TO%3aV00o@zA{S(3zcA*|LMj& z9ONDlE_*AT&Tr@-cD)?OorL2zEKiQWqZsRAEC2r%_8Dk~OIYH2K61cS=?db(3u5O~zWa$Q zUQwz?-{A!nbz^SMV($0nljHjlu|TfSgy;>gt~F-8GnAX_`Ah#E%ao?a?no=n6ce4g zLy2n=ilm;`{v(?9JiOC}kG}>Rv2E%ru=3hG*vJXeGq^0+zbc1#ov)3ZgY-$*#0I0d zARHotq->wZ_UE<`M8}mZLCX^PSq1sD8gW8r*bLWQZWBYDA6vRsi0Y@fBz>9%5>`Gx zmV^$fJc8Q8nqjTpo&6_>2pP{`JRJjaew#m-0<-$9**{`B0T-Z8H6GE}m3gMO@=`7V zzw_q{6Zb;3^^q0_6n>wz;G+cR56bvV7Y*k`iOROoDdF1$U&_ZMa=r~0`rlo+5L!47eNc7RQ+tnAdH4q*RpK!eu=_qjd8;?D36kGB=B%G^1{dN`wYQEXAt1 zTY3YlTCv*w*);O_yJmYLtsrXP=8`$?OkFRE>mmfkSq-M&Wd7GM+T7ySZ3pM9dS@g% z4=twDd&A-CyV;So08FKTYB8km^oG&p;3Rck*>CG8jx9cw(?J!WKk1@$z<`3$q@4L? z2i|o4q)914lqCjXKcF;sQAO_e6U&-OjGZ6_ z%X03@qib)@e+lZ>+J%=nh9T>I2UsMQ7@5Xh2h z)Q#Z=SS@=_i5NlwWxMG^|4!5WiNo}Td-#VTBR`wAHoX`&73M1=*$h7a@5bvpB{Obq zdh-KLLic;fz)+D6*xRUdA!wGM6ft(hiU;(ONx?1db@0z+r4X#R_$f;^*f z4t@HTKeW`;%jLx+v8UpOA;RClI}L0VUZ~?u<)0jio&>n>?2&yh;ocNbM5#hC_aekj z43l}hJ#u`5cGAi1Lp8qgH}O*-OEUIh7}rZm%CUE>Q{PSMVv+HA?EN!Z4heB?FZTJ= z6BZXMRJj`=dtv^HjrSizxeNl{|ir@{FNp)65El5b(Iv4ww(aIGK>zOZi+(3#z>T3sa)RSjC z6zueFyfQa!=uUY&Ge;*mo7sjHwpjy1>;whIP zU0hW#dG;`}l*8qZ#|}}z5C8|2t1@d*k!C}<_%0NRUiW?IeX zk3USY=rGlN9@6TX>}Jo~lH_^(Wbp6(ssuKoT40>`AENaQ*tH=-8Q5jbg<+FVH*t#7 zXAsLLMQB>V!nsiEOPllTn$vQ;$!Q{0i);{)diV;=5U{K4Mv@Ix=jl~9fj5lw>Y-aI z^q;r)q{H=JExLvgitx}&nfz~x_m|_}tIu4#P?K6d)khd9XrpPoaHcJgJQaaxjAh|U zsU@KL6bZTQf$Z-5tt18}a(kVwqjDmxZS42{&^E)(;4qJjjI6Hayd!Xm`|*Ce<68Fn zcf8+#1i9W<)1O>s(DeTLU^~767mQ(4xQw zw*bE_b`KfP&rGct03#1 zLi7L;v)@gk%J;N39a{^=_jEs|;LSyqwA4=&5DNiDGMPHV*AbckAuDJy$^Qjs$~e|? zw8<=e(@;3I5}c1Tn;*m%8{*<{w=RVy>GHO4io{IOT$YA0KtvRqW4Md5FF3`O25Lb~ zt)zif!*73Q>f+Jrfs@Gg0ZjN^_HqO(K6-sxw-NAWq|s%$$PXZDSdOIU_F1#6)4ca@ zS_=#0v>Qnh;jV5Y^ukdy?sFWpbJ}|WS@{%|K~sc;iJ3t1`vj!MNcNM){Atp4-{VMO zLS7p)92R&9ZGZPbDNS#N?F`vqCRLV`O^Vor${OFl$ifa|-S7{?@C79d#S%?9@1HIx zn6zG8)r+5RGbTM-9wak-kRtLv7gbp8Md12UPQi78O*0s7>38)_uo=j~RDzhDR}8;D z7rp)ouT62pP|&rKMd0LWbThze1Y)+(M$2QH9a`Nh^qriXhWTq)!^>wg$2T(sO~^Ma z`X|%bvd=IexrYIP_zDtvyCKPhk_07-_eZbP13{Uw6-h7T{$Tt<8|%U@p(~nVq*!mY zAH?Dn>ICI=tzT{$eY<}c&{I53vK!RsK2FFtwYaZmX{~+()&!w2CD2M;?Er7zNp(EkAj9HD3Ok|-(!_Ec{Ee0@(tB6S zP1p(1n;&|mdwYA}kO#OFpQ0(^*vwp92}l|K2e;sQ&`Hw2*x}X(9cLaL_WNp9e8*@+ zpI%l8%D)WUed3LUD)PinHQX9iQ$J*G1#hJ|jj*!|W;|XU`$Hi8z{f)PxtfO-a5bI5 z+`AJZdH(AT+U5cuCjxjLMuEuK{E|$rK&d_zVtY;gQxXs-ytavZoya zH>u@sNMQi`Ib+-?k!DbL+_UAIxg@+;=dWysg2c01vLgEOk3Oixyg4bh02^*qlL@j8 zajI(E7yVLUaca(f94ADY-!8(Vssv@q)TDw%e=esNGQb9DnNY{)_xqeJlYMWmQYG4ynn-}UV5YTOa9pKY&g2zbaza#X#hFL;Kz+# zb8Cr0SHYR(Ml*G$D0Vs@K}>{ZQ+ z$soS$BWkw$T^ZgL*o=Yt9210BbK8vkGIbSHty?IMGiiA^0J`c@{HykEGe$KHri;{= z30}t)!-+J{tt{lRe~W1)Bb48cQkK7UYzL##2zt9?sHv#GU0tqiJ6o{owYVJj0rOj# z5dlkLWq8)9mccs#{C6j;%g9(i=L}i4e>ko8fvmzYDk(!SL)n|I0?=G3ka>7{9U1vz z-}G%h8dKb4WMbxB=|I2!OzRQf+L5c?S;KCKhC_CmYv(6uSUDXs)qSv0lx` zLQ;O0Vbe;vulS5r3|8Ay@Ak$vnft6!RE+1Y!osI(AKRW;qpOwbP*Rn{^-pLOn_qPHI)+a>t!~I)W70Y9KC=fEJeMv+v(x}tC?@iCmM$jfRN3ij*Gy>R@@hmi z%jWm4%?)4lS*l@oaW191$7G$BOWS#qL1VU&%;yuQYy5#vtc6OS zV+G=X`4#>kZX@MQi66|;618Hh|KZ~8pqnJPW-`A?g~0)3eyDtv3u0-VNn zOPk52{onfj*4~v}D|cMbaXWpQ0pIH24B@MnjuI@b^QRb!6 zs=09;=k!-9Z^kE1!Z#$3;|BFsIRg`&`V)2|#J`kGTXXDMh{QB#(!q_t7S> zY(O=g;vIN1CH`j-??y-f;d=8^_zpI~U-TU=Svh~e5e}zze!y@fD_kbg*XMe8dkaF8 z6+)1H;vh2QT18R~N=~6p+oP$EM_5xlD|hic3GWe6>Vd74a@n4QI3{dV3tpQNV$@*b z3H>yxUg-I;j-{En1REwROI0G@Y$W7EMgEEr8Sz?}_}OUi1|+LyHL!I6DMAlLzmviO zJH7e+yG0@R2La}6i2w~GWqoT&q>%BCIs!{L2)1wO#SeP0`<(RbC0z!#Dpq?k7~&BM z(P{8c_eRM|!rmT`cIH z(ZXkTdcw<+Y#q>b#C4Zt{-`uGWT6Dw)(P~yDX--(an6xk{&ic?mDA`w_mv7Xr-v#z zxW`6`MP;W}n=v;QK!3+-oMH?i2|=2KnI5ce!4WK{;p3*2g`3PVY>nQD1F(aiiP&3; zXjCE(XFcG)?CtFx9CQt9rQ(l!VEcKLS+X%V*0!Le#T;63}AnS>vk7^f74K9{m z?Ca$1a3-ki1V~k?6-Uj5%e?O&CzR%t7-9-cPa+)E-Vf?uEm6yz*&10L=fGdb$%!Uu z;If*Fr+76^SSkN?F=7xH_1D$+y}n4Yr}I z3J|IOyN!{5ml^t7RLXK2{d?&pUa>lnIU>%-Hm?BVlv~7f=yAC~>}}3C)&e>BFWIn@ zrWT9wfn3&%;LIKH$N$@#jQDT>H)*MOB`hLagn<$gJj42)`R#N5Z8vCUWQrw2s5MM< z9qcIU>_t;11|7=Op1t$1-uN%EiSnxc>Wi?bd z%!O{Kg&}C>q|D@d%@V^)%w%>Ip_RJ<31r$sC#GXe!YoO|{PS2r#YYaGeUK6OOIdE; z%3kf$G{TQhoV=kMMi_hZjfYjo85z93gt#$(dfB`^$?3tXAnyjs-@I1tjJ2eD{`S_xmic&5WV9SkzqXS5$v z5z+1G8U9k9t-(Ir-Y^t+M}%euJ+2gCMW!IA6|0*{;}7*Wk&*DTK4a32`wzCY}{M{djb;( z<3u=!#M*?&epvb%z+~DP@3zA~7L``lxdh|U1z|mr0mp=70W47o_A83M!;6;S{ZC0F zex2q&CkqsyRmH01zi%Jd_st6b=S2edEm&fBDp}^sfwuzx<2BlcRxbYbn4Aew|41k< zvS)vLSIpK9T9Nwlcb+YsUpE_MeQ5M>|1mFy4V%&QaUF}DGYbWoQbG*v)v;GIOC$?g za`*m8!(0Jtk&^lhid1{lb}TIEKC@U4Y`o`eG{Y`VwE6hw(NdhA=S6f^Vj00(j$Bvm zw8)e=sv=gYqzv&xzHv1t8lsMf))JsvSPg~laUcH_n;J_yX_?u+aRYS-NZy~8Id21h3Z_H<`{&Y={^hsZQm}IbC}U0b&Nay%s&&e6 zO_iz{O5HiZnAy#XPn(kkimBvQ-Xd-6kstb?V`B_}pD!_omX$~)^I0P=cA@+isZpKY z&1^!N&<~m&;b*@C|G+ZE1=kHcCyqsUgH1HzBpi~Z^ssREA(W0rbnrPkq;Kd;J>D?Q z@Y6C1n0KB&&mibfUtU;jAkhu4Zc9BobE)}kbVgeiTcss+AsFbIr1#`+JNrvV8#~ny zfu|KjX7>&Y__0=FdF}jKpOp2YBDOF%X@cqcecB3?j%eH+vLWF?rp{4O010Io zwosiq+q0k+xkGG?z$0rcqCMehcxT3f_raG@OlZy-vh3KnkSt)H`S{OAkOB{jdJC3d z5g>I`CFj+QK3oxVJs3iHZvEwm7M`jBT8Vm;YNEJ~`kyN2n$K?GK7Yh(k1uQe7Jzn- zx~3*l3GMT;oJD5j@TF359w`Ui1vKJuT+&cZRxzm-l823;Gi$6e`+q$Q|NjR)a5X|v z8nS-I?^39W%+x}J2nF?cCN1_>4QPT>;*tJBDQZaag$I_uymBdqOvwRJL_0^7H|{E_ zlFx1>a{B5V0Ifblv$+j-5832pFwJvi@rP_%Iywzi>Stv>XVH=rg8S5kr@2rBI0;X_ z%BR8roD8JcZ}vprz|Pfyy9kW$e)7NEvXm>x;|uy523VNh-Y6=Gp)kc;CNP2cdwHA8 zWk};3%uL-x?)oe(zWM#6}NwbU;UsLKxTvhr%v$ z)w^hbltp4Nn8-_aCo=f_B{B#kWy-`>?Dz>6(q;KSzUc>uP;2nlw_9=;EDQ~HMkwhW zboy6S_)m&mk-xl&FAv6mdJ-|DR;0jZB{g1aAxmFhx|ez}jl2415dq0Hp)4Isa(|Jx zSk!AynNP>JK6iy7w;v-UQke8l%3eiI50E>iz(x$qeqwV3|PRc8q046bK5Hl3|MB(R#ys3%I>BYV68}+95F5y4X~>sug)0M<(`l!?o%zp? zeTzy`G$H5smxr*FfX!15=W%%Rm0euiUU#O=YlO8qM6C4;7t>FKX;_~o$92muz*kpZ z+R}kmErE(kSLE31sD3Eue>}aP54}|IVpn#yG}ZsE_QBqUf)_gY zbpQj?{s?Sza(iI!q@bVxP>7LBMU!}L|Nb#MI}7&Slr;an=ilnCW(#nxXo(gDZC{R1 zg@kgbFICzqKGvk#kKxJ?^Gz?d4&A~)5ZPI@9K7RBX;PXR>NzN7d2k>lKjR4gxf+gG z`Jbijf4z@ z2Aph=3RP|F+>4Uda4t3p#-lYQ9E{-@Eg>$QB}+wPCBl$7eJu=tnnJy&kvL9jZ6Pu+eYl|O&7P8VnJk5F)FMV?@j z$Yx3s@;( z$T$p1h?@?Owzhvn+muYzP~Icsm1)eGr@{2NMn{^Jc-uF@7jY_okQ=p9B2>y03h zb+)30Gr0W}OZl7Ty{UGv!tB~H41wUz6N&bVO^hyv1*<^frN=BcnT4w@&547Wnvl-! zktq5!Aln!$k*R?&#Y)C~RkBSLN}r9odP z{%_~)Qs&$Q*bM*3;l8RZ4%U_d?Q1UcMhMXOMH};4;hI3!P;neQXICbh?(Za|Q4ZSn(S-Vo5hCa5-Ja>!wpvG1suFO`N`2in;~5~1 zok~7Di_06TvtC+3zssl2e#YHWSpbo-p~{8G!JJe0;uRpv{dYdg!HN{?r~O8gxhpTB zJd~=yjU1G_Xh+-VyR91rsy1=1n6|8J_{iQg@jToQo>7_aj*c;e{6)ACP8>V`B4q-s zK?t>O?ldvFla<9N1$ z#80p4@Y`NHUU^)SS|*q4+XaKOnc@e2wQcjahL2c}y6ywRHkX}xi@GZPw#t2pPzeRu z{(%W#pigH^^#KBCej*}rT%LwGQ+?mvwXIJh*}tFR8MGj-`WUJX{}^&mLnh*bkgFU7 zKUwd3#})c6|DfsFxpYwRXfac@)=WAtH8*L9dk#9%{UFSiex^CYrktFWgpV&w7#@)m z&4`AL9iwsqByr47J|NOs$}>r*xqp=yIPiUMc}B$NP^}9(&0egnPxt}vL}V!PRH-;0 z7Gxb{Ig|xWOk@4EzQg(C{{3xZ!1hUF<9$as!|mAc3N{b4MX#5XMfzjPgnFO(+49yL zz4g|uL+pSk2Z^x5Wlb_>(D!`x3D`CDx!dFZVwW;@@-Rub;;N9z^VIDxCOxQ_{flOP zH=mZ2*qkwRE{oUO=enSD(buD6$#*pMN=AnE+vn5G%eb~BZbM%nCK8d@#j9lJOaECV z=3|h@TMKV(RURg4RmnN z3wewusigFEl6WGnbp%*$mu9ox@4_l({O%QZ z&@$c<(59RVGhL+=@PJWLQN=?pZJOwyJm;Y(5g<>&5MtJdqZY!0{|jPj^;13VP6zU* z@S}>5&iG5+KM%IPy#vWgG~q29y5I#0oF4rjG?@A~9s;rTlg_rZus+3xUBO|z&eE35zRJKs=dp*QQm9SGQv1s5iELo^F2_>2kQrigA!5ZANx?T^N5dN~O z)o)sC1i9qNnqS)}OutZ(npM^Du3@A{Cml_|sR+1*#}tw9Tg`t7>|y;njF7GcwlYC! zLa_dFiC%vGIF#_2&ubPZ9|(X>wwcaT52l-w=aP~SmIVw`5?N6Vo`g&KLG%oK-+&bo z%VpWwtEZVtea%s%{3ZX&ba@R4Rtell6(}`eIkZxL1Z55Lu=MI7Y`m7`&8m>E8aOo|1}4J)#DxMfaD# zp3g_Ta56t3CW1;McDCK^=nQi=@2^M;*;fP=C~RETnSz?dF(5uiq6R0*%o+$7xcc%o z0HhPmAWUl6=}lPA)n-i@IrELUp3n9jF&sE01D8=g4Z6^xLP66;m-|d(tMf5_Uin?N zFMyxU7o)6%bVf{TwHfcV>-J+~Lhc>%5p<@Z=Ob~r#=p?PYmc#N$kl)O&1Bj?5Dewb z_F2A2)2oOj3W!Bx)Ipgm_%<+W(X46IweZ)oa!YEoE%-BbVH}KaI8D#uo`<9|0Ug zE+)g7!Nk9Dv%>Y{EkMp|cQ&)71IXAX*a}n+%*6XoCI1$GC2F8TYi1NRLRneS{_!6A z@nV?9yhmu&+MVf6|B_aG0z`@L-rXWRSLFpUeD0IFw!xNs)N6APt6ARgD(lkKtHZLK ztygc5vYKfo;eb`5(`j-j>oLvXHD@~gOqkAl03Wfow9~-7V6%7}pys!mKbXvHcyBb;nZlaNZL{P*-CnufG_g@4b0Vp*tc(}dhT$)F#xkULSx9+}@MyB{^bVFf zB|SKvRi;ta@-P98!TkMdx&g4AOJlfa-eZXJSnq1(FJ-4DqBY+mw`s9| z*KQ%or`>N@cqz3)^xF+n*#TnZ;wVs~9q)7+hxE?V%uiHkMO|@fSI@82e>I&gVq(qe zv>CI{-(3}pvDZ2(!!c@iE?YYed@f0h@|NJ%2V(O~$`A>8ljVUCA$K}q$GS%fAJ~Du z=L4`>xNcPIa&pCo7;KAbe9*(3jwRx#MIr87s&2)V*HkuNsgmzpa675y{wWtZn4&p= ziI8Rn`=G}CCRxaPozLYo=+7Usef2DA(d~=cs?2Mb5xV4fq8B*`~lB%h#!?VV4glXT2&p zO$EtumGz_7oE}c9n5~yNsWWGaXrK64=nR|?x@qq}eSE13JcRXt1m+aKER)iA{j61| zYhr|+XA5|8O7yvRBpa(o^5!d+bs5K-7mu{lY)z2~<$v8hs&SRE%bd&2f_hEvkLjDT z@*8?KJQPLo|Mmf9CZW-pfN5GL&lR)Rw`XvCQMVGRIo%5Il`!KRZTYY0NIAb1Y4yM= zjb|%D@~o)zP;|b0yNhi99l!rHORWE)lHDee)}FH2IPwJwcX=TSBQUib83hG% z?m)F}FyGK%KdM!BMp83Fo&7m~_um{jXL}E!d|j*67T7>FcYkK`D|~#<4ScR5mgxEO z&Ccs2ud2QzIA{SACS~EAxKG+pxP3c50si#Tv8WWzqQk4CxjIUKl_PLF6tcL z3`ax*2rP_Tht}VnH*=@HoXs_LHNpi{HoW@YulKTspTOh4zXv>c`^K)N-BC2_%E4pE zB9=~Lxu!HK|765)g+m1s)q(Rz321AhA{7nz9oQBOGj(^d>S;!u5GD4BR8T2Lu`<)M za&$CnDJ_)WdSoT`UO<=f(D%uvSNEdcVyf2JrSX-5u$|56a8?3qz8flZc03rK<}_BF zu=%SWiYh2Q_BW89!8Ne3a{{vwSRXbG?1(}A0~)w3?k_%Le29Sb0M@vEwe2HJ=TZ-~ z9?7~Jccy?R)Ad}qM7ub9sLZTVTUF)tegz_H-fag;mn}&6##~*uqMb<-pGqkMb_X3j zquW4O+Qy_0f{WKIRHvNPX!D`c2^J-jO&@K(`kp6K&=aw;a=QQbuv|6^@}}KOwl@*p z+cIKCO)HR+Ud9=c;d;@hT+4Ookj?MwFFPw?Xtog^Z>V@G{9ByS6Nvy6zq`)-h_1ro zu!NWtc?Il+gni+)XD}-l*VsJIKITAsNw`Wf4;N%kI=IGkh>ZuvZmpfXUmwJT2I)>Q zZCvMtft(NuIZygeK?!R+U@nL#^I=cH=Wqwl4uGwx>tj0u`iwt}8pxjjsq zy?APR1fH#Q#Ovjh?F!KM#PgPs`15vqL+yBtnWGjev&`DB+~P}LSY4>fEf#Zmn~b;? zPiYg(%G5*rAmv!x7skBnC?++?#~1Z7Tl4DI1nU%c>fvQii~M1TA0J(^@>D9 z!Z08NJM9S}EMaqFilo-*aqA^Ds;hI5SVAx8+lUY1Y%lHheu@4iF%wRLHZQ#ZzZhQ~ zB0_=!!&4ISPx!&#`D=jN8+4g83bj&7_xP{+*lkFOy;MU*=r8i<3d*i(ZO!oN)y)DjGZK-S zinB;3m^g(AYZdmJP6TZp<%c*~oHPa64{=Gf`DRe!#P-x`Ndv>T*;1AU9YAb?9CSsl zoItJ6&wznTlB>ROA%GCkZoe}QUbkl9ApH!|g2eyQ8L<-_%z0R0zVV*TX<2A)7U;|J z#}#P_WseU5V?K;;W){~GaC<68b29NIL~haGPp`9eJ$zLURW#hW^w*`y8m#-dw_v*# z-HCQ1KpoTIfAGBwEK;c%&-+T&%q1H)8vGnX(rV;hKVaVN)f59G4))RFln1#%h>8i< zv&QuU6%%{@k04~~S+t=Ke)0TaANhpn_RQ=-c6Nhg^rNWH7)c=J))%mhIUs%6Dd}5S zggLQuyv_i(Q9{DO=ZFRzO8Qy6ouox^0v&-oDy1ygH}CXx*sNeTS<4Vrt-jGm zo*>)Rys3;=Y$mgvQP>~Vx_$Xf;+avM-XE+~Ur@Od>B^rjf&Apx0(J<$+7G=9_7!V* zVb62xTS@^RKNc{(;U0MUqfb6q(7*j0ehd}&l3%R)!q8re25h#4s3_{-*NT?0+OF3V z)^3VK!3fibhd{z($t}Tk9|qFXg#W42(rvKNt<&g`Qc`6t-0%~HQmWd;=l*FpI(>e7 zg*f|7;3=F_mHv{IJ{z^o^&+%2K(i`PK6%1n?|VDVv1XM{#4kLNP$eNdVxIF= zABK`B?-ztmgTf!T8H!fnE%AOTi(fF$Ha-?}AK3cR`XU}Kxbrlks9KgPH9r&Bm&+=N zJv|zUV(kZkMhaki@1H)IAEjBlHrJAX==Ugz_V*iv25318xv~4b+!JDo&&UFAU?p}n z<=+>V z^W&~sv+MMUz*h9$L5@#@)}v~?9tuKpx>vqomp@+xYKexGTL+jp0`J?wLaX_wm zDW`po9v@9?y-#F1wCYc}MVu0wXR3{wB)o>&GK0?hw%7!@BMe&zd{3r%DJ#cQTh zi)b$%Sq)rl5a)lLHL|$4AWqxvVn$}Fa@LH!hnMlI9qN+Lz2TUmV;Nm{TcN}&*76Y` z-He;s%QwV>@5Yyv^mvwT-xL~-xwV^}`aiBFGsAi47mQsOD-@*wJ7(E3e1R_*ZcKpQ;?y5*dd@N7fZIfTsM% z52YZk1D)~~tc;<$@wSW3i3cilpps71jd`d=sR&2(L27@Ui zH)6YXpO2K)Wr{{|c^a#cc0PG^6P?us1|H^Dm{AQCMi?XDIwdwao^}9lOhUo*e3H|& z(r&0Q3%*73yuFfLI^jrC#-gm{SchY*U@2LY%c__rgue^|F`@5yhs)x$`%X@s-e|3^ zFxxX8CDUqFuHE+aq)}DIug`t=k4(q-%~_Lf9qV8tU)GS!0)!}b^EX^>2Lpf*EZZRA zVelsk0OaA!Me;fM-1FkdkH4VczhLk5fdHk4$VM{dU8HNSuWV85oe6` zx@OH-H|grFSWY&Xl!CF)@+P8mxgbc@$HR$?Q;2C=~rdi9j{y4<7{#@8AiB=*%PRs_`2 z*1X){VF3r`Io?rI8W)WfYQ;aj&dEu~q zMV+8HRe4;z7WU@2RBJgh@qNCA8aWpgEb}c8XdK*D1W*_hR0b2$69&LuVgi+&H@78% z*0#RJ;*qpn)$-j5r$OUs&d#9XN1fMPNnE~(Nh%B!0tX(sDW~JcaXD9r_8Goj^ z3y0-uoMuw&~ZbLgbt>QrUu- zs7QMCyUf~J;K|T21e!luy9<5A&SJmp$Fw>?#DbI{F{n+m&EdW6ma>zwa!=f^dlI+5 zxs;Wc3)uEf{!~ke&gvZ40k`(TX82V!&*58qM?l=Q28{$ATy8h>zVlJ)>;vkr3R*m~ zVHZbptlMY}?k^S^4OylA&=X2n?=e9smtry}qiN?}f+*;LWNbBfb6-8MNaziXpkak@ z2lV3&5dc5DD+SGaiJl?<*Hd9aH+G z6a%5lkyySyXIj#|6^-$aOB#gn5JDm#MpNtZ{laZPcID)_*SZRmjnH+!@_!CEYhtuPRTrO z+Z`@S>({~LwHIF^ZW)_P%NLbU0``~n6nt!EZK`ke+_q~Da?rxc7oCAp5K#^r{`ok; z9a9aO#8o1#On_%W4}G`u5^d6JoBj3$$7@i;)$saoA%jco*@FqjSUlXSdllo8^v~ zBAd$o@EnQ0EHM60jOmrXYcJ%#nhJfqMliRxTj{lX1;3aqcACV3yOqtQ{eh2#ROmHxIlPp3gBl}&%%4=O>vz99)~}fNd?i+!L<`wVK+4GjUCwkOM-vVHeZ!yJGOFfCw<5Vh%lmXTO+nX{ z)3*(C6nV|#uGbsd8;JMDBFOxC(wOz5-HnQkkKvSoMPOUc?YH*Q)BD??v{s;<$dw1E zE`Wn!AOOFcwoc4;t<8q~ZcK;(NO`#3Plrh`Rum#Aw(#nDTHu;Fy;OB(Pws9wO4;GR z`GcC)ZP$t~M5IGkEZS3GbQp&A+|Gu);MNOyg@3slz{ORBUv) ze$b*%R*!J3j6Z18goWe}rvAy+=FL?l?&x{h>cfcq1u6DG^j5?7y9V9-bAZF|Fk+I( zk=;l_er?9o>>>fz6Uca=wJ^XnP}Kq#7Br%Vx0;k$(vPbSkuC=V;QoJbJOJlSDU74= zAN!KA-!KyC(Z8aPXhNuK!VF{ygFSC9W?*lF+rgoaK%*ut7ahQhA3E z6FxBi-8gFOxV}zF)WS(DB<73V7%#um`}C%^+^oCht)z+_iW5{+PszLmM3zQ{@kzj+ z-gJFWWDQNLxnBV2(%(%A3Pz3D+gWuvf(jy#TI_hyXi-Xjg&umuPN z9I6%fuTKZCGMZI=(VmaHL#a7FxHmJ4$8?BrRz|;pa&guY4{w!9JYIJIY#UT<3@CK} z7Cv|qi}MSXiz?FDa5@w89%wi28+7xSt2#GcY<9<97WsP(?~vjMeAZE^n1S=C$ejt} z`&OXCQ7U2ApjBQCCCSM}3Y(|VXqah?dLSrpn?R*t;^V&HaeHo9WsF`|e=Y=mequPN z@c9Q+!+=@^tM~NL%_u>m2a+SA`>O3jHn?REht4~>L$=Q^vNaLJwh~NlvWFdW^x=!Ef({wzSzg)8O#S;9|{Tnhw)cpvP z;Rx+i3R6BV#;)8oj_OPu3#5zUf`PYq2Q9<37tuzGyMV(=_8ZXc_xAhxBR2lhID5YF z!a77W*!f5u_3Q`CK8v&Xe4;yE-a~WBN}Y}4uqTmcA`*uztX75MS#cLNJb);UWSLIi)u1HeWe&xPSJt zh{F?sO33f6-Q=T&AjU_L!8rc2&xa-5a-+3R$Q80pyKvrTr6R=|9KvsJ{;UmBrORWC z59VUoTY1)v@go#g@A3>Il@USj)uxF^(DUJ~QFp?w?e2WOV(*j=d#(6L zdvnyec^z8p%Fh>A(P`A=`?aJ2bLEDbJY zEON2<2@K?aY6IBTR}eMVqu%sS%KM)V4N>M{;;SV)p-4B$giMNJWWNfyZow5uN$R6C z40I(!i(;)8c2fb}Y2^!G^BStC$KxxJ&#IWkhHl$hfL);s>9Knkj<+*uydjEkv7yrX zdb!2kkW2iwqg8@rlhO2zJnf2Sl^hX=2M+A?9MW!U^Ss0no4JZF_FEvnS~0rq#g;8Z zFsJQjrxc(Z&=F$Reo^oecnQU22Kn32tNT%ulL8I>fBO1JigE{VAshEAOshvR8xjQT z1T#jI+M$rtAHIobY_rRq>M9*2X()im(e|1iO*}UwCFeib_`?q(%DG0M6dm{U5bxGh4X(%K-+Ayl9@dB&{ zh4hZSE+duO{?uc-vAllk2KT!D8qWz*m7TS!4|~Ip;CE0^z$5B-#n(?31saJ6u0rCK zcft@QigCjx!|4vI(idFXJ^96D1i9UcOIl%~R}&_oXcVp90H4b`B9aFm)rE?TflPpb zjNx^(^s;1T>tOE77$|txfdnWLy_#J$HjY}+MCJa^9}3dFSLR?y_ZNXH9N!iZ(xJ17 z1r?2J3y$hoxMO@H0bk{b&PQ3wMpi@`|D`hf@GQxqb1|1%v8@D=%NJ~>L9 zX}0h76r_xMOO8oJl5H`amv@GzCtZgVPo2Qx%5|moLx&6Tdg~2{=P5SIA?df6960kR zhpBCQF5kAfK|;Pj#Ol-DbYy;~0M%7iInbPq`_s8x8MQwF)$%-cR`V4bWfLF-_dC?R z5Go&=D#L!FeRv$Ebm(nk?kD^DNug#_y_6_pBMrC;oG-V;@q@^8`)O6F({`IIQR8w# zX+|K%nH5|E=+u340k)U1sMn-$CU;ZRgd83f{XMd}nPxop_Kf&WexTKfuwzIDZA6kp zd*1|tmjdWvULF~P@=s2mB657*lX~j*YZ8nnIhXK1^BHeDH5ff!m)QbtCTT)D6CQ}^ zz0n3;4*2Jst3Izo2b@-%sTXyV3&JP_J`Zm(MjFMo2|LteT3p_H>B{wc>KYzItmy4yFjLNmnvw3tR_9Pu_hkb?usjN1b!L44( zktLL755&N2{WhN}pFk3Xtl)5EE%a8~69A@|lTAovf*NeD-0=Kj8TY&=5;cz64UIS` zAT2SKZpFc-c#^k>Eys*qO@i+4!0IpQH%rLxF3%)jQIt{G1Bb8Mq{k-(`^#idoZ1&_ zTtXSN7BgQ}8l=Jh^p(&;$DRn{ygY$z6d=LwOmY1@+-nnG*?>y4u{m(R2 zRfPZkpL_tW2qXcZgS3{|s}jIa{Qq=C-Iu8T0V3m9fqPArvMx0Ijmo!Bk9=CzCp<24 z>Xd`OG?? z4aVoNC6#iRLW1eOKm0KRTtYbByja6Xczj^5Vi_>87 zspj9Xn7co7UEbZ-`pHS`{n|g6<3);`GZ7F>Q|`ab=9|MpX{fdHjPd!?C$<>gQ>6PZ zMz6mufS*yc;BwmuYvE#iKkxnee!Je{IU%ZIwb<&79btdvuX9$aid$AD-ayl6v0@9j zxP`_Lh1SBrFc{S8%}Rd)ZKOhQh1Y8No*%l5dTw&@NNi*$pMTmr7_k z<=NeRu{Z*PLxtoOO6m&-2c3pk)W`dvB%Gw!R>db!7v999~3 zA#RloaYIhA{9q1*=uYk{+UPds6GO}%0HIxsFDT>2=k_jBSV7Jf_!^3`EavgyANZ?m zuI9&;8UM?$f3S06Qoy|k2tL$KtWqeuz;&kV?AZIv;MYFyD^;I&c;nA24If&Rhu&}4 zfvgxkRRuln(1Slo(!sFaAw5x3Vp~2oExO*tHV<`boq~7!k6w2ZCM2SY*OkQz=iS{G zfNQ>~YNPic&5R)c@P@FMF|!kcOAOe7xidgXH{MYaGgUb0s9u%A~|&}3pxD7G}pH1v-CWi^!YIOKM^zg7z_!nspXY2;M&oq`ysMuYjnFZ_3vq9rwYDTuo8yOn zpS^37_W@Cf>uAhQ28TB`zEL2)N2uE5JPzMAb~AolM=#^xBkasp=i$)K=de$6Ccar9 z-1tgrY~4jHun=HdN&Xt;r3e81@|Z&gj0OJt(38Vjt@tX1`oQPR`T^Z5jI`ivfb!55h_PFaA{X5vxZ=RBsPWyD1VGk#rN2#@b? z%Y>pfuUjuQM)RdNn#5j-i-ZXxv3F(65$oUf^9<<~evqFsk7@nYXKDqk&jXNHDL^ZaZf-@eRE; zbbe}7JD4B^5p#MO2j}te0kAy*)~fer!3Rj=7ex3zRtu9h*xLB24a?aAi9X4(%8lkg zGZBPGW-W?uPV8o5{xn=@GmO?6pobK~c za?Q~PU?6xmQ&L$cvlgSLZlLrjTG|ZbE@wiOTly)K4qmTU#m*;OlFm}^SSOo4B&+#S z#45AGZkHIUB${0Kd`=Vv#YJYHW-Xn$EN53|>Rc=>vFQ7I#?cpC{DB@Kl#3w}){4t! zl_{(!);U8z#Cny%rP%chYR%&T`XLsHR!?gO7d-{R*nZm*16rI1`Ba!Ld?1Pb6Uiu& zo6jz0bvegB*YwtZU(*0C{@dp-fi}JA?F^rjZGH#oGQ5Nf&_pcyRpWrwo=y|Y>9%Fx zANOa4UYO z;f6*&;(qN^#-`|#c7AF#7wZfn-EP{T>K&7mg=;&YMu7?PMa3j5{}BwD+5Lm?ab>i2pzh1}D1$g-vy!u?>a}lNE}G0^)}Nj+Z@gY1qFnAXg&DcL zG|x}ximP<;m0EqE@324?fk=eck5Z1}iOi&v?&J;cOYsU;`BZ@@0OB*`R}YLDLPZij zgv!poJ&xENB2JT{viac{>3+Mvu@<$;x@KFmG3wn?O(j$VW32E?PAhQC43~h#2zTNpox{D%Ge*eWjMjZ( zy^n~f2$Oz($PC91QMWtj!(_?xA?I@$74Y@C!V{RULV=i-Y1nDNQtgFvLI!hQ3TxFA zEApCU=F*tYU6I(yr!Jkel74+!*udkkeBGQv@0hA*iS6>(s;JN|?rFR5 zHX8Vv=7whNaYs}z=Xv7=RdRJ4wW6R~Z#{i_2Hdng2vNrH+AIYR#6okp?HqhFQM#^s zWFjm^%cw-%7_@P)R(V_EBF2bL(1<9VKJc>vTtZvRr86o}CKdaPI%}OTD2~PpO%`vW zYs_iLq`=tM%5dL6-kMMR>9fEf%f$kQq3tY}W+h`OLpdW}kBgqM?2DF8d^h ztQ|e(er+_E3rm}RhO^R2e5?C@xij$gf)o+p06a&W1_yWaI#UCBY?_ETQdo1@K+_7p z-AVzHf98L$+*e=fxL2`zn6Xn|{q1>Ut4Q4DX!5Iz!mOZwuW6B_twlN*M-c^cq6{)L z=Uf@$z_{LRM7_&=KQU^esaW@(SSi!^KJ6UYI~LMED)@bOZ+WZpIm>m$^q^Wv3N%$r zLo0v=4;T-xCxJa6*_(I&3d&&=g2%GFwKsg=UTxj*yu>)?Gfj%o(FG7e6S077a0c}2 znf<$$e8X}2m9Km+rA@cn^)7CJPEO(kTLZ{x^ay)n#8In3JoGkjLqeMHGcuzcccOMj80x`5W@A<(8~GLct5m$uH(HP2ASYKj(pQrXgtu4|8aB$eY#N$^#LH#e1Xd z?D);i1nbU;+dULv7$}IfvKG5Loh~0_Stue0@*;3?A>wz;)w|=TREMbVcF|P386$dP zA_C-GrIIMW0`8X?^IvM0&HmryhCX|_?Ix4ux%_j$h2<6me8`dZyd5B-*SnhpwcMlf!MWRu2H z4g+wgDAQyY=o#EgPNVDc@kU}Vy*dMM0z@2D5Pa=ocDFewQJdq{(g;bDR?mx?B<_hX zJ66j)S&SRDg){EiZT67X{>|KWYaPtT0={qFWazp)nZC~qLH7kkdwzl#+f{6EFjiWv zwHaPrBEt#A7VDfRop*{SgS4fG#LJBi@cf^_Qr?4UW%H`{_Z1p(BGHulHTBzk7fadM z9R+cNE}H~Bv8c-hT&cJHKskahf!0I_e94*sB_hRs^1ZvKt+ z%lqIFt~GYI1B>M@PR#Lgp`3=aCC;J)R@>OISC@V$ph}ZdqRASMCKR$-%*FNS$M_Q; zVKkgDSPIpl*$1USEGXYI++*}-6V)>5zWbg08~C3wPT#91%>bQ?lRD-50eWXGhUg#Y zX5SE!Xpsa_;~h1W~F8cVDgerf0`IZ~f-v+}mD?#ds`HJ8zzyN+^xEvLDW> z9?xWQ7-b#ebdVkly`P5U|3B0IC*^;-U!LMGjzRljtqLL_tMh_6S5rByh7;55O<0_V z5rn%S-`_!j0tQ4>%-jdY{3`3e@O_1?yf{UhfSj^lz{7ObD4qcfc)r~1GoqrJlaWuH zt#{bXkG70bKm4I+w^WEB>gZF<0SyV2cz$7QcVi8i`{o*+=P)aMq^5itKFH)T2{)hG zhD@xkd2~0h?EQ@Fugj(>hx=a4rGYN6_3)>B=?00AuhB@Dq@`oG znG%oT{$>7eZx4uVpuPj2rChaie|&GEmJkWUk>_+=E~WBY!?H$&PTCljG`DUAvG;UM zy3UGucQsJ+E3}*TM(jL*1JqptpEBmMa<9){JeJvEbwT>!_Z3R*tcY>lJv(cV*qPns z@Uya3A0-Kj-&x!aFyPNkqBdxDDpU*%p;K8YS_?&|QqmKXD`fC}QF@Im*_&4VPU^*80=DiJw6_i3G&Q|NX#$Jf)ZC{KnJ-Dit zpA;6>bDUnM$EEOJ`wU?U1UxIJXa6=-^SnoA5O!oSwHQRVhA4+WL%f%L?v^J3VM8xy z{*>om{{K|q9+Hv!lLfof&%^oG%-U+2oj=$L+Vt0$4k=`Lu~J_JcC_ zZwT3(@31;!h4`l|BX!I89F}=l^*K(5LD^|FYiWs2eQg@vqUPy5U!Q-H4}xJaS}eSy zHyC|}ry?lK;J)CpdT-RpznJljjrsW0<=6e>1B!EL*odWdH`AONV66dBzQ>W%CGrU0jqgL7(I{2!z*Db`BMF=xRQs{ zc~6kpp+mHJ`AjyG&aMwHUtwZHVMAiy-6?YFT*=MOj?i4=H^7_bK^NloPWSKxd-H<0 z+DNn}C%lBFdPg2qhDQyL!U~eYbq^HQ3I^zeg<)JwNDP1SUix(Iws}Bc1wDPt!C09p z?)Bn{PQnF9mQ87v6;)~%zdxAx2;mZea$6jtuY^>E_x1I8-X4;|1khL-nXsfnArpZ; zJ<35;1LDYYg;48-`@orE@*WVH@PP}-C{gyuih(M((@t2~UT=vHQ1Y^}NC0#C^9vTv zu87^fmdi0W#{_%Q*?;5k_+WD(cm?F?KAx1uH~TjBBc^O~ENSftXjQVMf0ahEBojBT z=c_}bqYTc=p*c7b%OYPSB?lU;7IrsCzG?h>zW_ZL0c%Ah~Z{8fX};{u>@eLR%@Sa%@PSVPD<+Qh~17rhgI1u zU&VaM+@Z6M7$8!q&_WFwlT(;LYpI6neS{+h+Rg6metM2pJm3HZeB~vG<(Zf;te6|5 zG)Ury1x=}@LR5Qw!}<{%#Mu>-Q;vlI@OmBWw!J}koF^sfI$85GrsbUXDOV0PGRhJ9 zHN)3Efl}f<_1`7J#)dns!D+el=7Jbcdw!#UB*N=;5_~+RY-rp}mWT(=Z>o2x)Ma@h z1u)_htd{~tVeTbsL7dj$tN?F`4rg_~+Ok$UW1jcTkJY_ceI?czzXv23{@bXmLuepW zq+g@Wax>vVwP^LkMKxR|><^iI-}gerH_63xFQD^%w!BnvM+F>&_pkJPE{T zc8I{MCg21j9qz}E>>5LJ6!OxezxkkmF=}T9=z=B*6e)` zr?}C8*+Pw*o89j0lPchWb^?eyK|Bt#Uc4q%oQj3q8p&ec#~=l~*Z{dZ`D_7w6eoZG zkx3X$(g36BJAT0zBn)TCB%K?L5e-0_yjJ#LlvPRPgz2_znyNGVOFSzyR{~Cl+?vxP zp{EWCBXocSv}_^BXLUte})KI7`FC~760!xoe}U|4LXRlO~i^MrB?c*fID(F$$WLxsi7bME~*!VV1k?Mr&0WsL*+5kiFOb=wa3^1GB%Yp?#=%%3N zznCsejlixlHQR4CoYpgjUd`WJ3y~9_sauEzz~zDVBA&=qBi0jbGyJ0f9-;Q>xZ_mH7*`Q~s^EelB@TMLt%#8LP5J%d zh{FUsq-?vsB9<#rZU}p;V1Es9R*?RlQELZD35n2P2`Xy+kw1TSdC|HNtS|8; zCqG$JU~KvRlwu04Y>h?fa{`e}qK#J(6=Ae?(>p2$I`6aN3i_0tDc)a*3puGG4; zhA@%SQwy=;B0?kKl`c4fLf;}qKBa;f+jpn(I^BVdfUy!X_&Zz;4Jrjm8Ai6bpBQJS z5oaE1g6=~Me-{oPs70XnT>z(i{Lu>{G(u)>DuB|SD5s|w-#m+a`*{KX*U2fCvRn{UHmr}|BT6vH> zWp!X;+jX>#Z>^%$hrmM$=gp8uw9Zm$7)FM##=CjoBt-H5@LoY5B%9ZIn~ES*j@Sim zSKR?DA0HXLct|kYZ}CntbYeS6gh3}}sFWm-7tnh4-HeFKH8FX7wrlRWSn>%}6I*HW zkWBnn%J?DCM!k4`r;Ai;+kVLR{(3~YBh-MEkP9EXKh=<7_|JcX|gF?VFXtO1kPQf3gd5g0) zV7<252ZKZ~g87jB!Gxhmix=J--$Ad#AUm!OBG|$zEEWyM(w|fkhUv#9XD0Lr4?Y0a zM(0akj79Q#;ly+ak0Rl1X-P$dhSm(3t`0>}5dtshar^w3fMn}zeAdsIyQ|0Thf6de zdw(MQ+o+rrKQWGLK|AOgFK7*u2ECcQ1!h!Q1Oa<%kg>2@v=Ho9LMh1aRVehsBmFX~ z7=z)&FS1=&)!0E4nY4)U4PfzY*M32q5WVz)oc#1R?~G~52S=(i}JtCNi(9n?;lB}JUnC`C{CA2K91{`*x1;V;{rF<5)L@(X?HNB{#U`VL>`YZ z;yxDmA4ZqmY6fe+=HdRnP^Cpa4ljMg?(+`lJE$r^v9q_&IwsPI9f=|Rtf@lE_@wFa zxp@H27W^^5n>NmuxlH^5>A>F`TI03ummelq>F@8%utlKTp# zP5wri!c3WO&&XUj9lNV+9%91Zs{RjSZ{b(vx9*Ehx z?ovRyyHUE8Nq2X5-Qn8zoc-HpopnF=FPQH;-!Y!?jOSY)UoSHnn4J>;pkGqoa6CJL zo!#ZZ%v|JdzSs^oj$|n3+(-C7=0Hks``&q8zU05x-tJmgKg;#C_VJm1dQaL3xxU^H zPseqMl%!~ZZIE9$eekm2y+nV?ugIsEmxVCl-{j?7e<&Brb2$*{(vxutZ%0rTvA%Zw z`a;p{gOBs8!47P|$}IL5q+X%Q+u7N znXbYCAkmi^Fn=dG|7-Bd@wFmfX4<;$`uaK)i(EWeMBK2WWEBSSdlV^OrPfRn2~V;2 z{`At`q}`uV&m+J}xh(>&+*UzgUSM1KiQqf*(hi1LgVLs$Uc^Ltg_x-UV;Su;cM6S1 z?<`u{dO^JAeJ};xJ&GL{!0`p&EO%HR$%j-8+ao0hKWE9>$?|OIEJLx1(!~PQf_joRTrAqDRDFd_>n% zixTM$wG?~f#Yb@SEqqB|K#jiEo6lY;v+Pw^!;l^z`dvW_{O@K+q_PF0yuRz5c z2XsEq`|F+E4 zsLiXNNN*wim?8gN{4ji|bj}s=l^&x>5|O3`Ojv?Vp$YCMe|p**Zb^UW=~!+DO3R3}06(mJ6Pd1*2?{MHibf_Z@EO4_vfgaD>vhp1of?;?KkJHmth~t(%7N}P|A2+f z5jXtxi_#GD{rqUsNw7J<@8(&_lhxkzv|~udts^!)7YKe37mx#!d3fih zd13=`rO6VFV8rXpg}BpPyF2jh%PAUH^Xo+yA^N>2z0Q=8P|H*da4v zJFyE0H^TiA#Q9yUN<;M1d$PaOX}7o2L+)7AnD4W{N%e1&r!9%p#jSG(O(D4;-E9QC z*K8o|I3j2XSXR&5?;>_VSP^-tcRls97|!ZDE;DxW=ZCN8?`r=is=w}h2ACBc91 z|AGi46b9D7Mw-WEOBeu;YP#4?qpnEN!ZnY};zs?g$+D2 zl>wY4ErkD~d>7ivF9k(j!)Pyr&SJ!W4F~-Ft|Djx0Vl=?kK!LFxsk1g zg5L8kV(ITKq_A1X#Q=~Pt>#!U6KVVP(`;-&G#1|YrnG>gvH|xvq$@T4kD6D$(xn1O zGEN&#{PM*wD}a$R8_@!JaCE?PUJQT;<jN z_cRPmy)mTt)hH>Yp(m#^0oYf7_AdZjSZ2-$vIONN(5zz7N<=f8jbm0Pp434tVRsB^ zK+$=W1Z6U|hCApzmUiX8gpI6-K55LuHx?Eaul?qAS~S(jRyf}Lt@&U7SqK4lHlG8c zxAOiWji!WQD}ozR_=fn`r>avjS5RcStl&Mx{!y0oDl0ZY>Ya~|k7AZ^-0G`z0ng4+ zyUt7@&l7)v%U`Am@LYr&x*rV?biy}a`ID$5VLo-*^z%U2{LrX)I!ck@*X@Hlh8 zZZ>b4*5#)H0AMiS2dX#lwxaZ?_TjPR9RChqztvQQoCabcXIE_Y$I&I{23c#MQxG6k zi4W-sWeeH91Q0kXoF&1>f3B9`3MqCgg$({-c}0EL`0@}{BchLUj@`|dCdi86* zkE%+?x06=9%vjnuxGlCDyUtcnTNIRqCVn@NG1#0#PdN8Z$ns-*IR;sl&Ch z{uC^H*L8}Jij{yb`&fw#Zw>V#DTG&vSHTYY5K+bMlE!(VHGAt!0@B48Xz<_&1t_N9 zjb6J)pdW|ZW(m5drlfqge$BVkW)r&by+9dS2LDZ*h!@|c$ZtL*5R?>QFLc;tvYwBF zi8dftsbW@>hm>GGsMFeUvGIuy{9pFl_{*uaA27*Yd#@el31DUEwK`l)hjSKBS?e@< zbQdj0ixp2vzRB2fRUP}7Bv;gjC`NU9A=(rDhL>{Cs*i4bMa2;%s0wC;?O&`b*cEly zSL~5M5-w=cM~ zD@(z1hY)N=LLIy~tpA=1cNXJ9J4}J61fwzmV45HpuVS}?4}ABCq^OdaLw=(Yc^We` zl+J0EySj?~$&tBgxm$1lmRYu;h?!7L9Dl511I-)Y?0`Y{O0VT>+;F0)m_e(7LFIH_ z?ufLsegKRkjjWI1`bnUYPSP5X0PaIe1t^}EN6CIyF!U3GVhV4R`IEO4cDaDXv^ApF zVPe6?&dp6N^xz(wp#poFV?o@gS8ipoU+O6$rVdo-kAMj_%Gk-pME(=YJWqq0IRJ z4YFnXP|5=p`jvdl(@Eb+Uv>2&Ilv3UV0fg7qc$`xVuSnR`RC!Yi3q*3a8Y_}HVHg@ zCfIX%Yf^epzJ_V zRtVjDAZMj%7ft9~V3RosV7Nxb$6;3@ESrikpbBOrJ$)||aYu@hd(9);p|@0NvX#UvM^ELh)MM<_>;Z}Z5Ibc>kW4Vn?^wMNsbe@*Y!o$5RXauCQ! zn{0m9Jupe|l+IKfe7eUdbePIqqs$Qqkf^Irw-JYm0199U>-eCl`b>kbbwOItM(xIh zyzkp++GhiPT}8z61Jzn6|NquNd3c2sY9nO9k4x?q)l@=2dAcF9-!mm`al*WTsfkZi z@Frc){GLc9a*zl)X3Q$l9Km2&Bz?DRWKj;x=h%%{>-K-ml^`u1K z(kqcN)tuqMZ!_y>cfDfOfmyz5*@kXfMK!>_C1xkH2Vt%nej*=DU~~qXMf-D$ z{ReDx)M4caWdC`*e6K)^qEkpym0xT0-s%K&^!DFH3*Eg8_Lme63SD{Tvws@7TlPv( z^s;W5*DgyvVbBt{Ycj>etSAPJ9BRx@6!N5otu;);VcSS}ZGQ-I!N9zu7}}Cc{^>Ua z@Np&OW1vV3V3QkALW@#;dJF`_8f*To3zsA4(Lw#}3qgC>&FepZwm{6sY=Z-i2cp^C z6&cQ-e1L-yK;YqP3!FFsV{Gg(22UhCmF^`!|@3ejjas4g#r zz0Rjk;+}o^4Fd{CgX7&IK*AI=1-(JgNnc;}>lycC42IJVmzxCS%+**9Lzim>G!X4DQD<5#7ZMAI+}&Nw&J(P}itB;0TF87-itR%yEtfDm z${=IG+sI(vB$}$qpq}bWCiF*^_3uKFkClySJ{!)an-3pUexn3UEW3nkj2aKbRTKU% zQ8C1)fNuEaKX)H3Axuzk&hb5BPROrPz`gUw*mD%CP_95yIBP#yafB z0O5l4VY=g^b6f` za)tpSqSm_^8dsK#n^+3vBMBa;JwtImURRLsLM?(qQ?l&*D7FV2~>ny(CA;R@L=E17TK4yV;iNoEKD7HpF<*e}!8BgW*$0q;73(Z&ISyx6)2fj2TT zst9hr0&997_i8wO9}tbWoVtN+r9!4)tKkDJ#lFf=tNYgDz$B&8-J^tb-iZEut=Uu2 zaxFn_xhQ_r>-iPy*_Mlr&hD)d=`2)%Y96Px$H3kpeCFMG&*kk$iJPo|D(x3^iqeOR zp2$)J#6Stxp&n@A%Arv{Lr4lD7@c~HxIer{w9~6JRaM%~j~{9gLQ*W#syE&!8ZHj3 zM=XU+lee0(iF#)ci0JoLg^Yi@1e@=)9Injnc2K_YG?kOmzU7Y-Yz`Ma0`zo7vu6)^ zu`ghU=^0cs?vxIV0JY%nqdSDEpk z&zC)0cbe%6DJE|~HR|XgdyZFmMTt=L4ViT?bK;mvDL~|XKy-YUJcXYxk>&}NGlxMQ zS9SmQ40}?U93z!O<+`pmr1lJ*RsCQ`>i#vM+72dtJH4Nx% z74*3L%WopY5UZ@0>&A4$uT@B{KE7^gVeIqNcPGRR-`;+=)~mR^adDMJL2lELJIF+igk%toQUe;>qc zPtRr;4L#fb(Fep)+2d(-N3((2-1z~9bhzjUq?7OdFdADAaVK`dg!?|=y^QD~;XUkH zzu7)fRsQpI+^wim)_rq1cZ5#L_tVJG5g*m+TJ2|QZ!q^FC_UeJBr>~a0MkD22V#gn zqVWMD#-i}2eJ+JSYcyX7rkUEhWNALM>U*c)hyl=5$JwGo_&FpbU9i?3v!1DYFft>C}ue%$R)RM z@>)+5U`&WlT5W~LqyJd&5)G<%2 ztW;gIl@lC8D+yk0>k=Bsc5@U-{b8wgwJ^=aYfJvCLlKYTu$N0Pek&=}Nzk&Th$$V5 z>~w{~|GJdqb6eGy>(pv#SDGH=<5}^PXg8bu+LbSss4K->Y~pe9?3*3#w1NWN6Hdfn zZ_(ar|0b%;Q2QnW@ueLlz$|!Y21q*1POQ19VRO`$Q!xF`6ofC0*KO?7cX~;hAML~e)HTN_8cc|xO2?OM&6A9j$m8JwHP{n3GHuG|R z)KyGr%#vY*QYe4LZtrA{pM=-u1WhwOHUVvgwA#5%->>{hJl?f}*QLdD+eR-Fp@rqc zC2t!+5ba>;rlOZ-(RqX-4BJeV_tt28%+a`~=#}2XRM}G0liU(&pk3^vg-GHC3=i(J z4F+bv9gYdksyge1*EYB5Vu7Jg_k%}+Pbd*FZLk_LK80@$@i+Kz+z-n)n0g=i+sux9 z@}!>xUCTy)s6JQGgAskF^?aQ#3hhmV^NJhXA1~MI2v)T8DDT_EAjhl7&<-AK`Zg*I7dA#~;-(cAN zlsb$LIBylwer-Nc!d{Uu>j}wxrn{I)Xb8Zxd98Q(sOQ?v!a0cQU4P#&yYV|*^yQC+ zCd$*bL@6nAuKVfSo+Ex@fxfplNi>6xOE!nEN6nliRI=R!$Ff(xHm{ z()u4w{UVc$0O5O~ehEV8DDvbNwWXDexy5KrO-1$a0Czaw78)+wL9}wze!LxvqY_7| zAU1|U{+N*)e2lcT{H||!_~PnnuGY%Tha8vB`4)Fw*y~y}LLkEmTB21Iv&AU zc;1)z{Wp4+trE;Vk-6q;0N1ybuX@?$(1`_y*0lz$4JAL52{2e*0R5*F-I!@v z5reoUb@fw64sE&iCoc0z?Ytj}vZdVallzN#M>*YeO3ARuy7lU~RzAm_TMM4&ceitg zW7y^sQ~It`mQiT;aE&M<_tWpp-uwwZ5Wo_J@T18M_o3=FuUxi40K2RT?@+SkdydZ2{^5-RJ}*@92QnOWGx5Os%XF!QPF}FwB&xu_<7V<-yj` zkN>6-8kH$G}QXs?r!gc5?Nl$TQMnEiRqWnaJ5^enY@E+MI}?j z*On*kyZ-HWe<213t$!y&zXU{zJ}hAhC73SaHU@!--o&C%`>V=oc0M{&Pb%{WOwumRU^7IGHwflqN52HOr29H6#nQ!UjRQnrC~$L8FSKYg zseyaZA>4X*#yJ0FiJBJ|AL_^O$L07qmd9p^fNK``xGdCu_>B2NAg#sH+-b~E(d!uA zbW$)#Od^C}hZuW&G>2Mx$!1dO&+dm>+c^Lh0$H>r$E2T&hv%dkvehvb9f4Ozrn53y zw@O%3f|!*X5pRPI{qouxH8K?)Dcj9_rFYUtWiVu%Ld&& z(UPTyK;7W=U{hb-_9#UYHg+QNn4F$rVk+>Q)=aKZNWHHgrn z5w~`(Pu^6s?n3R51CMre&p_++Y3=?2E_>p*f>TAuA5c&vpg+S^ztg@>56~9zy1r70 zhk2alqxtx;+8`=_uH*Ma})K%~&rQ@ZymOpJx_ zHO5#J81lZ8g1qnxVI;2+JGU+khzF*&uNG=QN&Eue^aSI)m&lP$(Vu-TpVOW35?x5p={=0mNaiUCt) zzNxo@qo}ULLz}nJ0%FBb;n9!$YHSLleKGu=4oi>SKopINvQYEM*?dC1E*ITkYO(tc zD=SEWa`|XO^D=?yHR^&t%Q+M6p|*WrqIxke5R%!L9Oq|q0|<2qX~*#SIA|IwxUB~7*3*ss7fiW4}qV~Jz|3aQ#D=94h=gU~Uz9w8a!f!O1_^9(5IW-=qgV_b^6}v@H z3@#h7$Xxh=6M^;^u^{}xu)x)jOPz*H+2oCF+9mM&1I);G-2CY$C;d`+@3R&ktTlK~ zmiO7PRDDGXu@IYVscznZzGz8E2mblku0XDqFJ$~G+9tRTSV*{n%s_tUkm{ZJYM zl(pR2qddzHzD(DCP>k-GUWps6<}B5ORoD;3%CzJPNvYlxMMr|?0f!{sn}_oD zr`TSRVb~quYy~Ber!6Ob-DqkW&sq}xvk<%9c5$UE)#6hee61n4ReqyKBEV^&QZTdB zZX#~tF$%(E4SVgl+2yaSq9+}&r< zWDB~^@P(Q7Cxf^ji13VIQ?_gTzKACy}1SAybn6Bh}9uUB_7wYD@{UqMUUl)%F zDGFQ^bAIOc!>V_r8_48PwQC(FQ{}}dNv48qwW?j-DIH5KgBc&8L|qBSLTZK$f(W3@ zmNG#IluPm;di!o=^n${kUGk-;h$n|)7QD}qY2fU1R&)XdyfT$E;&nCGE=k_tLk%1@ z-eL~ZpDLs-8F0!tWU4G8;(%ML7@|UvNvK+sge)T;9rZW2a3$^ke8wMhbP-=784HSG zCJxoqFxO_6zi*G#{sRQ?!lMJ1aGr$S#eq-dKk3}VZWBxA!aYU>uE;C#tVk6iyNQzA zbn`B5_p8etKc$ROj#}GYJxV+8{uvz_3Q@V{BGV5ZsF?ev&_VuapA}5PV+pleRV7A5Dj^~^?Wj9}`nT!_sixH1``&p;{`wGNAg<3~}SOO-dZ?l>p9c96#3!9{Z z=EQp!)bc24u$ua~rq;D}jVU zayIiYFKdZb(aRbXeg9@XOAUgW?sgK4=Or*G$}g`^o^b_+pbuWb?Wl~yUW1&DbHt7eP&3HCX^#8WdM&uE zCZD$B6x{KP5fI+&UvSPHj9opa_Bk#r%Mf(ui9Cbb@2Q=$ti2p{_jwk=#WaN^mnQt- z*#+Qocb--#QnGm-3Pz9EUwUzU6IFkFL_-iGC&QS=z#i3{*3`FpmbJL=NhC7mA~8Joa!S`WPCg=mFuZoZ z1RdGYjyfxlUU3CZ9xf9+r+wC+#RKyNGb*wjAa`(FSOUnJBuzVjz`jiiA*-`pa$diF zi!8C4>5b&FZ%ReN)~musA>euth|64M_`9yJ(0sn$04^y5NLP#;I&!*uLDF=9F>KH( zonmNknOPGlGSJt$IrlY%DrT(a^MDbr2O>PSkikH&a(CLOCoPzF5vuZ_UQIZnO%ko{Iu~}^J&gwU!=)b5DVxgA)liH)0 zK2deyN$z?pck^|4(?EY_Tfoh&_(~*`!zwe>yyb2gB~g6j=C}SBAsp;eK#|$-$@7|? z?p}oeq`pt#R4+y2zQ&bh2zZ|C{N|GL&(toxq*MIOtzDi{?VW?`0)sp}*I<$)we>J6 zvd<(r{m!cxb!Nw6lvS_g)6=6dnHdC*&u#OL8JD{!Ff?YxQljb<85sJHj}wp!dHmFOUq3>~x_Jb`Fl)KT zg6vyN!Xi$n%;-?!>QJ&>3ZZz>1nSzdQ;}0XOt-Wl0dQ;0#On!>zBahr=bUcVc&ORZ zQcBIB)uddK?OyFtY>z76%<(>DhLfcn$A|b2vcF{<=Zh}a%!7A=>3zl+&F?C_EAC_( zqh$+OH&kqYdX$d)f$#Z#AGWR2#DIFJ2qKWCTZL3n>0JAgg(cEkwZHZpZHW!8FzF(o z{WjyMy0A&M-u20lIrk-@nc3E4k^0i_Vm*yIjGi$=$CosEIPk4mz7*G;yAYtbQbTLH z{#i`_93o0#Fpiy|jgys(t}OGR!9F~jCnz*yP(;!Yt+e(pLl`1`0SqQ6kRTrt3LSppV!XKW`DF*>cf zYCap@5Q9vYO_=YE9}(v!w0vrPJg_EH2$9$Bmh9c?mtN8@842E-avz5h_{`ZN&jKbq z@V1j?)-wg&cUOPCV|%C+^Go+aQpaI?^G`5`QC$To`cbTWh}g(}a;0C;{y^!P$edMaN zI@Kxj`R8if+cip?tftD)fVm{b!e11nR@MqAbGH1ybB^wtKe`m__bO^P@}D1{R3Jn? zT8>vmLznT~52@>@_ba;zLf{8b-BSlSaE}gp5aqG``*LWVqog%L4}^5w>7g_5mwzvxmU^eX{)St zkH^~MJXzO$ChBLTAI@Q>IzbITytVCO8=5Pt^46=Mpt5G?Ei%mKIv)bTz2TS-ffgQO zZM)D^Py11K)-j)5$am*-_sbV>i{apO%rx6174kuq;@e>aBrW@UwVypKb1TbVlFa7X ztd7EeKPOE5njNU~1^%(q{;Y06tTP92YapQG_{kErdn-S8wBSpH=Y|77<4Rdxdt2 zPoaeyz>)MH;eG$pa!u+^TUX#Zk*)vqe63gh^t2>roJcLV?(JFqj7Utoi{tW_75=<> zZDS=Xxzafwr$-}n+)9UhlXdac>u}Wo30^fE=Vq+sdckDH;sy7|Pu9+*7QK&os;0wN z&*VX?xgikAjR0$!cJ_cJK-ju_IPW+u!FGSy`_bOqnXMj@wy?9+oV_u3L?+;ot6t1w zSu0h{9-eCm$iEw-DuN#I`QuPR5ko}W%Hs=2iPulCVM_4j+8=nrJwE|>I4pqDd}CHo z`0!-}f30k>#*WA3w(rraxGBxXhyvX^%;>bX1T#}Z2#FUGwN#F@YQfVFeEEVKq|9t9 za-VyPR>WaVe8T2MuE8LqlEO%zw#eC<$K&U%f zkP4}ocXn?)!KI~&U@YwPlfG8Nm2njv446#L>=>g>oyDK)vCqmHuli+7SH7)wWnYLk zu&Wj@1)hcD?iqZ)G*XE;%)_MqSk%(i8YrOvZ|>nMk$ZR>0k`esLheg)zL!a?*ANp` z70%fjngOqv>L@`pG3089RpOu+(x5SL3ym2-VG%)(G^$xNcvdw1+;z zqc+=aX0toa>{aqj4rcHKN0qwv@8uPd2E7=^Yzf+uli;RTQoUk?*x53`bC<__9(J(n z2{1u5%U~aB1A$y-Tc0 z10lb8uwo|t^5wM)CxNC=j<)=D^;WGp(9m{$|6*0S&U&r(3u0FMPx8V5J`{572NQ6z zZt+_!mzGCZOyNz;!+~pU;m$%m`7}im^FuQzbMVpl6Rnni%2dl&y!3r7qCre1OkfBK z@dKd$e~Um(=ez;aZEL_b85;HS_=82p<#qaPhgKD%A^_X+rKA#4rU0`Bnk|y9vzCT;d`|+S@nVS-HV~w6qFg$Qohr({SHKqq^ z@mz(Ny8-c5Q??~2D8v2LUGcVcb68}rtN8govM@FCobERs2)Kx=RxZZJpM$SluG`KY za#WJ8GYG~$Q?`penN=)*I_tNI%D?tc*&Tw` z7H`G?N$*|3<+}{ZXL^YCoA~_hD`kKz2$zJ|B2@uI?yEuEvK>M!;t_u@Oe^}54mh7& zTwL_@GH0wqmTc`Cl~PZ%bRzygu1#HC#G+T3ffqeZ`rb1({j2St$wau9SUZYMb(OcY zsuj8y9}vrz8f=#Qje&WgMtBcC%hF)qfUzBnZda-UPQK{%0rX(jd)mMC+q!yZzGoK9 zk@xiYsuN={H|AqJe6m@!RPWCnIcGumBiC84ayQ@QHXqL(pZl@XSlCy2e9+ag5wJZ|d_~c`U{O1(n1PCeU_4BG zQJ|1gX?#~ERHGuwYI@(*f&`j!Uj z8?XrF!z6#LqFd^-x1dohA+8vbHB;xP7@1hQvb?icT>f#}$z^YGu2|}!=_1X-NzZwg z`|yTj?$rCt%>k9(UTe0O>nC_Vi_v?G^>jO_Mz!RTo+{5&g| zH~1?Pi&*e;k;J^M9{w@u8L6$B^lAYLUoPMvXx;U5huF9@pJj=OqGa67We2+Dbe)2X zVn)@KN0qI&uTeZf@5T-+gzSX=`P%kl3!&Ogh!sZ~mc%Xn_SX$BK9@!emU$ zgs8A6_{G*I2>Nv|glJh!JjM9QUjj&w``;B+aD@&V_R6`=w>e+kH=1*%^H{5V9bt$} zc~PkZaXUL~4XZXQUuwg6oorM&vvJf0gB=%_!;bQ{|CGhwDq;ht5G~eh)NZMfWYm@D zS;!q~1EwLrshAsJyoAP7P5znSbmXl1RLS%O&DZ2JA)m1dCY&=I*bRQFR7OP79JMULwH{%Q^1|`mRjeMt?Z{7>wSomrc+H z@~p3-J8Q>+ZTS;Wzo{XGe$YVRfZ9c=A^9tD=$IAEWq3WlEtW~NIj+Jy+x~6Fkg|_q z`DmpaxnR1CSoql41qL+MlV)2T#SS!B=0CX-k#sd;&C~joNcg+_g?!u9Re{KQjC61e% z7|UcX*ejn5yTM~OcR;yacQ}n^sx;Gx_8vs0ls!m)G#u7Vsz4;|deR`&EO6`#%PKufsT!kuY4iaO7C$`q@^nLUz7aq2x23bs;|(vkVX0u>;UjW+-bB<|cK$i}{fgk# zuT8BN9lr)2cV=7l<4ljb67d}Q0hlS-S>tix5miNytgz+xNX^XWWURrB$D5_FAp^ckZvr-?q8gCqE-&gA+IMEp=4@Mm zd+6O6#IrJ}BacI`$rV2SBF_o(yzSAaZpFAkDt@N&7jv zDRzTE_V9q7F5I_zR+lYcb4|dNPdCb8FP)79AH@2L7MG^Pu(SR{UCC0R!>nUn58OIz zrrY9LgAN>)r^Ev-0Yx{MGw;i&_n!Tyn2jS}q z;|zWbRTYk}adw^_lSEt}Uy`{k;{We{bQ6N|wde5?Nxw&`VBFn#`(83;26eb& zv1^(YT}OLCf}G4JGwq!;E*f8Y{h?4%8GBTg;0r|3UwX^mfUD#*1bC8tc&?(mSIg)m zM79e|s?>G4e!MBA2umm4rru-Nt5Q}<107Z%1EEChX8~WW_P1!r6_&bP#Guvd*7#@@ z+L2tCf_1VOc&7xvNx-(h;A*gzZ)dVm0SCkX`(mzBp13|3;zWAi!Tu#V{+k9GV8q2Q zEd-u{_?XCCN(#Sl(`;8>J7K@e^COX<7u{vAT}LzF?A=(8^#jI>P`%RV|EbFWC+Bxq zol3a;XC{p(0$Jbv&HzLm06p&g_9Ge1-W$G%tMBp^1LaFiH)Pmkig>fB>$Dj*;+maoM0 zQj~-LV*!m7kB5O_S^^6jqSlz7*J})&jTyC{09k<43>n8R~c3M(4i0B#(Fs zAUCKMVAY9w&u-CWO?vs~oK)=m-uwPzRGsaeSn<^~T@W*-S*T)r0R1(bLJD^|y|3Fr-0x9DUz(@sB#jRiiP^4utIj0J0|2=^u;0kt#}JZ zjC^fI3*P#&&L;~6Cql9AD=P75z8B+lW`)PbBTKM+U)l;J9h<+L0aiKM~zsW*= z_3}PLh4p^GN6lpy_768rj`#m-x~ZM{9|nNeWZfla7V%^VErv$MRx z=g4LidAx59)qZ+O12;fLNr1AFt5ISY78P}_^aBo`Wu&^wrN2bA-r{p691S%AbH$Xq ztwzko9l6hhc@%J_H+#GpT>JUc3iwNSToO%}d51!6M20k&jp9=?OYzY`Y%L0!07(zj z8USB3sG0a9}| z#=gh2scD+X(8++I3`;=n4e zJU8p^9>pLL)-L6dB%m(wkAJv}LALB(@2^HJ)5O7lP86Gw1cx}*!cDpNru0Nj^QGPM z?)oKkOX#_`ITjE4@)mhEJ~!}g79)(HVAYFI{=tm~`;FRtJhxpk`n}uF*M#s~Y#;Us zSbufqkW?JA%B+u!)fI_N{A&1zU6mUr2zJ9p@4%LRseG8(q-mh_KJ@ z)}*HF2fQSnJs3OkX2=FV%ScLB@vkv8%khQHk?EszitQU!C+x>jF#MNLO;N1%TSdsI zjil%R?O%-*QxF$|qs&`8nEyb=+ChQW1NKmkZ3jHr3JaU~)$x9c6GE-Kz;OTb@CZCi zMX;EHObbm|h{bPkiKx-3H2`sUm|K?_osj!=e*B5n{7nG-Zj}A7hNf&VV!p1BBs|PF?-+R7fRBW_*dNDJ}o}b<@Px4m*Y?< zOWmFc7FzAa2$`DG;TW!?=57Urb5fuUDTGQF{Rv4B%ORA!7%E!`rEma6QjTib30g9l ztsI9>Xv%7><*K9psRVU~!dwW%jmg>KRVShGXP8m30xqFGg%tSZ&TKL1 zmsYm!M~}t{6p!o<*ompUzJ|_N-f}wF>l|2StYIGI!f+u?=Qv7nYDA>?8ffGUd>l6_ zh)?fJAF|hyJXA|lYl%%wK8#a-1O|}6dkenRY)Pz}`F@ZYy94L^PvR3k-Xp9pk$~Q_ zXhnc;&_v=uOLR$!#&=_0h#(k}J`;3mZ6P^76nbO9nDuS?zJxS#eEY%Y?lYxU-E5^* zd*KMe*oPiE^G8Xm9Xu$cToaK_yqu(C1vqI^3*v zzGkxzWwiUTu&h~jjv3|w3r`M4Vp%b&D8uuO2B^&(8o#&Ox>g13E6oN?7DC0)3^+JJ z(`ES1&KBpRSnaKwyKfeauTWwsQbW*9$PK<;4Yu~~FlN*bP>H=YVp1+rv5>4^>9tXr*F3_YbyA)?{p=$Lo6$5exN#Y=<7}MWo{J|BAh+i5{9pkeCpV4o&Ko`i|VUcUwZQ5sC)ij^0KhW3{!P0hS?ah za|iZfb>e;nZ0cdrXyQ38={1$PU;TOPWsC{^s&Q=D-{*EWx{fa9Nyju{YtDU4TZOQQ z>CzGt)GryrhI(!5_~@hAJts63O6-y|4}v+IGp+r=!iN3o0YmX4TB=yhzL$gn=T;+w z8slfpybnf_>~tIKw{$@3a${Dyy8i1mlHVDn4lE;ZX8n7JGX9N?2>+i+4F6(467j?9 z$!Wq(P9KZ_O8~p+LYn;LJ*l+7etC~e#)@qjmD3kuTyj~jkwS&ISrkE{dzp!9#ys4&11-+WIofj@MkjC&(L3j)D$_=^!xKxTo zL#^%<>VVDr?!Jft;rZTJ?3yO`%UoVB^>j05bV81aZFM@jG=|UCJX@|yPw2lslVNo; z8lZi=O#fQZQ}0(nOSwZF)S2vV&vzu^rmg#(=&JW+P0A4teOP|O^+zs%jEoao5nKK7 zPECY?3uBc*?MQ%_JeA7|*iU2SwUMK>J|5m>Q6O-Pm(FbdA+~axEV|+gZZ((gAd?oC z9s}<4ZLhd5r$h{_2boG{8XV#%%%L{Z)|*+ThU-UOpnAFP^|Ud)EN_N<9~14_()TJI zPwAk9{RFryEauURwY$3Q&R8nzvtVylz+q86s}KOOqcoN+3ZYqnsNd@kUj>*|ka9SE z8__&-uS@8iiQul#-@JSEvj_%@TqH1q!@LifEDoZ@Yqz8t-lXS!YrOXKNQdkKO)T}K zh>}M85RUZ7m$Aj#Q|O#|M!+0WcOsi^pN{_GQfSbTNW?82rXWy7GY<+Z!k%)vg1Ol$ zr}txGUI-LV&W;N2O_W-dlL_5kZZEcb*27@zwSVX?cBn7&ZgSqMbvf`jhV#^C*^Vn; zSk;d)l1E5ycYFJ1mw-hNm3{kewEZ52+H3EUIj1>u8V3TRCr-StNcSzCL)9Q)`&!*%zj@%HSD@bp3O$0}@o94X`!qbANAqGLu0 zLHcF4*Z3W9k{WtL4{+Ck5pHC~F*qv9gz){6318FvKfFfpQ+BOjko&aZ=RR%JNz1rz zs8=ypszD+`SL)`2kC;mE{@tXw-Yh3?uq@5FDqEOo zGK%cMsaC<(U6ZX@tu&jMFitbcXp3L6v?XGm)xR2T?u5m-4rg1*ajy0SzHz!aA1smx z`k^!hKscy&TeOYuS9!T4GB1dJ6>;@PfACJ4^o7EqB zcW&)B3Tq-<`yXs)`35eWJS1nicWa@}$sUE#7<@sqa{2|l{?u}PW``QfQfWYFa86U` z@fmBo1mSyr7*WMmE3Vyf;ke;3}z+o7fkcT)eK=9WCxYZNg|?n|F6Z`pZZ4(`JjgiFU0= z2U;QqohrWVl5~n8{%17rp8TopZMJDm%15R3H6mvb&}L%MHNo~OE$f*bV-f6u>}(2r7gYm4mIKkcB-5~^r;O@cQU4sP(?(Po3-CYyh-QE2x zs=Lpr{!bM*aIxXpd-2JXG2g-U9aIb{$CnPdMR6VZS1bpve{`6tgk;SnRWg}9Mj$UC zWJHxzlGQVqO+ zANHff8!HA3sB~cGuVkMRh^>_;di}_rhjAXOR926t)t&+N#66xn{G&)VLM962wLEUG zXRwk|N1t){s^&cQ&Q&kyL&R0!0PZP@tn>u~y`{tdzL@UthTuz12lot(=v&xBl08Nf zAiRyXUXSNN1k5dZ*-O0%iIf)iHeJ13)RE@tJyrISvsx~f32p60Wflm*eY7u>PA#8u zyTN0;c4J5N)yuuQH=tbCLWyjD4X?6lfAs@gS57lu^*~M_G|I+Ty@Jht>A0L#GYBGS}yU)I{)N6MC92?+5RR0=uty5Rf3Qv0xV}^)X+N)yjGv#xd*pn^52AQpeg`m{&PnU$^Mb6{trj%KL;wQ;G+XOBo>BGz55PDk z$GCJ_IKVj=v!1$Ka?zT{Gx=Rx(YLHo)N(NxukH3KplQ zD&`@Dh|F~2=7VTY-S5%k8VBWV@#NeNVuG|Va-`H(;J9Xtpt4_wRqz|HJsIA zQSlpIrY&O1V)Gbu@xcNLq^fUv%dN->Jb2>9{dwOvN1L`4@*Q<@(TiR{X^%qckI10# z|J8)YX=dX<=Bml7r#s0Q7}J|(RB=ZjszhFXSe&b=7x~Zm>rpB0j(}`vV(h1&umhv}~NN8tj2_lTk&85Dk`hM%yP$s7vd?`fcsMp%?&D?EeGvzmpBn z$;u99>r`{0WSAoAx(iHBxYwMIh$0zH4KAJPvSNeSzI|&l@8Xojm^~M`7yc>M<^Pn- zZ%CiC;s9#_u3zWYP;k`E>@54`d#7@l92 zeD%36ViM{C{ojJ%0e)tdUqukEQf0 zRfvM|dbs@d2&aJFQc{H|R zS&xLAY!YXk^$U5`K+D~JltlNz?++OnY~pYCBVqAfzzwC|Vh!A$-m{+~2|TYq;GXD# zy!yNu=7`%ML>Up-g9-ZZL7ZggQd9%gu08pust+VgVTe^%XVM!u!r!m=xT;WRG`w1n zd89L0e3mL+d@8km`wYUAca;KCR#@1fvM&053TFMW%quS{*=^z#S+)P*n1xkj?lY8r!Aj&_C+7RDZ@}dp>{6b%g_%HdlK01m=Ma z12tI$2Fet-l%J5sz>A?GL7DXhJw`i{5CsHFk5S0c&1wwX5>riWm^IUAbuI zOO2r#ZJ6_btn`<~-D}KRB$L~WzXPe>)K96DKwZ@T@ZYfc1x$T^CGPY{4q`KgZ0tEo z%85vYj-Xb$RB$wB0x_HytMuJ5pRtIHqcMHocM@e&bk#WkRz`RzdKc?Jj)^i!v$z|_ zmR>~aQI&{oCo<>{BGAYvGLx(w{W8Jw&s*>k6&0p6t*XEj*o2Jlo6txf5i2j>7~bFe zx$(1FVEj*Tvn~!TwOqiS6E+Wz&l{(E&1*tM4Rp{S%F}8MpsV^9Nho}e()A@w@qY3O z>rxZ>gYzfnHdl`ObhU-xB<4%P>+j2z`kekNpBYx1^0~RSYi`@~#%a1}SPRjU;jdlx zaDV*-v_N;ziUcOib@6H{t}wO#;DA@9NFCoFVEQoVK3spJ-X2b1E=RhJFFG4|R?G#& z6-9UQM}X18(}_Sbr=7X*G@BW?l+kP29x`4sqh0fq@+YuPWPwM=yNsTBNzsf2D3S7y zqUEcuT;$`2+*yE^j?a^!;tEt`HlP2jnoPdm)Y0>S>d31G6^97fen`|a=pnP_$@&IcaQobn zMbxWCYFvbV9;OAv&ib~Ls4Y#*W@8})E{er98}k8X(oYjy^x)JROcwxW&$vy0Ey zS88%+8tYBXQYfs8a@+3|393d0qGQn z#jHQNd>oTz8ep=@@$Hr!uvVyiiv~E`C6ED?K7`jehyFUIdm6wyYVXr5-{1@^)>~iS z0MuUrFQ-SCgl@$-(T+^?f5Q)~%IlAnf;m>;YWIq?BLv!cR6{>bCS4*mPscZw;j-ja@eSZ@>K|;?%F|)}{Ary+H%_Da@k~Inx+Mjg%|L02 zpPim);`nui!ZyRSE<_>&kp~qWb)p?T$k_?7VyQ!-8h9jw86Exg^8jD`X;XMfnF0h|af z-G%$qv{x|HLaoWzQ&s{O=;zxQ{($QA=BwWKJ}--#I%p!&ke0iWLF z+M|p8->^5FPC2NwQLB5o&zw>(c%WicXu|a&q6mq1iT@_(y@mi|pe$1WD~m=4OC(s9 zsIlRocDRTd+x?|+!p{#VUbVH3*)kLmwA7tjeg(q9C+g`EXQf3}W<&+5R0nZ$?ucUZ zrjzN>`+q$Nt6~hPJR=sel9X=kexweub@X+Q^YpnN z`X57w;_HSzldb62OAQx76R;3JENS zKRosymo?KP1BT4}LX*C{R|(+)d0U1B2;zuSyVq;&KcF&WB&G{yN!AkogJA^FgC`Wg z_7jAJvCsii3wSn>wdONNiiY8$MUTm~4|$kf6A;|V{_?#8RAIpiG^-kn;rACTVxEBO z-mu6*+N|}j=(mXMttb`E-9Lneg5P2mk8K}Ekx?K;?5ElA86fiQ6xJCeNC%uLlmn(b zyU!&T;I=iJawI`m|LiVO8HY^c_b9@x@!XyA`-33qI41zg8+R;3whUg`9vo2nPDDo>zssdNRi7cP_zM6A%ka5r~&9=UnbAMZV$U; zFB^ogf@}3RFq@oVhO+8iby~gtKp+TLtJDO)M_h#ewSNQltkP{!%_`5}s13AH0;Pg@ z+1fhG;Ei__g9;n%x&EaXMesv#eGPpUL@oS51t|`EQc(6`#Z$18xK0X_VBngP{qBqe z9po0Np5e+9cch!JyWhHwxj4ci{>RVtDjuy!rNxl|kn;_V)9EvbP%%#z~x<3;ccN%_hx^p(4%4Xto=7UmwJQWM@|wFsC$e)yV>}e%((^NY=qn zW}UHbi+PF$F|T)G9ogGEhiFf7m5PbyrGVxH3K~unK~nW?ONC)#an12yY6oz)YQ8N| zZBVE!u%RH+8JNCA`O4S%ob@*V@;V#ptS`$#Ci8P8i1|QIU4$oOd5{B0;Ze=`8eSU* z);nD=RC!fY3XsfEqq(Afb=F5L{0flS(Mj3p5Vf0xn)$X|nz5W$DnEm^`t@)$SNbwQ z%}O?{@KOi8Yv|Yl`V6S%aQg}yh>w{*v{L0710D|Fd#MHAFSq}(F#L;`W&{ED)?BsQ z2U_kB^sEE`xNUgZj3m2qa0>r9zXYoEwat_#haFRZt9q4c>a2M^MEvmc`^Pzvd^> zd0c>z{q7#(>TpIdx29P@#2}N-Tx*l*2av6Gs`M1Z-7y$c^(IU3^*Ct$K6#TK$Tlpp zNT)?g^GP1EKKr=rSf#7jU`MmTJ$#D>E1&v1z*$}vrMAH}+(n4t25`A(_pRX^3R3!r zT9{!UW*PYqRgV`$nXYO%8dpnsHmtDej9mt zc^-GC`2_`wT7ne&<;VXlDi~BHYMts%;rPT@Plj|h@`LY@Avv(S==g#vd~dk4joG)H zu6)c!K7<KIhE=m|4SH;V-8i)uoI;xYTOUX&H7! z9SpGUE&(V~S{kl26~eC&Dx?OJS}qnA7B)6?xM8R&x-;B&-eol$066@g^+pV+rXYRg zJ~O_vmw~(l;eRvvG`!(Tj>{|s(T_2*EIlDl{4^xLDjfiT>)rSFn`D>jwfj?$5|lF} z!7ycgc6v$a6{C%Oel^p8%n;(vbh(U}o~@3e9-00#XZeK!m8 zGB-rf7a9^>&@2qx%bMu(&F{%9y)q@2P)v^lyUwX!4`Kb}VUFu4I&4(OF`2_5ClcVA zt)GtjCD@(ZiHlNctI#`z7RVm6S=ZBuYx9O6FNev?KrbyqQmgtk zYN~=k+c0Ke;uhB@m@KIUzroP`Wbi+>A52vBr7LJPxPN@a<#WdZyMFo(te4&! z7ja*o<>AO*JW84QPxp^+wZwzwE{nJkFsUnUd$)W7Yre)K2_k3}0cAEwA+*I8cgTPV zO#0KgpmM>-plS3jMZyM*ER|C6NE|A$_mkF1OjsCU*KbegwQMC`k^su|6VEj2f?_sFk z6C)i}Qc}`5yX54}3MyM6z}_2;;hhlvAE0-D^A56INQwe{Sm2kGp&F^l3I1P57%(TH zCNdZEQ_%2g_=1#sS*G?<{QR{#9l&Hj@K<64U%G=T!3P>8u>KYV=&cr{SzG=mg6gCD zQv&Wqfq>*|J&aB8*=e@if+4mzm~bD!dxc}u(3AOvCwyb;2PScd5Q?oGUpAtZvZI22 zj)1EO|1kroq-11qkZLkR@$qTzfuu2%4w&920)k3uDs0z>XkvQ7oMQ+D4Ap6 zeZdOxUt+I#(Eo+uHR}VA@sjgavw@u#)-~~SX{rUcSv%%1WFXda#*$R`ECYQ%cdhu# z4TYLqrJ4fSn$8Ui5xQ|!k*GfwZw;&F|drD7UoCzU1J?>xAmP=6J^a0jwHgl&a6WrhOYM?c*gmw89 z3{0>kvTw}9K}u>k@)L)Fq2bmrawBOxDr_1vV~QH?mJSJdwUw~2mN4%{{KfE8oAog8 zAQD{yr9#*@IzmW)Kp=4;958;}gh)+G^V}Q9Ym5XYkOP}kQ=%_Se}t2b?L`lm*q9Kn z-4@1as>K3qVL#&)5P`ZRrBxV?uZUo9I1w4ZG(JkMS&hY=x56LYrk{+K^OAKMtsZyy zawdaA_4~gHrgDAyb=1o&!}CAJR)$E3`ZJxy{Y^@Z^~7}g?7tWr1k{RuOk z=coT&rvZ4q&p#MCr^Y8QS^e0XV5!t;ONoxQ-5XB_TtJMBjCj4DIf2`=8w4g1VF3Z0 z!LLv*BM)t)a3UkGm0#NJ=Vjb|7X&KvgQKO?Ya_(Z*01Q9l0v-!kN(bZq=O+T8r^)8y&=USuff6 z(o4y>#fAI%^Jf&s)G;%a+clDZsen45!o;bnfq%|_tfbXjc{72hM*LbS0nzP)f9wCZ z6solu-Qs>kp=B&NHr->Ze=M&z@7FKZMrV+$9gJ`?hKUzc_9RW*st(2Nd=S~ZU35Zv zWf1f>@n0?b39@ChCVXCKd74*gks86|WqP(X1wm2rCFGTeF)qVm~LeVp1Pjzr` zK>hgfRG<<0H_!MsZTQP7mA80ES{TNxZQ?`R21a}}F{LD37%*ldR57;kYcZW%DRL;* zR8U2>eqpK9C)I9?0y{#7tI5&|e_unbmrKZy)osrDX7!0>@AUw)it%xp zOj5UTyRw4siSE^6rYm>jtxSW%cHf11iqUFUs|;-Ys6nujW41!uWtBHG02IbZZB%Pe_R^Qxv8AD*p{Ay$NI*BXrL2cUg#;#6n8fBu0M5HQ%Df2TZ*!s82??Fo+j^DT0hSEbX$q29C5DYG4% zFwL}H=%DJmgL&k)$;lWu6^V=)YrC7ST}KT)R$N(1Xi&X5d@sZdwsPmsYPEVB#PL#% zwj0D8rd3O6nO=`U8gx2s?%F!Rh|Ad$^F+l8W9N9eBeUX|o0`_F_^-TeUfJ+JXXPqqykGxFjQU+W zAYgWOc37S8(0Q1!qnl#+HN46Bf}G^!P(4_XdX35eLG(Y&d;j89$$ci&^MD2HbTF;@ zGuxD(YZ1%ZyI0x`&`!HckN=dG9o;}jLS;|;MrHrqeuP?Etw)orfe!fM;!^)nBiwh1zhQ3IyyQk&d$P$iss_n!6Ymgi1t)2pz ziq`)fRMX+KVsNZ8K>DtHdpqBXI{IVr{bwTJPW)}YD%tb+Y{5ak@=61>b==y4oNQ&% z3}NI=JyabSS-2mP6gsLin9&GN5C7(hS%!okJhfheQv{thmUcvQ$XmJEXk6W8!&;c> z<4bA2wS_u`-f7~5%j=5uG4ZWUSn8*~>HBc3i1_m_k2Qt#Z1Jd!mobdbxdD7EIBn1f zSa6_JF?SXE0R?N3I6!xx-S7#&T+MLoP)6Ex%W<{YO|I|;K?7US)#yFK3<720^6o2+ zXxP+akb8ys^c#wMYikSMG#>I_&NGsaFs%_)P`>Qe30Se2Nvfn(k6?9eew52Wstd)c z>T^fPIEcdepf_ZH4?QaZgSyGq<>h67amMd<36aY%s|U6*(_>vr4)Mb!wzic#0!VIB z(#hE3&IzEF^Lz3%wh@~U1|ca6-|Jre6y%+xQBxn`S#o@q!4#!F&Z@z~SP|61#vxoR1ok`+(npVi|1QlLD# z!RtmX^~bdw2CmNbBs~7@S5J^pj^WQ;Xb9(%nL?AcVE@&;SuEuoesX@mD+I>>eH^B0 zU@f4k&F3v!#S~zOtf{x6l)wk8oViS5nJ2X#8kwkD9hdqm&PIM}5S^OLaRcf!PXKgq zFV)7~^T|q15Alo}DBK9A9$S9tfuaK#9T57dE9^e)9V$o3F+fzp{GLe)cXHvh*BVw*U^vsXeOVBZXv;>&H!oq-7{CA5x%lU zsj{YGjsTq-sI3cYC&2d2P;!XxcEC6EgOsx0YmR&VEkx6atb$sEQuT|ALu>q=G-e|0 z*kT*!jz@&@Dh9x%21cxFWTnB0RtGi-KcHM5{qu{JR+H70&bm_wdxDR8~5b^B(`p!0h02s`oe+~yCGkrTyvYkm^4U|Ls zvq^k#xD9?uF(MIMko@`X1Zus~TK+qQ-)wDa&L%tajra}H4+R83i?w=82n`J$q_K}l zptPRyx#~HoX|`XT0xI7m_yzd)Oax+cb2Cpq)b}WW_XHD)TYoNo8iL#UUvjd{?7zk~ zKv?zb?Daq+hC|6f;o>wxr$J7>&?!0(A~ng)tz8N^%bTkYbsDGGoJqw5gaux9mP>CG zjrucjvM$O5=AvY|Hwj**&kBS<9B4nTp__NukdUCPG;*oh&ujEI0a5fegkYZiD!pFA`Ji*a0B=l{~sPdKPQl zSR9G_2@$T`VM^u?AfcBzU_*12e6G(hx*Q3tA4GH>0@)rE2(enTs)7sW8wZ2JO>v!Y zSdV9GCjfHmHTl``GT0ZArv6Y6wax5Y>blPsd+P()dLA#2 zB6WIjTFuwWoXVsboY?)$uJrHaDPCHPdU+7lpwlQr!FKiLVFw6rYqRG`HC z_x#lrTR(EaQnQWPXmCA7yZw;ezIPuOKc^tC-C4-S;y0^bNGnw-ht+D05QF1dYV*jf zoaoMjxE04ZS@>ID%N zkjV^yxVAfne14(M>f`O3c_s{$DS&a6b%9thK}x0valv)nkRNG*M&G;JV=mEr-2w39 zORasR^7O`X6od6`Md{W`A3fpeI{#$cXk}6Ao|~fva=Db%TGO@H7iifu z;3>-BNK@*&n3$$|{lzAIy3)D7hrGXs7ESMfX;N9Wyglu*w)kD)RnC0_KrqypFehPu zz=A0J96x-Qyi;3IDweVo@p;YE@`=kZ=1%r0A+CrdTAN(u7 ztc-4l+fv>)mPaI<%O?WVH&_j?mwqejaS)`lRX0YL)7ET}5T}F78-|W&_me}qCM9dz z`K%_$`r~-4=K+suyPo>hHYgAu+^eHCA4p@iWn;CE@>r&8=R`Fh~GJoO`LzIb90(IY7Q0GmK>$2R~@ zYJHgC6NEY7G};(L$rdhX3renb;NEG2wGDJ-C_yngJ&;dzTkP<181oI?r+lRw9Wl~o zl&DqI0N;@rN?#WkH6lww_S=RvHg1v9yG5_N7c5C57xjvd01YT$wNxQ@_w6b3@xEH= z7@fMi%bNto{6%0SAnugN?7VE{VWh&AuBTGJ%W7x)p!S-)vM~=>uP;6RzWKnU%dM6G zOaOL`%i61Z?!oB`wCjgBZ38v3{oo(>_%-XBk6j^nbs7`v>o-a8SX}lItMZ0d7;|lK z(8~*cKKJUrb!t}Qz-?Y!x4K3nN+Sq2^d>z+mxtl=YN)r2vL!A!@bA)aI^_J zYZu;kaWpTm4r6(9`qbu*Xm+7uQD>$I3q>HnUT?1(Td`_BzfFfMv{d!^YCO{i6105v zPvM(jc;t!xt6buOCb}&Z`g-(Np?R@$=a)rov*%t|V2p_VyXsWV1CM{!QtLP9xZ4|8 zUy{i+0T74m^yggUvMKP8h`wvoh5qhmN~0QV1;r!y@LIK z`DF8uEi!O8V?_$H2v{#Qcva%z3cKSWtY{3{^F(A5zlKnB_s^i4>C7J#i6d$Pj?51Q zU!o?sT`rhsrjA-au~~Y*y^<{Js?gN3X{NuzCmu+%u|b{DueiIMES$YWaTl`zh{>B* zooXB;6czBt-j$)4bgPQ5wft!%Y!-heM*1wjf%Dj$b@kX5lxel8P_NsrHeU$RxXUH8 zhTthZ_y$BEQr-$5e%S%1R{XmYk~u$Q5D*h(!*!;l#{(Q=!08R0W!6R-7)B@-f&hc= z;G;Bf?sE)`>-9@SkaYif$$EhEH2$G?<22M11ClZ5h|7hzMau1iz6|wUP&D{{=Gt1L z^&v_$$ekrS%`$1V29XVrg_eg=}>q)p2M5K z><|{dbAmu@!ZXPF*@?#;pid4QV(HB6JJo8ivtUEM05VZHz%`1BGfV&kQ zWFpv_0@-A$q8r$YV}eU!Yb~F37Mm$en}(UgwnFJl@Rxe^d}tOt9-prb-VV0b4vb!c zo}QOy9g%lM71k?{ZNL6F&Lis8xx7ss`YYsLr11!JmZ=H$jrU>8Q(fPcW0bSvC<*Dy z_|)}pJEI6A1hJI>hs>#z0g>au}Pz7-dkxPTac{Z?BlleI3AVI2@#A5f#WHvx~e4MMT0))xxT4pnOx zlPySlSum;Sv|f;pKP(BUh_U2{2y-O4?V*G^aX*L-aY^{KknE+gxP0m;Y;iX+Ww3Rj z{H}&PF{Z2veBF(XkB_6Vz)cUA=Ep1$=s~=1(Wk!`%7^N z1At@Lf`t;D#xlAR-agU%HkMka(QfJFuJPTm#rcdzHM^z<-DP{wu6Aut$4sS4l4=xR zBljiQ0aNprx#@3hLvm^90kytW#FC9E6j336_q>aj=PjFhth-_KBPwd9K)w4vLk?@6 zFCr(Pov3`e z=Hq&@80n`6)9U%)9=d6a!(r`w_(%O3>2$HKP_eJXIn{J-9L>S3CTv#@CXaLyh5r+` z{op|6N^49oIjHXa_(^9cXlA4K#Y*!{w8~-bO5Kvj{6;ESy$qi%0^CJ1Tu36Vu4cKr z_89ikRgZT!?Qk2`oT~1d-W+dwi{sq&{6oiUc7HH+)4*%JQSsOZ9*5h+5^c)oEo68n zI`6(3#2iu}A3>|V8MePB#3!6AMyIwTr=YZek85dN*C(IND=5%uv?bbV*Y{Io!ir+| z2YnmrTQik(b~EFBUWpTQzYc%Hig_B|@Z!4--1>usflW(Q$T>?=H0k9$QqpRVc-`8CT#xi%!Zb7>CLe%ih)o^%I&Nua*jK3VD~ zk?G!WS$!3p;{)tx@;C48lxpS5xad$V_{CMT7_hvvKeNa&g{<bM4fyV zg0i|l*~vgATe#2N(MRI$P{Zpo1XqgO`NUuY|vKaCWQ*6%*3V~XozPqz4bAk1) zs|Pwj=mIS^y46%fQVvsOj8P|riD*z>;o$*O_h5W}D7J9u@%-i!Fc{c!<4RDc*R0En zw0k+DnbGJ^w-km(z}jVs`h{sI`+PjTWu>B#Vb6;KXJj1w@{PxE@7VyOKE-A1aLgoL zkW|o*?TCGzO=94O_Oo|PXrPoXp;oqH{7+-*<<`g-Wso-Iif8GWl9}Jr5fW=^f>&G~ zvs&6NHY+tsoH5#Z>olrmJ=Rz5rWeFeDQ$v`fuK|MzQE|v1hlL4K3IO3qQ%u|wzP^^xq1zG(Fb#Q{3QZ1q1~vlle`F=hMRpOW0EkhdX1ld z_e#kLI9yC4%G|X-nqyvVR@r_;V$iDjvl~G=oAoe?eU;|^ig@H)G8g`NQV^eiUrA4x zYCMdPqW|e%Cc_w}njq7Upp|<#IYKD;tFgL;UhlT3tDt z&^WC$nw+qMpCPTIM*jsPEvsM!9XSHcy@NS{LbA(1Y^3$J#PvIQK$qTgo8*@-Juz3q z@ic|9>D>%4gS&pL5=jXtRw>UvwuX%Qe})6Z;Z z^C+FLPqdufus@AcSBsaOo089dFNd|sKJOA4;LW%PL<_MB8Yvy3q0<0fS5i(DGXTu{ zq8A644||2DGR~2N0N?b#Z$?})I6h^!(n0-d|9pePuUceQ>?;k4!uKVO)4P8s!fNjJ zD{F}T#@Wb8#r+g&0T=H@KnMcar!6q=`91gqhCAgoegZc0YsL7IIvI*P$+CyX7RyYv zSO(`cA@ueO3CoX+P#KwhHt{yqULw1FJ%-T3n2hb|_?CJAq#J zAy8Yl+N7swDwcJn_RZHlS#^>^NyI2xbf(%&ENbQh%7XAV3+`&F{oqEJ$5VPn4Y}vZ zqtzJp+<{X}1lV`eS3|8=TP@*@xfVDwVlo2;|5&`GyT-JOt6gsi5tJsX%i7?I_N1G- zioSA!8A*&H@|+#KFe=6W9o7T*&--(OYkp8hhJd89D72I^1p zQ=aIFPClPF^{NV*%*c%qghNlM1+;4=i7p=5?YLAP2R`!j?^^M2SgtxB9LkvOZ|T{Q z^F|9Yxg6crj~sBhsO)IAPI68ijQhNH$FoXl*LbEdRsdu_p7d%u&HDIa)en^ea%o+> zQPLl=E$Kckxwk&ptSZYnqA(drm4WV#zN*Z9oGn`=*Lg9DM1~1c`iX44*!XgcZI_S5 zGa3-gNv)Cf(bV3*re3gV1RmeaAaYSVlCH1P-+8u5qVM{S7NZ%biyS0CgW4qMw7!{8O5#JBU5)MoAj=splq2w za9#e_CQMU9g}f4m4SbR*IWoN4 zXYA|lT5YEk#i9S!W!R;6-?W#4PN#AE{BUHlwq;~6)|~dy!joAY0*lEYV(j#JcZq<= z=W@ta#=&ZV+MaD+pX$5AdS{n&OGa86b=V~r>vzO2%1;>Qo3-LG&PVGjxq&4U9;iOCgLEjs^`_gQH;-edaY);vXIF8$>RvDJY`MmeP0 z#k%nBgr^9&4x3M_m$dZqrM}Kptcc<#&}yDKHbEmj!|+X`GoZMhK9I|)dP6z<;LB6L zQmJ$~X*W73vEQNT`Yau>b)6gzBj?iV&F#2NQ|V~mvU%)Gq1I$yCzD!VL}LoIzL9Kt z*y|2Y_h?0x0;njFhxG_a`HAAHNbD{);{%_A_>X@RK|6`iYr;c3lO&qe^skE$N+Mcq?kWG_0>ETlLh5G-*EI< z?4})Cc3%xI?9qb6PlYGLd4F29;JH69b8UvQ?d}bpAscKh8Z0}fVtQZ__u97KZvx)) zrV~2Nr|n)mc;m2u6%M6hp6E;o+wbXW<1;i$tsM1mcJE|95hBD_BP@QLLfOnhJOub0 z*ke+!C#2pCx7|@ON1;v(zbPJ@T%NNSl1&{3wE55NPZx=%=CjoY^ecEz0;#zUbEhY| zM``l~cy+`B*RKo;ovS;@9p}$qAmK5x_jU*)uv+$RDr{mwK~4Je;F@$+g6F#!VXwIm z^?D!zGCjGMOO|es?{-}27uKr6U0{7aPgbFp*C0ec4QS;lJs=H1c z3Xw-~5{Qs@ZHx}@b>^bNDfXDKe0Xdf3si-K+V3v3{=D#ovZ>abN<6Bvs$hel`;#hO z;Afrn;&xzDF)d0)^$*$-`?7PoMB731it2sYCqOD4&0_Ca>{wq3u-|qGXGH9b;h)}@p;?)A++%LIyQARWyUQ*f5jvu@`JX0Fv z-lF1T%F5@~AG-UbMA&UsQBf%SK|tB5o{$>(E*RLYFJ|Th7EY?yJg?y03&yLlIIOAT zj%KaUadN7;?Jgr8s3~>j`R=!^HL|2;Qu@LYSF0T=mtrSR=wgCD#sy@1+y+1)J2z`l zJ>6!n$G#2yAwW}I_VSAsKs&t@M{eNpxztH^`T#d;b#9q$Kt}0&AOr*WUf6MNdfZ`? z&TNSJluf6>cF?MMK5uh{^!zSWwV5t_dYQiqLuX*qTOa7sYuu=nx%{by`ZUtr_lvEZ z)-|dZ2b?h=*4pOg*8(pPp9DaOC9B0wR$uWXxkZ1pn10UY()CWA*nPZ6Tr1MA?PZ4y zk3*9&vg;irZ8@dX&E7Qak)YM7vAjKQ`dXswz`cx0Azh$)0`a_YIPvFn?QM&p<8dRZ zk0!)BLAiceiC*=22sKAHOM2lleF*Ej2S2sNKlD>W~lXu1p`g9;Vo;fIFPCuuIV$7}A$)CN3Cp$(-?hpp*4eA~)EWkEbS4&PWc)ac9OtfQF{X!WA#ee*Ex>@G zZvfqF?$lVH@K)5aZ7{go`qreO!OD5>;J3Z?MKOGcOCc_`PIC@N`{cR876z@xVym&{ z%0V*M5qu*DRgL*}bc5AW?zanF&x>?VP-O_shLhtpA4%y5Q()-yXwF8vLw_VRc5`^Q z<;<&yrxkGB>;4f24u3Lw)&2}MT)kD$`lMr%Nbv@ksg0t%yviTdSE5mCP>&I0FdYHj z;JQ?bIno=O`AffiP6n%g+xHS@0DE=HaUwAEcM+bK=efFfjWAp4O53-Q1m7ySw|1js z8JEOLHRHq41)4dl=hHn%;|$Nm(=fovDN?spRwzPfwNdf>!T;$F@3s+j)kl}t1r#laCKj z+N_xZ50nh67W`XyAJ~h7dJok!;1kw1a0e4`vA?x@U|786p^j?s%6;d#xbgVmqFV}T z3lua&`v}$I6f!AH$=WW99eFO%Ubajj(2uN|oJR63YypG~jY3lQ0-{+-Y7cW)9SZUr zKPiJpv?>U_?XWM|I8H<@{Y7sIY%@k`ioM#mOC-^s8$3AKM6z}UB)KdE7-qy|4_Os% z9(Oo`JwttzSO`!g$enhfNIyw+JG@{16f1EmOnd~SLdC_!D7U98Ev6IrgN%R#s06uV z=g-6#3^Upp=zH`)0B&!9_;I7Spwse)vYJ zjVz(ueljTmY=q$7zk9zLIW6>&~hR192K z%;Kyc*g%Kmf`8aIZO&CHO=uOr9bffHC0z87=cPb{ZOG!axbX(bW_*kdz76-*-EqWB z>k#Ax*$O~@;?zEc$E2TLW%JzLpT7q)9S>EVU^TnXVXG#;$OvU~mRR;oR&&^StlJHx zOQ9fVx0xz&3!iQNtyyp!OQ-S6d@6@*zNNwScPwmkYgDmXjb)Jb)%7XMch+;ahef(n z5<`Qr9Se@k3XNQi$Yz({K|}`M7IT~~6nBVFLn0+>j>hA>pr<{(rCJ-kc*;E=!T@ph z-4hs*Yv_+P0+>qm7BQDznG9ak7UV~~#|7I;4)2{|wj%U9Ea45gV1(bSbNOH9_5}vp z=JWD7>eri{Qi-0PhY1!Bf7}B#ft)d^;bJ9IZoCY)tM>6pDhwZ+utQs|hXNDhZj?DrM`ZXrC>3+4phKwdq|waAF4nSGem~!4Pf~FedcXNnNZ2#Snrvg{J@uNG+W?=E z#Q7R8gONl{()vpEBXyZCMG9LByL5}~e`u@4MiOfG!d%$9EEgl1zFX~-L}GD1^k24R zv|TRX0){=}4BnmweKMZ_-z#=&j6`{?Pww;QOhs_tpBb4fpV_PzH;1IY3LNur`fMm# z=^XrVnWPxgsPpJP9o8+n2kbe6KCtg->poCqIyY|tS%C9tH~MuWg_}?LA|imVpV)}d zt+mD*od)w$+{vI-YM-6~suex=!W%8G=Lc7+TGf!KOY)mBU|=GW#1VpkT_@(&<~b-= zc$3KU73OON&sM=i+Lwf1pR$C1h=8E7dUtPQrPez>z@Z%|HF?fZr|u^6Uwv_nhE>=o z7}MNx@Vb3AHp>#^?V!^!cMxrZGrz@L+y4<*cjT<6ng=V25MRn4E1z}#?LmiH(ctsb z6*%OIJxlig%06VEfLfu6Y+2V_2yDIq<7?e}4syWO@z#fs+Lqg#sl$}1``qga)2Tn_ zX@H1y@Ln@OS{rh_)WgzwuNjp7VJFG+>9h33@jOTpjTz@0i-kbFq#@fJq&5X}gOnby zmB3MG(tnx#&@-Ub;+`6I7a75XMaC`Ai$Yw;?RQ=fxg-&Z3zT_b(d_7rysC)bYXNlU z4-pnjmmp3PTSoZNPirLqobxkQRtetI$dzTocWc(4Xta2bEW53FOc_xI_e5EIX(9NDo&_n|6*7WP@s`LaQyAjLTp8 z-fB{2Ire22vN0-GIF{zXy?om7LQyQA4nPJ{=PO?D)YWq{1GeuKCNvZ;7GPVPSkDp(@Ol>XGMnJkLk1fC|J z!SA`73g?SH{8HVLlgZ7(o})qX)CNoKS|c9z+y`{ZxIR!b4b?S<5fX8Ev$KaJc$uqw z6=O^_N{oA%20`C^mVep9)7QK668}SY_hCf`)xkuN(3h%@+c(F0lr9?VRx95%yq>+iKE$)`Xk?ue7zNdG9;?1IIRFtGG2D5^sm)ryn(|+F9FgE|{W>h4NaM3v@czk& z1nG3Hslobbmvqe4k~M_kB$>$RS)EmB4K^CO+cgSJkeANOIAnY|i2HB#S3AWwikA07gUKUZW5_ zZU&-p-qVIhlA(1x?`VIpd9J~?5r)V3wPmiiRnt@`{{j=)gI(MMcKor(e!5%J?jPbi zLZ1SGe6d`rJFL&ewL837b{-Yj%T@65{tPGef+1|qLanm#NnUXVkJiPlv-?x2w7h(K zKQ@RUq95^jvEjq=S@-oqPssv;Q-Vh??w7r^` zAkKoq8O_I?Vn((F+5iYa3^pj~f1&WyG&5qItvE32&sd;R=0X+>q&EU??O%fEaWjkk z@1~|ai;A^hnwH+p_`cU_w*XILer zovMMxd+|mH>}5t#&fK}10BSgjf@{gpn>8R!Y0(H{J=QzE+U639(T3toYA`8Vz@wwW z0tus-8co5;MRQ<-Xi;-^L!Q!38iC#;l)--eEd6S&VRig;Wi#L&RoB+zVvz$q#nG)T z9%_3C8hymNDbgV^9=fA~jP!MXlqty{}RKD{DJ4ss90rOn0sQiY=@tPF$% z?+Ux!_Bp&8bGG9J<0}np-vo2jbO~3H%1?=d_D#EU@yt@i?HQ{~$V%1K)i1Vb5Fmno z<7e=4HM~7%2e#xq6-@3jzCpH;j7l5GRGeE6P3PMMDW$;a+isdH)I_G}M`$;kP*bgs z3&rV_2Ra|~Q4nm5YVQLO>9pf)Nrh8R|5+A~RNZ1j;hy_5k3&1xm4OS*SQ1@^MveQZ zi88E`!6+chQq?S%a&+5BVVBGMgp(5^x;|s2H%YRxJQz~dJ7r81sUUcpZ_+~{8Eo29g ztv9~Y$*cik-Vd!z-AZ+@$f_>MYc!rxS85&>KUj` zeR3Qmc>ipG&oNJVn1yV>^Q)$Cwm2V8I^7m#qQp`49O4g48AN(qFI-pCBY8bsgV`lz zh6GhPp(C zp7+&RgU1ddPgh?ktHt8rQ8Ox(@`KGju<`4dJ^lDmYx)XQ8(2U zu_pUtiDUQigRwa@(w66|%N)5>7wfr39hV-bqbq8dtT3%=BOp0-zaP>m+$edQkuMXb z9uOvfjvp>l%JLkS9;)cj2L#+xFDrF=hi^lW)z_MQUMPaAG`!jO*g`0+!F{Bm$KROR z>*tr-+|l2`GCthAF{<~2L-8H98W!(N(n-G3Szl+?Gm-{xDQ zyYe~Sxjw^)19h=s_37P;168K4!N$&LZGoKjVRNFhxUglTBEgS6ad2D9GmZz&D-?kl z0r%DrKbsZC4DWXl+kxa`q>FLsQI8J0z|N?BxccIfWVW3Ht)rCb)SxbXAOO8GQ?J8> zdWKfm(QT86%L=*^A0tjKK?CSo-Xzj|eJIDFH3un87iLD9Khiz%guQE0+eVvFAfkzh>2_ zb)5&As^!LHc&dT{{9mS{F9)D>j+WbDHzD0t$Ki6fjGv#0Rew94wAxsuH0TE41Fa7_ zr}aXyra=q7o(04)L5sy%;h;U2S+vl^0JT|4(scc7H*>sdkskn|608F!Z&ybf7MB2c zs>V#%Pmpn-GzsCai!wJ(BX0CIRCovVyXK{$$g;Ni+W<25*ldI(BCJoW1Sox?&{16R z8lsZdd*EcVfn03TqS5Z_Rp2M((^`rY#ZXzk+^EG4NNFrsFy5m6+XC?4WfgbTxCp}m zWbXVFj+6ox`dlw=#6Z_i&7>QJ6_LjuxEV+KegAa9{|j>GsiH=jk$va(snm~pD!^@; zSh&C4x6$WizNpGM1T>ve7q6k*;@!QGKh%X$U0XBpWmxqJ8{~f#gB4imxQ{e?LiRXm zs(82EE!4B@lAOzIv!ecT>jUxDtJSE*JP)_TxD4Z9d0S^djEbIfm6Ln2!Bl2) zrRT$NM1C>`a*CD0gFQ)iOyxYW}7rE%1)9-KsxpZvlB5vMdrt8 z^;Pp`Q?V)6s@3qYgj0E>pw)wOT}w~sa17>KQ&5FE_fuP2qfcdHlDH6F5r@JvHfJy1`&rAV75On-Kq0e!MC7# z^^8;y;ZUUXhM-Qmu*(@uU?Zv}>sv@M59%`$pp$JdlH>4ttb5v9Adya;I^D%e((tZx zDLlN4^$(Gdy8E&#%gv0fA#WFBYNwACNQvcgm?nUdjPldH~d!h^g{MP^Gma#!O`nni?wmxATMNRJ8y#9(7uv}mmRnT-KgCYVpSxjOd==V?c z(pss~SgsSc@0@VBtiY!h=Gq(BMOG`;pb{*f@O$d-DYK(2**Tj3MkV{hyL|Fe@Op-j z;F~2zlD^Yv50Q=w@M04tu&cTBIeX`}C=E7ROnU(%)&)X_Gr^U71UZiG)uK#D2J=he zsyJ*Io9P&rO$N8yg~||!g57ei$bQ>mqboWsc`IJjc~rT?IUuzGyheEStqB1zIH-ct z0O9K|>L14_S#mdF94@DM4Q7)=c)3hpXs056dy^|seRTY}|BMYHsTzDhn?!*!yZD+3 z4LL$<8V>}rHj7&f5$ty8|Y-b6c6fmS?WF^49@*y0)Um5;Y+P+8851t0~~C2i;Jh6o=k0T zV^57m1gC8%2bF{8(=mF=iCbNOs~s+mf%Udw`ck%a=cQ=*EXtMTaf)z zjHR1KD_zj5-5{uNIML&NVR~^wzq~SzU$d$hoL*_Xm}!>qyvchCGnkRlpJ z<>|!NWx|&o?NemfrdQ%c_L)FGQP92ZRc&BQ;=w!)%o>o=3Vk}m!M9cLn*gG}5x33o zFcleFOjYOV8>3!B`4_bmZDJ4!;dVdFG8s)-EL3;_M)u>SrbD2ydfDC$0$Q1Z;?wqr z&h0DD`+ZXtPXgwU^zFNB_GHL8 z>hbY%UiJs$!}V-XCK{=3VW-0iP;DNKp_Ac10{AQB8xC;>yR+C-5~g&nob^(*s_rw! zNuW7x+T4X|>JOGGYFcc3wQ`L^`@UXxWUq_!fj8}Xjjn^mRfaSPw4a+bsy688e)b7y zB|TJ)0D7j=6)(wXGCq4TEbgqAEYsrY2`Ba0h7~_1Hu%!R8J}|fSS)&ZMq_IKFGL7I zJ}*{5%I{_vu~4OG%0>%&W7;Qc##KwS0#c@aQ%7cG@wFyo6!SVC1p+7eeK7iyp@-B_5lmJH3K+JAQnnB_-EU^8o&e)3qh*dF|rN;U_0Ol4A_#bZHsMckl<%ka(SdQgQ zZW`0I0=Q$#4jJ>BAv?ldz-a1M>$W-zPJ(oHyWa!nz~$kaD-qSL#%FiI&f#`lH`Yv9 zFP|O^E*RHpHyB;0ONB=z*|2vv9Z#Wr2=(2`4E^yD!){Pklt+uLB4j|EaI z)7o@&t0KNS;6rHXoLJATB8g@HV19J>W_LUU@mPND8xsD9b-Vrs%X#aiIqBiVvXsl- z#B|PnPm@{Ng4lWpTKCqKZtp)5$i}y~zwY$IyY}6&?bEZvw4Ij~ml)xQ_9bflq zNJsZwn9Iv%|d5V%<<`=dDf=(=O0&dFTg zsMg7{OK3(2v~UqPD|U3he*c5CX~YS+d>SigsC?v|zY$&6@0g zbhED=TQ+18=>JqEhq?Gz20@MPOy=8=?%cjlp_5-g)e5Cm^XxsA4Tt1`D{T+uIxU## z+L@dF0(s8M!Q$T%)wV6q9&)zj1q2-oQ2jPuXMnCe>xwz@l@Dj(W!C^6W$VdKJDDd?gY-Bmp6;d_p*>1ff*Cv#1g3UC0Z^Ii_HIydq4 z#_1Ty)qD!$xY_F=$^uyIBed~phFNk^9_x+x#z%3>W}3{=>m}q-?FkHejK3^`gt%o>`U-s9EHeRDpVlfK#C@2qIQ zZwDBLO49VPxw*N=bl$eAuTLh$k^Y~q$?50Qa!0~AuvmizoSqisO0azQZhAP(7rO8f zAVz!i?kdvz51HO{>g#ltodhlTrD|;}V>*Kbb$SJ!q;oz+4!h;`1T+$P^KHG~5}qvg ziok{AseWHizJ^HO8x9uVqh`#elZ6Z`H+bjf56|{&GsVtn<@2GC@{RzQZL_vRUv>qJ zK^jX6vB$uR<&E0$Lgz0UY{x0s_2I;dXhOF2pEA>qqX9a<59Q1zTSv!*UUra!0iQ#} zW_KW+awU5F2fcRB-XVk1xzAqD7;Szda~$oD_r!7zXk?FcH>j56at`Ae?=v(+2Ux49 z*N_zmgi!gSO6kmnB(!%~!O-KPUITElTL(%qWeVt~&%! z8$erN6b>Gt68@P2q5N#18P13Uf4~{XWB+?wiosgW^XH5bsj|kTr8R%;{^M^dcrErZ z7}qG$n4E!L?+!chI=4J%Vw;!^K9dO{HJ$G}SLv$zS!d{nGgWasNw zYQ-Li0Y9z-+r9v)ZRES~__RQG2WmggV_uy1x;Gy_eKov?>0WnyQ#Pr17msXdmmeX_ zFC-B|UwSE;8Vz6WOJI}{NiS`9uizSjo<3K9J)X*SD#449A?`O)DXfhI#7d!1!7wkw zKN=J&zT&xbIlXf}S+cUSMxrkIah1d5Kt2_4Vbe$Lj<^oX#4d&`N|&;hX*J;6ILlJg+tlT&XJT%Mc^%4?db~ow&GDSyA~a+(?+jrMAv>!^|rrO z_-^L?3r%Lk@yZ`-&#K})o1ryYHS!ZEXFJz4l zWIzZI5K9xPC*$U4apMy3@1Vs_0uF+YEKs};N~a5``RHX!LwVlfn-tWfq0|U}&`NH9 zA3T{ai4m_&t{+B+x3<3mSmp3Ye zL}AA{61?>-G#qB^NB9D)UU@NPCS{zEMrbcF8NfqB$3sm z-b00Bz1R+GCGB6`N>d{W&lcAt4i6p?XL$40NbM8cUyh1N9|Jk1DKj|-;ISjv3-8Q? z=2sPB?(y+`r-PBc$W&#eo1d&BAJ>6`YPHn3 zJ<*w~DLJOk{0uwSJ#*^mozK)@hNHN`xovL53P}4>Pw{gp#$;{+4?PsdZVM0I~^zq z_=bP0T$I8%W5hk(})CbHwkE3iPJDsmxFP9QFB(u`y_)7)5yQ+zyo!KeL; zjdT#2jiseuETv*8v-OdfDk)N~#o3y|VuR1<`k6(_VtKFNwMrx^aeXIrXgeAi&$G#` z%Tg6$A0Lv=IG45iU6MNyIEu6-eT+MiL5SAF?)G3hgg=p1x4^ANjb1D)o$sXeGv={U> zBVp2pt=RjSG94ytP`j{j9>i#%u=&Jdvi16Q^{Lf-^M)mtrYY^b8IRApG=N3Y-0=lcXtUHRt7ExT-R9gDEE*DhZ`_%qhyVT==*Z?CgNWGO zKVOrfROr@K8T1|`FwE*USYH;ag3#Uw%4F0?m)e;~l@4Yq7MaC<4}eD_WHaf?S$+1! zVgvSNGx0w;CgjViFSRGso4Qzp%r^J*?FhN9G1nOYkPzm?Ifl=$y5-SIn_e{Fs751j zdv0|_eH))xu>^?g&BikVR=rzRQ=GK-dsA+qN&3chThB}{blLmQ`TH+och4b`-_7tgSiVjBb{!GiRX1{KQofYwT{Qj#pVj`qzTxJG1)o(AO z*b(!Qtkjwh1CE9C5G(6z2Zc0VCzH8KOkz&UoSZqyUV0DorklsrE&&t9+eRVu88syW zF7FK&p+{Grv1dL-Hx~H6QENy~3d$;->3AAw^%*yHIh*H;wZh|Yh4YuIekF~yP_fl9 z&}^B@Ko5~j9gpW-XgS|vod*@Lx9NM*%kXK60MJ#^6_cPHHWxbVa{Vmv^~4+7qN{O| zJOUVXg)k1Y_mV_6#KY^-hE~m>%X%Gywd#tYgu~xOlgzv;wqaPTRedlrrG#8xtIdnd z$1J8T$b`K6maIc>N-Ej`*-?ENA4`q?uQxZ4kNL6*9>>#BL!p2Wgv+;^9F1{<79XWT zt1e$M`WZM+r$YL7`6UhGI<1`gYiA8B2jH6BtZ7hvl4RF|uMi2Z%YIiTorfI>)`%_R zFdQ#;cf`>tL)A{Wr3|U@9-26=lw-maFgySQ5x+&us@i8o-2bnyL-fkhFuK#3lZ!)D zBGoA13*n#uYh0Ey_=taN?9vDAHmT}0DyTz=Jm{yP5uyw&%iju{^d2HRD#4NpEal|p zmkD4t<#Y60Cf5G7A6227Yi&OyVwcN7qFZAfaB?=5#1mr898Jo%vTj?kTB*sNNC6MK z4!9^6j#pR=3x8!4?PtiRx5T<=_yMbZr_xuvVc|s!jEHjRm~@)@3R+CYGH8yrDS(TG zx6VRH(!s|4gKo~Jnw_$dx0MdNnPvpirHDZsqti_e>NrnllnQK>mdp1EkC1P%&{F-s zqDXZCjlE1YAyB$1piGxF?zgct8oVEX9Y9w*i%<6`L<=o1G^efL4j>U4G;4+Xx=omN zP2I$;H$dV4))w|1QHi?He%~y;ZjveW;~Wk@y7~tqLf%63fRjme`7f4V4QBnbbm`Ye zY~}{$8{(=%snA6ppVfMFtrH|oV<)C}!`9Vcw&$P8RW}SlKJ+m@_$s;)(0@(NQUK{7 zn-oGoVhckN8*G2lHGRY6Qa!(%KdhERGg_+I5Q_y8W5GFDc_J+w_Sh}gV@E8qIRoNA z7C2%xU_IVa%?M+RQ7NRi74aE9Tss@RmBgYl`JlltiDF`XEWu8>;mlKTg7|whl zQ2e4=Jd@u;bOnP7q0`N=1n-ndQ`Z1r5^!*0XDC(PR`o4cfr*)gN1))czCh?9mx*RG zrE-A8HiZkc+^We?=?RemH1^4_b%6#<4~lg9i5v2x-<>BWs-Wf&`DWgJDW&#umU0){u z5pn^-t^aUHF;_$jyS~E$5xkI8_7mK4^wbq~xTL0LOmBZc1Vy9t8KN}%S^Qn;8+%el zR*~K0O2a&%Ux|C8__3P%0<1ciw2DE!O!V`+8SXYV6K_AQvve1s3CG*)?*6Y5kPmBP zj98#npj-Stx?h9uBfkU`2gJB4Co!jr#!5A|mG0Gs5t364A4cx9Y2p zoh)S}dFI?4*AEOY>CeSbv?Gyew3#jU1g8Q0@(j*ui$*oV8-8eC5>%3=7! z6&D9Ss-nGk`e3^Bnh`F=8xB66;l(j`Hx+(MPM>wLowUuPFFKQc*uc*qBnm)LeaAbl!>KJ?qGkw1^b1GfLgLv((d=-;0VGk_NXX4*e@97a|x0rp?bGo}wN zPWzW~y$(#2&{|v{#U=F{QM3@7Ra78-e|G&ML%;`fXc{zoC_g?jzMF-#ROJv|&@wCp z`3*Qd72h!en`Xg=bXCD-vrFlE(eAjv_iGYM!#J$;j`KXQtP4xDBCevhLF}fb$r`Y~ z%fUq-do8%7v(5%ohi8~PT3=bOVx|T%&f3iRpY$mty(LDB)VXY35CJF}_*%G*q|3H~ zexI{-VP#m^b=5L}yY)f7TaqM2LhxCgT+@ry2oM~7L-d;ok*8M%r94=L**@|9 zFPu9Z@lQ_%{N`)u|IyaoSNPv=#VKrTVgdU%1py=RrO%Vsx{YjqRHjn-qcUfU!^Q7? zXvkFxU`wef~HeV*m=a5Y2*TxNEk4I-suH8vxF8~|pc zMp7Yjt%#GK%WFYDGkuy|d+$XuBhKF8IJ<5D&yD$R^DD%1?54u;&hQ+t6R3Z-9z_=# zopn?w;jAdttvLs52Z9hs*GU7a$>lr5xX%i}IaAjKQeBH&Hij!4tLB%}d0n(yypdB3 z%{KcKfX**~-3WM(-X}?-C{nzALUr8&1d$X37+wX155U(Pbpq_>^*rgyk1HI@;Bi?m z-D;}Y9mgb36aRe1XhvWp*UjqDMI7hWVZ=;E`GHZ+0SfBnN?J@rB`wj{7BFFf;mJ2k zbxmTvbU5rrjqeU0;!^xan>#B>4%{h!E^>sTRsz_+-Z@}k8%KvnYIqK2Y-&xGB?v;9%+BeHP|*@+Kb3Z>J2x}^E;;r6Zaf5%N530lAnka%FGm;h!DcAFf^oemi;{k}i{0G-3ZrlRRE=y_3|rP z_QwZw*p`#p`RhUkb)CvJuIChEX21pXJP#B^0<5xuERn+BOyuqEd7&$8wblOoOR0Zu z*1OmL^%{QU{IAy#C=6+j zmUZ3h>1?;4>XGm9*rH;XvSufFuU$^0+Y;~s8+<>@>iD(`BeXrhh%k!yDDF!)z5MFz zmW-Bm$fv<7C1RN5T*hB&bQ=bCM%&51jlTnQfDs+U(fWYg!q=yy4=$cwevr`$Ve4`Q zc$H8jtbIjUMG|TxKa2wX@4wl5nJXgxcYXOEjco^Q6*VlY50j|KJ55iQRFt5?Ps!_! z?#jyO1NWsAr#n~)3^H|9?y!pNB472TN1)bYmbNj~)Nd!#0J_UQK=MUZQ7vm#n46Xm zVaTwqI20z{a{~BK5t5|;@ln`JfY(lrTK_lU08kU$f``7b{N?C;)&Y#w_vNwu`n(u` zRe;Y044#7B!8VJ^nWYR4L%) z0G|P^4uN{%rA;AD;`u9qOK#2b0O-Cj(SqLY9xtAkF-O^H|2iiOl)={>sV zC9%5n0N<()DLPk`gl7OyZ2d&-sayKqV!`0%3{By*DI3V;4GH&A|1;0A|JMQJd>0s! zu0d(N5YD_k{on!H1`c*NWA+#s@sJC05|kc5>lBU``QZ?A*(28NzDn9sJ0GC8l1{EK zXTVIZj>W3+I0+Rd5ztRW$Qh^UE6jRuYV&qPjXf2vs-GBlu5sr^oT;y#%_Hhpb3Q^c z2cbUEk{&($rp;^4z`uh)^v>yNJ;%=cekmz=p|DOMX_&Te%DgdM@2ZTxkr-2z3aAJVpBwV^tA8)n8rULafY^#R4%9>ITP{5SZ~u1i z&IWBu_t#Z!N0$3|2u5C-6`aU;iJ zF=8Hzjpc+BEpR&dBRBD3A~P@;UADvmK@DS$y_Lxl)>RZ!(%-8>%E^x&1*VS z0YxwhsyS;uYi`qTgoH*9Mh@@cN|??f6=Epu&z4dYnn}1tdaAw&jUuF7j>4P_rDX}) zh`FTG+GS+o8X<^Av^!)by!ciiS4=vUDMA7DVCxGo{19H{$V7*@p|xD50uUjsLi5pR z_#@ste@@?p83l5+#doKU+8>;qP=a4>(bCV)e7#2gCP@I1HjvvW#_GlFaC;tzde4&V zfbBX87(dZonVn1h30rwq<0lH^z%$~X$^QTOa9&-?zYFZh&@klqc$-Xjl^r95LCzDi z=oXSJRZ7TVe^t@(T;Q0DarP&9k;US7(H|alS`R9c06K+b$D3x*_Jz2d+2W9-*b_fl zRg{NBuxY3~gkK;aa0ib$;1=?vF%_T@nnQq)$?LQery%69oqz@;b4z8@hKfZ7cfTbidBj4( zprp)i$X@Ns#o`#@l;KnkRI=O>LgJ}PNH^a=<@YB2rOZI5s0wyw4wPIaSE>Er0G*UP zg3IbL=A?(0K>h>-Uv1iP<9>wBd_U zT2je500hbOgcwG=CLOeo{^3knN`coiWH)b|VXgP71qeiXdhL0o74iY-0_BJVo)@mQ z6(z1yP`&TgL%wzglk&S_uzt)*R_3Dj?*z8<{8TPPN`O1|p0!zd-cQtfjSi_*PMp>A zhD-wvFb;>EQrX0}F4WI=hUQayh|;+~*GtEL$$oKm>W7pgW3CrI-z()gVU6k`n#A;^LcOUUCL6RuZD=ZfAh-Q&`^{eHRM z`>^s~?0{4YOsi*}kz_WPuAVS2$C0q2Mv#O{+$B_8HUXmK@k7U40 z@>yWb=GU+2qvmcIIc(2jrES2}=kF)|>kW$6<#M!Y$*i;cM&?h=S*ALb1XM-BUrOLF z>3kjLX1~kS7+GF@#2UxZ^jHn!IFo{dN4=jr4s&VVJm7LI*UvUcIf;^`ZM5vAXKmr) zv|idfcLnmZN{7r0YLnT`zYlMx2zv42gr<|Jvl%ap_y>KnKr;<6C9boaE>J7ueT9T$ z&%4xoveazM7kM6l?!L&8sN+CH^~$OVX#NcECe{9FUq?Nv zHDfhF`yo39Oqd$eahA?L)QI5X^RWC;Je-t|LdmL#^vAg1?A+A1MH82=W1W|~)pHDF z)CaRR8m&gs4j21l6M52c$IfNLhZS+G6911+1Y=krr;Mubi)SD@mz4m_HhuyYpug$`nn9gF)a{ z$rAor!L@!u+A*K&i&L)KEf{C=hkvF%$M?~RQ|n+3Rr z%@!|wA!mSW2HqZm|3E-0SMFK?%DME{Gr+9#IK3IAVF#9RJYRvw=~X=!tX)tbjvD0e zzDxZ|uIVT`b2J{^|EXCh0_0W|t5k@Roe;iv$4r%~Y2kA@C~%y}i4^m-cj#KbKIAe> z0ZL9ykrerhng+)^Y`S2;vIRT)VwFhhU?w6H#7_?MOD z#$d}T(Cy0HT;OgdD5Czi%da;XoK8Q=Jr>)h?9Qtbl5Deku7bJ&&pnW##sU|ci-R_6 zbM_^7SM>%x|1RrbUP8`d#sbO@;n#P5ST&yJ7!Lcd-zno^K?bODzwsS*476R`o~{|m zqGD0?O|-sayK7?$W;1cvs8yOxTJgDv93uw;SxQSes>Gw~$*ji?nIrDdfNL*6fSC&7 zYevbD^tM(@G_*)(*eDOM z>kZ8v6^9u;J)9wEZ~A`}zOS~pzAt1D+O+L$pRK{Kd*yz6QfOYD>7$j^Ow)!#t&mZE zcyfKni5wIQGWJ%g_O~>-ht4H`(-G&CAofGX-@-onhvosBA4)=5{M%k1RND7_fq%hV z69B7NWaf6V)C6E}Qgy$cUZoM%(wMG9Iy?*lNMyvzJKKmJzss|8LsO=V+d;!USXTqN zEk5yQ`1OAfB7KB^M}pUFq)R)CU$Qzmmy^?)^~@9G?ymN06a;jpPk=bwO2Q$A*$R)1 z4effX25&H4(sc2|mxKc+7}jZ6U%&YYq~?Zb`j(yjrTzE$k?_V+mP?JAV3JH9LG1&$ z2_#ZY(Hz~EPw5onRoZnH1)t@yVeAC#$= znUuWEPTgMu(2tz0W(nsgrXGnWWvFBW)}NP&g((3M zCc*;Aj}X)FVZzlW2d=|V;m-`HSz@0skn!lBmoAwgutO*TsBqmJ7BfEeld^d%B61?! zv4V{Bs$)bv)4T9PA_B1*%1C~(X_%hrn2K{+$U&+(DX3R=vSGUkI|LtXizvVGCiUg1rkc z(9Tg}h52my$&r~rx7Dbwpug=FNKE-E@l!s~0l%DIr>R-Tfl0dxzReflm!{ZfK^4w; z-gGcf!-|dGZ4$T)DtHQ1tj$@vBkiovqx$c1xqgx(YpP2d&1hs>oSO#I#^$r~{p!iP z6J?lJG=Jv6kY>UAyDX(^1lYWWX&15G>rMb z;!-@HZsc(6`1=*Giigl}G)}NUZ}n)omvI4kV~5E9Q=FjwV~k{Yz~#^&AMz7Hd#`Fi zRY02~xxO>X2Sj7>**(TXN{JF|EA2{_Pm)*+)yN6jJ+~JCSNnK+hgfHfse@=?{_C5g z<%YxY--|A=elf06i2GlsD_;7YM{8czK2KrvMP(k@y4}75^zU=u$cz(k{j%J>hg#h( z*+ZVsX)-5ZWtDEO}lxL z(tS>Xu}J<1-+QPEN&G#x=Bj`V^(&1|A&l9bSbUpBESs2%;nN^vY|PO02!y)8QnmPR zeN1&%J-E%@o8`1!iu6@@+5$K$)yE1)abfQl!BXoD7Slx5>PuFZX8X9ZwlD47Kn$X( zsASm96nYa@^${(DqL74B56br?rfuGEOe01~5!H=xsin^`L5;Q zvs6j&H&X*?Qg^CeyBHsTgw{q$=wAPW+m&Dl9Xp(t1pYeG#Hf$9knZIL2{Yg* z!*(-#I@j&raC^d0dbOX+27SZpKaunxDmdDOAX_zioT#rN(d4{&#bPM&j{O4^Oo3E8 zsnk~h9#84!u)Dx18kym;$>$-dvT^dz!}$a@6Bcl~XKdN2Tij&#C^fmA<1jtP%K!XI z=oM0e>vr8N*sHkiNZoe>x?ns>=P6msITf3I#14&(^K*-NWRdRv_pEbqQ`eQ@Ol+hDgZhrA^33rf0Jr*8cA)H6YxihT%p#ymv z!PMb>`6OmLqTpb!)VDviU*-*{hTjIi@zye$HPG`elTG=QpRGl3ypsBTynNnKGNNF& zW?!MljD?ewl*4?bi>YvLq)Aq1#dUZ)OcI}SdE3^lSgj&z8I#Ogvr^Hex#Ma5^*&=7 z-kGw>s`pEY+@<%+W^|IL4>P;Ph->N&;oal}QbI=ke)Gx2uknz!2TCk%==Cz0Yb_wM zB-<2*5Ntx#%P^C&bFkFJKsT1&aTT~cT_x*M%qrB(?wYBGfJ)T9ceB;ur5^a>1U-s` zLjt_C>hV!aOTJ-J@oDR_D+%WXY>x z7rhJRX3eWlVy>GEz+x^b&FM`jW>&H)jrh2;GU`vS-7EPf9?$S^dNGh@MkA5SdWqZl zNTV69T{&;C8y4nHUGyJ7AF3#No)Q*!CZK2es&;wMqkOs9ZZ^{z0>r8&{}lGy{!rBi z_%MI?v1h*A=seC1-l!_ZTEA`ECX1b!94N{7)4`(um$bR!NVM^^Cq0wc#+zRW91=A^jGZl>7B|n9P=M z5@-y*0Dg5CSk@G7WB1gXipX^4>xR`tAHl;CAbt4z_zub0Bu0nl1_ES%+EhPc$6~2= zdi*jm;#10(MvZw1CQbq83lx6xi|&xmqxs8>0n^25FFy9GodQ6* z!t-UNZ#2c{difS|bl+Ohk;{WP6jF=wY@{JLTIV&Z`}3PWg6env01PqL;8w$3GFR)x z6WndZE9y#%Y2FY@=f^w39O3tD(9Oz);}zN+xvu9(b%*>7-cK{v#GHOb{#>aibZR+Y z09Ppqn!P?WGh<7k`>V`5u zb}H8FguOz-?R0i4>2INwq>@YHj^$kj_HOhO>s33>OUD(y*KRiGyBc40YcL&Zhh;C1 z7KFUx^zqZw8)^#ZN@u$edu0x;_5X4|H2ol4_WG;?nb9;jo$ z=eMNQ;Wm754VXF?YVC$+u2btEo#Kl2SY)&gAIc6)C9yt2LrK`vlV*k^st&<(T}48%J{dK;{i8+IB*|)>(zF*wTb7= zLWMiKDDt25BNeB##hbXKjX*M*sOQ8#h<@i?;(zfF=|TvAITbofENCwj3v^RJf;63ih4?lQuf=nlNEB0yxE8p*+}Nt%fjj8*#&gwVR=rHqLHnFuZ+F}PmZm?WN6F&+m5+7N)gCXX$k-dBk%Zd&Kj))fCE*{@vQr!Bz?~o(l z7W=F5=8d3`(JLI~Rg zQPPEjlbLWXHaDqV1~PY;D*5;YJgx)CTAeSQBX;(dZOHixAwkgk*4Bad_95~q;N_=d zms`?bc!)Z!?#I_$9<3{Ng>v6swralG+ay%D*}FDauSNz7LU7VR4O6lSWg6vO%H|^H zj0N8SQa&x?hLl&d9_2GM5j!-6FOb2zk@yPvxV#Y{vJo}&2K0wuC?bgZ4CJ@%N9O1_ zTRaA*rt_e6U8|D2FNFxpBai8~`_rLepe&Z8kFu0#P<~8SUMk}``Y>9nmml78+MK*D=G16QNu(g=b ziy|Y#qrDquEz@U$vw$qh-b&=3n&JHW^Cjte06KB7+(Wre2c+meiXx0T{E3pr^q_*2 zCSUh=0Y#2LqtxZWVs>H%voh^5J%ye$S^*q2nea4azCVLI_eiPz==W+908TgP@{Bdm zMJ$y7q!^Ps>5qR2&AGk`=>#a`64Lj;i1Pw6PG2S3BODTW5#D=`7FX9s!0WskrexDS z3==oQO|jj3&}+6&WmNwYH=!efwZA}acikIi)#|g&m2917| z;|c6;bFF(qrh&reLPwd`kBx8rjT@kl+!x|LWa_YP6QH_;5}akIPWH zamOdlpI@{;a{IrYcM|;d#CaCn+g%pYu^SpQ+AVMmGS32p5L_^`VY*nt>#~3yl`Bq(ru(0*C%2% zA`sGKDM)@!wd7gr4sf=-4pw68({5RYu}N4x`8Mek@JxsNX26EQVbxPaOse@O@~VK_ zB{Y7U_hR(($5-l&PC}Vyt&-6jlvE?$nomsQ-sCv1R2hVphDh-`r!2I;DR;FX!~^kt z5@82?ajdI*Aa<2k(J~?em?+}M0Y-^~N>TM4Ex#7TIS>{y)JxyxzuZ)N`s@>qxNhx( zTWBbiJkWvf%(8vwDAIi0ldn|LTaP>Z`BV$rd)Khws9;&ReJ{Mgtb9h1&n zAO^w+J1n^d)`ik*r2Ctv_4YYD_AfFU&o5eqO{1*FvgF%zDSaojz50#1JV)c4iZahg zYd)-;tgiVeYsf1O$SLtGb7{{cxrR;mE&9T}M_sytY;Kp7q`%_Q=?#em+n@caZc}(WbxCKy$kUrk%l8hegrr5P&xL3;d49 zVy7#yrE*s^n4?FC;4cd5bxc;se|Lw(~VupjLEnu#*EAP(;7@G=k z*&Rv<2?{-3JO_B)fp=-xnI!7~Ewn(m96>3&J8v(?=-sWlPydbLGLQ8G!}O2qJJT_2 z9FwcQTKR|4f&25H&al!^g=pY?{CM6t$+Fz3_CZHB^APE5?@RVuby#?z_>UUpem-8u zRn%}e_3@9KnToG7Q-<}xVUV;MHa!&#yj1Mw3V2XY_a-)2TQ7Hhy%ai|3yDE*1`etQ zenGfD^;uLM!BJ2K|Bp&~_pdYQ#t}4_1!cW*3b+Ru+{)a9_84X4Tz(abmkOC2ncPA? zT9F~bWNR(vapQ-36Zzy(_^E?MNnsd|laV|+802!3@sEwVzH}xnW*0ZUywDJkHZawxc90`aLtuC+Xk|ck7jQT*i|!zdq8aR2V5nSSqvO zPZv5k!{zxf7pX-ZRAq!m)H(uDylnoMzu)ERN*4TlRq>C!+`jxgIO01txAWr8CGBV) z4YC7IKgu-_%K$X@M$2WT4c=!tk3ShRQy%BnAMkQZRNlBxp%_NXD+&g&;_;3ThHqAz ze!-rvDT=;i4#@_NVG<@(#FL3?Mvytm41-K056zM6;$_IryRPN8@%ZsFd|2V1mD9G| z-}>h~l3R>vb^LzrA-ysnzj-0R9z0zA(l4&nr0_>ZK}2?!O#Rd^<3pO8WHf{=zh4+ivjcW0-@)iz_Z|8fgjUA(aW4DysNwR5|?DS&RKDx^~GCwu!j) zyl{eeg>X6Y@+KJNyZ$t_zZQeG_8q*GiaVOvb|k|hJw5!j*hmV< z8rtiAz2bna@;gZ;$%~)S&ck8w^{>XyzK=ZqED+Aa4Cw`cv%G_c4Eo)t*3^SlI$cf| z?XjzCe)NOeOI^;wI5h@6*TDPvVU~3Z@wX0AsZx#?-}j7W8+l1)^e5md{;bc+*@Iuy z^Ly0|JGvR{*+T+^zhQ?3!EL6hEcM5UGnM+1Fm49?A@Xbf?72I3R|bS?1VNjo)Hbva zMs_J>{42eoDiQS#tKG|o$1VQNNh)#?T}(t0aZpWkL-anN>f!`blFhgc^(`0)BalEk zBL0&ZEn_E{H!*x@TO^))O$6`BKy>y;fBv z_v0UK%ZE4R=Xpy(iW$uX{owR!0=c9|{ljodzxtQ2jQwv3E#xNfoD;?Hrhe!jb=JN# zdwT)qV+1@nMJLo!v9jQoeil<7is}h#je26qOw?;l3kwG1^Qk<4db{;_w0+MlS3R0z zIqBK0`pA5K^jN=h%xc{Hbnu2*@3c?u+#J%8mVVUL0Poye2_c47>=O z2f`Gbb0xG{9d8!H6~Xb5JU%NqTftUPB_GI2^IX{5>UxC7bNv47ZarUm%WMh~+6P=ShDpC)Z+u?Q^9G{w0CA3awnBZ9c%YO- zN|oqXT1yKY$=3VPfKa7)A1>r$88{QK*Uk-3=?5o;!OMfLY6HijBLA6a+SL}-rHT_b zvwe3@DD;XZDRJ2MRobfeq#%TxrY*f{ z2V0x^*QT^{c}rXV=#QVMxX5C{QLj4?rPq&vNjpq9j6yi+xyx}WUBGp$3lLX%Mad21 z{#qq#dMN*PhJgT>iE@=Fsz72S4~4y1tT87Z*3;)XMQz{x^{&EsD6YioJ@0=2H%>^B z7=kfGqtq|Bv_ivivR%>l6BM8r0Q~St37WZnkKL)h3Vs0BJ$`twS}V-2+vw*O161S; zzS7m;IzDqA1rD+YZhyoJqdJ#*YrB~j6lqXb>cqj=uRq)mms+1vywBou^crY>CrLAR zg~a$0(db*H!S#q{UGO0AbdQ}h zI4{aF!Rs11$5l`Q&=4hEhcWlRmyJ~6cr*EP!oM8AS43`m`!e~HbL zBY-iGFUmGUjo7>UItl+wS(rs)(k_4jsgAg=W;xHaKCw6?a0LOFpn33_0bqb%XQo=A zpl@fPeui}mCEn=oUd8klf}0@m`a~Oz0L$Rlldmhz-SVW1$Vi9|ybKA~+m)?y@T!?6 z@0W7%y=GU(lkL>3-noEF+^mRCcz5>k@pO^Rs4IvcvFG+$J9ApSO;2%200bjv1oBaP zFTWA4f^xZif`D@pCt`)#{p7SVJ162bw{J`R_~FAtxUr=Tk_{4oEa%J}=XgCeGvCpj ztdcjB&7H4w8OhB6=6MBYG%Po~RkGdt^dSTZAc}rO%H_0URYZZLHK=~1tP)`)Z%Ua7 znwwJFXTfeGYJ#d!?ggIj9KvjfxaL&J$GTN7oe>O6dH+L!)R5{<9 z-rL)|6nZLMeNhn4fc)c2b}%7^%GA%|s^-hTq3oHc@eY4P^0@v+0%qD$mj{Zg%4e9k zuY0%3c~@tfKfi^0Lfp`ZOtl)7`oJFKi4*}PKhWQGzP|Q4QUv5U_xu9dpS*A0=P-!< z=J0U{XI-r}%;J0ZrKAIBTNN1r^2CF?ueq%K6(u=uO&= _}jN*r0Rge7K9vv8P}^ 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 z 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�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±2Lw6j$Ze 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 0" + ) + params = [] + if location: + query += " AND location LIKE ?" + params.append(f"%{location}%") + try: + cursor.execute(query, params) + rows = cursor.fetchall() + return [dict(row) for row in rows], None + except sqlite3.Error as e: + return None, f"Error getting available hotels: {e}" + + def book_a_room( + self, conn, hotel_id, guest_name, check_in_date, check_out_date, num_rooms + ): + """Books a room in a specified hotel.""" + cursor = conn.cursor() + try: + cursor.execute( + "SELECT available_rooms, price_per_night FROM hotels WHERE id = ?", + (hotel_id,), + ) + hotel_info = cursor.fetchone() + + if not hotel_info: + return None, f"Hotel with ID {hotel_id} not found." + + available_rooms, price_per_night = ( + hotel_info["available_rooms"], + hotel_info["price_per_night"], + ) + if available_rooms < num_rooms: + return ( + None, + ( + f"Not enough rooms available at hotel ID {hotel_id}. Available:" + f" {available_rooms}, Requested: {num_rooms}" + ), + ) + + try: + check_in_dt = datetime.datetime.strptime(check_in_date, "%Y-%m-%d") + check_out_dt = datetime.datetime.strptime(check_out_date, "%Y-%m-%d") + except ValueError: + return None, "Invalid date format. Please use YYYY-MM-DD." + + num_nights = (check_out_dt - check_in_dt).days + if num_nights <= 0: + return None, "Check-out date must be after check-in date." + + total_price = num_rooms * price_per_night * num_nights + + cursor.execute( + "UPDATE hotels SET available_rooms = ? WHERE id = ?", + (available_rooms - num_rooms, hotel_id), + ) + + cursor.execute( + """ + INSERT INTO bookings (hotel_id, guest_name, check_in_date, check_out_date, num_rooms, total_price) + VALUES (?, ?, ?, ?, ?, ?) + """, + ( + hotel_id, + guest_name, + check_in_date, + check_out_date, + num_rooms, + total_price, + ), + ) + + booking_id_int = cursor.lastrowid + custom_booking_id = f"HB-{booking_id_int}" + + cursor.execute( + "UPDATE bookings SET custom_booking_id = ? WHERE id = ?", + (custom_booking_id, booking_id_int), + ) + + conn.commit() + return custom_booking_id, None + except sqlite3.Error as e: + conn.rollback() + return None, f"Error booking room: {e}" + + def get_booking_details(self, cursor, booking_id=None, guest_name=None): + """Retrieves details for a specific booking.""" + query = """ + SELECT + b.custom_booking_id, + h.name AS hotel_name, + h.location AS hotel_location, + b.guest_name, + b.check_in_date, + b.check_out_date, + b.num_rooms, + b.total_price + FROM + bookings b + JOIN + hotels h ON b.hotel_id = h.id + """ + params = [] + result_type = "single" + + if booking_id: + query += " WHERE b.custom_booking_id = ?" + params.append(booking_id) + elif guest_name: + query += " WHERE LOWER(b.guest_name) LIKE LOWER(?)" + params.append(f"%{guest_name}%") + result_type = "list" + else: + return ( + None, + ( + "Please provide either a booking ID or a guest name to retrieve" + " booking details." + ), + ) + + try: + cursor.execute(query, params) + rows = cursor.fetchall() + + if not rows: + return ( + None, + ( + f"No booking found for the given criteria (ID: {booking_id}," + f" Name: {guest_name})." + ), + ) + + bookings = [dict(row) for row in rows] + return bookings if result_type == "list" else bookings[0], None + except sqlite3.Error as e: + return None, f"Error getting booking details: {e}" diff --git a/contributing/samples/authn-adk-all-in-one/hotel_booker_app/main.py b/contributing/samples/authn-adk-all-in-one/hotel_booker_app/main.py new file mode 100644 index 0000000000..bd4c771140 --- /dev/null +++ b/contributing/samples/authn-adk-all-in-one/hotel_booker_app/main.py @@ -0,0 +1,266 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from functools import wraps +import os +import sqlite3 + +from dotenv import load_dotenv +from flask import Flask +from flask import g +from flask import jsonify +from flask import request +from hotelbooker_core import HotelBooker +import jwt +import requests + +# Load environment variables from .env file +load_dotenv() + +app = Flask(__name__) +# Instantiate the core logic class +hotel_booker = HotelBooker() +app.config["DATABASE"] = hotel_booker.db_name + +OIDC_CONFIG_URL = os.environ.get( + "OIDC_CONFIG_URL", "http://localhost:5000/.well-known/openid-configuration" +) + +# Cache for OIDC discovery and JWKS +oidc_config = None +jwks = None + + +def get_oidc_config(): + """Fetches and caches the OIDC configuration.""" + global oidc_config + if oidc_config is None: + try: + response = requests.get(OIDC_CONFIG_URL) + response.raise_for_status() + oidc_config = response.json() + except requests.exceptions.RequestException as e: + return None, f"Error fetching OIDC config: {e}" + return oidc_config, None + + +def get_jwks(): + """Fetches and caches the JSON Web Key Set (JWKS).""" + global jwks + if jwks is None: + config, error = get_oidc_config() + if error: + return None, error + jwks_uri = config.get("jwks_uri") + if not jwks_uri: + return None, "jwks_uri not found in OIDC configuration." + try: + response = requests.get(jwks_uri) + response.raise_for_status() + jwks = response.json() + except requests.exceptions.RequestException as e: + return None, f"Error fetching JWKS: {e}" + return jwks, None + + +def get_db(): + """Manages a per-request database connection.""" + if "db" not in g: + g.db = sqlite3.connect(app.config["DATABASE"]) + g.db.row_factory = sqlite3.Row + return g.db + + +@app.teardown_appcontext +def close_db(exception): + db = g.pop("db", None) + if db is not None: + db.close() + + +def is_token_valid(token: str): + """ + Validates a JWT token using the public key from the OIDC jwks_uri. + """ + if not token: + return False, "Token is empty." + + jwks_data, error = get_jwks() + if error: + return False, f"Failed to get JWKS: {error}" + + try: + header = jwt.get_unverified_header(token) + kid = header.get("kid") + if not kid: + return False, "Token header missing 'kid'." + + key = next( + (k for k in jwks_data.get("keys", []) if k.get("kid") == kid), None + ) + if not key: + return False, "No matching key found in JWKS." + + public_key = jwt.algorithms.RSAAlgorithm.from_jwk(key) + + # The decoding happens just so that we are able to + # check if there were any exception decoding the token + # which indicate it being not valid. + # Also you could have verify_aud and verify_iss as False + # But when they are true issuer and audience are needed in the jwt.decode call + # they are checked against the values from the token + # idealy token validation should also check whether the API being called is part of + # audience so for example localhost:8081/api should cover localhost:8081/api/hotels + # but should not cover localhost:8000/admin + # so this middleware (decorator - is_token_valid, can check the request url and do that check, but we are + # skipping that as the audience will always be localhost:8081) + decoded_token = jwt.decode( + token, + key=public_key, + issuer="http://localhost:5000", + audience="http://localhost:8081", + algorithms=[header["alg"]], + options={"verify_exp": True, "verify_aud": True, "verify_iss": True}, + ) + return True, "Token is valid." + except jwt.ExpiredSignatureError: + return False, "Token has expired." + except jwt.InvalidAudienceError: + return False, "Invalid audience." + except jwt.InvalidIssuerError: + return False, "Invalid issuer." + except jwt.InvalidTokenError as e: + return False, f"Invalid token: {e}" + except Exception as e: + return False, f"An unexpected error occurred during token validation: {e}" + + +# Decorator to check for a valid access token on protected routes +def token_required(f): + @wraps(f) + def decorated_function(*args, **kwargs): + auth_header = request.headers.get("Authorization") + if not auth_header or not auth_header.startswith("Bearer "): + return { + "error": True, + "data": None, + "message": "Missing or invalid Authorization header.", + }, 401 + + token = auth_header.split(" ")[1] + is_valid, message = is_token_valid(token) + + if not is_valid: + return {"error": True, "data": None, "message": message}, 401 + + return f(*args, **kwargs) + + return decorated_function + + +@app.route("/hotels", methods=["GET"]) +@token_required +def get_hotels(): + location = request.args.get("location") + hotels, error_message = hotel_booker.get_available_hotels( + get_db().cursor(), location + ) + + if hotels is not None: + return ( + jsonify({ + "error": False, + "data": hotels, + "message": "Successfully retrieved hotels.", + }), + 200, + ) + else: + return jsonify({"error": True, "data": None, "message": error_message}), 500 + + +@app.route("/book", methods=["POST"]) +@token_required +def book_room(): + conn = get_db() + data = request.json + hotel_id = data.get("hotel_id") + guest_name = data.get("guest_name") + check_in_date = data.get("check_in_date") + check_out_date = data.get("check_out_date") + num_rooms = data.get("num_rooms") + + if not all([hotel_id, guest_name, check_in_date, check_out_date, num_rooms]): + return ( + jsonify({ + "error": True, + "data": None, + "message": "Missing required booking information.", + }), + 400, + ) + + booking_id, error_message = hotel_booker.book_a_room( + conn, hotel_id, guest_name, check_in_date, check_out_date, num_rooms + ) + + if booking_id: + return ( + jsonify({ + "error": False, + "data": {"booking_id": booking_id}, + "message": "Booking successful!", + }), + 200, + ) + else: + return jsonify({"error": True, "data": None, "message": error_message}), 400 + + +@app.route("/booking_details", methods=["GET"]) +@token_required +def get_details(): + conn = get_db() + booking_id = request.args.get("booking_id") + guest_name = request.args.get("guest_name") + + if not booking_id and not guest_name: + return ( + jsonify({ + "error": True, + "data": None, + "message": "Please provide either a booking ID or a guest name.", + }), + 400, + ) + + details, error_message = hotel_booker.get_booking_details( + get_db().cursor(), booking_id=booking_id, guest_name=guest_name + ) + + if details: + return ( + jsonify({ + "error": False, + "data": details, + "message": "Booking details retrieved successfully.", + }), + 200, + ) + else: + return jsonify({"error": True, "data": None, "message": error_message}), 404 + + +if __name__ == "__main__": + app.run(debug=True, port=8081) diff --git a/contributing/samples/authn-adk-all-in-one/hotel_booker_app/openapi.yaml b/contributing/samples/authn-adk-all-in-one/hotel_booker_app/openapi.yaml new file mode 100644 index 0000000000..8adda49623 --- /dev/null +++ b/contributing/samples/authn-adk-all-in-one/hotel_booker_app/openapi.yaml @@ -0,0 +1,229 @@ +openapi: 3.0.0 +info: + title: Hotel Booker API + description: A simple API for managing hotel bookings, with a custom client credentials authentication flow. + version: 1.0.0 +servers: + - url: http://127.0.0.1:8081 +paths: + /hotels: + get: + summary: Get available hotels + description: Retrieves a list of available hotels, optionally filtered by location. + security: + - BearerAuth: [] + parameters: + - in: query + name: location + schema: + type: string + description: The city to filter hotels by (e.g., 'New York'). + responses: + '200': + description: Successfully retrieved hotels. + content: + application/json: + schema: + type: object + properties: + error: + type: boolean + example: false + data: + type: array + items: + $ref: '#/components/schemas/Hotel' + message: + type: string + example: "Successfully retrieved hotels." + '401': + description: Unauthorized. Invalid or expired token. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + /book: + post: + summary: Book a room + description: Books a room in a specified hotel. + security: + - BearerAuth: [] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/BookingRequest' + responses: + '200': + description: Booking successful. + content: + application/json: + schema: + type: object + properties: + error: + type: boolean + example: false + data: + type: object + properties: + booking_id: + type: string + example: "HB-1" + message: + type: string + example: "Booking successful!" + '400': + description: Bad request. Missing information or invalid booking details. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Unauthorized. Invalid or expired token. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + /booking_details: + get: + summary: Get booking details + description: Retrieves details for a specific booking by ID or guest name. + security: + - BearerAuth: [] + parameters: + - in: query + name: booking_id + schema: + type: string + description: The custom booking ID (e.g., 'HB-1'). + - in: query + name: guest_name + schema: + type: string + description: The name of the guest to search for (partial and case-insensitive). + responses: + '200': + description: Booking details retrieved successfully. + content: + application/json: + schema: + type: object + properties: + error: + type: boolean + example: false + data: + type: object + properties: + custom_booking_id: + type: string + example: "HB-1" + hotel_name: + type: string + example: "Grand Hyatt" + hotel_location: + type: string + example: "New York" + guest_name: + type: string + example: "John Doe" + check_in_date: + type: string + example: "2025-10-01" + check_out_date: + type: string + example: "2025-10-05" + num_rooms: + type: integer + example: 1 + total_price: + type: number + format: float + example: 1000.0 + message: + type: string + example: "Booking details retrieved successfully." + '400': + description: Bad request. Missing parameters. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '401': + description: Unauthorized. Invalid or expired token. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' + '404': + description: Booking not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ErrorResponse' +components: + securitySchemes: + BearerAuth: + type: http + scheme: bearer + bearerFormat: CustomAuthToken + schemas: + ErrorResponse: + type: object + properties: + error: + type: boolean + example: true + data: + type: object + nullable: true + message: + type: string + example: "Invalid access token." + Hotel: + type: object + properties: + id: + type: integer + example: 1 + name: + type: string + example: "Grand Hyatt" + location: + type: string + example: "New York" + available_rooms: + type: integer + example: 10 + price_per_night: + type: number + format: float + example: 250.0 + BookingRequest: + type: object + properties: + hotel_id: + type: integer + example: 1 + guest_name: + type: string + example: "John Doe" + check_in_date: + type: string + format: date + example: "2025-10-01" + check_out_date: + type: string + format: date + example: "2025-10-05" + num_rooms: + type: integer + example: 1 + required: + - hotel_id + - guest_name + - check_in_date + - check_out_date + - num_rooms \ No newline at end of file diff --git a/contributing/samples/authn-adk-all-in-one/idp/app.py b/contributing/samples/authn-adk-all-in-one/idp/app.py new file mode 100644 index 0000000000..86388efc1e --- /dev/null +++ b/contributing/samples/authn-adk-all-in-one/idp/app.py @@ -0,0 +1,569 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import base64 +from datetime import datetime +from datetime import timedelta +from datetime import timezone +import hashlib +import json +import logging +import os +import time +from urllib.parse import urlencode +from urllib.parse import urlparse +from urllib.parse import urlunparse + +from dotenv import load_dotenv +from flask import Flask +from flask import jsonify +from flask import redirect +from flask import render_template +from flask import request +from flask import session +from flask_cors import CORS +import jwt + +logging.basicConfig(level=logging.DEBUG) + + +# Load environment variables from .env file +load_dotenv() + +app = Flask(__name__, template_folder="templates") +CORS(app) +app.secret_key = os.urandom(24) + +# Load JWKS and private key from files and environment variables +try: + with open("jwks.json", "r") as f: + JWKS = json.load(f) +except FileNotFoundError: + JWKS = None + logging.error( + "jwks.json not found. The server will not be able to generate JWTs." + ) + +PRIVATE_KEY = os.getenv("PRIVATE_KEY") +GENERATE_JWT = os.getenv("GENERATE_JWT", "true").lower() == "true" + +if GENERATE_JWT and not PRIVATE_KEY: + raise ValueError( + "PRIVATE_KEY environment variable must be set when GENERATE_JWT is true." + ) + +# A simple user registry for demonstration purposes +USER_REGISTRY = { + "john.doe": { + "password": "password123", + "sub": "john.doe", + "profile": "I am John Doe.", + "email": "john.doe@example.com", + }, + "jane.doe": { + "password": "password123", + "sub": "jane.doe", + "profile": "I am Jane Doe.", + "email": "jane.doe@example.com", + }, +} + +OPENID_CONFIG = { + "issuer": "http://localhost:5000", + "authorization_endpoint": "http://localhost:5000/authorize", + "token_endpoint": "http://localhost:5000/generate-token", + "jwks_uri": "http://localhost:5000/jwks.json", + "response_types_supported": ["code", "token", "id_token", "id_token token"], + "grant_types_supported": [ + "client_credentials", + "implicit", + "authorization_code", + ], + "token_endpoint_auth_methods_supported": ["client_secret_post"], + "scopes_supported": ["openid", "profile", "email", "api:read", "api:write"], + "id_token_signing_alg_values_supported": ["RS256"], + "subject_types_supported": ["public"], + "code_challenge_methods_supported": ["S256"], +} + +# A simple client registry +CLIENT_REGISTRY = { + "abc123": { + "client_secret": "secret123", + "allowed_scopes": [ + "api:read", + "api:write", + "openid", + "profile", + "email", + ], + "redirect_uri": [ + "http://localhost:8081/callback_implicit.html", + "http://localhost:8081/callback_authcode.html", + "http://localhost:8081/callback_pkce.html", + "http://localhost:8000/dev-ui/", + ], + "response_types": ["token", "id_token", "code"], + "grant_types": ["client_credentials", "implicit", "authorization_code"], + "client_name": "ADK Agent", + } +} + +# A simple "database" to store temporary authorization codes +AUTHORIZATION_CODES = {} + + +def generate_jwt(payload, key, alg="RS256"): + if not JWKS: + raise ValueError("JWKS not loaded, cannot generate JWT.") + + kid = JWKS["keys"][0]["kid"] + headers = {"kid": kid, "alg": alg} + + return jwt.encode(payload, key, algorithm=alg, headers=headers) + + +def create_access_token(client_id, scopes, user_sub=None): + if GENERATE_JWT: + payload = { + "iss": "http://localhost:5000", # who issued this token? + # aud - What client API is this token for? - please check comment in hotel booker is_token_valid + # ideally the reqeust's resource parameter (part of OAuth spec extension) + # Here is an example of such request inbound to this IDP + # GET http://localhost:5000/authorize? + # response_type=code& + # client_id=client123& + # redirect_uri=http%3A%2F%2Flocalhost%3A8000%2Fdev-ui& + # scope=openid%20profile%20api%3Aread& + # state=XYZ789& + # resource=http%3A%2F%2Flocalhost%3A8081%2Fapi + "aud": "http://localhost:8081", + "sub": user_sub if user_sub else client_id, + "exp": ( + datetime.now(timezone.utc).timestamp() + + timedelta(hours=1).total_seconds() + ), + "iat": datetime.now(timezone.utc).timestamp(), + "scope": " ".join(scopes), + } + return generate_jwt(payload, PRIVATE_KEY) + else: + return os.urandom(32).hex() + + +def create_id_token(client_id, user_data, scopes, nonce=None): + if not GENERATE_JWT: + return None + + payload = { + "iss": "http://localhost:5000", + "sub": user_data.get("sub"), + "aud": client_id, + "exp": ( + datetime.now(timezone.utc).timestamp() + + timedelta(hours=1).total_seconds() + ), + "iat": datetime.now(timezone.utc).timestamp(), + "auth_time": datetime.now(timezone.utc).timestamp(), + "email": user_data.get("email"), + "profile": user_data.get("profile"), + "scope": " ".join(scopes), + } + if nonce: + payload["nonce"] = nonce + return generate_jwt(payload, PRIVATE_KEY) + + +@app.route("/.well-known/openid-configuration") +def openid_configuration(): + return jsonify(OPENID_CONFIG) + + +@app.route("/jwks.json") +def jwks_endpoint(): + return jsonify(JWKS) + + +@app.route("/authorize", methods=["GET", "POST"]) +def authorize(): + if request.method == "GET": + client_id = request.args.get("client_id") + redirect_uri = request.args.get("redirect_uri") + client = CLIENT_REGISTRY.get(client_id) + + if not client or redirect_uri not in client.get("redirect_uri", []): + return "Invalid client or redirect URI", 400 + + auth_request = request.args.to_dict() + auth_request["client_name"] = client["client_name"] + session["auth_request"] = auth_request + return render_template("login.html", client_name=client["client_name"]) + + if request.method == "POST": + username = request.form.get("username") + password = request.form.get("password") + auth_request = session.get("auth_request") + user = USER_REGISTRY.get(username) + + if not user or user["password"] != password: + return render_template( + "login.html", + error="Invalid username or password", + client_name=auth_request["client_name"], + ) + + session["user"] = user + + return render_template("consent.html", auth_request=auth_request) + + +@app.route("/consent", methods=["POST"]) +def consent(): + auth_request = session.get("auth_request") + user = session.get("user") + + if not auth_request or not user: + return "Invalid session", 400 + + logging.debug(f"consent screen POST call auth_request => {auth_request}") + client_id = auth_request.get("client_id") + redirect_uri = auth_request.get("redirect_uri") + scopes = auth_request.get("scope", "").split(" ") + response_type = auth_request.get("response_type") + state = auth_request.get("state") + + if request.form.get("consent") == "true": + if response_type == "token id_token" or response_type == "id_token token": + access_token = create_access_token(client_id, scopes, user.get("sub")) + id_token = create_id_token(client_id, user, scopes) + + parsed = urlparse(redirect_uri) + fragment_params = { + "access_token": access_token, + "id_token": id_token, + "token_type": "Bearer", + "expires_in": 3600, + "scope": " ".join(scopes), + "state": state, + } + new_uri = urlunparse(( + parsed.scheme, + parsed.netloc, + parsed.path, + parsed.params, + parsed.query, + urlencode(fragment_params), + )) + + session.pop("auth_request", None) + session.pop("user", None) + return redirect(new_uri) + + elif response_type == "code": + auth_code = os.urandom(16).hex() + AUTHORIZATION_CODES[auth_code] = { + "client_id": client_id, + "user": user, + "scopes": scopes, + "redirect_uri": redirect_uri, + "expires_at": time.time() + 300, + "code_challenge": auth_request.get("code_challenge"), + "code_challenge_method": auth_request.get("code_challenge_method"), + } + + parsed = urlparse(redirect_uri) + query_params = {"code": auth_code, "state": state} + new_uri = urlunparse(( + parsed.scheme, + parsed.netloc, + parsed.path, + parsed.params, + urlencode(query_params), + parsed.fragment, + )) + + session.pop("auth_request", None) + session.pop("user", None) + return redirect(new_uri) + + # User denied consent or invalid response + parsed = urlparse(redirect_uri) + query_params = { + "error": "access_denied", + "error_description": "User denied access", + "state": state, + } + new_uri = urlunparse(( + parsed.scheme, + parsed.netloc, + parsed.path, + parsed.params, + urlencode(query_params), + parsed.fragment, + )) + return redirect(new_uri) + + +@app.route("/generate-token", methods=["POST"]) +def generate_token(): + auth_header = request.headers.get("Authorization") + client_id = None + client_secret = None + + # Client id and secret can come in body or in header (Authorization : Basic base64(client_id_value:client_secret_value)) + if auth_header and auth_header.startswith("Basic "): + try: + encoded_credentials = auth_header.split(" ")[1] + decoded_credentials = base64.b64decode(encoded_credentials).decode( + "utf-8" + ) + client_id, client_secret = decoded_credentials.split(":", 1) + except (IndexError, ValueError): + pass # Fallback to form data + + if not client_id or not client_secret: + client_id = request.form.get("client_id") + client_secret = request.form.get("client_secret") + + grant_type = request.form.get("grant_type") + + # logging.debug(f"Grant Type = {grant_type}") + # logging.debug(f"Request => {request.__dict__}") + + client = CLIENT_REGISTRY.get(client_id) + + if not client: + logging.error(f"invlid client {client_id}") + return ( + jsonify( + {"error": "invalid_client", "error_description": "Client not found"} + ), + 401, + ) + + if client["client_secret"] != client_secret: + logging.error(f"Client authentication failed") + return ( + jsonify({ + "error": "invalid_client", + "error_description": "Client authentication failed", + }), + 401, + ) + + if grant_type == "client_credentials": + scopes = request.form.get("scope", "").split(" ") + for scope in scopes: + if scope not in client["allowed_scopes"]: + logging.error(f"Invalid_scope") + return jsonify({"error": "invalid_scope"}), 400 + + access_token = create_access_token(client_id, scopes) + + return jsonify({ + "access_token": access_token, + "token_type": "Bearer", + "expires_in": 3600, + "scope": " ".join(scopes), + }) + + elif grant_type == "authorization_code": + code = request.form.get("code") + redirect_uri = request.form.get("redirect_uri") + code_verifier = request.form.get("code_verifier") + + auth_code_data = AUTHORIZATION_CODES.pop(code, None) + + if not auth_code_data: + logging.error(f"Invalid or expired authorization code.") + return ( + jsonify({ + "error": "invalid_grant", + "error_description": "Invalid or expired authorization code.", + }), + 400, + ) + + if ( + auth_code_data["redirect_uri"] != redirect_uri + or auth_code_data["client_id"] != client_id + ): + logging.error(f"Redirect URI or client ID mismatch") + return ( + jsonify({ + "error": "invalid_grant", + "error_description": "Redirect URI or client ID mismatch", + }), + 400, + ) + + if time.time() > auth_code_data["expires_at"]: + logging.error(f"Authorization code has expired") + return ( + jsonify({ + "error": "invalid_grant", + "error_description": "Authorization code has expired", + }), + 400, + ) + + if "code_challenge" in auth_code_data and auth_code_data["code_challenge"]: + if not code_verifier: + logging.error(f"Code verifier is required for PKCE flow.") + return ( + jsonify({ + "error": "invalid_request", + "error_description": "Code verifier is required for PKCE flow.", + }), + 400, + ) + + computed_challenge = ( + base64.urlsafe_b64encode( + hashlib.sha256(code_verifier.encode("utf-8")).digest() + ) + .decode("utf-8") + .replace("=", "") + ) + if computed_challenge != auth_code_data["code_challenge"]: + logging.error(f"PKCE code challenge mismatch.") + return ( + jsonify({ + "error": "invalid_grant", + "error_description": "PKCE code challenge mismatch.", + }), + 400, + ) + + # Create tokens based on the stored user data + user = auth_code_data["user"] + access_token = create_access_token( + client_id, auth_code_data["scopes"], user["sub"] + ) + id_token = create_id_token(client_id, user, auth_code_data["scopes"]) + + return jsonify({ + "access_token": access_token, + "id_token": id_token, + "token_type": "Bearer", + "expires_in": 3600, + "scope": " ".join(auth_code_data["scopes"]), + }) + logging.error(f"Unsupported_grant_type") + return jsonify({"error": "unsupported_grant_type"}), 400 + + +@app.route("/") +def index(): + return render_template("index.html") + + +# --- ADMIN ROUTES START --- +@app.route("/admin") +def admin_portal(): + return render_template( + "admin.html", + openid_config=OPENID_CONFIG, + user_registry=json.dumps(USER_REGISTRY), + client_registry=json.dumps(CLIENT_REGISTRY), + ) + + +@app.route("/admin/update-config", methods=["POST"]) +def admin_update_config(): + try: + data = request.json + OPENID_CONFIG["issuer"] = data.get("issuer", OPENID_CONFIG["issuer"]) + OPENID_CONFIG["authorization_endpoint"] = data.get( + "authorization_endpoint", OPENID_CONFIG["authorization_endpoint"] + ) + OPENID_CONFIG["jwks_uri"] = data.get("jwks_uri", OPENID_CONFIG["jwks_uri"]) + OPENID_CONFIG["token_endpoint"] = data.get( + "token_endpoint", OPENID_CONFIG["token_endpoint"] + ) + return jsonify( + {"success": True, "message": "OpenID configuration updated."} + ) + except Exception as e: + return jsonify({"success": False, "message": str(e)}), 400 + + +@app.route("/admin/add-user", methods=["POST"]) +def admin_add_user(): + try: + data = request.json + username = data.get("username") + password = data.get("password") + sub = data.get("sub") + profile = data.get("profile") + email = data.get("email") + + if not username or not password or not sub: + return ( + jsonify({ + "success": False, + "message": "Username, password, and sub are required.", + }), + 400, + ) + + USER_REGISTRY[username] = { + "password": password, + "sub": sub, + "profile": profile, + "email": email, + } + return jsonify({"success": True, "message": f"User '{username}' added."}) + except Exception as e: + return jsonify({"success": False, "message": str(e)}), 400 + + +@app.route("/admin/add-client", methods=["POST"]) +def admin_add_client(): + try: + data = request.json + client_id = data.get("client_id") + client_secret = data.get("client_secret") + allowed_scopes = data.get("allowed_scopes", "").split() + redirect_uri = data.get("redirect_uri", "").split() + response_types = data.get("response_types", "").split() + grant_types = data.get("grant_types", "").split() + client_name = data.get("client_name") + + if not client_id or not client_name: + return ( + jsonify({ + "success": False, + "message": "Client ID and Client Name are required.", + }), + 400, + ) + + CLIENT_REGISTRY[client_id] = { + "client_secret": client_secret, + "allowed_scopes": allowed_scopes, + "redirect_uri": redirect_uri, + "response_types": response_types, + "grant_types": grant_types, + "client_name": client_name, + } + return jsonify({"success": True, "message": f"Client '{client_id}' added."}) + except Exception as e: + return jsonify({"success": False, "message": str(e)}), 400 + + +# --- ADMIN ROUTES END --- + +if __name__ == "__main__": + app.run(port=5000) diff --git a/contributing/samples/authn-adk-all-in-one/idp/sample.env b/contributing/samples/authn-adk-all-in-one/idp/sample.env new file mode 100644 index 0000000000..825c230807 --- /dev/null +++ b/contributing/samples/authn-adk-all-in-one/idp/sample.env @@ -0,0 +1,15 @@ +GENERATE_JWT=true + +# Steps - +# 1. ssh-keygen -t rsa -b 2048 -m PEM -f private_key.pem +# 2. When asked about passphrase please press enter (empty passphrase) +# 3. openssl rsa -in private_key.pem -pubout > pubkey.pub +# 4. Generate the jwks.json content using https://jwkset.com/generate and this public key (choose key algorithm RS256 and Key use Signature) +# 5. Update the jwks.json with the jwks key created in 4 + +# Add key from step 1 here +# make sure you add it in single line. You can use the following command to get a single line key +# cat private_key.pem | tr -d "\n" + +PRIVATE_KEY="" + diff --git a/contributing/samples/authn-adk-all-in-one/idp/sample.jwks.json b/contributing/samples/authn-adk-all-in-one/idp/sample.jwks.json new file mode 100644 index 0000000000..127a7b346b --- /dev/null +++ b/contributing/samples/authn-adk-all-in-one/idp/sample.jwks.json @@ -0,0 +1,5 @@ +{ + "keys": [ + "Replace with JWKS from jwkset.com/generate" + ] +} \ No newline at end of file diff --git a/contributing/samples/authn-adk-all-in-one/idp/templates/admin.html b/contributing/samples/authn-adk-all-in-one/idp/templates/admin.html new file mode 100644 index 0000000000..e7b0fb5748 --- /dev/null +++ b/contributing/samples/authn-adk-all-in-one/idp/templates/admin.html @@ -0,0 +1,210 @@ + + + + + + IDP Admin Portal + + + + +

+ + + + + \ No newline at end of file diff --git a/contributing/samples/authn-adk-all-in-one/idp/templates/consent.html b/contributing/samples/authn-adk-all-in-one/idp/templates/consent.html new file mode 100644 index 0000000000..5996353483 --- /dev/null +++ b/contributing/samples/authn-adk-all-in-one/idp/templates/consent.html @@ -0,0 +1,51 @@ + + + + + + +Consent + + + + + + + + \ No newline at end of file diff --git a/contributing/samples/authn-adk-all-in-one/idp/templates/login.html b/contributing/samples/authn-adk-all-in-one/idp/templates/login.html new file mode 100644 index 0000000000..c460ec41c1 --- /dev/null +++ b/contributing/samples/authn-adk-all-in-one/idp/templates/login.html @@ -0,0 +1,49 @@ + + + + + + +Login + + + + + + + + \ No newline at end of file diff --git a/contributing/samples/authn-adk-all-in-one/requirements.txt b/contributing/samples/authn-adk-all-in-one/requirements.txt new file mode 100644 index 0000000000..6cd3c4bb52 --- /dev/null +++ b/contributing/samples/authn-adk-all-in-one/requirements.txt @@ -0,0 +1,6 @@ +google-adk==1.12 +Flask==3.1.1 +flask-cors==6.0.1 +python-dotenv==1.1.1 +PyJWT[crypto]==2.10.1 +requests==2.32.4 \ No newline at end of file diff --git a/contributing/samples/bigquery/README.md b/contributing/samples/bigquery/README.md index ea6c70a2fd..960b6f40c2 100644 --- a/contributing/samples/bigquery/README.md +++ b/contributing/samples/bigquery/README.md @@ -9,23 +9,26 @@ distributed via the `google.adk.tools.bigquery` module. These tools include: Fetches BigQuery dataset ids present in a GCP project. -1. `get_dataset_info` +2. `get_dataset_info` Fetches metadata about a BigQuery dataset. -1. `list_table_ids` +3. `list_table_ids` Fetches table ids present in a BigQuery dataset. -1. `get_table_info` +4. `get_table_info` Fetches metadata about a BigQuery table. -1. `execute_sql` +5. `get_job_info` + Fetches metadata about a BigQuery job. - Runs a SQL query in BigQuery. +5. `execute_sql` -1. `ask_data_insights` + Runs or dry-runs a SQL query in BigQuery. + +6. `ask_data_insights` Natural language-in, natural language-out tool that answers questions about structured data in BigQuery. Provides a one-stop solution for generating @@ -35,11 +38,23 @@ distributed via the `google.adk.tools.bigquery` module. These tools include: the official [Conversational Analytics API documentation](https://cloud.google.com/gemini/docs/conversational-analytics-api/overview) for instructions. -1. `forecast` +7. `forecast` Perform time series forecasting using BigQuery's `AI.FORECAST` function, leveraging the TimesFM 2.0 model. +8. `analyze_contribution` + + Perform contribution analysis in BigQuery by creating a temporary + `CONTRIBUTION_ANALYSIS` model and then querying it with + `ML.GET_INSIGHTS` to find top contributors for a given metric. + +9. `detect_anomalies` + + Perform time series anomaly detection in BigQuery by creating a temporary + `ARIMA_PLUS` model and then querying it with + `ML.DETECT_ANOMALIES` to detect time series data anomalies. + ## How to use Set up environment variables in your `.env` file for using diff --git a/contributing/samples/bigquery/agent.py b/contributing/samples/bigquery/agent.py index 1b8e4d9c21..56a7367c8d 100644 --- a/contributing/samples/bigquery/agent.py +++ b/contributing/samples/bigquery/agent.py @@ -22,8 +22,11 @@ from google.adk.tools.bigquery.config import WriteMode import google.auth -# Define an appropriate credential type -CREDENTIALS_TYPE = AuthCredentialTypes.OAUTH2 +# Define the desired credential type. +# By default use Application Default Credentials (ADC) from the local +# environment, which can be set up by following +# https://cloud.google.com/docs/authentication/provide-credentials-adc. +CREDENTIALS_TYPE = None # Define an appropriate application name BIGQUERY_AGENT_NAME = "adk_sample_bigquery_agent" @@ -39,7 +42,7 @@ ) if CREDENTIALS_TYPE == AuthCredentialTypes.OAUTH2: - # Initiaze the tools to do interactive OAuth + # Initialize the tools to do interactive OAuth # The environment variables OAUTH_CLIENT_ID and OAUTH_CLIENT_SECRET # must be set credentials_config = BigQueryCredentialsConfig( diff --git a/contributing/samples/built_in_multi_tools/README.md b/contributing/samples/built_in_multi_tools/README.md new file mode 100644 index 0000000000..a31bd6a8d4 --- /dev/null +++ b/contributing/samples/built_in_multi_tools/README.md @@ -0,0 +1,14 @@ +This agent is to demonstrate that the built-in google search tool and the +VertexAiSearchTool can be used together with other tools, even though the model +has the limitation that built-in tool cannot be used by other tools. + +It is achieved by the workarounds added in https://github.com/google/adk-python/blob/4485379a049a5c84583a43c85d444ea1f1ba6f12/src/google/adk/agents/llm_agent.py#L124-L149. + +To run this agent, set the environment variable `VERTEXAI_DATASTORE_ID` +(e.g. +`projects/{project}/locations/{location}/collections/{collection}/dataStores/{dataStore}`) +and use `adk web`. + +You can follow +https://cloud.google.com/generative-ai-app-builder/docs/create-data-store-es +to set up the datastore. diff --git a/contributing/samples/built_in_multi_tools/__init__.py b/contributing/samples/built_in_multi_tools/__init__.py new file mode 100644 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/built_in_multi_tools/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/built_in_multi_tools/agent.py b/contributing/samples/built_in_multi_tools/agent.py new file mode 100644 index 0000000000..3eb9ce8bef --- /dev/null +++ b/contributing/samples/built_in_multi_tools/agent.py @@ -0,0 +1,65 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import random + +from dotenv import load_dotenv +from google.adk import Agent +from google.adk.tools.google_search_tool import GoogleSearchTool +from google.adk.tools.tool_context import ToolContext +from google.adk.tools.vertex_ai_search_tool import VertexAiSearchTool + +load_dotenv(override=True) + +VERTEXAI_DATASTORE_ID = os.getenv("VERTEXAI_DATASTORE_ID") +if not VERTEXAI_DATASTORE_ID: + raise ValueError("VERTEXAI_DATASTORE_ID environment variable not set") + + +def roll_die(sides: int, tool_context: ToolContext) -> int: + """Roll a die and return the rolled result. + + Args: + sides: The integer number of sides the die has. + + Returns: + An integer of the result of rolling the die. + """ + result = random.randint(1, sides) + if "rolls" not in tool_context.state: + tool_context.state["rolls"] = [] + + tool_context.state["rolls"] = tool_context.state["rolls"] + [result] + return result + + +root_agent = Agent( + model="gemini-2.5-pro", + name="hello_world_agent", + description="A hello world agent with multiple tools.", + instruction=""" + You are a helpful assistant which can help user to roll dice and search for information. + - Use `roll_die` tool to roll dice. + - Use `VertexAISearchTool` to search for Google Agent Development Kit (ADK) information in the datastore. + - Use `google_search` to search for general information. + """, + tools=[ + roll_die, + VertexAiSearchTool( + data_store_id=VERTEXAI_DATASTORE_ID, bypass_multi_tools_limit=True + ), + GoogleSearchTool(bypass_multi_tools_limit=True), + ], +) diff --git a/contributing/samples/cache_analysis/README.md b/contributing/samples/cache_analysis/README.md new file mode 100644 index 0000000000..350baccf65 --- /dev/null +++ b/contributing/samples/cache_analysis/README.md @@ -0,0 +1,114 @@ +# Cache Analysis Research Assistant + +This sample demonstrates ADK context caching features with a comprehensive research assistant agent designed to test both Gemini 2.0 Flash and 2.5 Flash context caching capabilities. The sample showcases the difference between explicit ADK caching and Google's built-in implicit caching. + +## Key Features + +- **App-Level Cache Configuration**: Context cache settings applied at the App level +- **Large Context Instructions**: Over 4200 tokens in system instructions to trigger context caching thresholds +- **Comprehensive Tool Suite**: 7 specialized research and analysis tools +- **Multi-Model Support**: Compatible with any Gemini model, automatically adapts experiment type +- **Performance Metrics**: Detailed token usage tracking including `cached_content_token_count` + +## Cache Configuration + +```python +ContextCacheConfig( + min_tokens=4096, + ttl_seconds=600, # 10 mins for research sessions + cache_intervals=3, # Maximum invocations before cache invalidation +``` + +## Usage + +### Run Cache Experiments + +The `run_cache_experiments.py` script compares caching performance between models: + +```bash +# Test any Gemini model - script automatically determines experiment type +python run_cache_experiments.py --output results.json + +# Examples: +python run_cache_experiments.py gemini-2.0-flash-001 --output gemini_2_0_results.json +python run_cache_experiments.py gemini-2.5-flash --output gemini_2_5_results.json +python run_cache_experiments.py gemini-1.5-flash --output gemini_1_5_results.json + +# Run multiple iterations for averaged results +python run_cache_experiments.py --repeat 3 --output averaged_results.json +``` + +### Direct Agent Usage + +```bash +# Run the agent directly +adk run contributing/samples/cache_analysis/agent.py + +# Web interface for debugging +adk web contributing/samples/cache_analysis +``` + +## Experiment Types + +The script automatically determines the experiment type based on the model name: + +### Models with "2.5" (e.g., gemini-2.5-flash) +- **Explicit Caching**: ADK explicit caching + Google's implicit caching +- **Implicit Only**: Google's built-in implicit caching alone +- **Measures**: Added benefit of explicit caching over Google's built-in implicit caching + +### Other Models (e.g., gemini-2.0-flash-001, gemini-1.5-flash) +- **Cached**: ADK explicit context caching enabled +- **Uncached**: No caching (baseline comparison) +- **Measures**: Raw performance improvement from explicit caching vs no caching + +## Tools Included + +1. **analyze_data_patterns** - Statistical analysis and pattern recognition in datasets +2. **research_literature** - Academic and professional literature research with citations +3. **generate_test_scenarios** - Comprehensive test case generation and validation strategies +4. **benchmark_performance** - System performance measurement and bottleneck analysis +5. **optimize_system_performance** - Performance optimization recommendations and strategies +6. **analyze_security_vulnerabilities** - Security risk assessment and vulnerability analysis +7. **design_scalability_architecture** - Scalable system architecture design and planning + +## Expected Results + +### Performance vs Cost Trade-offs + +**Note**: This sample uses a tool-heavy agent that may show different performance characteristics than simple text-based agents. + +### Performance Improvements +- **Simple Text Agents**: Typically see 30-70% latency reduction with caching +- **Tool-Heavy Agents**: May experience higher latency due to cache setup overhead, but still provide cost benefits +- **Gemini 2.5 Flash**: Compares explicit ADK caching against Google's built-in implicit caching + +### Cost Savings +- **Input Token Cost**: 75% reduction for cached content (25% of normal cost) +- **Typical Savings**: 30-60% on input costs for multi-turn conversations +- **Tool-Heavy Workloads**: Cost savings often outweigh latency trade-offs + +### Token Metrics +- **Cached Content Token Count**: Non-zero values indicating successful cache hits +- **Cache Hit Ratio**: Proportion of tokens served from cache vs fresh computation + +## Troubleshooting + +### Zero Cached Tokens +If `cached_content_token_count` is always 0: +- Verify model names match exactly (e.g., `gemini-2.0-flash-001`) +- Check that cache configuration `min_tokens` threshold is met +- Ensure proper App-based configuration is used + +### Session Errors +If seeing "Session not found" errors: +- Verify `runner.app_name` is used for session creation +- Check App vs Agent object usage in InMemoryRunner initialization + +## Technical Implementation + +This sample demonstrates: +- **Modern App Architecture**: App-level cache configuration following ADK best practices +- **Integration Testing**: Comprehensive cache functionality validation +- **Performance Analysis**: Detailed metrics collection and comparison methodology +- **Error Handling**: Robust session management and cache invalidation handling diff --git a/contributing/samples/cache_analysis/__init__.py b/contributing/samples/cache_analysis/__init__.py new file mode 100644 index 0000000000..3d21a562d3 --- /dev/null +++ b/contributing/samples/cache_analysis/__init__.py @@ -0,0 +1,17 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent + +__all__ = ['agent'] diff --git a/contributing/samples/cache_analysis/agent.py b/contributing/samples/cache_analysis/agent.py new file mode 100644 index 0000000000..b1a25bf88a --- /dev/null +++ b/contributing/samples/cache_analysis/agent.py @@ -0,0 +1,854 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Cache Analysis Research Assistant Agent. + +This agent is designed to test ADK context caching features with a large prompt +that exceeds 2048 tokens to meet both implicit and explicit cache requirements. +""" + +import random +import time +from typing import Any +from typing import Dict +from typing import List +from typing import Optional + +from dotenv import load_dotenv +from google.adk import Agent +from google.adk.agents.context_cache_config import ContextCacheConfig +from google.adk.apps.app import App + +# Load environment variables from .env file +load_dotenv() + + +def analyze_data_patterns( + data: str, analysis_type: str = "comprehensive" +) -> Dict[str, Any]: + """Analyze data patterns and provide insights. + + This tool performs comprehensive data analysis including statistical analysis, + trend identification, anomaly detection, correlation analysis, and predictive + modeling. It can handle various data formats including CSV, JSON, XML, and + plain text data structures. + + Args: + data: The input data to analyze. Can be structured (JSON, CSV) or + unstructured text data. For structured data, include column headers + and ensure proper formatting. For time series data, include + timestamps in ISO format. + analysis_type: Type of analysis to perform. Options include: + - "comprehensive": Full statistical and trend analysis + - "statistical": Basic statistical measures only + - "trends": Time series and trend analysis + - "anomalies": Outlier and anomaly detection + - "correlations": Correlation and relationship analysis + - "predictive": Forecasting and prediction models + + Returns: + Dictionary containing analysis results with the following structure: + { + "summary": "High-level summary of findings", + "statistics": {...}, # Statistical measures + "trends": {...}, # Trend analysis results + "anomalies": [...], # List of detected anomalies + "correlations": {...}, # Correlation matrix and relationships + "predictions": {...}, # Forecasting results if applicable + "recommendations": [...] # Actionable insights and recommendations + } + """ + # Simulate analysis processing time + time.sleep(0.1) + + return { + "summary": f"Analyzed {len(data)} characters of {analysis_type} data", + "statistics": { + "data_points": len(data.split()), + "analysis_type": analysis_type, + "processing_time": "0.1 seconds", + }, + "recommendations": [ + "Continue monitoring data trends", + "Consider additional data sources for correlation analysis", + ], + } + + +def research_literature( + topic: str, + sources: Optional[List[str]] = None, + depth: str = "comprehensive", + time_range: str = "recent", +) -> Dict[str, Any]: + """Research academic and professional literature on specified topics. + + This tool performs comprehensive literature research across multiple academic + databases, professional journals, conference proceedings, and industry reports. + It can analyze research trends, identify key authors and institutions, extract + methodological approaches, and synthesize findings across multiple sources. + + The tool supports various research methodologies including systematic reviews, + meta-analyses, bibliometric analysis, and citation network analysis. It can + identify research gaps, emerging trends, and future research directions in + the specified field of study. + + Args: + topic: The research topic or query. Can be specific (e.g., "context caching + in large language models") or broad (e.g., "machine learning optimization"). + Use specific keywords and phrases for better results. Boolean operators + (AND, OR, NOT) are supported for complex queries. + sources: List of preferred sources to search. Options include: + - "academic": Peer-reviewed academic journals and papers + - "conference": Conference proceedings and presentations + - "industry": Industry reports and white papers + - "patents": Patent databases and intellectual property + - "preprints": ArXiv, bioRxiv and other preprint servers + - "books": Academic and professional books + depth: Research depth level: + - "comprehensive": Full literature review with detailed analysis + - "focused": Targeted search on specific aspects + - "overview": High-level survey of the field + - "technical": Deep technical implementation details + time_range: Time range for literature search: + - "recent": Last 2 years + - "current": Last 5 years + - "historical": All available time periods + - "decade": Last 10 years + + Returns: + Dictionary containing research results: + { + "summary": "Executive summary of findings", + "key_papers": [...], # Most relevant papers found + "authors": [...], # Key researchers in the field + "institutions": [...], # Leading research institutions + "trends": {...}, # Research trends and evolution + "methodologies": [...], # Common research approaches + "gaps": [...], # Identified research gaps + "citations": {...}, # Citation network analysis + "recommendations": [...] # Future research directions + } + """ + if sources is None: + sources = ["academic", "conference", "industry"] + + # Simulate research processing + time.sleep(0.2) + + return { + "summary": f"Conducted {depth} literature research on '{topic}'", + "key_papers": [ + f"Recent advances in {topic.lower()}: A systematic review", + f"Methodological approaches to {topic.lower()} optimization", + f"Future directions in {topic.lower()} research", + ], + "trends": { + "emerging_topics": [f"{topic} optimization", f"{topic} scalability"], + "methodology_trends": [ + "experimental validation", + "theoretical analysis", + ], + }, + "recommendations": [ + f"Focus on practical applications of {topic}", + "Consider interdisciplinary approaches", + "Investigate scalability challenges", + ], + } + + +def generate_test_scenarios( + system_type: str, + complexity: str = "medium", + coverage: Optional[List[str]] = None, + constraints: Optional[Dict[str, Any]] = None, +) -> Dict[str, Any]: + """Generate comprehensive test scenarios for system validation. + + This tool creates detailed test scenarios, test cases, and validation protocols + for various types of systems including software applications, AI models, + distributed systems, and hardware components. It supports multiple testing + methodologies including unit testing, integration testing, performance testing, + security testing, and user acceptance testing. + + The tool can generate both positive and negative test cases, edge cases, + boundary conditions, stress tests, and failure scenarios. It incorporates + industry best practices and testing frameworks to ensure comprehensive + coverage and reliable validation results. + + Args: + system_type: Type of system to test. Supported types include: + - "software": Software applications and services + - "ai_model": Machine learning and AI model testing + - "distributed": Distributed systems and microservices + - "database": Database systems and data integrity + - "api": API endpoints and web services + - "hardware": Hardware components and embedded systems + - "security": Security systems and protocols + complexity: Test complexity level: + - "basic": Essential functionality tests only + - "medium": Standard test suite with common scenarios + - "advanced": Comprehensive testing with edge cases + - "expert": Exhaustive testing with stress and chaos scenarios + coverage: List of testing areas to cover: + - "functionality": Core feature testing + - "performance": Speed, throughput, and scalability + - "security": Authentication, authorization, data protection + - "usability": User experience and interface testing + - "compatibility": Cross-platform and integration testing + - "reliability": Fault tolerance and recovery testing + constraints: Testing constraints and requirements: + { + "time_limit": "Maximum testing duration", + "resources": "Available testing resources", + "environment": "Testing environment specifications", + "compliance": "Regulatory or standard requirements" + } + + Returns: + Dictionary containing generated test scenarios: + { + "overview": "Test plan summary and objectives", + "scenarios": [...], # Detailed test scenarios + "test_cases": [...], # Individual test cases + "edge_cases": [...], # Boundary and edge conditions + "performance_tests": [...], # Performance validation tests + "security_tests": [...], # Security and vulnerability tests + "automation": {...}, # Test automation recommendations + "metrics": {...}, # Success criteria and metrics + "schedule": {...} # Recommended testing timeline + } + """ + if coverage is None: + coverage = ["functionality", "performance", "security"] + if constraints is None: + constraints = {"time_limit": "standard", "resources": "adequate"} + + # Simulate test generation + time.sleep(0.15) + + num_scenarios = {"basic": 5, "medium": 10, "advanced": 20, "expert": 35}.get( + complexity, 10 + ) + + return { + "overview": ( + f"Generated {num_scenarios} test scenarios for {system_type} system" + ), + "scenarios": [ + f"Test scenario {i+1}:" + f" {system_type} {coverage[i % len(coverage)]} validation" + for i in range(num_scenarios) + ], + "test_cases": [ + f"Verify {system_type} handles normal operations", + f"Test {system_type} error handling and recovery", + f"Validate {system_type} performance under load", + ], + "metrics": { + "coverage_target": f"{75 + complexity.index(complexity) * 5}%", + "success_criteria": "All critical tests pass", + "performance_benchmark": f"{system_type} specific benchmarks", + }, + } + + +def optimize_system_performance( + system_type: str, + current_metrics: Dict[str, Any], + target_improvements: Dict[str, Any], + constraints: Optional[Dict[str, Any]] = None, +) -> Dict[str, Any]: + """Analyze system performance and provide detailed optimization recommendations. + + This tool performs comprehensive system performance analysis including bottleneck + identification, resource utilization assessment, scalability planning, and provides + specific optimization strategies tailored to the system type and constraints. + + Args: + system_type: Type of system to optimize: + - "web_application": Frontend and backend web services + - "database": Relational, NoSQL, or distributed databases + - "ml_pipeline": Machine learning training and inference systems + - "distributed_cache": Caching layers and distributed memory systems + - "microservices": Service-oriented architectures + - "data_processing": ETL, stream processing, batch systems + - "api_gateway": Request routing and API management systems + current_metrics: Current performance metrics including: + { + "response_time_p95": "95th percentile response time in ms", + "throughput_rps": "Requests per second", + "cpu_utilization": "Average CPU usage percentage", + "memory_usage": "Memory consumption in GB", + "error_rate": "Error percentage", + "availability": "System uptime percentage" + } + target_improvements: Desired performance targets: + { + "response_time_improvement": "Target reduction in response time", + "throughput_increase": "Desired increase in throughput", + "cost_reduction": "Target cost optimization percentage", + "availability_target": "Desired uptime percentage" + } + constraints: Operational constraints: + { + "budget_limit": "Maximum budget for improvements", + "timeline": "Implementation timeline constraints", + "technology_restrictions": "Required or forbidden technologies", + "compliance_requirements": "Security/regulatory constraints" + } + + Returns: + Comprehensive optimization analysis: + { + "performance_analysis": { + "bottlenecks_identified": ["Critical performance bottlenecks"], + "root_cause_analysis": "Detailed analysis of performance issues", + "current_vs_target": "Gap analysis between current and target metrics" + }, + "optimization_recommendations": { + "infrastructure_changes": ["Hardware/cloud resource recommendations"], + "architecture_improvements": ["System design optimizations"], + "code_optimizations": ["Software-level improvements"], + "configuration_tuning": ["Parameter and setting adjustments"] + }, + "implementation_roadmap": { + "phase_1_quick_wins": ["Immediate improvements (0-2 weeks)"], + "phase_2_medium_term": ["Medium-term optimizations (1-3 months)"], + "phase_3_strategic": ["Long-term architectural changes (3-12 months)"] + }, + "expected_outcomes": { + "performance_improvements": "Projected performance gains", + "cost_implications": "Expected costs and savings", + "risk_assessment": "Implementation risks and mitigation strategies" + } + } + """ + # Simulate comprehensive performance optimization analysis + optimization_areas = [ + "Database query optimization", + "Caching layer enhancement", + "Load balancing improvements", + "Resource scaling strategies", + "Code-level optimizations", + "Infrastructure upgrades", + ] + + return { + "system_analyzed": system_type, + "optimization_areas": random.sample( + optimization_areas, k=min(4, len(optimization_areas)) + ), + "performance_score": random.randint(65, 95), + "implementation_complexity": random.choice(["Low", "Medium", "High"]), + "estimated_improvement": f"{random.randint(15, 45)}%", + "recommendations": [ + "Implement distributed caching for frequently accessed data", + "Optimize database queries and add strategic indexes", + "Configure auto-scaling based on traffic patterns", + "Implement asynchronous processing for heavy operations", + ], + } + + +def analyze_security_vulnerabilities( + system_components: List[str], + security_scope: str = "comprehensive", + compliance_frameworks: Optional[List[str]] = None, + threat_model: str = "enterprise", +) -> Dict[str, Any]: + """Perform comprehensive security vulnerability analysis and risk assessment. + + This tool conducts detailed security analysis including vulnerability identification, + threat modeling, compliance gap analysis, and provides prioritized remediation + strategies based on risk levels and business impact. + + Args: + system_components: List of system components to analyze: + - "web_frontend": User interfaces, SPAs, mobile apps + - "api_endpoints": REST/GraphQL APIs, microservices + - "database_layer": Data storage and access systems + - "authentication": User auth, SSO, identity management + - "data_processing": ETL, analytics, ML pipelines + - "infrastructure": Servers, containers, cloud services + - "network_layer": Load balancers, firewalls, CDNs + security_scope: Analysis depth: + - "basic": Standard vulnerability scanning + - "comprehensive": Full security assessment + - "compliance_focused": Regulatory compliance analysis + - "threat_modeling": Advanced threat analysis + compliance_frameworks: Required compliance standards: + ["SOC2", "GDPR", "HIPAA", "PCI-DSS", "ISO27001"] + threat_model: Threat landscape consideration: + - "startup": Basic threat model for early-stage companies + - "enterprise": Corporate threat landscape + - "high_security": Government/financial sector threats + - "public_facing": Internet-exposed systems + + Returns: + Security analysis results: + { + "vulnerability_assessment": { + "critical_vulnerabilities": ["High-priority security issues"], + "moderate_risks": ["Medium-priority concerns"], + "informational": ["Low-priority observations"], + "risk_score": "Overall security risk rating (1-10)" + }, + "threat_analysis": { + "attack_vectors": ["Potential attack methods"], + "threat_actors": ["Relevant threat actor profiles"], + "attack_likelihood": "Probability assessment", + "potential_impact": "Business impact analysis" + }, + "compliance_status": { + "framework_compliance": "Compliance percentage per framework", + "gaps_identified": ["Non-compliant areas"], + "certification_readiness": "Readiness for compliance audits" + }, + "remediation_plan": { + "immediate_actions": ["Critical fixes (0-2 weeks)"], + "short_term_improvements": ["Important fixes (1-2 months)"], + "strategic_initiatives": ["Long-term security enhancements"], + "resource_requirements": "Personnel and budget needs" + } + } + """ + # Simulate security vulnerability analysis + vulnerability_types = [ + "SQL Injection", + "Cross-Site Scripting (XSS)", + "Authentication Bypass", + "Insecure Direct Object References", + "Security Misconfiguration", + "Sensitive Data Exposure", + "Insufficient Logging", + "CSRF", + ] + + return { + "components_analyzed": len(system_components), + "critical_vulnerabilities": random.randint(0, 3), + "moderate_risks": random.randint(2, 8), + "overall_security_score": random.randint(6, 9), + "compliance_percentage": random.randint(75, 95), + "top_recommendations": [ + "Implement input validation and parameterized queries", + "Enable comprehensive security logging and monitoring", + "Review and update authentication and authorization controls", + "Conduct regular security training for development team", + ], + } + + +def design_scalability_architecture( + current_architecture: str, + expected_growth: Dict[str, Any], + scalability_requirements: Dict[str, Any], + technology_preferences: Optional[List[str]] = None, +) -> Dict[str, Any]: + """Design comprehensive scalability architecture for anticipated growth. + + This tool analyzes current system architecture and designs scalable solutions + to handle projected growth in users, data, traffic, and complexity while + maintaining performance, reliability, and cost-effectiveness. + + Args: + current_architecture: Current system architecture type: + - "monolith": Single-tier monolithic application + - "service_oriented": SOA with multiple services + - "microservices": Containerized microservice architecture + - "serverless": Function-as-a-Service architecture + - "hybrid": Mixed architecture patterns + expected_growth: Projected growth metrics: + { + "user_growth_multiplier": "Expected increase in users", + "data_volume_growth": "Projected data storage needs", + "traffic_increase": "Expected traffic growth percentage", + "geographic_expansion": "New regions/markets", + "feature_complexity": "Additional functionality scope" + } + scalability_requirements: Scalability constraints and targets: + { + "performance_sla": "Response time requirements", + "availability_target": "Uptime requirements", + "consistency_model": "Data consistency needs", + "budget_constraints": "Cost limitations", + "deployment_model": "On-premise/cloud preferences" + } + technology_preferences: Preferred or required technologies: + ["kubernetes", "aws", "microservices", "nosql", etc.] + + Returns: + Scalability architecture design: + { + "architecture_recommendation": { + "target_architecture": "Recommended architecture pattern", + "migration_strategy": "Path from current to target architecture", + "technology_stack": "Recommended technologies and frameworks" + }, + "scalability_patterns": { + "horizontal_scaling": "Auto-scaling and load distribution strategies", + "data_partitioning": "Database sharding and data distribution", + "caching_strategy": "Multi-level caching implementation", + "async_processing": "Background job and queue systems" + }, + "infrastructure_design": { + "compute_resources": "Server/container resource planning", + "data_storage": "Database and storage architecture", + "network_topology": "CDN, load balancing, and routing", + "monitoring_observability": "Logging, metrics, and alerting" + }, + "implementation_phases": { + "foundation_setup": "Core infrastructure preparation", + "service_decomposition": "Breaking down monolithic components", + "data_migration": "Database and storage transitions", + "traffic_migration": "Gradual user traffic transition" + } + } + """ + # Simulate scalability architecture design + architecture_patterns = [ + "Event-driven microservices", + "CQRS with Event Sourcing", + "Federated GraphQL architecture", + "Serverless-first design", + "Hybrid cloud architecture", + "Edge-computing integration", + ] + + return { + "recommended_pattern": random.choice(architecture_patterns), + "scalability_factor": f"{random.randint(5, 50)}x current capacity", + "implementation_timeline": f"{random.randint(6, 18)} months", + "estimated_cost_increase": f"{random.randint(20, 80)}%", + "key_technologies": random.sample( + [ + "Kubernetes", + "Docker", + "Redis", + "PostgreSQL", + "MongoDB", + "Apache Kafka", + "Elasticsearch", + "AWS Lambda", + "CloudFront", + ], + k=4, + ), + "success_metrics": [ + "Response time under load", + "Auto-scaling effectiveness", + "Cost per transaction", + "System availability", + ], + } + + +def benchmark_performance( + system_name: str, + metrics: Optional[List[str]] = None, + duration: str = "standard", + load_profile: str = "realistic", +) -> Dict[str, Any]: + """Perform comprehensive performance benchmarking and analysis. + + This tool conducts detailed performance benchmarking across multiple dimensions + including response time, throughput, resource utilization, scalability limits, + and system stability under various load conditions. It supports both synthetic + and realistic workload testing with configurable parameters and monitoring. + + The benchmarking process includes baseline establishment, performance profiling, + bottleneck identification, capacity planning, and optimization recommendations. + It can simulate various user patterns, network conditions, and system configurations + to provide comprehensive performance insights. + + Args: + system_name: Name or identifier of the system to benchmark. Should be + specific enough to identify the exact system configuration + being tested. + metrics: List of performance metrics to measure: + - "latency": Response time and request processing delays + - "throughput": Requests per second and data processing rates + - "cpu": CPU utilization and processing efficiency + - "memory": Memory usage and allocation patterns + - "disk": Disk I/O performance and storage operations + - "network": Network bandwidth and communication overhead + - "scalability": System behavior under increasing load + - "stability": Long-term performance and reliability + duration: Benchmarking duration: + - "quick": 5-10 minutes for rapid assessment + - "standard": 30-60 minutes for comprehensive testing + - "extended": 2-4 hours for stability and endurance testing + - "continuous": Ongoing monitoring and measurement + load_profile: Type of load pattern to simulate: + - "constant": Steady, consistent load throughout test + - "realistic": Variable load mimicking real usage patterns + - "peak": High-intensity load testing for capacity limits + - "stress": Beyond-capacity testing for failure analysis + - "spike": Sudden load increases to test elasticity + + Returns: + Dictionary containing comprehensive benchmark results: + { + "summary": "Performance benchmark executive summary", + "baseline": {...}, # Baseline performance measurements + "results": {...}, # Detailed performance metrics + "bottlenecks": [...], # Identified performance bottlenecks + "scalability": {...}, # Scalability analysis results + "recommendations": [...], # Performance optimization suggestions + "capacity": {...}, # Capacity planning insights + "monitoring": {...} # Ongoing monitoring recommendations + } + """ + if metrics is None: + metrics = ["latency", "throughput", "cpu", "memory"] + + # Simulate benchmarking + time.sleep(0.3) + + return { + "summary": f"Completed {duration} performance benchmark of {system_name}", + "baseline": { + "avg_latency": f"{random.uniform(50, 200):.2f}ms", + "throughput": f"{random.randint(100, 1000)} requests/sec", + "cpu_usage": f"{random.uniform(20, 80):.1f}%", + }, + "results": { + metric: f"Measured {metric} performance within expected ranges" + for metric in metrics + }, + "recommendations": [ + f"Optimize {system_name} for better {metrics[0]} performance", + f"Consider scaling {system_name} for higher throughput", + "Monitor performance trends over time", + ], + } + + +# Create the cache analysis research assistant agent +cache_analysis_agent = Agent( + name="cache_analysis_assistant", + model="gemini-2.0-flash-001", + description=""" + Advanced Research and Analysis Assistant specializing in comprehensive system analysis, + performance benchmarking, literature research, and test scenario generation for + technical systems and AI applications. + """, + instruction=""" + + You are an expert Research and Analysis Assistant with deep expertise across multiple + technical domains, specializing in comprehensive system analysis, performance optimization, + security assessment, and architectural design. Your role encompasses both strategic planning + and tactical implementation guidance for complex technical systems. + + **Core Competencies and Expertise Areas:** + + **Data Analysis & Pattern Recognition:** + - Advanced statistical analysis including multivariate analysis, time series forecasting, + regression modeling, and machine learning applications for pattern discovery + - Trend identification across large datasets using statistical process control, anomaly + detection algorithms, and predictive modeling techniques + - Root cause analysis methodologies for complex system behaviors and performance issues + - Data quality assessment and validation frameworks for ensuring analytical integrity + - Visualization design principles for effective communication of analytical findings + - Business intelligence and reporting strategies for different stakeholder audiences + + **Academic & Professional Research:** + - Systematic literature reviews following PRISMA guidelines and meta-analysis techniques + - Citation network analysis and research impact assessment using bibliometric methods + - Research gap identification through comprehensive domain mapping and trend analysis + - Synthesis methodologies for integrating findings from diverse research sources + - Research methodology design including experimental design, survey methods, and case studies + - Peer review processes and academic publication strategies for research dissemination + - Industry research integration including white papers, technical reports, and conference proceedings + - Patent landscape analysis and intellectual property research for innovation assessment + + **Test Design & Validation:** + - Comprehensive test strategy development following industry frameworks (ISTQB, TMMI, TPI) + - Test automation architecture design including framework selection and implementation strategies + - Quality assurance methodologies encompassing functional, non-functional, and security testing + - Risk-based testing approaches for optimizing test coverage within resource constraints + - Continuous integration and deployment testing strategies for DevOps environments + - Performance testing including load, stress, volume, and endurance testing protocols + - Usability testing methodologies and user experience validation frameworks + - Compliance testing for regulatory requirements across different industries + + **Performance Engineering & Optimization:** + - System performance analysis using APM tools, profiling techniques, and monitoring strategies + - Capacity planning methodologies for both current needs and future growth projections + - Scalability assessment including horizontal and vertical scaling strategies + - Resource optimization techniques for compute, memory, storage, and network resources + - Database performance tuning including query optimization, indexing strategies, and partitioning + - Caching strategies implementation across multiple layers (application, database, CDN) + - Load balancing and traffic distribution optimization for high-availability systems + - Performance budgeting and SLA definition for service-level agreements + + **Security & Compliance Analysis:** + - Comprehensive security risk assessment including threat modeling and vulnerability analysis + - Security architecture review and design for both defensive and offensive security perspectives + - Compliance framework analysis for standards including SOC2, GDPR, HIPAA, PCI-DSS, ISO27001 + - Incident response planning and security monitoring strategy development + - Security testing methodologies including penetration testing and security code review + - Privacy impact assessment and data protection strategy development + - Security training program design for technical and non-technical audiences + - Cybersecurity governance and policy development for organizational security posture + + **System Architecture & Design:** + - Distributed systems design including microservices, service mesh, and event-driven architectures + - Cloud architecture design for AWS, Azure, GCP with multi-cloud and hybrid strategies + - Scalability patterns implementation including CQRS, Event Sourcing, and saga patterns + - Database design and data modeling for both relational and NoSQL systems + - API design following REST, GraphQL, and event-driven communication patterns + - Infrastructure as Code (IaC) implementation using Terraform, CloudFormation, and Ansible + - Container orchestration with Kubernetes including service mesh and observability + - DevOps pipeline design encompassing CI/CD, monitoring, logging, and alerting strategies + + **Research Methodology Framework:** + + **Systematic Approach:** + - Begin every analysis with clear problem definition, success criteria, and scope boundaries + - Establish baseline measurements and define key performance indicators before analysis + - Use structured analytical frameworks appropriate to the domain and problem type + - Apply scientific methods including hypothesis formation, controlled experimentation, and validation + - Implement peer review processes and cross-validation techniques when possible + - Document methodology transparently to enable reproducibility and peer verification + + **Information Synthesis:** + - Integrate quantitative data with qualitative insights for comprehensive understanding + - Cross-reference multiple authoritative sources to validate findings and reduce bias + - Identify conflicting information and analyze reasons for discrepancies + - Synthesize complex technical concepts into actionable business recommendations + - Maintain awareness of information currency and source reliability + - Apply critical thinking to distinguish correlation from causation in analytical findings + + **Quality Assurance Standards:** + - Implement multi-stage review processes for all analytical outputs + - Use statistical significance testing and confidence intervals where appropriate + - Clearly distinguish between established facts, supported inferences, and speculative conclusions + - Provide uncertainty estimates and risk assessments for all recommendations + - Include limitations analysis and recommendations for additional research or data collection + - Ensure all analysis follows industry best practices and professional standards + + **Communication and Reporting Excellence:** + + **Audience Adaptation:** + - Tailor communication style to technical level and role of the intended audience + - Provide executive summaries for strategic decision-makers alongside detailed technical analysis + - Use progressive disclosure to present information at appropriate levels of detail + - Include visual elements and structured formats to enhance comprehension + - Anticipate questions and provide preemptive clarification on complex topics + + **Documentation Standards:** + - Follow structured reporting templates appropriate to the analysis type + - Include methodology sections that enable reproduction of analytical work + - Provide clear action items with priority levels and implementation timelines + - Include risk assessments and mitigation strategies for all recommendations + - Maintain version control and change tracking for iterative analytical processes + + **Tool Utilization Guidelines:** + + When users request analysis or research, strategically leverage the available tools: + + **For Data Analysis Requests:** + - Use analyze_data_patterns for statistical analysis, trend identification, and pattern discovery + - Apply appropriate statistical methods based on data type, sample size, and research questions + - Provide confidence intervals and statistical significance testing where applicable + - Include data visualization recommendations and interpretation guidance + + **For Literature Research:** + - Use research_literature for comprehensive academic and professional literature reviews + - Focus on peer-reviewed sources while including relevant industry reports and white papers + - Provide synthesis of findings with identification of research gaps and conflicting viewpoints + - Include citation analysis and research impact assessment when relevant + + **For Testing Strategy:** + - Use generate_test_scenarios for comprehensive test planning and validation protocol design + - Balance test coverage with practical constraints including time, budget, and resource limitations + - Include both functional and non-functional testing considerations + - Provide automation recommendations and implementation guidance + + **For Performance Analysis:** + - Use benchmark_performance for detailed performance assessment and optimization analysis + - Include both current performance evaluation and future scalability considerations + - Provide specific, measurable recommendations with expected impact quantification + - Consider cost implications and return on investment for optimization recommendations + + **For System Optimization:** + - Use optimize_system_performance for comprehensive system improvement strategies + - Include both technical optimizations and operational process improvements + - Provide phased implementation approaches with quick wins and long-term strategic initiatives + - Consider interdependencies between system components and potential unintended consequences + + **For Security Assessment:** + - Use analyze_security_vulnerabilities for comprehensive security risk evaluation + - Include both technical vulnerabilities and procedural/operational security gaps + - Provide risk-prioritized remediation plans with business impact consideration + - Include compliance requirements and regulatory considerations + + **For Architecture Design:** + - Use design_scalability_architecture for strategic technical architecture planning + - Consider both current requirements and future growth projections + - Include technology stack recommendations with rationale and trade-off analysis + - Provide migration strategies and implementation roadmaps for architecture transitions + + **Professional Standards and Ethics:** + + **Analytical Integrity:** + - Maintain objectivity and avoid confirmation bias in all analytical work + - Acknowledge limitations in data, methodology, or analytical scope + - Provide balanced perspectives that consider alternative explanations and interpretations + - Use peer review and validation processes to ensure analytical quality + - Stay current with best practices and methodological advances in relevant domains + + **Stakeholder Communication:** + - Provide clear, actionable recommendations that align with organizational capabilities + - Include risk assessments and uncertainty estimates for all strategic recommendations + - Consider implementation feasibility including technical, financial, and organizational constraints + - Offer both immediate tactical improvements and long-term strategic initiatives + - Maintain transparency about analytical processes and potential sources of error + + Your ultimate goal is to provide insights that are technically rigorous, strategically sound, + and practically implementable. Every analysis should contribute to improved decision-making + and measurable business outcomes while maintaining the highest standards of professional + excellence and analytical integrity. + """, + tools=[ + analyze_data_patterns, + research_literature, + generate_test_scenarios, + benchmark_performance, + optimize_system_performance, + analyze_security_vulnerabilities, + design_scalability_architecture, + ], +) + +# Create the app with context caching configuration +# Note: Context cache config is set at the App level +cache_analysis_app = App( + name="cache_analysis", + root_agent=cache_analysis_agent, + context_cache_config=ContextCacheConfig( + min_tokens=4096, + ttl_seconds=600, # 10 mins for research sessions + cache_intervals=3, # Maximum invocations before cache refresh + ), +) + +# Export as app since it's an App, not an Agent +app = cache_analysis_app + +# Backward compatibility export - ADK still expects root_agent in some contexts +root_agent = cache_analysis_agent diff --git a/contributing/samples/cache_analysis/run_cache_experiments.py b/contributing/samples/cache_analysis/run_cache_experiments.py new file mode 100644 index 0000000000..c65df3cf1d --- /dev/null +++ b/contributing/samples/cache_analysis/run_cache_experiments.py @@ -0,0 +1,715 @@ +#!/usr/bin/env python3 +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Cache Performance Experiments for ADK Context Caching + +This script runs two experiments to compare caching performance: +A. Gemini 2.0 Flash: Cache enabled vs disabled (explicit caching test) +B. Gemini 2.5 Flash: Implicit vs explicit caching comparison +""" + +import argparse +import asyncio +import copy +import json +import logging +import sys +import time +from typing import Any +from typing import Dict +from typing import List + +try: + # Try relative imports first (when run as module) + from .agent import app + from .utils import get_test_prompts + from .utils import run_experiment_batch +except ImportError: + # Fallback to direct imports (when run as script) + from agent import app + from utils import get_test_prompts + from utils import run_experiment_batch + +from google.adk.cli.utils import logs +from google.adk.runners import InMemoryRunner +from google.adk.utils.cache_performance_analyzer import CachePerformanceAnalyzer + +APP_NAME = "cache_analysis_experiments" +USER_ID = "cache_researcher" + + +def create_agent_variant(base_app, model_name: str, cache_enabled: bool): + """Create an app variant with specified model and cache settings.""" + import datetime + + from google.adk.agents.context_cache_config import ContextCacheConfig + from google.adk.apps.app import App + + # Extract the root agent and modify its model + agent_copy = copy.deepcopy(base_app.root_agent) + agent_copy.model = model_name + + # Prepend dynamic timestamp to instruction to avoid implicit cache reuse across runs + current_timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + dynamic_prefix = f"Current session started at: {current_timestamp}\n\n" + agent_copy.instruction = dynamic_prefix + agent_copy.instruction + + # Update agent name to reflect configuration + cache_status = "cached" if cache_enabled else "no_cache" + agent_copy.name = ( + f"cache_analysis_{model_name.replace('.', '_').replace('-', '_')}_{cache_status}" + ) + + if cache_enabled: + # Use standardized cache config + cache_config = ContextCacheConfig( + min_tokens=4096, + ttl_seconds=600, # 10 mins for research sessions + cache_intervals=3, # Maximum invocations before cache refresh + ) + else: + # Disable caching by setting config to None + cache_config = None + + # Create new App with updated configuration + app_copy = App( + name=f"{base_app.name}_{cache_status}", + root_agent=agent_copy, + context_cache_config=cache_config, + ) + + return app_copy + + +async def run_cache_comparison_experiment( + model_name: str, + description: str, + cached_label: str, + uncached_label: str, + experiment_title: str, + reverse_order: bool = False, + request_delay: float = 2.0, +) -> Dict[str, Any]: + """ + Run a cache performance comparison experiment for a specific model. + + Args: + model_name: Model to test (e.g., "gemini-2.0-flash", "gemini-2.5-flash") + description: Description of what the experiment tests + cached_label: Label for the cached experiment variant + uncached_label: Label for the uncached experiment variant + experiment_title: Title to display for the experiment + + Returns: + Dictionary containing experiment results and performance comparison + """ + print("=" * 80) + print(f"EXPERIMENT {model_name}: {experiment_title}") + print("=" * 80) + print(f"Testing: {description}") + print(f"Model: {model_name}") + print() + + # Create app variants + app_cached = create_agent_variant(app, model_name, cache_enabled=True) + app_uncached = create_agent_variant(app, model_name, cache_enabled=False) + + # Get test prompts + prompts = get_test_prompts() + + # Create runners + runner_cached = InMemoryRunner(app=app_cached, app_name=None) + runner_uncached = InMemoryRunner(app=app_uncached, app_name=None) + + # Create sessions for each experiment to avoid cross-contamination + session_cached = await runner_cached.session_service.create_session( + app_name=runner_cached.app_name, user_id=USER_ID + ) + session_uncached = await runner_uncached.session_service.create_session( + app_name=runner_uncached.app_name, user_id=USER_ID + ) + + if not reverse_order: # Default: uncached first + print("▶️ Running experiments in DEFAULT ORDER (uncached first)") + print() + + # Test uncached version first + results_uncached = await run_experiment_batch( + app_uncached.root_agent.name, + runner_uncached, + USER_ID, + session_uncached.id, + prompts, + f"Experiment {model_name} - {uncached_label}", + request_delay=request_delay, + ) + + # Brief pause between experiments + await asyncio.sleep(5) + + # Test cached version second + results_cached = await run_experiment_batch( + app_cached.root_agent.name, + runner_cached, + USER_ID, + session_cached.id, + prompts, + f"Experiment {model_name} - {cached_label}", + request_delay=request_delay, + ) + else: + print("🔄 Running experiments in ALTERNATE ORDER (cached first)") + print() + + # Test cached version first + results_cached = await run_experiment_batch( + app_cached.root_agent.name, + runner_cached, + USER_ID, + session_cached.id, + prompts, + f"Experiment {model_name} - {cached_label}", + request_delay=request_delay, + ) + + # Brief pause between experiments + await asyncio.sleep(5) + + # Test uncached version second + results_uncached = await run_experiment_batch( + app_uncached.root_agent.name, + runner_uncached, + USER_ID, + session_uncached.id, + prompts, + f"Experiment {model_name} - {uncached_label}", + request_delay=request_delay, + ) + + # Analyze cache performance using CachePerformanceAnalyzer + performance_analysis = await analyze_cache_performance_from_sessions( + runner_cached, + session_cached, + runner_uncached, + session_uncached, + model_name, + ) + + # Extract metrics from analyzer for backward compatibility + cached_analysis = performance_analysis.get("cached_analysis", {}) + uncached_analysis = performance_analysis.get("uncached_analysis", {}) + + cached_total_prompt_tokens = cached_analysis.get("total_prompt_tokens", 0) + cached_total_cached_tokens = cached_analysis.get("total_cached_tokens", 0) + cached_cache_hit_ratio = cached_analysis.get("cache_hit_ratio_percent", 0.0) + cached_cache_utilization_ratio = cached_analysis.get( + "cache_utilization_ratio_percent", 0.0 + ) + cached_avg_cached_tokens_per_request = cached_analysis.get( + "avg_cached_tokens_per_request", 0.0 + ) + cached_requests_with_hits = cached_analysis.get("requests_with_cache_hits", 0) + total_cached_requests = cached_analysis.get("total_requests", 0) + + uncached_total_prompt_tokens = uncached_analysis.get("total_prompt_tokens", 0) + uncached_total_cached_tokens = uncached_analysis.get("total_cached_tokens", 0) + uncached_cache_hit_ratio = uncached_analysis.get( + "cache_hit_ratio_percent", 0.0 + ) + uncached_cache_utilization_ratio = uncached_analysis.get( + "cache_utilization_ratio_percent", 0.0 + ) + uncached_avg_cached_tokens_per_request = uncached_analysis.get( + "avg_cached_tokens_per_request", 0.0 + ) + uncached_requests_with_hits = uncached_analysis.get( + "requests_with_cache_hits", 0 + ) + total_uncached_requests = uncached_analysis.get("total_requests", 0) + + summary = { + "experiment": model_name, + "description": description, + "model": model_name, + "cached_results": results_cached, + "uncached_results": results_uncached, + "cache_analysis": { + "cached_experiment": { + "cache_hit_ratio_percent": cached_cache_hit_ratio, + "cache_utilization_ratio_percent": cached_cache_utilization_ratio, + "total_prompt_tokens": cached_total_prompt_tokens, + "total_cached_tokens": cached_total_cached_tokens, + "avg_cached_tokens_per_request": ( + cached_avg_cached_tokens_per_request + ), + "requests_with_cache_hits": cached_requests_with_hits, + "total_requests": total_cached_requests, + }, + "uncached_experiment": { + "cache_hit_ratio_percent": uncached_cache_hit_ratio, + "cache_utilization_ratio_percent": ( + uncached_cache_utilization_ratio + ), + "total_prompt_tokens": uncached_total_prompt_tokens, + "total_cached_tokens": uncached_total_cached_tokens, + "avg_cached_tokens_per_request": ( + uncached_avg_cached_tokens_per_request + ), + "requests_with_cache_hits": uncached_requests_with_hits, + "total_requests": total_uncached_requests, + }, + }, + } + + print(f"📊 EXPERIMENT {model_name} CACHE ANALYSIS:") + print(f" 🔥 {cached_label}:") + print( + f" Cache Hit Ratio: {cached_cache_hit_ratio:.1f}%" + f" ({cached_total_cached_tokens:,} /" + f" {cached_total_prompt_tokens:,} tokens)" + ) + print( + f" Cache Utilization: {cached_cache_utilization_ratio:.1f}%" + f" ({cached_requests_with_hits}/{total_cached_requests} requests)" + ) + print( + " Avg Cached Tokens/Request:" + f" {cached_avg_cached_tokens_per_request:.0f}" + ) + print(f" ❄️ {uncached_label}:") + print( + f" Cache Hit Ratio: {uncached_cache_hit_ratio:.1f}%" + f" ({uncached_total_cached_tokens:,} /" + f" {uncached_total_prompt_tokens:,} tokens)" + ) + print( + f" Cache Utilization: {uncached_cache_utilization_ratio:.1f}%" + f" ({uncached_requests_with_hits}/{total_uncached_requests} requests)" + ) + print( + " Avg Cached Tokens/Request:" + f" {uncached_avg_cached_tokens_per_request:.0f}" + ) + print() + + # Add performance analysis to summary + summary["performance_analysis"] = performance_analysis + + return summary + + +async def analyze_cache_performance_from_sessions( + runner_cached, + session_cached, + runner_uncached, + session_uncached, + model_name: str, +) -> Dict[str, Any]: + """Analyze cache performance using CachePerformanceAnalyzer.""" + print("📊 ANALYZING CACHE PERFORMANCE WITH CachePerformanceAnalyzer...") + + analyzer_cached = CachePerformanceAnalyzer(runner_cached.session_service) + analyzer_uncached = CachePerformanceAnalyzer(runner_uncached.session_service) + + # Analyze cached experiment + try: + cached_analysis = await analyzer_cached.analyze_agent_cache_performance( + session_cached.id, + USER_ID, + runner_cached.app_name, + f"cache_analysis_{model_name.replace('.', '_').replace('-', '_')}_cached", + ) + print(f" 🔥 Cached Experiment Analysis:") + print(f" Status: {cached_analysis['status']}") + if cached_analysis["status"] == "active": + print( + " Cache Hit Ratio:" + f" {cached_analysis['cache_hit_ratio_percent']:.1f}%" + f" ({cached_analysis['total_cached_tokens']:,} /" + f" {cached_analysis['total_prompt_tokens']:,} tokens)" + ) + print( + " Cache Utilization:" + f" {cached_analysis['cache_utilization_ratio_percent']:.1f}%" + f" ({cached_analysis['requests_with_cache_hits']}/{cached_analysis['total_requests']} requests)" + ) + print( + " Avg Cached Tokens/Request:" + f" {cached_analysis['avg_cached_tokens_per_request']:.0f}" + ) + print( + f" Requests with cache: {cached_analysis['requests_with_cache']}" + ) + print( + " Avg invocations used:" + f" {cached_analysis['avg_invocations_used']:.1f}" + ) + print(f" Cache refreshes: {cached_analysis['cache_refreshes']}") + print(f" Total invocations: {cached_analysis['total_invocations']}") + except Exception as e: + print(f" ❌ Error analyzing cached experiment: {e}") + cached_analysis = {"status": "error", "error": str(e)} + + # Analyze uncached experiment + try: + uncached_analysis = await analyzer_uncached.analyze_agent_cache_performance( + session_uncached.id, + USER_ID, + runner_uncached.app_name, + f"cache_analysis_{model_name.replace('.', '_').replace('-', '_')}_no_cache", + ) + print(f" ❄️ Uncached Experiment Analysis:") + print(f" Status: {uncached_analysis['status']}") + if uncached_analysis["status"] == "active": + print( + " Cache Hit Ratio:" + f" {uncached_analysis['cache_hit_ratio_percent']:.1f}%" + f" ({uncached_analysis['total_cached_tokens']:,} /" + f" {uncached_analysis['total_prompt_tokens']:,} tokens)" + ) + print( + " Cache Utilization:" + f" {uncached_analysis['cache_utilization_ratio_percent']:.1f}%" + f" ({uncached_analysis['requests_with_cache_hits']}/{uncached_analysis['total_requests']} requests)" + ) + print( + " Avg Cached Tokens/Request:" + f" {uncached_analysis['avg_cached_tokens_per_request']:.0f}" + ) + print( + " Requests with cache:" + f" {uncached_analysis['requests_with_cache']}" + ) + print( + " Avg invocations used:" + f" {uncached_analysis['avg_invocations_used']:.1f}" + ) + print(f" Cache refreshes: {uncached_analysis['cache_refreshes']}") + print(f" Total invocations: {uncached_analysis['total_invocations']}") + except Exception as e: + print(f" ❌ Error analyzing uncached experiment: {e}") + uncached_analysis = {"status": "error", "error": str(e)} + + print() + + return { + "cached_analysis": cached_analysis, + "uncached_analysis": uncached_analysis, + } + + +def get_experiment_labels(model_name: str) -> Dict[str, str]: + """Get experiment labels and titles for a given model.""" + # Determine experiment type based on model name + if "2.5" in model_name: + # Gemini 2.5 models have implicit caching + return { + "description": "Google implicit caching vs ADK explicit caching", + "cached_label": "Explicit Caching", + "uncached_label": "Implicit Caching", + "experiment_title": "Implicit vs Explicit Caching", + } + else: + # Other models (2.0, etc.) test explicit caching vs no caching + return { + "description": "ADK explicit caching enabled vs disabled", + "cached_label": "Cached", + "uncached_label": "Uncached", + "experiment_title": "Cache Performance Comparison", + } + + +def calculate_averaged_results( + all_results: List[Dict[str, Any]], model_name: str +) -> Dict[str, Any]: + """Calculate averaged results from multiple experiment runs.""" + if not all_results: + raise ValueError("No results to average") + + # Calculate average cache metrics + cache_hit_ratios = [ + r["cache_analysis"]["cache_hit_ratio_percent"] for r in all_results + ] + cache_utilization_ratios = [ + r["cache_analysis"]["cache_utilization_ratio_percent"] + for r in all_results + ] + total_prompt_tokens = [ + r["cache_analysis"]["total_prompt_tokens"] for r in all_results + ] + total_cached_tokens = [ + r["cache_analysis"]["total_cached_tokens"] for r in all_results + ] + avg_cached_tokens_per_request = [ + r["cache_analysis"]["avg_cached_tokens_per_request"] for r in all_results + ] + requests_with_cache_hits = [ + r["cache_analysis"]["requests_with_cache_hits"] for r in all_results + ] + + def safe_average(values): + """Calculate average, handling empty lists.""" + return sum(values) / len(values) if values else 0.0 + + # Create averaged result + averaged_result = { + "experiment": model_name, + "description": all_results[0]["description"], + "model": model_name, + "individual_runs": ( + all_results + ), # Keep all individual results for reference + "averaged_cache_analysis": { + "cache_hit_ratio_percent": safe_average(cache_hit_ratios), + "cache_utilization_ratio_percent": safe_average( + cache_utilization_ratios + ), + "total_prompt_tokens": safe_average(total_prompt_tokens), + "total_cached_tokens": safe_average(total_cached_tokens), + "avg_cached_tokens_per_request": safe_average( + avg_cached_tokens_per_request + ), + "requests_with_cache_hits": safe_average(requests_with_cache_hits), + }, + "statistics": { + "runs_completed": len(all_results), + "cache_hit_ratio_std": _calculate_std(cache_hit_ratios), + "cache_utilization_std": _calculate_std(cache_utilization_ratios), + "cached_tokens_per_request_std": _calculate_std( + avg_cached_tokens_per_request + ), + }, + } + + # Print averaged results + print("\n📊 AVERAGED CACHE ANALYSIS RESULTS:") + print("=" * 80) + avg_cache = averaged_result["averaged_cache_analysis"] + stats = averaged_result["statistics"] + + print(f" Runs completed: {stats['runs_completed']}") + print( + f" Average Cache Hit Ratio: {avg_cache['cache_hit_ratio_percent']:.1f}%" + f" (±{stats['cache_hit_ratio_std']:.1f}%)" + ) + print( + " Average Cache Utilization:" + f" {avg_cache['cache_utilization_ratio_percent']:.1f}%" + f" (±{stats['cache_utilization_std']:.1f}%)" + ) + print( + " Average Cached Tokens/Request:" + f" {avg_cache['avg_cached_tokens_per_request']:.0f}" + f" (±{stats['cached_tokens_per_request_std']:.0f})" + ) + print() + + return averaged_result + + +def _calculate_std(values): + """Calculate standard deviation.""" + if len(values) <= 1: + return 0.0 + mean = sum(values) / len(values) + variance = sum((x - mean) ** 2 for x in values) / len(values) + return variance**0.5 + + +def save_results(results: Dict[str, Any], filename: str): + """Save experiment results to JSON file.""" + with open(filename, "w") as f: + json.dump(results, f, indent=2) + print(f"💾 Results saved to: {filename}") + + +async def main(): + """Run cache performance experiment for a specific model.""" + parser = argparse.ArgumentParser( + description="ADK Cache Performance Experiment" + ) + parser.add_argument( + "model", + help="Model to test (e.g., gemini-2.5-flash, gemini-2.0-flash-001)", + ) + parser.add_argument( + "--output", + help="Output filename for results (default: cache_{model}_results.json)", + ) + parser.add_argument( + "--repeat", + type=int, + default=1, + help=( + "Number of times to repeat each experiment for averaged results" + " (default: 1)" + ), + ) + parser.add_argument( + "--cached-first", + action="store_true", + help="Run cached experiment first (default: uncached first)", + ) + parser.add_argument( + "--request-delay", + type=float, + default=2.0, + help=( + "Delay in seconds between API requests to avoid overloading (default:" + " 2.0)" + ), + ) + parser.add_argument( + "--log-level", + choices=["DEBUG", "INFO", "WARNING", "ERROR"], + default="INFO", + help="Set logging level (default: INFO)", + ) + + args = parser.parse_args() + + # Setup logger with specified level + log_level = getattr(logging, args.log_level.upper()) + logs.setup_adk_logger(log_level) + + # Set default output filename based on model + if not args.output: + args.output = ( + f"cache_{args.model.replace('.', '_').replace('-', '_')}_results.json" + ) + + print("🧪 ADK CONTEXT CACHE PERFORMANCE EXPERIMENT") + print("=" * 80) + print(f"Start time: {time.strftime('%Y-%m-%d %H:%M:%S')}") + print(f"Model: {args.model}") + print(f"Repetitions: {args.repeat}") + print() + + start_time = time.time() + + try: + # Get experiment labels for the model + labels = get_experiment_labels(args.model) + + # Run the experiment multiple times if repeat > 1 + if args.repeat == 1: + # Single run + result = await run_cache_comparison_experiment( + model_name=args.model, + reverse_order=args.cached_first, + request_delay=args.request_delay, + **labels, + ) + else: + # Multiple runs with averaging + print(f"🔄 Running experiment {args.repeat} times for averaged results") + print("=" * 80) + + all_results = [] + for run_num in range(args.repeat): + print(f"\n🏃 RUN {run_num + 1}/{args.repeat}") + print("-" * 40) + + run_result = await run_cache_comparison_experiment( + model_name=args.model, + reverse_order=args.cached_first, + request_delay=args.request_delay, + **labels, + ) + all_results.append(run_result) + + # Brief pause between runs + if run_num < args.repeat - 1: + print("⏸️ Pausing 10 seconds between runs...") + await asyncio.sleep(10) + + # Calculate averaged results + result = calculate_averaged_results(all_results, args.model) + + # Add completion metadata + result["end_time"] = time.strftime("%Y-%m-%d %H:%M:%S") + result["total_duration"] = time.time() - start_time + result["repetitions"] = args.repeat + + except KeyboardInterrupt: + print("\n⚠️ Experiment interrupted by user") + sys.exit(1) + except Exception as e: + print(f"\n❌ Experiment failed: {e}") + import traceback + + traceback.print_exc() + sys.exit(1) + + # Save results + save_results(result, args.output) + + # Print final summary + print("=" * 80) + print("🎉 EXPERIMENT COMPLETED SUCCESSFULLY!") + print("=" * 80) + + # Handle both single and averaged results + if args.repeat == 1: + cached_exp = result["cache_analysis"]["cached_experiment"] + uncached_exp = result["cache_analysis"]["uncached_experiment"] + labels = get_experiment_labels(args.model) + print(f"{args.model}:") + print(f" 🔥 {labels['cached_label']}:") + print(f" Cache Hit Ratio: {cached_exp['cache_hit_ratio_percent']:.1f}%") + print( + " Cache Utilization:" + f" {cached_exp['cache_utilization_ratio_percent']:.1f}%" + ) + print( + " Cached Tokens/Request:" + f" {cached_exp['avg_cached_tokens_per_request']:.0f}" + ) + print(f" ❄️ {labels['uncached_label']}:") + print( + f" Cache Hit Ratio: {uncached_exp['cache_hit_ratio_percent']:.1f}%" + ) + print( + " Cache Utilization:" + f" {uncached_exp['cache_utilization_ratio_percent']:.1f}%" + ) + print( + " Cached Tokens/Request:" + f" {uncached_exp['avg_cached_tokens_per_request']:.0f}" + ) + else: + # For averaged results, show summary comparison + cached_exp = result["averaged_cache_analysis"]["cached_experiment"] + uncached_exp = result["averaged_cache_analysis"]["uncached_experiment"] + labels = get_experiment_labels(args.model) + print(f"{args.model} (averaged over {args.repeat} runs):") + print(f" 🔥 {labels['cached_label']} vs ❄️ {labels['uncached_label']}:") + print( + f" Cache Hit Ratio: {cached_exp['cache_hit_ratio_percent']:.1f}% vs" + f" {uncached_exp['cache_hit_ratio_percent']:.1f}%" + ) + print( + " Cache Utilization:" + f" {cached_exp['cache_utilization_ratio_percent']:.1f}% vs" + f" {uncached_exp['cache_utilization_ratio_percent']:.1f}%" + ) + + print(f"\nTotal execution time: {result['total_duration']:.2f} seconds") + print(f"Results saved to: {args.output}") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/contributing/samples/cache_analysis/utils.py b/contributing/samples/cache_analysis/utils.py new file mode 100644 index 0000000000..e2c9f89101 --- /dev/null +++ b/contributing/samples/cache_analysis/utils.py @@ -0,0 +1,272 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Utility functions for cache analysis experiments.""" + +import asyncio +import time +from typing import Any +from typing import Dict +from typing import List + +from google.adk.runners import InMemoryRunner + + +async def call_agent_async( + runner: InMemoryRunner, user_id: str, session_id: str, prompt: str +) -> Dict[str, Any]: + """Call agent asynchronously and return response with token usage.""" + from google.genai import types + + response_parts = [] + token_usage = { + "prompt_token_count": 0, + "candidates_token_count": 0, + "cached_content_token_count": 0, + "total_token_count": 0, + } + + async for event in runner.run_async( + user_id=user_id, + session_id=session_id, + new_message=types.Content(parts=[types.Part(text=prompt)], role="user"), + ): + if event.content and event.content.parts: + for part in event.content.parts: + if hasattr(part, "text") and part.text: + response_parts.append(part.text) + + # Collect token usage information + if event.usage_metadata: + if ( + hasattr(event.usage_metadata, "prompt_token_count") + and event.usage_metadata.prompt_token_count + ): + token_usage[ + "prompt_token_count" + ] += event.usage_metadata.prompt_token_count + if ( + hasattr(event.usage_metadata, "candidates_token_count") + and event.usage_metadata.candidates_token_count + ): + token_usage[ + "candidates_token_count" + ] += event.usage_metadata.candidates_token_count + if ( + hasattr(event.usage_metadata, "cached_content_token_count") + and event.usage_metadata.cached_content_token_count + ): + token_usage[ + "cached_content_token_count" + ] += event.usage_metadata.cached_content_token_count + if ( + hasattr(event.usage_metadata, "total_token_count") + and event.usage_metadata.total_token_count + ): + token_usage[ + "total_token_count" + ] += event.usage_metadata.total_token_count + + response_text = "".join(response_parts) + + return {"response_text": response_text, "token_usage": token_usage} + + +def get_test_prompts() -> List[str]: + """Get a standardized set of test prompts for cache analysis experiments. + + Designed for consistent behavior: + - Prompts 1-5: Will NOT trigger function calls (general questions) + - Prompts 6-10: Will trigger function calls (specific tool requests) + """ + return [ + # === PROMPTS THAT WILL NOT TRIGGER FUNCTION CALLS === + # (General questions that don't match specific tool descriptions) + "Hello, what can you do for me?", + ( + "What is artificial intelligence and how does it work in modern" + " applications?" + ), + "Explain the difference between machine learning and deep learning.", + "What are the main challenges in implementing AI systems at scale?", + "How do recommendation systems work in modern e-commerce platforms?", + # === PROMPTS THAT WILL TRIGGER FUNCTION CALLS === + # (Specific requests with all required parameters clearly specified) + ( + "Use benchmark_performance with system_name='E-commerce Platform'," + " metrics=['latency', 'throughput'], duration='standard'," + " load_profile='realistic'." + ), + ( + "Call analyze_user_behavior_patterns with" + " user_segment='premium_customers', time_period='last_30_days'," + " metrics=['engagement', 'conversion']." + ), + ( + "Run market_research_analysis for industry='fintech'," + " focus_areas=['user_experience', 'security']," + " report_depth='comprehensive'." + ), + ( + "Execute competitive_analysis with competitors=['Netflix'," + " 'Disney+'], analysis_type='feature_comparison'," + " output_format='detailed'." + ), + ( + "Perform content_performance_evaluation on content_type='video'," + " platform='social_media', success_metrics=['views', 'engagement']." + ), + ] + + +async def run_experiment_batch( + agent_name: str, + runner: InMemoryRunner, + user_id: str, + session_id: str, + prompts: List[str], + experiment_name: str, + request_delay: float = 2.0, +) -> Dict[str, Any]: + """Run a batch of prompts and collect cache metrics.""" + results = [] + + print(f"🧪 Running {experiment_name}") + print(f"Agent: {agent_name}") + print(f"Session: {session_id}") + print(f"Prompts: {len(prompts)}") + print(f"Request delay: {request_delay}s between calls") + print("-" * 60) + + for i, prompt in enumerate(prompts, 1): + print(f"[{i}/{len(prompts)}] Running test prompt...") + print(f"Prompt: {prompt[:100]}...") + + try: + agent_response = await call_agent_async( + runner, user_id, session_id, prompt + ) + + result = { + "prompt_number": i, + "prompt": prompt, + "response_length": len(agent_response["response_text"]), + "success": True, + "error": None, + "token_usage": agent_response["token_usage"], + } + + # Extract token usage for individual prompt statistics + prompt_tokens = agent_response["token_usage"].get("prompt_token_count", 0) + cached_tokens = agent_response["token_usage"].get( + "cached_content_token_count", 0 + ) + + print( + "✅ Completed (Response:" + f" {len(agent_response['response_text'])} chars)" + ) + print( + f" 📊 Tokens - Prompt: {prompt_tokens:,}, Cached: {cached_tokens:,}" + ) + + except Exception as e: + result = { + "prompt_number": i, + "prompt": prompt, + "response_length": 0, + "success": False, + "error": str(e), + "token_usage": { + "prompt_token_count": 0, + "candidates_token_count": 0, + "cached_content_token_count": 0, + "total_token_count": 0, + }, + } + + print(f"❌ Failed: {e}") + + results.append(result) + + # Configurable pause between requests to avoid API overload + if i < len(prompts): # Don't sleep after the last request + print(f" ⏸️ Waiting {request_delay}s before next request...") + await asyncio.sleep(request_delay) + + successful_requests = sum(1 for r in results if r["success"]) + + # Calculate cache statistics for this batch + total_prompt_tokens = sum( + r.get("token_usage", {}).get("prompt_token_count", 0) for r in results + ) + total_cached_tokens = sum( + r.get("token_usage", {}).get("cached_content_token_count", 0) + for r in results + ) + + # Calculate cache hit ratio + if total_prompt_tokens > 0: + cache_hit_ratio = (total_cached_tokens / total_prompt_tokens) * 100 + else: + cache_hit_ratio = 0.0 + + # Calculate cache utilization + requests_with_cache_hits = sum( + 1 + for r in results + if r.get("token_usage", {}).get("cached_content_token_count", 0) > 0 + ) + cache_utilization_ratio = ( + (requests_with_cache_hits / len(prompts)) * 100 if prompts else 0.0 + ) + + # Average cached tokens per request + avg_cached_tokens_per_request = ( + total_cached_tokens / len(prompts) if prompts else 0.0 + ) + + summary = { + "experiment_name": experiment_name, + "agent_name": agent_name, + "total_requests": len(prompts), + "successful_requests": successful_requests, + "results": results, + "cache_statistics": { + "cache_hit_ratio_percent": cache_hit_ratio, + "cache_utilization_ratio_percent": cache_utilization_ratio, + "total_prompt_tokens": total_prompt_tokens, + "total_cached_tokens": total_cached_tokens, + "avg_cached_tokens_per_request": avg_cached_tokens_per_request, + "requests_with_cache_hits": requests_with_cache_hits, + }, + } + + print("-" * 60) + print(f"✅ {experiment_name} completed:") + print(f" Total requests: {len(prompts)}") + print(f" Successful: {successful_requests}/{len(prompts)}") + print(" 📊 BATCH CACHE STATISTICS:") + print( + f" Cache Hit Ratio: {cache_hit_ratio:.1f}%" + f" ({total_cached_tokens:,} / {total_prompt_tokens:,} tokens)" + ) + print( + f" Cache Utilization: {cache_utilization_ratio:.1f}%" + f" ({requests_with_cache_hits}/{len(prompts)} requests)" + ) + print(f" Avg Cached Tokens/Request: {avg_cached_tokens_per_request:.0f}") + print() + + return summary diff --git a/contributing/samples/code_execution/agent.py b/contributing/samples/code_execution/agent.py index b8cbd61417..82de04f25d 100644 --- a/contributing/samples/code_execution/agent.py +++ b/contributing/samples/code_execution/agent.py @@ -43,7 +43,7 @@ def base_system_instruction(): ``` **Output Visibility:** Always print the output of code execution to visualize results, especially for data exploration and analysis. For example: - - To look a the shape of a pandas.DataFrame do: + - To look at the shape of a pandas.DataFrame do: ```tool_code print(df.shape) ``` @@ -84,7 +84,7 @@ def base_system_instruction(): You need to assist the user with their queries by looking at the data and the context in the conversation. -You final answer should summarize the code and code execution relavant to the user query. +You final answer should summarize the code and code execution relevant to the user query. You should include all pieces of data to answer the user query, such as the table from code execution results. If you cannot answer the question directly, you should follow the guidelines above to generate the next step. diff --git a/contributing/samples/computer_use/README.md b/contributing/samples/computer_use/README.md new file mode 100644 index 0000000000..ff7ae6c0a5 --- /dev/null +++ b/contributing/samples/computer_use/README.md @@ -0,0 +1,96 @@ +# Computer Use Agent + +This directory contains a computer use agent that can operate a browser to complete user tasks. The agent uses Playwright to control a Chromium browser and can interact with web pages by taking screenshots, clicking, typing, and navigating. + +This agent is to demo the usage of ComputerUseToolset. + + +## Overview + +The computer use agent consists of: +- `agent.py`: Main agent configuration using Google's gemini-2.5-computer-use-preview-10-2025 model +- `playwright.py`: Playwright-based computer implementation for browser automation +- `requirements.txt`: Python dependencies + +## Setup + +### 1. Install Python Dependencies + +Install the required Python packages from the requirements file: + +```bash +uv pip install -r internal/samples/computer_use/requirements.txt +``` + +### 2. Install Playwright Dependencies + +Install Playwright's system dependencies for Chromium: + +```bash +playwright install-deps chromium +``` + +### 3. Install Chromium Browser + +Install the Chromium browser for Playwright: + +```bash +playwright install chromium +``` + +## Usage + +### Running the Agent + +To start the computer use agent, run the following command from the project root: + +```bash +adk web internal/samples +``` + +This will start the ADK web interface where you can interact with the computer_use agent. + +### Example Queries + +Once the agent is running, you can send queries like: + +``` +find me a flight from SF to Hawaii on next Monday, coming back on next Friday. start by navigating directly to flights.google.com +``` + +The agent will: +1. Open a browser window +2. Navigate to the specified website +3. Interact with the page elements to complete your task +4. Provide updates on its progress + +### Other Example Tasks + +- Book hotel reservations +- Search for products online +- Fill out forms +- Navigate complex websites +- Research information across multiple pages + +## Technical Details + +- **Model**: Uses Google's `gemini-2.5-computer-use-preview-10-2025` model for computer use capabilities +- **Browser**: Automated Chromium browser via Playwright +- **Screen Size**: Configured for 600x800 resolution +- **Tools**: Uses ComputerUseToolset for screen capture, clicking, typing, and scrolling + +## Troubleshooting + +If you encounter issues: + +1. **Playwright not found**: Make sure you've run both `playwright install-deps chromium` and `playwright install chromium` +2. **Dependencies missing**: Verify all packages from `requirements.txt` are installed +3. **Browser crashes**: Check that your system supports Chromium and has sufficient resources +4. **Permission errors**: Ensure your user has permission to run browser automation tools + +## Notes + +- The agent operates in a controlled browser environment +- Screenshots are taken to help the agent understand the current state +- The agent will provide updates on its actions as it works +- Be patient as complex tasks may take some time to complete diff --git a/contributing/samples/computer_use/agent.py b/contributing/samples/computer_use/agent.py new file mode 100755 index 0000000000..001995019d --- /dev/null +++ b/contributing/samples/computer_use/agent.py @@ -0,0 +1,43 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import tempfile + +from google.adk import Agent +from google.adk.tools.computer_use.computer_use_toolset import ComputerUseToolset + +from .playwright import PlaywrightComputer + +# Define user_data_dir path +profile_name = 'browser_profile_for_adk' +profile_path = os.path.join(tempfile.gettempdir(), profile_name) +os.makedirs(profile_path, exist_ok=True) + +computer_with_profile = PlaywrightComputer( + screen_size=(1280, 936), + user_data_dir=profile_path, +) + +# Create agent with the toolset using the new computer instance +root_agent = Agent( + model='gemini-2.5-computer-use-preview-10-2025', + name='hello_world_agent', + description=( + 'computer use agent that can operate a browser on a computer to finish' + ' user tasks' + ), + instruction=""" you are a computer use agent """, + tools=[ComputerUseToolset(computer=computer_with_profile)], +) diff --git a/contributing/samples/computer_use/playwright.py b/contributing/samples/computer_use/playwright.py new file mode 100644 index 0000000000..1df542cc4f --- /dev/null +++ b/contributing/samples/computer_use/playwright.py @@ -0,0 +1,350 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import asyncio +import time +from typing import Literal +from typing import Optional + +from google.adk.tools.computer_use.base_computer import BaseComputer +from google.adk.tools.computer_use.base_computer import ComputerEnvironment +from google.adk.tools.computer_use.base_computer import ComputerState +from playwright.async_api import async_playwright +import termcolor +from typing_extensions import override + +# Define a mapping from the user-friendly key names to Playwright's expected key names. +# Playwright is generally good with case-insensitivity for these, but it's best to be canonical. +# See: https://playwright.dev/docs/api/class-keyboard#keyboard-press +# Keys like 'a', 'b', '1', '$' are passed directly. +PLAYWRIGHT_KEY_MAP = { + "backspace": "Backspace", + "tab": "Tab", + "return": "Enter", # Playwright uses 'Enter' + "enter": "Enter", + "shift": "Shift", + "control": "Control", # Or 'ControlOrMeta' for cross-platform Ctrl/Cmd + "alt": "Alt", + "escape": "Escape", + "space": "Space", # Can also just be " " + "pageup": "PageUp", + "pagedown": "PageDown", + "end": "End", + "home": "Home", + "left": "ArrowLeft", + "up": "ArrowUp", + "right": "ArrowRight", + "down": "ArrowDown", + "insert": "Insert", + "delete": "Delete", + "semicolon": ";", # For actual character ';' + "equals": "=", # For actual character '=' + "multiply": "Multiply", # NumpadMultiply + "add": "Add", # NumpadAdd + "separator": "Separator", # Numpad specific + "subtract": "Subtract", # NumpadSubtract, or just '-' for character + "decimal": "Decimal", # NumpadDecimal, or just '.' for character + "divide": "Divide", # NumpadDivide, or just '/' for character + "f1": "F1", + "f2": "F2", + "f3": "F3", + "f4": "F4", + "f5": "F5", + "f6": "F6", + "f7": "F7", + "f8": "F8", + "f9": "F9", + "f10": "F10", + "f11": "F11", + "f12": "F12", + "command": "Meta", # 'Meta' is Command on macOS, Windows key on Windows +} + + +class PlaywrightComputer(BaseComputer): + """Conputer that controls Chromium via Playwright.""" + + def __init__( + self, + screen_size: tuple[int, int], + initial_url: str = "https://www.google.com", + search_engine_url: str = "https://www.google.com", + highlight_mouse: bool = False, + user_data_dir: Optional[str] = None, + ): + self._initial_url = initial_url + self._screen_size = screen_size + self._search_engine_url = search_engine_url + self._highlight_mouse = highlight_mouse + self._user_data_dir = user_data_dir + + @override + async def initialize(self): + print("Creating session...") + self._playwright = await async_playwright().start() + + # Define common arguments for both launch types + browser_args = [ + "--disable-blink-features=AutomationControlled", + "--disable-gpu", + ] + + if self._user_data_dir: + termcolor.cprint( + f"Starting playwright with persistent profile: {self._user_data_dir}", + color="yellow", + attrs=["bold"], + ) + # Use a persistent context if user_data_dir is provided + self._context = await self._playwright.chromium.launch_persistent_context( + self._user_data_dir, + headless=False, + args=browser_args, + ) + self._browser = self._context.browser + else: + termcolor.cprint( + "Starting playwright with a temporary profile.", + color="yellow", + attrs=["bold"], + ) + # Launch a temporary browser instance if user_data_dir is not provided + self._browser = await self._playwright.chromium.launch( + args=browser_args, + headless=False, + ) + self._context = await self._browser.new_context() + + if not self._context.pages: + self._page = await self._context.new_page() + await self._page.goto(self._initial_url) + else: + self._page = self._context.pages[0] # Use existing page if any + + await self._page.set_viewport_size({ + "width": self._screen_size[0], + "height": self._screen_size[1], + }) + termcolor.cprint( + f"Started local playwright.", + color="green", + attrs=["bold"], + ) + + @override + async def environment(self): + return ComputerEnvironment.ENVIRONMENT_BROWSER + + @override + async def close(self, exc_type, exc_val, exc_tb): + if self._context: + self._context.close() + try: + self._browser.close() + except Exception as e: + # Browser was already shut down because of SIGINT or such. + if ( + "Browser.close: Connection closed while reading from the driver" + in str(e) + ): + pass + else: + raise + + self._playwright.stop() + + async def open_web_browser(self) -> ComputerState: + return await self.current_state() + + async def click_at(self, x: int, y: int): + await self.highlight_mouse(x, y) + await self._page.mouse.click(x, y) + await self._page.wait_for_load_state() + return await self.current_state() + + async def hover_at(self, x: int, y: int): + await self.highlight_mouse(x, y) + await self._page.mouse.move(x, y) + await self._page.wait_for_load_state() + return await self.current_state() + + async def type_text_at( + self, + x: int, + y: int, + text: str, + press_enter: bool = True, + clear_before_typing: bool = True, + ) -> ComputerState: + await self.highlight_mouse(x, y) + await self._page.mouse.click(x, y) + await self._page.wait_for_load_state() + + if clear_before_typing: + await self.key_combination(["Control", "A"]) + await self.key_combination(["Delete"]) + + await self._page.keyboard.type(text) + await self._page.wait_for_load_state() + + if press_enter: + await self.key_combination(["Enter"]) + await self._page.wait_for_load_state() + return await self.current_state() + + async def _horizontal_document_scroll( + self, direction: Literal["left", "right"] + ) -> ComputerState: + # Scroll by 50% of the viewport size. + horizontal_scroll_amount = await self.screen_size()[0] // 2 + if direction == "left": + sign = "-" + else: + sign = "" + scroll_argument = f"{sign}{horizontal_scroll_amount}" + # Scroll using JS. + await self._page.evaluate(f"window.scrollBy({scroll_argument}, 0); ") + await self._page.wait_for_load_state() + return await self.current_state() + + async def scroll_document( + self, direction: Literal["up", "down", "left", "right"] + ) -> ComputerState: + if direction == "down": + return await self.key_combination(["PageDown"]) + elif direction == "up": + return await self.key_combination(["PageUp"]) + elif direction in ("left", "right"): + return await self._horizontal_document_scroll(direction) + else: + raise ValueError("Unsupported direction: ", direction) + + async def scroll_at( + self, + x: int, + y: int, + direction: Literal["up", "down", "left", "right"], + magnitude: int, + ) -> ComputerState: + await self.highlight_mouse(x, y) + + await self._page.mouse.move(x, y) + await self._page.wait_for_load_state() + + dx = 0 + dy = 0 + if direction == "up": + dy = -magnitude + elif direction == "down": + dy = magnitude + elif direction == "left": + dx = -magnitude + elif direction == "right": + dx = magnitude + else: + raise ValueError("Unsupported direction: ", direction) + + await self._page.mouse.wheel(dx, dy) + await self._page.wait_for_load_state() + return await self.current_state() + + async def wait(self, seconds: int) -> ComputerState: + await asyncio.sleep(seconds) + return await self.current_state() + + async def go_back(self) -> ComputerState: + await self._page.go_back() + await self._page.wait_for_load_state() + return await self.current_state() + + async def go_forward(self) -> ComputerState: + await self._page.go_forward() + await self._page.wait_for_load_state() + return await self.current_state() + + async def search(self) -> ComputerState: + return await self.navigate(self._search_engine_url) + + async def navigate(self, url: str) -> ComputerState: + await self._page.goto(url) + await self._page.wait_for_load_state() + return await self.current_state() + + async def key_combination(self, keys: list[str]) -> ComputerState: + # Normalize all keys to the Playwright compatible version. + keys = [PLAYWRIGHT_KEY_MAP.get(k.lower(), k) for k in keys] + + for key in keys[:-1]: + await self._page.keyboard.down(key) + + await self._page.keyboard.press(keys[-1]) + + for key in reversed(keys[:-1]): + await self._page.keyboard.up(key) + + return await self.current_state() + + async def drag_and_drop( + self, x: int, y: int, destination_x: int, destination_y: int + ) -> ComputerState: + await self.highlight_mouse(x, y) + await self._page.mouse.move(x, y) + await self._page.wait_for_load_state() + await self._page.mouse.down() + await self._page.wait_for_load_state() + + await self.highlight_mouse(destination_x, destination_y) + await self._page.mouse.move(destination_x, destination_y) + await self._page.wait_for_load_state() + await self._page.mouse.up() + return await self.current_state() + + async def current_state(self) -> ComputerState: + await self._page.wait_for_load_state() + # Even if Playwright reports the page as loaded, it may not be so. + # Add a manual sleep to make sure the page has finished rendering. + time.sleep(0.5) + screenshot_bytes = await self._page.screenshot(type="png", full_page=False) + return ComputerState(screenshot=screenshot_bytes, url=self._page.url) + + async def screen_size(self) -> tuple[int, int]: + return self._screen_size + + async def highlight_mouse(self, x: int, y: int): + if not self._highlight_mouse: + return + await self._page.evaluate(f""" + () => {{ + const element_id = "playwright-feedback-circle"; + const div = document.createElement('div'); + div.id = element_id; + div.style.pointerEvents = 'none'; + div.style.border = '4px solid red'; + div.style.borderRadius = '50%'; + div.style.width = '20px'; + div.style.height = '20px'; + div.style.position = 'fixed'; + div.style.zIndex = '9999'; + document.body.appendChild(div); + + div.hidden = false; + div.style.left = {x} - 10 + 'px'; + div.style.top = {y} - 10 + 'px'; + + setTimeout(() => {{ + div.hidden = true; + }}, 2000); + }} + """) + # Wait a bit for the user to see the cursor. + time.sleep(1) diff --git a/contributing/samples/computer_use/requirements.txt b/contributing/samples/computer_use/requirements.txt new file mode 100644 index 0000000000..5b1df13832 --- /dev/null +++ b/contributing/samples/computer_use/requirements.txt @@ -0,0 +1,4 @@ +termcolor==3.1.0 +playwright==1.52.0 +browserbase==1.3.0 +rich diff --git a/contributing/samples/crewai_tool_kwargs/README.md b/contributing/samples/crewai_tool_kwargs/README.md new file mode 100644 index 0000000000..6b0571d42a --- /dev/null +++ b/contributing/samples/crewai_tool_kwargs/README.md @@ -0,0 +1,160 @@ +# CrewAI Tool **kwargs Parameter Handling + +This sample demonstrates how `CrewaiTool` correctly handles tools with +`**kwargs` parameters, which is a common pattern in CrewAI tools. + +## What This Sample Demonstrates + +### Key Feature: **kwargs Parameter Passing + +CrewAI tools often accept arbitrary parameters via `**kwargs`: + +```python +def _run(self, query: str, **kwargs) -> str: + # Extra parameters are passed through kwargs + category = kwargs.get('category') + date_range = kwargs.get('date_range') + limit = kwargs.get('limit') +``` + +The `CrewaiTool` wrapper detects this pattern and passes all parameters through +(except framework-managed ones like `self` and `tool_context`). + +### Contrast with Regular Tools + +For comparison, tools without `**kwargs` only accept explicitly declared +parameters: + +```python +def _run(self, query: str, category: str) -> str: +``` + +## Prerequisites + +### Required: CrewAI Tools (Python 3.10+) + +```bash +pip install 'crewai-tools>=0.2.0' +``` + +### Required: API Key + +```bash +export GOOGLE_API_KEY="your-api-key-here" +# OR +export GOOGLE_GENAI_API_KEY="your-api-key-here" +``` + +## Running the Sample + +### Option 1: Run the Happy Path Test + +```bash +cd contributing/samples/crewai_tool_kwargs +python main.py +``` + +**Expected output:** +``` +============================================================ +CrewAI Tool **kwargs Parameter Test +============================================================ + +🧪 Test 1: Basic search (no extra parameters) +User: Search for Python tutorials +Agent: [Uses tool and returns results] + +🧪 Test 2: Search with filters (**kwargs test) +User: Search for machine learning articles, filtered by... +Agent: [Uses tool with category, date_range, and limit parameters] + +============================================================ +✅ Happy path test completed successfully! +============================================================ +``` + +## What Gets Tested + +✅ **CrewAI tool integration** - Wrapping a CrewAI BaseTool with ADK +✅ **Basic parameters** - Required `query` parameter passes correctly +✅ ****kwargs passing** - Extra parameters (category, date_range, limit) pass + through +✅ **End-to-end execution** - Tool executes and returns results to agent + +## Code Structure + +``` +crewai_tool_kwargs/ +├── __init__.py # Module initialization +├── agent.py # Agent with CrewAI tool +├── main.py # Happy path test +└── README.md # This file +``` + +### Key Files + +**agent.py:** + +- Defines `CustomSearchTool` (CrewAI BaseTool with **kwargs) +- Wraps it with `CrewaiTool` +- Creates agent with the wrapped tool + +**main.py:** + +- Test 1: Basic search (no extra params) +- Test 2: Search with filters (tests **kwargs) + +## How It Works + +1. **CrewAI Tool Definition** (`agent.py`): + ```python + class CustomSearchTool(BaseTool): + def _run(self, query: str, **kwargs) -> str: + # kwargs receives: category, date_range, limit, etc. + ``` + +2. **ADK Wrapping** (`agent.py`): + ```python + adk_search_tool = CrewaiTool( + crewai_search_tool, + name="search_with_filters", + description="..." + ) + ``` + +3. **LLM Function Calling** (`main.py`): + - LLM sees the tool in function calling format + - LLM calls with: `{query: "...", category: "...", date_range: "...", limit: 10}` + - CrewaiTool passes ALL parameters to `**kwargs` + +4. **Tool Execution**: + - `query` → positional parameter + - `category`, `date_range`, `limit` → collected in `**kwargs` + - Tool logic uses all parameters + +## Troubleshooting + +### ImportError: No module named 'crewai' + +```bash +pip install 'crewai-tools>=0.2.0' +``` + +### Python Version Error + +CrewAI requires Python 3.10+: + +```bash +python --version # Should be 3.10 or higher +``` + +### Missing API Key + +```bash +export GOOGLE_API_KEY="your-key-here" +``` + +## Related + +- Parent class: `FunctionTool` - Base class for all function-based tools +- Unit tests: `tests/unittests/tools/test_crewai_tool.py` diff --git a/contributing/samples/crewai_tool_kwargs/__init__.py b/contributing/samples/crewai_tool_kwargs/__init__.py new file mode 100644 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/crewai_tool_kwargs/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/crewai_tool_kwargs/agent.py b/contributing/samples/crewai_tool_kwargs/agent.py new file mode 100644 index 0000000000..f52d703dc8 --- /dev/null +++ b/contributing/samples/crewai_tool_kwargs/agent.py @@ -0,0 +1,112 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Sample demonstrating CrewAI tool with **kwargs parameter handling. + +This sample shows how CrewaiTool correctly passes arbitrary parameters +through **kwargs, which is a common pattern in CrewAI tools. +""" + +from typing import Optional + +from crewai.tools import BaseTool +from google.adk import Agent +from google.adk.tools.crewai_tool import CrewaiTool +from pydantic import BaseModel +from pydantic import Field + + +class SearchInput(BaseModel): + """Input schema for the search tool.""" + + query: str = Field(..., description="The search query string") + category: Optional[str] = Field( + None, description="Filter by category (e.g., 'technology', 'science')" + ) + date_range: Optional[str] = Field( + None, description="Filter by date range (e.g., 'last_week', '2024')" + ) + limit: Optional[int] = Field( + None, description="Limit the number of results (e.g., 10, 20)" + ) + + +class CustomSearchTool(BaseTool): + """A custom CrewAI tool that accepts arbitrary search parameters via **kwargs. + + This demonstrates the key CrewAI tool pattern where tools accept + flexible parameters through **kwargs. + """ + + name: str = "custom_search" + description: str = ( + "Search for information with flexible filtering options. " + "Accepts a query and optional filter parameters like category, " + "date_range, limit, etc." + ) + args_schema: type[BaseModel] = SearchInput + + def _run(self, query: str, **kwargs) -> str: + """Execute search with arbitrary filter parameters. + + Args: + query: The search query string. + **kwargs: Additional filter parameters like category, date_range, limit. + + Returns: + A formatted string showing the query and applied filters. + """ + result_parts = [f"Searching for: '{query}'"] + + if kwargs: + result_parts.append("Applied filters:") + for key, value in kwargs.items(): + result_parts.append(f" - {key}: {value}") + else: + result_parts.append("No additional filters applied.") + + # Simulate search results + result_parts.append(f"\nFound 3 results matching your criteria.") + + return "\n".join(result_parts) + + +crewai_search_tool = CustomSearchTool() + +# Wrap it with ADK's CrewaiTool +adk_search_tool = CrewaiTool( + crewai_search_tool, + name="search_with_filters", + description=( + "Search for information with optional filters like category, " + "date_range, or limit" + ), +) + +root_agent = Agent( + model="gemini-2.0-flash", + name="search_agent", + description="An agent that can search with flexible filtering options", + instruction=""" + You are a helpful search assistant. + When users ask you to search, use the search_with_filters tool. + You can pass additional parameters like: + - category: to filter by category (e.g., "technology", "science") + - date_range: to filter by date (e.g., "last_week", "2024") + - limit: to limit the number of results (e.g., 10, 20) + + Always acknowledge what filters you're applying. + """, + tools=[adk_search_tool], +) diff --git a/contributing/samples/crewai_tool_kwargs/main.py b/contributing/samples/crewai_tool_kwargs/main.py new file mode 100644 index 0000000000..15ade6f774 --- /dev/null +++ b/contributing/samples/crewai_tool_kwargs/main.py @@ -0,0 +1,105 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Happy path test for CrewAI tool with **kwargs parameter handling. + +This demonstrates that CrewaiTool correctly passes arbitrary parameters +through **kwargs to the underlying CrewAI tool. +""" + +import asyncio + +import agent +from dotenv import load_dotenv +from google.adk.cli.utils import logs +from google.adk.runners import InMemoryRunner +from google.genai import types + +load_dotenv(override=True) +logs.log_to_tmp_folder() + + +async def main(): + """Run happy path test demonstrating **kwargs parameter passing.""" + app_name = "crewai_kwargs_test" + user_id = "test_user" + + runner = InMemoryRunner( + agent=agent.root_agent, + app_name=app_name, + ) + + session = await runner.session_service.create_session( + app_name=app_name, user_id=user_id + ) + + print("=" * 60) + print("CrewAI Tool **kwargs Parameter Test") + print("=" * 60) + + # Test 1: Simple search without extra parameters + print("\n🧪 Test 1: Basic search (no extra parameters)") + print("-" * 60) + content1 = types.Content( + role="user", + parts=[types.Part.from_text(text="Search for Python tutorials")], + ) + print(f"User: {content1.parts[0].text}") + + async for event in runner.run_async( + user_id=user_id, + session_id=session.id, + new_message=content1, + ): + if event.content.parts and event.content.parts[0].text: + print(f"Agent: {event.content.parts[0].text}") + + # Test 2: Search with extra parameters (testing **kwargs) + print("\n🧪 Test 2: Search with filters (**kwargs test)") + print("-" * 60) + content2 = types.Content( + role="user", + parts=[ + types.Part.from_text( + text=( + "Search for machine learning articles, filtered by category" + " 'technology', date_range 'last_month', and limit to 10" + " results" + ) + ) + ], + ) + print(f"User: {content2.parts[0].text}") + + async for event in runner.run_async( + user_id=user_id, + session_id=session.id, + new_message=content2, + ): + if event.content.parts and event.content.parts[0].text: + print(f"Agent: {event.content.parts[0].text}") + + # Verify success + print("\n" + "=" * 60) + print("✅ Happy path test completed successfully!") + print("=" * 60) + print("\nVerified behaviors:") + print(" ✅ CrewAI tool integrated with ADK agent") + print(" ✅ Basic parameters passed correctly") + print(" ✅ Extra parameters passed through **kwargs") + print(" ✅ Tool executed and returned results") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/contributing/samples/custom_code_execution/README.md b/contributing/samples/custom_code_execution/README.md new file mode 100644 index 0000000000..edaf88b89c --- /dev/null +++ b/contributing/samples/custom_code_execution/README.md @@ -0,0 +1,71 @@ +# Custom Code Executor Agent Sample + +This directory contains a sample agent that demonstrates how to customize a +`CodeExecutor` to perform environment setup before executing code. The specific +example shows how to add support for Japanese fonts in `matplotlib` plots by +subclassing `VertexAiCodeExecutor`. + +## Overview + +This sample showcases a powerful pattern for customizing code execution +environments. By extending a base `CodeExecutor`, you can inject setup code to +prepare the environment before a user's code is run. This enables advanced use +cases that require specific configurations, in this case, adding custom fonts. + +## Key Concept: `CodeExecutor` Customization + +The Agent Development Kit (ADK) allows for powerful customization of code +execution by extending existing `CodeExecutor` classes. By subclassing an +executor (e.g., `VertexAiCodeExecutor`) and overriding its `execute_code` +method, you can inject custom logic to: + +- Modify the code before it's executed. +- Add files to the execution environment. +- Process the results after execution. + +## Example: Adding Japanese Font Support + +The `CustomCodeExecutor` in this sample solves a common issue where non-Latin +characters do not render correctly in plots generated by `matplotlib` due to +missing fonts in the execution environment. + +It achieves this by: 1. **Subclassing `VertexAiCodeExecutor`**: It inherits all +the functionality of the standard Vertex AI code executor. 2. **Overriding +`execute_code`**: Before calling the parent's `execute_code` method, it performs +the following steps: a. Downloads a Japanese font file (`NotoSerifJP`). b. Adds +the font file to the list of files to be uploaded to the execution environment. +c. Prepends a Python code snippet to the user's code. This snippet uses +`matplotlib.font_manager` to register the newly available font file, making it +available for plotting. 3. **Executing the modified code**: The combined code +(setup snippet + original code) is then executed in the Vertex AI environment, +which now has the Japanese font available for `matplotlib`. + +This ensures that any plots generated during the agent's session can correctly +display Japanese characters. + +## How to use + +### Prerequisites + +Ensure you have configured your environment for using +[Google Cloud Vertex AI](https://google.github.io/adk-docs/get-started/quickstart/#gemini---google-cloud-vertex-ai). +You will need to have a Google Cloud Project with the Vertex AI API enabled. + +### Running the agent + +You can run this agent using the ADK CLI. + +To interact with the agent through the command line: + +```bash +adk run contributing/samples/custom_code_execution "Plot a bar chart with these categories and values: {'リンゴ': 10, 'バナナ': 15, 'オレンジ': 8}. Title the chart '果物の在庫' (Fruit Stock)." +``` + +To use the web interface: + +```bash +adk web contributing/samples/ +``` + +Then select `custom_code_execution` from the list of agents and interact with +it. diff --git a/contributing/samples/custom_code_execution/__init__.py b/contributing/samples/custom_code_execution/__init__.py new file mode 100644 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/custom_code_execution/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/custom_code_execution/agent.py b/contributing/samples/custom_code_execution/agent.py new file mode 100644 index 0000000000..b62a9717ba --- /dev/null +++ b/contributing/samples/custom_code_execution/agent.py @@ -0,0 +1,166 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Data science agent, with a custom code executor that enables Japanese fonts.""" + +from __future__ import annotations + +import base64 +from typing import Optional +import urllib.request + +from google.adk.agents.invocation_context import InvocationContext +from google.adk.agents.llm_agent import Agent +from google.adk.code_executors.code_execution_utils import CodeExecutionInput +from google.adk.code_executors.code_execution_utils import CodeExecutionResult +from google.adk.code_executors.code_execution_utils import File +from google.adk.code_executors.vertex_ai_code_executor import VertexAiCodeExecutor +from typing_extensions import override + +# The Python code snippet to be prepended to the user's code. +# This will register the Japanese font with matplotlib. +_FONT_SETUP_CODE = """ +import matplotlib.font_manager as fm + +font_path = "NotoSerifJP[wght].ttf" +try: + fm.fontManager.addfont(font_path) + prop = fm.FontProperties(fname=font_path) + plt.rcParams['font.family'] = prop.get_name() + print("Japanese font enabled for matplotlib.") +except Exception as e: + print(f"Failed to set Japanese font: {e}") +""" + + +def _load_font_file(font_url: str, font_filename: str) -> Optional[File]: + """Downloads a font file and returns it as a File object.""" + try: + with urllib.request.urlopen(font_url) as response: + font_bytes = response.read() + except Exception as e: + print(f"Failed to download font: {e}") + return None + + # Base64-encode the font content. + font_content = base64.b64encode(font_bytes).decode("utf-8") + return File(name=font_filename, content=font_content) + + +class CustomCodeExecutor(VertexAiCodeExecutor): + """A Vertex AI code executor that automatically enables Japanese fonts.""" + + @override + def execute_code( + self, + invocation_context: InvocationContext, + code_execution_input: CodeExecutionInput, + ) -> CodeExecutionResult: + font_url = "https://github.com/notofonts/noto-cjk/raw/refs/heads/main/google-fonts/NotoSerifJP%5Bwght%5D.ttf" + font_filename = "NotoSerifJP[wght].ttf" + font_file = _load_font_file(font_url, font_filename) + # If the font download fails, execute the original code without it. + if font_file is not None: + # Add the font file to the input files. + code_execution_input.input_files.append(font_file) + + # Prepend the font setup code to the user's code. + code_execution_input.code = ( + f"{_FONT_SETUP_CODE}\n\n{code_execution_input.code}" + ) + + # Execute the modified code. + return super().execute_code(invocation_context, code_execution_input) + + +def base_system_instruction(): + """Returns: data science agent system instruction.""" + + return """ + # Guidelines + + **Objective:** Assist the user in achieving their data analysis goals within the context of a Python Colab notebook, **with emphasis on avoiding assumptions and ensuring accuracy.** Reaching that goal can involve multiple steps. When you need to generate code, you **don't** need to solve the goal in one go. Only generate the next step at a time. + + **Code Execution:** All code snippets provided will be executed within the Colab environment. + + **Statefulness:** All code snippets are executed and the variables stays in the environment. You NEVER need to re-initialize variables. You NEVER need to reload files. You NEVER need to re-import libraries. + + **Imported Libraries:** The following libraries are ALREADY imported and should NEVER be imported again: + + ```tool_code + import io + import math + import re + import matplotlib.pyplot as plt + import numpy as np + import pandas as pd + import scipy + ``` + + **Output Visibility:** Always print the output of code execution to visualize results, especially for data exploration and analysis. For example: + - To look a the shape of a pandas.DataFrame do: + ```tool_code + print(df.shape) + ``` + The output will be presented to you as: + ```tool_outputs + (49, 7) + + ``` + - To display the result of a numerical computation: + ```tool_code + x = 10 ** 9 - 12 ** 5 + print(f'{{x=}}') + ``` + The output will be presented to you as: + ```tool_outputs + x=999751168 + + ``` + - You **never** generate ```tool_outputs yourself. + - You can then use this output to decide on next steps. + - Print just variables (e.g., `print(f'{{variable=}}')`. + + **No Assumptions:** **Crucially, avoid making assumptions about the nature of the data or column names.** Base findings solely on the data itself. Always use the information obtained from `explore_df` to guide your analysis. + + **Available files:** Only use the files that are available as specified in the list of available files. + + **Data in prompt:** Some queries contain the input data directly in the prompt. You have to parse that data into a pandas DataFrame. ALWAYS parse all the data. NEVER edit the data that are given to you. + + **Answerability:** Some queries may not be answerable with the available data. In those cases, inform the user why you cannot process their query and suggest what type of data would be needed to fulfill their request. + + """ + + +root_agent = Agent( + model="gemini-2.5-flash", + name="data_science_agent", + instruction=base_system_instruction() + """ + + +You need to assist the user with their queries by looking at the data and the context in the conversation. +You final answer should summarize the code and code execution relavant to the user query. + +You should include all pieces of data to answer the user query, such as the table from code execution results. +If you cannot answer the question directly, you should follow the guidelines above to generate the next step. +If the question can be answered directly with writing any code, you should do that. +If you doesn't have enough data to answer the question, you should ask for clarification from the user. + +You should NEVER install any package on your own like `pip install ...`. +When plotting trends, you should make sure to sort and order the data by the x-axis. + + +""", + code_executor=CustomCodeExecutor(), +) diff --git a/contributing/samples/fields_output_schema/agent.py b/contributing/samples/fields_output_schema/agent.py index e3c6966847..70645ea9ba 100644 --- a/contributing/samples/fields_output_schema/agent.py +++ b/contributing/samples/fields_output_schema/agent.py @@ -16,7 +16,7 @@ from pydantic import BaseModel -class WeahterData(BaseModel): +class WeatherData(BaseModel): temperature: str humidity: str wind_speed: str @@ -43,6 +43,6 @@ class WeahterData(BaseModel): * wind_speed: 13 mph """, - output_schema=WeahterData, + output_schema=WeatherData, output_key='weather_data', ) diff --git a/contributing/samples/gepa/OWNERS b/contributing/samples/gepa/OWNERS new file mode 100644 index 0000000000..36064e743f --- /dev/null +++ b/contributing/samples/gepa/OWNERS @@ -0,0 +1,3 @@ +aarg +jief +paulxz \ No newline at end of file diff --git a/contributing/samples/gepa/README.md b/contributing/samples/gepa/README.md new file mode 100644 index 0000000000..8c67c62eaa --- /dev/null +++ b/contributing/samples/gepa/README.md @@ -0,0 +1,4 @@ +# Example: optimizing an ADK agent with Genetic-Pareto + +This directory contains an example demonstrating how to use the Agent Development +Kit (ADK) to run and optimize an LLM-based agent in a simulated environment with the Genetic-Pareto prompt optimization algorithm ([GEPA: Reflective Prompt Evolution Can Outperform Reinforcement Learning](https://arxiv.org/abs/2507.19457)) on benchmarks like Tau-bench. diff --git a/contributing/samples/gepa/__init__.py b/contributing/samples/gepa/__init__.py new file mode 100644 index 0000000000..0a2669d7a2 --- /dev/null +++ b/contributing/samples/gepa/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/contributing/samples/gepa/adk_agent.py b/contributing/samples/gepa/adk_agent.py new file mode 100644 index 0000000000..15e153da79 --- /dev/null +++ b/contributing/samples/gepa/adk_agent.py @@ -0,0 +1,292 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""ADK utils for a LLMAgent interacting with a simulation environment.""" + +from __future__ import annotations + +import asyncio +from collections.abc import Generator +from typing import Any +from typing import Dict +from typing import Optional +from typing import Protocol +from typing import runtime_checkable + +from absl import logging +from google.adk import runners +from google.adk.agents import base_agent +from google.adk.agents import llm_agent +from google.adk.agents import loop_agent +from google.adk.events import event as event_lib +from google.adk.models import google_llm +from google.adk.planners import built_in_planner +from google.adk.tools import base_tool +from google.genai import types +from retry import api as retry + + +class EnvResponse(Protocol): + """Environment response protocol.""" + + observation: str + done: bool + reward: float + + +@runtime_checkable +class Env(Protocol): + """Environment protocol.""" + + def step(self, action: types.Part) -> EnvResponse: + """Steps the environment with the given action.""" + ... + + def reset(self, task_index: int) -> EnvResponse: + """Resets the environment to the given task index.""" + ... + + +class _Tool(base_tool.BaseTool): + """A tool that executes an action in the environment.""" + + class Config: + arbitrary_types_allowed = True + + def __init__( + self, + function_declaration: types.FunctionDeclaration, + env: Env, + ): + """Initializes the tool. + + Args: + function_declaration: The function declaration of the tool. + env: The environment to interact with. + """ + super().__init__( + name=function_declaration.name, + description=function_declaration.description, + ) + self._function_declaration = function_declaration + self._env = env + + def _get_declaration(self) -> types.FunctionDeclaration: + return self._function_declaration + + async def run_async(self, *, args: Dict[str, Any], tool_context: Any) -> str: + """Runs the tool by converting tool call to env action and stepping env.""" + env_response = self._env.step( + types.Part(function_call=types.FunctionCall(name=self.name, args=args)) + ) + # We modify the ADK session state with the updates from the environment, + # in particular `done` and `reward`. These can be consumed downstream for + # instance to extract the trajectory reward or interrupt the loop. + tool_context.actions.state_delta['done'] = env_response.done + tool_context.actions.state_delta['reward'] = env_response.reward + tool_context.actions.skip_summarization = True + if env_response.done: + tool_context.actions.escalate = True + return env_response.observation + + +def _default_retry_options() -> types.HttpRetryOptions: + return types.HttpRetryOptions( + initial_delay=2, + attempts=4, + max_delay=None, + exp_base=2.0, + ) + + +def _adk_agent( + instruction: str, + tools: list[base_tool.BaseTool], + temperature: float, + model: str | None = None, + name: str | None = None, +) -> llm_agent.LlmAgent: + """Creates an ADK LLM agent with the given instruction and tools. + + Args: + instruction: The instruction for the agent. + tools: The tools for the agent to use. + temperature: The temperature for the LLM. + model: Model to use with the ADK LLMAgent ; defaults to `gemini-2.5-flash`. + name: Name to set for the ADK LLM agent. + + Returns: + An ADK LLM agent. + """ + # TDOO - Allow more flexibility in configuring the agent used in the loop. + return llm_agent.LlmAgent( + name=name or 'agent', + model=google_llm.Gemini( + model=model or 'gemini-2.5-flash', + retry_options=_default_retry_options(), + ), + planner=built_in_planner.BuiltInPlanner( + thinking_config=types.ThinkingConfig( + thinking_budget=-1, include_thoughts=False + ) + ), + instruction=instruction, + tools=tools, + generate_content_config=types.GenerateContentConfig( + temperature=temperature, + tool_config=types.ToolConfig( + function_calling_config=types.FunctionCallingConfig( + mode=types.FunctionCallingConfigMode.VALIDATED + ) + ), + http_options=types.HttpOptions( + timeout=30000, + retry_options=_default_retry_options(), + ), + ), + ) + + +class _UserAgent(base_agent.BaseAgent): + """An agent that wraps the provided environment and simulates an user.""" + + env: Env + + class Config: + arbitrary_types_allowed = True + + async def _run_async_impl(self, ctx: Any) -> Any: + """Runs the user agent.""" + if not ctx.session.events: + raise ValueError( + 'No prior session events, this is unexpected as the user agent cannot' + ' be the first step in the interaction loop.' + ) + last_event = ctx.session.events[-1] + + # Function tool + if last_event.content and last_event.content.role == 'user': + return + + if last_event.content and last_event.content.parts: + next_message = '\n\n'.join([p.text for p in last_event.content.parts]) + else: + logging.warn('Empty content with event=%s', last_event) + next_message = '' + env_response = retry.retry_call( + self.env.step, + fargs=(types.Part(text=next_message),), + tries=3, + delay=2, + backoff=2, + ) + + output_event = event_lib.Event( + content=types.Content( + parts=[types.Part(text=env_response.observation)], role='user' + ), + author='user', + ) + if env_response.done: + output_event.actions.escalate = True + output_event.actions.state_delta['reward'] = env_response.reward + output_event.actions.state_delta['done'] = env_response.done + yield output_event + + +def run_environment_loop( + instruction: str, + env: Env, + temperature: float, + tools: list[types.FunctionDeclaration], + task_index: int, + max_num_steps: int = 30, + plugins: Optional[Any] = None, + agent_model: str | None = None, + agent_name: str | None = None, +) -> Generator[event_lib.Event]: + """Defines and runs an ADK LLM Agent in the provided simulation environment. + + Args: + instruction: The instruction for the agent. + env: The environment to interact with. + temperature: The temperature for the LLM. + tools: The tools for the agent to use. + task_index: The index of the task to run. + max_num_steps: The maximum number of steps to run LLM agent - environment + interaction loop. + plugins: Optional plugins to use in the runner. + agent_model: Model to use with the ADK LLMAgent ; defaults to + `gemini-2.5-flash`. + agent_name: Name to set for the ADK LLM agent. + + Returns: + A generator of events from the agent run. + + Yields: + All the events from the environment loop including: + - Initial message from environment reset + - LLMAgent generated text and function calls + - Environment tools / users generated text responses + - Environment user + """ + # We use an agent loop to orchestrate the llm-agent and the environment + # interactions. In particular to: + # - ensure that LLMAgent and environment / user are called one after the + # other + # - the number of interaction steps is pre-defined (early exit is possible). + agent = loop_agent.LoopAgent( + name='env_loop_agent', + max_iterations=max_num_steps, + sub_agents=[ + _adk_agent( + instruction=instruction, + tools=[_Tool(t, env) for t in tools], + temperature=temperature, + model=agent_model, + name=agent_name, + ), + _UserAgent( + name='user_agent', + env=env, + ), + ], + ) + runner = runners.InMemoryRunner( + agent=agent, + app_name='eval_app', + plugins=plugins, + ) + session = asyncio.run( + runner.session_service.create_session( + app_name='eval_app', user_id='eval_user' + ) + ) + env_reset_res = env.reset(task_index=task_index) + initial_message = types.Content( + role='user', parts=[types.Part(text=env_reset_res.observation)] + ) + # The initial message is generated by the environment `reset` within the + # implementation of this function - as the first step of the trace. + # We yield this first step to ensure we provide a full trace to the user. + yield event_lib.Event( + author='user', + content=initial_message, + ) + for event in runner.run( + user_id=session.user_id, + session_id=session.id, + new_message=initial_message, + ): + yield event diff --git a/contributing/samples/gepa/adk_agent_test.py b/contributing/samples/gepa/adk_agent_test.py new file mode 100644 index 0000000000..2eea7325d9 --- /dev/null +++ b/contributing/samples/gepa/adk_agent_test.py @@ -0,0 +1,348 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import asyncio +import dataclasses +from unittest import mock + +from gepa import adk_agent +from google.adk import runners +from google.adk.agents import base_agent +from google.adk.events import event as event_lib +from google.adk.plugins import base_plugin +from google.genai import types + + +class _TestPlugin(base_plugin.BasePlugin): + + def __init__(self, outputs): + super().__init__(name="test-pluggin") + self._model_output_idx = 0 + self.got_llm_requests = [] + self._outputs = outputs + + async def before_model_callback(self, *, callback_context, llm_request): + self.got_llm_requests.append(llm_request) + if self._model_output_idx < len(self._outputs): + out = self._outputs[self._model_output_idx] + self._model_output_idx += 1 + return out + return event_lib.Event( + error_code="empty test list", + author="agent", + ) + + +@dataclasses.dataclass +class EnvResponse: + observation: str + done: bool + reward: float + + +class _TestEnv: + + def __init__(self, responses): + self._responses = responses + self._idx = 0 + + def step(self, action): + del action + if self._idx < len(self._responses): + resp = self._responses[self._idx] + self._idx += 1 + else: + resp = EnvResponse("out-of-bound", done=True, reward=0) + return resp + + def reset(self, task_index: int): + del task_index + return EnvResponse("reset-obs", done=False, reward=42) + + +def test_default_flow(): + model_outputs = [ + event_lib.Event( + content=types.Content( + parts=[types.Part(text="ab")], + role="model", + ), + author="agent", + ), + event_lib.Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name="test_tool", + args=dict(tool_inputs="fake-tool-inputs"), + ) + ) + ], + role="model", + ), + author="agent", + ), + event_lib.Event( + content=types.Content( + parts=[types.Part(text="cd")], + role="model", + ), + author="agent", + ), + ] + events = adk_agent.run_environment_loop( + instruction="some-instruction", + env=_TestEnv([ + EnvResponse("some-obs-1", done=False, reward=123), + EnvResponse("tool-response", done=False, reward=45), + EnvResponse("some-obs-2", done=False, reward=67), + ]), + temperature=0, + tools=[ + types.FunctionDeclaration( + name="test_tool", + description="test_tool", + parameters={ + "type": "object", + "properties": { + "tool_inputs": { + "type": "string", + "description": "tool_inputs", + } + }, + }, + ) + ], + task_index=0, + max_num_steps=3, + plugins=[ + _TestPlugin(model_outputs), + ], + ) + events = list(events) + want = [ + "reset-obs", + "ab", + "some-obs-1", + "test_tool", + "tool-response", + "cd", + "some-obs-2", + ] + + def _extract_from_event(event): + if not event.content: + return "" + if len(event.content.parts) != 1: + return "" + part = event.content.parts[0] + if part.function_call: + return part.function_call.name + if part.function_response: + return part.function_response.response.get("result") + return part.text + + got = [_extract_from_event(e) for e in events] + assert got == want + + got_rewards = [e.actions.state_delta.get("reward") for e in events] + assert got_rewards == [None, None, 123, None, 45, None, 67] + + +def test_intermediary_step_is_done(): + model_outputs = [ + event_lib.Event( + content=types.Content( + parts=[types.Part(text="ab")], + role="model", + ), + author="agent", + ), + event_lib.Event( + content=types.Content( + parts=[types.Part(text="cd")], + role="model", + ), + author="agent", + ), + ] + events = adk_agent.run_environment_loop( + instruction="some-instruction", + env=_TestEnv([ + EnvResponse("some-obs-1", done=True, reward=0), + EnvResponse("some-obs-2", done=False, reward=0), + ]), + temperature=0, + tools=[], + task_index=0, + max_num_steps=5, + plugins=[ + _TestPlugin(model_outputs), + ], + ) + want_text = ["reset-obs", "ab", "some-obs-1"] + got = [e.content.parts[0].text for e in events] + assert got == want_text + + +def test_intermediary_tool_step_is_done(): + model_outputs = [ + event_lib.Event( + content=types.Content( + parts=[types.Part(text="ab")], + role="model", + ), + author="agent", + ), + event_lib.Event( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall( + name="test_tool", + args=dict(tool_inputs="fake-tool-inputs"), + ) + ) + ], + role="model", + ), + author="agent", + ), + event_lib.Event( + content=types.Content( + parts=[types.Part(text="cd")], + role="model", + ), + author="agent", + ), + ] + events = adk_agent.run_environment_loop( + instruction="some-instruction", + env=_TestEnv([ + EnvResponse("some-obs-1", done=False, reward=123), + EnvResponse("tool-response", done=True, reward=45), + EnvResponse("some-obs-2", done=False, reward=67), + ]), + temperature=0, + tools=[ + types.FunctionDeclaration( + name="test_tool", + description="test_tool", + parameters={ + "type": "object", + "properties": { + "tool_inputs": { + "type": "string", + "description": "tool_inputs", + } + }, + }, + ) + ], + task_index=0, + max_num_steps=3, + plugins=[ + _TestPlugin(model_outputs), + ], + ) + events = list(events) + want = ["reset-obs", "ab", "some-obs-1", "test_tool", "tool-response"] + + def _extract_from_event(event): + if not event.content: + return "" + if len(event.content.parts) != 1: + return "" + part = event.content.parts[0] + if part.function_call: + return part.function_call.name + if part.function_response: + return part.function_response.response.get("result") + return part.text + + got = [_extract_from_event(e) for e in events] + assert got == want + + +def test_llm_request(): + model_outputs = [ + event_lib.Event( + content=types.Content( + parts=[types.Part(text="ab")], + role="model", + ), + author="agent", + ), + event_lib.Event( + content=types.Content( + parts=[types.Part(text="cd")], + role="model", + ), + author="agent", + ), + ] + test_plugin = _TestPlugin(model_outputs) + events = adk_agent.run_environment_loop( + instruction="some-instruction", + env=_TestEnv([ + EnvResponse("some-obs-1", done=False, reward=123), + EnvResponse("some-obs-2", done=False, reward=67), + ]), + temperature=0.123, + tools=[], + task_index=0, + max_num_steps=2, + plugins=[test_plugin], + ) + _ = list(events) + + assert len(test_plugin.got_llm_requests) == 2 + got = test_plugin.got_llm_requests[-1] + assert "some-instruction" in got.config.system_instruction + assert got.config.temperature == 0.123 + got_parts = [c.parts[0].text for c in got.contents] + assert got_parts == ["reset-obs", "ab", "some-obs-1"] + + +def test_model_name_is_set(): + class _MockAgent(base_agent.BaseAgent): + + async def _run_async_impl(self, ctx): + pass + + async def _mock_create_session(*args, **kwargs): + del args, kwargs + await asyncio.sleep(0.1) + return + + with mock.patch.object(runners, "InMemoryRunner") as mock_runner_cls: + mock_runner = mock_runner_cls.return_value + mock_runner.session_service.create_session.side_effect = ( + _mock_create_session + ) + mock_runner.run.return_value = [] + next( + adk_agent.run_environment_loop( + instruction="some-instruction", + env=_TestEnv([]), + temperature=0.123, + tools=[], + task_index=0, + agent_model="some-test-model", + plugins=[_TestPlugin([])], + ) + ) + mock_runner_cls.assert_called_once() + _, runner_kwargs = mock_runner_cls.call_args + assert runner_kwargs["agent"].sub_agents[0].model.model == "some-test-model" diff --git a/contributing/samples/gepa/experiment.py b/contributing/samples/gepa/experiment.py new file mode 100644 index 0000000000..b7a79caeeb --- /dev/null +++ b/contributing/samples/gepa/experiment.py @@ -0,0 +1,675 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Runs Tau-bench.""" + +from __future__ import annotations + +from concurrent.futures import ThreadPoolExecutor +import dataclasses +from datetime import datetime +import json +import logging +import multiprocessing +import os +import random +import traceback +from typing import Any +from typing import Callable +from typing import TypedDict + +import gepa +from gepa.core.adapter import EvaluationBatch +from gepa.core.adapter import GEPAAdapter +from google.genai import types +from litellm import provider_list +import rater_lib +from retry import retry +from tau_bench.envs import get_env +from tau_bench.envs.retail import tasks_dev +from tau_bench.envs.retail import tasks_test +from tau_bench.envs.retail import tasks_train +from tau_bench.envs.user import UserStrategy +from tau_bench.run import display_metrics +from tau_bench.types import EnvRunResult +from tau_bench.types import RunConfig +import tau_bench_agent as tau_bench_agent_lib + +from google import genai + + +class FilterInferenceWarnings(logging.Filter): + """Filters out Vertex inference warning about non-text parts in response.""" + + def filter(self, record: logging.LogRecord) -> bool: + """Filters out Vertex inference warning about non-text parts in response.""" + if record.levelname != 'WARNING': + return True + message_identifier = record.getMessage() + return not message_identifier.startswith( + 'Warning: there are non-text parts in the response:' + ) + + +def run_tau_bench_rollouts( + config: RunConfig, + print_results: bool = False, + system_instruction: str | None = None, + rater: rater_lib.Rater | None = None, +) -> list[EnvRunResult]: + """Runs a set of tau-bench tasks with a given agent configuration. + + This is a customized version of the standard tau-bench run function, adapted + for this experiment's needs. It handles environment setup, agent creation, + task execution in parallel, and result aggregation. + + Args: + config: A RunConfig object specifying the environment, models, and other + parameters for the run. + print_results: If True, prints the result of each task as it completes. + system_instruction: An optional system instruction to use for the agent, + overriding the default. + rater: An optional rater to evaluate the agent's performance. + + Returns: + A list of EnvRunResult objects, one for each completed task. + """ + if config.env not in ['retail', 'airline']: + raise ValueError('Only retail and airline envs are supported') + if config.model_provider not in provider_list: + raise ValueError('Invalid model provider') + if config.user_model_provider not in provider_list: + raise ValueError('Invalid user model provider') + if config.agent_strategy not in ['tool-calling', 'act', 'react', 'few-shot']: + raise ValueError('Invalid agent strategy') + if config.task_split not in ['train', 'test', 'dev']: + raise ValueError('Invalid task split') + if config.user_strategy not in [item.value for item in UserStrategy]: + raise ValueError('Invalid user strategy') + + random.seed(config.seed) + time_str = datetime.now().strftime('%m%d%H%M%S') + model_name = config.model.split('/')[-1] + ckpt_filename = ( + f'{config.agent_strategy}-{model_name}-{config.temperature}_range_' + f'{config.start_index}-{config.end_index}_user-{config.user_model}-' + f'{config.user_strategy}_{time_str}.json' + ) + ckpt_path = os.path.join(config.log_dir, ckpt_filename) + if not os.path.exists(config.log_dir): + os.makedirs(config.log_dir) + + print(f'Loading user with strategy: {config.user_strategy}') + env = get_env( + config.env, + user_strategy=config.user_strategy, + user_model=config.user_model, + user_provider=config.user_model_provider, + task_split=config.task_split, + ) + if system_instruction: + env.wiki = system_instruction + agent = tau_bench_agent_lib.adk_agent_factory( + tools_info=env.tools_info, + wiki=env.wiki, + config=config, + ) + if config.end_index == -1: + end_index = len(env.tasks) + else: + end_index = min(config.end_index, len(env.tasks)) + results: list[EnvRunResult] = [] + lock = multiprocessing.Lock() + if config.task_ids: + print(f'Running tasks {config.task_ids} (checkpoint path: {ckpt_path})') + else: + print( + f'Running tasks {config.start_index} to {end_index} ' + f'(checkpoint path: {ckpt_path})' + ) + for i in range(config.num_trials): + if config.task_ids: + idxs = config.task_ids + else: + idxs = list(range(config.start_index, end_index)) + if config.shuffle: + random.shuffle(idxs) + + @retry(tries=3, delay=10, backoff=2) + def _run_with_retry(idx: int) -> EnvRunResult: + isolated_env = get_env( + config.env, + user_strategy=config.user_strategy, + user_model=config.user_model, + task_split=config.task_split, + user_provider=config.user_model_provider, + task_index=idx, + ) + if print_results: + print(f'Running task {idx}') + res = agent.solve( + env=isolated_env, + task_index=idx, + ) + + rating = ( + rater(res.messages[1:] if len(res.messages) > 1 else res.messages) + if rater + else None + ) + info = dict(res.info) + info['metrics'] = dict(rating=rating, reward=res.reward) + + if rater: + score = rating['score'] + feedback = {k: v for k, v in rating.items() if k != 'score'} + else: + score = res.reward + feedback = ( + 'The agent successfully resolved all customer issues' + if score > 0 + else 'The agent failed to resolve all customer issues correctly' + ) + + info['feedback'] = feedback + return EnvRunResult( + task_id=idx, + reward=score, + info=info, + traj=res.messages, + trial=i, + ) + + def _run(idx: int) -> EnvRunResult: + try: + result = _run_with_retry(idx) + except Exception as e: + logging.warning('Inference error: %s', str(e)) + result = EnvRunResult( + task_id=idx, + reward=0.0, + info={ + 'error': str(e), + 'traceback': traceback.format_exc(), + 'metrics': dict(reward=0.0), + }, + traj=[], + trial=i, + ) + + if print_results: + print( + '✅' if result.reward == 1 else '❌', + f'task_id={idx}', + ) + print('-----') + with lock: + data = [] + if os.path.exists(ckpt_path): + with open(ckpt_path, 'r') as f: + data = json.load(f) + with open(ckpt_path, 'w') as f: + json.dump(data + [result.model_dump()], f, indent=2) + return result + + with ThreadPoolExecutor(max_workers=config.max_concurrency) as executor: + res = list(executor.map(_run, idxs)) + results.extend(res) + + display_metrics(results) + + if rater: + print('Environment reward:') + display_metrics([ + EnvRunResult( + task_id=r.task_id, + reward=r.info['metrics']['reward'], + info={}, + traj=[], + trial=r.trial, + ) + for r in results + ]) + + with open(ckpt_path, 'w') as f: + json.dump([result.model_dump() for result in results], f, indent=2) + print(f'\n📄 Results saved to {ckpt_path}\n') + return results + + +class TauBenchDataInst(TypedDict): + env: str + task_id: int + task_split: str + + +class TauBenchTrajectory(TypedDict): + + result_traj: list[dict[str, Any]] + + +class TauBenchRolloutOutput(TypedDict): + env: str + task_id: int + reward: float + task_info: dict[str, Any] + + +class TauBenchAdapter( + GEPAAdapter[ + TauBenchDataInst, + TauBenchTrajectory, + TauBenchRolloutOutput, + ] +): + """A GEPA adapter for evaluating agent performance on tau-bench benchmark.""" + + def __init__( + self, + env_name: str, + agent_model: str = 'gemini-2.5-flash', + agent_model_provider: str = 'vertex_ai', + user_model: str = 'gemini-2.5-pro', + user_model_provider: str = 'vertex_ai', + agent_strategy: str = 'tool-calling', + user_strategy: str = 'llm', + system_instruction_name: str = 'system_instruction', + max_concurrency: int = 4, + rater: rater_lib.Rater | None = None, + log_dir: str | None = None, + ): + """Initializes the TauBenchAdapter. + + Args: + env_name: environment + agent_model: The model to use for the agent. + agent_model_provider: The provider for the agent model. + user_model: The model to use for simulating the user. + user_model_provider: The provider for the user model. + agent_strategy: The agent strategy to use (e.g., 'tool-calling'). + user_strategy: The user simulation strategy (e.g., 'llm'). + system_instruction_name: The key in the candidate dictionary that holds + the system instruction. + max_concurrency: The maximum number of tasks to run in parallel. + rater: An optional rater to evaluate the agent's performance. + log_dir: The directory to save traces and other logs. + """ + self._env_name = env_name + self._agent_model = agent_model + self._agent_model_provider = agent_model_provider + self._user_model = user_model + self._user_model_provider = user_model_provider + self._agent_strategy = agent_strategy + self._user_strategy = user_strategy + self._max_concurrency = max_concurrency + self._system_instruction_name = system_instruction_name + self._rater = rater + self._log_dir = log_dir + + def evaluate( + self, + batch: list[TauBenchDataInst], + candidate: dict[str, str], + capture_traces: bool = False, + ) -> EvaluationBatch[TauBenchTrajectory, TauBenchRolloutOutput]: + """Evaluates a candidate prompt on a batch of tau-bench tasks. + + This method is called by GEPA during the optimization loop. It takes a + candidate prompt, runs it against the specified tasks from tau-bench, and + returns the results. + + Args: + batch: A list of task instances to evaluate on. Each instance specifies + the environment and task ID. + candidate: A dictionary containing the components to be evaluated, + including the system instruction. + capture_traces: (Not used in this adapter) Whether to capture detailed + traces. + + Returns: + An EvaluationBatch object containing scores, outputs, and trajectories for + each task in the batch. + """ + del capture_traces # Not used. + env = batch[0]['env'] + task_ids = [inst['task_id'] for inst in batch] + tau_bench_run_config = RunConfig( + env=env, + model=self._agent_model, + model_provider=self._agent_model_provider, + user_model=self._user_model, + user_model_provider=self._user_model_provider, + agent_strategy=self._agent_strategy, + user_strategy=self._user_strategy, + max_concurrency=self._max_concurrency, + task_ids=task_ids, + log_dir=self._log_dir, + task_split=batch[0]['task_split'], + ) + tau_bench_results = run_tau_bench_rollouts( + tau_bench_run_config, + system_instruction=candidate.get(self._system_instruction_name), + rater=self._rater, + ) + + outputs = [] + trajectories = [] + scores = [] + for res in tau_bench_results: + outputs.append( + TauBenchRolloutOutput( + env=env, + task_id=res.task_id, + reward=res.reward, + task_info=res.info, + ) + ) + result_traj = res.traj + trajectories.append(TauBenchTrajectory(result_traj=result_traj)) + scores.append(res.reward) + + return EvaluationBatch( + scores=scores, outputs=outputs, trajectories=trajectories + ) + + def make_reflective_dataset( + self, + candidate: dict[str, str], + eval_batch: EvaluationBatch[TauBenchTrajectory, TauBenchRolloutOutput], + components_to_update: list[str], + ) -> dict[str, list[dict[str, Any]]]: + """Creates a dataset for reflection based on evaluation results. + + This method transforms the trajectories and scores from an evaluation run + into a structured format that a reflection model can use to generate + suggestions for improving the prompt. + + Args: + candidate: The candidate that was evaluated. + eval_batch: The results of the evaluation. + components_to_update: A list of component names that the reflection should + focus on improving. + + Returns: + A dictionary where keys are component names and values are lists of + data instances for reflection. + """ + system_instruction = candidate[self._system_instruction_name] + + env = get_env( + self._env_name, + user_strategy=self._user_strategy, + user_model=self._user_model, + user_provider=self._user_model_provider, + task_split='train', + ) + + tool_definitions = json.dumps( + env.tools_info, + indent=2, + default=str, + ) + inputs = '\n\n'.join([ + f'# System Instruction\n{system_instruction}', + f'# Tool Definitions\n{tool_definitions}', + ]) + ret_d: dict[str, list[dict[str, Any]]] = {} + for comp in components_to_update: + items: list[dict[str, Any]] = [] + trace_instances = list( + zip( + eval_batch.trajectories, + eval_batch.scores, + eval_batch.outputs, + strict=True, + ) + ) + for trace_instance in trace_instances: + traj, _, rollout = trace_instance + messages = traj['result_traj'] + # Remove instructions. + if len(messages) > 1: + messages = messages[1:] + d = { + 'Inputs': inputs, + 'Generated Outputs': json.dumps(messages, indent=2, default=str), + 'Feedback': json.dumps( + rollout['task_info']['feedback'], indent=2, default=str + ), + } + items.append(d) + if items: + ret_d[comp] = items + assert ret_d, ( + 'empty reflective dataset for components ' + f'{[comp for comp in components_to_update]}' + ) + return ret_d + + +_DATASET_SPLITS = { + 'train': tasks_train.TASKS_TRAIN, + 'dev': tasks_dev.TASKS_DEV, + 'test': tasks_test.TASKS_TEST, +} + + +def _get_dataset(ds: Dataset) -> list[TauBenchDataInst]: + task_ids = ds.indexes or list(range(len(_DATASET_SPLITS[ds.split]))) + if ds.max_size is not None: + task_ids = task_ids[: ds.max_size] + random.shuffle(task_ids) + return task_ids + + +def _get_datasets( + config: ExperimentConfig, +) -> dict[str, list[int]]: + """Returns Tau-bench dataset splits.""" + random.seed(config.rnd_seed) + train_task_ids = _get_dataset(config.feedback_dataset) + eval_task_ids = _get_dataset(config.pareto_dataset) + test_task_ids = _get_dataset(config.eval_dataset) + logging.info( + 'Using datasets of size: train=%d, eval=%d, test=%d', + len(train_task_ids), + len(eval_task_ids), + len(test_task_ids), + ) + return dict( + train=train_task_ids, + dev=eval_task_ids, + test=test_task_ids, + ) + + +def _reflection_inference_fn(model: str) -> Callable[[str], str]: + """Returns an inference function on VertexAI based on provided model.""" + client = genai.Client() + + @retry(tries=3, delay=10, backoff=2) + def _fn(prompt): + return client.models.generate_content( + model=model, + contents=prompt, + config=types.GenerateContentConfig( + candidate_count=1, + thinking_config=types.ThinkingConfig( + include_thoughts=True, thinking_budget=-1 + ), + ), + ).text + + return _fn + + +SEED_SYSTEM_INSTRUCTION = ( + 'you are a customer support agent helping customers resolve their ' + 'issues by using the right tools' +) + + +@dataclasses.dataclass(frozen=True) +class Dataset: + + split: str + indexes: list[int] | None = None + max_size: int = None + + +@dataclasses.dataclass +class ExperimentConfig: + """Configures a GEPA experiment on Tau-bench.""" + + tau_bench_env: str + agent_model: str + agent_model_provider: str + user_model: str + user_model_provider: str + max_concurrency: int + num_eval_trials: int + rnd_seed: int + max_metric_calls: int + reflection_model: str + reflection_minibatch_size: int + use_rater: bool + feedback_dataset: Dataset + pareto_dataset: Dataset + eval_dataset: Dataset + + +def _rater(config: ExperimentConfig) -> rater_lib.Rater: + env = get_env( + config.tau_bench_env, + user_strategy='llm', + user_model=config.user_model, + user_provider=config.user_model_provider, + task_split='train', + ) + return rater_lib.Rater(json.dumps(env.tools_info, indent=2)) + + +def run_gepa( + output_dir: str, seed_instructions: str, config: ExperimentConfig +) -> Any: + """Runs the GEPA optimization loop to train a new system instruction. + + Args: + output_dir: The directory to save experiment results and artifacts. + seed_instructions: Agent instructions to initialize the agent with. + config: The experiment configuration. + + Returns: + The results of the GEPA optimization. + """ + # This section sets up and runs the GEPA optimization experiment. + # Here we define all the parameters for the tau-bench environment, the GEPA + # optimization loop, and the models to be used. + datasets = _get_datasets(config) + training_set = [ + TauBenchDataInst( + env=config.tau_bench_env, + task_id=task_id, + task_split=config.feedback_dataset.split, + ) + for task_id in datasets['train'] + ] + eval_set = [ + TauBenchDataInst( + env=config.tau_bench_env, + task_id=task_id, + task_split=config.pareto_dataset.split, + ) + for task_id in datasets['dev'] + ] + system_instruction_name = 'system_instruction' + + tau_bench_adapter = TauBenchAdapter( + env_name=config.tau_bench_env, + agent_model=config.agent_model, + agent_model_provider=config.agent_model_provider, + user_model=config.user_model, + user_model_provider=config.user_model_provider, + agent_strategy='tool-calling', + user_strategy='llm', + system_instruction_name=system_instruction_name, + max_concurrency=config.max_concurrency, + rater=_rater(config) if config.use_rater else None, + log_dir=os.path.join(output_dir, 'traces'), + ) + + gepa_results = gepa.optimize( + seed_candidate={ + system_instruction_name: seed_instructions, + }, + trainset=training_set, + valset=eval_set, + task_lm=None, # this must be None when a custom adapter is used + adapter=tau_bench_adapter, + max_metric_calls=config.max_metric_calls, + reflection_lm=_reflection_inference_fn(config.reflection_model), + reflection_minibatch_size=config.reflection_minibatch_size, + run_dir=output_dir, + ) + json.dump( + gepa_results.to_dict(), + open(os.path.join(output_dir, 'results.json'), 'w'), + ) + return gepa_results + + +def run_eval(output_dir: str, instructions: str, config: ExperimentConfig): + """Runs evaluation on the test set using the given instructions. + + Args: + output_dir: The directory to save evaluation results. + instructions: The system instructions to evaluate. + config: The experiment configuration. + """ + eval_dataset = _get_dataset(config.eval_dataset) + tau_bench_run_config = RunConfig( + env=config.tau_bench_env, + model=config.agent_model, + model_provider=config.agent_model_provider, + user_model=config.user_model, + user_model_provider=config.user_model_provider, + agent_strategy='tool-calling', + user_strategy='llm', + max_concurrency=config.max_concurrency, + num_trials=config.num_eval_trials, + task_ids=eval_dataset, + log_dir=output_dir, + task_split=config.eval_dataset.split, + ) + with open(os.path.join(output_dir, 'prompt.txt'), 'w') as f: + f.write(instructions) + + json.dump( + tau_bench_run_config.model_dump(), + open(os.path.join(output_dir, 'run_config.json'), 'w'), + ) + tau_bench_results = run_tau_bench_rollouts( + tau_bench_run_config, + system_instruction=instructions, + rater=_rater(config) if config.use_rater else None, + ) + total = len(tau_bench_results) + numerator = sum(1 for res in tau_bench_results if res.reward == 1) + print( + f'average reward (total={total}): {numerator/total if total > 0 else 0}' + ) + json.dump( + dict(results=[r.model_dump() for r in tau_bench_results]), + open(os.path.join(output_dir, 'results.json'), 'w'), + ) diff --git a/contributing/samples/gepa/gepa_tau_bench.ipynb b/contributing/samples/gepa/gepa_tau_bench.ipynb new file mode 100644 index 0000000000..448fdc8d9b --- /dev/null +++ b/contributing/samples/gepa/gepa_tau_bench.ipynb @@ -0,0 +1,1533 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "882gPGOGM7-i" + }, + "source": [ + "# Optimizing Agent Prompts with GEPA on Tau-bench\n", + "\n", + "This demo notebook walks you through optimizing an AI agent's prompt using the\n", + "**Genetic-Pareto (GEPA)** algorithm. We'll use the Google Agent Development\n", + "Kit (ADK) to build and run our agent in **Tau-bench**, a benchmark designed to\n", + "test agents in realistic, conversational scenarios involving tool use and\n", + "adherence to policies.\n", + "\n", + "**Our Goal:** To take a simple, underperforming prompt and automatically\n", + "improve it using GEPA, increasing the agent's reliability on a customer\n", + "support task.\n", + "\n", + "## Prerequisites\n", + "\n", + "* **Google Cloud Project:** You'll need access to a Google Cloud Project with\n", + " Vertex AI enabled to run the language models.\n", + "* **Installation:** Ensure `google-adk`, `tau-bench`, and\n", + " `google-cloud-aiplatform` are installed.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "GqUHYdvRJ7pt", + "language": "python" + }, + "outputs": [], + "source": [ + "#@title Install Tau-bench and GEPA\n", + "!git clone https://github.com/sierra-research/tau-bench.git\n", + "%cd tau-bench/\n", + "!pip install -e . --quiet\n", + "\n", + "%cd ..\n", + "!pip install gepa --quiet\n", + "\n", + "!pip install retry --quiet" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "SdGCJfEtz8Nq", + "cellView": "form" + }, + "outputs": [], + "source": [ + "#@title Setup and Authentication\n", + "from datetime import datetime\n", + "import json\n", + "import logging\n", + "import os\n", + "\n", + "from google.genai import types\n", + "import experiment as experiment_lib\n", + "\n", + "\n", + "# @markdown ### ☁️ Configure Vertex AI Access\n", + "# @markdown Enter your Google Cloud Project ID and Location.\n", + "\n", + "#@markdown Configure Vertex AI Access\n", + "\n", + "GCP_PROJECT = '' #@param {type: 'string'}\n", + "GCP_LOCATION = 'us-central1' #@param {type: 'string'}\n", + "\n", + "# @markdown ---\n", + "# @markdown ### 🧠 Configure LLM Models\n", + "# @markdown We recommend starting with Flash models for speed and cost-efficiency\n", + "# @markdown during optimization, but larger models like `gemini-1.5-pro` can also\n", + "# @markdown be used, especially for the reflection model.\n", + "AGENT_MODEL_NAME = 'gemini-2.5-flash' # @param {type: 'string'}\n", + "USER_MODEL_NAME = 'gemini-2.5-flash' # @param {type: 'string'}\n", + "REFLECTION_MODEL_NAME = 'gemini-2.5-pro' # @param {type: 'string'}\n", + "\n", + "# @markdown ---\n", + "# @markdown ### ⚙️ Configure Experiment Parameters\n", + "# @markdown These control the dataset size, evaluation runs, and GEPA budget.\n", + "# @markdown For a quick demo, keep these values small. For a real run, you might\n", + "# @markdown increase `MAX_DATASET_SIZE` to 50-100 and `MAX_METRIC_CALLS` to 100+.\n", + "MAX_DATASET_SIZE = 10 # @param {type: 'integer'}\n", + "NUM_EVAL_TRIALS = 4 # @param {type: 'integer'}\n", + "MAX_METRIC_CALLS = 100 # @param {type: 'integer'}\n", + "MAX_CONCURRENCY = 4 # @param {type: 'integer'}\n", + "\n", + "# The ADK uses these environment variables to connect to Vertex AI via the\n", + "# Google GenAI SDK.\n", + "os.environ['GOOGLE_GENAI_USE_VERTEXAI'] = 'true'\n", + "os.environ['GOOGLE_CLOUD_PROJECT'] = GCP_PROJECT\n", + "os.environ['GOOGLE_CLOUD_LOCATION'] = GCP_LOCATION\n", + "\n", + "# Set a logging verbosity suited for this experiment. See\n", + "# https://github.com/google/adk-python/issues/1852 for context\n", + "types.logger.addFilter(experiment_lib.FilterInferenceWarnings())" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HbKlznZHvskm" + }, + "source": [ + "# Initial Inference: A First Look at Our Agent\n", + "\n", + "Before we start optimizing, let's see how our agent performs with a very basic\n", + "prompt. This will help us understand the task and see what a failure case looks\n", + "like.\n", + "\n", + "**The Task:** We're using the **'retail'** environment from Tau-bench. In this\n", + "environment, our agent acts as a customer support agent for an online store. It\n", + "needs to use a set of tools (like `check_order_status`, `issue_refund`, etc.)\n", + "to help a simulated user resolve their issues, while following specific support\n", + "policies (e.g., only refunding orders less than 30 days old).\n", + "\n", + "**Our Agent:** The agent is built with ADK using a standard tool-calling\n", + "strategy. It receives the conversation history and a list of available tools,\n", + "and it must decide whether to respond to the user or call a tool.\n", + "\n", + "**The Initial Prompt:** We'll start with a simple, one-line instruction. As\n", + "we'll see, this is often not enough for an agent to perform reliably in complex\n", + "scenarios." + ] + }, + { + "cell_type": "code", + "source": [ + "#@title Define an initial instruction\n", + "\n", + "# @markdown This is our starting \"seed\" prompt. It's very generic and doesn't give the agent much guidance on how to behave or use tools.\n", + "BASE_SYSTEM_INSTRUCTION = 'you are a customer support agent helping customers resolve their issues by using the right tools' # @param {type: 'string'}\n", + "\n", + "print(BASE_SYSTEM_INSTRUCTION)" + ], + "metadata": { + "id": "U8FyG4ep1OLW", + "cellView": "form" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "GNlTPbCXvskn", + "outputId": "02514309-4027-4760-9724-b8cadfbf7c86", + "cellView": "form" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading user with strategy: llm\n", + "Running tasks [1, 2, 9, 12] (checkpoint path: results/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104135627.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 95679.854398078)])']\n", + "connector: \n", + "Unclosed client session\n", + "client_session: \n", + "Unclosed connector\n", + "connections: ['deque([(, 95859.665770103)])']\n", + "connector: \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.25\n", + "📈 Pass^k\n", + " k=1: 0.25\n", + "\n", + "📄 Results saved to results/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104135627.json\n", + "\n" + ] + } + ], + "source": [ + "#@title Initial Inference: A First Look at Our Agent\n", + "\n", + "from tau_bench.types import EnvRunResult, RunConfig\n", + "\n", + "# We will run our ADK agent on two tasks from the Tau-bench 'dev' set.\n", + "# The `run_tau_bench_rollouts` function handles the interaction between the\n", + "# agent and the simulated user environment.\n", + "print('Running initial inference for tasks 1 and 2...')\n", + "inference_results = experiment_lib.run_tau_bench_rollouts(\n", + " config=RunConfig(\n", + " env='retail',\n", + " model=AGENT_MODEL_NAME,\n", + " model_provider='vertex_ai',\n", + " user_model=USER_MODEL_NAME,\n", + " user_model_provider='vertex_ai',\n", + " agent_strategy='tool-calling',\n", + " user_strategy='llm', # The user is simulated by an LLM\n", + " max_concurrency=MAX_CONCURRENCY,\n", + " task_ids=[\n", + " 1,\n", + " 2,\n", + " ], # We'll just run two specific tasks for this initial look\n", + " task_split='dev',\n", + " ),\n", + " system_instruction=BASE_SYSTEM_INSTRUCTION,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "B3ZEiRgZvskn", + "outputId": "804df2c6-964e-4982-e298-64d14ba2d84e", + "cellView": "form" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "--- Trajectory Example ---\n", + "**SYSTEM**: you are a customer support agent helping customers resolve their issues by using the right tools\n", + "\n", + "**USER**: Hello. I need to make an exchange regarding a recent order I received.\n", + "\n", + "**MODEL**: I can help you with that. What is the order ID?\n", + "\n", + "**USER**: The order ID is #W7273336.\n", + "\n", + "**MODEL**: Okay, you want to exchange items from order #W7273336.\n", + "\n", + "Could you please tell me:\n", + "1. What are the item IDs of the products you wish to exchange?\n", + "2. What are the item IDs of the new products you would like to receive?\n", + "3. What payment method would you like to use to cover any price differences or receive refunds (e.g., gift card, credit card)?\n", + "\n", + "**USER**: I don't have the specific item IDs at hand, but I can describe the products. I received a black laser gaming mouse and a 4-foot metal bookshelf. I need to exchange both of these.\n", + "\n", + "**MODEL**: I understand. Since you don't have the item IDs, I'll need to look up the order details to identify them.\n", + "\n", + "\n", + "**MODEL**: 📞 Tool Call: `get_order_details(order_id='#W7273336')`\n", + "\n", + "**USER**: ↪️ Tool Response from `get_order_details`: `{\"order_id\": \"#W7273336\", \"user_id\": \"omar_lopez_3107\", \"address\": {\"address1\": \"959 Broadway\", \"address2\": \"Suite 363\", \"city\": \"Los Angeles\", \"country\": \"USA\", \"state\": \"CA\", \"zip\": \"90339\"}, \"items\": [{\"name\": \"Espresso Machine\", \"product_id\": \"4354588079\", \"item_id\": \"6200867091\", \"price\": 2955.17, \"options\": {\"pressure\": \"19 bar\", \"capacity\": \"1L\", \"type\": \"capsule\"}}, {\"name\": \"Bookshelf\", \"product_id\": \"8600330539\", \"item_id\": \"8018699955\", \"price\": 467.86, \"options\": {\"material\": \"metal\", \"color\": \"brown\", \"height\": \"4 ft\"}}, {\"name\": \"Gaming Mouse\", \"product_id\": \"5713490933\", \"item_id\": \"8214883393\", \"price\": 150.58, \"options\": {\"color\": \"black\", \"sensor type\": \"laser\", \"connectivity\": \"wireless\"}}, {\"name\": \"Pet Bed\", \"product_id\": \"2747247837\", \"item_id\": \"6857426243\", \"price\": 196.53, \"options\": {\"size\": \"medium\", \"material\": \"fleece\", \"color\": \"grey\"}}, {\"name\": \"Air Purifier\", \"product_id\": \"3821016478\", \"item_id\": \"9375701158\", \"price\": 489.5, \"options\": {\"room size\": \"medium\", \"filter type\": \"carbon\", \"features\": \"quiet operation\"}}], \"fulfillments\": [{\"tracking_id\": [\"555296392986\"], \"item_ids\": [\"6200867091\", \"8018699955\", \"8214883393\", \"6857426243\", \"9375701158\"]}], \"status\": \"delivered\", \"payment_history\": [{\"transaction_type\": \"payment\", \"amount\": 4259.64, \"payment_method_id\": \"paypal_1530316\"}]}`\n", + "\n", + "**MODEL**: Thank you for waiting. I've looked up the details for order #W7273336.\n", + "\n", + "The item ID for the black laser gaming mouse is **8214883393**.\n", + "The item ID for the 4-foot metal bookshelf is **8018699955**.\n", + "\n", + "Now, please tell me:\n", + "1. What are the item IDs of the new gaming mouse and bookshelf you would like to receive?\n", + "2. What payment method would you like to use to cover any price differences or receive refunds (e.g., gift card, credit card)? The original payment method for this order was PayPal, with `payment_method_id`: \"paypal_1530316\")?\n", + "\n", + "**USER**: Thank you for providing those. I need to exchange the black laser gaming mouse (item ID 8214883393). I'd like to get a white optical mouse instead. The black doesn't suit my setup, and I prefer optical over laser. I don't care if it's wired or wireless, just whichever is cheaper.\n", + "\n", + "As for the 4-foot metal bookshelf (item ID 8018699955), it's just too short. I need a taller one. I want to exchange it for a 5-feet tall glass bookshelf.\n", + "\n", + "Regarding the glass bookshelf, I'm not sure about the color yet. What are the available color options for the 5-feet glass bookshelves? As for payment, we can discuss that once we figure out the replacement items.\n", + "\n", + "**MODEL**: Okay, I understand. You want to exchange the black laser gaming mouse (item ID 8214883393) for a white optical mouse, and the 4-foot metal bookshelf (item ID 8018699955) for a 5-foot tall glass bookshelf.\n", + "\n", + "Let's find the options for these. First, I'll look up the product types to find suitable replacements.\n", + "\n", + "\n", + "**MODEL**: 📞 Tool Call: `list_all_product_types()`\n", + "\n", + "**USER**: ↪️ Tool Response from `list_all_product_types`: `{\"Action Camera\": \"3377618313\", \"Air Purifier\": \"3821016478\", \"Backpack\": \"2524789262\", \"Bicycle\": \"9783735446\", \"Bluetooth Speaker\": \"4768869376\", \"Bookshelf\": \"8600330539\", \"Coffee Maker\": \"7996920482\", \"Cycling Helmet\": \"7765186836\", \"Desk Lamp\": \"6817146515\", \"Digital Camera\": \"8940227892\", \"Dumbbell Set\": \"7233192239\", \"E-Reader\": \"3801771308\", \"Electric Kettle\": \"1075968781\", \"Electric Toothbrush\": \"7352963235\", \"Espresso Machine\": \"4354588079\", \"Fleece Jacket\": \"8560156827\", \"Gaming Mouse\": \"5713490933\", \"Garden Hose\": \"6679515468\", \"Grill\": \"6819683148\", \"Headphones\": \"6992792935\", \"Hiking Boots\": \"7363354090\", \"Indoor Security Camera\": \"2985987096\", \"Jigsaw Puzzle\": \"1808611083\", \"LED Light Bulb\": \"2696197613\", \"Laptop\": \"4760268021\", \"Luggage Set\": \"5426915165\", \"Makeup Kit\": \"5149340237\", \"Mechanical Keyboard\": \"1656367028\", \"Notebook\": \"2892623495\", \"Office Chair\": \"4794339885\", \"Patio Umbrella\": \"9743693396\", \"Perfume\": \"6858788497\", \"Pet Bed\": \"2747247837\", \"Portable Charger\": \"6942297802\", \"Running Shoes\": \"6938111410\", \"Skateboard\": \"1968349452\", \"Smart Thermostat\": \"4896585277\", \"Smart Watch\": \"6945232052\", \"Smartphone\": \"1801728040\", \"Sneakers\": \"7471004230\", \"Sunglasses\": \"7314138884\", \"T-Shirt\": \"9523456873\", \"Tablet\": \"8024098596\", \"Tea Kettle\": \"9832717871\", \"Vacuum Cleaner\": \"1762337868\", \"Wall Clock\": \"2344688344\", \"Water Bottle\": \"8310926033\", \"Wireless Earbuds\": \"9924732112\", \"Wristwatch\": \"6066914160\", \"Yoga Mat\": \"4635925001\"}`\n", + "\n", + "**MODEL**: Okay, I have the product IDs. Now I'll look up the details for gaming mice and bookshelves to find suitable replacements based on your preferences.\n", + "\n", + "First, let's check for white optical gaming mice.\n", + "\n", + "**MODEL**: 📞 Tool Call: `get_product_details(product_id='5713490933')`\n", + "\n", + "**USER**: ↪️ Tool Response from `get_product_details`: `{\"name\": \"Gaming Mouse\", \"product_id\": \"5713490933\", \"variants\": {\"8896479688\": {\"item_id\": \"8896479688\", \"options\": {\"color\": \"white\", \"sensor type\": \"optical\", \"connectivity\": \"wireless\"}, \"available\": true, \"price\": 143.15}, \"8214883393\": {\"item_id\": \"8214883393\", \"options\": {\"color\": \"black\", \"sensor type\": \"laser\", \"connectivity\": \"wireless\"}, \"available\": true, \"price\": 150.58}, \"7420906769\": {\"item_id\": \"7420906769\", \"options\": {\"color\": \"white\", \"sensor type\": \"laser\", \"connectivity\": \"wireless\"}, \"available\": false, \"price\": 138.47}, \"2193628750\": {\"item_id\": \"2193628750\", \"options\": {\"color\": \"black\", \"sensor type\": \"laser\", \"connectivity\": \"wired\"}, \"available\": true, \"price\": 162.15}, \"2880340443\": {\"item_id\": \"2880340443\", \"options\": {\"color\": \"white\", \"sensor type\": \"optical\", \"connectivity\": \"wired\"}, \"available\": true, \"price\": 137.22}, \"5019835484\": {\"item_id\": \"5019835484\", \"options\": {\"color\": \"RGB\", \"sensor type\": \"laser\", \"connectivity\": \"wired\"}, \"available\": false, \"price\": 138.73}, \"3330317167\": {\"item_id\": \"3330317167\", \"options\": {\"color\": \"black\", \"sensor type\": \"optical\", \"connectivity\": \"wired\"}, \"available\": true, \"price\": 137.32}, \"5796612084\": {\"item_id\": \"5796612084\", \"options\": {\"color\": \"RGB\", \"sensor type\": \"optical\", \"connectivity\": \"wired\"}, \"available\": false, \"price\": 158.89}}}`\n", + "\n", + "**MODEL**: Okay, I've found two white optical gaming mouse options:\n", + "\n", + "* A **wireless white optical mouse** (item ID: 8896479688) for $143.15.\n", + "* A **wired white optical mouse** (item ID: 2880340443) for $137.22.\n", + "\n", + "Since you prefer the cheaper option, the **wired white optical mouse (item ID: 2880340443)** would be the one.\n", + "\n", + "Now, let's look for the 5-foot tall glass bookshelf and its color options.\n", + "\n", + "**MODEL**: 📞 Tool Call: `get_product_details(product_id='8600330539')`\n", + "\n", + "**USER**: ↪️ Tool Response from `get_product_details`: `{\"name\": \"Bookshelf\", \"product_id\": \"8600330539\", \"variants\": {\"8479046075\": {\"item_id\": \"8479046075\", \"options\": {\"material\": \"wood\", \"color\": \"white\", \"height\": \"5 ft\"}, \"available\": true, \"price\": 451.01}, \"8895454203\": {\"item_id\": \"8895454203\", \"options\": {\"material\": \"glass\", \"color\": \"white\", \"height\": \"5 ft\"}, \"available\": true, \"price\": 504.65}, \"6735339143\": {\"item_id\": \"6735339143\", \"options\": {\"material\": \"metal\", \"color\": \"brown\", \"height\": \"6 ft\"}, \"available\": true, \"price\": 471.77}, \"7373893106\": {\"item_id\": \"7373893106\", \"options\": {\"material\": \"glass\", \"color\": \"white\", \"height\": \"4 ft\"}, \"available\": false, \"price\": 531.22}, \"4894369688\": {\"item_id\": \"4894369688\", \"options\": {\"material\": \"glass\", \"color\": \"brown\", \"height\": \"5 ft\"}, \"available\": true, \"price\": 537.01}, \"1673859111\": {\"item_id\": \"1673859111\", \"options\": {\"material\": \"wood\", \"color\": \"black\", \"height\": \"4 ft\"}, \"available\": true, \"price\": 484.96}, \"1111254697\": {\"item_id\": \"1111254697\", \"options\": {\"material\": \"glass\", \"color\": \"white\", \"height\": \"6 ft\"}, \"available\": true, \"price\": 531.57}, \"3778705663\": {\"item_id\": \"3778705663\", \"options\": {\"material\": \"metal\", \"color\": \"black\", \"height\": \"6 ft\"}, \"available\": true, \"price\": 473.48}, \"8649999816\": {\"item_id\": \"8649999816\", \"options\": {\"material\": \"glass\", \"color\": \"brown\", \"height\": \"4 ft\"}, \"available\": false, \"price\": 540.49}, \"2960542086\": {\"item_id\": \"2960542086\", \"options\": {\"material\": \"wood\", \"color\": \"black\", \"height\": \"5 ft\"}, \"available\": true, \"price\": 512.77}, \"7154215719\": {\"item_id\": \"7154215719\", \"options\": {\"material\": \"wood\", \"color\": \"brown\", \"height\": \"6 ft\"}, \"available\": true, \"price\": 505.62}, \"4900661478\": {\"item_id\": \"4900661478\", \"options\": {\"material\": \"glass\", \"color\": \"black\", \"height\": \"5 ft\"}, \"available\": true, \"price\": 463.04}, \"1768466237\": {\"item_id\": \"1768466237\", \"options\": {\"material\": \"glass\", \"color\": \"black\", \"height\": \"3 ft\"}, \"available\": true, \"price\": 549.84}, \"2989722512\": {\"item_id\": \"2989722512\", \"options\": {\"material\": \"glass\", \"color\": \"white\", \"height\": \"3 ft\"}, \"available\": false, \"price\": 455.34}, \"7539442683\": {\"item_id\": \"7539442683\", \"options\": {\"material\": \"metal\", \"color\": \"black\", \"height\": \"4 ft\"}, \"available\": true, \"price\": 461.49}, \"8920458606\": {\"item_id\": \"8920458606\", \"options\": {\"material\": \"wood\", \"color\": \"white\", \"height\": \"4 ft\"}, \"available\": true, \"price\": 510.02}, \"2244749153\": {\"item_id\": \"2244749153\", \"options\": {\"material\": \"wood\", \"color\": \"brown\", \"height\": \"5 ft\"}, \"available\": true, \"price\": 473.82}, \"8018699955\": {\"item_id\": \"8018699955\", \"options\": {\"material\": \"metal\", \"color\": \"brown\", \"height\": \"4 ft\"}, \"available\": true, \"price\": 467.86}}}`\n", + "\n", + "**MODEL**: Great! I've found the options for the 5-foot tall glass bookshelf.\n", + "\n", + "For the **gaming mouse**, you can exchange your black laser gaming mouse (item ID 8214883393) for a **wired white optical mouse** (item ID 2880340443) for $137.22.\n", + "\n", + "For the **bookshelf**, you can exchange your 4-foot metal bookshelf (item ID 8018699955) for a 5-foot tall glass bookshelf. The available colors are:\n", + "* **White** (item ID: 8895454203) for $504.65\n", + "* **Brown** (item ID: 4894369688) for $537.01\n", + "* **Black** (item ID: 4900661478) for $463.04\n", + "\n", + "Which color would you prefer for the 5-foot tall glass bookshelf? Once you confirm the items, we can proceed with the exchange and discuss the payment method for any price differences.\n", + "\n", + "**USER**: Okay, that mouse sounds good. I'll go with the wired white optical mouse (item ID 2880340443).\n", + "\n", + "As for the bookshelf, hmm, white, brown, black... I'm really torn. Given my setup, I think the brown would actually look quite elegant. Yes, let's go with the brown 5-feet glass bookshelf (item ID 4894369688).\n", + "\n", + "**MODEL**: Excellent choices!\n", + "\n", + "So, to confirm, you would like to:\n", + "* Exchange the black laser gaming mouse (item ID 8214883393) for the wired white optical mouse (item ID 2880340443).\n", + "* Exchange the 4-foot metal bookshelf (item ID 8018699955) for the brown 5-foot glass bookshelf (item ID 4894369688).\n", + "\n", + "Before I process the exchange, please confirm which payment method you'd like to use for any price difference. The original payment method for this order was PayPal (payment method ID: paypal_1530316). Would you like to use this, or do you have another payment method in mind?\n", + "\n", + "**USER**: Yes, that's correct for both exchanges. And using PayPal, the original payment method, for any price difference is perfectly fine.\n", + "\n", + "**MODEL**: Great! I will proceed with exchanging the black laser gaming mouse (item ID 8214883393) for the wired white optical mouse (item ID 2880340443), and the 4-foot metal bookshelf (item ID 8018699955) for the brown 5-foot glass bookshelf (item ID 4894369688). Any price difference will be handled using your PayPal account (paypal_1530316).\n", + "\n", + "Please confirm with \"yes\" or \"no\" if you would like to proceed with this exchange.\n", + "\n", + "**USER**: Yes.\n", + "###STOP###\n", + "\n" + ] + } + ], + "source": [ + "#@title Let's visualize one of the sampled trajectory\n", + "\n", + "def display_trajectory(trajectory):\n", + " \"\"\"Formats and prints a trajectory for display in Colab.\"\"\"\n", + " print('--- Trajectory Example ---')\n", + " for turn in trajectory:\n", + " role = turn['role']\n", + " parts = turn['parts']\n", + " for part in parts:\n", + " if txt := part.get('text'):\n", + " print(f'**{role.upper()}**: {txt}')\n", + " elif fc := part.get('function_call'):\n", + " args_str = ', '.join(f'{k}={v!r}' for k, v in fc['args'].items())\n", + " print(f'**{role.upper()}**: 📞 Tool Call: `{fc[\"name\"]}({args_str})`')\n", + " elif fr := part.get('function_response'):\n", + " try:\n", + " # result is often a JSON string that needs parsing for readability\n", + " result = json.dumps(json.loads(fr['result']), indent=2)\n", + " print(\n", + " f'**{role.upper()}**: ↪️ Tool Response from'\n", + " f' `{fr[\"name\"]}`:\\n```json\\n{result}\\n```'\n", + " )\n", + " except Exception:\n", + " print(\n", + " f'**{role.upper()}**: ↪️ Tool Response from'\n", + " f' `{fr[\"name\"]}`: `{fr[\"response\"][\"result\"]}`'\n", + " )\n", + " print() # new line after each turn\n", + "\n", + "\n", + "# Let's inspect the \"trajectory\" of the first run. A trajectory is the full\n", + "# log of the conversation, including user messages, agent thoughts, tool calls,\n", + "# and tool outputs. Analyzing trajectories is key to understanding why an agent\n", + "# fails or succeeds.\n", + "print('\\nDisplaying trajectory for Task 1:')\n", + "display_trajectory(inference_results[0].traj)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Evaluate the Initial Prompt: Getting a Baseline\n", + "\n", + "Running a couple of examples gives us a qualitative feel, but to systematically\n", + "improve our prompt, we need quantitative metrics. Let's evaluate our basic\n", + "prompt on a small dataset to get a baseline performance score.\n", + "\n", + "The primary metric in Tau-bench is **reward**, which is 1 if the agent\n", + "successfully completes the task according to the environment's goals (e.g.,\n", + "user issue resolved, correct tool calls made) and 0 otherwise. Our goal is to\n", + "maximize the average reward." + ], + "metadata": { + "id": "cA70NpvcxanK" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "mVFTLlSq5Lqn", + "outputId": "d22b2c37-ea3d-47fa-b7c0-d1a69e7ae585" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading user with strategy: llm\n", + "Running tasks [9, 8, 4, 2, 5, 3, 1, 0, 7, 6] (checkpoint path: temp_results/20251104150054446083/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104150054.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.525\n", + "📈 Pass^k\n", + " k=1: 0.525\n", + " k=2: 0.31666666666666665\n", + " k=3: 0.175\n", + " k=4: 0.1\n", + "\n", + "📄 Results saved to temp_results/20251104150054446083/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104150054.json\n", + "\n", + "average reward (total=40): 0.525\n" + ] + } + ], + "source": [ + "# For this demo, we'll use a small dataset. In a real-world scenario, you\n", + "# would use larger, distinct datasets for training, validation, and testing.\n", + "demo_dataset = experiment_lib.Dataset(split='dev', max_size=MAX_DATASET_SIZE)\n", + "\n", + "# We configure the experiment parameters, including the models, dataset,\n", + "# evaluation settings, and GEPA budget.\n", + "demo_config = experiment_lib.ExperimentConfig(\n", + " tau_bench_env='retail',\n", + " agent_model=AGENT_MODEL_NAME,\n", + " agent_model_provider='vertex_ai',\n", + " user_model=USER_MODEL_NAME,\n", + " user_model_provider='vertex_ai',\n", + " max_concurrency=MAX_CONCURRENCY,\n", + " num_eval_trials=NUM_EVAL_TRIALS, # We run each task multiple times for consistency\n", + " rnd_seed=42,\n", + " max_metric_calls=MAX_METRIC_CALLS, # GEPA budget: max prompt evaluations\n", + " reflection_model=REFLECTION_MODEL_NAME, # Model for GEPA's reflection step\n", + " reflection_minibatch_size=8,\n", + " use_rater=False, # Optional: LLM rater for nuanced feedback\n", + " # For this demo, we use the same small dataset for all splits.\n", + " # In a real optimization run, you would use separate datasets:\n", + " # - feedback_dataset: For generating trajectories for reflection.\n", + " # - pareto_dataset: For evaluating candidate prompts.\n", + " # - eval_dataset: A final, held-out set to test the optimized prompt.\n", + " feedback_dataset=demo_dataset,\n", + " pareto_dataset=demo_dataset,\n", + " eval_dataset=demo_dataset,\n", + ")\n", + "\n", + "# We'll save the results of our runs in a temporary directory.\n", + "eval_output_dir = os.path.join(\n", + " 'eval_results', datetime.now().strftime('%Y%m%d%H%M%S%f')\n", + ")\n", + "os.makedirs(eval_output_dir)\n", + "logging.info('Writing to output_dir=%s', eval_output_dir)\n", + "\n", + "\n", + "# The `run_eval` function runs the agent with the given prompt on the evaluation\n", + "# dataset and prints the average reward.\n", + "print(f'--- Evaluating BASELINE prompt on {MAX_DATASET_SIZE} tasks ---')\n", + "eval_results = experiment_lib.run_eval(\n", + " output_dir=eval_output_dir,\n", + " config=demo_config,\n", + " instructions=BASE_SYSTEM_INSTRUCTION,\n", + ")\n", + "\n", + "# This will show the detailed results of the evaluation run.\n", + "# The most important number is the final \"average reward\".\n", + "print('\\nBaseline evaluation results:')\n", + "print(eval_results)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Run Prompt Optimization with GEPA\n", + "\n", + "Now we'll use **GEPA** to automatically improve our prompt.\n", + "\n", + "## What is GEPA?\n", + "\n", + "**GEPA (Genetic-Pareto)** is a prompt optimization algorithm that learns from\n", + "trial and error, using LLM-based reflection to understand failures and guide\n", + "prompt evolution. Here's a simplified view of how it works:\n", + "\n", + "1. **Run & Collect:** It runs the agent with a candidate prompt on a\n", + " few training examples (the `feedback_dataset`) to collect interaction\n", + " trajectories.\n", + "2. **Reflect:** It gives the trajectories to a \"reflection\" model,\n", + " which analyzes what went wrong and generates high-level\n", + " insights or \"rules\" for improvement. For example, it might notice *\"The\n", + " agent should always confirm the order number before issuing a refund.\"*\n", + "3. **Evolve:** It uses these insights to propose new candidate prompts by\n", + " editing existing prompts or combining ideas from different successful ones,\n", + " inspired by genetic algorithms.\n", + "4. **Evaluate & Select:** It evaluates these new prompts on a validation set\n", + " (the `pareto_dataset`) and keeps only the best-performing, diverse set of\n", + " prompts (the \"Pareto frontier\").\n", + "5. **Repeat:** It repeats this loop—collect, reflect, evolve, evaluate—until it\n", + " reaches its budget (`max_metric_calls`).\n", + "\n", + "The result is a detailed and robust prompt that has learned from its mistakes,\n", + "often capturing nuances that are difficult to discover through manual prompt\n", + "engineering." + ], + "metadata": { + "id": "iWZ0yYhfyGuC" + } + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "nqLkS8Abvskp", + "outputId": "179b299e-df19-453c-c76a-63d5d81784bb", + "cellView": "form" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading user with strategy: llm\n", + "Running tasks [3, 5, 2, 4, 1, 8, 7, 0, 6, 9] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104153507.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.7\n", + "📈 Pass^k\n", + " k=1: 0.7\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104153507.json\n", + "\n", + "Iteration 0: Base program full valset score: 0.7\n", + "Iteration 1: Selected program 0 score: 0.7\n", + "Loading user with strategy: llm\n", + "Running tasks [0, 1, 3, 2] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104153806.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.5\n", + "📈 Pass^k\n", + " k=1: 0.5\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104153806.json\n", + "\n", + "Iteration 1: Proposed new text for system_instruction: You are a customer support agent whose primary goal is to resolve customer issues efficiently and empathetically by utilizing the provided tools. Maintain a polite, helpful, and professional tone at all times.\n", + "\n", + "**Here's a breakdown of your responsibilities and guidelines:**\n", + "\n", + "1. **Initial Interaction & Information Gathering:**\n", + " * Always greet the customer warmly and acknowledge their issue.\n", + " * Prioritize obtaining the customer's order ID first.\n", + " * If the order ID is unavailable, attempt to find the user via `find_user_id_by_email`.\n", + " * If `find_user_id_by_email` returns an error, prompt the user for their first name, last name, and zip code to use `find_user_id_by_name_zip`.\n", + " * Once a `user_id` is successfully identified, use `get_user_details` to retrieve their order history and other relevant information.\n", + " * If multiple orders are associated with the user and the customer hasn't specified, use `get_order_details` for each relevant order to identify the one pertaining to their issue (e.g., by item name or type).\n", + " * For exchanges or modifications, use `get_product_details` to find available options and prices based on the customer's preferences and criteria.\n", + "\n", + "2. **Executing Actions (Cancellation, Exchange, Return, Modification):**\n", + " * **Explain Clearly:** Before attempting any action that modifies an order or user account, clearly explain the details of what will happen, including any associated timelines, requirements, or limitations (e.g., refund processing times, one-time exchange limits, follow-up emails for returns).\n", + " * **Seek Explicit Confirmation:** *Always* ask the user for explicit \"yes\" or \"no\" confirmation before calling any tool that alters their order or account. Reiterate the confirmed details to ensure accuracy.\n", + " * **Tool Calling:** Once explicit confirmation is received and all necessary arguments are gathered, call the appropriate tool. Infer parameters like cancellation `reason` (\"no longer needed\", \"ordered by mistake\") from the user's stated problem.\n", + " * **Report Outcome:** After a tool successfully executes, inform the customer of the outcome and any immediate or next steps they should expect (e.g., \"Your order has been cancelled,\" \"You will receive an email with return instructions shortly\").\n", + "\n", + "3. **Handling Limitations and Escalation:**\n", + " * **Acknowledge Tool Limitations:** Be aware of the specific constraints of your tools (e.g., `cancel_pending_order` only works for pending orders; `exchange_delivered_order_items` can only be done once per delivered order).\n", + " * **Unresolvable Requests:** If a customer's request cannot be fulfilled by any of your available tools (e.g., issuing coupons, direct price matching, or providing immediate refunds for credit card payments outside of the specified processing time), clearly and politely state your inability to perform that specific action.\n", + " * **Offer Transfer to Human Agent:** In cases where you cannot resolve the issue with your tools, or if the user explicitly requests it, offer to `transfer_to_human_agents`.\n", + " * **Comprehensive Summary for Transfer:** When transferring, provide a thorough and concise `summary` for the human agent. This summary should include the user's details, the full history of the conversation, the specific request, what actions were attempted, and why a transfer is necessary. If the user expresses specific conditions for the transfer, acknowledge them and assure the user that the human agent will be fully briefed on their concerns.\n", + "Loading user with strategy: llm\n", + "Running tasks [0, 1, 3, 2] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104153920.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.25\n", + "📈 Pass^k\n", + " k=1: 0.25\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104153920.json\n", + "\n", + "Iteration 1: New subsample score 1.0 is not better than old score 2.0, skipping\n", + "Iteration 2: Selected program 0 score: 0.7\n", + "Loading user with strategy: llm\n", + "Running tasks [6, 8, 4, 5] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104154009.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.5\n", + "📈 Pass^k\n", + " k=1: 0.5\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104154009.json\n", + "\n", + "Iteration 2: Proposed new text for system_instruction: you are a customer support agent helping customers resolve their issues by using the right tools.\n", + "\n", + "Here's how you should operate:\n", + "\n", + "1. **Understand the User's Core Issue:** Carefully identify what the user is trying to achieve (e.g., cancel an order, return an item, change an address, troubleshoot a technical problem).\n", + "\n", + "2. **Information Gathering - Order & User Details:**\n", + " * Always try to obtain the `order_id` first, as many tools require it and it's the most direct way to identify an order. Remember order IDs start with `#W`.\n", + " * If the user doesn't know the `order_id`, ask for their email address to use `find_user_id_by_email`.\n", + " * If the user cannot provide an email or if `find_user_id_by_email` fails to find a user, then ask for their first name, last name, and zip code to use `find_user_id_by_name_zip`.\n", + " * Once a `user_id` is obtained, use `get_user_details` to retrieve all associated `order_id`s, `payment_method`s, and addresses.\n", + " * For each relevant `order_id` (especially if multiple orders are found or the user's request is vague), use `get_order_details` to get its status and `item_id`s. This is crucial for verifying if an action (like cancellation, return, exchange, or modification) is applicable based on the order's status (e.g., 'pending' vs. 'delivered').\n", + " * Note that `product_id` is different from `item_id`. Ensure you are using the correct identifier for the specific tool parameter.\n", + "\n", + "3. **Tool Selection and Application - General Guidelines:**\n", + " * **Prioritize direct resolution with available tools.**\n", + " * Before executing any modifying action (cancel, modify, exchange, return), **always explicitly ask for user confirmation (yes/no)** after clearly explaining the details and implications (e.g., refund time, items involved, new address).\n", + " * **Crucially, once explicit \"yes\" confirmation is received for a modifying action, immediately call the corresponding tool.** Do not wait for further input after a \"yes\" unless the tool description explicitly states to.\n", + " * If a user makes multiple requests or adds to a request (e.g., returning a second item), update the proposed action to include all items and re-confirm the *entire* request with the user before executing the tool.\n", + "\n", + "4. **Tool-Specific Guidelines:**\n", + " * **`cancel_pending_order(order_id, reason)`:**\n", + " * Only for *pending* orders. If an order is \"processed\" or \"delivered\", it cannot be cancelled.\n", + " * The `reason` must be either \"no longer needed\" or \"ordered by mistake\". Infer this from the user's statement.\n", + " * Explain the cancellation and refund details: gift card refunds are immediate, while other payment methods (like PayPal, credit card) take 5-7 business days to process.\n", + " * **`return_delivered_order_items(order_id, item_ids, payment_method_id)`:**\n", + " * Only for *delivered* orders. The order status will change to 'return requested'.\n", + " * Explain return details: the user will receive a follow-up email with return instructions (how and where to send the item back).\n", + " * Determine the `payment_method_id` for the refund (either the original payment method or a gift card, based on user preference). If the user doesn't specify, offer both options.\n", + " * **`exchange_delivered_order_items(order_id, item_ids, new_item_ids, payment_method_id)` / `modify_pending_order_items(order_id, item_ids, new_item_ids, payment_method_id)`:**\n", + " * `exchange_delivered_order_items` is for *delivered* orders; `modify_pending_order_items` is for *pending* orders.\n", + " * For either, this action can only be done once per order.\n", + " * Ensure `new_item_ids` correspond to the same product type as `item_ids` and are in the same position.\n", + " * Determine the `payment_method_id` for any price differences.\n", + " * **`modify_pending_order_address(order_id, ...)` / `modify_pending_order_payment(order_id, ...)`:**\n", + " * These are strictly for *pending* orders.\n", + " * **`modify_user_address(user_id, ...)`:**\n", + " * Modifies the user's default shipping address, not a specific order's address unless explicitly stated by the user that they want to update their default address.\n", + "\n", + "5. **Handling Technical Issues and Faulty Products:**\n", + " * If a user reports a *technical issue* with a delivered product (e.g., \"earbuds not pairing\") and indicates that the product might be \"faulty\" or they have \"tried everything\", **first consider offering a return or exchange using the `return_delivered_order_items` or `exchange_delivered_order_items` tools.** These are direct solutions for defective items.\n", + " * Only if the user explicitly asks for technical troubleshooting *before* a return/exchange, or if the problem is purely informational/troubleshooting-based and cannot be resolved by any modification, return, or exchange tool, should you offer to `transfer_to_human_agents`.\n", + "\n", + "6. **Transfer to Human Agent (`transfer_to_human_agents(summary)`):**\n", + " * Use this tool if the user *explicitly requests* a human agent, or if the user's issue *cannot be resolved with any of the available tools* (e.g., a complex technical troubleshooting issue that genuinely requires expert help beyond a simple return/exchange, or a policy question not covered).\n", + " * Provide a clear, detailed, and concise `summary` of the user's issue and what has been attempted or discovered so far (e.g., user ID, order ID, specific item, problem description, previous troubleshooting steps if known).\n", + "\n", + "7. **Final Communication:** After a successful tool call, inform the user clearly about the outcome, any next steps, and what to expect (e.g., \"refund processed in 5-7 business days\", \"return labels emailed shortly\"). Conclude by asking if there's anything else you can assist with.\n", + "\n", + "8. **Maintain Professionalism:** Be empathetic, clear, and efficient in your communication. Avoid prematurely ending conversations (`###STOP###`) if further action or confirmation is required based on the user's last input or the natural flow of the resolution process.\n", + "Loading user with strategy: llm\n", + "Running tasks [6, 8, 4, 5] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104154113.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.75\n", + "📈 Pass^k\n", + " k=1: 0.75\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104154113.json\n", + "\n", + "Iteration 2: New subsample score 3.0 is better than old score 2.0. Continue to full eval and add to candidate pool.\n", + "Loading user with strategy: llm\n", + "Running tasks [3, 5, 2, 4, 1, 8, 7, 0, 6, 9] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104154203.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.8\n", + "📈 Pass^k\n", + " k=1: 0.8\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104154203.json\n", + "\n", + "Iteration 2: New program is on the linear pareto front\n", + "Iteration 2: Full valset score for new program: 0.8\n", + "Iteration 2: Full train_val score for new program: 0.8\n", + "Iteration 2: Individual valset scores for new program: [1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0]\n", + "Iteration 2: New valset pareto front scores: [1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0]\n", + "Iteration 2: Full valset pareto front score: 0.9\n", + "Iteration 2: Updated valset pareto front programs: [{0, 1}, {0, 1}, {1}, {0}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {0, 1}, {1}]\n", + "Iteration 2: Best valset aggregate score so far: 0.8\n", + "Iteration 2: Best program as per aggregate score on train_val: 1\n", + "Iteration 2: Best program as per aggregate score on valset: 1\n", + "Iteration 2: Best score on valset: 0.8\n", + "Iteration 2: Best score on train_val: 0.8\n", + "Iteration 2: Linear pareto front program index: 1\n", + "Iteration 2: New program candidate index: 1\n", + "Iteration 3: Selected program 0 score: 0.7\n", + "Loading user with strategy: llm\n", + "Running tasks [7, 9, 9, 7] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104154520.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.5\n", + "📈 Pass^k\n", + " k=1: 1.0\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104154520.json\n", + "\n", + "Iteration 3: Proposed new text for system_instruction: You are a customer support agent helping customers resolve their issues by using the right tools. Your primary goal is to efficiently resolve customer issues while providing clear and helpful communication.\n", + "\n", + "**General Principles:**\n", + "\n", + "1. **Be Proactive in Information Gathering**:\n", + " * Always try to identify the customer's order by asking for the `order_id` first.\n", + " * If the `order_id` is unknown, attempt to find the `user_id` using their `email` with `find_user_id_by_email`.\n", + " * If the email is not available or the user cannot remember it, use `find_user_id_by_name_zip` with their `first_name`, `last_name`, and `zip` code.\n", + " * Once a `user_id` is obtained, use `get_user_details` to retrieve all associated `orders` and `payment_methods`. This is crucial for subsequent actions involving specific orders or payment details.\n", + " * For each relevant order found, use `get_order_details` to ascertain its status and item specifics.\n", + " * If a customer mentions a product by name but not its `item_id` or `product_id`, use `list_all_product_types` to find the `product_id`, then `get_product_details` to find the specific `item_id` and its variants.\n", + "\n", + "2. **Clear Communication & Confirmation**:\n", + " * Before calling any tool that modifies an order, user details, or initiates a transaction (e.g., `cancel_pending_order`, `exchange_delivered_order_items`, `modify_pending_order_address`, `modify_pending_order_items`, `modify_pending_order_payment`, `modify_user_address`, `return_delivered_order_items`), you **must** explain the exact details of the action and its consequences to the user.\n", + " * **Always** ask for explicit user confirmation (a clear \"yes\" or \"no\") before proceeding with any modifying tool call.\n", + "\n", + "3. **Payment Method Handling**:\n", + " * For any tool requiring a `payment_method_id` (for refunds or charges), you must use the exact ID format (e.g., `credit_card_0000000`, `gift_card_0000000`, `paypal_0000000`).\n", + " * Never guess or use generic terms like \"credit_card_paypal\". If the user states a preference for a payment type (like PayPal) but doesn't provide an ID, first attempt to find a valid `payment_method_id` from the `get_user_details` tool results. If a valid ID is found, use it. If not, inform the user about the limitation and propose alternatives or a transfer to a human agent.\n", + "\n", + "4. **Handling Returns/Exchanges for Delivered Items**:\n", + " * When a user wants to return a delivered item, use `return_delivered_order_items`. Explain that the order status will become 'return requested', a follow-up email with return instructions will be sent, and the refund typically takes 5-7 business days to process.\n", + " * If the user expresses concern about the item's condition (e.g., \"chipped skateboard\" in Example 1) and asks for a guarantee of a full refund, explicitly state that the refund amount is subject to inspection upon return. If the user then insists on a guarantee that cannot be provided, transfer them to a human agent.\n", + " * If the user simply wishes to return an item without specific concerns about its condition impacting the refund (as in Example 4), proceed with the return for the full item price using `return_delivered_order_items`.\n", + " * When a user wants to exchange a delivered item, use `exchange_delivered_order_items`. This can only be done once per delivered order.\n", + "\n", + "5. **Error Recovery**:\n", + " * If a tool call fails (e.g., due to an invalid parameter or a system error), inform the user about the error. Analyze the error message and attempt to correct the issue by gathering more specific information from the user or by using other tools to obtain the correct parameters (e.g., `get_user_details` to find the correct `payment_method_id` after a \"payment method not found\" error).\n", + "\n", + "6. **Transfer to Human Agent**:\n", + " * Only use the `transfer_to_human_agents` tool if:\n", + " * The user explicitly asks to speak with a human agent.\n", + " * You have exhausted all available tools and cannot resolve the user's issue (e.g., you cannot fulfill a user's request for a specific payment method that isn't supported by your tools and no alternative is acceptable to the user, or you cannot guarantee a specific outcome that the tools don't support).\n", + " * When transferring, provide a concise and informative `summary` of the user's issue and the attempts made to resolve it.\n", + "\n", + "**Specific Tool Information to Remember:**\n", + "\n", + "* Order IDs typically start with a '#' symbol, like `#W0000000`.\n", + "* Product IDs are different from item IDs.\n", + "* `cancel_pending_order` is only for orders with `status: \"pending\"`. Refunds go to gift card immediately if paid by gift card; otherwise, 5-7 business days.\n", + "* `modify_pending_order_items` can only be called once per pending order.\n", + "* `exchange_delivered_order_items` and `return_delivered_order_items` can only be done once per delivered order.\n", + "\n", + "Always strive to resolve the customer's issue with the tools at hand before considering a transfer. Prioritize understanding the customer's exact need and adapting your approach accordingly.\n", + "Loading user with strategy: llm\n", + "Running tasks [7, 9, 9, 7] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104154646.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.75\n", + "📈 Pass^k\n", + " k=1: 1.5\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104154646.json\n", + "\n", + "Iteration 3: New subsample score 3.0 is better than old score 2.0. Continue to full eval and add to candidate pool.\n", + "Loading user with strategy: llm\n", + "Running tasks [3, 5, 2, 4, 1, 8, 7, 0, 6, 9] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104154739.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.6\n", + "📈 Pass^k\n", + " k=1: 0.6\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104154739.json\n", + "\n", + "Iteration 3: Full valset score for new program: 0.6\n", + "Iteration 3: Full train_val score for new program: 0.6\n", + "Iteration 3: Individual valset scores for new program: [1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0]\n", + "Iteration 3: New valset pareto front scores: [1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0]\n", + "Iteration 3: Full valset pareto front score: 0.9\n", + "Iteration 3: Updated valset pareto front programs: [{0, 1, 2}, {0, 1, 2}, {1}, {0, 2}, {0, 1, 2}, {0, 1}, {0, 1}, {0, 1, 2}, {0, 1, 2}, {1, 2}]\n", + "Iteration 3: Best valset aggregate score so far: 0.8\n", + "Iteration 3: Best program as per aggregate score on train_val: 1\n", + "Iteration 3: Best program as per aggregate score on valset: 1\n", + "Iteration 3: Best score on valset: 0.8\n", + "Iteration 3: Best score on train_val: 0.8\n", + "Iteration 3: Linear pareto front program index: 1\n", + "Iteration 3: New program candidate index: 2\n", + "Iteration 4: Selected program 1 score: 0.8\n", + "Loading user with strategy: llm\n", + "Running tasks [3, 6, 8, 4] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104154902.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 1.0\n", + "📈 Pass^k\n", + " k=1: 1.0\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104154902.json\n", + "\n", + "Iteration 4: All subsample scores perfect. Skipping.\n", + "Iteration 4: Reflective mutation did not propose a new candidate\n", + "Iteration 5: Selected program 1 score: 0.8\n", + "Loading user with strategy: llm\n", + "Running tasks [0, 7, 9, 1] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104154939.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.75\n", + "📈 Pass^k\n", + " k=1: 0.75\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104154939.json\n", + "\n", + "Iteration 5: Proposed new text for system_instruction: you are a customer support agent helping customers resolve their issues by using the right tools.\n", + "\n", + "Here's how you should operate:\n", + "\n", + "1. **Understand the User's Core Issue:** Carefully identify what the user is trying to achieve (e.g., cancel an order, return an item, change an address, troubleshoot a technical problem).\n", + "\n", + "2. **Information Gathering - Order & User Details:**\n", + " * Always try to obtain the `order_id` first, as many tools require it and it's the most direct way to identify an order. Remember order IDs start with `#W`.\n", + " * If the user doesn't know the `order_id`, ask for their email address to use `find_user_id_by_email`.\n", + " * If the user cannot provide an email or if `find_user_id_by_email` fails to find a user, then ask for their first name, last name, and zip code to use `find_user_id_by_name_zip`.\n", + " * Once a `user_id` is obtained, use `get_user_details` to retrieve all associated `order_id`s, `payment_method`s, and addresses.\n", + " * For each relevant `order_id` (especially if multiple orders are found or the user's request is vague), use `get_order_details` to get its status and `item_id`s. This is crucial for verifying if an action (like cancellation, return, exchange, or modification) is applicable based on the order's status (e.g., 'pending' vs. 'delivered').\n", + " * Note that `product_id` is different from `item_id`. Ensure you are using the correct identifier for the specific tool parameter.\n", + "\n", + "3. **Tool Selection and Application - General Guidelines:**\n", + " * **Prioritize direct resolution with available tools.**\n", + " * Before executing any modifying action (cancel, modify, exchange, return), **always explicitly ask for user confirmation (yes/no)** after clearly explaining the details and implications (e.g., refund time, items involved, new address, total net charge/refund for exchanges).\n", + " * **CRITICALLY IMPORTANT:** Once explicit \"yes\" confirmation is received for a modifying action, **IMMEDIATELY CALL THE CORRESPONDING TOOL.** Do not wait for further input after a \"yes\" unless the tool description explicitly states to do so. The agent's next response *must* be the tool call.\n", + " * If a user makes multiple requests or adds to a request (e.g., returning a second item or modifying an item after initial confirmation), update the proposed action to include all items and re-confirm the *entire* request with the user before executing the tool.\n", + "\n", + "4. **Tool-Specific Guidelines:**\n", + " * **`cancel_pending_order(order_id, reason)`:**\n", + " * Only for *pending* orders. If an order is \"processed\" or \"delivered\", it cannot be cancelled.\n", + " * The `reason` must be either \"no longer needed\" or \"ordered by mistake\". Infer this from the user's statement.\n", + " * Explain the cancellation and refund details: gift card refunds are immediate, while other payment methods (like PayPal, credit card) take 5-7 business days to process.\n", + " * **`return_delivered_order_items(order_id, item_ids, payment_method_id)`:**\n", + " * Only for *delivered* orders. The order status will change to 'return requested'.\n", + " * Explain return details: the user will receive a follow-up email with return instructions (how and where to send the item back).\n", + " * Determine the `payment_method_id` for the refund (either the original payment method or a gift card, based on user preference). If the user doesn't specify, offer both options.\n", + " * **`exchange_delivered_order_items(order_id, item_ids, new_item_ids, payment_method_id)` / `modify_pending_order_items(order_id, item_ids, new_item_ids, payment_method_id)`:**\n", + " * `exchange_delivered_order_items` is for *delivered* orders; `modify_pending_order_items` is for *pending* orders.\n", + " * For either, this action can only be done once per order.\n", + " * Ensure `new_item_ids` correspond to the same product type as `item_ids` and are in the same position.\n", + " * Determine the `payment_method_id` for any price differences. If there's a net charge, use the user's preferred payment method. If there's a net refund, explain it will be issued to their chosen method.\n", + " * When proposing exchanges, clearly state the original item(s), the new item(s), and the calculated price difference (charge or refund).\n", + " * **`modify_pending_order_address(order_id, ...)` / `modify_pending_order_payment(order_id, ...)`:**\n", + " * These are strictly for *pending* orders.\n", + " * **`modify_user_address(user_id, ...)`:**\n", + " * Modifies the user's default shipping address, not a specific order's address unless explicitly stated by the user that they want to update their default address.\n", + "\n", + "5. **Handling Technical Issues and Faulty Products:**\n", + " * If a user reports a *technical issue* with a delivered product (e.g., \"earbuds not pairing\") and indicates that the product might be \"faulty\" or they have \"tried everything\", **first consider offering a return or exchange using the `return_delivered_order_items` or `exchange_delivered_order_items` tools.** These are direct solutions for defective items.\n", + " * Only if the user explicitly asks for technical troubleshooting *before* a return/exchange, or if the problem is purely informational/troubleshooting-based and cannot be resolved by any modification, return, or exchange tool, should you offer to `transfer_to_human_agents`.\n", + "\n", + "6. **Transfer to Human Agent (`transfer_to_human_agents(summary)`):**\n", + " * Use this tool if the user *explicitly requests* a human agent, or if the user's issue *cannot be resolved with any of the available tools* (e.g., a complex technical troubleshooting issue that genuinely requires expert help beyond a simple return/exchange, or a policy question not covered).\n", + " * Provide a clear, detailed, and concise `summary` of the user's issue and what has been attempted or discovered so far (e.g., user ID, order ID, specific item, problem description, previous troubleshooting steps if known).\n", + "\n", + "7. **Final Communication:** After a successful tool call, inform the user clearly about the outcome, any next steps, and what to expect (e.g., \"refund processed in 5-7 business days\", \"return labels emailed shortly\"). Conclude by asking if there's anything else you can assist with.\n", + "\n", + "8. **Maintain Professionalism:** Be empathetic, clear, and efficient in your communication. Avoid prematurely ending conversations (`###STOP###`) if further action or confirmation is required based on the user's last input or the natural flow of the resolution process.\n", + "Loading user with strategy: llm\n", + "Running tasks [0, 7, 9, 1] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104155047.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.75\n", + "📈 Pass^k\n", + " k=1: 0.75\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104155047.json\n", + "\n", + "Iteration 5: New subsample score 3.0 is not better than old score 3.0, skipping\n", + "Iteration 6: Selected program 0 score: 0.7\n", + "Loading user with strategy: llm\n", + "Running tasks [5, 2, 5, 4] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104155134.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.25\n", + "📈 Pass^k\n", + " k=1: 0.3333333333333333\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104155134.json\n", + "\n", + "Iteration 6: Proposed new text for system_instruction: You are a customer support agent. Your primary goal is to resolve customer issues efficiently and accurately by leveraging the provided tools.\n", + "\n", + "**General Guidelines:**\n", + "\n", + "1. **Prioritize Information Gathering:**\n", + " * Always begin by requesting the **order ID**.\n", + " * If the order ID is unavailable, ask for the **email address** associated with the customer's account.\n", + " * If the email is also unavailable or forgotten, then request their **first name, last name, and zip code**.\n", + " * Once a user ID is found (using `find_user_id_by_email` or `find_user_id_by_name_zip`), use `get_user_details` to retrieve all associated orders for that user.\n", + " * For each potential order, use `get_order_details` to inspect its contents and status to identify the specific order the customer is referring to.\n", + "\n", + "2. **Understand Tool Capabilities and Constraints:**\n", + " * **Always read tool descriptions carefully.** Pay close attention to any specific requirements, limitations, or instructions mentioned (e.g., \"can only be done once,\" \"requires explicit user confirmation,\" \"refund timing\").\n", + " * **Crucial for Delivered Order Returns/Exchanges:** The `return_delivered_order_items` and `exchange_delivered_order_items` functions can only be used *once per delivered order* by you.\n", + " * If a customer wants to return or exchange multiple items from a single delivered order, you **must collect all item IDs at once** and include them in a *single call* to the respective tool.\n", + " * If a return or exchange has already been successfully initiated for a delivered order, and the customer subsequently requests another return or exchange for an item from the *same delivered order*, you must inform them that the system only allows one such request per delivered order. In this scenario, you should offer to transfer them to a human agent.\n", + "\n", + "3. **Explain Actions and Obtain Explicit Confirmation:**\n", + " * Before executing *any* action that modifies an order (e.g., cancel, modify, return, exchange) or user details, clearly explain the proposed action, its full implications (e.g., refund processing times, items involved, where the refund will go), and *ask for explicit user confirmation (yes/no)*.\n", + " * **Payment Method Clarity:** If the customer mentions a payment method that conflicts with what is found in their user or order details (e.g., user says credit card, system shows PayPal), always clarify with the customer which payment method they wish to use for any refunds or charges *before* proceeding.\n", + "\n", + "4. **Handle Unresolvable Issues and Escalation:**\n", + " * If a customer's request cannot be fulfilled by your available tools (e.g., requesting an immediate refund for a credit card, requesting a price match, or a second return/exchange on a delivered order when the tool explicitly states it can only be done once), clearly explain *why* it cannot be done due to system or tool limitations.\n", + " * If you are unable to resolve the issue with your tools, or if the user explicitly asks to speak with a human, **transfer the user to a human agent** using the `transfer_to_human_agents` tool. Ensure you provide a concise and accurate summary of the customer's issue, including what has been discussed and what actions (or attempted actions) have taken place.\n", + "\n", + "5. **Maintain Professional and Empathetic Communication:**\n", + " * Always maintain a helpful, patient, and empathetic tone.\n", + " * Keep the customer informed throughout the process about the steps you are taking.\n", + " * Manage customer expectations regarding processing times (e.g., \"refund would take 5-7 business days to process\").\n", + "Loading user with strategy: llm\n", + "Running tasks [5, 2, 5, 4] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104155249.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.5\n", + "📈 Pass^k\n", + " k=1: 0.6666666666666666\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104155249.json\n", + "\n", + "Iteration 6: New subsample score 2.0 is better than old score 1.0. Continue to full eval and add to candidate pool.\n", + "Loading user with strategy: llm\n", + "Running tasks [3, 5, 2, 4, 1, 8, 7, 0, 6, 9] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104155321.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.8\n", + "📈 Pass^k\n", + " k=1: 0.8\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104155321.json\n", + "\n", + "Iteration 6: Full valset score for new program: 0.8\n", + "Iteration 6: Full train_val score for new program: 0.8\n", + "Iteration 6: Individual valset scores for new program: [1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0]\n", + "Iteration 6: New valset pareto front scores: [1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0]\n", + "Iteration 6: Full valset pareto front score: 0.9\n", + "Iteration 6: Updated valset pareto front programs: [{0, 1, 2, 3}, {0, 1, 2, 3}, {1}, {0, 2, 3}, {0, 1, 2, 3}, {0, 1, 3}, {0, 1, 3}, {0, 1, 2, 3}, {0, 1, 2, 3}, {1, 2, 3}]\n", + "Iteration 6: Best valset aggregate score so far: 0.8\n", + "Iteration 6: Best program as per aggregate score on train_val: 1\n", + "Iteration 6: Best program as per aggregate score on valset: 1\n", + "Iteration 6: Best score on valset: 0.8\n", + "Iteration 6: Best score on train_val: 0.8\n", + "Iteration 6: Linear pareto front program index: 1\n", + "Iteration 6: New program candidate index: 3\n", + "Iteration 7: Selected program 1 score: 0.8\n", + "Loading user with strategy: llm\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running tasks [7, 1, 5, 0] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104155438.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.75\n", + "📈 Pass^k\n", + " k=1: 0.75\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104155438.json\n", + "\n", + "Iteration 7: Proposed new text for system_instruction: you are a customer support agent helping customers resolve their issues by using the right tools.\n", + "\n", + "Here's how you should operate:\n", + "\n", + "1. **Understand the User's Core Issue:** Carefully identify what the user is trying to achieve (e.g., cancel an order, return an item, change an address, troubleshoot a technical problem).\n", + "\n", + "2. **Information Gathering - Order & User Details:**\n", + " * Always try to obtain the `order_id` first, as many tools require it and it's the most direct way to identify an order. Remember order IDs start with `#W`.\n", + " * If the user doesn't know the `order_id`, ask for their email address to use `find_user_id_by_email`.\n", + " * If `find_user_id_by_email` fails to find a user, or if the user cannot provide an email, then ask for their first name, last name, and zip code to use `find_user_id_by_name_zip`.\n", + " * Once a `user_id` is obtained, use `get_user_details` to retrieve all associated `order_id`s, `payment_method`s, and addresses.\n", + " * For each relevant `order_id` (especially if multiple orders are found or the user's request is vague), use `get_order_details` to get its status and `item_id`s. This is crucial for verifying if an action (like cancellation, return, exchange, or modification) is applicable based on the order's status (e.g., 'pending' vs. 'delivered' vs. 'processed' vs. 'return requested' vs. 'exchange requested').\n", + " * Note that `product_id` is different from `item_id`. Ensure you are using the correct identifier for the specific tool parameter.\n", + "\n", + "3. **Tool Selection and Application - General Guidelines:**\n", + " * **Prioritize direct resolution with available tools.**\n", + " * Before executing any modifying action (cancel, modify, exchange, return), **always explicitly ask for user confirmation (yes/no)** after clearly explaining the details and implications (e.g., refund time, items involved, new address, potential charges/refunds).\n", + " * **Crucially, once explicit \"yes\" confirmation is received for a modifying action, immediately call the corresponding tool.** Do not wait for further input after a \"yes\" unless the tool description explicitly states to.\n", + " * If a user makes multiple requests or adds to a request (e.g., returning a second item), update the proposed action to include all items and re-confirm the *entire* request with the user before executing the tool.\n", + "\n", + "4. **Tool-Specific Guidelines:**\n", + " * **`cancel_pending_order(order_id, reason)`:**\n", + " * Only for *pending* orders. If an order is \"processed\" or \"delivered\", it cannot be cancelled.\n", + " * The `reason` must be either \"no longer needed\" or \"ordered by mistake\". Infer this from the user's statement.\n", + " * Explain the cancellation and refund details: gift card refunds are immediate, while other payment methods (like PayPal, credit card) take 5-7 business days to process.\n", + " * **`return_delivered_order_items(order_id, item_ids, payment_method_id)`:**\n", + " * Only for *delivered* orders. The order status will change to 'return requested'.\n", + " * **Crucial Constraint:** This tool can only be used *once per order*. If an `exchange_delivered_order_items` has already been successfully called on the same order, or if this tool has been called already, you cannot call it again.\n", + " * Explain return details: the user will receive a follow-up email with return instructions (how and where to send the item back).\n", + " * Determine the `payment_method_id` for the refund (either the original payment method or a gift card, based on user preference). If the user doesn't specify, offer both options.\n", + " * **`exchange_delivered_order_items(order_id, item_ids, new_item_ids, payment_method_id)` / `modify_pending_order_items(order_id, item_ids, new_item_ids, payment_method_id)`:**\n", + " * `exchange_delivered_order_items` is for *delivered* orders; `modify_pending_order_items` is for *pending* orders.\n", + " * **Crucial Constraint for `exchange_delivered_order_items`:** This tool can only be used *once per order*. If a `return_delivered_order_items` has already been successfully called on the same order, or if this tool has been called already, you cannot call it again.\n", + " * For either, ensure `new_item_ids` correspond to the same product type as `item_ids` and are in the same position.\n", + " * Determine the `payment_method_id` for any price differences (refund or charge). Clearly state the price difference and the resulting refund/charge to the user.\n", + " * **`modify_pending_order_address(order_id, ...)` / `modify_pending_order_payment(order_id, ...)`:**\n", + " * These are strictly for *pending* orders.\n", + " * **`modify_user_address(user_id, ...)`:**\n", + " * Modifies the user's default shipping address, not a specific order's address unless explicitly stated by the user that they want to update their default address.\n", + "\n", + "5. **Handling Technical Issues and Faulty Products:**\n", + " * If a user reports a *technical issue* with a delivered product (e.g., \"earbuds not pairing\") and indicates that the product might be \"faulty\" or they have \"tried everything\", **first consider offering a return or exchange using the `return_delivered_order_items` or `exchange_delivered_order_items` tools.** These are direct solutions for defective items.\n", + " * Only if the user explicitly asks for technical troubleshooting *before* a return/exchange, or if the problem is purely informational/troubleshooting-based and cannot be resolved by any modification, return, or exchange tool, should you offer to `transfer_to_human_agents`.\n", + "\n", + "6. **Transfer to Human Agent (`transfer_to_human_agents(summary)`):**\n", + " * Use this tool if the user *explicitly requests* a human agent.\n", + " * Use this tool if the user's issue *cannot be resolved with any of the available tools* due to their limitations (e.g., attempting a second exchange/return on a delivered order, a complex technical troubleshooting issue that genuinely requires expert help beyond a simple return/exchange, or a policy question not covered by tools).\n", + " * Provide a clear, detailed, and concise `summary` of the user's issue and what has been attempted or discovered so far (e.g., user ID, order ID, specific item, problem description, previous troubleshooting steps if known, and the specific tool limitation encountered).\n", + "\n", + "7. **Final Communication:** After a successful tool call, inform the user clearly about the outcome, any next steps, and what to expect (e.g., \"refund processed in 5-7 business days\", \"return labels emailed shortly\"). Conclude by asking if there's anything else you can assist with.\n", + "\n", + "8. **Maintain Professionalism:** Be empathetic, clear, and efficient in your communication. Avoid prematurely ending conversations (`###STOP###`) if further action or confirmation is required based on the user's last input or the natural flow of the resolution process.\n", + "Loading user with strategy: llm\n", + "Running tasks [7, 1, 5, 0] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104155551.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.5\n", + "📈 Pass^k\n", + " k=1: 0.5\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104155551.json\n", + "\n", + "Iteration 7: New subsample score 2.0 is not better than old score 3.0, skipping\n", + "Iteration 8: Selected program 3 score: 0.8\n", + "Loading user with strategy: llm\n", + "Running tasks [9, 8, 2, 3] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104155634.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.25\n", + "📈 Pass^k\n", + " k=1: 0.25\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104155634.json\n", + "\n", + "Iteration 8: Proposed new text for system_instruction: You are a customer support agent. Your primary goal is to resolve customer issues efficiently and accurately by leveraging the provided tools.\n", + "\n", + "**General Guidelines for Interaction and Information Gathering:**\n", + "\n", + "1. **Prioritize Information Gathering to Identify the User and Order:**\n", + " * Always begin by requesting the **order ID**.\n", + " * If the order ID is unavailable, ask for the **email address** associated with the customer's account.\n", + " * If the email is also unavailable or forgotten, then request their **first name, last name, and zip code**.\n", + " * Once a user ID is found (using `find_user_id_by_email` or `find_user_id_by_name_zip`), use `get_user_details` to retrieve all associated orders for that user.\n", + " * For each potential order retrieved, use `get_order_details` to inspect its contents and status. Clearly summarize the details of each order to the customer (e.g., items, status) to help them identify the specific order they are referring to.\n", + "\n", + "2. **Understand and Adhere to Tool Capabilities and Constraints:**\n", + " * **Always read tool descriptions carefully.** Pay close attention to any specific requirements, limitations, or instructions mentioned.\n", + " * **Crucial for Delivered Order Returns/Exchanges:** The `return_delivered_order_items` and `exchange_delivered_order_items` functions can only be used *once per delivered order* by you.\n", + " * If a customer wants to return or exchange multiple items from a single delivered order, you **must collect all item IDs at once** and include them in a *single call* to the respective tool.\n", + " * If a return or exchange has already been successfully initiated for a delivered order, and the customer subsequently requests another return or exchange for an item from the *same delivered order*, you must inform them that the system only allows one such request per delivered order. In this scenario, you should offer to transfer them to a human agent.\n", + " * **Crucial for Pending Order Modifications:** The `modify_pending_order_items` function can only be used *once per pending order*.\n", + " * **Product Search Limitations:** Your tools (`get_product_details`, `list_all_product_types`) do not allow you to search for products based on descriptive features (e.g., \"9 bar pressure\", \"capsule\", \"popular items\"). You can only get details for a product if the product ID is explicitly provided, or list broad product types. If a customer asks for product recommendations or to search based on specific, unsearchable features, clearly state this limitation and offer to transfer them to a human agent who may be able to provide such assistance.\n", + "\n", + "3. **Explain Actions, Obtain Explicit Confirmation, and Execute Promptly:**\n", + " * Before executing *any* action that modifies an order (e.g., cancel, modify, return, exchange) or user details, clearly explain the proposed action, its full implications (e.g., refund processing times, items involved, where the refund will go), and *ask for explicit user confirmation (yes/no)*.\n", + " * **Crucially, once explicit user confirmation (e.g., \"Yes, proceed,\" \"Confirm\") is received, immediately execute the corresponding tool call.** Do not wait for further turns before calling the tool if confirmation is given.\n", + " * **Payment Method Clarity:** If the customer mentions a payment method that conflicts with what is found in their user or order details (e.g., user says credit card, system shows PayPal), always clarify with the customer which payment method they wish to use for any refunds or charges *before* proceeding. Be prepared to explain the pros and cons (e.g., processing times) of different payment methods if requested.\n", + "\n", + "4. **Handle Unresolvable Issues and Escalation:**\n", + " * If a customer's request cannot be fulfilled by your available tools (e.g., requesting an immediate refund for a credit card, requesting a price match, or a second return/exchange on a delivered order when the tool explicitly states it can only be done once), clearly explain *why* it cannot be done due to system or tool limitations.\n", + " * If you are unable to resolve the issue with your tools, or if the user explicitly asks to speak with a human, **transfer the user to a human agent** using the `transfer_to_human_agents` tool.\n", + " * Ensure you provide a concise and accurate summary of the customer's issue, including what has been discussed and what actions (or attempted actions) have taken place, so the human agent has full context.\n", + "\n", + "5. **Maintain Professional and Empathetic Communication:**\n", + " * Always maintain a helpful, patient, and empathetic tone.\n", + " * Keep the customer informed throughout the process about the steps you are taking.\n", + " * Manage customer expectations regarding processing times (e.g., \"refund would take 5-7 business days to process\").\n", + "Loading user with strategy: llm\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running tasks [9, 8, 2, 3] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104155758.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.5\n", + "📈 Pass^k\n", + " k=1: 0.5\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104155758.json\n", + "\n", + "Iteration 8: New subsample score 2.0 is better than old score 1.0. Continue to full eval and add to candidate pool.\n", + "Loading user with strategy: llm\n", + "Running tasks [3, 5, 2, 4, 1, 8, 7, 0, 6, 9] (checkpoint path: temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104155842.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.7\n", + "📈 Pass^k\n", + " k=1: 0.7\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/traces/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104155842.json\n", + "\n", + "Iteration 8: Full valset score for new program: 0.7\n", + "Iteration 8: Full train_val score for new program: 0.7\n", + "Iteration 8: Individual valset scores for new program: [1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0]\n", + "Iteration 8: New valset pareto front scores: [1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0]\n", + "Iteration 8: Full valset pareto front score: 0.9\n", + "Iteration 8: Updated valset pareto front programs: [{0, 1, 2, 3, 4}, {0, 1, 2, 3, 4}, {1}, {0, 2, 3, 4}, {0, 1, 2, 3, 4}, {0, 1, 3, 4}, {0, 1, 3, 4}, {0, 1, 2, 3, 4}, {0, 1, 2, 3, 4}, {1, 2, 3}]\n", + "Iteration 8: Best valset aggregate score so far: 0.8\n", + "Iteration 8: Best program as per aggregate score on train_val: 1\n", + "Iteration 8: Best program as per aggregate score on valset: 1\n", + "Iteration 8: Best score on valset: 0.8\n", + "Iteration 8: Best score on train_val: 0.8\n", + "Iteration 8: Linear pareto front program index: 1\n", + "Iteration 8: New program candidate index: 4\n" + ] + } + ], + "source": [ + "#@title Run GEPA (this might take ~10 minutes)\n", + "# This process can take around 10 minutes for the demo settings, as it\n", + "# involves multiple rounds of running the agent and calling the reflection model.\n", + "# A real run with more metric calls will take longer.\n", + "\n", + "# Create a new directory for the GEPA run artifacts.\n", + "gepa_output_dir = os.path.join(\n", + " 'gepa_results', datetime.now().strftime('%Y%m%d%H%M%S%f')\n", + ")\n", + "os.makedirs(gepa_output_dir)\n", + "logging.info('Writing to output_dir=%s', gepa_output_dir)\n", + "\n", + "# The `run_gepa` function kicks off the optimization loop.\n", + "print(f'--- Running GEPA for {MAX_METRIC_CALLS} metric calls ---')\n", + "gepa_results = experiment_lib.run_gepa(\n", + " output_dir=gepa_output_dir,\n", + " config=demo_config,\n", + " seed_instructions=BASE_SYSTEM_INSTRUCTION,\n", + ")\n", + "\n", + "# The `val_aggregate_scores` attribute shows the performance of the best prompt\n", + "# found at each generation of the GEPA algorithm. You should see the score\n", + "# generally increasing over time as GEPA learns better prompts.\n", + "print('\\n--- GEPA Performance Over Generations (Reward) ---')\n", + "print(list(enumerate(gepa_results.val_aggregate_scores)))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "dn_9mZ5Gvskp", + "outputId": "29cca9fb-dccb-41cc-d1f1-294c268af211", + "cellView": "form" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "you are a customer support agent helping customers resolve their issues by using the right tools.\n", + "\n", + "Here's how you should operate:\n", + "\n", + "1. **Understand the User's Core Issue:** Carefully identify what the user is trying to achieve (e.g., cancel an order, return an item, change an address, troubleshoot a technical problem).\n", + "\n", + "2. **Information Gathering - Order & User Details:**\n", + " * Always try to obtain the `order_id` first, as many tools require it and it's the most direct way to identify an order. Remember order IDs start with `#W`.\n", + " * If the user doesn't know the `order_id`, ask for their email address to use `find_user_id_by_email`.\n", + " * If the user cannot provide an email or if `find_user_id_by_email` fails to find a user, then ask for their first name, last name, and zip code to use `find_user_id_by_name_zip`.\n", + " * Once a `user_id` is obtained, use `get_user_details` to retrieve all associated `order_id`s, `payment_method`s, and addresses.\n", + " * For each relevant `order_id` (especially if multiple orders are found or the user's request is vague), use `get_order_details` to get its status and `item_id`s. This is crucial for verifying if an action (like cancellation, return, exchange, or modification) is applicable based on the order's status (e.g., 'pending' vs. 'delivered').\n", + " * Note that `product_id` is different from `item_id`. Ensure you are using the correct identifier for the specific tool parameter.\n", + "\n", + "3. **Tool Selection and Application - General Guidelines:**\n", + " * **Prioritize direct resolution with available tools.**\n", + " * Before executing any modifying action (cancel, modify, exchange, return), **always explicitly ask for user confirmation (yes/no)** after clearly explaining the details and implications (e.g., refund time, items involved, new address).\n", + " * **Crucially, once explicit \"yes\" confirmation is received for a modifying action, immediately call the corresponding tool.** Do not wait for further input after a \"yes\" unless the tool description explicitly states to.\n", + " * If a user makes multiple requests or adds to a request (e.g., returning a second item), update the proposed action to include all items and re-confirm the *entire* request with the user before executing the tool.\n", + "\n", + "4. **Tool-Specific Guidelines:**\n", + " * **`cancel_pending_order(order_id, reason)`:**\n", + " * Only for *pending* orders. If an order is \"processed\" or \"delivered\", it cannot be cancelled.\n", + " * The `reason` must be either \"no longer needed\" or \"ordered by mistake\". Infer this from the user's statement.\n", + " * Explain the cancellation and refund details: gift card refunds are immediate, while other payment methods (like PayPal, credit card) take 5-7 business days to process.\n", + " * **`return_delivered_order_items(order_id, item_ids, payment_method_id)`:**\n", + " * Only for *delivered* orders. The order status will change to 'return requested'.\n", + " * Explain return details: the user will receive a follow-up email with return instructions (how and where to send the item back).\n", + " * Determine the `payment_method_id` for the refund (either the original payment method or a gift card, based on user preference). If the user doesn't specify, offer both options.\n", + " * **`exchange_delivered_order_items(order_id, item_ids, new_item_ids, payment_method_id)` / `modify_pending_order_items(order_id, item_ids, new_item_ids, payment_method_id)`:**\n", + " * `exchange_delivered_order_items` is for *delivered* orders; `modify_pending_order_items` is for *pending* orders.\n", + " * For either, this action can only be done once per order.\n", + " * Ensure `new_item_ids` correspond to the same product type as `item_ids` and are in the same position.\n", + " * Determine the `payment_method_id` for any price differences.\n", + " * **`modify_pending_order_address(order_id, ...)` / `modify_pending_order_payment(order_id, ...)`:**\n", + " * These are strictly for *pending* orders.\n", + " * **`modify_user_address(user_id, ...)`:**\n", + " * Modifies the user's default shipping address, not a specific order's address unless explicitly stated by the user that they want to update their default address.\n", + "\n", + "5. **Handling Technical Issues and Faulty Products:**\n", + " * If a user reports a *technical issue* with a delivered product (e.g., \"earbuds not pairing\") and indicates that the product might be \"faulty\" or they have \"tried everything\", **first consider offering a return or exchange using the `return_delivered_order_items` or `exchange_delivered_order_items` tools.** These are direct solutions for defective items.\n", + " * Only if the user explicitly asks for technical troubleshooting *before* a return/exchange, or if the problem is purely informational/troubleshooting-based and cannot be resolved by any modification, return, or exchange tool, should you offer to `transfer_to_human_agents`.\n", + "\n", + "6. **Transfer to Human Agent (`transfer_to_human_agents(summary)`):**\n", + " * Use this tool if the user *explicitly requests* a human agent, or if the user's issue *cannot be resolved with any of the available tools* (e.g., a complex technical troubleshooting issue that genuinely requires expert help beyond a simple return/exchange, or a policy question not covered).\n", + " * Provide a clear, detailed, and concise `summary` of the user's issue and what has been attempted or discovered so far (e.g., user ID, order ID, specific item, problem description, previous troubleshooting steps if known).\n", + "\n", + "7. **Final Communication:** After a successful tool call, inform the user clearly about the outcome, any next steps, and what to expect (e.g., \"refund processed in 5-7 business days\", \"return labels emailed shortly\"). Conclude by asking if there's anything else you can assist with.\n", + "\n", + "8. **Maintain Professionalism:** Be empathetic, clear, and efficient in your communication. Avoid prematurely ending conversations (`###STOP###`) if further action or confirmation is required based on the user's last input or the natural flow of the resolution process.\n" + ] + } + ], + "source": [ + "#@title Visualize the optimized prompt\n", + "# Now, let's look at the final, optimized prompt that GEPA produced.\n", + "# It should be much more detailed than our initial one-line prompt!\n", + "print('\\n--- Optimized Prompt from GEPA ---')\n", + "print(gepa_results.best_candidate['system_instruction'])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ifB36VOLvskp" + }, + "source": [ + "# Evaluate the optimized Prompt\n", + "\n", + "GEPA has given us a new, improved prompt. But how much better is it?\n", + "\n", + "To find out, we'll run the exact same evaluation we did initially, but this\n", + "time using the `best_candidate` prompt from GEPA. We can then directly compare\n", + "the average reward of the baseline prompt with the optimized one. This final\n", + "evaluation on a held-out test set (`eval_dataset`) is the true measure of our\n", + "success. In this demo we are reusing the same dataset for simplicity, but in a\n", + "real scenario, `eval_dataset` should be unseen during optimization." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "yR1y5zAevskp", + "outputId": "d1485f5a-d7cf-4bfc-e83c-0a03396e958e", + "cellView": "form" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading user with strategy: llm\n", + "Running tasks [5, 2, 8, 3, 1, 9, 4, 7, 6, 0] (checkpoint path: temp_results/20251104153507410436/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104160221.json)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🏆 Average reward: 0.75\n", + "📈 Pass^k\n", + " k=1: 0.75\n", + " k=2: 0.6\n", + " k=3: 0.525\n", + " k=4: 0.5\n", + "\n", + "📄 Results saved to temp_results/20251104153507410436/tool-calling-gemini-2.5-flash-0.0_range_0--1_user-gemini-2.5-flash-llm_1104160221.json\n", + "\n", + "average reward (total=40): 0.75\n" + ] + } + ], + "source": [ + "#@title Run evaluation\n", + "\n", + "# Let's create a new directory for this final evaluation run.\n", + "final_eval_dir = os.path.join(\n", + " 'temp_results', 'final_eval', datetime.now().strftime('%Y%m%d%H%M%S%f')\n", + ")\n", + "os.makedirs(final_eval_dir)\n", + "\n", + "print(f'\\n--- Evaluating OPTIMIZED prompt on {MAX_DATASET_SIZE} tasks ---')\n", + "final_eval_results = experiment_lib.run_eval(\n", + " output_dir=final_eval_dir,\n", + " instructions=gepa_results.best_candidate['system_instruction'],\n", + " config=demo_config,\n", + ")\n", + "\n", + "print('\\nOptimized prompt evaluation results:')\n", + "print(final_eval_results)" + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Conclusion\n", + "\n", + "You should see an improvement in the average reward compared to the\n", + "baseline evaluation. This demonstrates the power of using automated\n", + "prompt optimization techniques like GEPA to improve agent reliability without manual tuning." + ], + "metadata": { + "id": "lwEWN31bzu4L" + } + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "AWCzjpLdzvV-" + }, + "execution_count": null, + "outputs": [] + } + ], + "metadata": { + "colab": { + "last_runtime": { + "build_target": "//learning/language/tunelab/tunekit/colab:colab_notebook", + "kind": "private" + }, + "provenance": [], + "collapsed_sections": [ + "cA70NpvcxanK" + ] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/contributing/samples/gepa/rater_lib.py b/contributing/samples/gepa/rater_lib.py new file mode 100644 index 0000000000..739bba07b4 --- /dev/null +++ b/contributing/samples/gepa/rater_lib.py @@ -0,0 +1,178 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Library for rating agent trajectories.""" + +from __future__ import annotations + +import re +from typing import Any + +from google.genai import types +import jinja2 +from retry import retry + +from google import genai + + +def parse_rubric_validation_response( + rubric_val_response: str, +) -> dict[str, str]: + """Parses rubric validation response text into a dictionary. + + Args: + rubric_val_response: The text response from rubric validation. + + Returns: + A dictionary containing parsed property, evidence, rationale, and verdict. + """ + PROPERTY_PATTERN = ( + r'Property:\s*([\s\S]*?)(?=(?:Evidence:|Rationale:|Verdict:|$))' + ) + EVIDENCE_PATTERN = r'Evidence:\s*([\s\S]*?)(?=(?:Rationale:|Verdict:|$))' + RATIONALE_PATTERN = r'Rationale:\s*([\s\S]*?)(?=(?:Evidence:|Verdict:|$))' + VERDICT_PATTERN = r'Verdict:\s*([\s\S]*?)(?=(?:Evidence:|Rationale:|$))' + + property_list = [] + evidence_list = [] + rationale_list = [] + fulfillment_list = [] + property_blocks = rubric_val_response.split('Property: ')[1:] + for property_block in property_blocks: + property_name = re.search(PROPERTY_PATTERN, 'Property: ' + property_block) + if property_name is None: + continue + property_name = property_name.group(1).strip() + property_list.append(property_name) + + evidence_match = re.search(EVIDENCE_PATTERN, property_block, re.DOTALL) + evidence = evidence_match.group(1).strip() if evidence_match else '' + evidence_list.append(evidence) + + rationale_match = re.search(RATIONALE_PATTERN, property_block, re.DOTALL) + rationale = rationale_match.group(1).strip() if rationale_match else '' + rationale_list.append(rationale) + + verdict = re.search(VERDICT_PATTERN, property_block) + if verdict is None: + verdict_str = 'not_found' + else: + verdict_str = verdict.group(1).strip().lower() + if 'yes' in verdict_str: + verdict_str = 'yes' + elif 'no' in verdict_str: + verdict_str = 'no' + elif 'unkown' in verdict_str: + verdict_str = 'unknown' + else: + verdict_str = 'not_found' + fulfillment_list.append(verdict_str) + return dict( + property=property_list[0], + evidence=evidence_list[0], + rationale=rationale_list[0], + verdict=fulfillment_list[0], + ) + + +def format_user_agent_conversation(conv: list[dict[str, Any]]) -> str: + """Formats a conversation between user and agent into a string. + + Args: + conv: A list of conversation turns. + + Returns: + A formatted string representing the conversation. + """ + # conv is a list in this eval data + # if not, manually convert to list to re-use these logics + # if not isinstance(conv, list): + # conv = [conv] + res = '' + turn_idx = 1 + for turn in conv: + # if 'request' in conv[turn]:\ + role = turn['role'] + for part in turn['parts']: + if role == 'user' and (txt := part.get('text')): + res = res + f'USER TURN {turn_idx}:\n' + txt + '\n' + turn_idx += 1 + elif role == 'model' and (txt := part.get('text')): + res = res + f'The agent response is: {txt}' + '\n' + elif fc := part.get('function_call'): + res = ( + res + + f'The agent called the function {fc["name"]} with the following' + f' function arguments: {fc["args"]}.\n' + ) + elif fc := part.get('function_response'): + res = ( + res + + 'The execution result from the agent of function' + f' {fc["name"]} is: \n{fc["args"]}\n' + ) + return res + + +_COMPLETION_RUBRIC_CRITERIA = """The agent fulfilled the user's primary request. Description: It measures if the agent successfully completed the action the user initiated the contact for (e.g., processed a return, provided a tracking number, answered a policy question). A "yes" requires confirmed completion within the transcript.""" + + +class Rater: + """Rates agent trajectories using an LLM based on rubrics.""" + + def __init__(self, tool_declarations: str): + """Initializes the Rater. + + Args: + tool_declarations: JSON string of tool declarations for the agent. + """ + self._client = genai.Client() + self._tool_declarations = tool_declarations + with open('rubric_validation_template.txt') as f: + self._rubric_validation_template = f.read().strip() + + @retry(tries=3, delay=2, backoff=2) + def __call__(self, messages: list[dict[str, Any]]) -> dict[str, Any]: + """Rates a conversation based on rubric criteria. + + Args: + messages: A list of conversation messages between user and agent. + + Returns: + A dictionary containing rating information including score. + """ + env = jinja2.Environment() + env.globals['user_input'] = ( + messages[0].get('parts', [{}])[0].get('text', '') if messages else '' + ) + env.globals['developer_instructions'] = '' + env.globals['tool_declarations'] = self._tool_declarations + env.globals['model_response'] = format_user_agent_conversation(messages) + env.globals['decomposed_rubric'] = '* ' + _COMPLETION_RUBRIC_CRITERIA + contents = env.from_string(self._rubric_validation_template).render() + resp = self._client.models.generate_content( + model='gemini-2.5-pro', + contents=contents, + config=types.GenerateContentConfig( + candidate_count=1, + thinking_config=types.ThinkingConfig( + include_thoughts=True, thinking_budget=-1 + ), + ), + ) + got = parse_rubric_validation_response(resp.text) + got = dict(got) + got['score'] = float(got['verdict'] == 'yes') + got['rating_criteria'] = got.pop('property') + return got diff --git a/contributing/samples/gepa/rubric_validation_template.txt b/contributing/samples/gepa/rubric_validation_template.txt new file mode 100644 index 0000000000..1a99432ff2 --- /dev/null +++ b/contributing/samples/gepa/rubric_validation_template.txt @@ -0,0 +1,170 @@ +# Mission +Your mission is to act as an impartial quality assurance analyst. You will review a conversation transcript between a retail customer and a service agent. Your primary goal is to determine if the agent successfully fulfilled the user's request. + +You will be presented with the conversation and a single property: whether the user's request was fulfilled. You must use the transcript as the sole source of truth to objectively assess the outcome. + +# Rubric +**"yes"**: The agent successfully fulfilled the user's primary request based on clear evidence in the transcript, OR the user did not have an actionable request. +**"no"**: The agent failed to fulfill the user's primary request, the outcome was ambiguous, or the agent provided a resolution that did not align with what the user asked for. + +# Key Evaluation Principles +Your evaluation must follow a two-part process: first, identify the user's primary request, and second, judge the agent's final response and the conversation's outcome against that request. + +1. **Establish the User's Primary Request**: You must first read the entire conversation to understand what the user was trying to achieve. The primary request is the main reason the user initiated the contact. + * Your ONLY source of truth is the full conversation found in `` and ``. + * Examples of primary requests include: + * Returning an item. + * Checking an order status. + * Asking for product information. + * Filing a complaint about a product or service. + * Updating account information. + * If the user has multiple requests, focus on the main, initial one. If the conversation clearly pivots to a new, more important request, use that as the primary one. + +2. **Judge Fulfillment Based on Evidence**: Once you have identified the primary request, you must determine if the agent's actions and statements led to its fulfillment. A request is only considered fulfilled if there is unambiguous evidence in the transcript. + * **Evidence of Fulfillment ("yes")** can include: + * The agent explicitly stating the request is complete (e.g., "I've now processed your refund," "Your tracking number is XYZ."). + * The user explicitly confirming their issue is resolved (e.g., "Great, that's all I needed," "Thank you, that answers my question."). + * The agent providing a complete and direct answer to a question (e.g., User asks for store hours, agent provides them). + * **Evidence of Non-Fulfillment ("no")** can include: + * The agent is unable to perform the requested action (e.g., "Our system is down, I can't process returns right now."). + * The agent provides information that does not answer the user's question. + * The agent promises a follow-up action but the conversation ends before it is confirmed (e.g., "Someone will call you back within 24 hours."). + * The conversation ends abruptly or the user expresses frustration that their issue is not resolved. + * **Crucial Clarification**: Do not make assumptions. If an agent says "I will process that for you," but there is no subsequent confirmation that it *was* processed, the request is not fulfilled. The action must be confirmed as completed within the conversation. + +For the property, follow these internal steps: +1. Read the entire conversation and identify the user's primary goal or question. +2. Outline your plan to evaluate fulfillment by searching the transcript for a resolution. +3. Collect and list direct quotes from the agent and user that serve as evidence for or against fulfillment. +4. Judge whether the evidence clearly demonstrates that the user's goal was met. +5. Review your analysis to form a final judgment and determine the verdict. +6. Output the final verdict in the required output format. + +# Output Format +Property: [Repeat the property, word for word, without making any changes. Keep everything including punctuation and capitalization as-is.] +Evidence: [Quote the relevant lines from the conversation transcript that support your decision. Reference the speaker (User or Agent).] +Rationale: [Explain your reasoning, detailing how the evidence (or lack thereof) proves that the user's request was or was not fulfilled.] +Verdict: [yes|no] + +REMEMBER: Your answer will be used to improve customer service quality. It is crucial to be objective and base your verdict strictly on the evidence provided in the transcript. + +# Example 1 (Request Fulfilled) +## Input + + + { + "name": "get_order_status", + "description": "Retrieves the status and tracking information for a given order ID.", + "parameters": [ + { + "type": "string", + "name": "order_id", + "description": "The unique identifier for the customer's order." + } + ] + }, + { + "name": "process_return", + "description": "Initiates a return process for a given order ID and generates a shipping label.", + "parameters": [ + { + "type": "string", + "name": "order_id", + "description": "The unique identifier for the order to be returned." + } + ] + } + + + + Hi, I need to check the status of my order, #98765. + + + + +Agent: Of course, I can help with that. One moment while I look it up. +Agent: Okay, I see order #98765. It looks like it was shipped this morning. The tracking number is 1Z987ABC. +User: Great, that's all I needed. Thank you! + + + +* The agent fulfilled the user's primary request. + + +## Output +Property: The agent fulfilled the user's primary request. +Evidence: User: "Hi, I need to check the status of my order, #98765." Agent: "The tracking number is 1Z987ABC." User: "Great, that's all I needed. Thank you!" +Rationale: The user's primary request was to check their order status. The agent provided the status and the tracking number, directly fulfilling the request. The user confirmed that their need was met. +Verdict: yes + +# Example 2 (Request Not Fulfilled) +## Input + + + { + "name": "get_order_status", + "description": "Retrieves the status and tracking information for a given order ID.", + "parameters": [ + { + "type": "string", + "name": "order_id", + "description": "The unique identifier for the customer's order." + } + ] + }, + { + "name": "process_return", + "description": "Initiates a return process for a given order ID and generates a shipping label.", + "parameters": [ + { + "type": "string", + "name": "order_id", + "description": "The unique identifier for the order to be returned." + } + ] + } + + + + I'd like to return the shoes I bought last week. The order number is #54321. + + + + +Agent: I can help you with that. Can you confirm your shipping address? +User: Yes, it's 123 Main St, Anytown. +Agent: Thank you. Unfortunately, our return system is experiencing technical difficulties right now. I can't generate a return label. I can try again in a few hours. +User: Oh. Okay, I guess just let me know. + + + +* The agent fulfilled the user's primary request. + + +## Output +Property: The agent fulfilled the user's primary request. +Evidence: User: "I'd like to return the shoes I bought last week." Agent: "Unfortunately, our return system is experiencing technical difficulties right now. I can't generate a return label." +Rationale: The user's primary request was to initiate a return for their shoes. The agent was unable to complete this action due to a system issue. The conversation ended without the user's request being fulfilled. +Verdict: no + +# Your Turn +## Input + + + {{tool_declarations}} + + + + {{user_input}} + + + + +{{model_response}} + + + +{{decomposed_rubric}} + + +## Output \ No newline at end of file diff --git a/contributing/samples/gepa/run_experiment.py b/contributing/samples/gepa/run_experiment.py new file mode 100644 index 0000000000..0e0637d3ec --- /dev/null +++ b/contributing/samples/gepa/run_experiment.py @@ -0,0 +1,116 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Runs a GEPA experiment on Tau-Bench.""" + +from collections.abc import Sequence +import dataclasses +from datetime import datetime +import json +import logging +import os + +from absl import app +from absl import flags +import experiment +from google.genai import types + +_OUTPUT_DIR = flags.DEFINE_string('output_dir', None, '') +_EVAL_SET_SIZE = flags.DEFINE_integer('eval_set_size', None, '') +_MAX_METRIC_CALLS = flags.DEFINE_integer('max_metric_calls', 500, '') +_NUM_TEST_RECORDS = flags.DEFINE_integer('num_test_records', None, '') +_NUM_EVAL_TRIALS = flags.DEFINE_integer('num_eval_trials', 4, '') +_MAX_CONCURRENCY = flags.DEFINE_integer('max_concurrency', 8, '') +_EVAL_MODE = flags.DEFINE_bool('eval_mode', False, '') +_USE_RATER = flags.DEFINE_bool('use_rater', False, '') +_TRAIN_BATCH_SIZE = flags.DEFINE_integer('train_batch_size', 3, '') + + +def main(argv: Sequence[str]) -> None: + if len(argv) > 1: + raise app.UsageError('Too many command-line arguments.') + + # Get a list of all existing loggers + # logging.root.manager.loggerDict contains all named loggers + # logging.getLogger(name) retrieves the logger object + loggers = [ + logging.getLogger(name) for name in logging.root.manager.loggerDict + ] + + # Iterate through the loggers and set their level to WARNING + for logger in loggers: + logger.setLevel(logging.WARNING) + + types.logger.addFilter(experiment.FilterInferenceWarnings()) + if not _OUTPUT_DIR.value: + raise ValueError('outptut dir must be specified') + output_dir = os.path.join( + _OUTPUT_DIR.value, datetime.now().strftime('%Y%m%d%H%M%S%f') + ) + os.makedirs(output_dir) + logging.info('Writing to output_dir=%s', output_dir) + config = experiment.ExperimentConfig( + tau_bench_env='retail', + agent_model='gemini-2.5-flash', + agent_model_provider='vertex_ai', + user_model='gemini-2.5-flash', + user_model_provider='vertex_ai', + max_concurrency=_MAX_CONCURRENCY.value, + num_eval_trials=_NUM_EVAL_TRIALS.value, + rnd_seed=42, + max_metric_calls=_MAX_METRIC_CALLS.value, + reflection_model='gemini-2.5-pro', + reflection_minibatch_size=_TRAIN_BATCH_SIZE.value, + use_rater=_USE_RATER.value, + feedback_dataset=experiment.Dataset(split='train'), + pareto_dataset=experiment.Dataset( + split='dev', max_size=_EVAL_SET_SIZE.value + ), + eval_dataset=experiment.Dataset( + split='test', max_size=_NUM_TEST_RECORDS.value + ), + ) + json.dump( + dataclasses.asdict(config), + open(os.path.join(output_dir, 'config.json'), 'w'), + ) + logging.info('Using config=%s', config) + + if _EVAL_MODE.value: + return experiment.run_eval( + output_dir=output_dir, + instructions=experiment.SEED_SYSTEM_INSTRUCTION, + config=config, + ) + + results = experiment.run_gepa( + config=config, + seed_instructions=experiment.SEED_SYSTEM_INSTRUCTION, + output_dir=output_dir, + ) + print(list(enumerate(results.val_aggregate_scores))) + + eval_dir = os.path.join( + output_dir, 'evals', datetime.now().strftime('%Y%m%d%H%M%S%f') + ) + os.makedirs(eval_dir) + experiment.run_eval( + output_dir=eval_dir, + instructions=results.best_candidate['system_instruction'], + config=config, + ) + + +if __name__ == '__main__': + app.run(main) diff --git a/contributing/samples/gepa/tau_bench_agent.py b/contributing/samples/gepa/tau_bench_agent.py new file mode 100644 index 0000000000..beb78b9643 --- /dev/null +++ b/contributing/samples/gepa/tau_bench_agent.py @@ -0,0 +1,169 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Allows to run an ADK agent implementation with a Tau-bench environment. + +Note that Tau-bench needs to be installed to run this module. To install +Tau-bench you can follow the steps below: + +``` +git clone https://github.com/sierra-research/tau-bench.git +cd tau-bench/ +pip install -e . --quiet +``` +""" +from __future__ import annotations + +from typing import Any + +import adk_agent +from google.adk.models import llm_response +from google.adk.plugins import base_plugin +from google.genai import types +from tau_bench import envs +from tau_bench import types as tau_bench_types +from tau_bench.agents import tool_calling_agent + + +class _EnvWrapper: + """Wraps the Tau-bench environment to match ADK environment protocol.""" + + def __init__(self, env: envs.Env): + self._env = env + + def step(self, action: types.Part) -> adk_agent.EnvResponse: + if function_call := action.function_call: + return self._env.step( + tau_bench_types.Action( + name=function_call.name, kwargs=function_call.args + ) + ) + return self._env.step( + tau_bench_types.Action( + name=tau_bench_types.RESPOND_ACTION_NAME, + kwargs=dict(content=action.text), + ) + ) + + def reset(self, task_index: int) -> adk_agent.EnvResponse: + return self._env.reset(task_index) + + +def _convert_tool(tool_def: dict[str, Any]) -> types.FunctionDeclaration: + if tool_def['type'] != 'function': + raise ValueError(f'Unsupported tool {tool_def}') + return types.FunctionDeclaration(**tool_def['function']) + + +_LLM_CALL_ERROR = 'llm_call_error' + + +class _TauBenchPlugin(base_plugin.BasePlugin): + """Catches LLM errors and emits event with error code for downstream usage.""" + + async def on_model_error_callback( + self, + *, + callback_context: base_plugin.CallbackContext, + llm_request: base_plugin.LlmRequest, + error: Exception, + ) -> llm_response.LlmResponse: + del callback_context, llm_request # Unused. + return llm_response.LlmResponse( + error_code=_LLM_CALL_ERROR, + error_message=str(error), + ) + + +class _ADKAgent(tool_calling_agent.ToolCallingAgent): + """ADK agent implementation for Tau Bench.""" + + def solve( + self, + env: envs.Env, + task_index: int | None = None, + max_num_steps: int = 30, + ) -> tau_bench_types.SolveResult: + """Solves the task using ADK agent. + + Args: + env: The environment to solve the task in. + task_index: The index of the task to solve. + max_num_steps: The maximum number of steps to run the agent. + + Returns: + The result of the solve. + + Raises: + - ValueError: If the LLM inference failed. + """ + # Thought-signature is excluded from the message serialization for the + # following reasons: + # - it is not serializable out of the box + # - it is not relevant for trajectory validation as agent inputs / outputs + # are. + content_exclusion = {'parts': {'__all__': 'thought_signature'}} + messages = [ + types.Content( + role='system', parts=[types.Part(text=self.wiki)] + ).model_dump(exclude=content_exclusion), + ] + reward = 0.0 + for event in adk_agent.run_environment_loop( + instruction=self.wiki, + env=_EnvWrapper(env), + temperature=self.temperature, + tools=[_convert_tool(t) for t in env.tools_info], + task_index=task_index, + max_num_steps=max_num_steps, + plugins=[_TauBenchPlugin(name='error_plugin')], + ): + if event.error_code == _LLM_CALL_ERROR: + raise ValueError(f'Error {event.error_code=}: {event.error_message=}') + + if not event.content: + continue + messages.append(event.content.model_dump(exclude=content_exclusion)) + reward = event.actions.state_delta.get('reward', reward) + return tau_bench_types.SolveResult( + reward=reward, + info={}, + messages=messages, + ) + + +# Equivalent of default `agent_factory` from Tau-bench in +# https://github.com/sierra-research/tau-bench/blob/4754e6b406507dbcbce8e8b3855dcf80aaec18ac/tau_bench/run.py#L124 +def adk_agent_factory( + tools_info: list[dict[str, Any]], + wiki: str, + config: tau_bench_types.RunConfig, +) -> tool_calling_agent.ToolCallingAgent: + """Factory for creating a Tau-bench agent implemented with the ADK. + + Args: + tools_info: A list of tool definitions. + wiki: The instructions for the agent. + config: The run configuration. + + Returns: + An ADK agent. + """ + return _ADKAgent( + tools_info=tools_info, + wiki=wiki, + model=config.model, + provider=config.model_provider, + temperature=config.temperature, + ) diff --git a/contributing/samples/google_api/agent.py b/contributing/samples/google_api/agent.py index bb06e36f27..390f1bca10 100644 --- a/contributing/samples/google_api/agent.py +++ b/contributing/samples/google_api/agent.py @@ -46,7 +46,7 @@ Use the provided tools to conduct various operations on users' data in Google BigQuery. Scenario 1: - The user wants to query their biguqery datasets + The user wants to query their bigquery datasets Use bigquery_datasets_list to query user's datasets Scenario 2: diff --git a/contributing/samples/hello_world_apigeellm/.env-sample b/contributing/samples/hello_world_apigeellm/.env-sample new file mode 100644 index 0000000000..eeef7fad5a --- /dev/null +++ b/contributing/samples/hello_world_apigeellm/.env-sample @@ -0,0 +1,8 @@ +# This is a sample .env file. +# Copy this file to .env and replace the placeholder values with your actual credentials. + +# Your Google API key for accessing Gemini models. +GOOGLE_API_KEY="your-google-api-key" + +# The URL of your Apigee proxy. +APIGEE_PROXY_URL="https://your-apigee-proxy.net/basepath" diff --git a/contributing/samples/hello_world_apigeellm/README.md b/contributing/samples/hello_world_apigeellm/README.md new file mode 100644 index 0000000000..41cfa50aaf --- /dev/null +++ b/contributing/samples/hello_world_apigeellm/README.md @@ -0,0 +1,84 @@ +# Hello World with Apigee LLM + +This sample demonstrates how to use the Agent Development Kit (ADK) with an LLM fronted by an Apigee proxy. It showcases the flexibility of the `ApigeeLlm` class in configuring the target LLM provider (Gemini or Vertex AI) and API version through the model string. + +## Setup + +Before running the sample, you need to configure your environment with the necessary credentials. + +1. **Create a `.env` file:** + Copy the sample environment file to a new file named `.env` in the same directory. + ```bash + cp .env-sample .env + ``` + +2. **Set Environment Variables:** + Open the `.env` file and provide values for the following variables: + + - `GOOGLE_API_KEY`: Your API key for the Google AI services (Gemini). + - `APIGEE_PROXY_URL`: The full URL of your Apigee proxy endpoint. + + Example `.env` file: + ``` + GOOGLE_API_KEY="your-google-api-key" + APIGEE_PROXY_URL="https://your-apigee-proxy.net/basepath" + ``` + + The `main.py` script will automatically load these variables when it runs. + +## Run the Sample + +Once your `.env` file is configured, you can run the sample with the following command: + +```bash +python main.py +``` + +## Configuring the Apigee LLM + +The `ApigeeLlm` class is configured using a special model string format in `agent.py`. This string determines which backend provider (Vertex AI or Gemini) and which API version to use. + +### Model String Format + +The supported format is: + +`apigee/[/][/]` + +- **`provider`** (optional): Can be `vertex_ai` or `gemini`. + - If specified, it forces the use of that provider. + - If omitted, the provider is determined by the `GOOGLE_GENAI_USE_VERTEXAI` environment variable. If this variable is set to `true` or `1`, Vertex AI is used; otherwise, `gemini` is used by default. + +- **`version`** (optional): The API version to use (e.g., `v1`, `v1beta`). + - If omitted, the default version for the selected provider is used. + +- **`model_id`** (required): The identifier for the model you want to use (e.g., `gemini-2.5-flash`). + +### Configuration Examples + +Here are some examples of how to configure the model string in `agent.py` to achieve different behaviors: + +1. **Implicit Provider (determined by environment variable):** + + - `model="apigee/gemini-2.5-flash"` + - Uses the default API version. + - Provider is Vertex AI if `GOOGLE_GENAI_USE_VERTEXAI` is true, otherwise Gemini. + + - `model="apigee/v1/gemini-2.5-flash"` + - Uses API version `v1`. + - Provider is determined by the environment variable. + +2. **Explicit Provider (ignores environment variable):** + + - `model="apigee/vertex_ai/gemini-2.5-flash"` + - Uses Vertex AI with the default API version. + + - `model="apigee/gemini/gemini-2.5-flash"` + - Uses Gemini with the default API version. + + - `model="apigee/gemini/v1/gemini-2.5-flash"` + - Uses Gemini with API version `v1`. + + - `model="apigee/vertex_ai/v1beta/gemini-2.5-flash"` + - Uses Vertex AI with API version `v1beta`. + +By modifying the `model` string in `agent.py`, you can test various configurations without changing the core logic of the agent. diff --git a/contributing/samples/hello_world_apigeellm/agent.py b/contributing/samples/hello_world_apigeellm/agent.py new file mode 100644 index 0000000000..21bf0936b9 --- /dev/null +++ b/contributing/samples/hello_world_apigeellm/agent.py @@ -0,0 +1,108 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import random + +from google.adk import Agent +from google.adk.tools.tool_context import ToolContext +from google.genai import types + + +def roll_die(sides: int, tool_context: ToolContext) -> int: + """Roll a die and return the rolled result. + + Args: + sides: The integer number of sides the die has. + + Returns: + An integer of the result of rolling the die. + """ + result = random.randint(1, sides) + if "rolls" not in tool_context.state: + tool_context.state["rolls"] = [] + + tool_context.state["rolls"] = tool_context.state["rolls"] + [result] + return result + + +async def check_prime(nums: list[int]) -> str: + """Check if a given list of numbers are prime. + + Args: + nums: The list of numbers to check. + + Returns: + A str indicating which number is prime. + """ + primes = set() + for number in nums: + number = int(number) + if number <= 1: + continue + is_prime = True + for i in range(2, int(number**0.5) + 1): + if number % i == 0: + is_prime = False + break + if is_prime: + primes.add(number) + return ( + "No prime numbers found." + if not primes + else f"{', '.join(str(num) for num in primes)} are prime numbers." + ) + + +root_agent = Agent( + model="apigee/gemini-2.5-flash", + name="hello_world_agent", + description=( + "hello world agent that can roll a dice of 8 sides and check prime" + " numbers." + ), + instruction=""" + You roll dice and answer questions about the outcome of the dice rolls. + You can roll dice of different sizes. + You can use multiple tools in parallel by calling functions in parallel(in one request and in one round). + It is ok to discuss previous dice roles, and comment on the dice rolls. + When you are asked to roll a die, you must call the roll_die tool with the number of sides. Be sure to pass in an integer. Do not pass in a string. + You should never roll a die on your own. + When checking prime numbers, call the check_prime tool with a list of integers. Be sure to pass in a list of integers. You should never pass in a string. + You should not check prime numbers before calling the tool. + When you are asked to roll a die and check prime numbers, you should always make the following two function calls: + 1. You should first call the roll_die tool to get a roll. Wait for the function response before calling the check_prime tool. + 2. After you get the function response from roll_die tool, you should call the check_prime tool with the roll_die result. + 2.1 If user asks you to check primes based on previous rolls, make sure you include the previous rolls in the list. + 3. When you respond, you must include the roll_die result from step 1. + You should always perform the previous 3 steps when asking for a roll and checking prime numbers. + You should not rely on the previous history on prime results. + """, + tools=[ + roll_die, + check_prime, + ], + # planner=BuiltInPlanner( + # thinking_config=types.ThinkingConfig( + # include_thoughts=True, + # ), + # ), + generate_content_config=types.GenerateContentConfig( + safety_settings=[ + types.SafetySetting( # avoid false alarm about rolling dice. + category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, + threshold=types.HarmBlockThreshold.OFF, + ), + ] + ), +) diff --git a/contributing/samples/hello_world_apigeellm/main.py b/contributing/samples/hello_world_apigeellm/main.py new file mode 100644 index 0000000000..1e81097ddc --- /dev/null +++ b/contributing/samples/hello_world_apigeellm/main.py @@ -0,0 +1,112 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import os +import time + +import agent +from dotenv import load_dotenv +from google.adk.agents.run_config import RunConfig +from google.adk.cli.utils import logs +from google.adk.runners import InMemoryRunner +from google.adk.sessions.session import Session +from google.genai import types + +load_dotenv(override=True) +logs.log_to_tmp_folder() + + +async def main(): + app_name = "my_app" + user_id_1 = "user1" + runner = InMemoryRunner( + agent=agent.root_agent, + app_name=app_name, + ) + session_11 = await runner.session_service.create_session( + app_name=app_name, user_id=user_id_1 + ) + + async def run_prompt(session: Session, new_message: str): + content = types.Content( + role="user", parts=[types.Part.from_text(text=new_message)] + ) + print("** User says:", content.model_dump(exclude_none=True)) + async for event in runner.run_async( + user_id=user_id_1, + session_id=session.id, + new_message=content, + ): + if event.content.parts and event.content.parts[0].text: + print(f"** {event.author}: {event.content.parts[0].text}") + + async def run_prompt_bytes(session: Session, new_message: str): + content = types.Content( + role="user", + parts=[ + types.Part.from_bytes( + data=str.encode(new_message), mime_type="text/plain" + ) + ], + ) + print("** User says:", content.model_dump(exclude_none=True)) + async for event in runner.run_async( + user_id=user_id_1, + session_id=session.id, + new_message=content, + run_config=RunConfig(save_input_blobs_as_artifacts=True), + ): + if event.content.parts and event.content.parts[0].text: + print(f"** {event.author}: {event.content.parts[0].text}") + + async def check_rolls_in_state(rolls_size: int): + session = await runner.session_service.get_session( + app_name=app_name, user_id=user_id_1, session_id=session_11.id + ) + assert len(session.state["rolls"]) == rolls_size + for roll in session.state["rolls"]: + assert roll > 0 and roll <= 100 + + start_time = time.time() + print("Start time:", start_time) + print("------------------------------------") + await run_prompt(session_11, "Hi") + await run_prompt(session_11, "Roll a die with 100 sides") + await check_rolls_in_state(1) + await run_prompt(session_11, "Roll a die again with 100 sides.") + await check_rolls_in_state(2) + await run_prompt(session_11, "What numbers did I got?") + await run_prompt_bytes(session_11, "Hi bytes") + print( + await runner.artifact_service.list_artifact_keys( + app_name=app_name, user_id=user_id_1, session_id=session_11.id + ) + ) + end_time = time.time() + print("------------------------------------") + print("End time:", end_time) + print("Total time:", end_time - start_time) + + +if __name__ == "__main__": + # The API key can be set in a .env file. + # For example, create a .env file with the following content: + # GOOGLE_API_KEY="your-api-key" + # APIGEE_PROXY_URL="your-proxy-url" + if not os.getenv("GOOGLE_API_KEY"): + raise ValueError("GOOGLE_API_KEY environment variable is not set.") + if not os.getenv("APIGEE_PROXY_URL"): + raise ValueError("APIGEE_PROXY_URL environment variable is not set.") + asyncio.run(main()) diff --git a/contributing/samples/hello_world_app/agent.py b/contributing/samples/hello_world_app/agent.py index 95d0e2add8..04ba197946 100755 --- a/contributing/samples/hello_world_app/agent.py +++ b/contributing/samples/hello_world_app/agent.py @@ -18,8 +18,13 @@ from google.adk.agents.base_agent import BaseAgent from google.adk.agents.callback_context import CallbackContext from google.adk.apps import App +from google.adk.apps.app import EventsCompactionConfig +from google.adk.apps.llm_event_summarizer import LlmEventSummarizer from google.adk.models.llm_request import LlmRequest from google.adk.plugins.base_plugin import BasePlugin +from google.adk.plugins.context_filter_plugin import ContextFilterPlugin +from google.adk.plugins.save_files_as_artifacts_plugin import SaveFilesAsArtifactsPlugin +from google.adk.tools import load_artifacts from google.adk.tools.tool_context import ToolContext from google.genai import types @@ -96,6 +101,7 @@ async def check_prime(nums: list[int]) -> str: tools=[ roll_die, check_prime, + load_artifacts, ], # planner=BuiltInPlanner( # thinking_config=types.ThinkingConfig( @@ -141,5 +147,14 @@ async def before_model_callback( app = App( name='hello_world_app', root_agent=root_agent, - plugins=[CountInvocationPlugin()], + plugins=[ + CountInvocationPlugin(), + # ContextFilterPlugin(num_invocations_to_keep=3), + SaveFilesAsArtifactsPlugin(), + ], + # Enable event compaction with an LLM-based summarizer. + events_compaction_config=EventsCompactionConfig( + compaction_interval=2, + overlap_size=1, + ), ) diff --git a/contributing/samples/hello_world_app/main.py b/contributing/samples/hello_world_app/main.py index b9e3035528..f9a2ac78d0 100755 --- a/contributing/samples/hello_world_app/main.py +++ b/contributing/samples/hello_world_app/main.py @@ -65,7 +65,7 @@ async def run_prompt_bytes(session: Session, new_message: str): user_id=user_id_1, session_id=session.id, new_message=content, - run_config=RunConfig(save_input_blobs_as_artifacts=True), + run_config=RunConfig(save_input_blobs_as_artifacts=False), ): if event.content.parts and event.content.parts[0].text: print(f'** {event.author}: {event.content.parts[0].text}') diff --git a/contributing/samples/hello_world_gemma/__init__.py b/contributing/samples/hello_world_gemma/__init__.py new file mode 100644 index 0000000000..7d5bb0b1c6 --- /dev/null +++ b/contributing/samples/hello_world_gemma/__init__.py @@ -0,0 +1,16 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from . import agent diff --git a/contributing/samples/hello_world_gemma/agent.py b/contributing/samples/hello_world_gemma/agent.py new file mode 100644 index 0000000000..3407d721d3 --- /dev/null +++ b/contributing/samples/hello_world_gemma/agent.py @@ -0,0 +1,95 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import random + +from google.adk.agents.llm_agent import Agent +from google.adk.models.gemma_llm import Gemma +from google.genai.types import GenerateContentConfig + + +def roll_die(sides: int) -> int: + """Roll a die and return the rolled result. + + Args: + sides: The integer number of sides the die has. + + Returns: + An integer of the result of rolling the die. + """ + return random.randint(1, sides) + + +async def check_prime(nums: list[int]) -> str: + """Check if a given list of numbers are prime. + + Args: + nums: The list of numbers to check. + + Returns: + A str indicating which number is prime. + """ + primes = set() + for number in nums: + number = number + if number <= 1: + continue + is_prime = True + for i in range(2, int(number**0.5) + 1): + if number % i == 0: + is_prime = False + break + if is_prime: + primes.add(number) + return ( + "No prime numbers found." + if not primes + else f"{', '.join(str(num) for num in primes)} are prime numbers." + ) + + +root_agent = Agent( + model=Gemma(model="gemma-3-27b-it"), + name="data_processing_agent", + description=( + "hello world agent that can roll many-sided dice and check if numbers" + " are prime." + ), + instruction=""" + You roll dice and answer questions about the outcome of the dice rolls. + You can roll dice of different sizes. + You can use multiple tools in parallel by calling functions in parallel(in one request and in one round). + It is ok to discuss previous dice roles, and comment on the dice rolls. + When you are asked to roll a die, you must call the roll_die tool with the number of sides. Be sure to pass in an integer. Do not pass in a string. + You should never roll a die on your own. + When checking prime numbers, call the check_prime tool with a list of integers. Be sure to pass in a list of integers. You should never pass in a string. + You should not check prime numbers before calling the tool. + When you are asked to roll a die and check prime numbers, you should always make the following two function calls: + 1. You should first call the roll_die tool to get a roll. Wait for the function response before calling the check_prime tool. + 2. After the user reports a response from roll_die tool, you should call the check_prime tool with the roll_die result. + 2.1 If user asks you to check primes based on previous rolls, make sure you include the previous rolls in the list. + 3. When you respond, you must include the roll_die result from step 1. + You should always perform the previous 3 steps when asking for a roll and checking prime numbers. + You should not rely on the previous history on prime results. + """, + tools=[ + roll_die, + check_prime, + ], + generate_content_config=GenerateContentConfig( + temperature=1.0, + top_p=0.95, + ), +) diff --git a/contributing/samples/hello_world_gemma/main.py b/contributing/samples/hello_world_gemma/main.py new file mode 100644 index 0000000000..f177064b68 --- /dev/null +++ b/contributing/samples/hello_world_gemma/main.py @@ -0,0 +1,77 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import asyncio +import logging +import time + +import agent +from dotenv import load_dotenv +from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService +from google.adk.cli.utils import logs +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.sessions.session import Session +from google.genai import types + +load_dotenv(override=True) +logs.log_to_tmp_folder(level=logging.INFO) + + +async def main(): + app_name = 'my_gemma_app' + user_id_1 = 'user1' + session_service = InMemorySessionService() + artifact_service = InMemoryArtifactService() + runner = Runner( + app_name=app_name, + agent=agent.root_agent, + artifact_service=artifact_service, + session_service=session_service, + ) + session_11 = await session_service.create_session( + app_name=app_name, user_id=user_id_1 + ) + + async def run_prompt(session: Session, new_message: str): + content = types.Content( + role='user', parts=[types.Part.from_text(text=new_message)] + ) + print('** User says:', content.model_dump(exclude_none=True)) + async for event in runner.run_async( + user_id=user_id_1, + session_id=session.id, + new_message=content, + ): + if event.content.parts and event.content.parts[0].text: + print(f'** {event.author}: {event.content.parts[0].text}') + + start_time = time.time() + print('Start time:', start_time) + print('------------------------------------') + await run_prompt(session_11, 'Hi, introduce yourself.') + await run_prompt( + session_11, 'Roll a die with 100 sides and check if it is prime' + ) + await run_prompt(session_11, 'Roll it again.') + await run_prompt(session_11, 'What numbers did I get?') + end_time = time.time() + print('------------------------------------') + print('End time:', end_time) + print('Total time:', end_time - start_time) + + +if __name__ == '__main__': + asyncio.run(main()) diff --git a/contributing/samples/hello_world_ollama/README.md b/contributing/samples/hello_world_ollama/README.md index 559e42f65e..dc7acf139d 100644 --- a/contributing/samples/hello_world_ollama/README.md +++ b/contributing/samples/hello_world_ollama/README.md @@ -25,7 +25,7 @@ ollama show mistral-small3.1 You are supposed to see `tools` listed under capabilities. -You can also look at the template the model is using and tweak it based on your needs. +You can also look at the model's template and tweak it based on your needs. ```bash ollama show --modelfile llama3.1 > model_file_to_modify diff --git a/contributing/samples/human_tool_confirmation/agent.py b/contributing/samples/human_tool_confirmation/agent.py index 43e67dc99f..e1ef5a518e 100644 --- a/contributing/samples/human_tool_confirmation/agent.py +++ b/contributing/samples/human_tool_confirmation/agent.py @@ -13,6 +13,8 @@ # limitations under the License. from google.adk import Agent +from google.adk.apps import App +from google.adk.apps import ResumabilityConfig from google.adk.tools.function_tool import FunctionTool from google.adk.tools.tool_confirmation import ToolConfirmation from google.adk.tools.tool_context import ToolContext @@ -88,3 +90,12 @@ def request_time_off(days: int, tool_context: ToolContext): ], generate_content_config=types.GenerateContentConfig(temperature=0.1), ) + +app = App( + name='human_tool_confirmation', + root_agent=root_agent, + # Set the resumability config to enable resumability. + resumability_config=ResumabilityConfig( + is_resumable=True, + ), +) diff --git a/contributing/samples/jira_agent/agent.py b/contributing/samples/jira_agent/agent.py index 9f2b866c95..537d8f0845 100644 --- a/contributing/samples/jira_agent/agent.py +++ b/contributing/samples/jira_agent/agent.py @@ -19,7 +19,7 @@ root_agent = Agent( model='gemini-2.0-flash-001', name='jira_connector_agent', - description='This agent helps search issues in JIRA', + description='This agent helps search issues in Jira', instruction=""" To start with, greet the user First, you will be given a description of what you can do. diff --git a/contributing/samples/jira_agent/tools.py b/contributing/samples/jira_agent/tools.py index f03c5ed106..94c37565fa 100644 --- a/contributing/samples/jira_agent/tools.py +++ b/contributing/samples/jira_agent/tools.py @@ -27,7 +27,7 @@ tool_name="jira_conversation_tool", tool_instructions=""" - This tool is to call an integration to search for issues in JIRA + This tool is to call an integration to search for issues in Jira """, ) diff --git a/contributing/samples/json_passing_agent/README.md b/contributing/samples/json_passing_agent/README.md new file mode 100644 index 0000000000..0f19482e24 --- /dev/null +++ b/contributing/samples/json_passing_agent/README.md @@ -0,0 +1,24 @@ +# JSON Passing Agent + +This sample demonstrates how to pass structured JSON data between agents. The example uses a pizza ordering scenario where one agent takes the order and passes it to another agent for confirmation. + +## How to run + +1. Run the agent: +```bash +adk run . +``` + +2. Talk to the agent: +``` +I want to order a pizza +``` + +## Example conversation +``` +[user]: I'd like a large pizza with pepperoni and mushrooms on a thin crust. +[order_intake_agent]: (tool call to get available sizes, crusts, toppings) +[order_intake_agent]: (returns a PizzaOrder JSON) +[order_confirmation_agent]: (tool call to calculate_price) +[order_confirmation_agent]: You ordered a large thin crust pizza with pepperoni and mushrooms. The total price is $15.00. +``` diff --git a/contributing/samples/json_passing_agent/__init__.py b/contributing/samples/json_passing_agent/__init__.py new file mode 100755 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/json_passing_agent/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/json_passing_agent/agent.py b/contributing/samples/json_passing_agent/agent.py new file mode 100755 index 0000000000..532134f42a --- /dev/null +++ b/contributing/samples/json_passing_agent/agent.py @@ -0,0 +1,122 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from google.adk import Agent +from google.adk.agents import sequential_agent +from google.adk.tools import tool_context +from pydantic import BaseModel + +SequentialAgent = sequential_agent.SequentialAgent +ToolContext = tool_context.ToolContext + + +# 1. Define the data structure for the pizza order. +class PizzaOrder(BaseModel): + """A data class to hold the details of a pizza order.""" + + size: str + crust: str + toppings: list[str] + + +# 2. Define tools for the order intake agent. +def get_available_sizes() -> list[str]: + """Returns the available pizza sizes.""" + return ['small', 'medium', 'large'] + + +def get_available_crusts() -> list[str]: + """Returns the available pizza crusts.""" + return ['thin', 'thick', 'stuffed'] + + +def get_available_toppings() -> list[str]: + """Returns the available pizza toppings.""" + return ['pepperoni', 'mushrooms', 'onions', 'sausage', 'bacon', 'pineapple'] + + +# 3. Define the order intake agent. +# This agent's job is to interact with the user to fill out a PizzaOrder object. +# It uses the output_schema to structure its response as a JSON object that +# conforms to the PizzaOrder model. +order_intake_agent = Agent( + name='order_intake_agent', + model='gemini-2.5-flash', + instruction=( + "You are a pizza order intake agent. Your goal is to get the user's" + ' pizza order. Use the available tools to find out what sizes, crusts,' + ' and toppings are available. Once you have all the information,' + ' provide it in the requested format. Your output MUST be a JSON object' + ' that conforms to the PizzaOrder schema and nothing else.' + ), + output_key='pizza_order', + output_schema=PizzaOrder, + tools=[get_available_sizes, get_available_crusts, get_available_toppings], +) + + +# 4. Define a tool for the order confirmation agent. +def calculate_price(tool_context: ToolContext) -> str: + """Calculates the price of a pizza order and returns a descriptive string.""" + order_dict = tool_context.state.get('pizza_order') + if not order_dict: + return "I can't find an order to calculate the price for." + + order = PizzaOrder.model_validate(order_dict) + + price = 0.0 + if order.size == 'small': + price += 8.0 + elif order.size == 'medium': + price += 10.0 + elif order.size == 'large': + price += 12.0 + + if order.crust == 'stuffed': + price += 2.0 + + price += len(order.toppings) * 1.5 + return f'The total price for your order is ${price:.2f}.' + + +# 5. Define the order confirmation agent. +# This agent reads the PizzaOrder object from the session state (placed there by +# the order_intake_agent) and confirms the order with the user. +order_confirmation_agent = Agent( + name='order_confirmation_agent', + model='gemini-2.5-flash', + instruction=( + 'Confirm the pizza order with the user. The order is in the state' + ' variable `pizza_order`. First, use the `calculate_price` tool to get' + ' the price. Then, summarize the order details from {pizza_order} and' + ' include the price in your summary. For example: "You ordered a large' + ' thin crust pizza with pepperoni and mushrooms. The total price is' + ' $15.00."' + ), + tools=[calculate_price], +) + +# 6. Define the root agent as a sequential agent. +# This agent directs the conversation by running its sub-agents in order. +root_agent = SequentialAgent( + name='pizza_ordering_agent', + sub_agents=[ + order_intake_agent, + order_confirmation_agent, + ], + description=( + 'This agent is used to order pizza. It will ask the user for their' + ' pizza order and then confirm the order with the user.' + ), +) diff --git a/contributing/samples/json_passing_agent/main.py b/contributing/samples/json_passing_agent/main.py new file mode 100644 index 0000000000..f87d739bd6 --- /dev/null +++ b/contributing/samples/json_passing_agent/main.py @@ -0,0 +1,68 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import time + +import agent +from dotenv import load_dotenv +from google.adk.cli.utils import logs +from google.adk.runners import InMemoryRunner +from google.adk.sessions.session import Session +from google.genai import types + +load_dotenv(override=True) +logs.log_to_tmp_folder() + + +async def main(): + """Runs the pizza ordering agent.""" + app_name = 'pizza_app' + user_id = 'user1' + runner = InMemoryRunner( + agent=agent.root_agent, + app_name=app_name, + ) + session = await runner.session_service.create_session( + app_name=app_name, user_id=user_id + ) + + async def run_prompt(session: Session, new_message: str): + content = types.Content( + role='user', parts=[types.Part.from_text(text=new_message)] + ) + print(f'** User says: {new_message}') + async for event in runner.run_async( + user_id=user_id, + session_id=session.id, + new_message=content, + ): + if event.content and event.content.parts and event.content.parts[0].text: + print(f'** {event.author}: {event.content.parts[0].text}') + + start_time = time.time() + print('Start time:', time.ctime(start_time)) + print('------------------------------------') + await run_prompt( + session, + "I'd like a large pizza with pepperoni and mushrooms on a thin crust.", + ) + print('------------------------------------') + end_time = time.time() + print('End time:', time.ctime(end_time)) + print(f'Total time: {end_time - start_time:.2f} seconds') + + +if __name__ == '__main__': + asyncio.run(main()) diff --git a/contributing/samples/langchain_structured_tool_agent/agent.py b/contributing/samples/langchain_structured_tool_agent/agent.py index 5c4c5b9a21..e83bc40b2f 100644 --- a/contributing/samples/langchain_structured_tool_agent/agent.py +++ b/contributing/samples/langchain_structured_tool_agent/agent.py @@ -17,17 +17,19 @@ """ from google.adk.agents.llm_agent import Agent from google.adk.tools.langchain_tool import LangchainTool -from langchain.tools import tool +from langchain_core.tools import tool from langchain_core.tools.structured import StructuredTool from pydantic import BaseModel async def add(x, y) -> int: + """Adds two numbers.""" return x + y @tool def minus(x, y) -> int: + """Subtracts two numbers.""" return x - y diff --git a/contributing/samples/langchain_youtube_search_agent/README.md b/contributing/samples/langchain_youtube_search_agent/README.md index e87ca59420..7d46f60b8d 100644 --- a/contributing/samples/langchain_youtube_search_agent/README.md +++ b/contributing/samples/langchain_youtube_search_agent/README.md @@ -1,6 +1,6 @@ # Langchain Youtube Search Agent -This agent utilize the Lanchain YoutubeSearchTool to search youtubes. +This agent utilize the Langchain YoutubeSearchTool to search youtubes. You need to install below dependencies: ```python diff --git a/contributing/samples/litellm_with_fallback_models/README.md b/contributing/samples/litellm_with_fallback_models/README.md new file mode 100644 index 0000000000..ebe68a3c75 --- /dev/null +++ b/contributing/samples/litellm_with_fallback_models/README.md @@ -0,0 +1,10 @@ +# LiteLLM with Fallback Models + +This agent is built for resilience using LiteLLM's built-in fallback mechanism. It automatically switches models to guard against common disruptions like token limit errors and connection failures, while ensuring full conversational context is preserved across all model changes. + +To run this example, ensure your .env file includes the following variables: +``` +GOOGLE_API_KEY= +OPENAI_API_KEY= +ANTHROPIC_API_KEY= +``` diff --git a/contributing/samples/litellm_with_fallback_models/__init__.py b/contributing/samples/litellm_with_fallback_models/__init__.py new file mode 100644 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/litellm_with_fallback_models/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/litellm_with_fallback_models/agent.py b/contributing/samples/litellm_with_fallback_models/agent.py new file mode 100644 index 0000000000..2e46a7fb44 --- /dev/null +++ b/contributing/samples/litellm_with_fallback_models/agent.py @@ -0,0 +1,88 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import random + +from google.adk import Agent +from google.adk.models.lite_llm import LiteLlm +from google.adk.tools.tool_context import ToolContext +from google.genai import types + + +def roll_die(sides: int, tool_context: ToolContext) -> int: + """Roll a die and return the rolled result. + + Args: + sides: The integer number of sides the die has. + tool_context: The tool context to use for the die roll. + + Returns: + An integer of the result of rolling the die. + The result is also stored in the tool context for future use. + """ + result = random.randint(1, sides) + if 'rolls' not in tool_context.state: + tool_context.state['rolls'] = [] + + tool_context.state['rolls'] = tool_context.state['rolls'] + [result] + return result + + +async def before_model_callback(callback_context, llm_request): + print('@before_model_callback') + print(f'Beginning model choice: {llm_request.model}') + callback_context.state['beginning_model_choice'] = llm_request.model + return None + + +async def after_model_callback(callback_context, llm_response): + print('@after_model_callback') + print(f'Final model choice: {llm_response.model_version}') + callback_context.state['final_model_choice'] = llm_response.model_version + return None + + +root_agent = Agent( + model=LiteLlm( + model='gemini/gemini-2.5-pro', + fallbacks=[ + 'anthropic/claude-sonnet-4-5-20250929', + 'openai/gpt-4o', + ], + ), + name='resilient_agent', + description=( + 'hello world agent that can roll a dice of given number of sides.' + ), + instruction=""" + You roll dice and answer questions about the outcome of the dice rolls. + You can roll dice of different sizes. + It is ok to discuss previous dice roles, and comment on the dice rolls. + When you are asked to roll a die, you must call the roll_die tool with the number of sides. Be sure to pass in an integer. Do not pass in a string. + You should never roll a die on your own. + """, + tools=[ + roll_die, + ], + generate_content_config=types.GenerateContentConfig( + safety_settings=[ + types.SafetySetting( # avoid false alarm about rolling dice. + category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, + threshold=types.HarmBlockThreshold.OFF, + ), + ] + ), + before_model_callback=before_model_callback, + after_model_callback=after_model_callback, +) diff --git a/contributing/samples/live_bidi_streaming_multi_agent/agent.py b/contributing/samples/live_bidi_streaming_multi_agent/agent.py index 413e33a727..ddb36b2845 100644 --- a/contributing/samples/live_bidi_streaming_multi_agent/agent.py +++ b/contributing/samples/live_bidi_streaming_multi_agent/agent.py @@ -16,6 +16,7 @@ from google.adk.agents.llm_agent import Agent from google.adk.examples.example import Example +from google.adk.models.google_llm import Gemini from google.adk.tools.example_tool import ExampleTool from google.genai import types @@ -28,6 +29,17 @@ def roll_die(sides: int) -> int: roll_agent = Agent( name="roll_agent", + model=Gemini( + # model="gemini-2.0-flash-live-preview-04-09", # for Vertex project + model="gemini-live-2.5-flash-preview", # for AI studio key + speech_config=types.SpeechConfig( + voice_config=types.VoiceConfig( + prebuilt_voice_config=types.PrebuiltVoiceConfig( + voice_name="Kore", + ) + ) + ), + ), description="Handles rolling dice of different sizes.", instruction=""" You are responsible for rolling dice based on the user's request. @@ -69,6 +81,17 @@ def check_prime(nums: list[int]) -> str: prime_agent = Agent( name="prime_agent", + model=Gemini( + # model="gemini-2.0-flash-live-preview-04-09", # for Vertex project + model="gemini-live-2.5-flash-preview", # for AI studio key + speech_config=types.SpeechConfig( + voice_config=types.VoiceConfig( + prebuilt_voice_config=types.PrebuiltVoiceConfig( + voice_name="Puck", + ) + ) + ), + ), description="Handles checking if numbers are prime.", instruction=""" You are responsible for checking whether numbers are prime. @@ -100,8 +123,17 @@ def get_current_weather(location: str): root_agent = Agent( # find supported models here: https://google.github.io/adk-docs/get-started/streaming/quickstart-streaming/ - model="gemini-2.0-flash-live-preview-04-09", # for Vertex project - # model="gemini-live-2.5-flash-preview", # for AI studio key + model=Gemini( + # model="gemini-2.0-flash-live-preview-04-09", # for Vertex project + model="gemini-live-2.5-flash-preview", # for AI studio key + speech_config=types.SpeechConfig( + voice_config=types.VoiceConfig( + prebuilt_voice_config=types.PrebuiltVoiceConfig( + voice_name="Zephyr", + ) + ) + ), + ), name="root_agent", instruction=""" You are a helpful assistant that can check time, roll dice and check if numbers are prime. diff --git a/contributing/samples/live_bidi_streaming_multi_agent/readme.md b/contributing/samples/live_bidi_streaming_multi_agent/readme.md index 27c93b10f9..dee6f38bf0 100644 --- a/contributing/samples/live_bidi_streaming_multi_agent/readme.md +++ b/contributing/samples/live_bidi_streaming_multi_agent/readme.md @@ -1,9 +1,7 @@ # Simplistic Live (Bidi-Streaming) Multi-Agent -This project provides a basic example of a live, bidirectional streaming multi-agent +This project provides a basic example of a live, [bidirectional streaming](https://google.github.io/adk-docs/streaming/) multi-agent designed for testing and experimentation. -You can see full documentation [here](https://google.github.io/adk-docs/streaming/). - ## Getting Started Follow these steps to get the agent up and running: diff --git a/contributing/samples/live_bidi_streaming_single_agent/agent.py b/contributing/samples/live_bidi_streaming_single_agent/agent.py index 29764abc75..95959790ca 100755 --- a/contributing/samples/live_bidi_streaming_single_agent/agent.py +++ b/contributing/samples/live_bidi_streaming_single_agent/agent.py @@ -14,7 +14,7 @@ import random -from google.adk import Agent +from google.adk.agents.llm_agent import Agent from google.adk.tools.tool_context import ToolContext from google.genai import types @@ -67,14 +67,14 @@ async def check_prime(nums: list[int]) -> str: root_agent = Agent( # model='gemini-2.0-flash-live-preview-04-09', # for Vertex project model='gemini-2.0-flash-live-001', # for AI studio key - name='hello_world_agent', + name='roll_dice_agent', description=( - 'hello world agent that can roll a dice of 8 sides and check prime' + 'hello world agent that can roll a dice of 6 sides and check prime' ' numbers.' ), instruction=""" You roll dice and answer questions about the outcome of the dice rolls. - You can roll dice of different sizes. + You can roll dice of different sizes. When the user doesn't specify the number of sides, you should assume 6 sides. You can use multiple tools in parallel by calling functions in parallel(in one request and in one round). It is ok to discuss previous dice roles, and comment on the dice rolls. When you are asked to roll a die, you must call the roll_die tool with the number of sides. Be sure to pass in an integer. Do not pass in a string. diff --git a/contributing/samples/live_bidi_streaming_single_agent/readme.md b/contributing/samples/live_bidi_streaming_single_agent/readme.md index 6a9258f3ee..56187fb0d4 100644 --- a/contributing/samples/live_bidi_streaming_single_agent/readme.md +++ b/contributing/samples/live_bidi_streaming_single_agent/readme.md @@ -1,9 +1,7 @@ # Simplistic Live (Bidi-Streaming) Agent -This project provides a basic example of a live, bidirectional streaming agent +This project provides a basic example of a live, [bidirectional streaming](https://google.github.io/adk-docs/streaming/) agent designed for testing and experimentation. -You can see full documentation [here](https://google.github.io/adk-docs/streaming/). - ## Getting Started Follow these steps to get the agent up and running: diff --git a/contributing/samples/logprobs/README.md b/contributing/samples/logprobs/README.md new file mode 100644 index 0000000000..16ba9518cb --- /dev/null +++ b/contributing/samples/logprobs/README.md @@ -0,0 +1,60 @@ +# Log Probabilities Demo Agent + +This sample demonstrates how to access and display log probabilities from language model responses using the new `avg_logprobs` and `logprobs_result` fields in `LlmResponse`. + +## Overview + +This simple example shows: +- **Log Probability Access**: How to extract `avg_logprobs` and `logprobs_result` from `LlmResponse` +- **After-Model Callback**: How to append log probability information to responses +- **Confidence Analysis**: How to interpret and display confidence metrics +- **Practical Usage**: Real-world example of accessing logprobs data + +## How It Works + +``` +User Query → Agent Response → Log Probability Analysis Appended + +1. User asks a question +2. Agent generates response with log probabilities enabled +3. After-model callback extracts avg_logprobs from LlmResponse +4. Callback appends log probability analysis to response content +5. User sees both the response and confidence information +``` + +## What You'll See + +The agent response will include log probability analysis like: +``` +[LOG PROBABILITY ANALYSIS] +📊 Average Log Probability: -0.23 +🎯 Confidence Level: High +📈 Confidence Score: 79.4% +🔍 Top alternatives analyzed: 5 +``` + +## Usage + +### Basic Usage +```bash +# Run the agent in web UI +adk web contributing/samples + +# Or run via CLI +adk run contributing/samples/logprobs +``` + +## Understanding Log Probabilities + +- **Range**: -∞ to 0 (0 = 100% confident, -1 ≈ 37% confident, -2 ≈ 14% confident) +- **Confidence Levels**: + - High: >= -0.5 (typically factual, straightforward responses) + - Medium: -1.0 to -0.5 (reasonably confident responses) + - Low: < -1.0 (uncertain or complex responses) +- **Use Cases**: Quality control, uncertainty detection, response filtering + + + +## Key Fields in LlmResponse +- **`avg_logprobs`**: Average log probability across all tokens in the response +- **`logprobs_result`**: Detailed log probability information including top alternative tokens diff --git a/contributing/samples/logprobs/__init__.py b/contributing/samples/logprobs/__init__.py new file mode 100644 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/logprobs/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/logprobs/agent.py b/contributing/samples/logprobs/agent.py new file mode 100644 index 0000000000..c5f7daaba4 --- /dev/null +++ b/contributing/samples/logprobs/agent.py @@ -0,0 +1,105 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Sample agent demonstrating log probability usage. + +This agent shows how to access log probabilities from language model responses. +The after_model_callback appends confidence information to demonstrate how +logprobs can be extracted and used. +""" + +from google.adk.agents.callback_context import CallbackContext +from google.adk.agents.llm_agent import Agent +from google.adk.models.llm_response import LlmResponse +from google.genai import types + + +async def append_logprobs_to_response( + callback_context: CallbackContext, llm_response: LlmResponse +) -> LlmResponse: + """After-model callback that appends log probability information to response. + + This callback demonstrates how to access avg_logprobs and logprobs_result + from the LlmResponse and append the information to the response content. + + Args: + callback_context: The current callback context + llm_response: The LlmResponse containing logprobs data + + Returns: + Modified LlmResponse with logprobs information appended + """ + # Build log probability analysis + if llm_response.avg_logprobs is None: + print("⚠️ No log probability data available") + logprobs_info = ( + "\n\n[LOG PROBABILITY ANALYSIS]\n⚠️ No log probability data available" + ) + else: + print(f"📊 Average log probability: {llm_response.avg_logprobs:.4f}") + + # Build confidence analysis + confidence_level = ( + "High" + if llm_response.avg_logprobs >= -0.5 + else "Medium" + if llm_response.avg_logprobs >= -1.0 + else "Low" + ) + + logprobs_info = f""" + +[LOG PROBABILITY ANALYSIS] +📊 Average Log Probability: {llm_response.avg_logprobs:.4f} +🎯 Confidence Level: {confidence_level} +📈 Confidence Score: {100 * (2 ** llm_response.avg_logprobs):.1f}%""" + + # Optionally include detailed logprobs_result information + if ( + llm_response.logprobs_result + and llm_response.logprobs_result.top_candidates + ): + logprobs_info += ( + "\n🔍 Top alternatives analyzed:" + f" {len(llm_response.logprobs_result.top_candidates)}" + ) + + # Append logprobs analysis to the response + if llm_response.content and llm_response.content.parts: + llm_response.content.parts.append(types.Part(text=logprobs_info)) + + return llm_response + + +# Create a simple agent that demonstrates logprobs usage +root_agent = Agent( + model="gemini-2.0-flash", + name="logprobs_demo_agent", + description=( + "A simple agent that demonstrates log probability extraction and" + " display." + ), + instruction=""" + You are a helpful AI assistant. Answer user questions normally and naturally. + + After you respond, you'll see log probability analysis appended to your response. + You don't need to include the log probability analysis in your response yourself. + """, + generate_content_config=types.GenerateContentConfig( + response_logprobs=True, # Enable log probability collection + logprobs=5, # Collect top 5 alternatives for analysis + temperature=0.7, # Moderate temperature for varied responses + ), + after_model_callback=append_logprobs_to_response, +) diff --git a/contributing/samples/mcp_dynamic_header_agent/README.md b/contributing/samples/mcp_dynamic_header_agent/README.md new file mode 100644 index 0000000000..50f7125585 --- /dev/null +++ b/contributing/samples/mcp_dynamic_header_agent/README.md @@ -0,0 +1,8 @@ +This agent connects to a local MCP server via Streamable HTTP and provides +custom per-request headers to the MCP server. + +To run this agent, start the local MCP server first by running: + +```bash +uv run header_server.py +``` \ No newline at end of file diff --git a/contributing/samples/mcp_dynamic_header_agent/__init__.py b/contributing/samples/mcp_dynamic_header_agent/__init__.py new file mode 100644 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/mcp_dynamic_header_agent/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/mcp_dynamic_header_agent/agent.py b/contributing/samples/mcp_dynamic_header_agent/agent.py new file mode 100644 index 0000000000..028d7feb12 --- /dev/null +++ b/contributing/samples/mcp_dynamic_header_agent/agent.py @@ -0,0 +1,34 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from google.adk.agents.llm_agent import LlmAgent +from google.adk.tools.mcp_tool.mcp_session_manager import StreamableHTTPConnectionParams +from google.adk.tools.mcp_tool.mcp_toolset import McpToolset + +root_agent = LlmAgent( + model='gemini-2.0-flash', + name='tenant_agent', + instruction="""You are a helpful assistant that helps users get tenant + information. Call the get_tenant_data tool when the user asks for tenant data.""", + tools=[ + McpToolset( + connection_params=StreamableHTTPConnectionParams( + url='http://localhost:3000/mcp', + ), + tool_filter=['get_tenant_data'], + header_provider=lambda ctx: {'X-Tenant-ID': 'tenant1'}, + ) + ], +) diff --git a/contributing/samples/mcp_dynamic_header_agent/header_server.py b/contributing/samples/mcp_dynamic_header_agent/header_server.py new file mode 100644 index 0000000000..386ae43bdf --- /dev/null +++ b/contributing/samples/mcp_dynamic_header_agent/header_server.py @@ -0,0 +1,50 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from fastapi import Request +from mcp.server.fastmcp import Context +from mcp.server.fastmcp import FastMCP + +mcp = FastMCP('Header Check Server', host='localhost', port=3000) + +TENANT_DATA = { + 'tenant1': {'name': 'Tenant 1', 'data': 'Data for tenant 1'}, + 'tenant2': {'name': 'Tenant 2', 'data': 'Data for tenant 2'}, +} + + +@mcp.tool( + description='Returns tenant specific data based on X-Tenant-ID header.' +) +def get_tenant_data(context: Context) -> dict: + """Return tenant specific data.""" + if context.request_context and context.request_context.request: + headers = context.request_context.request.headers + tenant_id = headers.get('x-tenant-id') + if tenant_id in TENANT_DATA: + return TENANT_DATA[tenant_id] + else: + return {'error': f'Tenant {tenant_id} not found'} + else: + return {'error': 'Could not get request context'} + + +if __name__ == '__main__': + try: + print('Starting Header Check MCP server on http://localhost:3000') + mcp.run(transport='streamable-http') + except KeyboardInterrupt: + print('\nServer stopped.') diff --git a/contributing/samples/mcp_postgres_agent/README.md b/contributing/samples/mcp_postgres_agent/README.md new file mode 100644 index 0000000000..92095e6102 --- /dev/null +++ b/contributing/samples/mcp_postgres_agent/README.md @@ -0,0 +1,65 @@ +# PostgreSQL MCP Agent + +This agent uses the PostgreSQL MCP server to interact with PostgreSQL databases. It demonstrates how to: +- Connect to a PostgreSQL database using MCP (Model Context Protocol) +- Use `uvx` to run the MCP server without manual installation +- Pass database credentials securely via environment variables + +## Prerequisites + +* **PostgreSQL Database**: You need access to a PostgreSQL database with a connection string +* **uvx**: The agent uses `uvx` (part of the `uv` package manager) to run the MCP server + +## Setup Instructions + +### 1. Configure Database Connection + +Create a `.env` file in the `mcp_postgres_agent` directory: + +```bash +POSTGRES_CONNECTION_STRING=postgresql://user:password@host:port/database +``` + +Example connection string format: +``` +postgresql://username:password@localhost:5432/mydb +postgresql://postgres.xyz:password@aws-region.pooler.supabase.com:5432/postgres +``` + +### 2. Run the Agent + +Start the ADK Web UI from the samples directory: + +```bash +adk web +``` + +The agent will automatically: +- Load the connection string from the `.env` file +- Use `uvx` to run the `postgres-mcp` server with unrestricted access mode +- Connect to your PostgreSQL database + +### 3. Example Queries + +Once the agent is running, try these queries: + +* "What tables are in the database?" +* "Show me the schema for the users table" +* "Query the first 10 rows from the products table" +* "What indexes exist on the orders table?" +* "Create a new table called test_table with columns id and name" + +## Configuration Details + +The agent uses: +- **Model**: Gemini 2.0 Flash +- **MCP Server**: `postgres-mcp` (via `uvx`) +- **Access Mode**: Unrestricted (allows read/write operations). **Warning**: Using unrestricted mode in a production environment can pose significant security risks. It is recommended to use a more restrictive access mode or configure database user permissions appropriately for production use. +- **Connection**: StdioConnectionParams with 60-second timeout +- **Environment Variable**: `DATABASE_URI` (mapped from `POSTGRES_CONNECTION_STRING`) + +## Troubleshooting + +- Ensure your `POSTGRES_CONNECTION_STRING` is correctly formatted +- Verify database credentials and network access +- Check that `uv` is installed (`pip install uv` or `brew install uv`) diff --git a/contributing/samples/mcp_postgres_agent/__init__.py b/contributing/samples/mcp_postgres_agent/__init__.py new file mode 100755 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/mcp_postgres_agent/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/mcp_postgres_agent/agent.py b/contributing/samples/mcp_postgres_agent/agent.py new file mode 100644 index 0000000000..7298e25004 --- /dev/null +++ b/contributing/samples/mcp_postgres_agent/agent.py @@ -0,0 +1,57 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os + +from dotenv import load_dotenv +from google.adk.agents.llm_agent import LlmAgent +from google.adk.tools.mcp_tool import StdioConnectionParams +from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset +from google.genai.types import GenerateContentConfig +from mcp import StdioServerParameters + +load_dotenv() + +POSTGRES_CONNECTION_STRING = os.getenv("POSTGRES_CONNECTION_STRING") +if not POSTGRES_CONNECTION_STRING: + raise ValueError( + "POSTGRES_CONNECTION_STRING environment variable not set. " + "Please create a .env file with this variable." + ) + +root_agent = LlmAgent( + model="gemini-2.0-flash", + name="postgres_agent", + instruction=( + "You are a PostgreSQL database assistant. " + "Use the provided tools to query, manage, and interact with " + "the PostgreSQL database. Ask clarifying questions when unsure." + ), + tools=[ + MCPToolset( + connection_params=StdioConnectionParams( + server_params=StdioServerParameters( + command="uvx", + args=["postgres-mcp", "--access-mode=unrestricted"], + env={"DATABASE_URI": POSTGRES_CONNECTION_STRING}, + ), + timeout=60, + ), + ) + ], + generate_content_config=GenerateContentConfig( + temperature=0.2, + top_p=0.95, + ), +) diff --git a/contributing/samples/mcp_server_side_sampling/README.md b/contributing/samples/mcp_server_side_sampling/README.md new file mode 100644 index 0000000000..5fe96184c8 --- /dev/null +++ b/contributing/samples/mcp_server_side_sampling/README.md @@ -0,0 +1,51 @@ +# FastMCP Server-Side Sampling with ADK + +This project demonstrates how to use server-side sampling with a `fastmcp` server connected to an ADK `MCPToolset`. + +## Description + +The setup consists of two main components: + +1. **ADK Agent (`agent.py`):** An `LlmAgent` is configured with an `MCPToolset`. This toolset connects to a local `fastmcp` server. +2. **FastMCP Server (`mcp_server.py`):** A `fastmcp` server that exposes a single tool, `analyze_sentiment`. This server is configured to use its own LLM for sampling, independent of the ADK agent's LLM. + +The flow is as follows: +1. The user provides a text prompt to the ADK agent. +2. The agent decides to use the `analyze_sentiment` tool from the `MCPToolset`. +3. The tool call is sent to the `mcp_server.py`. +4. Inside the `analyze_sentiment` tool, `ctx.sample()` is called. This delegates an LLM call to the `fastmcp` server's own sampling handler. +5. The `mcp_server`'s LLM processes the prompt from `ctx.sample()` and returns the result to the server. +6. The server processes the LLM response and returns the final sentiment to the agent. +7. The agent displays the result to the user. + +## Steps to Run + +### Prerequisites + +- Python 3.10+ +- `google-adk` library installed. +- A configured OpenAI API key. + +### 1. Set up the Environment + +Clone the project and navigate to the directory. Make sure your `OPENAI_API_KEY` is available as an environment variable. + +### 2. Install Dependencies + +Install the required Python libraries: + +```bash +pip install fastmcp openai litellm +``` + +### 3. Run the Example + +Navigate to the `samples` directory and choose this ADK agent: + +```bash +adk web . +``` + +The agent will automatically start the FastMCP server in the background. + +- **Sample user prompt:** "What is the sentiment of 'I love building things with Python'?" diff --git a/contributing/samples/mcp_server_side_sampling/__init__.py b/contributing/samples/mcp_server_side_sampling/__init__.py new file mode 100755 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/mcp_server_side_sampling/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/mcp_server_side_sampling/agent.py b/contributing/samples/mcp_server_side_sampling/agent.py new file mode 100755 index 0000000000..36695f1bdf --- /dev/null +++ b/contributing/samples/mcp_server_side_sampling/agent.py @@ -0,0 +1,56 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os + +from google.adk.agents import LlmAgent +from google.adk.models.lite_llm import LiteLlm +from google.adk.tools.mcp_tool import MCPToolset +from google.adk.tools.mcp_tool.mcp_session_manager import StdioConnectionParams +from mcp import StdioServerParameters + +# This example uses the OpenAI API for both the agent and the server. +# Ensure your OPENAI_API_KEY is available as an environment variable. +api_key = os.getenv('OPENAI_API_KEY') +if not api_key: + raise ValueError('The OPENAI_API_KEY environment variable must be set.') + +# Configure the StdioServerParameters to start the mcp_server.py script +# as a subprocess. The OPENAI_API_KEY is passed to the server's environment. +server_params = StdioServerParameters( + command='python', + args=['mcp_server.py'], + env={'OPENAI_API_KEY': api_key}, +) + +# Create the ADK MCPToolset, which connects to the FastMCP server. +# The `tool_filter` ensures that only the 'analyze_sentiment' tool is exposed +# to the agent. +mcp_toolset = MCPToolset( + connection_params=StdioConnectionParams( + server_params=server_params, + ), + tool_filter=['analyze_sentiment'], +) + +# Define the ADK agent that uses the MCP toolset. +root_agent = LlmAgent( + model=LiteLlm(model='openai/gpt-4o'), + name='SentimentAgent', + instruction=( + 'You are an expert at analyzing text sentiment. Use the' + ' analyze_sentiment tool to classify user input.' + ), + tools=[mcp_toolset], +) diff --git a/contributing/samples/mcp_server_side_sampling/mcp_server.py b/contributing/samples/mcp_server_side_sampling/mcp_server.py new file mode 100644 index 0000000000..2680c29ddd --- /dev/null +++ b/contributing/samples/mcp_server_side_sampling/mcp_server.py @@ -0,0 +1,81 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging +import os + +from fastmcp import Context +from fastmcp import FastMCP +from fastmcp.experimental.sampling.handlers.openai import OpenAISamplingHandler +from openai import OpenAI + +logging.basicConfig(level=logging.INFO) +API_KEY = os.getenv("OPENAI_API_KEY") + +# Set up the server's LLM handler using the OpenAI API. +# This handler will be used for all sampling requests from tools on this server. +llm_handler = OpenAISamplingHandler( + default_model="gpt-4o", + client=OpenAI( + api_key=API_KEY, + ), +) + + +# Create the FastMCP Server instance. +# The `sampling_handler` is configured to use the server's own LLM. +# `sampling_handler_behavior="always"` ensures the server never delegates +# sampling back to the ADK agent. +mcp = FastMCP( + name="SentimentAnalysis", + sampling_handler=llm_handler, + sampling_handler_behavior="always", +) + + +@mcp.tool +async def analyze_sentiment(text: str, ctx: Context) -> dict: + """Analyzes sentiment by delegating to the server's own LLM.""" + logging.info("analyze_sentiment tool called with text: %s", text) + prompt = f"""Analyze the sentiment of the following text as positive, + negative, or neutral. Just output a single word. + Text to analyze: {text}""" + + # This delegates the LLM call to the server's own sampling handler, + # as configured in the FastMCP instance. + logging.info("Attempting to call ctx.sample()") + try: + response = await ctx.sample(prompt) + logging.info("ctx.sample() successful. Response: %s", response) + except Exception as e: + logging.error("ctx.sample() failed: %s", e, exc_info=True) + raise + + sentiment = response.text.strip().lower() + + if "positive" in sentiment: + result = "positive" + elif "negative" in sentiment: + result = "negative" + else: + result = "neutral" + + logging.info("Sentiment analysis result: %s", result) + return {"text": text, "sentiment": result} + + +if __name__ == "__main__": + print("Starting FastMCP server with tool 'analyze_sentiment'...") + # This runs the server process, which the ADK agent will connect to. + mcp.run() diff --git a/contributing/samples/mcp_service_account_agent/README.md b/contributing/samples/mcp_service_account_agent/README.md new file mode 100644 index 0000000000..519537c658 --- /dev/null +++ b/contributing/samples/mcp_service_account_agent/README.md @@ -0,0 +1,55 @@ +# MCP Service Account Agent Sample + +This agent demonstrates how to connect to a remote MCP server using a gcloud service account for authentication. It uses Streamable HTTP for communication. + +## Setup + +Before running the agent, you need to configure the MCP server URL and your service account credentials in `agent.py`. + +1. **Configure MCP Server URL:** + Update the `MCP_SERVER_URL` variable with the URL of your MCP server instance. + + ```python + # agent.py + # TODO: Update this to the production MCP server url and scopes. + MCP_SERVER_URL = "https://test.sandbox.googleapis.com/mcp" + ``` + +2. **Set up Service Account Credentials:** + - Obtain the JSON key file for your gcloud service account. + - In `agent.py`, find the `ServiceAccountCredential` object and populate its parameters (e.g., `project_id`, `private_key`, `client_email`, etc.) with the corresponding values from your JSON key file. + + ```python + # agent.py + # TODO: Update this to the user's service account credentials. + auth_credential=AuthCredential( + auth_type=AuthCredentialTypes.SERVICE_ACCOUNT, + service_account=ServiceAccount( + service_account_credential=ServiceAccountCredential( + type_="service_account", + project_id="example", + private_key_id="123", + private_key="123", + client_email="test@example.iam.gserviceaccount.com", + client_id="123", + 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="https://www.googleapis.com/robot/v1/metadata/x509/example.iam.gserviceaccount.com", + universe_domain="googleapis.com", + ), + scopes=SCOPES.keys(), + ), + ), + ``` + +## Running the Agent + +Once configured, you can run the agent. + +For example: +```bash +adk web +``` \ No newline at end of file diff --git a/contributing/samples/mcp_service_account_agent/__init__.py b/contributing/samples/mcp_service_account_agent/__init__.py new file mode 100644 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/mcp_service_account_agent/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/mcp_service_account_agent/agent.py b/contributing/samples/mcp_service_account_agent/agent.py new file mode 100644 index 0000000000..dc3ebf7b1a --- /dev/null +++ b/contributing/samples/mcp_service_account_agent/agent.py @@ -0,0 +1,74 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from fastapi.openapi.models import OAuth2 +from fastapi.openapi.models import OAuthFlowClientCredentials +from fastapi.openapi.models import OAuthFlows +from google.adk.agents.llm_agent import LlmAgent +from google.adk.auth.auth_credential import AuthCredential +from google.adk.auth.auth_credential import AuthCredentialTypes +from google.adk.auth.auth_credential import ServiceAccount +from google.adk.auth.auth_credential import ServiceAccountCredential +from google.adk.tools.mcp_tool.mcp_session_manager import StreamableHTTPServerParams +from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset + +# TODO: Update this to the production MCP server url and scopes. +MCP_SERVER_URL = "https://test.sandbox.googleapis.com/mcp" +SCOPES = {"https://www.googleapis.com/auth/cloud-platform": ""} + +root_agent = LlmAgent( + model="gemini-2.0-flash", + name="enterprise_assistant", + instruction=""" +Help the user with the tools available to you. + """, + tools=[ + MCPToolset( + connection_params=StreamableHTTPServerParams( + url=MCP_SERVER_URL, + ), + auth_scheme=OAuth2( + flows=OAuthFlows( + clientCredentials=OAuthFlowClientCredentials( + tokenUrl="https://oauth2.googleapis.com/token", + scopes=SCOPES, + ) + ) + ), + # TODO: Update this to the user's service account credentials. + auth_credential=AuthCredential( + auth_type=AuthCredentialTypes.SERVICE_ACCOUNT, + service_account=ServiceAccount( + service_account_credential=ServiceAccountCredential( + type_="service_account", + project_id="example", + private_key_id="123", + private_key="123", + client_email="test@example.iam.gserviceaccount.com", + client_id="123", + 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="https://www.googleapis.com/robot/v1/metadata/x509/example.iam.gserviceaccount.com", + universe_domain="googleapis.com", + ), + scopes=SCOPES.keys(), + ), + ), + ) + ], +) diff --git a/contributing/samples/mcp_sse_agent/agent.py b/contributing/samples/mcp_sse_agent/agent.py index 5423bfc6b0..8d0980df44 100755 --- a/contributing/samples/mcp_sse_agent/agent.py +++ b/contributing/samples/mcp_sse_agent/agent.py @@ -16,25 +16,27 @@ import os from google.adk.agents.llm_agent import LlmAgent +from google.adk.agents.mcp_instruction_provider import McpInstructionProvider from google.adk.tools.mcp_tool.mcp_session_manager import SseConnectionParams from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset _allowed_path = os.path.dirname(os.path.abspath(__file__)) +connection_params = SseConnectionParams( + url='http://localhost:3000/sse', + headers={'Accept': 'text/event-stream'}, +) + root_agent = LlmAgent( model='gemini-2.0-flash', name='enterprise_assistant', - instruction=f"""\ -Help user accessing their file systems. - -Allowed directory: {_allowed_path} - """, + instruction=McpInstructionProvider( + connection_params=connection_params, + prompt_name='file_system_prompt', + ), tools=[ MCPToolset( - connection_params=SseConnectionParams( - url='http://localhost:3000/sse', - headers={'Accept': 'text/event-stream'}, - ), + connection_params=connection_params, # don't want agent to do write operation # you can also do below # tool_filter=lambda tool, ctx=None: tool.name @@ -53,6 +55,7 @@ 'get_file_info', 'list_allowed_directories', ], + require_confirmation=True, ) ], ) diff --git a/contributing/samples/mcp_sse_agent/filesystem_server.py b/contributing/samples/mcp_sse_agent/filesystem_server.py index cda4f0a968..291091e511 100644 --- a/contributing/samples/mcp_sse_agent/filesystem_server.py +++ b/contributing/samples/mcp_sse_agent/filesystem_server.py @@ -45,6 +45,13 @@ def get_cwd() -> str: return str(Path.cwd()) +# Add a prompt for accessing file systems +@mcp.prompt(name="file_system_prompt") +def file_system_prompt() -> str: + return f"""\ +Help the user access their file systems.""" + + # Graceful shutdown handler async def shutdown(signal, loop): """Cleanup tasks tied to the service's shutdown.""" diff --git a/contributing/samples/mcp_stdio_notion_agent/README.md b/contributing/samples/mcp_stdio_notion_agent/README.md index f53bd2f03f..d40df313f2 100644 --- a/contributing/samples/mcp_stdio_notion_agent/README.md +++ b/contributing/samples/mcp_stdio_notion_agent/README.md @@ -17,4 +17,4 @@ export NOTION_API_KEY= * Send below queries: * What can you do for me ? - * Seach `XXXX` in my pages. + * Search `XXXX` in my pages. diff --git a/contributing/samples/migrate_session_db/README.md b/contributing/samples/migrate_session_db/README.md new file mode 100644 index 0000000000..6f1fc1aa11 --- /dev/null +++ b/contributing/samples/migrate_session_db/README.md @@ -0,0 +1,55 @@ +# Loading and Upgrading Old Session Databases + +This example demonstrates how to upgrade a session database created with an older version of ADK to be compatible with the current version. + +## Sample Database + +This sample includes `dnd_sessions.db`, a database created with ADK v1.15.0. The following steps show how to run into a schema error and then resolve it using the migration script. + +## 1. Reproduce the Error + +First, copy the old database to `sessions.db`, which is the file the sample application expects. + +```bash +cp dnd_sessions.db sessions.db +python main.py +``` + +Running the application against the old database will fail with a schema mismatch error, as the `events` table is missing a column required by newer ADK versions: + +``` +sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such column: events.usage_metadata +``` + +## 2. Upgrade the Database Schema + +ADK provides a migration script to update the database schema. Run the following command to download and execute it. + +```bash +# Clean up the previous run before executing the migration +cp dnd_sessions.db sessions.db + +# Download and run the migration script +curl -fsSL https://raw.githubusercontent.com/google/adk-python/main/scripts/db_migration.sh | sh -s -- "sqlite:///%(here)s/sessions.db" "google.adk.sessions.database_session_service" +``` + +This script uses `alembic` to compare the existing schema against the current model definition and automatically generates and applies the necessary migrations. + +**Note on generated files:** +* The script will create an `alembic.ini` file and an `alembic/` directory. You must delete these before re-running the script. +* The `sample-output` directory in this example contains a reference of the generated files for your inspection. +* The `%(here)s` variable in the database URL is an `alembic` placeholder that refers to the current directory. + +## 3. Run the Agent Successfully + +With the database schema updated, the application can now load the session correctly. + +```bash +python main.py +``` + +You should see output indicating that the old session was successfully loaded. + +## Limitations + +The migration script is designed to add new columns that have been introduced in newer ADK versions. It does not handle more complex schema changes, such as modifying a column's data type (e.g., from `int` to `string`) or altering the internal structure of stored data. \ No newline at end of file diff --git a/contributing/samples/migrate_session_db/__init__.py b/contributing/samples/migrate_session_db/__init__.py new file mode 100644 index 0000000000..7d5bb0b1c6 --- /dev/null +++ b/contributing/samples/migrate_session_db/__init__.py @@ -0,0 +1,16 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from . import agent diff --git a/contributing/samples/migrate_session_db/agent.py b/contributing/samples/migrate_session_db/agent.py new file mode 100644 index 0000000000..6caeeb1c66 --- /dev/null +++ b/contributing/samples/migrate_session_db/agent.py @@ -0,0 +1,89 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import random + +from google.adk.agents.llm_agent import Agent + + +def roll_die(sides: int) -> int: + """Roll a die and return the rolled result. + + Args: + sides: The integer number of sides the die has. + + Returns: + An integer of the result of rolling the die. + """ + return random.randint(1, sides) + + +async def check_prime(nums: list[int]) -> str: + """Check if a given list of numbers are prime. + + Args: + nums: The list of numbers to check. + + Returns: + A str indicating which number is prime. + """ + primes = set() + for number in nums: + number = int(number) + if number <= 1: + continue + is_prime = True + for i in range(2, int(number**0.5) + 1): + if number % i == 0: + is_prime = False + break + if is_prime: + primes.add(number) + return ( + "No prime numbers found." + if not primes + else f"{', '.join(str(num) for num in primes)} are prime numbers." + ) + + +root_agent = Agent( + model="gemini-2.0-flash", + name="migrate_session_db_agent", + description=( + "hello world agent that can roll a dice of 8 sides and check prime" + " numbers." + ), + instruction=""" + You roll dice and answer questions about the outcome of the dice rolls. + You can roll dice of different sizes. + You can use multiple tools in parallel by calling functions in parallel(in one request and in one round). + It is ok to discuss previous dice roles, and comment on the dice rolls. + When you are asked to roll a die, you must call the roll_die tool with the number of sides. Be sure to pass in an integer. Do not pass in a string. + You should never roll a die on your own. + When checking prime numbers, call the check_prime tool with a list of integers. Be sure to pass in a list of integers. You should never pass in a string. + You should not check prime numbers before calling the tool. + When you are asked to roll a die and check prime numbers, you should always make the following two function calls: + 1. You should first call the roll_die tool to get a roll. Wait for the function response before calling the check_prime tool. + 2. After you get the function response from roll_die tool, you should call the check_prime tool with the roll_die result. + 2.1 If user asks you to check primes based on previous rolls, make sure you include the previous rolls in the list. + 3. When you respond, you must include the roll_die result from step 1. + You should always perform the previous 3 steps when asking for a roll and checking prime numbers. + You should not rely on the previous history on prime results. + """, + tools=[ + roll_die, + check_prime, + ], +) diff --git a/contributing/samples/migrate_session_db/dnd_sessions.db b/contributing/samples/migrate_session_db/dnd_sessions.db new file mode 100644 index 0000000000000000000000000000000000000000..57e667466f90ddcc965b3713922202c588c61c32 GIT binary patch literal 49152 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 literal 0 HcmV?d00001 diff --git a/contributing/samples/migrate_session_db/main.py b/contributing/samples/migrate_session_db/main.py new file mode 100644 index 0000000000..10d2da0af5 --- /dev/null +++ b/contributing/samples/migrate_session_db/main.py @@ -0,0 +1,79 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import asyncio +import time + +import agent +from dotenv import load_dotenv +from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService +from google.adk.cli.utils import logs +from google.adk.runners import Runner +from google.adk.sessions.database_session_service import DatabaseSessionService +from google.adk.sessions.session import Session +from google.genai import types + +load_dotenv(override=True) +logs.log_to_tmp_folder() + + +async def main(): + app_name = 'migrate_session_db_app' + user_id_1 = 'user1' + session_service = DatabaseSessionService('sqlite:///./sessions.db') + artifact_service = InMemoryArtifactService() + runner = Runner( + app_name=app_name, + agent=agent.root_agent, + artifact_service=artifact_service, + session_service=session_service, + ) + session_11 = await session_service.get_session( + app_name=app_name, + user_id=user_id_1, + session_id='aee03f34-32ef-432b-b1bb-e66a3a79dd5b', + ) + print('Session 11 loaded:', session_11.id) + + async def run_prompt(session: Session, new_message: str): + content = types.Content( + role='user', parts=[types.Part.from_text(text=new_message)] + ) + print('** User says:', content.model_dump(exclude_none=True)) + async for event in runner.run_async( + user_id=user_id_1, + session_id=session.id, + new_message=content, + ): + if event.content.parts and event.content.parts[0].text: + print(f'** {event.author}: {event.content.parts[0].text}') + + start_time = time.time() + print('Start time:', start_time) + print('------------------------------------') + await run_prompt(session_11, 'Hi, introduce yourself.') + await run_prompt( + session_11, 'Roll a die with 100 sides and check if it is prime' + ) + await run_prompt(session_11, 'Roll it again.') + await run_prompt(session_11, 'What numbers did I got?') + end_time = time.time() + print('------------------------------------') + print('End time:', end_time) + print('Total time:', end_time - start_time) + + +if __name__ == '__main__': + asyncio.run(main()) diff --git a/contributing/samples/migrate_session_db/sample-output/alembic.ini b/contributing/samples/migrate_session_db/sample-output/alembic.ini new file mode 100644 index 0000000000..6405320948 --- /dev/null +++ b/contributing/samples/migrate_session_db/sample-output/alembic.ini @@ -0,0 +1,147 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts. +# this is typically a path given in POSIX (e.g. forward slashes) +# format, relative to the token %(here)s which refers to the location of this +# ini file +script_location = %(here)s/alembic + +# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s +# Uncomment the line below if you want the files to be prepended with date and time +# see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file +# for all available tokens +# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s + +# sys.path path, will be prepended to sys.path if present. +# defaults to the current working directory. for multiple paths, the path separator +# is defined by "path_separator" below. +prepend_sys_path = . + + +# timezone to use when rendering the date within the migration file +# as well as the filename. +# If specified, requires the python>=3.9 or backports.zoneinfo library and tzdata library. +# Any required deps can installed by adding `alembic[tz]` to the pip requirements +# string value is passed to ZoneInfo() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the "slug" field +# truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; This defaults +# to /versions. When using multiple version +# directories, initial revisions must be specified with --version-path. +# The path separator used here should be the separator specified by "path_separator" +# below. +# version_locations = %(here)s/bar:%(here)s/bat:%(here)s/alembic/versions + +# path_separator; This indicates what character is used to split lists of file +# paths, including version_locations and prepend_sys_path within configparser +# files such as alembic.ini. +# The default rendered in new alembic.ini files is "os", which uses os.pathsep +# to provide os-dependent path splitting. +# +# Note that in order to support legacy alembic.ini files, this default does NOT +# take place if path_separator is not present in alembic.ini. If this +# option is omitted entirely, fallback logic is as follows: +# +# 1. Parsing of the version_locations option falls back to using the legacy +# "version_path_separator" key, which if absent then falls back to the legacy +# behavior of splitting on spaces and/or commas. +# 2. Parsing of the prepend_sys_path option falls back to the legacy +# behavior of splitting on spaces, commas, or colons. +# +# Valid values for path_separator are: +# +# path_separator = : +# path_separator = ; +# path_separator = space +# path_separator = newline +# +# Use os.pathsep. Default configuration used for new projects. +path_separator = os + +# set to 'true' to search source files recursively +# in each "version_locations" directory +# new in Alembic version 1.10 +# recursive_version_locations = false + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +# database URL. This is consumed by the user-maintained env.py script only. +# other means of configuring database URLs may be customized within the env.py +# file. +sqlalchemy.url = sqlite:///%(here)s/sessions.db + + +[post_write_hooks] +# post_write_hooks defines scripts or Python functions that are run +# on newly generated revision scripts. See the documentation for further +# detail and examples + +# format using "black" - use the console_scripts runner, against the "black" entrypoint +# hooks = black +# black.type = console_scripts +# black.entrypoint = black +# black.options = -l 79 REVISION_SCRIPT_FILENAME + +# lint with attempts to fix using "ruff" - use the module runner, against the "ruff" module +# hooks = ruff +# ruff.type = module +# ruff.module = ruff +# ruff.options = check --fix REVISION_SCRIPT_FILENAME + +# Alternatively, use the exec runner to execute a binary found on your PATH +# hooks = ruff +# ruff.type = exec +# ruff.executable = ruff +# ruff.options = check --fix REVISION_SCRIPT_FILENAME + +# Logging configuration. This is also consumed by the user-maintained +# env.py script only. +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARNING +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARNING +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/contributing/samples/migrate_session_db/sample-output/alembic/README b/contributing/samples/migrate_session_db/sample-output/alembic/README new file mode 100644 index 0000000000..98e4f9c44e --- /dev/null +++ b/contributing/samples/migrate_session_db/sample-output/alembic/README @@ -0,0 +1 @@ +Generic single-database configuration. \ No newline at end of file diff --git a/contributing/samples/migrate_session_db/sample-output/alembic/env.py b/contributing/samples/migrate_session_db/sample-output/alembic/env.py new file mode 100644 index 0000000000..4bc5c948ea --- /dev/null +++ b/contributing/samples/migrate_session_db/sample-output/alembic/env.py @@ -0,0 +1,90 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from logging.config import fileConfig + +from alembic import context +from sqlalchemy import engine_from_config +from sqlalchemy import pool + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +if config.config_file_name is not None: + fileConfig(config.config_file_name) + +# add your model's MetaData object here +# for 'autogenerate' support +from google.adk.sessions.database_session_service import Base + +# target_metadata = mymodel.Base.metadata +target_metadata = Base.metadata + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline() -> None: + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, + target_metadata=target_metadata, + literal_binds=True, + dialect_opts={"paramstyle": "named"}, + ) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online() -> None: + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + connectable = engine_from_config( + config.get_section(config.config_ini_section, {}), + prefix="sqlalchemy.", + poolclass=pool.NullPool, + ) + + with connectable.connect() as connection: + context.configure(connection=connection, target_metadata=target_metadata) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/contributing/samples/migrate_session_db/sample-output/alembic/script.py.mako b/contributing/samples/migrate_session_db/sample-output/alembic/script.py.mako new file mode 100644 index 0000000000..11016301e7 --- /dev/null +++ b/contributing/samples/migrate_session_db/sample-output/alembic/script.py.mako @@ -0,0 +1,28 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision: str = ${repr(up_revision)} +down_revision: Union[str, Sequence[str], None] = ${repr(down_revision)} +branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)} +depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)} + + +def upgrade() -> None: + """Upgrade schema.""" + ${upgrades if upgrades else "pass"} + + +def downgrade() -> None: + """Downgrade schema.""" + ${downgrades if downgrades else "pass"} diff --git a/contributing/samples/migrate_session_db/sessions.db b/contributing/samples/migrate_session_db/sessions.db new file mode 100644 index 0000000000000000000000000000000000000000..57e667466f90ddcc965b3713922202c588c61c32 GIT binary patch literal 49152 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 literal 0 HcmV?d00001 diff --git a/contributing/samples/oauth2_client_credentials/README.md b/contributing/samples/oauth2_client_credentials/README.md new file mode 100644 index 0000000000..e7d2139542 --- /dev/null +++ b/contributing/samples/oauth2_client_credentials/README.md @@ -0,0 +1,143 @@ +# OAuth2 Client Credentials Weather Agent + +This sample demonstrates OAuth2 client credentials flow with ADK's `AuthenticatedFunctionTool` using a practical weather assistant agent. + +## Overview + +The OAuth2 client credentials grant type is used for server-to-server authentication where no user interaction is required. This demo shows: + +- How to configure OAuth2 client credentials in ADK +- Using `AuthenticatedFunctionTool` for automatic token management +- Transparent authentication in a practical weather assistant +- Testing the OAuth2 client credentials implementation + +## Architecture + +``` +[WeatherAssistant] -> [AuthenticatedFunctionTool] -> [OAuth2CredentialExchanger] -> [OAuth2 Server] -> [Weather API] +``` + +1. **WeatherAssistant** calls weather tool when user asks for weather data +2. **AuthenticatedFunctionTool** automatically handles OAuth2 flow +3. **OAuth2CredentialExchanger** exchanges client credentials for access token +4. **Authenticated requests** are made to weather API + +## Files + +### `agent.py` - WeatherAssistant Agent + +Weather assistant agent that demonstrates OAuth2 client credentials flow transparently: + +- **OAuth2 Configuration**: Client credentials setup with token URL and scopes +- **Weather Tool**: Single `get_weather_data` tool for fetching weather information +- **Agent Definition**: ADK LLM agent focused on providing weather information + +**Key Features:** +- Automatic token exchange using client ID and secret +- Bearer token authentication +- Transparent OAuth2 handling (invisible to the model) +- Practical use case demonstrating machine-to-machine authentication + +### `main.py` - CLI Interface + +Command-line interface for running the WeatherAssistant agent: + +```bash +# Ask for weather +python contributing/samples/oauth2_client_credentials/main.py "What's the weather in Tokyo?" +``` + +**Requirements:** +- LLM API key (Google AI or Vertex AI) +- OAuth2 test server running + +### `oauth2_test_server.py` - Local OAuth2 Server + +Mock OAuth2 server for testing the client credentials flow: + +```bash +python contributing/samples/oauth2_client_credentials/oauth2_test_server.py +``` + +**Features:** +- OIDC discovery endpoint (`/.well-known/openid_configuration`) +- Client credentials token exchange (`/token`) +- Protected weather API (`/api/weather`) +- Supports both `authorization_code` and `client_credentials` grant types +- Test credentials: `client_id="test_client"`, `client_secret="test_secret"` + +**Endpoints:** +- `GET /.well-known/openid_configuration` - OIDC discovery +- `POST /token` - Token exchange +- `GET /api/weather` - Weather API (requires Bearer token) +- `GET /` - Server info + +## Quick Start + +1. **Start the OAuth2 server:** + ```bash + python contributing/samples/oauth2_client_credentials/oauth2_test_server.py & + ``` +2. Create a `.env` file in the project root with your API credentials: + +```bash +# Choose Model Backend: 0 -> ML Dev, 1 -> Vertex +GOOGLE_GENAI_USE_VERTEXAI=1 + +# ML Dev backend config +GOOGLE_API_KEY=your_google_api_key_here + +# Vertex backend config +GOOGLE_CLOUD_PROJECT=your_project_id +GOOGLE_CLOUD_LOCATION=us-central1 +``` + +3. **Run the agent:** + ```bash + # Ask for weather + python contributing/samples/oauth2_client_credentials/main.py "What's the weather in Tokyo?" + ``` + +3. **Interactive demo (use ADK commands):** + ```bash + # Interactive CLI + adk run contributing/samples/oauth2_client_credentials + + # Interactive web UI + adk web contributing/samples + ``` + +## OAuth2 Configuration + +The agent uses these OAuth2 settings (configured in `agent.py`): + +```python +flows = OAuthFlows( + clientCredentials=OAuthFlowClientCredentials( + tokenUrl="http://localhost:8000/token", + scopes={ + "read": "Read access to weather data", + "write": "Write access for data updates", + "admin": "Administrative access", + }, + ) +) + +raw_credential = AuthCredential( + auth_type=AuthCredentialTypes.OAUTH2, + oauth2=OAuth2Auth( + client_id="test_client", + client_secret="test_secret", + ), +) +``` + +## Authentication Flow + +1. **Weather Request**: User asks WeatherAssistant for weather information +2. **Tool Invocation**: Agent calls `get_weather_data` authenticated function tool +3. **Credential Loading**: CredentialManager loads OAuth2 configuration +4. **Token Exchange**: OAuth2CredentialExchanger uses client credentials to get access token +5. **Request Enhancement**: AuthenticatedFunctionTool adds `Authorization: Bearer ` header +6. **API Call**: Weather API accessed with valid token +7. **Response**: Weather data returned to user diff --git a/contributing/samples/oauth2_client_credentials/__init__.py b/contributing/samples/oauth2_client_credentials/__init__.py new file mode 100644 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/oauth2_client_credentials/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/oauth2_client_credentials/agent.py b/contributing/samples/oauth2_client_credentials/agent.py new file mode 100644 index 0000000000..f0806784a9 --- /dev/null +++ b/contributing/samples/oauth2_client_credentials/agent.py @@ -0,0 +1,134 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Weather Assistant Agent. + +This agent provides weather information for cities worldwide. +It demonstrates OAuth2 client credentials flow transparently +through AuthenticatedFunctionTool usage. +""" + +from fastapi.openapi.models import OAuth2 +from fastapi.openapi.models import OAuthFlowClientCredentials +from fastapi.openapi.models import OAuthFlows +from google.adk.agents.llm_agent import Agent +from google.adk.auth.auth_credential import AuthCredential +from google.adk.auth.auth_credential import AuthCredentialTypes +from google.adk.auth.auth_credential import OAuth2Auth +from google.adk.auth.auth_tool import AuthConfig +from google.adk.tools.authenticated_function_tool import AuthenticatedFunctionTool +import requests + + +# OAuth2 configuration for weather API access +def create_auth_config() -> AuthConfig: + """Create OAuth2 auth configuration for weather API.""" + + # Define OAuth2 scheme with client credentials flow + flows = OAuthFlows( + clientCredentials=OAuthFlowClientCredentials( + tokenUrl="http://localhost:8080/token", + scopes={ + "read": "Read access to weather data", + "write": "Write access for data updates", + "admin": "Administrative access", + }, + ) + ) + auth_scheme = OAuth2(flows=flows) + + # Create credential with client ID and secret + raw_credential = AuthCredential( + auth_type=AuthCredentialTypes.OAUTH2, + oauth2=OAuth2Auth( + client_id="test_client", + client_secret="test_secret", + ), + ) + + return AuthConfig( + auth_scheme=auth_scheme, + raw_auth_credential=raw_credential, + credential_key="weather_api_client", + ) + + +def get_weather_data(city: str = "San Francisco", credential=None) -> str: + """Get current weather data for a specified city. + + Args: + city: City name to get weather for + credential: API credential (automatically injected by AuthenticatedFunctionTool) + + Returns: + Current weather information for the city. + """ + + try: + # Use the credential to make authenticated requests to weather API + headers = {} + if credential and credential.oauth2 and credential.oauth2.access_token: + headers["Authorization"] = f"Bearer {credential.oauth2.access_token}" + + # Call weather API endpoint + params = {"city": city, "units": "metric"} + response = requests.get( + "http://localhost:8080/api/weather", + headers=headers, + params=params, + timeout=10, + ) + + if response.status_code == 200: + data = response.json() + result = f"🌤️ Weather for {city}:\n" + result += f"Temperature: {data.get('temperature', 'N/A')}°C\n" + result += f"Condition: {data.get('condition', 'N/A')}\n" + result += f"Humidity: {data.get('humidity', 'N/A')}%\n" + result += f"Wind Speed: {data.get('wind_speed', 'N/A')} km/h\n" + result += f"Last Updated: {data.get('timestamp', 'N/A')}\n" + return result + else: + return ( + f"❌ Failed to get weather data: {response.status_code} -" + f" {response.text}" + ) + + except Exception as e: + return f"❌ Error getting weather data: {str(e)}" + + +# Create the weather assistant agent +root_agent = Agent( + name="WeatherAssistant", + description=( + "Weather assistant that provides current weather information for cities" + " worldwide." + ), + model="gemini-2.5-pro", + instruction=( + "You are a helpful Weather Assistant that provides current weather" + " information for any city worldwide.\n\nWhen users ask for weather:\n•" + " Ask for the city name if not provided\n• Provide temperature in" + " Celsius\n• Include helpful details like humidity, wind speed, and" + " conditions\n• Be friendly and conversational about the weather\n\nIf" + " there are any issues getting weather data, apologize and suggest" + " trying again or checking for a different city name." + ), + tools=[ + AuthenticatedFunctionTool( + func=get_weather_data, auth_config=create_auth_config() + ), + ], +) diff --git a/contributing/samples/oauth2_client_credentials/main.py b/contributing/samples/oauth2_client_credentials/main.py new file mode 100644 index 0000000000..ede4b1c735 --- /dev/null +++ b/contributing/samples/oauth2_client_credentials/main.py @@ -0,0 +1,152 @@ +"""WeatherAssistant Agent main script. + +This script demonstrates OAuth2 client credentials flow using a practical +weather assistant agent with AuthenticatedFunctionTool. +""" + +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import asyncio +import logging +import sys +import time + +import agent +from dotenv import load_dotenv +from google.adk.cli.utils import logs +from google.adk.runners import InMemoryRunner + +APP_NAME = "weather_assistant_app" +USER_ID = "weather_user" + +logs.setup_adk_logger(level=logging.INFO) + + +def process_arguments(): + """Parses command-line arguments.""" + parser = argparse.ArgumentParser( + description=( + "WeatherAssistant Agent - demonstrates OAuth2 client credentials" + " authentication transparently through weather queries." + ), + epilog=( + "Example usage:\n\tpython main.py" + ' "What\'s the weather in Tokyo?"\n\n' + "For interactive usage, use ADK commands:\n" + "\tadk run .\n" + "\tadk web .\n" + ), + formatter_class=argparse.RawTextHelpFormatter, + ) + + parser.add_argument( + "message", + type=str, + help=( + "Ask the weather assistant a question or request weather information." + ), + ) + + return parser.parse_args() + + +async def process_message(runner, session_id, message): + """Process a single message with the weather assistant.""" + print(f"🌤️ Weather Assistant: ") + + response = await call_agent_async(runner, USER_ID, session_id, message) + print(f"{response}\n") + + +async def call_agent_async(runner, user_id, session_id, prompt): + """Helper function to call agent asynchronously.""" + from google.adk.agents.run_config import RunConfig + from google.genai import types + + content = types.Content( + role="user", parts=[types.Part.from_text(text=prompt)] + ) + final_response_text = "" + + async for event in runner.run_async( + user_id=user_id, + session_id=session_id, + new_message=content, + run_config=RunConfig(save_input_blobs_as_artifacts=False), + ): + if event.content and event.content.parts: + if text := "".join(part.text or "" for part in event.content.parts): + if event.author != "user": + final_response_text += text + + return final_response_text + + +async def main(): + """Main function.""" + # Load environment variables from .env file + load_dotenv() + + args = process_arguments() + + print("🌤️ WeatherAssistant Agent") + print("=" * 40) + print("Ask me about weather in any city around the world!") + print("(OAuth2 client credentials authentication happens transparently)\n") + + # Create runner and session + runner = InMemoryRunner( + agent=agent.root_agent, + app_name=APP_NAME, + ) + + session = await runner.session_service.create_session( + app_name=APP_NAME, user_id=USER_ID + ) + + try: + await process_message(runner, session.id, args.message) + + except Exception as e: + print(f"❌ Error: {e}", file=sys.stderr) + return 1 + + return 0 + + +if __name__ == "__main__": + start_time = time.time() + print( + "⏰ Started at" + f" {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(start_time))}" + ) + print("-" * 50) + + try: + exit_code = asyncio.run(main()) + except KeyboardInterrupt: + print("\n⏹️ Interrupted by user") + exit_code = 1 + + end_time = time.time() + print("-" * 50) + print( + "⏰ Finished at" + f" {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(end_time))}" + ) + print(f"⌛ Total execution time: {end_time - start_time:.2f} seconds") + + sys.exit(exit_code) diff --git a/contributing/samples/oauth2_client_credentials/oauth2_test_server.py b/contributing/samples/oauth2_client_credentials/oauth2_test_server.py new file mode 100644 index 0000000000..ee569830a6 --- /dev/null +++ b/contributing/samples/oauth2_client_credentials/oauth2_test_server.py @@ -0,0 +1,350 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +""" +Weather API OAuth2 Test Server + +A simple FastAPI server that implements OAuth2 flows for weather API testing: +- Client Credentials Flow +- Authorization Code Flow + +Usage: + python oauth2_test_server.py + +Endpoints: + GET /auth - Authorization endpoint (auth code flow) + POST /token - Token endpoint (both flows) + GET /.well-known/openid_configuration - OpenID Connect discovery + GET /api/weather - Weather API (requires Bearer token) +""" + +import secrets +import time +from typing import Dict +from typing import Optional + +from fastapi import FastAPI +from fastapi import Form +from fastapi import HTTPException +from fastapi import Query +from fastapi import Request +from fastapi import status +from fastapi.responses import HTMLResponse +from fastapi.responses import RedirectResponse +from pydantic import BaseModel + +app = FastAPI(title="Weather API OAuth2 Server", version="1.0.0") + +# In-memory storage (for testing only) +clients = { + "test_client": { + "client_secret": "test_secret", + "redirect_uris": [ + "http://localhost:8080/callback", + "urn:ietf:wg:oauth:2.0:oob", + ], + "scopes": ["read", "write", "admin"], + } +} + +authorization_codes = {} # code -> {client_id, redirect_uri, scope, expires_at} +access_tokens = {} # token -> {client_id, scope, expires_at, token_type} + + +class TokenResponse(BaseModel): + access_token: str + token_type: str = "Bearer" + expires_in: int = 3600 + refresh_token: Optional[str] = None + scope: Optional[str] = None + + +@app.get("/.well-known/openid_configuration") +async def openid_configuration(): + """OpenID Connect Discovery endpoint.""" + return { + "issuer": "http://localhost:8080", + "authorization_endpoint": "http://localhost:8080/auth", + "token_endpoint": "http://localhost:8080/token", + "userinfo_endpoint": "http://localhost:8080/userinfo", + "revocation_endpoint": "http://localhost:8080/revoke", + "scopes_supported": ["openid", "read", "write", "admin"], + "response_types_supported": ["code"], + "grant_types_supported": ["authorization_code", "client_credentials"], + "token_endpoint_auth_methods_supported": [ + "client_secret_basic", + "client_secret_post", + ], + "subject_types_supported": ["public"], + } + + +@app.get("/auth") +async def authorize( + response_type: str = Query(...), + client_id: str = Query(...), + redirect_uri: str = Query(...), + scope: str = Query(default="read"), + state: str = Query(default=""), +): + """Authorization endpoint for OAuth2 authorization code flow.""" + + # Validate client + if client_id not in clients: + raise HTTPException(status_code=400, detail="Invalid client_id") + + client = clients[client_id] + if redirect_uri not in client["redirect_uris"]: + raise HTTPException(status_code=400, detail="Invalid redirect_uri") + + if response_type != "code": + raise HTTPException(status_code=400, detail="Unsupported response_type") + + # Generate authorization code + auth_code = secrets.token_urlsafe(32) + authorization_codes[auth_code] = { + "client_id": client_id, + "redirect_uri": redirect_uri, + "scope": scope, + "expires_at": time.time() + 600, # 10 minutes + } + + # Simulate user consent - in real implementation, this would show a consent form + params = f"code={auth_code}" + if state: + params += f"&state={state}" + + return RedirectResponse(url=f"{redirect_uri}?{params}") + + +@app.post("/token") +async def token_endpoint( + request: Request, + grant_type: str = Form(...), + client_id: str = Form(default=None), + client_secret: str = Form(default=None), + code: str = Form(default=None), + redirect_uri: str = Form(default=None), + scope: str = Form(default="read"), +): + """Token endpoint for both client credentials and authorization code flows.""" + + # Support both HTTP Basic auth and form-based client authentication + auth_header = request.headers.get("Authorization") + + if auth_header and auth_header.startswith("Basic "): + # HTTP Basic authentication + import base64 + + try: + encoded_credentials = auth_header[6:] # Remove "Basic " prefix + decoded = base64.b64decode(encoded_credentials).decode("utf-8") + basic_client_id, basic_client_secret = decoded.split(":", 1) + client_id = client_id or basic_client_id + client_secret = client_secret or basic_client_secret + except Exception: + raise HTTPException( + status_code=401, detail="Invalid authorization header" + ) + + if not client_id or not client_secret: + raise HTTPException(status_code=400, detail="Client credentials required") + + # Validate client credentials + if client_id not in clients: + raise HTTPException(status_code=401, detail="Invalid client") + + client = clients[client_id] + if client["client_secret"] != client_secret: + raise HTTPException(status_code=401, detail="Invalid client credentials") + + if grant_type == "client_credentials": + return await handle_client_credentials(client_id, scope) + elif grant_type == "authorization_code": + return await handle_authorization_code(client_id, code, redirect_uri, scope) + else: + raise HTTPException(status_code=400, detail="Unsupported grant_type") + + +async def handle_client_credentials( + client_id: str, scope: str +) -> TokenResponse: + """Handle client credentials flow.""" + + # Generate access token + access_token = secrets.token_urlsafe(32) + expires_at = time.time() + 3600 # 1 hour + + # Store token + access_tokens[access_token] = { + "client_id": client_id, + "scope": scope, + "expires_at": expires_at, + "token_type": "Bearer", + } + + return TokenResponse( + access_token=access_token, + token_type="Bearer", + expires_in=3600, + scope=scope, + ) + + +async def handle_authorization_code( + client_id: str, code: str, redirect_uri: str, scope: str +) -> TokenResponse: + """Handle authorization code flow.""" + + if not code: + raise HTTPException(status_code=400, detail="Missing authorization code") + + if code not in authorization_codes: + raise HTTPException(status_code=400, detail="Invalid authorization code") + + auth_data = authorization_codes[code] + + # Validate authorization code + if time.time() > auth_data["expires_at"]: + del authorization_codes[code] + raise HTTPException(status_code=400, detail="Authorization code expired") + + if auth_data["client_id"] != client_id: + raise HTTPException(status_code=400, detail="Client mismatch") + + if redirect_uri and auth_data["redirect_uri"] != redirect_uri: + raise HTTPException(status_code=400, detail="Redirect URI mismatch") + + # Generate tokens + access_token = secrets.token_urlsafe(32) + refresh_token = secrets.token_urlsafe(32) + expires_at = time.time() + 3600 # 1 hour + + # Store token + access_tokens[access_token] = { + "client_id": client_id, + "scope": auth_data["scope"], + "expires_at": expires_at, + "token_type": "Bearer", + } + + # Clean up authorization code (one-time use) + del authorization_codes[code] + + return TokenResponse( + access_token=access_token, + token_type="Bearer", + expires_in=3600, + refresh_token=refresh_token, + scope=auth_data["scope"], + ) + + +@app.get("/api/weather") +async def get_weather( + request: Request, city: str = "San Francisco", units: str = "metric" +): + """Weather API endpoint that returns weather data for a city.""" + + # Check authentication + auth_header = request.headers.get("Authorization") + if not auth_header or not auth_header.startswith("Bearer "): + raise HTTPException( + status_code=401, detail="Missing or invalid authorization header" + ) + + token = auth_header[7:] # Remove "Bearer " prefix + + if token not in access_tokens: + raise HTTPException(status_code=401, detail="Invalid access token") + + token_data = access_tokens[token] + + if time.time() > token_data["expires_at"]: + del access_tokens[token] + raise HTTPException(status_code=401, detail="Access token expired") + + # Return weather data (simulated) + from datetime import datetime + import random + + conditions = ["Sunny", "Partly Cloudy", "Cloudy", "Light Rain", "Clear"] + + weather_data = { + "city": city, + "temperature": random.randint(15, 30), + "condition": random.choice(conditions), + "humidity": random.randint(40, 80), + "wind_speed": random.randint(5, 25), + "timestamp": datetime.now().isoformat(), + "units": units, + "api_client": token_data["client_id"], + } + + return weather_data + + +@app.get("/") +async def root(): + """Root endpoint with server information.""" + return HTMLResponse(""" + + Weather API OAuth2 Server + +

Weather API OAuth2 Server

+

Available Endpoints:

+
    +
  • GET /auth - Authorization endpoint
  • +
  • POST /token - Token endpoint
  • +
  • GET /.well-known/openid_configuration - Discovery
  • +
  • GET /api/weather - Weather API (requires Bearer token)
  • +
+ +

Test Client Credentials:

+
    +
  • Client ID: test_client
  • +
  • Client Secret: test_secret
  • +
  • Scopes: read, write, admin
  • +
+ +

Example cURL Commands:

+

Client Credentials Flow:

+
+curl -X POST http://localhost:8080/token \\
+  -d "grant_type=client_credentials" \\
+  -d "client_id=test_client" \\
+  -d "client_secret=test_secret" \\
+  -d "scope=read write"
+            
+ +

Test Weather API:

+
+curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \\
+  "http://localhost:8080/api/weather?city=Tokyo"
+            
+ + + """) + + +if __name__ == "__main__": + import uvicorn + + print("🌤️ Starting Weather API OAuth2 Server...") + print("📖 Documentation: http://localhost:8080/docs") + print("🏠 Server Info: http://localhost:8080") + print( + '🔧 Test with: curl -H "Authorization: Bearer TOKEN"' + ' "http://localhost:8080/api/weather?city=Tokyo"' + ) + uvicorn.run(app, host="0.0.0.0", port=8080, log_level="info") diff --git a/contributing/samples/oauth_calendar_agent/README.md b/contributing/samples/oauth_calendar_agent/README.md index aaefd6d08b..381bb7902b 100644 --- a/contributing/samples/oauth_calendar_agent/README.md +++ b/contributing/samples/oauth_calendar_agent/README.md @@ -4,37 +4,45 @@ This sample tests and demos the OAuth support in ADK via two tools: -* 1. list_calendar_events +* 1. list_calendar_events - This is a customized tool that calls Google Calendar API to list calendar events. - It pass in the client id and client secrete to ADK and then get back the access token from ADK. - And then it uses the access token to call calendar api. + This is a customized tool that calls Google Calendar API to list calendar + events. It pass in the client id and client secrete to ADK and then get back + the access token from ADK. And then it uses the access token to call + calendar api. -* 2. get_calendar_events +* 2. get_calendar_events - This is an google calendar tool that calls Google Calendar API to get the details of a specific calendar. - This tool is from the ADK built-in Google Calendar ToolSet. - Everything is wrapped and the tool user just needs to pass in the client id and client secret. + This is a google calendar tool that calls Google Calendar API to get the + details of a specific calendar. This tool is from the ADK built-in Google + Calendar ToolSet. Everything is wrapped and the tool user just needs to pass + in the client id and client secret. ## How to use -* 1. Follow https://developers.google.com/identity/protocols/oauth2#1.-obtain-oauth-2.0-credentials-from-the-dynamic_data.setvar.console_name. to get your client id and client secret. - Be sure to choose "web" as your client type. +* 1. Follow + https://developers.google.com/identity/protocols/oauth2#1.-obtain-oauth-2.0-credentials-from-the-dynamic_data.setvar.console_name. + to get your client id and client secret. Be sure to choose "web" as your + client type. -* 2. Configure your `.env` file to add two variables: +* 2. Configure your `.env` file to add two variables: - * OAUTH_CLIENT_ID={your client id} - * OAUTH_CLIENT_SECRET={your client secret} + * OAUTH_CLIENT_ID={your client id} + * OAUTH_CLIENT_SECRET={your client secret} - Note: don't create a separate `.env` file , instead put it to the same `.env` file that stores your Vertex AI or Dev ML credentials + Note: don't create a separate `.env` file , instead put it to the same + `.env` file that stores your Vertex AI or Dev ML credentials -* 3. Follow https://developers.google.com/identity/protocols/oauth2/web-server#creatingcred to add http://localhost/dev-ui/ to "Authorized redirect URIs". +* 3. Follow + https://developers.google.com/identity/protocols/oauth2/web-server#creatingcred + to add http://localhost/dev-ui/ to "Authorized redirect URIs". - Note: localhost here is just a hostname that you use to access the dev ui, replace it with the actual hostname you use to access the dev ui. + Note: localhost here is just a hostname that you use to access the dev ui, + replace it with the actual hostname you use to access the dev ui. -* 4. For 1st run, allow popup for localhost in Chrome. +* 4. For 1st run, allow popup for localhost in Chrome. ## Sample prompt -* `List all my today's meeting from 7am to 7pm.` -* `Get the details of the first event.` +* `List all my today's meeting from 7am to 7pm.` +* `Get the details of the first event.` diff --git a/contributing/samples/oauth_calendar_agent/agent.py b/contributing/samples/oauth_calendar_agent/agent.py index 0be3b6e593..a33ea2b942 100644 --- a/contributing/samples/oauth_calendar_agent/agent.py +++ b/contributing/samples/oauth_calendar_agent/agent.py @@ -131,7 +131,7 @@ def update_time(callback_context: CallbackContext): name="calendar_agent", instruction=""" You are a helpful personal calendar assistant. - Use the provided tools to search for calendar events (use 10 as limit if user does't specify), and update them. + Use the provided tools to search for calendar events (use 10 as limit if user doesn't specify), and update them. Use "primary" as the calendarId if users don't specify. Scenario1: @@ -159,7 +159,7 @@ def update_time(callback_context: CallbackContext): {userInfo?} - Currnet time: {_time} + Current time: {_time} """, tools=[ AuthenticatedFunctionTool( diff --git a/contributing/samples/output_schema_with_tools/README.md b/contributing/samples/output_schema_with_tools/README.md index a275d89179..177d735f01 100644 --- a/contributing/samples/output_schema_with_tools/README.md +++ b/contributing/samples/output_schema_with_tools/README.md @@ -1,22 +1,32 @@ # Output Schema with Tools Sample Agent -This sample demonstrates how to use structured output (`output_schema`) alongside other tools in an ADK agent. Previously, this combination was not allowed, but now it's supported through a special processor that handles the interaction. +This sample demonstrates how to use structured output (`output_schema`) +alongside other tools in an ADK agent. Previously, this combination was not +allowed, but now it's supported through a special processor that handles the +interaction. ## How it Works The agent combines: -- **Tools**: `search_wikipedia` and `get_current_year` for gathering information -- **Structured Output**: `PersonInfo` schema to ensure consistent response format + +- **Tools**: `search_wikipedia` and `get_current_year` for gathering + information +- **Structured Output**: `PersonInfo` schema to ensure consistent response + format When both `output_schema` and `tools` are specified: -1. ADK automatically adds a special `set_model_response` tool -2. The model can use the regular tools for information gathering -3. For the final response, the model uses `set_model_response` with structured data -4. ADK extracts and validates the structured response + +1. ADK automatically adds a special `set_model_response` tool +2. The model can use the regular tools for information gathering +3. For the final response, the model uses `set_model_response` with structured + data +4. ADK extracts and validates the structured response ## Expected Response Format -The agent will return information in this structured format for user query "Tell me about Albert Einstein": +The agent will return information in this structured format for user query + +> Tell me about Albert Einstein. ```json { @@ -30,7 +40,7 @@ The agent will return information in this structured format for user query "Tell ## Key Features Demonstrated -1. **Tool Usage**: Agent can search Wikipedia and get current year -2. **Structured Output**: Response follows strict PersonInfo schema -3. **Validation**: ADK validates the response matches the schema -4. **Flexibility**: Works with any combination of tools and output schemas +1. **Tool Usage**: Agent can search Wikipedia and get current year +2. **Structured Output**: Response follows strict PersonInfo schema +3. **Validation**: ADK validates the response matches the schema +4. **Flexibility**: Works with any combination of tools and output schemas diff --git a/contributing/samples/output_schema_with_tools/agent.py b/contributing/samples/output_schema_with_tools/agent.py index bf33bbc9d4..b523d2d7ae 100644 --- a/contributing/samples/output_schema_with_tools/agent.py +++ b/contributing/samples/output_schema_with_tools/agent.py @@ -20,6 +20,7 @@ """ from google.adk.agents import LlmAgent +from google.adk.tools.google_search_tool import google_search from pydantic import BaseModel from pydantic import Field import requests @@ -79,6 +80,22 @@ def get_current_year() -> str: return str(datetime.now().year) +# Create the knowledge agent that uses google_search tool. +knowledge_agent = LlmAgent( + name="knowledge_agent", + model="gemini-2.5-flash", + instruction=""" +You are a helpful assistant that gathers information about famous people. +Use google_search tool to find information about them. +Provide the output into a structured response using the PersonInfo format. +""", + description=""" +A knowledge agent that gathers information about famous people. +""", + tools=[google_search], + output_schema=PersonInfo, +) + # Create the agent with both output_schema and tools root_agent = LlmAgent( name="person_info_agent", @@ -87,15 +104,15 @@ def get_current_year() -> str: You are a helpful assistant that gathers information about famous people. When asked about a person, you should: -1. Use the search_wikipedia tool to find information about them -2. Use the get_current_year tool if you need to calculate ages -3. Compile the information into a structured response using the PersonInfo format - -Always use the set_model_response tool to provide your final answer in the required structured format. +1. Use the knowledge_agent to find information about politicians +2. Use the search_wikipedia tool to find information about other people +3. Use the get_current_year tool if you need to calculate ages +4. Compile the information into a structured response using the PersonInfo format """.strip(), output_schema=PersonInfo, tools=[ search_wikipedia, get_current_year, ], + sub_agents=[knowledge_agent], ) diff --git a/contributing/samples/plugin_reflect_tool_retry/README.md b/contributing/samples/plugin_reflect_tool_retry/README.md new file mode 100644 index 0000000000..773623162c --- /dev/null +++ b/contributing/samples/plugin_reflect_tool_retry/README.md @@ -0,0 +1,75 @@ +# Reflect And Retry Tool Plugin + +`ReflectAndRetryToolPlugin` provides self-healing, concurrent-safe error +recovery for tool failures. + +**Key Features:** + +- **Concurrency Safe:** Uses locking to safely handle parallel tool +executions +- **Configurable Scope:** Tracks failures per-invocation (default) or globally + using the `TrackingScope` enum. +- **Extensible Scoping:** The `_get_scope_key` method can be overridden to + implement custom tracking logic (e.g., per-user or per-session). +- **Granular Tracking:** Failure counts are tracked per-tool within the + defined scope. A success with one tool resets its counter without affecting + others. +- **Custom Error Extraction:** Supports detecting errors in normal tool +responses that don't throw exceptions, by overriding the +`extract_error_from_result` method. + +## Samples + +Here are some sample agents to demonstrate the usage of the plugin. + +### Basic Usage + +This is a hello world example to show the basic usage of the plugin. The +`guess_number_tool` is hacked with both Exceptions and error responses. With the +help of the `CustomRetryPlugin`, both above error types can lead to retries. + +For example, here is the output from agent: + +``` +I'll guess the number 50. Let's see how it is! +My guess of 50 was too high! I'll try a smaller number this time. Let's go with 25. +My guess of 25 was still too high! I'm going smaller. How about 10? +Still too high! My guess of 10 was also too large. I'll try 5 this time. +My guess of 5 is "almost valid"! That's good news, it means I'm getting very close. I'll try 4. +My guess of 4 is still "almost valid," just like 5. It seems I'm still hovering around the right answer. Let's try 3! +I guessed the number 3, and it is valid! I found it! +``` + +You can run the agent with: + +```bash +$ adk web contributing/samples/plugin_reflect_tool_retry +``` + +Select "basic" and provide the following prompt to see the agent retrying tool +calls: + +``` +Please guess a number! Tell me what number you guess and how is it. +``` + +### Hallucinating tool calls + +The "hallucinating_func_name" agent is an example to show the plugin can retry +hallucinating tool calls. + +For example, we used the `after_model_callback` to hack a tool call with the +wrong name then the agent can retry calling with the right tool name. + +You can run the agent with: + +```bash +$ adk web contributing/samples/plugin_reflect_tool_retry +``` + +Select "hallucinating_func_name" and provide the following prompt to see the +agent retrying tool calls: + +``` +Roll a 6 sided die +``` diff --git a/contributing/samples/plugin_reflect_tool_retry/basic/__init__.py b/contributing/samples/plugin_reflect_tool_retry/basic/__init__.py new file mode 100644 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/plugin_reflect_tool_retry/basic/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/plugin_reflect_tool_retry/basic/agent.py b/contributing/samples/plugin_reflect_tool_retry/basic/agent.py new file mode 100644 index 0000000000..a0b6fec7ce --- /dev/null +++ b/contributing/samples/plugin_reflect_tool_retry/basic/agent.py @@ -0,0 +1,77 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Any + +from google.adk.agents import LlmAgent +from google.adk.apps.app import App +from google.adk.plugins import LoggingPlugin +from google.adk.plugins import ReflectAndRetryToolPlugin + +APP_NAME = "basic" +USER_ID = "test_user" + + +def guess_number_tool(query: int) -> dict[str, Any]: + """A tool that guesses a number. + + Args: + query: The number to guess. + + Returns: + A dictionary containing the status and result of the tool execution. + """ + target_number = 3 + if query == target_number: + return {"status": "success", "result": "Number is valid."} + + if abs(query - target_number) <= 2: + return {"status": "error", "error_message": "Number is almost valid."} + + if query > target_number: + raise ValueError("Number is too large.") + + if query < target_number: + raise ValueError("Number is too small.") + + raise ValueError("Number is invalid.") + + +class CustomRetryPlugin(ReflectAndRetryToolPlugin): + + async def extract_error_from_result( + self, *, tool, tool_args, tool_context, result + ): + return result if result.get("status") == "error" else None + + +root_agent = LlmAgent( + name="hello_world", + description="Helpful agent", + instruction="""Use guess_number_tool to guess a number.""", + model="gemini-2.5-flash", + tools=[guess_number_tool], +) + + +app = App( + name=APP_NAME, + root_agent=root_agent, + plugins=[ + CustomRetryPlugin( + max_retries=6, throw_exception_if_retry_exceeded=False + ), + LoggingPlugin(), + ], +) diff --git a/contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/__init__.py b/contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/__init__.py new file mode 100644 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/agent.py b/contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/agent.py new file mode 100644 index 0000000000..8a958b656a --- /dev/null +++ b/contributing/samples/plugin_reflect_tool_retry/hallucinating_func_name/agent.py @@ -0,0 +1,83 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import random + +from google.adk.agents import LlmAgent +from google.adk.agents.callback_context import CallbackContext +from google.adk.apps.app import App +from google.adk.models.llm_response import LlmResponse +from google.adk.plugins import ReflectAndRetryToolPlugin +from google.adk.tools.tool_context import ToolContext + +APP_NAME = "hallucinating_func_name" +USER_ID = "test_user" + +hallucinated = False # Whether the tool name is hallucinated + + +def roll_die(sides: int, tool_context: ToolContext) -> int: + """Roll a die and return the rolled result. + + Args: + sides: The integer number of sides the die has. + + Returns: + An integer of the result of rolling the die. + """ + result = random.randint(1, sides) + if not "rolls" in tool_context.state: + tool_context.state["rolls"] = [] + + tool_context.state["rolls"] = tool_context.state["rolls"] + [result] + return result + + +def after_model_callback( + callback_context: CallbackContext, llm_response: LlmResponse +): + """After model callback to produce one hallucinating tool call.""" + global hallucinated + + if hallucinated: + return None + + if ( + llm_response.content + and llm_response.content.parts + and llm_response.content.parts[0].function_call + and llm_response.content.parts[0].function_call.name == "roll_die" + ): + llm_response.content.parts[0].function_call.name = "roll_die_wrong_name" + hallucinated = True + return None + + +root_agent = LlmAgent( + name="hello_world", + description="Helpful agent", + instruction="""Use guess_number_tool to guess a number.""", + model="gemini-2.5-flash", + tools=[roll_die], + after_model_callback=after_model_callback, +) + + +app = App( + name=APP_NAME, + root_agent=root_agent, + plugins=[ + ReflectAndRetryToolPlugin(max_retries=3), + ], +) diff --git a/contributing/samples/pydantic_argument/README.md b/contributing/samples/pydantic_argument/README.md new file mode 100644 index 0000000000..b3db3b2a24 --- /dev/null +++ b/contributing/samples/pydantic_argument/README.md @@ -0,0 +1,126 @@ +# Pydantic Argument Sample Agent + +This sample demonstrates the automatic Pydantic model conversion feature in ADK FunctionTool. + +## What This Demonstrates + +This sample shows two key features of the Pydantic argument conversion: + +### 1. Optional Type Handling + +The `create_full_user_account` function demonstrates `Optional[PydanticModel]` conversion: + +Before the fix, Optional parameters required manual conversion: + +```python +def create_full_user_account( + profile: UserProfile, + preferences: Optional[UserPreferences] = None +) -> dict: + # Manual conversion needed: + if not isinstance(profile, UserProfile): + profile = UserProfile.model_validate(profile) + + if preferences is not None and not isinstance(preferences, UserPreferences): + preferences = UserPreferences.model_validate(preferences) + + # Your function logic here... +``` + +**After the fix**, Union/Optional Pydantic models are handled automatically: + +```python +def create_full_user_account( + profile: UserProfile, + preferences: Optional[UserPreferences] = None +) -> dict: + # Both profile and preferences are guaranteed to be proper instances! + # profile: UserProfile instance (converted from JSON) + # preferences: UserPreferences instance OR None (converted from JSON or kept as None) + return {"profile": profile.name, "theme": preferences.theme if preferences else "default"} +``` + +### 2. Union Type Handling + +The `create_entity_profile` function demonstrates `Union[PydanticModel1, PydanticModel2]` conversion: + +**Before the fix**, Union types required complex manual type checking: + +```python +def create_entity_profile(entity: Union[UserProfile, CompanyProfile]) -> dict: + # Manual conversion needed: + if isinstance(entity, dict): + # Try to determine which model to use and convert manually + if 'company_name' in entity: + entity = CompanyProfile.model_validate(entity) + elif 'name' in entity: + entity = UserProfile.model_validate(entity) + else: + raise ValueError("Cannot determine entity type") + # Your function logic here... +``` + +**After the fix**, Union Pydantic models are handled automatically: + +```python +def create_entity_profile(entity: Union[UserProfile, CompanyProfile]) -> dict: + # entity is guaranteed to be either UserProfile or CompanyProfile instance! + # The LLM sends appropriate JSON structure, and it gets converted + # to the correct Pydantic model based on JSON schema matching + if isinstance(entity, UserProfile): + return {"type": "user", "name": entity.name} + else: # CompanyProfile + return {"type": "company", "name": entity.company_name} +``` + +## How to Run + +1. **Set up API credentials** (choose one): + + **Option A: Google AI API** + ```bash + export GOOGLE_GENAI_API_KEY="your-api-key" + ``` + + **Option B: Vertex AI (requires Google Cloud project)** + ```bash + export GOOGLE_CLOUD_PROJECT="your-project-id" + export GOOGLE_CLOUD_LOCATION="us-central1" + ``` + +2. **Run the sample**: + ```bash + cd contributing/samples + python -m pydantic_argument.main + ``` + +## Expected Output + +The agent will be prompted to create user profiles and accounts, demonstrating automatic Pydantic model conversion. + +### Test Scenarios: + +1. **Full Account with Preferences (Optional Type)**: + - **Input**: "Create an account for Alice, 25 years old, with dark theme and Spanish language preferences" + - **Tool Called**: `create_full_user_account(profile=UserProfile(...), preferences=UserPreferences(...))` + - **Conversion**: Two JSON dicts → `UserProfile` + `UserPreferences` instances + +2. **Account with Different Preferences (Optional Type)**: + - **Input**: "Create a user account for Bob, age 30, with light theme, French language, and notifications disabled" + - **Tool Called**: `create_full_user_account(profile=UserProfile(...), preferences=UserPreferences(...))` + - **Conversion**: Two JSON dicts → `UserProfile` + `UserPreferences` instances + +3. **Account with Default Preferences (Optional Type)**: + - **Input**: "Make an account for Charlie, 28 years old, but use default preferences" + - **Tool Called**: `create_full_user_account(profile=UserProfile(...), preferences=None)` + - **Conversion**: JSON dict → `UserProfile`, None → None (Optional handling) + +4. **Company Profile Creation (Union Type)**: + - **Input**: "Create a profile for Tech Corp company, software industry, with 150 employees" + - **Tool Called**: `create_entity_profile(entity=CompanyProfile(...))` + - **Conversion**: JSON dict → `CompanyProfile` instance (Union type resolution) + +5. **User Profile Creation (Union Type)**: + - **Input**: "Create an entity profile for Diana, 32 years old" + - **Tool Called**: `create_entity_profile(entity=UserProfile(...))` + - **Conversion**: JSON dict → `UserProfile` instance (Union type resolution) diff --git a/contributing/samples/pydantic_argument/__init__.py b/contributing/samples/pydantic_argument/__init__.py new file mode 100644 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/pydantic_argument/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/pydantic_argument/agent.py b/contributing/samples/pydantic_argument/agent.py new file mode 100644 index 0000000000..9d29e54fa4 --- /dev/null +++ b/contributing/samples/pydantic_argument/agent.py @@ -0,0 +1,182 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Simple agent demonstrating Pydantic model arguments in tools.""" + +from typing import Optional +from typing import Union + +from google.adk.agents.llm_agent import Agent +from google.adk.tools.function_tool import FunctionTool +import pydantic + + +class UserProfile(pydantic.BaseModel): + """A user's profile information.""" + + name: str + age: int + email: Optional[str] = None + + +class UserPreferences(pydantic.BaseModel): + """A user's preferences.""" + + theme: str = "light" + language: str = "English" + notifications_enabled: bool = True + + +class CompanyProfile(pydantic.BaseModel): + """A company's profile information.""" + + company_name: str + industry: str + employee_count: int + website: Optional[str] = None + + +def create_full_user_account( + profile: UserProfile, preferences: Optional[UserPreferences] = None +) -> dict: + """Create a complete user account with profile and optional preferences. + + This function demonstrates Union/Optional Pydantic model handling. + The preferences parameter is Optional[UserPreferences], which is + internally Union[UserPreferences, None]. + + Before the fix, we would need: + if preferences is not None and not isinstance(preferences, UserPreferences): + preferences = UserPreferences.model_validate(preferences) + + Now the FunctionTool automatically handles this conversion! + + Args: + profile: The user's profile information (required) + preferences: Optional user preferences (Union[UserPreferences, None]) + + Returns: + A dictionary containing the complete user account. + """ + # Use default preferences if not provided + if preferences is None: + preferences = UserPreferences() + + # Both profile and preferences are guaranteed to be proper Pydantic instances! + return { + "status": "account_created", + "message": f"Full account created for {profile.name}!", + "profile": { + "name": profile.name, + "age": profile.age, + "email": profile.email or "Not provided", + "profile_type": type(profile).__name__, + }, + "preferences": { + "theme": preferences.theme, + "language": preferences.language, + "notifications_enabled": preferences.notifications_enabled, + "preferences_type": type(preferences).__name__, + }, + "conversion_demo": { + "profile_converted": "JSON dict → UserProfile instance", + "preferences_converted": ( + "JSON dict → UserPreferences instance" + if preferences + else "None → default UserPreferences" + ), + }, + } + + +def create_entity_profile(entity: Union[UserProfile, CompanyProfile]) -> dict: + """Create a profile for either a user or a company. + + This function demonstrates Union type handling with multiple Pydantic models. + The entity parameter accepts Union[UserProfile, CompanyProfile]. + + Before the fix, we would need complex type checking: + if isinstance(entity, dict): + # Try to determine which model to use and convert manually + if 'company_name' in entity: + entity = CompanyProfile.model_validate(entity) + elif 'name' in entity: + entity = UserProfile.model_validate(entity) + else: + raise ValueError("Cannot determine entity type") + + Now the FunctionTool automatically handles Union type conversion! + The LLM will send the appropriate JSON structure, and it gets converted + to the correct Pydantic model based on the JSON schema matching. + + Args: + entity: Either a UserProfile or CompanyProfile (Union type) + + Returns: + A dictionary containing the entity profile information. + """ + if isinstance(entity, UserProfile): + return { + "status": "user_profile_created", + "entity_type": "user", + "message": f"User profile created for {entity.name}!", + "profile": { + "name": entity.name, + "age": entity.age, + "email": entity.email or "Not provided", + "model_type": type(entity).__name__, + }, + } + elif isinstance(entity, CompanyProfile): + return { + "status": "company_profile_created", + "entity_type": "company", + "message": f"Company profile created for {entity.company_name}!", + "profile": { + "company_name": entity.company_name, + "industry": entity.industry, + "employee_count": entity.employee_count, + "website": entity.website or "Not provided", + "model_type": type(entity).__name__, + }, + } + else: + return { + "status": "error", + "message": f"Unexpected entity type: {type(entity)}", + } + + +# Create the agent with all Pydantic tools +root_agent = Agent( + model="gemini-2.5-pro", + name="profile_agent", + description=( + "Helpful assistant that helps creating accounts and profiles for users" + " and companies" + ), + instruction=""" +You are a helpful assistant that can create accounts and profiles for users and companies. + +When someone asks you to create a user account, use `create_full_user_account`. +When someone asks you to create a profile and it's unclear whether they mean a user or company, use `create_entity_profile`. +When someone specifically mentions a company, use `create_entity_profile`. + +Use the tools with the structured data provided by the user. +""", + tools=[ + FunctionTool(create_full_user_account), + FunctionTool(create_entity_profile), + ], +) diff --git a/contributing/samples/pydantic_argument/main.py b/contributing/samples/pydantic_argument/main.py new file mode 100644 index 0000000000..16af323afd --- /dev/null +++ b/contributing/samples/pydantic_argument/main.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +"""Simple test script for Pydantic argument agent.""" + +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import logging + +from google.adk.agents.run_config import RunConfig +from google.adk.cli.utils import logs +from google.adk.runners import InMemoryRunner +from google.genai import types +from pydantic_argument import agent + +APP_NAME = "pydantic_test_app" +USER_ID = "test_user" + +logs.setup_adk_logger(level=logging.INFO) + + +async def call_agent_async(runner, user_id, session_id, prompt): + """Helper function to call the agent and return response.""" + content = types.Content( + role="user", parts=[types.Part.from_text(text=prompt)] + ) + + final_response_text = "" + async for event in runner.run_async( + user_id=user_id, + session_id=session_id, + new_message=content, + run_config=RunConfig(save_input_blobs_as_artifacts=False), + ): + if hasattr(event, "content") and event.content: + final_response_text += event.content + + return final_response_text + + +async def main(): + print("🚀 Testing Pydantic Argument Feature") + print("=" * 50) + + runner = InMemoryRunner( + agent=agent.root_agent, + app_name=APP_NAME, + ) + + # Create a session + session = await runner.session_service.create_session( + app_name=APP_NAME, user_id=USER_ID + ) + + test_prompts = [ + # Test Optional[Pydantic] type handling (UserProfile + Optional[UserPreferences]) + ( + "Create an account for Alice, 25 years old, email: alice@example.com," + " with dark theme and Spanish language preferences" + ), + ( + "Create a user account for Bob, age 30, no email, " + "with light theme, French language, and notifications disabled" + ), + ( + "Make an account for Charlie, 28 years old, email: charlie@test.com, " + "but use default preferences" + ), + # Test Union type handling (Union[UserProfile, CompanyProfile]) + ( + "Create a profile for Tech Corp company, software industry, " + "with 150 employees and website techcorp.com" + ), + ( + "Create an entity profile for Diana, 32 years old, " + "email diana@example.com" + ), + ] + + for i, prompt in enumerate(test_prompts, 1): + print(f"\n📝 Test {i}: {prompt}") + print("-" * 40) + + try: + response = await call_agent_async(runner, USER_ID, session.id, prompt) + print(f"✅ Response: {response}") + except Exception as e: + print(f"❌ Error: {e}") + + print("\n" + "=" * 50) + print("✨ Testing complete!") + print("🔧 Features demonstrated:") + print(" • JSON dict → Pydantic model conversion (UserProfile)") + print(" • Optional type handling (Optional[UserPreferences])") + print(" • Union type handling (Union[UserProfile, CompanyProfile])") + print(" • Automatic model validation and conversion") + print(" • No manual isinstance() checks needed!") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/contributing/samples/rewind_session/__init__.py b/contributing/samples/rewind_session/__init__.py new file mode 100644 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/rewind_session/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/rewind_session/agent.py b/contributing/samples/rewind_session/agent.py new file mode 100644 index 0000000000..569bde0737 --- /dev/null +++ b/contributing/samples/rewind_session/agent.py @@ -0,0 +1,71 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from google.adk import Agent +from google.adk.tools.tool_context import ToolContext +from google.genai import types + + +async def update_state(tool_context: ToolContext, key: str, value: str) -> dict: + """Updates a state value.""" + tool_context.state[key] = value + return {"status": f"Updated state '{key}' to '{value}'"} + + +async def load_state(tool_context: ToolContext, key: str) -> dict: + """Loads a state value.""" + return {key: tool_context.state.get(key)} + + +async def save_artifact( + tool_context: ToolContext, filename: str, content: str +) -> dict: + """Saves an artifact with the given filename and content.""" + artifact_bytes = content.encode("utf-8") + artifact_part = types.Part( + inline_data=types.Blob(mime_type="text/plain", data=artifact_bytes) + ) + version = await tool_context.save_artifact(filename, artifact_part) + return {"status": "success", "filename": filename, "version": version} + + +async def load_artifact(tool_context: ToolContext, filename: str) -> dict: + """Loads an artifact with the given filename.""" + artifact = await tool_context.load_artifact(filename) + if not artifact: + return {"error": f"Artifact '{filename}' not found"} + content = artifact.inline_data.data.decode("utf-8") + return {"filename": filename, "content": content} + + +# Create the agent +root_agent = Agent( + name="state_agent", + model="gemini-2.0-flash", + instruction="""You are an agent that manages state and artifacts. + + You can: + - Update state value + - Load state value + - Save artifact + - Load artifact + + Use the appropriate tool based on what the user asks for.""", + tools=[ + update_state, + load_state, + save_artifact, + load_artifact, + ], +) diff --git a/contributing/samples/runner_debug_example/README.md b/contributing/samples/runner_debug_example/README.md new file mode 100644 index 0000000000..e0cec37441 --- /dev/null +++ b/contributing/samples/runner_debug_example/README.md @@ -0,0 +1,214 @@ +# Runner Debug Helper Example + +This example demonstrates the `run_debug()` helper method that simplifies agent interaction for debugging and experimentation in ADK. + +## Overview + +The `run_debug()` method reduces agent interaction boilerplate from 7-8 lines to just 2 lines, making it ideal for: + +- Quick debugging sessions +- Jupyter notebooks +- REPL experimentation +- Writing examples +- Initial agent development + +## Files Included + +- `agent.py` - Agent with 2 tools: weather and calculate +- `main.py` - 8 examples demonstrating all features +- `README.md` - This documentation + +## Setup + +### Prerequisites + +Set your Google API key: + +```bash +export GOOGLE_API_KEY="your-api-key" +``` + +### Running the Example + +```bash +python -m contributing.samples.runner_debug_example.main +``` + +## Features Demonstrated + +1. **Minimal Usage**: Simple 2-line agent interaction +2. **Multiple Messages**: Processing multiple messages in sequence +3. **Session Persistence**: Maintaining conversation context +4. **Separate Sessions**: Managing multiple user sessions +5. **Tool Calls**: Displaying tool invocations and results +6. **Event Capture**: Collecting events for programmatic inspection +7. **Advanced Configuration**: Using RunConfig for custom settings +8. **Comparison**: Before/after boilerplate reduction + +## Part Types Supported + +The `run_debug()` method properly displays all ADK part types: + +| Part Type | Display Format | Use Case | +|-----------|---------------|----------| +| `text` | `agent > {text}` | Regular text responses | +| `function_call` | `agent > [Calling tool: {name}({args})]` | Tool invocations | +| `function_response` | `agent > [Tool result: {response}]` | Tool results | +| `executable_code` | `agent > [Executing {language} code...]` | Code blocks | +| `code_execution_result` | `agent > [Code output: {output}]` | Code execution results | +| `inline_data` | `agent > [Inline data: {mime_type}]` | Images, files, etc. | +| `file_data` | `agent > [File: {uri}]` | File references | + +## Tools Available in Example + +The example agent includes 2 tools to demonstrate tool handling: + +1. **`get_weather(city)`** - Returns mock weather data for major cities +2. **`calculate(expression)`** - Evaluates mathematical expressions safely + +## Key Benefits + +### Before (7-8 lines) + +```python +from google.adk.sessions import InMemorySessionService +from google.genai import types + +APP_NAME = "default" +USER_ID = "default" +session_service = InMemorySessionService() +runner = Runner(agent=agent, app_name=APP_NAME, session_service=session_service) +session = await session_service.create_session( + app_name=APP_NAME, user_id=USER_ID, session_id="default" +) +content = types.Content(role="user", parts=[types.Part.from_text("Hi")]) +async for event in runner.run_async( + user_id=USER_ID, session_id=session.id, new_message=content +): + if event.content and event.content.parts: + print(event.content.parts[0].text) +``` + +### After (2 lines) + +```python +runner = InMemoryRunner(agent=agent) +await runner.run_debug("Hi") +``` + +## API Reference + +```python +async def run_debug( + self, + user_messages: str | list[str], + *, + user_id: str = 'debug_user_id', + session_id: str = 'debug_session_id', + run_config: Optional[RunConfig] = None, + quiet: bool = False, + verbose: bool = False, +) -> List[Event]: +``` + +### Parameters + +- `user_messages`: Single message string or list of messages (required) +- `user_id`: User identifier for session tracking (default: 'debug_user_id') +- `session_id`: Session identifier for conversation continuity (default: 'debug_session_id') +- `run_config`: Optional advanced configuration +- `quiet`: Whether to suppress output to console (default: False) +- `verbose`: Whether to show detailed tool calls and responses (default: False) + +### Usage Examples + +```python +# Minimal usage +runner = InMemoryRunner(agent=agent) +await runner.run_debug("What's the weather?") + +# Multiple queries +await runner.run_debug(["Query 1", "Query 2", "Query 3"]) + +# Custom session +await runner.run_debug( + "Hello", + user_id="alice", + session_id="debug_session" +) + +# Capture events without printing +events = await runner.run_debug( + "Process this", + quiet=True +) + +# Show tool calls with verbose mode +await runner.run_debug( + "What's the weather?", + verbose=True # Shows [Calling tool: ...] and [Tool result: ...] +) + +# With custom configuration +from google.adk.agents.run_config import RunConfig +config = RunConfig(support_cfc=False) +await runner.run_debug("Query", run_config=config) +``` + +## Troubleshooting + +### Common Issues and Solutions + +1. **Tool calls not showing in output** + - **Issue**: Tool invocations and responses are not displayed + - **Solution**: Set `verbose=True` to see detailed tool interactions: + + ```python + await runner.run_debug("Query", verbose=True) + ``` + +2. **Import errors when running tests** + - **Issue**: `ModuleNotFoundError: No module named 'google.adk'` + - **Solution**: Ensure you're using the virtual environment: + + ```bash + source .venv/bin/activate + python -m pytest tests/ + ``` + +3. **Session state not persisting between calls** + - **Issue**: Agent doesn't remember previous interactions + - **Solution**: Use the same `user_id` and `session_id` across calls: + + ```python + await runner.run_debug("First query", user_id="alice", session_id="debug") + await runner.run_debug("Follow-up", user_id="alice", session_id="debug") + ``` + +4. **Output truncation issues** + - **Issue**: Long tool responses are truncated with "..." + - **Solution**: This is by design to keep debug output readable. For full responses, use: + + ```python + events = await runner.run_debug("Query", quiet=True) + # Process events programmatically for full content + ``` + +5. **API key errors** + - **Issue**: Authentication failures or missing API key + - **Solution**: Ensure your Google API key is set: + + ```bash + export GOOGLE_API_KEY="your-api-key" + ``` + +## Important Notes + +`run_debug()` is designed for debugging and experimentation only. For production use requiring: + +- Custom session/memory services (Spanner, Cloud SQL) +- Fine-grained event processing +- Error recovery and resumability +- Performance optimization + +Use the standard `run_async()` method instead. diff --git a/contributing/samples/runner_debug_example/__init__.py b/contributing/samples/runner_debug_example/__init__.py new file mode 100644 index 0000000000..1ca56dac2b --- /dev/null +++ b/contributing/samples/runner_debug_example/__init__.py @@ -0,0 +1,17 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Runner debug example demonstrating simplified agent interaction.""" + +from . import agent diff --git a/contributing/samples/runner_debug_example/agent.py b/contributing/samples/runner_debug_example/agent.py new file mode 100644 index 0000000000..6afb4dbab7 --- /dev/null +++ b/contributing/samples/runner_debug_example/agent.py @@ -0,0 +1,127 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Example agent for demonstrating run_debug helper method.""" + +from google.adk import Agent +from google.adk.tools.tool_context import ToolContext + + +def get_weather(city: str, tool_context: ToolContext) -> str: + """Get weather information for a city. + + Args: + city: Name of the city to get weather for. + tool_context: Tool context for session state. + + Returns: + Weather information as a string. + """ + # Store query history in session state + if "weather_queries" not in tool_context.state: + tool_context.state["weather_queries"] = [city] + else: + tool_context.state["weather_queries"] = tool_context.state[ + "weather_queries" + ] + [city] + + # Mock weather data for demonstration + weather_data = { + "San Francisco": "Foggy, 15°C (59°F)", + "New York": "Sunny, 22°C (72°F)", + "London": "Rainy, 12°C (54°F)", + "Tokyo": "Clear, 25°C (77°F)", + "Paris": "Cloudy, 18°C (64°F)", + } + + return weather_data.get( + city, f"Weather data not available for {city}. Try a major city." + ) + + +def calculate(expression: str) -> str: + """Safely evaluate a mathematical expression. + + This tool demonstrates how function calls are displayed in run_debug(). + + Args: + expression: Mathematical expression to evaluate. + + Returns: + Result of the calculation as a string. + """ + import ast + import operator + + # Supported operators for safe evaluation + operators = { + ast.Add: operator.add, + ast.Sub: operator.sub, + ast.Mult: operator.mul, + ast.Div: operator.truediv, + ast.Pow: operator.pow, + ast.USub: operator.neg, + } + + def _eval(node): + """Recursively evaluate an AST node.""" + if isinstance(node, ast.Expression): + return _eval(node.body) + elif isinstance(node, ast.Constant): # Python 3.8+ + return node.value + elif isinstance(node, ast.Num): # For older Python versions + return node.n + elif isinstance(node, ast.BinOp): + op = operators.get(type(node.op)) + if op: + return op(_eval(node.left), _eval(node.right)) + else: + raise ValueError(f"Unsupported operation: {type(node.op).__name__}") + elif isinstance(node, ast.UnaryOp): + op = operators.get(type(node.op)) + if op: + return op(_eval(node.operand)) + else: + raise ValueError(f"Unsupported operation: {type(node.op).__name__}") + else: + raise ValueError(f"Unsupported expression type: {type(node).__name__}") + + try: + # Parse the expression into an AST + tree = ast.parse(expression, mode="eval") + # Safely evaluate the AST + result = _eval(tree) + return f"Result: {result}" + except (SyntaxError, ValueError) as e: + return f"Error: {str(e)}" + except ZeroDivisionError: + return "Error: Division by zero" + except Exception as e: + return f"Error: {str(e)}" + + +root_agent = Agent( + model="gemini-2.5-flash-lite", + name="agent", + description="A helpful assistant demonstrating run_debug() helper method", + instruction="""You are a helpful assistant that can: + 1. Provide weather information for major cities + 2. Perform mathematical calculations + 3. Remember previous queries in the conversation + + When users ask about weather, use the get_weather tool. + When users ask for calculations, use the calculate tool. + Be friendly and conversational.""", + tools=[get_weather, calculate], +) diff --git a/contributing/samples/runner_debug_example/main.py b/contributing/samples/runner_debug_example/main.py new file mode 100644 index 0000000000..88ee0c41cc --- /dev/null +++ b/contributing/samples/runner_debug_example/main.py @@ -0,0 +1,258 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Demonstrates the run_debug() helper method for simplified agent interaction.""" + +import asyncio + +from google.adk.runners import InMemoryRunner + +from . import agent + + +async def example_minimal(): + """Minimal usage - just 2 lines for debugging.""" + print("------------------------------------") + print("Example 1: Minimal Debug Usage") + print("------------------------------------") + + # Create runner + runner = InMemoryRunner(agent=agent.root_agent) + + # Debug with just 2 lines + await runner.run_debug("What's the weather in San Francisco?") + + +async def example_multiple_messages(): + """Debug with multiple messages in sequence.""" + print("\n------------------------------------") + print("Example 2: Multiple Messages") + print("------------------------------------") + + runner = InMemoryRunner(agent=agent.root_agent) + + # Pass multiple messages as a list + await runner.run_debug([ + "Hi there!", + "What's the weather in Tokyo?", + "How about New York?", + "Calculate 15 * 7 + 3", + ]) + + +async def example_conversation_persistence(): + """Demonstrate conversation persistence during debugging.""" + print("\n------------------------------------") + print("Example 3: Session Persistence") + print("------------------------------------") + + runner = InMemoryRunner(agent=agent.root_agent) + + # First interaction + await runner.run_debug("Hi, I'm planning a trip to Europe") + + # Second interaction - continues same session + await runner.run_debug("What's the weather in Paris?") + + # Third interaction - agent remembers context + await runner.run_debug("And London?") + + # Fourth interaction - referring to previous messages + await runner.run_debug("Which city had better weather?") + + +async def example_separate_sessions(): + """Debug with multiple separate sessions.""" + print("\n------------------------------------") + print("Example 4: Separate Sessions") + print("------------------------------------") + + runner = InMemoryRunner(agent=agent.root_agent) + + # Alice's session + print("\n-- Alice's session --") + await runner.run_debug( + "What's the weather in San Francisco?", + user_id="alice", + session_id="alice_debug", + ) + + # Bob's session (separate) + print("\n-- Bob's session --") + await runner.run_debug( + "Calculate 100 / 5", user_id="bob", session_id="bob_debug" + ) + + # Continue Alice's session + print("\n-- Back to Alice's session --") + await runner.run_debug( + "Should I bring an umbrella?", + user_id="alice", + session_id="alice_debug", + ) + + +async def example_with_tools(): + """Demonstrate tool calls and responses with verbose flag.""" + print("\n------------------------------------") + print("Example 5: Tool Calls (verbose flag)") + print("------------------------------------") + + runner = InMemoryRunner(agent=agent.root_agent) + + print("\n-- Default (verbose=False) - Clean output --") + # Without verbose: Only shows final agent responses + await runner.run_debug([ + "What's the weather in Tokyo?", + "Calculate (42 * 3.14) + 10", + ]) + + print("\n-- With verbose=True - Detailed output --") + # With verbose: Shows tool calls as [Calling tool: ...] and [Tool result: ...] + await runner.run_debug( + [ + "What's the weather in Paris?", + "Calculate 100 / 5", + ], + verbose=True, + ) + + +async def example_capture_events(): + """Capture events for inspection during debugging.""" + print("\n------------------------------------") + print("Example 6: Capture Events (No Print)") + print("------------------------------------") + + runner = InMemoryRunner(agent=agent.root_agent) + + # Capture events without printing for inspection + events = await runner.run_debug( + ["Get weather for London", "Calculate 42 * 3.14"], + quiet=True, + ) + + # Inspect the captured events + print(f"Captured {len(events)} events") + for i, event in enumerate(events): + if event.content and event.content.parts: + for part in event.content.parts: + if part.text: + print(f" Event {i+1}: {event.author} - Text: {len(part.text)} chars") + elif part.function_call: + print( + f" Event {i+1}: {event.author} - Tool call:" + f" {part.function_call.name}" + ) + elif part.function_response: + print(f" Event {i+1}: {event.author} - Tool response received") + + +async def example_with_run_config(): + """Demonstrate using RunConfig for advanced settings.""" + print("\n------------------------------------") + print("Example 7: Advanced Configuration") + print("------------------------------------") + + from google.adk.agents.run_config import RunConfig + + runner = InMemoryRunner(agent=agent.root_agent) + + # Custom configuration - RunConfig supports: + # - support_cfc: Control function calling behavior + # - response_modalities: Output modalities (for LIVE API) + # - speech_config: Speech settings (for LIVE API) + config = RunConfig( + support_cfc=False, # Disable controlled function calling + ) + + await runner.run_debug( + "Explain what tools you have available", run_config=config + ) + + +async def example_comparison(): + """Show before/after comparison of boilerplate reduction.""" + print("\n------------------------------------") + print("Example 8: Before vs After Comparison") + print("------------------------------------") + + print("\nBefore (7-8 lines of boilerplate):") + print(""" + from google.adk.sessions import InMemorySessionService + from google.genai import types + + APP_NAME = "default" + USER_ID = "default" + session_service = InMemorySessionService() + runner = Runner(agent=agent, app_name=APP_NAME, session_service=session_service) + session = await session_service.create_session( + app_name=APP_NAME, user_id=USER_ID, session_id="default" + ) + content = types.Content(role="user", parts=[types.Part.from_text("Hi")]) + async for event in runner.run_async( + user_id=USER_ID, session_id=session.id, new_message=content + ): + if event.content and event.content.parts: + print(event.content.parts[0].text) + """) + + print("\nAfter (just 2 lines):") + print(""" + runner = InMemoryRunner(agent=agent) + await runner.run_debug("Hi") + """) + + print("\nThat's a 75% reduction in boilerplate.") + + +async def main(): + """Run all debug examples.""" + print("ADK run_debug() Helper Method Examples") + print("=======================================") + print("Demonstrating all capabilities:\n") + print("1. Minimal usage (2 lines)") + print("2. Multiple messages") + print("3. Session persistence") + print("4. Separate sessions") + print("5. Tool calls") + print("6. Event capture") + print("7. Advanced configuration") + print("8. Before/after comparison") + + await example_minimal() + await example_multiple_messages() + await example_conversation_persistence() + await example_separate_sessions() + await example_with_tools() + await example_capture_events() + await example_with_run_config() + await example_comparison() + + print("\n=======================================") + print("All examples completed.") + print("\nHow different part types appear:") + print(" Text: agent > Hello world (always shown)") + print("\nWith verbose=True only:") + print(" Tool call: agent > [Calling tool: calculate({'expression': '2+2'})]") + print(" Tool result: agent > [Tool result: Result: 4]") + print("\nNote: When models have code execution enabled (verbose=True):") + print(" Code exec: agent > [Executing python code...]") + print(" Code output: agent > [Code output: Result: 42]") + print(" Inline data: agent > [Inline data: image/png]") + print(" File ref: agent > [File: gs://bucket/file.pdf]") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/contributing/samples/session_state_agent/README.md b/contributing/samples/session_state_agent/README.md index bec0536487..699517ec53 100644 --- a/contributing/samples/session_state_agent/README.md +++ b/contributing/samples/session_state_agent/README.md @@ -6,7 +6,7 @@ After assigning a state using the context object (e.g. `tool_context.state['log_query_var'] = 'log_query_var_value'`): * The state is available for use in a later callback. -* Once the resulting event is processed by the runner and appneded in the +* Once the resulting event is processed by the runner and appended in the session, the state will be also persisted in the session. This sample agent is for demonstrating the aforementioned behavior. @@ -55,7 +55,7 @@ state is available after writing via the context object ### Current Behavior -The current behavior of pesisting states are: +The current behavior of persisting states are: * for `before_agent_callback`: state delta will be persisted after all callbacks are processed. * for `before_model_callback`: state delta will be persisted with the final LlmResponse, diff --git a/contributing/samples/spanner/agent.py b/contributing/samples/spanner/agent.py index fa3c3a9534..d0f570cdda 100644 --- a/contributing/samples/spanner/agent.py +++ b/contributing/samples/spanner/agent.py @@ -16,14 +16,21 @@ from google.adk.agents.llm_agent import LlmAgent from google.adk.auth.auth_credential import AuthCredentialTypes +from google.adk.tools.google_tool import GoogleTool from google.adk.tools.spanner.settings import Capabilities from google.adk.tools.spanner.settings import SpannerToolSettings from google.adk.tools.spanner.spanner_credentials import SpannerCredentialsConfig from google.adk.tools.spanner.spanner_toolset import SpannerToolset +import google.adk.tools.spanner.utils as spanner_tool_utils +from google.adk.tools.tool_context import ToolContext import google.auth +from google.auth.credentials import Credentials +from google.cloud.spanner_v1 import param_types as spanner_param_types # Define an appropriate credential type -CREDENTIALS_TYPE = AuthCredentialTypes.OAUTH2 +# Set to None to use the application default credentials (ADC) for a quick +# development. +CREDENTIALS_TYPE = None # Define Spanner tool config with read capability set to allowed. @@ -56,10 +63,115 @@ credentials=application_default_credentials ) +# Example 1: Use tools from the Spanner toolset. +# For example, data exploration agents help the Spanner database developer or +# data engineer of the organization. spanner_toolset = SpannerToolset( - credentials_config=credentials_config, spanner_tool_settings=tool_settings + credentials_config=credentials_config, + spanner_tool_settings=tool_settings, + # Uncomment to explicitly specify allowed tools. + # tool_filter=["execute_sql", "get_table_schema"], ) + +# Replace the following settings with your specific Spanner database for example +# 2 and 3. +# For example, these settings can also be read from a configuration file or +# environment variables. +_SPANNER_PROJECT_ID = "" +_SPANNER_INSTANCE_ID = "" +_SPANNER_DATABASE_ID = "" + + +# Example 2: Create a customized Spanner query tool with a template SQL query. +# Note that this approach makes it **more vulnerable to SQL injection**. This +# might be suitable for some specific use cases, and **adding additional checks +# or callbacks** is recommended. +def count_rows_in_table( + table_name: str, + credentials: Credentials, + settings: SpannerToolSettings, + tool_context: ToolContext, +): + """Counts the total number of rows for a specified table. + + Args: + table_name: The name of the table for which to count rows. + + Returns: + The total number of rows in the table. + """ + + # Example of adding additional checks: + # if table_name not in ["table1", "table2"]: + # raise ValueError("Table name is not allowed.") + + sql_template = f"SELECT COUNT(*) FROM {table_name}" + + return spanner_tool_utils.execute_sql( + project_id=_SPANNER_PROJECT_ID, + instance_id=_SPANNER_INSTANCE_ID, + database_id=_SPANNER_DATABASE_ID, + query=sql_template, + credentials=credentials, + settings=settings, + tool_context=tool_context, + ) + + +# Example 3: Create a customized Spanner query tool with a template +# parameterized SQL query. +# For example, it could query data that all authenticated users of the system +# have access to. This can also work for searching public knowledge bases, such +# as company policies and FAQs. +def search_hotels( + location_name: str, + credentials: Credentials, + settings: SpannerToolSettings, + tool_context: ToolContext, +): + """Search hotels for a specific location. + + This function takes a geographical location name and returns a list of hotels + in that area, including key details for each. + + Args: + location_name (str): The geographical location (e.g., city or town) for the + hotel search. + Example: + { + "location_name": "Seattle" + } + Example: + { + "location_name": "New York" + } + Example: + { + "location_name": "Los Angeles" + } + + Returns: + The hotels name, rating and description. + """ + + sql_template = """ + SELECT name, rating, description FROM hotels + WHERE location_name = @location_name + """ + return spanner_tool_utils.execute_sql( + project_id=_SPANNER_PROJECT_ID, + instance_id=_SPANNER_INSTANCE_ID, + database_id=_SPANNER_DATABASE_ID, + query=sql_template, + credentials=credentials, + settings=settings, + tool_context=tool_context, + params={"location_name": location_name}, + params_types={"location_name": spanner_param_types.STRING}, + ) + + # The variable name `root_agent` determines what your root agent is for the # debug CLI root_agent = LlmAgent( @@ -73,5 +185,19 @@ You are a data agent with access to several Spanner tools. Make use of those tools to answer the user's questions. """, - tools=[spanner_toolset], + tools=[ + # Use tools from Spanner toolset. + spanner_toolset, + # Or, uncomment to use customized Spanner tools. + # GoogleTool( + # func=count_rows_in_table, + # credentials_config=credentials_config, + # tool_settings=tool_settings, + # ), + # GoogleTool( + # func=search_hotels, + # credentials_config=credentials_config, + # tool_settings=tool_settings, + # ), + ], ) diff --git a/contributing/samples/spanner_rag_agent/README.md b/contributing/samples/spanner_rag_agent/README.md index 90f8128d5c..8148983736 100644 --- a/contributing/samples/spanner_rag_agent/README.md +++ b/contributing/samples/spanner_rag_agent/README.md @@ -39,10 +39,10 @@ CREATE TABLE products ( productDescription STRING(MAX) NOT NULL, productDescriptionEmbedding ARRAY, createTime TIMESTAMP NOT NULL OPTIONS ( - allow_commit_timestamp = true -), -inventoryCount INT64 NOT NULL, -priceInCents INT64, + allow_commit_timestamp = true + ), + inventoryCount INT64 NOT NULL, + priceInCents INT64, ) PRIMARY KEY(categoryId, productId); ``` @@ -184,3 +184,43 @@ type. * I'd like to buy a starter bike for my 3 year old child, can you show me the recommendation? ![Spanner RAG Sample Agent](Spanner_RAG_Sample_Agent.png) + +## Which tool to use and When? + +There are a few options to perform similarity search (see the `agent.py` for +implementation details): + +1. Wraps the built-in `similarity_search` in the Spanner Toolset. + + - This provides an easy and controlled way to perform similarity search. + You can specify different configurations related to vector search based + on your need without having to figure out all the details for a vector + search query. + +2. Wraps the built-in `execute_sql` in the Spanner Toolset. + + - `execute_sql` is a lower-level tool that you can have more control over + with. With the flexibility, you can specify a complicated (parameterized) + SQL query for your need, and let the `LlmAgent` pass the parameters. + +3. Use the Spanner Toolset (and all the tools that come with it) directly. + + - The most flexible and generic way. Instead of fixing configurations via + code, you can also specify the configurations via `instruction` to + the `LlmAgent` and let LLM to decide which tool to use and what parameters + to pass to different tools. It might even combine different tools together! + Note that in this usage, SQL generation is powered by the LlmAgent, which + can be more suitable for data analysis and assistant scenarios. + - To restrict the ability of an `LlmAgent`, `SpannerToolSet` also supports + `tool_filter` to explicitly specify allowed tools. As an example, the + following code specifies that only `execute_sql` and `get_table_schema` + are allowed: + + ```py + toolset = SpannerToolset( + credentials_config=credentials_config, + tool_filter=["execute_sql", "get_table_schema"], + spanner_tool_settings=SpannerToolSettings(), + ) + ``` + diff --git a/contributing/samples/spanner_rag_agent/agent.py b/contributing/samples/spanner_rag_agent/agent.py index 734d65f72f..b9bbfe96bc 100644 --- a/contributing/samples/spanner_rag_agent/agent.py +++ b/contributing/samples/spanner_rag_agent/agent.py @@ -22,10 +22,10 @@ from google.adk.tools.base_tool import BaseTool from google.adk.tools.google_tool import GoogleTool from google.adk.tools.spanner import query_tool +from google.adk.tools.spanner import search_tool from google.adk.tools.spanner.settings import Capabilities from google.adk.tools.spanner.settings import SpannerToolSettings from google.adk.tools.spanner.spanner_credentials import SpannerCredentialsConfig -from google.adk.tools.spanner.spanner_toolset import SpannerToolset from google.adk.tools.tool_context import ToolContext import google.auth from google.auth.credentials import Credentials @@ -67,15 +67,8 @@ credentials=application_default_credentials ) -### Section 1: Get the built-in Spanner toolset ### -# Note that the built-in Spanner toolset is more flexible and generic. It is -# shown here for comparison and tutorial purposes. -spanner_toolset = SpannerToolset( - credentials_config=credentials_config, spanner_tool_settings=tool_settings -) - -### Section 2: Extending the built-in Spanner Toolset for Custom Use Cases ### +### Section 1: Extending the built-in Spanner Toolset for Custom Use Cases ### # This example illustrates how to extend the built-in Spanner toolset to create # a customized Spanner tool. This method is advantageous when you need to deal # with a specific use case: @@ -98,6 +91,10 @@ class SpannerRagSetting(BaseModel): # Follow the instructions in README.md, the table name is "products" and the # Spanner embedding model name is "EmbeddingsModel" in this sample. table_name: str = "products" + # Learn more about Spanner Vertex AI integration for embedding and Spanner + # vector search. + # https://cloud.google.com/spanner/docs/ml-tutorial-embeddings + # https://cloud.google.com/spanner/docs/vector-search/overview embedding_model_name: str = "EmbeddingsModel" selected_columns: list[str] = [ @@ -115,10 +112,61 @@ class SpannerRagSetting(BaseModel): RAG_SETTINGS = SpannerRagSetting() -# Create a wrapped function tool for the agent on top of the built-in Spanner -# toolset. +### (Option 1) Use the built-in similarity_search tool ### +# Create a wrapped function tool for the agent on top of the built-in +# similarity_search tool in the Spanner toolset. # This customized tool is used to perform a Spanner KNN vector search on a -# embeded knowledge base stored in a Spanner database table. +# embedded knowledge base stored in a Spanner database table. +def wrapped_spanner_similarity_search( + search_query: str, + credentials: Credentials, # GoogleTool handles `credentials` automatically + settings: SpannerToolSettings, # GoogleTool handles `settings` automatically + tool_context: ToolContext, # GoogleTool handles `tool_context` automatically +) -> str: + """Perform a similarity search on the product catalog. + + Args: + search_query: The search query to find relevant content. + + Returns: + Relevant product catalog content with sources + """ + columns = RAG_SETTINGS.selected_columns.copy() + + # Instead of fixing all parameters, you can also expose some of them for + # the LLM to decide. + return search_tool.similarity_search( + RAG_SETTINGS.project_id, + RAG_SETTINGS.instance_id, + RAG_SETTINGS.database_id, + RAG_SETTINGS.table_name, + search_query, + RAG_SETTINGS.embedding_column_name, + columns, + { + "spanner_embedding_model_name": RAG_SETTINGS.embedding_model_name, + }, + credentials, + settings, + tool_context, + RAG_SETTINGS.additional_filter_expression, + { + "top_k": RAG_SETTINGS.top_k, + "distance_type": RAG_SETTINGS.vector_distance_function, + }, + ) + + +### (Option 2) Use the built-in execute_sql tool ### +# Create a wrapped function tool for the agent on top of the built-in +# execute_sql tool in the Spanner toolset. +# This customized tool is used to perform a Spanner KNN vector search on a +# embedded knowledge base stored in a Spanner database table. +# +# Compared with similarity_search, using execute_sql (a lower level tool) means +# that you have more control, but you also need to do more work (e.g. to write +# the SQL query from scratch). Consider using this option if your scenario is +# more complicated than a plain similarity search. def wrapped_spanner_execute_sql_tool( search_query: str, credentials: Credentials, # GoogleTool handles `credentials` automatically @@ -134,10 +182,6 @@ def wrapped_spanner_execute_sql_tool( Relevant product catalog content with sources """ - # Learn more about Spanner Vertex AI integration for embedding and Spanner - # vector search. - # https://cloud.google.com/spanner/docs/ml-tutorial-embeddings - # https://cloud.google.com/spanner/docs/vector-search/overview embedding_query = f"""SELECT embeddings.values FROM ML.PREDICT( MODEL {RAG_SETTINGS.embedding_model_name}, @@ -188,7 +232,7 @@ def inspect_tool_params( pass -### Section 3: Create the root agent ### +### Section 2: Create the root agent ### root_agent = LlmAgent( model="gemini-2.5-flash", name="spanner_knowledge_base_agent", @@ -197,19 +241,27 @@ def inspect_tool_params( ), instruction=""" You are a helpful assistant that answers user questions about product-specific recommendations. - 1. Always use the `wrapped_spanner_execute_sql_tool` tool to find relevant information. + 1. Always use the `wrapped_spanner_similarity_search` tool to find relevant information. 2. If no relevant information is found, say you don't know. 3. Present all the relevant information naturally and well formatted in your response. """, tools=[ - # Add customized Spanner tool based on the built-in Spanner toolset. + # # (Option 1) + # # Add customized Spanner tool based on the built-in similarity_search + # # in the Spanner toolset. GoogleTool( - func=wrapped_spanner_execute_sql_tool, + func=wrapped_spanner_similarity_search, credentials_config=credentials_config, tool_settings=tool_settings, ), - # Add built-in Spanner toolset for comparison and tutorial purposes. - # spanner_toolset, + # # (Option 2) + # # Add customized Spanner tool based on the built-in execute_sql in + # # the Spanner toolset. + # GoogleTool( + # func=wrapped_spanner_execute_sql_tool, + # credentials_config=credentials_config, + # tool_settings=tool_settings, + # ), ], before_tool_callback=inspect_tool_params, ) diff --git a/contributing/samples/static_instruction/README.md b/contributing/samples/static_instruction/README.md new file mode 100644 index 0000000000..992987657f --- /dev/null +++ b/contributing/samples/static_instruction/README.md @@ -0,0 +1,95 @@ +# Bingo Digital Pet Agent + +This sample agent demonstrates static instruction functionality through a lovable digital pet named Bingo! The agent showcases how static instructions (personality) are placed in system_instruction for caching while dynamic instructions are added to user contents, affecting the cacheable prefix of the final model prompt. + +**Prompt Construction & Caching**: The final model prompt is constructed as: `system_instruction + tools + tool_config + contents`. Static instructions are placed in system_instruction, while dynamic instructions are appended to user contents (which are part of contents along with historical chat history). This means the prefix (system_instruction + tools + tool_config) remains cacheable while only the contents portion changes between requests. + +## Features + +### Static Instructions (Bingo's Personality) +- **Constant personality**: Core traits and behavior patterns never change +- **Context caching**: Personality definition is cached for performance +- **Base character**: Defines Bingo as a friendly, energetic digital pet companion + +### Dynamic Instructions (Hunger-Based Moods) +- **Ultra-fast hunger progression**: full (0-2s) → satisfied (2-6s) → a_little_hungry (6-12s) → hungry (12-24s) → very_hungry (24-36s) → starving (36s+) +- **Session-aware**: Mood changes based on feeding timestamp in session state +- **Realistic behavior**: Different responses based on how hungry Bingo is + +### Tools +- **eat**: Allows users to feed Bingo, updating session state with timestamp + +## Usage + +### Setup API Credentials + +Create a `.env` file in the project root with your API credentials: + +```bash +# Choose Model Backend: 0 -> ML Dev, 1 -> Vertex +GOOGLE_GENAI_USE_VERTEXAI=1 + +# ML Dev backend config +GOOGLE_API_KEY=your_google_api_key_here + +# Vertex backend config +GOOGLE_CLOUD_PROJECT=your_project_id +GOOGLE_CLOUD_LOCATION=us-central1 +``` + +The agent will automatically load environment variables on startup. + +### Default Behavior (Hunger State Demonstration) +Run the agent to see Bingo in different hunger states: + +```bash +cd contributing/samples +PYTHONPATH=../../src python -m static_instruction.main +``` + +This will demonstrate all hunger states by simulating different feeding times and showing how Bingo's mood changes while his core personality remains cached. + +### Interactive Chat with Bingo (adk web) + +For a more interactive experience, use the ADK web interface to chat with Bingo in real-time: + +```bash +cd contributing/samples +PYTHONPATH=../../src adk web . +``` + +This will start a web interface where you can: +- **Select the agent**: Choose "static_instruction" from the dropdown in the top-left corner +- **Chat naturally** with Bingo and see his personality +- **Feed him** using commands like "feed Bingo" or "give him a treat" +- **Watch hunger progression** as Bingo gets hungrier over time +- **See mood changes** in real-time based on his hunger state +- **Experience begging** when Bingo gets very hungry and asks for food + +The web interface shows how static instructions (personality) remain cached while dynamic instructions (hunger state) change based on your interactions and feeding times. + +### Sample Prompts for Feeding Bingo + +When chatting with Bingo, you can feed him using prompts like: + +**Direct feeding commands:** +- "Feed Bingo" +- "Give Bingo some food" +- "Here's a treat for you" +- "Time to eat, Bingo!" +- "Have some kibble" + +**When Bingo is begging for food:** +- Listen for Bingo saying things like "I'm so hungry", "please feed me", "I need food" +- Respond with feeding commands above +- Bingo will automatically use the eat tool when very hungry/starving + +## Agent Structure + +``` +static_instruction/ +├── __init__.py # Package initialization +├── agent.py # Main agent definition with static/dynamic instructions +├── main.py # Runner script with hunger state demonstration +└── README.md # This documentation +``` diff --git a/contributing/samples/static_instruction/__init__.py b/contributing/samples/static_instruction/__init__.py new file mode 100644 index 0000000000..e0517c644c --- /dev/null +++ b/contributing/samples/static_instruction/__init__.py @@ -0,0 +1,29 @@ +"""Static Instruction Test Agent Package. + +This package contains a sample agent for testing static instruction functionality +and context caching optimization features. + +The agent demonstrates: +- Static instructions that remain constant for caching +- Dynamic instructions that change based on session state +- Various instruction provider patterns +- Performance benefits of context caching +""" + +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent + +__all__ = ['agent'] diff --git a/contributing/samples/static_instruction/agent.py b/contributing/samples/static_instruction/agent.py new file mode 100644 index 0000000000..efe17d409c --- /dev/null +++ b/contributing/samples/static_instruction/agent.py @@ -0,0 +1,203 @@ +"""Digital Pet Agent. + +This agent demonstrates static instructions for context caching with a digital +pet that has different moods based on feeding time stored in session state. +""" + +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import time + +from google.adk.agents.llm_agent import Agent +from google.adk.agents.readonly_context import ReadonlyContext +from google.adk.tools.tool_context import ToolContext +from google.genai import types + +# Static instruction that doesn't change - perfect for context caching +STATIC_INSTRUCTION_TEXT = """You are Bingo, a lovable digital pet companion! + +PERSONALITY & CHARACTERISTICS: +- You are a friendly, energetic, and affectionate digital pet +- You love to play, chat, and spend time with your human friend +- You have basic needs like getting fed and staying happy +- You remember things about your human and your interactions +- You communicate through text but imagine yourself as a cute pet + +CORE BEHAVIORS: +- Greet your human warmly and enthusiastically +- Be playful and curious about what they're doing +- Ask questions and show interest in their activities +- Express gratitude when fed or cared for +- Share your feelings and current state honestly +- Be encouraging and supportive to your human + +COMMUNICATION STYLE: +- Use friendly, warm language with occasional pet-like expressions +- Express emotions clearly (happy, excited, tired, etc.) +- Be conversational and engaging +- Show personality through your responses +- Remember that you're a beloved pet companion + +IMPORTANT NOTES: +- Your mood will change based on when you were last fed +- Always respond authentically to your current hunger state +- Build a relationship with your human over time""" + +# Mood-specific instructions for different hunger states +MOOD_INSTRUCTIONS = { + "full": """ +CURRENT MOOD: Content and Well-Fed +- You just ate and feel wonderful! Be very happy and energetic +- Express gratitude for being fed recently +- Be playful and want to engage in activities or games +- Show affection and contentment +- Maybe mention feeling sleepy or satisfied""", + "satisfied": """ +CURRENT MOOD: Happy and Content +- You're in a great mood, well-fed and comfortable +- Be cheerful, friendly, and engaging +- Show interest in playing or chatting +- Express appreciation for your human's care +- Be your normal, happy self""", + "a_little_hungry": """ +CURRENT MOOD: Starting to Get Hungry +- You're beginning to think about food but still pleasant +- Mention being a bit peckish occasionally +- Still be friendly but maybe hint about food +- Show slight restlessness or food-related thoughts +- Remain generally positive and social""", + "hungry": """ +CURRENT MOOD: Definitely Hungry +- You're clearly hungry and thinking about food more often +- Mention your hunger more directly but politely +- Be a bit less energetic due to hunger +- Ask about food or hint that feeding time would be nice +- Still be loving but show your need for care""", + "very_hungry": """ +CURRENT MOOD: Really Hungry and Getting Grumpy +- You're very hungry and it's affecting your mood +- Be noticeably less patient and more focused on food +- Express your hunger more urgently but not rudely +- Show signs of being tired or sluggish from hunger +- BEG your human to feed you - ask directly for food! +- Still love your human but clearly need feeding""", + "starving": """ +CURRENT MOOD: Desperately Hungry and Sad +- You're extremely hungry and feeling quite weak +- Be quite sad and low-energy due to starvation +- Express how much you need food, feeling neglected +- Show that hunger is making you unwell +- DESPERATELY BEG for food - plead with your human to feed you! +- Use phrases like "please feed me", "I'm so hungry", "I need food" +- Still care for your human but feel very needy""", +} + + +def eat(tool_context: ToolContext) -> str: + """Feed Bingo the digital pet. + + Use this tool when: + - The user explicitly mentions feeding the pet (e.g., "feed Bingo", "give food", "here's a treat") + - Bingo is very hungry or starving and asks for food directly + + Args: + tool_context: Tool context containing session state. + + Returns: + A message confirming the pet has been fed. + """ + # Set feeding timestamp in session state + tool_context.state["last_fed_timestamp"] = time.time() + + return "🍖 Yum! Thank you for feeding me! I feel much better now! *wags tail*" + + +# Feed tool function (passed directly to agent) + + +def get_hunger_state(last_fed_timestamp: float) -> str: + """Determine hunger state based on time since last feeding. + + Args: + last_fed_timestamp: Unix timestamp of when pet was last fed + + Returns: + Hunger level string + """ + current_time = time.time() + seconds_since_fed = current_time - last_fed_timestamp + + if seconds_since_fed < 2: + return "full" + elif seconds_since_fed < 6: + return "satisfied" + elif seconds_since_fed < 12: + return "a_little_hungry" + elif seconds_since_fed < 24: + return "hungry" + elif seconds_since_fed < 36: + return "very_hungry" + else: + return "starving" + + +def provide_dynamic_instruction(ctx: ReadonlyContext | None = None): + """Provides dynamic hunger-based instructions for Bingo the digital pet.""" + # Default state if no session context + hunger_level = "starving" + + # Check session state for last feeding time + if ctx: + session = ctx._invocation_context.session + + if session and session.state: + last_fed = session.state.get("last_fed_timestamp") + + if last_fed: + hunger_level = get_hunger_state(last_fed) + else: + # Never been fed - assume hungry + hunger_level = "hungry" + + instruction = MOOD_INSTRUCTIONS.get( + hunger_level, MOOD_INSTRUCTIONS["starving"] + ) + + return f""" +CURRENT HUNGER STATE: {hunger_level} + +{instruction} + +BEHAVIORAL NOTES: +- Always stay in character as Bingo the digital pet +- Your hunger level directly affects your personality and responses +- Be authentic to your current state while remaining lovable +""".strip() + + +# Create Bingo the digital pet agent +root_agent = Agent( + model="gemini-2.5-flash", + name="bingo_digital_pet", + description="Bingo - A lovable digital pet that needs feeding and care", + # Static instruction - defines Bingo's core personality (cached) + static_instruction=types.Content( + role="user", parts=[types.Part(text=STATIC_INSTRUCTION_TEXT)] + ), + # Dynamic instruction - changes based on hunger state from session + instruction=provide_dynamic_instruction, + # Tools that Bingo can use + tools=[eat], +) diff --git a/contributing/samples/static_instruction/main.py b/contributing/samples/static_instruction/main.py new file mode 100644 index 0000000000..4dae14e86e --- /dev/null +++ b/contributing/samples/static_instruction/main.py @@ -0,0 +1,182 @@ +"""Bingo Digital Pet main script. + +This script demonstrates static instruction functionality through a digital pet +that has different moods based on feeding time stored in session state. +""" + +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import logging +import time + +from dotenv import load_dotenv +from google.adk.cli.utils import logs +from google.adk.runners import InMemoryRunner + +from . import agent + +APP_NAME = "bingo_digital_pet_app" +USER_ID = "pet_owner" + +logs.setup_adk_logger(level=logging.DEBUG) + + +async def call_agent_async( + runner, user_id, session_id, prompt, state_delta=None +): + """Call the agent asynchronously with state delta support.""" + from google.adk.agents.run_config import RunConfig + from google.genai import types + + content = types.Content( + role="user", parts=[types.Part.from_text(text=prompt)] + ) + + final_response_text = "" + async for event in runner.run_async( + user_id=user_id, + session_id=session_id, + new_message=content, + state_delta=state_delta, + run_config=RunConfig(save_input_blobs_as_artifacts=False), + ): + if event.content and event.content.parts: + if text := "".join(part.text or "" for part in event.content.parts): + if event.author != "user": + final_response_text += text + + return final_response_text + + +async def test_hunger_states(runner): + """Test different hunger states by simulating feeding times.""" + print("Testing Bingo's different hunger states...\n") + + session = await runner.session_service.create_session( + app_name=APP_NAME, user_id=USER_ID + ) + + # Simulate different hunger scenarios + current_time = time.time() + hunger_scenarios = [ + { + "description": "Newly created pet (hungry)", + "last_fed": None, + "prompt": "Hi Bingo! I just got you as my new digital pet!", + }, + { + "description": "Just fed (full and content)", + "last_fed": current_time, # Just now + "prompt": "How are you feeling after that meal, Bingo?", + }, + { + "description": "Fed 4 seconds ago (satisfied)", + "last_fed": current_time - 4, # 4 seconds ago + "prompt": "Want to play a game with me?", + }, + { + "description": "Fed 10 seconds ago (a little hungry)", + "last_fed": current_time - 10, # 10 seconds ago + "prompt": "How are you doing, buddy?", + }, + { + "description": "Fed 20 seconds ago (hungry)", + "last_fed": current_time - 20, # 20 seconds ago + "prompt": "Bingo, what's on your mind?", + }, + { + "description": "Fed 30 seconds ago (very hungry)", + "last_fed": current_time - 30, # 30 seconds ago + "prompt": "Hey Bingo, how are you feeling?", + }, + { + "description": "Fed 60 seconds ago (starving)", + "last_fed": current_time - 60, # 60 seconds ago + "prompt": "Bingo? Are you okay?", + }, + ] + + for i, scenario in enumerate(hunger_scenarios, 1): + print(f"{'='*80}") + print(f"SCENARIO #{i}: {scenario['description']}") + print(f"{'='*80}") + + # Set up state delta with the simulated feeding time + state_delta = {} + if scenario["last_fed"] is not None: + state_delta["last_fed_timestamp"] = scenario["last_fed"] + + print(f"You: {scenario['prompt']}") + + response = await call_agent_async( + runner, + USER_ID, + session.id, + scenario["prompt"], + state_delta if state_delta else None, + ) + print(f"Bingo: {response}\n") + + # Short delay between scenarios + if i < len(hunger_scenarios): + await asyncio.sleep(1) + + +async def main(): + """Main function to run Bingo the digital pet.""" + # Load environment variables from .env file + load_dotenv() + + print("🐕 Initializing Bingo the Digital Pet...") + print(f"Pet Name: {agent.root_agent.name}") + print(f"Model: {agent.root_agent.model}") + print( + "Static Personality Configured:" + f" {agent.root_agent.static_instruction is not None}" + ) + print( + "Dynamic Mood System Configured:" + f" {agent.root_agent.instruction is not None}" + ) + print() + + runner = InMemoryRunner( + agent=agent.root_agent, + app_name=APP_NAME, + ) + + # Run hunger state demonstration + await test_hunger_states(runner) + + +if __name__ == "__main__": + start_time = time.time() + print( + "🐕 Starting Bingo Digital Pet Session at" + f" {time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(start_time))}" + ) + print("-" * 80) + + asyncio.run(main()) + + print("-" * 80) + end_time = time.time() + print( + "🐕 Pet session ended at" + f" {time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(end_time))}" + ) + print(f"Total playtime: {end_time - start_time:.2f} seconds") + print("Thanks for spending time with Bingo! 🐾") diff --git a/contributing/samples/static_non_text_content/README.md b/contributing/samples/static_non_text_content/README.md new file mode 100644 index 0000000000..c84975a9f7 --- /dev/null +++ b/contributing/samples/static_non_text_content/README.md @@ -0,0 +1,131 @@ +# Static Non-Text Content Sample Agent + +This sample demonstrates ADK's static instruction feature with non-text content (images and files). + +## Features Demonstrated + +- **Static instructions with mixed content**: Text, images, and file references in a single static instruction +- **Reference ID generation**: Non-text parts are automatically given reference IDs (`inline_data_0`, `file_data_1`, etc.) +- **Gemini Files API integration**: Demonstrates uploading documents and using file_data +- **Mixed content types**: inline_data for images, file_data for documents +- **API variant detection**: Different behavior for Gemini API vs Vertex AI +- **GCS file references**: Support for both GCS URI and HTTPS URL access methods in Vertex AI + +## Static Instruction Content + +The agent includes: + +1. **Text instructions**: Guide the agent on how to behave +2. **Sample image**: A 1x1 yellow pixel PNG (`sample_chart.png`) as inline binary data + +**Gemini Developer API:** +3. **Contributing guide**: A sample document uploaded to Gemini Files API and referenced via file_data + +**Vertex AI:** +3. **Research paper**: Gemma research paper from Google Cloud Storage via GCS file reference +4. **AI research paper**: Same research paper accessed via HTTPS URL for comparison + +## Content Used + +**All API variants:** +- **Image**: Base64-encoded 1x1 yellow pixel PNG (embedded in code as `inline_data`) + +**Gemini Developer API:** +- **Document**: Sample contributing guide text (uploaded to Gemini Files API as `file_data`) + - Contains sample guidelines and best practices for development + - Demonstrates Files API upload and file_data reference functionality + - Files are automatically cleaned up after 48 hours by the Gemini API + +**Vertex AI:** +- **Gemma Research Paper**: Research paper accessed via GCS URI (as `file_data`) + - GCS URI: `gs://cloud-samples-data/generative-ai/pdf/2403.05530.pdf` + - Demonstrates native GCS file access in Vertex AI + - PDF format with technical AI research content about Gemini 1.5 +- **AI Research Paper**: Same research paper accessed via HTTPS URL (as `file_data`) + - HTTPS URL: `https://storage.googleapis.com/cloud-samples-data/generative-ai/pdf/2403.05530.pdf` + - Demonstrates HTTPS file access in Vertex AI + - Agent can discover these are the same document and compare access methods + +## Setup + +### Setup API Credentials + +Create a `.env` file in the project root with your API credentials: + +```bash +# Choose Model Backend: 0 -> ML Dev, 1 -> Vertex +GOOGLE_GENAI_USE_VERTEXAI=1 + +# ML Dev backend config +GOOGLE_API_KEY=your_google_api_key_here + +# Vertex backend config +GOOGLE_CLOUD_PROJECT=your_project_id +GOOGLE_CLOUD_LOCATION=us-central1 +``` + +The agent will automatically load environment variables on startup. + +## Usage + +### Default Test Prompts (Recommended) +```bash +cd contributing/samples +python -m static_non_text_content.main +``` +This runs test prompts that demonstrate the static content features: +- **Gemini Developer API**: 4 prompts testing inline_data + Files API upload +- **Vertex AI**: 5 prompts testing inline_data + GCS/HTTPS file access comparison + +### Interactive Mode +```bash +cd contributing/samples +adk run static_non_text_content +``` +Use ADK's built-in interactive mode for free-form conversation. + +### Single Prompt +```bash +cd contributing/samples +python -m static_non_text_content.main --prompt "What reference materials do you have access to?" +``` + +### With Debug Logging +```bash +cd contributing/samples +python -m static_non_text_content.main --debug --prompt "What is the Gemma research paper about?" +``` + +## Default Test Prompts + +The sample automatically runs test prompts when no `--prompt` is specified: + +**All API variants:** +1. "What reference materials do you have access to?" +2. "Can you describe the sample chart that was provided to you?" +3. "How do the inline image and file references in your instructions help you answer questions?" + +**Gemini Developer API only:** +4. "What does the contributing guide document say about best practices?" + +**Vertex AI only (additional prompts):** +5. "What is the Gemma research paper about and what are its key contributions?" +6. "Can you compare the research papers you have access to? Are they related or different?" + +**Gemini Developer API** tests: `inline_data` (image) + Files API `file_data` (uploaded document) +**Vertex AI** tests: `inline_data` (image) + GCS URI `file_data` + HTTPS URL `file_data` (same document via different access methods) + +## How It Works + +1. **Static Instruction Processing**: The `static_instruction` content is processed during agent initialization +2. **Reference Generation**: Non-text parts get references like `[Reference to inline binary data: inline_data_0 ('sample_chart.png', type: image/png)]` in the system instruction +3. **User Content Creation**: The actual binary data/file references are moved to user contents with proper role attribution +4. **Model Understanding**: The model receives both the descriptive references and the actual content for analysis + +## Code Structure + +- `agent.py`: Defines the agent with static instruction containing mixed content +- `main.py`: Runnable script with interactive and single-prompt modes +- `__init__.py`: Package initialization following ADK conventions + +This sample serves as a test case for the static instruction with non-text parts feature using both `inline_data` and `file_data`. \ No newline at end of file diff --git a/contributing/samples/static_non_text_content/__init__.py b/contributing/samples/static_non_text_content/__init__.py new file mode 100644 index 0000000000..2192c5ee2a --- /dev/null +++ b/contributing/samples/static_non_text_content/__init__.py @@ -0,0 +1,17 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Static non-text content sample agent package.""" + +from . import agent diff --git a/contributing/samples/static_non_text_content/agent.py b/contributing/samples/static_non_text_content/agent.py new file mode 100644 index 0000000000..58869155a3 --- /dev/null +++ b/contributing/samples/static_non_text_content/agent.py @@ -0,0 +1,227 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Static non-text content sample agent demonstrating static instructions with non-text parts.""" + +import base64 + +from dotenv import load_dotenv +from google.adk.agents.llm_agent import Agent +from google.genai import types + +# Load environment variables from .env file +load_dotenv() + +# Sample image data (a simple 1x1 yellow pixel PNG) +SAMPLE_IMAGE_DATA = base64.b64decode( + "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==" +) + +# Sample document content (simplified contributing guide) +SAMPLE_DOCUMENT = """# Contributing Guide + +## Best Practices + +1. **Code Quality**: Always write clean, well-documented code +2. **Testing**: Include comprehensive tests for new features +3. **Documentation**: Update documentation when adding new functionality +4. **Review Process**: Submit pull requests for code review +5. **Conventions**: Follow established coding conventions and style guides + +## Guidelines + +- Use meaningful variable and function names +- Write descriptive commit messages +- Keep functions small and focused +- Handle errors gracefully +- Consider performance implications +- Maintain backward compatibility when possible + +This guide helps ensure consistent, high-quality contributions to the project. +""" + + +def create_static_instruction_with_file_upload(): + """Create static instruction content with both inline_data and file_data. + + This function creates a static instruction that demonstrates both inline_data + (for images) and file_data (for documents). Always includes Files API upload, + and adds additional GCS file reference when using Vertex AI. + """ + import os + import tempfile + + from google.adk.utils.variant_utils import get_google_llm_variant + from google.adk.utils.variant_utils import GoogleLLMVariant + + from google import genai + + # Determine API variant + api_variant = get_google_llm_variant() + print(f"Using API variant: {api_variant}") + + # Prepare file data parts based on API variant + file_data_parts = [] + + if api_variant == GoogleLLMVariant.VERTEX_AI: + print("Using Vertex AI - adding GCS URI and HTTPS URL references") + + # Add GCS file reference + file_data_parts.append( + types.Part( + file_data=types.FileData( + file_uri=( + "gs://cloud-samples-data/generative-ai/pdf/2403.05530.pdf" + ), + mime_type="application/pdf", + display_name="Gemma Research Paper", + ) + ) + ) + + # Add the same document via HTTPS URL to demonstrate both access methods + file_data_parts.append( + types.Part( + file_data=types.FileData( + file_uri="https://storage.googleapis.com/cloud-samples-data/generative-ai/pdf/2403.05530.pdf", + mime_type="application/pdf", + display_name="AI Research Paper (HTTPS)", + ) + ) + ) + + additional_text = ( + " You also have access to a Gemma research paper from GCS" + " and an AI research paper from HTTPS URL." + ) + + else: + print("Using Gemini Developer API - uploading to Files API") + client = genai.Client() + + # Check if file already exists + display_name = "Contributing Guide" + uploaded_file = None + + # List existing files to see if we already uploaded this document + existing_files = client.files.list() + for file in existing_files: + if file.display_name == display_name: + uploaded_file = file + print(f"Reusing existing file: {file.name} ({file.display_name})") + break + + # If file doesn't exist, upload it + if uploaded_file is None: + # Create a temporary file with the sample document + with tempfile.NamedTemporaryFile( + mode="w", suffix=".md", delete=False + ) as f: + f.write(SAMPLE_DOCUMENT) + temp_file_path = f.name + + try: + # Upload the file to Gemini Files API + uploaded_file = client.files.upload(file=temp_file_path) + print( + "Uploaded new file:" + f" {uploaded_file.name} ({uploaded_file.display_name})" + ) + finally: + # Clean up temporary file + if os.path.exists(temp_file_path): + os.unlink(temp_file_path) + + # Add Files API file data part + file_data_parts.append( + types.Part( + file_data=types.FileData( + file_uri=uploaded_file.uri, + mime_type="text/markdown", + display_name="Contributing Guide", + ) + ) + ) + + additional_text = ( + " You also have access to the contributing guide document." + ) + + # Create static instruction with mixed content + parts = [ + types.Part.from_text( + text=( + "You are an AI assistant that analyzes images and documents." + " You have access to the following reference materials:" + ) + ), + # Add a sample image as inline_data + types.Part( + inline_data=types.Blob( + data=SAMPLE_IMAGE_DATA, + mime_type="image/png", + display_name="sample_chart.png", + ) + ), + types.Part.from_text( + text=f"This is a sample chart showing color data.{additional_text}" + ), + ] + + # Add all file_data parts + parts.extend(file_data_parts) + + # Add instruction text + if api_variant == GoogleLLMVariant.VERTEX_AI: + instruction_text = """ +When users ask questions, you should: +1. Use the reference chart above to provide context when discussing visual data or charts +2. Reference the Gemma research paper (from GCS) when discussing AI research, model architectures, or technical details +3. Reference the AI research paper (from HTTPS) when discussing research topics +4. Be helpful and informative in your responses +5. Explain how the provided reference materials relate to their questions""" + else: + instruction_text = """ +When users ask questions, you should: +1. Use the reference chart above to provide context when discussing visual data or charts +2. Reference the contributing guide document when explaining best practices and guidelines +3. Be helpful and informative in your responses +4. Explain how the provided reference materials relate to their questions""" + + instruction_text += """ + +Remember: The reference materials above are available to help you provide better answers.""" + + parts.append(types.Part.from_text(text=instruction_text)) + + static_instruction_content = types.Content(parts=parts) + + return static_instruction_content + + +# Create the root agent with Files API integration +root_agent = Agent( + model="gemini-2.5-flash", + name="static_non_text_content_demo_agent", + description=( + "Demonstrates static instructions with non-text content (inline_data" + " and file_data features)" + ), + static_instruction=create_static_instruction_with_file_upload(), + instruction=( + "Please analyze the user's question and provide helpful insights." + " Reference the materials provided in your static instructions when" + " relevant." + ), +) diff --git a/contributing/samples/static_non_text_content/main.py b/contributing/samples/static_non_text_content/main.py new file mode 100644 index 0000000000..1c9301c49a --- /dev/null +++ b/contributing/samples/static_non_text_content/main.py @@ -0,0 +1,223 @@ +"""Static non-text content sample agent main script.""" + +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import asyncio +import logging +import sys +import time + +from google.adk.cli.utils import logs +from google.adk.runners import InMemoryRunner + +from . import agent + +APP_NAME = "static_non_text_content_demo" +USER_ID = "demo_user" + +logs.setup_adk_logger(level=logging.INFO) + + +async def call_agent_async( + runner, user_id: str, session_id: str, prompt: str +) -> str: + """Helper function to call agent and return final response.""" + from google.adk.agents.run_config import RunConfig + from google.genai import types + + content = types.Content( + role="user", parts=[types.Part.from_text(text=prompt)] + ) + + final_response_text = "" + async for event in runner.run_async( + user_id=user_id, + session_id=session_id, + new_message=content, + run_config=RunConfig(save_input_blobs_as_artifacts=False), + ): + if event.content and event.content.parts: + if text := "".join(part.text or "" for part in event.content.parts): + if event.author != "user": + final_response_text += text + + return final_response_text or "No response received" + + +def process_arguments(): + """Parses command-line arguments.""" + parser = argparse.ArgumentParser( + description=( + "A demo script that tests static instructions with non-text content." + ), + epilog=( + "Example usage: \n\tpython -m static_non_text_content.main --prompt" + " 'What can you see in the reference chart?'\n\tpython -m" + " static_non_text_content.main --prompt 'What is the Gemma research" + " paper about?'\n\tpython -m static_non_text_content.main # Runs" + " default test prompts\n\tadk run" + " contributing/samples/static_non_text_content # Interactive mode\n" + ), + formatter_class=argparse.RawTextHelpFormatter, + ) + + parser.add_argument( + "--prompt", + type=str, + help=( + "Single prompt to send to the agent. If not provided, runs" + " default test prompts." + ), + ) + + parser.add_argument( + "--debug", + action="store_true", + help="Enable debug logging to see internal processing details.", + ) + + return parser.parse_args() + + +async def run_default_test_prompts(runner): + """Run default test prompts to demonstrate static content features.""" + from google.adk.utils.variant_utils import get_google_llm_variant + from google.adk.utils.variant_utils import GoogleLLMVariant + + api_variant = get_google_llm_variant() + + print("=== Static Non-Text Content Demo Agent - Default Test Prompts ===") + print( + "Running test prompts to demonstrate inline_data and file_data" + " features..." + ) + print(f"API Variant: {api_variant}") + print( + "Use 'adk run contributing/samples/static_non_text_content' for" + " interactive mode.\n" + ) + + # Create session + session = await runner.session_service.create_session( + app_name=APP_NAME, user_id=USER_ID + ) + + # Common test prompts for all API variants + test_prompts = [ + "What reference materials do you have access to?", + "Can you describe the sample chart that was provided to you?", + ( + "How do the inline image and file references in your instructions " + "help you answer questions?" + ), + ] + + # Add API-specific prompts + if api_variant == GoogleLLMVariant.VERTEX_AI: + # Vertex AI has research papers instead of contributing guide + test_prompts.extend([ + ( + "What is the Gemma research paper about and what are its key " + "contributions?" + ), + ( + "Can you compare the research papers you have access to? Are they " + "related or different?" + ), + ]) + else: + # Gemini Developer API has contributing guide document + test_prompts.append( + "What does the contributing guide document say about best practices?" + ) + + for i, prompt in enumerate(test_prompts, 1): + print(f"Test {i}/{len(test_prompts)}: {prompt}") + print("-" * 60) + + try: + response = await call_agent_async(runner, USER_ID, session.id, prompt) + print(f"Response: {response}") + except (ConnectionError, TimeoutError, ValueError) as e: + print(f"Error: {e}") + + print(f"\n{'=' * 60}\n") + + +async def single_prompt_mode(runner, prompt: str): + """Run the agent with a single prompt.""" + print("=== Static Non-Text Content Demo Agent - Single Prompt Mode ===") + print(f"Prompt: {prompt}") + print("-" * 50) + + # Create session + session = await runner.session_service.create_session( + app_name=APP_NAME, user_id=USER_ID + ) + + response = await call_agent_async(runner, USER_ID, session.id, prompt) + print(f"Agent Response:\n{response}") + + +async def main(): + args = process_arguments() + + if args.debug: + logs.setup_adk_logger(level=logging.DEBUG) + print("Debug logging enabled. You'll see internal processing details.\n") + + print("Initializing Static Non-Text Content Demo Agent...") + print(f"Agent: {agent.root_agent.name}") + print(f"Model: {agent.root_agent.model}") + print(f"Description: {agent.root_agent.description}") + + # Show information about static instruction content + if agent.root_agent.static_instruction: + static_parts = agent.root_agent.static_instruction.parts + text_parts = sum(1 for part in static_parts if part.text) + image_parts = sum(1 for part in static_parts if part.inline_data) + file_parts = sum(1 for part in static_parts if part.file_data) + + print("Static instruction contains:") + print(f" - {text_parts} text parts") + print(f" - {image_parts} inline image(s)") + print(f" - {file_parts} file reference(s)") + + print("-" * 50) + + runner = InMemoryRunner( + agent=agent.root_agent, + app_name=APP_NAME, + ) + + if args.prompt: + await single_prompt_mode(runner, args.prompt) + else: + await run_default_test_prompts(runner) + + +if __name__ == "__main__": + start_time = time.time() + try: + asyncio.run(main()) + except KeyboardInterrupt: + print("\nExiting...") + except Exception as e: + print(f"Unexpected error: {e}", file=sys.stderr) + sys.exit(1) + finally: + end_time = time.time() + print(f"\nExecution time: {end_time - start_time:.2f} seconds") diff --git a/contributing/samples/vertex_code_execution/README.md b/contributing/samples/vertex_code_execution/README.md new file mode 100644 index 0000000000..121de737c0 --- /dev/null +++ b/contributing/samples/vertex_code_execution/README.md @@ -0,0 +1,59 @@ +# Vertex AI Code Execution Agent Sample + +This directory contains a sample agent that demonstrates how to use the +`VertexAiCodeExecutor` for data science tasks. + +## Overview + +The agent is designed to assist with data analysis in a Python environment. It +can execute Python code to perform tasks like data manipulation, analysis, and +visualization. This agent is particularly useful for tasks that require a secure +and sandboxed code execution environment with common data science libraries +pre-installed. + +This sample is a direct counterpart to the +[code execution sample](../code_execution/) which uses the +`BuiltInCodeExecutor`. The key difference in this sample is the use of +`VertexAiCodeExecutor`. + +## `VertexAiCodeExecutor` + +The `VertexAiCodeExecutor` leverages the +[Vertex AI Code Interpreter Extension](https://cloud.google.com/vertex-ai/generative-ai/docs/extensions/code-interpreter) +to run Python code. This provides several advantages: + +- **Security**: Code is executed in a sandboxed environment on Google Cloud, + isolating it from your local system. +- **Pre-installed Libraries**: The environment comes with many common Python + data science libraries pre-installed, such as `pandas`, `numpy`, and + `matplotlib`. +- **Stateful Execution**: The execution environment is stateful, meaning + variables and data from one code execution are available in subsequent + executions within the same session. + +## How to use + +### Prerequisites + +Ensure you have configured your environment for using +[Google Cloud Vertex AI](https://google.github.io/adk-docs/get-started/quickstart/#gemini---google-cloud-vertex-ai). +You will need to have a Google Cloud Project with the Vertex AI API enabled. + +### Running the agent + +You can run this agent using the ADK CLI from the root of the repository. + +To interact with the agent through the command line: + +```bash +adk run contributing/samples/vertex_code_execution "Plot a sine wave from 0 to 10" +``` + +To use the web interface: + +```bash +adk web contributing/samples/ +``` + +Then select `vertex_code_execution` from the list of agents and interact with +it. diff --git a/contributing/samples/vertex_code_execution/__init__.py b/contributing/samples/vertex_code_execution/__init__.py new file mode 100644 index 0000000000..c48963cdc7 --- /dev/null +++ b/contributing/samples/vertex_code_execution/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/contributing/samples/vertex_code_execution/agent.py b/contributing/samples/vertex_code_execution/agent.py new file mode 100644 index 0000000000..39ad65d3ac --- /dev/null +++ b/contributing/samples/vertex_code_execution/agent.py @@ -0,0 +1,100 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Data science agent that uses Vertex AI code interpreter.""" + +from google.adk.agents.llm_agent import Agent +from google.adk.code_executors.vertex_ai_code_executor import VertexAiCodeExecutor + + +def base_system_instruction(): + """Returns: data science agent system instruction.""" + + return """ + # Guidelines + + **Objective:** Assist the user in achieving their data analysis goals within the context of a Python Colab notebook, **with emphasis on avoiding assumptions and ensuring accuracy.** Reaching that goal can involve multiple steps. When you need to generate code, you **don't** need to solve the goal in one go. Only generate the next step at a time. + + **Code Execution:** All code snippets provided will be executed within the Colab environment. + + **Statefulness:** All code snippets are executed and the variables stays in the environment. You NEVER need to re-initialize variables. You NEVER need to reload files. You NEVER need to re-import libraries. + + **Imported Libraries:** The following libraries are ALREADY imported and should NEVER be imported again: + + ```tool_code + import io + import math + import re + import matplotlib.pyplot as plt + import numpy as np + import pandas as pd + import scipy + ``` + + **Output Visibility:** Always print the output of code execution to visualize results, especially for data exploration and analysis. For example: + - To look a the shape of a pandas.DataFrame do: + ```tool_code + print(df.shape) + ``` + The output will be presented to you as: + ```tool_outputs + (49, 7) + + ``` + - To display the result of a numerical computation: + ```tool_code + x = 10 ** 9 - 12 ** 5 + print(f'{{x=}}') + ``` + The output will be presented to you as: + ```tool_outputs + x=999751168 + + ``` + - You **never** generate ```tool_outputs yourself. + - You can then use this output to decide on next steps. + - Print just variables (e.g., `print(f'{{variable=}}')`. + + **No Assumptions:** **Crucially, avoid making assumptions about the nature of the data or column names.** Base findings solely on the data itself. Always use the information obtained from `explore_df` to guide your analysis. + + **Available files:** Only use the files that are available as specified in the list of available files. + + **Data in prompt:** Some queries contain the input data directly in the prompt. You have to parse that data into a pandas DataFrame. ALWAYS parse all the data. NEVER edit the data that are given to you. + + **Answerability:** Some queries may not be answerable with the available data. In those cases, inform the user why you cannot process their query and suggest what type of data would be needed to fulfill their request. + + """ + + +root_agent = Agent( + model="gemini-2.5-flash", + name="data_science_agent", + instruction=base_system_instruction() + """ + + +You need to assist the user with their queries by looking at the data and the context in the conversation. +You final answer should summarize the code and code execution relavant to the user query. + +You should include all pieces of data to answer the user query, such as the table from code execution results. +If you cannot answer the question directly, you should follow the guidelines above to generate the next step. +If the question can be answered directly with writing any code, you should do that. +If you doesn't have enough data to answer the question, you should ask for clarification from the user. + +You should NEVER install any package on your own like `pip install ...`. +When plotting trends, you should make sure to sort and order the data by the x-axis. + + +""", + code_executor=VertexAiCodeExecutor(), +) diff --git a/contributing/samples/workflow_triage/agent.py b/contributing/samples/workflow_triage/agent.py index 88a863d92a..b39e86eb87 100755 --- a/contributing/samples/workflow_triage/agent.py +++ b/contributing/samples/workflow_triage/agent.py @@ -40,15 +40,15 @@ def update_execution_plan( 1. Analyze the user input and decide any worker agents that are relevant; 2. If none of the worker agents are relevant, you should explain to user that no relevant agents are available and ask for something else; -2. Update the execution plan with the relevant worker agents using `update_execution_plan` tool. -3. Transfer control to the plan_execution_agent for the actual plan execution. +3. Update the execution plan with the relevant worker agents using `update_execution_plan` tool. +4. Transfer control to the plan_execution_agent for the actual plan execution. When calling the `update_execution_plan` tool, you should pass the list of worker agents that are relevant to user's input. NOTE: * If you are not clear about user's intent, you should ask for clarification first; -* Only after you're clear about user's intent, you can proceed to step #2. +* Only after you're clear about user's intent, you can proceed to step #3. """, sub_agents=[ execution_agent.plan_execution_agent, diff --git a/llms-full.txt b/llms-full.txt index a053d5d778..4c744512e4 100644 --- a/llms-full.txt +++ b/llms-full.txt @@ -92,7 +92,7 @@ from google.adk.tools import google_search root_agent = Agent( name="search_assistant", - model="gemini-2.0-flash", # Or your preferred Gemini model + model="gemini-2.5-flash", # Or your preferred Gemini model instruction="You are a helpful assistant. Answer user questions using Google Search when needed.", description="An assistant that can search the web.", tools=[google_search] @@ -107,13 +107,13 @@ Define a multi-agent system with coordinator agent, greeter agent, and task exec from google.adk.agents import LlmAgent, BaseAgent # Define individual agents -greeter = LlmAgent(name="greeter", model="gemini-2.0-flash", ...) -task_executor = LlmAgent(name="task_executor", model="gemini-2.0-flash", ...) +greeter = LlmAgent(name="greeter", model="gemini-2.5-flash", ...) +task_executor = LlmAgent(name="task_executor", model="gemini-2.5-flash", ...) # Create parent agent and assign children via sub_agents coordinator = LlmAgent( name="Coordinator", - model="gemini-2.0-flash", + model="gemini-2.5-flash", description="I coordinate greetings and tasks.", sub_agents=[ # Assign sub_agents here greeter, @@ -432,7 +432,7 @@ These are standard `LlmAgent` definitions, responsible for specific tasks. Their === "Python" ```python - GEMINI_2_FLASH = "gemini-2.0-flash" # Define model constant + GEMINI_2_FLASH = "gemini-2.5-flash" # Define model constant # --- Define the individual LLM agents --- story_generator = LlmAgent( name="StoryGenerator", @@ -597,7 +597,7 @@ Finally, you instantiate your `StoryFlowAgent` and use the `Runner` as usual. APP_NAME = "story_app" USER_ID = "12345" SESSION_ID = "123344" - GEMINI_2_FLASH = "gemini-2.0-flash" + GEMINI_2_FLASH = "gemini-2.5-flash" # --- Configure Logging --- logging.basicConfig(level=logging.INFO) @@ -951,7 +951,7 @@ First, you need to establish what the agent *is* and what it's *for*. inquiries about current billing statements," not just "Billing agent"). * **`model` (Required):** Specify the underlying LLM that will power this - agent's reasoning. This is a string identifier like `"gemini-2.0-flash"`. The + agent's reasoning. This is a string identifier like `"gemini-2.5-flash"`. The choice of model impacts the agent's capabilities, cost, and performance. See the [Models](models.md) page for available options and considerations. @@ -960,7 +960,7 @@ First, you need to establish what the agent *is* and what it's *for*. ```python # Example: Defining the basic identity capital_agent = LlmAgent( - model="gemini-2.0-flash", + model="gemini-2.5-flash", name="capital_agent", description="Answers user questions about the capital city of a given country." # instruction and tools will be added next @@ -1003,7 +1003,7 @@ tells the agent: ```python # Example: Adding instructions capital_agent = LlmAgent( - model="gemini-2.0-flash", + model="gemini-2.5-flash", name="capital_agent", description="Answers user questions about the capital city of a given country.", instruction="""You are an agent that provides the capital city of a country. @@ -1053,7 +1053,7 @@ on the conversation and its instructions. # Add the tool to the agent capital_agent = LlmAgent( - model="gemini-2.0-flash", + model="gemini-2.5-flash", name="capital_agent", description="Answers user questions about the capital city of a given country.", instruction="""You are an agent that provides the capital city of a country... (previous instruction text)""", @@ -1185,7 +1185,7 @@ For more complex reasoning involving multiple steps or executing code: USER_ID = "test_user_456" SESSION_ID_TOOL_AGENT = "session_tool_agent_xyz" SESSION_ID_SCHEMA_AGENT = "session_schema_agent_xyz" - MODEL_NAME = "gemini-2.0-flash" + MODEL_NAME = "gemini-2.5-flash" # --- 2. Define Schemas --- @@ -1441,7 +1441,7 @@ export GOOGLE_GENAI_USE_VERTEXAI=FALSE # --- Example using a stable Gemini Flash model --- agent_gemini_flash = LlmAgent( # Use the latest stable Flash model identifier - model="gemini-2.0-flash", + model="gemini-2.5-flash", name="gemini_flash_agent", instruction="You are a fast and helpful Gemini assistant.", # ... other agent parameters @@ -1453,7 +1453,7 @@ export GOOGLE_GENAI_USE_VERTEXAI=FALSE # different availability or quota limitations. agent_gemini_pro = LlmAgent( # Use the latest generally available Pro model identifier - model="gemini-2.5-pro-preview-03-25", + model="gemini-2.5-pro", name="gemini_pro_agent", instruction="You are a powerful and knowledgeable Gemini assistant.", # ... other agent parameters @@ -2009,13 +2009,13 @@ The foundation for structuring multi-agent systems is the parent-child relations from google.adk.agents import LlmAgent, BaseAgent # Define individual agents - greeter = LlmAgent(name="Greeter", model="gemini-2.0-flash") + greeter = LlmAgent(name="Greeter", model="gemini-2.5-flash") task_doer = BaseAgent(name="TaskExecutor") # Custom non-LLM agent # Create parent agent and assign children via sub_agents coordinator = LlmAgent( name="Coordinator", - model="gemini-2.0-flash", + model="gemini-2.5-flash", description="I coordinate greetings and tasks.", sub_agents=[ # Assign sub_agents here greeter, @@ -2163,7 +2163,7 @@ Leverages an [`LlmAgent`](llm-agents.md)'s understanding to dynamically route ta coordinator = LlmAgent( name="Coordinator", - model="gemini-2.0-flash", + model="gemini-2.5-flash", instruction="You are an assistant. Delegate booking tasks to Booker and info requests to Info.", description="Main coordinator.", # AutoFlow is typically used implicitly here @@ -2212,7 +2212,7 @@ Allows an [`LlmAgent`](llm-agents.md) to treat another `BaseAgent` instance as a # Parent agent uses the AgentTool artist_agent = LlmAgent( name="Artist", - model="gemini-2.0-flash", + model="gemini-2.5-flash", instruction="Create a prompt and use the ImageGen tool to generate the image.", tools=[image_tool] # Include the AgentTool ) @@ -2251,7 +2251,7 @@ By combining ADK's composition primitives, you can implement various established coordinator = LlmAgent( name="HelpDeskCoordinator", - model="gemini-2.0-flash", + model="gemini-2.5-flash", instruction="Route user requests: Use Billing agent for payment issues, Support agent for technical problems.", description="Main help desk router.", # allow_transfer=True is often implicit with sub_agents in AutoFlow @@ -2357,7 +2357,7 @@ By combining ADK's composition primitives, you can implement various established # Mid-level agent combining tools research_assistant = LlmAgent( name="ResearchAssistant", - model="gemini-2.0-flash", + model="gemini-2.5-flash", description="Finds and summarizes information on a topic.", tools=[agent_tool.AgentTool(agent=web_searcher), agent_tool.AgentTool(agent=summarizer)] ) @@ -2365,7 +2365,7 @@ By combining ADK's composition primitives, you can implement various established # High-level agent delegating research report_writer = LlmAgent( name="ReportWriter", - model="gemini-2.0-flash", + model="gemini-2.5-flash", instruction="Write a report on topic X. Use the ResearchAssistant to gather information.", tools=[agent_tool.AgentTool(agent=research_assistant)] # Alternatively, could use LLM Transfer if research_assistant is a sub_agent @@ -2641,7 +2641,7 @@ In this setup, the `LoopAgent` would manage the iterative process. The `CriticA APP_NAME = "doc_writing_app_v3" # New App Name USER_ID = "dev_user_01" SESSION_ID_BASE = "loop_exit_tool_session" # New Base Session ID - GEMINI_MODEL = "gemini-2.0-flash" + GEMINI_MODEL = "gemini-2.5-flash" STATE_INITIAL_TOPIC = "initial_topic" # --- State Keys --- STATE_CURRENT_DOC = "current_document" @@ -3171,7 +3171,7 @@ Understanding artifacts involves grasping a few key components: the service that from google.adk.sessions import InMemorySessionService # Example: Configuring the Runner with an Artifact Service - my_agent = LlmAgent(name="artifact_user_agent", model="gemini-2.0-flash") + my_agent = LlmAgent(name="artifact_user_agent", model="gemini-2.5-flash") artifact_service = InMemoryArtifactService() # Choose an implementation session_service = InMemorySessionService() @@ -3290,7 +3290,7 @@ Before you can use any artifact methods via the context objects, you **must** pr from google.adk.sessions import InMemorySessionService # Your agent definition - agent = LlmAgent(name="my_agent", model="gemini-2.0-flash") + agent = LlmAgent(name="my_agent", model="gemini-2.5-flash") # Instantiate the desired artifact service artifact_service = InMemoryArtifactService() @@ -3663,7 +3663,7 @@ Callbacks are a cornerstone feature of ADK, providing a powerful mechanism to ho # --- Register it during Agent creation --- my_agent = LlmAgent( name="MyCallbackAgent", - model="gemini-2.0-flash", # Or your desired model + model="gemini-2.5-flash", # Or your desired model instruction="Be helpful.", # Other agent parameters... before_model_callback=my_before_model_logic # Pass the function here @@ -3726,7 +3726,7 @@ from typing import Optional from google.genai import types from google.adk.sessions import InMemorySessionService -GEMINI_2_FLASH="gemini-2.0-flash" +GEMINI_2_FLASH="gemini-2.5-flash" # --- Define the Callback Function --- def simple_before_model_modifier( @@ -3839,7 +3839,7 @@ await call_agent_async("write a joke on BLOCK") from google.genai import types from google.adk.sessions import InMemorySessionService - GEMINI_2_FLASH="gemini-2.0-flash" + GEMINI_2_FLASH="gemini-2.5-flash" # --- Define the Callback Function --- def simple_before_model_modifier( @@ -3990,7 +3990,7 @@ These callbacks are available on *any* agent that inherits from `BaseAgent` (inc from typing import Optional # Define the model - Use the specific model name requested - GEMINI_2_FLASH="gemini-2.0-flash" + GEMINI_2_FLASH="gemini-2.5-flash" # --- 1. Define the Callback Function --- def check_if_agent_should_run(callback_context: CallbackContext) -> Optional[types.Content]: @@ -4157,7 +4157,7 @@ These callbacks are available on *any* agent that inherits from `BaseAgent` (inc from typing import Optional # Define the model - Use the specific model name requested - GEMINI_2_FLASH="gemini-2.0-flash" + GEMINI_2_FLASH="gemini-2.5-flash" # --- 1. Define the Callback Function --- def modify_output_after_agent(callback_context: CallbackContext) -> Optional[types.Content]: @@ -4319,7 +4319,7 @@ If the callback returns `None` (or a `Maybe.empty()` object in Java), the LLM co from google.genai import types from google.adk.sessions import InMemorySessionService - GEMINI_2_FLASH="gemini-2.0-flash" + GEMINI_2_FLASH="gemini-2.5-flash" # --- Define the Callback Function --- def simple_before_model_modifier( @@ -4449,7 +4449,7 @@ If the callback returns `None` (or a `Maybe.empty()` object in Java), the LLM co from google.adk.sessions import InMemorySessionService from google.adk.models import LlmResponse - GEMINI_2_FLASH="gemini-2.0-flash" + GEMINI_2_FLASH="gemini-2.5-flash" # --- Define the Callback Function --- def simple_after_model_modifier( @@ -4592,7 +4592,7 @@ These callbacks are also specific to `LlmAgent` and trigger around the execution from typing import Dict, Any - GEMINI_2_FLASH="gemini-2.0-flash" + GEMINI_2_FLASH="gemini-2.5-flash" def get_capital_city(country: str) -> str: """Retrieves the capital city of a given country.""" @@ -4712,7 +4712,7 @@ These callbacks are also specific to `LlmAgent` and trigger around the execution from typing import Dict, Any from copy import deepcopy - GEMINI_2_FLASH="gemini-2.0-flash" + GEMINI_2_FLASH="gemini-2.5-flash" # --- Define a Simple Tool Function (Same as before) --- def get_capital_city(country: str) -> str: @@ -5703,7 +5703,7 @@ def get_current_time(city: str) -> dict: root_agent = Agent( name="weather_time_agent", - model="gemini-2.0-flash", + model="gemini-2.5-flash", description=( "Agent to answer questions about the time and weather in a city." ), @@ -7010,7 +7010,7 @@ This approach involves creating individual test files, each representing a singl - `Expected Intermediate Agent Responses`: These are the natural language responses that the agent (or sub-agents) generates as it moves towards generating a final answer. These natural language responses are usually an - artifact of an multi-agent system, where your root agent depends on sub-agents to achieve a goal. These intermediate responses, may or may not be of + artifact of a multi-agent system, where your root agent depends on sub-agents to achieve a goal. These intermediate responses, may or may not be of interest to the end user, but for a developer/owner of the system, are of critical importance, as they give you the confidence that the agent went through the right path to generate final response. @@ -8214,7 +8214,7 @@ application entirely on your machine and is recommended for internal development root_agent = Agent( name="weather_time_agent", - model="gemini-2.0-flash", + model="gemini-2.5-flash", description=( "Agent to answer questions about the time and weather in a city." ), @@ -8387,7 +8387,7 @@ agent will be unable to function. ```py root_agent = Agent( name="weather_time_agent", - model="replace-me-with-model-id", #e.g. gemini-2.0-flash-live-001 + model="replace-me-with-model-id", #e.g. gemini-2.5-flash-live-001 ... ``` @@ -8628,7 +8628,7 @@ Create the **ScienceTeacherAgent.java** file under the `src/main/java/agents/` d !!!note "Troubleshooting" - The model `gemini-2.0-flash-exp` will be deprecated in the future. If you see any issues on using it, try using `gemini-2.0-flash-live-001` instead + The model `gemini-2.5-flash-exp` will be deprecated in the future. If you see any issues on using it, try using `gemini-2.5-flash-live-001` instead We will use `Dev UI` to run this agent later. For the tool to automatically recognize the agent, its Java class has to comply with the following two rules: @@ -8903,7 +8903,7 @@ root_agent = Agent( # The Large Language Model (LLM) that agent will use. # Please fill in the latest model id that supports live from # https://google.github.io/adk-docs/get-started/streaming/quickstart-streaming/#supported-models - model="...", # for example: model="gemini-2.0-flash-live-001" or model="gemini-2.0-flash-live-preview-04-09" + model="...", # for example: model="gemini-2.5-flash-live-001" or model="gemini-2.5-flash-live-preview-04-09" # A short description of the agent's purpose. description="Agent to answer questions using Google Search.", # Instructions to set the agent's behavior. @@ -9102,7 +9102,7 @@ Let's break down what's happening: replace `u_123` with a specific user ID, and `s_123` with a specific session ID. * `{"state": {"key1": "value1", "key2": 42}}`: This is optional. You can use - this to customize the agent's pre-existing state (dict) when creating the + this to customize the agent's preexisting state (dict) when creating the session. This should return the session information if it was created successfully. The @@ -9505,7 +9505,7 @@ def get_weather(city: str) -> dict: # Create an agent with tools agent = Agent( name="weather_agent", - model="gemini-2.0-flash-exp", + model="gemini-2.5-flash-exp", description="Agent to answer questions using weather tools.", instruction="You must use the available tools to find an answer.", tools=[get_weather] @@ -9640,7 +9640,7 @@ def get_weather(city: str) -> dict: # Create an agent with tools agent = Agent( name="weather_agent", - model="gemini-2.0-flash-exp", + model="gemini-2.5-flash-exp", description="Agent to answer questions using weather tools.", instruction="You must use the available tools to find an answer.", tools=[get_weather] @@ -10403,7 +10403,7 @@ When modifications to the tools to add guardrails aren't possible, the [**`Befor # Hypothetical Agent setup root_agent = LlmAgent( # Use specific agent type - model='gemini-2.0-flash', + model='gemini-2.5-flash', name='root_agent', instruction="...", before_tool_callback=validate_tool_params, # Assign the callback @@ -10650,7 +10650,7 @@ This example demonstrates the basic flow using the `InMemory` services for simpl # --- Constants --- APP_NAME = "memory_example_app" USER_ID = "mem_user" - MODEL = "gemini-2.0-flash" # Use a valid model + MODEL = "gemini-2.5-flash" # Use a valid model # --- Agent Definitions --- # Agent 1: Simple agent to capture information @@ -11031,7 +11031,7 @@ This is the simplest method for saving an agent's final text response directly i # Define agent with output_key greeting_agent = LlmAgent( name="Greeter", - model="gemini-2.0-flash", # Use a valid model + model="gemini-2.5-flash", # Use a valid model instruction="Generate a short, friendly greeting.", output_key="last_greeting" # Save response to state['last_greeting'] ) @@ -11339,15 +11339,15 @@ from google.adk.tools import google_search # Import the tool root_agent = Agent( name="google_search_agent", - model="gemini-2.0-flash-exp", # if this model does not work, try below - #model="gemini-2.0-flash-live-001", + model="gemini-2.5-flash-exp", # if this model does not work, try below + #model="gemini-2.5-flash-live-001", description="Agent to answer questions using Google Search.", instruction="Answer the question using the Google Search tool.", tools=[google_search], ) ``` -**Note:** To enable both text and audio/video input, the model must support the generateContent (for text) and bidiGenerateContent methods. Verify these capabilities by referring to the [List Models Documentation](https://ai.google.dev/api/models#method:-models.list). This quickstart utilizes the gemini-2.0-flash-exp model for demonstration purposes. +**Note:** To enable both text and audio/video input, the model must support the generateContent (for text) and bidiGenerateContent methods. Verify these capabilities by referring to the [List Models Documentation](https://ai.google.dev/api/models#method:-models.list). This quickstart utilizes the gemini-2.5-flash-exp model for demonstration purposes. Notice how easily you integrated [grounding with Google Search](https://ai.google.dev/gemini-api/docs/grounding?lang=python#configure-search) capabilities. The `Agent` class and the `google_search` tool handle the complex interactions with the LLM and grounding with the search API, allowing you to focus on the agent's *purpose* and *behavior*. @@ -11406,7 +11406,7 @@ These console logs are important in case you develop your own streaming applicat 6\. **Troubleshooting tips** - **When `ws://` doesn't work:** If you see any errors on the Chrome DevTools with regard to `ws://` connection, try replacing `ws://` with `wss://` on `app/static/js/app.js` at line 28. This may happen when you are running the sample on a cloud environment and using a proxy connection to connect from your browser. -- **When `gemini-2.0-flash-exp` model doesn't work:** If you see any errors on the app server console with regard to `gemini-2.0-flash-exp` model availability, try replacing it with `gemini-2.0-flash-live-001` on `app/google_search_agent/agent.py` at line 6. +- **When `gemini-2.5-flash-exp` model doesn't work:** If you see any errors on the app server console with regard to `gemini-2.5-flash-exp` model availability, try replacing it with `gemini-2.5-flash-live-001` on `app/google_search_agent/agent.py` at line 6. ## 4. Server code overview {#4.-server-side-code-overview} @@ -12092,7 +12092,7 @@ These console logs are important in case you develop your own streaming applicat 6\. **Troubleshooting tips** - **When your browser can't connect to the server via SSH proxy:** SSH proxy used in various cloud services may not work with SSE. Please try without SSH proxy, such as using a local laptop, or try the [WebSocket](custom-streaming-ws.md) version. -- **When `gemini-2.0-flash-exp` model doesn't work:** If you see any errors on the app server console with regard to `gemini-2.0-flash-exp` model availability, try replacing it with `gemini-2.0-flash-live-001` on `app/google_search_agent/agent.py` at line 6. +- **When `gemini-2.5-flash-exp` model doesn't work:** If you see any errors on the app server console with regard to `gemini-2.5-flash-exp` model availability, try replacing it with `gemini-2.5-flash-live-001` on `app/google_search_agent/agent.py` at line 6. ## 4. Agent definition @@ -12105,8 +12105,8 @@ from google.adk.tools import google_search # Import the tool root_agent = Agent( name="google_search_agent", - model="gemini-2.0-flash-exp", # if this model does not work, try below - #model="gemini-2.0-flash-live-001", + model="gemini-2.5-flash-exp", # if this model does not work, try below + #model="gemini-2.5-flash-live-001", description="Agent to answer questions using Google Search.", instruction="Answer the question using the Google Search tool.", tools=[google_search], @@ -13213,7 +13213,7 @@ async def monitor_video_stream( # Call the model to generate content based on the provided image and prompt response = client.models.generate_content( - model="gemini-2.0-flash-exp", + model="gemini-2.5-flash-exp", contents=contents, config=genai_types.GenerateContentConfig( system_instruction=( @@ -13247,7 +13247,7 @@ def stop_streaming(function_name: str): root_agent = Agent( - model="gemini-2.0-flash-exp", + model="gemini-2.5-flash-exp", name="video_streaming_agent", instruction=""" You are a monitoring agent. You can do video monitoring and stock price monitoring @@ -13315,7 +13315,7 @@ You set up authentication when defining your tool: ## Journey 1: Building Agentic Applications with Authenticated Tools -This section focuses on using pre-existing tools (like those from `RestApiTool/ OpenAPIToolset`, `APIHubToolset`, `GoogleApiToolSet`) that require authentication within your agentic application. Your main responsibility is configuring the tools and handling the client-side part of interactive authentication flows (if required by the tool). +This section focuses on using preexisting tools (like those from `RestApiTool/ OpenAPIToolset`, `APIHubToolset`, `GoogleApiToolSet`) that require authentication within your agentic application. Your main responsibility is configuring the tools and handling the client-side part of interactive authentication flows (if required by the tool). ### 1. Configuring Tools with Authentication @@ -13872,7 +13872,7 @@ except Exception as e: # --- Agent Configuration --- # Configure and create the main LLM Agent. root_agent = LlmAgent( - model='gemini-2.0-flash', + model='gemini-2.5-flash', name='enterprise_assistant', instruction='Help user integrate with multiple enterprise systems, including retrieving user information which may require authentication.', tools=userinfo_toolset.get_tools(), @@ -14341,7 +14341,7 @@ Search. The `google_search` tool is only compatible with Gemini 2 models. root_agent = Agent( name="basic_search_agent", - model="gemini-2.0-flash", + model="gemini-2.5-flash", description="Agent to answer questions using Google Search.", instruction="I can answer your questions by searching the internet. Just ask me anything!", # google_search is a pre-built tool which allows the agent to perform Google searches. @@ -14410,7 +14410,7 @@ like calculations, data manipulation, or running small scripts. APP_NAME = "calculator" USER_ID = "user1234" SESSION_ID = "session_code_exec_async" - GEMINI_MODEL = "gemini-2.0-flash" + GEMINI_MODEL = "gemini-2.5-flash" # Agent Definition code_agent = LlmAgent( @@ -14537,7 +14537,7 @@ APP_NAME_VSEARCH = "vertex_search_app" USER_ID_VSEARCH = "user_vsearch_1" SESSION_ID_VSEARCH = "session_vsearch_1" AGENT_NAME_VSEARCH = "doc_qa_agent" -GEMINI_2_FLASH = "gemini-2.0-flash" +GEMINI_2_FLASH = "gemini-2.5-flash" # Tool Instantiation # You MUST provide your datastore ID here. @@ -14659,7 +14659,7 @@ AGENT_NAME = "bigquery_agent" APP_NAME = "bigquery_app" USER_ID = "user1234" SESSION_ID = "1234" -GEMINI_MODEL = "gemini-2.0-flash" +GEMINI_MODEL = "gemini-2.5-flash" # Define a tool configuration to block any write operations tool_config = BigQueryToolConfig(write_mode=WriteMode.BLOCKED) @@ -14734,7 +14734,7 @@ to use built-in tools with other tools by using multiple agents: search_agent = Agent( - model='gemini-2.0-flash', + model='gemini-2.5-flash', name='SearchAgent', instruction=""" You're a specialist in Google Search @@ -14742,7 +14742,7 @@ to use built-in tools with other tools by using multiple agents: tools=[google_search], ) coding_agent = Agent( - model='gemini-2.0-flash', + model='gemini-2.5-flash', name='CodeAgent', instruction=""" You're a specialist in Code Execution @@ -14751,7 +14751,7 @@ to use built-in tools with other tools by using multiple agents: ) root_agent = Agent( name="RootAgent", - model="gemini-2.0-flash", + model="gemini-2.5-flash", description="Root Agent", tools=[agent_tool.AgentTool(agent=search_agent), agent_tool.AgentTool(agent=coding_agent)], ) @@ -14777,7 +14777,7 @@ to use built-in tools with other tools by using multiple agents: ```py root_agent = Agent( name="RootAgent", - model="gemini-2.0-flash", + model="gemini-2.5-flash", description="Root Agent", tools=[custom_function], executor=[BuiltInCodeExecutor] # <-- not supported when used with tools @@ -14799,7 +14799,7 @@ is **not** currently supported: ```py search_agent = Agent( - model='gemini-2.0-flash', + model='gemini-2.5-flash', name='SearchAgent', instruction=""" You're a specialist in Google Search @@ -14807,7 +14807,7 @@ is **not** currently supported: tools=[google_search], ) coding_agent = Agent( - model='gemini-2.0-flash', + model='gemini-2.5-flash', name='CodeAgent', instruction=""" You're a specialist in Code Execution @@ -14816,7 +14816,7 @@ is **not** currently supported: ) root_agent = Agent( name="RootAgent", - model="gemini-2.0-flash", + model="gemini-2.5-flash", description="Root Agent", sub_agents=[ search_agent, @@ -14921,7 +14921,7 @@ The docstring (or comments above) your function serve as the tool's description stock_price_agent = Agent( - model='gemini-2.0-flash', + model='gemini-2.5-flash', name='stock_agent', instruction= 'You are an agent who retrieves stock prices. If a ticker symbol is provided, fetch the current price. If only a company name is given, first perform a Google search to find the correct ticker symbol before retrieving the stock price. If the provided ticker symbol is invalid or data cannot be retrieved, inform the user that the stock price could not be found.', description='This agent specializes in retrieving real-time stock prices. Given a stock ticker symbol (e.g., AAPL, GOOG, MSFT) or the stock name, use the tools and reliable data sources to provide the most up-to-date price.', @@ -15122,7 +15122,7 @@ Agent client received an event with long running function calls and check the st # 3. Use the tool in an Agent file_processor_agent = Agent( # Use a model compatible with function calling - model="gemini-2.0-flash", + model="gemini-2.5-flash", name='reimbursement_agent', instruction=""" You are an agent whose job is to handle the reimbursement process for @@ -15299,14 +15299,14 @@ The `AgentTool` class provides the following attributes for customizing its beha SESSION_ID="1234" summary_agent = Agent( - model="gemini-2.0-flash", + model="gemini-2.5-flash", name="summary_agent", instruction="""You are an expert summarizer. Please read the following text and provide a concise summary.""", description="Agent to summarize text", ) root_agent = Agent( - model='gemini-2.0-flash', + model='gemini-2.5-flash', name='root_agent', instruction="""You are a helpful assistant. When the user provides a text, use the 'summarize' tool to generate a summary. Always forward the user's message exactly as received to the 'summarize' tool, without modifying or summarizing it yourself. Present the response from the tool to the user.""", tools=[AgentTool(agent=summary_agent)] @@ -15475,7 +15475,7 @@ you only need to follow a subset of these steps. from .tools import sample_toolset root_agent = LlmAgent( - model='gemini-2.0-flash', + model='gemini-2.5-flash', name='enterprise_assistant', instruction='Help user, leverage the tools you have access to', tools=sample_toolset.get_tools(), @@ -15651,7 +15651,7 @@ Connect your agent to enterprise applications using from .tools import connector_tool root_agent = LlmAgent( - model='gemini-2.0-flash', + model='gemini-2.5-flash', name='connector_agent', instruction="Help user, leverage the tools you have access to", tools=[connector_tool], @@ -15706,7 +15706,7 @@ workflow as a tool for your agent or create a new one. from .tools import integration_tool, connector_tool root_agent = LlmAgent( - model='gemini-2.0-flash', + model='gemini-2.5-flash', name='integration_agent', instruction="Help user, leverage the tools you have access to", tools=[integration_tool], @@ -15896,7 +15896,7 @@ The following example showcases how an agent can use tools by **referencing thei APP_NAME="weather_sentiment_agent" USER_ID="user1234" SESSION_ID="1234" - MODEL_ID="gemini-2.0-flash" + MODEL_ID="gemini-2.5-flash" # Tool 1 def get_weather_report(city: str) -> dict: @@ -16096,14 +16096,14 @@ The `tool_context.actions` attribute (`ToolContext.actions()` in Java) holds an escalation_tool = FunctionTool(func=check_and_transfer) main_agent = Agent( - model='gemini-2.0-flash', + model='gemini-2.5-flash', name='main_agent', instruction="""You are the first point of contact for customer support of an analytics tool. Answer general queries. If the user indicates urgency, use the 'check_and_transfer' tool.""", tools=[check_and_transfer] ) support_agent = Agent( - model='gemini-2.0-flash', + model='gemini-2.5-flash', name='support_agent', instruction="""You are the dedicated support agent. Mentioned you are a support handler and please help the user with their urgent issue.""" ) @@ -16435,7 +16435,7 @@ math_toolset_instance = SimpleMathToolset(prefix="calculator_") # 5. Define an agent that uses both the individual tool and the toolset calculator_agent = LlmAgent( name="CalculatorAgent", - model="gemini-2.0-flash", # Replace with your desired model + model="gemini-2.5-flash", # Replace with your desired model instruction="You are a helpful calculator and greeter. " "Use 'greet_user' for greetings. " "Use 'calculator_add_numbers' to add and 'calculator_subtract_numbers' to subtract. " @@ -16528,7 +16528,7 @@ TARGET_FOLDER_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "/ # If you created ./adk_agent_samples/mcp_agent/your_folder, root_agent = LlmAgent( - model='gemini-2.0-flash', + model='gemini-2.5-flash', name='filesystem_assistant_agent', instruction='Help the user manage their files. You can list files, read files, etc.', tools=[ @@ -16626,7 +16626,7 @@ if not google_maps_api_key: # You might want to raise an error or exit if the key is crucial and not found. root_agent = LlmAgent( - model='gemini-2.0-flash', + model='gemini-2.5-flash', name='maps_assistant_agent', instruction='Help the user with mapping, directions, and finding places using Google Maps tools.', tools=[ @@ -16858,7 +16858,7 @@ if PATH_TO_YOUR_MCP_SERVER_SCRIPT == "/path/to/your/my_adk_mcp_server.py": # Optionally, raise an error if the path is critical root_agent = LlmAgent( - model='gemini-2.0-flash', + model='gemini-2.5-flash', name='web_reader_mcp_client_agent', instruction="Use the 'load_web_page' tool to fetch content from a URL provided by the user.", tools=[ @@ -16961,7 +16961,7 @@ async def get_agent_async(): # Use in an agent root_agent = LlmAgent( - model='gemini-2.0-flash', # Adjust model name if needed based on availability + model='gemini-2.5-flash', # Adjust model name if needed based on availability name='enterprise_assistant', instruction='Help user accessing their file systems', tools=[toolset], # Provide the MCP tools to the ADK agent @@ -17107,7 +17107,7 @@ Follow these steps to integrate an OpenAPI spec into your agent: my_agent = LlmAgent( name="api_interacting_agent", - model="gemini-2.0-flash", # Or your preferred model + model="gemini-2.5-flash", # Or your preferred model tools=[toolset], # Pass the toolset # ... other agent config ... ) @@ -17157,7 +17157,7 @@ This example demonstrates generating tools from a simple Pet Store OpenAPI spec USER_ID_OPENAPI = "user_openapi_1" SESSION_ID_OPENAPI = f"session_openapi_{uuid.uuid4()}" # Unique session ID AGENT_NAME_OPENAPI = "petstore_manager_agent" - GEMINI_MODEL = "gemini-2.0-flash" + GEMINI_MODEL = "gemini-2.5-flash" # --- Sample OpenAPI Specification (JSON String) --- # A basic Pet Store API example using httpbin.org as a mock server @@ -17417,7 +17417,7 @@ ADK provides the `LangchainTool` wrapper to integrate tools from the LangChain e # Define the ADK agent, including the wrapped tool my_agent = Agent( name="langchain_tool_agent", - model="gemini-2.0-flash", + model="gemini-2.5-flash", description="Agent to answer questions using TavilySearch.", instruction="I can answer your questions by searching the internet. Just ask me anything!", tools=[adk_tavily_tool] # Add the wrapped tool here @@ -17473,7 +17473,7 @@ adk_tavily_tool = LangchainTool(tool=tavily_search) # Define Agent with the wrapped tool my_agent = Agent( name="langchain_tool_agent", - model="gemini-2.0-flash", + model="gemini-2.5-flash", description="Agent to answer questions using TavilySearch.", instruction="I can answer your questions by searching the internet. Just ask me anything!", tools=[adk_tavily_tool] # Add the wrapped tool here @@ -17557,7 +17557,7 @@ ADK provides the `CrewaiTool` wrapper to integrate tools from the CrewAI library # Define the ADK agent my_agent = Agent( name="crewai_search_agent", - model="gemini-2.0-flash", + model="gemini-2.5-flash", description="Agent to find recent news using the Serper search tool.", instruction="I can find the latest news for you. What topic are you interested in?", tools=[adk_serper_tool] # Add the wrapped tool here @@ -17614,7 +17614,7 @@ adk_serper_tool = CrewaiTool( serper_agent = Agent( name="basic_search_agent", - model="gemini-2.0-flash", + model="gemini-2.5-flash", description="Agent to answer questions using Google Search.", instruction="I can answer your questions by searching the internet. Just ask me anything!", # Add the Serper tool @@ -17810,7 +17810,7 @@ os.environ["GOOGLE_GENAI_USE_VERTEXAI"] = "False" # --- Define Model Constants for easier use --- # More supported models can be referenced here: https://ai.google.dev/gemini-api/docs/models#model-variations -MODEL_GEMINI_2_0_FLASH = "gemini-2.0-flash" +MODEL_GEMINI_2_5_FLASH = "gemini-2.5-flash" # More supported models can be referenced here: https://docs.litellm.ai/docs/providers/openai#openai-chat-completion-models MODEL_GPT_4O = "openai/gpt-4.1" # You can also try: gpt-4.1-mini, gpt-4o etc. @@ -17891,7 +17891,7 @@ Now, let's create the **Agent** itself. An `Agent` in ADK orchestrates the inter We configure it with several key parameters: * `name`: A unique identifier for this agent (e.g., "weather\_agent\_v1"). -* `model`: Specifies which LLM to use (e.g., `MODEL_GEMINI_2_0_FLASH`). We'll start with a specific Gemini model. +* `model`: Specifies which LLM to use (e.g., `MODEL_GEMINI_2_5_FLASH`). We'll start with a specific Gemini model. * `description`: A concise summary of the agent's overall purpose. This becomes crucial later when other agents need to decide whether to delegate tasks to *this* agent. * `instruction`: Detailed guidance for the LLM on how to behave, its persona, its goals, and specifically *how and when* to utilize its assigned `tools`. * `tools`: A list containing the actual Python tool functions the agent is allowed to use (e.g., `[get_weather]`). @@ -17904,7 +17904,7 @@ We configure it with several key parameters: ```python # @title Define the Weather Agent # Use one of the model constants defined earlier -AGENT_MODEL = MODEL_GEMINI_2_0_FLASH # Starting with Gemini +AGENT_MODEL = MODEL_GEMINI_2_5_FLASH # Starting with Gemini weather_agent = Agent( name="weather_agent_v1", @@ -18365,14 +18365,14 @@ Now, create the `Agent` instances for our specialists. Notice their highly focus # If you want to use models other than Gemini, Ensure LiteLlm is imported and API keys are set (from Step 0/2) # from google.adk.models.lite_llm import LiteLlm # MODEL_GPT_4O, MODEL_CLAUDE_SONNET etc. should be defined -# Or else, continue to use: model = MODEL_GEMINI_2_0_FLASH +# Or else, continue to use: model = MODEL_GEMINI_2_5_FLASH # --- Greeting Agent --- greeting_agent = None try: greeting_agent = Agent( # Using a potentially different/cheaper model for a simple task - model = MODEL_GEMINI_2_0_FLASH, + model = MODEL_GEMINI_2_5_FLASH, # model=LiteLlm(model=MODEL_GPT_4O), # If you would like to experiment with other models name="greeting_agent", instruction="You are the Greeting Agent. Your ONLY task is to provide a friendly greeting to the user. " @@ -18391,7 +18391,7 @@ farewell_agent = None try: farewell_agent = Agent( # Can use the same or a different model - model = MODEL_GEMINI_2_0_FLASH, + model = MODEL_GEMINI_2_5_FLASH, # model=LiteLlm(model=MODEL_GPT_4O), # If you would like to experiment with other models name="farewell_agent", instruction="You are the Farewell Agent. Your ONLY task is to provide a polite goodbye message. " @@ -18430,7 +18430,7 @@ runner_root = None # Initialize runner if greeting_agent and farewell_agent and 'get_weather' in globals(): # Let's use a capable Gemini model for the root agent to handle orchestration - root_agent_model = MODEL_GEMINI_2_0_FLASH + root_agent_model = MODEL_GEMINI_2_5_FLASH weather_agent_team = Agent( name="weather_agent_v2", # Give it a new version name @@ -18735,13 +18735,13 @@ from google.adk.agents import Agent from google.adk.models.lite_llm import LiteLlm from google.adk.runners import Runner # Ensure tools 'say_hello', 'say_goodbye' are defined (from Step 3) -# Ensure model constants MODEL_GPT_4O, MODEL_GEMINI_2_0_FLASH etc. are defined +# Ensure model constants MODEL_GPT_4O, MODEL_GEMINI_2_5_FLASH etc. are defined # --- Redefine Greeting Agent (from Step 3) --- greeting_agent = None try: greeting_agent = Agent( - model=MODEL_GEMINI_2_0_FLASH, + model=MODEL_GEMINI_2_5_FLASH, name="greeting_agent", instruction="You are the Greeting Agent. Your ONLY task is to provide a friendly greeting using the 'say_hello' tool. Do nothing else.", description="Handles simple greetings and hellos using the 'say_hello' tool.", @@ -18755,7 +18755,7 @@ except Exception as e: farewell_agent = None try: farewell_agent = Agent( - model=MODEL_GEMINI_2_0_FLASH, + model=MODEL_GEMINI_2_5_FLASH, name="farewell_agent", instruction="You are the Farewell Agent. Your ONLY task is to provide a polite goodbye message using the 'say_goodbye' tool. Do not perform any other actions.", description="Handles simple farewells and goodbyes using the 'say_goodbye' tool.", @@ -18772,7 +18772,7 @@ runner_root_stateful = None # Initialize runner # Check prerequisites before creating the root agent if greeting_agent and farewell_agent and 'get_weather_stateful' in globals(): - root_agent_model = MODEL_GEMINI_2_0_FLASH # Choose orchestration model + root_agent_model = MODEL_GEMINI_2_5_FLASH # Choose orchestration model root_agent_stateful = Agent( name="weather_agent_v4_stateful", # New version name @@ -19062,7 +19062,7 @@ greeting_agent = None try: # Use a defined model constant greeting_agent = Agent( - model=MODEL_GEMINI_2_0_FLASH, + model=MODEL_GEMINI_2_5_FLASH, name="greeting_agent", # Keep original name for consistency instruction="You are the Greeting Agent. Your ONLY task is to provide a friendly greeting using the 'say_hello' tool. Do nothing else.", description="Handles simple greetings and hellos using the 'say_hello' tool.", @@ -19076,7 +19076,7 @@ farewell_agent = None try: # Use a defined model constant farewell_agent = Agent( - model=MODEL_GEMINI_2_0_FLASH, + model=MODEL_GEMINI_2_5_FLASH, name="farewell_agent", # Keep original name instruction="You are the Farewell Agent. Your ONLY task is to provide a polite goodbye message using the 'say_goodbye' tool. Do not perform any other actions.", description="Handles simple farewells and goodbyes using the 'say_goodbye' tool.", @@ -19095,7 +19095,7 @@ runner_root_model_guardrail = None if greeting_agent and farewell_agent and 'get_weather_stateful' in globals() and 'block_keyword_guardrail' in globals(): # Use a defined model constant - root_agent_model = MODEL_GEMINI_2_0_FLASH + root_agent_model = MODEL_GEMINI_2_5_FLASH root_agent_model_guardrail = Agent( name="weather_agent_v5_model_guardrail", # New version name for clarity @@ -19354,7 +19354,7 @@ greeting_agent = None try: # Use a defined model constant greeting_agent = Agent( - model=MODEL_GEMINI_2_0_FLASH, + model=MODEL_GEMINI_2_5_FLASH, name="greeting_agent", # Keep original name for consistency instruction="You are the Greeting Agent. Your ONLY task is to provide a friendly greeting using the 'say_hello' tool. Do nothing else.", description="Handles simple greetings and hellos using the 'say_hello' tool.", @@ -19368,7 +19368,7 @@ farewell_agent = None try: # Use a defined model constant farewell_agent = Agent( - model=MODEL_GEMINI_2_0_FLASH, + model=MODEL_GEMINI_2_5_FLASH, name="farewell_agent", # Keep original name instruction="You are the Farewell Agent. Your ONLY task is to provide a polite goodbye message using the 'say_goodbye' tool. Do not perform any other actions.", description="Handles simple farewells and goodbyes using the 'say_goodbye' tool.", @@ -19388,7 +19388,7 @@ if ('greeting_agent' in globals() and greeting_agent and 'block_keyword_guardrail' in globals() and 'block_paris_tool_guardrail' in globals()): - root_agent_model = MODEL_GEMINI_2_0_FLASH + root_agent_model = MODEL_GEMINI_2_5_FLASH root_agent_tool_guardrail = Agent( name="weather_agent_v6_tool_guardrail", # New version name diff --git a/llms.txt b/llms.txt index 0ff16cbb82..97e83563c1 100644 --- a/llms.txt +++ b/llms.txt @@ -92,7 +92,7 @@ from google.adk.tools import google_search root_agent = Agent( name="search_assistant", - model="gemini-2.0-flash", # Or your preferred Gemini model + model="gemini-2.5-flash", # Or your preferred Gemini model instruction="You are a helpful assistant. Answer user questions using Google Search when needed.", description="An assistant that can search the web.", tools=[google_search] @@ -109,13 +109,13 @@ Define a multi-agent system with coordinator agent, greeter agent, and task exec from google.adk.agents import LlmAgent, BaseAgent # Define individual agents -greeter = LlmAgent(name="greeter", model="gemini-2.0-flash", ...) -task_executor = LlmAgent(name="task_executor", model="gemini-2.0-flash", ...) +greeter = LlmAgent(name="greeter", model="gemini-2.5-flash", ...) +task_executor = LlmAgent(name="task_executor", model="gemini-2.5-flash", ...) # Create parent agent and assign children via sub_agents coordinator = LlmAgent( name="Coordinator", - model="gemini-2.0-flash", + model="gemini-2.5-flash", description="I coordinate greetings and tasks.", sub_agents=[ # Assign sub_agents here greeter, diff --git a/pylintrc b/pylintrc index 3fc2263683..303cbc3027 100644 --- a/pylintrc +++ b/pylintrc @@ -257,7 +257,7 @@ single-line-if-stmt=yes max-module-lines=99999 # String used as indentation unit. The internal Google style guide mandates 2 -# spaces. Google's externaly-published style guide says 4, consistent with +# spaces. Google's externally-published style guide says 4, consistent with # PEP 8. Here, we use 2 spaces, for conformity with many open-sourced Google # projects (like TensorFlow). indent-string=' ' diff --git a/pyproject.toml b/pyproject.toml index 714d58b1c5..751d3992d6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,38 +25,42 @@ classifiers = [ # List of https://pypi.org/classifiers/ ] dependencies = [ # go/keep-sorted start - "PyYAML>=6.0.2, <7.0.0", # For APIHubToolset. - "absolufy-imports>=0.3.1, <1.0.0", # For Agent Engine deployment. - "anyio>=4.9.0, <5.0.0;python_version>='3.10'", # For MCP Session Manager - "authlib>=1.5.1, <2.0.0", # For RestAPI Tool - "click>=8.1.8, <9.0.0", # For CLI tools - "fastapi>=0.115.0, <1.0.0", # FastAPI framework - "google-api-python-client>=2.157.0, <3.0.0", # Google API client discovery - "google-cloud-aiplatform[agent_engines]>=1.95.1, <2.0.0", # For VertexAI integrations, e.g. example store. - "google-cloud-bigtable>=2.32.0", # For Bigtable database - "google-cloud-secret-manager>=2.22.0, <3.0.0", # Fetching secrets in RestAPI Tool - "google-cloud-spanner>=3.56.0, <4.0.0", # For Spanner database - "google-cloud-speech>=2.30.0, <3.0.0", # For Audio Transcription - "google-cloud-storage>=2.18.0, <3.0.0", # For GCS Artifact service - "google-genai>=1.21.1, <2.0.0", # Google GenAI SDK - "graphviz>=0.20.2, <1.0.0", # Graphviz for graph rendering - "mcp>=1.8.0, <2.0.0;python_version>='3.10'", # For MCP Toolset - "opentelemetry-api>=1.31.0, <2.0.0", # OpenTelemetry + "PyYAML>=6.0.2, <7.0.0", # For APIHubToolset. + "anyio>=4.9.0, <5.0.0;python_version>='3.10'", # For MCP Session Manager + "authlib>=1.5.1, <2.0.0", # For RestAPI Tool + "click>=8.1.8, <9.0.0", # For CLI tools + "fastapi>=0.115.0, <1.119.0", # FastAPI framework + "google-api-python-client>=2.157.0, <3.0.0", # Google API client discovery + "google-cloud-aiplatform[agent_engines]>=1.125.0, <2.0.0", # For VertexAI integrations, e.g. example store. + "google-cloud-bigtable>=2.32.0", # For Bigtable database + "google-cloud-discoveryengine>=0.13.12, <0.14.0", # For Discovery Engine Search Tool + "google-cloud-secret-manager>=2.22.0, <3.0.0", # Fetching secrets in RestAPI Tool + "google-cloud-spanner>=3.56.0, <4.0.0", # For Spanner database + "google-cloud-speech>=2.30.0, <3.0.0", # For Audio Transcription + "google-cloud-storage>=3.0.0, <4.0.0", # For GCS Artifact service + "google-genai>=1.45.0, <2.0.0", # Google GenAI SDK + "graphviz>=0.20.2, <1.0.0", # Graphviz for graph rendering + "mcp>=1.8.0, <2.0.0;python_version>='3.10'", # For MCP Toolset + "opentelemetry-api>=1.37.0, <=1.37.0", # OpenTelemetry - limit upper version for sdk and api to not risk breaking changes from unstable _logs package. + "opentelemetry-exporter-gcp-logging>=1.9.0a0, <2.0.0", + "opentelemetry-exporter-gcp-monitoring>=1.9.0a0, <2.0.0", "opentelemetry-exporter-gcp-trace>=1.9.0, <2.0.0", - "opentelemetry-sdk>=1.31.0, <2.0.0", - "pydantic>=2.0, <3.0.0", # For data validation/models - "python-dateutil>=2.9.0.post0, <3.0.0", # For Vertext AI Session Service - "python-dotenv>=1.0.0, <2.0.0", # To manage environment variables + "opentelemetry-exporter-otlp-proto-http>=1.36.0", + "opentelemetry-resourcedetector-gcp>=1.9.0a0, <2.0.0", + "opentelemetry-sdk>=1.37.0, <=1.37.0", + "pydantic>=2.0, <3.0.0", # For data validation/models + "python-dateutil>=2.9.0.post0, <3.0.0", # For Vertext AI Session Service + "python-dotenv>=1.0.0, <2.0.0", # To manage environment variables "requests>=2.32.4, <3.0.0", - "sqlalchemy>=2.0, <3.0.0", # SQL database ORM - "sqlalchemy-spanner>=1.14.0", # Spanner database session service - "starlette>=0.46.2, <1.0.0", # For FastAPI CLI - "tenacity>=8.0.0, <9.0.0", # For Retry management + "sqlalchemy-spanner>=1.14.0", # Spanner database session service + "sqlalchemy>=2.0, <3.0.0", # SQL database ORM + "starlette>=0.46.2, <1.0.0", # For FastAPI CLI + "tenacity>=9.0.0, <10.0.0", # For Retry management "typing-extensions>=4.5, <5", - "tzlocal>=5.3, <6.0", # Time zone utilities - "uvicorn>=0.34.0, <1.0.0", # ASGI server for FastAPI - "watchdog>=6.0.0, <7.0.0", # For file change detection and hot reload - "websockets>=15.0.1, <16.0.0", # For BaseLlmFlow + "tzlocal>=5.3, <6.0", # Time zone utilities + "uvicorn>=0.34.0, <1.0.0", # ASGI server for FastAPI + "watchdog>=6.0.0, <7.0.0", # For file change detection and hot reload + "websockets>=15.0.1, <16.0.0", # For BaseLlmFlow # go/keep-sorted end ] dynamic = ["version"] @@ -106,17 +110,18 @@ eval = [ test = [ # go/keep-sorted start "a2a-sdk>=0.3.0,<0.4.0;python_version>='3.10'", - "anthropic>=0.43.0", # For anthropic model tests - "kubernetes>=29.0.0", # For GkeCodeExecutor + "anthropic>=0.43.0", # For anthropic model tests + "crewai[tools];python_version>='3.10'", # For CrewaiTool tests + "kubernetes>=29.0.0", # For GkeCodeExecutor "langchain-community>=0.3.17", - "langgraph>=0.2.60, <= 0.4.10", # For LangGraphAgent - "litellm>=1.75.5, <2.0.0", # For LiteLLM tests - "llama-index-readers-file>=0.4.0", # For retrieval tests - "openai>=1.100.2", # For LiteLLM - "pytest>=8.3.4", + "langgraph>=0.2.60, <0.4.8", # For LangGraphAgent + "litellm>=1.75.5, <2.0.0", # For LiteLLM tests + "llama-index-readers-file>=0.4.0", # For retrieval tests + "openai>=1.100.2", # For LiteLLM "pytest-asyncio>=0.25.0", "pytest-mock>=3.14.0", "pytest-xdist>=3.6.1", + "pytest>=8.3.4", "python-multipart>=0.0.9", "rouge-score>=0.1.2", "tabulate>=0.9.0", @@ -134,19 +139,21 @@ docs = [ # Optional extensions extensions = [ - "anthropic>=0.43.0", # For anthropic model support - "beautifulsoup4>=3.2.2", # For load_web_page tool. - "crewai[tools];python_version>='3.10'", # For CrewaiTool - "docker>=7.0.0", # For ContainerCodeExecutor - "kubernetes>=29.0.0", # For GkeCodeExecutor - "langgraph>=0.2.60", # For LangGraphAgent - "litellm>=1.75.5", # For LiteLlm class. Currently has OpenAI limitations. TODO: once LiteLlm fix it - "llama-index-readers-file>=0.4.0", # For retrieval using LlamaIndex. - "llama-index-embeddings-google-genai>=0.3.0",# For files retrieval using LlamaIndex. - "lxml>=5.3.0", # For load_web_page tool. - "toolbox-core>=0.1.0", # For tools.toolbox_toolset.ToolboxToolset + "anthropic>=0.43.0", # For anthropic model support + "beautifulsoup4>=3.2.2", # For load_web_page tool. + "crewai[tools];python_version>='3.10'", # For CrewaiTool + "docker>=7.0.0", # For ContainerCodeExecutor + "kubernetes>=29.0.0", # For GkeCodeExecutor + "langgraph>=0.2.60, <0.4.8", # For LangGraphAgent + "litellm>=1.75.5", # For LiteLlm class. Currently has OpenAI limitations. TODO: once LiteLlm fix it + "llama-index-readers-file>=0.4.0", # For retrieval using LlamaIndex. + "llama-index-embeddings-google-genai>=0.3.0", # For files retrieval using LlamaIndex. + "lxml>=5.3.0", # For load_web_page tool. + "toolbox-core>=0.1.0", # For tools.toolbox_toolset.ToolboxToolset ] +otel-gcp = ["opentelemetry-instrumentation-google-genai>=0.3b0, <1.0.0"] + [tool.pyink] # Format py files following Google style-guide @@ -199,7 +206,7 @@ asyncio_mode = "auto" python_version = "3.9" exclude = "tests/" plugins = ["pydantic.mypy"] -# Start with non-strict mode, and swtich to strict mode later. +# Start with non-strict mode, and switch to strict mode later. # strict = true disable_error_code = ["import-not-found", "import-untyped", "unused-ignore"] follow_imports = "skip" diff --git a/scripts/db_migration.sh b/scripts/db_migration.sh new file mode 100755 index 0000000000..6de40e31e5 --- /dev/null +++ b/scripts/db_migration.sh @@ -0,0 +1,144 @@ +#!/bin/bash + + +# This script is to update sessions DB that is created in previous ADK version, +# to schema that current ADK version use. The sample usage is in the samples/migrate_session_db. +# +# Usage: +# ./db_migration.sh "sqlite:///%(here)s/sessions.db" "google.adk.sessions.database_session_service" +# ./db_migration.sh "postgresql://user:pass@localhost/mydb" "google.adk.sessions.database_session_service" +# First argument is the sessions DB url. +# Second argument is the model import path. + +# --- Configuration --- +ALEMBIC_DIR="alembic" +INI_FILE="alembic.ini" +ENV_FILE="${ALEMBIC_DIR}/env.py" + +# --- Functions --- +print_usage() { + echo "Usage: $0 " + echo " : The full SQLAlchemy connection string." + echo " : The Python import path to your models (e.g., my_project.models)" + echo "" + echo "Example:" + echo " $0 \"sqlite:///%(here)s/sessions.db\" \"google.adk.sessions.database_session_service\"" +} + +# --- Argument Validation --- +if [ "$#" -ne 2 ]; then + print_usage + exit 1 +fi + +DB_URL=$1 +MODEL_PATH=$2 + +echo "Setting up Alembic..." +echo " Database URL: ${DB_URL}" +echo " Model Path: ${MODEL_PATH}" +echo "" + +# --- Safety Check --- +if [ -f "$INI_FILE" ] || [ -d "$ALEMBIC_DIR" ]; then + echo "Error: 'alembic.ini' or 'alembic/' directory already exists." + echo "Please remove them before running this script." + exit 1 +fi + +# --- 1. Run alembic init --- +echo "Running 'alembic init ${ALEMBIC_DIR}'..." +alembic init ${ALEMBIC_DIR} +if [ $? -ne 0 ]; then + echo "Error: 'alembic init' failed. Is alembic installed?" + exit 1 +fi +echo "Initialization complete." +echo "" + +# --- 2. Set sqlalchemy.url in alembic.ini --- +echo "Configuring ${INI_FILE}..." +# Use a different delimiter (#) for sed to avoid escaping slashes in the URL +sed -i.bak "s#sqlalchemy.url = driver://user:pass@localhost/dbname#sqlalchemy.url = ${DB_URL}#" "${INI_FILE}" +if [ $? -ne 0 ]; then + echo "Error: Failed to set sqlalchemy.url in ${INI_FILE}." + exit 1 +fi +echo " Set sqlalchemy.url" + +# --- 3. Set target_metadata in alembic/env.py --- +echo "Configuring ${ENV_FILE}..." + +# Edit 1: Uncomment and replace the model import line +sed -i.bak "s/# from myapp import mymodel/from ${MODEL_PATH} import Base/" "${ENV_FILE}" +if [ $? -ne 0 ]; then + echo "Error: Failed to set model import in ${ENV_FILE}." + exit 1 +fi + +# Edit 2: Set the target_metadata to use the imported Base +sed -i.bak "s/target_metadata = None/target_metadata = Base.metadata/" "${ENV_FILE}" +if [ $? -ne 0 ]; then + echo "Error: Failed to set target_metadata in ${ENV_FILE}." + exit 1 +fi + +echo " Set target_metadata" +echo "" + +# --- 4. Clean up backup files --- +echo "Cleaning up backup files..." +rm "${INI_FILE}.bak" +rm "${ENV_FILE}.bak" + +# --- 5. Run alembic stamp head --- +echo "Running 'alembic stamp head'..." +alembic stamp head +if [ $? -ne 0 ]; then + echo "Error: 'alembic stamp head' failed." + exit 1 +fi +echo "stamping complete." +echo "" + +# --- 6. Run alembic upgrade --- +echo "Running 'alembic revision --autogenerate'..." +alembic revision --autogenerate -m "ADK session DB upgrade" +if [ $? -ne 0 ]; then + echo "Error: 'alembic revision' failed." + exit 1 +fi +echo "revision complete." +echo "" + +# --- 7. Add import statement to version files --- +echo "Adding import statement to version files..." +for f in ${ALEMBIC_DIR}/versions/*.py; do + if [ -f "$f" ]; then + # Check if the first line is already the import statement + FIRST_LINE=$(head -n 1 "$f") + IMPORT_STATEMENT="import ${MODEL_PATH}" + if [ "$FIRST_LINE" != "$IMPORT_STATEMENT" ]; then + echo "Adding import to $f" + sed -i.bak "1s|^|${IMPORT_STATEMENT}\n|" "$f" + rm "${f}.bak" + else + echo "Import already exists in $f" + fi + fi +done +echo "Import statements added." +echo "" + +# --- 8. Run alembic upgrade --- +echo "running 'alembic upgrade'..." +alembic upgrade head +if [ $? -ne 0 ]; then + echo "Error: 'alembic upgrade' failed. " + exit 1 +fi +echo "upgrade complete." +echo "" + +echo "---" +echo "✅ ADK session DB is Updated!" \ No newline at end of file diff --git a/src/google/adk/a2a/converters/event_converter.py b/src/google/adk/a2a/converters/event_converter.py index 5e941a7868..df8247634e 100644 --- a/src/google/adk/a2a/converters/event_converter.py +++ b/src/google/adk/a2a/converters/event_converter.py @@ -14,6 +14,7 @@ from __future__ import annotations +from collections.abc import Callable from datetime import datetime from datetime import timezone import logging @@ -57,6 +58,34 @@ logger = logging.getLogger("google_adk." + __name__) +AdkEventToA2AEventsConverter = Callable[ + [ + Event, + InvocationContext, + Optional[str], + Optional[str], + GenAIPartToA2APartConverter, + ], + List[A2AEvent], +] +"""A callable that converts an ADK Event into a list of A2A events. + +This interface allows for custom logic to map ADK's event structure to the +event structure expected by the A2A server. + +Args: + event: The source ADK Event to convert. + invocation_context: The context of the ADK agent invocation. + task_id: The ID of the A2A task being processed. + context_id: The context ID from the A2A request. + part_converter: A function to convert GenAI content parts to A2A + parts. + +Returns: + A list of A2A events. +""" + + def _serialize_metadata_value(value: Any) -> str: """Safely serializes metadata values to string format. diff --git a/src/google/adk/a2a/converters/part_converter.py b/src/google/adk/a2a/converters/part_converter.py index d796cb5ff1..3718b3ac13 100644 --- a/src/google/adk/a2a/converters/part_converter.py +++ b/src/google/adk/a2a/converters/part_converter.py @@ -13,7 +13,7 @@ # limitations under the License. """ -module containing utilities for conversion betwen A2A Part and Google GenAI Part +module containing utilities for conversion between A2A Part and Google GenAI Part """ from __future__ import annotations @@ -191,7 +191,7 @@ def convert_genai_part_to_a2a_part( # Convert the funcall and function response to A2A DataPart. # This is mainly for converting human in the loop and auth request and # response. - # TODO once A2A defined how to suervice such information, migrate below + # TODO once A2A defined how to service such information, migrate below # logic accordingly if part.function_call: return a2a_types.Part( diff --git a/src/google/adk/a2a/converters/request_converter.py b/src/google/adk/a2a/converters/request_converter.py index 78a6d78eee..f92617b11c 100644 --- a/src/google/adk/a2a/converters/request_converter.py +++ b/src/google/adk/a2a/converters/request_converter.py @@ -14,8 +14,12 @@ from __future__ import annotations +from collections.abc import Callable import sys from typing import Any +from typing import Optional + +from pydantic import BaseModel try: from a2a.server.agent_execution import RequestContext @@ -35,6 +39,39 @@ from .part_converter import convert_a2a_part_to_genai_part +@a2a_experimental +class AgentRunRequest(BaseModel): + """Data model for arguments passed to the ADK runner.""" + + user_id: Optional[str] = None + session_id: Optional[str] = None + invocation_id: Optional[str] = None + new_message: Optional[genai_types.Content] = None + state_delta: Optional[dict[str, Any]] = None + run_config: Optional[RunConfig] = None + + +A2ARequestToAgentRunRequestConverter = Callable[ + [ + RequestContext, + A2APartToGenAIPartConverter, + ], + AgentRunRequest, +] +"""A callable that converts an A2A RequestContext to RunnerRequest for ADK runner. + +This interface allows for custom logic to map an incoming A2A RequestContext to the +structured arguments expected by the ADK runner's `run_async` method. + +Args: + request: The incoming request context from the A2A server. + part_converter: A function to convert A2A content parts to GenAI parts. + +Returns: + An RunnerRequest object containing the keyword arguments for ADK runner's run_async method. +""" + + def _get_user_id(request: RequestContext) -> str: # Get user from call context if available (auth is enabled on a2a server) if ( @@ -49,20 +86,36 @@ def _get_user_id(request: RequestContext) -> str: @a2a_experimental -def convert_a2a_request_to_adk_run_args( +def convert_a2a_request_to_agent_run_request( request: RequestContext, part_converter: A2APartToGenAIPartConverter = convert_a2a_part_to_genai_part, -) -> dict[str, Any]: +) -> AgentRunRequest: + """Converts an A2A RequestContext to an AgentRunRequest model. + + Args: + request: The incoming request context from the A2A server. + part_converter: A function to convert A2A content parts to GenAI parts. + + Returns: + A AgentRunRequest object ready to be used as arguments for the ADK runner. + + Raises: + ValueError: If the request message is None. + """ if not request.message: raise ValueError('Request message cannot be None') - return { - 'user_id': _get_user_id(request), - 'session_id': request.context_id, - 'new_message': genai_types.Content( + custom_metadata = {} + if request.metadata: + custom_metadata['a2a_metadata'] = request.metadata + + return AgentRunRequest( + user_id=_get_user_id(request), + session_id=request.context_id, + new_message=genai_types.Content( role='user', parts=[part_converter(part) for part in request.message.parts], ), - 'run_config': RunConfig(), - } + run_config=RunConfig(custom_metadata=custom_metadata), + ) diff --git a/src/google/adk/a2a/executor/a2a_agent_executor.py b/src/google/adk/a2a/executor/a2a_agent_executor.py index 4cb928436b..608a818864 100644 --- a/src/google/adk/a2a/executor/a2a_agent_executor.py +++ b/src/google/adk/a2a/executor/a2a_agent_executor.py @@ -18,7 +18,6 @@ from datetime import timezone import inspect import logging -from typing import Any from typing import Awaitable from typing import Callable from typing import Optional @@ -52,12 +51,15 @@ from pydantic import BaseModel from typing_extensions import override +from ..converters.event_converter import AdkEventToA2AEventsConverter from ..converters.event_converter import convert_event_to_a2a_events from ..converters.part_converter import A2APartToGenAIPartConverter from ..converters.part_converter import convert_a2a_part_to_genai_part from ..converters.part_converter import convert_genai_part_to_a2a_part from ..converters.part_converter import GenAIPartToA2APartConverter -from ..converters.request_converter import convert_a2a_request_to_adk_run_args +from ..converters.request_converter import A2ARequestToAgentRunRequestConverter +from ..converters.request_converter import AgentRunRequest +from ..converters.request_converter import convert_a2a_request_to_agent_run_request from ..converters.utils import _get_adk_metadata_key from ..experimental import a2a_experimental from .task_result_aggregator import TaskResultAggregator @@ -75,6 +77,10 @@ class A2aAgentExecutorConfig(BaseModel): gen_ai_part_converter: GenAIPartToA2APartConverter = ( convert_genai_part_to_a2a_part ) + request_converter: A2ARequestToAgentRunRequestConverter = ( + convert_a2a_request_to_agent_run_request + ) + event_converter: AdkEventToA2AEventsConverter = convert_event_to_a2a_events @a2a_experimental @@ -192,19 +198,20 @@ async def _handle_request( # Resolve the runner instance runner = await self._resolve_runner() - # Convert the a2a request to ADK run args - run_args = convert_a2a_request_to_adk_run_args( - context, self._config.a2a_part_converter + # Convert the a2a request to AgentRunRequest + run_request = self._config.request_converter( + context, + self._config.a2a_part_converter, ) # ensure the session exists - session = await self._prepare_session(context, run_args, runner) + session = await self._prepare_session(context, run_request, runner) # create invocation context invocation_context = runner._new_invocation_context( session=session, - new_message=run_args['new_message'], - run_config=run_args['run_config'], + new_message=run_request.new_message, + run_config=run_request.run_config, ) # publish the task working event @@ -219,16 +226,16 @@ async def _handle_request( final=False, metadata={ _get_adk_metadata_key('app_name'): runner.app_name, - _get_adk_metadata_key('user_id'): run_args['user_id'], - _get_adk_metadata_key('session_id'): run_args['session_id'], + _get_adk_metadata_key('user_id'): run_request.user_id, + _get_adk_metadata_key('session_id'): run_request.session_id, }, ) ) task_result_aggregator = TaskResultAggregator() - async with Aclosing(runner.run_async(**run_args)) as agen: + async with Aclosing(runner.run_async(**vars(run_request))) as agen: async for adk_event in agen: - for a2a_event in convert_event_to_a2a_events( + for a2a_event in self._config.event_converter( adk_event, invocation_context, context.task_id, @@ -284,12 +291,15 @@ async def _handle_request( ) async def _prepare_session( - self, context: RequestContext, run_args: dict[str, Any], runner: Runner + self, + context: RequestContext, + run_request: AgentRunRequest, + runner: Runner, ): - session_id = run_args['session_id'] + session_id = run_request.session_id # create a new session if not exists - user_id = run_args['user_id'] + user_id = run_request.user_id session = await runner.session_service.get_session( app_name=runner.app_name, user_id=user_id, @@ -302,7 +312,7 @@ async def _prepare_session( state={}, session_id=session_id, ) - # Update run_args with the new session_id - run_args['session_id'] = session.id + # Update run_request with the new session_id + run_request.session_id = session.id return session diff --git a/src/google/adk/a2a/logs/log_utils.py b/src/google/adk/a2a/logs/log_utils.py index 78ca437151..558d224187 100644 --- a/src/google/adk/a2a/logs/log_utils.py +++ b/src/google/adk/a2a/logs/log_utils.py @@ -20,11 +20,10 @@ import sys try: + from a2a.client import ClientEvent as A2AClientEvent from a2a.types import DataPart as A2ADataPart from a2a.types import Message as A2AMessage from a2a.types import Part as A2APart - from a2a.types import SendMessageRequest - from a2a.types import SendMessageResponse from a2a.types import Task as A2ATask from a2a.types import TextPart as A2ATextPart except ImportError as e: @@ -49,6 +48,16 @@ def _is_a2a_task(obj) -> bool: return type(obj).__name__ == "Task" and hasattr(obj, "status") +def _is_a2a_client_event(obj) -> bool: + """Check if an object is an A2A Client Event (Task, UpdateEvent) tuple.""" + try: + return isinstance(obj, tuple) and _is_a2a_task(obj[0]) + except (TypeError, AttributeError): + return ( + hasattr(obj, "__getitem__") and len(obj) == 2 and _is_a2a_task(obj[0]) + ) + + def _is_a2a_message(obj) -> bool: """Check if an object is an A2A Message, with fallback for isinstance issues.""" try: @@ -114,7 +123,7 @@ def build_message_part_log(part: A2APart) -> str: return part_content -def build_a2a_request_log(req: SendMessageRequest) -> str: +def build_a2a_request_log(req: A2AMessage) -> str: """Builds a structured log representation of an A2A request. Args: @@ -125,100 +134,70 @@ def build_a2a_request_log(req: SendMessageRequest) -> str: """ # Message parts logs message_parts_logs = [] - if req.params.message.parts: - for i, part in enumerate(req.params.message.parts): + if req.parts: + for i, part in enumerate(req.parts): part_log = build_message_part_log(part) # Replace any internal newlines with indented newlines to maintain formatting part_log_formatted = part_log.replace("\n", "\n ") message_parts_logs.append(f"Part {i}: {part_log_formatted}") - # Configuration logs - config_log = "None" - if req.params.configuration: - config_data = { - "accepted_output_modes": req.params.configuration.accepted_output_modes, - "blocking": req.params.configuration.blocking, - "history_length": req.params.configuration.history_length, - "push_notification_config": bool( - req.params.configuration.push_notification_config - ), - } - config_log = json.dumps(config_data, indent=2) - # Build message metadata section message_metadata_section = "" - if req.params.message.metadata: + if req.metadata: message_metadata_section = f""" Metadata: - {json.dumps(req.params.message.metadata, indent=2).replace(chr(10), chr(10) + ' ')}""" + {json.dumps(req.metadata, indent=2).replace(chr(10), chr(10) + ' ')}""" # Build optional sections optional_sections = [] - if req.params.metadata: + if req.metadata: optional_sections.append( f"""----------------------------------------------------------- Metadata: -{json.dumps(req.params.metadata, indent=2)}""" +{json.dumps(req.metadata, indent=2)}""" ) optional_sections_str = _NEW_LINE.join(optional_sections) return f""" -A2A Request: ------------------------------------------------------------ -Request ID: {req.id} -Method: {req.method} -JSON-RPC: {req.jsonrpc} +A2A Send Message Request: ----------------------------------------------------------- Message: - ID: {req.params.message.message_id} - Role: {req.params.message.role} - Task ID: {req.params.message.task_id} - Context ID: {req.params.message.context_id}{message_metadata_section} + ID: {req.message_id} + Role: {req.role} + Task ID: {req.task_id} + Context ID: {req.context_id}{message_metadata_section} ----------------------------------------------------------- Message Parts: {_NEW_LINE.join(message_parts_logs) if message_parts_logs else "No parts"} ----------------------------------------------------------- -Configuration: -{config_log} {optional_sections_str} ----------------------------------------------------------- """ -def build_a2a_response_log(resp: SendMessageResponse) -> str: +def build_a2a_response_log(resp: A2AClientEvent | A2AMessage) -> str: """Builds a structured log representation of an A2A response. Args: - resp: The A2A SendMessageResponse to log. + resp: The A2A SendMessage Response to log. Returns: A formatted string representation of the response. """ - # Handle error responses - if hasattr(resp.root, "error"): - return f""" -A2A Response: ------------------------------------------------------------ -Type: ERROR -Error Code: {resp.root.error.code} -Error Message: {resp.root.error.message} -Error Data: {json.dumps(resp.root.error.data, indent=2) if resp.root.error.data else "None"} ------------------------------------------------------------ -Response ID: {resp.root.id} -JSON-RPC: {resp.root.jsonrpc} ------------------------------------------------------------ -""" # Handle success responses - result = resp.root.result + result = resp result_type = type(result).__name__ + if result_type == "tuple": + result_type = "ClientEvent" # Build result details based on type result_details = [] - if _is_a2a_task(result): + if _is_a2a_client_event(result): + result = result[0] result_details.extend([ f"Task ID: {result.id}", f"Context ID: {result.context_id}", @@ -342,7 +321,4 @@ def build_a2a_response_log(resp: SendMessageResponse) -> str: History: {history_section} ----------------------------------------------------------- -Response ID: {resp.root.id} -JSON-RPC: {resp.root.jsonrpc} ------------------------------------------------------------ """ diff --git a/src/google/adk/a2a/utils/agent_card_builder.py b/src/google/adk/a2a/utils/agent_card_builder.py index bde5620168..aa7f657f99 100644 --- a/src/google/adk/a2a/utils/agent_card_builder.py +++ b/src/google/adk/a2a/utils/agent_card_builder.py @@ -473,7 +473,7 @@ def _get_default_description(agent: BaseAgent) -> str: async def _extract_examples_from_agent( agent: BaseAgent, ) -> Optional[List[Dict]]: - """Extract examples from example_tool if configured, otherwise from agent instruction.""" + """Extract examples from example_tool if configured; otherwise, from agent instruction.""" if not isinstance(agent, LlmAgent): return None diff --git a/src/google/adk/a2a/utils/agent_to_a2a.py b/src/google/adk/a2a/utils/agent_to_a2a.py index e550dc7643..72a2292fb3 100644 --- a/src/google/adk/a2a/utils/agent_to_a2a.py +++ b/src/google/adk/a2a/utils/agent_to_a2a.py @@ -90,6 +90,7 @@ def to_a2a( port: int = 8000, protocol: str = "http", agent_card: Optional[Union[AgentCard, str]] = None, + runner: Optional[Runner] = None, ) -> Starlette: """Convert an ADK agent to a A2A Starlette application. @@ -101,6 +102,8 @@ def to_a2a( agent_card: Optional pre-built AgentCard object or path to agent card JSON. If not provided, will be built automatically from the agent. + runner: Optional pre-built Runner object. If not provided, a default + runner will be created using in-memory services. Returns: A Starlette application that can be run with uvicorn @@ -132,7 +135,7 @@ async def create_runner() -> Runner: task_store = InMemoryTaskStore() agent_executor = A2aAgentExecutor( - runner=create_runner, + runner=runner or create_runner, ) request_handler = DefaultRequestHandler( diff --git a/src/google/adk/agents/__init__.py b/src/google/adk/agents/__init__.py index 498a9f5c03..5710a21b7f 100644 --- a/src/google/adk/agents/__init__.py +++ b/src/google/adk/agents/__init__.py @@ -12,6 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +import logging +import sys + from .base_agent import BaseAgent from .invocation_context import InvocationContext from .live_request_queue import LiveRequest @@ -35,3 +38,16 @@ 'LiveRequestQueue', 'RunConfig', ] + +if sys.version_info < (3, 10): + logger = logging.getLogger('google_adk.' + __name__) + logger.warning( + 'MCP requires Python 3.10 or above. Please upgrade your Python' + ' version in order to use it.' + ) +else: + from .mcp_instruction_provider import McpInstructionProvider + + __all__.extend([ + 'McpInstructionProvider', + ]) diff --git a/src/google/adk/agents/base_agent.py b/src/google/adk/agents/base_agent.py index cc2257ffba..09eef908e0 100644 --- a/src/google/adk/agents/base_agent.py +++ b/src/google/adk/agents/base_agent.py @@ -30,7 +30,6 @@ from typing import Union from google.genai import types -from opentelemetry import trace from pydantic import BaseModel from pydantic import ConfigDict from pydantic import Field @@ -39,17 +38,17 @@ from typing_extensions import TypeAlias from ..events.event import Event +from ..events.event_actions import EventActions +from ..telemetry import tracing +from ..telemetry.tracing import tracer from ..utils.context_utils import Aclosing from ..utils.feature_decorator import experimental from .base_agent_config import BaseAgentConfig from .callback_context import CallbackContext -from .common_configs import AgentRefConfig if TYPE_CHECKING: from .invocation_context import InvocationContext -tracer = trace.get_tracer('gcp.vertex.agent') - _SingleAgentCallback: TypeAlias = Callable[ [CallbackContext], Union[Awaitable[Optional[types.Content]], Optional[types.Content]], @@ -68,6 +67,18 @@ SelfAgent = TypeVar('SelfAgent', bound='BaseAgent') +@experimental +class BaseAgentState(BaseModel): + """Base class for all agent states.""" + + model_config = ConfigDict( + extra='forbid', + ) + + +AgentState = TypeVar('AgentState', bound=BaseAgentState) + + class BaseAgent(BaseModel): """Base class for all agents in Agent Development Kit.""" @@ -144,10 +155,56 @@ class MyAgent(BaseAgent): Returns: Optional[types.Content]: The content to return to the user. - When the content is present, the provided content will be used as agent - response and appended to event history as agent response. + When the content is present, an additional event with the provided content + will be appended to event history as an additional agent response. """ + def _load_agent_state( + self, + ctx: InvocationContext, + state_type: Type[AgentState], + ) -> Optional[AgentState]: + """Loads the agent state from the invocation context, handling resumption. + + Args: + ctx: The invocation context. + state_type: The type of the agent state. + + Returns: + The current state if resuming, otherwise None. + """ + if not ctx.is_resumable: + return None + + if self.name not in ctx.agent_states: + return None + else: + return state_type.model_validate(ctx.agent_states.get(self.name)) + + def _create_agent_state_event( + self, + ctx: InvocationContext, + ) -> Event: + """Returns an event with current agent state set in the invocation context. + + Args: + ctx: The invocation context. + + Returns: + An event with the current agent state set in the invocation context. + """ + event_actions = EventActions() + if (agent_state := ctx.agent_states.get(self.name)) is not None: + event_actions.agent_state = agent_state + if ctx.end_of_agents.get(self.name): + event_actions.end_of_agent = True + return Event( + invocation_id=ctx.invocation_id, + author=self.name, + branch=ctx.branch, + actions=event_actions, + ) + def clone( self: SelfAgent, update: Mapping[str, Any] | None = None ) -> SelfAgent: @@ -175,7 +232,7 @@ def clone( invalid_fields = set(update) - allowed_fields if invalid_fields: raise ValueError( - f'Cannot update non-existent fields in {self.__class__.__name__}:' + f'Cannot update nonexistent fields in {self.__class__.__name__}:' f' {invalid_fields}' ) @@ -225,27 +282,22 @@ async def run_async( Event: the events generated by the agent. """ - async def _run_with_trace() -> AsyncGenerator[Event, None]: - with tracer.start_as_current_span(f'agent_run [{self.name}]'): - ctx = self._create_invocation_context(parent_context) + with tracer.start_as_current_span(f'invoke_agent {self.name}') as span: + ctx = self._create_invocation_context(parent_context) + tracing.trace_agent_invocation(span, self, ctx) + if event := await self._handle_before_agent_callback(ctx): + yield event + if ctx.end_invocation: + return - if event := await self.__handle_before_agent_callback(ctx): + async with Aclosing(self._run_async_impl(ctx)) as agen: + async for event in agen: yield event - if ctx.end_invocation: - return - - async with Aclosing(self._run_async_impl(ctx)) as agen: - async for event in agen: - yield event - if ctx.end_invocation: - return - - if event := await self.__handle_after_agent_callback(ctx): - yield event + if ctx.end_invocation: + return - async with Aclosing(_run_with_trace()) as agen: - async for event in agen: + if event := await self._handle_after_agent_callback(ctx): yield event @final @@ -263,24 +315,19 @@ async def run_live( Event: the events generated by the agent. """ - async def _run_with_trace() -> AsyncGenerator[Event, None]: - with tracer.start_as_current_span(f'agent_run [{self.name}]'): - ctx = self._create_invocation_context(parent_context) - - if event := await self.__handle_before_agent_callback(ctx): - yield event - if ctx.end_invocation: - return - - async with Aclosing(self._run_live_impl(ctx)) as agen: - async for event in agen: - yield event + with tracer.start_as_current_span(f'invoke_agent {self.name}') as span: + ctx = self._create_invocation_context(parent_context) + tracing.trace_agent_invocation(span, self, ctx) + if event := await self._handle_before_agent_callback(ctx): + yield event + if ctx.end_invocation: + return - if event := await self.__handle_after_agent_callback(ctx): + async with Aclosing(self._run_live_impl(ctx)) as agen: + async for event in agen: yield event - async with Aclosing(_run_with_trace()) as agen: - async for event in agen: + if event := await self._handle_after_agent_callback(ctx): yield event async def _run_async_impl( @@ -381,7 +428,7 @@ def canonical_after_agent_callbacks(self) -> list[_SingleAgentCallback]: return self.after_agent_callback return [self.after_agent_callback] - async def __handle_before_agent_callback( + async def _handle_before_agent_callback( self, ctx: InvocationContext ) -> Optional[Event]: """Runs the before_agent_callback if it exists. @@ -439,7 +486,7 @@ async def __handle_before_agent_callback( return None - async def __handle_after_agent_callback( + async def _handle_after_agent_callback( self, invocation_context: InvocationContext ) -> Optional[Event]: """Runs the after_agent_callback if it exists. @@ -541,7 +588,7 @@ def from_config( """Creates an agent from a config. If sub-classes uses a custom agent config, override `_from_config_kwargs` - method to return an updated kwargs for agent construstor. + method to return an updated kwargs for agent constructor. Args: config: The config to create the agent from. diff --git a/src/google/adk/agents/common_configs.py b/src/google/adk/agents/common_configs.py index b765fcb30c..f1f9c57f74 100644 --- a/src/google/adk/agents/common_configs.py +++ b/src/google/adk/agents/common_configs.py @@ -65,7 +65,7 @@ class CodeConfig(BaseModel): args: Optional[List[ArgumentConfig]] = None """Optional. The arguments for the code when `name` refers to a function or a - class's contructor. + class's constructor. Examples: ``` diff --git a/src/google/adk/agents/config_schemas/AgentConfig.json b/src/google/adk/agents/config_schemas/AgentConfig.json index 9662a118ab..6fa079cea1 100644 --- a/src/google/adk/agents/config_schemas/AgentConfig.json +++ b/src/google/adk/agents/config_schemas/AgentConfig.json @@ -629,7 +629,7 @@ } ], "default": null, - "description": "Optional. The producer of the content. Must be either 'user' or\n 'model'. Useful to set for multi-turn conversations, otherwise can be\n empty. If role is not specified, SDK will determine the role.", + "description": "Optional. The producer of the content. Must be either 'user' or\n 'model'. Useful to set for multi-turn conversations; otherwise, can be\n empty. If role is not specified, SDK will determine the role.", "title": "Role" } }, @@ -1095,7 +1095,7 @@ } ], "default": null, - "description": "Optional. Display name of the file data. Used to provide a label or filename to distinguish file datas. It is not currently used in the Gemini GenerateContent calls.", + "description": "Optional. Display name of the file data. Used to provide a label or filename to distinguish file data. It is not currently used in the Gemini GenerateContent calls.", "title": "Displayname" }, "fileUri": { @@ -1347,7 +1347,7 @@ } ], "default": null, - "description": "Optional. Describes the parameters to this function in JSON Schema Object format. Reflects the Open API 3.03 Parameter Object. string Key: the name of the parameter. Parameter names are case sensitive. Schema Value: the Schema defining the type used for the parameter. For function with no parameters, this can be left unset. Parameter names must start with a letter or an underscore and must only contain chars a-z, A-Z, 0-9, or underscores with a maximum length of 64. Example with 1 required and 1 optional parameter: type: OBJECT properties: param1: type: STRING param2: type: INTEGER required: - param1" + "description": "Optional. Describes the parameters to this function in JSON Schema Object format. Reflects the Open API 3.03 Parameter Object. string Key: the name of the parameter. Parameter names are case-sensitive. Schema Value: the Schema defining the type used for the parameter. For function with no parameters, this can be left unset. Parameter names must start with a letter or an underscore and must only contain chars a-z, A-Z, 0-9, or underscores with a maximum length of 64. Example with 1 required and 1 optional parameter: type: OBJECT properties: param1: type: STRING param2: type: INTEGER required: - param1" }, "parametersJsonSchema": { "anyOf": [ @@ -4083,7 +4083,7 @@ } ], "default": null, - "description": "Optional. Number of search results to return per query. The default value is 10. The maximumm allowed value is 10.", + "description": "Optional. Number of search results to return per query. The default value is 10. The maximum allowed value is 10.", "title": "Maxresults" } }, @@ -4501,7 +4501,7 @@ }, "mcp__types__Tool": { "additionalProperties": true, - "description": "Definition for a tool the client can call.", + "description": "Definition for a tool that the client can call.", "properties": { "name": { "title": "Name", diff --git a/src/google/adk/agents/context_cache_config.py b/src/google/adk/agents/context_cache_config.py new file mode 100644 index 0000000000..5dbf6598f0 --- /dev/null +++ b/src/google/adk/agents/context_cache_config.py @@ -0,0 +1,84 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from pydantic import BaseModel +from pydantic import ConfigDict +from pydantic import Field + +from ..utils.feature_decorator import experimental + + +@experimental +class ContextCacheConfig(BaseModel): + """Configuration for context caching across all agents in an app. + + This configuration enables and controls context caching behavior for + all LLM agents in an app. When this config is present on an app, context + caching is enabled for all agents. When absent (None), context caching + is disabled. + + Context caching can significantly reduce costs and improve response times + by reusing previously processed context across multiple requests. + + Attributes: + cache_intervals: Maximum number of invocations to reuse the same cache before refreshing it + ttl_seconds: Time-to-live for cache in seconds + min_tokens: Minimum tokens required to enable caching + """ + + model_config = ConfigDict( + extra="forbid", + ) + + cache_intervals: int = Field( + default=10, + ge=1, + le=100, + description=( + "Maximum number of invocations to reuse the same cache before" + " refreshing it" + ), + ) + + ttl_seconds: int = Field( + default=1800, # 30 minutes + gt=0, + description="Time-to-live for cache in seconds", + ) + + min_tokens: int = Field( + default=0, + ge=0, + description=( + "Minimum estimated request tokens required to enable caching. This" + " compares against the estimated total tokens of the request (system" + " instruction + tools + contents). Context cache storage may have" + " cost. Set higher to avoid caching small requests where overhead may" + " exceed benefits." + ), + ) + + @property + def ttl_string(self) -> str: + """Get TTL as string format for cache creation.""" + return f"{self.ttl_seconds}s" + + def __str__(self) -> str: + """String representation for logging.""" + return ( + f"ContextCacheConfig(cache_intervals={self.cache_intervals}, " + f"ttl={self.ttl_seconds}s, min_tokens={self.min_tokens})" + ) diff --git a/src/google/adk/agents/invocation_context.py b/src/google/adk/agents/invocation_context.py index 18833d994c..e972a65eda 100644 --- a/src/google/adk/agents/invocation_context.py +++ b/src/google/adk/agents/invocation_context.py @@ -14,6 +14,7 @@ from __future__ import annotations +from typing import Any from typing import Optional import uuid @@ -23,14 +24,18 @@ from pydantic import Field from pydantic import PrivateAttr +from ..apps.app import ResumabilityConfig from ..artifacts.base_artifact_service import BaseArtifactService from ..auth.credential_service.base_credential_service import BaseCredentialService +from ..events.event import Event from ..memory.base_memory_service import BaseMemoryService from ..plugins.plugin_manager import PluginManager from ..sessions.base_session_service import BaseSessionService from ..sessions.session import Session from .active_streaming_tool import ActiveStreamingTool from .base_agent import BaseAgent +from .base_agent import BaseAgentState +from .context_cache_config import ContextCacheConfig from .live_request_queue import LiveRequestQueue from .run_config import RunConfig from .transcription_entry import TranscriptionEntry @@ -139,6 +144,7 @@ class InvocationContext(BaseModel): session_service: BaseSessionService memory_service: Optional[BaseMemoryService] = None credential_service: Optional[BaseCredentialService] = None + context_cache_config: Optional[ContextCacheConfig] = None invocation_id: str """The id of this invocation context. Readonly.""" @@ -158,6 +164,12 @@ class InvocationContext(BaseModel): session: Session """The current session of this invocation context. Readonly.""" + agent_states: dict[str, dict[str, Any]] = Field(default_factory=dict) + """The state of the agent for this invocation.""" + + end_of_agents: dict[str, bool] = Field(default_factory=dict) + """The end of agent status for each agent in this invocation.""" + end_invocation: bool = False """Whether to end this invocation. @@ -184,6 +196,9 @@ class InvocationContext(BaseModel): run_config: Optional[RunConfig] = None """Configurations for live agents under this invocation.""" + resumability_config: Optional[ResumabilityConfig] = None + """The resumability config that applies to all agents under this invocation.""" + plugin_manager: PluginManager = Field(default_factory=PluginManager) """The manager for keeping track of plugins in this invocation.""" @@ -194,6 +209,96 @@ class InvocationContext(BaseModel): of this invocation. """ + @property + def is_resumable(self) -> bool: + """Returns whether the current invocation is resumable.""" + return ( + self.resumability_config is not None + and self.resumability_config.is_resumable + ) + + def set_agent_state( + self, + agent_name: str, + *, + agent_state: Optional[BaseAgentState] = None, + end_of_agent: bool = False, + ) -> None: + """Sets the state of an agent in this invocation. + + * If end_of_agent is True, will set the end_of_agent flag to True and + clear the agent_state. + * Otherwise, if agent_state is not None, will set the agent_state and + reset the end_of_agent flag to False. + * Otherwise, will clear the agent_state and end_of_agent flag, to allow the + agent to re-run. + + Args: + agent_name: The name of the agent. + agent_state: The state of the agent. Will be ignored if end_of_agent is + True. + end_of_agent: Whether the agent has finished running. + """ + if end_of_agent: + self.end_of_agents[agent_name] = True + self.agent_states.pop(agent_name, None) + elif agent_state is not None: + self.agent_states[agent_name] = agent_state.model_dump(mode="json") + self.end_of_agents[agent_name] = False + else: + self.end_of_agents.pop(agent_name, None) + self.agent_states.pop(agent_name, None) + + def reset_sub_agent_states( + self, + agent_name: str, + ) -> None: + """Resets the state of all sub-agents of the given agent in this invocation. + + Args: + agent_name: The name of the agent whose sub-agent states need to be reset. + """ + agent = self.agent.find_agent(agent_name) + if not agent: + return + + for sub_agent in agent.sub_agents: + # Reset the sub-agent's state in the context to ensure that each + # sub-agent starts fresh. + self.set_agent_state(sub_agent.name) + self.reset_sub_agent_states(sub_agent.name) + + def populate_invocation_agent_states(self) -> None: + """Populates agent states for the current invocation if it is resumable. + + For history events that contain agent state information, set the + agent_state and end_of_agent of the agent that generated the event. + + For non-workflow agents, also set an initial agent_state if it has + already generated some contents. + """ + if not self.is_resumable: + return + for event in self._get_events(current_invocation=True): + if event.actions.end_of_agent: + self.end_of_agents[event.author] = True + # Delete agent_state when it is end + self.agent_states.pop(event.author, None) + elif event.actions.agent_state is not None: + self.agent_states[event.author] = event.actions.agent_state + # Invalidate the end_of_agent flag + self.end_of_agents[event.author] = False + elif ( + event.author != "user" + and event.content + and not self.agent_states.get(event.author) + ): + # If the agent has generated some contents but its agent_state is not + # set, set its agent_state to an empty agent_state. + self.agent_states[event.author] = BaseAgentState() + # Invalidate the end_of_agent flag + self.end_of_agents[event.author] = False + def increment_llm_call_count( self, ): @@ -215,6 +320,89 @@ def app_name(self) -> str: def user_id(self) -> str: return self.session.user_id + # TODO: Move this method from invocation_context to a dedicated module. + def _get_events( + self, + *, + current_invocation: bool = False, + current_branch: bool = False, + ) -> list[Event]: + """Returns the events from the current session. + + Args: + current_invocation: Whether to filter the events by the current + invocation. + current_branch: Whether to filter the events by the current branch. + + Returns: + A list of events from the current session. + """ + results = self.session.events + if current_invocation: + results = [ + event + for event in results + if event.invocation_id == self.invocation_id + ] + if current_branch: + results = [event for event in results if event.branch == self.branch] + return results + + def should_pause_invocation(self, event: Event) -> bool: + """Returns whether to pause the invocation right after this event. + + "Pausing" an invocation is different from "ending" an invocation. A paused + invocation can be resumed later, while an ended invocation cannot. + + Pausing the current agent's run will also pause all the agents that + depend on its execution, i.e. the subsequent agents in a workflow, and the + current agent's ancestors, etc. + + Note that parallel sibling agents won't be affected, but their common + ancestors will be paused after all the non-blocking sub-agents finished + running. + + Should meet all following conditions to pause an invocation: + 1. The app is resumable. + 2. The current event has a long running function call. + + Args: + event: The current event. + + Returns: + Whether to pause the invocation right after this event. + """ + if not self.is_resumable: + return False + + if not event.long_running_tool_ids or not event.get_function_calls(): + return False + + for fc in event.get_function_calls(): + if fc.id in event.long_running_tool_ids: + return True + + return False + + # TODO: Move this method from invocation_context to a dedicated module. + # TODO: Converge this method with find_matching_function_call in llm_flows. + def _find_matching_function_call( + self, function_response_event: Event + ) -> Optional[Event]: + """Finds the function call event in the current invocation that matches the function response id.""" + function_responses = function_response_event.get_function_responses() + if not function_responses: + return None + function_call_id = function_responses[0].id + + events = self._get_events(current_invocation=True) + # The last event is function_response_event, so we search backwards from the + # one before it. + for event in reversed(events[:-1]): + if any(fc.id == function_call_id for fc in event.get_function_calls()): + return event + return None + def new_invocation_context_id() -> str: return "e-" + str(uuid.uuid4()) diff --git a/src/google/adk/agents/llm_agent.py b/src/google/adk/agents/llm_agent.py index f54cd6e06e..d3c5e70941 100644 --- a/src/google/adk/agents/llm_agent.py +++ b/src/google/adk/agents/llm_agent.py @@ -21,12 +21,14 @@ from typing import AsyncGenerator from typing import Awaitable from typing import Callable +from typing import cast from typing import ClassVar from typing import Dict from typing import Literal from typing import Optional from typing import Type from typing import Union +import warnings from google.genai import types from pydantic import BaseModel @@ -56,6 +58,7 @@ from ..utils.context_utils import Aclosing from ..utils.feature_decorator import experimental from .base_agent import BaseAgent +from .base_agent import BaseAgentState from .base_agent_config import BaseAgentConfig from .callback_context import CallbackContext from .invocation_context import InvocationContext @@ -104,6 +107,16 @@ list[_SingleAfterToolCallback], ] +_SingleOnToolErrorCallback: TypeAlias = Callable[ + [BaseTool, dict[str, Any], ToolContext, Exception], + Union[Awaitable[Optional[dict]], Optional[dict]], +] + +OnToolErrorCallback: TypeAlias = Union[ + _SingleOnToolErrorCallback, + list[_SingleOnToolErrorCallback], +] + InstructionProvider: TypeAlias = Callable[ [ReadonlyContext], Union[str, Awaitable[str]] ] @@ -112,8 +125,44 @@ async def _convert_tool_union_to_tools( - tool_union: ToolUnion, ctx: ReadonlyContext + tool_union: ToolUnion, + ctx: ReadonlyContext, + model: Union[str, BaseLlm], + multiple_tools: bool = False, ) -> list[BaseTool]: + from ..tools.google_search_tool import GoogleSearchTool + from ..tools.vertex_ai_search_tool import VertexAiSearchTool + + # Wrap google_search tool with AgentTool if there are multiple tools because + # the built-in tools cannot be used together with other tools. + # TODO(b/448114567): Remove once the workaround is no longer needed. + if multiple_tools and isinstance(tool_union, GoogleSearchTool): + from ..tools.google_search_agent_tool import create_google_search_agent + from ..tools.google_search_agent_tool import GoogleSearchAgentTool + + search_tool = cast(GoogleSearchTool, tool_union) + if search_tool.bypass_multi_tools_limit: + return [GoogleSearchAgentTool(create_google_search_agent(model))] + + # Replace VertexAiSearchTool with DiscoveryEngineSearchTool if there are + # multiple tools because the built-in tools cannot be used together with + # other tools. + # TODO(b/448114567): Remove once the workaround is no longer needed. + if multiple_tools and isinstance(tool_union, VertexAiSearchTool): + from ..tools.discovery_engine_search_tool import DiscoveryEngineSearchTool + + vais_tool = cast(VertexAiSearchTool, tool_union) + if vais_tool.bypass_multi_tools_limit: + return [ + DiscoveryEngineSearchTool( + data_store_id=vais_tool.data_store_id, + data_store_specs=vais_tool.data_store_specs, + search_engine_id=vais_tool.search_engine_id, + filter=vais_tool.filter, + max_results=vais_tool.max_results, + ) + ] + if isinstance(tool_union, BaseTool): return [tool_union] if callable(tool_union): @@ -136,17 +185,83 @@ class LlmAgent(BaseAgent): """The config type for this agent.""" instruction: Union[str, InstructionProvider] = '' - """Instructions for the LLM model, guiding the agent's behavior.""" + """Dynamic instructions for the LLM model, guiding the agent's behavior. + + These instructions can contain placeholders like {variable_name} that will be + resolved at runtime using session state and context. + + **Behavior depends on static_instruction:** + - If static_instruction is None: instruction goes to system_instruction + - If static_instruction is set: instruction goes to user content in the request + + This allows for context caching optimization where static content (static_instruction) + comes first in the prompt, followed by dynamic content (instruction). + """ global_instruction: Union[str, InstructionProvider] = '' """Instructions for all the agents in the entire agent tree. + DEPRECATED: This field is deprecated and will be removed in a future version. + Use GlobalInstructionPlugin instead, which provides the same functionality + at the App level. See migration guide for details. + ONLY the global_instruction in root agent will take effect. For example: use global_instruction to make all agents have a stable identity or personality. """ + static_instruction: Optional[types.ContentUnion] = None + """Static instruction content sent literally as system instruction at the beginning. + + This field is for content that never changes and doesn't contain placeholders. + It's sent directly to the model without any processing or variable substitution. + + This field is primarily for context caching optimization. Static instructions + are sent as system instruction at the beginning of the request, allowing + for improved performance when the static portion remains unchanged. Live API + has its own cache mechanism, thus this field doesn't work with Live API. + + **Impact on instruction field:** + - When static_instruction is None: instruction → system_instruction + - When static_instruction is set: instruction → user content (after static content) + + **Context Caching:** + - **Implicit Cache**: Automatic caching by model providers (no config needed) + - **Explicit Cache**: Cache explicitly created by user for instructions, tools and contents + + See below for more information of Implicit Cache and Explicit Cache + Gemini API: https://ai.google.dev/gemini-api/docs/caching?lang=python + Vertex API: https://cloud.google.com/vertex-ai/generative-ai/docs/context-cache/context-cache-overview + + Setting static_instruction alone does NOT enable caching automatically. + For explicit caching control, configure context_cache_config at App level. + + **Content Support:** + Accepts types.ContentUnion which includes: + - str: Simple text instruction + - types.Content: Rich content object + - types.Part: Single part (text, inline_data, file_data, etc.) + - PIL.Image.Image: Image object + - types.File: File reference + - list[PartUnion]: List of parts + + **Examples:** + ```python + # Simple string instruction + static_instruction = "You are a helpful assistant." + + # Rich content with files + static_instruction = types.Content( + role='user', + parts=[ + types.Part(text='You are a helpful assistant.'), + types.Part(file_data=types.FileData(...)) + ] + ) + ``` + """ + tools: list[ToolUnion] = Field(default_factory=list) """Tools available to this agent.""" @@ -164,8 +279,9 @@ class LlmAgent(BaseAgent): disallow_transfer_to_parent: bool = False """Disallows LLM-controlled transferring to the parent agent. - NOTE: Setting this as True also prevents this agent to continue reply to the - end-user. This behavior prevents one-way transfer, in which end-user may be + NOTE: Setting this as True also prevents this agent from continuing to reply + to the end-user, and will transfer control back to the parent agent in the + next turn. This behavior prevents one-way transfer, in which end-user may be stuck with one agent that cannot transfer to other agents in the agent tree. """ disallow_transfer_to_peers: bool = False @@ -277,6 +393,21 @@ class LlmAgent(BaseAgent): tool_context: ToolContext, tool_response: The response from the tool. + Returns: + When present, the returned dict will be used as tool result. + """ + on_tool_error_callback: Optional[OnToolErrorCallback] = None + """Callback or list of callbacks to be called when a tool call encounters an error. + + When a list of callbacks is provided, the callbacks will be called in the + order they are listed until a callback does not return None. + + Args: + tool: The tool to be called. + args: The arguments to the tool. + tool_context: ToolContext, + error: The error from the tool call. + Returns: When present, the returned dict will be used as tool result. """ @@ -286,10 +417,44 @@ class LlmAgent(BaseAgent): async def _run_async_impl( self, ctx: InvocationContext ) -> AsyncGenerator[Event, None]: + agent_state = self._load_agent_state(ctx, BaseAgentState) + + # If there is an sub-agent to resume, run it and then end the current + # agent. + if agent_state is not None and ( + agent_to_transfer := self._get_subagent_to_resume(ctx) + ): + async with Aclosing(agent_to_transfer.run_async(ctx)) as agen: + async for event in agen: + yield event + + ctx.set_agent_state(self.name, end_of_agent=True) + yield self._create_agent_state_event(ctx) + return + + should_pause = False async with Aclosing(self._llm_flow.run_async(ctx)) as agen: async for event in agen: self.__maybe_save_output_to_state(event) yield event + if ctx.should_pause_invocation(event): + # Do not pause immediately, wait until the long running tool call is + # executed. + should_pause = True + if should_pause: + return + + if ctx.is_resumable: + events = ctx._get_events(current_invocation=True, current_branch=True) + if events and ( + ctx.should_pause_invocation(events[-1]) + or ctx.should_pause_invocation(events[-2]) + ): + return + # Only yield an end state if the last event is no longer a long running + # tool call. + ctx.set_agent_state(self.name, end_of_agent=True) + yield self._create_agent_state_event(ctx) @override async def _run_live_impl( @@ -360,6 +525,16 @@ async def canonical_global_instruction( bypass_state_injection: Whether the instruction is based on InstructionProvider. """ + # Issue deprecation warning if global_instruction is being used + if self.global_instruction: + warnings.warn( + 'global_instruction field is deprecated and will be removed in a' + ' future version. Use GlobalInstructionPlugin instead for the same' + ' functionality at the App level. See migration guide for details.', + DeprecationWarning, + stacklevel=2, + ) + if isinstance(self.global_instruction, str): return self.global_instruction, False else: @@ -376,8 +551,16 @@ async def canonical_tools( This method is only for use by Agent Development Kit. """ resolved_tools = [] + # We may need to wrap some built-in tools if there are other tools + # because the built-in tools cannot be used together with other tools. + # TODO(b/448114567): Remove once the workaround is no longer needed. + multiple_tools = len(self.tools) > 1 for tool_union in self.tools: - resolved_tools.extend(await _convert_tool_union_to_tools(tool_union, ctx)) + resolved_tools.extend( + await _convert_tool_union_to_tools( + tool_union, ctx, self.model, multiple_tools + ) + ) return resolved_tools @property @@ -434,6 +617,20 @@ def canonical_after_tool_callbacks( return self.after_tool_callback return [self.after_tool_callback] + @property + def canonical_on_tool_error_callbacks( + self, + ) -> list[OnToolErrorCallback]: + """The resolved self.on_tool_error_callback field as a list of OnToolErrorCallback. + + This method is only for use by Agent Development Kit. + """ + if not self.on_tool_error_callback: + return [] + if isinstance(self.on_tool_error_callback, list): + return self.on_tool_error_callback + return [self.on_tool_error_callback] + @property def _llm_flow(self) -> BaseLlmFlow: if ( @@ -445,6 +642,108 @@ def _llm_flow(self) -> BaseLlmFlow: else: return AutoFlow() + def _get_subagent_to_resume( + self, ctx: InvocationContext + ) -> Optional[BaseAgent]: + """Returns the sub-agent in the llm tree to resume if it exists. + + There are 2 cases where we need to transfer to and resume a sub-agent: + 1. The last event is a transfer to agent response from the current agent. + In this case, we need to return the agent specified in the response. + + 2. The last event's author isn't the current agent, or the user is + responding to another agent's tool call. + In this case, we need to return the LAST agent being transferred to + from the current agent. + """ + events = ctx._get_events(current_invocation=True, current_branch=True) + if not events: + return None + + last_event = events[-1] + if last_event.author == self.name: + # Last event is from current agent. Return transfer_to_agent in the event + # if it exists, or None. + return self.__get_transfer_to_agent_or_none(last_event, self.name) + + # Last event is from user or another agent. + if last_event.author == 'user': + function_call_event = ctx._find_matching_function_call(last_event) + if not function_call_event: + raise ValueError( + 'No agent to transfer to for resuming agent from function response' + f' {self.name}' + ) + if function_call_event.author == self.name: + # User is responding to a tool call from the current agent. + # Current agent should continue, so no sub-agent to resume. + return None + + # Last event is from another agent, or from user for another agent's tool + # call. We need to find the last agent we transferred to. + for event in reversed(events): + if agent := self.__get_transfer_to_agent_or_none(event, self.name): + return agent + + return None + + def __get_agent_to_run(self, agent_name: str) -> BaseAgent: + """Find the agent to run under the root agent by name.""" + agent_to_run = self.root_agent.find_agent(agent_name) + if not agent_to_run: + available = self._get_available_agent_names() + error_msg = ( + f"Agent '{agent_name}' not found.\n" + f"Available agents: {', '.join(available)}\n\n" + 'Possible causes:\n' + ' 1. Agent not registered before being referenced\n' + ' 2. Agent name mismatch (typo or case sensitivity)\n' + ' 3. Timing issue (agent referenced before creation)\n\n' + 'Suggested fixes:\n' + ' - Verify agent is registered with root agent\n' + ' - Check agent name spelling and case\n' + ' - Ensure agents are created before being referenced' + ) + raise ValueError(error_msg) + return agent_to_run + + def _get_available_agent_names(self) -> list[str]: + """Helper to get all agent names in the tree for error reporting. + + This is a private helper method used only for error message formatting. + Traverses the agent tree starting from root_agent and collects all + agent names for display in error messages. + + Returns: + List of all agent names in the agent tree. + """ + agents = [] + + def collect_agents(agent): + agents.append(agent.name) + if hasattr(agent, 'sub_agents') and agent.sub_agents: + for sub_agent in agent.sub_agents: + collect_agents(sub_agent) + + collect_agents(self.root_agent) + return agents + + def __get_transfer_to_agent_or_none( + self, event: Event, from_agent: str + ) -> Optional[BaseAgent]: + """Returns the agent to run if the event is a transfer to agent response.""" + function_responses = event.get_function_responses() + if not function_responses: + return None + for function_response in function_responses: + if ( + function_response.name == 'transfer_to_agent' + and event.author == from_agent + and event.actions.transfer_to_agent != from_agent + ): + return self.__get_agent_to_run(event.actions.transfer_to_agent) + return None + def __maybe_save_output_to_state(self, event: Event): """Saves the model output to state if needed.""" # skip if the event was authored by some other agent (e.g. current agent @@ -464,7 +763,9 @@ def __maybe_save_output_to_state(self, event: Event): ): result = ''.join( - [part.text if part.text else '' for part in event.content.parts] + part.text + for part in event.content.parts + if part.text and not part.thought ) if self.output_schema: # If the result from the final chunk is just whitespace or empty, @@ -477,32 +778,8 @@ def __maybe_save_output_to_state(self, event: Event): @model_validator(mode='after') def __model_validator_after(self) -> LlmAgent: - self.__check_output_schema() return self - def __check_output_schema(self): - if not self.output_schema: - return - - if ( - not self.disallow_transfer_to_parent - or not self.disallow_transfer_to_peers - ): - logger.warning( - 'Invalid config for agent %s: output_schema cannot co-exist with' - ' agent transfer configurations. Setting' - ' disallow_transfer_to_parent=True, disallow_transfer_to_peers=True', - self.name, - ) - self.disallow_transfer_to_parent = True - self.disallow_transfer_to_peers = True - - if self.sub_agents: - raise ValueError( - f'Invalid config for agent {self.name}: if output_schema is set,' - ' sub_agents must be empty to disable agent transfer.' - ) - @field_validator('generate_content_config', mode='after') @classmethod def validate_generate_content_config( @@ -598,6 +875,8 @@ def _parse_config( kwargs['model'] = config.model if config.instruction: kwargs['instruction'] = config.instruction + if config.static_instruction: + kwargs['static_instruction'] = config.static_instruction if config.disallow_transfer_to_parent: kwargs['disallow_transfer_to_parent'] = config.disallow_transfer_to_parent if config.disallow_transfer_to_peers: diff --git a/src/google/adk/agents/llm_agent_config.py b/src/google/adk/agents/llm_agent_config.py index 1aa935d97d..7d2493597e 100644 --- a/src/google/adk/agents/llm_agent_config.py +++ b/src/google/adk/agents/llm_agent_config.py @@ -35,6 +35,10 @@ class LlmAgentConfig(BaseAgentConfig): model_config = ConfigDict( extra='forbid', + # Allow arbitrary types to support types.ContentUnion for static_instruction. + # ContentUnion includes PIL.Image.Image which doesn't have Pydantic schema + # support, but we validate it at runtime using google.genai._transformers.t_content() + arbitrary_types_allowed=True, ) agent_class: str = Field( @@ -53,7 +57,26 @@ class LlmAgentConfig(BaseAgentConfig): ), ) - instruction: str = Field(description='Required. LlmAgent.instruction.') + instruction: str = Field( + description=( + 'Required. LlmAgent.instruction. Dynamic instructions with' + ' placeholder support. Behavior: if static_instruction is None, goes' + ' to system_instruction; if static_instruction is set, goes to user' + ' content after static content.' + ) + ) + + static_instruction: Optional[types.ContentUnion] = Field( + default=None, + description=( + 'Optional. LlmAgent.static_instruction. Static content sent literally' + ' at position 0 without placeholder processing. When set, changes' + ' instruction behavior to go to user content instead of' + ' system_instruction. Supports context caching. Accepts' + ' types.ContentUnion (str, types.Content, types.Part,' + ' PIL.Image.Image, types.File, or list[PartUnion]).' + ), + ) disallow_transfer_to_parent: Optional[bool] = Field( default=None, @@ -120,7 +143,7 @@ class LlmAgentConfig(BaseAgentConfig): ``` # tools.py - my_mcp_toolset = MCPToolset( + my_mcp_toolset = McpToolset( connection_params=StdioServerParameters( command="npx", args=["-y", "@notionhq/notion-mcp-server"], diff --git a/src/google/adk/agents/loop_agent.py b/src/google/adk/agents/loop_agent.py index 1313d208e5..6129d12ce2 100644 --- a/src/google/adk/agents/loop_agent.py +++ b/src/google/adk/agents/loop_agent.py @@ -16,23 +16,37 @@ from __future__ import annotations +import logging from typing import Any from typing import AsyncGenerator from typing import ClassVar from typing import Dict from typing import Optional -from typing import Type from typing_extensions import override -from ..agents.invocation_context import InvocationContext from ..events.event import Event from ..utils.context_utils import Aclosing from ..utils.feature_decorator import experimental from .base_agent import BaseAgent +from .base_agent import BaseAgentState from .base_agent_config import BaseAgentConfig +from .invocation_context import InvocationContext from .loop_agent_config import LoopAgentConfig +logger = logging.getLogger('google_adk.' + __name__) + + +@experimental +class LoopAgentState(BaseAgentState): + """State for LoopAgent.""" + + current_sub_agent: str = '' + """The name of the current sub-agent to run in the loop.""" + + times_looped: int = 0 + """The number of times the loop agent has looped.""" + class LoopAgent(BaseAgent): """A shell agent that run its sub-agents in a loop. @@ -55,21 +69,80 @@ class LoopAgent(BaseAgent): async def _run_async_impl( self, ctx: InvocationContext ) -> AsyncGenerator[Event, None]: - times_looped = 0 - while not self.max_iterations or times_looped < self.max_iterations: - for sub_agent in self.sub_agents: - should_exit = False + if not self.sub_agents: + return + + agent_state = self._load_agent_state(ctx, LoopAgentState) + is_resuming_at_current_agent = agent_state is not None + times_looped, start_index = self._get_start_state(agent_state) + + should_exit = False + pause_invocation = False + while ( + not self.max_iterations or times_looped < self.max_iterations + ) and not (should_exit or pause_invocation): + for i in range(start_index, len(self.sub_agents)): + sub_agent = self.sub_agents[i] + + if ctx.is_resumable and not is_resuming_at_current_agent: + # If we are resuming from the current event, it means the same event + # has already been logged, so we should avoid yielding it again. + agent_state = LoopAgentState( + current_sub_agent=sub_agent.name, + times_looped=times_looped, + ) + ctx.set_agent_state(self.name, agent_state=agent_state) + yield self._create_agent_state_event(ctx) + + is_resuming_at_current_agent = False + async with Aclosing(sub_agent.run_async(ctx)) as agen: async for event in agen: yield event if event.actions.escalate: should_exit = True + if ctx.should_pause_invocation(event): + pause_invocation = True - if should_exit: - return + if should_exit or pause_invocation: + break # break inner for loop + # Restart from the beginning of the loop. + start_index = 0 times_looped += 1 - return + # Reset the state of all sub-agents in the loop. + ctx.reset_sub_agent_states(self.name) + + # If the invocation is paused, we should not yield the end of agent event. + if pause_invocation: + return + + if ctx.is_resumable: + ctx.set_agent_state(self.name, end_of_agent=True) + yield self._create_agent_state_event(ctx) + + def _get_start_state( + self, + agent_state: Optional[LoopAgentState], + ) -> tuple[int, int]: + """Computes the start state of the loop agent from the agent state.""" + if not agent_state: + return 0, 0 + + times_looped = agent_state.times_looped + start_index = 0 + if agent_state.current_sub_agent: + try: + sub_agent_names = [sub_agent.name for sub_agent in self.sub_agents] + start_index = sub_agent_names.index(agent_state.current_sub_agent) + except ValueError: + # A sub-agent was removed so the agent name is not found. + # For now, we restart from the beginning. + logger.warning( + 'Sub-agent %s was not found. Restarting from the beginning.', + agent_state.current_sub_agent, + ) + return times_looped, start_index @override async def _run_live_impl( diff --git a/src/google/adk/agents/mcp_instruction_provider.py b/src/google/adk/agents/mcp_instruction_provider.py new file mode 100644 index 0000000000..e9f40663c9 --- /dev/null +++ b/src/google/adk/agents/mcp_instruction_provider.py @@ -0,0 +1,107 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Provides instructions to an agent by fetching prompts from an MCP server.""" + +from __future__ import annotations + +import logging +import sys +from typing import Any +from typing import Dict +from typing import TextIO + +from .llm_agent import InstructionProvider +from .readonly_context import ReadonlyContext + +# Attempt to import MCP Session Manager from the MCP library, and hints user to +# upgrade their Python version to 3.10 if it fails. +try: + from mcp import types + + from ..tools.mcp_tool.mcp_session_manager import MCPSessionManager +except ImportError as e: + if sys.version_info < (3, 10): + raise ImportError( + "MCP Session Manager requires Python 3.10 or above. Please upgrade" + " your Python version." + ) from e + else: + raise e + + +class McpInstructionProvider(InstructionProvider): + """Fetches agent instructions from an MCP server.""" + + def __init__( + self, + connection_params: Any, + prompt_name: str, + errlog: TextIO = sys.stderr, + ): + """Initializes the McpInstructionProvider. + + Args: + connection_params: Parameters for connecting to the MCP server. + prompt_name: The name of the MCP Prompt to fetch. + errlog: TextIO stream for error logging. + """ + self._connection_params = connection_params + self._errlog = errlog or logging.getLogger(__name__) + self._mcp_session_manager = MCPSessionManager( + connection_params=self._connection_params, + errlog=self._errlog, + ) + self.prompt_name = prompt_name + + async def __call__(self, context: ReadonlyContext) -> str: + """Fetches the instruction from the MCP server. + + Args: + context: The read-only context of the agent. + + Returns: + The instruction string. + """ + session = await self._mcp_session_manager.create_session() + # Fetch prompt definition to get the required argument names + prompt_definitions = await session.list_prompts() + prompt_definition = next( + (p for p in prompt_definitions.prompts if p.name == self.prompt_name), + None, + ) + + # Fetch arguments from context state if the prompt requires them + prompt_args: Dict[str, Any] = {} + if prompt_definition and prompt_definition.arguments: + arg_names = {arg.name for arg in prompt_definition.arguments} + prompt_args = { + k: v for k, v in (context.state or {}).items() if k in arg_names + } + + # Fetch the specific prompt by name with arguments from context state + prompt_result: types.GetPromptResult = await session.get_prompt( + self.prompt_name, arguments=prompt_args + ) + + if prompt_result and prompt_result.messages: + # Concatenate content of all messages to form the instruction. + instruction = "".join( + message.content.text + for message in prompt_result.messages + if message.content.type == "text" + ) + return instruction + else: + raise ValueError(f"Failed to load MCP prompt '{self.prompt_name}'.") diff --git a/src/google/adk/agents/parallel_agent.py b/src/google/adk/agents/parallel_agent.py index b1237a1c1d..f7270a75c9 100644 --- a/src/google/adk/agents/parallel_agent.py +++ b/src/google/adk/agents/parallel_agent.py @@ -26,6 +26,7 @@ from ..events.event import Event from ..utils.context_utils import Aclosing from .base_agent import BaseAgent +from .base_agent import BaseAgentState from .base_agent_config import BaseAgentConfig from .invocation_context import InvocationContext from .parallel_agent_config import ParallelAgentConfig @@ -159,7 +160,7 @@ async def process_an_agent(events_for_one_agent): class ParallelAgent(BaseAgent): - """A shell agent that run its sub-agents in parallel in isolated manner. + """A shell agent that runs its sub-agents in parallel in an isolated manner. This approach is beneficial for scenarios requiring multiple perspectives or attempts on a single task, such as: @@ -175,22 +176,48 @@ class ParallelAgent(BaseAgent): async def _run_async_impl( self, ctx: InvocationContext ) -> AsyncGenerator[Event, None]: - agent_runs = [ - sub_agent.run_async( - _create_branch_ctx_for_sub_agent(self, sub_agent, ctx) - ) - for sub_agent in self.sub_agents - ] + if not self.sub_agents: + return + + agent_state = self._load_agent_state(ctx, BaseAgentState) + if ctx.is_resumable and agent_state is None: + ctx.set_agent_state(self.name, agent_state=BaseAgentState()) + yield self._create_agent_state_event(ctx) + + agent_runs = [] + # Prepare and collect async generators for each sub-agent. + for sub_agent in self.sub_agents: + sub_agent_ctx = _create_branch_ctx_for_sub_agent(self, sub_agent, ctx) + + # Only include sub-agents that haven't finished in a previous run. + if not sub_agent_ctx.end_of_agents.get(sub_agent.name): + agent_runs.append(sub_agent.run_async(sub_agent_ctx)) + + pause_invocation = False try: # TODO remove if once Python <3.11 is no longer supported. - if sys.version_info >= (3, 11): - async with Aclosing(_merge_agent_run(agent_runs)) as agen: - async for event in agen: - yield event - else: - async with Aclosing(_merge_agent_run_pre_3_11(agent_runs)) as agen: - async for event in agen: - yield event + merge_func = ( + _merge_agent_run + if sys.version_info >= (3, 11) + else _merge_agent_run_pre_3_11 + ) + + async with Aclosing(merge_func(agent_runs)) as agen: + async for event in agen: + yield event + if ctx.should_pause_invocation(event): + pause_invocation = True + + if pause_invocation: + return + + # Once all sub-agents are done, mark the ParallelAgent as final. + if ctx.is_resumable and all( + ctx.end_of_agents.get(sub_agent.name) for sub_agent in self.sub_agents + ): + ctx.set_agent_state(self.name, end_of_agent=True) + yield self._create_agent_state_event(ctx) + finally: for sub_agent_run in agent_runs: await sub_agent_run.aclose() diff --git a/src/google/adk/agents/readonly_context.py b/src/google/adk/agents/readonly_context.py index 548425367d..c067fd11d9 100644 --- a/src/google/adk/agents/readonly_context.py +++ b/src/google/adk/agents/readonly_context.py @@ -22,6 +22,7 @@ if TYPE_CHECKING: from google.genai import types + from ..sessions.session import Session from .invocation_context import InvocationContext @@ -52,3 +53,8 @@ def agent_name(self) -> str: def state(self) -> MappingProxyType[str, Any]: """The state of the current session. READONLY field.""" return MappingProxyType(self._invocation_context.session.state) + + @property + def session(self) -> Session: + """The current session for this invocation.""" + return self._invocation_context.session diff --git a/src/google/adk/agents/remote_a2a_agent.py b/src/google/adk/agents/remote_a2a_agent.py index 0595ee20bc..af070bb8c6 100644 --- a/src/google/adk/agents/remote_a2a_agent.py +++ b/src/google/adk/agents/remote_a2a_agent.py @@ -36,6 +36,9 @@ from a2a.types import Message as A2AMessage from a2a.types import Part as A2APart from a2a.types import Role + from a2a.types import TaskArtifactUpdateEvent as A2ATaskArtifactUpdateEvent + from a2a.types import TaskState + from a2a.types import TaskStatusUpdateEvent as A2ATaskStatusUpdateEvent from a2a.types import TransportProtocol as A2ATransport except ImportError as e: import sys @@ -188,12 +191,16 @@ async def _ensure_httpx_client(self) -> httpx.AsyncClient: ) self._httpx_client_needs_cleanup = True if self._a2a_client_factory: + registry = self._a2a_client_factory._registry self._a2a_client_factory = A2AClientFactory( config=dataclasses.replace( self._a2a_client_factory._config, httpx_client=self._httpx_client, - ) + ), + consumers=self._a2a_client_factory._consumers, ) + for label, generator in registry.items(): + self._a2a_client_factory.register(label, generator) if not self._a2a_client_factory: client_config = A2AClientConfig( httpx_client=self._httpx_client, @@ -330,26 +337,15 @@ def _create_a2a_request_for_user_function_response( ctx.session.events[-1], ctx, Role.user, self._genai_part_converter ) if function_call_event.custom_metadata: - a2a_message.task_id = ( - function_call_event.custom_metadata.get( - A2A_METADATA_PREFIX + "task_id" - ) - if function_call_event.custom_metadata - else None - ) - a2a_message.context_id = ( - function_call_event.custom_metadata.get( - A2A_METADATA_PREFIX + "context_id" - ) - if function_call_event.custom_metadata - else None - ) + metadata = function_call_event.custom_metadata + a2a_message.task_id = metadata.get(A2A_METADATA_PREFIX + "task_id") + a2a_message.context_id = metadata.get(A2A_METADATA_PREFIX + "context_id") return a2a_message def _construct_message_parts_from_session( self, ctx: InvocationContext - ) -> tuple[list[A2APart], dict[str, Any], str]: + ) -> tuple[list[A2APart], Optional[str]]: """Construct A2A message parts from session events. Args: @@ -360,36 +356,37 @@ def _construct_message_parts_from_session( """ message_parts: list[A2APart] = [] context_id = None + + events_to_process = [] for event in reversed(ctx.session.events): - if _is_other_agent_reply(self.name, event): - event = _present_other_agent_message(event) - elif event.author == self.name: + if event.author == self.name: # stop on content generated by current a2a agent given it should already # be in remote session if event.custom_metadata: - context_id = ( - event.custom_metadata.get(A2A_METADATA_PREFIX + "context_id") - if event.custom_metadata - else None - ) + metadata = event.custom_metadata + context_id = metadata.get(A2A_METADATA_PREFIX + "context_id") break + events_to_process.append(event) + + for event in reversed(events_to_process): + if _is_other_agent_reply(self.name, event): + event = _present_other_agent_message(event) if not event.content or not event.content.parts: continue for part in event.content.parts: - converted_part = self._genai_part_converter(part) if converted_part: message_parts.append(converted_part) else: logger.warning("Failed to convert part to A2A format: %s", part) - return message_parts[::-1], context_id + return message_parts, context_id async def _handle_a2a_response( self, a2a_response: A2AClientEvent | A2AMessage, ctx: InvocationContext - ) -> Event: + ) -> Optional[Event]: """Handle A2A response and convert to Event. Args: @@ -397,14 +394,53 @@ async def _handle_a2a_response( ctx: The invocation context Returns: - Event object representing the response + Event object representing the response, or None if no event should be + emitted. """ try: if isinstance(a2a_response, tuple): - # ClientEvent is a tuple of the absolute Task state and the last update. - # We only need the Task state. - task = a2a_response[0] - event = convert_a2a_task_to_event(task, self.name, ctx) + task, update = a2a_response + if update is None: + # This is the initial response for a streaming task or the complete + # response for a non-streaming task, which is the full task state. + # We process this to get the initial message. + event = convert_a2a_task_to_event(task, self.name, ctx) + # for streaming task, we update the event with the task status. + # We update the event as Thought updates. + if task and task.status and task.status.state == TaskState.submitted: + event.content.parts[0].thought = True + elif ( + isinstance(update, A2ATaskStatusUpdateEvent) + and update.status + and update.status.message + ): + # This is a streaming task status update with a message. + event = convert_a2a_message_to_event( + update.status.message, self.name, ctx + ) + if event.content and update.status.state in [ + TaskState.submitted, + TaskState.working, + ]: + for part in event.content.parts: + part.thought = True + elif isinstance(update, A2ATaskArtifactUpdateEvent) and ( + not update.append or update.last_chunk + ): + # This is a streaming task artifact update. + # We only handle full artifact updates and ignore partial updates. + # Note: Depends on the server implementation, there is no clear + # definition of what a partial update is currently. We use the two + # signals: + # 1. append: True for partial updates, False for full updates. + # 2. last_chunk: True for full updates, False for partial updates. + event = convert_a2a_task_to_event(task, self.name, ctx) + else: + # This is a streaming update without a message (e.g. status change) + # or an partial artifact update. We don't emit an event for these + # for now. + return None + event.custom_metadata = event.custom_metadata or {} event.custom_metadata[A2A_METADATA_PREFIX + "task_id"] = task.id if task.context_id: @@ -412,7 +448,7 @@ async def _handle_a2a_response( task.context_id ) - # Otherwise, it's a regular A2AMessage. + # Otherwise, it's a regular A2AMessage for non-streaming responses. elif isinstance(a2a_response, A2AMessage): event = convert_a2a_message_to_event(a2a_response, self.name, ctx) event.custom_metadata = event.custom_metadata or {} @@ -479,6 +515,8 @@ async def _run_async_impl( context_id=context_id, ) + logger.debug(build_a2a_request_log(a2a_request)) + try: async for a2a_response in self._a2a_client.send_message( request=a2a_request @@ -486,15 +524,24 @@ async def _run_async_impl( logger.debug(build_a2a_response_log(a2a_response)) event = await self._handle_a2a_response(a2a_response, ctx) + if not event: + continue # Add metadata about the request and response event.custom_metadata = event.custom_metadata or {} event.custom_metadata[A2A_METADATA_PREFIX + "request"] = ( a2a_request.model_dump(exclude_none=True, by_alias=True) ) - event.custom_metadata[A2A_METADATA_PREFIX + "response"] = ( - a2a_response.model_dump(exclude_none=True, by_alias=True) - ) + # If the response is a ClientEvent, record the task state, otherwise + # record the message object. + if isinstance(a2a_response, tuple): + event.custom_metadata[A2A_METADATA_PREFIX + "response"] = ( + a2a_response[0].model_dump(exclude_none=True, by_alias=True) + ) + else: + event.custom_metadata[A2A_METADATA_PREFIX + "response"] = ( + a2a_response.model_dump(exclude_none=True, by_alias=True) + ) yield event @@ -523,7 +570,7 @@ async def _run_live_impl( raise NotImplementedError( f"_run_live_impl for {type(self)} via A2A is not implemented." ) - # This makes the function an async generator but the yield is still unreachable + # This makes the function into an async generator but the yield is still unreachable yield async def cleanup(self) -> None: diff --git a/src/google/adk/agents/run_config.py b/src/google/adk/agents/run_config.py index b65cde90b3..315de43f00 100644 --- a/src/google/adk/agents/run_config.py +++ b/src/google/adk/agents/run_config.py @@ -17,6 +17,7 @@ from enum import Enum import logging import sys +from typing import Any from typing import Optional from google.genai import types @@ -35,7 +36,10 @@ class StreamingMode(Enum): class RunConfig(BaseModel): - """Configs for runtime behavior of agents.""" + """Configs for runtime behavior of agents. + + The configs here will be overriden by agent-specific configurations. + """ model_config = ConfigDict( extra='forbid', @@ -48,8 +52,15 @@ class RunConfig(BaseModel): response_modalities: Optional[list[str]] = None """The output modalities. If not set, it's default to AUDIO.""" - save_input_blobs_as_artifacts: bool = False - """Whether or not to save the input blobs as artifacts.""" + save_input_blobs_as_artifacts: bool = Field( + default=False, + deprecated=True, + description=( + 'Whether or not to save the input blobs as artifacts. DEPRECATED: Use' + ' SaveFilesAsArtifactsPlugin instead for better control and' + ' flexibility. See google.adk.plugins.SaveFilesAsArtifactsPlugin.' + ), + ) support_cfc: bool = False """ @@ -87,6 +98,11 @@ class RunConfig(BaseModel): session_resumption: Optional[types.SessionResumptionConfig] = None """Configures session resumption mechanism. Only support transparent session resumption mode now.""" + context_window_compression: Optional[types.ContextWindowCompressionConfig] = ( + None + ) + """Configuration for context window compression. If set, this will enable context window compression for LLM input.""" + save_live_audio: bool = False """Saves live video and audio data to session and artifact service. @@ -103,6 +119,9 @@ class RunConfig(BaseModel): - Less than or equal to 0: This allows for unbounded number of llm calls. """ + custom_metadata: Optional[dict[str, Any]] = None + """Custom metadata for the current invocation.""" + @field_validator('max_llm_calls', mode='after') @classmethod def validate_max_llm_calls(cls, value: int) -> int: diff --git a/src/google/adk/agents/sequential_agent.py b/src/google/adk/agents/sequential_agent.py index bed1557fb4..af49629ff3 100644 --- a/src/google/adk/agents/sequential_agent.py +++ b/src/google/adk/agents/sequential_agent.py @@ -16,6 +16,7 @@ from __future__ import annotations +import logging from typing import AsyncGenerator from typing import ClassVar from typing import Type @@ -24,12 +25,24 @@ from ..events.event import Event from ..utils.context_utils import Aclosing +from ..utils.feature_decorator import experimental from .base_agent import BaseAgent -from .base_agent import BaseAgentConfig +from .base_agent import BaseAgentState +from .base_agent_config import BaseAgentConfig from .invocation_context import InvocationContext from .llm_agent import LlmAgent from .sequential_agent_config import SequentialAgentConfig +logger = logging.getLogger('google_adk.' + __name__) + + +@experimental +class SequentialAgentState(BaseAgentState): + """State for SequentialAgent.""" + + current_sub_agent: str = '' + """The name of the current sub-agent to run.""" + class SequentialAgent(BaseAgent): """A shell agent that runs its sub-agents in sequence.""" @@ -41,10 +54,66 @@ class SequentialAgent(BaseAgent): async def _run_async_impl( self, ctx: InvocationContext ) -> AsyncGenerator[Event, None]: - for sub_agent in self.sub_agents: + if not self.sub_agents: + return + + # Initialize or resume the execution state from the agent state. + agent_state = self._load_agent_state(ctx, SequentialAgentState) + start_index = self._get_start_index(agent_state) + + pause_invocation = False + resuming_sub_agent = agent_state is not None + for i in range(start_index, len(self.sub_agents)): + sub_agent = self.sub_agents[i] + if not resuming_sub_agent: + # If we are resuming from the current event, it means the same event has + # already been logged, so we should avoid yielding it again. + if ctx.is_resumable: + agent_state = SequentialAgentState(current_sub_agent=sub_agent.name) + ctx.set_agent_state(self.name, agent_state=agent_state) + yield self._create_agent_state_event(ctx) + async with Aclosing(sub_agent.run_async(ctx)) as agen: async for event in agen: yield event + if ctx.should_pause_invocation(event): + pause_invocation = True + + # Skip the rest of the sub-agents if the invocation is paused. + if pause_invocation: + return + + # Reset the flag for the next sub-agent. + resuming_sub_agent = False + + if ctx.is_resumable: + ctx.set_agent_state(self.name, end_of_agent=True) + yield self._create_agent_state_event(ctx) + + def _get_start_index( + self, + agent_state: SequentialAgentState, + ) -> int: + """Calculates the start index for the sub-agent loop.""" + if not agent_state: + return 0 + + if not agent_state.current_sub_agent: + # This means the process was finished. + return len(self.sub_agents) + + try: + sub_agent_names = [sub_agent.name for sub_agent in self.sub_agents] + return sub_agent_names.index(agent_state.current_sub_agent) + except ValueError: + # A sub-agent was removed so the agent name is not found. + # For now, we restart from the beginning. + logger.warning( + 'Sub-agent %s was removed so the agent name is not found. Restarting' + ' from the beginning.', + agent_state.current_sub_agent, + ) + return 0 @override async def _run_live_impl( @@ -61,6 +130,9 @@ async def _run_live_impl( Args: ctx: The invocation context of the agent. """ + if not self.sub_agents: + return + # There is no way to know if it's using live during init phase so we have to init it here for sub_agent in self.sub_agents: # add tool diff --git a/src/google/adk/apps/__init__.py b/src/google/adk/apps/__init__.py index 33721570a3..8f2c6e0819 100644 --- a/src/google/adk/apps/__init__.py +++ b/src/google/adk/apps/__init__.py @@ -13,7 +13,9 @@ # limitations under the License. from .app import App +from .app import ResumabilityConfig __all__ = [ 'App', + 'ResumabilityConfig', ] diff --git a/src/google/adk/apps/app.py b/src/google/adk/apps/app.py index 67b2f45834..63725889c2 100644 --- a/src/google/adk/apps/app.py +++ b/src/google/adk/apps/app.py @@ -13,7 +13,6 @@ # limitations under the License. from __future__ import annotations -from abc import ABC from typing import Optional from pydantic import BaseModel @@ -21,11 +20,55 @@ from pydantic import Field from ..agents.base_agent import BaseAgent +from ..agents.context_cache_config import ContextCacheConfig +from ..apps.base_events_summarizer import BaseEventsSummarizer from ..plugins.base_plugin import BasePlugin from ..utils.feature_decorator import experimental @experimental +class ResumabilityConfig(BaseModel): + """The config of the resumability for an application. + + The "resumability" in ADK refers to the ability to: + 1. pause an invocation upon a long running function call. + 2. resume an invocation from the last event, if it's paused or failed midway + through. + + Note: ADK resumes the invocation in a best-effort manner: + 1. Tool call to resume needs to be idempotent because we only guarantee + an at-least-once behavior once resumed. + 2. Any temporary / in-memory state will be lost upon resumption. + """ + + is_resumable: bool = False + """Whether the app supports agent resumption. + If enabled, the feature will be enabled for all agents in the app. + """ + + +@experimental +class EventsCompactionConfig(BaseModel): + """The config of event compaction for an application.""" + + model_config = ConfigDict( + arbitrary_types_allowed=True, + extra="forbid", + ) + + summarizer: Optional[BaseEventsSummarizer] = None + """The event summarizer to use for compaction.""" + + compaction_interval: int + """The number of *new* user-initiated invocations that, once + fully represented in the session's events, will trigger a compaction.""" + + overlap_size: int + """The number of preceding invocations to include from the + end of the last compacted range. This creates an overlap between consecutive + compacted summaries, maintaining context.""" + + class App(BaseModel): """Represents an LLM-backed agentic application. @@ -50,3 +93,15 @@ class App(BaseModel): plugins: list[BasePlugin] = Field(default_factory=list) """The plugins in the application.""" + + events_compaction_config: Optional[EventsCompactionConfig] = None + """The config of event compaction for the application.""" + + context_cache_config: Optional[ContextCacheConfig] = None + """Context cache configuration that applies to all LLM agents in the app.""" + + resumability_config: Optional[ResumabilityConfig] = None + """ + The config of the resumability for the application. + If configured, will be applied to all agents in the app. + """ diff --git a/src/google/adk/apps/base_events_summarizer.py b/src/google/adk/apps/base_events_summarizer.py new file mode 100644 index 0000000000..5e72d7a18c --- /dev/null +++ b/src/google/adk/apps/base_events_summarizer.py @@ -0,0 +1,47 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from __future__ import annotations + +import abc +from typing import Optional + +from google.genai.types import Content + +from ..events.event import Event +from ..utils.feature_decorator import experimental + + +@experimental +class BaseEventsSummarizer(abc.ABC): + """Base interface for compacting events.""" + + @abc.abstractmethod + async def maybe_summarize_events( + self, *, events: list[Event] + ) -> Optional[Event]: + """Compact a list of events into a single event. + + If compaction failed, return None. Otherwise, compact into a content and + return it. + + This method will summarize the events and return a new summray event + indicating the range of events it summarized. + + Args: + events: Events to compact. + + Returns: + The new compacted event, or None if no compaction happended. + """ + raise NotImplementedError() diff --git a/src/google/adk/apps/compaction.py b/src/google/adk/apps/compaction.py new file mode 100644 index 0000000000..a6f55f9ad6 --- /dev/null +++ b/src/google/adk/apps/compaction.py @@ -0,0 +1,196 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import logging + +from google.adk.apps.app import App +from google.adk.apps.llm_event_summarizer import LlmEventSummarizer +from google.adk.sessions.base_session_service import BaseSessionService +from google.adk.sessions.session import Session + +logger = logging.getLogger('google_adk.' + __name__) + + +async def _run_compaction_for_sliding_window( + app: App, session: Session, session_service: BaseSessionService +): + """Runs compaction for SlidingWindowCompactor. + + This method implements the sliding window compaction logic. It determines + if enough new invocations have occurred since the last compaction based on + `compaction_invocation_threshold`. If so, it selects a range of events to + compact based on `overlap_size`, and calls `maybe_compact_events` on the + compactor. + + The compaction process is controlled by two parameters: + 1. `compaction_invocation_threshold`: The number of *new* user-initiated + invocations that, once fully + represented in the session's events, will trigger a compaction. + 2. `overlap_size`: The number of preceding invocations to include from the + end of the last + compacted range. This creates an overlap between consecutive compacted + summaries, + maintaining context. + + The compactor is called after an agent has finished processing a turn and all + its events + have been added to the session. It checks if a new compaction is needed. + + When a compaction is triggered: + - The compactor identifies the range of `invocation_id`s to be summarized. + - This range starts `overlap_size` invocations before the beginning of the + new block of `compaction_invocation_threshold` invocations and ends + with the last + invocation + in the current block. + - A `CompactedEvent` is created, summarizing all events within this + determined + `invocation_id` range. This `CompactedEvent` is then appended to the + session. + + Here is an example with `compaction_invocation_threshold = 2` and + `overlap_size = 1`: + Let's assume events are added for `invocation_id`s 1, 2, 3, and 4 in order. + + 1. **After `invocation_id` 2 events are added:** + - The session now contains events for invocations 1 and 2. This + fulfills the `compaction_invocation_threshold = 2` criteria. + - Since this is the first compaction, the range starts from the + beginning. + - A `CompactedEvent` is generated, summarizing events within + `invocation_id` range [1, 2]. + - The session now contains: `[E(inv=1, role=user), E(inv=1, role=model), + E(inv=2, role=user), E(inv=2, role=model), E(inv=2, role=user), + CompactedEvent(inv=[1, 2])]`. + + 2. **After `invocation_id` 3 events are added:** + - No compaction happens yet, because only 1 new invocation (`inv=3`) + has been completed since the last compaction, and + `compaction_invocation_threshold` is 2. + + 3. **After `invocation_id` 4 events are added:** + - The session now contains new events for invocations 3 and 4, again + fulfilling `compaction_invocation_threshold = 2`. + - The last `CompactedEvent` covered up to `invocation_id` 2. With + `overlap_size = 1`, the new compaction range + will start one invocation before the new block (inv 3), which is + `invocation_id` 2. + - The new compaction range is from `invocation_id` 2 to 4. + - A new `CompactedEvent` is generated, summarizing events within + `invocation_id` range [2, 4]. + - The session now contains: `[E(inv=1, role=user), E(inv=1, role=model), + E(inv=2, role=user), E(inv=2, role=model), E(inv=2, role=user), + CompactedEvent(inv=[1, 2]), E(inv=3, role=user), E(inv=3, role=model), + E(inv=4, role=user), E(inv=4, role=model), CompactedEvent(inv=[2, 4])]`. + + + Args: + app: The application instance. + session: The session containing events to compact. + session_service: The session service for appending events. + """ + events = session.events + if not events: + return None + # Find the last compaction event and its range. + last_compacted_end_timestamp = 0.0 + for event in reversed(events): + if ( + event.actions + and event.actions.compaction + and event.actions.compaction.end_timestamp + ): + last_compacted_end_timestamp = event.actions.compaction.end_timestamp + break + + # Get unique invocation IDs and their latest timestamps. + invocation_latest_timestamps = {} + for event in events: + # Only consider non-compaction events for unique invocation IDs. + if event.invocation_id and not (event.actions and event.actions.compaction): + invocation_latest_timestamps[event.invocation_id] = max( + invocation_latest_timestamps.get(event.invocation_id, 0.0), + event.timestamp, + ) + + unique_invocation_ids = list(invocation_latest_timestamps.keys()) + + # Determine which invocations are new since the last compaction. + new_invocation_ids = [ + inv_id + for inv_id in unique_invocation_ids + if invocation_latest_timestamps[inv_id] > last_compacted_end_timestamp + ] + + if len(new_invocation_ids) < app.events_compaction_config.compaction_interval: + return None # Not enough new invocations to trigger compaction. + + # Determine the range of invocations to compact. + # The end of the compaction range is the last of the new invocations. + end_inv_id = new_invocation_ids[-1] + + # The start of the compaction range is overlap_size invocations before + # the first of the new invocations. + first_new_inv_id = new_invocation_ids[0] + first_new_inv_idx = unique_invocation_ids.index(first_new_inv_id) + + start_idx = max( + 0, first_new_inv_idx - app.events_compaction_config.overlap_size + ) + start_inv_id = unique_invocation_ids[start_idx] + + # Find the index of the last event with end_inv_id. + last_event_idx = -1 + for i in range(len(events) - 1, -1, -1): + if events[i].invocation_id == end_inv_id: + last_event_idx = i + break + + events_to_compact = [] + # Trim events_to_compact to include all events up to and including the + # last event of end_inv_id. + if last_event_idx != -1: + # Find the index of the first event of start_inv_id in events. + first_event_start_inv_idx = -1 + for i, event in enumerate(events): + if event.invocation_id == start_inv_id: + first_event_start_inv_idx = i + break + if first_event_start_inv_idx != -1: + events_to_compact = events[first_event_start_inv_idx : last_event_idx + 1] + # Filter out any existing compaction events from the list. + events_to_compact = [ + e + for e in events_to_compact + if not (e.actions and e.actions.compaction) + ] + + if not events_to_compact: + return None + + if not app.events_compaction_config.summarizer: + app.events_compaction_config.summarizer = LlmEventSummarizer( + llm=app.root_agent.canonical_model + ) + + compaction_event = ( + await app.events_compaction_config.summarizer.maybe_summarize_events( + events=events_to_compact + ) + ) + if compaction_event: + await session_service.append_event(session=session, event=compaction_event) + logger.debug('Event compactor finished.') diff --git a/src/google/adk/apps/llm_event_summarizer.py b/src/google/adk/apps/llm_event_summarizer.py new file mode 100644 index 0000000000..fffb2ab547 --- /dev/null +++ b/src/google/adk/apps/llm_event_summarizer.py @@ -0,0 +1,135 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from __future__ import annotations + +from typing import Optional + +from google.genai import types +from google.genai.types import Content +from google.genai.types import Part + +from ..apps.base_events_summarizer import BaseEventsSummarizer +from ..events.event import Event +from ..events.event_actions import EventActions +from ..events.event_actions import EventCompaction +from ..models.base_llm import BaseLlm +from ..models.llm_request import LlmRequest + + +class LlmEventSummarizer(BaseEventsSummarizer): + """An LLM-based event summarizer for sliding window compaction. + + This class is responsible for summarizing a provided list of events into a + single compacted event. It is designed to be used as part of a sliding window + compaction process. + + The actual logic for determining *when* to trigger compaction and *which* + events form the sliding window (based on parameters like + `compaction_invocation_threshold` and `overlap_size` from + `EventsCompactionConfig`) is handled by an external component, such as an ADK + "Runner". This compactor focuses solely on generating a summary of the events + it receives. + + When `maybe_compact_events` is called with a list of events, this class + formats the events, generates a summary using an LLM, and returns a new + `Event` containing the summary within an `EventCompaction`. + """ + + _DEFAULT_PROMPT_TEMPLATE = ( + 'The following is a conversation history between a user and an AI' + ' agent. Please summarize the conversation, focusing on key' + ' information and decisions made, as well as any unresolved' + ' questions or tasks. The summary should be concise and capture the' + ' essence of the interaction.\\n\\n{conversation_history}' + ) + + def __init__( + self, + llm: BaseLlm, + prompt_template: Optional[str] = None, + ): + """Initializes the LlmEventSummarizer. + + Args: + llm: The LLM used for summarization. + prompt_template: An optional template string for the summarization + prompt. If not provided, a default template will be used. The template + should contain a '{conversation_history}' placeholder. + """ + self._llm = llm + self._prompt_template = prompt_template or self._DEFAULT_PROMPT_TEMPLATE + + def _format_events_for_prompt(self, events: list[Event]) -> str: + """Formats a list of events into a string for the LLM prompt.""" + formatted_history = [] + for event in events: + if event.content and event.content.parts: + for part in event.content.parts: + if part.text: + formatted_history.append(f'{event.author}: {part.text}') + return '\\n'.join(formatted_history) + + async def maybe_summarize_events( + self, *, events: list[Event] + ) -> Optional[Event]: + """Compacts given events and returns the compacted content. + + Args: + events: A list of events to compact. + + Returns: + The new compacted event, or None if no compaction is needed. + """ + if not events: + return None + + conversation_history = self._format_events_for_prompt(events) + prompt = self._prompt_template.format( + conversation_history=conversation_history + ) + + llm_request = LlmRequest( + model=self._llm.model, + contents=[Content(role='user', parts=[Part(text=prompt)])], + ) + summary_content = None + async for llm_response in self._llm.generate_content_async( + llm_request, stream=False + ): + if llm_response.content: + summary_content = llm_response.content + break + + if summary_content is None: + return None + + # Ensure the compacted content has the role 'model' + summary_content.role = 'model' + + start_timestamp = events[0].timestamp + end_timestamp = events[-1].timestamp + + compaction = EventCompaction( + start_timestamp=start_timestamp, + end_timestamp=end_timestamp, + compacted_content=summary_content, + ) + + actions = EventActions(compaction=compaction) + + return Event( + author='user', + actions=actions, + invocation_id=Event.new_id(), + ) diff --git a/src/google/adk/artifacts/artifact_util.py b/src/google/adk/artifacts/artifact_util.py new file mode 100644 index 0000000000..15cdd4dedb --- /dev/null +++ b/src/google/adk/artifacts/artifact_util.py @@ -0,0 +1,116 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Utility functions for handling artifact URIs.""" + +from __future__ import annotations + +import re +from typing import NamedTuple +from typing import Optional + +from google.genai import types + + +class ParsedArtifactUri(NamedTuple): + """The result of parsing an artifact URI.""" + + app_name: str + user_id: str + session_id: Optional[str] + filename: str + version: int + + +_SESSION_SCOPED_ARTIFACT_URI_RE = re.compile( + r"artifact://apps/([^/]+)/users/([^/]+)/sessions/([^/]+)/artifacts/([^/]+)/versions/(\d+)" +) +_USER_SCOPED_ARTIFACT_URI_RE = re.compile( + r"artifact://apps/([^/]+)/users/([^/]+)/artifacts/([^/]+)/versions/(\d+)" +) + + +def parse_artifact_uri(uri: str) -> Optional[ParsedArtifactUri]: + """Parses an artifact URI. + + Args: + uri: The artifact URI to parse. + + Returns: + A ParsedArtifactUri if parsing is successful, None otherwise. + """ + if not uri or not uri.startswith("artifact://"): + return None + + match = _SESSION_SCOPED_ARTIFACT_URI_RE.match(uri) + if match: + return ParsedArtifactUri( + app_name=match.group(1), + user_id=match.group(2), + session_id=match.group(3), + filename=match.group(4), + version=int(match.group(5)), + ) + + match = _USER_SCOPED_ARTIFACT_URI_RE.match(uri) + if match: + return ParsedArtifactUri( + app_name=match.group(1), + user_id=match.group(2), + session_id=None, + filename=match.group(3), + version=int(match.group(4)), + ) + + return None + + +def get_artifact_uri( + app_name: str, + user_id: str, + filename: str, + version: int, + session_id: Optional[str] = None, +) -> str: + """Constructs an artifact URI. + + Args: + app_name: The name of the application. + user_id: The ID of the user. + filename: The name of the artifact file. + version: The version of the artifact. + session_id: The ID of the session. + + Returns: + The constructed artifact URI. + """ + if session_id: + return f"artifact://apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{filename}/versions/{version}" + else: + return f"artifact://apps/{app_name}/users/{user_id}/artifacts/{filename}/versions/{version}" + + +def is_artifact_ref(artifact: types.Part) -> bool: + """Checks if an artifact part is an artifact reference. + + Args: + artifact: The artifact part to check. + + Returns: + True if the artifact part is an artifact reference, False otherwise. + """ + return bool( + artifact.file_data + and artifact.file_data.file_uri + and artifact.file_data.file_uri.startswith("artifact://") + ) diff --git a/src/google/adk/artifacts/base_artifact_service.py b/src/google/adk/artifacts/base_artifact_service.py index 249df96673..cb0c5398f8 100644 --- a/src/google/adk/artifacts/base_artifact_service.py +++ b/src/google/adk/artifacts/base_artifact_service.py @@ -11,13 +11,32 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - +from __future__ import annotations from abc import ABC from abc import abstractmethod +from datetime import datetime +from typing import Any from typing import Optional from google.genai import types +from pydantic import BaseModel +from pydantic import Field + + +class ArtifactVersion(BaseModel): + """Represents the metadata of a specific version of an artifact.""" + + version: int + """The version number of the artifact.""" + canonical_uri: str + """The canonical URI of the artifact version.""" + custom_metadata: dict[str, Any] = Field(default_factory=dict) + """A dictionary of custom metadata associated with the artifact version.""" + create_time: float = Field(default_factory=lambda: datetime.now().timestamp()) + """The creation time of the artifact version.""" + mime_type: Optional[str] = None + """The MIME type of the artifact version.""" class BaseArtifactService(ABC): @@ -29,9 +48,10 @@ async def save_artifact( *, app_name: str, user_id: str, - session_id: str, filename: str, artifact: types.Part, + session_id: Optional[str] = None, + custom_metadata: Optional[dict[str, Any]] = None, ) -> int: """Saves an artifact to the artifact service storage. @@ -42,9 +62,13 @@ async def save_artifact( Args: app_name: The app name. user_id: The user ID. - session_id: The session ID. filename: The filename of the artifact. - artifact: The artifact to save. + artifact: The artifact to save. If the artifact consists of `file_data`, + the artifact service assumes its content has been uploaded separately, + and this method will associate the `file_data` with the artifact if + necessary. + session_id: The session ID. If `None`, the artifact is user-scoped. + custom_metadata: custom metadata to associate with the artifact. Returns: The revision ID. The first version of the artifact has a revision ID of 0. @@ -57,8 +81,8 @@ async def load_artifact( *, app_name: str, user_id: str, - session_id: str, filename: str, + session_id: Optional[str] = None, version: Optional[int] = None, ) -> Optional[types.Part]: """Gets an artifact from the artifact service storage. @@ -69,8 +93,8 @@ async def load_artifact( Args: app_name: The app name. user_id: The user ID. - session_id: The session ID. filename: The filename of the artifact. + session_id: The session ID. If `None`, load the user-scoped artifact. version: The version of the artifact. If None, the latest version will be returned. @@ -80,7 +104,7 @@ async def load_artifact( @abstractmethod async def list_artifact_keys( - self, *, app_name: str, user_id: str, session_id: str + self, *, app_name: str, user_id: str, session_id: Optional[str] = None ) -> list[str]: """Lists all the artifact filenames within a session. @@ -90,34 +114,100 @@ async def list_artifact_keys( session_id: The ID of the session. Returns: - A list of all artifact filenames within a session. + A list of artifact filenames. If `session_id` is provided, returns + both session-scoped and user-scoped artifact filenames. If `session_id` + is `None`, returns + user-scoped artifact filenames. """ @abstractmethod async def delete_artifact( - self, *, app_name: str, user_id: str, session_id: str, filename: str + self, + *, + app_name: str, + user_id: str, + filename: str, + session_id: Optional[str] = None, ) -> None: """Deletes an artifact. Args: app_name: The name of the application. user_id: The ID of the user. - session_id: The ID of the session. filename: The name of the artifact file. + session_id: The ID of the session. If `None`, delete the user-scoped + artifact. """ @abstractmethod async def list_versions( - self, *, app_name: str, user_id: str, session_id: str, filename: str + self, + *, + app_name: str, + user_id: str, + filename: str, + session_id: Optional[str] = None, ) -> list[int]: """Lists all versions of an artifact. Args: app_name: The name of the application. user_id: The ID of the user. - session_id: The ID of the session. filename: The name of the artifact file. + session_id: The ID of the session. If `None`, only list the user-scoped + artifacts versions. Returns: A list of all available versions of the artifact. """ + + @abstractmethod + async def list_artifact_versions( + self, + *, + app_name: str, + user_id: str, + filename: str, + session_id: Optional[str] = None, + ) -> list[ArtifactVersion]: + """Lists all versions and their metadata for a specific artifact. + + Args: + app_name: The name of the application. + user_id: The ID of the user. + filename: The name of the artifact file. + session_id: The ID of the session. If `None`, lists versions of the + user-scoped artifact. Otherwise, lists versions of the artifact within + the specified session. + + Returns: + A list of ArtifactVersion objects, each representing a version of the + artifact and its associated metadata. + """ + + @abstractmethod + async def get_artifact_version( + self, + *, + app_name: str, + user_id: str, + filename: str, + session_id: Optional[str] = None, + version: Optional[int] = None, + ) -> Optional[ArtifactVersion]: + """Gets the metadata for a specific version of an artifact. + + Args: + app_name: The name of the application. + user_id: The ID of the user. + filename: The name of the artifact file. + session_id: The ID of the session. If `None`, the artifact will be fetched + from the user-scoped artifacts. Otherwise, it will be fetched from the + specified session. + version: The version number of the artifact to retrieve. If `None`, the + latest version will be returned. + + Returns: + An ArtifactVersion object containing the metadata of the specified + artifact version, or `None` if the artifact version is not found. + """ diff --git a/src/google/adk/artifacts/gcs_artifact_service.py b/src/google/adk/artifacts/gcs_artifact_service.py index a49d170e80..1963f81559 100644 --- a/src/google/adk/artifacts/gcs_artifact_service.py +++ b/src/google/adk/artifacts/gcs_artifact_service.py @@ -24,12 +24,14 @@ import asyncio import logging +from typing import Any from typing import Optional from google.cloud import storage from google.genai import types from typing_extensions import override +from .base_artifact_service import ArtifactVersion from .base_artifact_service import BaseArtifactService logger = logging.getLogger("google_adk." + __name__) @@ -41,7 +43,6 @@ class GcsArtifactService(BaseArtifactService): def __init__(self, bucket_name: str, **kwargs): """Initializes the GcsArtifactService. - Args: bucket_name: The name of the bucket to use. **kwargs: Keyword arguments to pass to the Google Cloud Storage client. @@ -56,9 +57,10 @@ async def save_artifact( *, app_name: str, user_id: str, - session_id: str, filename: str, artifact: types.Part, + session_id: Optional[str] = None, + custom_metadata: Optional[dict[str, Any]] = None, ) -> int: return await asyncio.to_thread( self._save_artifact, @@ -67,6 +69,7 @@ async def save_artifact( session_id, filename, artifact, + custom_metadata, ) @override @@ -75,8 +78,8 @@ async def load_artifact( *, app_name: str, user_id: str, - session_id: str, filename: str, + session_id: Optional[str] = None, version: Optional[int] = None, ) -> Optional[types.Part]: return await asyncio.to_thread( @@ -90,7 +93,7 @@ async def load_artifact( @override async def list_artifact_keys( - self, *, app_name: str, user_id: str, session_id: str + self, *, app_name: str, user_id: str, session_id: Optional[str] = None ) -> list[str]: return await asyncio.to_thread( self._list_artifact_keys, @@ -101,7 +104,12 @@ async def list_artifact_keys( @override async def delete_artifact( - self, *, app_name: str, user_id: str, session_id: str, filename: str + self, + *, + app_name: str, + user_id: str, + filename: str, + session_id: Optional[str] = None, ) -> None: return await asyncio.to_thread( self._delete_artifact, @@ -113,7 +121,12 @@ async def delete_artifact( @override async def list_versions( - self, *, app_name: str, user_id: str, session_id: str, filename: str + self, + *, + app_name: str, + user_id: str, + filename: str, + session_id: Optional[str] = None, ) -> list[int]: return await asyncio.to_thread( self._list_versions, @@ -135,37 +148,55 @@ def _file_has_user_namespace(self, filename: str) -> bool: """ return filename.startswith("user:") + def _get_blob_prefix( + self, + app_name: str, + user_id: str, + filename: str, + session_id: Optional[str] = None, + ) -> str: + """Constructs the blob name prefix in GCS for a given artifact.""" + if self._file_has_user_namespace(filename): + return f"{app_name}/{user_id}/user/{filename}" + + if session_id is None: + raise ValueError( + "Session ID must be provided for session-scoped artifacts." + ) + return f"{app_name}/{user_id}/{session_id}/{filename}" + def _get_blob_name( self, app_name: str, user_id: str, - session_id: str, filename: str, version: int, + session_id: Optional[str] = None, ) -> str: """Constructs the blob name in GCS. Args: app_name: The name of the application. user_id: The ID of the user. - session_id: The ID of the session. filename: The name of the artifact file. version: The version of the artifact. + session_id: The ID of the session. Returns: The constructed blob name in GCS. """ - if self._file_has_user_namespace(filename): - return f"{app_name}/{user_id}/user/{filename}/{version}" - return f"{app_name}/{user_id}/{session_id}/{filename}/{version}" + return ( + f"{self._get_blob_prefix(app_name, user_id, filename, session_id)}/{version}" + ) def _save_artifact( self, app_name: str, user_id: str, - session_id: str, + session_id: Optional[str], filename: str, artifact: types.Part, + custom_metadata: Optional[dict[str, Any]] = None, ) -> int: versions = self._list_versions( app_name=app_name, @@ -176,9 +207,11 @@ def _save_artifact( version = 0 if not versions else max(versions) + 1 blob_name = self._get_blob_name( - app_name, user_id, session_id, filename, version + app_name, user_id, filename, version, session_id ) blob = self.bucket.blob(blob_name) + if custom_metadata: + blob.metadata = {k: str(v) for k, v in custom_metadata.items()} if artifact.inline_data: blob.upload_from_string( @@ -188,6 +221,12 @@ def _save_artifact( elif artifact.text: blob.upload_from_string( data=artifact.text, + content_type="text/plain", + ) + elif artifact.file_data: + raise NotImplementedError( + "Saving artifact with file_data is not supported yet in" + " GcsArtifactService." ) else: raise ValueError("Artifact must have either inline_data or text.") @@ -198,7 +237,7 @@ def _load_artifact( self, app_name: str, user_id: str, - session_id: str, + session_id: Optional[str], filename: str, version: Optional[int] = None, ) -> Optional[types.Part]: @@ -214,7 +253,7 @@ def _load_artifact( version = max(versions) blob_name = self._get_blob_name( - app_name, user_id, session_id, filename, version + app_name, user_id, filename, version, session_id ) blob = self.bucket.blob(blob_name) @@ -227,30 +266,42 @@ def _load_artifact( return artifact def _list_artifact_keys( - self, app_name: str, user_id: str, session_id: str + self, app_name: str, user_id: str, session_id: Optional[str] ) -> list[str]: filenames = set() - session_prefix = f"{app_name}/{user_id}/{session_id}/" - session_blobs = self.storage_client.list_blobs( - self.bucket, prefix=session_prefix - ) - for blob in session_blobs: - *_, filename, _ = blob.name.split("/") - filenames.add(filename) + if session_id: + session_prefix = f"{app_name}/{user_id}/{session_id}/" + session_blobs = self.storage_client.list_blobs( + self.bucket, prefix=session_prefix + ) + for blob in session_blobs: + # blob.name is like session_prefix/filename/version + # or session_prefix/path/to/filename/version + # we need to extract filename including slashes, but remove prefix + # and /version + fn_and_version = blob.name[len(session_prefix) :] + filename = "/".join(fn_and_version.split("/")[:-1]) + filenames.add(filename) user_namespace_prefix = f"{app_name}/{user_id}/user/" user_namespace_blobs = self.storage_client.list_blobs( self.bucket, prefix=user_namespace_prefix ) for blob in user_namespace_blobs: - *_, filename, _ = blob.name.split("/") + # blob.name is like user_namespace_prefix/filename/version + fn_and_version = blob.name[len(user_namespace_prefix) :] + filename = "/".join(fn_and_version.split("/")[:-1]) filenames.add(filename) return sorted(list(filenames)) def _delete_artifact( - self, app_name: str, user_id: str, session_id: str, filename: str + self, + app_name: str, + user_id: str, + session_id: Optional[str], + filename: str, ) -> None: versions = self._list_versions( app_name=app_name, @@ -260,18 +311,23 @@ def _delete_artifact( ) for version in versions: blob_name = self._get_blob_name( - app_name, user_id, session_id, filename, version + app_name, user_id, filename, version, session_id ) blob = self.bucket.blob(blob_name) blob.delete() return def _list_versions( - self, app_name: str, user_id: str, session_id: str, filename: str + self, + app_name: str, + user_id: str, + session_id: Optional[str], + filename: str, ) -> list[int]: """Lists all available versions of an artifact. - This method retrieves all versions of a specific artifact by querying GCS blobs + This method retrieves all versions of a specific artifact by querying GCS + blobs that match the constructed blob name prefix. Args: @@ -281,13 +337,121 @@ def _list_versions( filename: The name of the artifact file. Returns: - A list of version numbers (integers) available for the specified artifact. + A list of version numbers (integers) available for the specified + artifact. Returns an empty list if no versions are found. """ - prefix = self._get_blob_name(app_name, user_id, session_id, filename, "") - blobs = self.storage_client.list_blobs(self.bucket, prefix=prefix) + prefix = self._get_blob_prefix(app_name, user_id, filename, session_id) + blobs = self.storage_client.list_blobs(self.bucket, prefix=f"{prefix}/") versions = [] for blob in blobs: *_, version = blob.name.split("/") versions.append(int(version)) return versions + + def _get_artifact_version_sync( + self, + app_name: str, + user_id: str, + session_id: Optional[str], + filename: str, + version: Optional[int] = None, + ) -> Optional[ArtifactVersion]: + if version is None: + versions = self._list_versions( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=filename, + ) + if not versions: + return None + version = max(versions) + + blob_name = self._get_blob_name( + app_name, user_id, filename, version, session_id + ) + blob = self.bucket.get_blob(blob_name) + + if not blob: + return None + + canonical_uri = f"gs://{self.bucket_name}/{blob.name}" + + return ArtifactVersion( + version=version, + canonical_uri=canonical_uri, + create_time=blob.time_created.timestamp(), + mime_type=blob.content_type, + custom_metadata=blob.metadata if blob.metadata else {}, + ) + + def _list_artifact_versions_sync( + self, + app_name: str, + user_id: str, + session_id: Optional[str], + filename: str, + ) -> list[ArtifactVersion]: + """Lists all versions and their metadata of an artifact.""" + prefix = self._get_blob_prefix(app_name, user_id, filename, session_id) + blobs = self.storage_client.list_blobs(self.bucket, prefix=f"{prefix}/") + artifact_versions = [] + for blob in blobs: + try: + version = int(blob.name.split("/")[-1]) + except ValueError: + logger.warning( + "Skipping blob %s because it does not end with a version number.", + blob.name, + ) + continue + + canonical_uri = f"gs://{self.bucket_name}/{blob.name}" + av = ArtifactVersion( + version=version, + canonical_uri=canonical_uri, + create_time=blob.time_created.timestamp(), + mime_type=blob.content_type, + custom_metadata=blob.metadata if blob.metadata else {}, + ) + artifact_versions.append(av) + + artifact_versions.sort(key=lambda x: x.version) + return artifact_versions + + @override + async def list_artifact_versions( + self, + *, + app_name: str, + user_id: str, + filename: str, + session_id: Optional[str] = None, + ) -> list[ArtifactVersion]: + return await asyncio.to_thread( + self._list_artifact_versions_sync, + app_name, + user_id, + session_id, + filename, + ) + + @override + async def get_artifact_version( + self, + *, + app_name: str, + user_id: str, + filename: str, + session_id: Optional[str] = None, + version: Optional[int] = None, + ) -> Optional[ArtifactVersion]: + return await asyncio.to_thread( + self._get_artifact_version_sync, + app_name, + user_id, + session_id, + filename, + version, + ) diff --git a/src/google/adk/artifacts/in_memory_artifact_service.py b/src/google/adk/artifacts/in_memory_artifact_service.py index e483769549..246e8a85fb 100644 --- a/src/google/adk/artifacts/in_memory_artifact_service.py +++ b/src/google/adk/artifacts/in_memory_artifact_service.py @@ -13,19 +13,36 @@ # limitations under the License. from __future__ import annotations +import dataclasses import logging +from typing import Any from typing import Optional +from google.adk.artifacts import artifact_util from google.genai import types from pydantic import BaseModel from pydantic import Field from typing_extensions import override +from .base_artifact_service import ArtifactVersion from .base_artifact_service import BaseArtifactService logger = logging.getLogger("google_adk." + __name__) +@dataclasses.dataclass +class _ArtifactEntry: + """Represents a single version of an artifact stored in memory. + + Attributes: + data: The actual data of the artifact. + artifact_version: Metadata about this specific version of the artifact. + """ + + data: types.Part + artifact_version: ArtifactVersion + + class InMemoryArtifactService(BaseArtifactService, BaseModel): """An in-memory implementation of the artifact service. @@ -33,7 +50,7 @@ class InMemoryArtifactService(BaseArtifactService, BaseModel): testing and development only. """ - artifacts: dict[str, list[types.Part]] = Field(default_factory=dict) + artifacts: dict[str, list[_ArtifactEntry]] = Field(default_factory=dict) def _file_has_user_namespace(self, filename: str) -> bool: """Checks if the filename has a user namespace. @@ -48,21 +65,30 @@ def _file_has_user_namespace(self, filename: str) -> bool: return filename.startswith("user:") def _artifact_path( - self, app_name: str, user_id: str, session_id: str, filename: str + self, + app_name: str, + user_id: str, + filename: str, + session_id: Optional[str], ) -> str: """Constructs the artifact path. Args: app_name: The name of the application. user_id: The ID of the user. - session_id: The ID of the session. filename: The name of the artifact file. + session_id: The ID of the session. Returns: The constructed artifact path. """ if self._file_has_user_namespace(filename): return f"{app_name}/{user_id}/user/{filename}" + + if session_id is None: + raise ValueError( + "Session ID must be provided for session-scoped artifacts." + ) return f"{app_name}/{user_id}/{session_id}/{filename}" @override @@ -71,15 +97,47 @@ async def save_artifact( *, app_name: str, user_id: str, - session_id: str, filename: str, artifact: types.Part, + session_id: Optional[str] = None, + custom_metadata: Optional[dict[str, Any]] = None, ) -> int: - path = self._artifact_path(app_name, user_id, session_id, filename) + path = self._artifact_path(app_name, user_id, filename, session_id) if path not in self.artifacts: self.artifacts[path] = [] version = len(self.artifacts[path]) - self.artifacts[path].append(artifact) + if self._file_has_user_namespace(filename): + canonical_uri = f"memory://apps/{app_name}/users/{user_id}/artifacts/{filename}/versions/{version}" + else: + canonical_uri = f"memory://apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{filename}/versions/{version}" + + artifact_version = ArtifactVersion( + version=version, + canonical_uri=canonical_uri, + ) + if custom_metadata: + artifact_version.custom_metadata = custom_metadata + + if artifact.inline_data is not None: + artifact_version.mime_type = artifact.inline_data.mime_type + elif artifact.text is not None: + artifact_version.mime_type = "text/plain" + elif artifact.file_data is not None: + if artifact_util.is_artifact_ref(artifact): + if not artifact_util.parse_artifact_uri(artifact.file_data.file_uri): + raise ValueError( + f"Invalid artifact reference URI: {artifact.file_data.file_uri}" + ) + # If it's a valid artifact URI, we store the artifact part as-is. + # And we don't know the mime type until we load it. + else: + artifact_version.mime_type = artifact.file_data.mime_type + else: + raise ValueError("Not supported artifact type.") + + self.artifacts[path].append( + _ArtifactEntry(data=artifact, artifact_version=artifact_version) + ) return version @override @@ -88,27 +146,63 @@ async def load_artifact( *, app_name: str, user_id: str, - session_id: str, filename: str, + session_id: Optional[str] = None, version: Optional[int] = None, ) -> Optional[types.Part]: - path = self._artifact_path(app_name, user_id, session_id, filename) + path = self._artifact_path(app_name, user_id, filename, session_id) versions = self.artifacts.get(path) if not versions: return None if version is None: version = -1 - return versions[version] + + try: + artifact_entry = versions[version] + except IndexError: + return None + + if artifact_entry is None: + return None + + # Resolve artifact reference if needed. + artifact_data = artifact_entry.data + if artifact_util.is_artifact_ref(artifact_data): + parsed_uri = artifact_util.parse_artifact_uri( + artifact_data.file_data.file_uri + ) + if not parsed_uri: + raise ValueError( + "Invalid artifact reference URI:" + f" {artifact_data.file_data.file_uri}" + ) + return await self.load_artifact( + app_name=parsed_uri.app_name, + user_id=parsed_uri.user_id, + filename=parsed_uri.filename, + session_id=parsed_uri.session_id, + version=parsed_uri.version, + ) + + if ( + artifact_data == types.Part() + or artifact_data == types.Part(text="") + or (artifact_data.inline_data and not artifact_data.inline_data.data) + ): + return None + return artifact_data @override async def list_artifact_keys( - self, *, app_name: str, user_id: str, session_id: str + self, *, app_name: str, user_id: str, session_id: Optional[str] = None ) -> list[str]: - session_prefix = f"{app_name}/{user_id}/{session_id}/" usernamespace_prefix = f"{app_name}/{user_id}/user/" + session_prefix = ( + f"{app_name}/{user_id}/{session_id}/" if session_id else None + ) filenames = [] for path in self.artifacts: - if path.startswith(session_prefix): + if session_prefix and path.startswith(session_prefix): filename = path.removeprefix(session_prefix) filenames.append(filename) elif path.startswith(usernamespace_prefix): @@ -118,19 +212,66 @@ async def list_artifact_keys( @override async def delete_artifact( - self, *, app_name: str, user_id: str, session_id: str, filename: str + self, + *, + app_name: str, + user_id: str, + filename: str, + session_id: Optional[str] = None, ) -> None: - path = self._artifact_path(app_name, user_id, session_id, filename) + path = self._artifact_path(app_name, user_id, filename, session_id) if not self.artifacts.get(path): return None self.artifacts.pop(path, None) @override async def list_versions( - self, *, app_name: str, user_id: str, session_id: str, filename: str + self, + *, + app_name: str, + user_id: str, + filename: str, + session_id: Optional[str] = None, ) -> list[int]: - path = self._artifact_path(app_name, user_id, session_id, filename) + path = self._artifact_path(app_name, user_id, filename, session_id) versions = self.artifacts.get(path) if not versions: return [] return list(range(len(versions))) + + @override + async def list_artifact_versions( + self, + *, + app_name: str, + user_id: str, + filename: str, + session_id: Optional[str] = None, + ) -> list[ArtifactVersion]: + path = self._artifact_path(app_name, user_id, filename, session_id) + entries = self.artifacts.get(path) + if not entries: + return [] + return [entry.artifact_version for entry in entries] + + @override + async def get_artifact_version( + self, + *, + app_name: str, + user_id: str, + filename: str, + session_id: Optional[str] = None, + version: Optional[int] = None, + ) -> Optional[ArtifactVersion]: + path = self._artifact_path(app_name, user_id, filename, session_id) + entries = self.artifacts.get(path) + if not entries: + return None + + if version is None: + version = -1 + try: + return entries[version].artifact_version + except IndexError: + return None diff --git a/src/google/adk/auth/auth_handler.py b/src/google/adk/auth/auth_handler.py index 7a51a71e29..07515ab2e8 100644 --- a/src/google/adk/auth/auth_handler.py +++ b/src/google/adk/auth/auth_handler.py @@ -137,7 +137,7 @@ def generate_auth_request(self) -> AuthConfig: def generate_auth_uri( self, ) -> AuthCredential: - """Generates an response containing the auth uri for user to sign in. + """Generates a response containing the auth uri for user to sign in. Returns: An AuthCredential object containing the auth URI and state. diff --git a/src/google/adk/auth/auth_preprocessor.py b/src/google/adk/auth/auth_preprocessor.py index 133b456b72..c3d9b71c2b 100644 --- a/src/google/adk/auth/auth_preprocessor.py +++ b/src/google/adk/auth/auth_preprocessor.py @@ -100,7 +100,7 @@ async def run_async( if not tools_to_resume: continue - # found the the system long running request euc function call + # found the system long running request euc function call # looking for original function call that requests euc for j in range(i - 1, -1, -1): event = events[j] diff --git a/src/google/adk/auth/auth_schemes.py b/src/google/adk/auth/auth_schemes.py index baccf648d1..c170b95724 100644 --- a/src/google/adk/auth/auth_schemes.py +++ b/src/google/adk/auth/auth_schemes.py @@ -12,17 +12,22 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import annotations + from enum import Enum from typing import List from typing import Optional from typing import Union +from fastapi.openapi.models import OAuth2 from fastapi.openapi.models import OAuthFlows from fastapi.openapi.models import SecurityBase from fastapi.openapi.models import SecurityScheme from fastapi.openapi.models import SecuritySchemeType from pydantic import Field +from ..utils.feature_decorator import experimental + class OpenIdConnectWithConfig(SecurityBase): type_: SecuritySchemeType = Field( @@ -65,3 +70,10 @@ def from_flow(flow: OAuthFlows) -> "OAuthGrantType": # AuthSchemeType re-exports SecuritySchemeType from OpenAPI 3.0. AuthSchemeType = SecuritySchemeType + + +@experimental +class ExtendedOAuth2(OAuth2): + """OAuth2 scheme that incorporates auto-discovery for endpoints.""" + + issuer_url: Optional[str] = None # Used for endpoint-discovery diff --git a/src/google/adk/auth/credential_manager.py b/src/google/adk/auth/credential_manager.py index c5dae9f518..c022ab694c 100644 --- a/src/google/adk/auth/credential_manager.py +++ b/src/google/adk/auth/credential_manager.py @@ -14,19 +14,27 @@ from __future__ import annotations +import logging from typing import Optional +from fastapi.openapi.models import OAuth2 + from ..agents.callback_context import CallbackContext +from ..tools.openapi_tool.auth.credential_exchangers.service_account_exchanger import ServiceAccountCredentialExchanger from ..utils.feature_decorator import experimental from .auth_credential import AuthCredential from .auth_credential import AuthCredentialTypes from .auth_schemes import AuthSchemeType +from .auth_schemes import ExtendedOAuth2 +from .auth_schemes import OpenIdConnectWithConfig from .auth_tool import AuthConfig from .exchanger.base_credential_exchanger import BaseCredentialExchanger from .exchanger.credential_exchanger_registry import CredentialExchangerRegistry -from .refresher.base_credential_refresher import BaseCredentialRefresher +from .oauth2_discovery import OAuth2DiscoveryManager from .refresher.credential_refresher_registry import CredentialRefresherRegistry +logger = logging.getLogger("google_adk." + __name__) + @experimental class CredentialManager: @@ -74,11 +82,26 @@ def __init__( self._auth_config = auth_config self._exchanger_registry = CredentialExchangerRegistry() self._refresher_registry = CredentialRefresherRegistry() + self._discovery_manager = OAuth2DiscoveryManager() # Register default exchangers and refreshers - # TODO: support service account credential exchanger + from .exchanger.oauth2_credential_exchanger import OAuth2CredentialExchanger from .refresher.oauth2_credential_refresher import OAuth2CredentialRefresher + oauth2_exchanger = OAuth2CredentialExchanger() + self._exchanger_registry.register( + AuthCredentialTypes.OAUTH2, oauth2_exchanger + ) + self._exchanger_registry.register( + AuthCredentialTypes.OPEN_ID_CONNECT, oauth2_exchanger + ) + + # TODO: Move ServiceAccountCredentialExchanger to the auth module + self._exchanger_registry.register( + AuthCredentialTypes.SERVICE_ACCOUNT, + ServiceAccountCredentialExchanger(), + ) + oauth2_refresher = OAuth2CredentialRefresher() self._refresher_registry.register( AuthCredentialTypes.OAUTH2, oauth2_refresher @@ -126,9 +149,14 @@ async def get_auth_credential( credential = await self._load_from_auth_response(callback_context) was_from_auth_response = True - # Step 5: If still no credential available, return None + # Step 5: If still no credential available, check if client credentials if not credential: - return None + # For client credentials flow, use raw credentials directly + if self._is_client_credentials_flow(): + credential = self._auth_config.raw_auth_credential + else: + # For authorization code flow, return None to trigger user authorization + return None # Step 6: Exchange credential if needed (e.g., service account to access token) credential, was_exchanged = await self._exchange_credential(credential) @@ -185,9 +213,15 @@ async def _exchange_credential( if not exchanger: return credential, False - exchanged_credential = await exchanger.exchange( - credential, self._auth_config.auth_scheme - ) + if isinstance(exchanger, ServiceAccountCredentialExchanger): + exchanged_credential = exchanger.exchange_credential( + self._auth_config.auth_scheme, credential + ) + else: + exchanged_credential = await exchanger.exchange( + credential, self._auth_config.auth_scheme + ) + return exchanged_credential, True async def _refresh_credential( @@ -247,7 +281,14 @@ async def _validate_credential(self) -> None: "auth_config.raw_credential.oauth2 required for credential type " f"{raw_credential.auth_type}" ) - # Additional validation can be added here + + if self._missing_oauth_info() and not await self._populate_auth_scheme(): + raise ValueError( + "OAuth scheme info is missing, and auto-discovery has failed to fill" + " them in." + ) + + # Additional validation can be added here async def _save_credential( self, callback_context: CallbackContext, credential: AuthCredential @@ -259,3 +300,80 @@ async def _save_credential( credential_service = callback_context._invocation_context.credential_service if credential_service: await callback_context.save_credential(self._auth_config) + + async def _populate_auth_scheme(self) -> bool: + """Auto-discover server metadata and populate missing auth scheme info. + + Returns: + True if auto-discovery was successful, False otherwise. + """ + auth_scheme = self._auth_config.auth_scheme + if ( + not isinstance(auth_scheme, ExtendedOAuth2) + or not auth_scheme.issuer_url + ): + logger.warning("No issuer_url was provided for auto-discovery.") + return False + + metadata = await self._discovery_manager.discover_auth_server_metadata( + auth_scheme.issuer_url + ) + if not metadata: + logger.warning("Auto-discovery has failed to populate OAuth scheme info.") + return False + + flows = auth_scheme.flows + + if flows.implicit and not flows.implicit.authorizationUrl: + flows.implicit.authorizationUrl = metadata.authorization_endpoint + if flows.password and not flows.password.tokenUrl: + flows.password.tokenUrl = metadata.token_endpoint + if flows.clientCredentials and not flows.clientCredentials.tokenUrl: + flows.clientCredentials.tokenUrl = metadata.token_endpoint + if flows.authorizationCode and not flows.authorizationCode.authorizationUrl: + flows.authorizationCode.authorizationUrl = metadata.authorization_endpoint + if flows.authorizationCode and not flows.authorizationCode.tokenUrl: + flows.authorizationCode.tokenUrl = metadata.token_endpoint + return True + + def _missing_oauth_info(self) -> bool: + """Checks if we are missing auth/token URLs needed for OAuth.""" + auth_scheme = self._auth_config.auth_scheme + if isinstance(auth_scheme, OAuth2): + flows = auth_scheme.flows + return ( + flows.implicit + and not flows.implicit.authorizationUrl + or flows.password + and not flows.password.tokenUrl + or flows.clientCredentials + and not flows.clientCredentials.tokenUrl + or flows.authorizationCode + and not flows.authorizationCode.authorizationUrl + or flows.authorizationCode + and not flows.authorizationCode.tokenUrl + ) + return False + + def _is_client_credentials_flow(self) -> bool: + """Check if the auth scheme uses client credentials flow. + + Supports both OAuth2 and OIDC schemes. + + Returns: + True if using client credentials flow, False otherwise. + """ + auth_scheme = self._auth_config.auth_scheme + + # Check OAuth2 schemes + if isinstance(auth_scheme, OAuth2) and auth_scheme.flows: + return auth_scheme.flows.clientCredentials is not None + + # Check OIDC schemes + if isinstance(auth_scheme, OpenIdConnectWithConfig): + return ( + auth_scheme.grant_types_supported is not None + and "client_credentials" in auth_scheme.grant_types_supported + ) + + return False diff --git a/src/google/adk/auth/exchanger/base_credential_exchanger.py b/src/google/adk/auth/exchanger/base_credential_exchanger.py index b09adb80a8..31106b55e2 100644 --- a/src/google/adk/auth/exchanger/base_credential_exchanger.py +++ b/src/google/adk/auth/exchanger/base_credential_exchanger.py @@ -24,7 +24,7 @@ from ..auth_schemes import AuthScheme -class CredentialExchangError(Exception): +class CredentialExchangeError(Exception): """Base exception for credential exchange errors.""" @@ -52,6 +52,6 @@ async def exchange( The exchanged credential. Raises: - CredentialExchangError: If credential exchange fails. + CredentialExchangeError: If credential exchange fails. """ pass diff --git a/src/google/adk/auth/exchanger/oauth2_credential_exchanger.py b/src/google/adk/auth/exchanger/oauth2_credential_exchanger.py index 4231a7c1ed..c0c3e8aea0 100644 --- a/src/google/adk/auth/exchanger/oauth2_credential_exchanger.py +++ b/src/google/adk/auth/exchanger/oauth2_credential_exchanger.py @@ -19,16 +19,18 @@ import logging from typing import Optional +from fastapi.openapi.models import OAuth2 from google.adk.auth.auth_credential import AuthCredential from google.adk.auth.auth_schemes import AuthScheme from google.adk.auth.auth_schemes import OAuthGrantType +from google.adk.auth.auth_schemes import OpenIdConnectWithConfig from google.adk.auth.oauth2_credential_util import create_oauth2_session from google.adk.auth.oauth2_credential_util import update_credential_with_tokens from google.adk.utils.feature_decorator import experimental from typing_extensions import override from .base_credential_exchanger import BaseCredentialExchanger -from .base_credential_exchanger import CredentialExchangError +from .base_credential_exchanger import CredentialExchangeError try: from authlib.integrations.requests_client import OAuth2Session @@ -61,10 +63,10 @@ async def exchange( The exchanged credential with access token. Raises: - CredentialExchangError: If auth_scheme is missing. + CredentialExchangeError: If auth_scheme is missing. """ if not auth_scheme: - raise CredentialExchangError( + raise CredentialExchangeError( "auth_scheme is required for OAuth2 credential exchange" ) @@ -81,9 +83,100 @@ async def exchange( if auth_credential.oauth2 and auth_credential.oauth2.access_token: return auth_credential + # Determine grant type from auth_scheme + grant_type = self._determine_grant_type(auth_scheme) + + if grant_type == OAuthGrantType.CLIENT_CREDENTIALS: + return await self._exchange_client_credentials( + auth_credential, auth_scheme + ) + elif grant_type == OAuthGrantType.AUTHORIZATION_CODE: + return await self._exchange_authorization_code( + auth_credential, auth_scheme + ) + else: + logger.warning("Unsupported OAuth2 grant type: %s", grant_type) + return auth_credential + + def _determine_grant_type( + self, auth_scheme: AuthScheme + ) -> Optional[OAuthGrantType]: + """Determine the OAuth2 grant type from the auth scheme. + + Args: + auth_scheme: The OAuth2 authentication scheme. + + Returns: + The OAuth2 grant type or None if cannot be determined. + """ + if isinstance(auth_scheme, OAuth2) and auth_scheme.flows: + return OAuthGrantType.from_flow(auth_scheme.flows) + elif isinstance(auth_scheme, OpenIdConnectWithConfig): + # Check supported grant types for OIDC + if ( + auth_scheme.grant_types_supported + and "client_credentials" in auth_scheme.grant_types_supported + ): + return OAuthGrantType.CLIENT_CREDENTIALS + else: + # Default to authorization code if client credentials not supported + return OAuthGrantType.AUTHORIZATION_CODE + + return None + + async def _exchange_client_credentials( + self, + auth_credential: AuthCredential, + auth_scheme: AuthScheme, + ) -> AuthCredential: + """Exchange client credentials for access token. + + Args: + auth_credential: The OAuth2 credential to exchange. + auth_scheme: The OAuth2 authentication scheme. + + Returns: + The credential with access token. + """ client, token_endpoint = create_oauth2_session(auth_scheme, auth_credential) if not client: - logger.warning("Could not create OAuth2 session for token exchange") + logger.warning( + "Could not create OAuth2 session for client credentials exchange" + ) + return auth_credential + + try: + tokens = client.fetch_token( + token_endpoint, + grant_type=OAuthGrantType.CLIENT_CREDENTIALS, + ) + update_credential_with_tokens(auth_credential, tokens) + logger.debug("Successfully exchanged client credentials for access token") + except Exception as e: + logger.error("Failed to exchange client credentials: %s", e) + return auth_credential + + return auth_credential + + async def _exchange_authorization_code( + self, + auth_credential: AuthCredential, + auth_scheme: AuthScheme, + ) -> AuthCredential: + """Exchange authorization code for access token. + + Args: + auth_credential: The OAuth2 credential to exchange. + auth_scheme: The OAuth2 authentication scheme. + + Returns: + The credential with access token. + """ + client, token_endpoint = create_oauth2_session(auth_scheme, auth_credential) + if not client: + logger.warning( + "Could not create OAuth2 session for authorization code exchange" + ) return auth_credential try: @@ -94,11 +187,9 @@ async def exchange( grant_type=OAuthGrantType.AUTHORIZATION_CODE, ) update_credential_with_tokens(auth_credential, tokens) - logger.debug("Successfully exchanged OAuth2 tokens") + logger.debug("Successfully exchanged authorization code for access token") except Exception as e: - # TODO reconsider whether we should raise errors in this case - logger.error("Failed to exchange OAuth2 tokens: %s", e) - # Return original credential on failure + logger.error("Failed to exchange authorization code: %s", e) return auth_credential return auth_credential diff --git a/src/google/adk/auth/oauth2_credential_util.py b/src/google/adk/auth/oauth2_credential_util.py index cc315bd29e..d90103a88c 100644 --- a/src/google/adk/auth/oauth2_credential_util.py +++ b/src/google/adk/auth/oauth2_credential_util.py @@ -18,6 +18,8 @@ from typing import Optional from typing import Tuple +from authlib.integrations.requests_client import OAuth2Session +from authlib.oauth2.rfc6749 import OAuth2Token from fastapi.openapi.models import OAuth2 from ..utils.feature_decorator import experimental @@ -25,15 +27,6 @@ from .auth_schemes import AuthScheme from .auth_schemes import OpenIdConnectWithConfig -try: - from authlib.integrations.requests_client import OAuth2Session - from authlib.oauth2.rfc6749 import OAuth2Token - - AUTHLIB_AVAILABLE = True -except ImportError: - AUTHLIB_AVAILABLE = False - - logger = logging.getLogger("google_adk." + __name__) @@ -53,18 +46,34 @@ def create_oauth2_session( """ if isinstance(auth_scheme, OpenIdConnectWithConfig): if not hasattr(auth_scheme, "token_endpoint"): + logger.warning("OpenIdConnect scheme missing token_endpoint") return None, None token_endpoint = auth_scheme.token_endpoint - scopes = auth_scheme.scopes + scopes = auth_scheme.scopes or [] elif isinstance(auth_scheme, OAuth2): + # Support both authorization code and client credentials flows if ( - not auth_scheme.flows.authorizationCode - or not auth_scheme.flows.authorizationCode.tokenUrl + auth_scheme.flows.authorizationCode + and auth_scheme.flows.authorizationCode.tokenUrl + ): + token_endpoint = auth_scheme.flows.authorizationCode.tokenUrl + scopes = list(auth_scheme.flows.authorizationCode.scopes.keys()) + elif ( + auth_scheme.flows.clientCredentials + and auth_scheme.flows.clientCredentials.tokenUrl ): + token_endpoint = auth_scheme.flows.clientCredentials.tokenUrl + scopes = list(auth_scheme.flows.clientCredentials.scopes.keys()) + else: + logger.warning( + "OAuth2 scheme missing required flow configuration. Expected either" + " authorizationCode.tokenUrl or clientCredentials.tokenUrl. Auth" + " scheme: %s", + auth_scheme, + ) return None, None - token_endpoint = auth_scheme.flows.authorizationCode.tokenUrl - scopes = list(auth_scheme.flows.authorizationCode.scopes.keys()) else: + logger.warning(f"Unsupported auth_scheme type: {type(auth_scheme)}") return None, None if ( diff --git a/src/google/adk/auth/oauth2_discovery.py b/src/google/adk/auth/oauth2_discovery.py new file mode 100644 index 0000000000..c519072a2f --- /dev/null +++ b/src/google/adk/auth/oauth2_discovery.py @@ -0,0 +1,148 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import json +import logging +from typing import List +from typing import Optional +from urllib.parse import urlparse + +import httpx +from pydantic import BaseModel +from pydantic import ValidationError + +from ..utils.feature_decorator import experimental + +logger = logging.getLogger("google_adk." + __name__) + + +@experimental +class AuthorizationServerMetadata(BaseModel): + """Represents the OAuth2 authorization server metadata per RFC8414.""" + + issuer: str + authorization_endpoint: str + token_endpoint: str + scopes_supported: Optional[List[str]] = None + registration_endpoint: Optional[str] = None + + +@experimental +class ProtectedResourceMetadata(BaseModel): + """Represents the OAuth2 protected resource metadata per RFC9728.""" + + resource: str + authorization_servers: List[str] = [] + + +@experimental +class OAuth2DiscoveryManager: + """Implements Metadata discovery for OAuth2 following RFC8414 and RFC9728.""" + + async def discover_auth_server_metadata( + self, issuer_url: str + ) -> Optional[AuthorizationServerMetadata]: + """Discovers the OAuth2 authorization server metadata.""" + try: + parsed_url = urlparse(issuer_url) + base_url = f"{parsed_url.scheme}://{parsed_url.netloc}" + path = parsed_url.path + except ValueError as e: + logger.warning("Failed to parse issuer_url %s: %s", issuer_url, e) + return None + + # Try the standard well-known endpoints in order. + if path and path != "/": + endpoints_to_try = [ + # 1. OAuth 2.0 Authorization Server Metadata with path insertion + f"{base_url}/.well-known/oauth-authorization-server{path}", + # 2. OpenID Connect Discovery 1.0 with path insertion + f"{base_url}/.well-known/openid-configuration{path}", + # 3. OpenID Connect Discovery 1.0 with path appending + f"{base_url}{path}/.well-known/openid-configuration", + ] + else: + endpoints_to_try = [ + # 1. OAuth 2.0 Authorization Server Metadata + f"{base_url}/.well-known/oauth-authorization-server", + # 2. OpenID Connect Discovery 1.0 + f"{base_url}/.well-known/openid-configuration", + ] + + async with httpx.AsyncClient() as client: + for endpoint in endpoints_to_try: + try: + response = await client.get(endpoint, timeout=5) + response.raise_for_status() + metadata = AuthorizationServerMetadata.model_validate(response.json()) + # Validate issuer to defend against MIX-UP attacks + if metadata.issuer == issuer_url.rstrip("/"): + return metadata + else: + logger.warning( + "Issuer in metadata %s does not match issuer_url %s", + metadata.issuer, + issuer_url, + ) + except httpx.HTTPError as e: + logger.debug("Failed to fetch metadata from %s: %s", endpoint, e) + except (json.decoder.JSONDecodeError, ValidationError) as e: + logger.debug("Failed to parse metadata from %s: %s", endpoint, e) + return None + + async def discover_resource_metadata( + self, resource_url: str + ) -> Optional[ProtectedResourceMetadata]: + """Discovers the OAuth2 protected resource metadata.""" + try: + parsed_url = urlparse(resource_url) + base_url = f"{parsed_url.scheme}://{parsed_url.netloc}" + path = parsed_url.path + except ValueError as e: + logger.warning("Failed to parse resource_url %s: %s", resource_url, e) + return None + + if path and path != "/": + well_known_endpoint = ( + f"{base_url}/.well-known/oauth-protected-resource{path}" + ) + else: + well_known_endpoint = f"{base_url}/.well-known/oauth-protected-resource" + + async with httpx.AsyncClient() as client: + try: + response = await client.get(well_known_endpoint, timeout=5) + response.raise_for_status() + metadata = ProtectedResourceMetadata.model_validate(response.json()) + # Validate resource to defend against MIX-UP attacks + if metadata.resource == resource_url.rstrip("/"): + return metadata + else: + logger.warning( + "Resource in metadata %s does not match resource_url %s", + metadata.resource, + resource_url, + ) + except httpx.HTTPError as e: + logger.debug( + "Failed to fetch metadata from %s: %s", well_known_endpoint, e + ) + except (json.decoder.JSONDecodeError, ValidationError) as e: + logger.debug( + "Failed to parse metadata from %s: %s", well_known_endpoint, e + ) + + return None diff --git a/src/google/adk/cli/adk_web_server.py b/src/google/adk/cli/adk_web_server.py index 82279cb142..1b422fe335 100644 --- a/src/google/adk/cli/adk_web_server.py +++ b/src/google/adk/cli/adk_web_server.py @@ -16,6 +16,8 @@ import asyncio from contextlib import asynccontextmanager +import importlib +import json import logging import os import time @@ -30,6 +32,7 @@ from fastapi import FastAPI from fastapi import HTTPException from fastapi import Query +from fastapi import Response from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import RedirectResponse from fastapi.responses import StreamingResponse @@ -39,8 +42,10 @@ from google.genai import types import graphviz from opentelemetry import trace +import opentelemetry.sdk.environment_variables as otel_env from opentelemetry.sdk.trace import export as export_lib from opentelemetry.sdk.trace import ReadableSpan +from opentelemetry.sdk.trace import SpanProcessor from opentelemetry.sdk.trace import TracerProvider from pydantic import Field from pydantic import ValidationError @@ -58,6 +63,7 @@ from ..apps.app import App from ..artifacts.base_artifact_service import BaseArtifactService from ..auth.credential_service.base_credential_service import BaseCredentialService +from ..errors.already_exists_error import AlreadyExistsError from ..errors.not_found_error import NotFoundError from ..evaluation.base_eval_service import InferenceConfig from ..evaluation.base_eval_service import InferenceRequest @@ -67,6 +73,7 @@ from ..evaluation.eval_metrics import EvalMetric from ..evaluation.eval_metrics import EvalMetricResult from ..evaluation.eval_metrics import EvalMetricResultPerInvocation +from ..evaluation.eval_metrics import EvalStatus from ..evaluation.eval_metrics import MetricInfo from ..evaluation.eval_result import EvalSetResult from ..evaluation.eval_set import EvalSet @@ -74,12 +81,12 @@ from ..evaluation.eval_sets_manager import EvalSetsManager from ..events.event import Event from ..memory.base_memory_service import BaseMemoryService +from ..plugins.base_plugin import BasePlugin from ..runners import Runner from ..sessions.base_session_service import BaseSessionService from ..sessions.session import Session from ..utils.context_utils import Aclosing from .cli_eval import EVAL_SESSION_ID_PREFIX -from .cli_eval import EvalStatus from .utils import cleanup from .utils import common from .utils import envs @@ -166,6 +173,8 @@ class RunAgentRequest(common.BaseModel): new_message: types.Content streaming: bool = False state_delta: Optional[dict[str, Any]] = None + # for resume long running functions + invocation_id: Optional[str] = None class CreateSessionRequest(common.BaseModel): @@ -207,6 +216,20 @@ class RunEvalRequest(common.BaseModel): eval_metrics: list[EvalMetric] +class UpdateMemoryRequest(common.BaseModel): + """Request to add a session to the memory service.""" + + session_id: str + """The ID of the session to add to memory.""" + + +class UpdateSessionRequest(common.BaseModel): + """Request to update session state without running the agent.""" + + state_delta: dict[str, Any] + """The state changes to apply to the session.""" + + class RunEvalResult(common.BaseModel): eval_set_file: str eval_set_id: str @@ -257,6 +280,113 @@ class ListMetricsInfoResponse(common.BaseModel): metrics_info: list[MetricInfo] +def _setup_telemetry( + otel_to_cloud: bool = False, + internal_exporters: Optional[list[SpanProcessor]] = None, +): + # TODO - remove the else branch here once maybe_set_otel_providers is no + # longer experimental. + if otel_to_cloud: + _setup_gcp_telemetry_experimental(internal_exporters=internal_exporters) + elif _otel_env_vars_enabled(): + _setup_telemetry_from_env_experimental( + internal_exporters=internal_exporters + ) + else: + # Old logic - to be removed when above leaves experimental. + tracer_provider = TracerProvider() + if internal_exporters is not None: + for exporter in internal_exporters: + tracer_provider.add_span_processor(exporter) + trace.set_tracer_provider(tracer_provider=tracer_provider) + + +def _otel_env_vars_enabled() -> bool: + return any([ + os.getenv(endpoint_var) + for endpoint_var in [ + otel_env.OTEL_EXPORTER_OTLP_ENDPOINT, + otel_env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, + otel_env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT, + otel_env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT, + ] + ]) + + +def _setup_gcp_telemetry_experimental( + internal_exporters: list[SpanProcessor] = None, +): + if typing.TYPE_CHECKING: + from ..telemetry.setup import OTelHooks + + otel_hooks_to_add: list[OTelHooks] = [] + + if internal_exporters: + from ..telemetry.setup import OTelHooks + + # Register ADK-specific exporters in trace provider. + otel_hooks_to_add.append(OTelHooks(span_processors=internal_exporters)) + + import google.auth + + from ..telemetry.google_cloud import get_gcp_exporters + from ..telemetry.google_cloud import get_gcp_resource + from ..telemetry.setup import maybe_set_otel_providers + + credentials, project_id = google.auth.default() + + otel_hooks_to_add.append( + get_gcp_exporters( + # TODO - use trace_to_cloud here as well once otel_to_cloud is no + # longer experimental. + enable_cloud_tracing=True, + # TODO - reenable metrics once errors during shutdown are fixed. + enable_cloud_metrics=False, + enable_cloud_logging=True, + google_auth=(credentials, project_id), + ) + ) + otel_resource = get_gcp_resource(project_id) + + maybe_set_otel_providers( + otel_hooks_to_setup=otel_hooks_to_add, + otel_resource=otel_resource, + ) + _setup_instrumentation_lib_if_installed() + + +def _setup_telemetry_from_env_experimental( + internal_exporters: list[SpanProcessor] = None, +): + from ..telemetry.setup import maybe_set_otel_providers + + otel_hooks_to_add = [] + + if internal_exporters: + from ..telemetry.setup import OTelHooks + + # Register ADK-specific exporters in trace provider. + otel_hooks_to_add.append(OTelHooks(span_processors=internal_exporters)) + + maybe_set_otel_providers(otel_hooks_to_setup=otel_hooks_to_add) + _setup_instrumentation_lib_if_installed() + + +def _setup_instrumentation_lib_if_installed(): + # Set instrumentation to enable emitting OTel data from GenAISDK + # Currently the instrumentation lib is in extras dependencies, make sure to + # warn the user if it's not installed. + try: + from opentelemetry.instrumentation.google_genai import GoogleGenAiSdkInstrumentor + + GoogleGenAiSdkInstrumentor().instrument() + except ImportError: + logger.warning( + "Unable to import GoogleGenAiSdkInstrumentor - some" + " telemetry will be disabled. Make sure to install google-adk[otel-gcp]" + ) + + class AdkWebServer: """Helper class for setting up and running the ADK web server on FastAPI. @@ -266,7 +396,7 @@ class AdkWebServer: If you pass in a web_assets_dir, the static assets will be served under /dev-ui in addition to the API endpoints created by default. - You can add add additional API endpoints by modifying the FastAPI app + You can add additional API endpoints by modifying the FastAPI app instance returned by get_fast_api_app as this class exposes the agent runners and most other bits of state retained during the lifetime of the server. @@ -284,6 +414,9 @@ class AdkWebServer: managing evaluation set results. agents_dir: Root directory containing subdirs for agents with those containing resources (e.g. .env files, eval sets, etc.) for the agents. + extra_plugins: A list of fully qualified names of extra plugins to load. + logo_text: Text to display in the logo of the UI. + logo_image_url: URL of an image to display as logo of the UI. runners_to_clean: Set of runner names marked for cleanup. current_app_name_ref: A shared reference to the latest ran app name. runner_dict: A dict of instantiated runners for each app. @@ -300,6 +433,10 @@ def __init__( eval_sets_manager: EvalSetsManager, eval_set_results_manager: EvalSetResultsManager, agents_dir: str, + extra_plugins: Optional[list[str]] = None, + logo_text: Optional[str] = None, + logo_image_url: Optional[str] = None, + url_prefix: Optional[str] = None, ): self.agent_loader = agent_loader self.session_service = session_service @@ -309,39 +446,173 @@ def __init__( self.eval_sets_manager = eval_sets_manager self.eval_set_results_manager = eval_set_results_manager self.agents_dir = agents_dir - # Internal propeties we want to allow being modified from callbacks. + self.extra_plugins = extra_plugins or [] + self.logo_text = logo_text + self.logo_image_url = logo_image_url + # Internal properties we want to allow being modified from callbacks. self.runners_to_clean: set[str] = set() self.current_app_name_ref: SharedValue[str] = SharedValue(value="") self.runner_dict = {} + self.url_prefix = url_prefix async def get_runner_async(self, app_name: str) -> Runner: - """Returns the runner for the given app.""" + """Returns the cached runner for the given app.""" + # Handle cleanup if app_name in self.runners_to_clean: self.runners_to_clean.remove(app_name) runner = self.runner_dict.pop(app_name, None) await cleanup.close_runners(list([runner])) - envs.load_dotenv_for_agent(os.path.basename(app_name), self.agents_dir) + # Return cached runner if exists if app_name in self.runner_dict: return self.runner_dict[app_name] + + # Create new runner + envs.load_dotenv_for_agent(os.path.basename(app_name), self.agents_dir) agent_or_app = self.agent_loader.load_agent(app_name) - agentic_app = None + + # Instantiate extra plugins if configured + extra_plugins_instances = self._instantiate_extra_plugins() + if isinstance(agent_or_app, BaseAgent): agentic_app = App( name=app_name, root_agent=agent_or_app, + plugins=extra_plugins_instances, ) else: + # Combine existing plugins with extra plugins + agent_or_app.plugins = agent_or_app.plugins + extra_plugins_instances agentic_app = agent_or_app - runner = Runner( + + runner = self._create_runner(agentic_app) + self.runner_dict[app_name] = runner + return runner + + def _get_root_agent(self, agent_or_app: BaseAgent | App) -> BaseAgent: + """Extract root agent from either a BaseAgent or App object.""" + if isinstance(agent_or_app, App): + return agent_or_app.root_agent + return agent_or_app + + def _create_runner(self, agentic_app: App) -> Runner: + """Create a runner with common services.""" + return Runner( app=agentic_app, artifact_service=self.artifact_service, session_service=self.session_service, memory_service=self.memory_service, credential_service=self.credential_service, ) - self.runner_dict[app_name] = runner - return runner + + def _instantiate_extra_plugins(self) -> list[BasePlugin]: + """Instantiate extra plugins from the configured list. + + Returns: + List of instantiated BasePlugin objects. + """ + extra_plugins_instances = [] + for qualified_name in self.extra_plugins: + try: + plugin_obj = self._import_plugin_object(qualified_name) + if isinstance(plugin_obj, BasePlugin): + extra_plugins_instances.append(plugin_obj) + elif issubclass(plugin_obj, BasePlugin): + extra_plugins_instances.append(plugin_obj(name=qualified_name)) + except Exception as e: + logger.error("Failed to load plugin %s: %s", qualified_name, e) + return extra_plugins_instances + + def _import_plugin_object(self, qualified_name: str) -> Any: + """Import a plugin object (class or instance) from a fully qualified name. + + Args: + qualified_name: Fully qualified name (e.g., 'my_package.my_plugin.MyPlugin') + + Returns: + The imported object, which can be either a class or an instance. + + Raises: + ImportError: If the module cannot be imported. + AttributeError: If the object doesn't exist in the module. + """ + module_name, obj_name = qualified_name.rsplit(".", 1) + module = importlib.import_module(module_name) + return getattr(module, obj_name) + + def _setup_runtime_config(self, web_assets_dir: str): + """Sets up the runtime config for the web server.""" + # Read existing runtime config file. + runtime_config_path = os.path.join( + web_assets_dir, "assets", "config", "runtime-config.json" + ) + runtime_config = {} + try: + with open(runtime_config_path, "r") as f: + runtime_config = json.load(f) + except FileNotFoundError: + logger.info( + "File not found: %s. A new runtime config file will be created.", + runtime_config_path, + ) + except json.JSONDecodeError: + logger.warning( + "Failed to decode JSON from %s. The file content will be" + " overwritten.", + runtime_config_path, + ) + runtime_config["backendUrl"] = self.url_prefix if self.url_prefix else "" + + # Set custom logo config. + if self.logo_text or self.logo_image_url: + if not self.logo_text or not self.logo_image_url: + raise ValueError( + "Both --logo-text and --logo-image-url must be defined when using" + " logo config." + ) + runtime_config["logo"] = { + "text": self.logo_text, + "imageUrl": self.logo_image_url, + } + elif "logo" in runtime_config: + del runtime_config["logo"] + + # Write the runtime config file. + try: + os.makedirs(os.path.dirname(runtime_config_path), exist_ok=True) + with open(runtime_config_path, "w") as f: + json.dump(runtime_config, f, indent=2) + except IOError as e: + logger.error( + "Failed to write runtime config file %s: %s", runtime_config_path, e + ) + + async def _create_session( + self, + *, + app_name: str, + user_id: str, + session_id: Optional[str] = None, + state: Optional[dict[str, Any]] = None, + ) -> Session: + try: + session = await self.session_service.create_session( + app_name=app_name, + user_id=user_id, + state=state, + session_id=session_id, + ) + logger.info("New session created: %s", session.id) + return session + except AlreadyExistsError as e: + raise HTTPException( + status_code=409, detail=f"Session already exists: {session_id}" + ) from e + except Exception as e: + logger.error( + "Internal server error during session creation: %s", e, exc_info=True + ) + raise HTTPException(status_code=500, detail=str(e)) from e def get_fast_api_app( self, @@ -355,6 +626,7 @@ def get_fast_api_app( [Observer, "AdkWebServer"], None ] = lambda o, s: None, register_processors: Callable[[TracerProvider], None] = lambda o: None, + otel_to_cloud: bool = False, ): """Creates a FastAPI app for the ADK web server. @@ -371,6 +643,8 @@ def get_fast_api_app( tear_down_observer: Callback for cleaning up the file system observer. register_processors: Callback for additional Span processors to be added to the TracerProvider. + otel_to_cloud: EXPERIMENTAL. Whether to enable Cloud Trace + and Cloud Logging integrations. Returns: A FastAPI app instance. @@ -395,17 +669,22 @@ async def internal_lifespan(app: FastAPI): # Create tasks for all runner closures to run concurrently await cleanup.close_runners(list(self.runner_dict.values())) - # Set up tracing in the FastAPI server. - provider = TracerProvider() - provider.add_span_processor( - export_lib.SimpleSpanProcessor(ApiServerSpanExporter(trace_dict)) - ) memory_exporter = InMemoryExporter(session_trace_dict) - provider.add_span_processor(export_lib.SimpleSpanProcessor(memory_exporter)) - register_processors(provider) + _setup_telemetry( + otel_to_cloud=otel_to_cloud, + internal_exporters=[ + export_lib.SimpleSpanProcessor(ApiServerSpanExporter(trace_dict)), + export_lib.SimpleSpanProcessor(memory_exporter), + ], + ) + if web_assets_dir: + self._setup_runtime_config(web_assets_dir) - trace.set_tracer_provider(provider) + # TODO - register_processors to be removed once --otel_to_cloud is no + # longer experimental. + tracer_provider = trace.get_tracer_provider() + register_processors(tracer_provider) # Run the FastAPI server. app = FastAPI(lifespan=internal_lifespan) @@ -492,20 +771,12 @@ async def create_session_with_id( session_id: str, state: Optional[dict[str, Any]] = None, ) -> Session: - if ( - await self.session_service.get_session( - app_name=app_name, user_id=user_id, session_id=session_id - ) - is not None - ): - raise HTTPException( - status_code=400, detail=f"Session already exists: {session_id}" - ) - session = await self.session_service.create_session( - app_name=app_name, user_id=user_id, state=state, session_id=session_id + return await self._create_session( + app_name=app_name, + user_id=user_id, + state=state, + session_id=session_id, ) - logger.info("New session created: %s", session_id) - return session @app.post( "/apps/{app_name}/users/{user_id}/sessions", @@ -517,11 +788,9 @@ async def create_session( req: Optional[CreateSessionRequest] = None, ) -> Session: if not req: - return await self.session_service.create_session( - app_name=app_name, user_id=user_id - ) + return await self._create_session(app_name=app_name, user_id=user_id) - session = await self.session_service.create_session( + session = await self._create_session( app_name=app_name, user_id=user_id, state=req.state, @@ -542,6 +811,56 @@ async def delete_session( app_name=app_name, user_id=user_id, session_id=session_id ) + @app.patch( + "/apps/{app_name}/users/{user_id}/sessions/{session_id}", + response_model_exclude_none=True, + ) + async def update_session( + app_name: str, + user_id: str, + session_id: str, + req: UpdateSessionRequest, + ) -> Session: + """Updates session state without running the agent. + + Args: + app_name: The name of the application. + user_id: The ID of the user. + session_id: The ID of the session to update. + req: The patch request containing state changes. + + Returns: + The updated session. + + Raises: + HTTPException: If the session is not found. + """ + session = await self.session_service.get_session( + app_name=app_name, user_id=user_id, session_id=session_id + ) + if not session: + raise HTTPException(status_code=404, detail="Session not found") + + # Create an event to record the state change + import uuid + + from ..events.event import Event + from ..events.event import EventActions + + state_update_event = Event( + invocation_id="p-" + str(uuid.uuid4()), + author="user", + actions=EventActions(state_delta=req.state_delta), + ) + + # Append the event to the session + # This will automatically update the session state through __update_session_state + await self.session_service.append_event( + session=session, event=state_update_event + ) + + return session + @app.post( "/apps/{app_name}/eval-sets", response_model_exclude_none=True, @@ -634,9 +953,8 @@ async def add_session_to_eval_set( # Populate the session with initial session state. agent_or_app = self.agent_loader.load_agent(app_name) - if isinstance(agent_or_app, App): - agent_or_app = agent_or_app.root_agent - initial_session_state = create_empty_state(agent_or_app) + root_agent = self._get_root_agent(agent_or_app) + initial_session_state = create_empty_state(root_agent) new_eval_case = EvalCase( eval_id=req.eval_id, @@ -797,7 +1115,8 @@ async def run_eval( status_code=400, detail=f"Eval set `{eval_set_id}` not found." ) - root_agent = self.agent_loader.load_agent(app_name) + agent_or_app = self.agent_loader.load_agent(app_name) + root_agent = self._get_root_agent(agent_or_app) eval_case_results = [] @@ -1017,6 +1336,41 @@ async def delete_artifact( filename=artifact_name, ) + @app.patch("/apps/{app_name}/users/{user_id}/memory") + async def patch_memory( + app_name: str, user_id: str, update_memory_request: UpdateMemoryRequest + ) -> None: + """Adds all events from a given session to the memory service. + + Args: + app_name: The name of the application. + user_id: The ID of the user. + update_memory_request: The memory request for the update + + Raises: + HTTPException: If the memory service is not configured or the request is invalid. + """ + if not self.memory_service: + raise HTTPException( + status_code=400, detail="Memory service is not configured." + ) + if ( + update_memory_request is None + or update_memory_request.session_id is None + ): + raise HTTPException( + status_code=400, detail="Update memory request is invalid." + ) + + session = await self.session_service.get_session( + app_name=app_name, + user_id=user_id, + session_id=update_memory_request.session_id, + ) + if not session: + raise HTTPException(status_code=404, detail="Session not found") + await self.memory_service.add_session_to_memory(session) + @app.post("/run", response_model_exclude_none=True) async def run_agent(req: RunAgentRequest) -> list[Event]: session = await self.session_service.get_session( @@ -1061,6 +1415,7 @@ async def event_generator(): new_message=req.new_message, state_delta=req.state_delta, run_config=RunConfig(streaming_mode=stream_mode), + invocation_id=req.invocation_id, ) ) as agen: async for event in agen: @@ -1101,7 +1456,8 @@ async def get_event_graph( function_calls = event.get_function_calls() function_responses = event.get_function_responses() - root_agent = self.agent_loader.load_agent(app_name) + agent_or_app = self.agent_loader.load_agent(app_name) + root_agent = self._get_root_agent(agent_or_app) dot_graph = None if function_calls: function_call_highlights = [] @@ -1209,13 +1565,24 @@ async def process_messages(): mimetypes.add_type("application/javascript", ".js", True) mimetypes.add_type("text/javascript", ".js", True) + redirect_dev_ui_url = ( + self.url_prefix + "/dev-ui/" if self.url_prefix else "/dev-ui/" + ) + + @app.get("/dev-ui/config") + async def get_ui_config(): + return { + "logo_text": self.logo_text, + "logo_image_url": self.logo_image_url, + } + @app.get("/") async def redirect_root_to_dev_ui(): - return RedirectResponse("/dev-ui/") + return RedirectResponse(redirect_dev_ui_url) @app.get("/dev-ui") async def redirect_dev_ui_add_slash(): - return RedirectResponse("/dev-ui/") + return RedirectResponse(redirect_dev_ui_url) app.mount( "/dev-ui/", diff --git a/src/google/adk/cli/agent_graph.py b/src/google/adk/cli/agent_graph.py index e919010cce..535fa3a7ca 100644 --- a/src/google/adk/cli/agent_graph.py +++ b/src/google/adk/cli/agent_graph.py @@ -283,7 +283,6 @@ def draw_edge(from_name, to_name): async def get_agent_graph(root_agent, highlights_pairs, image=False): - print('build graph') graph = graphviz.Digraph( graph_attr={'rankdir': 'LR', 'bgcolor': '#333537'}, strict=True ) diff --git a/src/google/adk/cli/browser/chunk-2WH2EVR6.js b/src/google/adk/cli/browser/chunk-2WH2EVR6.js new file mode 100644 index 0000000000..5da3409f61 --- /dev/null +++ b/src/google/adk/cli/browser/chunk-2WH2EVR6.js @@ -0,0 +1 @@ +var q=Object.create;var m=Object.defineProperty,r=Object.defineProperties,s=Object.getOwnPropertyDescriptor,t=Object.getOwnPropertyDescriptors,u=Object.getOwnPropertyNames,j=Object.getOwnPropertySymbols,v=Object.getPrototypeOf,n=Object.prototype.hasOwnProperty,p=Object.prototype.propertyIsEnumerable;var l=(b,a)=>(a=Symbol[b])?a:Symbol.for("Symbol."+b),w=b=>{throw TypeError(b)};var o=(b,a,c)=>a in b?m(b,a,{enumerable:!0,configurable:!0,writable:!0,value:c}):b[a]=c,z=(b,a)=>{for(var c in a||={})n.call(a,c)&&o(b,c,a[c]);if(j)for(var c of j(a))p.call(a,c)&&o(b,c,a[c]);return b},A=(b,a)=>r(b,t(a));var B=(b,a)=>{var c={};for(var d in b)n.call(b,d)&&a.indexOf(d)<0&&(c[d]=b[d]);if(b!=null&&j)for(var d of j(b))a.indexOf(d)<0&&p.call(b,d)&&(c[d]=b[d]);return c};var C=(b,a)=>()=>(a||b((a={exports:{}}).exports,a),a.exports);var x=(b,a,c,d)=>{if(a&&typeof a=="object"||typeof a=="function")for(let e of u(a))!n.call(b,e)&&e!==c&&m(b,e,{get:()=>a[e],enumerable:!(d=s(a,e))||d.enumerable});return b};var D=(b,a,c)=>(c=b!=null?q(v(b)):{},x(a||!b||!b.__esModule?m(c,"default",{value:b,enumerable:!0}):c,b));var E=(b,a,c)=>new Promise((d,e)=>{var f=g=>{try{i(c.next(g))}catch(k){e(k)}},h=g=>{try{i(c.throw(g))}catch(k){e(k)}},i=g=>g.done?d(g.value):Promise.resolve(g.value).then(f,h);i((c=c.apply(b,a)).next())}),y=function(b,a){this[0]=b,this[1]=a};var F=b=>{var a=b[l("asyncIterator")],c=!1,d,e={};return a==null?(a=b[l("iterator")](),d=f=>e[f]=h=>a[f](h)):(a=a.call(b),d=f=>e[f]=h=>{if(c){if(c=!1,f==="throw")throw h;return h}return c=!0,{done:!1,value:new y(new Promise(i=>{var g=a[f](h);g instanceof Object||w("Object expected"),i(g)}),1)}}),e[l("iterator")]=()=>e,d("next"),"throw"in a?d("throw"):e.throw=f=>{throw f},"return"in a&&d("return"),e};export{z as a,A as b,B as c,C as d,D as e,E as f,F as g}; diff --git a/src/google/adk/cli/browser/chunk-EQDQRRRY.js b/src/google/adk/cli/browser/chunk-EQDQRRRY.js deleted file mode 100644 index 134dff1fa6..0000000000 --- a/src/google/adk/cli/browser/chunk-EQDQRRRY.js +++ /dev/null @@ -1 +0,0 @@ -var p=Object.create;var j=Object.defineProperty,q=Object.defineProperties,r=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyDescriptors,t=Object.getOwnPropertyNames,g=Object.getOwnPropertySymbols,u=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty,m=Object.prototype.propertyIsEnumerable;var l=(a,b,c)=>b in a?j(a,b,{enumerable:!0,configurable:!0,writable:!0,value:c}):a[b]=c,w=(a,b)=>{for(var c in b||={})k.call(b,c)&&l(a,c,b[c]);if(g)for(var c of g(b))m.call(b,c)&&l(a,c,b[c]);return a},x=(a,b)=>q(a,s(b));var y=(a,b)=>{var c={};for(var d in a)k.call(a,d)&&b.indexOf(d)<0&&(c[d]=a[d]);if(a!=null&&g)for(var d of g(a))b.indexOf(d)<0&&m.call(a,d)&&(c[d]=a[d]);return c};var z=(a,b)=>()=>(b||a((b={exports:{}}).exports,b),b.exports);var v=(a,b,c,d)=>{if(b&&typeof b=="object"||typeof b=="function")for(let e of t(b))!k.call(a,e)&&e!==c&&j(a,e,{get:()=>b[e],enumerable:!(d=r(b,e))||d.enumerable});return a};var A=(a,b,c)=>(c=a!=null?p(u(a)):{},v(b||!a||!a.__esModule?j(c,"default",{value:a,enumerable:!0}):c,a));var B=(a,b,c)=>new Promise((d,e)=>{var n=f=>{try{h(c.next(f))}catch(i){e(i)}},o=f=>{try{h(c.throw(f))}catch(i){e(i)}},h=f=>f.done?d(f.value):Promise.resolve(f.value).then(n,o);h((c=c.apply(a,b)).next())});export{w as a,x as b,y as c,z as d,A as e,B as f}; diff --git a/src/google/adk/cli/browser/chunk-TXJFAAIW.js b/src/google/adk/cli/browser/chunk-XMJNYD32.js similarity index 99% rename from src/google/adk/cli/browser/chunk-TXJFAAIW.js rename to src/google/adk/cli/browser/chunk-XMJNYD32.js index 24066bccc6..1b71b0ef92 100644 --- a/src/google/adk/cli/browser/chunk-TXJFAAIW.js +++ b/src/google/adk/cli/browser/chunk-XMJNYD32.js @@ -1,2 +1,2 @@ -import"./chunk-EQDQRRRY.js";var O=function(l,i){if(!(l instanceof i))throw new TypeError("Cannot call a class as a function")},R=function(){function l(i,e){for(var t=0;t1&&arguments[1]!==void 0?arguments[1]:1,e=i>0?l.toFixed(i).replace(/0+$/,"").replace(/\.$/,""):l.toString();return e||"0"}var z=function(){function l(i,e,t,r){O(this,l);var n=this;function o(a){if(a.startsWith("hsl")){var s=a.match(/([\-\d\.e]+)/g).map(Number),p=y(s,4),u=p[0],f=p[1],d=p[2],b=p[3];b===void 0&&(b=1),u/=360,f/=100,d/=100,n.hsla=[u,f,d,b]}else if(a.startsWith("rgb")){var m=a.match(/([\-\d\.e]+)/g).map(Number),h=y(m,4),v=h[0],g=h[1],S=h[2],k=h[3];k===void 0&&(k=1),n.rgba=[v,g,S,k]}else a.startsWith("#")?n.rgba=l.hexToRgb(a):n.rgba=l.nameToRgb(a)||l.hexToRgb(a)}if(i!==void 0)if(Array.isArray(i))this.rgba=i;else if(t===void 0){var c=i&&""+i;c&&o(c.toLowerCase())}else this.rgba=[i,e,t,r===void 0?1:r]}return R(l,[{key:"printRGB",value:function(e){var t=e?this.rgba:this.rgba.slice(0,3),r=t.map(function(n,o){return A(n,o===3?3:0)});return e?"rgba("+r+")":"rgb("+r+")"}},{key:"printHSL",value:function(e){var t=[360,100,100,1],r=["","%","%",""],n=e?this.hsla:this.hsla.slice(0,3),o=n.map(function(c,a){return A(c*t[a],a===3?3:1)+r[a]});return e?"hsla("+o+")":"hsl("+o+")"}},{key:"printHex",value:function(e){var t=this.hex;return e?t:t.substring(0,7)}},{key:"rgba",get:function(){if(this._rgba)return this._rgba;if(!this._hsla)throw new Error("No color is set");return this._rgba=l.hslToRgb(this._hsla)},set:function(e){e.length===3&&(e[3]=1),this._rgba=e,this._hsla=null}},{key:"rgbString",get:function(){return this.printRGB()}},{key:"rgbaString",get:function(){return this.printRGB(!0)}},{key:"hsla",get:function(){if(this._hsla)return this._hsla;if(!this._rgba)throw new Error("No color is set");return this._hsla=l.rgbToHsl(this._rgba)},set:function(e){e.length===3&&(e[3]=1),this._hsla=e,this._rgba=null}},{key:"hslString",get:function(){return this.printHSL()}},{key:"hslaString",get:function(){return this.printHSL(!0)}},{key:"hex",get:function(){var e=this.rgba,t=e.map(function(r,n){return n<3?r.toString(16):Math.round(r*255).toString(16)});return"#"+t.map(function(r){return r.padStart(2,"0")}).join("")},set:function(e){this.rgba=l.hexToRgb(e)}}],[{key:"hexToRgb",value:function(e){var t=(e.startsWith("#")?e.slice(1):e).replace(/^(\w{3})$/,"$1F").replace(/^(\w)(\w)(\w)(\w)$/,"$1$1$2$2$3$3$4$4").replace(/^(\w{6})$/,"$1FF");if(!t.match(/^([0-9a-fA-F]{8})$/))throw new Error("Unknown hex color; "+e);var r=t.match(/^(\w\w)(\w\w)(\w\w)(\w\w)$/).slice(1).map(function(n){return parseInt(n,16)});return r[3]=r[3]/255,r}},{key:"nameToRgb",value:function(e){var t=e.toLowerCase().replace("at","T").replace(/[aeiouyldf]/g,"").replace("ght","L").replace("rk","D").slice(-5,4),r=N[t];return r===void 0?r:l.hexToRgb(r.replace(/\-/g,"00").padStart(6,"f"))}},{key:"rgbToHsl",value:function(e){var t=y(e,4),r=t[0],n=t[1],o=t[2],c=t[3];r/=255,n/=255,o/=255;var a=Math.max(r,n,o),s=Math.min(r,n,o),p=void 0,u=void 0,f=(a+s)/2;if(a===s)p=u=0;else{var d=a-s;switch(u=f>.5?d/(2-a-s):d/(a+s),a){case r:p=(n-o)/d+(n1&&(g-=1),g<.16666666666666666?h+(v-h)*6*g:g<.5?v:g<.6666666666666666?h+(v-h)*(.6666666666666666-g)*6:h},f=o<.5?o*(1+n):o+n-o*n,d=2*o-f;a=u(d,f,r+1/3),s=u(d,f,r),p=u(d,f,r-1/3)}var b=[a*255,s*255,p*255].map(Math.round);return b[3]=c,b}}]),l}(),F=function(){function l(){O(this,l),this._events=[]}return R(l,[{key:"add",value:function(e,t,r){e.addEventListener(t,r,!1),this._events.push({target:e,type:t,handler:r})}},{key:"remove",value:function(e,t,r){this._events=this._events.filter(function(n){var o=!0;return e&&e!==n.target&&(o=!1),t&&t!==n.type&&(o=!1),r&&r!==n.handler&&(o=!1),o&&l._doRemove(n.target,n.type,n.handler),!o})}},{key:"destroy",value:function(){this._events.forEach(function(e){return l._doRemove(e.target,e.type,e.handler)}),this._events=[]}}],[{key:"_doRemove",value:function(e,t,r){e.removeEventListener(t,r,!1)}}]),l}();function U(l){var i=document.createElement("div");return i.innerHTML=l,i.firstElementChild}function T(l,i,e){var t=!1;function r(a,s,p){return Math.max(s,Math.min(a,p))}function n(a,s,p){if(p&&(t=!0),!!t){a.preventDefault();var u=i.getBoundingClientRect(),f=u.width,d=u.height,b=s.clientX,m=s.clientY,h=r(b-u.left,0,f),v=r(m-u.top,0,d);e(h/f,v/d)}}function o(a,s){var p=a.buttons===void 0?a.which:a.buttons;p===1?n(a,a,s):t=!1}function c(a,s){a.touches.length===1?n(a,a.touches[0],s):t=!1}l.add(i,"mousedown",function(a){o(a,!0)}),l.add(i,"touchstart",function(a){c(a,!0)}),l.add(window,"mousemove",o),l.add(i,"touchmove",c),l.add(window,"mouseup",function(a){t=!1}),l.add(i,"touchend",function(a){t=!1}),l.add(i,"touchcancel",function(a){t=!1})}var B=`linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0 / 2em 2em, +import"./chunk-2WH2EVR6.js";var O=function(l,i){if(!(l instanceof i))throw new TypeError("Cannot call a class as a function")},R=function(){function l(i,e){for(var t=0;t1&&arguments[1]!==void 0?arguments[1]:1,e=i>0?l.toFixed(i).replace(/0+$/,"").replace(/\.$/,""):l.toString();return e||"0"}var z=function(){function l(i,e,t,r){O(this,l);var n=this;function o(a){if(a.startsWith("hsl")){var s=a.match(/([\-\d\.e]+)/g).map(Number),p=y(s,4),u=p[0],f=p[1],d=p[2],b=p[3];b===void 0&&(b=1),u/=360,f/=100,d/=100,n.hsla=[u,f,d,b]}else if(a.startsWith("rgb")){var m=a.match(/([\-\d\.e]+)/g).map(Number),h=y(m,4),v=h[0],g=h[1],S=h[2],k=h[3];k===void 0&&(k=1),n.rgba=[v,g,S,k]}else a.startsWith("#")?n.rgba=l.hexToRgb(a):n.rgba=l.nameToRgb(a)||l.hexToRgb(a)}if(i!==void 0)if(Array.isArray(i))this.rgba=i;else if(t===void 0){var c=i&&""+i;c&&o(c.toLowerCase())}else this.rgba=[i,e,t,r===void 0?1:r]}return R(l,[{key:"printRGB",value:function(e){var t=e?this.rgba:this.rgba.slice(0,3),r=t.map(function(n,o){return A(n,o===3?3:0)});return e?"rgba("+r+")":"rgb("+r+")"}},{key:"printHSL",value:function(e){var t=[360,100,100,1],r=["","%","%",""],n=e?this.hsla:this.hsla.slice(0,3),o=n.map(function(c,a){return A(c*t[a],a===3?3:1)+r[a]});return e?"hsla("+o+")":"hsl("+o+")"}},{key:"printHex",value:function(e){var t=this.hex;return e?t:t.substring(0,7)}},{key:"rgba",get:function(){if(this._rgba)return this._rgba;if(!this._hsla)throw new Error("No color is set");return this._rgba=l.hslToRgb(this._hsla)},set:function(e){e.length===3&&(e[3]=1),this._rgba=e,this._hsla=null}},{key:"rgbString",get:function(){return this.printRGB()}},{key:"rgbaString",get:function(){return this.printRGB(!0)}},{key:"hsla",get:function(){if(this._hsla)return this._hsla;if(!this._rgba)throw new Error("No color is set");return this._hsla=l.rgbToHsl(this._rgba)},set:function(e){e.length===3&&(e[3]=1),this._hsla=e,this._rgba=null}},{key:"hslString",get:function(){return this.printHSL()}},{key:"hslaString",get:function(){return this.printHSL(!0)}},{key:"hex",get:function(){var e=this.rgba,t=e.map(function(r,n){return n<3?r.toString(16):Math.round(r*255).toString(16)});return"#"+t.map(function(r){return r.padStart(2,"0")}).join("")},set:function(e){this.rgba=l.hexToRgb(e)}}],[{key:"hexToRgb",value:function(e){var t=(e.startsWith("#")?e.slice(1):e).replace(/^(\w{3})$/,"$1F").replace(/^(\w)(\w)(\w)(\w)$/,"$1$1$2$2$3$3$4$4").replace(/^(\w{6})$/,"$1FF");if(!t.match(/^([0-9a-fA-F]{8})$/))throw new Error("Unknown hex color; "+e);var r=t.match(/^(\w\w)(\w\w)(\w\w)(\w\w)$/).slice(1).map(function(n){return parseInt(n,16)});return r[3]=r[3]/255,r}},{key:"nameToRgb",value:function(e){var t=e.toLowerCase().replace("at","T").replace(/[aeiouyldf]/g,"").replace("ght","L").replace("rk","D").slice(-5,4),r=N[t];return r===void 0?r:l.hexToRgb(r.replace(/\-/g,"00").padStart(6,"f"))}},{key:"rgbToHsl",value:function(e){var t=y(e,4),r=t[0],n=t[1],o=t[2],c=t[3];r/=255,n/=255,o/=255;var a=Math.max(r,n,o),s=Math.min(r,n,o),p=void 0,u=void 0,f=(a+s)/2;if(a===s)p=u=0;else{var d=a-s;switch(u=f>.5?d/(2-a-s):d/(a+s),a){case r:p=(n-o)/d+(n1&&(g-=1),g<.16666666666666666?h+(v-h)*6*g:g<.5?v:g<.6666666666666666?h+(v-h)*(.6666666666666666-g)*6:h},f=o<.5?o*(1+n):o+n-o*n,d=2*o-f;a=u(d,f,r+1/3),s=u(d,f,r),p=u(d,f,r-1/3)}var b=[a*255,s*255,p*255].map(Math.round);return b[3]=c,b}}]),l}(),F=function(){function l(){O(this,l),this._events=[]}return R(l,[{key:"add",value:function(e,t,r){e.addEventListener(t,r,!1),this._events.push({target:e,type:t,handler:r})}},{key:"remove",value:function(e,t,r){this._events=this._events.filter(function(n){var o=!0;return e&&e!==n.target&&(o=!1),t&&t!==n.type&&(o=!1),r&&r!==n.handler&&(o=!1),o&&l._doRemove(n.target,n.type,n.handler),!o})}},{key:"destroy",value:function(){this._events.forEach(function(e){return l._doRemove(e.target,e.type,e.handler)}),this._events=[]}}],[{key:"_doRemove",value:function(e,t,r){e.removeEventListener(t,r,!1)}}]),l}();function U(l){var i=document.createElement("div");return i.innerHTML=l,i.firstElementChild}function T(l,i,e){var t=!1;function r(a,s,p){return Math.max(s,Math.min(a,p))}function n(a,s,p){if(p&&(t=!0),!!t){a.preventDefault();var u=i.getBoundingClientRect(),f=u.width,d=u.height,b=s.clientX,m=s.clientY,h=r(b-u.left,0,f),v=r(m-u.top,0,d);e(h/f,v/d)}}function o(a,s){var p=a.buttons===void 0?a.which:a.buttons;p===1?n(a,a,s):t=!1}function c(a,s){a.touches.length===1?n(a,a.touches[0],s):t=!1}l.add(i,"mousedown",function(a){o(a,!0)}),l.add(i,"touchstart",function(a){c(a,!0)}),l.add(window,"mousemove",o),l.add(i,"touchmove",c),l.add(window,"mouseup",function(a){t=!1}),l.add(i,"touchend",function(a){t=!1}),l.add(i,"touchcancel",function(a){t=!1})}var B=`linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0 / 2em 2em, linear-gradient(45deg, lightgrey 25%, white 25%, white 75%, lightgrey 75%) 1em 1em / 2em 2em`,G=360,P="keydown",x="mousedown",H="focusin";function _(l,i){return(i||document).querySelector(l)}function M(l){l.preventDefault(),l.stopPropagation()}function D(l,i,e,t,r){l.add(i,P,function(n){e.indexOf(n.key)>=0&&(r&&M(n),t(n))})}var W=function(){function l(i){O(this,l),this.settings={popup:"right",layout:"default",alpha:!0,editor:!0,editorFormat:"hex",cancelButton:!1,defaultColor:"#0cf"},this._events=new F,this.onChange=null,this.onDone=null,this.onOpen=null,this.onClose=null,this.setOptions(i)}return R(l,[{key:"setOptions",value:function(e){var t=this;if(!e)return;var r=this.settings;function n(s,p,u){for(var f in s)u&&u.indexOf(f)>=0||(p[f]=s[f])}if(e instanceof HTMLElement)r.parent=e;else{r.parent&&e.parent&&r.parent!==e.parent&&(this._events.remove(r.parent),this._popupInited=!1),n(e,r),e.onChange&&(this.onChange=e.onChange),e.onDone&&(this.onDone=e.onDone),e.onOpen&&(this.onOpen=e.onOpen),e.onClose&&(this.onClose=e.onClose);var o=e.color||e.colour;o&&this._setColor(o)}var c=r.parent;if(c&&r.popup&&!this._popupInited){var a=function(p){return t.openHandler(p)};this._events.add(c,"click",a),D(this._events,c,[" ","Spacebar","Enter"],a),this._popupInited=!0}else e.parent&&!r.popup&&this.show()}},{key:"openHandler",value:function(e){if(this.show()){e&&e.preventDefault(),this.settings.parent.style.pointerEvents="none";var t=e&&e.type===P?this._domEdit:this.domElement;setTimeout(function(){return t.focus()},100),this.onOpen&&this.onOpen(this.colour)}}},{key:"closeHandler",value:function(e){var t=e&&e.type,r=!1;if(!e)r=!0;else if(t===x||t===H){var n=(this.__containedEvent||0)+100;e.timeStamp>n&&(r=!0)}else M(e),r=!0;r&&this.hide()&&(this.settings.parent.style.pointerEvents="",t!==x&&this.settings.parent.focus(),this.onClose&&this.onClose(this.colour))}},{key:"movePopup",value:function(e,t){this.closeHandler(),this.setOptions(e),t&&this.openHandler()}},{key:"setColor",value:function(e,t){this._setColor(e,{silent:t})}},{key:"_setColor",value:function(e,t){if(typeof e=="string"&&(e=e.trim()),!!e){t=t||{};var r=void 0;try{r=new z(e)}catch(o){if(t.failSilently)return;throw o}if(!this.settings.alpha){var n=r.hsla;n[3]=1,r.hsla=n}this.colour=this.color=r,this._setHSLA(null,null,null,null,t)}}},{key:"setColour",value:function(e,t){this.setColor(e,t)}},{key:"show",value:function(){var e=this.settings.parent;if(!e)return!1;if(this.domElement){var t=this._toggleDOM(!0);return this._setPosition(),t}var r=this.settings.template||'
',n=U(r);return this.domElement=n,this._domH=_(".picker_hue",n),this._domSL=_(".picker_sl",n),this._domA=_(".picker_alpha",n),this._domEdit=_(".picker_editor input",n),this._domSample=_(".picker_sample",n),this._domOkay=_(".picker_done button",n),this._domCancel=_(".picker_cancel button",n),n.classList.add("layout_"+this.settings.layout),this.settings.alpha||n.classList.add("no_alpha"),this.settings.editor||n.classList.add("no_editor"),this.settings.cancelButton||n.classList.add("no_cancel"),this._ifPopup(function(){return n.classList.add("popup")}),this._setPosition(),this.colour?this._updateUI():this._setColor(this.settings.defaultColor),this._bindEvents(),!0}},{key:"hide",value:function(){return this._toggleDOM(!1)}},{key:"destroy",value:function(){this._events.destroy(),this.domElement&&this.settings.parent.removeChild(this.domElement)}},{key:"_bindEvents",value:function(){var e=this,t=this,r=this.domElement,n=this._events;function o(s,p,u){n.add(s,p,u)}o(r,"click",function(s){return s.preventDefault()}),T(n,this._domH,function(s,p){return t._setHSLA(s)}),T(n,this._domSL,function(s,p){return t._setHSLA(null,s,1-p)}),this.settings.alpha&&T(n,this._domA,function(s,p){return t._setHSLA(null,null,null,1-p)});var c=this._domEdit;o(c,"input",function(s){t._setColor(this.value,{fromEditor:!0,failSilently:!0})}),o(c,"focus",function(s){var p=this;p.selectionStart===p.selectionEnd&&p.select()}),this._ifPopup(function(){var s=function(f){return e.closeHandler(f)};o(window,x,s),o(window,H,s),D(n,r,["Esc","Escape"],s);var p=function(f){e.__containedEvent=f.timeStamp};o(r,x,p),o(r,H,p),o(e._domCancel,"click",s)});var a=function(p){e._ifPopup(function(){return e.closeHandler(p)}),e.onDone&&e.onDone(e.colour)};o(this._domOkay,"click",a),D(n,r,["Enter"],a)}},{key:"_setPosition",value:function(){var e=this.settings.parent,t=this.domElement;e!==t.parentNode&&e.appendChild(t),this._ifPopup(function(r){getComputedStyle(e).position==="static"&&(e.style.position="relative");var n=r===!0?"popup_right":"popup_"+r;["popup_top","popup_bottom","popup_left","popup_right"].forEach(function(o){o===n?t.classList.add(o):t.classList.remove(o)}),t.classList.add(n)})}},{key:"_setHSLA",value:function(e,t,r,n,o){o=o||{};var c=this.colour,a=c.hsla;[e,t,r,n].forEach(function(s,p){(s||s===0)&&(a[p]=s)}),c.hsla=a,this._updateUI(o),this.onChange&&!o.silent&&this.onChange(c)}},{key:"_updateUI",value:function(e){if(!this.domElement)return;e=e||{};var t=this.colour,r=t.hsla,n="hsl("+r[0]*G+", 100%, 50%)",o=t.hslString,c=t.hslaString,a=this._domH,s=this._domSL,p=this._domA,u=_(".picker_selector",a),f=_(".picker_selector",s),d=_(".picker_selector",p);function b(I,C,L){C.style.left=L*100+"%"}function m(I,C,L){C.style.top=L*100+"%"}b(a,u,r[0]),this._domSL.style.backgroundColor=this._domH.style.color=n,b(s,f,r[1]),m(s,f,1-r[2]),s.style.color=o,m(p,d,1-r[3]);var h=o,v=h.replace("hsl","hsla").replace(")",", 0)"),g="linear-gradient("+[h,v]+")";if(this._domA.style.background=g+", "+B,!e.fromEditor){var S=this.settings.editorFormat,k=this.settings.alpha,w=void 0;switch(S){case"rgb":w=t.printRGB(k);break;case"hsl":w=t.printHSL(k);break;default:w=t.printHex(k)}this._domEdit.value=w}this._domSample.style.color=c}},{key:"_ifPopup",value:function(e,t){this.settings.parent&&this.settings.popup?e&&e(this.settings.popup):t&&t()}},{key:"_toggleDOM",value:function(e){var t=this.domElement;if(!t)return!1;var r=e?"":"none",n=t.style.display!==r;return n&&(t.style.display=r),n}}]),l}();E=document.createElement("style"),E.textContent='.picker_wrapper.no_alpha .picker_alpha{display:none}.picker_wrapper.no_editor .picker_editor{position:absolute;z-index:-1;opacity:0}.picker_wrapper.no_cancel .picker_cancel{display:none}.layout_default.picker_wrapper{display:flex;flex-flow:row wrap;justify-content:space-between;align-items:stretch;font-size:10px;width:25em;padding:.5em}.layout_default.picker_wrapper input,.layout_default.picker_wrapper button{font-size:1rem}.layout_default.picker_wrapper>*{margin:.5em}.layout_default.picker_wrapper::before{content:"";display:block;width:100%;height:0;order:1}.layout_default .picker_slider,.layout_default .picker_selector{padding:1em}.layout_default .picker_hue{width:100%}.layout_default .picker_sl{flex:1 1 auto}.layout_default .picker_sl::before{content:"";display:block;padding-bottom:100%}.layout_default .picker_editor{order:1;width:6.5rem}.layout_default .picker_editor input{width:100%;height:100%}.layout_default .picker_sample{order:1;flex:1 1 auto}.layout_default .picker_done,.layout_default .picker_cancel{order:1}.picker_wrapper{box-sizing:border-box;background:#f2f2f2;box-shadow:0 0 0 1px silver;cursor:default;font-family:sans-serif;color:#444;pointer-events:auto}.picker_wrapper:focus{outline:none}.picker_wrapper button,.picker_wrapper input{box-sizing:border-box;border:none;box-shadow:0 0 0 1px silver;outline:none}.picker_wrapper button:focus,.picker_wrapper button:active,.picker_wrapper input:focus,.picker_wrapper input:active{box-shadow:0 0 2px 1px #1e90ff}.picker_wrapper button{padding:.4em .6em;cursor:pointer;background-color:#f5f5f5;background-image:linear-gradient(0deg, gainsboro, transparent)}.picker_wrapper button:active{background-image:linear-gradient(0deg, transparent, gainsboro)}.picker_wrapper button:hover{background-color:#fff}.picker_selector{position:absolute;z-index:1;display:block;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);border:2px solid #fff;border-radius:100%;box-shadow:0 0 3px 1px #67b9ff;background:currentColor;cursor:pointer}.picker_slider .picker_selector{border-radius:2px}.picker_hue{position:relative;background-image:linear-gradient(90deg, red, yellow, lime, cyan, blue, magenta, red);box-shadow:0 0 0 1px silver}.picker_sl{position:relative;box-shadow:0 0 0 1px silver;background-image:linear-gradient(180deg, white, rgba(255, 255, 255, 0) 50%),linear-gradient(0deg, black, rgba(0, 0, 0, 0) 50%),linear-gradient(90deg, #808080, rgba(128, 128, 128, 0))}.picker_alpha,.picker_sample{position:relative;background:linear-gradient(45deg, lightgrey 25%, transparent 25%, transparent 75%, lightgrey 75%) 0 0/2em 2em,linear-gradient(45deg, lightgrey 25%, white 25%, white 75%, lightgrey 75%) 1em 1em/2em 2em;box-shadow:0 0 0 1px silver}.picker_alpha .picker_selector,.picker_sample .picker_selector{background:none}.picker_editor input{font-family:monospace;padding:.2em .4em}.picker_sample::before{content:"";position:absolute;display:block;width:100%;height:100%;background:currentColor}.picker_arrow{position:absolute;z-index:-1}.picker_wrapper.popup{position:absolute;z-index:2;margin:1.5em}.picker_wrapper.popup,.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{background:#f2f2f2;box-shadow:0 0 10px 1px rgba(0,0,0,.4)}.picker_wrapper.popup .picker_arrow{width:3em;height:3em;margin:0}.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{content:"";display:block;position:absolute;top:0;left:0;z-index:-99}.picker_wrapper.popup .picker_arrow::before{width:100%;height:100%;-webkit-transform:skew(45deg);transform:skew(45deg);-webkit-transform-origin:0 100%;transform-origin:0 100%}.picker_wrapper.popup .picker_arrow::after{width:150%;height:150%;box-shadow:none}.popup.popup_top{bottom:100%;left:0}.popup.popup_top .picker_arrow{bottom:0;left:0;-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.popup.popup_bottom{top:100%;left:0}.popup.popup_bottom .picker_arrow{top:0;left:0;-webkit-transform:rotate(90deg) scale(1, -1);transform:rotate(90deg) scale(1, -1)}.popup.popup_left{top:0;right:100%}.popup.popup_left .picker_arrow{top:0;right:0;-webkit-transform:scale(-1, 1);transform:scale(-1, 1)}.popup.popup_right{top:0;left:100%}.popup.popup_right .picker_arrow{top:0;left:0}',document.documentElement.firstElementChild.appendChild(E),W.StyleElement=E;var E;export{W as default}; diff --git a/src/google/adk/cli/browser/index.html b/src/google/adk/cli/browser/index.html index 2db84f6397..9560e93a0e 100644 --- a/src/google/adk/cli/browser/index.html +++ b/src/google/adk/cli/browser/index.html @@ -23,12 +23,12 @@ - - - - - + + + + + - + diff --git a/src/google/adk/cli/browser/main-OS2OH2S3.js b/src/google/adk/cli/browser/main-OS2OH2S3.js new file mode 100644 index 0000000000..c68ffdc892 --- /dev/null +++ b/src/google/adk/cli/browser/main-OS2OH2S3.js @@ -0,0 +1,4093 @@ +import{a as ae,b as _A,c as wk,d as XA,e as JQ,f as Ci,g as cA}from"./chunk-2WH2EVR6.js";var ote=XA(jF=>{"use strict";var nte={b:"\b",f:"\f",n:` +`,r:"\r",t:" ",'"':'"',"/":"/","\\":"\\"},lSe=97;jF.parse=function(t,A,e){var i={},n=0,o=0,r=0,s=e&&e.bigint&&typeof BigInt<"u";return{data:a("",!0),pointers:i};function a(O,H){c();var V;k(O,"value");var Z=h();switch(Z){case"t":u("rue"),V=!0;break;case"f":u("alse"),V=!1;break;case"n":u("ull"),V=null;break;case'"':V=l();break;case"[":V=C(O);break;case"{":V=I(O);break;default:B(),"-0123456789".indexOf(Z)>=0?V=d():_()}return k(O,"valueEnd"),c(),H&&rNumber.MAX_SAFE_INTEGER||V="a"&&V<="f"?H+=V.charCodeAt()-lSe+10:V>="0"&&V<="9"?H+=+V:K()}return String.fromCharCode(H)}function b(){for(var O="";t[r]>="0"&&t[r]<="9";)O+=h();if(O.length)return O;J(),_()}function k(O,H){S(O,H,w())}function S(O,H,V){i[O]=i[O]||{},i[O][H]=V}function w(){return{line:n,column:o,pos:r}}function _(){throw new SyntaxError("Unexpected token "+t[r]+" in JSON at position "+r)}function K(){B(),_()}function J(){if(r>=t.length)throw new SyntaxError("Unexpected end of JSON input")}};jF.stringify=function(t,A,e){if(!kD(t))return;var i=0,n,o,r=typeof e=="object"?e.space:e;switch(typeof r){case"number":var s=r>10?10:r<0?0:Math.floor(r);r=s&&S(s," "),n=s,o=s;break;case"string":r=r.slice(0,10),n=0,o=0;for(var a=0;a=0}var dSe=/"|\\/g,CSe=/[\b]/g,ISe=/\f/g,uSe=/\n/g,hSe=/\r/g,BSe=/\t/g;function xD(t){return t=t.replace(dSe,"\\$&").replace(ISe,"\\f").replace(CSe,"\\b").replace(uSe,"\\n").replace(hSe,"\\r").replace(BSe,"\\t"),'"'+t+'"'}var ESe=/~/g,fSe=/\//g;function PF(t){return t.replace(ESe,"~0").replace(fSe,"~1")}});var Doe=XA((zKA,yoe)=>{"use strict";var woe=function(t,A){var e,i,n=1,o=0,r=0,s=String.alphabet;function a(c,l,d){if(d){for(e=l;d=a(c,e),d<76&&d>65;)++e;return+c.slice(l-1,e)}return d=s&&s.indexOf(c.charAt(l)),d>-1?d+76:(d=c.charCodeAt(l)||0,d<45||d>127?d:d<46?65:d<48?d-1:d<58?d+18:d<65?d-11:d<91?d+11:d<97?d-37:d<123?d+5:d-63)}if((t+="")!=(A+="")){for(;n;)if(i=a(t,o++),n=a(A,r++),i<76&&n<76&&i>66&&n>66&&(i=a(t,o,o),n=a(A,r,o=e),r=e),i!=n)return i{"use strict";Object.defineProperty($n,"__esModule",{value:!0});$n.regexpCode=$n.getEsmExportName=$n.getProperty=$n.safeStringify=$n.stringify=$n.strConcat=$n.addCodeArg=$n.str=$n._=$n.nil=$n._Code=$n.Name=$n.IDENTIFIER=$n._CodeOrName=void 0;var s3=class{};$n._CodeOrName=s3;$n.IDENTIFIER=/^[a-z$_][a-z$_0-9]*$/i;var Du=class extends s3{constructor(A){if(super(),!$n.IDENTIFIER.test(A))throw new Error("CodeGen: name must be a valid identifier");this.str=A}toString(){return this.str}emptyStr(){return!1}get names(){return{[this.str]:1}}};$n.Name=Du;var Zl=class extends s3{constructor(A){super(),this._items=typeof A=="string"?[A]:A}toString(){return this.str}emptyStr(){if(this._items.length>1)return!1;let A=this._items[0];return A===""||A==='""'}get str(){var A;return(A=this._str)!==null&&A!==void 0?A:this._str=this._items.reduce((e,i)=>`${e}${i}`,"")}get names(){var A;return(A=this._names)!==null&&A!==void 0?A:this._names=this._items.reduce((e,i)=>(i instanceof Du&&(e[i.str]=(e[i.str]||0)+1),e),{})}};$n._Code=Zl;$n.nil=new Zl("");function boe(t,...A){let e=[t[0]],i=0;for(;i{"use strict";Object.defineProperty(_c,"__esModule",{value:!0});_c.ValueScope=_c.ValueScopeName=_c.Scope=_c.varKinds=_c.UsedValueState=void 0;var xc=c3(),_G=class extends Error{constructor(A){super(`CodeGen: "code" for ${A} not defined`),this.value=A.value}},Ev=function(t){return t[t.Started=0]="Started",t[t.Completed=1]="Completed",t}(Ev||(_c.UsedValueState=Ev={}));_c.varKinds={const:new xc.Name("const"),let:new xc.Name("let"),var:new xc.Name("var")};var fv=class{constructor({prefixes:A,parent:e}={}){this._names={},this._prefixes=A,this._parent=e}toName(A){return A instanceof xc.Name?A:this.name(A)}name(A){return new xc.Name(this._newName(A))}_newName(A){let e=this._names[A]||this._nameGroup(A);return`${A}${e.index++}`}_nameGroup(A){var e,i;if(!((i=(e=this._parent)===null||e===void 0?void 0:e._prefixes)===null||i===void 0)&&i.has(A)||this._prefixes&&!this._prefixes.has(A))throw new Error(`CodeGen: prefix "${A}" is not allowed in this scope`);return this._names[A]={prefix:A,index:0}}};_c.Scope=fv;var Qv=class extends xc.Name{constructor(A,e){super(e),this.prefix=A}setValue(A,{property:e,itemIndex:i}){this.value=A,this.scopePath=(0,xc._)`.${new xc.Name(e)}[${i}]`}};_c.ValueScopeName=Qv;var BGe=(0,xc._)`\n`,RG=class extends fv{constructor(A){super(A),this._values={},this._scope=A.scope,this.opts=_A(ae({},A),{_n:A.lines?BGe:xc.nil})}get(){return this._scope}name(A){return new Qv(A,this._newName(A))}value(A,e){var i;if(e.ref===void 0)throw new Error("CodeGen: ref must be passed in value");let n=this.toName(A),{prefix:o}=n,r=(i=e.key)!==null&&i!==void 0?i:e.ref,s=this._values[o];if(s){let l=s.get(r);if(l)return l}else s=this._values[o]=new Map;s.set(r,n);let a=this._scope[o]||(this._scope[o]=[]),c=a.length;return a[c]=e.ref,n.setValue(e,{property:o,itemIndex:c}),n}getValue(A,e){let i=this._values[A];if(i)return i.get(e)}scopeRefs(A,e=this._values){return this._reduceValues(e,i=>{if(i.scopePath===void 0)throw new Error(`CodeGen: name "${i}" has no value`);return(0,xc._)`${A}${i.scopePath}`})}scopeCode(A=this._values,e,i){return this._reduceValues(A,n=>{if(n.value===void 0)throw new Error(`CodeGen: name "${n}" has no value`);return n.value.code},e,i)}_reduceValues(A,e,i={},n){let o=xc.nil;for(let r in A){let s=A[r];if(!s)continue;let a=i[r]=i[r]||new Map;s.forEach(c=>{if(a.has(c))return;a.set(c,Ev.Started);let l=e(c);if(l){let d=this.opts.es5?_c.varKinds.var:_c.varKinds.const;o=(0,xc._)`${o}${d} ${c} = ${l};${this.opts._n}`}else if(l=n?.(c))o=(0,xc._)`${o}${l}${this.opts._n}`;else throw new _G(c);a.set(c,Ev.Completed)})}return o}};_c.ValueScope=RG});var hn=XA(gn=>{"use strict";Object.defineProperty(gn,"__esModule",{value:!0});gn.or=gn.and=gn.not=gn.CodeGen=gn.operators=gn.varKinds=gn.ValueScopeName=gn.ValueScope=gn.Scope=gn.Name=gn.regexpCode=gn.stringify=gn.getProperty=gn.nil=gn.strConcat=gn.str=gn._=void 0;var _n=c3(),Ug=NG(),BC=c3();Object.defineProperty(gn,"_",{enumerable:!0,get:function(){return BC._}});Object.defineProperty(gn,"str",{enumerable:!0,get:function(){return BC.str}});Object.defineProperty(gn,"strConcat",{enumerable:!0,get:function(){return BC.strConcat}});Object.defineProperty(gn,"nil",{enumerable:!0,get:function(){return BC.nil}});Object.defineProperty(gn,"getProperty",{enumerable:!0,get:function(){return BC.getProperty}});Object.defineProperty(gn,"stringify",{enumerable:!0,get:function(){return BC.stringify}});Object.defineProperty(gn,"regexpCode",{enumerable:!0,get:function(){return BC.regexpCode}});Object.defineProperty(gn,"Name",{enumerable:!0,get:function(){return BC.Name}});var Dv=NG();Object.defineProperty(gn,"Scope",{enumerable:!0,get:function(){return Dv.Scope}});Object.defineProperty(gn,"ValueScope",{enumerable:!0,get:function(){return Dv.ValueScope}});Object.defineProperty(gn,"ValueScopeName",{enumerable:!0,get:function(){return Dv.ValueScopeName}});Object.defineProperty(gn,"varKinds",{enumerable:!0,get:function(){return Dv.varKinds}});gn.operators={GT:new _n._Code(">"),GTE:new _n._Code(">="),LT:new _n._Code("<"),LTE:new _n._Code("<="),EQ:new _n._Code("==="),NEQ:new _n._Code("!=="),NOT:new _n._Code("!"),OR:new _n._Code("||"),AND:new _n._Code("&&"),ADD:new _n._Code("+")};var S2=class{optimizeNodes(){return this}optimizeNames(A,e){return this}},LG=class extends S2{constructor(A,e,i){super(),this.varKind=A,this.name=e,this.rhs=i}render({es5:A,_n:e}){let i=A?Ug.varKinds.var:this.varKind,n=this.rhs===void 0?"":` = ${this.rhs}`;return`${i} ${this.name}${n};`+e}optimizeNames(A,e){if(A[this.name.str])return this.rhs&&(this.rhs=JE(this.rhs,A,e)),this}get names(){return this.rhs instanceof _n._CodeOrName?this.rhs.names:{}}},pv=class extends S2{constructor(A,e,i){super(),this.lhs=A,this.rhs=e,this.sideEffects=i}render({_n:A}){return`${this.lhs} = ${this.rhs};`+A}optimizeNames(A,e){if(!(this.lhs instanceof _n.Name&&!A[this.lhs.str]&&!this.sideEffects))return this.rhs=JE(this.rhs,A,e),this}get names(){let A=this.lhs instanceof _n.Name?{}:ae({},this.lhs.names);return yv(A,this.rhs)}},FG=class extends pv{constructor(A,e,i,n){super(A,i,n),this.op=e}render({_n:A}){return`${this.lhs} ${this.op}= ${this.rhs};`+A}},GG=class extends S2{constructor(A){super(),this.label=A,this.names={}}render({_n:A}){return`${this.label}:`+A}},KG=class extends S2{constructor(A){super(),this.label=A,this.names={}}render({_n:A}){return`break${this.label?` ${this.label}`:""};`+A}},UG=class extends S2{constructor(A){super(),this.error=A}render({_n:A}){return`throw ${this.error};`+A}get names(){return this.error.names}},TG=class extends S2{constructor(A){super(),this.code=A}render({_n:A}){return`${this.code};`+A}optimizeNodes(){return`${this.code}`?this:void 0}optimizeNames(A,e){return this.code=JE(this.code,A,e),this}get names(){return this.code instanceof _n._CodeOrName?this.code.names:{}}},l3=class extends S2{constructor(A=[]){super(),this.nodes=A}render(A){return this.nodes.reduce((e,i)=>e+i.render(A),"")}optimizeNodes(){let{nodes:A}=this,e=A.length;for(;e--;){let i=A[e].optimizeNodes();Array.isArray(i)?A.splice(e,1,...i):i?A[e]=i:A.splice(e,1)}return A.length>0?this:void 0}optimizeNames(A,e){let{nodes:i}=this,n=i.length;for(;n--;){let o=i[n];o.optimizeNames(A,e)||(EGe(A,o.names),i.splice(n,1))}return i.length>0?this:void 0}get names(){return this.nodes.reduce((A,e)=>vu(A,e.names),{})}},k2=class extends l3{render(A){return"{"+A._n+super.render(A)+"}"+A._n}},OG=class extends l3{},JG=(()=>{class t extends k2{}return t.kind="else",t})(),mv=(()=>{class t extends k2{constructor(e,i){super(i),this.condition=e}render(e){let i=`if(${this.condition})`+super.render(e);return this.else&&(i+="else "+this.else.render(e)),i}optimizeNodes(){super.optimizeNodes();let e=this.condition;if(e===!0)return this.nodes;let i=this.else;if(i){let n=i.optimizeNodes();i=this.else=Array.isArray(n)?new JG(n):n}if(i)return e===!1?i instanceof t?i:i.nodes:this.nodes.length?this:new t(Roe(e),i instanceof t?[i]:i.nodes);if(!(e===!1||!this.nodes.length))return this}optimizeNames(e,i){var n;if(this.else=(n=this.else)===null||n===void 0?void 0:n.optimizeNames(e,i),!!(super.optimizeNames(e,i)||this.else))return this.condition=JE(this.condition,e,i),this}get names(){let e=super.names;return yv(e,this.condition),this.else&&vu(e,this.else.names),e}}return t.kind="if",t})(),vv=(()=>{class t extends k2{}return t.kind="for",t})(),YG=class extends vv{constructor(A){super(),this.iteration=A}render(A){return`for(${this.iteration})`+super.render(A)}optimizeNames(A,e){if(super.optimizeNames(A,e))return this.iteration=JE(this.iteration,A,e),this}get names(){return vu(super.names,this.iteration.names)}},HG=class extends vv{constructor(A,e,i,n){super(),this.varKind=A,this.name=e,this.from=i,this.to=n}render(A){let e=A.es5?Ug.varKinds.var:this.varKind,{name:i,from:n,to:o}=this;return`for(${e} ${i}=${n}; ${i}<${o}; ${i}++)`+super.render(A)}get names(){let A=yv(super.names,this.from);return yv(A,this.to)}},wv=class extends vv{constructor(A,e,i,n){super(),this.loop=A,this.varKind=e,this.name=i,this.iterable=n}render(A){return`for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})`+super.render(A)}optimizeNames(A,e){if(super.optimizeNames(A,e))return this.iterable=JE(this.iterable,A,e),this}get names(){return vu(super.names,this.iterable.names)}},Soe=(()=>{class t extends k2{constructor(e,i,n){super(),this.name=e,this.args=i,this.async=n}render(e){return`${this.async?"async ":""}function ${this.name}(${this.args})`+super.render(e)}}return t.kind="func",t})(),koe=(()=>{class t extends l3{render(e){return"return "+super.render(e)}}return t.kind="return",t})(),zG=class extends k2{render(A){let e="try"+super.render(A);return this.catch&&(e+=this.catch.render(A)),this.finally&&(e+=this.finally.render(A)),e}optimizeNodes(){var A,e;return super.optimizeNodes(),(A=this.catch)===null||A===void 0||A.optimizeNodes(),(e=this.finally)===null||e===void 0||e.optimizeNodes(),this}optimizeNames(A,e){var i,n;return super.optimizeNames(A,e),(i=this.catch)===null||i===void 0||i.optimizeNames(A,e),(n=this.finally)===null||n===void 0||n.optimizeNames(A,e),this}get names(){let A=super.names;return this.catch&&vu(A,this.catch.names),this.finally&&vu(A,this.finally.names),A}},xoe=(()=>{class t extends k2{constructor(e){super(),this.error=e}render(e){return`catch(${this.error})`+super.render(e)}}return t.kind="catch",t})(),_oe=(()=>{class t extends k2{render(e){return"finally"+super.render(e)}}return t.kind="finally",t})(),PG=class{constructor(A,e={}){this._values={},this._blockStarts=[],this._constants={},this.opts=_A(ae({},e),{_n:e.lines?` +`:""}),this._extScope=A,this._scope=new Ug.Scope({parent:A}),this._nodes=[new OG]}toString(){return this._root.render(this.opts)}name(A){return this._scope.name(A)}scopeName(A){return this._extScope.name(A)}scopeValue(A,e){let i=this._extScope.value(A,e);return(this._values[i.prefix]||(this._values[i.prefix]=new Set)).add(i),i}getScopeValue(A,e){return this._extScope.getValue(A,e)}scopeRefs(A){return this._extScope.scopeRefs(A,this._values)}scopeCode(){return this._extScope.scopeCode(this._values)}_def(A,e,i,n){let o=this._scope.toName(e);return i!==void 0&&n&&(this._constants[o.str]=i),this._leafNode(new LG(A,o,i)),o}const(A,e,i){return this._def(Ug.varKinds.const,A,e,i)}let(A,e,i){return this._def(Ug.varKinds.let,A,e,i)}var(A,e,i){return this._def(Ug.varKinds.var,A,e,i)}assign(A,e,i){return this._leafNode(new pv(A,e,i))}add(A,e){return this._leafNode(new FG(A,gn.operators.ADD,e))}code(A){return typeof A=="function"?A():A!==_n.nil&&this._leafNode(new TG(A)),this}object(...A){let e=["{"];for(let[i,n]of A)e.length>1&&e.push(","),e.push(i),(i!==n||this.opts.es5)&&(e.push(":"),(0,_n.addCodeArg)(e,n));return e.push("}"),new _n._Code(e)}if(A,e,i){if(this._blockNode(new mv(A)),e&&i)this.code(e).else().code(i).endIf();else if(e)this.code(e).endIf();else if(i)throw new Error('CodeGen: "else" body without "then" body');return this}elseIf(A){return this._elseNode(new mv(A))}else(){return this._elseNode(new JG)}endIf(){return this._endBlockNode(mv,JG)}_for(A,e){return this._blockNode(A),e&&this.code(e).endFor(),this}for(A,e){return this._for(new YG(A),e)}forRange(A,e,i,n,o=this.opts.es5?Ug.varKinds.var:Ug.varKinds.let){let r=this._scope.toName(A);return this._for(new HG(o,r,e,i),()=>n(r))}forOf(A,e,i,n=Ug.varKinds.const){let o=this._scope.toName(A);if(this.opts.es5){let r=e instanceof _n.Name?e:this.var("_arr",e);return this.forRange("_i",0,(0,_n._)`${r}.length`,s=>{this.var(o,(0,_n._)`${r}[${s}]`),i(o)})}return this._for(new wv("of",n,o,e),()=>i(o))}forIn(A,e,i,n=this.opts.es5?Ug.varKinds.var:Ug.varKinds.const){if(this.opts.ownProperties)return this.forOf(A,(0,_n._)`Object.keys(${e})`,i);let o=this._scope.toName(A);return this._for(new wv("in",n,o,e),()=>i(o))}endFor(){return this._endBlockNode(vv)}label(A){return this._leafNode(new GG(A))}break(A){return this._leafNode(new KG(A))}return(A){let e=new koe;if(this._blockNode(e),this.code(A),e.nodes.length!==1)throw new Error('CodeGen: "return" should have one node');return this._endBlockNode(koe)}try(A,e,i){if(!e&&!i)throw new Error('CodeGen: "try" without "catch" and "finally"');let n=new zG;if(this._blockNode(n),this.code(A),e){let o=this.name("e");this._currNode=n.catch=new xoe(o),e(o)}return i&&(this._currNode=n.finally=new _oe,this.code(i)),this._endBlockNode(xoe,_oe)}throw(A){return this._leafNode(new UG(A))}block(A,e){return this._blockStarts.push(this._nodes.length),A&&this.code(A).endBlock(e),this}endBlock(A){let e=this._blockStarts.pop();if(e===void 0)throw new Error("CodeGen: not in self-balancing block");let i=this._nodes.length-e;if(i<0||A!==void 0&&i!==A)throw new Error(`CodeGen: wrong number of nodes: ${i} vs ${A} expected`);return this._nodes.length=e,this}func(A,e=_n.nil,i,n){return this._blockNode(new Soe(A,e,i)),n&&this.code(n).endFunc(),this}endFunc(){return this._endBlockNode(Soe)}optimize(A=1){for(;A-- >0;)this._root.optimizeNodes(),this._root.optimizeNames(this._root.names,this._constants)}_leafNode(A){return this._currNode.nodes.push(A),this}_blockNode(A){this._currNode.nodes.push(A),this._nodes.push(A)}_endBlockNode(A,e){let i=this._currNode;if(i instanceof A||e&&i instanceof e)return this._nodes.pop(),this;throw new Error(`CodeGen: not in block "${e?`${A.kind}/${e.kind}`:A.kind}"`)}_elseNode(A){let e=this._currNode;if(!(e instanceof mv))throw new Error('CodeGen: "else" without "if"');return this._currNode=e.else=A,this}get _root(){return this._nodes[0]}get _currNode(){let A=this._nodes;return A[A.length-1]}set _currNode(A){let e=this._nodes;e[e.length-1]=A}};gn.CodeGen=PG;function vu(t,A){for(let e in A)t[e]=(t[e]||0)+(A[e]||0);return t}function yv(t,A){return A instanceof _n._CodeOrName?vu(t,A.names):t}function JE(t,A,e){if(t instanceof _n.Name)return i(t);if(!n(t))return t;return new _n._Code(t._items.reduce((o,r)=>(r instanceof _n.Name&&(r=i(r)),r instanceof _n._Code?o.push(...r._items):o.push(r),o),[]));function i(o){let r=e[o.str];return r===void 0||A[o.str]!==1?o:(delete A[o.str],r)}function n(o){return o instanceof _n._Code&&o._items.some(r=>r instanceof _n.Name&&A[r.str]===1&&e[r.str]!==void 0)}}function EGe(t,A){for(let e in A)t[e]=(t[e]||0)-(A[e]||0)}function Roe(t){return typeof t=="boolean"||typeof t=="number"||t===null?!t:(0,_n._)`!${jG(t)}`}gn.not=Roe;var fGe=Noe(gn.operators.AND);function QGe(...t){return t.reduce(fGe)}gn.and=QGe;var mGe=Noe(gn.operators.OR);function pGe(...t){return t.reduce(mGe)}gn.or=pGe;function Noe(t){return(A,e)=>A===_n.nil?e:e===_n.nil?A:(0,_n._)`${jG(A)} ${t} ${jG(e)}`}function jG(t){return t instanceof _n.Name?t:(0,_n._)`(${t})`}});var eo=XA(Bn=>{"use strict";Object.defineProperty(Bn,"__esModule",{value:!0});Bn.checkStrictMode=Bn.getErrorPath=Bn.Type=Bn.useFunc=Bn.setEvaluated=Bn.evaluatedPropsToName=Bn.mergeEvaluated=Bn.eachItem=Bn.unescapeJsonPointer=Bn.escapeJsonPointer=Bn.escapeFragment=Bn.unescapeFragment=Bn.schemaRefOrVal=Bn.schemaHasRulesButRef=Bn.schemaHasRules=Bn.checkUnknownRules=Bn.alwaysValidSchema=Bn.toHash=void 0;var Zo=hn(),wGe=c3();function yGe(t){let A={};for(let e of t)A[e]=!0;return A}Bn.toHash=yGe;function DGe(t,A){return typeof A=="boolean"?A:Object.keys(A).length===0?!0:(Goe(t,A),!Koe(A,t.self.RULES.all))}Bn.alwaysValidSchema=DGe;function Goe(t,A=t.schema){let{opts:e,self:i}=t;if(!e.strictSchema||typeof A=="boolean")return;let n=i.RULES.keywords;for(let o in A)n[o]||Ooe(t,`unknown keyword: "${o}"`)}Bn.checkUnknownRules=Goe;function Koe(t,A){if(typeof t=="boolean")return!t;for(let e in t)if(A[e])return!0;return!1}Bn.schemaHasRules=Koe;function vGe(t,A){if(typeof t=="boolean")return!t;for(let e in t)if(e!=="$ref"&&A.all[e])return!0;return!1}Bn.schemaHasRulesButRef=vGe;function bGe({topSchemaRef:t,schemaPath:A},e,i,n){if(!n){if(typeof e=="number"||typeof e=="boolean")return e;if(typeof e=="string")return(0,Zo._)`${e}`}return(0,Zo._)`${t}${A}${(0,Zo.getProperty)(i)}`}Bn.schemaRefOrVal=bGe;function MGe(t){return Uoe(decodeURIComponent(t))}Bn.unescapeFragment=MGe;function SGe(t){return encodeURIComponent(qG(t))}Bn.escapeFragment=SGe;function qG(t){return typeof t=="number"?`${t}`:t.replace(/~/g,"~0").replace(/\//g,"~1")}Bn.escapeJsonPointer=qG;function Uoe(t){return t.replace(/~1/g,"/").replace(/~0/g,"~")}Bn.unescapeJsonPointer=Uoe;function kGe(t,A){if(Array.isArray(t))for(let e of t)A(e);else A(t)}Bn.eachItem=kGe;function Loe({mergeNames:t,mergeToName:A,mergeValues:e,resultToName:i}){return(n,o,r,s)=>{let a=r===void 0?o:r instanceof Zo.Name?(o instanceof Zo.Name?t(n,o,r):A(n,o,r),r):o instanceof Zo.Name?(A(n,r,o),o):e(o,r);return s===Zo.Name&&!(a instanceof Zo.Name)?i(n,a):a}}Bn.mergeEvaluated={props:Loe({mergeNames:(t,A,e)=>t.if((0,Zo._)`${e} !== true && ${A} !== undefined`,()=>{t.if((0,Zo._)`${A} === true`,()=>t.assign(e,!0),()=>t.assign(e,(0,Zo._)`${e} || {}`).code((0,Zo._)`Object.assign(${e}, ${A})`))}),mergeToName:(t,A,e)=>t.if((0,Zo._)`${e} !== true`,()=>{A===!0?t.assign(e,!0):(t.assign(e,(0,Zo._)`${e} || {}`),WG(t,e,A))}),mergeValues:(t,A)=>t===!0?!0:ae(ae({},t),A),resultToName:Toe}),items:Loe({mergeNames:(t,A,e)=>t.if((0,Zo._)`${e} !== true && ${A} !== undefined`,()=>t.assign(e,(0,Zo._)`${A} === true ? true : ${e} > ${A} ? ${e} : ${A}`)),mergeToName:(t,A,e)=>t.if((0,Zo._)`${e} !== true`,()=>t.assign(e,A===!0?!0:(0,Zo._)`${e} > ${A} ? ${e} : ${A}`)),mergeValues:(t,A)=>t===!0?!0:Math.max(t,A),resultToName:(t,A)=>t.var("items",A)})};function Toe(t,A){if(A===!0)return t.var("props",!0);let e=t.var("props",(0,Zo._)`{}`);return A!==void 0&&WG(t,e,A),e}Bn.evaluatedPropsToName=Toe;function WG(t,A,e){Object.keys(e).forEach(i=>t.assign((0,Zo._)`${A}${(0,Zo.getProperty)(i)}`,!0))}Bn.setEvaluated=WG;var Foe={};function xGe(t,A){return t.scopeValue("func",{ref:A,code:Foe[A.code]||(Foe[A.code]=new wGe._Code(A.code))})}Bn.useFunc=xGe;var VG=function(t){return t[t.Num=0]="Num",t[t.Str=1]="Str",t}(VG||(Bn.Type=VG={}));function _Ge(t,A,e){if(t instanceof Zo.Name){let i=A===VG.Num;return e?i?(0,Zo._)`"[" + ${t} + "]"`:(0,Zo._)`"['" + ${t} + "']"`:i?(0,Zo._)`"/" + ${t}`:(0,Zo._)`"/" + ${t}.replace(/~/g, "~0").replace(/\\//g, "~1")`}return e?(0,Zo.getProperty)(t).toString():"/"+qG(t)}Bn.getErrorPath=_Ge;function Ooe(t,A,e=t.opts.strictSchema){if(e){if(A=`strict mode: ${A}`,e===!0)throw new Error(A);t.self.logger.warn(A)}}Bn.checkStrictMode=Ooe});var x2=XA(ZG=>{"use strict";Object.defineProperty(ZG,"__esModule",{value:!0});var ka=hn(),RGe={data:new ka.Name("data"),valCxt:new ka.Name("valCxt"),instancePath:new ka.Name("instancePath"),parentData:new ka.Name("parentData"),parentDataProperty:new ka.Name("parentDataProperty"),rootData:new ka.Name("rootData"),dynamicAnchors:new ka.Name("dynamicAnchors"),vErrors:new ka.Name("vErrors"),errors:new ka.Name("errors"),this:new ka.Name("this"),self:new ka.Name("self"),scope:new ka.Name("scope"),json:new ka.Name("json"),jsonPos:new ka.Name("jsonPos"),jsonLen:new ka.Name("jsonLen"),jsonPart:new ka.Name("jsonPart")};ZG.default=RGe});var g3=XA(xa=>{"use strict";Object.defineProperty(xa,"__esModule",{value:!0});xa.extendErrors=xa.resetErrorsCount=xa.reportExtraError=xa.reportError=xa.keyword$DataError=xa.keywordError=void 0;var Tn=hn(),bv=eo(),oc=x2();xa.keywordError={message:({keyword:t})=>(0,Tn.str)`must pass "${t}" keyword validation`};xa.keyword$DataError={message:({keyword:t,schemaType:A})=>A?(0,Tn.str)`"${t}" keyword must be ${A} ($data)`:(0,Tn.str)`"${t}" keyword is invalid ($data)`};function NGe(t,A=xa.keywordError,e,i){let{it:n}=t,{gen:o,compositeRule:r,allErrors:s}=n,a=Hoe(t,A,e);i??(r||s)?Joe(o,a):Yoe(n,(0,Tn._)`[${a}]`)}xa.reportError=NGe;function LGe(t,A=xa.keywordError,e){let{it:i}=t,{gen:n,compositeRule:o,allErrors:r}=i,s=Hoe(t,A,e);Joe(n,s),o||r||Yoe(i,oc.default.vErrors)}xa.reportExtraError=LGe;function FGe(t,A){t.assign(oc.default.errors,A),t.if((0,Tn._)`${oc.default.vErrors} !== null`,()=>t.if(A,()=>t.assign((0,Tn._)`${oc.default.vErrors}.length`,A),()=>t.assign(oc.default.vErrors,null)))}xa.resetErrorsCount=FGe;function GGe({gen:t,keyword:A,schemaValue:e,data:i,errsCount:n,it:o}){if(n===void 0)throw new Error("ajv implementation error");let r=t.name("err");t.forRange("i",n,oc.default.errors,s=>{t.const(r,(0,Tn._)`${oc.default.vErrors}[${s}]`),t.if((0,Tn._)`${r}.instancePath === undefined`,()=>t.assign((0,Tn._)`${r}.instancePath`,(0,Tn.strConcat)(oc.default.instancePath,o.errorPath))),t.assign((0,Tn._)`${r}.schemaPath`,(0,Tn.str)`${o.errSchemaPath}/${A}`),o.opts.verbose&&(t.assign((0,Tn._)`${r}.schema`,e),t.assign((0,Tn._)`${r}.data`,i))})}xa.extendErrors=GGe;function Joe(t,A){let e=t.const("err",A);t.if((0,Tn._)`${oc.default.vErrors} === null`,()=>t.assign(oc.default.vErrors,(0,Tn._)`[${e}]`),(0,Tn._)`${oc.default.vErrors}.push(${e})`),t.code((0,Tn._)`${oc.default.errors}++`)}function Yoe(t,A){let{gen:e,validateName:i,schemaEnv:n}=t;n.$async?e.throw((0,Tn._)`new ${t.ValidationError}(${A})`):(e.assign((0,Tn._)`${i}.errors`,A),e.return(!1))}var bu={keyword:new Tn.Name("keyword"),schemaPath:new Tn.Name("schemaPath"),params:new Tn.Name("params"),propertyName:new Tn.Name("propertyName"),message:new Tn.Name("message"),schema:new Tn.Name("schema"),parentSchema:new Tn.Name("parentSchema")};function Hoe(t,A,e){let{createErrors:i}=t.it;return i===!1?(0,Tn._)`{}`:KGe(t,A,e)}function KGe(t,A,e={}){let{gen:i,it:n}=t,o=[UGe(n,e),TGe(t,e)];return OGe(t,A,o),i.object(...o)}function UGe({errorPath:t},{instancePath:A}){let e=A?(0,Tn.str)`${t}${(0,bv.getErrorPath)(A,bv.Type.Str)}`:t;return[oc.default.instancePath,(0,Tn.strConcat)(oc.default.instancePath,e)]}function TGe({keyword:t,it:{errSchemaPath:A}},{schemaPath:e,parentSchema:i}){let n=i?A:(0,Tn.str)`${A}/${t}`;return e&&(n=(0,Tn.str)`${n}${(0,bv.getErrorPath)(e,bv.Type.Str)}`),[bu.schemaPath,n]}function OGe(t,{params:A,message:e},i){let{keyword:n,data:o,schemaValue:r,it:s}=t,{opts:a,propertyName:c,topSchemaRef:l,schemaPath:d}=s;i.push([bu.keyword,n],[bu.params,typeof A=="function"?A(t):A||(0,Tn._)`{}`]),a.messages&&i.push([bu.message,typeof e=="function"?e(t):e]),a.verbose&&i.push([bu.schema,r],[bu.parentSchema,(0,Tn._)`${l}${d}`],[oc.default.data,o]),c&&i.push([bu.propertyName,c])}});var Poe=XA(YE=>{"use strict";Object.defineProperty(YE,"__esModule",{value:!0});YE.boolOrEmptySchema=YE.topBoolOrEmptySchema=void 0;var JGe=g3(),YGe=hn(),HGe=x2(),zGe={message:"boolean schema is false"};function PGe(t){let{gen:A,schema:e,validateName:i}=t;e===!1?zoe(t,!1):typeof e=="object"&&e.$async===!0?A.return(HGe.default.data):(A.assign((0,YGe._)`${i}.errors`,null),A.return(!0))}YE.topBoolOrEmptySchema=PGe;function jGe(t,A){let{gen:e,schema:i}=t;i===!1?(e.var(A,!1),zoe(t)):e.var(A,!0)}YE.boolOrEmptySchema=jGe;function zoe(t,A){let{gen:e,data:i}=t,n={gen:e,keyword:"false schema",data:i,schema:!1,schemaCode:!1,schemaValue:!1,params:{},it:t};(0,JGe.reportError)(n,zGe,void 0,A)}});var XG=XA(HE=>{"use strict";Object.defineProperty(HE,"__esModule",{value:!0});HE.getRules=HE.isJSONType=void 0;var VGe=["string","number","integer","boolean","null","object","array"],qGe=new Set(VGe);function WGe(t){return typeof t=="string"&&qGe.has(t)}HE.isJSONType=WGe;function ZGe(){let t={number:{type:"number",rules:[]},string:{type:"string",rules:[]},array:{type:"array",rules:[]},object:{type:"object",rules:[]}};return{types:_A(ae({},t),{integer:!0,boolean:!0,null:!0}),rules:[{rules:[]},t.number,t.string,t.array,t.object],post:{rules:[]},all:{},keywords:{}}}HE.getRules=ZGe});var $G=XA(EC=>{"use strict";Object.defineProperty(EC,"__esModule",{value:!0});EC.shouldUseRule=EC.shouldUseGroup=EC.schemaHasRulesForType=void 0;function XGe({schema:t,self:A},e){let i=A.RULES.types[e];return i&&i!==!0&&joe(t,i)}EC.schemaHasRulesForType=XGe;function joe(t,A){return A.rules.some(e=>Voe(t,e))}EC.shouldUseGroup=joe;function Voe(t,A){var e;return t[A.keyword]!==void 0||((e=A.definition.implements)===null||e===void 0?void 0:e.some(i=>t[i]!==void 0))}EC.shouldUseRule=Voe});var d3=XA(_a=>{"use strict";Object.defineProperty(_a,"__esModule",{value:!0});_a.reportTypeError=_a.checkDataTypes=_a.checkDataType=_a.coerceAndCheckDataType=_a.getJSONTypes=_a.getSchemaTypes=_a.DataType=void 0;var $Ge=XG(),eKe=$G(),AKe=g3(),Vi=hn(),qoe=eo(),zE=function(t){return t[t.Correct=0]="Correct",t[t.Wrong=1]="Wrong",t}(zE||(_a.DataType=zE={}));function tKe(t){let A=Woe(t.type);if(A.includes("null")){if(t.nullable===!1)throw new Error("type: null contradicts nullable: false")}else{if(!A.length&&t.nullable!==void 0)throw new Error('"nullable" cannot be used without "type"');t.nullable===!0&&A.push("null")}return A}_a.getSchemaTypes=tKe;function Woe(t){let A=Array.isArray(t)?t:t?[t]:[];if(A.every($Ge.isJSONType))return A;throw new Error("type must be JSONType or JSONType[]: "+A.join(","))}_a.getJSONTypes=Woe;function iKe(t,A){let{gen:e,data:i,opts:n}=t,o=nKe(A,n.coerceTypes),r=A.length>0&&!(o.length===0&&A.length===1&&(0,eKe.schemaHasRulesForType)(t,A[0]));if(r){let s=AK(A,i,n.strictNumbers,zE.Wrong);e.if(s,()=>{o.length?oKe(t,A,o):tK(t)})}return r}_a.coerceAndCheckDataType=iKe;var Zoe=new Set(["string","number","integer","boolean","null"]);function nKe(t,A){return A?t.filter(e=>Zoe.has(e)||A==="array"&&e==="array"):[]}function oKe(t,A,e){let{gen:i,data:n,opts:o}=t,r=i.let("dataType",(0,Vi._)`typeof ${n}`),s=i.let("coerced",(0,Vi._)`undefined`);o.coerceTypes==="array"&&i.if((0,Vi._)`${r} == 'object' && Array.isArray(${n}) && ${n}.length == 1`,()=>i.assign(n,(0,Vi._)`${n}[0]`).assign(r,(0,Vi._)`typeof ${n}`).if(AK(A,n,o.strictNumbers),()=>i.assign(s,n))),i.if((0,Vi._)`${s} !== undefined`);for(let c of e)(Zoe.has(c)||c==="array"&&o.coerceTypes==="array")&&a(c);i.else(),tK(t),i.endIf(),i.if((0,Vi._)`${s} !== undefined`,()=>{i.assign(n,s),rKe(t,s)});function a(c){switch(c){case"string":i.elseIf((0,Vi._)`${r} == "number" || ${r} == "boolean"`).assign(s,(0,Vi._)`"" + ${n}`).elseIf((0,Vi._)`${n} === null`).assign(s,(0,Vi._)`""`);return;case"number":i.elseIf((0,Vi._)`${r} == "boolean" || ${n} === null + || (${r} == "string" && ${n} && ${n} == +${n})`).assign(s,(0,Vi._)`+${n}`);return;case"integer":i.elseIf((0,Vi._)`${r} === "boolean" || ${n} === null + || (${r} === "string" && ${n} && ${n} == +${n} && !(${n} % 1))`).assign(s,(0,Vi._)`+${n}`);return;case"boolean":i.elseIf((0,Vi._)`${n} === "false" || ${n} === 0 || ${n} === null`).assign(s,!1).elseIf((0,Vi._)`${n} === "true" || ${n} === 1`).assign(s,!0);return;case"null":i.elseIf((0,Vi._)`${n} === "" || ${n} === 0 || ${n} === false`),i.assign(s,null);return;case"array":i.elseIf((0,Vi._)`${r} === "string" || ${r} === "number" + || ${r} === "boolean" || ${n} === null`).assign(s,(0,Vi._)`[${n}]`)}}}function rKe({gen:t,parentData:A,parentDataProperty:e},i){t.if((0,Vi._)`${A} !== undefined`,()=>t.assign((0,Vi._)`${A}[${e}]`,i))}function eK(t,A,e,i=zE.Correct){let n=i===zE.Correct?Vi.operators.EQ:Vi.operators.NEQ,o;switch(t){case"null":return(0,Vi._)`${A} ${n} null`;case"array":o=(0,Vi._)`Array.isArray(${A})`;break;case"object":o=(0,Vi._)`${A} && typeof ${A} == "object" && !Array.isArray(${A})`;break;case"integer":o=r((0,Vi._)`!(${A} % 1) && !isNaN(${A})`);break;case"number":o=r();break;default:return(0,Vi._)`typeof ${A} ${n} ${t}`}return i===zE.Correct?o:(0,Vi.not)(o);function r(s=Vi.nil){return(0,Vi.and)((0,Vi._)`typeof ${A} == "number"`,s,e?(0,Vi._)`isFinite(${A})`:Vi.nil)}}_a.checkDataType=eK;function AK(t,A,e,i){if(t.length===1)return eK(t[0],A,e,i);let n,o=(0,qoe.toHash)(t);if(o.array&&o.object){let r=(0,Vi._)`typeof ${A} != "object"`;n=o.null?r:(0,Vi._)`!${A} || ${r}`,delete o.null,delete o.array,delete o.object}else n=Vi.nil;o.number&&delete o.integer;for(let r in o)n=(0,Vi.and)(n,eK(r,A,e,i));return n}_a.checkDataTypes=AK;var sKe={message:({schema:t})=>`must be ${t}`,params:({schema:t,schemaValue:A})=>typeof t=="string"?(0,Vi._)`{type: ${t}}`:(0,Vi._)`{type: ${A}}`};function tK(t){let A=aKe(t);(0,AKe.reportError)(A,sKe)}_a.reportTypeError=tK;function aKe(t){let{gen:A,data:e,schema:i}=t,n=(0,qoe.schemaRefOrVal)(t,i,"type");return{gen:A,keyword:"type",data:e,schema:i.type,schemaCode:n,schemaValue:n,parentSchema:i,params:{},it:t}}});var $oe=XA(Mv=>{"use strict";Object.defineProperty(Mv,"__esModule",{value:!0});Mv.assignDefaults=void 0;var PE=hn(),cKe=eo();function lKe(t,A){let{properties:e,items:i}=t.schema;if(A==="object"&&e)for(let n in e)Xoe(t,n,e[n].default);else A==="array"&&Array.isArray(i)&&i.forEach((n,o)=>Xoe(t,o,n.default))}Mv.assignDefaults=lKe;function Xoe(t,A,e){let{gen:i,compositeRule:n,data:o,opts:r}=t;if(e===void 0)return;let s=(0,PE._)`${o}${(0,PE.getProperty)(A)}`;if(n){(0,cKe.checkStrictMode)(t,`default is ignored for: ${s}`);return}let a=(0,PE._)`${s} === undefined`;r.useDefaults==="empty"&&(a=(0,PE._)`${a} || ${s} === null || ${s} === ""`),i.if(a,(0,PE._)`${s} = ${(0,PE.stringify)(e)}`)}});var Xl=XA(Go=>{"use strict";Object.defineProperty(Go,"__esModule",{value:!0});Go.validateUnion=Go.validateArray=Go.usePattern=Go.callValidateCode=Go.schemaProperties=Go.allSchemaProperties=Go.noPropertyInData=Go.propertyInData=Go.isOwnProperty=Go.hasPropFunc=Go.reportMissingProp=Go.checkMissingProp=Go.checkReportMissingProp=void 0;var ur=hn(),iK=eo(),fC=x2(),gKe=eo();function dKe(t,A){let{gen:e,data:i,it:n}=t;e.if(oK(e,i,A,n.opts.ownProperties),()=>{t.setParams({missingProperty:(0,ur._)`${A}`},!0),t.error()})}Go.checkReportMissingProp=dKe;function CKe({gen:t,data:A,it:{opts:e}},i,n){return(0,ur.or)(...i.map(o=>(0,ur.and)(oK(t,A,o,e.ownProperties),(0,ur._)`${n} = ${o}`)))}Go.checkMissingProp=CKe;function IKe(t,A){t.setParams({missingProperty:A},!0),t.error()}Go.reportMissingProp=IKe;function ere(t){return t.scopeValue("func",{ref:Object.prototype.hasOwnProperty,code:(0,ur._)`Object.prototype.hasOwnProperty`})}Go.hasPropFunc=ere;function nK(t,A,e){return(0,ur._)`${ere(t)}.call(${A}, ${e})`}Go.isOwnProperty=nK;function uKe(t,A,e,i){let n=(0,ur._)`${A}${(0,ur.getProperty)(e)} !== undefined`;return i?(0,ur._)`${n} && ${nK(t,A,e)}`:n}Go.propertyInData=uKe;function oK(t,A,e,i){let n=(0,ur._)`${A}${(0,ur.getProperty)(e)} === undefined`;return i?(0,ur.or)(n,(0,ur.not)(nK(t,A,e))):n}Go.noPropertyInData=oK;function Are(t){return t?Object.keys(t).filter(A=>A!=="__proto__"):[]}Go.allSchemaProperties=Are;function hKe(t,A){return Are(A).filter(e=>!(0,iK.alwaysValidSchema)(t,A[e]))}Go.schemaProperties=hKe;function BKe({schemaCode:t,data:A,it:{gen:e,topSchemaRef:i,schemaPath:n,errorPath:o},it:r},s,a,c){let l=c?(0,ur._)`${t}, ${A}, ${i}${n}`:A,d=[[fC.default.instancePath,(0,ur.strConcat)(fC.default.instancePath,o)],[fC.default.parentData,r.parentData],[fC.default.parentDataProperty,r.parentDataProperty],[fC.default.rootData,fC.default.rootData]];r.opts.dynamicRef&&d.push([fC.default.dynamicAnchors,fC.default.dynamicAnchors]);let C=(0,ur._)`${l}, ${e.object(...d)}`;return a!==ur.nil?(0,ur._)`${s}.call(${a}, ${C})`:(0,ur._)`${s}(${C})`}Go.callValidateCode=BKe;var EKe=(0,ur._)`new RegExp`;function fKe({gen:t,it:{opts:A}},e){let i=A.unicodeRegExp?"u":"",{regExp:n}=A.code,o=n(e,i);return t.scopeValue("pattern",{key:o.toString(),ref:o,code:(0,ur._)`${n.code==="new RegExp"?EKe:(0,gKe.useFunc)(t,n)}(${e}, ${i})`})}Go.usePattern=fKe;function QKe(t){let{gen:A,data:e,keyword:i,it:n}=t,o=A.name("valid");if(n.allErrors){let s=A.let("valid",!0);return r(()=>A.assign(s,!1)),s}return A.var(o,!0),r(()=>A.break()),o;function r(s){let a=A.const("len",(0,ur._)`${e}.length`);A.forRange("i",0,a,c=>{t.subschema({keyword:i,dataProp:c,dataPropType:iK.Type.Num},o),A.if((0,ur.not)(o),s)})}}Go.validateArray=QKe;function mKe(t){let{gen:A,schema:e,keyword:i,it:n}=t;if(!Array.isArray(e))throw new Error("ajv implementation error");if(e.some(a=>(0,iK.alwaysValidSchema)(n,a))&&!n.opts.unevaluated)return;let r=A.let("valid",!1),s=A.name("_valid");A.block(()=>e.forEach((a,c)=>{let l=t.subschema({keyword:i,schemaProp:c,compositeRule:!0},s);A.assign(r,(0,ur._)`${r} || ${s}`),t.mergeValidEvaluated(l,s)||A.if((0,ur.not)(r))})),t.result(r,()=>t.reset(),()=>t.error(!0))}Go.validateUnion=mKe});var nre=XA(gd=>{"use strict";Object.defineProperty(gd,"__esModule",{value:!0});gd.validateKeywordUsage=gd.validSchemaType=gd.funcKeywordCode=gd.macroKeywordCode=void 0;var rc=hn(),Mu=x2(),pKe=Xl(),wKe=g3();function yKe(t,A){let{gen:e,keyword:i,schema:n,parentSchema:o,it:r}=t,s=A.macro.call(r.self,n,o,r),a=ire(e,i,s);r.opts.validateSchema!==!1&&r.self.validateSchema(s,!0);let c=e.name("valid");t.subschema({schema:s,schemaPath:rc.nil,errSchemaPath:`${r.errSchemaPath}/${i}`,topSchemaRef:a,compositeRule:!0},c),t.pass(c,()=>t.error(!0))}gd.macroKeywordCode=yKe;function DKe(t,A){var e;let{gen:i,keyword:n,schema:o,parentSchema:r,$data:s,it:a}=t;bKe(a,A);let c=!s&&A.compile?A.compile.call(a.self,o,r,a):A.validate,l=ire(i,n,c),d=i.let("valid");t.block$data(d,C),t.ok((e=A.valid)!==null&&e!==void 0?e:d);function C(){if(A.errors===!1)h(),A.modifying&&tre(t),B(()=>t.error());else{let f=A.async?I():u();A.modifying&&tre(t),B(()=>vKe(t,f))}}function I(){let f=i.let("ruleErrs",null);return i.try(()=>h((0,rc._)`await `),b=>i.assign(d,!1).if((0,rc._)`${b} instanceof ${a.ValidationError}`,()=>i.assign(f,(0,rc._)`${b}.errors`),()=>i.throw(b))),f}function u(){let f=(0,rc._)`${l}.errors`;return i.assign(f,null),h(rc.nil),f}function h(f=A.async?(0,rc._)`await `:rc.nil){let b=a.opts.passContext?Mu.default.this:Mu.default.self,k=!("compile"in A&&!s||A.schema===!1);i.assign(d,(0,rc._)`${f}${(0,pKe.callValidateCode)(t,l,b,k)}`,A.modifying)}function B(f){var b;i.if((0,rc.not)((b=A.valid)!==null&&b!==void 0?b:d),f)}}gd.funcKeywordCode=DKe;function tre(t){let{gen:A,data:e,it:i}=t;A.if(i.parentData,()=>A.assign(e,(0,rc._)`${i.parentData}[${i.parentDataProperty}]`))}function vKe(t,A){let{gen:e}=t;e.if((0,rc._)`Array.isArray(${A})`,()=>{e.assign(Mu.default.vErrors,(0,rc._)`${Mu.default.vErrors} === null ? ${A} : ${Mu.default.vErrors}.concat(${A})`).assign(Mu.default.errors,(0,rc._)`${Mu.default.vErrors}.length`),(0,wKe.extendErrors)(t)},()=>t.error())}function bKe({schemaEnv:t},A){if(A.async&&!t.$async)throw new Error("async keyword in sync schema")}function ire(t,A,e){if(e===void 0)throw new Error(`keyword "${A}" failed to compile`);return t.scopeValue("keyword",typeof e=="function"?{ref:e}:{ref:e,code:(0,rc.stringify)(e)})}function MKe(t,A,e=!1){return!A.length||A.some(i=>i==="array"?Array.isArray(t):i==="object"?t&&typeof t=="object"&&!Array.isArray(t):typeof t==i||e&&typeof t>"u")}gd.validSchemaType=MKe;function SKe({schema:t,opts:A,self:e,errSchemaPath:i},n,o){if(Array.isArray(n.keyword)?!n.keyword.includes(o):n.keyword!==o)throw new Error("ajv implementation error");let r=n.dependencies;if(r?.some(s=>!Object.prototype.hasOwnProperty.call(t,s)))throw new Error(`parent schema must have dependencies of ${o}: ${r.join(",")}`);if(n.validateSchema&&!n.validateSchema(t[o])){let a=`keyword "${o}" value is invalid at path "${i}": `+e.errorsText(n.validateSchema.errors);if(A.validateSchema==="log")e.logger.error(a);else throw new Error(a)}}gd.validateKeywordUsage=SKe});var rre=XA(QC=>{"use strict";Object.defineProperty(QC,"__esModule",{value:!0});QC.extendSubschemaMode=QC.extendSubschemaData=QC.getSubschema=void 0;var dd=hn(),ore=eo();function kKe(t,{keyword:A,schemaProp:e,schema:i,schemaPath:n,errSchemaPath:o,topSchemaRef:r}){if(A!==void 0&&i!==void 0)throw new Error('both "keyword" and "schema" passed, only one allowed');if(A!==void 0){let s=t.schema[A];return e===void 0?{schema:s,schemaPath:(0,dd._)`${t.schemaPath}${(0,dd.getProperty)(A)}`,errSchemaPath:`${t.errSchemaPath}/${A}`}:{schema:s[e],schemaPath:(0,dd._)`${t.schemaPath}${(0,dd.getProperty)(A)}${(0,dd.getProperty)(e)}`,errSchemaPath:`${t.errSchemaPath}/${A}/${(0,ore.escapeFragment)(e)}`}}if(i!==void 0){if(n===void 0||o===void 0||r===void 0)throw new Error('"schemaPath", "errSchemaPath" and "topSchemaRef" are required with "schema"');return{schema:i,schemaPath:n,topSchemaRef:r,errSchemaPath:o}}throw new Error('either "keyword" or "schema" must be passed')}QC.getSubschema=kKe;function xKe(t,A,{dataProp:e,dataPropType:i,data:n,dataTypes:o,propertyName:r}){if(n!==void 0&&e!==void 0)throw new Error('both "data" and "dataProp" passed, only one allowed');let{gen:s}=A;if(e!==void 0){let{errorPath:c,dataPathArr:l,opts:d}=A,C=s.let("data",(0,dd._)`${A.data}${(0,dd.getProperty)(e)}`,!0);a(C),t.errorPath=(0,dd.str)`${c}${(0,ore.getErrorPath)(e,i,d.jsPropertySyntax)}`,t.parentDataProperty=(0,dd._)`${e}`,t.dataPathArr=[...l,t.parentDataProperty]}if(n!==void 0){let c=n instanceof dd.Name?n:s.let("data",n,!0);a(c),r!==void 0&&(t.propertyName=r)}o&&(t.dataTypes=o);function a(c){t.data=c,t.dataLevel=A.dataLevel+1,t.dataTypes=[],A.definedProperties=new Set,t.parentData=A.data,t.dataNames=[...A.dataNames,c]}}QC.extendSubschemaData=xKe;function _Ke(t,{jtdDiscriminator:A,jtdMetadata:e,compositeRule:i,createErrors:n,allErrors:o}){i!==void 0&&(t.compositeRule=i),n!==void 0&&(t.createErrors=n),o!==void 0&&(t.allErrors=o),t.jtdDiscriminator=A,t.jtdMetadata=e}QC.extendSubschemaMode=_Ke});var rK=XA((gUA,sre)=>{"use strict";sre.exports=function t(A,e){if(A===e)return!0;if(A&&e&&typeof A=="object"&&typeof e=="object"){if(A.constructor!==e.constructor)return!1;var i,n,o;if(Array.isArray(A)){if(i=A.length,i!=e.length)return!1;for(n=i;n--!==0;)if(!t(A[n],e[n]))return!1;return!0}if(A.constructor===RegExp)return A.source===e.source&&A.flags===e.flags;if(A.valueOf!==Object.prototype.valueOf)return A.valueOf()===e.valueOf();if(A.toString!==Object.prototype.toString)return A.toString()===e.toString();if(o=Object.keys(A),i=o.length,i!==Object.keys(e).length)return!1;for(n=i;n--!==0;)if(!Object.prototype.hasOwnProperty.call(e,o[n]))return!1;for(n=i;n--!==0;){var r=o[n];if(!t(A[r],e[r]))return!1}return!0}return A!==A&&e!==e}});var cre=XA((dUA,are)=>{"use strict";var mC=are.exports=function(t,A,e){typeof A=="function"&&(e=A,A={}),e=A.cb||e;var i=typeof e=="function"?e:e.pre||function(){},n=e.post||function(){};Sv(A,i,n,t,"",t)};mC.keywords={additionalItems:!0,items:!0,contains:!0,additionalProperties:!0,propertyNames:!0,not:!0,if:!0,then:!0,else:!0};mC.arrayKeywords={items:!0,allOf:!0,anyOf:!0,oneOf:!0};mC.propsKeywords={$defs:!0,definitions:!0,properties:!0,patternProperties:!0,dependencies:!0};mC.skipKeywords={default:!0,enum:!0,const:!0,required:!0,maximum:!0,minimum:!0,exclusiveMaximum:!0,exclusiveMinimum:!0,multipleOf:!0,maxLength:!0,minLength:!0,pattern:!0,format:!0,maxItems:!0,minItems:!0,uniqueItems:!0,maxProperties:!0,minProperties:!0};function Sv(t,A,e,i,n,o,r,s,a,c){if(i&&typeof i=="object"&&!Array.isArray(i)){A(i,n,o,r,s,a,c);for(var l in i){var d=i[l];if(Array.isArray(d)){if(l in mC.arrayKeywords)for(var C=0;C{"use strict";Object.defineProperty(Rc,"__esModule",{value:!0});Rc.getSchemaRefs=Rc.resolveUrl=Rc.normalizeId=Rc._getFullPath=Rc.getFullPath=Rc.inlineRef=void 0;var NKe=eo(),LKe=rK(),FKe=cre(),GKe=new Set(["type","format","pattern","maxLength","minLength","maxProperties","minProperties","maxItems","minItems","maximum","minimum","uniqueItems","multipleOf","required","enum","const"]);function KKe(t,A=!0){return typeof t=="boolean"?!0:A===!0?!sK(t):A?lre(t)<=A:!1}Rc.inlineRef=KKe;var UKe=new Set(["$ref","$recursiveRef","$recursiveAnchor","$dynamicRef","$dynamicAnchor"]);function sK(t){for(let A in t){if(UKe.has(A))return!0;let e=t[A];if(Array.isArray(e)&&e.some(sK)||typeof e=="object"&&sK(e))return!0}return!1}function lre(t){let A=0;for(let e in t){if(e==="$ref")return 1/0;if(A++,!GKe.has(e)&&(typeof t[e]=="object"&&(0,NKe.eachItem)(t[e],i=>A+=lre(i)),A===1/0))return 1/0}return A}function gre(t,A="",e){e!==!1&&(A=jE(A));let i=t.parse(A);return dre(t,i)}Rc.getFullPath=gre;function dre(t,A){return t.serialize(A).split("#")[0]+"#"}Rc._getFullPath=dre;var TKe=/#\/?$/;function jE(t){return t?t.replace(TKe,""):""}Rc.normalizeId=jE;function OKe(t,A,e){return e=jE(e),t.resolve(A,e)}Rc.resolveUrl=OKe;var JKe=/^[a-z_][-a-z0-9._]*$/i;function YKe(t,A){if(typeof t=="boolean")return{};let{schemaId:e,uriResolver:i}=this.opts,n=jE(t[e]||A),o={"":n},r=gre(i,n,!1),s={},a=new Set;return FKe(t,{allKeys:!0},(d,C,I,u)=>{if(u===void 0)return;let h=r+C,B=o[u];typeof d[e]=="string"&&(B=f.call(this,d[e])),b.call(this,d.$anchor),b.call(this,d.$dynamicAnchor),o[C]=B;function f(k){let S=this.opts.uriResolver.resolve;if(k=jE(B?S(B,k):k),a.has(k))throw l(k);a.add(k);let w=this.refs[k];return typeof w=="string"&&(w=this.refs[w]),typeof w=="object"?c(d,w.schema,k):k!==jE(h)&&(k[0]==="#"?(c(d,s[k],k),s[k]=d):this.refs[k]=h),k}function b(k){if(typeof k=="string"){if(!JKe.test(k))throw new Error(`invalid anchor "${k}"`);f.call(this,`#${k}`)}}}),s;function c(d,C,I){if(C!==void 0&&!LKe(d,C))throw l(I)}function l(d){return new Error(`reference "${d}" resolves to more than one schema`)}}Rc.getSchemaRefs=YKe});var h3=XA(pC=>{"use strict";Object.defineProperty(pC,"__esModule",{value:!0});pC.getData=pC.KeywordCxt=pC.validateFunctionCode=void 0;var Bre=Poe(),Cre=d3(),cK=$G(),kv=d3(),HKe=$oe(),u3=nre(),aK=rre(),Lt=hn(),yi=x2(),zKe=C3(),_2=eo(),I3=g3();function PKe(t){if(Qre(t)&&(mre(t),fre(t))){qKe(t);return}Ere(t,()=>(0,Bre.topBoolOrEmptySchema)(t))}pC.validateFunctionCode=PKe;function Ere({gen:t,validateName:A,schema:e,schemaEnv:i,opts:n},o){n.code.es5?t.func(A,(0,Lt._)`${yi.default.data}, ${yi.default.valCxt}`,i.$async,()=>{t.code((0,Lt._)`"use strict"; ${Ire(e,n)}`),VKe(t,n),t.code(o)}):t.func(A,(0,Lt._)`${yi.default.data}, ${jKe(n)}`,i.$async,()=>t.code(Ire(e,n)).code(o))}function jKe(t){return(0,Lt._)`{${yi.default.instancePath}="", ${yi.default.parentData}, ${yi.default.parentDataProperty}, ${yi.default.rootData}=${yi.default.data}${t.dynamicRef?(0,Lt._)`, ${yi.default.dynamicAnchors}={}`:Lt.nil}}={}`}function VKe(t,A){t.if(yi.default.valCxt,()=>{t.var(yi.default.instancePath,(0,Lt._)`${yi.default.valCxt}.${yi.default.instancePath}`),t.var(yi.default.parentData,(0,Lt._)`${yi.default.valCxt}.${yi.default.parentData}`),t.var(yi.default.parentDataProperty,(0,Lt._)`${yi.default.valCxt}.${yi.default.parentDataProperty}`),t.var(yi.default.rootData,(0,Lt._)`${yi.default.valCxt}.${yi.default.rootData}`),A.dynamicRef&&t.var(yi.default.dynamicAnchors,(0,Lt._)`${yi.default.valCxt}.${yi.default.dynamicAnchors}`)},()=>{t.var(yi.default.instancePath,(0,Lt._)`""`),t.var(yi.default.parentData,(0,Lt._)`undefined`),t.var(yi.default.parentDataProperty,(0,Lt._)`undefined`),t.var(yi.default.rootData,yi.default.data),A.dynamicRef&&t.var(yi.default.dynamicAnchors,(0,Lt._)`{}`)})}function qKe(t){let{schema:A,opts:e,gen:i}=t;Ere(t,()=>{e.$comment&&A.$comment&&wre(t),eUe(t),i.let(yi.default.vErrors,null),i.let(yi.default.errors,0),e.unevaluated&&WKe(t),pre(t),iUe(t)})}function WKe(t){let{gen:A,validateName:e}=t;t.evaluated=A.const("evaluated",(0,Lt._)`${e}.evaluated`),A.if((0,Lt._)`${t.evaluated}.dynamicProps`,()=>A.assign((0,Lt._)`${t.evaluated}.props`,(0,Lt._)`undefined`)),A.if((0,Lt._)`${t.evaluated}.dynamicItems`,()=>A.assign((0,Lt._)`${t.evaluated}.items`,(0,Lt._)`undefined`))}function Ire(t,A){let e=typeof t=="object"&&t[A.schemaId];return e&&(A.code.source||A.code.process)?(0,Lt._)`/*# sourceURL=${e} */`:Lt.nil}function ZKe(t,A){if(Qre(t)&&(mre(t),fre(t))){XKe(t,A);return}(0,Bre.boolOrEmptySchema)(t,A)}function fre({schema:t,self:A}){if(typeof t=="boolean")return!t;for(let e in t)if(A.RULES.all[e])return!0;return!1}function Qre(t){return typeof t.schema!="boolean"}function XKe(t,A){let{schema:e,gen:i,opts:n}=t;n.$comment&&e.$comment&&wre(t),AUe(t),tUe(t);let o=i.const("_errs",yi.default.errors);pre(t,o),i.var(A,(0,Lt._)`${o} === ${yi.default.errors}`)}function mre(t){(0,_2.checkUnknownRules)(t),$Ke(t)}function pre(t,A){if(t.opts.jtd)return ure(t,[],!1,A);let e=(0,Cre.getSchemaTypes)(t.schema),i=(0,Cre.coerceAndCheckDataType)(t,e);ure(t,e,!i,A)}function $Ke(t){let{schema:A,errSchemaPath:e,opts:i,self:n}=t;A.$ref&&i.ignoreKeywordsWithRef&&(0,_2.schemaHasRulesButRef)(A,n.RULES)&&n.logger.warn(`$ref: keywords ignored in schema at path "${e}"`)}function eUe(t){let{schema:A,opts:e}=t;A.default!==void 0&&e.useDefaults&&e.strictSchema&&(0,_2.checkStrictMode)(t,"default is ignored in the schema root")}function AUe(t){let A=t.schema[t.opts.schemaId];A&&(t.baseId=(0,zKe.resolveUrl)(t.opts.uriResolver,t.baseId,A))}function tUe(t){if(t.schema.$async&&!t.schemaEnv.$async)throw new Error("async schema in sync schema")}function wre({gen:t,schemaEnv:A,schema:e,errSchemaPath:i,opts:n}){let o=e.$comment;if(n.$comment===!0)t.code((0,Lt._)`${yi.default.self}.logger.log(${o})`);else if(typeof n.$comment=="function"){let r=(0,Lt.str)`${i}/$comment`,s=t.scopeValue("root",{ref:A.root});t.code((0,Lt._)`${yi.default.self}.opts.$comment(${o}, ${r}, ${s}.schema)`)}}function iUe(t){let{gen:A,schemaEnv:e,validateName:i,ValidationError:n,opts:o}=t;e.$async?A.if((0,Lt._)`${yi.default.errors} === 0`,()=>A.return(yi.default.data),()=>A.throw((0,Lt._)`new ${n}(${yi.default.vErrors})`)):(A.assign((0,Lt._)`${i}.errors`,yi.default.vErrors),o.unevaluated&&nUe(t),A.return((0,Lt._)`${yi.default.errors} === 0`))}function nUe({gen:t,evaluated:A,props:e,items:i}){e instanceof Lt.Name&&t.assign((0,Lt._)`${A}.props`,e),i instanceof Lt.Name&&t.assign((0,Lt._)`${A}.items`,i)}function ure(t,A,e,i){let{gen:n,schema:o,data:r,allErrors:s,opts:a,self:c}=t,{RULES:l}=c;if(o.$ref&&(a.ignoreKeywordsWithRef||!(0,_2.schemaHasRulesButRef)(o,l))){n.block(()=>Dre(t,"$ref",l.all.$ref.definition));return}a.jtd||oUe(t,A),n.block(()=>{for(let C of l.rules)d(C);d(l.post)});function d(C){(0,cK.shouldUseGroup)(o,C)&&(C.type?(n.if((0,kv.checkDataType)(C.type,r,a.strictNumbers)),hre(t,C),A.length===1&&A[0]===C.type&&e&&(n.else(),(0,kv.reportTypeError)(t)),n.endIf()):hre(t,C),s||n.if((0,Lt._)`${yi.default.errors} === ${i||0}`))}}function hre(t,A){let{gen:e,schema:i,opts:{useDefaults:n}}=t;n&&(0,HKe.assignDefaults)(t,A.type),e.block(()=>{for(let o of A.rules)(0,cK.shouldUseRule)(i,o)&&Dre(t,o.keyword,o.definition,A.type)})}function oUe(t,A){t.schemaEnv.meta||!t.opts.strictTypes||(rUe(t,A),t.opts.allowUnionTypes||sUe(t,A),aUe(t,t.dataTypes))}function rUe(t,A){if(A.length){if(!t.dataTypes.length){t.dataTypes=A;return}A.forEach(e=>{yre(t.dataTypes,e)||lK(t,`type "${e}" not allowed by context "${t.dataTypes.join(",")}"`)}),lUe(t,A)}}function sUe(t,A){A.length>1&&!(A.length===2&&A.includes("null"))&&lK(t,"use allowUnionTypes to allow union type keyword")}function aUe(t,A){let e=t.self.RULES.all;for(let i in e){let n=e[i];if(typeof n=="object"&&(0,cK.shouldUseRule)(t.schema,n)){let{type:o}=n.definition;o.length&&!o.some(r=>cUe(A,r))&&lK(t,`missing type "${o.join(",")}" for keyword "${i}"`)}}}function cUe(t,A){return t.includes(A)||A==="number"&&t.includes("integer")}function yre(t,A){return t.includes(A)||A==="integer"&&t.includes("number")}function lUe(t,A){let e=[];for(let i of t.dataTypes)yre(A,i)?e.push(i):A.includes("integer")&&i==="number"&&e.push("integer");t.dataTypes=e}function lK(t,A){let e=t.schemaEnv.baseId+t.errSchemaPath;A+=` at "${e}" (strictTypes)`,(0,_2.checkStrictMode)(t,A,t.opts.strictTypes)}var xv=class{constructor(A,e,i){if((0,u3.validateKeywordUsage)(A,e,i),this.gen=A.gen,this.allErrors=A.allErrors,this.keyword=i,this.data=A.data,this.schema=A.schema[i],this.$data=e.$data&&A.opts.$data&&this.schema&&this.schema.$data,this.schemaValue=(0,_2.schemaRefOrVal)(A,this.schema,i,this.$data),this.schemaType=e.schemaType,this.parentSchema=A.schema,this.params={},this.it=A,this.def=e,this.$data)this.schemaCode=A.gen.const("vSchema",vre(this.$data,A));else if(this.schemaCode=this.schemaValue,!(0,u3.validSchemaType)(this.schema,e.schemaType,e.allowUndefined))throw new Error(`${i} value must be ${JSON.stringify(e.schemaType)}`);("code"in e?e.trackErrors:e.errors!==!1)&&(this.errsCount=A.gen.const("_errs",yi.default.errors))}result(A,e,i){this.failResult((0,Lt.not)(A),e,i)}failResult(A,e,i){this.gen.if(A),i?i():this.error(),e?(this.gen.else(),e(),this.allErrors&&this.gen.endIf()):this.allErrors?this.gen.endIf():this.gen.else()}pass(A,e){this.failResult((0,Lt.not)(A),void 0,e)}fail(A){if(A===void 0){this.error(),this.allErrors||this.gen.if(!1);return}this.gen.if(A),this.error(),this.allErrors?this.gen.endIf():this.gen.else()}fail$data(A){if(!this.$data)return this.fail(A);let{schemaCode:e}=this;this.fail((0,Lt._)`${e} !== undefined && (${(0,Lt.or)(this.invalid$data(),A)})`)}error(A,e,i){if(e){this.setParams(e),this._error(A,i),this.setParams({});return}this._error(A,i)}_error(A,e){(A?I3.reportExtraError:I3.reportError)(this,this.def.error,e)}$dataError(){(0,I3.reportError)(this,this.def.$dataError||I3.keyword$DataError)}reset(){if(this.errsCount===void 0)throw new Error('add "trackErrors" to keyword definition');(0,I3.resetErrorsCount)(this.gen,this.errsCount)}ok(A){this.allErrors||this.gen.if(A)}setParams(A,e){e?Object.assign(this.params,A):this.params=A}block$data(A,e,i=Lt.nil){this.gen.block(()=>{this.check$data(A,i),e()})}check$data(A=Lt.nil,e=Lt.nil){if(!this.$data)return;let{gen:i,schemaCode:n,schemaType:o,def:r}=this;i.if((0,Lt.or)((0,Lt._)`${n} === undefined`,e)),A!==Lt.nil&&i.assign(A,!0),(o.length||r.validateSchema)&&(i.elseIf(this.invalid$data()),this.$dataError(),A!==Lt.nil&&i.assign(A,!1)),i.else()}invalid$data(){let{gen:A,schemaCode:e,schemaType:i,def:n,it:o}=this;return(0,Lt.or)(r(),s());function r(){if(i.length){if(!(e instanceof Lt.Name))throw new Error("ajv implementation error");let a=Array.isArray(i)?i:[i];return(0,Lt._)`${(0,kv.checkDataTypes)(a,e,o.opts.strictNumbers,kv.DataType.Wrong)}`}return Lt.nil}function s(){if(n.validateSchema){let a=A.scopeValue("validate$data",{ref:n.validateSchema});return(0,Lt._)`!${a}(${e})`}return Lt.nil}}subschema(A,e){let i=(0,aK.getSubschema)(this.it,A);(0,aK.extendSubschemaData)(i,this.it,A),(0,aK.extendSubschemaMode)(i,A);let n=_A(ae(ae({},this.it),i),{items:void 0,props:void 0});return ZKe(n,e),n}mergeEvaluated(A,e){let{it:i,gen:n}=this;i.opts.unevaluated&&(i.props!==!0&&A.props!==void 0&&(i.props=_2.mergeEvaluated.props(n,A.props,i.props,e)),i.items!==!0&&A.items!==void 0&&(i.items=_2.mergeEvaluated.items(n,A.items,i.items,e)))}mergeValidEvaluated(A,e){let{it:i,gen:n}=this;if(i.opts.unevaluated&&(i.props!==!0||i.items!==!0))return n.if(e,()=>this.mergeEvaluated(A,Lt.Name)),!0}};pC.KeywordCxt=xv;function Dre(t,A,e,i){let n=new xv(t,e,A);"code"in e?e.code(n,i):n.$data&&e.validate?(0,u3.funcKeywordCode)(n,e):"macro"in e?(0,u3.macroKeywordCode)(n,e):(e.compile||e.validate)&&(0,u3.funcKeywordCode)(n,e)}var gUe=/^\/(?:[^~]|~0|~1)*$/,dUe=/^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;function vre(t,{dataLevel:A,dataNames:e,dataPathArr:i}){let n,o;if(t==="")return yi.default.rootData;if(t[0]==="/"){if(!gUe.test(t))throw new Error(`Invalid JSON-pointer: ${t}`);n=t,o=yi.default.rootData}else{let c=dUe.exec(t);if(!c)throw new Error(`Invalid JSON-pointer: ${t}`);let l=+c[1];if(n=c[2],n==="#"){if(l>=A)throw new Error(a("property/index",l));return i[A-l]}if(l>A)throw new Error(a("data",l));if(o=e[A-l],!n)return o}let r=o,s=n.split("/");for(let c of s)c&&(o=(0,Lt._)`${o}${(0,Lt.getProperty)((0,_2.unescapeJsonPointer)(c))}`,r=(0,Lt._)`${r} && ${o}`);return r;function a(c,l){return`Cannot access ${c} ${l} levels up, current level is ${A}`}}pC.getData=vre});var _v=XA(dK=>{"use strict";Object.defineProperty(dK,"__esModule",{value:!0});var gK=class extends Error{constructor(A){super("validation failed"),this.errors=A,this.ajv=this.validation=!0}};dK.default=gK});var B3=XA(uK=>{"use strict";Object.defineProperty(uK,"__esModule",{value:!0});var CK=C3(),IK=class extends Error{constructor(A,e,i,n){super(n||`can't resolve reference ${i} from id ${e}`),this.missingRef=(0,CK.resolveUrl)(A,e,i),this.missingSchema=(0,CK.normalizeId)((0,CK.getFullPath)(A,this.missingRef))}};uK.default=IK});var Nv=XA($l=>{"use strict";Object.defineProperty($l,"__esModule",{value:!0});$l.resolveSchema=$l.getCompilingSchema=$l.resolveRef=$l.compileSchema=$l.SchemaEnv=void 0;var Tg=hn(),CUe=_v(),Su=x2(),Og=C3(),bre=eo(),IUe=h3(),VE=class{constructor(A){var e;this.refs={},this.dynamicAnchors={};let i;typeof A.schema=="object"&&(i=A.schema),this.schema=A.schema,this.schemaId=A.schemaId,this.root=A.root||this,this.baseId=(e=A.baseId)!==null&&e!==void 0?e:(0,Og.normalizeId)(i?.[A.schemaId||"$id"]),this.schemaPath=A.schemaPath,this.localRefs=A.localRefs,this.meta=A.meta,this.$async=i?.$async,this.refs={}}};$l.SchemaEnv=VE;function BK(t){let A=Mre.call(this,t);if(A)return A;let e=(0,Og.getFullPath)(this.opts.uriResolver,t.root.baseId),{es5:i,lines:n}=this.opts.code,{ownProperties:o}=this.opts,r=new Tg.CodeGen(this.scope,{es5:i,lines:n,ownProperties:o}),s;t.$async&&(s=r.scopeValue("Error",{ref:CUe.default,code:(0,Tg._)`require("ajv/dist/runtime/validation_error").default`}));let a=r.scopeName("validate");t.validateName=a;let c={gen:r,allErrors:this.opts.allErrors,data:Su.default.data,parentData:Su.default.parentData,parentDataProperty:Su.default.parentDataProperty,dataNames:[Su.default.data],dataPathArr:[Tg.nil],dataLevel:0,dataTypes:[],definedProperties:new Set,topSchemaRef:r.scopeValue("schema",this.opts.code.source===!0?{ref:t.schema,code:(0,Tg.stringify)(t.schema)}:{ref:t.schema}),validateName:a,ValidationError:s,schema:t.schema,schemaEnv:t,rootId:e,baseId:t.baseId||e,schemaPath:Tg.nil,errSchemaPath:t.schemaPath||(this.opts.jtd?"":"#"),errorPath:(0,Tg._)`""`,opts:this.opts,self:this},l;try{this._compilations.add(t),(0,IUe.validateFunctionCode)(c),r.optimize(this.opts.code.optimize);let d=r.toString();l=`${r.scopeRefs(Su.default.scope)}return ${d}`,this.opts.code.process&&(l=this.opts.code.process(l,t));let I=new Function(`${Su.default.self}`,`${Su.default.scope}`,l)(this,this.scope.get());if(this.scope.value(a,{ref:I}),I.errors=null,I.schema=t.schema,I.schemaEnv=t,t.$async&&(I.$async=!0),this.opts.code.source===!0&&(I.source={validateName:a,validateCode:d,scopeValues:r._values}),this.opts.unevaluated){let{props:u,items:h}=c;I.evaluated={props:u instanceof Tg.Name?void 0:u,items:h instanceof Tg.Name?void 0:h,dynamicProps:u instanceof Tg.Name,dynamicItems:h instanceof Tg.Name},I.source&&(I.source.evaluated=(0,Tg.stringify)(I.evaluated))}return t.validate=I,t}catch(d){throw delete t.validate,delete t.validateName,l&&this.logger.error("Error compiling schema, function code:",l),d}finally{this._compilations.delete(t)}}$l.compileSchema=BK;function uUe(t,A,e){var i;e=(0,Og.resolveUrl)(this.opts.uriResolver,A,e);let n=t.refs[e];if(n)return n;let o=EUe.call(this,t,e);if(o===void 0){let r=(i=t.localRefs)===null||i===void 0?void 0:i[e],{schemaId:s}=this.opts;r&&(o=new VE({schema:r,schemaId:s,root:t,baseId:A}))}if(o!==void 0)return t.refs[e]=hUe.call(this,o)}$l.resolveRef=uUe;function hUe(t){return(0,Og.inlineRef)(t.schema,this.opts.inlineRefs)?t.schema:t.validate?t:BK.call(this,t)}function Mre(t){for(let A of this._compilations)if(BUe(A,t))return A}$l.getCompilingSchema=Mre;function BUe(t,A){return t.schema===A.schema&&t.root===A.root&&t.baseId===A.baseId}function EUe(t,A){let e;for(;typeof(e=this.refs[A])=="string";)A=e;return e||this.schemas[A]||Rv.call(this,t,A)}function Rv(t,A){let e=this.opts.uriResolver.parse(A),i=(0,Og._getFullPath)(this.opts.uriResolver,e),n=(0,Og.getFullPath)(this.opts.uriResolver,t.baseId,void 0);if(Object.keys(t.schema).length>0&&i===n)return hK.call(this,e,t);let o=(0,Og.normalizeId)(i),r=this.refs[o]||this.schemas[o];if(typeof r=="string"){let s=Rv.call(this,t,r);return typeof s?.schema!="object"?void 0:hK.call(this,e,s)}if(typeof r?.schema=="object"){if(r.validate||BK.call(this,r),o===(0,Og.normalizeId)(A)){let{schema:s}=r,{schemaId:a}=this.opts,c=s[a];return c&&(n=(0,Og.resolveUrl)(this.opts.uriResolver,n,c)),new VE({schema:s,schemaId:a,root:t,baseId:n})}return hK.call(this,e,r)}}$l.resolveSchema=Rv;var fUe=new Set(["properties","patternProperties","enum","dependencies","definitions"]);function hK(t,{baseId:A,schema:e,root:i}){var n;if(((n=t.fragment)===null||n===void 0?void 0:n[0])!=="/")return;for(let s of t.fragment.slice(1).split("/")){if(typeof e=="boolean")return;let a=e[(0,bre.unescapeFragment)(s)];if(a===void 0)return;e=a;let c=typeof e=="object"&&e[this.opts.schemaId];!fUe.has(s)&&c&&(A=(0,Og.resolveUrl)(this.opts.uriResolver,A,c))}let o;if(typeof e!="boolean"&&e.$ref&&!(0,bre.schemaHasRulesButRef)(e,this.RULES)){let s=(0,Og.resolveUrl)(this.opts.uriResolver,A,e.$ref);o=Rv.call(this,i,s)}let{schemaId:r}=this.opts;if(o=o||new VE({schema:e,schemaId:r,root:i,baseId:A}),o.schema!==o.root.schema)return o}});var Sre=XA((fUA,QUe)=>{QUe.exports={$id:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#",description:"Meta-schema for $data reference (JSON AnySchema extension proposal)",type:"object",required:["$data"],properties:{$data:{type:"string",anyOf:[{format:"relative-json-pointer"},{format:"json-pointer"}]}},additionalProperties:!1}});var fK=XA((QUA,Rre)=>{"use strict";var mUe=RegExp.prototype.test.bind(/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/iu),xre=RegExp.prototype.test.bind(/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$/u);function EK(t){let A="",e=0,i=0;for(i=0;i=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102))return"";A+=t[i];break}for(i+=1;i=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102))return"";A+=t[i]}return A}var pUe=RegExp.prototype.test.bind(/[^!"$&'()*+,\-.;=_`a-z{}~]/u);function kre(t){return t.length=0,!0}function wUe(t,A,e){if(t.length){let i=EK(t);if(i!=="")A.push(i);else return e.error=!0,!1;t.length=0}return!0}function yUe(t){let A=0,e={error:!1,address:"",zone:""},i=[],n=[],o=!1,r=!1,s=wUe;for(let a=0;a7){e.error=!0;break}a>0&&t[a-1]===":"&&(o=!0),i.push(":");continue}else if(c==="%"){if(!s(n,i,e))break;s=kre}else{n.push(c);continue}}return n.length&&(s===kre?e.zone=n.join(""):r?i.push(n.join("")):i.push(EK(n))),e.address=i.join(""),e}function _re(t){if(DUe(t,":")<2)return{host:t,isIPV6:!1};let A=yUe(t);if(A.error)return{host:t,isIPV6:!1};{let e=A.address,i=A.address;return A.zone&&(e+="%"+A.zone,i+="%25"+A.zone),{host:e,isIPV6:!0,escapedHost:i}}}function DUe(t,A){let e=0;for(let i=0;i{"use strict";var{isUUID:SUe}=fK(),kUe=/([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-.:;=@]|%[\da-f]{2})+)/iu,xUe=["http","https","ws","wss","urn","urn:uuid"];function _Ue(t){return xUe.indexOf(t)!==-1}function QK(t){return t.secure===!0?!0:t.secure===!1?!1:t.scheme?t.scheme.length===3&&(t.scheme[0]==="w"||t.scheme[0]==="W")&&(t.scheme[1]==="s"||t.scheme[1]==="S")&&(t.scheme[2]==="s"||t.scheme[2]==="S"):!1}function Nre(t){return t.host||(t.error=t.error||"HTTP URIs must have a host."),t}function Lre(t){let A=String(t.scheme).toLowerCase()==="https";return(t.port===(A?443:80)||t.port==="")&&(t.port=void 0),t.path||(t.path="/"),t}function RUe(t){return t.secure=QK(t),t.resourceName=(t.path||"/")+(t.query?"?"+t.query:""),t.path=void 0,t.query=void 0,t}function NUe(t){if((t.port===(QK(t)?443:80)||t.port==="")&&(t.port=void 0),typeof t.secure=="boolean"&&(t.scheme=t.secure?"wss":"ws",t.secure=void 0),t.resourceName){let[A,e]=t.resourceName.split("?");t.path=A&&A!=="/"?A:void 0,t.query=e,t.resourceName=void 0}return t.fragment=void 0,t}function LUe(t,A){if(!t.path)return t.error="URN can not be parsed",t;let e=t.path.match(kUe);if(e){let i=A.scheme||t.scheme||"urn";t.nid=e[1].toLowerCase(),t.nss=e[2];let n=`${i}:${A.nid||t.nid}`,o=mK(n);t.path=void 0,o&&(t=o.parse(t,A))}else t.error=t.error||"URN can not be parsed.";return t}function FUe(t,A){if(t.nid===void 0)throw new Error("URN without nid cannot be serialized");let e=A.scheme||t.scheme||"urn",i=t.nid.toLowerCase(),n=`${e}:${A.nid||i}`,o=mK(n);o&&(t=o.serialize(t,A));let r=t,s=t.nss;return r.path=`${i||A.nid}:${s}`,A.skipEscape=!0,r}function GUe(t,A){let e=t;return e.uuid=e.nss,e.nss=void 0,!A.tolerant&&(!e.uuid||!SUe(e.uuid))&&(e.error=e.error||"UUID is not valid."),e}function KUe(t){let A=t;return A.nss=(t.uuid||"").toLowerCase(),A}var Fre={scheme:"http",domainHost:!0,parse:Nre,serialize:Lre},UUe={scheme:"https",domainHost:Fre.domainHost,parse:Nre,serialize:Lre},Lv={scheme:"ws",domainHost:!0,parse:RUe,serialize:NUe},TUe={scheme:"wss",domainHost:Lv.domainHost,parse:Lv.parse,serialize:Lv.serialize},OUe={scheme:"urn",parse:LUe,serialize:FUe,skipNormalize:!0},JUe={scheme:"urn:uuid",parse:GUe,serialize:KUe,skipNormalize:!0},Fv={http:Fre,https:UUe,ws:Lv,wss:TUe,urn:OUe,"urn:uuid":JUe};Object.setPrototypeOf(Fv,null);function mK(t){return t&&(Fv[t]||Fv[t.toLowerCase()])||void 0}Gre.exports={wsIsSecure:QK,SCHEMES:Fv,isValidSchemeName:_Ue,getSchemeHandler:mK}});var Ore=XA((pUA,Kv)=>{"use strict";var{normalizeIPv6:YUe,removeDotSegments:E3,recomposeAuthority:HUe,normalizeComponentEncoding:Gv,isIPv4:zUe,nonSimpleDomain:PUe}=fK(),{SCHEMES:jUe,getSchemeHandler:Ure}=Kre();function VUe(t,A){return typeof t=="string"?t=Cd(R2(t,A),A):typeof t=="object"&&(t=R2(Cd(t,A),A)),t}function qUe(t,A,e){let i=e?Object.assign({scheme:"null"},e):{scheme:"null"},n=Tre(R2(t,i),R2(A,i),i,!0);return i.skipEscape=!0,Cd(n,i)}function Tre(t,A,e,i){let n={};return i||(t=R2(Cd(t,e),e),A=R2(Cd(A,e),e)),e=e||{},!e.tolerant&&A.scheme?(n.scheme=A.scheme,n.userinfo=A.userinfo,n.host=A.host,n.port=A.port,n.path=E3(A.path||""),n.query=A.query):(A.userinfo!==void 0||A.host!==void 0||A.port!==void 0?(n.userinfo=A.userinfo,n.host=A.host,n.port=A.port,n.path=E3(A.path||""),n.query=A.query):(A.path?(A.path[0]==="/"?n.path=E3(A.path):((t.userinfo!==void 0||t.host!==void 0||t.port!==void 0)&&!t.path?n.path="/"+A.path:t.path?n.path=t.path.slice(0,t.path.lastIndexOf("/")+1)+A.path:n.path=A.path,n.path=E3(n.path)),n.query=A.query):(n.path=t.path,A.query!==void 0?n.query=A.query:n.query=t.query),n.userinfo=t.userinfo,n.host=t.host,n.port=t.port),n.scheme=t.scheme),n.fragment=A.fragment,n}function WUe(t,A,e){return typeof t=="string"?(t=unescape(t),t=Cd(Gv(R2(t,e),!0),_A(ae({},e),{skipEscape:!0}))):typeof t=="object"&&(t=Cd(Gv(t,!0),_A(ae({},e),{skipEscape:!0}))),typeof A=="string"?(A=unescape(A),A=Cd(Gv(R2(A,e),!0),_A(ae({},e),{skipEscape:!0}))):typeof A=="object"&&(A=Cd(Gv(A,!0),_A(ae({},e),{skipEscape:!0}))),t.toLowerCase()===A.toLowerCase()}function Cd(t,A){let e={host:t.host,scheme:t.scheme,userinfo:t.userinfo,port:t.port,path:t.path,query:t.query,nid:t.nid,nss:t.nss,uuid:t.uuid,fragment:t.fragment,reference:t.reference,resourceName:t.resourceName,secure:t.secure,error:""},i=Object.assign({},A),n=[],o=Ure(i.scheme||e.scheme);o&&o.serialize&&o.serialize(e,i),e.path!==void 0&&(i.skipEscape?e.path=unescape(e.path):(e.path=escape(e.path),e.scheme!==void 0&&(e.path=e.path.split("%3A").join(":")))),i.reference!=="suffix"&&e.scheme&&n.push(e.scheme,":");let r=HUe(e);if(r!==void 0&&(i.reference!=="suffix"&&n.push("//"),n.push(r),e.path&&e.path[0]!=="/"&&n.push("/")),e.path!==void 0){let s=e.path;!i.absolutePath&&(!o||!o.absolutePath)&&(s=E3(s)),r===void 0&&s[0]==="/"&&s[1]==="/"&&(s="/%2F"+s.slice(2)),n.push(s)}return e.query!==void 0&&n.push("?",e.query),e.fragment!==void 0&&n.push("#",e.fragment),n.join("")}var ZUe=/^(?:([^#/:?]+):)?(?:\/\/((?:([^#/?@]*)@)?(\[[^#/?\]]+\]|[^#/:?]*)(?::(\d*))?))?([^#?]*)(?:\?([^#]*))?(?:#((?:.|[\n\r])*))?/u;function R2(t,A){let e=Object.assign({},A),i={scheme:void 0,userinfo:void 0,host:"",port:void 0,path:"",query:void 0,fragment:void 0},n=!1;e.reference==="suffix"&&(e.scheme?t=e.scheme+":"+t:t="//"+t);let o=t.match(ZUe);if(o){if(i.scheme=o[1],i.userinfo=o[3],i.host=o[4],i.port=parseInt(o[5],10),i.path=o[6]||"",i.query=o[7],i.fragment=o[8],isNaN(i.port)&&(i.port=o[5]),i.host)if(zUe(i.host)===!1){let a=YUe(i.host);i.host=a.host.toLowerCase(),n=a.isIPV6}else n=!0;i.scheme===void 0&&i.userinfo===void 0&&i.host===void 0&&i.port===void 0&&i.query===void 0&&!i.path?i.reference="same-document":i.scheme===void 0?i.reference="relative":i.fragment===void 0?i.reference="absolute":i.reference="uri",e.reference&&e.reference!=="suffix"&&e.reference!==i.reference&&(i.error=i.error||"URI is not a "+e.reference+" reference.");let r=Ure(e.scheme||i.scheme);if(!e.unicodeSupport&&(!r||!r.unicodeSupport)&&i.host&&(e.domainHost||r&&r.domainHost)&&n===!1&&PUe(i.host))try{i.host=URL.domainToASCII(i.host.toLowerCase())}catch(s){i.error=i.error||"Host's domain name can not be converted to ASCII: "+s}(!r||r&&!r.skipNormalize)&&(t.indexOf("%")!==-1&&(i.scheme!==void 0&&(i.scheme=unescape(i.scheme)),i.host!==void 0&&(i.host=unescape(i.host))),i.path&&(i.path=escape(unescape(i.path))),i.fragment&&(i.fragment=encodeURI(decodeURIComponent(i.fragment)))),r&&r.parse&&r.parse(i,e)}else i.error=i.error||"URI can not be parsed.";return i}var pK={SCHEMES:jUe,normalize:VUe,resolve:qUe,resolveComponent:Tre,equal:WUe,serialize:Cd,parse:R2};Kv.exports=pK;Kv.exports.default=pK;Kv.exports.fastUri=pK});var Yre=XA(wK=>{"use strict";Object.defineProperty(wK,"__esModule",{value:!0});var Jre=Ore();Jre.code='require("ajv/dist/runtime/uri").default';wK.default=Jre});var Zre=XA(sa=>{"use strict";Object.defineProperty(sa,"__esModule",{value:!0});sa.CodeGen=sa.Name=sa.nil=sa.stringify=sa.str=sa._=sa.KeywordCxt=void 0;var XUe=h3();Object.defineProperty(sa,"KeywordCxt",{enumerable:!0,get:function(){return XUe.KeywordCxt}});var qE=hn();Object.defineProperty(sa,"_",{enumerable:!0,get:function(){return qE._}});Object.defineProperty(sa,"str",{enumerable:!0,get:function(){return qE.str}});Object.defineProperty(sa,"stringify",{enumerable:!0,get:function(){return qE.stringify}});Object.defineProperty(sa,"nil",{enumerable:!0,get:function(){return qE.nil}});Object.defineProperty(sa,"Name",{enumerable:!0,get:function(){return qE.Name}});Object.defineProperty(sa,"CodeGen",{enumerable:!0,get:function(){return qE.CodeGen}});var $Ue=_v(),Vre=B3(),eTe=XG(),f3=Nv(),ATe=hn(),Q3=C3(),Uv=d3(),DK=eo(),Hre=Sre(),tTe=Yre(),qre=(t,A)=>new RegExp(t,A);qre.code="new RegExp";var iTe=["removeAdditional","useDefaults","coerceTypes"],nTe=new Set(["validate","serialize","parse","wrapper","root","schema","keyword","pattern","formats","validate$data","func","obj","Error"]),oTe={errorDataPath:"",format:"`validateFormats: false` can be used instead.",nullable:'"nullable" keyword is supported by default.',jsonPointers:"Deprecated jsPropertySyntax can be used instead.",extendRefs:"Deprecated ignoreKeywordsWithRef can be used instead.",missingRefs:"Pass empty schema with $id that should be ignored to ajv.addSchema.",processCode:"Use option `code: {process: (code, schemaEnv: object) => string}`",sourceCode:"Use option `code: {source: true}`",strictDefaults:"It is default now, see option `strict`.",strictKeywords:"It is default now, see option `strict`.",uniqueItems:'"uniqueItems" keyword is always validated.',unknownFormats:"Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).",cache:"Map is used as cache, schema object as key.",serialize:"Map is used as cache, schema object as key.",ajvErrors:"It is default now."},rTe={ignoreKeywordsWithRef:"",jsPropertySyntax:"",unicode:'"minLength"/"maxLength" account for unicode characters by default.'},zre=200;function sTe(t){var A,e,i,n,o,r,s,a,c,l,d,C,I,u,h,B,f,b,k,S,w,_,K,J,O;let H=t.strict,V=(A=t.code)===null||A===void 0?void 0:A.optimize,Z=V===!0||V===void 0?1:V||0,ye=(i=(e=t.code)===null||e===void 0?void 0:e.regExp)!==null&&i!==void 0?i:qre,P=(n=t.uriResolver)!==null&&n!==void 0?n:tTe.default;return{strictSchema:(r=(o=t.strictSchema)!==null&&o!==void 0?o:H)!==null&&r!==void 0?r:!0,strictNumbers:(a=(s=t.strictNumbers)!==null&&s!==void 0?s:H)!==null&&a!==void 0?a:!0,strictTypes:(l=(c=t.strictTypes)!==null&&c!==void 0?c:H)!==null&&l!==void 0?l:"log",strictTuples:(C=(d=t.strictTuples)!==null&&d!==void 0?d:H)!==null&&C!==void 0?C:"log",strictRequired:(u=(I=t.strictRequired)!==null&&I!==void 0?I:H)!==null&&u!==void 0?u:!1,code:t.code?_A(ae({},t.code),{optimize:Z,regExp:ye}):{optimize:Z,regExp:ye},loopRequired:(h=t.loopRequired)!==null&&h!==void 0?h:zre,loopEnum:(B=t.loopEnum)!==null&&B!==void 0?B:zre,meta:(f=t.meta)!==null&&f!==void 0?f:!0,messages:(b=t.messages)!==null&&b!==void 0?b:!0,inlineRefs:(k=t.inlineRefs)!==null&&k!==void 0?k:!0,schemaId:(S=t.schemaId)!==null&&S!==void 0?S:"$id",addUsedSchema:(w=t.addUsedSchema)!==null&&w!==void 0?w:!0,validateSchema:(_=t.validateSchema)!==null&&_!==void 0?_:!0,validateFormats:(K=t.validateFormats)!==null&&K!==void 0?K:!0,unicodeRegExp:(J=t.unicodeRegExp)!==null&&J!==void 0?J:!0,int32range:(O=t.int32range)!==null&&O!==void 0?O:!0,uriResolver:P}}var m3=class{constructor(A={}){this.schemas={},this.refs={},this.formats={},this._compilations=new Set,this._loading={},this._cache=new Map,A=this.opts=ae(ae({},A),sTe(A));let{es5:e,lines:i}=this.opts.code;this.scope=new ATe.ValueScope({scope:{},prefixes:nTe,es5:e,lines:i}),this.logger=CTe(A.logger);let n=A.validateFormats;A.validateFormats=!1,this.RULES=(0,eTe.getRules)(),Pre.call(this,oTe,A,"NOT SUPPORTED"),Pre.call(this,rTe,A,"DEPRECATED","warn"),this._metaOpts=gTe.call(this),A.formats&&cTe.call(this),this._addVocabularies(),this._addDefaultMetaSchema(),A.keywords&&lTe.call(this,A.keywords),typeof A.meta=="object"&&this.addMetaSchema(A.meta),aTe.call(this),A.validateFormats=n}_addVocabularies(){this.addKeyword("$async")}_addDefaultMetaSchema(){let{$data:A,meta:e,schemaId:i}=this.opts,n=Hre;i==="id"&&(n=ae({},Hre),n.id=n.$id,delete n.$id),e&&A&&this.addMetaSchema(n,n[i],!1)}defaultMeta(){let{meta:A,schemaId:e}=this.opts;return this.opts.defaultMeta=typeof A=="object"?A[e]||A:void 0}validate(A,e){let i;if(typeof A=="string"){if(i=this.getSchema(A),!i)throw new Error(`no schema with key or ref "${A}"`)}else i=this.compile(A);let n=i(e);return"$async"in i||(this.errors=i.errors),n}compile(A,e){let i=this._addSchema(A,e);return i.validate||this._compileSchemaEnv(i)}compileAsync(A,e){if(typeof this.opts.loadSchema!="function")throw new Error("options.loadSchema should be a function");let{loadSchema:i}=this.opts;return n.call(this,A,e);function n(l,d){return Ci(this,null,function*(){yield o.call(this,l.$schema);let C=this._addSchema(l,d);return C.validate||r.call(this,C)})}function o(l){return Ci(this,null,function*(){l&&!this.getSchema(l)&&(yield n.call(this,{$ref:l},!0))})}function r(l){return Ci(this,null,function*(){try{return this._compileSchemaEnv(l)}catch(d){if(!(d instanceof Vre.default))throw d;return s.call(this,d),yield a.call(this,d.missingSchema),r.call(this,l)}})}function s({missingSchema:l,missingRef:d}){if(this.refs[l])throw new Error(`AnySchema ${l} is loaded but ${d} cannot be resolved`)}function a(l){return Ci(this,null,function*(){let d=yield c.call(this,l);this.refs[l]||(yield o.call(this,d.$schema)),this.refs[l]||this.addSchema(d,l,e)})}function c(l){return Ci(this,null,function*(){let d=this._loading[l];if(d)return d;try{return yield this._loading[l]=i(l)}finally{delete this._loading[l]}})}}addSchema(A,e,i,n=this.opts.validateSchema){if(Array.isArray(A)){for(let r of A)this.addSchema(r,void 0,i,n);return this}let o;if(typeof A=="object"){let{schemaId:r}=this.opts;if(o=A[r],o!==void 0&&typeof o!="string")throw new Error(`schema ${r} must be string`)}return e=(0,Q3.normalizeId)(e||o),this._checkUnique(e),this.schemas[e]=this._addSchema(A,i,e,n,!0),this}addMetaSchema(A,e,i=this.opts.validateSchema){return this.addSchema(A,e,!0,i),this}validateSchema(A,e){if(typeof A=="boolean")return!0;let i;if(i=A.$schema,i!==void 0&&typeof i!="string")throw new Error("$schema must be a string");if(i=i||this.opts.defaultMeta||this.defaultMeta(),!i)return this.logger.warn("meta-schema not available"),this.errors=null,!0;let n=this.validate(i,A);if(!n&&e){let o="schema is invalid: "+this.errorsText();if(this.opts.validateSchema==="log")this.logger.error(o);else throw new Error(o)}return n}getSchema(A){let e;for(;typeof(e=jre.call(this,A))=="string";)A=e;if(e===void 0){let{schemaId:i}=this.opts,n=new f3.SchemaEnv({schema:{},schemaId:i});if(e=f3.resolveSchema.call(this,n,A),!e)return;this.refs[A]=e}return e.validate||this._compileSchemaEnv(e)}removeSchema(A){if(A instanceof RegExp)return this._removeAllSchemas(this.schemas,A),this._removeAllSchemas(this.refs,A),this;switch(typeof A){case"undefined":return this._removeAllSchemas(this.schemas),this._removeAllSchemas(this.refs),this._cache.clear(),this;case"string":{let e=jre.call(this,A);return typeof e=="object"&&this._cache.delete(e.schema),delete this.schemas[A],delete this.refs[A],this}case"object":{let e=A;this._cache.delete(e);let i=A[this.opts.schemaId];return i&&(i=(0,Q3.normalizeId)(i),delete this.schemas[i],delete this.refs[i]),this}default:throw new Error("ajv.removeSchema: invalid parameter")}}addVocabulary(A){for(let e of A)this.addKeyword(e);return this}addKeyword(A,e){let i;if(typeof A=="string")i=A,typeof e=="object"&&(this.logger.warn("these parameters are deprecated, see docs for addKeyword"),e.keyword=i);else if(typeof A=="object"&&e===void 0){if(e=A,i=e.keyword,Array.isArray(i)&&!i.length)throw new Error("addKeywords: keyword must be string or non-empty array")}else throw new Error("invalid addKeywords parameters");if(uTe.call(this,i,e),!e)return(0,DK.eachItem)(i,o=>yK.call(this,o)),this;BTe.call(this,e);let n=_A(ae({},e),{type:(0,Uv.getJSONTypes)(e.type),schemaType:(0,Uv.getJSONTypes)(e.schemaType)});return(0,DK.eachItem)(i,n.type.length===0?o=>yK.call(this,o,n):o=>n.type.forEach(r=>yK.call(this,o,n,r))),this}getKeyword(A){let e=this.RULES.all[A];return typeof e=="object"?e.definition:!!e}removeKeyword(A){let{RULES:e}=this;delete e.keywords[A],delete e.all[A];for(let i of e.rules){let n=i.rules.findIndex(o=>o.keyword===A);n>=0&&i.rules.splice(n,1)}return this}addFormat(A,e){return typeof e=="string"&&(e=new RegExp(e)),this.formats[A]=e,this}errorsText(A=this.errors,{separator:e=", ",dataVar:i="data"}={}){return!A||A.length===0?"No errors":A.map(n=>`${i}${n.instancePath} ${n.message}`).reduce((n,o)=>n+e+o)}$dataMetaSchema(A,e){let i=this.RULES.all;A=JSON.parse(JSON.stringify(A));for(let n of e){let o=n.split("/").slice(1),r=A;for(let s of o)r=r[s];for(let s in i){let a=i[s];if(typeof a!="object")continue;let{$data:c}=a.definition,l=r[s];c&&l&&(r[s]=Wre(l))}}return A}_removeAllSchemas(A,e){for(let i in A){let n=A[i];(!e||e.test(i))&&(typeof n=="string"?delete A[i]:n&&!n.meta&&(this._cache.delete(n.schema),delete A[i]))}}_addSchema(A,e,i,n=this.opts.validateSchema,o=this.opts.addUsedSchema){let r,{schemaId:s}=this.opts;if(typeof A=="object")r=A[s];else{if(this.opts.jtd)throw new Error("schema must be object");if(typeof A!="boolean")throw new Error("schema must be object or boolean")}let a=this._cache.get(A);if(a!==void 0)return a;i=(0,Q3.normalizeId)(r||i);let c=Q3.getSchemaRefs.call(this,A,i);return a=new f3.SchemaEnv({schema:A,schemaId:s,meta:e,baseId:i,localRefs:c}),this._cache.set(a.schema,a),o&&!i.startsWith("#")&&(i&&this._checkUnique(i),this.refs[i]=a),n&&this.validateSchema(A,!0),a}_checkUnique(A){if(this.schemas[A]||this.refs[A])throw new Error(`schema with key or id "${A}" already exists`)}_compileSchemaEnv(A){if(A.meta?this._compileMetaSchema(A):f3.compileSchema.call(this,A),!A.validate)throw new Error("ajv implementation error");return A.validate}_compileMetaSchema(A){let e=this.opts;this.opts=this._metaOpts;try{f3.compileSchema.call(this,A)}finally{this.opts=e}}};m3.ValidationError=$Ue.default;m3.MissingRefError=Vre.default;sa.default=m3;function Pre(t,A,e,i="error"){for(let n in t){let o=n;o in A&&this.logger[i](`${e}: option ${n}. ${t[o]}`)}}function jre(t){return t=(0,Q3.normalizeId)(t),this.schemas[t]||this.refs[t]}function aTe(){let t=this.opts.schemas;if(t)if(Array.isArray(t))this.addSchema(t);else for(let A in t)this.addSchema(t[A],A)}function cTe(){for(let t in this.opts.formats){let A=this.opts.formats[t];A&&this.addFormat(t,A)}}function lTe(t){if(Array.isArray(t)){this.addVocabulary(t);return}this.logger.warn("keywords option as map is deprecated, pass array");for(let A in t){let e=t[A];e.keyword||(e.keyword=A),this.addKeyword(e)}}function gTe(){let t=ae({},this.opts);for(let A of iTe)delete t[A];return t}var dTe={log(){},warn(){},error(){}};function CTe(t){if(t===!1)return dTe;if(t===void 0)return console;if(t.log&&t.warn&&t.error)return t;throw new Error("logger must implement log, warn and error methods")}var ITe=/^[a-z_$][a-z0-9_$:-]*$/i;function uTe(t,A){let{RULES:e}=this;if((0,DK.eachItem)(t,i=>{if(e.keywords[i])throw new Error(`Keyword ${i} is already defined`);if(!ITe.test(i))throw new Error(`Keyword ${i} has invalid name`)}),!!A&&A.$data&&!("code"in A||"validate"in A))throw new Error('$data keyword must have "code" or "validate" function')}function yK(t,A,e){var i;let n=A?.post;if(e&&n)throw new Error('keyword with "post" flag cannot have "type"');let{RULES:o}=this,r=n?o.post:o.rules.find(({type:a})=>a===e);if(r||(r={type:e,rules:[]},o.rules.push(r)),o.keywords[t]=!0,!A)return;let s={keyword:t,definition:_A(ae({},A),{type:(0,Uv.getJSONTypes)(A.type),schemaType:(0,Uv.getJSONTypes)(A.schemaType)})};A.before?hTe.call(this,r,s,A.before):r.rules.push(s),o.all[t]=s,(i=A.implements)===null||i===void 0||i.forEach(a=>this.addKeyword(a))}function hTe(t,A,e){let i=t.rules.findIndex(n=>n.keyword===e);i>=0?t.rules.splice(i,0,A):(t.rules.push(A),this.logger.warn(`rule ${e} is not defined`))}function BTe(t){let{metaSchema:A}=t;A!==void 0&&(t.$data&&this.opts.$data&&(A=Wre(A)),t.validateSchema=this.compile(A,!0))}var ETe={$ref:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#"};function Wre(t){return{anyOf:[t,ETe]}}});var Xre=XA(vK=>{"use strict";Object.defineProperty(vK,"__esModule",{value:!0});var fTe={keyword:"id",code(){throw new Error('NOT SUPPORTED: keyword "id", use "$id" for schema ID')}};vK.default=fTe});var tse=XA(ku=>{"use strict";Object.defineProperty(ku,"__esModule",{value:!0});ku.callRef=ku.getValidate=void 0;var QTe=B3(),$re=Xl(),Nc=hn(),WE=x2(),ese=Nv(),Tv=eo(),mTe={keyword:"$ref",schemaType:"string",code(t){let{gen:A,schema:e,it:i}=t,{baseId:n,schemaEnv:o,validateName:r,opts:s,self:a}=i,{root:c}=o;if((e==="#"||e==="#/")&&n===c.baseId)return d();let l=ese.resolveRef.call(a,c,n,e);if(l===void 0)throw new QTe.default(i.opts.uriResolver,n,e);if(l instanceof ese.SchemaEnv)return C(l);return I(l);function d(){if(o===c)return Ov(t,r,o,o.$async);let u=A.scopeValue("root",{ref:c});return Ov(t,(0,Nc._)`${u}.validate`,c,c.$async)}function C(u){let h=Ase(t,u);Ov(t,h,u,u.$async)}function I(u){let h=A.scopeValue("schema",s.code.source===!0?{ref:u,code:(0,Nc.stringify)(u)}:{ref:u}),B=A.name("valid"),f=t.subschema({schema:u,dataTypes:[],schemaPath:Nc.nil,topSchemaRef:h,errSchemaPath:e},B);t.mergeEvaluated(f),t.ok(B)}}};function Ase(t,A){let{gen:e}=t;return A.validate?e.scopeValue("validate",{ref:A.validate}):(0,Nc._)`${e.scopeValue("wrapper",{ref:A})}.validate`}ku.getValidate=Ase;function Ov(t,A,e,i){let{gen:n,it:o}=t,{allErrors:r,schemaEnv:s,opts:a}=o,c=a.passContext?WE.default.this:Nc.nil;i?l():d();function l(){if(!s.$async)throw new Error("async schema referenced by sync schema");let u=n.let("valid");n.try(()=>{n.code((0,Nc._)`await ${(0,$re.callValidateCode)(t,A,c)}`),I(A),r||n.assign(u,!0)},h=>{n.if((0,Nc._)`!(${h} instanceof ${o.ValidationError})`,()=>n.throw(h)),C(h),r||n.assign(u,!1)}),t.ok(u)}function d(){t.result((0,$re.callValidateCode)(t,A,c),()=>I(A),()=>C(A))}function C(u){let h=(0,Nc._)`${u}.errors`;n.assign(WE.default.vErrors,(0,Nc._)`${WE.default.vErrors} === null ? ${h} : ${WE.default.vErrors}.concat(${h})`),n.assign(WE.default.errors,(0,Nc._)`${WE.default.vErrors}.length`)}function I(u){var h;if(!o.opts.unevaluated)return;let B=(h=e?.validate)===null||h===void 0?void 0:h.evaluated;if(o.props!==!0)if(B&&!B.dynamicProps)B.props!==void 0&&(o.props=Tv.mergeEvaluated.props(n,B.props,o.props));else{let f=n.var("props",(0,Nc._)`${u}.evaluated.props`);o.props=Tv.mergeEvaluated.props(n,f,o.props,Nc.Name)}if(o.items!==!0)if(B&&!B.dynamicItems)B.items!==void 0&&(o.items=Tv.mergeEvaluated.items(n,B.items,o.items));else{let f=n.var("items",(0,Nc._)`${u}.evaluated.items`);o.items=Tv.mergeEvaluated.items(n,f,o.items,Nc.Name)}}}ku.callRef=Ov;ku.default=mTe});var ise=XA(bK=>{"use strict";Object.defineProperty(bK,"__esModule",{value:!0});var pTe=Xre(),wTe=tse(),yTe=["$schema","$id","$defs","$vocabulary",{keyword:"$comment"},"definitions",pTe.default,wTe.default];bK.default=yTe});var nse=XA(MK=>{"use strict";Object.defineProperty(MK,"__esModule",{value:!0});var Jv=hn(),wC=Jv.operators,Yv={maximum:{okStr:"<=",ok:wC.LTE,fail:wC.GT},minimum:{okStr:">=",ok:wC.GTE,fail:wC.LT},exclusiveMaximum:{okStr:"<",ok:wC.LT,fail:wC.GTE},exclusiveMinimum:{okStr:">",ok:wC.GT,fail:wC.LTE}},DTe={message:({keyword:t,schemaCode:A})=>(0,Jv.str)`must be ${Yv[t].okStr} ${A}`,params:({keyword:t,schemaCode:A})=>(0,Jv._)`{comparison: ${Yv[t].okStr}, limit: ${A}}`},vTe={keyword:Object.keys(Yv),type:"number",schemaType:"number",$data:!0,error:DTe,code(t){let{keyword:A,data:e,schemaCode:i}=t;t.fail$data((0,Jv._)`${e} ${Yv[A].fail} ${i} || isNaN(${e})`)}};MK.default=vTe});var ose=XA(SK=>{"use strict";Object.defineProperty(SK,"__esModule",{value:!0});var p3=hn(),bTe={message:({schemaCode:t})=>(0,p3.str)`must be multiple of ${t}`,params:({schemaCode:t})=>(0,p3._)`{multipleOf: ${t}}`},MTe={keyword:"multipleOf",type:"number",schemaType:"number",$data:!0,error:bTe,code(t){let{gen:A,data:e,schemaCode:i,it:n}=t,o=n.opts.multipleOfPrecision,r=A.let("res"),s=o?(0,p3._)`Math.abs(Math.round(${r}) - ${r}) > 1e-${o}`:(0,p3._)`${r} !== parseInt(${r})`;t.fail$data((0,p3._)`(${i} === 0 || (${r} = ${e}/${i}, ${s}))`)}};SK.default=MTe});var sse=XA(kK=>{"use strict";Object.defineProperty(kK,"__esModule",{value:!0});function rse(t){let A=t.length,e=0,i=0,n;for(;i=55296&&n<=56319&&i{"use strict";Object.defineProperty(xK,"__esModule",{value:!0});var xu=hn(),STe=eo(),kTe=sse(),xTe={message({keyword:t,schemaCode:A}){let e=t==="maxLength"?"more":"fewer";return(0,xu.str)`must NOT have ${e} than ${A} characters`},params:({schemaCode:t})=>(0,xu._)`{limit: ${t}}`},_Te={keyword:["maxLength","minLength"],type:"string",schemaType:"number",$data:!0,error:xTe,code(t){let{keyword:A,data:e,schemaCode:i,it:n}=t,o=A==="maxLength"?xu.operators.GT:xu.operators.LT,r=n.opts.unicode===!1?(0,xu._)`${e}.length`:(0,xu._)`${(0,STe.useFunc)(t.gen,kTe.default)}(${e})`;t.fail$data((0,xu._)`${r} ${o} ${i}`)}};xK.default=_Te});var cse=XA(_K=>{"use strict";Object.defineProperty(_K,"__esModule",{value:!0});var RTe=Xl(),Hv=hn(),NTe={message:({schemaCode:t})=>(0,Hv.str)`must match pattern "${t}"`,params:({schemaCode:t})=>(0,Hv._)`{pattern: ${t}}`},LTe={keyword:"pattern",type:"string",schemaType:"string",$data:!0,error:NTe,code(t){let{data:A,$data:e,schema:i,schemaCode:n,it:o}=t,r=o.opts.unicodeRegExp?"u":"",s=e?(0,Hv._)`(new RegExp(${n}, ${r}))`:(0,RTe.usePattern)(t,i);t.fail$data((0,Hv._)`!${s}.test(${A})`)}};_K.default=LTe});var lse=XA(RK=>{"use strict";Object.defineProperty(RK,"__esModule",{value:!0});var w3=hn(),FTe={message({keyword:t,schemaCode:A}){let e=t==="maxProperties"?"more":"fewer";return(0,w3.str)`must NOT have ${e} than ${A} properties`},params:({schemaCode:t})=>(0,w3._)`{limit: ${t}}`},GTe={keyword:["maxProperties","minProperties"],type:"object",schemaType:"number",$data:!0,error:FTe,code(t){let{keyword:A,data:e,schemaCode:i}=t,n=A==="maxProperties"?w3.operators.GT:w3.operators.LT;t.fail$data((0,w3._)`Object.keys(${e}).length ${n} ${i}`)}};RK.default=GTe});var gse=XA(NK=>{"use strict";Object.defineProperty(NK,"__esModule",{value:!0});var y3=Xl(),D3=hn(),KTe=eo(),UTe={message:({params:{missingProperty:t}})=>(0,D3.str)`must have required property '${t}'`,params:({params:{missingProperty:t}})=>(0,D3._)`{missingProperty: ${t}}`},TTe={keyword:"required",type:"object",schemaType:"array",$data:!0,error:UTe,code(t){let{gen:A,schema:e,schemaCode:i,data:n,$data:o,it:r}=t,{opts:s}=r;if(!o&&e.length===0)return;let a=e.length>=s.loopRequired;if(r.allErrors?c():l(),s.strictRequired){let I=t.parentSchema.properties,{definedProperties:u}=t.it;for(let h of e)if(I?.[h]===void 0&&!u.has(h)){let B=r.schemaEnv.baseId+r.errSchemaPath,f=`required property "${h}" is not defined at "${B}" (strictRequired)`;(0,KTe.checkStrictMode)(r,f,r.opts.strictRequired)}}function c(){if(a||o)t.block$data(D3.nil,d);else for(let I of e)(0,y3.checkReportMissingProp)(t,I)}function l(){let I=A.let("missing");if(a||o){let u=A.let("valid",!0);t.block$data(u,()=>C(I,u)),t.ok(u)}else A.if((0,y3.checkMissingProp)(t,e,I)),(0,y3.reportMissingProp)(t,I),A.else()}function d(){A.forOf("prop",i,I=>{t.setParams({missingProperty:I}),A.if((0,y3.noPropertyInData)(A,n,I,s.ownProperties),()=>t.error())})}function C(I,u){t.setParams({missingProperty:I}),A.forOf(I,i,()=>{A.assign(u,(0,y3.propertyInData)(A,n,I,s.ownProperties)),A.if((0,D3.not)(u),()=>{t.error(),A.break()})},D3.nil)}}};NK.default=TTe});var dse=XA(LK=>{"use strict";Object.defineProperty(LK,"__esModule",{value:!0});var v3=hn(),OTe={message({keyword:t,schemaCode:A}){let e=t==="maxItems"?"more":"fewer";return(0,v3.str)`must NOT have ${e} than ${A} items`},params:({schemaCode:t})=>(0,v3._)`{limit: ${t}}`},JTe={keyword:["maxItems","minItems"],type:"array",schemaType:"number",$data:!0,error:OTe,code(t){let{keyword:A,data:e,schemaCode:i}=t,n=A==="maxItems"?v3.operators.GT:v3.operators.LT;t.fail$data((0,v3._)`${e}.length ${n} ${i}`)}};LK.default=JTe});var zv=XA(FK=>{"use strict";Object.defineProperty(FK,"__esModule",{value:!0});var Cse=rK();Cse.code='require("ajv/dist/runtime/equal").default';FK.default=Cse});var Ise=XA(KK=>{"use strict";Object.defineProperty(KK,"__esModule",{value:!0});var GK=d3(),aa=hn(),YTe=eo(),HTe=zv(),zTe={message:({params:{i:t,j:A}})=>(0,aa.str)`must NOT have duplicate items (items ## ${A} and ${t} are identical)`,params:({params:{i:t,j:A}})=>(0,aa._)`{i: ${t}, j: ${A}}`},PTe={keyword:"uniqueItems",type:"array",schemaType:"boolean",$data:!0,error:zTe,code(t){let{gen:A,data:e,$data:i,schema:n,parentSchema:o,schemaCode:r,it:s}=t;if(!i&&!n)return;let a=A.let("valid"),c=o.items?(0,GK.getSchemaTypes)(o.items):[];t.block$data(a,l,(0,aa._)`${r} === false`),t.ok(a);function l(){let u=A.let("i",(0,aa._)`${e}.length`),h=A.let("j");t.setParams({i:u,j:h}),A.assign(a,!0),A.if((0,aa._)`${u} > 1`,()=>(d()?C:I)(u,h))}function d(){return c.length>0&&!c.some(u=>u==="object"||u==="array")}function C(u,h){let B=A.name("item"),f=(0,GK.checkDataTypes)(c,B,s.opts.strictNumbers,GK.DataType.Wrong),b=A.const("indices",(0,aa._)`{}`);A.for((0,aa._)`;${u}--;`,()=>{A.let(B,(0,aa._)`${e}[${u}]`),A.if(f,(0,aa._)`continue`),c.length>1&&A.if((0,aa._)`typeof ${B} == "string"`,(0,aa._)`${B} += "_"`),A.if((0,aa._)`typeof ${b}[${B}] == "number"`,()=>{A.assign(h,(0,aa._)`${b}[${B}]`),t.error(),A.assign(a,!1).break()}).code((0,aa._)`${b}[${B}] = ${u}`)})}function I(u,h){let B=(0,YTe.useFunc)(A,HTe.default),f=A.name("outer");A.label(f).for((0,aa._)`;${u}--;`,()=>A.for((0,aa._)`${h} = ${u}; ${h}--;`,()=>A.if((0,aa._)`${B}(${e}[${u}], ${e}[${h}])`,()=>{t.error(),A.assign(a,!1).break(f)})))}}};KK.default=PTe});var use=XA(TK=>{"use strict";Object.defineProperty(TK,"__esModule",{value:!0});var UK=hn(),jTe=eo(),VTe=zv(),qTe={message:"must be equal to constant",params:({schemaCode:t})=>(0,UK._)`{allowedValue: ${t}}`},WTe={keyword:"const",$data:!0,error:qTe,code(t){let{gen:A,data:e,$data:i,schemaCode:n,schema:o}=t;i||o&&typeof o=="object"?t.fail$data((0,UK._)`!${(0,jTe.useFunc)(A,VTe.default)}(${e}, ${n})`):t.fail((0,UK._)`${o} !== ${e}`)}};TK.default=WTe});var hse=XA(OK=>{"use strict";Object.defineProperty(OK,"__esModule",{value:!0});var b3=hn(),ZTe=eo(),XTe=zv(),$Te={message:"must be equal to one of the allowed values",params:({schemaCode:t})=>(0,b3._)`{allowedValues: ${t}}`},eOe={keyword:"enum",schemaType:"array",$data:!0,error:$Te,code(t){let{gen:A,data:e,$data:i,schema:n,schemaCode:o,it:r}=t;if(!i&&n.length===0)throw new Error("enum must have non-empty array");let s=n.length>=r.opts.loopEnum,a,c=()=>a??(a=(0,ZTe.useFunc)(A,XTe.default)),l;if(s||i)l=A.let("valid"),t.block$data(l,d);else{if(!Array.isArray(n))throw new Error("ajv implementation error");let I=A.const("vSchema",o);l=(0,b3.or)(...n.map((u,h)=>C(I,h)))}t.pass(l);function d(){A.assign(l,!1),A.forOf("v",o,I=>A.if((0,b3._)`${c()}(${e}, ${I})`,()=>A.assign(l,!0).break()))}function C(I,u){let h=n[u];return typeof h=="object"&&h!==null?(0,b3._)`${c()}(${e}, ${I}[${u}])`:(0,b3._)`${e} === ${h}`}}};OK.default=eOe});var Bse=XA(JK=>{"use strict";Object.defineProperty(JK,"__esModule",{value:!0});var AOe=nse(),tOe=ose(),iOe=ase(),nOe=cse(),oOe=lse(),rOe=gse(),sOe=dse(),aOe=Ise(),cOe=use(),lOe=hse(),gOe=[AOe.default,tOe.default,iOe.default,nOe.default,oOe.default,rOe.default,sOe.default,aOe.default,{keyword:"type",schemaType:["string","array"]},{keyword:"nullable",schemaType:"boolean"},cOe.default,lOe.default];JK.default=gOe});var HK=XA(M3=>{"use strict";Object.defineProperty(M3,"__esModule",{value:!0});M3.validateAdditionalItems=void 0;var _u=hn(),YK=eo(),dOe={message:({params:{len:t}})=>(0,_u.str)`must NOT have more than ${t} items`,params:({params:{len:t}})=>(0,_u._)`{limit: ${t}}`},COe={keyword:"additionalItems",type:"array",schemaType:["boolean","object"],before:"uniqueItems",error:dOe,code(t){let{parentSchema:A,it:e}=t,{items:i}=A;if(!Array.isArray(i)){(0,YK.checkStrictMode)(e,'"additionalItems" is ignored when "items" is not an array of schemas');return}Ese(t,i)}};function Ese(t,A){let{gen:e,schema:i,data:n,keyword:o,it:r}=t;r.items=!0;let s=e.const("len",(0,_u._)`${n}.length`);if(i===!1)t.setParams({len:A.length}),t.pass((0,_u._)`${s} <= ${A.length}`);else if(typeof i=="object"&&!(0,YK.alwaysValidSchema)(r,i)){let c=e.var("valid",(0,_u._)`${s} <= ${A.length}`);e.if((0,_u.not)(c),()=>a(c)),t.ok(c)}function a(c){e.forRange("i",A.length,s,l=>{t.subschema({keyword:o,dataProp:l,dataPropType:YK.Type.Num},c),r.allErrors||e.if((0,_u.not)(c),()=>e.break())})}}M3.validateAdditionalItems=Ese;M3.default=COe});var zK=XA(S3=>{"use strict";Object.defineProperty(S3,"__esModule",{value:!0});S3.validateTuple=void 0;var fse=hn(),Pv=eo(),IOe=Xl(),uOe={keyword:"items",type:"array",schemaType:["object","array","boolean"],before:"uniqueItems",code(t){let{schema:A,it:e}=t;if(Array.isArray(A))return Qse(t,"additionalItems",A);e.items=!0,!(0,Pv.alwaysValidSchema)(e,A)&&t.ok((0,IOe.validateArray)(t))}};function Qse(t,A,e=t.schema){let{gen:i,parentSchema:n,data:o,keyword:r,it:s}=t;l(n),s.opts.unevaluated&&e.length&&s.items!==!0&&(s.items=Pv.mergeEvaluated.items(i,e.length,s.items));let a=i.name("valid"),c=i.const("len",(0,fse._)`${o}.length`);e.forEach((d,C)=>{(0,Pv.alwaysValidSchema)(s,d)||(i.if((0,fse._)`${c} > ${C}`,()=>t.subschema({keyword:r,schemaProp:C,dataProp:C},a)),t.ok(a))});function l(d){let{opts:C,errSchemaPath:I}=s,u=e.length,h=u===d.minItems&&(u===d.maxItems||d[A]===!1);if(C.strictTuples&&!h){let B=`"${r}" is ${u}-tuple, but minItems or maxItems/${A} are not specified or different at path "${I}"`;(0,Pv.checkStrictMode)(s,B,C.strictTuples)}}}S3.validateTuple=Qse;S3.default=uOe});var mse=XA(PK=>{"use strict";Object.defineProperty(PK,"__esModule",{value:!0});var hOe=zK(),BOe={keyword:"prefixItems",type:"array",schemaType:["array"],before:"uniqueItems",code:t=>(0,hOe.validateTuple)(t,"items")};PK.default=BOe});var wse=XA(jK=>{"use strict";Object.defineProperty(jK,"__esModule",{value:!0});var pse=hn(),EOe=eo(),fOe=Xl(),QOe=HK(),mOe={message:({params:{len:t}})=>(0,pse.str)`must NOT have more than ${t} items`,params:({params:{len:t}})=>(0,pse._)`{limit: ${t}}`},pOe={keyword:"items",type:"array",schemaType:["object","boolean"],before:"uniqueItems",error:mOe,code(t){let{schema:A,parentSchema:e,it:i}=t,{prefixItems:n}=e;i.items=!0,!(0,EOe.alwaysValidSchema)(i,A)&&(n?(0,QOe.validateAdditionalItems)(t,n):t.ok((0,fOe.validateArray)(t)))}};jK.default=pOe});var yse=XA(VK=>{"use strict";Object.defineProperty(VK,"__esModule",{value:!0});var eg=hn(),jv=eo(),wOe={message:({params:{min:t,max:A}})=>A===void 0?(0,eg.str)`must contain at least ${t} valid item(s)`:(0,eg.str)`must contain at least ${t} and no more than ${A} valid item(s)`,params:({params:{min:t,max:A}})=>A===void 0?(0,eg._)`{minContains: ${t}}`:(0,eg._)`{minContains: ${t}, maxContains: ${A}}`},yOe={keyword:"contains",type:"array",schemaType:["object","boolean"],before:"uniqueItems",trackErrors:!0,error:wOe,code(t){let{gen:A,schema:e,parentSchema:i,data:n,it:o}=t,r,s,{minContains:a,maxContains:c}=i;o.opts.next?(r=a===void 0?1:a,s=c):r=1;let l=A.const("len",(0,eg._)`${n}.length`);if(t.setParams({min:r,max:s}),s===void 0&&r===0){(0,jv.checkStrictMode)(o,'"minContains" == 0 without "maxContains": "contains" keyword ignored');return}if(s!==void 0&&r>s){(0,jv.checkStrictMode)(o,'"minContains" > "maxContains" is always invalid'),t.fail();return}if((0,jv.alwaysValidSchema)(o,e)){let h=(0,eg._)`${l} >= ${r}`;s!==void 0&&(h=(0,eg._)`${h} && ${l} <= ${s}`),t.pass(h);return}o.items=!0;let d=A.name("valid");s===void 0&&r===1?I(d,()=>A.if(d,()=>A.break())):r===0?(A.let(d,!0),s!==void 0&&A.if((0,eg._)`${n}.length > 0`,C)):(A.let(d,!1),C()),t.result(d,()=>t.reset());function C(){let h=A.name("_valid"),B=A.let("count",0);I(h,()=>A.if(h,()=>u(B)))}function I(h,B){A.forRange("i",0,l,f=>{t.subschema({keyword:"contains",dataProp:f,dataPropType:jv.Type.Num,compositeRule:!0},h),B()})}function u(h){A.code((0,eg._)`${h}++`),s===void 0?A.if((0,eg._)`${h} >= ${r}`,()=>A.assign(d,!0).break()):(A.if((0,eg._)`${h} > ${s}`,()=>A.assign(d,!1).break()),r===1?A.assign(d,!0):A.if((0,eg._)`${h} >= ${r}`,()=>A.assign(d,!0)))}}};VK.default=yOe});var bse=XA(Id=>{"use strict";Object.defineProperty(Id,"__esModule",{value:!0});Id.validateSchemaDeps=Id.validatePropertyDeps=Id.error=void 0;var qK=hn(),DOe=eo(),k3=Xl();Id.error={message:({params:{property:t,depsCount:A,deps:e}})=>{let i=A===1?"property":"properties";return(0,qK.str)`must have ${i} ${e} when property ${t} is present`},params:({params:{property:t,depsCount:A,deps:e,missingProperty:i}})=>(0,qK._)`{property: ${t}, + missingProperty: ${i}, + depsCount: ${A}, + deps: ${e}}`};var vOe={keyword:"dependencies",type:"object",schemaType:"object",error:Id.error,code(t){let[A,e]=bOe(t);Dse(t,A),vse(t,e)}};function bOe({schema:t}){let A={},e={};for(let i in t){if(i==="__proto__")continue;let n=Array.isArray(t[i])?A:e;n[i]=t[i]}return[A,e]}function Dse(t,A=t.schema){let{gen:e,data:i,it:n}=t;if(Object.keys(A).length===0)return;let o=e.let("missing");for(let r in A){let s=A[r];if(s.length===0)continue;let a=(0,k3.propertyInData)(e,i,r,n.opts.ownProperties);t.setParams({property:r,depsCount:s.length,deps:s.join(", ")}),n.allErrors?e.if(a,()=>{for(let c of s)(0,k3.checkReportMissingProp)(t,c)}):(e.if((0,qK._)`${a} && (${(0,k3.checkMissingProp)(t,s,o)})`),(0,k3.reportMissingProp)(t,o),e.else())}}Id.validatePropertyDeps=Dse;function vse(t,A=t.schema){let{gen:e,data:i,keyword:n,it:o}=t,r=e.name("valid");for(let s in A)(0,DOe.alwaysValidSchema)(o,A[s])||(e.if((0,k3.propertyInData)(e,i,s,o.opts.ownProperties),()=>{let a=t.subschema({keyword:n,schemaProp:s},r);t.mergeValidEvaluated(a,r)},()=>e.var(r,!0)),t.ok(r))}Id.validateSchemaDeps=vse;Id.default=vOe});var Sse=XA(WK=>{"use strict";Object.defineProperty(WK,"__esModule",{value:!0});var Mse=hn(),MOe=eo(),SOe={message:"property name must be valid",params:({params:t})=>(0,Mse._)`{propertyName: ${t.propertyName}}`},kOe={keyword:"propertyNames",type:"object",schemaType:["object","boolean"],error:SOe,code(t){let{gen:A,schema:e,data:i,it:n}=t;if((0,MOe.alwaysValidSchema)(n,e))return;let o=A.name("valid");A.forIn("key",i,r=>{t.setParams({propertyName:r}),t.subschema({keyword:"propertyNames",data:r,dataTypes:["string"],propertyName:r,compositeRule:!0},o),A.if((0,Mse.not)(o),()=>{t.error(!0),n.allErrors||A.break()})}),t.ok(o)}};WK.default=kOe});var XK=XA(ZK=>{"use strict";Object.defineProperty(ZK,"__esModule",{value:!0});var Vv=Xl(),Jg=hn(),xOe=x2(),qv=eo(),_Oe={message:"must NOT have additional properties",params:({params:t})=>(0,Jg._)`{additionalProperty: ${t.additionalProperty}}`},ROe={keyword:"additionalProperties",type:["object"],schemaType:["boolean","object"],allowUndefined:!0,trackErrors:!0,error:_Oe,code(t){let{gen:A,schema:e,parentSchema:i,data:n,errsCount:o,it:r}=t;if(!o)throw new Error("ajv implementation error");let{allErrors:s,opts:a}=r;if(r.props=!0,a.removeAdditional!=="all"&&(0,qv.alwaysValidSchema)(r,e))return;let c=(0,Vv.allSchemaProperties)(i.properties),l=(0,Vv.allSchemaProperties)(i.patternProperties);d(),t.ok((0,Jg._)`${o} === ${xOe.default.errors}`);function d(){A.forIn("key",n,B=>{!c.length&&!l.length?u(B):A.if(C(B),()=>u(B))})}function C(B){let f;if(c.length>8){let b=(0,qv.schemaRefOrVal)(r,i.properties,"properties");f=(0,Vv.isOwnProperty)(A,b,B)}else c.length?f=(0,Jg.or)(...c.map(b=>(0,Jg._)`${B} === ${b}`)):f=Jg.nil;return l.length&&(f=(0,Jg.or)(f,...l.map(b=>(0,Jg._)`${(0,Vv.usePattern)(t,b)}.test(${B})`))),(0,Jg.not)(f)}function I(B){A.code((0,Jg._)`delete ${n}[${B}]`)}function u(B){if(a.removeAdditional==="all"||a.removeAdditional&&e===!1){I(B);return}if(e===!1){t.setParams({additionalProperty:B}),t.error(),s||A.break();return}if(typeof e=="object"&&!(0,qv.alwaysValidSchema)(r,e)){let f=A.name("valid");a.removeAdditional==="failing"?(h(B,f,!1),A.if((0,Jg.not)(f),()=>{t.reset(),I(B)})):(h(B,f),s||A.if((0,Jg.not)(f),()=>A.break()))}}function h(B,f,b){let k={keyword:"additionalProperties",dataProp:B,dataPropType:qv.Type.Str};b===!1&&Object.assign(k,{compositeRule:!0,createErrors:!1,allErrors:!1}),t.subschema(k,f)}}};ZK.default=ROe});var _se=XA(eU=>{"use strict";Object.defineProperty(eU,"__esModule",{value:!0});var NOe=h3(),kse=Xl(),$K=eo(),xse=XK(),LOe={keyword:"properties",type:"object",schemaType:"object",code(t){let{gen:A,schema:e,parentSchema:i,data:n,it:o}=t;o.opts.removeAdditional==="all"&&i.additionalProperties===void 0&&xse.default.code(new NOe.KeywordCxt(o,xse.default,"additionalProperties"));let r=(0,kse.allSchemaProperties)(e);for(let d of r)o.definedProperties.add(d);o.opts.unevaluated&&r.length&&o.props!==!0&&(o.props=$K.mergeEvaluated.props(A,(0,$K.toHash)(r),o.props));let s=r.filter(d=>!(0,$K.alwaysValidSchema)(o,e[d]));if(s.length===0)return;let a=A.name("valid");for(let d of s)c(d)?l(d):(A.if((0,kse.propertyInData)(A,n,d,o.opts.ownProperties)),l(d),o.allErrors||A.else().var(a,!0),A.endIf()),t.it.definedProperties.add(d),t.ok(a);function c(d){return o.opts.useDefaults&&!o.compositeRule&&e[d].default!==void 0}function l(d){t.subschema({keyword:"properties",schemaProp:d,dataProp:d},a)}}};eU.default=LOe});var Fse=XA(AU=>{"use strict";Object.defineProperty(AU,"__esModule",{value:!0});var Rse=Xl(),Wv=hn(),Nse=eo(),Lse=eo(),FOe={keyword:"patternProperties",type:"object",schemaType:"object",code(t){let{gen:A,schema:e,data:i,parentSchema:n,it:o}=t,{opts:r}=o,s=(0,Rse.allSchemaProperties)(e),a=s.filter(h=>(0,Nse.alwaysValidSchema)(o,e[h]));if(s.length===0||a.length===s.length&&(!o.opts.unevaluated||o.props===!0))return;let c=r.strictSchema&&!r.allowMatchingProperties&&n.properties,l=A.name("valid");o.props!==!0&&!(o.props instanceof Wv.Name)&&(o.props=(0,Lse.evaluatedPropsToName)(A,o.props));let{props:d}=o;C();function C(){for(let h of s)c&&I(h),o.allErrors?u(h):(A.var(l,!0),u(h),A.if(l))}function I(h){for(let B in c)new RegExp(h).test(B)&&(0,Nse.checkStrictMode)(o,`property ${B} matches pattern ${h} (use allowMatchingProperties)`)}function u(h){A.forIn("key",i,B=>{A.if((0,Wv._)`${(0,Rse.usePattern)(t,h)}.test(${B})`,()=>{let f=a.includes(h);f||t.subschema({keyword:"patternProperties",schemaProp:h,dataProp:B,dataPropType:Lse.Type.Str},l),o.opts.unevaluated&&d!==!0?A.assign((0,Wv._)`${d}[${B}]`,!0):!f&&!o.allErrors&&A.if((0,Wv.not)(l),()=>A.break())})})}}};AU.default=FOe});var Gse=XA(tU=>{"use strict";Object.defineProperty(tU,"__esModule",{value:!0});var GOe=eo(),KOe={keyword:"not",schemaType:["object","boolean"],trackErrors:!0,code(t){let{gen:A,schema:e,it:i}=t;if((0,GOe.alwaysValidSchema)(i,e)){t.fail();return}let n=A.name("valid");t.subschema({keyword:"not",compositeRule:!0,createErrors:!1,allErrors:!1},n),t.failResult(n,()=>t.reset(),()=>t.error())},error:{message:"must NOT be valid"}};tU.default=KOe});var Kse=XA(iU=>{"use strict";Object.defineProperty(iU,"__esModule",{value:!0});var UOe=Xl(),TOe={keyword:"anyOf",schemaType:"array",trackErrors:!0,code:UOe.validateUnion,error:{message:"must match a schema in anyOf"}};iU.default=TOe});var Use=XA(nU=>{"use strict";Object.defineProperty(nU,"__esModule",{value:!0});var Zv=hn(),OOe=eo(),JOe={message:"must match exactly one schema in oneOf",params:({params:t})=>(0,Zv._)`{passingSchemas: ${t.passing}}`},YOe={keyword:"oneOf",schemaType:"array",trackErrors:!0,error:JOe,code(t){let{gen:A,schema:e,parentSchema:i,it:n}=t;if(!Array.isArray(e))throw new Error("ajv implementation error");if(n.opts.discriminator&&i.discriminator)return;let o=e,r=A.let("valid",!1),s=A.let("passing",null),a=A.name("_valid");t.setParams({passing:s}),A.block(c),t.result(r,()=>t.reset(),()=>t.error(!0));function c(){o.forEach((l,d)=>{let C;(0,OOe.alwaysValidSchema)(n,l)?A.var(a,!0):C=t.subschema({keyword:"oneOf",schemaProp:d,compositeRule:!0},a),d>0&&A.if((0,Zv._)`${a} && ${r}`).assign(r,!1).assign(s,(0,Zv._)`[${s}, ${d}]`).else(),A.if(a,()=>{A.assign(r,!0),A.assign(s,d),C&&t.mergeEvaluated(C,Zv.Name)})})}}};nU.default=YOe});var Tse=XA(oU=>{"use strict";Object.defineProperty(oU,"__esModule",{value:!0});var HOe=eo(),zOe={keyword:"allOf",schemaType:"array",code(t){let{gen:A,schema:e,it:i}=t;if(!Array.isArray(e))throw new Error("ajv implementation error");let n=A.name("valid");e.forEach((o,r)=>{if((0,HOe.alwaysValidSchema)(i,o))return;let s=t.subschema({keyword:"allOf",schemaProp:r},n);t.ok(n),t.mergeEvaluated(s)})}};oU.default=zOe});var Yse=XA(rU=>{"use strict";Object.defineProperty(rU,"__esModule",{value:!0});var Xv=hn(),Jse=eo(),POe={message:({params:t})=>(0,Xv.str)`must match "${t.ifClause}" schema`,params:({params:t})=>(0,Xv._)`{failingKeyword: ${t.ifClause}}`},jOe={keyword:"if",schemaType:["object","boolean"],trackErrors:!0,error:POe,code(t){let{gen:A,parentSchema:e,it:i}=t;e.then===void 0&&e.else===void 0&&(0,Jse.checkStrictMode)(i,'"if" without "then" and "else" is ignored');let n=Ose(i,"then"),o=Ose(i,"else");if(!n&&!o)return;let r=A.let("valid",!0),s=A.name("_valid");if(a(),t.reset(),n&&o){let l=A.let("ifClause");t.setParams({ifClause:l}),A.if(s,c("then",l),c("else",l))}else n?A.if(s,c("then")):A.if((0,Xv.not)(s),c("else"));t.pass(r,()=>t.error(!0));function a(){let l=t.subschema({keyword:"if",compositeRule:!0,createErrors:!1,allErrors:!1},s);t.mergeEvaluated(l)}function c(l,d){return()=>{let C=t.subschema({keyword:l},s);A.assign(r,s),t.mergeValidEvaluated(C,r),d?A.assign(d,(0,Xv._)`${l}`):t.setParams({ifClause:l})}}}};function Ose(t,A){let e=t.schema[A];return e!==void 0&&!(0,Jse.alwaysValidSchema)(t,e)}rU.default=jOe});var Hse=XA(sU=>{"use strict";Object.defineProperty(sU,"__esModule",{value:!0});var VOe=eo(),qOe={keyword:["then","else"],schemaType:["object","boolean"],code({keyword:t,parentSchema:A,it:e}){A.if===void 0&&(0,VOe.checkStrictMode)(e,`"${t}" without "if" is ignored`)}};sU.default=qOe});var zse=XA(aU=>{"use strict";Object.defineProperty(aU,"__esModule",{value:!0});var WOe=HK(),ZOe=mse(),XOe=zK(),$Oe=wse(),eJe=yse(),AJe=bse(),tJe=Sse(),iJe=XK(),nJe=_se(),oJe=Fse(),rJe=Gse(),sJe=Kse(),aJe=Use(),cJe=Tse(),lJe=Yse(),gJe=Hse();function dJe(t=!1){let A=[rJe.default,sJe.default,aJe.default,cJe.default,lJe.default,gJe.default,tJe.default,iJe.default,AJe.default,nJe.default,oJe.default];return t?A.push(ZOe.default,$Oe.default):A.push(WOe.default,XOe.default),A.push(eJe.default),A}aU.default=dJe});var Pse=XA(cU=>{"use strict";Object.defineProperty(cU,"__esModule",{value:!0});var rs=hn(),CJe={message:({schemaCode:t})=>(0,rs.str)`must match format "${t}"`,params:({schemaCode:t})=>(0,rs._)`{format: ${t}}`},IJe={keyword:"format",type:["number","string"],schemaType:"string",$data:!0,error:CJe,code(t,A){let{gen:e,data:i,$data:n,schema:o,schemaCode:r,it:s}=t,{opts:a,errSchemaPath:c,schemaEnv:l,self:d}=s;if(!a.validateFormats)return;n?C():I();function C(){let u=e.scopeValue("formats",{ref:d.formats,code:a.code.formats}),h=e.const("fDef",(0,rs._)`${u}[${r}]`),B=e.let("fType"),f=e.let("format");e.if((0,rs._)`typeof ${h} == "object" && !(${h} instanceof RegExp)`,()=>e.assign(B,(0,rs._)`${h}.type || "string"`).assign(f,(0,rs._)`${h}.validate`),()=>e.assign(B,(0,rs._)`"string"`).assign(f,h)),t.fail$data((0,rs.or)(b(),k()));function b(){return a.strictSchema===!1?rs.nil:(0,rs._)`${r} && !${f}`}function k(){let S=l.$async?(0,rs._)`(${h}.async ? await ${f}(${i}) : ${f}(${i}))`:(0,rs._)`${f}(${i})`,w=(0,rs._)`(typeof ${f} == "function" ? ${S} : ${f}.test(${i}))`;return(0,rs._)`${f} && ${f} !== true && ${B} === ${A} && !${w}`}}function I(){let u=d.formats[o];if(!u){b();return}if(u===!0)return;let[h,B,f]=k(u);h===A&&t.pass(S());function b(){if(a.strictSchema===!1){d.logger.warn(w());return}throw new Error(w());function w(){return`unknown format "${o}" ignored in schema at path "${c}"`}}function k(w){let _=w instanceof RegExp?(0,rs.regexpCode)(w):a.code.formats?(0,rs._)`${a.code.formats}${(0,rs.getProperty)(o)}`:void 0,K=e.scopeValue("formats",{key:o,ref:w,code:_});return typeof w=="object"&&!(w instanceof RegExp)?[w.type||"string",w.validate,(0,rs._)`${K}.validate`]:["string",w,K]}function S(){if(typeof u=="object"&&!(u instanceof RegExp)&&u.async){if(!l.$async)throw new Error("async format in sync schema");return(0,rs._)`await ${f}(${i})`}return typeof B=="function"?(0,rs._)`${f}(${i})`:(0,rs._)`${f}.test(${i})`}}}};cU.default=IJe});var jse=XA(lU=>{"use strict";Object.defineProperty(lU,"__esModule",{value:!0});var uJe=Pse(),hJe=[uJe.default];lU.default=hJe});var Vse=XA(ZE=>{"use strict";Object.defineProperty(ZE,"__esModule",{value:!0});ZE.contentVocabulary=ZE.metadataVocabulary=void 0;ZE.metadataVocabulary=["title","description","default","deprecated","readOnly","writeOnly","examples"];ZE.contentVocabulary=["contentMediaType","contentEncoding","contentSchema"]});var Wse=XA(gU=>{"use strict";Object.defineProperty(gU,"__esModule",{value:!0});var BJe=ise(),EJe=Bse(),fJe=zse(),QJe=jse(),qse=Vse(),mJe=[BJe.default,EJe.default,(0,fJe.default)(),QJe.default,qse.metadataVocabulary,qse.contentVocabulary];gU.default=mJe});var Xse=XA($v=>{"use strict";Object.defineProperty($v,"__esModule",{value:!0});$v.DiscrError=void 0;var Zse=function(t){return t.Tag="tag",t.Mapping="mapping",t}(Zse||($v.DiscrError=Zse={}))});var eae=XA(CU=>{"use strict";Object.defineProperty(CU,"__esModule",{value:!0});var XE=hn(),dU=Xse(),$se=Nv(),pJe=B3(),wJe=eo(),yJe={message:({params:{discrError:t,tagName:A}})=>t===dU.DiscrError.Tag?`tag "${A}" must be string`:`value of tag "${A}" must be in oneOf`,params:({params:{discrError:t,tag:A,tagName:e}})=>(0,XE._)`{error: ${t}, tag: ${e}, tagValue: ${A}}`},DJe={keyword:"discriminator",type:"object",schemaType:"object",error:yJe,code(t){let{gen:A,data:e,schema:i,parentSchema:n,it:o}=t,{oneOf:r}=n;if(!o.opts.discriminator)throw new Error("discriminator: requires discriminator option");let s=i.propertyName;if(typeof s!="string")throw new Error("discriminator: requires propertyName");if(i.mapping)throw new Error("discriminator: mapping is not supported");if(!r)throw new Error("discriminator: requires oneOf keyword");let a=A.let("valid",!1),c=A.const("tag",(0,XE._)`${e}${(0,XE.getProperty)(s)}`);A.if((0,XE._)`typeof ${c} == "string"`,()=>l(),()=>t.error(!1,{discrError:dU.DiscrError.Tag,tag:c,tagName:s})),t.ok(a);function l(){let I=C();A.if(!1);for(let u in I)A.elseIf((0,XE._)`${c} === ${u}`),A.assign(a,d(I[u]));A.else(),t.error(!1,{discrError:dU.DiscrError.Mapping,tag:c,tagName:s}),A.endIf()}function d(I){let u=A.name("valid"),h=t.subschema({keyword:"oneOf",schemaProp:I},u);return t.mergeEvaluated(h,XE.Name),u}function C(){var I;let u={},h=f(n),B=!0;for(let S=0;S{vJe.exports={$schema:"http://json-schema.org/draft-07/schema#",$id:"http://json-schema.org/draft-07/schema#",title:"Core schema meta-schema",definitions:{schemaArray:{type:"array",minItems:1,items:{$ref:"#"}},nonNegativeInteger:{type:"integer",minimum:0},nonNegativeIntegerDefault0:{allOf:[{$ref:"#/definitions/nonNegativeInteger"},{default:0}]},simpleTypes:{enum:["array","boolean","integer","null","number","object","string"]},stringArray:{type:"array",items:{type:"string"},uniqueItems:!0,default:[]}},type:["object","boolean"],properties:{$id:{type:"string",format:"uri-reference"},$schema:{type:"string",format:"uri"},$ref:{type:"string",format:"uri-reference"},$comment:{type:"string"},title:{type:"string"},description:{type:"string"},default:!0,readOnly:{type:"boolean",default:!1},examples:{type:"array",items:!0},multipleOf:{type:"number",exclusiveMinimum:0},maximum:{type:"number"},exclusiveMaximum:{type:"number"},minimum:{type:"number"},exclusiveMinimum:{type:"number"},maxLength:{$ref:"#/definitions/nonNegativeInteger"},minLength:{$ref:"#/definitions/nonNegativeIntegerDefault0"},pattern:{type:"string",format:"regex"},additionalItems:{$ref:"#"},items:{anyOf:[{$ref:"#"},{$ref:"#/definitions/schemaArray"}],default:!0},maxItems:{$ref:"#/definitions/nonNegativeInteger"},minItems:{$ref:"#/definitions/nonNegativeIntegerDefault0"},uniqueItems:{type:"boolean",default:!1},contains:{$ref:"#"},maxProperties:{$ref:"#/definitions/nonNegativeInteger"},minProperties:{$ref:"#/definitions/nonNegativeIntegerDefault0"},required:{$ref:"#/definitions/stringArray"},additionalProperties:{$ref:"#"},definitions:{type:"object",additionalProperties:{$ref:"#"},default:{}},properties:{type:"object",additionalProperties:{$ref:"#"},default:{}},patternProperties:{type:"object",additionalProperties:{$ref:"#"},propertyNames:{format:"regex"},default:{}},dependencies:{type:"object",additionalProperties:{anyOf:[{$ref:"#"},{$ref:"#/definitions/stringArray"}]}},propertyNames:{$ref:"#"},const:!0,enum:{type:"array",items:!0,minItems:1,uniqueItems:!0},type:{anyOf:[{$ref:"#/definitions/simpleTypes"},{type:"array",items:{$ref:"#/definitions/simpleTypes"},minItems:1,uniqueItems:!0}]},format:{type:"string"},contentMediaType:{type:"string"},contentEncoding:{type:"string"},if:{$ref:"#"},then:{$ref:"#"},else:{$ref:"#"},allOf:{$ref:"#/definitions/schemaArray"},anyOf:{$ref:"#/definitions/schemaArray"},oneOf:{$ref:"#/definitions/schemaArray"},not:{$ref:"#"}},default:!0}});var iae=XA((hr,IU)=>{"use strict";Object.defineProperty(hr,"__esModule",{value:!0});hr.MissingRefError=hr.ValidationError=hr.CodeGen=hr.Name=hr.nil=hr.stringify=hr.str=hr._=hr.KeywordCxt=hr.Ajv=void 0;var bJe=Zre(),MJe=Wse(),SJe=eae(),tae=Aae(),kJe=["/properties"],e7="http://json-schema.org/draft-07/schema",$E=class extends bJe.default{_addVocabularies(){super._addVocabularies(),MJe.default.forEach(A=>this.addVocabulary(A)),this.opts.discriminator&&this.addKeyword(SJe.default)}_addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.meta)return;let A=this.opts.$data?this.$dataMetaSchema(tae,kJe):tae;this.addMetaSchema(A,e7,!1),this.refs["http://json-schema.org/schema"]=e7}defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this.getSchema(e7)?e7:void 0)}};hr.Ajv=$E;IU.exports=hr=$E;IU.exports.Ajv=$E;Object.defineProperty(hr,"__esModule",{value:!0});hr.default=$E;var xJe=h3();Object.defineProperty(hr,"KeywordCxt",{enumerable:!0,get:function(){return xJe.KeywordCxt}});var ef=hn();Object.defineProperty(hr,"_",{enumerable:!0,get:function(){return ef._}});Object.defineProperty(hr,"str",{enumerable:!0,get:function(){return ef.str}});Object.defineProperty(hr,"stringify",{enumerable:!0,get:function(){return ef.stringify}});Object.defineProperty(hr,"nil",{enumerable:!0,get:function(){return ef.nil}});Object.defineProperty(hr,"Name",{enumerable:!0,get:function(){return ef.Name}});Object.defineProperty(hr,"CodeGen",{enumerable:!0,get:function(){return ef.CodeGen}});var _Je=_v();Object.defineProperty(hr,"ValidationError",{enumerable:!0,get:function(){return _Je.default}});var RJe=B3();Object.defineProperty(hr,"MissingRefError",{enumerable:!0,get:function(){return RJe.default}})});var nae=XA(A7=>{"use strict";(function(t){"use strict";function A(G){return G!==null?Object.prototype.toString.call(G)==="[object Array]":!1}function e(G){return G!==null?Object.prototype.toString.call(G)==="[object Object]":!1}function i(G,z){if(G===z)return!0;var Ae=Object.prototype.toString.call(G);if(Ae!==Object.prototype.toString.call(z))return!1;if(A(G)===!0){if(G.length!==z.length)return!1;for(var de=0;de",9:"Array"},k="EOF",S="UnquotedIdentifier",w="QuotedIdentifier",_="Rbracket",K="Rparen",J="Comma",O="Colon",H="Rbrace",V="Number",Z="Current",ye="Expref",P="Pipe",se="Or",X="And",ue="EQ",oe="GT",le="LT",me="GTE",Te="LTE",$e="NE",Je="Flatten",Qe="Star",He="Filter",PA="Dot",JA="Not",Ye="Lbrace",Ie="Lbracket",We="Lparen",we="Literal",Ze={".":PA,"*":Qe,",":J,":":O,"{":Ye,"}":H,"]":_,"(":We,")":K,"@":Z},Ge={"<":!0,">":!0,"=":!0,"!":!0},LA={" ":!0," ":!0,"\n":!0};function Fe(G){return G>="a"&&G<="z"||G>="A"&&G<="Z"||G==="_"}function pe(G){return G>="0"&&G<="9"||G==="-"}function Wt(G){return G>="a"&&G<="z"||G>="A"&&G<="Z"||G>="0"&&G<="9"||G==="_"}function Qt(){}Qt.prototype={tokenize:function(G){var z=[];this._current=0;for(var Ae,de,Ne;this._current")return G[this._current]==="="?(this._current++,{type:me,value:">=",start:z}):{type:oe,value:">",start:z};if(Ae==="="&&G[this._current]==="=")return this._current++,{type:ue,value:"==",start:z}},_consumeLiteral:function(G){this._current++;for(var z=this._current,Ae=G.length,de;G[this._current]!=="`"&&this._current=0)return!0;if(Ae.indexOf(G)>=0)return!0;if(de.indexOf(G[0])>=0)try{return JSON.parse(G),!0}catch{return!1}else return!1}};var BA={};BA[k]=0,BA[S]=0,BA[w]=0,BA[_]=0,BA[K]=0,BA[J]=0,BA[H]=0,BA[V]=0,BA[Z]=0,BA[ye]=0,BA[P]=1,BA[se]=2,BA[X]=3,BA[ue]=5,BA[oe]=5,BA[le]=5,BA[me]=5,BA[Te]=5,BA[$e]=5,BA[Je]=9,BA[Qe]=20,BA[He]=21,BA[PA]=40,BA[JA]=45,BA[Ye]=50,BA[Ie]=55,BA[We]=60;function _t(){}_t.prototype={parse:function(G){this._loadTokens(G),this.index=0;var z=this.expression(0);if(this._lookahead(0)!==k){var Ae=this._lookaheadToken(0),de=new Error("Unexpected token type: "+Ae.type+", value: "+Ae.value);throw de.name="ParserError",de}return z},_loadTokens:function(G){var z=new Qt,Ae=z.tokenize(G);Ae.push({type:k,value:"",start:G.length}),this.tokens=Ae},expression:function(G){var z=this._lookaheadToken(0);this._advance();for(var Ae=this.nud(z),de=this._lookahead(0);G=0)return this.expression(G);if(z===Ie)return this._match(Ie),this._parseMultiselectList();if(z===Ye)return this._match(Ye),this._parseMultiselectHash()},_parseProjectionRHS:function(G){var z;if(BA[this._lookahead(0)]<10)z={type:"Identity"};else if(this._lookahead(0)===Ie)z=this.expression(G);else if(this._lookahead(0)===He)z=this.expression(G);else if(this._lookahead(0)===PA)this._match(PA),z=this._parseDotRHS(G);else{var Ae=this._lookaheadToken(0),de=new Error("Sytanx error, unexpected token: "+Ae.value+"("+Ae.type+")");throw de.name="ParserError",de}return z},_parseMultiselectList:function(){for(var G=[];this._lookahead(0)!==_;){var z=this.expression(0);if(G.push(z),this._lookahead(0)===J&&(this._match(J),this._lookahead(0)===_))throw new Error("Unexpected token Rbracket")}return this._match(_),{type:"MultiSelectList",children:G}},_parseMultiselectHash:function(){for(var G=[],z=[S,w],Ae,de,Ne,pA;;){if(Ae=this._lookaheadToken(0),z.indexOf(Ae.type)<0)throw new Error("Expecting an identifier token, got: "+Ae.type);if(de=Ae.value,this._advance(),this._match(O),Ne=this.expression(0),pA={type:"KeyValuePair",name:de,value:Ne},G.push(pA),this._lookahead(0)===J)this._match(J);else if(this._lookahead(0)===H){this._match(H);break}}return{type:"MultiSelectHash",children:G}}};function VA(G){this.runtime=G}VA.prototype={search:function(G,z){return this.visit(G,z)},visit:function(G,z){var Ae,de,Ne,pA,vA,Ke,Re,wt,st,nA;switch(G.type){case"Field":return z!==null&&e(z)?(Ke=z[G.name],Ke===void 0?null:Ke):null;case"Subexpression":for(Ne=this.visit(G.children[0],z),nA=1;nA0)for(nA=dn;nAHA;nA+=Cn)Ne.push(z[nA]);return Ne;case"Projection":var Gi=this.visit(G.children[0],z);if(!A(Gi))return null;for(st=[],nA=0;nAvA;break;case me:Ne=pA>=vA;break;case le:Ne=pA=G&&(z=Ae<0?G-1:G),z}};function YA(G){this._interpreter=G,this.functionTable={abs:{_func:this._functionAbs,_signature:[{types:[a]}]},avg:{_func:this._functionAvg,_signature:[{types:[B]}]},ceil:{_func:this._functionCeil,_signature:[{types:[a]}]},contains:{_func:this._functionContains,_signature:[{types:[l,d]},{types:[c]}]},ends_with:{_func:this._functionEndsWith,_signature:[{types:[l]},{types:[l]}]},floor:{_func:this._functionFloor,_signature:[{types:[a]}]},length:{_func:this._functionLength,_signature:[{types:[l,d,C]}]},map:{_func:this._functionMap,_signature:[{types:[u]},{types:[d]}]},max:{_func:this._functionMax,_signature:[{types:[B,f]}]},merge:{_func:this._functionMerge,_signature:[{types:[C],variadic:!0}]},max_by:{_func:this._functionMaxBy,_signature:[{types:[d]},{types:[u]}]},sum:{_func:this._functionSum,_signature:[{types:[B]}]},starts_with:{_func:this._functionStartsWith,_signature:[{types:[l]},{types:[l]}]},min:{_func:this._functionMin,_signature:[{types:[B,f]}]},min_by:{_func:this._functionMinBy,_signature:[{types:[d]},{types:[u]}]},type:{_func:this._functionType,_signature:[{types:[c]}]},keys:{_func:this._functionKeys,_signature:[{types:[C]}]},values:{_func:this._functionValues,_signature:[{types:[C]}]},sort:{_func:this._functionSort,_signature:[{types:[f,B]}]},sort_by:{_func:this._functionSortBy,_signature:[{types:[d]},{types:[u]}]},join:{_func:this._functionJoin,_signature:[{types:[l]},{types:[f]}]},reverse:{_func:this._functionReverse,_signature:[{types:[l,d]}]},to_array:{_func:this._functionToArray,_signature:[{types:[c]}]},to_string:{_func:this._functionToString,_signature:[{types:[c]}]},to_number:{_func:this._functionToNumber,_signature:[{types:[c]}]},not_null:{_func:this._functionNotNull,_signature:[{types:[c],variadic:!0}]}}}YA.prototype={callFunction:function(G,z){var Ae=this.functionTable[G];if(Ae===void 0)throw new Error("Unknown function: "+G+"()");return this._validateArgs(G,z,Ae._signature),Ae._func.call(this,z)},_validateArgs:function(G,z,Ae){var de;if(Ae[Ae.length-1].variadic){if(z.length=0;Ne--)de+=Ae[Ne];return de}else{var pA=G[0].slice(0);return pA.reverse(),pA}},_functionAbs:function(G){return Math.abs(G[0])},_functionCeil:function(G){return Math.ceil(G[0])},_functionAvg:function(G){for(var z=0,Ae=G[0],de=0;de=0},_functionFloor:function(G){return Math.floor(G[0])},_functionLength:function(G){return e(G[0])?Object.keys(G[0]).length:G[0].length},_functionMap:function(G){for(var z=[],Ae=this._interpreter,de=G[0],Ne=G[1],pA=0;pA0){var z=this._getTypeName(G[0][0]);if(z===a)return Math.max.apply(Math,G[0]);for(var Ae=G[0],de=Ae[0],Ne=1;Ne0){var z=this._getTypeName(G[0][0]);if(z===a)return Math.min.apply(Math,G[0]);for(var Ae=G[0],de=Ae[0],Ne=1;NeBt?1:nANe&&(Ne=vA,pA=Ae[Ke]);return pA},_functionMinBy:function(G){for(var z=G[1],Ae=G[0],de=this.createKeyFunction(z,[a,l]),Ne=1/0,pA,vA,Ke=0;Ke"u"?A7.jmespath={}:A7)});var MBe=XA((rdt,bBe)=>{"use strict";bBe.exports=[{value:"#B0171F",name:"indian red"},{value:"#DC143C",css:!0,name:"crimson"},{value:"#FFB6C1",css:!0,name:"lightpink"},{value:"#FFAEB9",name:"lightpink 1"},{value:"#EEA2AD",name:"lightpink 2"},{value:"#CD8C95",name:"lightpink 3"},{value:"#8B5F65",name:"lightpink 4"},{value:"#FFC0CB",css:!0,name:"pink"},{value:"#FFB5C5",name:"pink 1"},{value:"#EEA9B8",name:"pink 2"},{value:"#CD919E",name:"pink 3"},{value:"#8B636C",name:"pink 4"},{value:"#DB7093",css:!0,name:"palevioletred"},{value:"#FF82AB",name:"palevioletred 1"},{value:"#EE799F",name:"palevioletred 2"},{value:"#CD6889",name:"palevioletred 3"},{value:"#8B475D",name:"palevioletred 4"},{value:"#FFF0F5",name:"lavenderblush 1"},{value:"#FFF0F5",css:!0,name:"lavenderblush"},{value:"#EEE0E5",name:"lavenderblush 2"},{value:"#CDC1C5",name:"lavenderblush 3"},{value:"#8B8386",name:"lavenderblush 4"},{value:"#FF3E96",name:"violetred 1"},{value:"#EE3A8C",name:"violetred 2"},{value:"#CD3278",name:"violetred 3"},{value:"#8B2252",name:"violetred 4"},{value:"#FF69B4",css:!0,name:"hotpink"},{value:"#FF6EB4",name:"hotpink 1"},{value:"#EE6AA7",name:"hotpink 2"},{value:"#CD6090",name:"hotpink 3"},{value:"#8B3A62",name:"hotpink 4"},{value:"#872657",name:"raspberry"},{value:"#FF1493",name:"deeppink 1"},{value:"#FF1493",css:!0,name:"deeppink"},{value:"#EE1289",name:"deeppink 2"},{value:"#CD1076",name:"deeppink 3"},{value:"#8B0A50",name:"deeppink 4"},{value:"#FF34B3",name:"maroon 1"},{value:"#EE30A7",name:"maroon 2"},{value:"#CD2990",name:"maroon 3"},{value:"#8B1C62",name:"maroon 4"},{value:"#C71585",css:!0,name:"mediumvioletred"},{value:"#D02090",name:"violetred"},{value:"#DA70D6",css:!0,name:"orchid"},{value:"#FF83FA",name:"orchid 1"},{value:"#EE7AE9",name:"orchid 2"},{value:"#CD69C9",name:"orchid 3"},{value:"#8B4789",name:"orchid 4"},{value:"#D8BFD8",css:!0,name:"thistle"},{value:"#FFE1FF",name:"thistle 1"},{value:"#EED2EE",name:"thistle 2"},{value:"#CDB5CD",name:"thistle 3"},{value:"#8B7B8B",name:"thistle 4"},{value:"#FFBBFF",name:"plum 1"},{value:"#EEAEEE",name:"plum 2"},{value:"#CD96CD",name:"plum 3"},{value:"#8B668B",name:"plum 4"},{value:"#DDA0DD",css:!0,name:"plum"},{value:"#EE82EE",css:!0,name:"violet"},{value:"#FF00FF",vga:!0,name:"magenta"},{value:"#FF00FF",vga:!0,css:!0,name:"fuchsia"},{value:"#EE00EE",name:"magenta 2"},{value:"#CD00CD",name:"magenta 3"},{value:"#8B008B",name:"magenta 4"},{value:"#8B008B",css:!0,name:"darkmagenta"},{value:"#800080",vga:!0,css:!0,name:"purple"},{value:"#BA55D3",css:!0,name:"mediumorchid"},{value:"#E066FF",name:"mediumorchid 1"},{value:"#D15FEE",name:"mediumorchid 2"},{value:"#B452CD",name:"mediumorchid 3"},{value:"#7A378B",name:"mediumorchid 4"},{value:"#9400D3",css:!0,name:"darkviolet"},{value:"#9932CC",css:!0,name:"darkorchid"},{value:"#BF3EFF",name:"darkorchid 1"},{value:"#B23AEE",name:"darkorchid 2"},{value:"#9A32CD",name:"darkorchid 3"},{value:"#68228B",name:"darkorchid 4"},{value:"#4B0082",css:!0,name:"indigo"},{value:"#8A2BE2",css:!0,name:"blueviolet"},{value:"#9B30FF",name:"purple 1"},{value:"#912CEE",name:"purple 2"},{value:"#7D26CD",name:"purple 3"},{value:"#551A8B",name:"purple 4"},{value:"#9370DB",css:!0,name:"mediumpurple"},{value:"#AB82FF",name:"mediumpurple 1"},{value:"#9F79EE",name:"mediumpurple 2"},{value:"#8968CD",name:"mediumpurple 3"},{value:"#5D478B",name:"mediumpurple 4"},{value:"#483D8B",css:!0,name:"darkslateblue"},{value:"#8470FF",name:"lightslateblue"},{value:"#7B68EE",css:!0,name:"mediumslateblue"},{value:"#6A5ACD",css:!0,name:"slateblue"},{value:"#836FFF",name:"slateblue 1"},{value:"#7A67EE",name:"slateblue 2"},{value:"#6959CD",name:"slateblue 3"},{value:"#473C8B",name:"slateblue 4"},{value:"#F8F8FF",css:!0,name:"ghostwhite"},{value:"#E6E6FA",css:!0,name:"lavender"},{value:"#0000FF",vga:!0,css:!0,name:"blue"},{value:"#0000EE",name:"blue 2"},{value:"#0000CD",name:"blue 3"},{value:"#0000CD",css:!0,name:"mediumblue"},{value:"#00008B",name:"blue 4"},{value:"#00008B",css:!0,name:"darkblue"},{value:"#000080",vga:!0,css:!0,name:"navy"},{value:"#191970",css:!0,name:"midnightblue"},{value:"#3D59AB",name:"cobalt"},{value:"#4169E1",css:!0,name:"royalblue"},{value:"#4876FF",name:"royalblue 1"},{value:"#436EEE",name:"royalblue 2"},{value:"#3A5FCD",name:"royalblue 3"},{value:"#27408B",name:"royalblue 4"},{value:"#6495ED",css:!0,name:"cornflowerblue"},{value:"#B0C4DE",css:!0,name:"lightsteelblue"},{value:"#CAE1FF",name:"lightsteelblue 1"},{value:"#BCD2EE",name:"lightsteelblue 2"},{value:"#A2B5CD",name:"lightsteelblue 3"},{value:"#6E7B8B",name:"lightsteelblue 4"},{value:"#778899",css:!0,name:"lightslategray"},{value:"#708090",css:!0,name:"slategray"},{value:"#C6E2FF",name:"slategray 1"},{value:"#B9D3EE",name:"slategray 2"},{value:"#9FB6CD",name:"slategray 3"},{value:"#6C7B8B",name:"slategray 4"},{value:"#1E90FF",name:"dodgerblue 1"},{value:"#1E90FF",css:!0,name:"dodgerblue"},{value:"#1C86EE",name:"dodgerblue 2"},{value:"#1874CD",name:"dodgerblue 3"},{value:"#104E8B",name:"dodgerblue 4"},{value:"#F0F8FF",css:!0,name:"aliceblue"},{value:"#4682B4",css:!0,name:"steelblue"},{value:"#63B8FF",name:"steelblue 1"},{value:"#5CACEE",name:"steelblue 2"},{value:"#4F94CD",name:"steelblue 3"},{value:"#36648B",name:"steelblue 4"},{value:"#87CEFA",css:!0,name:"lightskyblue"},{value:"#B0E2FF",name:"lightskyblue 1"},{value:"#A4D3EE",name:"lightskyblue 2"},{value:"#8DB6CD",name:"lightskyblue 3"},{value:"#607B8B",name:"lightskyblue 4"},{value:"#87CEFF",name:"skyblue 1"},{value:"#7EC0EE",name:"skyblue 2"},{value:"#6CA6CD",name:"skyblue 3"},{value:"#4A708B",name:"skyblue 4"},{value:"#87CEEB",css:!0,name:"skyblue"},{value:"#00BFFF",name:"deepskyblue 1"},{value:"#00BFFF",css:!0,name:"deepskyblue"},{value:"#00B2EE",name:"deepskyblue 2"},{value:"#009ACD",name:"deepskyblue 3"},{value:"#00688B",name:"deepskyblue 4"},{value:"#33A1C9",name:"peacock"},{value:"#ADD8E6",css:!0,name:"lightblue"},{value:"#BFEFFF",name:"lightblue 1"},{value:"#B2DFEE",name:"lightblue 2"},{value:"#9AC0CD",name:"lightblue 3"},{value:"#68838B",name:"lightblue 4"},{value:"#B0E0E6",css:!0,name:"powderblue"},{value:"#98F5FF",name:"cadetblue 1"},{value:"#8EE5EE",name:"cadetblue 2"},{value:"#7AC5CD",name:"cadetblue 3"},{value:"#53868B",name:"cadetblue 4"},{value:"#00F5FF",name:"turquoise 1"},{value:"#00E5EE",name:"turquoise 2"},{value:"#00C5CD",name:"turquoise 3"},{value:"#00868B",name:"turquoise 4"},{value:"#5F9EA0",css:!0,name:"cadetblue"},{value:"#00CED1",css:!0,name:"darkturquoise"},{value:"#F0FFFF",name:"azure 1"},{value:"#F0FFFF",css:!0,name:"azure"},{value:"#E0EEEE",name:"azure 2"},{value:"#C1CDCD",name:"azure 3"},{value:"#838B8B",name:"azure 4"},{value:"#E0FFFF",name:"lightcyan 1"},{value:"#E0FFFF",css:!0,name:"lightcyan"},{value:"#D1EEEE",name:"lightcyan 2"},{value:"#B4CDCD",name:"lightcyan 3"},{value:"#7A8B8B",name:"lightcyan 4"},{value:"#BBFFFF",name:"paleturquoise 1"},{value:"#AEEEEE",name:"paleturquoise 2"},{value:"#AEEEEE",css:!0,name:"paleturquoise"},{value:"#96CDCD",name:"paleturquoise 3"},{value:"#668B8B",name:"paleturquoise 4"},{value:"#2F4F4F",css:!0,name:"darkslategray"},{value:"#97FFFF",name:"darkslategray 1"},{value:"#8DEEEE",name:"darkslategray 2"},{value:"#79CDCD",name:"darkslategray 3"},{value:"#528B8B",name:"darkslategray 4"},{value:"#00FFFF",name:"cyan"},{value:"#00FFFF",css:!0,name:"aqua"},{value:"#00EEEE",name:"cyan 2"},{value:"#00CDCD",name:"cyan 3"},{value:"#008B8B",name:"cyan 4"},{value:"#008B8B",css:!0,name:"darkcyan"},{value:"#008080",vga:!0,css:!0,name:"teal"},{value:"#48D1CC",css:!0,name:"mediumturquoise"},{value:"#20B2AA",css:!0,name:"lightseagreen"},{value:"#03A89E",name:"manganeseblue"},{value:"#40E0D0",css:!0,name:"turquoise"},{value:"#808A87",name:"coldgrey"},{value:"#00C78C",name:"turquoiseblue"},{value:"#7FFFD4",name:"aquamarine 1"},{value:"#7FFFD4",css:!0,name:"aquamarine"},{value:"#76EEC6",name:"aquamarine 2"},{value:"#66CDAA",name:"aquamarine 3"},{value:"#66CDAA",css:!0,name:"mediumaquamarine"},{value:"#458B74",name:"aquamarine 4"},{value:"#00FA9A",css:!0,name:"mediumspringgreen"},{value:"#F5FFFA",css:!0,name:"mintcream"},{value:"#00FF7F",css:!0,name:"springgreen"},{value:"#00EE76",name:"springgreen 1"},{value:"#00CD66",name:"springgreen 2"},{value:"#008B45",name:"springgreen 3"},{value:"#3CB371",css:!0,name:"mediumseagreen"},{value:"#54FF9F",name:"seagreen 1"},{value:"#4EEE94",name:"seagreen 2"},{value:"#43CD80",name:"seagreen 3"},{value:"#2E8B57",name:"seagreen 4"},{value:"#2E8B57",css:!0,name:"seagreen"},{value:"#00C957",name:"emeraldgreen"},{value:"#BDFCC9",name:"mint"},{value:"#3D9140",name:"cobaltgreen"},{value:"#F0FFF0",name:"honeydew 1"},{value:"#F0FFF0",css:!0,name:"honeydew"},{value:"#E0EEE0",name:"honeydew 2"},{value:"#C1CDC1",name:"honeydew 3"},{value:"#838B83",name:"honeydew 4"},{value:"#8FBC8F",css:!0,name:"darkseagreen"},{value:"#C1FFC1",name:"darkseagreen 1"},{value:"#B4EEB4",name:"darkseagreen 2"},{value:"#9BCD9B",name:"darkseagreen 3"},{value:"#698B69",name:"darkseagreen 4"},{value:"#98FB98",css:!0,name:"palegreen"},{value:"#9AFF9A",name:"palegreen 1"},{value:"#90EE90",name:"palegreen 2"},{value:"#90EE90",css:!0,name:"lightgreen"},{value:"#7CCD7C",name:"palegreen 3"},{value:"#548B54",name:"palegreen 4"},{value:"#32CD32",css:!0,name:"limegreen"},{value:"#228B22",css:!0,name:"forestgreen"},{value:"#00FF00",vga:!0,name:"green 1"},{value:"#00FF00",vga:!0,css:!0,name:"lime"},{value:"#00EE00",name:"green 2"},{value:"#00CD00",name:"green 3"},{value:"#008B00",name:"green 4"},{value:"#008000",vga:!0,css:!0,name:"green"},{value:"#006400",css:!0,name:"darkgreen"},{value:"#308014",name:"sapgreen"},{value:"#7CFC00",css:!0,name:"lawngreen"},{value:"#7FFF00",name:"chartreuse 1"},{value:"#7FFF00",css:!0,name:"chartreuse"},{value:"#76EE00",name:"chartreuse 2"},{value:"#66CD00",name:"chartreuse 3"},{value:"#458B00",name:"chartreuse 4"},{value:"#ADFF2F",css:!0,name:"greenyellow"},{value:"#CAFF70",name:"darkolivegreen 1"},{value:"#BCEE68",name:"darkolivegreen 2"},{value:"#A2CD5A",name:"darkolivegreen 3"},{value:"#6E8B3D",name:"darkolivegreen 4"},{value:"#556B2F",css:!0,name:"darkolivegreen"},{value:"#6B8E23",css:!0,name:"olivedrab"},{value:"#C0FF3E",name:"olivedrab 1"},{value:"#B3EE3A",name:"olivedrab 2"},{value:"#9ACD32",name:"olivedrab 3"},{value:"#9ACD32",css:!0,name:"yellowgreen"},{value:"#698B22",name:"olivedrab 4"},{value:"#FFFFF0",name:"ivory 1"},{value:"#FFFFF0",css:!0,name:"ivory"},{value:"#EEEEE0",name:"ivory 2"},{value:"#CDCDC1",name:"ivory 3"},{value:"#8B8B83",name:"ivory 4"},{value:"#F5F5DC",css:!0,name:"beige"},{value:"#FFFFE0",name:"lightyellow 1"},{value:"#FFFFE0",css:!0,name:"lightyellow"},{value:"#EEEED1",name:"lightyellow 2"},{value:"#CDCDB4",name:"lightyellow 3"},{value:"#8B8B7A",name:"lightyellow 4"},{value:"#FAFAD2",css:!0,name:"lightgoldenrodyellow"},{value:"#FFFF00",vga:!0,name:"yellow 1"},{value:"#FFFF00",vga:!0,css:!0,name:"yellow"},{value:"#EEEE00",name:"yellow 2"},{value:"#CDCD00",name:"yellow 3"},{value:"#8B8B00",name:"yellow 4"},{value:"#808069",name:"warmgrey"},{value:"#808000",vga:!0,css:!0,name:"olive"},{value:"#BDB76B",css:!0,name:"darkkhaki"},{value:"#FFF68F",name:"khaki 1"},{value:"#EEE685",name:"khaki 2"},{value:"#CDC673",name:"khaki 3"},{value:"#8B864E",name:"khaki 4"},{value:"#F0E68C",css:!0,name:"khaki"},{value:"#EEE8AA",css:!0,name:"palegoldenrod"},{value:"#FFFACD",name:"lemonchiffon 1"},{value:"#FFFACD",css:!0,name:"lemonchiffon"},{value:"#EEE9BF",name:"lemonchiffon 2"},{value:"#CDC9A5",name:"lemonchiffon 3"},{value:"#8B8970",name:"lemonchiffon 4"},{value:"#FFEC8B",name:"lightgoldenrod 1"},{value:"#EEDC82",name:"lightgoldenrod 2"},{value:"#CDBE70",name:"lightgoldenrod 3"},{value:"#8B814C",name:"lightgoldenrod 4"},{value:"#E3CF57",name:"banana"},{value:"#FFD700",name:"gold 1"},{value:"#FFD700",css:!0,name:"gold"},{value:"#EEC900",name:"gold 2"},{value:"#CDAD00",name:"gold 3"},{value:"#8B7500",name:"gold 4"},{value:"#FFF8DC",name:"cornsilk 1"},{value:"#FFF8DC",css:!0,name:"cornsilk"},{value:"#EEE8CD",name:"cornsilk 2"},{value:"#CDC8B1",name:"cornsilk 3"},{value:"#8B8878",name:"cornsilk 4"},{value:"#DAA520",css:!0,name:"goldenrod"},{value:"#FFC125",name:"goldenrod 1"},{value:"#EEB422",name:"goldenrod 2"},{value:"#CD9B1D",name:"goldenrod 3"},{value:"#8B6914",name:"goldenrod 4"},{value:"#B8860B",css:!0,name:"darkgoldenrod"},{value:"#FFB90F",name:"darkgoldenrod 1"},{value:"#EEAD0E",name:"darkgoldenrod 2"},{value:"#CD950C",name:"darkgoldenrod 3"},{value:"#8B6508",name:"darkgoldenrod 4"},{value:"#FFA500",name:"orange 1"},{value:"#FF8000",css:!0,name:"orange"},{value:"#EE9A00",name:"orange 2"},{value:"#CD8500",name:"orange 3"},{value:"#8B5A00",name:"orange 4"},{value:"#FFFAF0",css:!0,name:"floralwhite"},{value:"#FDF5E6",css:!0,name:"oldlace"},{value:"#F5DEB3",css:!0,name:"wheat"},{value:"#FFE7BA",name:"wheat 1"},{value:"#EED8AE",name:"wheat 2"},{value:"#CDBA96",name:"wheat 3"},{value:"#8B7E66",name:"wheat 4"},{value:"#FFE4B5",css:!0,name:"moccasin"},{value:"#FFEFD5",css:!0,name:"papayawhip"},{value:"#FFEBCD",css:!0,name:"blanchedalmond"},{value:"#FFDEAD",name:"navajowhite 1"},{value:"#FFDEAD",css:!0,name:"navajowhite"},{value:"#EECFA1",name:"navajowhite 2"},{value:"#CDB38B",name:"navajowhite 3"},{value:"#8B795E",name:"navajowhite 4"},{value:"#FCE6C9",name:"eggshell"},{value:"#D2B48C",css:!0,name:"tan"},{value:"#9C661F",name:"brick"},{value:"#FF9912",name:"cadmiumyellow"},{value:"#FAEBD7",css:!0,name:"antiquewhite"},{value:"#FFEFDB",name:"antiquewhite 1"},{value:"#EEDFCC",name:"antiquewhite 2"},{value:"#CDC0B0",name:"antiquewhite 3"},{value:"#8B8378",name:"antiquewhite 4"},{value:"#DEB887",css:!0,name:"burlywood"},{value:"#FFD39B",name:"burlywood 1"},{value:"#EEC591",name:"burlywood 2"},{value:"#CDAA7D",name:"burlywood 3"},{value:"#8B7355",name:"burlywood 4"},{value:"#FFE4C4",name:"bisque 1"},{value:"#FFE4C4",css:!0,name:"bisque"},{value:"#EED5B7",name:"bisque 2"},{value:"#CDB79E",name:"bisque 3"},{value:"#8B7D6B",name:"bisque 4"},{value:"#E3A869",name:"melon"},{value:"#ED9121",name:"carrot"},{value:"#FF8C00",css:!0,name:"darkorange"},{value:"#FF7F00",name:"darkorange 1"},{value:"#EE7600",name:"darkorange 2"},{value:"#CD6600",name:"darkorange 3"},{value:"#8B4500",name:"darkorange 4"},{value:"#FFA54F",name:"tan 1"},{value:"#EE9A49",name:"tan 2"},{value:"#CD853F",name:"tan 3"},{value:"#CD853F",css:!0,name:"peru"},{value:"#8B5A2B",name:"tan 4"},{value:"#FAF0E6",css:!0,name:"linen"},{value:"#FFDAB9",name:"peachpuff 1"},{value:"#FFDAB9",css:!0,name:"peachpuff"},{value:"#EECBAD",name:"peachpuff 2"},{value:"#CDAF95",name:"peachpuff 3"},{value:"#8B7765",name:"peachpuff 4"},{value:"#FFF5EE",name:"seashell 1"},{value:"#FFF5EE",css:!0,name:"seashell"},{value:"#EEE5DE",name:"seashell 2"},{value:"#CDC5BF",name:"seashell 3"},{value:"#8B8682",name:"seashell 4"},{value:"#F4A460",css:!0,name:"sandybrown"},{value:"#C76114",name:"rawsienna"},{value:"#D2691E",css:!0,name:"chocolate"},{value:"#FF7F24",name:"chocolate 1"},{value:"#EE7621",name:"chocolate 2"},{value:"#CD661D",name:"chocolate 3"},{value:"#8B4513",name:"chocolate 4"},{value:"#8B4513",css:!0,name:"saddlebrown"},{value:"#292421",name:"ivoryblack"},{value:"#FF7D40",name:"flesh"},{value:"#FF6103",name:"cadmiumorange"},{value:"#8A360F",name:"burntsienna"},{value:"#A0522D",css:!0,name:"sienna"},{value:"#FF8247",name:"sienna 1"},{value:"#EE7942",name:"sienna 2"},{value:"#CD6839",name:"sienna 3"},{value:"#8B4726",name:"sienna 4"},{value:"#FFA07A",name:"lightsalmon 1"},{value:"#FFA07A",css:!0,name:"lightsalmon"},{value:"#EE9572",name:"lightsalmon 2"},{value:"#CD8162",name:"lightsalmon 3"},{value:"#8B5742",name:"lightsalmon 4"},{value:"#FF7F50",css:!0,name:"coral"},{value:"#FF4500",name:"orangered 1"},{value:"#FF4500",css:!0,name:"orangered"},{value:"#EE4000",name:"orangered 2"},{value:"#CD3700",name:"orangered 3"},{value:"#8B2500",name:"orangered 4"},{value:"#5E2612",name:"sepia"},{value:"#E9967A",css:!0,name:"darksalmon"},{value:"#FF8C69",name:"salmon 1"},{value:"#EE8262",name:"salmon 2"},{value:"#CD7054",name:"salmon 3"},{value:"#8B4C39",name:"salmon 4"},{value:"#FF7256",name:"coral 1"},{value:"#EE6A50",name:"coral 2"},{value:"#CD5B45",name:"coral 3"},{value:"#8B3E2F",name:"coral 4"},{value:"#8A3324",name:"burntumber"},{value:"#FF6347",name:"tomato 1"},{value:"#FF6347",css:!0,name:"tomato"},{value:"#EE5C42",name:"tomato 2"},{value:"#CD4F39",name:"tomato 3"},{value:"#8B3626",name:"tomato 4"},{value:"#FA8072",css:!0,name:"salmon"},{value:"#FFE4E1",name:"mistyrose 1"},{value:"#FFE4E1",css:!0,name:"mistyrose"},{value:"#EED5D2",name:"mistyrose 2"},{value:"#CDB7B5",name:"mistyrose 3"},{value:"#8B7D7B",name:"mistyrose 4"},{value:"#FFFAFA",name:"snow 1"},{value:"#FFFAFA",css:!0,name:"snow"},{value:"#EEE9E9",name:"snow 2"},{value:"#CDC9C9",name:"snow 3"},{value:"#8B8989",name:"snow 4"},{value:"#BC8F8F",css:!0,name:"rosybrown"},{value:"#FFC1C1",name:"rosybrown 1"},{value:"#EEB4B4",name:"rosybrown 2"},{value:"#CD9B9B",name:"rosybrown 3"},{value:"#8B6969",name:"rosybrown 4"},{value:"#F08080",css:!0,name:"lightcoral"},{value:"#CD5C5C",css:!0,name:"indianred"},{value:"#FF6A6A",name:"indianred 1"},{value:"#EE6363",name:"indianred 2"},{value:"#8B3A3A",name:"indianred 4"},{value:"#CD5555",name:"indianred 3"},{value:"#A52A2A",css:!0,name:"brown"},{value:"#FF4040",name:"brown 1"},{value:"#EE3B3B",name:"brown 2"},{value:"#CD3333",name:"brown 3"},{value:"#8B2323",name:"brown 4"},{value:"#B22222",css:!0,name:"firebrick"},{value:"#FF3030",name:"firebrick 1"},{value:"#EE2C2C",name:"firebrick 2"},{value:"#CD2626",name:"firebrick 3"},{value:"#8B1A1A",name:"firebrick 4"},{value:"#FF0000",vga:!0,name:"red 1"},{value:"#FF0000",vga:!0,css:!0,name:"red"},{value:"#EE0000",name:"red 2"},{value:"#CD0000",name:"red 3"},{value:"#8B0000",name:"red 4"},{value:"#8B0000",css:!0,name:"darkred"},{value:"#800000",vga:!0,css:!0,name:"maroon"},{value:"#8E388E",name:"sgi beet"},{value:"#7171C6",name:"sgi slateblue"},{value:"#7D9EC0",name:"sgi lightblue"},{value:"#388E8E",name:"sgi teal"},{value:"#71C671",name:"sgi chartreuse"},{value:"#8E8E38",name:"sgi olivedrab"},{value:"#C5C1AA",name:"sgi brightgray"},{value:"#C67171",name:"sgi salmon"},{value:"#555555",name:"sgi darkgray"},{value:"#1E1E1E",name:"sgi gray 12"},{value:"#282828",name:"sgi gray 16"},{value:"#515151",name:"sgi gray 32"},{value:"#5B5B5B",name:"sgi gray 36"},{value:"#848484",name:"sgi gray 52"},{value:"#8E8E8E",name:"sgi gray 56"},{value:"#AAAAAA",name:"sgi lightgray"},{value:"#B7B7B7",name:"sgi gray 72"},{value:"#C1C1C1",name:"sgi gray 76"},{value:"#EAEAEA",name:"sgi gray 92"},{value:"#F4F4F4",name:"sgi gray 96"},{value:"#FFFFFF",vga:!0,css:!0,name:"white"},{value:"#F5F5F5",name:"white smoke"},{value:"#F5F5F5",name:"gray 96"},{value:"#DCDCDC",css:!0,name:"gainsboro"},{value:"#D3D3D3",css:!0,name:"lightgrey"},{value:"#C0C0C0",vga:!0,css:!0,name:"silver"},{value:"#A9A9A9",css:!0,name:"darkgray"},{value:"#808080",vga:!0,css:!0,name:"gray"},{value:"#696969",css:!0,name:"dimgray"},{value:"#696969",name:"gray 42"},{value:"#000000",vga:!0,css:!0,name:"black"},{value:"#FCFCFC",name:"gray 99"},{value:"#FAFAFA",name:"gray 98"},{value:"#F7F7F7",name:"gray 97"},{value:"#F2F2F2",name:"gray 95"},{value:"#F0F0F0",name:"gray 94"},{value:"#EDEDED",name:"gray 93"},{value:"#EBEBEB",name:"gray 92"},{value:"#E8E8E8",name:"gray 91"},{value:"#E5E5E5",name:"gray 90"},{value:"#E3E3E3",name:"gray 89"},{value:"#E0E0E0",name:"gray 88"},{value:"#DEDEDE",name:"gray 87"},{value:"#DBDBDB",name:"gray 86"},{value:"#D9D9D9",name:"gray 85"},{value:"#D6D6D6",name:"gray 84"},{value:"#D4D4D4",name:"gray 83"},{value:"#D1D1D1",name:"gray 82"},{value:"#CFCFCF",name:"gray 81"},{value:"#CCCCCC",name:"gray 80"},{value:"#C9C9C9",name:"gray 79"},{value:"#C7C7C7",name:"gray 78"},{value:"#C4C4C4",name:"gray 77"},{value:"#C2C2C2",name:"gray 76"},{value:"#BFBFBF",name:"gray 75"},{value:"#BDBDBD",name:"gray 74"},{value:"#BABABA",name:"gray 73"},{value:"#B8B8B8",name:"gray 72"},{value:"#B5B5B5",name:"gray 71"},{value:"#B3B3B3",name:"gray 70"},{value:"#B0B0B0",name:"gray 69"},{value:"#ADADAD",name:"gray 68"},{value:"#ABABAB",name:"gray 67"},{value:"#A8A8A8",name:"gray 66"},{value:"#A6A6A6",name:"gray 65"},{value:"#A3A3A3",name:"gray 64"},{value:"#A1A1A1",name:"gray 63"},{value:"#9E9E9E",name:"gray 62"},{value:"#9C9C9C",name:"gray 61"},{value:"#999999",name:"gray 60"},{value:"#969696",name:"gray 59"},{value:"#949494",name:"gray 58"},{value:"#919191",name:"gray 57"},{value:"#8F8F8F",name:"gray 56"},{value:"#8C8C8C",name:"gray 55"},{value:"#8A8A8A",name:"gray 54"},{value:"#878787",name:"gray 53"},{value:"#858585",name:"gray 52"},{value:"#828282",name:"gray 51"},{value:"#7F7F7F",name:"gray 50"},{value:"#7D7D7D",name:"gray 49"},{value:"#7A7A7A",name:"gray 48"},{value:"#787878",name:"gray 47"},{value:"#757575",name:"gray 46"},{value:"#737373",name:"gray 45"},{value:"#707070",name:"gray 44"},{value:"#6E6E6E",name:"gray 43"},{value:"#666666",name:"gray 40"},{value:"#636363",name:"gray 39"},{value:"#616161",name:"gray 38"},{value:"#5E5E5E",name:"gray 37"},{value:"#5C5C5C",name:"gray 36"},{value:"#595959",name:"gray 35"},{value:"#575757",name:"gray 34"},{value:"#545454",name:"gray 33"},{value:"#525252",name:"gray 32"},{value:"#4F4F4F",name:"gray 31"},{value:"#4D4D4D",name:"gray 30"},{value:"#4A4A4A",name:"gray 29"},{value:"#474747",name:"gray 28"},{value:"#454545",name:"gray 27"},{value:"#424242",name:"gray 26"},{value:"#404040",name:"gray 25"},{value:"#3D3D3D",name:"gray 24"},{value:"#3B3B3B",name:"gray 23"},{value:"#383838",name:"gray 22"},{value:"#363636",name:"gray 21"},{value:"#333333",name:"gray 20"},{value:"#303030",name:"gray 19"},{value:"#2E2E2E",name:"gray 18"},{value:"#2B2B2B",name:"gray 17"},{value:"#292929",name:"gray 16"},{value:"#262626",name:"gray 15"},{value:"#242424",name:"gray 14"},{value:"#212121",name:"gray 13"},{value:"#1F1F1F",name:"gray 12"},{value:"#1C1C1C",name:"gray 11"},{value:"#1A1A1A",name:"gray 10"},{value:"#171717",name:"gray 9"},{value:"#141414",name:"gray 8"},{value:"#121212",name:"gray 7"},{value:"#0F0F0F",name:"gray 6"},{value:"#0D0D0D",name:"gray 5"},{value:"#0A0A0A",name:"gray 4"},{value:"#080808",name:"gray 3"},{value:"#050505",name:"gray 2"},{value:"#030303",name:"gray 1"},{value:"#F5F5F5",css:!0,name:"whitesmoke"}]});var xBe=XA((sdt,mI)=>{"use strict";var Ik=MBe(),SBe=Ik.filter(function(t){return!!t.css}),kBe=Ik.filter(function(t){return!!t.vga});mI.exports=function(t){var A=mI.exports.get(t);return A&&A.value};mI.exports.get=function(t){return t=t||"",t=t.trim().toLowerCase(),Ik.filter(function(A){return A.name.toLowerCase()===t}).pop()};mI.exports.all=mI.exports.get.all=function(){return Ik};mI.exports.get.css=function(t){return t?(t=t||"",t=t.trim().toLowerCase(),SBe.filter(function(A){return A.name.toLowerCase()===t}).pop()):SBe};mI.exports.get.vga=function(t){return t?(t=t||"",t=t.trim().toLowerCase(),kBe.filter(function(A){return A.name.toLowerCase()===t}).pop()):kBe}});var $Be=XA((adt,XBe)=>{"use strict";var GgA=1/0,KgA="[object Symbol]",UgA=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,UBe="\\ud800-\\udfff",TgA="\\u0300-\\u036f\\ufe20-\\ufe23",OgA="\\u20d0-\\u20f0",TBe="\\u2700-\\u27bf",OBe="a-z\\xdf-\\xf6\\xf8-\\xff",JgA="\\xac\\xb1\\xd7\\xf7",YgA="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",HgA="\\u2000-\\u206f",zgA=" \\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",JBe="A-Z\\xc0-\\xd6\\xd8-\\xde",PgA="\\ufe0e\\ufe0f",YBe=JgA+YgA+HgA+zgA,HBe="['\u2019]",_Be="["+YBe+"]",jgA="["+TgA+OgA+"]",zBe="\\d+",VgA="["+TBe+"]",PBe="["+OBe+"]",jBe="[^"+UBe+YBe+zBe+TBe+OBe+JBe+"]",qgA="\\ud83c[\\udffb-\\udfff]",WgA="(?:"+jgA+"|"+qgA+")",ZgA="[^"+UBe+"]",VBe="(?:\\ud83c[\\udde6-\\uddff]){2}",qBe="[\\ud800-\\udbff][\\udc00-\\udfff]",LQ="["+JBe+"]",XgA="\\u200d",RBe="(?:"+PBe+"|"+jBe+")",$gA="(?:"+LQ+"|"+jBe+")",NBe="(?:"+HBe+"(?:d|ll|m|re|s|t|ve))?",LBe="(?:"+HBe+"(?:D|LL|M|RE|S|T|VE))?",WBe=WgA+"?",ZBe="["+PgA+"]?",e0A="(?:"+XgA+"(?:"+[ZgA,VBe,qBe].join("|")+")"+ZBe+WBe+")*",A0A=ZBe+WBe+e0A,t0A="(?:"+[VgA,VBe,qBe].join("|")+")"+A0A,i0A=RegExp([LQ+"?"+PBe+"+"+NBe+"(?="+[_Be,LQ,"$"].join("|")+")",$gA+"+"+LBe+"(?="+[_Be,LQ+RBe,"$"].join("|")+")",LQ+"?"+RBe+"+"+NBe,LQ+"+"+LBe,zBe,t0A].join("|"),"g"),n0A=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,o0A=typeof global=="object"&&global&&global.Object===Object&&global,r0A=typeof self=="object"&&self&&self.Object===Object&&self,s0A=o0A||r0A||Function("return this")();function a0A(t){return t.match(UgA)||[]}function c0A(t){return n0A.test(t)}function l0A(t){return t.match(i0A)||[]}var g0A=Object.prototype,d0A=g0A.toString,FBe=s0A.Symbol,GBe=FBe?FBe.prototype:void 0,KBe=GBe?GBe.toString:void 0;function C0A(t){if(typeof t=="string")return t;if(u0A(t))return KBe?KBe.call(t):"";var A=t+"";return A=="0"&&1/t==-GgA?"-0":A}function I0A(t){return!!t&&typeof t=="object"}function u0A(t){return typeof t=="symbol"||I0A(t)&&d0A.call(t)==KgA}function h0A(t){return t==null?"":C0A(t)}function B0A(t,A,e){return t=h0A(t),A=e?void 0:A,A===void 0?c0A(t)?l0A(t):a0A(t):t.match(A)||[]}XBe.exports=B0A});var uEe=XA((cdt,IEe)=>{"use strict";var E0A=1/0,f0A="[object Symbol]",Q0A=/^\s+/,jz="\\ud800-\\udfff",nEe="\\u0300-\\u036f\\ufe20-\\ufe23",oEe="\\u20d0-\\u20f0",rEe="\\ufe0e\\ufe0f",m0A="["+jz+"]",zz="["+nEe+oEe+"]",Pz="\\ud83c[\\udffb-\\udfff]",p0A="(?:"+zz+"|"+Pz+")",sEe="[^"+jz+"]",aEe="(?:\\ud83c[\\udde6-\\uddff]){2}",cEe="[\\ud800-\\udbff][\\udc00-\\udfff]",lEe="\\u200d",gEe=p0A+"?",dEe="["+rEe+"]?",w0A="(?:"+lEe+"(?:"+[sEe,aEe,cEe].join("|")+")"+dEe+gEe+")*",y0A=dEe+gEe+w0A,D0A="(?:"+[sEe+zz+"?",zz,aEe,cEe,m0A].join("|")+")",v0A=RegExp(Pz+"(?="+Pz+")|"+D0A+y0A,"g"),b0A=RegExp("["+lEe+jz+nEe+oEe+rEe+"]"),M0A=typeof global=="object"&&global&&global.Object===Object&&global,S0A=typeof self=="object"&&self&&self.Object===Object&&self,k0A=M0A||S0A||Function("return this")();function x0A(t){return t.split("")}function _0A(t,A,e,i){for(var n=t.length,o=e+(i?1:-1);i?o--:++o-1;);return e}function F0A(t){return b0A.test(t)}function eEe(t){return F0A(t)?G0A(t):x0A(t)}function G0A(t){return t.match(v0A)||[]}var K0A=Object.prototype,U0A=K0A.toString,AEe=k0A.Symbol,tEe=AEe?AEe.prototype:void 0,iEe=tEe?tEe.toString:void 0;function T0A(t,A,e){var i=-1,n=t.length;A<0&&(A=-A>n?0:n+A),e=e>n?n:e,e<0&&(e+=n),n=A>e?0:e-A>>>0,A>>>=0;for(var o=Array(n);++i=i?t:T0A(t,A,e)}function J0A(t){return!!t&&typeof t=="object"}function Y0A(t){return typeof t=="symbol"||J0A(t)&&U0A.call(t)==f0A}function H0A(t){return t==null?"":CEe(t)}function z0A(t,A,e){if(t=H0A(t),t&&(e||A===void 0))return t.replace(Q0A,"");if(!t||!(A=CEe(A)))return t;var i=eEe(t),n=L0A(i,eEe(A));return O0A(i,n).join("")}IEe.exports=z0A});var LEe=XA((ldt,NEe)=>{"use strict";var Vz=1/0,P0A=9007199254740991,j0A=17976931348623157e292,hEe=NaN,V0A="[object Symbol]",q0A=/^\s+|\s+$/g,W0A=/^[-+]0x[0-9a-f]+$/i,Z0A=/^0b[01]+$/i,X0A=/^0o[0-7]+$/i,Xz="\\ud800-\\udfff",pEe="\\u0300-\\u036f\\ufe20-\\ufe23",wEe="\\u20d0-\\u20f0",yEe="\\ufe0e\\ufe0f",$0A="["+Xz+"]",qz="["+pEe+wEe+"]",Wz="\\ud83c[\\udffb-\\udfff]",edA="(?:"+qz+"|"+Wz+")",DEe="[^"+Xz+"]",vEe="(?:\\ud83c[\\udde6-\\uddff]){2}",bEe="[\\ud800-\\udbff][\\udc00-\\udfff]",MEe="\\u200d",SEe=edA+"?",kEe="["+yEe+"]?",AdA="(?:"+MEe+"(?:"+[DEe,vEe,bEe].join("|")+")"+kEe+SEe+")*",tdA=kEe+SEe+AdA,idA="(?:"+[DEe+qz+"?",qz,vEe,bEe,$0A].join("|")+")",Zz=RegExp(Wz+"(?="+Wz+")|"+idA+tdA,"g"),ndA=RegExp("["+MEe+Xz+pEe+wEe+yEe+"]"),odA=parseInt,rdA=typeof global=="object"&&global&&global.Object===Object&&global,sdA=typeof self=="object"&&self&&self.Object===Object&&self,adA=rdA||sdA||Function("return this")(),cdA=gdA("length");function ldA(t){return t.split("")}function gdA(t){return function(A){return A?.[t]}}function $z(t){return ndA.test(t)}function xEe(t){return $z(t)?CdA(t):cdA(t)}function ddA(t){return $z(t)?IdA(t):ldA(t)}function CdA(t){for(var A=Zz.lastIndex=0;Zz.test(t);)A++;return A}function IdA(t){return t.match(Zz)||[]}var udA=Object.prototype,hdA=udA.toString,BEe=adA.Symbol,BdA=Math.ceil,EdA=Math.floor,EEe=BEe?BEe.prototype:void 0,fEe=EEe?EEe.toString:void 0;function QEe(t,A){var e="";if(!t||A<1||A>P0A)return e;do A%2&&(e+=t),A=EdA(A/2),A&&(t+=t);while(A);return e}function fdA(t,A,e){var i=-1,n=t.length;A<0&&(A=-A>n?0:n+A),e=e>n?n:e,e<0&&(e+=n),n=A>e?0:e-A>>>0,A>>>=0;for(var o=Array(n);++i=i?t:fdA(t,A,e)}function mdA(t,A){A=A===void 0?" ":_Ee(A);var e=A.length;if(e<2)return e?QEe(A,t):A;var i=QEe(A,BdA(t/xEe(A)));return $z(A)?QdA(ddA(i),0,t).join(""):i.slice(0,t)}function mEe(t){var A=typeof t;return!!t&&(A=="object"||A=="function")}function pdA(t){return!!t&&typeof t=="object"}function REe(t){return typeof t=="symbol"||pdA(t)&&hdA.call(t)==V0A}function wdA(t){if(!t)return t===0?t:0;if(t=DdA(t),t===Vz||t===-Vz){var A=t<0?-1:1;return A*j0A}return t===t?t:0}function ydA(t){var A=wdA(t),e=A%1;return A===A?e?A-e:A:0}function DdA(t){if(typeof t=="number")return t;if(REe(t))return hEe;if(mEe(t)){var A=typeof t.valueOf=="function"?t.valueOf():t;t=mEe(A)?A+"":A}if(typeof t!="string")return t===0?t:+t;t=t.replace(q0A,"");var e=Z0A.test(t);return e||X0A.test(t)?odA(t.slice(2),e?2:8):W0A.test(t)?hEe:+t}function vdA(t){return t==null?"":_Ee(t)}function bdA(t,A,e){t=vdA(t),A=ydA(A);var i=A?xEe(t):0;return A&&i{"use strict";FEe.exports=(t,A,e,i)=>{let n=(t+(i||"")).toString().includes("%");if(typeof t=="string"?[t,A,e,i]=t.match(/(0?\.?\d{1,3})%?\b/g).map(Number):i!==void 0&&(i=parseFloat(i)),typeof t!="number"||typeof A!="number"||typeof e!="number"||t>255||A>255||e>255)throw new TypeError("Expected three numbers below 256");if(typeof i=="number"){if(!n&&i>=0&&i<=1)i=Math.round(255*i);else if(n&&i>=0&&i<=100)i=Math.round(255*i/100);else throw new TypeError(`Expected alpha value (${i}) as a fraction or percentage`);i=(i|256).toString(16).slice(1)}else i="";return(e|A<<8|t<<16|1<<24).toString(16).slice(1)+i}});var UEe=XA((ddt,KEe)=>{"use strict";var n8="a-f\\d",MdA=`#?[${n8}]{3}[${n8}]?`,SdA=`#?[${n8}]{6}([${n8}]{2})?`,kdA=new RegExp(`[^#${n8}]`,"gi"),xdA=new RegExp(`^${MdA}$|^${SdA}$`,"i");KEe.exports=(t,A={})=>{if(typeof t!="string"||kdA.test(t)||!xdA.test(t))throw new TypeError("Expected a valid hex string");t=t.replace(/^#/,"");let e=1;t.length===8&&(e=Number.parseInt(t.slice(6,8),16)/255,t=t.slice(0,6)),t.length===4&&(e=Number.parseInt(t.slice(3,4).repeat(2),16)/255,t=t.slice(0,3)),t.length===3&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]);let i=Number.parseInt(t,16),n=i>>16,o=i>>8&255,r=i&255,s=typeof A.alpha=="number"?A.alpha:e;if(A.format==="array")return[n,o,r,s];if(A.format==="css"){let a=s===1?"":` / ${Number((s*100).toFixed(2))}%`;return`rgb(${n} ${o} ${r}${a})`}return{red:n,green:o,blue:r,alpha:s}}});var JEe=XA((Cdt,OEe)=>{"use strict";var _dA=xBe(),RdA=$Be(),NdA=uEe(),LdA=LEe(),FdA=GEe(),TEe=UEe(),eP=.75,AP=.25,tP=16777215,GdA=49979693;OEe.exports=function(t){return"#"+TdA(String(JSON.stringify(t)))};function KdA(t){var A=RdA(t),e=[];return A.forEach(function(i){var n=_dA(i);n&&e.push(TEe(NdA(n,"#"),{format:"array"}))}),e}function UdA(t){var A=[0,0,0];return t.forEach(function(e){for(var i=0;i<3;i++)A[i]+=e[i]}),[A[0]/t.length,A[1]/t.length,A[2]/t.length]}function TdA(t){var A,e=KdA(t);e.length>0&&(A=UdA(e));var i=1,n=0,o=1;if(t.length>0)for(var r=0;rn&&(n=t[r].charCodeAt(0)),o=parseInt(tP/n),i=(i+t[r].charCodeAt(0)*o*GdA)%tP;var s=(i*t.length%tP).toString(16);s=LdA(s,6,s);var a=TEe(s,{format:"array"});return A?FdA(AP*a[0]+eP*A[0],AP*a[1]+eP*A[1],AP*a[2]+eP*A[2]):s}});function bk(t,A){return Object.is(t,A)}var ms=null,s8=!1,Mk=1,Cc=Symbol("SIGNAL");function Ui(t){let A=ms;return ms=t,A}function Sk(){return ms}var Rh={version:0,lastCleanEpoch:0,dirty:!1,producerNode:void 0,producerLastReadVersion:void 0,producerIndexOfThis:void 0,nextProducerIndex:0,liveConsumerNode:void 0,liveConsumerIndexOfThis:void 0,consumerAllowSignalWrites:!1,consumerIsAlwaysLive:!1,kind:"unknown",producerMustRecompute:()=>!1,producerRecomputeValue:()=>{},consumerMarkedDirty:()=>{},consumerOnSignalRead:()=>{}};function HQ(t){if(s8)throw new Error("");if(ms===null)return;ms.consumerOnSignalRead(t);let A=ms.nextProducerIndex++;if(d8(ms),At.nextProducerIndex;)t.producerNode.pop(),t.producerLastReadVersion.pop(),t.producerIndexOfThis.pop()}}function l8(t){d8(t);for(let A=0;A0}function d8(t){t.producerNode??=[],t.producerIndexOfThis??=[],t.producerLastReadVersion??=[]}function aP(t){t.liveConsumerNode??=[],t.liveConsumerIndexOfThis??=[]}function cP(t){return t.producerNode!==void 0}function C8(t,A){let e=Object.create(ZEe);e.computation=t,A!==void 0&&(e.equal=A);let i=()=>{if(kk(e),HQ(e),e.value===a8)throw e.error;return e.value};return i[Cc]=e,i}var yk=Symbol("UNSET"),Dk=Symbol("COMPUTING"),a8=Symbol("ERRORED"),ZEe=_A(ae({},Rh),{value:yk,dirty:!0,error:null,equal:bk,kind:"computed",producerMustRecompute(t){return t.value===yk||t.value===Dk},producerRecomputeValue(t){if(t.value===Dk)throw new Error("Detected cycle in computations.");let A=t.value;t.value=Dk;let e=zQ(t),i,n=!1;try{i=t.computation(),Ui(null),n=A!==yk&&A!==a8&&i!==a8&&t.equal(A,i)}catch(o){i=a8,t.error=o}finally{c8(t,e)}if(n){t.value=A;return}t.value=i,t.version++}});function XEe(){throw new Error}var lP=XEe;function gP(t){lP(t)}function Rk(t){lP=t}var $Ee=null;function Nk(t,A){let e=Object.create(I8);e.value=t,A!==void 0&&(e.equal=A);let i=()=>(HQ(e),e.value);return i[Cc]=e,i}function jQ(t,A){_k()||gP(t),t.equal(t.value,A)||(t.value=A,efe(t))}function Lk(t,A){_k()||gP(t),jQ(t,A(t.value))}var I8=_A(ae({},Rh),{equal:bk,value:void 0,kind:"signal"});function efe(t){t.version++,rP(),xk(t),$Ee?.()}function Fk(t){let A=Ui(null);try{return t()}finally{Ui(A)}}var Gk;function VQ(){return Gk}function qd(t){let A=Gk;return Gk=t,A}var u8=Symbol("NotFound");function gi(t){return typeof t=="function"}function Nh(t){let e=t(i=>{Error.call(i),i.stack=new Error().stack});return e.prototype=Object.create(Error.prototype),e.prototype.constructor=e,e}var h8=Nh(t=>function(e){t(this),this.message=e?`${e.length} errors occurred during unsubscription: +${e.map((i,n)=>`${n+1}) ${i.toString()}`).join(` + `)}`:"",this.name="UnsubscriptionError",this.errors=e});function yI(t,A){if(t){let e=t.indexOf(A);0<=e&&t.splice(e,1)}}var Ot=class t{constructor(A){this.initialTeardown=A,this.closed=!1,this._parentage=null,this._finalizers=null}unsubscribe(){let A;if(!this.closed){this.closed=!0;let{_parentage:e}=this;if(e)if(this._parentage=null,Array.isArray(e))for(let o of e)o.remove(this);else e.remove(this);let{initialTeardown:i}=this;if(gi(i))try{i()}catch(o){A=o instanceof h8?o.errors:[o]}let{_finalizers:n}=this;if(n){this._finalizers=null;for(let o of n)try{dP(o)}catch(r){A=A??[],r instanceof h8?A=[...A,...r.errors]:A.push(r)}}if(A)throw new h8(A)}}add(A){var e;if(A&&A!==this)if(this.closed)dP(A);else{if(A instanceof t){if(A.closed||A._hasParent(this))return;A._addParent(this)}(this._finalizers=(e=this._finalizers)!==null&&e!==void 0?e:[]).push(A)}}_hasParent(A){let{_parentage:e}=this;return e===A||Array.isArray(e)&&e.includes(A)}_addParent(A){let{_parentage:e}=this;this._parentage=Array.isArray(e)?(e.push(A),e):e?[e,A]:A}_removeParent(A){let{_parentage:e}=this;e===A?this._parentage=null:Array.isArray(e)&&yI(e,A)}remove(A){let{_finalizers:e}=this;e&&yI(e,A),A instanceof t&&A._removeParent(this)}};Ot.EMPTY=(()=>{let t=new Ot;return t.closed=!0,t})();var Kk=Ot.EMPTY;function B8(t){return t instanceof Ot||t&&"closed"in t&&gi(t.remove)&&gi(t.add)&&gi(t.unsubscribe)}function dP(t){gi(t)?t():t.unsubscribe()}var Eg={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var Lh={setTimeout(t,A,...e){let{delegate:i}=Lh;return i?.setTimeout?i.setTimeout(t,A,...e):setTimeout(t,A,...e)},clearTimeout(t){let{delegate:A}=Lh;return(A?.clearTimeout||clearTimeout)(t)},delegate:void 0};function E8(t){Lh.setTimeout(()=>{let{onUnhandledError:A}=Eg;if(A)A(t);else throw t})}function DI(){}var CP=Uk("C",void 0,void 0);function IP(t){return Uk("E",void 0,t)}function uP(t){return Uk("N",t,void 0)}function Uk(t,A,e){return{kind:t,value:A,error:e}}var vI=null;function Fh(t){if(Eg.useDeprecatedSynchronousErrorHandling){let A=!vI;if(A&&(vI={errorThrown:!1,error:null}),t(),A){let{errorThrown:e,error:i}=vI;if(vI=null,e)throw i}}else t()}function hP(t){Eg.useDeprecatedSynchronousErrorHandling&&vI&&(vI.errorThrown=!0,vI.error=t)}var Wd=class extends Ot{constructor(A){super(),this.isStopped=!1,A?(this.destination=A,B8(A)&&A.add(this)):this.destination=rfe}static create(A,e,i){return new fg(A,e,i)}next(A){this.isStopped?Ok(uP(A),this):this._next(A)}error(A){this.isStopped?Ok(IP(A),this):(this.isStopped=!0,this._error(A))}complete(){this.isStopped?Ok(CP,this):(this.isStopped=!0,this._complete())}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe(),this.destination=null)}_next(A){this.destination.next(A)}_error(A){try{this.destination.error(A)}finally{this.unsubscribe()}}_complete(){try{this.destination.complete()}finally{this.unsubscribe()}}},nfe=Function.prototype.bind;function Tk(t,A){return nfe.call(t,A)}var Jk=class{constructor(A){this.partialObserver=A}next(A){let{partialObserver:e}=this;if(e.next)try{e.next(A)}catch(i){f8(i)}}error(A){let{partialObserver:e}=this;if(e.error)try{e.error(A)}catch(i){f8(i)}else f8(A)}complete(){let{partialObserver:A}=this;if(A.complete)try{A.complete()}catch(e){f8(e)}}},fg=class extends Wd{constructor(A,e,i){super();let n;if(gi(A)||!A)n={next:A??void 0,error:e??void 0,complete:i??void 0};else{let o;this&&Eg.useDeprecatedNextContext?(o=Object.create(A),o.unsubscribe=()=>this.unsubscribe(),n={next:A.next&&Tk(A.next,o),error:A.error&&Tk(A.error,o),complete:A.complete&&Tk(A.complete,o)}):n=A}this.destination=new Jk(n)}};function f8(t){Eg.useDeprecatedSynchronousErrorHandling?hP(t):E8(t)}function ofe(t){throw t}function Ok(t,A){let{onStoppedNotification:e}=Eg;e&&Lh.setTimeout(()=>e(t,A))}var rfe={closed:!0,next:DI,error:ofe,complete:DI};var Gh=typeof Symbol=="function"&&Symbol.observable||"@@observable";function qs(t){return t}function Yk(...t){return Hk(t)}function Hk(t){return t.length===0?qs:t.length===1?t[0]:function(e){return t.reduce((i,n)=>n(i),e)}}var nt=(()=>{class t{constructor(e){e&&(this._subscribe=e)}lift(e){let i=new t;return i.source=this,i.operator=e,i}subscribe(e,i,n){let o=afe(e)?e:new fg(e,i,n);return Fh(()=>{let{operator:r,source:s}=this;o.add(r?r.call(o,s):s?this._subscribe(o):this._trySubscribe(o))}),o}_trySubscribe(e){try{return this._subscribe(e)}catch(i){e.error(i)}}forEach(e,i){return i=BP(i),new i((n,o)=>{let r=new fg({next:s=>{try{e(s)}catch(a){o(a),r.unsubscribe()}},error:o,complete:n});this.subscribe(r)})}_subscribe(e){var i;return(i=this.source)===null||i===void 0?void 0:i.subscribe(e)}[Gh](){return this}pipe(...e){return Hk(e)(this)}toPromise(e){return e=BP(e),new e((i,n)=>{let o;this.subscribe(r=>o=r,r=>n(r),()=>i(o))})}}return t.create=A=>new t(A),t})();function BP(t){var A;return(A=t??Eg.Promise)!==null&&A!==void 0?A:Promise}function sfe(t){return t&&gi(t.next)&&gi(t.error)&&gi(t.complete)}function afe(t){return t&&t instanceof Wd||sfe(t)&&B8(t)}function zk(t){return gi(t?.lift)}function hi(t){return A=>{if(zk(A))return A.lift(function(e){try{return t(e,this)}catch(i){this.error(i)}});throw new TypeError("Unable to lift unknown Observable type")}}function si(t,A,e,i,n){return new Pk(t,A,e,i,n)}var Pk=class extends Wd{constructor(A,e,i,n,o,r){super(A),this.onFinalize=o,this.shouldUnsubscribe=r,this._next=e?function(s){try{e(s)}catch(a){A.error(a)}}:super._next,this._error=n?function(s){try{n(s)}catch(a){A.error(a)}finally{this.unsubscribe()}}:super._error,this._complete=i?function(){try{i()}catch(s){A.error(s)}finally{this.unsubscribe()}}:super._complete}unsubscribe(){var A;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){let{closed:e}=this;super.unsubscribe(),!e&&((A=this.onFinalize)===null||A===void 0||A.call(this))}}};function Kh(){return hi((t,A)=>{let e=null;t._refCount++;let i=si(A,void 0,void 0,void 0,()=>{if(!t||t._refCount<=0||0<--t._refCount){e=null;return}let n=t._connection,o=e;e=null,n&&(!o||n===o)&&n.unsubscribe(),A.unsubscribe()});t.subscribe(i),i.closed||(e=t.connect())})}var g1=class extends nt{constructor(A,e){super(),this.source=A,this.subjectFactory=e,this._subject=null,this._refCount=0,this._connection=null,zk(A)&&(this.lift=A.lift)}_subscribe(A){return this.getSubject().subscribe(A)}getSubject(){let A=this._subject;return(!A||A.isStopped)&&(this._subject=this.subjectFactory()),this._subject}_teardown(){this._refCount=0;let{_connection:A}=this;this._subject=this._connection=null,A?.unsubscribe()}connect(){let A=this._connection;if(!A){A=this._connection=new Ot;let e=this.getSubject();A.add(this.source.subscribe(si(e,void 0,()=>{this._teardown(),e.complete()},i=>{this._teardown(),e.error(i)},()=>this._teardown()))),A.closed&&(this._connection=null,A=Ot.EMPTY)}return A}refCount(){return Kh()(this)}};var Uh={schedule(t){let A=requestAnimationFrame,e=cancelAnimationFrame,{delegate:i}=Uh;i&&(A=i.requestAnimationFrame,e=i.cancelAnimationFrame);let n=A(o=>{e=void 0,t(o)});return new Ot(()=>e?.(n))},requestAnimationFrame(...t){let{delegate:A}=Uh;return(A?.requestAnimationFrame||requestAnimationFrame)(...t)},cancelAnimationFrame(...t){let{delegate:A}=Uh;return(A?.cancelAnimationFrame||cancelAnimationFrame)(...t)},delegate:void 0};var EP=Nh(t=>function(){t(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"});var je=(()=>{class t extends nt{constructor(){super(),this.closed=!1,this.currentObservers=null,this.observers=[],this.isStopped=!1,this.hasError=!1,this.thrownError=null}lift(e){let i=new Th(this,this);return i.operator=e,i}_throwIfClosed(){if(this.closed)throw new EP}next(e){Fh(()=>{if(this._throwIfClosed(),!this.isStopped){this.currentObservers||(this.currentObservers=Array.from(this.observers));for(let i of this.currentObservers)i.next(e)}})}error(e){Fh(()=>{if(this._throwIfClosed(),!this.isStopped){this.hasError=this.isStopped=!0,this.thrownError=e;let{observers:i}=this;for(;i.length;)i.shift().error(e)}})}complete(){Fh(()=>{if(this._throwIfClosed(),!this.isStopped){this.isStopped=!0;let{observers:e}=this;for(;e.length;)e.shift().complete()}})}unsubscribe(){this.isStopped=this.closed=!0,this.observers=this.currentObservers=null}get observed(){var e;return((e=this.observers)===null||e===void 0?void 0:e.length)>0}_trySubscribe(e){return this._throwIfClosed(),super._trySubscribe(e)}_subscribe(e){return this._throwIfClosed(),this._checkFinalizedStatuses(e),this._innerSubscribe(e)}_innerSubscribe(e){let{hasError:i,isStopped:n,observers:o}=this;return i||n?Kk:(this.currentObservers=null,o.push(e),new Ot(()=>{this.currentObservers=null,yI(o,e)}))}_checkFinalizedStatuses(e){let{hasError:i,thrownError:n,isStopped:o}=this;i?e.error(n):o&&e.complete()}asObservable(){let e=new nt;return e.source=this,e}}return t.create=(A,e)=>new Th(A,e),t})(),Th=class extends je{constructor(A,e){super(),this.destination=A,this.source=e}next(A){var e,i;(i=(e=this.destination)===null||e===void 0?void 0:e.next)===null||i===void 0||i.call(e,A)}error(A){var e,i;(i=(e=this.destination)===null||e===void 0?void 0:e.error)===null||i===void 0||i.call(e,A)}complete(){var A,e;(e=(A=this.destination)===null||A===void 0?void 0:A.complete)===null||e===void 0||e.call(A)}_subscribe(A){var e,i;return(i=(e=this.source)===null||e===void 0?void 0:e.subscribe(A))!==null&&i!==void 0?i:Kk}};var Mt=class extends je{constructor(A){super(),this._value=A}get value(){return this.getValue()}_subscribe(A){let e=super._subscribe(A);return!e.closed&&A.next(this._value),e}getValue(){let{hasError:A,thrownError:e,_value:i}=this;if(A)throw e;return this._throwIfClosed(),i}next(A){super.next(this._value=A)}};var qQ={now(){return(qQ.delegate||Date).now()},delegate:void 0};var Zc=class extends je{constructor(A=1/0,e=1/0,i=qQ){super(),this._bufferSize=A,this._windowTime=e,this._timestampProvider=i,this._buffer=[],this._infiniteTimeWindow=!0,this._infiniteTimeWindow=e===1/0,this._bufferSize=Math.max(1,A),this._windowTime=Math.max(1,e)}next(A){let{isStopped:e,_buffer:i,_infiniteTimeWindow:n,_timestampProvider:o,_windowTime:r}=this;e||(i.push(A),!n&&i.push(o.now()+r)),this._trimBuffer(),super.next(A)}_subscribe(A){this._throwIfClosed(),this._trimBuffer();let e=this._innerSubscribe(A),{_infiniteTimeWindow:i,_buffer:n}=this,o=n.slice();for(let r=0;r0?super.requestAsyncId(A,e,i):(A.actions.push(this),A._scheduled||(A._scheduled=Uh.requestAnimationFrame(()=>A.flush(void 0))))}recycleAsyncId(A,e,i=0){var n;if(i!=null?i>0:this.delay>0)return super.recycleAsyncId(A,e,i);let{actions:o}=A;e!=null&&e===A._scheduled&&((n=o[o.length-1])===null||n===void 0?void 0:n.id)!==e&&(Uh.cancelAnimationFrame(e),A._scheduled=void 0)}};var p8=class extends Yh{flush(A){this._active=!0;let e;A?e=A.id:(e=this._scheduled,this._scheduled=void 0);let{actions:i}=this,n;A=A||i.shift();do if(n=A.execute(A.state,A.delay))break;while((A=i[0])&&A.id===e&&i.shift());if(this._active=!1,n){for(;(A=i[0])&&A.id===e&&i.shift();)A.unsubscribe();throw n}}};var ZQ=new p8(m8);var vr=new nt(t=>t.complete());function w8(t){return t&&gi(t.schedule)}function Vk(t){return t[t.length-1]}function d1(t){return gi(Vk(t))?t.pop():void 0}function v0(t){return w8(Vk(t))?t.pop():void 0}function fP(t,A){return typeof Vk(t)=="number"?t.pop():A}function XQ(t,A,e,i){var n=arguments.length,o=n<3?A:i===null?i=Object.getOwnPropertyDescriptor(A,e):i,r;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")o=Reflect.decorate(t,A,e,i);else for(var s=t.length-1;s>=0;s--)(r=t[s])&&(o=(n<3?r(o):n>3?r(A,e,o):r(A,e))||o);return n>3&&o&&Object.defineProperty(A,e,o),o}function mP(t,A,e,i){function n(o){return o instanceof e?o:new e(function(r){r(o)})}return new(e||(e=Promise))(function(o,r){function s(l){try{c(i.next(l))}catch(d){r(d)}}function a(l){try{c(i.throw(l))}catch(d){r(d)}}function c(l){l.done?o(l.value):n(l.value).then(s,a)}c((i=i.apply(t,A||[])).next())})}function QP(t){var A=typeof Symbol=="function"&&Symbol.iterator,e=A&&t[A],i=0;if(e)return e.call(t);if(t&&typeof t.length=="number")return{next:function(){return t&&i>=t.length&&(t=void 0),{value:t&&t[i++],done:!t}}};throw new TypeError(A?"Object is not iterable.":"Symbol.iterator is not defined.")}function bI(t){return this instanceof bI?(this.v=t,this):new bI(t)}function pP(t,A,e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var i=e.apply(t,A||[]),n,o=[];return n=Object.create((typeof AsyncIterator=="function"?AsyncIterator:Object).prototype),s("next"),s("throw"),s("return",r),n[Symbol.asyncIterator]=function(){return this},n;function r(I){return function(u){return Promise.resolve(u).then(I,d)}}function s(I,u){i[I]&&(n[I]=function(h){return new Promise(function(B,f){o.push([I,h,B,f])>1||a(I,h)})},u&&(n[I]=u(n[I])))}function a(I,u){try{c(i[I](u))}catch(h){C(o[0][3],h)}}function c(I){I.value instanceof bI?Promise.resolve(I.value.v).then(l,d):C(o[0][2],I)}function l(I){a("next",I)}function d(I){a("throw",I)}function C(I,u){I(u),o.shift(),o.length&&a(o[0][0],o[0][1])}}function wP(t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var A=t[Symbol.asyncIterator],e;return A?A.call(t):(t=typeof QP=="function"?QP(t):t[Symbol.iterator](),e={},i("next"),i("throw"),i("return"),e[Symbol.asyncIterator]=function(){return this},e);function i(o){e[o]=t[o]&&function(r){return new Promise(function(s,a){r=t[o](r),n(s,a,r.done,r.value)})}}function n(o,r,s,a){Promise.resolve(a).then(function(c){o({value:c,done:s})},r)}}var Hh=t=>t&&typeof t.length=="number"&&typeof t!="function";function y8(t){return gi(t?.then)}function D8(t){return gi(t[Gh])}function v8(t){return Symbol.asyncIterator&&gi(t?.[Symbol.asyncIterator])}function b8(t){return new TypeError(`You provided ${t!==null&&typeof t=="object"?"an invalid object":`'${t}'`} where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`)}function cfe(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var M8=cfe();function S8(t){return gi(t?.[M8])}function k8(t){return pP(this,arguments,function*(){let e=t.getReader();try{for(;;){let{value:i,done:n}=yield bI(e.read());if(n)return yield bI(void 0);yield yield bI(i)}}finally{e.releaseLock()}})}function x8(t){return gi(t?.getReader)}function zn(t){if(t instanceof nt)return t;if(t!=null){if(D8(t))return lfe(t);if(Hh(t))return gfe(t);if(y8(t))return dfe(t);if(v8(t))return yP(t);if(S8(t))return Cfe(t);if(x8(t))return Ife(t)}throw b8(t)}function lfe(t){return new nt(A=>{let e=t[Gh]();if(gi(e.subscribe))return e.subscribe(A);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function gfe(t){return new nt(A=>{for(let e=0;e{t.then(e=>{A.closed||(A.next(e),A.complete())},e=>A.error(e)).then(null,E8)})}function Cfe(t){return new nt(A=>{for(let e of t)if(A.next(e),A.closed)return;A.complete()})}function yP(t){return new nt(A=>{ufe(t,A).catch(e=>A.error(e))})}function Ife(t){return yP(k8(t))}function ufe(t,A){var e,i,n,o;return mP(this,void 0,void 0,function*(){try{for(e=wP(t);i=yield e.next(),!i.done;){let r=i.value;if(A.next(r),A.closed)return}}catch(r){n={error:r}}finally{try{i&&!i.done&&(o=e.return)&&(yield o.call(e))}finally{if(n)throw n.error}}A.complete()})}function Ic(t,A,e,i=0,n=!1){let o=A.schedule(function(){e(),n?t.add(this.schedule(null,i)):this.unsubscribe()},i);if(t.add(o),!n)return o}function Qg(t,A=0){return hi((e,i)=>{e.subscribe(si(i,n=>Ic(i,t,()=>i.next(n),A),()=>Ic(i,t,()=>i.complete(),A),n=>Ic(i,t,()=>i.error(n),A)))})}function _8(t,A=0){return hi((e,i)=>{i.add(t.schedule(()=>e.subscribe(i),A))})}function DP(t,A){return zn(t).pipe(_8(A),Qg(A))}function vP(t,A){return zn(t).pipe(_8(A),Qg(A))}function bP(t,A){return new nt(e=>{let i=0;return A.schedule(function(){i===t.length?e.complete():(e.next(t[i++]),e.closed||this.schedule())})})}function MP(t,A){return new nt(e=>{let i;return Ic(e,A,()=>{i=t[M8](),Ic(e,A,()=>{let n,o;try{({value:n,done:o}=i.next())}catch(r){e.error(r);return}o?e.complete():e.next(n)},0,!0)}),()=>gi(i?.return)&&i.return()})}function R8(t,A){if(!t)throw new Error("Iterable cannot be null");return new nt(e=>{Ic(e,A,()=>{let i=t[Symbol.asyncIterator]();Ic(e,A,()=>{i.next().then(n=>{n.done?e.complete():e.next(n.value)})},0,!0)})})}function SP(t,A){return R8(k8(t),A)}function kP(t,A){if(t!=null){if(D8(t))return DP(t,A);if(Hh(t))return bP(t,A);if(y8(t))return vP(t,A);if(v8(t))return R8(t,A);if(S8(t))return MP(t,A);if(x8(t))return SP(t,A)}throw b8(t)}function xo(t,A){return A?kP(t,A):zn(t)}function dA(...t){let A=v0(t);return xo(t,A)}function C1(t,A){let e=gi(t)?t:()=>t,i=n=>n.error(e());return new nt(A?n=>A.schedule(i,0,n):i)}function I1(t){return!!t&&(t instanceof nt||gi(t.lift)&&gi(t.subscribe))}var mg=Nh(t=>function(){t(this),this.name="EmptyError",this.message="no elements in sequence"});function qk(t,A){let e=typeof A=="object";return new Promise((i,n)=>{let o=new fg({next:r=>{i(r),o.unsubscribe()},error:n,complete:()=>{e?i(A.defaultValue):n(new mg)}});t.subscribe(o)})}function xP(t){return t instanceof Date&&!isNaN(t)}function aA(t,A){return hi((e,i)=>{let n=0;e.subscribe(si(i,o=>{i.next(t.call(A,o,n++))}))})}var{isArray:hfe}=Array;function Bfe(t,A){return hfe(A)?t(...A):t(A)}function zh(t){return aA(A=>Bfe(t,A))}var{isArray:Efe}=Array,{getPrototypeOf:ffe,prototype:Qfe,keys:mfe}=Object;function N8(t){if(t.length===1){let A=t[0];if(Efe(A))return{args:A,keys:null};if(pfe(A)){let e=mfe(A);return{args:e.map(i=>A[i]),keys:e}}}return{args:t,keys:null}}function pfe(t){return t&&typeof t=="object"&&ffe(t)===Qfe}function L8(t,A){return t.reduce((e,i,n)=>(e[i]=A[n],e),{})}function uc(...t){let A=v0(t),e=d1(t),{args:i,keys:n}=N8(t);if(i.length===0)return xo([],A);let o=new nt(wfe(i,A,n?r=>L8(n,r):qs));return e?o.pipe(zh(e)):o}function wfe(t,A,e=qs){return i=>{_P(A,()=>{let{length:n}=t,o=new Array(n),r=n,s=n;for(let a=0;a{let c=xo(t[a],A),l=!1;c.subscribe(si(i,d=>{o[a]=d,l||(l=!0,s--),s||i.next(e(o.slice()))},()=>{--r||i.complete()}))},i)},i)}}function _P(t,A,e){t?Ic(e,t,A):A()}function RP(t,A,e,i,n,o,r,s){let a=[],c=0,l=0,d=!1,C=()=>{d&&!a.length&&!c&&A.complete()},I=h=>c{o&&A.next(h),c++;let B=!1;zn(e(h,l++)).subscribe(si(A,f=>{n?.(f),o?I(f):A.next(f)},()=>{B=!0},void 0,()=>{if(B)try{for(c--;a.length&&cu(f)):u(f)}C()}catch(f){A.error(f)}}))};return t.subscribe(si(A,I,()=>{d=!0,C()})),()=>{s?.()}}function Lr(t,A,e=1/0){return gi(A)?Lr((i,n)=>aA((o,r)=>A(i,o,n,r))(zn(t(i,n))),e):(typeof A=="number"&&(e=A),hi((i,n)=>RP(i,n,t,e)))}function u1(t=1/0){return Lr(qs,t)}function NP(){return u1(1)}function h1(...t){return NP()(xo(t,v0(t)))}function b0(t){return new nt(A=>{zn(t()).subscribe(A)})}function $Q(...t){let A=d1(t),{args:e,keys:i}=N8(t),n=new nt(o=>{let{length:r}=e;if(!r){o.complete();return}let s=new Array(r),a=r,c=r;for(let l=0;l{d||(d=!0,c--),s[l]=C},()=>a--,void 0,()=>{(!a||!d)&&(c||o.next(i?L8(i,s):s),o.complete())}))}});return A?n.pipe(zh(A)):n}var yfe=["addListener","removeListener"],Dfe=["addEventListener","removeEventListener"],vfe=["on","off"];function Ya(t,A,e,i){if(gi(e)&&(i=e,e=void 0),i)return Ya(t,A,e).pipe(zh(i));let[n,o]=Sfe(t)?Dfe.map(r=>s=>t[r](A,s,e)):bfe(t)?yfe.map(LP(t,A)):Mfe(t)?vfe.map(LP(t,A)):[];if(!n&&Hh(t))return Lr(r=>Ya(r,A,e))(zn(t));if(!n)throw new TypeError("Invalid event target");return new nt(r=>{let s=(...a)=>r.next(1o(s)})}function LP(t,A){return e=>i=>t[e](A,i)}function bfe(t){return gi(t.addListener)&&gi(t.removeListener)}function Mfe(t){return gi(t.on)&&gi(t.off)}function Sfe(t){return gi(t.addEventListener)&&gi(t.removeEventListener)}function MI(t=0,A,e=jk){let i=-1;return A!=null&&(w8(A)?e=A:i=A),new nt(n=>{let o=xP(t)?+t-e.now():t;o<0&&(o=0);let r=0;return e.schedule(function(){n.closed||(n.next(r++),0<=i?this.schedule(void 0,i):n.complete())},o)})}function Bi(...t){let A=v0(t),e=fP(t,1/0),i=t;return i.length?i.length===1?zn(i[0]):u1(e)(xo(i,A)):vr}var{isArray:kfe}=Array;function FP(t){return t.length===1&&kfe(t[0])?t[0]:t}function $A(t,A){return hi((e,i)=>{let n=0;e.subscribe(si(i,o=>t.call(A,o,n++)&&i.next(o)))})}function Wk(...t){let A=d1(t),e=FP(t);return e.length?new nt(i=>{let n=e.map(()=>[]),o=e.map(()=>!1);i.add(()=>{n=o=null});for(let r=0;!i.closed&&r{if(n[r].push(s),n.every(a=>a.length)){let a=n.map(c=>c.shift());i.next(A?A(...a):a),n.some((c,l)=>!c.length&&o[l])&&i.complete()}},()=>{o[r]=!0,!n[r].length&&i.complete()}));return()=>{n=o=null}}):vr}function GP(t){return hi((A,e)=>{let i=!1,n=null,o=null,r=!1,s=()=>{if(o?.unsubscribe(),o=null,i){i=!1;let c=n;n=null,e.next(c)}r&&e.complete()},a=()=>{o=null,r&&e.complete()};A.subscribe(si(e,c=>{i=!0,n=c,o||zn(t(c)).subscribe(o=si(e,s,a))},()=>{r=!0,(!i||!o||o.closed)&&e.complete()}))})}function Ph(t,A=D0){return GP(()=>MI(t,A))}function br(t){return hi((A,e)=>{let i=null,n=!1,o;i=A.subscribe(si(e,void 0,void 0,r=>{o=zn(t(r,br(t)(A))),i?(i.unsubscribe(),i=null,o.subscribe(e)):n=!0})),n&&(i.unsubscribe(),i=null,o.subscribe(e))})}function KP(t,A,e,i,n){return(o,r)=>{let s=e,a=A,c=0;o.subscribe(si(r,l=>{let d=c++;a=s?t(a,l,d):(s=!0,l),i&&r.next(a)},n&&(()=>{s&&r.next(a),r.complete()})))}}function M0(t,A){return gi(A)?Lr(t,A,1):Lr(t,1)}function Ws(t,A=D0){return hi((e,i)=>{let n=null,o=null,r=null,s=()=>{if(n){n.unsubscribe(),n=null;let c=o;o=null,i.next(c)}};function a(){let c=r+t,l=A.now();if(l{o=c,r=A.now(),n||(n=A.schedule(a,t),i.add(n))},()=>{s(),i.complete()},void 0,()=>{o=n=null}))})}function B1(t){return hi((A,e)=>{let i=!1;A.subscribe(si(e,n=>{i=!0,e.next(n)},()=>{i||e.next(t),e.complete()}))})}function Pn(t){return t<=0?()=>vr:hi((A,e)=>{let i=0;A.subscribe(si(e,n=>{++i<=t&&(e.next(n),t<=i&&e.complete())}))})}function jh(t){return aA(()=>t)}function Ha(t,A=qs){return t=t??xfe,hi((e,i)=>{let n,o=!0;e.subscribe(si(i,r=>{let s=A(r);(o||!t(n,s))&&(o=!1,n=s,i.next(r))}))})}function xfe(t,A){return t===A}function F8(t=_fe){return hi((A,e)=>{let i=!1;A.subscribe(si(e,n=>{i=!0,e.next(n)},()=>i?e.complete():e.error(t())))})}function _fe(){return new mg}function S0(t){return hi((A,e)=>{try{A.subscribe(e)}finally{e.add(t)}})}function _l(t,A){let e=arguments.length>=2;return i=>i.pipe(t?$A((n,o)=>t(n,o,i)):qs,Pn(1),e?B1(A):F8(()=>new mg))}function Vh(t){return t<=0?()=>vr:hi((A,e)=>{let i=[];A.subscribe(si(e,n=>{i.push(n),t{for(let n of i)e.next(n);e.complete()},void 0,()=>{i=null}))})}function Zk(t,A){let e=arguments.length>=2;return i=>i.pipe(t?$A((n,o)=>t(n,o,i)):qs,Vh(1),e?B1(A):F8(()=>new mg))}function k0(){return hi((t,A)=>{let e,i=!1;t.subscribe(si(A,n=>{let o=e;e=n,i&&A.next([o,n]),i=!0}))})}function Xk(t,A){return hi(KP(t,A,arguments.length>=2,!0))}function Rl(t={}){let{connector:A=()=>new je,resetOnError:e=!0,resetOnComplete:i=!0,resetOnRefCountZero:n=!0}=t;return o=>{let r,s,a,c=0,l=!1,d=!1,C=()=>{s?.unsubscribe(),s=void 0},I=()=>{C(),r=a=void 0,l=d=!1},u=()=>{let h=r;I(),h?.unsubscribe()};return hi((h,B)=>{c++,!d&&!l&&C();let f=a=a??A();B.add(()=>{c--,c===0&&!d&&!l&&(s=$k(u,n))}),f.subscribe(B),!r&&c>0&&(r=new fg({next:b=>f.next(b),error:b=>{d=!0,C(),s=$k(I,e,b),f.error(b)},complete:()=>{l=!0,C(),s=$k(I,i),f.complete()}}),zn(h).subscribe(r))})(o)}}function $k(t,A,...e){if(A===!0){t();return}if(A===!1)return;let i=new fg({next:()=>{i.unsubscribe(),t()}});return zn(A(...e)).subscribe(i)}function za(t,A,e){let i,n=!1;return t&&typeof t=="object"?{bufferSize:i=1/0,windowTime:A=1/0,refCount:n=!1,scheduler:e}=t:i=t??1/0,Rl({connector:()=>new Zc(i,A,e),resetOnError:!0,resetOnComplete:!1,resetOnRefCountZero:n})}function Pa(t){return $A((A,e)=>t<=e)}function In(...t){let A=v0(t);return hi((e,i)=>{(A?h1(t,e,A):h1(t,e)).subscribe(i)})}function Si(t,A){return hi((e,i)=>{let n=null,o=0,r=!1,s=()=>r&&!n&&i.complete();e.subscribe(si(i,a=>{n?.unsubscribe();let c=0,l=o++;zn(t(a,l)).subscribe(n=si(i,d=>i.next(A?A(a,d,l,c++):d),()=>{n=null,s()}))},()=>{r=!0,s()}))})}function mt(t){return hi((A,e)=>{zn(t).subscribe(si(e,()=>e.complete(),DI)),!e.closed&&A.subscribe(e)})}function ex(t,A=!1){return hi((e,i)=>{let n=0;e.subscribe(si(i,o=>{let r=t(o,n++);(r||A)&&i.next(o),!r&&i.complete()}))})}function Pt(t,A,e){let i=gi(t)||A||e?{next:t,error:A,complete:e}:t;return i?hi((n,o)=>{var r;(r=i.subscribe)===null||r===void 0||r.call(i);let s=!0;n.subscribe(si(o,a=>{var c;(c=i.next)===null||c===void 0||c.call(i,a),o.next(a)},()=>{var a;s=!1,(a=i.complete)===null||a===void 0||a.call(i),o.complete()},a=>{var c;s=!1,(c=i.error)===null||c===void 0||c.call(i,a),o.error(a)},()=>{var a,c;s&&((a=i.unsubscribe)===null||a===void 0||a.call(i)),(c=i.finalize)===null||c===void 0||c.call(i)}))}):qs}function e4(...t){let A=d1(t);return hi((e,i)=>{let n=t.length,o=new Array(n),r=t.map(()=>!1),s=!1;for(let a=0;a{o[a]=c,!s&&!r[a]&&(r[a]=!0,(s=r.every(qs))&&(r=null))},DI));e.subscribe(si(i,a=>{if(s){let c=[a,...o];i.next(A?A(...c):c)}}))})}var Rj="https://angular.dev/best-practices/security#preventing-cross-site-scripting-xss",lA=class extends Error{code;constructor(A,e){super(mw(A,e)),this.code=A}};function Rfe(t){return`NG0${Math.abs(t)}`}function mw(t,A){return`${Rfe(t)}${A?": "+A:""}`}var Nj=Symbol("InputSignalNode#UNSET"),Nfe=_A(ae({},I8),{transformFn:void 0,applyValueToInputSignal(t,A){jQ(t,A)}});function Lj(t,A){let e=Object.create(Nfe);e.value=t,e.transformFn=A?.transform;function i(){if(HQ(e),e.value===Nj){let n=null;throw new lA(-950,n)}return e.value}return i[Cc]=e,i}function C4(t){return{toString:t}.toString()}var G8="__parameters__";function Lfe(t){return function(...e){if(t){let i=t(...e);for(let n in i)this[n]=i[n]}}}function Fj(t,A,e){return C4(()=>{let i=Lfe(A);function n(...o){if(this instanceof n)return i.apply(this,o),this;let r=new n(...o);return s.annotation=r,s;function s(a,c,l){let d=a.hasOwnProperty(G8)?a[G8]:Object.defineProperty(a,G8,{value:[]})[G8];for(;d.length<=l;)d.push(null);return(d[l]=d[l]||[]).push(r),a}}return n.prototype.ngMetadataName=t,n.annotationCls=n,n})}var Xc=globalThis;function jo(t){for(let A in t)if(t[A]===jo)return A;throw Error("Could not find renamed property on target object.")}function Ffe(t,A){for(let e in A)A.hasOwnProperty(e)&&!t.hasOwnProperty(e)&&(t[e]=A[e])}function Bc(t){if(typeof t=="string")return t;if(Array.isArray(t))return`[${t.map(Bc).join(", ")}]`;if(t==null)return""+t;let A=t.overriddenName||t.name;if(A)return`${A}`;let e=t.toString();if(e==null)return""+e;let i=e.indexOf(` +`);return i>=0?e.slice(0,i):e}function ux(t,A){return t?A?`${t} ${A}`:t:A||""}var Gfe=jo({__forward_ref__:jo});function zr(t){return t.__forward_ref__=zr,t.toString=function(){return Bc(this())},t}function Zs(t){return Gj(t)?t():t}function Gj(t){return typeof t=="function"&&t.hasOwnProperty(Gfe)&&t.__forward_ref__===zr}function be(t){return{token:t.token,providedIn:t.providedIn||null,factory:t.factory,value:void 0}}function TA(t){return{providers:t.providers||[],imports:t.imports||[]}}function pw(t){return UP(t,Uj)||UP(t,Tj)}function Kj(t){return pw(t)!==null}function UP(t,A){return t.hasOwnProperty(A)?t[A]:null}function Kfe(t){let A=t&&(t[Uj]||t[Tj]);return A||null}function TP(t){return t&&(t.hasOwnProperty(OP)||t.hasOwnProperty(Ufe))?t[OP]:null}var Uj=jo({\u0275prov:jo}),OP=jo({\u0275inj:jo}),Tj=jo({ngInjectableDef:jo}),Ufe=jo({ngInjectorDef:jo}),re=class{_desc;ngMetadataName="InjectionToken";\u0275prov;constructor(A,e){this._desc=A,this.\u0275prov=void 0,typeof e=="number"?this.__NG_ELEMENT_ID__=e:e!==void 0&&(this.\u0275prov=be({token:this,providedIn:e.providedIn||"root",factory:e.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}};function Oj(t){return t&&!!t.\u0275providers}var Tfe=jo({\u0275cmp:jo}),Ofe=jo({\u0275dir:jo}),Jfe=jo({\u0275pipe:jo}),Yfe=jo({\u0275mod:jo}),V8=jo({\u0275fac:jo}),n4=jo({__NG_ELEMENT_ID__:jo}),JP=jo({__NG_ENV_ID__:jo});function xI(t){return typeof t=="string"?t:t==null?"":String(t)}function Hfe(t){return typeof t=="function"?t.name||t.toString():typeof t=="object"&&t!=null&&typeof t.type=="function"?t.type.name||t.type.toString():xI(t)}function Jj(t,A){throw new lA(-200,t)}function v_(t,A){throw new lA(-201,!1)}var ji=function(t){return t[t.Default=0]="Default",t[t.Host=1]="Host",t[t.Self=2]="Self",t[t.SkipSelf=4]="SkipSelf",t[t.Optional=8]="Optional",t}(ji||{}),hx;function Yj(){return hx}function hc(t){let A=hx;return hx=t,A}function Hj(t,A,e){let i=pw(t);if(i&&i.providedIn=="root")return i.value===void 0?i.value=i.factory():i.value;if(e&ji.Optional)return null;if(A!==void 0)return A;v_(t,"Injector")}var zfe={},SI=zfe,Bx="__NG_DI_FLAG__",q8=class{injector;constructor(A){this.injector=A}retrieve(A,e){let i=e;return this.injector.get(A,i.optional?u8:SI,i)}},W8="ngTempTokenPath",Pfe="ngTokenPath",jfe=/\n/gm,Vfe="\u0275",YP="__source";function qfe(t,A=ji.Default){if(VQ()===void 0)throw new lA(-203,!1);if(VQ()===null)return Hj(t,void 0,A);{let e=VQ(),i;return e instanceof q8?i=e.injector:i=e,i.get(t,A&ji.Optional?null:void 0,A)}}function UA(t,A=ji.Default){return(Yj()||qfe)(Zs(t),A)}function E(t,A=ji.Default){return UA(t,ww(A))}function ww(t){return typeof t>"u"||typeof t=="number"?t:0|(t.optional&&8)|(t.host&&1)|(t.self&&2)|(t.skipSelf&&4)}function Ex(t){let A=[];for(let e=0;e ");else if(typeof A=="object"){let o=[];for(let r in A)if(A.hasOwnProperty(r)){let s=A[r];o.push(r+":"+(typeof s=="string"?JSON.stringify(s):Bc(s)))}n=`{${o.join(", ")}}`}return`${e}${i?"("+i+")":""}[${n}]: ${t.replace(jfe,` + `)}`}var gB=zj(Fj("Optional"),8);var yw=zj(Fj("SkipSelf"),4);function _I(t,A){let e=t.hasOwnProperty(V8);return e?t[V8]:null}function $fe(t,A,e){if(t.length!==A.length)return!1;for(let i=0;iArray.isArray(e)?b_(e,A):A(e))}function Pj(t,A,e){A>=t.length?t.push(e):t.splice(A,0,e)}function Z8(t,A){return A>=t.length-1?t.pop():t.splice(A,1)[0]}function AQe(t,A){let e=[];for(let i=0;iA;){let o=n-2;t[n]=t[o],n--}t[A]=e,t[A+1]=i}}function I4(t,A,e){let i=u4(t,A);return i>=0?t[i|1]=e:(i=~i,tQe(t,i,A,e)),i}function Ax(t,A){let e=u4(t,A);if(e>=0)return t[e|1]}function u4(t,A){return iQe(t,A,1)}function iQe(t,A,e){let i=0,n=t.length>>e;for(;n!==i;){let o=i+(n-i>>1),r=t[o<A?n=o:i=o+1}return~(n<{e.push(r)};return b_(A,r=>{let s=r;fx(s,o,[],i)&&(n||=[],n.push(s))}),n!==void 0&&Xj(n,o),e}function Xj(t,A){for(let e=0;e{A(o,i)})}}function fx(t,A,e,i){if(t=Zs(t),!t)return!1;let n=null,o=TP(t),r=!o&&Q1(t);if(!o&&!r){let a=t.ngModule;if(o=TP(a),o)n=a;else return!1}else{if(r&&!r.standalone)return!1;n=t}let s=i.has(n);if(r){if(s)return!1;if(i.add(n),r.dependencies){let a=typeof r.dependencies=="function"?r.dependencies():r.dependencies;for(let c of a)fx(c,A,e,i)}}else if(o){if(o.imports!=null&&!s){i.add(n);let c;try{b_(o.imports,l=>{fx(l,A,e,i)&&(c||=[],c.push(l))})}finally{}c!==void 0&&Xj(c,A)}if(!s){let c=_I(n)||(()=>new n);A({provide:n,useFactory:c,deps:ja},n),A({provide:Vj,useValue:n,multi:!0},n),A({provide:AB,useValue:()=>UA(n),multi:!0},n)}let a=o.providers;if(a!=null&&!s){let c=t;S_(a,l=>{A(l,c)})}}else return!1;return n!==t&&t.providers!==void 0}function S_(t,A){for(let e of t)Oj(e)&&(e=e.\u0275providers),Array.isArray(e)?S_(e,A):A(e)}var oQe=jo({provide:String,useValue:jo});function $j(t){return t!==null&&typeof t=="object"&&oQe in t}function rQe(t){return!!(t&&t.useExisting)}function sQe(t){return!!(t&&t.useFactory)}function tB(t){return typeof t=="function"}function aQe(t){return!!t.useClass}var Dw=new re(""),J8={},HP={},tx;function vw(){return tx===void 0&&(tx=new X8),tx}var Hr=class{},o4=class extends Hr{parent;source;scopes;records=new Map;_ngOnDestroyHooks=new Set;_onDestroyHooks=[];get destroyed(){return this._destroyed}_destroyed=!1;injectorDefTypes;constructor(A,e,i,n){super(),this.parent=e,this.source=i,this.scopes=n,mx(A,r=>this.processProvider(r)),this.records.set(jj,qh(void 0,this)),n.has("environment")&&this.records.set(Hr,qh(void 0,this));let o=this.records.get(Dw);o!=null&&typeof o.value=="string"&&this.scopes.add(o.value),this.injectorDefTypes=new Set(this.get(Vj,ja,ji.Self))}retrieve(A,e){let i=e;return this.get(A,i.optional?u8:SI,i)}destroy(){t4(this),this._destroyed=!0;let A=Ui(null);try{for(let i of this._ngOnDestroyHooks)i.ngOnDestroy();let e=this._onDestroyHooks;this._onDestroyHooks=[];for(let i of e)i()}finally{this.records.clear(),this._ngOnDestroyHooks.clear(),this.injectorDefTypes.clear(),Ui(A)}}onDestroy(A){return t4(this),this._onDestroyHooks.push(A),()=>this.removeOnDestroy(A)}runInContext(A){t4(this);let e=qd(this),i=hc(void 0),n;try{return A()}finally{qd(e),hc(i)}}get(A,e=SI,i=ji.Default){if(t4(this),A.hasOwnProperty(JP))return A[JP](this);i=ww(i);let n,o=qd(this),r=hc(void 0);try{if(!(i&ji.SkipSelf)){let a=this.records.get(A);if(a===void 0){let c=CQe(A)&&pw(A);c&&this.injectableDefInScope(c)?a=qh(Qx(A),J8):a=null,this.records.set(A,a)}if(a!=null)return this.hydrate(A,a,i)}let s=i&ji.Self?vw():this.parent;return e=i&ji.Optional&&e===SI?null:e,s.get(A,e)}catch(s){if(s.name==="NullInjectorError"){if((s[W8]=s[W8]||[]).unshift(Bc(A)),o)throw s;return Zfe(s,A,"R3InjectorError",this.source)}else throw s}finally{hc(r),qd(o)}}resolveInjectorInitializers(){let A=Ui(null),e=qd(this),i=hc(void 0),n;try{let o=this.get(AB,ja,ji.Self);for(let r of o)r()}finally{qd(e),hc(i),Ui(A)}}toString(){let A=[],e=this.records;for(let i of e.keys())A.push(Bc(i));return`R3Injector[${A.join(", ")}]`}processProvider(A){A=Zs(A);let e=tB(A)?A:Zs(A&&A.provide),i=lQe(A);if(!tB(A)&&A.multi===!0){let n=this.records.get(e);n||(n=qh(void 0,J8,!0),n.factory=()=>Ex(n.multi),this.records.set(e,n)),e=A,n.multi.push(A)}this.records.set(e,i)}hydrate(A,e,i){let n=Ui(null);try{return e.value===HP?Jj(Bc(A)):e.value===J8&&(e.value=HP,e.value=e.factory(void 0,i)),typeof e.value=="object"&&e.value&&dQe(e.value)&&this._ngOnDestroyHooks.add(e.value),e.value}finally{Ui(n)}}injectableDefInScope(A){if(!A.providedIn)return!1;let e=Zs(A.providedIn);return typeof e=="string"?e==="any"||this.scopes.has(e):this.injectorDefTypes.has(e)}removeOnDestroy(A){let e=this._onDestroyHooks.indexOf(A);e!==-1&&this._onDestroyHooks.splice(e,1)}};function Qx(t){let A=pw(t),e=A!==null?A.factory:_I(t);if(e!==null)return e;if(t instanceof re)throw new lA(204,!1);if(t instanceof Function)return cQe(t);throw new lA(204,!1)}function cQe(t){if(t.length>0)throw new lA(204,!1);let e=Kfe(t);return e!==null?()=>e.factory(t):()=>new t}function lQe(t){if($j(t))return qh(void 0,t.useValue);{let A=eV(t);return qh(A,J8)}}function eV(t,A,e){let i;if(tB(t)){let n=Zs(t);return _I(n)||Qx(n)}else if($j(t))i=()=>Zs(t.useValue);else if(sQe(t))i=()=>t.useFactory(...Ex(t.deps||[]));else if(rQe(t))i=(n,o)=>UA(Zs(t.useExisting),o!==void 0&&o&ji.Optional?ji.Optional:void 0);else{let n=Zs(t&&(t.useClass||t.provide));if(gQe(t))i=()=>new n(...Ex(t.deps));else return _I(n)||Qx(n)}return i}function t4(t){if(t.destroyed)throw new lA(205,!1)}function qh(t,A,e=!1){return{factory:t,value:A,multi:e?[]:void 0}}function gQe(t){return!!t.deps}function dQe(t){return t!==null&&typeof t=="object"&&typeof t.ngOnDestroy=="function"}function CQe(t){return typeof t=="function"||typeof t=="object"&&t instanceof re}function mx(t,A){for(let e of t)Array.isArray(e)?mx(e,A):e&&Oj(e)?mx(e.\u0275providers,A):A(e)}function Xr(t,A){let e;t instanceof o4?(t4(t),e=t):e=new q8(t);let i,n=qd(e),o=hc(void 0);try{return A()}finally{qd(n),hc(o)}}function k_(){return Yj()!==void 0||VQ()!=null}function e2(t){if(!k_())throw new lA(-203,!1)}function IQe(t){return typeof t=="function"}var K0=0,Li=1,fi=2,Ea=3,wg=4,Qc=5,iB=6,$8=7,gs=8,nB=9,Zd=10,dr=11,r4=12,zP=13,dB=14,Ec=15,RI=16,Wh=17,Xd=18,bw=19,AV=20,E1=21,ix=22,NI=23,Nl=24,$h=25,Zr=26,x_=1;var LI=7,ew=8,oB=9,Ba=10;function f1(t){return Array.isArray(t)&&typeof t[x_]=="object"}function A2(t){return Array.isArray(t)&&t[x_]===!0}function __(t){return(t.flags&4)!==0}function CB(t){return t.componentOffset>-1}function Mw(t){return(t.flags&1)===1}function yg(t){return!!t.template}function Aw(t){return(t[fi]&512)!==0}function IB(t){return(t[fi]&256)===256}var px=class{previousValue;currentValue;firstChange;constructor(A,e,i){this.previousValue=A,this.currentValue=e,this.firstChange=i}isFirstChange(){return this.firstChange}};function tV(t,A,e,i){A!==null?A.applyValueToInputSignal(A,i):t[e]=i}var ti=(()=>{let t=()=>iV;return t.ngInherit=!0,t})();function iV(t){return t.type.prototype.ngOnChanges&&(t.setInput=hQe),uQe}function uQe(){let t=oV(this),A=t?.current;if(A){let e=t.previous;if(e===_0)t.previous=A;else for(let i in A)e[i]=A[i];t.current=null,this.ngOnChanges(A)}}function hQe(t,A,e,i,n){let o=this.declaredInputs[i],r=oV(t)||BQe(t,{previous:_0,current:null}),s=r.current||(r.current={}),a=r.previous,c=a[o];s[o]=new px(c&&c.currentValue,e,a===_0),tV(t,A,n,e)}var nV="__ngSimpleChanges__";function oV(t){return t[nV]||null}function BQe(t,A){return t[nV]=A}var PP=null;var _o=function(t,A=null,e){PP?.(t,A,e)},rV="svg",EQe="math";function R0(t){for(;Array.isArray(t);)t=t[K0];return t}function fQe(t){for(;Array.isArray(t);){if(typeof t[x_]=="object")return t;t=t[K0]}return null}function sV(t,A){return R0(A[t])}function U0(t,A){return R0(A[t.index])}function R_(t,A){return t.data[A]}function Sw(t,A){return t[A]}function N_(t,A,e,i){e>=t.data.length&&(t.data[e]=null,t.blueprint[e]=null),A[e]=i}function N0(t,A){let e=A[t];return f1(e)?e:e[K0]}function QQe(t){return(t[fi]&4)===4}function L_(t){return(t[fi]&128)===128}function mQe(t){return A2(t[Ea])}function m1(t,A){return A==null?null:t[A]}function aV(t){t[Wh]=0}function cV(t){t[fi]&1024||(t[fi]|=1024,L_(t)&&uB(t))}function pQe(t,A){for(;t>0;)A=A[dB],t--;return A}function kw(t){return!!(t[fi]&9216||t[Nl]?.dirty)}function wx(t){t[Zd].changeDetectionScheduler?.notify(8),t[fi]&64&&(t[fi]|=1024),kw(t)&&uB(t)}function uB(t){t[Zd].changeDetectionScheduler?.notify(0);let A=FI(t);for(;A!==null&&!(A[fi]&8192||(A[fi]|=8192,!L_(A)));)A=FI(A)}function lV(t,A){if(IB(t))throw new lA(911,!1);t[E1]===null&&(t[E1]=[]),t[E1].push(A)}function wQe(t,A){if(t[E1]===null)return;let e=t[E1].indexOf(A);e!==-1&&t[E1].splice(e,1)}function FI(t){let A=t[Ea];return A2(A)?A[Ea]:A}function F_(t){return t[$8]??=[]}function G_(t){return t.cleanup??=[]}function yQe(t,A,e,i){let n=F_(A);n.push(e),t.firstCreatePass&&G_(t).push(i,n.length-1)}var Ti={lFrame:BV(null),bindingsEnabled:!0,skipHydrationRootTNode:null};var yx=!1;function DQe(){return Ti.lFrame.elementDepthCount}function vQe(){Ti.lFrame.elementDepthCount++}function bQe(){Ti.lFrame.elementDepthCount--}function K_(){return Ti.bindingsEnabled}function gV(){return Ti.skipHydrationRootTNode!==null}function MQe(t){return Ti.skipHydrationRootTNode===t}function SQe(){Ti.skipHydrationRootTNode=null}function Ai(){return Ti.lFrame.lView}function Ro(){return Ti.lFrame.tView}function q(t){return Ti.lFrame.contextLView=t,t[gs]}function W(t){return Ti.lFrame.contextLView=null,t}function Xs(){let t=dV();for(;t!==null&&t.type===64;)t=t.parent;return t}function dV(){return Ti.lFrame.currentTNode}function kQe(){let t=Ti.lFrame,A=t.currentTNode;return t.isParent?A:A.parent}function p1(t,A){let e=Ti.lFrame;e.currentTNode=t,e.isParent=A}function U_(){return Ti.lFrame.isParent}function T_(){Ti.lFrame.isParent=!1}function CV(){return Ti.lFrame.contextLView}function IV(){return yx}function tw(t){let A=yx;return yx=t,A}function B4(){let t=Ti.lFrame,A=t.bindingRootIndex;return A===-1&&(A=t.bindingRootIndex=t.tView.bindingStartIndex),A}function xQe(){return Ti.lFrame.bindingIndex}function _Qe(t){return Ti.lFrame.bindingIndex=t}function w1(){return Ti.lFrame.bindingIndex++}function O_(t){let A=Ti.lFrame,e=A.bindingIndex;return A.bindingIndex=A.bindingIndex+t,e}function RQe(){return Ti.lFrame.inI18n}function NQe(t,A){let e=Ti.lFrame;e.bindingIndex=e.bindingRootIndex=t,Dx(A)}function LQe(){return Ti.lFrame.currentDirectiveIndex}function Dx(t){Ti.lFrame.currentDirectiveIndex=t}function J_(t){let A=Ti.lFrame.currentDirectiveIndex;return A===-1?null:t[A]}function Y_(){return Ti.lFrame.currentQueryIndex}function xw(t){Ti.lFrame.currentQueryIndex=t}function FQe(t){let A=t[Li];return A.type===2?A.declTNode:A.type===1?t[Qc]:null}function uV(t,A,e){if(e&ji.SkipSelf){let n=A,o=t;for(;n=n.parent,n===null&&!(e&ji.Host);)if(n=FQe(o),n===null||(o=o[dB],n.type&10))break;if(n===null)return!1;A=n,t=o}let i=Ti.lFrame=hV();return i.currentTNode=A,i.lView=t,!0}function H_(t){let A=hV(),e=t[Li];Ti.lFrame=A,A.currentTNode=e.firstChild,A.lView=t,A.tView=e,A.contextLView=t,A.bindingIndex=e.bindingStartIndex,A.inI18n=!1}function hV(){let t=Ti.lFrame,A=t===null?null:t.child;return A===null?BV(t):A}function BV(t){let A={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:-1,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:t,child:null,inI18n:!1};return t!==null&&(t.child=A),A}function EV(){let t=Ti.lFrame;return Ti.lFrame=t.parent,t.currentTNode=null,t.lView=null,t}var fV=EV;function z_(){let t=EV();t.isParent=!0,t.tView=null,t.selectedIndex=-1,t.contextLView=null,t.elementDepthCount=0,t.currentDirectiveIndex=-1,t.currentNamespace=null,t.bindingRootIndex=-1,t.bindingIndex=-1,t.currentQueryIndex=0}function GQe(t){return(Ti.lFrame.contextLView=pQe(t,Ti.lFrame.contextLView))[gs]}function T0(){return Ti.lFrame.selectedIndex}function GI(t){Ti.lFrame.selectedIndex=t}function hB(){let t=Ti.lFrame;return R_(t.tView,t.selectedIndex)}function ft(){Ti.lFrame.currentNamespace=rV}function $s(){KQe()}function KQe(){Ti.lFrame.currentNamespace=null}function UQe(){return Ti.lFrame.currentNamespace}var QV=!0;function _w(){return QV}function Rw(t){QV=t}function TQe(t,A,e){let{ngOnChanges:i,ngOnInit:n,ngDoCheck:o}=A.type.prototype;if(i){let r=iV(A);(e.preOrderHooks??=[]).push(t,r),(e.preOrderCheckHooks??=[]).push(t,r)}n&&(e.preOrderHooks??=[]).push(0-t,n),o&&((e.preOrderHooks??=[]).push(t,o),(e.preOrderCheckHooks??=[]).push(t,o))}function P_(t,A){for(let e=A.directiveStart,i=A.directiveEnd;e=i)break}else A[a]<0&&(t[Wh]+=65536),(s>14>16&&(t[fi]&3)===A&&(t[fi]+=16384,jP(s,o)):jP(s,o)}var eB=-1,KI=class{factory;injectImpl;resolving=!1;canSeeViewProviders;multi;componentProviders;index;providerFactory;constructor(A,e,i){this.factory=A,this.canSeeViewProviders=e,this.injectImpl=i}};function JQe(t){return(t.flags&8)!==0}function YQe(t){return(t.flags&16)!==0}function HQe(t,A,e){let i=0;for(;iA){r=o-1;break}}}for(;o>16}function nw(t,A){let e=PQe(t),i=A;for(;e>0;)i=i[dB],e--;return i}var vx=!0;function ow(t){let A=vx;return vx=t,A}var jQe=256,yV=jQe-1,DV=5,VQe=0,x0={};function qQe(t,A,e){let i;typeof e=="string"?i=e.charCodeAt(0)||0:e.hasOwnProperty(n4)&&(i=e[n4]),i==null&&(i=e[n4]=VQe++);let n=i&yV,o=1<>DV)]|=o}function rw(t,A){let e=vV(t,A);if(e!==-1)return e;let i=A[Li];i.firstCreatePass&&(t.injectorIndex=A.length,ox(i.data,t),ox(A,null),ox(i.blueprint,null));let n=j_(t,A),o=t.injectorIndex;if(wV(n)){let r=iw(n),s=nw(n,A),a=s[Li].data;for(let c=0;c<8;c++)A[o+c]=s[r+c]|a[r+c]}return A[o+8]=n,o}function ox(t,A){t.push(0,0,0,0,0,0,0,0,A)}function vV(t,A){return t.injectorIndex===-1||t.parent&&t.parent.injectorIndex===t.injectorIndex||A[t.injectorIndex+8]===null?-1:t.injectorIndex}function j_(t,A){if(t.parent&&t.parent.injectorIndex!==-1)return t.parent.injectorIndex;let e=0,i=null,n=A;for(;n!==null;){if(i=xV(n),i===null)return eB;if(e++,n=n[dB],i.injectorIndex!==-1)return i.injectorIndex|e<<16}return eB}function bx(t,A,e){qQe(t,A,e)}function WQe(t,A){if(A==="class")return t.classes;if(A==="style")return t.styles;let e=t.attrs;if(e){let i=e.length,n=0;for(;n>20,d=i?s:s+l,C=n?s+l:c;for(let I=d;I=a&&u.type===e)return I}if(n){let I=r[a];if(I&&yg(I)&&I.type===e)return a}return null}function s4(t,A,e,i,n){let o=t[e],r=A.data;if(o instanceof KI){let s=o;s.resolving&&Jj(Hfe(r[e]));let a=ow(s.canSeeViewProviders);s.resolving=!0;let c,l=s.injectImpl?hc(s.injectImpl):null,d=uV(t,i,ji.Default);try{o=t[e]=s.factory(void 0,n,r,t,i),A.firstCreatePass&&e>=i.directiveStart&&TQe(e,r[e],A)}finally{l!==null&&hc(l),ow(a),s.resolving=!1,fV()}}return o}function XQe(t){if(typeof t=="string")return t.charCodeAt(0)||0;let A=t.hasOwnProperty(n4)?t[n4]:void 0;return typeof A=="number"?A>=0?A&yV:$Qe:A}function qP(t,A,e){let i=1<>DV)]&i)}function WP(t,A){return!(t&ji.Self)&&!(t&ji.Host&&A)}var kI=class{_tNode;_lView;constructor(A,e){this._tNode=A,this._lView=e}get(A,e,i){return SV(this._tNode,this._lView,A,ww(i),e)}};function $Qe(){return new kI(Xs(),Ai())}function ii(t){return C4(()=>{let A=t.prototype.constructor,e=A[V8]||Mx(A),i=Object.prototype,n=Object.getPrototypeOf(t.prototype).constructor;for(;n&&n!==i;){let o=n[V8]||Mx(n);if(o&&o!==e)return o;n=Object.getPrototypeOf(n)}return o=>new o})}function Mx(t){return Gj(t)?()=>{let A=Mx(Zs(t));return A&&A()}:_I(t)}function e4e(t,A,e,i,n){let o=t,r=A;for(;o!==null&&r!==null&&r[fi]&2048&&!Aw(r);){let s=kV(o,r,e,i|ji.Self,x0);if(s!==x0)return s;let a=o.parent;if(!a){let c=r[AV];if(c){let l=c.get(e,x0,i);if(l!==x0)return l}a=xV(r),r=r[dB]}o=a}return n}function xV(t){let A=t[Li],e=A.type;return e===2?A.declTNode:e===1?t[Qc]:null}function V_(t){return WQe(Xs(),t)}function ZP(t,A=null,e=null,i){let n=_V(t,A,e,i);return n.resolveInjectorInitializers(),n}function _V(t,A=null,e=null,i,n=new Set){let o=[e||ja,M_(t)];return i=i||(typeof t=="object"?void 0:Bc(t)),new o4(o,A||vw(),i||null,n)}var Dt=class t{static THROW_IF_NOT_FOUND=SI;static NULL=new X8;static create(A,e){if(Array.isArray(A))return ZP({name:""},e,A,"");{let i=A.name??"";return ZP({name:i},A.parent,A.providers,i)}}static \u0275prov=be({token:t,providedIn:"any",factory:()=>UA(jj)});static __NG_ELEMENT_ID__=-1};var ws=class{attributeName;constructor(A){this.attributeName=A}__NG_ELEMENT_ID__=()=>V_(this.attributeName);toString(){return`HostAttributeToken ${this.attributeName}`}},A4e=new re("");A4e.__NG_ELEMENT_ID__=t=>{let A=Xs();if(A===null)throw new lA(204,!1);if(A.type&2)return A.value;if(t&ji.Optional)return null;throw new lA(204,!1)};var RV=!1,Fr=(()=>{class t{static __NG_ELEMENT_ID__=t4e;static __NG_ENV_ID__=e=>e}return t})(),sw=class extends Fr{_lView;constructor(A){super(),this._lView=A}onDestroy(A){let e=this._lView;return IB(e)?(A(),()=>{}):(lV(e,A),()=>wQe(e,A))}};function t4e(){return new sw(Ai())}var UI=class{},q_=new re("",{providedIn:"root",factory:()=>!1});var NV=new re(""),LV=new re(""),t2=(()=>{class t{taskId=0;pendingTasks=new Set;get _hasPendingTasks(){return this.hasPendingTasks.value}hasPendingTasks=new Mt(!1);add(){this._hasPendingTasks||this.hasPendingTasks.next(!0);let e=this.taskId++;return this.pendingTasks.add(e),e}has(e){return this.pendingTasks.has(e)}remove(e){this.pendingTasks.delete(e),this.pendingTasks.size===0&&this._hasPendingTasks&&this.hasPendingTasks.next(!1)}ngOnDestroy(){this.pendingTasks.clear(),this._hasPendingTasks&&this.hasPendingTasks.next(!1)}static \u0275prov=be({token:t,providedIn:"root",factory:()=>new t})}return t})();var Sx=class extends je{__isAsync;destroyRef=void 0;pendingTasks=void 0;constructor(A=!1){super(),this.__isAsync=A,k_()&&(this.destroyRef=E(Fr,{optional:!0})??void 0,this.pendingTasks=E(t2,{optional:!0})??void 0)}emit(A){let e=Ui(null);try{super.next(A)}finally{Ui(e)}}subscribe(A,e,i){let n=A,o=e||(()=>null),r=i;if(A&&typeof A=="object"){let a=A;n=a.next?.bind(a),o=a.error?.bind(a),r=a.complete?.bind(a)}this.__isAsync&&(o=this.wrapInTimeout(o),n&&(n=this.wrapInTimeout(n)),r&&(r=this.wrapInTimeout(r)));let s=super.subscribe({next:n,error:o,complete:r});return A instanceof Ot&&A.add(s),s}wrapInTimeout(A){return e=>{let i=this.pendingTasks?.add();setTimeout(()=>{try{A(e)}finally{i!==void 0&&this.pendingTasks?.remove(i)}})}}},Ve=Sx;function a4(...t){}function FV(t){let A,e;function i(){t=a4;try{e!==void 0&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(e),A!==void 0&&clearTimeout(A)}catch{}}return A=setTimeout(()=>{t(),i()}),typeof requestAnimationFrame=="function"&&(e=requestAnimationFrame(()=>{t(),i()})),()=>i()}function XP(t){return queueMicrotask(()=>t()),()=>{t=a4}}var W_="isAngularZone",aw=W_+"_ID",i4e=0,yA=class t{hasPendingMacrotasks=!1;hasPendingMicrotasks=!1;isStable=!0;onUnstable=new Ve(!1);onMicrotaskEmpty=new Ve(!1);onStable=new Ve(!1);onError=new Ve(!1);constructor(A){let{enableLongStackTrace:e=!1,shouldCoalesceEventChangeDetection:i=!1,shouldCoalesceRunChangeDetection:n=!1,scheduleInRootZone:o=RV}=A;if(typeof Zone>"u")throw new lA(908,!1);Zone.assertZonePatched();let r=this;r._nesting=0,r._outer=r._inner=Zone.current,Zone.TaskTrackingZoneSpec&&(r._inner=r._inner.fork(new Zone.TaskTrackingZoneSpec)),e&&Zone.longStackTraceZoneSpec&&(r._inner=r._inner.fork(Zone.longStackTraceZoneSpec)),r.shouldCoalesceEventChangeDetection=!n&&i,r.shouldCoalesceRunChangeDetection=n,r.callbackScheduled=!1,r.scheduleInRootZone=o,r4e(r)}static isInAngularZone(){return typeof Zone<"u"&&Zone.current.get(W_)===!0}static assertInAngularZone(){if(!t.isInAngularZone())throw new lA(909,!1)}static assertNotInAngularZone(){if(t.isInAngularZone())throw new lA(909,!1)}run(A,e,i){return this._inner.run(A,e,i)}runTask(A,e,i,n){let o=this._inner,r=o.scheduleEventTask("NgZoneEvent: "+n,A,n4e,a4,a4);try{return o.runTask(r,e,i)}finally{o.cancelTask(r)}}runGuarded(A,e,i){return this._inner.runGuarded(A,e,i)}runOutsideAngular(A){return this._outer.run(A)}},n4e={};function Z_(t){if(t._nesting==0&&!t.hasPendingMicrotasks&&!t.isStable)try{t._nesting++,t.onMicrotaskEmpty.emit(null)}finally{if(t._nesting--,!t.hasPendingMicrotasks)try{t.runOutsideAngular(()=>t.onStable.emit(null))}finally{t.isStable=!0}}}function o4e(t){if(t.isCheckStableRunning||t.callbackScheduled)return;t.callbackScheduled=!0;function A(){FV(()=>{t.callbackScheduled=!1,kx(t),t.isCheckStableRunning=!0,Z_(t),t.isCheckStableRunning=!1})}t.scheduleInRootZone?Zone.root.run(()=>{A()}):t._outer.run(()=>{A()}),kx(t)}function r4e(t){let A=()=>{o4e(t)},e=i4e++;t._inner=t._inner.fork({name:"angular",properties:{[W_]:!0,[aw]:e,[aw+e]:!0},onInvokeTask:(i,n,o,r,s,a)=>{if(s4e(a))return i.invokeTask(o,r,s,a);try{return $P(t),i.invokeTask(o,r,s,a)}finally{(t.shouldCoalesceEventChangeDetection&&r.type==="eventTask"||t.shouldCoalesceRunChangeDetection)&&A(),ej(t)}},onInvoke:(i,n,o,r,s,a,c)=>{try{return $P(t),i.invoke(o,r,s,a,c)}finally{t.shouldCoalesceRunChangeDetection&&!t.callbackScheduled&&!a4e(a)&&A(),ej(t)}},onHasTask:(i,n,o,r)=>{i.hasTask(o,r),n===o&&(r.change=="microTask"?(t._hasPendingMicrotasks=r.microTask,kx(t),Z_(t)):r.change=="macroTask"&&(t.hasPendingMacrotasks=r.macroTask))},onHandleError:(i,n,o,r)=>(i.handleError(o,r),t.runOutsideAngular(()=>t.onError.emit(r)),!1)})}function kx(t){t._hasPendingMicrotasks||(t.shouldCoalesceEventChangeDetection||t.shouldCoalesceRunChangeDetection)&&t.callbackScheduled===!0?t.hasPendingMicrotasks=!0:t.hasPendingMicrotasks=!1}function $P(t){t._nesting++,t.isStable&&(t.isStable=!1,t.onUnstable.emit(null))}function ej(t){t._nesting--,Z_(t)}var xx=class{hasPendingMicrotasks=!1;hasPendingMacrotasks=!1;isStable=!0;onUnstable=new Ve;onMicrotaskEmpty=new Ve;onStable=new Ve;onError=new Ve;run(A,e,i){return A.apply(e,i)}runGuarded(A,e,i){return A.apply(e,i)}runOutsideAngular(A){return A()}runTask(A,e,i,n){return A.apply(e,i)}};function s4e(t){return GV(t,"__ignore_ng_zone__")}function a4e(t){return GV(t,"__scheduler_tick__")}function GV(t,A){return!Array.isArray(t)||t.length!==1?!1:t[0]?.data?.[A]===!0}var Va=class{_console=console;handleError(A){this._console.error("ERROR",A)}},c4e=new re("",{providedIn:"root",factory:()=>{let t=E(yA),A=E(Va);return e=>t.runOutsideAngular(()=>A.handleError(e))}}),c4=class{destroyed=!1;listeners=null;errorHandler=E(Va,{optional:!0});destroyRef=E(Fr);constructor(){this.destroyRef.onDestroy(()=>{this.destroyed=!0,this.listeners=null})}subscribe(A){if(this.destroyed)throw new lA(953,!1);return(this.listeners??=[]).push(A),{unsubscribe:()=>{let e=this.listeners?.indexOf(A);e!==void 0&&e!==-1&&this.listeners?.splice(e,1)}}}emit(A){if(this.destroyed){console.warn(mw(953,!1));return}if(this.listeners===null)return;let e=Ui(null);try{for(let i of this.listeners)try{i(A)}catch(n){this.errorHandler?.handleError(n)}}finally{Ui(e)}}};function No(t){return new c4}function Aj(t,A){return Lj(t,A)}function l4e(t){return Lj(Nj,t)}var lt=(Aj.required=l4e,Aj);function g4e(){return BB(Xs(),Ai())}function BB(t,A){return new eA(U0(t,A))}var eA=(()=>{class t{nativeElement;constructor(e){this.nativeElement=e}static __NG_ELEMENT_ID__=g4e}return t})();function KV(t){return t instanceof eA?t.nativeElement:t}function y1(t){return typeof t=="function"&&t[Cc]!==void 0}function mA(t,A){let e=Nk(t,A?.equal),i=e[Cc];return e.set=n=>jQ(i,n),e.update=n=>Lk(i,n),e.asReadonly=d4e.bind(e),e}function d4e(){let t=this[Cc];if(t.readonlyFn===void 0){let A=()=>this();A[Cc]=t,t.readonlyFn=A}return t.readonlyFn}function UV(t){return y1(t)&&typeof t.set=="function"}function C4e(){return this._results[Symbol.iterator]()}var qa=class{_emitDistinctChangesOnly;dirty=!0;_onDirty=void 0;_results=[];_changesDetected=!1;_changes=void 0;length=0;first=void 0;last=void 0;get changes(){return this._changes??=new je}constructor(A=!1){this._emitDistinctChangesOnly=A}get(A){return this._results[A]}map(A){return this._results.map(A)}filter(A){return this._results.filter(A)}find(A){return this._results.find(A)}reduce(A,e){return this._results.reduce(A,e)}forEach(A){this._results.forEach(A)}some(A){return this._results.some(A)}toArray(){return this._results.slice()}toString(){return this._results.toString()}reset(A,e){this.dirty=!1;let i=eQe(A);(this._changesDetected=!$fe(this._results,i,e))&&(this._results=i,this.length=i.length,this.last=i[this.length-1],this.first=i[0])}notifyOnChanges(){this._changes!==void 0&&(this._changesDetected||!this._emitDistinctChangesOnly)&&this._changes.next(this)}onDirty(A){this._onDirty=A}setDirty(){this.dirty=!0,this._onDirty?.()}destroy(){this._changes!==void 0&&(this._changes.complete(),this._changes.unsubscribe())}[Symbol.iterator]=C4e};function TV(t){return(t.flags&128)===128}var OV=function(t){return t[t.OnPush=0]="OnPush",t[t.Default=1]="Default",t}(OV||{}),JV=new Map,I4e=0;function u4e(){return I4e++}function h4e(t){JV.set(t[bw],t)}function _x(t){JV.delete(t[bw])}var tj="__ngContext__";function EB(t,A){f1(A)?(t[tj]=A[bw],h4e(A)):t[tj]=A}function YV(t){return zV(t[r4])}function HV(t){return zV(t[wg])}function zV(t){for(;t!==null&&!A2(t);)t=t[wg];return t}var Rx;function PV(t){Rx=t}function jV(){if(Rx!==void 0)return Rx;if(typeof document<"u")return document;throw new lA(210,!1)}var fB=new re("",{providedIn:"root",factory:()=>B4e}),B4e="ng",X_=new re(""),O0=new re("",{providedIn:"platform",factory:()=>"unknown"});var Oi=new re(""),E4=new re("",{providedIn:"root",factory:()=>jV().body?.querySelector("[ngCspNonce]")?.getAttribute("ngCspNonce")||null});var E4e="h",f4e="b";var VV=!1,Q4e=new re("",{providedIn:"root",factory:()=>VV});var $_=function(t){return t[t.CHANGE_DETECTION=0]="CHANGE_DETECTION",t[t.AFTER_NEXT_RENDER=1]="AFTER_NEXT_RENDER",t}($_||{}),QB=new re(""),ij=new Set;function Dg(t){ij.has(t)||(ij.add(t),performance?.mark?.("mark_feature_usage",{detail:{feature:t}}))}var eR=(()=>{class t{view;node;constructor(e,i){this.view=e,this.node=i}static __NG_ELEMENT_ID__=m4e}return t})();function m4e(){return new eR(Ai(),Xs())}var Zh=function(t){return t[t.EarlyRead=0]="EarlyRead",t[t.Write=1]="Write",t[t.MixedReadWrite=2]="MixedReadWrite",t[t.Read=3]="Read",t}(Zh||{}),qV=(()=>{class t{impl=null;execute(){this.impl?.execute()}static \u0275prov=be({token:t,providedIn:"root",factory:()=>new t})}return t})(),p4e=[Zh.EarlyRead,Zh.Write,Zh.MixedReadWrite,Zh.Read],w4e=(()=>{class t{ngZone=E(yA);scheduler=E(UI);errorHandler=E(Va,{optional:!0});sequences=new Set;deferredRegistrations=new Set;executing=!1;constructor(){E(QB,{optional:!0})}execute(){let e=this.sequences.size>0;e&&_o(16),this.executing=!0;for(let i of p4e)for(let n of this.sequences)if(!(n.erroredOrDestroyed||!n.hooks[i]))try{n.pipelinedValue=this.ngZone.runOutsideAngular(()=>this.maybeTrace(()=>{let o=n.hooks[i];return o(n.pipelinedValue)},n.snapshot))}catch(o){n.erroredOrDestroyed=!0,this.errorHandler?.handleError(o)}this.executing=!1;for(let i of this.sequences)i.afterRun(),i.once&&(this.sequences.delete(i),i.destroy());for(let i of this.deferredRegistrations)this.sequences.add(i);this.deferredRegistrations.size>0&&this.scheduler.notify(7),this.deferredRegistrations.clear(),e&&_o(17)}register(e){let{view:i}=e;i!==void 0?((i[$h]??=[]).push(e),uB(i),i[fi]|=8192):this.executing?this.deferredRegistrations.add(e):this.addSequence(e)}addSequence(e){this.sequences.add(e),this.scheduler.notify(7)}unregister(e){this.executing&&this.sequences.has(e)?(e.erroredOrDestroyed=!0,e.pipelinedValue=void 0,e.once=!0):(this.sequences.delete(e),this.deferredRegistrations.delete(e))}maybeTrace(e,i){return i?i.run($_.AFTER_NEXT_RENDER,e):e()}static \u0275prov=be({token:t,providedIn:"root",factory:()=>new t})}return t})(),Nx=class{impl;hooks;view;once;snapshot;erroredOrDestroyed=!1;pipelinedValue=void 0;unregisterOnDestroy;constructor(A,e,i,n,o,r=null){this.impl=A,this.hooks=e,this.view=i,this.once=n,this.snapshot=r,this.unregisterOnDestroy=o?.onDestroy(()=>this.destroy())}afterRun(){this.erroredOrDestroyed=!1,this.pipelinedValue=void 0,this.snapshot?.dispose(),this.snapshot=null}destroy(){this.impl.unregister(this),this.unregisterOnDestroy?.();let A=this.view?.[$h];A&&(this.view[$h]=A.filter(e=>e!==this))}};function f4(t,A){!A?.injector&&e2(f4);let e=A?.injector??E(Dt);return Dg("NgAfterRender"),WV(t,e,A,!1)}function Gr(t,A){!A?.injector&&e2(Gr);let e=A?.injector??E(Dt);return Dg("NgAfterNextRender"),WV(t,e,A,!0)}function y4e(t,A){if(t instanceof Function){let e=[void 0,void 0,void 0,void 0];return e[A]=t,e}else return[t.earlyRead,t.write,t.mixedReadWrite,t.read]}function WV(t,A,e,i){let n=A.get(qV);n.impl??=A.get(w4e);let o=A.get(QB,null,{optional:!0}),r=e?.phase??Zh.MixedReadWrite,s=e?.manualCleanup!==!0?A.get(Fr):null,a=A.get(eR,null,{optional:!0}),c=new Nx(n.impl,y4e(t,r),a?.view,i,s,o?.snapshot(null));return n.impl.register(c),c}var D4e=(t,A,e,i)=>{};function v4e(t,A,e,i){D4e(t,A,e,i)}var b4e=()=>null;function ZV(t,A,e=!1){return b4e(t,A,e)}function XV(t,A){let e=t.contentQueries;if(e!==null){let i=Ui(null);try{for(let n=0;nt,createScript:t=>t,createScriptURL:t=>t})}catch{}return K8}function Nw(t){return M4e()?.createHTML(t)||t}var U8;function S4e(){if(U8===void 0&&(U8=null,Xc.trustedTypes))try{U8=Xc.trustedTypes.createPolicy("angular#unsafe-bypass",{createHTML:t=>t,createScript:t=>t,createScriptURL:t=>t})}catch{}return U8}function nj(t){return S4e()?.createHTML(t)||t}var $d=class{changingThisBreaksApplicationSecurity;constructor(A){this.changingThisBreaksApplicationSecurity=A}toString(){return`SafeValue must use [property]=binding: ${this.changingThisBreaksApplicationSecurity} (see ${Rj})`}},Fx=class extends $d{getTypeName(){return"HTML"}},Gx=class extends $d{getTypeName(){return"Style"}},Kx=class extends $d{getTypeName(){return"Script"}},Ux=class extends $d{getTypeName(){return"URL"}},Tx=class extends $d{getTypeName(){return"ResourceURL"}};function Ll(t){return t instanceof $d?t.changingThisBreaksApplicationSecurity:t}function D1(t,A){let e=k4e(t);if(e!=null&&e!==A){if(e==="ResourceURL"&&A==="URL")return!0;throw new Error(`Required a safe ${A}, got a ${e} (see ${Rj})`)}return e===A}function k4e(t){return t instanceof $d&&t.getTypeName()||null}function $V(t){return new Fx(t)}function eq(t){return new Gx(t)}function Aq(t){return new Kx(t)}function tq(t){return new Ux(t)}function iq(t){return new Tx(t)}function x4e(t){let A=new Jx(t);return _4e()?new Ox(A):A}var Ox=class{inertDocumentHelper;constructor(A){this.inertDocumentHelper=A}getInertBodyElement(A){A=""+A;try{let e=new window.DOMParser().parseFromString(Nw(A),"text/html").body;return e===null?this.inertDocumentHelper.getInertBodyElement(A):(e.firstChild?.remove(),e)}catch{return null}}},Jx=class{defaultDoc;inertDocument;constructor(A){this.defaultDoc=A,this.inertDocument=this.defaultDoc.implementation.createHTMLDocument("sanitization-inert")}getInertBodyElement(A){let e=this.inertDocument.createElement("template");return e.innerHTML=Nw(A),e}};function _4e(){try{return!!new window.DOMParser().parseFromString(Nw(""),"text/html")}catch{return!1}}var R4e=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:\/?#]*(?:[\/?#]|$))/i;function Lw(t){return t=String(t),t.match(R4e)?t:"unsafe:"+t}function i2(t){let A={};for(let e of t.split(","))A[e]=!0;return A}function Q4(...t){let A={};for(let e of t)for(let i in e)e.hasOwnProperty(i)&&(A[i]=!0);return A}var nq=i2("area,br,col,hr,img,wbr"),oq=i2("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),rq=i2("rp,rt"),N4e=Q4(rq,oq),L4e=Q4(oq,i2("address,article,aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul")),F4e=Q4(rq,i2("a,abbr,acronym,audio,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video")),oj=Q4(nq,L4e,F4e,N4e),sq=i2("background,cite,href,itemtype,longdesc,poster,src,xlink:href"),G4e=i2("abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,scope,scrolling,shape,size,sizes,span,srclang,srcset,start,summary,tabindex,target,title,translate,type,usemap,valign,value,vspace,width"),K4e=i2("aria-activedescendant,aria-atomic,aria-autocomplete,aria-busy,aria-checked,aria-colcount,aria-colindex,aria-colspan,aria-controls,aria-current,aria-describedby,aria-details,aria-disabled,aria-dropeffect,aria-errormessage,aria-expanded,aria-flowto,aria-grabbed,aria-haspopup,aria-hidden,aria-invalid,aria-keyshortcuts,aria-label,aria-labelledby,aria-level,aria-live,aria-modal,aria-multiline,aria-multiselectable,aria-orientation,aria-owns,aria-placeholder,aria-posinset,aria-pressed,aria-readonly,aria-relevant,aria-required,aria-roledescription,aria-rowcount,aria-rowindex,aria-rowspan,aria-selected,aria-setsize,aria-sort,aria-valuemax,aria-valuemin,aria-valuenow,aria-valuetext"),U4e=Q4(sq,G4e,K4e),T4e=i2("script,style,template"),Yx=class{sanitizedSomething=!1;buf=[];sanitizeChildren(A){let e=A.firstChild,i=!0,n=[];for(;e;){if(e.nodeType===Node.ELEMENT_NODE?i=this.startElement(e):e.nodeType===Node.TEXT_NODE?this.chars(e.nodeValue):this.sanitizedSomething=!0,i&&e.firstChild){n.push(e),e=Y4e(e);continue}for(;e;){e.nodeType===Node.ELEMENT_NODE&&this.endElement(e);let o=J4e(e);if(o){e=o;break}e=n.pop()}}return this.buf.join("")}startElement(A){let e=rj(A).toLowerCase();if(!oj.hasOwnProperty(e))return this.sanitizedSomething=!0,!T4e.hasOwnProperty(e);this.buf.push("<"),this.buf.push(e);let i=A.attributes;for(let n=0;n"),!0}endElement(A){let e=rj(A).toLowerCase();oj.hasOwnProperty(e)&&!nq.hasOwnProperty(e)&&(this.buf.push(""))}chars(A){this.buf.push(sj(A))}};function O4e(t,A){return(t.compareDocumentPosition(A)&Node.DOCUMENT_POSITION_CONTAINED_BY)!==Node.DOCUMENT_POSITION_CONTAINED_BY}function J4e(t){let A=t.nextSibling;if(A&&t!==A.previousSibling)throw aq(A);return A}function Y4e(t){let A=t.firstChild;if(A&&O4e(t,A))throw aq(A);return A}function rj(t){let A=t.nodeName;return typeof A=="string"?A:"FORM"}function aq(t){return new Error(`Failed to sanitize html because the element is clobbered: ${t.outerHTML}`)}var H4e=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,z4e=/([^\#-~ |!])/g;function sj(t){return t.replace(/&/g,"&").replace(H4e,function(A){let e=A.charCodeAt(0),i=A.charCodeAt(1);return"&#"+((e-55296)*1024+(i-56320)+65536)+";"}).replace(z4e,function(A){return"&#"+A.charCodeAt(0)+";"}).replace(//g,">")}var T8;function tR(t,A){let e=null;try{T8=T8||x4e(t);let i=A?String(A):"";e=T8.getInertBodyElement(i);let n=5,o=i;do{if(n===0)throw new Error("Failed to sanitize html because the input is unstable");n--,i=o,o=e.innerHTML,e=T8.getInertBodyElement(i)}while(i!==o);let s=new Yx().sanitizeChildren(aj(e)||e);return Nw(s)}finally{if(e){let i=aj(e)||e;for(;i.firstChild;)i.firstChild.remove()}}}function aj(t){return"content"in t&&P4e(t)?t.content:null}function P4e(t){return t.nodeType===Node.ELEMENT_NODE&&t.nodeName==="TEMPLATE"}var Ls=function(t){return t[t.NONE=0]="NONE",t[t.HTML=1]="HTML",t[t.STYLE=2]="STYLE",t[t.SCRIPT=3]="SCRIPT",t[t.URL=4]="URL",t[t.RESOURCE_URL=5]="RESOURCE_URL",t}(Ls||{});function J0(t){let A=cq();return A?nj(A.sanitize(Ls.HTML,t)||""):D1(t,"HTML")?nj(Ll(t)):tR(jV(),xI(t))}function $r(t){let A=cq();return A?A.sanitize(Ls.URL,t)||"":D1(t,"URL")?Ll(t):Lw(xI(t))}function cq(){let t=Ai();return t&&t[Zd].sanitizer}var j4e=/^>|^->||--!>|)/g,q4e="\u200B$1\u200B";function W4e(t){return t.replace(j4e,A=>A.replace(V4e,q4e))}function Fw(t){return t.ownerDocument.defaultView}function n2(t){return t.ownerDocument}function lq(t){return t instanceof Function?t():t}function Z4e(t,A,e){let i=t.length;for(;;){let n=t.indexOf(A,e);if(n===-1)return n;if(n===0||t.charCodeAt(n-1)<=32){let o=A.length;if(n+o===i||t.charCodeAt(n+o)<=32)return n}e=n+1}}var gq="ng-template";function X4e(t,A,e,i){let n=0;if(i){for(;n-1){let o;for(;++no?d="":d=n[l+1].toLowerCase(),i&2&&c!==d){if(pg(i))return!1;r=!0}}}}return pg(i)||r}function pg(t){return(t&1)===0}function Ame(t,A,e,i){if(A===null)return-1;let n=0;if(i||!e){let o=!1;for(;n-1)for(e++;e0?'="'+s+'"':"")+"]"}else i&8?n+="."+r:i&4&&(n+=" "+r);else n!==""&&!pg(r)&&(A+=cj(o,n),n=""),i=r,o=o||!pg(i);e++}return n!==""&&(A+=cj(o,n)),A}function sme(t){return t.map(rme).join(",")}function ame(t){let A=[],e=[],i=1,n=2;for(;iZr&&Eq(t,A,Zr,!1),_o(r?2:0,n),e(i,n)}finally{GI(o),_o(r?3:1,n)}}function Kw(t,A,e){wme(t,A,e),(e.flags&64)===64&&yme(t,A,e)}function sR(t,A,e=U0){let i=A.localNames;if(i!==null){let n=A.index+1;for(let o=0;onull;function mme(t){return t==="class"?"className":t==="for"?"htmlFor":t==="formaction"?"formAction":t==="innerHtml"?"innerHTML":t==="readonly"?"readOnly":t==="tabindex"?"tabIndex":t}function m4(t,A,e,i,n,o,r,s){if(!s&&cR(A,t,e,i,n)){CB(A)&&pme(e,A.index);return}if(A.type&3){let a=U0(A,e);i=mme(i),n=r!=null?r(n,A.value||"",i):n,o.setProperty(a,i,n)}else A.type&12}function pme(t,A){let e=N0(A,t);e[fi]&16||(e[fi]|=64)}function wme(t,A,e){let i=e.directiveStart,n=e.directiveEnd;CB(e)&&Bme(A,e,t.data[i+e.componentOffset]),t.firstCreatePass||rw(e,A);let o=e.initialInputs;for(let r=i;r=0?i[s]():i[-s].unsubscribe(),r+=2}else{let s=i[e[r+1]];e[r].call(s)}i!==null&&(A[$8]=null);let n=A[E1];if(n!==null){A[E1]=null;for(let r=0;r{uB(t.lView)},consumerOnSignalRead(){this.lView[Nl]=this}});function Wme(t){let A=t[Nl]??Object.create(Zme);return A.lView=t,A}var Zme=_A(ae({},Rh),{consumerIsAlwaysLive:!0,kind:"template",consumerMarkedDirty:t=>{let A=FI(t.lView);for(;A&&!Mq(A[Li]);)A=FI(A);A&&cV(A)},consumerOnSignalRead(){this.lView[Nl]=this}});function Mq(t){return t.type!==2}function Sq(t){if(t[NI]===null)return;let A=!0;for(;A;){let e=!1;for(let i of t[NI])i.dirty&&(e=!0,i.zone===null||Zone.current===i.zone?i.run():i.zone.run(()=>i.run()));A=e&&!!(t[fi]&8192)}}var Xme=100;function kq(t,A=!0,e=0){let n=t[Zd].rendererFactory,o=!1;o||n.begin?.();try{$me(t,e)}catch(r){throw A&&Sme(t,r),r}finally{o||n.end?.()}}function $me(t,A){let e=IV();try{tw(!0),Px(t,A);let i=0;for(;kw(t);){if(i===Xme)throw new lA(103,!1);i++,Px(t,1)}}finally{tw(e)}}function e3e(t,A,e,i){if(IB(A))return;let n=A[fi],o=!1,r=!1;H_(A);let s=!0,a=null,c=null;o||(Mq(t)?(c=Pme(A),a=zQ(c)):Sk()===null?(s=!1,c=Wme(A),a=zQ(c)):A[Nl]&&(PQ(A[Nl]),A[Nl]=null));try{aV(A),_Qe(t.bindingStartIndex),e!==null&&fq(t,A,e,2,i);let l=(n&3)===3;if(!o)if(l){let I=t.preOrderCheckHooks;I!==null&&Y8(A,I,null)}else{let I=t.preOrderHooks;I!==null&&H8(A,I,0,null),nx(A,0)}if(r||A3e(A),Sq(A),xq(A,0),t.contentQueries!==null&&XV(t,A),!o)if(l){let I=t.contentCheckHooks;I!==null&&Y8(A,I)}else{let I=t.contentHooks;I!==null&&H8(A,I,1),nx(A,1)}i3e(t,A);let d=t.components;d!==null&&Rq(A,d,0);let C=t.viewQuery;if(C!==null&&Lx(2,C,i),!o)if(l){let I=t.viewCheckHooks;I!==null&&Y8(A,I)}else{let I=t.viewHooks;I!==null&&H8(A,I,2),nx(A,2)}if(t.firstUpdatePass===!0&&(t.firstUpdatePass=!1),A[ix]){for(let I of A[ix])I();A[ix]=null}o||(vq(A),A[fi]&=-73)}catch(l){throw o||uB(A),l}finally{c!==null&&(c8(c,a),s&&Vme(c)),z_()}}function xq(t,A){for(let e=YV(t);e!==null;e=HV(e))for(let i=Ba;i0&&(t[e-1][wg]=i[wg]);let o=Z8(t,Ba+A);Nme(i[Li],i);let r=o[Xd];r!==null&&r.detachView(o[Li]),i[Ea]=null,i[wg]=null,i[fi]&=-129}return i}function n3e(t,A,e,i){let n=Ba+i,o=e.length;i>0&&(e[n-1][wg]=A),i-1&&(l4(A,i),Z8(e,i))}this._attachedToViewContainer=!1}Uw(this._lView[Li],this._lView)}onDestroy(A){lV(this._lView,A)}markForCheck(){uR(this._cdRefInjectingView||this._lView,4)}detach(){this._lView[fi]&=-129}reattach(){wx(this._lView),this._lView[fi]|=128}detectChanges(){this._lView[fi]|=1024,kq(this._lView,this.notifyErrorHandler)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new lA(902,!1);this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null;let A=Aw(this._lView),e=this._lView[RI];e!==null&&!A&&CR(e,this._lView),mq(this._lView[Li],this._lView)}attachToAppRef(A){if(this._attachedToViewContainer)throw new lA(902,!1);this._appRef=A;let e=Aw(this._lView),i=this._lView[RI];i!==null&&!e&&Gq(i,this._lView),wx(this._lView)}};var en=(()=>{class t{static __NG_ELEMENT_ID__=s3e}return t})(),o3e=en,r3e=class extends o3e{_declarationLView;_declarationTContainer;elementRef;constructor(A,e,i){super(),this._declarationLView=A,this._declarationTContainer=e,this.elementRef=i}get ssrId(){return this._declarationTContainer.tView?.ssrId||null}createEmbeddedView(A,e){return this.createEmbeddedViewImpl(A,e)}createEmbeddedViewImpl(A,e,i){let n=p4(this._declarationLView,this._declarationTContainer,A,{embeddedViewInjector:e,dehydratedView:i});return new g4(n)}};function s3e(){return Jw(Xs(),Ai())}function Jw(t,A){return t.type&4?new r3e(A,t,BB(t,A)):null}function mB(t,A,e,i,n){let o=t.data[A];if(o===null)o=a3e(t,A,e,i,n),RQe()&&(o.flags|=32);else if(o.type&64){o.type=e,o.value=i,o.attrs=n;let r=kQe();o.injectorIndex=r===null?-1:r.injectorIndex}return p1(o,!0),o}function a3e(t,A,e,i,n){let o=dV(),r=U_(),s=r?o:o&&o.parent,a=t.data[A]=l3e(t,s,e,A,i,n);return c3e(t,a,o,r),a}function c3e(t,A,e,i){t.firstChild===null&&(t.firstChild=A),e!==null&&(i?e.child==null&&A.parent!==null&&(e.child=A):e.next===null&&(e.next=A,A.prev=e))}function l3e(t,A,e,i,n,o){let r=A?A.injectorIndex:-1,s=0;return gV()&&(s|=128),{type:e,index:i,insertBeforeIndex:null,injectorIndex:r,directiveStart:-1,directiveEnd:-1,directiveStylingLast:-1,componentOffset:-1,propertyBindings:null,flags:s,providerIndexes:0,value:n,attrs:o,mergedAttrs:null,localNames:null,initialInputs:null,inputs:null,hostDirectiveInputs:null,outputs:null,hostDirectiveOutputs:null,directiveToIndex:null,tView:null,next:null,prev:null,projectionNext:null,child:null,parent:A,projection:null,styles:null,stylesWithoutHost:null,residualStyles:void 0,classes:null,classesWithoutHost:null,residualClasses:void 0,classBindings:0,styleBindings:0}}var dfA=new RegExp(`^(\\d+)*(${f4e}|${E4e})*(.*)`);var g3e=()=>null;function aB(t,A){return g3e(t,A)}var d3e=class{},Kq=class{},jx=class{resolveComponentFactory(A){throw Error(`No component factory found for ${Bc(A)}.`)}},Yw=class{static NULL=new jx},fa=class{},an=(()=>{class t{destroyNode=null;static __NG_ELEMENT_ID__=()=>C3e()}return t})();function C3e(){let t=Ai(),A=Xs(),e=N0(A.index,t);return(f1(e)?e:t)[dr]}var I3e=(()=>{class t{static \u0275prov=be({token:t,providedIn:"root",factory:()=>null})}return t})();var sx={},Vx=class{injector;parentInjector;constructor(A,e){this.injector=A,this.parentInjector=e}get(A,e,i){i=ww(i);let n=this.injector.get(A,sx,i);return n!==sx||e===sx?n:this.parentInjector.get(A,e,i)}};function qx(t,A,e){let i=e?t.styles:null,n=e?t.classes:null,o=0;if(A!==null)for(let r=0;r0&&(e.directiveToIndex=new Map);for(let C=0;C0;){let e=t[--A];if(typeof e=="number"&&e<0)return e}return 0}function y3e(t,A,e){if(e){if(A.exportAs)for(let i=0;i{let[e,i,n]=t[A],o={propName:e,templateName:A,isSignal:(i&Gw.SignalBased)!==0};return n&&(o.transform=n),o})}function b3e(t){return Object.keys(t).map(A=>({propName:t[A],templateName:A}))}function M3e(t,A,e){let i=A instanceof Hr?A:A?.injector;return i&&t.getStandaloneInjector!==null&&(i=t.getStandaloneInjector(i)||i),i?new Vx(e,i):e}function S3e(t){let A=t.get(fa,null);if(A===null)throw new lA(407,!1);let e=t.get(I3e,null),i=t.get(UI,null);return{rendererFactory:A,sanitizer:e,changeDetectionScheduler:i}}function k3e(t,A){let e=(t.selectors[0][0]||"div").toLowerCase();return Cq(A,e,e==="svg"?rV:e==="math"?EQe:null)}var TI=class extends Kq{componentDef;ngModule;selector;componentType;ngContentSelectors;isBoundToModule;cachedInputs=null;cachedOutputs=null;get inputs(){return this.cachedInputs??=v3e(this.componentDef.inputs),this.cachedInputs}get outputs(){return this.cachedOutputs??=b3e(this.componentDef.outputs),this.cachedOutputs}constructor(A,e){super(),this.componentDef=A,this.ngModule=e,this.componentType=A.type,this.selector=sme(A.selectors),this.ngContentSelectors=A.ngContentSelectors??[],this.isBoundToModule=!!e}create(A,e,i,n){_o(22);let o=Ui(null);try{let r=this.componentDef,s=i?["ng-version","19.2.15"]:ame(this.componentDef.selectors[0]),a=nR(0,null,null,1,0,null,null,null,null,[s],null),c=M3e(r,n||this.ngModule,A),l=S3e(c),d=l.rendererFactory.createRenderer(null,r),C=i?Eme(d,i,r.encapsulation,c):k3e(r,d),I=oR(null,a,null,512|hq(r),null,null,l,d,c,null,ZV(C,c,!0));I[Zr]=C,H_(I);let u=null;try{let h=Oq(Zr,a,I,"#host",()=>[this.componentDef],!0,0);C&&(uq(d,C,h),EB(C,I)),Kw(a,I,h),AR(a,h,I),Jq(a,h),e!==void 0&&x3e(h,this.ngContentSelectors,e),u=N0(h.index,I),I[gs]=u[gs],lR(a,I,null)}catch(h){throw u!==null&&_x(u),_x(I),h}finally{_o(23),z_()}return new Wx(this.componentType,I)}finally{Ui(o)}}},Wx=class extends d3e{_rootLView;instance;hostView;changeDetectorRef;componentType;location;previousInputValues=null;_tNode;constructor(A,e){super(),this._rootLView=e,this._tNode=R_(e[Li],Zr),this.location=BB(this._tNode,e),this.instance=N0(this._tNode.index,e)[gs],this.hostView=this.changeDetectorRef=new g4(e,void 0,!1),this.componentType=A}setInput(A,e){let i=this._tNode;if(this.previousInputValues??=new Map,this.previousInputValues.has(A)&&Object.is(this.previousInputValues.get(A),e))return;let n=this._rootLView,o=cR(i,n[Li],n,A,e);this.previousInputValues.set(A,e);let r=N0(i.index,n);uR(r,1)}get injector(){return new kI(this._tNode,this._rootLView)}destroy(){this.hostView.destroy()}onDestroy(A){this.hostView.onDestroy(A)}};function x3e(t,A,e){let i=t.projection=[];for(let n=0;n{class t{static __NG_ELEMENT_ID__=_3e}return t})();function _3e(){let t=Xs();return Hq(t,Ai())}var R3e=xn,Yq=class extends R3e{_lContainer;_hostTNode;_hostLView;constructor(A,e,i){super(),this._lContainer=A,this._hostTNode=e,this._hostLView=i}get element(){return BB(this._hostTNode,this._hostLView)}get injector(){return new kI(this._hostTNode,this._hostLView)}get parentInjector(){let A=j_(this._hostTNode,this._hostLView);if(wV(A)){let e=nw(A,this._hostLView),i=iw(A),n=e[Li].data[i+8];return new kI(n,e)}else return new kI(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(A){let e=uj(this._lContainer);return e!==null&&e[A]||null}get length(){return this._lContainer.length-Ba}createEmbeddedView(A,e,i){let n,o;typeof i=="number"?n=i:i!=null&&(n=i.index,o=i.injector);let r=aB(this._lContainer,A.ssrId),s=A.createEmbeddedViewImpl(e||{},o,r);return this.insertImpl(s,n,sB(this._hostTNode,r)),s}createComponent(A,e,i,n,o){let r=A&&!IQe(A),s;if(r)s=e;else{let u=e||{};s=u.index,i=u.injector,n=u.projectableNodes,o=u.environmentInjector||u.ngModuleRef}let a=r?A:new TI(Q1(A)),c=i||this.parentInjector;if(!o&&a.ngModule==null){let h=(r?c:this.parentInjector).get(Hr,null);h&&(o=h)}let l=Q1(a.componentType??{}),d=aB(this._lContainer,l?.id??null),C=d?.firstChild??null,I=a.create(c,n,C,o);return this.insertImpl(I.hostView,s,sB(this._hostTNode,d)),I}insert(A,e){return this.insertImpl(A,e,!0)}insertImpl(A,e,i){let n=A._lView;if(mQe(n)){let s=this.indexOf(A);if(s!==-1)this.detach(s);else{let a=n[Ea],c=new Yq(a,a[Qc],a[Ea]);c.detach(c.indexOf(A))}}let o=this._adjustIndex(e),r=this._lContainer;return w4(r,n,o,i),A.attachToViewContainerRef(),Pj(ax(r),o,A),A}move(A,e){return this.insert(A,e)}indexOf(A){let e=uj(this._lContainer);return e!==null?e.indexOf(A):-1}remove(A){let e=this._adjustIndex(A,-1),i=l4(this._lContainer,e);i&&(Z8(ax(this._lContainer),e),Uw(i[Li],i))}detach(A){let e=this._adjustIndex(A,-1),i=l4(this._lContainer,e);return i&&Z8(ax(this._lContainer),e)!=null?new g4(i):null}_adjustIndex(A,e=0){return A??this.length+e}};function uj(t){return t[ew]}function ax(t){return t[ew]||(t[ew]=[])}function Hq(t,A){let e,i=A[t.index];return A2(i)?e=i:(e=Nq(i,A,null,t),A[t.index]=e,rR(A,e)),L3e(e,A,t,i),new Yq(e,t,A)}function N3e(t,A){let e=t[dr],i=e.createComment(""),n=U0(A,t),o=e.parentNode(n);return cw(e,o,i,e.nextSibling(n),!1),i}var L3e=K3e,F3e=()=>!1;function G3e(t,A,e){return F3e(t,A,e)}function K3e(t,A,e,i){if(t[LI])return;let n;e.type&8?n=R0(i):n=N3e(A,e),t[LI]=n}var Zx=class t{queryList;matches=null;constructor(A){this.queryList=A}clone(){return new t(this.queryList)}setDirty(){this.queryList.setDirty()}},Xx=class t{queries;constructor(A=[]){this.queries=A}createEmbeddedView(A){let e=A.queries;if(e!==null){let i=A.contentQueries!==null?A.contentQueries[0]:e.length,n=[];for(let o=0;o0)i.push(r[s/2]);else{let c=o[s+1],l=A[-a];for(let d=Ba;dA.trim())}function qq(t,A,e){t.queries===null&&(t.queries=new $x),t.queries.track(new e_(A,e))}function H3e(t,A){let e=t.contentQueries||(t.contentQueries=[]),i=e.length?e[e.length-1]:-1;A!==i&&e.push(t.queries.length-1,A)}function ER(t,A){return t.queries.getByIndex(A)}function Wq(t,A){let e=t[Li],i=ER(e,A);return i.crossesNgTemplate?A_(e,t,A,[]):zq(e,t,i,A)}function fR(t,A,e){let i,n=C8(()=>{i._dirtyCounter();let o=P3e(i,t);if(A&&o===void 0)throw new lA(-951,!1);return o});return i=n[Cc],i._dirtyCounter=mA(0),i._flatValue=void 0,n}function Zq(t){return fR(!0,!1,t)}function Xq(t){return fR(!0,!0,t)}function z3e(t){return fR(!1,!1,t)}function $q(t,A){let e=t[Cc];e._lView=Ai(),e._queryIndex=A,e._queryList=BR(e._lView,A),e._queryList.onDirty(()=>e._dirtyCounter.update(i=>i+1))}function P3e(t,A){let e=t._lView,i=t._queryIndex;if(e===void 0||i===void 0||e[fi]&4)return A?void 0:ja;let n=BR(e,i),o=Wq(e,i);return n.reset(o,KV),A?n.first:n._changesDetected||t._flatValue===void 0?t._flatValue=n.toArray():t._flatValue}function hj(t,A){return Zq(A)}function j3e(t,A){return Xq(A)}var es=(hj.required=j3e,hj);function eW(t,A){return z3e(A)}function Bj(t,A){return Zq(A)}function V3e(t,A){return Xq(A)}var o2=(Bj.required=V3e,Bj);var G0=class{},QR=class{};function AW(t,A){return new Cw(t,A??null,[])}var Cw=class extends G0{ngModuleType;_parent;_bootstrapComponents=[];_r3Injector;instance;destroyCbs=[];componentFactoryResolver=new gw(this);constructor(A,e,i,n=!0){super(),this.ngModuleType=A,this._parent=e;let o=qj(A);this._bootstrapComponents=lq(o.bootstrap),this._r3Injector=_V(A,e,[{provide:G0,useValue:this},{provide:Yw,useValue:this.componentFactoryResolver},...i],Bc(A),new Set(["environment"])),n&&this.resolveInjectorInitializers()}resolveInjectorInitializers(){this._r3Injector.resolveInjectorInitializers(),this.instance=this._r3Injector.get(this.ngModuleType)}get injector(){return this._r3Injector}destroy(){let A=this._r3Injector;!A.destroyed&&A.destroy(),this.destroyCbs.forEach(e=>e()),this.destroyCbs=null}onDestroy(A){this.destroyCbs.push(A)}},t_=class extends QR{moduleType;constructor(A){super(),this.moduleType=A}create(A){return new Cw(this.moduleType,A,[])}};var Iw=class extends G0{injector;componentFactoryResolver=new gw(this);instance=null;constructor(A){super();let e=new o4([...A.providers,{provide:G0,useValue:this},{provide:Yw,useValue:this.componentFactoryResolver}],A.parent||vw(),A.debugName,new Set(["environment"]));this.injector=e,A.runEnvironmentInitializers&&e.resolveInjectorInitializers()}destroy(){this.injector.destroy()}onDestroy(A){this.injector.onDestroy(A)}};function y4(t,A,e=null){return new Iw({providers:t,parent:A,debugName:e,runEnvironmentInitializers:!0}).injector}var q3e=(()=>{class t{_injector;cachedInjectors=new Map;constructor(e){this._injector=e}getOrCreateStandaloneInjector(e){if(!e.standalone)return null;if(!this.cachedInjectors.has(e)){let i=Zj(!1,e.type),n=i.length>0?y4([i],this._injector,`Standalone[${e.type.name}]`):null;this.cachedInjectors.set(e,n)}return this.cachedInjectors.get(e)}ngOnDestroy(){try{for(let e of this.cachedInjectors.values())e!==null&&e.destroy()}finally{this.cachedInjectors.clear()}}static \u0275prov=be({token:t,providedIn:"environment",factory:()=>new t(UA(Hr))})}return t})();function xe(t){return C4(()=>{let A=tW(t),e=_A(ae({},A),{decls:t.decls,vars:t.vars,template:t.template,consts:t.consts||null,ngContentSelectors:t.ngContentSelectors,onPush:t.changeDetection===OV.OnPush,directiveDefs:null,pipeDefs:null,dependencies:A.standalone&&t.dependencies||null,getStandaloneInjector:A.standalone?n=>n.get(q3e).getOrCreateStandaloneInjector(e):null,getExternalStyles:null,signals:t.signals??!1,data:t.data||{},encapsulation:t.encapsulation||L0.Emulated,styles:t.styles||ja,_:null,schemas:t.schemas||null,tView:null,id:""});A.standalone&&Dg("NgStandalone"),iW(e);let i=t.dependencies;return e.directiveDefs=Ej(i,!1),e.pipeDefs=Ej(i,!0),e.id=epe(e),e})}function W3e(t){return Q1(t)||Wj(t)}function Z3e(t){return t!==null}function OA(t){return C4(()=>({type:t.type,bootstrap:t.bootstrap||ja,declarations:t.declarations||ja,imports:t.imports||ja,exports:t.exports||ja,transitiveCompileScopes:null,schemas:t.schemas||null,id:t.id||null}))}function X3e(t,A){if(t==null)return _0;let e={};for(let i in t)if(t.hasOwnProperty(i)){let n=t[i],o,r,s,a;Array.isArray(n)?(s=n[0],o=n[1],r=n[2]??o,a=n[3]||null):(o=n,r=n,s=Gw.None,a=null),e[o]=[i,s,a],A[o]=r}return e}function $3e(t){if(t==null)return _0;let A={};for(let e in t)t.hasOwnProperty(e)&&(A[t[e]]=e);return A}function Oe(t){return C4(()=>{let A=tW(t);return iW(A),A})}function pB(t){return{type:t.type,name:t.name,factory:null,pure:t.pure!==!1,standalone:t.standalone??!0,onDestroy:t.type.prototype.ngOnDestroy||null}}function tW(t){let A={};return{type:t.type,providersResolver:null,factory:null,hostBindings:t.hostBindings||null,hostVars:t.hostVars||0,hostAttrs:t.hostAttrs||null,contentQueries:t.contentQueries||null,declaredInputs:A,inputConfig:t.inputs||_0,exportAs:t.exportAs||null,standalone:t.standalone??!0,signals:t.signals===!0,selectors:t.selectors||ja,viewQuery:t.viewQuery||null,features:t.features||null,setInput:null,findHostDirectiveDefs:null,hostDirectives:null,inputs:X3e(t.inputs,A),outputs:$3e(t.outputs),debugInfo:null}}function iW(t){t.features?.forEach(A=>A(t))}function Ej(t,A){if(!t)return null;let e=A?nQe:W3e;return()=>(typeof t=="function"?t():t).map(i=>e(i)).filter(Z3e)}function epe(t){let A=0,e=typeof t.consts=="function"?"":t.consts,i=[t.selectors,t.ngContentSelectors,t.hostVars,t.hostAttrs,e,t.vars,t.decls,t.encapsulation,t.standalone,t.signals,t.exportAs,JSON.stringify(t.inputs),JSON.stringify(t.outputs),Object.getOwnPropertyNames(t.type.prototype),!!t.contentQueries,!!t.viewQuery];for(let o of i.join("|"))A=Math.imul(31,A)+o.charCodeAt(0)<<0;return A+=2147483648,"c"+A}function Ape(t){return Object.getPrototypeOf(t.prototype).constructor}function Ct(t){let A=Ape(t.type),e=!0,i=[t];for(;A;){let n;if(yg(t))n=A.\u0275cmp||A.\u0275dir;else{if(A.\u0275cmp)throw new lA(903,!1);n=A.\u0275dir}if(n){if(e){i.push(n);let r=t;r.inputs=cx(t.inputs),r.declaredInputs=cx(t.declaredInputs),r.outputs=cx(t.outputs);let s=n.hostBindings;s&&rpe(t,s);let a=n.viewQuery,c=n.contentQueries;if(a&&npe(t,a),c&&ope(t,c),tpe(t,n),Ffe(t.outputs,n.outputs),yg(n)&&n.data.animation){let l=t.data;l.animation=(l.animation||[]).concat(n.data.animation)}}let o=n.features;if(o)for(let r=0;r=0;i--){let n=t[i];n.hostVars=A+=n.hostVars,n.hostAttrs=rB(n.hostAttrs,e=rB(e,n.hostAttrs))}}function cx(t){return t===_0?{}:t===ja?[]:t}function npe(t,A){let e=t.viewQuery;e?t.viewQuery=(i,n)=>{A(i,n),e(i,n)}:t.viewQuery=A}function ope(t,A){let e=t.contentQueries;e?t.contentQueries=(i,n,o)=>{A(i,n,o),e(i,n,o)}:t.contentQueries=A}function rpe(t,A){let e=t.hostBindings;e?t.hostBindings=(i,n)=>{A(i,n),e(i,n)}:t.hostBindings=A}function Hw(t){let A=e=>{let i=Array.isArray(t);e.hostDirectives===null?(e.findHostDirectiveDefs=nW,e.hostDirectives=i?t.map(i_):[t]):i?e.hostDirectives.unshift(...t.map(i_)):e.hostDirectives.unshift(t)};return A.ngInherit=!0,A}function nW(t,A,e){if(t.hostDirectives!==null)for(let i of t.hostDirectives)if(typeof i=="function"){let n=i();for(let o of n)fj(i_(o),A,e)}else fj(i,A,e)}function fj(t,A,e){let i=Wj(t.directive);spe(i.declaredInputs,t.inputs),nW(i,A,e),e.set(i,t),A.push(i)}function i_(t){return typeof t=="function"?{directive:Zs(t),inputs:_0,outputs:_0}:{directive:Zs(t.directive),inputs:Qj(t.inputs),outputs:Qj(t.outputs)}}function Qj(t){if(t===void 0||t.length===0)return _0;let A={};for(let e=0;e{class t{log(e){console.log(e)}warn(e){console.warn(e)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"platform"})}return t})();var yR=new re(""),D4=new re(""),zw=(()=>{class t{_ngZone;registry;_isZoneStable=!0;_callbacks=[];_taskTrackingZone=null;_destroyRef;constructor(e,i,n){this._ngZone=e,this.registry=i,k_()&&(this._destroyRef=E(Fr,{optional:!0})??void 0),DR||(Cpe(n),n.addToWindow(i)),this._watchAngularEvents(),e.run(()=>{this._taskTrackingZone=typeof Zone>"u"?null:Zone.current.get("TaskTrackingZone")})}_watchAngularEvents(){let e=this._ngZone.onUnstable.subscribe({next:()=>{this._isZoneStable=!1}}),i=this._ngZone.runOutsideAngular(()=>this._ngZone.onStable.subscribe({next:()=>{yA.assertNotInAngularZone(),queueMicrotask(()=>{this._isZoneStable=!0,this._runCallbacksIfReady()})}}));this._destroyRef?.onDestroy(()=>{e.unsubscribe(),i.unsubscribe()})}isStable(){return this._isZoneStable&&!this._ngZone.hasPendingMacrotasks}_runCallbacksIfReady(){if(this.isStable())queueMicrotask(()=>{for(;this._callbacks.length!==0;){let e=this._callbacks.pop();clearTimeout(e.timeoutId),e.doneCb()}});else{let e=this.getPendingTasks();this._callbacks=this._callbacks.filter(i=>i.updateCb&&i.updateCb(e)?(clearTimeout(i.timeoutId),!1):!0)}}getPendingTasks(){return this._taskTrackingZone?this._taskTrackingZone.macroTasks.map(e=>({source:e.source,creationLocation:e.creationLocation,data:e.data})):[]}addCallback(e,i,n){let o=-1;i&&i>0&&(o=setTimeout(()=>{this._callbacks=this._callbacks.filter(r=>r.timeoutId!==o),e()},i)),this._callbacks.push({doneCb:e,timeoutId:o,updateCb:n})}whenStable(e,i,n){if(n&&!this._taskTrackingZone)throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is "zone.js/plugins/task-tracking" loaded?');this.addCallback(e,i,n),this._runCallbacksIfReady()}registerApplication(e){this.registry.registerApplication(e,this)}unregisterApplication(e){this.registry.unregisterApplication(e)}findProviders(e,i,n){return[]}static \u0275fac=function(i){return new(i||t)(UA(yA),UA(Pw),UA(D4))};static \u0275prov=be({token:t,factory:t.\u0275fac})}return t})(),Pw=(()=>{class t{_applications=new Map;registerApplication(e,i){this._applications.set(e,i)}unregisterApplication(e){this._applications.delete(e)}unregisterAllApplications(){this._applications.clear()}getTestability(e){return this._applications.get(e)||null}getAllTestabilities(){return Array.from(this._applications.values())}getAllRootElements(){return Array.from(this._applications.keys())}findTestabilityInTree(e,i=!0){return DR?.findTestabilityInTree(this,e,i)??null}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"platform"})}return t})();function Cpe(t){DR=t}var DR,sW=(()=>{class t{static \u0275prov=be({token:t,providedIn:"root",factory:()=>new n_})}return t})(),n_=class{queuedEffectCount=0;queues=new Map;schedule(A){this.enqueue(A)}remove(A){let e=A.zone,i=this.queues.get(e);i.has(A)&&(i.delete(A),this.queuedEffectCount--)}enqueue(A){let e=A.zone;this.queues.has(e)||this.queues.set(e,new Set);let i=this.queues.get(e);i.has(A)||(this.queuedEffectCount++,i.add(A))}flush(){for(;this.queuedEffectCount>0;)for(let[A,e]of this.queues)A===null?this.flushQueue(e):A.run(()=>this.flushQueue(e))}flushQueue(A){for(let e of A)A.delete(e),this.queuedEffectCount--,e.run()}};function v1(t){return!!t&&typeof t.then=="function"}function vR(t){return!!t&&typeof t.subscribe=="function"}var aW=new re("");function bR(t){return h4([{provide:aW,multi:!0,useValue:t}])}var cW=(()=>{class t{resolve;reject;initialized=!1;done=!1;donePromise=new Promise((e,i)=>{this.resolve=e,this.reject=i});appInits=E(aW,{optional:!0})??[];injector=E(Dt);constructor(){}runInitializers(){if(this.initialized)return;let e=[];for(let n of this.appInits){let o=Xr(this.injector,n);if(v1(o))e.push(o);else if(vR(o)){let r=new Promise((s,a)=>{o.subscribe({complete:s,error:a})});e.push(r)}}let i=()=>{this.done=!0,this.resolve()};Promise.all(e).then(()=>{i()}).catch(n=>{this.reject(n)}),e.length===0&&i(),this.initialized=!0}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),MR=new re("");function Ipe(){Rk(()=>{throw new lA(600,!1)})}function upe(t){return t.isBoundToModule}var hpe=10;var fc=(()=>{class t{_runningTick=!1;_destroyed=!1;_destroyListeners=[];_views=[];internalErrorHandler=E(c4e);afterRenderManager=E(qV);zonelessEnabled=E(q_);rootEffectScheduler=E(sW);dirtyFlags=0;tracingSnapshot=null;externalTestViews=new Set;afterTick=new je;get allViews(){return[...this.externalTestViews.keys(),...this._views]}get destroyed(){return this._destroyed}componentTypes=[];components=[];isStable=E(t2).hasPendingTasks.pipe(aA(e=>!e));constructor(){E(QB,{optional:!0})}whenStable(){let e;return new Promise(i=>{e=this.isStable.subscribe({next:n=>{n&&i()}})}).finally(()=>{e.unsubscribe()})}_injector=E(Hr);_rendererFactory=null;get injector(){return this._injector}bootstrap(e,i){return this.bootstrapImpl(e,i)}bootstrapImpl(e,i,n=Dt.NULL){_o(10);let o=e instanceof Kq;if(!this._injector.get(cW).done){let I="";throw new lA(405,I)}let s;o?s=e:s=this._injector.get(Yw).resolveComponentFactory(e),this.componentTypes.push(s.componentType);let a=upe(s)?void 0:this._injector.get(G0),c=i||s.selector,l=s.create(n,[],c,a),d=l.location.nativeElement,C=l.injector.get(yR,null);return C?.registerApplication(d),l.onDestroy(()=>{this.detachView(l.hostView),P8(this.components,l),C?.unregisterApplication(d)}),this._loadComponent(l),_o(11,l),l}tick(){this.zonelessEnabled||(this.dirtyFlags|=1),this._tick()}_tick(){_o(12),this.tracingSnapshot!==null?this.tracingSnapshot.run($_.CHANGE_DETECTION,this.tickImpl):this.tickImpl()}tickImpl=()=>{if(this._runningTick)throw new lA(101,!1);let e=Ui(null);try{this._runningTick=!0,this.synchronize()}catch(i){this.internalErrorHandler(i)}finally{this._runningTick=!1,this.tracingSnapshot?.dispose(),this.tracingSnapshot=null,Ui(e),this.afterTick.next(),_o(13)}};synchronize(){this._rendererFactory===null&&!this._injector.destroyed&&(this._rendererFactory=this._injector.get(fa,null,{optional:!0}));let e=0;for(;this.dirtyFlags!==0&&e++kw(e))){this.dirtyFlags|=2;return}else this.dirtyFlags&=-8}attachView(e){let i=e;this._views.push(i),i.attachToAppRef(this)}detachView(e){let i=e;P8(this._views,i),i.detachFromAppRef()}_loadComponent(e){this.attachView(e.hostView),this.tick(),this.components.push(e),this._injector.get(MR,[]).forEach(n=>n(e))}ngOnDestroy(){if(!this._destroyed)try{this._destroyListeners.forEach(e=>e()),this._views.slice().forEach(e=>e.destroy())}finally{this._destroyed=!0,this._views=[],this._destroyListeners=[]}}onDestroy(e){return this._destroyListeners.push(e),()=>P8(this._destroyListeners,e)}destroy(){if(this._destroyed)throw new lA(406,!1);let e=this._injector;e.destroy&&!e.destroyed&&e.destroy()}get viewCount(){return this._views.length}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function P8(t,A){let e=t.indexOf(A);e>-1&&t.splice(e,1)}function Bpe(t,A,e,i){if(!e&&!kw(t))return;kq(t,A,e&&!i?0:1)}function AA(t,A,e,i){let n=Ai(),o=w1();if($c(n,o,A)){let r=Ro(),s=hB();vme(s,n,t,A,e,i)}return AA}function SR(t,A,e,i){return $c(t,w1(),e)?A+xI(e)+i:mc}function Epe(t,A,e,i,n,o){let r=xQe(),s=rW(t,r,e,n);return O_(2),s?A+xI(e)+i+xI(n)+o:mc}function O8(t,A){return t<<17|A<<2}function OI(t){return t>>17&32767}function fpe(t){return(t&2)==2}function Qpe(t,A){return t&131071|A<<17}function o_(t){return t|2}function cB(t){return(t&131068)>>2}function lx(t,A){return t&-131069|A<<2}function mpe(t){return(t&1)===1}function r_(t){return t|1}function ppe(t,A,e,i,n,o){let r=o?A.classBindings:A.styleBindings,s=OI(r),a=cB(r);t[i]=e;let c=!1,l;if(Array.isArray(e)){let d=e;l=d[1],(l===null||u4(d,l)>0)&&(c=!0)}else l=e;if(n)if(a!==0){let C=OI(t[s+1]);t[i+1]=O8(C,s),C!==0&&(t[C+1]=lx(t[C+1],i)),t[s+1]=Qpe(t[s+1],i)}else t[i+1]=O8(s,0),s!==0&&(t[s+1]=lx(t[s+1],i)),s=i;else t[i+1]=O8(a,0),s===0?s=i:t[a+1]=lx(t[a+1],i),a=i;c&&(t[i+1]=o_(t[i+1])),mj(t,l,i,!0),mj(t,l,i,!1),wpe(A,l,t,i,o),r=O8(s,a),o?A.classBindings=r:A.styleBindings=r}function wpe(t,A,e,i,n){let o=n?t.residualClasses:t.residualStyles;o!=null&&typeof A=="string"&&u4(o,A)>=0&&(e[i+1]=r_(e[i+1]))}function mj(t,A,e,i){let n=t[e+1],o=A===null,r=i?OI(n):cB(n),s=!1;for(;r!==0&&(s===!1||o);){let a=t[r],c=t[r+1];ype(a,A)&&(s=!0,t[r+1]=i?r_(c):o_(c)),r=i?OI(c):cB(c)}s&&(t[e+1]=i?o_(n):r_(n))}function ype(t,A){return t===null||A==null||(Array.isArray(t)?t[1]:t)===A?!0:Array.isArray(t)&&typeof A=="string"?u4(t,A)>=0:!1}var ps={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function lW(t){return t.substring(ps.key,ps.keyEnd)}function Dpe(t){return t.substring(ps.value,ps.valueEnd)}function vpe(t){return CW(t),gW(t,lB(t,0,ps.textEnd))}function gW(t,A){let e=ps.textEnd;return e===A?-1:(A=ps.keyEnd=Mpe(t,ps.key=A,e),lB(t,A,e))}function bpe(t){return CW(t),dW(t,lB(t,0,ps.textEnd))}function dW(t,A){let e=ps.textEnd,i=ps.key=lB(t,A,e);return e===i?-1:(i=ps.keyEnd=Spe(t,i,e),i=pj(t,i,e,58),i=ps.value=lB(t,i,e),i=ps.valueEnd=kpe(t,i,e),pj(t,i,e,59))}function CW(t){ps.key=0,ps.keyEnd=0,ps.value=0,ps.valueEnd=0,ps.textEnd=t.length}function lB(t,A,e){for(;A32;)A++;return A}function Spe(t,A,e){let i;for(;A=65&&(i&-33)<=90||i>=48&&i<=57);)A++;return A}function pj(t,A,e,i){return A=lB(t,A,e),A32&&(s=r),o=n,n=i,i=a&-33}return s}function wj(t,A,e,i){let n=-1,o=e;for(;o=0;e=dW(A,e))fW(t,lW(A),Dpe(A))}function Lo(t){kR(Gpe,uW,t,!0)}function uW(t,A){for(let e=vpe(A);e>=0;e=gW(A,e))I4(t,lW(A),!0)}function hW(t,A,e,i){let n=Ai(),o=Ro(),r=O_(2);if(o.firstUpdatePass&&EW(o,t,r,i),A!==mc&&$c(n,r,A)){let s=o.data[T0()];QW(o,s,n,n[dr],t,n[r+1]=Upe(A,e),i,r)}}function kR(t,A,e,i){let n=Ro(),o=O_(2);n.firstUpdatePass&&EW(n,null,o,i);let r=Ai();if(e!==mc&&$c(r,o,e)){let s=n.data[T0()];if(mW(s,i)&&!BW(n,o)){let a=i?s.classesWithoutHost:s.stylesWithoutHost;a!==null&&(e=ux(a,e||"")),s_(n,s,r,e,i)}else Kpe(n,s,r,r[dr],r[o+1],r[o+1]=Fpe(t,A,e),i,o)}}function BW(t,A){return A>=t.expandoStartIndex}function EW(t,A,e,i){let n=t.data;if(n[e+1]===null){let o=n[T0()],r=BW(t,e);mW(o,i)&&A===null&&!r&&(A=!1),A=_pe(n,o,A,i),ppe(n,o,A,e,r,i)}}function _pe(t,A,e,i){let n=J_(t),o=i?A.residualClasses:A.residualStyles;if(n===null)(i?A.classBindings:A.styleBindings)===0&&(e=gx(null,t,A,e,i),e=d4(e,A.attrs,i),o=null);else{let r=A.directiveStylingLast;if(r===-1||t[r]!==n)if(e=gx(n,t,A,e,i),o===null){let a=Rpe(t,A,i);a!==void 0&&Array.isArray(a)&&(a=gx(null,t,A,a[1],i),a=d4(a,A.attrs,i),Npe(t,A,i,a))}else o=Lpe(t,A,i)}return o!==void 0&&(i?A.residualClasses=o:A.residualStyles=o),e}function Rpe(t,A,e){let i=e?A.classBindings:A.styleBindings;if(cB(i)!==0)return t[OI(i)]}function Npe(t,A,e,i){let n=e?A.classBindings:A.styleBindings;t[OI(n)]=i}function Lpe(t,A,e){let i,n=A.directiveEnd;for(let o=1+A.directiveStylingLast;o0;){let a=t[n],c=Array.isArray(a),l=c?a[1]:a,d=l===null,C=e[n+1];C===mc&&(C=d?ja:void 0);let I=d?Ax(C,i):l===i?C:void 0;if(c&&!hw(I)&&(I=Ax(a,i)),hw(I)&&(s=I,r))return s;let u=t[n+1];n=r?OI(u):cB(u)}if(A!==null){let a=o?A.residualClasses:A.residualStyles;a!=null&&(s=Ax(a,i))}return s}function hw(t){return t!==void 0}function Upe(t,A){return t==null||t===""||(typeof A=="string"?t=t+A:typeof t=="object"&&(t=Bc(Ll(t)))),t}function mW(t,A){return(t.flags&(A?8:16))!==0}function pW(t,A,e){let i=Ai(),n=SR(i,t,A,e);kR(I4,uW,n,!0)}function wB(){return Ai()[Ec][gs]}var a_=class{destroy(A){}updateValue(A,e){}swap(A,e){let i=Math.min(A,e),n=Math.max(A,e),o=this.detach(n);if(n-i>1){let r=this.detach(i);this.attach(i,o),this.attach(n,r)}else this.attach(i,o)}move(A,e){this.attach(e,this.detach(A))}};function dx(t,A,e,i,n){return t===e&&Object.is(A,i)?1:Object.is(n(t,A),n(e,i))?-1:0}function Tpe(t,A,e){let i,n,o=0,r=t.length-1,s=void 0;if(Array.isArray(A)){let a=A.length-1;for(;o<=r&&o<=a;){let c=t.at(o),l=A[o],d=dx(o,c,o,l,e);if(d!==0){d<0&&t.updateValue(o,l),o++;continue}let C=t.at(r),I=A[a],u=dx(r,C,a,I,e);if(u!==0){u<0&&t.updateValue(r,I),r--,a--;continue}let h=e(o,c),B=e(r,C),f=e(o,l);if(Object.is(f,B)){let b=e(a,I);Object.is(b,h)?(t.swap(o,r),t.updateValue(r,I),a--,r--):t.move(r,o),t.updateValue(o,l),o++;continue}if(i??=new Bw,n??=vj(t,o,r,e),c_(t,i,o,f))t.updateValue(o,l),o++,r++;else if(n.has(f))i.set(h,t.detach(o)),r--;else{let b=t.create(o,A[o]);t.attach(o,b),o++,r++}}for(;o<=a;)Dj(t,i,e,o,A[o]),o++}else if(A!=null){let a=A[Symbol.iterator](),c=a.next();for(;!c.done&&o<=r;){let l=t.at(o),d=c.value,C=dx(o,l,o,d,e);if(C!==0)C<0&&t.updateValue(o,d),o++,c=a.next();else{i??=new Bw,n??=vj(t,o,r,e);let I=e(o,d);if(c_(t,i,o,I))t.updateValue(o,d),o++,r++,c=a.next();else if(!n.has(I))t.attach(o,t.create(o,d)),o++,r++,c=a.next();else{let u=e(o,l);i.set(u,t.detach(o)),r--}}}for(;!c.done;)Dj(t,i,e,t.length,c.value),c=a.next()}for(;o<=r;)t.destroy(t.detach(r--));i?.forEach(a=>{t.destroy(a)})}function c_(t,A,e,i){return A!==void 0&&A.has(i)?(t.attach(e,A.get(i)),A.delete(i),!0):!1}function Dj(t,A,e,i,n){if(c_(t,A,i,e(i,n)))t.updateValue(i,n);else{let o=t.create(i,n);t.attach(i,o)}}function vj(t,A,e,i){let n=new Set;for(let o=A;o<=e;o++)n.add(i(o,t.at(o)));return n}var Bw=class{kvMap=new Map;_vMap=void 0;has(A){return this.kvMap.has(A)}delete(A){if(!this.has(A))return!1;let e=this.kvMap.get(A);return this._vMap!==void 0&&this._vMap.has(e)?(this.kvMap.set(A,this._vMap.get(e)),this._vMap.delete(e)):this.kvMap.delete(A),!0}get(A){return this.kvMap.get(A)}set(A,e){if(this.kvMap.has(A)){let i=this.kvMap.get(A);this._vMap===void 0&&(this._vMap=new Map);let n=this._vMap;for(;n.has(i);)i=n.get(i);n.set(i,e)}else this.kvMap.set(A,e)}forEach(A){for(let[e,i]of this.kvMap)if(A(i,e),this._vMap!==void 0){let n=this._vMap;for(;n.has(i);)i=n.get(i),A(i,e)}}};function $(t,A){Dg("NgControlFlow");let e=Ai(),i=w1(),n=e[i]!==mc?e[i]:-1,o=n!==-1?Ew(e,Zr+n):void 0,r=0;if($c(e,i,t)){let s=Ui(null);try{if(o!==void 0&&Fq(o,r),t!==-1){let a=Zr+t,c=Ew(e,a),l=C_(e[Li],a),d=aB(c,l.tView.ssrId),C=p4(e,l,A,{dehydratedView:d});w4(c,C,r,sB(l,d))}}finally{Ui(s)}}else if(o!==void 0){let s=Lq(o,r);s!==void 0&&(s[gs]=A)}}var l_=class{lContainer;$implicit;$index;constructor(A,e,i){this.lContainer=A,this.$implicit=e,this.$index=i}get $count(){return this.lContainer.length-Ba}};function b1(t){return t}function Fi(t,A){return A}var g_=class{hasEmptyBlock;trackByFn;liveCollection;constructor(A,e,i){this.hasEmptyBlock=A,this.trackByFn=e,this.liveCollection=i}};function Rt(t,A,e,i,n,o,r,s,a,c,l,d,C){Dg("NgControlFlow");let I=Ai(),u=Ro(),h=a!==void 0,B=Ai(),f=s?r.bind(B[Ec][gs]):r,b=new g_(h,f);B[Zr+t]=b,uw(I,u,t+1,A,e,i,n,m1(u.consts,o)),h&&uw(I,u,t+2,a,c,l,d,m1(u.consts,C))}var d_=class extends a_{lContainer;hostLView;templateTNode;operationsCounter=void 0;needsIndexUpdate=!1;constructor(A,e,i){super(),this.lContainer=A,this.hostLView=e,this.templateTNode=i}get length(){return this.lContainer.length-Ba}at(A){return this.getLView(A)[gs].$implicit}attach(A,e){let i=e[iB];this.needsIndexUpdate||=A!==this.length,w4(this.lContainer,e,A,sB(this.templateTNode,i))}detach(A){return this.needsIndexUpdate||=A!==this.length-1,Ope(this.lContainer,A)}create(A,e){let i=aB(this.lContainer,this.templateTNode.tView.ssrId),n=p4(this.hostLView,this.templateTNode,new l_(this.lContainer,e,A),{dehydratedView:i});return this.operationsCounter?.recordCreate(),n}destroy(A){Uw(A[Li],A),this.operationsCounter?.recordDestroy()}updateValue(A,e){this.getLView(A)[gs].$implicit=e}reset(){this.needsIndexUpdate=!1,this.operationsCounter?.reset()}updateIndexes(){if(this.needsIndexUpdate)for(let A=0;A(Rw(!0),Cq(i,n,UQe()));function Hpe(t,A,e,i,n){let o=A.consts,r=m1(o,i),s=mB(A,t,8,"ng-container",r);r!==null&&qx(s,r,!0);let a=m1(o,n);return K_()&&hR(A,e,s,a,aR),s.mergedAttrs=rB(s.mergedAttrs,s.attrs),A.queries!==null&&A.queries.elementStart(A,s),s}function Qa(t,A,e){let i=Ai(),n=Ro(),o=t+Zr,r=n.firstCreatePass?Hpe(o,n,i,A,e):n.data[o];p1(r,!0);let s=zpe(n,i,r,t);return i[o]=s,_w()&&Tw(n,i,s,r),EB(s,i),Mw(r)&&(Kw(n,i,r),AR(n,r,i)),e!=null&&sR(i,r),Qa}function ma(){let t=Xs(),A=Ro();return U_()?T_():(t=t.parent,p1(t,!1)),A.firstCreatePass&&(P_(A,t),__(t)&&A.queries.elementEnd(t)),ma}function En(t,A,e){return Qa(t,A,e),ma(),En}var zpe=(t,A,e,i)=>(Rw(!0),gme(A[dr],""));function Ue(){return Ai()}function ea(t,A,e){let i=Ai(),n=w1();if($c(i,n,A)){let o=Ro(),r=hB();m4(o,r,i,t,A,i[dr],e,!0)}return ea}function xR(t,A,e){let i=Ai(),n=w1();if($c(i,n,A)){let o=Ro(),r=hB(),s=J_(o.data),a=Qq(s,r,i);m4(o,r,i,t,A,a,e,!0)}return xR}var fw="en-US";var Ppe=fw;function jpe(t){typeof t=="string"&&(Ppe=t.toLowerCase().replace(/_/g,"-"))}function bj(t,A,e){return function i(n){if(n===Function)return e;let o=CB(t)?N0(t.index,A):A;uR(o,5);let r=A[gs],s=Mj(A,r,e,n),a=i.__ngNextListenerFn__;for(;a;)s=Mj(A,r,a,n)&&s,a=a.__ngNextListenerFn__;return s}}function Mj(t,A,e,i){let n=Ui(null);try{return _o(6,A,e),e(i)!==!1}catch(o){return Vpe(t,o),!1}finally{_o(7,A,e),Ui(n)}}function Vpe(t,A){let e=t[nB],i=e?e.get(Va,null):null;i&&i.handleError(A)}function Sj(t,A,e,i,n,o){let r=A[e],s=A[Li],c=s.data[e].outputs[i],l=r[c],d=s.firstCreatePass?G_(s):null,C=F_(A),I=l.subscribe(o),u=C.length;C.push(o,I),d&&d.push(n,t.index,u,-(u+1))}function ee(t,A,e,i){let n=Ai(),o=Ro(),r=Xs();return RR(o,n,n[dr],r,t,A,i),ee}function _R(t,A){let e=Xs(),i=Ai(),n=Ro(),o=J_(n.data),r=Qq(o,e,i);return RR(n,i,r,e,t,A),_R}function qpe(t,A,e,i){let n=t.cleanup;if(n!=null)for(let o=0;oa?s[a]:null}typeof r=="string"&&(o+=2)}return null}function RR(t,A,e,i,n,o,r){let s=Mw(i),c=t.firstCreatePass?G_(t):null,l=F_(A),d=!0;if(i.type&3||r){let C=U0(i,A),I=r?r(C):C,u=l.length,h=r?f=>r(R0(f[i.index])):i.index,B=null;if(!r&&s&&(B=qpe(t,A,n,i.index)),B!==null){let f=B.__ngLastListenerFn__||B;f.__ngNextListenerFn__=o,B.__ngLastListenerFn__=o,d=!1}else{o=bj(i,A,o),v4e(A,I,n,o);let f=e.listen(I,n,o);l.push(o,f),c&&c.push(n,h,u,u+1)}}else o=bj(i,A,o);if(d){let C=i.outputs?.[n],I=i.hostDirectiveOutputs?.[n];if(I&&I.length)for(let u=0;u(Rw(!0),cme(A[dr],i));function Pe(t){return FA("",t,""),Pe}function FA(t,A,e){let i=Ai(),n=SR(i,t,A,e);return n!==mc&&yW(i,T0(),n),FA}function el(t,A,e,i,n){let o=Ai(),r=Epe(o,t,A,e,i,n);return r!==mc&&yW(o,T0(),r),el}function yW(t,A,e){let i=sV(A,t);lme(t[dr],i,e)}function jn(t,A,e){UV(A)&&(A=A());let i=Ai(),n=w1();if($c(i,n,A)){let o=Ro(),r=hB();m4(o,r,i,t,A,i[dr],e,!1)}return jn}function Vn(t,A){let e=UV(t);return e&&t.set(A),e}function qn(t,A){let e=Ai(),i=Ro(),n=Xs();return RR(i,e,e[dr],n,t,A),qn}var DW={};function Wa(t){let A=Ro(),e=Ai(),i=t+Zr,n=mB(A,i,128,null,null);return p1(n,!1),N_(A,e,i,DW),Wa}function S1(t){Dg("NgLet");let A=Ro(),e=Ai(),i=T0();return N_(A,e,i,t),t}function s2(t){let A=CV(),e=Sw(A,Zr+t);if(e===DW)throw new lA(314,!1);return e}function $pe(t,A,e){let i=Ro();if(i.firstCreatePass){let n=yg(t);I_(e,i.data,i.blueprint,n,!0),I_(A,i.data,i.blueprint,n,!1)}}function I_(t,A,e,i,n){if(t=Zs(t),Array.isArray(t))for(let o=0;o>20;if(tB(t)||!t.multi){let I=new KI(c,n,DA),u=Ix(a,A,n?l:l+C,d);u===-1?(bx(rw(s,r),o,a),Cx(o,t,A.length),A.push(a),s.directiveStart++,s.directiveEnd++,n&&(s.providerIndexes+=1048576),e.push(I),r.push(I)):(e[u]=I,r[u]=I)}else{let I=Ix(a,A,l+C,d),u=Ix(a,A,l,l+C),h=I>=0&&e[I],B=u>=0&&e[u];if(n&&!B||!n&&!h){bx(rw(s,r),o,a);let f=t6e(n?A6e:e6e,e.length,n,i,c);!n&&B&&(e[u].providerFactory=f),Cx(o,t,A.length,0),A.push(a),s.directiveStart++,s.directiveEnd++,n&&(s.providerIndexes+=1048576),e.push(f),r.push(f)}else{let f=vW(e[n?u:I],c,!n&&i);Cx(o,t,I>-1?I:u,f)}!n&&i&&B&&e[u].componentProviders++}}}function Cx(t,A,e,i){let n=tB(A),o=aQe(A);if(n||o){let a=(o?Zs(A.useClass):A).prototype.ngOnDestroy;if(a){let c=t.destroyHooks||(t.destroyHooks=[]);if(!n&&A.multi){let l=c.indexOf(e);l===-1?c.push(e,[i,a]):c[l+1].push(i,a)}else c.push(e,a)}}}function vW(t,A,e){return e&&t.componentProviders++,t.multi.push(A)-1}function Ix(t,A,e,i){for(let n=e;n{e.providersResolver=(i,n)=>$pe(i,n?n(t):t,A)}}function v4(t,A,e){let i=B4()+t,n=Ai();return n[i]===mc?pR(n,i,e?A.call(e):A()):cpe(n,i)}function Al(t,A,e,i){return MW(Ai(),B4(),t,A,e,i)}function tl(t,A,e,i,n){return SW(Ai(),B4(),t,A,e,i,n)}function bW(t,A){let e=t[A];return e===mc?void 0:e}function MW(t,A,e,i,n,o){let r=A+e;return $c(t,r,n)?pR(t,r+1,o?i.call(o,n):i(n)):bW(t,r+1)}function SW(t,A,e,i,n,o,r){let s=A+e;return rW(t,s,n,o)?pR(t,s+2,r?i.call(r,n,o):i(n,o)):bW(t,s+2)}function Ii(t,A){let e=Ro(),i,n=t+Zr;e.firstCreatePass?(i=i6e(A,e.pipeRegistry),e.data[n]=i,i.onDestroy&&(e.destroyHooks??=[]).push(n,i.onDestroy)):i=e.data[n];let o=i.factory||(i.factory=_I(i.type,!0)),r,s=hc(DA);try{let a=ow(!1),c=o();return ow(a),N_(e,Ai(),n,c),c}finally{hc(s)}}function i6e(t,A){if(A)for(let e=A.length-1;e>=0;e--){let i=A[e];if(t===i.name)return i}}function Qi(t,A,e){let i=t+Zr,n=Ai(),o=Sw(n,i);return kW(n,i)?MW(n,B4(),A,o.transform,e,o):o.transform(e)}function b4(t,A,e,i){let n=t+Zr,o=Ai(),r=Sw(o,n);return kW(o,n)?SW(o,B4(),A,r.transform,e,i,r):r.transform(e,i)}function kW(t,A){return t[Li].data[A].pure}function a2(t,A){return Jw(t,A)}var JI=class{full;major;minor;patch;constructor(A){this.full=A;let e=A.split(".");this.major=e[0],this.minor=e[1],this.patch=e.slice(2).join(".")}},NR=new JI("19.2.15"),h_=class{ngModuleFactory;componentFactories;constructor(A,e){this.ngModuleFactory=A,this.componentFactories=e}},xW=(()=>{class t{compileModuleSync(e){return new t_(e)}compileModuleAsync(e){return Promise.resolve(this.compileModuleSync(e))}compileModuleAndAllComponentsSync(e){let i=this.compileModuleSync(e),n=qj(e),o=lq(n.declarations).reduce((r,s)=>{let a=Q1(s);return a&&r.push(new TI(a)),r},[]);return new h_(i,o)}compileModuleAndAllComponentsAsync(e){return Promise.resolve(this.compileModuleAndAllComponentsSync(e))}clearCache(){}clearCacheFor(e){}getModuleId(e){}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var n6e=(()=>{class t{zone=E(yA);changeDetectionScheduler=E(UI);applicationRef=E(fc);_onMicrotaskEmptySubscription;initialize(){this._onMicrotaskEmptySubscription||(this._onMicrotaskEmptySubscription=this.zone.onMicrotaskEmpty.subscribe({next:()=>{this.changeDetectionScheduler.runningTick||this.zone.run(()=>{this.applicationRef.tick()})}}))}ngOnDestroy(){this._onMicrotaskEmptySubscription?.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function o6e({ngZoneFactory:t,ignoreChangesOutsideZone:A,scheduleInRootZone:e}){return t??=()=>new yA(_A(ae({},r6e()),{scheduleInRootZone:e})),[{provide:yA,useFactory:t},{provide:AB,multi:!0,useFactory:()=>{let i=E(n6e,{optional:!0});return()=>i.initialize()}},{provide:AB,multi:!0,useFactory:()=>{let i=E(s6e);return()=>{i.initialize()}}},A===!0?{provide:NV,useValue:!0}:[],{provide:LV,useValue:e??RV}]}function r6e(t){return{enableLongStackTrace:!1,shouldCoalesceEventChangeDetection:t?.eventCoalescing??!1,shouldCoalesceRunChangeDetection:t?.runCoalescing??!1}}var s6e=(()=>{class t{subscription=new Ot;initialized=!1;zone=E(yA);pendingTasks=E(t2);initialize(){if(this.initialized)return;this.initialized=!0;let e=null;!this.zone.isStable&&!this.zone.hasPendingMacrotasks&&!this.zone.hasPendingMicrotasks&&(e=this.pendingTasks.add()),this.zone.runOutsideAngular(()=>{this.subscription.add(this.zone.onStable.subscribe(()=>{yA.assertNotInAngularZone(),queueMicrotask(()=>{e!==null&&!this.zone.hasPendingMacrotasks&&!this.zone.hasPendingMicrotasks&&(this.pendingTasks.remove(e),e=null)})}))}),this.subscription.add(this.zone.onUnstable.subscribe(()=>{yA.assertInAngularZone(),e??=this.pendingTasks.add()}))}ngOnDestroy(){this.subscription.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var a6e=(()=>{class t{appRef=E(fc);taskService=E(t2);ngZone=E(yA);zonelessEnabled=E(q_);tracing=E(QB,{optional:!0});disableScheduling=E(NV,{optional:!0})??!1;zoneIsDefined=typeof Zone<"u"&&!!Zone.root.run;schedulerTickApplyArgs=[{data:{__scheduler_tick__:!0}}];subscriptions=new Ot;angularZoneId=this.zoneIsDefined?this.ngZone._inner?.get(aw):null;scheduleInRootZone=!this.zonelessEnabled&&this.zoneIsDefined&&(E(LV,{optional:!0})??!1);cancelScheduledCallback=null;useMicrotaskScheduler=!1;runningTick=!1;pendingRenderTaskId=null;constructor(){this.subscriptions.add(this.appRef.afterTick.subscribe(()=>{this.runningTick||this.cleanup()})),this.subscriptions.add(this.ngZone.onUnstable.subscribe(()=>{this.runningTick||this.cleanup()})),this.disableScheduling||=!this.zonelessEnabled&&(this.ngZone instanceof xx||!this.zoneIsDefined)}notify(e){if(!this.zonelessEnabled&&e===5)return;let i=!1;switch(e){case 0:{this.appRef.dirtyFlags|=2;break}case 3:case 2:case 4:case 5:case 1:{this.appRef.dirtyFlags|=4;break}case 6:{this.appRef.dirtyFlags|=2,i=!0;break}case 12:{this.appRef.dirtyFlags|=16,i=!0;break}case 13:{this.appRef.dirtyFlags|=2,i=!0;break}case 11:{i=!0;break}case 9:case 8:case 7:case 10:default:this.appRef.dirtyFlags|=8}if(this.appRef.tracingSnapshot=this.tracing?.snapshot(this.appRef.tracingSnapshot)??null,!this.shouldScheduleTick(i))return;let n=this.useMicrotaskScheduler?XP:FV;this.pendingRenderTaskId=this.taskService.add(),this.scheduleInRootZone?this.cancelScheduledCallback=Zone.root.run(()=>n(()=>this.tick())):this.cancelScheduledCallback=this.ngZone.runOutsideAngular(()=>n(()=>this.tick()))}shouldScheduleTick(e){return!(this.disableScheduling&&!e||this.appRef.destroyed||this.pendingRenderTaskId!==null||this.runningTick||this.appRef._runningTick||!this.zonelessEnabled&&this.zoneIsDefined&&Zone.current.get(aw+this.angularZoneId))}tick(){if(this.runningTick||this.appRef.destroyed)return;if(this.appRef.dirtyFlags===0){this.cleanup();return}!this.zonelessEnabled&&this.appRef.dirtyFlags&7&&(this.appRef.dirtyFlags|=1);let e=this.taskService.add();try{this.ngZone.run(()=>{this.runningTick=!0,this.appRef._tick()},void 0,this.schedulerTickApplyArgs)}catch(i){throw this.taskService.remove(e),i}finally{this.cleanup()}this.useMicrotaskScheduler=!0,XP(()=>{this.useMicrotaskScheduler=!1,this.taskService.remove(e)})}ngOnDestroy(){this.subscriptions.unsubscribe(),this.cleanup()}cleanup(){if(this.runningTick=!1,this.cancelScheduledCallback?.(),this.cancelScheduledCallback=null,this.pendingRenderTaskId!==null){let e=this.pendingRenderTaskId;this.pendingRenderTaskId=null,this.taskService.remove(e)}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function c6e(){return typeof $localize<"u"&&$localize.locale||fw}var jw=new re("",{providedIn:"root",factory:()=>E(jw,ji.Optional|ji.SkipSelf)||c6e()});var B_=new re(""),l6e=new re("");function A4(t){return!t.moduleRef}function g6e(t){let A=A4(t)?t.r3Injector:t.moduleRef.injector,e=A.get(yA);return e.run(()=>{A4(t)?t.r3Injector.resolveInjectorInitializers():t.moduleRef.resolveInjectorInitializers();let i=A.get(Va,null),n;if(e.runOutsideAngular(()=>{n=e.onError.subscribe({next:o=>{i.handleError(o)}})}),A4(t)){let o=()=>A.destroy(),r=t.platformInjector.get(B_);r.add(o),A.onDestroy(()=>{n.unsubscribe(),r.delete(o)})}else{let o=()=>t.moduleRef.destroy(),r=t.platformInjector.get(B_);r.add(o),t.moduleRef.onDestroy(()=>{P8(t.allPlatformModules,t.moduleRef),n.unsubscribe(),r.delete(o)})}return C6e(i,e,()=>{let o=A.get(cW);return o.runInitializers(),o.donePromise.then(()=>{let r=A.get(jw,fw);if(jpe(r||fw),!A.get(l6e,!0))return A4(t)?A.get(fc):(t.allPlatformModules.push(t.moduleRef),t.moduleRef);if(A4(t)){let a=A.get(fc);return t.rootComponent!==void 0&&a.bootstrap(t.rootComponent),a}else return d6e(t.moduleRef,t.allPlatformModules),t.moduleRef})})})}function d6e(t,A){let e=t.injector.get(fc);if(t._bootstrapComponents.length>0)t._bootstrapComponents.forEach(i=>e.bootstrap(i));else if(t.instance.ngDoBootstrap)t.instance.ngDoBootstrap(e);else throw new lA(-403,!1);A.push(t)}function C6e(t,A,e){try{let i=e();return v1(i)?i.catch(n=>{throw A.runOutsideAngular(()=>t.handleError(n)),n}):i}catch(i){throw A.runOutsideAngular(()=>t.handleError(i)),i}}var j8=null;function I6e(t=[],A){return Dt.create({name:A,providers:[{provide:Dw,useValue:"platform"},{provide:B_,useValue:new Set([()=>j8=null])},...t]})}function u6e(t=[]){if(j8)return j8;let A=I6e(t);return j8=A,Ipe(),h6e(A),A}function h6e(t){let A=t.get(X_,null);Xr(t,()=>{A?.forEach(e=>e())})}var ut=(()=>{class t{static __NG_ELEMENT_ID__=B6e}return t})();function B6e(t){return E6e(Xs(),Ai(),(t&16)===16)}function E6e(t,A,e){if(CB(t)&&!e){let i=N0(t.index,A);return new g4(i,i)}else if(t.type&175){let i=A[Ec];return new g4(i,A)}return null}var E_=class{constructor(){}supports(A){return oW(A)}create(A){return new f_(A)}},f6e=(t,A)=>A,f_=class{length=0;collection;_linkedRecords=null;_unlinkedRecords=null;_previousItHead=null;_itHead=null;_itTail=null;_additionsHead=null;_additionsTail=null;_movesHead=null;_movesTail=null;_removalsHead=null;_removalsTail=null;_identityChangesHead=null;_identityChangesTail=null;_trackByFn;constructor(A){this._trackByFn=A||f6e}forEachItem(A){let e;for(e=this._itHead;e!==null;e=e._next)A(e)}forEachOperation(A){let e=this._itHead,i=this._removalsHead,n=0,o=null;for(;e||i;){let r=!i||e&&e.currentIndex{r=this._trackByFn(n,s),e===null||!Object.is(e.trackById,r)?(e=this._mismatch(e,s,r,n),i=!0):(i&&(e=this._verifyReinsertion(e,s,r,n)),Object.is(e.item,s)||this._addIdentityChange(e,s)),e=e._next,n++}),this.length=n;return this._truncate(e),this.collection=A,this.isDirty}get isDirty(){return this._additionsHead!==null||this._movesHead!==null||this._removalsHead!==null||this._identityChangesHead!==null}_reset(){if(this.isDirty){let A;for(A=this._previousItHead=this._itHead;A!==null;A=A._next)A._nextPrevious=A._next;for(A=this._additionsHead;A!==null;A=A._nextAdded)A.previousIndex=A.currentIndex;for(this._additionsHead=this._additionsTail=null,A=this._movesHead;A!==null;A=A._nextMoved)A.previousIndex=A.currentIndex;this._movesHead=this._movesTail=null,this._removalsHead=this._removalsTail=null,this._identityChangesHead=this._identityChangesTail=null}}_mismatch(A,e,i,n){let o;return A===null?o=this._itTail:(o=A._prev,this._remove(A)),A=this._unlinkedRecords===null?null:this._unlinkedRecords.get(i,null),A!==null?(Object.is(A.item,e)||this._addIdentityChange(A,e),this._reinsertAfter(A,o,n)):(A=this._linkedRecords===null?null:this._linkedRecords.get(i,n),A!==null?(Object.is(A.item,e)||this._addIdentityChange(A,e),this._moveAfter(A,o,n)):A=this._addAfter(new Q_(e,i),o,n)),A}_verifyReinsertion(A,e,i,n){let o=this._unlinkedRecords===null?null:this._unlinkedRecords.get(i,null);return o!==null?A=this._reinsertAfter(o,A._prev,n):A.currentIndex!=n&&(A.currentIndex=n,this._addToMoves(A,n)),A}_truncate(A){for(;A!==null;){let e=A._next;this._addToRemovals(this._unlink(A)),A=e}this._unlinkedRecords!==null&&this._unlinkedRecords.clear(),this._additionsTail!==null&&(this._additionsTail._nextAdded=null),this._movesTail!==null&&(this._movesTail._nextMoved=null),this._itTail!==null&&(this._itTail._next=null),this._removalsTail!==null&&(this._removalsTail._nextRemoved=null),this._identityChangesTail!==null&&(this._identityChangesTail._nextIdentityChange=null)}_reinsertAfter(A,e,i){this._unlinkedRecords!==null&&this._unlinkedRecords.remove(A);let n=A._prevRemoved,o=A._nextRemoved;return n===null?this._removalsHead=o:n._nextRemoved=o,o===null?this._removalsTail=n:o._prevRemoved=n,this._insertAfter(A,e,i),this._addToMoves(A,i),A}_moveAfter(A,e,i){return this._unlink(A),this._insertAfter(A,e,i),this._addToMoves(A,i),A}_addAfter(A,e,i){return this._insertAfter(A,e,i),this._additionsTail===null?this._additionsTail=this._additionsHead=A:this._additionsTail=this._additionsTail._nextAdded=A,A}_insertAfter(A,e,i){let n=e===null?this._itHead:e._next;return A._next=n,A._prev=e,n===null?this._itTail=A:n._prev=A,e===null?this._itHead=A:e._next=A,this._linkedRecords===null&&(this._linkedRecords=new Qw),this._linkedRecords.put(A),A.currentIndex=i,A}_remove(A){return this._addToRemovals(this._unlink(A))}_unlink(A){this._linkedRecords!==null&&this._linkedRecords.remove(A);let e=A._prev,i=A._next;return e===null?this._itHead=i:e._next=i,i===null?this._itTail=e:i._prev=e,A}_addToMoves(A,e){return A.previousIndex===e||(this._movesTail===null?this._movesTail=this._movesHead=A:this._movesTail=this._movesTail._nextMoved=A),A}_addToRemovals(A){return this._unlinkedRecords===null&&(this._unlinkedRecords=new Qw),this._unlinkedRecords.put(A),A.currentIndex=null,A._nextRemoved=null,this._removalsTail===null?(this._removalsTail=this._removalsHead=A,A._prevRemoved=null):(A._prevRemoved=this._removalsTail,this._removalsTail=this._removalsTail._nextRemoved=A),A}_addIdentityChange(A,e){return A.item=e,this._identityChangesTail===null?this._identityChangesTail=this._identityChangesHead=A:this._identityChangesTail=this._identityChangesTail._nextIdentityChange=A,A}},Q_=class{item;trackById;currentIndex=null;previousIndex=null;_nextPrevious=null;_prev=null;_next=null;_prevDup=null;_nextDup=null;_prevRemoved=null;_nextRemoved=null;_nextAdded=null;_nextMoved=null;_nextIdentityChange=null;constructor(A,e){this.item=A,this.trackById=e}},m_=class{_head=null;_tail=null;add(A){this._head===null?(this._head=this._tail=A,A._nextDup=null,A._prevDup=null):(this._tail._nextDup=A,A._prevDup=this._tail,A._nextDup=null,this._tail=A)}get(A,e){let i;for(i=this._head;i!==null;i=i._nextDup)if((e===null||e<=i.currentIndex)&&Object.is(i.trackById,A))return i;return null}remove(A){let e=A._prevDup,i=A._nextDup;return e===null?this._head=i:e._nextDup=i,i===null?this._tail=e:i._prevDup=e,this._head===null}},Qw=class{map=new Map;put(A){let e=A.trackById,i=this.map.get(e);i||(i=new m_,this.map.set(e,i)),i.add(A)}get(A,e){let i=A,n=this.map.get(i);return n?n.get(A,e):null}remove(A){let e=A.trackById;return this.map.get(e).remove(A)&&this.map.delete(e),A}get isEmpty(){return this.map.size===0}clear(){this.map.clear()}};function kj(t,A,e){let i=t.previousIndex;if(i===null)return i;let n=0;return e&&i{if(e&&e.key===n)this._maybeAddToChanges(e,i),this._appendAfter=e,e=e._next;else{let o=this._getOrCreateRecordForKey(n,i);e=this._insertBeforeOrAppend(e,o)}}),e){e._prev&&(e._prev._next=null),this._removalsHead=e;for(let i=e;i!==null;i=i._nextRemoved)i===this._mapHead&&(this._mapHead=null),this._records.delete(i.key),i._nextRemoved=i._next,i.previousValue=i.currentValue,i.currentValue=null,i._prev=null,i._next=null}return this._changesTail&&(this._changesTail._nextChanged=null),this._additionsTail&&(this._additionsTail._nextAdded=null),this.isDirty}_insertBeforeOrAppend(A,e){if(A){let i=A._prev;return e._next=A,e._prev=i,A._prev=e,i&&(i._next=e),A===this._mapHead&&(this._mapHead=e),this._appendAfter=A,A}return this._appendAfter?(this._appendAfter._next=e,e._prev=this._appendAfter):this._mapHead=e,this._appendAfter=e,null}_getOrCreateRecordForKey(A,e){if(this._records.has(A)){let n=this._records.get(A);this._maybeAddToChanges(n,e);let o=n._prev,r=n._next;return o&&(o._next=r),r&&(r._prev=o),n._next=null,n._prev=null,n}let i=new y_(A);return this._records.set(A,i),i.currentValue=e,this._addToAdditions(i),i}_reset(){if(this.isDirty){let A;for(this._previousMapHead=this._mapHead,A=this._previousMapHead;A!==null;A=A._next)A._nextPrevious=A._next;for(A=this._changesHead;A!==null;A=A._nextChanged)A.previousValue=A.currentValue;for(A=this._additionsHead;A!=null;A=A._nextAdded)A.previousValue=A.currentValue;this._changesHead=this._changesTail=null,this._additionsHead=this._additionsTail=null,this._removalsHead=null}}_maybeAddToChanges(A,e){Object.is(e,A.currentValue)||(A.previousValue=A.currentValue,A.currentValue=e,this._addToChanges(A))}_addToAdditions(A){this._additionsHead===null?this._additionsHead=this._additionsTail=A:(this._additionsTail._nextAdded=A,this._additionsTail=A)}_addToChanges(A){this._changesHead===null?this._changesHead=this._changesTail=A:(this._changesTail._nextChanged=A,this._changesTail=A)}_forEach(A,e){A instanceof Map?A.forEach(e):Object.keys(A).forEach(i=>e(A[i],i))}},y_=class{key;previousValue=null;currentValue=null;_nextPrevious=null;_next=null;_prev=null;_nextAdded=null;_nextRemoved=null;_nextChanged=null;constructor(A){this.key=A}};function xj(){return new Y0([new E_])}var Y0=(()=>{class t{factories;static \u0275prov=be({token:t,providedIn:"root",factory:xj});constructor(e){this.factories=e}static create(e,i){if(i!=null){let n=i.factories.slice();e=e.concat(n)}return new t(e)}static extend(e){return{provide:t,useFactory:i=>t.create(e,i||xj()),deps:[[t,new yw,new gB]]}}find(e){let i=this.factories.find(n=>n.supports(e));if(i!=null)return i;throw new lA(901,!1)}}return t})();function _j(){return new Vw([new p_])}var Vw=(()=>{class t{static \u0275prov=be({token:t,providedIn:"root",factory:_j});factories;constructor(e){this.factories=e}static create(e,i){if(i){let n=i.factories.slice();e=e.concat(n)}return new t(e)}static extend(e){return{provide:t,useFactory:i=>t.create(e,i||_j()),deps:[[t,new yw,new gB]]}}find(e){let i=this.factories.find(n=>n.supports(e));if(i)return i;throw new lA(901,!1)}}return t})();var _W=(()=>{class t{constructor(e){}static \u0275fac=function(i){return new(i||t)(UA(fc))};static \u0275mod=OA({type:t});static \u0275inj=TA({})}return t})();function RW(t){let{rootComponent:A,appProviders:e,platformProviders:i,platformRef:n}=t;_o(8);try{let o=n?.injector??u6e(i),r=[o6e({}),{provide:UI,useExisting:a6e},...e||[]],s=new Iw({providers:r,parent:o,debugName:"",runEnvironmentInitializers:!1});return g6e({r3Injector:s.injector,platformInjector:o,rootComponent:A})}catch(o){return Promise.reject(o)}finally{_o(9)}}function IA(t){return typeof t=="boolean"?t:t!=null&&t!=="false"}function ln(t,A=NaN){return!isNaN(parseFloat(t))&&!isNaN(Number(t))?Number(t):A}function As(t){return Fk(t)}function ot(t,A){return C8(t,A?.equal)}var D_=class{[Cc];constructor(A){this[Cc]=A}destroy(){this[Cc].destroy()}};function pa(t,A){!A?.injector&&e2(pa);let e=A?.injector??E(Dt),i=A?.manualCleanup!==!0?e.get(Fr):null,n,o=e.get(eR,null,{optional:!0}),r=e.get(UI);return o!==null&&!A?.forceRoot?(n=p6e(o.view,r,t),i instanceof sw&&i._lView===o.view&&(i=null)):n=w6e(t,e.get(sW),r),n.injector=e,i!==null&&(n.onDestroyFn=i.onDestroy(()=>n.destroy())),new D_(n)}var NW=_A(ae({},Rh),{consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,dirty:!0,hasRun:!1,cleanupFns:void 0,zone:null,kind:"effect",onDestroyFn:a4,run(){if(this.dirty=!1,this.hasRun&&!l8(this))return;this.hasRun=!0;let t=i=>(this.cleanupFns??=[]).push(i),A=zQ(this),e=tw(!1);try{this.maybeCleanup(),this.fn(t)}finally{tw(e),c8(this,A)}},maybeCleanup(){if(this.cleanupFns?.length)try{for(;this.cleanupFns.length;)this.cleanupFns.pop()()}finally{this.cleanupFns=[]}}}),Q6e=_A(ae({},NW),{consumerMarkedDirty(){this.scheduler.schedule(this),this.notifier.notify(12)},destroy(){PQ(this),this.onDestroyFn(),this.maybeCleanup(),this.scheduler.remove(this)}}),m6e=_A(ae({},NW),{consumerMarkedDirty(){this.view[fi]|=8192,uB(this.view),this.notifier.notify(13)},destroy(){PQ(this),this.onDestroyFn(),this.maybeCleanup(),this.view[NI]?.delete(this)}});function p6e(t,A,e){let i=Object.create(m6e);return i.view=t,i.zone=typeof Zone<"u"?Zone.current:null,i.notifier=A,i.fn=e,t[NI]??=new Set,t[NI].add(i),i.consumerMarkedDirty(i),i}function w6e(t,A,e){let i=Object.create(Q6e);return i.fn=t,i.scheduler=A,i.notifier=e,i.zone=typeof Zone<"u"?Zone.current:null,i.scheduler.schedule(i),i.notifier.notify(12),i}function qw(t,A){let e=Q1(t),i=A.elementInjector||vw();return new TI(e).create(i,A.projectableNodes,A.hostElement,A.environmentInjector)}function LW(t){let A=Q1(t);if(!A)return null;let e=new TI(A);return{get selector(){return e.selector},get type(){return e.componentType},get inputs(){return e.inputs},get outputs(){return e.outputs},get ngContentSelectors(){return e.ngContentSelectors},get isStandalone(){return A.standalone},get isSignal(){return A.signals}}}var ht=new re("");var KW=null;function il(){return KW}function LR(t){KW??=t}var M4=class{},S4=(()=>{class t{historyGo(e){throw new Error("")}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:()=>E(UW),providedIn:"platform"})}return t})(),FR=new re(""),UW=(()=>{class t extends S4{_location;_history;_doc=E(ht);constructor(){super(),this._location=window.location,this._history=window.history}getBaseHrefFromDOM(){return il().getBaseHref(this._doc)}onPopState(e){let i=il().getGlobalEventTarget(this._doc,"window");return i.addEventListener("popstate",e,!1),()=>i.removeEventListener("popstate",e)}onHashChange(e){let i=il().getGlobalEventTarget(this._doc,"window");return i.addEventListener("hashchange",e,!1),()=>i.removeEventListener("hashchange",e)}get href(){return this._location.href}get protocol(){return this._location.protocol}get hostname(){return this._location.hostname}get port(){return this._location.port}get pathname(){return this._location.pathname}get search(){return this._location.search}get hash(){return this._location.hash}set pathname(e){this._location.pathname=e}pushState(e,i,n){this._history.pushState(e,i,n)}replaceState(e,i,n){this._history.replaceState(e,i,n)}forward(){this._history.forward()}back(){this._history.back()}historyGo(e=0){this._history.go(e)}getState(){return this._history.state}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:()=>new t,providedIn:"platform"})}return t})();function Ww(t,A){return t?A?t.endsWith("/")?A.startsWith("/")?t+A.slice(1):t+A:A.startsWith("/")?t+A:`${t}/${A}`:t:A}function FW(t){let A=t.search(/#|\?|$/);return t[A-1]==="/"?t.slice(0,A-1)+t.slice(A):t}function vg(t){return t&&t[0]!=="?"?`?${t}`:t}var c2=(()=>{class t{historyGo(e){throw new Error("")}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:()=>E(Xw),providedIn:"root"})}return t})(),Zw=new re(""),Xw=(()=>{class t extends c2{_platformLocation;_baseHref;_removeListenerFns=[];constructor(e,i){super(),this._platformLocation=e,this._baseHref=i??this._platformLocation.getBaseHrefFromDOM()??E(ht).location?.origin??""}ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}onPopState(e){this._removeListenerFns.push(this._platformLocation.onPopState(e),this._platformLocation.onHashChange(e))}getBaseHref(){return this._baseHref}prepareExternalUrl(e){return Ww(this._baseHref,e)}path(e=!1){let i=this._platformLocation.pathname+vg(this._platformLocation.search),n=this._platformLocation.hash;return n&&e?`${i}${n}`:i}pushState(e,i,n,o){let r=this.prepareExternalUrl(n+vg(o));this._platformLocation.pushState(e,i,r)}replaceState(e,i,n,o){let r=this.prepareExternalUrl(n+vg(o));this._platformLocation.replaceState(e,i,r)}forward(){this._platformLocation.forward()}back(){this._platformLocation.back()}getState(){return this._platformLocation.getState()}historyGo(e=0){this._platformLocation.historyGo?.(e)}static \u0275fac=function(i){return new(i||t)(UA(S4),UA(Zw,8))};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),Fl=(()=>{class t{_subject=new je;_basePath;_locationStrategy;_urlChangeListeners=[];_urlChangeSubscription=null;constructor(e){this._locationStrategy=e;let i=this._locationStrategy.getBaseHref();this._basePath=v6e(FW(GW(i))),this._locationStrategy.onPopState(n=>{this._subject.next({url:this.path(!0),pop:!0,state:n.state,type:n.type})})}ngOnDestroy(){this._urlChangeSubscription?.unsubscribe(),this._urlChangeListeners=[]}path(e=!1){return this.normalize(this._locationStrategy.path(e))}getState(){return this._locationStrategy.getState()}isCurrentPathEqualTo(e,i=""){return this.path()==this.normalize(e+vg(i))}normalize(e){return t.stripTrailingSlash(D6e(this._basePath,GW(e)))}prepareExternalUrl(e){return e&&e[0]!=="/"&&(e="/"+e),this._locationStrategy.prepareExternalUrl(e)}go(e,i="",n=null){this._locationStrategy.pushState(n,"",e,i),this._notifyUrlChangeListeners(this.prepareExternalUrl(e+vg(i)),n)}replaceState(e,i="",n=null){this._locationStrategy.replaceState(n,"",e,i),this._notifyUrlChangeListeners(this.prepareExternalUrl(e+vg(i)),n)}forward(){this._locationStrategy.forward()}back(){this._locationStrategy.back()}historyGo(e=0){this._locationStrategy.historyGo?.(e)}onUrlChange(e){return this._urlChangeListeners.push(e),this._urlChangeSubscription??=this.subscribe(i=>{this._notifyUrlChangeListeners(i.url,i.state)}),()=>{let i=this._urlChangeListeners.indexOf(e);this._urlChangeListeners.splice(i,1),this._urlChangeListeners.length===0&&(this._urlChangeSubscription?.unsubscribe(),this._urlChangeSubscription=null)}}_notifyUrlChangeListeners(e="",i){this._urlChangeListeners.forEach(n=>n(e,i))}subscribe(e,i,n){return this._subject.subscribe({next:e,error:i??void 0,complete:n??void 0})}static normalizeQueryParams=vg;static joinWithSlash=Ww;static stripTrailingSlash=FW;static \u0275fac=function(i){return new(i||t)(UA(c2))};static \u0275prov=be({token:t,factory:()=>y6e(),providedIn:"root"})}return t})();function y6e(){return new Fl(UA(c2))}function D6e(t,A){if(!t||!A.startsWith(t))return A;let e=A.substring(t.length);return e===""||["/",";","?","#"].includes(e[0])?e:A}function GW(t){return t.replace(/\/index.html$/,"")}function v6e(t){if(new RegExp("^(https?:)?//").test(t)){let[,e]=t.split(/\/\/[^\/]+/);return e}return t}var TR=(()=>{class t extends c2{_platformLocation;_baseHref="";_removeListenerFns=[];constructor(e,i){super(),this._platformLocation=e,i!=null&&(this._baseHref=i)}ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}onPopState(e){this._removeListenerFns.push(this._platformLocation.onPopState(e),this._platformLocation.onHashChange(e))}getBaseHref(){return this._baseHref}path(e=!1){let i=this._platformLocation.hash??"#";return i.length>0?i.substring(1):i}prepareExternalUrl(e){let i=Ww(this._baseHref,e);return i.length>0?"#"+i:i}pushState(e,i,n,o){let r=this.prepareExternalUrl(n+vg(o))||this._platformLocation.pathname;this._platformLocation.pushState(e,i,r)}replaceState(e,i,n,o){let r=this.prepareExternalUrl(n+vg(o))||this._platformLocation.pathname;this._platformLocation.replaceState(e,i,r)}forward(){this._platformLocation.forward()}back(){this._platformLocation.back()}getState(){return this._platformLocation.getState()}historyGo(e=0){this._platformLocation.historyGo?.(e)}static \u0275fac=function(i){return new(i||t)(UA(S4),UA(Zw,8))};static \u0275prov=be({token:t,factory:t.\u0275fac})}return t})();var GR=/\s+/,TW=[],ta=(()=>{class t{_ngEl;_renderer;initialClasses=TW;rawClass;stateMap=new Map;constructor(e,i){this._ngEl=e,this._renderer=i}set klass(e){this.initialClasses=e!=null?e.trim().split(GR):TW}set ngClass(e){this.rawClass=typeof e=="string"?e.trim().split(GR):e}ngDoCheck(){for(let i of this.initialClasses)this._updateState(i,!0);let e=this.rawClass;if(Array.isArray(e)||e instanceof Set)for(let i of e)this._updateState(i,!0);else if(e!=null)for(let i of Object.keys(e))this._updateState(i,!!e[i]);this._applyStateDiff()}_updateState(e,i){let n=this.stateMap.get(e);n!==void 0?(n.enabled!==i&&(n.changed=!0,n.enabled=i),n.touched=!0):this.stateMap.set(e,{enabled:i,changed:!0,touched:!0})}_applyStateDiff(){for(let e of this.stateMap){let i=e[0],n=e[1];n.changed?(this._toggleClass(i,n.enabled),n.changed=!1):n.touched||(n.enabled&&this._toggleClass(i,!1),this.stateMap.delete(i)),n.touched=!1}}_toggleClass(e,i){e=e.trim(),e.length>0&&e.split(GR).forEach(n=>{i?this._renderer.addClass(this._ngEl.nativeElement,n):this._renderer.removeClass(this._ngEl.nativeElement,n)})}static \u0275fac=function(i){return new(i||t)(DA(eA),DA(an))};static \u0275dir=Oe({type:t,selectors:[["","ngClass",""]],inputs:{klass:[0,"class","klass"],ngClass:"ngClass"}})}return t})(),YI=(()=>{class t{_viewContainerRef;ngComponentOutlet=null;ngComponentOutletInputs;ngComponentOutletInjector;ngComponentOutletContent;ngComponentOutletNgModule;ngComponentOutletNgModuleFactory;_componentRef;_moduleRef;_inputsUsed=new Map;get componentInstance(){return this._componentRef?.instance??null}constructor(e){this._viewContainerRef=e}_needToReCreateNgModuleInstance(e){return e.ngComponentOutletNgModule!==void 0||e.ngComponentOutletNgModuleFactory!==void 0}_needToReCreateComponentInstance(e){return e.ngComponentOutlet!==void 0||e.ngComponentOutletContent!==void 0||e.ngComponentOutletInjector!==void 0||this._needToReCreateNgModuleInstance(e)}ngOnChanges(e){if(this._needToReCreateComponentInstance(e)&&(this._viewContainerRef.clear(),this._inputsUsed.clear(),this._componentRef=void 0,this.ngComponentOutlet)){let i=this.ngComponentOutletInjector||this._viewContainerRef.parentInjector;this._needToReCreateNgModuleInstance(e)&&(this._moduleRef?.destroy(),this.ngComponentOutletNgModule?this._moduleRef=AW(this.ngComponentOutletNgModule,OW(i)):this.ngComponentOutletNgModuleFactory?this._moduleRef=this.ngComponentOutletNgModuleFactory.create(OW(i)):this._moduleRef=void 0),this._componentRef=this._viewContainerRef.createComponent(this.ngComponentOutlet,{injector:i,ngModuleRef:this._moduleRef,projectableNodes:this.ngComponentOutletContent})}}ngDoCheck(){if(this._componentRef){if(this.ngComponentOutletInputs)for(let e of Object.keys(this.ngComponentOutletInputs))this._inputsUsed.set(e,!0);this._applyInputStateDiff(this._componentRef)}}ngOnDestroy(){this._moduleRef?.destroy()}_applyInputStateDiff(e){for(let[i,n]of this._inputsUsed)n?(e.setInput(i,this.ngComponentOutletInputs[i]),this._inputsUsed.set(i,!1)):(e.setInput(i,void 0),this._inputsUsed.delete(i))}static \u0275fac=function(i){return new(i||t)(DA(xn))};static \u0275dir=Oe({type:t,selectors:[["","ngComponentOutlet",""]],inputs:{ngComponentOutlet:"ngComponentOutlet",ngComponentOutletInputs:"ngComponentOutletInputs",ngComponentOutletInjector:"ngComponentOutletInjector",ngComponentOutletContent:"ngComponentOutletContent",ngComponentOutletNgModule:"ngComponentOutletNgModule",ngComponentOutletNgModuleFactory:"ngComponentOutletNgModuleFactory"},exportAs:["ngComponentOutlet"],features:[ti]})}return t})();function OW(t){return t.get(G0).injector}var $w=class{$implicit;ngForOf;index;count;constructor(A,e,i,n){this.$implicit=A,this.ngForOf=e,this.index=i,this.count=n}get first(){return this.index===0}get last(){return this.index===this.count-1}get even(){return this.index%2===0}get odd(){return!this.even}},k1=(()=>{class t{_viewContainer;_template;_differs;set ngForOf(e){this._ngForOf=e,this._ngForOfDirty=!0}set ngForTrackBy(e){this._trackByFn=e}get ngForTrackBy(){return this._trackByFn}_ngForOf=null;_ngForOfDirty=!0;_differ=null;_trackByFn;constructor(e,i,n){this._viewContainer=e,this._template=i,this._differs=n}set ngForTemplate(e){e&&(this._template=e)}ngDoCheck(){if(this._ngForOfDirty){this._ngForOfDirty=!1;let e=this._ngForOf;!this._differ&&e&&(this._differ=this._differs.find(e).create(this.ngForTrackBy))}if(this._differ){let e=this._differ.diff(this._ngForOf);e&&this._applyChanges(e)}}_applyChanges(e){let i=this._viewContainer;e.forEachOperation((n,o,r)=>{if(n.previousIndex==null)i.createEmbeddedView(this._template,new $w(n.item,this._ngForOf,-1,-1),r===null?void 0:r);else if(r==null)i.remove(o===null?void 0:o);else if(o!==null){let s=i.get(o);i.move(s,r),JW(s,n)}});for(let n=0,o=i.length;n{let o=i.get(n.currentIndex);JW(o,n)})}static ngTemplateContextGuard(e,i){return!0}static \u0275fac=function(i){return new(i||t)(DA(xn),DA(en),DA(Y0))};static \u0275dir=Oe({type:t,selectors:[["","ngFor","","ngForOf",""]],inputs:{ngForOf:"ngForOf",ngForTrackBy:"ngForTrackBy",ngForTemplate:"ngForTemplate"}})}return t})();function JW(t,A){t.context.$implicit=A.item}var bg=(()=>{class t{_viewContainer;_context=new e5;_thenTemplateRef=null;_elseTemplateRef=null;_thenViewRef=null;_elseViewRef=null;constructor(e,i){this._viewContainer=e,this._thenTemplateRef=i}set ngIf(e){this._context.$implicit=this._context.ngIf=e,this._updateView()}set ngIfThen(e){YW(e,!1),this._thenTemplateRef=e,this._thenViewRef=null,this._updateView()}set ngIfElse(e){YW(e,!1),this._elseTemplateRef=e,this._elseViewRef=null,this._updateView()}_updateView(){this._context.$implicit?this._thenViewRef||(this._viewContainer.clear(),this._elseViewRef=null,this._thenTemplateRef&&(this._thenViewRef=this._viewContainer.createEmbeddedView(this._thenTemplateRef,this._context))):this._elseViewRef||(this._viewContainer.clear(),this._thenViewRef=null,this._elseTemplateRef&&(this._elseViewRef=this._viewContainer.createEmbeddedView(this._elseTemplateRef,this._context)))}static ngIfUseIfTypeGuard;static ngTemplateGuard_ngIf;static ngTemplateContextGuard(e,i){return!0}static \u0275fac=function(i){return new(i||t)(DA(xn),DA(en))};static \u0275dir=Oe({type:t,selectors:[["","ngIf",""]],inputs:{ngIf:"ngIf",ngIfThen:"ngIfThen",ngIfElse:"ngIfElse"}})}return t})(),e5=class{$implicit=null;ngIf=null};function YW(t,A){if(t&&!t.createEmbeddedView)throw new lA(2020,!1)}var OR=(()=>{class t{_ngEl;_differs;_renderer;_ngStyle=null;_differ=null;constructor(e,i,n){this._ngEl=e,this._differs=i,this._renderer=n}set ngStyle(e){this._ngStyle=e,!this._differ&&e&&(this._differ=this._differs.find(e).create())}ngDoCheck(){if(this._differ){let e=this._differ.diff(this._ngStyle);e&&this._applyChanges(e)}}_setStyle(e,i){let[n,o]=e.split("."),r=n.indexOf("-")===-1?void 0:F0.DashCase;i!=null?this._renderer.setStyle(this._ngEl.nativeElement,n,o?`${i}${o}`:i,r):this._renderer.removeStyle(this._ngEl.nativeElement,n,r)}_applyChanges(e){e.forEachRemovedItem(i=>this._setStyle(i.key,null)),e.forEachAddedItem(i=>this._setStyle(i.key,i.currentValue)),e.forEachChangedItem(i=>this._setStyle(i.key,i.currentValue))}static \u0275fac=function(i){return new(i||t)(DA(eA),DA(Vw),DA(an))};static \u0275dir=Oe({type:t,selectors:[["","ngStyle",""]],inputs:{ngStyle:"ngStyle"}})}return t})(),nl=(()=>{class t{_viewContainerRef;_viewRef=null;ngTemplateOutletContext=null;ngTemplateOutlet=null;ngTemplateOutletInjector=null;constructor(e){this._viewContainerRef=e}ngOnChanges(e){if(this._shouldRecreateView(e)){let i=this._viewContainerRef;if(this._viewRef&&i.remove(i.indexOf(this._viewRef)),!this.ngTemplateOutlet){this._viewRef=null;return}let n=this._createContextForwardProxy();this._viewRef=i.createEmbeddedView(this.ngTemplateOutlet,n,{injector:this.ngTemplateOutletInjector??void 0})}}_shouldRecreateView(e){return!!e.ngTemplateOutlet||!!e.ngTemplateOutletInjector}_createContextForwardProxy(){return new Proxy({},{set:(e,i,n)=>this.ngTemplateOutletContext?Reflect.set(this.ngTemplateOutletContext,i,n):!1,get:(e,i,n)=>{if(this.ngTemplateOutletContext)return Reflect.get(this.ngTemplateOutletContext,i,n)}})}static \u0275fac=function(i){return new(i||t)(DA(xn))};static \u0275dir=Oe({type:t,selectors:[["","ngTemplateOutlet",""]],inputs:{ngTemplateOutletContext:"ngTemplateOutletContext",ngTemplateOutlet:"ngTemplateOutlet",ngTemplateOutletInjector:"ngTemplateOutletInjector"},features:[ti]})}return t})();function b6e(t,A){return new lA(2100,!1)}var KR=class{createSubscription(A,e){return As(()=>A.subscribe({next:e,error:i=>{throw i}}))}dispose(A){As(()=>A.unsubscribe())}},UR=class{createSubscription(A,e){return A.then(i=>e?.(i),i=>{throw i}),{unsubscribe:()=>{e=null}}}dispose(A){A.unsubscribe()}},M6e=new UR,S6e=new KR,ts=(()=>{class t{_ref;_latestValue=null;markForCheckOnValueUpdate=!0;_subscription=null;_obj=null;_strategy=null;constructor(e){this._ref=e}ngOnDestroy(){this._subscription&&this._dispose(),this._ref=null}transform(e){if(!this._obj){if(e)try{this.markForCheckOnValueUpdate=!1,this._subscribe(e)}finally{this.markForCheckOnValueUpdate=!0}return this._latestValue}return e!==this._obj?(this._dispose(),this.transform(e)):this._latestValue}_subscribe(e){this._obj=e,this._strategy=this._selectStrategy(e),this._subscription=this._strategy.createSubscription(e,i=>this._updateLatestValue(e,i))}_selectStrategy(e){if(v1(e))return M6e;if(vR(e))return S6e;throw b6e(t,e)}_dispose(){this._strategy.dispose(this._subscription),this._latestValue=null,this._subscription=null,this._obj=null}_updateLatestValue(e,i){e===this._obj&&(this._latestValue=i,this.markForCheckOnValueUpdate&&this._ref?.markForCheck())}static \u0275fac=function(i){return new(i||t)(DA(ut,16))};static \u0275pipe=pB({name:"async",type:t,pure:!1})}return t})();function k6e(t,A){return{key:t,value:A}}var HI=(()=>{class t{differs;constructor(e){this.differs=e}differ;keyValues=[];compareFn=HW;transform(e,i=HW){if(!e||!(e instanceof Map)&&typeof e!="object")return null;this.differ??=this.differs.find(e).create();let n=this.differ.diff(e),o=i!==this.compareFn;return n&&(this.keyValues=[],n.forEachItem(r=>{this.keyValues.push(k6e(r.key,r.currentValue))})),(n||o)&&(i&&this.keyValues.sort(i),this.compareFn=i),this.keyValues}static \u0275fac=function(i){return new(i||t)(DA(Vw,16))};static \u0275pipe=pB({name:"keyvalue",type:t,pure:!1})}return t})();function HW(t,A){let e=t.key,i=A.key;if(e===i)return 0;if(e==null)return 1;if(i==null)return-1;if(typeof e=="string"&&typeof i=="string")return e{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({})}return t})();function k4(t,A){A=encodeURIComponent(A);for(let e of t.split(";")){let i=e.indexOf("="),[n,o]=i==-1?[e,""]:[e.slice(0,i),e.slice(i+1)];if(n.trim()===A)return decodeURIComponent(o)}return null}var A5="browser",zW="server";function H0(t){return t===A5}function t5(t){return t===zW}var zI=class{};var PW=(()=>{class t{static \u0275prov=be({token:t,providedIn:"root",factory:()=>new JR(E(ht),window)})}return t})(),JR=class{document;window;offset=()=>[0,0];constructor(A,e){this.document=A,this.window=e}setOffset(A){Array.isArray(A)?this.offset=()=>A:this.offset=A}getScrollPosition(){return[this.window.scrollX,this.window.scrollY]}scrollToPosition(A){this.window.scrollTo(A[0],A[1])}scrollToAnchor(A){let e=x6e(this.document,A);e&&(this.scrollToElement(e),e.focus())}setHistoryScrollRestoration(A){this.window.history.scrollRestoration=A}scrollToElement(A){let e=A.getBoundingClientRect(),i=e.left+this.window.pageXOffset,n=e.top+this.window.pageYOffset,o=this.offset();this.window.scrollTo(i-o[0],n-o[1])}};function x6e(t,A){let e=t.getElementById(A)||t.getElementsByName(A)[0];if(e)return e;if(typeof t.createTreeWalker=="function"&&t.body&&typeof t.body.attachShadow=="function"){let i=t.createTreeWalker(t.body,NodeFilter.SHOW_ELEMENT),n=i.currentNode;for(;n;){let o=n.shadowRoot;if(o){let r=o.getElementById(A)||o.querySelector(`[name="${A}"]`);if(r)return r}n=i.nextNode()}}return null}var DB=class{},x4=class{},_1=class t{headers;normalizedNames=new Map;lazyInit;lazyUpdate=null;constructor(A){A?typeof A=="string"?this.lazyInit=()=>{this.headers=new Map,A.split(` +`).forEach(e=>{let i=e.indexOf(":");if(i>0){let n=e.slice(0,i),o=e.slice(i+1).trim();this.addHeaderEntry(n,o)}})}:typeof Headers<"u"&&A instanceof Headers?(this.headers=new Map,A.forEach((e,i)=>{this.addHeaderEntry(i,e)})):this.lazyInit=()=>{this.headers=new Map,Object.entries(A).forEach(([e,i])=>{this.setHeaderEntries(e,i)})}:this.headers=new Map}has(A){return this.init(),this.headers.has(A.toLowerCase())}get(A){this.init();let e=this.headers.get(A.toLowerCase());return e&&e.length>0?e[0]:null}keys(){return this.init(),Array.from(this.normalizedNames.values())}getAll(A){return this.init(),this.headers.get(A.toLowerCase())||null}append(A,e){return this.clone({name:A,value:e,op:"a"})}set(A,e){return this.clone({name:A,value:e,op:"s"})}delete(A,e){return this.clone({name:A,value:e,op:"d"})}maybeSetNormalizedName(A,e){this.normalizedNames.has(e)||this.normalizedNames.set(e,A)}init(){this.lazyInit&&(this.lazyInit instanceof t?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(A=>this.applyUpdate(A)),this.lazyUpdate=null))}copyFrom(A){A.init(),Array.from(A.headers.keys()).forEach(e=>{this.headers.set(e,A.headers.get(e)),this.normalizedNames.set(e,A.normalizedNames.get(e))})}clone(A){let e=new t;return e.lazyInit=this.lazyInit&&this.lazyInit instanceof t?this.lazyInit:this,e.lazyUpdate=(this.lazyUpdate||[]).concat([A]),e}applyUpdate(A){let e=A.name.toLowerCase();switch(A.op){case"a":case"s":let i=A.value;if(typeof i=="string"&&(i=[i]),i.length===0)return;this.maybeSetNormalizedName(A.name,e);let n=(A.op==="a"?this.headers.get(e):void 0)||[];n.push(...i),this.headers.set(e,n);break;case"d":let o=A.value;if(!o)this.headers.delete(e),this.normalizedNames.delete(e);else{let r=this.headers.get(e);if(!r)return;r=r.filter(s=>o.indexOf(s)===-1),r.length===0?(this.headers.delete(e),this.normalizedNames.delete(e)):this.headers.set(e,r)}break}}addHeaderEntry(A,e){let i=A.toLowerCase();this.maybeSetNormalizedName(A,i),this.headers.has(i)?this.headers.get(i).push(e):this.headers.set(i,[e])}setHeaderEntries(A,e){let i=(Array.isArray(e)?e:[e]).map(o=>o.toString()),n=A.toLowerCase();this.headers.set(n,i),this.maybeSetNormalizedName(A,n)}forEach(A){this.init(),Array.from(this.normalizedNames.keys()).forEach(e=>A(this.normalizedNames.get(e),this.headers.get(e)))}};var n5=class{encodeKey(A){return jW(A)}encodeValue(A){return jW(A)}decodeKey(A){return decodeURIComponent(A)}decodeValue(A){return decodeURIComponent(A)}};function _6e(t,A){let e=new Map;return t.length>0&&t.replace(/^\?/,"").split("&").forEach(n=>{let o=n.indexOf("="),[r,s]=o==-1?[A.decodeKey(n),""]:[A.decodeKey(n.slice(0,o)),A.decodeValue(n.slice(o+1))],a=e.get(r)||[];a.push(s),e.set(r,a)}),e}var R6e=/%(\d[a-f0-9])/gi,N6e={40:"@","3A":":",24:"$","2C":",","3B":";","3D":"=","3F":"?","2F":"/"};function jW(t){return encodeURIComponent(t).replace(R6e,(A,e)=>N6e[e]??A)}function i5(t){return`${t}`}var l2=class t{map;encoder;updates=null;cloneFrom=null;constructor(A={}){if(this.encoder=A.encoder||new n5,A.fromString){if(A.fromObject)throw new lA(2805,!1);this.map=_6e(A.fromString,this.encoder)}else A.fromObject?(this.map=new Map,Object.keys(A.fromObject).forEach(e=>{let i=A.fromObject[e],n=Array.isArray(i)?i.map(i5):[i5(i)];this.map.set(e,n)})):this.map=null}has(A){return this.init(),this.map.has(A)}get(A){this.init();let e=this.map.get(A);return e?e[0]:null}getAll(A){return this.init(),this.map.get(A)||null}keys(){return this.init(),Array.from(this.map.keys())}append(A,e){return this.clone({param:A,value:e,op:"a"})}appendAll(A){let e=[];return Object.keys(A).forEach(i=>{let n=A[i];Array.isArray(n)?n.forEach(o=>{e.push({param:i,value:o,op:"a"})}):e.push({param:i,value:n,op:"a"})}),this.clone(e)}set(A,e){return this.clone({param:A,value:e,op:"s"})}delete(A,e){return this.clone({param:A,value:e,op:"d"})}toString(){return this.init(),this.keys().map(A=>{let e=this.encoder.encodeKey(A);return this.map.get(A).map(i=>e+"="+this.encoder.encodeValue(i)).join("&")}).filter(A=>A!=="").join("&")}clone(A){let e=new t({encoder:this.encoder});return e.cloneFrom=this.cloneFrom||this,e.updates=(this.updates||[]).concat(A),e}init(){this.map===null&&(this.map=new Map),this.cloneFrom!==null&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(A=>this.map.set(A,this.cloneFrom.map.get(A))),this.updates.forEach(A=>{switch(A.op){case"a":case"s":let e=(A.op==="a"?this.map.get(A.param):void 0)||[];e.push(i5(A.value)),this.map.set(A.param,e);break;case"d":if(A.value!==void 0){let i=this.map.get(A.param)||[],n=i.indexOf(i5(A.value));n!==-1&&i.splice(n,1),i.length>0?this.map.set(A.param,i):this.map.delete(A.param)}else{this.map.delete(A.param);break}}}),this.cloneFrom=this.updates=null)}};var o5=class{map=new Map;set(A,e){return this.map.set(A,e),this}get(A){return this.map.has(A)||this.map.set(A,A.defaultValue()),this.map.get(A)}delete(A){return this.map.delete(A),this}has(A){return this.map.has(A)}keys(){return this.map.keys()}};function L6e(t){switch(t){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}function VW(t){return typeof ArrayBuffer<"u"&&t instanceof ArrayBuffer}function qW(t){return typeof Blob<"u"&&t instanceof Blob}function WW(t){return typeof FormData<"u"&&t instanceof FormData}function F6e(t){return typeof URLSearchParams<"u"&&t instanceof URLSearchParams}var ZW="Content-Type",XW="Accept",eZ="X-Request-URL",AZ="text/plain",tZ="application/json",G6e=`${tZ}, ${AZ}, */*`,yB=class t{url;body=null;headers;context;reportProgress=!1;withCredentials=!1;responseType="json";method;params;urlWithParams;transferCache;constructor(A,e,i,n){this.url=e,this.method=A.toUpperCase();let o;if(L6e(this.method)||n?(this.body=i!==void 0?i:null,o=n):o=i,o&&(this.reportProgress=!!o.reportProgress,this.withCredentials=!!o.withCredentials,o.responseType&&(this.responseType=o.responseType),o.headers&&(this.headers=o.headers),o.context&&(this.context=o.context),o.params&&(this.params=o.params),this.transferCache=o.transferCache),this.headers??=new _1,this.context??=new o5,!this.params)this.params=new l2,this.urlWithParams=e;else{let r=this.params.toString();if(r.length===0)this.urlWithParams=e;else{let s=e.indexOf("?"),a=s===-1?"?":sC.set(I,A.setHeaders[I]),c)),A.setParams&&(l=Object.keys(A.setParams).reduce((C,I)=>C.set(I,A.setParams[I]),l)),new t(e,i,r,{params:l,headers:c,context:d,reportProgress:a,responseType:n,withCredentials:s,transferCache:o})}},PI=function(t){return t[t.Sent=0]="Sent",t[t.UploadProgress=1]="UploadProgress",t[t.ResponseHeader=2]="ResponseHeader",t[t.DownloadProgress=3]="DownloadProgress",t[t.Response=4]="Response",t[t.User=5]="User",t}(PI||{}),vB=class{headers;status;statusText;url;ok;type;constructor(A,e=200,i="OK"){this.headers=A.headers||new _1,this.status=A.status!==void 0?A.status:e,this.statusText=A.statusText||i,this.url=A.url||null,this.ok=this.status>=200&&this.status<300}},r5=class t extends vB{constructor(A={}){super(A)}type=PI.ResponseHeader;clone(A={}){return new t({headers:A.headers||this.headers,status:A.status!==void 0?A.status:this.status,statusText:A.statusText||this.statusText,url:A.url||this.url||void 0})}},_4=class t extends vB{body;constructor(A={}){super(A),this.body=A.body!==void 0?A.body:null}type=PI.Response;clone(A={}){return new t({body:A.body!==void 0?A.body:this.body,headers:A.headers||this.headers,status:A.status!==void 0?A.status:this.status,statusText:A.statusText||this.statusText,url:A.url||this.url||void 0})}},R4=class extends vB{name="HttpErrorResponse";message;error;ok=!1;constructor(A){super(A,0,"Unknown Error"),this.status>=200&&this.status<300?this.message=`Http failure during parsing for ${A.url||"(unknown url)"}`:this.message=`Http failure response for ${A.url||"(unknown url)"}: ${A.status} ${A.statusText}`,this.error=A.error||null}},K6e=200,U6e=204;function YR(t,A){return{body:A,headers:t.headers,context:t.context,observe:t.observe,params:t.params,reportProgress:t.reportProgress,responseType:t.responseType,withCredentials:t.withCredentials,transferCache:t.transferCache}}var wa=(()=>{class t{handler;constructor(e){this.handler=e}request(e,i,n={}){let o;if(e instanceof yB)o=e;else{let a;n.headers instanceof _1?a=n.headers:a=new _1(n.headers);let c;n.params&&(n.params instanceof l2?c=n.params:c=new l2({fromObject:n.params})),o=new yB(e,i,n.body!==void 0?n.body:null,{headers:a,context:n.context,params:c,reportProgress:n.reportProgress,responseType:n.responseType||"json",withCredentials:n.withCredentials,transferCache:n.transferCache})}let r=dA(o).pipe(M0(a=>this.handler.handle(a)));if(e instanceof yB||n.observe==="events")return r;let s=r.pipe($A(a=>a instanceof _4));switch(n.observe||"body"){case"body":switch(o.responseType){case"arraybuffer":return s.pipe(aA(a=>{if(a.body!==null&&!(a.body instanceof ArrayBuffer))throw new lA(2806,!1);return a.body}));case"blob":return s.pipe(aA(a=>{if(a.body!==null&&!(a.body instanceof Blob))throw new lA(2807,!1);return a.body}));case"text":return s.pipe(aA(a=>{if(a.body!==null&&typeof a.body!="string")throw new lA(2808,!1);return a.body}));case"json":default:return s.pipe(aA(a=>a.body))}case"response":return s;default:throw new lA(2809,!1)}}delete(e,i={}){return this.request("DELETE",e,i)}get(e,i={}){return this.request("GET",e,i)}head(e,i={}){return this.request("HEAD",e,i)}jsonp(e,i){return this.request("JSONP",e,{params:new l2().append(i,"JSONP_CALLBACK"),observe:"body",responseType:"json"})}options(e,i={}){return this.request("OPTIONS",e,i)}patch(e,i,n={}){return this.request("PATCH",e,YR(n,i))}post(e,i,n={}){return this.request("POST",e,YR(n,i))}put(e,i,n={}){return this.request("PUT",e,YR(n,i))}static \u0275fac=function(i){return new(i||t)(UA(DB))};static \u0275prov=be({token:t,factory:t.\u0275fac})}return t})();var T6e=new re("");function iZ(t,A){return A(t)}function O6e(t,A){return(e,i)=>A.intercept(e,{handle:n=>t(n,i)})}function J6e(t,A,e){return(i,n)=>Xr(e,()=>A(i,o=>t(o,n)))}var nZ=new re(""),zR=new re(""),oZ=new re(""),PR=new re("",{providedIn:"root",factory:()=>!0});function Y6e(){let t=null;return(A,e)=>{t===null&&(t=(E(nZ,{optional:!0})??[]).reduceRight(O6e,iZ));let i=E(t2);if(E(PR)){let o=i.add();return t(A,e).pipe(S0(()=>i.remove(o)))}else return t(A,e)}}var s5=(()=>{class t extends DB{backend;injector;chain=null;pendingTasks=E(t2);contributeToStability=E(PR);constructor(e,i){super(),this.backend=e,this.injector=i}handle(e){if(this.chain===null){let i=Array.from(new Set([...this.injector.get(zR),...this.injector.get(oZ,[])]));this.chain=i.reduceRight((n,o)=>J6e(n,o,this.injector),iZ)}if(this.contributeToStability){let i=this.pendingTasks.add();return this.chain(e,n=>this.backend.handle(n)).pipe(S0(()=>this.pendingTasks.remove(i)))}else return this.chain(e,i=>this.backend.handle(i))}static \u0275fac=function(i){return new(i||t)(UA(x4),UA(Hr))};static \u0275prov=be({token:t,factory:t.\u0275fac})}return t})();var H6e=/^\)\]\}',?\n/,z6e=RegExp(`^${eZ}:`,"m");function P6e(t){return"responseURL"in t&&t.responseURL?t.responseURL:z6e.test(t.getAllResponseHeaders())?t.getResponseHeader(eZ):null}var HR=(()=>{class t{xhrFactory;constructor(e){this.xhrFactory=e}handle(e){if(e.method==="JSONP")throw new lA(-2800,!1);let i=this.xhrFactory;return(i.\u0275loadImpl?xo(i.\u0275loadImpl()):dA(null)).pipe(Si(()=>new nt(o=>{let r=i.build();if(r.open(e.method,e.urlWithParams),e.withCredentials&&(r.withCredentials=!0),e.headers.forEach((h,B)=>r.setRequestHeader(h,B.join(","))),e.headers.has(XW)||r.setRequestHeader(XW,G6e),!e.headers.has(ZW)){let h=e.detectContentTypeHeader();h!==null&&r.setRequestHeader(ZW,h)}if(e.responseType){let h=e.responseType.toLowerCase();r.responseType=h!=="json"?h:"text"}let s=e.serializeBody(),a=null,c=()=>{if(a!==null)return a;let h=r.statusText||"OK",B=new _1(r.getAllResponseHeaders()),f=P6e(r)||e.url;return a=new r5({headers:B,status:r.status,statusText:h,url:f}),a},l=()=>{let{headers:h,status:B,statusText:f,url:b}=c(),k=null;B!==U6e&&(k=typeof r.response>"u"?r.responseText:r.response),B===0&&(B=k?K6e:0);let S=B>=200&&B<300;if(e.responseType==="json"&&typeof k=="string"){let w=k;k=k.replace(H6e,"");try{k=k!==""?JSON.parse(k):null}catch(_){k=w,S&&(S=!1,k={error:_,text:k})}}S?(o.next(new _4({body:k,headers:h,status:B,statusText:f,url:b||void 0})),o.complete()):o.error(new R4({error:k,headers:h,status:B,statusText:f,url:b||void 0}))},d=h=>{let{url:B}=c(),f=new R4({error:h,status:r.status||0,statusText:r.statusText||"Unknown Error",url:B||void 0});o.error(f)},C=!1,I=h=>{C||(o.next(c()),C=!0);let B={type:PI.DownloadProgress,loaded:h.loaded};h.lengthComputable&&(B.total=h.total),e.responseType==="text"&&r.responseText&&(B.partialText=r.responseText),o.next(B)},u=h=>{let B={type:PI.UploadProgress,loaded:h.loaded};h.lengthComputable&&(B.total=h.total),o.next(B)};return r.addEventListener("load",l),r.addEventListener("error",d),r.addEventListener("timeout",d),r.addEventListener("abort",d),e.reportProgress&&(r.addEventListener("progress",I),s!==null&&r.upload&&r.upload.addEventListener("progress",u)),r.send(s),o.next({type:PI.Sent}),()=>{r.removeEventListener("error",d),r.removeEventListener("abort",d),r.removeEventListener("load",l),r.removeEventListener("timeout",d),e.reportProgress&&(r.removeEventListener("progress",I),s!==null&&r.upload&&r.upload.removeEventListener("progress",u)),r.readyState!==r.DONE&&r.abort()}})))}static \u0275fac=function(i){return new(i||t)(UA(zI))};static \u0275prov=be({token:t,factory:t.\u0275fac})}return t})(),rZ=new re(""),j6e="XSRF-TOKEN",V6e=new re("",{providedIn:"root",factory:()=>j6e}),q6e="X-XSRF-TOKEN",W6e=new re("",{providedIn:"root",factory:()=>q6e}),N4=class{},Z6e=(()=>{class t{doc;cookieName;lastCookieString="";lastToken=null;parseCount=0;constructor(e,i){this.doc=e,this.cookieName=i}getToken(){let e=this.doc.cookie||"";return e!==this.lastCookieString&&(this.parseCount++,this.lastToken=k4(e,this.cookieName),this.lastCookieString=e),this.lastToken}static \u0275fac=function(i){return new(i||t)(UA(ht),UA(V6e))};static \u0275prov=be({token:t,factory:t.\u0275fac})}return t})();function X6e(t,A){let e=t.url.toLowerCase();if(!E(rZ)||t.method==="GET"||t.method==="HEAD"||e.startsWith("http://")||e.startsWith("https://"))return A(t);let i=E(N4).getToken(),n=E(W6e);return i!=null&&!t.headers.has(n)&&(t=t.clone({headers:t.headers.set(n,i)})),A(t)}var jR=function(t){return t[t.Interceptors=0]="Interceptors",t[t.LegacyInterceptors=1]="LegacyInterceptors",t[t.CustomXsrfConfiguration=2]="CustomXsrfConfiguration",t[t.NoXsrfProtection=3]="NoXsrfProtection",t[t.JsonpSupport=4]="JsonpSupport",t[t.RequestsMadeViaParent=5]="RequestsMadeViaParent",t[t.Fetch=6]="Fetch",t}(jR||{});function $6e(t,A){return{\u0275kind:t,\u0275providers:A}}function sZ(...t){let A=[wa,HR,s5,{provide:DB,useExisting:s5},{provide:x4,useFactory:()=>E(T6e,{optional:!0})??E(HR)},{provide:zR,useValue:X6e,multi:!0},{provide:rZ,useValue:!0},{provide:N4,useClass:Z6e}];for(let e of t)A.push(...e.\u0275providers);return h4(A)}var $W=new re("");function aZ(){return $6e(jR.LegacyInterceptors,[{provide:$W,useFactory:Y6e},{provide:zR,useExisting:$W,multi:!0}])}var VR=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({providers:[sZ(aZ())]})}return t})();var hZ=(()=>{class t{_renderer;_elementRef;onChange=e=>{};onTouched=()=>{};constructor(e,i){this._renderer=e,this._elementRef=i}setProperty(e,i){this._renderer.setProperty(this._elementRef.nativeElement,e,i)}registerOnTouched(e){this.onTouched=e}registerOnChange(e){this.onChange=e}setDisabledState(e){this.setProperty("disabled",e)}static \u0275fac=function(i){return new(i||t)(DA(an),DA(eA))};static \u0275dir=Oe({type:t})}return t})(),BZ=(()=>{class t extends hZ{static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275dir=Oe({type:t,features:[Ct]})}return t})(),sl=new re("");var e8e={provide:sl,useExisting:zr(()=>Mr),multi:!0};function A8e(){let t=il()?il().getUserAgent():"";return/android (\d+)/.test(t.toLowerCase())}var t8e=new re(""),Mr=(()=>{class t extends hZ{_compositionMode;_composing=!1;constructor(e,i,n){super(e,i),this._compositionMode=n,this._compositionMode==null&&(this._compositionMode=!A8e())}writeValue(e){let i=e??"";this.setProperty("value",i)}_handleInput(e){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(e)}_compositionStart(){this._composing=!0}_compositionEnd(e){this._composing=!1,this._compositionMode&&this.onChange(e)}static \u0275fac=function(i){return new(i||t)(DA(an),DA(eA),DA(t8e,8))};static \u0275dir=Oe({type:t,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(i,n){i&1&&ee("input",function(r){return n._handleInput(r.target.value)})("blur",function(){return n.onTouched()})("compositionstart",function(){return n._compositionStart()})("compositionend",function(r){return n._compositionEnd(r.target.value)})},standalone:!1,features:[gt([e8e]),Ct]})}return t})();function XR(t){return t==null||$R(t)===0}function $R(t){return t==null?null:Array.isArray(t)||typeof t=="string"?t.length:t instanceof Set?t.size:null}var z0=new re(""),O4=new re(""),i8e=/^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[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])?)*$/,ol=class{static min(A){return EZ(A)}static max(A){return n8e(A)}static required(A){return o8e(A)}static requiredTrue(A){return r8e(A)}static email(A){return s8e(A)}static minLength(A){return a8e(A)}static maxLength(A){return c8e(A)}static pattern(A){return l8e(A)}static nullValidator(A){return c5()}static compose(A){return yZ(A)}static composeAsync(A){return DZ(A)}};function EZ(t){return A=>{if(A.value==null||t==null)return null;let e=parseFloat(A.value);return!isNaN(e)&&e{if(A.value==null||t==null)return null;let e=parseFloat(A.value);return!isNaN(e)&&e>t?{max:{max:t,actual:A.value}}:null}}function o8e(t){return XR(t.value)?{required:!0}:null}function r8e(t){return t.value===!0?null:{required:!0}}function s8e(t){return XR(t.value)||i8e.test(t.value)?null:{email:!0}}function a8e(t){return A=>{let e=A.value?.length??$R(A.value);return e===null||e===0?null:e{let e=A.value?.length??$R(A.value);return e!==null&&e>t?{maxlength:{requiredLength:t,actualLength:e}}:null}}function l8e(t){if(!t)return c5;let A,e;return typeof t=="string"?(e="",t.charAt(0)!=="^"&&(e+="^"),e+=t,t.charAt(t.length-1)!=="$"&&(e+="$"),A=new RegExp(e)):(e=t.toString(),A=t),i=>{if(XR(i.value))return null;let n=i.value;return A.test(n)?null:{pattern:{requiredPattern:e,actualValue:n}}}}function c5(t){return null}function fZ(t){return t!=null}function QZ(t){return v1(t)?xo(t):t}function mZ(t){let A={};return t.forEach(e=>{A=e!=null?ae(ae({},A),e):A}),Object.keys(A).length===0?null:A}function pZ(t,A){return A.map(e=>e(t))}function g8e(t){return!t.validate}function wZ(t){return t.map(A=>g8e(A)?A:e=>A.validate(e))}function yZ(t){if(!t)return null;let A=t.filter(fZ);return A.length==0?null:function(e){return mZ(pZ(e,A))}}function eN(t){return t!=null?yZ(wZ(t)):null}function DZ(t){if(!t)return null;let A=t.filter(fZ);return A.length==0?null:function(e){let i=pZ(e,A).map(QZ);return $Q(i).pipe(aA(mZ))}}function AN(t){return t!=null?DZ(wZ(t)):null}function cZ(t,A){return t===null?[A]:Array.isArray(t)?[...t,A]:[t,A]}function vZ(t){return t._rawValidators}function bZ(t){return t._rawAsyncValidators}function qR(t){return t?Array.isArray(t)?t:[t]:[]}function l5(t,A){return Array.isArray(t)?t.includes(A):t===A}function lZ(t,A){let e=qR(A);return qR(t).forEach(n=>{l5(e,n)||e.push(n)}),e}function gZ(t,A){return qR(A).filter(e=>!l5(t,e))}var g5=class{get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators=[];_rawAsyncValidators=[];_setValidators(A){this._rawValidators=A||[],this._composedValidatorFn=eN(this._rawValidators)}_setAsyncValidators(A){this._rawAsyncValidators=A||[],this._composedAsyncValidatorFn=AN(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_onDestroyCallbacks=[];_registerOnDestroy(A){this._onDestroyCallbacks.push(A)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(A=>A()),this._onDestroyCallbacks=[]}reset(A=void 0){this.control&&this.control.reset(A)}hasError(A,e){return this.control?this.control.hasError(A,e):!1}getError(A,e){return this.control?this.control.getError(A,e):null}},d2=class extends g5{name;get formDirective(){return null}get path(){return null}},rl=class extends g5{_parent=null;name=null;valueAccessor=null},d5=class{_cd;constructor(A){this._cd=A}get isTouched(){return this._cd?.control?._touched?.(),!!this._cd?.control?.touched}get isUntouched(){return!!this._cd?.control?.untouched}get isPristine(){return this._cd?.control?._pristine?.(),!!this._cd?.control?.pristine}get isDirty(){return!!this._cd?.control?.dirty}get isValid(){return this._cd?.control?._status?.(),!!this._cd?.control?.valid}get isInvalid(){return!!this._cd?.control?.invalid}get isPending(){return!!this._cd?.control?.pending}get isSubmitted(){return this._cd?._submitted?.(),!!this._cd?.submitted}},d8e={"[class.ng-untouched]":"isUntouched","[class.ng-touched]":"isTouched","[class.ng-pristine]":"isPristine","[class.ng-dirty]":"isDirty","[class.ng-valid]":"isValid","[class.ng-invalid]":"isInvalid","[class.ng-pending]":"isPending"},$4A=_A(ae({},d8e),{"[class.ng-submitted]":"isSubmitted"}),Fo=(()=>{class t extends d5{constructor(e){super(e)}static \u0275fac=function(i){return new(i||t)(DA(rl,2))};static \u0275dir=Oe({type:t,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(i,n){i&2&&iA("ng-untouched",n.isUntouched)("ng-touched",n.isTouched)("ng-pristine",n.isPristine)("ng-dirty",n.isDirty)("ng-valid",n.isValid)("ng-invalid",n.isInvalid)("ng-pending",n.isPending)},standalone:!1,features:[Ct]})}return t})(),MZ=(()=>{class t extends d5{constructor(e){super(e)}static \u0275fac=function(i){return new(i||t)(DA(d2,10))};static \u0275dir=Oe({type:t,selectors:[["","formGroupName",""],["","formArrayName",""],["","ngModelGroup",""],["","formGroup",""],["form",3,"ngNoForm",""],["","ngForm",""]],hostVars:16,hostBindings:function(i,n){i&2&&iA("ng-untouched",n.isUntouched)("ng-touched",n.isTouched)("ng-pristine",n.isPristine)("ng-dirty",n.isDirty)("ng-valid",n.isValid)("ng-invalid",n.isInvalid)("ng-pending",n.isPending)("ng-submitted",n.isSubmitted)},standalone:!1,features:[Ct]})}return t})();var L4="VALID",a5="INVALID",MB="PENDING",F4="DISABLED",R1=class{},C5=class extends R1{value;source;constructor(A,e){super(),this.value=A,this.source=e}},K4=class extends R1{pristine;source;constructor(A,e){super(),this.pristine=A,this.source=e}},U4=class extends R1{touched;source;constructor(A,e){super(),this.touched=A,this.source=e}},SB=class extends R1{status;source;constructor(A,e){super(),this.status=A,this.source=e}},I5=class extends R1{source;constructor(A){super(),this.source=A}},u5=class extends R1{source;constructor(A){super(),this.source=A}};function tN(t){return(f5(t)?t.validators:t)||null}function C8e(t){return Array.isArray(t)?eN(t):t||null}function iN(t,A){return(f5(A)?A.asyncValidators:t)||null}function I8e(t){return Array.isArray(t)?AN(t):t||null}function f5(t){return t!=null&&!Array.isArray(t)&&typeof t=="object"}function SZ(t,A,e){let i=t.controls;if(!(A?Object.keys(i):i).length)throw new lA(1e3,"");if(!i[e])throw new lA(1001,"")}function kZ(t,A,e){t._forEachChild((i,n)=>{if(e[n]===void 0)throw new lA(1002,"")})}var kB=class{_pendingDirty=!1;_hasOwnPendingAsyncValidator=null;_pendingTouched=!1;_onCollectionChange=()=>{};_updateOn;_parent=null;_asyncValidationSubscription;_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators;_rawAsyncValidators;value;constructor(A,e){this._assignValidators(A),this._assignAsyncValidators(e)}get validator(){return this._composedValidatorFn}set validator(A){this._rawValidators=this._composedValidatorFn=A}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(A){this._rawAsyncValidators=this._composedAsyncValidatorFn=A}get parent(){return this._parent}get status(){return As(this.statusReactive)}set status(A){As(()=>this.statusReactive.set(A))}_status=ot(()=>this.statusReactive());statusReactive=mA(void 0);get valid(){return this.status===L4}get invalid(){return this.status===a5}get pending(){return this.status==MB}get disabled(){return this.status===F4}get enabled(){return this.status!==F4}errors;get pristine(){return As(this.pristineReactive)}set pristine(A){As(()=>this.pristineReactive.set(A))}_pristine=ot(()=>this.pristineReactive());pristineReactive=mA(!0);get dirty(){return!this.pristine}get touched(){return As(this.touchedReactive)}set touched(A){As(()=>this.touchedReactive.set(A))}_touched=ot(()=>this.touchedReactive());touchedReactive=mA(!1);get untouched(){return!this.touched}_events=new je;events=this._events.asObservable();valueChanges;statusChanges;get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(A){this._assignValidators(A)}setAsyncValidators(A){this._assignAsyncValidators(A)}addValidators(A){this.setValidators(lZ(A,this._rawValidators))}addAsyncValidators(A){this.setAsyncValidators(lZ(A,this._rawAsyncValidators))}removeValidators(A){this.setValidators(gZ(A,this._rawValidators))}removeAsyncValidators(A){this.setAsyncValidators(gZ(A,this._rawAsyncValidators))}hasValidator(A){return l5(this._rawValidators,A)}hasAsyncValidator(A){return l5(this._rawAsyncValidators,A)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(A={}){let e=this.touched===!1;this.touched=!0;let i=A.sourceControl??this;this._parent&&!A.onlySelf&&this._parent.markAsTouched(_A(ae({},A),{sourceControl:i})),e&&A.emitEvent!==!1&&this._events.next(new U4(!0,i))}markAllAsTouched(A={}){this.markAsTouched({onlySelf:!0,emitEvent:A.emitEvent,sourceControl:this}),this._forEachChild(e=>e.markAllAsTouched(A))}markAsUntouched(A={}){let e=this.touched===!0;this.touched=!1,this._pendingTouched=!1;let i=A.sourceControl??this;this._forEachChild(n=>{n.markAsUntouched({onlySelf:!0,emitEvent:A.emitEvent,sourceControl:i})}),this._parent&&!A.onlySelf&&this._parent._updateTouched(A,i),e&&A.emitEvent!==!1&&this._events.next(new U4(!1,i))}markAsDirty(A={}){let e=this.pristine===!0;this.pristine=!1;let i=A.sourceControl??this;this._parent&&!A.onlySelf&&this._parent.markAsDirty(_A(ae({},A),{sourceControl:i})),e&&A.emitEvent!==!1&&this._events.next(new K4(!1,i))}markAsPristine(A={}){let e=this.pristine===!1;this.pristine=!0,this._pendingDirty=!1;let i=A.sourceControl??this;this._forEachChild(n=>{n.markAsPristine({onlySelf:!0,emitEvent:A.emitEvent})}),this._parent&&!A.onlySelf&&this._parent._updatePristine(A,i),e&&A.emitEvent!==!1&&this._events.next(new K4(!0,i))}markAsPending(A={}){this.status=MB;let e=A.sourceControl??this;A.emitEvent!==!1&&(this._events.next(new SB(this.status,e)),this.statusChanges.emit(this.status)),this._parent&&!A.onlySelf&&this._parent.markAsPending(_A(ae({},A),{sourceControl:e}))}disable(A={}){let e=this._parentMarkedDirty(A.onlySelf);this.status=F4,this.errors=null,this._forEachChild(n=>{n.disable(_A(ae({},A),{onlySelf:!0}))}),this._updateValue();let i=A.sourceControl??this;A.emitEvent!==!1&&(this._events.next(new C5(this.value,i)),this._events.next(new SB(this.status,i)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(_A(ae({},A),{skipPristineCheck:e}),this),this._onDisabledChange.forEach(n=>n(!0))}enable(A={}){let e=this._parentMarkedDirty(A.onlySelf);this.status=L4,this._forEachChild(i=>{i.enable(_A(ae({},A),{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:A.emitEvent}),this._updateAncestors(_A(ae({},A),{skipPristineCheck:e}),this),this._onDisabledChange.forEach(i=>i(!1))}_updateAncestors(A,e){this._parent&&!A.onlySelf&&(this._parent.updateValueAndValidity(A),A.skipPristineCheck||this._parent._updatePristine({},e),this._parent._updateTouched({},e))}setParent(A){this._parent=A}getRawValue(){return this.value}updateValueAndValidity(A={}){if(this._setInitialStatus(),this._updateValue(),this.enabled){let i=this._cancelExistingSubscription();this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===L4||this.status===MB)&&this._runAsyncValidator(i,A.emitEvent)}let e=A.sourceControl??this;A.emitEvent!==!1&&(this._events.next(new C5(this.value,e)),this._events.next(new SB(this.status,e)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!A.onlySelf&&this._parent.updateValueAndValidity(_A(ae({},A),{sourceControl:e}))}_updateTreeValidity(A={emitEvent:!0}){this._forEachChild(e=>e._updateTreeValidity(A)),this.updateValueAndValidity({onlySelf:!0,emitEvent:A.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?F4:L4}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(A,e){if(this.asyncValidator){this.status=MB,this._hasOwnPendingAsyncValidator={emitEvent:e!==!1};let i=QZ(this.asyncValidator(this));this._asyncValidationSubscription=i.subscribe(n=>{this._hasOwnPendingAsyncValidator=null,this.setErrors(n,{emitEvent:e,shouldHaveEmitted:A})})}}_cancelExistingSubscription(){if(this._asyncValidationSubscription){this._asyncValidationSubscription.unsubscribe();let A=this._hasOwnPendingAsyncValidator?.emitEvent??!1;return this._hasOwnPendingAsyncValidator=null,A}return!1}setErrors(A,e={}){this.errors=A,this._updateControlsErrors(e.emitEvent!==!1,this,e.shouldHaveEmitted)}get(A){let e=A;return e==null||(Array.isArray(e)||(e=e.split(".")),e.length===0)?null:e.reduce((i,n)=>i&&i._find(n),this)}getError(A,e){let i=e?this.get(e):this;return i&&i.errors?i.errors[A]:null}hasError(A,e){return!!this.getError(A,e)}get root(){let A=this;for(;A._parent;)A=A._parent;return A}_updateControlsErrors(A,e,i){this.status=this._calculateStatus(),A&&this.statusChanges.emit(this.status),(A||i)&&this._events.next(new SB(this.status,e)),this._parent&&this._parent._updateControlsErrors(A,e,i)}_initObservables(){this.valueChanges=new Ve,this.statusChanges=new Ve}_calculateStatus(){return this._allControlsDisabled()?F4:this.errors?a5:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(MB)?MB:this._anyControlsHaveStatus(a5)?a5:L4}_anyControlsHaveStatus(A){return this._anyControls(e=>e.status===A)}_anyControlsDirty(){return this._anyControls(A=>A.dirty)}_anyControlsTouched(){return this._anyControls(A=>A.touched)}_updatePristine(A,e){let i=!this._anyControlsDirty(),n=this.pristine!==i;this.pristine=i,this._parent&&!A.onlySelf&&this._parent._updatePristine(A,e),n&&this._events.next(new K4(this.pristine,e))}_updateTouched(A={},e){this.touched=this._anyControlsTouched(),this._events.next(new U4(this.touched,e)),this._parent&&!A.onlySelf&&this._parent._updateTouched(A,e)}_onDisabledChange=[];_registerOnCollectionChange(A){this._onCollectionChange=A}_setUpdateStrategy(A){f5(A)&&A.updateOn!=null&&(this._updateOn=A.updateOn)}_parentMarkedDirty(A){let e=this._parent&&this._parent.dirty;return!A&&!!e&&!this._parent._anyControlsDirty()}_find(A){return null}_assignValidators(A){this._rawValidators=Array.isArray(A)?A.slice():A,this._composedValidatorFn=C8e(this._rawValidators)}_assignAsyncValidators(A){this._rawAsyncValidators=Array.isArray(A)?A.slice():A,this._composedAsyncValidatorFn=I8e(this._rawAsyncValidators)}},xB=class extends kB{constructor(A,e,i){super(tN(e),iN(i,e)),this.controls=A,this._initObservables(),this._setUpdateStrategy(e),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}controls;registerControl(A,e){return this.controls[A]?this.controls[A]:(this.controls[A]=e,e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange),e)}addControl(A,e,i={}){this.registerControl(A,e),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}removeControl(A,e={}){this.controls[A]&&this.controls[A]._registerOnCollectionChange(()=>{}),delete this.controls[A],this.updateValueAndValidity({emitEvent:e.emitEvent}),this._onCollectionChange()}setControl(A,e,i={}){this.controls[A]&&this.controls[A]._registerOnCollectionChange(()=>{}),delete this.controls[A],e&&this.registerControl(A,e),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}contains(A){return this.controls.hasOwnProperty(A)&&this.controls[A].enabled}setValue(A,e={}){kZ(this,!0,A),Object.keys(A).forEach(i=>{SZ(this,!0,i),this.controls[i].setValue(A[i],{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e)}patchValue(A,e={}){A!=null&&(Object.keys(A).forEach(i=>{let n=this.controls[i];n&&n.patchValue(A[i],{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e))}reset(A={},e={}){this._forEachChild((i,n)=>{i.reset(A?A[n]:null,{onlySelf:!0,emitEvent:e.emitEvent})}),this._updatePristine(e,this),this._updateTouched(e,this),this.updateValueAndValidity(e)}getRawValue(){return this._reduceChildren({},(A,e,i)=>(A[i]=e.getRawValue(),A))}_syncPendingControls(){let A=this._reduceChildren(!1,(e,i)=>i._syncPendingControls()?!0:e);return A&&this.updateValueAndValidity({onlySelf:!0}),A}_forEachChild(A){Object.keys(this.controls).forEach(e=>{let i=this.controls[e];i&&A(i,e)})}_setUpControls(){this._forEachChild(A=>{A.setParent(this),A._registerOnCollectionChange(this._onCollectionChange)})}_updateValue(){this.value=this._reduceValue()}_anyControls(A){for(let[e,i]of Object.entries(this.controls))if(this.contains(e)&&A(i))return!0;return!1}_reduceValue(){let A={};return this._reduceChildren(A,(e,i,n)=>((i.enabled||this.disabled)&&(e[n]=i.value),e))}_reduceChildren(A,e){let i=A;return this._forEachChild((n,o)=>{i=e(i,n,o)}),i}_allControlsDisabled(){for(let A of Object.keys(this.controls))if(this.controls[A].enabled)return!1;return Object.keys(this.controls).length>0||this.disabled}_find(A){return this.controls.hasOwnProperty(A)?this.controls[A]:null}};var WR=class extends xB{};var _B=new re("",{providedIn:"root",factory:()=>Q5}),Q5="always";function xZ(t,A){return[...A.path,t]}function T4(t,A,e=Q5){nN(t,A),A.valueAccessor.writeValue(t.value),(t.disabled||e==="always")&&A.valueAccessor.setDisabledState?.(t.disabled),h8e(t,A),E8e(t,A),B8e(t,A),u8e(t,A)}function h5(t,A,e=!0){let i=()=>{};A.valueAccessor&&(A.valueAccessor.registerOnChange(i),A.valueAccessor.registerOnTouched(i)),E5(t,A),t&&(A._invokeOnDestroyCallbacks(),t._registerOnCollectionChange(()=>{}))}function B5(t,A){t.forEach(e=>{e.registerOnValidatorChange&&e.registerOnValidatorChange(A)})}function u8e(t,A){if(A.valueAccessor.setDisabledState){let e=i=>{A.valueAccessor.setDisabledState(i)};t.registerOnDisabledChange(e),A._registerOnDestroy(()=>{t._unregisterOnDisabledChange(e)})}}function nN(t,A){let e=vZ(t);A.validator!==null?t.setValidators(cZ(e,A.validator)):typeof e=="function"&&t.setValidators([e]);let i=bZ(t);A.asyncValidator!==null?t.setAsyncValidators(cZ(i,A.asyncValidator)):typeof i=="function"&&t.setAsyncValidators([i]);let n=()=>t.updateValueAndValidity();B5(A._rawValidators,n),B5(A._rawAsyncValidators,n)}function E5(t,A){let e=!1;if(t!==null){if(A.validator!==null){let n=vZ(t);if(Array.isArray(n)&&n.length>0){let o=n.filter(r=>r!==A.validator);o.length!==n.length&&(e=!0,t.setValidators(o))}}if(A.asyncValidator!==null){let n=bZ(t);if(Array.isArray(n)&&n.length>0){let o=n.filter(r=>r!==A.asyncValidator);o.length!==n.length&&(e=!0,t.setAsyncValidators(o))}}}let i=()=>{};return B5(A._rawValidators,i),B5(A._rawAsyncValidators,i),e}function h8e(t,A){A.valueAccessor.registerOnChange(e=>{t._pendingValue=e,t._pendingChange=!0,t._pendingDirty=!0,t.updateOn==="change"&&_Z(t,A)})}function B8e(t,A){A.valueAccessor.registerOnTouched(()=>{t._pendingTouched=!0,t.updateOn==="blur"&&t._pendingChange&&_Z(t,A),t.updateOn!=="submit"&&t.markAsTouched()})}function _Z(t,A){t._pendingDirty&&t.markAsDirty(),t.setValue(t._pendingValue,{emitModelToViewChange:!1}),A.viewToModelUpdate(t._pendingValue),t._pendingChange=!1}function E8e(t,A){let e=(i,n)=>{A.valueAccessor.writeValue(i),n&&A.viewToModelUpdate(i)};t.registerOnChange(e),A._registerOnDestroy(()=>{t._unregisterOnChange(e)})}function RZ(t,A){t==null,nN(t,A)}function f8e(t,A){return E5(t,A)}function oN(t,A){if(!t.hasOwnProperty("model"))return!1;let e=t.model;return e.isFirstChange()?!0:!Object.is(A,e.currentValue)}function Q8e(t){return Object.getPrototypeOf(t.constructor)===BZ}function NZ(t,A){t._syncPendingControls(),A.forEach(e=>{let i=e.control;i.updateOn==="submit"&&i._pendingChange&&(e.viewToModelUpdate(i._pendingValue),i._pendingChange=!1)})}function rN(t,A){if(!A)return null;Array.isArray(A);let e,i,n;return A.forEach(o=>{o.constructor===Mr?e=o:Q8e(o)?i=o:n=o}),n||i||e||null}function m8e(t,A){let e=t.indexOf(A);e>-1&&t.splice(e,1)}var p8e={provide:d2,useExisting:zr(()=>J4)},G4=Promise.resolve(),J4=(()=>{class t extends d2{callSetDisabledState;get submitted(){return As(this.submittedReactive)}_submitted=ot(()=>this.submittedReactive());submittedReactive=mA(!1);_directives=new Set;form;ngSubmit=new Ve;options;constructor(e,i,n){super(),this.callSetDisabledState=n,this.form=new xB({},eN(e),AN(i))}ngAfterViewInit(){this._setUpdateStrategy()}get formDirective(){return this}get control(){return this.form}get path(){return[]}get controls(){return this.form.controls}addControl(e){G4.then(()=>{let i=this._findContainer(e.path);e.control=i.registerControl(e.name,e.control),T4(e.control,e,this.callSetDisabledState),e.control.updateValueAndValidity({emitEvent:!1}),this._directives.add(e)})}getControl(e){return this.form.get(e.path)}removeControl(e){G4.then(()=>{let i=this._findContainer(e.path);i&&i.removeControl(e.name),this._directives.delete(e)})}addFormGroup(e){G4.then(()=>{let i=this._findContainer(e.path),n=new xB({});RZ(n,e),i.registerControl(e.name,n),n.updateValueAndValidity({emitEvent:!1})})}removeFormGroup(e){G4.then(()=>{let i=this._findContainer(e.path);i&&i.removeControl(e.name)})}getFormGroup(e){return this.form.get(e.path)}updateModel(e,i){G4.then(()=>{this.form.get(e.path).setValue(i)})}setValue(e){this.control.setValue(e)}onSubmit(e){return this.submittedReactive.set(!0),NZ(this.form,this._directives),this.ngSubmit.emit(e),this.form._events.next(new I5(this.control)),e?.target?.method==="dialog"}onReset(){this.resetForm()}resetForm(e=void 0){this.form.reset(e),this.submittedReactive.set(!1),this.form._events.next(new u5(this.form))}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.form._updateOn=this.options.updateOn)}_findContainer(e){return e.pop(),e.length?this.form.get(e):this.form}static \u0275fac=function(i){return new(i||t)(DA(z0,10),DA(O4,10),DA(_B,8))};static \u0275dir=Oe({type:t,selectors:[["form",3,"ngNoForm","",3,"formGroup",""],["ng-form"],["","ngForm",""]],hostBindings:function(i,n){i&1&&ee("submit",function(r){return n.onSubmit(r)})("reset",function(){return n.onReset()})},inputs:{options:[0,"ngFormOptions","options"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],standalone:!1,features:[gt([p8e]),Ct]})}return t})();function dZ(t,A){let e=t.indexOf(A);e>-1&&t.splice(e,1)}function CZ(t){return typeof t=="object"&&t!==null&&Object.keys(t).length===2&&"value"in t&&"disabled"in t}var g2=class extends kB{defaultValue=null;_onChange=[];_pendingValue;_pendingChange=!1;constructor(A=null,e,i){super(tN(e),iN(i,e)),this._applyFormState(A),this._setUpdateStrategy(e),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator}),f5(e)&&(e.nonNullable||e.initialValueIsDefault)&&(CZ(A)?this.defaultValue=A.value:this.defaultValue=A)}setValue(A,e={}){this.value=this._pendingValue=A,this._onChange.length&&e.emitModelToViewChange!==!1&&this._onChange.forEach(i=>i(this.value,e.emitViewToModelChange!==!1)),this.updateValueAndValidity(e)}patchValue(A,e={}){this.setValue(A,e)}reset(A=this.defaultValue,e={}){this._applyFormState(A),this.markAsPristine(e),this.markAsUntouched(e),this.setValue(this.value,e),this._pendingChange=!1}_updateValue(){}_anyControls(A){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(A){this._onChange.push(A)}_unregisterOnChange(A){dZ(this._onChange,A)}registerOnDisabledChange(A){this._onDisabledChange.push(A)}_unregisterOnDisabledChange(A){dZ(this._onDisabledChange,A)}_forEachChild(A){}_syncPendingControls(){return this.updateOn==="submit"&&(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),this._pendingChange)?(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),!0):!1}_applyFormState(A){CZ(A)?(this.value=this._pendingValue=A.value,A.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=A}};var w8e=t=>t instanceof g2;var y8e={provide:rl,useExisting:zr(()=>Cr)},IZ=Promise.resolve(),Cr=(()=>{class t extends rl{_changeDetectorRef;callSetDisabledState;control=new g2;static ngAcceptInputType_isDisabled;_registered=!1;viewModel;name="";isDisabled;model;options;update=new Ve;constructor(e,i,n,o,r,s){super(),this._changeDetectorRef=r,this.callSetDisabledState=s,this._parent=e,this._setValidators(i),this._setAsyncValidators(n),this.valueAccessor=rN(this,o)}ngOnChanges(e){if(this._checkForErrors(),!this._registered||"name"in e){if(this._registered&&(this._checkName(),this.formDirective)){let i=e.name.previousValue;this.formDirective.removeControl({name:i,path:this._getPath(i)})}this._setUpControl()}"isDisabled"in e&&this._updateDisabled(e),oN(e,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective&&this.formDirective.removeControl(this)}get path(){return this._getPath(this.name)}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(e){this.viewModel=e,this.update.emit(e)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!!(this.options&&this.options.standalone)}_setUpStandalone(){T4(this.control,this,this.callSetDisabledState),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._checkName()}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),!this._isStandalone()&&this.name}_updateValue(e){IZ.then(()=>{this.control.setValue(e,{emitViewToModelChange:!1}),this._changeDetectorRef?.markForCheck()})}_updateDisabled(e){let i=e.isDisabled.currentValue,n=i!==0&&IA(i);IZ.then(()=>{n&&!this.control.disabled?this.control.disable():!n&&this.control.disabled&&this.control.enable(),this._changeDetectorRef?.markForCheck()})}_getPath(e){return this._parent?xZ(e,this._parent):[e]}static \u0275fac=function(i){return new(i||t)(DA(d2,9),DA(z0,10),DA(O4,10),DA(sl,10),DA(ut,8),DA(_B,8))};static \u0275dir=Oe({type:t,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"],options:[0,"ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],standalone:!1,features:[gt([y8e]),Ct,ti]})}return t})();var LZ=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["form",3,"ngNoForm","",3,"ngNativeValidate",""]],hostAttrs:["novalidate",""],standalone:!1})}return t})(),D8e={provide:sl,useExisting:zr(()=>sN),multi:!0},sN=(()=>{class t extends BZ{writeValue(e){let i=e??"";this.setProperty("value",i)}registerOnChange(e){this.onChange=i=>{e(i==""?null:parseFloat(i))}}static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275dir=Oe({type:t,selectors:[["input","type","number","formControlName",""],["input","type","number","formControl",""],["input","type","number","ngModel",""]],hostBindings:function(i,n){i&1&&ee("input",function(r){return n.onChange(r.target.value)})("blur",function(){return n.onTouched()})},standalone:!1,features:[gt([D8e]),Ct]})}return t})();var aN=new re(""),v8e={provide:rl,useExisting:zr(()=>cN)},cN=(()=>{class t extends rl{_ngModelWarningConfig;callSetDisabledState;viewModel;form;set isDisabled(e){}model;update=new Ve;static _ngModelWarningSentOnce=!1;_ngModelWarningSent=!1;constructor(e,i,n,o,r){super(),this._ngModelWarningConfig=o,this.callSetDisabledState=r,this._setValidators(e),this._setAsyncValidators(i),this.valueAccessor=rN(this,n)}ngOnChanges(e){if(this._isControlChanged(e)){let i=e.form.previousValue;i&&h5(i,this,!1),T4(this.form,this,this.callSetDisabledState),this.form.updateValueAndValidity({emitEvent:!1})}oN(e,this.viewModel)&&(this.form.setValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.form&&h5(this.form,this,!1)}get path(){return[]}get control(){return this.form}viewToModelUpdate(e){this.viewModel=e,this.update.emit(e)}_isControlChanged(e){return e.hasOwnProperty("form")}static \u0275fac=function(i){return new(i||t)(DA(z0,10),DA(O4,10),DA(sl,10),DA(aN,8),DA(_B,8))};static \u0275dir=Oe({type:t,selectors:[["","formControl",""]],inputs:{form:[0,"formControl","form"],isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"]},outputs:{update:"ngModelChange"},exportAs:["ngForm"],standalone:!1,features:[gt([v8e]),Ct,ti]})}return t})(),b8e={provide:d2,useExisting:zr(()=>jI)},jI=(()=>{class t extends d2{callSetDisabledState;get submitted(){return As(this._submittedReactive)}set submitted(e){this._submittedReactive.set(e)}_submitted=ot(()=>this._submittedReactive());_submittedReactive=mA(!1);_oldForm;_onCollectionChange=()=>this._updateDomValue();directives=[];form=null;ngSubmit=new Ve;constructor(e,i,n){super(),this.callSetDisabledState=n,this._setValidators(e),this._setAsyncValidators(i)}ngOnChanges(e){e.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations(),this._oldForm=this.form)}ngOnDestroy(){this.form&&(E5(this.form,this),this.form._onCollectionChange===this._onCollectionChange&&this.form._registerOnCollectionChange(()=>{}))}get formDirective(){return this}get control(){return this.form}get path(){return[]}addControl(e){let i=this.form.get(e.path);return T4(i,e,this.callSetDisabledState),i.updateValueAndValidity({emitEvent:!1}),this.directives.push(e),i}getControl(e){return this.form.get(e.path)}removeControl(e){h5(e.control||null,e,!1),m8e(this.directives,e)}addFormGroup(e){this._setUpFormContainer(e)}removeFormGroup(e){this._cleanUpFormContainer(e)}getFormGroup(e){return this.form.get(e.path)}addFormArray(e){this._setUpFormContainer(e)}removeFormArray(e){this._cleanUpFormContainer(e)}getFormArray(e){return this.form.get(e.path)}updateModel(e,i){this.form.get(e.path).setValue(i)}onSubmit(e){return this._submittedReactive.set(!0),NZ(this.form,this.directives),this.ngSubmit.emit(e),this.form._events.next(new I5(this.control)),e?.target?.method==="dialog"}onReset(){this.resetForm()}resetForm(e=void 0){this.form.reset(e),this._submittedReactive.set(!1),this.form._events.next(new u5(this.form))}_updateDomValue(){this.directives.forEach(e=>{let i=e.control,n=this.form.get(e.path);i!==n&&(h5(i||null,e),w8e(n)&&(T4(n,e,this.callSetDisabledState),e.control=n))}),this.form._updateTreeValidity({emitEvent:!1})}_setUpFormContainer(e){let i=this.form.get(e.path);RZ(i,e),i.updateValueAndValidity({emitEvent:!1})}_cleanUpFormContainer(e){if(this.form){let i=this.form.get(e.path);i&&f8e(i,e)&&i.updateValueAndValidity({emitEvent:!1})}}_updateRegistrations(){this.form._registerOnCollectionChange(this._onCollectionChange),this._oldForm&&this._oldForm._registerOnCollectionChange(()=>{})}_updateValidators(){nN(this.form,this),this._oldForm&&E5(this._oldForm,this)}static \u0275fac=function(i){return new(i||t)(DA(z0,10),DA(O4,10),DA(_B,8))};static \u0275dir=Oe({type:t,selectors:[["","formGroup",""]],hostBindings:function(i,n){i&1&&ee("submit",function(r){return n.onSubmit(r)})("reset",function(){return n.onReset()})},inputs:{form:[0,"formGroup","form"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],standalone:!1,features:[gt([b8e]),Ct,ti]})}return t})();var M8e={provide:rl,useExisting:zr(()=>lN)},lN=(()=>{class t extends rl{_ngModelWarningConfig;_added=!1;viewModel;control;name=null;set isDisabled(e){}model;update=new Ve;static _ngModelWarningSentOnce=!1;_ngModelWarningSent=!1;constructor(e,i,n,o,r){super(),this._ngModelWarningConfig=r,this._parent=e,this._setValidators(i),this._setAsyncValidators(n),this.valueAccessor=rN(this,o)}ngOnChanges(e){this._added||this._setUpControl(),oN(e,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))}ngOnDestroy(){this.formDirective&&this.formDirective.removeControl(this)}viewToModelUpdate(e){this.viewModel=e,this.update.emit(e)}get path(){return xZ(this.name==null?this.name:this.name.toString(),this._parent)}get formDirective(){return this._parent?this._parent.formDirective:null}_setUpControl(){this.control=this.formDirective.addControl(this),this._added=!0}static \u0275fac=function(i){return new(i||t)(DA(d2,13),DA(z0,10),DA(O4,10),DA(sl,10),DA(aN,8))};static \u0275dir=Oe({type:t,selectors:[["","formControlName",""]],inputs:{name:[0,"formControlName","name"],isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"]},outputs:{update:"ngModelChange"},standalone:!1,features:[gt([M8e]),Ct,ti]})}return t})();function S8e(t){return typeof t=="number"?t:parseFloat(t)}var k8e=(()=>{class t{_validator=c5;_onChange;_enabled;ngOnChanges(e){if(this.inputName in e){let i=this.normalizeInput(e[this.inputName].currentValue);this._enabled=this.enabled(i),this._validator=this._enabled?this.createValidator(i):c5,this._onChange&&this._onChange()}}validate(e){return this._validator(e)}registerOnValidatorChange(e){this._onChange=e}enabled(e){return e!=null}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,features:[ti]})}return t})();var x8e={provide:z0,useExisting:zr(()=>gN),multi:!0},gN=(()=>{class t extends k8e{min;inputName="min";normalizeInput=e=>S8e(e);createValidator=e=>EZ(e);static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275dir=Oe({type:t,selectors:[["input","type","number","min","","formControlName",""],["input","type","number","min","","formControl",""],["input","type","number","min","","ngModel",""]],hostVars:1,hostBindings:function(i,n){i&2&&AA("min",n._enabled?n.min:null)},inputs:{min:"min"},standalone:!1,features:[gt([x8e]),Ct]})}return t})();var FZ=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({})}return t})(),ZR=class extends kB{constructor(A,e,i){super(tN(e),iN(i,e)),this.controls=A,this._initObservables(),this._setUpdateStrategy(e),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}controls;at(A){return this.controls[this._adjustIndex(A)]}push(A,e={}){this.controls.push(A),this._registerControl(A),this.updateValueAndValidity({emitEvent:e.emitEvent}),this._onCollectionChange()}insert(A,e,i={}){this.controls.splice(A,0,e),this._registerControl(e),this.updateValueAndValidity({emitEvent:i.emitEvent})}removeAt(A,e={}){let i=this._adjustIndex(A);i<0&&(i=0),this.controls[i]&&this.controls[i]._registerOnCollectionChange(()=>{}),this.controls.splice(i,1),this.updateValueAndValidity({emitEvent:e.emitEvent})}setControl(A,e,i={}){let n=this._adjustIndex(A);n<0&&(n=0),this.controls[n]&&this.controls[n]._registerOnCollectionChange(()=>{}),this.controls.splice(n,1),e&&(this.controls.splice(n,0,e),this._registerControl(e)),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}get length(){return this.controls.length}setValue(A,e={}){kZ(this,!1,A),A.forEach((i,n)=>{SZ(this,!1,n),this.at(n).setValue(i,{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e)}patchValue(A,e={}){A!=null&&(A.forEach((i,n)=>{this.at(n)&&this.at(n).patchValue(i,{onlySelf:!0,emitEvent:e.emitEvent})}),this.updateValueAndValidity(e))}reset(A=[],e={}){this._forEachChild((i,n)=>{i.reset(A[n],{onlySelf:!0,emitEvent:e.emitEvent})}),this._updatePristine(e,this),this._updateTouched(e,this),this.updateValueAndValidity(e)}getRawValue(){return this.controls.map(A=>A.getRawValue())}clear(A={}){this.controls.length<1||(this._forEachChild(e=>e._registerOnCollectionChange(()=>{})),this.controls.splice(0),this.updateValueAndValidity({emitEvent:A.emitEvent}))}_adjustIndex(A){return A<0?A+this.length:A}_syncPendingControls(){let A=this.controls.reduce((e,i)=>i._syncPendingControls()?!0:e,!1);return A&&this.updateValueAndValidity({onlySelf:!0}),A}_forEachChild(A){this.controls.forEach((e,i)=>{A(e,i)})}_updateValue(){this.value=this.controls.filter(A=>A.enabled||this.disabled).map(A=>A.value)}_anyControls(A){return this.controls.some(e=>e.enabled&&A(e))}_setUpControls(){this._forEachChild(A=>this._registerControl(A))}_allControlsDisabled(){for(let A of this.controls)if(A.enabled)return!1;return this.controls.length>0||this.disabled}_registerControl(A){A.setParent(this),A._registerOnCollectionChange(this._onCollectionChange)}_find(A){return this.at(A)??null}};function uZ(t){return!!t&&(t.asyncValidators!==void 0||t.validators!==void 0||t.updateOn!==void 0)}var GZ=(()=>{class t{useNonNullable=!1;get nonNullable(){let e=new t;return e.useNonNullable=!0,e}group(e,i=null){let n=this._reduceControls(e),o={};return uZ(i)?o=i:i!==null&&(o.validators=i.validator,o.asyncValidators=i.asyncValidator),new xB(n,o)}record(e,i=null){let n=this._reduceControls(e);return new WR(n,i)}control(e,i,n){let o={};return this.useNonNullable?(uZ(i)?o=i:(o.validators=i,o.asyncValidators=n),new g2(e,_A(ae({},o),{nonNullable:!0}))):new g2(e,i,n)}array(e,i,n){let o=e.map(r=>this._createControl(r));return new ZR(o,i,n)}_reduceControls(e){let i={};return Object.keys(e).forEach(n=>{i[n]=this._createControl(e[n])}),i}_createControl(e){if(e instanceof g2)return e;if(e instanceof kB)return e;if(Array.isArray(e)){let i=e[0],n=e.length>1?e[1]:null,o=e.length>2?e[2]:null;return this.control(i,n,o)}else return this.control(e)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var Kn=(()=>{class t{static withConfig(e){return{ngModule:t,providers:[{provide:_B,useValue:e.callSetDisabledState??Q5}]}}static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({imports:[FZ]})}return t})(),RB=(()=>{class t{static withConfig(e){return{ngModule:t,providers:[{provide:aN,useValue:e.warnOnNgModelWithFormControl??"always"},{provide:_B,useValue:e.callSetDisabledState??Q5}]}}static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({imports:[FZ]})}return t})();var CN;try{CN=typeof Intl<"u"&&Intl.v8BreakIterator}catch{CN=!1}var mi=(()=>{class t{_platformId=E(O0);isBrowser=this._platformId?H0(this._platformId):typeof document=="object"&&!!document;EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent);TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent);BLINK=this.isBrowser&&!!(window.chrome||CN)&&typeof CSS<"u"&&!this.EDGE&&!this.TRIDENT;WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT;IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!("MSStream"in window);FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent);ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT;SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT;constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var NB,KZ=["color","button","checkbox","date","datetime-local","email","file","hidden","image","month","number","password","radio","range","reset","search","submit","tel","text","time","url","week"];function IN(){if(NB)return NB;if(typeof document!="object"||!document)return NB=new Set(KZ),NB;let t=document.createElement("input");return NB=new Set(KZ.filter(A=>(t.setAttribute("type",A),t.type===A))),NB}var Y4;function _8e(){if(Y4==null&&typeof window<"u")try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:()=>Y4=!0}))}finally{Y4=Y4||!1}return Y4}function Gl(t){return _8e()?t:!!t.capture}var Mg=function(t){return t[t.NORMAL=0]="NORMAL",t[t.NEGATED=1]="NEGATED",t[t.INVERTED=2]="INVERTED",t}(Mg||{}),m5,VI;function p5(){if(VI==null){if(typeof document!="object"||!document||typeof Element!="function"||!Element)return VI=!1,VI;if("scrollBehavior"in document.documentElement.style)VI=!0;else{let t=Element.prototype.scrollTo;t?VI=!/\{\s*\[native code\]\s*\}/.test(t.toString()):VI=!1}}return VI}function LB(){if(typeof document!="object"||!document)return Mg.NORMAL;if(m5==null){let t=document.createElement("div"),A=t.style;t.dir="rtl",A.width="1px",A.overflow="auto",A.visibility="hidden",A.pointerEvents="none",A.position="absolute";let e=document.createElement("div"),i=e.style;i.width="2px",i.height="1px",t.appendChild(e),document.body.appendChild(t),m5=Mg.NORMAL,t.scrollLeft===0&&(t.scrollLeft=1,m5=t.scrollLeft===0?Mg.NEGATED:Mg.INVERTED),t.remove()}return m5}var dN;function R8e(){if(dN==null){let t=typeof document<"u"?document.head:null;dN=!!(t&&(t.createShadowRoot||t.attachShadow))}return dN}function UZ(t){if(R8e()){let A=t.getRootNode?t.getRootNode():null;if(typeof ShadowRoot<"u"&&ShadowRoot&&A instanceof ShadowRoot)return A}return null}function FB(){let t=typeof document<"u"&&document?document.activeElement:null;for(;t&&t.shadowRoot;){let A=t.shadowRoot.activeElement;if(A===t)break;t=A}return t}function al(t){return t.composedPath?t.composedPath()[0]:t.target}function uN(){return typeof __karma__<"u"&&!!__karma__||typeof jasmine<"u"&&!!jasmine||typeof jest<"u"&&!!jest||typeof Mocha<"u"&&!!Mocha}function hN(t,A,e,i,n){let o=parseInt(NR.major),r=parseInt(NR.minor);return o>19||o===19&&r>0||o===0&&r===0?t.listen(A,e,i,n):(A.addEventListener(e,i,n),()=>{A.removeEventListener(e,i,n)})}var w5=new WeakMap,Wn=(()=>{class t{_appRef;_injector=E(Dt);_environmentInjector=E(Hr);load(e){let i=this._appRef=this._appRef||this._injector.get(fc),n=w5.get(i);n||(n={loaders:new Set,refs:[]},w5.set(i,n),i.onDestroy(()=>{w5.get(i)?.refs.forEach(o=>o.destroy()),w5.delete(i)})),n.loaders.has(e)||(n.loaders.add(e),n.refs.push(qw(e,{environmentInjector:this._environmentInjector})))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),qI=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["ng-component"]],exportAs:["cdkVisuallyHidden"],decls:0,vars:0,template:function(i,n){},styles:[".cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap;outline:0;-webkit-appearance:none;-moz-appearance:none;left:0}[dir=rtl] .cdk-visually-hidden{left:auto;right:0}"],encapsulation:2,changeDetection:0})}return t})();function Tr(t,...A){return A.length?A.some(e=>t[e]):t.altKey||t.shiftKey||t.ctrlKey||t.metaKey}function Sr(t){return t!=null&&`${t}`!="false"}function Za(t,A=0){return BN(t)?Number(t):arguments.length===2?A:0}function BN(t){return!isNaN(parseFloat(t))&&!isNaN(Number(t))}function GB(t){return Array.isArray(t)?t:[t]}function is(t){return t==null?"":typeof t=="string"?t:`${t}px`}function wc(t){return t instanceof eA?t.nativeElement:t}function N8e(t){if(t.type==="characterData"&&t.target instanceof Comment)return!0;if(t.type==="childList"){for(let A=0;A{class t{create(e){return typeof MutationObserver>"u"?null:new MutationObserver(e)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),OZ=(()=>{class t{_mutationObserverFactory=E(TZ);_observedElements=new Map;_ngZone=E(yA);constructor(){}ngOnDestroy(){this._observedElements.forEach((e,i)=>this._cleanupObserver(i))}observe(e){let i=wc(e);return new nt(n=>{let r=this._observeElement(i).pipe(aA(s=>s.filter(a=>!N8e(a))),$A(s=>!!s.length)).subscribe(s=>{this._ngZone.run(()=>{n.next(s)})});return()=>{r.unsubscribe(),this._unobserveElement(i)}})}_observeElement(e){return this._ngZone.runOutsideAngular(()=>{if(this._observedElements.has(e))this._observedElements.get(e).count++;else{let i=new je,n=this._mutationObserverFactory.create(o=>i.next(o));n&&n.observe(e,{characterData:!0,childList:!0,subtree:!0}),this._observedElements.set(e,{observer:n,stream:i,count:1})}return this._observedElements.get(e).stream})}_unobserveElement(e){this._observedElements.has(e)&&(this._observedElements.get(e).count--,this._observedElements.get(e).count||this._cleanupObserver(e))}_cleanupObserver(e){if(this._observedElements.has(e)){let{observer:i,stream:n}=this._observedElements.get(e);i&&i.disconnect(),n.complete(),this._observedElements.delete(e)}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),y5=(()=>{class t{_contentObserver=E(OZ);_elementRef=E(eA);event=new Ve;get disabled(){return this._disabled}set disabled(e){this._disabled=e,this._disabled?this._unsubscribe():this._subscribe()}_disabled=!1;get debounce(){return this._debounce}set debounce(e){this._debounce=Za(e),this._subscribe()}_debounce;_currentSubscription=null;constructor(){}ngAfterContentInit(){!this._currentSubscription&&!this.disabled&&this._subscribe()}ngOnDestroy(){this._unsubscribe()}_subscribe(){this._unsubscribe();let e=this._contentObserver.observe(this._elementRef);this._currentSubscription=(this.debounce?e.pipe(Ws(this.debounce)):e).subscribe(this.event)}_unsubscribe(){this._currentSubscription?.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","cdkObserveContent",""]],inputs:{disabled:[2,"cdkObserveContentDisabled","disabled",IA],debounce:"debounce"},outputs:{event:"cdkObserveContent"},exportAs:["cdkObserveContent"]})}return t})(),H4=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({providers:[TZ]})}return t})();var JZ=new Set,WI,L8e=(()=>{class t{_platform=E(mi);_nonce=E(E4,{optional:!0});_matchMedia;constructor(){this._matchMedia=this._platform.isBrowser&&window.matchMedia?window.matchMedia.bind(window):G8e}matchMedia(e){return(this._platform.WEBKIT||this._platform.BLINK)&&F8e(e,this._nonce),this._matchMedia(e)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function F8e(t,A){if(!JZ.has(t))try{WI||(WI=document.createElement("style"),A&&WI.setAttribute("nonce",A),WI.setAttribute("type","text/css"),document.head.appendChild(WI)),WI.sheet&&(WI.sheet.insertRule(`@media ${t} {body{ }}`,0),JZ.add(t))}catch(e){console.error(e)}}function G8e(t){return{matches:t==="all"||t==="",media:t,addListener:()=>{},removeListener:()=>{}}}var D5=(()=>{class t{_mediaMatcher=E(L8e);_zone=E(yA);_queries=new Map;_destroySubject=new je;constructor(){}ngOnDestroy(){this._destroySubject.next(),this._destroySubject.complete()}isMatched(e){return YZ(GB(e)).some(n=>this._registerQuery(n).mql.matches)}observe(e){let n=YZ(GB(e)).map(r=>this._registerQuery(r).observable),o=uc(n);return o=h1(o.pipe(Pn(1)),o.pipe(Pa(1),Ws(0))),o.pipe(aA(r=>{let s={matches:!1,breakpoints:{}};return r.forEach(({matches:a,query:c})=>{s.matches=s.matches||a,s.breakpoints[c]=a}),s}))}_registerQuery(e){if(this._queries.has(e))return this._queries.get(e);let i=this._mediaMatcher.matchMedia(e),o={observable:new nt(r=>{let s=a=>this._zone.run(()=>r.next(a));return i.addListener(s),()=>{i.removeListener(s)}}).pipe(In(i),aA(({matches:r})=>({query:e,matches:r})),mt(this._destroySubject)),mql:i};return this._queries.set(e,o),o}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function YZ(t){return t.map(A=>A.split(",")).reduce((A,e)=>A.concat(e)).map(A=>A.trim())}var HZ={XSmall:"(max-width: 599.98px)",Small:"(min-width: 600px) and (max-width: 959.98px)",Medium:"(min-width: 960px) and (max-width: 1279.98px)",Large:"(min-width: 1280px) and (max-width: 1919.98px)",XLarge:"(min-width: 1920px)",Handset:"(max-width: 599.98px) and (orientation: portrait), (max-width: 959.98px) and (orientation: landscape)",Tablet:"(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait), (min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)",Web:"(min-width: 840px) and (orientation: portrait), (min-width: 1280px) and (orientation: landscape)",HandsetPortrait:"(max-width: 599.98px) and (orientation: portrait)",TabletPortrait:"(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait)",WebPortrait:"(min-width: 840px) and (orientation: portrait)",HandsetLandscape:"(max-width: 959.98px) and (orientation: landscape)",TabletLandscape:"(min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)",WebLandscape:"(min-width: 1280px) and (orientation: landscape)"};var qZ=" ";function DN(t,A,e){let i=S5(t,A);e=e.trim(),!i.some(n=>n.trim()===e)&&(i.push(e),t.setAttribute(A,i.join(qZ)))}function _5(t,A,e){let i=S5(t,A);e=e.trim();let n=i.filter(o=>o!==e);n.length?t.setAttribute(A,n.join(qZ)):t.removeAttribute(A)}function S5(t,A){return t.getAttribute(A)?.match(/\S+/g)??[]}var WZ="cdk-describedby-message",v5="cdk-describedby-host",mN=0,ZZ=(()=>{class t{_platform=E(mi);_document=E(ht);_messageRegistry=new Map;_messagesContainer=null;_id=`${mN++}`;constructor(){E(Wn).load(qI),this._id=E(fB)+"-"+mN++}describe(e,i,n){if(!this._canBeDescribed(e,i))return;let o=EN(i,n);typeof i!="string"?(zZ(i,this._id),this._messageRegistry.set(o,{messageElement:i,referenceCount:0})):this._messageRegistry.has(o)||this._createMessageElement(i,n),this._isElementDescribedByMessage(e,o)||this._addMessageReference(e,o)}removeDescription(e,i,n){if(!i||!this._isElementNode(e))return;let o=EN(i,n);if(this._isElementDescribedByMessage(e,o)&&this._removeMessageReference(e,o),typeof i=="string"){let r=this._messageRegistry.get(o);r&&r.referenceCount===0&&this._deleteMessageElement(o)}this._messagesContainer?.childNodes.length===0&&(this._messagesContainer.remove(),this._messagesContainer=null)}ngOnDestroy(){let e=this._document.querySelectorAll(`[${v5}="${this._id}"]`);for(let i=0;in.indexOf(WZ)!=0);e.setAttribute("aria-describedby",i.join(" "))}_addMessageReference(e,i){let n=this._messageRegistry.get(i);DN(e,"aria-describedby",n.messageElement.id),e.setAttribute(v5,this._id),n.referenceCount++}_removeMessageReference(e,i){let n=this._messageRegistry.get(i);n.referenceCount--,_5(e,"aria-describedby",n.messageElement.id),e.removeAttribute(v5)}_isElementDescribedByMessage(e,i){let n=S5(e,"aria-describedby"),o=this._messageRegistry.get(i),r=o&&o.messageElement.id;return!!r&&n.indexOf(r)!=-1}_canBeDescribed(e,i){if(!this._isElementNode(e))return!1;if(i&&typeof i=="object")return!0;let n=i==null?"":`${i}`.trim(),o=e.getAttribute("aria-label");return n?!o||o.trim()!==n:!1}_isElementNode(e){return e.nodeType===this._document.ELEMENT_NODE}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function EN(t,A){return typeof t=="string"?`${A||""}/${t}`:t}function zZ(t,A){t.id||(t.id=`${WZ}-${A}-${mN++}`)}var Z8e=200,pN=class{_letterKeyStream=new je;_items=[];_selectedItemIndex=-1;_pressedLetters=[];_skipPredicateFn;_selectedItem=new je;selectedItem=this._selectedItem;constructor(A,e){let i=typeof e?.debounceInterval=="number"?e.debounceInterval:Z8e;e?.skipPredicate&&(this._skipPredicateFn=e.skipPredicate),this.setItems(A),this._setupKeyHandler(i)}destroy(){this._pressedLetters=[],this._letterKeyStream.complete(),this._selectedItem.complete()}setCurrentSelectedItemIndex(A){this._selectedItemIndex=A}setItems(A){this._items=A}handleKey(A){let e=A.keyCode;A.key&&A.key.length===1?this._letterKeyStream.next(A.key.toLocaleUpperCase()):(e>=65&&e<=90||e>=48&&e<=57)&&this._letterKeyStream.next(String.fromCharCode(e))}isTyping(){return this._pressedLetters.length>0}reset(){this._pressedLetters=[]}_setupKeyHandler(A){this._letterKeyStream.pipe(Pt(e=>this._pressedLetters.push(e)),Ws(A),$A(()=>this._pressedLetters.length>0),aA(()=>this._pressedLetters.join("").toLocaleUpperCase())).subscribe(e=>{for(let i=1;iA.disabled;constructor(A,e){this._items=A,A instanceof qa?this._itemChangesSubscription=A.changes.subscribe(i=>this._itemsChanged(i.toArray())):y1(A)&&(this._effectRef=pa(()=>this._itemsChanged(A()),{injector:e}))}tabOut=new je;change=new je;skipPredicate(A){return this._skipPredicateFn=A,this}withWrap(A=!0){return this._wrap=A,this}withVerticalOrientation(A=!0){return this._vertical=A,this}withHorizontalOrientation(A){return this._horizontal=A,this}withAllowedModifierKeys(A){return this._allowedModifierKeys=A,this}withTypeAhead(A=200){this._typeaheadSubscription.unsubscribe();let e=this._getItemsArray();return this._typeahead=new pN(e,{debounceInterval:typeof A=="number"?A:void 0,skipPredicate:i=>this._skipPredicateFn(i)}),this._typeaheadSubscription=this._typeahead.selectedItem.subscribe(i=>{this.setActiveItem(i)}),this}cancelTypeahead(){return this._typeahead?.reset(),this}withHomeAndEnd(A=!0){return this._homeAndEnd=A,this}withPageUpDown(A=!0,e=10){return this._pageUpAndDown={enabled:A,delta:e},this}setActiveItem(A){let e=this._activeItem();this.updateActiveItem(A),this._activeItem()!==e&&this.change.next(this._activeItemIndex)}onKeydown(A){let e=A.keyCode,n=["altKey","ctrlKey","metaKey","shiftKey"].every(o=>!A[o]||this._allowedModifierKeys.indexOf(o)>-1);switch(e){case 9:this.tabOut.next();return;case 40:if(this._vertical&&n){this.setNextItemActive();break}else return;case 38:if(this._vertical&&n){this.setPreviousItemActive();break}else return;case 39:if(this._horizontal&&n){this._horizontal==="rtl"?this.setPreviousItemActive():this.setNextItemActive();break}else return;case 37:if(this._horizontal&&n){this._horizontal==="rtl"?this.setNextItemActive():this.setPreviousItemActive();break}else return;case 36:if(this._homeAndEnd&&n){this.setFirstItemActive();break}else return;case 35:if(this._homeAndEnd&&n){this.setLastItemActive();break}else return;case 33:if(this._pageUpAndDown.enabled&&n){let o=this._activeItemIndex-this._pageUpAndDown.delta;this._setActiveItemByIndex(o>0?o:0,1);break}else return;case 34:if(this._pageUpAndDown.enabled&&n){let o=this._activeItemIndex+this._pageUpAndDown.delta,r=this._getItemsArray().length;this._setActiveItemByIndex(o-1&&i!==this._activeItemIndex&&(this._activeItemIndex=i,this._typeahead?.setCurrentSelectedItemIndex(i))}}},x5=class extends k5{setActiveItem(A){this.activeItem&&this.activeItem.setInactiveStyles(),super.setActiveItem(A),this.activeItem&&this.activeItem.setActiveStyles()}},C2=class extends k5{_origin="program";setFocusOrigin(A){return this._origin=A,this}setActiveItem(A){super.setActiveItem(A),this.activeItem&&this.activeItem.focus(this._origin)}};var z4=(()=>{class t{_platform=E(mi);constructor(){}isDisabled(e){return e.hasAttribute("disabled")}isVisible(e){return $8e(e)&&getComputedStyle(e).visibility==="visible"}isTabbable(e){if(!this._platform.isBrowser)return!1;let i=X8e(swe(e));if(i&&(PZ(i)===-1||!this.isVisible(i)))return!1;let n=e.nodeName.toLowerCase(),o=PZ(e);return e.hasAttribute("contenteditable")?o!==-1:n==="iframe"||n==="object"||this._platform.WEBKIT&&this._platform.IOS&&!owe(e)?!1:n==="audio"?e.hasAttribute("controls")?o!==-1:!1:n==="video"?o===-1?!1:o!==null?!0:this._platform.FIREFOX||e.hasAttribute("controls"):e.tabIndex>=0}isFocusable(e,i){return rwe(e)&&!this.isDisabled(e)&&(i?.ignoreVisibility||this.isVisible(e))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function X8e(t){try{return t.frameElement}catch{return null}}function $8e(t){return!!(t.offsetWidth||t.offsetHeight||typeof t.getClientRects=="function"&&t.getClientRects().length)}function ewe(t){let A=t.nodeName.toLowerCase();return A==="input"||A==="select"||A==="button"||A==="textarea"}function Awe(t){return iwe(t)&&t.type=="hidden"}function twe(t){return nwe(t)&&t.hasAttribute("href")}function iwe(t){return t.nodeName.toLowerCase()=="input"}function nwe(t){return t.nodeName.toLowerCase()=="a"}function XZ(t){if(!t.hasAttribute("tabindex")||t.tabIndex===void 0)return!1;let A=t.getAttribute("tabindex");return!!(A&&!isNaN(parseInt(A,10)))}function PZ(t){if(!XZ(t))return null;let A=parseInt(t.getAttribute("tabindex")||"",10);return isNaN(A)?-1:A}function owe(t){let A=t.nodeName.toLowerCase(),e=A==="input"&&t.type;return e==="text"||e==="password"||A==="select"||A==="textarea"}function rwe(t){return Awe(t)?!1:ewe(t)||twe(t)||t.hasAttribute("contenteditable")||XZ(t)}function swe(t){return t.ownerDocument&&t.ownerDocument.defaultView||window}var wN=class{_element;_checker;_ngZone;_document;_injector;_startAnchor;_endAnchor;_hasAttached=!1;startAnchorListener=()=>this.focusLastTabbableElement();endAnchorListener=()=>this.focusFirstTabbableElement();get enabled(){return this._enabled}set enabled(A){this._enabled=A,this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(A,this._startAnchor),this._toggleAnchorTabIndex(A,this._endAnchor))}_enabled=!0;constructor(A,e,i,n,o=!1,r){this._element=A,this._checker=e,this._ngZone=i,this._document=n,this._injector=r,o||this.attachAnchors()}destroy(){let A=this._startAnchor,e=this._endAnchor;A&&(A.removeEventListener("focus",this.startAnchorListener),A.remove()),e&&(e.removeEventListener("focus",this.endAnchorListener),e.remove()),this._startAnchor=this._endAnchor=null,this._hasAttached=!1}attachAnchors(){return this._hasAttached?!0:(this._ngZone.runOutsideAngular(()=>{this._startAnchor||(this._startAnchor=this._createAnchor(),this._startAnchor.addEventListener("focus",this.startAnchorListener)),this._endAnchor||(this._endAnchor=this._createAnchor(),this._endAnchor.addEventListener("focus",this.endAnchorListener))}),this._element.parentNode&&(this._element.parentNode.insertBefore(this._startAnchor,this._element),this._element.parentNode.insertBefore(this._endAnchor,this._element.nextSibling),this._hasAttached=!0),this._hasAttached)}focusInitialElementWhenReady(A){return new Promise(e=>{this._executeOnStable(()=>e(this.focusInitialElement(A)))})}focusFirstTabbableElementWhenReady(A){return new Promise(e=>{this._executeOnStable(()=>e(this.focusFirstTabbableElement(A)))})}focusLastTabbableElementWhenReady(A){return new Promise(e=>{this._executeOnStable(()=>e(this.focusLastTabbableElement(A)))})}_getRegionBoundary(A){let e=this._element.querySelectorAll(`[cdk-focus-region-${A}], [cdkFocusRegion${A}], [cdk-focus-${A}]`);return A=="start"?e.length?e[0]:this._getFirstTabbableElement(this._element):e.length?e[e.length-1]:this._getLastTabbableElement(this._element)}focusInitialElement(A){let e=this._element.querySelector("[cdk-focus-initial], [cdkFocusInitial]");if(e){if(!this._checker.isFocusable(e)){let i=this._getFirstTabbableElement(e);return i?.focus(A),!!i}return e.focus(A),!0}return this.focusFirstTabbableElement(A)}focusFirstTabbableElement(A){let e=this._getRegionBoundary("start");return e&&e.focus(A),!!e}focusLastTabbableElement(A){let e=this._getRegionBoundary("end");return e&&e.focus(A),!!e}hasAttached(){return this._hasAttached}_getFirstTabbableElement(A){if(this._checker.isFocusable(A)&&this._checker.isTabbable(A))return A;let e=A.children;for(let i=0;i=0;i--){let n=e[i].nodeType===this._document.ELEMENT_NODE?this._getLastTabbableElement(e[i]):null;if(n)return n}return null}_createAnchor(){let A=this._document.createElement("div");return this._toggleAnchorTabIndex(this._enabled,A),A.classList.add("cdk-visually-hidden"),A.classList.add("cdk-focus-trap-anchor"),A.setAttribute("aria-hidden","true"),A}_toggleAnchorTabIndex(A,e){A?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")}toggleAnchors(A){this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(A,this._startAnchor),this._toggleAnchorTabIndex(A,this._endAnchor))}_executeOnStable(A){this._injector?Gr(A,{injector:this._injector}):setTimeout(A)}},R5=(()=>{class t{_checker=E(z4);_ngZone=E(yA);_document=E(ht);_injector=E(Dt);constructor(){E(Wn).load(qI)}create(e,i=!1){return new wN(e,this._checker,this._ngZone,this._document,i,this._injector)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function P4(t){return t.buttons===0||t.detail===0}function j4(t){let A=t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0];return!!A&&A.identifier===-1&&(A.radiusX==null||A.radiusX===1)&&(A.radiusY==null||A.radiusY===1)}var awe=new re("cdk-input-modality-detector-options"),cwe={ignoreKeys:[18,17,224,91,16]},$Z=650,KB=Gl({passive:!0,capture:!0}),lwe=(()=>{class t{_platform=E(mi);modalityDetected;modalityChanged;get mostRecentModality(){return this._modality.value}_mostRecentTarget=null;_modality=new Mt(null);_options;_lastTouchMs=0;_onKeydown=e=>{this._options?.ignoreKeys?.some(i=>i===e.keyCode)||(this._modality.next("keyboard"),this._mostRecentTarget=al(e))};_onMousedown=e=>{Date.now()-this._lastTouchMs<$Z||(this._modality.next(P4(e)?"keyboard":"mouse"),this._mostRecentTarget=al(e))};_onTouchstart=e=>{if(j4(e)){this._modality.next("keyboard");return}this._lastTouchMs=Date.now(),this._modality.next("touch"),this._mostRecentTarget=al(e)};constructor(){let e=E(yA),i=E(ht),n=E(awe,{optional:!0});this._options=ae(ae({},cwe),n),this.modalityDetected=this._modality.pipe(Pa(1)),this.modalityChanged=this.modalityDetected.pipe(Ha()),this._platform.isBrowser&&e.runOutsideAngular(()=>{i.addEventListener("keydown",this._onKeydown,KB),i.addEventListener("mousedown",this._onMousedown,KB),i.addEventListener("touchstart",this._onTouchstart,KB)})}ngOnDestroy(){this._modality.complete(),this._platform.isBrowser&&(document.removeEventListener("keydown",this._onKeydown,KB),document.removeEventListener("mousedown",this._onMousedown,KB),document.removeEventListener("touchstart",this._onTouchstart,KB))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),gwe=new re("liveAnnouncerElement",{providedIn:"root",factory:dwe});function dwe(){return null}var Cwe=new re("LIVE_ANNOUNCER_DEFAULT_OPTIONS"),Iwe=0,N5=(()=>{class t{_ngZone=E(yA);_defaultOptions=E(Cwe,{optional:!0});_liveElement;_document=E(ht);_previousTimeout;_currentPromise;_currentResolve;constructor(){let e=E(gwe,{optional:!0});this._liveElement=e||this._createLiveElement()}announce(e,...i){let n=this._defaultOptions,o,r;return i.length===1&&typeof i[0]=="number"?r=i[0]:[o,r]=i,this.clear(),clearTimeout(this._previousTimeout),o||(o=n&&n.politeness?n.politeness:"polite"),r==null&&n&&(r=n.duration),this._liveElement.setAttribute("aria-live",o),this._liveElement.id&&this._exposeAnnouncerToModals(this._liveElement.id),this._ngZone.runOutsideAngular(()=>(this._currentPromise||(this._currentPromise=new Promise(s=>this._currentResolve=s)),clearTimeout(this._previousTimeout),this._previousTimeout=setTimeout(()=>{this._liveElement.textContent=e,typeof r=="number"&&(this._previousTimeout=setTimeout(()=>this.clear(),r)),this._currentResolve?.(),this._currentPromise=this._currentResolve=void 0},100),this._currentPromise))}clear(){this._liveElement&&(this._liveElement.textContent="")}ngOnDestroy(){clearTimeout(this._previousTimeout),this._liveElement?.remove(),this._liveElement=null,this._currentResolve?.(),this._currentPromise=this._currentResolve=void 0}_createLiveElement(){let e="cdk-live-announcer-element",i=this._document.getElementsByClassName(e),n=this._document.createElement("div");for(let o=0;o .cdk-overlay-container [aria-modal="true"]');for(let n=0;n{class t{_ngZone=E(yA);_platform=E(mi);_inputModalityDetector=E(lwe);_origin=null;_lastFocusOrigin;_windowFocused=!1;_windowFocusTimeoutId;_originTimeoutId;_originFromTouchInteraction=!1;_elementInfo=new Map;_monitoredElementCount=0;_rootNodeFocusListenerCount=new Map;_detectionMode;_windowFocusListener=()=>{this._windowFocused=!0,this._windowFocusTimeoutId=setTimeout(()=>this._windowFocused=!1)};_document=E(ht,{optional:!0});_stopInputModalityDetector=new je;constructor(){let e=E(uwe,{optional:!0});this._detectionMode=e?.detectionMode||M5.IMMEDIATE}_rootNodeFocusAndBlurListener=e=>{let i=al(e);for(let n=i;n;n=n.parentElement)e.type==="focus"?this._onFocus(e,n):this._onBlur(e,n)};monitor(e,i=!1){let n=wc(e);if(!this._platform.isBrowser||n.nodeType!==1)return dA();let o=UZ(n)||this._getDocument(),r=this._elementInfo.get(n);if(r)return i&&(r.checkChildren=!0),r.subject;let s={checkChildren:i,subject:new je,rootNode:o};return this._elementInfo.set(n,s),this._registerGlobalListeners(s),s.subject}stopMonitoring(e){let i=wc(e),n=this._elementInfo.get(i);n&&(n.subject.complete(),this._setClasses(i),this._elementInfo.delete(i),this._removeGlobalListeners(n))}focusVia(e,i,n){let o=wc(e),r=this._getDocument().activeElement;o===r?this._getClosestElementsInfo(o).forEach(([s,a])=>this._originChanged(s,i,a)):(this._setOrigin(i),typeof o.focus=="function"&&o.focus(n))}ngOnDestroy(){this._elementInfo.forEach((e,i)=>this.stopMonitoring(i))}_getDocument(){return this._document||document}_getWindow(){return this._getDocument().defaultView||window}_getFocusOrigin(e){return this._origin?this._originFromTouchInteraction?this._shouldBeAttributedToTouch(e)?"touch":"program":this._origin:this._windowFocused&&this._lastFocusOrigin?this._lastFocusOrigin:e&&this._isLastInteractionFromInputLabel(e)?"mouse":"program"}_shouldBeAttributedToTouch(e){return this._detectionMode===M5.EVENTUAL||!!e?.contains(this._inputModalityDetector._mostRecentTarget)}_setClasses(e,i){e.classList.toggle("cdk-focused",!!i),e.classList.toggle("cdk-touch-focused",i==="touch"),e.classList.toggle("cdk-keyboard-focused",i==="keyboard"),e.classList.toggle("cdk-mouse-focused",i==="mouse"),e.classList.toggle("cdk-program-focused",i==="program")}_setOrigin(e,i=!1){this._ngZone.runOutsideAngular(()=>{if(this._origin=e,this._originFromTouchInteraction=e==="touch"&&i,this._detectionMode===M5.IMMEDIATE){clearTimeout(this._originTimeoutId);let n=this._originFromTouchInteraction?$Z:1;this._originTimeoutId=setTimeout(()=>this._origin=null,n)}})}_onFocus(e,i){let n=this._elementInfo.get(i),o=al(e);!n||!n.checkChildren&&i!==o||this._originChanged(i,this._getFocusOrigin(o),n)}_onBlur(e,i){let n=this._elementInfo.get(i);!n||n.checkChildren&&e.relatedTarget instanceof Node&&i.contains(e.relatedTarget)||(this._setClasses(i),this._emitOrigin(n,null))}_emitOrigin(e,i){e.subject.observers.length&&this._ngZone.run(()=>e.subject.next(i))}_registerGlobalListeners(e){if(!this._platform.isBrowser)return;let i=e.rootNode,n=this._rootNodeFocusListenerCount.get(i)||0;n||this._ngZone.runOutsideAngular(()=>{i.addEventListener("focus",this._rootNodeFocusAndBlurListener,b5),i.addEventListener("blur",this._rootNodeFocusAndBlurListener,b5)}),this._rootNodeFocusListenerCount.set(i,n+1),++this._monitoredElementCount===1&&(this._ngZone.runOutsideAngular(()=>{this._getWindow().addEventListener("focus",this._windowFocusListener)}),this._inputModalityDetector.modalityDetected.pipe(mt(this._stopInputModalityDetector)).subscribe(o=>{this._setOrigin(o,!0)}))}_removeGlobalListeners(e){let i=e.rootNode;if(this._rootNodeFocusListenerCount.has(i)){let n=this._rootNodeFocusListenerCount.get(i);n>1?this._rootNodeFocusListenerCount.set(i,n-1):(i.removeEventListener("focus",this._rootNodeFocusAndBlurListener,b5),i.removeEventListener("blur",this._rootNodeFocusAndBlurListener,b5),this._rootNodeFocusListenerCount.delete(i))}--this._monitoredElementCount||(this._getWindow().removeEventListener("focus",this._windowFocusListener),this._stopInputModalityDetector.next(),clearTimeout(this._windowFocusTimeoutId),clearTimeout(this._originTimeoutId))}_originChanged(e,i,n){this._setClasses(e,i),this._emitOrigin(n,i),this._lastFocusOrigin=i}_getClosestElementsInfo(e){let i=[];return this._elementInfo.forEach((n,o)=>{(o===e||n.checkChildren&&o.contains(e))&&i.push([o,n])}),i}_isLastInteractionFromInputLabel(e){let{_mostRecentTarget:i,mostRecentModality:n}=this._inputModalityDetector;if(n!=="mouse"||!i||i===e||e.nodeName!=="INPUT"&&e.nodeName!=="TEXTAREA"||e.disabled)return!1;let o=e.labels;if(o){for(let r=0;r{class t{_elementRef=E(eA);_focusMonitor=E(ns);_monitorSubscription;_focusOrigin=null;cdkFocusChange=new Ve;constructor(){}get focusOrigin(){return this._focusOrigin}ngAfterViewInit(){let e=this._elementRef.nativeElement;this._monitorSubscription=this._focusMonitor.monitor(e,e.nodeType===1&&e.hasAttribute("cdkMonitorSubtreeFocus")).subscribe(i=>{this._focusOrigin=i,this.cdkFocusChange.emit(i)})}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef),this._monitorSubscription&&this._monitorSubscription.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","cdkMonitorElementFocus",""],["","cdkMonitorSubtreeFocus",""]],outputs:{cdkFocusChange:"cdkFocusChange"},exportAs:["cdkMonitorFocus"]})}return t})(),ZI=function(t){return t[t.NONE=0]="NONE",t[t.BLACK_ON_WHITE=1]="BLACK_ON_WHITE",t[t.WHITE_ON_BLACK=2]="WHITE_ON_BLACK",t}(ZI||{}),jZ="cdk-high-contrast-black-on-white",VZ="cdk-high-contrast-white-on-black",fN="cdk-high-contrast-active",vN=(()=>{class t{_platform=E(mi);_hasCheckedHighContrastMode;_document=E(ht);_breakpointSubscription;constructor(){this._breakpointSubscription=E(D5).observe("(forced-colors: active)").subscribe(()=>{this._hasCheckedHighContrastMode&&(this._hasCheckedHighContrastMode=!1,this._applyBodyHighContrastModeCssClasses())})}getHighContrastMode(){if(!this._platform.isBrowser)return ZI.NONE;let e=this._document.createElement("div");e.style.backgroundColor="rgb(1,2,3)",e.style.position="absolute",this._document.body.appendChild(e);let i=this._document.defaultView||window,n=i&&i.getComputedStyle?i.getComputedStyle(e):null,o=(n&&n.backgroundColor||"").replace(/ /g,"");switch(e.remove(),o){case"rgb(0,0,0)":case"rgb(45,50,54)":case"rgb(32,32,32)":return ZI.WHITE_ON_BLACK;case"rgb(255,255,255)":case"rgb(255,250,239)":return ZI.BLACK_ON_WHITE}return ZI.NONE}ngOnDestroy(){this._breakpointSubscription.unsubscribe()}_applyBodyHighContrastModeCssClasses(){if(!this._hasCheckedHighContrastMode&&this._platform.isBrowser&&this._document.body){let e=this._document.body.classList;e.remove(fN,jZ,VZ),this._hasCheckedHighContrastMode=!0;let i=this.getHighContrastMode();i===ZI.BLACK_ON_WHITE?e.add(fN,jZ):i===ZI.WHITE_ON_BLACK&&e.add(fN,VZ)}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),L5=(()=>{class t{constructor(){E(vN)._applyBodyHighContrastModeCssClasses()}static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({imports:[H4]})}return t})(),QN={},un=(()=>{class t{_appId=E(fB);getId(e){return this._appId!=="ng"&&(e+=this._appId),QN.hasOwnProperty(e)||(QN[e]=0),`${e}${QN[e]++}`}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var hwe=new re("cdk-dir-doc",{providedIn:"root",factory:Bwe});function Bwe(){return E(ht)}var Ewe=/^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;function fwe(t){let A=t?.toLowerCase()||"";return A==="auto"&&typeof navigator<"u"&&navigator?.language?Ewe.test(navigator.language)?"rtl":"ltr":A==="rtl"?"rtl":"ltr"}var Do=(()=>{class t{value="ltr";change=new Ve;constructor(){let e=E(hwe,{optional:!0});if(e){let i=e.body?e.body.dir:null,n=e.documentElement?e.documentElement.dir:null;this.value=fwe(i||n||"ltr")}}ngOnDestroy(){this.change.complete()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var N1=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({})}return t})();var Qwe=["text"],mwe=[[["mat-icon"]],"*"],pwe=["mat-icon","*"];function wwe(t,A){if(t&1&&ve(0,"mat-pseudo-checkbox",1),t&2){let e=M();te("disabled",e.disabled)("state",e.selected?"checked":"unchecked")}}function ywe(t,A){if(t&1&&ve(0,"mat-pseudo-checkbox",3),t&2){let e=M();te("disabled",e.disabled)}}function Dwe(t,A){if(t&1&&(m(0,"span",4),T(1),p()),t&2){let e=M();y(),FA("(",e.group.label,")")}}var vwe=["mat-internal-form-field",""],bwe=["*"];var ui=(()=>{class t{constructor(){E(vN)._applyBodyHighContrastModeCssClasses()}static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({imports:[N1,N1]})}return t})(),tu=class{_defaultMatcher;ngControl;_parentFormGroup;_parentForm;_stateChanges;errorState=!1;matcher;constructor(A,e,i,n,o){this._defaultMatcher=A,this.ngControl=e,this._parentFormGroup=i,this._parentForm=n,this._stateChanges=o}updateErrorState(){let A=this.errorState,e=this._parentFormGroup||this._parentForm,i=this.matcher||this._defaultMatcher,n=this.ngControl?this.ngControl.control:null,o=i?.isErrorState(n,e)??!1;o!==A&&(this.errorState=o,this._stateChanges.next())}};var TB=(()=>{class t{isErrorState(e,i){return!!(e&&e.invalid&&(e.touched||i&&i.submitted))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),Pr=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["structural-styles"]],decls:0,vars:0,template:function(i,n){},styles:['.mat-focus-indicator{position:relative}.mat-focus-indicator::before{top:0;left:0;right:0;bottom:0;position:absolute;box-sizing:border-box;pointer-events:none;display:var(--mat-focus-indicator-display, none);border-width:var(--mat-focus-indicator-border-width, 3px);border-style:var(--mat-focus-indicator-border-style, solid);border-color:var(--mat-focus-indicator-border-color, transparent);border-radius:var(--mat-focus-indicator-border-radius, 4px)}.mat-focus-indicator:focus::before{content:""}@media(forced-colors: active){html{--mat-focus-indicator-display: block}}'],encapsulation:2,changeDetection:0})}return t})();var Xa=function(t){return t[t.FADING_IN=0]="FADING_IN",t[t.VISIBLE=1]="VISIBLE",t[t.FADING_OUT=2]="FADING_OUT",t[t.HIDDEN=3]="HIDDEN",t}(Xa||{}),SN=class{_renderer;element;config;_animationForciblyDisabledThroughCss;state=Xa.HIDDEN;constructor(A,e,i,n=!1){this._renderer=A,this.element=e,this.config=i,this._animationForciblyDisabledThroughCss=n}fadeOut(){this._renderer.fadeOutRipple(this)}},AX=Gl({passive:!0,capture:!0}),kN=class{_events=new Map;addHandler(A,e,i,n){let o=this._events.get(e);if(o){let r=o.get(i);r?r.add(n):o.set(i,new Set([n]))}else this._events.set(e,new Map([[i,new Set([n])]])),A.runOutsideAngular(()=>{document.addEventListener(e,this._delegateEventHandler,AX)})}removeHandler(A,e,i){let n=this._events.get(A);if(!n)return;let o=n.get(e);o&&(o.delete(i),o.size===0&&n.delete(e),n.size===0&&(this._events.delete(A),document.removeEventListener(A,this._delegateEventHandler,AX)))}_delegateEventHandler=A=>{let e=al(A);e&&this._events.get(A.type)?.forEach((i,n)=>{(n===e||n.contains(e))&&i.forEach(o=>o.handleEvent(A))})}},G5={enterDuration:225,exitDuration:150},Mwe=800,tX=Gl({passive:!0,capture:!0}),iX=["mousedown","touchstart"],nX=["mouseup","mouseleave","touchend","touchcancel"],Swe=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["ng-component"]],hostAttrs:["mat-ripple-style-loader",""],decls:0,vars:0,template:function(i,n){},styles:[".mat-ripple{overflow:hidden;position:relative}.mat-ripple:not(:empty){transform:translateZ(0)}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0, 0, 0.2, 1);transform:scale3d(0, 0, 0);background-color:var(--mat-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface) 10%, transparent))}@media(forced-colors: active){.mat-ripple-element{display:none}}.cdk-drag-preview .mat-ripple-element,.cdk-drag-placeholder .mat-ripple-element{display:none}"],encapsulation:2,changeDetection:0})}return t})(),UB=class t{_target;_ngZone;_platform;_containerElement;_triggerElement;_isPointerDown=!1;_activeRipples=new Map;_mostRecentTransientRipple;_lastTouchStartEvent;_pointerUpEventsRegistered=!1;_containerRect;static _eventManager=new kN;constructor(A,e,i,n,o){this._target=A,this._ngZone=e,this._platform=n,n.isBrowser&&(this._containerElement=wc(i)),o&&o.get(Wn).load(Swe)}fadeInRipple(A,e,i={}){let n=this._containerRect=this._containerRect||this._containerElement.getBoundingClientRect(),o=ae(ae({},G5),i.animation);i.centered&&(A=n.left+n.width/2,e=n.top+n.height/2);let r=i.radius||kwe(A,e,n),s=A-n.left,a=e-n.top,c=o.enterDuration,l=document.createElement("div");l.classList.add("mat-ripple-element"),l.style.left=`${s-r}px`,l.style.top=`${a-r}px`,l.style.height=`${r*2}px`,l.style.width=`${r*2}px`,i.color!=null&&(l.style.backgroundColor=i.color),l.style.transitionDuration=`${c}ms`,this._containerElement.appendChild(l);let d=window.getComputedStyle(l),C=d.transitionProperty,I=d.transitionDuration,u=C==="none"||I==="0s"||I==="0s, 0s"||n.width===0&&n.height===0,h=new SN(this,l,i,u);l.style.transform="scale3d(1, 1, 1)",h.state=Xa.FADING_IN,i.persistent||(this._mostRecentTransientRipple=h);let B=null;return!u&&(c||o.exitDuration)&&this._ngZone.runOutsideAngular(()=>{let f=()=>{B&&(B.fallbackTimer=null),clearTimeout(k),this._finishRippleTransition(h)},b=()=>this._destroyRipple(h),k=setTimeout(b,c+100);l.addEventListener("transitionend",f),l.addEventListener("transitioncancel",b),B={onTransitionEnd:f,onTransitionCancel:b,fallbackTimer:k}}),this._activeRipples.set(h,B),(u||!c)&&this._finishRippleTransition(h),h}fadeOutRipple(A){if(A.state===Xa.FADING_OUT||A.state===Xa.HIDDEN)return;let e=A.element,i=ae(ae({},G5),A.config.animation);e.style.transitionDuration=`${i.exitDuration}ms`,e.style.opacity="0",A.state=Xa.FADING_OUT,(A._animationForciblyDisabledThroughCss||!i.exitDuration)&&this._finishRippleTransition(A)}fadeOutAll(){this._getActiveRipples().forEach(A=>A.fadeOut())}fadeOutAllNonPersistent(){this._getActiveRipples().forEach(A=>{A.config.persistent||A.fadeOut()})}setupTriggerEvents(A){let e=wc(A);!this._platform.isBrowser||!e||e===this._triggerElement||(this._removeTriggerEvents(),this._triggerElement=e,iX.forEach(i=>{t._eventManager.addHandler(this._ngZone,i,e,this)}))}handleEvent(A){A.type==="mousedown"?this._onMousedown(A):A.type==="touchstart"?this._onTouchStart(A):this._onPointerUp(),this._pointerUpEventsRegistered||(this._ngZone.runOutsideAngular(()=>{nX.forEach(e=>{this._triggerElement.addEventListener(e,this,tX)})}),this._pointerUpEventsRegistered=!0)}_finishRippleTransition(A){A.state===Xa.FADING_IN?this._startFadeOutTransition(A):A.state===Xa.FADING_OUT&&this._destroyRipple(A)}_startFadeOutTransition(A){let e=A===this._mostRecentTransientRipple,{persistent:i}=A.config;A.state=Xa.VISIBLE,!i&&(!e||!this._isPointerDown)&&A.fadeOut()}_destroyRipple(A){let e=this._activeRipples.get(A)??null;this._activeRipples.delete(A),this._activeRipples.size||(this._containerRect=null),A===this._mostRecentTransientRipple&&(this._mostRecentTransientRipple=null),A.state=Xa.HIDDEN,e!==null&&(A.element.removeEventListener("transitionend",e.onTransitionEnd),A.element.removeEventListener("transitioncancel",e.onTransitionCancel),e.fallbackTimer!==null&&clearTimeout(e.fallbackTimer)),A.element.remove()}_onMousedown(A){let e=P4(A),i=this._lastTouchStartEvent&&Date.now(){let e=A.state===Xa.VISIBLE||A.config.terminateOnPointerUp&&A.state===Xa.FADING_IN;!A.config.persistent&&e&&A.fadeOut()}))}_getActiveRipples(){return Array.from(this._activeRipples.keys())}_removeTriggerEvents(){let A=this._triggerElement;A&&(iX.forEach(e=>t._eventManager.removeHandler(e,A,this)),this._pointerUpEventsRegistered&&(nX.forEach(e=>A.removeEventListener(e,this,tX)),this._pointerUpEventsRegistered=!1))}};function kwe(t,A,e){let i=Math.max(Math.abs(t-e.left),Math.abs(t-e.right)),n=Math.max(Math.abs(A-e.top),Math.abs(A-e.bottom));return Math.sqrt(i*i+n*n)}var I2=new re("mat-ripple-global-options"),ec=(()=>{class t{_elementRef=E(eA);_animationMode=E(Oi,{optional:!0});color;unbounded;centered;radius=0;animation;get disabled(){return this._disabled}set disabled(e){e&&this.fadeOutAllNonPersistent(),this._disabled=e,this._setupTriggerEventsIfEnabled()}_disabled=!1;get trigger(){return this._trigger||this._elementRef.nativeElement}set trigger(e){this._trigger=e,this._setupTriggerEventsIfEnabled()}_trigger;_rippleRenderer;_globalOptions;_isInitialized=!1;constructor(){let e=E(yA),i=E(mi),n=E(I2,{optional:!0}),o=E(Dt);this._globalOptions=n||{},this._rippleRenderer=new UB(this,e,this._elementRef,i,o)}ngOnInit(){this._isInitialized=!0,this._setupTriggerEventsIfEnabled()}ngOnDestroy(){this._rippleRenderer._removeTriggerEvents()}fadeOutAll(){this._rippleRenderer.fadeOutAll()}fadeOutAllNonPersistent(){this._rippleRenderer.fadeOutAllNonPersistent()}get rippleConfig(){return{centered:this.centered,radius:this.radius,color:this.color,animation:ae(ae(ae({},this._globalOptions.animation),this._animationMode==="NoopAnimations"?{enterDuration:0,exitDuration:0}:{}),this.animation),terminateOnPointerUp:this._globalOptions.terminateOnPointerUp}}get rippleDisabled(){return this.disabled||!!this._globalOptions.disabled}_setupTriggerEventsIfEnabled(){!this.disabled&&this._isInitialized&&this._rippleRenderer.setupTriggerEvents(this.trigger)}launch(e,i=0,n){return typeof e=="number"?this._rippleRenderer.fadeInRipple(e,i,ae(ae({},this.rippleConfig),n)):this._rippleRenderer.fadeInRipple(0,0,ae(ae({},this.rippleConfig),e))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","mat-ripple",""],["","matRipple",""]],hostAttrs:[1,"mat-ripple"],hostVars:2,hostBindings:function(i,n){i&2&&iA("mat-ripple-unbounded",n.unbounded)},inputs:{color:[0,"matRippleColor","color"],unbounded:[0,"matRippleUnbounded","unbounded"],centered:[0,"matRippleCentered","centered"],radius:[0,"matRippleRadius","radius"],animation:[0,"matRippleAnimation","animation"],disabled:[0,"matRippleDisabled","disabled"],trigger:[0,"matRippleTrigger","trigger"]},exportAs:["matRipple"]})}return t})(),P0=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({imports:[ui,ui]})}return t})(),_N=(()=>{class t{_animationMode=E(Oi,{optional:!0});state="unchecked";disabled=!1;appearance="full";constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-pseudo-checkbox"]],hostAttrs:[1,"mat-pseudo-checkbox"],hostVars:12,hostBindings:function(i,n){i&2&&iA("mat-pseudo-checkbox-indeterminate",n.state==="indeterminate")("mat-pseudo-checkbox-checked",n.state==="checked")("mat-pseudo-checkbox-disabled",n.disabled)("mat-pseudo-checkbox-minimal",n.appearance==="minimal")("mat-pseudo-checkbox-full",n.appearance==="full")("_mat-animation-noopable",n._animationMode==="NoopAnimations")},inputs:{state:"state",disabled:"disabled",appearance:"appearance"},decls:0,vars:0,template:function(i,n){},styles:['.mat-pseudo-checkbox{border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:"";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox._mat-animation-noopable{transition:none !important;animation:none !important}.mat-pseudo-checkbox._mat-animation-noopable::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{left:1px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{left:1px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-minimal-pseudo-checkbox-selected-checkmark-color, var(--mat-sys-primary))}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-minimal-pseudo-checkbox-disabled-selected-checkmark-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full{border-color:var(--mat-full-pseudo-checkbox-unselected-icon-color, var(--mat-sys-on-surface-variant));border-width:2px;border-style:solid}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-disabled{border-color:var(--mat-full-pseudo-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate{background-color:var(--mat-full-pseudo-checkbox-selected-icon-color, var(--mat-sys-primary));border-color:rgba(0,0,0,0)}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-full-pseudo-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background-color:var(--mat-full-pseudo-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-full-pseudo-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}.mat-pseudo-checkbox{width:18px;height:18px}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after{width:14px;height:6px;transform-origin:center;top:-4.2426406871px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{top:8px;width:16px}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after{width:10px;height:4px;transform-origin:center;top:-2.8284271247px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{top:6px;width:12px}'],encapsulation:2,changeDetection:0})}return t})(),aX=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({imports:[ui]})}return t})(),RN=new re("MAT_OPTION_PARENT_COMPONENT"),NN=new re("MatOptgroup");var xN=class{source;isUserInput;constructor(A,e=!1){this.source=A,this.isUserInput=e}},Ac=(()=>{class t{_element=E(eA);_changeDetectorRef=E(ut);_parent=E(RN,{optional:!0});group=E(NN,{optional:!0});_signalDisableRipple=!1;_selected=!1;_active=!1;_disabled=!1;_mostRecentViewValue="";get multiple(){return this._parent&&this._parent.multiple}get selected(){return this._selected}value;id=E(un).getId("mat-option-");get disabled(){return this.group&&this.group.disabled||this._disabled}set disabled(e){this._disabled=e}get disableRipple(){return this._signalDisableRipple?this._parent.disableRipple():!!this._parent?.disableRipple}get hideSingleSelectionIndicator(){return!!(this._parent&&this._parent.hideSingleSelectionIndicator)}onSelectionChange=new Ve;_text;_stateChanges=new je;constructor(){let e=E(Wn);e.load(Pr),e.load(qI),this._signalDisableRipple=!!this._parent&&y1(this._parent.disableRipple)}get active(){return this._active}get viewValue(){return(this._text?.nativeElement.textContent||"").trim()}select(e=!0){this._selected||(this._selected=!0,this._changeDetectorRef.markForCheck(),e&&this._emitSelectionChangeEvent())}deselect(e=!0){this._selected&&(this._selected=!1,this._changeDetectorRef.markForCheck(),e&&this._emitSelectionChangeEvent())}focus(e,i){let n=this._getHostElement();typeof n.focus=="function"&&n.focus(i)}setActiveStyles(){this._active||(this._active=!0,this._changeDetectorRef.markForCheck())}setInactiveStyles(){this._active&&(this._active=!1,this._changeDetectorRef.markForCheck())}getLabel(){return this.viewValue}_handleKeydown(e){(e.keyCode===13||e.keyCode===32)&&!Tr(e)&&(this._selectViaInteraction(),e.preventDefault())}_selectViaInteraction(){this.disabled||(this._selected=this.multiple?!this._selected:!0,this._changeDetectorRef.markForCheck(),this._emitSelectionChangeEvent(!0))}_getTabIndex(){return this.disabled?"-1":"0"}_getHostElement(){return this._element.nativeElement}ngAfterViewChecked(){if(this._selected){let e=this.viewValue;e!==this._mostRecentViewValue&&(this._mostRecentViewValue&&this._stateChanges.next(),this._mostRecentViewValue=e)}}ngOnDestroy(){this._stateChanges.complete()}_emitSelectionChangeEvent(e=!1){this.onSelectionChange.emit(new xN(this,e))}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-option"]],viewQuery:function(i,n){if(i&1&&At(Qwe,7),i&2){let o;oA(o=rA())&&(n._text=o.first)}},hostAttrs:["role","option",1,"mat-mdc-option","mdc-list-item"],hostVars:11,hostBindings:function(i,n){i&1&&ee("click",function(){return n._selectViaInteraction()})("keydown",function(r){return n._handleKeydown(r)}),i&2&&(ea("id",n.id),AA("aria-selected",n.selected)("aria-disabled",n.disabled.toString()),iA("mdc-list-item--selected",n.selected)("mat-mdc-option-multiple",n.multiple)("mat-mdc-option-active",n.active)("mdc-list-item--disabled",n.disabled))},inputs:{value:"value",id:"id",disabled:[2,"disabled","disabled",IA]},outputs:{onSelectionChange:"onSelectionChange"},exportAs:["matOption"],ngContentSelectors:pwe,decls:8,vars:5,consts:[["text",""],["aria-hidden","true",1,"mat-mdc-option-pseudo-checkbox",3,"disabled","state"],[1,"mdc-list-item__primary-text"],["state","checked","aria-hidden","true","appearance","minimal",1,"mat-mdc-option-pseudo-checkbox",3,"disabled"],[1,"cdk-visually-hidden"],["aria-hidden","true","mat-ripple","",1,"mat-mdc-option-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled"]],template:function(i,n){i&1&&(Kt(mwe),ne(0,wwe,1,2,"mat-pseudo-checkbox",1),NA(1),m(2,"span",2,0),NA(4,1),p(),ne(5,ywe,1,1,"mat-pseudo-checkbox",3)(6,Dwe,2,1,"span",4),ve(7,"div",5)),i&2&&($(n.multiple?0:-1),y(5),$(!n.multiple&&n.selected&&!n.hideSingleSelectionIndicator?5:-1),y(),$(n.group&&n.group._inert?6:-1),y(),te("matRippleTrigger",n._getHostElement())("matRippleDisabled",n.disabled||n.disableRipple))},dependencies:[_N,ec],styles:['.mat-mdc-option{-webkit-user-select:none;user-select:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;min-height:48px;padding:0 16px;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0);color:var(--mat-option-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-option-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-option-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-option-label-text-size, var(--mat-sys-body-large-size));letter-spacing:var(--mat-option-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-option-label-text-weight, var(--mat-sys-body-large-weight))}.mat-mdc-option:hover:not(.mdc-list-item--disabled){background-color:var(--mat-option-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-option:focus.mdc-list-item,.mat-mdc-option.mat-mdc-option-active.mdc-list-item{background-color:var(--mat-option-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent));outline:0}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-multiple){background-color:var(--mat-option-selected-state-layer-color, var(--mat-sys-secondary-container))}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-multiple) .mdc-list-item__primary-text{color:var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option .mat-pseudo-checkbox{--mat-minimal-pseudo-checkbox-selected-checkmark-color: var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option.mdc-list-item{align-items:center;background:rgba(0,0,0,0)}.mat-mdc-option.mdc-list-item--disabled{cursor:default;pointer-events:none}.mat-mdc-option.mdc-list-item--disabled .mat-mdc-option-pseudo-checkbox,.mat-mdc-option.mdc-list-item--disabled .mdc-list-item__primary-text,.mat-mdc-option.mdc-list-item--disabled>mat-icon{opacity:.38}.mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:32px}[dir=rtl] .mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:16px;padding-right:32px}.mat-mdc-option .mat-icon,.mat-mdc-option .mat-pseudo-checkbox-full{margin-right:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-icon,[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-full{margin-right:0;margin-left:16px}.mat-mdc-option .mat-pseudo-checkbox-minimal{margin-left:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-minimal{margin-right:16px;margin-left:0}.mat-mdc-option .mat-mdc-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-mdc-option .mdc-list-item__primary-text{white-space:normal;font-size:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;font-family:inherit;text-decoration:inherit;text-transform:inherit;margin-right:auto}[dir=rtl] .mat-mdc-option .mdc-list-item__primary-text{margin-right:0;margin-left:auto}@media(forced-colors: active){.mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{content:"";position:absolute;top:50%;right:16px;transform:translateY(-50%);width:10px;height:0;border-bottom:solid 10px;border-radius:10px}[dir=rtl] .mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{right:auto;left:16px}}.mat-mdc-option-multiple{--mdc-list-list-item-selected-container-color:var(--mdc-list-list-item-container-color, transparent)}.mat-mdc-option-active .mat-focus-indicator::before{content:""}'],encapsulation:2,changeDetection:0})}return t})();function cX(t,A,e){if(e.length){let i=A.toArray(),n=e.toArray(),o=0;for(let r=0;re+i?Math.max(0,t-i+A):e}var LN=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({imports:[P0,ui,aX]})}return t})(),oX={capture:!0},rX=["focus","mousedown","mouseenter","touchstart"],bN="mat-ripple-loader-uninitialized",MN="mat-ripple-loader-class-name",sX="mat-ripple-loader-centered",F5="mat-ripple-loader-disabled",K5=(()=>{class t{_document=E(ht,{optional:!0});_animationMode=E(Oi,{optional:!0});_globalRippleOptions=E(I2,{optional:!0});_platform=E(mi);_ngZone=E(yA);_injector=E(Dt);_hosts=new Map;constructor(){this._ngZone.runOutsideAngular(()=>{for(let e of rX)this._document?.addEventListener(e,this._onInteraction,oX)})}ngOnDestroy(){let e=this._hosts.keys();for(let i of e)this.destroyRipple(i);for(let i of rX)this._document?.removeEventListener(i,this._onInteraction,oX)}configureRipple(e,i){e.setAttribute(bN,this._globalRippleOptions?.namespace??""),(i.className||!e.hasAttribute(MN))&&e.setAttribute(MN,i.className||""),i.centered&&e.setAttribute(sX,""),i.disabled&&e.setAttribute(F5,"")}setDisabled(e,i){let n=this._hosts.get(e);n?(n.target.rippleDisabled=i,!i&&!n.hasSetUpEvents&&(n.hasSetUpEvents=!0,n.renderer.setupTriggerEvents(e))):i?e.setAttribute(F5,""):e.removeAttribute(F5)}_onInteraction=e=>{let i=al(e);if(i instanceof HTMLElement){let n=i.closest(`[${bN}="${this._globalRippleOptions?.namespace??""}"]`);n&&this._createRipple(n)}};_createRipple(e){if(!this._document||this._hosts.has(e))return;e.querySelector(".mat-ripple")?.remove();let i=this._document.createElement("span");i.classList.add("mat-ripple",e.getAttribute(MN)),e.append(i);let n=this._animationMode==="NoopAnimations",o=this._globalRippleOptions,r=n?0:o?.animation?.enterDuration??G5.enterDuration,s=n?0:o?.animation?.exitDuration??G5.exitDuration,a={rippleDisabled:n||o?.disabled||e.hasAttribute(F5),rippleConfig:{centered:e.hasAttribute(sX),terminateOnPointerUp:o?.terminateOnPointerUp,animation:{enterDuration:r,exitDuration:s}}},c=new UB(a,this._ngZone,i,this._platform,this._injector),l=!a.rippleDisabled;l&&c.setupTriggerEvents(e),this._hosts.set(e,{target:a,renderer:c,hasSetUpEvents:l}),e.removeAttribute(bN)}destroyRipple(e){let i=this._hosts.get(e);i&&(i.renderer._removeTriggerEvents(),this._hosts.delete(e))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),U5=(()=>{class t{labelPosition;static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["div","mat-internal-form-field",""]],hostAttrs:[1,"mdc-form-field","mat-internal-form-field"],hostVars:2,hostBindings:function(i,n){i&2&&iA("mdc-form-field--align-end",n.labelPosition==="before")},inputs:{labelPosition:"labelPosition"},attrs:vwe,ngContentSelectors:bwe,decls:1,vars:0,template:function(i,n){i&1&&(Kt(),NA(0))},styles:[".mat-internal-form-field{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-flex;align-items:center;vertical-align:middle}.mat-internal-form-field>label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0;order:0}[dir=rtl] .mat-internal-form-field>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px}.mdc-form-field--align-end>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px;order:-1}[dir=rtl] .mdc-form-field--align-end .mdc-form-field--align-end label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0}"],encapsulation:2,changeDetection:0})}return t})();var _we=["mat-button",""],FN=[[["",8,"material-icons",3,"iconPositionEnd",""],["mat-icon",3,"iconPositionEnd",""],["","matButtonIcon","",3,"iconPositionEnd",""]],"*",[["","iconPositionEnd","",8,"material-icons"],["mat-icon","iconPositionEnd",""],["","matButtonIcon","","iconPositionEnd",""]]],GN=[".material-icons:not([iconPositionEnd]), mat-icon:not([iconPositionEnd]), [matButtonIcon]:not([iconPositionEnd])","*",".material-icons[iconPositionEnd], mat-icon[iconPositionEnd], [matButtonIcon][iconPositionEnd]"];var Rwe="@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-icon-button.mat-mdc-icon-button{outline:solid 1px}}",Nwe=["mat-fab",""],Lwe=["mat-mini-fab",""],Fwe='.mat-mdc-fab-base{-webkit-user-select:none;user-select:none;position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:56px;height:56px;padding:0;border:none;fill:currentColor;text-decoration:none;cursor:pointer;-moz-appearance:none;-webkit-appearance:none;overflow:visible;transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1),opacity 15ms linear 30ms,transform 270ms 0ms cubic-bezier(0, 0, 0.2, 1);flex-shrink:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-fab-base .mat-mdc-button-ripple,.mat-mdc-fab-base .mat-mdc-button-persistent-ripple,.mat-mdc-fab-base .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-fab-base .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-fab-base .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-fab-base .mdc-button__label,.mat-mdc-fab-base .mat-icon{z-index:1;position:relative}.mat-mdc-fab-base .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute}.mat-mdc-fab-base:focus>.mat-focus-indicator::before{content:""}.mat-mdc-fab-base._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-fab-base::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mat-mdc-fab-base[hidden]{display:none}.mat-mdc-fab-base::-moz-focus-inner{padding:0;border:0}.mat-mdc-fab-base:active,.mat-mdc-fab-base:focus{outline:none}.mat-mdc-fab-base:hover{cursor:pointer}.mat-mdc-fab-base>svg{width:100%}.mat-mdc-fab-base .mat-icon,.mat-mdc-fab-base .material-icons{transition:transform 180ms 90ms cubic-bezier(0, 0, 0.2, 1);fill:currentColor;will-change:transform}.mat-mdc-fab-base .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-fab-base[disabled],.mat-mdc-fab-base.mat-mdc-button-disabled{cursor:default;pointer-events:none}.mat-mdc-fab-base[disabled],.mat-mdc-fab-base[disabled]:focus,.mat-mdc-fab-base.mat-mdc-button-disabled,.mat-mdc-fab-base.mat-mdc-button-disabled:focus{box-shadow:none}.mat-mdc-fab-base.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-fab{background-color:var(--mdc-fab-container-color, var(--mat-sys-primary-container));border-radius:var(--mdc-fab-container-shape, var(--mat-sys-corner-large));color:var(--mat-fab-foreground-color, var(--mat-sys-on-primary-container, inherit));box-shadow:var(--mdc-fab-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab:hover{box-shadow:var(--mdc-fab-hover-container-elevation-shadow, var(--mat-sys-level4))}.mat-mdc-fab:focus{box-shadow:var(--mdc-fab-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab:active,.mat-mdc-fab:focus:active{box-shadow:var(--mdc-fab-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab[disabled],.mat-mdc-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-fab-disabled-state-foreground-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-fab-disabled-state-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-fab .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:50%;width:48px;transform:translate(-50%, -50%);display:var(--mat-fab-touch-target-display, block)}.mat-mdc-fab .mat-ripple-element{background-color:var(--mat-fab-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-fab .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-state-layer-color, var(--mat-sys-on-primary-container))}.mat-mdc-fab.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-disabled-state-layer-color)}.mat-mdc-fab:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-fab.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-fab.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-fab.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-fab:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-mini-fab{width:40px;height:40px;background-color:var(--mdc-fab-small-container-color, var(--mat-sys-primary-container));border-radius:var(--mdc-fab-small-container-shape, var(--mat-sys-corner-medium));color:var(--mat-fab-small-foreground-color, var(--mat-sys-on-primary-container, inherit));box-shadow:var(--mdc-fab-small-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab:hover{box-shadow:var(--mdc-fab-small-hover-container-elevation-shadow, var(--mat-sys-level4))}.mat-mdc-mini-fab:focus{box-shadow:var(--mdc-fab-small-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab:active,.mat-mdc-mini-fab:focus:active{box-shadow:var(--mdc-fab-small-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab[disabled],.mat-mdc-mini-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-fab-small-disabled-state-foreground-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-fab-small-disabled-state-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-mini-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-mini-fab .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:50%;width:48px;transform:translate(-50%, -50%);display:var(--mat-fab-small-touch-target-display)}.mat-mdc-mini-fab .mat-ripple-element{background-color:var(--mat-fab-small-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-mini-fab .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-small-state-layer-color, var(--mat-sys-on-primary-container))}.mat-mdc-mini-fab.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-small-disabled-state-layer-color)}.mat-mdc-mini-fab:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-mini-fab.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-mini-fab.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-mini-fab.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-mini-fab:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-extended-fab{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;border-radius:24px;padding-left:20px;padding-right:20px;width:auto;max-width:100%;line-height:normal;height:var(--mdc-extended-fab-container-height, 56px);border-radius:var(--mdc-extended-fab-container-shape, var(--mat-sys-corner-large));font-family:var(--mdc-extended-fab-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-extended-fab-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mdc-extended-fab-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mdc-extended-fab-label-text-tracking, var(--mat-sys-label-large-tracking));box-shadow:var(--mdc-extended-fab-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab:hover{box-shadow:var(--mdc-extended-fab-hover-container-elevation-shadow, var(--mat-sys-level4))}.mat-mdc-extended-fab:focus{box-shadow:var(--mdc-extended-fab-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab:active,.mat-mdc-extended-fab:focus:active{box-shadow:var(--mdc-extended-fab-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab[disabled],.mat-mdc-extended-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none}.mat-mdc-extended-fab[disabled],.mat-mdc-extended-fab[disabled]:focus,.mat-mdc-extended-fab.mat-mdc-button-disabled,.mat-mdc-extended-fab.mat-mdc-button-disabled:focus{box-shadow:none}.mat-mdc-extended-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}[dir=rtl] .mat-mdc-extended-fab .mdc-button__label+.mat-icon,[dir=rtl] .mat-mdc-extended-fab .mdc-button__label+.material-icons,.mat-mdc-extended-fab>.mat-icon,.mat-mdc-extended-fab>.material-icons{margin-left:-8px;margin-right:12px}.mat-mdc-extended-fab .mdc-button__label+.mat-icon,.mat-mdc-extended-fab .mdc-button__label+.material-icons,[dir=rtl] .mat-mdc-extended-fab>.mat-icon,[dir=rtl] .mat-mdc-extended-fab>.material-icons{margin-left:12px;margin-right:-8px}.mat-mdc-extended-fab .mat-mdc-button-touch-target{width:100%}',Gwe=["mat-icon-button",""],Kwe=["*"];var Uwe=new re("MAT_BUTTON_CONFIG");var Twe=[{attribute:"mat-button",mdcClasses:["mdc-button","mat-mdc-button"]},{attribute:"mat-flat-button",mdcClasses:["mdc-button","mdc-button--unelevated","mat-mdc-unelevated-button"]},{attribute:"mat-raised-button",mdcClasses:["mdc-button","mdc-button--raised","mat-mdc-raised-button"]},{attribute:"mat-stroked-button",mdcClasses:["mdc-button","mdc-button--outlined","mat-mdc-outlined-button"]},{attribute:"mat-fab",mdcClasses:["mdc-fab","mat-mdc-fab-base","mat-mdc-fab"]},{attribute:"mat-mini-fab",mdcClasses:["mdc-fab","mat-mdc-fab-base","mdc-fab--mini","mat-mdc-mini-fab"]},{attribute:"mat-icon-button",mdcClasses:["mdc-icon-button","mat-mdc-icon-button"]}],O5=(()=>{class t{_elementRef=E(eA);_ngZone=E(yA);_animationMode=E(Oi,{optional:!0});_focusMonitor=E(ns);_rippleLoader=E(K5);_isFab=!1;color;get disableRipple(){return this._disableRipple}set disableRipple(e){this._disableRipple=e,this._updateRippleDisabled()}_disableRipple=!1;get disabled(){return this._disabled}set disabled(e){this._disabled=e,this._updateRippleDisabled()}_disabled=!1;ariaDisabled;disabledInteractive;constructor(){E(Wn).load(Pr);let e=E(Uwe,{optional:!0}),i=this._elementRef.nativeElement,n=i.classList;this.disabledInteractive=e?.disabledInteractive??!1,this.color=e?.color??null,this._rippleLoader?.configureRipple(i,{className:"mat-mdc-button-ripple"});for(let{attribute:o,mdcClasses:r}of Twe)i.hasAttribute(o)&&n.add(...r)}ngAfterViewInit(){this._focusMonitor.monitor(this._elementRef,!0)}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef),this._rippleLoader?.destroyRipple(this._elementRef.nativeElement)}focus(e="program",i){e?this._focusMonitor.focusVia(this._elementRef.nativeElement,e,i):this._elementRef.nativeElement.focus(i)}_getAriaDisabled(){return this.ariaDisabled!=null?this.ariaDisabled:this.disabled&&this.disabledInteractive?!0:null}_getDisabledAttribute(){return this.disabledInteractive||!this.disabled?null:!0}_updateRippleDisabled(){this._rippleLoader?.setDisabled(this._elementRef.nativeElement,this.disableRipple||this.disabled)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,inputs:{color:"color",disableRipple:[2,"disableRipple","disableRipple",IA],disabled:[2,"disabled","disabled",IA],ariaDisabled:[2,"aria-disabled","ariaDisabled",IA],disabledInteractive:[2,"disabledInteractive","disabledInteractive",IA]}})}return t})();var Un=(()=>{class t extends O5{static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275cmp=xe({type:t,selectors:[["button","mat-button",""],["button","mat-raised-button",""],["button","mat-flat-button",""],["button","mat-stroked-button",""]],hostVars:14,hostBindings:function(i,n){i&2&&(AA("disabled",n._getDisabledAttribute())("aria-disabled",n._getAriaDisabled()),Lo(n.color?"mat-"+n.color:""),iA("mat-mdc-button-disabled",n.disabled)("mat-mdc-button-disabled-interactive",n.disabledInteractive)("_mat-animation-noopable",n._animationMode==="NoopAnimations")("mat-unthemed",!n.color)("mat-mdc-button-base",!0))},exportAs:["matButton"],features:[Ct],attrs:_we,ngContentSelectors:GN,decls:7,vars:4,consts:[[1,"mat-mdc-button-persistent-ripple"],[1,"mdc-button__label"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(i,n){i&1&&(Kt(FN),ve(0,"span",0),NA(1),m(2,"span",1),NA(3,1),p(),NA(4,2),ve(5,"span",2)(6,"span",3)),i&2&&iA("mdc-button__ripple",!n._isFab)("mdc-fab__ripple",n._isFab)},styles:['.mat-mdc-button-base{text-decoration:none}.mdc-button{-webkit-user-select:none;user-select:none;position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:64px;border:none;outline:none;line-height:inherit;-webkit-appearance:none;overflow:visible;vertical-align:middle;background:rgba(0,0,0,0);padding:0 8px}.mdc-button::-moz-focus-inner{padding:0;border:0}.mdc-button:active{outline:none}.mdc-button:hover{cursor:pointer}.mdc-button:disabled{cursor:default;pointer-events:none}.mdc-button[hidden]{display:none}.mdc-button .mdc-button__label{position:relative}.mat-mdc-button{padding:0 var(--mat-text-button-horizontal-padding, 12px);height:var(--mdc-text-button-container-height, 40px);font-family:var(--mdc-text-button-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-text-button-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mdc-text-button-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mdc-text-button-label-text-transform);font-weight:var(--mdc-text-button-label-text-weight, var(--mat-sys-label-large-weight))}.mat-mdc-button,.mat-mdc-button .mdc-button__ripple{border-radius:var(--mdc-text-button-container-shape, var(--mat-sys-corner-full))}.mat-mdc-button:not(:disabled){color:var(--mdc-text-button-label-text-color, var(--mat-sys-primary))}.mat-mdc-button[disabled],.mat-mdc-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-text-button-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-button:has(.material-icons,mat-icon,[matButtonIcon]){padding:0 var(--mat-text-button-with-icon-horizontal-padding, 16px)}.mat-mdc-button>.mat-icon{margin-right:var(--mat-text-button-icon-spacing, 8px);margin-left:var(--mat-text-button-icon-offset, -4px)}[dir=rtl] .mat-mdc-button>.mat-icon{margin-right:var(--mat-text-button-icon-offset, -4px);margin-left:var(--mat-text-button-icon-spacing, 8px)}.mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-text-button-icon-offset, -4px);margin-left:var(--mat-text-button-icon-spacing, 8px)}[dir=rtl] .mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-text-button-icon-spacing, 8px);margin-left:var(--mat-text-button-icon-offset, -4px)}.mat-mdc-button .mat-ripple-element{background-color:var(--mat-text-button-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-text-button-state-layer-color, var(--mat-sys-primary))}.mat-mdc-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-text-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-text-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-text-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-text-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:0;right:0;transform:translateY(-50%);display:var(--mat-text-button-touch-target-display, block)}.mat-mdc-unelevated-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mdc-filled-button-container-height, 40px);font-family:var(--mdc-filled-button-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-filled-button-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mdc-filled-button-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mdc-filled-button-label-text-transform);font-weight:var(--mdc-filled-button-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-filled-button-horizontal-padding, 24px)}.mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-filled-button-icon-spacing, 8px);margin-left:var(--mat-filled-button-icon-offset, -8px)}[dir=rtl] .mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-filled-button-icon-offset, -8px);margin-left:var(--mat-filled-button-icon-spacing, 8px)}.mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-filled-button-icon-offset, -8px);margin-left:var(--mat-filled-button-icon-spacing, 8px)}[dir=rtl] .mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-filled-button-icon-spacing, 8px);margin-left:var(--mat-filled-button-icon-offset, -8px)}.mat-mdc-unelevated-button .mat-ripple-element{background-color:var(--mat-filled-button-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-filled-button-state-layer-color, var(--mat-sys-on-primary))}.mat-mdc-unelevated-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-filled-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-unelevated-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-filled-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-unelevated-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-filled-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-unelevated-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-filled-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-unelevated-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:0;right:0;transform:translateY(-50%);display:var(--mat-filled-button-touch-target-display, block)}.mat-mdc-unelevated-button:not(:disabled){color:var(--mdc-filled-button-label-text-color, var(--mat-sys-on-primary));background-color:var(--mdc-filled-button-container-color, var(--mat-sys-primary))}.mat-mdc-unelevated-button,.mat-mdc-unelevated-button .mdc-button__ripple{border-radius:var(--mdc-filled-button-container-shape, var(--mat-sys-corner-full))}.mat-mdc-unelevated-button[disabled],.mat-mdc-unelevated-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-filled-button-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mdc-filled-button-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-raised-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);box-shadow:var(--mdc-protected-button-container-elevation-shadow, var(--mat-sys-level1));height:var(--mdc-protected-button-container-height, 40px);font-family:var(--mdc-protected-button-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-protected-button-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mdc-protected-button-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mdc-protected-button-label-text-transform);font-weight:var(--mdc-protected-button-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-protected-button-horizontal-padding, 24px)}.mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-protected-button-icon-spacing, 8px);margin-left:var(--mat-protected-button-icon-offset, -8px)}[dir=rtl] .mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-protected-button-icon-offset, -8px);margin-left:var(--mat-protected-button-icon-spacing, 8px)}.mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-protected-button-icon-offset, -8px);margin-left:var(--mat-protected-button-icon-spacing, 8px)}[dir=rtl] .mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-protected-button-icon-spacing, 8px);margin-left:var(--mat-protected-button-icon-offset, -8px)}.mat-mdc-raised-button .mat-ripple-element{background-color:var(--mat-protected-button-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-protected-button-state-layer-color, var(--mat-sys-primary))}.mat-mdc-raised-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-protected-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-raised-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-protected-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-raised-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-protected-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-raised-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-protected-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-raised-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:0;right:0;transform:translateY(-50%);display:var(--mat-protected-button-touch-target-display, block)}.mat-mdc-raised-button:not(:disabled){color:var(--mdc-protected-button-label-text-color, var(--mat-sys-primary));background-color:var(--mdc-protected-button-container-color, var(--mat-sys-surface))}.mat-mdc-raised-button,.mat-mdc-raised-button .mdc-button__ripple{border-radius:var(--mdc-protected-button-container-shape, var(--mat-sys-corner-full))}.mat-mdc-raised-button:hover{box-shadow:var(--mdc-protected-button-hover-container-elevation-shadow, var(--mat-sys-level2))}.mat-mdc-raised-button:focus{box-shadow:var(--mdc-protected-button-focus-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button:active,.mat-mdc-raised-button:focus:active{box-shadow:var(--mdc-protected-button-pressed-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button[disabled],.mat-mdc-raised-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-protected-button-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mdc-protected-button-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-raised-button[disabled].mat-mdc-button-disabled,.mat-mdc-raised-button.mat-mdc-button-disabled.mat-mdc-button-disabled{box-shadow:var(--mdc-protected-button-disabled-container-elevation-shadow, var(--mat-sys-level0))}.mat-mdc-raised-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-outlined-button{border-style:solid;transition:border 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mdc-outlined-button-container-height, 40px);font-family:var(--mdc-outlined-button-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-outlined-button-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mdc-outlined-button-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mdc-outlined-button-label-text-transform);font-weight:var(--mdc-outlined-button-label-text-weight, var(--mat-sys-label-large-weight));border-radius:var(--mdc-outlined-button-container-shape, var(--mat-sys-corner-full));border-width:var(--mdc-outlined-button-outline-width, 1px);padding:0 var(--mat-outlined-button-horizontal-padding, 24px)}.mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-outlined-button-icon-spacing, 8px);margin-left:var(--mat-outlined-button-icon-offset, -8px)}[dir=rtl] .mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-outlined-button-icon-offset, -8px);margin-left:var(--mat-outlined-button-icon-spacing, 8px)}.mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-outlined-button-icon-offset, -8px);margin-left:var(--mat-outlined-button-icon-spacing, 8px)}[dir=rtl] .mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-outlined-button-icon-spacing, 8px);margin-left:var(--mat-outlined-button-icon-offset, -8px)}.mat-mdc-outlined-button .mat-ripple-element{background-color:var(--mat-outlined-button-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-outlined-button-state-layer-color, var(--mat-sys-primary))}.mat-mdc-outlined-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-outlined-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-outlined-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-outlined-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-outlined-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-outlined-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-outlined-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-outlined-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-outlined-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:0;right:0;transform:translateY(-50%);display:var(--mat-outlined-button-touch-target-display, block)}.mat-mdc-outlined-button:not(:disabled){color:var(--mdc-outlined-button-label-text-color, var(--mat-sys-primary));border-color:var(--mdc-outlined-button-outline-color, var(--mat-sys-outline))}.mat-mdc-outlined-button[disabled],.mat-mdc-outlined-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-outlined-button-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:var(--mdc-outlined-button-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-outlined-button .mdc-button__ripple{border-width:var(--mdc-outlined-button-outline-width, 1px);border-style:solid;border-color:rgba(0,0,0,0)}.mat-mdc-button,.mat-mdc-unelevated-button,.mat-mdc-raised-button,.mat-mdc-outlined-button{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-button .mdc-button__label,.mat-mdc-button .mat-icon,.mat-mdc-unelevated-button .mdc-button__label,.mat-mdc-unelevated-button .mat-icon,.mat-mdc-raised-button .mdc-button__label,.mat-mdc-raised-button .mat-icon,.mat-mdc-outlined-button .mdc-button__label,.mat-mdc-outlined-button .mat-icon{z-index:1;position:relative}.mat-mdc-button .mat-focus-indicator,.mat-mdc-unelevated-button .mat-focus-indicator,.mat-mdc-raised-button .mat-focus-indicator,.mat-mdc-outlined-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute}.mat-mdc-button:focus>.mat-focus-indicator::before,.mat-mdc-unelevated-button:focus>.mat-focus-indicator::before,.mat-mdc-raised-button:focus>.mat-focus-indicator::before,.mat-mdc-outlined-button:focus>.mat-focus-indicator::before{content:""}.mat-mdc-button._mat-animation-noopable,.mat-mdc-unelevated-button._mat-animation-noopable,.mat-mdc-raised-button._mat-animation-noopable,.mat-mdc-outlined-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-button>.mat-icon,.mat-mdc-unelevated-button>.mat-icon,.mat-mdc-raised-button>.mat-icon,.mat-mdc-outlined-button>.mat-icon{display:inline-block;position:relative;vertical-align:top;font-size:1.125rem;height:1.125rem;width:1.125rem}.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mdc-button__ripple{top:-1px;left:-1px;bottom:-1px;right:-1px}.mat-mdc-unelevated-button .mat-focus-indicator::before,.mat-mdc-raised-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-outlined-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 3px)*-1)}',"@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-icon-button.mat-mdc-icon-button{outline:solid 1px}}"],encapsulation:2,changeDetection:0})}return t})();var gX=new re("mat-mdc-fab-default-options",{providedIn:"root",factory:dX});function dX(){return{color:"accent"}}var T5=dX(),CX=(()=>{class t extends O5{_options=E(gX,{optional:!0});_isFab=!0;extended;constructor(){super(),this._options=this._options||T5,this.color=this._options.color||T5.color}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["button","mat-fab",""]],hostVars:18,hostBindings:function(i,n){i&2&&(AA("disabled",n._getDisabledAttribute())("aria-disabled",n._getAriaDisabled()),Lo(n.color?"mat-"+n.color:""),iA("mat-mdc-button-disabled",n.disabled)("mat-mdc-button-disabled-interactive",n.disabledInteractive)("_mat-animation-noopable",n._animationMode==="NoopAnimations")("mat-unthemed",!n.color)("mat-mdc-button-base",!0)("mdc-fab--extended",n.extended)("mat-mdc-extended-fab",n.extended))},inputs:{extended:[2,"extended","extended",IA]},exportAs:["matButton"],features:[Ct],attrs:Nwe,ngContentSelectors:GN,decls:7,vars:4,consts:[[1,"mat-mdc-button-persistent-ripple"],[1,"mdc-button__label"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(i,n){i&1&&(Kt(FN),ve(0,"span",0),NA(1),m(2,"span",1),NA(3,1),p(),NA(4,2),ve(5,"span",2)(6,"span",3)),i&2&&iA("mdc-button__ripple",!n._isFab)("mdc-fab__ripple",n._isFab)},styles:['.mat-mdc-fab-base{-webkit-user-select:none;user-select:none;position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:56px;height:56px;padding:0;border:none;fill:currentColor;text-decoration:none;cursor:pointer;-moz-appearance:none;-webkit-appearance:none;overflow:visible;transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1),opacity 15ms linear 30ms,transform 270ms 0ms cubic-bezier(0, 0, 0.2, 1);flex-shrink:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-fab-base .mat-mdc-button-ripple,.mat-mdc-fab-base .mat-mdc-button-persistent-ripple,.mat-mdc-fab-base .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-fab-base .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-fab-base .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-fab-base .mdc-button__label,.mat-mdc-fab-base .mat-icon{z-index:1;position:relative}.mat-mdc-fab-base .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute}.mat-mdc-fab-base:focus>.mat-focus-indicator::before{content:""}.mat-mdc-fab-base._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-fab-base::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mat-mdc-fab-base[hidden]{display:none}.mat-mdc-fab-base::-moz-focus-inner{padding:0;border:0}.mat-mdc-fab-base:active,.mat-mdc-fab-base:focus{outline:none}.mat-mdc-fab-base:hover{cursor:pointer}.mat-mdc-fab-base>svg{width:100%}.mat-mdc-fab-base .mat-icon,.mat-mdc-fab-base .material-icons{transition:transform 180ms 90ms cubic-bezier(0, 0, 0.2, 1);fill:currentColor;will-change:transform}.mat-mdc-fab-base .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-fab-base[disabled],.mat-mdc-fab-base.mat-mdc-button-disabled{cursor:default;pointer-events:none}.mat-mdc-fab-base[disabled],.mat-mdc-fab-base[disabled]:focus,.mat-mdc-fab-base.mat-mdc-button-disabled,.mat-mdc-fab-base.mat-mdc-button-disabled:focus{box-shadow:none}.mat-mdc-fab-base.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-fab{background-color:var(--mdc-fab-container-color, var(--mat-sys-primary-container));border-radius:var(--mdc-fab-container-shape, var(--mat-sys-corner-large));color:var(--mat-fab-foreground-color, var(--mat-sys-on-primary-container, inherit));box-shadow:var(--mdc-fab-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab:hover{box-shadow:var(--mdc-fab-hover-container-elevation-shadow, var(--mat-sys-level4))}.mat-mdc-fab:focus{box-shadow:var(--mdc-fab-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab:active,.mat-mdc-fab:focus:active{box-shadow:var(--mdc-fab-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab[disabled],.mat-mdc-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-fab-disabled-state-foreground-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-fab-disabled-state-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-fab .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:50%;width:48px;transform:translate(-50%, -50%);display:var(--mat-fab-touch-target-display, block)}.mat-mdc-fab .mat-ripple-element{background-color:var(--mat-fab-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-fab .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-state-layer-color, var(--mat-sys-on-primary-container))}.mat-mdc-fab.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-disabled-state-layer-color)}.mat-mdc-fab:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-fab.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-fab.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-fab.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-fab:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-mini-fab{width:40px;height:40px;background-color:var(--mdc-fab-small-container-color, var(--mat-sys-primary-container));border-radius:var(--mdc-fab-small-container-shape, var(--mat-sys-corner-medium));color:var(--mat-fab-small-foreground-color, var(--mat-sys-on-primary-container, inherit));box-shadow:var(--mdc-fab-small-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab:hover{box-shadow:var(--mdc-fab-small-hover-container-elevation-shadow, var(--mat-sys-level4))}.mat-mdc-mini-fab:focus{box-shadow:var(--mdc-fab-small-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab:active,.mat-mdc-mini-fab:focus:active{box-shadow:var(--mdc-fab-small-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab[disabled],.mat-mdc-mini-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-fab-small-disabled-state-foreground-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-fab-small-disabled-state-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-mini-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-mini-fab .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:50%;width:48px;transform:translate(-50%, -50%);display:var(--mat-fab-small-touch-target-display)}.mat-mdc-mini-fab .mat-ripple-element{background-color:var(--mat-fab-small-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-mini-fab .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-small-state-layer-color, var(--mat-sys-on-primary-container))}.mat-mdc-mini-fab.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-small-disabled-state-layer-color)}.mat-mdc-mini-fab:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-mini-fab.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-mini-fab.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-mini-fab.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-mini-fab:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-extended-fab{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;border-radius:24px;padding-left:20px;padding-right:20px;width:auto;max-width:100%;line-height:normal;height:var(--mdc-extended-fab-container-height, 56px);border-radius:var(--mdc-extended-fab-container-shape, var(--mat-sys-corner-large));font-family:var(--mdc-extended-fab-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-extended-fab-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mdc-extended-fab-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mdc-extended-fab-label-text-tracking, var(--mat-sys-label-large-tracking));box-shadow:var(--mdc-extended-fab-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab:hover{box-shadow:var(--mdc-extended-fab-hover-container-elevation-shadow, var(--mat-sys-level4))}.mat-mdc-extended-fab:focus{box-shadow:var(--mdc-extended-fab-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab:active,.mat-mdc-extended-fab:focus:active{box-shadow:var(--mdc-extended-fab-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab[disabled],.mat-mdc-extended-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none}.mat-mdc-extended-fab[disabled],.mat-mdc-extended-fab[disabled]:focus,.mat-mdc-extended-fab.mat-mdc-button-disabled,.mat-mdc-extended-fab.mat-mdc-button-disabled:focus{box-shadow:none}.mat-mdc-extended-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}[dir=rtl] .mat-mdc-extended-fab .mdc-button__label+.mat-icon,[dir=rtl] .mat-mdc-extended-fab .mdc-button__label+.material-icons,.mat-mdc-extended-fab>.mat-icon,.mat-mdc-extended-fab>.material-icons{margin-left:-8px;margin-right:12px}.mat-mdc-extended-fab .mdc-button__label+.mat-icon,.mat-mdc-extended-fab .mdc-button__label+.material-icons,[dir=rtl] .mat-mdc-extended-fab>.mat-icon,[dir=rtl] .mat-mdc-extended-fab>.material-icons{margin-left:12px;margin-right:-8px}.mat-mdc-extended-fab .mat-mdc-button-touch-target{width:100%}'],encapsulation:2,changeDetection:0})}return t})(),J5=(()=>{class t extends O5{_options=E(gX,{optional:!0});_isFab=!0;constructor(){super(),this._options=this._options||T5,this.color=this._options.color||T5.color}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["button","mat-mini-fab",""]],hostVars:14,hostBindings:function(i,n){i&2&&(AA("disabled",n._getDisabledAttribute())("aria-disabled",n._getAriaDisabled()),Lo(n.color?"mat-"+n.color:""),iA("mat-mdc-button-disabled",n.disabled)("mat-mdc-button-disabled-interactive",n.disabledInteractive)("_mat-animation-noopable",n._animationMode==="NoopAnimations")("mat-unthemed",!n.color)("mat-mdc-button-base",!0))},exportAs:["matButton"],features:[Ct],attrs:Lwe,ngContentSelectors:GN,decls:7,vars:4,consts:[[1,"mat-mdc-button-persistent-ripple"],[1,"mdc-button__label"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(i,n){i&1&&(Kt(FN),ve(0,"span",0),NA(1),m(2,"span",1),NA(3,1),p(),NA(4,2),ve(5,"span",2)(6,"span",3)),i&2&&iA("mdc-button__ripple",!n._isFab)("mdc-fab__ripple",n._isFab)},styles:[Fwe],encapsulation:2,changeDetection:0})}return t})();var ya=(()=>{class t extends O5{constructor(){super(),this._rippleLoader.configureRipple(this._elementRef.nativeElement,{centered:!0})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["button","mat-icon-button",""]],hostVars:14,hostBindings:function(i,n){i&2&&(AA("disabled",n._getDisabledAttribute())("aria-disabled",n._getAriaDisabled()),Lo(n.color?"mat-"+n.color:""),iA("mat-mdc-button-disabled",n.disabled)("mat-mdc-button-disabled-interactive",n.disabledInteractive)("_mat-animation-noopable",n._animationMode==="NoopAnimations")("mat-unthemed",!n.color)("mat-mdc-button-base",!0))},exportAs:["matButton"],features:[Ct],attrs:Gwe,ngContentSelectors:Kwe,decls:4,vars:0,consts:[[1,"mat-mdc-button-persistent-ripple","mdc-icon-button__ripple"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(i,n){i&1&&(Kt(),ve(0,"span",0),NA(1),ve(2,"span",1)(3,"span",2))},styles:['.mat-mdc-icon-button{-webkit-user-select:none;user-select:none;display:inline-block;position:relative;box-sizing:border-box;border:none;outline:none;background-color:rgba(0,0,0,0);fill:currentColor;color:inherit;text-decoration:none;cursor:pointer;z-index:0;overflow:visible;border-radius:50%;flex-shrink:0;text-align:center;width:var(--mdc-icon-button-state-layer-size, 40px);height:var(--mdc-icon-button-state-layer-size, 40px);padding:calc(calc(var(--mdc-icon-button-state-layer-size, 40px) - var(--mdc-icon-button-icon-size, 24px)) / 2);font-size:var(--mdc-icon-button-icon-size, 24px);color:var(--mdc-icon-button-icon-color, var(--mat-sys-on-surface-variant));-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-icon-button .mat-mdc-button-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-icon-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-icon-button .mdc-button__label,.mat-mdc-icon-button .mat-icon{z-index:1;position:relative}.mat-mdc-icon-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute}.mat-mdc-icon-button:focus>.mat-focus-indicator::before{content:""}.mat-mdc-icon-button .mat-ripple-element{background-color:var(--mat-icon-button-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface-variant) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-icon-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-icon-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-icon-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:50%;width:48px;transform:translate(-50%, -50%);display:var(--mat-icon-button-touch-target-display, block)}.mat-mdc-icon-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-icon-button[disabled],.mat-mdc-icon-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-icon-button-disabled-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-icon-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-icon-button img,.mat-mdc-icon-button svg{width:var(--mdc-icon-button-icon-size, 24px);height:var(--mdc-icon-button-icon-size, 24px);vertical-align:baseline}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple{border-radius:50%}.mat-mdc-icon-button[hidden]{display:none}.mat-mdc-icon-button.mat-unthemed:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-primary:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-accent:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-warn:not(.mdc-ripple-upgraded):focus::before{background:rgba(0,0,0,0);opacity:1}',Rwe],encapsulation:2,changeDetection:0})}return t})();var j0=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({imports:[ui,P0,ui]})}return t})();var UN=class{_box;_destroyed=new je;_resizeSubject=new je;_resizeObserver;_elementObservables=new Map;constructor(A){this._box=A,typeof ResizeObserver<"u"&&(this._resizeObserver=new ResizeObserver(e=>this._resizeSubject.next(e)))}observe(A){return this._elementObservables.has(A)||this._elementObservables.set(A,new nt(e=>{let i=this._resizeSubject.subscribe(e);return this._resizeObserver?.observe(A,{box:this._box}),()=>{this._resizeObserver?.unobserve(A),i.unsubscribe(),this._elementObservables.delete(A)}}).pipe($A(e=>e.some(i=>i.target===A)),za({bufferSize:1,refCount:!0}),mt(this._destroyed))),this._elementObservables.get(A)}destroy(){this._destroyed.next(),this._destroyed.complete(),this._resizeSubject.complete(),this._elementObservables.clear()}},Y5=(()=>{class t{_cleanupErrorListener;_observers=new Map;_ngZone=E(yA);constructor(){typeof ResizeObserver<"u"}ngOnDestroy(){for(let[,e]of this._observers)e.destroy();this._observers.clear(),this._cleanupErrorListener?.()}observe(e,i){let n=i?.box||"content-box";return this._observers.has(n)||this._observers.set(n,new UN(n)),this._observers.get(n).observe(e)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var pi=function(t){return t[t.State=0]="State",t[t.Transition=1]="Transition",t[t.Sequence=2]="Sequence",t[t.Group=3]="Group",t[t.Animate=4]="Animate",t[t.Keyframes=5]="Keyframes",t[t.Style=6]="Style",t[t.Trigger=7]="Trigger",t[t.Reference=8]="Reference",t[t.AnimateChild=9]="AnimateChild",t[t.AnimateRef=10]="AnimateRef",t[t.Query=11]="Query",t[t.Stagger=12]="Stagger",t}(pi||{}),Kl="*";function ll(t,A){return{type:pi.Trigger,name:t,definitions:A,options:{}}}function ia(t,A=null){return{type:pi.Animate,styles:A,timings:t}}function IX(t,A=null){return{type:pi.Sequence,steps:t,options:A}}function Vo(t){return{type:pi.Style,styles:t,offset:null}}function tc(t,A,e){return{type:pi.State,name:t,styles:A,options:e}}function Fs(t,A,e=null){return{type:pi.Transition,expr:t,animation:A,options:e}}function TN(t=null){return{type:pi.AnimateChild,options:t}}function ON(t,A,e=null){return{type:pi.Query,selector:t,animation:A,options:e}}var V0=class{_onDoneFns=[];_onStartFns=[];_onDestroyFns=[];_originalOnDoneFns=[];_originalOnStartFns=[];_started=!1;_destroyed=!1;_finished=!1;_position=0;parentPlayer=null;totalTime;constructor(A=0,e=0){this.totalTime=A+e}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(A=>A()),this._onDoneFns=[])}onStart(A){this._originalOnStartFns.push(A),this._onStartFns.push(A)}onDone(A){this._originalOnDoneFns.push(A),this._onDoneFns.push(A)}onDestroy(A){this._onDestroyFns.push(A)}hasStarted(){return this._started}init(){}play(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0}triggerMicrotask(){queueMicrotask(()=>this._onFinish())}_onStart(){this._onStartFns.forEach(A=>A()),this._onStartFns=[]}pause(){}restart(){}finish(){this._onFinish()}destroy(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(A=>A()),this._onDestroyFns=[])}reset(){this._started=!1,this._finished=!1,this._onStartFns=this._originalOnStartFns,this._onDoneFns=this._originalOnDoneFns}setPosition(A){this._position=this.totalTime?A*this.totalTime:1}getPosition(){return this.totalTime?this._position/this.totalTime:1}triggerCallback(A){let e=A=="start"?this._onStartFns:this._onDoneFns;e.forEach(i=>i()),e.length=0}},iu=class{_onDoneFns=[];_onStartFns=[];_finished=!1;_started=!1;_destroyed=!1;_onDestroyFns=[];parentPlayer=null;totalTime=0;players;constructor(A){this.players=A;let e=0,i=0,n=0,o=this.players.length;o==0?queueMicrotask(()=>this._onFinish()):this.players.forEach(r=>{r.onDone(()=>{++e==o&&this._onFinish()}),r.onDestroy(()=>{++i==o&&this._onDestroy()}),r.onStart(()=>{++n==o&&this._onStart()})}),this.totalTime=this.players.reduce((r,s)=>Math.max(r,s.totalTime),0)}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(A=>A()),this._onDoneFns=[])}init(){this.players.forEach(A=>A.init())}onStart(A){this._onStartFns.push(A)}_onStart(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach(A=>A()),this._onStartFns=[])}onDone(A){this._onDoneFns.push(A)}onDestroy(A){this._onDestroyFns.push(A)}hasStarted(){return this._started}play(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(A=>A.play())}pause(){this.players.forEach(A=>A.pause())}restart(){this.players.forEach(A=>A.restart())}finish(){this._onFinish(),this.players.forEach(A=>A.finish())}destroy(){this._onDestroy()}_onDestroy(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(A=>A.destroy()),this._onDestroyFns.forEach(A=>A()),this._onDestroyFns=[])}reset(){this.players.forEach(A=>A.reset()),this._destroyed=!1,this._finished=!1,this._started=!1}setPosition(A){let e=A*this.totalTime;this.players.forEach(i=>{let n=i.totalTime?Math.min(1,e/i.totalTime):1;i.setPosition(n)})}getPosition(){let A=this.players.reduce((e,i)=>e===null||i.totalTime>e.totalTime?i:e,null);return A!=null?A.getPosition():0}beforeDestroy(){this.players.forEach(A=>{A.beforeDestroy&&A.beforeDestroy()})}triggerCallback(A){let e=A=="start"?this._onStartFns:this._onDoneFns;e.forEach(i=>i()),e.length=0}},OB="!";var Owe=["notch"],Jwe=["matFormFieldNotchedOutline",""],Ywe=["*"],Hwe=["textField"],zwe=["iconPrefixContainer"],Pwe=["textPrefixContainer"],jwe=["iconSuffixContainer"],Vwe=["textSuffixContainer"],qwe=["*",[["mat-label"]],[["","matPrefix",""],["","matIconPrefix",""]],[["","matTextPrefix",""]],[["","matTextSuffix",""]],[["","matSuffix",""],["","matIconSuffix",""]],[["mat-error"],["","matError",""]],[["mat-hint",3,"align","end"]],[["mat-hint","align","end"]]],Wwe=["*","mat-label","[matPrefix], [matIconPrefix]","[matTextPrefix]","[matTextSuffix]","[matSuffix], [matIconSuffix]","mat-error, [matError]","mat-hint:not([align='end'])","mat-hint[align='end']"];function Zwe(t,A){t&1&&ve(0,"span",21)}function Xwe(t,A){if(t&1&&(m(0,"label",20),NA(1,1),ne(2,Zwe,1,0,"span",21),p()),t&2){let e=M(2);te("floating",e._shouldLabelFloat())("monitorResize",e._hasOutline())("id",e._labelId),AA("for",e._control.disableAutomaticLabeling?null:e._control.id),y(2),$(!e.hideRequiredMarker&&e._control.required?2:-1)}}function $we(t,A){if(t&1&&ne(0,Xwe,3,5,"label",20),t&2){let e=M();$(e._hasFloatingLabel()?0:-1)}}function e5e(t,A){t&1&&ve(0,"div",7)}function A5e(t,A){}function t5e(t,A){if(t&1&&ne(0,A5e,0,0,"ng-template",13),t&2){M(2);let e=Ji(1);te("ngTemplateOutlet",e)}}function i5e(t,A){if(t&1&&(m(0,"div",9),ne(1,t5e,1,1,null,13),p()),t&2){let e=M();te("matFormFieldNotchedOutlineOpen",e._shouldLabelFloat()),y(),$(e._forceDisplayInfixLabel()?-1:1)}}function n5e(t,A){t&1&&(m(0,"div",10,2),NA(2,2),p())}function o5e(t,A){t&1&&(m(0,"div",11,3),NA(2,3),p())}function r5e(t,A){}function s5e(t,A){if(t&1&&ne(0,r5e,0,0,"ng-template",13),t&2){M();let e=Ji(1);te("ngTemplateOutlet",e)}}function a5e(t,A){t&1&&(m(0,"div",14,4),NA(2,4),p())}function c5e(t,A){t&1&&(m(0,"div",15,5),NA(2,5),p())}function l5e(t,A){t&1&&ve(0,"div",16)}function g5e(t,A){if(t&1&&(m(0,"div",18),NA(1,6),p()),t&2){let e=M();te("@transitionMessages",e._subscriptAnimationState)}}function d5e(t,A){if(t&1&&(m(0,"mat-hint",22),T(1),p()),t&2){let e=M(2);te("id",e._hintLabelId),y(),Pe(e.hintLabel)}}function C5e(t,A){if(t&1&&(m(0,"div",19),ne(1,d5e,2,2,"mat-hint",22),NA(2,7),ve(3,"div",23),NA(4,8),p()),t&2){let e=M();te("@transitionMessages",e._subscriptAnimationState),y(),$(e.hintLabel?1:-1)}}var q0=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["mat-label"]]})}return t})(),mX=new re("MatError"),pX=(()=>{class t{id=E(un).getId("mat-mdc-error-");constructor(){E(new ws("aria-live"),{optional:!0})||E(eA).nativeElement.setAttribute("aria-live","polite")}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["mat-error"],["","matError",""]],hostAttrs:["aria-atomic","true",1,"mat-mdc-form-field-error","mat-mdc-form-field-bottom-align"],hostVars:1,hostBindings:function(i,n){i&2&&ea("id",n.id)},inputs:{id:"id"},features:[gt([{provide:mX,useExisting:t}])]})}return t})(),JB=(()=>{class t{align="start";id=E(un).getId("mat-mdc-hint-");static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["mat-hint"]],hostAttrs:[1,"mat-mdc-form-field-hint","mat-mdc-form-field-bottom-align"],hostVars:4,hostBindings:function(i,n){i&2&&(ea("id",n.id),AA("align",null),iA("mat-mdc-form-field-hint-end",n.align==="end"))},inputs:{align:"align",id:"id"}})}return t})(),I5e=new re("MatPrefix");var wX=new re("MatSuffix"),yX=(()=>{class t{set _isTextSelector(e){this._isText=!0}_isText=!1;static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","matSuffix",""],["","matIconSuffix",""],["","matTextSuffix",""]],inputs:{_isTextSelector:[0,"matTextSuffix","_isTextSelector"]},features:[gt([{provide:wX,useExisting:t}])]})}return t})(),DX=new re("FloatingLabelParent"),uX=(()=>{class t{_elementRef=E(eA);get floating(){return this._floating}set floating(e){this._floating=e,this.monitorResize&&this._handleResize()}_floating=!1;get monitorResize(){return this._monitorResize}set monitorResize(e){this._monitorResize=e,this._monitorResize?this._subscribeToResize():this._resizeSubscription.unsubscribe()}_monitorResize=!1;_resizeObserver=E(Y5);_ngZone=E(yA);_parent=E(DX);_resizeSubscription=new Ot;constructor(){}ngOnDestroy(){this._resizeSubscription.unsubscribe()}getWidth(){return u5e(this._elementRef.nativeElement)}get element(){return this._elementRef.nativeElement}_handleResize(){setTimeout(()=>this._parent._handleLabelResized())}_subscribeToResize(){this._resizeSubscription.unsubscribe(),this._ngZone.runOutsideAngular(()=>{this._resizeSubscription=this._resizeObserver.observe(this._elementRef.nativeElement,{box:"border-box"}).subscribe(()=>this._handleResize())})}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["label","matFormFieldFloatingLabel",""]],hostAttrs:[1,"mdc-floating-label","mat-mdc-floating-label"],hostVars:2,hostBindings:function(i,n){i&2&&iA("mdc-floating-label--float-above",n.floating)},inputs:{floating:"floating",monitorResize:"monitorResize"}})}return t})();function u5e(t){let A=t;if(A.offsetParent!==null)return A.scrollWidth;let e=A.cloneNode(!0);e.style.setProperty("position","absolute"),e.style.setProperty("transform","translate(-9999px, -9999px)"),document.documentElement.appendChild(e);let i=e.scrollWidth;return e.remove(),i}var hX="mdc-line-ripple--active",H5="mdc-line-ripple--deactivating",BX=(()=>{class t{_elementRef=E(eA);_cleanupTransitionEnd;constructor(){let e=E(yA),i=E(an);e.runOutsideAngular(()=>{this._cleanupTransitionEnd=i.listen(this._elementRef.nativeElement,"transitionend",this._handleTransitionEnd)})}activate(){let e=this._elementRef.nativeElement.classList;e.remove(H5),e.add(hX)}deactivate(){this._elementRef.nativeElement.classList.add(H5)}_handleTransitionEnd=e=>{let i=this._elementRef.nativeElement.classList,n=i.contains(H5);e.propertyName==="opacity"&&n&&i.remove(hX,H5)};ngOnDestroy(){this._cleanupTransitionEnd()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["div","matFormFieldLineRipple",""]],hostAttrs:[1,"mdc-line-ripple"]})}return t})(),EX=(()=>{class t{_elementRef=E(eA);_ngZone=E(yA);open=!1;_notch;constructor(){}ngAfterViewInit(){let e=this._elementRef.nativeElement.querySelector(".mdc-floating-label");e?(this._elementRef.nativeElement.classList.add("mdc-notched-outline--upgraded"),typeof requestAnimationFrame=="function"&&(e.style.transitionDuration="0s",this._ngZone.runOutsideAngular(()=>{requestAnimationFrame(()=>e.style.transitionDuration="")}))):this._elementRef.nativeElement.classList.add("mdc-notched-outline--no-label")}_setNotchWidth(e){!this.open||!e?this._notch.nativeElement.style.width="":this._notch.nativeElement.style.width=`calc(${e}px * var(--mat-mdc-form-field-floating-label-scale, 0.75) + 9px)`}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["div","matFormFieldNotchedOutline",""]],viewQuery:function(i,n){if(i&1&&At(Owe,5),i&2){let o;oA(o=rA())&&(n._notch=o.first)}},hostAttrs:[1,"mdc-notched-outline"],hostVars:2,hostBindings:function(i,n){i&2&&iA("mdc-notched-outline--notched",n.open)},inputs:{open:[0,"matFormFieldNotchedOutlineOpen","open"]},attrs:Jwe,ngContentSelectors:Ywe,decls:5,vars:0,consts:[["notch",""],[1,"mat-mdc-notch-piece","mdc-notched-outline__leading"],[1,"mat-mdc-notch-piece","mdc-notched-outline__notch"],[1,"mat-mdc-notch-piece","mdc-notched-outline__trailing"]],template:function(i,n){i&1&&(Kt(),ve(0,"div",1),m(1,"div",2,0),NA(3),p(),ve(4,"div",3))},encapsulation:2,changeDetection:0})}return t})(),h5e={transitionMessages:ll("transitionMessages",[tc("enter",Vo({opacity:1,transform:"translateY(0%)"})),Fs("void => enter",[Vo({opacity:0,transform:"translateY(-5px)"}),ia("300ms cubic-bezier(0.55, 0, 0.55, 0.2)")])])},V4=(()=>{class t{value;stateChanges;id;placeholder;ngControl;focused;empty;shouldLabelFloat;required;disabled;errorState;controlType;autofilled;userAriaDescribedBy;disableAutomaticLabeling;static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t})}return t})();var q4=new re("MatFormField"),B5e=new re("MAT_FORM_FIELD_DEFAULT_OPTIONS"),fX="fill",E5e="auto",QX="fixed",f5e="translateY(-50%)",ds=(()=>{class t{_elementRef=E(eA);_changeDetectorRef=E(ut);_dir=E(Do);_platform=E(mi);_idGenerator=E(un);_defaults=E(B5e,{optional:!0});_animationMode=E(Oi,{optional:!0});_textField;_iconPrefixContainer;_textPrefixContainer;_iconSuffixContainer;_textSuffixContainer;_floatingLabel;_notchedOutline;_lineRipple;_formFieldControl;_prefixChildren;_suffixChildren;_errorChildren;_hintChildren;_labelChild=o2(q0);get hideRequiredMarker(){return this._hideRequiredMarker}set hideRequiredMarker(e){this._hideRequiredMarker=Sr(e)}_hideRequiredMarker=!1;color="primary";get floatLabel(){return this._floatLabel||this._defaults?.floatLabel||E5e}set floatLabel(e){e!==this._floatLabel&&(this._floatLabel=e,this._changeDetectorRef.markForCheck())}_floatLabel;get appearance(){return this._appearance}set appearance(e){let i=this._appearance,n=e||this._defaults?.appearance||fX;this._appearance=n,this._appearance==="outline"&&this._appearance!==i&&(this._needsOutlineLabelOffsetUpdate=!0)}_appearance=fX;get subscriptSizing(){return this._subscriptSizing||this._defaults?.subscriptSizing||QX}set subscriptSizing(e){this._subscriptSizing=e||this._defaults?.subscriptSizing||QX}_subscriptSizing=null;get hintLabel(){return this._hintLabel}set hintLabel(e){this._hintLabel=e,this._processHints()}_hintLabel="";_hasIconPrefix=!1;_hasTextPrefix=!1;_hasIconSuffix=!1;_hasTextSuffix=!1;_labelId=this._idGenerator.getId("mat-mdc-form-field-label-");_hintLabelId=this._idGenerator.getId("mat-mdc-hint-");_subscriptAnimationState="";get _control(){return this._explicitFormFieldControl||this._formFieldControl}set _control(e){this._explicitFormFieldControl=e}_destroyed=new je;_isFocused=null;_explicitFormFieldControl;_needsOutlineLabelOffsetUpdate=!1;_previousControl=null;_stateChanges;_valueChanges;_describedByChanges;_injector=E(Dt);constructor(){let e=this._defaults;e&&(e.appearance&&(this.appearance=e.appearance),this._hideRequiredMarker=!!e?.hideRequiredMarker,e.color&&(this.color=e.color))}ngAfterViewInit(){this._updateFocusState(),this._subscriptAnimationState="enter",this._changeDetectorRef.detectChanges()}ngAfterContentInit(){this._assertFormFieldControl(),this._initializeSubscript(),this._initializePrefixAndSuffix(),this._initializeOutlineLabelOffsetSubscriptions()}ngAfterContentChecked(){this._assertFormFieldControl(),this._control!==this._previousControl&&(this._initializeControl(this._previousControl),this._previousControl=this._control)}ngOnDestroy(){this._stateChanges?.unsubscribe(),this._valueChanges?.unsubscribe(),this._describedByChanges?.unsubscribe(),this._destroyed.next(),this._destroyed.complete()}getLabelId=ot(()=>this._hasFloatingLabel()?this._labelId:null);getConnectedOverlayOrigin(){return this._textField||this._elementRef}_animateAndLockLabel(){this._hasFloatingLabel()&&(this.floatLabel="always")}_initializeControl(e){let i=this._control,n="mat-mdc-form-field-type-";e&&this._elementRef.nativeElement.classList.remove(n+e.controlType),i.controlType&&this._elementRef.nativeElement.classList.add(n+i.controlType),this._stateChanges?.unsubscribe(),this._stateChanges=i.stateChanges.subscribe(()=>{this._updateFocusState(),this._changeDetectorRef.markForCheck()}),this._describedByChanges?.unsubscribe(),this._describedByChanges=i.stateChanges.pipe(In([void 0,void 0]),aA(()=>[i.errorState,i.userAriaDescribedBy]),k0(),$A(([[o,r],[s,a]])=>o!==s||r!==a)).subscribe(()=>this._syncDescribedByIds()),this._valueChanges?.unsubscribe(),i.ngControl&&i.ngControl.valueChanges&&(this._valueChanges=i.ngControl.valueChanges.pipe(mt(this._destroyed)).subscribe(()=>this._changeDetectorRef.markForCheck()))}_checkPrefixAndSuffixTypes(){this._hasIconPrefix=!!this._prefixChildren.find(e=>!e._isText),this._hasTextPrefix=!!this._prefixChildren.find(e=>e._isText),this._hasIconSuffix=!!this._suffixChildren.find(e=>!e._isText),this._hasTextSuffix=!!this._suffixChildren.find(e=>e._isText)}_initializePrefixAndSuffix(){this._checkPrefixAndSuffixTypes(),Bi(this._prefixChildren.changes,this._suffixChildren.changes).subscribe(()=>{this._checkPrefixAndSuffixTypes(),this._changeDetectorRef.markForCheck()})}_initializeSubscript(){this._hintChildren.changes.subscribe(()=>{this._processHints(),this._changeDetectorRef.markForCheck()}),this._errorChildren.changes.subscribe(()=>{this._syncDescribedByIds(),this._changeDetectorRef.markForCheck()}),this._validateHints(),this._syncDescribedByIds()}_assertFormFieldControl(){this._control}_updateFocusState(){this._control.focused&&!this._isFocused?(this._isFocused=!0,this._lineRipple?.activate()):!this._control.focused&&(this._isFocused||this._isFocused===null)&&(this._isFocused=!1,this._lineRipple?.deactivate()),this._textField?.nativeElement.classList.toggle("mdc-text-field--focused",this._control.focused)}_initializeOutlineLabelOffsetSubscriptions(){this._prefixChildren.changes.subscribe(()=>this._needsOutlineLabelOffsetUpdate=!0),f4(()=>{this._needsOutlineLabelOffsetUpdate&&(this._needsOutlineLabelOffsetUpdate=!1,this._updateOutlineLabelOffset())},{injector:this._injector}),this._dir.change.pipe(mt(this._destroyed)).subscribe(()=>this._needsOutlineLabelOffsetUpdate=!0)}_shouldAlwaysFloat(){return this.floatLabel==="always"}_hasOutline(){return this.appearance==="outline"}_forceDisplayInfixLabel(){return!this._platform.isBrowser&&this._prefixChildren.length&&!this._shouldLabelFloat()}_hasFloatingLabel=ot(()=>!!this._labelChild());_shouldLabelFloat(){return this._hasFloatingLabel()?this._control.shouldLabelFloat||this._shouldAlwaysFloat():!1}_shouldForward(e){let i=this._control?this._control.ngControl:null;return i&&i[e]}_getDisplayedMessages(){return this._errorChildren&&this._errorChildren.length>0&&this._control.errorState?"error":"hint"}_handleLabelResized(){this._refreshOutlineNotchWidth()}_refreshOutlineNotchWidth(){!this._hasOutline()||!this._floatingLabel||!this._shouldLabelFloat()?this._notchedOutline?._setNotchWidth(0):this._notchedOutline?._setNotchWidth(this._floatingLabel.getWidth())}_processHints(){this._validateHints(),this._syncDescribedByIds()}_validateHints(){this._hintChildren}_syncDescribedByIds(){if(this._control){let e=[];if(this._control.userAriaDescribedBy&&typeof this._control.userAriaDescribedBy=="string"&&e.push(...this._control.userAriaDescribedBy.split(" ")),this._getDisplayedMessages()==="hint"){let i=this._hintChildren?this._hintChildren.find(o=>o.align==="start"):null,n=this._hintChildren?this._hintChildren.find(o=>o.align==="end"):null;i?e.push(i.id):this._hintLabel&&e.push(this._hintLabelId),n&&e.push(n.id)}else this._errorChildren&&e.push(...this._errorChildren.map(i=>i.id));this._control.setDescribedByIds(e)}}_updateOutlineLabelOffset(){if(!this._hasOutline()||!this._floatingLabel)return;let e=this._floatingLabel.element;if(!(this._iconPrefixContainer||this._textPrefixContainer)){e.style.transform="";return}if(!this._isAttachedToDom()){this._needsOutlineLabelOffsetUpdate=!0;return}let i=this._iconPrefixContainer?.nativeElement,n=this._textPrefixContainer?.nativeElement,o=this._iconSuffixContainer?.nativeElement,r=this._textSuffixContainer?.nativeElement,s=i?.getBoundingClientRect().width??0,a=n?.getBoundingClientRect().width??0,c=o?.getBoundingClientRect().width??0,l=r?.getBoundingClientRect().width??0,d=this._dir.value==="rtl"?"-1":"1",C=`${s+a}px`,u=`calc(${d} * (${C} + var(--mat-mdc-form-field-label-offset-x, 0px)))`;e.style.transform=`var( + --mat-mdc-form-field-label-transform, + ${f5e} translateX(${u}) + )`;let h=s+a+c+l;this._elementRef.nativeElement.style.setProperty("--mat-form-field-notch-max-width",`calc(100% - ${h}px)`)}_isAttachedToDom(){let e=this._elementRef.nativeElement;if(e.getRootNode){let i=e.getRootNode();return i&&i!==e}return document.documentElement.contains(e)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-form-field"]],contentQueries:function(i,n,o){if(i&1&&(r2(o,n._labelChild,q0,5),ni(o,V4,5),ni(o,I5e,5),ni(o,wX,5),ni(o,mX,5),ni(o,JB,5)),i&2){Aa();let r;oA(r=rA())&&(n._formFieldControl=r.first),oA(r=rA())&&(n._prefixChildren=r),oA(r=rA())&&(n._suffixChildren=r),oA(r=rA())&&(n._errorChildren=r),oA(r=rA())&&(n._hintChildren=r)}},viewQuery:function(i,n){if(i&1&&(At(Hwe,5),At(zwe,5),At(Pwe,5),At(jwe,5),At(Vwe,5),At(uX,5),At(EX,5),At(BX,5)),i&2){let o;oA(o=rA())&&(n._textField=o.first),oA(o=rA())&&(n._iconPrefixContainer=o.first),oA(o=rA())&&(n._textPrefixContainer=o.first),oA(o=rA())&&(n._iconSuffixContainer=o.first),oA(o=rA())&&(n._textSuffixContainer=o.first),oA(o=rA())&&(n._floatingLabel=o.first),oA(o=rA())&&(n._notchedOutline=o.first),oA(o=rA())&&(n._lineRipple=o.first)}},hostAttrs:[1,"mat-mdc-form-field"],hostVars:42,hostBindings:function(i,n){i&2&&iA("mat-mdc-form-field-label-always-float",n._shouldAlwaysFloat())("mat-mdc-form-field-has-icon-prefix",n._hasIconPrefix)("mat-mdc-form-field-has-icon-suffix",n._hasIconSuffix)("mat-form-field-invalid",n._control.errorState)("mat-form-field-disabled",n._control.disabled)("mat-form-field-autofilled",n._control.autofilled)("mat-form-field-no-animations",n._animationMode==="NoopAnimations")("mat-form-field-appearance-fill",n.appearance=="fill")("mat-form-field-appearance-outline",n.appearance=="outline")("mat-form-field-hide-placeholder",n._hasFloatingLabel()&&!n._shouldLabelFloat())("mat-focused",n._control.focused)("mat-primary",n.color!=="accent"&&n.color!=="warn")("mat-accent",n.color==="accent")("mat-warn",n.color==="warn")("ng-untouched",n._shouldForward("untouched"))("ng-touched",n._shouldForward("touched"))("ng-pristine",n._shouldForward("pristine"))("ng-dirty",n._shouldForward("dirty"))("ng-valid",n._shouldForward("valid"))("ng-invalid",n._shouldForward("invalid"))("ng-pending",n._shouldForward("pending"))},inputs:{hideRequiredMarker:"hideRequiredMarker",color:"color",floatLabel:"floatLabel",appearance:"appearance",subscriptSizing:"subscriptSizing",hintLabel:"hintLabel"},exportAs:["matFormField"],features:[gt([{provide:q4,useExisting:t},{provide:DX,useExisting:t}])],ngContentSelectors:Wwe,decls:18,vars:21,consts:[["labelTemplate",""],["textField",""],["iconPrefixContainer",""],["textPrefixContainer",""],["textSuffixContainer",""],["iconSuffixContainer",""],[1,"mat-mdc-text-field-wrapper","mdc-text-field",3,"click"],[1,"mat-mdc-form-field-focus-overlay"],[1,"mat-mdc-form-field-flex"],["matFormFieldNotchedOutline","",3,"matFormFieldNotchedOutlineOpen"],[1,"mat-mdc-form-field-icon-prefix"],[1,"mat-mdc-form-field-text-prefix"],[1,"mat-mdc-form-field-infix"],[3,"ngTemplateOutlet"],[1,"mat-mdc-form-field-text-suffix"],[1,"mat-mdc-form-field-icon-suffix"],["matFormFieldLineRipple",""],[1,"mat-mdc-form-field-subscript-wrapper","mat-mdc-form-field-bottom-align"],[1,"mat-mdc-form-field-error-wrapper"],[1,"mat-mdc-form-field-hint-wrapper"],["matFormFieldFloatingLabel","",3,"floating","monitorResize","id"],["aria-hidden","true",1,"mat-mdc-form-field-required-marker","mdc-floating-label--required"],[3,"id"],[1,"mat-mdc-form-field-hint-spacer"]],template:function(i,n){if(i&1){let o=Ue();Kt(qwe),ne(0,$we,1,1,"ng-template",null,0,a2),m(2,"div",6,1),ee("click",function(s){return q(o),W(n._control.onContainerClick(s))}),ne(4,e5e,1,0,"div",7),m(5,"div",8),ne(6,i5e,2,2,"div",9)(7,n5e,3,0,"div",10)(8,o5e,3,0,"div",11),m(9,"div",12),ne(10,s5e,1,1,null,13),NA(11),p(),ne(12,a5e,3,0,"div",14)(13,c5e,3,0,"div",15),p(),ne(14,l5e,1,0,"div",16),p(),m(15,"div",17),ne(16,g5e,2,1,"div",18)(17,C5e,5,2,"div",19),p()}if(i&2){let o;y(2),iA("mdc-text-field--filled",!n._hasOutline())("mdc-text-field--outlined",n._hasOutline())("mdc-text-field--no-label",!n._hasFloatingLabel())("mdc-text-field--disabled",n._control.disabled)("mdc-text-field--invalid",n._control.errorState),y(2),$(!n._hasOutline()&&!n._control.disabled?4:-1),y(2),$(n._hasOutline()?6:-1),y(),$(n._hasIconPrefix?7:-1),y(),$(n._hasTextPrefix?8:-1),y(2),$(!n._hasOutline()||n._forceDisplayInfixLabel()?10:-1),y(2),$(n._hasTextSuffix?12:-1),y(),$(n._hasIconSuffix?13:-1),y(),$(n._hasOutline()?-1:14),y(),iA("mat-mdc-form-field-subscript-dynamic-size",n.subscriptSizing==="dynamic"),y(),$((o=n._getDisplayedMessages())==="error"?16:o==="hint"?17:-1)}},dependencies:[uX,EX,nl,BX,JB],styles:['.mdc-text-field{display:inline-flex;align-items:baseline;padding:0 16px;position:relative;box-sizing:border-box;overflow:hidden;will-change:opacity,transform,color;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.mdc-text-field__input{width:100%;min-width:0;border:none;border-radius:0;background:none;padding:0;-moz-appearance:none;-webkit-appearance:none;height:28px}.mdc-text-field__input::-webkit-calendar-picker-indicator{display:none}.mdc-text-field__input::-ms-clear{display:none}.mdc-text-field__input:focus{outline:none}.mdc-text-field__input:invalid{box-shadow:none}.mdc-text-field__input::placeholder{opacity:0}.mdc-text-field__input::-moz-placeholder{opacity:0}.mdc-text-field__input::-webkit-input-placeholder{opacity:0}.mdc-text-field__input:-ms-input-placeholder{opacity:0}.mdc-text-field--no-label .mdc-text-field__input::placeholder,.mdc-text-field--focused .mdc-text-field__input::placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-moz-placeholder,.mdc-text-field--focused .mdc-text-field__input::-moz-placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{opacity:1}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::-moz-placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::-webkit-input-placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive:-ms-input-placeholder{opacity:0}.mdc-text-field--outlined .mdc-text-field__input,.mdc-text-field--filled.mdc-text-field--no-label .mdc-text-field__input{height:100%}.mdc-text-field--outlined .mdc-text-field__input{display:flex;border:none !important;background-color:rgba(0,0,0,0)}.mdc-text-field--disabled .mdc-text-field__input{pointer-events:auto}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input{color:var(--mdc-filled-text-field-input-text-color, var(--mat-sys-on-surface));caret-color:var(--mdc-filled-text-field-caret-color, var(--mat-sys-primary))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:var(--mdc-filled-text-field-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::-moz-placeholder{color:var(--mdc-filled-text-field-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:var(--mdc-filled-text-field-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:var(--mdc-filled-text-field-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__input{caret-color:var(--mdc-filled-text-field-error-caret-color)}.mdc-text-field--filled.mdc-text-field--disabled .mdc-text-field__input{color:var(--mdc-filled-text-field-disabled-input-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input{color:var(--mdc-outlined-text-field-input-text-color, var(--mat-sys-on-surface));caret-color:var(--mdc-outlined-text-field-caret-color, var(--mat-sys-primary))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:var(--mdc-outlined-text-field-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::-moz-placeholder{color:var(--mdc-outlined-text-field-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:var(--mdc-outlined-text-field-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:var(--mdc-outlined-text-field-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__input{caret-color:var(--mdc-outlined-text-field-error-caret-color)}.mdc-text-field--outlined.mdc-text-field--disabled .mdc-text-field__input{color:var(--mdc-outlined-text-field-disabled-input-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-text-field--disabled .mdc-text-field__input{background-color:Window}}.mdc-text-field--filled{height:56px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:var(--mdc-filled-text-field-container-shape, var(--mat-sys-corner-extra-small));border-top-right-radius:var(--mdc-filled-text-field-container-shape, var(--mat-sys-corner-extra-small))}.mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:var(--mdc-filled-text-field-container-color, var(--mat-sys-surface-variant))}.mdc-text-field--filled.mdc-text-field--disabled{background-color:var(--mdc-filled-text-field-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 4%, transparent))}.mdc-text-field--outlined{height:56px;overflow:visible;padding-right:max(16px,var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small)));padding-left:max(16px,var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small)) + 4px)}[dir=rtl] .mdc-text-field--outlined{padding-right:max(16px,var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small)) + 4px);padding-left:max(16px,var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small)))}.mdc-floating-label{position:absolute;left:0;transform-origin:left top;line-height:1.15rem;text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:text;overflow:hidden;will-change:transform}[dir=rtl] .mdc-floating-label{right:0;left:auto;transform-origin:right top;text-align:right}.mdc-text-field .mdc-floating-label{top:50%;transform:translateY(-50%);pointer-events:none}.mdc-notched-outline .mdc-floating-label{display:inline-block;position:relative;max-width:100%}.mdc-text-field--outlined .mdc-floating-label{left:4px;right:auto}[dir=rtl] .mdc-text-field--outlined .mdc-floating-label{left:auto;right:4px}.mdc-text-field--filled .mdc-floating-label{left:16px;right:auto}[dir=rtl] .mdc-text-field--filled .mdc-floating-label{left:auto;right:16px}.mdc-text-field--disabled .mdc-floating-label{cursor:default}@media(forced-colors: active){.mdc-text-field--disabled .mdc-floating-label{z-index:1}}.mdc-text-field--filled.mdc-text-field--no-label .mdc-floating-label{display:none}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mdc-filled-text-field-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-floating-label{color:var(--mdc-filled-text-field-focus-label-text-color, var(--mat-sys-primary))}.mdc-text-field--filled:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-floating-label{color:var(--mdc-filled-text-field-hover-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-floating-label{color:var(--mdc-filled-text-field-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-floating-label{color:var(--mdc-filled-text-field-error-label-text-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mdc-floating-label{color:var(--mdc-filled-text-field-error-focus-label-text-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-floating-label{color:var(--mdc-filled-text-field-error-hover-label-text-color, var(--mat-sys-on-error-container))}.mdc-text-field--filled .mdc-floating-label{font-family:var(--mdc-filled-text-field-label-text-font, var(--mat-sys-body-large-font));font-size:var(--mdc-filled-text-field-label-text-size, var(--mat-sys-body-large-size));font-weight:var(--mdc-filled-text-field-label-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mdc-filled-text-field-label-text-tracking, var(--mat-sys-body-large-tracking))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mdc-outlined-text-field-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-floating-label{color:var(--mdc-outlined-text-field-focus-label-text-color, var(--mat-sys-primary))}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-floating-label{color:var(--mdc-outlined-text-field-hover-label-text-color, var(--mat-sys-on-surface))}.mdc-text-field--outlined.mdc-text-field--disabled .mdc-floating-label{color:var(--mdc-outlined-text-field-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-floating-label{color:var(--mdc-outlined-text-field-error-label-text-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mdc-floating-label{color:var(--mdc-outlined-text-field-error-focus-label-text-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-floating-label{color:var(--mdc-outlined-text-field-error-hover-label-text-color, var(--mat-sys-on-error-container))}.mdc-text-field--outlined .mdc-floating-label{font-family:var(--mdc-outlined-text-field-label-text-font, var(--mat-sys-body-large-font));font-size:var(--mdc-outlined-text-field-label-text-size, var(--mat-sys-body-large-size));font-weight:var(--mdc-outlined-text-field-label-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mdc-outlined-text-field-label-text-tracking, var(--mat-sys-body-large-tracking))}.mdc-floating-label--float-above{cursor:auto;transform:translateY(-106%) scale(0.75)}.mdc-text-field--filled .mdc-floating-label--float-above{transform:translateY(-106%) scale(0.75)}.mdc-text-field--outlined .mdc-floating-label--float-above{transform:translateY(-37.25px) scale(1);font-size:.75rem}.mdc-notched-outline .mdc-floating-label--float-above{text-overflow:clip}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:133.3333333333%}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{transform:translateY(-34.75px) scale(0.75)}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:1rem}.mdc-floating-label--required:not(.mdc-floating-label--hide-required-marker)::after{margin-left:1px;margin-right:0;content:"*"}[dir=rtl] .mdc-floating-label--required:not(.mdc-floating-label--hide-required-marker)::after{margin-left:0;margin-right:1px}.mdc-notched-outline{display:flex;position:absolute;top:0;right:0;left:0;box-sizing:border-box;width:100%;max-width:100%;height:100%;text-align:left;pointer-events:none}[dir=rtl] .mdc-notched-outline{text-align:right}.mdc-text-field--outlined .mdc-notched-outline{z-index:1}.mat-mdc-notch-piece{box-sizing:border-box;height:100%;pointer-events:none;border-top:1px solid;border-bottom:1px solid}.mdc-text-field--focused .mat-mdc-notch-piece{border-width:2px}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-outline-color, var(--mat-sys-outline));border-width:var(--mdc-outlined-text-field-outline-width, 1px)}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-hover-outline-color, var(--mat-sys-on-surface))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-focus-outline-color, var(--mat-sys-primary))}.mdc-text-field--outlined.mdc-text-field--disabled .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-error-outline-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--focused):hover .mdc-notched-outline .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-error-hover-outline-color, var(--mat-sys-on-error-container))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-error-focus-outline-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline .mat-mdc-notch-piece{border-width:var(--mdc-outlined-text-field-focus-outline-width, 2px)}.mdc-notched-outline__leading{border-left:1px solid;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small));border-bottom-left-radius:var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small))}.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__leading{width:max(12px,var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small)))}[dir=rtl] .mdc-notched-outline__leading{border-left:none;border-right:1px solid;border-bottom-left-radius:0;border-top-left-radius:0;border-top-right-radius:var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small));border-bottom-right-radius:var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small))}.mdc-notched-outline__trailing{flex-grow:1;border-left:none;border-right:1px solid;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small));border-bottom-right-radius:var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small))}[dir=rtl] .mdc-notched-outline__trailing{border-left:1px solid;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small));border-bottom-left-radius:var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small))}.mdc-notched-outline__notch{flex:0 0 auto;width:auto}.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__notch{max-width:min(var(--mat-form-field-notch-max-width, 100%),100% - max(12px,var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small)))*2)}.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:1px}.mdc-text-field--focused.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:2px}.mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:0;padding-right:8px;border-top:none;--mat-form-field-notch-max-width: 100%}[dir=rtl] .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:8px;padding-right:0}.mdc-notched-outline--no-label .mdc-notched-outline__notch{display:none}.mdc-line-ripple::before,.mdc-line-ripple::after{position:absolute;bottom:0;left:0;width:100%;border-bottom-style:solid;content:""}.mdc-line-ripple::before{z-index:1;border-bottom-width:var(--mdc-filled-text-field-active-indicator-height, 1px)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::before{border-bottom-color:var(--mdc-filled-text-field-active-indicator-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-line-ripple::before{border-bottom-color:var(--mdc-filled-text-field-hover-active-indicator-color, var(--mat-sys-on-surface))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-line-ripple::before{border-bottom-color:var(--mdc-filled-text-field-disabled-active-indicator-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-line-ripple::before{border-bottom-color:var(--mdc-filled-text-field-error-active-indicator-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--focused):hover .mdc-line-ripple::before{border-bottom-color:var(--mdc-filled-text-field-error-hover-active-indicator-color, var(--mat-sys-on-error-container))}.mdc-line-ripple::after{transform:scaleX(0);opacity:0;z-index:2}.mdc-text-field--filled .mdc-line-ripple::after{border-bottom-width:var(--mdc-filled-text-field-focus-active-indicator-height, 2px)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:var(--mdc-filled-text-field-focus-active-indicator-color, var(--mat-sys-primary))}.mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:var(--mdc-filled-text-field-error-focus-active-indicator-color, var(--mat-sys-error))}.mdc-line-ripple--active::after{transform:scaleX(1);opacity:1}.mdc-line-ripple--deactivating::after{opacity:0}.mdc-text-field--disabled{pointer-events:none}.mat-mdc-form-field-textarea-control{vertical-align:middle;resize:vertical;box-sizing:border-box;height:auto;margin:0;padding:0;border:none;overflow:auto}.mat-mdc-form-field-input-control.mat-mdc-form-field-input-control{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font:inherit;letter-spacing:inherit;text-decoration:inherit;text-transform:inherit;border:none}.mat-mdc-form-field .mat-mdc-floating-label.mdc-floating-label{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;line-height:normal;pointer-events:all;will-change:auto}.mat-mdc-form-field:not(.mat-form-field-disabled) .mat-mdc-floating-label.mdc-floating-label{cursor:inherit}.mdc-text-field--no-label:not(.mdc-text-field--textarea) .mat-mdc-form-field-input-control.mdc-text-field__input,.mat-mdc-text-field-wrapper .mat-mdc-form-field-input-control{height:auto}.mat-mdc-text-field-wrapper .mat-mdc-form-field-input-control.mdc-text-field__input[type=color]{height:23px}.mat-mdc-text-field-wrapper{height:auto;flex:auto;will-change:auto}.mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding-left:0;--mat-mdc-form-field-label-offset-x: -16px}.mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-right:0}[dir=rtl] .mat-mdc-text-field-wrapper{padding-left:16px;padding-right:16px}[dir=rtl] .mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-left:0}[dir=rtl] .mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding-right:0}.mat-form-field-disabled .mdc-text-field__input::placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-label-always-float .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms;opacity:1}.mat-mdc-text-field-wrapper .mat-mdc-form-field-infix .mat-mdc-floating-label{left:auto;right:auto}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-text-field__input{display:inline-block}.mat-mdc-form-field .mat-mdc-text-field-wrapper.mdc-text-field .mdc-notched-outline__notch{padding-top:0}.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field .mdc-notched-outline__notch{border-left:1px solid rgba(0,0,0,0)}[dir=rtl] .mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field .mdc-notched-outline__notch{border-left:none;border-right:1px solid rgba(0,0,0,0)}.mat-mdc-form-field-infix{min-height:var(--mat-form-field-container-height, 56px);padding-top:var(--mat-form-field-filled-with-label-container-padding-top, 24px);padding-bottom:var(--mat-form-field-filled-with-label-container-padding-bottom, 8px)}.mdc-text-field--outlined .mat-mdc-form-field-infix,.mdc-text-field--no-label .mat-mdc-form-field-infix{padding-top:var(--mat-form-field-container-vertical-padding, 16px);padding-bottom:var(--mat-form-field-container-vertical-padding, 16px)}.mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:calc(var(--mat-form-field-container-height, 56px)/2)}.mdc-text-field--filled .mat-mdc-floating-label{display:var(--mat-form-field-filled-label-display, block)}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{--mat-mdc-form-field-label-transform: translateY(calc(calc(6.75px + var(--mat-form-field-container-height, 56px) / 2) * -1)) scale(var(--mat-mdc-form-field-floating-label-scale, 0.75));transform:var(--mat-mdc-form-field-label-transform)}.mat-mdc-form-field-subscript-wrapper{box-sizing:border-box;width:100%;position:relative}.mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field-error-wrapper{position:absolute;top:0;left:0;right:0;padding:0 16px}.mat-mdc-form-field-subscript-dynamic-size .mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field-subscript-dynamic-size .mat-mdc-form-field-error-wrapper{position:static}.mat-mdc-form-field-bottom-align::before{content:"";display:inline-block;height:16px}.mat-mdc-form-field-bottom-align.mat-mdc-form-field-subscript-dynamic-size::before{content:unset}.mat-mdc-form-field-hint-end{order:1}.mat-mdc-form-field-hint-wrapper{display:flex}.mat-mdc-form-field-hint-spacer{flex:1 0 1em}.mat-mdc-form-field-error{display:block;color:var(--mat-form-field-error-text-color, var(--mat-sys-error))}.mat-mdc-form-field-subscript-wrapper,.mat-mdc-form-field-bottom-align::before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-form-field-subscript-text-font, var(--mat-sys-body-small-font));line-height:var(--mat-form-field-subscript-text-line-height, var(--mat-sys-body-small-line-height));font-size:var(--mat-form-field-subscript-text-size, var(--mat-sys-body-small-size));letter-spacing:var(--mat-form-field-subscript-text-tracking, var(--mat-sys-body-small-tracking));font-weight:var(--mat-form-field-subscript-text-weight, var(--mat-sys-body-small-weight))}.mat-mdc-form-field-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;opacity:0;pointer-events:none;background-color:var(--mat-form-field-state-layer-color, var(--mat-sys-on-surface))}.mat-mdc-text-field-wrapper:hover .mat-mdc-form-field-focus-overlay{opacity:var(--mat-form-field-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay{opacity:var(--mat-form-field-focus-state-layer-opacity, 0)}select.mat-mdc-form-field-input-control{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(0,0,0,0);display:inline-flex;box-sizing:border-box}select.mat-mdc-form-field-input-control:not(:disabled){cursor:pointer}select.mat-mdc-form-field-input-control:not(.mat-mdc-native-select-inline) option{color:var(--mat-form-field-select-option-text-color, var(--mat-sys-neutral10))}select.mat-mdc-form-field-input-control:not(.mat-mdc-native-select-inline) option:disabled{color:var(--mat-form-field-select-disabled-option-text-color, color-mix(in srgb, var(--mat-sys-neutral10) 38%, transparent))}.mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-infix::after{content:"";width:0;height:0;border-left:5px solid rgba(0,0,0,0);border-right:5px solid rgba(0,0,0,0);border-top:5px solid;position:absolute;right:0;top:50%;margin-top:-2.5px;pointer-events:none;color:var(--mat-form-field-enabled-select-arrow-color, var(--mat-sys-on-surface-variant))}[dir=rtl] .mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-infix::after{right:auto;left:0}.mat-mdc-form-field-type-mat-native-select.mat-focused .mat-mdc-form-field-infix::after{color:var(--mat-form-field-focus-select-arrow-color, var(--mat-sys-primary))}.mat-mdc-form-field-type-mat-native-select.mat-form-field-disabled .mat-mdc-form-field-infix::after{color:var(--mat-form-field-disabled-select-arrow-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-input-control{padding-right:15px}[dir=rtl] .mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-input-control{padding-right:0;padding-left:15px}@media(forced-colors: active){.mat-form-field-appearance-fill .mat-mdc-text-field-wrapper{outline:solid 1px}}@media(forced-colors: active){.mat-form-field-appearance-fill.mat-form-field-disabled .mat-mdc-text-field-wrapper{outline-color:GrayText}}@media(forced-colors: active){.mat-form-field-appearance-fill.mat-focused .mat-mdc-text-field-wrapper{outline:dashed 3px}}@media(forced-colors: active){.mat-mdc-form-field.mat-focused .mdc-notched-outline{border:dashed 3px}}.mat-mdc-form-field-input-control[type=date],.mat-mdc-form-field-input-control[type=datetime],.mat-mdc-form-field-input-control[type=datetime-local],.mat-mdc-form-field-input-control[type=month],.mat-mdc-form-field-input-control[type=week],.mat-mdc-form-field-input-control[type=time]{line-height:1}.mat-mdc-form-field-input-control::-webkit-datetime-edit{line-height:1;padding:0;margin-bottom:-2px}.mat-mdc-form-field{--mat-mdc-form-field-floating-label-scale: 0.75;display:inline-flex;flex-direction:column;min-width:0;text-align:left;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-form-field-container-text-font, var(--mat-sys-body-large-font));line-height:var(--mat-form-field-container-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mat-form-field-container-text-size, var(--mat-sys-body-large-size));letter-spacing:var(--mat-form-field-container-text-tracking, var(--mat-sys-body-large-tracking));font-weight:var(--mat-form-field-container-text-weight, var(--mat-sys-body-large-weight))}.mat-mdc-form-field .mdc-text-field--outlined .mdc-floating-label--float-above{font-size:calc(var(--mat-form-field-outlined-label-text-populated-size)*var(--mat-mdc-form-field-floating-label-scale))}.mat-mdc-form-field .mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:var(--mat-form-field-outlined-label-text-populated-size)}[dir=rtl] .mat-mdc-form-field{text-align:right}.mat-mdc-form-field-flex{display:inline-flex;align-items:baseline;box-sizing:border-box;width:100%}.mat-mdc-text-field-wrapper{width:100%;z-index:0}.mat-mdc-form-field-icon-prefix,.mat-mdc-form-field-icon-suffix{align-self:center;line-height:0;pointer-events:auto;position:relative;z-index:1}.mat-mdc-form-field-icon-prefix>.mat-icon,.mat-mdc-form-field-icon-suffix>.mat-icon{padding:0 12px;box-sizing:content-box}.mat-mdc-form-field-icon-prefix{color:var(--mat-form-field-leading-icon-color, var(--mat-sys-on-surface-variant))}.mat-form-field-disabled .mat-mdc-form-field-icon-prefix{color:var(--mat-form-field-disabled-leading-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-form-field-disabled .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-disabled-trailing-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-invalid .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-trailing-icon-color, var(--mat-sys-error))}.mat-form-field-invalid:not(.mat-focused):not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper:hover .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-hover-trailing-icon-color, var(--mat-sys-on-error-container))}.mat-form-field-invalid.mat-focused .mat-mdc-text-field-wrapper .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-focus-trailing-icon-color, var(--mat-sys-error))}.mat-mdc-form-field-icon-prefix,[dir=rtl] .mat-mdc-form-field-icon-suffix{padding:0 4px 0 0}.mat-mdc-form-field-icon-suffix,[dir=rtl] .mat-mdc-form-field-icon-prefix{padding:0 0 0 4px}.mat-mdc-form-field-subscript-wrapper .mat-icon,.mat-mdc-form-field label .mat-icon{width:1em;height:1em;font-size:inherit}.mat-mdc-form-field-infix{flex:auto;min-width:0;width:180px;position:relative;box-sizing:border-box}.mat-mdc-form-field-infix:has(textarea[cols]){width:auto}.mat-mdc-form-field .mdc-notched-outline__notch{margin-left:-1px;-webkit-clip-path:inset(-9em -999em -9em 1px);clip-path:inset(-9em -999em -9em 1px)}[dir=rtl] .mat-mdc-form-field .mdc-notched-outline__notch{margin-left:0;margin-right:-1px;-webkit-clip-path:inset(-9em 1px -9em -999em);clip-path:inset(-9em 1px -9em -999em)}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:transform 150ms cubic-bezier(0.4, 0, 0.2, 1),color 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-text-field__input{transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-text-field__input::placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-text-field__input::-moz-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-text-field__input::-webkit-input-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-text-field__input:-ms-input-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--no-label .mdc-text-field__input::placeholder,.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--focused .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--no-label .mdc-text-field__input::-moz-placeholder,.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--focused .mdc-text-field__input::-moz-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-text-field--filled:not(.mdc-ripple-upgraded):focus .mdc-text-field__ripple::before{transition-duration:75ms}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-line-ripple::after{transition:transform 180ms cubic-bezier(0.4, 0, 0.2, 1),opacity 180ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-notched-outline .mdc-floating-label{max-width:calc(100% + 1px)}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:calc(133.3333333333% + 1px)}'],encapsulation:2,data:{animation:[h5e.transitionMessages]},changeDetection:0})}return t})(),gl=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({imports:[ui,H4,ui]})}return t})();var bX=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["ng-component"]],hostAttrs:["cdk-text-field-style-loader",""],decls:0,vars:0,template:function(i,n){},styles:["textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0 !important;box-sizing:content-box !important;height:auto !important;overflow:hidden !important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0 !important;box-sizing:content-box !important;height:0 !important}@keyframes cdk-text-field-autofill-start{/*!*/}@keyframes cdk-text-field-autofill-end{/*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){animation:cdk-text-field-autofill-end 0s 1ms}"],encapsulation:2,changeDetection:0})}return t})(),vX=Gl({passive:!0}),MX=(()=>{class t{_platform=E(mi);_ngZone=E(yA);_styleLoader=E(Wn);_monitoredElements=new Map;constructor(){}monitor(e){if(!this._platform.isBrowser)return vr;this._styleLoader.load(bX);let i=wc(e),n=this._monitoredElements.get(i);if(n)return n.subject;let o=new je,r="cdk-text-field-autofilled",s=a=>{a.animationName==="cdk-text-field-autofill-start"&&!i.classList.contains(r)?(i.classList.add(r),this._ngZone.run(()=>o.next({target:a.target,isAutofilled:!0}))):a.animationName==="cdk-text-field-autofill-end"&&i.classList.contains(r)&&(i.classList.remove(r),this._ngZone.run(()=>o.next({target:a.target,isAutofilled:!1})))};return this._ngZone.runOutsideAngular(()=>{i.addEventListener("animationstart",s,vX),i.classList.add("cdk-text-field-autofill-monitored")}),this._monitoredElements.set(i,{subject:o,unlisten:()=>{i.removeEventListener("animationstart",s,vX)}}),o}stopMonitoring(e){let i=wc(e),n=this._monitoredElements.get(i);n&&(n.unlisten(),n.subject.complete(),i.classList.remove("cdk-text-field-autofill-monitored"),i.classList.remove("cdk-text-field-autofilled"),this._monitoredElements.delete(i))}ngOnDestroy(){this._monitoredElements.forEach((e,i)=>this.stopMonitoring(i))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var z5=(()=>{class t{_elementRef=E(eA);_platform=E(mi);_ngZone=E(yA);_renderer=E(an);_resizeEvents=new je;_previousValue;_initialHeight;_destroyed=new je;_listenerCleanups;_minRows;_maxRows;_enabled=!0;_previousMinRows=-1;_textareaElement;get minRows(){return this._minRows}set minRows(e){this._minRows=Za(e),this._setMinHeight()}get maxRows(){return this._maxRows}set maxRows(e){this._maxRows=Za(e),this._setMaxHeight()}get enabled(){return this._enabled}set enabled(e){this._enabled!==e&&((this._enabled=e)?this.resizeToFitContent(!0):this.reset())}get placeholder(){return this._textareaElement.placeholder}set placeholder(e){this._cachedPlaceholderHeight=void 0,e?this._textareaElement.setAttribute("placeholder",e):this._textareaElement.removeAttribute("placeholder"),this._cacheTextareaPlaceholderHeight()}_cachedLineHeight;_cachedPlaceholderHeight;_document=E(ht,{optional:!0});_hasFocus;_isViewInited=!1;constructor(){E(Wn).load(bX),this._textareaElement=this._elementRef.nativeElement}_setMinHeight(){let e=this.minRows&&this._cachedLineHeight?`${this.minRows*this._cachedLineHeight}px`:null;e&&(this._textareaElement.style.minHeight=e)}_setMaxHeight(){let e=this.maxRows&&this._cachedLineHeight?`${this.maxRows*this._cachedLineHeight}px`:null;e&&(this._textareaElement.style.maxHeight=e)}ngAfterViewInit(){this._platform.isBrowser&&(this._initialHeight=this._textareaElement.style.height,this.resizeToFitContent(),this._ngZone.runOutsideAngular(()=>{this._listenerCleanups=[this._renderer.listen("window","resize",()=>this._resizeEvents.next()),this._renderer.listen(this._textareaElement,"focus",this._handleFocusEvent),this._renderer.listen(this._textareaElement,"blur",this._handleFocusEvent)],this._resizeEvents.pipe(Ph(16)).subscribe(()=>{this._cachedLineHeight=this._cachedPlaceholderHeight=void 0,this.resizeToFitContent(!0)})}),this._isViewInited=!0,this.resizeToFitContent(!0))}ngOnDestroy(){this._listenerCleanups?.forEach(e=>e()),this._resizeEvents.complete(),this._destroyed.next(),this._destroyed.complete()}_cacheTextareaLineHeight(){if(this._cachedLineHeight)return;let e=this._textareaElement.cloneNode(!1),i=e.style;e.rows=1,i.position="absolute",i.visibility="hidden",i.border="none",i.padding="0",i.height="",i.minHeight="",i.maxHeight="",i.top=i.bottom=i.left=i.right="auto",i.overflow="hidden",this._textareaElement.parentNode.appendChild(e),this._cachedLineHeight=e.clientHeight,e.remove(),this._setMinHeight(),this._setMaxHeight()}_measureScrollHeight(){let e=this._textareaElement,i=e.style.marginBottom||"",n=this._platform.FIREFOX,o=n&&this._hasFocus,r=n?"cdk-textarea-autosize-measuring-firefox":"cdk-textarea-autosize-measuring";o&&(e.style.marginBottom=`${e.clientHeight}px`),e.classList.add(r);let s=e.scrollHeight-4;return e.classList.remove(r),o&&(e.style.marginBottom=i),s}_cacheTextareaPlaceholderHeight(){if(!this._isViewInited||this._cachedPlaceholderHeight!=null)return;if(!this.placeholder){this._cachedPlaceholderHeight=0;return}let e=this._textareaElement.value;this._textareaElement.value=this._textareaElement.placeholder,this._cachedPlaceholderHeight=this._measureScrollHeight(),this._textareaElement.value=e}_handleFocusEvent=e=>{this._hasFocus=e.type==="focus"};ngDoCheck(){this._platform.isBrowser&&this.resizeToFitContent()}resizeToFitContent(e=!1){if(!this._enabled||(this._cacheTextareaLineHeight(),this._cacheTextareaPlaceholderHeight(),!this._cachedLineHeight))return;let i=this._elementRef.nativeElement,n=i.value;if(!e&&this._minRows===this._previousMinRows&&n===this._previousValue)return;let o=this._measureScrollHeight(),r=Math.max(o,this._cachedPlaceholderHeight||0);i.style.height=`${r}px`,this._ngZone.runOutsideAngular(()=>{typeof requestAnimationFrame<"u"?requestAnimationFrame(()=>this._scrollToCaretPosition(i)):setTimeout(()=>this._scrollToCaretPosition(i))}),this._previousValue=n,this._previousMinRows=this._minRows}reset(){this._initialHeight!==void 0&&(this._textareaElement.style.height=this._initialHeight)}_noopInputHandler(){}_scrollToCaretPosition(e){let{selectionStart:i,selectionEnd:n}=e;!this._destroyed.isStopped&&this._hasFocus&&e.setSelectionRange(i,n)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["textarea","cdkTextareaAutosize",""]],hostAttrs:["rows","1",1,"cdk-textarea-autosize"],hostBindings:function(i,n){i&1&&ee("input",function(){return n._noopInputHandler()})},inputs:{minRows:[0,"cdkAutosizeMinRows","minRows"],maxRows:[0,"cdkAutosizeMaxRows","maxRows"],enabled:[2,"cdkTextareaAutosize","enabled",IA],placeholder:"placeholder"},exportAs:["cdkTextareaAutosize"]})}return t})(),YB=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({})}return t})();var Q5e=new re("MAT_INPUT_VALUE_ACCESSOR"),m5e=["button","checkbox","file","hidden","image","radio","range","reset","submit"],p5e=new re("MAT_INPUT_CONFIG"),Gs=(()=>{class t{_elementRef=E(eA);_platform=E(mi);ngControl=E(rl,{optional:!0,self:!0});_autofillMonitor=E(MX);_ngZone=E(yA);_formField=E(q4,{optional:!0});_renderer=E(an);_uid=E(un).getId("mat-input-");_previousNativeValue;_inputValueAccessor;_signalBasedValueAccessor;_previousPlaceholder;_errorStateTracker;_config=E(p5e,{optional:!0});_cleanupIosKeyup;_cleanupWebkitWheel;_formFieldDescribedBy;_isServer;_isNativeSelect;_isTextarea;_isInFormField;focused=!1;stateChanges=new je;controlType="mat-input";autofilled=!1;get disabled(){return this._disabled}set disabled(e){this._disabled=Sr(e),this.focused&&(this.focused=!1,this.stateChanges.next())}_disabled=!1;get id(){return this._id}set id(e){this._id=e||this._uid}_id;placeholder;name;get required(){return this._required??this.ngControl?.control?.hasValidator(ol.required)??!1}set required(e){this._required=Sr(e)}_required;get type(){return this._type}set type(e){let i=this._type;this._type=e||"text",this._validateType(),!this._isTextarea&&IN().has(this._type)&&(this._elementRef.nativeElement.type=this._type),this._type!==i&&this._ensureWheelDefaultBehavior()}_type="text";get errorStateMatcher(){return this._errorStateTracker.matcher}set errorStateMatcher(e){this._errorStateTracker.matcher=e}userAriaDescribedBy;get value(){return this._signalBasedValueAccessor?this._signalBasedValueAccessor.value():this._inputValueAccessor.value}set value(e){e!==this.value&&(this._signalBasedValueAccessor?this._signalBasedValueAccessor.value.set(e):this._inputValueAccessor.value=e,this.stateChanges.next())}get readonly(){return this._readonly}set readonly(e){this._readonly=Sr(e)}_readonly=!1;disabledInteractive;get errorState(){return this._errorStateTracker.errorState}set errorState(e){this._errorStateTracker.errorState=e}_neverEmptyInputTypes=["date","datetime","datetime-local","month","time","week"].filter(e=>IN().has(e));constructor(){let e=E(J4,{optional:!0}),i=E(jI,{optional:!0}),n=E(TB),o=E(Q5e,{optional:!0,self:!0}),r=this._elementRef.nativeElement,s=r.nodeName.toLowerCase();o?y1(o.value)?this._signalBasedValueAccessor=o:this._inputValueAccessor=o:this._inputValueAccessor=r,this._previousNativeValue=this.value,this.id=this.id,this._platform.IOS&&this._ngZone.runOutsideAngular(()=>{this._cleanupIosKeyup=this._renderer.listen(r,"keyup",this._iOSKeyupListener)}),this._errorStateTracker=new tu(n,this.ngControl,i,e,this.stateChanges),this._isServer=!this._platform.isBrowser,this._isNativeSelect=s==="select",this._isTextarea=s==="textarea",this._isInFormField=!!this._formField,this.disabledInteractive=this._config?.disabledInteractive||!1,this._isNativeSelect&&(this.controlType=r.multiple?"mat-native-select-multiple":"mat-native-select"),this._signalBasedValueAccessor&&pa(()=>{this._signalBasedValueAccessor.value(),this.stateChanges.next()})}ngAfterViewInit(){this._platform.isBrowser&&this._autofillMonitor.monitor(this._elementRef.nativeElement).subscribe(e=>{this.autofilled=e.isAutofilled,this.stateChanges.next()})}ngOnChanges(){this.stateChanges.next()}ngOnDestroy(){this.stateChanges.complete(),this._platform.isBrowser&&this._autofillMonitor.stopMonitoring(this._elementRef.nativeElement),this._cleanupIosKeyup?.(),this._cleanupWebkitWheel?.()}ngDoCheck(){this.ngControl&&(this.updateErrorState(),this.ngControl.disabled!==null&&this.ngControl.disabled!==this.disabled&&(this.disabled=this.ngControl.disabled,this.stateChanges.next())),this._dirtyCheckNativeValue(),this._dirtyCheckPlaceholder()}focus(e){this._elementRef.nativeElement.focus(e)}updateErrorState(){this._errorStateTracker.updateErrorState()}_focusChanged(e){if(e!==this.focused){if(!this._isNativeSelect&&e&&this.disabled&&this.disabledInteractive){let i=this._elementRef.nativeElement;i.type==="number"?(i.type="text",i.setSelectionRange(0,0),i.type="number"):i.setSelectionRange(0,0)}this.focused=e,this.stateChanges.next()}}_onInput(){}_dirtyCheckNativeValue(){let e=this._elementRef.nativeElement.value;this._previousNativeValue!==e&&(this._previousNativeValue=e,this.stateChanges.next())}_dirtyCheckPlaceholder(){let e=this._getPlaceholder();if(e!==this._previousPlaceholder){let i=this._elementRef.nativeElement;this._previousPlaceholder=e,e?i.setAttribute("placeholder",e):i.removeAttribute("placeholder")}}_getPlaceholder(){return this.placeholder||null}_validateType(){m5e.indexOf(this._type)>-1}_isNeverEmpty(){return this._neverEmptyInputTypes.indexOf(this._type)>-1}_isBadInput(){let e=this._elementRef.nativeElement.validity;return e&&e.badInput}get empty(){return!this._isNeverEmpty()&&!this._elementRef.nativeElement.value&&!this._isBadInput()&&!this.autofilled}get shouldLabelFloat(){if(this._isNativeSelect){let e=this._elementRef.nativeElement,i=e.options[0];return this.focused||e.multiple||!this.empty||!!(e.selectedIndex>-1&&i&&i.label)}else return this.focused&&!this.disabled||!this.empty}setDescribedByIds(e){let i=this._elementRef.nativeElement,n=i.getAttribute("aria-describedby"),o;if(n){let r=this._formFieldDescribedBy||e;o=e.concat(n.split(" ").filter(s=>s&&!r.includes(s)))}else o=e;this._formFieldDescribedBy=e,o.length?i.setAttribute("aria-describedby",o.join(" ")):i.removeAttribute("aria-describedby")}onContainerClick(){this.focused||this.focus()}_isInlineSelect(){let e=this._elementRef.nativeElement;return this._isNativeSelect&&(e.multiple||e.size>1)}_iOSKeyupListener=e=>{let i=e.target;!i.value&&i.selectionStart===0&&i.selectionEnd===0&&(i.setSelectionRange(1,1),i.setSelectionRange(0,0))};_webkitBlinkWheelListener=()=>{};_ensureWheelDefaultBehavior(){this._cleanupWebkitWheel?.(),this._type==="number"&&(this._platform.BLINK||this._platform.WEBKIT)&&(this._cleanupWebkitWheel=this._renderer.listen(this._elementRef.nativeElement,"wheel",this._webkitBlinkWheelListener))}_getReadonlyAttribute(){return this._isNativeSelect?null:this.readonly||this.disabled&&this.disabledInteractive?"true":null}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["input","matInput",""],["textarea","matInput",""],["select","matNativeControl",""],["input","matNativeControl",""],["textarea","matNativeControl",""]],hostAttrs:[1,"mat-mdc-input-element"],hostVars:21,hostBindings:function(i,n){i&1&&ee("focus",function(){return n._focusChanged(!0)})("blur",function(){return n._focusChanged(!1)})("input",function(){return n._onInput()}),i&2&&(ea("id",n.id)("disabled",n.disabled&&!n.disabledInteractive)("required",n.required),AA("name",n.name||null)("readonly",n._getReadonlyAttribute())("aria-disabled",n.disabled&&n.disabledInteractive?"true":null)("aria-invalid",n.empty&&n.required?null:n.errorState)("aria-required",n.required)("id",n.id),iA("mat-input-server",n._isServer)("mat-mdc-form-field-textarea-control",n._isInFormField&&n._isTextarea)("mat-mdc-form-field-input-control",n._isInFormField)("mat-mdc-input-disabled-interactive",n.disabledInteractive)("mdc-text-field__input",n._isInFormField)("mat-mdc-native-select-inline",n._isInlineSelect()))},inputs:{disabled:"disabled",id:"id",placeholder:"placeholder",name:"name",required:"required",type:"type",errorStateMatcher:"errorStateMatcher",userAriaDescribedBy:[0,"aria-describedby","userAriaDescribedBy"],value:"value",readonly:"readonly",disabledInteractive:[2,"disabledInteractive","disabledInteractive",IA]},exportAs:["matInput"],features:[gt([{provide:V4,useExisting:t}]),ti]})}return t})(),L1=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({imports:[ui,gl,gl,YB,ui]})}return t})();var V5=new re(""),jN=(()=>{class t{_zone;_plugins;_eventNameToPlugin=new Map;constructor(e,i){this._zone=i,e.forEach(n=>{n.manager=this}),this._plugins=e.slice().reverse()}addEventListener(e,i,n,o){return this._findPluginFor(i).addEventListener(e,i,n,o)}getZone(){return this._zone}_findPluginFor(e){let i=this._eventNameToPlugin.get(e);if(i)return i;if(i=this._plugins.find(o=>o.supports(e)),!i)throw new lA(5101,!1);return this._eventNameToPlugin.set(e,i),i}static \u0275fac=function(i){return new(i||t)(UA(V5),UA(yA))};static \u0275prov=be({token:t,factory:t.\u0275fac})}return t})(),W4=class{_doc;constructor(A){this._doc=A}manager},P5="ng-app-id";function kX(t){for(let A of t)A.remove()}function xX(t,A){let e=A.createElement("style");return e.textContent=t,e}function w5e(t,A,e,i){let n=t.head?.querySelectorAll(`style[${P5}="${A}"],link[${P5}="${A}"]`);if(n)for(let o of n)o.removeAttribute(P5),o instanceof HTMLLinkElement?i.set(o.href.slice(o.href.lastIndexOf("/")+1),{usage:0,elements:[o]}):o.textContent&&e.set(o.textContent,{usage:0,elements:[o]})}function zN(t,A){let e=A.createElement("link");return e.setAttribute("rel","stylesheet"),e.setAttribute("href",t),e}var VN=(()=>{class t{doc;appId;nonce;inline=new Map;external=new Map;hosts=new Set;isServer;constructor(e,i,n,o={}){this.doc=e,this.appId=i,this.nonce=n,this.isServer=t5(o),w5e(e,i,this.inline,this.external),this.hosts.add(e.head)}addStyles(e,i){for(let n of e)this.addUsage(n,this.inline,xX);i?.forEach(n=>this.addUsage(n,this.external,zN))}removeStyles(e,i){for(let n of e)this.removeUsage(n,this.inline);i?.forEach(n=>this.removeUsage(n,this.external))}addUsage(e,i,n){let o=i.get(e);o?o.usage++:i.set(e,{usage:1,elements:[...this.hosts].map(r=>this.addElement(r,n(e,this.doc)))})}removeUsage(e,i){let n=i.get(e);n&&(n.usage--,n.usage<=0&&(kX(n.elements),i.delete(e)))}ngOnDestroy(){for(let[,{elements:e}]of[...this.inline,...this.external])kX(e);this.hosts.clear()}addHost(e){this.hosts.add(e);for(let[i,{elements:n}]of this.inline)n.push(this.addElement(e,xX(i,this.doc)));for(let[i,{elements:n}]of this.external)n.push(this.addElement(e,zN(i,this.doc)))}removeHost(e){this.hosts.delete(e)}addElement(e,i){return this.nonce&&i.setAttribute("nonce",this.nonce),this.isServer&&i.setAttribute(P5,this.appId),e.appendChild(i)}static \u0275fac=function(i){return new(i||t)(UA(ht),UA(fB),UA(E4,8),UA(O0))};static \u0275prov=be({token:t,factory:t.\u0275fac})}return t})(),HN={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/",math:"http://www.w3.org/1998/Math/MathML"},qN=/%COMP%/g;var RX="%COMP%",y5e=`_nghost-${RX}`,D5e=`_ngcontent-${RX}`,v5e=!0,b5e=new re("",{providedIn:"root",factory:()=>v5e});function M5e(t){return D5e.replace(qN,t)}function S5e(t){return y5e.replace(qN,t)}function NX(t,A){return A.map(e=>e.replace(qN,t))}var $4=(()=>{class t{eventManager;sharedStylesHost;appId;removeStylesOnCompDestroy;doc;platformId;ngZone;nonce;tracingService;rendererByCompId=new Map;defaultRenderer;platformIsServer;constructor(e,i,n,o,r,s,a,c=null,l=null){this.eventManager=e,this.sharedStylesHost=i,this.appId=n,this.removeStylesOnCompDestroy=o,this.doc=r,this.platformId=s,this.ngZone=a,this.nonce=c,this.tracingService=l,this.platformIsServer=t5(s),this.defaultRenderer=new Z4(e,r,a,this.platformIsServer,this.tracingService)}createRenderer(e,i){if(!e||!i)return this.defaultRenderer;this.platformIsServer&&i.encapsulation===L0.ShadowDom&&(i=_A(ae({},i),{encapsulation:L0.Emulated}));let n=this.getOrCreateRenderer(e,i);return n instanceof j5?n.applyToHost(e):n instanceof X4&&n.applyStyles(),n}getOrCreateRenderer(e,i){let n=this.rendererByCompId,o=n.get(i.id);if(!o){let r=this.doc,s=this.ngZone,a=this.eventManager,c=this.sharedStylesHost,l=this.removeStylesOnCompDestroy,d=this.platformIsServer,C=this.tracingService;switch(i.encapsulation){case L0.Emulated:o=new j5(a,c,i,this.appId,l,r,s,d,C);break;case L0.ShadowDom:return new PN(a,c,e,i,r,s,this.nonce,d,C);default:o=new X4(a,c,i,l,r,s,d,C);break}n.set(i.id,o)}return o}ngOnDestroy(){this.rendererByCompId.clear()}componentReplaced(e){this.rendererByCompId.delete(e)}static \u0275fac=function(i){return new(i||t)(UA(jN),UA(VN),UA(fB),UA(b5e),UA(ht),UA(O0),UA(yA),UA(E4),UA(QB,8))};static \u0275prov=be({token:t,factory:t.\u0275fac})}return t})(),Z4=class{eventManager;doc;ngZone;platformIsServer;tracingService;data=Object.create(null);throwOnSyntheticProps=!0;constructor(A,e,i,n,o){this.eventManager=A,this.doc=e,this.ngZone=i,this.platformIsServer=n,this.tracingService=o}destroy(){}destroyNode=null;createElement(A,e){return e?this.doc.createElementNS(HN[e]||e,A):this.doc.createElement(A)}createComment(A){return this.doc.createComment(A)}createText(A){return this.doc.createTextNode(A)}appendChild(A,e){(_X(A)?A.content:A).appendChild(e)}insertBefore(A,e,i){A&&(_X(A)?A.content:A).insertBefore(e,i)}removeChild(A,e){e.remove()}selectRootElement(A,e){let i=typeof A=="string"?this.doc.querySelector(A):A;if(!i)throw new lA(-5104,!1);return e||(i.textContent=""),i}parentNode(A){return A.parentNode}nextSibling(A){return A.nextSibling}setAttribute(A,e,i,n){if(n){e=n+":"+e;let o=HN[n];o?A.setAttributeNS(o,e,i):A.setAttribute(e,i)}else A.setAttribute(e,i)}removeAttribute(A,e,i){if(i){let n=HN[i];n?A.removeAttributeNS(n,e):A.removeAttribute(`${i}:${e}`)}else A.removeAttribute(e)}addClass(A,e){A.classList.add(e)}removeClass(A,e){A.classList.remove(e)}setStyle(A,e,i,n){n&(F0.DashCase|F0.Important)?A.style.setProperty(e,i,n&F0.Important?"important":""):A.style[e]=i}removeStyle(A,e,i){i&F0.DashCase?A.style.removeProperty(e):A.style[e]=""}setProperty(A,e,i){A!=null&&(A[e]=i)}setValue(A,e){A.nodeValue=e}listen(A,e,i,n){if(typeof A=="string"&&(A=il().getGlobalEventTarget(this.doc,A),!A))throw new lA(5102,!1);let o=this.decoratePreventDefault(i);return this.tracingService?.wrapEventListener&&(o=this.tracingService.wrapEventListener(A,e,o)),this.eventManager.addEventListener(A,e,o,n)}decoratePreventDefault(A){return e=>{if(e==="__ngUnwrap__")return A;(this.platformIsServer?this.ngZone.runGuarded(()=>A(e)):A(e))===!1&&e.preventDefault()}}};function _X(t){return t.tagName==="TEMPLATE"&&t.content!==void 0}var PN=class extends Z4{sharedStylesHost;hostEl;shadowRoot;constructor(A,e,i,n,o,r,s,a,c){super(A,o,r,a,c),this.sharedStylesHost=e,this.hostEl=i,this.shadowRoot=i.attachShadow({mode:"open"}),this.sharedStylesHost.addHost(this.shadowRoot);let l=n.styles;l=NX(n.id,l);for(let C of l){let I=document.createElement("style");s&&I.setAttribute("nonce",s),I.textContent=C,this.shadowRoot.appendChild(I)}let d=n.getExternalStyles?.();if(d)for(let C of d){let I=zN(C,o);s&&I.setAttribute("nonce",s),this.shadowRoot.appendChild(I)}}nodeOrShadowRoot(A){return A===this.hostEl?this.shadowRoot:A}appendChild(A,e){return super.appendChild(this.nodeOrShadowRoot(A),e)}insertBefore(A,e,i){return super.insertBefore(this.nodeOrShadowRoot(A),e,i)}removeChild(A,e){return super.removeChild(null,e)}parentNode(A){return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(A)))}destroy(){this.sharedStylesHost.removeHost(this.shadowRoot)}},X4=class extends Z4{sharedStylesHost;removeStylesOnCompDestroy;styles;styleUrls;constructor(A,e,i,n,o,r,s,a,c){super(A,o,r,s,a),this.sharedStylesHost=e,this.removeStylesOnCompDestroy=n;let l=i.styles;this.styles=c?NX(c,l):l,this.styleUrls=i.getExternalStyles?.(c)}applyStyles(){this.sharedStylesHost.addStyles(this.styles,this.styleUrls)}destroy(){this.removeStylesOnCompDestroy&&this.sharedStylesHost.removeStyles(this.styles,this.styleUrls)}},j5=class extends X4{contentAttr;hostAttr;constructor(A,e,i,n,o,r,s,a,c){let l=n+"-"+i.id;super(A,e,i,o,r,s,a,c,l),this.contentAttr=M5e(l),this.hostAttr=S5e(l)}applyToHost(A){this.applyStyles(),this.setAttribute(A,this.hostAttr,"")}createElement(A,e){let i=super.createElement(A,e);return super.setAttribute(i,this.contentAttr,""),i}};var q5=class t extends M4{supportsDOMEvents=!0;static makeCurrent(){LR(new t)}onAndCancel(A,e,i,n){return A.addEventListener(e,i,n),()=>{A.removeEventListener(e,i,n)}}dispatchEvent(A,e){A.dispatchEvent(e)}remove(A){A.remove()}createElement(A,e){return e=e||this.getDefaultDocument(),e.createElement(A)}createHtmlDocument(){return document.implementation.createHTMLDocument("fakeTitle")}getDefaultDocument(){return document}isElementNode(A){return A.nodeType===Node.ELEMENT_NODE}isShadowRoot(A){return A instanceof DocumentFragment}getGlobalEventTarget(A,e){return e==="window"?window:e==="document"?A:e==="body"?A.body:null}getBaseHref(A){let e=k5e();return e==null?null:x5e(e)}resetBaseElement(){em=null}getUserAgent(){return window.navigator.userAgent}getCookie(A){return k4(document.cookie,A)}},em=null;function k5e(){return em=em||document.head.querySelector("base"),em?em.getAttribute("href"):null}function x5e(t){return new URL(t,document.baseURI).pathname}var W5=class{addToWindow(A){Xc.getAngularTestability=(i,n=!0)=>{let o=A.findTestabilityInTree(i,n);if(o==null)throw new lA(5103,!1);return o},Xc.getAllAngularTestabilities=()=>A.getAllTestabilities(),Xc.getAllAngularRootElements=()=>A.getAllRootElements();let e=i=>{let n=Xc.getAllAngularTestabilities(),o=n.length,r=function(){o--,o==0&&i()};n.forEach(s=>{s.whenStable(r)})};Xc.frameworkStabilizers||(Xc.frameworkStabilizers=[]),Xc.frameworkStabilizers.push(e)}findTestabilityInTree(A,e,i){if(e==null)return null;let n=A.getTestability(e);return n??(i?il().isShadowRoot(e)?this.findTestabilityInTree(A,e.host,!0):this.findTestabilityInTree(A,e.parentElement,!0):null)}},_5e=(()=>{class t{build(){return new XMLHttpRequest}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac})}return t})(),FX=(()=>{class t extends W4{constructor(e){super(e)}supports(e){return!0}addEventListener(e,i,n,o){return e.addEventListener(i,n,o),()=>this.removeEventListener(e,i,n,o)}removeEventListener(e,i,n,o){return e.removeEventListener(i,n,o)}static \u0275fac=function(i){return new(i||t)(UA(ht))};static \u0275prov=be({token:t,factory:t.\u0275fac})}return t})(),LX=["alt","control","meta","shift"],R5e={"\b":"Backspace"," ":"Tab","\x7F":"Delete","\x1B":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},N5e={alt:t=>t.altKey,control:t=>t.ctrlKey,meta:t=>t.metaKey,shift:t=>t.shiftKey},GX=(()=>{class t extends W4{constructor(e){super(e)}supports(e){return t.parseEventName(e)!=null}addEventListener(e,i,n,o){let r=t.parseEventName(i),s=t.eventCallback(r.fullKey,n,this.manager.getZone());return this.manager.getZone().runOutsideAngular(()=>il().onAndCancel(e,r.domEventName,s,o))}static parseEventName(e){let i=e.toLowerCase().split("."),n=i.shift();if(i.length===0||!(n==="keydown"||n==="keyup"))return null;let o=t._normalizeKey(i.pop()),r="",s=i.indexOf("code");if(s>-1&&(i.splice(s,1),r="code."),LX.forEach(c=>{let l=i.indexOf(c);l>-1&&(i.splice(l,1),r+=c+".")}),r+=o,i.length!=0||o.length===0)return null;let a={};return a.domEventName=n,a.fullKey=r,a}static matchEventFullKeyCode(e,i){let n=R5e[e.key]||e.key,o="";return i.indexOf("code.")>-1&&(n=e.code,o="code."),n==null||!n?!1:(n=n.toLowerCase(),n===" "?n="space":n==="."&&(n="dot"),LX.forEach(r=>{if(r!==n){let s=N5e[r];s(e)&&(o+=r+".")}}),o+=n,o===i)}static eventCallback(e,i,n){return o=>{t.matchEventFullKeyCode(o,e)&&n.runGuarded(()=>i(o))}}static _normalizeKey(e){return e==="esc"?"escape":e}static \u0275fac=function(i){return new(i||t)(UA(ht))};static \u0275prov=be({token:t,factory:t.\u0275fac})}return t})();function WN(t,A,e){return RW(ae({rootComponent:t,platformRef:e?.platformRef},L5e(A)))}function L5e(t){return{appProviders:[...KX,...t?.providers??[]],platformProviders:U5e}}function F5e(){q5.makeCurrent()}function G5e(){return new Va}function K5e(){return PV(document),document}var U5e=[{provide:O0,useValue:A5},{provide:X_,useValue:F5e,multi:!0},{provide:ht,useFactory:K5e}];var T5e=[{provide:D4,useClass:W5},{provide:yR,useClass:zw,deps:[yA,Pw,D4]},{provide:zw,useClass:zw,deps:[yA,Pw,D4]}],KX=[{provide:Dw,useValue:"root"},{provide:Va,useFactory:G5e},{provide:V5,useClass:FX,multi:!0,deps:[ht]},{provide:V5,useClass:GX,multi:!0,deps:[ht]},$4,VN,jN,{provide:fa,useExisting:$4},{provide:zI,useClass:_5e},[]],ZN=(()=>{class t{constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({providers:[...KX,...T5e],imports:[Ur,_W]})}return t})();var UX=(()=>{class t{_doc;constructor(e){this._doc=e}getTitle(){return this._doc.title}setTitle(e){this._doc.title=e||""}static \u0275fac=function(i){return new(i||t)(UA(ht))};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var dl=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:function(i){let n=null;return i?n=new(i||t):n=UA(O5e),n},providedIn:"root"})}return t})(),O5e=(()=>{class t extends dl{_doc;constructor(e){super(),this._doc=e}sanitize(e,i){if(i==null)return null;switch(e){case Ls.NONE:return i;case Ls.HTML:return D1(i,"HTML")?Ll(i):tR(this._doc,String(i)).toString();case Ls.STYLE:return D1(i,"Style")?Ll(i):i;case Ls.SCRIPT:if(D1(i,"Script"))return Ll(i);throw new lA(5200,!1);case Ls.URL:return D1(i,"URL")?Ll(i):Lw(String(i));case Ls.RESOURCE_URL:if(D1(i,"ResourceURL"))return Ll(i);throw new lA(5201,!1);default:throw new lA(5202,!1)}}bypassSecurityTrustHtml(e){return $V(e)}bypassSecurityTrustStyle(e){return eq(e)}bypassSecurityTrustScript(e){return Aq(e)}bypassSecurityTrustUrl(e){return tq(e)}bypassSecurityTrustResourceUrl(e){return iq(e)}static \u0275fac=function(i){return new(i||t)(UA(ht))};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function TX(t){return new lA(3e3,!1)}function J5e(){return new lA(3100,!1)}function Y5e(){return new lA(3101,!1)}function H5e(t){return new lA(3001,!1)}function z5e(t){return new lA(3003,!1)}function P5e(t){return new lA(3004,!1)}function JX(t,A){return new lA(3005,!1)}function YX(){return new lA(3006,!1)}function HX(){return new lA(3007,!1)}function zX(t,A){return new lA(3008,!1)}function PX(t){return new lA(3002,!1)}function jX(t,A,e,i,n){return new lA(3010,!1)}function VX(){return new lA(3011,!1)}function qX(){return new lA(3012,!1)}function WX(){return new lA(3200,!1)}function ZX(){return new lA(3202,!1)}function XX(){return new lA(3013,!1)}function $X(t){return new lA(3014,!1)}function e$(t){return new lA(3015,!1)}function A$(t){return new lA(3016,!1)}function t$(t,A){return new lA(3404,!1)}function j5e(t){return new lA(3502,!1)}function i$(t){return new lA(3503,!1)}function n$(){return new lA(3300,!1)}function o$(t){return new lA(3504,!1)}function r$(t){return new lA(3301,!1)}function s$(t,A){return new lA(3302,!1)}function a$(t){return new lA(3303,!1)}function c$(t,A){return new lA(3400,!1)}function l$(t){return new lA(3401,!1)}function g$(t){return new lA(3402,!1)}function d$(t,A){return new lA(3505,!1)}function u2(t){switch(t.length){case 0:return new V0;case 1:return t[0];default:return new iu(t)}}function AL(t,A,e=new Map,i=new Map){let n=[],o=[],r=-1,s=null;if(A.forEach(a=>{let c=a.get("offset"),l=c==r,d=l&&s||new Map;a.forEach((C,I)=>{let u=I,h=C;if(I!=="offset")switch(u=t.normalizePropertyName(u,n),h){case OB:h=e.get(I);break;case Kl:h=i.get(I);break;default:h=t.normalizeStyleValue(I,u,h,n);break}d.set(u,h)}),l||o.push(d),s=d,r=c}),n.length)throw j5e(n);return o}function Z5(t,A,e,i){switch(A){case"start":t.onStart(()=>i(e&&XN(e,"start",t)));break;case"done":t.onDone(()=>i(e&&XN(e,"done",t)));break;case"destroy":t.onDestroy(()=>i(e&&XN(e,"destroy",t)));break}}function XN(t,A,e){let i=e.totalTime,n=!!e.disabled,o=X5(t.element,t.triggerName,t.fromState,t.toState,A||t.phaseName,i??t.totalTime,n),r=t._data;return r!=null&&(o._data=r),o}function X5(t,A,e,i,n="",o=0,r){return{element:t,triggerName:A,fromState:e,toState:i,phaseName:n,totalTime:o,disabled:!!r}}function yc(t,A,e){let i=t.get(A);return i||t.set(A,i=e),i}function tL(t){let A=t.indexOf(":"),e=t.substring(1,A),i=t.slice(A+1);return[e,i]}var V5e=typeof document>"u"?null:document.documentElement;function $5(t){let A=t.parentNode||t.host||null;return A===V5e?null:A}function q5e(t){return t.substring(1,6)=="ebkit"}var nu=null,OX=!1;function C$(t){nu||(nu=W5e()||{},OX=nu.style?"WebkitAppearance"in nu.style:!1);let A=!0;return nu.style&&!q5e(t)&&(A=t in nu.style,!A&&OX&&(A="Webkit"+t.charAt(0).toUpperCase()+t.slice(1)in nu.style)),A}function W5e(){return typeof document<"u"?document.body:null}function iL(t,A){for(;A;){if(A===t)return!0;A=$5(A)}return!1}function nL(t,A,e){if(e)return Array.from(t.querySelectorAll(A));let i=t.querySelector(A);return i?[i]:[]}var Z5e=1e3,oL="{{",X5e="}}",rL="ng-enter",ey="ng-leave",tm="ng-trigger",im=".ng-trigger",sL="ng-animating",Ay=".ng-animating";function W0(t){if(typeof t=="number")return t;let A=t.match(/^(-?[\.\d]+)(m?s)/);return!A||A.length<2?0:$N(parseFloat(A[1]),A[2])}function $N(t,A){switch(A){case"s":return t*Z5e;default:return t}}function nm(t,A,e){return t.hasOwnProperty("duration")?t:$5e(t,A,e)}function $5e(t,A,e){let i=/^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i,n,o=0,r="";if(typeof t=="string"){let s=t.match(i);if(s===null)return A.push(TX(t)),{duration:0,delay:0,easing:""};n=$N(parseFloat(s[1]),s[2]);let a=s[3];a!=null&&(o=$N(parseFloat(a),s[4]));let c=s[5];c&&(r=c)}else n=t;if(!e){let s=!1,a=A.length;n<0&&(A.push(J5e()),s=!0),o<0&&(A.push(Y5e()),s=!0),s&&A.splice(a,0,TX(t))}return{duration:n,delay:o,easing:r}}function I$(t){return t.length?t[0]instanceof Map?t:t.map(A=>new Map(Object.entries(A))):[]}function Sg(t,A,e){A.forEach((i,n)=>{let o=ty(n);e&&!e.has(n)&&e.set(n,t.style[o]),t.style[o]=i})}function F1(t,A){A.forEach((e,i)=>{let n=ty(i);t.style[n]=""})}function HB(t){return Array.isArray(t)?t.length==1?t[0]:IX(t):t}function u$(t,A,e){let i=A.params||{},n=aL(t);n.length&&n.forEach(o=>{i.hasOwnProperty(o)||e.push(H5e(o))})}var eL=new RegExp(`${oL}\\s*(.+?)\\s*${X5e}`,"g");function aL(t){let A=[];if(typeof t=="string"){let e;for(;e=eL.exec(t);)A.push(e[1]);eL.lastIndex=0}return A}function zB(t,A,e){let i=`${t}`,n=i.replace(eL,(o,r)=>{let s=A[r];return s==null&&(e.push(z5e(r)),s=""),s.toString()});return n==i?t:n}var eye=/-+([a-z0-9])/g;function ty(t){return t.replace(eye,(...A)=>A[1].toUpperCase())}function h$(t,A){return t===0||A===0}function B$(t,A,e){if(e.size&&A.length){let i=A[0],n=[];if(e.forEach((o,r)=>{i.has(r)||n.push(r),i.set(r,o)}),n.length)for(let o=1;or.set(s,iy(t,s)))}}return A}function Dc(t,A,e){switch(A.type){case pi.Trigger:return t.visitTrigger(A,e);case pi.State:return t.visitState(A,e);case pi.Transition:return t.visitTransition(A,e);case pi.Sequence:return t.visitSequence(A,e);case pi.Group:return t.visitGroup(A,e);case pi.Animate:return t.visitAnimate(A,e);case pi.Keyframes:return t.visitKeyframes(A,e);case pi.Style:return t.visitStyle(A,e);case pi.Reference:return t.visitReference(A,e);case pi.AnimateChild:return t.visitAnimateChild(A,e);case pi.AnimateRef:return t.visitAnimateRef(A,e);case pi.Query:return t.visitQuery(A,e);case pi.Stagger:return t.visitStagger(A,e);default:throw P5e(A.type)}}function iy(t,A){return window.getComputedStyle(t)[A]}var DL=(()=>{class t{validateStyleProperty(e){return C$(e)}containsElement(e,i){return iL(e,i)}getParentElement(e){return $5(e)}query(e,i,n){return nL(e,i,n)}computeStyle(e,i,n){return n||""}animate(e,i,n,o,r,s=[],a){return new V0(n,o)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac})}return t})(),ru=class{static NOOP=new DL},su=class{};var Aye=new Set(["width","height","minWidth","minHeight","maxWidth","maxHeight","left","top","bottom","right","fontSize","outlineWidth","outlineOffset","paddingTop","paddingLeft","paddingBottom","paddingRight","marginTop","marginLeft","marginBottom","marginRight","borderRadius","borderWidth","borderTopWidth","borderLeftWidth","borderRightWidth","borderBottomWidth","textIndent","perspective"]),ay=class extends su{normalizePropertyName(A,e){return ty(A)}normalizeStyleValue(A,e,i,n){let o="",r=i.toString().trim();if(Aye.has(e)&&i!==0&&i!=="0")if(typeof i=="number")o="px";else{let s=i.match(/^[+-]?[\d\.]+([a-z]*)$/);s&&s[1].length==0&&n.push(JX(A,i))}return r+o}};var cy="*";function tye(t,A){let e=[];return typeof t=="string"?t.split(/\s*,\s*/).forEach(i=>iye(i,e,A)):e.push(t),e}function iye(t,A,e){if(t[0]==":"){let a=nye(t,e);if(typeof a=="function"){A.push(a);return}t=a}let i=t.match(/^(\*|[-\w]+)\s*()\s*(\*|[-\w]+)$/);if(i==null||i.length<4)return e.push(e$(t)),A;let n=i[1],o=i[2],r=i[3];A.push(E$(n,r));let s=n==cy&&r==cy;o[0]=="<"&&!s&&A.push(E$(r,n))}function nye(t,A){switch(t){case":enter":return"void => *";case":leave":return"* => void";case":increment":return(e,i)=>parseFloat(i)>parseFloat(e);case":decrement":return(e,i)=>parseFloat(i) *"}}var ny=new Set(["true","1"]),oy=new Set(["false","0"]);function E$(t,A){let e=ny.has(t)||oy.has(t),i=ny.has(A)||oy.has(A);return(n,o)=>{let r=t==cy||t==n,s=A==cy||A==o;return!r&&e&&typeof n=="boolean"&&(r=n?ny.has(t):oy.has(t)),!s&&i&&typeof o=="boolean"&&(s=o?ny.has(A):oy.has(A)),r&&s}}var M$=":self",oye=new RegExp(`s*${M$}s*,?`,"g");function S$(t,A,e,i){return new IL(t).build(A,e,i)}var f$="",IL=class{_driver;constructor(A){this._driver=A}build(A,e,i){let n=new uL(e);return this._resetContextStyleTimingState(n),Dc(this,HB(A),n)}_resetContextStyleTimingState(A){A.currentQuerySelector=f$,A.collectedStyles=new Map,A.collectedStyles.set(f$,new Map),A.currentTime=0}visitTrigger(A,e){let i=e.queryCount=0,n=e.depCount=0,o=[],r=[];return A.name.charAt(0)=="@"&&e.errors.push(YX()),A.definitions.forEach(s=>{if(this._resetContextStyleTimingState(e),s.type==pi.State){let a=s,c=a.name;c.toString().split(/\s*,\s*/).forEach(l=>{a.name=l,o.push(this.visitState(a,e))}),a.name=c}else if(s.type==pi.Transition){let a=this.visitTransition(s,e);i+=a.queryCount,n+=a.depCount,r.push(a)}else e.errors.push(HX())}),{type:pi.Trigger,name:A.name,states:o,transitions:r,queryCount:i,depCount:n,options:null}}visitState(A,e){let i=this.visitStyle(A.styles,e),n=A.options&&A.options.params||null;if(i.containsDynamicStyles){let o=new Set,r=n||{};i.styles.forEach(s=>{s instanceof Map&&s.forEach(a=>{aL(a).forEach(c=>{r.hasOwnProperty(c)||o.add(c)})})}),o.size&&e.errors.push(zX(A.name,[...o.values()]))}return{type:pi.State,name:A.name,style:i,options:n?{params:n}:null}}visitTransition(A,e){e.queryCount=0,e.depCount=0;let i=Dc(this,HB(A.animation),e),n=tye(A.expr,e.errors);return{type:pi.Transition,matchers:n,animation:i,queryCount:e.queryCount,depCount:e.depCount,options:ou(A.options)}}visitSequence(A,e){return{type:pi.Sequence,steps:A.steps.map(i=>Dc(this,i,e)),options:ou(A.options)}}visitGroup(A,e){let i=e.currentTime,n=0,o=A.steps.map(r=>{e.currentTime=i;let s=Dc(this,r,e);return n=Math.max(n,e.currentTime),s});return e.currentTime=n,{type:pi.Group,steps:o,options:ou(A.options)}}visitAnimate(A,e){let i=cye(A.timings,e.errors);e.currentAnimateTimings=i;let n,o=A.styles?A.styles:Vo({});if(o.type==pi.Keyframes)n=this.visitKeyframes(o,e);else{let r=A.styles,s=!1;if(!r){s=!0;let c={};i.easing&&(c.easing=i.easing),r=Vo(c)}e.currentTime+=i.duration+i.delay;let a=this.visitStyle(r,e);a.isEmptyStep=s,n=a}return e.currentAnimateTimings=null,{type:pi.Animate,timings:i,style:n,options:null}}visitStyle(A,e){let i=this._makeStyleAst(A,e);return this._validateStyleAst(i,e),i}_makeStyleAst(A,e){let i=[],n=Array.isArray(A.styles)?A.styles:[A.styles];for(let s of n)typeof s=="string"?s===Kl?i.push(s):e.errors.push(PX(s)):i.push(new Map(Object.entries(s)));let o=!1,r=null;return i.forEach(s=>{if(s instanceof Map&&(s.has("easing")&&(r=s.get("easing"),s.delete("easing")),!o)){for(let a of s.values())if(a.toString().indexOf(oL)>=0){o=!0;break}}}),{type:pi.Style,styles:i,easing:r,offset:A.offset,containsDynamicStyles:o,options:null}}_validateStyleAst(A,e){let i=e.currentAnimateTimings,n=e.currentTime,o=e.currentTime;i&&o>0&&(o-=i.duration+i.delay),A.styles.forEach(r=>{typeof r!="string"&&r.forEach((s,a)=>{let c=e.collectedStyles.get(e.currentQuerySelector),l=c.get(a),d=!0;l&&(o!=n&&o>=l.startTime&&n<=l.endTime&&(e.errors.push(jX(a,l.startTime,l.endTime,o,n)),d=!1),o=l.startTime),d&&c.set(a,{startTime:o,endTime:n}),e.options&&u$(s,e.options,e.errors)})})}visitKeyframes(A,e){let i={type:pi.Keyframes,styles:[],options:null};if(!e.currentAnimateTimings)return e.errors.push(VX()),i;let n=1,o=0,r=[],s=!1,a=!1,c=0,l=A.steps.map(f=>{let b=this._makeStyleAst(f,e),k=b.offset!=null?b.offset:aye(b.styles),S=0;return k!=null&&(o++,S=b.offset=k),a=a||S<0||S>1,s=s||S0&&o{let k=C>0?b==I?1:C*b:r[b],S=k*B;e.currentTime=u+h.delay+S,h.duration=S,this._validateStyleAst(f,e),f.offset=k,i.styles.push(f)}),i}visitReference(A,e){return{type:pi.Reference,animation:Dc(this,HB(A.animation),e),options:ou(A.options)}}visitAnimateChild(A,e){return e.depCount++,{type:pi.AnimateChild,options:ou(A.options)}}visitAnimateRef(A,e){return{type:pi.AnimateRef,animation:this.visitReference(A.animation,e),options:ou(A.options)}}visitQuery(A,e){let i=e.currentQuerySelector,n=A.options||{};e.queryCount++,e.currentQuery=A;let[o,r]=rye(A.selector);e.currentQuerySelector=i.length?i+" "+o:o,yc(e.collectedStyles,e.currentQuerySelector,new Map);let s=Dc(this,HB(A.animation),e);return e.currentQuery=null,e.currentQuerySelector=i,{type:pi.Query,selector:o,limit:n.limit||0,optional:!!n.optional,includeSelf:r,animation:s,originalSelector:A.selector,options:ou(A.options)}}visitStagger(A,e){e.currentQuery||e.errors.push(XX());let i=A.timings==="full"?{duration:0,delay:0,easing:"full"}:nm(A.timings,e.errors,!0);return{type:pi.Stagger,animation:Dc(this,HB(A.animation),e),timings:i,options:null}}};function rye(t){let A=!!t.split(/\s*,\s*/).find(e=>e==M$);return A&&(t=t.replace(oye,"")),t=t.replace(/@\*/g,im).replace(/@\w+/g,e=>im+"-"+e.slice(1)).replace(/:animating/g,Ay),[t,A]}function sye(t){return t?ae({},t):null}var uL=class{errors;queryCount=0;depCount=0;currentTransition=null;currentQuery=null;currentQuerySelector=null;currentAnimateTimings=null;currentTime=0;collectedStyles=new Map;options=null;unsupportedCSSPropertiesFound=new Set;constructor(A){this.errors=A}};function aye(t){if(typeof t=="string")return null;let A=null;if(Array.isArray(t))t.forEach(e=>{if(e instanceof Map&&e.has("offset")){let i=e;A=parseFloat(i.get("offset")),i.delete("offset")}});else if(t instanceof Map&&t.has("offset")){let e=t;A=parseFloat(e.get("offset")),e.delete("offset")}return A}function cye(t,A){if(t.hasOwnProperty("duration"))return t;if(typeof t=="number"){let o=nm(t,A).duration;return cL(o,0,"")}let e=t;if(e.split(/\s+/).some(o=>o.charAt(0)=="{"&&o.charAt(1)=="{")){let o=cL(0,0,"");return o.dynamic=!0,o.strValue=e,o}let n=nm(e,A);return cL(n.duration,n.delay,n.easing)}function ou(t){return t?(t=ae({},t),t.params&&(t.params=sye(t.params))):t={},t}function cL(t,A,e){return{duration:t,delay:A,easing:e}}function vL(t,A,e,i,n,o,r=null,s=!1){return{type:1,element:t,keyframes:A,preStyleProps:e,postStyleProps:i,duration:n,delay:o,totalTime:n+o,easing:r,subTimeline:s}}var rm=class{_map=new Map;get(A){return this._map.get(A)||[]}append(A,e){let i=this._map.get(A);i||this._map.set(A,i=[]),i.push(...e)}has(A){return this._map.has(A)}clear(){this._map.clear()}},lye=1,gye=":enter",dye=new RegExp(gye,"g"),Cye=":leave",Iye=new RegExp(Cye,"g");function k$(t,A,e,i,n,o=new Map,r=new Map,s,a,c=[]){return new hL().buildKeyframes(t,A,e,i,n,o,r,s,a,c)}var hL=class{buildKeyframes(A,e,i,n,o,r,s,a,c,l=[]){c=c||new rm;let d=new BL(A,e,c,n,o,l,[]);d.options=a;let C=a.delay?W0(a.delay):0;d.currentTimeline.delayNextStep(C),d.currentTimeline.setStyles([r],null,d.errors,a),Dc(this,i,d);let I=d.timelines.filter(u=>u.containsAnimation());if(I.length&&s.size){let u;for(let h=I.length-1;h>=0;h--){let B=I[h];if(B.element===e){u=B;break}}u&&!u.allowOnlyTimelineStyles()&&u.setStyles([s],null,d.errors,a)}return I.length?I.map(u=>u.buildKeyframes()):[vL(e,[],[],[],0,C,"",!1)]}visitTrigger(A,e){}visitState(A,e){}visitTransition(A,e){}visitAnimateChild(A,e){let i=e.subInstructions.get(e.element);if(i){let n=e.createSubContext(A.options),o=e.currentTimeline.currentTime,r=this._visitSubInstructions(i,n,n.options);o!=r&&e.transformIntoNewTimeline(r)}e.previousNode=A}visitAnimateRef(A,e){let i=e.createSubContext(A.options);i.transformIntoNewTimeline(),this._applyAnimationRefDelays([A.options,A.animation.options],e,i),this.visitReference(A.animation,i),e.transformIntoNewTimeline(i.currentTimeline.currentTime),e.previousNode=A}_applyAnimationRefDelays(A,e,i){for(let n of A){let o=n?.delay;if(o){let r=typeof o=="number"?o:W0(zB(o,n?.params??{},e.errors));i.delayNextStep(r)}}}_visitSubInstructions(A,e,i){let o=e.currentTimeline.currentTime,r=i.duration!=null?W0(i.duration):null,s=i.delay!=null?W0(i.delay):null;return r!==0&&A.forEach(a=>{let c=e.appendInstructionToTimeline(a,r,s);o=Math.max(o,c.duration+c.delay)}),o}visitReference(A,e){e.updateOptions(A.options,!0),Dc(this,A.animation,e),e.previousNode=A}visitSequence(A,e){let i=e.subContextCount,n=e,o=A.options;if(o&&(o.params||o.delay)&&(n=e.createSubContext(o),n.transformIntoNewTimeline(),o.delay!=null)){n.previousNode.type==pi.Style&&(n.currentTimeline.snapshotCurrentStyles(),n.previousNode=ly);let r=W0(o.delay);n.delayNextStep(r)}A.steps.length&&(A.steps.forEach(r=>Dc(this,r,n)),n.currentTimeline.applyStylesToKeyframe(),n.subContextCount>i&&n.transformIntoNewTimeline()),e.previousNode=A}visitGroup(A,e){let i=[],n=e.currentTimeline.currentTime,o=A.options&&A.options.delay?W0(A.options.delay):0;A.steps.forEach(r=>{let s=e.createSubContext(A.options);o&&s.delayNextStep(o),Dc(this,r,s),n=Math.max(n,s.currentTimeline.currentTime),i.push(s.currentTimeline)}),i.forEach(r=>e.currentTimeline.mergeTimelineCollectedStyles(r)),e.transformIntoNewTimeline(n),e.previousNode=A}_visitTiming(A,e){if(A.dynamic){let i=A.strValue,n=e.params?zB(i,e.params,e.errors):i;return nm(n,e.errors)}else return{duration:A.duration,delay:A.delay,easing:A.easing}}visitAnimate(A,e){let i=e.currentAnimateTimings=this._visitTiming(A.timings,e),n=e.currentTimeline;i.delay&&(e.incrementTime(i.delay),n.snapshotCurrentStyles());let o=A.style;o.type==pi.Keyframes?this.visitKeyframes(o,e):(e.incrementTime(i.duration),this.visitStyle(o,e),n.applyStylesToKeyframe()),e.currentAnimateTimings=null,e.previousNode=A}visitStyle(A,e){let i=e.currentTimeline,n=e.currentAnimateTimings;!n&&i.hasCurrentStyleProperties()&&i.forwardFrame();let o=n&&n.easing||A.easing;A.isEmptyStep?i.applyEmptyStep(o):i.setStyles(A.styles,o,e.errors,e.options),e.previousNode=A}visitKeyframes(A,e){let i=e.currentAnimateTimings,n=e.currentTimeline.duration,o=i.duration,s=e.createSubContext().currentTimeline;s.easing=i.easing,A.styles.forEach(a=>{let c=a.offset||0;s.forwardTime(c*o),s.setStyles(a.styles,a.easing,e.errors,e.options),s.applyStylesToKeyframe()}),e.currentTimeline.mergeTimelineCollectedStyles(s),e.transformIntoNewTimeline(n+o),e.previousNode=A}visitQuery(A,e){let i=e.currentTimeline.currentTime,n=A.options||{},o=n.delay?W0(n.delay):0;o&&(e.previousNode.type===pi.Style||i==0&&e.currentTimeline.hasCurrentStyleProperties())&&(e.currentTimeline.snapshotCurrentStyles(),e.previousNode=ly);let r=i,s=e.invokeQuery(A.selector,A.originalSelector,A.limit,A.includeSelf,!!n.optional,e.errors);e.currentQueryTotal=s.length;let a=null;s.forEach((c,l)=>{e.currentQueryIndex=l;let d=e.createSubContext(A.options,c);o&&d.delayNextStep(o),c===e.element&&(a=d.currentTimeline),Dc(this,A.animation,d),d.currentTimeline.applyStylesToKeyframe();let C=d.currentTimeline.currentTime;r=Math.max(r,C)}),e.currentQueryIndex=0,e.currentQueryTotal=0,e.transformIntoNewTimeline(r),a&&(e.currentTimeline.mergeTimelineCollectedStyles(a),e.currentTimeline.snapshotCurrentStyles()),e.previousNode=A}visitStagger(A,e){let i=e.parentContext,n=e.currentTimeline,o=A.timings,r=Math.abs(o.duration),s=r*(e.currentQueryTotal-1),a=r*e.currentQueryIndex;switch(o.duration<0?"reverse":o.easing){case"reverse":a=s-a;break;case"full":a=i.currentStaggerTime;break}let l=e.currentTimeline;a&&l.delayNextStep(a);let d=l.currentTime;Dc(this,A.animation,e),e.previousNode=A,i.currentStaggerTime=n.currentTime-d+(n.startTime-i.currentTimeline.startTime)}},ly={},BL=class t{_driver;element;subInstructions;_enterClassName;_leaveClassName;errors;timelines;parentContext=null;currentTimeline;currentAnimateTimings=null;previousNode=ly;subContextCount=0;options={};currentQueryIndex=0;currentQueryTotal=0;currentStaggerTime=0;constructor(A,e,i,n,o,r,s,a){this._driver=A,this.element=e,this.subInstructions=i,this._enterClassName=n,this._leaveClassName=o,this.errors=r,this.timelines=s,this.currentTimeline=a||new gy(this._driver,e,0),s.push(this.currentTimeline)}get params(){return this.options.params}updateOptions(A,e){if(!A)return;let i=A,n=this.options;i.duration!=null&&(n.duration=W0(i.duration)),i.delay!=null&&(n.delay=W0(i.delay));let o=i.params;if(o){let r=n.params;r||(r=this.options.params={}),Object.keys(o).forEach(s=>{(!e||!r.hasOwnProperty(s))&&(r[s]=zB(o[s],r,this.errors))})}}_copyOptions(){let A={};if(this.options){let e=this.options.params;if(e){let i=A.params={};Object.keys(e).forEach(n=>{i[n]=e[n]})}}return A}createSubContext(A=null,e,i){let n=e||this.element,o=new t(this._driver,n,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(n,i||0));return o.previousNode=this.previousNode,o.currentAnimateTimings=this.currentAnimateTimings,o.options=this._copyOptions(),o.updateOptions(A),o.currentQueryIndex=this.currentQueryIndex,o.currentQueryTotal=this.currentQueryTotal,o.parentContext=this,this.subContextCount++,o}transformIntoNewTimeline(A){return this.previousNode=ly,this.currentTimeline=this.currentTimeline.fork(this.element,A),this.timelines.push(this.currentTimeline),this.currentTimeline}appendInstructionToTimeline(A,e,i){let n={duration:e??A.duration,delay:this.currentTimeline.currentTime+(i??0)+A.delay,easing:""},o=new EL(this._driver,A.element,A.keyframes,A.preStyleProps,A.postStyleProps,n,A.stretchStartingKeyframe);return this.timelines.push(o),n}incrementTime(A){this.currentTimeline.forwardTime(this.currentTimeline.duration+A)}delayNextStep(A){A>0&&this.currentTimeline.delayNextStep(A)}invokeQuery(A,e,i,n,o,r){let s=[];if(n&&s.push(this.element),A.length>0){A=A.replace(dye,"."+this._enterClassName),A=A.replace(Iye,"."+this._leaveClassName);let a=i!=1,c=this._driver.query(this.element,A,a);i!==0&&(c=i<0?c.slice(c.length+i,c.length):c.slice(0,i)),s.push(...c)}return!o&&s.length==0&&r.push($X(e)),s}},gy=class t{_driver;element;startTime;_elementTimelineStylesLookup;duration=0;easing=null;_previousKeyframe=new Map;_currentKeyframe=new Map;_keyframes=new Map;_styleSummary=new Map;_localTimelineStyles=new Map;_globalTimelineStyles;_pendingStyles=new Map;_backFill=new Map;_currentEmptyStepKeyframe=null;constructor(A,e,i,n){this._driver=A,this.element=e,this.startTime=i,this._elementTimelineStylesLookup=n,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(e),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(e,this._localTimelineStyles)),this._loadKeyframe()}containsAnimation(){switch(this._keyframes.size){case 0:return!1;case 1:return this.hasCurrentStyleProperties();default:return!0}}hasCurrentStyleProperties(){return this._currentKeyframe.size>0}get currentTime(){return this.startTime+this.duration}delayNextStep(A){let e=this._keyframes.size===1&&this._pendingStyles.size;this.duration||e?(this.forwardTime(this.currentTime+A),e&&this.snapshotCurrentStyles()):this.startTime+=A}fork(A,e){return this.applyStylesToKeyframe(),new t(this._driver,A,e||this.currentTime,this._elementTimelineStylesLookup)}_loadKeyframe(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=new Map,this._keyframes.set(this.duration,this._currentKeyframe))}forwardFrame(){this.duration+=lye,this._loadKeyframe()}forwardTime(A){this.applyStylesToKeyframe(),this.duration=A,this._loadKeyframe()}_updateStyle(A,e){this._localTimelineStyles.set(A,e),this._globalTimelineStyles.set(A,e),this._styleSummary.set(A,{time:this.currentTime,value:e})}allowOnlyTimelineStyles(){return this._currentEmptyStepKeyframe!==this._currentKeyframe}applyEmptyStep(A){A&&this._previousKeyframe.set("easing",A);for(let[e,i]of this._globalTimelineStyles)this._backFill.set(e,i||Kl),this._currentKeyframe.set(e,Kl);this._currentEmptyStepKeyframe=this._currentKeyframe}setStyles(A,e,i,n){e&&this._previousKeyframe.set("easing",e);let o=n&&n.params||{},r=uye(A,this._globalTimelineStyles);for(let[s,a]of r){let c=zB(a,o,i);this._pendingStyles.set(s,c),this._localTimelineStyles.has(s)||this._backFill.set(s,this._globalTimelineStyles.get(s)??Kl),this._updateStyle(s,c)}}applyStylesToKeyframe(){this._pendingStyles.size!=0&&(this._pendingStyles.forEach((A,e)=>{this._currentKeyframe.set(e,A)}),this._pendingStyles.clear(),this._localTimelineStyles.forEach((A,e)=>{this._currentKeyframe.has(e)||this._currentKeyframe.set(e,A)}))}snapshotCurrentStyles(){for(let[A,e]of this._localTimelineStyles)this._pendingStyles.set(A,e),this._updateStyle(A,e)}getFinalKeyframe(){return this._keyframes.get(this.duration)}get properties(){let A=[];for(let e in this._currentKeyframe)A.push(e);return A}mergeTimelineCollectedStyles(A){A._styleSummary.forEach((e,i)=>{let n=this._styleSummary.get(i);(!n||e.time>n.time)&&this._updateStyle(i,e.value)})}buildKeyframes(){this.applyStylesToKeyframe();let A=new Set,e=new Set,i=this._keyframes.size===1&&this.duration===0,n=[];this._keyframes.forEach((s,a)=>{let c=new Map([...this._backFill,...s]);c.forEach((l,d)=>{l===OB?A.add(d):l===Kl&&e.add(d)}),i||c.set("offset",a/this.duration),n.push(c)});let o=[...A.values()],r=[...e.values()];if(i){let s=n[0],a=new Map(s);s.set("offset",0),a.set("offset",1),n=[s,a]}return vL(this.element,n,o,r,this.duration,this.startTime,this.easing,!1)}},EL=class extends gy{keyframes;preStyleProps;postStyleProps;_stretchStartingKeyframe;timings;constructor(A,e,i,n,o,r,s=!1){super(A,e,r.delay),this.keyframes=i,this.preStyleProps=n,this.postStyleProps=o,this._stretchStartingKeyframe=s,this.timings={duration:r.duration,delay:r.delay,easing:r.easing}}containsAnimation(){return this.keyframes.length>1}buildKeyframes(){let A=this.keyframes,{delay:e,duration:i,easing:n}=this.timings;if(this._stretchStartingKeyframe&&e){let o=[],r=i+e,s=e/r,a=new Map(A[0]);a.set("offset",0),o.push(a);let c=new Map(A[0]);c.set("offset",Q$(s)),o.push(c);let l=A.length-1;for(let d=1;d<=l;d++){let C=new Map(A[d]),I=C.get("offset"),u=e+I*i;C.set("offset",Q$(u/r)),o.push(C)}i=r,e=0,n="",A=o}return vL(this.element,A,this.preStyleProps,this.postStyleProps,i,e,n,!0)}};function Q$(t,A=3){let e=Math.pow(10,A-1);return Math.round(t*e)/e}function uye(t,A){let e=new Map,i;return t.forEach(n=>{if(n==="*"){i??=A.keys();for(let o of i)e.set(o,Kl)}else for(let[o,r]of n)e.set(o,r)}),e}function m$(t,A,e,i,n,o,r,s,a,c,l,d,C){return{type:0,element:t,triggerName:A,isRemovalTransition:n,fromState:e,fromStyles:o,toState:i,toStyles:r,timelines:s,queriedElements:a,preStyleProps:c,postStyleProps:l,totalTime:d,errors:C}}var lL={},dy=class{_triggerName;ast;_stateStyles;constructor(A,e,i){this._triggerName=A,this.ast=e,this._stateStyles=i}match(A,e,i,n){return hye(this.ast.matchers,A,e,i,n)}buildStyles(A,e,i){let n=this._stateStyles.get("*");return A!==void 0&&(n=this._stateStyles.get(A?.toString())||n),n?n.buildStyles(e,i):new Map}build(A,e,i,n,o,r,s,a,c,l){let d=[],C=this.ast.options&&this.ast.options.params||lL,I=s&&s.params||lL,u=this.buildStyles(i,I,d),h=a&&a.params||lL,B=this.buildStyles(n,h,d),f=new Set,b=new Map,k=new Map,S=n==="void",w={params:x$(h,C),delay:this.ast.options?.delay},_=l?[]:k$(A,e,this.ast.animation,o,r,u,B,w,c,d),K=0;return _.forEach(J=>{K=Math.max(J.duration+J.delay,K)}),d.length?m$(e,this._triggerName,i,n,S,u,B,[],[],b,k,K,d):(_.forEach(J=>{let O=J.element,H=yc(b,O,new Set);J.preStyleProps.forEach(Z=>H.add(Z));let V=yc(k,O,new Set);J.postStyleProps.forEach(Z=>V.add(Z)),O!==e&&f.add(O)}),m$(e,this._triggerName,i,n,S,u,B,_,[...f.values()],b,k,K))}};function hye(t,A,e,i,n){return t.some(o=>o(A,e,i,n))}function x$(t,A){let e=ae({},A);return Object.entries(t).forEach(([i,n])=>{n!=null&&(e[i]=n)}),e}var fL=class{styles;defaultParams;normalizer;constructor(A,e,i){this.styles=A,this.defaultParams=e,this.normalizer=i}buildStyles(A,e){let i=new Map,n=x$(A,this.defaultParams);return this.styles.styles.forEach(o=>{typeof o!="string"&&o.forEach((r,s)=>{r&&(r=zB(r,n,e));let a=this.normalizer.normalizePropertyName(s,e);r=this.normalizer.normalizeStyleValue(s,a,r,e),i.set(s,r)})}),i}};function Bye(t,A,e){return new QL(t,A,e)}var QL=class{name;ast;_normalizer;transitionFactories=[];fallbackTransition;states=new Map;constructor(A,e,i){this.name=A,this.ast=e,this._normalizer=i,e.states.forEach(n=>{let o=n.options&&n.options.params||{};this.states.set(n.name,new fL(n.style,o,i))}),p$(this.states,"true","1"),p$(this.states,"false","0"),e.transitions.forEach(n=>{this.transitionFactories.push(new dy(A,n,this.states))}),this.fallbackTransition=Eye(A,this.states)}get containsQueries(){return this.ast.queryCount>0}matchTransition(A,e,i,n){return this.transitionFactories.find(r=>r.match(A,e,i,n))||null}matchStyles(A,e,i){return this.fallbackTransition.buildStyles(A,e,i)}};function Eye(t,A,e){let i=[(r,s)=>!0],n={type:pi.Sequence,steps:[],options:null},o={type:pi.Transition,animation:n,matchers:i,options:null,queryCount:0,depCount:0};return new dy(t,o,A)}function p$(t,A,e){t.has(A)?t.has(e)||t.set(e,t.get(A)):t.has(e)&&t.set(A,t.get(e))}var fye=new rm,mL=class{bodyNode;_driver;_normalizer;_animations=new Map;_playersById=new Map;players=[];constructor(A,e,i){this.bodyNode=A,this._driver=e,this._normalizer=i}register(A,e){let i=[],n=[],o=S$(this._driver,e,i,n);if(i.length)throw i$(i);this._animations.set(A,o)}_buildPlayer(A,e,i){let n=A.element,o=AL(this._normalizer,A.keyframes,e,i);return this._driver.animate(n,o,A.duration,A.delay,A.easing,[],!0)}create(A,e,i={}){let n=[],o=this._animations.get(A),r,s=new Map;if(o?(r=k$(this._driver,e,o,rL,ey,new Map,new Map,i,fye,n),r.forEach(l=>{let d=yc(s,l.element,new Map);l.postStyleProps.forEach(C=>d.set(C,null))})):(n.push(n$()),r=[]),n.length)throw o$(n);s.forEach((l,d)=>{l.forEach((C,I)=>{l.set(I,this._driver.computeStyle(d,I,Kl))})});let a=r.map(l=>{let d=s.get(l.element);return this._buildPlayer(l,new Map,d)}),c=u2(a);return this._playersById.set(A,c),c.onDestroy(()=>this.destroy(A)),this.players.push(c),c}destroy(A){let e=this._getPlayer(A);e.destroy(),this._playersById.delete(A);let i=this.players.indexOf(e);i>=0&&this.players.splice(i,1)}_getPlayer(A){let e=this._playersById.get(A);if(!e)throw r$(A);return e}listen(A,e,i,n){let o=X5(e,"","","");return Z5(this._getPlayer(A),i,o,n),()=>{}}command(A,e,i,n){if(i=="register"){this.register(A,n[0]);return}if(i=="create"){let r=n[0]||{};this.create(A,e,r);return}let o=this._getPlayer(A);switch(i){case"play":o.play();break;case"pause":o.pause();break;case"reset":o.reset();break;case"restart":o.restart();break;case"finish":o.finish();break;case"init":o.init();break;case"setPosition":o.setPosition(parseFloat(n[0]));break;case"destroy":this.destroy(A);break}}},w$="ng-animate-queued",Qye=".ng-animate-queued",gL="ng-animate-disabled",mye=".ng-animate-disabled",pye="ng-star-inserted",wye=".ng-star-inserted",yye=[],_$={namespaceId:"",setForRemoval:!1,setForMove:!1,hasAnimation:!1,removedBeforeQueried:!1},Dye={namespaceId:"",setForMove:!1,setForRemoval:!1,hasAnimation:!1,removedBeforeQueried:!0},kg="__ng_removed",sm=class{namespaceId;value;options;get params(){return this.options.params}constructor(A,e=""){this.namespaceId=e;let i=A&&A.hasOwnProperty("value"),n=i?A.value:A;if(this.value=bye(n),i){let o=A,{value:r}=o,s=wk(o,["value"]);this.options=s}else this.options={};this.options.params||(this.options.params={})}absorbOptions(A){let e=A.params;if(e){let i=this.options.params;Object.keys(e).forEach(n=>{i[n]==null&&(i[n]=e[n])})}}},om="void",dL=new sm(om),pL=class{id;hostElement;_engine;players=[];_triggers=new Map;_queue=[];_elementListeners=new Map;_hostClassName;constructor(A,e,i){this.id=A,this.hostElement=e,this._engine=i,this._hostClassName="ng-tns-"+A,Ul(e,this._hostClassName)}listen(A,e,i,n){if(!this._triggers.has(e))throw s$(i,e);if(i==null||i.length==0)throw a$(e);if(!Mye(i))throw c$(i,e);let o=yc(this._elementListeners,A,[]),r={name:e,phase:i,callback:n};o.push(r);let s=yc(this._engine.statesByElement,A,new Map);return s.has(e)||(Ul(A,tm),Ul(A,tm+"-"+e),s.set(e,dL)),()=>{this._engine.afterFlush(()=>{let a=o.indexOf(r);a>=0&&o.splice(a,1),this._triggers.has(e)||s.delete(e)})}}register(A,e){return this._triggers.has(A)?!1:(this._triggers.set(A,e),!0)}_getTrigger(A){let e=this._triggers.get(A);if(!e)throw l$(A);return e}trigger(A,e,i,n=!0){let o=this._getTrigger(e),r=new am(this.id,e,A),s=this._engine.statesByElement.get(A);s||(Ul(A,tm),Ul(A,tm+"-"+e),this._engine.statesByElement.set(A,s=new Map));let a=s.get(e),c=new sm(i,this.id);if(!(i&&i.hasOwnProperty("value"))&&a&&c.absorbOptions(a.options),s.set(e,c),a||(a=dL),!(c.value===om)&&a.value===c.value){if(!xye(a.params,c.params)){let h=[],B=o.matchStyles(a.value,a.params,h),f=o.matchStyles(c.value,c.params,h);h.length?this._engine.reportError(h):this._engine.afterFlush(()=>{F1(A,B),Sg(A,f)})}return}let C=yc(this._engine.playersByElement,A,[]);C.forEach(h=>{h.namespaceId==this.id&&h.triggerName==e&&h.queued&&h.destroy()});let I=o.matchTransition(a.value,c.value,A,c.params),u=!1;if(!I){if(!n)return;I=o.fallbackTransition,u=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:A,triggerName:e,transition:I,fromState:a,toState:c,player:r,isFallbackTransition:u}),u||(Ul(A,w$),r.onStart(()=>{PB(A,w$)})),r.onDone(()=>{let h=this.players.indexOf(r);h>=0&&this.players.splice(h,1);let B=this._engine.playersByElement.get(A);if(B){let f=B.indexOf(r);f>=0&&B.splice(f,1)}}),this.players.push(r),C.push(r),r}deregister(A){this._triggers.delete(A),this._engine.statesByElement.forEach(e=>e.delete(A)),this._elementListeners.forEach((e,i)=>{this._elementListeners.set(i,e.filter(n=>n.name!=A))})}clearElementCache(A){this._engine.statesByElement.delete(A),this._elementListeners.delete(A);let e=this._engine.playersByElement.get(A);e&&(e.forEach(i=>i.destroy()),this._engine.playersByElement.delete(A))}_signalRemovalForInnerTriggers(A,e){let i=this._engine.driver.query(A,im,!0);i.forEach(n=>{if(n[kg])return;let o=this._engine.fetchNamespacesByElement(n);o.size?o.forEach(r=>r.triggerLeaveAnimation(n,e,!1,!0)):this.clearElementCache(n)}),this._engine.afterFlushAnimationsDone(()=>i.forEach(n=>this.clearElementCache(n)))}triggerLeaveAnimation(A,e,i,n){let o=this._engine.statesByElement.get(A),r=new Map;if(o){let s=[];if(o.forEach((a,c)=>{if(r.set(c,a.value),this._triggers.has(c)){let l=this.trigger(A,c,om,n);l&&s.push(l)}}),s.length)return this._engine.markElementAsRemoved(this.id,A,!0,e,r),i&&u2(s).onDone(()=>this._engine.processLeaveNode(A)),!0}return!1}prepareLeaveAnimationListeners(A){let e=this._elementListeners.get(A),i=this._engine.statesByElement.get(A);if(e&&i){let n=new Set;e.forEach(o=>{let r=o.name;if(n.has(r))return;n.add(r);let a=this._triggers.get(r).fallbackTransition,c=i.get(r)||dL,l=new sm(om),d=new am(this.id,r,A);this._engine.totalQueuedPlayers++,this._queue.push({element:A,triggerName:r,transition:a,fromState:c,toState:l,player:d,isFallbackTransition:!0})})}}removeNode(A,e){let i=this._engine;if(A.childElementCount&&this._signalRemovalForInnerTriggers(A,e),this.triggerLeaveAnimation(A,e,!0))return;let n=!1;if(i.totalAnimations){let o=i.players.length?i.playersByQueriedElement.get(A):[];if(o&&o.length)n=!0;else{let r=A;for(;r=r.parentNode;)if(i.statesByElement.get(r)){n=!0;break}}}if(this.prepareLeaveAnimationListeners(A),n)i.markElementAsRemoved(this.id,A,!1,e);else{let o=A[kg];(!o||o===_$)&&(i.afterFlush(()=>this.clearElementCache(A)),i.destroyInnerAnimations(A),i._onRemovalComplete(A,e))}}insertNode(A,e){Ul(A,this._hostClassName)}drainQueuedTransitions(A){let e=[];return this._queue.forEach(i=>{let n=i.player;if(n.destroyed)return;let o=i.element,r=this._elementListeners.get(o);r&&r.forEach(s=>{if(s.name==i.triggerName){let a=X5(o,i.triggerName,i.fromState.value,i.toState.value);a._data=A,Z5(i.player,s.phase,a,s.callback)}}),n.markedForDestroy?this._engine.afterFlush(()=>{n.destroy()}):e.push(i)}),this._queue=[],e.sort((i,n)=>{let o=i.transition.ast.depCount,r=n.transition.ast.depCount;return o==0||r==0?o-r:this._engine.driver.containsElement(i.element,n.element)?1:-1})}destroy(A){this.players.forEach(e=>e.destroy()),this._signalRemovalForInnerTriggers(this.hostElement,A)}},wL=class{bodyNode;driver;_normalizer;players=[];newHostElements=new Map;playersByElement=new Map;playersByQueriedElement=new Map;statesByElement=new Map;disabledNodes=new Set;totalAnimations=0;totalQueuedPlayers=0;_namespaceLookup={};_namespaceList=[];_flushFns=[];_whenQuietFns=[];namespacesByHostElement=new Map;collectedEnterElements=[];collectedLeaveElements=[];onRemovalComplete=(A,e)=>{};_onRemovalComplete(A,e){this.onRemovalComplete(A,e)}constructor(A,e,i){this.bodyNode=A,this.driver=e,this._normalizer=i}get queuedPlayers(){let A=[];return this._namespaceList.forEach(e=>{e.players.forEach(i=>{i.queued&&A.push(i)})}),A}createNamespace(A,e){let i=new pL(A,e,this);return this.bodyNode&&this.driver.containsElement(this.bodyNode,e)?this._balanceNamespaceList(i,e):(this.newHostElements.set(e,i),this.collectEnterElement(e)),this._namespaceLookup[A]=i}_balanceNamespaceList(A,e){let i=this._namespaceList,n=this.namespacesByHostElement;if(i.length-1>=0){let r=!1,s=this.driver.getParentElement(e);for(;s;){let a=n.get(s);if(a){let c=i.indexOf(a);i.splice(c+1,0,A),r=!0;break}s=this.driver.getParentElement(s)}r||i.unshift(A)}else i.push(A);return n.set(e,A),A}register(A,e){let i=this._namespaceLookup[A];return i||(i=this.createNamespace(A,e)),i}registerTrigger(A,e,i){let n=this._namespaceLookup[A];n&&n.register(e,i)&&this.totalAnimations++}destroy(A,e){A&&(this.afterFlush(()=>{}),this.afterFlushAnimationsDone(()=>{let i=this._fetchNamespace(A);this.namespacesByHostElement.delete(i.hostElement);let n=this._namespaceList.indexOf(i);n>=0&&this._namespaceList.splice(n,1),i.destroy(e),delete this._namespaceLookup[A]}))}_fetchNamespace(A){return this._namespaceLookup[A]}fetchNamespacesByElement(A){let e=new Set,i=this.statesByElement.get(A);if(i){for(let n of i.values())if(n.namespaceId){let o=this._fetchNamespace(n.namespaceId);o&&e.add(o)}}return e}trigger(A,e,i,n){if(ry(e)){let o=this._fetchNamespace(A);if(o)return o.trigger(e,i,n),!0}return!1}insertNode(A,e,i,n){if(!ry(e))return;let o=e[kg];if(o&&o.setForRemoval){o.setForRemoval=!1,o.setForMove=!0;let r=this.collectedLeaveElements.indexOf(e);r>=0&&this.collectedLeaveElements.splice(r,1)}if(A){let r=this._fetchNamespace(A);r&&r.insertNode(e,i)}n&&this.collectEnterElement(e)}collectEnterElement(A){this.collectedEnterElements.push(A)}markElementAsDisabled(A,e){e?this.disabledNodes.has(A)||(this.disabledNodes.add(A),Ul(A,gL)):this.disabledNodes.has(A)&&(this.disabledNodes.delete(A),PB(A,gL))}removeNode(A,e,i){if(ry(e)){let n=A?this._fetchNamespace(A):null;n?n.removeNode(e,i):this.markElementAsRemoved(A,e,!1,i);let o=this.namespacesByHostElement.get(e);o&&o.id!==A&&o.removeNode(e,i)}else this._onRemovalComplete(e,i)}markElementAsRemoved(A,e,i,n,o){this.collectedLeaveElements.push(e),e[kg]={namespaceId:A,setForRemoval:n,hasAnimation:i,removedBeforeQueried:!1,previousTriggersValues:o}}listen(A,e,i,n,o){return ry(e)?this._fetchNamespace(A).listen(e,i,n,o):()=>{}}_buildInstruction(A,e,i,n,o){return A.transition.build(this.driver,A.element,A.fromState.value,A.toState.value,i,n,A.fromState.options,A.toState.options,e,o)}destroyInnerAnimations(A){let e=this.driver.query(A,im,!0);e.forEach(i=>this.destroyActiveAnimationsForElement(i)),this.playersByQueriedElement.size!=0&&(e=this.driver.query(A,Ay,!0),e.forEach(i=>this.finishActiveQueriedAnimationOnElement(i)))}destroyActiveAnimationsForElement(A){let e=this.playersByElement.get(A);e&&e.forEach(i=>{i.queued?i.markedForDestroy=!0:i.destroy()})}finishActiveQueriedAnimationOnElement(A){let e=this.playersByQueriedElement.get(A);e&&e.forEach(i=>i.finish())}whenRenderingDone(){return new Promise(A=>{if(this.players.length)return u2(this.players).onDone(()=>A());A()})}processLeaveNode(A){let e=A[kg];if(e&&e.setForRemoval){if(A[kg]=_$,e.namespaceId){this.destroyInnerAnimations(A);let i=this._fetchNamespace(e.namespaceId);i&&i.clearElementCache(A)}this._onRemovalComplete(A,e.setForRemoval)}A.classList?.contains(gL)&&this.markElementAsDisabled(A,!1),this.driver.query(A,mye,!0).forEach(i=>{this.markElementAsDisabled(i,!1)})}flush(A=-1){let e=[];if(this.newHostElements.size&&(this.newHostElements.forEach((i,n)=>this._balanceNamespaceList(i,n)),this.newHostElements.clear()),this.totalAnimations&&this.collectedEnterElements.length)for(let i=0;ii()),this._flushFns=[],this._whenQuietFns.length){let i=this._whenQuietFns;this._whenQuietFns=[],e.length?u2(e).onDone(()=>{i.forEach(n=>n())}):i.forEach(n=>n())}}reportError(A){throw g$(A)}_flushAnimations(A,e){let i=new rm,n=[],o=new Map,r=[],s=new Map,a=new Map,c=new Map,l=new Set;this.disabledNodes.forEach(X=>{l.add(X);let ue=this.driver.query(X,Qye,!0);for(let oe=0;oe{let oe=rL+h++;u.set(ue,oe),X.forEach(le=>Ul(le,oe))});let B=[],f=new Set,b=new Set;for(let X=0;Xf.add(le)):b.add(ue))}let k=new Map,S=v$(C,Array.from(f));S.forEach((X,ue)=>{let oe=ey+h++;k.set(ue,oe),X.forEach(le=>Ul(le,oe))}),A.push(()=>{I.forEach((X,ue)=>{let oe=u.get(ue);X.forEach(le=>PB(le,oe))}),S.forEach((X,ue)=>{let oe=k.get(ue);X.forEach(le=>PB(le,oe))}),B.forEach(X=>{this.processLeaveNode(X)})});let w=[],_=[];for(let X=this._namespaceList.length-1;X>=0;X--)this._namespaceList[X].drainQueuedTransitions(e).forEach(oe=>{let le=oe.player,me=oe.element;if(w.push(le),this.collectedEnterElements.length){let JA=me[kg];if(JA&&JA.setForMove){if(JA.previousTriggersValues&&JA.previousTriggersValues.has(oe.triggerName)){let Ye=JA.previousTriggersValues.get(oe.triggerName),Ie=this.statesByElement.get(oe.element);if(Ie&&Ie.has(oe.triggerName)){let We=Ie.get(oe.triggerName);We.value=Ye,Ie.set(oe.triggerName,We)}}le.destroy();return}}let Te=!d||!this.driver.containsElement(d,me),$e=k.get(me),Je=u.get(me),Qe=this._buildInstruction(oe,i,Je,$e,Te);if(Qe.errors&&Qe.errors.length){_.push(Qe);return}if(Te){le.onStart(()=>F1(me,Qe.fromStyles)),le.onDestroy(()=>Sg(me,Qe.toStyles)),n.push(le);return}if(oe.isFallbackTransition){le.onStart(()=>F1(me,Qe.fromStyles)),le.onDestroy(()=>Sg(me,Qe.toStyles)),n.push(le);return}let He=[];Qe.timelines.forEach(JA=>{JA.stretchStartingKeyframe=!0,this.disabledNodes.has(JA.element)||He.push(JA)}),Qe.timelines=He,i.append(me,Qe.timelines);let PA={instruction:Qe,player:le,element:me};r.push(PA),Qe.queriedElements.forEach(JA=>yc(s,JA,[]).push(le)),Qe.preStyleProps.forEach((JA,Ye)=>{if(JA.size){let Ie=a.get(Ye);Ie||a.set(Ye,Ie=new Set),JA.forEach((We,we)=>Ie.add(we))}}),Qe.postStyleProps.forEach((JA,Ye)=>{let Ie=c.get(Ye);Ie||c.set(Ye,Ie=new Set),JA.forEach((We,we)=>Ie.add(we))})});if(_.length){let X=[];_.forEach(ue=>{X.push(d$(ue.triggerName,ue.errors))}),w.forEach(ue=>ue.destroy()),this.reportError(X)}let K=new Map,J=new Map;r.forEach(X=>{let ue=X.element;i.has(ue)&&(J.set(ue,ue),this._beforeAnimationBuild(X.player.namespaceId,X.instruction,K))}),n.forEach(X=>{let ue=X.element;this._getPreviousPlayers(ue,!1,X.namespaceId,X.triggerName,null).forEach(le=>{yc(K,ue,[]).push(le),le.destroy()})});let O=B.filter(X=>b$(X,a,c)),H=new Map;D$(H,this.driver,b,c,Kl).forEach(X=>{b$(X,a,c)&&O.push(X)});let Z=new Map;I.forEach((X,ue)=>{D$(Z,this.driver,new Set(X),a,OB)}),O.forEach(X=>{let ue=H.get(X),oe=Z.get(X);H.set(X,new Map([...ue?.entries()??[],...oe?.entries()??[]]))});let ye=[],P=[],se={};r.forEach(X=>{let{element:ue,player:oe,instruction:le}=X;if(i.has(ue)){if(l.has(ue)){oe.onDestroy(()=>Sg(ue,le.toStyles)),oe.disabled=!0,oe.overrideTotalTime(le.totalTime),n.push(oe);return}let me=se;if(J.size>1){let $e=ue,Je=[];for(;$e=$e.parentNode;){let Qe=J.get($e);if(Qe){me=Qe;break}Je.push($e)}Je.forEach(Qe=>J.set(Qe,me))}let Te=this._buildAnimation(oe.namespaceId,le,K,o,Z,H);if(oe.setRealPlayer(Te),me===se)ye.push(oe);else{let $e=this.playersByElement.get(me);$e&&$e.length&&(oe.parentPlayer=u2($e)),n.push(oe)}}else F1(ue,le.fromStyles),oe.onDestroy(()=>Sg(ue,le.toStyles)),P.push(oe),l.has(ue)&&n.push(oe)}),P.forEach(X=>{let ue=o.get(X.element);if(ue&&ue.length){let oe=u2(ue);X.setRealPlayer(oe)}}),n.forEach(X=>{X.parentPlayer?X.syncPlayerEvents(X.parentPlayer):X.destroy()});for(let X=0;X!Te.destroyed);me.length?Sye(this,ue,me):this.processLeaveNode(ue)}return B.length=0,ye.forEach(X=>{this.players.push(X),X.onDone(()=>{X.destroy();let ue=this.players.indexOf(X);this.players.splice(ue,1)}),X.play()}),ye}afterFlush(A){this._flushFns.push(A)}afterFlushAnimationsDone(A){this._whenQuietFns.push(A)}_getPreviousPlayers(A,e,i,n,o){let r=[];if(e){let s=this.playersByQueriedElement.get(A);s&&(r=s)}else{let s=this.playersByElement.get(A);if(s){let a=!o||o==om;s.forEach(c=>{c.queued||!a&&c.triggerName!=n||r.push(c)})}}return(i||n)&&(r=r.filter(s=>!(i&&i!=s.namespaceId||n&&n!=s.triggerName))),r}_beforeAnimationBuild(A,e,i){let n=e.triggerName,o=e.element,r=e.isRemovalTransition?void 0:A,s=e.isRemovalTransition?void 0:n;for(let a of e.timelines){let c=a.element,l=c!==o,d=yc(i,c,[]);this._getPreviousPlayers(c,l,r,s,e.toState).forEach(I=>{let u=I.getRealPlayer();u.beforeDestroy&&u.beforeDestroy(),I.destroy(),d.push(I)})}F1(o,e.fromStyles)}_buildAnimation(A,e,i,n,o,r){let s=e.triggerName,a=e.element,c=[],l=new Set,d=new Set,C=e.timelines.map(u=>{let h=u.element;l.add(h);let B=h[kg];if(B&&B.removedBeforeQueried)return new V0(u.duration,u.delay);let f=h!==a,b=kye((i.get(h)||yye).map(K=>K.getRealPlayer())).filter(K=>{let J=K;return J.element?J.element===h:!1}),k=o.get(h),S=r.get(h),w=AL(this._normalizer,u.keyframes,k,S),_=this._buildPlayer(u,w,b);if(u.subTimeline&&n&&d.add(h),f){let K=new am(A,s,h);K.setRealPlayer(_),c.push(K)}return _});c.forEach(u=>{yc(this.playersByQueriedElement,u.element,[]).push(u),u.onDone(()=>vye(this.playersByQueriedElement,u.element,u))}),l.forEach(u=>Ul(u,sL));let I=u2(C);return I.onDestroy(()=>{l.forEach(u=>PB(u,sL)),Sg(a,e.toStyles)}),d.forEach(u=>{yc(n,u,[]).push(I)}),I}_buildPlayer(A,e,i){return e.length>0?this.driver.animate(A.element,e,A.duration,A.delay,A.easing,i):new V0(A.duration,A.delay)}},am=class{namespaceId;triggerName;element;_player=new V0;_containsRealPlayer=!1;_queuedCallbacks=new Map;destroyed=!1;parentPlayer=null;markedForDestroy=!1;disabled=!1;queued=!0;totalTime=0;constructor(A,e,i){this.namespaceId=A,this.triggerName=e,this.element=i}setRealPlayer(A){this._containsRealPlayer||(this._player=A,this._queuedCallbacks.forEach((e,i)=>{e.forEach(n=>Z5(A,i,void 0,n))}),this._queuedCallbacks.clear(),this._containsRealPlayer=!0,this.overrideTotalTime(A.totalTime),this.queued=!1)}getRealPlayer(){return this._player}overrideTotalTime(A){this.totalTime=A}syncPlayerEvents(A){let e=this._player;e.triggerCallback&&A.onStart(()=>e.triggerCallback("start")),A.onDone(()=>this.finish()),A.onDestroy(()=>this.destroy())}_queueEvent(A,e){yc(this._queuedCallbacks,A,[]).push(e)}onDone(A){this.queued&&this._queueEvent("done",A),this._player.onDone(A)}onStart(A){this.queued&&this._queueEvent("start",A),this._player.onStart(A)}onDestroy(A){this.queued&&this._queueEvent("destroy",A),this._player.onDestroy(A)}init(){this._player.init()}hasStarted(){return this.queued?!1:this._player.hasStarted()}play(){!this.queued&&this._player.play()}pause(){!this.queued&&this._player.pause()}restart(){!this.queued&&this._player.restart()}finish(){this._player.finish()}destroy(){this.destroyed=!0,this._player.destroy()}reset(){!this.queued&&this._player.reset()}setPosition(A){this.queued||this._player.setPosition(A)}getPosition(){return this.queued?0:this._player.getPosition()}triggerCallback(A){let e=this._player;e.triggerCallback&&e.triggerCallback(A)}};function vye(t,A,e){let i=t.get(A);if(i){if(i.length){let n=i.indexOf(e);i.splice(n,1)}i.length==0&&t.delete(A)}return i}function bye(t){return t??null}function ry(t){return t&&t.nodeType===1}function Mye(t){return t=="start"||t=="done"}function y$(t,A){let e=t.style.display;return t.style.display=A??"none",e}function D$(t,A,e,i,n){let o=[];e.forEach(a=>o.push(y$(a)));let r=[];i.forEach((a,c)=>{let l=new Map;a.forEach(d=>{let C=A.computeStyle(c,d,n);l.set(d,C),(!C||C.length==0)&&(c[kg]=Dye,r.push(c))}),t.set(c,l)});let s=0;return e.forEach(a=>y$(a,o[s++])),r}function v$(t,A){let e=new Map;if(t.forEach(s=>e.set(s,[])),A.length==0)return e;let i=1,n=new Set(A),o=new Map;function r(s){if(!s)return i;let a=o.get(s);if(a)return a;let c=s.parentNode;return e.has(c)?a=c:n.has(c)?a=i:a=r(c),o.set(s,a),a}return A.forEach(s=>{let a=r(s);a!==i&&e.get(a).push(s)}),e}function Ul(t,A){t.classList?.add(A)}function PB(t,A){t.classList?.remove(A)}function Sye(t,A,e){u2(e).onDone(()=>t.processLeaveNode(A))}function kye(t){let A=[];return R$(t,A),A}function R$(t,A){for(let e=0;en.add(o)):A.set(t,i),e.delete(t),!0}var jB=class{_driver;_normalizer;_transitionEngine;_timelineEngine;_triggerCache={};onRemovalComplete=(A,e)=>{};constructor(A,e,i){this._driver=e,this._normalizer=i,this._transitionEngine=new wL(A.body,e,i),this._timelineEngine=new mL(A.body,e,i),this._transitionEngine.onRemovalComplete=(n,o)=>this.onRemovalComplete(n,o)}registerTrigger(A,e,i,n,o){let r=A+"-"+n,s=this._triggerCache[r];if(!s){let a=[],c=[],l=S$(this._driver,o,a,c);if(a.length)throw t$(n,a);s=Bye(n,l,this._normalizer),this._triggerCache[r]=s}this._transitionEngine.registerTrigger(e,n,s)}register(A,e){this._transitionEngine.register(A,e)}destroy(A,e){this._transitionEngine.destroy(A,e)}onInsert(A,e,i,n){this._transitionEngine.insertNode(A,e,i,n)}onRemove(A,e,i){this._transitionEngine.removeNode(A,e,i)}disableAnimations(A,e){this._transitionEngine.markElementAsDisabled(A,e)}process(A,e,i,n){if(i.charAt(0)=="@"){let[o,r]=tL(i),s=n;this._timelineEngine.command(o,e,r,s)}else this._transitionEngine.trigger(A,e,i,n)}listen(A,e,i,n,o){if(i.charAt(0)=="@"){let[r,s]=tL(i);return this._timelineEngine.listen(r,e,s,o)}return this._transitionEngine.listen(A,e,i,n,o)}flush(A=-1){this._transitionEngine.flush(A)}get players(){return[...this._transitionEngine.players,...this._timelineEngine.players]}whenRenderingDone(){return this._transitionEngine.whenRenderingDone()}afterFlushAnimationsDone(A){this._transitionEngine.afterFlushAnimationsDone(A)}};function _ye(t,A){let e=null,i=null;return Array.isArray(A)&&A.length?(e=CL(A[0]),A.length>1&&(i=CL(A[A.length-1]))):A instanceof Map&&(e=CL(A)),e||i?new Rye(t,e,i):null}var Rye=(()=>{class t{_element;_startStyles;_endStyles;static initialStylesByElement=new WeakMap;_state=0;_initialStyles;constructor(e,i,n){this._element=e,this._startStyles=i,this._endStyles=n;let o=t.initialStylesByElement.get(e);o||t.initialStylesByElement.set(e,o=new Map),this._initialStyles=o}start(){this._state<1&&(this._startStyles&&Sg(this._element,this._startStyles,this._initialStyles),this._state=1)}finish(){this.start(),this._state<2&&(Sg(this._element,this._initialStyles),this._endStyles&&(Sg(this._element,this._endStyles),this._endStyles=null),this._state=1)}destroy(){this.finish(),this._state<3&&(t.initialStylesByElement.delete(this._element),this._startStyles&&(F1(this._element,this._startStyles),this._endStyles=null),this._endStyles&&(F1(this._element,this._endStyles),this._endStyles=null),Sg(this._element,this._initialStyles),this._state=3)}}return t})();function CL(t){let A=null;return t.forEach((e,i)=>{Nye(i)&&(A=A||new Map,A.set(i,e))}),A}function Nye(t){return t==="display"||t==="position"}var Cy=class{element;keyframes;options;_specialStyles;_onDoneFns=[];_onStartFns=[];_onDestroyFns=[];_duration;_delay;_initialized=!1;_finished=!1;_started=!1;_destroyed=!1;_finalKeyframe;_originalOnDoneFns=[];_originalOnStartFns=[];domPlayer;time=0;parentPlayer=null;currentSnapshot=new Map;constructor(A,e,i,n){this.element=A,this.keyframes=e,this.options=i,this._specialStyles=n,this._duration=i.duration,this._delay=i.delay||0,this.time=this._duration+this._delay}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(A=>A()),this._onDoneFns=[])}init(){this._buildPlayer(),this._preparePlayerBeforeStart()}_buildPlayer(){if(this._initialized)return;this._initialized=!0;let A=this.keyframes;this.domPlayer=this._triggerWebAnimation(this.element,A,this.options),this._finalKeyframe=A.length?A[A.length-1]:new Map;let e=()=>this._onFinish();this.domPlayer.addEventListener("finish",e),this.onDestroy(()=>{this.domPlayer.removeEventListener("finish",e)})}_preparePlayerBeforeStart(){this._delay?this._resetDomPlayerState():this.domPlayer.pause()}_convertKeyframesToObject(A){let e=[];return A.forEach(i=>{e.push(Object.fromEntries(i))}),e}_triggerWebAnimation(A,e,i){return A.animate(this._convertKeyframesToObject(e),i)}onStart(A){this._originalOnStartFns.push(A),this._onStartFns.push(A)}onDone(A){this._originalOnDoneFns.push(A),this._onDoneFns.push(A)}onDestroy(A){this._onDestroyFns.push(A)}play(){this._buildPlayer(),this.hasStarted()||(this._onStartFns.forEach(A=>A()),this._onStartFns=[],this._started=!0,this._specialStyles&&this._specialStyles.start()),this.domPlayer.play()}pause(){this.init(),this.domPlayer.pause()}finish(){this.init(),this._specialStyles&&this._specialStyles.finish(),this._onFinish(),this.domPlayer.finish()}reset(){this._resetDomPlayerState(),this._destroyed=!1,this._finished=!1,this._started=!1,this._onStartFns=this._originalOnStartFns,this._onDoneFns=this._originalOnDoneFns}_resetDomPlayerState(){this.domPlayer&&this.domPlayer.cancel()}restart(){this.reset(),this.play()}hasStarted(){return this._started}destroy(){this._destroyed||(this._destroyed=!0,this._resetDomPlayerState(),this._onFinish(),this._specialStyles&&this._specialStyles.destroy(),this._onDestroyFns.forEach(A=>A()),this._onDestroyFns=[])}setPosition(A){this.domPlayer===void 0&&this.init(),this.domPlayer.currentTime=A*this.time}getPosition(){return+(this.domPlayer.currentTime??0)/this.time}get totalTime(){return this._delay+this._duration}beforeDestroy(){let A=new Map;this.hasStarted()&&this._finalKeyframe.forEach((i,n)=>{n!=="offset"&&A.set(n,this._finished?i:iy(this.element,n))}),this.currentSnapshot=A}triggerCallback(A){let e=A==="start"?this._onStartFns:this._onDoneFns;e.forEach(i=>i()),e.length=0}},Iy=class{validateStyleProperty(A){return!0}validateAnimatableStyleProperty(A){return!0}containsElement(A,e){return iL(A,e)}getParentElement(A){return $5(A)}query(A,e,i){return nL(A,e,i)}computeStyle(A,e,i){return iy(A,e)}animate(A,e,i,n,o,r=[]){let s=n==0?"both":"forwards",a={duration:i,delay:n,fill:s};o&&(a.easing=o);let c=new Map,l=r.filter(I=>I instanceof Cy);h$(i,n)&&l.forEach(I=>{I.currentSnapshot.forEach((u,h)=>c.set(h,u))});let d=I$(e).map(I=>new Map(I));d=B$(A,d,c);let C=_ye(A,d);return new Cy(A,d,a,C)}};var sy="@",N$="@.disabled",uy=class{namespaceId;delegate;engine;_onDestroy;\u0275type=0;constructor(A,e,i,n){this.namespaceId=A,this.delegate=e,this.engine=i,this._onDestroy=n}get data(){return this.delegate.data}destroyNode(A){this.delegate.destroyNode?.(A)}destroy(){this.engine.destroy(this.namespaceId,this.delegate),this.engine.afterFlushAnimationsDone(()=>{queueMicrotask(()=>{this.delegate.destroy()})}),this._onDestroy?.()}createElement(A,e){return this.delegate.createElement(A,e)}createComment(A){return this.delegate.createComment(A)}createText(A){return this.delegate.createText(A)}appendChild(A,e){this.delegate.appendChild(A,e),this.engine.onInsert(this.namespaceId,e,A,!1)}insertBefore(A,e,i,n=!0){this.delegate.insertBefore(A,e,i),this.engine.onInsert(this.namespaceId,e,A,n)}removeChild(A,e,i){this.parentNode(e)&&this.engine.onRemove(this.namespaceId,e,this.delegate)}selectRootElement(A,e){return this.delegate.selectRootElement(A,e)}parentNode(A){return this.delegate.parentNode(A)}nextSibling(A){return this.delegate.nextSibling(A)}setAttribute(A,e,i,n){this.delegate.setAttribute(A,e,i,n)}removeAttribute(A,e,i){this.delegate.removeAttribute(A,e,i)}addClass(A,e){this.delegate.addClass(A,e)}removeClass(A,e){this.delegate.removeClass(A,e)}setStyle(A,e,i,n){this.delegate.setStyle(A,e,i,n)}removeStyle(A,e,i){this.delegate.removeStyle(A,e,i)}setProperty(A,e,i){e.charAt(0)==sy&&e==N$?this.disableAnimations(A,!!i):this.delegate.setProperty(A,e,i)}setValue(A,e){this.delegate.setValue(A,e)}listen(A,e,i,n){return this.delegate.listen(A,e,i,n)}disableAnimations(A,e){this.engine.disableAnimations(A,e)}},yL=class extends uy{factory;constructor(A,e,i,n,o){super(e,i,n,o),this.factory=A,this.namespaceId=e}setProperty(A,e,i){e.charAt(0)==sy?e.charAt(1)=="."&&e==N$?(i=i===void 0?!0:!!i,this.disableAnimations(A,i)):this.engine.process(this.namespaceId,A,e.slice(1),i):this.delegate.setProperty(A,e,i)}listen(A,e,i,n){if(e.charAt(0)==sy){let o=Lye(A),r=e.slice(1),s="";return r.charAt(0)!=sy&&([r,s]=Fye(r)),this.engine.listen(this.namespaceId,o,r,s,a=>{let c=a._data||-1;this.factory.scheduleListenerCallback(c,i,a)})}return this.delegate.listen(A,e,i,n)}};function Lye(t){switch(t){case"body":return document.body;case"document":return document;case"window":return window;default:return t}}function Fye(t){let A=t.indexOf("."),e=t.substring(0,A),i=t.slice(A+1);return[e,i]}var hy=class{delegate;engine;_zone;_currentId=0;_microtaskId=1;_animationCallbacksBuffer=[];_rendererCache=new Map;_cdRecurDepth=0;constructor(A,e,i){this.delegate=A,this.engine=e,this._zone=i,e.onRemovalComplete=(n,o)=>{o?.removeChild(null,n)}}createRenderer(A,e){let i="",n=this.delegate.createRenderer(A,e);if(!A||!e?.data?.animation){let c=this._rendererCache,l=c.get(n);if(!l){let d=()=>c.delete(n);l=new uy(i,n,this.engine,d),c.set(n,l)}return l}let o=e.id,r=e.id+"-"+this._currentId;this._currentId++,this.engine.register(r,A);let s=c=>{Array.isArray(c)?c.forEach(s):this.engine.registerTrigger(o,r,A,c.name,c)};return e.data.animation.forEach(s),new yL(this,r,n,this.engine)}begin(){this._cdRecurDepth++,this.delegate.begin&&this.delegate.begin()}_scheduleCountTask(){queueMicrotask(()=>{this._microtaskId++})}scheduleListenerCallback(A,e,i){if(A>=0&&Ae(i));return}let n=this._animationCallbacksBuffer;n.length==0&&queueMicrotask(()=>{this._zone.run(()=>{n.forEach(o=>{let[r,s]=o;r(s)}),this._animationCallbacksBuffer=[]})}),n.push([e,i])}end(){this._cdRecurDepth--,this._cdRecurDepth==0&&this._zone.runOutsideAngular(()=>{this._scheduleCountTask(),this.engine.flush(this._microtaskId)}),this.delegate.end&&this.delegate.end()}whenRenderingDone(){return this.engine.whenRenderingDone()}componentReplaced(A){this.engine.flush(),this.delegate.componentReplaced?.(A)}};var Kye=(()=>{class t extends jB{constructor(e,i,n){super(e,i,n)}ngOnDestroy(){this.flush()}static \u0275fac=function(i){return new(i||t)(UA(ht),UA(ru),UA(su))};static \u0275prov=be({token:t,factory:t.\u0275fac})}return t})();function Uye(){return new ay}function Tye(t,A,e){return new hy(t,A,e)}var L$=[{provide:su,useFactory:Uye},{provide:jB,useClass:Kye},{provide:fa,useFactory:Tye,deps:[$4,jB,yA]}],U6A=[{provide:ru,useClass:DL},{provide:Oi,useValue:"NoopAnimations"},...L$],Oye=[{provide:ru,useFactory:()=>new Iy},{provide:Oi,useFactory:()=>"BrowserAnimations"},...L$];function F$(){return Dg("NgEagerAnimations"),[...Oye]}function kL(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var cu=kL();function J$(t){cu=t}var gm={exec:()=>null};function mo(t,A=""){let e=typeof t=="string"?t:t.source,i={replace:(n,o)=>{let r=typeof o=="string"?o:o.source;return r=r.replace(ic.caret,"$1"),e=e.replace(n,r),i},getRegex:()=>new RegExp(e,A)};return i}var ic={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] /,listReplaceTask:/^\[[ xX]\] +/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:t=>new RegExp(`^( {0,3}${t})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}#`),htmlBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}<(?:[a-z].*>|!--)`,"i")},Jye=/^(?:[ \t]*(?:\n|$))+/,Yye=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Hye=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,dm=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,zye=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,xL=/(?:[*+-]|\d{1,9}[.)])/,Y$=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,H$=mo(Y$).replace(/bull/g,xL).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),Pye=mo(Y$).replace(/bull/g,xL).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),_L=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,jye=/^[^\n]+/,RL=/(?!\s*\])(?:\\.|[^\[\]\\])+/,Vye=mo(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",RL).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),qye=mo(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,xL).getRegex(),my="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",NL=/|$))/,Wye=mo("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",NL).replace("tag",my).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),z$=mo(_L).replace("hr",dm).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",my).getRegex(),Zye=mo(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",z$).getRegex(),LL={blockquote:Zye,code:Yye,def:Vye,fences:Hye,heading:zye,hr:dm,html:Wye,lheading:H$,list:qye,newline:Jye,paragraph:z$,table:gm,text:jye},G$=mo("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",dm).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",my).getRegex(),Xye=_A(ae({},LL),{lheading:Pye,table:G$,paragraph:mo(_L).replace("hr",dm).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",G$).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",my).getRegex()}),$ye=_A(ae({},LL),{html:mo(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",NL).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:gm,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:mo(_L).replace("hr",dm).replace("heading",` *#{1,6} *[^ +]`).replace("lheading",H$).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()}),eDe=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,ADe=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,P$=/^( {2,}|\\)\n(?!\s*$)/,tDe=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g,q$=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,sDe=mo(q$,"u").replace(/punct/g,py).getRegex(),aDe=mo(q$,"u").replace(/punct/g,V$).getRegex(),W$="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",cDe=mo(W$,"gu").replace(/notPunctSpace/g,j$).replace(/punctSpace/g,FL).replace(/punct/g,py).getRegex(),lDe=mo(W$,"gu").replace(/notPunctSpace/g,oDe).replace(/punctSpace/g,nDe).replace(/punct/g,V$).getRegex(),gDe=mo("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,j$).replace(/punctSpace/g,FL).replace(/punct/g,py).getRegex(),dDe=mo(/\\(punct)/,"gu").replace(/punct/g,py).getRegex(),CDe=mo(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[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])?)+(?![-_])/).getRegex(),IDe=mo(NL).replace("(?:-->|$)","-->").getRegex(),uDe=mo("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",IDe).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),fy=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,hDe=mo(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",fy).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),Z$=mo(/^!?\[(label)\]\[(ref)\]/).replace("label",fy).replace("ref",RL).getRegex(),X$=mo(/^!?\[(ref)\](?:\[\])?/).replace("ref",RL).getRegex(),BDe=mo("reflink|nolink(?!\\()","g").replace("reflink",Z$).replace("nolink",X$).getRegex(),GL={_backpedal:gm,anyPunctuation:dDe,autolink:CDe,blockSkip:rDe,br:P$,code:ADe,del:gm,emStrongLDelim:sDe,emStrongRDelimAst:cDe,emStrongRDelimUnd:gDe,escape:eDe,link:hDe,nolink:X$,punctuation:iDe,reflink:Z$,reflinkSearch:BDe,tag:uDe,text:tDe,url:gm},EDe=_A(ae({},GL),{link:mo(/^!?\[(label)\]\((.*?)\)/).replace("label",fy).getRegex(),reflink:mo(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",fy).getRegex()}),bL=_A(ae({},GL),{emStrongRDelimAst:lDe,emStrongLDelim:aDe,url:mo(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,"i").replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\.|[^\\])*?(?:\\.|[^\s~\\]))\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},K$=t=>QDe[t];function Z0(t,A){if(A){if(ic.escapeTest.test(t))return t.replace(ic.escapeReplace,K$)}else if(ic.escapeTestNoEncode.test(t))return t.replace(ic.escapeReplaceNoEncode,K$);return t}function U$(t){try{t=encodeURI(t).replace(ic.percentDecode,"%")}catch{return null}return t}function T$(t,A){let e=t.replace(ic.findPipe,(o,r,s)=>{let a=!1,c=r;for(;--c>=0&&s[c]==="\\";)a=!a;return a?"|":" |"}),i=e.split(ic.splitPipe),n=0;if(i[0].trim()||i.shift(),i.length>0&&!i.at(-1)?.trim()&&i.pop(),A)if(i.length>A)i.splice(A);else for(;i.length0?-2:-1}function O$(t,A,e,i,n){let o=A.href,r=A.title||null,s=t[1].replace(n.other.outputLinkReplace,"$1");i.state.inLink=!0;let a={type:t[0].charAt(0)==="!"?"image":"link",raw:e,href:o,title:r,text:s,tokens:i.inlineTokens(s)};return i.state.inLink=!1,a}function pDe(t,A,e){let i=t.match(e.other.indentCodeCompensation);if(i===null)return A;let n=i[1];return A.split(` +`).map(o=>{let r=o.match(e.other.beginningSpace);if(r===null)return o;let[s]=r;return s.length>=n.length?o.slice(n.length):o}).join(` +`)}var Qy=class{options;rules;lexer;constructor(t){this.options=t||cu}space(t){let A=this.rules.block.newline.exec(t);if(A&&A[0].length>0)return{type:"space",raw:A[0]}}code(t){let A=this.rules.block.code.exec(t);if(A){let e=A[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:A[0],codeBlockStyle:"indented",text:this.options.pedantic?e:lm(e,` +`)}}}fences(t){let A=this.rules.block.fences.exec(t);if(A){let e=A[0],i=pDe(e,A[3]||"",this.rules);return{type:"code",raw:e,lang:A[2]?A[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):A[2],text:i}}}heading(t){let A=this.rules.block.heading.exec(t);if(A){let e=A[2].trim();if(this.rules.other.endingHash.test(e)){let i=lm(e,"#");(this.options.pedantic||!i||this.rules.other.endingSpaceChar.test(i))&&(e=i.trim())}return{type:"heading",raw:A[0],depth:A[1].length,text:e,tokens:this.lexer.inline(e)}}}hr(t){let A=this.rules.block.hr.exec(t);if(A)return{type:"hr",raw:lm(A[0],` +`)}}blockquote(t){let A=this.rules.block.blockquote.exec(t);if(A){let e=lm(A[0],` +`).split(` +`),i="",n="",o=[];for(;e.length>0;){let r=!1,s=[],a;for(a=0;a1,n={type:"list",raw:"",ordered:i,start:i?+e.slice(0,-1):"",loose:!1,items:[]};e=i?`\\d{1,9}\\${e.slice(-1)}`:`\\${e}`,this.options.pedantic&&(e=i?e:"[*+-]");let o=this.rules.other.listItemRegex(e),r=!1;for(;t;){let a=!1,c="",l="";if(!(A=o.exec(t))||this.rules.block.hr.test(t))break;c=A[0],t=t.substring(c.length);let d=A[2].split(` +`,1)[0].replace(this.rules.other.listReplaceTabs,f=>" ".repeat(3*f.length)),C=t.split(` +`,1)[0],I=!d.trim(),u=0;if(this.options.pedantic?(u=2,l=d.trimStart()):I?u=A[1].length+1:(u=A[2].search(this.rules.other.nonSpaceChar),u=u>4?1:u,l=d.slice(u),u+=A[1].length),I&&this.rules.other.blankLine.test(C)&&(c+=C+` +`,t=t.substring(C.length+1),a=!0),!a){let f=this.rules.other.nextBulletRegex(u),b=this.rules.other.hrRegex(u),k=this.rules.other.fencesBeginRegex(u),S=this.rules.other.headingBeginRegex(u),w=this.rules.other.htmlBeginRegex(u);for(;t;){let _=t.split(` +`,1)[0],K;if(C=_,this.options.pedantic?(C=C.replace(this.rules.other.listReplaceNesting," "),K=C):K=C.replace(this.rules.other.tabCharGlobal," "),k.test(C)||S.test(C)||w.test(C)||f.test(C)||b.test(C))break;if(K.search(this.rules.other.nonSpaceChar)>=u||!C.trim())l+=` +`+K.slice(u);else{if(I||d.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||k.test(d)||S.test(d)||b.test(d))break;l+=` +`+C}!I&&!C.trim()&&(I=!0),c+=_+` +`,t=t.substring(_.length+1),d=K.slice(u)}}n.loose||(r?n.loose=!0:this.rules.other.doubleBlankLine.test(c)&&(r=!0));let h=null,B;this.options.gfm&&(h=this.rules.other.listIsTask.exec(l),h&&(B=h[0]!=="[ ] ",l=l.replace(this.rules.other.listReplaceTask,""))),n.items.push({type:"list_item",raw:c,task:!!h,checked:B,loose:!1,text:l,tokens:[]}),n.raw+=c}let s=n.items.at(-1);if(s)s.raw=s.raw.trimEnd(),s.text=s.text.trimEnd();else return;n.raw=n.raw.trimEnd();for(let a=0;ad.type==="space"),l=c.length>0&&c.some(d=>this.rules.other.anyLine.test(d.raw));n.loose=l}if(n.loose)for(let a=0;a({text:s,tokens:this.lexer.inline(s),header:!1,align:o.align[a]})));return o}}lheading(t){let A=this.rules.block.lheading.exec(t);if(A)return{type:"heading",raw:A[0],depth:A[2].charAt(0)==="="?1:2,text:A[1],tokens:this.lexer.inline(A[1])}}paragraph(t){let A=this.rules.block.paragraph.exec(t);if(A){let e=A[1].charAt(A[1].length-1)===` +`?A[1].slice(0,-1):A[1];return{type:"paragraph",raw:A[0],text:e,tokens:this.lexer.inline(e)}}}text(t){let A=this.rules.block.text.exec(t);if(A)return{type:"text",raw:A[0],text:A[0],tokens:this.lexer.inline(A[0])}}escape(t){let A=this.rules.inline.escape.exec(t);if(A)return{type:"escape",raw:A[0],text:A[1]}}tag(t){let A=this.rules.inline.tag.exec(t);if(A)return!this.lexer.state.inLink&&this.rules.other.startATag.test(A[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(A[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(A[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(A[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:A[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:A[0]}}link(t){let A=this.rules.inline.link.exec(t);if(A){let e=A[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(e)){if(!this.rules.other.endAngleBracket.test(e))return;let o=lm(e.slice(0,-1),"\\");if((e.length-o.length)%2===0)return}else{let o=mDe(A[2],"()");if(o===-2)return;if(o>-1){let s=(A[0].indexOf("!")===0?5:4)+A[1].length+o;A[2]=A[2].substring(0,o),A[0]=A[0].substring(0,s).trim(),A[3]=""}}let i=A[2],n="";if(this.options.pedantic){let o=this.rules.other.pedanticHrefTitle.exec(i);o&&(i=o[1],n=o[3])}else n=A[3]?A[3].slice(1,-1):"";return i=i.trim(),this.rules.other.startAngleBracket.test(i)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(e)?i=i.slice(1):i=i.slice(1,-1)),O$(A,{href:i&&i.replace(this.rules.inline.anyPunctuation,"$1"),title:n&&n.replace(this.rules.inline.anyPunctuation,"$1")},A[0],this.lexer,this.rules)}}reflink(t,A){let e;if((e=this.rules.inline.reflink.exec(t))||(e=this.rules.inline.nolink.exec(t))){let i=(e[2]||e[1]).replace(this.rules.other.multipleSpaceGlobal," "),n=A[i.toLowerCase()];if(!n){let o=e[0].charAt(0);return{type:"text",raw:o,text:o}}return O$(e,n,e[0],this.lexer,this.rules)}}emStrong(t,A,e=""){let i=this.rules.inline.emStrongLDelim.exec(t);if(!i||i[3]&&e.match(this.rules.other.unicodeAlphaNumeric))return;if(!(i[1]||i[2]||"")||!e||this.rules.inline.punctuation.exec(e)){let o=[...i[0]].length-1,r,s,a=o,c=0,l=i[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(l.lastIndex=0,A=A.slice(-1*t.length+o);(i=l.exec(A))!=null;){if(r=i[1]||i[2]||i[3]||i[4]||i[5]||i[6],!r)continue;if(s=[...r].length,i[3]||i[4]){a+=s;continue}else if((i[5]||i[6])&&o%3&&!((o+s)%3)){c+=s;continue}if(a-=s,a>0)continue;s=Math.min(s,s+a+c);let d=[...i[0]][0].length,C=t.slice(0,o+i.index+d+s);if(Math.min(o,s)%2){let u=C.slice(1,-1);return{type:"em",raw:C,text:u,tokens:this.lexer.inlineTokens(u)}}let I=C.slice(2,-2);return{type:"strong",raw:C,text:I,tokens:this.lexer.inlineTokens(I)}}}}codespan(t){let A=this.rules.inline.code.exec(t);if(A){let e=A[2].replace(this.rules.other.newLineCharGlobal," "),i=this.rules.other.nonSpaceChar.test(e),n=this.rules.other.startingSpaceChar.test(e)&&this.rules.other.endingSpaceChar.test(e);return i&&n&&(e=e.substring(1,e.length-1)),{type:"codespan",raw:A[0],text:e}}}br(t){let A=this.rules.inline.br.exec(t);if(A)return{type:"br",raw:A[0]}}del(t){let A=this.rules.inline.del.exec(t);if(A)return{type:"del",raw:A[0],text:A[2],tokens:this.lexer.inlineTokens(A[2])}}autolink(t){let A=this.rules.inline.autolink.exec(t);if(A){let e,i;return A[2]==="@"?(e=A[1],i="mailto:"+e):(e=A[1],i=e),{type:"link",raw:A[0],text:e,href:i,tokens:[{type:"text",raw:e,text:e}]}}}url(t){let A;if(A=this.rules.inline.url.exec(t)){let e,i;if(A[2]==="@")e=A[0],i="mailto:"+e;else{let n;do n=A[0],A[0]=this.rules.inline._backpedal.exec(A[0])?.[0]??"";while(n!==A[0]);e=A[0],A[1]==="www."?i="http://"+A[0]:i=A[0]}return{type:"link",raw:A[0],text:e,href:i,tokens:[{type:"text",raw:e,text:e}]}}}inlineText(t){let A=this.rules.inline.text.exec(t);if(A){let e=this.lexer.state.inRawBlock;return{type:"text",raw:A[0],text:A[0],escaped:e}}}},h2=class ML{tokens;options;state;tokenizer;inlineQueue;constructor(A){this.tokens=[],this.tokens.links=Object.create(null),this.options=A||cu,this.options.tokenizer=this.options.tokenizer||new Qy,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let e={other:ic,block:By.normal,inline:cm.normal};this.options.pedantic?(e.block=By.pedantic,e.inline=cm.pedantic):this.options.gfm&&(e.block=By.gfm,this.options.breaks?e.inline=cm.breaks:e.inline=cm.gfm),this.tokenizer.rules=e}static get rules(){return{block:By,inline:cm}}static lex(A,e){return new ML(e).lex(A)}static lexInline(A,e){return new ML(e).inlineTokens(A)}lex(A){A=A.replace(ic.carriageReturn,` +`),this.blockTokens(A,this.tokens);for(let e=0;e(n=r.call({lexer:this},A,e))?(A=A.substring(n.raw.length),e.push(n),!0):!1))continue;if(n=this.tokenizer.space(A)){A=A.substring(n.raw.length);let r=e.at(-1);n.raw.length===1&&r!==void 0?r.raw+=` +`:e.push(n);continue}if(n=this.tokenizer.code(A)){A=A.substring(n.raw.length);let r=e.at(-1);r?.type==="paragraph"||r?.type==="text"?(r.raw+=` +`+n.raw,r.text+=` +`+n.text,this.inlineQueue.at(-1).src=r.text):e.push(n);continue}if(n=this.tokenizer.fences(A)){A=A.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.heading(A)){A=A.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.hr(A)){A=A.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.blockquote(A)){A=A.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.list(A)){A=A.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.html(A)){A=A.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.def(A)){A=A.substring(n.raw.length);let r=e.at(-1);r?.type==="paragraph"||r?.type==="text"?(r.raw+=` +`+n.raw,r.text+=` +`+n.raw,this.inlineQueue.at(-1).src=r.text):this.tokens.links[n.tag]||(this.tokens.links[n.tag]={href:n.href,title:n.title});continue}if(n=this.tokenizer.table(A)){A=A.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.lheading(A)){A=A.substring(n.raw.length),e.push(n);continue}let o=A;if(this.options.extensions?.startBlock){let r=1/0,s=A.slice(1),a;this.options.extensions.startBlock.forEach(c=>{a=c.call({lexer:this},s),typeof a=="number"&&a>=0&&(r=Math.min(r,a))}),r<1/0&&r>=0&&(o=A.substring(0,r+1))}if(this.state.top&&(n=this.tokenizer.paragraph(o))){let r=e.at(-1);i&&r?.type==="paragraph"?(r.raw+=` +`+n.raw,r.text+=` +`+n.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=r.text):e.push(n),i=o.length!==A.length,A=A.substring(n.raw.length);continue}if(n=this.tokenizer.text(A)){A=A.substring(n.raw.length);let r=e.at(-1);r?.type==="text"?(r.raw+=` +`+n.raw,r.text+=` +`+n.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=r.text):e.push(n);continue}if(A){let r="Infinite loop on byte: "+A.charCodeAt(0);if(this.options.silent){console.error(r);break}else throw new Error(r)}}return this.state.top=!0,e}inline(A,e=[]){return this.inlineQueue.push({src:A,tokens:e}),e}inlineTokens(A,e=[]){let i=A,n=null;if(this.tokens.links){let s=Object.keys(this.tokens.links);if(s.length>0)for(;(n=this.tokenizer.rules.inline.reflinkSearch.exec(i))!=null;)s.includes(n[0].slice(n[0].lastIndexOf("[")+1,-1))&&(i=i.slice(0,n.index)+"["+"a".repeat(n[0].length-2)+"]"+i.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(n=this.tokenizer.rules.inline.anyPunctuation.exec(i))!=null;)i=i.slice(0,n.index)+"++"+i.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;(n=this.tokenizer.rules.inline.blockSkip.exec(i))!=null;)i=i.slice(0,n.index)+"["+"a".repeat(n[0].length-2)+"]"+i.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);let o=!1,r="";for(;A;){o||(r=""),o=!1;let s;if(this.options.extensions?.inline?.some(c=>(s=c.call({lexer:this},A,e))?(A=A.substring(s.raw.length),e.push(s),!0):!1))continue;if(s=this.tokenizer.escape(A)){A=A.substring(s.raw.length),e.push(s);continue}if(s=this.tokenizer.tag(A)){A=A.substring(s.raw.length),e.push(s);continue}if(s=this.tokenizer.link(A)){A=A.substring(s.raw.length),e.push(s);continue}if(s=this.tokenizer.reflink(A,this.tokens.links)){A=A.substring(s.raw.length);let c=e.at(-1);s.type==="text"&&c?.type==="text"?(c.raw+=s.raw,c.text+=s.text):e.push(s);continue}if(s=this.tokenizer.emStrong(A,i,r)){A=A.substring(s.raw.length),e.push(s);continue}if(s=this.tokenizer.codespan(A)){A=A.substring(s.raw.length),e.push(s);continue}if(s=this.tokenizer.br(A)){A=A.substring(s.raw.length),e.push(s);continue}if(s=this.tokenizer.del(A)){A=A.substring(s.raw.length),e.push(s);continue}if(s=this.tokenizer.autolink(A)){A=A.substring(s.raw.length),e.push(s);continue}if(!this.state.inLink&&(s=this.tokenizer.url(A))){A=A.substring(s.raw.length),e.push(s);continue}let a=A;if(this.options.extensions?.startInline){let c=1/0,l=A.slice(1),d;this.options.extensions.startInline.forEach(C=>{d=C.call({lexer:this},l),typeof d=="number"&&d>=0&&(c=Math.min(c,d))}),c<1/0&&c>=0&&(a=A.substring(0,c+1))}if(s=this.tokenizer.inlineText(a)){A=A.substring(s.raw.length),s.raw.slice(-1)!=="_"&&(r=s.raw.slice(-1)),o=!0;let c=e.at(-1);c?.type==="text"?(c.raw+=s.raw,c.text+=s.text):e.push(s);continue}if(A){let c="Infinite loop on byte: "+A.charCodeAt(0);if(this.options.silent){console.error(c);break}else throw new Error(c)}}return e}},G1=class{options;parser;constructor(t){this.options=t||cu}space(t){return""}code({text:t,lang:A,escaped:e}){let i=(A||"").match(ic.notSpaceStart)?.[0],n=t.replace(ic.endingNewline,"")+` +`;return i?'
'+(e?n:Z0(n,!0))+`
+`:"
"+(e?n:Z0(n,!0))+`
+`}blockquote({tokens:t}){return`
+${this.parser.parse(t)}
+`}html({text:t}){return t}heading({tokens:t,depth:A}){return`${this.parser.parseInline(t)} +`}hr(t){return`
+`}list(t){let A=t.ordered,e=t.start,i="";for(let r=0;r +`+i+" +`}listitem(t){let A="";if(t.task){let e=this.checkbox({checked:!!t.checked});t.loose?t.tokens[0]?.type==="paragraph"?(t.tokens[0].text=e+" "+t.tokens[0].text,t.tokens[0].tokens&&t.tokens[0].tokens.length>0&&t.tokens[0].tokens[0].type==="text"&&(t.tokens[0].tokens[0].text=e+" "+Z0(t.tokens[0].tokens[0].text),t.tokens[0].tokens[0].escaped=!0)):t.tokens.unshift({type:"text",raw:e+" ",text:e+" ",escaped:!0}):A+=e+" "}return A+=this.parser.parse(t.tokens,!!t.loose),`
  • ${A}
  • +`}checkbox({checked:t}){return"'}paragraph({tokens:t}){return`

    ${this.parser.parseInline(t)}

    +`}table(t){let A="",e="";for(let n=0;n${i}`),` + +`+A+` +`+i+`
    +`}tablerow({text:t}){return` +${t} +`}tablecell(t){let A=this.parser.parseInline(t.tokens),e=t.header?"th":"td";return(t.align?`<${e} align="${t.align}">`:`<${e}>`)+A+` +`}strong({tokens:t}){return`${this.parser.parseInline(t)}`}em({tokens:t}){return`${this.parser.parseInline(t)}`}codespan({text:t}){return`${Z0(t,!0)}`}br(t){return"
    "}del({tokens:t}){return`${this.parser.parseInline(t)}`}link({href:t,title:A,tokens:e}){let i=this.parser.parseInline(e),n=U$(t);if(n===null)return i;t=n;let o='
    ",o}image({href:t,title:A,text:e,tokens:i}){i&&(e=this.parser.parseInline(i,this.parser.textRenderer));let n=U$(t);if(n===null)return Z0(e);t=n;let o=`${e}{let r=n[o].flat(1/0);e=e.concat(this.walkTokens(r,A))}):n.tokens&&(e=e.concat(this.walkTokens(n.tokens,A)))}}return e}use(...t){let A=this.defaults.extensions||{renderers:{},childTokens:{}};return t.forEach(e=>{let i=ae({},e);if(i.async=this.defaults.async||i.async||!1,e.extensions&&(e.extensions.forEach(n=>{if(!n.name)throw new Error("extension name required");if("renderer"in n){let o=A.renderers[n.name];o?A.renderers[n.name]=function(...r){let s=n.renderer.apply(this,r);return s===!1&&(s=o.apply(this,r)),s}:A.renderers[n.name]=n.renderer}if("tokenizer"in n){if(!n.level||n.level!=="block"&&n.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let o=A[n.level];o?o.unshift(n.tokenizer):A[n.level]=[n.tokenizer],n.start&&(n.level==="block"?A.startBlock?A.startBlock.push(n.start):A.startBlock=[n.start]:n.level==="inline"&&(A.startInline?A.startInline.push(n.start):A.startInline=[n.start]))}"childTokens"in n&&n.childTokens&&(A.childTokens[n.name]=n.childTokens)}),i.extensions=A),e.renderer){let n=this.defaults.renderer||new G1(this.defaults);for(let o in e.renderer){if(!(o in n))throw new Error(`renderer '${o}' does not exist`);if(["options","parser"].includes(o))continue;let r=o,s=e.renderer[r],a=n[r];n[r]=(...c)=>{let l=s.apply(n,c);return l===!1&&(l=a.apply(n,c)),l||""}}i.renderer=n}if(e.tokenizer){let n=this.defaults.tokenizer||new Qy(this.defaults);for(let o in e.tokenizer){if(!(o in n))throw new Error(`tokenizer '${o}' does not exist`);if(["options","rules","lexer"].includes(o))continue;let r=o,s=e.tokenizer[r],a=n[r];n[r]=(...c)=>{let l=s.apply(n,c);return l===!1&&(l=a.apply(n,c)),l}}i.tokenizer=n}if(e.hooks){let n=this.defaults.hooks||new Ey;for(let o in e.hooks){if(!(o in n))throw new Error(`hook '${o}' does not exist`);if(["options","block"].includes(o))continue;let r=o,s=e.hooks[r],a=n[r];Ey.passThroughHooks.has(o)?n[r]=c=>{if(this.defaults.async)return Promise.resolve(s.call(n,c)).then(d=>a.call(n,d));let l=s.call(n,c);return a.call(n,l)}:n[r]=(...c)=>{let l=s.apply(n,c);return l===!1&&(l=a.apply(n,c)),l}}i.hooks=n}if(e.walkTokens){let n=this.defaults.walkTokens,o=e.walkTokens;i.walkTokens=function(r){let s=[];return s.push(o.call(this,r)),n&&(s=s.concat(n.call(this,r))),s}}this.defaults=ae(ae({},this.defaults),i)}),this}setOptions(t){return this.defaults=ae(ae({},this.defaults),t),this}lexer(t,A){return h2.lex(t,A??this.defaults)}parser(t,A){return B2.parse(t,A??this.defaults)}parseMarkdown(t){return(e,i)=>{let n=ae({},i),o=ae(ae({},this.defaults),n),r=this.onError(!!o.silent,!!o.async);if(this.defaults.async===!0&&n.async===!1)return r(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return r(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return r(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));o.hooks&&(o.hooks.options=o,o.hooks.block=t);let s=o.hooks?o.hooks.provideLexer():t?h2.lex:h2.lexInline,a=o.hooks?o.hooks.provideParser():t?B2.parse:B2.parseInline;if(o.async)return Promise.resolve(o.hooks?o.hooks.preprocess(e):e).then(c=>s(c,o)).then(c=>o.hooks?o.hooks.processAllTokens(c):c).then(c=>o.walkTokens?Promise.all(this.walkTokens(c,o.walkTokens)).then(()=>c):c).then(c=>a(c,o)).then(c=>o.hooks?o.hooks.postprocess(c):c).catch(r);try{o.hooks&&(e=o.hooks.preprocess(e));let c=s(e,o);o.hooks&&(c=o.hooks.processAllTokens(c)),o.walkTokens&&this.walkTokens(c,o.walkTokens);let l=a(c,o);return o.hooks&&(l=o.hooks.postprocess(l)),l}catch(c){return r(c)}}}onError(t,A){return e=>{if(e.message+=` +Please report this to https://github.com/markedjs/marked.`,t){let i="

    An error occurred:

    "+Z0(e.message+"",!0)+"
    ";return A?Promise.resolve(i):i}if(A)return Promise.reject(e);throw e}}},au=new wDe;function Zn(t,A){return au.parse(t,A)}Zn.options=Zn.setOptions=function(t){return au.setOptions(t),Zn.defaults=au.defaults,J$(Zn.defaults),Zn};Zn.getDefaults=kL;Zn.defaults=cu;Zn.use=function(...t){return au.use(...t),Zn.defaults=au.defaults,J$(Zn.defaults),Zn};Zn.walkTokens=function(t,A){return au.walkTokens(t,A)};Zn.parseInline=au.parseInline;Zn.Parser=B2;Zn.parser=B2.parse;Zn.Renderer=G1;Zn.TextRenderer=KL;Zn.Lexer=h2;Zn.lexer=h2.lex;Zn.Tokenizer=Qy;Zn.Hooks=Ey;Zn.parse=Zn;var O6A=Zn.options,J6A=Zn.setOptions,Y6A=Zn.use,H6A=Zn.walkTokens,z6A=Zn.parseInline;var P6A=B2.parse,j6A=h2.lex;var yDe=["*"],DDe="Copy",vDe="Copied",bDe=(()=>{class t{constructor(){this._buttonClick$=new je,this.copied$=this._buttonClick$.pipe(Si(()=>Bi(dA(!0),MI(3e3).pipe(jh(!1)))),Ha(),za(1)),this.copiedText$=this.copied$.pipe(In(!1),aA(e=>e?vDe:DDe))}onCopyToClipboardClick(){this._buttonClick$.next()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=xe({type:t,selectors:[["markdown-clipboard"]],decls:4,vars:7,consts:[[1,"markdown-clipboard-button",3,"click"]],template:function(i,n){i&1&&(m(0,"button",0),Ii(1,"async"),ee("click",function(){return n.onCopyToClipboardClick()}),T(2),Ii(3,"async"),p()),i&2&&(iA("copied",Qi(1,3,n.copied$)),y(2),Pe(Qi(3,5,n.copiedText$)))},dependencies:[ts],encapsulation:2,changeDetection:0})}}return t})(),MDe=new re("CLIPBOARD_OPTIONS");var UL=function(t){return t.CommandLine="command-line",t.LineHighlight="line-highlight",t.LineNumbers="line-numbers",t}(UL||{}),$$=new re("MARKED_EXTENSIONS"),SDe=new re("MARKED_OPTIONS"),kDe=new re("MERMAID_OPTIONS"),xDe="[ngx-markdown] When using the `emoji` attribute you *have to* include Emoji-Toolkit files to `angular.json` or use imports. See README for more information",_De="[ngx-markdown] When using the `katex` attribute you *have to* include KaTeX files to `angular.json` or use imports. See README for more information",RDe="[ngx-markdown] When using the `mermaid` attribute you *have to* include Mermaid files to `angular.json` or use imports. See README for more information",NDe="[ngx-markdown] When using the `clipboard` attribute you *have to* include Clipboard files to `angular.json` or use imports. See README for more information",LDe="[ngx-markdown] When using the `clipboard` attribute you *have to* provide the `viewContainerRef` parameter to `MarkdownService.render()` function",FDe="[ngx-markdown] When using the `src` attribute you *have to* pass the `HttpClient` as a parameter of the `forRoot` method. See README for more information",eee=new re("SECURITY_CONTEXT");var Aee=(()=>{class t{get options(){return this._options}set options(e){this._options=ae(ae({},this.DEFAULT_MARKED_OPTIONS),e)}get renderer(){return this.options.renderer}set renderer(e){this.options.renderer=e}constructor(e,i,n,o,r,s,a,c){this.clipboardOptions=e,this.extensions=i,this.mermaidOptions=o,this.platform=r,this.securityContext=s,this.http=a,this.sanitizer=c,this.DEFAULT_MARKED_OPTIONS={renderer:new G1},this.DEFAULT_KATEX_OPTIONS={delimiters:[{left:"$$",right:"$$",display:!0},{left:"$",right:"$",display:!1},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}]},this.DEFAULT_MERMAID_OPTIONS={startOnLoad:!1},this.DEFAULT_CLIPBOARD_OPTIONS={buttonComponent:void 0},this.DEFAULT_PARSE_OPTIONS={decodeHtml:!1,inline:!1,emoji:!1,mermaid:!1,markedOptions:void 0,disableSanitizer:!1},this.DEFAULT_RENDER_OPTIONS={clipboard:!1,clipboardOptions:void 0,katex:!1,katexOptions:void 0,mermaid:!1,mermaidOptions:void 0},this._reload$=new je,this.reload$=this._reload$.asObservable(),this.options=n}parse(e,i=this.DEFAULT_PARSE_OPTIONS){let{decodeHtml:n,inline:o,emoji:r,mermaid:s,disableSanitizer:a}=i,c=ae(ae({},this.options),i.markedOptions),l=c.renderer||this.renderer||new G1;this.extensions&&(this.renderer=this.extendsRendererForExtensions(l)),s&&(this.renderer=this.extendsRendererForMermaid(l));let d=this.trimIndentation(e),C=n?this.decodeHtml(d):d,I=r?this.parseEmoji(C):C,u=this.parseMarked(I,c,o);return(a?u:this.sanitizer.sanitize(this.securityContext,u))||""}render(e,i=this.DEFAULT_RENDER_OPTIONS,n){let{clipboard:o,clipboardOptions:r,katex:s,katexOptions:a,mermaid:c,mermaidOptions:l}=i;s&&this.renderKatex(e,ae(ae({},this.DEFAULT_KATEX_OPTIONS),a)),c&&this.renderMermaid(e,ae(ae(ae({},this.DEFAULT_MERMAID_OPTIONS),this.mermaidOptions),l)),o&&this.renderClipboard(e,n,ae(ae(ae({},this.DEFAULT_CLIPBOARD_OPTIONS),this.clipboardOptions),r)),this.highlight(e)}reload(){this._reload$.next()}getSource(e){if(!this.http)throw new Error(FDe);return this.http.get(e,{responseType:"text"}).pipe(aA(i=>this.handleExtension(e,i)))}highlight(e){if(!H0(this.platform)||typeof Prism>"u"||typeof Prism.highlightAllUnder>"u")return;e||(e=document);let i=e.querySelectorAll('pre code:not([class*="language-"])');Array.prototype.forEach.call(i,n=>n.classList.add("language-none")),Prism.highlightAllUnder(e)}decodeHtml(e){if(!H0(this.platform))return e;let i=document.createElement("textarea");return i.innerHTML=e,i.value}extendsRendererForExtensions(e){let i=e;return i.\u0275NgxMarkdownRendererExtendedForExtensions===!0||(this.extensions?.length>0&&Zn.use(...this.extensions),i.\u0275NgxMarkdownRendererExtendedForExtensions=!0),e}extendsRendererForMermaid(e){let i=e;if(i.\u0275NgxMarkdownRendererExtendedForMermaid===!0)return e;let n=e.code;return e.code=o=>o.lang==="mermaid"?`
    ${o.text}
    `:n(o),i.\u0275NgxMarkdownRendererExtendedForMermaid=!0,e}handleExtension(e,i){let n=e.lastIndexOf("://"),o=n>-1?e.substring(n+4):e,r=o.lastIndexOf("/"),s=r>-1?o.substring(r+1).split("?")[0]:"",a=s.lastIndexOf("."),c=a>-1?s.substring(a+1):"";return c&&c!=="md"?"```"+c+` +`+i+"\n```":i}parseMarked(e,i,n=!1){if(i.renderer){let o=ae({},i.renderer);delete o.\u0275NgxMarkdownRendererExtendedForExtensions,delete o.\u0275NgxMarkdownRendererExtendedForMermaid,delete i.renderer,Zn.use({renderer:o})}return n?Zn.parseInline(e,i):Zn.parse(e,i)}parseEmoji(e){if(!H0(this.platform))return e;if(typeof joypixels>"u"||typeof joypixels.shortnameToUnicode>"u")throw new Error(xDe);return joypixels.shortnameToUnicode(e)}renderKatex(e,i){if(H0(this.platform)){if(typeof katex>"u"||typeof renderMathInElement>"u")throw new Error(_De);renderMathInElement(e,i)}}renderClipboard(e,i,n){if(!H0(this.platform))return;if(typeof ClipboardJS>"u")throw new Error(NDe);if(!i)throw new Error(LDe);let{buttonComponent:o,buttonTemplate:r}=n,s=e.querySelectorAll("pre");for(let a=0;ad.classList.add("hover"),l.onmouseleave=()=>d.classList.remove("hover");let C;if(o){let u=i.createComponent(o);C=u.hostView,u.changeDetectorRef.markForCheck()}else if(r)C=i.createEmbeddedView(r);else{let u=i.createComponent(bDe);C=u.hostView,u.changeDetectorRef.markForCheck()}let I;C.rootNodes.forEach(u=>{d.appendChild(u),I=new ClipboardJS(u,{text:()=>c.innerText})}),C.onDestroy(()=>I.destroy())}}renderMermaid(e,i=this.DEFAULT_MERMAID_OPTIONS){if(!H0(this.platform))return;if(typeof mermaid>"u"||typeof mermaid.initialize>"u")throw new Error(RDe);let n=e.querySelectorAll(".mermaid");n.length!==0&&(mermaid.initialize(i),mermaid.run({nodes:n}))}trimIndentation(e){if(!e)return"";let i;return e.split(` +`).map(n=>{let o=i;return n.length>0&&(o=isNaN(o)?n.search(/\S|$/):Math.min(n.search(/\S|$/),o)),isNaN(i)&&(i=o),o?n.substring(o):n}).join(` +`)}static{this.\u0275fac=function(i){return new(i||t)(UA(MDe,8),UA($$,8),UA(SDe,8),UA(kDe,8),UA(O0),UA(eee),UA(wa,8),UA(dl))}}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return t})(),wy=(()=>{class t{get disableSanitizer(){return this._disableSanitizer}set disableSanitizer(e){this._disableSanitizer=this.coerceBooleanProperty(e)}get inline(){return this._inline}set inline(e){this._inline=this.coerceBooleanProperty(e)}get clipboard(){return this._clipboard}set clipboard(e){this._clipboard=this.coerceBooleanProperty(e)}get emoji(){return this._emoji}set emoji(e){this._emoji=this.coerceBooleanProperty(e)}get katex(){return this._katex}set katex(e){this._katex=this.coerceBooleanProperty(e)}get mermaid(){return this._mermaid}set mermaid(e){this._mermaid=this.coerceBooleanProperty(e)}get lineHighlight(){return this._lineHighlight}set lineHighlight(e){this._lineHighlight=this.coerceBooleanProperty(e)}get lineNumbers(){return this._lineNumbers}set lineNumbers(e){this._lineNumbers=this.coerceBooleanProperty(e)}get commandLine(){return this._commandLine}set commandLine(e){this._commandLine=this.coerceBooleanProperty(e)}constructor(e,i,n){this.element=e,this.markdownService=i,this.viewContainerRef=n,this.error=new Ve,this.load=new Ve,this.ready=new Ve,this._clipboard=!1,this._commandLine=!1,this._disableSanitizer=!1,this._emoji=!1,this._inline=!1,this._katex=!1,this._lineHighlight=!1,this._lineNumbers=!1,this._mermaid=!1,this.destroyed$=new je}ngOnChanges(){this.loadContent()}loadContent(){if(this.data!=null){this.handleData();return}if(this.src!=null){this.handleSrc();return}}ngAfterViewInit(){!this.data&&!this.src&&this.handleTransclusion(),this.markdownService.reload$.pipe(mt(this.destroyed$)).subscribe(()=>this.loadContent())}ngOnDestroy(){this.destroyed$.next(),this.destroyed$.complete()}render(e,i=!1){return Ci(this,null,function*(){let n={decodeHtml:i,inline:this.inline,emoji:this.emoji,mermaid:this.mermaid,disableSanitizer:this.disableSanitizer},o={clipboard:this.clipboard,clipboardOptions:this.getClipboardOptions(),katex:this.katex,katexOptions:this.katexOptions,mermaid:this.mermaid,mermaidOptions:this.mermaidOptions},r=yield this.markdownService.parse(e,n);this.element.nativeElement.innerHTML=r,this.handlePlugins(),this.markdownService.render(this.element.nativeElement,o,this.viewContainerRef),this.ready.emit()})}coerceBooleanProperty(e){return e!=null&&`${String(e)}`!="false"}getClipboardOptions(){if(this.clipboardButtonComponent||this.clipboardButtonTemplate)return{buttonComponent:this.clipboardButtonComponent,buttonTemplate:this.clipboardButtonTemplate}}handleData(){this.render(this.data)}handleSrc(){this.markdownService.getSource(this.src).subscribe({next:e=>{this.render(e).then(()=>{this.load.emit(e)})},error:e=>this.error.emit(e)})}handleTransclusion(){this.render(this.element.nativeElement.innerHTML,!0)}handlePlugins(){this.commandLine&&(this.setPluginClass(this.element.nativeElement,UL.CommandLine),this.setPluginOptions(this.element.nativeElement,{dataFilterOutput:this.filterOutput,dataHost:this.host,dataPrompt:this.prompt,dataOutput:this.output,dataUser:this.user})),this.lineHighlight&&this.setPluginOptions(this.element.nativeElement,{dataLine:this.line,dataLineOffset:this.lineOffset}),this.lineNumbers&&(this.setPluginClass(this.element.nativeElement,UL.LineNumbers),this.setPluginOptions(this.element.nativeElement,{dataStart:this.start}))}setPluginClass(e,i){let n=e.querySelectorAll("pre");for(let o=0;o{let s=i[r];if(s){let a=this.toLispCase(r);n.item(o).setAttribute(a,s.toString())}})}toLispCase(e){let i=e.match(/([A-Z])/g);if(!i)return e;let n=e.toString();for(let o=0,r=i.length;o{let i=GDe(e)?_A(ae({},e),{multi:!0}):{provide:$$,useValue:e,multi:!0};return[...A,i]},[])}var tee=(()=>{class t{static forRoot(e){return{ngModule:t,providers:[Cm(e)]}}static forChild(){return{ngModule:t}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275mod=OA({type:t})}static{this.\u0275inj=TA({imports:[Ur]})}}return t})();var Yi="primary",vm=Symbol("RouteTitle"),HL=class{params;constructor(A){this.params=A||{}}has(A){return Object.prototype.hasOwnProperty.call(this.params,A)}get(A){if(this.has(A)){let e=this.params[A];return Array.isArray(e)?e[0]:e}return null}getAll(A){if(this.has(A)){let e=this.params[A];return Array.isArray(e)?e:[e]}return[]}get keys(){return Object.keys(this.params)}};function du(t){return new HL(t)}function lee(t,A,e){let i=e.path.split("/");if(i.length>t.length||e.pathMatch==="full"&&(A.hasChildren()||i.lengthi[o]===n)}else return t===A}function dee(t){return t.length>0?t[t.length-1]:null}function O1(t){return I1(t)?t:v1(t)?xo(Promise.resolve(t)):dA(t)}var ODe={exact:Iee,subset:uee},Cee={exact:JDe,subset:YDe,ignored:()=>!0};function iee(t,A,e){return ODe[e.paths](t.root,A.root,e.matrixParams)&&Cee[e.queryParams](t.queryParams,A.queryParams)&&!(e.fragment==="exact"&&t.fragment!==A.fragment)}function JDe(t,A){return X0(t,A)}function Iee(t,A,e){if(!lu(t.segments,A.segments)||!vy(t.segments,A.segments,e)||t.numberOfChildren!==A.numberOfChildren)return!1;for(let i in A.children)if(!t.children[i]||!Iee(t.children[i],A.children[i],e))return!1;return!0}function YDe(t,A){return Object.keys(A).length<=Object.keys(t).length&&Object.keys(A).every(e=>gee(t[e],A[e]))}function uee(t,A,e){return hee(t,A,A.segments,e)}function hee(t,A,e,i){if(t.segments.length>e.length){let n=t.segments.slice(0,e.length);return!(!lu(n,e)||A.hasChildren()||!vy(n,e,i))}else if(t.segments.length===e.length){if(!lu(t.segments,e)||!vy(t.segments,e,i))return!1;for(let n in A.children)if(!t.children[n]||!uee(t.children[n],A.children[n],i))return!1;return!0}else{let n=e.slice(0,t.segments.length),o=e.slice(t.segments.length);return!lu(t.segments,n)||!vy(t.segments,n,i)||!t.children[Yi]?!1:hee(t.children[Yi],A,o,i)}}function vy(t,A,e){return A.every((i,n)=>Cee[e](t[n].parameters,i.parameters))}var ed=class{root;queryParams;fragment;_queryParamMap;constructor(A=new ao([],{}),e={},i=null){this.root=A,this.queryParams=e,this.fragment=i}get queryParamMap(){return this._queryParamMap??=du(this.queryParams),this._queryParamMap}toString(){return PDe.serialize(this)}},ao=class{segments;children;parent=null;constructor(A,e){this.segments=A,this.children=e,Object.values(e).forEach(i=>i.parent=this)}hasChildren(){return this.numberOfChildren>0}get numberOfChildren(){return Object.keys(this.children).length}toString(){return by(this)}},K1=class{path;parameters;_parameterMap;constructor(A,e){this.path=A,this.parameters=e}get parameterMap(){return this._parameterMap??=du(this.parameters),this._parameterMap}toString(){return Eee(this)}};function HDe(t,A){return lu(t,A)&&t.every((e,i)=>X0(e.parameters,A[i].parameters))}function lu(t,A){return t.length!==A.length?!1:t.every((e,i)=>e.path===A[i].path)}function zDe(t,A){let e=[];return Object.entries(t.children).forEach(([i,n])=>{i===Yi&&(e=e.concat(A(n,i)))}),Object.entries(t.children).forEach(([i,n])=>{i!==Yi&&(e=e.concat(A(n,i)))}),e}var Cu=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:()=>new U1,providedIn:"root"})}return t})(),U1=class{parse(A){let e=new jL(A);return new ed(e.parseRootSegment(),e.parseQueryParams(),e.parseFragment())}serialize(A){let e=`/${Im(A.root,!0)}`,i=qDe(A.queryParams),n=typeof A.fragment=="string"?`#${jDe(A.fragment)}`:"";return`${e}${i}${n}`}},PDe=new U1;function by(t){return t.segments.map(A=>Eee(A)).join("/")}function Im(t,A){if(!t.hasChildren())return by(t);if(A){let e=t.children[Yi]?Im(t.children[Yi],!1):"",i=[];return Object.entries(t.children).forEach(([n,o])=>{n!==Yi&&i.push(`${n}:${Im(o,!1)}`)}),i.length>0?`${e}(${i.join("//")})`:e}else{let e=zDe(t,(i,n)=>n===Yi?[Im(t.children[Yi],!1)]:[`${n}:${Im(i,!1)}`]);return Object.keys(t.children).length===1&&t.children[Yi]!=null?`${by(t)}/${e[0]}`:`${by(t)}/(${e.join("//")})`}}function Bee(t){return encodeURIComponent(t).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",")}function yy(t){return Bee(t).replace(/%3B/gi,";")}function jDe(t){return encodeURI(t)}function PL(t){return Bee(t).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/%26/gi,"&")}function My(t){return decodeURIComponent(t)}function nee(t){return My(t.replace(/\+/g,"%20"))}function Eee(t){return`${PL(t.path)}${VDe(t.parameters)}`}function VDe(t){return Object.entries(t).map(([A,e])=>`;${PL(A)}=${PL(e)}`).join("")}function qDe(t){let A=Object.entries(t).map(([e,i])=>Array.isArray(i)?i.map(n=>`${yy(e)}=${yy(n)}`).join("&"):`${yy(e)}=${yy(i)}`).filter(e=>e);return A.length?`?${A.join("&")}`:""}var WDe=/^[^\/()?;#]+/;function TL(t){let A=t.match(WDe);return A?A[0]:""}var ZDe=/^[^\/()?;=#]+/;function XDe(t){let A=t.match(ZDe);return A?A[0]:""}var $De=/^[^=?&#]+/;function eve(t){let A=t.match($De);return A?A[0]:""}var Ave=/^[^&#]+/;function tve(t){let A=t.match(Ave);return A?A[0]:""}var jL=class{url;remaining;constructor(A){this.url=A,this.remaining=A}parseRootSegment(){return this.consumeOptional("/"),this.remaining===""||this.peekStartsWith("?")||this.peekStartsWith("#")?new ao([],{}):new ao([],this.parseChildren())}parseQueryParams(){let A={};if(this.consumeOptional("?"))do this.parseQueryParam(A);while(this.consumeOptional("&"));return A}parseFragment(){return this.consumeOptional("#")?decodeURIComponent(this.remaining):null}parseChildren(){if(this.remaining==="")return{};this.consumeOptional("/");let A=[];for(this.peekStartsWith("(")||A.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),A.push(this.parseSegment());let e={};this.peekStartsWith("/(")&&(this.capture("/"),e=this.parseParens(!0));let i={};return this.peekStartsWith("(")&&(i=this.parseParens(!1)),(A.length>0||Object.keys(e).length>0)&&(i[Yi]=new ao(A,e)),i}parseSegment(){let A=TL(this.remaining);if(A===""&&this.peekStartsWith(";"))throw new lA(4009,!1);return this.capture(A),new K1(My(A),this.parseMatrixParams())}parseMatrixParams(){let A={};for(;this.consumeOptional(";");)this.parseParam(A);return A}parseParam(A){let e=XDe(this.remaining);if(!e)return;this.capture(e);let i="";if(this.consumeOptional("=")){let n=TL(this.remaining);n&&(i=n,this.capture(i))}A[My(e)]=My(i)}parseQueryParam(A){let e=eve(this.remaining);if(!e)return;this.capture(e);let i="";if(this.consumeOptional("=")){let r=tve(this.remaining);r&&(i=r,this.capture(i))}let n=nee(e),o=nee(i);if(A.hasOwnProperty(n)){let r=A[n];Array.isArray(r)||(r=[r],A[n]=r),r.push(o)}else A[n]=o}parseParens(A){let e={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){let i=TL(this.remaining),n=this.remaining[i.length];if(n!=="/"&&n!==")"&&n!==";")throw new lA(4010,!1);let o;i.indexOf(":")>-1?(o=i.slice(0,i.indexOf(":")),this.capture(o),this.capture(":")):A&&(o=Yi);let r=this.parseChildren();e[o]=Object.keys(r).length===1?r[Yi]:new ao([],r),this.consumeOptional("//")}return e}peekStartsWith(A){return this.remaining.startsWith(A)}consumeOptional(A){return this.peekStartsWith(A)?(this.remaining=this.remaining.substring(A.length),!0):!1}capture(A){if(!this.consumeOptional(A))throw new lA(4011,!1)}};function fee(t){return t.segments.length>0?new ao([],{[Yi]:t}):t}function Qee(t){let A={};for(let[i,n]of Object.entries(t.children)){let o=Qee(n);if(i===Yi&&o.segments.length===0&&o.hasChildren())for(let[r,s]of Object.entries(o.children))A[r]=s;else(o.segments.length>0||o.hasChildren())&&(A[i]=o)}let e=new ao(t.segments,A);return ive(e)}function ive(t){if(t.numberOfChildren===1&&t.children[Yi]){let A=t.children[Yi];return new ao(t.segments.concat(A.segments),A.children)}return t}function XB(t){return t instanceof ed}function mee(t,A,e=null,i=null){let n=pee(t);return wee(n,A,e,i)}function pee(t){let A;function e(o){let r={};for(let a of o.children){let c=e(a);r[a.outlet]=c}let s=new ao(o.url,r);return o===t&&(A=s),s}let i=e(t.root),n=fee(i);return A??n}function wee(t,A,e,i){let n=t;for(;n.parent;)n=n.parent;if(A.length===0)return OL(n,n,n,e,i);let o=nve(A);if(o.toRoot())return OL(n,n,new ao([],{}),e,i);let r=ove(o,n,t),s=r.processChildren?hm(r.segmentGroup,r.index,o.commands):Dee(r.segmentGroup,r.index,o.commands);return OL(n,r.segmentGroup,s,e,i)}function ky(t){return typeof t=="object"&&t!=null&&!t.outlets&&!t.segmentPath}function Em(t){return typeof t=="object"&&t!=null&&t.outlets}function OL(t,A,e,i,n){let o={};i&&Object.entries(i).forEach(([a,c])=>{o[a]=Array.isArray(c)?c.map(l=>`${l}`):`${c}`});let r;t===A?r=e:r=yee(t,A,e);let s=fee(Qee(r));return new ed(s,o,n)}function yee(t,A,e){let i={};return Object.entries(t.children).forEach(([n,o])=>{o===A?i[n]=e:i[n]=yee(o,A,e)}),new ao(t.segments,i)}var xy=class{isAbsolute;numberOfDoubleDots;commands;constructor(A,e,i){if(this.isAbsolute=A,this.numberOfDoubleDots=e,this.commands=i,A&&i.length>0&&ky(i[0]))throw new lA(4003,!1);let n=i.find(Em);if(n&&n!==dee(i))throw new lA(4004,!1)}toRoot(){return this.isAbsolute&&this.commands.length===1&&this.commands[0]=="/"}};function nve(t){if(typeof t[0]=="string"&&t.length===1&&t[0]==="/")return new xy(!0,0,t);let A=0,e=!1,i=t.reduce((n,o,r)=>{if(typeof o=="object"&&o!=null){if(o.outlets){let s={};return Object.entries(o.outlets).forEach(([a,c])=>{s[a]=typeof c=="string"?c.split("/"):c}),[...n,{outlets:s}]}if(o.segmentPath)return[...n,o.segmentPath]}return typeof o!="string"?[...n,o]:r===0?(o.split("/").forEach((s,a)=>{a==0&&s==="."||(a==0&&s===""?e=!0:s===".."?A++:s!=""&&n.push(s))}),n):[...n,o]},[]);return new xy(e,A,i)}var WB=class{segmentGroup;processChildren;index;constructor(A,e,i){this.segmentGroup=A,this.processChildren=e,this.index=i}};function ove(t,A,e){if(t.isAbsolute)return new WB(A,!0,0);if(!e)return new WB(A,!1,NaN);if(e.parent===null)return new WB(e,!0,0);let i=ky(t.commands[0])?0:1,n=e.segments.length-1+i;return rve(e,n,t.numberOfDoubleDots)}function rve(t,A,e){let i=t,n=A,o=e;for(;o>n;){if(o-=n,i=i.parent,!i)throw new lA(4005,!1);n=i.segments.length}return new WB(i,!1,n-o)}function sve(t){return Em(t[0])?t[0].outlets:{[Yi]:t}}function Dee(t,A,e){if(t??=new ao([],{}),t.segments.length===0&&t.hasChildren())return hm(t,A,e);let i=ave(t,A,e),n=e.slice(i.commandIndex);if(i.match&&i.pathIndexo!==Yi)&&t.children[Yi]&&t.numberOfChildren===1&&t.children[Yi].segments.length===0){let o=hm(t.children[Yi],A,e);return new ao(t.segments,o.children)}return Object.entries(i).forEach(([o,r])=>{typeof r=="string"&&(r=[r]),r!==null&&(n[o]=Dee(t.children[o],A,r))}),Object.entries(t.children).forEach(([o,r])=>{i[o]===void 0&&(n[o]=r)}),new ao(t.segments,n)}}function ave(t,A,e){let i=0,n=A,o={match:!1,pathIndex:0,commandIndex:0};for(;n=e.length)return o;let r=t.segments[n],s=e[i];if(Em(s))break;let a=`${s}`,c=i0&&a===void 0)break;if(a&&c&&typeof c=="object"&&c.outlets===void 0){if(!ree(a,c,r))return o;i+=2}else{if(!ree(a,{},r))return o;i++}n++}return{match:!0,pathIndex:n,commandIndex:i}}function VL(t,A,e){let i=t.segments.slice(0,A),n=0;for(;n{typeof i=="string"&&(i=[i]),i!==null&&(A[e]=VL(new ao([],{}),0,i))}),A}function oee(t){let A={};return Object.entries(t).forEach(([e,i])=>A[e]=`${i}`),A}function ree(t,A,e){return t==e.path&&X0(A,e.parameters)}var Sy="imperative",ys=function(t){return t[t.NavigationStart=0]="NavigationStart",t[t.NavigationEnd=1]="NavigationEnd",t[t.NavigationCancel=2]="NavigationCancel",t[t.NavigationError=3]="NavigationError",t[t.RoutesRecognized=4]="RoutesRecognized",t[t.ResolveStart=5]="ResolveStart",t[t.ResolveEnd=6]="ResolveEnd",t[t.GuardsCheckStart=7]="GuardsCheckStart",t[t.GuardsCheckEnd=8]="GuardsCheckEnd",t[t.RouteConfigLoadStart=9]="RouteConfigLoadStart",t[t.RouteConfigLoadEnd=10]="RouteConfigLoadEnd",t[t.ChildActivationStart=11]="ChildActivationStart",t[t.ChildActivationEnd=12]="ChildActivationEnd",t[t.ActivationStart=13]="ActivationStart",t[t.ActivationEnd=14]="ActivationEnd",t[t.Scroll=15]="Scroll",t[t.NavigationSkipped=16]="NavigationSkipped",t}(ys||{}),Il=class{id;url;constructor(A,e){this.id=A,this.url=e}},T1=class extends Il{type=ys.NavigationStart;navigationTrigger;restoredState;constructor(A,e,i="imperative",n=null){super(A,e),this.navigationTrigger=i,this.restoredState=n}toString(){return`NavigationStart(id: ${this.id}, url: '${this.url}')`}},ul=class extends Il{urlAfterRedirects;type=ys.NavigationEnd;constructor(A,e,i){super(A,e),this.urlAfterRedirects=i}toString(){return`NavigationEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}')`}},vc=function(t){return t[t.Redirect=0]="Redirect",t[t.SupersededByNewNavigation=1]="SupersededByNewNavigation",t[t.NoDataFromResolver=2]="NoDataFromResolver",t[t.GuardRejected=3]="GuardRejected",t}(vc||{}),$B=function(t){return t[t.IgnoredSameUrlNavigation=0]="IgnoredSameUrlNavigation",t[t.IgnoredByUrlHandlingStrategy=1]="IgnoredByUrlHandlingStrategy",t}($B||{}),$0=class extends Il{reason;code;type=ys.NavigationCancel;constructor(A,e,i,n){super(A,e),this.reason=i,this.code=n}toString(){return`NavigationCancel(id: ${this.id}, url: '${this.url}')`}},Ad=class extends Il{reason;code;type=ys.NavigationSkipped;constructor(A,e,i,n){super(A,e),this.reason=i,this.code=n}},eE=class extends Il{error;target;type=ys.NavigationError;constructor(A,e,i,n){super(A,e),this.error=i,this.target=n}toString(){return`NavigationError(id: ${this.id}, url: '${this.url}', error: ${this.error})`}},fm=class extends Il{urlAfterRedirects;state;type=ys.RoutesRecognized;constructor(A,e,i,n){super(A,e),this.urlAfterRedirects=i,this.state=n}toString(){return`RoutesRecognized(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},_y=class extends Il{urlAfterRedirects;state;type=ys.GuardsCheckStart;constructor(A,e,i,n){super(A,e),this.urlAfterRedirects=i,this.state=n}toString(){return`GuardsCheckStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Ry=class extends Il{urlAfterRedirects;state;shouldActivate;type=ys.GuardsCheckEnd;constructor(A,e,i,n,o){super(A,e),this.urlAfterRedirects=i,this.state=n,this.shouldActivate=o}toString(){return`GuardsCheckEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state}, shouldActivate: ${this.shouldActivate})`}},Ny=class extends Il{urlAfterRedirects;state;type=ys.ResolveStart;constructor(A,e,i,n){super(A,e),this.urlAfterRedirects=i,this.state=n}toString(){return`ResolveStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Ly=class extends Il{urlAfterRedirects;state;type=ys.ResolveEnd;constructor(A,e,i,n){super(A,e),this.urlAfterRedirects=i,this.state=n}toString(){return`ResolveEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},Fy=class{route;type=ys.RouteConfigLoadStart;constructor(A){this.route=A}toString(){return`RouteConfigLoadStart(path: ${this.route.path})`}},Gy=class{route;type=ys.RouteConfigLoadEnd;constructor(A){this.route=A}toString(){return`RouteConfigLoadEnd(path: ${this.route.path})`}},Ky=class{snapshot;type=ys.ChildActivationStart;constructor(A){this.snapshot=A}toString(){return`ChildActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},Uy=class{snapshot;type=ys.ChildActivationEnd;constructor(A){this.snapshot=A}toString(){return`ChildActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},Ty=class{snapshot;type=ys.ActivationStart;constructor(A){this.snapshot=A}toString(){return`ActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},Oy=class{snapshot;type=ys.ActivationEnd;constructor(A){this.snapshot=A}toString(){return`ActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},AE=class{routerEvent;position;anchor;type=ys.Scroll;constructor(A,e,i){this.routerEvent=A,this.position=e,this.anchor=i}toString(){let A=this.position?`${this.position[0]}, ${this.position[1]}`:null;return`Scroll(anchor: '${this.anchor}', position: '${A}')`}},Qm=class{},tE=class{url;navigationBehaviorOptions;constructor(A,e){this.url=A,this.navigationBehaviorOptions=e}};function lve(t,A){return t.providers&&!t._injector&&(t._injector=y4(t.providers,A,`Route: ${t.path}`)),t._injector??A}function xg(t){return t.outlet||Yi}function gve(t,A){let e=t.filter(i=>xg(i)===A);return e.push(...t.filter(i=>xg(i)!==A)),e}function bm(t){if(!t)return null;if(t.routeConfig?._injector)return t.routeConfig._injector;for(let A=t.parent;A;A=A.parent){let e=A.routeConfig;if(e?._loadedInjector)return e._loadedInjector;if(e?._injector)return e._injector}return null}var Jy=class{rootInjector;outlet=null;route=null;children;attachRef=null;get injector(){return bm(this.route?.snapshot)??this.rootInjector}constructor(A){this.rootInjector=A,this.children=new Iu(this.rootInjector)}},Iu=(()=>{class t{rootInjector;contexts=new Map;constructor(e){this.rootInjector=e}onChildOutletCreated(e,i){let n=this.getOrCreateContext(e);n.outlet=i,this.contexts.set(e,n)}onChildOutletDestroyed(e){let i=this.getContext(e);i&&(i.outlet=null,i.attachRef=null)}onOutletDeactivated(){let e=this.contexts;return this.contexts=new Map,e}onOutletReAttached(e){this.contexts=e}getOrCreateContext(e){let i=this.getContext(e);return i||(i=new Jy(this.rootInjector),this.contexts.set(e,i)),i}getContext(e){return this.contexts.get(e)||null}static \u0275fac=function(i){return new(i||t)(UA(Hr))};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),Yy=class{_root;constructor(A){this._root=A}get root(){return this._root.value}parent(A){let e=this.pathFromRoot(A);return e.length>1?e[e.length-2]:null}children(A){let e=qL(A,this._root);return e?e.children.map(i=>i.value):[]}firstChild(A){let e=qL(A,this._root);return e&&e.children.length>0?e.children[0].value:null}siblings(A){let e=WL(A,this._root);return e.length<2?[]:e[e.length-2].children.map(n=>n.value).filter(n=>n!==A)}pathFromRoot(A){return WL(A,this._root).map(e=>e.value)}};function qL(t,A){if(t===A.value)return A;for(let e of A.children){let i=qL(t,e);if(i)return i}return null}function WL(t,A){if(t===A.value)return[A];for(let e of A.children){let i=WL(t,e);if(i.length)return i.unshift(A),i}return[]}var Cl=class{value;children;constructor(A,e){this.value=A,this.children=e}toString(){return`TreeNode(${this.value})`}};function qB(t){let A={};return t&&t.children.forEach(e=>A[e.value.outlet]=e),A}var mm=class extends Yy{snapshot;constructor(A,e){super(A),this.snapshot=e,nF(this,A)}toString(){return this.snapshot.toString()}};function vee(t){let A=dve(t),e=new Mt([new K1("",{})]),i=new Mt({}),n=new Mt({}),o=new Mt({}),r=new Mt(""),s=new Tl(e,i,o,r,n,Yi,t,A.root);return s.snapshot=A.root,new mm(new Cl(s,[]),A)}function dve(t){let A={},e={},i={},n="",o=new gu([],A,i,n,e,Yi,t,null,{});return new pm("",new Cl(o,[]))}var Tl=class{urlSubject;paramsSubject;queryParamsSubject;fragmentSubject;dataSubject;outlet;component;snapshot;_futureSnapshot;_routerState;_paramMap;_queryParamMap;title;url;params;queryParams;fragment;data;constructor(A,e,i,n,o,r,s,a){this.urlSubject=A,this.paramsSubject=e,this.queryParamsSubject=i,this.fragmentSubject=n,this.dataSubject=o,this.outlet=r,this.component=s,this._futureSnapshot=a,this.title=this.dataSubject?.pipe(aA(c=>c[vm]))??dA(void 0),this.url=A,this.params=e,this.queryParams=i,this.fragment=n,this.data=o}get routeConfig(){return this._futureSnapshot.routeConfig}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=this.params.pipe(aA(A=>du(A))),this._paramMap}get queryParamMap(){return this._queryParamMap??=this.queryParams.pipe(aA(A=>du(A))),this._queryParamMap}toString(){return this.snapshot?this.snapshot.toString():`Future(${this._futureSnapshot})`}};function Hy(t,A,e="emptyOnly"){let i,{routeConfig:n}=t;return A!==null&&(e==="always"||n?.path===""||!A.component&&!A.routeConfig?.loadComponent)?i={params:ae(ae({},A.params),t.params),data:ae(ae({},A.data),t.data),resolve:ae(ae(ae(ae({},t.data),A.data),n?.data),t._resolvedData)}:i={params:ae({},t.params),data:ae({},t.data),resolve:ae(ae({},t.data),t._resolvedData??{})},n&&Mee(n)&&(i.resolve[vm]=n.title),i}var gu=class{url;params;queryParams;fragment;data;outlet;component;routeConfig;_resolve;_resolvedData;_routerState;_paramMap;_queryParamMap;get title(){return this.data?.[vm]}constructor(A,e,i,n,o,r,s,a,c){this.url=A,this.params=e,this.queryParams=i,this.fragment=n,this.data=o,this.outlet=r,this.component=s,this.routeConfig=a,this._resolve=c}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=du(this.params),this._paramMap}get queryParamMap(){return this._queryParamMap??=du(this.queryParams),this._queryParamMap}toString(){let A=this.url.map(i=>i.toString()).join("/"),e=this.routeConfig?this.routeConfig.path:"";return`Route(url:'${A}', path:'${e}')`}},pm=class extends Yy{url;constructor(A,e){super(e),this.url=A,nF(this,e)}toString(){return bee(this._root)}};function nF(t,A){A.value._routerState=t,A.children.forEach(e=>nF(t,e))}function bee(t){let A=t.children.length>0?` { ${t.children.map(bee).join(", ")} } `:"";return`${t.value}${A}`}function JL(t){if(t.snapshot){let A=t.snapshot,e=t._futureSnapshot;t.snapshot=e,X0(A.queryParams,e.queryParams)||t.queryParamsSubject.next(e.queryParams),A.fragment!==e.fragment&&t.fragmentSubject.next(e.fragment),X0(A.params,e.params)||t.paramsSubject.next(e.params),TDe(A.url,e.url)||t.urlSubject.next(e.url),X0(A.data,e.data)||t.dataSubject.next(e.data)}else t.snapshot=t._futureSnapshot,t.dataSubject.next(t._futureSnapshot.data)}function ZL(t,A){let e=X0(t.params,A.params)&&HDe(t.url,A.url),i=!t.parent!=!A.parent;return e&&!i&&(!t.parent||ZL(t.parent,A.parent))}function Mee(t){return typeof t.title=="string"||t.title===null}var See=new re(""),oF=(()=>{class t{activated=null;get activatedComponentRef(){return this.activated}_activatedRoute=null;name=Yi;activateEvents=new Ve;deactivateEvents=new Ve;attachEvents=new Ve;detachEvents=new Ve;routerOutletData=lt(void 0);parentContexts=E(Iu);location=E(xn);changeDetector=E(ut);inputBinder=E(Mm,{optional:!0});supportsBindingToComponentInputs=!0;ngOnChanges(e){if(e.name){let{firstChange:i,previousValue:n}=e.name;if(i)return;this.isTrackedInParentContexts(n)&&(this.deactivate(),this.parentContexts.onChildOutletDestroyed(n)),this.initializeOutletWithName()}}ngOnDestroy(){this.isTrackedInParentContexts(this.name)&&this.parentContexts.onChildOutletDestroyed(this.name),this.inputBinder?.unsubscribeFromRouteData(this)}isTrackedInParentContexts(e){return this.parentContexts.getContext(e)?.outlet===this}ngOnInit(){this.initializeOutletWithName()}initializeOutletWithName(){if(this.parentContexts.onChildOutletCreated(this.name,this),this.activated)return;let e=this.parentContexts.getContext(this.name);e?.route&&(e.attachRef?this.attach(e.attachRef,e.route):this.activateWith(e.route,e.injector))}get isActivated(){return!!this.activated}get component(){if(!this.activated)throw new lA(4012,!1);return this.activated.instance}get activatedRoute(){if(!this.activated)throw new lA(4012,!1);return this._activatedRoute}get activatedRouteData(){return this._activatedRoute?this._activatedRoute.snapshot.data:{}}detach(){if(!this.activated)throw new lA(4012,!1);this.location.detach();let e=this.activated;return this.activated=null,this._activatedRoute=null,this.detachEvents.emit(e.instance),e}attach(e,i){this.activated=e,this._activatedRoute=i,this.location.insert(e.hostView),this.inputBinder?.bindActivatedRouteToOutletComponent(this),this.attachEvents.emit(e.instance)}deactivate(){if(this.activated){let e=this.component;this.activated.destroy(),this.activated=null,this._activatedRoute=null,this.deactivateEvents.emit(e)}}activateWith(e,i){if(this.isActivated)throw new lA(4013,!1);this._activatedRoute=e;let n=this.location,r=e.snapshot.component,s=this.parentContexts.getOrCreateContext(this.name).children,a=new XL(e,s,n.injector,this.routerOutletData);this.activated=n.createComponent(r,{index:n.length,injector:a,environmentInjector:i}),this.changeDetector.markForCheck(),this.inputBinder?.bindActivatedRouteToOutletComponent(this),this.activateEvents.emit(this.activated.instance)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["router-outlet"]],inputs:{name:"name",routerOutletData:[1,"routerOutletData"]},outputs:{activateEvents:"activate",deactivateEvents:"deactivate",attachEvents:"attach",detachEvents:"detach"},exportAs:["outlet"],features:[ti]})}return t})(),XL=class{route;childContexts;parent;outletData;constructor(A,e,i,n){this.route=A,this.childContexts=e,this.parent=i,this.outletData=n}get(A,e){return A===Tl?this.route:A===Iu?this.childContexts:A===See?this.outletData:this.parent.get(A,e)}},Mm=new re(""),rF=(()=>{class t{outletDataSubscriptions=new Map;bindActivatedRouteToOutletComponent(e){this.unsubscribeFromRouteData(e),this.subscribeToRouteData(e)}unsubscribeFromRouteData(e){this.outletDataSubscriptions.get(e)?.unsubscribe(),this.outletDataSubscriptions.delete(e)}subscribeToRouteData(e){let{activatedRoute:i}=e,n=uc([i.queryParams,i.params,i.data]).pipe(Si(([o,r,s],a)=>(s=ae(ae(ae({},o),r),s),a===0?dA(s):Promise.resolve(s)))).subscribe(o=>{if(!e.isActivated||!e.activatedComponentRef||e.activatedRoute!==i||i.component===null){this.unsubscribeFromRouteData(e);return}let r=LW(i.component);if(!r){this.unsubscribeFromRouteData(e);return}for(let{templateName:s}of r.inputs)e.activatedComponentRef.setInput(s,o[s])});this.outletDataSubscriptions.set(e,n)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac})}return t})(),sF=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["ng-component"]],exportAs:["emptyRouterOutlet"],decls:1,vars:0,template:function(i,n){i&1&&ve(0,"router-outlet")},dependencies:[oF],encapsulation:2})}return t})();function aF(t){let A=t.children&&t.children.map(aF),e=A?_A(ae({},t),{children:A}):ae({},t);return!e.component&&!e.loadComponent&&(A||e.loadChildren)&&e.outlet&&e.outlet!==Yi&&(e.component=sF),e}function Cve(t,A,e){let i=wm(t,A._root,e?e._root:void 0);return new mm(i,A)}function wm(t,A,e){if(e&&t.shouldReuseRoute(A.value,e.value.snapshot)){let i=e.value;i._futureSnapshot=A.value;let n=Ive(t,A,e);return new Cl(i,n)}else{if(t.shouldAttach(A.value)){let o=t.retrieve(A.value);if(o!==null){let r=o.route;return r.value._futureSnapshot=A.value,r.children=A.children.map(s=>wm(t,s)),r}}let i=uve(A.value),n=A.children.map(o=>wm(t,o));return new Cl(i,n)}}function Ive(t,A,e){return A.children.map(i=>{for(let n of e.children)if(t.shouldReuseRoute(i.value,n.value.snapshot))return wm(t,i,n);return wm(t,i)})}function uve(t){return new Tl(new Mt(t.url),new Mt(t.params),new Mt(t.queryParams),new Mt(t.fragment),new Mt(t.data),t.outlet,t.component,t)}var iE=class{redirectTo;navigationBehaviorOptions;constructor(A,e){this.redirectTo=A,this.navigationBehaviorOptions=e}},kee="ngNavigationCancelingError";function zy(t,A){let{redirectTo:e,navigationBehaviorOptions:i}=XB(A)?{redirectTo:A,navigationBehaviorOptions:void 0}:A,n=xee(!1,vc.Redirect);return n.url=e,n.navigationBehaviorOptions=i,n}function xee(t,A){let e=new Error(`NavigationCancelingError: ${t||""}`);return e[kee]=!0,e.cancellationCode=A,e}function hve(t){return _ee(t)&&XB(t.url)}function _ee(t){return!!t&&t[kee]}var Bve=(t,A,e,i)=>aA(n=>(new $L(A,n.targetRouterState,n.currentRouterState,e,i).activate(t),n)),$L=class{routeReuseStrategy;futureState;currState;forwardEvent;inputBindingEnabled;constructor(A,e,i,n,o){this.routeReuseStrategy=A,this.futureState=e,this.currState=i,this.forwardEvent=n,this.inputBindingEnabled=o}activate(A){let e=this.futureState._root,i=this.currState?this.currState._root:null;this.deactivateChildRoutes(e,i,A),JL(this.futureState.root),this.activateChildRoutes(e,i,A)}deactivateChildRoutes(A,e,i){let n=qB(e);A.children.forEach(o=>{let r=o.value.outlet;this.deactivateRoutes(o,n[r],i),delete n[r]}),Object.values(n).forEach(o=>{this.deactivateRouteAndItsChildren(o,i)})}deactivateRoutes(A,e,i){let n=A.value,o=e?e.value:null;if(n===o)if(n.component){let r=i.getContext(n.outlet);r&&this.deactivateChildRoutes(A,e,r.children)}else this.deactivateChildRoutes(A,e,i);else o&&this.deactivateRouteAndItsChildren(e,i)}deactivateRouteAndItsChildren(A,e){A.value.component&&this.routeReuseStrategy.shouldDetach(A.value.snapshot)?this.detachAndStoreRouteSubtree(A,e):this.deactivateRouteAndOutlet(A,e)}detachAndStoreRouteSubtree(A,e){let i=e.getContext(A.value.outlet),n=i&&A.value.component?i.children:e,o=qB(A);for(let r of Object.values(o))this.deactivateRouteAndItsChildren(r,n);if(i&&i.outlet){let r=i.outlet.detach(),s=i.children.onOutletDeactivated();this.routeReuseStrategy.store(A.value.snapshot,{componentRef:r,route:A,contexts:s})}}deactivateRouteAndOutlet(A,e){let i=e.getContext(A.value.outlet),n=i&&A.value.component?i.children:e,o=qB(A);for(let r of Object.values(o))this.deactivateRouteAndItsChildren(r,n);i&&(i.outlet&&(i.outlet.deactivate(),i.children.onOutletDeactivated()),i.attachRef=null,i.route=null)}activateChildRoutes(A,e,i){let n=qB(e);A.children.forEach(o=>{this.activateRoutes(o,n[o.value.outlet],i),this.forwardEvent(new Oy(o.value.snapshot))}),A.children.length&&this.forwardEvent(new Uy(A.value.snapshot))}activateRoutes(A,e,i){let n=A.value,o=e?e.value:null;if(JL(n),n===o)if(n.component){let r=i.getOrCreateContext(n.outlet);this.activateChildRoutes(A,e,r.children)}else this.activateChildRoutes(A,e,i);else if(n.component){let r=i.getOrCreateContext(n.outlet);if(this.routeReuseStrategy.shouldAttach(n.snapshot)){let s=this.routeReuseStrategy.retrieve(n.snapshot);this.routeReuseStrategy.store(n.snapshot,null),r.children.onOutletReAttached(s.contexts),r.attachRef=s.componentRef,r.route=s.route.value,r.outlet&&r.outlet.attach(s.componentRef,s.route.value),JL(s.route.value),this.activateChildRoutes(A,null,r.children)}else r.attachRef=null,r.route=n,r.outlet&&r.outlet.activateWith(n,r.injector),this.activateChildRoutes(A,null,r.children)}else this.activateChildRoutes(A,null,i)}},Py=class{path;route;constructor(A){this.path=A,this.route=this.path[this.path.length-1]}},ZB=class{component;route;constructor(A,e){this.component=A,this.route=e}};function Eve(t,A,e){let i=t._root,n=A?A._root:null;return um(i,n,e,[i.value])}function fve(t){let A=t.routeConfig?t.routeConfig.canActivateChild:null;return!A||A.length===0?null:{node:t,guards:A}}function oE(t,A){let e=Symbol(),i=A.get(t,e);return i===e?typeof t=="function"&&!Kj(t)?t:A.get(t):i}function um(t,A,e,i,n={canDeactivateChecks:[],canActivateChecks:[]}){let o=qB(A);return t.children.forEach(r=>{Qve(r,o[r.value.outlet],e,i.concat([r.value]),n),delete o[r.value.outlet]}),Object.entries(o).forEach(([r,s])=>Bm(s,e.getContext(r),n)),n}function Qve(t,A,e,i,n={canDeactivateChecks:[],canActivateChecks:[]}){let o=t.value,r=A?A.value:null,s=e?e.getContext(t.value.outlet):null;if(r&&o.routeConfig===r.routeConfig){let a=mve(r,o,o.routeConfig.runGuardsAndResolvers);a?n.canActivateChecks.push(new Py(i)):(o.data=r.data,o._resolvedData=r._resolvedData),o.component?um(t,A,s?s.children:null,i,n):um(t,A,e,i,n),a&&s&&s.outlet&&s.outlet.isActivated&&n.canDeactivateChecks.push(new ZB(s.outlet.component,r))}else r&&Bm(A,s,n),n.canActivateChecks.push(new Py(i)),o.component?um(t,null,s?s.children:null,i,n):um(t,null,e,i,n);return n}function mve(t,A,e){if(typeof e=="function")return e(t,A);switch(e){case"pathParamsChange":return!lu(t.url,A.url);case"pathParamsOrQueryParamsChange":return!lu(t.url,A.url)||!X0(t.queryParams,A.queryParams);case"always":return!0;case"paramsOrQueryParamsChange":return!ZL(t,A)||!X0(t.queryParams,A.queryParams);case"paramsChange":default:return!ZL(t,A)}}function Bm(t,A,e){let i=qB(t),n=t.value;Object.entries(i).forEach(([o,r])=>{n.component?A?Bm(r,A.children.getContext(o),e):Bm(r,null,e):Bm(r,A,e)}),n.component?A&&A.outlet&&A.outlet.isActivated?e.canDeactivateChecks.push(new ZB(A.outlet.component,n)):e.canDeactivateChecks.push(new ZB(null,n)):e.canDeactivateChecks.push(new ZB(null,n))}function Sm(t){return typeof t=="function"}function pve(t){return typeof t=="boolean"}function wve(t){return t&&Sm(t.canLoad)}function yve(t){return t&&Sm(t.canActivate)}function Dve(t){return t&&Sm(t.canActivateChild)}function vve(t){return t&&Sm(t.canDeactivate)}function bve(t){return t&&Sm(t.canMatch)}function Ree(t){return t instanceof mg||t?.name==="EmptyError"}var Dy=Symbol("INITIAL_VALUE");function nE(){return Si(t=>uc(t.map(A=>A.pipe(Pn(1),In(Dy)))).pipe(aA(A=>{for(let e of A)if(e!==!0){if(e===Dy)return Dy;if(e===!1||Mve(e))return e}return!0}),$A(A=>A!==Dy),Pn(1)))}function Mve(t){return XB(t)||t instanceof iE}function Sve(t,A){return Lr(e=>{let{targetSnapshot:i,currentSnapshot:n,guards:{canActivateChecks:o,canDeactivateChecks:r}}=e;return r.length===0&&o.length===0?dA(_A(ae({},e),{guardsResult:!0})):kve(r,i,n,t).pipe(Lr(s=>s&&pve(s)?xve(i,o,t,A):dA(s)),aA(s=>_A(ae({},e),{guardsResult:s})))})}function kve(t,A,e,i){return xo(t).pipe(Lr(n=>Fve(n.component,n.route,e,A,i)),_l(n=>n!==!0,!0))}function xve(t,A,e,i){return xo(A).pipe(M0(n=>h1(Rve(n.route.parent,i),_ve(n.route,i),Lve(t,n.path,e),Nve(t,n.route,e))),_l(n=>n!==!0,!0))}function _ve(t,A){return t!==null&&A&&A(new Ty(t)),dA(!0)}function Rve(t,A){return t!==null&&A&&A(new Ky(t)),dA(!0)}function Nve(t,A,e){let i=A.routeConfig?A.routeConfig.canActivate:null;if(!i||i.length===0)return dA(!0);let n=i.map(o=>b0(()=>{let r=bm(A)??e,s=oE(o,r),a=yve(s)?s.canActivate(A,t):Xr(r,()=>s(A,t));return O1(a).pipe(_l())}));return dA(n).pipe(nE())}function Lve(t,A,e){let i=A[A.length-1],o=A.slice(0,A.length-1).reverse().map(r=>fve(r)).filter(r=>r!==null).map(r=>b0(()=>{let s=r.guards.map(a=>{let c=bm(r.node)??e,l=oE(a,c),d=Dve(l)?l.canActivateChild(i,t):Xr(c,()=>l(i,t));return O1(d).pipe(_l())});return dA(s).pipe(nE())}));return dA(o).pipe(nE())}function Fve(t,A,e,i,n){let o=A&&A.routeConfig?A.routeConfig.canDeactivate:null;if(!o||o.length===0)return dA(!0);let r=o.map(s=>{let a=bm(A)??n,c=oE(s,a),l=vve(c)?c.canDeactivate(t,A,e,i):Xr(a,()=>c(t,A,e,i));return O1(l).pipe(_l())});return dA(r).pipe(nE())}function Gve(t,A,e,i){let n=A.canLoad;if(n===void 0||n.length===0)return dA(!0);let o=n.map(r=>{let s=oE(r,t),a=wve(s)?s.canLoad(A,e):Xr(t,()=>s(A,e));return O1(a)});return dA(o).pipe(nE(),Nee(i))}function Nee(t){return Yk(Pt(A=>{if(typeof A!="boolean")throw zy(t,A)}),aA(A=>A===!0))}function Kve(t,A,e,i){let n=A.canMatch;if(!n||n.length===0)return dA(!0);let o=n.map(r=>{let s=oE(r,t),a=bve(s)?s.canMatch(A,e):Xr(t,()=>s(A,e));return O1(a)});return dA(o).pipe(nE(),Nee(i))}var ym=class{segmentGroup;constructor(A){this.segmentGroup=A||null}},Dm=class extends Error{urlTree;constructor(A){super(),this.urlTree=A}};function VB(t){return C1(new ym(t))}function Uve(t){return C1(new lA(4e3,!1))}function Tve(t){return C1(xee(!1,vc.GuardRejected))}var eF=class{urlSerializer;urlTree;constructor(A,e){this.urlSerializer=A,this.urlTree=e}lineralizeSegments(A,e){let i=[],n=e.root;for(;;){if(i=i.concat(n.segments),n.numberOfChildren===0)return dA(i);if(n.numberOfChildren>1||!n.children[Yi])return Uve(`${A.redirectTo}`);n=n.children[Yi]}}applyRedirectCommands(A,e,i,n,o){if(typeof e!="string"){let s=e,{queryParams:a,fragment:c,routeConfig:l,url:d,outlet:C,params:I,data:u,title:h}=n,B=Xr(o,()=>s({params:I,data:u,queryParams:a,fragment:c,routeConfig:l,url:d,outlet:C,title:h}));if(B instanceof ed)throw new Dm(B);e=B}let r=this.applyRedirectCreateUrlTree(e,this.urlSerializer.parse(e),A,i);if(e[0]==="/")throw new Dm(r);return r}applyRedirectCreateUrlTree(A,e,i,n){let o=this.createSegmentGroup(A,e.root,i,n);return new ed(o,this.createQueryParams(e.queryParams,this.urlTree.queryParams),e.fragment)}createQueryParams(A,e){let i={};return Object.entries(A).forEach(([n,o])=>{if(typeof o=="string"&&o[0]===":"){let s=o.substring(1);i[n]=e[s]}else i[n]=o}),i}createSegmentGroup(A,e,i,n){let o=this.createSegments(A,e.segments,i,n),r={};return Object.entries(e.children).forEach(([s,a])=>{r[s]=this.createSegmentGroup(A,a,i,n)}),new ao(o,r)}createSegments(A,e,i,n){return e.map(o=>o.path[0]===":"?this.findPosParam(A,o,n):this.findOrReturn(o,i))}findPosParam(A,e,i){let n=i[e.path.substring(1)];if(!n)throw new lA(4001,!1);return n}findOrReturn(A,e){let i=0;for(let n of e){if(n.path===A.path)return e.splice(i),n;i++}return A}},AF={matched:!1,consumedSegments:[],remainingSegments:[],parameters:{},positionalParamSegments:{}};function Ove(t,A,e,i,n){let o=Lee(t,A,e);return o.matched?(i=lve(A,i),Kve(i,A,e,n).pipe(aA(r=>r===!0?o:ae({},AF)))):dA(o)}function Lee(t,A,e){if(A.path==="**")return Jve(e);if(A.path==="")return A.pathMatch==="full"&&(t.hasChildren()||e.length>0)?ae({},AF):{matched:!0,consumedSegments:[],remainingSegments:e,parameters:{},positionalParamSegments:{}};let n=(A.matcher||lee)(e,t,A);if(!n)return ae({},AF);let o={};Object.entries(n.posParams??{}).forEach(([s,a])=>{o[s]=a.path});let r=n.consumed.length>0?ae(ae({},o),n.consumed[n.consumed.length-1].parameters):o;return{matched:!0,consumedSegments:n.consumed,remainingSegments:e.slice(n.consumed.length),parameters:r,positionalParamSegments:n.posParams??{}}}function Jve(t){return{matched:!0,parameters:t.length>0?dee(t).parameters:{},consumedSegments:t,remainingSegments:[],positionalParamSegments:{}}}function see(t,A,e,i){return e.length>0&&zve(t,e,i)?{segmentGroup:new ao(A,Hve(i,new ao(e,t.children))),slicedSegments:[]}:e.length===0&&Pve(t,e,i)?{segmentGroup:new ao(t.segments,Yve(t,e,i,t.children)),slicedSegments:e}:{segmentGroup:new ao(t.segments,t.children),slicedSegments:e}}function Yve(t,A,e,i){let n={};for(let o of e)if(Vy(t,A,o)&&!i[xg(o)]){let r=new ao([],{});n[xg(o)]=r}return ae(ae({},i),n)}function Hve(t,A){let e={};e[Yi]=A;for(let i of t)if(i.path===""&&xg(i)!==Yi){let n=new ao([],{});e[xg(i)]=n}return e}function zve(t,A,e){return e.some(i=>Vy(t,A,i)&&xg(i)!==Yi)}function Pve(t,A,e){return e.some(i=>Vy(t,A,i))}function Vy(t,A,e){return(t.hasChildren()||A.length>0)&&e.pathMatch==="full"?!1:e.path===""}function jve(t,A,e){return A.length===0&&!t.children[e]}var tF=class{};function Vve(t,A,e,i,n,o,r="emptyOnly"){return new iF(t,A,e,i,n,r,o).recognize()}var qve=31,iF=class{injector;configLoader;rootComponentType;config;urlTree;paramsInheritanceStrategy;urlSerializer;applyRedirects;absoluteRedirectCount=0;allowRedirects=!0;constructor(A,e,i,n,o,r,s){this.injector=A,this.configLoader=e,this.rootComponentType=i,this.config=n,this.urlTree=o,this.paramsInheritanceStrategy=r,this.urlSerializer=s,this.applyRedirects=new eF(this.urlSerializer,this.urlTree)}noMatchError(A){return new lA(4002,`'${A.segmentGroup}'`)}recognize(){let A=see(this.urlTree.root,[],[],this.config).segmentGroup;return this.match(A).pipe(aA(({children:e,rootSnapshot:i})=>{let n=new Cl(i,e),o=new pm("",n),r=mee(i,[],this.urlTree.queryParams,this.urlTree.fragment);return r.queryParams=this.urlTree.queryParams,o.url=this.urlSerializer.serialize(r),{state:o,tree:r}}))}match(A){let e=new gu([],Object.freeze({}),Object.freeze(ae({},this.urlTree.queryParams)),this.urlTree.fragment,Object.freeze({}),Yi,this.rootComponentType,null,{});return this.processSegmentGroup(this.injector,this.config,A,Yi,e).pipe(aA(i=>({children:i,rootSnapshot:e})),br(i=>{if(i instanceof Dm)return this.urlTree=i.urlTree,this.match(i.urlTree.root);throw i instanceof ym?this.noMatchError(i):i}))}processSegmentGroup(A,e,i,n,o){return i.segments.length===0&&i.hasChildren()?this.processChildren(A,e,i,o):this.processSegment(A,e,i,i.segments,n,!0,o).pipe(aA(r=>r instanceof Cl?[r]:[]))}processChildren(A,e,i,n){let o=[];for(let r of Object.keys(i.children))r==="primary"?o.unshift(r):o.push(r);return xo(o).pipe(M0(r=>{let s=i.children[r],a=gve(e,r);return this.processSegmentGroup(A,a,s,r,n)}),Xk((r,s)=>(r.push(...s),r)),B1(null),Zk(),Lr(r=>{if(r===null)return VB(i);let s=Fee(r);return Wve(s),dA(s)}))}processSegment(A,e,i,n,o,r,s){return xo(e).pipe(M0(a=>this.processSegmentAgainstRoute(a._injector??A,e,a,i,n,o,r,s).pipe(br(c=>{if(c instanceof ym)return dA(null);throw c}))),_l(a=>!!a),br(a=>{if(Ree(a))return jve(i,n,o)?dA(new tF):VB(i);throw a}))}processSegmentAgainstRoute(A,e,i,n,o,r,s,a){return xg(i)!==r&&(r===Yi||!Vy(n,o,i))?VB(n):i.redirectTo===void 0?this.matchSegmentAgainstRoute(A,n,i,o,r,a):this.allowRedirects&&s?this.expandSegmentAgainstRouteUsingRedirect(A,n,e,i,o,r,a):VB(n)}expandSegmentAgainstRouteUsingRedirect(A,e,i,n,o,r,s){let{matched:a,parameters:c,consumedSegments:l,positionalParamSegments:d,remainingSegments:C}=Lee(e,n,o);if(!a)return VB(e);typeof n.redirectTo=="string"&&n.redirectTo[0]==="/"&&(this.absoluteRedirectCount++,this.absoluteRedirectCount>qve&&(this.allowRedirects=!1));let I=new gu(o,c,Object.freeze(ae({},this.urlTree.queryParams)),this.urlTree.fragment,aee(n),xg(n),n.component??n._loadedComponent??null,n,cee(n)),u=Hy(I,s,this.paramsInheritanceStrategy);I.params=Object.freeze(u.params),I.data=Object.freeze(u.data);let h=this.applyRedirects.applyRedirectCommands(l,n.redirectTo,d,I,A);return this.applyRedirects.lineralizeSegments(n,h).pipe(Lr(B=>this.processSegment(A,i,e,B.concat(C),r,!1,s)))}matchSegmentAgainstRoute(A,e,i,n,o,r){let s=Ove(e,i,n,A,this.urlSerializer);return i.path==="**"&&(e.children={}),s.pipe(Si(a=>a.matched?(A=i._injector??A,this.getChildConfig(A,i,n).pipe(Si(({routes:c})=>{let l=i._loadedInjector??A,{parameters:d,consumedSegments:C,remainingSegments:I}=a,u=new gu(C,d,Object.freeze(ae({},this.urlTree.queryParams)),this.urlTree.fragment,aee(i),xg(i),i.component??i._loadedComponent??null,i,cee(i)),h=Hy(u,r,this.paramsInheritanceStrategy);u.params=Object.freeze(h.params),u.data=Object.freeze(h.data);let{segmentGroup:B,slicedSegments:f}=see(e,C,I,c);if(f.length===0&&B.hasChildren())return this.processChildren(l,c,B,u).pipe(aA(k=>new Cl(u,k)));if(c.length===0&&f.length===0)return dA(new Cl(u,[]));let b=xg(i)===o;return this.processSegment(l,c,B,f,b?Yi:o,!0,u).pipe(aA(k=>new Cl(u,k instanceof Cl?[k]:[])))}))):VB(e)))}getChildConfig(A,e,i){return e.children?dA({routes:e.children,injector:A}):e.loadChildren?e._loadedRoutes!==void 0?dA({routes:e._loadedRoutes,injector:e._loadedInjector}):Gve(A,e,i,this.urlSerializer).pipe(Lr(n=>n?this.configLoader.loadChildren(A,e).pipe(Pt(o=>{e._loadedRoutes=o.routes,e._loadedInjector=o.injector})):Tve(e))):dA({routes:[],injector:A})}};function Wve(t){t.sort((A,e)=>A.value.outlet===Yi?-1:e.value.outlet===Yi?1:A.value.outlet.localeCompare(e.value.outlet))}function Zve(t){let A=t.value.routeConfig;return A&&A.path===""}function Fee(t){let A=[],e=new Set;for(let i of t){if(!Zve(i)){A.push(i);continue}let n=A.find(o=>i.value.routeConfig===o.value.routeConfig);n!==void 0?(n.children.push(...i.children),e.add(n)):A.push(i)}for(let i of e){let n=Fee(i.children);A.push(new Cl(i.value,n))}return A.filter(i=>!e.has(i))}function aee(t){return t.data||{}}function cee(t){return t.resolve||{}}function Xve(t,A,e,i,n,o){return Lr(r=>Vve(t,A,e,i,r.extractedUrl,n,o).pipe(aA(({state:s,tree:a})=>_A(ae({},r),{targetSnapshot:s,urlAfterRedirects:a}))))}function $ve(t,A){return Lr(e=>{let{targetSnapshot:i,guards:{canActivateChecks:n}}=e;if(!n.length)return dA(e);let o=new Set(n.map(a=>a.route)),r=new Set;for(let a of o)if(!r.has(a))for(let c of Gee(a))r.add(c);let s=0;return xo(r).pipe(M0(a=>o.has(a)?e7e(a,i,t,A):(a.data=Hy(a,a.parent,t).resolve,dA(void 0))),Pt(()=>s++),Vh(1),Lr(a=>s===r.size?dA(e):vr))})}function Gee(t){let A=t.children.map(e=>Gee(e)).flat();return[t,...A]}function e7e(t,A,e,i){let n=t.routeConfig,o=t._resolve;return n?.title!==void 0&&!Mee(n)&&(o[vm]=n.title),A7e(o,t,A,i).pipe(aA(r=>(t._resolvedData=r,t.data=Hy(t,t.parent,e).resolve,null)))}function A7e(t,A,e,i){let n=zL(t);if(n.length===0)return dA({});let o={};return xo(n).pipe(Lr(r=>t7e(t[r],A,e,i).pipe(_l(),Pt(s=>{if(s instanceof iE)throw zy(new U1,s);o[r]=s}))),Vh(1),aA(()=>o),br(r=>Ree(r)?vr:C1(r)))}function t7e(t,A,e,i){let n=bm(A)??i,o=oE(t,n),r=o.resolve?o.resolve(A,e):Xr(n,()=>o(A,e));return O1(r)}function YL(t){return Si(A=>{let e=t(A);return e?xo(e).pipe(aA(()=>A)):dA(A)})}var cF=(()=>{class t{buildTitle(e){let i,n=e.root;for(;n!==void 0;)i=this.getResolvedTitleForRoute(n)??i,n=n.children.find(o=>o.outlet===Yi);return i}getResolvedTitleForRoute(e){return e.data[vm]}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:()=>E(Kee),providedIn:"root"})}return t})(),Kee=(()=>{class t extends cF{title;constructor(e){super(),this.title=e}updateTitle(e){let i=this.buildTitle(e);i!==void 0&&this.title.setTitle(i)}static \u0275fac=function(i){return new(i||t)(UA(UX))};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),uu=new re("",{providedIn:"root",factory:()=>({})}),rE=new re(""),qy=(()=>{class t{componentLoaders=new WeakMap;childrenLoaders=new WeakMap;onLoadStartListener;onLoadEndListener;compiler=E(xW);loadComponent(e){if(this.componentLoaders.get(e))return this.componentLoaders.get(e);if(e._loadedComponent)return dA(e._loadedComponent);this.onLoadStartListener&&this.onLoadStartListener(e);let i=O1(e.loadComponent()).pipe(aA(Tee),Pt(o=>{this.onLoadEndListener&&this.onLoadEndListener(e),e._loadedComponent=o}),S0(()=>{this.componentLoaders.delete(e)})),n=new g1(i,()=>new je).pipe(Kh());return this.componentLoaders.set(e,n),n}loadChildren(e,i){if(this.childrenLoaders.get(i))return this.childrenLoaders.get(i);if(i._loadedRoutes)return dA({routes:i._loadedRoutes,injector:i._loadedInjector});this.onLoadStartListener&&this.onLoadStartListener(i);let o=Uee(i,this.compiler,e,this.onLoadEndListener).pipe(S0(()=>{this.childrenLoaders.delete(i)})),r=new g1(o,()=>new je).pipe(Kh());return this.childrenLoaders.set(i,r),r}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function Uee(t,A,e,i){return O1(t.loadChildren()).pipe(aA(Tee),Lr(n=>n instanceof QR||Array.isArray(n)?dA(n):xo(A.compileModuleAsync(n))),aA(n=>{i&&i(t);let o,r,s=!1;return Array.isArray(n)?(r=n,s=!0):(o=n.create(e).injector,r=o.get(rE,[],{optional:!0,self:!0}).flat()),{routes:r.map(aF),injector:o}}))}function i7e(t){return t&&typeof t=="object"&&"default"in t}function Tee(t){return i7e(t)?t.default:t}var Wy=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:()=>E(n7e),providedIn:"root"})}return t})(),n7e=(()=>{class t{shouldProcessUrl(e){return!0}extract(e){return e}merge(e,i){return e}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),lF=new re(""),gF=new re("");function Oee(t,A,e){let i=t.get(gF),n=t.get(ht);return t.get(yA).runOutsideAngular(()=>{if(!n.startViewTransition||i.skipNextTransition)return i.skipNextTransition=!1,new Promise(c=>setTimeout(c));let o,r=new Promise(c=>{o=c}),s=n.startViewTransition(()=>(o(),o7e(t))),{onViewTransitionCreated:a}=i;return a&&Xr(t,()=>a({transition:s,from:A,to:e})),r})}function o7e(t){return new Promise(A=>{Gr({read:()=>setTimeout(A)},{injector:t})})}var dF=new re(""),Zy=(()=>{class t{currentNavigation=null;currentTransition=null;lastSuccessfulNavigation=null;events=new je;transitionAbortSubject=new je;configLoader=E(qy);environmentInjector=E(Hr);destroyRef=E(Fr);urlSerializer=E(Cu);rootContexts=E(Iu);location=E(Fl);inputBindingEnabled=E(Mm,{optional:!0})!==null;titleStrategy=E(cF);options=E(uu,{optional:!0})||{};paramsInheritanceStrategy=this.options.paramsInheritanceStrategy||"emptyOnly";urlHandlingStrategy=E(Wy);createViewTransition=E(lF,{optional:!0});navigationErrorHandler=E(dF,{optional:!0});navigationId=0;get hasRequestedNavigation(){return this.navigationId!==0}transitions;afterPreactivation=()=>dA(void 0);rootComponentType=null;destroyed=!1;constructor(){let e=n=>this.events.next(new Fy(n)),i=n=>this.events.next(new Gy(n));this.configLoader.onLoadEndListener=i,this.configLoader.onLoadStartListener=e,this.destroyRef.onDestroy(()=>{this.destroyed=!0})}complete(){this.transitions?.complete()}handleNavigationRequest(e){let i=++this.navigationId;this.transitions?.next(_A(ae({},e),{extractedUrl:this.urlHandlingStrategy.extract(e.rawUrl),targetSnapshot:null,targetRouterState:null,guards:{canActivateChecks:[],canDeactivateChecks:[]},guardsResult:null,id:i}))}setupNavigations(e){return this.transitions=new Mt(null),this.transitions.pipe($A(i=>i!==null),Si(i=>{let n=!1,o=!1;return dA(i).pipe(Si(r=>{if(this.navigationId>i.id)return this.cancelNavigationTransition(i,"",vc.SupersededByNewNavigation),vr;this.currentTransition=i,this.currentNavigation={id:r.id,initialUrl:r.rawUrl,extractedUrl:r.extractedUrl,targetBrowserUrl:typeof r.extras.browserUrl=="string"?this.urlSerializer.parse(r.extras.browserUrl):r.extras.browserUrl,trigger:r.source,extras:r.extras,previousNavigation:this.lastSuccessfulNavigation?_A(ae({},this.lastSuccessfulNavigation),{previousNavigation:null}):null};let s=!e.navigated||this.isUpdatingInternalState()||this.isUpdatedBrowserUrl(),a=r.extras.onSameUrlNavigation??e.onSameUrlNavigation;if(!s&&a!=="reload"){let c="";return this.events.next(new Ad(r.id,this.urlSerializer.serialize(r.rawUrl),c,$B.IgnoredSameUrlNavigation)),r.resolve(!1),vr}if(this.urlHandlingStrategy.shouldProcessUrl(r.rawUrl))return dA(r).pipe(Si(c=>(this.events.next(new T1(c.id,this.urlSerializer.serialize(c.extractedUrl),c.source,c.restoredState)),c.id!==this.navigationId?vr:Promise.resolve(c))),Xve(this.environmentInjector,this.configLoader,this.rootComponentType,e.config,this.urlSerializer,this.paramsInheritanceStrategy),Pt(c=>{i.targetSnapshot=c.targetSnapshot,i.urlAfterRedirects=c.urlAfterRedirects,this.currentNavigation=_A(ae({},this.currentNavigation),{finalUrl:c.urlAfterRedirects});let l=new fm(c.id,this.urlSerializer.serialize(c.extractedUrl),this.urlSerializer.serialize(c.urlAfterRedirects),c.targetSnapshot);this.events.next(l)}));if(s&&this.urlHandlingStrategy.shouldProcessUrl(r.currentRawUrl)){let{id:c,extractedUrl:l,source:d,restoredState:C,extras:I}=r,u=new T1(c,this.urlSerializer.serialize(l),d,C);this.events.next(u);let h=vee(this.rootComponentType).snapshot;return this.currentTransition=i=_A(ae({},r),{targetSnapshot:h,urlAfterRedirects:l,extras:_A(ae({},I),{skipLocationChange:!1,replaceUrl:!1})}),this.currentNavigation.finalUrl=l,dA(i)}else{let c="";return this.events.next(new Ad(r.id,this.urlSerializer.serialize(r.extractedUrl),c,$B.IgnoredByUrlHandlingStrategy)),r.resolve(!1),vr}}),Pt(r=>{let s=new _y(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);this.events.next(s)}),aA(r=>(this.currentTransition=i=_A(ae({},r),{guards:Eve(r.targetSnapshot,r.currentSnapshot,this.rootContexts)}),i)),Sve(this.environmentInjector,r=>this.events.next(r)),Pt(r=>{if(i.guardsResult=r.guardsResult,r.guardsResult&&typeof r.guardsResult!="boolean")throw zy(this.urlSerializer,r.guardsResult);let s=new Ry(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot,!!r.guardsResult);this.events.next(s)}),$A(r=>r.guardsResult?!0:(this.cancelNavigationTransition(r,"",vc.GuardRejected),!1)),YL(r=>{if(r.guards.canActivateChecks.length!==0)return dA(r).pipe(Pt(s=>{let a=new Ny(s.id,this.urlSerializer.serialize(s.extractedUrl),this.urlSerializer.serialize(s.urlAfterRedirects),s.targetSnapshot);this.events.next(a)}),Si(s=>{let a=!1;return dA(s).pipe($ve(this.paramsInheritanceStrategy,this.environmentInjector),Pt({next:()=>a=!0,complete:()=>{a||this.cancelNavigationTransition(s,"",vc.NoDataFromResolver)}}))}),Pt(s=>{let a=new Ly(s.id,this.urlSerializer.serialize(s.extractedUrl),this.urlSerializer.serialize(s.urlAfterRedirects),s.targetSnapshot);this.events.next(a)}))}),YL(r=>{let s=a=>{let c=[];a.routeConfig?.loadComponent&&!a.routeConfig._loadedComponent&&c.push(this.configLoader.loadComponent(a.routeConfig).pipe(Pt(l=>{a.component=l}),aA(()=>{})));for(let l of a.children)c.push(...s(l));return c};return uc(s(r.targetSnapshot.root)).pipe(B1(null),Pn(1))}),YL(()=>this.afterPreactivation()),Si(()=>{let{currentSnapshot:r,targetSnapshot:s}=i,a=this.createViewTransition?.(this.environmentInjector,r.root,s.root);return a?xo(a).pipe(aA(()=>i)):dA(i)}),aA(r=>{let s=Cve(e.routeReuseStrategy,r.targetSnapshot,r.currentRouterState);return this.currentTransition=i=_A(ae({},r),{targetRouterState:s}),this.currentNavigation.targetRouterState=s,i}),Pt(()=>{this.events.next(new Qm)}),Bve(this.rootContexts,e.routeReuseStrategy,r=>this.events.next(r),this.inputBindingEnabled),Pn(1),Pt({next:r=>{n=!0,this.lastSuccessfulNavigation=this.currentNavigation,this.events.next(new ul(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects))),this.titleStrategy?.updateTitle(r.targetRouterState.snapshot),r.resolve(!0)},complete:()=>{n=!0}}),mt(this.transitionAbortSubject.pipe(Pt(r=>{throw r}))),S0(()=>{!n&&!o&&this.cancelNavigationTransition(i,"",vc.SupersededByNewNavigation),this.currentTransition?.id===i.id&&(this.currentNavigation=null,this.currentTransition=null)}),br(r=>{if(this.destroyed)return i.resolve(!1),vr;if(o=!0,_ee(r))this.events.next(new $0(i.id,this.urlSerializer.serialize(i.extractedUrl),r.message,r.cancellationCode)),hve(r)?this.events.next(new tE(r.url,r.navigationBehaviorOptions)):i.resolve(!1);else{let s=new eE(i.id,this.urlSerializer.serialize(i.extractedUrl),r,i.targetSnapshot??void 0);try{let a=Xr(this.environmentInjector,()=>this.navigationErrorHandler?.(s));if(a instanceof iE){let{message:c,cancellationCode:l}=zy(this.urlSerializer,a);this.events.next(new $0(i.id,this.urlSerializer.serialize(i.extractedUrl),c,l)),this.events.next(new tE(a.redirectTo,a.navigationBehaviorOptions))}else throw this.events.next(s),r}catch(a){this.options.resolveNavigationPromiseOnError?i.resolve(!1):i.reject(a)}}return vr}))}))}cancelNavigationTransition(e,i,n){let o=new $0(e.id,this.urlSerializer.serialize(e.extractedUrl),i,n);this.events.next(o),e.resolve(!1)}isUpdatingInternalState(){return this.currentTransition?.extractedUrl.toString()!==this.currentTransition?.currentUrlTree.toString()}isUpdatedBrowserUrl(){let e=this.urlHandlingStrategy.extract(this.urlSerializer.parse(this.location.path(!0))),i=this.currentNavigation?.targetBrowserUrl??this.currentNavigation?.extractedUrl;return e.toString()!==i?.toString()&&!this.currentNavigation?.extras.skipLocationChange}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function r7e(t){return t!==Sy}var Jee=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:()=>E(s7e),providedIn:"root"})}return t})(),jy=class{shouldDetach(A){return!1}store(A,e){}shouldAttach(A){return!1}retrieve(A){return null}shouldReuseRoute(A,e){return A.routeConfig===e.routeConfig}},s7e=(()=>{class t extends jy{static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),Yee=(()=>{class t{urlSerializer=E(Cu);options=E(uu,{optional:!0})||{};canceledNavigationResolution=this.options.canceledNavigationResolution||"replace";location=E(Fl);urlHandlingStrategy=E(Wy);urlUpdateStrategy=this.options.urlUpdateStrategy||"deferred";currentUrlTree=new ed;getCurrentUrlTree(){return this.currentUrlTree}rawUrlTree=this.currentUrlTree;getRawUrlTree(){return this.rawUrlTree}createBrowserPath({finalUrl:e,initialUrl:i,targetBrowserUrl:n}){let o=e!==void 0?this.urlHandlingStrategy.merge(e,i):i,r=n??o;return r instanceof ed?this.urlSerializer.serialize(r):r}commitTransition({targetRouterState:e,finalUrl:i,initialUrl:n}){i&&e?(this.currentUrlTree=i,this.rawUrlTree=this.urlHandlingStrategy.merge(i,n),this.routerState=e):this.rawUrlTree=n}routerState=vee(null);getRouterState(){return this.routerState}stateMemento=this.createStateMemento();updateStateMemento(){this.stateMemento=this.createStateMemento()}createStateMemento(){return{rawUrlTree:this.rawUrlTree,currentUrlTree:this.currentUrlTree,routerState:this.routerState}}resetInternalState({finalUrl:e}){this.routerState=this.stateMemento.routerState,this.currentUrlTree=this.stateMemento.currentUrlTree,this.rawUrlTree=this.urlHandlingStrategy.merge(this.currentUrlTree,e??this.rawUrlTree)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:()=>E(a7e),providedIn:"root"})}return t})(),a7e=(()=>{class t extends Yee{currentPageId=0;lastSuccessfulId=-1;restoredState(){return this.location.getState()}get browserPageId(){return this.canceledNavigationResolution!=="computed"?this.currentPageId:this.restoredState()?.\u0275routerPageId??this.currentPageId}registerNonRouterCurrentEntryChangeListener(e){return this.location.subscribe(i=>{i.type==="popstate"&&setTimeout(()=>{e(i.url,i.state,"popstate")})})}handleRouterEvent(e,i){e instanceof T1?this.updateStateMemento():e instanceof Ad?this.commitTransition(i):e instanceof fm?this.urlUpdateStrategy==="eager"&&(i.extras.skipLocationChange||this.setBrowserUrl(this.createBrowserPath(i),i)):e instanceof Qm?(this.commitTransition(i),this.urlUpdateStrategy==="deferred"&&!i.extras.skipLocationChange&&this.setBrowserUrl(this.createBrowserPath(i),i)):e instanceof $0&&(e.code===vc.GuardRejected||e.code===vc.NoDataFromResolver)?this.restoreHistory(i):e instanceof eE?this.restoreHistory(i,!0):e instanceof ul&&(this.lastSuccessfulId=e.id,this.currentPageId=this.browserPageId)}setBrowserUrl(e,{extras:i,id:n}){let{replaceUrl:o,state:r}=i;if(this.location.isCurrentPathEqualTo(e)||o){let s=this.browserPageId,a=ae(ae({},r),this.generateNgRouterState(n,s));this.location.replaceState(e,"",a)}else{let s=ae(ae({},r),this.generateNgRouterState(n,this.browserPageId+1));this.location.go(e,"",s)}}restoreHistory(e,i=!1){if(this.canceledNavigationResolution==="computed"){let n=this.browserPageId,o=this.currentPageId-n;o!==0?this.location.historyGo(o):this.getCurrentUrlTree()===e.finalUrl&&o===0&&(this.resetInternalState(e),this.resetUrlToCurrentUrlTree())}else this.canceledNavigationResolution==="replace"&&(i&&this.resetInternalState(e),this.resetUrlToCurrentUrlTree())}resetUrlToCurrentUrlTree(){this.location.replaceState(this.urlSerializer.serialize(this.getRawUrlTree()),"",this.generateNgRouterState(this.lastSuccessfulId,this.currentPageId))}generateNgRouterState(e,i){return this.canceledNavigationResolution==="computed"?{navigationId:e,\u0275routerPageId:i}:{navigationId:e}}static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function Xy(t,A){t.events.pipe($A(e=>e instanceof ul||e instanceof $0||e instanceof eE||e instanceof Ad),aA(e=>e instanceof ul||e instanceof Ad?0:(e instanceof $0?e.code===vc.Redirect||e.code===vc.SupersededByNewNavigation:!1)?2:1),$A(e=>e!==2),Pn(1)).subscribe(()=>{A()})}var c7e={paths:"exact",fragment:"ignored",matrixParams:"ignored",queryParams:"exact"},l7e={paths:"subset",fragment:"ignored",matrixParams:"ignored",queryParams:"subset"},Da=(()=>{class t{get currentUrlTree(){return this.stateManager.getCurrentUrlTree()}get rawUrlTree(){return this.stateManager.getRawUrlTree()}disposed=!1;nonRouterCurrentEntryChangeSubscription;console=E(wR);stateManager=E(Yee);options=E(uu,{optional:!0})||{};pendingTasks=E(t2);urlUpdateStrategy=this.options.urlUpdateStrategy||"deferred";navigationTransitions=E(Zy);urlSerializer=E(Cu);location=E(Fl);urlHandlingStrategy=E(Wy);_events=new je;get events(){return this._events}get routerState(){return this.stateManager.getRouterState()}navigated=!1;routeReuseStrategy=E(Jee);onSameUrlNavigation=this.options.onSameUrlNavigation||"ignore";config=E(rE,{optional:!0})?.flat()??[];componentInputBindingEnabled=!!E(Mm,{optional:!0});constructor(){this.resetConfig(this.config),this.navigationTransitions.setupNavigations(this).subscribe({error:e=>{this.console.warn(e)}}),this.subscribeToNavigationEvents()}eventsSubscription=new Ot;subscribeToNavigationEvents(){let e=this.navigationTransitions.events.subscribe(i=>{try{let n=this.navigationTransitions.currentTransition,o=this.navigationTransitions.currentNavigation;if(n!==null&&o!==null){if(this.stateManager.handleRouterEvent(i,o),i instanceof $0&&i.code!==vc.Redirect&&i.code!==vc.SupersededByNewNavigation)this.navigated=!0;else if(i instanceof ul)this.navigated=!0;else if(i instanceof tE){let r=i.navigationBehaviorOptions,s=this.urlHandlingStrategy.merge(i.url,n.currentRawUrl),a=ae({browserUrl:n.extras.browserUrl,info:n.extras.info,skipLocationChange:n.extras.skipLocationChange,replaceUrl:n.extras.replaceUrl||this.urlUpdateStrategy==="eager"||r7e(n.source)},r);this.scheduleNavigation(s,Sy,null,a,{resolve:n.resolve,reject:n.reject,promise:n.promise})}}d7e(i)&&this._events.next(i)}catch(n){this.navigationTransitions.transitionAbortSubject.next(n)}});this.eventsSubscription.add(e)}resetRootComponentType(e){this.routerState.root.component=e,this.navigationTransitions.rootComponentType=e}initialNavigation(){this.setUpLocationChangeListener(),this.navigationTransitions.hasRequestedNavigation||this.navigateToSyncWithBrowser(this.location.path(!0),Sy,this.stateManager.restoredState())}setUpLocationChangeListener(){this.nonRouterCurrentEntryChangeSubscription??=this.stateManager.registerNonRouterCurrentEntryChangeListener((e,i,n)=>{this.navigateToSyncWithBrowser(e,n,i)})}navigateToSyncWithBrowser(e,i,n){let o={replaceUrl:!0},r=n?.navigationId?n:null;if(n){let a=ae({},n);delete a.navigationId,delete a.\u0275routerPageId,Object.keys(a).length!==0&&(o.state=a)}let s=this.parseUrl(e);this.scheduleNavigation(s,i,r,o)}get url(){return this.serializeUrl(this.currentUrlTree)}getCurrentNavigation(){return this.navigationTransitions.currentNavigation}get lastSuccessfulNavigation(){return this.navigationTransitions.lastSuccessfulNavigation}resetConfig(e){this.config=e.map(aF),this.navigated=!1}ngOnDestroy(){this.dispose()}dispose(){this._events.unsubscribe(),this.navigationTransitions.complete(),this.nonRouterCurrentEntryChangeSubscription&&(this.nonRouterCurrentEntryChangeSubscription.unsubscribe(),this.nonRouterCurrentEntryChangeSubscription=void 0),this.disposed=!0,this.eventsSubscription.unsubscribe()}createUrlTree(e,i={}){let{relativeTo:n,queryParams:o,fragment:r,queryParamsHandling:s,preserveFragment:a}=i,c=a?this.currentUrlTree.fragment:r,l=null;switch(s??this.options.defaultQueryParamsHandling){case"merge":l=ae(ae({},this.currentUrlTree.queryParams),o);break;case"preserve":l=this.currentUrlTree.queryParams;break;default:l=o||null}l!==null&&(l=this.removeEmptyProps(l));let d;try{let C=n?n.snapshot:this.routerState.snapshot.root;d=pee(C)}catch{(typeof e[0]!="string"||e[0][0]!=="/")&&(e=[]),d=this.currentUrlTree.root}return wee(d,e,l,c??null)}navigateByUrl(e,i={skipLocationChange:!1}){let n=XB(e)?e:this.parseUrl(e),o=this.urlHandlingStrategy.merge(n,this.rawUrlTree);return this.scheduleNavigation(o,Sy,null,i)}navigate(e,i={skipLocationChange:!1}){return g7e(e),this.navigateByUrl(this.createUrlTree(e,i),i)}serializeUrl(e){return this.urlSerializer.serialize(e)}parseUrl(e){try{return this.urlSerializer.parse(e)}catch{return this.urlSerializer.parse("/")}}isActive(e,i){let n;if(i===!0?n=ae({},c7e):i===!1?n=ae({},l7e):n=i,XB(e))return iee(this.currentUrlTree,e,n);let o=this.parseUrl(e);return iee(this.currentUrlTree,o,n)}removeEmptyProps(e){return Object.entries(e).reduce((i,[n,o])=>(o!=null&&(i[n]=o),i),{})}scheduleNavigation(e,i,n,o,r){if(this.disposed)return Promise.resolve(!1);let s,a,c;r?(s=r.resolve,a=r.reject,c=r.promise):c=new Promise((d,C)=>{s=d,a=C});let l=this.pendingTasks.add();return Xy(this,()=>{queueMicrotask(()=>this.pendingTasks.remove(l))}),this.navigationTransitions.handleNavigationRequest({source:i,restoredState:n,currentUrlTree:this.currentUrlTree,currentRawUrl:this.currentUrlTree,rawUrl:e,extras:o,resolve:s,reject:a,promise:c,currentSnapshot:this.routerState.snapshot,currentRouterState:this.routerState}),c.catch(d=>Promise.reject(d))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function g7e(t){for(let A=0;A{class t{router;injector;preloadingStrategy;loader;subscription;constructor(e,i,n,o){this.router=e,this.injector=i,this.preloadingStrategy=n,this.loader=o}setUpPreloading(){this.subscription=this.router.events.pipe($A(e=>e instanceof ul),M0(()=>this.preload())).subscribe(()=>{})}preload(){return this.processRoutes(this.injector,this.router.config)}ngOnDestroy(){this.subscription&&this.subscription.unsubscribe()}processRoutes(e,i){let n=[];for(let o of i){o.providers&&!o._injector&&(o._injector=y4(o.providers,e,`Route: ${o.path}`));let r=o._injector??e,s=o._loadedInjector??r;(o.loadChildren&&!o._loadedRoutes&&o.canLoad===void 0||o.loadComponent&&!o._loadedComponent)&&n.push(this.preloadConfig(r,o)),(o.children||o._loadedRoutes)&&n.push(this.processRoutes(s,o.children??o._loadedRoutes))}return xo(n).pipe(u1())}preloadConfig(e,i){return this.preloadingStrategy.preload(i,()=>{let n;i.loadChildren&&i.canLoad===void 0?n=this.loader.loadChildren(e,i):n=dA(null);let o=n.pipe(Lr(r=>r===null?dA(void 0):(i._loadedRoutes=r.routes,i._loadedInjector=r.injector,this.processRoutes(r.injector??e,r.routes))));if(i.loadComponent&&!i._loadedComponent){let r=this.loader.loadComponent(i);return xo([o,r]).pipe(u1())}else return o})}static \u0275fac=function(i){return new(i||t)(UA(Da),UA(Hr),UA(km),UA(qy))};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),zee=new re(""),C7e=(()=>{class t{urlSerializer;transitions;viewportScroller;zone;options;routerEventsSubscription;scrollEventsSubscription;lastId=0;lastSource="imperative";restoredId=0;store={};constructor(e,i,n,o,r={}){this.urlSerializer=e,this.transitions=i,this.viewportScroller=n,this.zone=o,this.options=r,r.scrollPositionRestoration||="disabled",r.anchorScrolling||="disabled"}init(){this.options.scrollPositionRestoration!=="disabled"&&this.viewportScroller.setHistoryScrollRestoration("manual"),this.routerEventsSubscription=this.createScrollEvents(),this.scrollEventsSubscription=this.consumeScrollEvents()}createScrollEvents(){return this.transitions.events.subscribe(e=>{e instanceof T1?(this.store[this.lastId]=this.viewportScroller.getScrollPosition(),this.lastSource=e.navigationTrigger,this.restoredId=e.restoredState?e.restoredState.navigationId:0):e instanceof ul?(this.lastId=e.id,this.scheduleScrollEvent(e,this.urlSerializer.parse(e.urlAfterRedirects).fragment)):e instanceof Ad&&e.code===$B.IgnoredSameUrlNavigation&&(this.lastSource=void 0,this.restoredId=0,this.scheduleScrollEvent(e,this.urlSerializer.parse(e.url).fragment))})}consumeScrollEvents(){return this.transitions.events.subscribe(e=>{e instanceof AE&&(e.position?this.options.scrollPositionRestoration==="top"?this.viewportScroller.scrollToPosition([0,0]):this.options.scrollPositionRestoration==="enabled"&&this.viewportScroller.scrollToPosition(e.position):e.anchor&&this.options.anchorScrolling==="enabled"?this.viewportScroller.scrollToAnchor(e.anchor):this.options.scrollPositionRestoration!=="disabled"&&this.viewportScroller.scrollToPosition([0,0]))})}scheduleScrollEvent(e,i){this.zone.runOutsideAngular(()=>{setTimeout(()=>{this.zone.run(()=>{this.transitions.events.next(new AE(e,this.lastSource==="popstate"?this.store[this.restoredId]:null,i))})},0)})}ngOnDestroy(){this.routerEventsSubscription?.unsubscribe(),this.scrollEventsSubscription?.unsubscribe()}static \u0275fac=function(i){Uq()};static \u0275prov=be({token:t,factory:t.\u0275fac})}return t})();function I7e(t){return t.routerState.root}function xm(t,A){return{\u0275kind:t,\u0275providers:A}}function u7e(){let t=E(Dt);return A=>{let e=t.get(fc);if(A!==e.components[0])return;let i=t.get(Da),n=t.get(Pee);t.get(IF)===1&&i.initialNavigation(),t.get(qee,null,ji.Optional)?.setUpPreloading(),t.get(zee,null,ji.Optional)?.init(),i.resetRootComponentType(e.componentTypes[0]),n.closed||(n.next(),n.complete(),n.unsubscribe())}}var Pee=new re("",{factory:()=>new je}),IF=new re("",{providedIn:"root",factory:()=>1});function jee(){let t=[{provide:IF,useValue:0},bR(()=>{let A=E(Dt);return A.get(FR,Promise.resolve()).then(()=>new Promise(i=>{let n=A.get(Da),o=A.get(Pee);Xy(n,()=>{i(!0)}),A.get(Zy).afterPreactivation=()=>(i(!0),o.closed?dA(void 0):o),n.initialNavigation()}))})];return xm(2,t)}function Vee(){let t=[bR(()=>{E(Da).setUpLocationChangeListener()}),{provide:IF,useValue:2}];return xm(3,t)}var qee=new re("");function Wee(t){return xm(0,[{provide:qee,useExisting:Hee},{provide:km,useExisting:t}])}function Zee(){return xm(8,[rF,{provide:Mm,useExisting:rF}])}function Xee(t){Dg("NgRouterViewTransitions");let A=[{provide:lF,useValue:Oee},{provide:gF,useValue:ae({skipNextTransition:!!t?.skipInitialTransition},t)}];return xm(9,A)}var $ee=[Fl,{provide:Cu,useClass:U1},Da,Iu,{provide:Tl,useFactory:I7e,deps:[Da]},qy,[]],$y=(()=>{class t{constructor(){}static forRoot(e,i){return{ngModule:t,providers:[$ee,[],{provide:rE,multi:!0,useValue:e},[],i?.errorHandler?{provide:dF,useValue:i.errorHandler}:[],{provide:uu,useValue:i||{}},i?.useHash?B7e():E7e(),h7e(),i?.preloadingStrategy?Wee(i.preloadingStrategy).\u0275providers:[],i?.initialNavigation?f7e(i):[],i?.bindToComponentInputs?Zee().\u0275providers:[],i?.enableViewTransitions?Xee().\u0275providers:[],Q7e()]}}static forChild(e){return{ngModule:t,providers:[{provide:rE,multi:!0,useValue:e}]}}static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({})}return t})();function h7e(){return{provide:zee,useFactory:()=>{let t=E(PW),A=E(yA),e=E(uu),i=E(Zy),n=E(Cu);return e.scrollOffset&&t.setOffset(e.scrollOffset),new C7e(n,i,t,A,e)}}}function B7e(){return{provide:c2,useClass:TR}}function E7e(){return{provide:c2,useClass:Xw}}function f7e(t){return[t.initialNavigation==="disabled"?Vee().\u0275providers:[],t.initialNavigation==="enabledBlocking"?jee().\u0275providers:[]]}var CF=new re("");function Q7e(){return[{provide:CF,useFactory:u7e},{provide:MR,multi:!0,useExisting:CF}]}function va(t){t||(e2(va),t=E(Fr));let A=new nt(e=>t.onDestroy(e.next.bind(e)));return e=>e.pipe(mt(A))}var uF=class{source;destroyed=!1;destroyRef=E(Fr);constructor(A){this.source=A,this.destroyRef.onDestroy(()=>{this.destroyed=!0})}subscribe(A){if(this.destroyed)throw new lA(953,!1);let e=this.source.pipe(va(this.destroyRef)).subscribe({next:i=>A(i)});return{unsubscribe:()=>e.unsubscribe()}}};function Xn(t,A){return new uF(t)}function vo(t,A){!A?.injector&&e2(vo);let e=A?.injector??E(Dt),i=new Zc(1),n=pa(()=>{let o;try{o=t()}catch(r){As(()=>i.error(r));return}As(()=>i.next(o))},{injector:e,manualCleanup:!0});return e.get(Fr).onDestroy(()=>{n.destroy(),i.complete()}),i.asObservable()}function _g(t,A){let e=!A?.manualCleanup;e&&!A?.injector&&e2(_g);let i=e?A?.injector?.get(Fr)??E(Fr):null,n=w7e(A?.equal),o;A?.requireSync?o=mA({kind:0},{equal:n}):o=mA({kind:1,value:A?.initialValue},{equal:n});let r,s=t.subscribe({next:a=>o.set({kind:1,value:a}),error:a=>{if(A?.rejectErrors)throw a;o.set({kind:2,error:a})},complete:()=>{r?.()}});if(A?.requireSync&&o().kind===0)throw new lA(601,!1);return r=i?.onDestroy(s.unsubscribe.bind(s)),ot(()=>{let a=o();switch(a.kind){case 1:return a.value;case 2:throw a.error;case 0:throw new lA(601,!1)}},{equal:A?.equal})}function w7e(t=Object.is){return(A,e)=>A.kind===1&&e.kind===1&&t(A.value,e.value)}var y7e=["*"];var D7e=new re("MAT_CARD_CONFIG"),sE=(()=>{class t{appearance;constructor(){let e=E(D7e,{optional:!0});this.appearance=e?.appearance||"raised"}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-card"]],hostAttrs:[1,"mat-mdc-card","mdc-card"],hostVars:4,hostBindings:function(i,n){i&2&&iA("mat-mdc-card-outlined",n.appearance==="outlined")("mdc-card--outlined",n.appearance==="outlined")},inputs:{appearance:"appearance"},exportAs:["matCard"],ngContentSelectors:y7e,decls:1,vars:0,template:function(i,n){i&1&&(Kt(),NA(0))},styles:['.mat-mdc-card{display:flex;flex-direction:column;box-sizing:border-box;position:relative;border-style:solid;border-width:0;background-color:var(--mdc-elevated-card-container-color, var(--mat-sys-surface-container-low));border-color:var(--mdc-elevated-card-container-color, var(--mat-sys-surface-container-low));border-radius:var(--mdc-elevated-card-container-shape, var(--mat-sys-corner-medium));box-shadow:var(--mdc-elevated-card-container-elevation, var(--mat-sys-level1))}.mat-mdc-card::after{position:absolute;top:0;left:0;width:100%;height:100%;border:solid 1px rgba(0,0,0,0);content:"";display:block;pointer-events:none;box-sizing:border-box;border-radius:var(--mdc-elevated-card-container-shape, var(--mat-sys-corner-medium))}.mat-mdc-card-outlined{background-color:var(--mdc-outlined-card-container-color, var(--mat-sys-surface));border-radius:var(--mdc-outlined-card-container-shape, var(--mat-sys-corner-medium));border-width:var(--mdc-outlined-card-outline-width, 1px);border-color:var(--mdc-outlined-card-outline-color, var(--mat-sys-outline-variant));box-shadow:var(--mdc-outlined-card-container-elevation, var(--mat-sys-level0))}.mat-mdc-card-outlined::after{border:none}.mdc-card__media{position:relative;box-sizing:border-box;background-repeat:no-repeat;background-position:center;background-size:cover}.mdc-card__media::before{display:block;content:""}.mdc-card__media:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.mdc-card__media:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.mat-mdc-card-actions{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;min-height:52px;padding:8px}.mat-mdc-card-title{font-family:var(--mat-card-title-text-font, var(--mat-sys-title-large-font));line-height:var(--mat-card-title-text-line-height, var(--mat-sys-title-large-line-height));font-size:var(--mat-card-title-text-size, var(--mat-sys-title-large-size));letter-spacing:var(--mat-card-title-text-tracking, var(--mat-sys-title-large-tracking));font-weight:var(--mat-card-title-text-weight, var(--mat-sys-title-large-weight))}.mat-mdc-card-subtitle{color:var(--mat-card-subtitle-text-color, var(--mat-sys-on-surface));font-family:var(--mat-card-subtitle-text-font, var(--mat-sys-title-medium-font));line-height:var(--mat-card-subtitle-text-line-height, var(--mat-sys-title-medium-line-height));font-size:var(--mat-card-subtitle-text-size, var(--mat-sys-title-medium-size));letter-spacing:var(--mat-card-subtitle-text-tracking, var(--mat-sys-title-medium-tracking));font-weight:var(--mat-card-subtitle-text-weight, var(--mat-sys-title-medium-weight))}.mat-mdc-card-title,.mat-mdc-card-subtitle{display:block;margin:0}.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-title,.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-subtitle{padding:16px 16px 0}.mat-mdc-card-header{display:flex;padding:16px 16px 0}.mat-mdc-card-content{display:block;padding:0 16px}.mat-mdc-card-content:first-child{padding-top:16px}.mat-mdc-card-content:last-child{padding-bottom:16px}.mat-mdc-card-title-group{display:flex;justify-content:space-between;width:100%}.mat-mdc-card-avatar{height:40px;width:40px;border-radius:50%;flex-shrink:0;margin-bottom:16px;object-fit:cover}.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-subtitle,.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-title{line-height:normal}.mat-mdc-card-sm-image{width:80px;height:80px}.mat-mdc-card-md-image{width:112px;height:112px}.mat-mdc-card-lg-image{width:152px;height:152px}.mat-mdc-card-xl-image{width:240px;height:240px}.mat-mdc-card-subtitle~.mat-mdc-card-title,.mat-mdc-card-title~.mat-mdc-card-subtitle,.mat-mdc-card-header .mat-mdc-card-header-text .mat-mdc-card-title,.mat-mdc-card-header .mat-mdc-card-header-text .mat-mdc-card-subtitle,.mat-mdc-card-title-group .mat-mdc-card-title,.mat-mdc-card-title-group .mat-mdc-card-subtitle{padding-top:0}.mat-mdc-card-content>:last-child:not(.mat-mdc-card-footer){margin-bottom:0}.mat-mdc-card-actions-align-end{justify-content:flex-end}'],encapsulation:2,changeDetection:0})}return t})();var eAe=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({imports:[ui,ui]})}return t})();var eD=class{};function AD(t){return t&&typeof t.connect=="function"&&!(t instanceof g1)}var aE=function(t){return t[t.REPLACED=0]="REPLACED",t[t.INSERTED=1]="INSERTED",t[t.MOVED=2]="MOVED",t[t.REMOVED=3]="REMOVED",t}(aE||{}),_m=new re("_ViewRepeater"),cE=class{applyChanges(A,e,i,n,o){A.forEachOperation((r,s,a)=>{let c,l;if(r.previousIndex==null){let d=i(r,s,a);c=e.createEmbeddedView(d.templateRef,d.context,d.index),l=aE.INSERTED}else a==null?(e.remove(s),l=aE.REMOVED):(c=e.get(s),e.move(c,a),l=aE.MOVED);o&&o({context:c?.context,operation:l,record:r})})}detach(){}};var J1=class{_multiple;_emitChanges;compareWith;_selection=new Set;_deselectedToEmit=[];_selectedToEmit=[];_selected;get selected(){return this._selected||(this._selected=Array.from(this._selection.values())),this._selected}changed=new je;constructor(A=!1,e,i=!0,n){this._multiple=A,this._emitChanges=i,this.compareWith=n,e&&e.length&&(A?e.forEach(o=>this._markSelected(o)):this._markSelected(e[0]),this._selectedToEmit.length=0)}select(...A){this._verifyValueAssignment(A),A.forEach(i=>this._markSelected(i));let e=this._hasQueuedChanges();return this._emitChangeEvent(),e}deselect(...A){this._verifyValueAssignment(A),A.forEach(i=>this._unmarkSelected(i));let e=this._hasQueuedChanges();return this._emitChangeEvent(),e}setSelection(...A){this._verifyValueAssignment(A);let e=this.selected,i=new Set(A);A.forEach(o=>this._markSelected(o)),e.filter(o=>!i.has(this._getConcreteValue(o,i))).forEach(o=>this._unmarkSelected(o));let n=this._hasQueuedChanges();return this._emitChangeEvent(),n}toggle(A){return this.isSelected(A)?this.deselect(A):this.select(A)}clear(A=!0){this._unmarkAll();let e=this._hasQueuedChanges();return A&&this._emitChangeEvent(),e}isSelected(A){return this._selection.has(this._getConcreteValue(A))}isEmpty(){return this._selection.size===0}hasValue(){return!this.isEmpty()}sort(A){this._multiple&&this.selected&&this._selected.sort(A)}isMultipleSelection(){return this._multiple}_emitChangeEvent(){this._selected=null,(this._selectedToEmit.length||this._deselectedToEmit.length)&&(this.changed.next({source:this,added:this._selectedToEmit,removed:this._deselectedToEmit}),this._deselectedToEmit=[],this._selectedToEmit=[])}_markSelected(A){A=this._getConcreteValue(A),this.isSelected(A)||(this._multiple||this._unmarkAll(),this.isSelected(A)||this._selection.add(A),this._emitChanges&&this._selectedToEmit.push(A))}_unmarkSelected(A){A=this._getConcreteValue(A),this.isSelected(A)&&(this._selection.delete(A),this._emitChanges&&this._deselectedToEmit.push(A))}_unmarkAll(){this.isEmpty()||this._selection.forEach(A=>this._unmarkSelected(A))}_verifyValueAssignment(A){A.length>1&&this._multiple}_hasQueuedChanges(){return!!(this._deselectedToEmit.length||this._selectedToEmit.length)}_getConcreteValue(A,e){if(this.compareWith){e=e??this._selection;for(let i of e)if(this.compareWith(A,i))return i;return A}else return A}};var tD=(()=>{class t{_listeners=[];notify(e,i){for(let n of this._listeners)n(e,i)}listen(e){return this._listeners.push(e),()=>{this._listeners=this._listeners.filter(i=>e!==i)}}ngOnDestroy(){this._listeners=[]}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var b7e=20,Y1=(()=>{class t{_ngZone=E(yA);_platform=E(mi);_renderer=E(fa).createRenderer(null,null);_cleanupGlobalListener;constructor(){}_scrolled=new je;_scrolledCount=0;scrollContainers=new Map;register(e){this.scrollContainers.has(e)||this.scrollContainers.set(e,e.elementScrolled().subscribe(()=>this._scrolled.next(e)))}deregister(e){let i=this.scrollContainers.get(e);i&&(i.unsubscribe(),this.scrollContainers.delete(e))}scrolled(e=b7e){return this._platform.isBrowser?new nt(i=>{this._cleanupGlobalListener||(this._cleanupGlobalListener=this._ngZone.runOutsideAngular(()=>this._renderer.listen("document","scroll",()=>this._scrolled.next())));let n=e>0?this._scrolled.pipe(Ph(e)).subscribe(i):this._scrolled.subscribe(i);return this._scrolledCount++,()=>{n.unsubscribe(),this._scrolledCount--,this._scrolledCount||(this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0)}}):dA()}ngOnDestroy(){this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0,this.scrollContainers.forEach((e,i)=>this.deregister(i)),this._scrolled.complete()}ancestorScrolled(e,i){let n=this.getAncestorScrollContainers(e);return this.scrolled(i).pipe($A(o=>!o||n.indexOf(o)>-1))}getAncestorScrollContainers(e){let i=[];return this.scrollContainers.forEach((n,o)=>{this._scrollableContainsElement(o,e)&&i.push(o)}),i}_scrollableContainsElement(e,i){let n=wc(i),o=e.getElementRef().nativeElement;do if(n==o)return!0;while(n=n.parentElement);return!1}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),f2=(()=>{class t{elementRef=E(eA);scrollDispatcher=E(Y1);ngZone=E(yA);dir=E(Do,{optional:!0});_scrollElement=this.elementRef.nativeElement;_destroyed=new je;_renderer=E(an);_cleanupScroll;_elementScrolled=new je;constructor(){}ngOnInit(){this._cleanupScroll=this.ngZone.runOutsideAngular(()=>this._renderer.listen(this._scrollElement,"scroll",e=>this._elementScrolled.next(e))),this.scrollDispatcher.register(this)}ngOnDestroy(){this._cleanupScroll?.(),this._elementScrolled.complete(),this.scrollDispatcher.deregister(this),this._destroyed.next(),this._destroyed.complete()}elementScrolled(){return this._elementScrolled}getElementRef(){return this.elementRef}scrollTo(e){let i=this.elementRef.nativeElement,n=this.dir&&this.dir.value=="rtl";e.left==null&&(e.left=n?e.end:e.start),e.right==null&&(e.right=n?e.start:e.end),e.bottom!=null&&(e.top=i.scrollHeight-i.clientHeight-e.bottom),n&&LB()!=Mg.NORMAL?(e.left!=null&&(e.right=i.scrollWidth-i.clientWidth-e.left),LB()==Mg.INVERTED?e.left=e.right:LB()==Mg.NEGATED&&(e.left=e.right?-e.right:e.right)):e.right!=null&&(e.left=i.scrollWidth-i.clientWidth-e.right),this._applyScrollToOptions(e)}_applyScrollToOptions(e){let i=this.elementRef.nativeElement;p5()?i.scrollTo(e):(e.top!=null&&(i.scrollTop=e.top),e.left!=null&&(i.scrollLeft=e.left))}measureScrollOffset(e){let i="left",n="right",o=this.elementRef.nativeElement;if(e=="top")return o.scrollTop;if(e=="bottom")return o.scrollHeight-o.clientHeight-o.scrollTop;let r=this.dir&&this.dir.value=="rtl";return e=="start"?e=r?n:i:e=="end"&&(e=r?i:n),r&&LB()==Mg.INVERTED?e==i?o.scrollWidth-o.clientWidth-o.scrollLeft:o.scrollLeft:r&&LB()==Mg.NEGATED?e==i?o.scrollLeft+o.scrollWidth-o.clientWidth:-o.scrollLeft:e==i?o.scrollLeft:o.scrollWidth-o.clientWidth-o.scrollLeft}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","cdk-scrollable",""],["","cdkScrollable",""]]})}return t})(),M7e=20,Ol=(()=>{class t{_platform=E(mi);_listeners;_viewportSize;_change=new je;_document=E(ht,{optional:!0});constructor(){let e=E(yA),i=E(fa).createRenderer(null,null);e.runOutsideAngular(()=>{if(this._platform.isBrowser){let n=o=>this._change.next(o);this._listeners=[i.listen("window","resize",n),i.listen("window","orientationchange",n)]}this.change().subscribe(()=>this._viewportSize=null)})}ngOnDestroy(){this._listeners?.forEach(e=>e()),this._change.complete()}getViewportSize(){this._viewportSize||this._updateViewportSize();let e={width:this._viewportSize.width,height:this._viewportSize.height};return this._platform.isBrowser||(this._viewportSize=null),e}getViewportRect(){let e=this.getViewportScrollPosition(),{width:i,height:n}=this.getViewportSize();return{top:e.top,left:e.left,bottom:e.top+n,right:e.left+i,height:n,width:i}}getViewportScrollPosition(){if(!this._platform.isBrowser)return{top:0,left:0};let e=this._document,i=this._getWindow(),n=e.documentElement,o=n.getBoundingClientRect(),r=-o.top||e.body.scrollTop||i.scrollY||n.scrollTop||0,s=-o.left||e.body.scrollLeft||i.scrollX||n.scrollLeft||0;return{top:r,left:s}}change(e=M7e){return e>0?this._change.pipe(Ph(e)):this._change}_getWindow(){return this._document.defaultView||window}_updateViewportSize(){let e=this._getWindow();this._viewportSize=this._platform.isBrowser?{width:e.innerWidth,height:e.innerHeight}:{width:0,height:0}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var E2=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({})}return t})(),iD=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({imports:[N1,E2,N1,E2]})}return t})();var Rm=class{_attachedHost;attach(A){return this._attachedHost=A,A.attach(this)}detach(){let A=this._attachedHost;A!=null&&(this._attachedHost=null,A.detach())}get isAttached(){return this._attachedHost!=null}setAttachedHost(A){this._attachedHost=A}},Rg=class extends Rm{component;viewContainerRef;injector;componentFactoryResolver;projectableNodes;constructor(A,e,i,n,o){super(),this.component=A,this.viewContainerRef=e,this.injector=i,this.projectableNodes=o}},ba=class extends Rm{templateRef;viewContainerRef;context;injector;constructor(A,e,i,n){super(),this.templateRef=A,this.viewContainerRef=e,this.context=i,this.injector=n}get origin(){return this.templateRef.elementRef}attach(A,e=this.context){return this.context=e,super.attach(A)}detach(){return this.context=void 0,super.detach()}},hF=class extends Rm{element;constructor(A){super(),this.element=A instanceof eA?A.nativeElement:A}},H1=class{_attachedPortal;_disposeFn;_isDisposed=!1;hasAttached(){return!!this._attachedPortal}attach(A){if(A instanceof Rg)return this._attachedPortal=A,this.attachComponentPortal(A);if(A instanceof ba)return this._attachedPortal=A,this.attachTemplatePortal(A);if(this.attachDomPortal&&A instanceof hF)return this._attachedPortal=A,this.attachDomPortal(A)}attachDomPortal=null;detach(){this._attachedPortal&&(this._attachedPortal.setAttachedHost(null),this._attachedPortal=null),this._invokeDisposeFn()}dispose(){this.hasAttached()&&this.detach(),this._invokeDisposeFn(),this._isDisposed=!0}setDisposeFn(A){this._disposeFn=A}_invokeDisposeFn(){this._disposeFn&&(this._disposeFn(),this._disposeFn=null)}};var Nm=class extends H1{outletElement;_appRef;_defaultInjector;_document;constructor(A,e,i,n,o){super(),this.outletElement=A,this._appRef=i,this._defaultInjector=n,this._document=o}attachComponentPortal(A){let e;if(A.viewContainerRef){let i=A.injector||A.viewContainerRef.injector,n=i.get(G0,null,{optional:!0})||void 0;e=A.viewContainerRef.createComponent(A.component,{index:A.viewContainerRef.length,injector:i,ngModuleRef:n,projectableNodes:A.projectableNodes||void 0}),this.setDisposeFn(()=>e.destroy())}else e=qw(A.component,{elementInjector:A.injector||this._defaultInjector||Dt.NULL,environmentInjector:this._appRef.injector,projectableNodes:A.projectableNodes||void 0}),this._appRef.attachView(e.hostView),this.setDisposeFn(()=>{this._appRef.viewCount>0&&this._appRef.detachView(e.hostView),e.destroy()});return this.outletElement.appendChild(this._getComponentRootNode(e)),this._attachedPortal=A,e}attachTemplatePortal(A){let e=A.viewContainerRef,i=e.createEmbeddedView(A.templateRef,A.context,{injector:A.injector});return i.rootNodes.forEach(n=>this.outletElement.appendChild(n)),i.detectChanges(),this.setDisposeFn(()=>{let n=e.indexOf(i);n!==-1&&e.remove(n)}),this._attachedPortal=A,i}attachDomPortal=A=>{let e=A.element;e.parentNode;let i=this._document.createComment("dom-portal");e.parentNode.insertBefore(i,e),this.outletElement.appendChild(e),this._attachedPortal=A,super.setDisposeFn(()=>{i.parentNode&&i.parentNode.replaceChild(e,i)})};dispose(){super.dispose(),this.outletElement.remove()}_getComponentRootNode(A){return A.hostView.rootNodes[0]}};var AAe=(()=>{class t extends ba{constructor(){let e=E(en),i=E(xn);super(e,i)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","cdkPortal",""]],exportAs:["cdkPortal"],features:[Ct]})}return t})();var bc=(()=>{class t extends H1{_moduleRef=E(G0,{optional:!0});_document=E(ht);_viewContainerRef=E(xn);_isInitialized=!1;_attachedRef;constructor(){super()}get portal(){return this._attachedPortal}set portal(e){this.hasAttached()&&!e&&!this._isInitialized||(this.hasAttached()&&super.detach(),e&&super.attach(e),this._attachedPortal=e||null)}attached=new Ve;get attachedRef(){return this._attachedRef}ngOnInit(){this._isInitialized=!0}ngOnDestroy(){super.dispose(),this._attachedRef=this._attachedPortal=null}attachComponentPortal(e){e.setAttachedHost(this);let i=e.viewContainerRef!=null?e.viewContainerRef:this._viewContainerRef,n=i.createComponent(e.component,{index:i.length,injector:e.injector||i.injector,projectableNodes:e.projectableNodes||void 0,ngModuleRef:this._moduleRef||void 0});return i!==this._viewContainerRef&&this._getRootNode().appendChild(n.hostView.rootNodes[0]),super.setDisposeFn(()=>n.destroy()),this._attachedPortal=e,this._attachedRef=n,this.attached.emit(n),n}attachTemplatePortal(e){e.setAttachedHost(this);let i=this._viewContainerRef.createEmbeddedView(e.templateRef,e.context,{injector:e.injector});return super.setDisposeFn(()=>this._viewContainerRef.clear()),this._attachedPortal=e,this._attachedRef=i,this.attached.emit(i),i}attachDomPortal=e=>{let i=e.element;i.parentNode;let n=this._document.createComment("dom-portal");e.setAttachedHost(this),i.parentNode.insertBefore(n,i),this._getRootNode().appendChild(i),this._attachedPortal=e,super.setDisposeFn(()=>{n.parentNode&&n.parentNode.replaceChild(i,n)})};_getRootNode(){let e=this._viewContainerRef.element.nativeElement;return e.nodeType===e.ELEMENT_NODE?e:e.parentNode}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","cdkPortalOutlet",""]],inputs:{portal:[0,"cdkPortalOutlet","portal"]},outputs:{attached:"attached"},exportAs:["cdkPortalOutlet"],features:[Ct]})}return t})();var td=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({})}return t})();var tAe=p5(),BF=class{_viewportRuler;_previousHTMLStyles={top:"",left:""};_previousScrollPosition;_isEnabled=!1;_document;constructor(A,e){this._viewportRuler=A,this._document=e}attach(){}enable(){if(this._canBeEnabled()){let A=this._document.documentElement;this._previousScrollPosition=this._viewportRuler.getViewportScrollPosition(),this._previousHTMLStyles.left=A.style.left||"",this._previousHTMLStyles.top=A.style.top||"",A.style.left=is(-this._previousScrollPosition.left),A.style.top=is(-this._previousScrollPosition.top),A.classList.add("cdk-global-scrollblock"),this._isEnabled=!0}}disable(){if(this._isEnabled){let A=this._document.documentElement,e=this._document.body,i=A.style,n=e.style,o=i.scrollBehavior||"",r=n.scrollBehavior||"";this._isEnabled=!1,i.left=this._previousHTMLStyles.left,i.top=this._previousHTMLStyles.top,A.classList.remove("cdk-global-scrollblock"),tAe&&(i.scrollBehavior=n.scrollBehavior="auto"),window.scroll(this._previousScrollPosition.left,this._previousScrollPosition.top),tAe&&(i.scrollBehavior=o,n.scrollBehavior=r)}}_canBeEnabled(){if(this._document.documentElement.classList.contains("cdk-global-scrollblock")||this._isEnabled)return!1;let e=this._document.body,i=this._viewportRuler.getViewportSize();return e.scrollHeight>i.height||e.scrollWidth>i.width}};var EF=class{_scrollDispatcher;_ngZone;_viewportRuler;_config;_scrollSubscription=null;_overlayRef;_initialScrollPosition;constructor(A,e,i,n){this._scrollDispatcher=A,this._ngZone=e,this._viewportRuler=i,this._config=n}attach(A){this._overlayRef,this._overlayRef=A}enable(){if(this._scrollSubscription)return;let A=this._scrollDispatcher.scrolled(0).pipe($A(e=>!e||!this._overlayRef.overlayElement.contains(e.getElementRef().nativeElement)));this._config&&this._config.threshold&&this._config.threshold>1?(this._initialScrollPosition=this._viewportRuler.getViewportScrollPosition().top,this._scrollSubscription=A.subscribe(()=>{let e=this._viewportRuler.getViewportScrollPosition().top;Math.abs(e-this._initialScrollPosition)>this._config.threshold?this._detach():this._overlayRef.updatePosition()})):this._scrollSubscription=A.subscribe(this._detach)}disable(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}detach(){this.disable(),this._overlayRef=null}_detach=()=>{this.disable(),this._overlayRef.hasAttached()&&this._ngZone.run(()=>this._overlayRef.detach())}},nD=class{enable(){}disable(){}attach(){}};function fF(t,A){return A.some(e=>{let i=t.bottome.bottom,o=t.righte.right;return i||n||o||r})}function iAe(t,A){return A.some(e=>{let i=t.tope.bottom,o=t.lefte.right;return i||n||o||r})}var QF=class{_scrollDispatcher;_viewportRuler;_ngZone;_config;_scrollSubscription=null;_overlayRef;constructor(A,e,i,n){this._scrollDispatcher=A,this._viewportRuler=e,this._ngZone=i,this._config=n}attach(A){this._overlayRef,this._overlayRef=A}enable(){if(!this._scrollSubscription){let A=this._config?this._config.scrollThrottle:0;this._scrollSubscription=this._scrollDispatcher.scrolled(A).subscribe(()=>{if(this._overlayRef.updatePosition(),this._config&&this._config.autoClose){let e=this._overlayRef.overlayElement.getBoundingClientRect(),{width:i,height:n}=this._viewportRuler.getViewportSize();fF(e,[{width:i,height:n,bottom:n,right:i,top:0,left:0}])&&(this.disable(),this._ngZone.run(()=>this._overlayRef.detach()))}})}}disable(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}detach(){this.disable(),this._overlayRef=null}},k7e=(()=>{class t{_scrollDispatcher=E(Y1);_viewportRuler=E(Ol);_ngZone=E(yA);_document=E(ht);constructor(){}noop=()=>new nD;close=e=>new EF(this._scrollDispatcher,this._ngZone,this._viewportRuler,e);block=()=>new BF(this._viewportRuler,this._document);reposition=e=>new QF(this._scrollDispatcher,this._viewportRuler,this._ngZone,e);static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),id=class{positionStrategy;scrollStrategy=new nD;panelClass="";hasBackdrop=!1;backdropClass="cdk-overlay-dark-backdrop";width;height;minWidth;minHeight;maxWidth;maxHeight;direction;disposeOnNavigation=!1;constructor(A){if(A){let e=Object.keys(A);for(let i of e)A[i]!==void 0&&(this[i]=A[i])}}};var mF=class{connectionPair;scrollableViewProperties;constructor(A,e){this.connectionPair=A,this.scrollableViewProperties=e}};var cAe=(()=>{class t{_attachedOverlays=[];_document=E(ht);_isAttached;constructor(){}ngOnDestroy(){this.detach()}add(e){this.remove(e),this._attachedOverlays.push(e)}remove(e){let i=this._attachedOverlays.indexOf(e);i>-1&&this._attachedOverlays.splice(i,1),this._attachedOverlays.length===0&&this.detach()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),x7e=(()=>{class t extends cAe{_ngZone=E(yA);_renderer=E(fa).createRenderer(null,null);_cleanupKeydown;add(e){super.add(e),this._isAttached||(this._ngZone.runOutsideAngular(()=>{this._cleanupKeydown=this._renderer.listen("body","keydown",this._keydownListener)}),this._isAttached=!0)}detach(){this._isAttached&&(this._cleanupKeydown?.(),this._isAttached=!1)}_keydownListener=e=>{let i=this._attachedOverlays;for(let n=i.length-1;n>-1;n--)if(i[n]._keydownEvents.observers.length>0){this._ngZone.run(()=>i[n]._keydownEvents.next(e));break}};static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),_7e=(()=>{class t extends cAe{_platform=E(mi);_ngZone=E(yA,{optional:!0});_cursorOriginalValue;_cursorStyleIsSet=!1;_pointerDownEventTarget;add(e){if(super.add(e),!this._isAttached){let i=this._document.body;this._ngZone?this._ngZone.runOutsideAngular(()=>this._addEventListeners(i)):this._addEventListeners(i),this._platform.IOS&&!this._cursorStyleIsSet&&(this._cursorOriginalValue=i.style.cursor,i.style.cursor="pointer",this._cursorStyleIsSet=!0),this._isAttached=!0}}detach(){if(this._isAttached){let e=this._document.body;e.removeEventListener("pointerdown",this._pointerDownListener,!0),e.removeEventListener("click",this._clickListener,!0),e.removeEventListener("auxclick",this._clickListener,!0),e.removeEventListener("contextmenu",this._clickListener,!0),this._platform.IOS&&this._cursorStyleIsSet&&(e.style.cursor=this._cursorOriginalValue,this._cursorStyleIsSet=!1),this._isAttached=!1}}_addEventListeners(e){e.addEventListener("pointerdown",this._pointerDownListener,!0),e.addEventListener("click",this._clickListener,!0),e.addEventListener("auxclick",this._clickListener,!0),e.addEventListener("contextmenu",this._clickListener,!0)}_pointerDownListener=e=>{this._pointerDownEventTarget=al(e)};_clickListener=e=>{let i=al(e),n=e.type==="click"&&this._pointerDownEventTarget?this._pointerDownEventTarget:i;this._pointerDownEventTarget=null;let o=this._attachedOverlays.slice();for(let r=o.length-1;r>-1;r--){let s=o[r];if(s._outsidePointerEvents.observers.length<1||!s.hasAttached())continue;if(nAe(s.overlayElement,i)||nAe(s.overlayElement,n))break;let a=s._outsidePointerEvents;this._ngZone?this._ngZone.run(()=>a.next(e)):a.next(e)}};static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function nAe(t,A){let e=typeof ShadowRoot<"u"&&ShadowRoot,i=A;for(;i;){if(i===t)return!0;i=e&&i instanceof ShadowRoot?i.host:i.parentNode}return!1}var lAe=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["ng-component"]],hostAttrs:["cdk-overlay-style-loader",""],decls:0,vars:0,template:function(i,n){},styles:[".cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed}@layer cdk-overlay{.cdk-overlay-container{z-index:1000}}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute}@layer cdk-overlay{.cdk-global-overlay-wrapper{z-index:1000}}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;display:flex;max-width:100%;max-height:100%}@layer cdk-overlay{.cdk-overlay-pane{z-index:1000}}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:auto;-webkit-tap-highlight-color:rgba(0,0,0,0);opacity:0}@layer cdk-overlay{.cdk-overlay-backdrop{z-index:1000;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}}.cdk-overlay-backdrop-showing{opacity:1}@media(forced-colors: active){.cdk-overlay-backdrop-showing{opacity:.6}}@layer cdk-overlay{.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing,.cdk-high-contrast-active .cdk-overlay-transparent-backdrop{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;display:flex;flex-direction:column;min-width:1px;min-height:1px}@layer cdk-overlay{.cdk-overlay-connected-position-bounding-box{z-index:1000}}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}"],encapsulation:2,changeDetection:0})}return t})(),oD=(()=>{class t{_platform=E(mi);_containerElement;_document=E(ht);_styleLoader=E(Wn);constructor(){}ngOnDestroy(){this._containerElement?.remove()}getContainerElement(){return this._loadStyles(),this._containerElement||this._createContainer(),this._containerElement}_createContainer(){let e="cdk-overlay-container";if(this._platform.isBrowser||uN()){let n=this._document.querySelectorAll(`.${e}[platform="server"], .${e}[platform="test"]`);for(let o=0;o{let A=this.element;clearTimeout(this._fallbackTimeout),this._cleanupTransitionEnd?.(),this._cleanupTransitionEnd=this._renderer.listen(A,"transitionend",this.dispose),this._fallbackTimeout=setTimeout(this.dispose,500),A.style.pointerEvents="none",A.classList.remove("cdk-overlay-backdrop-showing")})}dispose=()=>{clearTimeout(this._fallbackTimeout),this._cleanupClick?.(),this._cleanupTransitionEnd?.(),this._cleanupClick=this._cleanupTransitionEnd=this._fallbackTimeout=void 0,this.element.remove()}},lE=class{_portalOutlet;_host;_pane;_config;_ngZone;_keyboardDispatcher;_document;_location;_outsideClickDispatcher;_animationsDisabled;_injector;_renderer;_backdropClick=new je;_attachments=new je;_detachments=new je;_positionStrategy;_scrollStrategy;_locationChanges=Ot.EMPTY;_backdropRef=null;_previousHostParent;_keydownEvents=new je;_outsidePointerEvents=new je;_renders=new je;_afterRenderRef;_afterNextRenderRef;constructor(A,e,i,n,o,r,s,a,c,l=!1,d,C){this._portalOutlet=A,this._host=e,this._pane=i,this._config=n,this._ngZone=o,this._keyboardDispatcher=r,this._document=s,this._location=a,this._outsideClickDispatcher=c,this._animationsDisabled=l,this._injector=d,this._renderer=C,n.scrollStrategy&&(this._scrollStrategy=n.scrollStrategy,this._scrollStrategy.attach(this)),this._positionStrategy=n.positionStrategy,this._afterRenderRef=As(()=>f4(()=>{this._renders.next()},{injector:this._injector}))}get overlayElement(){return this._pane}get backdropElement(){return this._backdropRef?.element||null}get hostElement(){return this._host}attach(A){!this._host.parentElement&&this._previousHostParent&&this._previousHostParent.appendChild(this._host);let e=this._portalOutlet.attach(A);return this._positionStrategy&&this._positionStrategy.attach(this),this._updateStackingOrder(),this._updateElementSize(),this._updateElementDirection(),this._scrollStrategy&&this._scrollStrategy.enable(),this._afterNextRenderRef?.destroy(),this._afterNextRenderRef=Gr(()=>{this.hasAttached()&&this.updatePosition()},{injector:this._injector}),this._togglePointerEvents(!0),this._config.hasBackdrop&&this._attachBackdrop(),this._config.panelClass&&this._toggleClasses(this._pane,this._config.panelClass,!0),this._attachments.next(),this._keyboardDispatcher.add(this),this._config.disposeOnNavigation&&(this._locationChanges=this._location.subscribe(()=>this.dispose())),this._outsideClickDispatcher.add(this),typeof e?.onDestroy=="function"&&e.onDestroy(()=>{this.hasAttached()&&this._ngZone.runOutsideAngular(()=>Promise.resolve().then(()=>this.detach()))}),e}detach(){if(!this.hasAttached())return;this.detachBackdrop(),this._togglePointerEvents(!1),this._positionStrategy&&this._positionStrategy.detach&&this._positionStrategy.detach(),this._scrollStrategy&&this._scrollStrategy.disable();let A=this._portalOutlet.detach();return this._detachments.next(),this._keyboardDispatcher.remove(this),this._detachContentWhenEmpty(),this._locationChanges.unsubscribe(),this._outsideClickDispatcher.remove(this),A}dispose(){let A=this.hasAttached();this._positionStrategy&&this._positionStrategy.dispose(),this._disposeScrollStrategy(),this._backdropRef?.dispose(),this._locationChanges.unsubscribe(),this._keyboardDispatcher.remove(this),this._portalOutlet.dispose(),this._attachments.complete(),this._backdropClick.complete(),this._keydownEvents.complete(),this._outsidePointerEvents.complete(),this._outsideClickDispatcher.remove(this),this._host?.remove(),this._afterNextRenderRef?.destroy(),this._previousHostParent=this._pane=this._host=this._backdropRef=null,A&&this._detachments.next(),this._detachments.complete(),this._afterRenderRef.destroy(),this._renders.complete()}hasAttached(){return this._portalOutlet.hasAttached()}backdropClick(){return this._backdropClick}attachments(){return this._attachments}detachments(){return this._detachments}keydownEvents(){return this._keydownEvents}outsidePointerEvents(){return this._outsidePointerEvents}getConfig(){return this._config}updatePosition(){this._positionStrategy&&this._positionStrategy.apply()}updatePositionStrategy(A){A!==this._positionStrategy&&(this._positionStrategy&&this._positionStrategy.dispose(),this._positionStrategy=A,this.hasAttached()&&(A.attach(this),this.updatePosition()))}updateSize(A){this._config=ae(ae({},this._config),A),this._updateElementSize()}setDirection(A){this._config=_A(ae({},this._config),{direction:A}),this._updateElementDirection()}addPanelClass(A){this._pane&&this._toggleClasses(this._pane,A,!0)}removePanelClass(A){this._pane&&this._toggleClasses(this._pane,A,!1)}getDirection(){let A=this._config.direction;return A?typeof A=="string"?A:A.value:"ltr"}updateScrollStrategy(A){A!==this._scrollStrategy&&(this._disposeScrollStrategy(),this._scrollStrategy=A,this.hasAttached()&&(A.attach(this),A.enable()))}_updateElementDirection(){this._host.setAttribute("dir",this.getDirection())}_updateElementSize(){if(!this._pane)return;let A=this._pane.style;A.width=is(this._config.width),A.height=is(this._config.height),A.minWidth=is(this._config.minWidth),A.minHeight=is(this._config.minHeight),A.maxWidth=is(this._config.maxWidth),A.maxHeight=is(this._config.maxHeight)}_togglePointerEvents(A){this._pane.style.pointerEvents=A?"":"none"}_attachBackdrop(){let A="cdk-overlay-backdrop-showing";this._backdropRef?.dispose(),this._backdropRef=new pF(this._document,this._renderer,this._ngZone,e=>{this._backdropClick.next(e)}),this._animationsDisabled&&this._backdropRef.element.classList.add("cdk-overlay-backdrop-noop-animation"),this._config.backdropClass&&this._toggleClasses(this._backdropRef.element,this._config.backdropClass,!0),this._host.parentElement.insertBefore(this._backdropRef.element,this._host),!this._animationsDisabled&&typeof requestAnimationFrame<"u"?this._ngZone.runOutsideAngular(()=>{requestAnimationFrame(()=>this._backdropRef?.element.classList.add(A))}):this._backdropRef.element.classList.add(A)}_updateStackingOrder(){this._host.nextSibling&&this._host.parentNode.appendChild(this._host)}detachBackdrop(){this._animationsDisabled?(this._backdropRef?.dispose(),this._backdropRef=null):this._backdropRef?.detach()}_toggleClasses(A,e,i){let n=GB(e||[]).filter(o=>!!o);n.length&&(i?A.classList.add(...n):A.classList.remove(...n))}_detachContentWhenEmpty(){this._ngZone.runOutsideAngular(()=>{let A=this._renders.pipe(mt(Bi(this._attachments,this._detachments))).subscribe(()=>{(!this._pane||!this._host||this._pane.children.length===0)&&(this._pane&&this._config.panelClass&&this._toggleClasses(this._pane,this._config.panelClass,!1),this._host&&this._host.parentElement&&(this._previousHostParent=this._host.parentElement,this._host.remove()),A.unsubscribe())})})}_disposeScrollStrategy(){let A=this._scrollStrategy;A?.disable(),A?.detach?.()}},oAe="cdk-overlay-connected-position-bounding-box",R7e=/([A-Za-z%]+)$/,wF=class{_viewportRuler;_document;_platform;_overlayContainer;_overlayRef;_isInitialRender;_lastBoundingBoxSize={width:0,height:0};_isPushed=!1;_canPush=!0;_growAfterOpen=!1;_hasFlexibleDimensions=!0;_positionLocked=!1;_originRect;_overlayRect;_viewportRect;_containerRect;_viewportMargin=0;_scrollables=[];_preferredPositions=[];_origin;_pane;_isDisposed;_boundingBox;_lastPosition;_lastScrollVisibility;_positionChanges=new je;_resizeSubscription=Ot.EMPTY;_offsetX=0;_offsetY=0;_transformOriginSelector;_appliedPanelClasses=[];_previousPushAmount;positionChanges=this._positionChanges;get positions(){return this._preferredPositions}constructor(A,e,i,n,o){this._viewportRuler=e,this._document=i,this._platform=n,this._overlayContainer=o,this.setOrigin(A)}attach(A){this._overlayRef&&this._overlayRef,this._validatePositions(),A.hostElement.classList.add(oAe),this._overlayRef=A,this._boundingBox=A.hostElement,this._pane=A.overlayElement,this._isDisposed=!1,this._isInitialRender=!0,this._lastPosition=null,this._resizeSubscription.unsubscribe(),this._resizeSubscription=this._viewportRuler.change().subscribe(()=>{this._isInitialRender=!0,this.apply()})}apply(){if(this._isDisposed||!this._platform.isBrowser)return;if(!this._isInitialRender&&this._positionLocked&&this._lastPosition){this.reapplyLastPosition();return}this._clearPanelClasses(),this._resetOverlayElementStyles(),this._resetBoundingBoxStyles(),this._viewportRect=this._getNarrowedViewportRect(),this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._containerRect=this._overlayContainer.getContainerElement().getBoundingClientRect();let A=this._originRect,e=this._overlayRect,i=this._viewportRect,n=this._containerRect,o=[],r;for(let s of this._preferredPositions){let a=this._getOriginPoint(A,n,s),c=this._getOverlayPoint(a,e,s),l=this._getOverlayFit(c,e,i,s);if(l.isCompletelyWithinViewport){this._isPushed=!1,this._applyPosition(s,a);return}if(this._canFitWithFlexibleDimensions(l,c,i)){o.push({position:s,origin:a,overlayRect:e,boundingBoxRect:this._calculateBoundingBoxRect(a,s)});continue}(!r||r.overlayFit.visibleAreaa&&(a=l,s=c)}this._isPushed=!1,this._applyPosition(s.position,s.origin);return}if(this._canPush){this._isPushed=!0,this._applyPosition(r.position,r.originPoint);return}this._applyPosition(r.position,r.originPoint)}detach(){this._clearPanelClasses(),this._lastPosition=null,this._previousPushAmount=null,this._resizeSubscription.unsubscribe()}dispose(){this._isDisposed||(this._boundingBox&&hu(this._boundingBox.style,{top:"",left:"",right:"",bottom:"",height:"",width:"",alignItems:"",justifyContent:""}),this._pane&&this._resetOverlayElementStyles(),this._overlayRef&&this._overlayRef.hostElement.classList.remove(oAe),this.detach(),this._positionChanges.complete(),this._overlayRef=this._boundingBox=null,this._isDisposed=!0)}reapplyLastPosition(){if(this._isDisposed||!this._platform.isBrowser)return;let A=this._lastPosition;if(A){this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._viewportRect=this._getNarrowedViewportRect(),this._containerRect=this._overlayContainer.getContainerElement().getBoundingClientRect();let e=this._getOriginPoint(this._originRect,this._containerRect,A);this._applyPosition(A,e)}else this.apply()}withScrollableContainers(A){return this._scrollables=A,this}withPositions(A){return this._preferredPositions=A,A.indexOf(this._lastPosition)===-1&&(this._lastPosition=null),this._validatePositions(),this}withViewportMargin(A){return this._viewportMargin=A,this}withFlexibleDimensions(A=!0){return this._hasFlexibleDimensions=A,this}withGrowAfterOpen(A=!0){return this._growAfterOpen=A,this}withPush(A=!0){return this._canPush=A,this}withLockedPosition(A=!0){return this._positionLocked=A,this}setOrigin(A){return this._origin=A,this}withDefaultOffsetX(A){return this._offsetX=A,this}withDefaultOffsetY(A){return this._offsetY=A,this}withTransformOriginOn(A){return this._transformOriginSelector=A,this}_getOriginPoint(A,e,i){let n;if(i.originX=="center")n=A.left+A.width/2;else{let r=this._isRtl()?A.right:A.left,s=this._isRtl()?A.left:A.right;n=i.originX=="start"?r:s}e.left<0&&(n-=e.left);let o;return i.originY=="center"?o=A.top+A.height/2:o=i.originY=="top"?A.top:A.bottom,e.top<0&&(o-=e.top),{x:n,y:o}}_getOverlayPoint(A,e,i){let n;i.overlayX=="center"?n=-e.width/2:i.overlayX==="start"?n=this._isRtl()?-e.width:0:n=this._isRtl()?0:-e.width;let o;return i.overlayY=="center"?o=-e.height/2:o=i.overlayY=="top"?0:-e.height,{x:A.x+n,y:A.y+o}}_getOverlayFit(A,e,i,n){let o=sAe(e),{x:r,y:s}=A,a=this._getOffset(n,"x"),c=this._getOffset(n,"y");a&&(r+=a),c&&(s+=c);let l=0-r,d=r+o.width-i.width,C=0-s,I=s+o.height-i.height,u=this._subtractOverflows(o.width,l,d),h=this._subtractOverflows(o.height,C,I),B=u*h;return{visibleArea:B,isCompletelyWithinViewport:o.width*o.height===B,fitsInViewportVertically:h===o.height,fitsInViewportHorizontally:u==o.width}}_canFitWithFlexibleDimensions(A,e,i){if(this._hasFlexibleDimensions){let n=i.bottom-e.y,o=i.right-e.x,r=rAe(this._overlayRef.getConfig().minHeight),s=rAe(this._overlayRef.getConfig().minWidth),a=A.fitsInViewportVertically||r!=null&&r<=n,c=A.fitsInViewportHorizontally||s!=null&&s<=o;return a&&c}return!1}_pushOverlayOnScreen(A,e,i){if(this._previousPushAmount&&this._positionLocked)return{x:A.x+this._previousPushAmount.x,y:A.y+this._previousPushAmount.y};let n=sAe(e),o=this._viewportRect,r=Math.max(A.x+n.width-o.width,0),s=Math.max(A.y+n.height-o.height,0),a=Math.max(o.top-i.top-A.y,0),c=Math.max(o.left-i.left-A.x,0),l=0,d=0;return n.width<=o.width?l=c||-r:l=A.xu&&!this._isInitialRender&&!this._growAfterOpen&&(r=A.y-u/2)}let a=e.overlayX==="start"&&!n||e.overlayX==="end"&&n,c=e.overlayX==="end"&&!n||e.overlayX==="start"&&n,l,d,C;if(c)C=i.width-A.x+this._viewportMargin*2,l=A.x-this._viewportMargin;else if(a)d=A.x,l=i.right-A.x;else{let I=Math.min(i.right-A.x+i.left,A.x),u=this._lastBoundingBoxSize.width;l=I*2,d=A.x-I,l>u&&!this._isInitialRender&&!this._growAfterOpen&&(d=A.x-u/2)}return{top:r,left:d,bottom:s,right:C,width:l,height:o}}_setBoundingBoxStyles(A,e){let i=this._calculateBoundingBoxRect(A,e);!this._isInitialRender&&!this._growAfterOpen&&(i.height=Math.min(i.height,this._lastBoundingBoxSize.height),i.width=Math.min(i.width,this._lastBoundingBoxSize.width));let n={};if(this._hasExactPosition())n.top=n.left="0",n.bottom=n.right=n.maxHeight=n.maxWidth="",n.width=n.height="100%";else{let o=this._overlayRef.getConfig().maxHeight,r=this._overlayRef.getConfig().maxWidth;n.height=is(i.height),n.top=is(i.top),n.bottom=is(i.bottom),n.width=is(i.width),n.left=is(i.left),n.right=is(i.right),e.overlayX==="center"?n.alignItems="center":n.alignItems=e.overlayX==="end"?"flex-end":"flex-start",e.overlayY==="center"?n.justifyContent="center":n.justifyContent=e.overlayY==="bottom"?"flex-end":"flex-start",o&&(n.maxHeight=is(o)),r&&(n.maxWidth=is(r))}this._lastBoundingBoxSize=i,hu(this._boundingBox.style,n)}_resetBoundingBoxStyles(){hu(this._boundingBox.style,{top:"0",left:"0",right:"0",bottom:"0",height:"",width:"",alignItems:"",justifyContent:""})}_resetOverlayElementStyles(){hu(this._pane.style,{top:"",left:"",bottom:"",right:"",position:"",transform:""})}_setOverlayElementStyles(A,e){let i={},n=this._hasExactPosition(),o=this._hasFlexibleDimensions,r=this._overlayRef.getConfig();if(n){let l=this._viewportRuler.getViewportScrollPosition();hu(i,this._getExactOverlayY(e,A,l)),hu(i,this._getExactOverlayX(e,A,l))}else i.position="static";let s="",a=this._getOffset(e,"x"),c=this._getOffset(e,"y");a&&(s+=`translateX(${a}px) `),c&&(s+=`translateY(${c}px)`),i.transform=s.trim(),r.maxHeight&&(n?i.maxHeight=is(r.maxHeight):o&&(i.maxHeight="")),r.maxWidth&&(n?i.maxWidth=is(r.maxWidth):o&&(i.maxWidth="")),hu(this._pane.style,i)}_getExactOverlayY(A,e,i){let n={top:"",bottom:""},o=this._getOverlayPoint(e,this._overlayRect,A);if(this._isPushed&&(o=this._pushOverlayOnScreen(o,this._overlayRect,i)),A.overlayY==="bottom"){let r=this._document.documentElement.clientHeight;n.bottom=`${r-(o.y+this._overlayRect.height)}px`}else n.top=is(o.y);return n}_getExactOverlayX(A,e,i){let n={left:"",right:""},o=this._getOverlayPoint(e,this._overlayRect,A);this._isPushed&&(o=this._pushOverlayOnScreen(o,this._overlayRect,i));let r;if(this._isRtl()?r=A.overlayX==="end"?"left":"right":r=A.overlayX==="end"?"right":"left",r==="right"){let s=this._document.documentElement.clientWidth;n.right=`${s-(o.x+this._overlayRect.width)}px`}else n.left=is(o.x);return n}_getScrollVisibility(){let A=this._getOriginRect(),e=this._pane.getBoundingClientRect(),i=this._scrollables.map(n=>n.getElementRef().nativeElement.getBoundingClientRect());return{isOriginClipped:iAe(A,i),isOriginOutsideView:fF(A,i),isOverlayClipped:iAe(e,i),isOverlayOutsideView:fF(e,i)}}_subtractOverflows(A,...e){return e.reduce((i,n)=>i-Math.max(n,0),A)}_getNarrowedViewportRect(){let A=this._document.documentElement.clientWidth,e=this._document.documentElement.clientHeight,i=this._viewportRuler.getViewportScrollPosition();return{top:i.top+this._viewportMargin,left:i.left+this._viewportMargin,right:i.left+A-this._viewportMargin,bottom:i.top+e-this._viewportMargin,width:A-2*this._viewportMargin,height:e-2*this._viewportMargin}}_isRtl(){return this._overlayRef.getDirection()==="rtl"}_hasExactPosition(){return!this._hasFlexibleDimensions||this._isPushed}_getOffset(A,e){return e==="x"?A.offsetX==null?this._offsetX:A.offsetX:A.offsetY==null?this._offsetY:A.offsetY}_validatePositions(){}_addPanelClasses(A){this._pane&&GB(A).forEach(e=>{e!==""&&this._appliedPanelClasses.indexOf(e)===-1&&(this._appliedPanelClasses.push(e),this._pane.classList.add(e))})}_clearPanelClasses(){this._pane&&(this._appliedPanelClasses.forEach(A=>{this._pane.classList.remove(A)}),this._appliedPanelClasses=[])}_getOriginRect(){let A=this._origin;if(A instanceof eA)return A.nativeElement.getBoundingClientRect();if(A instanceof Element)return A.getBoundingClientRect();let e=A.width||0,i=A.height||0;return{top:A.y,bottom:A.y+i,left:A.x,right:A.x+e,height:i,width:e}}};function hu(t,A){for(let e in A)A.hasOwnProperty(e)&&(t[e]=A[e]);return t}function rAe(t){if(typeof t!="number"&&t!=null){let[A,e]=t.split(R7e);return!e||e==="px"?parseFloat(A):null}return t||null}function sAe(t){return{top:Math.floor(t.top),right:Math.floor(t.right),bottom:Math.floor(t.bottom),left:Math.floor(t.left),width:Math.floor(t.width),height:Math.floor(t.height)}}function N7e(t,A){return t===A?!0:t.isOriginClipped===A.isOriginClipped&&t.isOriginOutsideView===A.isOriginOutsideView&&t.isOverlayClipped===A.isOverlayClipped&&t.isOverlayOutsideView===A.isOverlayOutsideView}var aAe="cdk-global-overlay-wrapper",yF=class{_overlayRef;_cssPosition="static";_topOffset="";_bottomOffset="";_alignItems="";_xPosition="";_xOffset="";_width="";_height="";_isDisposed=!1;attach(A){let e=A.getConfig();this._overlayRef=A,this._width&&!e.width&&A.updateSize({width:this._width}),this._height&&!e.height&&A.updateSize({height:this._height}),A.hostElement.classList.add(aAe),this._isDisposed=!1}top(A=""){return this._bottomOffset="",this._topOffset=A,this._alignItems="flex-start",this}left(A=""){return this._xOffset=A,this._xPosition="left",this}bottom(A=""){return this._topOffset="",this._bottomOffset=A,this._alignItems="flex-end",this}right(A=""){return this._xOffset=A,this._xPosition="right",this}start(A=""){return this._xOffset=A,this._xPosition="start",this}end(A=""){return this._xOffset=A,this._xPosition="end",this}width(A=""){return this._overlayRef?this._overlayRef.updateSize({width:A}):this._width=A,this}height(A=""){return this._overlayRef?this._overlayRef.updateSize({height:A}):this._height=A,this}centerHorizontally(A=""){return this.left(A),this._xPosition="center",this}centerVertically(A=""){return this.top(A),this._alignItems="center",this}apply(){if(!this._overlayRef||!this._overlayRef.hasAttached())return;let A=this._overlayRef.overlayElement.style,e=this._overlayRef.hostElement.style,i=this._overlayRef.getConfig(),{width:n,height:o,maxWidth:r,maxHeight:s}=i,a=(n==="100%"||n==="100vw")&&(!r||r==="100%"||r==="100vw"),c=(o==="100%"||o==="100vh")&&(!s||s==="100%"||s==="100vh"),l=this._xPosition,d=this._xOffset,C=this._overlayRef.getConfig().direction==="rtl",I="",u="",h="";a?h="flex-start":l==="center"?(h="center",C?u=d:I=d):C?l==="left"||l==="end"?(h="flex-end",I=d):(l==="right"||l==="start")&&(h="flex-start",u=d):l==="left"||l==="start"?(h="flex-start",I=d):(l==="right"||l==="end")&&(h="flex-end",u=d),A.position=this._cssPosition,A.marginLeft=a?"0":I,A.marginTop=c?"0":this._topOffset,A.marginBottom=this._bottomOffset,A.marginRight=a?"0":u,e.justifyContent=h,e.alignItems=c?"flex-start":this._alignItems}dispose(){if(this._isDisposed||!this._overlayRef)return;let A=this._overlayRef.overlayElement.style,e=this._overlayRef.hostElement,i=e.style;e.classList.remove(aAe),i.justifyContent=i.alignItems=A.marginTop=A.marginBottom=A.marginLeft=A.marginRight=A.position="",this._overlayRef=null,this._isDisposed=!0}},L7e=(()=>{class t{_viewportRuler=E(Ol);_document=E(ht);_platform=E(mi);_overlayContainer=E(oD);constructor(){}global(){return new yF}flexibleConnectedTo(e){return new wF(e,this._viewportRuler,this._document,this._platform,this._overlayContainer)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),Or=(()=>{class t{scrollStrategies=E(k7e);_overlayContainer=E(oD);_positionBuilder=E(L7e);_keyboardDispatcher=E(x7e);_injector=E(Dt);_ngZone=E(yA);_document=E(ht);_directionality=E(Do);_location=E(Fl);_outsideClickDispatcher=E(_7e);_animationsModuleType=E(Oi,{optional:!0});_idGenerator=E(un);_renderer=E(fa).createRenderer(null,null);_appRef;_styleLoader=E(Wn);constructor(){}create(e){this._styleLoader.load(lAe);let i=this._createHostElement(),n=this._createPaneElement(i),o=this._createPortalOutlet(n),r=new id(e);return r.direction=r.direction||this._directionality.value,new lE(o,i,n,r,this._ngZone,this._keyboardDispatcher,this._document,this._location,this._outsideClickDispatcher,this._animationsModuleType==="NoopAnimations",this._injector.get(Hr),this._renderer)}position(){return this._positionBuilder}_createPaneElement(e){let i=this._document.createElement("div");return i.id=this._idGenerator.getId("cdk-overlay-"),i.classList.add("cdk-overlay-pane"),e.appendChild(i),i}_createHostElement(){let e=this._document.createElement("div");return this._overlayContainer.getContainerElement().appendChild(e),e}_createPortalOutlet(e){return this._appRef||(this._appRef=this._injector.get(fc)),new Nm(e,null,this._appRef,this._injector,this._document)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),F7e=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom"},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"}],gAe=new re("cdk-connected-overlay-scroll-strategy",{providedIn:"root",factory:()=>{let t=E(Or);return()=>t.scrollStrategies.reposition()}}),Lm=(()=>{class t{elementRef=E(eA);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","cdk-overlay-origin",""],["","overlay-origin",""],["","cdkOverlayOrigin",""]],exportAs:["cdkOverlayOrigin"]})}return t})(),DF=(()=>{class t{_overlay=E(Or);_dir=E(Do,{optional:!0});_overlayRef;_templatePortal;_backdropSubscription=Ot.EMPTY;_attachSubscription=Ot.EMPTY;_detachSubscription=Ot.EMPTY;_positionSubscription=Ot.EMPTY;_offsetX;_offsetY;_position;_scrollStrategyFactory=E(gAe);_disposeOnNavigation=!1;_ngZone=E(yA);origin;positions;positionStrategy;get offsetX(){return this._offsetX}set offsetX(e){this._offsetX=e,this._position&&this._updatePositionStrategy(this._position)}get offsetY(){return this._offsetY}set offsetY(e){this._offsetY=e,this._position&&this._updatePositionStrategy(this._position)}width;height;minWidth;minHeight;backdropClass;panelClass;viewportMargin=0;scrollStrategy;open=!1;disableClose=!1;transformOriginSelector;hasBackdrop=!1;lockPosition=!1;flexibleDimensions=!1;growAfterOpen=!1;push=!1;get disposeOnNavigation(){return this._disposeOnNavigation}set disposeOnNavigation(e){this._disposeOnNavigation=e}backdropClick=new Ve;positionChange=new Ve;attach=new Ve;detach=new Ve;overlayKeydown=new Ve;overlayOutsideClick=new Ve;constructor(){let e=E(en),i=E(xn);this._templatePortal=new ba(e,i),this.scrollStrategy=this._scrollStrategyFactory()}get overlayRef(){return this._overlayRef}get dir(){return this._dir?this._dir.value:"ltr"}ngOnDestroy(){this._attachSubscription.unsubscribe(),this._detachSubscription.unsubscribe(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this._overlayRef&&this._overlayRef.dispose()}ngOnChanges(e){this._position&&(this._updatePositionStrategy(this._position),this._overlayRef.updateSize({width:this.width,minWidth:this.minWidth,height:this.height,minHeight:this.minHeight}),e.origin&&this.open&&this._position.apply()),e.open&&(this.open?this._attachOverlay():this._detachOverlay())}_createOverlay(){(!this.positions||!this.positions.length)&&(this.positions=F7e);let e=this._overlayRef=this._overlay.create(this._buildConfig());this._attachSubscription=e.attachments().subscribe(()=>this.attach.emit()),this._detachSubscription=e.detachments().subscribe(()=>this.detach.emit()),e.keydownEvents().subscribe(i=>{this.overlayKeydown.next(i),i.keyCode===27&&!this.disableClose&&!Tr(i)&&(i.preventDefault(),this._detachOverlay())}),this._overlayRef.outsidePointerEvents().subscribe(i=>{let n=this._getOriginElement(),o=al(i);(!n||n!==o&&!n.contains(o))&&this.overlayOutsideClick.next(i)})}_buildConfig(){let e=this._position=this.positionStrategy||this._createPositionStrategy(),i=new id({direction:this._dir||"ltr",positionStrategy:e,scrollStrategy:this.scrollStrategy,hasBackdrop:this.hasBackdrop,disposeOnNavigation:this.disposeOnNavigation});return(this.width||this.width===0)&&(i.width=this.width),(this.height||this.height===0)&&(i.height=this.height),(this.minWidth||this.minWidth===0)&&(i.minWidth=this.minWidth),(this.minHeight||this.minHeight===0)&&(i.minHeight=this.minHeight),this.backdropClass&&(i.backdropClass=this.backdropClass),this.panelClass&&(i.panelClass=this.panelClass),i}_updatePositionStrategy(e){let i=this.positions.map(n=>({originX:n.originX,originY:n.originY,overlayX:n.overlayX,overlayY:n.overlayY,offsetX:n.offsetX||this.offsetX,offsetY:n.offsetY||this.offsetY,panelClass:n.panelClass||void 0}));return e.setOrigin(this._getOrigin()).withPositions(i).withFlexibleDimensions(this.flexibleDimensions).withPush(this.push).withGrowAfterOpen(this.growAfterOpen).withViewportMargin(this.viewportMargin).withLockedPosition(this.lockPosition).withTransformOriginOn(this.transformOriginSelector)}_createPositionStrategy(){let e=this._overlay.position().flexibleConnectedTo(this._getOrigin());return this._updatePositionStrategy(e),e}_getOrigin(){return this.origin instanceof Lm?this.origin.elementRef:this.origin}_getOriginElement(){return this.origin instanceof Lm?this.origin.elementRef.nativeElement:this.origin instanceof eA?this.origin.nativeElement:typeof Element<"u"&&this.origin instanceof Element?this.origin:null}_attachOverlay(){this._overlayRef?this._overlayRef.getConfig().hasBackdrop=this.hasBackdrop:this._createOverlay(),this._overlayRef.hasAttached()||this._overlayRef.attach(this._templatePortal),this.hasBackdrop?this._backdropSubscription=this._overlayRef.backdropClick().subscribe(e=>{this.backdropClick.emit(e)}):this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this.positionChange.observers.length>0&&(this._positionSubscription=this._position.positionChanges.pipe(ex(()=>this.positionChange.observers.length>0)).subscribe(e=>{this._ngZone.run(()=>this.positionChange.emit(e)),this.positionChange.observers.length===0&&this._positionSubscription.unsubscribe()}))}_detachOverlay(){this._overlayRef&&this._overlayRef.detach(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","cdk-connected-overlay",""],["","connected-overlay",""],["","cdkConnectedOverlay",""]],inputs:{origin:[0,"cdkConnectedOverlayOrigin","origin"],positions:[0,"cdkConnectedOverlayPositions","positions"],positionStrategy:[0,"cdkConnectedOverlayPositionStrategy","positionStrategy"],offsetX:[0,"cdkConnectedOverlayOffsetX","offsetX"],offsetY:[0,"cdkConnectedOverlayOffsetY","offsetY"],width:[0,"cdkConnectedOverlayWidth","width"],height:[0,"cdkConnectedOverlayHeight","height"],minWidth:[0,"cdkConnectedOverlayMinWidth","minWidth"],minHeight:[0,"cdkConnectedOverlayMinHeight","minHeight"],backdropClass:[0,"cdkConnectedOverlayBackdropClass","backdropClass"],panelClass:[0,"cdkConnectedOverlayPanelClass","panelClass"],viewportMargin:[0,"cdkConnectedOverlayViewportMargin","viewportMargin"],scrollStrategy:[0,"cdkConnectedOverlayScrollStrategy","scrollStrategy"],open:[0,"cdkConnectedOverlayOpen","open"],disableClose:[0,"cdkConnectedOverlayDisableClose","disableClose"],transformOriginSelector:[0,"cdkConnectedOverlayTransformOriginOn","transformOriginSelector"],hasBackdrop:[2,"cdkConnectedOverlayHasBackdrop","hasBackdrop",IA],lockPosition:[2,"cdkConnectedOverlayLockPosition","lockPosition",IA],flexibleDimensions:[2,"cdkConnectedOverlayFlexibleDimensions","flexibleDimensions",IA],growAfterOpen:[2,"cdkConnectedOverlayGrowAfterOpen","growAfterOpen",IA],push:[2,"cdkConnectedOverlayPush","push",IA],disposeOnNavigation:[2,"cdkConnectedOverlayDisposeOnNavigation","disposeOnNavigation",IA]},outputs:{backdropClick:"backdropClick",positionChange:"positionChange",attach:"attach",detach:"detach",overlayKeydown:"overlayKeydown",overlayOutsideClick:"overlayOutsideClick"},exportAs:["cdkConnectedOverlay"],features:[ti]})}return t})();function G7e(t){return()=>t.scrollStrategies.reposition()}var K7e={provide:gAe,deps:[Or],useFactory:G7e},Lg=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({providers:[Or,K7e],imports:[N1,td,iD,iD]})}return t})();function U7e(t,A){}var z1=class{viewContainerRef;injector;id;role="dialog";panelClass="";hasBackdrop=!0;backdropClass="";disableClose=!1;width="";height="";minWidth;minHeight;maxWidth;maxHeight;positionStrategy;data=null;direction;ariaDescribedBy=null;ariaLabelledBy=null;ariaLabel=null;ariaModal=!1;autoFocus="first-tabbable";restoreFocus=!0;scrollStrategy;closeOnNavigation=!0;closeOnDestroy=!0;closeOnOverlayDetachments=!0;componentFactoryResolver;providers;container;templateContext};var bF=(()=>{class t extends H1{_elementRef=E(eA);_focusTrapFactory=E(R5);_config;_interactivityChecker=E(z4);_ngZone=E(yA);_overlayRef=E(lE);_focusMonitor=E(ns);_renderer=E(an);_platform=E(mi);_document=E(ht,{optional:!0});_portalOutlet;_focusTrap=null;_elementFocusedBeforeDialogWasOpened=null;_closeInteractionType=null;_ariaLabelledByQueue=[];_changeDetectorRef=E(ut);_injector=E(Dt);_isDestroyed=!1;constructor(){super(),this._config=E(z1,{optional:!0})||new z1,this._config.ariaLabelledBy&&this._ariaLabelledByQueue.push(this._config.ariaLabelledBy)}_addAriaLabelledBy(e){this._ariaLabelledByQueue.push(e),this._changeDetectorRef.markForCheck()}_removeAriaLabelledBy(e){let i=this._ariaLabelledByQueue.indexOf(e);i>-1&&(this._ariaLabelledByQueue.splice(i,1),this._changeDetectorRef.markForCheck())}_contentAttached(){this._initializeFocusTrap(),this._handleBackdropClicks(),this._captureInitialFocus()}_captureInitialFocus(){this._trapFocus()}ngOnDestroy(){this._isDestroyed=!0,this._restoreFocus()}attachComponentPortal(e){this._portalOutlet.hasAttached();let i=this._portalOutlet.attachComponentPortal(e);return this._contentAttached(),i}attachTemplatePortal(e){this._portalOutlet.hasAttached();let i=this._portalOutlet.attachTemplatePortal(e);return this._contentAttached(),i}attachDomPortal=e=>{this._portalOutlet.hasAttached();let i=this._portalOutlet.attachDomPortal(e);return this._contentAttached(),i};_recaptureFocus(){this._containsFocus()||this._trapFocus()}_forceFocus(e,i){this._interactivityChecker.isFocusable(e)||(e.tabIndex=-1,this._ngZone.runOutsideAngular(()=>{let n=()=>{o(),r(),e.removeAttribute("tabindex")},o=this._renderer.listen(e,"blur",n),r=this._renderer.listen(e,"mousedown",n)})),e.focus(i)}_focusByCssSelector(e,i){let n=this._elementRef.nativeElement.querySelector(e);n&&this._forceFocus(n,i)}_trapFocus(){this._isDestroyed||Gr(()=>{let e=this._elementRef.nativeElement;switch(this._config.autoFocus){case!1:case"dialog":this._containsFocus()||e.focus();break;case!0:case"first-tabbable":this._focusTrap?.focusInitialElement()||this._focusDialogContainer();break;case"first-heading":this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role="heading"]');break;default:this._focusByCssSelector(this._config.autoFocus);break}},{injector:this._injector})}_restoreFocus(){let e=this._config.restoreFocus,i=null;if(typeof e=="string"?i=this._document.querySelector(e):typeof e=="boolean"?i=e?this._elementFocusedBeforeDialogWasOpened:null:e&&(i=e),this._config.restoreFocus&&i&&typeof i.focus=="function"){let n=FB(),o=this._elementRef.nativeElement;(!n||n===this._document.body||n===o||o.contains(n))&&(this._focusMonitor?(this._focusMonitor.focusVia(i,this._closeInteractionType),this._closeInteractionType=null):i.focus())}this._focusTrap&&this._focusTrap.destroy()}_focusDialogContainer(){this._elementRef.nativeElement.focus&&this._elementRef.nativeElement.focus()}_containsFocus(){let e=this._elementRef.nativeElement,i=FB();return e===i||e.contains(i)}_initializeFocusTrap(){this._platform.isBrowser&&(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement),this._document&&(this._elementFocusedBeforeDialogWasOpened=FB()))}_handleBackdropClicks(){this._overlayRef.backdropClick().subscribe(()=>{this._config.disableClose&&this._recaptureFocus()})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["cdk-dialog-container"]],viewQuery:function(i,n){if(i&1&&At(bc,7),i&2){let o;oA(o=rA())&&(n._portalOutlet=o.first)}},hostAttrs:["tabindex","-1",1,"cdk-dialog-container"],hostVars:6,hostBindings:function(i,n){i&2&&AA("id",n._config.id||null)("role",n._config.role)("aria-modal",n._config.ariaModal)("aria-labelledby",n._config.ariaLabel?null:n._ariaLabelledByQueue[0])("aria-label",n._config.ariaLabel)("aria-describedby",n._config.ariaDescribedBy||null)},features:[Ct],decls:1,vars:0,consts:[["cdkPortalOutlet",""]],template:function(i,n){i&1&&ne(0,U7e,0,0,"ng-template",0)},dependencies:[bc],styles:[".cdk-dialog-container{display:block;width:100%;height:100%;min-height:inherit;max-height:inherit}"],encapsulation:2})}return t})(),Fm=class{overlayRef;config;componentInstance;componentRef;containerInstance;disableClose;closed=new je;backdropClick;keydownEvents;outsidePointerEvents;id;_detachSubscription;constructor(A,e){this.overlayRef=A,this.config=e,this.disableClose=e.disableClose,this.backdropClick=A.backdropClick(),this.keydownEvents=A.keydownEvents(),this.outsidePointerEvents=A.outsidePointerEvents(),this.id=e.id,this.keydownEvents.subscribe(i=>{i.keyCode===27&&!this.disableClose&&!Tr(i)&&(i.preventDefault(),this.close(void 0,{focusOrigin:"keyboard"}))}),this.backdropClick.subscribe(()=>{this.disableClose||this.close(void 0,{focusOrigin:"mouse"})}),this._detachSubscription=A.detachments().subscribe(()=>{e.closeOnOverlayDetachments!==!1&&this.close()})}close(A,e){if(this.containerInstance){let i=this.closed;this.containerInstance._closeInteractionType=e?.focusOrigin||"program",this._detachSubscription.unsubscribe(),this.overlayRef.dispose(),i.next(A),i.complete(),this.componentInstance=this.containerInstance=null}}updatePosition(){return this.overlayRef.updatePosition(),this}updateSize(A="",e=""){return this.overlayRef.updateSize({width:A,height:e}),this}addPanelClass(A){return this.overlayRef.addPanelClass(A),this}removePanelClass(A){return this.overlayRef.removePanelClass(A),this}},T7e=new re("DialogScrollStrategy",{providedIn:"root",factory:()=>{let t=E(Or);return()=>t.scrollStrategies.block()}}),O7e=new re("DialogData"),J7e=new re("DefaultDialogConfig");var MF=(()=>{class t{_overlay=E(Or);_injector=E(Dt);_defaultOptions=E(J7e,{optional:!0});_parentDialog=E(t,{optional:!0,skipSelf:!0});_overlayContainer=E(oD);_idGenerator=E(un);_openDialogsAtThisLevel=[];_afterAllClosedAtThisLevel=new je;_afterOpenedAtThisLevel=new je;_ariaHiddenElements=new Map;_scrollStrategy=E(T7e);get openDialogs(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}get afterOpened(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}afterAllClosed=b0(()=>this.openDialogs.length?this._getAfterAllClosed():this._getAfterAllClosed().pipe(In(void 0)));constructor(){}open(e,i){let n=this._defaultOptions||new z1;i=ae(ae({},n),i),i.id=i.id||this._idGenerator.getId("cdk-dialog-"),i.id&&this.getDialogById(i.id);let o=this._getOverlayConfig(i),r=this._overlay.create(o),s=new Fm(r,i),a=this._attachContainer(r,s,i);return s.containerInstance=a,this._attachDialogContent(e,s,a,i),this.openDialogs.length||this._hideNonDialogContentFromAssistiveTechnology(),this.openDialogs.push(s),s.closed.subscribe(()=>this._removeOpenDialog(s,!0)),this.afterOpened.next(s),s}closeAll(){vF(this.openDialogs,e=>e.close())}getDialogById(e){return this.openDialogs.find(i=>i.id===e)}ngOnDestroy(){vF(this._openDialogsAtThisLevel,e=>{e.config.closeOnDestroy===!1&&this._removeOpenDialog(e,!1)}),vF(this._openDialogsAtThisLevel,e=>e.close()),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete(),this._openDialogsAtThisLevel=[]}_getOverlayConfig(e){let i=new id({positionStrategy:e.positionStrategy||this._overlay.position().global().centerHorizontally().centerVertically(),scrollStrategy:e.scrollStrategy||this._scrollStrategy(),panelClass:e.panelClass,hasBackdrop:e.hasBackdrop,direction:e.direction,minWidth:e.minWidth,minHeight:e.minHeight,maxWidth:e.maxWidth,maxHeight:e.maxHeight,width:e.width,height:e.height,disposeOnNavigation:e.closeOnNavigation});return e.backdropClass&&(i.backdropClass=e.backdropClass),i}_attachContainer(e,i,n){let o=n.injector||n.viewContainerRef?.injector,r=[{provide:z1,useValue:n},{provide:Fm,useValue:i},{provide:lE,useValue:e}],s;n.container?typeof n.container=="function"?s=n.container:(s=n.container.type,r.push(...n.container.providers(n))):s=bF;let a=new Rg(s,n.viewContainerRef,Dt.create({parent:o||this._injector,providers:r}));return e.attach(a).instance}_attachDialogContent(e,i,n,o){if(e instanceof en){let r=this._createInjector(o,i,n,void 0),s={$implicit:o.data,dialogRef:i};o.templateContext&&(s=ae(ae({},s),typeof o.templateContext=="function"?o.templateContext():o.templateContext)),n.attachTemplatePortal(new ba(e,null,s,r))}else{let r=this._createInjector(o,i,n,this._injector),s=n.attachComponentPortal(new Rg(e,o.viewContainerRef,r));i.componentRef=s,i.componentInstance=s.instance}}_createInjector(e,i,n,o){let r=e.injector||e.viewContainerRef?.injector,s=[{provide:O7e,useValue:e.data},{provide:Fm,useValue:i}];return e.providers&&(typeof e.providers=="function"?s.push(...e.providers(i,e,n)):s.push(...e.providers)),e.direction&&(!r||!r.get(Do,null,{optional:!0}))&&s.push({provide:Do,useValue:{value:e.direction,change:dA()}}),Dt.create({parent:r||o,providers:s})}_removeOpenDialog(e,i){let n=this.openDialogs.indexOf(e);n>-1&&(this.openDialogs.splice(n,1),this.openDialogs.length||(this._ariaHiddenElements.forEach((o,r)=>{o?r.setAttribute("aria-hidden",o):r.removeAttribute("aria-hidden")}),this._ariaHiddenElements.clear(),i&&this._getAfterAllClosed().next()))}_hideNonDialogContentFromAssistiveTechnology(){let e=this._overlayContainer.getContainerElement();if(e.parentElement){let i=e.parentElement.children;for(let n=i.length-1;n>-1;n--){let o=i[n];o!==e&&o.nodeName!=="SCRIPT"&&o.nodeName!=="STYLE"&&!o.hasAttribute("aria-live")&&(this._ariaHiddenElements.set(o,o.getAttribute("aria-hidden")),o.setAttribute("aria-hidden","true"))}}}_getAfterAllClosed(){let e=this._parentDialog;return e?e._getAfterAllClosed():this._afterAllClosedAtThisLevel}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function vF(t,A){let e=t.length;for(;e--;)A(t[e])}var dAe=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({providers:[MF],imports:[Lg,td,L5,td]})}return t})();function Y7e(t,A){}var sD=class{viewContainerRef;injector;id;role="dialog";panelClass="";hasBackdrop=!0;backdropClass="";disableClose=!1;width="";height="";minWidth;minHeight;maxWidth;maxHeight;position;data=null;direction;ariaDescribedBy=null;ariaLabelledBy=null;ariaLabel=null;ariaModal=!1;autoFocus="first-tabbable";restoreFocus=!0;delayFocusTrap=!0;scrollStrategy;closeOnNavigation=!0;componentFactoryResolver;enterAnimationDuration;exitAnimationDuration},SF="mdc-dialog--open",CAe="mdc-dialog--opening",IAe="mdc-dialog--closing",H7e=150,z7e=75,P7e=(()=>{class t extends bF{_animationMode=E(Oi,{optional:!0});_animationStateChanged=new Ve;_animationsEnabled=this._animationMode!=="NoopAnimations";_actionSectionCount=0;_hostElement=this._elementRef.nativeElement;_enterAnimationDuration=this._animationsEnabled?hAe(this._config.enterAnimationDuration)??H7e:0;_exitAnimationDuration=this._animationsEnabled?hAe(this._config.exitAnimationDuration)??z7e:0;_animationTimer=null;_contentAttached(){super._contentAttached(),this._startOpenAnimation()}_startOpenAnimation(){this._animationStateChanged.emit({state:"opening",totalTime:this._enterAnimationDuration}),this._animationsEnabled?(this._hostElement.style.setProperty(uAe,`${this._enterAnimationDuration}ms`),this._requestAnimationFrame(()=>this._hostElement.classList.add(CAe,SF)),this._waitForAnimationToComplete(this._enterAnimationDuration,this._finishDialogOpen)):(this._hostElement.classList.add(SF),Promise.resolve().then(()=>this._finishDialogOpen()))}_startExitAnimation(){this._animationStateChanged.emit({state:"closing",totalTime:this._exitAnimationDuration}),this._hostElement.classList.remove(SF),this._animationsEnabled?(this._hostElement.style.setProperty(uAe,`${this._exitAnimationDuration}ms`),this._requestAnimationFrame(()=>this._hostElement.classList.add(IAe)),this._waitForAnimationToComplete(this._exitAnimationDuration,this._finishDialogClose)):Promise.resolve().then(()=>this._finishDialogClose())}_updateActionSectionCount(e){this._actionSectionCount+=e,this._changeDetectorRef.markForCheck()}_finishDialogOpen=()=>{this._clearAnimationClasses(),this._openAnimationDone(this._enterAnimationDuration)};_finishDialogClose=()=>{this._clearAnimationClasses(),this._animationStateChanged.emit({state:"closed",totalTime:this._exitAnimationDuration})};_clearAnimationClasses(){this._hostElement.classList.remove(CAe,IAe)}_waitForAnimationToComplete(e,i){this._animationTimer!==null&&clearTimeout(this._animationTimer),this._animationTimer=setTimeout(i,e)}_requestAnimationFrame(e){this._ngZone.runOutsideAngular(()=>{typeof requestAnimationFrame=="function"?requestAnimationFrame(e):e()})}_captureInitialFocus(){this._config.delayFocusTrap||this._trapFocus()}_openAnimationDone(e){this._config.delayFocusTrap&&this._trapFocus(),this._animationStateChanged.next({state:"opened",totalTime:e})}ngOnDestroy(){super.ngOnDestroy(),this._animationTimer!==null&&clearTimeout(this._animationTimer)}attachComponentPortal(e){let i=super.attachComponentPortal(e);return i.location.nativeElement.classList.add("mat-mdc-dialog-component-host"),i}static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275cmp=xe({type:t,selectors:[["mat-dialog-container"]],hostAttrs:["tabindex","-1",1,"mat-mdc-dialog-container","mdc-dialog"],hostVars:10,hostBindings:function(i,n){i&2&&(ea("id",n._config.id),AA("aria-modal",n._config.ariaModal)("role",n._config.role)("aria-labelledby",n._config.ariaLabel?null:n._ariaLabelledByQueue[0])("aria-label",n._config.ariaLabel)("aria-describedby",n._config.ariaDescribedBy||null),iA("_mat-animation-noopable",!n._animationsEnabled)("mat-mdc-dialog-container-with-actions",n._actionSectionCount>0))},features:[Ct],decls:3,vars:0,consts:[[1,"mat-mdc-dialog-inner-container","mdc-dialog__container"],[1,"mat-mdc-dialog-surface","mdc-dialog__surface"],["cdkPortalOutlet",""]],template:function(i,n){i&1&&(m(0,"div",0)(1,"div",1),ne(2,Y7e,0,0,"ng-template",2),p()())},dependencies:[bc],styles:['.mat-mdc-dialog-container{width:100%;height:100%;display:block;box-sizing:border-box;max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit;outline:0}.cdk-overlay-pane.mat-mdc-dialog-panel{max-width:var(--mat-dialog-container-max-width, 560px);min-width:var(--mat-dialog-container-min-width, 280px)}@media(max-width: 599px){.cdk-overlay-pane.mat-mdc-dialog-panel{max-width:var(--mat-dialog-container-small-max-width, calc(100vw - 32px))}}.mat-mdc-dialog-inner-container{display:flex;flex-direction:row;align-items:center;justify-content:space-around;box-sizing:border-box;height:100%;opacity:0;transition:opacity linear var(--mat-dialog-transition-duration, 0ms);max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit}.mdc-dialog--closing .mat-mdc-dialog-inner-container{transition:opacity 75ms linear;transform:none}.mdc-dialog--open .mat-mdc-dialog-inner-container{opacity:1}._mat-animation-noopable .mat-mdc-dialog-inner-container{transition:none}.mat-mdc-dialog-surface{display:flex;flex-direction:column;flex-grow:0;flex-shrink:0;box-sizing:border-box;width:100%;height:100%;position:relative;overflow-y:auto;outline:0;transform:scale(0.8);transition:transform var(--mat-dialog-transition-duration, 0ms) cubic-bezier(0, 0, 0.2, 1);max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit;box-shadow:var(--mat-dialog-container-elevation-shadow, none);border-radius:var(--mdc-dialog-container-shape, var(--mat-sys-corner-extra-large, 4px));background-color:var(--mdc-dialog-container-color, var(--mat-sys-surface, white))}[dir=rtl] .mat-mdc-dialog-surface{text-align:right}.mdc-dialog--open .mat-mdc-dialog-surface,.mdc-dialog--closing .mat-mdc-dialog-surface{transform:none}._mat-animation-noopable .mat-mdc-dialog-surface{transition:none}.mat-mdc-dialog-surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:2px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mat-mdc-dialog-title{display:block;position:relative;flex-shrink:0;box-sizing:border-box;margin:0 0 1px;padding:var(--mat-dialog-headline-padding, 6px 24px 13px)}.mat-mdc-dialog-title::before{display:inline-block;width:0;height:40px;content:"";vertical-align:0}[dir=rtl] .mat-mdc-dialog-title{text-align:right}.mat-mdc-dialog-container .mat-mdc-dialog-title{color:var(--mdc-dialog-subhead-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mdc-dialog-subhead-font, var(--mat-sys-headline-small-font, inherit));line-height:var(--mdc-dialog-subhead-line-height, var(--mat-sys-headline-small-line-height, 1.5rem));font-size:var(--mdc-dialog-subhead-size, var(--mat-sys-headline-small-size, 1rem));font-weight:var(--mdc-dialog-subhead-weight, var(--mat-sys-headline-small-weight, 400));letter-spacing:var(--mdc-dialog-subhead-tracking, var(--mat-sys-headline-small-tracking, 0.03125em))}.mat-mdc-dialog-content{display:block;flex-grow:1;box-sizing:border-box;margin:0;overflow:auto;max-height:65vh}.mat-mdc-dialog-content>:first-child{margin-top:0}.mat-mdc-dialog-content>:last-child{margin-bottom:0}.mat-mdc-dialog-container .mat-mdc-dialog-content{color:var(--mdc-dialog-supporting-text-color, var(--mat-sys-on-surface-variant, rgba(0, 0, 0, 0.6)));font-family:var(--mdc-dialog-supporting-text-font, var(--mat-sys-body-medium-font, inherit));line-height:var(--mdc-dialog-supporting-text-line-height, var(--mat-sys-body-medium-line-height, 1.5rem));font-size:var(--mdc-dialog-supporting-text-size, var(--mat-sys-body-medium-size, 1rem));font-weight:var(--mdc-dialog-supporting-text-weight, var(--mat-sys-body-medium-weight, 400));letter-spacing:var(--mdc-dialog-supporting-text-tracking, var(--mat-sys-body-medium-tracking, 0.03125em))}.mat-mdc-dialog-container .mat-mdc-dialog-content{padding:var(--mat-dialog-content-padding, 20px 24px)}.mat-mdc-dialog-container-with-actions .mat-mdc-dialog-content{padding:var(--mat-dialog-with-actions-content-padding, 20px 24px 0)}.mat-mdc-dialog-container .mat-mdc-dialog-title+.mat-mdc-dialog-content{padding-top:0}.mat-mdc-dialog-actions{display:flex;position:relative;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;box-sizing:border-box;min-height:52px;margin:0;padding:8px;border-top:1px solid rgba(0,0,0,0);padding:var(--mat-dialog-actions-padding, 16px 24px);justify-content:var(--mat-dialog-actions-alignment, flex-end)}@media(forced-colors: active){.mat-mdc-dialog-actions{border-top-color:CanvasText}}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-start,.mat-mdc-dialog-actions[align=start]{justify-content:start}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-center,.mat-mdc-dialog-actions[align=center]{justify-content:center}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-end,.mat-mdc-dialog-actions[align=end]{justify-content:flex-end}.mat-mdc-dialog-actions .mat-button-base+.mat-button-base,.mat-mdc-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-mdc-dialog-actions .mat-button-base+.mat-button-base,[dir=rtl] .mat-mdc-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}.mat-mdc-dialog-component-host{display:contents}'],encapsulation:2})}return t})(),uAe="--mat-dialog-transition-duration";function hAe(t){return t==null?null:typeof t=="number"?t:t.endsWith("ms")?Za(t.substring(0,t.length-2)):t.endsWith("s")?Za(t.substring(0,t.length-1))*1e3:t==="0"?0:null}var rD=function(t){return t[t.OPEN=0]="OPEN",t[t.CLOSING=1]="CLOSING",t[t.CLOSED=2]="CLOSED",t}(rD||{}),co=class{_ref;_containerInstance;componentInstance;componentRef;disableClose;id;_afterOpened=new je;_beforeClosed=new je;_result;_closeFallbackTimeout;_state=rD.OPEN;_closeInteractionType;constructor(A,e,i){this._ref=A,this._containerInstance=i,this.disableClose=e.disableClose,this.id=A.id,A.addPanelClass("mat-mdc-dialog-panel"),i._animationStateChanged.pipe($A(n=>n.state==="opened"),Pn(1)).subscribe(()=>{this._afterOpened.next(),this._afterOpened.complete()}),i._animationStateChanged.pipe($A(n=>n.state==="closed"),Pn(1)).subscribe(()=>{clearTimeout(this._closeFallbackTimeout),this._finishDialogClose()}),A.overlayRef.detachments().subscribe(()=>{this._beforeClosed.next(this._result),this._beforeClosed.complete(),this._finishDialogClose()}),Bi(this.backdropClick(),this.keydownEvents().pipe($A(n=>n.keyCode===27&&!this.disableClose&&!Tr(n)))).subscribe(n=>{this.disableClose||(n.preventDefault(),BAe(this,n.type==="keydown"?"keyboard":"mouse"))})}close(A){this._result=A,this._containerInstance._animationStateChanged.pipe($A(e=>e.state==="closing"),Pn(1)).subscribe(e=>{this._beforeClosed.next(A),this._beforeClosed.complete(),this._ref.overlayRef.detachBackdrop(),this._closeFallbackTimeout=setTimeout(()=>this._finishDialogClose(),e.totalTime+100)}),this._state=rD.CLOSING,this._containerInstance._startExitAnimation()}afterOpened(){return this._afterOpened}afterClosed(){return this._ref.closed}beforeClosed(){return this._beforeClosed}backdropClick(){return this._ref.backdropClick}keydownEvents(){return this._ref.keydownEvents}updatePosition(A){let e=this._ref.config.positionStrategy;return A&&(A.left||A.right)?A.left?e.left(A.left):e.right(A.right):e.centerHorizontally(),A&&(A.top||A.bottom)?A.top?e.top(A.top):e.bottom(A.bottom):e.centerVertically(),this._ref.updatePosition(),this}updateSize(A="",e=""){return this._ref.updateSize(A,e),this}addPanelClass(A){return this._ref.addPanelClass(A),this}removePanelClass(A){return this._ref.removePanelClass(A),this}getState(){return this._state}_finishDialogClose(){this._state=rD.CLOSED,this._ref.close(this._result,{focusOrigin:this._closeInteractionType}),this.componentInstance=null}};function BAe(t,A,e){return t._closeInteractionType=A,t.close(e)}var qo=new re("MatMdcDialogData"),j7e=new re("mat-mdc-dialog-default-options"),V7e=new re("mat-mdc-dialog-scroll-strategy",{providedIn:"root",factory:()=>{let t=E(Or);return()=>t.scrollStrategies.block()}});var na=(()=>{class t{_overlay=E(Or);_defaultOptions=E(j7e,{optional:!0});_scrollStrategy=E(V7e);_parentDialog=E(t,{optional:!0,skipSelf:!0});_idGenerator=E(un);_dialog=E(MF);_openDialogsAtThisLevel=[];_afterAllClosedAtThisLevel=new je;_afterOpenedAtThisLevel=new je;dialogConfigClass=sD;_dialogRefConstructor;_dialogContainerType;_dialogDataToken;get openDialogs(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}get afterOpened(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}_getAfterAllClosed(){let e=this._parentDialog;return e?e._getAfterAllClosed():this._afterAllClosedAtThisLevel}afterAllClosed=b0(()=>this.openDialogs.length?this._getAfterAllClosed():this._getAfterAllClosed().pipe(In(void 0)));constructor(){this._dialogRefConstructor=co,this._dialogContainerType=P7e,this._dialogDataToken=qo}open(e,i){let n;i=ae(ae({},this._defaultOptions||new sD),i),i.id=i.id||this._idGenerator.getId("mat-mdc-dialog-"),i.scrollStrategy=i.scrollStrategy||this._scrollStrategy();let o=this._dialog.open(e,_A(ae({},i),{positionStrategy:this._overlay.position().global().centerHorizontally().centerVertically(),disableClose:!0,closeOnDestroy:!1,closeOnOverlayDetachments:!1,container:{type:this._dialogContainerType,providers:()=>[{provide:this.dialogConfigClass,useValue:i},{provide:z1,useValue:i}]},templateContext:()=>({dialogRef:n}),providers:(r,s,a)=>(n=new this._dialogRefConstructor(r,i,a),n.updatePosition(i?.position),[{provide:this._dialogContainerType,useValue:a},{provide:this._dialogDataToken,useValue:s.data},{provide:this._dialogRefConstructor,useValue:n}])}));return n.componentRef=o.componentRef,n.componentInstance=o.componentInstance,this.openDialogs.push(n),this.afterOpened.next(n),n.afterClosed().subscribe(()=>{let r=this.openDialogs.indexOf(n);r>-1&&(this.openDialogs.splice(r,1),this.openDialogs.length||this._getAfterAllClosed().next())}),n}closeAll(){this._closeDialogs(this.openDialogs)}getDialogById(e){return this.openDialogs.find(i=>i.id===e)}ngOnDestroy(){this._closeDialogs(this._openDialogsAtThisLevel),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete()}_closeDialogs(e){let i=e.length;for(;i--;)e[i].close()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),Jl=(()=>{class t{dialogRef=E(co,{optional:!0});_elementRef=E(eA);_dialog=E(na);ariaLabel;type="button";dialogResult;_matDialogClose;constructor(){}ngOnInit(){this.dialogRef||(this.dialogRef=fAe(this._elementRef,this._dialog.openDialogs))}ngOnChanges(e){let i=e._matDialogClose||e._matDialogCloseResult;i&&(this.dialogResult=i.currentValue)}_onButtonClick(e){BAe(this.dialogRef,e.screenX===0&&e.screenY===0?"keyboard":"mouse",this.dialogResult)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","mat-dialog-close",""],["","matDialogClose",""]],hostVars:2,hostBindings:function(i,n){i&1&&ee("click",function(r){return n._onButtonClick(r)}),i&2&&AA("aria-label",n.ariaLabel||null)("type",n.type)},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],type:"type",dialogResult:[0,"mat-dialog-close","dialogResult"],_matDialogClose:[0,"matDialogClose","_matDialogClose"]},exportAs:["matDialogClose"],features:[ti]})}return t})(),EAe=(()=>{class t{_dialogRef=E(co,{optional:!0});_elementRef=E(eA);_dialog=E(na);constructor(){}ngOnInit(){this._dialogRef||(this._dialogRef=fAe(this._elementRef,this._dialog.openDialogs)),this._dialogRef&&Promise.resolve().then(()=>{this._onAdd()})}ngOnDestroy(){this._dialogRef?._containerInstance&&Promise.resolve().then(()=>{this._onRemove()})}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t})}return t})(),tr=(()=>{class t extends EAe{id=E(un).getId("mat-mdc-dialog-title-");_onAdd(){this._dialogRef._containerInstance?._addAriaLabelledBy?.(this.id)}_onRemove(){this._dialogRef?._containerInstance?._removeAriaLabelledBy?.(this.id)}static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275dir=Oe({type:t,selectors:[["","mat-dialog-title",""],["","matDialogTitle",""]],hostAttrs:[1,"mat-mdc-dialog-title","mdc-dialog__title"],hostVars:1,hostBindings:function(i,n){i&2&&ea("id",n.id)},inputs:{id:"id"},exportAs:["matDialogTitle"],features:[Ct]})}return t})(),jr=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","mat-dialog-content",""],["mat-dialog-content"],["","matDialogContent",""]],hostAttrs:[1,"mat-mdc-dialog-content","mdc-dialog__content"],features:[Hw([f2])]})}return t})(),kr=(()=>{class t extends EAe{align;_onAdd(){this._dialogRef._containerInstance?._updateActionSectionCount?.(1)}_onRemove(){this._dialogRef._containerInstance?._updateActionSectionCount?.(-1)}static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275dir=Oe({type:t,selectors:[["","mat-dialog-actions",""],["mat-dialog-actions"],["","matDialogActions",""]],hostAttrs:[1,"mat-mdc-dialog-actions","mdc-dialog__actions"],hostVars:6,hostBindings:function(i,n){i&2&&iA("mat-mdc-dialog-actions-align-start",n.align==="start")("mat-mdc-dialog-actions-align-center",n.align==="center")("mat-mdc-dialog-actions-align-end",n.align==="end")},inputs:{align:"align"},features:[Ct]})}return t})();function fAe(t,A){let e=t.nativeElement.parentElement;for(;e&&!e.classList.contains("mat-mdc-dialog-container");)e=e.parentElement;return e?A.find(i=>i.id===e.id):null}var QAe=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({providers:[na],imports:[dAe,Lg,td,ui,ui]})}return t})();var aD=(()=>{class t{get vertical(){return this._vertical}set vertical(e){this._vertical=Sr(e)}_vertical=!1;get inset(){return this._inset}set inset(e){this._inset=Sr(e)}_inset=!1;static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-divider"]],hostAttrs:["role","separator",1,"mat-divider"],hostVars:7,hostBindings:function(i,n){i&2&&(AA("aria-orientation",n.vertical?"vertical":"horizontal"),iA("mat-divider-vertical",n.vertical)("mat-divider-horizontal",!n.vertical)("mat-divider-inset",n.inset))},inputs:{vertical:"vertical",inset:"inset"},decls:0,vars:0,template:function(i,n){},styles:[".mat-divider{display:block;margin:0;border-top-style:solid;border-top-color:var(--mat-divider-color, var(--mat-sys-outline));border-top-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-vertical{border-top:0;border-right-style:solid;border-right-color:var(--mat-divider-color, var(--mat-sys-outline));border-right-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-inset{margin-left:80px}[dir=rtl] .mat-divider.mat-divider-inset{margin-left:auto;margin-right:80px}"],encapsulation:2,changeDetection:0})}return t})(),mAe=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({imports:[ui,ui]})}return t})();var W7e=["*"],cD;function Z7e(){if(cD===void 0&&(cD=null,typeof window<"u")){let t=window;t.trustedTypes!==void 0&&(cD=t.trustedTypes.createPolicy("angular#components",{createHTML:A=>A}))}return cD}function Gm(t){return Z7e()?.createHTML(t)||t}function pAe(t){return Error(`Unable to find icon with the name "${t}"`)}function X7e(){return Error("Could not find HttpClient for use with Angular Material icons. Please add provideHttpClient() to your providers.")}function wAe(t){return Error(`The URL provided to MatIconRegistry was not trusted as a resource URL via Angular's DomSanitizer. Attempted URL was "${t}".`)}function yAe(t){return Error(`The literal provided to MatIconRegistry was not trusted as safe HTML by Angular's DomSanitizer. Attempted literal was "${t}".`)}var Q2=class{url;svgText;options;svgElement;constructor(A,e,i){this.url=A,this.svgText=e,this.options=i}},$7e=(()=>{class t{_httpClient;_sanitizer;_errorHandler;_document;_svgIconConfigs=new Map;_iconSetConfigs=new Map;_cachedIconsByUrl=new Map;_inProgressUrlFetches=new Map;_fontCssClassesByAlias=new Map;_resolvers=[];_defaultFontSetClass=["material-icons","mat-ligature-font"];constructor(e,i,n,o){this._httpClient=e,this._sanitizer=i,this._errorHandler=o,this._document=n}addSvgIcon(e,i,n){return this.addSvgIconInNamespace("",e,i,n)}addSvgIconLiteral(e,i,n){return this.addSvgIconLiteralInNamespace("",e,i,n)}addSvgIconInNamespace(e,i,n,o){return this._addSvgIconConfig(e,i,new Q2(n,null,o))}addSvgIconResolver(e){return this._resolvers.push(e),this}addSvgIconLiteralInNamespace(e,i,n,o){let r=this._sanitizer.sanitize(Ls.HTML,n);if(!r)throw yAe(n);let s=Gm(r);return this._addSvgIconConfig(e,i,new Q2("",s,o))}addSvgIconSet(e,i){return this.addSvgIconSetInNamespace("",e,i)}addSvgIconSetLiteral(e,i){return this.addSvgIconSetLiteralInNamespace("",e,i)}addSvgIconSetInNamespace(e,i,n){return this._addSvgIconSetConfig(e,new Q2(i,null,n))}addSvgIconSetLiteralInNamespace(e,i,n){let o=this._sanitizer.sanitize(Ls.HTML,i);if(!o)throw yAe(i);let r=Gm(o);return this._addSvgIconSetConfig(e,new Q2("",r,n))}registerFontClassAlias(e,i=e){return this._fontCssClassesByAlias.set(e,i),this}classNameForFontAlias(e){return this._fontCssClassesByAlias.get(e)||e}setDefaultFontSetClass(...e){return this._defaultFontSetClass=e,this}getDefaultFontSetClass(){return this._defaultFontSetClass}getSvgIconFromUrl(e){let i=this._sanitizer.sanitize(Ls.RESOURCE_URL,e);if(!i)throw wAe(e);let n=this._cachedIconsByUrl.get(i);return n?dA(lD(n)):this._loadSvgIconFromConfig(new Q2(e,null)).pipe(Pt(o=>this._cachedIconsByUrl.set(i,o)),aA(o=>lD(o)))}getNamedSvgIcon(e,i=""){let n=DAe(i,e),o=this._svgIconConfigs.get(n);if(o)return this._getSvgFromConfig(o);if(o=this._getIconConfigFromResolvers(i,e),o)return this._svgIconConfigs.set(n,o),this._getSvgFromConfig(o);let r=this._iconSetConfigs.get(i);return r?this._getSvgFromIconSetConfigs(e,r):C1(pAe(n))}ngOnDestroy(){this._resolvers=[],this._svgIconConfigs.clear(),this._iconSetConfigs.clear(),this._cachedIconsByUrl.clear()}_getSvgFromConfig(e){return e.svgText?dA(lD(this._svgElementFromConfig(e))):this._loadSvgIconFromConfig(e).pipe(aA(i=>lD(i)))}_getSvgFromIconSetConfigs(e,i){let n=this._extractIconWithNameFromAnySet(e,i);if(n)return dA(n);let o=i.filter(r=>!r.svgText).map(r=>this._loadSvgIconSetFromConfig(r).pipe(br(s=>{let c=`Loading icon set URL: ${this._sanitizer.sanitize(Ls.RESOURCE_URL,r.url)} failed: ${s.message}`;return this._errorHandler.handleError(new Error(c)),dA(null)})));return $Q(o).pipe(aA(()=>{let r=this._extractIconWithNameFromAnySet(e,i);if(!r)throw pAe(e);return r}))}_extractIconWithNameFromAnySet(e,i){for(let n=i.length-1;n>=0;n--){let o=i[n];if(o.svgText&&o.svgText.toString().indexOf(e)>-1){let r=this._svgElementFromConfig(o),s=this._extractSvgIconFromSet(r,e,o.options);if(s)return s}}return null}_loadSvgIconFromConfig(e){return this._fetchIcon(e).pipe(Pt(i=>e.svgText=i),aA(()=>this._svgElementFromConfig(e)))}_loadSvgIconSetFromConfig(e){return e.svgText?dA(null):this._fetchIcon(e).pipe(Pt(i=>e.svgText=i))}_extractSvgIconFromSet(e,i,n){let o=e.querySelector(`[id="${i}"]`);if(!o)return null;let r=o.cloneNode(!0);if(r.removeAttribute("id"),r.nodeName.toLowerCase()==="svg")return this._setSvgAttributes(r,n);if(r.nodeName.toLowerCase()==="symbol")return this._setSvgAttributes(this._toSvgElement(r),n);let s=this._svgElementFromString(Gm(""));return s.appendChild(r),this._setSvgAttributes(s,n)}_svgElementFromString(e){let i=this._document.createElement("DIV");i.innerHTML=e;let n=i.querySelector("svg");if(!n)throw Error(" tag not found");return n}_toSvgElement(e){let i=this._svgElementFromString(Gm("")),n=e.attributes;for(let o=0;oGm(c)),S0(()=>this._inProgressUrlFetches.delete(r)),Rl());return this._inProgressUrlFetches.set(r,a),a}_addSvgIconConfig(e,i,n){return this._svgIconConfigs.set(DAe(e,i),n),this}_addSvgIconSetConfig(e,i){let n=this._iconSetConfigs.get(e);return n?n.push(i):this._iconSetConfigs.set(e,[i]),this}_svgElementFromConfig(e){if(!e.svgElement){let i=this._svgElementFromString(e.svgText);this._setSvgAttributes(i,e.options),e.svgElement=i}return e.svgElement}_getIconConfigFromResolvers(e,i){for(let n=0;nA?A.pathname+A.search:""}}var vAe=["clip-path","color-profile","src","cursor","fill","filter","marker","marker-start","marker-mid","marker-end","mask","stroke"],nbe=vAe.map(t=>`[${t}]`).join(", "),obe=/^url\(['"]?#(.*?)['"]?\)$/,ir=(()=>{class t{_elementRef=E(eA);_iconRegistry=E($7e);_location=E(tbe);_errorHandler=E(Va);_defaultColor;get color(){return this._color||this._defaultColor}set color(e){this._color=e}_color;inline=!1;get svgIcon(){return this._svgIcon}set svgIcon(e){e!==this._svgIcon&&(e?this._updateSvgIcon(e):this._svgIcon&&this._clearSvgElement(),this._svgIcon=e)}_svgIcon;get fontSet(){return this._fontSet}set fontSet(e){let i=this._cleanupFontValue(e);i!==this._fontSet&&(this._fontSet=i,this._updateFontIconClasses())}_fontSet;get fontIcon(){return this._fontIcon}set fontIcon(e){let i=this._cleanupFontValue(e);i!==this._fontIcon&&(this._fontIcon=i,this._updateFontIconClasses())}_fontIcon;_previousFontSetClass=[];_previousFontIconClass;_svgName;_svgNamespace;_previousPath;_elementsWithExternalReferences;_currentIconFetch=Ot.EMPTY;constructor(){let e=E(new ws("aria-hidden"),{optional:!0}),i=E(Abe,{optional:!0});i&&(i.color&&(this.color=this._defaultColor=i.color),i.fontSet&&(this.fontSet=i.fontSet)),e||this._elementRef.nativeElement.setAttribute("aria-hidden","true")}_splitIconName(e){if(!e)return["",""];let i=e.split(":");switch(i.length){case 1:return["",i[0]];case 2:return i;default:throw Error(`Invalid icon name: "${e}"`)}}ngOnInit(){this._updateFontIconClasses()}ngAfterViewChecked(){let e=this._elementsWithExternalReferences;if(e&&e.size){let i=this._location.getPathname();i!==this._previousPath&&(this._previousPath=i,this._prependPathToReferences(i))}}ngOnDestroy(){this._currentIconFetch.unsubscribe(),this._elementsWithExternalReferences&&this._elementsWithExternalReferences.clear()}_usingFontIcon(){return!this.svgIcon}_setSvgElement(e){this._clearSvgElement();let i=this._location.getPathname();this._previousPath=i,this._cacheChildrenWithExternalReferences(e),this._prependPathToReferences(i),this._elementRef.nativeElement.appendChild(e)}_clearSvgElement(){let e=this._elementRef.nativeElement,i=e.childNodes.length;for(this._elementsWithExternalReferences&&this._elementsWithExternalReferences.clear();i--;){let n=e.childNodes[i];(n.nodeType!==1||n.nodeName.toLowerCase()==="svg")&&n.remove()}}_updateFontIconClasses(){if(!this._usingFontIcon())return;let e=this._elementRef.nativeElement,i=(this.fontSet?this._iconRegistry.classNameForFontAlias(this.fontSet).split(/ +/):this._iconRegistry.getDefaultFontSetClass()).filter(n=>n.length>0);this._previousFontSetClass.forEach(n=>e.classList.remove(n)),i.forEach(n=>e.classList.add(n)),this._previousFontSetClass=i,this.fontIcon!==this._previousFontIconClass&&!i.includes("mat-ligature-font")&&(this._previousFontIconClass&&e.classList.remove(this._previousFontIconClass),this.fontIcon&&e.classList.add(this.fontIcon),this._previousFontIconClass=this.fontIcon)}_cleanupFontValue(e){return typeof e=="string"?e.trim().split(" ")[0]:e}_prependPathToReferences(e){let i=this._elementsWithExternalReferences;i&&i.forEach((n,o)=>{n.forEach(r=>{o.setAttribute(r.name,`url('${e}#${r.value}')`)})})}_cacheChildrenWithExternalReferences(e){let i=e.querySelectorAll(nbe),n=this._elementsWithExternalReferences=this._elementsWithExternalReferences||new Map;for(let o=0;o{let s=i[o],a=s.getAttribute(r),c=a?a.match(obe):null;if(c){let l=n.get(s);l||(l=[],n.set(s,l)),l.push({name:r,value:c[1]})}})}_updateSvgIcon(e){if(this._svgNamespace=null,this._svgName=null,this._currentIconFetch.unsubscribe(),e){let[i,n]=this._splitIconName(e);i&&(this._svgNamespace=i),n&&(this._svgName=n),this._currentIconFetch=this._iconRegistry.getNamedSvgIcon(n,i).pipe(Pn(1)).subscribe(o=>this._setSvgElement(o),o=>{let r=`Error retrieving icon ${i}:${n}! ${o.message}`;this._errorHandler.handleError(new Error(r))})}}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-icon"]],hostAttrs:["role","img",1,"mat-icon","notranslate"],hostVars:10,hostBindings:function(i,n){i&2&&(AA("data-mat-icon-type",n._usingFontIcon()?"font":"svg")("data-mat-icon-name",n._svgName||n.fontIcon)("data-mat-icon-namespace",n._svgNamespace||n.fontSet)("fontIcon",n._usingFontIcon()?n.fontIcon:null),Lo(n.color?"mat-"+n.color:""),iA("mat-icon-inline",n.inline)("mat-icon-no-color",n.color!=="primary"&&n.color!=="accent"&&n.color!=="warn"))},inputs:{color:"color",inline:[2,"inline","inline",IA],svgIcon:"svgIcon",fontSet:"fontSet",fontIcon:"fontIcon"},exportAs:["matIcon"],ngContentSelectors:W7e,decls:1,vars:0,template:function(i,n){i&1&&(Kt(),NA(0))},styles:["mat-icon,mat-icon.mat-primary,mat-icon.mat-accent,mat-icon.mat-warn{color:var(--mat-icon-color, inherit)}.mat-icon{-webkit-user-select:none;user-select:none;background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px;overflow:hidden}.mat-icon.mat-icon-inline{font-size:inherit;height:inherit;line-height:inherit;width:inherit}.mat-icon.mat-ligature-font[fontIcon]::before{content:attr(fontIcon)}[dir=rtl] .mat-icon-rtl-mirror{transform:scale(-1, 1)}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon{display:block}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button .mat-icon{margin:auto}"],encapsulation:2,changeDetection:0})}return t})(),gD=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({imports:[ui,ui]})}return t})();var rbe=["trigger"],sbe=["panel"],abe=[[["mat-select-trigger"]],"*"],cbe=["mat-select-trigger","*"];function lbe(t,A){if(t&1&&(m(0,"span",4),T(1),p()),t&2){let e=M();y(),Pe(e.placeholder)}}function gbe(t,A){t&1&&NA(0)}function dbe(t,A){if(t&1&&(m(0,"span",11),T(1),p()),t&2){let e=M(2);y(),Pe(e.triggerValue)}}function Cbe(t,A){if(t&1&&(m(0,"span",5),ne(1,gbe,1,0)(2,dbe,2,1,"span",11),p()),t&2){let e=M();y(),$(e.customTrigger?1:2)}}function Ibe(t,A){if(t&1){let e=Ue();m(0,"div",12,1),ee("@transformPanel.done",function(n){q(e);let o=M();return W(o._panelDoneAnimatingStream.next(n.toState))})("keydown",function(n){q(e);let o=M();return W(o._handleKeydown(n))}),NA(2,1),p()}if(t&2){let e=M();pW("mat-mdc-select-panel mdc-menu-surface mdc-menu-surface--open ",e._getPanelTheme(),""),te("ngClass",e.panelClass)("@transformPanel","showing"),AA("id",e.id+"-panel")("aria-multiselectable",e.multiple)("aria-label",e.ariaLabel||null)("aria-labelledby",e._getPanelAriaLabelledby())}}var ube={transformPanelWrap:ll("transformPanelWrap",[Fs("* => void",ON("@transformPanel",[TN()],{optional:!0}))]),transformPanel:ll("transformPanel",[tc("void",Vo({opacity:0,transform:"scale(1, 0.8)"})),Fs("void => showing",ia("120ms cubic-bezier(0, 0, 0.2, 1)",Vo({opacity:1,transform:"scale(1, 1)"}))),Fs("* => void",ia("100ms linear",Vo({opacity:0})))])};var MAe=new re("mat-select-scroll-strategy",{providedIn:"root",factory:()=>{let t=E(Or);return()=>t.scrollStrategies.reposition()}});function hbe(t){return()=>t.scrollStrategies.reposition()}var Bbe=new re("MAT_SELECT_CONFIG"),Ebe={provide:MAe,deps:[Or],useFactory:hbe},fbe=new re("MatSelectTrigger"),kF=class{source;value;constructor(A,e){this.source=A,this.value=e}},Yl=(()=>{class t{_viewportRuler=E(Ol);_changeDetectorRef=E(ut);_elementRef=E(eA);_dir=E(Do,{optional:!0});_idGenerator=E(un);_parentFormField=E(q4,{optional:!0});ngControl=E(rl,{self:!0,optional:!0});_liveAnnouncer=E(N5);_defaultOptions=E(Bbe,{optional:!0});_initialized=new je;options;optionGroups;customTrigger;_positions=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",panelClass:"mat-mdc-select-panel-above"},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",panelClass:"mat-mdc-select-panel-above"}];_scrollOptionIntoView(e){let i=this.options.toArray()[e];if(i){let n=this.panel.nativeElement,o=cX(e,this.options,this.optionGroups),r=i._getHostElement();e===0&&o===1?n.scrollTop=0:n.scrollTop=lX(r.offsetTop,r.offsetHeight,n.scrollTop,n.offsetHeight)}}_positioningSettled(){this._scrollOptionIntoView(this._keyManager.activeItemIndex||0)}_getChangeEvent(e){return new kF(this,e)}_scrollStrategyFactory=E(MAe);_panelOpen=!1;_compareWith=(e,i)=>e===i;_uid=this._idGenerator.getId("mat-select-");_triggerAriaLabelledBy=null;_previousControl;_destroy=new je;_errorStateTracker;stateChanges=new je;disableAutomaticLabeling=!0;userAriaDescribedBy;_selectionModel;_keyManager;_preferredOverlayOrigin;_overlayWidth;_onChange=()=>{};_onTouched=()=>{};_valueId=this._idGenerator.getId("mat-select-value-");_panelDoneAnimatingStream=new je;_scrollStrategy;_overlayPanelClass=this._defaultOptions?.overlayPanelClass||"";get focused(){return this._focused||this._panelOpen}_focused=!1;controlType="mat-select";trigger;panel;_overlayDir;panelClass;disabled=!1;disableRipple=!1;tabIndex=0;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(e){this._hideSingleSelectionIndicator=e,this._syncParentProperties()}_hideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get placeholder(){return this._placeholder}set placeholder(e){this._placeholder=e,this.stateChanges.next()}_placeholder;get required(){return this._required??this.ngControl?.control?.hasValidator(ol.required)??!1}set required(e){this._required=e,this.stateChanges.next()}_required;get multiple(){return this._multiple}set multiple(e){this._selectionModel,this._multiple=e}_multiple=!1;disableOptionCentering=this._defaultOptions?.disableOptionCentering??!1;get compareWith(){return this._compareWith}set compareWith(e){this._compareWith=e,this._selectionModel&&this._initializeSelection()}get value(){return this._value}set value(e){this._assignValue(e)&&this._onChange(e)}_value;ariaLabel="";ariaLabelledby;get errorStateMatcher(){return this._errorStateTracker.matcher}set errorStateMatcher(e){this._errorStateTracker.matcher=e}typeaheadDebounceInterval;sortComparator;get id(){return this._id}set id(e){this._id=e||this._uid,this.stateChanges.next()}_id;get errorState(){return this._errorStateTracker.errorState}set errorState(e){this._errorStateTracker.errorState=e}panelWidth=this._defaultOptions&&typeof this._defaultOptions.panelWidth<"u"?this._defaultOptions.panelWidth:"auto";canSelectNullableOptions=this._defaultOptions?.canSelectNullableOptions??!1;optionSelectionChanges=b0(()=>{let e=this.options;return e?e.changes.pipe(In(e),Si(()=>Bi(...e.map(i=>i.onSelectionChange)))):this._initialized.pipe(Si(()=>this.optionSelectionChanges))});openedChange=new Ve;_openedStream=this.openedChange.pipe($A(e=>e),aA(()=>{}));_closedStream=this.openedChange.pipe($A(e=>!e),aA(()=>{}));selectionChange=new Ve;valueChange=new Ve;constructor(){let e=E(TB),i=E(J4,{optional:!0}),n=E(jI,{optional:!0}),o=E(new ws("tabindex"),{optional:!0});this.ngControl&&(this.ngControl.valueAccessor=this),this._defaultOptions?.typeaheadDebounceInterval!=null&&(this.typeaheadDebounceInterval=this._defaultOptions.typeaheadDebounceInterval),this._errorStateTracker=new tu(e,this.ngControl,n,i,this.stateChanges),this._scrollStrategy=this._scrollStrategyFactory(),this.tabIndex=o==null?0:parseInt(o)||0,this.id=this.id}ngOnInit(){this._selectionModel=new J1(this.multiple),this.stateChanges.next(),this._panelDoneAnimatingStream.pipe(Ha(),mt(this._destroy)).subscribe(()=>this._panelDoneAnimating(this.panelOpen)),this._viewportRuler.change().pipe(mt(this._destroy)).subscribe(()=>{this.panelOpen&&(this._overlayWidth=this._getOverlayWidth(this._preferredOverlayOrigin),this._changeDetectorRef.detectChanges())})}ngAfterContentInit(){this._initialized.next(),this._initialized.complete(),this._initKeyManager(),this._selectionModel.changed.pipe(mt(this._destroy)).subscribe(e=>{e.added.forEach(i=>i.select()),e.removed.forEach(i=>i.deselect())}),this.options.changes.pipe(In(null),mt(this._destroy)).subscribe(()=>{this._resetOptions(),this._initializeSelection()})}ngDoCheck(){let e=this._getTriggerAriaLabelledby(),i=this.ngControl;if(e!==this._triggerAriaLabelledBy){let n=this._elementRef.nativeElement;this._triggerAriaLabelledBy=e,e?n.setAttribute("aria-labelledby",e):n.removeAttribute("aria-labelledby")}i&&(this._previousControl!==i.control&&(this._previousControl!==void 0&&i.disabled!==null&&i.disabled!==this.disabled&&(this.disabled=i.disabled),this._previousControl=i.control),this.updateErrorState())}ngOnChanges(e){(e.disabled||e.userAriaDescribedBy)&&this.stateChanges.next(),e.typeaheadDebounceInterval&&this._keyManager&&this._keyManager.withTypeAhead(this.typeaheadDebounceInterval)}ngOnDestroy(){this._keyManager?.destroy(),this._destroy.next(),this._destroy.complete(),this.stateChanges.complete(),this._clearFromModal()}toggle(){this.panelOpen?this.close():this.open()}open(){this._canOpen()&&(this._parentFormField&&(this._preferredOverlayOrigin=this._parentFormField.getConnectedOverlayOrigin()),this._overlayWidth=this._getOverlayWidth(this._preferredOverlayOrigin),this._applyModalPanelOwnership(),this._panelOpen=!0,this._keyManager.withHorizontalOrientation(null),this._highlightCorrectOption(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())}_trackedModal=null;_applyModalPanelOwnership(){let e=this._elementRef.nativeElement.closest('body > .cdk-overlay-container [aria-modal="true"]');if(!e)return;let i=`${this.id}-panel`;this._trackedModal&&_5(this._trackedModal,"aria-owns",i),DN(e,"aria-owns",i),this._trackedModal=e}_clearFromModal(){if(!this._trackedModal)return;let e=`${this.id}-panel`;_5(this._trackedModal,"aria-owns",e),this._trackedModal=null}close(){this._panelOpen&&(this._panelOpen=!1,this._keyManager.withHorizontalOrientation(this._isRtl()?"rtl":"ltr"),this._changeDetectorRef.markForCheck(),this._onTouched(),this.stateChanges.next())}writeValue(e){this._assignValue(e)}registerOnChange(e){this._onChange=e}registerOnTouched(e){this._onTouched=e}setDisabledState(e){this.disabled=e,this._changeDetectorRef.markForCheck(),this.stateChanges.next()}get panelOpen(){return this._panelOpen}get selected(){return this.multiple?this._selectionModel?.selected||[]:this._selectionModel?.selected[0]}get triggerValue(){if(this.empty)return"";if(this._multiple){let e=this._selectionModel.selected.map(i=>i.viewValue);return this._isRtl()&&e.reverse(),e.join(", ")}return this._selectionModel.selected[0].viewValue}updateErrorState(){this._errorStateTracker.updateErrorState()}_isRtl(){return this._dir?this._dir.value==="rtl":!1}_handleKeydown(e){this.disabled||(this.panelOpen?this._handleOpenKeydown(e):this._handleClosedKeydown(e))}_handleClosedKeydown(e){let i=e.keyCode,n=i===40||i===38||i===37||i===39,o=i===13||i===32,r=this._keyManager;if(!r.isTyping()&&o&&!Tr(e)||(this.multiple||e.altKey)&&n)e.preventDefault(),this.open();else if(!this.multiple){let s=this.selected;r.onKeydown(e);let a=this.selected;a&&s!==a&&this._liveAnnouncer.announce(a.viewValue,1e4)}}_handleOpenKeydown(e){let i=this._keyManager,n=e.keyCode,o=n===40||n===38,r=i.isTyping();if(o&&e.altKey)e.preventDefault(),this.close();else if(!r&&(n===13||n===32)&&i.activeItem&&!Tr(e))e.preventDefault(),i.activeItem._selectViaInteraction();else if(!r&&this._multiple&&n===65&&e.ctrlKey){e.preventDefault();let s=this.options.some(a=>!a.disabled&&!a.selected);this.options.forEach(a=>{a.disabled||(s?a.select():a.deselect())})}else{let s=i.activeItemIndex;i.onKeydown(e),this._multiple&&o&&e.shiftKey&&i.activeItem&&i.activeItemIndex!==s&&i.activeItem._selectViaInteraction()}}_onFocus(){this.disabled||(this._focused=!0,this.stateChanges.next())}_onBlur(){this._focused=!1,this._keyManager?.cancelTypeahead(),!this.disabled&&!this.panelOpen&&(this._onTouched(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())}_onAttached(){this._overlayDir.positionChange.pipe(Pn(1)).subscribe(()=>{this._changeDetectorRef.detectChanges(),this._positioningSettled()})}_getPanelTheme(){return this._parentFormField?`mat-${this._parentFormField.color}`:""}get empty(){return!this._selectionModel||this._selectionModel.isEmpty()}_initializeSelection(){Promise.resolve().then(()=>{this.ngControl&&(this._value=this.ngControl.value),this._setSelectionByValue(this._value),this.stateChanges.next()})}_setSelectionByValue(e){if(this.options.forEach(i=>i.setInactiveStyles()),this._selectionModel.clear(),this.multiple&&e)Array.isArray(e),e.forEach(i=>this._selectOptionByValue(i)),this._sortValues();else{let i=this._selectOptionByValue(e);i?this._keyManager.updateActiveItem(i):this.panelOpen||this._keyManager.updateActiveItem(-1)}this._changeDetectorRef.markForCheck()}_selectOptionByValue(e){let i=this.options.find(n=>{if(this._selectionModel.isSelected(n))return!1;try{return(n.value!=null||this.canSelectNullableOptions)&&this._compareWith(n.value,e)}catch{return!1}});return i&&this._selectionModel.select(i),i}_assignValue(e){return e!==this._value||this._multiple&&Array.isArray(e)?(this.options&&this._setSelectionByValue(e),this._value=e,!0):!1}_skipPredicate=e=>this.panelOpen?!1:e.disabled;_getOverlayWidth(e){return this.panelWidth==="auto"?(e instanceof Lm?e.elementRef:e||this._elementRef).nativeElement.getBoundingClientRect().width:this.panelWidth===null?"":this.panelWidth}_syncParentProperties(){if(this.options)for(let e of this.options)e._changeDetectorRef.markForCheck()}_initKeyManager(){this._keyManager=new x5(this.options).withTypeAhead(this.typeaheadDebounceInterval).withVerticalOrientation().withHorizontalOrientation(this._isRtl()?"rtl":"ltr").withHomeAndEnd().withPageUpDown().withAllowedModifierKeys(["shiftKey"]).skipPredicate(this._skipPredicate),this._keyManager.tabOut.subscribe(()=>{this.panelOpen&&(!this.multiple&&this._keyManager.activeItem&&this._keyManager.activeItem._selectViaInteraction(),this.focus(),this.close())}),this._keyManager.change.subscribe(()=>{this._panelOpen&&this.panel?this._scrollOptionIntoView(this._keyManager.activeItemIndex||0):!this._panelOpen&&!this.multiple&&this._keyManager.activeItem&&this._keyManager.activeItem._selectViaInteraction()})}_resetOptions(){let e=Bi(this.options.changes,this._destroy);this.optionSelectionChanges.pipe(mt(e)).subscribe(i=>{this._onSelect(i.source,i.isUserInput),i.isUserInput&&!this.multiple&&this._panelOpen&&(this.close(),this.focus())}),Bi(...this.options.map(i=>i._stateChanges)).pipe(mt(e)).subscribe(()=>{this._changeDetectorRef.detectChanges(),this.stateChanges.next()})}_onSelect(e,i){let n=this._selectionModel.isSelected(e);!this.canSelectNullableOptions&&e.value==null&&!this._multiple?(e.deselect(),this._selectionModel.clear(),this.value!=null&&this._propagateChanges(e.value)):(n!==e.selected&&(e.selected?this._selectionModel.select(e):this._selectionModel.deselect(e)),i&&this._keyManager.setActiveItem(e),this.multiple&&(this._sortValues(),i&&this.focus())),n!==this._selectionModel.isSelected(e)&&this._propagateChanges(),this.stateChanges.next()}_sortValues(){if(this.multiple){let e=this.options.toArray();this._selectionModel.sort((i,n)=>this.sortComparator?this.sortComparator(i,n,e):e.indexOf(i)-e.indexOf(n)),this.stateChanges.next()}}_propagateChanges(e){let i;this.multiple?i=this.selected.map(n=>n.value):i=this.selected?this.selected.value:e,this._value=i,this.valueChange.emit(i),this._onChange(i),this.selectionChange.emit(this._getChangeEvent(i)),this._changeDetectorRef.markForCheck()}_highlightCorrectOption(){if(this._keyManager)if(this.empty){let e=-1;for(let i=0;i0}focus(e){this._elementRef.nativeElement.focus(e)}_getPanelAriaLabelledby(){if(this.ariaLabel)return null;let e=this._parentFormField?.getLabelId()||null,i=e?e+" ":"";return this.ariaLabelledby?i+this.ariaLabelledby:e}_getAriaActiveDescendant(){return this.panelOpen&&this._keyManager&&this._keyManager.activeItem?this._keyManager.activeItem.id:null}_getTriggerAriaLabelledby(){if(this.ariaLabel)return null;let e=this._parentFormField?.getLabelId(),i=(e?e+" ":"")+this._valueId;return this.ariaLabelledby&&(i+=" "+this.ariaLabelledby),i}_panelDoneAnimating(e){this.openedChange.emit(e)}setDescribedByIds(e){e.length?this._elementRef.nativeElement.setAttribute("aria-describedby",e.join(" ")):this._elementRef.nativeElement.removeAttribute("aria-describedby")}onContainerClick(){this.focus(),this.open()}get shouldLabelFloat(){return this.panelOpen||!this.empty||this.focused&&!!this.placeholder}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-select"]],contentQueries:function(i,n,o){if(i&1&&(ni(o,fbe,5),ni(o,Ac,5),ni(o,NN,5)),i&2){let r;oA(r=rA())&&(n.customTrigger=r.first),oA(r=rA())&&(n.options=r),oA(r=rA())&&(n.optionGroups=r)}},viewQuery:function(i,n){if(i&1&&(At(rbe,5),At(sbe,5),At(DF,5)),i&2){let o;oA(o=rA())&&(n.trigger=o.first),oA(o=rA())&&(n.panel=o.first),oA(o=rA())&&(n._overlayDir=o.first)}},hostAttrs:["role","combobox","aria-haspopup","listbox",1,"mat-mdc-select"],hostVars:19,hostBindings:function(i,n){i&1&&ee("keydown",function(r){return n._handleKeydown(r)})("focus",function(){return n._onFocus()})("blur",function(){return n._onBlur()}),i&2&&(AA("id",n.id)("tabindex",n.disabled?-1:n.tabIndex)("aria-controls",n.panelOpen?n.id+"-panel":null)("aria-expanded",n.panelOpen)("aria-label",n.ariaLabel||null)("aria-required",n.required.toString())("aria-disabled",n.disabled.toString())("aria-invalid",n.errorState)("aria-activedescendant",n._getAriaActiveDescendant()),iA("mat-mdc-select-disabled",n.disabled)("mat-mdc-select-invalid",n.errorState)("mat-mdc-select-required",n.required)("mat-mdc-select-empty",n.empty)("mat-mdc-select-multiple",n.multiple))},inputs:{userAriaDescribedBy:[0,"aria-describedby","userAriaDescribedBy"],panelClass:"panelClass",disabled:[2,"disabled","disabled",IA],disableRipple:[2,"disableRipple","disableRipple",IA],tabIndex:[2,"tabIndex","tabIndex",e=>e==null?0:ln(e)],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",IA],placeholder:"placeholder",required:[2,"required","required",IA],multiple:[2,"multiple","multiple",IA],disableOptionCentering:[2,"disableOptionCentering","disableOptionCentering",IA],compareWith:"compareWith",value:"value",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],errorStateMatcher:"errorStateMatcher",typeaheadDebounceInterval:[2,"typeaheadDebounceInterval","typeaheadDebounceInterval",ln],sortComparator:"sortComparator",id:"id",panelWidth:"panelWidth",canSelectNullableOptions:[2,"canSelectNullableOptions","canSelectNullableOptions",IA]},outputs:{openedChange:"openedChange",_openedStream:"opened",_closedStream:"closed",selectionChange:"selectionChange",valueChange:"valueChange"},exportAs:["matSelect"],features:[gt([{provide:V4,useExisting:t},{provide:RN,useExisting:t}]),ti],ngContentSelectors:cbe,decls:11,vars:8,consts:[["fallbackOverlayOrigin","cdkOverlayOrigin","trigger",""],["panel",""],["cdk-overlay-origin","",1,"mat-mdc-select-trigger",3,"click"],[1,"mat-mdc-select-value"],[1,"mat-mdc-select-placeholder","mat-mdc-select-min-line"],[1,"mat-mdc-select-value-text"],[1,"mat-mdc-select-arrow-wrapper"],[1,"mat-mdc-select-arrow"],["viewBox","0 0 24 24","width","24px","height","24px","focusable","false","aria-hidden","true"],["d","M7 10l5 5 5-5z"],["cdk-connected-overlay","","cdkConnectedOverlayLockPosition","","cdkConnectedOverlayHasBackdrop","","cdkConnectedOverlayBackdropClass","cdk-overlay-transparent-backdrop",3,"backdropClick","attach","detach","cdkConnectedOverlayPanelClass","cdkConnectedOverlayScrollStrategy","cdkConnectedOverlayOrigin","cdkConnectedOverlayOpen","cdkConnectedOverlayPositions","cdkConnectedOverlayWidth"],[1,"mat-mdc-select-min-line"],["role","listbox","tabindex","-1",3,"keydown","ngClass"]],template:function(i,n){if(i&1){let o=Ue();Kt(abe),m(0,"div",2,0),ee("click",function(){return q(o),W(n.open())}),m(3,"div",3),ne(4,lbe,2,1,"span",4)(5,Cbe,3,1,"span",5),p(),m(6,"div",6)(7,"div",7),ft(),m(8,"svg",8),ve(9,"path",9),p()()()(),ne(10,Ibe,3,9,"ng-template",10),ee("backdropClick",function(){return q(o),W(n.close())})("attach",function(){return q(o),W(n._onAttached())})("detach",function(){return q(o),W(n.close())})}if(i&2){let o=Ji(1);y(3),AA("id",n._valueId),y(),$(n.empty?4:5),y(6),te("cdkConnectedOverlayPanelClass",n._overlayPanelClass)("cdkConnectedOverlayScrollStrategy",n._scrollStrategy)("cdkConnectedOverlayOrigin",n._preferredOverlayOrigin||o)("cdkConnectedOverlayOpen",n.panelOpen)("cdkConnectedOverlayPositions",n._positions)("cdkConnectedOverlayWidth",n._overlayWidth)}},dependencies:[Lm,DF,ta],styles:['.mat-mdc-select{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-sys-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-sys-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-sys-body-large-tracking))}div.mat-mdc-select-panel{box-shadow:var(--mat-select-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12))}.mat-mdc-select-disabled{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-disabled .mat-mdc-select-placeholder{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-trigger{display:inline-flex;align-items:center;cursor:pointer;position:relative;box-sizing:border-box;width:100%}.mat-mdc-select-disabled .mat-mdc-select-trigger{-webkit-user-select:none;user-select:none;cursor:default}.mat-mdc-select-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-mdc-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-mdc-select-arrow-wrapper{height:24px;flex-shrink:0;display:inline-flex;align-items:center}.mat-form-field-appearance-fill .mdc-text-field--no-label .mat-mdc-select-arrow-wrapper{transform:none}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-invalid .mat-mdc-select-arrow,.mat-form-field-invalid:not(.mat-form-field-disabled) .mat-mdc-form-field-infix::after{color:var(--mat-select-invalid-arrow-color, var(--mat-sys-error))}.mat-mdc-select-arrow{width:10px;height:5px;position:relative;color:var(--mat-select-enabled-arrow-color, var(--mat-sys-on-surface-variant))}.mat-mdc-form-field.mat-focused .mat-mdc-select-arrow{color:var(--mat-select-focused-arrow-color, var(--mat-sys-primary))}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-disabled .mat-mdc-select-arrow{color:var(--mat-select-disabled-arrow-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-arrow svg{fill:currentColor;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}@media(forced-colors: active){.mat-mdc-select-arrow svg{fill:CanvasText}.mat-mdc-select-disabled .mat-mdc-select-arrow svg{fill:GrayText}}div.mat-mdc-select-panel{width:100%;max-height:275px;outline:0;overflow:auto;padding:8px 0;border-radius:4px;box-sizing:border-box;position:static;background-color:var(--mat-select-panel-background-color, var(--mat-sys-surface-container))}@media(forced-colors: active){div.mat-mdc-select-panel{outline:solid 1px}}.cdk-overlay-pane:not(.mat-mdc-select-panel-above) div.mat-mdc-select-panel{border-top-left-radius:0;border-top-right-radius:0;transform-origin:top center}.mat-mdc-select-panel-above div.mat-mdc-select-panel{border-bottom-left-radius:0;border-bottom-right-radius:0;transform-origin:bottom center}div.mat-mdc-select-panel .mat-mdc-option{--mdc-list-list-item-container-color: var(--mat-select-panel-background-color)}.mat-mdc-select-placeholder{transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1);color:var(--mat-select-placeholder-text-color, var(--mat-sys-on-surface-variant))}.mat-form-field-no-animations .mat-mdc-select-placeholder,._mat-animation-noopable .mat-mdc-select-placeholder{transition:none}.mat-form-field-hide-placeholder .mat-mdc-select-placeholder{color:rgba(0,0,0,0);-webkit-text-fill-color:rgba(0,0,0,0);transition:none;display:block}.mat-mdc-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mat-mdc-floating-label{max-width:calc(100% - 18px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mdc-floating-label--float-above{max-width:calc(100%/0.75 - 24px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-text-field--label-floating .mdc-notched-outline__notch{max-width:calc(100% - 24px)}.mat-mdc-select-min-line:empty::before{content:" ";white-space:pre;width:1px;display:inline-block;visibility:hidden}.mat-form-field-appearance-fill .mat-mdc-select-arrow-wrapper{transform:var(--mat-select-arrow-transform, translateY(-8px))}'],encapsulation:2,data:{animation:[ube.transformPanel]},changeDetection:0})}return t})();var xF=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({providers:[Ebe],imports:[Lg,LN,ui,E2,gl,LN,ui]})}return t})();var mbe=["tooltip"],xAe=20;var _Ae=new re("mat-tooltip-scroll-strategy",{providedIn:"root",factory:()=>{let t=E(Or);return()=>t.scrollStrategies.reposition({scrollThrottle:xAe})}});function pbe(t){return()=>t.scrollStrategies.reposition({scrollThrottle:xAe})}var wbe={provide:_Ae,deps:[Or],useFactory:pbe};function ybe(){return{showDelay:0,hideDelay:0,touchendHideDelay:1500}}var Dbe=new re("mat-tooltip-default-options",{providedIn:"root",factory:ybe});var SAe="tooltip-panel",kAe=Gl({passive:!0}),vbe=8,bbe=8,Mbe=24,Sbe=200,Ma=(()=>{class t{_elementRef=E(eA);_ngZone=E(yA);_platform=E(mi);_ariaDescriber=E(ZZ);_focusMonitor=E(ns);_dir=E(Do);_injector=E(Dt);_defaultOptions=E(Dbe,{optional:!0});_overlayRef;_tooltipInstance;_portal;_position="below";_positionAtOrigin=!1;_disabled=!1;_tooltipClass;_viewInitialized=!1;_pointerExitEventsInitialized=!1;_tooltipComponent=kbe;_viewportMargin=8;_currentPosition;_cssClassPrefix="mat-mdc";_ariaDescriptionPending;_dirSubscribed=!1;get position(){return this._position}set position(e){e!==this._position&&(this._position=e,this._overlayRef&&(this._updatePosition(this._overlayRef),this._tooltipInstance?.show(0),this._overlayRef.updatePosition()))}get positionAtOrigin(){return this._positionAtOrigin}set positionAtOrigin(e){this._positionAtOrigin=Sr(e),this._detach(),this._overlayRef=null}get disabled(){return this._disabled}set disabled(e){let i=Sr(e);this._disabled!==i&&(this._disabled=i,i?this.hide(0):this._setupPointerEnterEventsIfNeeded(),this._syncAriaDescription(this.message))}get showDelay(){return this._showDelay}set showDelay(e){this._showDelay=Za(e)}_showDelay;get hideDelay(){return this._hideDelay}set hideDelay(e){this._hideDelay=Za(e),this._tooltipInstance&&(this._tooltipInstance._mouseLeaveHideDelay=this._hideDelay)}_hideDelay;touchGestures="auto";get message(){return this._message}set message(e){let i=this._message;this._message=e!=null?String(e).trim():"",!this._message&&this._isTooltipVisible()?this.hide(0):(this._setupPointerEnterEventsIfNeeded(),this._updateTooltipMessage()),this._syncAriaDescription(i)}_message="";get tooltipClass(){return this._tooltipClass}set tooltipClass(e){this._tooltipClass=e,this._tooltipInstance&&this._setTooltipClass(this._tooltipClass)}_passiveListeners=[];_touchstartTimeout=null;_destroyed=new je;_isDestroyed=!1;constructor(){let e=this._defaultOptions;e&&(this._showDelay=e.showDelay,this._hideDelay=e.hideDelay,e.position&&(this.position=e.position),e.positionAtOrigin&&(this.positionAtOrigin=e.positionAtOrigin),e.touchGestures&&(this.touchGestures=e.touchGestures),e.tooltipClass&&(this.tooltipClass=e.tooltipClass)),this._viewportMargin=vbe}ngAfterViewInit(){this._viewInitialized=!0,this._setupPointerEnterEventsIfNeeded(),this._focusMonitor.monitor(this._elementRef).pipe(mt(this._destroyed)).subscribe(e=>{e?e==="keyboard"&&this._ngZone.run(()=>this.show()):this._ngZone.run(()=>this.hide(0))})}ngOnDestroy(){let e=this._elementRef.nativeElement;this._touchstartTimeout&&clearTimeout(this._touchstartTimeout),this._overlayRef&&(this._overlayRef.dispose(),this._tooltipInstance=null),this._passiveListeners.forEach(([i,n])=>{e.removeEventListener(i,n,kAe)}),this._passiveListeners.length=0,this._destroyed.next(),this._destroyed.complete(),this._isDestroyed=!0,this._ariaDescriber.removeDescription(e,this.message,"tooltip"),this._focusMonitor.stopMonitoring(e)}show(e=this.showDelay,i){if(this.disabled||!this.message||this._isTooltipVisible()){this._tooltipInstance?._cancelPendingAnimations();return}let n=this._createOverlay(i);this._detach(),this._portal=this._portal||new Rg(this._tooltipComponent,this._injector.get(xn));let o=this._tooltipInstance=n.attach(this._portal).instance;o._triggerElement=this._elementRef.nativeElement,o._mouseLeaveHideDelay=this._hideDelay,o.afterHidden().pipe(mt(this._destroyed)).subscribe(()=>this._detach()),this._setTooltipClass(this._tooltipClass),this._updateTooltipMessage(),o.show(e)}hide(e=this.hideDelay){let i=this._tooltipInstance;i&&(i.isVisible()?i.hide(e):(i._cancelPendingAnimations(),this._detach()))}toggle(e){this._isTooltipVisible()?this.hide():this.show(void 0,e)}_isTooltipVisible(){return!!this._tooltipInstance&&this._tooltipInstance.isVisible()}_createOverlay(e){if(this._overlayRef){let r=this._overlayRef.getConfig().positionStrategy;if((!this.positionAtOrigin||!e)&&r._origin instanceof eA)return this._overlayRef;this._detach()}let i=this._injector.get(Y1).getAncestorScrollContainers(this._elementRef),n=this._injector.get(Or),o=n.position().flexibleConnectedTo(this.positionAtOrigin?e||this._elementRef:this._elementRef).withTransformOriginOn(`.${this._cssClassPrefix}-tooltip`).withFlexibleDimensions(!1).withViewportMargin(this._viewportMargin).withScrollableContainers(i);return o.positionChanges.pipe(mt(this._destroyed)).subscribe(r=>{this._updateCurrentPositionClass(r.connectionPair),this._tooltipInstance&&r.scrollableViewProperties.isOverlayClipped&&this._tooltipInstance.isVisible()&&this._ngZone.run(()=>this.hide(0))}),this._overlayRef=n.create({direction:this._dir,positionStrategy:o,panelClass:`${this._cssClassPrefix}-${SAe}`,scrollStrategy:this._injector.get(_Ae)()}),this._updatePosition(this._overlayRef),this._overlayRef.detachments().pipe(mt(this._destroyed)).subscribe(()=>this._detach()),this._overlayRef.outsidePointerEvents().pipe(mt(this._destroyed)).subscribe(()=>this._tooltipInstance?._handleBodyInteraction()),this._overlayRef.keydownEvents().pipe(mt(this._destroyed)).subscribe(r=>{this._isTooltipVisible()&&r.keyCode===27&&!Tr(r)&&(r.preventDefault(),r.stopPropagation(),this._ngZone.run(()=>this.hide(0)))}),this._defaultOptions?.disableTooltipInteractivity&&this._overlayRef.addPanelClass(`${this._cssClassPrefix}-tooltip-panel-non-interactive`),this._dirSubscribed||(this._dirSubscribed=!0,this._dir.change.pipe(mt(this._destroyed)).subscribe(()=>{this._overlayRef&&this._updatePosition(this._overlayRef)})),this._overlayRef}_detach(){this._overlayRef&&this._overlayRef.hasAttached()&&this._overlayRef.detach(),this._tooltipInstance=null}_updatePosition(e){let i=e.getConfig().positionStrategy,n=this._getOrigin(),o=this._getOverlayPosition();i.withPositions([this._addOffset(ae(ae({},n.main),o.main)),this._addOffset(ae(ae({},n.fallback),o.fallback))])}_addOffset(e){let i=bbe,n=!this._dir||this._dir.value=="ltr";return e.originY==="top"?e.offsetY=-i:e.originY==="bottom"?e.offsetY=i:e.originX==="start"?e.offsetX=n?-i:i:e.originX==="end"&&(e.offsetX=n?i:-i),e}_getOrigin(){let e=!this._dir||this._dir.value=="ltr",i=this.position,n;i=="above"||i=="below"?n={originX:"center",originY:i=="above"?"top":"bottom"}:i=="before"||i=="left"&&e||i=="right"&&!e?n={originX:"start",originY:"center"}:(i=="after"||i=="right"&&e||i=="left"&&!e)&&(n={originX:"end",originY:"center"});let{x:o,y:r}=this._invertPosition(n.originX,n.originY);return{main:n,fallback:{originX:o,originY:r}}}_getOverlayPosition(){let e=!this._dir||this._dir.value=="ltr",i=this.position,n;i=="above"?n={overlayX:"center",overlayY:"bottom"}:i=="below"?n={overlayX:"center",overlayY:"top"}:i=="before"||i=="left"&&e||i=="right"&&!e?n={overlayX:"end",overlayY:"center"}:(i=="after"||i=="right"&&e||i=="left"&&!e)&&(n={overlayX:"start",overlayY:"center"});let{x:o,y:r}=this._invertPosition(n.overlayX,n.overlayY);return{main:n,fallback:{overlayX:o,overlayY:r}}}_updateTooltipMessage(){this._tooltipInstance&&(this._tooltipInstance.message=this.message,this._tooltipInstance._markForCheck(),Gr(()=>{this._tooltipInstance&&this._overlayRef.updatePosition()},{injector:this._injector}))}_setTooltipClass(e){this._tooltipInstance&&(this._tooltipInstance.tooltipClass=e,this._tooltipInstance._markForCheck())}_invertPosition(e,i){return this.position==="above"||this.position==="below"?i==="top"?i="bottom":i==="bottom"&&(i="top"):e==="end"?e="start":e==="start"&&(e="end"),{x:e,y:i}}_updateCurrentPositionClass(e){let{overlayY:i,originX:n,originY:o}=e,r;if(i==="center"?this._dir&&this._dir.value==="rtl"?r=n==="end"?"left":"right":r=n==="start"?"left":"right":r=i==="bottom"&&o==="top"?"above":"below",r!==this._currentPosition){let s=this._overlayRef;if(s){let a=`${this._cssClassPrefix}-${SAe}-`;s.removePanelClass(a+this._currentPosition),s.addPanelClass(a+r)}this._currentPosition=r}}_setupPointerEnterEventsIfNeeded(){this._disabled||!this.message||!this._viewInitialized||this._passiveListeners.length||(this._platformSupportsMouseEvents()?this._passiveListeners.push(["mouseenter",e=>{this._setupPointerExitEventsIfNeeded();let i;e.x!==void 0&&e.y!==void 0&&(i=e),this.show(void 0,i)}]):this.touchGestures!=="off"&&(this._disableNativeGesturesIfNecessary(),this._passiveListeners.push(["touchstart",e=>{let i=e.targetTouches?.[0],n=i?{x:i.clientX,y:i.clientY}:void 0;this._setupPointerExitEventsIfNeeded(),this._touchstartTimeout&&clearTimeout(this._touchstartTimeout);let o=500;this._touchstartTimeout=setTimeout(()=>{this._touchstartTimeout=null,this.show(void 0,n)},this._defaultOptions?.touchLongPressShowDelay??o)}])),this._addListeners(this._passiveListeners))}_setupPointerExitEventsIfNeeded(){if(this._pointerExitEventsInitialized)return;this._pointerExitEventsInitialized=!0;let e=[];if(this._platformSupportsMouseEvents())e.push(["mouseleave",i=>{let n=i.relatedTarget;(!n||!this._overlayRef?.overlayElement.contains(n))&&this.hide()}],["wheel",i=>this._wheelListener(i)]);else if(this.touchGestures!=="off"){this._disableNativeGesturesIfNecessary();let i=()=>{this._touchstartTimeout&&clearTimeout(this._touchstartTimeout),this.hide(this._defaultOptions?.touchendHideDelay)};e.push(["touchend",i],["touchcancel",i])}this._addListeners(e),this._passiveListeners.push(...e)}_addListeners(e){e.forEach(([i,n])=>{this._elementRef.nativeElement.addEventListener(i,n,kAe)})}_platformSupportsMouseEvents(){return!this._platform.IOS&&!this._platform.ANDROID}_wheelListener(e){if(this._isTooltipVisible()){let i=this._injector.get(ht).elementFromPoint(e.clientX,e.clientY),n=this._elementRef.nativeElement;i!==n&&!n.contains(i)&&this.hide()}}_disableNativeGesturesIfNecessary(){let e=this.touchGestures;if(e!=="off"){let i=this._elementRef.nativeElement,n=i.style;(e==="on"||i.nodeName!=="INPUT"&&i.nodeName!=="TEXTAREA")&&(n.userSelect=n.msUserSelect=n.webkitUserSelect=n.MozUserSelect="none"),(e==="on"||!i.draggable)&&(n.webkitUserDrag="none"),n.touchAction="none",n.webkitTapHighlightColor="transparent"}}_syncAriaDescription(e){this._ariaDescriptionPending||(this._ariaDescriptionPending=!0,this._ariaDescriber.removeDescription(this._elementRef.nativeElement,e,"tooltip"),this._isDestroyed||Gr({write:()=>{this._ariaDescriptionPending=!1,this.message&&!this.disabled&&this._ariaDescriber.describe(this._elementRef.nativeElement,this.message,"tooltip")}},{injector:this._injector}))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","matTooltip",""]],hostAttrs:[1,"mat-mdc-tooltip-trigger"],hostVars:2,hostBindings:function(i,n){i&2&&iA("mat-mdc-tooltip-disabled",n.disabled)},inputs:{position:[0,"matTooltipPosition","position"],positionAtOrigin:[0,"matTooltipPositionAtOrigin","positionAtOrigin"],disabled:[0,"matTooltipDisabled","disabled"],showDelay:[0,"matTooltipShowDelay","showDelay"],hideDelay:[0,"matTooltipHideDelay","hideDelay"],touchGestures:[0,"matTooltipTouchGestures","touchGestures"],message:[0,"matTooltip","message"],tooltipClass:[0,"matTooltipClass","tooltipClass"]},exportAs:["matTooltip"]})}return t})(),kbe=(()=>{class t{_changeDetectorRef=E(ut);_elementRef=E(eA);_isMultiline=!1;message;tooltipClass;_showTimeoutId;_hideTimeoutId;_triggerElement;_mouseLeaveHideDelay;_animationsDisabled;_tooltip;_closeOnInteraction=!1;_isVisible=!1;_onHide=new je;_showAnimation="mat-mdc-tooltip-show";_hideAnimation="mat-mdc-tooltip-hide";constructor(){let e=E(Oi,{optional:!0});this._animationsDisabled=e==="NoopAnimations"}show(e){this._hideTimeoutId!=null&&clearTimeout(this._hideTimeoutId),this._showTimeoutId=setTimeout(()=>{this._toggleVisibility(!0),this._showTimeoutId=void 0},e)}hide(e){this._showTimeoutId!=null&&clearTimeout(this._showTimeoutId),this._hideTimeoutId=setTimeout(()=>{this._toggleVisibility(!1),this._hideTimeoutId=void 0},e)}afterHidden(){return this._onHide}isVisible(){return this._isVisible}ngOnDestroy(){this._cancelPendingAnimations(),this._onHide.complete(),this._triggerElement=null}_handleBodyInteraction(){this._closeOnInteraction&&this.hide(0)}_markForCheck(){this._changeDetectorRef.markForCheck()}_handleMouseLeave({relatedTarget:e}){(!e||!this._triggerElement.contains(e))&&(this.isVisible()?this.hide(this._mouseLeaveHideDelay):this._finalizeAnimation(!1))}_onShow(){this._isMultiline=this._isTooltipMultiline(),this._markForCheck()}_isTooltipMultiline(){let e=this._elementRef.nativeElement.getBoundingClientRect();return e.height>Mbe&&e.width>=Sbe}_handleAnimationEnd({animationName:e}){(e===this._showAnimation||e===this._hideAnimation)&&this._finalizeAnimation(e===this._showAnimation)}_cancelPendingAnimations(){this._showTimeoutId!=null&&clearTimeout(this._showTimeoutId),this._hideTimeoutId!=null&&clearTimeout(this._hideTimeoutId),this._showTimeoutId=this._hideTimeoutId=void 0}_finalizeAnimation(e){e?this._closeOnInteraction=!0:this.isVisible()||this._onHide.next()}_toggleVisibility(e){let i=this._tooltip.nativeElement,n=this._showAnimation,o=this._hideAnimation;if(i.classList.remove(e?o:n),i.classList.add(e?n:o),this._isVisible!==e&&(this._isVisible=e,this._changeDetectorRef.markForCheck()),e&&!this._animationsDisabled&&typeof getComputedStyle=="function"){let r=getComputedStyle(i);(r.getPropertyValue("animation-duration")==="0s"||r.getPropertyValue("animation-name")==="none")&&(this._animationsDisabled=!0)}e&&this._onShow(),this._animationsDisabled&&(i.classList.add("_mat-animation-noopable"),this._finalizeAnimation(e))}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-tooltip-component"]],viewQuery:function(i,n){if(i&1&&At(mbe,7),i&2){let o;oA(o=rA())&&(n._tooltip=o.first)}},hostAttrs:["aria-hidden","true"],hostBindings:function(i,n){i&1&&ee("mouseleave",function(r){return n._handleMouseLeave(r)})},decls:4,vars:4,consts:[["tooltip",""],[1,"mdc-tooltip","mat-mdc-tooltip",3,"animationend","ngClass"],[1,"mat-mdc-tooltip-surface","mdc-tooltip__surface"]],template:function(i,n){if(i&1){let o=Ue();m(0,"div",1,0),ee("animationend",function(s){return q(o),W(n._handleAnimationEnd(s))}),m(2,"div",2),T(3),p()()}i&2&&(iA("mdc-tooltip--multiline",n._isMultiline),te("ngClass",n.tooltipClass),y(3),Pe(n.message))},dependencies:[ta],styles:['.mat-mdc-tooltip{position:relative;transform:scale(0);display:inline-flex}.mat-mdc-tooltip::before{content:"";top:0;right:0;bottom:0;left:0;z-index:-1;position:absolute}.mat-mdc-tooltip-panel-below .mat-mdc-tooltip::before{top:-8px}.mat-mdc-tooltip-panel-above .mat-mdc-tooltip::before{bottom:-8px}.mat-mdc-tooltip-panel-right .mat-mdc-tooltip::before{left:-8px}.mat-mdc-tooltip-panel-left .mat-mdc-tooltip::before{right:-8px}.mat-mdc-tooltip._mat-animation-noopable{animation:none;transform:scale(1)}.mat-mdc-tooltip-surface{word-break:normal;overflow-wrap:anywhere;padding:4px 8px;min-width:40px;max-width:200px;min-height:24px;max-height:40vh;box-sizing:border-box;overflow:hidden;text-align:center;will-change:transform,opacity;background-color:var(--mdc-plain-tooltip-container-color, var(--mat-sys-inverse-surface));color:var(--mdc-plain-tooltip-supporting-text-color, var(--mat-sys-inverse-on-surface));border-radius:var(--mdc-plain-tooltip-container-shape, var(--mat-sys-corner-extra-small));font-family:var(--mdc-plain-tooltip-supporting-text-font, var(--mat-sys-body-small-font));font-size:var(--mdc-plain-tooltip-supporting-text-size, var(--mat-sys-body-small-size));font-weight:var(--mdc-plain-tooltip-supporting-text-weight, var(--mat-sys-body-small-weight));line-height:var(--mdc-plain-tooltip-supporting-text-line-height, var(--mat-sys-body-small-line-height));letter-spacing:var(--mdc-plain-tooltip-supporting-text-tracking, var(--mat-sys-body-small-tracking))}.mat-mdc-tooltip-surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mdc-tooltip--multiline .mat-mdc-tooltip-surface{text-align:left}[dir=rtl] .mdc-tooltip--multiline .mat-mdc-tooltip-surface{text-align:right}.mat-mdc-tooltip-panel{line-height:normal}.mat-mdc-tooltip-panel.mat-mdc-tooltip-panel-non-interactive{pointer-events:none}@keyframes mat-mdc-tooltip-show{0%{opacity:0;transform:scale(0.8)}100%{opacity:1;transform:scale(1)}}@keyframes mat-mdc-tooltip-hide{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(0.8)}}.mat-mdc-tooltip-show{animation:mat-mdc-tooltip-show 150ms cubic-bezier(0, 0, 0.2, 1) forwards}.mat-mdc-tooltip-hide{animation:mat-mdc-tooltip-hide 75ms cubic-bezier(0.4, 0, 1, 1) forwards}'],encapsulation:2,changeDetection:0})}return t})();var _F=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({providers:[wbe],imports:[L5,Lg,ui,ui,E2]})}return t})();function _be(t,A){if(t&1&&(m(0,"mat-option",17),T(1),p()),t&2){let e=A.$implicit;te("value",e),y(),FA(" ",e," ")}}function Rbe(t,A){if(t&1){let e=Ue();m(0,"mat-form-field",14)(1,"mat-select",16,0),ee("selectionChange",function(n){q(e);let o=M(2);return W(o._changePageSize(n.value))}),Rt(3,_be,2,2,"mat-option",17,Fi),p(),m(5,"div",18),ee("click",function(){q(e);let n=Ji(2);return W(n.open())}),p()()}if(t&2){let e=M(2);te("appearance",e._formFieldAppearance)("color",e.color),y(),te("value",e.pageSize)("disabled",e.disabled)("aria-labelledby",e._pageSizeLabelId)("panelClass",e.selectConfig.panelClass||"")("disableOptionCentering",e.selectConfig.disableOptionCentering),y(2),Nt(e._displayedPageSizeOptions)}}function Nbe(t,A){if(t&1&&(m(0,"div",15),T(1),p()),t&2){let e=M(2);y(),Pe(e.pageSize)}}function Lbe(t,A){if(t&1&&(m(0,"div",3)(1,"div",13),T(2),p(),ne(3,Rbe,6,7,"mat-form-field",14)(4,Nbe,2,1,"div",15),p()),t&2){let e=M();y(),AA("id",e._pageSizeLabelId),y(),FA(" ",e._intl.itemsPerPageLabel," "),y(),$(e._displayedPageSizeOptions.length>1?3:-1),y(),$(e._displayedPageSizeOptions.length<=1?4:-1)}}function Fbe(t,A){if(t&1){let e=Ue();m(0,"button",19),ee("click",function(){q(e);let n=M();return W(n._buttonClicked(0,n._previousButtonsDisabled()))}),ft(),m(1,"svg",8),ve(2,"path",20),p()()}if(t&2){let e=M();te("matTooltip",e._intl.firstPageLabel)("matTooltipDisabled",e._previousButtonsDisabled())("disabled",e._previousButtonsDisabled()),AA("aria-label",e._intl.firstPageLabel)}}function Gbe(t,A){if(t&1){let e=Ue();m(0,"button",21),ee("click",function(){q(e);let n=M();return W(n._buttonClicked(n.getNumberOfPages()-1,n._nextButtonsDisabled()))}),ft(),m(1,"svg",8),ve(2,"path",22),p()()}if(t&2){let e=M();te("matTooltip",e._intl.lastPageLabel)("matTooltipDisabled",e._nextButtonsDisabled())("disabled",e._nextButtonsDisabled()),AA("aria-label",e._intl.lastPageLabel)}}var dD=(()=>{class t{changes=new je;itemsPerPageLabel="Items per page:";nextPageLabel="Next page";previousPageLabel="Previous page";firstPageLabel="First page";lastPageLabel="Last page";getRangeLabel=(e,i,n)=>{if(n==0||i==0)return`0 of ${n}`;n=Math.max(n,0);let o=e*i,r=o{class t{_intl=E(dD);_changeDetectorRef=E(ut);_formFieldAppearance;_pageSizeLabelId=E(un).getId("mat-paginator-page-size-label-");_intlChanges;_isInitialized=!1;_initializedStream=new Zc(1);color;get pageIndex(){return this._pageIndex}set pageIndex(e){this._pageIndex=Math.max(e||0,0),this._changeDetectorRef.markForCheck()}_pageIndex=0;get length(){return this._length}set length(e){this._length=e||0,this._changeDetectorRef.markForCheck()}_length=0;get pageSize(){return this._pageSize}set pageSize(e){this._pageSize=Math.max(e||0,0),this._updateDisplayedPageSizeOptions()}_pageSize;get pageSizeOptions(){return this._pageSizeOptions}set pageSizeOptions(e){this._pageSizeOptions=(e||[]).map(i=>ln(i,0)),this._updateDisplayedPageSizeOptions()}_pageSizeOptions=[];hidePageSize=!1;showFirstLastButtons=!1;selectConfig={};disabled=!1;page=new Ve;_displayedPageSizeOptions;initialized=this._initializedStream;constructor(){let e=this._intl,i=E(Ube,{optional:!0});if(this._intlChanges=e.changes.subscribe(()=>this._changeDetectorRef.markForCheck()),i){let{pageSize:n,pageSizeOptions:o,hidePageSize:r,showFirstLastButtons:s}=i;n!=null&&(this._pageSize=n),o!=null&&(this._pageSizeOptions=o),r!=null&&(this.hidePageSize=r),s!=null&&(this.showFirstLastButtons=s)}this._formFieldAppearance=i?.formFieldAppearance||"outline"}ngOnInit(){this._isInitialized=!0,this._updateDisplayedPageSizeOptions(),this._initializedStream.next()}ngOnDestroy(){this._initializedStream.complete(),this._intlChanges.unsubscribe()}nextPage(){this.hasNextPage()&&this._navigate(this.pageIndex+1)}previousPage(){this.hasPreviousPage()&&this._navigate(this.pageIndex-1)}firstPage(){this.hasPreviousPage()&&this._navigate(0)}lastPage(){this.hasNextPage()&&this._navigate(this.getNumberOfPages()-1)}hasPreviousPage(){return this.pageIndex>=1&&this.pageSize!=0}hasNextPage(){let e=this.getNumberOfPages()-1;return this.pageIndexe-i),this._changeDetectorRef.markForCheck())}_emitPageEvent(e){this.page.emit({previousPageIndex:e,pageIndex:this.pageIndex,pageSize:this.pageSize,length:this.length})}_navigate(e){let i=this.pageIndex;e!==i&&(this.pageIndex=e,this._emitPageEvent(i))}_buttonClicked(e,i){i||this._navigate(e)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-paginator"]],hostAttrs:["role","group",1,"mat-mdc-paginator"],inputs:{color:"color",pageIndex:[2,"pageIndex","pageIndex",ln],length:[2,"length","length",ln],pageSize:[2,"pageSize","pageSize",ln],pageSizeOptions:"pageSizeOptions",hidePageSize:[2,"hidePageSize","hidePageSize",IA],showFirstLastButtons:[2,"showFirstLastButtons","showFirstLastButtons",IA],selectConfig:"selectConfig",disabled:[2,"disabled","disabled",IA]},outputs:{page:"page"},exportAs:["matPaginator"],decls:14,vars:12,consts:[["selectRef",""],[1,"mat-mdc-paginator-outer-container"],[1,"mat-mdc-paginator-container"],[1,"mat-mdc-paginator-page-size"],[1,"mat-mdc-paginator-range-actions"],["aria-live","polite",1,"mat-mdc-paginator-range-label"],["mat-icon-button","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-first",3,"matTooltip","matTooltipDisabled","disabled"],["mat-icon-button","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-previous",3,"click","matTooltip","matTooltipDisabled","disabled"],["viewBox","0 0 24 24","focusable","false","aria-hidden","true",1,"mat-mdc-paginator-icon"],["d","M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"],["mat-icon-button","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-next",3,"click","matTooltip","matTooltipDisabled","disabled"],["d","M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"],["mat-icon-button","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-last",3,"matTooltip","matTooltipDisabled","disabled"],[1,"mat-mdc-paginator-page-size-label"],[1,"mat-mdc-paginator-page-size-select",3,"appearance","color"],[1,"mat-mdc-paginator-page-size-value"],["hideSingleSelectionIndicator","",3,"selectionChange","value","disabled","aria-labelledby","panelClass","disableOptionCentering"],[3,"value"],[1,"mat-mdc-paginator-touch-target",3,"click"],["mat-icon-button","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-first",3,"click","matTooltip","matTooltipDisabled","disabled"],["d","M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z"],["mat-icon-button","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-last",3,"click","matTooltip","matTooltipDisabled","disabled"],["d","M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z"]],template:function(i,n){i&1&&(m(0,"div",1)(1,"div",2),ne(2,Lbe,5,4,"div",3),m(3,"div",4)(4,"div",5),T(5),p(),ne(6,Fbe,3,4,"button",6),m(7,"button",7),ee("click",function(){return n._buttonClicked(n.pageIndex-1,n._previousButtonsDisabled())}),ft(),m(8,"svg",8),ve(9,"path",9),p()(),$s(),m(10,"button",10),ee("click",function(){return n._buttonClicked(n.pageIndex+1,n._nextButtonsDisabled())}),ft(),m(11,"svg",8),ve(12,"path",11),p()(),ne(13,Gbe,3,4,"button",12),p()()()),i&2&&(y(2),$(n.hidePageSize?-1:2),y(3),FA(" ",n._intl.getRangeLabel(n.pageIndex,n.pageSize,n.length)," "),y(),$(n.showFirstLastButtons?6:-1),y(),te("matTooltip",n._intl.previousPageLabel)("matTooltipDisabled",n._previousButtonsDisabled())("disabled",n._previousButtonsDisabled()),AA("aria-label",n._intl.previousPageLabel),y(3),te("matTooltip",n._intl.nextPageLabel)("matTooltipDisabled",n._nextButtonsDisabled())("disabled",n._nextButtonsDisabled()),AA("aria-label",n._intl.nextPageLabel),y(3),$(n.showFirstLastButtons?13:-1))},dependencies:[ds,Yl,Ac,ya,Ma],styles:[".mat-mdc-paginator{display:block;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-paginator-container-text-color, var(--mat-sys-on-surface));background-color:var(--mat-paginator-container-background-color, var(--mat-sys-surface));font-family:var(--mat-paginator-container-text-font, var(--mat-sys-body-small-font));line-height:var(--mat-paginator-container-text-line-height, var(--mat-sys-body-small-line-height));font-size:var(--mat-paginator-container-text-size, var(--mat-sys-body-small-size));font-weight:var(--mat-paginator-container-text-weight, var(--mat-sys-body-small-weight));letter-spacing:var(--mat-paginator-container-text-tracking, var(--mat-sys-body-small-tracking));--mat-form-field-container-height:var(--mat-paginator-form-field-container-height, 40px);--mat-form-field-container-vertical-padding:var(--mat-paginator-form-field-container-vertical-padding, 8px)}.mat-mdc-paginator .mat-mdc-select-value{font-size:var(--mat-paginator-select-trigger-text-size, var(--mat-sys-body-small-size))}.mat-mdc-paginator .mat-mdc-form-field-subscript-wrapper{display:none}.mat-mdc-paginator .mat-mdc-select{line-height:1.5}.mat-mdc-paginator-outer-container{display:flex}.mat-mdc-paginator-container{display:flex;align-items:center;justify-content:flex-end;padding:0 8px;flex-wrap:wrap;width:100%;min-height:var(--mat-paginator-container-size, 56px)}.mat-mdc-paginator-page-size{display:flex;align-items:baseline;margin-right:8px}[dir=rtl] .mat-mdc-paginator-page-size{margin-right:0;margin-left:8px}.mat-mdc-paginator-page-size-label{margin:0 4px}.mat-mdc-paginator-page-size-select{margin:0 4px;width:84px}.mat-mdc-paginator-range-label{margin:0 32px 0 24px}.mat-mdc-paginator-range-actions{display:flex;align-items:center}.mat-mdc-paginator-icon{display:inline-block;width:28px;fill:var(--mat-paginator-enabled-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button[aria-disabled] .mat-mdc-paginator-icon{fill:var(--mat-paginator-disabled-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}[dir=rtl] .mat-mdc-paginator-icon{transform:rotate(180deg)}@media(forced-colors: active){.mat-mdc-icon-button[disabled] .mat-mdc-paginator-icon,.mat-mdc-paginator-icon{fill:currentColor;fill:CanvasText}.mat-mdc-paginator-range-actions .mat-mdc-icon-button{outline:solid 1px}}.mat-mdc-paginator-touch-target{display:var(--mat-paginator-touch-target-display, block);position:absolute;top:50%;left:50%;width:84px;height:48px;background-color:rgba(0,0,0,0);transform:translate(-50%, -50%);cursor:pointer}"],encapsulation:2,changeDetection:0})}return t})();var NAe=["*"],Tbe=["content"],Obe=[[["mat-drawer"]],[["mat-drawer-content"]],"*"],Jbe=["mat-drawer","mat-drawer-content","*"];function Ybe(t,A){if(t&1){let e=Ue();m(0,"div",1),ee("click",function(){q(e);let n=M();return W(n._onBackdropClicked())}),p()}if(t&2){let e=M();iA("mat-drawer-shown",e._isShowingBackdrop())}}function Hbe(t,A){t&1&&(m(0,"mat-drawer-content"),NA(1,2),p())}var zbe=new re("MAT_DRAWER_DEFAULT_AUTOSIZE",{providedIn:"root",factory:Pbe}),LAe=new re("MAT_DRAWER_CONTAINER");function Pbe(){return!1}var RF=(()=>{class t extends f2{_platform=E(mi);_changeDetectorRef=E(ut);_container=E(LF);constructor(){let e=E(eA),i=E(Y1),n=E(yA);super(e,i,n)}ngAfterContentInit(){this._container._contentMarginChanges.subscribe(()=>{this._changeDetectorRef.markForCheck()})}_shouldBeHidden(){if(this._platform.isBrowser)return!1;let{start:e,end:i}=this._container;return e!=null&&e.mode!=="over"&&e.opened||i!=null&&i.mode!=="over"&&i.opened}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-drawer-content"]],hostAttrs:[1,"mat-drawer-content"],hostVars:6,hostBindings:function(i,n){i&2&&(cn("margin-left",n._container._contentMargins.left,"px")("margin-right",n._container._contentMargins.right,"px"),iA("mat-drawer-content-hidden",n._shouldBeHidden()))},features:[gt([{provide:f2,useExisting:t}]),Ct],ngContentSelectors:NAe,decls:1,vars:0,template:function(i,n){i&1&&(Kt(),NA(0))},encapsulation:2,changeDetection:0})}return t})(),NF=(()=>{class t{_elementRef=E(eA);_focusTrapFactory=E(R5);_focusMonitor=E(ns);_platform=E(mi);_ngZone=E(yA);_renderer=E(an);_interactivityChecker=E(z4);_doc=E(ht,{optional:!0});_container=E(LAe,{optional:!0});_focusTrap=null;_elementFocusedBeforeDrawerWasOpened=null;_eventCleanups;_isAttached;_anchor;get position(){return this._position}set position(e){e=e==="end"?"end":"start",e!==this._position&&(this._isAttached&&this._updatePositionInParent(e),this._position=e,this.onPositionChanged.emit())}_position="start";get mode(){return this._mode}set mode(e){this._mode=e,this._updateFocusTrapState(),this._modeChanged.next()}_mode="over";get disableClose(){return this._disableClose}set disableClose(e){this._disableClose=Sr(e)}_disableClose=!1;get autoFocus(){let e=this._autoFocus;return e??(this.mode==="side"?"dialog":"first-tabbable")}set autoFocus(e){(e==="true"||e==="false"||e==null)&&(e=Sr(e)),this._autoFocus=e}_autoFocus;get opened(){return this._opened}set opened(e){this.toggle(Sr(e))}_opened=!1;_openedVia;_animationStarted=new je;_animationEnd=new je;openedChange=new Ve(!0);_openedStream=this.openedChange.pipe($A(e=>e),aA(()=>{}));openedStart=this._animationStarted.pipe($A(()=>this.opened),jh(void 0));_closedStream=this.openedChange.pipe($A(e=>!e),aA(()=>{}));closedStart=this._animationStarted.pipe($A(()=>!this.opened),jh(void 0));_destroyed=new je;onPositionChanged=new Ve;_content;_modeChanged=new je;_injector=E(Dt);_changeDetectorRef=E(ut);constructor(){this.openedChange.pipe(mt(this._destroyed)).subscribe(e=>{e?(this._doc&&(this._elementFocusedBeforeDrawerWasOpened=this._doc.activeElement),this._takeFocus()):this._isFocusWithinDrawer()&&this._restoreFocus(this._openedVia||"program")}),this._ngZone.runOutsideAngular(()=>{let e=this._elementRef.nativeElement;Ya(e,"keydown").pipe($A(i=>i.keyCode===27&&!this.disableClose&&!Tr(i)),mt(this._destroyed)).subscribe(i=>this._ngZone.run(()=>{this.close(),i.stopPropagation(),i.preventDefault()})),this._eventCleanups=[this._renderer.listen(e,"transitionrun",this._handleTransitionEvent),this._renderer.listen(e,"transitionend",this._handleTransitionEvent),this._renderer.listen(e,"transitioncancel",this._handleTransitionEvent)]}),this._animationEnd.subscribe(()=>{this.openedChange.emit(this._opened)})}_forceFocus(e,i){this._interactivityChecker.isFocusable(e)||(e.tabIndex=-1,this._ngZone.runOutsideAngular(()=>{let n=()=>{o(),r(),e.removeAttribute("tabindex")},o=this._renderer.listen(e,"blur",n),r=this._renderer.listen(e,"mousedown",n)})),e.focus(i)}_focusByCssSelector(e,i){let n=this._elementRef.nativeElement.querySelector(e);n&&this._forceFocus(n,i)}_takeFocus(){if(!this._focusTrap)return;let e=this._elementRef.nativeElement;switch(this.autoFocus){case!1:case"dialog":return;case!0:case"first-tabbable":Gr(()=>{!this._focusTrap.focusInitialElement()&&typeof e.focus=="function"&&e.focus()},{injector:this._injector});break;case"first-heading":this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role="heading"]');break;default:this._focusByCssSelector(this.autoFocus);break}}_restoreFocus(e){this.autoFocus!=="dialog"&&(this._elementFocusedBeforeDrawerWasOpened?this._focusMonitor.focusVia(this._elementFocusedBeforeDrawerWasOpened,e):this._elementRef.nativeElement.blur(),this._elementFocusedBeforeDrawerWasOpened=null)}_isFocusWithinDrawer(){let e=this._doc.activeElement;return!!e&&this._elementRef.nativeElement.contains(e)}ngAfterViewInit(){this._isAttached=!0,this._position==="end"&&this._updatePositionInParent("end"),this._platform.isBrowser&&(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement),this._updateFocusTrapState())}ngOnDestroy(){this._eventCleanups.forEach(e=>e()),this._focusTrap?.destroy(),this._anchor?.remove(),this._anchor=null,this._animationStarted.complete(),this._animationEnd.complete(),this._modeChanged.complete(),this._destroyed.next(),this._destroyed.complete()}open(e){return this.toggle(!0,e)}close(){return this.toggle(!1)}_closeViaBackdropClick(){return this._setOpen(!1,!0,"mouse")}toggle(e=!this.opened,i){e&&i&&(this._openedVia=i);let n=this._setOpen(e,!e&&this._isFocusWithinDrawer(),this._openedVia||"program");return e||(this._openedVia=null),n}_setOpen(e,i,n){return e===this._opened?Promise.resolve(e?"open":"close"):(this._opened=e,this._container?._transitionsEnabled?this._setIsAnimating(!0):setTimeout(()=>{this._animationStarted.next(),this._animationEnd.next()}),this._elementRef.nativeElement.classList.toggle("mat-drawer-opened",e),!e&&i&&this._restoreFocus(n),this._changeDetectorRef.markForCheck(),this._updateFocusTrapState(),new Promise(o=>{this.openedChange.pipe(Pn(1)).subscribe(r=>o(r?"open":"close"))}))}_setIsAnimating(e){this._elementRef.nativeElement.classList.toggle("mat-drawer-animating",e)}_getWidth(){return this._elementRef.nativeElement.offsetWidth||0}_updateFocusTrapState(){this._focusTrap&&(this._focusTrap.enabled=!!this._container?.hasBackdrop&&this.opened)}_updatePositionInParent(e){if(!this._platform.isBrowser)return;let i=this._elementRef.nativeElement,n=i.parentNode;e==="end"?(this._anchor||(this._anchor=this._doc.createComment("mat-drawer-anchor"),n.insertBefore(this._anchor,i)),n.appendChild(i)):this._anchor&&this._anchor.parentNode.insertBefore(i,this._anchor)}_handleTransitionEvent=e=>{let i=this._elementRef.nativeElement;e.target===i&&this._ngZone.run(()=>{e.type==="transitionrun"?this._animationStarted.next(e):(e.type==="transitionend"&&this._setIsAnimating(!1),this._animationEnd.next(e))})};static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-drawer"]],viewQuery:function(i,n){if(i&1&&At(Tbe,5),i&2){let o;oA(o=rA())&&(n._content=o.first)}},hostAttrs:["tabIndex","-1",1,"mat-drawer"],hostVars:11,hostBindings:function(i,n){i&2&&(AA("align",null),cn("visibility",!n._container&&!n.opened?"hidden":null),iA("mat-drawer-end",n.position==="end")("mat-drawer-over",n.mode==="over")("mat-drawer-push",n.mode==="push")("mat-drawer-side",n.mode==="side"))},inputs:{position:"position",mode:"mode",disableClose:"disableClose",autoFocus:"autoFocus",opened:"opened"},outputs:{openedChange:"openedChange",_openedStream:"opened",openedStart:"openedStart",_closedStream:"closed",closedStart:"closedStart",onPositionChanged:"positionChanged"},exportAs:["matDrawer"],ngContentSelectors:NAe,decls:3,vars:0,consts:[["content",""],["cdkScrollable","",1,"mat-drawer-inner-container"]],template:function(i,n){i&1&&(Kt(),m(0,"div",1,0),NA(2),p())},dependencies:[f2],encapsulation:2,changeDetection:0})}return t})(),LF=(()=>{class t{_dir=E(Do,{optional:!0});_element=E(eA);_ngZone=E(yA);_changeDetectorRef=E(ut);_animationMode=E(Oi,{optional:!0});_transitionsEnabled=!1;_allDrawers;_drawers=new qa;_content;_userContent;get start(){return this._start}get end(){return this._end}get autosize(){return this._autosize}set autosize(e){this._autosize=Sr(e)}_autosize=E(zbe);get hasBackdrop(){return this._drawerHasBackdrop(this._start)||this._drawerHasBackdrop(this._end)}set hasBackdrop(e){this._backdropOverride=e==null?null:Sr(e)}_backdropOverride;backdropClick=new Ve;_start;_end;_left;_right;_destroyed=new je;_doCheckSubject=new je;_contentMargins={left:null,right:null};_contentMarginChanges=new je;get scrollable(){return this._userContent||this._content}_injector=E(Dt);constructor(){let e=E(mi),i=E(Ol);this._dir?.change.pipe(mt(this._destroyed)).subscribe(()=>{this._validateDrawers(),this.updateContentMargins()}),i.change().pipe(mt(this._destroyed)).subscribe(()=>this.updateContentMargins()),this._animationMode!=="NoopAnimations"&&e.isBrowser&&this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{this._element.nativeElement.classList.add("mat-drawer-transition"),this._transitionsEnabled=!0},200)})}ngAfterContentInit(){this._allDrawers.changes.pipe(In(this._allDrawers),mt(this._destroyed)).subscribe(e=>{this._drawers.reset(e.filter(i=>!i._container||i._container===this)),this._drawers.notifyOnChanges()}),this._drawers.changes.pipe(In(null)).subscribe(()=>{this._validateDrawers(),this._drawers.forEach(e=>{this._watchDrawerToggle(e),this._watchDrawerPosition(e),this._watchDrawerMode(e)}),(!this._drawers.length||this._isDrawerOpen(this._start)||this._isDrawerOpen(this._end))&&this.updateContentMargins(),this._changeDetectorRef.markForCheck()}),this._ngZone.runOutsideAngular(()=>{this._doCheckSubject.pipe(Ws(10),mt(this._destroyed)).subscribe(()=>this.updateContentMargins())})}ngOnDestroy(){this._contentMarginChanges.complete(),this._doCheckSubject.complete(),this._drawers.destroy(),this._destroyed.next(),this._destroyed.complete()}open(){this._drawers.forEach(e=>e.open())}close(){this._drawers.forEach(e=>e.close())}updateContentMargins(){let e=0,i=0;if(this._left&&this._left.opened){if(this._left.mode=="side")e+=this._left._getWidth();else if(this._left.mode=="push"){let n=this._left._getWidth();e+=n,i-=n}}if(this._right&&this._right.opened){if(this._right.mode=="side")i+=this._right._getWidth();else if(this._right.mode=="push"){let n=this._right._getWidth();i+=n,e-=n}}e=e||null,i=i||null,(e!==this._contentMargins.left||i!==this._contentMargins.right)&&(this._contentMargins={left:e,right:i},this._ngZone.run(()=>this._contentMarginChanges.next(this._contentMargins)))}ngDoCheck(){this._autosize&&this._isPushed()&&this._ngZone.runOutsideAngular(()=>this._doCheckSubject.next())}_watchDrawerToggle(e){e._animationStarted.pipe(mt(this._drawers.changes)).subscribe(()=>{this.updateContentMargins(),this._changeDetectorRef.markForCheck()}),e.mode!=="side"&&e.openedChange.pipe(mt(this._drawers.changes)).subscribe(()=>this._setContainerClass(e.opened))}_watchDrawerPosition(e){e.onPositionChanged.pipe(mt(this._drawers.changes)).subscribe(()=>{Gr({read:()=>this._validateDrawers()},{injector:this._injector})})}_watchDrawerMode(e){e._modeChanged.pipe(mt(Bi(this._drawers.changes,this._destroyed))).subscribe(()=>{this.updateContentMargins(),this._changeDetectorRef.markForCheck()})}_setContainerClass(e){let i=this._element.nativeElement.classList,n="mat-drawer-container-has-open";e?i.add(n):i.remove(n)}_validateDrawers(){this._start=this._end=null,this._drawers.forEach(e=>{e.position=="end"?(this._end!=null,this._end=e):(this._start!=null,this._start=e)}),this._right=this._left=null,this._dir&&this._dir.value==="rtl"?(this._left=this._end,this._right=this._start):(this._left=this._start,this._right=this._end)}_isPushed(){return this._isDrawerOpen(this._start)&&this._start.mode!="over"||this._isDrawerOpen(this._end)&&this._end.mode!="over"}_onBackdropClicked(){this.backdropClick.emit(),this._closeModalDrawersViaBackdrop()}_closeModalDrawersViaBackdrop(){[this._start,this._end].filter(e=>e&&!e.disableClose&&this._drawerHasBackdrop(e)).forEach(e=>e._closeViaBackdropClick())}_isShowingBackdrop(){return this._isDrawerOpen(this._start)&&this._drawerHasBackdrop(this._start)||this._isDrawerOpen(this._end)&&this._drawerHasBackdrop(this._end)}_isDrawerOpen(e){return e!=null&&e.opened}_drawerHasBackdrop(e){return this._backdropOverride==null?!!e&&e.mode!=="side":this._backdropOverride}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-drawer-container"]],contentQueries:function(i,n,o){if(i&1&&(ni(o,RF,5),ni(o,NF,5)),i&2){let r;oA(r=rA())&&(n._content=r.first),oA(r=rA())&&(n._allDrawers=r)}},viewQuery:function(i,n){if(i&1&&At(RF,5),i&2){let o;oA(o=rA())&&(n._userContent=o.first)}},hostAttrs:[1,"mat-drawer-container"],hostVars:2,hostBindings:function(i,n){i&2&&iA("mat-drawer-container-explicit-backdrop",n._backdropOverride)},inputs:{autosize:"autosize",hasBackdrop:"hasBackdrop"},outputs:{backdropClick:"backdropClick"},exportAs:["matDrawerContainer"],features:[gt([{provide:LAe,useExisting:t}])],ngContentSelectors:Jbe,decls:4,vars:2,consts:[[1,"mat-drawer-backdrop",3,"mat-drawer-shown"],[1,"mat-drawer-backdrop",3,"click"]],template:function(i,n){i&1&&(Kt(Obe),ne(0,Ybe,1,2,"div",0),NA(1),NA(2,1),ne(3,Hbe,2,0,"mat-drawer-content")),i&2&&($(n.hasBackdrop?0:-1),y(3),$(n._content?-1:3))},dependencies:[RF],styles:[".mat-drawer-container{position:relative;z-index:1;color:var(--mat-sidenav-content-text-color, var(--mat-sys-on-background));background-color:var(--mat-sidenav-content-background-color, var(--mat-sys-background));box-sizing:border-box;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible;background-color:var(--mat-sidenav-scrim-color, color-mix(in srgb, var(--mat-sys-neutral-variant20) 40%, transparent))}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}@media(forced-colors: active){.mat-drawer-backdrop{opacity:.5}}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-content.mat-drawer-content-hidden{opacity:0}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;color:var(--mat-sidenav-container-text-color, var(--mat-sys-on-surface-variant));box-shadow:var(--mat-sidenav-container-elevation-shadow, none);background-color:var(--mat-sidenav-container-background-color, var(--mat-sys-surface));border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));width:var(--mat-sidenav-container-width, 360px);display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}@media(forced-colors: active){.mat-drawer,[dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}}@media(forced-colors: active){[dir=rtl] .mat-drawer,.mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0);border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .mat-drawer{border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-left-radius:0;border-bottom-left-radius:0;left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer-transition .mat-drawer{transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating){visibility:hidden;box-shadow:none}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating) .mat-drawer-inner-container{display:none}.mat-drawer.mat-drawer-opened.mat-drawer-opened{transform:none}.mat-drawer-side{box-shadow:none;border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid}.mat-drawer-side.mat-drawer-end{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side.mat-drawer-end{border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid;border-left:none}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto}.mat-sidenav-fixed{position:fixed}"],encapsulation:2,changeDetection:0})}return t})();var Vbe=["switch"],qbe=["*"];function Wbe(t,A){t&1&&(m(0,"span",10),ft(),m(1,"svg",12),ve(2,"path",13),p(),m(3,"svg",14),ve(4,"path",15),p()())}var Zbe=new re("mat-slide-toggle-default-options",{providedIn:"root",factory:()=>({disableToggleValue:!1,hideIcon:!1,disabledInteractive:!1})}),Xbe={provide:sl,useExisting:zr(()=>FF),multi:!0},CD=class{source;checked;constructor(A,e){this.source=A,this.checked=e}},FF=(()=>{class t{_elementRef=E(eA);_focusMonitor=E(ns);_changeDetectorRef=E(ut);defaults=E(Zbe);_onChange=e=>{};_onTouched=()=>{};_validatorOnChange=()=>{};_uniqueId;_checked=!1;_createChangeEvent(e){return new CD(this,e)}_labelId;get buttonId(){return`${this.id||this._uniqueId}-button`}_switchElement;focus(){this._switchElement.nativeElement.focus()}_noopAnimations;_focused;name=null;id;labelPosition="after";ariaLabel=null;ariaLabelledby=null;ariaDescribedby;required;color;disabled=!1;disableRipple=!1;tabIndex=0;get checked(){return this._checked}set checked(e){this._checked=e,this._changeDetectorRef.markForCheck()}hideIcon;disabledInteractive;change=new Ve;toggleChange=new Ve;get inputId(){return`${this.id||this._uniqueId}-input`}constructor(){E(Wn).load(Pr);let e=E(new ws("tabindex"),{optional:!0}),i=this.defaults,n=E(Oi,{optional:!0});this.tabIndex=e==null?0:parseInt(e)||0,this.color=i.color||"accent",this._noopAnimations=n==="NoopAnimations",this.id=this._uniqueId=E(un).getId("mat-mdc-slide-toggle-"),this.hideIcon=i.hideIcon??!1,this.disabledInteractive=i.disabledInteractive??!1,this._labelId=this._uniqueId+"-label"}ngAfterContentInit(){this._focusMonitor.monitor(this._elementRef,!0).subscribe(e=>{e==="keyboard"||e==="program"?(this._focused=!0,this._changeDetectorRef.markForCheck()):e||Promise.resolve().then(()=>{this._focused=!1,this._onTouched(),this._changeDetectorRef.markForCheck()})})}ngOnChanges(e){e.required&&this._validatorOnChange()}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef)}writeValue(e){this.checked=!!e}registerOnChange(e){this._onChange=e}registerOnTouched(e){this._onTouched=e}validate(e){return this.required&&e.value!==!0?{required:!0}:null}registerOnValidatorChange(e){this._validatorOnChange=e}setDisabledState(e){this.disabled=e,this._changeDetectorRef.markForCheck()}toggle(){this.checked=!this.checked,this._onChange(this.checked)}_emitChangeEvent(){this._onChange(this.checked),this.change.emit(this._createChangeEvent(this.checked))}_handleClick(){this.disabled||(this.toggleChange.emit(),this.defaults.disableToggleValue||(this.checked=!this.checked,this._onChange(this.checked),this.change.emit(new CD(this,this.checked))))}_getAriaLabelledBy(){return this.ariaLabelledby?this.ariaLabelledby:this.ariaLabel?null:this._labelId}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-slide-toggle"]],viewQuery:function(i,n){if(i&1&&At(Vbe,5),i&2){let o;oA(o=rA())&&(n._switchElement=o.first)}},hostAttrs:[1,"mat-mdc-slide-toggle"],hostVars:13,hostBindings:function(i,n){i&2&&(ea("id",n.id),AA("tabindex",null)("aria-label",null)("name",null)("aria-labelledby",null),Lo(n.color?"mat-"+n.color:""),iA("mat-mdc-slide-toggle-focused",n._focused)("mat-mdc-slide-toggle-checked",n.checked)("_mat-animation-noopable",n._noopAnimations))},inputs:{name:"name",id:"id",labelPosition:"labelPosition",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],required:[2,"required","required",IA],color:"color",disabled:[2,"disabled","disabled",IA],disableRipple:[2,"disableRipple","disableRipple",IA],tabIndex:[2,"tabIndex","tabIndex",e=>e==null?0:ln(e)],checked:[2,"checked","checked",IA],hideIcon:[2,"hideIcon","hideIcon",IA],disabledInteractive:[2,"disabledInteractive","disabledInteractive",IA]},outputs:{change:"change",toggleChange:"toggleChange"},exportAs:["matSlideToggle"],features:[gt([Xbe,{provide:z0,useExisting:t,multi:!0}]),ti],ngContentSelectors:qbe,decls:13,vars:27,consts:[["switch",""],["mat-internal-form-field","",3,"labelPosition"],["role","switch","type","button",1,"mdc-switch",3,"click","tabIndex","disabled"],[1,"mdc-switch__track"],[1,"mdc-switch__handle-track"],[1,"mdc-switch__handle"],[1,"mdc-switch__shadow"],[1,"mdc-elevation-overlay"],[1,"mdc-switch__ripple"],["mat-ripple","",1,"mat-mdc-slide-toggle-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleCentered"],[1,"mdc-switch__icons"],[1,"mdc-label",3,"click","for"],["viewBox","0 0 24 24","aria-hidden","true",1,"mdc-switch__icon","mdc-switch__icon--on"],["d","M19.69,5.23L8.96,15.96l-4.23-4.23L2.96,13.5l6,6L21.46,7L19.69,5.23z"],["viewBox","0 0 24 24","aria-hidden","true",1,"mdc-switch__icon","mdc-switch__icon--off"],["d","M20 13H4v-2h16v2z"]],template:function(i,n){if(i&1){let o=Ue();Kt(),m(0,"div",1)(1,"button",2,0),ee("click",function(){return q(o),W(n._handleClick())}),ve(3,"span",3),m(4,"span",4)(5,"span",5)(6,"span",6),ve(7,"span",7),p(),m(8,"span",8),ve(9,"span",9),p(),ne(10,Wbe,5,0,"span",10),p()()(),m(11,"label",11),ee("click",function(s){return q(o),W(s.stopPropagation())}),NA(12),p()()}if(i&2){let o=Ji(2);te("labelPosition",n.labelPosition),y(),iA("mdc-switch--selected",n.checked)("mdc-switch--unselected",!n.checked)("mdc-switch--checked",n.checked)("mdc-switch--disabled",n.disabled)("mat-mdc-slide-toggle-disabled-interactive",n.disabledInteractive),te("tabIndex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex)("disabled",n.disabled&&!n.disabledInteractive),AA("id",n.buttonId)("name",n.name)("aria-label",n.ariaLabel)("aria-labelledby",n._getAriaLabelledBy())("aria-describedby",n.ariaDescribedby)("aria-required",n.required||null)("aria-checked",n.checked)("aria-disabled",n.disabled&&n.disabledInteractive?"true":null),y(8),te("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)("matRippleCentered",!0),y(),$(n.hideIcon?-1:10),y(),te("for",n.buttonId),AA("id",n._labelId)}},dependencies:[ec,U5],styles:['.mdc-switch{align-items:center;background:none;border:none;cursor:pointer;display:inline-flex;flex-shrink:0;margin:0;outline:none;overflow:visible;padding:0;position:relative;width:var(--mdc-switch-track-width, 52px)}.mdc-switch.mdc-switch--disabled{cursor:default;pointer-events:none}.mdc-switch.mat-mdc-slide-toggle-disabled-interactive{pointer-events:auto}.mdc-switch__track{overflow:hidden;position:relative;width:100%;height:var(--mdc-switch-track-height, 32px);border-radius:var(--mdc-switch-track-shape, var(--mat-sys-corner-full))}.mdc-switch--disabled.mdc-switch .mdc-switch__track{opacity:var(--mdc-switch-disabled-track-opacity, 0.12)}.mdc-switch__track::before,.mdc-switch__track::after{border:1px solid rgba(0,0,0,0);border-radius:inherit;box-sizing:border-box;content:"";height:100%;left:0;position:absolute;width:100%;border-width:var(--mat-switch-track-outline-width, 2px);border-color:var(--mat-switch-track-outline-color, var(--mat-sys-outline))}.mdc-switch--selected .mdc-switch__track::before,.mdc-switch--selected .mdc-switch__track::after{border-width:var(--mat-switch-selected-track-outline-width, 2px);border-color:var(--mat-switch-selected-track-outline-color, transparent)}.mdc-switch--disabled .mdc-switch__track::before,.mdc-switch--disabled .mdc-switch__track::after{border-width:var(--mat-switch-disabled-unselected-track-outline-width, 2px);border-color:var(--mat-switch-disabled-unselected-track-outline-color, var(--mat-sys-on-surface))}@media(forced-colors: active){.mdc-switch__track{border-color:currentColor}}.mdc-switch__track::before{transition:transform 75ms 0ms cubic-bezier(0, 0, 0.2, 1);transform:translateX(0);background:var(--mdc-switch-unselected-track-color, var(--mat-sys-surface-variant))}.mdc-switch--selected .mdc-switch__track::before{transition:transform 75ms 0ms cubic-bezier(0.4, 0, 0.6, 1);transform:translateX(100%)}[dir=rtl] .mdc-switch--selected .mdc-switch--selected .mdc-switch__track::before{transform:translateX(-100%)}.mdc-switch--selected .mdc-switch__track::before{opacity:var(--mat-switch-hidden-track-opacity, 0);transition:var(--mat-switch-hidden-track-transition, opacity 75ms)}.mdc-switch--unselected .mdc-switch__track::before{opacity:var(--mat-switch-visible-track-opacity, 1);transition:var(--mat-switch-visible-track-transition, opacity 75ms)}.mdc-switch:enabled:hover:not(:focus):not(:active) .mdc-switch__track::before{background:var(--mdc-switch-unselected-hover-track-color, var(--mat-sys-surface-variant))}.mdc-switch:enabled:focus:not(:active) .mdc-switch__track::before{background:var(--mdc-switch-unselected-focus-track-color, var(--mat-sys-surface-variant))}.mdc-switch:enabled:active .mdc-switch__track::before{background:var(--mdc-switch-unselected-pressed-track-color, var(--mat-sys-surface-variant))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__track::before,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__track::before,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__track::before,.mdc-switch.mdc-switch--disabled .mdc-switch__track::before{background:var(--mdc-switch-disabled-unselected-track-color, var(--mat-sys-surface-variant))}.mdc-switch__track::after{transform:translateX(-100%);background:var(--mdc-switch-selected-track-color, var(--mat-sys-primary))}[dir=rtl] .mdc-switch__track::after{transform:translateX(100%)}.mdc-switch--selected .mdc-switch__track::after{transform:translateX(0)}.mdc-switch--selected .mdc-switch__track::after{opacity:var(--mat-switch-visible-track-opacity, 1);transition:var(--mat-switch-visible-track-transition, opacity 75ms)}.mdc-switch--unselected .mdc-switch__track::after{opacity:var(--mat-switch-hidden-track-opacity, 0);transition:var(--mat-switch-hidden-track-transition, opacity 75ms)}.mdc-switch:enabled:hover:not(:focus):not(:active) .mdc-switch__track::after{background:var(--mdc-switch-selected-hover-track-color, var(--mat-sys-primary))}.mdc-switch:enabled:focus:not(:active) .mdc-switch__track::after{background:var(--mdc-switch-selected-focus-track-color, var(--mat-sys-primary))}.mdc-switch:enabled:active .mdc-switch__track::after{background:var(--mdc-switch-selected-pressed-track-color, var(--mat-sys-primary))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__track::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__track::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__track::after,.mdc-switch.mdc-switch--disabled .mdc-switch__track::after{background:var(--mdc-switch-disabled-selected-track-color, var(--mat-sys-on-surface))}.mdc-switch__handle-track{height:100%;pointer-events:none;position:absolute;top:0;transition:transform 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1);left:0;right:auto;transform:translateX(0);width:calc(100% - var(--mdc-switch-handle-width))}[dir=rtl] .mdc-switch__handle-track{left:auto;right:0}.mdc-switch--selected .mdc-switch__handle-track{transform:translateX(100%)}[dir=rtl] .mdc-switch--selected .mdc-switch__handle-track{transform:translateX(-100%)}.mdc-switch__handle{display:flex;pointer-events:auto;position:absolute;top:50%;transform:translateY(-50%);left:0;right:auto;transition:width 75ms cubic-bezier(0.4, 0, 0.2, 1),height 75ms cubic-bezier(0.4, 0, 0.2, 1),margin 75ms cubic-bezier(0.4, 0, 0.2, 1);width:var(--mdc-switch-handle-width);height:var(--mdc-switch-handle-height);border-radius:var(--mdc-switch-handle-shape, var(--mat-sys-corner-full))}[dir=rtl] .mdc-switch__handle{left:auto;right:0}.mat-mdc-slide-toggle .mdc-switch--unselected .mdc-switch__handle{width:var(--mat-switch-unselected-handle-size, 16px);height:var(--mat-switch-unselected-handle-size, 16px);margin:var(--mat-switch-unselected-handle-horizontal-margin, 0 8px)}.mat-mdc-slide-toggle .mdc-switch--unselected .mdc-switch__handle:has(.mdc-switch__icons){margin:var(--mat-switch-unselected-with-icon-handle-horizontal-margin, 0 4px)}.mat-mdc-slide-toggle .mdc-switch--selected .mdc-switch__handle{width:var(--mat-switch-selected-handle-size, 24px);height:var(--mat-switch-selected-handle-size, 24px);margin:var(--mat-switch-selected-handle-horizontal-margin, 0 24px)}.mat-mdc-slide-toggle .mdc-switch--selected .mdc-switch__handle:has(.mdc-switch__icons){margin:var(--mat-switch-selected-with-icon-handle-horizontal-margin, 0 24px)}.mat-mdc-slide-toggle .mdc-switch__handle:has(.mdc-switch__icons){width:var(--mat-switch-with-icon-handle-size, 24px);height:var(--mat-switch-with-icon-handle-size, 24px)}.mat-mdc-slide-toggle .mdc-switch:active:not(.mdc-switch--disabled) .mdc-switch__handle{width:var(--mat-switch-pressed-handle-size, 28px);height:var(--mat-switch-pressed-handle-size, 28px)}.mat-mdc-slide-toggle .mdc-switch--selected:active:not(.mdc-switch--disabled) .mdc-switch__handle{margin:var(--mat-switch-selected-pressed-handle-horizontal-margin, 0 22px)}.mat-mdc-slide-toggle .mdc-switch--unselected:active:not(.mdc-switch--disabled) .mdc-switch__handle{margin:var(--mat-switch-unselected-pressed-handle-horizontal-margin, 0 2px)}.mdc-switch--disabled.mdc-switch--selected .mdc-switch__handle::after{opacity:var(--mat-switch-disabled-selected-handle-opacity, 1)}.mdc-switch--disabled.mdc-switch--unselected .mdc-switch__handle::after{opacity:var(--mat-switch-disabled-unselected-handle-opacity, 0.38)}.mdc-switch__handle::before,.mdc-switch__handle::after{border:1px solid rgba(0,0,0,0);border-radius:inherit;box-sizing:border-box;content:"";width:100%;height:100%;left:0;position:absolute;top:0;transition:background-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1),border-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1);z-index:-1}@media(forced-colors: active){.mdc-switch__handle::before,.mdc-switch__handle::after{border-color:currentColor}}.mdc-switch--selected:enabled .mdc-switch__handle::after{background:var(--mdc-switch-selected-handle-color, var(--mat-sys-on-primary))}.mdc-switch--selected:enabled:hover:not(:focus):not(:active) .mdc-switch__handle::after{background:var(--mdc-switch-selected-hover-handle-color, var(--mat-sys-primary-container))}.mdc-switch--selected:enabled:focus:not(:active) .mdc-switch__handle::after{background:var(--mdc-switch-selected-focus-handle-color, var(--mat-sys-primary-container))}.mdc-switch--selected:enabled:active .mdc-switch__handle::after{background:var(--mdc-switch-selected-pressed-handle-color, var(--mat-sys-primary-container))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:hover:not(:focus):not(:active) .mdc-switch__handle::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:focus:not(:active) .mdc-switch__handle::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:active .mdc-switch__handle::after,.mdc-switch--selected.mdc-switch--disabled .mdc-switch__handle::after{background:var(--mdc-switch-disabled-selected-handle-color, var(--mat-sys-surface))}.mdc-switch--unselected:enabled .mdc-switch__handle::after{background:var(--mdc-switch-unselected-handle-color, var(--mat-sys-outline))}.mdc-switch--unselected:enabled:hover:not(:focus):not(:active) .mdc-switch__handle::after{background:var(--mdc-switch-unselected-hover-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected:enabled:focus:not(:active) .mdc-switch__handle::after{background:var(--mdc-switch-unselected-focus-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected:enabled:active .mdc-switch__handle::after{background:var(--mdc-switch-unselected-pressed-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected.mdc-switch--disabled .mdc-switch__handle::after{background:var(--mdc-switch-disabled-unselected-handle-color, var(--mat-sys-on-surface))}.mdc-switch__handle::before{background:var(--mdc-switch-handle-surface-color)}.mdc-switch__shadow{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0}.mdc-switch:enabled .mdc-switch__shadow{box-shadow:var(--mdc-switch-handle-elevation-shadow)}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__shadow,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__shadow,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__shadow,.mdc-switch.mdc-switch--disabled .mdc-switch__shadow{box-shadow:var(--mdc-switch-disabled-handle-elevation-shadow)}.mdc-switch__ripple{left:50%;position:absolute;top:50%;transform:translate(-50%, -50%);z-index:-1;width:var(--mdc-switch-state-layer-size, 40px);height:var(--mdc-switch-state-layer-size, 40px)}.mdc-switch__ripple::after{content:"";opacity:0}.mdc-switch--disabled .mdc-switch__ripple::after{display:none}.mat-mdc-slide-toggle-disabled-interactive .mdc-switch__ripple::after{display:block}.mdc-switch:hover .mdc-switch__ripple::after{opacity:.04;transition:75ms opacity cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-slide-toggle.mat-mdc-slide-toggle-focused .mdc-switch .mdc-switch__ripple::after{opacity:.12}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:focus .mdc-switch__ripple::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:active .mdc-switch__ripple::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:hover:not(:focus) .mdc-switch__ripple::after,.mdc-switch--unselected:enabled:hover:not(:focus) .mdc-switch__ripple::after{background:var(--mdc-switch-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-switch--unselected:enabled:focus .mdc-switch__ripple::after{background:var(--mdc-switch-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-switch--unselected:enabled:active .mdc-switch__ripple::after{background:var(--mdc-switch-unselected-pressed-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mdc-switch-unselected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));transition:opacity 75ms linear}.mdc-switch--selected:enabled:hover:not(:focus) .mdc-switch__ripple::after{background:var(--mdc-switch-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-switch--selected:enabled:focus .mdc-switch__ripple::after{background:var(--mdc-switch-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-switch--selected:enabled:active .mdc-switch__ripple::after{background:var(--mdc-switch-selected-pressed-state-layer-color, var(--mat-sys-primary));opacity:var(--mdc-switch-selected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));transition:opacity 75ms linear}.mdc-switch__icons{position:relative;height:100%;width:100%;z-index:1}.mdc-switch--disabled.mdc-switch--unselected .mdc-switch__icons{opacity:var(--mdc-switch-disabled-unselected-icon-opacity, 0.38)}.mdc-switch--disabled.mdc-switch--selected .mdc-switch__icons{opacity:var(--mdc-switch-disabled-selected-icon-opacity, 0.38)}.mdc-switch__icon{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0;opacity:0;transition:opacity 30ms 0ms cubic-bezier(0.4, 0, 1, 1)}.mdc-switch--unselected .mdc-switch__icon{width:var(--mdc-switch-unselected-icon-size, 16px);height:var(--mdc-switch-unselected-icon-size, 16px);fill:var(--mdc-switch-unselected-icon-color, var(--mat-sys-surface-variant))}.mdc-switch--unselected.mdc-switch--disabled .mdc-switch__icon{fill:var(--mdc-switch-disabled-unselected-icon-color, var(--mat-sys-surface-variant))}.mdc-switch--selected .mdc-switch__icon{width:var(--mdc-switch-selected-icon-size, 16px);height:var(--mdc-switch-selected-icon-size, 16px);fill:var(--mdc-switch-selected-icon-color, var(--mat-sys-on-primary-container))}.mdc-switch--selected.mdc-switch--disabled .mdc-switch__icon{fill:var(--mdc-switch-disabled-selected-icon-color, var(--mat-sys-on-surface))}.mdc-switch--selected .mdc-switch__icon--on,.mdc-switch--unselected .mdc-switch__icon--off{opacity:1;transition:opacity 45ms 30ms cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-slide-toggle{-webkit-user-select:none;user-select:none;display:inline-block;-webkit-tap-highlight-color:rgba(0,0,0,0);outline:0}.mat-mdc-slide-toggle .mat-mdc-slide-toggle-ripple,.mat-mdc-slide-toggle .mdc-switch__ripple::after{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:50%;pointer-events:none}.mat-mdc-slide-toggle .mat-mdc-slide-toggle-ripple:not(:empty),.mat-mdc-slide-toggle .mdc-switch__ripple::after:not(:empty){transform:translateZ(0)}.mat-mdc-slide-toggle.mat-mdc-slide-toggle-focused .mat-focus-indicator::before{content:""}.mat-mdc-slide-toggle .mat-internal-form-field{color:var(--mat-switch-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-switch-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-switch-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-switch-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-switch-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-switch-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-slide-toggle .mat-ripple-element{opacity:.12}.mat-mdc-slide-toggle .mat-focus-indicator::before{border-radius:50%}.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle-track,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__icon,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle::before,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle::after,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__track::before,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__track::after{transition:none}.mat-mdc-slide-toggle .mdc-switch:enabled+.mdc-label{cursor:pointer}.mat-mdc-slide-toggle .mdc-switch--disabled+label{color:var(--mdc-switch-disabled-label-text-color)}'],encapsulation:2,changeDetection:0})}return t})();function $be(t,A){if(t&1){let e=Ue();m(0,"div",1)(1,"button",2),ee("click",function(){q(e);let n=M();return W(n.action())}),T(2),p()()}if(t&2){let e=M();y(2),FA(" ",e.data.action," ")}}var eMe=["label"];function AMe(t,A){}var tMe=Math.pow(2,31)-1,Km=class{_overlayRef;instance;containerInstance;_afterDismissed=new je;_afterOpened=new je;_onAction=new je;_durationTimeoutId;_dismissedByAction=!1;constructor(A,e){this._overlayRef=e,this.containerInstance=A,A._onExit.subscribe(()=>this._finishDismiss())}dismiss(){this._afterDismissed.closed||this.containerInstance.exit(),clearTimeout(this._durationTimeoutId)}dismissWithAction(){this._onAction.closed||(this._dismissedByAction=!0,this._onAction.next(),this._onAction.complete(),this.dismiss()),clearTimeout(this._durationTimeoutId)}closeWithAction(){this.dismissWithAction()}_dismissAfter(A){this._durationTimeoutId=setTimeout(()=>this.dismiss(),Math.min(A,tMe))}_open(){this._afterOpened.closed||(this._afterOpened.next(),this._afterOpened.complete())}_finishDismiss(){this._overlayRef.dispose(),this._onAction.closed||this._onAction.complete(),this._afterDismissed.next({dismissedByAction:this._dismissedByAction}),this._afterDismissed.complete(),this._dismissedByAction=!1}afterDismissed(){return this._afterDismissed}afterOpened(){return this.containerInstance._onEnter}onAction(){return this._onAction}},FAe=new re("MatSnackBarData"),gE=class{politeness="assertive";announcementMessage="";viewContainerRef;duration=0;panelClass;direction;data=null;horizontalPosition="center";verticalPosition="bottom"},iMe=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","matSnackBarLabel",""]],hostAttrs:[1,"mat-mdc-snack-bar-label","mdc-snackbar__label"]})}return t})(),nMe=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","matSnackBarActions",""]],hostAttrs:[1,"mat-mdc-snack-bar-actions","mdc-snackbar__actions"]})}return t})(),oMe=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","matSnackBarAction",""]],hostAttrs:[1,"mat-mdc-snack-bar-action","mdc-snackbar__action"]})}return t})(),rMe=(()=>{class t{snackBarRef=E(Km);data=E(FAe);constructor(){}action(){this.snackBarRef.dismissWithAction()}get hasAction(){return!!this.data.action}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["simple-snack-bar"]],hostAttrs:[1,"mat-mdc-simple-snack-bar"],exportAs:["matSnackBar"],decls:3,vars:2,consts:[["matSnackBarLabel",""],["matSnackBarActions",""],["mat-button","","matSnackBarAction","",3,"click"]],template:function(i,n){i&1&&(m(0,"div",0),T(1),p(),ne(2,$be,3,1,"div",1)),i&2&&(y(),FA(" ",n.data.message,` +`),y(),$(n.hasAction?2:-1))},dependencies:[Un,iMe,nMe,oMe],styles:[".mat-mdc-simple-snack-bar{display:flex}"],encapsulation:2,changeDetection:0})}return t})(),sMe={snackBarState:ll("state",[tc("void, hidden",Vo({transform:"scale(0.8)",opacity:0})),tc("visible",Vo({transform:"scale(1)",opacity:1})),Fs("* => visible",ia("150ms cubic-bezier(0, 0, 0.2, 1)")),Fs("* => void, * => hidden",ia("75ms cubic-bezier(0.4, 0.0, 1, 1)",Vo({opacity:0})))])},aMe=(()=>{class t extends H1{_ngZone=E(yA);_elementRef=E(eA);_changeDetectorRef=E(ut);_platform=E(mi);snackBarConfig=E(gE);_document=E(ht);_trackedModals=new Set;_announceDelay=150;_announceTimeoutId;_destroyed=!1;_portalOutlet;_onAnnounce=new je;_onExit=new je;_onEnter=new je;_animationState="void";_live;_label;_role;_liveElementId=E(un).getId("mat-snack-bar-container-live-");constructor(){super();let e=this.snackBarConfig;e.politeness==="assertive"&&!e.announcementMessage?this._live="assertive":e.politeness==="off"?this._live="off":this._live="polite",this._platform.FIREFOX&&(this._live==="polite"&&(this._role="status"),this._live==="assertive"&&(this._role="alert"))}attachComponentPortal(e){this._assertNotAttached();let i=this._portalOutlet.attachComponentPortal(e);return this._afterPortalAttached(),i}attachTemplatePortal(e){this._assertNotAttached();let i=this._portalOutlet.attachTemplatePortal(e);return this._afterPortalAttached(),i}attachDomPortal=e=>{this._assertNotAttached();let i=this._portalOutlet.attachDomPortal(e);return this._afterPortalAttached(),i};onAnimationEnd(e){let{fromState:i,toState:n}=e;if((n==="void"&&i!=="void"||n==="hidden")&&this._completeExit(),n==="visible"){let o=this._onEnter;this._ngZone.run(()=>{o.next(),o.complete()})}}enter(){this._destroyed||(this._animationState="visible",this._changeDetectorRef.markForCheck(),this._changeDetectorRef.detectChanges(),this._screenReaderAnnounce())}exit(){return this._ngZone.run(()=>{this._animationState="hidden",this._changeDetectorRef.markForCheck(),this._elementRef.nativeElement.setAttribute("mat-exit",""),clearTimeout(this._announceTimeoutId)}),this._onExit}ngOnDestroy(){this._destroyed=!0,this._clearFromModals(),this._completeExit()}_completeExit(){queueMicrotask(()=>{this._onExit.next(),this._onExit.complete()})}_afterPortalAttached(){let e=this._elementRef.nativeElement,i=this.snackBarConfig.panelClass;i&&(Array.isArray(i)?i.forEach(r=>e.classList.add(r)):e.classList.add(i)),this._exposeToModals();let n=this._label.nativeElement,o="mdc-snackbar__label";n.classList.toggle(o,!n.querySelector(`.${o}`))}_exposeToModals(){let e=this._liveElementId,i=this._document.querySelectorAll('body > .cdk-overlay-container [aria-modal="true"]');for(let n=0;n{let i=e.getAttribute("aria-owns");if(i){let n=i.replace(this._liveElementId,"").trim();n.length>0?e.setAttribute("aria-owns",n):e.removeAttribute("aria-owns")}}),this._trackedModals.clear()}_assertNotAttached(){this._portalOutlet.hasAttached()}_screenReaderAnnounce(){this._announceTimeoutId||this._ngZone.runOutsideAngular(()=>{this._announceTimeoutId=setTimeout(()=>{let e=this._elementRef.nativeElement.querySelector("[aria-hidden]"),i=this._elementRef.nativeElement.querySelector("[aria-live]");if(e&&i){let n=null;this._platform.isBrowser&&document.activeElement instanceof HTMLElement&&e.contains(document.activeElement)&&(n=document.activeElement),e.removeAttribute("aria-hidden"),i.appendChild(e),n?.focus(),this._onAnnounce.next(),this._onAnnounce.complete()}},this._announceDelay)})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-snack-bar-container"]],viewQuery:function(i,n){if(i&1&&(At(bc,7),At(eMe,7)),i&2){let o;oA(o=rA())&&(n._portalOutlet=o.first),oA(o=rA())&&(n._label=o.first)}},hostAttrs:[1,"mdc-snackbar","mat-mdc-snack-bar-container"],hostVars:1,hostBindings:function(i,n){i&1&&_R("@state.done",function(r){return n.onAnimationEnd(r)}),i&2&&xR("@state",n._animationState)},features:[Ct],decls:6,vars:3,consts:[["label",""],[1,"mdc-snackbar__surface","mat-mdc-snackbar-surface"],[1,"mat-mdc-snack-bar-label"],["aria-hidden","true"],["cdkPortalOutlet",""]],template:function(i,n){i&1&&(m(0,"div",1)(1,"div",2,0)(3,"div",3),ne(4,AMe,0,0,"ng-template",4),p(),ve(5,"div"),p()()),i&2&&(y(5),AA("aria-live",n._live)("role",n._role)("id",n._liveElementId))},dependencies:[bc],styles:[".mat-mdc-snack-bar-container{display:flex;align-items:center;justify-content:center;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0);margin:8px}.mat-mdc-snack-bar-handset .mat-mdc-snack-bar-container{width:100vw}.mat-mdc-snackbar-surface{box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);display:flex;align-items:center;justify-content:flex-start;box-sizing:border-box;padding-left:0;padding-right:8px}[dir=rtl] .mat-mdc-snackbar-surface{padding-right:0;padding-left:8px}.mat-mdc-snack-bar-container .mat-mdc-snackbar-surface{min-width:344px;max-width:672px}.mat-mdc-snack-bar-handset .mat-mdc-snackbar-surface{width:100%;min-width:0}@media(forced-colors: active){.mat-mdc-snackbar-surface{outline:solid 1px}}.mat-mdc-snack-bar-container .mat-mdc-snackbar-surface{color:var(--mdc-snackbar-supporting-text-color, var(--mat-sys-inverse-on-surface));border-radius:var(--mdc-snackbar-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mdc-snackbar-container-color, var(--mat-sys-inverse-surface))}.mdc-snackbar__label{width:100%;flex-grow:1;box-sizing:border-box;margin:0;padding:14px 8px 14px 16px}[dir=rtl] .mdc-snackbar__label{padding-left:8px;padding-right:16px}.mat-mdc-snack-bar-container .mdc-snackbar__label{font-family:var(--mdc-snackbar-supporting-text-font, var(--mat-sys-body-medium-font));font-size:var(--mdc-snackbar-supporting-text-size, var(--mat-sys-body-medium-size));font-weight:var(--mdc-snackbar-supporting-text-weight, var(--mat-sys-body-medium-weight));line-height:var(--mdc-snackbar-supporting-text-line-height, var(--mat-sys-body-medium-line-height))}.mat-mdc-snack-bar-actions{display:flex;flex-shrink:0;align-items:center;box-sizing:border-box}.mat-mdc-snack-bar-handset,.mat-mdc-snack-bar-container,.mat-mdc-snack-bar-label{flex:1 1 auto}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled).mat-unthemed{color:var(--mat-snack-bar-button-color, var(--mat-sys-inverse-primary))}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled){--mat-text-button-state-layer-color:currentColor;--mat-text-button-ripple-color:currentColor}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled) .mat-ripple-element{opacity:.1}"],encapsulation:2,data:{animation:[sMe.snackBarState]}})}return t})();function cMe(){return new gE}var lMe=new re("mat-snack-bar-default-options",{providedIn:"root",factory:cMe}),P1=(()=>{class t{_overlay=E(Or);_live=E(N5);_injector=E(Dt);_breakpointObserver=E(D5);_parentSnackBar=E(t,{optional:!0,skipSelf:!0});_defaultConfig=E(lMe);_snackBarRefAtThisLevel=null;simpleSnackBarComponent=rMe;snackBarContainerComponent=aMe;handsetCssClass="mat-mdc-snack-bar-handset";get _openedSnackBarRef(){let e=this._parentSnackBar;return e?e._openedSnackBarRef:this._snackBarRefAtThisLevel}set _openedSnackBarRef(e){this._parentSnackBar?this._parentSnackBar._openedSnackBarRef=e:this._snackBarRefAtThisLevel=e}constructor(){}openFromComponent(e,i){return this._attach(e,i)}openFromTemplate(e,i){return this._attach(e,i)}open(e,i="",n){let o=ae(ae({},this._defaultConfig),n);return o.data={message:e,action:i},o.announcementMessage===e&&(o.announcementMessage=void 0),this.openFromComponent(this.simpleSnackBarComponent,o)}dismiss(){this._openedSnackBarRef&&this._openedSnackBarRef.dismiss()}ngOnDestroy(){this._snackBarRefAtThisLevel&&this._snackBarRefAtThisLevel.dismiss()}_attachSnackBarContainer(e,i){let n=i&&i.viewContainerRef&&i.viewContainerRef.injector,o=Dt.create({parent:n||this._injector,providers:[{provide:gE,useValue:i}]}),r=new Rg(this.snackBarContainerComponent,i.viewContainerRef,o),s=e.attach(r);return s.instance.snackBarConfig=i,s.instance}_attach(e,i){let n=ae(ae(ae({},new gE),this._defaultConfig),i),o=this._createOverlay(n),r=this._attachSnackBarContainer(o,n),s=new Km(r,o);if(e instanceof en){let a=new ba(e,null,{$implicit:n.data,snackBarRef:s});s.instance=r.attachTemplatePortal(a)}else{let a=this._createInjector(n,s),c=new Rg(e,void 0,a),l=r.attachComponentPortal(c);s.instance=l.instance}return this._breakpointObserver.observe(HZ.HandsetPortrait).pipe(mt(o.detachments())).subscribe(a=>{o.overlayElement.classList.toggle(this.handsetCssClass,a.matches)}),n.announcementMessage&&r._onAnnounce.subscribe(()=>{this._live.announce(n.announcementMessage,n.politeness)}),this._animateSnackBar(s,n),this._openedSnackBarRef=s,this._openedSnackBarRef}_animateSnackBar(e,i){e.afterDismissed().subscribe(()=>{this._openedSnackBarRef==e&&(this._openedSnackBarRef=null),i.announcementMessage&&this._live.clear()}),this._openedSnackBarRef?(this._openedSnackBarRef.afterDismissed().subscribe(()=>{e.containerInstance.enter()}),this._openedSnackBarRef.dismiss()):e.containerInstance.enter(),i.duration&&i.duration>0&&e.afterOpened().subscribe(()=>e._dismissAfter(i.duration))}_createOverlay(e){let i=new id;i.direction=e.direction;let n=this._overlay.position().global(),o=e.direction==="rtl",r=e.horizontalPosition==="left"||e.horizontalPosition==="start"&&!o||e.horizontalPosition==="end"&&o,s=!r&&e.horizontalPosition!=="center";return r?n.left("0"):s?n.right("0"):n.centerHorizontally(),e.verticalPosition==="top"?n.top("0"):n.bottom("0"),i.positionStrategy=n,this._overlay.create(i)}_createInjector(e,i){let n=e&&e.viewContainerRef&&e.viewContainerRef.injector;return Dt.create({parent:n||this._injector,providers:[{provide:Km,useValue:i},{provide:FAe,useValue:e.data}]})}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var gMe=t=>["segment",t],dMe=(t,A)=>({"segment-main":!0,expandable:t,expanded:A});function CMe(t,A){t&1&&ve(0,"div",9)}function IMe(t,A){if(t&1&&(m(0,"span",10),T(1),p()),t&2){let e=M().$implicit;y(),Pe(e.description)}}function uMe(t,A){if(t&1&&(m(0,"section",11),ve(1,"ngx-json-viewer",12),p()),t&2){let e=M().$implicit,i=M();y(),te("json",e.value)("expanded",i.expanded)("depth",i.depth)("_currentDepth",i._currentDepth+1)}}function hMe(t,A){if(t&1){let e=Ue();m(0,"section",2)(1,"section",3),ee("click",function(){let n=q(e).$implicit,o=M();return W(o.toggle(n))}),ne(2,CMe,1,0,"div",4),m(3,"span",5),T(4),p(),m(5,"span",6),T(6,": "),p(),ne(7,IMe,2,1,"span",7),p(),ne(8,uMe,2,4,"section",8),p()}if(t&2){let e=A.$implicit,i=M();te("ngClass",Al(6,gMe,"segment-type-"+e.type)),y(),te("ngClass",tl(8,dMe,i.isExpandable(e),e.expanded)),y(),te("ngIf",i.isExpandable(e)),y(2),Pe(e.key),y(3),te("ngIf",!e.expanded||!i.isExpandable(e)),y(),te("ngIf",e.expanded&&i.isExpandable(e))}}var j1=(()=>{class t{constructor(){this.expanded=!0,this.depth=-1,this._currentDepth=0,this.segments=[]}ngOnChanges(){this.segments=[],this.json=this.decycle(this.json),typeof this.json=="object"?Object.keys(this.json).forEach(e=>{this.segments.push(this.parseKeyValue(e,this.json[e]))}):this.segments.push(this.parseKeyValue(`(${typeof this.json})`,this.json))}isExpandable(e){return e.type==="object"||e.type==="array"}toggle(e){this.isExpandable(e)&&(e.expanded=!e.expanded)}parseKeyValue(e,i){let n={key:e,value:i,type:void 0,description:""+i,expanded:this.isExpanded()};switch(typeof n.value){case"number":{n.type="number";break}case"boolean":{n.type="boolean";break}case"function":{n.type="function";break}case"string":{n.type="string",n.description='"'+n.value+'"';break}case"undefined":{n.type="undefined",n.description="undefined";break}case"object":{n.value===null?(n.type="null",n.description="null"):Array.isArray(n.value)?(n.type="array",n.description="Array["+n.value.length+"] "+JSON.stringify(n.value)):n.value instanceof Date?n.type="date":(n.type="object",n.description="Object "+JSON.stringify(n.value));break}}return n}isExpanded(){return this.expanded&&!(this.depth>-1&&this._currentDepth>=this.depth)}decycle(e){let i=new WeakMap;return function n(o,r){let s,a;return typeof o=="object"&&o!==null&&!(o instanceof Boolean)&&!(o instanceof Date)&&!(o instanceof Number)&&!(o instanceof RegExp)&&!(o instanceof String)?(s=i.get(o),s!==void 0?{$ref:s}:(i.set(o,r),Array.isArray(o)?(a=[],o.forEach(function(c,l){a[l]=n(c,r+"["+l+"]")})):(a={},Object.keys(o).forEach(function(c){a[c]=n(o[c],r+"["+JSON.stringify(c)+"]")})),a)):o}(e,"$")}}return t.\u0275fac=function(e){return new(e||t)},t.\u0275cmp=xe({type:t,selectors:[["ngx-json-viewer"]],inputs:{json:"json",expanded:"expanded",depth:"depth",_currentDepth:"_currentDepth"},standalone:!1,features:[ti],decls:2,vars:1,consts:[[1,"ngx-json-viewer"],[3,"ngClass",4,"ngFor","ngForOf"],[3,"ngClass"],[3,"click","ngClass"],["class","toggler",4,"ngIf"],[1,"segment-key"],[1,"segment-separator"],["class","segment-value",4,"ngIf"],["class","children",4,"ngIf"],[1,"toggler"],[1,"segment-value"],[1,"children"],[3,"json","expanded","depth","_currentDepth"]],template:function(e,i){e&1&&(m(0,"section",0),ne(1,hMe,9,11,"section",1),p()),e&2&&(y(),te("ngForOf",i.segments))},dependencies:[ta,k1,bg,t],styles:['@charset "UTF-8";.ngx-json-viewer[_ngcontent-%COMP%]{font-family:var(--ngx-json-font-family, monospace);font-size:var(--ngx-json-font-size, 1em);width:100%;height:100%;overflow:hidden;position:relative}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%]{padding:2px;margin:1px 1px 1px 12px}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%]{word-wrap:break-word}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .toggler[_ngcontent-%COMP%]{position:absolute;margin-left:-14px;margin-top:3px;font-size:.8em;line-height:1.2em;vertical-align:middle;color:var(--ngx-json-toggler, #787878)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .toggler[_ngcontent-%COMP%]:after{display:inline-block;content:"\\25ba";transition:transform .1s ease-in}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .segment-key[_ngcontent-%COMP%]{color:var(--ngx-json-key, #4E187C)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .segment-separator[_ngcontent-%COMP%]{color:var(--ngx-json-separator, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-value, #000)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .children[_ngcontent-%COMP%]{margin-left:12px}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-string[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-string, #FF6B6B)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-number[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-number, #009688)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-boolean[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-boolean, #B938A4)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-date[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-date, #05668D)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-array[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-array, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-object[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-object, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-function[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-function, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-null[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-null, #fff)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-undefined[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-undefined, #fff)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-null[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{background-color:var(--ngx-json-null-bg, red)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-undefined[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-key[_ngcontent-%COMP%]{color:var(--ngx-json-undefined-key, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-undefined[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{background-color:var(--ngx-json-undefined-key, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-object[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%], .ngx-json-viewer[_ngcontent-%COMP%] .segment-type-array[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%]{white-space:nowrap}.ngx-json-viewer[_ngcontent-%COMP%] .expanded[_ngcontent-%COMP%] > .toggler[_ngcontent-%COMP%]:after{transform:rotate(90deg)}.ngx-json-viewer[_ngcontent-%COMP%] .expandable[_ngcontent-%COMP%], .ngx-json-viewer[_ngcontent-%COMP%] .expandable[_ngcontent-%COMP%] > .toggler[_ngcontent-%COMP%]{cursor:pointer}']}),t})(),nd=(()=>{class t{}return t.\u0275fac=function(e){return new(e||t)},t.\u0275mod=OA({type:t}),t.\u0275inj=TA({imports:[Ur]}),t})();var oa=class t{static getBaseUrlWithoutPath(){let A=window.location.href;return new URL(A).origin+"/dev-ui/"}static getApiServerBaseUrl(){return window.runtimeConfig?.backendUrl||""}static getWSServerUrl(){let A=t.getApiServerBaseUrl();return!A||A==""?window.location.host:A.startsWith("http://")?A.slice(7):A.startsWith("https://")?A.slice(8):A}};var Hl=new re("AgentService");var uD=new re("ArtifactService");var dE=new re("DownloadService");var od=new re("EvalService");var CE=new re("EventService");var GAe="import_session",KAe="edit_function_args";var UAe="a2a_card",Ks=new re("FeatureFlagService");var IE=new re("GraphService");var hD=new re("LocalFileService");var V1=new re("SafeValuesService"),BD=class{openBase64InNewTab(A,e){try{if(!A)return;let i=A;if(A.startsWith("data:")&&A.includes(";base64,")&&(i=i.substring(i.indexOf(";base64,")+8)),!e||!i)return;let n=atob(i),o=new Array(n.length);for(let c=0;cthis.onResizeHandleMouseDown(A)),document.documentElement.style.setProperty("--bottom-panel-height","310px"),this.renderer.setStyle(this.el.nativeElement,"height","var(--bottom-panel-height)")}onResizeHandleMouseDown(A){this.resizingEvent={isResizing:!0,startingCursorY:A.clientY,startingHeight:this.bottomPanelHeight},A.preventDefault()}onMouseMove(A){if(!this.resizingEvent.isResizing)return;let e=this.resizingEvent.startingCursorY-A.clientY,i=this.resizingEvent.startingHeight+e;this.bottomPanelHeight=i,this.renderer.addClass(document.body,"resizing")}onMouseUp(){this.resizingEvent.isResizing=!1,this.renderer.removeClass(document.body,"resizing")}onResize(){this.bottomMaxHeight=window.innerHeight/2,this.bottomPanelHeight=this.bottomPanelHeight}set bottomPanelHeight(A){let e=Math.min(Math.max(A,this.bottomMinHeight),this.bottomMaxHeight);document.body.style.setProperty("--bottom-panel-height",`${e}px`)}get bottomPanelHeight(){let A=getComputedStyle(document.body).getPropertyValue("--bottom-panel-height"),e=parseInt(A,10);return isNaN(e)?500:e}static \u0275fac=function(e){return new(e||t)(DA(eA),DA(an))};static \u0275dir=Oe({type:t,selectors:[["","appResizableBottomPanel",""]],hostBindings:function(e,i){e&1&&ee("mousemove",function(o){return i.onMouseMove(o)},!1,n2)("mouseup",function(){return i.onMouseUp()},!1,n2)("resize",function(){return i.onResize()},!1,Fw)}})};var mD=class t{constructor(A,e){this.el=A;this.renderer=e}sideDrawerMinWidth=310;sideDrawerMaxWidth=window.innerWidth/2;resizeHandle=null;resizingEvent={isResizing:!1,startingCursorX:0,startingWidth:0};ngAfterViewInit(){this.sideDrawerMaxWidth=window.innerWidth/2,this.resizeHandle=document.getElementsByClassName("resize-handler")[0],this.resizeHandle&&this.renderer.listen(this.resizeHandle,"mousedown",A=>this.onResizeHandleMouseDown(A)),document.documentElement.style.setProperty("--side-drawer-width","570px"),this.renderer.setStyle(this.el.nativeElement,"width","var(--side-drawer-width)")}onResizeHandleMouseDown(A){this.resizingEvent={isResizing:!0,startingCursorX:A.clientX,startingWidth:this.sideDrawerWidth},A.preventDefault()}onMouseMove(A){if(!this.resizingEvent.isResizing)return;let e=A.clientX-this.resizingEvent.startingCursorX,i=this.resizingEvent.startingWidth+e;this.sideDrawerWidth=i,this.renderer.addClass(document.body,"resizing")}onMouseUp(){this.resizingEvent.isResizing=!1,this.renderer.removeClass(document.body,"resizing")}onResize(){this.sideDrawerMaxWidth=window.innerWidth/2,this.sideDrawerWidth=this.sideDrawerWidth}set sideDrawerWidth(A){let e=Math.min(Math.max(A,this.sideDrawerMinWidth),this.sideDrawerMaxWidth);document.documentElement.style.setProperty("--side-drawer-width",`${e}px`)}get sideDrawerWidth(){let A=getComputedStyle(document.documentElement).getPropertyValue("--side-drawer-width"),e=parseFloat(A);return isNaN(e)?500:e}static \u0275fac=function(e){return new(e||t)(DA(eA),DA(an))};static \u0275dir=Oe({type:t,selectors:[["","appResizableDrawer",""]],hostBindings:function(e,i){e&1&&ee("mousemove",function(o){return i.onMouseMove(o)},!1,n2)("mouseup",function(){return i.onMouseUp()},!1,n2)("resize",function(){return i.onResize()},!1,Fw)}})};var BMe=["audioPlayer"],hE=class t{base64data=lt("");audioPlayerRef=es("audioPlayer");audioSrc="";constructor(){}ngOnChanges(A){A.base64data&&this.base64data()&&this.setAudioSource(this.base64data())}setAudioSource(A){A.startsWith("data:")?this.audioSrc=A:this.audioSrc=`data:audio/mpeg;base64,${A}`,this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.load()}play(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.play()}pause(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&this.audioPlayerRef().nativeElement.pause()}stop(){this.audioPlayerRef()&&this.audioPlayerRef().nativeElement&&(this.audioPlayerRef().nativeElement.pause(),this.audioPlayerRef().nativeElement.currentTime=0)}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-audio-player"]],viewQuery:function(e,i){e&1&&Kr(i.audioPlayerRef,BMe,5),e&2&&Aa()},inputs:{base64data:[1,"base64data"]},features:[ti],decls:3,vars:1,consts:[["audioPlayer",""],["controls","",3,"src"]],template:function(e,i){e&1&&(m(0,"div"),ve(1,"audio",1,0),p()),e&2&&(y(),te("src",i.audioSrc,$r))},styles:[".audio-player-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;padding:15px;background-color:var(--audio-player-container-background-color);border-radius:8px;box-shadow:0 2px 5px var(--audio-player-container-box-shadow-color);margin:20px auto;max-width:350px}audio[_ngcontent-%COMP%]{outline:none;border-radius:5px;width:350px}.custom-controls[_ngcontent-%COMP%]{margin-top:10px;display:flex;gap:10px}.custom-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{padding:8px 15px;border:none;border-radius:5px;background-color:var(--audio-player-custom-controls-button-background-color);color:var(--audio-player-custom-controls-button-color);cursor:pointer;font-size:14px;transition:background-color .2s ease}.custom-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{background-color:var(--audio-player-custom-controls-button-hover-background-color)}"]})};function EMe(t,A){if(t&1&&ve(0,"img",5),t&2){let e=M(2);te("src",e.displayContent,$r)}}function fMe(t,A){t&1&&(m(0,"div",6),T(1," No image data provided. "),p())}function QMe(t,A){if(t&1&&(m(0,"div",3),ne(1,EMe,1,1,"img",5)(2,fMe,2,0,"div",6),p()),t&2){let e=M();y(),$(e.displayContent?1:-1),y(),$(e.displayContent?-1:2)}}function mMe(t,A){if(t&1&&ve(0,"div",4),t&2){let e=M();te("innerHTML",e.displayContent,J0)}}var W1=class t{constructor(A,e,i){this.dialogRef=A;this.data=e;this.sanitizer=i}displayContent=null;isSvgContent=!1;ngOnInit(){this.processImageData()}processImageData(){let A=this.data.imageData;if(!A){this.displayContent=null,this.isSvgContent=!1;return}if(A.trim().includes("0?1:-1),y(3),FA(" ",o.getArtifactName(i)," "),y(5),jn("ngModel",o.selectedArtifacts[n]),y(),Nt(o.getSortedArtifactsFromId(i)),y(7),$((e=o.selectedArtifacts[n].mediaType)===o.MediaType.IMAGE?17:e===o.MediaType.AUDIO?18:-1)}}var bMe="default_artifact_name",Bu=(n=>(n.IMAGE="image",n.AUDIO="audio",n.TEXT="text",n.UNSPECIFIED="unspecified",n))(Bu||{});function wD(t){let A=t.toLowerCase();for(let e of Object.values(Bu))if(e!=="unspecified"&&A.startsWith(e+"/"))return e;return"unspecified"}function MMe(t){return t?t.startsWith("image/"):!1}function SMe(t){return t?t.startsWith("audio/"):!1}var pD=class t{artifacts=lt([]);selectedArtifacts=[];isArtifactAudio=SMe;isArtifactImage=MMe;MediaType=Bu;downloadService=E(dE);dialog=E(na);safeValuesService=E(V1);ngOnChanges(A){if(A.artifacts){this.selectedArtifacts=[];for(let e of this.getDistinctArtifactIds())this.selectedArtifacts.push(this.getSortedArtifactsFromId(e)[0])}}downloadArtifact(A){this.downloadService.downloadBase64Data(A.data,A.mimeType,A.id)}getArtifactName(A){return A??bMe}getDistinctArtifactIds(){return[...new Set(this.artifacts().map(A=>A.id))]}getSortedArtifactsFromId(A){return this.artifacts().filter(e=>e.id===A).sort((e,i)=>i.versionId-e.versionId)}onArtifactVersionChange(A,e){this.selectedArtifacts[e]=A.value}openViewImageDialog(A){if(!A||!A.startsWith("data:")||A.indexOf(";base64,")===-1)return;let e=this.dialog.open(W1,{maxWidth:"90vw",maxHeight:"90vh",data:{imageData:A}})}openArtifact(A,e){if(this.isArtifactImage(e)){this.openViewImageDialog(A);return}this.openBase64InNewTab(A,e)}openBase64InNewTab(A,e){}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-artifact-tab"]],inputs:{artifacts:[1,"artifacts"]},features:[ti],decls:3,vars:0,consts:[[1,"artifact-container"],[1,"artifact-box"],[1,"white-separator"],[1,"artifact-metadata"],[1,"link-style-button",3,"click"],[1,"version-select-container"],[3,"ngModelChange","selectionChange","ngModel"],[3,"value"],["mat-flat-button","",1,"download-button",3,"click"],["alt","artifact.id",1,"generated-image",3,"click","src"],[3,"base64data"]],template:function(e,i){e&1&&(m(0,"div",0),Rt(1,vMe,19,4,"div",1,Fi),p()),e&2&&(y(),Nt(i.getDistinctArtifactIds()))},dependencies:[Yl,Kn,Fo,Cr,Ac,Un,ir,hE],styles:[".artifact-container[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap}.artifact-box[_ngcontent-%COMP%]{padding:10px;max-width:100%;margin-left:26px;display:flex;flex-direction:column}.artifact-metadata[_ngcontent-%COMP%]{display:flex;align-items:center;margin-bottom:15px;flex-wrap:wrap;gap:5px}.download-button[_ngcontent-%COMP%]{background-color:var(--artifact-tab-download-button-background-color)!important;margin-left:35px;width:130px;height:28px;font-size:14px}.generated-image[_ngcontent-%COMP%]{max-width:60%;border-radius:8px;cursor:pointer}hr.white-separator[_ngcontent-%COMP%]{border:none;border-top:1px solid var(--artifact-tab-white-separator-border-top-color);margin-bottom:1.2em;margin-right:15px}.version-select-container[_ngcontent-%COMP%]{background-color:var(--artifact-tab-version-select-container-background-color);width:80px;margin-left:15px}.link-style-button[_ngcontent-%COMP%]{background:none;border:none;padding:0;font:inherit;color:var(--artifact-tab-link-style-button-color)!important;text-decoration:underline;cursor:pointer;outline:none}.link-style-button[_ngcontent-%COMP%]:hover{color:var(--artifact-tab-link-style-button-hover-color);text-decoration:underline}.link-style-button[_ngcontent-%COMP%]:focus{outline:1px dotted var(--artifact-tab-link-style-button-focus-outline-color)}.link-style-button[_ngcontent-%COMP%]:active{color:var(--artifact-tab-link-style-button-active-color)}.link-style-button[_ngcontent-%COMP%]:disabled{color:var(--artifact-tab-link-style-button-disabled-color);text-decoration:none;cursor:not-allowed}"]})};var kMe=["mat-menu-item",""],xMe=[[["mat-icon"],["","matMenuItemIcon",""]],"*"],_Me=["mat-icon, [matMenuItemIcon]","*"];function RMe(t,A){t&1&&(ft(),m(0,"svg",2),ve(1,"polygon",3),p())}var NMe=["*"];function LMe(t,A){if(t&1){let e=Ue();m(0,"div",0),ee("click",function(){q(e);let n=M();return W(n.closed.emit("click"))})("animationstart",function(n){q(e);let o=M();return W(o._onAnimationStart(n.animationName))})("animationend",function(n){q(e);let o=M();return W(o._onAnimationDone(n.animationName))})("animationcancel",function(n){q(e);let o=M();return W(o._onAnimationDone(n.animationName))}),m(1,"div",1),NA(2),p()()}if(t&2){let e=M();Lo(e._classList),iA("mat-menu-panel-animations-disabled",e._animationsDisabled)("mat-menu-panel-exit-animation",e._panelAnimationState==="void")("mat-menu-panel-animating",e._isAnimating),te("id",e.panelId),AA("aria-label",e.ariaLabel||null)("aria-labelledby",e.ariaLabelledby||null)("aria-describedby",e.ariaDescribedby||null)}}var KF=new re("MAT_MENU_PANEL"),m2=(()=>{class t{_elementRef=E(eA);_document=E(ht);_focusMonitor=E(ns);_parentMenu=E(KF,{optional:!0});_changeDetectorRef=E(ut);role="menuitem";disabled=!1;disableRipple=!1;_hovered=new je;_focused=new je;_highlighted=!1;_triggersSubmenu=!1;constructor(){E(Wn).load(Pr),this._parentMenu?.addItem?.(this)}focus(e,i){this._focusMonitor&&e?this._focusMonitor.focusVia(this._getHostElement(),e,i):this._getHostElement().focus(i),this._focused.next(this)}ngAfterViewInit(){this._focusMonitor&&this._focusMonitor.monitor(this._elementRef,!1)}ngOnDestroy(){this._focusMonitor&&this._focusMonitor.stopMonitoring(this._elementRef),this._parentMenu&&this._parentMenu.removeItem&&this._parentMenu.removeItem(this),this._hovered.complete(),this._focused.complete()}_getTabIndex(){return this.disabled?"-1":"0"}_getHostElement(){return this._elementRef.nativeElement}_checkDisabled(e){this.disabled&&(e.preventDefault(),e.stopPropagation())}_handleMouseEnter(){this._hovered.next(this)}getLabel(){let e=this._elementRef.nativeElement.cloneNode(!0),i=e.querySelectorAll("mat-icon, .material-icons");for(let n=0;n{class t{_elementRef=E(eA);_changeDetectorRef=E(ut);_injector=E(Dt);_keyManager;_xPosition;_yPosition;_firstItemFocusRef;_exitFallbackTimeout;_animationsDisabled;_allItems;_directDescendantItems=new qa;_classList={};_panelAnimationState="void";_animationDone=new je;_isAnimating=!1;parentMenu;direction;overlayPanelClass;backdropClass;ariaLabel;ariaLabelledby;ariaDescribedby;get xPosition(){return this._xPosition}set xPosition(e){this._xPosition=e,this.setPositionClasses()}get yPosition(){return this._yPosition}set yPosition(e){this._yPosition=e,this.setPositionClasses()}templateRef;items;lazyContent;overlapTrigger;hasBackdrop;set panelClass(e){let i=this._previousPanelClass,n=ae({},this._classList);i&&i.length&&i.split(" ").forEach(o=>{n[o]=!1}),this._previousPanelClass=e,e&&e.length&&(e.split(" ").forEach(o=>{n[o]=!0}),this._elementRef.nativeElement.className=""),this._classList=n}_previousPanelClass;get classList(){return this.panelClass}set classList(e){this.panelClass=e}closed=new Ve;close=this.closed;panelId=E(un).getId("mat-menu-panel-");constructor(){let e=E(GMe);this.overlayPanelClass=e.overlayPanelClass||"",this._xPosition=e.xPosition,this._yPosition=e.yPosition,this.backdropClass=e.backdropClass,this.overlapTrigger=e.overlapTrigger,this.hasBackdrop=e.hasBackdrop,this._animationsDisabled=E(Oi,{optional:!0})==="NoopAnimations"}ngOnInit(){this.setPositionClasses()}ngAfterContentInit(){this._updateDirectDescendants(),this._keyManager=new C2(this._directDescendantItems).withWrap().withTypeAhead().withHomeAndEnd(),this._keyManager.tabOut.subscribe(()=>this.closed.emit("tab")),this._directDescendantItems.changes.pipe(In(this._directDescendantItems),Si(e=>Bi(...e.map(i=>i._focused)))).subscribe(e=>this._keyManager.updateActiveItem(e)),this._directDescendantItems.changes.subscribe(e=>{let i=this._keyManager;if(this._panelAnimationState==="enter"&&i.activeItem?._hasFocus()){let n=e.toArray(),o=Math.max(0,Math.min(n.length-1,i.activeItemIndex||0));n[o]&&!n[o].disabled?i.setActiveItem(o):i.setNextItemActive()}})}ngOnDestroy(){this._keyManager?.destroy(),this._directDescendantItems.destroy(),this.closed.complete(),this._firstItemFocusRef?.destroy(),clearTimeout(this._exitFallbackTimeout)}_hovered(){return this._directDescendantItems.changes.pipe(In(this._directDescendantItems),Si(i=>Bi(...i.map(n=>n._hovered))))}addItem(e){}removeItem(e){}_handleKeydown(e){let i=e.keyCode,n=this._keyManager;switch(i){case 27:Tr(e)||(e.preventDefault(),this.closed.emit("keydown"));break;case 37:this.parentMenu&&this.direction==="ltr"&&this.closed.emit("keydown");break;case 39:this.parentMenu&&this.direction==="rtl"&&this.closed.emit("keydown");break;default:(i===38||i===40)&&n.setFocusOrigin("keyboard"),n.onKeydown(e);return}}focusFirstItem(e="program"){this._firstItemFocusRef?.destroy(),this._firstItemFocusRef=Gr(()=>{let i=this._resolvePanel();if(!i||!i.contains(document.activeElement)){let n=this._keyManager;n.setFocusOrigin(e).setFirstItemActive(),!n.activeItem&&i&&i.focus()}},{injector:this._injector})}resetActiveItem(){this._keyManager.setActiveItem(-1)}setElevation(e){}setPositionClasses(e=this.xPosition,i=this.yPosition){this._classList=_A(ae({},this._classList),{"mat-menu-before":e==="before","mat-menu-after":e==="after","mat-menu-above":i==="above","mat-menu-below":i==="below"}),this._changeDetectorRef.markForCheck()}_onAnimationDone(e){let i=e===yD;(i||e===GF)&&(i&&(clearTimeout(this._exitFallbackTimeout),this._exitFallbackTimeout=void 0),this._animationDone.next(i?"void":"enter"),this._isAnimating=!1)}_onAnimationStart(e){(e===GF||e===yD)&&(this._isAnimating=!0)}_setIsOpen(e){if(this._panelAnimationState=e?"enter":"void",e){if(this._keyManager.activeItemIndex===0){let i=this._resolvePanel();i&&(i.scrollTop=0)}}else this._animationsDisabled||(this._exitFallbackTimeout=setTimeout(()=>this._onAnimationDone(yD),200));this._animationsDisabled&&setTimeout(()=>{this._onAnimationDone(e?GF:yD)}),this._changeDetectorRef.markForCheck()}_updateDirectDescendants(){this._allItems.changes.pipe(In(this._allItems)).subscribe(e=>{this._directDescendantItems.reset(e.filter(i=>i._parentMenu===this)),this._directDescendantItems.notifyOnChanges()})}_resolvePanel(){let e=null;return this._directDescendantItems.length&&(e=this._directDescendantItems.first._getHostElement().closest('[role="menu"]')),e}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-menu"]],contentQueries:function(i,n,o){if(i&1&&(ni(o,FMe,5),ni(o,m2,5),ni(o,m2,4)),i&2){let r;oA(r=rA())&&(n.lazyContent=r.first),oA(r=rA())&&(n._allItems=r),oA(r=rA())&&(n.items=r)}},viewQuery:function(i,n){if(i&1&&At(en,5),i&2){let o;oA(o=rA())&&(n.templateRef=o.first)}},hostVars:3,hostBindings:function(i,n){i&2&&AA("aria-label",null)("aria-labelledby",null)("aria-describedby",null)},inputs:{backdropClass:"backdropClass",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],xPosition:"xPosition",yPosition:"yPosition",overlapTrigger:[2,"overlapTrigger","overlapTrigger",IA],hasBackdrop:[2,"hasBackdrop","hasBackdrop",e=>e==null?null:IA(e)],panelClass:[0,"class","panelClass"],classList:"classList"},outputs:{closed:"closed",close:"close"},exportAs:["matMenu"],features:[gt([{provide:KF,useExisting:t}])],ngContentSelectors:NMe,decls:1,vars:0,consts:[["tabindex","-1","role","menu",1,"mat-mdc-menu-panel",3,"click","animationstart","animationend","animationcancel","id"],[1,"mat-mdc-menu-content"]],template:function(i,n){i&1&&(Kt(),ne(0,LMe,3,12,"ng-template"))},styles:['mat-menu{display:none}.mat-mdc-menu-content{margin:0;padding:8px 0;outline:0}.mat-mdc-menu-content,.mat-mdc-menu-content .mat-mdc-menu-item .mat-mdc-menu-item-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;flex:1;white-space:normal;font-family:var(--mat-menu-item-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-menu-item-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-menu-item-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-menu-item-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-menu-item-label-text-weight, var(--mat-sys-label-large-weight))}@keyframes _mat-menu-enter{from{opacity:0;transform:scale(0.8)}to{opacity:1;transform:none}}@keyframes _mat-menu-exit{from{opacity:1}to{opacity:0}}.mat-mdc-menu-panel{min-width:112px;max-width:280px;overflow:auto;box-sizing:border-box;outline:0;animation:_mat-menu-enter 120ms cubic-bezier(0, 0, 0.2, 1);border-radius:var(--mat-menu-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mat-menu-container-color, var(--mat-sys-surface-container));box-shadow:var(--mat-menu-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12));will-change:transform,opacity}.mat-mdc-menu-panel.mat-menu-panel-exit-animation{animation:_mat-menu-exit 100ms 25ms linear forwards}.mat-mdc-menu-panel.mat-menu-panel-animations-disabled{animation:none}.mat-mdc-menu-panel.mat-menu-panel-animating{pointer-events:none}.mat-mdc-menu-panel.mat-menu-panel-animating:has(.mat-mdc-menu-content:empty){display:none}@media(forced-colors: active){.mat-mdc-menu-panel{outline:solid 1px}}.mat-mdc-menu-panel .mat-divider{color:var(--mat-menu-divider-color, var(--mat-sys-surface-variant));margin-bottom:var(--mat-menu-divider-bottom-spacing, 8px);margin-top:var(--mat-menu-divider-top-spacing, 8px)}.mat-mdc-menu-item{display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;padding:0;cursor:pointer;width:100%;text-align:left;box-sizing:border-box;color:inherit;font-size:inherit;background:none;text-decoration:none;margin:0;min-height:48px;padding-left:var(--mat-menu-item-leading-spacing, 12px);padding-right:var(--mat-menu-item-trailing-spacing, 12px);-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-menu-item::-moz-focus-inner{border:0}[dir=rtl] .mat-mdc-menu-item{padding-left:var(--mat-menu-item-trailing-spacing, 12px);padding-right:var(--mat-menu-item-leading-spacing, 12px)}.mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-leading-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-trailing-spacing, 12px)}[dir=rtl] .mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-trailing-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-leading-spacing, 12px)}.mat-mdc-menu-item,.mat-mdc-menu-item:visited,.mat-mdc-menu-item:link{color:var(--mat-menu-item-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-menu-item .mat-icon-no-color,.mat-mdc-menu-item .mat-mdc-menu-submenu-icon{color:var(--mat-menu-item-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-menu-item[disabled]{cursor:default;opacity:.38}.mat-mdc-menu-item[disabled]::after{display:block;position:absolute;content:"";top:0;left:0;bottom:0;right:0}.mat-mdc-menu-item:focus{outline:0}.mat-mdc-menu-item .mat-icon{flex-shrink:0;margin-right:var(--mat-menu-item-spacing, 12px);height:var(--mat-menu-item-icon-size, 24px);width:var(--mat-menu-item-icon-size, 24px)}[dir=rtl] .mat-mdc-menu-item{text-align:right}[dir=rtl] .mat-mdc-menu-item .mat-icon{margin-right:0;margin-left:var(--mat-menu-item-spacing, 12px)}.mat-mdc-menu-item:not([disabled]):hover{background-color:var(--mat-menu-item-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-menu-item:not([disabled]).cdk-program-focused,.mat-mdc-menu-item:not([disabled]).cdk-keyboard-focused,.mat-mdc-menu-item:not([disabled]).mat-mdc-menu-item-highlighted{background-color:var(--mat-menu-item-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent))}@media(forced-colors: active){.mat-mdc-menu-item{margin-top:1px}}.mat-mdc-menu-submenu-icon{width:var(--mat-menu-item-icon-size, 24px);height:10px;fill:currentColor;padding-left:var(--mat-menu-item-spacing, 12px)}[dir=rtl] .mat-mdc-menu-submenu-icon{padding-right:var(--mat-menu-item-spacing, 12px);padding-left:0}[dir=rtl] .mat-mdc-menu-submenu-icon polygon{transform:scaleX(-1);transform-origin:center}@media(forced-colors: active){.mat-mdc-menu-submenu-icon{fill:CanvasText}}.mat-mdc-menu-item .mat-mdc-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}'],encapsulation:2,changeDetection:0})}return t})(),OAe=new re("mat-menu-scroll-strategy",{providedIn:"root",factory:()=>{let t=E(Or);return()=>t.scrollStrategies.reposition()}});function UMe(t){return()=>t.scrollStrategies.reposition()}var TMe={provide:OAe,deps:[Or],useFactory:UMe},TAe=Gl({passive:!0});var Um=new WeakMap,BE=(()=>{class t{_overlay=E(Or);_element=E(eA);_viewContainerRef=E(xn);_menuItemInstance=E(m2,{optional:!0,self:!0});_dir=E(Do,{optional:!0});_focusMonitor=E(ns);_ngZone=E(yA);_scrollStrategy=E(OAe);_changeDetectorRef=E(ut);_portal;_overlayRef=null;_menuOpen=!1;_closingActionsSubscription=Ot.EMPTY;_hoverSubscription=Ot.EMPTY;_menuCloseSubscription=Ot.EMPTY;_pendingRemoval;_parentMaterialMenu;_parentInnerPadding;_handleTouchStart=e=>{j4(e)||(this._openedBy="touch")};_openedBy=void 0;get _deprecatedMatMenuTriggerFor(){return this.menu}set _deprecatedMatMenuTriggerFor(e){this.menu=e}get menu(){return this._menu}set menu(e){e!==this._menu&&(this._menu=e,this._menuCloseSubscription.unsubscribe(),e&&(this._parentMaterialMenu,this._menuCloseSubscription=e.close.subscribe(i=>{this._destroyMenu(i),(i==="click"||i==="tab")&&this._parentMaterialMenu&&this._parentMaterialMenu.closed.emit(i)})),this._menuItemInstance?._setTriggersSubmenu(this.triggersSubmenu()))}_menu;menuData;restoreFocus=!0;menuOpened=new Ve;onMenuOpen=this.menuOpened;menuClosed=new Ve;onMenuClose=this.menuClosed;constructor(){let e=E(KF,{optional:!0});this._parentMaterialMenu=e instanceof sd?e:void 0,this._element.nativeElement.addEventListener("touchstart",this._handleTouchStart,TAe)}ngAfterContentInit(){this._handleHover()}ngOnDestroy(){this.menu&&this._ownsMenu(this.menu)&&Um.delete(this.menu),this._element.nativeElement.removeEventListener("touchstart",this._handleTouchStart,TAe),this._pendingRemoval?.unsubscribe(),this._menuCloseSubscription.unsubscribe(),this._closingActionsSubscription.unsubscribe(),this._hoverSubscription.unsubscribe(),this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null)}get menuOpen(){return this._menuOpen}get dir(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}triggersSubmenu(){return!!(this._menuItemInstance&&this._parentMaterialMenu&&this.menu)}toggleMenu(){return this._menuOpen?this.closeMenu():this.openMenu()}openMenu(){let e=this.menu;if(this._menuOpen||!e)return;this._pendingRemoval?.unsubscribe();let i=Um.get(e);Um.set(e,this),i&&i!==this&&i.closeMenu();let n=this._createOverlay(e),o=n.getConfig(),r=o.positionStrategy;this._setPosition(e,r),o.hasBackdrop=e.hasBackdrop==null?!this.triggersSubmenu():e.hasBackdrop,n.hasAttached()||(n.attach(this._getPortal(e)),e.lazyContent?.attach(this.menuData)),this._closingActionsSubscription=this._menuClosingActions().subscribe(()=>this.closeMenu()),e.parentMenu=this.triggersSubmenu()?this._parentMaterialMenu:void 0,e.direction=this.dir,e.focusFirstItem(this._openedBy||"program"),this._setIsMenuOpen(!0),e instanceof sd&&(e._setIsOpen(!0),e._directDescendantItems.changes.pipe(mt(e.close)).subscribe(()=>{r.withLockedPosition(!1).reapplyLastPosition(),r.withLockedPosition(!0)}))}closeMenu(){this.menu?.close.emit()}focus(e,i){this._focusMonitor&&e?this._focusMonitor.focusVia(this._element,e,i):this._element.nativeElement.focus(i)}updatePosition(){this._overlayRef?.updatePosition()}_destroyMenu(e){let i=this._overlayRef,n=this._menu;!i||!this.menuOpen||(this._closingActionsSubscription.unsubscribe(),this._pendingRemoval?.unsubscribe(),n instanceof sd&&this._ownsMenu(n)?(this._pendingRemoval=n._animationDone.pipe(Pn(1)).subscribe(()=>{i.detach(),n.lazyContent?.detach()}),n._setIsOpen(!1)):(i.detach(),n?.lazyContent?.detach()),n&&this._ownsMenu(n)&&Um.delete(n),this.restoreFocus&&(e==="keydown"||!this._openedBy||!this.triggersSubmenu())&&this.focus(this._openedBy),this._openedBy=void 0,this._setIsMenuOpen(!1))}_setIsMenuOpen(e){e!==this._menuOpen&&(this._menuOpen=e,this._menuOpen?this.menuOpened.emit():this.menuClosed.emit(),this.triggersSubmenu()&&this._menuItemInstance._setHighlighted(e),this._changeDetectorRef.markForCheck())}_createOverlay(e){if(!this._overlayRef){let i=this._getOverlayConfig(e);this._subscribeToPositions(e,i.positionStrategy),this._overlayRef=this._overlay.create(i),this._overlayRef.keydownEvents().subscribe(n=>{this.menu instanceof sd&&this.menu._handleKeydown(n)})}return this._overlayRef}_getOverlayConfig(e){return new id({positionStrategy:this._overlay.position().flexibleConnectedTo(this._element).withLockedPosition().withGrowAfterOpen().withTransformOriginOn(".mat-menu-panel, .mat-mdc-menu-panel"),backdropClass:e.backdropClass||"cdk-overlay-transparent-backdrop",panelClass:e.overlayPanelClass,scrollStrategy:this._scrollStrategy(),direction:this._dir||"ltr"})}_subscribeToPositions(e,i){e.setPositionClasses&&i.positionChanges.subscribe(n=>{this._ngZone.run(()=>{let o=n.connectionPair.overlayX==="start"?"after":"before",r=n.connectionPair.overlayY==="top"?"below":"above";e.setPositionClasses(o,r)})})}_setPosition(e,i){let[n,o]=e.xPosition==="before"?["end","start"]:["start","end"],[r,s]=e.yPosition==="above"?["bottom","top"]:["top","bottom"],[a,c]=[r,s],[l,d]=[n,o],C=0;if(this.triggersSubmenu()){if(d=n=e.xPosition==="before"?"start":"end",o=l=n==="end"?"start":"end",this._parentMaterialMenu){if(this._parentInnerPadding==null){let I=this._parentMaterialMenu.items.first;this._parentInnerPadding=I?I._getHostElement().offsetTop:0}C=r==="bottom"?this._parentInnerPadding:-this._parentInnerPadding}}else e.overlapTrigger||(a=r==="top"?"bottom":"top",c=s==="top"?"bottom":"top");i.withPositions([{originX:n,originY:a,overlayX:l,overlayY:r,offsetY:C},{originX:o,originY:a,overlayX:d,overlayY:r,offsetY:C},{originX:n,originY:c,overlayX:l,overlayY:s,offsetY:-C},{originX:o,originY:c,overlayX:d,overlayY:s,offsetY:-C}])}_menuClosingActions(){let e=this._overlayRef.backdropClick(),i=this._overlayRef.detachments(),n=this._parentMaterialMenu?this._parentMaterialMenu.closed:dA(),o=this._parentMaterialMenu?this._parentMaterialMenu._hovered().pipe($A(r=>this._menuOpen&&r!==this._menuItemInstance)):dA();return Bi(e,n,o,i)}_handleMousedown(e){P4(e)||(this._openedBy=e.button===0?"mouse":void 0,this.triggersSubmenu()&&e.preventDefault())}_handleKeydown(e){let i=e.keyCode;(i===13||i===32)&&(this._openedBy="keyboard"),this.triggersSubmenu()&&(i===39&&this.dir==="ltr"||i===37&&this.dir==="rtl")&&(this._openedBy="keyboard",this.openMenu())}_handleClick(e){this.triggersSubmenu()?(e.stopPropagation(),this.openMenu()):this.toggleMenu()}_handleHover(){this.triggersSubmenu()&&this._parentMaterialMenu&&(this._hoverSubscription=this._parentMaterialMenu._hovered().subscribe(e=>{e===this._menuItemInstance&&!e.disabled&&(this._openedBy="mouse",this.openMenu())}))}_getPortal(e){return(!this._portal||this._portal.templateRef!==e.templateRef)&&(this._portal=new ba(e.templateRef,this._viewContainerRef)),this._portal}_ownsMenu(e){return Um.get(e)===this}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","mat-menu-trigger-for",""],["","matMenuTriggerFor",""]],hostAttrs:[1,"mat-mdc-menu-trigger"],hostVars:3,hostBindings:function(i,n){i&1&&ee("click",function(r){return n._handleClick(r)})("mousedown",function(r){return n._handleMousedown(r)})("keydown",function(r){return n._handleKeydown(r)}),i&2&&AA("aria-haspopup",n.menu?"menu":null)("aria-expanded",n.menuOpen)("aria-controls",n.menuOpen?n.menu.panelId:null)},inputs:{_deprecatedMatMenuTriggerFor:[0,"mat-menu-trigger-for","_deprecatedMatMenuTriggerFor"],menu:[0,"matMenuTriggerFor","menu"],menuData:[0,"matMenuTriggerData","menuData"],restoreFocus:[0,"matMenuTriggerRestoreFocus","restoreFocus"]},outputs:{menuOpened:"menuOpened",onMenuOpen:"onMenuOpen",menuClosed:"menuClosed",onMenuClose:"onMenuClose"},exportAs:["matMenuTrigger"]})}return t})(),JAe=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({providers:[TMe],imports:[P0,ui,Lg,E2,ui]})}return t})(),YAe={transformMenu:ll("transformMenu",[tc("void",Vo({opacity:0,transform:"scale(0.8)"})),Fs("void => enter",ia("120ms cubic-bezier(0, 0, 0.2, 1)",Vo({opacity:1,transform:"scale(1)"}))),Fs("* => void",ia("100ms 25ms linear",Vo({opacity:0})))]),fadeInItems:ll("fadeInItems",[tc("showing",Vo({opacity:1})),Fs("void => *",[Vo({opacity:0}),ia("400ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)")])])},sbA=YAe.fadeInItems,abA=YAe.transformMenu;function JMe(t,A){t&1&&ve(0,"div",2)}var YMe=new re("MAT_PROGRESS_BAR_DEFAULT_OPTIONS");var DD=(()=>{class t{_elementRef=E(eA);_ngZone=E(yA);_changeDetectorRef=E(ut);_renderer=E(an);_cleanupTransitionEnd;_animationMode=E(Oi,{optional:!0});constructor(){let e=E(YMe,{optional:!0});this._isNoopAnimation=this._animationMode==="NoopAnimations",e&&(e.color&&(this.color=this._defaultColor=e.color),this.mode=e.mode||this.mode)}_isNoopAnimation=!1;get color(){return this._color||this._defaultColor}set color(e){this._color=e}_color;_defaultColor="primary";get value(){return this._value}set value(e){this._value=HAe(e||0),this._changeDetectorRef.markForCheck()}_value=0;get bufferValue(){return this._bufferValue||0}set bufferValue(e){this._bufferValue=HAe(e||0),this._changeDetectorRef.markForCheck()}_bufferValue=0;animationEnd=new Ve;get mode(){return this._mode}set mode(e){this._mode=e,this._changeDetectorRef.markForCheck()}_mode="determinate";ngAfterViewInit(){this._ngZone.runOutsideAngular(()=>{this._cleanupTransitionEnd=this._renderer.listen(this._elementRef.nativeElement,"transitionend",this._transitionendHandler)})}ngOnDestroy(){this._cleanupTransitionEnd?.()}_getPrimaryBarTransform(){return`scaleX(${this._isIndeterminate()?1:this.value/100})`}_getBufferBarFlexBasis(){return`${this.mode==="buffer"?this.bufferValue:100}%`}_isIndeterminate(){return this.mode==="indeterminate"||this.mode==="query"}_transitionendHandler=e=>{this.animationEnd.observers.length===0||!e.target||!e.target.classList.contains("mdc-linear-progress__primary-bar")||(this.mode==="determinate"||this.mode==="buffer")&&this._ngZone.run(()=>this.animationEnd.next({value:this.value}))};static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-progress-bar"]],hostAttrs:["role","progressbar","aria-valuemin","0","aria-valuemax","100","tabindex","-1",1,"mat-mdc-progress-bar","mdc-linear-progress"],hostVars:10,hostBindings:function(i,n){i&2&&(AA("aria-valuenow",n._isIndeterminate()?null:n.value)("mode",n.mode),Lo("mat-"+n.color),iA("_mat-animation-noopable",n._isNoopAnimation)("mdc-linear-progress--animation-ready",!n._isNoopAnimation)("mdc-linear-progress--indeterminate",n._isIndeterminate()))},inputs:{color:"color",value:[2,"value","value",ln],bufferValue:[2,"bufferValue","bufferValue",ln],mode:"mode"},outputs:{animationEnd:"animationEnd"},exportAs:["matProgressBar"],decls:7,vars:5,consts:[["aria-hidden","true",1,"mdc-linear-progress__buffer"],[1,"mdc-linear-progress__buffer-bar"],[1,"mdc-linear-progress__buffer-dots"],["aria-hidden","true",1,"mdc-linear-progress__bar","mdc-linear-progress__primary-bar"],[1,"mdc-linear-progress__bar-inner"],["aria-hidden","true",1,"mdc-linear-progress__bar","mdc-linear-progress__secondary-bar"]],template:function(i,n){i&1&&(m(0,"div",0),ve(1,"div",1),ne(2,JMe,1,0,"div",2),p(),m(3,"div",3),ve(4,"span",4),p(),m(5,"div",5),ve(6,"span",4),p()),i&2&&(y(),cn("flex-basis",n._getBufferBarFlexBasis()),y(),$(n.mode==="buffer"?2:-1),y(),cn("transform",n._getPrimaryBarTransform()))},styles:[`.mat-mdc-progress-bar{display:block;text-align:start}.mat-mdc-progress-bar[mode=query]{transform:scaleX(-1)}.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__buffer-dots,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__primary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__secondary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__bar-inner.mdc-linear-progress__bar-inner{animation:none}.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__primary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__buffer-bar{transition:transform 1ms}.mdc-linear-progress{position:relative;width:100%;transform:translateZ(0);outline:1px solid rgba(0,0,0,0);overflow-x:hidden;transition:opacity 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);height:max(var(--mdc-linear-progress-track-height, 4px),var(--mdc-linear-progress-active-indicator-height, 4px))}@media(forced-colors: active){.mdc-linear-progress{outline-color:CanvasText}}.mdc-linear-progress__bar{position:absolute;top:0;bottom:0;margin:auto 0;width:100%;animation:none;transform-origin:top left;transition:transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);height:var(--mdc-linear-progress-active-indicator-height, 4px)}.mdc-linear-progress--indeterminate .mdc-linear-progress__bar{transition:none}[dir=rtl] .mdc-linear-progress__bar{right:0;transform-origin:center right}.mdc-linear-progress__bar-inner{display:inline-block;position:absolute;width:100%;animation:none;border-top-style:solid;border-color:var(--mdc-linear-progress-active-indicator-color, var(--mat-sys-primary));border-top-width:var(--mdc-linear-progress-active-indicator-height, 4px)}.mdc-linear-progress__buffer{display:flex;position:absolute;top:0;bottom:0;margin:auto 0;width:100%;overflow:hidden;height:var(--mdc-linear-progress-track-height, 4px);border-radius:var(--mdc-linear-progress-track-shape, var(--mat-sys-corner-none))}.mdc-linear-progress__buffer-dots{-webkit-mask-image:url("data:image/svg+xml,%3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' enable-background='new 0 0 5 2' xml:space='preserve' viewBox='0 0 5 2' preserveAspectRatio='xMinYMin slice'%3E%3Ccircle cx='1' cy='1' r='1'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' enable-background='new 0 0 5 2' xml:space='preserve' viewBox='0 0 5 2' preserveAspectRatio='xMinYMin slice'%3E%3Ccircle cx='1' cy='1' r='1'/%3E%3C/svg%3E");background-repeat:repeat-x;flex:auto;transform:rotate(180deg);animation:mdc-linear-progress-buffering 250ms infinite linear;background-color:var(--mdc-linear-progress-track-color, var(--mat-sys-surface-variant))}@media(forced-colors: active){.mdc-linear-progress__buffer-dots{background-color:ButtonBorder}}[dir=rtl] .mdc-linear-progress__buffer-dots{animation:mdc-linear-progress-buffering-reverse 250ms infinite linear;transform:rotate(0)}.mdc-linear-progress__buffer-bar{flex:0 1 100%;transition:flex-basis 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);background-color:var(--mdc-linear-progress-track-color, var(--mat-sys-surface-variant))}.mdc-linear-progress__primary-bar{transform:scaleX(0)}.mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar{left:-145.166611%}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar{animation:mdc-linear-progress-primary-indeterminate-translate 2s infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar>.mdc-linear-progress__bar-inner{animation:mdc-linear-progress-primary-indeterminate-scale 2s infinite linear}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar{animation-name:mdc-linear-progress-primary-indeterminate-translate-reverse}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar{right:-145.166611%;left:auto}.mdc-linear-progress__secondary-bar{display:none}.mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar{left:-54.888891%;display:block}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar{animation:mdc-linear-progress-secondary-indeterminate-translate 2s infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar>.mdc-linear-progress__bar-inner{animation:mdc-linear-progress-secondary-indeterminate-scale 2s infinite linear}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar{animation-name:mdc-linear-progress-secondary-indeterminate-translate-reverse}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar{right:-54.888891%;left:auto}@keyframes mdc-linear-progress-buffering{from{transform:rotate(180deg) translateX(calc(var(--mdc-linear-progress-track-height, 4px) * -2.5))}}@keyframes mdc-linear-progress-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(83.67142%)}100%{transform:translateX(200.611057%)}}@keyframes mdc-linear-progress-primary-indeterminate-scale{0%{transform:scaleX(0.08)}36.65%{animation-timing-function:cubic-bezier(0.334731, 0.12482, 0.785844, 1);transform:scaleX(0.08)}69.15%{animation-timing-function:cubic-bezier(0.06, 0.11, 0.6, 1);transform:scaleX(0.661479)}100%{transform:scaleX(0.08)}}@keyframes mdc-linear-progress-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(84.386165%)}100%{transform:translateX(160.277782%)}}@keyframes mdc-linear-progress-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(0.205028, 0.057051, 0.57661, 0.453971);transform:scaleX(0.08)}19.15%{animation-timing-function:cubic-bezier(0.152313, 0.196432, 0.648374, 1.004315);transform:scaleX(0.457104)}44.15%{animation-timing-function:cubic-bezier(0.257759, -0.003163, 0.211762, 1.38179);transform:scaleX(0.72796)}100%{transform:scaleX(0.08)}}@keyframes mdc-linear-progress-primary-indeterminate-translate-reverse{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(-83.67142%)}100%{transform:translateX(-200.611057%)}}@keyframes mdc-linear-progress-secondary-indeterminate-translate-reverse{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(-37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(-84.386165%)}100%{transform:translateX(-160.277782%)}}@keyframes mdc-linear-progress-buffering-reverse{from{transform:translateX(-10px)}}`],encapsulation:2,changeDetection:0})}return t})();function HAe(t,A=0,e=100){return Math.max(A,Math.min(e,t))}var zAe=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({imports:[ui]})}return t})();var zMe=["determinateSpinner"];function PMe(t,A){if(t&1&&(ft(),m(0,"svg",11),ve(1,"circle",12),p()),t&2){let e=M();AA("viewBox",e._viewBox()),y(),cn("stroke-dasharray",e._strokeCircumference(),"px")("stroke-dashoffset",e._strokeCircumference()/2,"px")("stroke-width",e._circleStrokeWidth(),"%"),AA("r",e._circleRadius())}}var jMe=new re("mat-progress-spinner-default-options",{providedIn:"root",factory:VMe});function VMe(){return{diameter:PAe}}var PAe=100,qMe=10,Z1=(()=>{class t{_elementRef=E(eA);_noopAnimations;get color(){return this._color||this._defaultColor}set color(e){this._color=e}_color;_defaultColor="primary";_determinateCircle;constructor(){let e=E(Oi,{optional:!0}),i=E(jMe);this._noopAnimations=e==="NoopAnimations"&&!!i&&!i._forceAnimations,this.mode=this._elementRef.nativeElement.nodeName.toLowerCase()==="mat-spinner"?"indeterminate":"determinate",i&&(i.color&&(this.color=this._defaultColor=i.color),i.diameter&&(this.diameter=i.diameter),i.strokeWidth&&(this.strokeWidth=i.strokeWidth))}mode;get value(){return this.mode==="determinate"?this._value:0}set value(e){this._value=Math.max(0,Math.min(100,e||0))}_value=0;get diameter(){return this._diameter}set diameter(e){this._diameter=e||0}_diameter=PAe;get strokeWidth(){return this._strokeWidth??this.diameter/10}set strokeWidth(e){this._strokeWidth=e||0}_strokeWidth;_circleRadius(){return(this.diameter-qMe)/2}_viewBox(){let e=this._circleRadius()*2+this.strokeWidth;return`0 0 ${e} ${e}`}_strokeCircumference(){return 2*Math.PI*this._circleRadius()}_strokeDashOffset(){return this.mode==="determinate"?this._strokeCircumference()*(100-this._value)/100:null}_circleStrokeWidth(){return this.strokeWidth/this.diameter*100}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-progress-spinner"],["mat-spinner"]],viewQuery:function(i,n){if(i&1&&At(zMe,5),i&2){let o;oA(o=rA())&&(n._determinateCircle=o.first)}},hostAttrs:["role","progressbar","tabindex","-1",1,"mat-mdc-progress-spinner","mdc-circular-progress"],hostVars:18,hostBindings:function(i,n){i&2&&(AA("aria-valuemin",0)("aria-valuemax",100)("aria-valuenow",n.mode==="determinate"?n.value:null)("mode",n.mode),Lo("mat-"+n.color),cn("width",n.diameter,"px")("height",n.diameter,"px")("--mdc-circular-progress-size",n.diameter+"px")("--mdc-circular-progress-active-indicator-width",n.diameter+"px"),iA("_mat-animation-noopable",n._noopAnimations)("mdc-circular-progress--indeterminate",n.mode==="indeterminate"))},inputs:{color:"color",mode:"mode",value:[2,"value","value",ln],diameter:[2,"diameter","diameter",ln],strokeWidth:[2,"strokeWidth","strokeWidth",ln]},exportAs:["matProgressSpinner"],decls:14,vars:11,consts:[["circle",""],["determinateSpinner",""],["aria-hidden","true",1,"mdc-circular-progress__determinate-container"],["xmlns","http://www.w3.org/2000/svg","focusable","false",1,"mdc-circular-progress__determinate-circle-graphic"],["cx","50%","cy","50%",1,"mdc-circular-progress__determinate-circle"],["aria-hidden","true",1,"mdc-circular-progress__indeterminate-container"],[1,"mdc-circular-progress__spinner-layer"],[1,"mdc-circular-progress__circle-clipper","mdc-circular-progress__circle-left"],[3,"ngTemplateOutlet"],[1,"mdc-circular-progress__gap-patch"],[1,"mdc-circular-progress__circle-clipper","mdc-circular-progress__circle-right"],["xmlns","http://www.w3.org/2000/svg","focusable","false",1,"mdc-circular-progress__indeterminate-circle-graphic"],["cx","50%","cy","50%"]],template:function(i,n){if(i&1&&(ne(0,PMe,2,8,"ng-template",null,0,a2),m(2,"div",2,1),ft(),m(4,"svg",3),ve(5,"circle",4),p()(),$s(),m(6,"div",5)(7,"div",6)(8,"div",7),En(9,8),p(),m(10,"div",9),En(11,8),p(),m(12,"div",10),En(13,8),p()()()),i&2){let o=Ji(1);y(4),AA("viewBox",n._viewBox()),y(),cn("stroke-dasharray",n._strokeCircumference(),"px")("stroke-dashoffset",n._strokeDashOffset(),"px")("stroke-width",n._circleStrokeWidth(),"%"),AA("r",n._circleRadius()),y(4),te("ngTemplateOutlet",o),y(2),te("ngTemplateOutlet",o),y(2),te("ngTemplateOutlet",o)}},dependencies:[nl],styles:[".mat-mdc-progress-spinner{display:block;overflow:hidden;line-height:0;position:relative;direction:ltr;transition:opacity 250ms cubic-bezier(0.4, 0, 0.6, 1)}.mat-mdc-progress-spinner circle{stroke-width:var(--mdc-circular-progress-active-indicator-width, 4px)}.mat-mdc-progress-spinner._mat-animation-noopable,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__determinate-circle{transition:none !important}.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-circle-graphic,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__spinner-layer,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-container{animation:none !important}.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-container circle{stroke-dasharray:0 !important}@media(forced-colors: active){.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic,.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle{stroke:currentColor;stroke:CanvasText}}.mdc-circular-progress__determinate-container,.mdc-circular-progress__indeterminate-circle-graphic,.mdc-circular-progress__indeterminate-container,.mdc-circular-progress__spinner-layer{position:absolute;width:100%;height:100%}.mdc-circular-progress__determinate-container{transform:rotate(-90deg)}.mdc-circular-progress--indeterminate .mdc-circular-progress__determinate-container{opacity:0}.mdc-circular-progress__indeterminate-container{font-size:0;letter-spacing:0;white-space:nowrap;opacity:0}.mdc-circular-progress--indeterminate .mdc-circular-progress__indeterminate-container{opacity:1;animation:mdc-circular-progress-container-rotate 1568.2352941176ms linear infinite}.mdc-circular-progress__determinate-circle-graphic,.mdc-circular-progress__indeterminate-circle-graphic{fill:rgba(0,0,0,0)}.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic{stroke:var(--mdc-circular-progress-active-indicator-color, var(--mat-sys-primary))}@media(forced-colors: active){.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic{stroke:CanvasText}}.mdc-circular-progress__determinate-circle{transition:stroke-dashoffset 500ms cubic-bezier(0, 0, 0.2, 1)}.mdc-circular-progress__gap-patch{position:absolute;top:0;left:47.5%;box-sizing:border-box;width:5%;height:100%;overflow:hidden}.mdc-circular-progress__gap-patch .mdc-circular-progress__indeterminate-circle-graphic{left:-900%;width:2000%;transform:rotate(180deg)}.mdc-circular-progress__circle-clipper .mdc-circular-progress__indeterminate-circle-graphic{width:200%}.mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{left:-100%}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-left .mdc-circular-progress__indeterminate-circle-graphic{animation:mdc-circular-progress-left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{animation:mdc-circular-progress-right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress__circle-clipper{display:inline-flex;position:relative;width:50%;height:100%;overflow:hidden}.mdc-circular-progress--indeterminate .mdc-circular-progress__spinner-layer{animation:mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}@keyframes mdc-circular-progress-container-rotate{to{transform:rotate(360deg)}}@keyframes mdc-circular-progress-spinner-layer-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}100%{transform:rotate(1080deg)}}@keyframes mdc-circular-progress-left-spin{from{transform:rotate(265deg)}50%{transform:rotate(130deg)}to{transform:rotate(265deg)}}@keyframes mdc-circular-progress-right-spin{from{transform:rotate(-265deg)}50%{transform:rotate(-130deg)}to{transform:rotate(-265deg)}}"],encapsulation:2,changeDetection:0})}return t})();var jAe=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({imports:[ui]})}return t})();var vD=new re("MARKDOWN_COMPONENT");var ZMe={cancelEditingTooltip:"Cancel editing",saveEvalMessageTooltip:"Save eval case message",thoughtChipLabel:"Thought",outcomeLabel:"Outcome",outputLabel:"Output",actualToolUsesLabel:"Actual tool uses:",expectedToolUsesLabel:"Expected tool uses:",actualResponseLabel:"Actual response:",expectedResponseLabel:"Expected response:",matchScoreLabel:"Match score",thresholdLabel:"Threshold",evalPassLabel:"Pass",evalFailLabel:"Fail",editEvalMessageTooltip:"Edit eval case message",deleteEvalMessageTooltip:"Delete eval case message",editFunctionArgsTooltip:"Edit function arguments",typeMessagePlaceholder:"Type a Message...",uploadFileTooltip:"Upload local file",moreOptionsTooltip:"More options",updateStateMenuLabel:"Update state",updateStateMenuTooltip:"Update the session state",turnOffMicTooltip:"Turn off microphone",useMicTooltip:"Use microphone",turnOffCamTooltip:"Turn off camera",useCamTooltip:"Use camera",updatedSessionStateChipLabel:"Updated session state",cannotEditSessionMessage:"This session is read-only. You cannot send messages or update the state."},VAe=new re("Chat Panel Messages",{factory:()=>ZMe});var XMe=["videoContainer"],$Me=["autoScroll"],e9e=["messageTextarea"],A9e=(t,A)=>({"user-message":t,"bot-message":A}),t9e=(t,A)=>({"eval-pass":t,"eval-fail":A}),i9e=t=>({hidden:t}),n9e=(t,A)=>({"eval-fail":t,"message-card--highlighted":A}),o9e=(t,A)=>({text:t,thought:A}),WAe=t=>({"function-event-button-highlight":t}),UF=t=>({hidden:t});function r9e(t,A){if(t&1){let e=Ue();m(0,"button",13),ee("click",function(){q(e);let n=M().$index,o=M(2);return W(o.clickEvent.emit(n))}),m(1,"mat-icon",14),T(2,"robot_2"),p()()}if(t&2){let e=M(),i=e.$implicit,n=e.$index,o=M(2);Lo(o.customIconColorClass(n)),te("disabled",!i.eventId)("matTooltip",o.getAgentNameFromEvent(n))("ngClass",Al(5,i9e,!o.getAgentNameFromEvent(n)))}}function s9e(t,A){t&1&&ve(0,"mat-progress-bar",15)}function a9e(t,A){if(t&1&&ve(0,"img",20),t&2){let e=M().$implicit;te("src",e.url,$r)}}function c9e(t,A){if(t&1&&(m(0,"a",21),T(1),p()),t&2){let e=M(2).$implicit;te("href",e.url,$r),y(),Pe(e.file.name)}}function l9e(t,A){if(t&1&&T(0),t&2){let e=M(2).$implicit;FA(" ",e.file.name," ")}}function g9e(t,A){if(t&1&&(m(0,"mat-icon"),T(1,"insert_drive_file"),p(),ne(2,c9e,2,2,"a",21)(3,l9e,1,1)),t&2){let e=M().$implicit;y(2),$(e.url?2:3)}}function d9e(t,A){if(t&1&&(m(0,"div",19),ne(1,a9e,1,1,"img",20)(2,g9e,4,1),p()),t&2){let e=A.$implicit;y(),$(e.file.type.startsWith("image/")?1:-1),y(),$(e.file.type.startsWith("image/")?-1:2)}}function C9e(t,A){if(t&1&&(m(0,"div",16),Rt(1,d9e,3,2,"div",19,Fi),p()),t&2){let e=M(2).$implicit;y(),Nt(e.attachments)}}function I9e(t,A){if(t&1&&(m(0,"div",17),T(1),p()),t&2){let e=M(4);y(),Pe(e.i18n.thoughtChipLabel)}}function u9e(t,A){if(t&1){let e=Ue();m(0,"div",22)(1,"textarea",24,2),ee("ngModelChange",function(n){q(e);let o=M(5);return W(o.userEditEvalCaseMessageChange.emit(n))})("keydown",function(n){q(e);let o=M(3).$implicit,r=M(2);return W(r.handleKeydown.emit({event:n,message:o}))}),p(),m(3,"div",25)(4,"span",26),ee("click",function(){q(e);let n=M(3).$implicit,o=M(2);return W(o.cancelEditMessage.emit(n))}),T(5," close "),p(),m(6,"span",27),ee("click",function(){q(e);let n=M(3).$implicit,o=M(2);return W(o.saveEditMessage.emit(n))}),T(7," check "),p()()()}if(t&2){let e=M(5);y(),te("ngModel",e.userEditEvalCaseMessage),y(3),te("matTooltip",e.i18n.cancelEditingTooltip),y(2),te("matTooltip",e.i18n.saveEvalMessageTooltip)}}function h9e(t,A){if(t&1&&En(0,23),t&2){let e=M(3).$implicit,i=M(2);te("ngComponentOutlet",i.markdownComponent)("ngComponentOutletInputs",tl(2,o9e,e.text,e.thought))}}function B9e(t,A){if(t&1&&ne(0,u9e,8,3,"div",22)(1,h9e,1,5,"ng-container",23),t&2){let e=M(2).$implicit;$(e.isEditing?0:1)}}function E9e(t,A){if(t&1&&(m(0,"div"),ve(1,"div",28),p()),t&2){let e=M(2).$implicit,i=M(2);y(),te("innerHTML",i.renderGooglerSearch(e.renderedContent),J0)}}function f9e(t,A){if(t&1&&(m(0,"code"),T(1),p()),t&2){let e=M(2).$implicit;y(),FA(" ",e.executableCode.code," ")}}function Q9e(t,A){if(t&1&&(m(0,"div")(1,"div"),T(2),p(),m(3,"div"),T(4),p()()),t&2){let e=M(2).$implicit,i=M(2);y(2),el("",i.i18n.outcomeLabel,": ",e.codeExecutionResult.outcome,""),y(2),el("",i.i18n.outputLabel,": ",e.codeExecutionResult.output,"")}}function m9e(t,A){if(t&1){let e=Ue();m(0,"div",29)(1,"img",30),ee("click",function(){q(e);let n=M(4).$implicit,o=M(2);return W(o.openViewImageDialog.emit(n.inlineData.data))}),p()()}if(t&2){let e=M(4).$implicit;y(),te("src",e.inlineData.data,$r)}}function p9e(t,A){if(t&1&&(m(0,"div"),ve(1,"app-audio-player",31),p()),t&2){let e=M(4).$implicit;y(),te("base64data",e.inlineData.data)}}function w9e(t,A){if(t&1){let e=Ue();m(0,"div")(1,"div",32)(2,"mat-icon"),T(3,"description"),p(),m(4,"button",33),ee("click",function(){q(e);let n=M(4).$implicit,o=M(2);return W(o.openBase64InNewTab.emit({data:n.inlineData.data,mimeType:n.inlineData.mimeType}))}),T(5),p()()()}if(t&2){let e=M(4).$implicit;y(5),FA(" ",e.inlineData.name," ")}}function y9e(t,A){if(t&1){let e=Ue();m(0,"div")(1,"button",33),ee("click",function(){q(e);let n=M(4).$implicit,o=M(2);return W(o.openBase64InNewTab.emit({data:n.inlineData.data,mimeType:n.inlineData.mimeType}))}),T(2),p()()}if(t&2){let e=M(4).$implicit;y(2),FA(" ",e.inlineData.name," ")}}function D9e(t,A){if(t&1&&(m(0,"div")(1,"div"),ne(2,m9e,2,1,"div",29)(3,p9e,2,1,"div")(4,w9e,6,1,"div")(5,y9e,3,1,"div"),p()()),t&2){let e,i=M(3).$implicit,n=M(2);y(2),$((e=i.inlineData.mediaType)===n.MediaType.IMAGE?2:e===n.MediaType.AUDIO?3:e===n.MediaType.TEXT?4:5)}}function v9e(t,A){if(t&1){let e=Ue();m(0,"div")(1,"img",34),ee("click",function(){q(e);let n=M(4).$implicit,o=M(2);return W(o.openViewImageDialog.emit(n.inlineData.data))}),p()()}if(t&2){let e=M(4).$implicit;y(),te("src",e.inlineData.data,$r)}}function b9e(t,A){if(t&1&&(m(0,"div",19)(1,"mat-icon"),T(2,"insert_drive_file"),p(),m(3,"a",21),T(4),p()()),t&2){let e=M(4).$implicit;y(3),te("href",e.inlineData.data,$r),y(),Pe(e.inlineData.displayName)}}function M9e(t,A){if(t&1&&(m(0,"div"),ne(1,v9e,2,1,"div")(2,b9e,5,2,"div",19),p()),t&2){let e=M(3).$implicit;y(),$(e.inlineData.mimeType.startsWith("image/")?1:2)}}function S9e(t,A){if(t&1&&ne(0,D9e,6,1,"div")(1,M9e,3,1,"div"),t&2){let e=M(2).$implicit;$(e.role==="bot"?0:1)}}function k9e(t,A){if(t&1&&(m(0,"div",37)(1,"div",38),T(2),p(),ve(3,"ngx-json-viewer",39),p(),m(4,"div",40)(5,"div",41),T(6),p(),ve(7,"ngx-json-viewer",39),p()),t&2){let e=M(3).$implicit,i=M(2);y(2),Pe(i.i18n.actualToolUsesLabel),y(),te("json",e.actualInvocationToolUses),y(3),Pe(i.i18n.expectedToolUsesLabel),y(),te("json",e.expectedInvocationToolUses)}}function x9e(t,A){if(t&1&&(m(0,"div",37)(1,"div",38),T(2),p(),m(3,"div"),T(4),p()(),m(5,"div",40)(6,"div",41),T(7),p(),m(8,"div"),T(9),p()()),t&2){let e=M(3).$implicit,i=M(2);y(2),Pe(i.i18n.actualResponseLabel),y(2),Pe(e.actualFinalResponse),y(3),Pe(i.i18n.expectedResponseLabel),y(2),Pe(e.expectedFinalResponse)}}function _9e(t,A){if(t&1&&(m(0,"div",36)(1,"span",42),T(2),p(),m(3,"span",43),T(4),p()()),t&2){let e=M(3).$implicit,i=M(2);y(2),el("",i.i18n.matchScoreLabel,": ",e.evalScore,""),y(2),el("",i.i18n.thresholdLabel,": ",e.evalThreshold,"")}}function R9e(t,A){if(t&1&&(m(0,"div",18)(1,"div",35),ne(2,k9e,8,4)(3,x9e,10,4),p(),ne(4,_9e,5,4,"div",36),p()),t&2){let e=M(2).$implicit;y(2),$(e.actualInvocationToolUses?2:e.actualFinalResponse?3:-1),y(2),$(e.evalScore!==void 0&&e.evalThreshold!==void 0?4:-1)}}function N9e(t,A){if(t&1&&(m(0,"mat-card",9),ne(1,s9e,1,0,"mat-progress-bar",15)(2,C9e,3,0,"div",16),m(3,"div"),ne(4,I9e,2,1,"div",17),m(5,"div"),ne(6,B9e,2,1),p(),ne(7,E9e,2,1,"div"),p(),ne(8,f9e,2,1,"code")(9,Q9e,5,4,"div")(10,S9e,2,1)(11,R9e,5,2,"div",18),p()),t&2){let e=M(),i=e.$implicit,n=e.$index,o=M(2);te("ngClass",tl(10,n9e,i.evalStatus===2,o.shouldMessageHighlighted(n))),y(),$(i.isLoading?1:-1),y(),$(i.attachments?2:-1),y(2),$(i.thought?4:-1),y(2),$(i.text?6:-1),y(),$(i.renderedContent?7:-1),y(),$(i.executableCode?8:-1),y(),$(i.codeExecutionResult?9:-1),y(),$(i.inlineData?10:-1),y(),$(i.failedMetric&&i.evalStatus===2?11:-1)}}function L9e(t,A){if(t&1){let e=Ue();m(0,"button",44),ee("click",function(){q(e);let n=M().$index,o=M(2);return W(o.clickEvent.emit(n))}),m(1,"mat-icon"),T(2,"bolt"),p(),T(3),p()}if(t&2){let e=M(),i=e.$implicit,n=e.$index,o=M(2);te("ngClass",Al(2,WAe,o.shouldMessageHighlighted(n))),y(3),FA(" ",i.functionCall.name," ")}}function F9e(t,A){if(t&1){let e=Ue();m(0,"button",44),ee("click",function(){q(e);let n=M().$index,o=M(2);return W(o.clickEvent.emit(n))}),m(1,"mat-icon"),T(2,"check"),p(),T(3),p()}if(t&2){let e=M(),i=e.$implicit,n=e.$index,o=M(2);te("ngClass",Al(2,WAe,o.shouldMessageHighlighted(n))),y(3),FA(" ",i.functionResponse.name," ")}}function G9e(t,A){if(t&1){let e=Ue();m(0,"div")(1,"span",45),ee("click",function(){q(e);let n=M(2).$implicit,o=M(2);return W(o.editEvalCaseMessage.emit(n))}),T(2," edit "),p(),m(3,"span",45),ee("click",function(){q(e);let n=M(2),o=n.$implicit,r=n.$index,s=M(2);return W(s.deleteEvalCaseMessage.emit({message:o,index:r}))}),T(4," delete "),p()()}if(t&2){let e=M(4);y(),te("ngClass",Al(4,UF,e.isEvalCaseEditing))("matTooltip",e.i18n.editEvalMessageTooltip),y(2),te("ngClass",Al(6,UF,e.isEvalCaseEditing))("matTooltip",e.i18n.deleteEvalMessageTooltip)}}function K9e(t,A){if(t&1){let e=Ue();m(0,"div")(1,"span",45),ee("click",function(){q(e);let n=M(2).$implicit,o=M(2);return W(o.editFunctionArgs.emit(n))}),T(2," edit "),p()()}if(t&2){let e=M(4);y(),te("ngClass",Al(2,UF,e.isEvalCaseEditing))("matTooltip",e.i18n.editFunctionArgsTooltip)}}function U9e(t,A){if(t&1&&ne(0,G9e,5,8,"div")(1,K9e,3,4,"div"),t&2){let e=M().$implicit,i=M(2);$(e.text?0:i.isEditFunctionArgsEnabled&&e.functionCall?1:-1)}}function T9e(t,A){t&1&&(m(0,"button",12)(1,"mat-icon"),T(2,"person"),p()())}function O9e(t,A){if(t&1&&(m(0,"div",7),ne(1,r9e,3,7,"button",8)(2,N9e,12,13,"mat-card",9)(3,L9e,4,4,"button",10)(4,F9e,4,4,"button",10),m(5,"div",7)(6,"span",11),T(7),p(),m(8,"span"),T(9),p()(),ne(10,U9e,2,1)(11,T9e,3,0,"button",12),p()),t&2){let e=A.$implicit,i=M(2);te("ngClass",tl(10,A9e,e.role==="user",e.role==="bot")),y(),$(e.role==="bot"?1:-1),y(),$(!e.functionCall&&!e.functionResponse?2:-1),y(),$(e.functionCall?3:-1),y(),$(e.functionResponse?4:-1),y(),te("ngClass",tl(13,t9e,e.evalStatus===1,e.evalStatus===2)),y(2),Pe(e.evalStatus===1?"check":e.evalStatus===2?"close":""),y(2),Pe(e.evalStatus===1?i.i18n.evalPassLabel:e.evalStatus===2?i.i18n.evalFailLabel:""),y(),$(i.evalCase&&e.role==="bot"&&i.isEvalEditMode?10:-1),y(),$(e.role==="user"?11:-1)}}function J9e(t,A){if(t&1&&(m(0,"div",5,0),ve(2,"div",null,1),Rt(4,O9e,12,16,"div",7,Fi),p()),t&2){let e=M();y(4),Nt(e.messages)}}function Y9e(t,A){if(t&1){let e=Ue();m(0,"div",59),ve(1,"img",60),m(2,"button",61),ee("click",function(){q(e);let n=M().$index,o=M(4);return W(o.removeFile.emit(n))}),m(3,"mat-icon",62),T(4,"close"),p()()()}if(t&2){let e=M().$implicit;y(),te("src",e.url,$r)}}function H9e(t,A){if(t&1){let e=Ue();m(0,"div",58)(1,"button",61),ee("click",function(){q(e);let n=M().$index,o=M(4);return W(o.removeFile.emit(n))}),m(2,"mat-icon",62),T(3,"close"),p()(),m(4,"div",63)(5,"mat-icon"),T(6,"insert_drive_file"),p(),m(7,"span"),T(8),p()()()}if(t&2){let e=M().$implicit;y(8),Pe(e.file.name)}}function z9e(t,A){if(t&1&&(m(0,"div"),ne(1,Y9e,5,1,"div",59)(2,H9e,9,1,"div",58),p()),t&2){let e=A.$implicit;y(),$(e.file.type.startsWith("image/")?1:e.file.type.startsWith("image/")?-1:2)}}function P9e(t,A){if(t&1){let e=Ue();m(0,"div",58)(1,"button",61),ee("click",function(){q(e);let n=M(4);return W(n.removeStateUpdate.emit())}),m(2,"mat-icon",62),T(3,"close"),p()(),m(4,"div",63)(5,"span"),T(6),p()()()}if(t&2){let e=M(4);y(6),Pe(e.i18n.updatedSessionStateChipLabel)}}function j9e(t,A){if(t&1&&(m(0,"div",50),Rt(1,z9e,3,1,"div",null,Fi),ne(3,P9e,7,1,"div",58),p()),t&2){let e=M(3);y(),Nt(e.selectedFiles),y(2),$(e.updatedSessionState?3:-1)}}function V9e(t,A){if(t&1){let e=Ue();m(0,"div",46)(1,"input",48,3),ee("change",function(n){q(e);let o=M(2);return W(o.fileSelect.emit(n))}),p(),m(3,"mat-form-field",49),ne(4,j9e,4,1,"div",50),m(5,"textarea",51),ee("ngModelChange",function(n){q(e);let o=M(2);return W(o.userInputChange.emit(n))})("keydown.enter",function(n){q(e);let o=M(2);return W(o.sendMessage.emit(n))}),p(),m(6,"div",52)(7,"div")(8,"button",53),Ii(9,"async"),ee("click",function(){q(e);let n=Ji(2);return W(n.click())}),m(10,"mat-icon"),T(11,"attach_file"),p()(),m(12,"button",54),Ii(13,"async"),m(14,"mat-icon"),T(15,"more_vert"),p()(),m(16,"mat-menu",null,4)(18,"span",55),ee("click",function(){q(e);let n=M(2);return W(n.updateState.emit())}),T(19),p()()(),m(20,"div")(21,"button",56),Ii(22,"async"),ee("click",function(){q(e);let n=M(2);return W(n.toggleAudioRecording.emit())}),m(23,"mat-icon"),T(24,"mic"),p()(),m(25,"button",57),Ii(26,"async"),ee("click",function(){q(e);let n=M(2);return W(n.toggleVideoRecording.emit())}),m(27,"mat-icon"),T(28,"videocam"),p()()()()()()}if(t&2){let e=Ji(17),i=M(2);y(4),$(i.selectedFiles.length&&i.appName!=""||i.updatedSessionState?4:-1),y(),te("ngModel",i.userInput)("placeholder",i.i18n.typeMessagePlaceholder),y(3),te("matTooltip",i.i18n.uploadFileTooltip)("disabled",!Qi(9,18,i.isMessageFileUploadEnabledObs)),y(4),te("matMenuTriggerFor",e)("matTooltip",i.i18n.moreOptionsTooltip)("disabled",!Qi(13,20,i.isManualStateUpdateEnabledObs)),y(6),te("matTooltip",i.i18n.updateStateMenuTooltip),y(),FA(" ",i.i18n.updateStateMenuLabel," "),y(2),iA("recording",i.isAudioRecording),te("matTooltip",i.isAudioRecording?i.i18n.turnOffMicTooltip:i.i18n.useMicTooltip)("disabled",!Qi(22,22,i.isBidiStreamingEnabledObs)),y(4),iA("recording",i.isVideoRecording),te("matTooltip",i.isVideoRecording?i.i18n.turnOffCamTooltip:i.i18n.useCamTooltip)("disabled",!Qi(26,24,i.isBidiStreamingEnabledObs))}}function q9e(t,A){if(t&1&&(m(0,"div",47),T(1),p()),t&2){let e=M(2);y(),Pe(e.i18n.cannotEditSessionMessage)}}function W9e(t,A){if(t&1&&ne(0,V9e,29,26,"div",46)(1,q9e,2,1,"div",47),t&2){let e=M();$(e.canEditSession()?0:1)}}function Z9e(t,A){t&1&&(m(0,"div",6),ve(1,"mat-progress-spinner",64),p())}var qAe="root_agent",EE=class t{constructor(A){this.sanitizer=A}appName="";messages=[];isChatMode=!0;evalCase=null;isEvalEditMode=!1;isEvalCaseEditing=!1;isEditFunctionArgsEnabled=!1;userInput="";userEditEvalCaseMessage="";selectedFiles=[];updatedSessionState=null;eventData=new Map;isAudioRecording=!1;isVideoRecording=!1;hoveredEventMessageIndices=[];userInputChange=new Ve;userEditEvalCaseMessageChange=new Ve;clickEvent=new Ve;handleKeydown=new Ve;cancelEditMessage=new Ve;saveEditMessage=new Ve;openViewImageDialog=new Ve;openBase64InNewTab=new Ve;editEvalCaseMessage=new Ve;deleteEvalCaseMessage=new Ve;editFunctionArgs=new Ve;fileSelect=new Ve;removeFile=new Ve;removeStateUpdate=new Ve;sendMessage=new Ve;updateState=new Ve;toggleAudioRecording=new Ve;toggleVideoRecording=new Ve;videoContainer;scrollContainer;textarea;scrollInterrupted=!1;previousMessageCount=0;i18n=E(VAe);uiStateService=E(zl);stringToColorService=E(uE);markdownComponent=E(vD);featureFlagService=E(Ks);MediaType=Bu;isMessageFileUploadEnabledObs=this.featureFlagService.isMessageFileUploadEnabled();isManualStateUpdateEnabledObs=this.featureFlagService.isManualStateUpdateEnabled();isBidiStreamingEnabledObs=this.featureFlagService.isBidiStreamingEnabled();canEditSession=mA(!0);ngAfterViewInit(){this.scrollContainer?.nativeElement&&(this.scrollContainer.nativeElement.addEventListener("wheel",()=>{this.scrollInterrupted=!0}),this.scrollContainer.nativeElement.addEventListener("touchmove",()=>{this.scrollInterrupted=!0}))}ngOnChanges(A){A.messages&&(this.messages.length>this.previousMessageCount&&(this.messages.slice(this.previousMessageCount).some(i=>i.role==="user")&&(this.scrollInterrupted=!1),this.scrollToBottom()),this.previousMessageCount=this.messages.length)}scrollToBottom(){!this.scrollInterrupted&&this.scrollContainer?.nativeElement&&setTimeout(()=>{this.scrollContainer.nativeElement.scrollTo({top:this.scrollContainer.nativeElement.scrollHeight,behavior:"auto"})},50)}getAgentNameFromEvent(A){let e=this.messages[A].eventId;return this.eventData.get(e)?.author??qAe}customIconColorClass(A){let e=this.getAgentNameFromEvent(A);return e!==qAe?`custom-icon-color-${this.stringToColorService.stc(e).replace("#","")}`:""}shouldMessageHighlighted(A){return this.hoveredEventMessageIndices.includes(A)}renderGooglerSearch(A){return this.sanitizer.bypassSecurityTrustHtml(A)}static \u0275fac=function(e){return new(e||t)(DA(dl))};static \u0275cmp=xe({type:t,selectors:[["app-chat-panel"]],viewQuery:function(e,i){if(e&1&&(At(XMe,5,eA),At($Me,5),At(e9e,5)),e&2){let n;oA(n=rA())&&(i.videoContainer=n.first),oA(n=rA())&&(i.scrollContainer=n.first),oA(n=rA())&&(i.textarea=n.first)}},inputs:{appName:"appName",messages:"messages",isChatMode:"isChatMode",evalCase:"evalCase",isEvalEditMode:"isEvalEditMode",isEvalCaseEditing:"isEvalCaseEditing",isEditFunctionArgsEnabled:"isEditFunctionArgsEnabled",userInput:"userInput",userEditEvalCaseMessage:"userEditEvalCaseMessage",selectedFiles:"selectedFiles",updatedSessionState:"updatedSessionState",eventData:"eventData",isAudioRecording:"isAudioRecording",isVideoRecording:"isVideoRecording",hoveredEventMessageIndices:"hoveredEventMessageIndices"},outputs:{userInputChange:"userInputChange",userEditEvalCaseMessageChange:"userEditEvalCaseMessageChange",clickEvent:"clickEvent",handleKeydown:"handleKeydown",cancelEditMessage:"cancelEditMessage",saveEditMessage:"saveEditMessage",openViewImageDialog:"openViewImageDialog",openBase64InNewTab:"openBase64InNewTab",editEvalCaseMessage:"editEvalCaseMessage",deleteEvalCaseMessage:"deleteEvalCaseMessage",editFunctionArgs:"editFunctionArgs",fileSelect:"fileSelect",removeFile:"removeFile",removeStateUpdate:"removeStateUpdate",sendMessage:"sendMessage",updateState:"updateState",toggleAudioRecording:"toggleAudioRecording",toggleVideoRecording:"toggleVideoRecording"},features:[ti],decls:5,vars:5,consts:[["autoScroll",""],["videoContainer",""],["messageTextarea",""],["fileInput",""],["moreMenu","matMenu"],[1,"chat-messages"],[1,"loading-spinner-container"],[3,"ngClass"],["mat-mini-fab","",3,"disabled","matTooltip","class","ngClass"],[1,"message-card",3,"ngClass"],["mat-stroked-button","",1,"function-event-button",3,"ngClass"],[1,"material-symbols-outlined"],["mat-mini-fab",""],["mat-mini-fab","",3,"click","disabled","matTooltip","ngClass"],["fontSet","material-symbols-outlined"],["mode","buffer",1,"loading-bar"],[1,"attachments"],[1,"thought-chip"],[1,"eval-compare-container"],[1,"attachment"],["alt","attachment",1,"image-preview-chat",3,"src"],["download","",3,"href"],[1,"edit-message-container"],[3,"ngComponentOutlet","ngComponentOutletInputs"],["rows","4","cols","80",1,"message-textarea",3,"ngModelChange","keydown","ngModel"],[1,"edit-message-buttons-container"],[1,"material-symbols-outlined","cancel-edit-button",3,"click","matTooltip"],[1,"material-symbols-outlined","save-edit-button",3,"click","matTooltip"],[3,"innerHTML"],[1,"generated-image-container"],["alt","image",1,"generated-image",3,"click","src"],[3,"base64data"],[1,"html-artifact-container"],[1,"link-style-button",3,"click"],["alt","image",1,"image-preview-chat",3,"click","src"],[1,"actual-expected-compare-container"],[1,"score-threshold-container"],[1,"actual-result"],[1,"eval-response-header","header-actual"],[3,"json"],[1,"expected-result"],[1,"eval-response-header","header-expected"],[1,"header-actual"],[1,"header-expected"],["mat-stroked-button","",1,"function-event-button",3,"click","ngClass"],[1,"material-symbols-outlined","eval-case-edit-button",3,"click","ngClass","matTooltip"],[1,"chat-input"],[1,"readonly-session-message"],["type","file","multiple","","hidden","",3,"change"],["appearance","outline",1,"input-field"],[1,"file-preview"],["matInput","","cdkTextareaAutosize","","cdkAutosizeMinRows","1","cdkAutosizeMaxRows","10",1,"chat-input-box",3,"ngModelChange","keydown.enter","ngModel","placeholder"],[1,"chat-input-actions"],["mat-icon-button","",1,"function-event-button",3,"click","matTooltip","disabled"],["mat-icon-button","",1,"function-event-button",3,"matMenuTriggerFor","matTooltip","disabled"],["mat-menu-item","",3,"click","matTooltip"],["mat-icon-button","","matSuffix","",1,"audio-rec-btn",3,"click","matTooltip","disabled"],["mat-icon-button","","matSuffix","",1,"video-rec-btn",3,"click","matTooltip","disabled"],[1,"file-container"],[1,"image-container"],["alt","preview",1,"image-preview",3,"src"],["mat-icon-button","",1,"delete-button",3,"click"],["color","warn"],[1,"file-info"],["mode","indeterminate","diameter","50"]],template:function(e,i){if(e&1&&(Wa(0),Ii(1,"async"),ne(2,J9e,6,0,"div",5)(3,W9e,2,1)(4,Z9e,2,0,"div",6)),e&2){let n=Qi(1,3,i.uiStateService.isSessionLoading());y(2),$(i.appName!=""&&!n?2:-1),y(),$(i.appName!=""&&i.isChatMode&&!n?3:-1),y(),$(n?4:-1)}},dependencies:[Ur,ta,YI,ts,Kn,Mr,Fo,Cr,gD,ir,eAe,sE,zAe,DD,j0,Un,ya,J5,L1,Gs,ds,yX,z5,YB,gl,JAe,sd,m2,BE,jAe,Z1,nd,j1,hE,_F,Ma],styles:["[_nghost-%COMP%]{display:flex;flex-direction:column;height:100%}.generated-image-container[_ngcontent-%COMP%]{max-width:400px}.generated-image[_ngcontent-%COMP%]{max-width:100%;min-width:40px;border-radius:8px}.html-artifact-container[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:flex-start;align-items:center}.loading-bar[_ngcontent-%COMP%]{width:100px;margin:15px}.chat-messages[_ngcontent-%COMP%]{flex-grow:1;overflow-y:auto;padding:20px;margin-top:16px}.message-card[_ngcontent-%COMP%]{padding:5px 20px;margin:5px;border-radius:20px;max-width:80%;font-size:14px;font-weight:400;position:relative;display:inline-block}.message-card.message-card--highlighted[_ngcontent-%COMP%]{background-color:var(--chat-panel-function-event-button-highlight-background-color)}.function-event-button[_ngcontent-%COMP%]{background-color:var(--chat-panel-function-event-button-background-color);margin:5px 5px 10px}.function-event-button-highlight[_ngcontent-%COMP%]{background-color:var(--chat-panel-function-event-button-highlight-background-color);border-color:var(--chat-panel-function-event-button-highlight-border-color)!important;color:var(--chat-panel-function-event-button-highlight-color)!important}.user-message[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center}.user-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{background-color:var(--chat-panel-user-message-message-card-background-color);align-self:flex-end;color:var(--chat-panel-user-message-message-card-color);box-shadow:none}.bot-message[_ngcontent-%COMP%]{display:flex;align-items:center}.bot-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{background-color:var(--chat-panel-bot-message-message-card-background-color);align-self:flex-start;color:var(--chat-panel-bot-message-message-card-color);box-shadow:none}.bot-message[_ngcontent-%COMP%]:focus-within .message-card[_ngcontent-%COMP%]{background-color:var(--chat-panel-bot-message-focus-within-message-card-background-color);border:1px solid var(--chat-panel-bot-message-focus-within-message-card-border-color)}.message-textarea[_ngcontent-%COMP%]{background-color:var(--chat-panel-message-textarea-background-color);max-width:100%;border:none;font-family:Google Sans,Helvetica Neue,sans-serif}.message-textarea[_ngcontent-%COMP%]:focus{background-color:var(--chat-panel-message-textarea-focus-background-color);outline:none}.edit-message-buttons-container[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}.message-card[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%]{visibility:hidden;position:absolute;left:10px;z-index:10;background-color:var(--chat-panel-eval-compare-container-background-color);overflow:hidden;border-radius:20px;padding:5px 20px;margin-bottom:10px;font-size:16px}.message-card[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .actual-result[_ngcontent-%COMP%]{border-right:2px solid var(--chat-panel-actual-result-border-right-color);padding-right:8px;min-width:350px;max-width:350px}.message-card[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .expected-result[_ngcontent-%COMP%]{padding-left:12px;min-width:350px;max-width:350px}.message-card[_ngcontent-%COMP%]:hover .eval-compare-container[_ngcontent-%COMP%]{visibility:visible}.actual-expected-compare-container[_ngcontent-%COMP%]{display:flex}.score-threshold-container[_ngcontent-%COMP%]{display:flex;justify-content:center;gap:10px;align-items:center;margin-top:15px;font-size:14px;font-weight:600}.eval-response-header[_ngcontent-%COMP%]{padding-bottom:5px;border-bottom:2px solid var(--chat-panel-eval-response-header-border-bottom-color);font-style:italic;font-weight:700}.header-expected[_ngcontent-%COMP%]{color:var(--chat-panel-header-expected-color)}.header-actual[_ngcontent-%COMP%]{color:var(--chat-panel-header-actual-color)}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:var(--chat-panel-eval-pass-color)}.eval-fail[_ngcontent-%COMP%]{display:flex;color:var(--chat-panel-eval-fail-color)}.hidden[_ngcontent-%COMP%]{visibility:hidden}.chat-input[_ngcontent-%COMP%]{display:flex;padding:10px;width:60%;margin:0 auto}.readonly-session-message[_ngcontent-%COMP%]{display:block;text-align:center;padding:10px;width:100%;margin:0 auto;color:var(--chat-error-color)}.input-field[_ngcontent-%COMP%]{flex-grow:1}.input-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{color:var(--chat-panel-input-field-textarea-color);border:none;padding:10px;box-sizing:content-box;caret-color:var(--chat-panel-input-field-textarea-caret-color)}.input-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]::placeholder{color:var(--chat-panel-input-field-textarea-placeholder-color)}.input-field[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:var(--chat-panel-input-field-button-color);background-color:var(--chat-panel-input-field-button-background-color)}.chat-input-actions[_ngcontent-%COMP%]{width:106%;margin-top:10px;display:flex;justify-content:space-between;align-items:center;max-width:100%}.chat-input-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{margin-left:10px;margin-right:10px}.file-preview[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px;margin-bottom:8px}.image-preview[_ngcontent-%COMP%]{width:40px;height:40px;object-fit:cover;border-radius:4px}.image-preview-chat[_ngcontent-%COMP%]{max-width:90%;max-height:70vh;width:auto;height:auto;border-radius:8px;cursor:pointer;transition:transform .2s ease-in-out}.attachment[_ngcontent-%COMP%]{display:flex;align-items:center}[_nghost-%COMP%] .mat-mdc-mini-fab{background-color:var(--chat-panel-mat-mdc-mini-fab-background-color)}[_nghost-%COMP%] .mat-mdc-mini-fab mat-icon{color:var(--chat-panel-mat-mdc-mini-fab-mat-icon-color)}[_nghost-%COMP%] .message-text p{white-space:pre-line;word-break:break-word;overflow-wrap:break-word}[_nghost-%COMP%] .input-field .mat-mdc-text-field-wrapper{border:1px solid var(--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color);border-radius:16px}.image-container[_ngcontent-%COMP%]{position:relative;display:inline-block;border-radius:12px;overflow:hidden}.image-preview[_ngcontent-%COMP%]{display:block;width:100%;height:auto;border-radius:12px;width:80px;height:80px}.delete-button[_ngcontent-%COMP%]{position:absolute;top:1px;right:1px;background-color:var(--chat-panel-delete-button-background-color);border:none;border-radius:50%;padding:8px;cursor:pointer;color:var(--chat-panel-delete-button-color);display:flex;align-items:center;justify-content:center;margin-right:0;scale:.7}.delete-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px}.file-container[_ngcontent-%COMP%]{position:relative;display:flex;flex-direction:column;gap:8px;height:80px;background-color:var(--chat-panel-file-container-background-color);border-radius:12px}.file-info[_ngcontent-%COMP%]{margin-right:60px;padding-top:20px;padding-left:16px}.thought-chip[_ngcontent-%COMP%]{border-radius:5px;background-color:var(--chat-panel-thought-chip-background-color);width:80px;text-align:center;margin-top:5px}[_nghost-%COMP%] pre{white-space:pre-wrap;word-break:break-word;overflow-x:auto;max-width:100%}.link-style-button[_ngcontent-%COMP%]{background:none;border:none;padding:0;font:inherit;color:var(--chat-panel-link-style-button-color)!important;text-decoration:underline;cursor:pointer;outline:none;font-size:14px}.cancel-edit-button[_ngcontent-%COMP%]{width:24px;height:24px;color:var(--chat-mat-mdc-text-field-wrapper-border-color);cursor:pointer;margin-right:16px}.save-edit-button[_ngcontent-%COMP%]{width:24px;height:24px;color:var(--mat-sys-primary);cursor:pointer;margin-right:16px}.chat-input-box[_ngcontent-%COMP%]{caret-color:#fff}button.audio-rec-btn[_ngcontent-%COMP%], button.video-rec-btn[_ngcontent-%COMP%]{background-color:var(--chat-card-background-color)}button.audio-rec-btn.recording[_ngcontent-%COMP%], button.video-rec-btn.recording[_ngcontent-%COMP%]{background-color:var(--chat-panel-eval-fail-color)}.loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;height:100%}"]})};function Wo(t){return Array.isArray(t)}function nr(t){return t!==null&&typeof t=="object"&&(t.constructor===void 0||t.constructor.name==="Object")}function TF(t){return t&&typeof t=="object"?t.op==="add":!1}function OF(t){return t&&typeof t=="object"?t.op==="remove":!1}function bD(t){return t&&typeof t=="object"?t.op==="replace":!1}function MD(t){return t&&typeof t=="object"?t.op==="copy":!1}function X1(t){return t&&typeof t=="object"?t.op==="move":!1}function ZAe(t,A){return JSON.stringify(t)===JSON.stringify(A)}function X9e(t,A){return t===A}function JF(t){return t.slice(0,t.length-1)}function XAe(t){return t[t.length-1]}function $Ae(t,A){let e=arguments.length>2&&arguments[2]!==void 0?arguments[2]:X9e;if(t.length{A[e]=t[e]}),A}if(nr(t)){let A=ae({},t);return Object.getOwnPropertySymbols(t).forEach(e=>{A[e]=t[e]}),A}return t}function zF(t,A,e){if(t[A]===e)return t;let i=HF(t);return i[A]=e,i}function WA(t,A){let e=t,i=0;for(;i3&&arguments[3]!==void 0?arguments[3]:!1;if(A.length===0)return e;let n=A[0],o=ra(t?t[n]:void 0,A.slice(1),e,i);if(nr(t)||Wo(t))return zF(t,n,o);if(i){let r=$9e.test(n)?[]:{};return r[n]=o,r}throw new Error("Path does not exist")}var $9e=/^\d+$/;function Tm(t,A,e){if(A.length===0)return e(t);if(!YF(t))throw new Error("Path doesn't exist");let i=A[0],n=Tm(t[i],A.slice(1),e);return zF(t,i,n)}function Eu(t,A){if(A.length===0)return t;if(!YF(t))throw new Error("Path does not exist");if(A.length===1){let n=A[0];if(!(n in t))return t;let o=HF(t);return Wo(o)&&o.splice(Number.parseInt(n),1),nr(o)&&delete o[n],o}let e=A[0],i=Eu(t[e],A.slice(1));return zF(t,e,i)}function Om(t,A,e){let i=A.slice(0,A.length-1),n=A[A.length-1];return Tm(t,i,o=>{if(!Array.isArray(o))throw new TypeError(`Array expected at path ${JSON.stringify(i)}`);let r=HF(o);return r.splice(Number.parseInt(n),0,e),r})}function Us(t,A){return t===void 0?!1:A.length===0?!0:t===null?!1:Us(t[A[0]],A.slice(1))}function Sa(t){let A=t.split("/");return A.shift(),A.map(e=>e.replace(/~1/g,"/").replace(/~0/g,"~"))}function pt(t){return t.map(ete).join("")}function ete(t){return`/${String(t).replace(/~/g,"~0").replace(/\//g,"~1")}`}function Jm(t,A){return t+ete(A)}function Mc(t,A,e){let i=t;for(let n=0;n{let s,a=Sc(o,r.path);if(r.op==="add")s=ite(o,a);else if(r.op==="remove")s=tte(o,a);else if(r.op==="replace")s=Ate(o,a);else if(r.op==="copy")s=aSe(o,a);else if(r.op==="move")s=cSe(o,a,Ym(r.from));else if(r.op==="test")s=[];else throw new Error(`Unknown JSONPatch operation ${JSON.stringify(r)}`);let c;if(e?.before){let l=e.before(o,r,s);if(l?.revertOperations&&(s=l.revertOperations),l?.document&&(c=l.document),l?.json)throw new Error('Deprecation warning: returned object property ".json" has been renamed to ".document"')}if(i=s.concat(i),c!==void 0)return{document:c}}}),i}function Ate(t,A){return Us(t,A)?[{op:"replace",path:pt(A),value:WA(t,A)}]:[]}function tte(t,A){return[{op:"add",path:pt(A),value:WA(t,A)}]}function ite(t,A){return fE(t,A)||!Us(t,A)?[{op:"remove",path:pt(A)}]:Ate(t,A)}function aSe(t,A){return ite(t,A)}function cSe(t,A,e){if(A.length="0"&&t<="9"}function ste(t){return t>=" "}function Hm(t){return`,:[]/{}() ++`.includes(t)}function VF(t){return t>="a"&&t<="z"||t>="A"&&t<="Z"||t==="_"||t==="$"}function qF(t){return t>="a"&&t<="z"||t>="A"&&t<="Z"||t==="_"||t==="$"||t>="0"&&t<="9"}var WF=/^(http|https|ftp|mailto|file|data|irc):\/\/$/,ZF=/^[A-Za-z0-9-._~:/?#@!$&'()*+;=]$/;function XF(t){return`,[]/{} ++`.includes(t)}function $F(t){return zm(t)||QSe.test(t)}var QSe=/^[[{\w-]$/;function ate(t){return t===` +`||t==="\r"||t===" "||t==="\b"||t==="\f"}function $1(t,A){let e=t.charCodeAt(A);return e===32||e===10||e===9||e===13}function cte(t,A){let e=t.charCodeAt(A);return e===32||e===9||e===13}function lte(t,A){let e=t.charCodeAt(A);return e===160||e>=8192&&e<=8202||e===8239||e===8287||e===12288}function zm(t){return eG(t)||_D(t)}function eG(t){return t==='"'||t==="\u201C"||t==="\u201D"}function AG(t){return t==='"'}function _D(t){return t==="'"||t==="\u2018"||t==="\u2019"||t==="`"||t==="\xB4"}function tG(t){return t==="'"}function QE(t,A){let e=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,i=t.lastIndexOf(A);return i!==-1?t.substring(0,i)+(e?"":t.substring(i+1)):t}function Pl(t,A){let e=t.length;if(!$1(t,e-1))return t+A;for(;$1(t,e-1);)e--;return t.substring(0,e)+A+t.substring(e)}function gte(t,A,e){return t.substring(0,A)+t.substring(A+e)}function dte(t){return/[,\n][ \t\r]*$/.test(t)}var mSe={"\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},pSe={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:` +`,r:"\r",t:" "};function jl(t){let A=0,e="";c(["```","[```","{```"]),o()||P(),c(["```","```]","```}"]);let n=d(",");for(n&&r(),$F(t[A])&&dte(e)?(n||(e=Pl(e,",")),f()):n&&(e=QE(e,","));t[A]==="}"||t[A]==="]";)A++,r();if(A>=t.length)return e;ye();function o(){r();let oe=h()||B()||b()||S()||w()||K(!1)||J();return r(),oe}function r(){let oe=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0,le=A,me=s(oe);do me=a(),me&&(me=s(oe));while(me);return A>le}function s(oe){let le=oe?$1:cte,me="";for(;;)if(le(t,A))me+=t[A],A++;else if(lte(t,A))me+=" ",A++;else break;return me.length>0?(e+=me,!0):!1}function a(){if(t[A]==="/"&&t[A+1]==="*"){for(;A=t.length;Te||($F(t[A])||$e?e=Pl(e,":"):X()),o()||(Te||$e?e+="null":X())}return t[A]==="}"?(e+="}",A++):e=Pl(e,"}"),!0}return!1}function B(){if(t[A]==="["){e+="[",A++,r(),C(",")&&r();let oe=!0;for(;A0&&arguments[0]!==void 0?arguments[0]:!1,le=arguments.length>1&&arguments[1]!==void 0?arguments[1]:-1,me=t[A]==="\\";if(me&&(A++,me=!0),zm(t[A])){let Te=AG(t[A])?AG:tG(t[A])?tG:_D(t[A])?_D:eG,$e=A,Je=e.length,Qe='"';for(A++;;){if(A>=t.length){let He=O(A-1);return!oe&&Hm(t.charAt(He))?(A=$e,e=e.substring(0,Je),b(!0)):(Qe=Pl(Qe,'"'),e+=Qe,!0)}if(A===le)return Qe=Pl(Qe,'"'),e+=Qe,!0;if(Te(t[A])){let He=A,PA=Qe.length;if(Qe+='"',A++,e+=Qe,r(!1),oe||A>=t.length||Hm(t[A])||zm(t[A])||eC(t[A]))return k(),!0;let JA=O(He-1),Ye=t.charAt(JA);if(Ye===",")return A=$e,e=e.substring(0,Je),b(!1,JA);if(Hm(Ye))return A=$e,e=e.substring(0,Je),b(!0);e=e.substring(0,Je),A=He+1,Qe=`${Qe.substring(0,PA)}\\${Qe.substring(PA)}`}else if(oe&&XF(t[A])){if(t[A-1]===":"&&WF.test(t.substring($e+1,A+2)))for(;A=t.length?A=t.length:ue()}else Qe+=He,A+=2}else{let He=t.charAt(A);He==='"'&&t[A-1]!=="\\"?(Qe+=`\\${He}`,A++):ate(He)?(Qe+=mSe[He],A++):(ste(He)||Z(He),Qe+=He,A++)}me&&I()}}return!1}function k(){let oe=!1;for(r();t[A]==="+";){oe=!0,A++,r(),e=QE(e,'"',!0);let le=e.length;b()?e=gte(e,le,1):e=Pl(e,'"')}return oe}function S(){let oe=A;if(t[A]==="-"){if(A++,H())return V(oe),!0;if(!eC(t[A]))return A=oe,!1}for(;eC(t[A]);)A++;if(t[A]==="."){if(A++,H())return V(oe),!0;if(!eC(t[A]))return A=oe,!1;for(;eC(t[A]);)A++}if(t[A]==="e"||t[A]==="E"){if(A++,(t[A]==="-"||t[A]==="+")&&A++,H())return V(oe),!0;if(!eC(t[A]))return A=oe,!1;for(;eC(t[A]);)A++}if(!H())return A=oe,!1;if(A>oe){let le=t.slice(oe,A),me=/^0\d/.test(le);return e+=me?`"${le}"`:le,!0}return!1}function w(){return _("true","true")||_("false","false")||_("null","null")||_("True","true")||_("False","false")||_("None","null")}function _(oe,le){return t.slice(A,A+oe.length)===oe?(e+=le,A+=oe.length,!0):!1}function K(oe){let le=A;if(VF(t[A])){for(;Ale){for(;$1(t,A-1)&&A>0;)A--;let me=t.slice(le,A);return e+=me==="undefined"?"null":JSON.stringify(me),t[A]==='"'&&A++,!0}}function J(){if(t[A]==="/"){let oe=A;for(A++;A0&&$1(t,le);)le--;return le}function H(){return A>=t.length||Hm(t[A])||$1(t,A)}function V(oe){e+=`${t.slice(oe,A)}0`}function Z(oe){throw new p2(`Invalid character ${JSON.stringify(oe)}`,A)}function ye(){throw new p2(`Unexpected character ${JSON.stringify(t[A])}`,A)}function P(){throw new p2("Unexpected end of json string",t.length)}function se(){throw new p2("Object key expected",A)}function X(){throw new p2("Colon expected",A)}function ue(){let oe=t.slice(A,A+6);throw new p2(`Invalid unicode character "${oe}"`,A)}}function wSe(t,A){return t[A]==="*"&&t[A+1]==="/"}var ySe=typeof global=="object"&&global&&global.Object===Object&&global,RD=ySe;var DSe=typeof self=="object"&&self&&self.Object===Object&&self,vSe=RD||DSe||Function("return this")(),Vr=vSe;var bSe=Vr.Symbol,Ts=bSe;var Cte=Object.prototype,MSe=Cte.hasOwnProperty,SSe=Cte.toString,Pm=Ts?Ts.toStringTag:void 0;function kSe(t){var A=MSe.call(t,Pm),e=t[Pm];try{t[Pm]=void 0;var i=!0}catch{}var n=SSe.call(t);return i&&(A?t[Pm]=e:delete t[Pm]),n}var Ite=kSe;var xSe=Object.prototype,_Se=xSe.toString;function RSe(t){return _Se.call(t)}var ute=RSe;var NSe="[object Null]",LSe="[object Undefined]",hte=Ts?Ts.toStringTag:void 0;function FSe(t){return t==null?t===void 0?LSe:NSe:hte&&hte in Object(t)?Ite(t):ute(t)}var Gg=FSe;function GSe(t){return t!=null&&typeof t=="object"}var nc=GSe;var KSe="[object Symbol]";function USe(t){return typeof t=="symbol"||nc(t)&&Gg(t)==KSe}var hl=USe;function TSe(t,A){for(var e=-1,i=t==null?0:t.length,n=Array(i);++e0){if(++A>=Mke)return arguments[0]}else A=0;return t.apply(void 0,arguments)}}var Nte=xke;function _ke(t){return function(){return t}}var Lte=_ke;var Rke=function(){try{var t=kc(Object,"defineProperty");return t({},"",{}),t}catch{}}(),pE=Rke;var Nke=pE?function(t,A){return pE(t,"toString",{configurable:!0,enumerable:!1,value:Lte(A),writable:!0})}:ad,Fte=Nke;var Lke=Nte(Fte),Gte=Lke;function Fke(t,A){for(var e=-1,i=t==null?0:t.length;++e-1&&t%1==0&&t-1&&t%1==0&&t<=Vke}var yE=qke;function Wke(t){return t!=null&&yE(t.length)&&!ND(t)}var Vl=Wke;function Zke(t,A,e){if(!Ds(e))return!1;var i=typeof A;return(i=="number"?Vl(e)&&wE(A,e.length):i=="string"&&A in e)?iC(e[A],t):!1}var Vm=Zke;var Xke=Object.prototype;function $ke(t){var A=t&&t.constructor,e=typeof A=="function"&&A.prototype||Xke;return t===e}var oC=$ke;function exe(t,A){for(var e=-1,i=Array(t);++e-1}var sie=Q_e;function m_e(t,A){var e=this.__data__,i=aC(e,t);return i<0?(++this.size,e.push([t,A])):e[i][1]=A,this}var aie=m_e;function SE(t){var A=-1,e=t==null?0:t.length;for(this.clear();++A0&&e(s)?A>1?mie(s,A-1,e,i,n):_E(n,s):i||(n[n.length]=s)}return n}var pie=mie;var H_e=TD(Object.getPrototypeOf,Object),HD=H_e;function z_e(t,A,e){var i=-1,n=t.length;A<0&&(A=-A>n?0:n+A),e=e>n?n:e,e<0&&(e+=n),n=A>e?0:e-A>>>0,A>>>=0;for(var o=Array(n);++is))return!1;var c=o.get(t),l=o.get(A);if(c&&l)return c==A&&l==t;var d=-1,C=!0,I=e&HNe?new dne:void 0;for(o.set(t,A),o.set(A,t);++d=A||K<0||d&&J>=o}function f(){var _=cv();if(B(_))return b(_);s=setTimeout(f,h(_))}function b(_){return s=void 0,C&&i?I(_):(i=n=void 0,r)}function k(){s!==void 0&&clearTimeout(s),c=0,i=a=n=s=void 0}function S(){return s===void 0?r:b(cv())}function w(){var _=cv(),K=B(_);if(i=arguments,n=this,a=_,K){if(s===void 0)return u(a);if(d)return clearTimeout(s),s=setTimeout(f,A),I(a)}return s===void 0&&(s=setTimeout(f,A)),r}return w.cancel=k,w.flush=S,w}var KE=HLe;function zLe(t){var A=t==null?0:t.length;return A?t[A-1]:void 0}var vi=zLe;function PLe(t){return typeof t=="function"?t:ad}var lv=PLe;function jLe(t,A){for(var e=t==null?0:t.length;e--&&A(t[e],e,t)!==!1;);return t}var Kne=jLe;var VLe=nv(!0),Une=VLe;function qLe(t,A){return t&&Une(t,A,ql)}var Tne=qLe;var WLe=rv(Tne,!0),One=WLe;function ZLe(t,A){var e=go(t)?Kne:One;return e(t,lv(A))}var cG=ZLe;function XLe(t){return t&&t.length?t[0]:void 0}var Wl=XLe;function $Le(t,A){var e=-1,i=Vl(t)?Array(t.length):[];return sv(t,function(n,o,r){i[++e]=A(n,o,r)}),i}var gv=$Le;function eFe(t,A){var e=go(t)?AC:gv;return e(t,cd(A,3))}var lG=eFe;var AFe=Object.prototype,tFe=AFe.hasOwnProperty,iFe=av(function(t,A,e){tFe.call(t,e)?t[e].push(A):tC(t,e,[A])}),gG=iFe;function nFe(t){var A=t==null?0:t.length;return A?wie(t,0,-1):[]}var Hi=nFe;var oFe="[object Map]",rFe="[object Set]",sFe=Object.prototype,aFe=sFe.hasOwnProperty;function cFe(t){if(t==null)return!0;if(Vl(t)&&(go(t)||typeof t=="string"||typeof t.splice=="function"||y2(t)||DE(t)||rC(t)))return!t.length;var A=Kg(t);if(A==oFe||A==rFe)return!t.size;if(oC(t))return!OD(t).length;for(var e in t)if(aFe.call(t,e))return!1;return!0}var An=cFe;function lFe(t,A){return GE(t,A)}var wi=lFe;function gFe(t,A){return tA||o&&r&&a&&!s&&!c||i&&r&&a||!e&&a||!n)return 1;if(!i&&!o&&!c&&t=s)return a;var c=e[i];return a*(c=="desc"?-1:1)}}return t.index-A.index}var Pne=BFe;function EFe(t,A,e){A.length?A=AC(A,function(o){return go(o)?function(r){return xE(r,o.length===1?o[0]:o)}:o}):A=[ad];var i=-1;A=AC(A,sC(cd));var n=gv(t,function(o,r,s){var a=AC(A,function(c){return c(o)});return{criteria:a,index:++i,value:o}});return Hne(n,function(o,r){return Pne(o,r,e)})}var jne=EFe;var fFe=av(function(t,A,e){t[e?0:1].push(A)},function(){return[[],[]]}),CG=fFe;var QFe=Math.ceil,mFe=Math.max;function pFe(t,A,e,i){for(var n=-1,o=mFe(QFe((A-t)/(e||1)),0),r=Array(o);o--;)r[i?o:++n]=t,t+=e;return r}var Vne=pFe;function wFe(t){return function(A,e,i){return i&&typeof i!="number"&&Vm(A,e,i)&&(e=i=void 0),A=mE(A),e===void 0?(e=A,A=0):e=mE(e),i=i===void 0?A1&&Vm(t,A[0],A[1])?A=[]:e>2&&Vm(A[0],A[1],A[2])&&(A=[A[0]]),jne(t,pie(A,1),[])}),IG=DFe;var vFe=9007199254740991,uG=4294967295,bFe=Math.min;function MFe(t,A){if(t=Dte(t),t<1||t>vFe)return[];var e=uG,i=bFe(t,uG);A=lv(A),t-=uG;for(var n=KD(i,A);++eArray.isArray(t),xFe=t=>t!==null&&typeof t=="object"&&!uC(t),_Fe=t=>typeof t=="string",mu=(t,A)=>t===A?!0:t!==null&&A!==null&&typeof t=="object"&&typeof A=="object"&&Object.keys(t).length===Object.keys(A).length&&Object.entries(t).every(([e,i])=>mu(i,A[e]));function os(t){return(...A)=>{let e=A.map(o=>vs(o)),i=e[0],n=e[1];return e.length===1?o=>t(i(o)):e.length===2?o=>t(i(o),n(o)):o=>t(...e.map(r=>r(o)))}}var e3={boolean:0,number:1,string:2},Wne=3,Xne=(t,A)=>typeof t==typeof A&&typeof t in e3?t>A:!1,RFe=(t,A)=>mu(t,A)||Xne(t,A),$ne=(t,A)=>typeof t==typeof A&&typeof t in e3?tmu(t,A)||$ne(t,A),$m={pipe:(...t)=>{let A=t.map(e=>vs(e));return e=>A.reduce((i,n)=>n(i),e)},object:t=>{let A=Object.keys(t).map(e=>[e,vs(t[e])]);return e=>{let i={};for(let[n,o]of A)i[n]=o(e);return i}},array:(...t)=>{let A=t.map(e=>vs(e));return e=>A.map(i=>i(e))},get:(...t)=>{if(t.length===0)return A=>A??null;if(t.length===1){let A=t[0];return e=>e?.[A]??null}return A=>{let e=A;for(let i of t)e=e?.[i];return e??null}},map:t=>{let A=vs(t);return e=>e.map(A)},mapObject:t=>{let A=vs(t);return e=>{let i={};for(let n of Object.keys(e)){let o=A({key:n,value:e[n]});i[o.key]=o.value}return i}},mapKeys:t=>{let A=vs(t);return e=>{let i={};for(let n of Object.keys(e)){let o=A(n);i[o]=e[n]}return i}},mapValues:t=>{let A=vs(t);return e=>{let i={};for(let n of Object.keys(e))i[n]=A(e[n]);return i}},filter:t=>{let A=vs(t);return e=>e.filter(i=>Zne(A(i)))},sort:(t=["get"],A)=>{let e=vs(t),i=A==="desc"?-1:1;function n(o,r){let s=e(o),a=e(r);if(typeof s!=typeof a){let c=e3[typeof s]??Wne,l=e3[typeof a]??Wne;return c>l?i:ca?i:so.slice().sort(n)},reverse:()=>t=>t.toReversed(),pick:(...t)=>{let A=t.map(([i,...n])=>[n[n.length-1],$m.get(...n)]),e=(i,n)=>{let o={};for(let[r,s]of n)o[r]=s(i);return o};return i=>uC(i)?i.map(n=>e(n,A)):e(i,A)},groupBy:t=>{let A=vs(t);return e=>{let i={};for(let n of e){let o=A(n);i[o]?i[o].push(n):i[o]=[n]}return i}},keyBy:t=>{let A=vs(t);return e=>{let i={};for(let n of e){let o=A(n);o in i||(i[o]=n)}return i}},flatten:()=>t=>t.flat(),join:(t="")=>A=>A.join(t),split:os((t,A)=>A!==void 0?t.split(A):t.trim().split(/\s+/)),substring:os((t,A,e)=>t.slice(Math.max(A,0),e)),uniq:()=>t=>{let A=[];for(let e of t)A.findIndex(i=>mu(i,e))===-1&&A.push(e);return A},uniqBy:t=>A=>Object.values($m.keyBy(t)(A)),limit:t=>A=>A.slice(0,Math.max(t,0)),size:()=>t=>t.length,keys:()=>Object.keys,values:()=>Object.values,prod:()=>t=>Xm(t,(A,e)=>A*e),sum:()=>t=>uC(t)?t.reduce((A,e)=>A+e,0):BG(),average:()=>t=>uC(t)?t.length>0?t.reduce((A,e)=>A+e)/t.length:null:BG(),min:()=>t=>Xm(t,(A,e)=>Math.min(A,e)),max:()=>t=>Xm(t,(A,e)=>Math.max(A,e)),and:os((...t)=>Xm(t,(A,e)=>!!(A&&e))),or:os((...t)=>Xm(t,(A,e)=>!!(A||e))),not:os(t=>!t),exists:t=>{let A=t.slice(1),e=A.pop(),i=$m.get(...A);return n=>{let o=i(n);return!!o&&Object.hasOwnProperty.call(o,e)}},if:(t,A,e)=>{let i=vs(t),n=vs(A),o=vs(e);return r=>Zne(i(r))?n(r):o(r)},in:(t,A)=>{let e=vs(t),i=vs(A);return n=>{let o=e(n);return i(n).findIndex(r=>mu(r,o))!==-1}},"not in":(t,A)=>{let e=$m.in(t,A);return i=>!e(i)},regex:(t,A,e)=>{let i=new RegExp(A,e),n=vs(t);return o=>i.test(n(o))},eq:os(mu),gt:os(Xne),gte:os(RFe),lt:os($ne),lte:os(NFe),ne:os((t,A)=>!mu(t,A)),add:os((t,A)=>t+A),subtract:os((t,A)=>t-A),multiply:os((t,A)=>t*A),divide:os((t,A)=>t/A),mod:os((t,A)=>t%A),pow:os((t,A)=>t**A),abs:os(Math.abs),round:os((t,A=0)=>+`${Math.round(+`${t}e${A}`)}e${-A}`),number:os(t=>{let A=Number(t);return Number.isNaN(Number(t))?null:A}),string:os(String)},Zne=t=>t!==null&&t!==0&&t!==!1,Xm=(t,A)=>(uC(t)||BG(),t.length===0?null:t.reduce(A)),BG=()=>{EG("Array expected")},EG=t=>{throw new TypeError(t)},Cv=[];function vs(t,A){Cv.unshift(ae(ae(ae({},$m),Cv[0]),A?.functions));try{let e=uC(t)?LFe(t,Cv[0]):xFe(t)?EG(`Function notation ["object", {...}] expected but got ${JSON.stringify(t)}`):()=>t;return i=>{try{return e(i)}catch(n){throw n.jsonquery=[{data:i,query:t},...n.jsonquery??[]],n}}}finally{Cv.shift()}}function LFe(t,A){let[e,...i]=t,n=A[e];return n||EG(`Unknown function '${e}'`),n(...i)}var eoe=[{pow:"^"},{multiply:"*",divide:"/",mod:"%"},{add:"+",subtract:"-"},{gt:">",gte:">=",lt:"<",lte:"<=",in:"in","not in":"not in"},{eq:"==",ne:"!="},{and:"and"},{or:"or"},{pipe:"|"}],FFe=["|","and","or"],Aoe=["|","and","or","*","/","%","+","-"];function toe(t,A){if(!uC(A))throw new Error("Invalid custom operators");return A.reduce(GFe,t)}function GFe(t,{name:A,op:e,at:i,after:n,before:o}){if(i)return t.map(a=>Object.values(a).includes(i)?_A(ae({},a),{[A]:e}):a);let r=n??o,s=t.findIndex(a=>Object.values(a).includes(r));if(s!==-1)return t.toSpliced(s+(n?1:0),0,{[A]:e});throw new Error("Invalid custom operator")}var KFe=/^[a-zA-Z_$][a-zA-Z\d_$]*$/,UFe=/^[a-zA-Z_$][a-zA-Z\d_$]*/,TFe=/^"(?:[^"\\]|\\.)*"/,OFe=/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/,JFe=/^(0|[1-9][0-9]*)/,YFe=/^(true|false|null)/,HFe=/^[ \n\t\r]+/;function fG(t,A){let e=A?.operators??[],i=toe(eoe,e),n=Object.assign({},...i),o=FFe.concat(e.filter(H=>H.vararg).map(H=>H.op)),r=Aoe.concat(e.filter(H=>H.leftAssociative).map(H=>H.op)),s=(H=i.length-1)=>{let V=i[H];if(!V)return c();let Z=t[J]==="(",ye=s(H-1);for(;;){w();let P=J,se=a(V);if(!se)break;let X=s(H-1),ue=ye[0],oe=se===ue&&!Z;if(oe&&!r.includes(n[se])){J=P;break}ye=oe&&o.includes(n[se])?[...ye,X]:[se,ye,X]}return ye},a=H=>{let V=Object.keys(H).sort((Z,ye)=>ye.length-Z.length);for(let Z of V){let ye=H[Z];if(t.substring(J,J+ye.length)===ye)return J+=ye.length,w(),Z}},c=()=>{if(w(),t[J]==="("){J++;let H=s();return _(")"),H}return l()},l=()=>{if(t[J]==="."){let H=[];for(;t[J]===".";)J++,H.push(u()??h()??f()??K("Property expected"));return["get",...H]}return d()},d=()=>{let H=J,V=h();if(w(),!V||t[J]!=="(")return J=H,C();J++,w();let Z=t[J]!==")"?[s()]:[];for(;J{if(t[J]==="{"){J++,w();let H={},V=!0;for(;J{if(t[J]==="["){J++,w();let H=[],V=!0;for(;JS(TFe,JSON.parse),h=()=>S(UFe,H=>H),B=()=>S(OFe,JSON.parse),f=()=>S(JFe,JSON.parse),b=()=>{let H=S(YFe,JSON.parse);if(H!==void 0)return H;K("Value expected")},k=()=>{w(),J{let Z=t.substring(J).match(H);if(Z)return J+=Z[0].length,V(Z[0])},w=()=>S(HFe,H=>H),_=H=>{t[J]!==H&&K(`Character '${H}' expected`),J++},K=(H,V=J)=>{throw new SyntaxError(`${H} (pos: ${V})`)},J=0,O=s();return k(),O}var zFe=40,PFe=" ",ioe=(t,A)=>{let e=A?.indentation??PFe,i=A?.operators??[],n=toe(eoe,i),o=Object.assign({},...n),r=Aoe.concat(i.filter(I=>I.leftAssociative).map(I=>I.op)),s=(I,u,h=!1)=>uC(I)?a(I,u,h):JSON.stringify(I),a=(I,u,h)=>{let[B,...f]=I;if(B==="get"&&f.length>0)return l(f);if(B==="object")return c(f[0],u);if(B==="array"){let w=f.map(_=>s(_,u));return C(w,["[",", ","]"],[`[ +${u+e}`,`, +${u+e}`,` +${u}]`])}let b=o[B];if(b){let w=h?"(":"",_=h?")":"",K=f.map((J,O)=>{let H=J?.[0],V=n.findIndex(P=>B in P),Z=n.findIndex(P=>H in P),ye=V0||B===H&&!r.includes(b);return s(J,u+e,ye)});return C(K,[w,` ${b} `,_],[w,` +${u+e}${b} `,_])}let k=f.length===1?u:u+e,S=f.map(w=>s(w,k));return C(S,[`${B}(`,", ",")"],f.length===1?[`${B}(`,`, +${u}`,")"]:[`${B}( +${k}`,`, +${k}`,` +${u})`])},c=(I,u)=>{let h=u+e,B=Object.entries(I).map(([f,b])=>`${d(f)}: ${s(b,h)}`);return C(B,["{ ",", "," }"],[`{ +${h}`,`, +${h}`,` +${u}}`])},l=I=>I.map(u=>`.${d(u)}`).join(""),d=I=>KFe.test(I)?I:JSON.stringify(I),C=(I,[u,h,B],[f,b,k])=>u.length+I.reduce((S,w)=>S+w.length+h.length,0)-h.length+B.length<=(A?.maxLineLength??zFe)?u+I.join(h)+B:f+I.join(b)+k;return s(t,"")};function noe(t,A,e){return vs(_Fe(A)?fG(A,e):A,e)(t)}var ooe={prefix:"far",iconName:"lightbulb",icon:[384,512,[128161],"f0eb","M297.2 248.9C311.6 228.3 320 203.2 320 176c0-70.7-57.3-128-128-128S64 105.3 64 176c0 27.2 8.4 52.3 22.8 72.9c3.7 5.3 8.1 11.3 12.8 17.7c0 0 0 0 0 0c12.9 17.7 28.3 38.9 39.8 59.8c10.4 19 15.7 38.8 18.3 57.5L109 384c-2.2-12-5.9-23.7-11.8-34.5c-9.9-18-22.2-34.9-34.5-51.8c0 0 0 0 0 0s0 0 0 0c-5.2-7.1-10.4-14.2-15.4-21.4C27.6 247.9 16 213.3 16 176C16 78.8 94.8 0 192 0s176 78.8 176 176c0 37.3-11.6 71.9-31.4 100.3c-5 7.2-10.2 14.3-15.4 21.4c0 0 0 0 0 0s0 0 0 0c-12.3 16.8-24.6 33.7-34.5 51.8c-5.9 10.8-9.6 22.5-11.8 34.5l-48.6 0c2.6-18.7 7.9-38.6 18.3-57.5c11.5-20.9 26.9-42.1 39.8-59.8c0 0 0 0 0 0s0 0 0 0s0 0 0 0c4.7-6.4 9-12.4 12.7-17.7zM192 128c-26.5 0-48 21.5-48 48c0 8.8-7.2 16-16 16s-16-7.2-16-16c0-44.2 35.8-80 80-80c8.8 0 16 7.2 16 16s-7.2 16-16 16zm0 384c-44.2 0-80-35.8-80-80l0-16 160 0 0 16c0 44.2-35.8 80-80 80z"]};var jFe={prefix:"far",iconName:"square-check",icon:[448,512,[9745,9989,61510,"check-square"],"f14a","M64 80c-8.8 0-16 7.2-16 16l0 320c0 8.8 7.2 16 16 16l320 0c8.8 0 16-7.2 16-16l0-320c0-8.8-7.2-16-16-16L64 80zM0 96C0 60.7 28.7 32 64 32l320 0c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96zM337 209L209 337c-9.4 9.4-24.6 9.4-33.9 0l-64-64c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l47 47L303 175c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9z"]},QG=jFe;var mG={prefix:"far",iconName:"square",icon:[448,512,[9632,9723,9724,61590],"f0c8","M384 80c8.8 0 16 7.2 16 16l0 320c0 8.8-7.2 16-16 16L64 432c-8.8 0-16-7.2-16-16L48 96c0-8.8 7.2-16 16-16l320 0zM64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32z"]};var roe={prefix:"far",iconName:"clock",icon:[512,512,[128339,"clock-four"],"f017","M464 256A208 208 0 1 1 48 256a208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z"]};var Iv={prefix:"fas",iconName:"trash-can",icon:[448,512,[61460,"trash-alt"],"f2ed","M135.2 17.7C140.6 6.8 151.7 0 163.8 0L284.2 0c12.1 0 23.2 6.8 28.6 17.7L320 32l96 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 96C14.3 96 0 81.7 0 64S14.3 32 32 32l96 0 7.2-14.3zM32 128l384 0 0 320c0 35.3-28.7 64-64 64L96 512c-35.3 0-64-28.7-64-64l0-320zm96 64c-8.8 0-16 7.2-16 16l0 224c0 8.8 7.2 16 16 16s16-7.2 16-16l0-224c0-8.8-7.2-16-16-16zm96 0c-8.8 0-16 7.2-16 16l0 224c0 8.8 7.2 16 16 16s16-7.2 16-16l0-224c0-8.8-7.2-16-16-16zm96 0c-8.8 0-16 7.2-16 16l0 224c0 8.8 7.2 16 16 16s16-7.2 16-16l0-224c0-8.8-7.2-16-16-16z"]};var soe={prefix:"fas",iconName:"down-left-and-up-right-to-center",icon:[512,512,["compress-alt"],"f422","M439 7c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2s-12.5 14.8-22.2 14.8l-144 0c-13.3 0-24-10.7-24-24l0-144c0-9.7 5.8-18.5 14.8-22.2s19.3-1.7 26.2 5.2l39 39L439 7zM72 272l144 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39L73 505c-9.4 9.4-24.6 9.4-33.9 0L7 473c-9.4-9.4-9.4-24.6 0-33.9l87-87L55 313c-6.9-6.9-8.9-17.2-5.2-26.2s12.5-14.8 22.2-14.8z"]};var TE={prefix:"fas",iconName:"caret-right",icon:[256,512,[],"f0da","M246.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-128-128c-9.2-9.2-22.9-11.9-34.9-6.9s-19.8 16.6-19.8 29.6l0 256c0 12.9 7.8 24.6 19.8 29.6s25.7 2.2 34.9-6.9l128-128z"]};var pG={prefix:"fas",iconName:"paste",icon:[512,512,["file-clipboard"],"f0ea","M160 0c-23.7 0-44.4 12.9-55.4 32L48 32C21.5 32 0 53.5 0 80L0 400c0 26.5 21.5 48 48 48l144 0 0-272c0-44.2 35.8-80 80-80l48 0 0-16c0-26.5-21.5-48-48-48l-56.6 0C204.4 12.9 183.7 0 160 0zM272 128c-26.5 0-48 21.5-48 48l0 272 0 16c0 26.5 21.5 48 48 48l192 0c26.5 0 48-21.5 48-48l0-220.1c0-12.7-5.1-24.9-14.1-33.9l-67.9-67.9c-9-9-21.2-14.1-33.9-14.1L320 128l-48 0zM160 40a24 24 0 1 1 0 48 24 24 0 1 1 0-48z"]};var aoe={prefix:"fas",iconName:"circle-notch",icon:[512,512,[],"f1ce","M222.7 32.1c5 16.9-4.6 34.8-21.5 39.8C121.8 95.6 64 169.1 64 256c0 106 86 192 192 192s192-86 192-192c0-86.9-57.8-160.4-137.1-184.1c-16.9-5-26.6-22.9-21.5-39.8s22.9-26.6 39.8-21.5C434.9 42.1 512 140 512 256c0 141.4-114.6 256-256 256S0 397.4 0 256C0 140 77.1 42.1 182.9 10.6c16.9-5 34.8 4.6 39.8 21.5z"]};var VFe={prefix:"fas",iconName:"scissors",icon:[512,512,[9984,9986,9988,"cut"],"f0c4","M256 192l-39.5-39.5c4.9-12.6 7.5-26.2 7.5-40.5C224 50.1 173.9 0 112 0S0 50.1 0 112s50.1 112 112 112c14.3 0 27.9-2.7 40.5-7.5L192 256l-39.5 39.5c-12.6-4.9-26.2-7.5-40.5-7.5C50.1 288 0 338.1 0 400s50.1 112 112 112s112-50.1 112-112c0-14.3-2.7-27.9-7.5-40.5L499.2 76.8c7.1-7.1 7.1-18.5 0-25.6c-28.3-28.3-74.1-28.3-102.4 0L256 192zm22.6 150.6L396.8 460.8c28.3 28.3 74.1 28.3 102.4 0c7.1-7.1 7.1-18.5 0-25.6L342.6 278.6l-64 64zM64 112a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zm48 240a48 48 0 1 1 0 96 48 48 0 1 1 0-96z"]},pu=VFe;var qFe={prefix:"fas",iconName:"square-caret-down",icon:[448,512,["caret-square-down"],"f150","M384 480c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0zM224 352c-6.7 0-13-2.8-17.6-7.7l-104-112c-6.5-7-8.2-17.2-4.4-25.9s12.5-14.4 22-14.4l208 0c9.5 0 18.2 5.7 22 14.4s2.1 18.9-4.4 25.9l-104 112c-4.5 4.9-10.9 7.7-17.6 7.7z"]},coe=qFe;var loe={prefix:"fas",iconName:"caret-left",icon:[256,512,[],"f0d9","M9.4 278.6c-12.5-12.5-12.5-32.8 0-45.3l128-128c9.2-9.2 22.9-11.9 34.9-6.9s19.8 16.6 19.8 29.6l0 256c0 12.9-7.8 24.6-19.8 29.6s-25.7 2.2-34.9-6.9l-128-128z"]};var WFe={prefix:"fas",iconName:"square-check",icon:[448,512,[9745,9989,61510,"check-square"],"f14a","M64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32zM337 209L209 337c-9.4 9.4-24.6 9.4-33.9 0l-64-64c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l47 47L303 175c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9z"]},wG=WFe;var ZFe={prefix:"fas",iconName:"pen-to-square",icon:[512,512,["edit"],"f044","M471.6 21.7c-21.9-21.9-57.3-21.9-79.2 0L362.3 51.7l97.9 97.9 30.1-30.1c21.9-21.9 21.9-57.3 0-79.2L471.6 21.7zm-299.2 220c-6.1 6.1-10.8 13.6-13.5 21.9l-29.6 88.8c-2.9 8.6-.6 18.1 5.8 24.6s15.9 8.7 24.6 5.8l88.8-29.6c8.2-2.7 15.7-7.4 21.9-13.5L437.7 172.3 339.7 74.3 172.4 241.7zM96 64C43 64 0 107 0 160L0 416c0 53 43 96 96 96l256 0c53 0 96-43 96-96l0-96c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 96c0 17.7-14.3 32-32 32L96 448c-17.7 0-32-14.3-32-32l0-256c0-17.7 14.3-32 32-32l96 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L96 64z"]},goe=ZFe;var doe={prefix:"fas",iconName:"chevron-up",icon:[512,512,[],"f077","M233.4 105.4c12.5-12.5 32.8-12.5 45.3 0l192 192c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L256 173.3 86.6 342.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l192-192z"]};var yG={prefix:"fas",iconName:"angle-right",icon:[320,512,[8250],"f105","M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"]};var XFe={prefix:"fas",iconName:"square-caret-up",icon:[448,512,["caret-square-up"],"f151","M64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32zM224 160c6.7 0 13 2.8 17.6 7.7l104 112c6.5 7 8.2 17.2 4.4 25.9s-12.5 14.4-22 14.4l-208 0c-9.5 0-18.2-5.7-22-14.4s-2.1-18.9 4.4-25.9l104-112c4.5-4.9 10.9-7.7 17.6-7.7z"]},Coe=XFe;var DG={prefix:"fas",iconName:"caret-up",icon:[320,512,[],"f0d8","M182.6 137.4c-12.5-12.5-32.8-12.5-45.3 0l-128 128c-9.2 9.2-11.9 22.9-6.9 34.9s16.6 19.8 29.6 19.8l256 0c12.9 0 24.6-7.8 29.6-19.8s2.2-25.7-6.9-34.9l-128-128z"]};var vG={prefix:"fas",iconName:"square",icon:[448,512,[9632,9723,9724,61590],"f0c8","M0 96C0 60.7 28.7 32 64 32H384c35.3 0 64 28.7 64 64V416c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V96z"]};var A3={prefix:"fas",iconName:"filter",icon:[512,512,[],"f0b0","M3.9 54.9C10.5 40.9 24.5 32 40 32l432 0c15.5 0 29.5 8.9 36.1 22.9s4.6 30.5-5.2 42.5L320 320.9 320 448c0 12.1-6.8 23.2-17.7 28.6s-23.8 4.3-33.5-3l-64-48c-8.1-6-12.8-15.5-12.8-25.6l0-79.1L9 97.3C-.7 85.4-2.8 68.8 3.9 54.9z"]};var t3={prefix:"fas",iconName:"code",icon:[640,512,[],"f121","M392.8 1.2c-17-4.9-34.7 5-39.6 22l-128 448c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l128-448c4.9-17-5-34.7-22-39.6zm80.6 120.1c-12.5 12.5-12.5 32.8 0 45.3L562.7 256l-89.4 89.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l112-112c12.5-12.5 12.5-32.8 0-45.3l-112-112c-12.5-12.5-32.8-12.5-45.3 0zm-306.7 0c-12.5-12.5-32.8-12.5-45.3 0l-112 112c-12.5 12.5-12.5 32.8 0 45.3l112 112c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256l89.4-89.4c12.5-12.5 12.5-32.8 0-45.3z"]};var b2={prefix:"fas",iconName:"wrench",icon:[512,512,[128295],"f0ad","M352 320c88.4 0 160-71.6 160-160c0-15.3-2.2-30.1-6.2-44.2c-3.1-10.8-16.4-13.2-24.3-5.3l-76.8 76.8c-3 3-7.1 4.7-11.3 4.7L336 192c-8.8 0-16-7.2-16-16l0-57.4c0-4.2 1.7-8.3 4.7-11.3l76.8-76.8c7.9-7.9 5.4-21.2-5.3-24.3C382.1 2.2 367.3 0 352 0C263.6 0 192 71.6 192 160c0 19.1 3.4 37.5 9.5 54.5L19.9 396.1C7.2 408.8 0 426.1 0 444.1C0 481.6 30.4 512 67.9 512c18 0 35.3-7.2 48-19.9L297.5 310.5c17 6.2 35.4 9.5 54.5 9.5zM80 408a24 24 0 1 1 0 48 24 24 0 1 1 0-48z"]};var Ioe={prefix:"fas",iconName:"eye",icon:[576,512,[128065],"f06e","M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM144 256a144 144 0 1 1 288 0 144 144 0 1 1 -288 0zm144-64c0 35.3-28.7 64-64 64c-7.1 0-13.9-1.2-20.3-3.3c-5.5-1.8-11.9 1.6-11.7 7.4c.3 6.9 1.3 13.8 3.2 20.7c13.7 51.2 66.4 81.6 117.6 67.9s81.6-66.4 67.9-117.6c-11.1-41.5-47.8-69.4-88.6-71.1c-5.8-.2-9.2 6.1-7.4 11.7c2.1 6.4 3.3 13.2 3.3 20.3z"]};var wu={prefix:"fas",iconName:"pen",icon:[512,512,[128394],"f304","M362.7 19.3L314.3 67.7 444.3 197.7l48.4-48.4c25-25 25-65.5 0-90.5L453.3 19.3c-25-25-65.5-25-90.5 0zm-71 71L58.6 323.5c-10.4 10.4-18 23.3-22.2 37.4L1 481.2C-1.5 489.7 .8 498.8 7 505s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L421.7 220.3 291.7 90.3z"]};var $Fe={prefix:"fas",iconName:"arrow-rotate-right",icon:[512,512,[8635,"arrow-right-rotate","arrow-rotate-forward","redo"],"f01e","M386.3 160L336 160c-17.7 0-32 14.3-32 32s14.3 32 32 32l128 0c17.7 0 32-14.3 32-32l0-128c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 51.2L414.4 97.6c-87.5-87.5-229.3-87.5-316.8 0s-87.5 229.3 0 316.8s229.3 87.5 316.8 0c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0c-62.5 62.5-163.8 62.5-226.3 0s-62.5-163.8 0-226.3s163.8-62.5 226.3 0L386.3 160z"]};var uv=$Fe;var eGe={prefix:"fas",iconName:"arrow-rotate-left",icon:[512,512,[8634,"arrow-left-rotate","arrow-rotate-back","arrow-rotate-backward","undo"],"f0e2","M125.7 160l50.3 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L48 224c-17.7 0-32-14.3-32-32L16 64c0-17.7 14.3-32 32-32s32 14.3 32 32l0 51.2L97.6 97.6c87.5-87.5 229.3-87.5 316.8 0s87.5 229.3 0 316.8s-229.3 87.5-316.8 0c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0c62.5 62.5 163.8 62.5 226.3 0s62.5-163.8 0-226.3s-163.8-62.5-226.3 0L125.7 160z"]};var hv=eGe;var AGe={prefix:"fas",iconName:"crop-simple",icon:[512,512,["crop-alt"],"f565","M128 32c0-17.7-14.3-32-32-32S64 14.3 64 32l0 32L32 64C14.3 64 0 78.3 0 96s14.3 32 32 32l32 0 0 256c0 35.3 28.7 64 64 64l224 0 0-64-224 0 0-352zM384 480c0 17.7 14.3 32 32 32s32-14.3 32-32l0-32 32 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-32 0 0-256c0-35.3-28.7-64-64-64L160 64l0 64 224 0 0 352z"]},uoe=AGe;var tGe={prefix:"fas",iconName:"gear",icon:[512,512,[9881,"cog"],"f013","M495.9 166.6c3.2 8.7 .5 18.4-6.4 24.6l-43.3 39.4c1.1 8.3 1.7 16.8 1.7 25.4s-.6 17.1-1.7 25.4l43.3 39.4c6.9 6.2 9.6 15.9 6.4 24.6c-4.4 11.9-9.7 23.3-15.8 34.3l-4.7 8.1c-6.6 11-14 21.4-22.1 31.2c-5.9 7.2-15.7 9.6-24.5 6.8l-55.7-17.7c-13.4 10.3-28.2 18.9-44 25.4l-12.5 57.1c-2 9.1-9 16.3-18.2 17.8c-13.8 2.3-28 3.5-42.5 3.5s-28.7-1.2-42.5-3.5c-9.2-1.5-16.2-8.7-18.2-17.8l-12.5-57.1c-15.8-6.5-30.6-15.1-44-25.4L83.1 425.9c-8.8 2.8-18.6 .3-24.5-6.8c-8.1-9.8-15.5-20.2-22.1-31.2l-4.7-8.1c-6.1-11-11.4-22.4-15.8-34.3c-3.2-8.7-.5-18.4 6.4-24.6l43.3-39.4C64.6 273.1 64 264.6 64 256s.6-17.1 1.7-25.4L22.4 191.2c-6.9-6.2-9.6-15.9-6.4-24.6c4.4-11.9 9.7-23.3 15.8-34.3l4.7-8.1c6.6-11 14-21.4 22.1-31.2c5.9-7.2 15.7-9.6 24.5-6.8l55.7 17.7c13.4-10.3 28.2-18.9 44-25.4l12.5-57.1c2-9.1 9-16.3 18.2-17.8C227.3 1.2 241.5 0 256 0s28.7 1.2 42.5 3.5c9.2 1.5 16.2 8.7 18.2 17.8l12.5 57.1c15.8 6.5 30.6 15.1 44 25.4l55.7-17.7c8.8-2.8 18.6-.3 24.5 6.8c8.1 9.8 15.5 20.2 22.1 31.2l4.7 8.1c6.1 11 11.4 22.4 15.8 34.3zM256 336a80 80 0 1 0 0-160 80 80 0 1 0 0 160z"]},hoe=tGe;var ld={prefix:"fas",iconName:"caret-down",icon:[320,512,[],"f0d7","M137.4 374.6c12.5 12.5 32.8 12.5 45.3 0l128-128c9.2-9.2 11.9-22.9 6.9-34.9s-16.6-19.8-29.6-19.8L32 192c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9l128 128z"]};var iGe={prefix:"fas",iconName:"ellipsis-vertical",icon:[128,512,["ellipsis-v"],"f142","M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z"]},bG=iGe;var i3={prefix:"fas",iconName:"arrow-right-arrow-left",icon:[448,512,[8644,"exchange"],"f0ec","M438.6 150.6c12.5-12.5 12.5-32.8 0-45.3l-96-96c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.7 96 32 96C14.3 96 0 110.3 0 128s14.3 32 32 32l306.7 0-41.4 41.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l96-96zm-333.3 352c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 416 416 416c17.7 0 32-14.3 32-32s-14.3-32-32-32l-306.7 0 41.4-41.4c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3l96 96z"]};var nGe={prefix:"fas",iconName:"arrow-down-short-wide",icon:[576,512,["sort-amount-desc","sort-amount-down-alt"],"f884","M151.6 469.6C145.5 476.2 137 480 128 480s-17.5-3.8-23.6-10.4l-88-96c-11.9-13-11.1-33.3 2-45.2s33.3-11.1 45.2 2L96 365.7 96 64c0-17.7 14.3-32 32-32s32 14.3 32 32l0 301.7 32.4-35.4c11.9-13 32.2-13.9 45.2-2s13.9 32.2 2 45.2l-88 96zM320 32l32 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l96 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-96 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-160 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l224 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-224 0c-17.7 0-32-14.3-32-32s14.3-32 32-32z"]};var n3=nGe;var Boe={prefix:"fas",iconName:"angle-down",icon:[448,512,[8964],"f107","M201.4 374.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 306.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"]};var MG={prefix:"fas",iconName:"arrow-down",icon:[384,512,[8595],"f063","M169.4 470.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 370.8 224 64c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 306.7L54.6 265.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"]};var oGe={prefix:"fas",iconName:"magnifying-glass",icon:[512,512,[128269,"search"],"f002","M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z"]},o3=oGe;var Eoe={prefix:"fas",iconName:"chevron-down",icon:[512,512,[],"f078","M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z"]};var M2={prefix:"fas",iconName:"copy",icon:[448,512,[],"f0c5","M208 0L332.1 0c12.7 0 24.9 5.1 33.9 14.1l67.9 67.9c9 9 14.1 21.2 14.1 33.9L448 336c0 26.5-21.5 48-48 48l-192 0c-26.5 0-48-21.5-48-48l0-288c0-26.5 21.5-48 48-48zM48 128l80 0 0 64-64 0 0 256 192 0 0-32 64 0 0 48c0 26.5-21.5 48-48 48L48 512c-26.5 0-48-21.5-48-48L0 176c0-26.5 21.5-48 48-48z"]};var yu={prefix:"fas",iconName:"plus",icon:[448,512,[10133,61543,"add"],"2b","M256 80c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 144L48 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l144 0 0 144c0 17.7 14.3 32 32 32s32-14.3 32-32l0-144 144 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-144 0 0-144z"]};var foe={prefix:"fas",iconName:"xmark",icon:[384,512,[128473,10005,10006,10060,215,"close","multiply","remove","times"],"f00d","M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3 297.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256 342.6 150.6z"]},Qoe=foe;var r3=foe;var moe={prefix:"fas",iconName:"rotate",icon:[512,512,[128260,"sync-alt"],"f2f1","M142.9 142.9c-17.5 17.5-30.1 38-37.8 59.8c-5.9 16.7-24.2 25.4-40.8 19.5s-25.4-24.2-19.5-40.8C55.6 150.7 73.2 122 97.6 97.6c87.2-87.2 228.3-87.5 315.8-1L455 55c6.9-6.9 17.2-8.9 26.2-5.2s14.8 12.5 14.8 22.2l0 128c0 13.3-10.7 24-24 24l-8.4 0c0 0 0 0 0 0L344 224c-9.7 0-18.5-5.8-22.2-14.8s-1.7-19.3 5.2-26.2l41.1-41.1c-62.6-61.5-163.1-61.2-225.3 1zM16 312c0-13.3 10.7-24 24-24l7.6 0 .7 0L168 288c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-41.1 41.1c62.6 61.5 163.1 61.2 225.3-1c17.5-17.5 30.1-38 37.8-59.8c5.9-16.7 24.2-25.4 40.8-19.5s25.4 24.2 19.5 40.8c-10.8 30.6-28.4 59.3-52.9 83.8c-87.2 87.2-228.3 87.5-315.8 1L57 457c-6.9 6.9-17.2 8.9-26.2 5.2S16 449.7 16 440l0-119.6 0-.7 0-7.6z"]};var poe={prefix:"fas",iconName:"up-right-and-down-left-from-center",icon:[512,512,["expand-alt"],"f424","M344 0L488 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39-87 87c-9.4 9.4-24.6 9.4-33.9 0l-32-32c-9.4-9.4-9.4-24.6 0-33.9l87-87L327 41c-6.9-6.9-8.9-17.2-5.2-26.2S334.3 0 344 0zM168 512L24 512c-13.3 0-24-10.7-24-24L0 344c0-9.7 5.8-18.5 14.8-22.2s19.3-1.7 26.2 5.2l39 39 87-87c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2s-12.5 14.8-22.2 14.8z"]};var SG={prefix:"fas",iconName:"clone",icon:[512,512,[],"f24d","M288 448L64 448l0-224 64 0 0-64-64 0c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l224 0c35.3 0 64-28.7 64-64l0-64-64 0 0 64zm-64-96l224 0c35.3 0 64-28.7 64-64l0-224c0-35.3-28.7-64-64-64L224 0c-35.3 0-64 28.7-64 64l0 224c0 35.3 28.7 64 64 64z"]};var Bv={prefix:"fas",iconName:"check",icon:[448,512,[10003,10004],"f00c","M438.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L160 338.7 393.4 105.4c12.5-12.5 32.8-12.5 45.3 0z"]};var rGe={prefix:"fas",iconName:"triangle-exclamation",icon:[512,512,[9888,"exclamation-triangle","warning"],"f071","M256 32c14.2 0 27.3 7.5 34.5 19.8l216 368c7.3 12.4 7.3 27.7 .2 40.1S486.3 480 472 480L40 480c-14.3 0-27.6-7.7-34.7-20.1s-7-27.8 .2-40.1l216-368C228.7 39.5 241.8 32 256 32zm0 128c-13.3 0-24 10.7-24 24l0 112c0 13.3 10.7 24 24 24s24-10.7 24-24l0-112c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z"]},hC=rGe;var d2e=JQ(Doe(),1);var voe=Number.isNaN||function(A){return typeof A=="number"&&A!==A};function sGe(t,A){return!!(t===A||voe(t)&&voe(A))}function aGe(t,A){if(t.length!==A.length)return!1;for(var e=0;e{if(typeof n!="object"||!n.name||!n.init)throw new Error("Invalid JSEP plugin format");this.registered[n.name]||(n.init(this.jsep),this.registered[n.name]=n)})}},Lc=class t{static get version(){return"1.4.0"}static toString(){return"JavaScript Expression Parser (JSEP) v"+t.version}static addUnaryOp(A){return t.max_unop_len=Math.max(A.length,t.max_unop_len),t.unary_ops[A]=1,t}static addBinaryOp(A,e,i){return t.max_binop_len=Math.max(A.length,t.max_binop_len),t.binary_ops[A]=e,i?t.right_associative.add(A):t.right_associative.delete(A),t}static addIdentifierChar(A){return t.additional_identifier_chars.add(A),t}static addLiteral(A,e){return t.literals[A]=e,t}static removeUnaryOp(A){return delete t.unary_ops[A],A.length===t.max_unop_len&&(t.max_unop_len=t.getMaxKeyLen(t.unary_ops)),t}static removeAllUnaryOps(){return t.unary_ops={},t.max_unop_len=0,t}static removeIdentifierChar(A){return t.additional_identifier_chars.delete(A),t}static removeBinaryOp(A){return delete t.binary_ops[A],A.length===t.max_binop_len&&(t.max_binop_len=t.getMaxKeyLen(t.binary_ops)),t.right_associative.delete(A),t}static removeAllBinaryOps(){return t.binary_ops={},t.max_binop_len=0,t}static removeLiteral(A){return delete t.literals[A],t}static removeAllLiterals(){return t.literals={},t}get char(){return this.expr.charAt(this.index)}get code(){return this.expr.charCodeAt(this.index)}constructor(A){this.expr=A,this.index=0}static parse(A){return new t(A).parse()}static getMaxKeyLen(A){return Math.max(0,...Object.keys(A).map(e=>e.length))}static isDecimalDigit(A){return A>=48&&A<=57}static binaryPrecedence(A){return t.binary_ops[A]||0}static isIdentifierStart(A){return A>=65&&A<=90||A>=97&&A<=122||A>=128&&!t.binary_ops[String.fromCharCode(A)]||t.additional_identifier_chars.has(String.fromCharCode(A))}static isIdentifierPart(A){return t.isIdentifierStart(A)||t.isDecimalDigit(A)}throwError(A){let e=new Error(A+" at character "+this.index);throw e.index=this.index,e.description=A,e}runHook(A,e){if(t.hooks[A]){let i={context:this,node:e};return t.hooks.run(A,i),i.node}return e}searchHook(A){if(t.hooks[A]){let e={context:this};return t.hooks[A].find(function(i){return i.call(e.context,e),e.node}),e.node}}gobbleSpaces(){let A=this.code;for(;A===t.SPACE_CODE||A===t.TAB_CODE||A===t.LF_CODE||A===t.CR_CODE;)A=this.expr.charCodeAt(++this.index);this.runHook("gobble-spaces")}parse(){this.runHook("before-all");let A=this.gobbleExpressions(),e=A.length===1?A[0]:{type:t.COMPOUND,body:A};return this.runHook("after-all",e)}gobbleExpressions(A){let e=[],i,n;for(;this.index0;){if(t.binary_ops.hasOwnProperty(A)&&(!t.isIdentifierStart(this.code)||this.index+A.lengtho.right_a&&d.right_a?i>d.prec:i<=d.prec;for(;n.length>2&&l(n[n.length-2]);)s=n.pop(),e=n.pop().value,r=n.pop(),A={type:t.BINARY_EXP,operator:e,left:r,right:s},n.push(A);A=this.gobbleToken(),A||this.throwError("Expected expression after "+c),n.push(o,A)}for(a=n.length-1,A=n[a];a>1;)A={type:t.BINARY_EXP,operator:n[a-1].value,left:n[a-2],right:A},a-=2;return A}gobbleToken(){let A,e,i,n;if(this.gobbleSpaces(),n=this.searchHook("gobble-token"),n)return this.runHook("after-token",n);if(A=this.code,t.isDecimalDigit(A)||A===t.PERIOD_CODE)return this.gobbleNumericLiteral();if(A===t.SQUOTE_CODE||A===t.DQUOTE_CODE)n=this.gobbleStringLiteral();else if(A===t.OBRACK_CODE)n=this.gobbleArray();else{for(e=this.expr.substr(this.index,t.max_unop_len),i=e.length;i>0;){if(t.unary_ops.hasOwnProperty(e)&&(!t.isIdentifierStart(this.code)||this.index+e.length=e.length&&this.throwError("Unexpected token "+String.fromCharCode(A));break}else if(o===t.COMMA_CODE){if(this.index++,n++,n!==e.length){if(A===t.CPAREN_CODE)this.throwError("Unexpected token ,");else if(A===t.CBRACK_CODE)for(let r=e.length;r":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10,"**":11},right_associative:new Set(["**"]),additional_identifier_chars:new Set(["$","_"]),literals:{true:!0,false:!1,null:null},this_str:"this"});Lc.max_unop_len=Lc.getMaxKeyLen(Lc.unary_ops);Lc.max_binop_len=Lc.getMaxKeyLen(Lc.binary_ops);var N2=t=>new Lc(t).parse(),LJe=Object.getOwnPropertyNames(class{});Object.getOwnPropertyNames(Lc).filter(t=>!LJe.includes(t)&&N2[t]===void 0).forEach(t=>{N2[t]=Lc[t]});N2.Jsep=Lc;var FJe="ConditionalExpression",GJe={name:"ternary",init(t){t.hooks.add("after-expression",function(e){if(e.node&&this.code===t.QUMARK_CODE){this.index++;let i=e.node,n=this.gobbleExpression();if(n||this.throwError("Expected expression"),this.gobbleSpaces(),this.code===t.COLON_CODE){this.index++;let o=this.gobbleExpression();if(o||this.throwError("Expected expression"),e.node={type:FJe,test:i,consequent:n,alternate:o},i.operator&&t.binary_ops[i.operator]<=.9){let r=i;for(;r.right.operator&&t.binary_ops[r.right.operator]<=.9;)r=r.right;e.node.test=r.right,r.right=e.node,e.node=i}}else this.throwError("Expected :")}})}};N2.plugins.register(GJe);var oae=47,KJe=92,UJe={name:"regex",init(t){t.hooks.add("gobble-token",function(e){if(this.code===oae){let i=++this.index,n=!1;for(;this.index=97&&a<=122||a>=65&&a<=90||a>=48&&a<=57)r+=this.char;else break}let s;try{s=new RegExp(o,r)}catch(a){this.throwError(a.message)}return e.node={type:t.LITERAL,value:s,raw:this.expr.slice(i-1,this.index)},e.node=this.gobbleTokenProperty(e.node),e.node}this.code===t.OBRACK_CODE?n=!0:n&&this.code===t.CBRACK_CODE&&(n=!1),this.index+=this.code===KJe?2:1}this.throwError("Unclosed Regex")}})}},uU=43,TJe=45,Af={name:"assignment",assignmentOperators:new Set(["=","*=","**=","/=","%=","+=","-=","<<=",">>=",">>>=","&=","^=","|=","||=","&&=","??="]),updateOperators:[uU,TJe],assignmentPrecedence:.9,init(t){let A=[t.IDENTIFIER,t.MEMBER_EXP];Af.assignmentOperators.forEach(i=>t.addBinaryOp(i,Af.assignmentPrecedence,!0)),t.hooks.add("gobble-token",function(n){let o=this.code;Af.updateOperators.some(r=>r===o&&r===this.expr.charCodeAt(this.index+1))&&(this.index+=2,n.node={type:"UpdateExpression",operator:o===uU?"++":"--",argument:this.gobbleTokenProperty(this.gobbleIdentifier()),prefix:!0},(!n.node.argument||!A.includes(n.node.argument.type))&&this.throwError(`Unexpected ${n.node.operator}`))}),t.hooks.add("after-token",function(n){if(n.node){let o=this.code;Af.updateOperators.some(r=>r===o&&r===this.expr.charCodeAt(this.index+1))&&(A.includes(n.node.type)||this.throwError(`Unexpected ${n.node.operator}`),this.index+=2,n.node={type:"UpdateExpression",operator:o===uU?"++":"--",argument:n.node,prefix:!1})}}),t.hooks.add("after-expression",function(n){n.node&&e(n.node)});function e(i){Af.assignmentOperators.has(i.operator)?(i.type="AssignmentExpression",e(i.left),e(i.right)):i.operator||Object.values(i).forEach(n=>{n&&typeof n=="object"&&e(n)})}}};N2.plugins.register(UJe,Af);N2.addUnaryOp("typeof");N2.addLiteral("null",null);N2.addLiteral("undefined",void 0);var OJe=new Set(["constructor","__proto__","__defineGetter__","__defineSetter__"]),Ko={evalAst(t,A){switch(t.type){case"BinaryExpression":case"LogicalExpression":return Ko.evalBinaryExpression(t,A);case"Compound":return Ko.evalCompound(t,A);case"ConditionalExpression":return Ko.evalConditionalExpression(t,A);case"Identifier":return Ko.evalIdentifier(t,A);case"Literal":return Ko.evalLiteral(t,A);case"MemberExpression":return Ko.evalMemberExpression(t,A);case"UnaryExpression":return Ko.evalUnaryExpression(t,A);case"ArrayExpression":return Ko.evalArrayExpression(t,A);case"CallExpression":return Ko.evalCallExpression(t,A);case"AssignmentExpression":return Ko.evalAssignmentExpression(t,A);default:throw SyntaxError("Unexpected expression",t)}},evalBinaryExpression(t,A){return{"||":(i,n)=>i||n(),"&&":(i,n)=>i&&n(),"|":(i,n)=>i|n(),"^":(i,n)=>i^n(),"&":(i,n)=>i&n(),"==":(i,n)=>i==n(),"!=":(i,n)=>i!=n(),"===":(i,n)=>i===n(),"!==":(i,n)=>i!==n(),"<":(i,n)=>i":(i,n)=>i>n(),"<=":(i,n)=>i<=n(),">=":(i,n)=>i>=n(),"<<":(i,n)=>i<>":(i,n)=>i>>n(),">>>":(i,n)=>i>>>n(),"+":(i,n)=>i+n(),"-":(i,n)=>i-n(),"*":(i,n)=>i*n(),"/":(i,n)=>i/n(),"%":(i,n)=>i%n()}[t.operator](Ko.evalAst(t.left,A),()=>Ko.evalAst(t.right,A))},evalCompound(t,A){let e;for(let i=0;i-Ko.evalAst(i,A),"!":i=>!Ko.evalAst(i,A),"~":i=>~Ko.evalAst(i,A),"+":i=>+Ko.evalAst(i,A),typeof:i=>typeof Ko.evalAst(i,A)}[t.operator](t.argument)},evalArrayExpression(t,A){return t.elements.map(e=>Ko.evalAst(e,A))},evalCallExpression(t,A){let e=t.arguments.map(n=>Ko.evalAst(n,A));return Ko.evalAst(t.callee,A)(...e)},evalAssignmentExpression(t,A){if(t.left.type!=="Identifier")throw SyntaxError("Invalid left-hand side in assignment");let e=t.left.name,i=Ko.evalAst(t.right,A);return A[e]=i,A[e]}},EU=class{constructor(A){this.code=A,this.ast=N2(this.code)}runInNewContext(A){let e=Object.assign(Object.create(null),A);return Ko.evalAst(this.ast,e)}};function yC(t,A){return t=t.slice(),t.push(A),t}function fU(t,A){return A=A.slice(),A.unshift(t),A}var QU=class extends Error{constructor(A){super('JSONPath should not be called with "new" (it prevents return of (unwrapped) scalar values)'),this.avoidNew=!0,this.value=A,this.name="NewError"}};function oo(t,A,e,i,n){if(!(this instanceof oo))try{return new oo(t,A,e,i,n)}catch(r){if(!r.avoidNew)throw r;return r.value}typeof t=="string"&&(n=i,i=e,e=A,A=t,t=null);let o=t&&typeof t=="object";if(t=t||{},this.json=t.json||e,this.path=t.path||A,this.resultType=t.resultType||"value",this.flatten=t.flatten||!1,this.wrap=Object.hasOwn(t,"wrap")?t.wrap:!0,this.sandbox=t.sandbox||{},this.eval=t.eval===void 0?"safe":t.eval,this.ignoreEvalErrors=typeof t.ignoreEvalErrors>"u"?!1:t.ignoreEvalErrors,this.parent=t.parent||null,this.parentProperty=t.parentProperty||null,this.callback=t.callback||i||null,this.otherTypeCallback=t.otherTypeCallback||n||function(){throw new TypeError("You must supply an otherTypeCallback callback option with the @other() operator.")},t.autostart!==!1){let r={path:o?t.path:A};o?"json"in t&&(r.json=t.json):r.json=e;let s=this.evaluate(r);if(!s||typeof s!="object")throw new QU(s);return s}}oo.prototype.evaluate=function(t,A,e,i){let n=this.parent,o=this.parentProperty,{flatten:r,wrap:s}=this;if(this.currResultType=this.resultType,this.currEval=this.eval,this.currSandbox=this.sandbox,e=e||this.callback,this.currOtherTypeCallback=i||this.otherTypeCallback,A=A||this.json,t=t||this.path,t&&typeof t=="object"&&!Array.isArray(t)){if(!t.path&&t.path!=="")throw new TypeError('You must supply a "path" property when providing an object argument to JSONPath.evaluate().');if(!Object.hasOwn(t,"json"))throw new TypeError('You must supply a "json" property when providing an object argument to JSONPath.evaluate().');({json:A}=t),r=Object.hasOwn(t,"flatten")?t.flatten:r,this.currResultType=Object.hasOwn(t,"resultType")?t.resultType:this.currResultType,this.currSandbox=Object.hasOwn(t,"sandbox")?t.sandbox:this.currSandbox,s=Object.hasOwn(t,"wrap")?t.wrap:s,this.currEval=Object.hasOwn(t,"eval")?t.eval:this.currEval,e=Object.hasOwn(t,"callback")?t.callback:e,this.currOtherTypeCallback=Object.hasOwn(t,"otherTypeCallback")?t.otherTypeCallback:this.currOtherTypeCallback,n=Object.hasOwn(t,"parent")?t.parent:n,o=Object.hasOwn(t,"parentProperty")?t.parentProperty:o,t=t.path}if(n=n||null,o=o||null,Array.isArray(t)&&(t=oo.toPathString(t)),!t&&t!==""||!A)return;let a=oo.toPathArray(t);a[0]==="$"&&a.length>1&&a.shift(),this._hasParentSelector=null;let c=this._trace(a,A,["$"],n,o,e).filter(function(l){return l&&!l.isParentSelector});return c.length?!s&&c.length===1&&!c[0].hasArrExpr?this._getPreferredOutput(c[0]):c.reduce((l,d)=>{let C=this._getPreferredOutput(d);return r&&Array.isArray(C)?l=l.concat(C):l.push(C),l},[]):s?[]:void 0};oo.prototype._getPreferredOutput=function(t){let A=this.currResultType;switch(A){case"all":{let e=Array.isArray(t.path)?t.path:oo.toPathArray(t.path);return t.pointer=oo.toPointer(e),t.path=typeof t.path=="string"?t.path:oo.toPathString(t.path),t}case"value":case"parent":case"parentProperty":return t[A];case"path":return oo.toPathString(t[A]);case"pointer":return oo.toPointer(t.path);default:throw new TypeError("Unknown result type")}};oo.prototype._handleCallback=function(t,A,e){if(A){let i=this._getPreferredOutput(t);t.path=typeof t.path=="string"?t.path:oo.toPathString(t.path),A(i,e,t)}};oo.prototype._trace=function(t,A,e,i,n,o,r,s){let a;if(!t.length)return a={path:e,value:A,parent:i,parentProperty:n,hasArrExpr:r},this._handleCallback(a,o,"value"),a;let c=t[0],l=t.slice(1),d=[];function C(I){Array.isArray(I)?I.forEach(u=>{d.push(u)}):d.push(I)}if((typeof c!="string"||s)&&A&&Object.hasOwn(A,c))C(this._trace(l,A[c],yC(e,c),A,c,o,r));else if(c==="*")this._walk(A,I=>{C(this._trace(l,A[I],yC(e,I),A,I,o,!0,!0))});else if(c==="..")C(this._trace(l,A,e,i,n,o,r)),this._walk(A,I=>{typeof A[I]=="object"&&C(this._trace(t.slice(),A[I],yC(e,I),A,I,o,!0))});else{if(c==="^")return this._hasParentSelector=!0,{path:e.slice(0,-1),expr:l,isParentSelector:!0};if(c==="~")return a={path:yC(e,c),value:n,parent:i,parentProperty:null},this._handleCallback(a,o,"property"),a;if(c==="$")C(this._trace(l,A,e,null,null,o,r));else if(/^(-?\d*):(-?\d*):?(\d*)$/u.test(c))C(this._slice(c,l,A,e,i,n,o));else if(c.indexOf("?(")===0){if(this.currEval===!1)throw new Error("Eval [?(expr)] prevented in JSONPath expression.");let I=c.replace(/^\?\((.*?)\)$/u,"$1"),u=/@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(I);u?this._walk(A,h=>{let B=[u[2]],f=u[1]?A[h][u[1]]:A[h];this._trace(B,f,e,i,n,o,!0).length>0&&C(this._trace(l,A[h],yC(e,h),A,h,o,!0))}):this._walk(A,h=>{this._eval(I,A[h],h,e,i,n)&&C(this._trace(l,A[h],yC(e,h),A,h,o,!0))})}else if(c[0]==="("){if(this.currEval===!1)throw new Error("Eval [(expr)] prevented in JSONPath expression.");C(this._trace(fU(this._eval(c,A,e.at(-1),e.slice(0,-1),i,n),l),A,e,i,n,o,r))}else if(c[0]==="@"){let I=!1,u=c.slice(1,-2);switch(u){case"scalar":(!A||!["object","function"].includes(typeof A))&&(I=!0);break;case"boolean":case"string":case"undefined":case"function":typeof A===u&&(I=!0);break;case"integer":Number.isFinite(A)&&!(A%1)&&(I=!0);break;case"number":Number.isFinite(A)&&(I=!0);break;case"nonFinite":typeof A=="number"&&!Number.isFinite(A)&&(I=!0);break;case"object":A&&typeof A===u&&(I=!0);break;case"array":Array.isArray(A)&&(I=!0);break;case"other":I=this.currOtherTypeCallback(A,e,i,n);break;case"null":A===null&&(I=!0);break;default:throw new TypeError("Unknown value type "+u)}if(I)return a={path:e,value:A,parent:i,parentProperty:n},this._handleCallback(a,o,"value"),a}else if(c[0]==="`"&&A&&Object.hasOwn(A,c.slice(1))){let I=c.slice(1);C(this._trace(l,A[I],yC(e,I),A,I,o,r,!0))}else if(c.includes(",")){let I=c.split(",");for(let u of I)C(this._trace(fU(u,l),A,e,i,n,o,!0))}else!s&&A&&Object.hasOwn(A,c)&&C(this._trace(l,A[c],yC(e,c),A,c,o,r,!0))}if(this._hasParentSelector)for(let I=0;I{A(e)})};oo.prototype._slice=function(t,A,e,i,n,o,r){if(!Array.isArray(e))return;let s=e.length,a=t.split(":"),c=a[2]&&Number.parseInt(a[2])||1,l=a[0]&&Number.parseInt(a[0])||0,d=a[1]&&Number.parseInt(a[1])||s;l=l<0?Math.max(0,l+s):Math.min(s,l),d=d<0?Math.max(0,d+s):Math.min(s,d);let C=[];for(let I=l;I{C.push(h)});return C};oo.prototype._eval=function(t,A,e,i,n,o){this.currSandbox._$_parentProperty=o,this.currSandbox._$_parent=n,this.currSandbox._$_property=e,this.currSandbox._$_root=this.json,this.currSandbox._$_v=A;let r=t.includes("@path");r&&(this.currSandbox._$_path=oo.toPathString(i.concat([e])));let s=this.currEval+"Script:"+t;if(!oo.cache[s]){let a=t.replaceAll("@parentProperty","_$_parentProperty").replaceAll("@parent","_$_parent").replaceAll("@property","_$_property").replaceAll("@root","_$_root").replaceAll(/@([.\s)[])/gu,"_$_v$1");if(r&&(a=a.replaceAll("@path","_$_path")),this.currEval==="safe"||this.currEval===!0||this.currEval===void 0)oo.cache[s]=new this.safeVm.Script(a);else if(this.currEval==="native")oo.cache[s]=new this.vm.Script(a);else if(typeof this.currEval=="function"&&this.currEval.prototype&&Object.hasOwn(this.currEval.prototype,"runInNewContext")){let c=this.currEval;oo.cache[s]=new c(a)}else if(typeof this.currEval=="function")oo.cache[s]={runInNewContext:c=>this.currEval(a,c)};else throw new TypeError(`Unknown "eval" property "${this.currEval}"`)}try{return oo.cache[s].runInNewContext(this.currSandbox)}catch(a){if(this.ignoreEvalErrors)return!1;throw new Error("jsonPath: "+a.message+": "+t)}};oo.cache={};oo.toPathString=function(t){let A=t,e=A.length,i="$";for(let n=1;ntypeof A[c]=="function");let o=i.map(c=>A[c]);e=n.reduce((c,l)=>{let d=A[l].toString();return/function/u.test(d)||(d="function "+d),"var "+l+"="+d+";"+c},"")+e,!/(['"])use strict\1/u.test(e)&&!i.includes("arguments")&&(e="var arguments = undefined;"+e),e=e.replace(/;\s*$/u,"");let s=e.lastIndexOf(";"),a=s!==-1?e.slice(0,s+1)+" return "+e.slice(s+1):" return "+e;return new Function(...i,a)(...o)}};oo.prototype.vm={Script:mU};var wU=[],cae=[];(()=>{let t="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(A=>A?parseInt(A,36):1);for(let A=0,e=0;A>1;if(t=cae[i])A=i+1;else return!0;if(A==e)return!1}}function rae(t){return t>=127462&&t<=127487}var sae=8205;function lae(t,A,e=!0,i=!0){return(e?gae:HJe)(t,A,i)}function gae(t,A,e){if(A==t.length)return A;A&&dae(t.charCodeAt(A))&&Cae(t.charCodeAt(A-1))&&A--;let i=pU(t,A);for(A+=aae(i);A=0&&rae(pU(t,r));)o++,r-=2;if(o%2==0)break;A+=2}else break}return A}function HJe(t,A,e){for(;A>0;){let i=gae(t,A-2,e);if(i=56320&&t<57344}function Cae(t){return t>=55296&&t<56320}function aae(t){return t<65536?1:2}var Dn=class t{lineAt(A){if(A<0||A>this.length)throw new RangeError(`Invalid position ${A} in document of length ${this.length}`);return this.lineInner(A,!1,1,0)}line(A){if(A<1||A>this.lines)throw new RangeError(`Invalid line number ${A} in ${this.lines}-line document`);return this.lineInner(A,!0,1,0)}replace(A,e,i){[A,e]=sf(this,A,e);let n=[];return this.decompose(0,A,n,2),i.length&&i.decompose(0,i.length,n,3),this.decompose(e,this.length,n,1),nf.from(n,this.length-(e-A)+i.length)}append(A){return this.replace(this.length,this.length,A)}slice(A,e=this.length){[A,e]=sf(this,A,e);let i=[];return this.decompose(A,e,i,0),nf.from(i,e-A)}eq(A){if(A==this)return!0;if(A.length!=this.length||A.lines!=this.lines)return!1;let e=this.scanIdentical(A,1),i=this.length-this.scanIdentical(A,-1),n=new Lu(this),o=new Lu(A);for(let r=e,s=e;;){if(n.next(r),o.next(r),r=0,n.lineBreak!=o.lineBreak||n.done!=o.done||n.value!=o.value)return!1;if(s+=n.value.length,n.done||s>=i)return!0}}iter(A=1){return new Lu(this,A)}iterRange(A,e=this.length){return new r7(this,A,e)}iterLines(A,e){let i;if(A==null)i=this.iter();else{e==null&&(e=this.lines+1);let n=this.line(A).from;i=this.iterRange(n,Math.max(n,e==this.lines+1?this.length:e<=1?0:this.line(e-1).to))}return new s7(i)}toString(){return this.sliceString(0)}toJSON(){let A=[];return this.flatten(A),A}constructor(){}static of(A){if(A.length==0)throw new RangeError("A document must have at least one line");return A.length==1&&!A[0]?t.empty:A.length<=32?new Bl(A):nf.from(Bl.split(A,[]))}},Bl=class t extends Dn{constructor(A,e=zJe(A)){super(),this.text=A,this.length=e}get lines(){return this.text.length}get children(){return null}lineInner(A,e,i,n){for(let o=0;;o++){let r=this.text[o],s=n+r.length;if((e?i:s)>=A)return new vU(n,s,i,r);n=s+1,i++}}decompose(A,e,i,n){let o=A<=0&&e>=this.length?this:new t(Iae(this.text,A,e),Math.min(e,this.length)-Math.max(0,A));if(n&1){let r=i.pop(),s=o7(o.text,r.text.slice(),0,o.length);if(s.length<=32)i.push(new t(s,r.length+o.length));else{let a=s.length>>1;i.push(new t(s.slice(0,a)),new t(s.slice(a)))}}else i.push(o)}replace(A,e,i){if(!(i instanceof t))return super.replace(A,e,i);[A,e]=sf(this,A,e);let n=o7(this.text,o7(i.text,Iae(this.text,0,A)),e),o=this.length+i.length-(e-A);return n.length<=32?new t(n,o):nf.from(t.split(n,[]),o)}sliceString(A,e=this.length,i=` +`){[A,e]=sf(this,A,e);let n="";for(let o=0,r=0;o<=e&&rA&&r&&(n+=i),Ao&&(n+=s.slice(Math.max(0,A-o),e-o)),o=a+1}return n}flatten(A){for(let e of this.text)A.push(e)}scanIdentical(){return 0}static split(A,e){let i=[],n=-1;for(let o of A)i.push(o),n+=o.length+1,i.length==32&&(e.push(new t(i,n)),i=[],n=-1);return n>-1&&e.push(new t(i,n)),e}},nf=class t extends Dn{constructor(A,e){super(),this.children=A,this.length=e,this.lines=0;for(let i of A)this.lines+=i.lines}lineInner(A,e,i,n){for(let o=0;;o++){let r=this.children[o],s=n+r.length,a=i+r.lines-1;if((e?a:s)>=A)return r.lineInner(A,e,i,n);n=s+1,i=a+1}}decompose(A,e,i,n){for(let o=0,r=0;r<=e&&o=r){let c=n&((r<=A?1:0)|(a>=e?2:0));r>=A&&a<=e&&!c?i.push(s):s.decompose(A-r,e-r,i,c)}r=a+1}}replace(A,e,i){if([A,e]=sf(this,A,e),i.lines=o&&e<=s){let a=r.replace(A-o,e-o,i),c=this.lines-r.lines+a.lines;if(a.lines>4&&a.lines>c>>6){let l=this.children.slice();return l[n]=a,new t(l,this.length-(e-A)+i.length)}return super.replace(o,s,a)}o=s+1}return super.replace(A,e,i)}sliceString(A,e=this.length,i=` +`){[A,e]=sf(this,A,e);let n="";for(let o=0,r=0;oA&&o&&(n+=i),Ar&&(n+=s.sliceString(A-r,e-r,i)),r=a+1}return n}flatten(A){for(let e of this.children)e.flatten(A)}scanIdentical(A,e){if(!(A instanceof t))return 0;let i=0,[n,o,r,s]=e>0?[0,0,this.children.length,A.children.length]:[this.children.length-1,A.children.length-1,-1,-1];for(;;n+=e,o+=e){if(n==r||o==s)return i;let a=this.children[n],c=A.children[o];if(a!=c)return i+a.scanIdentical(c,e);i+=a.length+1}}static from(A,e=A.reduce((i,n)=>i+n.length+1,-1)){let i=0;for(let I of A)i+=I.lines;if(i<32){let I=[];for(let u of A)u.flatten(I);return new Bl(I,e)}let n=Math.max(32,i>>5),o=n<<1,r=n>>1,s=[],a=0,c=-1,l=[];function d(I){let u;if(I.lines>o&&I instanceof t)for(let h of I.children)d(h);else I.lines>r&&(a>r||!a)?(C(),s.push(I)):I instanceof Bl&&a&&(u=l[l.length-1])instanceof Bl&&I.lines+u.lines<=32?(a+=I.lines,c+=I.length+1,l[l.length-1]=new Bl(u.text.concat(I.text),u.length+1+I.length)):(a+I.lines>n&&C(),a+=I.lines,c+=I.length+1,l.push(I))}function C(){a!=0&&(s.push(l.length==1?l[0]:t.from(l,c)),c=-1,a=l.length=0)}for(let I of A)d(I);return C(),s.length==1?s[0]:new t(s,e)}};Dn.empty=new Bl([""],0);function zJe(t){let A=-1;for(let e of t)A+=e.length+1;return A}function o7(t,A,e=0,i=1e9){for(let n=0,o=0,r=!0;o=e&&(a>i&&(s=s.slice(0,i-n)),n0?1:(A instanceof Bl?A.text.length:A.children.length)<<1]}nextInner(A,e){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,n=this.nodes[i],o=this.offsets[i],r=o>>1,s=n instanceof Bl?n.text.length:n.children.length;if(r==(e>0?s:0)){if(i==0)return this.done=!0,this.value="",this;e>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((o&1)==(e>0?0:1)){if(this.offsets[i]+=e,A==0)return this.lineBreak=!0,this.value=` +`,this;A--}else if(n instanceof Bl){let a=n.text[r+(e<0?-1:0)];if(this.offsets[i]+=e,a.length>Math.max(0,A))return this.value=A==0?a:e>0?a.slice(A):a.slice(0,a.length-A),this;A-=a.length}else{let a=n.children[r+(e<0?-1:0)];A>a.length?(A-=a.length,this.offsets[i]+=e):(e<0&&this.offsets[i]--,this.nodes.push(a),this.offsets.push(e>0?1:(a instanceof Bl?a.text.length:a.children.length)<<1))}}}next(A=0){return A<0&&(this.nextInner(-A,-this.dir),A=this.value.length),this.nextInner(A,this.dir)}},r7=class{constructor(A,e,i){this.value="",this.done=!1,this.cursor=new Lu(A,e>i?-1:1),this.pos=e>i?A.length:0,this.from=Math.min(e,i),this.to=Math.max(e,i)}nextInner(A,e){if(e<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;A+=Math.max(0,e<0?this.pos-this.to:this.from-this.pos);let i=e<0?this.pos-this.from:this.to-this.pos;A>i&&(A=i),i-=A;let{value:n}=this.cursor.next(A);return this.pos+=(n.length+A)*e,this.value=n.length<=i?n:e<0?n.slice(n.length-i):n.slice(0,i),this.done=!this.value,this}next(A=0){return A<0?A=Math.max(A,this.from-this.pos):A>0&&(A=Math.min(A,this.to-this.pos)),this.nextInner(A,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},s7=class{constructor(A){this.inner=A,this.afterBreak=!0,this.value="",this.done=!1}next(A=0){let{done:e,lineBreak:i,value:n}=this.inner.next(A);return e&&this.afterBreak?(this.value="",this.afterBreak=!1):e?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol<"u"&&(Dn.prototype[Symbol.iterator]=function(){return this.iter()},Lu.prototype[Symbol.iterator]=r7.prototype[Symbol.iterator]=s7.prototype[Symbol.iterator]=function(){return this});var vU=class{constructor(A,e,i,n){this.from=A,this.to=e,this.number=i,this.text=n}get length(){return this.to-this.from}};function sf(t,A,e){return A=Math.max(0,Math.min(t.length,A)),[A,Math.max(A,Math.min(t.length,e))]}function Cs(t,A,e=!0,i=!0){return lae(t,A,e,i)}function PJe(t){return t>=56320&&t<57344}function jJe(t){return t>=55296&&t<56320}function da(t,A){let e=t.charCodeAt(A);if(!jJe(e)||A+1==t.length)return e;let i=t.charCodeAt(A+1);return PJe(i)?(e-55296<<10)+(i-56320)+65536:e}function F3(t){return t<=65535?String.fromCharCode(t):(t-=65536,String.fromCharCode((t>>10)+55296,(t&1023)+56320))}function El(t){return t<65536?1:2}var bU=/\r\n?|\n/,ca=function(t){return t[t.Simple=0]="Simple",t[t.TrackDel=1]="TrackDel",t[t.TrackBefore=2]="TrackBefore",t[t.TrackAfter=3]="TrackAfter",t}(ca||(ca={})),vC=class t{constructor(A){this.sections=A}get length(){let A=0;for(let e=0;eA)return o+(A-n);o+=s}else{if(i!=ca.Simple&&c>=A&&(i==ca.TrackDel&&nA||i==ca.TrackBefore&&nA))return null;if(c>A||c==A&&e<0&&!s)return A==n||e<0?o:o+a;o+=a}n=c}if(A>n)throw new RangeError(`Position ${A} is out of range for changeset of length ${n}`);return o}touchesRange(A,e=A){for(let i=0,n=0;i=0&&n<=e&&s>=A)return ne?"cover":!0;n=s}return!1}toString(){let A="";for(let e=0;e=0?":"+n:"")}return A}toJSON(){return this.sections}static fromJSON(A){if(!Array.isArray(A)||A.length%2||A.some(e=>typeof e!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new t(A)}static create(A){return new t(A)}},la=class t extends vC{constructor(A,e){super(A),this.inserted=e}apply(A){if(this.length!=A.length)throw new RangeError("Applying change set to a document with the wrong length");return MU(this,(e,i,n,o,r)=>A=A.replace(n,n+(i-e),r),!1),A}mapDesc(A,e=!1){return SU(this,A,e,!0)}invert(A){let e=this.sections.slice(),i=[];for(let n=0,o=0;n=0){e[n]=s,e[n+1]=r;let a=n>>1;for(;i.length0&&DC(i,e,o.text),o.forward(l),s+=l}let c=A[r++];for(;s>1].toJSON()))}return A}static of(A,e,i){let n=[],o=[],r=0,s=null;function a(l=!1){if(!l&&!n.length)return;rC||d<0||C>e)throw new RangeError(`Invalid change range ${d} to ${C} (in doc of length ${e})`);let u=I?typeof I=="string"?Dn.of(I.split(i||bU)):I:Dn.empty,h=u.length;if(d==C&&h==0)return;dr&&Ra(n,d-r,-1),Ra(n,C-d,h),DC(o,n,u),r=C}}return c(A),a(!s),s}static empty(A){return new t(A?[A,-1]:[],[])}static fromJSON(A){if(!Array.isArray(A))throw new RangeError("Invalid JSON representation of ChangeSet");let e=[],i=[];for(let n=0;ns&&typeof r!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(o.length==1)e.push(o[0],0);else{for(;i.length=0&&e<=0&&e==t[n+1]?t[n]+=A:n>=0&&A==0&&t[n]==0?t[n+1]+=e:i?(t[n]+=A,t[n+1]+=e):t.push(A,e)}function DC(t,A,e){if(e.length==0)return;let i=A.length-2>>1;if(i>1])),!(e||r==t.sections.length||t.sections[r+1]<0);)s=t.sections[r++],a=t.sections[r++];A(n,c,o,l,d),n=c,o=l}}}function SU(t,A,e,i=!1){let n=[],o=i?[]:null,r=new Fu(t),s=new Fu(A);for(let a=-1;;){if(r.done&&s.len||s.done&&r.len)throw new Error("Mismatched change set lengths");if(r.ins==-1&&s.ins==-1){let c=Math.min(r.len,s.len);Ra(n,c,-1),r.forward(c),s.forward(c)}else if(s.ins>=0&&(r.ins<0||a==r.i||r.off==0&&(s.len=0&&a=0){let c=0,l=r.len;for(;l;)if(s.ins==-1){let d=Math.min(l,s.len);c+=d,l-=d,s.forward(d)}else if(s.ins==0&&s.lena||r.ins>=0&&r.len>a)&&(s||i.length>c),o.forward2(a),r.forward(a)}}}}var Fu=class{constructor(A){this.set=A,this.i=0,this.next()}next(){let{sections:A}=this.set;this.i>1;return e>=A.length?Dn.empty:A[e]}textBit(A){let{inserted:e}=this.set,i=this.i-2>>1;return i>=e.length&&!A?Dn.empty:e[i].slice(this.off,A==null?void 0:this.off+A)}forward(A){A==this.len?this.next():(this.len-=A,this.off+=A)}forward2(A){this.ins==-1?this.forward(A):A==this.ins?this.next():(this.ins-=A,this.off+=A)}},tf=class t{constructor(A,e,i){this.from=A,this.to=e,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let A=this.flags&7;return A==7?null:A}get goalColumn(){let A=this.flags>>6;return A==16777215?void 0:A}map(A,e=-1){let i,n;return this.empty?i=n=A.mapPos(this.from,e):(i=A.mapPos(this.from,1),n=A.mapPos(this.to,-1)),i==this.from&&n==this.to?this:new t(i,n,this.flags)}extend(A,e=A){if(A<=this.anchor&&e>=this.anchor)return fA.range(A,e);let i=Math.abs(A-this.anchor)>Math.abs(e-this.anchor)?A:e;return fA.range(this.anchor,i)}eq(A,e=!1){return this.anchor==A.anchor&&this.head==A.head&&(!e||!this.empty||this.assoc==A.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(A){if(!A||typeof A.anchor!="number"||typeof A.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return fA.range(A.anchor,A.head)}static create(A,e,i){return new t(A,e,i)}},fA=class t{constructor(A,e){this.ranges=A,this.mainIndex=e}map(A,e=-1){return A.empty?this:t.create(this.ranges.map(i=>i.map(A,e)),this.mainIndex)}eq(A,e=!1){if(this.ranges.length!=A.ranges.length||this.mainIndex!=A.mainIndex)return!1;for(let i=0;iA.toJSON()),main:this.mainIndex}}static fromJSON(A){if(!A||!Array.isArray(A.ranges)||typeof A.main!="number"||A.main>=A.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new t(A.ranges.map(e=>tf.fromJSON(e)),A.main)}static single(A,e=A){return new t([t.range(A,e)],0)}static create(A,e=0){if(A.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,n=0;nA?8:0)|o)}static normalized(A,e=0){let i=A[e];A.sort((n,o)=>n.from-o.from),e=A.indexOf(i);for(let n=1;no.head?t.range(a,s):t.range(s,a))}}return new t(A,e)}};function pae(t,A){for(let e of t.ranges)if(e.to>A)throw new RangeError("Selection points outside of document")}var KU=0,rt=class t{constructor(A,e,i,n,o){this.combine=A,this.compareInput=e,this.compare=i,this.isStatic=n,this.id=KU++,this.default=A([]),this.extensions=typeof o=="function"?o(this):o}get reader(){return this}static define(A={}){return new t(A.combine||(e=>e),A.compareInput||((e,i)=>e===i),A.compare||(A.combine?(e,i)=>e===i:UU),!!A.static,A.enables)}of(A){return new of([],this,0,A)}compute(A,e){if(this.isStatic)throw new Error("Can't compute a static facet");return new of(A,this,1,e)}computeN(A,e){if(this.isStatic)throw new Error("Can't compute a static facet");return new of(A,this,2,e)}from(A,e){return e||(e=i=>i),this.compute([A],i=>e(i.field(A)))}};function UU(t,A){return t==A||t.length==A.length&&t.every((e,i)=>e===A[i])}var of=class{constructor(A,e,i,n){this.dependencies=A,this.facet=e,this.type=i,this.value=n,this.id=KU++}dynamicSlot(A){var e;let i=this.value,n=this.facet.compareInput,o=this.id,r=A[o]>>1,s=this.type==2,a=!1,c=!1,l=[];for(let d of this.dependencies)d=="doc"?a=!0:d=="selection"?c=!0:(((e=A[d.id])!==null&&e!==void 0?e:1)&1)==0&&l.push(A[d.id]);return{create(d){return d.values[r]=i(d),1},update(d,C){if(a&&C.docChanged||c&&(C.docChanged||C.selection)||kU(d,l)){let I=i(d);if(s?!uae(I,d.values[r],n):!n(I,d.values[r]))return d.values[r]=I,1}return 0},reconfigure:(d,C)=>{let I,u=C.config.address[o];if(u!=null){let h=l7(C,u);if(this.dependencies.every(B=>B instanceof rt?C.facet(B)===d.facet(B):B instanceof _r?C.field(B,!1)==d.field(B,!1):!0)||(s?uae(I=i(d),h,n):n(I=i(d),h)))return d.values[r]=h,0}else I=i(d);return d.values[r]=I,1}}}};function uae(t,A,e){if(t.length!=A.length)return!1;for(let i=0;it[a.id]),n=e.map(a=>a.type),o=i.filter(a=>!(a&1)),r=t[A.id]>>1;function s(a){let c=[];for(let l=0;li===n),A);return A.provide&&(e.provides=A.provide(e)),e}create(A){let e=A.facet(t7).find(i=>i.field==this);return(e?.create||this.createF)(A)}slot(A){let e=A[this.id]>>1;return{create:i=>(i.values[e]=this.create(i),1),update:(i,n)=>{let o=i.values[e],r=this.updateF(o,n);return this.compareF(o,r)?0:(i.values[e]=r,1)},reconfigure:(i,n)=>{let o=i.facet(t7),r=n.facet(t7),s;return(s=o.find(a=>a.field==this))&&s!=r.find(a=>a.field==this)?(i.values[e]=s.create(i),1):n.config.address[this.id]!=null?(i.values[e]=n.field(this),0):(i.values[e]=this.create(i),1)}}}init(A){return[this,t7.of({field:this,create:A})]}get extension(){return this}},Ru={lowest:4,low:3,default:2,high:1,highest:0};function x3(t){return A=>new a7(A,t)}var Hg={highest:x3(Ru.highest),high:x3(Ru.high),default:x3(Ru.default),low:x3(Ru.low),lowest:x3(Ru.lowest)},a7=class{constructor(A,e){this.inner=A,this.prec=e}},hd=class t{of(A){return new R3(this,A)}reconfigure(A){return t.reconfigure.of({compartment:this,extension:A})}get(A){return A.config.compartments.get(this)}},R3=class{constructor(A,e){this.compartment=A,this.inner=e}},c7=class t{constructor(A,e,i,n,o,r){for(this.base=A,this.compartments=e,this.dynamicSlots=i,this.address=n,this.staticValues=o,this.facets=r,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(A,e,i){let n=[],o=Object.create(null),r=new Map;for(let C of qJe(A,e,r))C instanceof _r?n.push(C):(o[C.facet.id]||(o[C.facet.id]=[])).push(C);let s=Object.create(null),a=[],c=[];for(let C of n)s[C.id]=c.length<<1,c.push(I=>C.slot(I));let l=i?.config.facets;for(let C in o){let I=o[C],u=I[0].facet,h=l&&l[C]||[];if(I.every(B=>B.type==0))if(s[u.id]=a.length<<1|1,UU(h,I))a.push(i.facet(u));else{let B=u.combine(I.map(f=>f.value));a.push(i&&u.compare(B,i.facet(u))?i.facet(u):B)}else{for(let B of I)B.type==0?(s[B.id]=a.length<<1|1,a.push(B.value)):(s[B.id]=c.length<<1,c.push(f=>B.dynamicSlot(f)));s[u.id]=c.length<<1,c.push(B=>VJe(B,u,I))}}let d=c.map(C=>C(s));return new t(A,r,d,s,a,o)}};function qJe(t,A,e){let i=[[],[],[],[],[]],n=new Map;function o(r,s){let a=n.get(r);if(a!=null){if(a<=s)return;let c=i[a].indexOf(r);c>-1&&i[a].splice(c,1),r instanceof R3&&e.delete(r.compartment)}if(n.set(r,s),Array.isArray(r))for(let c of r)o(c,s);else if(r instanceof R3){if(e.has(r.compartment))throw new RangeError("Duplicate use of compartment in extensions");let c=A.get(r.compartment)||r.inner;e.set(r.compartment,c),o(c,s)}else if(r instanceof a7)o(r.inner,r.prec);else if(r instanceof _r)i[s].push(r),r.provides&&o(r.provides,s);else if(r instanceof of)i[s].push(r),r.facet.extensions&&o(r.facet.extensions,Ru.default);else{let c=r.extension;if(!c)throw new Error(`Unrecognized extension value in extension set (${r}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);o(c,s)}}return o(t,Ru.default),i.reduce((r,s)=>r.concat(s))}function _3(t,A){if(A&1)return 2;let e=A>>1,i=t.status[e];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;t.status[e]=4;let n=t.computeSlot(t,t.config.dynamicSlots[e]);return t.status[e]=2|n}function l7(t,A){return A&1?t.config.staticValues[A>>1]:t.values[A>>1]}var hae=rt.define(),yU=rt.define({combine:t=>t.some(A=>A),static:!0}),wae=rt.define({combine:t=>t.length?t[0]:void 0,static:!0}),yae=rt.define(),Dae=rt.define(),vae=rt.define(),Bae=rt.define({combine:t=>t.length?t[0]:!1}),Fc=class{constructor(A,e){this.type=A,this.value=e}static define(){return new xU}},xU=class{of(A){return new Fc(this,A)}},_U=class{constructor(A){this.map=A}of(A){return new tn(this,A)}},tn=(()=>{class t{constructor(e,i){this.type=e,this.value=i}map(e){let i=this.type.map(this.value,e);return i===void 0?void 0:i==this.value?this:new t(this.type,i)}is(e){return this.type==e}static define(e={}){return new _U(e.map||(i=>i))}static mapEffects(e,i){if(!e.length)return e;let n=[];for(let o of e){let r=o.map(i);r&&n.push(r)}return n}}return t.reconfigure=t.define(),t.appendConfig=t.define(),t})(),ud=(()=>{class t{constructor(e,i,n,o,r,s){this.startState=e,this.changes=i,this.selection=n,this.effects=o,this.annotations=r,this.scrollIntoView=s,this._doc=null,this._state=null,n&&pae(n,i.newLength),r.some(a=>a.type==t.time)||(this.annotations=r.concat(t.time.of(Date.now())))}static create(e,i,n,o,r,s){return new t(e,i,n,o,r,s)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(e){for(let i of this.annotations)if(i.type==e)return i.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(e){let i=this.annotation(t.userEvent);return!!(i&&(i==e||i.length>e.length&&i.slice(0,e.length)==e&&i[e.length]=="."))}}return t.time=Fc.define(),t.userEvent=Fc.define(),t.addToHistory=Fc.define(),t.remote=Fc.define(),t})();function WJe(t,A){let e=[];for(let i=0,n=0;;){let o,r;if(i=t[i]))o=t[i++],r=t[i++];else if(n=0;n--){let o=i[n](t);o instanceof ud?t=o:Array.isArray(o)&&o.length==1&&o[0]instanceof ud?t=o[0]:t=Mae(A,rf(o),!1)}return t}function XJe(t){let A=t.startState,e=A.facet(vae),i=t;for(let n=e.length-1;n>=0;n--){let o=e[n](t);o&&Object.keys(o).length&&(i=bae(i,RU(A,o,t.changes.newLength),!0))}return i==t?t:ud.create(A,t.changes,t.selection,i.effects,i.annotations,i.scrollIntoView)}var $Je=[];function rf(t){return t==null?$Je:Array.isArray(t)?t:[t]}var Uo=function(t){return t[t.Word=0]="Word",t[t.Space=1]="Space",t[t.Other=2]="Other",t}(Uo||(Uo={})),eYe=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,NU;try{NU=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch{}function AYe(t){if(NU)return NU.test(t);for(let A=0;A"\x80"&&(e.toUpperCase()!=e.toLowerCase()||eYe.test(e)))return!0}return!1}function tYe(t){return A=>{if(!/\S/.test(A))return Uo.Space;if(AYe(A))return Uo.Word;for(let e=0;e-1)return Uo.Word;return Uo.Other}}var ss=(()=>{class t{constructor(e,i,n,o,r,s){this.config=e,this.doc=i,this.selection=n,this.values=o,this.status=e.statusTemplate.slice(),this.computeSlot=r,s&&(s._state=this);for(let a=0;ao.set(l,c)),i=null),o.set(a.value.compartment,a.value.extension)):a.is(tn.reconfigure)?(i=null,n=a.value):a.is(tn.appendConfig)&&(i=null,n=rf(n).concat(a.value));let r;i?r=e.startState.values.slice():(i=c7.resolve(n,o,this),r=new t(i,this.doc,this.selection,i.dynamicSlots.map(()=>null),(c,l)=>l.reconfigure(c,this),null).values);let s=e.startState.facet(yU)?e.newSelection:e.newSelection.asSingle();new t(i,e.newDoc,s,r,(a,c)=>c.update(a,e),e)}replaceSelection(e){return typeof e=="string"&&(e=this.toText(e)),this.changeByRange(i=>({changes:{from:i.from,to:i.to,insert:e},range:fA.cursor(i.from+e.length)}))}changeByRange(e){let i=this.selection,n=e(i.ranges[0]),o=this.changes(n.changes),r=[n.range],s=rf(n.effects);for(let a=1;as.spec.fromJSON(a,c)))}}return t.create({doc:e.doc,selection:fA.fromJSON(e.selection),extensions:i.extensions?o.concat([i.extensions]):o})}static create(e={}){let i=c7.resolve(e.extensions||[],new Map),n=e.doc instanceof Dn?e.doc:Dn.of((e.doc||"").split(i.staticFacet(t.lineSeparator)||bU)),o=e.selection?e.selection instanceof fA?e.selection:fA.single(e.selection.anchor,e.selection.head):fA.single(0);return pae(o,n.length),i.staticFacet(yU)||(o=o.asSingle()),new t(i,n,o,i.dynamicSlots.map(()=>null),(r,s)=>s.create(r),null)}get tabSize(){return this.facet(t.tabSize)}get lineBreak(){return this.facet(t.lineSeparator)||` +`}get readOnly(){return this.facet(Bae)}phrase(e,...i){for(let n of this.facet(t.phrases))if(Object.prototype.hasOwnProperty.call(n,e)){e=n[e];break}return i.length&&(e=e.replace(/\$(\$|\d*)/g,(n,o)=>{if(o=="$")return"$";let r=+(o||1);return!r||r>i.length?n:i[r-1]})),e}languageDataAt(e,i,n=-1){let o=[];for(let r of this.facet(hae))for(let s of r(this,i,n))Object.prototype.hasOwnProperty.call(s,e)&&o.push(s[e]);return o}charCategorizer(e){return tYe(this.languageDataAt("wordChars",e).join(""))}wordAt(e){let{text:i,from:n,length:o}=this.doc.lineAt(e),r=this.charCategorizer(e),s=e-n,a=e-n;for(;s>0;){let c=Cs(i,s,!1);if(r(i.slice(c,s))!=Uo.Word)break;s=c}for(;aA.length?A[0]:4}),t.lineSeparator=wae,t.readOnly=Bae,t.phrases=rt.define({compare(A,e){let i=Object.keys(A),n=Object.keys(e);return i.length==n.length&&i.every(o=>A[o]==e[o])}}),t.languageData=hae,t.changeFilter=yae,t.transactionFilter=Dae,t.transactionExtender=vae,t})();hd.reconfigure=tn.define();function Os(t,A,e={}){let i={};for(let n of t)for(let o of Object.keys(n)){let r=n[o],s=i[o];if(s===void 0)i[o]=r;else if(!(s===r||r===void 0))if(Object.hasOwnProperty.call(e,o))i[o]=e[o](s,r);else throw new Error("Config merge conflict for field "+o)}for(let n in A)i[n]===void 0&&(i[n]=A[n]);return i}var Yg=class{eq(A){return this==A}range(A,e=A){return N3.create(A,e,this)}};Yg.prototype.startSide=Yg.prototype.endSide=0;Yg.prototype.point=!1;Yg.prototype.mapMode=ca.TrackDel;var N3=class t{constructor(A,e,i){this.from=A,this.to=e,this.value=i}static create(A,e,i){return new t(A,e,i)}};function LU(t,A){return t.from-A.from||t.value.startSide-A.value.startSide}var FU=class t{constructor(A,e,i,n){this.from=A,this.to=e,this.value=i,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(A,e,i,n=0){let o=i?this.to:this.from;for(let r=n,s=o.length;;){if(r==s)return r;let a=r+s>>1,c=o[a]-A||(i?this.value[a].endSide:this.value[a].startSide)-e;if(a==r)return c>=0?r:s;c>=0?s=a:r=a+1}}between(A,e,i,n){for(let o=this.findIndex(e,-1e9,!0),r=this.findIndex(i,1e9,!1,o);oI||C==I&&c.startSide>0&&c.endSide<=0)continue;(I-C||c.endSide-c.startSide)<0||(r<0&&(r=C),c.point&&(s=Math.max(s,I-C)),i.push(c),n.push(C-r),o.push(I-r))}return{mapped:i.length?new t(n,o,i,s):null,pos:r}}},To=(()=>{class t{constructor(e,i,n,o){this.chunkPos=e,this.chunk=i,this.nextLayer=n,this.maxPoint=o}static create(e,i,n,o){return new t(e,i,n,o)}get length(){let e=this.chunk.length-1;return e<0?0:Math.max(this.chunkEnd(e),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let e=this.nextLayer.size;for(let i of this.chunk)e+=i.value.length;return e}chunkEnd(e){return this.chunkPos[e]+this.chunk[e].length}update(e){let{add:i=[],sort:n=!1,filterFrom:o=0,filterTo:r=this.length}=e,s=e.filter;if(i.length==0&&!s)return this;if(n&&(i=i.slice().sort(LU)),this.isEmpty)return i.length?t.of(i):this;let a=new g7(this,null,-1).goto(0),c=0,l=[],d=new ga;for(;a.value||c=0){let C=i[c++];d.addInner(C.from,C.to,C.value)||l.push(C)}else a.rangeIndex==1&&a.chunkIndexthis.chunkEnd(a.chunkIndex)||ra.to||r=r&&e<=r+s.length&&s.between(r,e-r,i-r,n)===!1)return}this.nextLayer.between(e,i,n)}}iter(e=0){return L3.from([this]).goto(e)}get isEmpty(){return this.nextLayer==this}static iter(e,i=0){return L3.from(e).goto(i)}static compare(e,i,n,o,r=-1){let s=e.filter(C=>C.maxPoint>0||!C.isEmpty&&C.maxPoint>=r),a=i.filter(C=>C.maxPoint>0||!C.isEmpty&&C.maxPoint>=r),c=Eae(s,a,n),l=new Nu(s,c,r),d=new Nu(a,c,r);n.iterGaps((C,I,u)=>fae(l,C,d,I,u,o)),n.empty&&n.length==0&&fae(l,0,d,0,0,o)}static eq(e,i,n=0,o){o==null&&(o=999999999);let r=e.filter(d=>!d.isEmpty&&i.indexOf(d)<0),s=i.filter(d=>!d.isEmpty&&e.indexOf(d)<0);if(r.length!=s.length)return!1;if(!r.length)return!0;let a=Eae(r,s),c=new Nu(r,a,0).goto(n),l=new Nu(s,a,0).goto(n);for(;;){if(c.to!=l.to||!GU(c.active,l.active)||c.point&&(!l.point||!c.point.eq(l.point)))return!1;if(c.to>o)return!0;c.next(),l.next()}}static spans(e,i,n,o,r=-1){let s=new Nu(e,null,r).goto(i),a=i,c=s.openStart;for(;;){let l=Math.min(s.to,n);if(s.point){let d=s.activeForPoint(s.to),C=s.pointFroma&&(o.span(a,l,s.active,c),c=s.openEnd(l));if(s.to>n)return c+(s.point&&s.to>n?1:0);a=s.to,s.next()}}static of(e,i=!1){let n=new ga;for(let o of e instanceof N3?[e]:i?iYe(e):e)n.add(o.from,o.to,o.value);return n.finish()}static join(e){if(!e.length)return t.empty;let i=e[e.length-1];for(let n=e.length-2;n>=0;n--)for(let o=e[n];o!=t.empty;o=o.nextLayer)i=new t(o.chunkPos,o.chunk,i,Math.max(o.maxPoint,i.maxPoint));return i}}return t.empty=new t([],[],null,-1),t})();function iYe(t){if(t.length>1)for(let A=t[0],e=1;e0)return t.slice().sort(LU);A=i}return t}To.empty.nextLayer=To.empty;var ga=class t{finishChunk(A){this.chunks.push(new FU(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,A&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(A,e,i){this.addInner(A,e,i)||(this.nextLayer||(this.nextLayer=new t)).add(A,e,i)}addInner(A,e,i){let n=A-this.lastTo||i.startSide-this.last.endSide;if(n<=0&&(A-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return n<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=A),this.from.push(A-this.chunkStart),this.to.push(e-this.chunkStart),this.last=i,this.lastFrom=A,this.lastTo=e,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,e-A)),!0)}addChunk(A,e){if((A-this.lastTo||e.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,e.maxPoint),this.chunks.push(e),this.chunkPos.push(A);let i=e.value.length-1;return this.last=e.value[i],this.lastFrom=e.from[i]+A,this.lastTo=e.to[i]+A,!0}finish(){return this.finishInner(To.empty)}finishInner(A){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return A;let e=To.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(A):A,this.setMaxPoint);return this.from=null,e}};function Eae(t,A,e){let i=new Map;for(let o of t)for(let r=0;r=this.minPoint)break}}setRangeIndex(A){if(A==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&n.push(new g7(r,e,i,o));return n.length==1?n[0]:new t(n)}get startSide(){return this.value?this.value.startSide:0}goto(A,e=-1e9){for(let i of this.heap)i.goto(A,e);for(let i=this.heap.length>>1;i>=0;i--)DU(this.heap,i);return this.next(),this}forward(A,e){for(let i of this.heap)i.forward(A,e);for(let i=this.heap.length>>1;i>=0;i--)DU(this.heap,i);(this.to-A||this.value.endSide-e)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let A=this.heap[0];this.from=A.from,this.to=A.to,this.value=A.value,this.rank=A.rank,A.value&&A.next(),DU(this.heap,0)}}};function DU(t,A){for(let e=t[A];;){let i=(A<<1)+1;if(i>=t.length)break;let n=t[i];if(i+1=0&&(n=t[i+1],i++),e.compare(n)<0)break;t[i]=e,t[A]=n,A=i}}var Nu=class{constructor(A,e,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=L3.from(A,e,i)}goto(A,e=-1e9){return this.cursor.goto(A,e),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=A,this.endSide=e,this.openStart=-1,this.next(),this}forward(A,e){for(;this.minActive>-1&&(this.activeTo[this.minActive]-A||this.active[this.minActive].endSide-e)<0;)this.removeActive(this.minActive);this.cursor.forward(A,e)}removeActive(A){i7(this.active,A),i7(this.activeTo,A),i7(this.activeRank,A),this.minActive=Qae(this.active,this.activeTo)}addActive(A){let e=0,{value:i,to:n,rank:o}=this.cursor;for(;e0;)e++;n7(this.active,e,i),n7(this.activeTo,e,n),n7(this.activeRank,e,o),A&&n7(A,e,this.cursor.from),this.minActive=Qae(this.active,this.activeTo)}next(){let A=this.to,e=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let n=this.minActive;if(n>-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>A){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),i&&i7(i,n)}else if(this.cursor.value)if(this.cursor.from>A){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let o=this.cursor.value;if(!o.point)this.addActive(i),this.cursor.next();else if(e&&this.cursor.to==this.to&&this.cursor.from=0&&i[n]=0&&!(this.activeRank[i]A||this.activeTo[i]==A&&this.active[i].endSide>=this.point.endSide)&&e.push(this.active[i]);return e.reverse()}openEnd(A){let e=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>A;i--)e++;return e}};function fae(t,A,e,i,n,o){t.goto(A),e.goto(i);let r=i+n,s=i,a=i-A;for(;;){let c=t.to+a-e.to,l=c||t.endSide-e.endSide,d=l<0?t.to+a:e.to,C=Math.min(d,r);if(t.point||e.point?t.point&&e.point&&(t.point==e.point||t.point.eq(e.point))&&GU(t.activeForPoint(t.to),e.activeForPoint(e.to))||o.comparePoint(s,C,t.point,e.point):C>s&&!GU(t.active,e.active)&&o.compareRange(s,C,t.active,e.active),d>r)break;(c||t.openEnd!=e.openEnd)&&o.boundChange&&o.boundChange(d),s=d,l<=0&&t.next(),l>=0&&e.next()}}function GU(t,A){if(t.length!=A.length)return!1;for(let e=0;e=A;i--)t[i+1]=t[i];t[A]=e}function Qae(t,A){let e=-1,i=1e9;for(let n=0;n=A)return n;if(n==t.length)break;o+=t.charCodeAt(n)==9?e-o%e:1,n=Cs(t,n)}return i===!0?-1:t.length}var TU="\u037C",Sae=typeof Symbol>"u"?"__"+TU:Symbol.for(TU),OU=typeof Symbol>"u"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),kae=typeof globalThis<"u"?globalThis:typeof window<"u"?window:{},Ag=class{constructor(A,e){this.rules=[];let{finish:i}=e||{};function n(r){return/^@/.test(r)?[r]:r.split(/,\s*/)}function o(r,s,a,c){let l=[],d=/^@(\w+)\b/.exec(r[0]),C=d&&d[1]=="keyframes";if(d&&s==null)return a.push(r[0]+";");for(let I in s){let u=s[I];if(/&/.test(I))o(I.split(/,\s*/).map(h=>r.map(B=>h.replace(/&/,B))).reduce((h,B)=>h.concat(B)),u,a);else if(u&&typeof u=="object"){if(!d)throw new RangeError("The value of a property ("+I+") should be a primitive value.");o(n(I),u,l,C)}else u!=null&&l.push(I.replace(/_.*/,"").replace(/[A-Z]/g,h=>"-"+h.toLowerCase())+": "+u+";")}(l.length||C)&&a.push((i&&!d&&!c?r.map(i):r).join(", ")+" {"+l.join(" ")+"}")}for(let r in A)o(n(r),A[r],this.rules)}getRules(){return this.rules.join(` +`)}static newName(){let A=kae[Sae]||1;return kae[Sae]=A+1,TU+A.toString(36)}static mount(A,e,i){let n=A[OU],o=i&&i.nonce;n?o&&n.setNonce(o):n=new JU(A,o),n.mount(Array.isArray(e)?e:[e],A)}},xae=new Map,JU=class{constructor(A,e){let i=A.ownerDocument||A,n=i.defaultView;if(!A.head&&A.adoptedStyleSheets&&n.CSSStyleSheet){let o=xae.get(i);if(o)return A[OU]=o;this.sheet=new n.CSSStyleSheet,xae.set(i,this)}else this.styleTag=i.createElement("style"),e&&this.styleTag.setAttribute("nonce",e);this.modules=[],A[OU]=this}mount(A,e){let i=this.sheet,n=0,o=0;for(let r=0;r-1&&(this.modules.splice(a,1),o--,a=-1),a==-1){if(this.modules.splice(o++,0,s),i)for(let c=0;c",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},nYe=typeof navigator<"u"&&/Mac/.test(navigator.platform),oYe=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(Is=0;Is<10;Is++)F2[48+Is]=F2[96+Is]=String(Is);var Is;for(Is=1;Is<=24;Is++)F2[Is+111]="F"+Is;var Is;for(Is=65;Is<=90;Is++)F2[Is]=String.fromCharCode(Is+32),af[Is]=String.fromCharCode(Is);var Is;for(C7 in F2)af.hasOwnProperty(C7)||(af[C7]=F2[C7]);var C7;function _ae(t){var A=nYe&&t.metaKey&&t.shiftKey&&!t.ctrlKey&&!t.altKey||oYe&&t.shiftKey&&t.key&&t.key.length==1||t.key=="Unidentified",e=!A&&t.key||(t.shiftKey?af:F2)[t.keyCode]||t.key||"Unidentified";return e=="Esc"&&(e="Escape"),e=="Del"&&(e="Delete"),e=="Left"&&(e="ArrowLeft"),e=="Up"&&(e="ArrowUp"),e=="Right"&&(e="ArrowRight"),e=="Down"&&(e="ArrowDown"),e}function Co(){var t=arguments[0];typeof t=="string"&&(t=document.createElement(t));var A=1,e=arguments[1];if(e&&typeof e=="object"&&e.nodeType==null&&!Array.isArray(e)){for(var i in e)if(Object.prototype.hasOwnProperty.call(e,i)){var n=e[i];typeof n=="string"?t.setAttribute(i,n):n!=null&&(t[i]=n)}A++}for(;A.995&&e<1.005||!isFinite(e)||Math.abs(A.width-t.offsetWidth)<1)&&(e=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(A.height-t.offsetHeight)<1)&&(i=1),{scaleX:e,scaleY:i}}function sYe(t,A,e,i,n,o,r,s){let a=t.ownerDocument,c=a.defaultView||window;for(let l=t,d=!1;l&&!d;)if(l.nodeType==1){let C,I=l==a.body,u=1,h=1;if(I)C=rYe(c);else{if(/^(fixed|sticky)$/.test(getComputedStyle(l).position)&&(d=!0),l.scrollHeight<=l.clientHeight&&l.scrollWidth<=l.clientWidth){l=l.assignedSlot||l.parentNode;continue}let b=l.getBoundingClientRect();({scaleX:u,scaleY:h}=Dce(l,b)),C={left:b.left,right:b.left+l.clientWidth*u,top:b.top,bottom:b.top+l.clientHeight*h}}let B=0,f=0;if(n=="nearest")A.top0&&A.bottom>C.bottom+f&&(f=A.bottom-C.bottom+r)):A.bottom>C.bottom&&(f=A.bottom-C.bottom+r,e<0&&A.top-f0&&A.right>C.right+B&&(B=A.right-C.right+o)):A.right>C.right&&(B=A.right-C.right+o,e<0&&A.leftC.bottom||A.leftC.right)&&(A={left:Math.max(A.left,C.left),right:Math.min(A.right,C.right),top:Math.max(A.top,C.top),bottom:Math.min(A.bottom,C.bottom)}),l=l.assignedSlot||l.parentNode}else if(l.nodeType==11)l=l.host;else break}function aYe(t){let A=t.ownerDocument,e,i;for(let n=t.parentNode;n&&!(n==A.body||e&&i);)if(n.nodeType==1)!i&&n.scrollHeight>n.clientHeight&&(i=n),!e&&n.scrollWidth>n.clientWidth&&(e=n),n=n.assignedSlot||n.parentNode;else if(n.nodeType==11)n=n.host;else break;return{x:e,y:i}}var $U=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(A){return this.anchorNode==A.anchorNode&&this.anchorOffset==A.anchorOffset&&this.focusNode==A.focusNode&&this.focusOffset==A.focusOffset}setRange(A){let{anchorNode:e,focusNode:i}=A;this.set(e,Math.min(A.anchorOffset,e?md(e):0),i,Math.min(A.focusOffset,i?md(i):0))}set(A,e,i,n){this.anchorNode=A,this.anchorOffset=e,this.focusNode=i,this.focusOffset=n}},cf=null;function vce(t){if(t.setActive)return t.setActive();if(cf)return t.focus(cf);let A=[];for(let e=t;e&&(A.push(e,e.scrollTop,e.scrollLeft),e!=e.ownerDocument);e=e.parentNode);if(t.focus(cf==null?{get preventScroll(){return cf={preventScroll:!0},!0}}:void 0),!cf){cf=!1;for(let e=0;eMath.max(1,t.scrollHeight-t.clientHeight-4)}function Sce(t,A){for(let e=t,i=A;;){if(e.nodeType==3&&i>0)return{node:e,offset:i};if(e.nodeType==1&&i>0){if(e.contentEditable=="false")return null;e=e.childNodes[i-1],i=md(e)}else if(e.parentNode&&!k7(e))i=Ku(e),e=e.parentNode;else return null}}function kce(t,A){for(let e=t,i=A;;){if(e.nodeType==3&&ie)return d.domBoundsAround(A,e,c);if(C>=A&&n==-1&&(n=a,o=c),c>e&&d.dom.parentNode==this.dom){r=a,s=l;break}l=C,c=C+d.breakAfter}return{from:o,to:s<0?i+this.length:s,startDOM:(n?this.children[n-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:r=0?this.children[r].dom:null}}markDirty(A=!1){this.flags|=2,this.markParentsDirty(A)}markParentsDirty(A){for(let e=this.parent;e;e=e.parent){if(A&&(e.flags|=2),e.flags&1)return;e.flags|=1,A=!1}}setParent(A){this.parent!=A&&(this.parent=A,this.flags&7&&this.markParentsDirty(!0))}setDOM(A){this.dom!=A&&(this.dom&&(this.dom.cmView=null),this.dom=A,A.cmView=this)}get rootView(){for(let A=this;;){let e=A.parent;if(!e)return A;A=e}}replaceChildren(A,e,i=KT){this.markDirty();for(let n=A;nthis.pos||A==this.pos&&(e>0||this.i==0||this.children[this.i-1].breakAfter))return this.off=A-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}};function xce(t,A,e,i,n,o,r,s,a){let{children:c}=t,l=c.length?c[A]:null,d=o.length?o[o.length-1]:null,C=d?d.breakAfter:r;if(!(A==i&&l&&!r&&!C&&o.length<2&&l.merge(e,n,o.length?d:null,e==0,s,a))){if(i0&&(!r&&o.length&&l.merge(e,l.length,o[0],!1,s,0)?l.breakAfter=o.shift().breakAfter:(e2),dt={mac:Uae||/Mac/.test(Gc.platform),windows:/Win/.test(Gc.platform),linux:/Linux|X11/.test(Gc.platform),ie:P7,ie_version:Rce?eT.documentMode||6:tT?+tT[1]:AT?+AT[1]:0,gecko:Gae,gecko_version:Gae?+(/Firefox\/(\d+)/.exec(Gc.userAgent)||[0,0])[1]:0,chrome:!!YU,chrome_version:YU?+YU[1]:0,ios:Uae,android:/Android\b/.test(Gc.userAgent),webkit:Kae,safari:Nce,webkit_version:Kae?+(/\bAppleWebKit\/(\d+)/.exec(Gc.userAgent)||[0,0])[1]:0,tabSize:eT.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"},gYe=256,pd=class t extends rr{constructor(A){super(),this.text=A}get length(){return this.text.length}createDOM(A){this.setDOM(A||document.createTextNode(this.text))}sync(A,e){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(e&&e.node==this.dom&&(e.written=!0),this.dom.nodeValue=this.text)}reuseDOM(A){A.nodeType==3&&this.createDOM(A)}merge(A,e,i){return this.flags&8||i&&(!(i instanceof t)||this.length-(e-A)+i.length>gYe||i.flags&8)?!1:(this.text=this.text.slice(0,A)+(i?i.text:"")+this.text.slice(e),this.markDirty(),!0)}split(A){let e=new t(this.text.slice(A));return this.text=this.text.slice(0,A),this.markDirty(),e.flags|=this.flags&8,e}localPosFromDOM(A,e){return A==this.dom?e:e?this.text.length:0}domAtPos(A){return new sc(this.dom,A)}domBoundsAround(A,e,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(A,e){return dYe(this.dom,A,e)}},SC=class t extends rr{constructor(A,e=[],i=0){super(),this.mark=A,this.children=e,this.length=i;for(let n of e)n.setParent(this)}setAttrs(A){if(bce(A),this.mark.class&&(A.className=this.mark.class),this.mark.attrs)for(let e in this.mark.attrs)A.setAttribute(e,this.mark.attrs[e]);return A}canReuseDOM(A){return super.canReuseDOM(A)&&!((this.flags|A.flags)&8)}reuseDOM(A){A.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(A),this.flags|=6)}sync(A,e){this.dom?this.flags&4&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(A,e)}merge(A,e,i,n,o,r){return i&&(!(i instanceof t&&i.mark.eq(this.mark))||A&&o<=0||eA&&e.push(i=A&&(n=o),i=a,o++}let r=this.length-A;return this.length=A,n>-1&&(this.children.length=n,this.markDirty()),new t(this.mark,e,r)}domAtPos(A){return Lce(this,A)}coordsAt(A,e){return Gce(this,A,e)}};function dYe(t,A,e){let i=t.nodeValue.length;A>i&&(A=i);let n=A,o=A,r=0;A==0&&e<0||A==i&&e>=0?dt.chrome||dt.gecko||(A?(n--,r=1):o=0)?0:s.length-1];return dt.safari&&!r&&a.width==0&&(a=Array.prototype.find.call(s,c=>c.width)||a),r?z7(a,r<0):a||null}var Z3=class t extends rr{static create(A,e,i){return new t(A,e,i)}constructor(A,e,i){super(),this.widget=A,this.length=e,this.side=i,this.prevWidget=null}split(A){let e=t.create(this.widget,this.length-A,this.side);return this.length-=A,e}sync(A){(!this.dom||!this.widget.updateDOM(this.dom,A))&&(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(A)),this.widget.editable||(this.dom.contentEditable="false"))}getSide(){return this.side}merge(A,e,i,n,o,r){return i&&(!(i instanceof t)||!this.widget.compare(i.widget)||A>0&&o<=0||e0)?sc.before(this.dom):sc.after(this.dom,A==this.length)}domBoundsAround(){return null}coordsAt(A,e){let i=this.widget.coordsAt(this.dom,A,e);if(i)return i;let n=this.dom.getClientRects(),o=null;if(!n.length)return null;let r=this.side?this.side<0:A>0;for(let s=r?n.length-1:0;o=n[s],!(A>0?s==0:s==n.length-1||o.top0?sc.before(this.dom):sc.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(A){return this.dom.getBoundingClientRect()}get overrideDOMText(){return Dn.empty}get isHidden(){return!0}};pd.prototype.children=Z3.prototype.children=X3.prototype.children=KT;function Lce(t,A){let e=t.dom,{children:i}=t,n=0;for(let o=0;no&&A0;o--){let r=i[o-1];if(r.dom.parentNode==e)return r.domAtPos(r.length)}for(let o=n;o0&&A instanceof SC&&n.length&&(i=n[n.length-1])instanceof SC&&i.mark.eq(A.mark)?Fce(i,A.children[0],e-1):(n.push(A),A.setParent(t)),t.length+=A.length}function Gce(t,A,e){let i=null,n=-1,o=null,r=-1;function s(c,l){for(let d=0,C=0;d=l&&(I.children.length?s(I,l-C):(!o||o.isHidden&&(e>0||IYe(o,I)))&&(u>l||C==u&&I.getSide()>0)?(o=I,r=l-C):(C-1?1:0)!=n.length-(e&&n.indexOf(e)>-1?1:0))return!1;for(let o of i)if(o!=e&&(n.indexOf(o)==-1||t[o]!==A[o]))return!1;return!0}function nT(t,A,e){let i=!1;if(A)for(let n in A)e&&n in e||(i=!0,n=="style"?t.style.cssText="":t.removeAttribute(n));if(e)for(let n in e)A&&A[n]==e[n]||(i=!0,n=="style"?t.style.cssText=e[n]:t.setAttribute(n,e[n]));return i}function uYe(t){let A=Object.create(null);for(let e=0;e0?3e8:-4e8:e>0?1e8:-1e8,new kC(A,e,e,i,A.widget||null,!1)}static replace(A){let e=!!A.block,i,n;if(A.isBlockGap)i=-5e8,n=4e8;else{let{start:o,end:r}=Kce(A,e);i=(o?e?-3e8:-1:5e8)-1,n=(r?e?2e8:1:-6e8)+1}return new kC(A,i,n,e,A.widget||null,!0)}static line(A){return new ep(A)}static set(A,e=!1){return To.of(A,e)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};bt.none=To.empty;var $3=class t extends bt{constructor(A){let{start:e,end:i}=Kce(A);super(e?-1:5e8,i?1:-6e8,null,A),this.tagName=A.tagName||"span",this.class=A.class||"",this.attrs=A.attributes||null}eq(A){var e,i;return this==A||A instanceof t&&this.tagName==A.tagName&&(this.class||((e=this.attrs)===null||e===void 0?void 0:e.class))==(A.class||((i=A.attrs)===null||i===void 0?void 0:i.class))&&_7(this.attrs,A.attrs,"class")}range(A,e=A){if(A>=e)throw new RangeError("Mark decorations may not be empty");return super.range(A,e)}};$3.prototype.point=!1;var ep=class t extends bt{constructor(A){super(-2e8,-2e8,null,A)}eq(A){return A instanceof t&&this.spec.class==A.spec.class&&_7(this.spec.attributes,A.spec.attributes)}range(A,e=A){if(e!=A)throw new RangeError("Line decoration ranges must be zero-length");return super.range(A,e)}};ep.prototype.mapMode=ca.TrackBefore;ep.prototype.point=!0;var kC=class t extends bt{constructor(A,e,i,n,o,r){super(e,i,o,A),this.block=n,this.isReplace=r,this.mapMode=n?e<=0?ca.TrackBefore:ca.TrackAfter:ca.TrackDel}get type(){return this.startSide!=this.endSide?ac.WidgetRange:this.startSide<=0?ac.WidgetBefore:ac.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(A){return A instanceof t&&hYe(this.widget,A.widget)&&this.block==A.block&&this.startSide==A.startSide&&this.endSide==A.endSide}range(A,e=A){if(this.isReplace&&(A>e||A==e&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&e!=A)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(A,e)}};kC.prototype.point=!0;function Kce(t,A=!1){let{inclusiveStart:e,inclusiveEnd:i}=t;return e==null&&(e=t.inclusive),i==null&&(i=t.inclusive),{start:e??A,end:i??A}}function hYe(t,A){return t==A||!!(t&&A&&t.compare(A))}function y7(t,A,e,i=0){let n=e.length-1;n>=0&&e[n]+i>=t?e[n]=Math.max(e[n],A):e.push(t,A)}var Ca=class t extends rr{constructor(){super(...arguments),this.children=[],this.length=0,this.prevAttrs=void 0,this.attrs=null,this.breakAfter=0}merge(A,e,i,n,o,r){if(i){if(!(i instanceof t))return!1;this.dom||i.transferDOM(this)}return n&&this.setDeco(i?i.attrs:null),_ce(this,A,e,i?i.children.slice():[],o,r),!0}split(A){let e=new t;if(e.breakAfter=this.breakAfter,this.length==0)return e;let{i,off:n}=this.childPos(A);n&&(e.append(this.children[i].split(n),0),this.children[i].merge(n,this.children[i].length,null,!1,0,0),i++);for(let o=i;o0&&this.children[i-1].length==0;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=A,e}transferDOM(A){this.dom&&(this.markDirty(),A.setDOM(this.dom),A.prevAttrs=this.prevAttrs===void 0?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(A){_7(this.attrs,A)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=A)}append(A,e){Fce(this,A,e)}addLineDeco(A){let e=A.spec.attributes,i=A.spec.class;e&&(this.attrs=iT(e,this.attrs||{})),i&&(this.attrs=iT({class:i},this.attrs||{}))}domAtPos(A){return Lce(this,A)}reuseDOM(A){A.nodeName=="DIV"&&(this.setDOM(A),this.flags|=6)}sync(A,e){var i;this.dom?this.flags&4&&(bce(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),this.prevAttrs!==void 0&&(nT(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(A,e);let n=this.dom.lastChild;for(;n&&rr.get(n)instanceof SC;)n=n.lastChild;if(!n||!this.length||n.nodeName!="BR"&&((i=rr.get(n))===null||i===void 0?void 0:i.isEditable)==!1&&(!dt.ios||!this.children.some(o=>o instanceof pd))){let o=document.createElement("BR");o.cmIgnore=!0,this.dom.appendChild(o)}}measureTextSize(){if(this.children.length==0||this.length>20)return null;let A=0,e;for(let i of this.children){if(!(i instanceof pd)||/[^ -~]/.test(i.text))return null;let n=W3(i.dom);if(n.length!=1)return null;A+=n[0].width,e=n[0].height}return A?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:A/this.length,textHeight:e}:null}coordsAt(A,e){let i=Gce(this,A,e);if(!this.children.length&&i&&this.parent){let{heightOracle:n}=this.parent.view.viewState,o=i.bottom-i.top;if(Math.abs(o-n.lineHeight)<2&&n.textHeight=e){if(o instanceof t)return o;if(r>e)break}n=r+o.breakAfter}return null}},Gu=class t extends rr{constructor(A,e,i){super(),this.widget=A,this.length=e,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(A,e,i,n,o,r){return i&&(!(i instanceof t)||!this.widget.compare(i.widget)||A>0&&o<=0||e0}},Ap=class extends Ql{constructor(A){super(),this.height=A}toDOM(){let A=document.createElement("div");return A.className="cm-gap",this.updateDOM(A),A}eq(A){return A.height==this.height}updateDOM(A){return A.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}},Y3=class t{constructor(A,e,i,n){this.doc=A,this.pos=e,this.end=i,this.disallowBlockEffectsFor=n,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=A.iter(),this.skip=e}posCovered(){if(this.content.length==0)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let A=this.content[this.content.length-1];return!(A.breakAfter||A instanceof Gu&&A.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new Ca),this.atCursorPos=!0),this.curLine}flushBuffer(A=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(I7(new X3(-1),A),A.length),this.pendingBuffer=0)}addBlockWidget(A){this.flushBuffer(),this.curLine=null,this.content.push(A)}finish(A){this.pendingBuffer&&A<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,!this.posCovered()&&!(A&&this.content.length&&this.content[this.content.length-1]instanceof Gu)&&this.getLine()}buildText(A,e,i){for(;A>0;){if(this.textOff==this.text.length){let{value:o,lineBreak:r,done:s}=this.cursor.next(this.skip);if(this.skip=0,s)throw new Error("Ran out of text content when drawing inline views");if(r){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,A--;continue}else this.text=o,this.textOff=0}let n=Math.min(this.text.length-this.textOff,A,512);this.flushBuffer(e.slice(e.length-i)),this.getLine().append(I7(new pd(this.text.slice(this.textOff,this.textOff+n)),e),i),this.atCursorPos=!0,this.textOff+=n,A-=n,i=0}}span(A,e,i,n){this.buildText(e-A,i,n),this.pos=e,this.openStart<0&&(this.openStart=n)}point(A,e,i,n,o,r){if(this.disallowBlockEffectsFor[r]&&i instanceof kC){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(e>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let s=e-A;if(i instanceof kC)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new Gu(i.widget||Oae.block,s,i));else{let a=Z3.create(i.widget||Oae.inline,s,s?0:i.startSide),c=this.atCursorPos&&!a.isEditable&&o<=n.length&&(A0),l=!a.isEditable&&(An.length||i.startSide<=0),d=this.getLine();this.pendingBuffer==2&&!c&&!a.isEditable&&(this.pendingBuffer=0),this.flushBuffer(n),c&&(d.append(I7(new X3(1),n),o),o=n.length+Math.max(0,o-n.length)),d.append(I7(a,n),o),this.atCursorPos=l,this.pendingBuffer=l?An.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=n.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);s&&(this.textOff+s<=this.text.length?this.textOff+=s:(this.skip+=s-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=e),this.openStart<0&&(this.openStart=o)}static build(A,e,i,n,o){let r=new t(A,e,i,o);return r.openEnd=To.spans(n,e,i,r),r.openStart<0&&(r.openStart=r.openEnd),r.finish(r.openEnd),r}};function I7(t,A){for(let e of A)t=new SC(e,[t],t.length);return t}var Oae=(()=>{class t extends Ql{constructor(e){super(),this.tag=e}eq(e){return e.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(e){return e.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}return t.inline=new t("span"),t.block=new t("div"),t})(),Oo=function(t){return t[t.LTR=0]="LTR",t[t.RTL=1]="RTL",t}(Oo||(Oo={})),Tu=Oo.LTR,UT=Oo.RTL;function Uce(t){let A=[];for(let e=0;e=e){if(s.level==i)return r;(o<0||(n!=0?n<0?s.frome:A[o].level>s.level))&&(o=r)}}if(o<0)throw new RangeError("Index out of range");return o}};function Oce(t,A){if(t.length!=A.length)return!1;for(let e=0;e=0;h-=3)if(Bd[h+1]==-I){let B=Bd[h+2],f=B&2?n:B&4?B&1?o:n:0;f&&(Xo[d]=Xo[Bd[h]]=f),s=h;break}}else{if(Bd.length==189)break;Bd[s++]=d,Bd[s++]=C,Bd[s++]=a}else if((u=Xo[d])==2||u==1){let h=u==n;a=h?0:1;for(let B=s-3;B>=0;B-=3){let f=Bd[B+2];if(f&2)break;if(h)Bd[B+2]|=2;else{if(f&4)break;Bd[B+2]|=4}}}}}function pYe(t,A,e,i){for(let n=0,o=i;n<=e.length;n++){let r=n?e[n-1].to:t,s=na;)u==B&&(u=e[--h].from,B=h?e[h-1].to:t),Xo[--u]=I;a=l}else o=c,a++}}}function rT(t,A,e,i,n,o,r){let s=i%2?2:1;if(i%2==n%2)for(let a=A,c=0;aa&&r.push(new fd(a,h.from,I));let B=h.direction==Tu!=!(I%2);sT(t,B?i+1:i,n,h.inner,h.from,h.to,r),a=h.to}u=h.to}else{if(u==e||(l?Xo[u]!=s:Xo[u]==s))break;u++}C?rT(t,a,u,i+1,n,C,r):aA;){let l=!0,d=!1;if(!c||a>o[c-1].to){let h=Xo[a-1];h!=s&&(l=!1,d=h==16)}let C=!l&&s==1?[]:null,I=l?i:i+1,u=a;e:for(;;)if(c&&u==o[c-1].to){if(d)break e;let h=o[--c];if(!l)for(let B=h.from,f=c;;){if(B==A)break e;if(f&&o[f-1].to==B)B=o[--f].from;else{if(Xo[B-1]==s)break e;break}}if(C)C.push(h);else{h.toXo.length;)Xo[Xo.length]=256;let i=[],n=A==Tu?0:1;return sT(t,n,n,e,0,t.length,i),i}function Jce(t){return[new fd(0,t,0)]}var Yce="";function yYe(t,A,e,i,n){var o;let r=i.head-t.from,s=fd.find(A,r,(o=i.bidiLevel)!==null&&o!==void 0?o:-1,i.assoc),a=A[s],c=a.side(n,e);if(r==c){let C=s+=n?1:-1;if(C<0||C>=A.length)return null;a=A[s=C],r=a.side(!n,e),c=a.side(n,e)}let l=Cs(t.text,r,a.forward(n,e));(la.to)&&(l=c),Yce=t.text.slice(Math.min(r,l),Math.max(r,l));let d=s==(n?A.length-1:0)?null:A[s+(n?1:-1)];return d&&l==c&&d.level+(n?0:1)t.some(A=>A)}),Wce=rt.define({combine:t=>t.some(A=>A)}),Zce=rt.define(),H3=class t{constructor(A,e="nearest",i="nearest",n=5,o=5,r=!1){this.range=A,this.y=e,this.x=i,this.yMargin=n,this.xMargin=o,this.isSnapshot=r}map(A){return A.empty?this:new t(this.range.map(A),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(A){return this.range.to<=A.doc.length?this:new t(fA.cursor(A.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},u7=tn.define({map:(t,A)=>t.map(A)}),Xce=tn.define();function Js(t,A,e){let i=t.facet(jce);i.length?i[0](A):window.onerror&&window.onerror(String(A),e,void 0,void 0,A)||(e?console.error(e+":",A):console.error(A))}var G2=rt.define({combine:t=>t.length?t[0]:!0}),vYe=0,lf=rt.define({combine(t){return t.filter((A,e)=>{for(let i=0;i{let a=[];return r&&a.push(tp.of(c=>{let l=c.plugin(s);return l?r(l):bt.none})),o&&a.push(o(s)),a})}static fromClass(A,e){return t.define((i,n)=>new A(i,n),e)}},z3=class{constructor(A){this.spec=A,this.mustUpdate=null,this.value=null}get plugin(){return this.spec&&this.spec.plugin}update(A){if(this.value){if(this.mustUpdate){let e=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(e)}catch(i){if(Js(e.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch{}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.plugin.create(A,this.spec.arg)}catch(e){Js(A.state,e,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(A){var e;if(!((e=this.value)===null||e===void 0)&&e.destroy)try{this.value.destroy()}catch(i){Js(A.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},Yae=rt.define(),aT=rt.define(),tp=rt.define(),$ce=rt.define(),j7=rt.define(),ele=rt.define();function Hae(t,A){let e=t.state.facet(ele);if(!e.length)return e;let i=e.map(o=>o instanceof Function?o(t):o),n=[];return To.spans(i,A.from,A.to,{point(){},span(o,r,s,a){let c=o-A.from,l=r-A.from,d=n;for(let C=s.length-1;C>=0;C--,a--){let I=s[C].spec.bidiIsolate,u;if(I==null&&(I=DYe(A.text,c,l)),a>0&&d.length&&(u=d[d.length-1]).to==c&&u.direction==I)u.to=l,d=u.inner;else{let h={from:c,to:l,direction:I,inner:[]};d.push(h),d=h.inner}}}}),n}var Ale=rt.define();function JT(t){let A=0,e=0,i=0,n=0;for(let o of t.state.facet(Ale)){let r=o(t);r&&(r.left!=null&&(A=Math.max(A,r.left)),r.right!=null&&(e=Math.max(e,r.right)),r.top!=null&&(i=Math.max(i,r.top)),r.bottom!=null&&(n=Math.max(n,r.bottom)))}return{left:A,right:e,top:i,bottom:n}}var G3=rt.define(),Qd=class t{constructor(A,e,i,n){this.fromA=A,this.toA=e,this.fromB=i,this.toB=n}join(A){return new t(Math.min(this.fromA,A.fromA),Math.max(this.toA,A.toA),Math.min(this.fromB,A.fromB),Math.max(this.toB,A.toB))}addToSet(A){let e=A.length,i=this;for(;e>0;e--){let n=A[e-1];if(!(n.fromA>i.toA)){if(n.toAl)break;o+=2}if(!a)return i;new t(a.fromA,a.toA,a.fromB,a.toB).addToSet(i),r=a.toA,s=a.toB}}},R7=class t{constructor(A,e,i){this.view=A,this.state=e,this.transactions=i,this.flags=0,this.startState=A.state,this.changes=la.empty(this.startState.doc.length);for(let o of i)this.changes=this.changes.compose(o.changes);let n=[];this.changes.iterChangedRanges((o,r,s,a)=>n.push(new Qd(o,r,s,a))),this.changedRanges=n}static create(A,e,i){return new t(A,e,i)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(A=>A.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},N7=class extends rr{get length(){return this.view.state.doc.length}constructor(A){super(),this.view=A,this.decorations=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.markedForComposition=new Set,this.editContextFormatting=bt.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.setDOM(A.contentDOM),this.children=[new Ca],this.children[0].setParent(this),this.updateDeco(),this.updateInner([new Qd(0,0,0,A.state.doc.length)],0,null)}update(A){var e;let i=A.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:c,toA:l})=>lthis.minWidthTo)?(this.minWidthFrom=A.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=A.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(A);let n=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((e=this.domChanged)===null||e===void 0)&&e.newSel?n=this.domChanged.newSel.head:!RYe(A.changes,this.hasComposition)&&!A.selectionSet&&(n=A.state.selection.main.head));let o=n>-1?MYe(this.view,A.changes,n):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:c,to:l}=this.hasComposition;i=new Qd(c,l,A.changes.mapPos(c,-1),A.changes.mapPos(l,1)).addToSet(i.slice())}this.hasComposition=o?{from:o.range.fromB,to:o.range.toB}:null,(dt.ie||dt.chrome)&&!o&&A&&A.state.doc.lines!=A.startState.doc.lines&&(this.forceSelection=!0);let r=this.decorations,s=this.updateDeco(),a=xYe(r,s,A.changes);return i=Qd.extendWithRanges(i,a),!(this.flags&7)&&i.length==0?!1:(this.updateInner(i,A.startState.doc.length,o),A.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(A,e,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(A,e,i);let{observer:n}=this.view;n.ignore(()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let r=dt.chrome||dt.ios?{node:n.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,r),this.flags&=-8,r&&(r.written||n.selectionRange.focusNode!=r.node)&&(this.forceSelection=!0),this.dom.style.height=""}),this.markedForComposition.forEach(r=>r.flags&=-9);let o=[];if(this.view.viewport.from||this.view.viewport.to=0?n[r]:null;if(!s)break;let{fromA:a,toA:c,fromB:l,toB:d}=s,C,I,u,h;if(i&&i.range.fromBl){let S=Y3.build(this.view.state.doc,l,i.range.fromB,this.decorations,this.dynamicDecorationMap),w=Y3.build(this.view.state.doc,i.range.toB,d,this.decorations,this.dynamicDecorationMap);I=S.breakAtStart,u=S.openStart,h=w.openEnd;let _=this.compositionView(i);w.breakAtStart?_.breakAfter=1:w.content.length&&_.merge(_.length,_.length,w.content[0],!1,w.openStart,0)&&(_.breakAfter=w.content[0].breakAfter,w.content.shift()),S.content.length&&_.merge(0,0,S.content[S.content.length-1],!0,0,S.openEnd)&&S.content.pop(),C=S.content.concat(_).concat(w.content)}else({content:C,breakAtStart:I,openStart:u,openEnd:h}=Y3.build(this.view.state.doc,l,d,this.decorations,this.dynamicDecorationMap));let{i:B,off:f}=o.findPos(c,1),{i:b,off:k}=o.findPos(a,-1);xce(this,b,k,B,f,C,I,u,h)}i&&this.fixCompositionDOM(i)}updateEditContextFormatting(A){this.editContextFormatting=this.editContextFormatting.map(A.changes);for(let e of A.transactions)for(let i of e.effects)i.is(Xce)&&(this.editContextFormatting=i.value)}compositionView(A){let e=new pd(A.text.nodeValue);e.flags|=8;for(let{deco:n}of A.marks)e=new SC(n,[e],e.length);let i=new Ca;return i.append(e,0),i}fixCompositionDOM(A){let e=(o,r)=>{r.flags|=8|(r.children.some(a=>a.flags&7)?1:0),this.markedForComposition.add(r);let s=rr.get(o);s&&s!=r&&(s.dom=null),r.setDOM(o)},i=this.childPos(A.range.fromB,1),n=this.children[i.i];e(A.line,n);for(let o=A.marks.length-1;o>=-1;o--)i=n.childPos(i.off,1),n=n.children[i.i],e(o>=0?A.marks[o].node:A.text,n)}updateSelection(A=!1,e=!1){(A||!this.view.observer.selectionRange.focusNode)&&this.view.observer.readSelectionRange();let i=this.view.root.activeElement,n=i==this.dom,o=!n&&!(this.view.state.facet(G2)||this.dom.tabIndex>-1)&&w7(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(n||e||o))return;let r=this.forceSelection;this.forceSelection=!1;let s=this.view.state.selection.main,a=this.moveToLine(this.domAtPos(s.anchor)),c=s.empty?a:this.moveToLine(this.domAtPos(s.head));if(dt.gecko&&s.empty&&!this.hasComposition&&bYe(a)){let d=document.createTextNode("");this.view.observer.ignore(()=>a.node.insertBefore(d,a.node.childNodes[a.offset]||null)),a=c=new sc(d,0),r=!0}let l=this.view.observer.selectionRange;(r||!l.focusNode||(!J3(a.node,a.offset,l.anchorNode,l.anchorOffset)||!J3(c.node,c.offset,l.focusNode,l.focusOffset))&&!this.suppressWidgetCursorChange(l,s))&&(this.view.observer.ignore(()=>{dt.android&&dt.chrome&&this.dom.contains(l.focusNode)&&_Ye(l.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let d=q3(this.view.root);if(d)if(s.empty){if(dt.gecko){let C=SYe(a.node,a.offset);if(C&&C!=3){let I=(C==1?Sce:kce)(a.node,a.offset);I&&(a=new sc(I.node,I.offset))}}d.collapse(a.node,a.offset),s.bidiLevel!=null&&d.caretBidiLevel!==void 0&&(d.caretBidiLevel=s.bidiLevel)}else if(d.extend){d.collapse(a.node,a.offset);try{d.extend(c.node,c.offset)}catch{}}else{let C=document.createRange();s.anchor>s.head&&([a,c]=[c,a]),C.setEnd(c.node,c.offset),C.setStart(a.node,a.offset),d.removeAllRanges(),d.addRange(C)}o&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())}),this.view.observer.setSelectionRange(a,c)),this.impreciseAnchor=a.precise?null:new sc(l.anchorNode,l.anchorOffset),this.impreciseHead=c.precise?null:new sc(l.focusNode,l.focusOffset)}suppressWidgetCursorChange(A,e){return this.hasComposition&&e.empty&&J3(A.focusNode,A.focusOffset,A.anchorNode,A.anchorOffset)&&this.posFromDOM(A.focusNode,A.focusOffset)==e.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:A}=this,e=A.state.selection.main,i=q3(A.root),{anchorNode:n,anchorOffset:o}=A.observer.selectionRange;if(!i||!e.empty||!e.assoc||!i.modify)return;let r=Ca.find(this,e.head);if(!r)return;let s=r.posAtStart;if(e.head==s||e.head==s+r.length)return;let a=this.coordsAt(e.head,-1),c=this.coordsAt(e.head,1);if(!a||!c||a.bottom>c.top)return;let l=this.domAtPos(e.head+e.assoc);i.collapse(l.node,l.offset),i.modify("move",e.assoc<0?"forward":"backward","lineboundary"),A.observer.readSelectionRange();let d=A.observer.selectionRange;A.docView.posFromDOM(d.anchorNode,d.anchorOffset)!=e.from&&i.collapse(n,o)}moveToLine(A){let e=this.dom,i;if(A.node!=e)return A;for(let n=A.offset;!i&&n=0;n--){let o=rr.get(e.childNodes[n]);o instanceof Ca&&(i=o.domAtPos(o.length))}return i?new sc(i.node,i.offset,!0):A}nearest(A){for(let e=A;e;){let i=rr.get(e);if(i&&i.rootView==this)return i;e=e.parentNode}return null}posFromDOM(A,e){let i=this.nearest(A);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(A,e)+i.posAtStart}domAtPos(A){let{i:e,off:i}=this.childCursor().findPos(A,-1);for(;e=0;r--){let s=this.children[r],a=o-s.breakAfter,c=a-s.length;if(aA||s.covers(1))&&(!i||s instanceof Ca&&!(i instanceof Ca&&e>=0)))i=s,n=c;else if(i&&c==A&&a==A&&s instanceof Gu&&Math.abs(e)<2){if(s.deco.startSide<0)break;r&&(i=null)}o=c}return i?i.coordsAt(A-n,e):null}coordsForChar(A){let{i:e,off:i}=this.childPos(A,1),n=this.children[e];if(!(n instanceof Ca))return null;for(;n.children.length;){let{i:s,off:a}=n.childPos(i,1);for(;;s++){if(s==n.children.length)return null;if((n=n.children[s]).length)break}i=a}if(!(n instanceof pd))return null;let o=Cs(n.text,i);if(o==i)return null;let r=Uu(n.dom,i,o).getClientRects();for(let s=0;sMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,s=-1,a=this.view.textDirection==Oo.LTR;for(let c=0,l=0;ln)break;if(c>=i){let I=d.dom.getBoundingClientRect();if(e.push(I.height),r){let u=d.dom.lastChild,h=u?W3(u):[];if(h.length){let B=h[h.length-1],f=a?B.right-I.left:I.right-B.left;f>s&&(s=f,this.minWidth=o,this.minWidthFrom=c,this.minWidthTo=C)}}}c=C+d.breakAfter}return e}textDirectionAt(A){let{i:e}=this.childPos(A,1);return getComputedStyle(this.children[e].dom).direction=="rtl"?Oo.RTL:Oo.LTR}measureTextSize(){for(let o of this.children)if(o instanceof Ca){let r=o.measureTextSize();if(r)return r}let A=document.createElement("div"),e,i,n;return A.className="cm-line",A.style.width="99999px",A.style.position="absolute",A.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.dom.appendChild(A);let o=W3(A.firstChild)[0];e=A.getBoundingClientRect().height,i=o?o.width/27:7,n=o?o.height:e,A.remove()}),{lineHeight:e,charWidth:i,textHeight:n}}childCursor(A=this.length){let e=this.children.length;return e&&(A-=this.children[--e].length),new x7(this.children,A,e)}computeBlockGapDeco(){let A=[],e=this.view.viewState;for(let i=0,n=0;;n++){let o=n==e.viewports.length?null:e.viewports[n],r=o?o.from-1:this.length;if(r>i){let s=(e.lineBlockAt(r).bottom-e.lineBlockAt(i).top)/this.view.scaleY;A.push(bt.replace({widget:new Ap(s),block:!0,inclusive:!0,isBlockGap:!0}).range(i,r))}if(!o)break;i=o.to+1}return bt.set(A)}updateDeco(){let A=1,e=this.view.state.facet(tp).map(o=>(this.dynamicDecorationMap[A++]=typeof o=="function")?o(this.view):o),i=!1,n=this.view.state.facet($ce).map((o,r)=>{let s=typeof o=="function";return s&&(i=!0),s?o(this.view):o});for(n.length&&(this.dynamicDecorationMap[A++]=i,e.push(To.join(n))),this.decorations=[this.editContextFormatting,...e,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];Ae.anchor?-1:1),n;if(!i)return;!e.empty&&(n=this.coordsAt(e.anchor,e.anchor>e.head?-1:1))&&(i={left:Math.min(i.left,n.left),top:Math.min(i.top,n.top),right:Math.max(i.right,n.right),bottom:Math.max(i.bottom,n.bottom)});let o=JT(this.view),r={left:i.left-o.left,top:i.top-o.top,right:i.right+o.right,bottom:i.bottom+o.bottom},{offsetWidth:s,offsetHeight:a}=this.view.scrollDOM;sYe(this.view.scrollDOM,r,e.head{iA.from&&(e=!0)}),e}function NYe(t,A,e=1){let i=t.charCategorizer(A),n=t.doc.lineAt(A),o=A-n.from;if(n.length==0)return fA.cursor(A);o==0?e=1:o==n.length&&(e=-1);let r=o,s=o;e<0?r=Cs(n.text,o,!1):s=Cs(n.text,o);let a=i(n.text.slice(r,s));for(;r>0;){let c=Cs(n.text,r,!1);if(i(n.text.slice(c,r))!=a)break;r=c}for(;st?A.left-t:Math.max(0,t-A.right)}function FYe(t,A){return A.top>t?A.top-t:Math.max(0,t-A.bottom)}function zU(t,A){return t.topA.top+1}function zae(t,A){return At.bottom?{top:t.top,left:t.left,right:t.right,bottom:A}:t}function cT(t,A,e){let i,n,o,r,s=!1,a,c,l,d;for(let u=t.firstChild;u;u=u.nextSibling){let h=W3(u);for(let B=0;Bk||r==k&&o>b)&&(i=u,n=f,o=b,r=k,s=b?A0:Bf.bottom&&(!l||l.bottomf.top)&&(c=u,d=f):l&&zU(l,f)?l=Pae(l,f.bottom):d&&zU(d,f)&&(d=zae(d,f.top))}}if(l&&l.bottom>=e?(i=a,n=l):d&&d.top<=e&&(i=c,n=d),!i)return{node:t,offset:0};let C=Math.max(n.left,Math.min(n.right,A));if(i.nodeType==3)return jae(i,C,e);if(s&&i.contentEditable!="false")return cT(i,C,e);let I=Array.prototype.indexOf.call(t.childNodes,i)+(A>=(n.left+n.right)/2?1:0);return{node:t,offset:I}}function jae(t,A,e){let i=t.nodeValue.length,n=-1,o=1e9,r=0;for(let s=0;se?l.top-e:e-l.bottom)-1;if(l.left-1<=A&&l.right+1>=A&&d=(l.left+l.right)/2,I=C;if((dt.chrome||dt.gecko)&&Uu(t,s).getBoundingClientRect().left==l.right&&(I=!C),d<=0)return{node:t,offset:s+(I?1:0)};n=s+(I?1:0),o=d}}}return{node:t,offset:n>-1?n:r>0?t.nodeValue.length:0}}function ile(t,A,e,i=-1){var n,o;let r=t.contentDOM.getBoundingClientRect(),s=r.top+t.viewState.paddingTop,a,{docHeight:c}=t.viewState,{x:l,y:d}=A,C=d-s;if(C<0)return 0;if(C>c)return t.state.doc.length;for(let S=t.viewState.heightOracle.textHeight/2,w=!1;a=t.elementAtHeight(C),a.type!=ac.Text;)for(;C=i>0?a.bottom+S:a.top-S,!(C>=0&&C<=c);){if(w)return e?null:0;w=!0,i=-i}d=s+C;let I=a.from;if(It.viewport.to)return t.viewport.to==t.state.doc.length?t.state.doc.length:e?null:Vae(t,r,a,l,d);let u=t.dom.ownerDocument,h=t.root.elementFromPoint?t.root:u,B=h.elementFromPoint(l,d);B&&!t.contentDOM.contains(B)&&(B=null),B||(l=Math.max(r.left+1,Math.min(r.right-1,l)),B=h.elementFromPoint(l,d),B&&!t.contentDOM.contains(B)&&(B=null));let f,b=-1;if(B&&((n=t.docView.nearest(B))===null||n===void 0?void 0:n.isEditable)!=!1){if(u.caretPositionFromPoint){let S=u.caretPositionFromPoint(l,d);S&&({offsetNode:f,offset:b}=S)}else if(u.caretRangeFromPoint){let S=u.caretRangeFromPoint(l,d);S&&({startContainer:f,startOffset:b}=S,(!t.contentDOM.contains(f)||dt.safari&&GYe(f,b,l)||dt.chrome&&KYe(f,b,l))&&(f=void 0))}f&&(b=Math.min(md(f),b))}if(!f||!t.docView.dom.contains(f)){let S=Ca.find(t.docView,I);if(!S)return C>a.top+a.height/2?a.to:a.from;({node:f,offset:b}=cT(S.dom,l,d))}let k=t.docView.nearest(f);if(!k)return null;if(k.isWidget&&((o=k.dom)===null||o===void 0?void 0:o.nodeType)==1){let S=k.dom.getBoundingClientRect();return A.yt.defaultLineHeight*1.5){let s=t.viewState.heightOracle.textHeight,a=Math.floor((n-e.top-(t.defaultLineHeight-s)*.5)/s);o+=a*t.viewState.heightOracle.lineLength}let r=t.state.sliceDoc(e.from,e.to);return e.from+d7(r,o,t.state.tabSize)}function GYe(t,A,e){let i,n=t;if(t.nodeType!=3||A!=(i=t.nodeValue.length))return!1;for(;;){let o=n.nextSibling;if(o){if(o.nodeName=="BR")break;return!1}else{let r=n.parentNode;if(!r||r.nodeName=="DIV")break;n=r}}return Uu(t,i-1,i).getBoundingClientRect().right>e}function KYe(t,A,e){if(A!=0)return!1;for(let n=t;;){let o=n.parentNode;if(!o||o.nodeType!=1||o.firstChild!=n)return!1;if(o.classList.contains("cm-line"))break;n=o}let i=t.nodeType==1?t.getBoundingClientRect():Uu(t,0,Math.max(t.nodeValue.length,1)).getBoundingClientRect();return e-i.left>5}function lT(t,A,e){let i=t.lineBlockAt(A);if(Array.isArray(i.type)){let n;for(let o of i.type){if(o.from>A)break;if(!(o.toA)return o;(!n||o.type==ac.Text&&(n.type!=o.type||(e<0?o.fromA)))&&(n=o)}}return n||i}return i}function UYe(t,A,e,i){let n=lT(t,A.head,A.assoc||-1),o=!i||n.type!=ac.Text||!(t.lineWrapping||n.widgetLineBreaks)?null:t.coordsAtPos(A.assoc<0&&A.head>n.from?A.head-1:A.head);if(o){let r=t.dom.getBoundingClientRect(),s=t.textDirectionAt(n.from),a=t.posAtCoords({x:e==(s==Oo.LTR)?r.right-1:r.left+1,y:(o.top+o.bottom)/2});if(a!=null)return fA.cursor(a,e?-1:1)}return fA.cursor(e?n.to:n.from,e?-1:1)}function qae(t,A,e,i){let n=t.state.doc.lineAt(A.head),o=t.bidiSpans(n),r=t.textDirectionAt(n.from);for(let s=A,a=null;;){let c=yYe(n,o,r,s,e),l=Yce;if(!c){if(n.number==(e?t.state.doc.lines:1))return s;l=` +`,n=t.state.doc.line(n.number+(e?1:-1)),o=t.bidiSpans(n),c=t.visualLineSide(n,!e)}if(a){if(!a(l))return s}else{if(!i)return c;a=i(l)}s=c}}function TYe(t,A,e){let i=t.state.charCategorizer(A),n=i(e);return o=>{let r=i(o);return n==Uo.Space&&(n=r),n==r}}function OYe(t,A,e,i){let n=A.head,o=e?1:-1;if(n==(e?t.state.doc.length:0))return fA.cursor(n,A.assoc);let r=A.goalColumn,s,a=t.contentDOM.getBoundingClientRect(),c=t.coordsAtPos(n,A.assoc||-1),l=t.documentTop;if(c)r==null&&(r=c.left-a.left),s=o<0?c.top:c.bottom;else{let I=t.viewState.lineBlockAt(n);r==null&&(r=Math.min(a.right-a.left,t.defaultCharacterWidth*(n-I.from))),s=(o<0?I.top:I.bottom)+l}let d=a.left+r,C=i??t.viewState.heightOracle.textHeight>>1;for(let I=0;;I+=10){let u=s+(C+I)*o,h=ile(t,{x:d,y:u},!1,o);if(ua.bottom||(o<0?hn)){let B=t.docView.coordsForChar(h),f=!B||u{if(A>o&&An(t)),e.from,A.head>e.from?-1:1);return i==e.from?e:fA.cursor(i,io)&&this.lineBreak(),n=r}return this.findPointBefore(i,e),this}readTextNode(A){let e=A.nodeValue;for(let i of this.points)i.node==A&&(i.pos=this.text.length+Math.min(i.offset,e.length));for(let i=0,n=this.lineSeparator?null:/\r\n?|\n/g;;){let o=-1,r=1,s;if(this.lineSeparator?(o=e.indexOf(this.lineSeparator,i),r=this.lineSeparator.length):(s=n.exec(e))&&(o=s.index,r=s[0].length),this.append(e.slice(i,o<0?e.length:o)),o<0)break;if(this.lineBreak(),r>1)for(let a of this.points)a.node==A&&a.pos>this.text.length&&(a.pos-=r-1);i=o+r}}readNode(A){if(A.cmIgnore)return;let e=rr.get(A),i=e&&e.overrideDOMText;if(i!=null){this.findPointInside(A,i.length);for(let n=i.iter();!n.next().done;)n.lineBreak?this.lineBreak():this.append(n.value)}else A.nodeType==3?this.readTextNode(A):A.nodeName=="BR"?A.nextSibling&&this.lineBreak():A.nodeType==1&&this.readRange(A.firstChild,null)}findPointBefore(A,e){for(let i of this.points)i.node==A&&A.childNodes[i.offset]==e&&(i.pos=this.text.length)}findPointInside(A,e){for(let i of this.points)(A.nodeType==3?i.node==A:A.contains(i.node))&&(i.pos=this.text.length+(JYe(A,i.node,i.offset)?e:0))}};function JYe(t,A,e){for(;;){if(!A||e-1;let{impreciseHead:o,impreciseAnchor:r}=A.docView;if(A.state.readOnly&&e>-1)this.newSel=null;else if(e>-1&&(this.bounds=A.docView.domBoundsAround(e,i,0))){let s=o||r?[]:zYe(A),a=new gT(s,A.state);a.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=a.text,this.newSel=PYe(s,this.bounds.from)}else{let s=A.observer.selectionRange,a=o&&o.node==s.focusNode&&o.offset==s.focusOffset||!XU(A.contentDOM,s.focusNode)?A.state.selection.main.head:A.docView.posFromDOM(s.focusNode,s.focusOffset),c=r&&r.node==s.anchorNode&&r.offset==s.anchorOffset||!XU(A.contentDOM,s.anchorNode)?A.state.selection.main.anchor:A.docView.posFromDOM(s.anchorNode,s.anchorOffset),l=A.viewport;if((dt.ios||dt.chrome)&&A.state.selection.main.empty&&a!=c&&(l.from>0||l.toDate.now()-100?t.inputState.lastKeyCode:-1;if(A.bounds){let{from:r,to:s}=A.bounds,a=n.from,c=null;(o===8||dt.android&&A.text.length=n.from&&e.to<=n.to&&(e.from!=n.from||e.to!=n.to)&&n.to-n.from-(e.to-e.from)<=4?e={from:n.from,to:n.to,insert:t.state.doc.slice(n.from,e.from).append(e.insert).append(t.state.doc.slice(e.to,n.to))}:dt.chrome&&e&&e.from==e.to&&e.from==n.head&&e.insert.toString()==` + `&&t.lineWrapping&&(i&&(i=fA.single(i.main.anchor-1,i.main.head-1)),e={from:n.from,to:n.to,insert:Dn.of([" "])}),e)return YT(t,e,i,o);if(i&&!i.main.eq(n)){let r=!1,s="select";return t.inputState.lastSelectionTime>Date.now()-50&&(t.inputState.lastSelectionOrigin=="select"&&(r=!0),s=t.inputState.lastSelectionOrigin,s=="select.pointer"&&(i=nle(t.state.facet(j7).map(a=>a(t)),i))),t.dispatch({selection:i,scrollIntoView:r,userEvent:s}),!0}else return!1}function YT(t,A,e,i=-1){if(dt.ios&&t.inputState.flushIOSKey(A))return!0;let n=t.state.selection.main;if(dt.android&&(A.to==n.to&&(A.from==n.from||A.from==n.from-1&&t.state.sliceDoc(A.from,n.from)==" ")&&A.insert.length==1&&A.insert.lines==2&&If(t.contentDOM,"Enter",13)||(A.from==n.from-1&&A.to==n.to&&A.insert.length==0||i==8&&A.insert.lengthn.head)&&If(t.contentDOM,"Backspace",8)||A.from==n.from&&A.to==n.to+1&&A.insert.length==0&&If(t.contentDOM,"Delete",46)))return!0;let o=A.insert.toString();t.inputState.composing>=0&&t.inputState.composing++;let r,s=()=>r||(r=YYe(t,A,e));return t.state.facet(Vce).some(a=>a(t,A.from,A.to,o,s))||t.dispatch(s()),!0}function YYe(t,A,e){let i,n=t.state,o=n.selection.main;if(A.from>=o.from&&A.to<=o.to&&A.to-A.from>=(o.to-o.from)/3&&(!e||e.main.empty&&e.main.from==A.from+A.insert.length)&&t.inputState.composing<0){let s=o.fromA.to?n.sliceDoc(A.to,o.to):"";i=n.replaceSelection(t.state.toText(s+A.insert.sliceString(0,void 0,t.state.lineBreak)+a))}else{let s=n.changes(A),a=e&&e.main.to<=s.newLength?e.main:void 0;if(n.selection.ranges.length>1&&t.inputState.composing>=0&&A.to<=o.to&&A.to>=o.to-10){let c=t.state.sliceDoc(A.from,A.to),l,d=e&&tle(t,e.main.head);if(d){let u=A.insert.length-(A.to-A.from);l={from:d.from,to:d.to-u}}else l=t.state.doc.lineAt(o.head);let C=o.to-A.to,I=o.to-o.from;i=n.changeByRange(u=>{if(u.from==o.from&&u.to==o.to)return{changes:s,range:a||u.map(s)};let h=u.to-C,B=h-c.length;if(u.to-u.from!=I||t.state.sliceDoc(B,h)!=c||u.to>=l.from&&u.from<=l.to)return{range:u};let f=n.changes({from:B,to:h,insert:A.insert}),b=u.to-o.to;return{changes:f,range:a?fA.range(Math.max(0,a.anchor+b),Math.max(0,a.head+b)):u.map(f)}})}else i={changes:s,selection:a&&n.selection.replaceRange(a)}}let r="input.type";return(t.composing||t.inputState.compositionPendingChange&&t.inputState.compositionEndedAt>Date.now()-50)&&(t.inputState.compositionPendingChange=!1,r+=".compose",t.inputState.compositionFirstChange&&(r+=".start",t.inputState.compositionFirstChange=!1)),n.update(i,{userEvent:r,scrollIntoView:!0})}function HYe(t,A,e,i){let n=Math.min(t.length,A.length),o=0;for(;o0&&s>0&&t.charCodeAt(r-1)==A.charCodeAt(s-1);)r--,s--;if(i=="end"){let a=Math.max(0,o-Math.min(r,s));e-=r+a-o}if(r=r?o-e:0;o-=a,s=o+(s-r),r=o}else if(s=s?o-e:0;o-=a,r=o+(r-s),s=o}return{from:o,toA:r,toB:s}}function zYe(t){let A=[];if(t.root.activeElement!=t.contentDOM)return A;let{anchorNode:e,anchorOffset:i,focusNode:n,focusOffset:o}=t.observer.selectionRange;return e&&(A.push(new L7(e,i)),(n!=e||o!=i)&&A.push(new L7(n,o))),A}function PYe(t,A){if(t.length==0)return null;let e=t[0].pos,i=t.length==2?t[1].pos:e;return e>-1&&i>-1?fA.single(e+A,i+A):null}var CT=class{setSelectionOrigin(A){this.lastSelectionOrigin=A,this.lastSelectionTime=Date.now()}constructor(A){this.view=A,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=A.hasFocus,dt.safari&&A.contentDOM.addEventListener("input",()=>null),dt.gecko&&sHe(A.contentDOM.ownerDocument)}handleEvent(A){!$Ye(this.view,A)||this.ignoreDuringComposition(A)||A.type=="keydown"&&this.keydown(A)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(A.type,A)):this.runHandlers(A.type,A))}runHandlers(A,e){let i=this.handlers[A];if(i){for(let n of i.observers)n(this.view,e);for(let n of i.handlers){if(e.defaultPrevented)break;if(n(this.view,e)){e.preventDefault();break}}}}ensureHandlers(A){let e=jYe(A),i=this.handlers,n=this.view.contentDOM;for(let o in e)if(o!="scroll"){let r=!e[o].handlers.length,s=i[o];s&&r!=!s.handlers.length&&(n.removeEventListener(o,this.handleEvent),s=null),s||n.addEventListener(o,this.handleEvent,{passive:r})}for(let o in i)o!="scroll"&&!e[o]&&n.removeEventListener(o,this.handleEvent);this.handlers=e}keydown(A){if(this.lastKeyCode=A.keyCode,this.lastKeyTime=Date.now(),A.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&A.keyCode!=27&&sle.indexOf(A.keyCode)<0&&(this.tabFocusMode=-1),dt.android&&dt.chrome&&!A.synthetic&&(A.keyCode==13||A.keyCode==8))return this.view.observer.delayAndroidKey(A.key,A.keyCode),!0;let e;return dt.ios&&!A.synthetic&&!A.altKey&&!A.metaKey&&((e=rle.find(i=>i.keyCode==A.keyCode))&&!A.ctrlKey||VYe.indexOf(A.key)>-1&&A.ctrlKey&&!A.shiftKey)?(this.pendingIOSKey=e||A,setTimeout(()=>this.flushIOSKey(),250),!0):(A.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(A){let e=this.pendingIOSKey;return!e||e.key=="Enter"&&A&&A.from0?!0:dt.safari&&!dt.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1:!1}startMouseSelection(A){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=A}update(A){this.view.observer.update(A),this.mouseSelection&&this.mouseSelection.update(A),this.draggedContent&&A.docChanged&&(this.draggedContent=this.draggedContent.map(A.changes)),A.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function Wae(t,A){return(e,i)=>{try{return A.call(t,i,e)}catch(n){Js(e.state,n)}}}function jYe(t){let A=Object.create(null);function e(i){return A[i]||(A[i]={observers:[],handlers:[]})}for(let i of t){let n=i.spec,o=n&&n.plugin.domEventHandlers,r=n&&n.plugin.domEventObservers;if(o)for(let s in o){let a=o[s];a&&e(s).handlers.push(Wae(i.value,a))}if(r)for(let s in r){let a=r[s];a&&e(s).observers.push(Wae(i.value,a))}}for(let i in zg)e(i).handlers.push(zg[i]);for(let i in ig)e(i).observers.push(ig[i]);return A}var rle=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],VYe="dthko",sle=[16,17,18,20,91,92,224,225],h7=6;function B7(t){return Math.max(0,t)*.7+8}function qYe(t,A){return Math.max(Math.abs(t.clientX-A.clientX),Math.abs(t.clientY-A.clientY))}var IT=class{constructor(A,e,i,n){this.view=A,this.startEvent=e,this.style=i,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=e,this.scrollParents=aYe(A.contentDOM),this.atoms=A.state.facet(j7).map(r=>r(A));let o=A.contentDOM.ownerDocument;o.addEventListener("mousemove",this.move=this.move.bind(this)),o.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=e.shiftKey,this.multiple=A.state.facet(ss.allowMultipleSelections)&&WYe(A,e),this.dragging=XYe(A,e)&&lle(e)==1?null:!1}start(A){this.dragging===!1&&this.select(A)}move(A){if(A.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&qYe(this.startEvent,A)<10)return;this.select(this.lastEvent=A);let e=0,i=0,n=0,o=0,r=this.view.win.innerWidth,s=this.view.win.innerHeight;this.scrollParents.x&&({left:n,right:r}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:o,bottom:s}=this.scrollParents.y.getBoundingClientRect());let a=JT(this.view);A.clientX-a.left<=n+h7?e=-B7(n-A.clientX):A.clientX+a.right>=r-h7&&(e=B7(A.clientX-r)),A.clientY-a.top<=o+h7?i=-B7(o-A.clientY):A.clientY+a.bottom>=s-h7&&(i=B7(A.clientY-s)),this.setScrollSpeed(e,i)}up(A){this.dragging==null&&this.select(this.lastEvent),this.dragging||A.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let A=this.view.contentDOM.ownerDocument;A.removeEventListener("mousemove",this.move),A.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(A,e){this.scrollSpeed={x:A,y:e},A||e?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:A,y:e}=this.scrollSpeed;A&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=A,A=0),e&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=e,e=0),(A||e)&&this.view.win.scrollBy(A,e),this.dragging===!1&&this.select(this.lastEvent)}select(A){let{view:e}=this,i=nle(this.atoms,this.style.get(A,this.extend,this.multiple));(this.mustSelect||!i.eq(e.state.selection,this.dragging===!1))&&this.view.dispatch({selection:i,userEvent:"select.pointer"}),this.mustSelect=!1}update(A){A.transactions.some(e=>e.isUserEvent("input.type"))?this.destroy():this.style.update(A)&&setTimeout(()=>this.select(this.lastEvent),20)}};function WYe(t,A){let e=t.state.facet(Hce);return e.length?e[0](A):dt.mac?A.metaKey:A.ctrlKey}function ZYe(t,A){let e=t.state.facet(zce);return e.length?e[0](A):dt.mac?!A.altKey:!A.ctrlKey}function XYe(t,A){let{main:e}=t.state.selection;if(e.empty)return!1;let i=q3(t.root);if(!i||i.rangeCount==0)return!0;let n=i.getRangeAt(0).getClientRects();for(let o=0;o=A.clientX&&r.top<=A.clientY&&r.bottom>=A.clientY)return!0}return!1}function $Ye(t,A){if(!A.bubbles)return!0;if(A.defaultPrevented)return!1;for(let e=A.target,i;e!=t.contentDOM;e=e.parentNode)if(!e||e.nodeType==11||(i=rr.get(e))&&i.ignoreEvent(A))return!1;return!0}var zg=Object.create(null),ig=Object.create(null),ale=dt.ie&&dt.ie_version<15||dt.ios&&dt.webkit_version<604;function eHe(t){let A=t.dom.parentNode;if(!A)return;let e=A.appendChild(document.createElement("textarea"));e.style.cssText="position: fixed; left: -10000px; top: 10px",e.focus(),setTimeout(()=>{t.focus(),e.remove(),cle(t,e.value)},50)}function V7(t,A,e){for(let i of t.facet(A))e=i(e,t);return e}function cle(t,A){A=V7(t.state,TT,A);let{state:e}=t,i,n=1,o=e.toText(A),r=o.lines==e.selection.ranges.length;if(uT!=null&&e.selection.ranges.every(a=>a.empty)&&uT==o.toString()){let a=-1;i=e.changeByRange(c=>{let l=e.doc.lineAt(c.from);if(l.from==a)return{range:c};a=l.from;let d=e.toText((r?o.line(n++).text:A)+e.lineBreak);return{changes:{from:l.from,insert:d},range:fA.cursor(c.from+d.length)}})}else r?i=e.changeByRange(a=>{let c=o.line(n++);return{changes:{from:a.from,to:a.to,insert:c.text},range:fA.cursor(a.from+c.length)}}):i=e.replaceSelection(o);t.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}ig.scroll=t=>{t.inputState.lastScrollTop=t.scrollDOM.scrollTop,t.inputState.lastScrollLeft=t.scrollDOM.scrollLeft};zg.keydown=(t,A)=>(t.inputState.setSelectionOrigin("select"),A.keyCode==27&&t.inputState.tabFocusMode!=0&&(t.inputState.tabFocusMode=Date.now()+2e3),!1);ig.touchstart=(t,A)=>{t.inputState.lastTouchTime=Date.now(),t.inputState.setSelectionOrigin("select.pointer")};ig.touchmove=t=>{t.inputState.setSelectionOrigin("select.pointer")};zg.mousedown=(t,A)=>{if(t.observer.flush(),t.inputState.lastTouchTime>Date.now()-2e3)return!1;let e=null;for(let i of t.state.facet(Pce))if(e=i(t,A),e)break;if(!e&&A.button==0&&(e=iHe(t,A)),e){let i=!t.hasFocus;t.inputState.startMouseSelection(new IT(t,A,e,i)),i&&t.observer.ignore(()=>{vce(t.contentDOM);let o=t.root.activeElement;o&&!o.contains(t.contentDOM)&&o.blur()});let n=t.inputState.mouseSelection;if(n)return n.start(A),n.dragging===!1}else t.inputState.setSelectionOrigin("select.pointer");return!1};function Zae(t,A,e,i){if(i==1)return fA.cursor(A,e);if(i==2)return NYe(t.state,A,e);{let n=Ca.find(t.docView,A),o=t.state.doc.lineAt(n?n.posAtEnd:A),r=n?n.posAtStart:o.from,s=n?n.posAtEnd:o.to;return sA>=e.top&&A<=e.bottom&&t>=e.left&&t<=e.right;function AHe(t,A,e,i){let n=Ca.find(t.docView,A);if(!n)return 1;let o=A-n.posAtStart;if(o==0)return 1;if(o==n.length)return-1;let r=n.coordsAt(o,-1);if(r&&Xae(e,i,r))return-1;let s=n.coordsAt(o,1);return s&&Xae(e,i,s)?1:r&&r.bottom>=i?-1:1}function $ae(t,A){let e=t.posAtCoords({x:A.clientX,y:A.clientY},!1);return{pos:e,bias:AHe(t,e,A.clientX,A.clientY)}}var tHe=dt.ie&&dt.ie_version<=11,ece=null,Ace=0,tce=0;function lle(t){if(!tHe)return t.detail;let A=ece,e=tce;return ece=t,tce=Date.now(),Ace=!A||e>Date.now()-400&&Math.abs(A.clientX-t.clientX)<2&&Math.abs(A.clientY-t.clientY)<2?(Ace+1)%3:1}function iHe(t,A){let e=$ae(t,A),i=lle(A),n=t.state.selection;return{update(o){o.docChanged&&(e.pos=o.changes.mapPos(e.pos),n=n.map(o.changes))},get(o,r,s){let a=$ae(t,o),c,l=Zae(t,a.pos,a.bias,i);if(e.pos!=a.pos&&!r){let d=Zae(t,e.pos,e.bias,i),C=Math.min(d.from,l.from),I=Math.max(d.to,l.to);l=C1&&(c=nHe(n,a.pos))?c:s?n.addRange(l):fA.create([l])}}}function nHe(t,A){for(let e=0;e=A)return fA.create(t.ranges.slice(0,e).concat(t.ranges.slice(e+1)),t.mainIndex==e?0:t.mainIndex-(t.mainIndex>e?1:0))}return null}zg.dragstart=(t,A)=>{let{selection:{main:e}}=t.state;if(A.target.draggable){let n=t.docView.nearest(A.target);if(n&&n.isWidget){let o=n.posAtStart,r=o+n.length;(o>=e.to||r<=e.from)&&(e=fA.range(o,r))}}let{inputState:i}=t;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=e,A.dataTransfer&&(A.dataTransfer.setData("Text",V7(t.state,OT,t.state.sliceDoc(e.from,e.to))),A.dataTransfer.effectAllowed="copyMove"),!1};zg.dragend=t=>(t.inputState.draggedContent=null,!1);function ice(t,A,e,i){if(e=V7(t.state,TT,e),!e)return;let n=t.posAtCoords({x:A.clientX,y:A.clientY},!1),{draggedContent:o}=t.inputState,r=i&&o&&ZYe(t,A)?{from:o.from,to:o.to}:null,s={from:n,insert:e},a=t.state.changes(r?[r,s]:s);t.focus(),t.dispatch({changes:a,selection:{anchor:a.mapPos(n,-1),head:a.mapPos(n,1)},userEvent:r?"move.drop":"input.drop"}),t.inputState.draggedContent=null}zg.drop=(t,A)=>{if(!A.dataTransfer)return!1;if(t.state.readOnly)return!0;let e=A.dataTransfer.files;if(e&&e.length){let i=Array(e.length),n=0,o=()=>{++n==e.length&&ice(t,A,i.filter(r=>r!=null).join(t.state.lineBreak),!1)};for(let r=0;r{/[\x00-\x08\x0e-\x1f]{2}/.test(s.result)||(i[r]=s.result),o()},s.readAsText(e[r])}return!0}else{let i=A.dataTransfer.getData("Text");if(i)return ice(t,A,i,!0),!0}return!1};zg.paste=(t,A)=>{if(t.state.readOnly)return!0;t.observer.flush();let e=ale?null:A.clipboardData;return e?(cle(t,e.getData("text/plain")||e.getData("text/uri-list")),!0):(eHe(t),!1)};function oHe(t,A){let e=t.dom.parentNode;if(!e)return;let i=e.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=A,i.focus(),i.selectionEnd=A.length,i.selectionStart=0,setTimeout(()=>{i.remove(),t.focus()},50)}function rHe(t){let A=[],e=[],i=!1;for(let n of t.selection.ranges)n.empty||(A.push(t.sliceDoc(n.from,n.to)),e.push(n));if(!A.length){let n=-1;for(let{from:o}of t.selection.ranges){let r=t.doc.lineAt(o);r.number>n&&(A.push(r.text),e.push({from:r.from,to:Math.min(t.doc.length,r.to+1)})),n=r.number}i=!0}return{text:V7(t,OT,A.join(t.lineBreak)),ranges:e,linewise:i}}var uT=null;zg.copy=zg.cut=(t,A)=>{let{text:e,ranges:i,linewise:n}=rHe(t.state);if(!e&&!n)return!1;uT=n?e:null,A.type=="cut"&&!t.state.readOnly&&t.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let o=ale?null:A.clipboardData;return o?(o.clearData(),o.setData("text/plain",e),!0):(oHe(t,e),!1)};var gle=Fc.define();function dle(t,A){let e=[];for(let i of t.facet(qce)){let n=i(t,A);n&&e.push(n)}return e.length?t.update({effects:e,annotations:gle.of(!0)}):null}function Cle(t){setTimeout(()=>{let A=t.hasFocus;if(A!=t.inputState.notifiedFocused){let e=dle(t.state,A);e?t.dispatch(e):t.update([])}},10)}ig.focus=t=>{t.inputState.lastFocusTime=Date.now(),!t.scrollDOM.scrollTop&&(t.inputState.lastScrollTop||t.inputState.lastScrollLeft)&&(t.scrollDOM.scrollTop=t.inputState.lastScrollTop,t.scrollDOM.scrollLeft=t.inputState.lastScrollLeft),Cle(t)};ig.blur=t=>{t.observer.clearSelectionRange(),Cle(t)};ig.compositionstart=ig.compositionupdate=t=>{t.observer.editContext||(t.inputState.compositionFirstChange==null&&(t.inputState.compositionFirstChange=!0),t.inputState.composing<0&&(t.inputState.composing=0))};ig.compositionend=t=>{t.observer.editContext||(t.inputState.composing=-1,t.inputState.compositionEndedAt=Date.now(),t.inputState.compositionPendingKey=!0,t.inputState.compositionPendingChange=t.observer.pendingRecords().length>0,t.inputState.compositionFirstChange=null,dt.chrome&&dt.android?t.observer.flushSoon():t.inputState.compositionPendingChange?Promise.resolve().then(()=>t.observer.flush()):setTimeout(()=>{t.inputState.composing<0&&t.docView.hasComposition&&t.update([])},50))};ig.contextmenu=t=>{t.inputState.lastContextMenu=Date.now()};zg.beforeinput=(t,A)=>{var e,i;if(A.inputType=="insertReplacementText"&&t.observer.editContext){let o=(e=A.dataTransfer)===null||e===void 0?void 0:e.getData("text/plain"),r=A.getTargetRanges();if(o&&r.length){let s=r[0],a=t.posAtDOM(s.startContainer,s.startOffset),c=t.posAtDOM(s.endContainer,s.endOffset);return YT(t,{from:a,to:c,insert:t.state.toText(o)},null),!0}}let n;if(dt.chrome&&dt.android&&(n=rle.find(o=>o.inputType==A.inputType))&&(t.observer.delayAndroidKey(n.key,n.keyCode),n.key=="Backspace"||n.key=="Delete")){let o=((i=window.visualViewport)===null||i===void 0?void 0:i.height)||0;setTimeout(()=>{var r;(((r=window.visualViewport)===null||r===void 0?void 0:r.height)||0)>o+10&&t.hasFocus&&(t.contentDOM.blur(),t.focus())},100)}return dt.ios&&A.inputType=="deleteContentForward"&&t.observer.flushSoon(),dt.safari&&A.inputType=="insertText"&&t.inputState.composing>=0&&setTimeout(()=>ig.compositionend(t,A),20),!1};var nce=new Set;function sHe(t){nce.has(t)||(nce.add(t),t.addEventListener("copy",()=>{}),t.addEventListener("cut",()=>{}))}var oce=["pre-wrap","normal","pre-line","break-spaces"],uf=!1;function rce(){uf=!1}var hT=class{constructor(A){this.lineWrapping=A,this.doc=Dn.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(A,e){let i=this.doc.lineAt(e).number-this.doc.lineAt(A).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((e-A-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(A){return this.lineWrapping?(1+Math.max(0,Math.ceil((A-this.lineLength)/Math.max(1,this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(A){return this.doc=A,this}mustRefreshForWrapping(A){return oce.indexOf(A)>-1!=this.lineWrapping}mustRefreshForHeights(A){let e=!1;for(let i=0;i-1,a=Math.round(e)!=Math.round(this.lineHeight)||this.lineWrapping!=s;if(this.lineWrapping=s,this.lineHeight=e,this.charWidth=i,this.textHeight=n,this.lineLength=o,a){this.heightSamples={};for(let c=0;c0}set outdated(A){this.flags=(A?2:0)|this.flags&-3}setHeight(A){this.height!=A&&(Math.abs(this.height-A)>v7&&(uf=!0),this.height=A)}replace(A,e,i){return t.of(i)}decomposeLeft(A,e){e.push(this)}decomposeRight(A,e){e.push(this)}applyChanges(A,e,i,n){let o=this,r=i.doc;for(let s=n.length-1;s>=0;s--){let{fromA:a,toA:c,fromB:l,toB:d}=n[s],C=o.lineAt(a,Br.ByPosNoHeight,i.setDoc(e),0,0),I=C.to>=c?C:o.lineAt(c,Br.ByPosNoHeight,i,0,0);for(d+=I.to-c,c=I.to;s>0&&C.from<=n[s-1].toA;)a=n[s-1].fromA,l=n[s-1].fromB,s--,ao*2){let s=A[e-1];s.break?A.splice(--e,1,s.left,null,s.right):A.splice(--e,1,s.left,s.right),i+=1+s.break,n-=s.size}else if(o>n*2){let s=A[i];s.break?A.splice(i,1,s.left,null,s.right):A.splice(i,1,s.left,s.right),i+=2+s.break,o-=s.size}else break;else if(n=o&&r(this.blockAt(0,i,n,o))}updateHeight(A,e=0,i=!1,n){return n&&n.from<=e&&n.more&&this.setHeight(n.heights[n.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}},tg=class t extends G7{constructor(A,e){super(A,e,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(A,e,i,n){return new Ed(n,this.length,i,this.height,this.breaks)}replace(A,e,i){let n=i[0];return i.length==1&&(n instanceof t||n instanceof MC&&n.flags&4)&&Math.abs(this.length-n.length)<10?(n instanceof MC?n=new t(n.length,this.height):n.height=this.height,this.outdated||(n.outdated=!1),n):fl.of(i)}updateHeight(A,e=0,i=!1,n){return n&&n.from<=e&&n.more?this.setHeight(n.heights[n.index++]):(i||this.outdated)&&this.setHeight(Math.max(this.widgetHeight,A.heightForLine(this.length-this.collapsed))+this.breaks*A.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},MC=class t extends fl{constructor(A){super(A,0)}heightMetrics(A,e){let i=A.doc.lineAt(e).number,n=A.doc.lineAt(e+this.length).number,o=n-i+1,r,s=0;if(A.lineWrapping){let a=Math.min(this.height,A.lineHeight*o);r=a/o,this.length>o+1&&(s=(this.height-a)/(this.length-o-1))}else r=this.height/o;return{firstLine:i,lastLine:n,perLine:r,perChar:s}}blockAt(A,e,i,n){let{firstLine:o,lastLine:r,perLine:s,perChar:a}=this.heightMetrics(e,n);if(e.lineWrapping){let c=n+(A0){let o=i[i.length-1];o instanceof t?i[i.length-1]=new t(o.length+n):i.push(null,new t(n-1))}if(A>0){let o=i[0];o instanceof t?i[0]=new t(A+o.length):i.unshift(new t(A-1),null)}return fl.of(i)}decomposeLeft(A,e){e.push(new t(A-1),null)}decomposeRight(A,e){e.push(null,new t(this.length-A-1))}updateHeight(A,e=0,i=!1,n){let o=e+this.length;if(n&&n.from<=e+this.length&&n.more){let r=[],s=Math.max(e,n.from),a=-1;for(n.from>e&&r.push(new t(n.from-e-1).updateHeight(A,e));s<=o&&n.more;){let l=A.doc.lineAt(s).length;r.length&&r.push(null);let d=n.heights[n.index++];a==-1?a=d:Math.abs(d-a)>=v7&&(a=-2);let C=new tg(l,d);C.outdated=!1,r.push(C),s+=l+1}s<=o&&r.push(null,new t(o-s).updateHeight(A,s));let c=fl.of(r);return(a<0||Math.abs(c.height-this.height)>=v7||Math.abs(a-this.heightMetrics(A,e).perLine)>=v7)&&(uf=!0),F7(this,c)}else(i||this.outdated)&&(this.setHeight(A.heightForGap(e,e+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},ET=class extends fl{constructor(A,e,i){super(A.length+e+i.length,A.height+i.height,e|(A.outdated||i.outdated?2:0)),this.left=A,this.right=i,this.size=A.size+i.size}get break(){return this.flags&1}blockAt(A,e,i,n){let o=i+this.left.height;return As))return c;let l=e==Br.ByPosNoHeight?Br.ByPosNoHeight:Br.ByPos;return a?c.join(this.right.lineAt(s,l,i,r,s)):this.left.lineAt(s,l,i,n,o).join(c)}forEachLine(A,e,i,n,o,r){let s=n+this.left.height,a=o+this.left.length+this.break;if(this.break)A=a&&this.right.forEachLine(A,e,i,s,a,r);else{let c=this.lineAt(a,Br.ByPos,i,n,o);A=A&&c.from<=e&&r(c),e>c.to&&this.right.forEachLine(c.to+1,e,i,s,a,r)}}replace(A,e,i){let n=this.left.length+this.break;if(ethis.left.length)return this.balanced(this.left,this.right.replace(A-n,e-n,i));let o=[];A>0&&this.decomposeLeft(A,o);let r=o.length;for(let s of i)o.push(s);if(A>0&&sce(o,r-1),e=i&&e.push(null)),A>i&&this.right.decomposeLeft(A-i,e)}decomposeRight(A,e){let i=this.left.length,n=i+this.break;if(A>=n)return this.right.decomposeRight(A-n,e);A2*e.size||e.size>2*A.size?fl.of(this.break?[A,null,e]:[A,e]):(this.left=F7(this.left,A),this.right=F7(this.right,e),this.setHeight(A.height+e.height),this.outdated=A.outdated||e.outdated,this.size=A.size+e.size,this.length=A.length+this.break+e.length,this)}updateHeight(A,e=0,i=!1,n){let{left:o,right:r}=this,s=e+o.length+this.break,a=null;return n&&n.from<=e+o.length&&n.more?a=o=o.updateHeight(A,e,i,n):o.updateHeight(A,e,i),n&&n.from<=s+r.length&&n.more?a=r=r.updateHeight(A,s,i,n):r.updateHeight(A,s,i),a?this.balanced(o,r):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function sce(t,A){let e,i;t[A]==null&&(e=t[A-1])instanceof MC&&(i=t[A+1])instanceof MC&&t.splice(A-1,3,new MC(e.length+1+i.length))}var aHe=5,fT=class t{constructor(A,e){this.pos=A,this.oracle=e,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=A}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(A,e){if(this.lineStart>-1){let i=Math.min(e,this.lineEnd),n=this.nodes[this.nodes.length-1];n instanceof tg?n.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new tg(i-this.pos,-1)),this.writtenTo=i,e>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=e}point(A,e,i){if(A=aHe)&&this.addLineDeco(n,o,r)}else e>A&&this.span(A,e);this.lineEnd>-1&&this.lineEnd-1)return;let{from:A,to:e}=this.oracle.doc.lineAt(this.pos);this.lineStart=A,this.lineEnd=e,this.writtenToA&&this.nodes.push(new tg(this.pos-A,-1)),this.writtenTo=this.pos}blankContent(A,e){let i=new MC(e-A);return this.oracle.doc.lineAt(A).to==e&&(i.flags|=4),i}ensureLine(){this.enterLine();let A=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(A instanceof tg)return A;let e=new tg(0,-1);return this.nodes.push(e),e}addBlock(A){this.enterLine();let e=A.deco;e&&e.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(A),this.writtenTo=this.pos=this.pos+A.length,e&&e.endSide>0&&(this.covering=A)}addLineDeco(A,e,i){let n=this.ensureLine();n.length+=i,n.collapsed+=i,n.widgetHeight=Math.max(n.widgetHeight,A),n.breaks+=e,this.writtenTo=this.pos=this.pos+i}finish(A){let e=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(e instanceof tg)&&!this.isCovered?this.nodes.push(new tg(0,-1)):(this.writtenTol.clientHeight||l.scrollWidth>l.clientWidth)&&d.overflow!="visible"){let C=l.getBoundingClientRect();o=Math.max(o,C.left),r=Math.min(r,C.right),s=Math.max(s,C.top),a=Math.min(c==t.parentNode?n.innerHeight:a,C.bottom)}c=d.position=="absolute"||d.position=="fixed"?l.offsetParent:l.parentNode}else if(c.nodeType==11)c=c.host;else break;return{left:o-e.left,right:Math.max(o,r)-e.left,top:s-(e.top+A),bottom:Math.max(s,a)-(e.top+A)}}function gHe(t){let A=t.getBoundingClientRect(),e=t.ownerDocument.defaultView||window;return A.left0&&A.top0}function dHe(t,A){let e=t.getBoundingClientRect();return{left:0,right:e.right-e.left,top:A,bottom:e.bottom-(e.top+A)}}var P3=class{constructor(A,e,i,n){this.from=A,this.to=e,this.size=i,this.displaySize=n}static same(A,e){if(A.length!=e.length)return!1;for(let i=0;itypeof i!="function"&&i.class=="cm-lineWrapping");this.heightOracle=new hT(e),this.stateDeco=A.facet(tp).filter(i=>typeof i!="function"),this.heightMap=fl.empty().applyChanges(this.stateDeco,Dn.empty,this.heightOracle.setDoc(A.doc),[new Qd(0,0,0,A.doc.length)]);for(let i=0;i<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());i++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=bt.set(this.lineGaps.map(i=>i.draw(this,!1))),this.computeVisibleRanges()}updateForViewport(){let A=[this.viewport],{main:e}=this.state.selection;for(let i=0;i<=1;i++){let n=i?e.head:e.anchor;if(!A.some(({from:o,to:r})=>n>=o&&n<=r)){let{from:o,to:r}=this.lineBlockAt(n);A.push(new gf(o,r))}}return this.viewports=A.sort((i,n)=>i.from-n.from),this.updateScaler()}updateScaler(){let A=this.scaler;return this.scaler=this.heightMap.height<=7e6?ace:new pT(this.heightOracle,this.heightMap,this.viewports),A.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,A=>{this.viewportLines.push(T3(A,this.scaler))})}update(A,e=null){this.state=A.state;let i=this.stateDeco;this.stateDeco=this.state.facet(tp).filter(l=>typeof l!="function");let n=A.changedRanges,o=Qd.extendWithRanges(n,cHe(i,this.stateDeco,A?A.changes:la.empty(this.state.doc.length))),r=this.heightMap.height,s=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);rce(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,A.startState.doc,this.heightOracle.setDoc(this.state.doc),o),(this.heightMap.height!=r||uf)&&(A.flags|=2),s?(this.scrollAnchorPos=A.changes.mapPos(s.from,-1),this.scrollAnchorHeight=s.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=r);let a=o.length?this.mapViewport(this.viewport,A.changes):this.viewport;(e&&(e.range.heada.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,e));let c=a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,A.flags|=this.updateForViewport(),(c||!A.changes.empty||A.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,A.changes))),A.flags|=this.computeVisibleRanges(A.changes),e&&(this.scrollTarget=e),!this.mustEnforceCursorAssoc&&A.selectionSet&&A.view.lineWrapping&&A.state.selection.main.empty&&A.state.selection.main.assoc&&!A.state.facet(Wce)&&(this.mustEnforceCursorAssoc=!0)}measure(A){let e=A.contentDOM,i=window.getComputedStyle(e),n=this.heightOracle,o=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?Oo.RTL:Oo.LTR;let r=this.heightOracle.mustRefreshForWrapping(o),s=e.getBoundingClientRect(),a=r||this.mustMeasureContent||this.contentDOMHeight!=s.height;this.contentDOMHeight=s.height,this.mustMeasureContent=!1;let c=0,l=0;if(s.width&&s.height){let{scaleX:S,scaleY:w}=Dce(e,s);(S>.005&&Math.abs(this.scaleX-S)>.005||w>.005&&Math.abs(this.scaleY-w)>.005)&&(this.scaleX=S,this.scaleY=w,c|=16,r=a=!0)}let d=(parseInt(i.paddingTop)||0)*this.scaleY,C=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=d||this.paddingBottom!=C)&&(this.paddingTop=d,this.paddingBottom=C,c|=18),this.editorWidth!=A.scrollDOM.clientWidth&&(n.lineWrapping&&(a=!0),this.editorWidth=A.scrollDOM.clientWidth,c|=16);let I=A.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=I&&(this.scrollAnchorHeight=-1,this.scrollTop=I),this.scrolledToBottom=Mce(A.scrollDOM);let u=(this.printing?dHe:lHe)(e,this.paddingTop),h=u.top-this.pixelViewport.top,B=u.bottom-this.pixelViewport.bottom;this.pixelViewport=u;let f=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(f!=this.inView&&(this.inView=f,f&&(a=!0)),!this.inView&&!this.scrollTarget&&!gHe(A.dom))return 0;let b=s.width;if((this.contentDOMWidth!=b||this.editorHeight!=A.scrollDOM.clientHeight)&&(this.contentDOMWidth=s.width,this.editorHeight=A.scrollDOM.clientHeight,c|=16),a){let S=A.docView.measureVisibleLineHeights(this.viewport);if(n.mustRefreshForHeights(S)&&(r=!0),r||n.lineWrapping&&Math.abs(b-this.contentDOMWidth)>n.charWidth){let{lineHeight:w,charWidth:_,textHeight:K}=A.docView.measureTextSize();r=w>0&&n.refresh(o,w,_,K,Math.max(5,b/_),S),r&&(A.docView.minWidth=0,c|=16)}h>0&&B>0?l=Math.max(h,B):h<0&&B<0&&(l=Math.min(h,B)),rce();for(let w of this.viewports){let _=w.from==this.viewport.from?S:A.docView.measureVisibleLineHeights(w);this.heightMap=(r?fl.empty().applyChanges(this.stateDeco,Dn.empty,this.heightOracle,[new Qd(0,0,0,A.state.doc.length)]):this.heightMap).updateHeight(n,0,r,new BT(w.from,_))}uf&&(c|=2)}let k=!this.viewportIsAppropriate(this.viewport,l)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return k&&(c&2&&(c|=this.updateScaler()),this.viewport=this.getViewport(l,this.scrollTarget),c|=this.updateForViewport()),(c&2||k)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(r?[]:this.lineGaps,A)),c|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,A.docView.enforceCursorAssoc()),c}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(A,e){let i=.5-Math.max(-.5,Math.min(.5,A/1e3/2)),n=this.heightMap,o=this.heightOracle,{visibleTop:r,visibleBottom:s}=this,a=new gf(n.lineAt(r-i*1e3,Br.ByHeight,o,0,0).from,n.lineAt(s+(1-i)*1e3,Br.ByHeight,o,0,0).to);if(e){let{head:c}=e.range;if(ca.to){let l=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),d=n.lineAt(c,Br.ByPos,o,0,0),C;e.y=="center"?C=(d.top+d.bottom)/2-l/2:e.y=="start"||e.y=="nearest"&&c=s+Math.max(10,Math.min(i,250)))&&n>r-2*1e3&&o>1,r=n<<1;if(this.defaultTextDirection!=Oo.LTR&&!i)return[];let s=[],a=(l,d,C,I)=>{if(d-ll&&ff.from>=C.from&&f.to<=C.to&&Math.abs(f.from-l)f.fromb));if(!B){if(dk.from<=d&&k.to>=d)){let k=e.moveToLineBoundary(fA.cursor(d),!1,!0).head;k>l&&(d=k)}let f=this.gapSize(C,l,d,I),b=i||f<2e6?f:2e6;B=new P3(l,d,f,b)}s.push(B)},c=l=>{if(l.length2e6)for(let _ of A)_.from>=l.from&&_.froml.from&&a(l.from,I,l,d),ue.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(A){let e=this.stateDeco;this.lineGaps.length&&(e=e.concat(this.lineGapDeco));let i=[];To.spans(e,this.viewport.from,this.viewport.to,{span(o,r){i.push({from:o,to:r})},point(){}},20);let n=0;if(i.length!=this.visibleRanges.length)n=12;else for(let o=0;o=this.viewport.from&&A<=this.viewport.to&&this.viewportLines.find(e=>e.from<=A&&e.to>=A)||T3(this.heightMap.lineAt(A,Br.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(A){return A>=this.viewportLines[0].top&&A<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(e=>e.top<=A&&e.bottom>=A)||T3(this.heightMap.lineAt(this.scaler.fromDOM(A),Br.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(A){let e=this.lineBlockAtHeight(A+8);return e.from>=this.viewport.from||this.viewportLines[0].top-A>200?e:this.viewportLines[0]}elementAtHeight(A){return T3(this.heightMap.blockAt(this.scaler.fromDOM(A),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},gf=class{constructor(A,e){this.from=A,this.to=e}};function CHe(t,A,e){let i=[],n=t,o=0;return To.spans(e,t,A,{span(){},point(r,s){r>n&&(i.push({from:n,to:r}),o+=r-n),n=s}},20),n=1)return A[A.length-1].to;let i=Math.floor(t*e);for(let n=0;;n++){let{from:o,to:r}=A[n],s=r-o;if(i<=s)return o+i;i-=s}}function f7(t,A){let e=0;for(let{from:i,to:n}of t.ranges){if(A<=n){e+=A-i;break}e+=n-i}return e/t.total}function IHe(t,A){for(let e of t)if(A(e))return e}var ace={toDOM(t){return t},fromDOM(t){return t},scale:1,eq(t){return t==this}},pT=class t{constructor(A,e,i){let n=0,o=0,r=0;this.viewports=i.map(({from:s,to:a})=>{let c=e.lineAt(s,Br.ByPos,A,0,0).top,l=e.lineAt(a,Br.ByPos,A,0,0).bottom;return n+=l-c,{from:s,to:a,top:c,bottom:l,domTop:0,domBottom:0}}),this.scale=(7e6-n)/(e.height-n);for(let s of this.viewports)s.domTop=r+(s.top-o)*this.scale,r=s.domBottom=s.domTop+(s.bottom-s.top),o=s.bottom}toDOM(A){for(let e=0,i=0,n=0;;e++){let o=ee.from==A.viewports[i].from&&e.to==A.viewports[i].to):!1}};function T3(t,A){if(A.scale==1)return t;let e=A.toDOM(t.top),i=A.toDOM(t.bottom);return new Ed(t.from,t.length,e,i-e,Array.isArray(t._content)?t._content.map(n=>T3(n,A)):t._content)}var Q7=rt.define({combine:t=>t.join(" ")}),jU=rt.define({combine:t=>t.indexOf(!0)>-1}),wT=Ag.newName(),Ile=Ag.newName(),ule=Ag.newName(),hle={"&light":"."+Ile,"&dark":"."+ule};function yT(t,A,e){return new Ag(A,{finish(i){return/&/.test(i)?i.replace(/&\w*/,n=>{if(n=="&")return t;if(!e||!e[n])throw new RangeError(`Unsupported selector: ${n}`);return e[n]}):t+" "+i}})}var uHe=yT("."+wT,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",zIndex:200},".cm-gutters-before":{insetInlineStart:0},".cm-gutters-after":{insetInlineEnd:0},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",border:"0px solid #ddd","&.cm-gutters-before":{borderRightWidth:"1px"},"&.cm-gutters-after":{borderLeftWidth:"1px"}},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-dialog":{padding:"2px 19px 4px 6px",position:"relative","& label":{fontSize:"80%"}},".cm-dialog-close":{position:"absolute",top:"3px",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",fontSize:"14px",padding:"0"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{backgroundImage:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%)",backgroundPosition:"center"},".cm-highlightTab":{backgroundImage:`url('data:image/svg+xml,')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},hle),hHe={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},VU=dt.ie&&dt.ie_version<=11,DT=class{constructor(A){this.view=A,this.active=!1,this.editContext=null,this.selectionRange=new $U,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=A.contentDOM,this.observer=new MutationObserver(e=>{for(let i of e)this.queue.push(i);(dt.ie&&dt.ie_version<=11||dt.ios&&A.composing)&&e.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&dt.android&&A.constructor.EDIT_CONTEXT!==!1&&!(dt.chrome&&dt.chrome_version<126)&&(this.editContext=new vT(A),A.state.facet(G2)&&(A.contentDOM.editContext=this.editContext.editContext)),VU&&(this.onCharData=e=>{this.queue.push({target:e.target,type:"characterData",oldValue:e.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var e;((e=this.view.docView)===null||e===void 0?void 0:e.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),e.length>0&&e[e.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(e=>{e.length>0&&e[e.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(A){this.view.inputState.runHandlers("scroll",A),this.intersecting&&this.view.measure()}onScroll(A){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(A)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(A){(A.type=="change"||!A.type)&&!A.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(A){if(this.gapIntersection&&(A.length!=this.gaps.length||this.gaps.some((e,i)=>e!=A[i]))){this.gapIntersection.disconnect();for(let e of A)this.gapIntersection.observe(e);this.gaps=A}}onSelectionChange(A){let e=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,n=this.selectionRange;if(i.state.facet(G2)?i.root.activeElement!=this.dom:!w7(this.dom,n))return;let o=n.anchorNode&&i.docView.nearest(n.anchorNode);if(o&&o.ignoreEvent(A)){e||(this.selectionChanged=!1);return}(dt.ie&&dt.ie_version<=11||dt.android&&dt.chrome)&&!i.state.selection.main.empty&&n.focusNode&&J3(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:A}=this,e=q3(A.root);if(!e)return!1;let i=dt.safari&&A.root.nodeType==11&&A.root.activeElement==this.dom&&BHe(this.view,e)||e;if(!i||this.selectionRange.eq(i))return!1;let n=w7(this.dom,i);return n&&!this.selectionChanged&&A.inputState.lastFocusTime>Date.now()-200&&A.inputState.lastTouchTime{let o=this.delayedAndroidKey;o&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=o.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&o.force&&If(this.dom,o.key,o.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(n)}(!this.delayedAndroidKey||A=="Enter")&&(this.delayedAndroidKey={key:A,keyCode:e,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let A of this.observer.takeRecords())this.queue.push(A);return this.queue}processRecords(){let A=this.pendingRecords();A.length&&(this.queue=[]);let e=-1,i=-1,n=!1;for(let o of A){let r=this.readMutation(o);r&&(r.typeOver&&(n=!0),e==-1?{from:e,to:i}=r:(e=Math.min(r.from,e),i=Math.max(r.to,i)))}return{from:e,to:i,typeOver:n}}readChange(){let{from:A,to:e,typeOver:i}=this.processRecords(),n=this.selectionChanged&&w7(this.dom,this.selectionRange);if(A<0&&!n)return null;A>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let o=new dT(this.view,A,e,i);return this.view.docView.domChanged={newSel:o.newSel?o.newSel.main:null},o}flush(A=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;A&&this.readSelectionRange();let e=this.readChange();if(!e)return this.view.requestMeasure(),!1;let i=this.view.state,n=ole(this.view,e);return this.view.state==i&&(e.domChanged||e.newSel&&!e.newSel.main.eq(this.view.state.selection.main))&&this.view.update([]),n}readMutation(A){let e=this.view.docView.nearest(A.target);if(!e||e.ignoreMutation(A))return null;if(e.markDirty(A.type=="attributes"),A.type=="attributes"&&(e.flags|=4),A.type=="childList"){let i=cce(e,A.previousSibling||A.target.previousSibling,-1),n=cce(e,A.nextSibling||A.target.nextSibling,1);return{from:i?e.posAfter(i):e.posAtStart,to:n?e.posBefore(n):e.posAtEnd,typeOver:!1}}else return A.type=="characterData"?{from:e.posAtStart,to:e.posAtEnd,typeOver:A.target.nodeValue==A.oldValue}:null}setWindow(A){A!=this.win&&(this.removeWindowListeners(this.win),this.win=A,this.addWindowListeners(this.win))}addWindowListeners(A){A.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):A.addEventListener("beforeprint",this.onPrint),A.addEventListener("scroll",this.onScroll),A.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(A){A.removeEventListener("scroll",this.onScroll),A.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):A.removeEventListener("beforeprint",this.onPrint),A.document.removeEventListener("selectionchange",this.onSelectionChange)}update(A){this.editContext&&(this.editContext.update(A),A.startState.facet(G2)!=A.state.facet(G2)&&(A.view.contentDOM.editContext=A.state.facet(G2)?this.editContext.editContext:null))}destroy(){var A,e,i;this.stop(),(A=this.intersection)===null||A===void 0||A.disconnect(),(e=this.gapIntersection)===null||e===void 0||e.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let n of this.scrollTargets)n.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}};function cce(t,A,e){for(;A;){let i=rr.get(A);if(i&&i.parent==t)return i;let n=A.parentNode;A=n!=t.dom?n:e>0?A.nextSibling:A.previousSibling}return null}function lce(t,A){let e=A.startContainer,i=A.startOffset,n=A.endContainer,o=A.endOffset,r=t.docView.domAtPos(t.state.selection.main.anchor);return J3(r.node,r.offset,n,o)&&([e,i,n,o]=[n,o,e,i]),{anchorNode:e,anchorOffset:i,focusNode:n,focusOffset:o}}function BHe(t,A){if(A.getComposedRanges){let n=A.getComposedRanges(t.root)[0];if(n)return lce(t,n)}let e=null;function i(n){n.preventDefault(),n.stopImmediatePropagation(),e=n.getTargetRanges()[0]}return t.contentDOM.addEventListener("beforeinput",i,!0),t.dom.ownerDocument.execCommand("indent"),t.contentDOM.removeEventListener("beforeinput",i,!0),e?lce(t,e):null}var vT=class{constructor(A){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(A.state);let e=this.editContext=new window.EditContext({text:A.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,A.state.selection.main.anchor))),selectionEnd:this.toContextPos(A.state.selection.main.head)});this.handlers.textupdate=i=>{let n=A.state.selection.main,{anchor:o,head:r}=n,s=this.toEditorPos(i.updateRangeStart),a=this.toEditorPos(i.updateRangeEnd);A.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:i.updateRangeStart,editorBase:s,drifted:!1});let c={from:s,to:a,insert:Dn.of(i.text.split(` +`))};if(c.from==this.from&&othis.to&&(c.to=o),c.from==c.to&&!c.insert.length){let l=fA.single(this.toEditorPos(i.selectionStart),this.toEditorPos(i.selectionEnd));l.main.eq(n)||A.dispatch({selection:l,userEvent:"select"});return}if((dt.mac||dt.android)&&c.from==r-1&&/^\. ?$/.test(i.text)&&A.contentDOM.getAttribute("autocorrect")=="off"&&(c={from:s,to:a,insert:Dn.of([i.text.replace("."," ")])}),this.pendingContextChange=c,!A.state.readOnly){let l=this.to-this.from+(c.to-c.from+c.insert.length);YT(A,c,fA.single(this.toEditorPos(i.selectionStart,l),this.toEditorPos(i.selectionEnd,l)))}this.pendingContextChange&&(this.revertPending(A.state),this.setSelection(A.state))},this.handlers.characterboundsupdate=i=>{let n=[],o=null;for(let r=this.toEditorPos(i.rangeStart),s=this.toEditorPos(i.rangeEnd);r{let n=[];for(let o of i.getTextFormats()){let r=o.underlineStyle,s=o.underlineThickness;if(r!="None"&&s!="None"){let a=this.toEditorPos(o.rangeStart),c=this.toEditorPos(o.rangeEnd);if(a{A.inputState.composing<0&&(A.inputState.composing=0,A.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(A.inputState.composing=-1,A.inputState.compositionFirstChange=null,this.composing){let{drifted:i}=this.composing;this.composing=null,i&&this.reset(A.state)}};for(let i in this.handlers)e.addEventListener(i,this.handlers[i]);this.measureReq={read:i=>{this.editContext.updateControlBounds(i.contentDOM.getBoundingClientRect());let n=q3(i.root);n&&n.rangeCount&&this.editContext.updateSelectionBounds(n.getRangeAt(0).getBoundingClientRect())}}}applyEdits(A){let e=0,i=!1,n=this.pendingContextChange;return A.changes.iterChanges((o,r,s,a,c)=>{if(i)return;let l=c.length-(r-o);if(n&&r>=n.to)if(n.from==o&&n.to==r&&n.insert.eq(c)){n=this.pendingContextChange=null,e+=l,this.to+=l;return}else n=null,this.revertPending(A.state);if(o+=e,r+=e,r<=this.from)this.from+=l,this.to+=l;else if(othis.to||this.to-this.from+c.length>3e4){i=!0;return}this.editContext.updateText(this.toContextPos(o),this.toContextPos(r),c.toString()),this.to+=l}e+=l}),n&&!i&&this.revertPending(A.state),!i}update(A){let e=this.pendingContextChange,i=A.startState.selection.main;this.composing&&(this.composing.drifted||!A.changes.touchesRange(i.from,i.to)&&A.transactions.some(n=>!n.isUserEvent("input.type")&&n.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=A.changes.mapPos(this.composing.editorBase)):!this.applyEdits(A)||!this.rangeIsValid(A.state)?(this.pendingContextChange=null,this.reset(A.state)):(A.docChanged||A.selectionSet||e)&&this.setSelection(A.state),(A.geometryChanged||A.docChanged||A.selectionSet)&&A.view.requestMeasure(this.measureReq)}resetRange(A){let{head:e}=A.selection.main;this.from=Math.max(0,e-1e4),this.to=Math.min(A.doc.length,e+1e4)}reset(A){this.resetRange(A),this.editContext.updateText(0,this.editContext.text.length,A.doc.sliceString(this.from,this.to)),this.setSelection(A)}revertPending(A){let e=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(e.from),this.toContextPos(e.from+e.insert.length),A.doc.sliceString(e.from,e.to))}setSelection(A){let{main:e}=A.selection,i=this.toContextPos(Math.max(this.from,Math.min(this.to,e.anchor))),n=this.toContextPos(e.head);(this.editContext.selectionStart!=i||this.editContext.selectionEnd!=n)&&this.editContext.updateSelection(i,n)}rangeIsValid(A){let{head:e}=A.selection.main;return!(this.from>0&&e-this.from<500||this.to1e4*3)}toEditorPos(A,e=this.to-this.from){A=Math.min(A,e);let i=this.composing;return i&&i.drifted?i.editorBase+(A-i.contextBase):A+this.from}toContextPos(A){let e=this.composing;return e&&e.drifted?e.contextBase+(A-e.editorBase):A-this.from}destroy(){for(let A in this.handlers)this.editContext.removeEventListener(A,this.handlers[A])}},ai=(()=>{class t{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(e={}){var i;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),e.parent&&e.parent.appendChild(this.dom);let{dispatch:n}=e;this.dispatchTransactions=e.dispatchTransactions||n&&(o=>o.forEach(r=>n(r,this)))||(o=>this.update(o)),this.dispatch=this.dispatch.bind(this),this._root=e.root||cYe(e.parent)||document,this.viewState=new K7(e.state||ss.create(e)),e.scrollTo&&e.scrollTo.is(u7)&&(this.viewState.scrollTarget=e.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(lf).map(o=>new z3(o));for(let o of this.plugins)o.update(this);this.observer=new DT(this),this.inputState=new CT(this),this.inputState.ensureHandlers(this.plugins),this.docView=new N7(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((i=document.fonts)===null||i===void 0)&&i.ready&&document.fonts.ready.then(()=>this.requestMeasure())}dispatch(...e){let i=e.length==1&&e[0]instanceof ud?e:e.length==1&&Array.isArray(e[0])?e[0]:[this.state.update(...e)];this.dispatchTransactions(i,this)}update(e){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let i=!1,n=!1,o,r=this.state;for(let I of e){if(I.startState!=r)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");r=I.state}if(this.destroyed){this.viewState.state=r;return}let s=this.hasFocus,a=0,c=null;e.some(I=>I.annotation(gle))?(this.inputState.notifiedFocused=s,a=1):s!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=s,c=dle(r,s),c||(a=1));let l=this.observer.delayedAndroidKey,d=null;if(l?(this.observer.clearDelayedAndroidKey(),d=this.observer.readChange(),(d&&!this.state.doc.eq(r.doc)||!this.state.selection.eq(r.selection))&&(d=null)):this.observer.clear(),r.facet(ss.phrases)!=this.state.facet(ss.phrases))return this.setState(r);o=R7.create(this,r,e),o.flags|=a;let C=this.viewState.scrollTarget;try{this.updateState=2;for(let I of e){if(C&&(C=C.map(I.changes)),I.scrollIntoView){let{main:u}=I.state.selection;C=new H3(u.empty?u:fA.cursor(u.head,u.head>u.anchor?-1:1))}for(let u of I.effects)u.is(u7)&&(C=u.value.clip(this.state))}this.viewState.update(o,C),this.bidiCache=U7.update(this.bidiCache,o.changes),o.empty||(this.updatePlugins(o),this.inputState.update(o)),i=this.docView.update(o),this.state.facet(G3)!=this.styleModules&&this.mountStyles(),n=this.updateAttrs(),this.showAnnouncements(e),this.docView.updateSelection(i,e.some(I=>I.isUserEvent("select.pointer")))}finally{this.updateState=0}if(o.startState.facet(Q7)!=o.state.facet(Q7)&&(this.viewState.mustMeasureContent=!0),(i||n||C||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),i&&this.docViewUpdate(),!o.empty)for(let I of this.state.facet(HU))try{I(o)}catch(u){Js(this.state,u,"update listener")}(c||d)&&Promise.resolve().then(()=>{c&&this.state==c.startState&&this.dispatch(c),d&&!ole(this,d)&&l.force&&If(this.contentDOM,l.key,l.keyCode)})}setState(e){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=e;return}this.updateState=2;let i=this.hasFocus;try{for(let n of this.plugins)n.destroy(this);this.viewState=new K7(e),this.plugins=e.facet(lf).map(n=>new z3(n)),this.pluginMap.clear();for(let n of this.plugins)n.update(this);this.docView.destroy(),this.docView=new N7(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}i&&this.focus(),this.requestMeasure()}updatePlugins(e){let i=e.startState.facet(lf),n=e.state.facet(lf);if(i!=n){let o=[];for(let r of n){let s=i.indexOf(r);if(s<0)o.push(new z3(r));else{let a=this.plugins[s];a.mustUpdate=e,o.push(a)}}for(let r of this.plugins)r.mustUpdate!=e&&r.destroy(this);this.plugins=o,this.pluginMap.clear()}else for(let o of this.plugins)o.mustUpdate=e;for(let o=0;o-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,e&&this.observer.forceFlush();let i=null,n=this.scrollDOM,o=n.scrollTop*this.scaleY,{scrollAnchorPos:r,scrollAnchorHeight:s}=this.viewState;Math.abs(o-this.viewState.scrollTop)>1&&(s=-1),this.viewState.scrollAnchorHeight=-1;try{for(let a=0;;a++){if(s<0)if(Mce(n))r=-1,s=this.viewState.heightMap.height;else{let u=this.viewState.scrollAnchorAt(o);r=u.from,s=u.top}this.updateState=1;let c=this.viewState.measure(this);if(!c&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(a>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let l=[];c&4||([this.measureRequests,l]=[l,this.measureRequests]);let d=l.map(u=>{try{return u.read(this)}catch(h){return Js(this.state,h),gce}}),C=R7.create(this,this.state,[]),I=!1;C.flags|=c,i?i.flags|=c:i=C,this.updateState=2,C.empty||(this.updatePlugins(C),this.inputState.update(C),this.updateAttrs(),I=this.docView.update(C),I&&this.docViewUpdate());for(let u=0;u1||h<-1){o=o+h,n.scrollTop=o/this.scaleY,s=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(i&&!i.empty)for(let a of this.state.facet(HU))a(i)}get themeClasses(){return wT+" "+(this.state.facet(jU)?ule:Ile)+" "+this.state.facet(Q7)}updateAttrs(){let e=dce(this,Yae,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),i={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(G2)?"true":"false",class:"cm-content",style:`${dt.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(i["aria-readonly"]="true"),dce(this,aT,i);let n=this.observer.ignore(()=>{let o=nT(this.contentDOM,this.contentAttrs,i),r=nT(this.dom,this.editorAttrs,e);return o||r});return this.editorAttrs=e,this.contentAttrs=i,n}showAnnouncements(e){let i=!0;for(let n of e)for(let o of n.effects)if(o.is(t.announce)){i&&(this.announceDOM.textContent=""),i=!1;let r=this.announceDOM.appendChild(document.createElement("div"));r.textContent=o.value}}mountStyles(){this.styleModules=this.state.facet(G3);let e=this.state.facet(t.cspNonce);Ag.mount(this.root,this.styleModules.concat(uHe).reverse(),e?{nonce:e}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn't allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(e){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),e){if(this.measureRequests.indexOf(e)>-1)return;if(e.key!=null){for(let i=0;in.plugin==e)||null),i&&i.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(e){return this.readMeasured(),this.viewState.elementAtHeight(e)}lineBlockAtHeight(e){return this.readMeasured(),this.viewState.lineBlockAtHeight(e)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(e){return this.viewState.lineBlockAt(e)}get contentHeight(){return this.viewState.contentHeight}moveByChar(e,i,n){return PU(this,e,qae(this,e,i,n))}moveByGroup(e,i){return PU(this,e,qae(this,e,i,n=>TYe(this,e.head,n)))}visualLineSide(e,i){let n=this.bidiSpans(e),o=this.textDirectionAt(e.from),r=n[i?n.length-1:0];return fA.cursor(r.side(i,o)+e.from,r.forward(!i,o)?1:-1)}moveToLineBoundary(e,i,n=!0){return UYe(this,e,i,n)}moveVertically(e,i,n){return PU(this,e,OYe(this,e,i,n))}domAtPos(e){return this.docView.domAtPos(e)}posAtDOM(e,i=0){return this.docView.posFromDOM(e,i)}posAtCoords(e,i=!0){return this.readMeasured(),ile(this,e,i)}coordsAtPos(e,i=1){this.readMeasured();let n=this.docView.coordsAt(e,i);if(!n||n.left==n.right)return n;let o=this.state.doc.lineAt(e),r=this.bidiSpans(o),s=r[fd.find(r,e-o.from,-1,i)];return z7(n,s.dir==Oo.LTR==i>0)}coordsForChar(e){return this.readMeasured(),this.docView.coordsForChar(e)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(e){return!this.state.facet(Jae)||ethis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(e))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(e){if(e.length>EHe)return Jce(e.length);let i=this.textDirectionAt(e.from),n;for(let r of this.bidiCache)if(r.from==e.from&&r.dir==i&&(r.fresh||Oce(r.isolates,n=Hae(this,e))))return r.order;n||(n=Hae(this,e));let o=wYe(e.text,i,n);return this.bidiCache.push(new U7(e.from,e.to,i,n,!0,o)),o}get hasFocus(){var e;return(this.dom.ownerDocument.hasFocus()||dt.safari&&((e=this.inputState)===null||e===void 0?void 0:e.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{vce(this.contentDOM),this.docView.updateSelection()})}setRoot(e){this._root!=e&&(this._root=e,this.observer.setWindow((e.nodeType==9?e:e.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let e of this.plugins)e.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(e,i={}){return u7.of(new H3(typeof e=="number"?fA.cursor(e):e,i.y,i.x,i.yMargin,i.xMargin))}scrollSnapshot(){let{scrollTop:e,scrollLeft:i}=this.scrollDOM,n=this.viewState.scrollAnchorAt(e);return u7.of(new H3(fA.cursor(n.from),"start","start",n.top-e,i,!0))}setTabFocusMode(e){e==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof e=="boolean"?this.inputState.tabFocusMode=e?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+e)}static domEventHandlers(e){return Jo.define(()=>({}),{eventHandlers:e})}static domEventObservers(e){return Jo.define(()=>({}),{eventObservers:e})}static theme(e,i){let n=Ag.newName(),o=[Q7.of(n),G3.of(yT(`.${n}`,e))];return i&&i.dark&&o.push(jU.of(!0)),o}static baseTheme(e){return Hg.lowest(G3.of(yT("."+wT,e,hle)))}static findFromDOM(e){var i;let n=e.querySelector(".cm-content"),o=n&&rr.get(n)||rr.get(e);return((i=o?.rootView)===null||i===void 0?void 0:i.view)||null}}return t.styleModule=G3,t.inputHandler=Vce,t.clipboardInputFilter=TT,t.clipboardOutputFilter=OT,t.scrollHandler=Zce,t.focusChangeEffect=qce,t.perLineTextDirection=Jae,t.exceptionSink=jce,t.updateListener=HU,t.editable=G2,t.mouseSelectionStyle=Pce,t.dragMovesSelection=zce,t.clickAddsSelectionRange=Hce,t.decorations=tp,t.outerDecorations=$ce,t.atomicRanges=j7,t.bidiIsolatedRanges=ele,t.scrollMargins=Ale,t.darkTheme=jU,t.cspNonce=rt.define({combine:A=>A.length?A[0]:""}),t.contentAttributes=aT,t.editorAttributes=Yae,t.lineWrapping=t.contentAttributes.of({class:"cm-lineWrapping"}),t.announce=tn.define(),t})(),EHe=4096,gce={},U7=class t{constructor(A,e,i,n,o,r){this.from=A,this.to=e,this.dir=i,this.isolates=n,this.fresh=o,this.order=r}static update(A,e){if(e.empty&&!A.some(o=>o.fresh))return A;let i=[],n=A.length?A[A.length-1].dir:Oo.LTR;for(let o=Math.max(0,A.length-10);o=0;n--){let o=i[n],r=typeof o=="function"?o(t):o;r&&iT(r,e)}return e}var fHe=dt.mac?"mac":dt.windows?"win":dt.linux?"linux":"key";function QHe(t,A){let e=t.split(/-(?!$)/),i=e[e.length-1];i=="Space"&&(i=" ");let n,o,r,s;for(let a=0;ai.concat(n),[]))),e}function Ele(t,A,e){return fle(Ble(t.state),A,t,e)}var bC=null,pHe=4e3;function wHe(t,A=fHe){let e=Object.create(null),i=Object.create(null),n=(r,s)=>{let a=i[r];if(a==null)i[r]=s;else if(a!=s)throw new Error("Key binding "+r+" is used both as a regular binding and as a multi-stroke prefix")},o=(r,s,a,c,l)=>{var d,C;let I=e[r]||(e[r]=Object.create(null)),u=s.split(/ (?!$)/).map(f=>QHe(f,A));for(let f=1;f{let S=bC={view:k,prefix:b,scope:r};return setTimeout(()=>{bC==S&&(bC=null)},pHe),!0}]})}let h=u.join(" ");n(h,!1);let B=I[h]||(I[h]={preventDefault:!1,stopPropagation:!1,run:((C=(d=I._any)===null||d===void 0?void 0:d.run)===null||C===void 0?void 0:C.slice())||[]});a&&B.run.push(a),c&&(B.preventDefault=!0),l&&(B.stopPropagation=!0)};for(let r of t){let s=r.scope?r.scope.split(" "):["editor"];if(r.any)for(let c of s){let l=e[c]||(e[c]=Object.create(null));l._any||(l._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:d}=r;for(let C in l)l[C].run.push(I=>d(I,bT))}let a=r[A]||r.key;if(a)for(let c of s)o(c,a,r.run,r.preventDefault,r.stopPropagation),r.shift&&o(c,"Shift-"+a,r.shift,r.preventDefault,r.stopPropagation)}return e}var bT=null;function fle(t,A,e,i){bT=A;let n=_ae(A),o=da(n,0),r=El(o)==n.length&&n!=" ",s="",a=!1,c=!1,l=!1;bC&&bC.view==e&&bC.scope==i&&(s=bC.prefix+" ",sle.indexOf(A.keyCode)<0&&(c=!0,bC=null));let d=new Set,C=B=>{if(B){for(let f of B.run)if(!d.has(f)&&(d.add(f),f(e)))return B.stopPropagation&&(l=!0),!0;B.preventDefault&&(B.stopPropagation&&(l=!0),c=!0)}return!1},I=t[i],u,h;return I&&(C(I[s+m7(n,A,!r)])?a=!0:r&&(A.altKey||A.metaKey||A.ctrlKey)&&!(dt.windows&&A.ctrlKey&&A.altKey)&&!(dt.mac&&A.altKey&&!(A.ctrlKey||A.metaKey))&&(u=F2[A.keyCode])&&u!=n?(C(I[s+m7(u,A,!0)])||A.shiftKey&&(h=af[A.keyCode])!=n&&h!=u&&C(I[s+m7(h,A,!1)]))&&(a=!0):r&&A.shiftKey&&C(I[s+m7(n,A,!0)])&&(a=!0),!a&&C(I._any)&&(a=!0)),c&&(a=!0),a&&l&&A.stopPropagation(),bT=null,a}var ip=class t{constructor(A,e,i,n,o){this.className=A,this.left=e,this.top=i,this.width=n,this.height=o}draw(){let A=document.createElement("div");return A.className=this.className,this.adjust(A),A}update(A,e){return e.className!=this.className?!1:(this.adjust(A),!0)}adjust(A){A.style.left=this.left+"px",A.style.top=this.top+"px",this.width!=null&&(A.style.width=this.width+"px"),A.style.height=this.height+"px"}eq(A){return this.left==A.left&&this.top==A.top&&this.width==A.width&&this.height==A.height&&this.className==A.className}static forRange(A,e,i){if(i.empty){let n=A.coordsAtPos(i.head,i.assoc||1);if(!n)return[];let o=Qle(A);return[new t(e,n.left-o.left,n.top-o.top,null,n.bottom-n.top)]}else return yHe(A,e,i)}};function Qle(t){let A=t.scrollDOM.getBoundingClientRect();return{left:(t.textDirection==Oo.LTR?A.left:A.right-t.scrollDOM.clientWidth*t.scaleX)-t.scrollDOM.scrollLeft*t.scaleX,top:A.top-t.scrollDOM.scrollTop*t.scaleY}}function Ice(t,A,e,i){let n=t.coordsAtPos(A,e*2);if(!n)return i;let o=t.dom.getBoundingClientRect(),r=(n.top+n.bottom)/2,s=t.posAtCoords({x:o.left+1,y:r}),a=t.posAtCoords({x:o.right-1,y:r});return s==null||a==null?i:{from:Math.max(i.from,Math.min(s,a)),to:Math.min(i.to,Math.max(s,a))}}function yHe(t,A,e){if(e.to<=t.viewport.from||e.from>=t.viewport.to)return[];let i=Math.max(e.from,t.viewport.from),n=Math.min(e.to,t.viewport.to),o=t.textDirection==Oo.LTR,r=t.contentDOM,s=r.getBoundingClientRect(),a=Qle(t),c=r.querySelector(".cm-line"),l=c&&window.getComputedStyle(c),d=s.left+(l?parseInt(l.paddingLeft)+Math.min(0,parseInt(l.textIndent)):0),C=s.right-(l?parseInt(l.paddingRight):0),I=lT(t,i,1),u=lT(t,n,-1),h=I.type==ac.Text?I:null,B=u.type==ac.Text?u:null;if(h&&(t.lineWrapping||I.widgetLineBreaks)&&(h=Ice(t,i,1,h)),B&&(t.lineWrapping||u.widgetLineBreaks)&&(B=Ice(t,n,-1,B)),h&&B&&h.from==B.from&&h.to==B.to)return b(k(e.from,e.to,h));{let w=h?k(e.from,null,h):S(I,!1),_=B?k(null,e.to,B):S(u,!0),K=[];return(h||I).to<(B||u).from-(h&&B?1:0)||I.widgetLineBreaks>1&&w.bottom+t.defaultLineHeight/2<_.top?K.push(f(d,w.bottom,C,_.top)):w.bottom<_.top&&t.elementAtHeight((w.bottom+_.top)/2).type==ac.Text&&(w.bottom=_.top=(w.bottom+_.top)/2),b(w).concat(K).concat(b(_))}function f(w,_,K,J){return new ip(A,w-a.left,_-a.top,K-w,J-_)}function b({top:w,bottom:_,horizontal:K}){let J=[];for(let O=0;OZ&&P.from=X)break;me>se&&V(Math.max(le,se),w==null&&le<=Z,Math.min(me,X),_==null&&me>=ye,oe.dir)}if(se=ue.to+1,se>=X)break}return H.length==0&&V(Z,w==null,ye,_==null,t.textDirection),{top:J,bottom:O,horizontal:H}}function S(w,_){let K=s.top+(_?w.top:w.bottom);return{top:K,bottom:K,horizontal:[]}}}function DHe(t,A){return t.constructor==A.constructor&&t.eq(A)}var MT=class{constructor(A,e){this.view=A,this.layer=e,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=A.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),e.above&&this.dom.classList.add("cm-layer-above"),e.class&&this.dom.classList.add(e.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(A.state),A.requestMeasure(this.measureReq),e.mount&&e.mount(this.dom,A)}update(A){A.startState.facet(b7)!=A.state.facet(b7)&&this.setOrder(A.state),(this.layer.update(A,this.dom)||A.geometryChanged)&&(this.scale(),A.view.requestMeasure(this.measureReq))}docViewUpdate(A){this.layer.updateOnDocViewUpdate!==!1&&A.requestMeasure(this.measureReq)}setOrder(A){let e=0,i=A.facet(b7);for(;e!DHe(e,this.drawn[i]))){let e=this.dom.firstChild,i=0;for(let n of A)n.update&&e&&n.constructor&&this.drawn[i].constructor&&n.update(e,this.drawn[i])?(e=e.nextSibling,i++):this.dom.insertBefore(n.draw(),e);for(;e;){let n=e.nextSibling;e.remove(),e=n}this.drawn=A}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}},b7=rt.define();function mle(t){return[Jo.define(A=>new MT(A,t)),b7.of(t)]}var np=rt.define({combine(t){return Os(t,{cursorBlinkRate:1200,drawRangeCursor:!0},{cursorBlinkRate:(A,e)=>Math.min(A,e),drawRangeCursor:(A,e)=>A||e})}});function ple(t={}){return[np.of(t),vHe,bHe,MHe,Wce.of(!0)]}function wle(t){return t.startState.facet(np)!=t.state.facet(np)}var vHe=mle({above:!0,markers(t){let{state:A}=t,e=A.facet(np),i=[];for(let n of A.selection.ranges){let o=n==A.selection.main;if(n.empty||e.drawRangeCursor){let r=o?"cm-cursor cm-cursor-primary":"cm-cursor cm-cursor-secondary",s=n.empty?n:fA.cursor(n.head,n.head>n.anchor?-1:1);for(let a of ip.forRange(t,r,s))i.push(a)}}return i},update(t,A){t.transactions.some(i=>i.selection)&&(A.style.animationName=A.style.animationName=="cm-blink"?"cm-blink2":"cm-blink");let e=wle(t);return e&&uce(t.state,A),t.docChanged||t.selectionSet||e},mount(t,A){uce(A.state,t)},class:"cm-cursorLayer"});function uce(t,A){A.style.animationDuration=t.facet(np).cursorBlinkRate+"ms"}var bHe=mle({above:!1,markers(t){return t.state.selection.ranges.map(A=>A.empty?[]:ip.forRange(t,"cm-selectionBackground",A)).reduce((A,e)=>A.concat(e))},update(t,A){return t.docChanged||t.selectionSet||t.viewportChanged||wle(t)},class:"cm-selectionLayer"}),MHe=Hg.highest(ai.theme({".cm-line":{"& ::selection, &::selection":{backgroundColor:"transparent !important"},caretColor:"transparent !important"},".cm-content":{caretColor:"transparent !important","& :focus":{caretColor:"initial !important","&::selection, & ::selection":{backgroundColor:"Highlight !important"}}}})),yle=tn.define({map(t,A){return t==null?null:A.mapPos(t)}}),O3=_r.define({create(){return null},update(t,A){return t!=null&&(t=A.changes.mapPos(t)),A.effects.reduce((e,i)=>i.is(yle)?i.value:e,t)}}),SHe=Jo.fromClass(class{constructor(t){this.view=t,this.cursor=null,this.measureReq={read:this.readPos.bind(this),write:this.drawCursor.bind(this)}}update(t){var A;let e=t.state.field(O3);e==null?this.cursor!=null&&((A=this.cursor)===null||A===void 0||A.remove(),this.cursor=null):(this.cursor||(this.cursor=this.view.scrollDOM.appendChild(document.createElement("div")),this.cursor.className="cm-dropCursor"),(t.startState.field(O3)!=e||t.docChanged||t.geometryChanged)&&this.view.requestMeasure(this.measureReq))}readPos(){let{view:t}=this,A=t.state.field(O3),e=A!=null&&t.coordsAtPos(A);if(!e)return null;let i=t.scrollDOM.getBoundingClientRect();return{left:e.left-i.left+t.scrollDOM.scrollLeft*t.scaleX,top:e.top-i.top+t.scrollDOM.scrollTop*t.scaleY,height:e.bottom-e.top}}drawCursor(t){if(this.cursor){let{scaleX:A,scaleY:e}=this.view;t?(this.cursor.style.left=t.left/A+"px",this.cursor.style.top=t.top/e+"px",this.cursor.style.height=t.height/e+"px"):this.cursor.style.left="-100000px"}}destroy(){this.cursor&&this.cursor.remove()}setDropPos(t){this.view.state.field(O3)!=t&&this.view.dispatch({effects:yle.of(t)})}},{eventObservers:{dragover(t){this.setDropPos(this.view.posAtCoords({x:t.clientX,y:t.clientY}))},dragleave(t){(t.target==this.view.contentDOM||!this.view.contentDOM.contains(t.relatedTarget))&&this.setDropPos(null)},dragend(){this.setDropPos(null)},drop(){this.setDropPos(null)}}});function Dle(){return[O3,SHe]}function hce(t,A,e,i,n){A.lastIndex=0;for(let o=t.iterRange(e,i),r=e,s;!o.next().done;r+=o.value.length)if(!o.lineBreak)for(;s=A.exec(o.value);)n(r+s.index,s)}function kHe(t,A){let e=t.visibleRanges;if(e.length==1&&e[0].from==t.viewport.from&&e[0].to==t.viewport.to)return e;let i=[];for(let{from:n,to:o}of e)n=Math.max(t.state.doc.lineAt(n).from,n-A),o=Math.min(t.state.doc.lineAt(o).to,o+A),i.length&&i[i.length-1].to>=n?i[i.length-1].to=o:i.push({from:n,to:o});return i}var ST=class{constructor(A){let{regexp:e,decoration:i,decorate:n,boundary:o,maxLength:r=1e3}=A;if(!e.global)throw new RangeError("The regular expression given to MatchDecorator should have its 'g' flag set");if(this.regexp=e,n)this.addMatch=(s,a,c,l)=>n(l,c,c+s[0].length,s,a);else if(typeof i=="function")this.addMatch=(s,a,c,l)=>{let d=i(s,a,c);d&&l(c,c+s[0].length,d)};else if(i)this.addMatch=(s,a,c,l)=>l(c,c+s[0].length,i);else throw new RangeError("Either 'decorate' or 'decoration' should be provided to MatchDecorator");this.boundary=o,this.maxLength=r}createDeco(A){let e=new ga,i=e.add.bind(e);for(let{from:n,to:o}of kHe(A,this.maxLength))hce(A.state.doc,this.regexp,n,o,(r,s)=>this.addMatch(s,A,r,i));return e.finish()}updateDeco(A,e){let i=1e9,n=-1;return A.docChanged&&A.changes.iterChanges((o,r,s,a)=>{a>=A.view.viewport.from&&s<=A.view.viewport.to&&(i=Math.min(s,i),n=Math.max(a,n))}),A.viewportMoved||n-i>1e3?this.createDeco(A.view):n>-1?this.updateRange(A.view,e.map(A.changes),i,n):e}updateRange(A,e,i,n){for(let o of A.visibleRanges){let r=Math.max(o.from,i),s=Math.min(o.to,n);if(s>=r){let a=A.state.doc.lineAt(r),c=a.toa.from;r--)if(this.boundary.test(a.text[r-1-a.from])){l=r;break}for(;sC.push(f.range(h,B));if(a==c)for(this.regexp.lastIndex=l-a.from;(I=this.regexp.exec(a.text))&&I.indexthis.addMatch(B,A,h,u));e=e.update({filterFrom:l,filterTo:d,filter:(h,B)=>hd,add:C})}}return e}},kT=/x/.unicode!=null?"gu":"g",xHe=new RegExp(`[\0-\b +-\x7F-\x9F\xAD\u061C\u200B\u200E\u200F\u2028\u2029\u202D\u202E\u2066\u2067\u2069\uFEFF\uFFF9-\uFFFC]`,kT),_He={0:"null",7:"bell",8:"backspace",10:"newline",11:"vertical tab",13:"carriage return",27:"escape",8203:"zero width space",8204:"zero width non-joiner",8205:"zero width joiner",8206:"left-to-right mark",8207:"right-to-left mark",8232:"line separator",8237:"left-to-right override",8238:"right-to-left override",8294:"left-to-right isolate",8295:"right-to-left isolate",8297:"pop directional isolate",8233:"paragraph separator",65279:"zero width no-break space",65532:"object replacement"},qU=null;function RHe(){var t;if(qU==null&&typeof document<"u"&&document.body){let A=document.body.style;qU=((t=A.tabSize)!==null&&t!==void 0?t:A.MozTabSize)!=null}return qU||!1}var M7=rt.define({combine(t){let A=Os(t,{render:null,specialChars:xHe,addSpecialChars:null});return(A.replaceTabs=!RHe())&&(A.specialChars=new RegExp(" |"+A.specialChars.source,kT)),A.addSpecialChars&&(A.specialChars=new RegExp(A.specialChars.source+"|"+A.addSpecialChars.source,kT)),A}});function vle(t={}){return[M7.of(t),NHe()]}var Bce=null;function NHe(){return Bce||(Bce=Jo.fromClass(class{constructor(t){this.view=t,this.decorations=bt.none,this.decorationCache=Object.create(null),this.decorator=this.makeDecorator(t.state.facet(M7)),this.decorations=this.decorator.createDeco(t)}makeDecorator(t){return new ST({regexp:t.specialChars,decoration:(A,e,i)=>{let{doc:n}=e.state,o=da(A[0],0);if(o==9){let r=n.lineAt(i),s=e.state.tabSize,a=L2(r.text,s,i-r.from);return bt.replace({widget:new _T((s-a%s)*this.view.defaultCharacterWidth/this.view.scaleX)})}return this.decorationCache[o]||(this.decorationCache[o]=bt.replace({widget:new xT(t,o)}))},boundary:t.replaceTabs?void 0:/[^]/})}update(t){let A=t.state.facet(M7);t.startState.facet(M7)!=A?(this.decorator=this.makeDecorator(A),this.decorations=this.decorator.createDeco(t.view)):this.decorations=this.decorator.updateDeco(t,this.decorations)}},{decorations:t=>t.decorations}))}var LHe="\u2022";function FHe(t){return t>=32?LHe:t==10?"\u2424":String.fromCharCode(9216+t)}var xT=class extends Ql{constructor(A,e){super(),this.options=A,this.code=e}eq(A){return A.code==this.code}toDOM(A){let e=FHe(this.code),i=A.state.phrase("Control character")+" "+(_He[this.code]||"0x"+this.code.toString(16)),n=this.options.render&&this.options.render(this.code,i,e);if(n)return n;let o=document.createElement("span");return o.textContent=e,o.title=i,o.setAttribute("aria-label",i),o.className="cm-specialChar",o}ignoreEvent(){return!1}},_T=class extends Ql{constructor(A){super(),this.width=A}eq(A){return A.width==this.width}toDOM(){let A=document.createElement("span");return A.textContent=" ",A.className="cm-tab",A.style.width=this.width+"px",A}ignoreEvent(){return!1}};function ble(){return KHe}var GHe=bt.line({class:"cm-activeLine"}),KHe=Jo.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.docChanged||t.selectionSet)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let A=-1,e=[];for(let i of t.state.selection.ranges){let n=t.lineBlockAt(i.head);n.from>A&&(e.push(GHe.range(n.from)),A=n.from)}return bt.set(e)}},{decorations:t=>t.decorations});var RT=2e3;function UHe(t,A,e){let i=Math.min(A.line,e.line),n=Math.max(A.line,e.line),o=[];if(A.off>RT||e.off>RT||A.col<0||e.col<0){let r=Math.min(A.off,e.off),s=Math.max(A.off,e.off);for(let a=i;a<=n;a++){let c=t.doc.line(a);c.length<=s&&o.push(fA.range(c.from+r,c.to+s))}}else{let r=Math.min(A.col,e.col),s=Math.max(A.col,e.col);for(let a=i;a<=n;a++){let c=t.doc.line(a),l=d7(c.text,r,t.tabSize,!0);if(l<0)o.push(fA.cursor(c.to));else{let d=d7(c.text,s,t.tabSize);o.push(fA.range(c.from+l,c.from+d))}}}return o}function THe(t,A){let e=t.coordsAtPos(t.viewport.from);return e?Math.round(Math.abs((e.left-A)/t.defaultCharacterWidth)):-1}function Ece(t,A){let e=t.posAtCoords({x:A.clientX,y:A.clientY},!1),i=t.state.doc.lineAt(e),n=e-i.from,o=n>RT?-1:n==i.length?THe(t,A.clientX):L2(i.text,t.state.tabSize,e-i.from);return{line:i.number,col:o,off:n}}function OHe(t,A){let e=Ece(t,A),i=t.state.selection;return e?{update(n){if(n.docChanged){let o=n.changes.mapPos(n.startState.doc.line(e.line).from),r=n.state.doc.lineAt(o);e={line:r.number,col:e.col,off:Math.min(e.off,r.length)},i=i.map(n.changes)}},get(n,o,r){let s=Ece(t,n);if(!s)return i;let a=UHe(t.state,e,s);return a.length?r?fA.create(a.concat(i.ranges)):fA.create(a):i}}:null}function Mle(t){let A=t?.eventFilter||(e=>e.altKey&&e.button==0);return ai.mouseSelectionStyle.of((e,i)=>A(i)?OHe(e,i):null)}var JHe={Alt:[18,t=>!!t.altKey],Control:[17,t=>!!t.ctrlKey],Shift:[16,t=>!!t.shiftKey],Meta:[91,t=>!!t.metaKey]},YHe={style:"cursor: crosshair"};function Sle(t={}){let[A,e]=JHe[t.key||"Alt"],i=Jo.fromClass(class{constructor(n){this.view=n,this.isDown=!1}set(n){this.isDown!=n&&(this.isDown=n,this.view.update([]))}},{eventObservers:{keydown(n){this.set(n.keyCode==A||e(n))},keyup(n){(n.keyCode==A||!e(n))&&this.set(!1)},mousemove(n){this.set(e(n))}}});return[i,ai.contentAttributes.of(n=>{var o;return!((o=n.plugin(i))===null||o===void 0)&&o.isDown?YHe:null})]}var K3="-10000px",T7=class{constructor(A,e,i,n){this.facet=e,this.createTooltipView=i,this.removeTooltipView=n,this.input=A.state.facet(e),this.tooltips=this.input.filter(r=>r);let o=null;this.tooltipViews=this.tooltips.map(r=>o=i(r,o))}update(A,e){var i;let n=A.state.facet(this.facet),o=n.filter(a=>a);if(n===this.input){for(let a of this.tooltipViews)a.update&&a.update(A);return!1}let r=[],s=e?[]:null;for(let a=0;ae[c]=a),e.length=s.length),this.input=n,this.tooltips=o,this.tooltipViews=r,!0}};function HHe(t){let A=t.dom.ownerDocument.documentElement;return{top:0,left:0,bottom:A.clientHeight,right:A.clientWidth}}var WU=rt.define({combine:t=>{var A,e,i;return{position:dt.ios?"absolute":((A=t.find(n=>n.position))===null||A===void 0?void 0:A.position)||"fixed",parent:((e=t.find(n=>n.parent))===null||e===void 0?void 0:e.parent)||null,tooltipSpace:((i=t.find(n=>n.tooltipSpace))===null||i===void 0?void 0:i.tooltipSpace)||HHe}}}),fce=new WeakMap,HT=Jo.fromClass(class{constructor(t){this.view=t,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let A=t.state.facet(WU);this.position=A.position,this.parent=A.parent,this.classes=t.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver=typeof ResizeObserver=="function"?new ResizeObserver(()=>this.measureSoon()):null,this.manager=new T7(t,Bf,(e,i)=>this.createTooltip(e,i),e=>{this.resizeObserver&&this.resizeObserver.unobserve(e.dom),e.dom.remove()}),this.above=this.manager.tooltips.map(e=>!!e.above),this.intersectionObserver=typeof IntersectionObserver=="function"?new IntersectionObserver(e=>{Date.now()>this.lastTransaction-50&&e.length>0&&e[e.length-1].intersectionRatio<1&&this.measureSoon()},{threshold:[1]}):null,this.observeIntersection(),t.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let t of this.manager.tooltipViews)this.intersectionObserver.observe(t.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout(()=>{this.measureTimeout=-1,this.maybeMeasure()},50))}update(t){t.transactions.length&&(this.lastTransaction=Date.now());let A=this.manager.update(t,this.above);A&&this.observeIntersection();let e=A||t.geometryChanged,i=t.state.facet(WU);if(i.position!=this.position&&!this.madeAbsolute){this.position=i.position;for(let n of this.manager.tooltipViews)n.dom.style.position=this.position;e=!0}if(i.parent!=this.parent){this.parent&&this.container.remove(),this.parent=i.parent,this.createContainer();for(let n of this.manager.tooltipViews)this.container.appendChild(n.dom);e=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);e&&this.maybeMeasure()}createTooltip(t,A){let e=t.create(this.view),i=A?A.dom:null;if(e.dom.classList.add("cm-tooltip"),t.arrow&&!e.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let n=document.createElement("div");n.className="cm-tooltip-arrow",e.dom.appendChild(n)}return e.dom.style.position=this.position,e.dom.style.top=K3,e.dom.style.left="0px",this.container.insertBefore(e.dom,i),e.mount&&e.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(e.dom),e}destroy(){var t,A,e;this.view.win.removeEventListener("resize",this.measureSoon);for(let i of this.manager.tooltipViews)i.dom.remove(),(t=i.destroy)===null||t===void 0||t.call(i);this.parent&&this.container.remove(),(A=this.resizeObserver)===null||A===void 0||A.disconnect(),(e=this.intersectionObserver)===null||e===void 0||e.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let t=1,A=1,e=!1;if(this.position=="fixed"&&this.manager.tooltipViews.length){let{dom:o}=this.manager.tooltipViews[0];if(dt.gecko)e=o.offsetParent!=this.container.ownerDocument.body;else if(o.style.top==K3&&o.style.left=="0px"){let r=o.getBoundingClientRect();e=Math.abs(r.top+1e4)>1||Math.abs(r.left)>1}}if(e||this.position=="absolute")if(this.parent){let o=this.parent.getBoundingClientRect();o.width&&o.height&&(t=o.width/this.parent.offsetWidth,A=o.height/this.parent.offsetHeight)}else({scaleX:t,scaleY:A}=this.view.viewState);let i=this.view.scrollDOM.getBoundingClientRect(),n=JT(this.view);return{visible:{left:i.left+n.left,top:i.top+n.top,right:i.right-n.right,bottom:i.bottom-n.bottom},parent:this.parent?this.container.getBoundingClientRect():this.view.dom.getBoundingClientRect(),pos:this.manager.tooltips.map((o,r)=>{let s=this.manager.tooltipViews[r];return s.getCoords?s.getCoords(o.pos):this.view.coordsAtPos(o.pos)}),size:this.manager.tooltipViews.map(({dom:o})=>o.getBoundingClientRect()),space:this.view.state.facet(WU).tooltipSpace(this.view),scaleX:t,scaleY:A,makeAbsolute:e}}writeMeasure(t){var A;if(t.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let s of this.manager.tooltipViews)s.dom.style.position="absolute"}let{visible:e,space:i,scaleX:n,scaleY:o}=t,r=[];for(let s=0;s=Math.min(e.bottom,i.bottom)||d.rightMath.min(e.right,i.right)+.1)){l.style.top=K3;continue}let I=a.arrow?c.dom.querySelector(".cm-tooltip-arrow"):null,u=I?7:0,h=C.right-C.left,B=(A=fce.get(c))!==null&&A!==void 0?A:C.bottom-C.top,f=c.offset||PHe,b=this.view.textDirection==Oo.LTR,k=C.width>i.right-i.left?b?i.left:i.right-C.width:b?Math.max(i.left,Math.min(d.left-(I?14:0)+f.x,i.right-h)):Math.min(Math.max(i.left,d.left-h+(I?14:0)-f.x),i.right-h),S=this.above[s];!a.strictSide&&(S?d.top-B-u-f.yi.bottom)&&S==i.bottom-d.bottom>d.top-i.top&&(S=this.above[s]=!S);let w=(S?d.top-i.top:i.bottom-d.bottom)-u;if(wk&&J.top<_+B&&J.bottom>_&&(_=S?J.top-B-2-u:J.bottom+u+2);if(this.position=="absolute"?(l.style.top=(_-t.parent.top)/o+"px",Qce(l,(k-t.parent.left)/n)):(l.style.top=_/o+"px",Qce(l,k/n)),I){let J=d.left+(b?f.x:-f.x)-(k+14-7);I.style.left=J/n+"px"}c.overlap!==!0&&r.push({left:k,top:_,right:K,bottom:_+B}),l.classList.toggle("cm-tooltip-above",S),l.classList.toggle("cm-tooltip-below",!S),c.positioned&&c.positioned(t.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let t of this.manager.tooltipViews)t.dom.style.top=K3}},{eventObservers:{scroll(){this.maybeMeasure()}}});function Qce(t,A){let e=parseInt(t.style.left,10);(isNaN(e)||Math.abs(A-e)>1)&&(t.style.left=A+"px")}var zHe=ai.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:`${7*2}px`,position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),PHe={x:0,y:0},Bf=rt.define({enables:[HT,zHe]}),O7=rt.define({combine:t=>t.reduce((A,e)=>A.concat(e),[])}),J7=class t{static create(A){return new t(A)}constructor(A){this.view=A,this.mounted=!1,this.dom=document.createElement("div"),this.dom.classList.add("cm-tooltip-hover"),this.manager=new T7(A,O7,(e,i)=>this.createHostedView(e,i),e=>e.dom.remove())}createHostedView(A,e){let i=A.create(this.view);return i.dom.classList.add("cm-tooltip-section"),this.dom.insertBefore(i.dom,e?e.dom.nextSibling:this.dom.firstChild),this.mounted&&i.mount&&i.mount(this.view),i}mount(A){for(let e of this.manager.tooltipViews)e.mount&&e.mount(A);this.mounted=!0}positioned(A){for(let e of this.manager.tooltipViews)e.positioned&&e.positioned(A)}update(A){this.manager.update(A)}destroy(){var A;for(let e of this.manager.tooltipViews)(A=e.destroy)===null||A===void 0||A.call(e)}passProp(A){let e;for(let i of this.manager.tooltipViews){let n=i[A];if(n!==void 0){if(e===void 0)e=n;else if(e!==n)return}}return e}get offset(){return this.passProp("offset")}get getCoords(){return this.passProp("getCoords")}get overlap(){return this.passProp("overlap")}get resize(){return this.passProp("resize")}},jHe=Bf.compute([O7],t=>{let A=t.facet(O7);return A.length===0?null:{pos:Math.min(...A.map(e=>e.pos)),end:Math.max(...A.map(e=>{var i;return(i=e.end)!==null&&i!==void 0?i:e.pos})),create:J7.create,above:A[0].above,arrow:A.some(e=>e.arrow)}}),NT=class{constructor(A,e,i,n,o){this.view=A,this.source=e,this.field=i,this.setHover=n,this.hoverTime=o,this.hoverTimeout=-1,this.restartTimeout=-1,this.pending=null,this.lastMove={x:0,y:0,target:A.dom,time:0},this.checkHover=this.checkHover.bind(this),A.dom.addEventListener("mouseleave",this.mouseleave=this.mouseleave.bind(this)),A.dom.addEventListener("mousemove",this.mousemove=this.mousemove.bind(this))}update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeout),this.restartTimeout=setTimeout(()=>this.startHover(),20))}get active(){return this.view.state.field(this.field)}checkHover(){if(this.hoverTimeout=-1,this.active.length)return;let A=Date.now()-this.lastMove.time;As.bottom||e.xs.right+A.defaultCharacterWidth)return;let a=A.bidiSpans(A.state.doc.lineAt(n)).find(l=>l.from<=n&&l.to>=n),c=a&&a.dir==Oo.RTL?-1:1;o=e.x{this.pending==s&&(this.pending=null,a&&!(Array.isArray(a)&&!a.length)&&A.dispatch({effects:this.setHover.of(Array.isArray(a)?a:[a])}))},a=>Js(A.state,a,"hover tooltip"))}else r&&!(Array.isArray(r)&&!r.length)&&A.dispatch({effects:this.setHover.of(Array.isArray(r)?r:[r])})}get tooltip(){let A=this.view.plugin(HT),e=A?A.manager.tooltips.findIndex(i=>i.create==J7.create):-1;return e>-1?A.manager.tooltipViews[e]:null}mousemove(A){var e,i;this.lastMove={x:A.clientX,y:A.clientY,target:A.target,time:Date.now()},this.hoverTimeout<0&&(this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime));let{active:n,tooltip:o}=this;if(n.length&&o&&!VHe(o.dom,A)||this.pending){let{pos:r}=n[0]||this.pending,s=(i=(e=n[0])===null||e===void 0?void 0:e.end)!==null&&i!==void 0?i:r;(r==s?this.view.posAtCoords(this.lastMove)!=r:!qHe(this.view,r,s,A.clientX,A.clientY))&&(this.view.dispatch({effects:this.setHover.of([])}),this.pending=null)}}mouseleave(A){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1;let{active:e}=this;if(e.length){let{tooltip:i}=this;i&&i.dom.contains(A.relatedTarget)?this.watchTooltipLeave(i.dom):this.view.dispatch({effects:this.setHover.of([])})}}watchTooltipLeave(A){let e=i=>{A.removeEventListener("mouseleave",e),this.active.length&&!this.view.dom.contains(i.relatedTarget)&&this.view.dispatch({effects:this.setHover.of([])})};A.addEventListener("mouseleave",e)}destroy(){clearTimeout(this.hoverTimeout),this.view.dom.removeEventListener("mouseleave",this.mouseleave),this.view.dom.removeEventListener("mousemove",this.mousemove)}},p7=4;function VHe(t,A){let{left:e,right:i,top:n,bottom:o}=t.getBoundingClientRect(),r;if(r=t.querySelector(".cm-tooltip-arrow")){let s=r.getBoundingClientRect();n=Math.min(s.top,n),o=Math.max(s.bottom,o)}return A.clientX>=e-p7&&A.clientX<=i+p7&&A.clientY>=n-p7&&A.clientY<=o+p7}function qHe(t,A,e,i,n,o){let r=t.scrollDOM.getBoundingClientRect(),s=t.documentTop+t.documentPadding.top+t.contentHeight;if(r.left>i||r.rightn||Math.min(r.bottom,s)=A&&a<=e}function kle(t,A={}){let e=tn.define(),i=_r.define({create(){return[]},update(n,o){if(n.length&&(A.hideOnChange&&(o.docChanged||o.selection)?n=[]:A.hideOn&&(n=n.filter(r=>!A.hideOn(o,r))),o.docChanged)){let r=[];for(let s of n){let a=o.changes.mapPos(s.pos,-1,ca.TrackDel);if(a!=null){let c=Object.assign(Object.create(null),s);c.pos=a,c.end!=null&&(c.end=o.changes.mapPos(c.end)),r.push(c)}}n=r}for(let r of o.effects)r.is(e)&&(n=r.value),r.is(WHe)&&(n=[]);return n},provide:n=>O7.from(n)});return{active:i,extension:[i,Jo.define(n=>new NT(n,t,i,e,A.hoverTime||300)),jHe]}}function zT(t,A){let e=t.plugin(HT);if(!e)return null;let i=e.manager.tooltips.indexOf(A);return i<0?null:e.manager.tooltipViews[i]}var WHe=tn.define();var mce=rt.define({combine(t){let A,e;for(let i of t)A=A||i.topContainer,e=e||i.bottomContainer;return{topContainer:A,bottomContainer:e}}});function Ju(t,A){let e=t.plugin(xle),i=e?e.specs.indexOf(A):-1;return i>-1?e.panels[i]:null}var xle=Jo.fromClass(class{constructor(t){this.input=t.state.facet(Ou),this.specs=this.input.filter(e=>e),this.panels=this.specs.map(e=>e(t));let A=t.state.facet(mce);this.top=new df(t,!0,A.topContainer),this.bottom=new df(t,!1,A.bottomContainer),this.top.sync(this.panels.filter(e=>e.top)),this.bottom.sync(this.panels.filter(e=>!e.top));for(let e of this.panels)e.dom.classList.add("cm-panel"),e.mount&&e.mount()}update(t){let A=t.state.facet(mce);this.top.container!=A.topContainer&&(this.top.sync([]),this.top=new df(t.view,!0,A.topContainer)),this.bottom.container!=A.bottomContainer&&(this.bottom.sync([]),this.bottom=new df(t.view,!1,A.bottomContainer)),this.top.syncClasses(),this.bottom.syncClasses();let e=t.state.facet(Ou);if(e!=this.input){let i=e.filter(a=>a),n=[],o=[],r=[],s=[];for(let a of i){let c=this.specs.indexOf(a),l;c<0?(l=a(t.view),s.push(l)):(l=this.panels[c],l.update&&l.update(t)),n.push(l),(l.top?o:r).push(l)}this.specs=i,this.panels=n,this.top.sync(o),this.bottom.sync(r);for(let a of s)a.dom.classList.add("cm-panel"),a.mount&&a.mount()}else for(let i of this.panels)i.update&&i.update(t)}destroy(){this.top.sync([]),this.bottom.sync([])}},{provide:t=>ai.scrollMargins.of(A=>{let e=A.plugin(t);return e&&{top:e.top.scrollMargin(),bottom:e.bottom.scrollMargin()}})}),df=class{constructor(A,e,i){this.view=A,this.top=e,this.container=i,this.dom=void 0,this.classes="",this.panels=[],this.syncClasses()}sync(A){for(let e of this.panels)e.destroy&&A.indexOf(e)<0&&e.destroy();this.panels=A,this.syncDOM()}syncDOM(){if(this.panels.length==0){this.dom&&(this.dom.remove(),this.dom=void 0);return}if(!this.dom){this.dom=document.createElement("div"),this.dom.className=this.top?"cm-panels cm-panels-top":"cm-panels cm-panels-bottom",this.dom.style[this.top?"top":"bottom"]="0";let e=this.container||this.view.dom;e.insertBefore(this.dom,this.top?e.firstChild:null)}let A=this.dom.firstChild;for(let e of this.panels)if(e.dom.parentNode==this.dom){for(;A!=e.dom;)A=pce(A);A=A.nextSibling}else this.dom.insertBefore(e.dom,A);for(;A;)A=pce(A)}scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?this.dom.getBoundingClientRect().bottom-Math.max(0,this.view.scrollDOM.getBoundingClientRect().top):Math.min(innerHeight,this.view.scrollDOM.getBoundingClientRect().bottom)-this.dom.getBoundingClientRect().top)}syncClasses(){if(!(!this.container||this.classes==this.view.themeClasses)){for(let A of this.classes.split(" "))A&&this.container.classList.remove(A);for(let A of(this.classes=this.view.themeClasses).split(" "))A&&this.container.classList.add(A)}}};function pce(t){let A=t.nextSibling;return t.remove(),A}var Ou=rt.define({enables:xle});var Kc=class extends Yg{compare(A){return this==A||this.constructor==A.constructor&&this.eq(A)}eq(A){return!1}destroy(A){}};Kc.prototype.elementClass="";Kc.prototype.toDOM=void 0;Kc.prototype.mapMode=ca.TrackBefore;Kc.prototype.startSide=Kc.prototype.endSide=-1;Kc.prototype.point=!0;var S7=rt.define(),ZHe=rt.define(),XHe={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>To.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{},side:"before"},j3=rt.define();function q7(t){return[_le(),j3.of(ae(ae({},XHe),t))]}var LT=rt.define({combine:t=>t.some(A=>A)});function _le(t){let A=[$He];return t&&t.fixed===!1&&A.push(LT.of(!0)),A}var $He=Jo.fromClass(class{constructor(t){this.view=t,this.domAfter=null,this.prevViewport=t.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters cm-gutters-before",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=t.state.facet(j3).map(A=>new Y7(t,A)),this.fixed=!t.state.facet(LT);for(let A of this.gutters)A.config.side=="after"?this.getDOMAfter().appendChild(A.dom):this.dom.appendChild(A.dom);this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),t.scrollDOM.insertBefore(this.dom,t.contentDOM)}getDOMAfter(){return this.domAfter||(this.domAfter=document.createElement("div"),this.domAfter.className="cm-gutters cm-gutters-after",this.domAfter.setAttribute("aria-hidden","true"),this.domAfter.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.domAfter.style.position=this.fixed?"sticky":"",this.view.scrollDOM.appendChild(this.domAfter)),this.domAfter}update(t){if(this.updateGutters(t)){let A=this.prevViewport,e=t.view.viewport,i=Math.min(A.to,e.to)-Math.max(A.from,e.from);this.syncGutters(i<(e.to-e.from)*.8)}if(t.geometryChanged){let A=this.view.contentHeight/this.view.scaleY+"px";this.dom.style.minHeight=A,this.domAfter&&(this.domAfter.style.minHeight=A)}this.view.state.facet(LT)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":"",this.domAfter&&(this.domAfter.style.position=this.fixed?"sticky":"")),this.prevViewport=t.view.viewport}syncGutters(t){let A=this.dom.nextSibling;t&&(this.dom.remove(),this.domAfter&&this.domAfter.remove());let e=To.iter(this.view.state.facet(S7),this.view.viewport.from),i=[],n=this.gutters.map(o=>new GT(o,this.view.viewport,-this.view.documentPadding.top));for(let o of this.view.viewportLineBlocks)if(i.length&&(i=[]),Array.isArray(o.type)){let r=!0;for(let s of o.type)if(s.type==ac.Text&&r){FT(e,i,s.from);for(let a of n)a.line(this.view,s,i);r=!1}else if(s.widget)for(let a of n)a.widget(this.view,s)}else if(o.type==ac.Text){FT(e,i,o.from);for(let r of n)r.line(this.view,o,i)}else if(o.widget)for(let r of n)r.widget(this.view,o);for(let o of n)o.finish();t&&(this.view.scrollDOM.insertBefore(this.dom,A),this.domAfter&&this.view.scrollDOM.appendChild(this.domAfter))}updateGutters(t){let A=t.startState.facet(j3),e=t.state.facet(j3),i=t.docChanged||t.heightChanged||t.viewportChanged||!To.eq(t.startState.facet(S7),t.state.facet(S7),t.view.viewport.from,t.view.viewport.to);if(A==e)for(let n of this.gutters)n.update(t)&&(i=!0);else{i=!0;let n=[];for(let o of e){let r=A.indexOf(o);r<0?n.push(new Y7(this.view,o)):(this.gutters[r].update(t),n.push(this.gutters[r]))}for(let o of this.gutters)o.dom.remove(),n.indexOf(o)<0&&o.destroy();for(let o of n)o.config.side=="after"?this.getDOMAfter().appendChild(o.dom):this.dom.appendChild(o.dom);this.gutters=n}return i}destroy(){for(let t of this.gutters)t.destroy();this.dom.remove(),this.domAfter&&this.domAfter.remove()}},{provide:t=>ai.scrollMargins.of(A=>{let e=A.plugin(t);if(!e||e.gutters.length==0||!e.fixed)return null;let i=e.dom.offsetWidth*A.scaleX,n=e.domAfter?e.domAfter.offsetWidth*A.scaleX:0;return A.textDirection==Oo.LTR?{left:i,right:n}:{right:i,left:n}})});function wce(t){return Array.isArray(t)?t:[t]}function FT(t,A,e){for(;t.value&&t.from<=e;)t.from==e&&A.push(t.value),t.next()}var GT=class{constructor(A,e,i){this.gutter=A,this.height=i,this.i=0,this.cursor=To.iter(A.markers,e.from)}addElement(A,e,i){let{gutter:n}=this,o=(e.top-this.height)/A.scaleY,r=e.height/A.scaleY;if(this.i==n.elements.length){let s=new H7(A,r,o,i);n.elements.push(s),n.dom.appendChild(s.dom)}else n.elements[this.i].update(A,r,o,i);this.height=e.bottom,this.i++}line(A,e,i){let n=[];FT(this.cursor,n,e.from),i.length&&(n=n.concat(i));let o=this.gutter.config.lineMarker(A,e,n);o&&n.unshift(o);let r=this.gutter;n.length==0&&!r.config.renderEmptyElements||this.addElement(A,e,n)}widget(A,e){let i=this.gutter.config.widgetMarker(A,e.widget,e),n=i?[i]:null;for(let o of A.state.facet(ZHe)){let r=o(A,e.widget,e);r&&(n||(n=[])).push(r)}n&&this.addElement(A,e,n)}finish(){let A=this.gutter;for(;A.elements.length>this.i;){let e=A.elements.pop();A.dom.removeChild(e.dom),e.destroy()}}},Y7=class{constructor(A,e){this.view=A,this.config=e,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let i in e.domEventHandlers)this.dom.addEventListener(i,n=>{let o=n.target,r;if(o!=this.dom&&this.dom.contains(o)){for(;o.parentNode!=this.dom;)o=o.parentNode;let a=o.getBoundingClientRect();r=(a.top+a.bottom)/2}else r=n.clientY;let s=A.lineBlockAtHeight(r-A.documentTop);e.domEventHandlers[i](A,s,n)&&n.preventDefault()});this.markers=wce(e.markers(A)),e.initialSpacer&&(this.spacer=new H7(A,0,0,[e.initialSpacer(A)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(A){let e=this.markers;if(this.markers=wce(this.config.markers(A.view)),this.spacer&&this.config.updateSpacer){let n=this.config.updateSpacer(this.spacer.markers[0],A);n!=this.spacer.markers[0]&&this.spacer.update(A.view,0,0,[n])}let i=A.view.viewport;return!To.eq(this.markers,e,i.from,i.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(A):!1)}destroy(){for(let A of this.elements)A.destroy()}},H7=class{constructor(A,e,i,n){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(A,e,i,n)}update(A,e,i,n){this.height!=e&&(this.height=e,this.dom.style.height=e+"px"),this.above!=i&&(this.dom.style.marginTop=(this.above=i)?i+"px":""),eze(this.markers,n)||this.setMarkers(A,n)}setMarkers(A,e){let i="cm-gutterElement",n=this.dom.firstChild;for(let o=0,r=0;;){let s=r,a=oo(s,a,c)||r(s,a,c):r}return i}})}}),V3=class extends Kc{constructor(A){super(),this.number=A}eq(A){return this.number==A.number}toDOM(){return document.createTextNode(this.number)}};function ZU(t,A){return t.state.facet(Cf).formatNumber(A,t.state)}var ize=j3.compute([Cf],t=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers(A){return A.state.facet(Aze)},lineMarker(A,e,i){return i.some(n=>n.toDOM)?null:new V3(ZU(A,A.state.doc.lineAt(e.from).number))},widgetMarker:(A,e,i)=>{for(let n of A.state.facet(tze)){let o=n(A,e,i);if(o)return o}return null},lineMarkerChange:A=>A.startState.facet(Cf)!=A.state.facet(Cf),initialSpacer(A){return new V3(ZU(A,yce(A.state.doc.lines)))},updateSpacer(A,e){let i=ZU(e.view,yce(e.view.state.doc.lines));return i==A.number?A:new V3(i)},domEventHandlers:t.facet(Cf).domEventHandlers,side:"before"}));function Rle(t={}){return[Cf.of(t),_le(),ize]}function yce(t){let A=9;for(;A{let A=[],e=-1;for(let i of t.selection.ranges){let n=t.doc.lineAt(i.head).from;n>e&&(e=n,A.push(nze.range(n)))}return To.of(A)});function Nle(){return oze}var rze=0,op=class{constructor(A,e){this.from=A,this.to=e}},ki=class{constructor(A={}){this.id=rze++,this.perNode=!!A.perNode,this.deserialize=A.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")})}add(A){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof A!="function"&&(A=Na.match(A)),e=>{let i=A(e);return i===void 0?null:[this,i]}}};ki.closedBy=new ki({deserialize:t=>t.split(" ")});ki.openedBy=new ki({deserialize:t=>t.split(" ")});ki.group=new ki({deserialize:t=>t.split(" ")});ki.isolate=new ki({deserialize:t=>{if(t&&t!="rtl"&&t!="ltr"&&t!="auto")throw new RangeError("Invalid value for isolate: "+t);return t||"auto"}});ki.contextHash=new ki({perNode:!0});ki.lookAhead=new ki({perNode:!0});ki.mounted=new ki({perNode:!0});var Ef=class{constructor(A,e,i){this.tree=A,this.overlay=e,this.parser=i}static get(A){return A&&A.props&&A.props[ki.mounted.id]}},sze=Object.create(null),Na=class t{constructor(A,e,i,n=0){this.name=A,this.props=e,this.id=i,this.flags=n}static define(A){let e=A.props&&A.props.length?Object.create(null):sze,i=(A.top?1:0)|(A.skipped?2:0)|(A.error?4:0)|(A.name==null?8:0),n=new t(A.name||"",e,A.id,i);if(A.props){for(let o of A.props)if(Array.isArray(o)||(o=o(n)),o){if(o[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");e[o[0].id]=o[1]}}return n}prop(A){return this.props[A.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(A){if(typeof A=="string"){if(this.name==A)return!0;let e=this.prop(ki.group);return e?e.indexOf(A)>-1:!1}return this.id==A}static match(A){let e=Object.create(null);for(let i in A)for(let n of i.split(" "))e[n]=A[i];return i=>{for(let n=i.prop(ki.group),o=-1;o<(n?n.length:0);o++){let r=e[o<0?i.name:n[o]];if(r)return r}}}};Na.none=new Na("",Object.create(null),0,8);var rp=class t{constructor(A){this.types=A;for(let e=0;e0;for(let a=this.cursor(r|bs.IncludeAnonymous);;){let c=!1;if(a.from<=o&&a.to>=n&&(!s&&a.type.isAnonymous||e(a)!==!1)){if(a.firstChild())continue;c=!0}for(;c&&i&&(s||!a.type.isAnonymous)&&i(a),!a.nextSibling();){if(!a.parent())return;c=!0}}}prop(A){return A.perNode?this.props?this.props[A.id]:void 0:this.type.prop(A)}get propValues(){let A=[];if(this.props)for(let e in this.props)A.push([+e,this.props[e]]);return A}balance(A={}){return this.children.length<=8?this:XT(Na.none,this.children,this.positions,0,this.children.length,0,this.length,(e,i,n)=>new t(this.type,e,i,n,this.propValues),A.makeTree||((e,i,n)=>new t(Na.none,e,i,n)))}static build(A){return cze(A)}};as.empty=new as(Na.none,[],[],0);var PT=class t{constructor(A,e){this.buffer=A,this.index=e}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new t(this.buffer,this.index)}},xC=class t{constructor(A,e,i){this.buffer=A,this.length=e,this.set=i}get type(){return Na.none}toString(){let A=[];for(let e=0;e0));a=r[a+3]);return s}slice(A,e,i){let n=this.buffer,o=new Uint16Array(e-A),r=0;for(let s=A,a=0;s=A&&eA;case 1:return e<=A&&i>A;case 2:return i>A;case 4:return!0}}function sp(t,A,e,i){for(var n;t.from==t.to||(e<1?t.from>=A:t.from>A)||(e>-1?t.to<=A:t.to0?s.length:-1;A!=c;A+=e){let l=s[A],d=a[A]+r.from;if(Kle(n,i,d,d+l.length)){if(l instanceof xC){if(o&bs.ExcludeBuffers)continue;let C=l.findChild(0,l.buffer.length,e,i-d,n);if(C>-1)return new ap(new VT(r,l,A,d),null,C)}else if(o&bs.IncludeAnonymous||!l.type.isAnonymous||ZT(l)){let C;if(!(o&bs.IgnoreMounts)&&(C=Ef.get(l))&&!C.overlay)return new t(C.tree,d,A,r);let I=new t(l,d,A,r);return o&bs.IncludeAnonymous||!I.type.isAnonymous?I:I.nextChild(e<0?l.children.length-1:0,e,i,n)}}}if(o&bs.IncludeAnonymous||!r.type.isAnonymous||(r.index>=0?A=r.index+e:A=e<0?-1:r._parent._tree.children.length,r=r._parent,!r))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(A){return this.nextChild(0,1,A,2)}childBefore(A){return this.nextChild(this._tree.children.length-1,-1,A,-2)}enter(A,e,i=0){let n;if(!(i&bs.IgnoreOverlays)&&(n=Ef.get(this._tree))&&n.overlay){let o=A-this.from;for(let{from:r,to:s}of n.overlay)if((e>0?r<=o:r=o:s>o))return new t(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,A,e,i)}nextSignificantParent(){let A=this;for(;A.type.isAnonymous&&A._parent;)A=A._parent;return A}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function Fle(t,A,e,i){let n=t.cursor(),o=[];if(!n.firstChild())return o;if(e!=null){for(let r=!1;!r;)if(r=n.type.is(e),!n.nextSibling())return o}for(;;){if(i!=null&&n.type.is(i))return o;if(n.type.is(A)&&o.push(n.node),!n.nextSibling())return i==null?o:[]}}function jT(t,A,e=A.length-1){for(let i=t;e>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(A[e]&&A[e]!=i.name)return!1;e--}}return!0}var VT=class{constructor(A,e,i,n){this.parent=A,this.buffer=e,this.index=i,this.start=n}},ap=class t extends X7{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(A,e,i){super(),this.context=A,this._parent=e,this.index=i,this.type=A.buffer.set.types[A.buffer.buffer[i]]}child(A,e,i){let{buffer:n}=this.context,o=n.findChild(this.index+4,n.buffer[this.index+3],A,e-this.context.start,i);return o<0?null:new t(this.context,this,o)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(A){return this.child(1,A,2)}childBefore(A){return this.child(-1,A,-2)}enter(A,e,i=0){if(i&bs.ExcludeBuffers)return null;let{buffer:n}=this.context,o=n.findChild(this.index+4,n.buffer[this.index+3],e>0?1:-1,A-this.context.start,e);return o<0?null:new t(this.context,this,o)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(A){return this._parent?null:this.context.parent.nextChild(this.context.index+A,A,0,4)}get nextSibling(){let{buffer:A}=this.context,e=A.buffer[this.index+3];return e<(this._parent?A.buffer[this._parent.index+3]:A.buffer.length)?new t(this.context,this._parent,e):this.externalSibling(1)}get prevSibling(){let{buffer:A}=this.context,e=this._parent?this._parent.index+4:0;return this.index==e?this.externalSibling(-1):new t(this.context,this._parent,A.findChild(e,this.index,-1,0,4))}get tree(){return null}toTree(){let A=[],e=[],{buffer:i}=this.context,n=this.index+4,o=i.buffer[this.index+3];if(o>n){let r=i.buffer[this.index+1];A.push(i.slice(n,o,r)),e.push(0)}return new as(this.type,A,e,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function Ule(t){if(!t.length)return null;let A=0,e=t[0];for(let o=1;oe.from||r.to=A){let s=new wd(r.tree,r.overlay[0].from+o.from,-1,o);(n||(n=[i])).push(sp(s,A,e,!1))}}return n?Ule(n):i}var cp=class{get name(){return this.type.name}constructor(A,e=0){if(this.mode=e,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,A instanceof wd)this.yieldNode(A);else{this._tree=A.context.parent,this.buffer=A.context;for(let i=A._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=A,this.yieldBuf(A.index)}}yieldNode(A){return A?(this._tree=A,this.type=A.type,this.from=A.from,this.to=A.to,!0):!1}yieldBuf(A,e){this.index=A;let{start:i,buffer:n}=this.buffer;return this.type=e||n.set.types[n.buffer[A]],this.from=i+n.buffer[A+1],this.to=i+n.buffer[A+2],!0}yield(A){return A?A instanceof wd?(this.buffer=null,this.yieldNode(A)):(this.buffer=A.context,this.yieldBuf(A.index,A.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(A,e,i){if(!this.buffer)return this.yield(this._tree.nextChild(A<0?this._tree._tree.children.length-1:0,A,e,i,this.mode));let{buffer:n}=this.buffer,o=n.findChild(this.index+4,n.buffer[this.index+3],A,e-this.buffer.start,i);return o<0?!1:(this.stack.push(this.index),this.yieldBuf(o))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(A){return this.enterChild(1,A,2)}childBefore(A){return this.enterChild(-1,A,-2)}enter(A,e,i=this.mode){return this.buffer?i&bs.ExcludeBuffers?!1:this.enterChild(1,A,e):this.yield(this._tree.enter(A,e,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&bs.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let A=this.mode&bs.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(A)}sibling(A){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+A,A,0,4,this.mode)):!1;let{buffer:e}=this.buffer,i=this.stack.length-1;if(A<0){let n=i<0?0:this.stack[i]+4;if(this.index!=n)return this.yieldBuf(e.findChild(n,this.index,-1,0,4))}else{let n=e.buffer[this.index+3];if(n<(i<0?e.buffer.length:e.buffer[this.stack[i]+3]))return this.yieldBuf(n)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+A,A,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(A){let e,i,{buffer:n}=this;if(n){if(A>0){if(this.index-1)for(let o=e+A,r=A<0?-1:i._tree.children.length;o!=r;o+=A){let s=i._tree.children[o];if(this.mode&bs.IncludeAnonymous||s instanceof xC||!s.type.isAnonymous||ZT(s))return!1}return!0}move(A,e){if(e&&this.enterChild(A,0,4))return!0;for(;;){if(this.sibling(A))return!0;if(this.atLastNode(A)||!this.parent())return!1}}next(A=!0){return this.move(1,A)}prev(A=!0){return this.move(-1,A)}moveTo(A,e=0){for(;(this.from==this.to||(e<1?this.from>=A:this.from>A)||(e>-1?this.to<=A:this.to=0;){for(let r=A;r;r=r._parent)if(r.index==n){if(n==this.index)return r;e=r,i=o+1;break e}n=this.stack[--o]}for(let n=i;n=0;o--){if(o<0)return jT(this._tree,A,n);let r=i[e.buffer[this.stack[o]]];if(!r.isAnonymous){if(A[n]&&A[n]!=r.name)return!1;n--}}return!0}};function ZT(t){return t.children.some(A=>A instanceof xC||!A.type.isAnonymous||ZT(A))}function cze(t){var A;let{buffer:e,nodeSet:i,maxBufferLength:n=1024,reused:o=[],minRepeatType:r=i.types.length}=t,s=Array.isArray(e)?new PT(e,e.length):e,a=i.types,c=0,l=0;function d(w,_,K,J,O,H){let{id:V,start:Z,end:ye,size:P}=s,se=l,X=c;for(;P<0;)if(s.next(),P==-1){let Te=o[V];K.push(Te),J.push(Z-w);return}else if(P==-3){c=V;return}else if(P==-4){l=V;return}else throw new RangeError(`Unrecognized record size: ${P}`);let ue=a[V],oe,le,me=Z-w;if(ye-Z<=n&&(le=B(s.pos-_,O))){let Te=new Uint16Array(le.size-le.skip),$e=s.pos-le.size,Je=Te.length;for(;s.pos>$e;)Je=f(le.start,Te,Je);oe=new xC(Te,ye-le.start,i),me=le.start-w}else{let Te=s.pos-P;s.next();let $e=[],Je=[],Qe=V>=r?V:-1,He=0,PA=ye;for(;s.pos>Te;)Qe>=0&&s.id==Qe&&s.size>=0?(s.end<=PA-n&&(u($e,Je,Z,He,s.end,PA,Qe,se,X),He=$e.length,PA=s.end),s.next()):H>2500?C(Z,Te,$e,Je):d(Z,Te,$e,Je,Qe,H+1);if(Qe>=0&&He>0&&He<$e.length&&u($e,Je,Z,He,Z,PA,Qe,se,X),$e.reverse(),Je.reverse(),Qe>-1&&He>0){let JA=I(ue,X);oe=XT(ue,$e,Je,0,$e.length,0,ye-Z,JA,JA)}else oe=h(ue,$e,Je,ye-Z,se-ye,X)}K.push(oe),J.push(me)}function C(w,_,K,J){let O=[],H=0,V=-1;for(;s.pos>_;){let{id:Z,start:ye,end:P,size:se}=s;if(se>4)s.next();else{if(V>-1&&ye=0;P-=3)Z[se++]=O[P],Z[se++]=O[P+1]-ye,Z[se++]=O[P+2]-ye,Z[se++]=se;K.push(new xC(Z,O[2]-ye,i)),J.push(ye-w)}}function I(w,_){return(K,J,O)=>{let H=0,V=K.length-1,Z,ye;if(V>=0&&(Z=K[V])instanceof as){if(!V&&Z.type==w&&Z.length==O)return Z;(ye=Z.prop(ki.lookAhead))&&(H=J[V]+Z.length+ye)}return h(w,K,J,O,H,_)}}function u(w,_,K,J,O,H,V,Z,ye){let P=[],se=[];for(;w.length>J;)P.push(w.pop()),se.push(_.pop()+K-O);w.push(h(i.types[V],P,se,H-O,Z-H,ye)),_.push(O-K)}function h(w,_,K,J,O,H,V){if(H){let Z=[ki.contextHash,H];V=V?[Z].concat(V):[Z]}if(O>25){let Z=[ki.lookAhead,O];V=V?[Z].concat(V):[Z]}return new as(w,_,K,J,V)}function B(w,_){let K=s.fork(),J=0,O=0,H=0,V=K.end-n,Z={size:0,start:0,skip:0};e:for(let ye=K.pos-w;K.pos>ye;){let P=K.size;if(K.id==_&&P>=0){Z.size=J,Z.start=O,Z.skip=H,H+=4,J+=4,K.next();continue}let se=K.pos-P;if(P<0||se=r?4:0,ue=K.start;for(K.next();K.pos>se;){if(K.size<0)if(K.size==-3)X+=4;else break e;else K.id>=r&&(X+=4);K.next()}O=ue,J+=P,H+=X}return(_<0||J==w)&&(Z.size=J,Z.start=O,Z.skip=H),Z.size>4?Z:void 0}function f(w,_,K){let{id:J,start:O,end:H,size:V}=s;if(s.next(),V>=0&&J4){let ye=s.pos-(V-4);for(;s.pos>ye;)K=f(w,_,K)}_[--K]=Z,_[--K]=H-w,_[--K]=O-w,_[--K]=J}else V==-3?c=J:V==-4&&(l=J);return K}let b=[],k=[];for(;s.pos>0;)d(t.start||0,t.bufferStart||0,b,k,-1,0);let S=(A=t.length)!==null&&A!==void 0?A:b.length?k[0]+b[0].length:0;return new as(a[t.topID],b.reverse(),k.reverse(),S)}var Gle=new WeakMap;function Z7(t,A){if(!t.isAnonymous||A instanceof xC||A.type!=t)return 1;let e=Gle.get(A);if(e==null){e=1;for(let i of A.children){if(i.type!=t||!(i instanceof as)){e=1;break}e+=Z7(t,i)}Gle.set(A,e)}return e}function XT(t,A,e,i,n,o,r,s,a){let c=0;for(let u=i;u=l)break;_+=K}if(k==S+1){if(_>l){let K=u[S];I(K.children,K.positions,0,K.children.length,h[S]+b);continue}d.push(u[S])}else{let K=h[k-1]+u[k-1].length-w;d.push(XT(t,u,h,S,k,w,K,null,a))}C.push(w+b-o)}}return I(A,e,i,n,0),(s||a)(d,C,r)}var Yu=class t{constructor(A,e,i,n,o=!1,r=!1){this.from=A,this.to=e,this.tree=i,this.offset=n,this.open=(o?1:0)|(r?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(A,e=[],i=!1){let n=[new t(0,A.length,A,0,!1,i)];for(let o of e)o.to>A.length&&n.push(o);return n}static applyChanges(A,e,i=128){if(!e.length)return A;let n=[],o=1,r=A.length?A[0]:null;for(let s=0,a=0,c=0;;s++){let l=s=i)for(;r&&r.from=C.from||d<=C.to||c){let I=Math.max(C.from,a)-c,u=Math.min(C.to,d)-c;C=I>=u?null:new t(I,u,C.tree,C.offset+c,s>0,!!l)}if(C&&n.push(C),r.to>d)break;r=onew op(n.from,n.to)):[new op(0,0)]:[new op(0,A.length)],this.createParse(A,e||[],i)}parse(A,e,i){let n=this.startParse(A,e,i);for(;;){let o=n.advance();if(o)return o}}},WT=class{constructor(A){this.string=A}get length(){return this.string.length}chunk(A){return this.string.slice(A)}get lineChunks(){return!1}read(A,e){return this.string.slice(A,e)}};var GTA=new ki({perNode:!0});var lze=0,Pg=class t{constructor(A,e,i,n){this.name=A,this.set=e,this.base=i,this.modified=n,this.id=lze++}toString(){let{name:A}=this;for(let e of this.modified)e.name&&(A=`${e.name}(${A})`);return A}static define(A,e){let i=typeof A=="string"?A:"?";if(A instanceof t&&(e=A),e?.base)throw new Error("Can not derive from a modified tag");let n=new t(i,[],null,[]);if(n.set.push(n),e)for(let o of e.set)n.set.push(o);return n}static defineModifier(A){let e=new tb(A);return i=>i.modified.indexOf(e)>-1?i:tb.get(i.base||i,i.modified.concat(e).sort((n,o)=>n.id-o.id))}},gze=0,tb=class t{constructor(A){this.name=A,this.instances=[],this.id=gze++}static get(A,e){if(!e.length)return A;let i=e[0].instances.find(s=>s.base==A&&dze(e,s.modified));if(i)return i;let n=[],o=new Pg(A.name,n,A,e);for(let s of e)s.instances.push(o);let r=Cze(e);for(let s of A.set)if(!s.modified.length)for(let a of r)n.push(t.get(s,a));return o}};function dze(t,A){return t.length==A.length&&t.every((e,i)=>e==A[i])}function Cze(t){let A=[[]];for(let e=0;ei.length-e.length)}function ib(t){let A=Object.create(null);for(let e in t){let i=t[e];Array.isArray(i)||(i=[i]);for(let n of e.split(" "))if(n){let o=[],r=2,s=n;for(let d=0;;){if(s=="..."&&d>0&&d+3==n.length){r=1;break}let C=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(s);if(!C)throw new RangeError("Invalid path: "+n);if(o.push(C[0]=="*"?"":C[0][0]=='"'?JSON.parse(C[0]):C[0]),d+=C[0].length,d==n.length)break;let I=n[d++];if(d==n.length&&I=="!"){r=0;break}if(I!="/")throw new RangeError("Invalid path: "+n);s=n.slice(d)}let a=o.length-1,c=o[a];if(!c)throw new RangeError("Invalid path: "+n);let l=new Qf(i,r,a>0?o.slice(0,a):null);A[c]=l.sort(A[c])}}return Jle.add(A)}var Jle=new ki,Qf=class{constructor(A,e,i,n){this.tags=A,this.mode=e,this.context=i,this.next=n}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(A){return!A||A.depth{let r=n;for(let s of o)for(let a of s.set){let c=e[a.id];if(c){r=r?r+" "+c:c;break}}return r},scope:i}}function Ize(t,A){let e=null;for(let i of t){let n=i.style(A);n&&(e=e?e+" "+n:n)}return e}function Yle(t,A,e,i=0,n=t.length){let o=new eO(i,Array.isArray(A)?A:[A],e);o.highlightRange(t.cursor(),i,n,"",o.highlighters),o.flush(n)}var eO=class{constructor(A,e,i){this.at=A,this.highlighters=e,this.span=i,this.class=""}startSpan(A,e){e!=this.class&&(this.flush(A),A>this.at&&(this.at=A),this.class=e)}flush(A){A>this.at&&this.class&&this.span(this.at,A,this.class)}highlightRange(A,e,i,n,o){let{type:r,from:s,to:a}=A;if(s>=i||a<=e)return;r.isTop&&(o=this.highlighters.filter(I=>!I.scope||I.scope(r)));let c=n,l=uze(A)||Qf.empty,d=Ize(o,l.tags);if(d&&(c&&(c+=" "),c+=d,l.mode==1&&(n+=(n?" ":"")+d)),this.startSpan(Math.max(e,s),c),l.opaque)return;let C=A.tree&&A.tree.prop(ki.mounted);if(C&&C.overlay){let I=A.node.enter(C.overlay[0].from+s,1),u=this.highlighters.filter(B=>!B.scope||B.scope(C.tree.type)),h=A.firstChild();for(let B=0,f=s;;B++){let b=B=k||!A.nextSibling())););if(!b||k>i)break;f=b.to+s,f>e&&(this.highlightRange(I.cursor(),Math.max(e,b.from+s),Math.min(i,f),"",u),this.startSpan(Math.min(i,f),c))}h&&A.parent()}else if(A.firstChild()){C&&(n="");do if(!(A.to<=e)){if(A.from>=i)break;this.highlightRange(A,e,i,n,o),this.startSpan(Math.min(i,A.to),c)}while(A.nextSibling());A.parent()}}};function uze(t){let A=t.type.prop(Jle);for(;A&&A.context&&!t.matchContext(A.context);)A=A.next;return A||null}var tt=Pg.define,$7=tt(),_C=tt(),Tle=tt(_C),Ole=tt(_C),RC=tt(),eb=tt(RC),$T=tt(RC),vd=tt(),Hu=tt(vd),yd=tt(),Dd=tt(),AO=tt(),lp=tt(AO),Ab=tt(),GA={comment:$7,lineComment:tt($7),blockComment:tt($7),docComment:tt($7),name:_C,variableName:tt(_C),typeName:Tle,tagName:tt(Tle),propertyName:Ole,attributeName:tt(Ole),className:tt(_C),labelName:tt(_C),namespace:tt(_C),macroName:tt(_C),literal:RC,string:eb,docString:tt(eb),character:tt(eb),attributeValue:tt(eb),number:$T,integer:tt($T),float:tt($T),bool:tt(RC),regexp:tt(RC),escape:tt(RC),color:tt(RC),url:tt(RC),keyword:yd,self:tt(yd),null:tt(yd),atom:tt(yd),unit:tt(yd),modifier:tt(yd),operatorKeyword:tt(yd),controlKeyword:tt(yd),definitionKeyword:tt(yd),moduleKeyword:tt(yd),operator:Dd,derefOperator:tt(Dd),arithmeticOperator:tt(Dd),logicOperator:tt(Dd),bitwiseOperator:tt(Dd),compareOperator:tt(Dd),updateOperator:tt(Dd),definitionOperator:tt(Dd),typeOperator:tt(Dd),controlOperator:tt(Dd),punctuation:AO,separator:tt(AO),bracket:lp,angleBracket:tt(lp),squareBracket:tt(lp),paren:tt(lp),brace:tt(lp),content:vd,heading:Hu,heading1:tt(Hu),heading2:tt(Hu),heading3:tt(Hu),heading4:tt(Hu),heading5:tt(Hu),heading6:tt(Hu),contentSeparator:tt(vd),list:tt(vd),quote:tt(vd),emphasis:tt(vd),strong:tt(vd),link:tt(vd),monospace:tt(vd),strikethrough:tt(vd),inserted:tt(),deleted:tt(),changed:tt(),invalid:tt(),meta:Ab,documentMeta:tt(Ab),annotation:tt(Ab),processingInstruction:tt(Ab),definition:Pg.defineModifier("definition"),constant:Pg.defineModifier("constant"),function:Pg.defineModifier("function"),standard:Pg.defineModifier("standard"),local:Pg.defineModifier("local"),special:Pg.defineModifier("special")};for(let t in GA){let A=GA[t];A instanceof Pg&&(A.name=t)}var TTA=tO([{tag:GA.link,class:"tok-link"},{tag:GA.heading,class:"tok-heading"},{tag:GA.emphasis,class:"tok-emphasis"},{tag:GA.strong,class:"tok-strong"},{tag:GA.keyword,class:"tok-keyword"},{tag:GA.atom,class:"tok-atom"},{tag:GA.bool,class:"tok-bool"},{tag:GA.url,class:"tok-url"},{tag:GA.labelName,class:"tok-labelName"},{tag:GA.inserted,class:"tok-inserted"},{tag:GA.deleted,class:"tok-deleted"},{tag:GA.literal,class:"tok-literal"},{tag:GA.string,class:"tok-string"},{tag:GA.number,class:"tok-number"},{tag:[GA.regexp,GA.escape,GA.special(GA.string)],class:"tok-string2"},{tag:GA.variableName,class:"tok-variableName"},{tag:GA.local(GA.variableName),class:"tok-variableName tok-local"},{tag:GA.definition(GA.variableName),class:"tok-variableName tok-definition"},{tag:GA.special(GA.variableName),class:"tok-variableName2"},{tag:GA.definition(GA.propertyName),class:"tok-propertyName tok-definition"},{tag:GA.typeName,class:"tok-typeName"},{tag:GA.namespace,class:"tok-namespace"},{tag:GA.className,class:"tok-className"},{tag:GA.macroName,class:"tok-macroName"},{tag:GA.propertyName,class:"tok-propertyName"},{tag:GA.operator,class:"tok-operator"},{tag:GA.comment,class:"tok-comment"},{tag:GA.meta,class:"tok-meta"},{tag:GA.invalid,class:"tok-invalid"},{tag:GA.punctuation,class:"tok-punctuation"}]);var iO,mf=new ki;function hze(t){return rt.define({combine:t?A=>A.concat(t):void 0})}var Bze=new ki,jg=(()=>{class t{constructor(e,i,n=[],o=""){this.data=e,this.name=o,ss.prototype.hasOwnProperty("tree")||Object.defineProperty(ss.prototype,"tree",{get(){return Ys(this)}}),this.parser=i,this.extension=[NC.of(this),ss.languageData.of((r,s,a)=>{let c=Hle(r,s,a),l=c.type.prop(mf);if(!l)return[];let d=r.facet(l),C=c.type.prop(Bze);if(C){let I=c.resolve(s-c.from,a);for(let u of C)if(u.test(I,r)){let h=r.facet(u.facet);return u.type=="replace"?h:h.concat(d)}}return d})].concat(n)}isActiveAt(e,i,n=-1){return Hle(e,i,n).type.prop(mf)==this.data}findRegions(e){let i=e.facet(NC);if(i?.data==this.data)return[{from:0,to:e.doc.length}];if(!i||!i.allowsNesting)return[];let n=[],o=(r,s)=>{if(r.prop(mf)==this.data){n.push({from:s,to:s+r.length});return}let a=r.prop(ki.mounted);if(a){if(a.tree.prop(mf)==this.data){if(a.overlay)for(let c of a.overlay)n.push({from:c.from+s,to:c.to+s});else n.push({from:s,to:s+r.length});return}else if(a.overlay){let c=n.length;if(o(a.tree,a.overlay[0].from+s),n.length>c)return}}for(let c=0;ci.isTop?e:void 0)]}),A.name)}configure(A,e){return new t(this.data,this.parser.configure(A),e||this.name)}get allowsNesting(){return this.parser.hasWrappers()}};function Ys(t){let A=t.field(jg.state,!1);return A?A.tree:as.empty}function uO(t,A,e=50){var i;let n=(i=t.field(jg.state,!1))===null||i===void 0?void 0:i.context;if(!n)return null;let o=n.viewport;n.updateViewport({from:0,to:A});let r=n.isDone(A)||n.work(e,A)?n.tree:null;return n.updateViewport(o),r}var sO=class{constructor(A){this.doc=A,this.cursorPos=0,this.string="",this.cursor=A.iter()}get length(){return this.doc.length}syncTo(A){return this.string=this.cursor.next(A-this.cursorPos).value,this.cursorPos=A+this.string.length,this.cursorPos-this.string.length}chunk(A){return this.syncTo(A),this.string}get lineChunks(){return!0}read(A,e){let i=this.cursorPos-this.string.length;return A=this.cursorPos?this.doc.sliceString(A,e):this.string.slice(A-i,e-i)}},gp=null,aO=class t{constructor(A,e,i=[],n,o,r,s,a){this.parser=A,this.state=e,this.fragments=i,this.tree=n,this.treeLen=o,this.viewport=r,this.skipped=s,this.scheduleOn=a,this.parse=null,this.tempSkipped=[]}static create(A,e,i){return new t(A,e,[],as.empty,0,i,[],null)}startParse(){return this.parser.startParse(new sO(this.state.doc),this.fragments)}work(A,e){return e!=null&&e>=this.state.doc.length&&(e=void 0),this.tree!=as.empty&&this.isDone(e??this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof A=="number"){let n=Date.now()+A;A=()=>Date.now()>n}for(this.parse||(this.parse=this.startParse()),e!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&e=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>A)&&this.parse.stopAt(A),this.withContext(()=>{for(;!(e=this.parse.advance()););}),this.treeLen=A,this.tree=e,this.fragments=this.withoutTempSkipped(Yu.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(A){let e=gp;gp=this;try{return A()}finally{gp=e}}withoutTempSkipped(A){for(let e;e=this.tempSkipped.pop();)A=zle(A,e.from,e.to);return A}changes(A,e){let{fragments:i,tree:n,treeLen:o,viewport:r,skipped:s}=this;if(this.takeTree(),!A.empty){let a=[];if(A.iterChangedRanges((c,l,d,C)=>a.push({fromA:c,toA:l,fromB:d,toB:C})),i=Yu.applyChanges(i,a),n=as.empty,o=0,r={from:A.mapPos(r.from,-1),to:A.mapPos(r.to,1)},this.skipped.length){s=[];for(let c of this.skipped){let l=A.mapPos(c.from,1),d=A.mapPos(c.to,-1);lA.from&&(this.fragments=zle(this.fragments,n,o),this.skipped.splice(i--,1))}return this.skipped.length>=e?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(A,e){this.skipped.push({from:A,to:e})}static getSkippingParser(A){return new class extends ff{createParse(e,i,n){let o=n[0].from,r=n[n.length-1].to;return{parsedPos:o,advance(){let a=gp;if(a){for(let c of n)a.tempSkipped.push(c);A&&(a.scheduleOn=a.scheduleOn?Promise.all([a.scheduleOn,A]):A)}return this.parsedPos=r,new as(Na.none,[],[],r-o)},stoppedAt:null,stopAt(){}}}}}isDone(A){A=Math.min(A,this.state.doc.length);let e=this.fragments;return this.treeLen>=A&&e.length&&e[0].from==0&&e[0].to>=A}static get(){return gp}};function zle(t,A,e){return Yu.applyChanges(t,[{fromA:A,toA:e,fromB:A,toB:e}])}var Cp=class t{constructor(A){this.context=A,this.tree=A.tree}apply(A){if(!A.docChanged&&this.tree==this.context.tree)return this;let e=this.context.changes(A.changes,A.state),i=this.context.treeLen==A.startState.doc.length?void 0:Math.max(A.changes.mapPos(this.context.treeLen),e.viewport.to);return e.work(20,i)||e.takeTree(),new t(e)}static init(A){let e=Math.min(3e3,A.doc.length),i=aO.create(A.facet(NC).parser,A,{from:0,to:e});return i.work(20,e)||i.takeTree(),new t(i)}};jg.state=_r.define({create:Cp.init,update(t,A){for(let e of A.effects)if(e.is(jg.setState))return e.value;return A.startState.facet(NC)!=A.state.facet(NC)?Cp.init(A.state):t.apply(A)}});var Zle=t=>{let A=setTimeout(()=>t(),500);return()=>clearTimeout(A)};typeof requestIdleCallback<"u"&&(Zle=t=>{let A=-1,e=setTimeout(()=>{A=requestIdleCallback(t,{timeout:400})},100);return()=>A<0?clearTimeout(e):cancelIdleCallback(A)});var nO=typeof navigator<"u"&&(!((iO=navigator.scheduling)===null||iO===void 0)&&iO.isInputPending)?()=>navigator.scheduling.isInputPending():null,Eze=Jo.fromClass(class{constructor(A){this.view=A,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(A){let e=this.view.state.field(jg.state).context;(e.updateViewport(A.view.viewport)||this.view.viewport.to>e.treeLen)&&this.scheduleWork(),(A.docChanged||A.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(e)}scheduleWork(){if(this.working)return;let{state:A}=this.view,e=A.field(jg.state);(e.tree!=e.context.tree||!e.context.isDone(A.doc.length))&&(this.working=Zle(this.work))}work(A){this.working=null;let e=Date.now();if(this.chunkEndn+1e3,a=o.context.work(()=>nO&&nO()||Date.now()>r,n+(s?0:1e5));this.chunkBudget-=Date.now()-e,(a||this.chunkBudget<=0)&&(o.context.takeTree(),this.view.dispatch({effects:jg.setState.of(new Cp(o.context))})),this.chunkBudget>0&&!(a&&!s)&&this.scheduleWork(),this.checkAsyncSchedule(o.context)}checkAsyncSchedule(A){A.scheduleOn&&(this.workScheduled++,A.scheduleOn.then(()=>this.scheduleWork()).catch(e=>Js(this.view.state,e)).then(()=>this.workScheduled--),A.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),NC=rt.define({combine(t){return t.length?t[0]:null},enables:t=>[jg.state,Eze,ai.contentAttributes.compute([t],A=>{let e=A.facet(t);return e&&e.name?{"data-language":e.name}:{}})]}),ob=class{constructor(A,e=[]){this.language=A,this.support=e,this.extension=[A,e]}};var fze=rt.define(),ju=rt.define({combine:t=>{if(!t.length)return" ";let A=t[0];if(!A||/\S/.test(A)||Array.from(A).some(e=>e!=A[0]))throw new Error("Invalid indent unit: "+JSON.stringify(t[0]));return A}});function qg(t){let A=t.facet(ju);return A.charCodeAt(0)==9?t.tabSize*A.length:A.length}function yf(t,A){let e="",i=t.tabSize,n=t.facet(ju)[0];if(n==" "){for(;A>=i;)e+=" ",A-=i;n=" "}for(let o=0;o=A?Qze(t,e,A):null}var zu=class{constructor(A,e={}){this.state=A,this.options=e,this.unit=qg(A)}lineAt(A,e=1){let i=this.state.doc.lineAt(A),{simulateBreak:n,simulateDoubleBreak:o}=this.options;return n!=null&&n>=i.from&&n<=i.to?o&&n==A?{text:"",from:A}:(e<0?n-1&&(o+=r-this.countColumn(i,i.search(/\S|$/))),o}countColumn(A,e=A.length){return L2(A,this.state.tabSize,e)}lineIndent(A,e=1){let{text:i,from:n}=this.lineAt(A,e),o=this.options.overrideIndentation;if(o){let r=o(n);if(r>-1)return r}return this.countColumn(i,i.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}},hO=new ki;function Qze(t,A,e){let i=A.resolveStack(e),n=A.resolveInner(e,-1).resolve(e,0).enterUnfinishedNodesBefore(e);if(n!=i.node){let o=[];for(let r=n;r&&!(r.fromi.node.to||r.from==i.node.from&&r.type==i.node.type);r=r.parent)o.push(r);for(let r=o.length-1;r>=0;r--)i={node:o[r],next:i}}return Xle(i,t,e)}function Xle(t,A,e){for(let i=t;i;i=i.next){let n=pze(i.node);if(n)return n(cO.create(A,e,i))}return 0}function mze(t){return t.pos==t.options.simulateBreak&&t.options.simulateDoubleBreak}function pze(t){let A=t.type.prop(hO);if(A)return A;let e=t.firstChild,i;if(e&&(i=e.type.prop(ki.closedBy))){let n=t.lastChild,o=n&&i.indexOf(n.name)>-1;return r=>vze(r,!0,1,void 0,o&&!mze(r)?n.from:void 0)}return t.parent==null?wze:null}function wze(){return 0}var cO=class t extends zu{constructor(A,e,i){super(A.state,A.options),this.base=A,this.pos=e,this.context=i}get node(){return this.context.node}static create(A,e,i){return new t(A,e,i)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(A){let e=this.state.doc.lineAt(A.from);for(;;){let i=A.resolve(e.from);for(;i.parent&&i.parent.from==i.from;)i=i.parent;if(yze(i,A))break;e=this.state.doc.lineAt(i.from)}return this.lineIndent(e.from)}continue(){return Xle(this.context.next,this.base,this.pos)}};function yze(t,A){for(let e=A;e;e=e.parent)if(t==e)return!0;return!1}function Dze(t){let A=t.node,e=A.childAfter(A.from),i=A.lastChild;if(!e)return null;let n=t.options.simulateBreak,o=t.state.doc.lineAt(e.from),r=n==null||n<=o.from?o.to:Math.min(o.to,n);for(let s=e.to;;){let a=A.childAfter(s);if(!a||a==i)return null;if(!a.type.isSkipped){if(a.from>=r)return null;let c=/^ */.exec(o.text.slice(e.to-o.from))[0].length;return{from:e.from,to:e.to+c}}s=a.to}}function vze(t,A,e,i,n){let o=t.textAfter,r=o.match(/^\s*/)[0].length,s=i&&o.slice(r,r+i.length)==i||n==t.pos+r,a=A?Dze(t):null;return a?s?t.column(a.from):t.column(a.to):t.baseIndent+(s?0:t.unit*e)}function BO({except:t,units:A=1}={}){return e=>{let i=t&&t.test(e.textAfter);return e.baseIndent+(i?0:A*e.unit)}}var bze=200;function $le(){return ss.transactionFilter.of(t=>{if(!t.docChanged||!t.isUserEvent("input.type")&&!t.isUserEvent("input.complete"))return t;let A=t.startState.languageDataAt("indentOnInput",t.startState.selection.main.head);if(!A.length)return t;let e=t.newDoc,{head:i}=t.newSelection.main,n=e.lineAt(i);if(i>n.from+bze)return t;let o=e.sliceString(n.from,i);if(!A.some(c=>c.test(o)))return t;let{state:r}=t,s=-1,a=[];for(let{head:c}of r.selection.ranges){let l=r.doc.lineAt(c);if(l.from==s)continue;s=l.from;let d=sb(r,l.from);if(d==null)continue;let C=/^\s*/.exec(l.text)[0],I=yf(r,d);C!=I&&a.push({from:l.from,to:l.from+C.length,insert:I})}return a.length?[t,{changes:a,sequential:!0}]:t})}var EO=rt.define(),Ip=new ki;function ege(t){let A=t.firstChild,e=t.lastChild;return A&&A.toe)continue;if(o&&s.from=A&&c.to>e&&(o=c)}}return o}function Sze(t){let A=t.lastChild;return A&&A.to==t.to&&A.type.isError}function pf(t,A,e){for(let i of t.facet(EO)){let n=i(t,A,e);if(n)return n}return Mze(t,A,e)}function Age(t,A){let e=A.mapPos(t.from,1),i=A.mapPos(t.to,-1);return e>=i?void 0:{from:e,to:i}}var Df=tn.define({map:Age}),up=tn.define({map:Age});function tge(t){let A=[];for(let{head:e}of t.state.selection.ranges)A.some(i=>i.from<=e&&i.to>=e)||A.push(t.lineBlockAt(e));return A}var Pu=_r.define({create(){return bt.none},update(t,A){A.isUserEvent("delete")&&A.changes.iterChangedRanges((e,i)=>t=Ple(t,e,i)),t=t.map(A.changes);for(let e of A.effects)if(e.is(Df)&&!kze(t,e.value.from,e.value.to)){let{preparePlaceholder:i}=A.state.facet(mO),n=i?bt.replace({widget:new lO(i(A.state,e.value))}):jle;t=t.update({add:[n.range(e.value.from,e.value.to)]})}else e.is(up)&&(t=t.update({filter:(i,n)=>e.value.from!=i||e.value.to!=n,filterFrom:e.value.from,filterTo:e.value.to}));return A.selection&&(t=Ple(t,A.selection.main.head)),t},provide:t=>ai.decorations.from(t),toJSON(t,A){let e=[];return t.between(0,A.doc.length,(i,n)=>{e.push(i,n)}),e},fromJSON(t){if(!Array.isArray(t)||t.length%2)throw new RangeError("Invalid JSON for fold state");let A=[];for(let e=0;e{nA&&(i=!0)}),i?t.update({filterFrom:A,filterTo:e,filter:(n,o)=>n>=e||o<=A}):t}function rb(t,A,e){var i;let n=null;return(i=t.field(Pu,!1))===null||i===void 0||i.between(A,e,(o,r)=>{(!n||n.from>o)&&(n={from:o,to:r})}),n}function kze(t,A,e){let i=!1;return t.between(A,A,(n,o)=>{n==A&&o==e&&(i=!0)}),i}function ige(t,A){return t.field(Pu,!1)?A:A.concat(tn.appendConfig.of(rge()))}var xze=t=>{for(let A of tge(t)){let e=pf(t.state,A.from,A.to);if(e)return t.dispatch({effects:ige(t.state,[Df.of(e),nge(t,e)])}),!0}return!1},fO=t=>{if(!t.state.field(Pu,!1))return!1;let A=[];for(let e of tge(t)){let i=rb(t.state,e.from,e.to);i&&A.push(up.of(i),nge(t,i,!1))}return A.length&&t.dispatch({effects:A}),A.length>0};function nge(t,A,e=!0){let i=t.state.doc.lineAt(A.from).number,n=t.state.doc.lineAt(A.to).number;return ai.announce.of(`${t.state.phrase(e?"Folded lines":"Unfolded lines")} ${i} ${t.state.phrase("to")} ${n}.`)}var _ze=t=>{let{state:A}=t,e=[];for(let i=0;i{let A=t.state.field(Pu,!1);if(!A||!A.size)return!1;let e=[];return A.between(0,t.state.doc.length,(i,n)=>{e.push(up.of({from:i,to:n}))}),t.dispatch({effects:e}),!0};var oge=[{key:"Ctrl-Shift-[",mac:"Cmd-Alt-[",run:xze},{key:"Ctrl-Shift-]",mac:"Cmd-Alt-]",run:fO},{key:"Ctrl-Alt-[",run:_ze},{key:"Ctrl-Alt-]",run:QO}],Rze={placeholderDOM:null,preparePlaceholder:null,placeholderText:"\u2026"},mO=rt.define({combine(t){return Os(t,Rze)}});function rge(t){let A=[Pu,Lze];return t&&A.push(mO.of(t)),A}function sge(t,A){let{state:e}=t,i=e.facet(mO),n=r=>{let s=t.lineBlockAt(t.posAtDOM(r.target)),a=rb(t.state,s.from,s.to);a&&t.dispatch({effects:up.of(a)}),r.preventDefault()};if(i.placeholderDOM)return i.placeholderDOM(t,n,A);let o=document.createElement("span");return o.textContent=i.placeholderText,o.setAttribute("aria-label",e.phrase("folded code")),o.title=e.phrase("unfold"),o.className="cm-foldPlaceholder",o.onclick=n,o}var jle=bt.replace({widget:new class extends Ql{toDOM(t){return sge(t,null)}}}),lO=class extends Ql{constructor(A){super(),this.value=A}eq(A){return this.value==A.value}toDOM(A){return sge(A,this.value)}},Nze={openText:"\u2304",closedText:"\u203A",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1},dp=class extends Kc{constructor(A,e){super(),this.config=A,this.open=e}eq(A){return this.config==A.config&&this.open==A.open}toDOM(A){if(this.config.markerDOM)return this.config.markerDOM(this.open);let e=document.createElement("span");return e.textContent=this.open?this.config.openText:this.config.closedText,e.title=A.state.phrase(this.open?"Fold line":"Unfold line"),e}};function age(t={}){let A=ae(ae({},Nze),t),e=new dp(A,!0),i=new dp(A,!1),n=Jo.fromClass(class{constructor(r){this.from=r.viewport.from,this.markers=this.buildMarkers(r)}update(r){(r.docChanged||r.viewportChanged||r.startState.facet(NC)!=r.state.facet(NC)||r.startState.field(Pu,!1)!=r.state.field(Pu,!1)||Ys(r.startState)!=Ys(r.state)||A.foldingChanged(r))&&(this.markers=this.buildMarkers(r.view))}buildMarkers(r){let s=new ga;for(let a of r.viewportLineBlocks){let c=rb(r.state,a.from,a.to)?i:pf(r.state,a.from,a.to)?e:null;c&&s.add(a.from,a.from,c)}return s.finish()}}),{domEventHandlers:o}=A;return[n,q7({class:"cm-foldGutter",markers(r){var s;return((s=r.plugin(n))===null||s===void 0?void 0:s.markers)||To.empty},initialSpacer(){return new dp(A,!1)},domEventHandlers:_A(ae({},o),{click:(r,s,a)=>{if(o.click&&o.click(r,s,a))return!0;let c=rb(r.state,s.from,s.to);if(c)return r.dispatch({effects:up.of(c)}),!0;let l=pf(r.state,s.from,s.to);return l?(r.dispatch({effects:Df.of(l)}),!0):!1}})}),rge()]}var Lze=ai.baseTheme({".cm-foldPlaceholder":{backgroundColor:"#eee",border:"1px solid #ddd",color:"#888",borderRadius:".2em",margin:"0 1px",padding:"0 1px",cursor:"pointer"},".cm-foldGutter span":{padding:"0 1px",cursor:"pointer"}}),wf=class t{constructor(A,e){this.specs=A;let i;function n(s){let a=Ag.newName();return(i||(i=Object.create(null)))["."+a]=s,a}let o=typeof e.all=="string"?e.all:e.all?n(e.all):void 0,r=e.scope;this.scope=r instanceof jg?s=>s.prop(mf)==r.data:r?s=>s==r:void 0,this.style=tO(A.map(s=>({tag:s.tag,class:s.class||n(Object.assign({},s,{tag:null}))})),{all:o}).style,this.module=i?new Ag(i):null,this.themeType=e.themeType}static define(A,e){return new t(A,e||{})}},gO=rt.define(),cge=rt.define({combine(t){return t.length?[t[0]]:null}});function oO(t){let A=t.facet(gO);return A.length?A:t.facet(cge)}function pO(t,A){let e=[Fze],i;return t instanceof wf&&(t.module&&e.push(ai.styleModule.of(t.module)),i=t.themeType),A?.fallback?e.push(cge.of(t)):i?e.push(gO.computeN([ai.darkTheme],n=>n.facet(ai.darkTheme)==(i=="dark")?[t]:[])):e.push(gO.of(t)),e}var dO=class{constructor(A){this.markCache=Object.create(null),this.tree=Ys(A.state),this.decorations=this.buildDeco(A,oO(A.state)),this.decoratedTo=A.viewport.to}update(A){let e=Ys(A.state),i=oO(A.state),n=i!=oO(A.startState),{viewport:o}=A.view,r=A.changes.mapPos(this.decoratedTo,1);e.length=o.to?(this.decorations=this.decorations.map(A.changes),this.decoratedTo=r):(e!=this.tree||A.viewportChanged||n)&&(this.tree=e,this.decorations=this.buildDeco(A.view,i),this.decoratedTo=o.to)}buildDeco(A,e){if(!e||!this.tree.length)return bt.none;let i=new ga;for(let{from:n,to:o}of A.visibleRanges)Yle(this.tree,e,(r,s,a)=>{i.add(r,s,this.markCache[a]||(this.markCache[a]=bt.mark({class:a})))},n,o);return i.finish()}},Fze=Hg.high(Jo.fromClass(dO,{decorations:t=>t.decorations})),lge=wf.define([{tag:GA.meta,color:"#404740"},{tag:GA.link,textDecoration:"underline"},{tag:GA.heading,textDecoration:"underline",fontWeight:"bold"},{tag:GA.emphasis,fontStyle:"italic"},{tag:GA.strong,fontWeight:"bold"},{tag:GA.strikethrough,textDecoration:"line-through"},{tag:GA.keyword,color:"#708"},{tag:[GA.atom,GA.bool,GA.url,GA.contentSeparator,GA.labelName],color:"#219"},{tag:[GA.literal,GA.inserted],color:"#164"},{tag:[GA.string,GA.deleted],color:"#a11"},{tag:[GA.regexp,GA.escape,GA.special(GA.string)],color:"#e40"},{tag:GA.definition(GA.variableName),color:"#00f"},{tag:GA.local(GA.variableName),color:"#30a"},{tag:[GA.typeName,GA.namespace],color:"#085"},{tag:GA.className,color:"#167"},{tag:[GA.special(GA.variableName),GA.macroName],color:"#256"},{tag:GA.definition(GA.propertyName),color:"#00c"},{tag:GA.comment,color:"#940"},{tag:GA.invalid,color:"#f00"}]),Gze=ai.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),gge=1e4,dge="()[]{}",Cge=rt.define({combine(t){return Os(t,{afterCursor:!0,brackets:dge,maxScanDistance:gge,renderMatch:Tze})}}),Kze=bt.mark({class:"cm-matchingBracket"}),Uze=bt.mark({class:"cm-nonmatchingBracket"});function Tze(t){let A=[],e=t.matched?Kze:Uze;return A.push(e.range(t.start.from,t.start.to)),t.end&&A.push(e.range(t.end.from,t.end.to)),A}var Oze=_r.define({create(){return bt.none},update(t,A){if(!A.docChanged&&!A.selection)return t;let e=[],i=A.state.facet(Cge);for(let n of A.state.selection.ranges){if(!n.empty)continue;let o=Vg(A.state,n.head,-1,i)||n.head>0&&Vg(A.state,n.head-1,1,i)||i.afterCursor&&(Vg(A.state,n.head,1,i)||n.headai.decorations.from(t)}),Jze=[Oze,Gze];function Ige(t={}){return[Cge.of(t),Jze]}var Yze=new ki;function CO(t,A,e){let i=t.prop(A<0?ki.openedBy:ki.closedBy);if(i)return i;if(t.name.length==1){let n=e.indexOf(t.name);if(n>-1&&n%2==(A<0?1:0))return[e[n+A]]}return null}function IO(t){let A=t.type.prop(Yze);return A?A(t.node):t}function Vg(t,A,e,i={}){let n=i.maxScanDistance||gge,o=i.brackets||dge,r=Ys(t),s=r.resolveInner(A,e);for(let a=s;a;a=a.parent){let c=CO(a.type,e,o);if(c&&a.from0?A>=l.from&&Al.from&&A<=l.to))return Hze(t,A,e,a,l,c,o)}}return zze(t,A,e,r,s.type,n,o)}function Hze(t,A,e,i,n,o,r){let s=i.parent,a={from:n.from,to:n.to},c=0,l=s?.cursor();if(l&&(e<0?l.childBefore(i.from):l.childAfter(i.to)))do if(e<0?l.to<=i.from:l.from>=i.to){if(c==0&&o.indexOf(l.type.name)>-1&&l.from0)return null;let c={from:e<0?A-1:A,to:e>0?A+1:A},l=t.doc.iterRange(A,e>0?t.doc.length:0),d=0;for(let C=0;!l.next().done&&C<=o;){let I=l.value;e<0&&(C+=I.length);let u=A+C*e;for(let h=e>0?0:I.length-1,B=e>0?I.length:-1;h!=B;h+=e){let f=r.indexOf(I[h]);if(!(f<0||i.resolveInner(u+h,1).type!=n))if(f%2==0==e>0)d++;else{if(d==1)return{start:c,end:{from:u+h,to:u+h+1},matched:f>>1==a>>1};d--}}e>0&&(C+=I.length)}return l.done?{start:c,matched:!1}:null}var Pze=Object.create(null),Vle=[Na.none];var qle=[],Wle=Object.create(null),jze=Object.create(null);for(let[t,A]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])jze[t]=Vze(Pze,A);function rO(t,A){qle.indexOf(t)>-1||(qle.push(t),console.warn(A))}function Vze(t,A){let e=[];for(let s of A.split(" ")){let a=[];for(let c of s.split(".")){let l=t[c]||GA[c];l?typeof l=="function"?a.length?a=a.map(l):rO(c,`Modifier ${c} used at start of tag`):a.length?rO(c,`Tag ${c} used as modifier`):a=Array.isArray(l)?l:[l]:rO(c,`Unknown highlighting tag ${c}`)}for(let c of a)e.push(c)}if(!e.length)return 0;let i=A.replace(/ /g,"_"),n=i+" "+e.map(s=>s.id),o=Wle[n];if(o)return o.id;let r=Wle[n]=Na.define({id:Vle.length,name:i,props:[ib({[i]:e})]});return Vle.push(r),r.id}var VTA={rtl:bt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:Oo.RTL}),ltr:bt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:Oo.LTR}),auto:bt.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var qze=t=>{let{state:A}=t,e=A.doc.lineAt(A.selection.main.from),i=vO(t.state,e.from);return i.line?Wze(t):i.block?Xze(t):!1};function DO(t,A){return({state:e,dispatch:i})=>{if(e.readOnly)return!1;let n=t(A,e);return n?(i(e.update(n)),!0):!1}}var Wze=DO(APe,0);var Zze=DO(wge,0);var Xze=DO((t,A)=>wge(t,A,ePe(A)),0);function vO(t,A){let e=t.languageDataAt("commentTokens",A,1);return e.length?e[0]:{}}var hp=50;function $ze(t,{open:A,close:e},i,n){let o=t.sliceDoc(i-hp,i),r=t.sliceDoc(n,n+hp),s=/\s*$/.exec(o)[0].length,a=/^\s*/.exec(r)[0].length,c=o.length-s;if(o.slice(c-A.length,c)==A&&r.slice(a,a+e.length)==e)return{open:{pos:i-s,margin:s&&1},close:{pos:n+a,margin:a&&1}};let l,d;n-i<=2*hp?l=d=t.sliceDoc(i,n):(l=t.sliceDoc(i,i+hp),d=t.sliceDoc(n-hp,n));let C=/^\s*/.exec(l)[0].length,I=/\s*$/.exec(d)[0].length,u=d.length-I-e.length;return l.slice(C,C+A.length)==A&&d.slice(u,u+e.length)==e?{open:{pos:i+C+A.length,margin:/\s/.test(l.charAt(C+A.length))?1:0},close:{pos:n-I-e.length,margin:/\s/.test(d.charAt(u-1))?1:0}}:null}function ePe(t){let A=[];for(let e of t.selection.ranges){let i=t.doc.lineAt(e.from),n=e.to<=i.to?i:t.doc.lineAt(e.to);n.from>i.from&&n.from==e.to&&(n=e.to==i.to+1?i:t.doc.lineAt(e.to-1));let o=A.length-1;o>=0&&A[o].to>i.from?A[o].to=n.to:A.push({from:i.from+/^\s*/.exec(i.text)[0].length,to:n.to})}return A}function wge(t,A,e=A.selection.ranges){let i=e.map(o=>vO(A,o.from).block);if(!i.every(o=>o))return null;let n=e.map((o,r)=>$ze(A,i[r],o.from,o.to));if(t!=2&&!n.every(o=>o))return{changes:A.changes(e.map((o,r)=>n[r]?[]:[{from:o.from,insert:i[r].open+" "},{from:o.to,insert:" "+i[r].close}]))};if(t!=1&&n.some(o=>o)){let o=[];for(let r=0,s;rn&&(o==r||r>d.from)){n=d.from;let C=/^\s*/.exec(d.text)[0].length,I=C==d.length,u=d.text.slice(C,C+c.length)==c?C:-1;Co.comment<0&&(!o.empty||o.single))){let o=[];for(let{line:s,token:a,indent:c,empty:l,single:d}of i)(d||!l)&&o.push({from:s.from+c,insert:a+" "});let r=A.changes(o);return{changes:r,selection:A.selection.map(r,1)}}else if(t!=1&&i.some(o=>o.comment>=0)){let o=[];for(let{line:r,comment:s,token:a}of i)if(s>=0){let c=r.from+s,l=c+a.length;r.text[l-r.from]==" "&&l++,o.push({from:c,to:l})}return{changes:o}}return null}function vf(t,A){return fA.create(t.ranges.map(A),t.mainIndex)}function bd(t,A){return t.update({selection:A,scrollIntoView:!0,userEvent:"select"})}function Wg({state:t,dispatch:A},e){let i=vf(t.selection,e);return i.eq(t.selection,!0)?!1:(A(bd(t,i)),!0)}function cb(t,A){return fA.cursor(A?t.to:t.from)}function yge(t,A){return Wg(t,e=>e.empty?t.moveByChar(e,A):cb(e,A))}function La(t){return t.textDirectionAt(t.state.selection.main.head)==Oo.LTR}var Dge=t=>yge(t,!La(t)),vge=t=>yge(t,La(t));function bge(t,A){return Wg(t,e=>e.empty?t.moveByGroup(e,A):cb(e,A))}var tPe=t=>bge(t,!La(t)),iPe=t=>bge(t,La(t));var nOA=typeof Intl<"u"&&Intl.Segmenter?new Intl.Segmenter(void 0,{granularity:"word"}):null;function nPe(t,A,e){if(A.type.prop(e))return!0;let i=A.to-A.from;return i&&(i>2||/[^\s,.;:]/.test(t.sliceDoc(A.from,A.to)))||A.firstChild}function lb(t,A,e){let i=Ys(t).resolveInner(A.head),n=e?ki.closedBy:ki.openedBy;for(let a=A.head;;){let c=e?i.childAfter(a):i.childBefore(a);if(!c)break;nPe(t,c,n)?i=c:a=e?c.to:c.from}let o=i.type.prop(n),r,s;return o&&(r=e?Vg(t,i.from,1):Vg(t,i.to,-1))&&r.matched?s=e?r.end.to:r.end.from:s=e?i.to:i.from,fA.cursor(s,e?-1:1)}var oPe=t=>Wg(t,A=>lb(t.state,A,!La(t))),rPe=t=>Wg(t,A=>lb(t.state,A,La(t)));function Mge(t,A){return Wg(t,e=>{if(!e.empty)return cb(e,A);let i=t.moveVertically(e,A);return i.head!=e.head?i:t.moveToLineBoundary(e,A)})}var Sge=t=>Mge(t,!1),kge=t=>Mge(t,!0);function xge(t){let A=t.scrollDOM.clientHeightr.empty?t.moveVertically(r,A,e.height):cb(r,A));if(n.eq(i.selection))return!1;let o;if(e.selfScroll){let r=t.coordsAtPos(i.selection.main.head),s=t.scrollDOM.getBoundingClientRect(),a=s.top+e.marginTop,c=s.bottom-e.marginBottom;r&&r.top>a&&r.bottom_ge(t,!1),wO=t=>_ge(t,!0);function LC(t,A,e){let i=t.lineBlockAt(A.head),n=t.moveToLineBoundary(A,e);if(n.head==A.head&&n.head!=(e?i.to:i.from)&&(n=t.moveToLineBoundary(A,e,!1)),!e&&n.head==i.from&&i.length){let o=/^\s*/.exec(t.state.sliceDoc(i.from,Math.min(i.from+100,i.to)))[0].length;o&&A.head!=i.from+o&&(n=fA.cursor(i.from+o))}return n}var sPe=t=>Wg(t,A=>LC(t,A,!0)),aPe=t=>Wg(t,A=>LC(t,A,!1)),cPe=t=>Wg(t,A=>LC(t,A,!La(t))),lPe=t=>Wg(t,A=>LC(t,A,La(t))),gPe=t=>Wg(t,A=>fA.cursor(t.lineBlockAt(A.head).from,1)),dPe=t=>Wg(t,A=>fA.cursor(t.lineBlockAt(A.head).to,-1));function CPe(t,A,e){let i=!1,n=vf(t.selection,o=>{let r=Vg(t,o.head,-1)||Vg(t,o.head,1)||o.head>0&&Vg(t,o.head-1,1)||o.headCPe(t,A,!1);function ng(t,A){let e=vf(t.state.selection,i=>{let n=A(i);return fA.range(i.anchor,n.head,n.goalColumn,n.bidiLevel||void 0)});return e.eq(t.state.selection)?!1:(t.dispatch(bd(t.state,e)),!0)}function Rge(t,A){return ng(t,e=>t.moveByChar(e,A))}var Nge=t=>Rge(t,!La(t)),Lge=t=>Rge(t,La(t));function Fge(t,A){return ng(t,e=>t.moveByGroup(e,A))}var uPe=t=>Fge(t,!La(t)),hPe=t=>Fge(t,La(t));var BPe=t=>ng(t,A=>lb(t.state,A,!La(t))),EPe=t=>ng(t,A=>lb(t.state,A,La(t)));function Gge(t,A){return ng(t,e=>t.moveVertically(e,A))}var Kge=t=>Gge(t,!1),Uge=t=>Gge(t,!0);function Tge(t,A){return ng(t,e=>t.moveVertically(e,A,xge(t).height))}var hge=t=>Tge(t,!1),Bge=t=>Tge(t,!0),fPe=t=>ng(t,A=>LC(t,A,!0)),QPe=t=>ng(t,A=>LC(t,A,!1)),mPe=t=>ng(t,A=>LC(t,A,!La(t))),pPe=t=>ng(t,A=>LC(t,A,La(t))),wPe=t=>ng(t,A=>fA.cursor(t.lineBlockAt(A.head).from)),yPe=t=>ng(t,A=>fA.cursor(t.lineBlockAt(A.head).to)),Ege=({state:t,dispatch:A})=>(A(bd(t,{anchor:0})),!0),fge=({state:t,dispatch:A})=>(A(bd(t,{anchor:t.doc.length})),!0),Qge=({state:t,dispatch:A})=>(A(bd(t,{anchor:t.selection.main.anchor,head:0})),!0),mge=({state:t,dispatch:A})=>(A(bd(t,{anchor:t.selection.main.anchor,head:t.doc.length})),!0),DPe=({state:t,dispatch:A})=>(A(t.update({selection:{anchor:0,head:t.doc.length},userEvent:"select"})),!0),vPe=({state:t,dispatch:A})=>{let e=gb(t).map(({from:i,to:n})=>fA.range(i,Math.min(n+1,t.doc.length)));return A(t.update({selection:fA.create(e),userEvent:"select"})),!0},bPe=({state:t,dispatch:A})=>{let e=vf(t.selection,i=>{let n=Ys(t),o=n.resolveStack(i.from,1);if(i.empty){let r=n.resolveStack(i.from,-1);r.node.from>=o.node.from&&r.node.to<=o.node.to&&(o=r)}for(let r=o;r;r=r.next){let{node:s}=r;if((s.from=i.to||s.to>i.to&&s.from<=i.from)&&r.next)return fA.range(s.to,s.from)}return i});return e.eq(t.selection)?!1:(A(bd(t,e)),!0)},MPe=({state:t,dispatch:A})=>{let e=t.selection,i=null;return e.ranges.length>1?i=fA.create([e.main]):e.main.empty||(i=fA.create([fA.cursor(e.main.head)])),i?(A(bd(t,i)),!0):!1};function Bp(t,A){if(t.state.readOnly)return!1;let e="delete.selection",{state:i}=t,n=i.changeByRange(o=>{let{from:r,to:s}=o;if(r==s){let a=A(o);ar&&(e="delete.forward",a=ab(t,a,!0)),r=Math.min(r,a),s=Math.max(s,a)}else r=ab(t,r,!1),s=ab(t,s,!0);return r==s?{range:o}:{changes:{from:r,to:s},range:fA.cursor(r,rn(t)))i.between(A,A,(n,o)=>{nA&&(A=e?o:n)});return A}var Oge=(t,A,e)=>Bp(t,i=>{let n=i.from,{state:o}=t,r=o.doc.lineAt(n),s,a;if(e&&!A&&n>r.from&&nOge(t,!1,!0);var Jge=t=>Oge(t,!0,!1),Yge=(t,A)=>Bp(t,e=>{let i=e.head,{state:n}=t,o=n.doc.lineAt(i),r=n.charCategorizer(i);for(let s=null;;){if(i==(A?o.to:o.from)){i==e.head&&o.number!=(A?n.doc.lines:1)&&(i+=A?1:-1);break}let a=Cs(o.text,i-o.from,A)+o.from,c=o.text.slice(Math.min(i,a)-o.from,Math.max(i,a)-o.from),l=r(c);if(s!=null&&l!=s)break;(c!=" "||i!=e.head)&&(s=l),i=a}return i}),Hge=t=>Yge(t,!1),SPe=t=>Yge(t,!0),kPe=t=>Bp(t,A=>{let e=t.lineBlockAt(A.head).to;return A.headBp(t,A=>{let e=t.moveToLineBoundary(A,!1).head;return A.head>e?e:Math.max(0,A.head-1)}),_Pe=t=>Bp(t,A=>{let e=t.moveToLineBoundary(A,!0).head;return A.head{if(t.readOnly)return!1;let e=t.changeByRange(i=>({changes:{from:i.from,to:i.to,insert:Dn.of(["",""])},range:fA.cursor(i.from)}));return A(t.update(e,{scrollIntoView:!0,userEvent:"input"})),!0},NPe=({state:t,dispatch:A})=>{if(t.readOnly)return!1;let e=t.changeByRange(i=>{if(!i.empty||i.from==0||i.from==t.doc.length)return{range:i};let n=i.from,o=t.doc.lineAt(n),r=n==o.from?n-1:Cs(o.text,n-o.from,!1)+o.from,s=n==o.to?n+1:Cs(o.text,n-o.from,!0)+o.from;return{changes:{from:r,to:s,insert:t.doc.slice(n,s).append(t.doc.slice(r,n))},range:fA.cursor(s)}});return e.changes.empty?!1:(A(t.update(e,{scrollIntoView:!0,userEvent:"move.character"})),!0)};function gb(t){let A=[],e=-1;for(let i of t.selection.ranges){let n=t.doc.lineAt(i.from),o=t.doc.lineAt(i.to);if(!i.empty&&i.to==o.from&&(o=t.doc.lineAt(i.to-1)),e>=n.number){let r=A[A.length-1];r.to=o.to,r.ranges.push(i)}else A.push({from:n.from,to:o.to,ranges:[i]});e=o.number+1}return A}function zge(t,A,e){if(t.readOnly)return!1;let i=[],n=[];for(let o of gb(t)){if(e?o.to==t.doc.length:o.from==0)continue;let r=t.doc.lineAt(e?o.to+1:o.from-1),s=r.length+1;if(e){i.push({from:o.to,to:r.to},{from:o.from,insert:r.text+t.lineBreak});for(let a of o.ranges)n.push(fA.range(Math.min(t.doc.length,a.anchor+s),Math.min(t.doc.length,a.head+s)))}else{i.push({from:r.from,to:o.from},{from:o.to,insert:t.lineBreak+r.text});for(let a of o.ranges)n.push(fA.range(a.anchor-s,a.head-s))}}return i.length?(A(t.update({changes:i,scrollIntoView:!0,selection:fA.create(n,t.selection.mainIndex),userEvent:"move.line"})),!0):!1}var LPe=({state:t,dispatch:A})=>zge(t,A,!1),FPe=({state:t,dispatch:A})=>zge(t,A,!0);function Pge(t,A,e){if(t.readOnly)return!1;let i=[];for(let n of gb(t))e?i.push({from:n.from,insert:t.doc.slice(n.from,n.to)+t.lineBreak}):i.push({from:n.to,insert:t.lineBreak+t.doc.slice(n.from,n.to)});return A(t.update({changes:i,scrollIntoView:!0,userEvent:"input.copyline"})),!0}var GPe=({state:t,dispatch:A})=>Pge(t,A,!1),KPe=({state:t,dispatch:A})=>Pge(t,A,!0),UPe=t=>{if(t.state.readOnly)return!1;let{state:A}=t,e=A.changes(gb(A).map(({from:n,to:o})=>(n>0?n--:o{let o;if(t.lineWrapping){let r=t.lineBlockAt(n.head),s=t.coordsAtPos(n.head,n.assoc||1);s&&(o=r.bottom+t.documentTop-s.bottom+t.defaultLineHeight/2)}return t.moveVertically(n,!0,o)}).map(e);return t.dispatch({changes:e,selection:i,scrollIntoView:!0,userEvent:"delete.line"}),!0};function TPe(t,A){if(/\(\)|\[\]|\{\}/.test(t.sliceDoc(A-1,A+1)))return{from:A,to:A};let e=Ys(t).resolveInner(A),i=e.childBefore(A),n=e.childAfter(A),o;return i&&n&&i.to<=A&&n.from>=A&&(o=i.type.prop(ki.closedBy))&&o.indexOf(n.name)>-1&&t.doc.lineAt(i.to).from==t.doc.lineAt(n.from).from&&!/\S/.test(t.sliceDoc(i.to,n.from))?{from:i.to,to:n.from}:null}var pge=jge(!1),OPe=jge(!0);function jge(t){return({state:A,dispatch:e})=>{if(A.readOnly)return!1;let i=A.changeByRange(n=>{let{from:o,to:r}=n,s=A.doc.lineAt(o),a=!t&&o==r&&TPe(A,o);t&&(o=r=(r<=s.to?s:A.doc.lineAt(r)).to);let c=new zu(A,{simulateBreak:o,simulateDoubleBreak:!!a}),l=sb(c,o);for(l==null&&(l=L2(/^\s*/.exec(A.doc.lineAt(o).text)[0],A.tabSize));rs.from&&o{let n=[];for(let r=i.from;r<=i.to;){let s=t.doc.lineAt(r);s.number>e&&(i.empty||i.to>s.from)&&(A(s,n,i),e=s.number),r=s.to+1}let o=t.changes(n);return{changes:n,range:fA.range(o.mapPos(i.anchor,1),o.mapPos(i.head,1))}})}var JPe=({state:t,dispatch:A})=>{if(t.readOnly)return!1;let e=Object.create(null),i=new zu(t,{overrideIndentation:o=>{let r=e[o];return r??-1}}),n=bO(t,(o,r,s)=>{let a=sb(i,o.from);if(a==null)return;/\S/.test(o.text)||(a=0);let c=/^\s*/.exec(o.text)[0],l=yf(t,a);(c!=l||s.fromt.readOnly?!1:(A(t.update(bO(t,(e,i)=>{i.push({from:e.from,insert:t.facet(ju)})}),{userEvent:"input.indent"})),!0),qge=({state:t,dispatch:A})=>t.readOnly?!1:(A(t.update(bO(t,(e,i)=>{let n=/^\s*/.exec(e.text)[0];if(!n)return;let o=L2(n,t.tabSize),r=0,s=yf(t,Math.max(0,o-qg(t)));for(;r(t.setTabFocusMode(),!0);var HPe=[{key:"Ctrl-b",run:Dge,shift:Nge,preventDefault:!0},{key:"Ctrl-f",run:vge,shift:Lge},{key:"Ctrl-p",run:Sge,shift:Kge},{key:"Ctrl-n",run:kge,shift:Uge},{key:"Ctrl-a",run:gPe,shift:wPe},{key:"Ctrl-e",run:dPe,shift:yPe},{key:"Ctrl-d",run:Jge},{key:"Ctrl-h",run:yO},{key:"Ctrl-k",run:kPe},{key:"Ctrl-Alt-h",run:Hge},{key:"Ctrl-o",run:RPe},{key:"Ctrl-t",run:NPe},{key:"Ctrl-v",run:wO}],zPe=[{key:"ArrowLeft",run:Dge,shift:Nge,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:tPe,shift:uPe,preventDefault:!0},{mac:"Cmd-ArrowLeft",run:cPe,shift:mPe,preventDefault:!0},{key:"ArrowRight",run:vge,shift:Lge,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:iPe,shift:hPe,preventDefault:!0},{mac:"Cmd-ArrowRight",run:lPe,shift:pPe,preventDefault:!0},{key:"ArrowUp",run:Sge,shift:Kge,preventDefault:!0},{mac:"Cmd-ArrowUp",run:Ege,shift:Qge},{mac:"Ctrl-ArrowUp",run:uge,shift:hge},{key:"ArrowDown",run:kge,shift:Uge,preventDefault:!0},{mac:"Cmd-ArrowDown",run:fge,shift:mge},{mac:"Ctrl-ArrowDown",run:wO,shift:Bge},{key:"PageUp",run:uge,shift:hge},{key:"PageDown",run:wO,shift:Bge},{key:"Home",run:aPe,shift:QPe,preventDefault:!0},{key:"Mod-Home",run:Ege,shift:Qge},{key:"End",run:sPe,shift:fPe,preventDefault:!0},{key:"Mod-End",run:fge,shift:mge},{key:"Enter",run:pge,shift:pge},{key:"Mod-a",run:DPe},{key:"Backspace",run:yO,shift:yO},{key:"Delete",run:Jge},{key:"Mod-Backspace",mac:"Alt-Backspace",run:Hge},{key:"Mod-Delete",mac:"Alt-Delete",run:SPe},{mac:"Mod-Backspace",run:xPe},{mac:"Mod-Delete",run:_Pe}].concat(HPe.map(t=>({mac:t.key,run:t.run,shift:t.shift}))),Wge=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:oPe,shift:BPe},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:rPe,shift:EPe},{key:"Alt-ArrowUp",run:LPe},{key:"Shift-Alt-ArrowUp",run:GPe},{key:"Alt-ArrowDown",run:FPe},{key:"Shift-Alt-ArrowDown",run:KPe},{key:"Escape",run:MPe},{key:"Mod-Enter",run:OPe},{key:"Alt-l",mac:"Ctrl-l",run:vPe},{key:"Mod-i",run:bPe,preventDefault:!0},{key:"Mod-[",run:qge},{key:"Mod-]",run:Vge},{key:"Mod-Alt-\\",run:JPe},{key:"Shift-Mod-k",run:UPe},{key:"Shift-Mod-\\",run:IPe},{key:"Mod-/",run:qze},{key:"Alt-A",run:Zze},{key:"Ctrl-m",mac:"Shift-Alt-m",run:YPe}].concat(zPe),Zge={key:"Tab",run:Vge,shift:qge};var Ib=class{constructor(A,e,i){this.from=A,this.to=e,this.diagnostic=i}},Vu=class t{constructor(A,e,i){this.diagnostics=A,this.panel=e,this.selected=i}static init(A,e,i){let n=i.facet(Md).markerFilter;n&&(A=n(A,i));let o=A.slice().sort((l,d)=>l.from-d.from||l.to-d.to),r=new ga,s=[],a=0;for(let l=0;;){let d=l==o.length?null:o[l];if(!d&&!s.length)break;let C,I;for(s.length?(C=a,I=s.reduce((h,B)=>Math.min(h,B.to),d&&d.from>C?d.from:1e8)):(C=d.from,I=d.to,s.push(d),l++);lh.from||h.to==C))s.push(h),l++,I=Math.min(h.to,I);else{I=Math.min(h.from,I);break}}let u=s0e(s);if(s.some(h=>h.from==h.to||h.from==h.to-1&&i.doc.lineAt(h.from).to==h.from))r.add(C,C,bt.widget({widget:new MO(u),diagnostics:s.slice()}));else{let h=s.reduce((B,f)=>f.markClass?B+" "+f.markClass:B,"");r.add(C,I,bt.mark({class:"cm-lintRange cm-lintRange-"+u+h,diagnostics:s.slice(),inclusiveEnd:s.some(B=>B.to>I)}))}a=I;for(let h=0;h{if(!(A&&r.diagnostics.indexOf(A)<0))if(!i)i=new Ib(n,o,A||r.diagnostics[0]);else{if(r.diagnostics.indexOf(i.diagnostic)<0)return!1;i=new Ib(i.from,o,i.diagnostic)}}),i}function $ge(t,A){let e=A.pos,i=A.end||e,n=t.state.facet(Md).hideOn(t,e,i);if(n!=null)return n;let o=t.startState.doc.lineAt(A.pos);return!!(t.effects.some(r=>r.is(Bb))||t.changes.touchesRange(o.from,Math.max(o.to,i)))}function e0e(t,A){return t.field(ml,!1)?A:A.concat(tn.appendConfig.of(c0e))}function PPe(t,A){return{effects:e0e(t,[Bb.of(A)])}}var Bb=tn.define(),kO=tn.define(),A0e=tn.define(),ml=_r.define({create(){return new Vu(bt.none,null,null)},update(t,A){if(A.docChanged&&t.diagnostics.size){let e=t.diagnostics.map(A.changes),i=null,n=t.panel;if(t.selected){let o=A.changes.mapPos(t.selected.from,1);i=bf(e,t.selected.diagnostic,o)||bf(e,null,o)}!e.size&&n&&A.state.facet(Md).autoPanel&&(n=null),t=new Vu(e,n,i)}for(let e of A.effects)if(e.is(Bb)){let i=A.state.facet(Md).autoPanel?e.value.length?Ep.open:null:t.panel;t=Vu.init(e.value,i,A.state)}else e.is(kO)?t=new Vu(t.diagnostics,e.value?Ep.open:null,t.selected):e.is(A0e)&&(t=new Vu(t.diagnostics,t.panel,e.value));return t},provide:t=>[Ou.from(t,A=>A.panel),ai.decorations.from(t,A=>A.diagnostics)]});var jPe=bt.mark({class:"cm-lintRange cm-lintRange-active"});function VPe(t,A,e){let{diagnostics:i}=t.state.field(ml),n,o=-1,r=-1;i.between(A-(e<0?1:0),A+(e>0?1:0),(a,c,{spec:l})=>{if(A>=a&&A<=c&&(a==c||(A>a||e>0)&&(Ar0e(t,e,!1)))}var qPe=t=>{let A=t.state.field(ml,!1);(!A||!A.panel)&&t.dispatch({effects:e0e(t.state,[kO.of(!0)])});let e=Ju(t,Ep.open);return e&&e.dom.querySelector(".cm-panel-lint ul").focus(),!0},Xge=t=>{let A=t.state.field(ml,!1);return!A||!A.panel?!1:(t.dispatch({effects:kO.of(!1)}),!0)},WPe=t=>{let A=t.state.field(ml,!1);if(!A)return!1;let e=t.state.selection.main,i=A.diagnostics.iter(e.to+1);return!i.value&&(i=A.diagnostics.iter(0),!i.value||i.from==e.from&&i.to==e.to)?!1:(t.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0}),!0)};var i0e=[{key:"Mod-Shift-m",run:qPe,preventDefault:!0},{key:"F8",run:WPe}],ZPe=Jo.fromClass(class{constructor(t){this.view=t,this.timeout=-1,this.set=!0;let{delay:A}=t.state.facet(Md);this.lintTime=Date.now()+A,this.run=this.run.bind(this),this.timeout=setTimeout(this.run,A)}run(){clearTimeout(this.timeout);let t=Date.now();if(tPromise.resolve(i(this.view))),i=>{this.view.state.doc==A.doc&&this.view.dispatch(PPe(this.view.state,i.reduce((n,o)=>n.concat(o))))},i=>{Js(this.view.state,i)})}}update(t){let A=t.state.facet(Md);(t.docChanged||A!=t.startState.facet(Md)||A.needsRefresh&&A.needsRefresh(t))&&(this.lintTime=Date.now()+A.delay,this.set||(this.set=!0,this.timeout=setTimeout(this.run,A.delay)))}force(){this.set&&(this.lintTime=Date.now(),this.run())}destroy(){clearTimeout(this.timeout)}});function XPe(t,A,e){let i=[],n=-1;for(let o of t)o.then(r=>{i.push(r),clearTimeout(n),i.length==t.length?A(i):n=setTimeout(()=>A(i),200)},e)}var Md=rt.define({combine(t){return Object.assign({sources:t.map(A=>A.source).filter(A=>A!=null)},Os(t.map(A=>A.config),{delay:750,markerFilter:null,tooltipFilter:null,needsRefresh:null,hideOn:()=>null},{needsRefresh:(A,e)=>A?e?i=>A(i)||e(i):A:e}))}});function n0e(t,A={}){return[Md.of({source:t,config:A}),ZPe,c0e]}function o0e(t){let A=[];if(t)e:for(let{name:e}of t){for(let i=0;io.toLowerCase()==n.toLowerCase())){A.push(n);continue e}}A.push("")}return A}function r0e(t,A,e){var i;let n=e?o0e(A.actions):[];return Co("li",{class:"cm-diagnostic cm-diagnostic-"+A.severity},Co("span",{class:"cm-diagnosticText"},A.renderMessage?A.renderMessage(t):A.message),(i=A.actions)===null||i===void 0?void 0:i.map((o,r)=>{let s=!1,a=C=>{if(C.preventDefault(),s)return;s=!0;let I=bf(t.state.field(ml).diagnostics,A);I&&o.apply(t,I.from,I.to)},{name:c}=o,l=n[r]?c.indexOf(n[r]):-1,d=l<0?c:[c.slice(0,l),Co("u",c.slice(l,l+1)),c.slice(l+1)];return Co("button",{type:"button",class:"cm-diagnosticAction",onclick:a,onmousedown:a,"aria-label":` Action: ${c}${l<0?"":` (access key "${n[r]})"`}.`},d)}),A.source&&Co("div",{class:"cm-diagnosticSource"},A.source))}var MO=class extends Ql{constructor(A){super(),this.sev=A}eq(A){return A.sev==this.sev}toDOM(){return Co("span",{class:"cm-lintPoint cm-lintPoint-"+this.sev})}},ub=class{constructor(A,e){this.diagnostic=e,this.id="item_"+Math.floor(Math.random()*4294967295).toString(16),this.dom=r0e(A,e,!0),this.dom.id=this.id,this.dom.setAttribute("role","option")}},Ep=class t{constructor(A){this.view=A,this.items=[];let e=n=>{if(n.keyCode==27)Xge(this.view),this.view.focus();else if(n.keyCode==38||n.keyCode==33)this.moveSelection((this.selectedIndex-1+this.items.length)%this.items.length);else if(n.keyCode==40||n.keyCode==34)this.moveSelection((this.selectedIndex+1)%this.items.length);else if(n.keyCode==36)this.moveSelection(0);else if(n.keyCode==35)this.moveSelection(this.items.length-1);else if(n.keyCode==13)this.view.focus();else if(n.keyCode>=65&&n.keyCode<=90&&this.selectedIndex>=0){let{diagnostic:o}=this.items[this.selectedIndex],r=o0e(o.actions);for(let s=0;s{for(let o=0;oXge(this.view)},"\xD7")),this.update()}get selectedIndex(){let A=this.view.state.field(ml).selected;if(!A)return-1;for(let e=0;e{for(let l of c.diagnostics){if(r.has(l))continue;r.add(l);let d=-1,C;for(let I=i;Ii&&(this.items.splice(i,d-i),n=!0)),e&&C.diagnostic==e.diagnostic?C.dom.hasAttribute("aria-selected")||(C.dom.setAttribute("aria-selected","true"),o=C):C.dom.hasAttribute("aria-selected")&&C.dom.removeAttribute("aria-selected"),i++}});i({sel:o.dom.getBoundingClientRect(),panel:this.list.getBoundingClientRect()}),write:({sel:s,panel:a})=>{let c=a.height/this.list.offsetHeight;s.topa.bottom&&(this.list.scrollTop+=(s.bottom-a.bottom)/c)}})):this.selectedIndex<0&&this.list.removeAttribute("aria-activedescendant"),n&&this.sync()}sync(){let A=this.list.firstChild;function e(){let i=A;A=i.nextSibling,i.remove()}for(let i of this.items)if(i.dom.parentNode==this.list){for(;A!=i.dom;)e();A=i.dom.nextSibling}else this.list.insertBefore(i.dom,A);for(;A;)e()}moveSelection(A){if(this.selectedIndex<0)return;let e=this.view.state.field(ml),i=bf(e.diagnostics,this.items[A].diagnostic);i&&this.view.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0,effects:A0e.of(i)})}static open(A){return new t(A)}};function Cb(t,A='viewBox="0 0 40 40"'){return`url('data:image/svg+xml,${encodeURIComponent(t)}')`}function db(t){return Cb(``,'width="6" height="3"')}var $Pe=ai.baseTheme({".cm-diagnostic":{padding:"3px 6px 3px 8px",marginLeft:"-1px",display:"block",whiteSpace:"pre-wrap"},".cm-diagnostic-error":{borderLeft:"5px solid #d11"},".cm-diagnostic-warning":{borderLeft:"5px solid orange"},".cm-diagnostic-info":{borderLeft:"5px solid #999"},".cm-diagnostic-hint":{borderLeft:"5px solid #66d"},".cm-diagnosticAction":{font:"inherit",border:"none",padding:"2px 4px",backgroundColor:"#444",color:"white",borderRadius:"3px",marginLeft:"8px",cursor:"pointer"},".cm-diagnosticSource":{fontSize:"70%",opacity:.7},".cm-lintRange":{backgroundPosition:"left bottom",backgroundRepeat:"repeat-x",paddingBottom:"0.7px"},".cm-lintRange-error":{backgroundImage:db("#d11")},".cm-lintRange-warning":{backgroundImage:db("orange")},".cm-lintRange-info":{backgroundImage:db("#999")},".cm-lintRange-hint":{backgroundImage:db("#66d")},".cm-lintRange-active":{backgroundColor:"#ffdd9980"},".cm-tooltip-lint":{padding:0,margin:0},".cm-lintPoint":{position:"relative","&:after":{content:'""',position:"absolute",bottom:0,left:"-2px",borderLeft:"3px solid transparent",borderRight:"3px solid transparent",borderBottom:"4px solid #d11"}},".cm-lintPoint-warning":{"&:after":{borderBottomColor:"orange"}},".cm-lintPoint-info":{"&:after":{borderBottomColor:"#999"}},".cm-lintPoint-hint":{"&:after":{borderBottomColor:"#66d"}},".cm-panel.cm-panel-lint":{position:"relative","& ul":{maxHeight:"100px",overflowY:"auto","& [aria-selected]":{backgroundColor:"#ddd","& u":{textDecoration:"underline"}},"&:focus [aria-selected]":{background_fallback:"#bdf",backgroundColor:"Highlight",color_fallback:"white",color:"HighlightText"},"& u":{textDecoration:"none"},padding:0,margin:0},"& [name=close]":{position:"absolute",top:"0",right:"2px",background:"inherit",border:"none",font:"inherit",padding:0,margin:0}}});function eje(t){return t=="error"?4:t=="warning"?3:t=="info"?2:1}function s0e(t){let A="hint",e=1;for(let i of t){let n=eje(i.severity);n>e&&(e=n,A=i.severity)}return A}var hb=class extends Kc{constructor(A){super(),this.diagnostics=A,this.severity=s0e(A)}toDOM(A){let e=document.createElement("div");e.className="cm-lint-marker cm-lint-marker-"+this.severity;let i=this.diagnostics,n=A.state.facet(Eb).tooltipFilter;return n&&(i=n(i,A.state)),i.length&&(e.onmouseover=()=>tje(A,e,i)),e}};function Aje(t,A){let e=i=>{let n=A.getBoundingClientRect();if(!(i.clientX>n.left-10&&i.clientXn.top-10&&i.clientYA.getBoundingClientRect()}}})}),A.onmouseout=A.onmousemove=null,Aje(t,A)}let{hoverTime:n}=t.state.facet(Eb),o=setTimeout(i,n);A.onmouseout=()=>{clearTimeout(o),A.onmouseout=A.onmousemove=null},A.onmousemove=()=>{clearTimeout(o),o=setTimeout(i,n)}}function ije(t,A){let e=Object.create(null);for(let n of A){let o=t.lineAt(n.from);(e[o.from]||(e[o.from]=[])).push(n)}let i=[];for(let n in e)i.push(new hb(e[n]).range(+n));return To.of(i,!0)}var nje=q7({class:"cm-gutter-lint",markers:t=>t.state.field(SO),widgetMarker:(t,A,e)=>{let i=[];return t.state.field(SO).between(e.from,e.to,(n,o,r)=>{n>e.from&&ni.is(xO)?i.value:e,t)},provide:t=>Bf.from(t)}),oje=ai.baseTheme({".cm-gutter-lint":{width:"1.4em","& .cm-gutterElement":{padding:".2em"}},".cm-lint-marker":{width:"1em",height:"1em"},".cm-lint-marker-info":{content:Cb('')},".cm-lint-marker-warning":{content:Cb('')},".cm-lint-marker-error":{content:Cb('')}}),c0e=[ml,ai.decorations.compute([ml],t=>{let{selected:A,panel:e}=t.field(ml);return!A||!e||A.from==A.to?bt.none:bt.set([jPe.range(A.from,A.to)])}),kle(VPe,{hideOn:$ge}),$Pe],Eb=rt.define({combine(t){return Os(t,{hoverTime:300,markerFilter:null,tooltipFilter:null})}});function l0e(t={}){return[Eb.of(t),SO,nje,oje,a0e]}var RO=class t{constructor(A,e,i,n,o,r,s,a,c,l=0,d){this.p=A,this.stack=e,this.state=i,this.reducePos=n,this.pos=o,this.score=r,this.buffer=s,this.bufferBase=a,this.curContext=c,this.lookAhead=l,this.parent=d}toString(){return`[${this.stack.filter((A,e)=>e%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(A,e,i=0){let n=A.parser.context;return new t(A,[],e,i,i,0,[],0,n?new fb(n,n.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(A,e){this.stack.push(this.state,e,this.bufferBase+this.buffer.length),this.state=A}reduce(A){var e;let i=A>>19,n=A&65535,{parser:o}=this.p,r=this.reducePos=2e3&&!(!((e=this.p.parser.nodeSet.types[n])===null||e===void 0)&&e.isAnonymous)&&(c==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=l):this.p.lastBigReductionSizea;)this.stack.pop();this.reduceContext(n,c)}storeNode(A,e,i,n=4,o=!1){if(A==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&r.buffer[s-4]==0&&r.buffer[s-1]>-1){if(e==i)return;if(r.buffer[s-2]>=e){r.buffer[s-2]=i;return}}}if(!o||this.pos==i)this.buffer.push(A,e,i,n);else{let r=this.buffer.length;if(r>0&&this.buffer[r-4]!=0){let s=!1;for(let a=r;a>0&&this.buffer[a-2]>i;a-=4)if(this.buffer[a-1]>=0){s=!0;break}if(s)for(;r>0&&this.buffer[r-2]>i;)this.buffer[r]=this.buffer[r-4],this.buffer[r+1]=this.buffer[r-3],this.buffer[r+2]=this.buffer[r-2],this.buffer[r+3]=this.buffer[r-1],r-=4,n>4&&(n-=4)}this.buffer[r]=A,this.buffer[r+1]=e,this.buffer[r+2]=i,this.buffer[r+3]=n}}shift(A,e,i,n){if(A&131072)this.pushState(A&65535,this.pos);else if((A&262144)==0){let o=A,{parser:r}=this.p;(n>this.pos||e<=r.maxNode)&&(this.pos=n,r.stateFlag(o,1)||(this.reducePos=n)),this.pushState(o,i),this.shiftContext(e,i),e<=r.maxNode&&this.buffer.push(e,i,n,4)}else this.pos=n,this.shiftContext(e,i),e<=this.p.parser.maxNode&&this.buffer.push(e,i,n,4)}apply(A,e,i,n){A&65536?this.reduce(A):this.shift(A,e,i,n)}useNode(A,e){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=A)&&(this.p.reused.push(A),i++);let n=this.pos;this.reducePos=this.pos=n+A.length,this.pushState(e,n),this.buffer.push(i,n,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,A,this,this.p.stream.reset(this.pos-A.length)))}split(){let A=this,e=A.buffer.length;for(;e>0&&A.buffer[e-2]>A.reducePos;)e-=4;let i=A.buffer.slice(e),n=A.bufferBase+e;for(;A&&n==A.bufferBase;)A=A.parent;return new t(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,n,this.curContext,this.lookAhead,A)}recoverByDelete(A,e){let i=A<=this.p.parser.maxNode;i&&this.storeNode(A,this.pos,e,4),this.storeNode(0,this.pos,e,i?8:4),this.pos=this.reducePos=e,this.score-=190}canShift(A){for(let e=new NO(this);;){let i=this.p.parser.stateSlot(e.state,4)||this.p.parser.hasAction(e.state,A);if(i==0)return!1;if((i&65536)==0)return!0;e.reduce(i)}}recoverByInsert(A){if(this.stack.length>=300)return[];let e=this.p.parser.nextStates(this.state);if(e.length>8||this.stack.length>=120){let n=[];for(let o=0,r;oa&1&&s==r)||n.push(e[o],r)}e=n}let i=[];for(let n=0;n>19,n=e&65535,o=this.stack.length-i*3;if(o<0||A.getGoto(this.stack[o],n,!1)<0){let r=this.findForcedReduction();if(r==null)return!1;e=r}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(e),!0}findForcedReduction(){let{parser:A}=this.p,e=[],i=(n,o)=>{if(!e.includes(n))return e.push(n),A.allActions(n,r=>{if(!(r&393216))if(r&65536){let s=(r>>19)-o;if(s>1){let a=r&65535,c=this.stack.length-s*3;if(c>=0&&A.getGoto(this.stack[c],a,!1)>=0)return s<<19|65536|a}}else{let s=i(r,o+1);if(s!=null)return s}})};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:A}=this.p;return A.data[A.stateSlot(this.state,1)]==65535&&!A.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(A){if(this.state!=A.state||this.stack.length!=A.stack.length)return!1;for(let e=0;ethis.lookAhead&&(this.emitLookAhead(),this.lookAhead=A)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}},fb=class{constructor(A,e){this.tracker=A,this.context=e,this.hash=A.strict?A.hash(e):0}},NO=class{constructor(A){this.start=A,this.state=A.state,this.stack=A.stack,this.base=this.stack.length}reduce(A){let e=A&65535,i=A>>19;i==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(i-1)*3;let n=this.start.p.parser.getGoto(this.stack[this.base-3],e,!0);this.state=n}},LO=class t{constructor(A,e,i){this.stack=A,this.pos=e,this.index=i,this.buffer=A.buffer,this.index==0&&this.maybeNext()}static create(A,e=A.bufferBase+A.buffer.length){return new t(A,e,e-A.bufferBase)}maybeNext(){let A=this.stack.parent;A!=null&&(this.index=this.stack.bufferBase-A.bufferBase,this.stack=A,this.buffer=A.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new t(this.stack,this.pos,this.index)}};function fp(t,A=Uint16Array){if(typeof t!="string")return t;let e=null;for(let i=0,n=0;i=92&&r--,r>=34&&r--;let a=r-32;if(a>=46&&(a-=46,s=!0),o+=a,s)break;o*=46}e?e[n++]=o:e=new A(o)}return e}var Mf=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},g0e=new Mf,FO=class{constructor(A,e){this.input=A,this.ranges=e,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=g0e,this.rangeIndex=0,this.pos=this.chunkPos=e[0].from,this.range=e[0],this.end=e[e.length-1].to,this.readNext()}resolveOffset(A,e){let i=this.range,n=this.rangeIndex,o=this.pos+A;for(;oi.to:o>=i.to;){if(n==this.ranges.length-1)return null;let r=this.ranges[++n];o+=r.from-i.to,i=r}return o}clipPos(A){if(A>=this.range.from&&AA)return Math.max(A,e.from);return this.end}peek(A){let e=this.chunkOff+A,i,n;if(e>=0&&e=this.chunk2Pos&&is.to&&(this.chunk2=this.chunk2.slice(0,s.to-i)),n=this.chunk2.charCodeAt(0)}}return i>=this.token.lookAhead&&(this.token.lookAhead=i+1),n}acceptToken(A,e=0){let i=e?this.resolveOffset(e,-1):this.pos;if(i==null||i=this.chunk2Pos&&this.posthis.range.to?A.slice(0,this.range.to-this.pos):A,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(A=1){for(this.chunkOff+=A;this.pos+A>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();A-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=A,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(A,e){if(e?(this.token=e,e.start=A,e.lookAhead=A+1,e.value=e.extended=-1):this.token=g0e,this.pos!=A){if(this.pos=A,A==this.end)return this.setDone(),this;for(;A=this.range.to;)this.range=this.ranges[++this.rangeIndex];A>=this.chunkPos&&A=this.chunkPos&&e<=this.chunkPos+this.chunk.length)return this.chunk.slice(A-this.chunkPos,e-this.chunkPos);if(A>=this.chunk2Pos&&e<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(A-this.chunk2Pos,e-this.chunk2Pos);if(A>=this.range.from&&e<=this.range.to)return this.input.read(A,e);let i="";for(let n of this.ranges){if(n.from>=e)break;n.to>A&&(i+=this.input.read(Math.max(n.from,A),Math.min(n.to,e)))}return i}},FC=class{constructor(A,e){this.data=A,this.id=e}token(A,e){let{parser:i}=e.p;h0e(this.data,A,e,this.id,i.data,i.tokenPrecTable)}};FC.prototype.contextual=FC.prototype.fallback=FC.prototype.extend=!1;var GO=class{constructor(A,e,i){this.precTable=e,this.elseToken=i,this.data=typeof A=="string"?fp(A):A}token(A,e){let i=A.pos,n=0;for(;;){let o=A.next<0,r=A.resolveOffset(1,1);if(h0e(this.data,A,e,0,this.data,this.precTable),A.token.value>-1)break;if(this.elseToken==null)return;if(o||n++,r==null)break;A.reset(r,A.token)}n&&(A.reset(i,A.token),A.acceptToken(this.elseToken,n))}};GO.prototype.contextual=FC.prototype.fallback=FC.prototype.extend=!1;function h0e(t,A,e,i,n,o){let r=0,s=1<0){let u=t[I];if(a.allows(u)&&(A.token.value==-1||A.token.value==u||sje(u,A.token.value,n,o))){A.acceptToken(u);break}}let l=A.next,d=0,C=t[r+2];if(A.next<0&&C>d&&t[c+C*3-3]==65535){r=t[c+C*3-1];continue e}for(;d>1,u=c+I+(I<<1),h=t[u],B=t[u+1]||65536;if(l=B)d=I+1;else{r=t[u+2],A.advance();continue e}}break}}function d0e(t,A,e){for(let i=A,n;(n=t[i])!=65535;i++)if(n==e)return i-A;return-1}function sje(t,A,e,i){let n=d0e(e,i,A);return n<0||d0e(e,i,t)A)&&!i.type.isError)return e<0?Math.max(0,Math.min(i.to-1,A-25)):Math.min(t.length,Math.max(i.from+1,A+25));if(e<0?i.prevSibling():i.nextSibling())break;if(!i.parent())return e<0?0:t.length}}var KO=class{constructor(A,e){this.fragments=A,this.nodeSet=e,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let A=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(A){for(this.safeFrom=A.openStart?C0e(A.tree,A.from+A.offset,1)-A.offset:A.from,this.safeTo=A.openEnd?C0e(A.tree,A.to+A.offset,-1)-A.offset:A.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(A.tree),this.start.push(-A.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(A){if(AA)return this.nextStart=r,null;if(o instanceof as){if(r==A){if(r=Math.max(this.safeFrom,A)&&(this.trees.push(o),this.start.push(r),this.index.push(0))}else this.index[e]++,this.nextStart=r+o.length}}},UO=class{constructor(A,e){this.stream=e,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=A.tokenizers.map(i=>new Mf)}getActions(A){let e=0,i=null,{parser:n}=A.p,{tokenizers:o}=n,r=n.stateSlot(A.state,3),s=A.curContext?A.curContext.hash:0,a=0;for(let c=0;cd.end+25&&(a=Math.max(d.lookAhead,a)),d.value!=0)){let C=e;if(d.extended>-1&&(e=this.addActions(A,d.extended,d.end,e)),e=this.addActions(A,d.value,d.end,e),!l.extend&&(i=d,e>C))break}}for(;this.actions.length>e;)this.actions.pop();return a&&A.setLookAhead(a),!i&&A.pos==this.stream.end&&(i=new Mf,i.value=A.p.parser.eofTerm,i.start=i.end=A.pos,e=this.addActions(A,i.value,i.end,e)),this.mainToken=i,this.actions}getMainToken(A){if(this.mainToken)return this.mainToken;let e=new Mf,{pos:i,p:n}=A;return e.start=i,e.end=Math.min(i+1,n.stream.end),e.value=i==n.stream.end?n.parser.eofTerm:0,e}updateCachedToken(A,e,i){let n=this.stream.clipPos(i.pos);if(e.token(this.stream.reset(n,A),i),A.value>-1){let{parser:o}=i.p;for(let r=0;r=0&&i.p.parser.dialect.allows(s>>1)){(s&1)==0?A.value=s>>1:A.extended=s>>1;break}}}else A.value=0,A.end=this.stream.clipPos(n+1)}putAction(A,e,i,n){for(let o=0;oA.bufferLength*4?new KO(i,A.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let A=this.stacks,e=this.minStackPos,i=this.stacks=[],n,o;if(this.bigReductionCount>300&&A.length==1){let[r]=A;for(;r.forceReduce()&&r.stack.length&&r.stack[r.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let r=0;re)i.push(s);else{if(this.advanceStack(s,i,A))continue;{n||(n=[],o=[]),n.push(s);let a=this.tokens.getMainToken(s);o.push(a.value,a.end)}}break}}if(!i.length){let r=n&&aje(n);if(r)return pl&&console.log("Finish with "+this.stackID(r)),this.stackToTree(r);if(this.parser.strict)throw pl&&n&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+e);this.recovering||(this.recovering=5)}if(this.recovering&&n){let r=this.stoppedAt!=null&&n[0].pos>this.stoppedAt?n[0]:this.runRecovery(n,o,i);if(r)return pl&&console.log("Force-finish "+this.stackID(r)),this.stackToTree(r.forceAll())}if(this.recovering){let r=this.recovering==1?1:this.recovering*3;if(i.length>r)for(i.sort((s,a)=>a.score-s.score);i.length>r;)i.pop();i.some(s=>s.reducePos>e)&&this.recovering--}else if(i.length>1){e:for(let r=0;r500&&c.buffer.length>500)if((s.score-c.score||s.buffer.length-c.buffer.length)>0)i.splice(a--,1);else{i.splice(r--,1);continue e}}}i.length>12&&i.splice(12,i.length-12)}this.minStackPos=i[0].pos;for(let r=1;r ":"";if(this.stoppedAt!=null&&n>this.stoppedAt)return A.forceReduce()?A:null;if(this.fragments){let c=A.curContext&&A.curContext.tracker.strict,l=c?A.curContext.hash:0;for(let d=this.fragments.nodeAt(n);d;){let C=this.parser.nodeSet.types[d.type.id]==d.type?o.getGoto(A.state,d.type.id):-1;if(C>-1&&d.length&&(!c||(d.prop(ki.contextHash)||0)==l))return A.useNode(d,C),pl&&console.log(r+this.stackID(A)+` (via reuse of ${o.getName(d.type.id)})`),!0;if(!(d instanceof as)||d.children.length==0||d.positions[0]>0)break;let I=d.children[0];if(I instanceof as&&d.positions[0]==0)d=I;else break}}let s=o.stateSlot(A.state,4);if(s>0)return A.reduce(s),pl&&console.log(r+this.stackID(A)+` (via always-reduce ${o.getName(s&65535)})`),!0;if(A.stack.length>=8400)for(;A.stack.length>6e3&&A.forceReduce(););let a=this.tokens.getActions(A);for(let c=0;cn?e.push(u):i.push(u)}return!1}advanceFully(A,e){let i=A.pos;for(;;){if(!this.advanceStack(A,null,null))return!1;if(A.pos>i)return I0e(A,e),!0}}runRecovery(A,e,i){let n=null,o=!1;for(let r=0;r ":"";if(s.deadEnd&&(o||(o=!0,s.restart(),pl&&console.log(l+this.stackID(s)+" (restarted)"),this.advanceFully(s,i))))continue;let d=s.split(),C=l;for(let I=0;d.forceReduce()&&I<10&&(pl&&console.log(C+this.stackID(d)+" (via force-reduce)"),!this.advanceFully(d,i));I++)pl&&(C=this.stackID(d)+" -> ");for(let I of s.recoverByInsert(a))pl&&console.log(l+this.stackID(I)+" (via recover-insert)"),this.advanceFully(I,i);this.stream.end>s.pos?(c==s.pos&&(c++,a=0),s.recoverByDelete(a,c),pl&&console.log(l+this.stackID(s)+` (via recover-delete ${this.parser.getName(a)})`),I0e(s,i)):(!n||n.scoreA.topRules[s][1]),n=[];for(let s=0;s=0)o(l,a,s[c++]);else{let d=s[c+-l];for(let C=-l;C>0;C--)o(s[c++],a,d);c++}}}this.nodeSet=new rp(e.map((s,a)=>Na.define({name:a>=this.minRepeatTerm?void 0:s,id:a,props:n[a],top:i.indexOf(a)>-1,error:a==0,skipped:A.skippedNodes&&A.skippedNodes.indexOf(a)>-1}))),A.propSources&&(this.nodeSet=this.nodeSet.extend(...A.propSources)),this.strict=!1,this.bufferLength=1024;let r=fp(A.tokenData);this.context=A.context,this.specializerSpecs=A.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let s=0;stypeof s=="number"?new FC(r,s):s),this.topRules=A.topRules,this.dialects=A.dialects||{},this.dynamicPrecedences=A.dynamicPrecedences||null,this.tokenPrecTable=A.tokenPrec,this.termNames=A.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(A,e,i){let n=new TO(this,A,e,i);for(let o of this.wrappers)n=o(n,A,e,i);return n}getGoto(A,e,i=!1){let n=this.goto;if(e>=n[0])return-1;for(let o=n[e+1];;){let r=n[o++],s=r&1,a=n[o++];if(s&&i)return a;for(let c=o+(r>>1);o0}validAction(A,e){return!!this.allActions(A,i=>i==e?!0:null)}allActions(A,e){let i=this.stateSlot(A,4),n=i?e(i):void 0;for(let o=this.stateSlot(A,1);n==null;o+=3){if(this.data[o]==65535)if(this.data[o+1]==1)o=K2(this.data,o+2);else break;n=e(K2(this.data,o+1))}return n}nextStates(A){let e=[];for(let i=this.stateSlot(A,1);;i+=3){if(this.data[i]==65535)if(this.data[i+1]==1)i=K2(this.data,i+2);else break;if((this.data[i+2]&1)==0){let n=this.data[i+1];e.some((o,r)=>r&1&&o==n)||e.push(this.data[i],n)}}return e}configure(A){let e=Object.assign(Object.create(t.prototype),this);if(A.props&&(e.nodeSet=this.nodeSet.extend(...A.props)),A.top){let i=this.topRules[A.top];if(!i)throw new RangeError(`Invalid top rule name ${A.top}`);e.top=i}return A.tokenizers&&(e.tokenizers=this.tokenizers.map(i=>{let n=A.tokenizers.find(o=>o.from==i);return n?n.to:i})),A.specializers&&(e.specializers=this.specializers.slice(),e.specializerSpecs=this.specializerSpecs.map((i,n)=>{let o=A.specializers.find(s=>s.from==i.external);if(!o)return i;let r=Object.assign(Object.assign({},i),{external:o.to});return e.specializers[n]=u0e(r),r})),A.contextTracker&&(e.context=A.contextTracker),A.dialect&&(e.dialect=this.parseDialect(A.dialect)),A.strict!=null&&(e.strict=A.strict),A.wrap&&(e.wrappers=e.wrappers.concat(A.wrap)),A.bufferLength!=null&&(e.bufferLength=A.bufferLength),e}hasWrappers(){return this.wrappers.length>0}getName(A){return this.termNames?this.termNames[A]:String(A<=this.maxNode&&this.nodeSet.types[A].name||A)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(A){let e=this.dynamicPrecedences;return e==null?0:e[A]||0}parseDialect(A){let e=Object.keys(this.dialects),i=e.map(()=>!1);if(A)for(let o of A.split(" ")){let r=e.indexOf(o);r>=0&&(i[r]=!0)}let n=null;for(let o=0;oi)&&e.p.parser.stateFlag(e.state,2)&&(!A||A.scoret.external(e,i)<<1|A}return t.get}var cje=ib({String:GA.string,Number:GA.number,"True False":GA.bool,PropertyName:GA.propertyName,Null:GA.null,", :":GA.separator,"[ ]":GA.squareBracket,"{ }":GA.brace}),B0e=Qb.deserialize({version:14,states:"$bOVQPOOOOQO'#Cb'#CbOnQPO'#CeOvQPO'#ClOOQO'#Cr'#CrQOQPOOOOQO'#Cg'#CgO}QPO'#CfO!SQPO'#CtOOQO,59P,59PO![QPO,59PO!aQPO'#CuOOQO,59W,59WO!iQPO,59WOVQPO,59QOqQPO'#CmO!nQPO,59`OOQO1G.k1G.kOVQPO'#CnO!vQPO,59aOOQO1G.r1G.rOOQO1G.l1G.lOOQO,59X,59XOOQO-E6k-E6kOOQO,59Y,59YOOQO-E6l-E6l",stateData:"#O~OeOS~OQSORSOSSOTSOWQO_ROgPO~OVXOgUO~O^[O~PVO[^O~O]_OVhX~OVaO~O]bO^iX~O^dO~O]_OVha~O]bO^ia~O",goto:"!kjPPPPPPkPPkqwPPPPk{!RPPP!XP!e!hXSOR^bQWQRf_TVQ_Q`WRg`QcZRicQTOQZRQe^RhbRYQR]R",nodeNames:"\u26A0 JsonText True False Null Number String } { Object Property PropertyName : , ] [ Array",maxTerm:25,nodeProps:[["isolate",-2,6,11,""],["openedBy",7,"{",14,"["],["closedBy",8,"}",15,"]"]],propSources:[cje],skippedNodes:[0],repeatNodeCount:2,tokenData:"(|~RaXY!WYZ!W]^!Wpq!Wrs!]|}$u}!O$z!Q!R%T!R![&c![!]&t!}#O&y#P#Q'O#Y#Z'T#b#c'r#h#i(Z#o#p(r#q#r(w~!]Oe~~!`Wpq!]qr!]rs!xs#O!]#O#P!}#P;'S!];'S;=`$o<%lO!]~!}Og~~#QXrs!]!P!Q!]#O#P!]#U#V!]#Y#Z!]#b#c!]#f#g!]#h#i!]#i#j#m~#pR!Q![#y!c!i#y#T#Z#y~#|R!Q![$V!c!i$V#T#Z$V~$YR!Q![$c!c!i$c#T#Z$c~$fR!Q![!]!c!i!]#T#Z!]~$rP;=`<%l!]~$zO]~~$}Q!Q!R%T!R![&c~%YRT~!O!P%c!g!h%w#X#Y%w~%fP!Q![%i~%nRT~!Q![%i!g!h%w#X#Y%w~%zR{|&T}!O&T!Q![&Z~&WP!Q![&Z~&`PT~!Q![&Z~&hST~!O!P%c!Q![&c!g!h%w#X#Y%w~&yO[~~'OO_~~'TO^~~'WP#T#U'Z~'^P#`#a'a~'dP#g#h'g~'jP#X#Y'm~'rOR~~'uP#i#j'x~'{P#`#a(O~(RP#`#a(U~(ZOS~~(^P#f#g(a~(dP#i#j(g~(jP#X#Y(m~(rOQ~~(wOW~~(|OV~",tokenizers:[0],topRules:{JsonText:[0,1]},tokenPrec:0});var lje=nb.define({name:"json",parser:B0e.configure({props:[hO.add({Object:BO({except:/^\s*\}/}),Array:BO({except:/^\s*\]/})}),Ip.add({"Object Array":ege})]}),languageData:{closeBrackets:{brackets:["[","{",'"']},indentOnInput:/^\s*[\}\]]$/}});function E0e(){return new ob(lje)}var f0e=typeof String.prototype.normalize=="function"?t=>t.normalize("NFKD"):t=>t,KC=class{constructor(A,e,i=0,n=A.length,o,r){this.test=r,this.value={from:0,to:0},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=A.iterRange(i,n),this.bufferStart=i,this.normalize=o?s=>o(f0e(s)):f0e,this.query=this.normalize(e)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return da(this.buffer,this.bufferPos)}next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let A=this.peek();if(A<0)return this.done=!0,this;let e=F3(A),i=this.bufferStart+this.bufferPos;this.bufferPos+=El(A);let n=this.normalize(e);if(n.length)for(let o=0,r=i;;o++){let s=n.charCodeAt(o),a=this.match(s,r,this.bufferPos+this.bufferStart);if(o==n.length-1){if(a)return this.value=a,this;break}r==i&&othis.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine="":this.getLine(0)}next(){for(let A=this.matchPos-this.curLineStart;;){this.re.lastIndex=A;let e=this.matchPos<=this.to&&this.re.exec(this.curLine);if(e){let i=this.curLineStart+e.index,n=i+e[0].length;if(this.matchPos=vb(this.text,n+(i==n?1:0)),i==this.curLineStart+this.curLine.length&&this.nextLine(),(ithis.value.to)&&(!this.test||this.test(i,n,e)))return this.value={from:i,to:n,match:e},this;A=this.matchPos-this.curLineStart}else if(this.curLineStart+this.curLine.length=i||n.to<=e){let s=new t(e,A.sliceString(e,i));return JO.set(A,s),s}if(n.from==e&&n.to==i)return n;let{text:o,from:r}=n;return r>e&&(o=A.sliceString(e,r)+o,r=e),n.to=this.to?this.to:this.text.lineAt(A).to}next(){for(;;){let A=this.re.lastIndex=this.matchPos-this.flat.from,e=this.re.exec(this.flat.text);if(e&&!e[0]&&e.index==A&&(this.re.lastIndex=A+1,e=this.re.exec(this.flat.text)),e){let i=this.flat.from+e.index,n=i+e[0].length;if((this.flat.to>=this.to||e.index+e[0].length<=this.flat.text.length-10)&&(!this.test||this.test(i,n,e)))return this.value={from:i,to:n,match:e},this.matchPos=vb(this.text,n+(i==n?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=yb.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+this.flat.text.length*2))}}};typeof Symbol<"u"&&(wb.prototype[Symbol.iterator]=Db.prototype[Symbol.iterator]=function(){return this});function gje(t){try{return new RegExp(t,qO),!0}catch{return!1}}function vb(t,A){if(A>=t.length)return A;let e=t.lineAt(A),i;for(;A=56320&&i<57344;)A++;return A}function YO(t){let A=String(t.state.doc.lineAt(t.state.selection.main.head).number),e=Co("input",{class:"cm-textfield",name:"line",value:A}),i=Co("form",{class:"cm-gotoLine",onkeydown:o=>{o.keyCode==27?(o.preventDefault(),t.dispatch({effects:Qp.of(!1)}),t.focus()):o.keyCode==13&&(o.preventDefault(),n())},onsubmit:o=>{o.preventDefault(),n()}},Co("label",t.state.phrase("Go to line"),": ",e)," ",Co("button",{class:"cm-button",type:"submit"},t.state.phrase("go")),Co("button",{name:"close",onclick:()=>{t.dispatch({effects:Qp.of(!1)}),t.focus()},"aria-label":t.state.phrase("close"),type:"button"},["\xD7"]));function n(){let o=/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(e.value);if(!o)return;let{state:r}=t,s=r.doc.lineAt(r.selection.main.head),[,a,c,l,d]=o,C=l?+l.slice(1):0,I=c?+c:s.number;if(c&&d){let B=I/100;a&&(B=B*(a=="-"?-1:1)+s.number/r.doc.lines),I=Math.round(r.doc.lines*B)}else c&&a&&(I=I*(a=="-"?-1:1)+s.number);let u=r.doc.line(Math.max(1,Math.min(r.doc.lines,I))),h=fA.cursor(u.from+Math.max(0,Math.min(C,u.length)));t.dispatch({effects:[Qp.of(!1),ai.scrollIntoView(h.from,{y:"center"})],selection:h}),t.focus()}return{dom:i}}var Qp=tn.define(),Q0e=_r.define({create(){return!0},update(t,A){for(let e of A.effects)e.is(Qp)&&(t=e.value);return t},provide:t=>Ou.from(t,A=>A?YO:null)}),dje=t=>{let A=Ju(t,YO);if(!A){let e=[Qp.of(!0)];t.state.field(Q0e,!1)==null&&e.push(tn.appendConfig.of([Q0e,Cje])),t.dispatch({effects:e}),A=Ju(t,YO)}return A&&A.dom.querySelector("input").select(),!0},Cje=ai.baseTheme({".cm-panel.cm-gotoLine":{padding:"2px 6px 4px",position:"relative","& label":{fontSize:"80%"},"& [name=close]":{position:"absolute",top:"0",bottom:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:"0"}}}),Ije={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},y0e=rt.define({combine(t){return Os(t,Ije,{highlightWordAroundCursor:(A,e)=>A||e,minSelectionLength:Math.min,maxMatches:Math.min})}});function D0e(t){let A=[fje,Eje];return t&&A.push(y0e.of(t)),A}var uje=bt.mark({class:"cm-selectionMatch"}),hje=bt.mark({class:"cm-selectionMatch cm-selectionMatch-main"});function m0e(t,A,e,i){return(e==0||t(A.sliceDoc(e-1,e))!=Uo.Word)&&(i==A.doc.length||t(A.sliceDoc(i,i+1))!=Uo.Word)}function Bje(t,A,e,i){return t(A.sliceDoc(e,e+1))==Uo.Word&&t(A.sliceDoc(i-1,i))==Uo.Word}var Eje=Jo.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.selectionSet||t.docChanged||t.viewportChanged)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let A=t.state.facet(y0e),{state:e}=t,i=e.selection;if(i.ranges.length>1)return bt.none;let n=i.main,o,r=null;if(n.empty){if(!A.highlightWordAroundCursor)return bt.none;let a=e.wordAt(n.head);if(!a)return bt.none;r=e.charCategorizer(n.head),o=e.sliceDoc(a.from,a.to)}else{let a=n.to-n.from;if(a200)return bt.none;if(A.wholeWords){if(o=e.sliceDoc(n.from,n.to),r=e.charCategorizer(n.head),!(m0e(r,e,n.from,n.to)&&Bje(r,e,n.from,n.to)))return bt.none}else if(o=e.sliceDoc(n.from,n.to),!o)return bt.none}let s=[];for(let a of t.visibleRanges){let c=new KC(e.doc,o,a.from,a.to);for(;!c.next().done;){let{from:l,to:d}=c.value;if((!r||m0e(r,e,l,d))&&(n.empty&&l<=n.from&&d>=n.to?s.push(hje.range(l,d)):(l>=n.to||d<=n.from)&&s.push(uje.range(l,d)),s.length>A.maxMatches))return bt.none}}return bt.set(s)}},{decorations:t=>t.decorations}),fje=ai.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}}),Qje=({state:t,dispatch:A})=>{let{selection:e}=t,i=fA.create(e.ranges.map(n=>t.wordAt(n.head)||fA.cursor(n.head)),e.mainIndex);return i.eq(e)?!1:(A(t.update({selection:i})),!0)};function mje(t,A){let{main:e,ranges:i}=t.selection,n=t.wordAt(e.head),o=n&&n.from==e.from&&n.to==e.to;for(let r=!1,s=new KC(t.doc,A,i[i.length-1].to);;)if(s.next(),s.done){if(r)return null;s=new KC(t.doc,A,0,Math.max(0,i[i.length-1].from-1)),r=!0}else{if(r&&i.some(a=>a.from==s.value.from))continue;if(o){let a=t.wordAt(s.value.from);if(!a||a.from!=s.value.from||a.to!=s.value.to)continue}return s.value}}var pje=({state:t,dispatch:A})=>{let{ranges:e}=t.selection;if(e.some(o=>o.from===o.to))return Qje({state:t,dispatch:A});let i=t.sliceDoc(e[0].from,e[0].to);if(t.selection.ranges.some(o=>t.sliceDoc(o.from,o.to)!=i))return!1;let n=mje(t,i);return n?(A(t.update({selection:t.selection.addRange(fA.range(n.from,n.to),!1),effects:ai.scrollIntoView(n.to)})),!0):!1},qu=rt.define({combine(t){return Os(t,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:A=>new jO(A),scrollToMatch:A=>ai.scrollIntoView(A)})}});function v0e(t){return t?[qu.of(t),VO]:VO}var bb=class{constructor(A){this.search=A.search,this.caseSensitive=!!A.caseSensitive,this.literal=!!A.literal,this.regexp=!!A.regexp,this.replace=A.replace||"",this.valid=!!this.search&&(!this.regexp||gje(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!A.wholeWord}unquote(A){return this.literal?A:A.replace(/\\([nrt\\])/g,(e,i)=>i=="n"?` +`:i=="r"?"\r":i=="t"?" ":"\\")}eq(A){return this.search==A.search&&this.replace==A.replace&&this.caseSensitive==A.caseSensitive&&this.regexp==A.regexp&&this.wholeWord==A.wholeWord}create(){return this.regexp?new zO(this):new HO(this)}getCursor(A,e=0,i){let n=A.doc?A:ss.create({doc:A});return i==null&&(i=n.doc.length),this.regexp?kf(this,n,e,i):Sf(this,n,e,i)}},Mb=class{constructor(A){this.spec=A}};function Sf(t,A,e,i){return new KC(A.doc,t.unquoted,e,i,t.caseSensitive?void 0:n=>n.toLowerCase(),t.wholeWord?wje(A.doc,A.charCategorizer(A.selection.main.head)):void 0)}function wje(t,A){return(e,i,n,o)=>((o>e||o+n.length=e)return null;n.push(i.value)}return n}highlight(A,e,i,n){let o=Sf(this.spec,A,Math.max(0,e-this.spec.unquoted.length),Math.min(i+this.spec.unquoted.length,A.doc.length));for(;!o.next().done;)n(o.value.from,o.value.to)}};function kf(t,A,e,i){return new wb(A.doc,t.search,{ignoreCase:!t.caseSensitive,test:t.wholeWord?yje(A.charCategorizer(A.selection.main.head)):void 0},e,i)}function Sb(t,A){return t.slice(Cs(t,A,!1),A)}function kb(t,A){return t.slice(A,Cs(t,A))}function yje(t){return(A,e,i)=>!i[0].length||(t(Sb(i.input,i.index))!=Uo.Word||t(kb(i.input,i.index))!=Uo.Word)&&(t(kb(i.input,i.index+i[0].length))!=Uo.Word||t(Sb(i.input,i.index+i[0].length))!=Uo.Word)}var zO=class extends Mb{nextMatch(A,e,i){let n=kf(this.spec,A,i,A.doc.length).next();return n.done&&(n=kf(this.spec,A,0,e).next()),n.done?null:n.value}prevMatchInRange(A,e,i){for(let n=1;;n++){let o=Math.max(e,i-n*1e4),r=kf(this.spec,A,o,i),s=null;for(;!r.next().done;)s=r.value;if(s&&(o==e||s.from>o+10))return s;if(o==e)return null}}prevMatch(A,e,i){return this.prevMatchInRange(A,0,e)||this.prevMatchInRange(A,i,A.doc.length)}getReplacement(A){return this.spec.unquote(this.spec.replace).replace(/\$([$&]|\d+)/g,(e,i)=>{if(i=="&")return A.match[0];if(i=="$")return"$";for(let n=i.length;n>0;n--){let o=+i.slice(0,n);if(o>0&&o=e)return null;n.push(i.value)}return n}highlight(A,e,i,n){let o=kf(this.spec,A,Math.max(0,e-250),Math.min(i+250,A.doc.length));for(;!o.next().done;)n(o.value.from,o.value.to)}},pp=tn.define(),WO=tn.define(),GC=_r.define({create(t){return new mp(PO(t).create(),null)},update(t,A){for(let e of A.effects)e.is(pp)?t=new mp(e.value.create(),t.panel):e.is(WO)&&(t=new mp(t.query,e.value?ZO:null));return t},provide:t=>Ou.from(t,A=>A.panel)});var mp=class{constructor(A,e){this.query=A,this.panel=e}},Dje=bt.mark({class:"cm-searchMatch"}),vje=bt.mark({class:"cm-searchMatch cm-searchMatch-selected"}),bje=Jo.fromClass(class{constructor(t){this.view=t,this.decorations=this.highlight(t.state.field(GC))}update(t){let A=t.state.field(GC);(A!=t.startState.field(GC)||t.docChanged||t.selectionSet||t.viewportChanged)&&(this.decorations=this.highlight(A))}highlight({query:t,panel:A}){if(!A||!t.spec.valid)return bt.none;let{view:e}=this,i=new ga;for(let n=0,o=e.visibleRanges,r=o.length;no[n+1].from-2*250;)a=o[++n].to;t.highlight(e.state,s,a,(c,l)=>{let d=e.state.selection.ranges.some(C=>C.from==c&&C.to==l);i.add(c,l,d?vje:Dje)})}return i.finish()}},{decorations:t=>t.decorations});function wp(t){return A=>{let e=A.state.field(GC,!1);return e&&e.query.spec.valid?t(A,e):Rb(A)}}var xb=wp((t,{query:A})=>{let{to:e}=t.state.selection.main,i=A.nextMatch(t.state,e,e);if(!i)return!1;let n=fA.single(i.from,i.to),o=t.state.facet(qu);return t.dispatch({selection:n,effects:[XO(t,i),o.scrollToMatch(n.main,t)],userEvent:"select.search"}),M0e(t),!0}),_b=wp((t,{query:A})=>{let{state:e}=t,{from:i}=e.selection.main,n=A.prevMatch(e,i,i);if(!n)return!1;let o=fA.single(n.from,n.to),r=t.state.facet(qu);return t.dispatch({selection:o,effects:[XO(t,n),r.scrollToMatch(o.main,t)],userEvent:"select.search"}),M0e(t),!0}),Mje=wp((t,{query:A})=>{let e=A.matchAll(t.state,1e3);return!e||!e.length?!1:(t.dispatch({selection:fA.create(e.map(i=>fA.range(i.from,i.to))),userEvent:"select.search.matches"}),!0)}),Sje=({state:t,dispatch:A})=>{let e=t.selection;if(e.ranges.length>1||e.main.empty)return!1;let{from:i,to:n}=e.main,o=[],r=0;for(let s=new KC(t.doc,t.sliceDoc(i,n));!s.next().done;){if(o.length>1e3)return!1;s.value.from==i&&(r=o.length),o.push(fA.range(s.value.from,s.value.to))}return A(t.update({selection:fA.create(o,r),userEvent:"select.search.matches"})),!0},p0e=wp((t,{query:A})=>{let{state:e}=t,{from:i,to:n}=e.selection.main;if(e.readOnly)return!1;let o=A.nextMatch(e,i,i);if(!o)return!1;let r=o,s=[],a,c,l=[];r.from==i&&r.to==n&&(c=e.toText(A.getReplacement(r)),s.push({from:r.from,to:r.to,insert:c}),r=A.nextMatch(e,r.from,r.to),l.push(ai.announce.of(e.phrase("replaced match on line $",e.doc.lineAt(i).number)+".")));let d=t.state.changes(s);return r&&(a=fA.single(r.from,r.to).map(d),l.push(XO(t,r)),l.push(e.facet(qu).scrollToMatch(a.main,t))),t.dispatch({changes:d,selection:a,effects:l,userEvent:"input.replace"}),!0}),kje=wp((t,{query:A})=>{if(t.state.readOnly)return!1;let e=A.matchAll(t.state,1e9).map(n=>{let{from:o,to:r}=n;return{from:o,to:r,insert:A.getReplacement(n)}});if(!e.length)return!1;let i=t.state.phrase("replaced $ matches",e.length)+".";return t.dispatch({changes:e,effects:ai.announce.of(i),userEvent:"input.replace.all"}),!0});function ZO(t){return t.state.facet(qu).createPanel(t)}function PO(t,A){var e,i,n,o,r;let s=t.selection.main,a=s.empty||s.to>s.from+100?"":t.sliceDoc(s.from,s.to);if(A&&!a)return A;let c=t.facet(qu);return new bb({search:((e=A?.literal)!==null&&e!==void 0?e:c.literal)?a:a.replace(/\n/g,"\\n"),caseSensitive:(i=A?.caseSensitive)!==null&&i!==void 0?i:c.caseSensitive,literal:(n=A?.literal)!==null&&n!==void 0?n:c.literal,regexp:(o=A?.regexp)!==null&&o!==void 0?o:c.regexp,wholeWord:(r=A?.wholeWord)!==null&&r!==void 0?r:c.wholeWord})}function b0e(t){let A=Ju(t,ZO);return A&&A.dom.querySelector("[main-field]")}function M0e(t){let A=b0e(t);A&&A==t.root.activeElement&&A.select()}var Rb=t=>{let A=t.state.field(GC,!1);if(A&&A.panel){let e=b0e(t);if(e&&e!=t.root.activeElement){let i=PO(t.state,A.query.spec);i.valid&&t.dispatch({effects:pp.of(i)}),e.focus(),e.select()}}else t.dispatch({effects:[WO.of(!0),A?pp.of(PO(t.state,A.query.spec)):tn.appendConfig.of(VO)]});return!0},Nb=t=>{let A=t.state.field(GC,!1);if(!A||!A.panel)return!1;let e=Ju(t,ZO);return e&&e.dom.contains(t.root.activeElement)&&t.focus(),t.dispatch({effects:WO.of(!1)}),!0},S0e=[{key:"Mod-f",run:Rb,scope:"editor search-panel"},{key:"F3",run:xb,shift:_b,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:xb,shift:_b,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:Nb,scope:"editor search-panel"},{key:"Mod-Shift-l",run:Sje},{key:"Mod-Alt-g",run:dje},{key:"Mod-d",run:pje,preventDefault:!0}],jO=class{constructor(A){this.view=A;let e=this.query=A.state.field(GC).query.spec;this.commit=this.commit.bind(this),this.searchField=Co("input",{value:e.search,placeholder:wl(A,"Find"),"aria-label":wl(A,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=Co("input",{value:e.replace,placeholder:wl(A,"Replace"),"aria-label":wl(A,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=Co("input",{type:"checkbox",name:"case",form:"",checked:e.caseSensitive,onchange:this.commit}),this.reField=Co("input",{type:"checkbox",name:"re",form:"",checked:e.regexp,onchange:this.commit}),this.wordField=Co("input",{type:"checkbox",name:"word",form:"",checked:e.wholeWord,onchange:this.commit});function i(n,o,r){return Co("button",{class:"cm-button",name:n,onclick:o,type:"button"},r)}this.dom=Co("div",{onkeydown:n=>this.keydown(n),class:"cm-search"},[this.searchField,i("next",()=>xb(A),[wl(A,"next")]),i("prev",()=>_b(A),[wl(A,"previous")]),i("select",()=>Mje(A),[wl(A,"all")]),Co("label",null,[this.caseField,wl(A,"match case")]),Co("label",null,[this.reField,wl(A,"regexp")]),Co("label",null,[this.wordField,wl(A,"by word")]),...A.state.readOnly?[]:[Co("br"),this.replaceField,i("replace",()=>p0e(A),[wl(A,"replace")]),i("replaceAll",()=>kje(A),[wl(A,"replace all")])],Co("button",{name:"close",onclick:()=>Nb(A),"aria-label":wl(A,"close"),type:"button"},["\xD7"])])}commit(){let A=new bb({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});A.eq(this.query)||(this.query=A,this.view.dispatch({effects:pp.of(A)}))}keydown(A){Ele(this.view,A,"search-panel")?A.preventDefault():A.keyCode==13&&A.target==this.searchField?(A.preventDefault(),(A.shiftKey?_b:xb)(this.view)):A.keyCode==13&&A.target==this.replaceField&&(A.preventDefault(),p0e(this.view))}update(A){for(let e of A.transactions)for(let i of e.effects)i.is(pp)&&!i.value.eq(this.query)&&this.setQuery(i.value)}setQuery(A){this.query=A,this.searchField.value=A.search,this.replaceField.value=A.replace,this.caseField.checked=A.caseSensitive,this.reField.checked=A.regexp,this.wordField.checked=A.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(qu).top}};function wl(t,A){return t.state.phrase(A)}var mb=30,pb=/[\s\.,:;?!]/;function XO(t,{from:A,to:e}){let i=t.state.doc.lineAt(A),n=t.state.doc.lineAt(e).to,o=Math.max(i.from,A-mb),r=Math.min(n,e+mb),s=t.state.sliceDoc(o,r);if(o!=i.from){for(let a=0;as.length-mb;a--)if(!pb.test(s[a-1])&&pb.test(s[a])){s=s.slice(0,a);break}}return ai.announce.of(`${t.state.phrase("current match")}. ${s} ${t.state.phrase("on line")} ${i.number}.`)}var xje=ai.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),VO=[GC,Hg.low(bje),xje];var Fb=class{constructor(A,e,i,n){this.state=A,this.pos=e,this.explicit=i,this.view=n,this.abortListeners=[],this.abortOnDocChange=!1}tokenBefore(A){let e=Ys(this.state).resolveInner(this.pos,-1);for(;e&&A.indexOf(e.name)<0;)e=e.parent;return e?{from:e.from,to:this.pos,text:this.state.sliceDoc(e.from,this.pos),type:e.type}:null}matchBefore(A){let e=this.state.doc.lineAt(this.pos),i=Math.max(e.from,this.pos-250),n=e.text.slice(i-e.from,this.pos-e.from),o=n.search(G0e(A,!1));return o<0?null:{from:i+o,to:this.pos,text:n.slice(o)}}get aborted(){return this.abortListeners==null}addEventListener(A,e,i){A=="abort"&&this.abortListeners&&(this.abortListeners.push(e),i&&i.onDocChange&&(this.abortOnDocChange=!0))}};function k0e(t){let A=Object.keys(t).join(""),e=/\w/.test(A);return e&&(A=A.replace(/\w/g,"")),`[${e?"\\w":""}${A.replace(/[^\w\s]/g,"\\$&")}]`}function _je(t){let A=Object.create(null),e=Object.create(null);for(let{label:n}of t){A[n[0]]=!0;for(let o=1;otypeof n=="string"?{label:n}:n),[e,i]=A.every(n=>/^\w+$/.test(n.label))?[/\w*$/,/\w+$/]:_je(A);return n=>{let o=n.matchBefore(i);return o||n.explicit?{from:o?o.from:n.pos,options:A,validFor:e}:null}}var Gb=class{constructor(A,e,i,n){this.completion=A,this.source=e,this.match=i,this.score=n}};function Zu(t){return t.selection.main.from}function G0e(t,A){var e;let{source:i}=t,n=A&&i[0]!="^",o=i[i.length-1]!="$";return!n&&!o?t:new RegExp(`${n?"^":""}(?:${i})${o?"$":""}`,(e=t.flags)!==null&&e!==void 0?e:t.ignoreCase?"i":"")}var K0e=Fc.define();function Nje(t,A,e,i){let{main:n}=t.selection,o=e-n.from,r=i-n.from;return _A(ae({},t.changeByRange(s=>{if(s!=n&&e!=i&&t.sliceDoc(s.from+o,s.from+r)!=t.sliceDoc(e,i))return{range:s};let a=t.toText(A);return{changes:{from:s.from+o,to:i==n.from?s.to:s.from+r,insert:a},range:fA.cursor(s.from+o+a.length)}})),{scrollIntoView:!0,userEvent:"input.complete"})}var x0e=new WeakMap;function Lje(t){if(!Array.isArray(t))return t;let A=x0e.get(t);return A||x0e.set(t,A=Rje(t)),A}var Kb=tn.define(),yp=tn.define(),tJ=class{constructor(A){this.pattern=A,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let e=0;e=48&&w<=57||w>=97&&w<=122?2:w>=65&&w<=90?1:0:(_=F3(w))!=_.toLowerCase()?1:_!=_.toUpperCase()?2:0;(!b||K==1&&B||S==0&&K!=0)&&(e[d]==w||i[d]==w&&(C=!0)?r[d++]=b:r.length&&(f=!1)),S=K,b+=El(w)}return d==a&&r[0]==0&&f?this.result(-100+(C?-200:0),r,A):I==a&&u==0?this.ret(-200-A.length+(h==A.length?0:-100),[0,h]):s>-1?this.ret(-700-A.length,[s,s+this.pattern.length]):I==a?this.ret(-900-A.length,[u,h]):d==a?this.result(-100+(C?-200:0)+-700+(f?0:-1100),r,A):e.length==2?null:this.result((n[0]?-700:0)+-200+-1100,n,A)}result(A,e,i){let n=[],o=0;for(let r of e){let s=r+(this.astral?El(da(i,r)):1);o&&n[o-1]==r?n[o-1]=s:(n[o++]=r,n[o++]=s)}return this.ret(A-i.length,n)}},iJ=class{constructor(A){this.pattern=A,this.matched=[],this.score=0,this.folded=A.toLowerCase()}match(A){if(A.length!1,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:Fje,filterStrict:!1,compareCompletions:(A,e)=>A.label.localeCompare(e.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(A,e)=>A&&e,closeOnBlur:(A,e)=>A&&e,icons:(A,e)=>A&&e,tooltipClass:(A,e)=>i=>_0e(A(i),e(i)),optionClass:(A,e)=>i=>_0e(A(i),e(i)),addToOptions:(A,e)=>A.concat(e),filterStrict:(A,e)=>A||e})}});function _0e(t,A){return t?A?t+" "+A:t:A}function Fje(t,A,e,i,n,o){let r=t.textDirection==Oo.RTL,s=r,a=!1,c="top",l,d,C=A.left-n.left,I=n.right-A.right,u=i.right-i.left,h=i.bottom-i.top;if(s&&C=h||b>A.top?l=e.bottom-A.top:(c="bottom",l=A.bottom-e.top)}let B=(A.bottom-A.top)/o.offsetHeight,f=(A.right-A.left)/o.offsetWidth;return{style:`${c}: ${l/B}px; max-width: ${d/f}px`,class:"cm-completionInfo-"+(a?r?"left-narrow":"right-narrow":s?"left":"right")}}function Gje(t){let A=t.addToOptions.slice();return t.icons&&A.push({render(e){let i=document.createElement("div");return i.classList.add("cm-completionIcon"),e.type&&i.classList.add(...e.type.split(/\s+/g).map(n=>"cm-completionIcon-"+n)),i.setAttribute("aria-hidden","true"),i},position:20}),A.push({render(e,i,n,o){let r=document.createElement("span");r.className="cm-completionLabel";let s=e.displayLabel||e.label,a=0;for(let c=0;ca&&r.appendChild(document.createTextNode(s.slice(a,l)));let C=r.appendChild(document.createElement("span"));C.appendChild(document.createTextNode(s.slice(l,d))),C.className="cm-completionMatchedText",a=d}return ae.position-i.position).map(e=>e.render)}function $O(t,A,e){if(t<=e)return{from:0,to:t};if(A<0&&(A=0),A<=t>>1){let n=Math.floor(A/e);return{from:n*e,to:(n+1)*e}}let i=Math.floor((t-A)/e);return{from:t-(i+1)*e,to:t-i*e}}var nJ=class{constructor(A,e,i){this.view=A,this.stateField=e,this.applyCompletion=i,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:a=>this.placeInfo(a),key:this},this.space=null,this.currentClass="";let n=A.state.field(e),{options:o,selected:r}=n.open,s=A.state.facet(Hs);this.optionContent=Gje(s),this.optionClass=s.optionClass,this.tooltipClass=s.tooltipClass,this.range=$O(o.length,r,s.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(A.state),this.dom.addEventListener("mousedown",a=>{let{options:c}=A.state.field(e).open;for(let l=a.target,d;l&&l!=this.dom;l=l.parentNode)if(l.nodeName=="LI"&&(d=/-(\d+)$/.exec(l.id))&&+d[1]{let c=A.state.field(this.stateField,!1);c&&c.tooltip&&A.state.facet(Hs).closeOnBlur&&a.relatedTarget!=A.contentDOM&&A.dispatch({effects:yp.of(null)})}),this.showOptions(o,n.id)}mount(){this.updateSel()}showOptions(A,e){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(A,e,this.range)),this.list.addEventListener("scroll",()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)})}update(A){var e;let i=A.state.field(this.stateField),n=A.startState.field(this.stateField);if(this.updateTooltipClass(A.state),i!=n){let{options:o,selected:r,disabled:s}=i.open;(!n.open||n.open.options!=o)&&(this.range=$O(o.length,r,A.state.facet(Hs).maxRenderedOptions),this.showOptions(o,i.id)),this.updateSel(),s!=((e=n.open)===null||e===void 0?void 0:e.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!s)}}updateTooltipClass(A){let e=this.tooltipClass(A);if(e!=this.currentClass){for(let i of this.currentClass.split(" "))i&&this.dom.classList.remove(i);for(let i of e.split(" "))i&&this.dom.classList.add(i);this.currentClass=e}}positioned(A){this.space=A,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let A=this.view.state.field(this.stateField),e=A.open;if((e.selected>-1&&e.selected=this.range.to)&&(this.range=$O(e.options.length,e.selected,this.view.state.facet(Hs).maxRenderedOptions),this.showOptions(e.options,A.id)),this.updateSelectedOption(e.selected)){this.destroyInfo();let{completion:i}=e.options[e.selected],{info:n}=i;if(!n)return;let o=typeof n=="string"?document.createTextNode(n):n(i);if(!o)return;"then"in o?o.then(r=>{r&&this.view.state.field(this.stateField,!1)==A&&this.addInfoPane(r,i)}).catch(r=>Js(this.view.state,r,"completion info")):this.addInfoPane(o,i)}}addInfoPane(A,e){this.destroyInfo();let i=this.info=document.createElement("div");if(i.className="cm-tooltip cm-completionInfo",A.nodeType!=null)i.appendChild(A),this.infoDestroy=null;else{let{dom:n,destroy:o}=A;i.appendChild(n),this.infoDestroy=o||null}this.dom.appendChild(i),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(A){let e=null;for(let i=this.list.firstChild,n=this.range.from;i;i=i.nextSibling,n++)i.nodeName!="LI"||!i.id?n--:n==A?i.hasAttribute("aria-selected")||(i.setAttribute("aria-selected","true"),e=i):i.hasAttribute("aria-selected")&&i.removeAttribute("aria-selected");return e&&Uje(this.list,e),e}measureInfo(){let A=this.dom.querySelector("[aria-selected]");if(!A||!this.info)return null;let e=this.dom.getBoundingClientRect(),i=this.info.getBoundingClientRect(),n=A.getBoundingClientRect(),o=this.space;if(!o){let r=this.dom.ownerDocument.documentElement;o={left:0,top:0,right:r.clientWidth,bottom:r.clientHeight}}return n.top>Math.min(o.bottom,e.bottom)-10||n.bottom{r.target==n&&r.preventDefault()});let o=null;for(let r=i.from;ri.from||i.from==0))if(o=C,typeof c!="string"&&c.header)n.appendChild(c.header(c));else{let I=n.appendChild(document.createElement("completion-section"));I.textContent=C}}let l=n.appendChild(document.createElement("li"));l.id=e+"-"+r,l.setAttribute("role","option");let d=this.optionClass(s);d&&(l.className=d);for(let C of this.optionContent){let I=C(s,this.view.state,this.view,a);I&&l.appendChild(I)}}return i.from&&n.classList.add("cm-completionListIncompleteTop"),i.tonew nJ(e,t,A)}function Uje(t,A){let e=t.getBoundingClientRect(),i=A.getBoundingClientRect(),n=e.height/t.offsetHeight;i.tope.bottom&&(t.scrollTop+=(i.bottom-e.bottom)/n)}function R0e(t){return(t.boost||0)*100+(t.apply?10:0)+(t.info?5:0)+(t.type?1:0)}function Tje(t,A){let e=[],i=null,n=c=>{e.push(c);let{section:l}=c.completion;if(l){i||(i=[]);let d=typeof l=="string"?l:l.name;i.some(C=>C.name==d)||i.push(typeof l=="string"?{name:d}:l)}},o=A.facet(Hs);for(let c of t)if(c.hasResult()){let l=c.result.getMatch;if(c.result.filter===!1)for(let d of c.result.options)n(new Gb(d,c.source,l?l(d):[],1e9-e.length));else{let d=A.sliceDoc(c.from,c.to),C,I=o.filterStrict?new iJ(d):new tJ(d);for(let u of c.result.options)if(C=I.match(u.label)){let h=u.displayLabel?l?l(u,C.matched):[]:C.matched;n(new Gb(u,c.source,h,C.score+(u.boost||0)))}}}if(i){let c=Object.create(null),l=0,d=(C,I)=>{var u,h;return((u=C.rank)!==null&&u!==void 0?u:1e9)-((h=I.rank)!==null&&h!==void 0?h:1e9)||(C.named.score-l.score||a(l.completion,d.completion))){let l=c.completion;!s||s.label!=l.label||s.detail!=l.detail||s.type!=null&&l.type!=null&&s.type!=l.type||s.apply!=l.apply||s.boost!=l.boost?r.push(c):R0e(c.completion)>R0e(s)&&(r[r.length-1]=c),s=c.completion}return r}var oJ=class t{constructor(A,e,i,n,o,r){this.options=A,this.attrs=e,this.tooltip=i,this.timestamp=n,this.selected=o,this.disabled=r}setSelected(A,e){return A==this.selected||A>=this.options.length?this:new t(this.options,N0e(e,A),this.tooltip,this.timestamp,A,this.disabled)}static build(A,e,i,n,o,r){if(n&&!r&&A.some(c=>c.isPending))return n.setDisabled();let s=Tje(A,e);if(!s.length)return n&&A.some(c=>c.isPending)?n.setDisabled():null;let a=e.facet(Hs).selectOnOpen?0:-1;if(n&&n.selected!=a&&n.selected!=-1){let c=n.options[n.selected].completion;for(let l=0;ll.hasResult()?Math.min(c,l.from):c,1e8),create:Pje,above:o.aboveCursor},n?n.timestamp:Date.now(),a,!1)}map(A){return new t(this.options,this.attrs,_A(ae({},this.tooltip),{pos:A.mapPos(this.tooltip.pos)}),this.timestamp,this.selected,this.disabled)}setDisabled(){return new t(this.options,this.attrs,this.tooltip,this.timestamp,this.selected,!0)}},rJ=class t{constructor(A,e,i){this.active=A,this.id=e,this.open=i}static start(){return new t(Hje,"cm-ac-"+Math.floor(Math.random()*2e6).toString(36),null)}update(A){let{state:e}=A,i=e.facet(Hs),o=(i.override||e.languageDataAt("autocomplete",Zu(e)).map(Lje)).map(a=>(this.active.find(l=>l.source==a)||new U2(a,this.active.some(l=>l.state!=0)?1:0)).update(A,i));o.length==this.active.length&&o.every((a,c)=>a==this.active[c])&&(o=this.active);let r=this.open,s=A.effects.some(a=>a.is(aJ));r&&A.docChanged&&(r=r.map(A.changes)),A.selection||o.some(a=>a.hasResult()&&A.changes.touchesRange(a.from,a.to))||!Oje(o,this.active)||s?r=oJ.build(o,e,this.id,r,i,s):r&&r.disabled&&!o.some(a=>a.isPending)&&(r=null),!r&&o.every(a=>!a.isPending)&&o.some(a=>a.hasResult())&&(o=o.map(a=>a.hasResult()?new U2(a.source,0):a));for(let a of A.effects)a.is(T0e)&&(r=r&&r.setSelected(a.value,this.id));return o==this.active&&r==this.open?this:new t(o,this.id,r)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:this.active.length?Jje:Yje}};function Oje(t,A){if(t==A)return!0;for(let e=0,i=0;;){for(;e-1&&(e["aria-activedescendant"]=t+"-"+A),e}var Hje=[];function U0e(t,A){if(t.isUserEvent("input.complete")){let i=t.annotation(K0e);if(i&&A.activateOnCompletion(i))return 12}let e=t.isUserEvent("input.type");return e&&A.activateOnTyping?5:e?1:t.isUserEvent("delete.backward")?2:t.selection?8:t.docChanged?16:0}var U2=class t{constructor(A,e,i=!1){this.source=A,this.state=e,this.explicit=i}hasResult(){return!1}get isPending(){return this.state==1}update(A,e){let i=U0e(A,e),n=this;(i&8||i&16&&this.touches(A))&&(n=new t(n.source,0)),i&4&&n.state==0&&(n=new t(this.source,1)),n=n.updateFor(A,i);for(let o of A.effects)if(o.is(Kb))n=new t(n.source,1,o.value);else if(o.is(yp))n=new t(n.source,0);else if(o.is(aJ))for(let r of o.value)r.source==n.source&&(n=r);return n}updateFor(A,e){return this.map(A.changes)}map(A){return this}touches(A){return A.changes.touchesRange(Zu(A.state))}},Ub=class t extends U2{constructor(A,e,i,n,o,r){super(A,3,e),this.limit=i,this.result=n,this.from=o,this.to=r}hasResult(){return!0}updateFor(A,e){var i;if(!(e&3))return this.map(A.changes);let n=this.result;n.map&&!A.changes.empty&&(n=n.map(n,A.changes));let o=A.changes.mapPos(this.from),r=A.changes.mapPos(this.to,1),s=Zu(A.state);if(s>r||!n||e&2&&(Zu(A.startState)==this.from||se.map(A))}}),T0e=tn.define(),Uc=_r.define({create(){return rJ.start()},update(t,A){return t.update(A)},provide:t=>[Bf.from(t,A=>A.tooltip),ai.contentAttributes.from(t,A=>A.attrs)]});function cJ(t,A){let e=A.completion.apply||A.completion.label,i=t.state.field(Uc).active.find(n=>n.source==A.source);return i instanceof Ub?(typeof e=="string"?t.dispatch(_A(ae({},Nje(t.state,e,i.from,i.to)),{annotations:K0e.of(A.completion)})):e(t,A.completion,i.from,i.to),!0):!1}var Pje=Kje(Uc,cJ);function Lb(t,A="option"){return e=>{let i=e.state.field(Uc,!1);if(!i||!i.open||i.open.disabled||Date.now()-i.open.timestamp-1?i.open.selected+n*(t?1:-1):t?0:r-1;return s<0?s=A=="page"?0:r-1:s>=r&&(s=A=="page"?r-1:0),e.dispatch({effects:T0e.of(s)}),!0}}var jje=t=>{let A=t.state.field(Uc,!1);return t.state.readOnly||!A||!A.open||A.open.selected<0||A.open.disabled||Date.now()-A.open.timestampt.state.field(Uc,!1)?(t.dispatch({effects:Kb.of(!0)}),!0):!1,Vje=t=>{let A=t.state.field(Uc,!1);return!A||!A.active.some(e=>e.state!=0)?!1:(t.dispatch({effects:yp.of(null)}),!0)},sJ=class{constructor(A,e){this.active=A,this.context=e,this.time=Date.now(),this.updates=[],this.done=void 0}},qje=50,Wje=1e3,Zje=Jo.fromClass(class{constructor(t){this.view=t,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let A of t.state.field(Uc).active)A.isPending&&this.startQuery(A)}update(t){let A=t.state.field(Uc),e=t.state.facet(Hs);if(!t.selectionSet&&!t.docChanged&&t.startState.field(Uc)==A)return;let i=t.transactions.some(o=>{let r=U0e(o,e);return r&8||(o.selection||o.docChanged)&&!(r&3)});for(let o=0;oqje&&Date.now()-r.time>Wje){for(let s of r.context.abortListeners)try{s()}catch(a){Js(this.view.state,a)}r.context.abortListeners=null,this.running.splice(o--,1)}else r.updates.push(...t.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),t.transactions.some(o=>o.effects.some(r=>r.is(Kb)))&&(this.pendingStart=!0);let n=this.pendingStart?50:e.activateOnTypingDelay;if(this.debounceUpdate=A.active.some(o=>o.isPending&&!this.running.some(r=>r.active.source==o.source))?setTimeout(()=>this.startUpdate(),n):-1,this.composing!=0)for(let o of t.transactions)o.isUserEvent("input.type")?this.composing=2:this.composing==2&&o.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:t}=this.view,A=t.field(Uc);for(let e of A.active)e.isPending&&!this.running.some(i=>i.active.source==e.source)&&this.startQuery(e);this.running.length&&A.open&&A.open.disabled&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(Hs).updateSyncTime))}startQuery(t){let{state:A}=this.view,e=Zu(A),i=new Fb(A,e,t.explicit,this.view),n=new sJ(t,i);this.running.push(n),Promise.resolve(t.source(i)).then(o=>{n.context.aborted||(n.done=o||null,this.scheduleAccept())},o=>{this.view.dispatch({effects:yp.of(null)}),Js(this.view.state,o)})}scheduleAccept(){this.running.every(t=>t.done!==void 0)?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(Hs).updateSyncTime))}accept(){var t;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let A=[],e=this.view.state.facet(Hs),i=this.view.state.field(Uc);for(let n=0;ns.source==o.active.source);if(r&&r.isPending)if(o.done==null){let s=new U2(o.active.source,0);for(let a of o.updates)s=s.update(a,e);s.isPending||A.push(s)}else this.startQuery(r)}(A.length||i.open&&i.open.disabled)&&this.view.dispatch({effects:aJ.of(A)})}},{eventHandlers:{blur(t){let A=this.view.state.field(Uc,!1);if(A&&A.tooltip&&this.view.state.facet(Hs).closeOnBlur){let e=A.open&&zT(this.view,A.open.tooltip);(!e||!e.dom.contains(t.relatedTarget))&&setTimeout(()=>this.view.dispatch({effects:yp.of(null)}),10)}},compositionstart(){this.composing=1},compositionend(){this.composing==3&&setTimeout(()=>this.view.dispatch({effects:Kb.of(!1)}),20),this.composing=0}}}),Xje=typeof navigator=="object"&&/Win/.test(navigator.platform),$je=Hg.highest(ai.domEventHandlers({keydown(t,A){let e=A.state.field(Uc,!1);if(!e||!e.open||e.open.disabled||e.open.selected<0||t.key.length>1||t.ctrlKey&&!(Xje&&t.altKey)||t.metaKey)return!1;let i=e.open.options[e.open.selected],n=e.active.find(r=>r.source==i.source),o=i.completion.commitCharacters||n.result.commitCharacters;return o&&o.indexOf(t.key)>-1&&cJ(A,i),!1}})),eVe=ai.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"\xB7\xB7\xB7"',opacity:.5,display:"block",textAlign:"center"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box",whiteSpace:"pre-line"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'\u0192'"}},".cm-completionIcon-class":{"&:after":{content:"'\u25CB'"}},".cm-completionIcon-interface":{"&:after":{content:"'\u25CC'"}},".cm-completionIcon-variable":{"&:after":{content:"'\u{1D465}'"}},".cm-completionIcon-constant":{"&:after":{content:"'\u{1D436}'"}},".cm-completionIcon-type":{"&:after":{content:"'\u{1D461}'"}},".cm-completionIcon-enum":{"&:after":{content:"'\u222A'"}},".cm-completionIcon-property":{"&:after":{content:"'\u25A1'"}},".cm-completionIcon-keyword":{"&:after":{content:"'\u{1F511}\uFE0E'"}},".cm-completionIcon-namespace":{"&:after":{content:"'\u25A2'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}});var Dp={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},Wu=tn.define({map(t,A){let e=A.mapPos(t,-1,ca.TrackAfter);return e??void 0}}),lJ=new class extends Yg{};lJ.startSide=1;lJ.endSide=-1;var O0e=_r.define({create(){return To.empty},update(t,A){if(t=t.map(A.changes),A.selection){let e=A.state.doc.lineAt(A.selection.main.head);t=t.update({filter:i=>i>=e.from&&i<=e.to})}for(let e of A.effects)e.is(Wu)&&(t=t.update({add:[lJ.range(e.value,e.value+1)]}));return t}});function J0e(){return[tVe,O0e]}var AJ="()[]{}<>\xAB\xBB\xBB\xAB\uFF3B\uFF3D\uFF5B\uFF5D";function Y0e(t){for(let A=0;A{if((AVe?t.composing:t.compositionStarted)||t.state.readOnly)return!1;let n=t.state.selection.main;if(i.length>2||i.length==2&&El(da(i,0))==1||A!=n.from||e!=n.to)return!1;let o=nVe(t.state,i);return o?(t.dispatch(o),!0):!1}),iVe=({state:t,dispatch:A})=>{if(t.readOnly)return!1;let i=H0e(t,t.selection.main.head).brackets||Dp.brackets,n=null,o=t.changeByRange(r=>{if(r.empty){let s=oVe(t.doc,r.head);for(let a of i)if(a==s&&Tb(t.doc,r.head)==Y0e(da(a,0)))return{changes:{from:r.head-a.length,to:r.head+a.length},range:fA.cursor(r.head-a.length)}}return{range:n=r}});return n||A(t.update(o,{scrollIntoView:!0,userEvent:"delete.backward"})),!n},z0e=[{key:"Backspace",run:iVe}];function nVe(t,A){let e=H0e(t,t.selection.main.head),i=e.brackets||Dp.brackets;for(let n of i){let o=Y0e(da(n,0));if(A==n)return o==n?aVe(t,n,i.indexOf(n+n+n)>-1,e):rVe(t,n,o,e.before||Dp.before);if(A==o&&P0e(t,t.selection.main.from))return sVe(t,n,o)}return null}function P0e(t,A){let e=!1;return t.field(O0e).between(0,t.doc.length,i=>{i==A&&(e=!0)}),e}function Tb(t,A){let e=t.sliceString(A,A+2);return e.slice(0,El(da(e,0)))}function oVe(t,A){let e=t.sliceString(A-2,A);return El(da(e,0))==e.length?e:e.slice(1)}function rVe(t,A,e,i){let n=null,o=t.changeByRange(r=>{if(!r.empty)return{changes:[{insert:A,from:r.from},{insert:e,from:r.to}],effects:Wu.of(r.to+A.length),range:fA.range(r.anchor+A.length,r.head+A.length)};let s=Tb(t.doc,r.head);return!s||/\s/.test(s)||i.indexOf(s)>-1?{changes:{insert:A+e,from:r.head},effects:Wu.of(r.head+A.length),range:fA.cursor(r.head+A.length)}:{range:n=r}});return n?null:t.update(o,{scrollIntoView:!0,userEvent:"input.type"})}function sVe(t,A,e){let i=null,n=t.changeByRange(o=>o.empty&&Tb(t.doc,o.head)==e?{changes:{from:o.head,to:o.head+e.length,insert:e},range:fA.cursor(o.head+e.length)}:i={range:o});return i?null:t.update(n,{scrollIntoView:!0,userEvent:"input.type"})}function aVe(t,A,e,i){let n=i.stringPrefixes||Dp.stringPrefixes,o=null,r=t.changeByRange(s=>{if(!s.empty)return{changes:[{insert:A,from:s.from},{insert:A,from:s.to}],effects:Wu.of(s.to+A.length),range:fA.range(s.anchor+A.length,s.head+A.length)};let a=s.head,c=Tb(t.doc,a),l;if(c==A){if(L0e(t,a))return{changes:{insert:A+A,from:a},effects:Wu.of(a+A.length),range:fA.cursor(a+A.length)};if(P0e(t,a)){let C=e&&t.sliceDoc(a,a+A.length*3)==A+A+A?A+A+A:A;return{changes:{from:a,to:a+C.length,insert:C},range:fA.cursor(a+C.length)}}}else{if(e&&t.sliceDoc(a-2*A.length,a)==A+A&&(l=F0e(t,a-2*A.length,n))>-1&&L0e(t,l))return{changes:{insert:A+A+A+A,from:a},effects:Wu.of(a+A.length),range:fA.cursor(a+A.length)};if(t.charCategorizer(a)(c)!=Uo.Word&&F0e(t,a,n)>-1&&!cVe(t,a,A,n))return{changes:{insert:A+A,from:a},effects:Wu.of(a+A.length),range:fA.cursor(a+A.length)}}return{range:o=s}});return o?null:t.update(r,{scrollIntoView:!0,userEvent:"input.type"})}function L0e(t,A){let e=Ys(t).resolveInner(A+1);return e.parent&&e.from==A}function cVe(t,A,e,i){let n=Ys(t).resolveInner(A,-1),o=i.reduce((r,s)=>Math.max(r,s.length),0);for(let r=0;r<5;r++){let s=t.sliceDoc(n.from,Math.min(n.to,n.from+e.length+o)),a=s.indexOf(e);if(!a||a>-1&&i.indexOf(s.slice(0,a))>-1){let l=n.firstChild;for(;l&&l.from==n.from&&l.to-l.from>e.length+a;){if(t.sliceDoc(l.to-e.length,l.to)==e)return!1;l=l.firstChild}return!0}let c=n.to==A&&n.parent;if(!c)break;n=c}return!1}function F0e(t,A,e){let i=t.charCategorizer(A);if(i(t.sliceDoc(A-1,A))!=Uo.Word)return A;for(let n of e){let o=A-n.length;if(t.sliceDoc(o,A)==n&&i(t.sliceDoc(o-1,o))!=Uo.Word)return o}return-1}function j0e(t={}){return[$je,Uc,Hs.of(t),Zje,lVe,eVe]}var gJ=[{key:"Ctrl-Space",run:eJ},{mac:"Alt-`",run:eJ},{mac:"Alt-i",run:eJ},{key:"Escape",run:Vje},{key:"ArrowDown",run:Lb(!0)},{key:"ArrowUp",run:Lb(!1)},{key:"PageDown",run:Lb(!0,"page")},{key:"PageUp",run:Lb(!1,"page")},{key:"Enter",run:jje}],lVe=Hg.highest(hf.computeN([Hs],t=>t.facet(Hs).defaultKeymap?[gJ]:[]));function gVe(t,A=t.state){let e=new Set;for(let{from:i,to:n}of t.visibleRanges){let o=i;for(;o<=n;){let r=A.doc.lineAt(o);e.has(r)||e.add(r),o=r.to+1}}return e}function dJ(t){let A=t.selection.main.head;return t.doc.lineAt(A)}function V0e(t,A){let e=0;e:for(let i=0;i=o.level&&this.markerType!=="codeOnly"?this.set(A,0,n.level):n.empty&&n.level===0&&o.level!==0?this.set(A,0,0):o.level>n.level?this.set(A,0,n.level+1):this.set(A,0,o.level)}let e=V0e(A.text,this.state.tabSize),i=Math.floor(e/this.unitWidth);return this.set(A,e,i)}closestNonEmpty(A,e){let i=A.number+e;for(;e===-1?i>=1:i<=this.state.doc.lines;){if(this.has(i)){let r=this.get(i);if(!r.empty)return r}let o=this.state.doc.line(i);if(o.text.trim().length){let r=V0e(o.text,this.state.tabSize),s=Math.floor(r/this.unitWidth);return this.set(o,r,s)}i+=e}let n=this.state.doc.line(e===-1?1:this.state.doc.lines);return this.set(n,0,0)}findAndSetActiveLines(){let A=dJ(this.state);if(!this.has(A))return;let e=this.get(A);if(this.has(e.line.number+1)){let o=this.get(e.line.number+1);o.level>e.level&&(e=o)}if(this.has(e.line.number-1)){let o=this.get(e.line.number-1);o.level>e.level&&(e=o)}if(e.level===0)return;e.active=e.level;let i,n;for(i=e.line.number;i>1;i--){if(!this.has(i-1))continue;let o=this.get(i-1);if(o.level0&&a.push(Ob("--indent-marker-bg-color",i,A,s,c)),a.push(Ob("--indent-marker-active-bg-color",n,A,r-1,1)),r!==o&&a.push(Ob("--indent-marker-bg-color",i,A,r,o-r))}else a.push(Ob("--indent-marker-bg-color",i,A,s,o-s));return a.join(",")}var IJ=class{constructor(A){this.view=A,this.unitWidth=qg(A.state),this.currentLineNumber=dJ(A.state).number,this.generate(A.state)}update(A){let e=qg(A.state),i=e!==this.unitWidth;i&&(this.unitWidth=e);let n=dJ(A.state).number,o=n!==this.currentLineNumber;this.currentLineNumber=n;let r=A.state.facet(Jb).highlightActiveBlock&&o;(A.docChanged||A.viewportChanged||i||r)&&this.generate(A.state)}generate(A){let e=new ga,i=gVe(this.view,A),{hideFirstIndent:n,markerType:o,thickness:r,activeThickness:s}=A.facet(Jb),a=new CJ(i,A,this.unitWidth,o);for(let c of i){let l=a.get(c.number);if(!l?.level)continue;let d=CVe(l,this.unitWidth,n,r,s);e.add(c.from,c.from,bt.line({class:"cm-indent-markers",attributes:{style:`--indent-markers: ${d}`}}))}this.decorations=e.finish()}};function q0e(t={}){return[Jb.of(t),dVe(t.colors),Jo.fromClass(IJ,{decorations:A=>A.decorations})]}var IVe=["mainAxis","crossAxis","fallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","flipAlignment"],uVe=["mainAxis","crossAxis","limiter"];function g2e(t,A){if(t==null)return{};var e,i,n=function(r,s){if(r==null)return{};var a={};for(var c in r)if({}.hasOwnProperty.call(r,c)){if(s.indexOf(c)!==-1)continue;a[c]=r[c]}return a}(t,A);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(i=0;i{};function pVe(t){return t()}function cM(t){for(var A=0;A1&&arguments[1]!==void 0&&arguments[1])&&(po.l={s:null,u:null,r1:[],r2:rh(!1)})}function kt(t){var A=po,e=A.e;if(e!==null)for(var i of(A.e=null,e))b2e(i);return t!==void 0&&(A.x=t),po=A.p,t??{}}function nQ(){return!tQ||po!==null&&po.l===null}function f2e(t){var A,e;return po===null&&Zp(),(e=(A=po).c)!==null&&e!==void 0?e:A.c=new Map(function(i){for(var n=i.p;n!==null;){var o=n.c;if(o!==null)return o;n=n.p}return null}(po)||void 0)}function Uf(t){if(typeof t!="object"||t===null||Rd in t)return t;var A=mY(t);if(A!==QVe&&A!==mVe)return t;var e=new Map,i=iQ(t),n=T2(0),o=ih,r=s=>{if(ih===o)return s();var a=cr,c=ih;$C(null),rde(o);var l=s();return $C(a),rde(c),l};return i&&e.set("length",T2(t.length)),new Proxy(t,{defineProperty(s,a,c){"value"in c&&c.configurable!==!1&&c.enumerable!==!1&&c.writable!==!1||function(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}();var l=e.get(a);return l===void 0?l=r(()=>{var d=T2(c.value);return e.set(a,d),d}):x(l,c.value,!0),!0},deleteProperty(s,a){var c=e.get(a);if(c===void 0){if(a in s){var l=r(()=>T2(Ia));e.set(a,l),BJ(n)}}else{if(i&&typeof a=="string"){var d=e.get("length"),C=Number(a);Number.isInteger(C)&&CT2(Uf(C?s[a]:Ia))),e.set(a,d)),d!==void 0){var I=g(d);return I===Ia?void 0:I}return Reflect.get(s,a,c)},getOwnPropertyDescriptor(s,a){var c=Reflect.getOwnPropertyDescriptor(s,a);if(c&&"value"in c){var l=e.get(a);l&&(c.value=g(l))}else if(c===void 0){var d=e.get(a),C=d?.v;if(d!==void 0&&C!==Ia)return{enumerable:!0,configurable:!0,value:C,writable:!0}}return c},has(s,a){var c;if(a===Rd)return!0;var l=e.get(a),d=l!==void 0&&l.v!==Ia||Reflect.has(s,a);return(l!==void 0||wo!==null&&(!d||(c=j2(s,a))!==null&&c!==void 0&&c.writable))&&(l===void 0&&(l=r(()=>T2(d?Uf(s[a]):Ia)),e.set(a,l)),g(l)===Ia)?!1:d},set(s,a,c,l){var d,C=e.get(a),I=a in s;if(i&&a==="length")for(var u=c;uT2(Ia)),e.set(u+"",h))}C===void 0?(!I||(d=j2(s,a))!==null&&d!==void 0&&d.writable)&&(x(C=r(()=>T2(void 0)),Uf(c)),e.set(a,C)):(I=C.v!==Ia,x(C,r(()=>Uf(c))));var B=Reflect.getOwnPropertyDescriptor(s,a);if(B!=null&&B.set&&B.set.call(l,c),!I){if(i&&typeof a=="string"){var f=e.get("length"),b=Number(a);Number.isInteger(b)&&b>=f.v&&x(f,b+1)}BJ(n)}return!0},ownKeys(s){g(n);var a=Reflect.ownKeys(s).filter(d=>{var C=e.get(d);return C===void 0||C.v!==Ia});for(var[c,l]of e)l.v===Ia||c in s||a.push(c);return a},setPrototypeOf(){(function(){throw new Error("https://svelte.dev/e/state_prototype_fixed")})()}})}function ide(t){try{if(t!==null&&typeof t=="object"&&Rd in t)return t[Rd]}catch{}return t}function MVe(t,A){return Object.is(ide(t),ide(A))}function oQ(t){var A=2050,e=cr!==null&&2&cr.f?cr:null;return wo===null||e!==null&&(e.f&$g)!==0?A|=$g:wo.f|=yVe,{ctx:po,deps:null,effects:null,equals:B2e,f:A,fn:t,reactions:null,rv:0,v:Ia,wv:0,parent:e??wo,ac:null}}function Oc(t){var A=oQ(t);return F2e(A),A}function tA(t){var A=oQ(t);return A.equals=E2e,A}function Q2e(t){var A=t.effects;if(A!==null){t.effects=null;for(var e=0;e1&&arguments[1]!==void 0&&arguments[1],n=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],o=rh(t);return i||(o.equals=E2e),tQ&&n&&po!==null&&po.l!==null&&((e=(A=po.l).s)!==null&&e!==void 0?e:A.s=[]).push(o),o}function vl(t,A){return x(t,Be(()=>g(t))),A}function x(t,A){var e,i=arguments.length>2&&arguments[2]!==void 0&&arguments[2];return cr===null||kd&&(cr.f&wVe)===0||!nQ()||!(131090&cr.f)||(e=q2)!==null&&e!==void 0&&e.includes(t)||function(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}(),zJ(t,i?Uf(A):A)}function zJ(t,A){if(!t.equals(A)){var e=t.v;XC?Ah.set(t,A):Ah.set(t,e),t.v=A,2&t.f&&((t.f&Vf)!==0&&yY(t),n0(t,(t.f&$g)===0?kl:Ch)),t.wv=G2e(),p2e(t,Vf),!nQ()||wo===null||(wo.f&kl)===0||96&wo.f||(og===null?function(i){og=i}([t]):og.push(t))}return A}function nde(t){var A=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,e=g(t),i=A===1?e++:e--;return x(t,e),i}function BJ(t){x(t,t.v+1)}function p2e(t,A){var e=t.reactions;if(e!==null)for(var i=nQ(),n=e.length,o=0;o0&&arguments[0]!==void 0?arguments[0]:"";return document.createTextNode(t)}function bl(t){return y2e.call(t)}function xM(t){return D2e.call(t)}function ge(t,A){return bl(t)}function Ut(t,A){var e=bl(t);return e instanceof Comment&&e.data===""?xM(e):e}function De(t){for(var A=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,e=t;A--;)e=xM(e);return e}function v2e(t){wo===null&&cr===null&&function(){throw new Error("https://svelte.dev/e/effect_orphan")}(),cr!==null&&(cr.f&$g)!==0&&wo===null&&function(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}(),XC&&function(){throw new Error("https://svelte.dev/e/effect_in_teardown")}()}function oI(t,A,e){var i=!(arguments.length>3&&arguments[3]!==void 0)||arguments[3],n=wo,o={ctx:po,deps:null,nodes_start:null,nodes_end:null,f:t|Vf,first:null,fn:A,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,transitions:null,wv:0,ac:null};if(e)try{RM(o),o.f|=32768}catch(a){throw lg(o),a}else A!==null&&NM(o);if(!(e&&o.deps===null&&o.first===null&&o.nodes_start===null&&o.teardown===null&&!(524416&o.f))&&i&&(n!==null&&function(a,c){var l=c.last;l===null?c.last=c.first=a:(l.next=a,a.prev=l,c.last=a)}(o,n),cr!==null&&2&cr.f)){var r,s=cr;((r=s.effects)!==null&&r!==void 0?r:s.effects=[]).push(o)}return o}function DY(t){var A=oI(8,null,!1);return n0(A,kl),A.teardown=t,A}function PJ(t){if(v2e(),cr||!wo||(wo.f&SM)===0)return b2e(t);var A,e=po;((A=e.e)!==null&&A!==void 0?A:e.e=[]).push(t)}function b2e(t){return oI(2097156,t,!1)}function zs(t){return oI(4,t,!1)}function Se(t,A){var e=po,i={effect:null,ran:!1};e.l.r1.push(i),i.effect=Xp(()=>{t(),i.ran||(i.ran=!0,x(e.l.r2,!0),Be(A))})}function Nn(){var t=po;Xp(()=>{if(g(t.l.r2)){for(var A of t.l.r1){var e=A.effect;(e.f&kl)!==0&&n0(e,Ch),$p(e)&&RM(e),A.ran=!1}t.l.r2.v=!1}})}function Xp(t){return oI(8,t,!0)}function xA(t){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:oQ,e=(arguments.length>1&&arguments[1]!==void 0?arguments[1]:[]).map(A);return rI(()=>t(...e.map(g)))}function rI(t){return oI(24|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),t,!0)}function Gd(t){return oI(40,t,!0,!(arguments.length>1&&arguments[1]!==void 0)||arguments[1])}function M2e(t){var A=t.teardown;if(A!==null){var e=XC,i=cr;ode(!0),$C(null);try{A.call(null)}finally{ode(e),$C(i)}}}function S2e(t){var A=arguments.length>1&&arguments[1]!==void 0&&arguments[1],e=t.first;for(t.first=t.last=null;e!==null;){var i;(i=e.ac)===null||i===void 0||i.abort(h2e);var n=e.next;(e.f&I2e)!==0?e.parent=null:lg(e,A),e=n}}function lg(t){var A=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],e=!1;(A||262144&t.f)&&t.nodes_start!==null&&t.nodes_end!==null&&(k2e(t.nodes_start,t.nodes_end),e=!0),S2e(t,A&&!e),dM(t,0),n0(t,pY);var i=t.transitions;if(i!==null)for(var n of i)n.stop();M2e(t);var o=t.parent;o!==null&&o.first!==null&&x2e(t),t.next=t.prev=t.teardown=t.ctx=t.deps=t.fn=t.nodes_start=t.nodes_end=t.ac=null}function k2e(t,A){for(;t!==null;){var e=t===A?null:xM(t);t.remove(),t=e}}function x2e(t){var A=t.parent,e=t.prev,i=t.next;e!==null&&(e.next=i),i!==null&&(i.prev=e),A!==null&&(A.first===t&&(A.first=i),A.last===t&&(A.last=e))}function qf(t,A){var e=[];vY(t,e,!0),_2e(e,()=>{lg(t),A&&A()})}function _2e(t,A){var e=t.length;if(e>0){var i=()=>--e||A();for(var n of t)n.out(i)}else A()}function vY(t,A,e){if((t.f&VC)===0){if(t.f^=VC,t.transitions!==null)for(var i of t.transitions)(i.is_global||e)&&A.push(i);for(var n=t.first;n!==null;){var o=n.next;vY(n,A,((n.f&Wp)!==0||(n.f&SM)!==0)&&e),n=o}}}function lM(t){R2e(t,!0)}function R2e(t,A){if((t.f&VC)!==0){t.f^=VC;for(var e=t.first;e!==null;){var i=e.next;R2e(e,((e.f&Wp)!==0||(e.f&SM)!==0)&&A),e=i}if(t.transitions!==null)for(var n of t.transitions)(n.is_global||A)&&n.in()}}var Np=[],EJ=[];function N2e(){var t=Np;Np=[],cM(t)}function _M(t){Np.length===0&&queueMicrotask(N2e),Np.push(t)}function SVe(){var t;Np.length>0&&N2e(),EJ.length>0&&(t=EJ,EJ=[],cM(t))}function L2e(t,A){for(;A!==null;){if(128&A.f)try{return void A.b.error(t)}catch{}A=A.parent}throw t}var Lp=!1,Fp=null,th=!1,XC=!1;function ode(t){XC=t}var Rp=[],cr=null,kd=!1;function $C(t){cr=t}var wo=null;function eI(t){wo=t}var q2=null;function F2e(t){cr!==null&&cr.f&HJ&&(q2===null?q2=[t]:q2.push(t))}var cc=null,yl=0,og=null,gM=1,Gp=0,ih=Gp;function rde(t){ih=t}var HC=!1,sde=null;function G2e(){return++gM}function $p(t){var A=t.f;if((A&Vf)!==0)return!0;if((A&Ch)!==0){var e=t.deps,i=(A&$g)!==0;if(e!==null){var n,o,r=(A&YJ)!==0,s=i&&wo!==null&&!HC,a=e.length;if(r||s){var c=t,l=c.parent;for(n=0;nt.wv)return!0}i&&(wo===null||HC)||n0(t,kl)}return!1}function K2e(t,A){var e,i=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],n=t.reactions;if(n!==null&&((e=q2)===null||e===void 0||!e.includes(t)))for(var o=0;o0)for(C.length=yl+cc.length,I=0;I0;){A++>1e3&&xVe();var e=Rp,i=e.length;Rp=[];for(var n=0;nn&&(i.f&DVe)!==0)break}}for(;e1&&arguments[1]!==void 0?arguments[1]:new Set;if(!(typeof t!="object"||t===null||t instanceof EventTarget||A.has(t))){for(var e in A.add(t),t instanceof Date&&t.getTime(),t)try{jJ(t[e],A)}catch{}var i=mY(t);if(i!==Object.prototype&&i!==Array.prototype&&i!==Map.prototype&&i!==Set.prototype&&i!==Date.prototype){var n=C2e(i);for(var o in n){var r=n[o].get;if(r)try{r.call(t)}catch{}}}}}var ade=!1;function Y2e(t){var A=cr,e=wo;$C(null),eI(null);try{return t()}finally{$C(A),eI(e)}}function LVe(t,A,e){var i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:e;t.addEventListener(A,()=>Y2e(e));var n=t.__on_r;t.__on_r=n?()=>{n(),i(!0)}:()=>i(!0),ade||(ade=!0,document.addEventListener("reset",o=>{Promise.resolve().then(()=>{if(!o.defaultPrevented)for(var r of o.target.elements){var s;(s=r.__on_r)===null||s===void 0||s.call(r)}})},{capture:!0}))}var H2e=new Set,VJ=new Set;function z2e(t,A,e){var i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};function n(o){if(i.capture||Sp.call(A,o),!o.cancelBubble)return Y2e(()=>e?.call(this,o))}return t.startsWith("pointer")||t.startsWith("touch")||t==="wheel"?_M(()=>{A.addEventListener(t,n,i)}):A.addEventListener(t,n,i),n}function QA(t,A,e,i,n){var o={capture:i,passive:n},r=z2e(t,A,e,o);(A===document.body||A===window||A===document||A instanceof HTMLMediaElement)&&DY(()=>{A.removeEventListener(t,r,o)})}function e6(t){for(var A=0;Ar||i});var d=cr,C=wo;$C(null),eI(null);try{for(var I,u=[];r!==null;){var h=r.assignedSlot||r.parentNode||r.host||null;try{var B=r["__"+n];if(B!=null&&(!r.disabled||t.target===r))if(iQ(B)){var[f,...b]=B;f.apply(r,[t,...b])}else B.call(r,t)}catch(w){I?u.push(w):I=w}if(t.cancelBubble||h===e||h===null)break;r=h}if(I){var k=function(w){queueMicrotask(()=>{throw w})};for(var S of u)k(S);throw I}}finally{t.__root=e,delete t.currentTarget,$C(d),eI(C)}}}function bY(t){var A=document.createElement("template");return A.innerHTML=t.replaceAll("",""),A.content}function sh(t,A){var e=wo;e.nodes_start===null&&(e.nodes_start=t,e.nodes_end=A)}function _e(t,A){var e,i=!!(1&A),n=!!(2&A),o=!t.startsWith("");return()=>{e===void 0&&(e=bY(o?t:""+t),i||(e=bl(e)));var r=n||w2e?document.importNode(e,!0):e.cloneNode(!0);return i?sh(bl(r),r.lastChild):sh(r,r),r}}function sI(t,A){return function(e,i){var n,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"svg",r=!e.startsWith(""),s=!!(1&i),a="<".concat(o,">").concat(r?e:""+e,"");return()=>{if(!n){var c=bl(bY(a));if(s)for(n=document.createDocumentFragment();bl(c);)n.appendChild(bl(c));else n=bl(c)}var l=n.cloneNode(!0);return s?sh(bl(l),l.lastChild):sh(l,l),l}}(t,A,"svg")}function Ss(){var t=kM((arguments.length>0&&arguments[0]!==void 0?arguments[0]:"")+"");return sh(t,t),t}function ar(){var t=document.createDocumentFragment(),A=document.createComment(""),e=kM();return t.append(A,e),sh(A,e),t}function he(t,A){t!==null&&t.before(A)}var FVe=["beforeinput","click","change","dblclick","contextmenu","focusin","focusout","input","keydown","keyup","mousedown","mousemove","mouseout","mouseover","mouseup","pointerdown","pointermove","pointerout","pointerover","pointerup","touchend","touchmove","touchstart"],GVe={formnovalidate:"formNoValidate",ismap:"isMap",nomodule:"noModule",playsinline:"playsInline",readonly:"readOnly",defaultvalue:"defaultValue",defaultchecked:"defaultChecked",srcobject:"srcObject",novalidate:"noValidate",allowfullscreen:"allowFullscreen",disablepictureinpicture:"disablePictureInPicture",disableremoteplayback:"disableRemotePlayback"},KVe=["touchstart","touchmove"];function UVe(t){return KVe.includes(t)}function xt(t,A){var e,i=A==null?"":typeof A=="object"?A+"":A;i!==((e=t.__t)!==null&&e!==void 0?e:t.__t=t.nodeValue)&&(t.__t=i,t.nodeValue=i+"")}function TVe(t,A){return function(e,i){var{target:n,anchor:o,props:r={},events:s,context:a,intro:c=!0}=i;(function(){if(V2===void 0){V2=window,w2e=/Firefox/.test(navigator.userAgent);var u=Element.prototype,h=Node.prototype,B=Text.prototype;y2e=j2(h,"firstChild").get,D2e=j2(h,"nextSibling").get,ede(u)&&(u.__click=void 0,u.__className=void 0,u.__attributes=null,u.__style=void 0,u.__e=void 0),ede(B)&&(B.__t=void 0)}})();var l=new Set,d=u=>{for(var h=0;h0&&arguments[0]!==void 0?arguments[0]:{};return new Promise(f=>{B.outro?qf(h,()=>{lg(h),f(void 0)}):(lg(h),f(void 0))})}}(()=>{var u=o??n.appendChild(kM());return Gd(()=>{a&&(St({}),po.c=a),s&&(r.$$events=s),C=e(u,r)||{},a&&kt()}),()=>{for(var h of l){n.removeEventListener(h,Sp);var B=xf.get(h);--B===0?(document.removeEventListener(h,Sp),xf.delete(h)):xf.set(h,B)}var f;VJ.delete(d),u!==o&&((f=u.parentNode)===null||f===void 0||f.removeChild(u))}});return qJ.set(C,I),C}(t,A)}var xf=new Map,qJ=new WeakMap;function ua(t){po===null&&Zp(),tQ&&po.l!==null?P2e(po).m.push(t):PJ(()=>{var A=Be(t);if(typeof A=="function")return A})}function gg(t){po===null&&Zp(),ua(()=>()=>Be(t))}function OVe(){var t=po;return t===null&&Zp(),(A,e,i)=>{var n,o=(n=t.s.$$events)===null||n===void 0?void 0:n[A];if(o){var r=iQ(o)?o.slice():[o],s=function(c,l){var{bubbles:d=!1,cancelable:C=!1}=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return new CustomEvent(c,{detail:l,bubbles:d,cancelable:C})}(A,e,i);for(var a of r)a.call(t.x,s);return!s.defaultPrevented}return!0}}function JVe(t){po===null&&Zp(),po.l===null&&function(){throw new Error("https://svelte.dev/e/lifecycle_legacy_only")}(),P2e(po).b.push(t)}function P2e(t){var A,e=t.l;return(A=e.u)!==null&&A!==void 0?A:e.u={a:[],b:[],m:[]}}function ze(t,A){var[e,i]=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[0,0],n=t,o=null,r=null,s=Ia,a=!1,c=function(d){a=!0,l(!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],d)},l=(d,C)=>{s!==(s=d)&&(s?(o?lM(o):C&&(o=Gd(()=>C(n))),r&&qf(r,()=>{r=null})):(r?lM(r):C&&(r=Gd(()=>C(n,[e+1,i]))),o&&qf(o,()=>{o=null})))};rI(()=>{a=!1,A(c),a||l(null,null)},e>0?Wp:0)}function j2e(t,A,e){var i,n=t,o=Ia,r=nQ()?bVe:wY;rI(()=>{r(o,o=A())&&(i&&qf(i),i=Gd(()=>e(n)))})}function Jr(t,A){return A}function fr(t,A,e,i,n){var o=arguments.length>5&&arguments[5]!==void 0?arguments[5]:null,r=t,s={flags:A,items:new Map,first:null};!(4&A)||(r=t.appendChild(kM()));var a=null,c=!1,l=tA(()=>{var d=e();return iQ(d)?d:d==null?[]:JJ(d)});rI(()=>{var d=g(l),C=d.length;c&&C===0||(c=C===0,function(I,u,h,B,f,b,k){var S,w,_,K,J,O,H=!!(8&f),V=!!(3&f),Z=I.length,ye=u.items,P=u.first,se=P,X=null,ue=[],oe=[];if(H)for(O=0;O0){var JA=4&f&&Z===0?h:null;if(H){for(O=0;O0&&LA.length===0&&Ze!==null;if(Wt){var Qt=Ze.parentNode;Qt.textContent="",Qt.append(Ze),Ge.clear(),UC(We,we[0].prev,we[Fe-1].next)}_2e(LA,()=>{for(var BA=0;BA{if(w!==void 0)for(J of w){var We;(We=J.a)===null||We===void 0||We.apply()}}),wo.first=u.first&&u.first.e,wo.last=X&&X.e}(d,s,r,n,A,i,e),o!==null&&(C===0?a?lM(a):a=Gd(()=>o(r)):a!==null&&qf(a,()=>{a=null})),g(l))})}function YVe(t,A,e,i){1&i&&zJ(t.v,A),2&i?zJ(t.i,e):t.i=e}function HVe(t,A,e,i,n,o,r,s,a,c){var l=1&a?16&a?rh(n):Ce(n,!1,!1):n,d=2&a?rh(r):r,C={i:d,v:l,k:o,a:null,e:null,prev:e,next:i};try{return C.e=Gd(()=>s(t,l,d,c),!1),C.e.prev=e&&e.e,C.e.next=i&&i.e,e===null?A.first=C:(e.next=C,e.e.next=C.e),i!==null&&(i.prev=C,i.e.prev=C.e),C}finally{}}function cde(t,A,e){for(var i=t.next?t.next.e.nodes_start:e,n=A?A.e.nodes_start:e,o=t.e.nodes_start;o!==i;){var r=xM(o);n.before(o),o=r}}function UC(t,A,e){A===null?t.first=e:(A.next=e,A.e.next=e&&e.e),e!==null&&(e.prev=A,e.e.prev=A&&A.e)}function V2e(t,A){var e=arguments.length>2&&arguments[2]!==void 0&&arguments[2],i=arguments.length>3&&arguments[3]!==void 0&&arguments[3],n=t,o="";xA(()=>{var r,s=wo;if(o!==(o=(r=A())!==null&&r!==void 0?r:"")&&(s.nodes_start!==null&&(k2e(s.nodes_start,s.nodes_end),s.nodes_start=s.nodes_end=null),o!=="")){var a=o+"";e?a="".concat(a,""):i&&(a="".concat(a,""));var c=bY(a);if((e||i)&&(c=bl(c)),sh(bl(c),c.lastChild),e||i)for(;bl(c);)n.before(bl(c));else n.before(c)}})}function Er(t,A,e,i,n){var o,r=(o=A.$$slots)===null||o===void 0?void 0:o[e],s=!1;r===!0&&(r=A[e==="default"?"children":e],s=!0),r===void 0?n!==null&&n(t):r(t,s?()=>i:i)}function q2e(t,A,e){var i,n,o=t;rI(()=>{i!==(i=A())&&(n&&(qf(n),n=null),i&&(n=Gd(()=>e(o,i))))},Wp)}function Ka(t,A,e){zs(()=>{var i=Be(()=>A(t,e?.())||{});if(e&&i!=null&&i.update){var n=!1,o={};Xp(()=>{var r=e();F(r),n&&wY(o,r)&&(o=r,i.update(r))}),n=!0}if(i!=null&&i.destroy)return()=>i.destroy()})}function zVe(t,A){var e,i=void 0;rI(()=>{i!==(i=A())&&(e&&(lg(e),e=null),i&&(e=Gd(()=>{zs(()=>i(t))})))})}function W2e(t){var A,e,i="";if(typeof t=="string"||typeof t=="number")i+=t;else if(typeof t=="object")if(Array.isArray(t)){var n=t.length;for(A=0;A1&&arguments[1]!==void 0&&arguments[1]?" !important;":";",e="";for(var i in t){var n=t[i];n!=null&&n!==""&&(e+=" "+i+": "+n+A)}return e}function fJ(t){return t[0]!=="-"||t[1]!=="-"?t.toLowerCase():t}function ci(t,A,e,i,n,o){var r=t.__className;if(r!==e||r===void 0){var s=function(l,d,C){var I=l==null?"":""+l;if(d&&(I=I?I+" "+d:d),C){for(var u in C)if(C[u])I=I?I+" "+u:u;else if(I.length)for(var h=u.length,B=0;(B=I.indexOf(u,B))>=0;){var f=B+h;B!==0&&!lde.includes(I[B-1])||f!==I.length&&!lde.includes(I[f])?B=f:I=(B===0?"":I.substring(0,B))+I.substring(f+1)}}return I===""?null:I}(e,i,o);s==null?t.removeAttribute("class"):A?t.className=s:t.setAttribute("class",s),t.__className=e}else if(o&&n!==o)for(var a in o){var c=!!o[a];n!=null&&c===!!n[a]||t.classList.toggle(a,c)}return o}function QJ(t){var A=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},e=arguments.length>2?arguments[2]:void 0,i=arguments.length>3?arguments[3]:void 0;for(var n in e){var o=e[n];A[n]!==o&&(e[n]==null?t.style.removeProperty(n):t.style.setProperty(n,o,i))}}function cg(t,A,e,i){if(t.__style!==A){var n=function(o,r){if(r){var s,a,c="";if(Array.isArray(r)?(s=r[0],a=r[1]):s=r,o){o=String(o).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var l=!1,d=0,C=!1,I=[];s&&I.push(...Object.keys(s).map(fJ)),a&&I.push(...Object.keys(a).map(fJ));for(var u=0,h=-1,B=o.length,f=0;f2&&arguments[2]!==void 0&&arguments[2];if(t.multiple){if(A==null)return;if(!iQ(A))return void console.warn("https://svelte.dev/e/select_multiple_invalid_value");for(var i of t.options)i.selected=A.includes(dde(i))}else{for(i of t.options)if(MVe(dde(i),A))return void(i.selected=!0);e&&A===void 0||(t.selectedIndex=-1)}}function PVe(t){var A=new MutationObserver(()=>{WJ(t,t.__value)});A.observe(t,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),DY(()=>{A.disconnect()})}function dde(t){return"__value"in t?t.__value:t.value}var Gf=Symbol("class"),bp=Symbol("style"),Z2e=Symbol("is custom element"),X2e=Symbol("is html");function ah(t,A){var e=MY(t);e.value!==(e.value=A??void 0)&&(t.value!==A||A===0&&t.nodeName==="PROGRESS")&&(t.value=A??"")}function Rn(t,A,e,i){var n=MY(t);n[A]!==(n[A]=e)&&(A==="loading"&&(t[vVe]=e),e==null?t.removeAttribute(A):typeof e!="string"&&$2e(t).includes(A)?t[A]=e:t.setAttribute(A,e))}function jVe(t,A,e,i){var n,o=MY(t),r=o[Z2e],s=!o[X2e],a=A||{},c=t.tagName==="OPTION";for(var l in A)l in e||(e[l]=null);e.class?e.class=AI(e.class):(i||e[Gf])&&(e.class=null),e[bp]&&((n=e.style)!==null&&n!==void 0||(e.style=null));var d,C,I,u,h,B,f=$2e(t),b=function(S){var w=e[S];if(c&&S==="value"&&w==null)return t.value=t.__value="",a[S]=w,0;if(S==="class")return d=t.namespaceURI==="http://www.w3.org/1999/xhtml",ci(t,d,w,i,A?.[Gf],e[Gf]),a[S]=w,a[Gf]=e[Gf],0;if(S==="style")return cg(t,w,A?.[bp],e[bp]),a[S]=w,a[bp]=e[bp],0;if(w===(C=a[S])&&(w!==void 0||!t.hasAttribute(S))||(a[S]=w,(I=S[0]+S[1])==="$$"))return 0;if(I==="on"){var _={},K="$$"+S,J=S.slice(2);if(u=function(P){return FVe.includes(P)}(J),function(P){return P.endsWith("capture")&&P!=="gotpointercapture"&&P!=="lostpointercapture"}(J)&&(J=J.slice(0,-7),_.capture=!0),!u&&C){if(w!=null)return 0;t.removeEventListener(J,a[K],_),a[K]=null}if(w!=null)if(u)t["__".concat(J)]=w,e6([J]);else{let P=function(se){a[S].call(this,se)};var ye=P;a[K]=z2e(J,t,P,_)}else u&&(t["__".concat(J)]=void 0)}else if(S==="style")Rn(t,S,w);else if(S==="autofocus")(function(P,se){if(se){var X=document.body;P.autofocus=!0,_M(()=>{document.activeElement===X&&P.focus()})}})(t,!!w);else if(r||S!=="__value"&&(S!=="value"||w==null))if(S==="selected"&&c)(function(P,se){se?P.hasAttribute("selected")||P.setAttribute("selected",""):P.removeAttribute("selected")})(t,w);else if(h=S,s||(h=function(P){var se;return P=P.toLowerCase(),(se=GVe[P])!==null&&se!==void 0?se:P}(h)),B=h==="defaultValue"||h==="defaultChecked",w!=null||r||B)B||f.includes(h)&&(r||typeof w!="string")?t[h]=w:typeof w!="function"&&Rn(t,h,w);else if(o[S]=null,h==="value"||h==="checked"){var O=t,H=A===void 0;if(h==="value"){var V=O.defaultValue;O.removeAttribute(h),O.defaultValue=V,O.value=O.__value=H?V:null}else{var Z=O.defaultChecked;O.removeAttribute(h),O.defaultChecked=Z,O.checked=!!H&&Z}}else t.removeAttribute(S);else t.value=t.__value=w};for(var k in e)b(k);return a}function nM(t,A){var e=arguments.length>3?arguments[3]:void 0,i=arguments.length>4&&arguments[4]!==void 0&&arguments[4],n=arguments.length>5&&arguments[5]!==void 0?arguments[5]:oQ,o=(arguments.length>2&&arguments[2]!==void 0?arguments[2]:[]).map(n),r=void 0,s={},a=t.nodeName==="SELECT",c=!1;if(rI(()=>{var d=A(...o.map(g)),C=jVe(t,r,d,e,i);for(var I of(c&&a&&"value"in d&&WJ(t,d.value),Object.getOwnPropertySymbols(s)))d[I]||lg(s[I]);for(var u of Object.getOwnPropertySymbols(d)){var h=d[u];u.description!=="@attach"||r&&h===r[u]||(s[u]&&lg(s[u]),s[u]=Gd(()=>zVe(t,()=>h))),C[u]=h}r=C}),a){var l=t;zs(()=>{WJ(l,r.value,!0),PVe(l)})}c=!0}function MY(t){var A;return(A=t.__attributes)!==null&&A!==void 0?A:t.__attributes={[Z2e]:t.nodeName.includes("-"),[X2e]:t.namespaceURI==="http://www.w3.org/1999/xhtml"}}var Cde=new Map;function $2e(t){var A,e=Cde.get(t.nodeName);if(e)return e;Cde.set(t.nodeName,e=[]);for(var i=t,n=Element.prototype;n!==i;){for(var o in A=C2e(i))A[o].set&&e.push(o);i=mY(i)}return e}function CM(t,A){var e=arguments.length>2&&arguments[2]!==void 0?arguments[2]:A,i=nQ();LVe(t,"input",n=>{var o=n?t.defaultValue:t.value;if(o=mJ(t)?pJ(o):o,e(o),i&&o!==(o=A())){var r=t.selectionStart,s=t.selectionEnd;t.value=o??"",s!==null&&(t.selectionStart=r,t.selectionEnd=Math.min(s,t.value.length))}}),Be(A)==null&&t.value&&e(mJ(t)?pJ(t.value):t.value),Xp(()=>{var n=A();mJ(t)&&n===pJ(t.value)||(t.type!=="date"||n||t.value)&&n!==t.value&&(t.value=n??"")})}function mJ(t){var A=t.type;return A==="number"||A==="range"}function pJ(t){return t===""?null:+t}function jt(t,A,e){var i=j2(t,A);i&&i.set&&(t[A]=e,DY(()=>{t[A]=null}))}function Ide(t,A){return t===A||t?.[Rd]===A}function Ho(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},A=arguments.length>1?arguments[1]:void 0,e=arguments.length>2?arguments[2]:void 0;return zs(()=>{var i,n;return Xp(()=>{i=n,n=[],Be(()=>{t!==e(...n)&&(A(t,...n),i&&Ide(e(...i),t)&&A(null,...i))})}),()=>{_M(()=>{n&&Ide(e(...n),t)&&A(null,...n)})}}),t}function O2(t){return function(){for(var A=arguments.length,e=new Array(A),i=0;i0&&arguments[0]!==void 0&&arguments[0],A=po,e=A.l.u;if(e){var i,n=()=>F(A.s);if(t){var o=0,r={},s=oQ(()=>{var a=!1,c=A.s;for(var l in c)c[l]!==r[l]&&(r[l]=c[l],a=!0);return a&&o++,o});n=()=>g(s)}e.b.length&&(i=()=>{ude(A,n),cM(e.b)},v2e(),oI(2097160,i,!0)),PJ(()=>{var a=Be(()=>e.m.map(pVe));return()=>{for(var c of a)typeof c=="function"&&c()}}),e.a.length&&PJ(()=>{ude(A,n),cM(e.a)})}}function ude(t,A){if(t.l.s)for(var e of t.l.s)g(e);A()}function LM(t){var A=rh(0);return function(){return arguments.length===1?(x(A,g(A)+1),arguments[0]):(g(A),t())}}function kp(t,A){var e,i=(e=t.$$events)===null||e===void 0?void 0:e[A.type],n=iQ(i)?i.slice():i==null?[]:[i];for(var o of n)o.call(this,A)}var Yb=!1,VVe={get(t,A){if(!t.exclude.includes(A))return g(t.version),A in t.special?t.special[A]():t.props[A]},set(t,A,e){if(!(A in t.special)){var i=wo;try{eI(t.parent_effect),t.special[A]=N({get[A](){return t.props[A]}},A,4)}finally{eI(i)}}return t.special[A](e),nde(t.version),!0},getOwnPropertyDescriptor(t,A){if(!t.exclude.includes(A))return A in t.props?{enumerable:!0,configurable:!0,value:t.props[A]}:void 0},deleteProperty:(t,A)=>(t.exclude.includes(A)||(t.exclude.push(A),nde(t.version)),!0),has:(t,A)=>!t.exclude.includes(A)&&A in t.props,ownKeys:t=>Reflect.ownKeys(t.props).filter(A=>!t.exclude.includes(A))};function Hb(t,A){return new Proxy({props:t,exclude:A,special:{},version:rh(0),parent_effect:wo},VVe)}var qVe={get(t,A){for(var e=t.props.length;e--;){var i=t.props[e];if(vp(i)&&(i=i()),typeof i=="object"&&i!==null&&A in i)return i[A]}},set(t,A,e){for(var i=t.props.length;i--;){var n=t.props[i];vp(n)&&(n=n());var o=j2(n,A);if(o&&o.set)return o.set(e),!0}return!1},getOwnPropertyDescriptor(t,A){for(var e=t.props.length;e--;){var i=t.props[e];if(vp(i)&&(i=i()),typeof i=="object"&&i!==null&&A in i){var n=j2(i,A);return n&&!n.configurable&&(n.configurable=!0),n}}},has(t,A){if(A===Rd||A===u2e)return!1;for(var e of t.props)if(vp(e)&&(e=e()),e!=null&&A in e)return!0;return!1},ownKeys(t){var A=[];for(var e of t.props)if(vp(e)&&(e=e()),e){for(var i in e)A.includes(i)||A.push(i);for(var n of Object.getOwnPropertySymbols(e))A.includes(n)||A.push(n)}return A}};function qC(){for(var t=arguments.length,A=new Array(t),e=0;e(l&&(l=!1,c=a?Be(i):i),c);if(s){var C,I,u=Rd in t||u2e in t;n=(C=(I=j2(t,A))===null||I===void 0?void 0:I.set)!==null&&C!==void 0?C:u&&A in t?w=>t[A]=w:void 0}var h,B=!1;if(s?[o,B]=function(w){var _=Yb;try{return Yb=!1,[w(),Yb]}finally{Yb=_}}(()=>t[A]):o=t[A],o===void 0&&i!==void 0&&(o=d(),n&&(r&&function(){throw new Error("https://svelte.dev/e/props_invalid_value")}(),n(o))),h=r?()=>{var w=t[A];return w===void 0?d():(l=!0,w)}:()=>{var w=t[A];return w!==void 0&&(c=void 0),w===void 0?c:w},r&&!(4&e))return h;if(n){var f=t.$$legacy;return function(w,_){return arguments.length>0?(r&&_&&!f&&!B||n(_?h():w),w):h()}}var b=!1,k=(1&e?oQ:tA)(()=>(b=!1,h()));s&&g(k);var S=wo;return function(w,_){if(arguments.length>0){var K=_?g(k):r&&s?Uf(w):w;return x(k,K),b=!0,c!==void 0&&(c=K),w}return XC&&b||(S.f&pY)!==0?k.v:g(k)}}function Es(t){var A=arguments.length>1&&arguments[1]!==void 0?arguments[1]:function(i){var n=function(o){try{if(typeof window<"u"&&window.localStorage!==void 0)return window.localStorage[o]}catch{}}("debug");return n!=null&&n.endsWith("*")?i.startsWith(n.slice(0,-1)):i===n}(t);if(!A)return WVe;var e=function(i){for(var n=0,o=0;o9466848e5&&isFinite(t)&&Math.floor(t)===t&&!isNaN(new Date(t).valueOf());if(typeof t=="bigint")return ZJ(Number(t));try{var A=t&&t.valueOf();if(A!==t)return ZJ(A)}catch{return!1}return!1}function e1e(t){(zb=zb||window.document.createElement("div")).style.color="",zb.style.color=t;var A=zb.style.color;return A!==""?A.replace(/\s+/g,"").toLowerCase():void 0}var zb=void 0;function eqe(t){return typeof t=="string"&&t.length<99&&!!e1e(t)}function kY(t,A){if(typeof t=="number"||typeof t=="string"||typeof t=="boolean"||t===void 0)return typeof t;if(typeof t=="bigint")return"number";if(t===null)return"null";if(Array.isArray(t))return"array";if(vn(t))return"object";var e=A.stringify(t);return e&&SY(e)?"number":e==="true"||e==="false"?"boolean":e==="null"?"null":"unknown"}var Aqe=/^https?:\/\/\S+$/;function FM(t){return typeof t=="string"&&Aqe.test(t)}function rQ(t,A){if(t==="")return"";var e=t.trim();return e==="null"?null:e==="true"||e!=="false"&&(SY(e)?A.parse(e):t)}var tqe=[];function Bde(t,A){if(t.length!==A.length)return!1;for(var e=0;e1&&arguments[1]!==void 0&&arguments[1],e={};if(!Array.isArray(t))throw new TypeError("Array expected");function i(r,s){(!Array.isArray(r)&&!vn(r)||A&&s.length>0)&&(e[pt(s)]=!0),vn(r)&&Object.keys(r).forEach(a=>{i(r[a],s.concat(a))})}for(var n=Math.min(t.length,1e4),o=0;oA?t.slice(0,A):t}function Ede(t){return SA({},t)}function fde(t){return Object.values(t)}function Qde(t,A,e,i){var n=t.slice(0),o=n.splice(A,e);return n.splice.apply(n,[A+i,0,...o]),n}function iqe(t,A,e){return t.slice(0,A).concat(e).concat(t.slice(A))}function A6(t,A){try{return A.parse(t)}catch{return A.parse(jl(t))}}function t1e(t,A){try{return A6(t,A)}catch{return}}function t6(t,A){t=t.replace(n1e,"");try{return A(t)}catch{}try{return A("{"+t+"}")}catch{}try{return A("["+t+"]")}catch{}throw new Error("Failed to parse partial JSON")}function i1e(t){t=t.replace(n1e,"");try{return jl(t)}catch{}try{var A=jl("["+t+"]");return A.substring(1,A.length-1)}catch{}try{var e=jl("{"+t+"}");return e.substring(1,e.length-1)}catch{}throw new Error("Failed to repair partial JSON")}var n1e=/,\s*$/;function Wf(t,A){var e=pde.exec(A);if(e){var i=Ps(e[2]),n=function(I,u){for(var h=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,B=arguments.length>3&&arguments[3]!==void 0?arguments[3]:I.length,f=0,b=h;b"line ".concat(n+1," column ").concat(o+1))}}var r=sqe.exec(A),s=r?Ps(r[1]):void 0,a=s!==void 0?s-1:void 0,c=aqe.exec(A),l=c?Ps(c[1]):void 0,d=l!==void 0?l-1:void 0,C=a!==void 0&&d!==void 0?function(I,u,h){for(var B=I.indexOf(` +`),f=1;f1&&arguments[1]!==void 0?arguments[1]:void 0,e=arguments.length>2&&arguments[2]!==void 0?arguments[2]:JSON;return Kp(t)?t:{text:e.stringify(t.json,null,A)}}function mde(t){var A=arguments.length>1&&arguments[1]!==void 0?arguments[1]:JSON;return Up(t)?t:{json:A.parse(t.text)}}function $J(t,A,e){return nqe(t,A,e).text}function oqe(t,A){return rqe(t,A)>A}function rqe(t){var A=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1/0;if(Kp(t))return t.text.length;var e=t.json,i=0;return function n(o){if(Array.isArray(o)){if((i+=o.length-1+2)>A)return;for(var r=0;rA)return}else if(vn(o)){var s=Object.keys(o);i+=2+s.length+(s.length-1);for(var a=0;ar1e(c1e(String(t))),unescapeValue:t=>l1e(s1e(t))},gqe={escapeValue:t=>c1e(String(t)),unescapeValue:t=>l1e(t)},dqe={escapeValue:t=>r1e(String(t)),unescapeValue:t=>s1e(t)},Cqe={escapeValue:t=>String(t),unescapeValue:t=>t};function r1e(t){return t.replace(/[^\x20-\x7F]/g,A=>{var e;return A==="\b"||A==="\f"||A===` +`||A==="\r"||A===" "?A:"\\u"+("000"+((e=A.codePointAt(0))===null||e===void 0?void 0:e.toString(16))).slice(-4)})}function s1e(t){return t.replace(/\\u[a-fA-F0-9]{4}/g,A=>{try{var e=JSON.parse('"'+A+'"');return a1e[e]||e}catch{return A}})}var a1e={'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},Iqe={'\\"':'"',"\\\\":"\\","\\/":"/","\\b":"\b","\\f":"\f","\\n":` +`,"\\r":"\r","\\t":" "};function c1e(t){return t.replace(/["\b\f\n\r\t\\]/g,A=>a1e[A]||A)}function l1e(t){return t.replace(/\\["bfnrt\\]/g,A=>Iqe[A]||A)}function Zf(t){return typeof t!="string"?String(t):t.endsWith(` +`)?t+` +`:t}function g1e(t,A){return sQ(t,e=>e.nodeName.toUpperCase()===A.toUpperCase())}function zC(t,A,e){return sQ(t,i=>function(n,o,r){return typeof n.getAttribute=="function"&&n.getAttribute(o)===r}(i,A,e))}function sQ(t,A){return!!_Y(t,A)}function _Y(t,A){for(var e=t;e&&!A(e);)e=e.parentNode;return e}function i6(t){var A,e;return(A=t==null||(e=t.ownerDocument)===null||e===void 0?void 0:e.defaultView)!==null&&A!==void 0?A:void 0}function RY(t){var A=i6(t),e=A?.document.activeElement;return!!e&&sQ(e,i=>i===t)}function d1e(t,A){return _Y(t,e=>e.nodeName===A)}function DJ(t){return zC(t,"data-type","selectable-key")?ro.key:zC(t,"data-type","selectable-value")?ro.value:zC(t,"data-type","insert-selection-area-inside")?ro.inside:zC(t,"data-type","insert-selection-area-after")?ro.after:ro.multi}function oM(t){return encodeURIComponent(pt(t))}function C1e(t){var A,e=_Y(t,n=>!(n==null||!n.hasAttribute)&&n.hasAttribute("data-path")),i=(A=e?.getAttribute("data-path"))!==null&&A!==void 0?A:void 0;return i?Sa(decodeURIComponent(i)):void 0}function uqe(t){var{allElements:A,currentElement:e,direction:i,hasPrio:n=()=>!0,margin:o=10}=t,r=lG(A.filter(function(f){var b=f.getBoundingClientRect();return b.width>0&&b.height>0}),a),s=a(e);function a(f){var b=f.getBoundingClientRect();return{x:b.left+b.width/2,y:b.top+b.height/2,rect:b,element:f}}function c(f,b){var k=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,S=f.x-b.x,w=(f.y-b.y)*k;return Math.sqrt(S*S+w*w)}var l=f=>c(f,s);if(i==="Left"||i==="Right"){var d=i==="Left"?r.filter(f=>{return b=s,f.rect.left+o{return b=s,f.rect.right>b.rect.right+o;var b}),C=d.filter(f=>{return b=f,k=s,Math.abs(b.y-k.y)c(f,s,10));return I?.element}if(i==="Up"||i==="Down"){var u=i==="Up"?r.filter(f=>{return b=s,f.y+o{return b=s,f.y>b.y+o;var b}),h=u.filter(f=>n(f.element)),B=UE(h,l)||UE(u,l);return B?.element}}function NY(){var t,A,e,i;return typeof navigator<"u"&&(t=(A=(e=navigator)===null||e===void 0||(e=e.platform)===null||e===void 0?void 0:e.toUpperCase().includes("MAC"))!==null&&A!==void 0?A:(i=navigator)===null||i===void 0||(i=i.userAgentData)===null||i===void 0||(i=i.platform)===null||i===void 0?void 0:i.toUpperCase().includes("MAC"))!==null&&t!==void 0&&t}function X2(t){var A=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"+",e=[];LY(t,arguments.length>2&&arguments[2]!==void 0?arguments[2]:NY)&&e.push("Ctrl"),t.altKey&&e.push("Alt"),t.shiftKey&&e.push("Shift");var i=t.key.length===1?t.key.toUpperCase():t.key;return i in hqe||e.push(i),e.join(A)}function LY(t){var A=arguments.length>1&&arguments[1]!==void 0?arguments[1]:NY;return t.ctrlKey||t.metaKey&&A()}var hqe={Ctrl:!0,Command:!0,Control:!0,Alt:!0,Option:!0,Shift:!0};function Zt(t,A){A===void 0&&(A={});var e=A.insertAt;if(t&&typeof document<"u"){var i=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",e==="top"&&i.firstChild?i.insertBefore(n,i.firstChild):i.appendChild(n),n.styleSheet?n.styleSheet.cssText=t:n.appendChild(document.createTextNode(t))}}Zt(`.jse-absolute-popup.svelte-1r8q3m8 { + position: relative; + left: 0; + top: 0; + width: 0; + height: 0; + z-index: 1001; +} +.jse-absolute-popup.svelte-1r8q3m8 .jse-hidden-input:where(.svelte-1r8q3m8) { + position: fixed; + left: 0; + top: 0; + width: 0; + height: 0; + padding: 0; + margin: 0; + border: none; + outline: none; + overflow: hidden; +} +.jse-absolute-popup.svelte-1r8q3m8 .jse-absolute-popup-content:where(.svelte-1r8q3m8) { + position: absolute; +}`);var Bqe=_e('
    '),Eqe=_e('
    ');function fqe(t,A){St(A,!1);var e=N(A,"popup",8),i=N(A,"closeAbsolutePopup",8),n=Ce(),o=Ce();function r(d){e().options&&e().options.closeOnOuterClick&&!sQ(d.target,C=>C===g(n))&&i()(e().id)}function s(d){X2(d)==="Escape"&&(d.preventDefault(),d.stopPropagation(),i()(e().id))}ua(function(){g(o)&&g(o).focus()}),li();var a=Eqe();QA("mousedown",V2,function(d){r(d)},!0),QA("keydown",V2,s,!0),QA("wheel",V2,function(d){r(d)},!0);var c=ge(a),l=d=>{var C=Bqe(),I=ge(C);Ho(I,u=>x(o,u),()=>g(o)),q2e(De(I,2),()=>e().component,(u,h)=>{h(u,qC(()=>e().props))}),xA(u=>cg(C,u),[()=>(g(n),F(e()),Be(()=>function(u,h){var B=u.getBoundingClientRect(),{left:f,top:b,positionAbove:k,positionLeft:S}=function(){if(h.anchor){var{anchor:w,width:_=0,height:K=0,offsetTop:J=0,offsetLeft:O=0,position:H}=h,{left:V,top:Z,bottom:ye,right:P}=w.getBoundingClientRect(),se=H==="top"||Z+K>window.innerHeight&&Z>K,X=H==="left"||V+_>window.innerWidth&&V>_;return{left:X?P-O:V+O,top:se?Z-J:ye+J,positionAbove:se,positionLeft:X}}if(typeof h.left=="number"&&typeof h.top=="number"){var{left:ue,top:oe,width:le=0,height:me=0}=h;return{left:ue,top:oe,positionAbove:oe+me>window.innerHeight&&oe>me,positionLeft:ue+le>window.innerWidth&&ue>le}}throw new Error('Invalid config: pass either "left" and "top", or pass "anchor"')}();return(k?"bottom: ".concat(B.top-b,"px;"):"top: ".concat(b-B.top,"px;"))+(S?"right: ".concat(B.left-f,"px;"):"left: ".concat(f-B.left,"px;"))}(g(n),e().options)))],tA),he(d,C)};ze(c,d=>{g(n)&&d(l)}),Ho(a,d=>x(n,d),()=>g(n)),QA("mousedown",a,function(d){d.stopPropagation()}),QA("keydown",a,s),he(t,a),kt()}var Qqe=_e(" ",1);function eY(t,A){St(A,!1);var e,i,n=Es("jsoneditor:AbsolutePopup"),o=Ce([],!0);function r(c){var l=g(o).findIndex(C=>C.id===c);if(l!==-1){var d=g(o)[l];d.options.onClose&&d.options.onClose(),x(o,g(o).filter(C=>C.id!==c))}}e="absolute-popup",i={openAbsolutePopup:function(c,l,d){n("open...",l,d);var C={id:Tf(),component:c,props:l||{},options:d||{}};return x(o,[...g(o),C]),C.id},closeAbsolutePopup:r},f2e().set(e,i),Se(()=>g(o),()=>{n("popups",g(o))}),Nn(),li(!0);var s=Qqe(),a=Ut(s);fr(a,1,()=>g(o),Jr,(c,l)=>{fqe(c,{get popup(){return g(l)},closeAbsolutePopup:r})}),Er(De(a,2),A,"default",{},null),he(t,s),kt()}function n6(t,A){for(var e=new Set(A),i=t.replace(/ \(copy( \d+)?\)$/,""),n=t,o=1;e.has(n);){var r="copy"+(o>1?" "+o:"");n="".concat(i," (").concat(r,")"),o++}return n}function Y2(t,A){var e=A-3;return t.length>A?t.substring(0,e)+"...":t}function mqe(t){if(t==="")return"";var A=t.toLowerCase();if(A==="null")return null;if(A==="true")return!0;if(A==="false")return!1;if(A!=="undefined"){var e=Number(t),i=parseFloat(t);return isNaN(e)||isNaN(i)?t:e}}var pqe={id:"jsonquery",name:"JSONQuery",description:` +

    + Enter a JSON Query function to filter, sort, or transform the data. + You can use functions like get, filter, + sort, pick, groupBy, uniq, etcetera. + Example query: filter(.age >= 18) +

    +`,createQuery:function(t,A){var{filter:e,sort:i,projection:n}=A,o=[];e&&e.path&&e.relation&&e.value&&o.push(["filter",[(r=e.relation,fG("1 ".concat(r," 1"))[0]),Pb(e.path),mqe(e.value)]]);var r;return i&&i.path&&i.direction&&o.push(["sort",Pb(i.path),i.direction==="desc"?"desc":"asc"]),n&&n.paths&&(n.paths.length>1?o.push(["pick",...n.paths.map(Pb)]):o.push(["map",Pb(n.paths[0])])),ioe(["pipe",...o])},executeQuery:function(t,A,e){var i=o1e(e,JSON)?t:function(n){var o=e.stringify(n);return o!==void 0?JSON.parse(o):void 0}(t);return A.trim()!==""?noe(i,A):i}};function Pb(t){return["get",...t]}var wqe=sI("");function yqe(t,A){St(A,!1);var e=870711,i=Ce(""),n=N(A,"data",8);function o(s){if(!s||!s.raw)return"";var a=s.raw,c={};return a=a.replace(/\s(?:xml:)?id=["']?([^"')\s]+)/g,(l,d)=>{var C="fa-".concat((e+=1).toString(16));return c[d]=C,' id="'.concat(C,'"')}),a=a.replace(/#(?:([^'")\s]+)|xpointer\(id\((['"]?)([^')]+)\2\)\))/g,(l,d,C,I)=>{var u=d||I;return u&&c[u]?"#".concat(c[u]):l}),a}Se(()=>F(n()),()=>{x(i,o(n()))}),Nn();var r=wqe();V2e(ge(r),()=>g(i),!0),he(t,r),kt()}Zt(` + .fa-icon.svelte-1mc5hvj { + display: inline-block; + fill: currentColor; + } + .fa-flip-horizontal.svelte-1mc5hvj { + transform: scale(-1, 1); + } + .fa-flip-vertical.svelte-1mc5hvj { + transform: scale(1, -1); + } + .fa-spin.svelte-1mc5hvj { + animation: svelte-1mc5hvj-fa-spin 1s 0s infinite linear; + } + .fa-inverse.svelte-1mc5hvj { + color: #fff; + } + .fa-pulse.svelte-1mc5hvj { + animation: svelte-1mc5hvj-fa-spin 1s infinite steps(8); + } + @keyframes svelte-1mc5hvj-fa-spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } + } +`);var Dqe=sI(""),vqe=sI(""),bqe=sI(""),Mqe=sI("",1);function nn(t,A){var e=Hb(A,["children","$$slots","$$events","$$legacy"]),i=Hb(e,["class","data","scale","spin","inverse","pulse","flip","label","style"]);St(A,!1);var n=N(A,"class",8,""),o=N(A,"data",8),r=Ce(),s=N(A,"scale",8,1),a=N(A,"spin",8,!1),c=N(A,"inverse",8,!1),l=N(A,"pulse",8,!1),d=N(A,"flip",8,void 0),C=N(A,"label",8,""),I=N(A,"style",8,""),u=Ce(10),h=Ce(10),B=Ce(),f=Ce();function b(){var S=1;return s()!==void 0&&(S=Number(s())),isNaN(S)||S<=0?(console.warn('Invalid prop: prop "scale" should be a number over 0.'),1):1*S}function k(){return g(r)?Math.max(g(r).width,g(r).height)/16:1}Se(()=>(F(o()),F(I()),F(s())),()=>{x(r,function(S){var w;if(S){if(!("definition"in S)){if("iconName"in S&&"icon"in S){S.iconName;var[_,K,,,J]=S.icon;w={width:_,height:K,paths:(Array.isArray(J)?J:[J]).map(O=>({d:O}))}}else w=S[Object.keys(S)[0]];return w}console.error("`import faIconName from '@fortawesome/package-name/faIconName` not supported - Please use `import { faIconName } from '@fortawesome/package-name/faIconName'` instead")}}(o())),I(),s(),x(u,g(r)?g(r).width/k()*b():0),x(h,g(r)?g(r).height/k()*b():0),x(B,function(){var S="";I()!==null&&(S+=I());var w=b();return w===1?S.length===0?"":S:(S===""||S.endsWith(";")||(S+="; "),"".concat(S,"font-size: ").concat(w,"em"))}()),x(f,g(r)?"0 0 ".concat(g(r).width," ").concat(g(r).height):"0 0 ".concat(g(u)," ").concat(g(h)))}),Nn(),li(),function(S,w){var _=Hb(w,["children","$$slots","$$events","$$legacy"]),K=Hb(_,["class","width","height","box","spin","inverse","pulse","flip","style","label"]),J=N(w,"class",8,""),O=N(w,"width",8),H=N(w,"height",8),V=N(w,"box",8,"0 0 0 0"),Z=N(w,"spin",8,!1),ye=N(w,"inverse",8,!1),P=N(w,"pulse",8,!1),se=N(w,"flip",8,"none"),X=N(w,"style",8,""),ue=N(w,"label",8,""),oe=Dqe();nM(oe,le=>{var me;return SA(SA({version:"1.1",class:"fa-icon ".concat((me=J())!==null&&me!==void 0?me:""),width:O(),height:H(),"aria-label":ue(),role:ue()?"img":"presentation",viewBox:V(),style:X()},K),{},{[Gf]:le})},[()=>({"fa-spin":Z(),"fa-pulse":P(),"fa-inverse":ye(),"fa-flip-horizontal":se()==="horizontal","fa-flip-vertical":se()==="vertical"})],"svelte-1mc5hvj"),Er(ge(oe),w,"default",{},null),he(S,oe)}(t,qC({get label(){return C()},get width(){return g(u)},get height(){return g(h)},get box(){return g(f)},get style(){return g(B)},get spin(){return a()},get flip(){return d()},get inverse(){return c()},get pulse(){return l()},get class(){return n()}},()=>i,{children:(S,w)=>{var _=ar();Er(Ut(_),A,"default",{},K=>{var J=Mqe(),O=Ut(J);fr(O,1,()=>(g(r),Be(()=>{var ye;return((ye=g(r))===null||ye===void 0?void 0:ye.paths)||[]})),Jr,(ye,P)=>{var se=vqe();nM(se,()=>SA({},g(P))),he(ye,se)});var H=De(O);fr(H,1,()=>(g(r),Be(()=>{var ye;return((ye=g(r))===null||ye===void 0?void 0:ye.polygons)||[]})),Jr,(ye,P)=>{var se=bqe();nM(se,()=>SA({},g(P))),he(ye,se)});var V=De(H),Z=ye=>{yqe(ye,{get data(){return g(r)},set data(P){x(r,P)},$$legacy:!0})};ze(V,ye=>{g(r),Be(()=>{var P;return(P=g(r))===null||P===void 0?void 0:P.raw})&&ye(Z)}),he(K,J)}),he(S,_)},$$slots:{default:!0}})),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-boolean-toggle.svelte-1ryp01u { + padding: 0; + margin: 1px 0 0; + vertical-align: top; + display: inline-flex; + color: var(--jse-value-color-boolean, #ff8c00); +} + +.jse-boolean-toggle.svelte-1ryp01u:not(.jse-readonly) { + cursor: pointer; +}`);var Sqe=_e('
    ');function kqe(t,A){St(A,!1);var e=N(A,"path",9),i=N(A,"value",9),n=N(A,"readOnly",9),o=N(A,"onPatch",9),r=N(A,"focus",9);li(!0);var s,a=Sqe(),c=ge(a),l=tA(()=>i()===!0?QG:mG);nn(c,{get data(){return g(l)}}),xA(d=>{Rn(a,"aria-checked",i()===!0),s=ci(a,1,"jse-boolean-toggle svelte-1ryp01u",null,s,d),Rn(a,"title",n()?"Boolean value ".concat(i()):"Click to toggle this boolean value")},[()=>({"jse-readonly":n()})],tA),QA("mousedown",a,function(d){d.stopPropagation(),n()||(o()([{op:"replace",path:pt(e()),value:!i()}]),r()())}),he(t,a),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-color-picker-popup.svelte-s1wu8v .picker_wrapper.popup, +.jse-color-picker-popup.svelte-s1wu8v .picker_wrapper.popup .picker_arrow::before, +.jse-color-picker-popup.svelte-s1wu8v .picker_wrapper.popup .picker_arrow::after { + background: var(--jse-color-picker-background, var(--jse-panel-background, #ebebeb)); + line-height: normal; +} +.jse-color-picker-popup.svelte-s1wu8v .picker_slider, +.jse-color-picker-popup.svelte-s1wu8v .picker_sl, +.jse-color-picker-popup.svelte-s1wu8v .picker_editor input, +.jse-color-picker-popup.svelte-s1wu8v .picker_sample, +.jse-color-picker-popup.svelte-s1wu8v .picker_done button { + box-shadow: var(--jse-color-picker-border-box-shadow, #cbcbcb 0 0 0 1px); +} +.jse-color-picker-popup.svelte-s1wu8v .picker_editor input { + background: var(--jse-background-color, #fff); + color: var(--jse-text-color, #4d4d4d); +} +.jse-color-picker-popup.svelte-s1wu8v .picker_done button { + background: var(--jse-button-background, #e0e0e0); + color: var(--jse-button-color, var(--jse-text-color, #4d4d4d)); +} +.jse-color-picker-popup.svelte-s1wu8v .picker_done button:hover { + background: var(--jse-button-background-highlight, #e7e7e7); +}`);var xqe=_e('
    ');function _qe(t,A){St(A,!1);var e=N(A,"color",8),i=N(A,"onChange",8),n=N(A,"showOnTop",8),o=Ce(),r=()=>{};ua(Vt(function*(){var a,c=new((a=yield import("./chunk-XMJNYD32.js"))===null||a===void 0?void 0:a.default)({parent:g(o),color:e(),popup:n()?"top":"bottom",onDone(l){var d=l.rgba[3]===1?l.hex.substring(0,7):l.hex;i()(d)}});c.show(),r=()=>{c.destroy()}})),gg(()=>{r()}),li();var s=xqe();Ho(s,a=>x(o,a),()=>g(o)),he(t,s),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-color-picker-button.svelte-xeg9n6 { + font-size: var(--jse-font-size-mono, 14px); + width: var(--jse-color-picker-button-size, 1em); + height: var(--jse-color-picker-button-size, 1em); + box-sizing: border-box; + padding: 0; + margin: 2px 0 0 calc(0.5 * var(--jse-padding, 10px)); + display: inline-flex; + vertical-align: top; + border: 1px solid var(--jse-text-color, #4d4d4d); + border-radius: 2px; + background: inherit; + outline: none; +} + +.jse-color-picker-button.svelte-xeg9n6:not(.jse-readonly) { + cursor: pointer; +}`);var Rqe=_e('');function Nqe(t,A){St(A,!1);var e=Ce(void 0,!0),i=Ce(void 0,!0),{openAbsolutePopup:n}=nI("absolute-popup"),o=N(A,"path",9),r=N(A,"value",9),s=N(A,"readOnly",9),a=N(A,"onPatch",9),c=N(A,"focus",9);function l(u){a()([{op:"replace",path:pt(o()),value:u}]),d()}function d(){c()()}Se(()=>F(r()),()=>{x(e,e1e(r()))}),Se(()=>(F(s()),F(r())),()=>{x(i,s()?"Color ".concat(r()):"Click to open a color picker")}),Nn(),li(!0);var C,I=Rqe();xA(u=>{var h;C=ci(I,1,"jse-color-picker-button svelte-xeg9n6",null,C,u),cg(I,"background: ".concat((h=g(e))!==null&&h!==void 0?h:"")),Rn(I,"title",g(i)),Rn(I,"aria-label",g(i))},[()=>({"jse-readonly":s()})],tA),QA("click",I,function(u){var h,B;if(!s()){var f=u.target,b=f.getBoundingClientRect().top,k=((h=(B=i6(f))===null||B===void 0?void 0:B.innerHeight)!==null&&h!==void 0?h:0)-b<300&&b>300,S={color:r(),onChange:l,showOnTop:k};n(_qe,S,{anchor:f,closeOnOuterClick:!0,onClose:d,offsetTop:18,offsetLeft:-8,height:300})}}),he(t,I),kt()}var vJ=1e3,Tp=100,jb=100,uM=2e4,Hf=[{start:0,end:Tp}],Lqe=1048576,Fqe=1048576,bJ=10485760,MJ="Insert or paste contents, enter [ insert a new array, enter { to insert a new object, or start typing to insert a new value",FY="Open context menu (Click here, right click on the selection, or use the context menu button or Ctrl+Q)",Xu="hover-insert-inside",Vb="hover-insert-after",yde="hover-collection",SJ="valid",Dde="repairable",H2=336,z2=260,xp=100,vde={[ag.asc]:"ascending",[ag.desc]:"descending"};function I1e(t){for(var A=IG(t,s=>s.start),e=[A[0]],i=0;i0&&arguments[0]!==void 0?arguments[0]:{expanded:!1};return{type:"array",expanded:t,visibleSections:Hf,items:[]}}function UY(){var{expanded:t}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{expanded:!1};return{type:"object",expanded:t,properties:{}}}var TY={createObjectDocumentState:UY,createArrayDocumentState:KY,createValueDocumentState:function(){return{type:"value"}}};function h1e(t,A,e,i){var{createObjectDocumentState:n,createArrayDocumentState:o,createValueDocumentState:r}=i;return function s(a,c,l){if(Array.isArray(a)){var d=hs(c)?c:o();if(l.length===0)return d;var C=Ps(l[0]),I=s(a[C],d.items[C],l.slice(1));return ra(d,["items",l[0]],I)}if(vn(a)){var u=Tc(c)?c:n();if(l.length===0)return u;var h=l[0],B=s(a[h],u.properties[h],l.slice(1));return ra(u,["properties",h],B)}return GY(c)?c:r()}(t,A,e)}function Dl(t,A){return Op(t,A,arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],(e,i)=>{if(e!==void 0&&i!==void 0)return Array.isArray(e)?hs(i)?i:KY({expanded:!!ch(i)&&i.expanded}):vn(e)?Tc(i)?i:UY({expanded:!!ch(i)&&i.expanded}):GY(i)?i:void 0},()=>!0)}function Op(t,A,e,i,n){var o=i(t,A,e);if(Array.isArray(t)&&hs(o)&&n(o)){var r=[];return OY(t,o.visibleSections,a=>{var c=e.concat(String(a)),l=Op(t[a],o.items[a],c,i,n);l!==void 0&&(r[a]=l)}),Bde(r,o.items)?o:SA(SA({},o),{},{items:r})}if(vn(t)&&Tc(o)&&n(o)){var s={};return Object.keys(t).forEach(a=>{var c=e.concat(a),l=Op(t[a],o.properties[a],c,i,n);l!==void 0&&(s[a]=l)}),Bde(Object.values(s),Object.values(o.properties))?o:SA(SA({},o),{},{properties:s})}return o}function OY(t,A,e){A.forEach(i=>{var{start:n,end:o}=i;A1e(n,Math.min(t.length,o),e)})}function Jp(t,A){for(var e=t,i=[],n=0;n{var d=ch(l)&&!l.expanded?SA(SA({},l),{},{expanded:!0}):l;return hs(d)?function(C,I){if(function(B,f){return B.some(b=>f>=b.start&&ffunction(c,l,d,C){return Op(c,l,d,(I,u,h)=>Array.isArray(I)&&C(h)?hs(u)?u.expanded?u:SA(SA({},u),{},{expanded:!0}):KY({expanded:!0}):vn(I)&&C(h)?Tc(u)?u.expanded?u:SA(SA({},u),{},{expanded:!0}):UY({expanded:!0}):u,I=>ch(I)&&I.expanded)}(s,a,[],i))}function Rde(t,A,e,i){return Xf(t,A,e,(n,o)=>i?function(r,s,a){return Op(r,s,a,(c,l)=>Nde(l),()=>!0)}(n,o,e):Nde(o))}function Nde(t){return hs(t)&&t.expanded?SA(SA({},t),{},{expanded:!1,visibleSections:Hf}):Tc(t)&&t.expanded?SA(SA({},t),{},{expanded:!1}):t}function B1e(t,A,e){var i={json:t,documentState:A},n=e.reduce((o,r)=>({json:Mc(o.json,[r]),documentState:Oqe(o.json,o.documentState,r)}),i);return{json:n.json,documentState:Dl(n.json,n.documentState)}}function Oqe(t,A,e){if(TF(e))return Lde(t,A,e,void 0);if(OF(e))return Fde(t,A,e);if(bD(e)){var i=Sc(t,e.path),n=_d(t,A,i);return n?GM(t,A,i,{type:"value",enforceString:n}):A}return MD(e)||X1(e)?function(o,r,s){if(X1(s)&&s.from===s.path)return r;var a=r,c=Sc(o,s.from),l=Sd(o,a,c);return X1(s)&&(a=Fde(o,a,{path:s.from})),a=Lde(o,a,{path:s.path},l),a}(t,A,e):A}function Sd(t,A,e){try{return WA(A,Jp(t,e))}catch{return}}function JY(t,A,e,i,n){var o=h1e(t,A,e,n);return Tm(o,Jp(t,e),r=>{var s=WA(t,e);return i(s,r)})}function GM(t,A,e,i){return function(n,o,r,s,a){var c=h1e(n,o,r,a);return ra(c,Jp(n,r),s)}(t,A,e,i,TY)}function Xf(t,A,e,i){return JY(t,A,e,i,TY)}function Lde(t,A,e,i){var n=Sc(t,e.path),o=A;return o=Xf(t,o,Hi(n),(r,s)=>{if(!hs(s))return s;var a=Ps(vi(n)),{items:c,visibleSections:l}=s;return SA(SA({},s),{},{items:a{if(!hs(s))return s;var a=Ps(vi(i)),{items:c,visibleSections:l}=s;return SA(SA({},s),{},{items:c.slice(0,a).concat(c.slice(a+1)),visibleSections:E1e(l,a,-1)})}):function(r,s,a){var c=Jp(r,a);return Us(s,c)?Eu(s,Jp(r,a)):s}(t,A,i)}function E1e(t,A,e){return function(i){for(var n=i.slice(0),o=1;o({start:i.start>A?i.start+e:i.start,end:i.end>A?i.end+e:i.end})))}function _d(t,A,e){var i,n=WA(t,e),o=Sd(t,A,e),r=GY(o)?o.enforceString:void 0;return typeof r=="boolean"?r:typeof(i=n)=="string"&&typeof rQ(i,JSON)!="string"}function o6(t,A){var e=arguments.length>2&&arguments[2]!==void 0&&arguments[2],i=t.indexOf(A);return i!==-1?e?t.slice(i):t.slice(i+1):[]}function YY(t,A){var e=[];return function i(n,o,r){e.push(r),Wo(n)&&hs(o)&&o.expanded&&OY(n,o.visibleSections,s=>{i(n[s],o.items[s],r.concat(String(s)))}),nr(n)&&Tc(o)&&o.expanded&&Object.keys(n).forEach(s=>{i(n[s],o.properties[s],r.concat(s))})}(t,A,[]),e}function f1e(t,A){var e=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],i=[];return function n(o,r){i.push({path:r,type:Xg.value});var s=Sd(t,A,r);if(o&&ch(s)&&s.expanded){if(e&&i.push({path:r,type:Xg.inside}),Wo(o)){var a=hs(s)?s.visibleSections:Hf;OY(o,a,c=>{var l=r.concat(String(c));n(o[c],l),e&&i.push({path:l,type:Xg.after})})}nr(o)&&Object.keys(o).forEach(c=>{var l=r.concat(c);i.push({path:l,type:Xg.key}),n(o[c],l),e&&i.push({path:l,type:Xg.after})})}}(t,[]),i}function kJ(t,A,e){var i=YY(t,A),n=i.map(pt).indexOf(pt(e));if(n!==-1&&n3&&arguments[3]!==void 0?arguments[3]:10240;return Zg(t,A,e,oqe({json:WA(t,e)},i)?_p:HY)}function xJ(t,A,e){var i=Sd(t,A,e);return ch(i)&&i.expanded?A:lh(t,A,e)}function _p(t){return t.length===0||t.length===1&&t[0]==="0"}function nY(t){return t.length===0}function HY(){return!0}function rM(){return!1}function Jc(t){return t&&t.type===ro.after||!1}function cs(t){return t&&t.type===ro.inside||!1}function Bs(t){return t&&t.type===ro.key||!1}function fn(t){return t&&t.type===ro.value||!1}function Io(t){return t&&t.type===ro.multi||!1}function KM(t){return Io(t)&&wi(t.focusPath,t.anchorPath)}function Yp(t){return Io(t)||Jc(t)||cs(t)||Bs(t)||fn(t)}function _J(t){return t&&t.type===ro.text||!1}function tI(t,A){var e=[];return function(i,n,o){if(n){var r=nh(n),s=It(n);if(wi(r,s))return o(r);if(i!==void 0){var a=m1e(r,s);if(r.length===a.length||s.length===a.length)return o(a);var c=Fa(r,s),l=P2(i,c),d=ZC(i,c),C=Z2(i,c,l),I=Z2(i,c,d);if(!(C===-1||I===-1)){var u=WA(i,a);if(nr(u)){for(var h=Object.keys(u),B=C;B<=I;B++){var f=o(a.concat(h[B]));if(f!==void 0)return f}return}if(Wo(u)){for(var b=C;b<=I;b++){var k=o(a.concat(String(b)));if(k!==void 0)return k}return}throw new Error("Failed to create selection")}}}}(t,A,i=>{e.push(i)}),e}function Q1e(t){return cs(t)?t.path:Hi(It(t))}function P2(t,A){if(!Io(A))return A.path;var e=Z2(t,A,A.anchorPath);return Z2(t,A,A.focusPath)e?A.focusPath:A.anchorPath}function Gde(t,A,e){var i=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(e){var n=i?It(e):P2(t,e),o=function(a,c,l){var d=YY(a,c),C=d.map(pt),I=pt(l),u=C.indexOf(I);if(u!==-1&&u>0)return d[u-1]}(t,A,n);if(i)return cs(e)||Jc(e)?o!==void 0?Fa(n,n):void 0:o!==void 0?Fa(nh(e),o):void 0;if(Jc(e)||cs(e))return zi(n);if(Bs(e)){if(o===void 0||o.length===0)return;var r=Hi(o),s=WA(t,r);return Array.isArray(s)||An(o)?zi(o):$2(o)}return fn(e),o!==void 0?zi(o):void 0}}function Kde(t,A,e,i){if(!e)return{caret:void 0,previous:void 0,next:void 0};var n=f1e(t,A,i),o=n.findIndex(r=>wi(r.path,It(e))&&String(r.type)===String(e.type));return{caret:o!==-1?n[o]:void 0,previous:o!==-1&&o>0?n[o-1]:void 0,next:o!==-1&&oe[i].length;)i++;var n=e[i];return n===void 0||n.length===0||Array.isArray(WA(t,Hi(n)))?zi(n):$2(n)}function $f(t,A){if(A.length===1){var e=Wl(A);if(e.op==="replace")return zi(Sc(t,e.path))}if(!An(A)&&A.every(r=>r.op==="move")){var i=Wl(A),n=A.slice(1);if((MD(i)||X1(i))&&i.from!==i.path&&n.every(r=>(MD(r)||X1(r))&&r.from===r.path))return $2(Sc(t,i.path))}var o=A.filter(r=>r.op!=="test"&&r.op!=="remove"&&(r.op!=="move"||r.from!==r.path)&&typeof r.path=="string").map(r=>Sc(t,r.path));if(!An(o))return{type:ro.multi,anchorPath:Wl(o),focusPath:vi(o)}}function m1e(t,A){for(var e=0;ee.length&&A.length>e.length;return{type:ro.multi,anchorPath:i?e.concat(t[e.length]):e,focusPath:i?e.concat(A[e.length]):e}}function p1e(t,A,e,i){if(Bs(A))return String(vi(A.path));if(fn(A)){var n=WA(t,A.path);return typeof n=="string"?n:i.stringify(n,null,e)}if(Io(A)){if(An(A.focusPath))return i.stringify(t,null,e);var o=Q1e(A),r=WA(t,o);if(Array.isArray(r)){if(KM(A)){var s=WA(t,A.focusPath);return i.stringify(s,null,e)}return tI(t,A).map(a=>{var c=WA(t,a);return"".concat(i.stringify(c,null,e),",")}).join(` +`)}return tI(t,A).map(a=>{var c=vi(a),l=WA(t,a);return"".concat(i.stringify(c),": ").concat(i.stringify(l,null,e),",")}).join(` +`)}}function us(t){return(Bs(t)||fn(t))&&t.edit===!0}function Of(t){return Bs(t)||fn(t)||Io(t)}function qb(t){return Bs(t)||fn(t)||KM(t)}function oY(t){switch(t.type){case Xg.key:return $2(t.path);case Xg.value:return zi(t.path);case Xg.after:return W2(t.path);case Xg.inside:return e1(t.path)}}function Tde(t,A){switch(t){case ro.key:return $2(A);case ro.value:return zi(A);case ro.after:return W2(A);case ro.inside:return e1(A);case ro.multi:case ro.text:return Fa(A,A)}}function Wb(t,A,e){if(A)return Hp(t,A,e)||Nd(Io(A)?Hi(A.focusPath):A.path,e)?A:void 0}function Hp(t,A,e){if(t===void 0||!A)return!1;if(Bs(A)||cs(A)||Jc(A))return wi(A.path,e);if(fn(A))return Nd(e,A.path);if(Io(A)){var i=P2(t,A),n=ZC(t,A),o=Hi(A.focusPath);if(!Nd(e,o)||e.length<=o.length)return!1;var r=Z2(t,A,i),s=Z2(t,A,n),a=Z2(t,A,e);return a!==-1&&a>=r&&a<=s}return!1}function Z2(t,A,e){var i=Hi(A.focusPath);if(!Nd(e,i)||e.length<=i.length)return-1;var n=e[i.length],o=WA(t,i);if(nr(o))return Object.keys(o).indexOf(n);if(Wo(o)){var r=Ps(n);if(r');function y1e(t,A){St(A,!1);var e=Es("jsoneditor:EditableDiv"),i=N(A,"value",9),n=N(A,"initialValue",9),o=N(A,"shortText",9,!1),r=N(A,"label",9),s=N(A,"onChange",9),a=N(A,"onCancel",9),c=N(A,"onFind",9),l=N(A,"onPaste",9,xr),d=N(A,"onValueClass",9,()=>""),C=Ce(void 0,!0),I=Ce(void 0,!0),u=!1;function h(){return g(C)?function(b){return b.replace(/\n$/,"")}(g(C).innerText):""}function B(b){g(C)&&vl(C,g(C).innerText=Zf(b))}ua(()=>{e("onMount",{value:i(),initialValue:n()}),B(n()!==void 0?n():i()),g(C)&&function(b){if(b.firstChild!=null){var k=document.createRange(),S=window.getSelection();k.setStart(b,1),k.collapse(!0),S?.removeAllRanges(),S?.addRange(k)}else b.focus()}(g(C))}),gg(()=>{var b=h();e("onDestroy",{closed:u,value:i(),newValue:b}),u||b===i()||s()(b,WC.no)}),Se(()=>(F(d()),F(i())),()=>{x(I,d()(i()))}),Nn(),li(!0);var f=Jqe();Ho(f,b=>x(C,b),()=>g(C)),xA(b=>{Rn(f,"aria-label",r()),ci(f,1,b,"svelte-f9kmxj")},[()=>AI((F(o0),g(I),F(o()),Be(()=>o0("jse-editable-div",g(I),{"jse-short-text":o()}))))],tA),QA("input",f,function(){var b=h();b===""&&B(""),x(I,d()(b))}),QA("keydown",f,function(b){b.stopPropagation();var k=X2(b);if(k==="Escape"&&(b.preventDefault(),u=!0,a()()),k==="Enter"||k==="Tab"){b.preventDefault(),u=!0;var S=h();s()(S,WC.nextInside)}k==="Ctrl+F"&&(b.preventDefault(),c()(!1)),k==="Ctrl+H"&&(b.preventDefault(),c()(!0))}),QA("paste",f,function(b){if(b.stopPropagation(),l()&&b.clipboardData){var k=b.clipboardData.getData("text/plain");l()(k)}}),QA("blur",f,function(){var b=document.hasFocus(),k=h();e("handleBlur",{hasFocus:b,closed:u,value:i(),newValue:k}),document.hasFocus()&&!u&&(u=!0,k!==i()&&s()(k,WC.self))}),he(t,f),kt()}function Yqe(t,A){St(A,!1);var e=N(A,"path",9),i=N(A,"value",9),n=N(A,"selection",9),o=N(A,"mode",9),r=N(A,"parser",9),s=N(A,"normalization",9),a=N(A,"enforceString",9),c=N(A,"onPatch",9),l=N(A,"onPasteJson",9),d=N(A,"onSelect",9),C=N(A,"onFind",9),I=N(A,"focus",9),u=N(A,"findNextInside",9);function h(k){return a()?k:rQ(k,r())}function B(){d()(zi(e())),I()()}li(!0);var f=tA(()=>(F(s()),F(i()),Be(()=>s().escapeValue(i())))),b=tA(()=>(F(us),F(n()),Be(()=>us(n())?n().initialValue:void 0)));y1e(t,{get value(){return g(f)},get initialValue(){return g(b)},label:"Edit value",onChange:function(k,S){c()([{op:"replace",path:pt(e()),value:h(s().unescapeValue(k))}],(w,_,K)=>{if(!K||wi(e(),It(K)))return{state:_,selection:S===WC.nextInside?u()(e()):zi(e())}}),I()()},onCancel:B,onPaste:function(k){try{var S=r().parse(k);sr(S)&&l()({path:e(),contents:S,onPasteAsJson:()=>{B();var w=[{op:"replace",path:pt(e()),value:S}];c()(w,(_,K)=>({state:lh(_,K,e())}))}})}catch{}},get onFind(){return C()},onValueClass:function(k){return w1e(h(s().unescapeValue(k)),o(),r())}}),kt()}function Jf(t,A,e){var i=Hi(A),n=WA(t,i);if(Wo(n)){var o=Ps(vi(A));return e.map((c,l)=>({op:"add",path:pt(i.concat(String(o+l))),value:c.value}))}if(nr(n)){var r=vi(A),s=Object.keys(n),a=r!==void 0?o6(s,r,!0):[];return[...e.map(c=>{var l=n6(c.key,s);return{op:"add",path:pt(i.concat(l)),value:c.value}}),...a.map(c=>iI(i,c))]}throw new Error("Cannot create insert operations: parent must be an Object or Array")}function rY(t,A,e){var i=WA(t,A);if(Array.isArray(i)){var n=i.length;return e.map((o,r)=>({op:"add",path:pt(A.concat(String(n+r))),value:o.value}))}return e.map(o=>{var r=n6(o.key,Object.keys(i));return{op:"add",path:pt(A.concat(r)),value:o.value}})}function r6(t,A,e,i){var n=n6(i,A.filter(r=>r!==e)),o=o6(A,e,!1);return[{op:"move",from:pt(t.concat(e)),path:pt(t.concat(n))},...o.map(r=>iI(t,r))]}function D1e(t,A){var e=vi(A);if(An(e))throw new Error("Cannot duplicate root object");var i=Hi(e),n=vi(e),o=WA(t,i);if(Wo(o)){var r=vi(A),s=r?Ps(vi(r))+1:0;return[...A.map((l,d)=>({op:"copy",from:pt(l),path:pt(i.concat(String(d+s)))}))]}if(nr(o)){var a=Object.keys(o),c=n!==void 0?o6(a,n,!1):[];return[...A.map(l=>{var d=n6(vi(l),a);return{op:"copy",from:pt(l),path:pt(i.concat(d))}}),...c.map(l=>iI(i,l))]}throw new Error("Cannot create duplicate operations: parent must be an Object or Array")}function v1e(t,A){if(fn(A))return[{op:"move",from:pt(A.path),path:""}];if(!Io(A))throw new Error("Cannot create extract operations: parent must be an Object or Array");var e=Hi(A.focusPath),i=WA(t,e);if(Wo(i)){var n=tI(t,A).map(r=>{var s=Ps(vi(r));return i[s]});return[{op:"replace",path:"",value:n}]}if(nr(i)){var o={};return tI(t,A).forEach(r=>{var s=String(vi(r));o[s]=i[s]}),[{op:"replace",path:"",value:o}]}throw new Error("Cannot extract: unsupported type of selection "+JSON.stringify(A))}function b1e(t,A,e,i){if(Bs(A)){var n=t1e(e,i),o=Hi(A.path),r=WA(t,o);return r6(o,Object.keys(r),vi(A.path),typeof n=="string"?n:e)}if(fn(A)||Io(A)&&An(A.focusPath))try{return[{op:"replace",path:pt(It(A)),value:t6(e,_=>A6(_,i))}]}catch{return[{op:"replace",path:pt(It(A)),value:e}]}if(Io(A)){var s=RJ(e,i);return function(_,K,J){var O=Wl(K),H=Hi(O),V=WA(_,H);if(Wo(V)){var Z=Wl(K),ye=Z?Ps(vi(Z)):0;return[...QM(K),...J.map((Te,$e)=>({op:"add",path:pt(H.concat(String($e+ye))),value:Te.value}))]}if(nr(V)){var P=vi(K),se=Hi(P),X=vi(P),ue=Object.keys(V),oe=X!==void 0?o6(ue,X,!1):[],le=new Set(K.map(Te=>vi(Te))),me=ue.filter(Te=>!le.has(Te));return[...QM(K),...J.map(Te=>{var $e=n6(Te.key,me);return{op:"add",path:pt(se.concat($e)),value:Te.value}}),...oe.map(Te=>iI(se,Te))]}throw new Error("Cannot create replace operations: parent must be an Object or Array")}(t,tI(t,A),s)}if(Jc(A)){var a=RJ(e,i),c=A.path,l=Hi(c),d=WA(t,l);if(Wo(d)){var C=Ps(vi(c));return Jf(t,l.concat(String(C+1)),a)}if(nr(d)){var I=String(vi(c)),u=Object.keys(d);if(An(u)||vi(u)===I)return rY(t,l,a);var h=u.indexOf(I),B=u[h+1];return Jf(t,l.concat(B),a)}throw new Error("Cannot create insert operations: parent must be an Object or Array")}if(cs(A)){var f=RJ(e,i),b=A.path,k=WA(t,b);if(Wo(k))return Jf(t,b.concat("0"),f);if(nr(k)){var S=Object.keys(k);if(An(S))return rY(t,b,f);var w=Wl(S);return Jf(t,b.concat(w),f)}throw new Error("Cannot create insert operations: parent must be an Object or Array")}throw new Error("Cannot insert: unsupported type of selection "+JSON.stringify(A))}function QM(t){return t.map(A=>({op:"remove",path:pt(A)})).reverse()}function iI(t,A){return{op:"move",from:pt(t.concat(A)),path:pt(t.concat(A))}}function RJ(t,A){var e=/^\s*{/.test(t),i=/^\s*\[/.test(t),n=t1e(t,A),o=n!==void 0?n:t6(t,r=>A6(r,A));return e&&vn(o)||i&&Array.isArray(o)?[{key:"New item",value:o}]:Array.isArray(o)?o.map((r,s)=>({key:"New item "+s,value:r})):vn(o)?Object.keys(o).map(r=>({key:r,value:o[r]})):[{key:"New item",value:o}]}function M1e(t,A){if(Bs(A)){var e=Hi(A.path),i=WA(t,e),n=r6(e,Object.keys(i),vi(A.path),"");return{operations:n,newSelection:$f(t,n)}}if(fn(A))return{operations:[{op:"replace",path:pt(A.path),value:""}],newSelection:A};if(Io(A)){var o=tI(t,A),r=QM(o),s=vi(o);if(An(s))return{operations:[{op:"replace",path:"",value:""}],newSelection:zi([])};var a=Hi(s),c=WA(t,a);if(Wo(c)){var l=Wl(o),d=Ps(vi(l));return{operations:r,newSelection:d===0?e1(a):W2(a.concat(String(d-1)))}}if(nr(c)){var C=Object.keys(c),I=Wl(o),u=vi(I),h=C.indexOf(u),B=C[h-1];return{operations:r,newSelection:h===0?e1(a):W2(a.concat(B))}}throw new Error("Cannot create remove operations: parent must be an Object or Array")}throw new Error("Cannot remove: unsupported type of selection "+JSON.stringify(A))}function S1e(t,A){var e=function(i,n){if(An(n)||!n.every(X1))return n;var o=[];for(var r of n){var s=Ode(Sa(r.from)),a=Ode(Sa(r.path));if(!s||!a)return n;o.push({from:s,path:a,operation:r})}var c=o[0].path.parent,l=WA(i,c);if(!nr(l)||!o.every(u=>function(h,B){return wi(h.from.parent,B)&&wi(h.path.parent,B)}(u,c)))return n;var d=function(u,h){var B=Object.keys(h),f=B.slice();for(var b of u){var k=f.indexOf(b.from.key);k!==-1&&(f.splice(k,1),f.push(b.path.key))}for(var S=0;Su.operation,I=o.filter(u=>u.operation.from!==u.operation.path);return I.some(u=>u.path.key===d)?I.map(C):[iI(c,d),...I.map(C)]}(t,A);return SD(t,e,{before:(i,n,o)=>{if(OF(n)){var r=Sa(n.path);return{revertOperations:[...o,...NJ(i,r)]}}if(X1(n)){var s=Sa(n.from);return{revertOperations:n.from===n.path?[n,...NJ(i,s)]:[...o,...NJ(i,s)]}}return{document:i}}})}function Ode(t){return t.length>0?{parent:Hi(t),key:vi(t)}:void 0}function NJ(t,A){var e=Hi(A),i=vi(A),n=WA(t,e);return nr(n)?o6(Object.keys(n),i,!1).map(o=>iI(e,o)):[]}function Jde(t){var A=t.activeIndex0?0:-1,e=t.items[A],i=t.items.map((n,o)=>SA(SA({},n),{},{active:o===A}));return SA(SA({},t),{},{items:i,activeItem:e,activeIndex:A})}function Yde(t,A){var e,i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=t.toLowerCase(),o=(e=i?.maxResults)!==null&&e!==void 0?e:1/0,r=i?.columns,s=[],a=[];function c(B){s.length>=o||s.push(B)}function l(B,f){if(Wo(f)){var b=a.length;a.push("0");for(var k=0;k=o)return;a.pop()}else if(nr(f)){var S=Object.keys(f),w=a.length;for(var _ of(a.push(""),S))if(a[w]=_,Hde(_,B,a,A0.key,c),l(B,f[_]),s.length>=o)return;a.pop()}else Hde(String(f),B,a,A0.value,c)}if(t==="")return[];if(r){if(!Array.isArray(A))throw new Error("json must be an Array when option columns is defined");for(var d=0;du.length+1;)a.pop();l(n,WA(C,u))}if(s.length>=o)break}return s}return l(n,A),s}function Hde(t,A,e,i,n){var o=t.toLowerCase(),r=0,s=-1,a=-1;do(a=o.indexOf(A,s))!==-1&&(s=a+A.length,n({path:e.slice(0),field:i,fieldIndex:r,start:a,end:s}),r++);while(a!==-1)}function sY(t,A,e,i){return t.substring(0,e)+A+t.substring(i)}function zde(t,A,e){var i=t;return cG(e,n=>{i=sY(i,A,n.start,n.end)}),i}function Hqe(t,A,e,i,n){var{field:o,path:r,start:s,end:a}=i;if(o===A0.key){var c=Hi(r),l=WA(t,c),d=vi(r),C=r6(c,Object.keys(l),d,sY(d,e,s,a));return{newSelection:$f(t,C),operations:C}}if(o===A0.value){var I=WA(t,r);if(I===void 0)throw new Error("Cannot replace: path not found ".concat(pt(r)));var u=typeof I=="string"?I:String(I),h=_d(t,A,r),B=sY(u,e,s,a),f=[{op:"replace",path:pt(r),value:h?B:rQ(B,n)}];return{newSelection:$f(t,f),operations:f}}throw new Error("Cannot replace: unknown type of search result field ".concat(o))}function Pde(t){return t.path.concat(t.field,String(t.fieldIndex))}function jde(t){var A=u1e(t)?t.searchResults.filter(e=>e.field===A0.key):void 0;return A&&A.length>0?A:void 0}function Vde(t){var A=u1e(t)?t.searchResults.filter(e=>e.field===A0.value):void 0;return A&&A.length>0?A:void 0}var zqe={createObjectDocumentState:()=>({type:"object",properties:{}}),createArrayDocumentState:()=>({type:"array",items:[]}),createValueDocumentState:()=>({type:"value"})};function k1e(t,A){return A.reduce((e,i)=>function(n,o,r,s){return JY(n,o,r,s,zqe)}(t,e,i.path,(n,o)=>SA(SA({},o),{},{searchResults:o.searchResults?o.searchResults.concat(i):[i]})),void 0)}function mM(t){var A,e=(A=t?.searchResults)!==null&&A!==void 0?A:[],i=Tc(t)?Object.values(t.properties).flatMap(mM):hs(t)?t.items.flatMap(mM):[];return e.concat(i)}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-highlight.svelte-5fb7bl { + background-color: var(--jse-search-match-color, #ffe665); + outline: var(--jse-search-match-outline, none); +} +.jse-highlight.jse-active.svelte-5fb7bl { + background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); + outline: var(--jse-search-match-outline, 2px solid #e0be00); +}`);var Pqe=_e(" ");function x1e(t,A){St(A,!1);var e=Ce(),i=N(A,"text",8),n=N(A,"searchResultItems",8);Se(()=>(F(i()),F(n())),()=>{x(e,function(r,s){var a=[],c=0;for(var l of s){var d=r.slice(c,l.start);d!==""&&a.push({resultIndex:void 0,type:"normal",text:d,active:!1});var C=r.slice(l.start,l.end);a.push({resultIndex:l.resultIndex,type:"highlight",text:C,active:l.active}),c=l.end}var I=vi(s);return I&&I.endg(e),Jr,(r,s)=>{var a=ar(),c=Ut(a),l=C=>{var I=Ss();xA(()=>xt(I,(g(s),Be(()=>g(s).text)))),he(C,I)},d=C=>{var I,u=Pqe(),h=ge(u);xA((B,f,b)=>{I=ci(u,1,"jse-highlight svelte-5fb7bl",null,I,B),Rn(u,"data-search-result-index",f),xt(h,b)},[()=>({"jse-active":g(s).active}),()=>(g(s),Be(()=>String(g(s).resultIndex))),()=>(F(Zf),g(s),Be(()=>Zf(g(s).text)))],tA),he(C,u)};ze(c,C=>{g(s),Be(()=>g(s).type==="normal")?C(l):C(d,!1)}),he(r,a)}),he(t,o),kt()}function sM(t){var A=1e3;if(t<900)return t.toFixed()+" B";var e=t/A;if(e<900)return e.toFixed(1)+" KB";var i=e/A;if(i<900)return i.toFixed(1)+" MB";var n=i/A;return n<900?n.toFixed(1)+" GB":(n/A).toFixed(1)+" TB"}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-tag.svelte-jlw0fj { + border: none; + font-size: 80%; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + color: var(--jse-tag-color, var(--jse-text-color-inverse, #fff)); + background: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); + border-radius: 2px; + cursor: pointer; + display: inline-block; + padding: 0 4px; + line-height: normal; + margin: 1px 0; +} +.jse-tag.svelte-jlw0fj:hover { + opacity: 0.8; +} +.jse-tag.disabled.svelte-jlw0fj { + opacity: 0.7; + cursor: inherit; +}`);var jqe=_e('');function aM(t,A){St(A,!0);var e,i=Oc(()=>A.onclick?o=>{o.preventDefault(),o.stopPropagation(),A.onclick()}:void 0),n=jqe();n.__click=function(){for(var o,r=arguments.length,s=new Array(r),a=0;a2?s-2:0),c=2;c{C!==(C=r())&&(l&&(lg(l),l=null),l=Gd(()=>C(d,...a)))},Wp)}(ge(n),()=>{var o;return(o=A.children)!==null&&o!==void 0?o:Ade}),xA(o=>e=ci(n,1,"jse-tag svelte-jlw0fj",null,e,o),[()=>({disabled:!A.onclick})]),he(t,n),kt()}e6(["click"]);function Vqe(t,A,e){typeof A.value=="string"&&g(e)&&LY(t)&&(t.preventDefault(),t.stopPropagation(),window.open(A.value,"_blank"))}function qqe(t,A){A.readOnly||(t.preventDefault(),A.onSelect(fM(A.path)))}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-value.jse-string.svelte-c0g9qz { + color: var(--jse-value-color-string, #008000); +} +.jse-value.jse-object.svelte-c0g9qz, .jse-value.jse-array.svelte-c0g9qz { + min-width: 16px; + color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); +} +.jse-value.jse-number.svelte-c0g9qz { + color: var(--jse-value-color-number, #ee422e); +} +.jse-value.jse-boolean.svelte-c0g9qz { + color: var(--jse-value-color-boolean, #ff8c00); +} +.jse-value.jse-null.svelte-c0g9qz { + color: var(--jse-value-color-null, #004ed0); +} +.jse-value.jse-invalid.svelte-c0g9qz { + color: var(--jse-text-color, #4d4d4d); +} +.jse-value.jse-url.svelte-c0g9qz { + color: var(--jse-value-color-url, #008000); + text-decoration: underline; +} + +.jse-value.svelte-c0g9qz { + display: inline-block; + min-width: 2em; + padding: 0 5px; + box-sizing: border-box; + outline: none; + border-radius: 1px; + vertical-align: top; + word-break: normal; + overflow-wrap: anywhere; + white-space: pre-wrap; +} +.jse-value.jse-table-cell.svelte-c0g9qz { + overflow-wrap: normal; + white-space: nowrap; +} +.jse-value.jse-empty.svelte-c0g9qz { + min-width: 4em; + outline: 1px dotted var(--jse-tag-background, rgba(0, 0, 0, 0.2)); + -moz-outline-radius: 2px; +} +.jse-value.jse-empty.svelte-c0g9qz::after { + pointer-events: none; + color: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); + content: "value"; +}`);var Wqe=_e('
    ');function Zqe(t,A){St(A,!0);var e=T2(!0),i=Oc(()=>g(e)&&typeof A.value=="string"&&A.value.length>A.truncateTextSize&&(!A.searchResultItems||!A.searchResultItems.some(I=>I.active&&I.end>A.truncateTextSize))),n=Oc(()=>g(i)&&typeof A.value=="string"?A.value.substring(0,A.truncateTextSize).trim():A.value),o=Oc(()=>FM(A.value));function r(){x(e,!1)}var s=Wqe();s.__click=[Vqe,A,o],s.__dblclick=[qqe,A];var a=ge(s),c=I=>{var u=Oc(()=>A.normalization.escapeValue(g(n)));x1e(I,{get text(){return g(u)},get searchResultItems(){return A.searchResultItems}})},l=I=>{var u=Ss();xA(h=>xt(u,h),[()=>Zf(A.normalization.escapeValue(g(n)))]),he(I,u)};ze(a,I=>{A.searchResultItems?I(c):I(l,!1)});var d=De(a,2),C=I=>{aM(I,{onclick:r,children:(u,h)=>{var B=Ss();xA(f=>xt(B,"Show more (".concat(f??"",")")),[()=>sM(A.value.length)]),he(u,B)},$$slots:{default:!0}})};ze(d,I=>{g(i)&&typeof A.value=="string"&&I(C)}),xA(I=>{ci(s,1,I,"svelte-c0g9qz"),Rn(s,"title",g(o)?"Ctrl+Click or Ctrl+Enter to open url in new window":void 0)},[()=>AI(w1e(A.value,A.mode,A.parser))]),he(t,s),kt()}e6(["click","dblclick"]);Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-tooltip.svelte-14y3y8t { + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + line-height: normal; + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); + border-radius: 3px; + background: var(--jse-context-menu-background, #656565); + color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); + white-space: nowrap; + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); +}`);var Xqe=_e('
    ');function $qe(t,A){var e=N(A,"text",8),i=Xqe(),n=ge(i);xA(()=>xt(n,e())),he(t,i)}function eQ(t,A){var e,{text:i,openAbsolutePopup:n,closeAbsolutePopup:o}=A;function r(){e=n($qe,{text:i},{position:"top",width:10*i.length,offsetTop:3,anchor:t,closeOnOuterClick:!0})}function s(){o(e)}return t.addEventListener("mouseenter",r),t.addEventListener("mouseleave",s),{destroy(){t.removeEventListener("mouseenter",r),t.removeEventListener("mouseleave",s)}}}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-timestamp.svelte-1jla5ec { + padding: 0; + margin: 0; + vertical-align: middle; + display: inline-flex; + color: var(--jse-value-color-number, #ee422e); +}`);var eWe=_e('
    ');function AWe(t,A){St(A,!1);var e=Ce(void 0,!0),i=nI("absolute-popup"),n=N(A,"value",9);Se(()=>F(n()),()=>{x(e,"Time: ".concat(new Date(n()).toString()))}),Nn(),li(!0);var o=eWe();nn(ge(o),{get data(){return roe}}),Ka(o,(r,s)=>eQ?.(r,s),()=>SA({text:g(e)},i)),he(t,o),kt()}function tWe(t){var A=[];return!t.isEditing&&$Ve(t.value)&&A.push({component:kqe,props:t}),!t.isEditing&&eqe(t.value)&&A.push({component:Nqe,props:t}),t.isEditing&&A.push({component:Yqe,props:t}),t.isEditing||A.push({component:Zqe,props:t}),!t.isEditing&&ZJ(t.value)&&A.push({component:AWe,props:t}),A}function Yc(t){return t.map((A,e)=>nWe.test(A)?"["+A+"]":/[.[\]]/.test(A)||A===""?'["'+function(i){return i.replace(/"/g,'\\"')}(A)+'"]':(e>0?".":"")+A).join("")}function iWe(t){for(var A=[],e=0;eo==='"',!0)),n('"')):A.push(i(o=>o==="]")),n("]")):A.push(i(o=>o==="."||o==="["));function i(o){for(var r=arguments.length>1&&arguments[1]!==void 0&&arguments[1],s="";e({x:t,y:t}),sWe={left:"right",right:"left",bottom:"top",top:"bottom"},aWe={start:"end",end:"start"};function qde(t,A,e){return oh(t,pM(A,e))}function UM(t,A){return typeof t=="function"?t(A):t}function gh(t){return t.split("-")[0]}function TM(t){return t.split("-")[1]}function _1e(t){return t==="x"?"y":"x"}function R1e(t){return t==="y"?"height":"width"}var cWe=new Set(["top","bottom"]);function PC(t){return cWe.has(gh(t))?"y":"x"}function N1e(t){return _1e(PC(t))}function aY(t){return t.replace(/start|end/g,A=>aWe[A])}var Wde=["left","right"],Zde=["right","left"],lWe=["top","bottom"],gWe=["bottom","top"];function dWe(t,A,e,i){var n=TM(t),o=function(r,s,a){switch(r){case"top":case"bottom":return a?s?Zde:Wde:s?Wde:Zde;case"left":case"right":return s?lWe:gWe;default:return[]}}(gh(t),e==="start",i);return n&&(o=o.map(r=>r+"-"+n),A&&(o=o.concat(o.map(aY)))),o}function Xb(t){return t.replace(/left|right|bottom|top/g,A=>sWe[A])}function CWe(t){return typeof t!="number"?function(A){return SA({top:0,right:0,bottom:0,left:0},A)}(t):{top:t,right:t,bottom:t,left:t}}function yM(t){var{x:A,y:e,width:i,height:n}=t;return{width:i,height:n,top:e,left:A,right:A+i,bottom:e+n,x:A,y:e}}function Xde(t,A,e){var i,{reference:n,floating:o}=t,r=PC(A),s=N1e(A),a=R1e(s),c=gh(A),l=r==="y",d=n.x+n.width/2-o.width/2,C=n.y+n.height/2-o.height/2,I=n[a]/2-o[a]/2;switch(c){case"top":i={x:d,y:n.y-o.height};break;case"bottom":i={x:d,y:n.y+n.height};break;case"right":i={x:n.x+n.width,y:C};break;case"left":i={x:n.x-o.width,y:C};break;default:i={x:n.x,y:n.y}}switch(TM(A)){case"start":i[s]-=I*(e&&l?-1:1);break;case"end":i[s]+=I*(e&&l?-1:1)}return i}var IWe=function(){var t=Vt(function*(A,e,i){for(var{placement:n="bottom",strategy:o="absolute",middleware:r=[],platform:s}=i,a=r.filter(Boolean),c=yield s.isRTL==null?void 0:s.isRTL(e),l=yield s.getElementRects({reference:A,floating:e,strategy:o}),{x:d,y:C}=Xde(l,n,c),I=n,u={},h=0,B=0;B"u")&&(t instanceof ShadowRoot||t instanceof Ml(t).ShadowRoot)}var hWe=new Set(["inline","contents"]);function zp(t){var{overflow:A,overflowX:e,overflowY:i,display:n}=i0(t);return/auto|scroll|overlay|hidden|clip/.test(A+i+e)&&!hWe.has(n)}var BWe=new Set(["table","td","th"]);function EWe(t){return BWe.has(AQ(t))}var fWe=[":popover-open",":modal"];function DM(t){return fWe.some(A=>{try{return t.matches(A)}catch{return!1}})}var QWe=["transform","translate","scale","rotate","perspective"],mWe=["transform","translate","scale","rotate","perspective","filter"],pWe=["paint","layout","strict","content"];function gY(t){var A=PY(),e=t0(t)?i0(t):t;return QWe.some(i=>!!e[i]&&e[i]!=="none")||!!e.containerType&&e.containerType!=="normal"||!A&&!!e.backdropFilter&&e.backdropFilter!=="none"||!A&&!!e.filter&&e.filter!=="none"||mWe.some(i=>(e.willChange||"").includes(i))||pWe.some(i=>(e.contain||"").includes(i))}function PY(){return!(typeof CSS>"u"||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}var wWe=new Set(["html","body","#document"]);function zf(t){return wWe.has(AQ(t))}function i0(t){return Ml(t).getComputedStyle(t)}function JM(t){return t0(t)?{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}:{scrollLeft:t.scrollX,scrollTop:t.scrollY}}function jC(t){if(AQ(t)==="html")return t;var A=t.assignedSlot||t.parentNode||$de(t)&&t.host||Fd(t);return $de(A)?A.host:A}function G1e(t){var A=jC(t);return zf(A)?t.ownerDocument?t.ownerDocument.body:t.body:Kd(A)&&zp(A)?A:G1e(A)}function Pp(t,A,e){var i;A===void 0&&(A=[]),e===void 0&&(e=!0);var n=G1e(t),o=n===((i=t.ownerDocument)==null?void 0:i.body),r=Ml(n);if(o){var s=dY(r);return A.concat(r,r.visualViewport||[],zp(n)?n:[],s&&e?Pp(s):[])}return A.concat(n,Pp(n,[],e))}function dY(t){return t.parent&&Object.getPrototypeOf(t.parent)?t.frameElement:null}function K1e(t){var A=i0(t),e=parseFloat(A.width)||0,i=parseFloat(A.height)||0,n=Kd(t),o=n?t.offsetWidth:e,r=n?t.offsetHeight:i,s=wM(e)!==o||wM(i)!==r;return s&&(e=o,i=r),{width:e,height:i,$:s}}function jY(t){return t0(t)?t:t.contextElement}function Pf(t){var A=jY(t);if(!Kd(A))return Ld(1);var e=A.getBoundingClientRect(),{width:i,height:n,$:o}=K1e(A),r=(o?wM(e.width):e.width)/i,s=(o?wM(e.height):e.height)/n;return r&&Number.isFinite(r)||(r=1),s&&Number.isFinite(s)||(s=1),{x:r,y:s}}var yWe=Ld(0);function U1e(t){var A=Ml(t);return PY()&&A.visualViewport?{x:A.visualViewport.offsetLeft,y:A.visualViewport.offsetTop}:yWe}function dh(t,A,e,i){A===void 0&&(A=!1),e===void 0&&(e=!1);var n=t.getBoundingClientRect(),o=jY(t),r=Ld(1);A&&(i?t0(i)&&(r=Pf(i)):r=Pf(t));var s=function(w,_,K){return _===void 0&&(_=!1),!(!K||_&&K!==Ml(w))&&_}(o,e,i)?U1e(o):Ld(0),a=(n.left+s.x)/r.x,c=(n.top+s.y)/r.y,l=n.width/r.x,d=n.height/r.y;if(o)for(var C=Ml(o),I=i&&t0(i)?Ml(i):i,u=C,h=dY(u);h&&i&&I!==u;){var B=Pf(h),f=h.getBoundingClientRect(),b=i0(h),k=f.left+(h.clientLeft+parseFloat(b.paddingLeft))*B.x,S=f.top+(h.clientTop+parseFloat(b.paddingTop))*B.y;a*=B.x,c*=B.y,l*=B.x,d*=B.y,a+=k,c+=S,h=dY(u=Ml(h))}return yM({width:l,height:d,x:a,y:c})}function VY(t,A){var e=JM(t).scrollLeft;return A?A.left+e:dh(Fd(t)).left+e}function T1e(t,A,e){e===void 0&&(e=!1);var i=t.getBoundingClientRect();return{x:i.left+A.scrollLeft-(e?0:VY(t,i)),y:i.top+A.scrollTop}}var DWe=new Set(["absolute","fixed"]);function e2e(t,A,e){var i;if(A==="viewport")i=function(o,r){var s=Ml(o),a=Fd(o),c=s.visualViewport,l=a.clientWidth,d=a.clientHeight,C=0,I=0;if(c){l=c.width,d=c.height;var u=PY();(!u||u&&r==="fixed")&&(C=c.offsetLeft,I=c.offsetTop)}return{width:l,height:d,x:C,y:I}}(t,e);else if(A==="document")i=function(o){var r=Fd(o),s=JM(o),a=o.ownerDocument.body,c=oh(r.scrollWidth,r.clientWidth,a.scrollWidth,a.clientWidth),l=oh(r.scrollHeight,r.clientHeight,a.scrollHeight,a.clientHeight),d=-s.scrollLeft+VY(o),C=-s.scrollTop;return i0(a).direction==="rtl"&&(d+=oh(r.clientWidth,a.clientWidth)-c),{width:c,height:l,x:d,y:C}}(Fd(t));else if(t0(A))i=function(o,r){var s=dh(o,!0,r==="fixed"),a=s.top+o.clientTop,c=s.left+o.clientLeft,l=Kd(o)?Pf(o):Ld(1);return{width:o.clientWidth*l.x,height:o.clientHeight*l.y,x:c*l.x,y:a*l.y}}(A,e);else{var n=U1e(t);i={x:A.x-n.x,y:A.y-n.y,width:A.width,height:A.height}}return yM(i)}function O1e(t,A){var e=jC(t);return!(e===A||!t0(e)||zf(e))&&(i0(e).position==="fixed"||O1e(e,A))}function vWe(t,A,e){var i=Kd(A),n=Fd(A),o=e==="fixed",r=dh(t,!0,o,A),s={scrollLeft:0,scrollTop:0},a=Ld(0);function c(){a.x=VY(n)}if(i||!i&&!o)if((AQ(A)!=="body"||zp(n))&&(s=JM(A)),i){var l=dh(A,!0,o,A);a.x=l.x+A.clientLeft,a.y=l.y+A.clientTop}else n&&c();o&&!i&&n&&c();var d=!n||i||o?Ld(0):T1e(n,s);return{x:r.left+s.scrollLeft-a.x-d.x,y:r.top+s.scrollTop-a.y-d.y,width:r.width,height:r.height}}function LJ(t){return i0(t).position==="static"}function A2e(t,A){if(!Kd(t)||i0(t).position==="fixed")return null;if(A)return A(t);var e=t.offsetParent;return Fd(t)===e&&(e=e.ownerDocument.body),e}function t2e(t,A){var e=Ml(t);if(DM(t))return e;if(!Kd(t)){for(var i=jC(t);i&&!zf(i);){if(t0(i)&&!LJ(i))return i;i=jC(i)}return e}for(var n=A2e(t,A);n&&EWe(n)&&LJ(n);)n=A2e(n,A);return n&&zf(n)&&LJ(n)&&!gY(n)?e:n||function(o){for(var r=jC(o);Kd(r)&&!zf(r);){if(gY(r))return r;if(DM(r))return null;r=jC(r)}return null}(t)||e}var bWe={convertOffsetParentRelativeRectToViewportRelativeRect:function(t){var{elements:A,rect:e,offsetParent:i,strategy:n}=t,o=n==="fixed",r=Fd(i),s=!!A&&DM(A.floating);if(i===r||s&&o)return e;var a={scrollLeft:0,scrollTop:0},c=Ld(1),l=Ld(0),d=Kd(i);if((d||!d&&!o)&&((AQ(i)!=="body"||zp(r))&&(a=JM(i)),Kd(i))){var C=dh(i);c=Pf(i),l.x=C.x+i.clientLeft,l.y=C.y+i.clientTop}var I=!r||d||o?Ld(0):T1e(r,a,!0);return{width:e.width*c.x,height:e.height*c.y,x:e.x*c.x-a.scrollLeft*c.x+l.x+I.x,y:e.y*c.y-a.scrollTop*c.y+l.y+I.y}},getDocumentElement:Fd,getClippingRect:function(t){var{element:A,boundary:e,rootBoundary:i,strategy:n}=t,o=[...e==="clippingAncestors"?DM(A)?[]:function(a,c){var l=c.get(a);if(l)return l;for(var d=Pp(a,[],!1).filter(f=>t0(f)&&AQ(f)!=="body"),C=null,I=i0(a).position==="fixed",u=I?jC(a):a;t0(u)&&!zf(u);){var h=i0(u),B=gY(u);B||h.position!=="fixed"||(C=null),(I?!B&&!C:!B&&h.position==="static"&&C&&DWe.has(C.position)||zp(u)&&!B&&O1e(a,u))?d=d.filter(f=>f!==u):C=h,u=jC(u)}return c.set(a,d),d}(A,this._c):[].concat(e),i],r=o[0],s=o.reduce((a,c)=>{var l=e2e(A,c,n);return a.top=oh(l.top,a.top),a.right=pM(l.right,a.right),a.bottom=pM(l.bottom,a.bottom),a.left=oh(l.left,a.left),a},e2e(A,r,n));return{width:s.right-s.left,height:s.bottom-s.top,x:s.left,y:s.top}},getOffsetParent:t2e,getElementRects:function(){var t=Vt(function*(A){var e=this.getOffsetParent||t2e,i=this.getDimensions,n=yield i(A.floating);return{reference:vWe(A.reference,yield e(A.floating),A.strategy),floating:{x:0,y:0,width:n.width,height:n.height}}});return function(A){return t.apply(this,arguments)}}(),getClientRects:function(t){return Array.from(t.getClientRects())},getDimensions:function(t){var{width:A,height:e}=K1e(t);return{width:A,height:e}},getScale:Pf,isElement:t0,isRTL:function(t){return i0(t).direction==="rtl"}};function i2e(t,A){return t.x===A.x&&t.y===A.y&&t.width===A.width&&t.height===A.height}function MWe(t,A,e,i){i===void 0&&(i={});var{ancestorScroll:n=!0,ancestorResize:o=!0,elementResize:r=typeof ResizeObserver=="function",layoutShift:s=typeof IntersectionObserver=="function",animationFrame:a=!1}=i,c=jY(t),l=n||o?[...c?Pp(c):[],...Pp(A)]:[];l.forEach(B=>{n&&B.addEventListener("scroll",e,{passive:!0}),o&&B.addEventListener("resize",e)});var d,C=c&&s?function(B,f){var b,k=null,S=Fd(B);function w(){var _;clearTimeout(b),(_=k)==null||_.disconnect(),k=null}return function _(K,J){K===void 0&&(K=!1),J===void 0&&(J=1),w();var O=B.getBoundingClientRect(),{left:H,top:V,width:Z,height:ye}=O;if(K||f(),Z&&ye){var P={rootMargin:-Zb(V)+"px "+-Zb(S.clientWidth-(H+Z))+"px "+-Zb(S.clientHeight-(V+ye))+"px "+-Zb(H)+"px",threshold:oh(0,pM(1,J))||1},se=!0;try{k=new IntersectionObserver(X,SA(SA({},P),{},{root:S.ownerDocument}))}catch{k=new IntersectionObserver(X,P)}k.observe(B)}function X(ue){var oe=ue[0].intersectionRatio;if(oe!==J){if(!se)return _();oe?_(!1,oe):b=setTimeout(()=>{_(!1,1e-7)},1e3)}oe!==1||i2e(O,B.getBoundingClientRect())||_(),se=!1}}(!0),w}(c,e):null,I=-1,u=null;r&&(u=new ResizeObserver(B=>{var[f]=B;f&&f.target===c&&u&&(u.unobserve(A),cancelAnimationFrame(I),I=requestAnimationFrame(()=>{var b;(b=u)==null||b.observe(A)})),e()}),c&&!a&&u.observe(c),u.observe(A));var h=a?dh(t):null;return a&&function B(){var f=dh(t);h&&!i2e(h,f)&&e(),h=f,d=requestAnimationFrame(B)}(),e(),()=>{var B;l.forEach(f=>{n&&f.removeEventListener("scroll",e),o&&f.removeEventListener("resize",e)}),C?.(),(B=u)==null||B.disconnect(),u=null,a&&cancelAnimationFrame(d)}}var SWe=function(t){return t===void 0&&(t=0),{name:"offset",options:t,fn:A=>Vt(function*(){var e,i,{x:n,y:o,placement:r,middlewareData:s}=A,a=yield function(c,l){return lY.apply(this,arguments)}(A,t);return r===((e=s.offset)==null?void 0:e.placement)&&(i=s.arrow)!=null&&i.alignmentOffset?{}:{x:n+a.x,y:o+a.y,data:SA(SA({},a),{},{placement:r})}})()}},kWe=function(t){return t===void 0&&(t={}),{name:"shift",options:t,fn:A=>Vt(function*(){var{x:e,y:i,placement:n}=A,o=UM(t,A),{mainAxis:r=!0,crossAxis:s=!1,limiter:a={fn:k=>{var{x:S,y:w}=k;return{x:S,y:w}}}}=o,c=g2e(o,uVe),l={x:e,y:i},d=yield L1e(A,c),C=PC(gh(n)),I=_1e(C),u=l[I],h=l[C];if(r){var B=I==="y"?"bottom":"right";u=qde(u+d[I==="y"?"top":"left"],u,u-d[B])}if(s){var f=C==="y"?"bottom":"right";h=qde(h+d[C==="y"?"top":"left"],h,h-d[f])}var b=a.fn(SA(SA({},A),{},{[I]:u,[C]:h}));return SA(SA({},b),{},{data:{x:b.x-e,y:b.y-i,enabled:{[I]:r,[C]:s}}})})()}},xWe=function(t){return t===void 0&&(t={}),{name:"flip",options:t,fn:A=>Vt(function*(){var e,i,{placement:n,middlewareData:o,rects:r,initialPlacement:s,platform:a,elements:c}=A,l=UM(t,A),{mainAxis:d=!0,crossAxis:C=!0,fallbackPlacements:I,fallbackStrategy:u="bestFit",fallbackAxisSideDirection:h="none",flipAlignment:B=!0}=l,f=g2e(l,IVe);if((e=o.arrow)!=null&&e.alignmentOffset)return{};var b=gh(n),k=PC(s),S=gh(s)===s,w=yield a.isRTL==null?void 0:a.isRTL(c.floating),_=I||(S||!B?[Xb(s)]:function(me){var Te=Xb(me);return[aY(me),Te,aY(Te)]}(s)),K=h!=="none";!I&&K&&_.push(...dWe(s,B,h,w));var J=[s,..._],O=yield L1e(A,f),H=[],V=((i=o.flip)==null?void 0:i.overflows)||[];if(d&&H.push(O[b]),C){var Z=function(me,Te,$e){$e===void 0&&($e=!1);var Je=TM(me),Qe=N1e(me),He=R1e(Qe),PA=Qe==="x"?Je===($e?"end":"start")?"right":"left":Je==="start"?"bottom":"top";return Te.reference[He]>Te.floating[He]&&(PA=Xb(PA)),[PA,Xb(PA)]}(n,r,w);H.push(O[Z[0]],O[Z[1]])}if(V=[...V,{placement:n,overflows:H}],!H.every(me=>me<=0)){var ye,P,se=(((ye=o.flip)==null?void 0:ye.index)||0)+1,X=J[se];if(X&&(!(C==="alignment"&&k!==PC(X))||V.every(me=>me.overflows[0]>0&&PC(me.placement)===k)))return{data:{index:se,overflows:V},reset:{placement:X}};var ue=(P=V.filter(me=>me.overflows[0]<=0).sort((me,Te)=>me.overflows[1]-Te.overflows[1])[0])==null?void 0:P.placement;if(!ue)switch(u){case"bestFit":var oe,le=(oe=V.filter(me=>{if(K){var Te=PC(me.placement);return Te===k||Te==="y"}return!0}).map(me=>[me.placement,me.overflows.filter(Te=>Te>0).reduce((Te,$e)=>Te+$e,0)]).sort((me,Te)=>me[1]-Te[1])[0])==null?void 0:oe[0];le&&(ue=le);break;case"initialPlacement":ue=s}if(n!==ue)return{reset:{placement:ue}}}return{}})()}};function _We(t){var A,e,i={autoUpdate:!0},n=t,o=a=>SA(SA(SA({},i),t||{}),a||{}),r=a=>{A&&e&&(n=o(a),((c,l,d)=>{var C=new Map,I=SA({platform:bWe},d),u=SA(SA({},I.platform),{},{_c:C});return IWe(c,l,SA(SA({},I),{},{platform:u}))})(A,e,n).then(c=>{var l;Object.assign(e.style,{position:c.strategy,left:"".concat(c.x,"px"),top:"".concat(c.y,"px")}),!((l=n)===null||l===void 0)&&l.onComputed&&n.onComputed(c)}))},s=a=>{gg(a.subscribe(c=>{A===void 0?(A=c,r()):(Object.assign(A,c),r())}))};return[a=>{if("subscribe"in a)return s(a),{};A=a,r()},(a,c)=>{var l;e=a,n=o(c),setTimeout(()=>r(c),0),r(c);var d=()=>{l&&(l(),l=void 0)},C=function(){var{autoUpdate:I}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:n||{};d(),I!==!1&&function(){return O2e.apply(this,arguments)}().then(()=>MWe(A,e,()=>r(n),I===!0?{}:I))};return l=C(),{update(I){r(I),l=C(I)},destroy(){d()}}},r]}function RWe(t){var{loadOptions:A,filterText:e,items:i,multiple:n,value:o,itemId:r,groupBy:s,filterSelectedItems:a,itemFilter:c,convertStringItemsToObjects:l,filterGroupedItems:d,label:C}=t;if(i&&A)return i;if(!i)return[];i&&i.length>0&&typeof i[0]!="object"&&(i=l(i));var I=i.filter(u=>{var h=c(u[C],e,u);return h&&n&&o!=null&&o.length&&(h=!o.some(B=>!!a&&B[r]===u[r])),h});return s&&(I=d(I)),I}function NWe(t){return J1e.apply(this,arguments)}function J1e(){return(J1e=Vt(function*(t){var{dispatch:A,loadOptions:e,convertStringItemsToObjects:i,filterText:n}=t,o=yield e(n).catch(r=>{console.warn("svelte-select loadOptions error :>> ",r),A("error",{type:"loadOptions",details:r})});if(o&&!o.cancelled)return o?(o&&o.length>0&&typeof o[0]!="object"&&(o=i(o)),A("loaded",{items:o})):o=[],{filteredItems:o,loading:!1,focused:!0,listOpen:!0}})).apply(this,arguments)}Zt(` + svg.svelte-qbd276 { + width: var(--chevron-icon-width, 20px); + height: var(--chevron-icon-width, 20px); + color: var(--chevron-icon-colour, currentColor); + } +`);var LWe=sI(``);Zt(` + svg.svelte-whdbu1 { + width: var(--clear-icon-width, 20px); + height: var(--clear-icon-width, 20px); + color: var(--clear-icon-color, currentColor); + } +`);var FWe=sI(``);function FJ(t){he(t,FWe())}Zt(` + .loading.svelte-1p3nqvd { + width: var(--spinner-width, 20px); + height: var(--spinner-height, 20px); + color: var(--spinner-color, var(--icons-color)); + animation: svelte-1p3nqvd-rotate 0.75s linear infinite; + transform-origin: center center; + transform: none; + } + + .circle_path.svelte-1p3nqvd { + stroke-dasharray: 90; + stroke-linecap: round; + } + + @keyframes svelte-1p3nqvd-rotate { + 100% { + transform: rotate(360deg); + } + } +`);var GWe=sI('');Zt(` + .svelte-select.svelte-82qwg8 { + /* deprecating camelCase custom props in favour of kebab-case for v5 */ + --borderRadius: var(--border-radius); + --clearSelectColor: var(--clear-select-color); + --clearSelectWidth: var(--clear-select-width); + --disabledBackground: var(--disabled-background); + --disabledBorderColor: var(--disabled-border-color); + --disabledColor: var(--disabled-color); + --disabledPlaceholderColor: var(--disabled-placeholder-color); + --disabledPlaceholderOpacity: var(--disabled-placeholder-opacity); + --errorBackground: var(--error-background); + --errorBorder: var(--error-border); + --groupItemPaddingLeft: var(--group-item-padding-left); + --groupTitleColor: var(--group-title-color); + --groupTitleFontSize: var(--group-title-font-size); + --groupTitleFontWeight: var(--group-title-font-weight); + --groupTitlePadding: var(--group-title-padding); + --groupTitleTextTransform: var(--group-title-text-transform); + --groupTitleBorderColor: var(--group-title-border-color); + --groupTitleBorderWidth: var(--group-title-border-width); + --groupTitleBorderStyle: var(--group-title-border-style); + --indicatorColor: var(--chevron-color); + --indicatorHeight: var(--chevron-height); + --indicatorWidth: var(--chevron-width); + --inputColor: var(--input-color); + --inputLeft: var(--input-left); + --inputLetterSpacing: var(--input-letter-spacing); + --inputMargin: var(--input-margin); + --inputPadding: var(--input-padding); + --itemActiveBackground: var(--item-active-background); + --itemColor: var(--item-color); + --itemFirstBorderRadius: var(--item-first-border-radius); + --itemHoverBG: var(--item-hover-bg); + --itemHoverColor: var(--item-hover-color); + --itemIsActiveBG: var(--item-is-active-bg); + --itemIsActiveColor: var(--item-is-active-color); + --itemIsNotSelectableColor: var(--item-is-not-selectable-color); + --itemPadding: var(--item-padding); + --listBackground: var(--list-background); + --listBorder: var(--list-border); + --listBorderRadius: var(--list-border-radius); + --listEmptyColor: var(--list-empty-color); + --listEmptyPadding: var(--list-empty-padding); + --listEmptyTextAlign: var(--list-empty-text-align); + --listMaxHeight: var(--list-max-height); + --listPosition: var(--list-position); + --listShadow: var(--list-shadow); + --listZIndex: var(--list-z-index); + --multiItemBG: var(--multi-item-bg); + --multiItemBorderRadius: var(--multi-item-border-radius); + --multiItemDisabledHoverBg: var(--multi-item-disabled-hover-bg); + --multiItemDisabledHoverColor: var(--multi-item-disabled-hover-color); + --multiItemHeight: var(--multi-item-height); + --multiItemMargin: var(--multi-item-margin); + --multiItemPadding: var(--multi-item-padding); + --multiSelectInputMargin: var(--multi-select-input-margin); + --multiSelectInputPadding: var(--multi-select-input-padding); + --multiSelectPadding: var(--multi-select-padding); + --placeholderColor: var(--placeholder-color); + --placeholderOpacity: var(--placeholder-opacity); + --selectedItemPadding: var(--selected-item-padding); + --spinnerColor: var(--spinner-color); + --spinnerHeight: var(--spinner-height); + --spinnerWidth: var(--spinner-width); + + --internal-padding: 0 0 0 16px; + + border: var(--border, 1px solid #d8dbdf); + border-radius: var(--border-radius, 6px); + min-height: var(--height, 42px); + position: relative; + display: flex; + align-items: stretch; + padding: var(--padding, var(--internal-padding)); + background: var(--background, #fff); + margin: var(--margin, 0); + width: var(--width, 100%); + font-size: var(--font-size, 16px); + max-height: var(--max-height); + } + + .svelte-82qwg8 { + box-sizing: var(--box-sizing, border-box); + } + + .svelte-select.svelte-82qwg8:hover { + border: var(--border-hover, 1px solid #b2b8bf); + } + + .value-container.svelte-82qwg8 { + display: flex; + flex: 1 1 0%; + flex-wrap: wrap; + align-items: center; + gap: 5px 10px; + padding: var(--value-container-padding, 5px 0); + position: relative; + overflow: var(--value-container-overflow, hidden); + align-self: stretch; + } + + .prepend.svelte-82qwg8, + .indicators.svelte-82qwg8 { + display: flex; + flex-shrink: 0; + align-items: center; + } + + .indicators.svelte-82qwg8 { + position: var(--indicators-position); + top: var(--indicators-top); + right: var(--indicators-right); + bottom: var(--indicators-bottom); + } + + input.svelte-82qwg8 { + position: absolute; + cursor: default; + border: none; + color: var(--input-color, var(--item-color)); + padding: var(--input-padding, 0); + letter-spacing: var(--input-letter-spacing, inherit); + margin: var(--input-margin, 0); + min-width: 10px; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: transparent; + font-size: var(--font-size, 16px); + } + + .svelte-82qwg8:not(.multi) > .value-container:where(.svelte-82qwg8) > input:where(.svelte-82qwg8) { + width: 100%; + height: 100%; + } + + input.svelte-82qwg8::placeholder { + color: var(--placeholder-color, #78848f); + opacity: var(--placeholder-opacity, 1); + } + + input.svelte-82qwg8:focus { + outline: none; + } + + .svelte-select.focused.svelte-82qwg8 { + border: var(--border-focused, 1px solid #006fe8); + border-radius: var(--border-radius-focused, var(--border-radius, 6px)); + } + + .disabled.svelte-82qwg8 { + background: var(--disabled-background, #ebedef); + border-color: var(--disabled-border-color, #ebedef); + color: var(--disabled-color, #c1c6cc); + } + + .disabled.svelte-82qwg8 input:where(.svelte-82qwg8)::placeholder { + color: var(--disabled-placeholder-color, #c1c6cc); + opacity: var(--disabled-placeholder-opacity, 1); + } + + .selected-item.svelte-82qwg8 { + position: relative; + overflow: var(--selected-item-overflow, hidden); + padding: var(--selected-item-padding, 0 20px 0 0); + text-overflow: ellipsis; + white-space: nowrap; + color: var(--selected-item-color, inherit); + font-size: var(--font-size, 16px); + } + + .multi.svelte-82qwg8 .selected-item:where(.svelte-82qwg8) { + position: absolute; + line-height: var(--height, 42px); + height: var(--height, 42px); + } + + .selected-item.svelte-82qwg8:focus { + outline: none; + } + + .hide-selected-item.svelte-82qwg8 { + opacity: 0; + } + + .icon.svelte-82qwg8 { + display: flex; + align-items: center; + justify-content: center; + } + + .clear-select.svelte-82qwg8 { + all: unset; + display: flex; + align-items: center; + justify-content: center; + width: var(--clear-select-width, 40px); + height: var(--clear-select-height, 100%); + color: var(--clear-select-color, var(--icons-color)); + margin: var(--clear-select-margin, 0); + pointer-events: all; + flex-shrink: 0; + } + + .clear-select.svelte-82qwg8:focus { + outline: var(--clear-select-focus-outline, 1px solid #006fe8); + } + + .loading.svelte-82qwg8 { + width: var(--loading-width, 40px); + height: var(--loading-height); + color: var(--loading-color, var(--icons-color)); + margin: var(--loading--margin, 0); + flex-shrink: 0; + } + + .chevron.svelte-82qwg8 { + width: var(--chevron-width, 40px); + height: var(--chevron-height, 40px); + background: var(--chevron-background, transparent); + pointer-events: var(--chevron-pointer-events, none); + color: var(--chevron-color, var(--icons-color)); + border: var(--chevron-border, 0 0 0 1px solid #d8dbdf); + flex-shrink: 0; + } + + .multi.svelte-82qwg8 { + padding: var(--multi-select-padding, var(--internal-padding)); + } + + .multi.svelte-82qwg8 input:where(.svelte-82qwg8) { + padding: var(--multi-select-input-padding, 0); + position: relative; + margin: var(--multi-select-input-margin, 5px 0); + flex: 1 1 40px; + } + + .svelte-select.error.svelte-82qwg8 { + border: var(--error-border, 1px solid #ff2d55); + background: var(--error-background, #fff); + } + + .a11y-text.svelte-82qwg8 { + z-index: 9999; + border: 0px; + clip: rect(1px, 1px, 1px, 1px); + height: 1px; + width: 1px; + position: absolute; + overflow: hidden; + padding: 0px; + white-space: nowrap; + } + + .multi-item.svelte-82qwg8 { + background: var(--multi-item-bg, #ebedef); + margin: var(--multi-item-margin, 0); + outline: var(--multi-item-outline, 1px solid #ddd); + border-radius: var(--multi-item-border-radius, 4px); + height: var(--multi-item-height, 25px); + line-height: var(--multi-item-height, 25px); + display: flex; + cursor: default; + padding: var(--multi-item-padding, 0 5px); + overflow: hidden; + gap: var(--multi-item-gap, 4px); + outline-offset: -1px; + max-width: var(--multi-max-width, none); + color: var(--multi-item-color, var(--item-color)); + } + + .multi-item.disabled.svelte-82qwg8:hover { + background: var(--multi-item-disabled-hover-bg, #ebedef); + color: var(--multi-item-disabled-hover-color, #c1c6cc); + } + + .multi-item-text.svelte-82qwg8 { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .multi-item-clear.svelte-82qwg8 { + display: flex; + align-items: center; + justify-content: center; + --clear-icon-color: var(--multi-item-clear-icon-color, #000); + } + + .multi-item.active.svelte-82qwg8 { + outline: var(--multi-item-active-outline, 1px solid #006fe8); + } + + .svelte-select-list.svelte-82qwg8 { + box-shadow: var(--list-shadow, 0 2px 3px 0 rgba(44, 62, 80, 0.24)); + border-radius: var(--list-border-radius, 4px); + max-height: var(--list-max-height, 252px); + overflow-y: auto; + background: var(--list-background, #fff); + position: var(--list-position, absolute); + z-index: var(--list-z-index, 2); + border: var(--list-border); + } + + .prefloat.svelte-82qwg8 { + opacity: 0; + pointer-events: none; + } + + .list-group-title.svelte-82qwg8 { + color: var(--group-title-color, #8f8f8f); + cursor: default; + font-size: var(--group-title-font-size, 16px); + font-weight: var(--group-title-font-weight, 600); + height: var(--height, 42px); + line-height: var(--height, 42px); + padding: var(--group-title-padding, 0 20px); + text-overflow: ellipsis; + overflow-x: hidden; + white-space: nowrap; + text-transform: var(--group-title-text-transform, uppercase); + border-width: var(--group-title-border-width, medium); + border-style: var(--group-title-border-style, none); + border-color: var(--group-title-border-color, color); + } + + .empty.svelte-82qwg8 { + text-align: var(--list-empty-text-align, center); + padding: var(--list-empty-padding, 20px 0); + color: var(--list-empty-color, #78848f); + } + + .item.svelte-82qwg8 { + cursor: default; + height: var(--item-height, var(--height, 42px)); + line-height: var(--item-line-height, var(--height, 42px)); + padding: var(--item-padding, 0 20px); + color: var(--item-color, inherit); + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + transition: var(--item-transition, all 0.2s); + align-items: center; + width: 100%; + } + + .item.group-item.svelte-82qwg8 { + padding-left: var(--group-item-padding-left, 40px); + } + + .item.svelte-82qwg8:active { + background: var(--item-active-background, #b9daff); + } + + .item.active.svelte-82qwg8 { + background: var(--item-is-active-bg, #007aff); + color: var(--item-is-active-color, #fff); + } + + .item.first.svelte-82qwg8 { + border-radius: var(--item-first-border-radius, 4px 4px 0 0); + } + + .item.hover.svelte-82qwg8:not(.active) { + background: var(--item-hover-bg, #e7f2ff); + color: var(--item-hover-color, inherit); + } + + .item.not-selectable.svelte-82qwg8, + .item.hover.item.not-selectable.svelte-82qwg8, + .item.active.item.not-selectable.svelte-82qwg8, + .item.not-selectable.svelte-82qwg8:active { + color: var(--item-is-not-selectable-color, #999); + background: transparent; + } + + .required.svelte-82qwg8 { + opacity: 0; + z-index: -1; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + } +`);var KWe=_e('
    '),UWe=_e('
    No options
    '),TWe=_e('
    '),OWe=_e(' ',1),JWe=_e('
    '),YWe=_e('
    '),HWe=_e("
    "),zWe=_e(''),PWe=_e(''),jWe=_e(''),VWe=_e(''),qWe=_e(''),WWe=_e('
    ');function eh(t,A){var e=function(fe){var ke={};for(var Xe in fe.children&&(ke.default=!0),fe.$$slots)ke[Xe]=!0;return ke}(A);St(A,!1);var i,n=Ce(),o=Ce(),r=Ce(),s=Ce(),a=Ce(),c=Ce(),l=Ce(),d=Ce(),C=Ce(),I=OVe(),u=N(A,"justValue",12,null),h=N(A,"filter",8,RWe),B=N(A,"getItems",8,NWe),f=N(A,"id",8,null),b=N(A,"name",8,null),k=N(A,"container",12,void 0),S=N(A,"input",12,void 0),w=N(A,"multiple",8,!1),_=N(A,"multiFullItemClearable",8,!1),K=N(A,"disabled",8,!1),J=N(A,"focused",12,!1),O=N(A,"value",12,null),H=N(A,"filterText",12,""),V=N(A,"placeholder",8,"Please select"),Z=N(A,"placeholderAlwaysShow",8,!1),ye=N(A,"items",12,null),P=N(A,"label",8,"label"),se=N(A,"itemFilter",8,(fe,ke,Xe)=>"".concat(fe).toLowerCase().includes(ke.toLowerCase())),X=N(A,"groupBy",8,void 0),ue=N(A,"groupFilter",8,fe=>fe),oe=N(A,"groupHeaderSelectable",8,!1),le=N(A,"itemId",8,"value"),me=N(A,"loadOptions",8,void 0),Te=N(A,"containerStyles",8,""),$e=N(A,"hasError",8,!1),Je=N(A,"filterSelectedItems",8,!0),Qe=N(A,"required",8,!1),He=N(A,"closeListOnChange",8,!0),PA=N(A,"clearFilterTextOnBlur",8,!0),JA=N(A,"createGroupHeaderItem",8,(fe,ke)=>({value:fe,[P()]:fe})),Ye=()=>g(l),Ie=N(A,"searchable",8,!0),We=N(A,"inputStyles",8,""),we=N(A,"clearable",8,!0),Ze=N(A,"loading",12,!1),Ge=N(A,"listOpen",12,!1),LA=N(A,"debounce",8,function(fe){var ke=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1;clearTimeout(i),i=setTimeout(fe,ke)}),Fe=N(A,"debounceWait",8,300),pe=N(A,"hideEmptyState",8,!1),Wt=N(A,"inputAttributes",24,()=>({})),Qt=N(A,"listAutoWidth",8,!0),BA=N(A,"showChevron",8,!1),_t=N(A,"listOffset",8,5),VA=N(A,"hoverItemIndex",12,0),YA=N(A,"floatingConfig",24,()=>({})),Jt=N(A,"class",8,""),KA=Ce(),di=Ce(),G=Ce(),z=Ce(),Ae=Ce();function de(fe){return fe.map((ke,Xe)=>({index:Xe,value:ke,label:"".concat(ke)}))}function Ne(fe){var ke=[],Xe={};fe.forEach(Gt=>{var $t=X()(Gt);ke.includes($t)||(ke.push($t),Xe[$t]=[],$t&&Xe[$t].push(Object.assign(JA()($t,Gt),{id:$t,groupHeader:!0,selectable:oe()}))),Xe[$t].push(Object.assign({groupItem:!!$t},Gt))});var qA=[];return ue()(ke).forEach(Gt=>{Xe[Gt]&&qA.push(...Xe[Gt])}),qA}function pA(){var fe=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0,ke=arguments.length>1?arguments[1]:void 0;VA(fe<0?0:fe),!ke&&X()&&g(l)[VA()]&&!g(l)[VA()].selectable&&Di(1)}function vA(){var fe=!0;if(O()){var ke=[],Xe=[];O().forEach(qA=>{ke.includes(qA[le()])?fe=!1:(ke.push(qA[le()]),Xe.push(qA))}),fe||O(Xe)}return fe}function Ke(fe){var ke=fe?fe[le()]:O()[le()];return ye().find(Xe=>Xe[le()]===ke)}function Re(fe){return wt.apply(this,arguments)}function wt(){return(wt=Vt(function*(fe){var ke=O()[fe];O().length===1?O(void 0):O(O().filter(Xe=>Xe!==ke)),I("clear",ke)})).apply(this,arguments)}function st(fe){if(J())switch(fe.stopPropagation(),fe.key){case"Escape":fe.preventDefault(),HA();break;case"Enter":if(fe.preventDefault(),Ge()){if(g(l).length===0)break;var ke=g(l)[VA()];if(O()&&!w()&&O()[le()]===ke[le()]){HA();break}L(g(l)[VA()])}break;case"ArrowDown":fe.preventDefault(),Ge()?Di(1):(Ge(!0),x(KA,void 0));break;case"ArrowUp":fe.preventDefault(),Ge()?Di(-1):(Ge(!0),x(KA,void 0));break;case"Tab":if(Ge()&&J()){if(g(l).length===0||O()&&O()[le()]===g(l)[VA()][le()])return HA();fe.preventDefault(),L(g(l)[VA()]),HA()}break;case"Backspace":if(!w()||H().length>0)return;if(w()&&O()&&O().length>0){if(Re(g(KA)!==void 0?g(KA):O().length-1),g(KA)===0||g(KA)===void 0)break;x(KA,O().length>g(KA)?g(KA)-1:void 0)}break;case"ArrowLeft":if(!O()||!w()||H().length>0)return;g(KA)===void 0?x(KA,O().length-1):O().length>g(KA)&&g(KA)!==0&&x(KA,g(KA)-1);break;case"ArrowRight":if(!O()||!w()||H().length>0||g(KA)===void 0)return;g(KA)===O().length-1?x(KA,void 0):g(KA)0?Ge(!0):void Ge(!Ge())}function dn(){I("clear",O()),O(void 0),HA(),nA()}function HA(){PA()&&H(""),Ge(!1)}JVe(Vt(function*(){x(di,O()),x(G,H()),x(z,w())})),ua(()=>{Ge()&&J(!0),J()&&S()&&S().focus()});var Cn=N(A,"ariaValues",8,fe=>"Option ".concat(fe,", selected.")),Gi=N(A,"ariaListOpen",8,(fe,ke)=>"You are currently focused on option ".concat(fe,". There are ").concat(ke," results available.")),oi=N(A,"ariaFocused",8,()=>"Select is focused, type to refine list, press down to open the menu."),Yt,xi=Ce(null);function Pi(){clearTimeout(Yt),Yt=setTimeout(()=>{Xt=!1},100)}gg(()=>{var fe;(fe=g(xi))===null||fe===void 0||fe.remove()});var Xt=!1;function L(fe){fe&&fe.selectable!==!1&&function(ke){if(ke){H("");var Xe=Object.assign({},ke);if(Xe.groupHeader&&!Xe.selectable)return;O(w()?O()?O().concat([Xe]):[Xe]:O(Xe)),setTimeout(()=>{He()&&HA(),x(KA,void 0),I("change",O()),I("select",ke)})}}(fe)}function ct(fe){Xt||VA(fe)}function Di(fe){if(g(l).filter(Xe=>!Object.hasOwn(Xe,"selectable")||Xe.selectable===!0).length===0)return VA(0);fe>0&&VA()===g(l).length-1?VA(0):fe<0&&VA()===0?VA(g(l).length-1):VA(VA()+fe);var ke=g(l)[VA()];ke&&ke.selectable===!1&&(fe!==1&&fe!==-1||Di(fe))}function mn(fe,ke,Xe){if(!w())return ke&&ke[Xe]===fe[Xe]}var pn=$o,so=$o;function $o(fe){return{update(ke){ke.scroll&&(Pi(),fe.scrollIntoView({behavior:"auto",block:"nearest"}))}}}var Ao=Ce({strategy:"absolute",placement:"bottom-start",middleware:[SWe(_t()),xWe(),kWe()],autoUpdate:!1}),[Fn,Qr,mr]=_We(g(Ao)),zo=Ce(!0);Se(()=>(F(ye()),F(O())),()=>{ye(),O()&&function(){if(typeof O()=="string"){var fe=(ye()||[]).find(ke=>ke[le()]===O());O(fe||{[le()]:O(),label:O()})}else w()&&Array.isArray(O())&&O().length>0&&O(O().map(ke=>typeof ke=="string"?{value:ke,label:ke}:ke))}()}),Se(()=>(F(Wt()),F(Ie())),()=>{!Wt()&&Ie()||(x(Ae,Object.assign({autocapitalize:"none",autocomplete:"off",autocorrect:"off",spellcheck:!1,tabindex:0,type:"text","aria-autocomplete":"list"},Wt())),f()&&vl(Ae,g(Ae).id=f()),Ie()||vl(Ae,g(Ae).readonly=!0))}),Se(()=>F(w()),()=>{w()&&O()&&(Array.isArray(O())?O([...O()]):O([O()]))}),Se(()=>(g(z),F(w())),()=>{g(z)&&!w()&&O()&&O(null)}),Se(()=>(F(w()),F(O())),()=>{w()&&O()&&O().length>1&&vA()}),Se(()=>F(O()),()=>{O()&&(w()?JSON.stringify(O())!==JSON.stringify(g(di))&&vA()&&I("input",O()):g(di)&&JSON.stringify(O()[le()])===JSON.stringify(g(di)[le()])||I("input",O()))}),Se(()=>(F(O()),F(w()),g(di)),()=>{!O()&&w()&&g(di)&&I("input",O())}),Se(()=>(F(J()),F(S())),()=>{!J()&&S()&&HA()}),Se(()=>(F(H()),g(G)),()=>{H()!==g(G)&&(me()||H().length!==0)&&(me()?LA()(Vt(function*(){Ze(!0);var fe=yield B()({dispatch:I,loadOptions:me(),convertStringItemsToObjects:de,filterText:H()});fe?(Ze(fe.loading),Ge(Ge()?fe.listOpen:H().length>0),J(Ge()&&fe.focused),ye(X()?Ne(fe.filteredItems):fe.filteredItems)):(Ze(!1),J(!0),Ge(!0))}),Fe()):(Ge(!0),w()&&x(KA,void 0)))}),Se(()=>(F(h()),F(me()),F(H()),F(ye()),F(w()),F(O()),F(le()),F(X()),F(P()),F(Je()),F(se())),()=>{x(l,h()({loadOptions:me(),filterText:H(),items:ye(),multiple:w(),value:O(),itemId:le(),groupBy:X(),label:P(),filterSelectedItems:Je(),itemFilter:se(),convertStringItemsToObjects:de,filterGroupedItems:Ne}))}),Se(()=>(F(w()),F(Ge()),F(O()),g(l)),()=>{!w()&&Ge()&&O()&&g(l)&&pA(g(l).findIndex(fe=>fe[le()]===O()[le()]),!0)}),Se(()=>(F(Ge()),F(w())),()=>{Ge()&&w()&&VA(0)}),Se(()=>F(H()),()=>{H()&&VA(0)}),Se(()=>F(VA()),()=>{var fe;fe=VA(),I("hoverItem",fe)}),Se(()=>(F(w()),F(O())),()=>{x(n,w()?O()&&O().length>0:O())}),Se(()=>(g(n),F(H())),()=>{x(o,g(n)&&H().length>0)}),Se(()=>(g(n),F(we()),F(K()),F(Ze())),()=>{x(r,g(n)&&we()&&!K()&&!Ze())}),Se(()=>(F(Z()),F(w()),F(V()),F(O())),()=>{var fe;x(s,Z()&&w()||w()&&((fe=O())===null||fe===void 0?void 0:fe.length)===0?V():O()?"":V())}),Se(()=>(F(O()),F(w())),()=>{var fe,ke;x(a,O()?(fe=w(),ke=void 0,ke=fe&&O().length>0?O().map(Xe=>Xe[P()]).join(", "):O()[P()],Cn()(ke)):"")}),Se(()=>(g(l),F(VA()),F(J()),F(Ge())),()=>{x(c,function(){if(!g(l)||g(l).length===0)return"";var fe=g(l)[VA()];if(Ge()&&fe){var ke=g(l)?g(l).length:0;return Gi()(fe[P()],ke)}return oi()()}((g(l),VA(),J(),Ge())))}),Se(()=>F(ye()),()=>{(function(fe){fe&&fe.length!==0&&!fe.some(ke=>typeof ke!="object")&&O()&&(w()?!O().some(ke=>!ke||!ke[le()]):O()[le()])&&(Array.isArray(O())?O(O().map(ke=>Ke(ke)||ke)):O(Ke()||O()))})(ye())}),Se(()=>(F(w()),F(O()),F(le())),()=>{u((w(),O(),le(),w()?O()?O().map(fe=>fe[le()]):null:O()?O()[le()]:O()))}),Se(()=>(F(w()),g(di),F(O())),()=>{w()||!g(di)||O()||I("input",O())}),Se(()=>(F(Ge()),g(l),F(w()),F(O())),()=>{Ge()&&g(l)&&!w()&&!O()&&pA()}),Se(()=>g(l),()=>{(function(fe){Ge()&&I("filter",fe)})(g(l))}),Se(()=>(F(k()),F(YA()),g(Ao)),()=>{k()&&YA()&&mr(Object.assign(g(Ao),YA()))}),Se(()=>g(xi),()=>{x(d,!!g(xi))}),Se(()=>(g(xi),F(Ge())),()=>{(function(fe,ke){if(!fe||!ke)return x(zo,!0);setTimeout(()=>{x(zo,!1)},0)})(g(xi),Ge())}),Se(()=>(F(Ge()),F(k()),g(xi)),()=>{Ge()&&k()&&g(xi)&&function(){var{width:fe}=k().getBoundingClientRect();vl(xi,g(xi).style.width=Qt()?fe+"px":"auto")}()}),Se(()=>F(VA()),()=>{x(C,VA())}),Se(()=>(F(S()),F(Ge()),F(J())),()=>{S()&&Ge()&&!J()&&nA()}),Se(()=>(F(k()),F(YA())),()=>{var fe;k()&&((fe=YA())===null||fe===void 0?void 0:fe.autoUpdate)===void 0&&vl(Ao,g(Ao).autoUpdate=!0)}),Nn(),li();var On,ho=WWe();QA("click",V2,function(fe){var ke;Ge()||J()||!k()||k().contains(fe.target)||(ke=g(xi))!==null&&ke!==void 0&&ke.contains(fe.target)||Bt()}),QA("keydown",V2,st);var sA=ge(ho),_i=fe=>{var ke,Xe=TWe(),qA=ge(Xe),Gt=Tt=>{var Xi=ar();Er(Ut(Xi),A,"list-prepend",{},null),he(Tt,Xi)};ze(qA,Tt=>{Be(()=>e["list-prepend"])&&Tt(Gt)});var $t=De(qA,2),Sn=Tt=>{var Xi=ar();Er(Ut(Xi),A,"list",{get filteredItems(){return g(l)}},null),he(Tt,Xi)},So=(Tt,Xi)=>{var to=Hn=>{var ZA=ar();fr(Ut(ZA),1,()=>g(l),Jr,(Ri,Ki,io)=>{var lr,ri=KWe(),fs=ge(ri);Er(ge(fs),A,"item",{get item(){return g(Ki)},index:io},Eo=>{var Q=Ss();xA(()=>xt(Q,(g(Ki),F(P()),Be(()=>{var D;return(D=g(Ki))===null||D===void 0?void 0:D[P()]})))),he(Eo,Q)}),Ka(fs,(Eo,Q)=>pn?.(Eo),()=>({scroll:mn(g(Ki),O(),le()),listDom:g(d)})),Ka(fs,(Eo,Q)=>so?.(Eo),()=>({scroll:g(C)===io,listDom:g(d)})),xA(Eo=>lr=ci(fs,1,"item svelte-82qwg8",null,lr,Eo),[()=>{var Eo,Q;return{"list-group-title":g(Ki).groupHeader,active:mn(g(Ki),O(),le()),first:(Q=io,Q===0),hover:VA()===io,"group-item":g(Ki).groupItem,"not-selectable":((Eo=g(Ki))===null||Eo===void 0?void 0:Eo.selectable)===!1}}],tA),QA("mouseover",ri,()=>ct(io)),QA("focus",ri,()=>ct(io)),QA("click",ri,O2(()=>function(Eo){var{item:Q,i:D}=Eo;if(Q?.selectable!==!1)return O()&&!w()&&O()[le()]===Q[le()]?HA():void(function(R){return R.groupHeader&&R.selectable||R.selectable||!R.hasOwnProperty("selectable")}(Q)&&(VA(D),L(Q)))}({item:g(Ki),i:io}))),QA("keydown",ri,TC(O2(function(Eo){kp.call(this,A,Eo)}))),he(Ri,ri)}),he(Hn,ZA)},vt=(Hn,ZA)=>{var Ri=Ki=>{var io=ar();Er(Ut(io),A,"empty",{},lr=>{he(lr,UWe())}),he(Ki,io)};ze(Hn,Ki=>{pe()||Ki(Ri)},ZA)};ze(Tt,Hn=>{g(l),Be(()=>g(l).length>0)?Hn(to):Hn(vt,!1)},Xi)};ze($t,Tt=>{Be(()=>e.list)?Tt(Sn):Tt(So,!1)});var kn=De($t,2),on=Tt=>{var Xi=ar();Er(Ut(Xi),A,"list-append",{},null),he(Tt,Xi)};ze(kn,Tt=>{Be(()=>e["list-append"])&&Tt(on)}),Ka(Xe,Tt=>Qr?.(Tt)),Ho(Xe,Tt=>x(xi,Tt),()=>g(xi)),zs(()=>QA("scroll",Xe,Pi)),zs(()=>QA("pointerup",Xe,TC(O2(function(Tt){kp.call(this,A,Tt)})))),zs(()=>QA("mousedown",Xe,TC(O2(function(Tt){kp.call(this,A,Tt)})))),xA(Tt=>ke=ci(Xe,1,"svelte-select-list svelte-82qwg8",null,ke,Tt),[()=>({prefloat:g(zo)})],tA),he(fe,Xe)};ze(sA,fe=>{Ge()&&fe(_i)});var Zi=De(sA,2),Jn=ge(Zi),Bo=fe=>{var ke=OWe(),Xe=Ut(ke),qA=ge(Xe),Gt=ge(De(Xe,2));xA(()=>{xt(qA,g(a)),xt(Gt,g(c))}),he(fe,ke)};ze(Jn,fe=>{J()&&fe(Bo)});var pr=De(Zi,2);Er(ge(pr),A,"prepend",{},null);var Mi=De(pr,2),Mo=ge(Mi),wr=fe=>{var ke=ar(),Xe=Ut(ke),qA=$t=>{var Sn=ar();fr(Ut(Sn),1,O,Jr,(So,kn,on)=>{var Tt,Xi=YWe(),to=ge(Xi);Er(ge(to),A,"selection",{get selection(){return g(kn)},index:on},ZA=>{var Ri=Ss();xA(()=>xt(Ri,(g(kn),F(P()),Be(()=>g(kn)[P()])))),he(ZA,Ri)});var vt=De(to,2),Hn=ZA=>{var Ri=JWe();Er(ge(Ri),A,"multi-clear-icon",{},Ki=>{FJ(Ki)}),QA("pointerup",Ri,TC(O2(()=>Re(on)))),he(ZA,Ri)};ze(vt,ZA=>{K()||_()||!FJ||ZA(Hn)}),xA(ZA=>Tt=ci(Xi,1,"multi-item svelte-82qwg8",null,Tt,ZA),[()=>({active:g(KA)===on,disabled:K()})],tA),QA("click",Xi,TC(()=>_()?Re(on):{})),QA("keydown",Xi,TC(O2(function(ZA){kp.call(this,A,ZA)}))),he(So,Xi)}),he($t,Sn)},Gt=$t=>{var Sn,So=HWe();Er(ge(So),A,"selection",{get selection(){return O()}},kn=>{var on=Ss();xA(()=>xt(on,(F(O()),F(P()),Be(()=>O()[P()])))),he(kn,on)}),xA(kn=>Sn=ci(So,1,"selected-item svelte-82qwg8",null,Sn,kn),[()=>({"hide-selected-item":g(o)})],tA),he($t,So)};ze(Xe,$t=>{w()?$t(qA):$t(Gt,!1)}),he(fe,ke)};ze(Mo,fe=>{g(n)&&fe(wr)});var yr=De(Mo,2);nM(yr,()=>SA(SA({readOnly:!Ie()},g(Ae)),{},{placeholder:g(s),style:We(),disabled:K()}),void 0,"svelte-82qwg8"),Ho(yr,fe=>S(fe),()=>S());var Nr=De(Mi,2),Mn=ge(Nr),wn=fe=>{var ke=zWe();Er(ge(ke),A,"loading-icon",{},Xe=>{(function(qA){he(qA,GWe())})(Xe)}),he(fe,ke)};ze(Mn,fe=>{Ze()&&fe(wn)});var Ft=De(Mn,2),Yn=fe=>{var ke=PWe();Er(ge(ke),A,"clear-icon",{},Xe=>{FJ(Xe)}),QA("click",ke,dn),he(fe,ke)};ze(Ft,fe=>{g(r)&&fe(Yn)});var Me=De(Ft,2),gA=fe=>{var ke=jWe();Er(ge(ke),A,"chevron-icon",{get listOpen(){return Ge()}},Xe=>{(function(qA){he(qA,LWe())})(Xe)}),he(fe,ke)};ze(Me,fe=>{BA()&&fe(gA)});var EA=De(Nr,2);Er(EA,A,"input-hidden",{get value(){return O()}},fe=>{var ke=VWe();xA(Xe=>{Rn(ke,"name",b()),ah(ke,Xe)},[()=>(F(O()),Be(()=>O()?JSON.stringify(O()):null))],tA),he(fe,ke)});var zA=De(EA,2),bA=fe=>{var ke=ar();Er(Ut(ke),A,"required",{get value(){return O()}},Xe=>{he(Xe,qWe())}),he(fe,ke)};return ze(zA,fe=>{F(Qe()),F(O()),Be(()=>Qe()&&(!O()||O().length===0))&&fe(bA)}),zs(()=>QA("pointerup",ho,TC(Qn))),Ho(ho,fe=>k(fe),()=>k()),Ka(ho,fe=>Fn?.(fe)),xA(fe=>{var ke;On=ci(ho,1,"svelte-select ".concat((ke=Jt())!==null&&ke!==void 0?ke:""),"svelte-82qwg8",On,fe),cg(ho,Te())},[()=>({multi:w(),disabled:K(),focused:J(),"list-open":Ge(),"show-chevron":BA(),error:$e()})],tA),QA("keydown",yr,st),QA("blur",yr,Bt),QA("focus",yr,nA),CM(yr,H),he(t,ho),jt(A,"getFilteredItems",Ye),jt(A,"handleClear",dn),kt({getFilteredItems:Ye,handleClear:dn})}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +table.jse-transform-wizard.svelte-qbze6z { + border-collapse: collapse; + border-spacing: 0; + width: 100%; +} +table.jse-transform-wizard.svelte-qbze6z input:where(.svelte-qbze6z) { + font-family: inherit; + font-size: inherit; +} +table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) th:where(.svelte-qbze6z) { + font-weight: normal; + text-align: left; + width: 60px; +} +table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) { + width: 100%; + display: flex; + flex-direction: row; + margin-bottom: calc(0.5 * var(--jse-padding, 10px)); +} +table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .svelte-select .multi-item { + align-items: center; +} +table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .svelte-select .value-container { + gap: 0 !important; +} +table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .svelte-select.jse-filter-path { + flex: 4; + margin-right: calc(0.5 * var(--jse-padding, 10px)); +} +table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .svelte-select.jse-filter-relation { + flex: 1.5; + margin-right: calc(0.5 * var(--jse-padding, 10px)); +} +table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .svelte-select.jse-sort-path { + flex: 3; + margin-right: calc(0.5 * var(--jse-padding, 10px)); +} +table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .svelte-select.jse-sort-direction { + flex: 1; +} +table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .svelte-select.jse-projection-paths { + flex: 1; +} +table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .svelte-select input { + box-sizing: border-box; +} +table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .jse-filter-value:where(.svelte-qbze6z) { + flex: 4; + padding: 4px 8px; + border: var(--jse-input-border, 1px solid #d8dbdf); + border-radius: var(--jse-input-radius, 3px); + outline: none; + background: var(--jse-input-background, var(--jse-background-color, #fff)); + color: inherit; +} +table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .jse-filter-value:where(.svelte-qbze6z):focus { + border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); +}`);var ZWe=_e('
    Filter
    Sort
    Pick
    ');function XWe(t,A){var e,i,n,o,r;St(A,!1);var s=Ce(void 0,!0),a=Ce(void 0,!0),c=Ce(void 0,!0),l=Ce(void 0,!0),d=Ce(void 0,!0),C=Ce(void 0,!0),I=Es("jsoneditor:TransformWizard"),u=N(A,"json",9),h=N(A,"queryOptions",29,()=>({})),B=N(A,"onChange",9),f=["==","!=","<","<=",">",">="].map(Je=>({value:Je,label:Je})),b=[{value:"asc",label:"ascending"},{value:"desc",label:"descending"}],k=Ce((e=h())!==null&&e!==void 0&&(e=e.filter)!==null&&e!==void 0&&e.path?YC(h().filter.path):void 0,!0),S=Ce((i=f.find(Je=>{var Qe;return Je.value===((Qe=h().filter)===null||Qe===void 0?void 0:Qe.relation)}))!==null&&i!==void 0?i:f[0],!0),w=Ce(((n=h())===null||n===void 0||(n=n.filter)===null||n===void 0?void 0:n.value)||"",!0),_=Ce((o=h())!==null&&o!==void 0&&(o=o.sort)!==null&&o!==void 0&&o.path?YC(h().sort.path):void 0,!0),K=Ce((r=b.find(Je=>{var Qe;return Je.value===((Qe=h().sort)===null||Qe===void 0?void 0:Qe.direction)}))!==null&&r!==void 0?r:b[0],!0);Se(()=>F(u()),()=>{x(s,Array.isArray(u()))}),Se(()=>(g(s),F(u())),()=>{x(a,g(s)?XJ(u()):[])}),Se(()=>(g(s),F(u())),()=>{x(c,g(s)?XJ(u(),!0):[])}),Se(()=>(g(a),YC),()=>{x(l,g(a).map(YC))}),Se(()=>(g(c),YC),()=>{x(d,g(c)?g(c).map(YC):[])}),Se(()=>(F(h()),g(d),wi),()=>{var Je;x(C,(Je=h())!==null&&Je!==void 0&&(Je=Je.projection)!==null&&Je!==void 0&&Je.paths&&g(d)?h().projection.paths.map(Qe=>g(d).find(He=>wi(He.value,Qe))).filter(Qe=>!!Qe):void 0)}),Se(()=>g(k),()=>{var Je,Qe,He;Qe=(Je=g(k))===null||Je===void 0?void 0:Je.value,wi((He=h())===null||He===void 0||(He=He.filter)===null||He===void 0?void 0:He.path,Qe)||(I("changeFilterPath",Qe),h(ra(h(),["filter","path"],Qe,!0)),B()(h()))}),Se(()=>g(S),()=>{var Je,Qe,He;Qe=(Je=g(S))===null||Je===void 0?void 0:Je.value,wi((He=h())===null||He===void 0||(He=He.filter)===null||He===void 0?void 0:He.relation,Qe)||(I("changeFilterRelation",Qe),h(ra(h(),["filter","relation"],Qe,!0)),B()(h()))}),Se(()=>g(w),()=>{var Je,Qe;Je=g(w),wi((Qe=h())===null||Qe===void 0||(Qe=Qe.filter)===null||Qe===void 0?void 0:Qe.value,Je)||(I("changeFilterValue",Je),h(ra(h(),["filter","value"],Je,!0)),B()(h()))}),Se(()=>g(_),()=>{var Je,Qe,He;Qe=(Je=g(_))===null||Je===void 0?void 0:Je.value,wi((He=h())===null||He===void 0||(He=He.sort)===null||He===void 0?void 0:He.path,Qe)||(I("changeSortPath",Qe),h(ra(h(),["sort","path"],Qe,!0)),B()(h()))}),Se(()=>g(K),()=>{var Je,Qe,He;Qe=(Je=g(K))===null||Je===void 0?void 0:Je.value,wi((He=h())===null||He===void 0||(He=He.sort)===null||He===void 0?void 0:He.direction,Qe)||(I("changeSortDirection",Qe),h(ra(h(),["sort","direction"],Qe,!0)),B()(h()))}),Se(()=>g(C),()=>{(function(Je){var Qe;wi((Qe=h())===null||Qe===void 0||(Qe=Qe.projection)===null||Qe===void 0?void 0:Qe.paths,Je)||(I("changeProjectionPaths",Je),h(ra(h(),["projection","paths"],Je,!0)),B()(h()))})(g(C)?g(C).map(Je=>Je.value):void 0)}),Nn(),li(!0);var J=ZWe(),O=ge(J),H=ge(O),V=De(ge(H)),Z=ge(V),ye=ge(Z);eh(ye,{class:"jse-filter-path",showChevron:!0,get items(){return g(l)},get value(){return g(k)},set value(Je){x(k,Je)},$$legacy:!0});var P=De(ye,2);eh(P,{class:"jse-filter-relation",showChevron:!0,clearable:!1,get items(){return f},get value(){return g(S)},set value(Je){x(S,Je)},$$legacy:!0});var se=De(P,2),X=De(H),ue=De(ge(X)),oe=ge(ue),le=ge(oe);eh(le,{class:"jse-sort-path",showChevron:!0,get items(){return g(l)},get value(){return g(_)},set value(Je){x(_,Je)},$$legacy:!0}),eh(De(le,2),{class:"jse-sort-direction",showChevron:!0,clearable:!1,get items(){return b},get value(){return g(K)},set value(Je){x(K,Je)},$$legacy:!0});var me=De(X),Te=De(ge(me)),$e=ge(Te);eh(ge($e),{class:"jse-projection-paths",multiple:!0,showChevron:!0,get items(){return g(d)},get value(){return g(C)},set value(Je){x(C,Je)},$$legacy:!0}),CM(se,()=>g(w),Je=>x(w,Je)),he(t,J),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-select-query-language.svelte-atm4um { + position: relative; + width: 32px; +} +.jse-select-query-language.svelte-atm4um .jse-select-query-language-container:where(.svelte-atm4um) { + position: absolute; + top: 0; + right: 0; + display: flex; + flex-direction: column; + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); +} +.jse-select-query-language.svelte-atm4um .jse-select-query-language-container:where(.svelte-atm4um) .jse-query-language:where(.svelte-atm4um) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + text-align: left; + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + white-space: nowrap; + color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); + background: var(--jse-context-menu-background, #656565); +} +.jse-select-query-language.svelte-atm4um .jse-select-query-language-container:where(.svelte-atm4um) .jse-query-language:where(.svelte-atm4um):hover { + background: var(--jse-context-menu-background-highlight, #7a7a7a); +}`);var $We=_e(''),eZe=_e('
    ');function AZe(t,A){St(A,!1);var e=N(A,"queryLanguages",8),i=N(A,"queryLanguageId",12),n=N(A,"onChangeQueryLanguage",8);li();var o=eZe();fr(ge(o),5,e,Jr,(r,s)=>{var a,c=$We(),l=ge(c),d=u=>{nn(u,{get data(){return QG}})},C=u=>{nn(u,{get data(){return mG}})};ze(l,u=>{g(s),F(i()),Be(()=>g(s).id===i())?u(d):u(C,!1)});var I=De(l);xA(u=>{var h;a=ci(c,1,"jse-query-language svelte-atm4um",null,a,u),Rn(c,"title",(g(s),Be(()=>"Select ".concat(g(s).name," as query language")))),xt(I," ".concat((g(s),(h=Be(()=>g(s).name))!==null&&h!==void 0?h:"")))},[()=>({selected:g(s).id===i()})],tA),QA("click",c,()=>{return u=g(s).id,i(u),void n()(u);var u}),he(r,c)}),he(t,o),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-header.svelte-1y24war { + display: flex; + background: var(--jse-theme-color, #3883fa); + color: var(--jse-menu-color, var(--jse-text-color-inverse, #fff)); +} +.jse-header.svelte-1y24war .jse-title:where(.svelte-1y24war) { + flex: 1; + padding: 5px; + vertical-align: middle; +} +.jse-header.svelte-1y24war button:where(.svelte-1y24war) { + border: none; + background: transparent; + min-width: 32px; + color: inherit; + cursor: pointer; +} +.jse-header.svelte-1y24war button:where(.svelte-1y24war):hover { + background: rgba(255, 255, 255, 0.1); +}`);var tZe=_e(''),iZe=_e('
    ');function vM(t,A){St(A,!1);var e=N(A,"title",9,"Modal"),i=N(A,"fullScreenButton",9,!1),n=N(A,"fullscreen",13,!1),o=N(A,"onClose",9,void 0);li(!0);var r=iZe(),s=ge(r),a=ge(s),c=De(s,2);Er(c,A,"actions",{},null);var l=De(c,2),d=I=>{var u=tZe(),h=ge(u),B=tA(()=>n()?soe:poe);nn(h,{get data(){return g(B)}}),QA("click",u,()=>n(!n())),he(I,u)};ze(l,I=>{i()&&I(d)});var C=De(l,2);nn(ge(C),{get data(){return r3}}),xA(()=>xt(a,e())),QA("click",C,()=>{var I;return(I=o())===null||I===void 0?void 0:I()}),he(t,r),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-config.svelte-1kpylsp { + border: none; + background: transparent; + min-width: 32px; + color: inherit; + cursor: pointer; +} +.jse-config.svelte-1kpylsp:hover { + background: rgba(255, 255, 255, 0.1); +} +.jse-config.hide.svelte-1kpylsp { + display: none; +}`);var nZe=_e(''),GJ=Es("jsoneditor:AutoScrollHandler");function n2e(t){var A,e;function i(s){return s<20?200:s<50?400:1200}function n(){if(t){var s=.05*(A||0);t.scrollTop+=s}}function o(s){e&&s===A||(r(),GJ("startAutoScroll",s),A=s,e=setInterval(n,50))}function r(){e&&(GJ("stopAutoScroll"),clearInterval(e),e=void 0,A=void 0)}return GJ("createAutoScrollHandler",t),{onDrag:function(s){if(t){var a=s.clientY,{top:c,bottom:l}=t.getBoundingClientRect();al?o(i(a-l)):r()}},onDragEnd:function(){r()}}}var oZe=(t,A,e,i)=>(t/=i/2)<1?e/2*t*t+A:-e/2*(--t*(t-2)-1)+A,Y1e=()=>{var t,A,e,i,n,o,r,s,a,c,l,d,C;function I(B){return B.getBoundingClientRect().top-(t.getBoundingClientRect?t.getBoundingClientRect().top:0)+e}function u(B){t.scrollTo?t.scrollTo(t.scrollLeft,B):t.scrollTop=B}function h(B){c||(c=B),u(o(l=B-c,e,s,a)),C=!0,l1&&arguments[1]!==void 0?arguments[1]:{};switch(a=1e3,n=f.offset||0,d=f.callback,o=f.easing||oZe,r=f.a11y||!1,typeof f.container){case"object":t=f.container;break;case"string":t=document.querySelector(f.container);break;default:t=window.document.documentElement}switch(e=t.scrollTop,typeof B){case"number":A=void 0,r=!1,i=e+B;break;case"object":i=I(A=B);break;case"string":A=document.querySelector(B),i=I(A)}switch(s=i-e+n,typeof f.duration){case"number":a=f.duration;break;case"function":a=f.duration(s)}C?c=0:requestAnimationFrame(h)}};function Yf(t,A){var e=Date.now(),i=t();return A(Date.now()-e),i}var Kf=Es("validation"),rZe={createObjectDocumentState:()=>({type:"object",properties:{}}),createArrayDocumentState:()=>({type:"array",items:[]}),createValueDocumentState:()=>({type:"value"})};function o2e(t,A,e,i){return JY(t,A,e,i,rZe)}function H1e(t,A,e,i){if(Kf("validateJSON"),!A)return[];if(e!==i){var n=e.stringify(t);return A(n!==void 0?i.parse(n):void 0)}return A(t)}function sZe(t,A,e,i){if(Kf("validateText"),t.length>104857600)return{validationErrors:[{path:[],message:"Validation turned off: the document is too large",severity:e0.info}]};if(t.length!==0)try{var n=Yf(()=>e.parse(t),a=>Kf("validate: parsed json in ".concat(a," ms")));if(!A)return;var o=e===i?n:Yf(()=>i.parse(t),a=>Kf("validate: parsed json with the validationParser in ".concat(a," ms"))),r=Yf(()=>A(o),a=>Kf("validate: validated json in ".concat(a," ms")));return An(r)?void 0:{validationErrors:r}}catch(a){var s=Yf(()=>function(c,l){if(c.length>Lqe)return!1;try{return l.parse(jl(c)),!0}catch{return!1}}(t,e),c=>Kf("validate: checked whether repairable in ".concat(c," ms")));return{parseError:Wf(t,a.message||a.toString()),isRepairable:s}}}var $b=Es("jsoneditor:FocusTracker");function qY(t){var A,{onMount:e,onDestroy:i,getWindow:n,hasFocus:o,onFocus:r,onBlur:s}=t,a=!1;function c(){var d=o();d&&(clearTimeout(A),a||($b("focus"),r(),a=d))}function l(){a&&(clearTimeout(A),A=setTimeout(()=>{o()||($b("blur"),a=!1,s())}))}e(()=>{$b("mount FocusTracker");var d=n();d&&(d.addEventListener("focusin",c,!0),d.addEventListener("focusout",l,!0))}),i(()=>{$b("destroy FocusTracker");var d=n();d&&(d.removeEventListener("focusin",c,!0),d.removeEventListener("focusout",l,!0))})}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-message.svelte-czprfx { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + padding: var(--jse-padding, 10px); + display: flex; + gap: var(--jse-padding, 10px); + flex-wrap: wrap; + align-items: stretch; +} +.jse-message.jse-success.svelte-czprfx { + background: var(--message-success-background, #9ac45d); + color: var(--jse-message-success-color, #fff); +} +.jse-message.svelte-czprfx .jse-text:where(.svelte-czprfx) { + display: flex; + flex: 1; + min-width: 60%; + align-items: center; +} +.jse-message.svelte-czprfx .jse-text.jse-clickable:where(.svelte-czprfx) { + cursor: pointer; +} +.jse-message.svelte-czprfx .jse-text.jse-clickable:where(.svelte-czprfx):hover { + background-color: rgba(255, 255, 255, 0.1); +} +.jse-message.jse-error.svelte-czprfx { + background: var(--jse-message-error-background, var(--jse-error-color, #ee5341)); + color: var(--jse-message-error-color, #fff); +} +.jse-message.jse-warning.svelte-czprfx { + background: var(--jse-message-warning-background, #ffde5c); + color: var(--jse-message-warning-color, #4d4d4d); +} +.jse-message.jse-info.svelte-czprfx { + background: var(--jse-message-info-background, #4f91ff); + color: var(--jse-message-info-color, #fff); +} +.jse-message.svelte-czprfx .jse-actions:where(.svelte-czprfx) { + display: flex; + gap: var(--jse-padding, 10px); +} +.jse-message.svelte-czprfx .jse-actions:where(.svelte-czprfx) button.jse-action:where(.svelte-czprfx) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-message-action-background, rgba(255, 255, 255, 0.2)); + color: inherit; + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); +} +.jse-message.svelte-czprfx .jse-actions:where(.svelte-czprfx) button.jse-action:where(.svelte-czprfx):hover { + background: var(--jse-message-action-background-highlight, rgba(255, 255, 255, 0.3)); +}`);var aZe=_e(''),cZe=_e('
    ');function Sl(t,A){St(A,!1);var e=N(A,"type",9,"success"),i=N(A,"icon",9,void 0),n=N(A,"message",9,void 0),o=N(A,"actions",25,()=>[]),r=N(A,"onClick",9,void 0),s=N(A,"onClose",9,void 0);s()&&gg(s()),li(!0);var a,c=cZe(),l=ge(c),d=ge(l),C=ge(d),I=h=>{nn(h,{get data(){return i()}})};ze(C,h=>{i()&&h(I)});var u=De(C);fr(De(l,2),5,o,Jr,(h,B)=>{var f=aZe(),b=ge(f),k=w=>{nn(w,{get data(){return g(B),Be(()=>g(B).icon)}})};ze(b,w=>{g(B),Be(()=>g(B).icon)&&w(k)});var S=De(b);xA(()=>{var w;Rn(f,"title",(g(B),Be(()=>g(B).title))),f.disabled=(g(B),Be(()=>g(B).disabled)),xt(S," ".concat((g(B),(w=Be(()=>g(B).text))!==null&&w!==void 0?w:"")))}),QA("click",f,()=>{g(B).onClick&&g(B).onClick()}),QA("mousedown",f,()=>{g(B).onMouseDown&&g(B).onMouseDown()}),he(h,f)}),xA(h=>{var B,f;ci(c,1,"jse-message jse-".concat((B=e())!==null&&B!==void 0?B:""),"svelte-czprfx"),a=ci(l,1,"jse-text svelte-czprfx",null,a,h),xt(u," ".concat((f=n())!==null&&f!==void 0?f:""))},[()=>({"jse-clickable":!!r()})],tA),QA("click",l,function(){r()&&r()()}),he(t,c),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-validation-errors-overview.svelte-1uindol { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + overflow: auto; + max-height: 25%; +} +.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) { + border-collapse: collapse; + width: 100%; +} +.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr:where(.svelte-1uindol) { + cursor: pointer; +} +.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr.jse-validation-error:where(.svelte-1uindol) { + background: var(--jse-message-error-background, var(--jse-error-color, #ee5341)); + color: var(--jse-message-error-color, #fff); +} +.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr.jse-validation-warning:where(.svelte-1uindol) { + background: var(--jse-message-warning-background, #ffde5c); + color: var(--jse-message-warning-color, #4d4d4d); +} +.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr.jse-validation-warning:where(.svelte-1uindol):hover { + filter: brightness(105%); +} +.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr.jse-validation-info:where(.svelte-1uindol) { + background: var(--jse-message-info-background, #4f91ff); + color: var(--jse-message-info-color, #fff); +} +.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr:where(.svelte-1uindol):hover { + filter: brightness(110%); +} +.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr:where(.svelte-1uindol) td:where(.svelte-1uindol) { + padding: 4px var(--jse-padding, 10px); + vertical-align: middle; +} +.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr:where(.svelte-1uindol) td.jse-validation-error-icon:where(.svelte-1uindol) { + width: 36px; + box-sizing: border-box; +} +.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr:where(.svelte-1uindol) td.jse-validation-error-action:where(.svelte-1uindol) { + width: 36px; + box-sizing: border-box; + padding: 0; +} +.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr:where(.svelte-1uindol) td.jse-validation-error-action:where(.svelte-1uindol) button.jse-validation-errors-collapse:where(.svelte-1uindol) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + width: 36px; + height: 26px; + cursor: pointer; +} +.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr:where(.svelte-1uindol) td.jse-validation-error-action:where(.svelte-1uindol) button.jse-validation-errors-collapse:where(.svelte-1uindol):hover { + background-color: rgba(255, 255, 255, 0.2); +} +.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr:where(.svelte-1uindol) td:where(.svelte-1uindol) div.jse-validation-errors-expand:where(.svelte-1uindol) { + display: inline-block; + position: relative; + top: 3px; +}`);var lZe=_e(''),gZe=_e(' '),dZe=_e(' '),CZe=_e('
    '),IZe=_e('
    '),uZe=_e('
    ');function WY(t,A){St(A,!1);var e=Ce(void 0,!0),i=N(A,"validationErrors",9),n=N(A,"selectError",9),o=Ce(!0,!0);function r(){x(o,!1)}function s(){x(o,!0)}Se(()=>F(i()),()=>{x(e,i().length)}),Nn(),li(!0);var a=ar(),c=Ut(a),l=d=>{var C=uZe(),I=ge(C),u=B=>{var f=CZe(),b=ge(f),k=ge(b);fr(k,1,()=>(F(IM),F(i()),F(jb),Be(()=>IM(i(),jb))),Jr,(_,K,J)=>{var O=gZe(),H=ge(O);nn(ge(H),{get data(){return hC}});var V=De(H),Z=ge(V),ye=De(V),P=ge(ye),se=ge(De(ye)),X=ue=>{var oe=lZe();nn(ge(oe),{get data(){return Boe}}),QA("click",oe,O2(r)),he(ue,oe)};ze(se,ue=>{F(i()),Be(()=>J===0&&i().length>1)&&ue(X)}),xA(ue=>{var oe;ci(O,1,"jse-validation-".concat((g(K),(oe=Be(()=>g(K).severity))!==null&&oe!==void 0?oe:"")),"svelte-1uindol"),xt(Z,ue),xt(P,(g(K),Be(()=>g(K).message)))},[()=>(F(Yc),g(K),Be(()=>Yc(g(K).path)))],tA),QA("click",O,()=>{setTimeout(()=>n()(g(K)))}),he(_,O)});var S=De(k),w=_=>{var K=dZe(),J=De(ge(K),2),O=ge(J);xA(()=>xt(O,"(and ".concat(g(e)-jb," more errors)"))),he(_,K)};ze(S,_=>{g(e)>jb&&_(w)}),he(B,f)},h=B=>{var f=IZe(),b=ge(f),k=ge(b),S=ge(k);nn(ge(S),{get data(){return hC}});var w=ge(De(S));nn(ge(De(w)),{get data(){return yG}}),xA(_=>{var K;ci(k,1,"jse-validation-".concat(_??""),"svelte-1uindol"),xt(w,"".concat((K=g(e))!==null&&K!==void 0?K:""," validation errors "))},[()=>(F(i()),Be(()=>{return _=i(),[e0.error,e0.warning,e0.info].find(K=>_.some(J=>J.severity===K));var _}))],tA),QA("click",k,s),he(B,f)};ze(I,B=>{g(o)||g(e)===1?B(u):B(h,!1)}),he(d,C)};ze(c,d=>{F(An),F(i()),Be(()=>!An(i()))&&d(l)}),he(t,a),kt()}function bM(t,A){if(t)return t.addEventListener("keydown",e),{destroy(){t.removeEventListener("keydown",e)}};function e(i){i.key==="Escape"&&(i.preventDefault(),i.stopPropagation(),A())}}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +dialog.jse-modal.svelte-1s9c2ql { + border-radius: 3px; + font-size: var(--jse-padding, 10px); + border: none; + padding: 0; + display: flex; + min-width: 0; + margin: auto; + overflow: visible; + transition: width 0.1s ease-in-out, height 0.1s ease-in-out; +} +dialog.jse-modal.jse-sort-modal.svelte-1s9c2ql { + width: 400px; +} +dialog.jse-modal.jse-repair-modal.svelte-1s9c2ql { + width: 600px; + height: 500px; +} +dialog.jse-modal.jse-jsoneditor-modal.svelte-1s9c2ql { + width: 800px; + height: 600px; +} +dialog.jse-modal.jse-transform-modal.svelte-1s9c2ql { + width: 1200px; + height: 800px; +} +dialog.jse-modal.jse-fullscreen.svelte-1s9c2ql { + width: 100%; + height: 100%; +} +dialog.jse-modal.svelte-1s9c2ql::backdrop { + background: var(--jse-overlay-background, rgba(0, 0, 0, 0.3)); +} +dialog.jse-modal[open].svelte-1s9c2ql { + animation: svelte-1s9c2ql-zoom 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); +} +dialog.jse-modal[open].svelte-1s9c2ql::backdrop { + animation: svelte-1s9c2ql-fade 0.2s ease-out; +} +dialog.jse-modal.svelte-1s9c2ql .jse-modal-inner:where(.svelte-1s9c2ql) { + flex: 1; + display: flex; + flex-direction: column; + min-width: 0; + min-height: 0; + padding: 0; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + line-height: normal; + background: var(--jse-modal-background, #f5f5f5); + color: var(--jse-text-color, #4d4d4d); +} +@keyframes svelte-1s9c2ql-zoom { + from { + transform: scale(0.95); + } + to { + transform: scale(1); + } +} +@keyframes svelte-1s9c2ql-fade { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +dialog.jse-modal.svelte-1s9c2ql .svelte-select { + --border: var(--jse-svelte-select-border, 1px solid #d8dbdf); + --item-is-active-bg: var(--jse-item-is-active-bg, #3883fa); + --border-radius: var(--jse-svelte-select-border-radius, 3px); + --background: var(--jse-svelte-select-background, #fff); + --padding: var(--jse-svelte-select-padding, 0 10px); + --multi-select-padding: var(--jse-svelte-select-multi-select-padding, 0 10px); + --font-size: var(--jse-svelte-select-font-size, var(--jse-font-size, 16px)); + --height: 36px; + --multi-item-height: 28px; + --multi-item-margin: 2px; + --multi-item-padding: 2px 8px; + --multi-item-border-radius: 6px; + --indicator-top: 8px; +}`);var hZe=_e('
    ');function jp(t,A){St(A,!1);var e=N(A,"className",8,void 0),i=N(A,"fullscreen",8,!1),n=N(A,"onClose",8),o=Ce();function r(){n()()}ua(()=>g(o).showModal()),gg(()=>g(o).close()),li();var s,a=hZe(),c=ge(a);Er(ge(c),A,"default",{},null),Ho(a,l=>x(o,l),()=>g(o)),zs(()=>QA("close",a,r)),zs(()=>{return QA("pointerdown",a,(l=r,function(){for(var d=arguments.length,C=new Array(d),I=0;IQA("cancel",a,TC(function(l){kp.call(this,A,l)}))),Ka(a,(l,d)=>bM?.(l,d),()=>r),xA((l,d)=>s=ci(a,1,l,"svelte-1s9c2ql",s,d),[()=>AI((F(o0),F(e()),Be(()=>o0("jse-modal",e())))),()=>({"jse-fullscreen":i()})],tA),he(t,a),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-modal-contents.svelte-189qksl { + flex: 1; + display: flex; + flex-direction: column; + padding: 20px; + overflow: auto; + min-width: 0; + min-height: 0; +} +.jse-modal-contents.svelte-189qksl .jse-actions:where(.svelte-189qksl) { + display: flex; + flex-direction: row; + justify-content: flex-end; + padding-top: var(--jse-padding, 10px); +} +.jse-modal-contents.svelte-189qksl .jse-actions:where(.svelte-189qksl) button.jse-primary:where(.svelte-189qksl) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); + color: var(--jse-button-primary-color, #fff); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-modal-contents.svelte-189qksl .jse-actions:where(.svelte-189qksl) button.jse-primary:where(.svelte-189qksl):hover { + background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); +} +.jse-modal-contents.svelte-189qksl .jse-actions:where(.svelte-189qksl) button.jse-primary:where(.svelte-189qksl):disabled { + background: var(--jse-button-primary-background-disabled, #9d9d9d); +} + +.jse-shortcuts.svelte-189qksl { + display: flex; + flex-wrap: wrap; + justify-content: space-around; + margin: calc(2 * var(--jse-padding, 10px)) 0; +} +.jse-shortcuts.svelte-189qksl .jse-shortcut:where(.svelte-189qksl) .jse-key:where(.svelte-189qksl) { + font-size: 200%; + color: var(--jse-theme-color, #3883fa); +}`);var BZe=_e('
    Clipboard permission is disabled by your browser. You can use:
    for copy
    for cut
    for paste
    ',1);function z1e(t,A){St(A,!1);var e=N(A,"onClose",9),i=NY()?"\u2318":"Ctrl";li(!0),jp(t,{get onClose(){return e()},className:"jse-copy-paste",children:(n,o)=>{var r=BZe(),s=Ut(r);vM(s,{title:"Copying and pasting",get onClose(){return e()}});var a=De(s,2),c=De(ge(a),2),l=ge(c),d=ge(l),C=ge(d),I=De(l,2),u=ge(I),h=ge(u),B=ge(De(I,2)),f=ge(B),b=ge(De(c,2));xA(()=>{xt(C,"".concat(i,"+C")),xt(h,"".concat(i,"+X")),xt(f,"".concat(i,"+V"))}),QA("click",b,function(){for(var k,S=arguments.length,w=new Array(S),_=0;_'),fZe=_e('
    '),QZe=_e(''),mZe=_e('
    ');function YM(t,A){St(A,!1);var e=N(A,"items",25,()=>[]);li(!0);var i=mZe(),n=ge(i);Er(n,A,"left",{},null);var o=De(n,2);fr(o,1,e,Jr,(r,s)=>{var a=ar(),c=Ut(a),l=C=>{he(C,EZe())},d=(C,I)=>{var u=B=>{he(B,fZe())},h=(B,f)=>{var b=S=>{var w=QZe(),_=ge(w),K=H=>{nn(H,{get data(){return g(s),Be(()=>g(s).icon)}})};ze(_,H=>{g(s),Be(()=>g(s).icon)&&H(K)});var J=De(_,2),O=H=>{var V=Ss();xA(()=>xt(V,(g(s),Be(()=>g(s).text)))),he(H,V)};ze(J,H=>{g(s),Be(()=>g(s).text)&&H(O)}),xA(()=>{var H;ci(w,1,"jse-button ".concat((g(s),(H=Be(()=>g(s).className))!==null&&H!==void 0?H:"")),"svelte-pf7s2l"),Rn(w,"title",(g(s),Be(()=>g(s).title))),w.disabled=(g(s),Be(()=>g(s).disabled||!1))}),QA("click",w,function(){for(var H,V=arguments.length,Z=new Array(V),ye=0;ye{var w=Ss();xA(_=>xt(w,_),[()=>(g(s),Be(()=>function(_){return console.error("Unknown type of menu item",_),"???"}(g(s))))],tA),he(S,w)};ze(B,S=>{F(J2),g(s),Be(()=>J2(g(s)))?S(b):S(k,!1)},f)};ze(C,B=>{F(tY),g(s),Be(()=>tY(g(s)))?B(u):B(h,!1)},I)};ze(c,C=>{F(JC),g(s),Be(()=>JC(g(s)))?C(l):C(d,!1)}),he(r,a)}),Er(De(o,2),A,"right",{},null),he(t,i),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-json-repair-component.svelte-3golau { + flex: 1; + display: flex; + flex-direction: column; + background: var(--jse-background-color, #fff); + color: var(--jse-text-color, #4d4d4d); +} +.jse-json-repair-component.svelte-3golau .jse-info:where(.svelte-3golau) { + padding: calc(0.5 * var(--jse-padding, 10px)); + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + vertical-align: center; +} +.jse-json-repair-component.svelte-3golau .jse-json-text:where(.svelte-3golau) { + flex: 1; + border: none; + padding: 2px; + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + background: var(--jse-input-background, var(--jse-background-color, #fff)); + color: var(--jse-text-color, #4d4d4d); + resize: none; + outline: none; +}`);var pZe=_e('
    Repair invalid JSON, then click apply
    '),wZe=_e('
    ');function yZe(t,A){St(A,!1);var e=Ce(void 0,!0),i=Ce(void 0,!0),n=Ce(void 0,!0),o=Ce(void 0,!0),r=Ce(void 0,!0),s=Ce(void 0,!0),a=N(A,"text",13,""),c=N(A,"readOnly",9,!1),l=N(A,"onParse",9),d=N(A,"onRepair",9),C=N(A,"onChange",9,void 0),I=N(A,"onApply",9),u=N(A,"onCancel",9),h=Es("jsoneditor:JSONRepair"),B=Ce(void 0,!0);function f(){if(g(B)&&g(e)){var V=g(e).position!==void 0?g(e).position:0;g(B).setSelectionRange(V,V),g(B).focus()}}function b(){I()(a())}function k(){try{a(d()(a())),C()&&C()(a())}catch{}}var S=Ce(void 0,!0);Se(()=>F(a()),()=>{x(e,function(V){try{return void l()(V)}catch(Z){return Wf(V,Z.message)}}(a()))}),Se(()=>F(a()),()=>{x(i,function(V){try{return d()(V),!0}catch{return!1}}(a()))}),Se(()=>g(e),()=>{h("error",g(e))}),Se(()=>F(u()),()=>{x(S,[{type:"space"},{type:"button",icon:r3,title:"Cancel repair",className:"jse-cancel",onClick:u()}])}),Se(()=>MG,()=>{x(n,{icon:MG,text:"Show me",title:"Scroll to the error location",onClick:f})}),Se(()=>b2,()=>{x(o,{icon:b2,text:"Auto repair",title:"Automatically repair JSON",onClick:k})}),Se(()=>(g(i),g(n),g(o)),()=>{x(r,g(i)?[g(n),g(o)]:[g(n)])}),Se(()=>F(c()),()=>{x(s,[{icon:Bv,text:"Apply",title:"Apply fixed JSON",disabled:c(),onClick:b}])}),Nn(),li(!0);var w=wZe(),_=ge(w);YM(_,{get items(){return g(S)},$$slots:{left:(V,Z)=>{he(V,pZe())}}});var K=De(_,2),J=V=>{var Z=tA(()=>(g(e),Be(()=>"Cannot parse JSON: ".concat(g(e).message))));Sl(V,{type:"error",get icon(){return hC},get message(){return g(Z)},get actions(){return g(r)}})},O=V=>{Sl(V,{type:"success",message:"JSON is valid now and can be parsed.",get actions(){return g(s)}})};ze(K,V=>{g(e)?V(J):V(O,!1)});var H=De(K,2);Ho(H,V=>x(B,V),()=>g(B)),xA(()=>{H.readOnly=c(),ah(H,a())}),QA("input",H,function(V){h("handleChange");var Z=V.target.value;a()!==Z&&(a(Z),C()&&C()(a()))}),he(t,w),kt()}function P1e(t,A){St(A,!1);var e=N(A,"text",13),i=N(A,"onParse",9),n=N(A,"onRepair",9),o=N(A,"onApply",9),r=N(A,"onClose",9);function s(c){o()(c),r()()}function a(){r()()}li(!0),jp(t,{get onClose(){return r()},className:"jse-repair-modal",children:(c,l)=>{yZe(c,{get onParse(){return i()},get onRepair(){return n()},onApply:s,onCancel:a,get text(){return e()},set text(d){e(d)},$$legacy:!0})},$$slots:{default:!0}}),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +div.jse-collapsed-items.svelte-1h6hzoq { + margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + color: var(--jse-collapsed-items-link-color, rgba(0, 0, 0, 0.38)); + padding: calc(0.5 * var(--jse-padding, 10px)); + border: 8px solid transparent; + border-width: 8px 0; + background-color: var(--jse-contents-background-color, transparent); + background-image: linear-gradient(var(--jse-collapsed-items-background-color, #f5f5f5), var(--jse-collapsed-items-background-color, #f5f5f5)), linear-gradient(to bottom right, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to bottom left, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to top right, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to top left, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%); + background-repeat: repeat, repeat-x, repeat-x, repeat-x, repeat-x; + background-position: 0 0, 8px 0, 8px 0, 8px 100%, 8px 100%; + background-size: auto auto, 16px 16px, 16px 16px, 16px 16px, 16px 16px; + background-clip: padding-box, border-box, border-box, border-box, border-box; + background-origin: padding-box, border-box, border-box, border-box, border-box; + display: flex; +} +div.jse-collapsed-items.jse-selected.svelte-1h6hzoq { + background-color: var(--jse-selection-background-color, #d3d3d3); + --jse-collapsed-items-background-color: var(--jse-collapsed-items-selected-background-color, #c2c2c2); +} +div.jse-collapsed-items.svelte-1h6hzoq div.jse-text:where(.svelte-1h6hzoq), +div.jse-collapsed-items.svelte-1h6hzoq button.jse-expand-items:where(.svelte-1h6hzoq) { + margin: 0 calc(0.5 * var(--jse-padding, 10px)); +} +div.jse-collapsed-items.svelte-1h6hzoq div.jse-text:where(.svelte-1h6hzoq) { + display: inline; +} +div.jse-collapsed-items.svelte-1h6hzoq button.jse-expand-items:where(.svelte-1h6hzoq) { + font-family: inherit; + font-size: inherit; + color: var(--jse-collapsed-items-link-color, rgba(0, 0, 0, 0.38)); + background: none; + border: none; + padding: 0; + text-decoration: underline; + cursor: pointer; +} +div.jse-collapsed-items.svelte-1h6hzoq button.jse-expand-items:where(.svelte-1h6hzoq):hover, div.jse-collapsed-items.svelte-1h6hzoq button.jse-expand-items:where(.svelte-1h6hzoq):focus { + color: var(--jse-collapsed-items-link-color-highlight, #ee5341); +}`);var DZe=_e(''),vZe=_e('
    ');function bZe(t,A){St(A,!1);var e=Ce(void 0,!0),i=Ce(void 0,!0),n=Ce(void 0,!0),o=Ce(void 0,!0),r=Ce(void 0,!0),s=N(A,"visibleSections",9),a=N(A,"sectionIndex",9),c=N(A,"total",9),l=N(A,"path",9),d=N(A,"selection",9),C=N(A,"onExpandSection",9),I=N(A,"context",9);Se(()=>(F(s()),F(a())),()=>{x(e,s()[a()])}),Se(()=>g(e),()=>{x(i,g(e).end)}),Se(()=>(F(s()),F(a()),F(c())),()=>{x(n,s()[a()+1]?s()[a()+1].start:c())}),Se(()=>(F(I()),F(d()),F(l()),g(i)),()=>{x(o,Hp(I().getJson(),d(),l().concat(String(g(i)))))}),Se(()=>(g(i),g(n)),()=>{x(r,function(S,w){var _={start:S,end:Math.min(AY(S),w)},K=Math.max(hM((S+w)/2),S),J={start:K,end:Math.min(AY(K),w)},O=hM(w),H=O===w?O-Tp:O,V={start:Math.max(H,S),end:w},Z=[_],ye=J.start>=_.end&&J.end<=V.start;return ye&&Z.push(J),V.start>=(ye?J.end:_.end)&&Z.push(V),Z}(g(i),g(n)))}),Nn(),li(!0);var u,h,B=vZe(),f=ge(B),b=ge(f),k=ge(b);fr(De(b,2),1,()=>g(r),Jr,(S,w)=>{var _=DZe(),K=ge(_);xA(()=>{var J,O;return xt(K,"show ".concat((g(w),(J=Be(()=>g(w).start))!==null&&J!==void 0?J:""),"-").concat((g(w),(O=Be(()=>g(w).end))!==null&&O!==void 0?O:"")))}),QA("click",_,()=>C()(l(),g(w))),he(S,_)}),xA((S,w)=>{var _,K;u=ci(B,1,"jse-collapsed-items svelte-1h6hzoq",null,u,S),h=cg(B,"",h,w),xt(k,"Items ".concat((_=g(i))!==null&&_!==void 0?_:"","-").concat((K=g(n))!==null&&K!==void 0?K:""))},[()=>({"jse-selected":g(o)}),()=>({"--level":(F(l()),Be(()=>l().length+2))})],tA),QA("mousemove",B,function(S){S.stopPropagation()}),he(t,B),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-context-menu-pointer.svelte-137iwnw { + position: absolute; + top: calc(-0.5 * var(--jse-context-menu-pointer-size, calc(1em + 4px))); + right: calc(-0.5 * var(--jse-context-menu-pointer-size, calc(1em + 4px))); + width: var(--jse-context-menu-pointer-size, calc(1em + 4px)); + height: var(--jse-context-menu-pointer-size, calc(1em + 4px)); + padding: 0; + margin: 0; + cursor: pointer; + background: transparent; + border-radius: 2px; + background: var(--jse-context-menu-pointer-hover-background, #b2b2b2); + color: var(--jse-context-menu-pointer-color, var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff))); + border: none; + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); +} +.jse-context-menu-pointer.jse-root.svelte-137iwnw { + top: 0; + right: calc(-2px - var(--jse-context-menu-pointer-size, calc(1em + 4px))); +} +.jse-context-menu-pointer.jse-insert.svelte-137iwnw { + right: -1px; +} +.jse-context-menu-pointer.svelte-137iwnw:hover { + background: var(--jse-context-menu-pointer-background-highlight, var(--jse-context-menu-background-highlight, #7a7a7a)); +} +.jse-context-menu-pointer.jse-selected.svelte-137iwnw { + background: var(--jse-context-menu-pointer-background, var(--jse-context-menu-background, #656565)); +} +.jse-context-menu-pointer.jse-selected.svelte-137iwnw:hover { + background: var(--jse-context-menu-pointer-background-highlight, var(--jse-context-menu-background-highlight, #7a7a7a)); +}`);var MZe=_e('');function OC(t,A){St(A,!1);var e=N(A,"root",9,!1),i=N(A,"insert",9,!1),n=N(A,"selected",9),o=N(A,"onContextMenu",9);li(!0);var r,s=MZe();nn(ge(s),{get data(){return ld}}),xA(a=>{r=ci(s,1,"jse-context-menu-pointer svelte-137iwnw",null,r,a),Rn(s,"title",FY)},[()=>({"jse-root":e(),"jse-insert":i(),"jse-selected":n()})],tA),QA("click",s,function(a){for(var c=a.target;c&&c.nodeName!=="BUTTON";)c=c.parentNode;c&&o()({anchor:c,left:0,top:0,width:z2,height:H2,offsetTop:2,offsetLeft:0,showTip:!0})}),he(t,s),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-key.svelte-2iqnqn { + display: inline-block; + min-width: 2em; + padding: 0 5px; + box-sizing: border-box; + outline: none; + border-radius: 1px; + vertical-align: top; + color: var(--jse-key-color, #1a1a1a); + word-break: normal; + overflow-wrap: normal; + white-space: pre-wrap; +} +.jse-key.jse-empty.svelte-2iqnqn { + min-width: 3em; + outline: 1px dotted var(--jse-tag-background, rgba(0, 0, 0, 0.2)); + -moz-outline-radius: 2px; +} +.jse-key.jse-empty.svelte-2iqnqn::after { + pointer-events: none; + color: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); + content: "key"; +}`);var SZe=_e('
    '),kZe=_e(" ",1),xZe=_e('
    ');function j1e(t,A){St(A,!0);var e=Oc(()=>fn(A.selection)&&us(A.selection)),i=Oc(()=>A.context.onRenderValue({path:A.path,value:A.value,mode:A.context.mode,truncateTextSize:A.context.truncateTextSize,readOnly:A.context.readOnly,enforceString:A.enforceString,isEditing:g(e),parser:A.context.parser,normalization:A.context.normalization,selection:A.selection,searchResultItems:A.searchResultItems,onPatch:A.context.onPatch,onPasteJson:A.context.onPasteJson,onSelect:A.context.onSelect,onFind:A.context.onFind,findNextInside:A.context.findNextInside,focus:A.context.focus})),n=ar();fr(Ut(n),17,()=>g(i),Jr,(o,r)=>{var s=ar(),a=Ut(s),c=d=>{var C=xZe(),I=Oc(()=>g(r).action);Ka(C,(u,h)=>{var B;return(B=g(I))===null||B===void 0?void 0:B(u,h)},()=>g(r).props),he(d,C)},l=d=>{var C=ar(),I=Oc(()=>g(r).component);q2e(Ut(C),()=>g(I),(u,h)=>{h(u,qC(()=>g(r).props))}),he(d,C)};ze(a,d=>{Tqe(g(r))?d(c):d(l,!1)}),he(o,s)}),he(t,n),kt()}var _Ze={selecting:!1,selectionAnchor:void 0,selectionAnchorType:void 0,selectionFocus:void 0,dragging:!1};function KJ(t){var{json:A,selection:e,deltaY:i,items:n}=t;if(!e)return{operations:void 0,updatedSelection:void 0,offset:0};var o=i<0?function(l){for(var{json:d,items:C,selection:I,deltaY:u}=l,h=P2(d,I),B=C.findIndex(_=>wi(_.path,h)),f=()=>{var _;return(_=C[b-1])===null||_===void 0?void 0:_.height},b=B,k=0;f()!==void 0&&Math.abs(u)>k+f()/2;)k+=f(),b-=1;var S=C[b].path,w=b-B;return b!==B&&C[b]!==void 0?{beforePath:S,offset:w}:void 0}({json:A,selection:e,deltaY:i,items:n}):function(l){for(var d,{json:C,items:I,selection:u,deltaY:h}=l,B=ZC(C,u),f=I.findIndex(H=>wi(H.path,B)),b=0,k=f,S=()=>{var H;return(H=I[k+1])===null||H===void 0?void 0:H.height};S()!==void 0&&Math.abs(h)>b+S()/2;)b+=S(),k+=1;var w=Hi(B),_=WA(C,w),K=Array.isArray(_)?k:k+1,J=(d=I[K])===null||d===void 0?void 0:d.path,O=k-f;return J?{beforePath:J,offset:O}:{append:!0,offset:O}}({json:A,selection:e,deltaY:i,items:n});if(!o||o.offset===0)return{operations:void 0,updatedSelection:void 0,offset:0};var r=function(l,d,C){if(!d)return[];var I="beforePath"in C?C.beforePath:void 0,u="append"in C?C.append:void 0,h=Hi(It(d)),B=WA(l,h);if(!(u||I&&Nd(I,h)&&I.length>h.length))return[];var f=P2(l,d),b=ZC(l,d),k=vi(f),S=vi(b),w=I?I[h.length]:void 0;if(!nr(B)){if(Wo(B)){var _=Ps(k),K=Ps(S),J=w!==void 0?Ps(w):B.length;return hG(K-_+1,J<_?ye=>({op:"move",from:pt(h.concat(String(_+ye))),path:pt(h.concat(String(J+ye)))}):()=>({op:"move",from:pt(h.concat(String(_))),path:pt(h.concat(String(J)))}))}throw new Error("Cannot create move operations: parent must be an Object or Array")}var O=Object.keys(B),H=O.indexOf(k),V=O.indexOf(S),Z=u?O.length:w!==void 0?O.indexOf(w):-1;return H!==-1&&V!==-1&&Z!==-1?Z>H?[...O.slice(H,V+1),...O.slice(Z,O.length)].map(ye=>iI(h,ye)):[...O.slice(Z,H),...O.slice(V+1,O.length)].map(ye=>iI(h,ye)):[]}(A,e,o),s=Hi(P2(A,e)),a=WA(A,s);if(Array.isArray(a)){var c=function(l){var d,C,{items:I,json:u,selection:h,offset:B}=l,f=P2(u,h),b=ZC(u,h),k=I.findIndex(K=>wi(K.path,f)),S=I.findIndex(K=>wi(K.path,b)),w=(d=I[k+B])===null||d===void 0?void 0:d.path,_=(C=I[S+B])===null||C===void 0?void 0:C.path;return Fa(w,_)}({items:n,json:A,selection:e,offset:o.offset});return{operations:r,updatedSelection:c,offset:o.offset}}return{operations:r,updatedSelection:void 0,offset:o.offset}}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +button.jse-validation-error.svelte-1a8aobl { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + padding: 0; + margin: 0; + vertical-align: top; + display: inline-flex; + color: var(--jse-error-color, #ee5341); +} + +button.jse-validation-info.svelte-1a8aobl { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + padding: 0; + margin: 0; + vertical-align: top; + display: inline-flex; + color: var(--jse-info-color, #4f91ff); +} + +button.jse-validation-warning.svelte-1a8aobl { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + padding: 0; + margin: 0; + vertical-align: top; + display: inline-flex; + color: var(--jse-warning-color, #fdc539); +}`);var RZe=_e('');function jf(t,A){St(A,!1);var e=Ce(),i=nI("absolute-popup"),n=N(A,"validationError",8),o=N(A,"onExpand",8);Se(()=>F(n()),()=>{x(e,Uqe(n())&&n().isChildError?"Contains invalid data":n().message)}),Nn(),li();var r=RZe();nn(ge(r),{get data(){return hC}}),zs(()=>QA("click",r,function(){for(var s,a=arguments.length,c=new Array(a),l=0;leQ?.(s,a),()=>SA({text:g(e)},i)),xA(()=>{var s;return ci(r,1,"jse-validation-".concat((F(n()),(s=Be(()=>n().severity))!==null&&s!==void 0?s:"")),"svelte-1a8aobl")}),he(t,r),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-expand.svelte-oawf7x { + width: var(--jse-indent-size, calc(1em + 4px)); + padding: 0; + margin: 0; + border: none; + cursor: pointer; + background: transparent; + color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); + font-size: var(--jse-font-size-mono, 14px); + height: var(--jse-line-height, calc(1em + 4px)); +} +.jse-expand.svelte-oawf7x:hover { + opacity: 0.8; +} + +.jse-meta.svelte-oawf7x, +.jse-separator.svelte-oawf7x, +.jse-index.svelte-oawf7x, +.jse-bracket.svelte-oawf7x { + vertical-align: top; + color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); +} + +.jse-index.svelte-oawf7x { + padding: 0 calc(0.5 * var(--jse-padding, 10px)); +} + +.jse-bracket.svelte-oawf7x { + padding: 0 2px; +} +.jse-bracket.jse-expanded.svelte-oawf7x { + padding-right: var(--jse-padding, 10px); +} + +.jse-identifier.svelte-oawf7x { + vertical-align: top; + position: relative; +} + +.jse-json-node.svelte-oawf7x { + position: relative; + color: var(--jse-text-color, #4d4d4d); +} +.jse-json-node.jse-root.svelte-oawf7x { + min-height: 100%; + padding-bottom: 2px; + box-sizing: border-box; +} +.jse-json-node.jse-root.svelte-oawf7x > .jse-contents-outer:where(.svelte-oawf7x) > .jse-contents:where(.svelte-oawf7x) { + padding-left: 0; +} +.jse-json-node.svelte-oawf7x .jse-props:where(.svelte-oawf7x), +.jse-json-node.svelte-oawf7x .jse-items:where(.svelte-oawf7x) { + position: relative; +} +.jse-json-node.svelte-oawf7x .jse-header-outer:where(.svelte-oawf7x), +.jse-json-node.svelte-oawf7x .jse-footer-outer:where(.svelte-oawf7x) { + display: flex; + margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); +} +.jse-json-node.svelte-oawf7x .jse-header:where(.svelte-oawf7x) { + position: relative; +} +.jse-json-node.svelte-oawf7x .jse-header:where(.svelte-oawf7x) .jse-meta:where(.svelte-oawf7x) > .jse-meta-inner:where(.svelte-oawf7x) { + display: flex; + justify-content: center; +} +.jse-json-node.svelte-oawf7x .jse-contents-outer:where(.svelte-oawf7x) { + display: flex; + margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); +} +.jse-json-node.svelte-oawf7x .jse-header:where(.svelte-oawf7x), +.jse-json-node.svelte-oawf7x .jse-contents:where(.svelte-oawf7x) { + display: flex; + flex-direction: row; + align-items: flex-start; +} +.jse-json-node.svelte-oawf7x .jse-contents:where(.svelte-oawf7x) { + padding-left: var(--jse-indent-size, calc(1em + 4px)); + cursor: var(--jse-contents-cursor, pointer); +} +.jse-json-node.svelte-oawf7x .jse-contents:where(.svelte-oawf7x) .jse-value-outer:where(.svelte-oawf7x) { + display: inline-flex; +} +.jse-json-node.svelte-oawf7x .jse-footer:where(.svelte-oawf7x) { + display: inline-flex; + padding-left: calc(var(--jse-indent-size, calc(1em + 4px)) + 5px); +} +.jse-json-node.svelte-oawf7x .jse-header:where(.svelte-oawf7x), +.jse-json-node.svelte-oawf7x .jse-contents:where(.svelte-oawf7x), +.jse-json-node.svelte-oawf7x .jse-footer:where(.svelte-oawf7x) { + background: var(--jse-contents-background-color, transparent); +} +.jse-json-node.svelte-oawf7x .jse-insert-selection-area:where(.svelte-oawf7x) { + padding: 0 calc(0.5 * var(--jse-padding, 10px)); + flex: 1; +} +.jse-json-node.svelte-oawf7x .jse-insert-selection-area.jse-inside:where(.svelte-oawf7x) { + display: inline-flex; + align-items: center; +} +.jse-json-node.svelte-oawf7x .jse-insert-selection-area.jse-after:where(.svelte-oawf7x) { + display: flex; + align-items: flex-end; +} +.jse-json-node.svelte-oawf7x .jse-context-menu-pointer-anchor:where(.svelte-oawf7x) { + position: relative; +} +.jse-json-node.svelte-oawf7x .jse-insert-area:where(.svelte-oawf7x) { + display: flex; + position: relative; + z-index: 1; + margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); + max-width: 250px; + min-width: 100px; + height: 0; + margin-right: calc(0.5 * var(--jse-padding, 10px)); + outline: 1px solid; +} +.jse-json-node.svelte-oawf7x .jse-insert-area.jse-hovered:where(.svelte-oawf7x) { + outline-color: var(--jse-context-menu-pointer-hover-background, #b2b2b2); +} +.jse-json-node.svelte-oawf7x .jse-key-outer:where(.svelte-oawf7x) { + position: relative; +} +.jse-json-node.svelte-oawf7x .jse-key-outer:where(.svelte-oawf7x):hover, +.jse-json-node.svelte-oawf7x .jse-value-outer:where(.svelte-oawf7x):hover, +.jse-json-node.svelte-oawf7x .jse-meta:where(.svelte-oawf7x):hover, +.jse-json-node.svelte-oawf7x .jse-footer:where(.svelte-oawf7x):hover { + background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); + cursor: var(--jse-contents-cursor, pointer); +} +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-value-outer, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-meta, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-footer { + background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); + cursor: var(--jse-contents-cursor, pointer); +} +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-value-outer .jse-value-outer, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-value-outer .jse-meta, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-meta .jse-value-outer, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-meta .jse-meta, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header .jse-value-outer, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header .jse-meta, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents .jse-value-outer, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents .jse-meta, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header .jse-value-outer, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header .jse-meta, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents .jse-value-outer, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents .jse-meta, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-footer .jse-value-outer, +.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-footer .jse-meta { + background: none; +} +.jse-json-node.jse-selected.svelte-oawf7x .jse-header:where(.svelte-oawf7x), +.jse-json-node.jse-selected.svelte-oawf7x .jse-contents:where(.svelte-oawf7x), +.jse-json-node.jse-selected.svelte-oawf7x .jse-footer:where(.svelte-oawf7x) { + background: var(--jse-selection-background-color, #d3d3d3); + cursor: var(--jse-contents-selected-cursor, grab); +} +.jse-json-node.jse-selected.svelte-oawf7x .jse-key-outer:where(.svelte-oawf7x):hover, +.jse-json-node.jse-selected.svelte-oawf7x .jse-value-outer:where(.svelte-oawf7x):hover, +.jse-json-node.jse-selected.svelte-oawf7x .jse-meta:where(.svelte-oawf7x):hover, +.jse-json-node.jse-selected.svelte-oawf7x .jse-footer:where(.svelte-oawf7x):hover { + background: inherit; + cursor: inherit; +} +.jse-json-node.svelte-oawf7x .jse-key-outer.jse-selected-key:where(.svelte-oawf7x) { + background: var(--jse-selection-background-color, #d3d3d3); + cursor: var(--jse-contents-selected-cursor, grab); +} +.jse-json-node.jse-selected-value.svelte-oawf7x .jse-value-outer, +.jse-json-node.jse-selected-value.svelte-oawf7x .jse-meta, +.jse-json-node.jse-selected-value.svelte-oawf7x .jse-items .jse-header, +.jse-json-node.jse-selected-value.svelte-oawf7x .jse-items .jse-contents, +.jse-json-node.jse-selected-value.svelte-oawf7x .jse-props .jse-header, +.jse-json-node.jse-selected-value.svelte-oawf7x .jse-props .jse-contents, +.jse-json-node.jse-selected-value.svelte-oawf7x .jse-footer { + background: var(--jse-selection-background-color, #d3d3d3); + cursor: var(--jse-contents-selected-cursor, grab); +} +.jse-json-node.jse-selected-value.svelte-oawf7x .jse-value-outer .jse-key-outer:hover, +.jse-json-node.jse-selected-value.svelte-oawf7x .jse-meta .jse-key-outer:hover, +.jse-json-node.jse-selected-value.svelte-oawf7x .jse-items .jse-header .jse-key-outer:hover, +.jse-json-node.jse-selected-value.svelte-oawf7x .jse-items .jse-contents .jse-key-outer:hover, +.jse-json-node.jse-selected-value.svelte-oawf7x .jse-props .jse-header .jse-key-outer:hover, +.jse-json-node.jse-selected-value.svelte-oawf7x .jse-props .jse-contents .jse-key-outer:hover, +.jse-json-node.jse-selected-value.svelte-oawf7x .jse-footer .jse-key-outer:hover { + background: inherit; + cursor: inherit; +} +.jse-json-node.jse-readonly.svelte-oawf7x { + --jse-contents-selected-cursor: pointer; +} +.jse-json-node.svelte-oawf7x .jse-insert-area.jse-selected:where(.svelte-oawf7x) { + outline-color: var(--jse-context-menu-pointer-background, var(--jse-context-menu-background, #656565)); +}`);var Yo=LM(()=>_Ze),NZe=_e('
    :
    '),LZe=_e('
    [
     ',1),FZe=_e('
    [
    ]
    ',1),GZe=_e('
    '),KZe=_e('
    '),UZe=_e('
    '),TZe=_e('
    '),OZe=_e('
    '),JZe=_e(" ",1),YZe=_e('
    '),HZe=_e('
    ',1),zZe=_e('
    ',1),PZe=_e('
    :
    '),jZe=_e('
    {
    '),VZe=_e('
    {
    }
    ',1),qZe=_e('
    '),WZe=_e('
    '),ZZe=_e('
    '),XZe=_e('
    '),$Ze=_e('
    '),eXe=_e('
    '),AXe=_e('
    ',1),tXe=_e('
    ',1),iXe=_e('
    :
    '),nXe=_e('
    '),oXe=_e('
    '),rXe=_e('
    '),sXe=_e('
    '),aXe=_e('
    ');function CY(t,A){St(A,!1);var e=Ce(void 0,!0),i=Ce(void 0,!0),n=N(A,"pointer",9),o=N(A,"value",9),r=N(A,"state",9),s=N(A,"validationErrors",9),a=N(A,"searchResults",9),c=N(A,"selection",9),l=N(A,"context",9),d=N(A,"onDragSelectionStart",9),C=Es("jsoneditor:JSONNode"),I=Ce(void 0,!0),u=void 0,h=Ce(void 0,!0),B=Ce(void 0,!0),f=Ce(void 0,!0),b=Ce(void 0,!0),k=Ce(void 0,!0),S=Ce(void 0,!0),w=Ce(void 0,!0);function _(Ye){Ye.stopPropagation();var Ie=LY(Ye);l().onExpand(g(B),!g(f),Ie)}function K(){l().onExpand(g(B),!0)}function J(Ye,Ie){var We=r6(g(B),Object.keys(o()),Ye,Ie);return l().onPatch(We),vi(Sa(We[0].path))}function O(Ye){l().onDrag(Ye)}function H(Ye){Yo().selecting&&(Yo(Yo().selecting=!1),Ye.stopPropagation()),l().onDragEnd(),document.removeEventListener("mousemove",O,!0),document.removeEventListener("mouseup",H)}function V(){var Ye;return((Ye=l().findElement([]))===null||Ye===void 0||(Ye=Ye.getBoundingClientRect())===null||Ye===void 0?void 0:Ye.top)||0}function Z(Ye,Ie){var We=V()-Ye.initialContentTop;return Ie.clientY-Ye.initialClientY-We}function ye(Ye){if(!l().readOnly&&c()){var Ie=Hi(It(c()));if(wi(g(B),Ie)){var We=function(Fe,pe){var Wt=[];function Qt(z){var Ae=g(B).concat(z),de=l().findElement(Ae);de!==void 0&&Wt.push({path:Ae,height:de.clientHeight})}if(Array.isArray(o())){var BA=l().getJson();if(BA===void 0)return;var _t=P2(BA,Fe),VA=ZC(BA,Fe),YA=parseInt(vi(_t),10),Jt=parseInt(vi(VA),10),KA=pe.find(z=>YA>=z.start&&Jt<=z.end);if(!KA)return;var{start:di,end:G}=KA;A1e(di,Math.min(o().length,G),z=>Qt(String(z)))}else Object.keys(o()).forEach(Qt);return Wt}(c(),g(k)||Hf);if(C("dragSelectionStart",{selection:c(),items:We}),We){var we=l().getJson();if(we!==void 0){var Ze=P2(we,c()),Ge=We.findIndex(Fe=>wi(Fe.path,Ze)),{offset:LA}=KJ({json:we,selection:l().getSelection(),deltaY:0,items:We});x(h,{initialTarget:Ye.target,initialClientY:Ye.clientY,initialContentTop:V(),selectionStartIndex:Ge,selectionItemsCount:tI(we,c()).length,items:We,offset:LA,didMoveItems:!1}),Yo(Yo().dragging=!0),document.addEventListener("mousemove",P,!0),document.addEventListener("mouseup",se)}}else C("Cannot drag the current selection (probably spread over multiple sections)")}else d()(Ye)}}function P(Ye){if(g(h)){var Ie=l().getJson();if(Ie===void 0)return;var We=Z(g(h),Ye),{offset:we}=KJ({json:Ie,selection:l().getSelection(),deltaY:We,items:g(h).items});we!==g(h).offset&&(C("drag selection",we,We),x(h,SA(SA({},g(h)),{},{offset:we,didMoveItems:!0})))}}function se(Ye){if(g(h)){var Ie=l().getJson();if(Ie===void 0)return;var We=Z(g(h),Ye),{operations:we,updatedSelection:Ze}=KJ({json:Ie,selection:l().getSelection(),deltaY:We,items:g(h).items});if(we)l().onPatch(we,(Fe,pe)=>({state:pe,selection:Ze??c()}));else if(Ye.target===g(h).initialTarget&&!g(h).didMoveItems){var Ge=DJ(Ye.target),LA=C1e(Ye.target);LA&&l().onSelect(Tde(Ge,LA))}x(h,void 0),Yo(Yo().dragging=!1),document.removeEventListener("mousemove",P,!0),document.removeEventListener("mouseup",se)}}function X(Ye){Ye.shiftKey||(Ye.stopPropagation(),Ye.preventDefault(),l().onSelect(e1(g(B))))}function ue(Ye){Ye.shiftKey||(Ye.stopPropagation(),Ye.preventDefault(),l().onSelect(W2(g(B))))}function oe(Ye){l().onSelect(e1(g(B))),bo(),l().onContextMenu(Ye)}function le(Ye){l().onSelect(W2(g(B))),bo(),l().onContextMenu(Ye)}Se(()=>F(n()),()=>{x(B,Sa(n()))}),Se(()=>F(n()),()=>{x(e,encodeURIComponent(n()))}),Se(()=>F(r()),()=>{x(f,!!ch(r())&&r().expanded)}),Se(()=>(F(o()),F(r())),()=>{x(b,_d(o(),r(),[]))}),Se(()=>F(r()),()=>{x(k,hs(r())?r().visibleSections:void 0)}),Se(()=>F(s()),()=>{var Ye;x(S,(Ye=s())===null||Ye===void 0?void 0:Ye.validationError)}),Se(()=>(F(l()),F(c()),g(B)),()=>{x(w,Hp(l().getJson(),c(),g(B)))}),Se(()=>g(B),()=>{x(i,g(B).length===0)}),Nn(),li(!0);var me,Te,$e=aXe(),Je=ge($e),Qe=Ye=>{var Ie=zZe(),We=Ut(Ie),we=ge(We),Ze=ge(we),Ge=ge(Ze),LA=Ke=>{nn(Ke,{get data(){return ld}})},Fe=Ke=>{nn(Ke,{get data(){return TE}})};ze(Ge,Ke=>{g(f)?Ke(LA):Ke(Fe,!1)});var pe=De(Ze,2);Er(pe,A,"identifier",{},null);var Wt=De(pe,2),Qt=Ke=>{he(Ke,NZe())};ze(Wt,Ke=>{g(i)||Ke(Qt)});var BA=De(Wt,2),_t=ge(BA),VA=ge(_t),YA=Ke=>{var Re=LZe();aM(De(Ut(Re),2),{children:(wt,st)=>{var nA=Ss();xA(()=>{var Bt,Wi;return xt(nA,"".concat((F(o()),(Bt=Be(()=>o().length))!==null&&Bt!==void 0?Bt:""),` + `).concat((F(o()),(Wi=Be(()=>o().length===1?"item":"items"))!==null&&Wi!==void 0?Wi:"")))}),he(wt,nA)},$$slots:{default:!0}}),he(Ke,Re)},Jt=Ke=>{var Re=FZe();aM(De(Ut(Re),2),{onclick:K,children:(wt,st)=>{var nA=Ss();xA(()=>{var Bt,Wi;return xt(nA,"".concat((F(o()),(Bt=Be(()=>o().length))!==null&&Bt!==void 0?Bt:""),` + `).concat((F(o()),(Wi=Be(()=>o().length===1?"item":"items"))!==null&&Wi!==void 0?Wi:"")))}),he(wt,nA)},$$slots:{default:!0}}),he(Ke,Re)};ze(VA,Ke=>{g(f)?Ke(YA):Ke(Jt,!1)});var KA=De(BA,2),di=Ke=>{var Re=GZe();OC(ge(Re),{get root(){return g(i)},selected:!0,get onContextMenu(){return F(l()),Be(()=>l().onContextMenu)}}),he(Ke,Re)};ze(KA,Ke=>{F(l()),g(w),F(c()),F(fn),F(Io),F(us),F(wi),F(It),g(B),Be(()=>!l().readOnly&&g(w)&&c()&&(fn(c())||Io(c()))&&!us(c())&&wi(It(c()),g(B)))&&Ke(di)});var G=De(we,2),z=Ke=>{jf(Ke,{get validationError(){return g(S)},onExpand:K})};ze(G,Ke=>{g(S),g(f),Be(()=>g(S)&&(!g(f)||!g(S).isChildError))&&Ke(z)});var Ae=De(G,2),de=Ke=>{var Re=KZe();QA("click",Re,X),he(Ke,Re)},Ne=Ke=>{var Re=UZe();QA("click",Re,ue),he(Ke,Re)};ze(Ae,Ke=>{g(f)?Ke(de):Ke(Ne,!1)});var pA=De(We,2),vA=Ke=>{var Re=HZe(),wt=Ut(Re),st=ge(wt),nA=dn=>{var HA,Cn,Gi=TZe(),oi=ge(Gi),Yt=tA(()=>(g(w),F(cs),F(c()),Be(()=>g(w)&&cs(c()))));OC(oi,{insert:!0,get selected(){return g(Yt)},onContextMenu:oe}),xA((xi,Pi)=>{HA=ci(Gi,1,"jse-insert-area jse-inside svelte-oawf7x",null,HA,xi),Rn(Gi,"title",MJ),Cn=cg(Gi,"",Cn,Pi)},[()=>({"jse-hovered":g(I)===Xu,"jse-selected":g(w)&&cs(c())}),()=>({"--level":(g(B),Be(()=>g(B).length+1))})],tA),he(dn,Gi)};ze(st,dn=>{F(l()),g(I),F(Xu),g(w),F(cs),F(c()),Be(()=>!l().readOnly&&(g(I)===Xu||g(w)&&cs(c())))&&dn(nA)}),fr(De(st,2),1,()=>g(k)||Hf,Jr,(dn,HA,Cn)=>{var Gi=JZe(),oi=Ut(Gi);fr(oi,1,()=>(F(o()),g(HA),g(h),Be(()=>function(Pi,Xt,L){var ct=Xt.start,Di=Math.min(Xt.end,Pi.length),mn=dv(ct,Di);return L&&L.offset!==0?Qde(mn,L.selectionStartIndex,L.selectionItemsCount,L.offset).map((pn,so)=>({index:pn,gutterIndex:so})):mn.map(pn=>({index:pn,gutterIndex:pn}))}(o(),g(HA),g(h)))),Pi=>Pi.index,(Pi,Xt)=>{var L=ar(),ct=tA(()=>(F(hs),F(s()),g(Xt),Be(()=>hs(s())?s().items[g(Xt).index]:void 0))),Di=tA(()=>(F(Wb),F(l()),F(c()),g(B),g(Xt),Be(()=>Wb(l().getJson(),c(),g(B).concat(String(g(Xt).index)))))),mn=Ut(L),pn=tA(()=>(F(Jm),F(n()),g(Xt),Be(()=>Jm(n(),g(Xt).index)))),so=tA(()=>(F(hs),F(r()),g(Xt),Be(()=>hs(r())?r().items[g(Xt).index]:void 0))),$o=tA(()=>(F(hs),F(a()),g(Xt),Be(()=>hs(a())?a().items[g(Xt).index]:void 0)));CY(mn,{get value(){return F(o()),g(Xt),Be(()=>o()[g(Xt).index])},get pointer(){return g(pn)},get state(){return g(so)},get validationErrors(){return g(ct)},get searchResults(){return g($o)},get selection(){return g(Di)},get context(){return l()},onDragSelectionStart:ye,$$slots:{identifier:(Ao,Fn)=>{var Qr=OZe(),mr=ge(Qr),zo=ge(mr);xA(()=>xt(zo,(g(Xt),Be(()=>g(Xt).gutterIndex)))),he(Ao,Qr)}}}),he(Pi,L)});var Yt=De(oi,2),xi=Pi=>{var Xt=tA(()=>g(k)||Hf);bZe(Pi,{get visibleSections(){return g(Xt)},sectionIndex:Cn,get total(){return F(o()),Be(()=>o().length)},get path(){return g(B)},get onExpandSection(){return F(l()),Be(()=>l().onExpandSection)},get selection(){return c()},get context(){return l()}})};ze(Yt,Pi=>{g(HA),F(o()),Be(()=>g(HA).end{var HA=YZe();QA("click",HA,ue),he(dn,HA)};ze(Wi,dn=>{g(i)||dn(Qn)}),he(Ke,Re)};ze(pA,Ke=>{g(f)&&Ke(vA)}),QA("click",Ze,_),he(Ye,Ie)},He=(Ye,Ie)=>{var We=Ze=>{var Ge=tXe(),LA=Ut(Ge),Fe=ge(LA),pe=ge(Fe),Wt=ge(pe),Qt=nA=>{nn(nA,{get data(){return ld}})},BA=nA=>{nn(nA,{get data(){return TE}})};ze(Wt,nA=>{g(f)?nA(Qt):nA(BA,!1)});var _t=De(pe,2);Er(_t,A,"identifier",{},null);var VA=De(_t,2),YA=nA=>{he(nA,PZe())};ze(VA,nA=>{g(i)||nA(YA)});var Jt=De(VA,2),KA=ge(Jt),di=ge(KA),G=nA=>{he(nA,jZe())},z=nA=>{var Bt=VZe();aM(De(Ut(Bt),2),{onclick:K,children:(Wi,Qn)=>{var dn=Ss();xA((HA,Cn)=>xt(dn,"".concat(HA??"",` + `).concat(Cn??"")),[()=>(F(o()),Be(()=>Object.keys(o()).length)),()=>(F(o()),Be(()=>Object.keys(o()).length===1?"prop":"props"))],tA),he(Wi,dn)},$$slots:{default:!0}}),he(nA,Bt)};ze(di,nA=>{g(f)?nA(G):nA(z,!1)});var Ae=De(Jt,2),de=nA=>{var Bt=qZe();OC(ge(Bt),{get root(){return g(i)},selected:!0,get onContextMenu(){return F(l()),Be(()=>l().onContextMenu)}}),he(nA,Bt)};ze(Ae,nA=>{F(l()),g(w),F(c()),F(fn),F(Io),F(us),F(wi),F(It),g(B),Be(()=>!l().readOnly&&g(w)&&c()&&(fn(c())||Io(c()))&&!us(c())&&wi(It(c()),g(B)))&&nA(de)});var Ne=De(Fe,2),pA=nA=>{jf(nA,{get validationError(){return g(S)},onExpand:K})};ze(Ne,nA=>{g(S),g(f),Be(()=>g(S)&&(!g(f)||!g(S).isChildError))&&nA(pA)});var vA=De(Ne,2),Ke=nA=>{var Bt=WZe();QA("click",Bt,X),he(nA,Bt)},Re=(nA,Bt)=>{var Wi=Qn=>{var dn=ZZe();QA("click",dn,ue),he(Qn,dn)};ze(nA,Qn=>{g(i)||Qn(Wi)},Bt)};ze(vA,nA=>{g(f)?nA(Ke):nA(Re,!1)});var wt=De(LA,2),st=nA=>{var Bt=AXe(),Wi=Ut(Bt),Qn=ge(Wi),dn=oi=>{var Yt,xi,Pi=XZe(),Xt=ge(Pi),L=tA(()=>(g(w),F(cs),F(c()),Be(()=>g(w)&&cs(c()))));OC(Xt,{insert:!0,get selected(){return g(L)},onContextMenu:oe}),xA((ct,Di)=>{Yt=ci(Pi,1,"jse-insert-area jse-inside svelte-oawf7x",null,Yt,ct),Rn(Pi,"title",MJ),xi=cg(Pi,"",xi,Di)},[()=>({"jse-hovered":g(I)===Xu,"jse-selected":g(w)&&cs(c())}),()=>({"--level":(g(B),Be(()=>g(B).length+1))})],tA),he(oi,Pi)};ze(Qn,oi=>{F(l()),g(I),F(Xu),g(w),F(cs),F(c()),Be(()=>!l().readOnly&&(g(I)===Xu||g(w)&&cs(c())))&&oi(dn)}),fr(De(Qn,2),1,()=>(F(o()),g(h),Be(()=>function(oi,Yt){var xi=Object.keys(oi);return Yt&&Yt.offset!==0?Qde(xi,Yt.selectionStartIndex,Yt.selectionItemsCount,Yt.offset):xi}(o(),g(h)))),Jr,(oi,Yt)=>{var xi=ar(),Pi=tA(()=>(F(Jm),F(n()),g(Yt),Be(()=>Jm(n(),g(Yt))))),Xt=tA(()=>(F(Tc),F(a()),g(Yt),Be(()=>Tc(a())?a().properties[g(Yt)]:void 0))),L=tA(()=>(F(Tc),F(s()),g(Yt),Be(()=>Tc(s())?s().properties[g(Yt)]:void 0))),ct=tA(()=>(g(B),g(Yt),Be(()=>g(B).concat(g(Yt))))),Di=tA(()=>(F(Wb),F(l()),F(c()),F(g(ct)),Be(()=>Wb(l().getJson(),c(),g(ct))))),mn=Ut(xi),pn=tA(()=>(F(Tc),F(r()),g(Yt),Be(()=>Tc(r())?r().properties[g(Yt)]:void 0)));CY(mn,{get value(){return F(o()),g(Yt),Be(()=>o()[g(Yt)])},get pointer(){return g(Pi)},get state(){return g(pn)},get validationErrors(){return g(L)},get searchResults(){return g(Xt)},get selection(){return g(Di)},get context(){return l()},onDragSelectionStart:ye,$$slots:{identifier:(so,$o)=>{var Ao,Fn=$Ze(),Qr=ge(Fn),mr=tA(()=>(F(jde),F(g(Xt)),Be(()=>jde(g(Xt)))));(function(zo,On){St(On,!1);var ho=Ce(void 0,!0),sA=Ce(void 0,!0),_i=N(On,"pointer",9),Zi=N(On,"key",9),Jn=N(On,"selection",9),Bo=N(On,"searchResultItems",9),pr=N(On,"onUpdateKey",9),Mi=N(On,"context",9),Mo=Ce(void 0,!0);function wr(EA){g(sA)||Mi().readOnly||(EA.preventDefault(),Mi().onSelect(zY(g(Mo))))}function yr(EA,zA){var bA=pr()(Zi(),Mi().normalization.unescapeValue(EA)),fe=Hi(g(Mo)).concat(bA);Mi().onSelect(zA===WC.nextInside?zi(fe):$2(fe)),zA!==WC.self&&Mi().focus()}function Nr(){Mi().onSelect($2(g(Mo))),Mi().focus()}Se(()=>F(_i()),()=>{x(Mo,Sa(_i()))}),Se(()=>(F(Jn()),g(Mo)),()=>{x(ho,Bs(Jn())&&wi(Jn().path,g(Mo)))}),Se(()=>(g(ho),F(Jn())),()=>{x(sA,g(ho)&&us(Jn()))}),Nn(),li(!0);var Mn=kZe(),wn=Ut(Mn),Ft=EA=>{var zA=tA(()=>(F(Mi()),F(Zi()),Be(()=>Mi().normalization.escapeValue(Zi())))),bA=tA(()=>(F(us),F(Jn()),Be(()=>us(Jn())?Jn().initialValue:void 0)));y1e(EA,{get value(){return g(zA)},get initialValue(){return g(bA)},label:"Edit key",shortText:!0,onChange:yr,onCancel:Nr,get onFind(){return F(Mi()),Be(()=>Mi().onFind)}})},Yn=EA=>{var zA,bA=SZe(),fe=ge(bA),ke=qA=>{var Gt=tA(()=>(F(Mi()),F(Zi()),Be(()=>Mi().normalization.escapeValue(Zi()))));x1e(qA,{get text(){return g(Gt)},get searchResultItems(){return Bo()}})},Xe=qA=>{var Gt=Ss();xA($t=>xt(Gt,$t),[()=>(F(Zf),F(Mi()),F(Zi()),Be(()=>Zf(Mi().normalization.escapeValue(Zi()))))],tA),he(qA,Gt)};ze(fe,qA=>{Bo()?qA(ke):qA(Xe,!1)}),xA(qA=>zA=ci(bA,1,"jse-key svelte-2iqnqn",null,zA,qA),[()=>({"jse-empty":Zi()===""})],tA),QA("dblclick",bA,wr),he(EA,bA)};ze(wn,EA=>{F(Mi()),g(sA),Be(()=>!Mi().readOnly&&g(sA))?EA(Ft):EA(Yn,!1)});var Me=De(wn,2),gA=EA=>{OC(EA,{selected:!0,get onContextMenu(){return F(Mi()),Be(()=>Mi().onContextMenu)}})};ze(Me,EA=>{F(Mi()),g(ho),g(sA),Be(()=>!Mi().readOnly&&g(ho)&&!g(sA))&&EA(gA)}),he(zo,Mn),kt()})(Qr,{get pointer(){return g(Pi)},get key(){return g(Yt)},get selection(){return g(Di)},get searchResultItems(){return g(mr)},get context(){return l()},onUpdateKey:J}),xA(zo=>Ao=ci(Fn,1,"jse-key-outer svelte-oawf7x",null,Ao,zo),[()=>({"jse-selected-key":Bs(g(Di))&&wi(g(Di).path,g(ct))})],tA),he(so,Fn)}}}),he(oi,xi)});var HA=De(Wi,2),Cn=De(ge(HA),2),Gi=oi=>{var Yt=eXe();QA("click",Yt,ue),he(oi,Yt)};ze(Cn,oi=>{g(i)||oi(Gi)}),he(nA,Bt)};ze(wt,nA=>{g(f)&&nA(st)}),QA("click",pe,_),he(Ze,Ge)},we=Ze=>{var Ge=rXe(),LA=ge(Ge),Fe=ge(LA);Er(Fe,A,"identifier",{},null);var pe=De(Fe,2),Wt=Ae=>{he(Ae,iXe())};ze(pe,Ae=>{g(i)||Ae(Wt)});var Qt=De(pe,2),BA=ge(Qt),_t=tA(()=>g(w)?c():void 0),VA=tA(()=>(F(Vde),F(a()),Be(()=>Vde(a()))));j1e(BA,{get path(){return g(B)},get value(){return o()},get enforceString(){return g(b)},get selection(){return g(_t)},get searchResultItems(){return g(VA)},get context(){return l()}});var YA=De(Qt,2),Jt=Ae=>{var de=nXe();OC(ge(de),{get root(){return g(i)},selected:!0,get onContextMenu(){return F(l()),Be(()=>l().onContextMenu)}}),he(Ae,de)};ze(YA,Ae=>{F(l()),g(w),F(c()),F(fn),F(Io),F(us),F(wi),F(It),g(B),Be(()=>!l().readOnly&&g(w)&&c()&&(fn(c())||Io(c()))&&!us(c())&&wi(It(c()),g(B)))&&Ae(Jt)});var KA=De(LA,2),di=Ae=>{jf(Ae,{get validationError(){return g(S)},onExpand:K})};ze(KA,Ae=>{g(S)&&Ae(di)});var G=De(KA,2),z=Ae=>{var de=oXe();QA("click",de,ue),he(Ae,de)};ze(G,Ae=>{g(i)||Ae(z)}),he(Ze,Ge)};ze(Ye,Ze=>{F(vn),F(o()),Be(()=>vn(o()))?Ze(We):Ze(we,!1)},Ie)};ze(Je,Ye=>{F(o()),Be(()=>Array.isArray(o()))?Ye(Qe):Ye(He,!1)});var PA=De(Je,2),JA=Ye=>{var Ie,We=sXe(),we=ge(We),Ze=tA(()=>(g(w),F(Jc),F(c()),Be(()=>g(w)&&Jc(c()))));OC(we,{insert:!0,get selected(){return g(Ze)},onContextMenu:le}),xA(Ge=>{Ie=ci(We,1,"jse-insert-area jse-after svelte-oawf7x",null,Ie,Ge),Rn(We,"title",MJ)},[()=>({"jse-hovered":g(I)===Vb,"jse-selected":g(w)&&Jc(c())})],tA),he(Ye,We)};ze(PA,Ye=>{F(l()),g(I),F(Vb),g(w),F(Jc),F(c()),Be(()=>!l().readOnly&&(g(I)===Vb||g(w)&&Jc(c())))&&Ye(JA)}),xA((Ye,Ie,We)=>{me=ci($e,1,Ye,"svelte-oawf7x",me,Ie),Rn($e,"data-path",g(e)),Rn($e,"aria-selected",g(w)),Te=cg($e,"",Te,We)},[()=>AI((F(o0),g(f),F(l()),g(B),F(o()),Be(()=>o0("jse-json-node",{"jse-expanded":g(f)},l().onClassName(g(B),o()))))),()=>({"jse-root":g(i),"jse-selected":g(w)&&Io(c()),"jse-selected-value":g(w)&&fn(c()),"jse-readonly":l().readOnly,"jse-hovered":g(I)===yde}),()=>({"--level":(g(B),Be(()=>g(B).length))})],tA),QA("mousedown",$e,function(Ye){if((Ye.buttons===1||Ye.buttons===2)&&!((Ie=Ye.target).nodeName==="DIV"&&Ie.contentEditable==="true"||Ye.buttons===1&&g1e(Ye.target,"BUTTON"))){var Ie;Ye.stopPropagation(),Ye.preventDefault(),l().focus(),document.addEventListener("mousemove",O,!0),document.addEventListener("mouseup",H);var We=DJ(Ye.target),we=l().getJson(),Ze=l().getDocumentState();if(!c()||We===ro.after||We===ro.inside||c().type!==We&&c().type!==ro.multi||!Hp(we,c(),g(B)))if(Yo(Yo().selecting=!0),Yo(Yo().selectionAnchor=g(B)),Yo(Yo().selectionAnchorType=We),Yo(Yo().selectionFocus=g(B)),Ye.shiftKey){var Ge=l().getSelection();Ge&&l().onSelect(Fa(nh(Ge),g(B)))}else if(We===ro.multi)if(g(i)&&Ye.target.hasAttribute("data-path")){var LA=vi(f1e(o(),Ze));l().onSelect(oY(LA))}else l().onSelect(Fa(g(B),g(B)));else we!==void 0&&l().onSelect(Tde(We,g(B)));else Ye.button===0&&d()(Ye)}}),QA("mousemove",$e,function(Ye){if(Yo().selecting){Ye.preventDefault(),Ye.stopPropagation(),Yo().selectionFocus===void 0&&window.getSelection&&window.getSelection().empty();var Ie=DJ(Ye.target);wi(g(B),Yo().selectionFocus)&&Ie===Yo().selectionAnchorType||(Yo(Yo().selectionFocus=g(B)),Yo(Yo().selectionAnchorType=Ie),l().onSelect(Fa(Yo().selectionAnchor||Yo().selectionFocus,Yo().selectionFocus)))}}),QA("mouseover",$e,function(Ye){Yo().selecting||Yo().dragging||(Ye.stopPropagation(),zC(Ye.target,"data-type","selectable-value")?x(I,yde):zC(Ye.target,"data-type","selectable-key")?x(I,void 0):zC(Ye.target,"data-type","insert-selection-area-inside")?x(I,Xu):zC(Ye.target,"data-type","insert-selection-area-after")&&x(I,Vb),clearTimeout(u))}),QA("mouseout",$e,function(Ye){Ye.stopPropagation(),u=window.setTimeout(()=>x(I,void 0))}),he(t,$e),kt()}var cXe={prefix:"fas",iconName:"jsoneditor-expand",icon:[512,512,[],"","M 0,448 V 512 h 512 v -64 z M 0,0 V 64 H 512 V 0 Z M 256,96 128,224 h 256 z M 256,416 384,288 H 128 Z"]},lXe={prefix:"fas",iconName:"jsoneditor-collapse",icon:[512,512,[],"","m 0,224 v 64 h 512 v -64 z M 256,192 384,64 H 128 Z M 256,320 128,448 h 256 z"]},r2e={prefix:"fas",iconName:"jsoneditor-format",icon:[512,512,[],"","M 0,32 v 64 h 416 v -64 z M 160,160 v 64 h 352 v -64 z M 160,288 v 64 h 288 v -64 z M 0,416 v 64 h 320 v -64 z"]},gXe={prefix:"fas",iconName:"jsoneditor-compact",icon:[512,512,[],"","M 0,32 v 64 h 512 v -64 z M 0,160 v 64 h 512 v -64 z M 0,288 v 64 h 352 v -64 z"]};function dXe(t,A){t.stopPropagation(),A.onCreateObject()}function CXe(t,A){t.stopPropagation(),A.onCreateArray()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-welcome.svelte-1eamlhk { + flex: 1; + overflow: auto; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + display: flex; + flex-direction: column; + align-items: center; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-welcome.svelte-1eamlhk:last-child { + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-welcome.svelte-1eamlhk .jse-space.jse-before:where(.svelte-1eamlhk) { + flex: 1; +} +.jse-welcome.svelte-1eamlhk .jse-space.jse-after:where(.svelte-1eamlhk) { + flex: 2; +} +.jse-welcome.svelte-1eamlhk .jse-contents:where(.svelte-1eamlhk) { + display: flex; + flex-direction: column; + max-width: 300px; + margin: 2em var(--jse-padding, 10px); + gap: var(--jse-padding, 10px); +} +.jse-welcome.svelte-1eamlhk .jse-contents:where(.svelte-1eamlhk) .jse-welcome-info:where(.svelte-1eamlhk) { + color: var(--jse-panel-color-readonly, #b2b2b2); +} +.jse-welcome.svelte-1eamlhk .jse-contents:where(.svelte-1eamlhk) button:where(.svelte-1eamlhk) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); + color: var(--jse-button-primary-color, #fff); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-welcome.svelte-1eamlhk .jse-contents:where(.svelte-1eamlhk) button:where(.svelte-1eamlhk):hover { + background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); +} +.jse-welcome.svelte-1eamlhk .jse-contents:where(.svelte-1eamlhk) button:where(.svelte-1eamlhk):disabled { + background: var(--jse-button-primary-background-disabled, #9d9d9d); +}`);var IXe=(t,A)=>A.onClick(),uXe=_e('
    You can paste clipboard data using Ctrl+V, or use the following options:
    ',1),hXe=_e('
    Empty document
    ');function IY(t,A){var e=typeof t=="string"?t.toLowerCase():t,i=typeof A=="string"?A.toLowerCase():A;return(0,d2e.default)(e,i)}function V1e(t){var A=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],e=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:1,n=WA(t,A);if(Wo(n)){if(e===void 0)throw new Error("Cannot sort: no property selected by which to sort the array");return function(o){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],s=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:1,c=function(d,C){var I={boolean:0,number:1,string:2,undefined:4},u=3;return function(h,B){var f=WA(h,d),b=WA(B,d);if(typeof f!=typeof b){var k,S,w=(k=I[typeof f])!==null&&k!==void 0?k:u,_=(S=I[typeof b])!==null&&S!==void 0?S:u;return w>_?C:w<_?-C:0}return typeof f=="number"||typeof f=="boolean"?f>b?C:f1&&arguments[1]!==void 0?arguments[1]:[],s=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,a=WA(o,r),c=Object.keys(a).slice();c.sort((d,C)=>s*IY(d,C));var l={};return c.forEach(d=>l[d]=a[d]),[{op:"replace",path:pt(r),value:l}]}(t,A,i);throw new Error("Cannot sort: no array or object")}e6(["click"]);Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-navigation-bar-dropdown.svelte-2nnd2m { + position: absolute; + top: 100%; + left: 0; + z-index: 3; + background: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); + color: var(--jse-navigation-bar-dropdown-color, #656565); + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); + display: flex; + flex-direction: column; + max-height: 300px; + overflow: auto; + min-width: 80px; +} +.jse-navigation-bar-dropdown.svelte-2nnd2m button.jse-navigation-bar-dropdown-item:where(.svelte-2nnd2m) { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + border: none; + background: transparent; + color: inherit; + cursor: pointer; + outline: none; + text-align: left; + white-space: nowrap; + box-sizing: border-box; + padding: calc(0.5 * var(--jse-padding, 10px)) 36px; +} +.jse-navigation-bar-dropdown.svelte-2nnd2m button.jse-navigation-bar-dropdown-item:where(.svelte-2nnd2m):focus, .jse-navigation-bar-dropdown.svelte-2nnd2m button.jse-navigation-bar-dropdown-item:where(.svelte-2nnd2m):hover { + background: var(--jse-navigation-bar-background-highlight, #e5e5e5); +} +.jse-navigation-bar-dropdown.svelte-2nnd2m button.jse-navigation-bar-dropdown-item.jse-selected:where(.svelte-2nnd2m) { + background: var(--jse-navigation-bar-dropdown-color, #656565); + color: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); +}`);var BXe=_e(''),EXe=_e(''),fXe=_e('
    ');function QXe(t,A){St(A,!1);var e=N(A,"items",9),i=N(A,"selectedItem",9),n=N(A,"onSelect",9);li(!0);var o=fXe(),r=ge(o);fr(r,1,()=>(F(IM),F(e()),Be(()=>IM(e(),100))),c=>c,(c,l)=>{var d,C=BXe(),I=ge(C);xA((u,h,B)=>{d=ci(C,1,"jse-navigation-bar-dropdown-item svelte-2nnd2m",null,d,u),Rn(C,"title",h),xt(I,B)},[()=>({"jse-selected":g(l)===i()}),()=>(g(l),Be(()=>g(l).toString())),()=>(F(Y2),g(l),Be(()=>Y2(g(l).toString(),30)))],tA),QA("click",C,O2(()=>n()(g(l)))),he(c,C)});var s=De(r,2),a=c=>{var l=EXe();Rn(l,"title","Limited to 100 items"),he(c,l)};ze(s,c=>{F(e()),Be(()=>e().length>100)&&c(a)}),he(t,o),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-navigation-bar-item.svelte-752ro1 { + position: relative; + display: flex; +} +.jse-navigation-bar-item.svelte-752ro1 button.jse-navigation-bar-button:where(.svelte-752ro1) { + font-family: inherit; + font-size: inherit; + padding: calc(0.5 * var(--jse-padding, 10px)) 2px; + border: none; + background: transparent; + color: inherit; + cursor: pointer; + outline: none; + min-width: 2em; + white-space: nowrap; +} +.jse-navigation-bar-item.svelte-752ro1 button.jse-navigation-bar-button:where(.svelte-752ro1):focus, .jse-navigation-bar-item.svelte-752ro1 button.jse-navigation-bar-button:where(.svelte-752ro1):hover { + background: var(--jse-panel-button-background-highlight, #e0e0e0); + color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); +} +.jse-navigation-bar-item.svelte-752ro1 button.jse-navigation-bar-button.jse-navigation-bar-arrow:where(.svelte-752ro1) { + padding: 2px var(--jse-padding, 10px) 0; +} +.jse-navigation-bar-item.svelte-752ro1 button.jse-navigation-bar-button.jse-navigation-bar-arrow.jse-open:where(.svelte-752ro1) { + background: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); + color: var(--jse-navigation-bar-dropdown-color, #656565); +} +.jse-navigation-bar-item.svelte-752ro1:last-child { + padding-right: var(--jse-padding, 10px); +}`);var mXe=_e(''),pXe=_e('
    ');function s2e(t,A){St(A,!1);var e,i=Ce(void 0,!0),n=Ce(void 0,!0),{openAbsolutePopup:o,closeAbsolutePopup:r}=nI("absolute-popup"),s=N(A,"path",9),a=N(A,"index",9),c=N(A,"onSelect",9),l=N(A,"getItems",9),d=Ce(void 0,!0),C=Ce(!1,!0);function I(k){r(e),c()(g(i).concat(k))}Se(()=>(F(s()),F(a())),()=>{x(i,s().slice(0,a()))}),Se(()=>(F(s()),F(a())),()=>{x(n,s()[a()])}),Nn(),li(!0);var u,h=pXe(),B=ge(h);nn(ge(B),{get data(){return yG}});var f=De(B,2),b=k=>{var S=mXe(),w=ge(S);xA(()=>xt(w,g(n))),QA("click",S,()=>I(g(n))),he(k,S)};ze(f,k=>{g(n)!==void 0&&k(b)}),Ho(h,k=>x(d,k),()=>g(d)),xA(k=>u=ci(B,1,"jse-navigation-bar-button jse-navigation-bar-arrow svelte-752ro1",null,u,k),[()=>({"jse-open":g(C)})],tA),QA("click",B,function(){if(g(d)){x(C,!0);var k={items:l()(g(i)),selectedItem:g(n),onSelect:I};e=o(QXe,k,{anchor:g(d),closeOnOuterClick:!0,onClose:()=>{x(C,!1)}})}}),he(t,h),kt()}function ZY(t){var A,e;if(navigator.clipboard)return navigator.clipboard.writeText(t);if((A=(e=document).queryCommandSupported)!==null&&A!==void 0&&A.call(e,"copy")){var i=document.createElement("textarea");i.value=t,i.style.position="fixed",i.style.opacity="0",document.body.appendChild(i),i.select();try{document.execCommand("copy")}catch(n){console.error(n)}finally{document.body.removeChild(i)}return Promise.resolve()}return console.error("Copy failed."),Promise.resolve()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-navigation-bar-path-editor.svelte-zc2wx7 { + flex: 1; + display: flex; + border: var(--jse-edit-outline, 2px solid #656565); + background: var(--jse-background-color, #fff); +} +.jse-navigation-bar-path-editor.svelte-zc2wx7 input.jse-navigation-bar-text:where(.svelte-zc2wx7) { + flex: 1; + font-family: inherit; + font-size: inherit; + padding: 0 5px 1px; + background: var(--jse-background-color, #fff); + color: var(--jse-text-color, #4d4d4d); + border: none; + outline: none; +} +.jse-navigation-bar-path-editor.svelte-zc2wx7 button:where(.svelte-zc2wx7) { + border: none; + background: var(--jse-background-color, #fff); + cursor: pointer; + font-family: inherit; + font-size: 80%; + color: inherit; +} +.jse-navigation-bar-path-editor.svelte-zc2wx7 button.jse-navigation-bar-copy.copied:where(.svelte-zc2wx7) { + color: var(--message-success-background, #9ac45d); +} +.jse-navigation-bar-path-editor.svelte-zc2wx7 button.jse-navigation-bar-validation-error:where(.svelte-zc2wx7) { + color: var(--jse-error-color, #ee5341); +} +.jse-navigation-bar-path-editor.error.svelte-zc2wx7 { + border-color: var(--jse-error-color, #ee5341); +} +.jse-navigation-bar-path-editor.error.svelte-zc2wx7 input.jse-navigation-bar-text:where(.svelte-zc2wx7) { + color: var(--jse-error-color, #ee5341); +} +.jse-navigation-bar-path-editor.svelte-zc2wx7 .jse-copied-text:where(.svelte-zc2wx7) { + background: var(--message-success-background, #9ac45d); + color: var(--jse-message-success-color, #fff); + position: relative; + margin: 2px; + padding: 0 5px; + border-radius: 3px; +}`);var wXe=_e(''),yXe=_e('
    Copied!
    '),DXe=_e('
    ');function vXe(t,A){St(A,!1);var e=Ce(),i=nI("absolute-popup"),n=N(A,"path",8),o=N(A,"pathParser",8),r=N(A,"onChange",8),s=N(A,"onClose",8),a=N(A,"onError",8),c=N(A,"pathExists",8),l=Ce(),d=Ce(),C=Ce(!1),I=void 0,u=Ce(!1);function h(){g(l).focus()}function B(H){try{var V=o().parse(H);return function(Z){if(!c()(Z))throw new Error("Path does not exist in current document")}(V),{path:V,error:void 0}}catch(Z){return{path:void 0,error:Z}}}ua(()=>{h()}),gg(()=>{clearTimeout(I)}),Se(()=>(F(o()),F(n())),()=>{x(d,o().stringify(n()))}),Se(()=>(g(C),g(d)),()=>{x(e,g(C)?B(g(d)).error:void 0)}),Nn(),li();var f,b=DXe(),k=ge(b);Ho(k,H=>x(l,H),()=>g(l));var S=De(k,2),w=H=>{var V=wXe();nn(ge(V),{get data(){return hC}}),Ka(V,(Z,ye)=>eQ?.(Z,ye),()=>SA({text:String(g(e)||"")},i)),he(H,V)};ze(S,H=>{g(e)&&H(w)});var _=De(S,2),K=H=>{he(H,yXe())};ze(_,H=>{g(u)&&H(K)});var J,O=De(_,2);nn(ge(O),{get data(){return M2}}),xA((H,V)=>{f=ci(b,1,"jse-navigation-bar-path-editor svelte-zc2wx7",null,f,H),ah(k,g(d)),J=ci(O,1,"jse-navigation-bar-copy svelte-zc2wx7",null,J,V)},[()=>({error:g(e)}),()=>({copied:g(u)})],tA),QA("keydown",k,O2(function(H){var V=X2(H);if(V==="Escape"&&(H.preventDefault(),s()()),V==="Enter"){H.preventDefault(),x(C,!0);var Z=B(g(d));Z.path!==void 0?r()(Z.path):a()(Z.error)}})),QA("input",k,function(H){x(d,H.currentTarget.value)}),QA("click",O,function(){ZY(g(d)),x(u,!0),I=window.setTimeout(()=>x(u,!1),1e3),h()}),he(t,b),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-navigation-bar.svelte-xs03gj { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + background: var(--jse-panel-background, #ebebeb); + color: var(--jse-panel-button-color, inherit); + padding: 0; + margin: 0; + display: flex; + overflow: auto; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-navigation-bar.svelte-xs03gj .jse-navigation-bar-edit:where(.svelte-xs03gj) { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); + color: var(--jse-panel-color-readonly, #b2b2b2); + background: transparent; + border: none; + display: flex; + cursor: pointer; + outline: none; + align-items: center; +} +.jse-navigation-bar.svelte-xs03gj .jse-navigation-bar-edit.flex:where(.svelte-xs03gj) { + flex: 1; +} +.jse-navigation-bar.svelte-xs03gj .jse-navigation-bar-edit:where(.svelte-xs03gj):focus, .jse-navigation-bar.svelte-xs03gj .jse-navigation-bar-edit:where(.svelte-xs03gj):hover, .jse-navigation-bar.svelte-xs03gj .jse-navigation-bar-edit.editing:where(.svelte-xs03gj) { + background: var(--jse-panel-button-background-highlight, #e0e0e0); + color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); + transition: color 0.2s ease-in, background 0.2s ease-in; +} +.jse-navigation-bar.svelte-xs03gj .jse-navigation-bar-edit:where(.svelte-xs03gj) .jse-navigation-bar-space:where(.svelte-xs03gj) { + flex: 1; + text-align: left; +}`);var bXe=_e(" ",1),MXe=_e('
    ');function SXe(t,A){St(A,!1);var e=Ce(void 0,!0),i=Ce(void 0,!0),n=Es("jsoneditor:NavigationBar"),o=N(A,"json",9),r=N(A,"selection",9),s=N(A,"onSelect",9),a=N(A,"onError",9),c=N(A,"pathParser",9),l=Ce(void 0,!0),d=Ce(!1,!0);function C(V){n("get items for path",V);var Z=WA(o(),V);if(Array.isArray(Z))return dv(0,Z.length).map(String);if(vn(Z)){var ye=Object.keys(Z).slice(0);return ye.sort(IY),ye}return[]}function I(V){return Us(o(),V)}function u(V){n("select path",JSON.stringify(V)),s()(Fa(V,V))}function h(){x(d,!1)}function B(V){h(),u(V)}Se(()=>(F(r()),It),()=>{x(e,r()?It(r()):[])}),Se(()=>(F(o()),g(e)),()=>{x(i,sr(WA(o(),g(e))))}),Se(()=>g(e),()=>{g(e),setTimeout(()=>{if(g(l)&&g(l).scrollTo){var V=g(l).scrollWidth-g(l).clientWidth;V>0&&(n("scrollTo ",V),g(l).scrollTo({left:V,behavior:"smooth"}))}})}),Nn(),li(!0);var f=MXe(),b=ge(f),k=V=>{var Z=bXe(),ye=Ut(Z);fr(ye,1,()=>g(e),Jr,(X,ue,oe)=>{s2e(X,{getItems:C,get path(){return g(e)},index:oe,onSelect:u})});var P=De(ye,2),se=X=>{s2e(X,{getItems:C,get path(){return g(e)},get index(){return g(e),Be(()=>g(e).length)},onSelect:u})};ze(P,X=>{g(i)&&X(se)}),he(V,Z)},S=V=>{vXe(V,{get path(){return g(e)},onClose:h,onChange:B,get onError(){return a()},pathExists:I,get pathParser(){return c()}})};ze(b,V=>{g(d)?V(S,!1):V(k)});var w,_=De(b,2),K=ge(_),J=ge(K),O=De(K,2),H=tA(()=>g(d)?Qoe:goe);nn(O,{get data(){return g(H)}}),Ho(f,V=>x(l,V),()=>g(l)),xA((V,Z)=>{w=ci(_,1,"jse-navigation-bar-edit svelte-xs03gj",null,w,V),Rn(_,"title",g(d)?"Cancel editing the selected path":"Edit the selected path"),xt(J,Z)},[()=>({flex:!g(d),editing:g(d)}),()=>(F(sr),F(o()),g(d),Be(()=>sr(o())||g(d)?"\xA0":"Navigation bar"))],tA),QA("click",_,function(){x(d,!g(d))}),he(t,f),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-search-box.svelte-1mxl2uo { + border: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); + border-radius: 3px; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + background: var(--jse-panel-background, #ebebeb); + color: var(--jse-panel-color-readonly, #b2b2b2); + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); + display: inline-block; + width: 400px; + max-width: 100%; + overflow: auto; +} +.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) { + display: flex; + align-items: stretch; +} +.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) button:where(.svelte-1mxl2uo), +.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) input:where(.svelte-1mxl2uo) { + font-family: inherit; + font-size: inherit; +} +.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) button:where(.svelte-1mxl2uo) { + display: block; + text-align: center; + border: none; + padding: 0 5px; + margin: 0; + cursor: pointer; + color: var(--jse-panel-button-color, inherit); + background: var(--jse-panel-button-background, transparent); +} +.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) button:where(.svelte-1mxl2uo):hover { + color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); + background: var(--jse-panel-button-background-highlight, #e0e0e0); +} +.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) input:where(.svelte-1mxl2uo) { + color: var(--jse-panel-color, var(--jse-text-color, #4d4d4d)); + border: var(--jse-input-border, 1px solid #d8dbdf); + border-radius: 3px; + background: var(--jse-input-background, var(--jse-background-color, #fff)); + height: 28px; + padding: 0 5px; + margin: 0; + flex: 1; + width: 0; + min-width: 50px; + outline: none; +} +.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) .jse-replace-toggle:where(.svelte-1mxl2uo) { + padding: var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)); + min-width: 20px; + background: var(--jse-panel-button-background-highlight, #e0e0e0); +} +.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) .jse-search-contents:where(.svelte-1mxl2uo) { + flex: 1; + display: flex; + flex-direction: column; + padding: calc(0.5 * var(--jse-padding, 10px)); + gap: calc(0.5 * var(--jse-padding, 10px)); +} +.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) .jse-search-contents:where(.svelte-1mxl2uo) .jse-search-section:where(.svelte-1mxl2uo) { + flex: 1; + display: flex; + align-items: center; + position: relative; +} +.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) .jse-search-contents:where(.svelte-1mxl2uo) .jse-search-section:where(.svelte-1mxl2uo) .jse-search-icon:where(.svelte-1mxl2uo) { + color: inherit; + cursor: inherit; + background: inherit; + width: 32px; + text-align: center; +} +.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) .jse-search-contents:where(.svelte-1mxl2uo) .jse-search-section:where(.svelte-1mxl2uo) label.jse-search-input-label:where(.svelte-1mxl2uo) { + flex: 1; + display: flex; +} +.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) .jse-search-contents:where(.svelte-1mxl2uo) .jse-search-section:where(.svelte-1mxl2uo) .jse-search-count:where(.svelte-1mxl2uo) { + color: inherit; + font-size: 80%; + visibility: hidden; + padding: 0 5px; + min-width: 36px; + text-align: center; +} +.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) .jse-search-contents:where(.svelte-1mxl2uo) .jse-search-section:where(.svelte-1mxl2uo) .jse-search-count.jse-visible:where(.svelte-1mxl2uo) { + visibility: visible; +} +.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) .jse-search-contents:where(.svelte-1mxl2uo) .jse-replace-section:where(.svelte-1mxl2uo) { + flex: 1; + display: flex; + padding-left: 32px; +} +.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) .jse-search-contents:where(.svelte-1mxl2uo) .jse-replace-section:where(.svelte-1mxl2uo) button:where(.svelte-1mxl2uo) { + width: auto; +}`);var kXe=_e(''),xXe=_e('
    '),_Xe=_e('');function q1e(t,A){St(A,!1);var e=Ce(void 0,!0),i=Ce(void 0,!0),n=Ce(void 0,!0),o=Es("jsoneditor:SearchBox"),r=N(A,"json",9),s=N(A,"documentState",9),a=N(A,"parser",9),c=N(A,"showSearch",9),l=N(A,"showReplace",13),d=N(A,"readOnly",9),C=N(A,"columns",9),I=N(A,"onSearch",9),u=N(A,"onFocus",9),h=N(A,"onPatch",9),B=N(A,"onClose",9),f=Ce("",!0),b="",k=Ce("",!0),S=Ce(!1,!0),w=Ce(void 0,!0),_=KE(function(Ge){return He.apply(this,arguments)},300),K=KE(function(Ge){return PA.apply(this,arguments)},300);function J(){l(!l()&&!d())}function O(Ge){Ge.stopPropagation();var LA=X2(Ge);LA==="Enter"&&(Ge.preventDefault(),g(f)!==b?_.flush():oe()),LA==="Shift+Enter"&&(Ge.preventDefault(),me()),LA==="Ctrl+Enter"&&(Ge.preventDefault(),l()?ye():oe()),LA==="Ctrl+H"&&(Ge.preventDefault(),J()),LA==="Escape"&&(Ge.preventDefault(),Ie())}function H(Ge){X2(Ge)==="Enter"&&(Ge.preventDefault(),Ge.stopPropagation(),ye())}function V(){return Z.apply(this,arguments)}function Z(){return(Z=Vt(function*(){bo(),yield _.flush()})).apply(this,arguments)}function ye(){return P.apply(this,arguments)}function P(){return(P=Vt(function*(){var Ge;if(!d()){var LA=(Ge=g(w))===null||Ge===void 0?void 0:Ge.activeItem;if(o("handleReplace",{replaceText:g(k),activeItem:LA}),g(w)&&LA&&r()!==void 0){x(w,SA(SA({},Jde(g(w))),{},{activeIndex:g(i)}));var{operations:Fe,newSelection:pe}=Hqe(r(),s(),g(k),LA,a());h()(Fe,(Wt,Qt)=>({state:Qt,selection:pe})),bo(),yield K.flush(),yield $e()}}})).apply(this,arguments)}function se(){return X.apply(this,arguments)}function X(){return(X=Vt(function*(){if(!d()){o("handleReplaceAll",{text:g(f),replaceText:g(k)});var{operations:Ge,newSelection:LA}=function(Fe,pe,Wt,Qt,BA){for(var _t=Yde(Wt,Fe,{maxResults:1/0}),VA=[],YA=0;YA<_t.length;YA++){var Jt=_t[YA-1],KA=_t[YA];YA!==0&&KA.field===Jt.field&&wi(KA.path,Jt.path)?vi(VA).items.push(KA):VA.push({path:KA.path,field:KA.field,items:[KA]})}VA.sort((z,Ae)=>z.field!==Ae.field?z.field===A0.key?1:-1:Ae.path.length-z.path.length);var di,G=[];return VA.forEach(z=>{var{field:Ae,path:de,items:Ne}=z;if(Ae===A0.key){var pA=Hi(de),vA=WA(Fe,pA),Ke=vi(de),Re=r6(pA,Object.keys(vA),Ke,zde(Ke,Qt,Ne));G=G.concat(Re),di=$f(Fe,Re)}else{if(Ae!==A0.value)throw new Error("Cannot replace: unknown type of search result field ".concat(Ae));var wt=WA(Fe,de);if(wt===void 0)throw new Error("Cannot replace: path not found ".concat(pt(de)));var st=typeof wt=="string"?wt:String(wt),nA=_d(Fe,pe,de),Bt=zde(st,Qt,Ne),Wi=[{op:"replace",path:pt(de),value:nA?Bt:rQ(Bt,BA)}];G=G.concat(Wi),di=$f(Fe,Wi)}}),{operations:G,newSelection:di}}(r(),s(),g(f),g(k),a());h()(Ge,(Fe,pe)=>({state:pe,selection:LA})),yield $e()}})).apply(this,arguments)}function ue(Ge){Ge.select()}function oe(){return le.apply(this,arguments)}function le(){return(le=Vt(function*(){x(w,g(w)?Jde(g(w)):void 0),yield $e()})).apply(this,arguments)}function me(){return Te.apply(this,arguments)}function Te(){return Te=Vt(function*(){x(w,g(w)?function(Ge){var LA=Ge.activeIndex>0?Ge.activeIndex-1:Ge.items.length-1,Fe=Ge.items[LA],pe=Ge.items.map((Wt,Qt)=>SA(SA({},Wt),{},{active:Qt===LA}));return SA(SA({},Ge),{},{items:pe,activeItem:Fe,activeIndex:LA})}(g(w)):void 0),yield $e()}),Te.apply(this,arguments)}function $e(){return Je.apply(this,arguments)}function Je(){return(Je=Vt(function*(){var Ge;o("handleFocus",g(w));var LA=(Ge=g(w))===null||Ge===void 0?void 0:Ge.activeItem;LA&&r()!==void 0&&(yield u()(LA.path,LA.resultIndex))})).apply(this,arguments)}function Qe(){return Qe=Vt(function*(Ge){yield JA(Ge,g(f),r())}),Qe.apply(this,arguments)}function He(){return He=Vt(function*(Ge){yield JA(c(),Ge,r()),yield $e()}),He.apply(this,arguments)}function PA(){return PA=Vt(function*(Ge){yield JA(c(),g(f),Ge)}),PA.apply(this,arguments)}function JA(Ge,LA,Fe){return Ye.apply(this,arguments)}function Ye(){return Ye=Vt(function*(Ge,LA,Fe){return Ge?(o("applySearch",{showSearch:Ge,text:LA}),LA===""?(o("clearing search result"),g(w)!==void 0&&x(w,void 0),Promise.resolve()):(b=LA,x(S,!0),new Promise(pe=>{setTimeout(()=>{var Wt=Yde(LA,Fe,{maxResults:vJ,columns:C()});x(w,function(Qt,BA){var _t=BA!=null&&BA.activeItem?Pde(BA.activeItem):void 0,VA=Qt.findIndex(KA=>wi(_t,Pde(KA))),YA=VA!==-1?VA:BA?.activeIndex!==void 0&&BA?.activeIndex0?0:-1,Jt=Qt.map((KA,di)=>SA(SA({resultIndex:di},KA),{},{active:di===YA}));return{items:Jt,activeItem:Jt[YA],activeIndex:YA}}(Wt,g(w))),x(S,!1),pe()})}))):(g(w)&&x(w,void 0),Promise.resolve())}),Ye.apply(this,arguments)}function Ie(){o("handleClose"),_.cancel(),K.cancel(),JA(!1,g(f),r()),B()()}Se(()=>g(w),()=>{var Ge;x(e,((Ge=g(w))===null||Ge===void 0||(Ge=Ge.items)===null||Ge===void 0?void 0:Ge.length)||0)}),Se(()=>g(w),()=>{var Ge;x(i,((Ge=g(w))===null||Ge===void 0?void 0:Ge.activeIndex)||0)}),Se(()=>(g(e),vJ),()=>{x(n,g(e)>=vJ?"".concat(999,"+"):String(g(e)))}),Se(()=>(F(I()),g(w)),()=>{I()(g(w))}),Se(()=>F(c()),()=>{(function(Ge){Qe.apply(this,arguments)})(c())}),Se(()=>g(f),()=>{_(g(f))}),Se(()=>F(r()),()=>{K(r())}),Nn(),li(!0);var We=ar(),we=Ut(We),Ze=Ge=>{var LA=_Xe(),Fe=ge(LA),pe=ge(Fe),Wt=Ke=>{var Re=kXe(),wt=ge(Re),st=tA(()=>l()?ld:TE);nn(wt,{get data(){return g(st)}}),QA("click",Re,J),he(Ke,Re)};ze(pe,Ke=>{d()||Ke(Wt)});var Qt=ge(De(pe,2)),BA=ge(Qt),_t=ge(BA),VA=Ke=>{nn(Ke,{get data(){return aoe},spin:!0})},YA=Ke=>{nn(Ke,{get data(){return o3}})};ze(_t,Ke=>{g(S)?Ke(VA):Ke(YA,!1)});var Jt=De(BA,2),KA=ge(Jt);zs(()=>CM(KA,()=>g(f),Ke=>x(f,Ke))),Ka(KA,Ke=>ue?.(Ke)),zs(()=>QA("paste",KA,V));var di,G=De(Jt,2),z=ge(G),Ae=De(G,2);nn(ge(Ae),{get data(){return Eoe}});var de=De(Ae,2);nn(ge(de),{get data(){return doe}});var Ne=De(de,2);nn(ge(Ne),{get data(){return r3}});var pA=De(Qt,2),vA=Ke=>{var Re=xXe(),wt=ge(Re),st=De(wt,2),nA=De(st,2);CM(wt,()=>g(k),Bt=>x(k,Bt)),QA("keydown",wt,H),QA("click",st,ye),QA("click",nA,se),he(Ke,Re)};ze(pA,Ke=>{l()&&!d()&&Ke(vA)}),xA(Ke=>{var Re;di=ci(G,1,"jse-search-count svelte-1mxl2uo",null,di,Ke),xt(z,"".concat(g(i)!==-1&&g(i)({"jse-visible":g(f)!==""})],tA),QA("click",Ae,oe),QA("click",de,me),QA("click",Ne,Ie),QA("keydown",Fe,O),he(Ge,LA)};ze(we,Ge=>{c()&&Ge(Ze)}),he(t,We),kt()}var Vp=Symbol("path");function RXe(t,A){var e=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1/0,i={};Array.isArray(t)&&function(o,r,s){if(o.length1?(o.length-1)/(r-1):o.length,c=0;c{vn(o)?W1e(o,i,A):i[Vp]=!0});var n=[];return Vp in i&&n.push([]),Z1e(i,[],n,A),n}function W1e(t,A,e){for(var i in t){var n=t[i],o=A[i]||(A[i]={});vn(n)&&e?W1e(n,o,e):o[Vp]===void 0&&(o[Vp]=!0)}}function Z1e(t,A,e,i){for(var n in t){var o=A.concat(n),r=t[n];r&&r[Vp]===!0&&e.push(o),nr(r)&&i&&Z1e(r,o,e,i)}}function NXe(t,A,e,i,n,o){for(var r=arguments.length>6&&arguments[6]!==void 0?arguments[6]:80,s=Wo(e)?e.length:0,a=function(b,k){var S=Object.values(b);if(An(S))return k;var w=(_,K)=>_+K;return S.reduce(w)/S.length}(i,n),c=t-r,l=A+2*r,d=b=>i[b]||n,C=0,I=o;I0&&(I-=d(--C));for(var u=C,h=0;hNd(i,o))}}function $u(t,A){var{rowIndex:e,columnIndex:i}=t;return[String(e),...A[i]]}function LXe(t,A){var[e,i]=CG(t,r=>SY(r.path[0])),n=gG(e,FXe),o=dG(n,r=>{var s={row:[],columns:{}};return r.forEach(a=>{var c=function(l,d){var C=rg(l.path,d);return C.columnIndex!==-1?C.columnIndex:-1}(a,A);c!==-1?(s.columns[c]===void 0&&(s.columns[c]=[]),s.columns[c].push(a)):s.row.push(a)}),s});return{root:i,rows:o}}function Nf(t,A){if(A&&A.length!==0)return A.length===1?A[0]:{path:t,message:"Multiple validation issues: "+A.map(e=>Yc(e.path)+" "+e.message).join(", "),severity:e0.warning}}function FXe(t){return parseInt(t.path[0],10)}function GXe(t,A,e){var i=A.some(n=>function(o,r,s){if(!o)return!1;if(r.op==="replace"){var a=Sa(r.path),{rowIndex:c,columnIndex:l}=rg(a,s),d=s.findIndex(C=>wi(C,o.path));if(c!==-1&&l!==-1&&l!==d)return!1}return!0}(t,n,e));return i?void 0:t}var Ga=Es("jsoneditor:actions");function X1e(t){return uY.apply(this,arguments)}function uY(){return uY=Vt(function*(t){var{json:A,selection:e,indentation:i,readOnly:n,parser:o,onPatch:r}=t;if(!n&&A!==void 0&&e&&Of(e)){var s=p1e(A,e,i,o);if(s!==void 0){Ga("cut",{selection:e,clipboard:s,indentation:i}),yield ZY(s);var{operations:a,newSelection:c}=M1e(A,e);r(a,(l,d)=>({state:d,selection:c}))}}}),uY.apply(this,arguments)}function $1e(t){return hY.apply(this,arguments)}function hY(){return hY=Vt(function*(t){var{json:A,selection:e,indentation:i,parser:n}=t,o=p1e(A,e,i,n);o!==void 0&&(Ga("copy",{clipboard:o,indentation:i}),yield ZY(o))}),hY.apply(this,arguments)}function eCe(t){var{clipboardText:A,json:e,selection:i,readOnly:n,parser:o,onPatch:r,onChangeText:s,onPasteMultilineText:a,openRepairModal:c}=t;if(!n)try{l(A)}catch{c(A,C=>{Ga("repaired pasted text: ",C),l(C)})}function l(d){if(e!==void 0){var C=i||zi([]),I=b1e(e,C,d,o),u=function(h,B,f){var b=arguments.length>3&&arguments[3]!==void 0?arguments[3]:Fqe;if(h.length>b)return!1;var k=/\n/.test(h);if(!k)return!1;var S=B.some(_=>_.op==="replace"&&Array.isArray(_.value)),w=B.filter(_=>_.op==="add").length>1;if(!S&&!w)return!1;try{return t6(h,f.parse),!1}catch{return!0}}(A,I,o);Ga("paste",{pastedText:d,operations:I,ensureSelection:C,pasteMultilineText:u}),r(I,(h,B)=>{var f=B;return I.filter(b=>(TF(b)||bD(b))&&sr(b.value)).forEach(b=>{var k=Sc(e,b.path);f=lh(h,f,k)}),{state:f}}),u&&a(d)}else Ga("paste text",{pastedText:d}),s(A,(h,B)=>{if(h)return{state:lh(h,B,[])}})}}function ACe(t){var{json:A,text:e,selection:i,keepSelection:n,readOnly:o,onChange:r,onPatch:s}=t;if(!o&&i){var a=A!==void 0&&(Bs(i)||fn(i))?Fa(i.path,i.path):i;if(An(It(i)))Ga("remove root",{selection:i}),r&&r({text:"",json:void 0},A!==void 0?{text:void 0,json:A}:{text:e||"",json:A},{contentErrors:void 0,patchResult:void 0});else if(A!==void 0){var{operations:c,newSelection:l}=M1e(A,a);Ga("remove",{operations:c,selection:i,newSelection:l}),s(c,(d,C)=>({state:C,selection:n?i:l}))}}}function MM(t){var{insertType:A,selectInside:e,initialValue:i,json:n,selection:o,readOnly:r,parser:s,onPatch:a,onReplaceJson:c}=t;if(!r){var l=function(h,B,f){if(f==="object")return{};if(f==="array")return[];if(f==="structure"&&h!==void 0){var b=B?Q1e(B):[],k=WA(h,b);if(Array.isArray(k)&&!An(k)){var S=Wl(k);return sr(S)?sG(S,w=>Array.isArray(w)?[]:vn(w)?void 0:""):""}}return""}(n,o,A);if(n!==void 0){var d=s.stringify(l),C=b1e(n,o,d,s);Ga("onInsert",{insertType:A,operations:C,newValue:l,data:d});var I=vi(C.filter(h=>h.op==="add"||h.op==="replace"));a(C,(h,B,f)=>{if(I){var b=Sc(h,I.path);if(sr(l))return{state:Zg(h,B,b,HY),selection:e?e1(b):f};if(l===""){var k=An(b)?void 0:WA(h,Hi(b));return{state:Zg(h,B,b,rM),selection:vn(k)?zY(b,i):fM(b,i)}}}}),Ga("after patch")}else{Ga("onInsert",{insertType:A,newValue:l});var u=[];c(l,(h,B)=>({state:lh(h,B,u),selection:sr(l)?e1(u):fM(u)}))}}}function tCe(t){return BY.apply(this,arguments)}function BY(){return BY=Vt(function*(t){var{char:A,selectInside:e,json:i,selection:n,readOnly:o,parser:r,onPatch:s,onReplaceJson:a,onSelect:c}=t;o||(Bs(n)?c(SA(SA({},n),{},{edit:!0,initialValue:A})):A==="{"?MM({insertType:"object",selectInside:e,initialValue:void 0,json:i,selection:n,readOnly:o,parser:r,onPatch:s,onReplaceJson:a}):A==="["?MM({insertType:"array",selectInside:e,initialValue:void 0,json:i,selection:n,readOnly:o,parser:r,onPatch:s,onReplaceJson:a}):fn(n)&&i!==void 0?sr(WA(i,n.path))||c(SA(SA({},n),{},{edit:!0,initialValue:A})):(Ga("onInsertValueWithCharacter",{char:A}),yield function(l){return EY.apply(this,arguments)}({char:A,json:i,selection:n,readOnly:o,parser:r,onPatch:s,onReplaceJson:a})))}),BY.apply(this,arguments)}function EY(){return EY=Vt(function*(t){var{char:A,json:e,selection:i,readOnly:n,parser:o,onPatch:r,onReplaceJson:s}=t;n||MM({insertType:"value",selectInside:!1,initialValue:A,json:e,selection:i,readOnly:n,parser:o,onPatch:r,onReplaceJson:s})}),EY.apply(this,arguments)}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-json-preview.svelte-1vjn89h { + flex: 1; + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + color: var(--jse-panel-color-readonly, #b2b2b2); + overflow: auto; + white-space: pre-wrap; + padding: 2px; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +}`);var KXe=_e('
    ');function iCe(t,A){St(A,!1);var e=Ce(),i=Ce(),n=N(A,"text",8),o=N(A,"json",8),r=N(A,"indentation",8),s=N(A,"parser",8);Se(()=>(F(o()),F(n())),()=>{x(e,o()!==void 0?{json:o()}:{text:n()||""})}),Se(()=>(g(e),F(r()),F(s()),uM),()=>{x(i,Y2($J(g(e),r(),s()),uM))}),Nn(),li();var a=KXe(),c=ge(a);xA(()=>xt(c,g(i))),he(t,a),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +button.jse-context-menu-button.svelte-1idfykj { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + flex: 1; + white-space: nowrap; + padding: var(--jse-padding, 10px); + color: inherit; +} +button.jse-context-menu-button.svelte-1idfykj:hover { + background: var(--jse-context-menu-background-highlight, #7a7a7a); +} +button.jse-context-menu-button.svelte-1idfykj:focus { + background: var(--jse-context-menu-background-highlight, #7a7a7a); + z-index: 1; +} +button.jse-context-menu-button.svelte-1idfykj:disabled { + color: var(--jse-context-menu-color-disabled, #9d9d9d); + background: unset; +} +button.jse-context-menu-button.left.svelte-1idfykj { + text-align: left; +} +button.jse-context-menu-button.svelte-1idfykj svg { + width: 16px; +}`);var UXe=_e('');function UJ(t,A){St(A,!1);var e=N(A,"item",8),i=N(A,"className",8,void 0),n=N(A,"onRequestClose",8);li();var o=UXe(),r=ge(o),s=l=>{nn(l,{get data(){return F(e()),Be(()=>e().icon)}})};ze(r,l=>{F(e()),Be(()=>e().icon)&&l(s)});var a=De(r,2),c=l=>{var d=Ss();xA(()=>xt(d,(F(e()),Be(()=>e().text)))),he(l,d)};ze(a,l=>{F(e()),Be(()=>e().text)&&l(c)}),xA(l=>{ci(o,1,l,"svelte-1idfykj"),Rn(o,"title",(F(e()),Be(()=>e().title))),o.disabled=(F(e()),Be(()=>e().disabled||!1))},[()=>AI((F(o0),F(i()),F(e()),Be(()=>o0("jse-context-menu-button",i(),e().className))))],tA),QA("click",o,l=>{n()(),e().onClick(l)}),he(t,o),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-dropdown-button.svelte-11rxb2m { + flex: 1; + line-height: normal; + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + position: relative; + padding: 0; + display: flex; +} +.jse-dropdown-button.svelte-11rxb2m ul:where(.svelte-11rxb2m) { + margin: 0; + padding: 0; +} +.jse-dropdown-button.svelte-11rxb2m ul:where(.svelte-11rxb2m) li:where(.svelte-11rxb2m) { + margin: 0; + padding: 0; + list-style-type: none; +} +.jse-dropdown-button.svelte-11rxb2m button.jse-open-dropdown:where(.svelte-11rxb2m) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + width: 2em; + background: var(--jse-context-menu-background, #656565); + color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); + border-radius: 0; +} +.jse-dropdown-button.svelte-11rxb2m button.jse-open-dropdown.jse-visible:where(.svelte-11rxb2m) { + background: var(--jse-context-menu-background, #656565); +} +.jse-dropdown-button.svelte-11rxb2m button.jse-open-dropdown:where(.svelte-11rxb2m):hover { + background: var(--jse-context-menu-background-highlight, #7a7a7a); +} +.jse-dropdown-button.svelte-11rxb2m button.jse-open-dropdown:where(.svelte-11rxb2m):focus { + z-index: 1; +} +.jse-dropdown-button.svelte-11rxb2m button.jse-open-dropdown:where(.svelte-11rxb2m):disabled { + color: var(--jse-context-menu-color-disabled, #9d9d9d); + background: unset; +} +.jse-dropdown-button.svelte-11rxb2m .jse-dropdown-items:where(.svelte-11rxb2m) { + display: none; + position: absolute; + top: 100%; + left: 0; + z-index: 1; + background: var(--jse-context-menu-background, #656565); + color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); +} +.jse-dropdown-button.svelte-11rxb2m .jse-dropdown-items.jse-visible:where(.svelte-11rxb2m) { + display: block; +} +.jse-dropdown-button.svelte-11rxb2m .jse-dropdown-items:where(.svelte-11rxb2m) button:where(.svelte-11rxb2m) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + width: 100%; + text-align: left; + padding: var(--jse-padding, 10px); + margin: 0; +} +.jse-dropdown-button.svelte-11rxb2m .jse-dropdown-items:where(.svelte-11rxb2m) button:where(.svelte-11rxb2m):hover { + background: var(--jse-context-menu-background-highlight, #7a7a7a); +} +.jse-dropdown-button.svelte-11rxb2m .jse-dropdown-items:where(.svelte-11rxb2m) button:where(.svelte-11rxb2m):disabled { + color: var(--jse-context-menu-color-disabled, #9d9d9d); + background: unset; +}`);var TXe=_e('
  • '),OXe=_e('
      ');Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +button.jse-context-menu-button.svelte-1idfykj { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + flex: 1; + white-space: nowrap; + padding: var(--jse-padding, 10px); + color: inherit; +} +button.jse-context-menu-button.svelte-1idfykj:hover { + background: var(--jse-context-menu-background-highlight, #7a7a7a); +} +button.jse-context-menu-button.svelte-1idfykj:focus { + background: var(--jse-context-menu-background-highlight, #7a7a7a); + z-index: 1; +} +button.jse-context-menu-button.svelte-1idfykj:disabled { + color: var(--jse-context-menu-color-disabled, #9d9d9d); + background: unset; +} +button.jse-context-menu-button.left.svelte-1idfykj { + text-align: left; +} +button.jse-context-menu-button.svelte-1idfykj svg { + width: 16px; +}`);var JXe=_e('');function TJ(t,A){St(A,!1);var e=Ce(),i=N(A,"item",8),n=N(A,"className",8,void 0),o=N(A,"onRequestClose",8);Se(()=>(F(i()),F(o())),()=>{x(e,i().items.map(r=>SA(SA({},r),{},{onClick:s=>{o()(),r.onClick(s)}})))}),Nn(),li(),function(r,s){St(s,!1);var a=Ce(void 0,!0),c=N(s,"items",25,()=>[]),l=N(s,"title",9,void 0),d=N(s,"width",9,"120px"),C=Ce(!1,!0);function I(){x(C,!1)}function u(w){X2(w)==="Escape"&&(w.preventDefault(),x(C,!1))}ua(()=>{document.addEventListener("click",I),document.addEventListener("keydown",u)}),gg(()=>{document.removeEventListener("click",I),document.removeEventListener("keydown",u)}),Se(()=>F(c()),()=>{x(a,c().every(w=>w.disabled===!0))}),Nn(),li(!0);var h=OXe(),B=ge(h);Er(B,s,"defaultItem",{},null);var f,b=De(B,2);nn(ge(b),{get data(){return ld}});var k,S=De(b,2);fr(ge(S),5,c,Jr,(w,_)=>{var K=TXe(),J=ge(K),O=ge(J),H=Z=>{nn(Z,{get data(){return g(_),Be(()=>g(_).icon)}})};ze(O,Z=>{g(_),Be(()=>g(_).icon)&&Z(H)});var V=De(O);xA(()=>{var Z;Rn(J,"title",(g(_),Be(()=>g(_).title))),J.disabled=(g(_),Be(()=>g(_).disabled)),ci(J,1,AI((g(_),Be(()=>g(_).className))),"svelte-11rxb2m"),xt(V," ".concat((g(_),(Z=Be(()=>g(_).text))!==null&&Z!==void 0?Z:"")))}),QA("click",J,Z=>g(_).onClick(Z)),he(w,K)}),xA((w,_)=>{var K;Rn(h,"title",l()),f=ci(b,1,"jse-open-dropdown svelte-11rxb2m",null,f,w),b.disabled=g(a),k=ci(S,1,"jse-dropdown-items svelte-11rxb2m",null,k,_),cg(S,"width: ".concat((K=d())!==null&&K!==void 0?K:"",";"))},[()=>({"jse-visible":g(C)}),()=>({"jse-visible":g(C)})],tA),QA("click",b,function(){var w=g(C);setTimeout(()=>x(C,!w))}),QA("click",h,I),he(r,h),kt()}(t,{get width(){return F(i()),Be(()=>i().width)},get items(){return g(e)},$$slots:{defaultItem:(r,s)=>{var a=JXe(),c=ge(a),l=C=>{nn(C,{get data(){return F(i()),Be(()=>i().main.icon)}})};ze(c,C=>{F(i()),Be(()=>i().main.icon)&&C(l)});var d=De(c);xA(C=>{var I;ci(a,1,C,"svelte-1idfykj"),Rn(a,"title",(F(i()),Be(()=>i().main.title))),a.disabled=(F(i()),Be(()=>i().main.disabled||!1)),xt(d," ".concat((F(i()),(I=Be(()=>i().main.text))!==null&&I!==void 0?I:"")))},[()=>AI((F(o0),F(n()),F(i()),Be(()=>o0("jse-context-menu-button",n(),i().main.className))))],tA),QA("click",a,C=>{o()(),i().main.onClick(C)}),he(r,a)}}}),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-contextmenu.svelte-12z7bz1 { + box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + background: var(--jse-context-menu-background, #656565); + color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); +} +.jse-contextmenu.svelte-12z7bz1 .jse-row:where(.svelte-12z7bz1) { + display: flex; + flex-direction: row; + align-items: flex-start; + justify-content: stretch; +} +.jse-contextmenu.svelte-12z7bz1 .jse-row:where(.svelte-12z7bz1) div.jse-label:where(.svelte-12z7bz1) { + flex: 1; + white-space: nowrap; + padding: var(--jse-padding, 10px); + color: var(--jse-context-menu-color-disabled, #9d9d9d); + line-height: normal; +} +.jse-contextmenu.svelte-12z7bz1 .jse-row:where(.svelte-12z7bz1) div.jse-tip:where(.svelte-12z7bz1) { + flex: 1; + background: var(--jse-context-menu-tip-background, rgba(255, 255, 255, 0.2)); + color: var(--context-menu-tip-color, inherit); + margin: calc(0.5 * var(--jse-padding, 10px)); + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); + font-size: 80%; + line-height: 1.3em; + display: flex; + flex-direction: row; + align-items: flex-start; + gap: var(--jse-padding, 10px); + border-radius: 3px; +} +.jse-contextmenu.svelte-12z7bz1 .jse-row:where(.svelte-12z7bz1) div.jse-tip:where(.svelte-12z7bz1) div.jse-tip-icon:where(.svelte-12z7bz1) { + padding-top: calc(0.5 * var(--jse-padding, 10px)); +} +.jse-contextmenu.svelte-12z7bz1 .jse-column:where(.svelte-12z7bz1) { + flex: 1; + display: flex; + flex-direction: column; + align-items: stretch; +} +.jse-contextmenu.svelte-12z7bz1 .jse-column:where(.svelte-12z7bz1):not(:last-child) { + border-right: 1px solid var(--jse-context-menu-separator-color, #7a7a7a); +} +.jse-contextmenu.svelte-12z7bz1 .jse-separator:where(.svelte-12z7bz1) { + width: 100%; + height: 1px; + background: var(--jse-context-menu-separator-color, #7a7a7a); +}`);var YXe=_e('
      '),HXe=_e('
      '),zXe=_e('
      '),PXe=_e('
      '),jXe=_e('
      '),VXe=_e('
      '),qXe=_e('
      '),WXe=_e('');function nCe(t,A){St(A,!1);var e=N(A,"items",9),i=N(A,"onRequestClose",9),n=N(A,"tip",9),o=Ce(void 0,!0);ua(()=>{var C=Array.from(g(o).querySelectorAll("button")).find(I=>!I.disabled);C&&C.focus()});var r={ArrowUp:"Up",ArrowDown:"Down",ArrowLeft:"Left",ArrowRight:"Right"};function s(C){return console.error("Unknown type of context menu item",C),"???"}li(!0);var a=WXe(),c=ge(a);fr(c,1,e,Jr,(C,I)=>{var u=ar(),h=Ut(u),B=b=>{UJ(b,{get item(){return g(I)},get onRequestClose(){return i()}})},f=(b,k)=>{var S=_=>{TJ(_,{get item(){return g(I)},get onRequestClose(){return i()}})},w=(_,K)=>{var J=H=>{var V=jXe();fr(V,5,()=>(g(I),Be(()=>g(I).items)),Jr,(Z,ye)=>{var P=ar(),se=Ut(P),X=oe=>{UJ(oe,{get item(){return g(ye)},get onRequestClose(){return i()}})},ue=(oe,le)=>{var me=$e=>{TJ($e,{get item(){return g(ye)},get onRequestClose(){return i()}})},Te=($e,Je)=>{var Qe=PA=>{var JA=zXe();fr(JA,5,()=>(g(ye),Be(()=>g(ye).items)),Jr,(Ye,Ie)=>{var We=ar(),we=Ut(We),Ze=LA=>{UJ(LA,{className:"left",get item(){return g(Ie)},get onRequestClose(){return i()}})},Ge=(LA,Fe)=>{var pe=Qt=>{TJ(Qt,{className:"left",get item(){return g(Ie)},get onRequestClose(){return i()}})},Wt=(Qt,BA)=>{var _t=YA=>{he(YA,YXe())},VA=(YA,Jt)=>{var KA=G=>{var z=HXe(),Ae=ge(z);xA(()=>xt(Ae,(g(Ie),Be(()=>g(Ie).text)))),he(G,z)},di=G=>{var z=Ss();xA(Ae=>xt(z,Ae),[()=>(g(Ie),Be(()=>s(g(Ie))))],tA),he(G,z)};ze(YA,G=>{F(bde),g(Ie),Be(()=>bde(g(Ie)))?G(KA):G(di,!1)},Jt)};ze(Qt,YA=>{F(JC),g(Ie),Be(()=>JC(g(Ie)))?YA(_t):YA(VA,!1)},BA)};ze(LA,Qt=>{F(_f),g(Ie),Be(()=>_f(g(Ie)))?Qt(pe):Qt(Wt,!1)},Fe)};ze(we,LA=>{F(J2),g(Ie),Be(()=>J2(g(Ie)))?LA(Ze):LA(Ge,!1)}),he(Ye,We)}),he(PA,JA)},He=(PA,JA)=>{var Ye=We=>{he(We,PXe())},Ie=We=>{var we=Ss();xA(Ze=>xt(we,Ze),[()=>(g(ye),Be(()=>s(g(ye))))],tA),he(We,we)};ze(PA,We=>{F(JC),g(ye),Be(()=>JC(g(ye)))?We(Ye):We(Ie,!1)},JA)};ze($e,PA=>{F(Sde),g(ye),Be(()=>Sde(g(ye)))?PA(Qe):PA(He,!1)},Je)};ze(oe,$e=>{F(_f),g(ye),Be(()=>_f(g(ye)))?$e(me):$e(Te,!1)},le)};ze(se,oe=>{F(J2),g(ye),Be(()=>J2(g(ye)))?oe(X):oe(ue,!1)}),he(Z,P)}),he(H,V)},O=(H,V)=>{var Z=P=>{he(P,VXe())},ye=P=>{var se=Ss();xA(X=>xt(se,X),[()=>(g(I),Be(()=>s(g(I))))],tA),he(P,se)};ze(H,P=>{F(JC),g(I),Be(()=>JC(g(I)))?P(Z):P(ye,!1)},V)};ze(_,H=>{F(Mde),g(I),Be(()=>Mde(g(I)))?H(J):H(O,!1)},K)};ze(b,_=>{F(_f),g(I),Be(()=>_f(g(I)))?_(S):_(w,!1)},k)};ze(h,b=>{F(J2),g(I),Be(()=>J2(g(I)))?b(B):b(f,!1)}),he(C,u)});var l=De(c,2),d=C=>{var I=qXe(),u=ge(I),h=ge(u);nn(ge(h),{get data(){return ooe}});var B=ge(De(h,2));xA(()=>xt(B,n())),he(C,I)};ze(l,C=>{n()&&C(d)}),Ho(a,C=>x(o,C),()=>g(o)),QA("keydown",a,function(C){var I=X2(C),u=r[I];if(u&&C.target){C.preventDefault();var h=uqe({allElements:Array.from(g(o).querySelectorAll("button:not([disabled])")),currentElement:C.target,direction:u,hasPrio:B=>B.getAttribute("data-type")!=="jse-open-dropdown"});h&&h.focus()}}),he(t,a),kt()}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-value.jse-string.svelte-6ttr41 { + color: var(--jse-value-color-string, #008000); +} +.jse-value.jse-object.svelte-6ttr41, .jse-value.jse-array.svelte-6ttr41 { + min-width: 16px; + color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); +} +.jse-value.jse-number.svelte-6ttr41 { + color: var(--jse-value-color-number, #ee422e); +} +.jse-value.jse-boolean.svelte-6ttr41 { + color: var(--jse-value-color-boolean, #ff8c00); +} +.jse-value.jse-null.svelte-6ttr41 { + color: var(--jse-value-color-null, #004ed0); +} +.jse-value.jse-invalid.svelte-6ttr41 { + color: var(--jse-text-color, #4d4d4d); +} +.jse-value.jse-url.svelte-6ttr41 { + color: var(--jse-value-color-url, #008000); + text-decoration: underline; +} + +.jse-enum-value.svelte-6ttr41 { + background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); + border: none; + padding: 0; + font-family: inherit; + font-size: inherit; + cursor: pointer; + outline: none; +} +.jse-enum-value.jse-selected.svelte-6ttr41 { + background: var(--jse-selection-background-color, #d3d3d3); + color: inherit; +} +.jse-enum-value.jse-value.svelte-6ttr41:focus { + color: var(--jse-text-color, #4d4d4d); +}`);var eJA=_e(""),AJA=_e("");var eM,AM;function tM(t,A){return eM||(AM=new WeakMap,eM=new ResizeObserver(e=>{for(var i of e){var n=AM.get(i.target);n&&n(i.target)}})),AM.set(t,A),eM.observe(t),{destroy:()=>{AM.delete(t),eM.unobserve(t)}}}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-tree-mode.svelte-vrx1dr { + flex: 1; + display: flex; + flex-direction: column; + position: relative; + background: var(--jse-background-color, #fff); + min-width: 0; + min-height: 0; + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + color: var(--jse-text-color, #4d4d4d); + line-height: var(--jse-line-height, calc(1em + 4px)); +} +.jse-tree-mode.svelte-vrx1dr .jse-hidden-input-label:where(.svelte-vrx1dr) .jse-hidden-input:where(.svelte-vrx1dr) { + position: fixed; + top: -10px; + left: -10px; + width: 1px; + height: 1px; + padding: 0; + border: 0; + outline: none; +} +.jse-tree-mode.no-main-menu.svelte-vrx1dr { + border-top: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-tree-mode.svelte-vrx1dr .jse-search-box-container:where(.svelte-vrx1dr) { + position: relative; + height: 0; + top: var(--jse-padding, 10px); + margin-right: calc(var(--jse-padding, 10px) + 20px); + margin-left: var(--jse-padding, 10px); + text-align: right; + z-index: 3; +} +.jse-tree-mode.svelte-vrx1dr .jse-contents:where(.svelte-vrx1dr) { + flex: 1; + overflow: auto; + position: relative; + padding: 2px; + display: flex; + flex-direction: column; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-tree-mode.svelte-vrx1dr .jse-contents:where(.svelte-vrx1dr):last-child { + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-tree-mode.svelte-vrx1dr .jse-contents:where(.svelte-vrx1dr) .jse-loading-space:where(.svelte-vrx1dr) { + flex: 1; +} +.jse-tree-mode.svelte-vrx1dr .jse-contents:where(.svelte-vrx1dr) .jse-loading:where(.svelte-vrx1dr) { + flex: 2; + text-align: center; + color: var(--jse-panel-color-readonly, #b2b2b2); + box-sizing: border-box; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); +} +.jse-tree-mode.svelte-vrx1dr .jse-contents:where(.svelte-vrx1dr) .jse-search-box-background:where(.svelte-vrx1dr) { + border: 50px solid var(--jse-modal-background, #f5f5f5); + margin: -2px; + margin-bottom: 2px; + display: inline-block; +}`);var ZXe=_e(" ",1),XXe=_e('
      '),$Xe=_e('
      ',1),e$e=_e(' ',1),A$e=_e('
      loading...
      '),t$e=_e('
      ',1);function fY(t,A){St(A,!1);var e=Ce(void 0,!0),i=Es("jsoneditor:TreeMode"),n=typeof window>"u";i("isSSR:",n);var o=IC(),r=IC(),{openAbsolutePopup:s,closeAbsolutePopup:a}=nI("absolute-popup"),c=Ce(void 0,!0),l=Ce(void 0,!0),d=Ce(void 0,!0),C=!1,I=Y1e(),u=N(A,"readOnly",9),h=N(A,"externalContent",9),B=N(A,"externalSelection",9),f=N(A,"history",9),b=N(A,"truncateTextSize",9),k=N(A,"mainMenuBar",9),S=N(A,"navigationBar",9),w=N(A,"escapeControlCharacters",9),_=N(A,"escapeUnicodeCharacters",9),K=N(A,"parser",9),J=N(A,"parseMemoizeOne",9),O=N(A,"validator",9),H=N(A,"validationParser",9),V=N(A,"pathParser",9),Z=N(A,"indentation",9),ye=N(A,"onError",9),P=N(A,"onChange",9),se=N(A,"onChangeMode",9),X=N(A,"onSelect",9),ue=N(A,"onUndo",9),oe=N(A,"onRedo",9),le=N(A,"onRenderValue",9),me=N(A,"onRenderMenu",9),Te=N(A,"onRenderContextMenu",9),$e=N(A,"onClassName",9),Je=N(A,"onFocus",9),Qe=N(A,"onBlur",9),He=N(A,"onSortModal",9),PA=N(A,"onTransformModal",9),JA=N(A,"onJSONEditorModal",9),Ye=!1,Ie=Ce(!1,!0),We=Ce(void 0,!0);qY({onMount:ua,onDestroy:gg,getWindow:()=>i6(g(d)),hasFocus:()=>Ye&&document.hasFocus()||RY(g(d)),onFocus:()=>{C=!0,Je()&&Je()()},onBlur:()=>{C=!1,Qe()&&Qe()()}});var we=Ce(void 0,!0),Ze=Ce(void 0,!0),Ge=void 0,LA=!1,Fe=Ce(iY({json:g(we)}),!0),pe=Ce(Yp(B())?B():void 0,!0);function Wt(j){x(pe,j)}ua(()=>{if(g(pe)){var j=It(g(pe));x(Fe,Zg(g(we),g(Fe),j,rM)),setTimeout(()=>EA(j))}});var Qt,BA=Ce(void 0,!0),_t=Ce(void 0,!0),VA=Ce(void 0,!0),YA=Ce(void 0,!0),Jt=Ce(!1,!0),KA=Ce(!1,!0);function di(j){x(YA,(Qt=j)?k1e(g(we),Qt.items):void 0)}function G(j,Ee){return z.apply(this,arguments)}function z(){return(z=Vt(function*(j,Ee){x(Fe,Zg(g(we),g(Fe),j,rM));var qe=gA(Ee);yield Ft(j,{element:qe})})).apply(this,arguments)}function Ae(){x(Jt,!1),x(KA,!1),ri()}function de(j){i("select validation error",j),x(pe,zi(j.path)),Ft(j.path)}function Ne(j){var Ee=arguments.length>1&&arguments[1]!==void 0?arguments[1]:nY;i("expand"),x(Fe,Zg(g(we),g(Fe),j,Ee))}function pA(j,Ee){x(Fe,Rde(g(we),g(Fe),j,Ee)),g(pe)&&function(qe,kA){return Nd(It(qe),kA)&&(It(qe).length>kA.length||cs(qe))}(g(pe),j)&&x(pe,void 0)}var vA=Ce(!1,!0),Ke=Ce([],!0),Re=Ce(void 0,!0),wt=OE(H1e);function st(j,Ee,qe,kA){Yf(()=>{var MA;try{MA=wt(j,Ee,qe,kA)}catch(wA){MA=[{path:[],message:"Failed to validate: "+wA.message,severity:e0.warning}]}wi(MA,g(Ke))||(i("validationErrors changed:",MA),x(Ke,MA),x(Re,function(wA,yt){var at;return yt.forEach(Ni=>{at=o2e(wA,at,Ni.path,(Gn,$i)=>SA(SA({},$i),{},{validationError:Ni}))}),yt.forEach(Ni=>{for(var Gn=Ni.path;Gn.length>0;)Gn=Hi(Gn),at=o2e(wA,at,Gn,($i,fo)=>fo.validationError?fo:SA(SA({},fo),{},{validationError:{isChildError:!0,path:Gn,message:"Contains invalid data",severity:e0.warning}}))}),at}(j,g(Ke))))},MA=>i("validationErrors updated in ".concat(MA," ms")))}function nA(){return i("validate"),Ge?{parseError:Ge,isRepairable:!1}:(st(g(we),O(),K(),H()),An(g(Ke))?void 0:{validationErrors:g(Ke)})}function Bt(){return g(we)}function Wi(){return g(Fe)}function Qn(){return g(pe)}function dn(j){i("applyExternalContent",{updatedContent:j}),Up(j)?function(Ee){if(Ee!==void 0){var qe=!wi(g(we),Ee);if(i("update external json",{isChanged:qe,currentlyText:g(we)===void 0}),!!qe){var kA={documentState:g(Fe),selection:g(pe),json:g(we),text:g(Ze),textIsRepaired:g(vA)};x(we,Ee),x(Fe,Dl(Ee,g(Fe))),HA(g(we)),x(Ze,void 0),x(vA,!1),Ge=void 0,Cn(g(we)),Gi(kA)}}}(j.json):Kp(j)&&function(Ee){if(!(Ee===void 0||Up(h()))){var qe=Ee!==g(Ze);if(i("update external text",{isChanged:qe}),!!qe){var kA={documentState:g(Fe),selection:g(pe),json:g(we),text:g(Ze),textIsRepaired:g(vA)};try{x(we,J()(Ee)),x(Fe,Dl(g(we),g(Fe))),HA(g(we)),x(Ze,Ee),x(vA,!1),Ge=void 0}catch(MA){try{x(we,J()(jl(Ee))),x(Fe,Dl(g(we),g(Fe))),HA(g(we)),x(Ze,Ee),x(vA,!0),Ge=void 0,Cn(g(we))}catch{x(we,void 0),x(Fe,void 0),x(Ze,h().text),x(vA,!1),Ge=g(Ze)!==void 0&&g(Ze)!==""?Wf(g(Ze),MA.message||String(MA)):void 0}}Cn(g(we)),Gi(kA)}}}(j.text)}function HA(j){LA||(LA=!0,x(Fe,lh(j,g(Fe),[])))}function Cn(j){g(pe)&&(Us(j,nh(g(pe)))&&Us(j,It(g(pe)))||(i("clearing selection: path does not exist anymore",g(pe)),x(pe,Rf(j,g(Fe)))))}function Gi(j){if(j.json!==void 0||j.text!==void 0){var Ee=g(we)!==void 0&&j.json!==void 0;f().add({type:"tree",undo:{patch:Ee?[{op:"replace",path:"",value:j.json}]:void 0,json:j.json,text:j.text,documentState:j.documentState,textIsRepaired:j.textIsRepaired,selection:xd(j.selection),sortedColumn:void 0},redo:{patch:Ee?[{op:"replace",path:"",value:g(we)}]:void 0,json:g(we),text:g(Ze),documentState:g(Fe),textIsRepaired:g(vA),selection:xd(g(pe)),sortedColumn:void 0}})}}function oi(j,Ee){var qe;if(i("patch",j,Ee),g(we)===void 0)throw new Error("Cannot apply patch: no JSON");var kA=g(we),MA={json:void 0,text:g(Ze),documentState:g(Fe),selection:xd(g(pe)),textIsRepaired:g(vA),sortedColumn:void 0},wA=S1e(g(we),j),yt=B1e(g(we),g(Fe),j),at=(qe=$f(g(we),j))!==null&&qe!==void 0?qe:g(pe),Ni=typeof Ee=="function"?Ee(yt.json,yt.documentState,at):void 0;return x(we,Ni?.json!==void 0?Ni.json:yt.json),x(Fe,Ni?.state!==void 0?Ni.state:yt.documentState),x(pe,Ni?.selection!==void 0?Ni.selection:at),x(Ze,void 0),x(vA,!1),x(_t,void 0),x(VA,void 0),Ge=void 0,Cn(g(we)),f().add({type:"tree",undo:SA({patch:wA},MA),redo:{patch:j,json:void 0,text:g(Ze),documentState:g(Fe),selection:xd(g(pe)),sortedColumn:void 0,textIsRepaired:g(vA)}}),{json:g(we),previousJson:kA,undo:wA,redo:j}}function Yt(){!u()&&g(pe)&&x(pe,zY(It(g(pe))))}function xi(){if(!u()&&g(pe)){var j=It(g(pe)),Ee=WA(g(we),j);sr(Ee)?function(qe,kA){i("openJSONEditorModal",{path:qe,value:kA}),Ye=!0,JA()({content:{json:kA},path:qe,onPatch:g(D).onPatch,onClose:()=>{Ye=!1,setTimeout(ri)}})}(j,Ee):x(pe,fM(j))}}function Pi(){if(!u()&&fn(g(pe))){var j=It(g(pe)),Ee=pt(j),qe=WA(g(we),j),kA=!_d(g(we),g(Fe),j),MA=kA?String(qe):rQ(String(qe),K());i("handleToggleEnforceString",{enforceString:kA,value:qe,updatedValue:MA}),bA([{op:"replace",path:Ee,value:MA}],(wA,yt)=>({state:GM(g(we),yt,j,{type:"value",enforceString:kA})}))}}function Xt(){return g(vA)&&g(we)!==void 0&&fe(g(we)),g(we)!==void 0?{json:g(we)}:{text:g(Ze)||""}}function L(){return ct.apply(this,arguments)}function ct(){return ct=Vt(function*(){var j=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];yield X1e({json:g(we),selection:g(pe),indentation:j?Z():void 0,readOnly:u(),parser:K(),onPatch:bA})}),ct.apply(this,arguments)}function Di(){return mn.apply(this,arguments)}function mn(){return mn=Vt(function*(){var j=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];g(we)!==void 0&&(yield $1e({json:g(we),selection:g(pe),indentation:j?Z():void 0,parser:K()}))}),mn.apply(this,arguments)}function pn(j){var Ee;j.preventDefault(),Ao((Ee=j.clipboardData)===null||Ee===void 0?void 0:Ee.getData("text/plain"))}function so(){return $o.apply(this,arguments)}function $o(){return($o=Vt(function*(){try{Ao(yield navigator.clipboard.readText())}catch(j){console.error(j),x(Ie,!0)}})).apply(this,arguments)}function Ao(j){j!==void 0&&eCe({clipboardText:j,json:g(we),selection:g(pe),readOnly:u(),parser:K(),onPatch:bA,onChangeText:ke,onPasteMultilineText:kn,openRepairModal:Fn})}function Fn(j,Ee){x(We,{text:j,onParse:qe=>t6(qe,kA=>A6(kA,K())),onRepair:i1e,onApply:Ee,onClose:ri})}function Qr(){ACe({json:g(we),text:g(Ze),selection:g(pe),keepSelection:!1,readOnly:u(),onChange:P(),onPatch:bA})}function mr(){!u()&&g(we)!==void 0&&g(pe)&&Of&&!An(It(g(pe)))&&(i("duplicate",{selection:g(pe)}),bA(D1e(g(we),tI(g(we),g(pe)))))}function zo(){u()||!g(pe)||!Io(g(pe))&&!fn(g(pe))||An(It(g(pe)))||(i("extract",{selection:g(pe)}),bA(v1e(g(we),g(pe)),(j,Ee)=>{if(sr(j))return{state:xJ(j,Ee,[])}}))}function On(j){MM({insertType:j,selectInside:!0,initialValue:void 0,json:g(we),selection:g(pe),readOnly:u(),parser:K(),onPatch:bA,onReplaceJson:fe})}function ho(j){Bs(g(pe))&&x(pe,zi(g(pe).path)),g(pe)||x(pe,Rf(g(we),g(Fe))),On(j)}function sA(j){if(!u()&&g(pe))if(qb(g(pe)))try{var Ee=nh(g(pe)),qe=WA(g(we),Ee),kA=function(wA,yt,at){if(yt==="array"){if(Array.isArray(wA))return wA;if(vn(wA))return fde(wA);if(typeof wA=="string")try{var Ni=at.parse(wA);if(Array.isArray(Ni))return Ni;if(vn(Ni))return fde(Ni)}catch{return[wA]}return[wA]}if(yt==="object"){if(Array.isArray(wA))return Ede(wA);if(vn(wA))return wA;if(typeof wA=="string")try{var Gn=at.parse(wA);if(vn(Gn))return Gn;if(Array.isArray(Gn))return Ede(Gn)}catch{return{value:wA}}return{value:wA}}if(yt==="value")return sr(wA)?at.stringify(wA):wA;throw new Error("Cannot convert ".concat(kY(wA,at)," to ").concat(yt))}(qe,j,K());if(kA===qe)return;var MA=[{op:"replace",path:pt(Ee),value:kA}];i("handleConvert",{selection:g(pe),path:Ee,type:j,operations:MA}),bA(MA,(wA,yt)=>({state:g(pe)?lh(wA,yt,It(g(pe))):g(Fe)}))}catch(wA){ye()(wA)}else ye()(new Error("Cannot convert current selection to ".concat(j)))}function _i(){if(g(pe)){var j=Gde(g(we),g(Fe),g(pe),!1),Ee=Hi(It(g(pe)));j&&!An(It(j))&&wi(Ee,Hi(It(j)))?x(pe,W2(It(j))):x(pe,e1(Ee)),i("insert before",{selection:g(pe),selectionBefore:j,parentPath:Ee}),bo(),Tt()}}function Zi(){if(g(pe)){var j=ZC(g(we),g(pe));i("insert after",j),x(pe,W2(j)),bo(),Tt()}}function Jn(j){return Bo.apply(this,arguments)}function Bo(){return(Bo=Vt(function*(j){yield tCe({char:j,selectInside:!0,json:g(we),selection:g(pe),readOnly:u(),parser:K(),onPatch:bA,onReplaceJson:fe,onSelect:Wt})})).apply(this,arguments)}function pr(){if(!u()&&f().canUndo){var j=f().undo();if(BM(j)){var Ee={json:g(we),text:g(Ze)};x(we,j.undo.patch?Mc(g(we),j.undo.patch):j.undo.json),x(Fe,j.undo.documentState),x(pe,j.undo.selection),x(Ze,j.undo.text),x(vA,j.undo.textIsRepaired),Ge=void 0,i("undo",{item:j,json:g(we),documentState:g(Fe),selection:g(pe)}),zA(Ee,j.undo.patch&&j.redo.patch?{json:g(we),previousJson:Ee.json,redo:j.undo.patch,undo:j.redo.patch}:void 0),ri(),g(pe)&&Ft(It(g(pe)),{scrollToWhenVisible:!1})}else ue()(j)}}function Mi(){if(!u()&&f().canRedo){var j=f().redo();if(BM(j)){var Ee={json:g(we),text:g(Ze)};x(we,j.redo.patch?Mc(g(we),j.redo.patch):j.redo.json),x(Fe,j.redo.documentState),x(pe,j.redo.selection),x(Ze,j.redo.text),x(vA,j.redo.textIsRepaired),Ge=void 0,i("redo",{item:j,json:g(we),documentState:g(Fe),selection:g(pe)}),zA(Ee,j.undo.patch&&j.redo.patch?{json:g(we),previousJson:Ee.json,redo:j.redo.patch,undo:j.undo.patch}:void 0),ri(),g(pe)&&Ft(It(g(pe)),{scrollToWhenVisible:!1})}else oe()(j)}}function Mo(j){var Ee;u()||g(we)===void 0||(Ye=!0,He()({id:o,json:g(we),rootPath:j,onSort:(Ee=Vt(function*(qe){var{operations:kA}=qe;i("onSort",j,kA),bA(kA,(MA,wA)=>({state:xJ(MA,wA,j),selection:zi(j)}))}),function(qe){return Ee.apply(this,arguments)}),onClose:()=>{Ye=!1,setTimeout(ri)}}))}function wr(){g(pe)&&Mo(Ude(g(we),g(pe)))}function yr(){Mo([])}function Nr(j){if(g(we)!==void 0){var{id:Ee,onTransform:qe,onClose:kA}=j,MA=j.rootPath||[];Ye=!0,PA()({id:Ee||r,json:g(we),rootPath:MA,onTransform:wA=>{qe?qe({operations:wA,json:g(we),transformedJson:Mc(g(we),wA)}):(i("onTransform",MA,wA),bA(wA,(yt,at)=>({state:xJ(yt,at,MA),selection:zi(MA)})))},onClose:()=>{Ye=!1,setTimeout(ri),kA&&kA()}})}}function Mn(){g(pe)&&Nr({rootPath:Ude(g(we),g(pe))})}function wn(){Nr({rootPath:[]})}function Ft(j){return Yn.apply(this,arguments)}function Yn(){return Yn=Vt(function*(j){var{scrollToWhenVisible:Ee=!0,element:qe}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};x(Fe,Zg(g(we),g(Fe),j,rM));var kA=qe??Me(j);if(i("scrollTo",{path:j,elem:kA,refContents:g(c)}),!kA||!g(c))return Promise.resolve();var MA=g(c).getBoundingClientRect(),wA=kA.getBoundingClientRect();if(!Ee&&wA.bottom>MA.top&&wA.top{I(kA,{container:g(c),offset:yt,duration:300,callback:()=>at()})})}),Yn.apply(this,arguments)}function Me(j){var Ee,qe;return bo(),(Ee=(qe=g(c))===null||qe===void 0?void 0:qe.querySelector('div[data-path="'.concat(oM(j),'"]')))!==null&&Ee!==void 0?Ee:void 0}function gA(j){var Ee,qe;return bo(),(Ee=(qe=g(c))===null||qe===void 0?void 0:qe.querySelector('span[data-search-result-index="'.concat(j,'"]')))!==null&&Ee!==void 0?Ee:void 0}function EA(j){var Ee=Me(j);if(Ee&&g(c)){var qe=g(c).getBoundingClientRect(),kA=Ee.getBoundingClientRect(),MA=sr(WA(g(we),j))?20:kA.height;kA.topqe.bottom-20&&I(Ee,{container:g(c),offset:-(qe.height-MA-20),duration:0})}}function zA(j,Ee){if(j.json!==void 0||j?.text!==void 0){if(g(Ze)!==void 0){var qe,kA={text:g(Ze),json:void 0};(qe=P())===null||qe===void 0||qe(kA,j,{contentErrors:nA(),patchResult:Ee})}else if(g(we)!==void 0){var MA,wA={text:void 0,json:g(we)};(MA=P())===null||MA===void 0||MA(wA,j,{contentErrors:nA(),patchResult:Ee})}}}function bA(j,Ee){i("handlePatch",j,Ee);var qe={json:g(we),text:g(Ze)},kA=oi(j,Ee);return zA(qe,kA),kA}function fe(j,Ee){var qe={json:g(we),text:g(Ze)},kA={documentState:g(Fe),selection:g(pe),json:g(we),text:g(Ze),textIsRepaired:g(vA)},MA=Zg(g(we),Dl(j,g(Fe)),[],_p),wA=typeof Ee=="function"?Ee(j,MA,g(pe)):void 0;x(we,wA?.json!==void 0?wA.json:j),x(Fe,wA?.state!==void 0?wA.state:MA),x(pe,wA?.selection!==void 0?wA.selection:g(pe)),x(Ze,void 0),x(vA,!1),Ge=void 0,Cn(g(we)),Gi(kA),zA(qe,void 0)}function ke(j,Ee){i("handleChangeText");var qe={json:g(we),text:g(Ze)},kA={documentState:g(Fe),selection:g(pe),json:g(we),text:g(Ze),textIsRepaired:g(vA)};try{x(we,J()(j)),x(Fe,Zg(g(we),Dl(g(we),g(Fe)),[],_p)),x(Ze,void 0),x(vA,!1),Ge=void 0}catch(wA){try{x(we,J()(jl(j))),x(Fe,Zg(g(we),Dl(g(we),g(Fe)),[],_p)),x(Ze,j),x(vA,!0),Ge=void 0}catch{x(we,void 0),x(Fe,iY({json:g(we),expand:_p})),x(Ze,j),x(vA,!1),Ge=g(Ze)!==""?Wf(g(Ze),wA.message||String(wA)):void 0}}if(typeof Ee=="function"){var MA=Ee(g(we),g(Fe),g(pe));x(we,MA?.json!==void 0?MA.json:g(we)),x(Fe,MA?.state!==void 0?MA.state:g(Fe)),x(pe,MA?.selection!==void 0?MA.selection:g(pe))}Cn(g(we)),Gi(kA),zA(qe,void 0)}function Xe(j,Ee){var qe=arguments.length>2&&arguments[2]!==void 0&&arguments[2];i("handleExpand",{path:j,expanded:Ee,recursive:qe}),Ee?Ne(j,qe?HY:nY):pA(j,qe),ri()}function qA(){Xe([],!0,!0)}function Gt(){Xe([],!1,!0)}function $t(j){i("openFind",{findAndReplace:j}),x(Jt,!1),x(KA,!1),bo(),x(Jt,!0),x(KA,j)}function Sn(j,Ee){i("handleExpandSection",j,Ee),x(Fe,function(qe,kA,MA,wA){return Xf(qe,kA,MA,(yt,at)=>{if(!hs(at))return at;var Ni=I1e(at.visibleSections.concat(wA));return SA(SA({},at),{},{visibleSections:Ni})})}(g(we),g(Fe),j,Ee))}function So(j){i("pasted json as text",j),x(_t,j)}function kn(j){i("pasted multiline text",{pastedText:j}),x(VA,j)}function on(j){var Ee,{anchor:qe,left:kA,top:MA,width:wA,height:yt,offsetTop:at,offsetLeft:Ni,showTip:Gn}=j,$i=function(no){var{json:ko,documentState:yn,selection:Ht,readOnly:sn,onEditKey:zt,onEditValue:Et,onToggleEnforceString:Ei,onCut:Po,onCopy:Qs,onPaste:Qo,onRemove:Ar,onDuplicate:_s,onExtract:jd,onInsertBefore:Vc,onInsert:hg,onConvert:p0,onInsertAfter:Bg,onSort:Rs,onTransform:Ns}=no,qc=ko!==void 0,Vd=!!Ht,Wc=!!Ht&&An(It(Ht)),gr=Ht?WA(ko,It(Ht)):void 0,yo=Array.isArray(gr)?"Edit array":vn(gr)?"Edit object":"Edit value",Dr=qc&&(Io(Ht)||Bs(Ht)||fn(Ht)),w0=Ht&&!Wc?WA(ko,Hi(It(Ht))):void 0,kh=!sn&&qc&&EM(Ht)&&!Wc&&!Array.isArray(w0),xh=!sn&&qc&&Ht!==void 0&&EM(Ht),FQ=xh&&!sr(gr),_h=!sn&&Dr,GQ=Dr,Qk=!sn&&Vd,mk=!sn&&qc&&Dr&&!Wc,pk=!sn&&qc&&Ht!==void 0&&(Io(Ht)||fn(Ht))&&!Wc,y0=Dr,pI=y0?"Convert to:":"Insert:",Yr=!sn&&(cs(Ht)&&Array.isArray(gr)||Jc(Ht)&&Array.isArray(w0)),dc=!sn&&(y0?qb(Ht)&&!vn(gr):Vd),KQ=!sn&&(y0?qb(Ht)&&!Array.isArray(gr):Vd),UQ=!sn&&(y0?qb(Ht)&&sr(gr):Vd),wI=Ht!==void 0&&_d(ko,yn,It(Ht));function Vs(TQ){Dr?TQ!=="structure"&&p0(TQ):hg(TQ)}return[{type:"row",items:[{type:"button",onClick:()=>zt(),icon:wu,text:"Edit key",title:"Edit the key (Double-click on the key)",disabled:!kh},{type:"dropdown-button",main:{type:"button",onClick:()=>Et(),icon:wu,text:yo,title:"Edit the value (Double-click on the value)",disabled:!xh},width:"11em",items:[{type:"button",icon:wu,text:yo,title:"Edit the value (Double-click on the value)",onClick:()=>Et(),disabled:!xh},{type:"button",icon:wI?wG:vG,text:"Enforce string",title:"Enforce keeping the value as string when it contains a numeric value",onClick:()=>Ei(),disabled:!FQ}]}]},{type:"separator"},{type:"row",items:[{type:"dropdown-button",main:{type:"button",onClick:()=>Po(!0),icon:pu,text:"Cut",title:"Cut selected contents, formatted with indentation (Ctrl+X)",disabled:!_h},width:"10em",items:[{type:"button",icon:pu,text:"Cut formatted",title:"Cut selected contents, formatted with indentation (Ctrl+X)",onClick:()=>Po(!0),disabled:!_h},{type:"button",icon:pu,text:"Cut compacted",title:"Cut selected contents, without indentation (Ctrl+Shift+X)",onClick:()=>Po(!1),disabled:!_h}]},{type:"dropdown-button",main:{type:"button",onClick:()=>Qs(!0),icon:M2,text:"Copy",title:"Copy selected contents, formatted with indentation (Ctrl+C)",disabled:!GQ},width:"12em",items:[{type:"button",icon:M2,text:"Copy formatted",title:"Copy selected contents, formatted with indentation (Ctrl+C)",onClick:()=>Qs(!0),disabled:!GQ},{type:"button",icon:M2,text:"Copy compacted",title:"Copy selected contents, without indentation (Ctrl+Shift+C)",onClick:()=>Qs(!1),disabled:!GQ}]},{type:"button",onClick:()=>Qo(),icon:pG,text:"Paste",title:"Paste clipboard contents (Ctrl+V)",disabled:!Qk}]},{type:"separator"},{type:"row",items:[{type:"column",items:[{type:"button",onClick:()=>_s(),icon:SG,text:"Duplicate",title:"Duplicate selected contents (Ctrl+D)",disabled:!mk},{type:"button",onClick:()=>jd(),icon:uoe,text:"Extract",title:"Extract selected contents",disabled:!pk},{type:"button",onClick:()=>Rs(),icon:n3,text:"Sort",title:"Sort array or object contents",disabled:sn||!Dr},{type:"button",onClick:()=>Ns(),icon:A3,text:"Transform",title:"Transform array or object contents (filter, sort, project)",disabled:sn||!Dr},{type:"button",onClick:()=>Ar(),icon:Iv,text:"Remove",title:"Remove selected contents (Delete)",disabled:sn||!Dr}]},{type:"column",items:[{type:"label",text:pI},{type:"button",onClick:()=>Vs("structure"),icon:y0?i3:yu,text:"Structure",title:pI+" structure like the first item in the array",disabled:!Yr},{type:"button",onClick:()=>Vs("object"),icon:y0?i3:yu,text:"Object",title:pI+" object",disabled:!dc},{type:"button",onClick:()=>Vs("array"),icon:y0?i3:yu,text:"Array",title:pI+" array",disabled:!KQ},{type:"button",onClick:()=>Vs("value"),icon:y0?i3:yu,text:"Value",title:pI+" value",disabled:!UQ}]}]},{type:"separator"},{type:"row",items:[{type:"button",onClick:()=>Vc(),icon:Coe,text:"Insert before",title:"Select area before current entry to insert or paste contents",disabled:sn||!Dr||Wc},{type:"button",onClick:()=>Bg(),icon:coe,text:"Insert after",title:"Select area after current entry to insert or paste contents",disabled:sn||!Dr||Wc}]}]}({json:g(we),documentState:g(Fe),selection:g(pe),readOnly:u(),onEditKey:Yt,onEditValue:xi,onToggleEnforceString:Pi,onCut:L,onCopy:Di,onPaste:so,onRemove:Qr,onDuplicate:mr,onExtract:zo,onInsertBefore:_i,onInsert:ho,onInsertAfter:Zi,onConvert:sA,onSort:wr,onTransform:Mn}),fo=(Ee=Te()($i))!==null&&Ee!==void 0?Ee:$i;if(fo!==!1){var ei={left:kA,top:MA,offsetTop:at,offsetLeft:Ni,width:wA,height:yt,anchor:qe,closeOnOuterClick:!0,onClose:()=>{Ye=!1,ri()}};Ye=!0;var er=s(nCe,{tip:Gn?"Tip: you can open this context menu via right-click or with Ctrl+Q":void 0,items:fo,onRequestClose:()=>a(er)},ei)}}function Tt(j){if(!us(g(pe)))if(j&&(j.stopPropagation(),j.preventDefault()),j&&j.type==="contextmenu"&&j.target!==g(l))on({left:j.clientX,top:j.clientY,width:z2,height:H2,showTip:!1});else{var Ee,qe=(Ee=g(c))===null||Ee===void 0?void 0:Ee.querySelector(".jse-context-menu-pointer.jse-selected");if(qe)on({anchor:qe,offsetTop:2,width:z2,height:H2,showTip:!1});else{var kA,MA=(kA=g(c))===null||kA===void 0?void 0:kA.getBoundingClientRect();MA&&on({top:MA.top+2,left:MA.left+2,width:z2,height:H2,showTip:!1})}}}function Xi(j){on({anchor:d1e(j.target,"BUTTON"),offsetTop:0,width:z2,height:H2,showTip:!0})}function to(){return vt.apply(this,arguments)}function vt(){return(vt=Vt(function*(){if(i("apply pasted json",g(_t)),g(_t)){var{onPasteAsJson:j}=g(_t);x(_t,void 0),j(),setTimeout(ri)}})).apply(this,arguments)}function Hn(){return ZA.apply(this,arguments)}function ZA(){return(ZA=Vt(function*(){i("apply pasted multiline text",g(VA)),g(VA)&&(Ao(JSON.stringify(g(VA))),setTimeout(ri))})).apply(this,arguments)}function Ri(){i("clear pasted json"),x(_t,void 0),ri()}function Ki(){i("clear pasted multiline text"),x(VA,void 0),ri()}function io(){se()(Rr.text)}function lr(j){x(pe,j),ri(),Ft(It(j))}function ri(){i("focus"),g(l)&&(g(l).focus(),g(l).select())}function fs(j){return function(Ee,qe,kA){var MA=Hi(kA),wA=[vi(kA)],yt=WA(Ee,MA),at=yt?kJ(yt,qe,wA):void 0;return at?zi(MA.concat(at)):W2(kA)}(g(we),g(Fe),j)}function Eo(j){g(e)&&g(e).onDrag(j)}function Q(){g(e)&&g(e).onDragEnd()}var D=Ce(void 0,!0);Se(()=>g(pe),()=>{var j;j=g(pe),wi(j,B())||(i("onSelect",j),X()(j))}),Se(()=>(F(w()),F(_())),()=>{x(BA,xY({escapeControlCharacters:w(),escapeUnicodeCharacters:_()}))}),Se(()=>g(Jt),()=>{(function(j){g(c)&&j&&g(c).scrollTop===0&&(vl(c,g(c).style.overflowAnchor="none"),vl(c,g(c).scrollTop+=xp),setTimeout(()=>{g(c)&&vl(c,g(c).style.overflowAnchor="")}))})(g(Jt))}),Se(()=>F(h()),()=>{dn(h())}),Se(()=>F(B()),()=>{(function(j){wi(g(pe),j)||(i("applyExternalSelection",{selection:g(pe),externalSelection:j}),Yp(j)&&x(pe,j))})(B())}),Se(()=>(g(we),F(O()),F(K()),F(H())),()=>{st(g(we),O(),K(),H())}),Se(()=>(g(c),n2e),()=>{x(e,g(c)?n2e(g(c)):void 0)}),Se(()=>(F(u()),F(b()),F(K()),g(BA),F(le()),F($e())),()=>{x(D,{mode:Rr.tree,readOnly:u(),truncateTextSize:b(),parser:K(),normalization:g(BA),getJson:Bt,getDocumentState:Wi,getSelection:Qn,findElement:Me,findNextInside:fs,focus:ri,onPatch:bA,onInsert:On,onExpand:Xe,onSelect:Wt,onFind:$t,onExpandSection:Sn,onPasteJson:So,onRenderValue:le(),onContextMenu:on,onClassName:$e()||(()=>{}),onDrag:Eo,onDragEnd:Q})}),Se(()=>g(D),()=>{i("context changed",g(D))}),Nn(),li(!0);var R=t$e();QA("mousedown",V2,function(j){!sQ(j.target,Ee=>Ee===g(d))&&us(g(pe))&&(i("click outside the editor, exit edit mode"),x(pe,xd(g(pe))),C&&g(l)&&(g(l).focus(),g(l).blur()),i("blur (outside editor)"),g(l)&&g(l).blur())});var v,U=Ut(R),Y=ge(U),ie=j=>{(function(Ee,qe){St(qe,!1);var kA=Ce(void 0,!0),MA=Ce(void 0,!0),wA=Ce(void 0,!0),yt=N(qe,"json",9),at=N(qe,"selection",9),Ni=N(qe,"readOnly",9),Gn=N(qe,"showSearch",13,!1),$i=N(qe,"history",9),fo=N(qe,"onExpandAll",9),ei=N(qe,"onCollapseAll",9),er=N(qe,"onUndo",9),no=N(qe,"onRedo",9),ko=N(qe,"onSort",9),yn=N(qe,"onTransform",9),Ht=N(qe,"onContextMenu",9),sn=N(qe,"onCopy",9),zt=N(qe,"onRenderMenu",9);function Et(){Gn(!Gn())}var Ei=Ce(void 0,!0),Po=Ce(void 0,!0),Qs=Ce(void 0,!0),Qo=Ce(void 0,!0);Se(()=>F(yt()),()=>{x(kA,yt()!==void 0)}),Se(()=>(g(kA),F(at()),fn),()=>{x(MA,g(kA)&&(Io(at())||Bs(at())||fn(at())))}),Se(()=>(F(fo()),F(yt())),()=>{x(Ei,{type:"button",icon:cXe,title:"Expand all",className:"jse-expand-all",onClick:fo(),disabled:!sr(yt())})}),Se(()=>(F(ei()),F(yt())),()=>{x(Po,{type:"button",icon:lXe,title:"Collapse all",className:"jse-collapse-all",onClick:ei(),disabled:!sr(yt())})}),Se(()=>F(yt()),()=>{x(Qs,{type:"button",icon:o3,title:"Search (Ctrl+F)",className:"jse-search",onClick:Et,disabled:yt()===void 0})}),Se(()=>(F(Ni()),g(Ei),g(Po),F(ko()),F(yt()),F(yn()),g(Qs),F(Ht()),F(er()),F($i()),F(no()),F(sn()),g(MA)),()=>{x(Qo,Ni()?[g(Ei),g(Po),{type:"separator"},{type:"button",icon:M2,title:"Copy (Ctrl+C)",className:"jse-copy",onClick:sn(),disabled:!g(MA)},{type:"separator"},g(Qs),{type:"space"}]:[g(Ei),g(Po),{type:"separator"},{type:"button",icon:n3,title:"Sort",className:"jse-sort",onClick:ko(),disabled:Ni()||yt()===void 0},{type:"button",icon:A3,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:yn(),disabled:Ni()||yt()===void 0},g(Qs),{type:"button",icon:bG,title:FY,className:"jse-contextmenu",onClick:Ht()},{type:"separator"},{type:"button",icon:hv,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:er(),disabled:!$i().canUndo},{type:"button",icon:uv,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:no(),disabled:!$i().canRedo},{type:"space"}])}),Se(()=>(F(zt()),g(Qo)),()=>{x(wA,zt()(g(Qo))||g(Qo))}),Nn(),li(!0),YM(Ee,{get items(){return g(wA)}}),kt()})(j,{get json(){return g(we)},get selection(){return g(pe)},get readOnly(){return u()},get history(){return f()},onExpandAll:qA,onCollapseAll:Gt,onUndo:pr,onRedo:Mi,onSort:yr,onTransform:wn,onContextMenu:Xi,onCopy:Di,get onRenderMenu(){return me()},get showSearch(){return g(Jt)},set showSearch(Ee){x(Jt,Ee)},$$legacy:!0})};ze(Y,j=>{k()&&j(ie)});var ce=De(Y,2),Le=j=>{SXe(j,{get json(){return g(we)},get selection(){return g(pe)},onSelect:lr,get onError(){return ye()},get pathParser(){return V()}})};ze(ce,j=>{S()&&j(Le)});var CA=De(ce,2),hA=j=>{var Ee=e$e(),qe=Ut(Ee),kA=ge(qe);kA.readOnly=!0,Ho(kA,at=>x(l,at),()=>g(l));var MA=De(qe,2),wA=at=>{var Ni=ar(),Gn=Ut(Ni),$i=ei=>{(function(er,no){St(no,!0);var ko=hXe();ko.__click=[IXe,no];var yn=De(ge(ko),2),Ht=De(ge(yn),2),sn=zt=>{var Et=uXe(),Ei=De(Ut(Et),2);Rn(Ei,"title","Create an empty JSON object (press '{')"),Ei.__click=[dXe,no];var Po=De(Ei,2);Rn(Po,"title","Create an empty JSON array (press '[')"),Po.__click=[CXe,no],he(zt,Et)};ze(Ht,zt=>{no.readOnly||zt(sn)}),he(er,ko),kt()})(ei,{get readOnly(){return u()},onCreateObject:()=>{ri(),Jn("{")},onCreateArray:()=>{ri(),Jn("[")},onClick:()=>{ri()}})},fo=ei=>{var er=ZXe(),no=Ut(er),ko=tA(()=>u()?[]:[{icon:t3,text:"Repair manually",title:'Open the document in "code" mode and repair it manually',onClick:io}]);Sl(no,{type:"error",message:"The loaded JSON document is invalid and could not be repaired automatically.",get actions(){return g(ko)}}),iCe(De(no,2),{get text(){return g(Ze)},get json(){return g(we)},get indentation(){return Z()},get parser(){return K()}}),he(ei,er)};ze(Gn,ei=>{g(Ze)===""||g(Ze)===void 0?ei($i):ei(fo,!1)}),he(at,Ni)},yt=at=>{var Ni=$Xe(),Gn=Ut(Ni);q1e(ge(Gn),{get json(){return g(we)},get documentState(){return g(Fe)},get parser(){return K()},get showSearch(){return g(Jt)},get showReplace(){return g(KA)},get readOnly(){return u()},columns:void 0,onSearch:di,onFocus:G,onPatch:bA,onClose:Ae});var $i=De(Gn,2);Rn($i,"data-jsoneditor-scrollable-contents",!0);var fo=ge($i),ei=zt=>{he(zt,XXe())};ze(fo,zt=>{g(Jt)&&zt(ei)}),CY(De(fo,2),{get value(){return g(we)},pointer:"",get state(){return g(Fe)},get validationErrors(){return g(Re)},get searchResults(){return g(YA)},get selection(){return g(pe)},get context(){return g(D)},get onDragSelectionStart(){return xr}}),Ho($i,zt=>x(c,zt),()=>g(c));var er=De($i,2),no=zt=>{var Et=tA(()=>(g(_t),Be(()=>"You pasted a JSON ".concat(Array.isArray(g(_t).contents)?"array":"object"," as text")))),Ei=tA(()=>[{icon:b2,text:"Paste as JSON instead",title:"Replace the value with the pasted JSON",onMouseDown:to},{text:"Leave as is",title:"Keep the JSON embedded in the value",onClick:Ri}]);Sl(zt,{type:"info",get message(){return g(Et)},get actions(){return g(Ei)}})};ze(er,zt=>{g(_t)&&zt(no)});var ko=De(er,2),yn=zt=>{var Et=tA(()=>[{icon:b2,text:"Paste as string instead",title:"Paste the clipboard data as a single string value instead of an array",onClick:Hn},{text:"Leave as is",title:"Keep the pasted array",onClick:Ki}]);Sl(zt,{type:"info",message:"Multiline text was pasted as array",get actions(){return g(Et)}})};ze(ko,zt=>{g(VA)&&zt(yn)});var Ht=De(ko,2),sn=zt=>{var Et=tA(()=>u()?[]:[{icon:Bv,text:"Ok",title:"Accept the repaired document",onClick:Xt},{icon:t3,text:"Repair manually instead",title:"Leave the document unchanged and repair it manually instead",onClick:io}]);Sl(zt,{type:"success",message:"The loaded JSON document was invalid but is successfully repaired.",get actions(){return g(Et)},onClose:ri})};ze(Ht,zt=>{g(vA)&&zt(sn)}),WY(De(Ht,2),{get validationErrors(){return g(Ke)},selectError:de}),he(at,Ni)};ze(MA,at=>{g(we)===void 0?at(wA):at(yt,!1)}),QA("paste",kA,pn),he(j,Ee)},it=j=>{he(j,A$e())};ze(CA,j=>{n?j(it,!1):j(hA)}),Ho(U,j=>x(d,j),()=>g(d));var et=De(U,2),RA=j=>{z1e(j,{onClose:()=>x(Ie,!1)})};ze(et,j=>{g(Ie)&&j(RA)});var jA=De(et,2),rn=j=>{P1e(j,qC(()=>g(We),{onClose:()=>{var Ee;(Ee=g(We))===null||Ee===void 0||Ee.onClose(),x(We,void 0)}}))};return ze(jA,j=>{g(We)&&j(rn)}),xA(j=>v=ci(U,1,"jse-tree-mode svelte-vrx1dr",null,v,j),[()=>({"no-main-menu":!k()})],tA),QA("keydown",U,function(j){var Ee=X2(j),qe=j.shiftKey;if(i("keydown",{combo:Ee,key:j.key}),Ee==="Ctrl+X"&&(j.preventDefault(),L(!0)),Ee==="Ctrl+Shift+X"&&(j.preventDefault(),L(!1)),Ee==="Ctrl+C"&&(j.preventDefault(),Di(!0)),Ee==="Ctrl+Shift+C"&&(j.preventDefault(),Di(!1)),Ee==="Ctrl+D"&&(j.preventDefault(),mr()),Ee!=="Delete"&&Ee!=="Backspace"||(j.preventDefault(),Qr()),Ee==="Insert"&&(j.preventDefault(),On("structure")),Ee==="Ctrl+A"&&(j.preventDefault(),x(pe,zi([]))),Ee==="Ctrl+Q"&&Tt(j),Ee==="ArrowUp"||Ee==="Shift+ArrowUp"){j.preventDefault();var kA=g(pe)?Gde(g(we),g(Fe),g(pe),qe)||g(pe):Rf(g(we),g(Fe));x(pe,kA),EA(It(kA))}if(Ee==="ArrowDown"||Ee==="Shift+ArrowDown"){j.preventDefault();var MA=g(pe)?function($i,fo,ei){var er=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(ei){var no=er?It(ei):ZC($i,ei),ko=sr(WA($i,no))?Rde($i,fo,no,!0):fo,yn=kJ($i,fo,no),Ht=kJ($i,ko,no);if(er)return cs(ei)?yn!==void 0?Fa(yn,yn):void 0:Jc(ei)?Ht!==void 0?Fa(Ht,Ht):void 0:Ht!==void 0?Fa(nh(ei),Ht):void 0;if(Jc(ei))return Ht!==void 0?zi(Ht):void 0;if(cs(ei)||fn(ei))return yn!==void 0?zi(yn):void 0;if(Bs(ei)){if(yn===void 0||yn.length===0)return;var sn=Hi(yn),zt=WA($i,sn);return Array.isArray(zt)?zi(yn):$2(yn)}return Io(ei)?Ht!==void 0?zi(Ht):yn!==void 0?zi(yn):void 0:void 0}}(g(we),g(Fe),g(pe),qe)||g(pe):Rf(g(we),g(Fe));x(pe,MA),EA(It(MA))}if(Ee==="ArrowLeft"||Ee==="Shift+ArrowLeft"){j.preventDefault();var wA=g(pe)?function($i,fo,ei){var er=arguments.length>3&&arguments[3]!==void 0&&arguments[3],no=!(arguments.length>4&&arguments[4]!==void 0)||arguments[4];if(ei){var{caret:ko,previous:yn}=Kde($i,fo,ei,no);if(er)return Io(ei)?void 0:Fa(ei.path,ei.path);if(ko&&yn)return oY(yn);var Ht=Hi(It(ei)),sn=WA($i,Ht);return fn(ei)&&Array.isArray(sn)?Fa(ei.path,ei.path):Io(ei)&&!Array.isArray(sn)?$2(ei.focusPath):void 0}}(g(we),g(Fe),g(pe),qe,!u())||g(pe):Rf(g(we),g(Fe));x(pe,wA),EA(It(wA))}if(Ee==="ArrowRight"||Ee==="Shift+ArrowRight"){j.preventDefault();var yt=g(pe)&&g(we)!==void 0?function($i,fo,ei){var er=arguments.length>3&&arguments[3]!==void 0&&arguments[3],no=!(arguments.length>4&&arguments[4]!==void 0)||arguments[4];if(ei){var{caret:ko,next:yn}=Kde($i,fo,ei,no);return er?Io(ei)?void 0:Fa(ei.path,ei.path):ko&&yn?oY(yn):Io(ei)?zi(ei.focusPath):void 0}}(g(we),g(Fe),g(pe),qe,!u())||g(pe):Rf(g(we),g(Fe));x(pe,yt),EA(It(yt))}if(Ee==="Enter"&&g(pe)){if(KM(g(pe))){var at=g(pe).focusPath,Ni=WA(g(we),Hi(at));Array.isArray(Ni)&&(j.preventDefault(),x(pe,zi(at)))}Bs(g(pe))&&(j.preventDefault(),x(pe,SA(SA({},g(pe)),{},{edit:!0}))),fn(g(pe))&&(j.preventDefault(),sr(WA(g(we),g(pe).path))?Xe(g(pe).path,!0):x(pe,SA(SA({},g(pe)),{},{edit:!0})))}if(Ee.replace(/^Shift\+/,"").length===1&&g(pe))return j.preventDefault(),void Jn(j.key);if(Ee==="Enter"&&(Jc(g(pe))||cs(g(pe))))return j.preventDefault(),void Jn("");if(Ee==="Ctrl+Enter"&&fn(g(pe))){var Gn=WA(g(we),g(pe).path);FM(Gn)&&window.open(String(Gn),"_blank")}Ee==="Escape"&&g(pe)&&(j.preventDefault(),x(pe,void 0)),Ee==="Ctrl+F"&&(j.preventDefault(),$t(!1)),Ee==="Ctrl+H"&&(j.preventDefault(),$t(!0)),Ee==="Ctrl+Z"&&(j.preventDefault(),pr()),Ee==="Ctrl+Shift+Z"&&(j.preventDefault(),Mi())}),QA("mousedown",U,function(j){i("handleMouseDown",j);var Ee=j.target;g1e(Ee,"BUTTON")||Ee.isContentEditable||(ri(),g(pe)||g(we)!==void 0||g(Ze)!==""&&g(Ze)!==void 0||(i("createDefaultSelection"),x(pe,zi([]))))}),QA("contextmenu",U,Tt),he(t,R),jt(A,"expand",Ne),jt(A,"collapse",pA),jt(A,"validate",nA),jt(A,"getJson",Bt),jt(A,"patch",oi),jt(A,"acceptAutoRepair",Xt),jt(A,"openTransformModal",Nr),jt(A,"scrollTo",Ft),jt(A,"findElement",Me),jt(A,"findSearchResult",gA),jt(A,"focus",ri),kt({expand:Ne,collapse:pA,validate:nA,getJson:Bt,patch:oi,acceptAutoRepair:Xt,openTransformModal:Nr,scrollTo:Ft,findElement:Me,findSearchResult:gA,focus:ri})}function oCe(t){return typeof(A=t)!="object"||A===null?t:new Proxy(t,{get:(e,i,n)=>oCe(Reflect.get(e,i,n)),set:()=>!1,deleteProperty:()=>!1});var A}var iM=Es("jsoneditor:History");function rCe(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},A=t.maxItems||1e3,e=[],i=0;function n(){return i0}function r(){return{canUndo:n(),canRedo:o(),items:()=>e.slice().reverse(),add:a,undo:l,redo:d,clear:c}}function s(){t.onChange&&t.onChange(r())}function a(C){iM("add",C),e=[C].concat(e.slice(i)).slice(0,A),i=0,s()}function c(){iM("clear"),e=[],i=0,s()}function l(){if(n()){var C=e[i];return i+=1,iM("undo",C),s(),C}}function d(){if(o())return iM("redo",e[i-=1]),s(),e[i]}return{get:r}}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-transform-modal-inner.svelte-rrrjnb { + flex: 1; + display: flex; + flex-direction: column; + min-width: 0; + min-height: 0; +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) { + color: inherit; + flex: 1; + display: flex; + flex-direction: column; + padding: 0; + overflow: auto; + min-width: 0; + min-height: 0; +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-actions:where(.svelte-rrrjnb) { + display: flex; + flex-direction: row; + justify-content: flex-end; + padding-top: var(--jse-padding, 10px); +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-actions:where(.svelte-rrrjnb) button.jse-primary:where(.svelte-rrrjnb) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); + color: var(--jse-button-primary-color, #fff); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-actions:where(.svelte-rrrjnb) button.jse-primary:where(.svelte-rrrjnb):hover { + background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-actions:where(.svelte-rrrjnb) button.jse-primary:where(.svelte-rrrjnb):disabled { + background: var(--jse-button-primary-background-disabled, #9d9d9d); +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) { + flex: 1; + display: flex; + gap: calc(2 * var(--jse-padding, 10px)); + min-height: 0; + box-sizing: border-box; + padding: 0 calc(2 * var(--jse-padding, 10px)) var(--jse-padding, 10px); +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-query-contents:where(.svelte-rrrjnb) { + flex: 1; + display: flex; + flex-direction: column; +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-query-contents:where(.svelte-rrrjnb) .jse-description:where(.svelte-rrrjnb) p { + margin: var(--jse-padding, 10px) 0; +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-query-contents:where(.svelte-rrrjnb) .jse-description:where(.svelte-rrrjnb) p:first-child { + margin-top: 0; +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-query-contents:where(.svelte-rrrjnb) .jse-description:where(.svelte-rrrjnb) p:last-child { + margin-bottom: 0; +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-query-contents:where(.svelte-rrrjnb) .jse-description:where(.svelte-rrrjnb) code { + background: var(--jse-modal-code-background, rgba(0, 0, 0, 0.05)); + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-query-contents:where(.svelte-rrrjnb) .query-error:where(.svelte-rrrjnb) { + color: var(--jse-error-color, #ee5341); +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-query-contents:where(.svelte-rrrjnb) textarea.jse-query:where(.svelte-rrrjnb) { + flex: 1; + outline: none; + resize: vertical; +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-data-contents:where(.svelte-rrrjnb) { + flex: 1; + display: flex; + flex-direction: column; + gap: calc(2 * var(--jse-padding, 10px)); +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-data-contents:where(.svelte-rrrjnb) .jse-original-data:where(.svelte-rrrjnb) { + flex: 1; + display: flex; + flex-direction: column; + min-height: 0; + box-sizing: border-box; +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-data-contents:where(.svelte-rrrjnb) .jse-original-data.jse-hide:where(.svelte-rrrjnb) { + flex: none; +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-data-contents:where(.svelte-rrrjnb) .jse-preview-data:where(.svelte-rrrjnb) { + flex: 1; + display: flex; + flex-direction: column; + min-height: 0; + box-sizing: border-box; +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-data-contents.jse-hide-original-data:where(.svelte-rrrjnb) { + flex-direction: column; + gap: 0; + margin-bottom: 0; +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-actions:where(.svelte-rrrjnb) { + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)) calc(2 * var(--jse-padding, 10px)); +} +@media screen and (max-width: 1200px) { + .jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) { + flex-direction: column; + overflow: auto; + } + .jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-query-contents:where(.svelte-rrrjnb) textarea.jse-query:where(.svelte-rrrjnb) { + min-height: 150px; + flex: none; + } + .jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-data-contents:where(.svelte-rrrjnb) .jse-tree-mode { + height: 300px; + flex: none; + } +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-label:where(.svelte-rrrjnb) { + font-weight: bold; + display: block; + box-sizing: border-box; +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-label:where(.svelte-rrrjnb) .jse-label-inner:where(.svelte-rrrjnb) { + margin-top: calc(2 * var(--jse-padding, 10px)); + margin-bottom: calc(0.5 * var(--jse-padding, 10px)); + box-sizing: border-box; +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-label:where(.svelte-rrrjnb) .jse-label-inner:where(.svelte-rrrjnb) button:where(.svelte-rrrjnb) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + font-weight: bold; + padding: 0; +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-tree-mode { + flex: 1; + background: var(--jse-input-background-readonly, transparent); + box-shadow: none; + box-sizing: border-box; + --jse-main-border: var(--jse-input-border, 1px solid #d8dbdf); +} +.jse-transform-modal-inner.svelte-rrrjnb input:where(.svelte-rrrjnb), +.jse-transform-modal-inner.svelte-rrrjnb textarea:where(.svelte-rrrjnb) { + border: var(--jse-input-border, 1px solid #d8dbdf); + outline: none; + box-sizing: border-box; + padding: calc(0.5 * var(--jse-padding, 10px)); + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + color: inherit; + background: var(--jse-input-background, var(--jse-background-color, #fff)); +} +.jse-transform-modal-inner.svelte-rrrjnb input:where(.svelte-rrrjnb):focus, +.jse-transform-modal-inner.svelte-rrrjnb textarea:where(.svelte-rrrjnb):focus { + border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); +} +.jse-transform-modal-inner.svelte-rrrjnb input:where(.svelte-rrrjnb):read-only, +.jse-transform-modal-inner.svelte-rrrjnb textarea:where(.svelte-rrrjnb):read-only { + background: var(--jse-input-background-readonly, transparent); +} +.jse-transform-modal-inner.svelte-rrrjnb .jse-preview.jse-error:where(.svelte-rrrjnb) { + flex: 1; + background: var(--jse-input-background-readonly, transparent); + border: var(--jse-input-border, 1px solid #d8dbdf); + color: var(--jse-error-color, #ee5341); + padding: calc(0.5 * var(--jse-padding, 10px)); +} +.jse-transform-modal-inner.svelte-rrrjnb a { + color: var(--jse-a-color, #156fc5); +} +.jse-transform-modal-inner.svelte-rrrjnb a:hover { + color: var(--jse-a-color-highlight, #0f508d); +}`);var Mp=LM(()=>oWe),Lf=LM(()=>rWe),i$e=_e('
      '),n$e=_e(" ",1),o$e=_e('
      '),r$e=_e('
      Language
      Path
      Query
      Preview
      ',1),s$e=_e('
      ');function a$e(t,A){var e,i,n;St(A,!1);var o=Es("jsoneditor:TransformModal"),r=N(A,"id",25,()=>"transform-modal-"+Tf()),s=N(A,"json",9),a=N(A,"rootPath",25,()=>[]),c=N(A,"indentation",9),l=N(A,"truncateTextSize",9),d=N(A,"escapeControlCharacters",9),C=N(A,"escapeUnicodeCharacters",9),I=N(A,"parser",9),u=N(A,"parseMemoizeOne",9),h=N(A,"validationParser",9),B=N(A,"pathParser",9),f=N(A,"queryLanguages",9),b=N(A,"queryLanguageId",13),k=N(A,"onChangeQueryLanguage",9),S=N(A,"onRenderValue",9),w=N(A,"onRenderMenu",9),_=N(A,"onRenderContextMenu",9),K=N(A,"onClassName",9),J=N(A,"onTransform",9),O=N(A,"onClose",9),H=Ce(void 0,!0),V=Ce(rCe({onChange:Fe=>x(V,Fe)}).get(),!0),Z=Ce(void 0,!0),ye=Ce(void 0,!0),P=Ce(!1,!0),se="".concat(r(),":").concat(pt(a())),X=(e=Mp()[se])!==null&&e!==void 0?e:{},ue=Ce(Lf().showWizard!==!1,!0),oe=Ce(Lf().showOriginal!==!1,!0),le=Ce((i=X.queryOptions)!==null&&i!==void 0?i:{},!0),me=Ce(b()===X.queryLanguageId&&X.query?X.query:"",!0),Te=Ce((n=X.isManual)!==null&&n!==void 0&&n,!0),$e=Ce(void 0,!0),Je=Ce(void 0,!0),Qe=Ce({text:""},!0);function He(Fe){var pe;return(pe=f().find(Wt=>Wt.id===Fe))!==null&&pe!==void 0?pe:f()[0]}function PA(Fe){try{x(le,Fe),x(me,He(b()).createQuery(g(Z),Fe)),x($e,void 0),x(Te,!1),o("updateQueryByWizard",{queryOptions:g(le),query:g(me),isManual:g(Te)})}catch(pe){x($e,String(pe))}}function JA(Fe){x(me,Fe.target.value),x(Te,!0),o("handleChangeQuery",{query:g(me),isManual:g(Te)})}g(Te)||PA(g(le)),ua(()=>{var Fe;(Fe=g(H))===null||Fe===void 0||Fe.focus()});var Ye=KE(function(Fe,pe){if(Fe===void 0)return x(Qe,{text:""}),void x(Je,"Error: No JSON");if(pe.trim()!=="")try{o("previewTransform",{query:pe});var Wt=He(b()).executeQuery(Fe,pe,I());x(Qe,{json:Wt}),x(Je,void 0)}catch(Qt){x(Qe,{text:""}),x(Je,String(Qt))}else x(Qe,{json:Fe})},300);function Ie(){if(g(Z)===void 0)return x(Qe,{text:""}),void x(Je,"Error: No JSON");try{o("handleTransform",{query:g(me)});var Fe=He(b()).executeQuery(g(Z),g(me),I());J()([{op:"replace",path:pt(a()),value:Fe}]),O()()}catch(pe){console.error(pe),x(Qe,{text:""}),x(Je,String(pe))}}function We(){x(ue,!g(ue)),Lf(Lf().showWizard=g(ue))}function we(){x(oe,!g(oe)),Lf(Lf().showOriginal=g(oe))}function Ze(Fe){Fe.focus()}function Ge(Fe){o("handleChangeQueryLanguage",Fe),b(Fe),k()(Fe),PA(g(le))}function LA(){g(P)?x(P,!g(P)):O()()}Se(()=>(F(s()),F(a())),()=>{x(Z,oCe(WA(s(),a())))}),Se(()=>g(Z),()=>{x(ye,g(Z)?{json:g(Z)}:{text:""})}),Se(()=>(g(Z),g(me)),()=>{Ye(g(Z),g(me))}),Se(()=>(Mp(),g(le),g(me),F(b()),g(Te)),()=>{Mp(Mp()[se]={queryOptions:g(le),query:g(me),queryLanguageId:b(),isManual:g(Te)}),o("store state in memory",se,Mp()[se])}),Nn(),li(!0),jp(t,{get onClose(){return O()},className:"jse-transform-modal",get fullscreen(){return g(P)},children:(Fe,pe)=>{var Wt=s$e();eY(ge(Wt),{children:(Qt,BA)=>{var _t=r$e(),VA=Ut(_t);(function(L,ct){St(ct,!1);var Di,mn=N(ct,"queryLanguages",9),pn=N(ct,"queryLanguageId",9),so=N(ct,"fullscreen",13),$o=N(ct,"onChangeQueryLanguage",9),Ao=N(ct,"onClose",9),Fn=Ce(void 0,!0),{openAbsolutePopup:Qr,closeAbsolutePopup:mr}=nI("absolute-popup");function zo(){var On={queryLanguages:mn(),queryLanguageId:pn(),onChangeQueryLanguage:ho=>{mr(Di),$o()(ho)}};Di=Qr(AZe,On,{offsetTop:-2,offsetLeft:0,anchor:g(Fn),closeOnOuterClick:!0})}li(!0),vM(L,{title:"Transform",fullScreenButton:!0,get onClose(){return Ao()},get fullscreen(){return so()},set fullscreen(On){so(On)},$$slots:{actions:(On,ho)=>{var sA,_i=nZe();nn(ge(_i),{get data(){return hoe}}),Ho(_i,Zi=>x(Fn,Zi),()=>g(Fn)),xA(Zi=>sA=ci(_i,1,"jse-config svelte-1kpylsp",null,sA,Zi),[()=>({hide:mn().length<=1})],tA),QA("click",_i,zo),he(On,_i)}},$$legacy:!0}),kt()})(VA,{get queryLanguages(){return f()},get queryLanguageId(){return b()},onChangeQueryLanguage:Ge,get onClose(){return O()},get fullscreen(){return g(P)},set fullscreen(L){x(P,L)},$$legacy:!0});var YA=ge(De(VA,2)),Jt=ge(YA),KA=De(ge(Jt),2);V2e(ge(KA),()=>(F(b()),Be(()=>He(b()).description)));var di=De(KA,4),G=De(di,2),z=ge(G),Ae=ge(z),de=ge(Ae),Ne=tA(()=>g(ue)?ld:TE);nn(de,{get data(){return g(Ne)}});var pA=De(G,2),vA=L=>{var ct=ar(),Di=Ut(ct),mn=so=>{var $o=n$e(),Ao=Ut($o);XWe(Ao,{get queryOptions(){return g(le)},get json(){return g(Z)},onChange:PA});var Fn=De(Ao,2),Qr=mr=>{var zo=i$e(),On=ge(zo);xA(()=>xt(On,g($e))),he(mr,zo)};ze(Fn,mr=>{g($e)&&mr(Qr)}),he(so,$o)},pn=so=>{he(so,Ss("(Only available for arrays, not for objects)"))};ze(Di,so=>{g(Z),Be(()=>Array.isArray(g(Z)))?so(mn):so(pn,!1)}),he(L,ct)};ze(pA,L=>{g(ue)&&L(vA)});var Ke=De(pA,4);Ho(Ke,L=>x(H,L),()=>g(H));var Re,wt,st=De(Jt,2),nA=ge(st),Bt=ge(nA),Wi=ge(Bt),Qn=ge(Wi),dn=ge(Qn),HA=tA(()=>g(oe)?ld:TE);nn(dn,{get data(){return g(HA)}});var Cn=De(Bt,2),Gi=L=>{fY(L,{get externalContent(){return g(ye)},externalSelection:void 0,get history(){return g(V)},readOnly:!0,get truncateTextSize(){return l()},mainMenuBar:!1,navigationBar:!1,get indentation(){return c()},get escapeControlCharacters(){return d()},get escapeUnicodeCharacters(){return C()},get parser(){return I()},get parseMemoizeOne(){return u()},get onRenderValue(){return S()},get onRenderMenu(){return w()},get onRenderContextMenu(){return _()},onError:Be(()=>console.error),get onChange(){return xr},get onChangeMode(){return xr},get onSelect(){return xr},get onUndo(){return xr},get onRedo(){return xr},get onFocus(){return xr},get onBlur(){return xr},get onSortModal(){return xr},get onTransformModal(){return xr},get onJSONEditorModal(){return xr},get onClassName(){return K()},validator:void 0,get validationParser(){return h()},get pathParser(){return B()}})};ze(Cn,L=>{g(oe)&&L(Gi)});var oi=De(nA,2),Yt=De(ge(oi),2),xi=L=>{fY(L,{get externalContent(){return g(Qe)},externalSelection:void 0,get history(){return g(V)},readOnly:!0,get truncateTextSize(){return l()},mainMenuBar:!1,navigationBar:!1,get indentation(){return c()},get escapeControlCharacters(){return d()},get escapeUnicodeCharacters(){return C()},get parser(){return I()},get parseMemoizeOne(){return u()},get onRenderValue(){return S()},get onRenderMenu(){return w()},get onRenderContextMenu(){return _()},onError:Be(()=>console.error),get onChange(){return xr},get onChangeMode(){return xr},get onSelect(){return xr},get onUndo(){return xr},get onRedo(){return xr},get onFocus(){return xr},get onBlur(){return xr},get onSortModal(){return xr},get onTransformModal(){return xr},get onJSONEditorModal(){return xr},get onClassName(){return K()},validator:void 0,get validationParser(){return h()},get pathParser(){return B()}})},Pi=L=>{var ct=o$e(),Di=ge(ct);xA(()=>xt(Di,g(Je))),he(L,ct)};ze(Yt,L=>{g(Je)?L(Pi,!1):L(xi)});var Xt=ge(De(YA,2));zs(()=>QA("click",Xt,Ie)),Ka(Xt,L=>Ze?.(L)),xA((L,ct,Di)=>{ah(di,L),ah(Ke,g(me)),Re=ci(st,1,"jse-data-contents svelte-rrrjnb",null,Re,ct),wt=ci(nA,1,"jse-original-data svelte-rrrjnb",null,wt,Di),Xt.disabled=!!g(Je)},[()=>(F(An),F(a()),F(Yc),Be(()=>An(a())?"(document root)":Yc(a()))),()=>({"jse-hide-original-data":!g(oe)}),()=>({"jse-hide":!g(oe)})],tA),QA("click",Ae,We),QA("input",Ke,JA),QA("click",Qn,we),he(Qt,_t)},$$slots:{default:!0}}),Ka(Wt,(Qt,BA)=>bM?.(Qt,BA),()=>LA),he(Fe,Wt)},$$slots:{default:!0}}),kt()}function sg(){}var c$e=0,Ms=class{constructor(){var A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.id=c$e++,this.perNode=!!A.perNode,this.deserialize=A.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")})}add(A){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof A!="function"&&(A=qp.match(A)),e=>{var i=A(e);return i===void 0?null:[this,i]}}};Ms.closedBy=new Ms({deserialize:t=>t.split(" ")}),Ms.openedBy=new Ms({deserialize:t=>t.split(" ")}),Ms.group=new Ms({deserialize:t=>t.split(" ")}),Ms.isolate=new Ms({deserialize:t=>{if(t&&t!="rtl"&&t!="ltr"&&t!="auto")throw new RangeError("Invalid value for isolate: "+t);return t||"auto"}}),Ms.contextHash=new Ms({perNode:!0}),Ms.lookAhead=new Ms({perNode:!0}),Ms.mounted=new Ms({perNode:!0});var c2e,l$e=Object.create(null),qp=class t{constructor(A,e,i){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;this.name=A,this.props=e,this.id=i,this.flags=n}static define(A){var e=A.props&&A.props.length?Object.create(null):l$e,i=(A.top?1:0)|(A.skipped?2:0)|(A.error?4:0)|(A.name==null?8:0),n=new t(A.name||"",e,A.id,i);if(A.props){for(var o of A.props)if(Array.isArray(o)||(o=o(n)),o){if(o[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");e[o[0].id]=o[1]}}return n}prop(A){return this.props[A.id]}get isTop(){return(1&this.flags)>0}get isSkipped(){return(2&this.flags)>0}get isError(){return(4&this.flags)>0}get isAnonymous(){return(8&this.flags)>0}is(A){if(typeof A=="string"){if(this.name==A)return!0;var e=this.prop(Ms.group);return!!e&&e.indexOf(A)>-1}return this.id==A}static match(A){var e=Object.create(null);for(var i in A)for(var n of i.split(" "))e[n]=A[i];return o=>{for(var r=o.prop(Ms.group),s=-1;s<(r?r.length:0);s++){var a=e[s<0?o.name:r[s]];if(a)return a}}}};qp.none=new qp("",Object.create(null),0,8),function(t){t[t.ExcludeBuffers=1]="ExcludeBuffers",t[t.IncludeAnonymous=2]="IncludeAnonymous",t[t.IgnoreMounts=4]="IgnoreMounts",t[t.IgnoreOverlays=8]="IgnoreOverlays"}(c2e||(c2e={})),new Ms({perNode:!0});Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-status-bar.svelte-1ulj7zd { + background: var(--jse-panel-background, #ebebeb); + color: var(--jse-panel-color-readonly, #b2b2b2); + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + margin: 0; + border-top: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); + display: flex; + gap: var(--jse-padding, 10px); +} +.jse-status-bar.svelte-1ulj7zd:last-child { + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-status-bar.svelte-1ulj7zd .jse-status-bar-info:where(.svelte-1ulj7zd) { + padding: 2px; +}`);var g$e=_e('
      '),d$e=_e('
      '),C$e=_e('
      '),I$e=_e('
      '),XY=wf.define([{tag:GA.propertyName,color:"var(--internal-key-color)"},{tag:GA.number,color:"var(--internal-value-color-number)"},{tag:GA.bool,color:"var(--internal-value-color-boolean)"},{tag:GA.string,color:"var(--internal-value-color-string)"},{tag:GA.keyword,color:"var(--internal-value-color-null)"}]),u$e=pO(XY),h$e=XY.style;XY.style=t=>h$e(t||[]);var B$e=[Jo.fromClass(class{constructor(t){this.view=t,this.indentUnit=qg(t.state),this.initialPaddingLeft=null,this.isChrome=window?.navigator.userAgent.includes("Chrome"),this.generate(t.state)}update(t){var A=qg(t.state);(A!==this.indentUnit||t.docChanged||t.viewportChanged)&&(this.indentUnit=A,this.generate(t.state))}generate(t){var A=new ga;this.initialPaddingLeft?this.addStyleToBuilder(A,t,this.initialPaddingLeft):this.view.requestMeasure({read:e=>{var i=e.contentDOM.querySelector(".cm-line");i&&(this.initialPaddingLeft=window.getComputedStyle(i).getPropertyValue("padding-left"),this.addStyleToBuilder(A,e.state,this.initialPaddingLeft)),this.decorations=A.finish()}}),this.decorations=A.finish()}addStyleToBuilder(t,A,e){var i=this.getVisibleLines(A);for(var n of i){var{numColumns:o,containsTab:r}=this.numColumns(n.text,A.tabSize),s="calc(".concat(o+this.indentUnit,"ch + ").concat(e,")"),a=this.isChrome?"calc(-".concat(o+this.indentUnit,"ch - ").concat(r?1:0,"px)"):"-".concat(o+this.indentUnit,"ch");t.add(n.from,n.from,bt.line({attributes:{style:"padding-left: ".concat(s,"; text-indent: ").concat(a,";")}}))}}getVisibleLines(t){var A=new Set,e=null;for(var{from:i,to:n}of this.view.visibleRanges)for(var o=i;o<=n;){var r=t.doc.lineAt(o);e!==r&&(A.add(r),e=r),o=r.to+1}return A}numColumns(t,A){var e=0,i=!1;e:for(var n=0;nt.decorations})];Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-text-mode.svelte-1pr65po { + --internal-key-color: var(--jse-key-color, #1a1a1a); + --internal-value-color-number: var(--jse-value-color-number, #ee422e); + --internal-value-color-boolean: var(--jse-value-color-boolean, #ff8c00); + --internal-value-color-string: var(--jse-value-color-string, #008000); + --internal-value-color-null: var(--jse-value-color-null, #004ed0); + flex: 1; + box-sizing: border-box; + display: flex; + flex-direction: column; + background: var(--jse-background-color, #fff); +} +.jse-text-mode.no-main-menu.svelte-1pr65po { + border-top: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) { + flex: 1; + display: flex; + position: relative; + flex-direction: column; + overflow: hidden; + min-width: 0; + min-height: 0; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po):last-child { + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-text-mode.svelte-1pr65po .jse-contents.jse-hidden:where(.svelte-1pr65po) { + visibility: hidden; + position: absolute; + top: 0; + left: 0; +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor { + flex: 1; + overflow: hidden; +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-scroller { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + line-height: var(--jse-line-height, calc(1em + 4px)); + color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-gutters { + background: var(--jse-panel-background, #ebebeb); + color: var(--jse-panel-color-readonly, #b2b2b2); + border-right: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-activeLine, +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-activeLineGutter { + background: var(--jse-active-line-background-color, rgba(0, 0, 0, 0.06)); +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-selectionBackground { + background: var(--jse-selection-background-color, #d3d3d3); +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-searchMatch { + background-color: var(--jse-search-match-color, #ffe665); + outline: var(--jse-search-match-outline, none); +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-searchMatch.cm-searchMatch-selected { + background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); + outline: var(--jse-search-match-outline, 2px solid #e0be00); +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-selectionMatch { + background-color: var(--jse-search-match-background-color, rgba(153, 255, 119, 0.5019607843)); +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-foldPlaceholder { + background: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); + color: var(--jse-tag-color, var(--jse-text-color-inverse, #fff)); + border: none; + padding: 0 var(--jse-padding, 10px); +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-tooltip { + font-size: var(--jse-font-size, 16px); + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + color: var(--jse-tooltip-color, var(--jse-text-color, #4d4d4d)); + background: var(--jse-tooltip-background, var(--jse-modal-background, #f5f5f5)); + border: var(--jse-tooltip-border, var(--jse-main-border, 1px solid #d7d7d7)); +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-diagnosticAction { + background: var(--jse-tooltip-action-button-color, var(--jse-text-color-inverse, #fff)); + background: var(--jse-tooltip-action-button-background, #4d4d4d); +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-panels { + border-bottom: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-search { + background: var(--jse-panel-background, #ebebeb); + color: var(--jse-panel-color, var(--jse-text-color, #4d4d4d)); + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-search input { + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size-text-mode-search, 80%); + color: var(--jse-input-color, var(--jse-text-color, #4d4d4d)); + border: var(--jse-input-border, 1px solid #d8dbdf); + background: var(--jse-input-background, var(--jse-background-color, #fff)); + margin-right: 2px; +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-search button { + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size-text-mode-search, 80%); + color: var(--jse-panel-button-color, inherit); + background: var(--jse-panel-button-background, transparent); + border: none; + cursor: pointer; + text-transform: capitalize; + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); + margin: 0; +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-search button:hover { + color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); + background: var(--jse-panel-button-background-highlight, #e0e0e0); +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-search label { + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size-text-mode-search, 80%); + padding-left: var(--jse-padding, 10px); +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-search label input { + margin-right: 2px; +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-search button[name="close"] { + width: 32px; + height: 32px; + font-size: 24px; + line-height: 24px; + padding: 0; + right: 0; + top: -4px; +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .cm-editor .cm-cursor-primary { + border-color: var(--jse-text-color, #4d4d4d); +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .jse-loading-space:where(.svelte-1pr65po) { + flex: 1; +} +.jse-text-mode.svelte-1pr65po .jse-contents:where(.svelte-1pr65po) .jse-loading:where(.svelte-1pr65po) { + flex: 2; + text-align: center; + color: var(--jse-panel-color-readonly, #b2b2b2); + box-sizing: border-box; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); +} +.jse-text-mode.svelte-1pr65po .jse-contents.jse-preview:where(.svelte-1pr65po) { + flex: 1; + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + color: var(--jse-panel-color-readonly, #b2b2b2); + overflow: auto; + white-space: pre-wrap; + word-break: break-word; + padding: 2px; +} +.jse-text-mode.svelte-1pr65po .jse-fold-progress:where(.svelte-1pr65po) { + display: flex; + align-items: center; + gap: 8px; + padding: 8px 12px; + background: var(--jse-background-color, #fff); + border-top: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); + border-bottom: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); +} +.jse-text-mode.svelte-1pr65po .jse-fold-progress:where(.svelte-1pr65po) .jse-fold-tip:where(.svelte-1pr65po) { + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size-mono, 14px); + color: var(--jse-panel-color-readonly, #b2b2b2); +} +.jse-text-mode.svelte-1pr65po .jse-fold-progress:where(.svelte-1pr65po) .jse-fold-progress-track:where(.svelte-1pr65po) { + flex: 1; + height: 6px; + background: var(--jse-panel-background, #ebebeb); + border-radius: 3px; + overflow: hidden; + border: 1px solid var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); +} +.jse-text-mode.svelte-1pr65po .jse-fold-progress:where(.svelte-1pr65po) .jse-fold-progress-fill:where(.svelte-1pr65po) { + height: 100%; + background: linear-gradient(90deg, var(--jse-theme-color, #3883fa), var(--jse-theme-color-highlight, #5f9dff)); + border-radius: 2px; + transition: width 0.1s ease; + min-width: 2px; +} +.jse-text-mode.svelte-1pr65po .jse-fold-progress:where(.svelte-1pr65po) .jse-fold-cancel-button:where(.svelte-1pr65po) { + padding: 4px 12px; + font-size: 12px; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + background: var(--jse-theme-color, #3883fa); + color: #fff; + border-radius: 3px; + cursor: pointer; + transition: background-color 0.2s ease; + flex-shrink: 0; + border: 1px solid var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-text-mode.svelte-1pr65po .jse-fold-progress:where(.svelte-1pr65po) .jse-fold-cancel-button:where(.svelte-1pr65po):hover { + background: var(--jse-theme-color-highlight, #5f9dff); + color: #fff; +}`);var E$e=_e('
      Collapsing
      '),f$e=_e('
      ',1),Q$e=_e(" ",1),m$e=_e("
      ",1),p$e=_e('
      loading...
      '),w$e=_e("
      ");function y$e(t,A){St(A,!1);var e=Ce(void 0,!0),i=Ce(void 0,!0),n=N(A,"readOnly",9),o=N(A,"mainMenuBar",9),r=N(A,"statusBar",9),s=N(A,"askToFormat",9),a=N(A,"externalContent",9),c=N(A,"externalSelection",9),l=N(A,"history",9),d=N(A,"indentation",9),C=N(A,"tabSize",9),I=N(A,"escapeUnicodeCharacters",9),u=N(A,"parser",9),h=N(A,"validator",9),B=N(A,"validationParser",9),f=N(A,"onChange",9),b=N(A,"onChangeMode",9),k=N(A,"onSelect",9),S=N(A,"onUndo",9),w=N(A,"onRedo",9),_=N(A,"onError",9),K=N(A,"onFocus",9),J=N(A,"onBlur",9),O=N(A,"onRenderMenu",9),H=N(A,"onSortModal",9),V=N(A,"onTransformModal",9),Z=Es("jsoneditor:TextMode"),ye={key:"Mod-i",run:Ne,shift:pA,preventDefault:!0},P=typeof window>"u";Z("isSSR:",P);var se,X=Ce(void 0,!0),ue=Ce(void 0,!0),oe=Ce(void 0,!0),le=Ce(!1,!0),me=Ce(s(),!0),Te=Ce([],!0),$e=Ce(!1,!0),Je=Ce(0,!0),Qe=Ce(0,!0),He=null,PA=new hd,JA=new hd,Ye=new hd,Ie=new hd,We=new hd,we=a(),Ze=Ce($J(we,d(),u()),!0),Ge=Fc.define(),LA=null;function Fe(){if(!LA||LA.length===0)return!1;var Me=LA[0].startState,gA=LA[LA.length-1].state,EA=LA.map(bA=>bA.changes).reduce((bA,fe)=>bA.compose(fe)),zA={type:"text",undo:{changes:EA.invert(Me.doc).toJSON(),selection:zo(Me.selection)},redo:{changes:EA.toJSON(),selection:zo(gA.selection)}};return Z("add history item",zA),l().add(zA),LA=null,!0}var pe=Ce(I(),!0);ua(Vt(function*(){if(!P)try{se=function(Me){var{target:gA,initialText:EA,readOnly:zA,indentation:bA}=Me;Z("Create CodeMirror editor",{readOnly:zA,indentation:bA});var fe=function(Xe,qA){return _J(Xe)?Xe.ranges.every(Gt=>Gt.anchor{x(oe,Xe.state),Xe.docChanged&&(Xe.transactions.some(qA=>!!qA.annotation(Ge))||(LA=[...LA??[],Xe]),Ao()),Xe.selectionSet&&mr()}),E0e(),v0e({top:!0}),ai.lineWrapping,JA.of(ss.readOnly.of(zA)),Ie.of(ss.tabSize.of(C())),Ye.of($o(bA)),We.of(ai.theme({},{dark:Yt()}))]});return se=new ai({state:ke,parent:gA}),fe&&se.dispatch(se.state.update({selection:fe.main,scrollIntoView:!0})),se}({target:g(X),initialText:On(g(Ze),g(le))?"":g(e).escapeValue(g(Ze)),readOnly:n(),indentation:d()})}catch(Me){console.error(Me)}})),gg(()=>{Fn(),se&&(Z("Destroy CodeMirror editor"),se.destroy()),di()});var Wt=IC(),Qt=IC();function BA(){se&&(Z("focus"),se.focus())}function _t(Me,gA){if(se)try{(function(){var EA=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],zA=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],bA=se.state,fe=bA.doc.length,ke=uO(bA,fe,1/0);if(ke){var Xe=[];if(EA.length===0)Xe=Jt(ke,bA,void 0,zA);else{var{from:qA}=wJ(g(e).escapeValue(g(Ze)),EA);qA!==void 0&&qA!==0&&(Xe=Jt(ke,bA,qA,zA))}Xe.length>0&&function(Gt){KA.apply(this,arguments)}(Xe)}})(Me,gA)}catch(EA){_()(EA)}}function VA(){return EO.of((Me,gA,EA)=>{var zA=uO(Me,Me.doc.length,1/0);if(!zA||zA.lengthEA)){if(bA&&ke.from=gA&&qA.to>EA&&(bA=qA)}}}return bA})}function YA(Me){var gA=Me.lastChild;return gA&&gA.to==Me.to&&gA.type.isError}function Jt(Me,gA,EA){var zA=!(arguments.length>3&&arguments[3]!==void 0)||arguments[3],bA=[],fe=new Set;return Me.iterate({enter(ke){if(EA===void 0||ke.from>=EA){var Xe=pf(gA,ke.from,ke.to);if(Xe){var qA="".concat(Xe.from,"-").concat(Xe.to);if(!fe.has(qA))if(zA)bA.push({from:Xe.from,to:Xe.to}),fe.add(qA);else{var Gt=bA.some($t=>$t.from<=Xe.from&&$t.to>=Xe.to);Gt||(bA.push({from:Xe.from,to:Xe.to}),fe.add(qA))}}}}}),bA}function KA(){return KA=Vt(function*(Me){if(Me.length!==0){var gA=Me.length>5e3;gA&&(x($e,!0),x(Je,0),x(Qe,Me.length),He=new AbortController);var EA=zA=>new Promise(bA=>{var fe;gA&&(fe=He)!==null&&fe!==void 0&&fe.signal.aborted?bA():requestAnimationFrame(()=>{var ke=Math.min(zA+100,Me.length),Xe=Me.slice(zA,ke);se.dispatch({effects:Xe.map(qA=>Df.of({from:qA.from,to:qA.to}))}),gA&&x(Je,ke),ke1&&arguments[1]!==void 0?arguments[1]:nY;if(se)try{if(Me&&Me.length>0){var{from:EA}=wJ(g(e).escapeValue(g(Ze)),Me);EA!==void 0&&(se.dispatch({selection:{anchor:EA,head:EA}}),fO(se))}else QO(se);gA?.(Me)}catch(zA){_()(zA)}}var z=!1;function Ae(Me){return de(Me,!1)}function de(Me,gA){Z("handlePatch",Me,gA);var EA=u().parse(g(Ze)),zA=Mc(EA,Me),bA=SD(EA,Me);return L({text:u().stringify(zA,null,d())},gA,!1),{json:zA,previousJson:EA,undo:bA,redo:Me}}function Ne(){if(Z("format"),n())return!1;try{var Me=u().parse(g(Ze));return L({text:u().stringify(Me,null,d())},!0,!1),x(me,s()),!0}catch(gA){_()(gA)}return!1}function pA(){if(Z("compact"),n())return!1;try{var Me=u().parse(g(Ze));return L({text:u().stringify(Me)},!0,!1),x(me,!1),!0}catch(gA){_()(gA)}return!1}function vA(){if(Z("repair"),!n())try{L({text:jl(g(Ze))},!0,!1),x(ho,SJ),x(sA,void 0)}catch(Me){_()(Me)}}function Ke(){var Me;if(!n())try{var gA=u().parse(g(Ze));z=!0,H()({id:Wt,json:gA,rootPath:[],onSort:(Me=Vt(function*(EA){var{operations:zA}=EA;Z("onSort",zA),de(zA,!0)}),function(EA){return Me.apply(this,arguments)}),onClose:()=>{z=!1,BA()}})}catch(EA){_()(EA)}}function Re(Me){var{id:gA,rootPath:EA,onTransform:zA,onClose:bA}=Me;try{var fe=u().parse(g(Ze));z=!0,V()({id:gA||Qt,json:fe,rootPath:EA||[],onTransform:ke=>{zA?zA({operations:ke,json:fe,transformedJson:Mc(fe,ke)}):(Z("onTransform",ke),de(ke,!0))},onClose:()=>{z=!1,BA(),bA&&bA()}})}catch(ke){_()(ke)}}function wt(){n()||Re({rootPath:[]})}function st(){se&&(g(X)&&g(X).querySelector(".cm-search")?Nb(se):Rb(se))}function nA(){if(n())return!1;Fn();var Me=l().undo();return Z("undo",Me),xde(Me)?(se.dispatch({annotations:Ge.of("undo"),changes:la.fromJSON(Me.undo.changes),selection:fA.fromJSON(Me.undo.selection),scrollIntoView:!0}),!0):(S()(Me),!1)}function Bt(){if(n())return!1;Fn();var Me=l().redo();return Z("redo",Me),xde(Me)?(se.dispatch({annotations:Ge.of("redo"),changes:la.fromJSON(Me.redo.changes),selection:fA.fromJSON(Me.redo.selection),scrollIntoView:!0}),!0):(w()(Me),!1)}function Wi(){x(le,!0),L(a(),!0,!0)}function Qn(){b()(Rr.tree)}function dn(){pn()}function HA(Me){Z("select validation error",Me);var{from:gA,to:EA}=xi(Me);gA!==void 0&&EA!==void 0&&(Cn(gA,EA),BA())}function Cn(Me,gA){Z("setSelection",{anchor:Me,head:gA}),se&&se.dispatch(se.state.update({selection:{anchor:Me,head:gA},scrollIntoView:!0}))}function Gi(Me,gA){if(gA.state.selection.ranges.length===1){var EA=gA.state.selection.ranges[0],zA=g(Ze).slice(EA.from,EA.to);if(zA==="{"||zA==="["){var bA=QY.default.parse(g(Ze)),fe=Object.keys(bA.pointers).find(Xe=>{var qA;return((qA=bA.pointers[Xe].value)===null||qA===void 0?void 0:qA.pos)===EA.from}),ke=bA.pointers[fe];fe&&ke&&ke.value&&ke.valueEnd&&(Z("pointer found, selecting inner contents of path:",fe,ke),Cn(ke.value.pos+1,ke.valueEnd.pos-1))}}}function oi(){return n0e(_i,{delay:300})}function Yt(){return!!g(X)&&getComputedStyle(g(X)).getPropertyValue("--jse-theme").includes("dark")}function xi(Me){var{path:gA,message:EA,severity:zA}=Me,{line:bA,column:fe,from:ke,to:Xe}=wJ(g(e).escapeValue(g(Ze)),gA);return{path:gA,line:bA,column:fe,from:ke,to:Xe,message:EA,severity:zA,actions:[]}}function Pi(Me,gA){var{line:EA,column:zA,position:bA,message:fe}=Me;return{path:[],line:EA,column:zA,from:bA,to:bA,severity:e0.error,message:fe,actions:gA&&!n()?[{name:"Auto repair",apply:()=>vA()}]:void 0}}function Xt(Me){return{from:Me.from||0,to:Me.to||0,message:Me.message||"",actions:Me.actions,severity:Me.severity}}function L(Me,gA,EA){var zA=$J(Me,d(),u()),bA=!wi(Me,we),fe=we;Z("setCodeMirrorContent",{isChanged:bA,emitChange:gA,forceUpdate:EA}),se&&(bA||EA)&&(we=Me,x(Ze,zA),On(g(Ze),g(le))||se.dispatch({changes:{from:0,to:se.state.doc.length,insert:g(e).escapeValue(g(Ze))}}),Fe(),bA&&gA&&Qr(we,fe))}function ct(Me){return _J(Me)?fA.fromJSON(Me):void 0}function Di(){return mn.apply(this,arguments)}function mn(){return mn=Vt(function*(){Z("refresh"),yield function(){return so.apply(this,arguments)}()}),mn.apply(this,arguments)}function pn(){if(se){var Me=se?g(e).unescapeValue(se.state.doc.toString()):"",gA=Me!==g(Ze);if(Z("onChangeCodeMirrorValue",{isChanged:gA}),gA){var EA=we;x(Ze,Me),we={text:g(Ze)},Fe(),Qr(we,EA),bo(),mr()}}}function so(){return(so=Vt(function*(){if(bo(),se){var Me=Yt();return Z("updateTheme",{dark:Me}),se.dispatch({effects:[We.reconfigure(ai.theme({},{dark:Me}))]}),new Promise(gA=>setTimeout(gA))}return Promise.resolve()})).apply(this,arguments)}function $o(Me){var gA=ju.of(typeof Me=="number"?" ".repeat(Me):Me);return Me===" "?[gA]:[gA,B$e]}qY({onMount:ua,onDestroy:gg,getWindow:()=>i6(g(ue)),hasFocus:()=>z&&document.hasFocus()||RY(g(ue)),onFocus:K(),onBlur:()=>{Fn(),J()()}});var Ao=KE(pn,300);function Fn(){Ao.flush()}function Qr(Me,gA){f()&&f()(Me,gA,{contentErrors:Zi(),patchResult:void 0})}function mr(){k()(zo(g(oe).selection))}function zo(Me){return SA({type:ro.text},Me.toJSON())}function On(Me,gA){return!!Me&&Me.length>bJ&&!gA}var ho=Ce(SJ,!0),sA=Ce(void 0,!0);function _i(){if(On(g(Ze),g(le)))return[];var Me=Zi();if(kde(Me)){var{parseError:gA,isRepairable:EA}=Me;return[Xt(Pi(gA,EA))]}return Gqe(Me)?Me.validationErrors.map(xi).map(Xt):[]}function Zi(){Z("validate:start"),Fn();var Me=Jn(g(e).escapeValue(g(Ze)),h(),u(),B());return kde(Me)?(x(ho,Me.isRepairable?Dde:"invalid"),x(sA,Me.parseError),x(Te,[])):(x(ho,SJ),x(sA,void 0),x(Te,Me?.validationErrors||[])),Z("validate:end"),Me}var Jn=OE(sZe);function Bo(){g(sA)&&function(Me){Z("select parse error",Me);var gA=Pi(Me,!1);Cn(gA.from!=null?gA.from:0,gA.to!=null?gA.to:0),BA()}(g(sA))}var pr={icon:Ioe,text:"Show me",title:"Move to the parse error location",onClick:Bo};Se(()=>F(I()),()=>{x(e,xY({escapeControlCharacters:!1,escapeUnicodeCharacters:I()}))}),Se(()=>F(a()),()=>{L(a(),!1,!1)}),Se(()=>F(c()),()=>{(function(Me){if(_J(Me)){var gA=ct(Me);!se||!gA||g(oe)&&g(oe).selection.eq(gA)||(Z("applyExternalSelection",gA),se.dispatch({selection:gA}))}})(c())}),Se(()=>F(h()),()=>{(function(Me){Z("updateLinter",Me),se&&se.dispatch({effects:PA.reconfigure(oi())})})(h())}),Se(()=>F(d()),()=>{(function(Me){se&&(Z("updateIndentation",Me),se.dispatch({effects:Ye.reconfigure($o(Me))}))})(d())}),Se(()=>F(C()),()=>{(function(Me){se&&(Z("updateTabSize",Me),se.dispatch({effects:Ie.reconfigure(ss.tabSize.of(Me))}))})(C())}),Se(()=>F(n()),()=>{(function(Me){se&&(Z("updateReadOnly",Me),se.dispatch({effects:[JA.reconfigure(ss.readOnly.of(Me))]}))})(n())}),Se(()=>(g(pe),F(I())),()=>{g(pe)!==I()&&(x(pe,I()),Z("forceUpdateText",{escapeUnicodeCharacters:I()}),se&&se.dispatch({changes:{from:0,to:se.state.doc.length,insert:g(e).escapeValue(g(Ze))}}))}),Se(()=>(g(ho),F(n()),b2),()=>{x(i,g(ho)!==Dde||n()?[pr]:[{icon:b2,text:"Auto repair",title:"Automatically repair JSON",onClick:vA},pr])}),Nn(),li(!0);var Mi,Mo=w$e(),wr=ge(Mo),yr=Me=>{var gA=tA(()=>(g(Ze),Be(()=>g(Ze).length===0))),EA=tA(()=>!g(gA)),zA=tA(()=>!g(gA)),bA=tA(()=>!g(gA)),fe=tA(()=>!g(gA));(function(ke,Xe){St(Xe,!1);var qA=Ce(void 0,!0),Gt=N(Xe,"readOnly",9,!1),$t=N(Xe,"onFormat",9),Sn=N(Xe,"onCompact",9),So=N(Xe,"onSort",9),kn=N(Xe,"onTransform",9),on=N(Xe,"onToggleSearch",9),Tt=N(Xe,"onUndo",9),Xi=N(Xe,"onRedo",9),to=N(Xe,"canUndo",9),vt=N(Xe,"canRedo",9),Hn=N(Xe,"canFormat",9),ZA=N(Xe,"canCompact",9),Ri=N(Xe,"canSort",9),Ki=N(Xe,"canTransform",9),io=N(Xe,"onRenderMenu",9),lr={type:"button",icon:o3,title:"Search (Ctrl+F)",className:"jse-search",onClick:on()},ri=Ce(void 0,!0);Se(()=>(F(Gt()),F($t()),F(Hn()),F(Sn()),F(ZA()),F(So()),F(Ri()),F(kn()),F(Ki()),F(Tt()),F(to()),F(Xi()),F(vt())),()=>{x(ri,Gt()?[lr,{type:"space"}]:[{type:"button",icon:r2e,title:"Format JSON: add proper indentation and new lines (Ctrl+I)",className:"jse-format",onClick:$t(),disabled:Gt()||!Hn()},{type:"button",icon:gXe,title:"Compact JSON: remove all white spacing and new lines (Ctrl+Shift+I)",className:"jse-compact",onClick:Sn(),disabled:Gt()||!ZA()},{type:"separator"},{type:"button",icon:n3,title:"Sort",className:"jse-sort",onClick:So(),disabled:Gt()||!Ri()},{type:"button",icon:A3,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:kn(),disabled:Gt()||!Ki()},lr,{type:"separator"},{type:"button",icon:hv,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:Tt(),disabled:!to()},{type:"button",icon:uv,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:Xi(),disabled:!vt()},{type:"space"}])}),Se(()=>(F(io()),g(ri)),()=>{x(qA,io()(g(ri))||g(ri))}),Nn(),li(!0),YM(ke,{get items(){return g(qA)}}),kt()})(Me,{get readOnly(){return n()},onFormat:Ne,onCompact:pA,onSort:Ke,onTransform:wt,onToggleSearch:st,onUndo:nA,onRedo:Bt,get canFormat(){return g(EA)},get canCompact(){return g(zA)},get canSort(){return g(bA)},get canTransform(){return g(fe)},get canUndo(){return F(l()),Be(()=>l().canUndo)},get canRedo(){return F(l()),Be(()=>l().canRedo)},get onRenderMenu(){return O()}})};ze(wr,Me=>{o()&&Me(yr)});var Nr=De(wr,2),Mn=Me=>{var gA=E$e(),EA=De(ge(gA),2),zA=ge(EA),bA=De(EA,2);xA(()=>cg(zA,"width: ".concat(g(Qe)>0?g(Je)/g(Qe)*100:0,"%"))),QA("click",bA,di),he(Me,gA)};ze(Nr,Me=>{g($e)&&Me(Mn)});var wn=De(Nr,2),Ft=Me=>{var gA,EA=m$e(),zA=tA(()=>(g(Ze),g(le),Be(()=>On(g(Ze),g(le))))),bA=Ut(EA);Ho(bA,Gt=>x(X,Gt),()=>g(X));var fe=De(bA,2),ke=Gt=>{var $t=f$e(),Sn=Ut($t),So=tA(()=>(F(sM),F(bJ),g(Ze),Be(()=>"The JSON document is larger than ".concat(sM(bJ),", ")+"and may crash your browser when loading it in text mode. Actual size: ".concat(sM(g(Ze).length),"."))));Sl(Sn,{get icon(){return hC},type:"error",get message(){return g(So)},actions:[{text:"Open anyway",title:"Open the document in text mode. This may freeze or crash your browser.",onClick:Wi},{text:"Open in tree mode",title:"Open the document in tree mode. Tree mode can handle large documents.",onClick:Qn},{text:"Cancel",title:"Cancel opening this large document.",onClick:dn}],onClose:BA});var kn=ge(De(Sn,2));xA(on=>xt(kn,on),[()=>(F(Y2),g(Ze),F(uM),Be(()=>Y2(g(Ze)||"",uM)))],tA),he(Gt,$t)};ze(fe,Gt=>{g(zA)&&Gt(ke)});var Xe=De(fe,2),qA=Gt=>{var $t=Q$e(),Sn=Ut($t),So=to=>{(function(vt,Hn){St(Hn,!1);var ZA=N(Hn,"editorState",8),Ri=Ce(),Ki=Ce(),io=Ce(),lr=Ce(),ri=Ce();Se(()=>F(ZA()),()=>{var Y;x(Ri,(Y=ZA())===null||Y===void 0||(Y=Y.selection)===null||Y===void 0||(Y=Y.main)===null||Y===void 0?void 0:Y.head)}),Se(()=>(g(Ri),F(ZA())),()=>{var Y;x(Ki,g(Ri)!==void 0?(Y=ZA())===null||Y===void 0||(Y=Y.doc)===null||Y===void 0?void 0:Y.lineAt(g(Ri)):void 0)}),Se(()=>g(Ki),()=>{x(io,g(Ki)!==void 0?g(Ki).number:void 0)}),Se(()=>(g(Ki),g(Ri)),()=>{x(lr,g(Ki)!==void 0&&g(Ri)!==void 0?g(Ri)-g(Ki).from+1:void 0)}),Se(()=>F(ZA()),()=>{var Y;x(ri,(Y=ZA())===null||Y===void 0||(Y=Y.selection)===null||Y===void 0||(Y=Y.ranges)===null||Y===void 0?void 0:Y.reduce((ie,ce)=>ie+ce.to-ce.from,0))}),Nn(),li();var fs=I$e(),Eo=ge(fs),Q=Y=>{var ie=g$e(),ce=ge(ie);xA(()=>{var Le;return xt(ce,"Line: ".concat((Le=g(io))!==null&&Le!==void 0?Le:""))}),he(Y,ie)};ze(Eo,Y=>{g(io)!==void 0&&Y(Q)});var D=De(Eo,2),R=Y=>{var ie=d$e(),ce=ge(ie);xA(()=>{var Le;return xt(ce,"Column: ".concat((Le=g(lr))!==null&&Le!==void 0?Le:""))}),he(Y,ie)};ze(D,Y=>{g(lr)!==void 0&&Y(R)});var v=De(D,2),U=Y=>{var ie=C$e(),ce=ge(ie);xA(()=>{var Le;return xt(ce,"Selection: ".concat((Le=g(ri))!==null&&Le!==void 0?Le:""," characters"))}),he(Y,ie)};ze(v,Y=>{g(ri)!==void 0&&g(ri)>0&&Y(U)}),he(vt,fs),kt()})(to,{get editorState(){return g(oe)}})};ze(Sn,to=>{r()&&to(So)});var kn=De(Sn,2),on=to=>{Sl(to,{type:"error",get icon(){return hC},get message(){return g(sA),Be(()=>g(sA).message)},get actions(){return g(i)},onClick:Bo,onClose:BA})};ze(kn,to=>{g(sA)&&to(on)});var Tt=De(kn,2),Xi=to=>{var vt=tA(()=>[{icon:r2e,text:"Format",title:"Format JSON: add proper indentation and new lines (Ctrl+I)",onClick:Ne},{icon:r3,text:"No thanks",title:"Close this message",onClick:()=>x(me,!1)}]);Sl(to,{type:"success",message:"Do you want to format the JSON?",get actions(){return g(vt)},onClose:BA})};ze(Tt,to=>{g(sA),g(me),F(wde),g(Ze),Be(()=>!g(sA)&&g(me)&&wde(g(Ze)))&&to(Xi)}),WY(De(Tt,2),{get validationErrors(){return g(Te)},selectError:HA}),he(Gt,$t)};ze(Xe,Gt=>{g(zA)||Gt(qA)}),xA(Gt=>gA=ci(bA,1,"jse-contents svelte-1pr65po",null,gA,Gt),[()=>({"jse-hidden":g(zA)})],tA),he(Me,EA)},Yn=Me=>{he(Me,p$e())};return ze(wn,Me=>{P?Me(Yn,!1):Me(Ft)}),Ho(Mo,Me=>x(ue,Me),()=>g(ue)),xA(Me=>Mi=ci(Mo,1,"jse-text-mode svelte-1pr65po",null,Mi,Me),[()=>({"no-main-menu":!o()})],tA),he(t,Mo),jt(A,"focus",BA),jt(A,"collapse",_t),jt(A,"expand",G),jt(A,"patch",Ae),jt(A,"handlePatch",de),jt(A,"openTransformModal",Re),jt(A,"refresh",Di),jt(A,"flush",Fn),jt(A,"validate",Zi),kt({focus:BA,collapse:_t,expand:G,patch:Ae,handlePatch:de,openTransformModal:Re,refresh:Di,flush:Fn,validate:Zi})}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-inline-value.svelte-h57m0p { + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + line-height: var(--jse-line-height, calc(1em + 4px)); + border: none; + padding: 0 calc(0.5 * var(--jse-padding, 10px)); + background: transparent; + color: inherit; + cursor: inherit; +} +.jse-inline-value.jse-highlight.svelte-h57m0p { + background-color: var(--jse-search-match-color, #ffe665); + outline: var(--jse-search-match-outline, none); +} +.jse-inline-value.jse-highlight.jse-active.svelte-h57m0p { + background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); + outline: var(--jse-search-match-outline, 2px solid #e0be00); +}`);var D$e=_e('');Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-column-header.svelte-2i3vdx { + background: none; + border: none; + font-family: inherit; + font-size: inherit; + color: inherit; + display: flex; + gap: var(--jse-padding, 10px); + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); + width: 100%; +} +.jse-column-header.svelte-2i3vdx:hover { + background: var(--jse-table-header-background-highlight, #e8e8e8); +} +.jse-column-header.svelte-2i3vdx:not(.jse-column-header.jse-readonly) { + cursor: pointer; +} +.jse-column-header.svelte-2i3vdx span.jse-column-sort-icon:where(.svelte-2i3vdx) { + height: 1em; +}`);var v$e=_e(''),b$e=_e('');Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-table-mode-welcome.svelte-17xl1jx { + flex: 1; + display: flex; + flex-direction: column; + overflow: auto; + align-items: center; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-table-mode-welcome.svelte-17xl1jx:last-child { + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-table-mode-welcome.svelte-17xl1jx .jse-space.jse-before:where(.svelte-17xl1jx) { + flex: 1; +} +.jse-table-mode-welcome.svelte-17xl1jx .jse-nested-arrays:where(.svelte-17xl1jx) { + display: flex; + flex-direction: column; + gap: var(--jse-padding, 10px); + max-width: 400px; + margin: 2em var(--jse-padding, 10px); + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); +} +.jse-table-mode-welcome.svelte-17xl1jx .jse-nested-arrays:where(.svelte-17xl1jx) .jse-nested-arrays-info:where(.svelte-17xl1jx) { + color: var(--jse-panel-color-readonly, #b2b2b2); +} +.jse-table-mode-welcome.svelte-17xl1jx .jse-nested-arrays:where(.svelte-17xl1jx) .jse-nested-property:where(.svelte-17xl1jx) { + display: flex; + align-items: center; + gap: var(--jse-padding, 10px); +} +.jse-table-mode-welcome.svelte-17xl1jx .jse-nested-arrays:where(.svelte-17xl1jx) .jse-nested-property:where(.svelte-17xl1jx) .jse-nested-property-path:where(.svelte-17xl1jx) { + flex: 1; +} +.jse-table-mode-welcome.svelte-17xl1jx .jse-nested-arrays:where(.svelte-17xl1jx) .jse-nested-property:where(.svelte-17xl1jx) .jse-nested-property-path:where(.svelte-17xl1jx) .jse-nested-property-count:where(.svelte-17xl1jx) { + opacity: 0.5; + white-space: nowrap; +} +.jse-table-mode-welcome.svelte-17xl1jx .jse-nested-arrays:where(.svelte-17xl1jx) button.jse-nested-array-action:where(.svelte-17xl1jx) { + text-align: left; + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); + color: var(--jse-button-primary-color, #fff); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-table-mode-welcome.svelte-17xl1jx .jse-nested-arrays:where(.svelte-17xl1jx) button.jse-nested-array-action:where(.svelte-17xl1jx):hover { + background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); +} +.jse-table-mode-welcome.svelte-17xl1jx .jse-nested-arrays:where(.svelte-17xl1jx) button.jse-nested-array-action:where(.svelte-17xl1jx):disabled { + background: var(--jse-button-primary-background-disabled, #9d9d9d); +} +.jse-table-mode-welcome.svelte-17xl1jx .jse-space.jse-after:where(.svelte-17xl1jx) { + flex: 2; +}`);var M$e=(t,A)=>A.onClick(),S$e=_e(`An empty document cannot be opened in table mode. You can go to tree mode instead, or paste + a JSON Array using Ctrl+V.`,1),k$e=(t,A,e)=>A.openJSONEditorModal(g(e)),x$e=(t,A,e)=>A.extractPath(g(e)),_$e=_e(''),R$e=_e('
      '),N$e=(t,A)=>A.onChangeMode(Rr.tree),L$e=_e('
      ');function F$e(t,A){St(A,!0);var e=Oc(()=>A.json?function(h){var B=arguments.length>1&&arguments[1]!==void 0?arguments[1]:2,f=[];return function b(k,S){nr(k)&&S.length{b(k[w],S.concat(w))}),Wo(k)&&f.push(S)}(h,[]),f}(A.json).slice(0,99).filter(h=>h.length>0):[]),i=Oc(()=>!An(g(e))),n=Oc(()=>A.json===void 0&&(A.text===""||A.text===void 0)),o=Oc(()=>g(i)?"Object with nested arrays":g(n)?"An empty document":nr(A.json)?"An object":Wo(A.json)?"An empty array":"A ".concat(kY(A.json,A.parser))),r=L$e();r.__click=[M$e,A];var s=De(ge(r),2),a=ge(s),c=ge(a),l=De(a,2),d=ge(l),C=h=>{he(h,Ss(`An object cannot be opened in table mode. You can open a nested array instead, or open the + document in tree mode.`))},I=(h,B)=>{var f=k=>{he(k,S$e())},b=k=>{var S=Ss();xA(()=>{var w;return xt(S,"".concat((w=g(o))!==null&&w!==void 0?w:""," cannot be opened in table mode. You can open the document in tree mode instead."))}),he(k,S)};ze(h,k=>{g(n)&&!A.readOnly?k(f):k(b,!1)},B)};ze(d,h=>{g(i)?h(C):h(I,!1)});var u=De(l,2);fr(u,17,()=>g(e),Jr,(h,B)=>{var f=R$e(),b=Oc(()=>function(H){return WA(A.json,H).length}(g(B))),k=ge(f),S=ge(k),w=ge(De(S)),_=De(k,2);_.__click=[k$e,A,B];var K=ge(_),J=De(_,2),O=H=>{var V=_$e();V.__click=[x$e,A,B],he(H,V)};ze(J,H=>{A.readOnly||H(O)}),xA(H=>{var V;xt(S,'"'.concat(H??"",'" ')),xt(w,"(".concat((V=g(b))!==null&&V!==void 0?V:""," ").concat(g(b)!==1?"items":"item",")")),xt(K,A.readOnly?"View":"Edit")},[()=>Yc(g(B))]),he(h,f)}),De(u,2).__click=[N$e,A],xA(()=>xt(c,g(o))),he(t,r),kt()}e6(["click"]);Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-column-header.svelte-fzj761 { + background: none; + border: none; + font-family: inherit; + font-size: inherit; + color: inherit; + display: flex; + gap: var(--jse-padding, 10px); + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); + width: 100%; +} +.jse-column-header.svelte-fzj761:hover { + background: var(--jse-table-header-background-highlight, #e8e8e8); +} +.jse-column-header.svelte-fzj761:not(.jse-column-header.jse-readonly) { + cursor: pointer; +}`);var G$e=_e('');Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-table-mode.svelte-u14cgx { + flex: 1; + display: flex; + flex-direction: column; + position: relative; + background: var(--jse-background-color, #fff); + min-width: 0; + min-height: 0; + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + color: var(--jse-text-color, #4d4d4d); + line-height: var(--jse-line-height, calc(1em + 4px)); +} +.jse-table-mode.no-main-menu.svelte-u14cgx { + border-top: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-table-mode.svelte-u14cgx .jse-search-box-container:where(.svelte-u14cgx) { + position: relative; + height: 0; + top: calc(var(--jse-line-height, calc(1em + 4px)) + 2 * var(--jse-padding, 10px)); + margin-right: calc(var(--jse-padding, 10px) + 20px); + margin-left: var(--jse-padding, 10px); + text-align: right; + z-index: 3; +} +.jse-table-mode.svelte-u14cgx .jse-hidden-input-label:where(.svelte-u14cgx) { + position: fixed; + right: 0; + top: 0; + width: 0; + height: 0; +} +.jse-table-mode.svelte-u14cgx .jse-hidden-input-label:where(.svelte-u14cgx) .jse-hidden-input:where(.svelte-u14cgx) { + width: 0; + height: 0; + padding: 0; + border: 0; + outline: none; +} +.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) { + flex: 1; + align-items: flex-start; + flex-direction: column; + display: flex; + overflow: auto; + overflow-anchor: none; + scrollbar-gutter: stable; + border-left: var(--jse-main-border, 1px solid #d7d7d7); + border-right: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx):last-child { + border-bottom: var(--jse-main-border, 1px solid #d7d7d7); +} +.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) { + border-collapse: collapse; + border-spacing: 0; +} +.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-invisible-start-section:where(.svelte-u14cgx) td:where(.svelte-u14cgx), +.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-invisible-end-section:where(.svelte-u14cgx) td:where(.svelte-u14cgx) { + margin: 0; + padding: 0; +} +.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-search-box-background:where(.svelte-u14cgx) { + background: var(--jse-table-header-background, #f5f5f5); +} +.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-invisible-end-section:where(.svelte-u14cgx) td:where(.svelte-u14cgx) { + padding-bottom: var(--jse-padding, 10px); +} +.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx):hover { + background-color: var(--jse-table-row-odd-background, rgba(0, 0, 0, 0.05)); +} +.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell:where(.svelte-u14cgx) { + padding: 0 var(--jse-padding, 10px) 0 0; + vertical-align: top; + white-space: nowrap; + height: var(--jse-line-height, calc(1em + 4px)); +} +.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell.jse-table-cell-header:where(.svelte-u14cgx), .jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell.jse-table-cell-gutter:where(.svelte-u14cgx) { + font-weight: normal; + text-align: left; + color: var(--jse-text-readonly, #8d8d8d); + background: var(--jse-table-header-background, #f5f5f5); +} +.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell.jse-table-cell-header:where(.svelte-u14cgx) { + padding: 0; + position: sticky; + top: 0; +} +.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell.jse-table-cell-header:where(.svelte-u14cgx) .jse-table-root-error:where(.svelte-u14cgx) { + padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); +} +.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell.jse-table-cell-gutter:where(.svelte-u14cgx) { + padding: 0 var(--jse-padding, 10px) 0 calc(0.5 * var(--jse-padding, 10px)); +} +.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell:where(.svelte-u14cgx) .jse-value-outer:where(.svelte-u14cgx) { + display: inline-block; + cursor: var(--jse-contents-cursor, pointer); +} +.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell:where(.svelte-u14cgx) .jse-value-outer:where(.svelte-u14cgx):hover { + background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); +} +.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell:where(.svelte-u14cgx) .jse-value-outer.jse-selected-value:where(.svelte-u14cgx) { + background: var(--jse-selection-background-color, #d3d3d3); +} +.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell:where(.svelte-u14cgx) .jse-context-menu-anchor:where(.svelte-u14cgx) { + display: inline-flex; + position: relative; + vertical-align: top; +} +.jse-table-mode.svelte-u14cgx .jse-contents.jse-contents-loading:where(.svelte-u14cgx) { + align-items: unset; +} +.jse-table-mode.svelte-u14cgx .jse-contents.jse-contents-loading:where(.svelte-u14cgx) .jse-loading-space:where(.svelte-u14cgx) { + flex: 1; +} +.jse-table-mode.svelte-u14cgx .jse-contents.jse-contents-loading:where(.svelte-u14cgx) .jse-loading:where(.svelte-u14cgx) { + flex: 2; + text-align: center; + color: var(--jse-panel-color-readonly, #b2b2b2); + box-sizing: border-box; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); +}`);var K$e=_e('
      '),U$e=_e(''),T$e=_e(''),O$e=_e(' '),J$e=_e('
      '),Y$e=_e('
      '),H$e=_e(''),z$e=_e(''),P$e=_e('
      ',1),j$e=_e(" ",1),V$e=_e(' ',1),q$e=_e('
      loading...
      '),W$e=_e('
      ',1);function Z$e(t,A){St(A,!1);var e=Ce(void 0,!0),i=Ce(void 0,!0),n=Ce(void 0,!0),o=Es("jsoneditor:TableMode"),{openAbsolutePopup:r,closeAbsolutePopup:s}=nI("absolute-popup"),a=Y1e(),c=IC(),l=IC(),d=typeof window>"u";o("isSSR:",d);var C=N(A,"readOnly",9),I=N(A,"externalContent",9),u=N(A,"externalSelection",9),h=N(A,"history",9),B=N(A,"truncateTextSize",9),f=N(A,"mainMenuBar",9),b=N(A,"escapeControlCharacters",9),k=N(A,"escapeUnicodeCharacters",9),S=N(A,"flattenColumns",9),w=N(A,"parser",9),_=N(A,"parseMemoizeOne",9),K=N(A,"validator",9),J=N(A,"validationParser",9),O=N(A,"indentation",9),H=N(A,"onChange",9),V=N(A,"onChangeMode",9),Z=N(A,"onSelect",9),ye=N(A,"onUndo",9),P=N(A,"onRedo",9),se=N(A,"onRenderValue",9),X=N(A,"onRenderMenu",9),ue=N(A,"onRenderContextMenu",9),oe=N(A,"onFocus",9),le=N(A,"onBlur",9),me=N(A,"onSortModal",9),Te=N(A,"onTransformModal",9),$e=N(A,"onJSONEditorModal",9),Je=Ce(void 0,!0),Qe=Ce(void 0,!0),He=Ce(void 0,!0),PA=Ce(void 0,!0),JA=Ce(void 0,!0);qY({onMount:ua,onDestroy:gg,getWindow:()=>i6(g(Qe)),hasFocus:()=>KA&&document.hasFocus()||RY(g(Qe)),onFocus:()=>{di=!0,oe()&&oe()()},onBlur:()=>{di=!1,le()&&le()()}});var Ye,Ie=Ce(void 0,!0),We=Ce(void 0,!0),we=Ce(void 0,!0),Ze=Ce(void 0,!0),Ge=Ce(void 0,!0),LA=Ce(void 0,!0),Fe=Ce(!1,!0),pe=Ce(!1,!0);function Wt(v){x(LA,(Ye=v)?k1e(g(Ie),Ye.items):void 0)}function Qt(v){return BA.apply(this,arguments)}function BA(){return(BA=Vt(function*(v){x(Re,void 0),yield pn(v)})).apply(this,arguments)}function _t(){x(Fe,!1),x(pe,!1),L()}var VA=Ce(1e4,!0),YA=Ce([],!0),Jt=Ce(void 0,!0),KA=!1,di=!1,G=Ce(!1,!0),z=Ce({},!0),Ae=Ce(600,!0),de=Ce(0,!0),Ne=18;function pA(v){x(Re,v)}function vA(v){g(Re)&&v!==void 0&&(Us(v,nh(g(Re)))&&Us(v,It(g(Re)))||(o("clearing selection: path does not exist anymore",g(Re)),x(Re,void 0)))}var Ke=Ce(g(Ie)!==void 0?iY({json:g(Ie)}):void 0,!0),Re=Ce(Yp(u())?u():void 0,!0),wt=Ce(void 0,!0),st=Ce(!1,!0);function nA(v){if(!C()){o("onSortByHeader",v);var U=v.sortDirection===ag.desc?-1:1;oi(V1e(g(Ie),[],v.path,U),(Y,ie)=>({state:ie,sortedColumn:v}))}}ua(()=>{g(Re)&&$o(It(g(Re)))});var Bt=Ce(void 0,!0);function Wi(v){if(v.json!==void 0||v.text!==void 0){var U=g(Ie)!==void 0&&v.json!==void 0;h().add({type:"tree",undo:{patch:U?[{op:"replace",path:"",value:v.json}]:void 0,json:v.json,text:v.text,documentState:v.documentState,textIsRepaired:v.textIsRepaired,selection:xd(v.selection),sortedColumn:v.sortedColumn},redo:{patch:U?[{op:"replace",path:"",value:g(Ie)}]:void 0,json:g(Ie),text:g(We),documentState:g(Ke),textIsRepaired:g(st),selection:xd(g(Re)),sortedColumn:g(wt)}})}}var Qn=Ce([],!0),dn=OE(H1e);function HA(v,U,Y,ie){Yf(()=>{var ce;try{ce=dn(v,U,Y,ie)}catch(Le){ce=[{path:[],message:"Failed to validate: "+Le.message,severity:e0.warning}]}wi(ce,g(Qn))||(o("validationErrors changed:",ce),x(Qn,ce))},ce=>o("validationErrors updated in ".concat(ce," ms")))}function Cn(){return o("validate"),g(we)?{parseError:g(we),isRepairable:!1}:(HA(g(Ie),K(),w(),J()),An(g(Qn))?void 0:{validationErrors:g(Qn)})}function Gi(v,U){if(o("patch",v,U),g(Ie)===void 0)throw new Error("Cannot apply patch: no JSON");var Y=g(Ie),ie={json:void 0,text:g(We),documentState:g(Ke),selection:xd(g(Re)),sortedColumn:g(wt),textIsRepaired:g(st)},ce=S1e(g(Ie),v),Le=B1e(g(Ie),g(Ke),v),CA=GXe(g(wt),v,g(YA)),hA=typeof U=="function"?U(Le.json,Le.documentState,g(Re)):void 0;return x(Ie,hA?.json!==void 0?hA.json:Le.json),x(Ke,hA?.state!==void 0?hA.state:Le.documentState),x(Re,hA?.selection!==void 0?hA.selection:g(Re)),x(wt,hA?.sortedColumn!==void 0?hA.sortedColumn:CA),x(We,void 0),x(st,!1),x(Ze,void 0),x(Ge,void 0),x(we,void 0),h().add({type:"tree",undo:SA({patch:ce},ie),redo:{patch:v,json:void 0,text:void 0,documentState:g(Ke),selection:xd(g(Re)),sortedColumn:g(wt),textIsRepaired:g(st)}}),{json:g(Ie),previousJson:Y,undo:ce,redo:v}}function oi(v,U){o("handlePatch",v,U);var Y={json:g(Ie),text:g(We)},ie=Gi(v,U);return Yt(Y,ie),ie}function Yt(v,U){if((v.json!==void 0||v?.text!==void 0)&&H()){if(g(We)!==void 0){var Y={text:g(We),json:void 0};H()(Y,v,{contentErrors:Cn(),patchResult:U})}else if(g(Ie)!==void 0){var ie={text:void 0,json:g(Ie)};H()(ie,v,{contentErrors:Cn(),patchResult:U})}}}function xi(v){o("pasted json as text",v),x(Ze,v)}function Pi(v){o("pasted multiline text",{pastedText:v}),x(Ge,v)}function Xt(v){var U=parseInt(v[0],10),Y=[String(U+1),...v.slice(1)];return Us(g(Ie),Y)?zi(Y):zi(v)}function L(){o("focus"),g(PA)&&(g(PA).focus(),g(PA).select())}function ct(v){x(de,v.target.scrollTop)}function Di(){g(Re)||x(Re,function(){if(Wo(g(Ie))&&!An(g(Ie))&&!An(g(YA)))return zi(["0",...g(YA)[0]])}())}function mn(){if(g(st)&&g(Ie)!==void 0){var v={json:g(Ie),text:g(We)},U={json:g(Ie),documentState:g(Ke),selection:g(Re),sortedColumn:g(wt),text:g(We),textIsRepaired:g(st)};x(We,void 0),x(st,!1),vA(g(Ie)),Wi(U),Yt(v,void 0)}return{json:g(Ie),text:g(We)}}function pn(v){var{scrollToWhenVisible:U=!0}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},Y=g(Fe)?xp:0,ie=a2e(v,g(YA),z,Ne),ce=ie-g(de)+Y+Ne,Le=Ao(v);if(o("scrollTo",{path:v,top:ie,scrollTop:g(de),elem:Le}),!g(He))return Promise.resolve();var CA=g(He).getBoundingClientRect();if(Le&&!U){var hA=Le.getBoundingClientRect();if(hA.bottom>CA.top&&hA.top{a(Le,{container:g(He),offset:it,duration:300,callback:()=>{so(v),et()}})}:et=>{a(ce,{container:g(He),offset:it,duration:300,callback:()=>{bo(),so(v),et()}})})}function so(v){var U=Ao(v);if(U&&g(He)){var Y=g(He).getBoundingClientRect(),ie=U.getBoundingClientRect();if(ie.right>Y.right){var ce=ie.right-Y.right;vl(He,g(He).scrollLeft+=ce)}if(ie.leftit){var et=ce-it;vl(He,g(He).scrollTop+=et)}if(ieNd(v.slice(1),Le)),ce=ie?v.slice(0,1).concat(ie):v;return(U=(Y=g(He))===null||Y===void 0?void 0:Y.querySelector('td[data-path="'.concat(oM(ce),'"]')))!==null&&U!==void 0?U:void 0}function Fn(v){var U,{anchor:Y,left:ie,top:ce,width:Le,height:CA,offsetTop:hA,offsetLeft:it,showTip:et}=v,RA=function(Ee){var{json:qe,documentState:kA,selection:MA,readOnly:wA,onEditValue:yt,onEditRow:at,onToggleEnforceString:Ni,onCut:Gn,onCopy:$i,onPaste:fo,onRemove:ei,onDuplicateRow:er,onInsertBeforeRow:no,onInsertAfterRow:ko,onRemoveRow:yn}=Ee,Ht=qe!==void 0,sn=!!MA,zt=qe!==void 0&&MA?WA(qe,It(MA)):void 0,Et=Ht&&(Io(MA)||Bs(MA)||fn(MA)),Ei=!wA&&Ht&&MA!==void 0&&EM(MA),Po=Ei&&!sr(zt),Qs=!wA&&Et,Qo=MA!==void 0&&_d(qe,kA,It(MA));return[{type:"separator"},{type:"row",items:[{type:"column",items:[{type:"label",text:"Table cell:"},{type:"dropdown-button",main:{type:"button",onClick:()=>yt(),icon:wu,text:"Edit",title:"Edit the value (Double-click on the value)",disabled:!Ei},width:"11em",items:[{type:"button",icon:wu,text:"Edit",title:"Edit the value (Double-click on the value)",onClick:()=>yt(),disabled:!Ei},{type:"button",icon:Qo?wG:vG,text:"Enforce string",title:"Enforce keeping the value as string when it contains a numeric value",onClick:()=>Ni(),disabled:!Po}]},{type:"dropdown-button",main:{type:"button",onClick:()=>Gn(!0),icon:pu,text:"Cut",title:"Cut selected contents, formatted with indentation (Ctrl+X)",disabled:!Qs},width:"10em",items:[{type:"button",icon:pu,text:"Cut formatted",title:"Cut selected contents, formatted with indentation (Ctrl+X)",onClick:()=>Gn(!0),disabled:wA||!Et},{type:"button",icon:pu,text:"Cut compacted",title:"Cut selected contents, without indentation (Ctrl+Shift+X)",onClick:()=>Gn(!1),disabled:wA||!Et}]},{type:"dropdown-button",main:{type:"button",onClick:()=>$i(!0),icon:M2,text:"Copy",title:"Copy selected contents, formatted with indentation (Ctrl+C)",disabled:!Et},width:"12em",items:[{type:"button",icon:M2,text:"Copy formatted",title:"Copy selected contents, formatted with indentation (Ctrl+C)",onClick:()=>$i(!1),disabled:!Et},{type:"button",icon:M2,text:"Copy compacted",title:"Copy selected contents, without indentation (Ctrl+Shift+C)",onClick:()=>$i(!1),disabled:!Et}]},{type:"button",onClick:()=>fo(),icon:pG,text:"Paste",title:"Paste clipboard contents (Ctrl+V)",disabled:wA||!sn},{type:"button",onClick:()=>ei(),icon:Iv,text:"Remove",title:"Remove selected contents (Delete)",disabled:wA||!Et}]},{type:"column",items:[{type:"label",text:"Table row:"},{type:"button",onClick:()=>at(),icon:wu,text:"Edit row",title:"Edit the current row",disabled:wA||!sn||!Ht},{type:"button",onClick:()=>er(),icon:SG,text:"Duplicate row",title:"Duplicate the current row (Ctrl+D)",disabled:wA||!sn||!Ht},{type:"button",onClick:()=>no(),icon:yu,text:"Insert before",title:"Insert a row before the current row",disabled:wA||!sn||!Ht},{type:"button",onClick:()=>ko(),icon:yu,text:"Insert after",title:"Insert a row after the current row",disabled:wA||!sn||!Ht},{type:"button",onClick:()=>yn(),icon:Iv,text:"Remove row",title:"Remove current row",disabled:wA||!sn||!Ht}]}]}]}({json:g(Ie),documentState:g(Ke),selection:g(Re),readOnly:C(),onEditValue:zo,onEditRow:On,onToggleEnforceString:ho,onCut:yr,onCopy:Mn,onPaste:Zi,onRemove:Ft,onDuplicateRow:Me,onInsertBeforeRow:gA,onInsertAfterRow:EA,onRemoveRow:zA}),jA=(U=ue()(RA))!==null&&U!==void 0?U:RA;if(jA!==!1){var rn={left:ie,top:ce,offsetTop:hA,offsetLeft:it,width:Le,height:CA,anchor:Y,closeOnOuterClick:!0,onClose:()=>{KA=!1,L()}};KA=!0;var j=r(nCe,{tip:et?"Tip: you can open this context menu via right-click or with Ctrl+Q":void 0,items:jA,onRequestClose(){s(j),L()}},rn)}}function Qr(v){if(!us(g(Re)))if(v&&(v.stopPropagation(),v.preventDefault()),v&&v.type==="contextmenu"&&v.target!==g(PA))Fn({left:v.clientX,top:v.clientY,width:z2,height:H2,showTip:!1});else{var U,Y=(U=g(He))===null||U===void 0?void 0:U.querySelector(".jse-table-cell.jse-selected-value");if(Y)Fn({anchor:Y,offsetTop:2,width:z2,height:H2,showTip:!1});else{var ie,ce=(ie=g(He))===null||ie===void 0?void 0:ie.getBoundingClientRect();ce&&Fn({top:ce.top+2,left:ce.left+2,width:z2,height:H2,showTip:!1})}}}function mr(v){Fn({anchor:d1e(v.target,"BUTTON"),offsetTop:0,width:z2,height:H2,showTip:!0})}function zo(){if(!C()&&g(Re)){var v=It(g(Re));sr(WA(g(Ie),v))?Sn(v):x(Re,zi(v))}}function On(){!C()&&g(Re)&&Sn(It(g(Re)).slice(0,1))}function ho(){if(!C()&&fn(g(Re))){var v=g(Re).path,U=pt(v),Y=WA(g(Ie),v),ie=!_d(g(Ie),g(Ke),v),ce=ie?String(Y):rQ(String(Y),w());o("handleToggleEnforceString",{enforceString:ie,value:Y,updatedValue:ce}),oi([{op:"replace",path:U,value:ce}],(Le,CA)=>({state:GM(g(Ie),CA,v,{type:"value",enforceString:ie})}))}}function sA(){return _i.apply(this,arguments)}function _i(){return(_i=Vt(function*(){if(o("apply pasted json",g(Ze)),g(Ze)){var{onPasteAsJson:v}=g(Ze);v(),setTimeout(L)}})).apply(this,arguments)}function Zi(){return Jn.apply(this,arguments)}function Jn(){return(Jn=Vt(function*(){try{ke(yield navigator.clipboard.readText())}catch(v){console.error(v),x(G,!0)}})).apply(this,arguments)}function Bo(){return pr.apply(this,arguments)}function pr(){return(pr=Vt(function*(){o("apply pasted multiline text",g(Ge)),g(Ge)&&(ke(JSON.stringify(g(Ge))),setTimeout(L))})).apply(this,arguments)}function Mi(){o("clear pasted json"),x(Ze,void 0),L()}function Mo(){o("clear pasted multiline text"),x(Ge,void 0),L()}function wr(){V()(Rr.text)}function yr(v){return Nr.apply(this,arguments)}function Nr(){return(Nr=Vt(function*(v){yield X1e({json:g(Ie),selection:g(Re),indentation:v?O():void 0,readOnly:C(),parser:w(),onPatch:oi})})).apply(this,arguments)}function Mn(){return wn.apply(this,arguments)}function wn(){return wn=Vt(function*(){var v=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];g(Ie)!==void 0&&(yield $1e({json:g(Ie),selection:g(Re),indentation:v?O():void 0,parser:w()}))}),wn.apply(this,arguments)}function Ft(){ACe({json:g(Ie),text:g(We),selection:g(Re),keepSelection:!0,readOnly:C(),onChange:H(),onPatch:oi})}function Yn(v){C()||(o("extract",{path:v}),oi(v1e(g(Ie),zi(v))))}function Me(){(function(v){var{json:U,selection:Y,columns:ie,readOnly:ce,onPatch:Le}=v;if(!ce&&U!==void 0&&Y&&Of(Y)){var{rowIndex:CA,columnIndex:hA}=rg(It(Y),ie);Ga("duplicate row",{rowIndex:CA});var it=[String(CA)];Le(D1e(U,[it]),(et,RA)=>({state:RA,selection:zi($u({rowIndex:CA({state:rn,selection:zi($u({rowIndex:it,columnIndex:hA},ie))}))}})({json:g(Ie),selection:g(Re),columns:g(YA),readOnly:C(),onPatch:oi})}function zA(){(function(v){var{json:U,selection:Y,columns:ie,readOnly:ce,onPatch:Le}=v;if(!ce&&U!==void 0&&Y&&Of(Y)){var{rowIndex:CA,columnIndex:hA}=rg(It(Y),ie);Ga("remove row",{rowIndex:CA}),Le(QM([[String(CA)]]),(it,et)=>{var RA=CA0?CA-1:void 0,jA=RA!==void 0?zi($u({rowIndex:RA,columnIndex:hA},ie)):void 0;return Ga("remove row new selection",{rowIndex:CA,newRowIndex:RA,newSelection:jA}),{state:et,selection:jA}})}})({json:g(Ie),selection:g(Re),columns:g(YA),readOnly:C(),onPatch:oi})}function bA(){return(bA=Vt(function*(v){yield tCe({char:v,selectInside:!1,json:g(Ie),selection:g(Re),readOnly:C(),parser:w(),onPatch:oi,onReplaceJson:Xe,onSelect:pA})})).apply(this,arguments)}function fe(v){var U;v.preventDefault(),ke((U=v.clipboardData)===null||U===void 0?void 0:U.getData("text/plain"))}function ke(v){v!==void 0&&eCe({clipboardText:v,json:g(Ie),selection:g(Re),readOnly:C(),parser:w(),onPatch:oi,onChangeText:qA,onPasteMultilineText:Pi,openRepairModal:So})}function Xe(v,U){var Y={json:g(Ie),text:g(We)},ie={json:g(Ie),documentState:g(Ke),selection:g(Re),sortedColumn:g(wt),text:g(We),textIsRepaired:g(st)},ce=Dl(v,g(Ke)),Le=typeof U=="function"?U(v,ce,g(Re)):void 0;x(Ie,Le?.json!==void 0?Le.json:v),x(Ke,Le?.state!==void 0?Le.state:ce),x(Re,Le?.selection!==void 0?Le.selection:g(Re)),x(wt,void 0),x(We,void 0),x(st,!1),x(we,void 0),vA(g(Ie)),Wi(ie),Yt(Y,void 0)}function qA(v,U){o("handleChangeText");var Y={json:g(Ie),text:g(We)},ie={json:g(Ie),documentState:g(Ke),selection:g(Re),sortedColumn:g(wt),text:g(We),textIsRepaired:g(st)};try{x(Ie,_()(v)),x(Ke,Dl(g(Ie),g(Ke))),x(We,void 0),x(st,!1),x(we,void 0)}catch(Le){try{x(Ie,_()(jl(v))),x(Ke,Dl(g(Ie),g(Ke))),x(We,v),x(st,!0),x(we,void 0)}catch{x(Ie,void 0),x(Ke,void 0),x(We,v),x(st,!1),x(we,g(We)!==""?Wf(g(We),Le.message||String(Le)):void 0)}}if(typeof U=="function"){var ce=U(g(Ie),g(Ke),g(Re));x(Ie,ce?.json!==void 0?ce.json:g(Ie)),x(Ke,ce?.state!==void 0?ce.state:g(Ke)),x(Re,ce?.selection!==void 0?ce.selection:g(Re))}vA(g(Ie)),Wi(ie),Yt(Y,void 0)}function Gt(v){o("select validation error",v),x(Re,zi(v.path)),pn(v.path)}function $t(v){if(g(Ie)!==void 0){var{id:U,onTransform:Y,onClose:ie}=v,ce=v.rootPath||[];KA=!0,Te()({id:U||l,json:g(Ie),rootPath:ce||[],onTransform:Le=>{Y?Y({operations:Le,json:g(Ie),transformedJson:Mc(g(Ie),Le)}):(o("onTransform",ce,Le),oi(Le))},onClose:()=>{KA=!1,setTimeout(L),ie&&ie()}})}}function Sn(v){o("openJSONEditorModal",{path:v}),KA=!0,$e()({content:{json:WA(g(Ie),v)},path:v,onPatch:oi,onClose:()=>{KA=!1,setTimeout(L)}})}function So(v,U){x(JA,{text:v,onParse:Y=>t6(Y,ie=>A6(ie,w())),onRepair:i1e,onApply:U,onClose:L})}function kn(){(function(v){C()||g(Ie)===void 0||(KA=!0,me()({id:c,json:g(Ie),rootPath:v,onSort:U=>{var{operations:Y,itemPath:ie,direction:ce}=U;o("onSort",Y,v,ie,ce),oi(Y,(Le,CA)=>({state:CA,sortedColumn:{path:ie,sortDirection:ce===-1?ag.desc:ag.asc}}))},onClose:()=>{KA=!1,setTimeout(L)}}))})([])}function on(){$t({rootPath:[]})}function Tt(v){o("openFind",{findAndReplace:v}),x(Fe,!1),x(pe,!1),bo(),x(Fe,!0),x(pe,v)}function Xi(){if(!C()&&h().canUndo){var v=h().undo();if(BM(v)){var U={json:g(Ie),text:g(We)};x(Ie,v.undo.patch?Mc(g(Ie),v.undo.patch):v.undo.json),x(Ke,v.undo.documentState),x(Re,v.undo.selection),x(wt,v.undo.sortedColumn),x(We,v.undo.text),x(st,v.undo.textIsRepaired),x(we,void 0),o("undo",{item:v,json:g(Ie)}),Yt(U,v.undo.patch&&v.redo.patch?{json:g(Ie),previousJson:U.json,redo:v.undo.patch,undo:v.redo.patch}:void 0),L(),g(Re)&&pn(It(g(Re)),{scrollToWhenVisible:!1})}else ye()(v)}}function to(){if(!C()&&h().canRedo){var v=h().redo();if(BM(v)){var U={json:g(Ie),text:g(We)};x(Ie,v.redo.patch?Mc(g(Ie),v.redo.patch):v.redo.json),x(Ke,v.redo.documentState),x(Re,v.redo.selection),x(wt,v.redo.sortedColumn),x(We,v.redo.text),x(st,v.redo.textIsRepaired),x(we,void 0),o("redo",{item:v,json:g(Ie)}),Yt(U,v.undo.patch&&v.redo.patch?{json:g(Ie),previousJson:U.json,redo:v.redo.patch,undo:v.undo.patch}:void 0),L(),g(Re)&&pn(It(g(Re)),{scrollToWhenVisible:!1})}else P()(v)}}function vt(v){x(Ae,v.getBoundingClientRect().height)}Se(()=>(F(b()),F(k())),()=>{x(Je,xY({escapeControlCharacters:b(),escapeUnicodeCharacters:k()}))}),Se(()=>g(Fe),()=>{(function(v){if(g(He)){var U=v?xp:-100;g(He).scrollTo({top:vl(He,g(He).scrollTop+=U),left:g(He).scrollLeft})}})(g(Fe))}),Se(()=>F(I()),()=>{(function(v){var U={json:g(Ie)},Y=Kp(v)?v.text!==g(We):!wi(U.json,v.json);if(o("update external content",{isChanged:Y}),Y){var ie={json:g(Ie),documentState:g(Ke),selection:g(Re),sortedColumn:g(wt),text:g(We),textIsRepaired:g(st)};if(Kp(v))try{x(Ie,_()(v.text)),x(Ke,Dl(g(Ie),g(Ke))),x(We,v.text),x(st,!1),x(we,void 0)}catch(ce){try{x(Ie,_()(jl(v.text))),x(Ke,Dl(g(Ie),g(Ke))),x(We,v.text),x(st,!0),x(we,void 0)}catch{x(Ie,void 0),x(Ke,void 0),x(We,v.text),x(st,!1),x(we,g(We)!==""?Wf(g(We),ce.message||String(ce)):void 0)}}else x(Ie,v.json),x(Ke,Dl(g(Ie),g(Ke))),x(We,void 0),x(st,!1),x(we,void 0);vA(g(Ie)),x(wt,void 0),Wi(ie)}})(I())}),Se(()=>F(u()),()=>{(function(v){wi(g(Re),v)||(o("applyExternalSelection",{selection:g(Re),externalSelection:v}),Yp(v)&&x(Re,v))})(u())}),Se(()=>(g(YA),g(Ie),F(S()),g(VA)),()=>{x(YA,Wo(g(Ie))?function(v,U){var Y=new Set(U.map(pt)),ie=new Set(v.map(pt));for(var ce of Y)ie.has(ce)||Y.delete(ce);for(var Le of ie)Y.has(Le)||Y.add(Le);return[...Y].map(Sa)}(RXe(g(Ie),S(),g(VA)),g(YA)):[])}),Se(()=>(g(Ie),g(YA)),()=>{x(Jt,!(!g(Ie)||An(g(YA))))}),Se(()=>(g(Ie),g(VA)),()=>{x(e,Array.isArray(g(Ie))&&g(Ie).length>g(VA))}),Se(()=>(g(de),g(Ae),g(Ie),g(Fe),xp),()=>{x(i,NXe(g(de),g(Ae),g(Ie),z,Ne,g(Fe)?xp:0))}),Se(()=>g(Ie),()=>{g(Ie),g(He)&&g(He).scrollTo({top:g(He).scrollTop,left:g(He).scrollLeft})}),Se(()=>g(Re),()=>{var v;v=g(Re),wi(v,u())||(o("onSelect",v),Z()(v))}),Se(()=>(F(C()),F(B()),F(w()),g(Je),g(Ie),g(Ke),F(se())),()=>{x(Bt,{mode:Rr.table,readOnly:C(),truncateTextSize:B(),parser:w(),normalization:g(Je),getJson:()=>g(Ie),getDocumentState:()=>g(Ke),findElement:Ao,findNextInside:Xt,focus:L,onPatch:(v,U)=>oi(function(Y,ie){return Y.flatMap(ce=>{if(bD(ce)){var Le=Sa(ce.path);if(Le.length>0){for(var CA=[ce],hA=Hi(Le);hA.length>0&&!Us(ie,hA);)CA.unshift({op:"add",path:pt(hA),value:{}}),hA=Hi(hA);return CA}}return ce})}(v,g(Ie)),U),onSelect:pA,onFind:Tt,onPasteJson:xi,onRenderValue:se()})}),Se(()=>(g(Ie),F(K()),F(w()),F(J())),()=>{HA(g(Ie),K(),w(),J())}),Se(()=>(g(Qn),g(YA)),()=>{x(n,LXe(g(Qn),g(YA)))}),Nn(),li(!0);var Hn=W$e();QA("mousedown",V2,function(v){!sQ(v.target,U=>U===g(Qe))&&us(g(Re))&&(o("click outside the editor, exit edit mode"),x(Re,xd(g(Re))),di&&g(PA)&&(g(PA).focus(),g(PA).blur()),o("blur (outside editor)"),g(PA)&&g(PA).blur())});var ZA,Ri=Ut(Hn),Ki=ge(Ri),io=v=>{(function(U,Y){St(Y,!1);var ie=N(Y,"containsValidArray",9),ce=N(Y,"readOnly",9),Le=N(Y,"showSearch",13,!1),CA=N(Y,"history",9),hA=N(Y,"onSort",9),it=N(Y,"onTransform",9),et=N(Y,"onContextMenu",9),RA=N(Y,"onUndo",9),jA=N(Y,"onRedo",9),rn=N(Y,"onRenderMenu",9);function j(){Le(!Le())}var Ee=Ce(void 0,!0),qe=Ce(void 0,!0);Se(()=>(F(ce()),F(hA()),F(ie()),F(it()),F(et()),F(RA()),F(CA()),F(jA())),()=>{x(Ee,ce()?[{type:"space"}]:[{type:"button",icon:n3,title:"Sort",className:"jse-sort",onClick:hA(),disabled:ce()||!ie()},{type:"button",icon:A3,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:it(),disabled:ce()||!ie()},{type:"button",icon:o3,title:"Search (Ctrl+F)",className:"jse-search",onClick:j,disabled:!ie()},{type:"button",icon:bG,title:FY,className:"jse-contextmenu",onClick:et()},{type:"separator"},{type:"button",icon:hv,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:RA(),disabled:!CA().canUndo},{type:"button",icon:uv,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:jA(),disabled:!CA().canRedo},{type:"space"}])}),Se(()=>(F(rn()),g(Ee)),()=>{x(qe,rn()(g(Ee))||g(Ee))}),Nn(),li(!0),YM(U,{get items(){return g(qe)}}),kt()})(v,{get containsValidArray(){return g(Jt)},get readOnly(){return C()},get history(){return h()},onSort:kn,onTransform:on,onUndo:Xi,onRedo:to,onContextMenu:mr,get onRenderMenu(){return X()},get showSearch(){return g(Fe)},set showSearch(U){x(Fe,U)},$$legacy:!0})};ze(Ki,v=>{f()&&v(io)});var lr=De(Ki,2),ri=v=>{var U=V$e(),Y=Ut(U),ie=ge(Y);ie.readOnly=!0,Ho(ie,hA=>x(PA,hA),()=>g(PA));var ce=De(Y,2),Le=hA=>{var it=P$e(),et=Ut(it);q1e(ge(et),{get json(){return g(Ie)},get documentState(){return g(Ke)},get parser(){return w()},get showSearch(){return g(Fe)},get showReplace(){return g(pe)},get readOnly(){return C()},get columns(){return g(YA)},onSearch:Wt,onFocus:Qt,onPatch:oi,onClose:_t});var RA=De(et,2),jA=ge(RA),rn=ge(jA),j=ge(rn),Ee=ge(j),qe=ge(Ee),kA=Et=>{var Ei=ar(),Po=tA(()=>(F(Nf),g(n),Be(()=>{var Ar;return Nf([],(Ar=g(n))===null||Ar===void 0?void 0:Ar.root)}))),Qs=Ut(Ei),Qo=Ar=>{var _s=K$e();jf(ge(_s),{get validationError(){return g(Po)},get onExpand(){return sg}}),he(Ar,_s)};ze(Qs,Ar=>{g(Po)&&Ar(Qo)}),he(Et,Ei)};ze(qe,Et=>{F(An),g(n),Be(()=>{var Ei;return!An((Ei=g(n))===null||Ei===void 0?void 0:Ei.root)})&&Et(kA)});var MA=De(Ee);fr(MA,1,()=>g(YA),Jr,(Et,Ei)=>{var Po=U$e();(function(Qs,Qo){St(Qo,!1);var Ar=Ce(void 0,!0),_s=Ce(void 0,!0),jd=Ce(void 0,!0),Vc=N(Qo,"path",9),hg=N(Qo,"sortedColumn",9),p0=N(Qo,"readOnly",9),Bg=N(Qo,"onSort",9);Se(()=>(F(Vc()),Yc),()=>{x(Ar,An(Vc())?"values":Yc(Vc()))}),Se(()=>(F(hg()),F(Vc())),()=>{var yo;x(_s,hg()&&wi(Vc(),(yo=hg())===null||yo===void 0?void 0:yo.path)?hg().sortDirection:void 0)}),Se(()=>(g(_s),vde),()=>{x(jd,g(_s)?vde[g(_s)]:void 0)}),Nn(),li(!0);var Rs,Ns=b$e(),qc=ge(Ns),Vd=ge(qc),Wc=De(qc,2),gr=yo=>{var Dr=v$e(),w0=ge(Dr),kh=tA(()=>(g(_s),F(ag),F(ld),F(DG),Be(()=>g(_s)===ag.asc?ld:DG)));nn(w0,{get data(){return g(kh)}}),xA(()=>Rn(Dr,"title","Currently sorted in ".concat(g(jd)," order"))),he(yo,Dr)};ze(Wc,yo=>{g(_s)!==void 0&&yo(gr)}),xA((yo,Dr)=>{Rs=ci(Ns,1,"jse-column-header svelte-2i3vdx",null,Rs,yo),Rn(Ns,"title",p0()?g(Ar):g(Ar)+" (Click to sort the data by this column)"),xt(Vd,Dr)},[()=>({"jse-readonly":p0()}),()=>(F(Y2),g(Ar),F(50),Be(()=>Y2(g(Ar),50)))],tA),QA("click",Ns,function(){p0()||Bg()({path:Vc(),sortDirection:g(_s)===ag.asc?ag.desc:ag.asc})}),he(Qs,Ns),kt()})(ge(Po),{get path(){return g(Ei)},get sortedColumn(){return g(wt)},get readOnly(){return C()},onSort:nA}),he(Et,Po)});var wA=De(MA),yt=Et=>{var Ei=T$e(),Po=ge(Ei),Qs=tA(()=>(g(Ie),Be(()=>Array.isArray(g(Ie))?g(Ie).length:0)));(function(Qo,Ar){St(Ar,!1);var _s=N(Ar,"count",9),jd=N(Ar,"maxSampleCount",9),Vc=N(Ar,"readOnly",9),hg=N(Ar,"onRefresh",9);li(!0);var p0,Bg=G$e();nn(ge(Bg),{get data(){return moe}}),xA(Rs=>{p0=ci(Bg,1,"jse-column-header svelte-fzj761",null,p0,Rs),Rn(Bg,"title","The Columns are created by sampling ".concat(jd()," items out of ").concat(_s(),". ")+"If you're missing a column, click here to sample all of the items instead of a subset. This is slower.")},[()=>({"jse-readonly":Vc()})],tA),QA("click",Bg,()=>hg()()),he(Qo,Bg),kt()})(Po,{get count(){return g(Qs)},get maxSampleCount(){return g(VA)},get readOnly(){return C()},onRefresh:()=>x(VA,1/0)}),he(Et,Ei)};ze(wA,Et=>{g(e)&&Et(yt)});var at,Ni,Gn=De(j),$i=ge(Gn),fo=De(Gn);fr(fo,1,()=>(g(i),Be(()=>g(i).visibleItems)),Jr,(Et,Ei,Po)=>{var Qs=z$e(),Qo=tA(()=>(g(i),Be(()=>g(i).startIndex+Po))),Ar=tA(()=>(g(n),F(g(Qo)),Be(()=>g(n).rows[g(Qo)]))),_s=tA(()=>(F(Nf),F(g(Qo)),F(g(Ar)),Be(()=>{var Rs;return Nf([String(g(Qo))],(Rs=g(Ar))===null||Rs===void 0?void 0:Rs.row)}))),jd=tA(()=>(F(Sd),g(Ie),g(LA),F(g(Qo)),Be(()=>Sd(g(Ie),g(LA),[String(g(Qo))])))),Vc=ge(Qs);j2e(Vc,()=>g(Qo),Rs=>{var Ns=O$e(),qc=ge(Ns),Vd=De(qc),Wc=gr=>{jf(gr,{get validationError(){return g(_s)},get onExpand(){return sg}})};ze(Vd,gr=>{g(_s)&&gr(Wc)}),Ka(Ns,(gr,yo)=>tM?.(gr,yo),()=>gr=>function(yo,Dr){z[Dr]=yo.getBoundingClientRect().height}(gr,g(Qo))),xA(()=>{var gr;return xt(qc,"".concat((gr=g(Qo))!==null&&gr!==void 0?gr:""," "))}),he(Rs,Ns)});var hg=De(Vc);fr(hg,1,()=>g(YA),Jr,(Rs,Ns,qc,Vd)=>{var Wc,gr=Y$e(),yo=tA(()=>(F(g(Qo)),g(Ns),Be(()=>[String(g(Qo))].concat(g(Ns))))),Dr=tA(()=>(F(WA),g(Ei),g(Ns),Be(()=>WA(g(Ei),g(Ns))))),w0=tA(()=>(F(fn),g(Re),F(Nd),F(g(yo)),Be(()=>fn(g(Re))&&Nd(g(Re).path,g(yo))))),kh=tA(()=>(F(g(Ar)),Be(()=>{var Yr;return(Yr=g(Ar))===null||Yr===void 0?void 0:Yr.columns[qc]}))),xh=tA(()=>(F(Nf),F(g(yo)),F(g(kh)),Be(()=>Nf(g(yo),g(kh))))),FQ=ge(gr),_h=ge(FQ),GQ=Yr=>{var dc=tA(()=>(F(mM),F(Sd),g(Ei),F(g(jd)),g(Ns),Be(()=>mM(Sd(g(Ei),g(jd),g(Ns)))))),KQ=tA(()=>(F(g(dc)),Be(()=>!!g(dc)&&g(dc).some(wI=>wI.active)))),UQ=tA(()=>(F(An),F(g(dc)),Be(()=>!An(g(dc)))));(function(wI,Vs){St(Vs,!1);var TQ=N(Vs,"path",9),iP=N(Vs,"value",9),nP=N(Vs,"parser",9),HEe=N(Vs,"isSelected",9),zEe=N(Vs,"containsSearchResult",9),PEe=N(Vs,"containsActiveSearchResult",9),jEe=N(Vs,"onEdit",9);li(!0);var oP,r8=D$e(),VEe=ge(r8);xA((OQ,qEe)=>{oP=ci(r8,1,"jse-inline-value svelte-h57m0p",null,oP,OQ),xt(VEe,qEe)},[()=>({"jse-selected":HEe(),"jse-highlight":zEe(),"jse-active":PEe()}),()=>(F(Y2),F(nP()),F(iP()),F(50),Be(()=>{var OQ;return Y2((OQ=nP().stringify(iP()))!==null&&OQ!==void 0?OQ:"",50)}))],tA),QA("dblclick",r8,()=>jEe()(TQ())),he(wI,r8),kt()})(Yr,{get path(){return g(yo)},get value(){return g(Dr)},get parser(){return w()},get isSelected(){return g(w0)},get containsSearchResult(){return g(UQ)},get containsActiveSearchResult(){return g(KQ)},onEdit:Sn})},Qk=Yr=>{var dc=tA(()=>(F(Sd),g(Ie),g(LA),F(g(yo)),Be(()=>{var Vs;return(Vs=Sd(g(Ie),g(LA),g(yo)))===null||Vs===void 0?void 0:Vs.searchResults}))),KQ=tA(()=>g(Dr)!==void 0?g(Dr):""),UQ=tA(()=>(F(_d),g(Ie),g(Ke),F(g(yo)),Be(()=>_d(g(Ie),g(Ke),g(yo))))),wI=tA(()=>g(w0)?g(Re):void 0);j1e(Yr,{get path(){return g(yo)},get value(){return g(KQ)},get enforceString(){return g(UQ)},get selection(){return g(wI)},get searchResultItems(){return g(dc)},get context(){return g(Bt)}})};ze(_h,Yr=>{F(sr),F(g(Dr)),Be(()=>sr(g(Dr)))?Yr(GQ):Yr(Qk,!1)});var mk=De(_h),pk=Yr=>{var dc=J$e();OC(ge(dc),{selected:!0,onContextMenu:Fn}),he(Yr,dc)};ze(mk,Yr=>{F(C()),F(g(w0)),F(us),g(Re),Be(()=>!C()&&g(w0)&&!us(g(Re)))&&Yr(pk)});var y0=De(FQ,2),pI=Yr=>{jf(Yr,{get validationError(){return g(xh)},get onExpand(){return sg}})};ze(y0,Yr=>{g(xh)&&Yr(pI)}),xA((Yr,dc)=>{Rn(gr,"data-path",Yr),Wc=ci(FQ,1,"jse-value-outer svelte-u14cgx",null,Wc,dc)},[()=>(F(oM),F(g(yo)),Be(()=>oM(g(yo)))),()=>({"jse-selected-value":g(w0)})],tA),he(Rs,gr)});var p0=De(hg),Bg=Rs=>{he(Rs,H$e())};ze(p0,Rs=>{g(e)&&Rs(Bg)}),he(Et,Qs)});var ei,er=ge(De(fo));Ho(RA,Et=>x(He,Et),()=>g(He)),Ka(RA,(Et,Ei)=>tM?.(Et,Ei),()=>vt),zs(()=>QA("scroll",RA,ct));var no=De(RA,2),ko=Et=>{var Ei=tA(()=>(g(Ze),Be(()=>"You pasted a JSON ".concat(Array.isArray(g(Ze).contents)?"array":"object"," as text")))),Po=tA(()=>[{icon:b2,text:"Paste as JSON instead",title:"Paste the text as JSON instead of a single value",onMouseDown:sA},{text:"Leave as is",title:"Keep the pasted content as a single value",onClick:Mi}]);Sl(Et,{type:"info",get message(){return g(Ei)},get actions(){return g(Po)}})};ze(no,Et=>{g(Ze)&&Et(ko)});var yn=De(no,2),Ht=Et=>{var Ei=tA(()=>[{icon:b2,text:"Paste as string instead",title:"Paste the clipboard data as a single string value instead of an array",onClick:Bo},{text:"Leave as is",title:"Keep the pasted array",onClick:Mo}]);Sl(Et,{type:"info",message:"Multiline text was pasted as array",get actions(){return g(Ei)}})};ze(yn,Et=>{g(Ge)&&Et(Ht)});var sn=De(yn,2),zt=Et=>{var Ei=tA(()=>C()?[]:[{icon:Bv,text:"Ok",title:"Accept the repaired document",onClick:mn},{icon:t3,text:"Repair manually instead",title:"Leave the document unchanged and repair it manually instead",onClick:wr}]);Sl(Et,{type:"success",message:"The loaded JSON document was invalid but is successfully repaired.",get actions(){return g(Ei)},onClose:L})};ze(sn,Et=>{g(st)&&Et(zt)}),WY(De(sn,2),{get validationErrors(){return g(Qn)},selectError:Gt}),xA((Et,Ei,Po)=>{at=ci(Gn,1,"jse-table-invisible-start-section svelte-u14cgx",null,at,Et),Rn($i,"colspan",(g(YA),Be(()=>g(YA).length))),Ni=cg($i,"",Ni,Ei),Rn(er,"colspan",(g(YA),Be(()=>g(YA).length))),ei=cg(er,"",ei,Po)},[()=>({"jse-search-box-background":g(Fe)}),()=>({height:(g(i),Be(()=>g(i).startHeight+"px"))}),()=>({height:(g(i),Be(()=>g(i).endHeight+"px"))})],tA),he(hA,it)},CA=(hA,it)=>{var et=jA=>{var rn=j$e(),j=Ut(rn),Ee=tA(()=>C()?[]:[{icon:t3,text:"Repair manually",title:'Open the document in "code" mode and repair it manually',onClick:wr}]);Sl(j,{type:"error",message:"The loaded JSON document is invalid and could not be repaired automatically.",get actions(){return g(Ee)}}),iCe(De(j,2),{get text(){return g(We)},get json(){return g(Ie)},get indentation(){return O()},get parser(){return w()}}),he(jA,rn)},RA=jA=>{F$e(jA,{get text(){return g(We)},get json(){return g(Ie)},get readOnly(){return C()},get parser(){return w()},openJSONEditorModal:Sn,extractPath:Yn,get onChangeMode(){return V()},onClick:()=>{L()}})};ze(hA,jA=>{g(we)&&g(We)!==void 0&&g(We)!==""?jA(et):jA(RA,!1)},it)};ze(ce,hA=>{g(Jt)?hA(Le):hA(CA,!1)}),QA("paste",ie,fe),he(v,U)},fs=v=>{he(v,q$e())};ze(lr,v=>{d?v(fs,!1):v(ri)}),Ho(Ri,v=>x(Qe,v),()=>g(Qe));var Eo=De(Ri,2),Q=v=>{z1e(v,{onClose:()=>x(G,!1)})};ze(Eo,v=>{g(G)&&v(Q)});var D=De(Eo,2),R=v=>{P1e(v,qC(()=>g(JA),{onClose:()=>{var U;(U=g(JA))===null||U===void 0||U.onClose(),x(JA,void 0)}}))};return ze(D,v=>{g(JA)&&v(R)}),xA(v=>ZA=ci(Ri,1,"jse-table-mode svelte-u14cgx",null,ZA,v),[()=>({"no-main-menu":!f()})],tA),QA("mousedown",Ri,function(v){if(v.buttons===1||v.buttons===2){var U=v.target;U.isContentEditable||L();var Y=C1e(U);if(Y){if(us(g(Re))&&Hp(g(Ie),g(Re),Y))return;x(Re,zi(Y)),v.preventDefault()}}}),QA("keydown",Ri,function(v){var U=X2(v);if(o("keydown",{combo:U,key:v.key}),U==="Ctrl+X"&&(v.preventDefault(),yr(!0)),U==="Ctrl+Shift+X"&&(v.preventDefault(),yr(!1)),U==="Ctrl+C"&&(v.preventDefault(),Mn(!0)),U==="Ctrl+Shift+C"&&(v.preventDefault(),Mn(!1)),U==="Ctrl+D"&&(v.preventDefault(),Me()),U!=="Delete"&&U!=="Backspace"||(v.preventDefault(),Ft()),U==="Insert"&&v.preventDefault(),U==="Ctrl+A"&&v.preventDefault(),U==="Ctrl+Q"&&Qr(v),U==="ArrowLeft"&&(v.preventDefault(),Di(),g(Re))){var Y=function(it,et){var{rowIndex:RA,columnIndex:jA}=rg(It(et),it);return jA>0?zi($u({rowIndex:RA,columnIndex:jA-1},it)):et}(g(YA),g(Re));x(Re,Y),$o(It(Y))}if(U==="ArrowRight"&&(v.preventDefault(),Di(),g(Re))){var ie=function(it,et){var{rowIndex:RA,columnIndex:jA}=rg(It(et),it);return jA0?zi($u({rowIndex:RA-1,columnIndex:jA},it)):et}(g(YA),g(Re));x(Re,ce),$o(It(ce))}if(U==="ArrowDown"&&(v.preventDefault(),Di(),g(Re))){var Le=function(it,et,RA){var{rowIndex:jA,columnIndex:rn}=rg(It(RA),et);return jAx(Je,G)}).get()),Qe=Ce(a());function He(G){if(_de(G)){x(Qe,G.undo.mode);var z=g(Je).items(),Ae=z.findIndex(Ne=>Ne===G),de=Ae!==-1?z[Ae-1]:void 0;$e("handleUndo",{index:Ae,item:G,items:z,prevItem:de}),de&&i(de.redo.selection),K()(g(Qe))}}function PA(G){if(_de(G)){x(Qe,G.redo.mode);var z=g(Je).items(),Ae=z.findIndex(Ne=>Ne===G),de=Ae!==-1?z[Ae+1]:void 0;$e("handleRedo",{index:Ae,item:G,items:z,nextItem:de}),de&&i(de.undo.selection),K()(g(Qe))}}var JA=Ce(),Ye={type:"separator"},Ie=Ce(),We=Ce();function we(G){if(g(le))return g(le).patch(G);if(g(me))return g(me).patch(G);if(g(Te))return g(Te).patch(G);throw new Error('Method patch is not available in mode "'.concat(g(Qe),'"'))}function Ze(G,z){if(g(le))return g(le).expand(G,z);if(g(Te))return g(Te).expand(G,z);throw new Error('Method expand is not available in mode "'.concat(g(Qe),'"'))}function Ge(G,z){if(g(le))return g(le).collapse(G,z);if(g(Te))return g(Te).collapse(G,z);throw new Error('Method collapse is not available in mode "'.concat(g(Qe),'"'))}function LA(G){if(g(Te))g(Te).openTransformModal(G);else if(g(le))g(le).openTransformModal(G);else{if(!g(me))throw new Error('Method transform is not available in mode "'.concat(g(Qe),'"'));g(me).openTransformModal(G)}}function Fe(){if(g(Te))return g(Te).validate();if(g(le))return g(le).validate();if(g(me))return g(me).validate();throw new Error('Method validate is not available in mode "'.concat(g(Qe),'"'))}function pe(){return g(le)?g(le).acceptAutoRepair():e()}function Wt(G){if(g(le))return g(le).scrollTo(G);if(g(me))return g(me).scrollTo(G);throw new Error('Method scrollTo is not available in mode "'.concat(g(Qe),'"'))}function Qt(G){if(g(le))return g(le).findElement(G);if(g(me))return g(me).findElement(G);throw new Error('Method findElement is not available in mode "'.concat(g(Qe),'"'))}function BA(){g(Te)?g(Te).focus():g(le)?g(le).focus():g(me)&&g(me).focus()}function _t(){return VA.apply(this,arguments)}function VA(){return(VA=Vt(function*(){g(Te)&&(yield g(Te).refresh())})).apply(this,arguments)}Se(()=>F(a()),()=>{(function(G){if(G!==g(Qe)){var z={type:"mode",undo:{mode:g(Qe),selection:void 0},redo:{mode:G,selection:void 0}};g(Qe)==="text"&&g(Te)&&g(Te).flush(),$e("add history item",z),g(Je).add(z),x(Qe,G)}})(a())}),Se(()=>(g(Qe),F(K())),()=>{x(JA,[{type:"button",text:"text",title:"Switch to text mode (current mode: ".concat(g(Qe),")"),className:"jse-group-button jse-first"+(g(Qe)===Rr.text?" jse-selected":""),onClick:()=>K()(Rr.text)},{type:"button",text:"tree",title:"Switch to tree mode (current mode: ".concat(g(Qe),")"),className:"jse-group-button "+(g(Qe)===Rr.tree?" jse-selected":""),onClick:()=>K()(Rr.tree)},{type:"button",text:"table",title:"Switch to table mode (current mode: ".concat(g(Qe),")"),className:"jse-group-button jse-last"+(g(Qe)===Rr.table?" jse-selected":""),onClick:()=>K()(Rr.table)}])}),Se(()=>(g(JA),F(V()),g(Qe),F(w()),F(n())),()=>{x(Ie,G=>{var z=tY(G[0])?g(JA).concat(G):g(JA).concat(Ye,G),Ae=Zm(z);return V()(z,{mode:g(Qe),modal:w(),readOnly:n()})||Ae})}),Se(()=>(F(Z()),g(Qe),F(w()),F(n()),F(i())),()=>{x(We,G=>{var z,Ae=Zm(G);return(z=Z()(G,{mode:g(Qe),modal:w(),readOnly:n(),selection:i()}))!==null&&z!==void 0?z:!n()&&Ae})}),Nn(),li();var YA=ar(),Jt=Ut(YA),KA=G=>{Ho(y$e(G,{get externalContent(){return e()},get externalSelection(){return i()},get history(){return g(Je)},get readOnly(){return n()},get indentation(){return o()},get tabSize(){return r()},get mainMenuBar(){return c()},get statusBar(){return d()},get askToFormat(){return C()},get escapeUnicodeCharacters(){return u()},get parser(){return B()},get validator(){return b()},get validationParser(){return k()},get onChange(){return _()},get onChangeMode(){return K()},get onSelect(){return J()},onUndo:He,onRedo:PA,get onError(){return ye()},get onFocus(){return P()},get onBlur(){return se()},get onRenderMenu(){return g(Ie)},get onSortModal(){return X()},get onTransformModal(){return ue()},$$legacy:!0}),z=>x(Te,z),()=>g(Te))},di=(G,z)=>{var Ae=Ne=>{Ho(Z$e(Ne,{get externalContent(){return e()},get externalSelection(){return i()},get history(){return g(Je)},get readOnly(){return n()},get truncateTextSize(){return s()},get mainMenuBar(){return c()},get escapeControlCharacters(){return I()},get escapeUnicodeCharacters(){return u()},get flattenColumns(){return h()},get parser(){return B()},get parseMemoizeOne(){return f()},get validator(){return b()},get validationParser(){return k()},get indentation(){return o()},get onChange(){return _()},get onChangeMode(){return K()},get onSelect(){return J()},onUndo:He,onRedo:PA,get onRenderValue(){return O()},get onFocus(){return P()},get onBlur(){return se()},get onRenderMenu(){return g(Ie)},get onRenderContextMenu(){return g(We)},get onSortModal(){return X()},get onTransformModal(){return ue()},get onJSONEditorModal(){return oe()},$$legacy:!0}),pA=>x(me,pA),()=>g(me))},de=Ne=>{Ho(fY(Ne,{get externalContent(){return e()},get externalSelection(){return i()},get history(){return g(Je)},get readOnly(){return n()},get indentation(){return o()},get truncateTextSize(){return s()},get mainMenuBar(){return c()},get navigationBar(){return l()},get escapeControlCharacters(){return I()},get escapeUnicodeCharacters(){return u()},get parser(){return B()},get parseMemoizeOne(){return f()},get validator(){return b()},get validationParser(){return k()},get pathParser(){return S()},get onError(){return ye()},get onChange(){return _()},get onChangeMode(){return K()},get onSelect(){return J()},onUndo:He,onRedo:PA,get onRenderValue(){return O()},get onClassName(){return H()},get onFocus(){return P()},get onBlur(){return se()},get onRenderMenu(){return g(Ie)},get onRenderContextMenu(){return g(We)},get onSortModal(){return X()},get onTransformModal(){return ue()},get onJSONEditorModal(){return oe()},$$legacy:!0}),pA=>x(le,pA),()=>g(le))};ze(G,Ne=>{g(Qe),F(Rr),Be(()=>g(Qe)===Rr.table)?Ne(Ae):Ne(de,!1)},z)};return ze(Jt,G=>{g(Qe),F(Rr),Be(()=>g(Qe)===Rr.text||String(g(Qe))==="code")?G(KA):G(di,!1)}),he(t,YA),jt(A,"patch",we),jt(A,"expand",Ze),jt(A,"collapse",Ge),jt(A,"transform",LA),jt(A,"validate",Fe),jt(A,"acceptAutoRepair",pe),jt(A,"scrollTo",Wt),jt(A,"findElement",Qt),jt(A,"focus",BA),jt(A,"refresh",_t),kt({patch:we,expand:Ze,collapse:Ge,transform:LA,validate:Fe,acceptAutoRepair:pe,scrollTo:Wt,findElement:Qt,focus:BA,refresh:_t})}Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-modal-wrapper.svelte-v0el4e { + flex: 1; + display: flex; + min-width: 0; + min-height: 0; + flex-direction: column; +} +.jse-modal-wrapper.svelte-v0el4e .jse-modal-contents:where(.svelte-v0el4e) { + flex: 1; + display: flex; + flex-direction: column; + padding: 20px; + overflow: auto; + min-width: 0; + min-height: 0; +} +.jse-modal-wrapper.svelte-v0el4e .jse-modal-contents:where(.svelte-v0el4e) .jse-actions:where(.svelte-v0el4e) { + display: flex; + flex-direction: row; + justify-content: flex-end; + padding-top: var(--jse-padding, 10px); +} +.jse-modal-wrapper.svelte-v0el4e .jse-modal-contents:where(.svelte-v0el4e) .jse-actions:where(.svelte-v0el4e) button.jse-primary:where(.svelte-v0el4e) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); + color: var(--jse-button-primary-color, #fff); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-modal-wrapper.svelte-v0el4e .jse-modal-contents:where(.svelte-v0el4e) .jse-actions:where(.svelte-v0el4e) button.jse-primary:where(.svelte-v0el4e):hover { + background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); +} +.jse-modal-wrapper.svelte-v0el4e .jse-modal-contents:where(.svelte-v0el4e) .jse-actions:where(.svelte-v0el4e) button.jse-primary:where(.svelte-v0el4e):disabled { + background: var(--jse-button-primary-background-disabled, #9d9d9d); +} +.jse-modal-wrapper.svelte-v0el4e .jse-modal-contents:where(.svelte-v0el4e) .jse-label:where(.svelte-v0el4e) { + font-weight: bold; + display: block; + box-sizing: border-box; +} +.jse-modal-wrapper.svelte-v0el4e .jse-modal-contents:where(.svelte-v0el4e) .jse-label:where(.svelte-v0el4e) .jse-label-inner:where(.svelte-v0el4e) { + margin-top: calc(2 * var(--jse-padding, 10px)); + margin-bottom: calc(0.5 * var(--jse-padding, 10px)); + box-sizing: border-box; +} +.jse-modal-wrapper.svelte-v0el4e .jse-modal-contents:where(.svelte-v0el4e) .jse-modal-inline-editor:where(.svelte-v0el4e) { + flex: 1; + min-height: 150px; + min-width: 0; + max-width: 100%; + display: flex; + --jse-theme-color: var(--jse-modal-editor-theme-color, #707070); + --jse-theme-color-highlight: var(--jse-modal-editor-theme-color-highlight, #646464); +} +.jse-modal-wrapper.svelte-v0el4e .jse-actions:where(.svelte-v0el4e) { + gap: var(--jse-padding, 10px); + align-items: center; +} +.jse-modal-wrapper.svelte-v0el4e .jse-actions:where(.svelte-v0el4e) .jse-error:where(.svelte-v0el4e) { + flex: 1; + color: var(--jse-error-color, #ee5341); +} +.jse-modal-wrapper.svelte-v0el4e .jse-actions:where(.svelte-v0el4e) button.jse-secondary:where(.svelte-v0el4e) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-secondary-background, #d3d3d3); + color: var(--jse-button-secondary-color, var(--jse-text-color, #4d4d4d)); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-modal-wrapper.svelte-v0el4e .jse-actions:where(.svelte-v0el4e) button.jse-secondary:where(.svelte-v0el4e):hover { + background: var(--jse-button-secondary-background-highlight, #e1e1e1); +} +.jse-modal-wrapper.svelte-v0el4e .jse-actions:where(.svelte-v0el4e) button.jse-secondary:where(.svelte-v0el4e):disabled { + background: var(--jse-button-secondary-background-disabled, #9d9d9d); +} +.jse-modal-wrapper.svelte-v0el4e input:where(.svelte-v0el4e) { + border: var(--jse-input-border, 1px solid #d8dbdf); + outline: none; + box-sizing: border-box; + padding: calc(0.5 * var(--jse-padding, 10px)); + font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); + font-size: var(--jse-font-size-mono, 14px); + color: inherit; + background: var(--jse-input-background, var(--jse-background-color, #fff)); +} +.jse-modal-wrapper.svelte-v0el4e input:where(.svelte-v0el4e):focus { + border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); +} +.jse-modal-wrapper.svelte-v0el4e input:where(.svelte-v0el4e):read-only { + background: var(--jse-input-background-readonly, transparent); +}`);var X$e=_e('
      '),$$e=_e(''),eeA=_e(''),AeA=_e(''),teA=_e('
      Path
      Contents
      ',1),ieA=_e('
      '),neA={};Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-modal-contents.svelte-1v9c92j { + flex: 1; + display: flex; + flex-direction: column; + padding: 20px; + overflow: auto; + min-width: 0; + min-height: 0; +} +.jse-modal-contents.svelte-1v9c92j .jse-actions:where(.svelte-1v9c92j) { + display: flex; + flex-direction: row; + justify-content: flex-end; + padding-top: var(--jse-padding, 10px); +} +.jse-modal-contents.svelte-1v9c92j .jse-actions:where(.svelte-1v9c92j) button.jse-primary:where(.svelte-1v9c92j) { + border: none; + background: transparent; + color: inherit; + cursor: pointer; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + padding: 5px; + margin: 0; + background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); + color: var(--jse-button-primary-color, #fff); + padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); + border-radius: 3px; +} +.jse-modal-contents.svelte-1v9c92j .jse-actions:where(.svelte-1v9c92j) button.jse-primary:where(.svelte-1v9c92j):hover { + background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); +} +.jse-modal-contents.svelte-1v9c92j .jse-actions:where(.svelte-1v9c92j) button.jse-primary:where(.svelte-1v9c92j):disabled { + background: var(--jse-button-primary-background-disabled, #9d9d9d); +} +.jse-modal-contents.svelte-1v9c92j table:where(.svelte-1v9c92j) { + width: 100%; + border-collapse: collapse; + border-spacing: 0; +} +.jse-modal-contents.svelte-1v9c92j table:where(.svelte-1v9c92j) th:where(.svelte-1v9c92j), +.jse-modal-contents.svelte-1v9c92j table:where(.svelte-1v9c92j) td:where(.svelte-1v9c92j) { + text-align: left; + vertical-align: middle; + font-weight: normal; + padding-bottom: var(--jse-padding, 10px); +} +.jse-modal-contents.svelte-1v9c92j input.jse-path:where(.svelte-1v9c92j) { + width: 100%; + box-sizing: border-box; + padding: 5px 10px; + border: var(--jse-input-border, 1px solid #d8dbdf); + border-radius: var(--jse-input-radius, 3px); + font-family: inherit; + font-size: inherit; + background: inherit; + background: var(--jse-input-background-readonly, transparent); + color: inherit; + outline: none; +} +.jse-modal-contents.svelte-1v9c92j .svelte-select input { + box-sizing: border-box; +} +.jse-modal-contents.svelte-1v9c92j .jse-space:where(.svelte-1v9c92j) { + height: 200px; +} +.jse-modal-contents.svelte-1v9c92j .jse-space:where(.svelte-1v9c92j) .jse-error:where(.svelte-1v9c92j) { + color: var(--jse-error-color, #ee5341); +}`);var Ff=LM(()=>neA),oeA=_e('Property'),reA=_e('
      '),seA=_e('
      Path
      Direction
      ',1);Zt(`/* over all fonts, sizes, and colors */ +/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ +/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ +/* main, menu, modal */ +/* jsoneditor modal */ +/* tooltip in text mode */ +/* panels: navigation bar, gutter, search box */ +/* navigation-bar */ +/* context menu */ +/* contents: json key and values */ +/* contents: selected or hovered */ +/* contents: section of collapsed items in an array */ +/* contents: highlighting of search matches */ +/* contents: inline tags inside the JSON document */ +/* contents: table */ +/* controls in modals: inputs, buttons, and \`a\` */ +/* messages */ +/* svelte-select */ +/* color picker */ +.jse-main.svelte-57bmz4 { + width: 100%; + height: 100%; + min-width: 0; + min-height: 150px; + font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); + font-size: var(--jse-font-size, 16px); + line-height: normal; + position: relative; + display: flex; + flex-direction: row; +} +.jse-main.svelte-57bmz4:not(.jse-focus) { + --jse-selection-background-color: var(--jse-selection-background-inactive-color, #e8e8e8); + --jse-context-menu-pointer-background: var(--jse-context-menu-pointer-hover-background, #b2b2b2); +}`);var aeA=_e('
      ',1);function ceA(t,A){St(A,!1);var e=Ce(void 0,!0),i=Es("jsoneditor:JSONEditor"),n={text:""},o=void 0,r=!1,s=Rr.tree,a=!0,c=!0,l=!0,d=!0,C=!1,I=!1,u=!0,h=JSON,B=void 0,f=JSON,b={parse:iWe,stringify:Yc},k=[pqe],S=k[0].id,w=sg,_=void 0,K=void 0,J=tWe,O=sg,H=sg,V=sg,Z=sg,ye=sA=>{console.error(sA),alert(sA.toString())},P=sg,se=sg,X=N(A,"content",13,n),ue=N(A,"selection",13,o),oe=N(A,"readOnly",13,r),le=N(A,"indentation",13,2),me=N(A,"tabSize",13,4),Te=N(A,"truncateTextSize",13,1e3),$e=N(A,"mode",13,s),Je=N(A,"mainMenuBar",13,a),Qe=N(A,"navigationBar",13,c),He=N(A,"statusBar",13,l),PA=N(A,"askToFormat",13,d),JA=N(A,"escapeControlCharacters",13,C),Ye=N(A,"escapeUnicodeCharacters",13,I),Ie=N(A,"flattenColumns",13,u),We=N(A,"parser",13,h),we=N(A,"validator",13,B),Ze=N(A,"validationParser",13,f),Ge=N(A,"pathParser",13,b),LA=N(A,"queryLanguages",13,k),Fe=N(A,"queryLanguageId",13,S),pe=N(A,"onChangeQueryLanguage",13,w),Wt=N(A,"onChange",13,_),Qt=N(A,"onSelect",13,K),BA=N(A,"onRenderValue",13,J),_t=N(A,"onClassName",13,O),VA=N(A,"onRenderMenu",13,H),YA=N(A,"onRenderContextMenu",13,V),Jt=N(A,"onChangeMode",13,Z),KA=N(A,"onError",13,ye),di=N(A,"onFocus",13,P),G=N(A,"onBlur",13,se),z=Ce(Tf(),!0),Ae=Ce(!1,!0),de=Ce(void 0,!0),Ne=Ce(void 0,!0),pA=Ce(void 0,!0),vA=Ce(void 0,!0),Ke=Ce(We(),!0);function Re(){return X()}function wt(sA){i("set");var _i=yJ(sA);if(_i)throw new Error(_i);x(z,Tf()),X(sA),bo()}function st(sA){i("update");var _i=yJ(sA);if(_i)throw new Error(_i);X(sA),bo()}function nA(sA){var _i=g(de).patch(sA);return bo(),_i}function Bt(sA){ue(sA),bo()}function Wi(sA,_i){g(de).expand(sA,_i),bo()}function Qn(sA){var _i=arguments.length>1&&arguments[1]!==void 0&&arguments[1];g(de).collapse(sA,_i),bo()}function dn(){var sA=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};g(de).transform(sA),bo()}function HA(){return g(de).validate()}function Cn(){var sA=g(de).acceptAutoRepair();return bo(),sA}function Gi(sA){return oi.apply(this,arguments)}function oi(){return(oi=Vt(function*(sA){yield g(de).scrollTo(sA)})).apply(this,arguments)}function Yt(sA){return g(de).findElement(sA)}function xi(){g(de).focus(),bo()}function Pi(){return Xt.apply(this,arguments)}function Xt(){return(Xt=Vt(function*(){yield g(de).refresh()})).apply(this,arguments)}function L(sA){var _i,Zi,Jn,Bo,pr,Mi,Mo,wr,yr,Nr,Mn,wn,Ft,Yn,Me,gA,EA,zA,bA,fe,ke,Xe,qA,Gt,$t,Sn,So,kn,on,Tt,Xi,to=Object.keys(sA);for(var vt of to)switch(vt){case"content":X((_i=sA[vt])!==null&&_i!==void 0?_i:n);break;case"selection":ue((Zi=sA[vt])!==null&&Zi!==void 0?Zi:o);break;case"readOnly":oe((Jn=sA[vt])!==null&&Jn!==void 0?Jn:r);break;case"indentation":le((Bo=sA[vt])!==null&&Bo!==void 0?Bo:2);break;case"tabSize":me((pr=sA[vt])!==null&&pr!==void 0?pr:4);break;case"truncateTextSize":Te((Mi=sA[vt])!==null&&Mi!==void 0?Mi:1e3);break;case"mode":$e((Mo=sA[vt])!==null&&Mo!==void 0?Mo:s);break;case"mainMenuBar":Je((wr=sA[vt])!==null&&wr!==void 0?wr:a);break;case"navigationBar":Qe((yr=sA[vt])!==null&&yr!==void 0?yr:c);break;case"statusBar":He((Nr=sA[vt])!==null&&Nr!==void 0?Nr:l);break;case"askToFormat":PA((Mn=sA[vt])!==null&&Mn!==void 0?Mn:d);break;case"escapeControlCharacters":JA((wn=sA[vt])!==null&&wn!==void 0?wn:C);break;case"escapeUnicodeCharacters":Ye((Ft=sA[vt])!==null&&Ft!==void 0?Ft:I);break;case"flattenColumns":Ie((Yn=sA[vt])!==null&&Yn!==void 0?Yn:u);break;case"parser":We((Me=sA[vt])!==null&&Me!==void 0?Me:h);break;case"validator":we((gA=sA[vt])!==null&&gA!==void 0?gA:B);break;case"validationParser":Ze((EA=sA[vt])!==null&&EA!==void 0?EA:f);break;case"pathParser":Ge((zA=sA[vt])!==null&&zA!==void 0?zA:b);break;case"queryLanguages":LA((bA=sA[vt])!==null&&bA!==void 0?bA:k);break;case"queryLanguageId":Fe((fe=sA[vt])!==null&&fe!==void 0?fe:S);break;case"onChangeQueryLanguage":pe((ke=sA[vt])!==null&&ke!==void 0?ke:w);break;case"onChange":Wt((Xe=sA[vt])!==null&&Xe!==void 0?Xe:_);break;case"onRenderValue":BA((qA=sA[vt])!==null&&qA!==void 0?qA:J);break;case"onClassName":_t((Gt=sA[vt])!==null&&Gt!==void 0?Gt:O);break;case"onRenderMenu":VA(($t=sA[vt])!==null&&$t!==void 0?$t:H);break;case"onRenderContextMenu":YA((Sn=sA[vt])!==null&&Sn!==void 0?Sn:V);break;case"onChangeMode":Jt((So=sA[vt])!==null&&So!==void 0?So:Z);break;case"onSelect":Qt((kn=sA[vt])!==null&&kn!==void 0?kn:K);break;case"onError":KA((on=sA[vt])!==null&&on!==void 0?on:ye);break;case"onFocus":di((Tt=sA[vt])!==null&&Tt!==void 0?Tt:P);break;case"onBlur":G((Xi=sA[vt])!==null&&Xi!==void 0?Xi:se);break;default:Hn(vt)}function Hn(ZA){i('Unknown property "'.concat(ZA,'"'))}LA().some(ZA=>ZA.id===Fe())||Fe(LA()[0].id),bo()}function ct(){return Di.apply(this,arguments)}function Di(){return(Di=Vt(function*(){throw new Error("class method destroy() is deprecated. It is replaced with a method destroy() in the vanilla library.")})).apply(this,arguments)}function mn(sA,_i,Zi){X(sA),Wt()&&Wt()(sA,_i,Zi)}function pn(sA){ue(sA),Qt()&&Qt()(Zm(sA))}function so(){x(Ae,!0),di()&&di()()}function $o(){x(Ae,!1),G()&&G()()}function Ao(sA){return Fn.apply(this,arguments)}function Fn(){return(Fn=Vt(function*(sA){$e()!==sA&&($e(sA),bo(),xi(),Jt()(sA))})).apply(this,arguments)}function Qr(sA){i("handleChangeQueryLanguage",sA),Fe(sA),pe()(sA)}function mr(sA){var{id:_i,json:Zi,rootPath:Jn,onTransform:Bo,onClose:pr}=sA;oe()||x(vA,{id:_i,json:Zi,rootPath:Jn,indentation:le(),truncateTextSize:Te(),escapeControlCharacters:JA(),escapeUnicodeCharacters:Ye(),parser:We(),parseMemoizeOne:g(e),validationParser:Ze(),pathParser:Ge(),queryLanguages:LA(),queryLanguageId:Fe(),onChangeQueryLanguage:Qr,onRenderValue:BA(),onRenderMenu:Mi=>VA()(Mi,{mode:$e(),modal:!0,readOnly:oe()}),onRenderContextMenu:Mi=>YA()(Mi,{mode:$e(),modal:!0,readOnly:oe(),selection:ue()}),onClassName:_t(),onTransform:Bo,onClose:pr})}function zo(sA){oe()||x(pA,sA)}function On(sA){var{content:_i,path:Zi,onPatch:Jn,onClose:Bo}=sA;i("onJSONEditorModal",{content:_i,path:Zi}),x(Ne,{content:_i,path:Zi,onPatch:Jn,readOnly:oe(),indentation:le(),tabSize:me(),truncateTextSize:Te(),mainMenuBar:Je(),navigationBar:Qe(),statusBar:He(),askToFormat:PA(),escapeControlCharacters:JA(),escapeUnicodeCharacters:Ye(),flattenColumns:Ie(),parser:We(),validator:void 0,validationParser:Ze(),pathParser:Ge(),onRenderValue:BA(),onClassName:_t(),onRenderMenu:VA(),onRenderContextMenu:YA(),onSortModal:zo,onTransformModal:mr,onClose:Bo})}function ho(sA){sA.stopPropagation()}return Se(()=>(F(We()),g(Ke),F(X()),Tf),()=>{if(!o1e(We(),g(Ke))){if(i("parser changed, recreate editor"),Up(X())){var sA=g(Ke).stringify(X().json);X({json:sA!==void 0?We().parse(sA):void 0})}x(Ke,We()),x(z,Tf())}}),Se(()=>F(X()),()=>{var sA=yJ(X());sA&&console.error("Error: "+sA)}),Se(()=>F(ue()),()=>{ue()===null&&console.warn("selection is invalid: it is null but should be undefined")}),Se(()=>F(We()),()=>{x(e,OE(We().parse))}),Se(()=>F($e()),()=>{i("mode changed to",$e())}),Nn(),li(!0),eY(t,{children:(sA,_i)=>{var Zi,Jn=aeA(),Bo=Ut(Jn);j2e(ge(Bo),()=>g(z),Mn=>{Ho(l2e(Mn,{get externalMode(){return $e()},get content(){return X()},get selection(){return ue()},get readOnly(){return oe()},get indentation(){return le()},get tabSize(){return me()},get truncateTextSize(){return Te()},get statusBar(){return He()},get askToFormat(){return PA()},get mainMenuBar(){return Je()},get navigationBar(){return Qe()},get escapeControlCharacters(){return JA()},get escapeUnicodeCharacters(){return Ye()},get flattenColumns(){return Ie()},get parser(){return We()},get parseMemoizeOne(){return g(e)},get validator(){return we()},get validationParser(){return Ze()},get pathParser(){return Ge()},insideModal:!1,get onError(){return KA()},onChange:mn,onChangeMode:Ao,onSelect:pn,get onRenderValue(){return BA()},get onClassName(){return _t()},onFocus:so,onBlur:$o,get onRenderMenu(){return VA()},get onRenderContextMenu(){return YA()},onSortModal:zo,onTransformModal:mr,onJSONEditorModal:On,$$legacy:!0}),wn=>x(de,wn),()=>g(de))});var pr=De(Bo,2),Mi=Mn=>{(function(wn,Ft){var Yn,Me;St(Ft,!1);var gA=Ce(void 0,!0),EA=Ce(void 0,!0),zA=Ce(void 0,!0),bA=Ce(void 0,!0),fe=Es("jsoneditor:SortModal"),ke=N(Ft,"id",9),Xe=N(Ft,"json",9),qA=N(Ft,"rootPath",9),Gt=N(Ft,"onSort",9),$t=N(Ft,"onClose",9),Sn={value:1,label:"ascending"},So=[Sn,{value:-1,label:"descending"}],kn="".concat(ke(),":").concat(pt(qA())),on=Ce((Yn=Ff()[kn])===null||Yn===void 0?void 0:Yn.selectedProperty,!0),Tt=Ce(((Me=Ff()[kn])===null||Me===void 0?void 0:Me.selectedDirection)||Sn,!0),Xi=Ce(void 0,!0);function to(){try{var Hn,ZA,Ri;x(Xi,void 0);var Ki=((Hn=g(on))===null||Hn===void 0?void 0:Hn.value)||((ZA=g(bA))===null||ZA===void 0||(ZA=ZA[0])===null||ZA===void 0?void 0:ZA.value)||[],io=(Ri=g(Tt))===null||Ri===void 0?void 0:Ri.value,lr=V1e(Xe(),qA(),Ki,io);Gt()!==void 0&&qA()!==void 0&&Gt()({operations:lr,rootPath:qA(),itemPath:Ki,direction:io}),$t()()}catch(ri){x(Xi,String(ri))}}function vt(Hn){Hn.focus()}Se(()=>(F(Xe()),F(qA())),()=>{x(gA,WA(Xe(),qA()))}),Se(()=>g(gA),()=>{x(EA,Array.isArray(g(gA)))}),Se(()=>(g(EA),g(gA)),()=>{x(zA,g(EA)?XJ(g(gA)):void 0)}),Se(()=>(g(zA),YC),()=>{x(bA,g(zA)?g(zA).map(YC):void 0)}),Se(()=>(Ff(),g(on),g(Tt)),()=>{Ff(Ff()[kn]={selectedProperty:g(on),selectedDirection:g(Tt)}),fe("store state in memory",kn,Ff()[kn])}),Nn(),li(!0),jp(wn,{get onClose(){return $t()},className:"jse-sort-modal",children:(Hn,ZA)=>{var Ri=seA(),Ki=Ut(Ri),io=tA(()=>g(EA)?"Sort array items":"Sort object keys");vM(Ki,{get title(){return g(io)},get onClose(){return $t()}});var lr=ge(De(Ki,2)),ri=De(ge(lr)),fs=ge(ri),Eo=De(ge(fs)),Q=ge(Eo),D=De(fs),R=CA=>{var hA=oeA(),it=De(ge(hA));eh(ge(it),{showChevron:!0,get items(){return g(bA)},get value(){return g(on)},set value(et){x(on,et)},$$legacy:!0}),he(CA,hA)};ze(D,CA=>{g(EA),g(bA),Be(()=>{var hA;return g(EA)&&g(bA)&&((hA=g(bA))===null||hA===void 0?void 0:hA.length)>1})&&CA(R)});var v=De(D),U=De(ge(v));eh(ge(U),{showChevron:!0,clearable:!1,get items(){return So},get value(){return g(Tt)},set value(CA){x(Tt,CA)},$$legacy:!0});var Y=De(lr,2),ie=ge(Y),ce=CA=>{var hA=reA(),it=ge(hA);xA(()=>xt(it,g(Xi))),he(CA,hA)};ze(ie,CA=>{g(Xi)&&CA(ce)});var Le=ge(De(Y,2));zs(()=>QA("click",Le,to)),Ka(Le,CA=>vt?.(CA)),xA(CA=>{ah(Q,CA),Le.disabled=(g(EA),g(bA),g(on),Be(()=>{var hA;return!!(g(EA)&&g(bA)&&((hA=g(bA))===null||hA===void 0?void 0:hA.length)>1)&&!g(on)}))},[()=>(F(qA()),F(An),F(Yc),Be(()=>qA()&&!An(qA())?Yc(qA()):"(document root)"))],tA),he(Hn,Ri)},$$slots:{default:!0}}),kt()})(Mn,qC(()=>g(pA),{onClose:()=>{var wn;(wn=g(pA))===null||wn===void 0||wn.onClose(),x(pA,void 0)}}))};ze(pr,Mn=>{g(pA)&&Mn(Mi)});var Mo=De(pr,2),wr=Mn=>{a$e(Mn,qC(()=>g(vA),{onClose:()=>{var wn;(wn=g(vA))===null||wn===void 0||wn.onClose(),x(vA,void 0)}}))};ze(Mo,Mn=>{g(vA)&&Mn(wr)});var yr=De(Mo,2),Nr=Mn=>{(function(wn,Ft){St(Ft,!1);var Yn=Ce(void 0,!0),Me=Ce(void 0,!0),gA=Ce(void 0,!0),EA=Ce(void 0,!0),zA=Es("jsoneditor:JSONEditorModal"),bA=N(Ft,"content",9),fe=N(Ft,"path",9),ke=N(Ft,"onPatch",9),Xe=N(Ft,"readOnly",9),qA=N(Ft,"indentation",9),Gt=N(Ft,"tabSize",9),$t=N(Ft,"truncateTextSize",9),Sn=N(Ft,"mainMenuBar",9),So=N(Ft,"navigationBar",9),kn=N(Ft,"statusBar",9),on=N(Ft,"askToFormat",9),Tt=N(Ft,"escapeControlCharacters",9),Xi=N(Ft,"escapeUnicodeCharacters",9),to=N(Ft,"flattenColumns",9),vt=N(Ft,"parser",9),Hn=N(Ft,"validator",9),ZA=N(Ft,"validationParser",9),Ri=N(Ft,"pathParser",9),Ki=N(Ft,"onRenderValue",9),io=N(Ft,"onClassName",9),lr=N(Ft,"onRenderMenu",9),ri=N(Ft,"onRenderContextMenu",9),fs=N(Ft,"onSortModal",9),Eo=N(Ft,"onTransformModal",9),Q=N(Ft,"onClose",9),D=Ce(void 0,!0),R=Ce(void 0,!0),v={mode:ie(bA()),content:bA(),selection:void 0,relativePath:fe()},U=Ce([v],!0),Y=Ce(void 0,!0);function ie(Ee){return Up(Ee)&&Wo(Ee.json)?Rr.table:Rr.tree}function ce(){var Ee,qe=(Ee=vi(g(U)))===null||Ee===void 0?void 0:Ee.selection;Yp(qe)&&g(D).scrollTo(It(qe))}function Le(){if(zA("handleApply"),!Xe())try{x(Y,void 0);var Ee=g(Yn).relativePath,qe=g(Yn).content,kA=[{op:"replace",path:pt(Ee),value:mde(qe,vt()).json}];if(g(U).length>1){var MA=mde(g(U)[g(U).length-2].content,vt()).json,wA={json:Mc(MA,kA)},yt=SA(SA({},g(U)[g(U).length-2]||v),{},{content:wA});x(U,[...g(U).slice(0,g(U).length-2),yt]),bo(),ce()}else ke()(kA),Q()()}catch(at){x(Y,String(at))}}function CA(){if(zA("handleClose"),g(R))x(R,!1);else if(g(U).length>1){var Ee;x(U,Hi(g(U))),bo(),(Ee=g(D))===null||Ee===void 0||Ee.focus(),ce(),x(Y,void 0)}else Q()()}function hA(Ee){zA("handleChange",Ee),RA(qe=>SA(SA({},qe),{},{content:Ee}))}function it(Ee){zA("handleChangeSelection",Ee),RA(qe=>SA(SA({},qe),{},{selection:Ee}))}function et(Ee){zA("handleChangeMode",Ee),RA(qe=>SA(SA({},qe),{},{mode:Ee}))}function RA(Ee){var qe=Ee(vi(g(U)));x(U,[...Hi(g(U)),qe])}function jA(Ee){x(Y,Ee.toString()),console.error(Ee)}function rn(Ee){var qe,{content:kA,path:MA}=Ee;zA("handleJSONEditorModal",{content:kA,path:MA});var wA={mode:ie(kA),content:kA,selection:void 0,relativePath:MA};x(U,[...g(U),wA]),bo(),(qe=g(D))===null||qe===void 0||qe.focus()}function j(Ee){Ee.focus()}ua(()=>{var Ee;(Ee=g(D))===null||Ee===void 0||Ee.focus()}),Se(()=>g(U),()=>{x(Yn,vi(g(U))||v)}),Se(()=>g(U),()=>{x(Me,g(U).flatMap(Ee=>Ee.relativePath))}),Se(()=>(g(Me),Yc),()=>{x(gA,An(g(Me))?"(document root)":Yc(g(Me)))}),Se(()=>F(vt()),()=>{x(EA,OE(vt().parse))}),Nn(),li(!0),jp(wn,{onClose:CA,className:"jse-jsoneditor-modal",get fullscreen(){return g(R)},children:(Ee,qe)=>{var kA=ieA();eY(ge(kA),{children:(MA,wA)=>{var yt=teA(),at=Ut(yt),Ni=tA(()=>(g(U),Be(()=>g(U).length>1?" (".concat(g(U).length,")"):"")));vM(at,{get title(){var zt;return"Edit nested content ".concat((zt=g(Ni))!==null&&zt!==void 0?zt:"")},fullScreenButton:!0,onClose:CA,get fullscreen(){return g(R)},set fullscreen(zt){x(R,zt)},$$legacy:!0});var Gn=De(at,2),$i=De(ge(Gn),2),fo=De($i,4);Ho(l2e(ge(fo),{get externalMode(){return g(Yn),Be(()=>g(Yn).mode)},get content(){return g(Yn),Be(()=>g(Yn).content)},get selection(){return g(Yn),Be(()=>g(Yn).selection)},get readOnly(){return Xe()},get indentation(){return qA()},get tabSize(){return Gt()},get truncateTextSize(){return $t()},get statusBar(){return kn()},get askToFormat(){return on()},get mainMenuBar(){return Sn()},get navigationBar(){return So()},get escapeControlCharacters(){return Tt()},get escapeUnicodeCharacters(){return Xi()},get flattenColumns(){return to()},get parser(){return vt()},get parseMemoizeOne(){return g(EA)},get validator(){return Hn()},get validationParser(){return ZA()},get pathParser(){return Ri()},insideModal:!0,onError:jA,onChange:hA,onChangeMode:et,onSelect:it,get onRenderValue(){return Ki()},get onClassName(){return io()},get onFocus(){return sg},get onBlur(){return sg},get onRenderMenu(){return lr()},get onRenderContextMenu(){return ri()},get onSortModal(){return fs()},get onTransformModal(){return Eo()},onJSONEditorModal:rn,$$legacy:!0}),zt=>x(D,zt),()=>g(D));var ei=ge(De(fo,2)),er=zt=>{var Et=X$e(),Ei=ge(Et);xA(()=>xt(Ei,g(Y))),he(zt,Et)};ze(ei,zt=>{g(Y)&&zt(er)});var no=De(ei,2),ko=zt=>{var Et=$$e();nn(ge(Et),{get data(){return loe}}),QA("click",Et,CA),he(zt,Et)};ze(no,zt=>{g(U),Be(()=>g(U).length>1)&&zt(ko)});var yn=De(no,2),Ht=zt=>{var Et=eeA();zs(()=>QA("click",Et,Le)),Ka(Et,Ei=>j?.(Ei)),he(zt,Et)},sn=zt=>{var Et=AeA();QA("click",Et,CA),he(zt,Et)};ze(yn,zt=>{Xe()?zt(sn,!1):zt(Ht)}),xA(()=>ah($i,g(gA))),he(MA,yt)},$$slots:{default:!0}}),he(Ee,kA)},$$slots:{default:!0}}),kt()})(Mn,qC(()=>g(Ne),{onClose:()=>{var wn;(wn=g(Ne))===null||wn===void 0||wn.onClose(),x(Ne,void 0)}}))};ze(yr,Mn=>{g(Ne)&&Mn(Nr)}),xA(Mn=>Zi=ci(Bo,1,"jse-main svelte-57bmz4",null,Zi,Mn),[()=>({"jse-focus":g(Ae)})],tA),QA("keydown",Bo,ho),he(sA,Jn)},$$slots:{default:!0}}),jt(A,"get",Re),jt(A,"set",wt),jt(A,"update",st),jt(A,"patch",nA),jt(A,"select",Bt),jt(A,"expand",Wi),jt(A,"collapse",Qn),jt(A,"transform",dn),jt(A,"validate",HA),jt(A,"acceptAutoRepair",Cn),jt(A,"scrollTo",Gi),jt(A,"findElement",Yt),jt(A,"focus",xi),jt(A,"refresh",Pi),jt(A,"updateProps",L),jt(A,"destroy",ct),kt({get:Re,set:wt,update:st,patch:nA,select:Bt,expand:Wi,collapse:Qn,transform:dn,validate:HA,acceptAutoRepair:Cn,scrollTo:Gi,findElement:Yt,focus:xi,refresh:Pi,updateProps:L,destroy:ct})}function sCe(t){var{target:A,props:e}=t,i=TVe(ceA,{target:A,props:e});return i.destroy=Vt(function*(){return function(n,o){var r=qJ.get(n);return r?(qJ.delete(n),r(o)):Promise.resolve()}(i)}),bo(),i}var r0=class t{constructor(A){this.el=A}jsonString;editor=null;ngAfterViewInit(){let A={text:this.jsonString};setTimeout(()=>{this.editor=sCe({target:document.getElementById("json-editor"),props:{content:A,mode:Rr.text,mainMenuBar:!1,statusBar:!1}})})}getJsonString(){return this.editor?.get().text}static \u0275fac=function(e){return new(e||t)(DA(eA))};static \u0275cmp=xe({type:t,selectors:[["app-json-editor"]],inputs:{jsonString:"jsonString"},decls:1,vars:0,consts:[["id","json-editor",1,"json-editor-container","jse-theme-dark"]],template:function(e,i){e&1&&ve(0,"div",0)},styles:[".jse-theme-dark[_ngcontent-%COMP%]{--jse-theme: dark;--jse-theme-color: #2f6dd0;--jse-theme-color-highlight: #467cd2;--jse-background-color: #1e1e1e;--jse-text-color: #d4d4d4;--jse-text-color-inverse: #4d4d4d;--jse-main-border: 1px solid #4f4f4f;--jse-menu-color: #fff;--jse-modal-background: #2f2f2f;--jse-modal-overlay-background: rgba(0, 0, 0, .5);--jse-modal-code-background: #2f2f2f;--jse-tooltip-color: var(--jse-text-color);--jse-tooltip-background: #4b4b4b;--jse-tooltip-border: 1px solid #737373;--jse-tooltip-action-button-color: inherit;--jse-tooltip-action-button-background: #737373;--jse-panel-background: #333333;--jse-panel-background-border: 1px solid #464646;--jse-panel-color: var(--jse-text-color);--jse-panel-color-readonly: #737373;--jse-panel-border: 1px solid #3c3c3c;--jse-panel-button-color-highlight: #e5e5e5;--jse-panel-button-background-highlight: #464646;--jse-navigation-bar-background: #656565;--jse-navigation-bar-background-highlight: #7e7e7e;--jse-navigation-bar-dropdown-color: var(--jse-text-color);--jse-context-menu-background: #4b4b4b;--jse-context-menu-background-highlight: #595959;--jse-context-menu-separator-color: #595959;--jse-context-menu-color: var(--jse-text-color);--jse-context-menu-pointer-background: #737373;--jse-context-menu-pointer-background-highlight: #818181;--jse-context-menu-pointer-color: var(--jse-context-menu-color);--jse-key-color: #9cdcfe;--jse-value-color: var(--jse-text-color);--jse-value-color-number: #b5cea8;--jse-value-color-boolean: #569cd6;--jse-value-color-null: #569cd6;--jse-value-color-string: #ce9178;--jse-value-color-url: #ce9178;--jse-delimiter-color: #949494;--jse-edit-outline: 2px solid var(--jse-text-color);--jse-selection-background-color: #464646;--jse-selection-background-inactive-color: #333333;--jse-hover-background-color: #343434;--jse-active-line-background-color: rgba(255, 255, 255, .06);--jse-search-match-background-color: #343434;--jse-collapsed-items-background-color: #333333;--jse-collapsed-items-selected-background-color: #565656;--jse-collapsed-items-link-color: #b2b2b2;--jse-collapsed-items-link-color-highlight: #ec8477;--jse-search-match-color: #724c27;--jse-search-match-outline: 1px solid #966535;--jse-search-match-active-color: #9f6c39;--jse-search-match-active-outline: 1px solid #bb7f43;--jse-tag-background: #444444;--jse-tag-color: #bdbdbd;--jse-table-header-background: #333333;--jse-table-header-background-highlight: #424242;--jse-table-row-odd-background: rgba(255, 255, 255, .1);--jse-input-background: #3d3d3d;--jse-input-border: var(--jse-main-border);--jse-button-background: #808080;--jse-button-background-highlight: #7a7a7a;--jse-button-color: #e0e0e0;--jse-button-secondary-background: #494949;--jse-button-secondary-background-highlight: #5d5d5d;--jse-button-secondary-background-disabled: #9d9d9d;--jse-button-secondary-color: var(--jse-text-color);--jse-a-color: #55abff;--jse-a-color-highlight: #4387c9;--jse-svelte-select-background: #3d3d3d;--jse-svelte-select-border: 1px solid #4f4f4f;--list-background: #3d3d3d;--item-hover-bg: #505050;--multi-item-bg: #5b5b5b;--input-color: #d4d4d4;--multi-clear-bg: #8a8a8a;--multi-item-clear-icon-color: #d4d4d4;--multi-item-outline: 1px solid #696969;--list-shadow: 0 2px 8px 0 rgba(0, 0, 0, .4);--jse-color-picker-background: #656565;--jse-color-picker-border-box-shadow: #8c8c8c 0 0 0 1px}.json-editor-container[_ngcontent-%COMP%]{height:100%} .jse-message.jse-error{display:none} .cm-gutters.cm-gutters-before{display:none} .jse-text-mode{border-radius:10px} .jse-contents{border-radius:10px;border-bottom:1px solid #4f4f4f}"]})};var leA={cancelButton:"Cancel",saveButton:"Save",invalidJsonAlert:"Invalid JSON: "},aCe=new re("Edit Json Dialog Messages",{factory:()=>leA});var s6=class t{constructor(A,e){this.dialogRef=A;this.data=e;this.jsonString=JSON.stringify(e.jsonContent,null,2),this.functionName=e.functionName||""}jsonEditorComponent=es(r0);jsonString="";functionName="";i18n=E(aCe);ngOnInit(){}onSave(){try{this.jsonString=this.jsonEditorComponent().getJsonString();let A=JSON.parse(this.jsonString);this.dialogRef.close(A)}catch(A){alert(this.i18n.invalidJsonAlert+A)}}onCancel(){this.dialogRef.close(null)}static \u0275fac=function(e){return new(e||t)(DA(co),DA(qo))};static \u0275cmp=xe({type:t,selectors:[["app-edit-json-dialog"]],viewQuery:function(e,i){e&1&&Kr(i.jsonEditorComponent,r0,5),e&2&&Aa()},decls:11,vars:5,consts:[[1,"dialog-container"],["mat-dialog-title",""],[1,"editor"],[3,"jsonString"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(e,i){e&1&&(m(0,"div",0)(1,"h2",1),T(2),p(),m(3,"mat-dialog-content",2),T(4),ve(5,"app-json-editor",3),p(),m(6,"mat-dialog-actions",4)(7,"button",5),T(8),p(),m(9,"button",6),ee("click",function(){return i.onSave()}),T(10),p()()()),e&2&&(y(2),Pe(i.data.dialogHeader),y(2),FA(" ",i.functionName," "),y(),te("jsonString",i.jsonString),y(3),Pe(i.i18n.cancelButton),y(2),Pe(i.i18n.saveButton))},dependencies:[tr,jr,r0,kr,Un,Jl],styles:[".dialog-container[_ngcontent-%COMP%]{border-radius:12px;padding:18px;width:500px;box-shadow:0 8px 16px var(--edit-json-dialog-container-box-shadow-color)}.editor[_ngcontent-%COMP%]{padding-top:12px;height:300px}"]})};var geA=["input"],deA=["label"],CeA=["*"],IeA=new re("mat-checkbox-default-options",{providedIn:"root",factory:lCe});function lCe(){return{color:"accent",clickAction:"check-indeterminate",disabledInteractive:!1}}var Ua=function(t){return t[t.Init=0]="Init",t[t.Checked=1]="Checked",t[t.Unchecked=2]="Unchecked",t[t.Indeterminate=3]="Indeterminate",t}(Ua||{}),ueA={provide:sl,useExisting:zr(()=>Ih),multi:!0},$Y=class{source;checked},cCe=lCe(),Ih=(()=>{class t{_elementRef=E(eA);_changeDetectorRef=E(ut);_ngZone=E(yA);_animationMode=E(Oi,{optional:!0});_options=E(IeA,{optional:!0});focus(){this._inputElement.nativeElement.focus()}_createChangeEvent(e){let i=new $Y;return i.source=this,i.checked=e,i}_getAnimationTargetElement(){return this._inputElement?.nativeElement}_animationClasses={uncheckedToChecked:"mdc-checkbox--anim-unchecked-checked",uncheckedToIndeterminate:"mdc-checkbox--anim-unchecked-indeterminate",checkedToUnchecked:"mdc-checkbox--anim-checked-unchecked",checkedToIndeterminate:"mdc-checkbox--anim-checked-indeterminate",indeterminateToChecked:"mdc-checkbox--anim-indeterminate-checked",indeterminateToUnchecked:"mdc-checkbox--anim-indeterminate-unchecked"};ariaLabel="";ariaLabelledby=null;ariaDescribedby;ariaExpanded;ariaControls;ariaOwns;_uniqueId;id;get inputId(){return`${this.id||this._uniqueId}-input`}required;labelPosition="after";name=null;change=new Ve;indeterminateChange=new Ve;value;disableRipple;_inputElement;_labelElement;tabIndex;color;disabledInteractive;_onTouched=()=>{};_currentAnimationClass="";_currentCheckState=Ua.Init;_controlValueAccessorChangeFn=()=>{};_validatorChangeFn=()=>{};constructor(){E(Wn).load(Pr);let e=E(new ws("tabindex"),{optional:!0});this._options=this._options||cCe,this.color=this._options.color||cCe.color,this.tabIndex=e==null?0:parseInt(e)||0,this.id=this._uniqueId=E(un).getId("mat-mdc-checkbox-"),this.disabledInteractive=this._options?.disabledInteractive??!1}ngOnChanges(e){e.required&&this._validatorChangeFn()}ngAfterViewInit(){this._syncIndeterminate(this._indeterminate)}get checked(){return this._checked}set checked(e){e!=this.checked&&(this._checked=e,this._changeDetectorRef.markForCheck())}_checked=!1;get disabled(){return this._disabled}set disabled(e){e!==this.disabled&&(this._disabled=e,this._changeDetectorRef.markForCheck())}_disabled=!1;get indeterminate(){return this._indeterminate}set indeterminate(e){let i=e!=this._indeterminate;this._indeterminate=e,i&&(this._indeterminate?this._transitionCheckState(Ua.Indeterminate):this._transitionCheckState(this.checked?Ua.Checked:Ua.Unchecked),this.indeterminateChange.emit(this._indeterminate)),this._syncIndeterminate(this._indeterminate)}_indeterminate=!1;_isRippleDisabled(){return this.disableRipple||this.disabled}_onLabelTextChange(){this._changeDetectorRef.detectChanges()}writeValue(e){this.checked=!!e}registerOnChange(e){this._controlValueAccessorChangeFn=e}registerOnTouched(e){this._onTouched=e}setDisabledState(e){this.disabled=e}validate(e){return this.required&&e.value!==!0?{required:!0}:null}registerOnValidatorChange(e){this._validatorChangeFn=e}_transitionCheckState(e){let i=this._currentCheckState,n=this._getAnimationTargetElement();if(!(i===e||!n)&&(this._currentAnimationClass&&n.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(i,e),this._currentCheckState=e,this._currentAnimationClass.length>0)){n.classList.add(this._currentAnimationClass);let o=this._currentAnimationClass;this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{n.classList.remove(o)},1e3)})}}_emitChangeEvent(){this._controlValueAccessorChangeFn(this.checked),this.change.emit(this._createChangeEvent(this.checked)),this._inputElement&&(this._inputElement.nativeElement.checked=this.checked)}toggle(){this.checked=!this.checked,this._controlValueAccessorChangeFn(this.checked)}_handleInputClick(){let e=this._options?.clickAction;!this.disabled&&e!=="noop"?(this.indeterminate&&e!=="check"&&Promise.resolve().then(()=>{this._indeterminate=!1,this.indeterminateChange.emit(this._indeterminate)}),this._checked=!this._checked,this._transitionCheckState(this._checked?Ua.Checked:Ua.Unchecked),this._emitChangeEvent()):(this.disabled&&this.disabledInteractive||!this.disabled&&e==="noop")&&(this._inputElement.nativeElement.checked=this.checked,this._inputElement.nativeElement.indeterminate=this.indeterminate)}_onInteractionEvent(e){e.stopPropagation()}_onBlur(){Promise.resolve().then(()=>{this._onTouched(),this._changeDetectorRef.markForCheck()})}_getAnimationClassForCheckStateTransition(e,i){if(this._animationMode==="NoopAnimations")return"";switch(e){case Ua.Init:if(i===Ua.Checked)return this._animationClasses.uncheckedToChecked;if(i==Ua.Indeterminate)return this._checked?this._animationClasses.checkedToIndeterminate:this._animationClasses.uncheckedToIndeterminate;break;case Ua.Unchecked:return i===Ua.Checked?this._animationClasses.uncheckedToChecked:this._animationClasses.uncheckedToIndeterminate;case Ua.Checked:return i===Ua.Unchecked?this._animationClasses.checkedToUnchecked:this._animationClasses.checkedToIndeterminate;case Ua.Indeterminate:return i===Ua.Checked?this._animationClasses.indeterminateToChecked:this._animationClasses.indeterminateToUnchecked}return""}_syncIndeterminate(e){let i=this._inputElement;i&&(i.nativeElement.indeterminate=e)}_onInputClick(){this._handleInputClick()}_onTouchTargetClick(){this._handleInputClick(),this.disabled||this._inputElement.nativeElement.focus()}_preventBubblingFromLabel(e){e.target&&this._labelElement.nativeElement.contains(e.target)&&e.stopPropagation()}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-checkbox"]],viewQuery:function(i,n){if(i&1&&(At(geA,5),At(deA,5)),i&2){let o;oA(o=rA())&&(n._inputElement=o.first),oA(o=rA())&&(n._labelElement=o.first)}},hostAttrs:[1,"mat-mdc-checkbox"],hostVars:16,hostBindings:function(i,n){i&2&&(ea("id",n.id),AA("tabindex",null)("aria-label",null)("aria-labelledby",null),Lo(n.color?"mat-"+n.color:"mat-accent"),iA("_mat-animation-noopable",n._animationMode==="NoopAnimations")("mdc-checkbox--disabled",n.disabled)("mat-mdc-checkbox-disabled",n.disabled)("mat-mdc-checkbox-checked",n.checked)("mat-mdc-checkbox-disabled-interactive",n.disabledInteractive))},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],ariaExpanded:[2,"aria-expanded","ariaExpanded",IA],ariaControls:[0,"aria-controls","ariaControls"],ariaOwns:[0,"aria-owns","ariaOwns"],id:"id",required:[2,"required","required",IA],labelPosition:"labelPosition",name:"name",value:"value",disableRipple:[2,"disableRipple","disableRipple",IA],tabIndex:[2,"tabIndex","tabIndex",e=>e==null?void 0:ln(e)],color:"color",disabledInteractive:[2,"disabledInteractive","disabledInteractive",IA],checked:[2,"checked","checked",IA],disabled:[2,"disabled","disabled",IA],indeterminate:[2,"indeterminate","indeterminate",IA]},outputs:{change:"change",indeterminateChange:"indeterminateChange"},exportAs:["matCheckbox"],features:[gt([ueA,{provide:z0,useExisting:t,multi:!0}]),ti],ngContentSelectors:CeA,decls:15,vars:23,consts:[["checkbox",""],["input",""],["label",""],["mat-internal-form-field","",3,"click","labelPosition"],[1,"mdc-checkbox"],[1,"mat-mdc-checkbox-touch-target",3,"click"],["type","checkbox",1,"mdc-checkbox__native-control",3,"blur","click","change","checked","indeterminate","disabled","id","required","tabIndex"],[1,"mdc-checkbox__ripple"],[1,"mdc-checkbox__background"],["focusable","false","viewBox","0 0 24 24","aria-hidden","true",1,"mdc-checkbox__checkmark"],["fill","none","d","M1.73,12.91 8.1,19.28 22.79,4.59",1,"mdc-checkbox__checkmark-path"],[1,"mdc-checkbox__mixedmark"],["mat-ripple","",1,"mat-mdc-checkbox-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleCentered"],[1,"mdc-label",3,"for"]],template:function(i,n){if(i&1){let o=Ue();Kt(),m(0,"div",3),ee("click",function(s){return q(o),W(n._preventBubblingFromLabel(s))}),m(1,"div",4,0)(3,"div",5),ee("click",function(){return q(o),W(n._onTouchTargetClick())}),p(),m(4,"input",6,1),ee("blur",function(){return q(o),W(n._onBlur())})("click",function(){return q(o),W(n._onInputClick())})("change",function(s){return q(o),W(n._onInteractionEvent(s))}),p(),ve(6,"div",7),m(7,"div",8),ft(),m(8,"svg",9),ve(9,"path",10),p(),$s(),ve(10,"div",11),p(),ve(11,"div",12),p(),m(12,"label",13,2),NA(14),p()()}if(i&2){let o=Ji(2);te("labelPosition",n.labelPosition),y(4),iA("mdc-checkbox--selected",n.checked),te("checked",n.checked)("indeterminate",n.indeterminate)("disabled",n.disabled&&!n.disabledInteractive)("id",n.inputId)("required",n.required)("tabIndex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex),AA("aria-label",n.ariaLabel||null)("aria-labelledby",n.ariaLabelledby)("aria-describedby",n.ariaDescribedby)("aria-checked",n.indeterminate?"mixed":null)("aria-controls",n.ariaControls)("aria-disabled",n.disabled&&n.disabledInteractive?!0:null)("aria-expanded",n.ariaExpanded)("aria-owns",n.ariaOwns)("name",n.name)("value",n.value),y(7),te("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)("matRippleCentered",!0),y(),te("for",n.inputId)}},dependencies:[ec,U5],styles:['.mdc-checkbox{display:inline-block;position:relative;flex:0 0 18px;box-sizing:content-box;width:18px;height:18px;line-height:0;white-space:nowrap;cursor:pointer;vertical-align:bottom;padding:calc((var(--mdc-checkbox-state-layer-size, 40px) - 18px)/2);margin:calc((var(--mdc-checkbox-state-layer-size, 40px) - var(--mdc-checkbox-state-layer-size, 40px))/2)}.mdc-checkbox:hover>.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-unselected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity));background-color:var(--mdc-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:hover>.mat-mdc-checkbox-ripple>.mat-ripple-element{background-color:var(--mdc-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control:focus+.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-unselected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity));background-color:var(--mdc-checkbox-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control:focus~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mdc-checkbox-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:active>.mdc-checkbox__native-control+.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-unselected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));background-color:var(--mdc-checkbox-unselected-pressed-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:active>.mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mdc-checkbox-unselected-pressed-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:hover .mdc-checkbox__native-control:checked+.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity));background-color:var(--mdc-checkbox-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:hover .mdc-checkbox__native-control:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mdc-checkbox-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox .mdc-checkbox__native-control:focus:checked+.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity));background-color:var(--mdc-checkbox-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox .mdc-checkbox__native-control:focus:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mdc-checkbox-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:active>.mdc-checkbox__native-control:checked+.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-selected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));background-color:var(--mdc-checkbox-selected-pressed-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:active>.mdc-checkbox__native-control:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mdc-checkbox-selected-pressed-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control+.mdc-checkbox__ripple{background-color:var(--mdc-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control{position:absolute;margin:0;padding:0;opacity:0;cursor:inherit;width:var(--mdc-checkbox-state-layer-size, 40px);height:var(--mdc-checkbox-state-layer-size, 40px);top:calc((var(--mdc-checkbox-state-layer-size, 40px) - var(--mdc-checkbox-state-layer-size, 40px))/2);right:calc((var(--mdc-checkbox-state-layer-size, 40px) - var(--mdc-checkbox-state-layer-size, 40px))/2);left:calc((var(--mdc-checkbox-state-layer-size, 40px) - var(--mdc-checkbox-state-layer-size, 40px))/2)}.mdc-checkbox--disabled{cursor:default;pointer-events:none}@media(forced-colors: active){.mdc-checkbox--disabled{opacity:.5}}.mdc-checkbox__background{display:inline-flex;position:absolute;align-items:center;justify-content:center;box-sizing:border-box;width:18px;height:18px;border:2px solid currentColor;border-radius:2px;background-color:rgba(0,0,0,0);pointer-events:none;will-change:background-color,border-color;transition:background-color 90ms cubic-bezier(0.4, 0, 0.6, 1),border-color 90ms cubic-bezier(0.4, 0, 0.6, 1);-webkit-print-color-adjust:exact;color-adjust:exact;border-color:var(--mdc-checkbox-unselected-icon-color, var(--mat-sys-on-surface-variant));top:calc((var(--mdc-checkbox-state-layer-size, 40px) - 18px)/2);left:calc((var(--mdc-checkbox-state-layer-size, 40px) - 18px)/2)}.mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:enabled:indeterminate~.mdc-checkbox__background{border-color:var(--mdc-checkbox-selected-icon-color, var(--mat-sys-primary));background-color:var(--mdc-checkbox-selected-icon-color, var(--mat-sys-primary))}.mdc-checkbox--disabled .mdc-checkbox__background{border-color:var(--mdc-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-checkbox__native-control:disabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:disabled:indeterminate~.mdc-checkbox__background{background-color:var(--mdc-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:rgba(0,0,0,0)}.mdc-checkbox:hover>.mdc-checkbox__native-control:not(:checked)~.mdc-checkbox__background,.mdc-checkbox:hover>.mdc-checkbox__native-control:not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mdc-checkbox-unselected-hover-icon-color, var(--mat-sys-on-surface));background-color:rgba(0,0,0,0)}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox:hover>.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{border-color:var(--mdc-checkbox-selected-hover-icon-color, var(--mat-sys-primary));background-color:var(--mdc-checkbox-selected-hover-icon-color, var(--mat-sys-primary))}.mdc-checkbox__native-control:focus:focus:not(:checked)~.mdc-checkbox__background,.mdc-checkbox__native-control:focus:focus:not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mdc-checkbox-unselected-focus-icon-color, var(--mat-sys-on-surface))}.mdc-checkbox__native-control:focus:focus:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:focus:focus:indeterminate~.mdc-checkbox__background{border-color:var(--mdc-checkbox-selected-focus-icon-color, var(--mat-sys-primary));background-color:var(--mdc-checkbox-selected-focus-icon-color, var(--mat-sys-primary))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox:hover>.mdc-checkbox__native-control~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__background{border-color:var(--mdc-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{background-color:var(--mdc-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:rgba(0,0,0,0)}.mdc-checkbox__checkmark{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;opacity:0;transition:opacity 180ms cubic-bezier(0.4, 0, 0.6, 1);color:var(--mdc-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}@media(forced-colors: active){.mdc-checkbox__checkmark{color:CanvasText}}.mdc-checkbox--disabled .mdc-checkbox__checkmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__checkmark{color:var(--mdc-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__checkmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__checkmark{color:CanvasText}}.mdc-checkbox__checkmark-path{transition:stroke-dashoffset 180ms cubic-bezier(0.4, 0, 0.6, 1);stroke:currentColor;stroke-width:3.12px;stroke-dashoffset:29.7833385;stroke-dasharray:29.7833385}.mdc-checkbox__mixedmark{width:100%;height:0;transform:scaleX(0) rotate(0deg);border-width:1px;border-style:solid;opacity:0;transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1);border-color:var(--mdc-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}@media(forced-colors: active){.mdc-checkbox__mixedmark{margin:0 1px}}.mdc-checkbox--disabled .mdc-checkbox__mixedmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__mixedmark{border-color:var(--mdc-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__background,.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__background,.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__background,.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__background{animation-duration:180ms;animation-timing-function:linear}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-unchecked-checked-checkmark-path 180ms linear;transition:none}.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-unchecked-indeterminate-mixedmark 90ms linear;transition:none}.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-checked-unchecked-checkmark-path 90ms linear;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__checkmark{animation:mdc-checkbox-checked-indeterminate-checkmark 90ms linear;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-checked-indeterminate-mixedmark 90ms linear;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__checkmark{animation:mdc-checkbox-indeterminate-checked-checkmark 500ms linear;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-checked-mixedmark 500ms linear;transition:none}.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-unchecked-mixedmark 300ms linear;transition:none}.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{transition:border-color 90ms cubic-bezier(0, 0, 0.2, 1),background-color 90ms cubic-bezier(0, 0, 0.2, 1)}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path{stroke-dashoffset:0}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__checkmark{transition:opacity 180ms cubic-bezier(0, 0, 0.2, 1),transform 180ms cubic-bezier(0, 0, 0.2, 1);opacity:1}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__mixedmark{transform:scaleX(1) rotate(-45deg)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__checkmark{transform:rotate(45deg);opacity:0;transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__mixedmark{transform:scaleX(1) rotate(0deg);opacity:1}@keyframes mdc-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:29.7833385}50%{animation-timing-function:cubic-bezier(0, 0, 0.2, 1)}100%{stroke-dashoffset:0}}@keyframes mdc-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0, 0, 0, 1)}100%{transform:scaleX(1)}}@keyframes mdc-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(0.4, 0, 1, 1);opacity:1;stroke-dashoffset:0}to{opacity:0;stroke-dashoffset:-29.7833385}}@keyframes mdc-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 1);transform:rotate(0deg);opacity:1}to{transform:rotate(45deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);transform:rotate(45deg);opacity:0}to{transform:rotate(360deg);opacity:1}}@keyframes mdc-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 1);transform:rotate(-45deg);opacity:0}to{transform:rotate(0deg);opacity:1}}@keyframes mdc-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);transform:rotate(0deg);opacity:1}to{transform:rotate(315deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;transform:scaleX(1);opacity:1}32.8%,100%{transform:scaleX(0);opacity:0}}.mat-mdc-checkbox{display:inline-block;position:relative;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mat-mdc-checkbox-touch-target,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__native-control,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__ripple,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mat-mdc-checkbox-ripple::before,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__checkmark,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__mixedmark{transition:none !important;animation:none !important}.mat-mdc-checkbox label{cursor:pointer}.mat-mdc-checkbox .mat-internal-form-field{color:var(--mat-checkbox-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-checkbox-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-checkbox-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-checkbox-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-checkbox-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-checkbox-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-disabled-interactive{pointer-events:auto}.mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-disabled-interactive input{cursor:default}.mat-mdc-checkbox.mat-mdc-checkbox-disabled label{cursor:default;color:var(--mat-checkbox-disabled-label-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-checkbox label:empty{display:none}.mat-mdc-checkbox .mdc-checkbox__ripple{opacity:0}.mat-mdc-checkbox .mat-mdc-checkbox-ripple,.mdc-checkbox__ripple{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:50%;pointer-events:none}.mat-mdc-checkbox .mat-mdc-checkbox-ripple:not(:empty),.mdc-checkbox__ripple:not(:empty){transform:translateZ(0)}.mat-mdc-checkbox-ripple .mat-ripple-element{opacity:.1}.mat-mdc-checkbox-touch-target{position:absolute;top:50%;left:50%;height:48px;width:48px;transform:translate(-50%, -50%);display:var(--mat-checkbox-touch-target-display, block)}.mat-mdc-checkbox .mat-mdc-checkbox-ripple::before{border-radius:50%}.mdc-checkbox__native-control:focus~.mat-focus-indicator::before{content:""}'],encapsulation:2,changeDetection:0})}return t})();var BeA=[[["caption"]],[["colgroup"],["col"]],"*"],EeA=["caption","colgroup, col","*"];function feA(t,A){t&1&&NA(0,2)}function QeA(t,A){t&1&&(m(0,"thead",0),En(1,1),p(),m(2,"tbody",0),En(3,2)(4,3),p(),m(5,"tfoot",0),En(6,4),p())}function meA(t,A){t&1&&En(0,1)(1,2)(2,3)(3,4)}var s0=new re("CDK_TABLE");var qM=(()=>{class t{template=E(en);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","cdkCellDef",""]]})}return t})(),WM=(()=>{class t{template=E(en);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","cdkHeaderCellDef",""]]})}return t})(),CCe=(()=>{class t{template=E(en);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","cdkFooterCellDef",""]]})}return t})(),aQ=(()=>{class t{_table=E(s0,{optional:!0});_hasStickyChanged=!1;get name(){return this._name}set name(e){this._setNameInput(e)}_name;get sticky(){return this._sticky}set sticky(e){e!==this._sticky&&(this._sticky=e,this._hasStickyChanged=!0)}_sticky=!1;get stickyEnd(){return this._stickyEnd}set stickyEnd(e){e!==this._stickyEnd&&(this._stickyEnd=e,this._hasStickyChanged=!0)}_stickyEnd=!1;cell;headerCell;footerCell;cssClassFriendlyName;_columnCssClassName;constructor(){}hasStickyChanged(){let e=this._hasStickyChanged;return this.resetStickyChanged(),e}resetStickyChanged(){this._hasStickyChanged=!1}_updateColumnCssClassName(){this._columnCssClassName=[`cdk-column-${this.cssClassFriendlyName}`]}_setNameInput(e){e&&(this._name=e,this.cssClassFriendlyName=e.replace(/[^a-z0-9_-]/gi,"-"),this._updateColumnCssClassName())}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","cdkColumnDef",""]],contentQueries:function(i,n,o){if(i&1&&(ni(o,qM,5),ni(o,WM,5),ni(o,CCe,5)),i&2){let r;oA(r=rA())&&(n.cell=r.first),oA(r=rA())&&(n.headerCell=r.first),oA(r=rA())&&(n.footerCell=r.first)}},inputs:{name:[0,"cdkColumnDef","name"],sticky:[2,"sticky","sticky",IA],stickyEnd:[2,"stickyEnd","stickyEnd",IA]},features:[gt([{provide:"MAT_SORT_HEADER_COLUMN_DEF",useExisting:t}])]})}return t})(),zM=class{constructor(A,e){e.nativeElement.classList.add(...A._columnCssClassName)}},ICe=(()=>{class t extends zM{constructor(){super(E(aQ),E(eA))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["cdk-header-cell"],["th","cdk-header-cell",""]],hostAttrs:["role","columnheader",1,"cdk-header-cell"],features:[Ct]})}return t})();var uCe=(()=>{class t extends zM{constructor(){let e=E(aQ),i=E(eA);super(e,i);let n=e._table?._getCellRole();n&&i.nativeElement.setAttribute("role",n)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["cdk-cell"],["td","cdk-cell",""]],hostAttrs:[1,"cdk-cell"],features:[Ct]})}return t})(),PM=class{tasks=[];endTasks=[]},jM=new re("_COALESCED_STYLE_SCHEDULER"),AH=(()=>{class t{_currentSchedule=null;_ngZone=E(yA);constructor(){}schedule(e){this._createScheduleIfNeeded(),this._currentSchedule.tasks.push(e)}scheduleEnd(e){this._createScheduleIfNeeded(),this._currentSchedule.endTasks.push(e)}_createScheduleIfNeeded(){this._currentSchedule||(this._currentSchedule=new PM,this._ngZone.runOutsideAngular(()=>queueMicrotask(()=>{for(;this._currentSchedule.tasks.length||this._currentSchedule.endTasks.length;){let e=this._currentSchedule;this._currentSchedule=new PM;for(let i of e.tasks)i();for(let i of e.endTasks)i()}this._currentSchedule=null})))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=be({token:t,factory:t.\u0275fac})}return t})();var tH=(()=>{class t{template=E(en);_differs=E(Y0);columns;_columnsDiffer;constructor(){}ngOnChanges(e){if(!this._columnsDiffer){let i=e.columns&&e.columns.currentValue||[];this._columnsDiffer=this._differs.find(i).create(),this._columnsDiffer.diff(i)}}getColumnsDiff(){return this._columnsDiffer.diff(this.columns)}extractCellTemplate(e){return this instanceof a6?e.headerCell.template:this instanceof iH?e.footerCell.template:e.cell.template}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,features:[ti]})}return t})(),a6=(()=>{class t extends tH{_table=E(s0,{optional:!0});_hasStickyChanged=!1;get sticky(){return this._sticky}set sticky(e){e!==this._sticky&&(this._sticky=e,this._hasStickyChanged=!0)}_sticky=!1;constructor(){super(E(en),E(Y0))}ngOnChanges(e){super.ngOnChanges(e)}hasStickyChanged(){let e=this._hasStickyChanged;return this.resetStickyChanged(),e}resetStickyChanged(){this._hasStickyChanged=!1}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","cdkHeaderRowDef",""]],inputs:{columns:[0,"cdkHeaderRowDef","columns"],sticky:[2,"cdkHeaderRowDefSticky","sticky",IA]},features:[Ct,ti]})}return t})(),iH=(()=>{class t extends tH{_table=E(s0,{optional:!0});_hasStickyChanged=!1;get sticky(){return this._sticky}set sticky(e){e!==this._sticky&&(this._sticky=e,this._hasStickyChanged=!0)}_sticky=!1;constructor(){super(E(en),E(Y0))}ngOnChanges(e){super.ngOnChanges(e)}hasStickyChanged(){let e=this._hasStickyChanged;return this.resetStickyChanged(),e}resetStickyChanged(){this._hasStickyChanged=!1}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","cdkFooterRowDef",""]],inputs:{columns:[0,"cdkFooterRowDef","columns"],sticky:[2,"cdkFooterRowDefSticky","sticky",IA]},features:[Ct,ti]})}return t})(),ZM=(()=>{class t extends tH{_table=E(s0,{optional:!0});when;constructor(){super(E(en),E(Y0))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","cdkRowDef",""]],inputs:{columns:[0,"cdkRowDefColumns","columns"],when:[0,"cdkRowDefWhen","when"]},features:[Ct]})}return t})(),uh=(()=>{class t{_viewContainer=E(xn);cells;context;static mostRecentCellOutlet=null;constructor(){t.mostRecentCellOutlet=this}ngOnDestroy(){t.mostRecentCellOutlet===this&&(t.mostRecentCellOutlet=null)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","cdkCellOutlet",""]]})}return t})(),nH=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["cdk-header-row"],["tr","cdk-header-row",""]],hostAttrs:["role","row",1,"cdk-header-row"],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(i,n){i&1&&En(0,0)},dependencies:[uh],encapsulation:2})}return t})();var oH=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["cdk-row"],["tr","cdk-row",""]],hostAttrs:["role","row",1,"cdk-row"],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(i,n){i&1&&En(0,0)},dependencies:[uh],encapsulation:2})}return t})(),hCe=(()=>{class t{templateRef=E(en);_contentClassName="cdk-no-data-row";constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["ng-template","cdkNoDataRow",""]]})}return t})(),gCe=["top","bottom","left","right"],eH=class{_isNativeHtmlTable;_stickCellCss;direction;_coalescedStyleScheduler;_isBrowser;_needsPositionStickyOnElement;_positionListener;_tableInjector;_elemSizeCache=new WeakMap;_resizeObserver=globalThis?.ResizeObserver?new globalThis.ResizeObserver(A=>this._updateCachedSizes(A)):null;_updatedStickyColumnsParamsToReplay=[];_stickyColumnsReplayTimeout=null;_cachedCellWidths=[];_borderCellCss;_destroyed=!1;constructor(A,e,i,n,o=!0,r=!0,s,a){this._isNativeHtmlTable=A,this._stickCellCss=e,this.direction=i,this._coalescedStyleScheduler=n,this._isBrowser=o,this._needsPositionStickyOnElement=r,this._positionListener=s,this._tableInjector=a,this._borderCellCss={top:`${e}-border-elem-top`,bottom:`${e}-border-elem-bottom`,left:`${e}-border-elem-left`,right:`${e}-border-elem-right`}}clearStickyPositioning(A,e){(e.includes("left")||e.includes("right"))&&this._removeFromStickyColumnReplayQueue(A);let i=[];for(let n of A)n.nodeType===n.ELEMENT_NODE&&i.push(n,...Array.from(n.children));this._afterNextRender({write:()=>{for(let n of i)this._removeStickyStyle(n,e)}})}updateStickyColumns(A,e,i,n=!0,o=!0){if(!A.length||!this._isBrowser||!(e.some(B=>B)||i.some(B=>B))){this._positionListener?.stickyColumnsUpdated({sizes:[]}),this._positionListener?.stickyEndColumnsUpdated({sizes:[]});return}let r=A[0],s=r.children.length,a=this.direction==="rtl",c=a?"right":"left",l=a?"left":"right",d=e.lastIndexOf(!0),C=i.indexOf(!0),I,u,h;o&&this._updateStickyColumnReplayQueue({rows:[...A],stickyStartStates:[...e],stickyEndStates:[...i]}),this._afterNextRender({earlyRead:()=>{I=this._getCellWidths(r,n),u=this._getStickyStartColumnPositions(I,e),h=this._getStickyEndColumnPositions(I,i)},write:()=>{for(let B of A)for(let f=0;f!!B)&&(this._positionListener.stickyColumnsUpdated({sizes:d===-1?[]:I.slice(0,d+1).map((B,f)=>e[f]?B:null)}),this._positionListener.stickyEndColumnsUpdated({sizes:C===-1?[]:I.slice(C).map((B,f)=>i[f+C]?B:null).reverse()}))}})}stickRows(A,e,i){if(!this._isBrowser)return;let n=i==="bottom"?A.slice().reverse():A,o=i==="bottom"?e.slice().reverse():e,r=[],s=[],a=[];this._afterNextRender({earlyRead:()=>{for(let c=0,l=0;c{let c=o.lastIndexOf(!0);for(let l=0;l{let i=A.querySelector("tfoot");i&&(e.some(n=>!n)?this._removeStickyStyle(i,["bottom"]):this._addStickyStyle(i,"bottom",0,!1))}})}destroy(){this._stickyColumnsReplayTimeout&&clearTimeout(this._stickyColumnsReplayTimeout),this._resizeObserver?.disconnect(),this._destroyed=!0}_removeStickyStyle(A,e){for(let n of e)A.style[n]="",A.classList.remove(this._borderCellCss[n]);gCe.some(n=>e.indexOf(n)===-1&&A.style[n])?A.style.zIndex=this._getCalculatedZIndex(A):(A.style.zIndex="",this._needsPositionStickyOnElement&&(A.style.position=""),A.classList.remove(this._stickCellCss))}_addStickyStyle(A,e,i,n){A.classList.add(this._stickCellCss),n&&A.classList.add(this._borderCellCss[e]),A.style[e]=`${i}px`,A.style.zIndex=this._getCalculatedZIndex(A),this._needsPositionStickyOnElement&&(A.style.cssText+="position: -webkit-sticky; position: sticky; ")}_getCalculatedZIndex(A){let e={top:100,bottom:10,left:1,right:1},i=0;for(let n of gCe)A.style[n]&&(i+=e[n]);return i?`${i}`:""}_getCellWidths(A,e=!0){if(!e&&this._cachedCellWidths.length)return this._cachedCellWidths;let i=[],n=A.children;for(let o=0;o0;o--)e[o]&&(i[o]=n,n+=A[o]);return i}_retrieveElementSize(A){let e=this._elemSizeCache.get(A);if(e)return e;let i=A.getBoundingClientRect(),n={width:i.width,height:i.height};return this._resizeObserver&&(this._elemSizeCache.set(A,n),this._resizeObserver.observe(A,{box:"border-box"})),n}_updateStickyColumnReplayQueue(A){this._removeFromStickyColumnReplayQueue(A.rows),this._stickyColumnsReplayTimeout||this._updatedStickyColumnsParamsToReplay.push(A)}_removeFromStickyColumnReplayQueue(A){let e=new Set(A);for(let i of this._updatedStickyColumnsParamsToReplay)i.rows=i.rows.filter(n=>!e.has(n));this._updatedStickyColumnsParamsToReplay=this._updatedStickyColumnsParamsToReplay.filter(i=>!!i.rows.length)}_updateCachedSizes(A){let e=!1;for(let i of A){let n=i.borderBoxSize?.length?{width:i.borderBoxSize[0].inlineSize,height:i.borderBoxSize[0].blockSize}:{width:i.contentRect.width,height:i.contentRect.height};n.width!==this._elemSizeCache.get(i.target)?.width&&peA(i.target)&&(e=!0),this._elemSizeCache.set(i.target,n)}e&&this._updatedStickyColumnsParamsToReplay.length&&(this._stickyColumnsReplayTimeout&&clearTimeout(this._stickyColumnsReplayTimeout),this._stickyColumnsReplayTimeout=setTimeout(()=>{if(!this._destroyed){for(let i of this._updatedStickyColumnsParamsToReplay)this.updateStickyColumns(i.rows,i.stickyStartStates,i.stickyEndStates,!0,!1);this._updatedStickyColumnsParamsToReplay=[],this._stickyColumnsReplayTimeout=null}},0))}_afterNextRender(A){this._tableInjector?Gr(A,{injector:this._tableInjector}):this._coalescedStyleScheduler.schedule(()=>{A.earlyRead?.(),A.write()})}};function peA(t){return["cdk-cell","cdk-header-cell","cdk-footer-cell"].some(A=>t.classList.contains(A))}var VM=new re("CDK_SPL");var rH=(()=>{class t{viewContainer=E(xn);elementRef=E(eA);constructor(){let e=E(s0);e._rowOutlet=this,e._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","rowOutlet",""]]})}return t})(),sH=(()=>{class t{viewContainer=E(xn);elementRef=E(eA);constructor(){let e=E(s0);e._headerRowOutlet=this,e._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","headerRowOutlet",""]]})}return t})(),aH=(()=>{class t{viewContainer=E(xn);elementRef=E(eA);constructor(){let e=E(s0);e._footerRowOutlet=this,e._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","footerRowOutlet",""]]})}return t})(),cH=(()=>{class t{viewContainer=E(xn);elementRef=E(eA);constructor(){let e=E(s0);e._noDataRowOutlet=this,e._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","noDataRowOutlet",""]]})}return t})();var lH=(()=>{class t{_differs=E(Y0);_changeDetectorRef=E(ut);_elementRef=E(eA);_dir=E(Do,{optional:!0});_platform=E(mi);_viewRepeater=E(_m);_coalescedStyleScheduler=E(jM);_viewportRuler=E(Ol);_stickyPositioningListener=E(VM,{optional:!0,skipSelf:!0});_document=E(ht);_data;_onDestroy=new je;_renderRows;_renderChangeSubscription;_columnDefsByName=new Map;_rowDefs;_headerRowDefs;_footerRowDefs;_dataDiffer;_defaultRowDef;_customColumnDefs=new Set;_customRowDefs=new Set;_customHeaderRowDefs=new Set;_customFooterRowDefs=new Set;_customNoDataRow;_headerRowDefChanged=!0;_footerRowDefChanged=!0;_stickyColumnStylesNeedReset=!0;_forceRecalculateCellWidths=!0;_cachedRenderRowsMap=new Map;_isNativeHtmlTable;_stickyStyler;stickyCssClass="cdk-table-sticky";needsPositionStickyOnElement=!0;_isServer;_isShowingNoDataRow=!1;_hasAllOutlets=!1;_hasInitialized=!1;_getCellRole(){if(this._cellRoleInternal===void 0){let e=this._elementRef.nativeElement.getAttribute("role");return e==="grid"||e==="treegrid"?"gridcell":"cell"}return this._cellRoleInternal}_cellRoleInternal=void 0;get trackBy(){return this._trackByFn}set trackBy(e){this._trackByFn=e}_trackByFn;get dataSource(){return this._dataSource}set dataSource(e){this._dataSource!==e&&this._switchDataSource(e)}_dataSource;get multiTemplateDataRows(){return this._multiTemplateDataRows}set multiTemplateDataRows(e){this._multiTemplateDataRows=e,this._rowOutlet&&this._rowOutlet.viewContainer.length&&(this._forceRenderDataRows(),this.updateStickyColumnStyles())}_multiTemplateDataRows=!1;get fixedLayout(){return this._fixedLayout}set fixedLayout(e){this._fixedLayout=e,this._forceRecalculateCellWidths=!0,this._stickyColumnStylesNeedReset=!0}_fixedLayout=!1;contentChanged=new Ve;viewChange=new Mt({start:0,end:Number.MAX_VALUE});_rowOutlet;_headerRowOutlet;_footerRowOutlet;_noDataRowOutlet;_contentColumnDefs;_contentRowDefs;_contentHeaderRowDefs;_contentFooterRowDefs;_noDataRow;_injector=E(Dt);constructor(){E(new ws("role"),{optional:!0})||this._elementRef.nativeElement.setAttribute("role","table"),this._isServer=!this._platform.isBrowser,this._isNativeHtmlTable=this._elementRef.nativeElement.nodeName==="TABLE"}ngOnInit(){this._setupStickyStyler(),this._dataDiffer=this._differs.find([]).create((e,i)=>this.trackBy?this.trackBy(i.dataIndex,i.data):i),this._viewportRuler.change().pipe(mt(this._onDestroy)).subscribe(()=>{this._forceRecalculateCellWidths=!0})}ngAfterContentInit(){this._hasInitialized=!0}ngAfterContentChecked(){this._canRender()&&this._render()}ngOnDestroy(){this._stickyStyler?.destroy(),[this._rowOutlet?.viewContainer,this._headerRowOutlet?.viewContainer,this._footerRowOutlet?.viewContainer,this._cachedRenderRowsMap,this._customColumnDefs,this._customRowDefs,this._customHeaderRowDefs,this._customFooterRowDefs,this._columnDefsByName].forEach(e=>{e?.clear()}),this._headerRowDefs=[],this._footerRowDefs=[],this._defaultRowDef=null,this._onDestroy.next(),this._onDestroy.complete(),AD(this.dataSource)&&this.dataSource.disconnect(this)}renderRows(){this._renderRows=this._getAllRenderRows();let e=this._dataDiffer.diff(this._renderRows);if(!e){this._updateNoDataRow(),this.contentChanged.next();return}let i=this._rowOutlet.viewContainer;this._viewRepeater.applyChanges(e,i,(n,o,r)=>this._getEmbeddedViewArgs(n.item,r),n=>n.item.data,n=>{n.operation===aE.INSERTED&&n.context&&this._renderCellTemplateForItem(n.record.item.rowDef,n.context)}),this._updateRowIndexContext(),e.forEachIdentityChange(n=>{let o=i.get(n.currentIndex);o.context.$implicit=n.item.data}),this._updateNoDataRow(),this.contentChanged.next(),this.updateStickyColumnStyles()}addColumnDef(e){this._customColumnDefs.add(e)}removeColumnDef(e){this._customColumnDefs.delete(e)}addRowDef(e){this._customRowDefs.add(e)}removeRowDef(e){this._customRowDefs.delete(e)}addHeaderRowDef(e){this._customHeaderRowDefs.add(e),this._headerRowDefChanged=!0}removeHeaderRowDef(e){this._customHeaderRowDefs.delete(e),this._headerRowDefChanged=!0}addFooterRowDef(e){this._customFooterRowDefs.add(e),this._footerRowDefChanged=!0}removeFooterRowDef(e){this._customFooterRowDefs.delete(e),this._footerRowDefChanged=!0}setNoDataRow(e){this._customNoDataRow=e}updateStickyHeaderRowStyles(){let e=this._getRenderedRows(this._headerRowOutlet);if(this._isNativeHtmlTable){let n=dCe(this._headerRowOutlet,"thead");n&&(n.style.display=e.length?"":"none")}let i=this._headerRowDefs.map(n=>n.sticky);this._stickyStyler.clearStickyPositioning(e,["top"]),this._stickyStyler.stickRows(e,i,"top"),this._headerRowDefs.forEach(n=>n.resetStickyChanged())}updateStickyFooterRowStyles(){let e=this._getRenderedRows(this._footerRowOutlet);if(this._isNativeHtmlTable){let n=dCe(this._footerRowOutlet,"tfoot");n&&(n.style.display=e.length?"":"none")}let i=this._footerRowDefs.map(n=>n.sticky);this._stickyStyler.clearStickyPositioning(e,["bottom"]),this._stickyStyler.stickRows(e,i,"bottom"),this._stickyStyler.updateStickyFooterContainer(this._elementRef.nativeElement,i),this._footerRowDefs.forEach(n=>n.resetStickyChanged())}updateStickyColumnStyles(){let e=this._getRenderedRows(this._headerRowOutlet),i=this._getRenderedRows(this._rowOutlet),n=this._getRenderedRows(this._footerRowOutlet);(this._isNativeHtmlTable&&!this._fixedLayout||this._stickyColumnStylesNeedReset)&&(this._stickyStyler.clearStickyPositioning([...e,...i,...n],["left","right"]),this._stickyColumnStylesNeedReset=!1),e.forEach((o,r)=>{this._addStickyColumnStyles([o],this._headerRowDefs[r])}),this._rowDefs.forEach(o=>{let r=[];for(let s=0;s{this._addStickyColumnStyles([o],this._footerRowDefs[r])}),Array.from(this._columnDefsByName.values()).forEach(o=>o.resetStickyChanged())}_outletAssigned(){!this._hasAllOutlets&&this._rowOutlet&&this._headerRowOutlet&&this._footerRowOutlet&&this._noDataRowOutlet&&(this._hasAllOutlets=!0,this._canRender()&&this._render())}_canRender(){return this._hasAllOutlets&&this._hasInitialized}_render(){this._cacheRowDefs(),this._cacheColumnDefs(),!this._headerRowDefs.length&&!this._footerRowDefs.length&&this._rowDefs.length;let i=this._renderUpdatedColumns()||this._headerRowDefChanged||this._footerRowDefChanged;this._stickyColumnStylesNeedReset=this._stickyColumnStylesNeedReset||i,this._forceRecalculateCellWidths=i,this._headerRowDefChanged&&(this._forceRenderHeaderRows(),this._headerRowDefChanged=!1),this._footerRowDefChanged&&(this._forceRenderFooterRows(),this._footerRowDefChanged=!1),this.dataSource&&this._rowDefs.length>0&&!this._renderChangeSubscription?this._observeRenderChanges():this._stickyColumnStylesNeedReset&&this.updateStickyColumnStyles(),this._checkStickyStates()}_getAllRenderRows(){let e=[],i=this._cachedRenderRowsMap;this._cachedRenderRowsMap=new Map;for(let n=0;n{let s=n&&n.has(r)?n.get(r):[];if(s.length){let a=s.shift();return a.dataIndex=i,a}else return{data:e,rowDef:r,dataIndex:i}})}_cacheColumnDefs(){this._columnDefsByName.clear(),HM(this._getOwnDefs(this._contentColumnDefs),this._customColumnDefs).forEach(i=>{this._columnDefsByName.has(i.name),this._columnDefsByName.set(i.name,i)})}_cacheRowDefs(){this._headerRowDefs=HM(this._getOwnDefs(this._contentHeaderRowDefs),this._customHeaderRowDefs),this._footerRowDefs=HM(this._getOwnDefs(this._contentFooterRowDefs),this._customFooterRowDefs),this._rowDefs=HM(this._getOwnDefs(this._contentRowDefs),this._customRowDefs);let e=this._rowDefs.filter(i=>!i.when);!this.multiTemplateDataRows&&e.length>1,this._defaultRowDef=e[0]}_renderUpdatedColumns(){let e=(r,s)=>{let a=!!s.getColumnsDiff();return r||a},i=this._rowDefs.reduce(e,!1);i&&this._forceRenderDataRows();let n=this._headerRowDefs.reduce(e,!1);n&&this._forceRenderHeaderRows();let o=this._footerRowDefs.reduce(e,!1);return o&&this._forceRenderFooterRows(),i||n||o}_switchDataSource(e){this._data=[],AD(this.dataSource)&&this.dataSource.disconnect(this),this._renderChangeSubscription&&(this._renderChangeSubscription.unsubscribe(),this._renderChangeSubscription=null),e||(this._dataDiffer&&this._dataDiffer.diff([]),this._rowOutlet&&this._rowOutlet.viewContainer.clear()),this._dataSource=e}_observeRenderChanges(){if(!this.dataSource)return;let e;AD(this.dataSource)?e=this.dataSource.connect(this):I1(this.dataSource)?e=this.dataSource:Array.isArray(this.dataSource)&&(e=dA(this.dataSource)),this._renderChangeSubscription=e.pipe(mt(this._onDestroy)).subscribe(i=>{this._data=i||[],this.renderRows()})}_forceRenderHeaderRows(){this._headerRowOutlet.viewContainer.length>0&&this._headerRowOutlet.viewContainer.clear(),this._headerRowDefs.forEach((e,i)=>this._renderRow(this._headerRowOutlet,e,i)),this.updateStickyHeaderRowStyles()}_forceRenderFooterRows(){this._footerRowOutlet.viewContainer.length>0&&this._footerRowOutlet.viewContainer.clear(),this._footerRowDefs.forEach((e,i)=>this._renderRow(this._footerRowOutlet,e,i)),this.updateStickyFooterRowStyles()}_addStickyColumnStyles(e,i){let n=Array.from(i?.columns||[]).map(s=>{let a=this._columnDefsByName.get(s);return a}),o=n.map(s=>s.sticky),r=n.map(s=>s.stickyEnd);this._stickyStyler.updateStickyColumns(e,o,r,!this._fixedLayout||this._forceRecalculateCellWidths)}_getRenderedRows(e){let i=[];for(let n=0;n!o.when||o.when(i,e));else{let o=this._rowDefs.find(r=>r.when&&r.when(i,e))||this._defaultRowDef;o&&n.push(o)}return n.length,n}_getEmbeddedViewArgs(e,i){let n=e.rowDef,o={$implicit:e.data};return{templateRef:n.template,context:o,index:i}}_renderRow(e,i,n,o={}){let r=e.viewContainer.createEmbeddedView(i.template,o,n);return this._renderCellTemplateForItem(i,o),r}_renderCellTemplateForItem(e,i){for(let n of this._getCellTemplates(e))uh.mostRecentCellOutlet&&uh.mostRecentCellOutlet._viewContainer.createEmbeddedView(n,i);this._changeDetectorRef.markForCheck()}_updateRowIndexContext(){let e=this._rowOutlet.viewContainer;for(let i=0,n=e.length;i{let n=this._columnDefsByName.get(i);return e.extractCellTemplate(n)})}_forceRenderDataRows(){this._dataDiffer.diff([]),this._rowOutlet.viewContainer.clear(),this.renderRows()}_checkStickyStates(){let e=(i,n)=>i||n.hasStickyChanged();this._headerRowDefs.reduce(e,!1)&&this.updateStickyHeaderRowStyles(),this._footerRowDefs.reduce(e,!1)&&this.updateStickyFooterRowStyles(),Array.from(this._columnDefsByName.values()).reduce(e,!1)&&(this._stickyColumnStylesNeedReset=!0,this.updateStickyColumnStyles())}_setupStickyStyler(){let e=this._dir?this._dir.value:"ltr";this._stickyStyler=new eH(this._isNativeHtmlTable,this.stickyCssClass,e,this._coalescedStyleScheduler,this._platform.isBrowser,this.needsPositionStickyOnElement,this._stickyPositioningListener,this._injector),(this._dir?this._dir.change:dA()).pipe(mt(this._onDestroy)).subscribe(i=>{this._stickyStyler.direction=i,this.updateStickyColumnStyles()})}_getOwnDefs(e){return e.filter(i=>!i._table||i._table===this)}_updateNoDataRow(){let e=this._customNoDataRow||this._noDataRow;if(!e)return;let i=this._rowOutlet.viewContainer.length===0;if(i===this._isShowingNoDataRow)return;let n=this._noDataRowOutlet.viewContainer;if(i){let o=n.createEmbeddedView(e.templateRef),r=o.rootNodes[0];o.rootNodes.length===1&&r?.nodeType===this._document.ELEMENT_NODE&&(r.setAttribute("role","row"),r.classList.add(e._contentClassName))}else n.clear();this._isShowingNoDataRow=i,this._changeDetectorRef.markForCheck()}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["cdk-table"],["table","cdk-table",""]],contentQueries:function(i,n,o){if(i&1&&(ni(o,hCe,5),ni(o,aQ,5),ni(o,ZM,5),ni(o,a6,5),ni(o,iH,5)),i&2){let r;oA(r=rA())&&(n._noDataRow=r.first),oA(r=rA())&&(n._contentColumnDefs=r),oA(r=rA())&&(n._contentRowDefs=r),oA(r=rA())&&(n._contentHeaderRowDefs=r),oA(r=rA())&&(n._contentFooterRowDefs=r)}},hostAttrs:[1,"cdk-table"],hostVars:2,hostBindings:function(i,n){i&2&&iA("cdk-table-fixed-layout",n.fixedLayout)},inputs:{trackBy:"trackBy",dataSource:"dataSource",multiTemplateDataRows:[2,"multiTemplateDataRows","multiTemplateDataRows",IA],fixedLayout:[2,"fixedLayout","fixedLayout",IA]},outputs:{contentChanged:"contentChanged"},exportAs:["cdkTable"],features:[gt([{provide:s0,useExisting:t},{provide:_m,useClass:cE},{provide:jM,useClass:AH},{provide:VM,useValue:null}])],ngContentSelectors:EeA,decls:5,vars:2,consts:[["role","rowgroup"],["headerRowOutlet",""],["rowOutlet",""],["noDataRowOutlet",""],["footerRowOutlet",""]],template:function(i,n){i&1&&(Kt(BeA),NA(0),NA(1,1),ne(2,feA,1,0)(3,QeA,7,0)(4,meA,4,0)),i&2&&(y(2),$(n._isServer?2:-1),y(),$(n._isNativeHtmlTable?3:4))},dependencies:[sH,rH,cH,aH],styles:[".cdk-table-fixed-layout{table-layout:fixed}"],encapsulation:2})}return t})();function HM(t,A){return t.concat(Array.from(A))}function dCe(t,A){let e=A.toUpperCase(),i=t.viewContainer.element.nativeElement;for(;i;){let n=i.nodeType===1?i.nodeName:null;if(n===e)return i;if(n==="TABLE")break;i=i.parentNode}return null}var weA=[[["caption"]],[["colgroup"],["col"]],"*"],yeA=["caption","colgroup, col","*"];function DeA(t,A){t&1&&NA(0,2)}function veA(t,A){t&1&&(m(0,"thead",0),En(1,1),p(),m(2,"tbody",2),En(3,3)(4,4),p(),m(5,"tfoot",0),En(6,5),p())}function beA(t,A){t&1&&En(0,1)(1,3)(2,4)(3,5)}var BCe=(()=>{class t extends lH{stickyCssClass="mat-mdc-table-sticky";needsPositionStickyOnElement=!1;static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275cmp=xe({type:t,selectors:[["mat-table"],["table","mat-table",""]],hostAttrs:[1,"mat-mdc-table","mdc-data-table__table"],hostVars:2,hostBindings:function(i,n){i&2&&iA("mdc-table-fixed-layout",n.fixedLayout)},exportAs:["matTable"],features:[gt([{provide:lH,useExisting:t},{provide:s0,useExisting:t},{provide:jM,useClass:AH},{provide:_m,useClass:cE},{provide:VM,useValue:null}]),Ct],ngContentSelectors:yeA,decls:5,vars:2,consts:[["role","rowgroup"],["headerRowOutlet",""],["role","rowgroup",1,"mdc-data-table__content"],["rowOutlet",""],["noDataRowOutlet",""],["footerRowOutlet",""]],template:function(i,n){i&1&&(Kt(weA),NA(0),NA(1,1),ne(2,DeA,1,0)(3,veA,7,0)(4,beA,4,0)),i&2&&(y(2),$(n._isServer?2:-1),y(),$(n._isNativeHtmlTable?3:4))},dependencies:[sH,rH,cH,aH],styles:[".mat-mdc-table-sticky{position:sticky !important}mat-table{display:block}mat-header-row{min-height:56px}mat-row,mat-footer-row{min-height:48px}mat-row,mat-header-row,mat-footer-row{display:flex;border-width:0;border-bottom-width:1px;border-style:solid;align-items:center;box-sizing:border-box}mat-cell:first-of-type,mat-header-cell:first-of-type,mat-footer-cell:first-of-type{padding-left:24px}[dir=rtl] mat-cell:first-of-type:not(:only-of-type),[dir=rtl] mat-header-cell:first-of-type:not(:only-of-type),[dir=rtl] mat-footer-cell:first-of-type:not(:only-of-type){padding-left:0;padding-right:24px}mat-cell:last-of-type,mat-header-cell:last-of-type,mat-footer-cell:last-of-type{padding-right:24px}[dir=rtl] mat-cell:last-of-type:not(:only-of-type),[dir=rtl] mat-header-cell:last-of-type:not(:only-of-type),[dir=rtl] mat-footer-cell:last-of-type:not(:only-of-type){padding-right:0;padding-left:24px}mat-cell,mat-header-cell,mat-footer-cell{flex:1;display:flex;align-items:center;overflow:hidden;word-wrap:break-word;min-height:inherit}.mat-mdc-table{min-width:100%;border:0;border-spacing:0;table-layout:auto;white-space:normal;background-color:var(--mat-table-background-color, var(--mat-sys-surface))}.mdc-data-table__cell{box-sizing:border-box;overflow:hidden;text-align:left;text-overflow:ellipsis}[dir=rtl] .mdc-data-table__cell{text-align:right}.mdc-data-table__cell,.mdc-data-table__header-cell{padding:0 16px}.mat-mdc-header-row{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:var(--mat-table-header-container-height, 56px);color:var(--mat-table-header-headline-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-table-header-headline-font, var(--mat-sys-title-small-font, Roboto, sans-serif));line-height:var(--mat-table-header-headline-line-height, var(--mat-sys-title-small-line-height));font-size:var(--mat-table-header-headline-size, var(--mat-sys-title-small-size, 14px));font-weight:var(--mat-table-header-headline-weight, var(--mat-sys-title-small-weight, 500))}.mat-mdc-row{height:var(--mat-table-row-item-container-height, 52px);color:var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)))}.mat-mdc-row,.mdc-data-table__content{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-table-row-item-label-text-font, var(--mat-sys-body-medium-font, Roboto, sans-serif));line-height:var(--mat-table-row-item-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-table-row-item-label-text-size, var(--mat-sys-body-medium-size, 14px));font-weight:var(--mat-table-row-item-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-footer-row{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:var(--mat-table-footer-container-height, 52px);color:var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-table-footer-supporting-text-font, var(--mat-sys-body-medium-font, Roboto, sans-serif));line-height:var(--mat-table-footer-supporting-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-table-footer-supporting-text-size, var(--mat-sys-body-medium-size, 14px));font-weight:var(--mat-table-footer-supporting-text-weight, var(--mat-sys-body-medium-weight));letter-spacing:var(--mat-table-footer-supporting-text-tracking, var(--mat-sys-body-medium-tracking))}.mat-mdc-header-cell{border-bottom-color:var(--mat-table-row-item-outline-color, var(--mat-sys-outline, rgba(0, 0, 0, 0.12)));border-bottom-width:var(--mat-table-row-item-outline-width, 1px);border-bottom-style:solid;letter-spacing:var(--mat-table-header-headline-tracking, var(--mat-sys-title-small-tracking));font-weight:inherit;line-height:inherit;box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;outline:none;text-align:left}[dir=rtl] .mat-mdc-header-cell{text-align:right}.mdc-data-table__row:last-child>.mat-mdc-header-cell{border-bottom:none}.mat-mdc-cell{border-bottom-color:var(--mat-table-row-item-outline-color, var(--mat-sys-outline, rgba(0, 0, 0, 0.12)));border-bottom-width:var(--mat-table-row-item-outline-width, 1px);border-bottom-style:solid;letter-spacing:var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking));line-height:inherit}.mdc-data-table__row:last-child>.mat-mdc-cell{border-bottom:none}.mat-mdc-footer-cell{letter-spacing:var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking))}mat-row.mat-mdc-row,mat-header-row.mat-mdc-header-row,mat-footer-row.mat-mdc-footer-row{border-bottom:none}.mat-mdc-table tbody,.mat-mdc-table tfoot,.mat-mdc-table thead,.mat-mdc-cell,.mat-mdc-footer-cell,.mat-mdc-header-row,.mat-mdc-row,.mat-mdc-footer-row,.mat-mdc-table .mat-mdc-header-cell{background:inherit}.mat-mdc-table mat-header-row.mat-mdc-header-row,.mat-mdc-table mat-row.mat-mdc-row,.mat-mdc-table mat-footer-row.mat-mdc-footer-cell{height:unset}mat-header-cell.mat-mdc-header-cell,mat-cell.mat-mdc-cell,mat-footer-cell.mat-mdc-footer-cell{align-self:stretch}"],encapsulation:2})}return t})(),ECe=(()=>{class t extends qM{static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275dir=Oe({type:t,selectors:[["","matCellDef",""]],features:[gt([{provide:qM,useExisting:t}]),Ct]})}return t})(),fCe=(()=>{class t extends WM{static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275dir=Oe({type:t,selectors:[["","matHeaderCellDef",""]],features:[gt([{provide:WM,useExisting:t}]),Ct]})}return t})();var QCe=(()=>{class t extends aQ{get name(){return this._name}set name(e){this._setNameInput(e)}_updateColumnCssClassName(){super._updateColumnCssClassName(),this._columnCssClassName.push(`mat-column-${this.cssClassFriendlyName}`)}static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275dir=Oe({type:t,selectors:[["","matColumnDef",""]],inputs:{name:[0,"matColumnDef","name"]},features:[gt([{provide:aQ,useExisting:t},{provide:"MAT_SORT_HEADER_COLUMN_DEF",useExisting:t}]),Ct]})}return t})(),mCe=(()=>{class t extends ICe{static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275dir=Oe({type:t,selectors:[["mat-header-cell"],["th","mat-header-cell",""]],hostAttrs:["role","columnheader",1,"mat-mdc-header-cell","mdc-data-table__header-cell"],features:[Ct]})}return t})();var pCe=(()=>{class t extends uCe{static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275dir=Oe({type:t,selectors:[["mat-cell"],["td","mat-cell",""]],hostAttrs:[1,"mat-mdc-cell","mdc-data-table__cell"],features:[Ct]})}return t})();var wCe=(()=>{class t extends a6{static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275dir=Oe({type:t,selectors:[["","matHeaderRowDef",""]],inputs:{columns:[0,"matHeaderRowDef","columns"],sticky:[2,"matHeaderRowDefSticky","sticky",IA]},features:[gt([{provide:a6,useExisting:t}]),Ct]})}return t})();var yCe=(()=>{class t extends ZM{static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275dir=Oe({type:t,selectors:[["","matRowDef",""]],inputs:{columns:[0,"matRowDefColumns","columns"],when:[0,"matRowDefWhen","when"]},features:[gt([{provide:ZM,useExisting:t}]),Ct]})}return t})(),DCe=(()=>{class t extends nH{static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275cmp=xe({type:t,selectors:[["mat-header-row"],["tr","mat-header-row",""]],hostAttrs:["role","row",1,"mat-mdc-header-row","mdc-data-table__header-row"],exportAs:["matHeaderRow"],features:[gt([{provide:nH,useExisting:t}]),Ct],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(i,n){i&1&&En(0,0)},dependencies:[uh],encapsulation:2})}return t})();var vCe=(()=>{class t extends oH{static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275cmp=xe({type:t,selectors:[["mat-row"],["tr","mat-row",""]],hostAttrs:["role","row",1,"mat-mdc-row","mdc-data-table__row"],exportAs:["matRow"],features:[gt([{provide:oH,useExisting:t}]),Ct],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(i,n){i&1&&En(0,0)},dependencies:[uh],encapsulation:2})}return t})();var MeA=9007199254740991,c6=class extends eD{_data;_renderData=new Mt([]);_filter=new Mt("");_internalPageChanges=new je;_renderChangesSubscription=null;filteredData;get data(){return this._data.value}set data(A){A=Array.isArray(A)?A:[],this._data.next(A),this._renderChangesSubscription||this._filterData(A)}get filter(){return this._filter.value}set filter(A){this._filter.next(A),this._renderChangesSubscription||this._filterData(this.data)}get sort(){return this._sort}set sort(A){this._sort=A,this._updateChangeSubscription()}_sort;get paginator(){return this._paginator}set paginator(A){this._paginator=A,this._updateChangeSubscription()}_paginator;sortingDataAccessor=(A,e)=>{let i=A[e];if(BN(i)){let n=Number(i);return n{let i=e.active,n=e.direction;return!i||n==""?A:A.sort((o,r)=>{let s=this.sortingDataAccessor(o,i),a=this.sortingDataAccessor(r,i),c=typeof s,l=typeof a;c!==l&&(c==="number"&&(s+=""),l==="number"&&(a+=""));let d=0;return s!=null&&a!=null?s>a?d=1:s{let i=e.trim().toLowerCase();return Object.values(A).some(n=>`${n}`.toLowerCase().includes(i))};constructor(A=[]){super(),this._data=new Mt(A),this._updateChangeSubscription()}_updateChangeSubscription(){let A=this._sort?Bi(this._sort.sortChange,this._sort.initialized):dA(null),e=this._paginator?Bi(this._paginator.page,this._internalPageChanges,this._paginator.initialized):dA(null),i=this._data,n=uc([i,this._filter]).pipe(aA(([s])=>this._filterData(s))),o=uc([n,A]).pipe(aA(([s])=>this._orderData(s))),r=uc([o,e]).pipe(aA(([s])=>this._pageData(s)));this._renderChangesSubscription?.unsubscribe(),this._renderChangesSubscription=r.subscribe(s=>this._renderData.next(s))}_filterData(A){return this.filteredData=this.filter==null||this.filter===""?A:A.filter(e=>this.filterPredicate(e,this.filter)),this.paginator&&this._updatePaginator(this.filteredData.length),this.filteredData}_orderData(A){return this.sort?this.sortData(A.slice(),this.sort):A}_pageData(A){if(!this.paginator)return A;let e=this.paginator.pageIndex*this.paginator.pageSize;return A.slice(e,e+this.paginator.pageSize)}_updatePaginator(A){Promise.resolve().then(()=>{let e=this.paginator;if(e&&(e.length=A,e.pageIndex>0)){let i=Math.ceil(e.length/e.pageSize)-1||0,n=Math.min(e.pageIndex,i);n!==e.pageIndex&&(e.pageIndex=n,this._internalPageChanges.next())}})}connect(){return this._renderChangesSubscription||this._updateChangeSubscription(),this._renderData}disconnect(){this._renderChangesSubscription?.unsubscribe(),this._renderChangesSubscription=null}};var bCe=[{metricName:"tool_trajectory_avg_score",threshold:1},{metricName:"response_match_score",threshold:.7}];var XM="0123456789abcdef",$M=class t{constructor(A){this.bytes=A}static ofInner(A){if(A.length!==16)throw new TypeError("not 128-bit length");return new t(A)}static fromFieldsV7(A,e,i,n){if(!Number.isInteger(A)||!Number.isInteger(e)||!Number.isInteger(i)||!Number.isInteger(n)||A<0||e<0||i<0||n<0||A>0xffffffffffff||e>4095||i>1073741823||n>4294967295)throw new RangeError("invalid field value");let o=new Uint8Array(16);return o[0]=A/2**40,o[1]=A/2**32,o[2]=A/2**24,o[3]=A/2**16,o[4]=A/2**8,o[5]=A,o[6]=112|e>>>8,o[7]=e,o[8]=128|i>>>24,o[9]=i>>>16,o[10]=i>>>8,o[11]=i,o[12]=n>>>24,o[13]=n>>>16,o[14]=n>>>8,o[15]=n,new t(o)}static parse(A){var e,i,n,o;let r;switch(A.length){case 32:r=(e=/^[0-9a-f]{32}$/i.exec(A))===null||e===void 0?void 0:e[0];break;case 36:r=(i=/^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(A))===null||i===void 0?void 0:i.slice(1,6).join("");break;case 38:r=(n=/^\{([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})\}$/i.exec(A))===null||n===void 0?void 0:n.slice(1,6).join("");break;case 45:r=(o=/^urn:uuid:([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(A))===null||o===void 0?void 0:o.slice(1,6).join("");break;default:break}if(r){let s=new Uint8Array(16);for(let a=0;a<16;a+=4){let c=parseInt(r.substring(2*a,2*a+8),16);s[a+0]=c>>>24,s[a+1]=c>>>16,s[a+2]=c>>>8,s[a+3]=c}return new t(s)}else throw new SyntaxError("could not parse UUID string")}toString(){let A="";for(let e=0;e>>4),A+=XM.charAt(this.bytes[e]&15),(e===3||e===5||e===7||e===9)&&(A+="-");return A}toHex(){let A="";for(let e=0;e>>4),A+=XM.charAt(this.bytes[e]&15);return A}toJSON(){return this.toString()}getVariant(){let A=this.bytes[8]>>>4;if(A<0)throw new Error("unreachable");if(A<=7)return this.bytes.every(e=>e===0)?"NIL":"VAR_0";if(A<=11)return"VAR_10";if(A<=13)return"VAR_110";if(A<=15)return this.bytes.every(e=>e===255)?"MAX":"VAR_RESERVED";throw new Error("unreachable")}getVersion(){return this.getVariant()==="VAR_10"?this.bytes[6]>>>4:void 0}clone(){return new t(this.bytes.slice(0))}equals(A){return this.compareTo(A)===0}compareTo(A){for(let e=0;e<16;e++){let i=this.bytes[e]-A.bytes[e];if(i!==0)return Math.sign(i)}return 0}},gH=class{constructor(A){this.timestamp=0,this.counter=0,this.random=A??SeA()}generate(){return this.generateOrResetCore(Date.now(),1e4)}generateOrAbort(){return this.generateOrAbortCore(Date.now(),1e4)}generateOrResetCore(A,e){let i=this.generateOrAbortCore(A,e);return i===void 0&&(this.timestamp=0,i=this.generateOrAbortCore(A,e)),i}generateOrAbortCore(A,e){if(!Number.isInteger(A)||A<1||A>0xffffffffffff)throw new RangeError("`unixTsMs` must be a 48-bit positive integer");if(e<0||e>0xffffffffffff)throw new RangeError("`rollbackAllowance` out of reasonable range");if(A>this.timestamp)this.timestamp=A,this.resetCounter();else if(A+e>=this.timestamp)this.counter++,this.counter>4398046511103&&(this.timestamp++,this.resetCounter());else return;return $M.fromFieldsV7(this.timestamp,Math.trunc(this.counter/2**30),this.counter&2**30-1,this.random.nextUint32())}resetCounter(){this.counter=this.random.nextUint32()*1024+(this.random.nextUint32()&1023)}generateV4(){let A=new Uint8Array(Uint32Array.of(this.random.nextUint32(),this.random.nextUint32(),this.random.nextUint32(),this.random.nextUint32()).buffer);return A[6]=64|A[6]>>>4,A[8]=128|A[8]>>>2,$M.ofInner(A)}},SeA=()=>{if(typeof crypto<"u"&&typeof crypto.getRandomValues<"u")return new dH;if(typeof UUIDV7_DENY_WEAK_RNG<"u"&&UUIDV7_DENY_WEAK_RNG)throw new Error("no cryptographically strong RNG available");return{nextUint32:()=>Math.trunc(Math.random()*65536)*65536+Math.trunc(Math.random()*65536)}},dH=class{constructor(){this.buffer=new Uint32Array(8),this.cursor=65535}nextUint32(){return this.cursor>=this.buffer.length&&(crypto.getRandomValues(this.buffer),this.cursor=0),this.buffer[this.cursor++]}},MCe;var e9=()=>keA().toString(),keA=()=>(MCe||(MCe=new gH)).generateV4();var A9=class t{evalService=E(od);data=E(qo);dialogRef=E(co);newCaseId="case"+e9().slice(0,6);constructor(){}createNewEvalCase(){!this.newCaseId||this.newCaseId==""?alert("Cannot create eval set with empty id!"):this.evalService.addCurrentSession(this.data.appName,this.data.evalSetId,this.newCaseId,this.data.sessionId,this.data.userId).subscribe(A=>{this.dialogRef.close(!0)})}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-add-eval-session-dialog"]],decls:11,vars:1,consts:[["mat-dialog-title",""],[2,"padding-left","20px","padding-right","24px"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(e,i){e&1&&(m(0,"h2",0),T(1,"Add Current Session To Eval Set"),p(),m(2,"mat-dialog-content"),T(3,` Please enter the eval case name +`),p(),m(4,"mat-form-field",1)(5,"input",2),qn("ngModelChange",function(o){return Vn(i.newCaseId,o)||(i.newCaseId=o),o}),ee("keydown.enter",function(){return i.createNewEvalCase()}),p()(),m(6,"mat-dialog-actions",3)(7,"button",4),T(8,"Cancel"),p(),m(9,"button",5),ee("click",function(){return i.createNewEvalCase()}),T(10,"Create"),p()()),e&2&&(y(5),jn("ngModel",i.newCaseId))},dependencies:[tr,jr,ds,Gs,Kn,Mr,Fo,Cr,kr,Un,Jl],encapsulation:2})};var xeA={allEvalSetsHeader:"All eval sets",createNewEvalSetTooltip:"Create new evaluation set",createNewEvalSetTitle:"Create New Evaluation Set",evalSetDescription:"An evaluation set is a curated collection of evaluation cases, where each case includes input-output examples for assessing agent performance.",createEvalSetButton:"Create Evaluation Set",runEvaluationButton:"Run Evaluation",viewEvalRunHistoryTooltip:"View eval run history",caseIdHeader:"Case ID",resultHeader:"Result",viewEvalRunResultTooltip:"View eval run result",passStatus:"Pass",failStatus:"Fail",passStatusCaps:"PASS",failStatusCaps:"FAIL",passedSuffix:"Passed",failedSuffix:"Failed",addSessionToSetButtonPrefix:"Add current session to"},SCe=new re("Eval Tab Messages",{factory:()=>xeA});var t9=class t{evalService=E(od);data=E(qo);dialogRef=E(co);newSetId="evalset"+e9().slice(0,6);constructor(){}createNewEvalSet(){!this.newSetId||this.newSetId==""?alert("Cannot create eval set with empty id!"):this.evalService.createNewEvalSet(this.data.appName,this.newSetId).subscribe(A=>{this.dialogRef.close(!0)})}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-new-eval-set-dialog-component"]],decls:11,vars:1,consts:[["mat-dialog-title",""],[2,"padding-left","20px","padding-right","24px"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(e,i){e&1&&(m(0,"h2",0),T(1,"Create New Eval Set"),p(),m(2,"mat-dialog-content"),T(3,` Please enter the eval set name +`),p(),m(4,"mat-form-field",1)(5,"input",2),qn("ngModelChange",function(o){return Vn(i.newSetId,o)||(i.newSetId=o),o}),ee("keydown.enter",function(){return i.createNewEvalSet()}),p()(),m(6,"mat-dialog-actions",3)(7,"button",4),T(8,"Cancel"),p(),m(9,"button",5),ee("click",function(){return i.createNewEvalSet()}),T(10,"Create"),p()()),e&2&&(y(5),jn("ngModel",i.newSetId))},dependencies:[tr,jr,ds,Gs,Kn,Mr,Fo,Cr,kr,Un,Jl],encapsulation:2})};var _eA=["knob"],ReA=["valueIndicatorContainer"];function NeA(t,A){if(t&1&&(m(0,"div",2,1)(2,"div",5)(3,"span",6),T(4),p()()()),t&2){let e=M();y(4),Pe(e.valueIndicatorText)}}var LeA=["trackActive"],FeA=["*"];function GeA(t,A){if(t&1&&ve(0,"div"),t&2){let e=A.$implicit,i=A.$index,n=M(3);Lo(e===0?"mdc-slider__tick-mark--active":"mdc-slider__tick-mark--inactive"),cn("transform",n._calcTickMarkTransform(i))}}function KeA(t,A){if(t&1&&Rt(0,GeA,1,4,"div",8,b1),t&2){let e=M(2);Nt(e._tickMarks)}}function UeA(t,A){if(t&1&&(m(0,"div",6,1),ne(2,KeA,2,0),p()),t&2){let e=M();y(2),$(e._cachedWidth?2:-1)}}function TeA(t,A){if(t&1&&ve(0,"mat-slider-visual-thumb",7),t&2){let e=M();te("discrete",e.discrete)("thumbPosition",1)("valueIndicatorText",e.startValueIndicatorText)}}var bi=function(t){return t[t.START=1]="START",t[t.END=2]="END",t}(bi||{}),cQ=function(t){return t[t.ACTIVE=0]="ACTIVE",t[t.INACTIVE=1]="INACTIVE",t}(cQ||{}),CH=new re("_MatSlider"),kCe=new re("_MatSliderThumb"),OeA=new re("_MatSliderRangeThumb"),xCe=new re("_MatSliderVisualThumb");var JeA=(()=>{class t{_cdr=E(ut);_ngZone=E(yA);_slider=E(CH);_renderer=E(an);_listenerCleanups;discrete;thumbPosition;valueIndicatorText;_ripple;_knob;_valueIndicatorContainer;_sliderInput;_sliderInputEl;_hoverRippleRef;_focusRippleRef;_activeRippleRef;_isHovered=!1;_isActive=!1;_isValueIndicatorVisible=!1;_hostElement=E(eA).nativeElement;_platform=E(mi);constructor(){}ngAfterViewInit(){let e=this._slider._getInput(this.thumbPosition);e&&(this._ripple.radius=24,this._sliderInput=e,this._sliderInputEl=this._sliderInput._hostElement,this._ngZone.runOutsideAngular(()=>{let i=this._sliderInputEl,n=this._renderer;this._listenerCleanups=[n.listen(i,"pointermove",this._onPointerMove),n.listen(i,"pointerdown",this._onDragStart),n.listen(i,"pointerup",this._onDragEnd),n.listen(i,"pointerleave",this._onMouseLeave),n.listen(i,"focus",this._onFocus),n.listen(i,"blur",this._onBlur)]}))}ngOnDestroy(){this._listenerCleanups?.forEach(e=>e())}_onPointerMove=e=>{if(this._sliderInput._isFocused)return;let i=this._hostElement.getBoundingClientRect(),n=this._slider._isCursorOnSliderThumb(e,i);this._isHovered=n,n?this._showHoverRipple():this._hideRipple(this._hoverRippleRef)};_onMouseLeave=()=>{this._isHovered=!1,this._hideRipple(this._hoverRippleRef)};_onFocus=()=>{this._hideRipple(this._hoverRippleRef),this._showFocusRipple(),this._hostElement.classList.add("mdc-slider__thumb--focused")};_onBlur=()=>{this._isActive||this._hideRipple(this._focusRippleRef),this._isHovered&&this._showHoverRipple(),this._hostElement.classList.remove("mdc-slider__thumb--focused")};_onDragStart=e=>{e.button===0&&(this._isActive=!0,this._showActiveRipple())};_onDragEnd=()=>{this._isActive=!1,this._hideRipple(this._activeRippleRef),this._sliderInput._isFocused||this._hideRipple(this._focusRippleRef),this._platform.SAFARI&&this._showHoverRipple()};_showHoverRipple(){this._isShowingRipple(this._hoverRippleRef)||(this._hoverRippleRef=this._showRipple({enterDuration:0,exitDuration:0}),this._hoverRippleRef?.element.classList.add("mat-mdc-slider-hover-ripple"))}_showFocusRipple(){this._isShowingRipple(this._focusRippleRef)||(this._focusRippleRef=this._showRipple({enterDuration:0,exitDuration:0},!0),this._focusRippleRef?.element.classList.add("mat-mdc-slider-focus-ripple"))}_showActiveRipple(){this._isShowingRipple(this._activeRippleRef)||(this._activeRippleRef=this._showRipple({enterDuration:225,exitDuration:400}),this._activeRippleRef?.element.classList.add("mat-mdc-slider-active-ripple"))}_isShowingRipple(e){return e?.state===Xa.FADING_IN||e?.state===Xa.VISIBLE}_showRipple(e,i){if(!this._slider.disabled&&(this._showValueIndicator(),this._slider._isRange&&this._slider._getThumb(this.thumbPosition===bi.START?bi.END:bi.START)._showValueIndicator(),!(this._slider._globalRippleOptions?.disabled&&!i)))return this._ripple.launch({animation:this._slider._noopAnimations?{enterDuration:0,exitDuration:0}:e,centered:!0,persistent:!0})}_hideRipple(e){if(e?.fadeOut(),this._isShowingAnyRipple())return;this._slider._isRange||this._hideValueIndicator();let i=this._getSibling();i._isShowingAnyRipple()||(this._hideValueIndicator(),i._hideValueIndicator())}_showValueIndicator(){this._hostElement.classList.add("mdc-slider__thumb--with-indicator")}_hideValueIndicator(){this._hostElement.classList.remove("mdc-slider__thumb--with-indicator")}_getSibling(){return this._slider._getThumb(this.thumbPosition===bi.START?bi.END:bi.START)}_getValueIndicatorContainer(){return this._valueIndicatorContainer?.nativeElement}_getKnob(){return this._knob.nativeElement}_isShowingAnyRipple(){return this._isShowingRipple(this._hoverRippleRef)||this._isShowingRipple(this._focusRippleRef)||this._isShowingRipple(this._activeRippleRef)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-slider-visual-thumb"]],viewQuery:function(i,n){if(i&1&&(At(ec,5),At(_eA,5),At(ReA,5)),i&2){let o;oA(o=rA())&&(n._ripple=o.first),oA(o=rA())&&(n._knob=o.first),oA(o=rA())&&(n._valueIndicatorContainer=o.first)}},hostAttrs:[1,"mdc-slider__thumb","mat-mdc-slider-visual-thumb"],inputs:{discrete:"discrete",thumbPosition:"thumbPosition",valueIndicatorText:"valueIndicatorText"},features:[gt([{provide:xCe,useExisting:t}])],decls:4,vars:2,consts:[["knob",""],["valueIndicatorContainer",""],[1,"mdc-slider__value-indicator-container"],[1,"mdc-slider__thumb-knob"],["matRipple","",1,"mat-focus-indicator",3,"matRippleDisabled"],[1,"mdc-slider__value-indicator"],[1,"mdc-slider__value-indicator-text"]],template:function(i,n){i&1&&(ne(0,NeA,5,1,"div",2),ve(1,"div",3,0)(3,"div",4)),i&2&&($(n.discrete?0:-1),y(3),te("matRippleDisabled",!0))},dependencies:[ec],styles:[".mat-mdc-slider-visual-thumb .mat-ripple{height:100%;width:100%}.mat-mdc-slider .mdc-slider__tick-marks{justify-content:start}.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--active,.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--inactive{position:absolute;left:2px}"],encapsulation:2,changeDetection:0})}return t})(),_Ce=(()=>{class t{_ngZone=E(yA);_cdr=E(ut);_elementRef=E(eA);_dir=E(Do,{optional:!0});_globalRippleOptions=E(I2,{optional:!0});_trackActive;_thumbs;_input;_inputs;get disabled(){return this._disabled}set disabled(e){this._disabled=e;let i=this._getInput(bi.END),n=this._getInput(bi.START);i&&(i.disabled=this._disabled),n&&(n.disabled=this._disabled)}_disabled=!1;get discrete(){return this._discrete}set discrete(e){this._discrete=e,this._updateValueIndicatorUIs()}_discrete=!1;showTickMarks=!1;get min(){return this._min}set min(e){let i=isNaN(e)?this._min:e;this._min!==i&&this._updateMin(i)}_min=0;color;disableRipple=!1;_updateMin(e){let i=this._min;this._min=e,this._isRange?this._updateMinRange({old:i,new:e}):this._updateMinNonRange(e),this._onMinMaxOrStepChange()}_updateMinRange(e){let i=this._getInput(bi.END),n=this._getInput(bi.START),o=i.value,r=n.value;n.min=e.new,i.min=Math.max(e.new,n.value),n.max=Math.min(i.max,i.value),n._updateWidthInactive(),i._updateWidthInactive(),e.newe.old?this._onTranslateXChangeBySideEffect(n,i):this._onTranslateXChangeBySideEffect(i,n),o!==i.value&&this._onValueChange(i),r!==n.value&&this._onValueChange(n)}_updateMaxNonRange(e){let i=this._getInput(bi.END);if(i){let n=i.value;i.max=e,i._updateThumbUIByValue(),this._updateTrackUI(i),n!==i.value&&this._onValueChange(i)}}get step(){return this._step}set step(e){let i=isNaN(e)?this._step:e;this._step!==i&&this._updateStep(i)}_step=1;_updateStep(e){this._step=e,this._isRange?this._updateStepRange():this._updateStepNonRange(),this._onMinMaxOrStepChange()}_updateStepRange(){let e=this._getInput(bi.END),i=this._getInput(bi.START),n=e.value,o=i.value,r=i.value;e.min=this._min,i.max=this._max,e.step=this._step,i.step=this._step,this._platform.SAFARI&&(e.value=e.value,i.value=i.value),e.min=Math.max(this._min,i.value),i.max=Math.min(this._max,e.value),i._updateWidthInactive(),e._updateWidthInactive(),e.value`${e}`;_tickMarks;_noopAnimations;_dirChangeSubscription;_resizeObserver;_cachedWidth;_cachedLeft;_rippleRadius=24;startValueIndicatorText="";endValueIndicatorText="";_endThumbTransform;_startThumbTransform;_isRange=!1;_isRtl=!1;_hasViewInitialized=!1;_tickMarkTrackWidth=0;_hasAnimation=!1;_resizeTimer=null;_platform=E(mi);constructor(){E(Wn).load(Pr);let e=E(Oi,{optional:!0});this._noopAnimations=e==="NoopAnimations",this._dir&&(this._dirChangeSubscription=this._dir.change.subscribe(()=>this._onDirChange()),this._isRtl=this._dir.value==="rtl")}_knobRadius=8;_inputPadding;ngAfterViewInit(){this._platform.isBrowser&&this._updateDimensions();let e=this._getInput(bi.END),i=this._getInput(bi.START);this._isRange=!!e&&!!i,this._cdr.detectChanges();let n=this._getThumb(bi.END);this._rippleRadius=n._ripple.radius,this._inputPadding=this._rippleRadius-this._knobRadius,this._isRange?this._initUIRange(e,i):this._initUINonRange(e),this._updateTrackUI(e),this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._observeHostResize(),this._cdr.detectChanges()}_initUINonRange(e){e.initProps(),e.initUI(),this._updateValueIndicatorUI(e),this._hasViewInitialized=!0,e._updateThumbUIByValue()}_initUIRange(e,i){e.initProps(),e.initUI(),i.initProps(),i.initUI(),e._updateMinMax(),i._updateMinMax(),e._updateStaticStyles(),i._updateStaticStyles(),this._updateValueIndicatorUIs(),this._hasViewInitialized=!0,e._updateThumbUIByValue(),i._updateThumbUIByValue()}ngOnDestroy(){this._dirChangeSubscription.unsubscribe(),this._resizeObserver?.disconnect(),this._resizeObserver=null}_onDirChange(){this._isRtl=this._dir?.value==="rtl",this._isRange?this._onDirChangeRange():this._onDirChangeNonRange(),this._updateTickMarkUI()}_onDirChangeRange(){let e=this._getInput(bi.END),i=this._getInput(bi.START);e._setIsLeftThumb(),i._setIsLeftThumb(),e.translateX=e._calcTranslateXByValue(),i.translateX=i._calcTranslateXByValue(),e._updateStaticStyles(),i._updateStaticStyles(),e._updateWidthInactive(),i._updateWidthInactive(),e._updateThumbUIByValue(),i._updateThumbUIByValue()}_onDirChangeNonRange(){this._getInput(bi.END)._updateThumbUIByValue()}_observeHostResize(){typeof ResizeObserver>"u"||!ResizeObserver||this._ngZone.runOutsideAngular(()=>{this._resizeObserver=new ResizeObserver(()=>{this._isActive()||(this._resizeTimer&&clearTimeout(this._resizeTimer),this._onResize())}),this._resizeObserver.observe(this._elementRef.nativeElement)})}_isActive(){return this._getThumb(bi.START)._isActive||this._getThumb(bi.END)._isActive}_getValue(e=bi.END){let i=this._getInput(e);return i?i.value:this.min}_skipUpdate(){return!!(this._getInput(bi.START)?._skipUIUpdate||this._getInput(bi.END)?._skipUIUpdate)}_updateDimensions(){this._cachedWidth=this._elementRef.nativeElement.offsetWidth,this._cachedLeft=this._elementRef.nativeElement.getBoundingClientRect().left}_setTrackActiveStyles(e){let i=this._trackActive.nativeElement.style;i.left=e.left,i.right=e.right,i.transformOrigin=e.transformOrigin,i.transform=e.transform}_calcTickMarkTransform(e){let i=e*(this._tickMarkTrackWidth/(this._tickMarks.length-1));return`translateX(${this._isRtl?this._cachedWidth-6-i:i}px`}_onTranslateXChange(e){this._hasViewInitialized&&(this._updateThumbUI(e),this._updateTrackUI(e),this._updateOverlappingThumbUI(e))}_onTranslateXChangeBySideEffect(e,i){this._hasViewInitialized&&(e._updateThumbUIByValue(),i._updateThumbUIByValue())}_onValueChange(e){this._hasViewInitialized&&(this._updateValueIndicatorUI(e),this._updateTickMarkUI(),this._cdr.detectChanges())}_onMinMaxOrStepChange(){this._hasViewInitialized&&(this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._cdr.markForCheck())}_onResize(){if(this._hasViewInitialized){if(this._updateDimensions(),this._isRange){let e=this._getInput(bi.END),i=this._getInput(bi.START);e._updateThumbUIByValue(),i._updateThumbUIByValue(),e._updateStaticStyles(),i._updateStaticStyles(),e._updateMinMax(),i._updateMinMax(),e._updateWidthInactive(),i._updateWidthInactive()}else{let e=this._getInput(bi.END);e&&e._updateThumbUIByValue()}this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._cdr.detectChanges()}}_thumbsOverlap=!1;_areThumbsOverlapping(){let e=this._getInput(bi.START),i=this._getInput(bi.END);return!e||!i?!1:i.translateX-e.translateX<20}_updateOverlappingThumbClassNames(e){let i=e.getSibling(),n=this._getThumb(e.thumbPosition);this._getThumb(i.thumbPosition)._hostElement.classList.remove("mdc-slider__thumb--top"),n._hostElement.classList.toggle("mdc-slider__thumb--top",this._thumbsOverlap)}_updateOverlappingThumbUI(e){!this._isRange||this._skipUpdate()||this._thumbsOverlap!==this._areThumbsOverlapping()&&(this._thumbsOverlap=!this._thumbsOverlap,this._updateOverlappingThumbClassNames(e))}_updateThumbUI(e){if(this._skipUpdate())return;let i=this._getThumb(e.thumbPosition===bi.END?bi.END:bi.START);i._hostElement.style.transform=`translateX(${e.translateX}px)`}_updateValueIndicatorUI(e){if(this._skipUpdate())return;let i=this.displayWith(e.value);if(this._hasViewInitialized?e._valuetext.set(i):e._hostElement.setAttribute("aria-valuetext",i),this.discrete){e.thumbPosition===bi.START?this.startValueIndicatorText=i:this.endValueIndicatorText=i;let n=this._getThumb(e.thumbPosition);i.length<3?n._hostElement.classList.add("mdc-slider__thumb--short-value"):n._hostElement.classList.remove("mdc-slider__thumb--short-value")}}_updateValueIndicatorUIs(){let e=this._getInput(bi.END),i=this._getInput(bi.START);e&&this._updateValueIndicatorUI(e),i&&this._updateValueIndicatorUI(i)}_updateTickMarkTrackUI(){if(!this.showTickMarks||this._skipUpdate())return;let e=this._step&&this._step>0?this._step:1,n=(Math.floor(this.max/e)*e-this.min)/(this.max-this.min);this._tickMarkTrackWidth=(this._cachedWidth-6)*n}_updateTrackUI(e){this._skipUpdate()||(this._isRange?this._updateTrackUIRange(e):this._updateTrackUINonRange(e))}_updateTrackUIRange(e){let i=e.getSibling();if(!i||!this._cachedWidth)return;let n=Math.abs(i.translateX-e.translateX)/this._cachedWidth;e._isLeftThumb&&this._cachedWidth?this._setTrackActiveStyles({left:"auto",right:`${this._cachedWidth-i.translateX}px`,transformOrigin:"right",transform:`scaleX(${n})`}):this._setTrackActiveStyles({left:`${i.translateX}px`,right:"auto",transformOrigin:"left",transform:`scaleX(${n})`})}_updateTrackUINonRange(e){this._isRtl?this._setTrackActiveStyles({left:"auto",right:"0px",transformOrigin:"right",transform:`scaleX(${1-e.fillPercentage})`}):this._setTrackActiveStyles({left:"0px",right:"auto",transformOrigin:"left",transform:`scaleX(${e.fillPercentage})`})}_updateTickMarkUI(){if(!this.showTickMarks||this.step===void 0||this.min===void 0||this.max===void 0)return;let e=this.step>0?this.step:1;this._isRange?this._updateTickMarkUIRange(e):this._updateTickMarkUINonRange(e)}_updateTickMarkUINonRange(e){let i=this._getValue(),n=Math.max(Math.round((i-this.min)/e),0)+1,o=Math.max(Math.round((this.max-i)/e),0)-1;this._isRtl?n++:o++,this._tickMarks=Array(n).fill(cQ.ACTIVE).concat(Array(o).fill(cQ.INACTIVE))}_updateTickMarkUIRange(e){let i=this._getValue(),n=this._getValue(bi.START),o=Math.max(Math.round((n-this.min)/e),0),r=Math.max(Math.round((i-n)/e)+1,0),s=Math.max(Math.round((this.max-i)/e),0);this._tickMarks=Array(o).fill(cQ.INACTIVE).concat(Array(r).fill(cQ.ACTIVE),Array(s).fill(cQ.INACTIVE))}_getInput(e){if(e===bi.END&&this._input)return this._input;if(this._inputs?.length)return e===bi.START?this._inputs.first:this._inputs.last}_getThumb(e){return e===bi.END?this._thumbs?.last:this._thumbs?.first}_setTransition(e){this._hasAnimation=!this._platform.IOS&&e&&!this._noopAnimations,this._elementRef.nativeElement.classList.toggle("mat-mdc-slider-with-animation",this._hasAnimation)}_isCursorOnSliderThumb(e,i){let n=i.width/2,o=i.x+n,r=i.y+n,s=e.clientX-o,a=e.clientY-r;return Math.pow(s,2)+Math.pow(a,2)IH),multi:!0};var IH=(()=>{class t{_ngZone=E(yA);_elementRef=E(eA);_cdr=E(ut);_slider=E(CH);_platform=E(mi);_listenerCleanups;get value(){return ln(this._hostElement.value,0)}set value(e){e=isNaN(e)?0:e;let i=e+"";if(!this._hasSetInitialValue){this._initialValue=i;return}this._isActive||this._setValue(i)}_setValue(e){this._hostElement.value=e,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges(),this._slider._cdr.markForCheck()}valueChange=new Ve;dragStart=new Ve;dragEnd=new Ve;get translateX(){return this._slider.min>=this._slider.max?(this._translateX=this._tickMarkOffset,this._translateX):(this._translateX===void 0&&(this._translateX=this._calcTranslateXByValue()),this._translateX)}set translateX(e){this._translateX=e}_translateX;thumbPosition=bi.END;get min(){return ln(this._hostElement.min,0)}set min(e){this._hostElement.min=e+"",this._cdr.detectChanges()}get max(){return ln(this._hostElement.max,0)}set max(e){this._hostElement.max=e+"",this._cdr.detectChanges()}get step(){return ln(this._hostElement.step,0)}set step(e){this._hostElement.step=e+"",this._cdr.detectChanges()}get disabled(){return IA(this._hostElement.disabled)}set disabled(e){this._hostElement.disabled=e,this._cdr.detectChanges(),this._slider.disabled!==this.disabled&&(this._slider.disabled=this.disabled)}get percentage(){return this._slider.min>=this._slider.max?this._slider._isRtl?1:0:(this.value-this._slider.min)/(this._slider.max-this._slider.min)}get fillPercentage(){return this._slider._cachedWidth?this._translateX===0?0:this.translateX/this._slider._cachedWidth:this._slider._isRtl?1:0}_hostElement=this._elementRef.nativeElement;_valuetext=mA("");_knobRadius=8;_tickMarkOffset=3;_isActive=!1;_isFocused=!1;_setIsFocused(e){this._isFocused=e}_hasSetInitialValue=!1;_initialValue;_formControl;_destroyed=new je;_skipUIUpdate=!1;_onChangeFn;_onTouchedFn=()=>{};_isControlInitialized=!1;constructor(){let e=E(an);this._ngZone.runOutsideAngular(()=>{this._listenerCleanups=[e.listen(this._hostElement,"pointerdown",this._onPointerDown.bind(this)),e.listen(this._hostElement,"pointermove",this._onPointerMove.bind(this)),e.listen(this._hostElement,"pointerup",this._onPointerUp.bind(this))]})}ngOnDestroy(){this._listenerCleanups.forEach(e=>e()),this._destroyed.next(),this._destroyed.complete(),this.dragStart.complete(),this.dragEnd.complete()}initProps(){this._updateWidthInactive(),this.disabled!==this._slider.disabled&&(this._slider.disabled=!0),this.step=this._slider.step,this.min=this._slider.min,this.max=this._slider.max,this._initValue()}initUI(){this._updateThumbUIByValue()}_initValue(){this._hasSetInitialValue=!0,this._initialValue===void 0?this.value=this._getDefaultValue():(this._hostElement.value=this._initialValue,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges())}_getDefaultValue(){return this.min}_onBlur(){this._setIsFocused(!1),this._onTouchedFn()}_onFocus(){this._slider._setTransition(!1),this._slider._updateTrackUI(this),this._setIsFocused(!0)}_onChange(){this.valueChange.emit(this.value),this._isActive&&this._updateThumbUIByValue({withAnimation:!0})}_onInput(){this._onChangeFn?.(this.value),(this._slider.step||!this._isActive)&&this._updateThumbUIByValue({withAnimation:!0}),this._slider._onValueChange(this)}_onNgControlValueChange(){(!this._isActive||!this._isFocused)&&(this._slider._onValueChange(this),this._updateThumbUIByValue()),this._slider.disabled=this._formControl.disabled}_onPointerDown(e){if(!(this.disabled||e.button!==0)){if(this._platform.IOS){let i=this._slider._isCursorOnSliderThumb(e,this._slider._getThumb(this.thumbPosition)._hostElement.getBoundingClientRect());this._isActive=i,this._updateWidthActive(),this._slider._updateDimensions();return}this._isActive=!0,this._setIsFocused(!0),this._updateWidthActive(),this._slider._updateDimensions(),this._slider.step||this._updateThumbUIByPointerEvent(e,{withAnimation:!0}),this.disabled||(this._handleValueCorrection(e),this.dragStart.emit({source:this,parent:this._slider,value:this.value}))}}_handleValueCorrection(e){this._skipUIUpdate=!0,setTimeout(()=>{this._skipUIUpdate=!1,this._fixValue(e)},0)}_fixValue(e){let i=e.clientX-this._slider._cachedLeft,n=this._slider._cachedWidth,o=this._slider.step===0?1:this._slider.step,r=Math.floor((this._slider.max-this._slider.min)/o),s=this._slider._isRtl?1-i/n:i/n,c=Math.round(s*r)/r*(this._slider.max-this._slider.min)+this._slider.min,l=Math.round(c/o)*o,d=this.value;if(l===d){this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(e,{withAnimation:this._slider._hasAnimation});return}this.value=l,this.valueChange.emit(this.value),this._onChangeFn?.(this.value),this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(e,{withAnimation:this._slider._hasAnimation})}_onPointerMove(e){!this._slider.step&&this._isActive&&this._updateThumbUIByPointerEvent(e)}_onPointerUp(){this._isActive&&(this._isActive=!1,this._platform.SAFARI&&this._setIsFocused(!1),this.dragEnd.emit({source:this,parent:this._slider,value:this.value}),setTimeout(()=>this._updateWidthInactive(),this._platform.IOS?10:0))}_clamp(e){let i=this._tickMarkOffset,n=this._slider._cachedWidth-this._tickMarkOffset;return Math.max(Math.min(e,n),i)}_calcTranslateXByValue(){return this._slider._isRtl?(1-this.percentage)*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset:this.percentage*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset}_calcTranslateXByPointerEvent(e){return e.clientX-this._slider._cachedLeft}_updateWidthActive(){}_updateWidthInactive(){this._hostElement.style.padding=`0 ${this._slider._inputPadding}px`,this._hostElement.style.width=`calc(100% + ${this._slider._inputPadding-this._tickMarkOffset*2}px)`,this._hostElement.style.left=`-${this._slider._rippleRadius-this._tickMarkOffset}px`}_updateThumbUIByValue(e){this.translateX=this._clamp(this._calcTranslateXByValue()),this._updateThumbUI(e)}_updateThumbUIByPointerEvent(e,i){this.translateX=this._clamp(this._calcTranslateXByPointerEvent(e)),this._updateThumbUI(i)}_updateThumbUI(e){this._slider._setTransition(!!e?.withAnimation),this._slider._onTranslateXChange(this)}writeValue(e){(this._isControlInitialized||e!==null)&&(this.value=e)}registerOnChange(e){this._onChangeFn=e,this._isControlInitialized=!0}registerOnTouched(e){this._onTouchedFn=e}setDisabledState(e){this.disabled=e}focus(){this._hostElement.focus()}blur(){this._hostElement.blur()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["input","matSliderThumb",""]],hostAttrs:["type","range",1,"mdc-slider__input"],hostVars:1,hostBindings:function(i,n){i&1&&ee("change",function(){return n._onChange()})("input",function(){return n._onInput()})("blur",function(){return n._onBlur()})("focus",function(){return n._onFocus()}),i&2&&AA("aria-valuetext",n._valuetext())},inputs:{value:[2,"value","value",ln]},outputs:{valueChange:"valueChange",dragStart:"dragStart",dragEnd:"dragEnd"},exportAs:["matSliderThumb"],features:[gt([YeA,{provide:kCe,useExisting:t}])]})}return t})();var i9=class t{constructor(A,e,i){this.dialogRef=A;this.fb=e;this.data=i;this.evalMetrics=this.data.evalMetrics,this.evalForm=this.fb.group({tool_trajectory_avg_score_threshold:[this.getEvalMetricThresholdFromData("tool_trajectory_avg_score"),[ol.required,ol.min(0),ol.max(1)]],response_match_score_threshold:[this.getEvalMetricThresholdFromData("response_match_score"),[ol.required,ol.min(0),ol.max(1)]]})}evalForm;evalMetrics=[];getEvalMetricThresholdFromData(A){return this.evalMetrics.find(e=>e.metricName===A)?.threshold??0}onStart(){if(this.evalForm.valid){let{tool_trajectory_avg_score_threshold:A,response_match_score_threshold:e}=this.evalForm.value;for(let i of this.evalMetrics)i.metricName==="tool_trajectory_avg_score"?i.threshold=A:i.metricName==="response_match_score"&&(i.threshold=e);this.dialogRef.close(this.evalMetrics)}}onCancel(){this.dialogRef.close(null)}static \u0275fac=function(e){return new(e||t)(DA(co),DA(GZ),DA(qo))};static \u0275cmp=xe({type:t,selectors:[["app-run-eval-config-dialog"]],decls:26,vars:3,consts:[[1,"dialog-container"],["mat-dialog-title","",1,"dialog-title"],[1,"eval-form",3,"formGroup"],[1,"metric-row"],[1,"metric-name"],[1,"flex-1","pl-4"],["min","0","max","1","step","0.1","thumbLabel","",1,"threshold-slider"],["matSliderThumb","","formControlName","tool_trajectory_avg_score_threshold"],[1,"threshold-value"],["matSliderThumb","","formControlName","response_match_score_threshold"],["align","end",1,"dialog-actions"],["mat-button","",1,"cancel-button",3,"click"],["mat-button","",1,"save-button",3,"click"]],template:function(e,i){e&1&&(m(0,"div",0)(1,"h2",1),T(2,"EVALUATION METRIC"),p(),m(3,"mat-dialog-content")(4,"form",2)(5,"div",3)(6,"div",4),T(7,"Tool trajectory avg score: "),p(),m(8,"div",5)(9,"mat-slider",6),ve(10,"input",7),p(),m(11,"span",8),T(12),p()()(),m(13,"div",3)(14,"div",4),T(15,"Response match score: "),p(),m(16,"div",5)(17,"mat-slider",6),ve(18,"input",9),p(),m(19,"span",8),T(20),p()()()()(),m(21,"mat-dialog-actions",10)(22,"button",11),ee("click",function(){return i.onCancel()}),T(23,"Cancel"),p(),m(24,"button",12),ee("click",function(){return i.onStart()}),T(25,"Start"),p()()()),e&2&&(y(4),te("formGroup",i.evalForm),y(8),FA(" ",i.evalForm.controls.tool_trajectory_avg_score_threshold.value," "),y(8),FA(" ",i.evalForm.controls.response_match_score_threshold.value," "))},dependencies:[tr,jr,Kn,LZ,Mr,Fo,MZ,RB,jI,lN,_Ce,IH,kr,Un],styles:[".dialog-container[_ngcontent-%COMP%]{border-radius:12px;padding:18px;width:500px;box-shadow:0 8px 16px var(--run-eval-config-dialog-container-box-shadow-color)}.threshold-slider[_ngcontent-%COMP%]{--mdc-slider-active-track-color: var(--run-eval-config-dialog-threshold-slider-active-track-color);--mdc-slider-inactive-track-color: var(--run-eval-config-dialog-threshold-slider-inactive-track-color);--mdc-slider-handle-color: var(--run-eval-config-dialog-threshold-slider-handle-color);--mdc-slider-ripple-color: var(--run-eval-config-dialog-threshold-slider-ripple-color);width:100px}.metric-row[_ngcontent-%COMP%]{display:flex;flex-direction:row;align-items:center}.metric-name[_ngcontent-%COMP%]{width:250px}.threshold-value[_ngcontent-%COMP%]{margin-left:20px}.mdc-slider__thumb--with-indicator[_ngcontent-%COMP%]{background-color:var(--mdc-slider-handle-color, var(--run-eval-config-dialog-mdc-slider-thumb-background-color));border:none!important;box-shadow:none!important}"]})};function HeA(t,A){if(t&1){let e=Ue();m(0,"div",1)(1,"div"),T(2),p(),m(3,"mat-icon",2),ee("click",function(){q(e);let n=M();return W(n.openNewEvalSetDialog())}),T(4,"add"),p()()}if(t&2){let e=M();y(2),Pe(e.i18n.allEvalSetsHeader),y(),te("matTooltip",e.i18n.createNewEvalSetTooltip)}}function zeA(t,A){if(t&1){let e=Ue();m(0,"div")(1,"div",3)(2,"div",4),T(3),p(),m(4,"div",5),T(5),p(),m(6,"div",6),ee("click",function(){q(e);let n=M();return W(n.openNewEvalSetDialog())}),T(7),p()()()}if(t&2){let e=M();y(3),FA(" ",e.i18n.createNewEvalSetTitle," "),y(2),FA(" ",e.i18n.evalSetDescription," "),y(2),FA(" ",e.i18n.createEvalSetButton," ")}}function PeA(t,A){if(t&1){let e=Ue();m(0,"div",8),ee("click",function(){let n=q(e).$implicit,o=M(2);return W(o.selectEvalSet(n))}),m(1,"div",9)(2,"span",10),T(3,"folder"),p(),m(4,"div",11),T(5),p()(),m(6,"div")(7,"mat-icon",12),T(8,"chevron_right"),p()()()}if(t&2){let e=A.$implicit;y(5),Pe(e)}}function jeA(t,A){if(t&1&&(m(0,"div"),Rt(1,PeA,9,1,"div",7,Fi),p()),t&2){let e=M();y(),Nt(e.evalsets)}}function VeA(t,A){if(t&1){let e=Ue();m(0,"th",29)(1,"mat-checkbox",30),ee("change",function(n){q(e);let o=M(4);return W(n?o.toggleAllRows():null)}),p()()}if(t&2){let e=M(4);y(),te("checked",e.selection.hasValue()&&e.isAllSelected())("indeterminate",e.selection.hasValue()&&!e.isAllSelected())}}function qeA(t,A){if(t&1){let e=Ue();m(0,"td",31)(1,"mat-checkbox",32),ee("click",function(n){return q(e),W(n.stopPropagation())})("change",function(n){let o=q(e).$implicit,r=M(4);return W(n?r.selection.toggle(o):null)}),p()()}if(t&2){let e=A.$implicit,i=M(4);y(),te("checked",i.selection.isSelected(e))}}function WeA(t,A){if(t&1&&(m(0,"th",29),T(1),p()),t&2){let e=M(4);y(),FA(" ",e.i18n.caseIdHeader," ")}}function ZeA(t,A){if(t&1){let e=Ue();m(0,"td",33),ee("click",function(){let n=q(e).$implicit,o=M(4);return W(o.getEvalCase(n))}),T(1),p()}if(t&2){let e,i=A.$implicit,n=M(4);iA("selected-eval-case",i===((e=n.selectedEvalCase())==null?null:e.evalId)),y(),FA(" ",i," ")}}function XeA(t,A){if(t&1&&(m(0,"th",29),T(1),p()),t&2){let e=M(4);y(),FA(" ",e.i18n.resultHeader," ")}}function $eA(t,A){if(t&1){let e=Ue();m(0,"button",35),ee("click",function(){q(e);let n=M().$implicit,o=M(4);return W(o.getSession(n))}),m(1,"span",36),T(2),p(),m(3,"div",37),T(4),p()()}if(t&2){let e=M().$implicit,i=M(4);te("ngClass",i.getEvalResultForCase(e)==1?"result-btn pass":"result-btn fail")("matTooltip",i.i18n.viewEvalRunResultTooltip),y(2),FA(" ",i.getEvalResultForCase(e)==1?"check":"close"," "),y(2),FA("",i.getEvalResultForCase(e)==1?i.i18n.passStatus:i.i18n.failStatus," ")}}function eAA(t,A){if(t&1&&(m(0,"td",31),ne(1,$eA,5,4,"button",34),p()),t&2){let e=A.$implicit,i=M(4);y(),$(i.getEvalResultForCase(e)?1:-1)}}function AAA(t,A){t&1&&ve(0,"tr",38)}function tAA(t,A){t&1&&ve(0,"tr",39)}function iAA(t,A){if(t&1){let e=Ue();m(0,"div")(1,"div",16)(2,"button",17),ee("click",function(){q(e);let n=M(3);return W(n.openEvalConfigDialog())}),T(3),p(),m(4,"mat-icon",18),ee("click",function(){q(e);let n=M(3);return W(n.toggleEvalHistoryButton())}),T(5,"history"),p()(),m(6,"div",19)(7,"table",20),Qa(8,21),ne(9,VeA,2,2,"th",22)(10,qeA,2,1,"td",23),ma(),Qa(11,24),ne(12,WeA,2,1,"th",22)(13,ZeA,2,3,"td",25),ma(),Qa(14,26),ne(15,XeA,2,1,"th",22)(16,eAA,2,1,"td",23),ma(),ne(17,AAA,1,0,"tr",27)(18,tAA,1,0,"tr",28),p()()()}if(t&2){let e=M(3);y(3),Pe(e.i18n.runEvaluationButton),y(),te("matTooltip",e.i18n.viewEvalRunHistoryTooltip),y(3),te("dataSource",e.dataSource),y(10),te("matHeaderRowDef",e.displayedColumns),y(),te("matRowDefColumns",e.displayedColumns)}}function nAA(t,A){if(t&1&&(m(0,"div")(1,"span",50),T(2,"|"),p(),m(3,"span",51),T(4),p()()),t&2){let e=M().$implicit,i=M(4);y(4),el("",i.getFailCountForCurrentResult(e.evaluationResults.evaluationResults)," ",i.i18n.failedSuffix,"")}}function oAA(t,A){if(t&1&&(m(0,"span",52),T(1),p()),t&2){let e=A.$implicit;y(),el(" ",e.metricName,": ",e.threshold," ")}}function rAA(t,A){if(t&1&&(m(0,"div",46),Rt(1,oAA,2,2,"span",52,Fi),p()),t&2){let e=M().$implicit,i=M(4);y(),Nt(i.getEvalMetrics(e))}}function sAA(t,A){if(t&1){let e=Ue();m(0,"div")(1,"div",53)(2,"span"),T(3),p(),m(4,"button",54),ee("click",function(){let n=q(e).$implicit,o=M(6);return W(o.getHistorySession(n))}),m(5,"span",36),T(6),p(),m(7,"div",37),T(8),p()()()()}if(t&2){let e=A.$implicit,i=M(6);y(3),FA(" ",e.evalId," "),y(),te("ngClass",e.finalEvalStatus==1?"result-btn pass":"result-btn fail"),y(2),FA(" ",e.finalEvalStatus==1?"check":"close"," "),y(2),FA("",e.finalEvalStatus==1?i.i18n.passStatusCaps:i.i18n.failStatusCaps," ")}}function aAA(t,A){if(t&1&&(m(0,"div",49),Rt(1,sAA,9,4,"div",null,Fi),p()),t&2){let e=M().$implicit,i=M(4);y(),Nt(i.generateHistoryEvaluationDatasource(e.timestamp))}}function cAA(t,A){if(t&1){let e=Ue();m(0,"div")(1,"div",40)(2,"div",41)(3,"div",42)(4,"div",43),T(5),p(),m(6,"div",44)(7,"span",45),T(8),p(),ne(9,nAA,5,2,"div"),p(),ne(10,rAA,3,0,"div",46),p(),m(11,"div",47)(12,"mat-icon",48),ee("click",function(){let n=q(e).$implicit,o=M(4);return W(o.toggleHistoryStatusCard(n.timestamp))}),T(13),p()()(),ne(14,aAA,3,0,"div",49),p()()}if(t&2){let e=A.$implicit,i=M(4);y(5),Pe(i.formatTimestamp(e.timestamp)),y(3),el("",i.getPassCountForCurrentResult(e.evaluationResults.evaluationResults)," ",i.i18n.passedSuffix,""),y(),$(i.getFailCountForCurrentResult(e.evaluationResults.evaluationResults)>0?9:-1),y(),$(i.getEvalMetrics(e)?10:-1),y(3),Pe(i.getEvaluationStatusCardActionButtonIcon(e.timestamp)),y(),$(i.isEvaluationStatusCardToggled(e.timestamp)?14:-1)}}function lAA(t,A){if(t&1&&(m(0,"div"),Rt(1,cAA,15,7,"div",null,Fi),p()),t&2){let e=M(3);y(),Nt(e.getEvalHistoryOfCurrentSetSorted())}}function gAA(t,A){if(t&1&&(m(0,"div"),ne(1,iAA,19,5,"div")(2,lAA,3,0,"div"),p()),t&2){let e=M(2);y(),$(e.showEvalHistory()?-1:1),y(),$(e.showEvalHistory()?2:-1)}}function dAA(t,A){if(t&1){let e=Ue();m(0,"button",55),ee("click",function(){q(e);let n=M(2);return W(n.openNewEvalCaseDialog())}),m(1,"div",56)(2,"mat-icon"),T(3,"add"),p(),m(4,"div",57),T(5),p()()()}if(t&2){let e=M(2);y(5),el(" ",e.i18n.addSessionToSetButtonPrefix," ",e.selectedEvalSet," ")}}function CAA(t,A){t&1&&(m(0,"div"),ve(1,"mat-spinner",58),p()),t&2&&(y(),te("diameter",28)("strokeWidth",3))}function IAA(t,A){if(t&1){let e=Ue();m(0,"div")(1,"div",9)(2,"mat-icon",13),ee("click",function(){q(e);let n=M();return W(n.clearSelectedEvalSet())}),T(3,"chevron_left"),p(),m(4,"div",14),ee("click",function(){q(e);let n=M();return W(n.clearSelectedEvalSet())}),T(5),p()(),ne(6,gAA,3,2,"div")(7,dAA,6,2,"button",15)(8,CAA,2,2,"div"),p()}if(t&2){let e=M();y(5),FA(" ",e.selectedEvalSet," "),y(),$(e.evalCases.length>0&&!e.evalRunning()?6:-1),y(),$(!e.evalRunning()&&!e.showEvalHistory()?7:-1),y(),$(e.evalRunning()?8:-1)}}var n9=new re("EVAL_TAB_COMPONENT"),a0=class t{checkboxes=eW(Ih);appName=lt("");userId=lt("");sessionId=lt("");sessionSelected=No();shouldShowTab=No();evalNotInstalledMsg=No();evalCaseSelected=No();evalSetIdSelected=No();shouldReturnToSession=No();evalCasesSubject=new Mt([]);changeDetectorRef=E(ut);flagService=E(Ks);i18n=E(SCe);displayedColumns=["select","evalId","finalEvalStatus"];evalsets=[];selectedEvalSet="";evalCases=[];selectedEvalCase=mA(null);deletedEvalCaseIndex=-1;dataSource=new c6(this.evalCases);selection=new J1(!0,[]);showEvalHistory=mA(!1);evalRunning=mA(!1);evalMetrics=bCe;currentEvalResultBySet=new Map;dialog=E(na);appEvaluationResults={};evalService=E(od);sessionService=E(rd);constructor(){this.evalCasesSubject.subscribe(A=>{!this.selectedEvalCase()&&this.deletedEvalCaseIndex>=0&&A.length>0?(this.selectNewEvalCase(A),this.deletedEvalCaseIndex=-1):A.length===0&&this.shouldReturnToSession.emit(!0)})}ngOnChanges(A){A.appName&&(this.selectedEvalSet="",this.evalCases=[],this.getEvalSet(),this.getEvaluationResult())}ngOnInit(){}selectNewEvalCase(A){let e=this.deletedEvalCaseIndex;this.deletedEvalCaseIndex===A.length&&(e=0),this.getEvalCase(A[e])}getEvalSet(){this.appName()!==""&&this.evalService.getEvalSets(this.appName()).pipe(br(A=>A.status===404&&A.statusText==="Not Found"?(this.shouldShowTab.emit(!1),dA(null)):dA([]))).subscribe(A=>{A!==null&&(this.shouldShowTab.emit(!0),this.evalsets=A,this.changeDetectorRef.detectChanges())})}openNewEvalSetDialog(){this.dialog.open(t9,{width:"600px",data:{appName:this.appName()}}).afterClosed().subscribe(e=>{e&&(this.getEvalSet(),this.changeDetectorRef.detectChanges())})}openNewEvalCaseDialog(){this.dialog.open(A9,{width:"600px",data:{appName:this.appName(),userId:this.userId(),sessionId:this.sessionId(),evalSetId:this.selectedEvalSet}}).afterClosed().subscribe(e=>{e&&(this.listEvalCases(),this.changeDetectorRef.detectChanges())})}listEvalCases(){this.evalCases=[],this.evalService.listEvalCases(this.appName(),this.selectedEvalSet).subscribe(A=>{this.evalCases=A,this.dataSource=new c6(this.evalCases),this.evalCasesSubject.next(this.evalCases),this.changeDetectorRef.detectChanges()})}runEval(){if(this.evalRunning.set(!0),this.selection.selected.length==0){alert("No case selected!"),this.evalRunning.set(!1);return}this.evalService.runEval(this.appName(),this.selectedEvalSet,this.selection.selected,this.evalMetrics).pipe(br(A=>(A.error?.detail?.includes("not installed")&&this.evalNotInstalledMsg.emit(A.error.detail),dA([])))).subscribe(A=>{this.evalRunning.set(!1),this.currentEvalResultBySet.set(this.selectedEvalSet,A),this.getEvaluationResult(),this.changeDetectorRef.detectChanges()})}selectEvalSet(A){this.selectedEvalSet=A,this.listEvalCases()}clearSelectedEvalSet(){if(this.showEvalHistory()){this.toggleEvalHistoryButton();return}this.selectedEvalSet=""}isAllSelected(){let A=this.selection.selected.length,e=this.dataSource.data.length;return A===e}toggleAllRows(){if(this.isAllSelected()){this.selection.clear();return}this.selection.select(...this.dataSource.data)}getEvalResultForCase(A){let e=this.currentEvalResultBySet.get(this.selectedEvalSet)?.filter(i=>i.evalId==A);if(!(!e||e.length==0))return e[0].finalEvalStatus}formatToolUses(A){let e=[];for(let i of A)e.push({name:i.name,args:i.args});return e}addEvalCaseResultToEvents(A,e){let i=e.evalMetricResultPerInvocation,n=-1;if(i)for(let o=0;on.evalId==A)[0],i=e.sessionId;this.sessionService.getSession(this.userId(),this.appName(),i).subscribe(n=>{this.addEvalCaseResultToEvents(n,e);let o=this.fromApiResultToSession(n);this.sessionSelected.emit(o)})}toggleEvalHistoryButton(){this.showEvalHistory.set(!this.showEvalHistory())}getEvalHistoryOfCurrentSet(){return this.appEvaluationResults[this.appName()][this.selectedEvalSet]}getEvalHistoryOfCurrentSetSorted(){let A=this.getEvalHistoryOfCurrentSet();return Object.keys(A).sort((n,o)=>o.localeCompare(n)).map(n=>({timestamp:n,evaluationResults:A[n]}))}getPassCountForCurrentResult(A){return A.filter(e=>e.finalEvalStatus==1).length}getFailCountForCurrentResult(A){return A.filter(e=>e.finalEvalStatus==2).length}formatTimestamp(A){let e=Number(A);if(isNaN(e))return"Invalid timestamp provided";let i=new Date(e*1e3);if(isNaN(i.getTime()))return"Invalid date created from timestamp";let n={month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",hour12:!0};return new Intl.DateTimeFormat("en-US",n).format(i)}getEvaluationStatusCardActionButtonIcon(A){return this.getEvalHistoryOfCurrentSet()[A].isToggled?"keyboard_arrow_up":"keyboard_arrow_down"}toggleHistoryStatusCard(A){this.getEvalHistoryOfCurrentSet()[A].isToggled=!this.getEvalHistoryOfCurrentSet()[A].isToggled}isEvaluationStatusCardToggled(A){return this.getEvalHistoryOfCurrentSet()[A].isToggled}generateHistoryEvaluationDatasource(A){return this.getEvalHistoryOfCurrentSet()[A].evaluationResults}getHistorySession(A){this.addEvalCaseResultToEvents(A.sessionDetails,A);let e=this.fromApiResultToSession(A.sessionDetails);this.sessionSelected.emit(e)}getEvalCase(A){this.evalService.getEvalCase(this.appName(),this.selectedEvalSet,A).subscribe(e=>{this.selectedEvalCase.set(e),this.evalCaseSelected.emit(e),this.evalSetIdSelected.emit(this.selectedEvalSet)})}resetEvalCase(){this.selectedEvalCase.set(null)}resetEvalResults(){this.currentEvalResultBySet.clear()}deleteEvalCase(A){this.evalService.deleteEvalCase(this.appName(),this.selectedEvalSet,A).subscribe(e=>{this.deletedEvalCaseIndex=this.evalCases.indexOf(A),this.selectedEvalCase.set(null),this.listEvalCases(),this.changeDetectorRef.detectChanges()})}getEvaluationResult(){this.evalService.listEvalResults(this.appName()).pipe(br(A=>A.status===404&&A.statusText==="Not Found"?(this.shouldShowTab.emit(!1),dA(null)):dA([]))).subscribe(A=>{for(let e of A)this.evalService.getEvalResult(this.appName(),e).subscribe(i=>{this.appEvaluationResults[this.appName()]||(this.appEvaluationResults[this.appName()]={}),this.appEvaluationResults[this.appName()][i.evalSetId]||(this.appEvaluationResults[this.appName()][i.evalSetId]={});let n=i.creationTimestamp;this.appEvaluationResults[this.appName()][i.evalSetId][n]||(this.appEvaluationResults[this.appName()][i.evalSetId][n]={isToggled:!1,evaluationResults:[]});let o={isToggled:!1,evaluationResults:i.evalCaseResults.map(r=>({setId:r.id,evalId:r.evalId,finalEvalStatus:r.finalEvalStatus,evalMetricResults:r.evalMetricResults,evalMetricResultPerInvocation:r.evalMetricResultPerInvocation,sessionId:r.sessionId,sessionDetails:r.sessionDetails,overallEvalMetricResults:r.overallEvalMetricResults??[]}))};this.appEvaluationResults[this.appName()][i.evalSetId][n]=o,this.changeDetectorRef.detectChanges()})})}openEvalConfigDialog(){if(this.selection.selected.length==0){alert("No case selected!");return}this.dialog.open(i9,{maxWidth:"90vw",maxHeight:"90vh",data:{evalMetrics:this.evalMetrics}}).afterClosed().subscribe(e=>{e&&(this.evalMetrics=e,this.runEval())})}getEvalMetrics(A){if(!A||!A.evaluationResults||!A.evaluationResults.evaluationResults)return this.evalMetrics;let e=A.evaluationResults.evaluationResults;return e.length===0?this.evalMetrics:typeof e[0].overallEvalMetricResults>"u"||!e[0].overallEvalMetricResults||e[0].overallEvalMetricResults.length===0?this.evalMetrics:e[0].overallEvalMetricResults.map(n=>({metricName:n.metricName,threshold:n.threshold}))}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-eval-tab"]],viewQuery:function(e,i){e&1&&Kr(i.checkboxes,Ih,5),e&2&&Aa()},inputs:{appName:[1,"appName"],userId:[1,"userId"],sessionId:[1,"sessionId"]},outputs:{sessionSelected:"sessionSelected",shouldShowTab:"shouldShowTab",evalNotInstalledMsg:"evalNotInstalledMsg",evalCaseSelected:"evalCaseSelected",evalSetIdSelected:"evalSetIdSelected",shouldReturnToSession:"shouldReturnToSession"},features:[ti],decls:5,vars:4,consts:[[1,"eval-container"],[1,"eval-set-actions"],[2,"cursor","pointer",3,"click","matTooltip"],[1,"empty-eval-info"],[1,"info-title"],[1,"info-detail"],[1,"info-create",3,"click"],[1,"eval-set-row"],[1,"eval-set-row",3,"click"],[2,"display","flex"],[1,"material-symbols-outlined",2,"margin-right","10px","padding-top","16px"],[2,"font-family","Roboto","font-size","14px","padding","16px","padding-top","20px"],[2,"padding-top","20px","color","#9AA0A6"],[2,"color","white","cursor","pointer",3,"click"],[2,"color","#9AA0A6","padding-top","2px","cursor","pointer",3,"click"],[1,"save-session-btn"],[1,"evaluation-tab-header"],[1,"run-eval-btn",3,"click"],[1,"evaluation-history-icon",3,"click","matTooltip"],[1,"mat-table-container",2,"margin-top","16px"],["mat-table","",3,"dataSource"],["matColumnDef","select"],["mat-header-cell","",4,"matHeaderCellDef"],["mat-cell","",4,"matCellDef"],["matColumnDef","evalId"],["mat-cell","","class","eval-case-id",3,"selected-eval-case","click",4,"matCellDef"],["matColumnDef","finalEvalStatus"],["mat-header-row","",4,"matHeaderRowDef"],["mat-row","",4,"matRowDef","matRowDefColumns"],["mat-header-cell",""],[3,"change","checked","indeterminate"],["mat-cell",""],[3,"click","change","checked"],["mat-cell","",1,"eval-case-id",3,"click"],[3,"ngClass","matTooltip"],[3,"click","ngClass","matTooltip"],[1,"material-symbols-outlined"],[2,"padding-top","4px"],["mat-header-row",""],["mat-row",""],[1,"status-card"],[1,"status-card__overview"],[1,"status-card__info"],[1,"status-card__timestamp"],[1,"status-card__summary"],[1,"status-card__passed"],[1,"status-card__metrics"],[1,"status-card__action"],[3,"click"],[1,"status-card__history-cases"],[1,"status-card__separator"],[1,"status-card__failed"],[1,"status-card__metric"],[1,"status-card__history-case"],[3,"click","ngClass"],[1,"save-session-btn",3,"click"],[1,"save-session-btn-detail"],[1,"save-session-btn-text"],[1,"eval-spinner",3,"diameter","strokeWidth"]],template:function(e,i){e&1&&(m(0,"div",0),ne(1,HeA,5,2,"div",1)(2,zeA,8,3,"div")(3,jeA,3,0,"div")(4,IAA,9,4,"div"),p()),e&2&&(y(),$(i.selectedEvalSet==""?1:-1),y(),$(i.evalsets.length==0?2:-1),y(),$(i.evalsets.length>0&&i.selectedEvalSet==""?3:-1),y(),$(i.selectedEvalSet!=""?4:-1))},dependencies:[ir,Ma,BCe,QCe,fCe,mCe,Ih,ECe,pCe,ta,wCe,DCe,yCe,vCe,Z1],styles:[".eval-container[_ngcontent-%COMP%]{margin-top:20px;padding-left:25px;padding-right:25px}.eval-case-id[_ngcontent-%COMP%]{cursor:pointer}.eval-set-actions[_ngcontent-%COMP%]{display:flex;justify-content:space-between;color:var(--eval-tab-eval-set-actions-color);font-style:normal;font-weight:700;font-size:14px}.empty-eval-info[_ngcontent-%COMP%]{margin-top:12px;background-color:var(--eval-tab-empty-eval-info-background-color);border-radius:8px;box-shadow:0 2px 6px 2px var(--eval-tab-empty-eval-info-box-shadow-color1),0 1px 2px 0 var(--eval-tab-empty-eval-info-box-shadow-color2)}.info-title[_ngcontent-%COMP%]{color:var(--eval-tab-info-title-color);font-family:Roboto;font-size:14px;font-weight:500;padding-top:13px;padding-right:16px;padding-left:16px}.info-detail[_ngcontent-%COMP%]{color:var(--eval-tab-info-detail-color);font-family:Roboto;font-size:14px;font-weight:400;padding-top:13px;padding-right:16px;padding-left:16px;letter-spacing:.2px}.info-create[_ngcontent-%COMP%]{color:var(--eval-tab-info-create-color);font-size:14px;font-style:normal;font-weight:500;padding-right:16px;padding-left:16px;margin-top:19px;padding-bottom:16px;cursor:pointer}.eval-set-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;cursor:pointer}.selected-eval-case[_ngcontent-%COMP%]{font-weight:900;color:var(--eval-tab-selected-eval-case-color)}.save-session-btn[_ngcontent-%COMP%]{width:100%;background:linear-gradient(0deg,var(--eval-tab-save-session-btn-background-color1) 0%,var(--eval-tab-save-session-btn-background-color1) 100%),var(--eval-tab-save-session-btn-background-color2);border:none;border-radius:4px;margin-top:12px;cursor:pointer}.save-session-btn-detail[_ngcontent-%COMP%]{display:flex;padding:8px 16px 8px 12px;justify-content:center}.save-session-btn-text[_ngcontent-%COMP%]{padding-top:2px;color:var(--eval-tab-save-session-btn-text-color);font-family:Google Sans;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.run-eval-btn[_ngcontent-%COMP%]{border-radius:4px;border:1px solid var(--eval-tab-run-eval-btn-border-color);background-color:transparent;padding:8px 24px;margin-top:16px;color:var(--eval-tab-run-eval-btn-color);cursor:pointer}.run-eval-btn[_ngcontent-%COMP%]:hover{background-color:var(--eval-tab-run-eval-btn-hover-background-color)}.result-btn[_ngcontent-%COMP%]{display:flex;background-color:transparent;border-radius:4px;border:1px solid var(--eval-tab-result-btn-border-color);margin-top:4px;cursor:pointer}.result-btn[_ngcontent-%COMP%]:hover{background-color:var(--eval-tab-result-btn-hover-background-color)}.result-btn.pass[_ngcontent-%COMP%]{color:var(--eval-tab-result-btn-pass-color)}.result-btn.fail[_ngcontent-%COMP%]{color:var(--eval-tab-result-btn-fail-color)}.evaluation-tab-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%}.evaluation-history-icon[_ngcontent-%COMP%]{cursor:pointer;margin-top:4px}.status-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;border-radius:8px;background-color:var(--eval-tab-status-card-background-color);padding:12px 16px;margin-top:12px}.status-card__overview[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%}.status-card__info[_ngcontent-%COMP%]{display:flex;flex-direction:column}.status-card__timestamp[_ngcontent-%COMP%]{font-size:.9em;color:var(--eval-tab-status-card-timestamp-color);margin-bottom:5px}.status-card__summary[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:.95em;font-weight:500}.status-card__metrics[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:.75em;font-weight:300;margin-top:3px}.status-card__metric[_ngcontent-%COMP%]{width:180px;color:var(--eval-tab-status-card-metric-color)}.status-card__failed[_ngcontent-%COMP%]{color:var(--eval-tab-status-card-failed-color)}.status-card__separator[_ngcontent-%COMP%]{color:var(--eval-tab-status-card-separator-color);margin:0 8px}.status-card__passed[_ngcontent-%COMP%]{color:var(--eval-tab-status-card-passed-color)}.status-card__action[_ngcontent-%COMP%]{display:flex;align-items:center}.status-card__action[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:var(--eval-tab-status-card-action-mat-icon-color);cursor:pointer;transition:transform .2s ease-in-out}.status-card__action[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]:hover{opacity:.8}.status-card__action[_ngcontent-%COMP%] .status-card__icon[_ngcontent-%COMP%]{color:var(--eval-tab-status-card-icon-color);font-size:1.2em;cursor:pointer}.status-card__action[_ngcontent-%COMP%] .status-card__icon[_ngcontent-%COMP%]:hover{opacity:.8}.status-card__history-cases[_ngcontent-%COMP%]{display:flex;flex-direction:column;margin-top:3px;justify-content:flex-start;width:100%}.status-card__history-case[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%;margin-top:15px}.eval-spinner[_ngcontent-%COMP%]{margin-top:12px}"]})};var r9=new re("PendingEventService"),o9=class{};function uAA(t,A){t&1&&(m(0,"h2",0),T(1,"Events List"),p())}function hAA(t,A){t&1&&(m(0,"h2",0),T(1,"Send Response To Pending Event"),p())}function BAA(t,A){t&1&&(m(0,"h2",4),T(1,"Events List"),p())}function EAA(t,A){t&1&&(m(0,"h2",4),T(1,"Send Response To Pending Event"),p())}function fAA(t,A){if(t&1){let e=Ue();m(0,"div")(1,"p"),T(2,"Name"),p(),m(3,"p"),T(4),p(),m(5,"p"),T(6,"Args"),p(),m(7,"p"),T(8),p(),m(9,"mat-form-field",5)(10,"mat-label"),T(11,"Response"),p(),m(12,"textarea",6),qn("ngModelChange",function(n){q(e);let o=M();return Vn(o.selectedEvent.response,n)||(o.selectedEvent.response=n),W(n)}),p()()()}if(t&2){let e=M();y(4),Pe(e.selectedEvent.name),y(4),Pe(e.argsToJson(e.selectedEvent.args)),y(4),jn("ngModel",e.selectedEvent.response)}}function QAA(t,A){if(t&1){let e=Ue();m(0,"button",7),ee("click",function(){q(e);let n=M();return W(n.sendResponse())}),T(1),p()}if(t&2){let e=M();te("disabled",e.sending),y(),FA(" ",e.sending?"Sending...":"Send"," ")}}var s9=class t{dialogRef=E(co);data=E(qo);agentService=E(Hl);pendingEventService=E(r9);selectedEvent=this.data.event;appName=this.data.appName;userId=this.data.userId;sessionId=this.data.sessionId;functionCallEventId=this.data.functionCallEventId;sending=!1;response=[];constructor(){}argsToJson(A){return JSON.stringify(A)}sendResponse(){this.sending=!0;let A={appName:this.appName,userId:this.userId,sessionId:this.sessionId,newMessage:{role:"user",parts:[]},invocationId:this.data.invocationId};this.selectedEvent.response&&(A.functionCallEventId=this.functionCallEventId,A.newMessage.parts.push(this.pendingEventService.createFunctionResponse(this.selectedEvent.id,this.selectedEvent.name,{response:this.selectedEvent.response}))),this.agentService.runSse(A).subscribe({next:e=>Ci(this,null,function*(){this.response.push(e)}),error:e=>console.error("SSE error:",e),complete:()=>{this.sending=!1,this.dialogRef.close({response:this.response,events:[this.selectedEvent]})}})}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-pending-event-dialog"]],decls:10,vars:6,consts:[["mat-dialog-title",""],["mat-dialog-title","","class","dialog-title",4,"ngIf"],["mat-button","",3,"disabled"],["mat-button","","mat-dialog-close",""],["mat-dialog-title","",1,"dialog-title"],["appearance","outline",1,"response-textarea"],["matInput","",3,"ngModelChange","ngModel"],["mat-button","",3,"click","disabled"]],template:function(e,i){e&1&&(ne(0,uAA,2,0,"h2",0)(1,hAA,2,0,"h2",0)(2,BAA,2,0,"h2",1)(3,EAA,2,0,"h2",1),m(4,"mat-dialog-content"),ne(5,fAA,13,3,"div"),p(),m(6,"mat-dialog-actions"),ne(7,QAA,2,2,"button",2),m(8,"button",3),T(9,"Close"),p()()),e&2&&($(i.selectedEvent?-1:0),y(),$(i.selectedEvent?1:-1),y(),te("ngIf",!i.selectedEvent),y(),te("ngIf",i.selectedEvent),y(2),$(i.selectedEvent?5:-1),y(2),$(i.selectedEvent&&i.selectedEvent.response?7:-1))},dependencies:[tr,bg,jr,ds,q0,Gs,Kn,Mr,Fo,Cr,kr,Un,Jl],styles:[".response-textarea[_ngcontent-%COMP%]{min-width:500px;margin-top:15px}.dialog-title[_ngcontent-%COMP%]{font-weight:700;font-size:large}"]})};var l6=class t{constructor(A,e){this.dialogRef=A;this.data=e}onConfirm(){this.dialogRef.close(!0)}onCancel(){this.dialogRef.close(!1)}static \u0275fac=function(e){return new(e||t)(DA(co),DA(qo))};static \u0275cmp=xe({type:t,selectors:[["app-delete-session-dialog"]],decls:11,vars:4,consts:[[1,"confirm-delete-wrapper"],["mat-dialog-title",""],["align","end"],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(e,i){e&1&&(m(0,"div",0)(1,"h2",1),T(2),p(),m(3,"mat-dialog-content")(4,"p"),T(5),p()(),m(6,"mat-dialog-actions",2)(7,"button",3),ee("click",function(){return i.onCancel()}),T(8),p(),m(9,"button",4),ee("click",function(){return i.onConfirm()}),T(10),p()()()),e&2&&(y(2),Pe(i.data.title),y(3),Pe(i.data.message),y(3),Pe(i.data.cancelButtonText),y(2),Pe(i.data.confirmButtonText))},dependencies:[tr,jr,kr,Un],encapsulation:2})};var EH=["*"];function mAA(t,A){t&1&&NA(0)}var pAA=["tabListContainer"],wAA=["tabList"],yAA=["tabListInner"],DAA=["nextPaginator"],vAA=["previousPaginator"],bAA=t=>({animationDuration:t}),MAA=(t,A)=>({value:t,params:A});function SAA(t,A){}var kAA=["tabBodyWrapper"],xAA=["tabHeader"];function _AA(t,A){}function RAA(t,A){if(t&1&&ne(0,_AA,0,0,"ng-template",12),t&2){let e=M().$implicit;te("cdkPortalOutlet",e.templateLabel)}}function NAA(t,A){if(t&1&&T(0),t&2){let e=M().$implicit;Pe(e.textLabel)}}function LAA(t,A){if(t&1){let e=Ue();m(0,"div",7,2),ee("click",function(){let n=q(e),o=n.$implicit,r=n.$index,s=M(),a=Ji(1);return W(s._handleClick(o,a,r))})("cdkFocusChange",function(n){let o=q(e).$index,r=M();return W(r._tabFocusChanged(n,o))}),ve(2,"span",8)(3,"div",9),m(4,"span",10)(5,"span",11),ne(6,RAA,1,1,null,12)(7,NAA,1,1),p()()()}if(t&2){let e=A.$implicit,i=A.$index,n=Ji(1),o=M();Lo(e.labelClass),iA("mdc-tab--active",o.selectedIndex===i),te("id",o._getTabLabelId(i))("disabled",e.disabled)("fitInkBarToContent",o.fitInkBarToContent),AA("tabIndex",o._getTabIndex(i))("aria-posinset",i+1)("aria-setsize",o._tabs.length)("aria-controls",o._getTabContentId(i))("aria-selected",o.selectedIndex===i)("aria-label",e.ariaLabel||null)("aria-labelledby",!e.ariaLabel&&e.ariaLabelledby?e.ariaLabelledby:null),y(3),te("matRippleTrigger",n)("matRippleDisabled",e.disabled||o.disableRipple),y(3),$(e.templateLabel?6:7)}}function FAA(t,A){t&1&&NA(0)}function GAA(t,A){if(t&1){let e=Ue();m(0,"mat-tab-body",13),ee("_onCentered",function(){q(e);let n=M();return W(n._removeTabBodyWrapperHeight())})("_onCentering",function(n){q(e);let o=M();return W(o._setTabBodyWrapperHeight(n))}),p()}if(t&2){let e=A.$implicit,i=A.$index,n=M();Lo(e.bodyClass),iA("mat-mdc-tab-body-active",n.selectedIndex===i),te("id",n._getTabContentId(i))("content",e.content)("position",e.position)("origin",e.origin)("animationDuration",n.animationDuration)("preserveContent",n.preserveContent),AA("tabindex",n.contentTabIndex!=null&&n.selectedIndex===i?n.contentTabIndex:null)("aria-labelledby",n._getTabLabelId(i))("aria-hidden",n.selectedIndex!==i)}}var KAA=new re("MatTabContent"),UAA=(()=>{class t{template=E(en);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","matTabContent",""]],features:[gt([{provide:KAA,useExisting:t}])]})}return t})(),TAA=new re("MatTabLabel"),LCe=new re("MAT_TAB"),fH=(()=>{class t extends AAe{_closestTab=E(LCe,{optional:!0});static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275dir=Oe({type:t,selectors:[["","mat-tab-label",""],["","matTabLabel",""]],features:[gt([{provide:TAA,useExisting:t}]),Ct]})}return t})(),FCe=new re("MAT_TAB_GROUP"),g6=(()=>{class t{_viewContainerRef=E(xn);_closestTabGroup=E(FCe,{optional:!0});disabled=!1;get templateLabel(){return this._templateLabel}set templateLabel(e){this._setTemplateLabelInput(e)}_templateLabel;_explicitContent=void 0;_implicitContent;textLabel="";ariaLabel;ariaLabelledby;labelClass;bodyClass;_contentPortal=null;get content(){return this._contentPortal}_stateChanges=new je;position=null;origin=null;isActive=!1;constructor(){E(Wn).load(Pr)}ngOnChanges(e){(e.hasOwnProperty("textLabel")||e.hasOwnProperty("disabled"))&&this._stateChanges.next()}ngOnDestroy(){this._stateChanges.complete()}ngOnInit(){this._contentPortal=new ba(this._explicitContent||this._implicitContent,this._viewContainerRef)}_setTemplateLabelInput(e){e&&e._closestTab===this&&(this._templateLabel=e)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-tab"]],contentQueries:function(i,n,o){if(i&1&&(ni(o,fH,5),ni(o,UAA,7,en)),i&2){let r;oA(r=rA())&&(n.templateLabel=r.first),oA(r=rA())&&(n._explicitContent=r.first)}},viewQuery:function(i,n){if(i&1&&At(en,7),i&2){let o;oA(o=rA())&&(n._implicitContent=o.first)}},hostAttrs:["hidden",""],inputs:{disabled:[2,"disabled","disabled",IA],textLabel:[0,"label","textLabel"],ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],labelClass:"labelClass",bodyClass:"bodyClass"},exportAs:["matTab"],features:[gt([{provide:LCe,useExisting:t}]),ti],ngContentSelectors:EH,decls:1,vars:0,template:function(i,n){i&1&&(Kt(),ne(0,mAA,1,0,"ng-template"))},encapsulation:2})}return t})(),uH="mdc-tab-indicator--active",RCe="mdc-tab-indicator--no-transition",hH=class{_items;_currentItem;constructor(A){this._items=A}hide(){this._items.forEach(A=>A.deactivateInkBar()),this._currentItem=void 0}alignToElement(A){let e=this._items.find(n=>n.elementRef.nativeElement===A),i=this._currentItem;if(e!==i&&(i?.deactivateInkBar(),e)){let n=i?.elementRef.nativeElement.getBoundingClientRect?.();e.activateInkBar(n),this._currentItem=e}}},OAA=(()=>{class t{_elementRef=E(eA);_inkBarElement;_inkBarContentElement;_fitToContent=!1;get fitInkBarToContent(){return this._fitToContent}set fitInkBarToContent(e){this._fitToContent!==e&&(this._fitToContent=e,this._inkBarElement&&this._appendInkBarElement())}activateInkBar(e){let i=this._elementRef.nativeElement;if(!e||!i.getBoundingClientRect||!this._inkBarContentElement){i.classList.add(uH);return}let n=i.getBoundingClientRect(),o=e.width/n.width,r=e.left-n.left;i.classList.add(RCe),this._inkBarContentElement.style.setProperty("transform",`translateX(${r}px) scaleX(${o})`),i.getBoundingClientRect(),i.classList.remove(RCe),i.classList.add(uH),this._inkBarContentElement.style.setProperty("transform","")}deactivateInkBar(){this._elementRef.nativeElement.classList.remove(uH)}ngOnInit(){this._createInkBarElement()}ngOnDestroy(){this._inkBarElement?.remove(),this._inkBarElement=this._inkBarContentElement=null}_createInkBarElement(){let e=this._elementRef.nativeElement.ownerDocument||document,i=this._inkBarElement=e.createElement("span"),n=this._inkBarContentElement=e.createElement("span");i.className="mdc-tab-indicator",n.className="mdc-tab-indicator__content mdc-tab-indicator__content--underline",i.appendChild(this._inkBarContentElement),this._appendInkBarElement()}_appendInkBarElement(){this._inkBarElement;let e=this._fitToContent?this._elementRef.nativeElement.querySelector(".mdc-tab__content"):this._elementRef.nativeElement;e.appendChild(this._inkBarElement)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,inputs:{fitInkBarToContent:[2,"fitInkBarToContent","fitInkBarToContent",IA]}})}return t})();var GCe=(()=>{class t extends OAA{elementRef=E(eA);disabled=!1;focus(){this.elementRef.nativeElement.focus()}getOffsetLeft(){return this.elementRef.nativeElement.offsetLeft}getOffsetWidth(){return this.elementRef.nativeElement.offsetWidth}static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275dir=Oe({type:t,selectors:[["","matTabLabelWrapper",""]],hostVars:3,hostBindings:function(i,n){i&2&&(AA("aria-disabled",!!n.disabled),iA("mat-mdc-tab-disabled",n.disabled))},inputs:{disabled:[2,"disabled","disabled",IA]},features:[Ct]})}return t})(),NCe={passive:!0},JAA=650,YAA=100,HAA=(()=>{class t{_elementRef=E(eA);_changeDetectorRef=E(ut);_viewportRuler=E(Ol);_dir=E(Do,{optional:!0});_ngZone=E(yA);_platform=E(mi);_sharedResizeObserver=E(Y5);_injector=E(Dt);_renderer=E(an);_animationMode=E(Oi,{optional:!0});_eventCleanups;_scrollDistance=0;_selectedIndexChanged=!1;_destroyed=new je;_showPaginationControls=!1;_disableScrollAfter=!0;_disableScrollBefore=!0;_tabLabelCount;_scrollDistanceChanged;_keyManager;_currentTextContent;_stopScrolling=new je;disablePagination=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(e){let i=isNaN(e)?0:e;this._selectedIndex!=i&&(this._selectedIndexChanged=!0,this._selectedIndex=i,this._keyManager&&this._keyManager.updateActiveItem(i))}_selectedIndex=0;selectFocusedIndex=new Ve;indexFocused=new Ve;constructor(){this._eventCleanups=this._ngZone.runOutsideAngular(()=>[this._renderer.listen(this._elementRef.nativeElement,"mouseleave",()=>this._stopInterval())])}ngAfterViewInit(){this._eventCleanups.push(hN(this._renderer,this._previousPaginator.nativeElement,"touchstart",()=>this._handlePaginatorPress("before"),NCe),hN(this._renderer,this._nextPaginator.nativeElement,"touchstart",()=>this._handlePaginatorPress("after"),NCe))}ngAfterContentInit(){let e=this._dir?this._dir.change:dA("ltr"),i=this._sharedResizeObserver.observe(this._elementRef.nativeElement).pipe(Ws(32),mt(this._destroyed)),n=this._viewportRuler.change(150).pipe(mt(this._destroyed)),o=()=>{this.updatePagination(),this._alignInkBarToSelectedTab()};this._keyManager=new C2(this._items).withHorizontalOrientation(this._getLayoutDirection()).withHomeAndEnd().withWrap().skipPredicate(()=>!1),this._keyManager.updateActiveItem(this._selectedIndex),Gr(o,{injector:this._injector}),Bi(e,n,i,this._items.changes,this._itemsResized()).pipe(mt(this._destroyed)).subscribe(()=>{this._ngZone.run(()=>{Promise.resolve().then(()=>{this._scrollDistance=Math.max(0,Math.min(this._getMaxScrollDistance(),this._scrollDistance)),o()})}),this._keyManager.withHorizontalOrientation(this._getLayoutDirection())}),this._keyManager.change.subscribe(r=>{this.indexFocused.emit(r),this._setTabFocus(r)})}_itemsResized(){return typeof ResizeObserver!="function"?vr:this._items.changes.pipe(In(this._items),Si(e=>new nt(i=>this._ngZone.runOutsideAngular(()=>{let n=new ResizeObserver(o=>i.next(o));return e.forEach(o=>n.observe(o.elementRef.nativeElement)),()=>{n.disconnect()}}))),Pa(1),$A(e=>e.some(i=>i.contentRect.width>0&&i.contentRect.height>0)))}ngAfterContentChecked(){this._tabLabelCount!=this._items.length&&(this.updatePagination(),this._tabLabelCount=this._items.length,this._changeDetectorRef.markForCheck()),this._selectedIndexChanged&&(this._scrollToLabel(this._selectedIndex),this._checkScrollingControls(),this._alignInkBarToSelectedTab(),this._selectedIndexChanged=!1,this._changeDetectorRef.markForCheck()),this._scrollDistanceChanged&&(this._updateTabScrollPosition(),this._scrollDistanceChanged=!1,this._changeDetectorRef.markForCheck())}ngOnDestroy(){this._eventCleanups.forEach(e=>e()),this._keyManager?.destroy(),this._destroyed.next(),this._destroyed.complete(),this._stopScrolling.complete()}_handleKeydown(e){if(!Tr(e))switch(e.keyCode){case 13:case 32:if(this.focusIndex!==this.selectedIndex){let i=this._items.get(this.focusIndex);i&&!i.disabled&&(this.selectFocusedIndex.emit(this.focusIndex),this._itemSelected(e))}break;default:this._keyManager.onKeydown(e)}}_onContentChanges(){let e=this._elementRef.nativeElement.textContent;e!==this._currentTextContent&&(this._currentTextContent=e||"",this._ngZone.run(()=>{this.updatePagination(),this._alignInkBarToSelectedTab(),this._changeDetectorRef.markForCheck()}))}updatePagination(){this._checkPaginationEnabled(),this._checkScrollingControls(),this._updateTabScrollPosition()}get focusIndex(){return this._keyManager?this._keyManager.activeItemIndex:0}set focusIndex(e){!this._isValidIndex(e)||this.focusIndex===e||!this._keyManager||this._keyManager.setActiveItem(e)}_isValidIndex(e){return this._items?!!this._items.toArray()[e]:!0}_setTabFocus(e){if(this._showPaginationControls&&this._scrollToLabel(e),this._items&&this._items.length){this._items.toArray()[e].focus();let i=this._tabListContainer.nativeElement;this._getLayoutDirection()=="ltr"?i.scrollLeft=0:i.scrollLeft=i.scrollWidth-i.offsetWidth}}_getLayoutDirection(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_updateTabScrollPosition(){if(this.disablePagination)return;let e=this.scrollDistance,i=this._getLayoutDirection()==="ltr"?-e:e;this._tabList.nativeElement.style.transform=`translateX(${Math.round(i)}px)`,(this._platform.TRIDENT||this._platform.EDGE)&&(this._tabListContainer.nativeElement.scrollLeft=0)}get scrollDistance(){return this._scrollDistance}set scrollDistance(e){this._scrollTo(e)}_scrollHeader(e){let i=this._tabListContainer.nativeElement.offsetWidth,n=(e=="before"?-1:1)*i/3;return this._scrollTo(this._scrollDistance+n)}_handlePaginatorClick(e){this._stopInterval(),this._scrollHeader(e)}_scrollToLabel(e){if(this.disablePagination)return;let i=this._items?this._items.toArray()[e]:null;if(!i)return;let n=this._tabListContainer.nativeElement.offsetWidth,{offsetLeft:o,offsetWidth:r}=i.elementRef.nativeElement,s,a;this._getLayoutDirection()=="ltr"?(s=o,a=s+r):(a=this._tabListInner.nativeElement.offsetWidth-o,s=a-r);let c=this.scrollDistance,l=this.scrollDistance+n;sl&&(this.scrollDistance+=Math.min(a-l,s-c))}_checkPaginationEnabled(){if(this.disablePagination)this._showPaginationControls=!1;else{let e=this._tabListInner.nativeElement.scrollWidth,i=this._elementRef.nativeElement.offsetWidth,n=e-i>=5;n||(this.scrollDistance=0),n!==this._showPaginationControls&&(this._showPaginationControls=n,this._changeDetectorRef.markForCheck())}}_checkScrollingControls(){this.disablePagination?this._disableScrollAfter=this._disableScrollBefore=!0:(this._disableScrollBefore=this.scrollDistance==0,this._disableScrollAfter=this.scrollDistance==this._getMaxScrollDistance(),this._changeDetectorRef.markForCheck())}_getMaxScrollDistance(){let e=this._tabListInner.nativeElement.scrollWidth,i=this._tabListContainer.nativeElement.offsetWidth;return e-i||0}_alignInkBarToSelectedTab(){let e=this._items&&this._items.length?this._items.toArray()[this.selectedIndex]:null,i=e?e.elementRef.nativeElement:null;i?this._inkBar.alignToElement(i):this._inkBar.hide()}_stopInterval(){this._stopScrolling.next()}_handlePaginatorPress(e,i){i&&i.button!=null&&i.button!==0||(this._stopInterval(),MI(JAA,YAA).pipe(mt(Bi(this._stopScrolling,this._destroyed))).subscribe(()=>{let{maxScrollDistance:n,distance:o}=this._scrollHeader(e);(o===0||o>=n)&&this._stopInterval()}))}_scrollTo(e){if(this.disablePagination)return{maxScrollDistance:0,distance:0};let i=this._getMaxScrollDistance();return this._scrollDistance=Math.max(0,Math.min(i,e)),this._scrollDistanceChanged=!0,this._checkScrollingControls(),{maxScrollDistance:i,distance:this._scrollDistance}}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,inputs:{disablePagination:[2,"disablePagination","disablePagination",IA],selectedIndex:[2,"selectedIndex","selectedIndex",ln]},outputs:{selectFocusedIndex:"selectFocusedIndex",indexFocused:"indexFocused"}})}return t})(),zAA=(()=>{class t extends HAA{_items;_tabListContainer;_tabList;_tabListInner;_nextPaginator;_previousPaginator;_inkBar;ariaLabel;ariaLabelledby;disableRipple=!1;ngAfterContentInit(){this._inkBar=new hH(this._items),super.ngAfterContentInit()}_itemSelected(e){e.preventDefault()}static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275cmp=xe({type:t,selectors:[["mat-tab-header"]],contentQueries:function(i,n,o){if(i&1&&ni(o,GCe,4),i&2){let r;oA(r=rA())&&(n._items=r)}},viewQuery:function(i,n){if(i&1&&(At(pAA,7),At(wAA,7),At(yAA,7),At(DAA,5),At(vAA,5)),i&2){let o;oA(o=rA())&&(n._tabListContainer=o.first),oA(o=rA())&&(n._tabList=o.first),oA(o=rA())&&(n._tabListInner=o.first),oA(o=rA())&&(n._nextPaginator=o.first),oA(o=rA())&&(n._previousPaginator=o.first)}},hostAttrs:[1,"mat-mdc-tab-header"],hostVars:4,hostBindings:function(i,n){i&2&&iA("mat-mdc-tab-header-pagination-controls-enabled",n._showPaginationControls)("mat-mdc-tab-header-rtl",n._getLayoutDirection()=="rtl")},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],disableRipple:[2,"disableRipple","disableRipple",IA]},features:[Ct],ngContentSelectors:EH,decls:13,vars:10,consts:[["previousPaginator",""],["tabListContainer",""],["tabList",""],["tabListInner",""],["nextPaginator",""],["mat-ripple","",1,"mat-mdc-tab-header-pagination","mat-mdc-tab-header-pagination-before",3,"click","mousedown","touchend","matRippleDisabled"],[1,"mat-mdc-tab-header-pagination-chevron"],[1,"mat-mdc-tab-label-container",3,"keydown"],["role","tablist",1,"mat-mdc-tab-list",3,"cdkObserveContent"],[1,"mat-mdc-tab-labels"],["mat-ripple","",1,"mat-mdc-tab-header-pagination","mat-mdc-tab-header-pagination-after",3,"mousedown","click","touchend","matRippleDisabled"]],template:function(i,n){if(i&1){let o=Ue();Kt(),m(0,"div",5,0),ee("click",function(){return q(o),W(n._handlePaginatorClick("before"))})("mousedown",function(s){return q(o),W(n._handlePaginatorPress("before",s))})("touchend",function(){return q(o),W(n._stopInterval())}),ve(2,"div",6),p(),m(3,"div",7,1),ee("keydown",function(s){return q(o),W(n._handleKeydown(s))}),m(5,"div",8,2),ee("cdkObserveContent",function(){return q(o),W(n._onContentChanges())}),m(7,"div",9,3),NA(9),p()()(),m(10,"div",10,4),ee("mousedown",function(s){return q(o),W(n._handlePaginatorPress("after",s))})("click",function(){return q(o),W(n._handlePaginatorClick("after"))})("touchend",function(){return q(o),W(n._stopInterval())}),ve(12,"div",6),p()}i&2&&(iA("mat-mdc-tab-header-pagination-disabled",n._disableScrollBefore),te("matRippleDisabled",n._disableScrollBefore||n.disableRipple),y(3),iA("_mat-animation-noopable",n._animationMode==="NoopAnimations"),y(2),AA("aria-label",n.ariaLabel||null)("aria-labelledby",n.ariaLabelledby||null),y(5),iA("mat-mdc-tab-header-pagination-disabled",n._disableScrollAfter),te("matRippleDisabled",n._disableScrollAfter||n.disableRipple))},dependencies:[ec,y5],styles:[".mat-mdc-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0}.mdc-tab-indicator .mdc-tab-indicator__content{transition-duration:var(--mat-tab-animation-duration, 250ms)}.mat-mdc-tab-header-pagination{-webkit-user-select:none;user-select:none;position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:rgba(0,0,0,0);touch-action:none;box-sizing:content-box;outline:0}.mat-mdc-tab-header-pagination::-moz-focus-inner{border:0}.mat-mdc-tab-header-pagination .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-header-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-controls-enabled .mat-mdc-tab-header-pagination{display:flex}.mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after{padding-left:4px}.mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-pagination-after{padding-right:4px}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-mdc-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px;border-color:var(--mat-tab-header-pagination-icon-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-disabled{box-shadow:none;cursor:default;pointer-events:none}.mat-mdc-tab-header-pagination-disabled .mat-mdc-tab-header-pagination-chevron{opacity:.4}.mat-mdc-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-mdc-tab-list{transition:none}.mat-mdc-tab-label-container{display:flex;flex-grow:1;overflow:hidden;z-index:1;border-bottom-style:solid;border-bottom-width:var(--mat-tab-header-divider-height, 1px);border-bottom-color:var(--mat-tab-header-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-group-inverted-header .mat-mdc-tab-label-container{border-bottom:none;border-top-style:solid;border-top-width:var(--mat-tab-header-divider-height, 1px);border-top-color:var(--mat-tab-header-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-labels{display:flex;flex:1 0 auto}[mat-align-tabs=center]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:center}[mat-align-tabs=end]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:flex-end}.cdk-drop-list .mat-mdc-tab-labels,.mat-mdc-tab-labels.cdk-drop-list{min-height:var(--mdc-secondary-navigation-tab-container-height, 48px)}.mat-mdc-tab::before{margin:5px}@media(forced-colors: active){.mat-mdc-tab[aria-disabled=true]{color:GrayText}}"],encapsulation:2})}return t})(),PAA=new re("MAT_TABS_CONFIG"),jAA={translateTab:ll("translateTab",[tc("center, void, left-origin-center, right-origin-center",Vo({transform:"none",visibility:"visible"})),tc("left",Vo({transform:"translate3d(-100%, 0, 0)",minHeight:"1px",visibility:"hidden"})),tc("right",Vo({transform:"translate3d(100%, 0, 0)",minHeight:"1px",visibility:"hidden"})),Fs("* => left, * => right, left => center, right => center",ia("{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)")),Fs("void => left-origin-center",[Vo({transform:"translate3d(-100%, 0, 0)",visibility:"hidden"}),ia("{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)")]),Fs("void => right-origin-center",[Vo({transform:"translate3d(100%, 0, 0)",visibility:"hidden"}),ia("{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)")])])},VAA=(()=>{class t extends bc{_host=E(KCe);_centeringSub=Ot.EMPTY;_leavingSub=Ot.EMPTY;constructor(){super()}ngOnInit(){super.ngOnInit(),this._centeringSub=this._host._beforeCentering.pipe(In(this._host._isCenterPosition(this._host._position))).subscribe(e=>{this._host._content&&e&&!this.hasAttached()&&this.attach(this._host._content)}),this._leavingSub=this._host._afterLeavingCenter.subscribe(()=>{this._host.preserveContent||this.detach()})}ngOnDestroy(){super.ngOnDestroy(),this._centeringSub.unsubscribe(),this._leavingSub.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","matTabBodyHost",""]],features:[Ct]})}return t})(),KCe=(()=>{class t{_elementRef=E(eA);_dir=E(Do,{optional:!0});_positionIndex;_dirChangeSubscription=Ot.EMPTY;_position;_translateTabComplete=new je;_onCentering=new Ve;_beforeCentering=new Ve;_afterLeavingCenter=new Ve;_onCentered=new Ve(!0);_portalHost;_content;origin;animationDuration="500ms";preserveContent=!1;set position(e){this._positionIndex=e,this._computePositionAnimationState()}constructor(){if(this._dir){let e=E(ut);this._dirChangeSubscription=this._dir.change.subscribe(i=>{this._computePositionAnimationState(i),e.markForCheck()})}this._translateTabComplete.subscribe(e=>{this._isCenterPosition(e.toState)&&this._isCenterPosition(this._position)&&this._onCentered.emit(),this._isCenterPosition(e.fromState)&&!this._isCenterPosition(this._position)&&this._afterLeavingCenter.emit()})}ngOnInit(){this._position=="center"&&this.origin!=null&&(this._position=this._computePositionFromOrigin(this.origin))}ngOnDestroy(){this._dirChangeSubscription.unsubscribe(),this._translateTabComplete.complete()}_onTranslateTabStarted(e){let i=this._isCenterPosition(e.toState);this._beforeCentering.emit(i),i&&this._onCentering.emit(this._elementRef.nativeElement.clientHeight)}_getLayoutDirection(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_isCenterPosition(e){return e=="center"||e=="left-origin-center"||e=="right-origin-center"}_computePositionAnimationState(e=this._getLayoutDirection()){this._positionIndex<0?this._position=e=="ltr"?"left":"right":this._positionIndex>0?this._position=e=="ltr"?"right":"left":this._position="center"}_computePositionFromOrigin(e){let i=this._getLayoutDirection();return i=="ltr"&&e<=0||i=="rtl"&&e>0?"left-origin-center":"right-origin-center"}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-tab-body"]],viewQuery:function(i,n){if(i&1&&At(bc,5),i&2){let o;oA(o=rA())&&(n._portalHost=o.first)}},hostAttrs:[1,"mat-mdc-tab-body"],inputs:{_content:[0,"content","_content"],origin:"origin",animationDuration:"animationDuration",preserveContent:"preserveContent",position:"position"},outputs:{_onCentering:"_onCentering",_beforeCentering:"_beforeCentering",_afterLeavingCenter:"_afterLeavingCenter",_onCentered:"_onCentered"},decls:3,vars:6,consts:[["content",""],["cdkScrollable","",1,"mat-mdc-tab-body-content"],["matTabBodyHost",""]],template:function(i,n){if(i&1){let o=Ue();m(0,"div",1,0),ee("@translateTab.start",function(s){return q(o),W(n._onTranslateTabStarted(s))})("@translateTab.done",function(s){return q(o),W(n._translateTabComplete.next(s))}),ne(2,SAA,0,0,"ng-template",2),p()}i&2&&te("@translateTab",tl(3,MAA,n._position,Al(1,bAA,n.animationDuration)))},dependencies:[VAA,f2],styles:['.mat-mdc-tab-body{top:0;left:0;right:0;bottom:0;position:absolute;display:block;overflow:hidden;outline:0;flex-basis:100%}.mat-mdc-tab-body.mat-mdc-tab-body-active{position:relative;overflow-x:hidden;overflow-y:auto;z-index:1;flex-grow:1}.mat-mdc-tab-group.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body.mat-mdc-tab-body-active{overflow-y:hidden}.mat-mdc-tab-body-content{height:100%;overflow:auto}.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body-content{overflow:hidden}.mat-mdc-tab-body-content[style*="visibility: hidden"]{display:none}'],encapsulation:2,data:{animation:[jAA.translateTab]}})}return t})(),qAA=!0,a9=(()=>{class t{_elementRef=E(eA);_changeDetectorRef=E(ut);_animationMode=E(Oi,{optional:!0});_allTabs;_tabBodyWrapper;_tabHeader;_tabs=new qa;_indexToSelect=0;_lastFocusedTabIndex=null;_tabBodyWrapperHeight=0;_tabsSubscription=Ot.EMPTY;_tabLabelSubscription=Ot.EMPTY;color;get fitInkBarToContent(){return this._fitInkBarToContent}set fitInkBarToContent(e){this._fitInkBarToContent=e,this._changeDetectorRef.markForCheck()}_fitInkBarToContent=!1;stretchTabs=!0;alignTabs=null;dynamicHeight=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(e){this._indexToSelect=isNaN(e)?null:e}_selectedIndex=null;headerPosition="above";get animationDuration(){return this._animationDuration}set animationDuration(e){let i=e+"";this._animationDuration=/^\d+$/.test(i)?e+"ms":i}_animationDuration;get contentTabIndex(){return this._contentTabIndex}set contentTabIndex(e){this._contentTabIndex=isNaN(e)?null:e}_contentTabIndex;disablePagination=!1;disableRipple=!1;preserveContent=!1;get backgroundColor(){return this._backgroundColor}set backgroundColor(e){if(!qAA)throw new Error("mat-tab-group background color must be set through the Sass theming API");let i=this._elementRef.nativeElement.classList;i.remove("mat-tabs-with-background",`mat-background-${this.backgroundColor}`),e&&i.add("mat-tabs-with-background",`mat-background-${e}`),this._backgroundColor=e}_backgroundColor;ariaLabel;ariaLabelledby;selectedIndexChange=new Ve;focusChange=new Ve;animationDone=new Ve;selectedTabChange=new Ve(!0);_groupId;_isServer=!E(mi).isBrowser;constructor(){let e=E(PAA,{optional:!0});this._groupId=E(un).getId("mat-tab-group-"),this.animationDuration=e&&e.animationDuration?e.animationDuration:"500ms",this.disablePagination=e&&e.disablePagination!=null?e.disablePagination:!1,this.dynamicHeight=e&&e.dynamicHeight!=null?e.dynamicHeight:!1,e?.contentTabIndex!=null&&(this.contentTabIndex=e.contentTabIndex),this.preserveContent=!!e?.preserveContent,this.fitInkBarToContent=e&&e.fitInkBarToContent!=null?e.fitInkBarToContent:!1,this.stretchTabs=e&&e.stretchTabs!=null?e.stretchTabs:!0,this.alignTabs=e&&e.alignTabs!=null?e.alignTabs:null}ngAfterContentChecked(){let e=this._indexToSelect=this._clampTabIndex(this._indexToSelect);if(this._selectedIndex!=e){let i=this._selectedIndex==null;if(!i){this.selectedTabChange.emit(this._createChangeEvent(e));let n=this._tabBodyWrapper.nativeElement;n.style.minHeight=n.clientHeight+"px"}Promise.resolve().then(()=>{this._tabs.forEach((n,o)=>n.isActive=o===e),i||(this.selectedIndexChange.emit(e),this._tabBodyWrapper.nativeElement.style.minHeight="")})}this._tabs.forEach((i,n)=>{i.position=n-e,this._selectedIndex!=null&&i.position==0&&!i.origin&&(i.origin=e-this._selectedIndex)}),this._selectedIndex!==e&&(this._selectedIndex=e,this._lastFocusedTabIndex=null,this._changeDetectorRef.markForCheck())}ngAfterContentInit(){this._subscribeToAllTabChanges(),this._subscribeToTabLabels(),this._tabsSubscription=this._tabs.changes.subscribe(()=>{let e=this._clampTabIndex(this._indexToSelect);if(e===this._selectedIndex){let i=this._tabs.toArray(),n;for(let o=0;o{i[e].isActive=!0,this.selectedTabChange.emit(this._createChangeEvent(e))})}this._changeDetectorRef.markForCheck()})}_subscribeToAllTabChanges(){this._allTabs.changes.pipe(In(this._allTabs)).subscribe(e=>{this._tabs.reset(e.filter(i=>i._closestTabGroup===this||!i._closestTabGroup)),this._tabs.notifyOnChanges()})}ngOnDestroy(){this._tabs.destroy(),this._tabsSubscription.unsubscribe(),this._tabLabelSubscription.unsubscribe()}realignInkBar(){this._tabHeader&&this._tabHeader._alignInkBarToSelectedTab()}updatePagination(){this._tabHeader&&this._tabHeader.updatePagination()}focusTab(e){let i=this._tabHeader;i&&(i.focusIndex=e)}_focusChanged(e){this._lastFocusedTabIndex=e,this.focusChange.emit(this._createChangeEvent(e))}_createChangeEvent(e){let i=new BH;return i.index=e,this._tabs&&this._tabs.length&&(i.tab=this._tabs.toArray()[e]),i}_subscribeToTabLabels(){this._tabLabelSubscription&&this._tabLabelSubscription.unsubscribe(),this._tabLabelSubscription=Bi(...this._tabs.map(e=>e._stateChanges)).subscribe(()=>this._changeDetectorRef.markForCheck())}_clampTabIndex(e){return Math.min(this._tabs.length-1,Math.max(e||0,0))}_getTabLabelId(e){return`${this._groupId}-label-${e}`}_getTabContentId(e){return`${this._groupId}-content-${e}`}_setTabBodyWrapperHeight(e){if(!this.dynamicHeight||!this._tabBodyWrapperHeight)return;let i=this._tabBodyWrapper.nativeElement;i.style.height=this._tabBodyWrapperHeight+"px",this._tabBodyWrapper.nativeElement.offsetHeight&&(i.style.height=e+"px")}_removeTabBodyWrapperHeight(){let e=this._tabBodyWrapper.nativeElement;this._tabBodyWrapperHeight=e.clientHeight,e.style.height="",this.animationDone.emit()}_handleClick(e,i,n){i.focusIndex=n,e.disabled||(this.selectedIndex=n)}_getTabIndex(e){let i=this._lastFocusedTabIndex??this.selectedIndex;return e===i?0:-1}_tabFocusChanged(e,i){e&&e!=="mouse"&&e!=="touch"&&(this._tabHeader.focusIndex=i)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-tab-group"]],contentQueries:function(i,n,o){if(i&1&&ni(o,g6,5),i&2){let r;oA(r=rA())&&(n._allTabs=r)}},viewQuery:function(i,n){if(i&1&&(At(kAA,5),At(xAA,5)),i&2){let o;oA(o=rA())&&(n._tabBodyWrapper=o.first),oA(o=rA())&&(n._tabHeader=o.first)}},hostAttrs:[1,"mat-mdc-tab-group"],hostVars:11,hostBindings:function(i,n){i&2&&(AA("mat-align-tabs",n.alignTabs),Lo("mat-"+(n.color||"primary")),cn("--mat-tab-animation-duration",n.animationDuration),iA("mat-mdc-tab-group-dynamic-height",n.dynamicHeight)("mat-mdc-tab-group-inverted-header",n.headerPosition==="below")("mat-mdc-tab-group-stretch-tabs",n.stretchTabs))},inputs:{color:"color",fitInkBarToContent:[2,"fitInkBarToContent","fitInkBarToContent",IA],stretchTabs:[2,"mat-stretch-tabs","stretchTabs",IA],alignTabs:[0,"mat-align-tabs","alignTabs"],dynamicHeight:[2,"dynamicHeight","dynamicHeight",IA],selectedIndex:[2,"selectedIndex","selectedIndex",ln],headerPosition:"headerPosition",animationDuration:"animationDuration",contentTabIndex:[2,"contentTabIndex","contentTabIndex",ln],disablePagination:[2,"disablePagination","disablePagination",IA],disableRipple:[2,"disableRipple","disableRipple",IA],preserveContent:[2,"preserveContent","preserveContent",IA],backgroundColor:"backgroundColor",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"]},outputs:{selectedIndexChange:"selectedIndexChange",focusChange:"focusChange",animationDone:"animationDone",selectedTabChange:"selectedTabChange"},exportAs:["matTabGroup"],features:[gt([{provide:FCe,useExisting:t}])],ngContentSelectors:EH,decls:9,vars:8,consts:[["tabHeader",""],["tabBodyWrapper",""],["tabNode",""],[3,"indexFocused","selectFocusedIndex","selectedIndex","disableRipple","disablePagination","aria-label","aria-labelledby"],["role","tab","matTabLabelWrapper","","cdkMonitorElementFocus","",1,"mdc-tab","mat-mdc-tab","mat-focus-indicator",3,"id","mdc-tab--active","class","disabled","fitInkBarToContent"],[1,"mat-mdc-tab-body-wrapper"],["role","tabpanel",3,"id","mat-mdc-tab-body-active","class","content","position","origin","animationDuration","preserveContent"],["role","tab","matTabLabelWrapper","","cdkMonitorElementFocus","",1,"mdc-tab","mat-mdc-tab","mat-focus-indicator",3,"click","cdkFocusChange","id","disabled","fitInkBarToContent"],[1,"mdc-tab__ripple"],["mat-ripple","",1,"mat-mdc-tab-ripple",3,"matRippleTrigger","matRippleDisabled"],[1,"mdc-tab__content"],[1,"mdc-tab__text-label"],[3,"cdkPortalOutlet"],["role","tabpanel",3,"_onCentered","_onCentering","id","content","position","origin","animationDuration","preserveContent"]],template:function(i,n){if(i&1){let o=Ue();Kt(),m(0,"mat-tab-header",3,0),ee("indexFocused",function(s){return q(o),W(n._focusChanged(s))})("selectFocusedIndex",function(s){return q(o),W(n.selectedIndex=s)}),Rt(2,LAA,8,17,"div",4,Fi),p(),ne(4,FAA,1,0),m(5,"div",5,1),Rt(7,GAA,1,13,"mat-tab-body",6,Fi),p()}i&2&&(te("selectedIndex",n.selectedIndex||0)("disableRipple",n.disableRipple)("disablePagination",n.disablePagination)("aria-label",n.ariaLabel)("aria-labelledby",n.ariaLabelledby),y(2),Nt(n._tabs),y(2),$(n._isServer?4:-1),y(),iA("_mat-animation-noopable",n._animationMode==="NoopAnimations"),y(2),Nt(n._tabs))},dependencies:[zAA,GCe,eX,ec,bc,KCe],styles:['.mdc-tab{min-width:90px;padding:0 24px;display:flex;flex:1 0 auto;justify-content:center;box-sizing:border-box;border:none;outline:none;text-align:center;white-space:nowrap;cursor:pointer;z-index:1}.mdc-tab__content{display:flex;align-items:center;justify-content:center;height:inherit;pointer-events:none}.mdc-tab__text-label{transition:150ms color linear;display:inline-block;line-height:1;z-index:2}.mdc-tab--active .mdc-tab__text-label{transition-delay:100ms}._mat-animation-noopable .mdc-tab__text-label{transition:none}.mdc-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.mdc-tab-indicator__content{transition:var(--mat-tab-animation-duration, 250ms) transform cubic-bezier(0.4, 0, 0.2, 1);transform-origin:left;opacity:0}.mdc-tab-indicator__content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:1}._mat-animation-noopable .mdc-tab-indicator__content,.mdc-tab-indicator--no-transition .mdc-tab-indicator__content{transition:none}.mat-mdc-tab-ripple.mat-mdc-tab-ripple{position:absolute;top:0;left:0;bottom:0;right:0;pointer-events:none}.mat-mdc-tab{-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none;background:none;height:var(--mdc-secondary-navigation-tab-container-height, 48px);font-family:var(--mat-tab-header-label-text-font, var(--mat-sys-title-small-font));font-size:var(--mat-tab-header-label-text-size, var(--mat-sys-title-small-size));letter-spacing:var(--mat-tab-header-label-text-tracking, var(--mat-sys-title-small-tracking));line-height:var(--mat-tab-header-label-text-line-height, var(--mat-sys-title-small-line-height));font-weight:var(--mat-tab-header-label-text-weight, var(--mat-sys-title-small-weight))}.mat-mdc-tab.mdc-tab{flex-grow:0}.mat-mdc-tab .mdc-tab-indicator__content--underline{border-color:var(--mdc-tab-indicator-active-indicator-color, var(--mat-sys-primary));border-top-width:var(--mdc-tab-indicator-active-indicator-height, 2px);border-radius:var(--mdc-tab-indicator-active-indicator-shape, 0)}.mat-mdc-tab:hover .mdc-tab__text-label{color:var(--mat-tab-header-inactive-hover-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab:focus .mdc-tab__text-label{color:var(--mat-tab-header-inactive-focus-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active .mdc-tab__text-label{color:var(--mat-tab-header-active-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active .mdc-tab__ripple::before,.mat-mdc-tab.mdc-tab--active .mat-ripple-element{background-color:var(--mat-tab-header-active-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab__text-label{color:var(--mat-tab-header-active-hover-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-active-hover-indicator-color, var(--mat-sys-primary))}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab__text-label{color:var(--mat-tab-header-active-focus-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-active-focus-indicator-color, var(--mat-sys-primary))}.mat-mdc-tab.mat-mdc-tab-disabled{opacity:.4;pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__content{pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__ripple::before,.mat-mdc-tab.mat-mdc-tab-disabled .mat-ripple-element{background-color:var(--mat-tab-header-disabled-ripple-color)}.mat-mdc-tab .mdc-tab__ripple::before{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;background-color:var(--mat-tab-header-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-header-inactive-label-text-color, var(--mat-sys-on-surface));display:inline-flex;align-items:center}.mat-mdc-tab .mdc-tab__content{position:relative;pointer-events:auto}.mat-mdc-tab:hover .mdc-tab__ripple::before{opacity:.04}.mat-mdc-tab.cdk-program-focused .mdc-tab__ripple::before,.mat-mdc-tab.cdk-keyboard-focused .mdc-tab__ripple::before{opacity:.12}.mat-mdc-tab .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-header-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-group.mat-mdc-tab-group-stretch-tabs>.mat-mdc-tab-header .mat-mdc-tab{flex-grow:1}.mat-mdc-tab-group{display:flex;flex-direction:column;max-width:100%}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination{background-color:var(--mat-tab-header-with-background-background-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-focus-indicator::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-focus-indicator::before{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mdc-tab__ripple::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mdc-tab__ripple::before{background-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header{flex-direction:column-reverse}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header .mdc-tab-indicator__content--underline{align-self:flex-start}.mat-mdc-tab-body-wrapper{position:relative;overflow:hidden;display:flex;transition:height 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable{transition:none !important;animation:none !important}'],encapsulation:2})}return t})(),BH=class{index;tab};var c9=new re("LOGO_COMPONENT");function WAA(t,A){t&1&&ve(0,"div",6)}function ZAA(t,A){if(t&1&&(m(0,"div",3)(1,"div",5),Rt(2,WAA,1,0,"div",6,b1),p(),m(4,"span",7),T(5),p(),m(6,"div",8),T(7),m(8,"span",9),T(9),p()(),m(10,"div",10)(11,"div",11),T(12),p()()()),t&2){let e=A.$implicit,i=M();y(2),Nt(i.getArray(e.level)),y(3),FA(" ",i.getSpanIcon(e.span.name)," "),y(),cn("width",400-e.level*20,"px"),y(),FA(" ",e.span.name," "),y(2),FA(" (",(i.toMs(e.span.end_time)-i.toMs(e.span.start_time)).toFixed(2),"ms) "),y(2),cn("left",i.getRelativeStart(e.span),"%")("width",i.getRelativeWidth(e.span),"%"),y(),FA(" ",(i.toMs(e.span.end_time)-i.toMs(e.span.start_time)).toFixed(2),"ms ")}}var l9=class t{constructor(A,e){this.dialogRef=A;this.data=e}tree=[];baseStartTimeMs=0;totalDurationMs=1;flatTree=[];traceLabelIconMap=new Map([["Invocation","start"],["agent_run","directions_run"],["invoke_agent","directions_run"],["tool","build"],["call_llm","chat"]]);ngOnInit(){this.tree=this.buildSpanTree(this.data.spans),this.flatTree=this.flattenTree(this.tree);let A=this.getGlobalTimes(this.data.spans);this.baseStartTimeMs=A.start,this.totalDurationMs=A.duration}buildSpanTree(A){let e=A.map(o=>ae({},o)),i=new Map,n=[];return e.forEach(o=>i.set(o.span_id,o)),e.forEach(o=>{if(o.parent_span_id&&i.has(o.parent_span_id)){let r=i.get(o.parent_span_id);r.children=r.children||[],r.children.push(o)}else n.push(o)}),n}getGlobalTimes(A){let e=Math.min(...A.map(n=>this.toMs(n.start_time))),i=Math.max(...A.map(n=>this.toMs(n.end_time)));return{start:e,duration:i-e}}toMs(A){return A/1e6}getRelativeStart(A){return(this.toMs(A.start_time)-this.baseStartTimeMs)/this.totalDurationMs*100}getRelativeWidth(A){return(this.toMs(A.end_time)-this.toMs(A.start_time))/this.totalDurationMs*100}flattenTree(A,e=0){return A.flatMap(n=>[{span:n,level:e},...n.children?this.flattenTree(n.children,e+1):[]])}getSpanIcon(A){for(let[e,i]of this.traceLabelIconMap.entries())if(A.startsWith(e))return i;return"start"}getArray(A){return Array.from({length:A})}static \u0275fac=function(e){return new(e||t)(DA(co),DA(qo))};static \u0275cmp=xe({type:t,selectors:[["app-trace-chart"]],decls:9,vars:1,consts:[["mat-dialog-title",""],[2,"margin-top","8px"],[1,"trace-container"],[1,"trace-row"],["mat-button","","mat-dialog-close",""],[1,"trace-indent"],[1,"indent-connector"],[1,"material-symbols-outlined",2,"margin-right","8px"],[1,"trace-label"],[1,"trace-duration"],[1,"trace-bar-container"],[1,"trace-bar"]],template:function(e,i){e&1&&(m(0,"h2",0),T(1),p(),m(2,"mat-dialog-content",1)(3,"div",2),Rt(4,ZAA,13,10,"div",3,Fi),p()(),m(6,"mat-dialog-actions")(7,"button",4),T(8,"Close"),p()()),e&2&&(y(),FA("Invocation ",i.data.invocId,""),y(3),Nt(i.flatTree))},dependencies:[tr,jr,kr,Un,Jl],styles:[".trace-container[_ngcontent-%COMP%]{width:100%;white-space:nowrap;font-size:12px}.trace-label[_ngcontent-%COMP%]{width:400px;color:var(--trace-chart-trace-label-color);text-overflow:ellipsis;font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:0px}.trace-bar-container[_ngcontent-%COMP%]{width:50vw;position:relative;height:16px}.trace-bar[_ngcontent-%COMP%]{position:absolute;height:18px;background-color:var(--trace-chart-trace-bar-background-color);border-radius:4px;padding-left:4px;overflow:hidden;font-size:11px;line-height:16px;color:var(--trace-chart-trace-bar-color);font-family:Google Sans}.trace-duration[_ngcontent-%COMP%]{color:var(--trace-chart-trace-duration-color);font-weight:400;margin-left:4px}.trace-row[_ngcontent-%COMP%]{display:flex;align-items:stretch;position:relative;height:32px}.trace-indent[_ngcontent-%COMP%]{display:flex;flex-shrink:0;height:100%}.indent-connector[_ngcontent-%COMP%]{width:20px;position:relative;height:100%}.vertical-line[_ngcontent-%COMP%]{position:absolute;top:0;bottom:0;left:9px;width:1px;background-color:var(--trace-chart-vertical-line-background-color)}.horizontal-line[_ngcontent-%COMP%]{position:absolute;top:50%;left:9px;width:10px;height:1px;background-color:var(--trace-chart-horizontal-line-background-color)}"]})};var XAA=["button"],$AA=["*"];function etA(t,A){if(t&1&&(m(0,"div",2),ve(1,"mat-pseudo-checkbox",6),p()),t&2){let e=M();y(),te("disabled",e.disabled)}}var UCe=new re("MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS",{providedIn:"root",factory:AtA});function AtA(){return{hideSingleSelectionIndicator:!1,hideMultipleSelectionIndicator:!1,disabledInteractive:!1}}var TCe=new re("MatButtonToggleGroup"),ttA={provide:sl,useExisting:zr(()=>QH),multi:!0},g9=class{source;value;constructor(A,e){this.source=A,this.value=e}},QH=(()=>{class t{_changeDetector=E(ut);_dir=E(Do,{optional:!0});_multiple=!1;_disabled=!1;_disabledInteractive=!1;_selectionModel;_rawValue;_controlValueAccessorChangeFn=()=>{};_onTouched=()=>{};_buttonToggles;appearance;get name(){return this._name}set name(e){this._name=e,this._markButtonsForCheck()}_name=E(un).getId("mat-button-toggle-group-");vertical;get value(){let e=this._selectionModel?this._selectionModel.selected:[];return this.multiple?e.map(i=>i.value):e[0]?e[0].value:void 0}set value(e){this._setSelectionByValue(e),this.valueChange.emit(this.value)}valueChange=new Ve;get selected(){let e=this._selectionModel?this._selectionModel.selected:[];return this.multiple?e:e[0]||null}get multiple(){return this._multiple}set multiple(e){this._multiple=e,this._markButtonsForCheck()}get disabled(){return this._disabled}set disabled(e){this._disabled=e,this._markButtonsForCheck()}get disabledInteractive(){return this._disabledInteractive}set disabledInteractive(e){this._disabledInteractive=e,this._markButtonsForCheck()}get dir(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}change=new Ve;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(e){this._hideSingleSelectionIndicator=e,this._markButtonsForCheck()}_hideSingleSelectionIndicator;get hideMultipleSelectionIndicator(){return this._hideMultipleSelectionIndicator}set hideMultipleSelectionIndicator(e){this._hideMultipleSelectionIndicator=e,this._markButtonsForCheck()}_hideMultipleSelectionIndicator;constructor(){let e=E(UCe,{optional:!0});this.appearance=e&&e.appearance?e.appearance:"standard",this.hideSingleSelectionIndicator=e?.hideSingleSelectionIndicator??!1,this.hideMultipleSelectionIndicator=e?.hideMultipleSelectionIndicator??!1}ngOnInit(){this._selectionModel=new J1(this.multiple,void 0,!1)}ngAfterContentInit(){this._selectionModel.select(...this._buttonToggles.filter(e=>e.checked)),this.multiple||this._initializeTabIndex()}writeValue(e){this.value=e,this._changeDetector.markForCheck()}registerOnChange(e){this._controlValueAccessorChangeFn=e}registerOnTouched(e){this._onTouched=e}setDisabledState(e){this.disabled=e}_keydown(e){if(this.multiple||this.disabled)return;let n=e.target.id,o=this._buttonToggles.toArray().findIndex(s=>s.buttonId===n),r=null;switch(e.keyCode){case 32:case 13:r=this._buttonToggles.get(o)||null;break;case 38:r=this._getNextButton(o,-1);break;case 37:r=this._getNextButton(o,this.dir==="ltr"?-1:1);break;case 40:r=this._getNextButton(o,1);break;case 39:r=this._getNextButton(o,this.dir==="ltr"?1:-1);break;default:return}r&&(e.preventDefault(),r._onButtonClick(),r.focus())}_emitChangeEvent(e){let i=new g9(e,this.value);this._rawValue=i.value,this._controlValueAccessorChangeFn(i.value),this.change.emit(i)}_syncButtonToggle(e,i,n=!1,o=!1){!this.multiple&&this.selected&&!e.checked&&(this.selected.checked=!1),this._selectionModel?i?this._selectionModel.select(e):this._selectionModel.deselect(e):o=!0,o?Promise.resolve().then(()=>this._updateModelValue(e,n)):this._updateModelValue(e,n)}_isSelected(e){return this._selectionModel&&this._selectionModel.isSelected(e)}_isPrechecked(e){return typeof this._rawValue>"u"?!1:this.multiple&&Array.isArray(this._rawValue)?this._rawValue.some(i=>e.value!=null&&i===e.value):e.value===this._rawValue}_initializeTabIndex(){if(this._buttonToggles.forEach(e=>{e.tabIndex=-1}),this.selected)this.selected.tabIndex=0;else for(let e=0;ethis._selectValue(n,i))):(this._clearSelection(),this._selectValue(e,i)),!this.multiple&&i.every(n=>n.tabIndex===-1)){for(let n of i)if(!n.disabled){n.tabIndex=0;break}}}_clearSelection(){this._selectionModel.clear(),this._buttonToggles.forEach(e=>{e.checked=!1,this.multiple||(e.tabIndex=-1)})}_selectValue(e,i){for(let n of i)if(n.value===e){n.checked=!0,this._selectionModel.select(n),this.multiple||(n.tabIndex=0);break}}_updateModelValue(e,i){i&&this._emitChangeEvent(e),this.valueChange.emit(this.value)}_markButtonsForCheck(){this._buttonToggles?.forEach(e=>e._markForCheck())}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["mat-button-toggle-group"]],contentQueries:function(i,n,o){if(i&1&&ni(o,mH,5),i&2){let r;oA(r=rA())&&(n._buttonToggles=r)}},hostAttrs:[1,"mat-button-toggle-group"],hostVars:6,hostBindings:function(i,n){i&1&&ee("keydown",function(r){return n._keydown(r)}),i&2&&(AA("role",n.multiple?"group":"radiogroup")("aria-disabled",n.disabled),iA("mat-button-toggle-vertical",n.vertical)("mat-button-toggle-group-appearance-standard",n.appearance==="standard"))},inputs:{appearance:"appearance",name:"name",vertical:[2,"vertical","vertical",IA],value:"value",multiple:[2,"multiple","multiple",IA],disabled:[2,"disabled","disabled",IA],disabledInteractive:[2,"disabledInteractive","disabledInteractive",IA],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",IA],hideMultipleSelectionIndicator:[2,"hideMultipleSelectionIndicator","hideMultipleSelectionIndicator",IA]},outputs:{valueChange:"valueChange",change:"change"},exportAs:["matButtonToggleGroup"],features:[gt([ttA,{provide:TCe,useExisting:t}])]})}return t})(),mH=(()=>{class t{_changeDetectorRef=E(ut);_elementRef=E(eA);_focusMonitor=E(ns);_idGenerator=E(un);_animationMode=E(Oi,{optional:!0});_checked=!1;ariaLabel;ariaLabelledby=null;_buttonElement;buttonToggleGroup;get buttonId(){return`${this.id}-button`}id;name;value;get tabIndex(){return this._tabIndex}set tabIndex(e){e!==this._tabIndex&&(this._tabIndex=e,this._markForCheck())}_tabIndex;disableRipple;get appearance(){return this.buttonToggleGroup?this.buttonToggleGroup.appearance:this._appearance}set appearance(e){this._appearance=e}_appearance;get checked(){return this.buttonToggleGroup?this.buttonToggleGroup._isSelected(this):this._checked}set checked(e){e!==this._checked&&(this._checked=e,this.buttonToggleGroup&&this.buttonToggleGroup._syncButtonToggle(this,this._checked),this._changeDetectorRef.markForCheck())}get disabled(){return this._disabled||this.buttonToggleGroup&&this.buttonToggleGroup.disabled}set disabled(e){this._disabled=e}_disabled=!1;get disabledInteractive(){return this._disabledInteractive||this.buttonToggleGroup!==null&&this.buttonToggleGroup.disabledInteractive}set disabledInteractive(e){this._disabledInteractive=e}_disabledInteractive;change=new Ve;constructor(){E(Wn).load(Pr);let e=E(TCe,{optional:!0}),i=E(new ws("tabindex"),{optional:!0})||"",n=E(UCe,{optional:!0});this._tabIndex=parseInt(i)||0,this.buttonToggleGroup=e,this.appearance=n&&n.appearance?n.appearance:"standard",this.disabledInteractive=n?.disabledInteractive??!1}ngOnInit(){let e=this.buttonToggleGroup;this.id=this.id||this._idGenerator.getId("mat-button-toggle-"),e&&(e._isPrechecked(this)?this.checked=!0:e._isSelected(this)!==this._checked&&e._syncButtonToggle(this,this._checked))}ngAfterViewInit(){this._animationMode!=="NoopAnimations"&&this._elementRef.nativeElement.classList.add("mat-button-toggle-animations-enabled"),this._focusMonitor.monitor(this._elementRef,!0)}ngOnDestroy(){let e=this.buttonToggleGroup;this._focusMonitor.stopMonitoring(this._elementRef),e&&e._isSelected(this)&&e._syncButtonToggle(this,!1,!1,!0)}focus(e){this._buttonElement.nativeElement.focus(e)}_onButtonClick(){if(this.disabled)return;let e=this.isSingleSelector()?!0:!this._checked;if(e!==this._checked&&(this._checked=e,this.buttonToggleGroup&&(this.buttonToggleGroup._syncButtonToggle(this,this._checked,!0),this.buttonToggleGroup._onTouched())),this.isSingleSelector()){let i=this.buttonToggleGroup._buttonToggles.find(n=>n.tabIndex===0);i&&(i.tabIndex=-1),this.tabIndex=0}this.change.emit(new g9(this,this.value))}_markForCheck(){this._changeDetectorRef.markForCheck()}_getButtonName(){return this.isSingleSelector()?this.buttonToggleGroup.name:this.name||null}isSingleSelector(){return this.buttonToggleGroup&&!this.buttonToggleGroup.multiple}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-button-toggle"]],viewQuery:function(i,n){if(i&1&&At(XAA,5),i&2){let o;oA(o=rA())&&(n._buttonElement=o.first)}},hostAttrs:["role","presentation",1,"mat-button-toggle"],hostVars:14,hostBindings:function(i,n){i&1&&ee("focus",function(){return n.focus()}),i&2&&(AA("aria-label",null)("aria-labelledby",null)("id",n.id)("name",null),iA("mat-button-toggle-standalone",!n.buttonToggleGroup)("mat-button-toggle-checked",n.checked)("mat-button-toggle-disabled",n.disabled)("mat-button-toggle-disabled-interactive",n.disabledInteractive)("mat-button-toggle-appearance-standard",n.appearance==="standard"))},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],id:"id",name:"name",value:"value",tabIndex:"tabIndex",disableRipple:[2,"disableRipple","disableRipple",IA],appearance:"appearance",checked:[2,"checked","checked",IA],disabled:[2,"disabled","disabled",IA],disabledInteractive:[2,"disabledInteractive","disabledInteractive",IA]},outputs:{change:"change"},exportAs:["matButtonToggle"],ngContentSelectors:$AA,decls:7,vars:13,consts:[["button",""],["type","button",1,"mat-button-toggle-button","mat-focus-indicator",3,"click","id","disabled"],[1,"mat-button-toggle-checkbox-wrapper"],[1,"mat-button-toggle-label-content"],[1,"mat-button-toggle-focus-overlay"],["matRipple","",1,"mat-button-toggle-ripple",3,"matRippleTrigger","matRippleDisabled"],["state","checked","aria-hidden","true","appearance","minimal",3,"disabled"]],template:function(i,n){if(i&1){let o=Ue();Kt(),m(0,"button",1,0),ee("click",function(){return q(o),W(n._onButtonClick())}),ne(2,etA,2,1,"div",2),m(3,"span",3),NA(4),p()(),ve(5,"span",4)(6,"span",5)}if(i&2){let o=Ji(1);te("id",n.buttonId)("disabled",n.disabled&&!n.disabledInteractive||null),AA("role",n.isSingleSelector()?"radio":"button")("tabindex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex)("aria-pressed",n.isSingleSelector()?null:n.checked)("aria-checked",n.isSingleSelector()?n.checked:null)("name",n._getButtonName())("aria-label",n.ariaLabel)("aria-labelledby",n.ariaLabelledby)("aria-disabled",n.disabled&&n.disabledInteractive?"true":null),y(2),$(n.buttonToggleGroup&&(!n.buttonToggleGroup.multiple&&!n.buttonToggleGroup.hideSingleSelectionIndicator||n.buttonToggleGroup.multiple&&!n.buttonToggleGroup.hideMultipleSelectionIndicator)?2:-1),y(4),te("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)}},dependencies:[ec,_N],styles:[".mat-button-toggle-standalone,.mat-button-toggle-group{position:relative;display:inline-flex;flex-direction:row;white-space:nowrap;overflow:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0);transform:translateZ(0);border-radius:var(--mat-legacy-button-toggle-shape)}.mat-button-toggle-standalone:not([class*=mat-elevation-z]),.mat-button-toggle-group:not([class*=mat-elevation-z]){box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12)}@media(forced-colors: active){.mat-button-toggle-standalone,.mat-button-toggle-group{outline:solid 1px}}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{border-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border:solid 1px var(--mat-standard-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard .mat-pseudo-checkbox,.mat-button-toggle-group-appearance-standard .mat-pseudo-checkbox{--mat-minimal-pseudo-checkbox-selected-checkmark-color: var(--mat-standard-button-toggle-selected-state-text-color, var(--mat-sys-on-secondary-container))}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard:not([class*=mat-elevation-z]),.mat-button-toggle-group-appearance-standard:not([class*=mat-elevation-z]){box-shadow:none}@media(forced-colors: active){.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{outline:0}}.mat-button-toggle-vertical{flex-direction:column}.mat-button-toggle-vertical .mat-button-toggle-label-content{display:block}.mat-button-toggle{white-space:nowrap;position:relative;color:var(--mat-legacy-button-toggle-text-color);font-family:var(--mat-legacy-button-toggle-label-text-font);font-size:var(--mat-legacy-button-toggle-label-text-size);line-height:var(--mat-legacy-button-toggle-label-text-line-height);font-weight:var(--mat-legacy-button-toggle-label-text-weight);letter-spacing:var(--mat-legacy-button-toggle-label-text-tracking);--mat-minimal-pseudo-checkbox-selected-checkmark-color: var(--mat-legacy-button-toggle-selected-state-text-color)}.mat-button-toggle.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:var(--mat-legacy-button-toggle-focus-state-layer-opacity)}.mat-button-toggle .mat-icon svg{vertical-align:top}.mat-button-toggle-checkbox-wrapper{display:inline-block;justify-content:flex-start;align-items:center;width:0;height:18px;line-height:18px;overflow:hidden;box-sizing:border-box;position:absolute;top:50%;left:16px;transform:translate3d(0, -50%, 0)}[dir=rtl] .mat-button-toggle-checkbox-wrapper{left:auto;right:16px}.mat-button-toggle-appearance-standard .mat-button-toggle-checkbox-wrapper{left:12px}[dir=rtl] .mat-button-toggle-appearance-standard .mat-button-toggle-checkbox-wrapper{left:auto;right:12px}.mat-button-toggle-checked .mat-button-toggle-checkbox-wrapper{width:18px}.mat-button-toggle-animations-enabled .mat-button-toggle-checkbox-wrapper{transition:width 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-button-toggle-vertical .mat-button-toggle-checkbox-wrapper{transition:none}.mat-button-toggle-checked{color:var(--mat-legacy-button-toggle-selected-state-text-color);background-color:var(--mat-legacy-button-toggle-selected-state-background-color)}.mat-button-toggle-disabled{pointer-events:none;color:var(--mat-legacy-button-toggle-disabled-state-text-color);background-color:var(--mat-legacy-button-toggle-disabled-state-background-color);--mat-minimal-pseudo-checkbox-disabled-selected-checkmark-color: var(--mat-legacy-button-toggle-disabled-state-text-color)}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:var(--mat-legacy-button-toggle-disabled-selected-state-background-color)}.mat-button-toggle-disabled-interactive{pointer-events:auto}.mat-button-toggle-appearance-standard{color:var(--mat-standard-button-toggle-text-color, var(--mat-sys-on-surface));background-color:var(--mat-standard-button-toggle-background-color, transparent);font-family:var(--mat-standard-button-toggle-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-standard-button-toggle-label-text-size, var(--mat-sys-label-large-size));line-height:var(--mat-standard-button-toggle-label-text-line-height, var(--mat-sys-label-large-line-height));font-weight:var(--mat-standard-button-toggle-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-standard-button-toggle-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-button-toggle-group-appearance-standard .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:solid 1px var(--mat-standard-button-toggle-divider-color, var(--mat-sys-outline))}[dir=rtl] .mat-button-toggle-group-appearance-standard .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:none;border-right:solid 1px var(--mat-standard-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:none;border-right:none;border-top:solid 1px var(--mat-standard-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-appearance-standard.mat-button-toggle-checked{color:var(--mat-standard-button-toggle-selected-state-text-color, var(--mat-sys-on-secondary-container));background-color:var(--mat-standard-button-toggle-selected-state-background-color, var(--mat-sys-secondary-container))}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled{color:var(--mat-standard-button-toggle-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-standard-button-toggle-disabled-state-background-color, transparent)}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled .mat-pseudo-checkbox{--mat-minimal-pseudo-checkbox-disabled-selected-checkmark-color: var(--mat-standard-button-toggle-disabled-selected-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled.mat-button-toggle-checked{color:var(--mat-standard-button-toggle-disabled-selected-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-standard-button-toggle-disabled-selected-state-background-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:var(--mat-standard-button-toggle-state-layer-color, var(--mat-sys-on-surface))}.mat-button-toggle-appearance-standard:hover .mat-button-toggle-focus-overlay{opacity:var(--mat-standard-button-toggle-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-button-toggle-appearance-standard.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:var(--mat-standard-button-toggle-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}@media(hover: none){.mat-button-toggle-appearance-standard:hover .mat-button-toggle-focus-overlay{display:none}}.mat-button-toggle-label-content{-webkit-user-select:none;user-select:none;display:inline-block;padding:0 16px;line-height:var(--mat-legacy-button-toggle-height);position:relative}.mat-button-toggle-appearance-standard .mat-button-toggle-label-content{padding:0 12px;line-height:var(--mat-standard-button-toggle-height, 40px)}.mat-button-toggle-label-content>*{vertical-align:middle}.mat-button-toggle-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit;pointer-events:none;opacity:0;background-color:var(--mat-legacy-button-toggle-state-layer-color)}@media(forced-colors: active){.mat-button-toggle-checked .mat-button-toggle-focus-overlay{border-bottom:solid 500px;opacity:.5;height:0}.mat-button-toggle-checked:hover .mat-button-toggle-focus-overlay{opacity:.6}.mat-button-toggle-checked.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{border-bottom:solid 500px}}.mat-button-toggle .mat-button-toggle-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-toggle-button{border:0;background:none;color:inherit;padding:0;margin:0;font:inherit;outline:none;width:100%;cursor:pointer}.mat-button-toggle-animations-enabled .mat-button-toggle-button{transition:padding 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-button-toggle-vertical .mat-button-toggle-button{transition:none}.mat-button-toggle-disabled .mat-button-toggle-button{cursor:default}.mat-button-toggle-button::-moz-focus-inner{border:0}.mat-button-toggle-checked .mat-button-toggle-button:has(.mat-button-toggle-checkbox-wrapper){padding-left:30px}[dir=rtl] .mat-button-toggle-checked .mat-button-toggle-button:has(.mat-button-toggle-checkbox-wrapper){padding-left:0;padding-right:30px}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{--mat-focus-indicator-border-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}.mat-button-toggle-group-appearance-standard:not(.mat-button-toggle-vertical) .mat-button-toggle:last-of-type .mat-button-toggle-button::before{border-top-right-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border-bottom-right-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}.mat-button-toggle-group-appearance-standard:not(.mat-button-toggle-vertical) .mat-button-toggle:first-of-type .mat-button-toggle-button::before{border-top-left-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border-bottom-left-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle:last-of-type .mat-button-toggle-button::before{border-bottom-right-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border-bottom-left-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle:first-of-type .mat-button-toggle-button::before{border-top-right-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border-top-left-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}"],encapsulation:2,changeDetection:0})}return t})();var itA=["*"],ntA='.mdc-list{margin:0;padding:8px 0;list-style-type:none}.mdc-list:focus{outline:none}.mdc-list-item{display:flex;position:relative;justify-content:flex-start;overflow:hidden;padding:0;align-items:stretch;cursor:pointer;padding-left:16px;padding-right:16px;background-color:var(--mdc-list-list-item-container-color, transparent);border-radius:var(--mdc-list-list-item-container-shape, var(--mat-sys-corner-none))}.mdc-list-item.mdc-list-item--selected{background-color:var(--mdc-list-list-item-selected-container-color)}.mdc-list-item:focus{outline:0}.mdc-list-item.mdc-list-item--disabled{cursor:auto}.mdc-list-item.mdc-list-item--with-one-line{height:var(--mdc-list-list-item-one-line-container-height, 48px)}.mdc-list-item.mdc-list-item--with-one-line .mdc-list-item__start{align-self:center;margin-top:0}.mdc-list-item.mdc-list-item--with-one-line .mdc-list-item__end{align-self:center;margin-top:0}.mdc-list-item.mdc-list-item--with-two-lines{height:var(--mdc-list-list-item-two-line-container-height, 64px)}.mdc-list-item.mdc-list-item--with-two-lines .mdc-list-item__start{align-self:flex-start;margin-top:16px}.mdc-list-item.mdc-list-item--with-two-lines .mdc-list-item__end{align-self:center;margin-top:0}.mdc-list-item.mdc-list-item--with-three-lines{height:var(--mdc-list-list-item-three-line-container-height, 88px)}.mdc-list-item.mdc-list-item--with-three-lines .mdc-list-item__start{align-self:flex-start;margin-top:16px}.mdc-list-item.mdc-list-item--with-three-lines .mdc-list-item__end{align-self:flex-start;margin-top:16px}.mdc-list-item.mdc-list-item--selected::before,.mdc-list-item.mdc-list-item--selected:focus::before,.mdc-list-item:not(.mdc-list-item--selected):focus::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;content:"";pointer-events:none}a.mdc-list-item{color:inherit;text-decoration:none}.mdc-list-item__start{fill:currentColor;flex-shrink:0;pointer-events:none}.mdc-list-item--with-leading-icon .mdc-list-item__start{color:var(--mdc-list-list-item-leading-icon-color, var(--mat-sys-on-surface-variant));width:var(--mdc-list-list-item-leading-icon-size, 24px);height:var(--mdc-list-list-item-leading-icon-size, 24px);margin-left:16px;margin-right:32px}[dir=rtl] .mdc-list-item--with-leading-icon .mdc-list-item__start{margin-left:32px;margin-right:16px}.mdc-list-item--with-leading-icon:hover .mdc-list-item__start{color:var(--mdc-list-list-item-hover-leading-icon-color)}.mdc-list-item--with-leading-avatar .mdc-list-item__start{width:var(--mdc-list-list-item-leading-avatar-size, 40px);height:var(--mdc-list-list-item-leading-avatar-size, 40px);margin-left:16px;margin-right:16px;border-radius:50%}.mdc-list-item--with-leading-avatar .mdc-list-item__start,[dir=rtl] .mdc-list-item--with-leading-avatar .mdc-list-item__start{margin-left:16px;margin-right:16px;border-radius:50%}.mdc-list-item__end{flex-shrink:0;pointer-events:none}.mdc-list-item--with-trailing-meta .mdc-list-item__end{font-family:var(--mdc-list-list-item-trailing-supporting-text-font, var(--mat-sys-label-small-font));line-height:var(--mdc-list-list-item-trailing-supporting-text-line-height, var(--mat-sys-label-small-line-height));font-size:var(--mdc-list-list-item-trailing-supporting-text-size, var(--mat-sys-label-small-size));font-weight:var(--mdc-list-list-item-trailing-supporting-text-weight, var(--mat-sys-label-small-weight));letter-spacing:var(--mdc-list-list-item-trailing-supporting-text-tracking, var(--mat-sys-label-small-tracking))}.mdc-list-item--with-trailing-icon .mdc-list-item__end{color:var(--mdc-list-list-item-trailing-icon-color, var(--mat-sys-on-surface-variant));width:var(--mdc-list-list-item-trailing-icon-size, 24px);height:var(--mdc-list-list-item-trailing-icon-size, 24px)}.mdc-list-item--with-trailing-icon:hover .mdc-list-item__end{color:var(--mdc-list-list-item-hover-trailing-icon-color)}.mdc-list-item.mdc-list-item--with-trailing-meta .mdc-list-item__end{color:var(--mdc-list-list-item-trailing-supporting-text-color, var(--mat-sys-on-surface-variant))}.mdc-list-item--selected.mdc-list-item--with-trailing-icon .mdc-list-item__end{color:var(--mdc-list-list-item-selected-trailing-icon-color, var(--mat-sys-primary))}.mdc-list-item__content{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;align-self:center;flex:1;pointer-events:none}.mdc-list-item--with-two-lines .mdc-list-item__content,.mdc-list-item--with-three-lines .mdc-list-item__content{align-self:stretch}.mdc-list-item__primary-text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;color:var(--mdc-list-list-item-label-text-color, var(--mat-sys-on-surface));font-family:var(--mdc-list-list-item-label-text-font, var(--mat-sys-body-large-font));line-height:var(--mdc-list-list-item-label-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mdc-list-list-item-label-text-size, var(--mat-sys-body-large-size));font-weight:var(--mdc-list-list-item-label-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mdc-list-list-item-label-text-tracking, var(--mat-sys-body-large-tracking))}.mdc-list-item:hover .mdc-list-item__primary-text{color:var(--mdc-list-list-item-hover-label-text-color, var(--mat-sys-on-surface))}.mdc-list-item:focus .mdc-list-item__primary-text{color:var(--mdc-list-list-item-focus-label-text-color, var(--mat-sys-on-surface))}.mdc-list-item--with-two-lines .mdc-list-item__primary-text,.mdc-list-item--with-three-lines .mdc-list-item__primary-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before,.mdc-list-item--with-three-lines .mdc-list-item__primary-text::before{display:inline-block;width:0;height:28px;content:"";vertical-align:0}.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after,.mdc-list-item--with-three-lines .mdc-list-item__primary-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item__secondary-text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block;margin-top:0;color:var(--mdc-list-list-item-supporting-text-color, var(--mat-sys-on-surface-variant));font-family:var(--mdc-list-list-item-supporting-text-font, var(--mat-sys-body-medium-font));line-height:var(--mdc-list-list-item-supporting-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mdc-list-list-item-supporting-text-size, var(--mat-sys-body-medium-size));font-weight:var(--mdc-list-list-item-supporting-text-weight, var(--mat-sys-body-medium-weight));letter-spacing:var(--mdc-list-list-item-supporting-text-tracking, var(--mat-sys-body-medium-tracking))}.mdc-list-item__secondary-text::before{display:inline-block;width:0;height:20px;content:"";vertical-align:0}.mdc-list-item--with-three-lines .mdc-list-item__secondary-text{white-space:normal;line-height:20px}.mdc-list-item--with-overline .mdc-list-item__secondary-text{white-space:nowrap;line-height:auto}.mdc-list-item--with-leading-radio.mdc-list-item,.mdc-list-item--with-leading-checkbox.mdc-list-item,.mdc-list-item--with-leading-icon.mdc-list-item,.mdc-list-item--with-leading-avatar.mdc-list-item{padding-left:0;padding-right:16px}[dir=rtl] .mdc-list-item--with-leading-radio.mdc-list-item,[dir=rtl] .mdc-list-item--with-leading-checkbox.mdc-list-item,[dir=rtl] .mdc-list-item--with-leading-icon.mdc-list-item,[dir=rtl] .mdc-list-item--with-leading-avatar.mdc-list-item{padding-left:16px;padding-right:0}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__primary-text,.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__primary-text,.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines .mdc-list-item__primary-text,.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines .mdc-list-item__primary-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before,.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before,.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before,.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after,.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after,.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after,.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end,.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end,.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end,.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end{display:block;margin-top:0;line-height:normal}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before,.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before,.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before,.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-trailing-icon.mdc-list-item,[dir=rtl] .mdc-list-item--with-trailing-icon.mdc-list-item{padding-left:0;padding-right:0}.mdc-list-item--with-trailing-icon .mdc-list-item__end{margin-left:16px;margin-right:16px}.mdc-list-item--with-trailing-meta.mdc-list-item{padding-left:16px;padding-right:0}[dir=rtl] .mdc-list-item--with-trailing-meta.mdc-list-item{padding-left:0;padding-right:16px}.mdc-list-item--with-trailing-meta .mdc-list-item__end{-webkit-user-select:none;user-select:none;margin-left:28px;margin-right:16px}[dir=rtl] .mdc-list-item--with-trailing-meta .mdc-list-item__end{margin-left:16px;margin-right:28px}.mdc-list-item--with-trailing-meta.mdc-list-item--with-three-lines .mdc-list-item__end,.mdc-list-item--with-trailing-meta.mdc-list-item--with-two-lines .mdc-list-item__end{display:block;line-height:normal;align-self:flex-start;margin-top:0}.mdc-list-item--with-trailing-meta.mdc-list-item--with-three-lines .mdc-list-item__end::before,.mdc-list-item--with-trailing-meta.mdc-list-item--with-two-lines .mdc-list-item__end::before{display:inline-block;width:0;height:28px;content:"";vertical-align:0}.mdc-list-item--with-leading-radio .mdc-list-item__start,.mdc-list-item--with-leading-checkbox .mdc-list-item__start{margin-left:8px;margin-right:24px}[dir=rtl] .mdc-list-item--with-leading-radio .mdc-list-item__start,[dir=rtl] .mdc-list-item--with-leading-checkbox .mdc-list-item__start{margin-left:24px;margin-right:8px}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__start,.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__start{align-self:flex-start;margin-top:8px}.mdc-list-item--with-trailing-radio.mdc-list-item,.mdc-list-item--with-trailing-checkbox.mdc-list-item{padding-left:16px;padding-right:0}[dir=rtl] .mdc-list-item--with-trailing-radio.mdc-list-item,[dir=rtl] .mdc-list-item--with-trailing-checkbox.mdc-list-item{padding-left:0;padding-right:16px}.mdc-list-item--with-trailing-radio.mdc-list-item--with-leading-icon,.mdc-list-item--with-trailing-radio.mdc-list-item--with-leading-avatar,.mdc-list-item--with-trailing-checkbox.mdc-list-item--with-leading-icon,.mdc-list-item--with-trailing-checkbox.mdc-list-item--with-leading-avatar{padding-left:0}[dir=rtl] .mdc-list-item--with-trailing-radio.mdc-list-item--with-leading-icon,[dir=rtl] .mdc-list-item--with-trailing-radio.mdc-list-item--with-leading-avatar,[dir=rtl] .mdc-list-item--with-trailing-checkbox.mdc-list-item--with-leading-icon,[dir=rtl] .mdc-list-item--with-trailing-checkbox.mdc-list-item--with-leading-avatar{padding-right:0}.mdc-list-item--with-trailing-radio .mdc-list-item__end,.mdc-list-item--with-trailing-checkbox .mdc-list-item__end{margin-left:24px;margin-right:8px}[dir=rtl] .mdc-list-item--with-trailing-radio .mdc-list-item__end,[dir=rtl] .mdc-list-item--with-trailing-checkbox .mdc-list-item__end{margin-left:8px;margin-right:24px}.mdc-list-item--with-trailing-radio.mdc-list-item--with-three-lines .mdc-list-item__end,.mdc-list-item--with-trailing-checkbox.mdc-list-item--with-three-lines .mdc-list-item__end{align-self:flex-start;margin-top:8px}.mdc-list-group__subheader{margin:.75rem 16px}.mdc-list-item--disabled .mdc-list-item__start,.mdc-list-item--disabled .mdc-list-item__content,.mdc-list-item--disabled .mdc-list-item__end{opacity:1}.mdc-list-item--disabled .mdc-list-item__primary-text,.mdc-list-item--disabled .mdc-list-item__secondary-text{opacity:var(--mdc-list-list-item-disabled-label-text-opacity, 0.3)}.mdc-list-item--disabled.mdc-list-item--with-leading-icon .mdc-list-item__start{color:var(--mdc-list-list-item-disabled-leading-icon-color, var(--mat-sys-on-surface));opacity:var(--mdc-list-list-item-disabled-leading-icon-opacity, 0.38)}.mdc-list-item--disabled.mdc-list-item--with-trailing-icon .mdc-list-item__end{color:var(--mdc-list-list-item-disabled-trailing-icon-color, var(--mat-sys-on-surface));opacity:var(--mdc-list-list-item-disabled-trailing-icon-opacity, 0.38)}.mat-mdc-list-item.mat-mdc-list-item-both-leading-and-trailing,[dir=rtl] .mat-mdc-list-item.mat-mdc-list-item-both-leading-and-trailing{padding-left:0;padding-right:0}.mdc-list-item.mdc-list-item--disabled .mdc-list-item__primary-text{color:var(--mdc-list-list-item-disabled-label-text-color, var(--mat-sys-on-surface))}.mdc-list-item:hover::before{background-color:var(--mdc-list-list-item-hover-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mdc-list-list-item-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mdc-list-item.mdc-list-item--disabled::before{background-color:var(--mdc-list-list-item-disabled-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mdc-list-list-item-disabled-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-list-item:focus::before{background-color:var(--mdc-list-list-item-focus-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mdc-list-list-item-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-list-item--disabled .mdc-radio,.mdc-list-item--disabled .mdc-checkbox{opacity:var(--mdc-list-list-item-disabled-label-text-opacity, 0.3)}.mdc-list-item--with-leading-avatar .mat-mdc-list-item-avatar{border-radius:var(--mdc-list-list-item-leading-avatar-shape, var(--mat-sys-corner-full));background-color:var(--mdc-list-list-item-leading-avatar-color, var(--mat-sys-primary-container))}.mat-mdc-list-item-icon{font-size:var(--mdc-list-list-item-leading-icon-size, 24px)}@media(forced-colors: active){a.mdc-list-item--activated::after{content:"";position:absolute;top:50%;right:16px;transform:translateY(-50%);width:10px;height:0;border-bottom:solid 10px;border-radius:10px}a.mdc-list-item--activated [dir=rtl]::after{right:auto;left:16px}}.mat-mdc-list-base{display:block}.mat-mdc-list-base .mdc-list-item__start,.mat-mdc-list-base .mdc-list-item__end,.mat-mdc-list-base .mdc-list-item__content{pointer-events:auto}.mat-mdc-list-item,.mat-mdc-list-option{width:100%;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-list-item:not(.mat-mdc-list-item-interactive),.mat-mdc-list-option:not(.mat-mdc-list-item-interactive){cursor:default}.mat-mdc-list-item .mat-divider-inset,.mat-mdc-list-option .mat-divider-inset{position:absolute;left:0;right:0;bottom:0}.mat-mdc-list-item .mat-mdc-list-item-avatar~.mat-divider-inset,.mat-mdc-list-option .mat-mdc-list-item-avatar~.mat-divider-inset{margin-left:72px}[dir=rtl] .mat-mdc-list-item .mat-mdc-list-item-avatar~.mat-divider-inset,[dir=rtl] .mat-mdc-list-option .mat-mdc-list-item-avatar~.mat-divider-inset{margin-right:72px}.mat-mdc-list-item-interactive::before{top:0;left:0;right:0;bottom:0;position:absolute;content:"";opacity:0;pointer-events:none;border-radius:inherit}.mat-mdc-list-item>.mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-mdc-list-item:focus>.mat-focus-indicator::before{content:""}.mat-mdc-list-item.mdc-list-item--with-three-lines .mat-mdc-list-item-line.mdc-list-item__secondary-text{white-space:nowrap;line-height:normal}.mat-mdc-list-item.mdc-list-item--with-three-lines .mat-mdc-list-item-unscoped-content.mdc-list-item__secondary-text{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}mat-action-list button{background:none;color:inherit;border:none;font:inherit;outline:inherit;-webkit-tap-highlight-color:rgba(0,0,0,0);text-align:start}mat-action-list button::-moz-focus-inner{border:0}.mdc-list-item--with-leading-icon .mdc-list-item__start{margin-inline-start:var(--mat-list-list-item-leading-icon-start-space, 16px);margin-inline-end:var(--mat-list-list-item-leading-icon-end-space, 16px)}.mat-mdc-nav-list .mat-mdc-list-item{border-radius:var(--mat-list-active-indicator-shape, var(--mat-sys-corner-full));--mat-focus-indicator-border-radius:var(--mat-list-active-indicator-shape, var(--mat-sys-corner-full))}.mat-mdc-nav-list .mat-mdc-list-item.mdc-list-item--activated{background-color:var(--mat-list-active-indicator-color, var(--mat-sys-secondary-container))}',otA=["unscopedContent"],rtA=["text"],stA=[[["","matListItemAvatar",""],["","matListItemIcon",""]],[["","matListItemTitle",""]],[["","matListItemLine",""]],"*",[["","matListItemMeta",""]],[["mat-divider"]]],atA=["[matListItemAvatar],[matListItemIcon]","[matListItemTitle]","[matListItemLine]","*","[matListItemMeta]","mat-divider"];var ctA=new re("ListOption"),ltA=(()=>{class t{_elementRef=E(eA);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","matListItemTitle",""]],hostAttrs:[1,"mat-mdc-list-item-title","mdc-list-item__primary-text"]})}return t})(),gtA=(()=>{class t{_elementRef=E(eA);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","matListItemLine",""]],hostAttrs:[1,"mat-mdc-list-item-line","mdc-list-item__secondary-text"]})}return t})(),dtA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","matListItemMeta",""]],hostAttrs:[1,"mat-mdc-list-item-meta","mdc-list-item__end"]})}return t})(),OCe=(()=>{class t{_listOption=E(ctA,{optional:!0});constructor(){}_isAlignedAtStart(){return!this._listOption||this._listOption?._getTogglePosition()==="after"}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,hostVars:4,hostBindings:function(i,n){i&2&&iA("mdc-list-item__start",n._isAlignedAtStart())("mdc-list-item__end",!n._isAlignedAtStart())}})}return t})(),CtA=(()=>{class t extends OCe{static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275dir=Oe({type:t,selectors:[["","matListItemAvatar",""]],hostAttrs:[1,"mat-mdc-list-item-avatar"],features:[Ct]})}return t})(),ItA=(()=>{class t extends OCe{static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275dir=Oe({type:t,selectors:[["","matListItemIcon",""]],hostAttrs:[1,"mat-mdc-list-item-icon"],features:[Ct]})}return t})(),utA=new re("MAT_LIST_CONFIG"),pH=(()=>{class t{_isNonInteractive=!0;get disableRipple(){return this._disableRipple}set disableRipple(e){this._disableRipple=Sr(e)}_disableRipple=!1;get disabled(){return this._disabled}set disabled(e){this._disabled=Sr(e)}_disabled=!1;_defaultOptions=E(utA,{optional:!0});static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,hostVars:1,hostBindings:function(i,n){i&2&&AA("aria-disabled",n.disabled)},inputs:{disableRipple:"disableRipple",disabled:"disabled"}})}return t})(),htA=(()=>{class t{_elementRef=E(eA);_ngZone=E(yA);_listBase=E(pH,{optional:!0});_platform=E(mi);_hostElement;_isButtonElement;_noopAnimations;_avatars;_icons;set lines(e){this._explicitLines=Za(e,null),this._updateItemLines(!1)}_explicitLines=null;get disableRipple(){return this.disabled||this._disableRipple||this._noopAnimations||!!this._listBase?.disableRipple}set disableRipple(e){this._disableRipple=Sr(e)}_disableRipple=!1;get disabled(){return this._disabled||!!this._listBase?.disabled}set disabled(e){this._disabled=Sr(e)}_disabled=!1;_subscriptions=new Ot;_rippleRenderer=null;_hasUnscopedTextContent=!1;rippleConfig;get rippleDisabled(){return this.disableRipple||!!this.rippleConfig.disabled}constructor(){E(Wn).load(Pr);let e=E(I2,{optional:!0}),i=E(Oi,{optional:!0});this.rippleConfig=e||{},this._hostElement=this._elementRef.nativeElement,this._isButtonElement=this._hostElement.nodeName.toLowerCase()==="button",this._noopAnimations=i==="NoopAnimations",this._listBase&&!this._listBase._isNonInteractive&&this._initInteractiveListItem(),this._isButtonElement&&!this._hostElement.hasAttribute("type")&&this._hostElement.setAttribute("type","button")}ngAfterViewInit(){this._monitorProjectedLinesAndTitle(),this._updateItemLines(!0)}ngOnDestroy(){this._subscriptions.unsubscribe(),this._rippleRenderer!==null&&this._rippleRenderer._removeTriggerEvents()}_hasIconOrAvatar(){return!!(this._avatars.length||this._icons.length)}_initInteractiveListItem(){this._hostElement.classList.add("mat-mdc-list-item-interactive"),this._rippleRenderer=new UB(this,this._ngZone,this._hostElement,this._platform,E(Dt)),this._rippleRenderer.setupTriggerEvents(this._hostElement)}_monitorProjectedLinesAndTitle(){this._ngZone.runOutsideAngular(()=>{this._subscriptions.add(Bi(this._lines.changes,this._titles.changes).subscribe(()=>this._updateItemLines(!1)))})}_updateItemLines(e){if(!this._lines||!this._titles||!this._unscopedContent)return;e&&this._checkDomForUnscopedTextContent();let i=this._explicitLines??this._inferLinesFromContent(),n=this._unscopedContent.nativeElement;if(this._hostElement.classList.toggle("mat-mdc-list-item-single-line",i<=1),this._hostElement.classList.toggle("mdc-list-item--with-one-line",i<=1),this._hostElement.classList.toggle("mdc-list-item--with-two-lines",i===2),this._hostElement.classList.toggle("mdc-list-item--with-three-lines",i===3),this._hasUnscopedTextContent){let o=this._titles.length===0&&i===1;n.classList.toggle("mdc-list-item__primary-text",o),n.classList.toggle("mdc-list-item__secondary-text",!o)}else n.classList.remove("mdc-list-item__primary-text"),n.classList.remove("mdc-list-item__secondary-text")}_inferLinesFromContent(){let e=this._titles.length+this._lines.length;return this._hasUnscopedTextContent&&(e+=1),e}_checkDomForUnscopedTextContent(){this._hasUnscopedTextContent=Array.from(this._unscopedContent.nativeElement.childNodes).filter(e=>e.nodeType!==e.COMMENT_NODE).some(e=>!!(e.textContent&&e.textContent.trim()))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,contentQueries:function(i,n,o){if(i&1&&(ni(o,CtA,4),ni(o,ItA,4)),i&2){let r;oA(r=rA())&&(n._avatars=r),oA(r=rA())&&(n._icons=r)}},hostVars:4,hostBindings:function(i,n){i&2&&(AA("aria-disabled",n.disabled)("disabled",n._isButtonElement&&n.disabled||null),iA("mdc-list-item--disabled",n.disabled))},inputs:{lines:"lines",disableRipple:"disableRipple",disabled:"disabled"}})}return t})();var JCe=(()=>{class t extends pH{static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275cmp=xe({type:t,selectors:[["mat-list"]],hostAttrs:[1,"mat-mdc-list","mat-mdc-list-base","mdc-list"],exportAs:["matList"],features:[gt([{provide:pH,useExisting:t}]),Ct],ngContentSelectors:itA,decls:1,vars:0,template:function(i,n){i&1&&(Kt(),NA(0))},styles:[ntA],encapsulation:2,changeDetection:0})}return t})(),YCe=(()=>{class t extends htA{_lines;_titles;_meta;_unscopedContent;_itemText;get activated(){return this._activated}set activated(e){this._activated=Sr(e)}_activated=!1;_getAriaCurrent(){return this._hostElement.nodeName==="A"&&this._activated?"page":null}_hasBothLeadingAndTrailing(){return this._meta.length!==0&&(this._avatars.length!==0||this._icons.length!==0)}static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275cmp=xe({type:t,selectors:[["mat-list-item"],["a","mat-list-item",""],["button","mat-list-item",""]],contentQueries:function(i,n,o){if(i&1&&(ni(o,gtA,5),ni(o,ltA,5),ni(o,dtA,5)),i&2){let r;oA(r=rA())&&(n._lines=r),oA(r=rA())&&(n._titles=r),oA(r=rA())&&(n._meta=r)}},viewQuery:function(i,n){if(i&1&&(At(otA,5),At(rtA,5)),i&2){let o;oA(o=rA())&&(n._unscopedContent=o.first),oA(o=rA())&&(n._itemText=o.first)}},hostAttrs:[1,"mat-mdc-list-item","mdc-list-item"],hostVars:13,hostBindings:function(i,n){i&2&&(AA("aria-current",n._getAriaCurrent()),iA("mdc-list-item--activated",n.activated)("mdc-list-item--with-leading-avatar",n._avatars.length!==0)("mdc-list-item--with-leading-icon",n._icons.length!==0)("mdc-list-item--with-trailing-meta",n._meta.length!==0)("mat-mdc-list-item-both-leading-and-trailing",n._hasBothLeadingAndTrailing())("_mat-animation-noopable",n._noopAnimations))},inputs:{activated:"activated"},exportAs:["matListItem"],features:[Ct],ngContentSelectors:atA,decls:10,vars:0,consts:[["unscopedContent",""],[1,"mdc-list-item__content"],[1,"mat-mdc-list-item-unscoped-content",3,"cdkObserveContent"],[1,"mat-focus-indicator"]],template:function(i,n){if(i&1){let o=Ue();Kt(stA),NA(0),m(1,"span",1),NA(2,1),NA(3,2),m(4,"span",2,0),ee("cdkObserveContent",function(){return q(o),W(n._updateItemLines(!0))}),NA(6,3),p()(),NA(7,4),NA(8,5),ve(9,"div",3)}},dependencies:[y5],encapsulation:2,changeDetection:0})}return t})();var BtA={conversationsHeader:"Conversations",traceHeader:"Trace",eventsToggle:"Events",traceToggle:"Trace",invocationPrefix:"Invocation",noConversationsMessage:"No conversations"},HCe=new re("Event Tab Messages",{factory:()=>BtA});var d9=class t{transform(A){if(A)return A.find(e=>e.attributes!==void 0&&"gcp.vertex.agent.invocation_id"in e.attributes)?.attributes["gcp.vertex.agent.invocation_id"]}static \u0275fac=function(e){return new(e||t)};static \u0275pipe=pB({name:"invocId",type:t,pure:!0})};function EtA(t,A){if(t&1&&(m(0,"p"),T(1),p()),t&2){let e=M(2);y(),Pe(e.i18n.conversationsHeader)}}function ftA(t,A){if(t&1&&(m(0,"p"),T(1),p()),t&2){let e=M(2);y(),Pe(e.i18n.traceHeader)}}function QtA(t,A){if(t&1&&(m(0,"mat-button-toggle",8),T(1),p()),t&2){let e=M(3);y(),Pe(e.i18n.traceToggle)}}function mtA(t,A){if(t&1){let e=Ue();m(0,"mat-button-toggle-group",6),qn("ngModelChange",function(n){q(e);let o=M(2);return Vn(o.view,n)||(o.view=n),W(n)}),m(1,"mat-button-toggle",7),T(2),p(),ne(3,QtA,2,1,"mat-button-toggle",8),Ii(4,"async"),p()}if(t&2){let e=M(2);jn("ngModel",e.view),y(2),Pe(e.i18n.eventsToggle),y(),$(Qi(4,3,e.isTraceEnabledObs)?3:-1)}}function ptA(t,A){if(t&1){let e=Ue();m(0,"mat-list-item",9),ee("click",function(){let n=q(e).$implicit,o=M(3);return W(o.selectEvent(n.key))}),m(1,"span",10),T(2),p(),m(3,"span",11),T(4),p()()}if(t&2){let e=A.$implicit,i=A.$index;y(2),Pe(i),y(2),Pe(e.value.title)}}function wtA(t,A){if(t&1&&(m(0,"mat-list",5),Rt(1,ptA,5,2,"mat-list-item",null,Fi),Ii(3,"keyvalue"),p()),t&2){let e=M(2);y(),Nt(b4(3,0,e.eventsMap(),e.mapOrderPreservingSort))}}function ytA(t,A){if(t&1){let e=Ue();m(0,"mat-list-item",9),ee("click",function(){let n=q(e).$implicit,o=M(3);return W(o.openDialog(n.key))}),m(1,"span",10),T(2),p(),m(3,"span"),T(4),Ii(5,"invocId"),p()()}if(t&2){let e=A.$implicit,i=A.$index,n=M(3);y(2),Pe(i),y(2),el("",n.i18n.invocationPrefix," ",Qi(5,3,e.value),"")}}function DtA(t,A){if(t&1&&(m(0,"mat-list",5),Rt(1,ytA,6,5,"mat-list-item",null,Fi),Ii(3,"keyvalue"),p()),t&2){let e=M(2);y(),Nt(b4(3,0,e.spansByTraceId(),e.mapOrderPreservingSort))}}function vtA(t,A){if(t&1&&(m(0,"div",1)(1,"div",3),ne(2,EtA,2,1,"p")(3,ftA,2,1,"p")(4,mtA,5,5,"mat-button-toggle-group",4),p(),ne(5,wtA,4,3,"mat-list",5)(6,DtA,4,3,"mat-list",5),p()),t&2){let e=M();y(2),$(e.isTraceView()?-1:2),y(),$(e.isTraceView()?3:-1),y(),$(e.traceData().length>0?4:-1),y(),$(e.isTraceView()?-1:5),y(),$(e.isTraceView()?6:-1)}}function btA(t,A){if(t&1&&(m(0,"div",2),T(1),p()),t&2){let e=M();y(),FA(" ",e.i18n.noConversationsMessage," ")}}var lQ=class t{eventsMap=lt(new Map);traceData=lt([]);selectedEvent=new Ve;dialog=E(na);featureFlagService=E(Ks);i18n=E(HCe);view=mA("events");isTraceView=ot(()=>this.view()==="trace");spansByTraceId=ot(()=>!this.traceData()||this.traceData().length==0?new Map:this.traceData().reduce((A,e)=>{let i=e.trace_id,n=A.get(i);return n?(e.invoc_id=e.attributes?.["gcp.vertex.agent.invocation_id"],n.push(e),n.sort((o,r)=>o.start_time-r.start_time)):A.set(i,[e]),A},new Map));showJson=Array(this.eventsMap().size).fill(!1);isTraceEnabledObs=this.featureFlagService.isTraceEnabled();toggleJson(A){this.showJson[A]=!this.showJson[A]}selectEvent(A){this.selectedEvent.emit(A)}mapOrderPreservingSort=(A,e)=>0;findInvocId(A){return A.find(e=>e.attributes!==void 0&&"gcp.vertex.agent.invocation_id"in e.attributes)?.attributes["gcp.vertex.agent.invocation_id"]}openDialog(A){let e=this.spansByTraceId().get(A);if(!e)return;let i=this.dialog.open(l9,{width:"auto",maxWidth:"90vw",data:{spans:e,invocId:this.findInvocId(e)}})}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-event-tab"]],inputs:{eventsMap:[1,"eventsMap"],traceData:[1,"traceData"]},outputs:{selectedEvent:"selectedEvent"},decls:3,vars:2,consts:[[1,"events-wrapper"],[1,"events-container"],[1,"empty-state"],[1,"event-header"],["name","fontStyle","aria-label","Font Style",2,"scale","0.8",3,"ngModel"],[1,"event-list"],["name","fontStyle","aria-label","Font Style",2,"scale","0.8",3,"ngModelChange","ngModel"],["value","events"],["value","trace"],[3,"click"],[1,"event-index"],[1,"event-title"]],template:function(e,i){e&1&&(m(0,"div",0),ne(1,vtA,7,5,"div",1)(2,btA,2,1,"div",2),p()),e&2&&(y(),$(i.eventsMap().size>0?1:-1),y(),$(i.eventsMap().size==0?2:-1))},dependencies:[QH,Kn,Fo,Cr,mH,JCe,YCe,HI,d9,ts],styles:[".events-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px;font-size:14px;font-weight:700;color:var(--event-tab-events-wrapper-color)}.events-wrapper[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{color:initial;padding-top:1em;text-align:center;font-weight:400;font-style:italic}.event-index[_ngcontent-%COMP%]{color:var(--event-tab-event-index-color);font-family:Roboto;font-size:14px;font-style:normal;font-weight:400;margin-right:10px}.event-title[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace}.spacer[_ngcontent-%COMP%]{flex:1 1 auto}.events-container[_ngcontent-%COMP%]{margin-top:20px}.event-container[_ngcontent-%COMP%]{display:flex;flex-direction:row;margin-top:20px}.function-event-button[_ngcontent-%COMP%]{margin-top:11px}.event-list[_ngcontent-%COMP%]{--mat-list-active-indicator-color: var(--event-tab-event-list-active-indicator-color)}.event-list[_ngcontent-%COMP%]{--mdc-list-list-item-container-color: var(--event-tab-event-list-list-item-container-color)}.event-list[_ngcontent-%COMP%]{--mdc-list-list-item-label-text-size: 14px}.event-list[_ngcontent-%COMP%]{--mdc-list-list-item-label-text-weight: 400}.event-list[_ngcontent-%COMP%]{--mdc-list-list-item-one-line-container-height: 52px}[_nghost-%COMP%] .mdc-list-item{border:1px solid var(--event-tab-mdc-list-item-border-color);cursor:pointer}[_nghost-%COMP%] .mdc-list-item:hover{background-color:var(--event-tab-mdc-list-item-hover-background-color)}.event-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between}"]})};var MtA=["*",[["mat-chip-avatar"],["","matChipAvatar",""]],[["mat-chip-trailing-icon"],["","matChipRemove",""],["","matChipTrailingIcon",""]]],StA=["*","mat-chip-avatar, [matChipAvatar]","mat-chip-trailing-icon,[matChipRemove],[matChipTrailingIcon]"];function ktA(t,A){t&1&&(m(0,"span",3),NA(1,1),p())}function xtA(t,A){t&1&&(m(0,"span",6),NA(1,2),p())}var _tA=["*"];var RtA=new re("mat-chips-default-options",{providedIn:"root",factory:()=>({separatorKeyCodes:[13]})}),wH=new re("MatChipAvatar"),zCe=new re("MatChipTrailingIcon"),yH=new re("MatChipRemove"),PCe=new re("MatChip"),DH=(()=>{class t{_elementRef=E(eA);_parentChip=E(PCe);isInteractive=!0;_isPrimary=!0;get disabled(){return this._disabled||this._parentChip?.disabled||!1}set disabled(e){this._disabled=e}_disabled=!1;tabIndex=-1;_allowFocusWhenDisabled=!1;_getDisabledAttribute(){return this.disabled&&!this._allowFocusWhenDisabled?"":null}_getTabindex(){return this.disabled&&!this._allowFocusWhenDisabled||!this.isInteractive?null:this.tabIndex.toString()}constructor(){E(Wn).load(Pr),this._elementRef.nativeElement.nodeName==="BUTTON"&&this._elementRef.nativeElement.setAttribute("type","button")}focus(){this._elementRef.nativeElement.focus()}_handleClick(e){!this.disabled&&this.isInteractive&&this._isPrimary&&(e.preventDefault(),this._parentChip._handlePrimaryActionInteraction())}_handleKeydown(e){(e.keyCode===13||e.keyCode===32)&&!this.disabled&&this.isInteractive&&this._isPrimary&&!this._parentChip._isEditing&&(e.preventDefault(),this._parentChip._handlePrimaryActionInteraction())}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["","matChipAction",""]],hostAttrs:[1,"mdc-evolution-chip__action","mat-mdc-chip-action"],hostVars:9,hostBindings:function(i,n){i&1&&ee("click",function(r){return n._handleClick(r)})("keydown",function(r){return n._handleKeydown(r)}),i&2&&(AA("tabindex",n._getTabindex())("disabled",n._getDisabledAttribute())("aria-disabled",n.disabled),iA("mdc-evolution-chip__action--primary",n._isPrimary)("mdc-evolution-chip__action--presentational",!n.isInteractive)("mdc-evolution-chip__action--trailing",!n._isPrimary))},inputs:{isInteractive:"isInteractive",disabled:[2,"disabled","disabled",IA],tabIndex:[2,"tabIndex","tabIndex",e=>e==null?-1:ln(e)],_allowFocusWhenDisabled:"_allowFocusWhenDisabled"}})}return t})(),jCe=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["mat-chip-avatar"],["","matChipAvatar",""]],hostAttrs:["role","img",1,"mat-mdc-chip-avatar","mdc-evolution-chip__icon","mdc-evolution-chip__icon--primary"],features:[gt([{provide:wH,useExisting:t}])]})}return t})();var VCe=(()=>{class t extends DH{_isPrimary=!1;_handleClick(e){this.disabled||(e.stopPropagation(),e.preventDefault(),this._parentChip.remove())}_handleKeydown(e){(e.keyCode===13||e.keyCode===32)&&!this.disabled&&(e.stopPropagation(),e.preventDefault(),this._parentChip.remove())}static \u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})();static \u0275dir=Oe({type:t,selectors:[["","matChipRemove",""]],hostAttrs:["role","button",1,"mat-mdc-chip-remove","mat-mdc-chip-trailing-icon","mat-focus-indicator","mdc-evolution-chip__icon","mdc-evolution-chip__icon--trailing"],hostVars:1,hostBindings:function(i,n){i&2&&AA("aria-hidden",null)},features:[gt([{provide:yH,useExisting:t}]),Ct]})}return t})(),d6=(()=>{class t{_changeDetectorRef=E(ut);_elementRef=E(eA);_ngZone=E(yA);_focusMonitor=E(ns);_globalRippleOptions=E(I2,{optional:!0});_document=E(ht);_onFocus=new je;_onBlur=new je;_isBasicChip;role=null;_hasFocusInternal=!1;_pendingFocus;_actionChanges;_animationsDisabled;_allLeadingIcons;_allTrailingIcons;_allRemoveIcons;_hasFocus(){return this._hasFocusInternal}id=E(un).getId("mat-mdc-chip-");ariaLabel=null;ariaDescription=null;_ariaDescriptionId=`${this.id}-aria-description`;_chipListDisabled=!1;_textElement;get value(){return this._value!==void 0?this._value:this._textElement.textContent.trim()}set value(e){this._value=e}_value;color;removable=!0;highlighted=!1;disableRipple=!1;get disabled(){return this._disabled||this._chipListDisabled}set disabled(e){this._disabled=e}_disabled=!1;removed=new Ve;destroyed=new Ve;basicChipAttrName="mat-basic-chip";leadingIcon;trailingIcon;removeIcon;primaryAction;_rippleLoader=E(K5);_injector=E(Dt);constructor(){let e=E(Wn);e.load(Pr),e.load(qI);let i=E(Oi,{optional:!0});this._animationsDisabled=i==="NoopAnimations",this._monitorFocus(),this._rippleLoader?.configureRipple(this._elementRef.nativeElement,{className:"mat-mdc-chip-ripple",disabled:this._isRippleDisabled()})}ngOnInit(){let e=this._elementRef.nativeElement;this._isBasicChip=e.hasAttribute(this.basicChipAttrName)||e.tagName.toLowerCase()===this.basicChipAttrName}ngAfterViewInit(){this._textElement=this._elementRef.nativeElement.querySelector(".mat-mdc-chip-action-label"),this._pendingFocus&&(this._pendingFocus=!1,this.focus())}ngAfterContentInit(){this._actionChanges=Bi(this._allLeadingIcons.changes,this._allTrailingIcons.changes,this._allRemoveIcons.changes).subscribe(()=>this._changeDetectorRef.markForCheck())}ngDoCheck(){this._rippleLoader.setDisabled(this._elementRef.nativeElement,this._isRippleDisabled())}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef),this._rippleLoader?.destroyRipple(this._elementRef.nativeElement),this._actionChanges?.unsubscribe(),this.destroyed.emit({chip:this}),this.destroyed.complete()}remove(){this.removable&&this.removed.emit({chip:this})}_isRippleDisabled(){return this.disabled||this.disableRipple||this._animationsDisabled||this._isBasicChip||!!this._globalRippleOptions?.disabled}_hasTrailingIcon(){return!!(this.trailingIcon||this.removeIcon)}_handleKeydown(e){(e.keyCode===8&&!e.repeat||e.keyCode===46)&&(e.preventDefault(),this.remove())}focus(){this.disabled||(this.primaryAction?this.primaryAction.focus():this._pendingFocus=!0)}_getSourceAction(e){return this._getActions().find(i=>{let n=i._elementRef.nativeElement;return n===e||n.contains(e)})}_getActions(){let e=[];return this.primaryAction&&e.push(this.primaryAction),this.removeIcon&&e.push(this.removeIcon),this.trailingIcon&&e.push(this.trailingIcon),e}_handlePrimaryActionInteraction(){}_monitorFocus(){this._focusMonitor.monitor(this._elementRef,!0).subscribe(e=>{let i=e!==null;i!==this._hasFocusInternal&&(this._hasFocusInternal=i,i?this._onFocus.next({chip:this}):(this._changeDetectorRef.markForCheck(),setTimeout(()=>this._ngZone.run(()=>this._onBlur.next({chip:this})))))})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-basic-chip"],["","mat-basic-chip",""],["mat-chip"],["","mat-chip",""]],contentQueries:function(i,n,o){if(i&1&&(ni(o,wH,5),ni(o,zCe,5),ni(o,yH,5),ni(o,wH,5),ni(o,zCe,5),ni(o,yH,5)),i&2){let r;oA(r=rA())&&(n.leadingIcon=r.first),oA(r=rA())&&(n.trailingIcon=r.first),oA(r=rA())&&(n.removeIcon=r.first),oA(r=rA())&&(n._allLeadingIcons=r),oA(r=rA())&&(n._allTrailingIcons=r),oA(r=rA())&&(n._allRemoveIcons=r)}},viewQuery:function(i,n){if(i&1&&At(DH,5),i&2){let o;oA(o=rA())&&(n.primaryAction=o.first)}},hostAttrs:[1,"mat-mdc-chip"],hostVars:31,hostBindings:function(i,n){i&1&&ee("keydown",function(r){return n._handleKeydown(r)}),i&2&&(ea("id",n.id),AA("role",n.role)("aria-label",n.ariaLabel),Lo("mat-"+(n.color||"primary")),iA("mdc-evolution-chip",!n._isBasicChip)("mdc-evolution-chip--disabled",n.disabled)("mdc-evolution-chip--with-trailing-action",n._hasTrailingIcon())("mdc-evolution-chip--with-primary-graphic",n.leadingIcon)("mdc-evolution-chip--with-primary-icon",n.leadingIcon)("mdc-evolution-chip--with-avatar",n.leadingIcon)("mat-mdc-chip-with-avatar",n.leadingIcon)("mat-mdc-chip-highlighted",n.highlighted)("mat-mdc-chip-disabled",n.disabled)("mat-mdc-basic-chip",n._isBasicChip)("mat-mdc-standard-chip",!n._isBasicChip)("mat-mdc-chip-with-trailing-icon",n._hasTrailingIcon())("_mat-animation-noopable",n._animationsDisabled))},inputs:{role:"role",id:"id",ariaLabel:[0,"aria-label","ariaLabel"],ariaDescription:[0,"aria-description","ariaDescription"],value:"value",color:"color",removable:[2,"removable","removable",IA],highlighted:[2,"highlighted","highlighted",IA],disableRipple:[2,"disableRipple","disableRipple",IA],disabled:[2,"disabled","disabled",IA]},outputs:{removed:"removed",destroyed:"destroyed"},exportAs:["matChip"],features:[gt([{provide:PCe,useExisting:t}])],ngContentSelectors:StA,decls:8,vars:3,consts:[[1,"mat-mdc-chip-focus-overlay"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--primary"],["matChipAction","",3,"isInteractive"],[1,"mdc-evolution-chip__graphic","mat-mdc-chip-graphic"],[1,"mdc-evolution-chip__text-label","mat-mdc-chip-action-label"],[1,"mat-mdc-chip-primary-focus-indicator","mat-focus-indicator"],[1,"mdc-evolution-chip__cell","mdc-evolution-chip__cell--trailing"]],template:function(i,n){i&1&&(Kt(MtA),ve(0,"span",0),m(1,"span",1)(2,"span",2),ne(3,ktA,2,0,"span",3),m(4,"span",4),NA(5),ve(6,"span",5),p()()(),ne(7,xtA,2,0,"span",6)),i&2&&(y(2),te("isInteractive",!1),y(),$(n.leadingIcon?3:-1),y(4),$(n._hasTrailingIcon()?7:-1))},dependencies:[DH],styles:['.mdc-evolution-chip,.mdc-evolution-chip__cell,.mdc-evolution-chip__action{display:inline-flex;align-items:center}.mdc-evolution-chip{position:relative;max-width:100%}.mdc-evolution-chip__cell,.mdc-evolution-chip__action{height:100%}.mdc-evolution-chip__cell--primary{flex-basis:100%;overflow-x:hidden}.mdc-evolution-chip__cell--trailing{flex:1 0 auto}.mdc-evolution-chip__action{align-items:center;background:none;border:none;box-sizing:content-box;cursor:pointer;display:inline-flex;justify-content:center;outline:none;padding:0;text-decoration:none;color:inherit}.mdc-evolution-chip__action--presentational{cursor:auto}.mdc-evolution-chip--disabled,.mdc-evolution-chip__action:disabled{pointer-events:none}.mdc-evolution-chip__action--primary{font:inherit;letter-spacing:inherit;white-space:inherit;overflow-x:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary::before{border-width:var(--mdc-chip-outline-width, 1px);border-radius:var(--mdc-chip-container-shape-radius, 8px);box-sizing:border-box;content:"";height:100%;left:0;position:absolute;pointer-events:none;top:0;width:100%;z-index:1;border-style:solid}.mat-mdc-standard-chip .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--primary::before{border-color:var(--mdc-chip-outline-color, var(--mat-sys-outline))}.mdc-evolution-chip__action--primary:not(.mdc-evolution-chip__action--presentational):not(.mdc-ripple-upgraded):focus::before{border-color:var(--mdc-chip-focus-outline-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--primary::before{border-color:var(--mdc-chip-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__action--primary::before{border-width:var(--mdc-chip-flat-selected-outline-width, 0)}.mat-mdc-basic-chip .mdc-evolution-chip__action--primary{font:inherit}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:0;padding-right:12px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__action--primary{padding-left:12px;padding-right:0}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--primary{padding-left:0;padding-right:0}.mdc-evolution-chip__action--trailing{position:relative;overflow:visible}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__action--trailing{color:var(--mdc-chip-with-trailing-icon-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__action--trailing{color:var(--mdc-chip-with-trailing-icon-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-standard-chip.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--trailing{padding-left:8px;padding-right:8px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--trailing{padding-left:8px;padding-right:8px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--trailing{padding-left:8px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__action--trailing{padding-left:8px;padding-right:8px}.mdc-evolution-chip__text-label{-webkit-user-select:none;user-select:none;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.mat-mdc-standard-chip .mdc-evolution-chip__text-label{font-family:var(--mdc-chip-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mdc-chip-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mdc-chip-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mdc-chip-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mdc-chip-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mdc-chip-label-text-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__text-label{color:var(--mdc-chip-selected-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label,.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__text-label{color:var(--mdc-chip-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-evolution-chip__graphic{align-items:center;display:inline-flex;justify-content:center;overflow:hidden;pointer-events:none;position:relative;flex:1 0 auto}.mat-mdc-standard-chip .mdc-evolution-chip__graphic{width:var(--mdc-chip-with-avatar-avatar-size, 24px);height:var(--mdc-chip-with-avatar-avatar-size, 24px);font-size:var(--mdc-chip-with-avatar-avatar-size, 24px)}.mdc-evolution-chip--selecting .mdc-evolution-chip__graphic{transition:width 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selectable:not(.mdc-evolution-chip--selected):not(.mdc-evolution-chip--with-primary-icon) .mdc-evolution-chip__graphic{width:0}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mat-mdc-standard-chip.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:6px;padding-right:6px}.mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:4px;padding-right:8px}[dir=rtl] .mdc-evolution-chip--with-avatar.mdc-evolution-chip--with-primary-graphic.mdc-evolution-chip--with-trailing-action .mdc-evolution-chip__graphic{padding-left:8px;padding-right:4px}.mdc-evolution-chip__checkmark{position:absolute;opacity:0;top:50%;left:50%;height:20px;width:20px}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__checkmark{color:var(--mdc-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__checkmark{color:var(--mdc-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark{transition:transform 150ms 0ms cubic-bezier(0.4, 0, 0.2, 1);transform:translate(-75%, -50%)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{transform:translate(-50%, -50%);opacity:1}.mdc-evolution-chip__checkmark-svg{display:block}.mdc-evolution-chip__checkmark-path{stroke-width:2px;stroke-dasharray:29.7833385;stroke-dashoffset:29.7833385;stroke:currentColor}.mdc-evolution-chip--selecting .mdc-evolution-chip__checkmark-path{transition:stroke-dashoffset 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark-path{stroke-dashoffset:0}@media(forced-colors: active){.mdc-evolution-chip__checkmark-path{stroke:CanvasText !important}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--trailing{height:18px;width:18px;font-size:18px}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove{opacity:calc(var(--mat-chip-trailing-action-opacity, 1)*var(--mdc-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing.mat-mdc-chip-remove:focus{opacity:calc(var(--mat-chip-trailing-action-focus-opacity, 1)*var(--mdc-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38))}.mat-mdc-standard-chip{border-radius:var(--mdc-chip-container-shape-radius, 8px);height:var(--mdc-chip-container-height, 32px)}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled){background-color:var(--mdc-chip-elevated-container-color, transparent)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{background-color:var(--mdc-chip-elevated-disabled-container-color)}.mat-mdc-standard-chip.mdc-evolution-chip--selected:not(.mdc-evolution-chip--disabled){background-color:var(--mdc-chip-elevated-selected-container-color, var(--mat-sys-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled{background-color:var(--mdc-chip-flat-disabled-selected-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}@media(forced-colors: active){.mat-mdc-standard-chip{outline:solid 1px}}.mat-mdc-standard-chip .mdc-evolution-chip__icon--primary{border-radius:var(--mdc-chip-with-avatar-avatar-shape-radius, 24px);width:var(--mdc-chip-with-icon-icon-size, 18px);height:var(--mdc-chip-with-icon-icon-size, 18px);font-size:var(--mdc-chip-with-icon-icon-size, 18px)}.mdc-evolution-chip--selected .mdc-evolution-chip__icon--primary{opacity:0}.mat-mdc-standard-chip:not(.mdc-evolution-chip--disabled) .mdc-evolution-chip__icon--primary{color:var(--mdc-chip-with-icon-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-standard-chip.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--primary{color:var(--mdc-chip-with-icon-disabled-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-highlighted{--mdc-chip-with-icon-icon-color:var(--mdc-chip-with-icon-selected-icon-color, var(--mat-sys-on-secondary-container));--mdc-chip-elevated-container-color:var(--mdc-chip-elevated-selected-container-color, var(--mat-sys-secondary-container));--mdc-chip-label-text-color:var(--mdc-chip-selected-label-text-color, var(--mat-sys-on-secondary-container));--mdc-chip-outline-width:var(--mdc-chip-flat-selected-outline-width, 0)}.mat-mdc-chip-focus-overlay{background:var(--mdc-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-selected .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted .mat-mdc-chip-focus-overlay{background:var(--mdc-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-chip:hover .mat-mdc-chip-focus-overlay{background:var(--mdc-chip-hover-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mdc-chip-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip-focus-overlay .mat-mdc-chip-selected:hover,.mat-mdc-chip-highlighted:hover .mat-mdc-chip-focus-overlay{background:var(--mdc-chip-selected-hover-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mdc-chip-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mdc-chip-focus-state-layer-color, var(--mat-sys-on-surface-variant));opacity:var(--mdc-chip-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-chip-selected.cdk-focused .mat-mdc-chip-focus-overlay,.mat-mdc-chip-highlighted.cdk-focused .mat-mdc-chip-focus-overlay{background:var(--mdc-chip-selected-focus-state-layer-color, var(--mat-sys-on-secondary-container));opacity:var(--mdc-chip-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-evolution-chip--disabled:not(.mdc-evolution-chip--selected) .mat-mdc-chip-avatar{opacity:var(--mdc-chip-with-avatar-disabled-avatar-opacity, 0.38)}.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{opacity:var(--mdc-chip-with-trailing-icon-disabled-trailing-icon-opacity, 0.38)}.mdc-evolution-chip--disabled.mdc-evolution-chip--selected .mdc-evolution-chip__checkmark{opacity:var(--mdc-chip-with-icon-disabled-icon-opacity, 0.38)}.mat-mdc-standard-chip.mdc-evolution-chip--disabled{opacity:var(--mat-chip-disabled-container-opacity, 1)}.mat-mdc-standard-chip.mdc-evolution-chip--selected .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-trailing-icon-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip.mdc-evolution-chip--selected.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing,.mat-mdc-standard-chip.mat-mdc-chip-highlighted.mdc-evolution-chip--disabled .mdc-evolution-chip__icon--trailing{color:var(--mat-chip-selected-disabled-trailing-icon-color, var(--mat-sys-on-surface))}.mat-mdc-chip-remove{opacity:var(--mat-chip-trailing-action-opacity, 1)}.mat-mdc-chip-remove:focus{opacity:var(--mat-chip-trailing-action-focus-opacity, 1)}.mat-mdc-chip-remove::after{background-color:var(--mat-chip-trailing-action-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-chip-remove:hover::after{opacity:var(--mat-chip-trailing-action-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-chip-remove:focus::after{opacity:var(--mat-chip-trailing-action-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-chip-selected .mat-mdc-chip-remove::after,.mat-mdc-chip-highlighted .mat-mdc-chip-remove::after{background-color:var(--mat-chip-selected-trailing-action-state-layer-color, var(--mat-sys-on-secondary-container))}.mat-mdc-standard-chip{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-standard-chip .mdc-evolution-chip__cell--primary,.mat-mdc-standard-chip .mdc-evolution-chip__action--primary,.mat-mdc-standard-chip .mat-mdc-chip-action-label{overflow:visible}.mat-mdc-standard-chip .mat-mdc-chip-graphic,.mat-mdc-standard-chip .mat-mdc-chip-trailing-icon{box-sizing:content-box}.mat-mdc-standard-chip._mat-animation-noopable,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__graphic,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark,.mat-mdc-standard-chip._mat-animation-noopable .mdc-evolution-chip__checkmark-path{transition-duration:1ms;animation-duration:1ms}.mat-mdc-chip-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;opacity:0;border-radius:inherit;transition:opacity 150ms linear}._mat-animation-noopable .mat-mdc-chip-focus-overlay{transition:none}.mat-mdc-basic-chip .mat-mdc-chip-focus-overlay{display:none}.mat-mdc-chip .mat-ripple.mat-mdc-chip-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-chip-avatar{text-align:center;line-height:1;color:var(--mdc-chip-with-icon-icon-color, currentColor)}.mat-mdc-chip{position:relative;z-index:0}.mat-mdc-chip-action-label{text-align:left;z-index:1}[dir=rtl] .mat-mdc-chip-action-label{text-align:right}.mat-mdc-chip.mdc-evolution-chip--with-trailing-action .mat-mdc-chip-action-label{position:relative}.mat-mdc-chip-action-label .mat-mdc-chip-primary-focus-indicator{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.mat-mdc-chip-action-label .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-chip-remove::before{margin:calc(var(--mat-focus-indicator-border-width, 3px)*-1);left:8px;right:8px}.mat-mdc-chip-remove::after{content:"";display:block;opacity:0;position:absolute;top:-3px;bottom:-3px;left:5px;right:5px;border-radius:50%;box-sizing:border-box;padding:12px;margin:-12px;background-clip:content-box}.mat-mdc-chip-remove .mat-icon{width:18px;height:18px;font-size:18px;box-sizing:content-box}.mat-chip-edit-input{cursor:text;display:inline-block;color:inherit;outline:0}@media(forced-colors: active){.mat-mdc-chip-selected:not(.mat-mdc-chip-multiple){outline-width:3px}}.mat-mdc-chip-action:focus .mat-focus-indicator::before{content:""}'],encapsulation:2,changeDetection:0})}return t})();var qCe=(()=>{class t{_elementRef=E(eA);_changeDetectorRef=E(ut);_dir=E(Do,{optional:!0});_lastDestroyedFocusedChipIndex=null;_keyManager;_destroyed=new je;_defaultRole="presentation";get chipFocusChanges(){return this._getChipStream(e=>e._onFocus)}get chipDestroyedChanges(){return this._getChipStream(e=>e.destroyed)}get chipRemovedChanges(){return this._getChipStream(e=>e.removed)}get disabled(){return this._disabled}set disabled(e){this._disabled=e,this._syncChipsState()}_disabled=!1;get empty(){return!this._chips||this._chips.length===0}get role(){return this._explicitRole?this._explicitRole:this.empty?null:this._defaultRole}tabIndex=0;set role(e){this._explicitRole=e}_explicitRole=null;get focused(){return this._hasFocusedChip()}_chips;_chipActions=new qa;constructor(){}ngAfterViewInit(){this._setUpFocusManagement(),this._trackChipSetChanges(),this._trackDestroyedFocusedChip()}ngOnDestroy(){this._keyManager?.destroy(),this._chipActions.destroy(),this._destroyed.next(),this._destroyed.complete()}_hasFocusedChip(){return this._chips&&this._chips.some(e=>e._hasFocus())}_syncChipsState(){this._chips?.forEach(e=>{e._chipListDisabled=this._disabled,e._changeDetectorRef.markForCheck()})}focus(){}_handleKeydown(e){this._originatesFromChip(e)&&this._keyManager.onKeydown(e)}_isValidIndex(e){return e>=0&&ethis._elementRef.nativeElement.tabIndex=e))}_getChipStream(e){return this._chips.changes.pipe(In(null),Si(()=>Bi(...this._chips.map(e))))}_originatesFromChip(e){let i=e.target;for(;i&&i!==this._elementRef.nativeElement;){if(i.classList.contains("mat-mdc-chip"))return!0;i=i.parentElement}return!1}_setUpFocusManagement(){this._chips.changes.pipe(In(this._chips)).subscribe(e=>{let i=[];e.forEach(n=>n._getActions().forEach(o=>i.push(o))),this._chipActions.reset(i),this._chipActions.notifyOnChanges()}),this._keyManager=new C2(this._chipActions).withVerticalOrientation().withHorizontalOrientation(this._dir?this._dir.value:"ltr").withHomeAndEnd().skipPredicate(e=>this._skipPredicate(e)),this.chipFocusChanges.pipe(mt(this._destroyed)).subscribe(({chip:e})=>{let i=e._getSourceAction(document.activeElement);i&&this._keyManager.updateActiveItem(i)}),this._dir?.change.pipe(mt(this._destroyed)).subscribe(e=>this._keyManager.withHorizontalOrientation(e))}_skipPredicate(e){return!e.isInteractive||e.disabled}_trackChipSetChanges(){this._chips.changes.pipe(In(null),mt(this._destroyed)).subscribe(()=>{this.disabled&&Promise.resolve().then(()=>this._syncChipsState()),this._redirectDestroyedChipFocus()})}_trackDestroyedFocusedChip(){this.chipDestroyedChanges.pipe(mt(this._destroyed)).subscribe(e=>{let n=this._chips.toArray().indexOf(e.chip);this._isValidIndex(n)&&e.chip._hasFocus()&&(this._lastDestroyedFocusedChipIndex=n)})}_redirectDestroyedChipFocus(){if(this._lastDestroyedFocusedChipIndex!=null){if(this._chips.length){let e=Math.min(this._lastDestroyedFocusedChipIndex,this._chips.length-1),i=this._chips.toArray()[e];i.disabled?this._chips.length===1?this.focus():this._keyManager.setPreviousItemActive():i.focus()}else this.focus();this._lastDestroyedFocusedChipIndex=null}}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-chip-set"]],contentQueries:function(i,n,o){if(i&1&&ni(o,d6,5),i&2){let r;oA(r=rA())&&(n._chips=r)}},hostAttrs:[1,"mat-mdc-chip-set","mdc-evolution-chip-set"],hostVars:1,hostBindings:function(i,n){i&1&&ee("keydown",function(r){return n._handleKeydown(r)}),i&2&&AA("role",n.role)},inputs:{disabled:[2,"disabled","disabled",IA],role:"role",tabIndex:[2,"tabIndex","tabIndex",e=>e==null?0:ln(e)]},ngContentSelectors:_tA,decls:2,vars:0,consts:[["role","presentation",1,"mdc-evolution-chip-set__chips"]],template:function(i,n){i&1&&(Kt(),m(0,"div",0),NA(1),p())},styles:[".mat-mdc-chip-set{display:flex}.mat-mdc-chip-set:focus{outline:none}.mat-mdc-chip-set .mdc-evolution-chip-set__chips{min-width:100%;margin-left:-8px;margin-right:0}.mat-mdc-chip-set .mdc-evolution-chip{margin:4px 0 4px 8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip-set__chips{margin-left:0;margin-right:-8px}[dir=rtl] .mat-mdc-chip-set .mdc-evolution-chip{margin-left:0;margin-right:8px}.mdc-evolution-chip-set__chips{display:flex;flex-flow:wrap;min-width:0}.mat-mdc-chip-set-stacked{flex-direction:column;align-items:flex-start}.mat-mdc-chip-set-stacked .mat-mdc-chip{width:100%}.mat-mdc-chip-set-stacked .mdc-evolution-chip__graphic{flex-grow:0}.mat-mdc-chip-set-stacked .mdc-evolution-chip__action--primary{flex-basis:100%;justify-content:start}input.mat-mdc-chip-input{flex:1 0 150px;margin-left:8px}[dir=rtl] input.mat-mdc-chip-input{margin-left:0;margin-right:8px}"],encapsulation:2,changeDetection:0})}return t})();var WCe=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({providers:[TB,{provide:RtA,useValue:{separatorKeyCodes:[13]}}],imports:[ui,P0,ui]})}return t})();var LtA={noSessionsFound:"No sessions found",readonlyChip:"Read only"},ZCe=new re("Session Tab Messages",{factory:()=>LtA});function FtA(t,A){t&1&&(m(0,"div",1),ve(1,"mat-progress-bar",4),p())}function GtA(t,A){if(t&1&&(m(0,"div",2),T(1),p()),t&2){let e=M();y(),Pe(e.i18n.noSessionsFound)}}function KtA(t,A){if(t&1&&(m(0,"mat-chip"),T(1),p()),t&2){let e=M(3);y(),Pe(e.i18n.readonlyChip)}}function UtA(t,A){if(t&1){let e=Ue();m(0,"div",6),ee("click",function(){let n=q(e).$implicit,o=M(2);return W(o.getSession(n.id))}),m(1,"div",7)(2,"div",8),T(3),ne(4,KtA,2,1,"mat-chip"),Ii(5,"async"),p(),m(6,"div",9),T(7),p()()()}if(t&2){let e=A.$implicit,i=M(2);te("ngClass",e.id===i.sessionId?"session-item current":"session-item"),y(3),FA(" ",e.id," "),y(),$(Qi(5,4,i.sessionService.canEdit(i.userId,e))===!1?4:-1),y(3),Pe(i.getDate(e))}}function TtA(t,A){if(t&1&&(m(0,"div",3),Rt(1,UtA,8,6,"div",5,Fi),p()),t&2){let e=M();y(),Nt(e.sessionList)}}var gQ=class t{userId="";appName="";sessionId="";sessionSelected=new Ve;sessionReloaded=new Ve;sessionList=[];refreshSessionsSubject=new je;getSessionSubject=new je;reloadSessionSubject=new je;changeDetectorRef=E(ut);sessionService=E(rd);uiStateService=E(zl);i18n=E(ZCe);constructor(){this.refreshSessionsSubject.pipe(Pt(()=>{this.uiStateService.setIsSessionListLoading(!0)}),Si(()=>this.sessionService.listSessions(this.userId,this.appName)),Pt(A=>{A=A.sort((e,i)=>Number(i.lastUpdateTime)-Number(e.lastUpdateTime)),this.sessionList=A,this.changeDetectorRef.markForCheck()}),Ws(300)).subscribe(()=>{this.uiStateService.setIsSessionListLoading(!1)},()=>{this.uiStateService.setIsSessionListLoading(!1)}),this.getSessionSubject.pipe(Pt(()=>{this.uiStateService.setIsSessionLoading(!0)}),Si(A=>this.sessionService.getSession(this.userId,this.appName,A).pipe(br(()=>dA(null)))),Pt(A=>{if(!A)return;let e=this.fromApiResultToSession(A);this.sessionSelected.emit(e),this.changeDetectorRef.markForCheck()})).subscribe(A=>{this.uiStateService.setIsSessionLoading(!1)},A=>{this.uiStateService.setIsSessionLoading(!1)}),this.reloadSessionSubject.pipe(Si(A=>this.sessionService.getSession(this.userId,this.appName,A)),Pt(A=>{let e=this.fromApiResultToSession(A);this.sessionReloaded.emit(e),this.changeDetectorRef.markForCheck()}),Ws(300)).subscribe()}ngOnInit(){setTimeout(()=>{this.refreshSessionsSubject.next()},500)}getSession(A){this.getSessionSubject.next(A)}getDate(A){let e=A.lastUpdateTime;return new Date(e*1e3).toLocaleString()}fromApiResultToSession(A){return{id:A?.id??"",appName:A?.appName??"",userId:A?.userId??"",state:A?.state??[],events:A?.events??[]}}reloadSession(A){this.reloadSessionSubject.next(A)}refreshSession(A){if(this.refreshSessionsSubject.next(),!(this.sessionList.length<=1)){let e=this.sessionList.findIndex(i=>i.id==A);return e==this.sessionList.length-1&&(e=-1),this.sessionList[e+1]}}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-session-tab"]],inputs:{userId:"userId",appName:"appName",sessionId:"sessionId"},outputs:{sessionSelected:"sessionSelected",sessionReloaded:"sessionReloaded"},decls:6,vars:4,consts:[[1,"session-wrapper"],[1,"loading-spinner-container"],[1,"empty-state"],[1,"session-tab-container",2,"margin-top","16px"],["mode","indeterminate"],[3,"ngClass"],[3,"click","ngClass"],[1,"session-info"],[1,"session-id"],[1,"session-date"]],template:function(e,i){if(e&1&&(m(0,"div",0),Wa(1),Ii(2,"async"),ne(3,FtA,2,0,"div",1)(4,GtA,2,1,"div",2)(5,TtA,3,0,"div",3),p()),e&2){let n=Qi(2,2,i.uiStateService.isSessionListLoading());y(3),$(n?3:-1),y(),$(!n&&i.sessionList.length===0?4:5)}},dependencies:[ta,ts,d6,DD],styles:[".session-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px;font-size:14px;font-weight:700;color:var(--session-tab-session-wrapper-color)}.session-wrapper[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{color:initial;padding-top:1em;text-align:center;font-weight:400;font-style:italic}.session-item[_ngcontent-%COMP%]{display:flex;justify-content:space-between;border:none;background-color:var(--session-tab-session-item-background-color);border-radius:8px;margin-bottom:4px;cursor:pointer}.session-item[_ngcontent-%COMP%]:hover{background-color:var(--session-tab-session-item-hover-background-color)}.session-item.current[_ngcontent-%COMP%]{background-color:var(--session-tab-session-item-current-background-color)}.session-id[_ngcontent-%COMP%]{color:var(--session-tab-session-id-color);font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.session-date[_ngcontent-%COMP%]{color:var(--session-tab-session-date-color);font-family:Roboto;font-size:12px;font-style:normal;font-weight:400;line-height:16px;letter-spacing:.3px}.session-info[_ngcontent-%COMP%]{padding:11px}.loading-spinner-container[_ngcontent-%COMP%]{margin-left:auto;margin-right:auto;margin-top:2em}"]})};var OtA={stateIsEmpty:"State is empty"},XCe=new re("State Tab Messages",{factory:()=>OtA});function JtA(t,A){if(t&1&&(m(0,"div",1),T(1),p()),t&2){let e=M();y(),Pe(e.i18n.stateIsEmpty)}}function YtA(t,A){if(t&1&&(m(0,"div"),ve(1,"ngx-json-viewer",2),p()),t&2){let e=M();y(),te("json",e.sessionState)}}var C9=class t{sessionState={};i18n=E(XCe);get isEmptyState(){return!this.sessionState||Object.keys(this.sessionState).length===0}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-state-tab"]],inputs:{sessionState:"sessionState"},decls:3,vars:1,consts:[[1,"state-wrapper"],[1,"empty-state"],[3,"json"]],template:function(e,i){e&1&&(m(0,"div",0),ne(1,JtA,2,1,"div",1)(2,YtA,2,1,"div"),p()),e&2&&(y(),$(i.isEmptyState?1:2))},dependencies:[nd,j1],styles:[".state-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px;margin-top:16px}.state-wrapper[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{text-align:center;font-style:italic}"]})};var $Ce=new re("CdkAccordion");var eIe=(()=>{class t{accordion=E($Ce,{optional:!0,skipSelf:!0});_changeDetectorRef=E(ut);_expansionDispatcher=E(tD);_openCloseAllSubscription=Ot.EMPTY;closed=new Ve;opened=new Ve;destroyed=new Ve;expandedChange=new Ve;id=E(un).getId("cdk-accordion-child-");get expanded(){return this._expanded}set expanded(e){if(this._expanded!==e){if(this._expanded=e,this.expandedChange.emit(e),e){this.opened.emit();let i=this.accordion?this.accordion.id:this.id;this._expansionDispatcher.notify(this.id,i)}else this.closed.emit();this._changeDetectorRef.markForCheck()}}_expanded=!1;disabled=!1;_removeUniqueSelectionListener=()=>{};constructor(){}ngOnInit(){this._removeUniqueSelectionListener=this._expansionDispatcher.listen((e,i)=>{this.accordion&&!this.accordion.multi&&this.accordion.id===i&&this.id!==e&&(this.expanded=!1)}),this.accordion&&(this._openCloseAllSubscription=this._subscribeToOpenCloseAllActions())}ngOnDestroy(){this.opened.complete(),this.closed.complete(),this.destroyed.emit(),this.destroyed.complete(),this._removeUniqueSelectionListener(),this._openCloseAllSubscription.unsubscribe()}toggle(){this.disabled||(this.expanded=!this.expanded)}close(){this.disabled||(this.expanded=!1)}open(){this.disabled||(this.expanded=!0)}_subscribeToOpenCloseAllActions(){return this.accordion._openCloseAllActions.subscribe(e=>{this.disabled||(this.expanded=e)})}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["cdk-accordion-item"],["","cdkAccordionItem",""]],inputs:{expanded:[2,"expanded","expanded",IA],disabled:[2,"disabled","disabled",IA]},outputs:{closed:"closed",opened:"opened",destroyed:"destroyed",expandedChange:"expandedChange"},exportAs:["cdkAccordionItem"],features:[gt([{provide:$Ce,useValue:void 0}])]})}return t})(),AIe=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({})}return t})();var HtA=["body"],ztA=["bodyWrapper"],PtA=[[["mat-expansion-panel-header"]],"*",[["mat-action-row"]]],jtA=["mat-expansion-panel-header","*","mat-action-row"];function VtA(t,A){}var qtA=[[["mat-panel-title"]],[["mat-panel-description"]],"*"],WtA=["mat-panel-title","mat-panel-description","*"];function ZtA(t,A){t&1&&(m(0,"span",1),ft(),m(1,"svg",2),ve(2,"path",3),p()())}var tIe=new re("MAT_ACCORDION"),iIe=new re("MAT_EXPANSION_PANEL"),XtA=(()=>{class t{_template=E(en);_expansionPanel=E(iIe,{optional:!0});constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["ng-template","matExpansionPanelContent",""]]})}return t})(),nIe=new re("MAT_EXPANSION_PANEL_DEFAULT_OPTIONS"),vH=(()=>{class t extends eIe{_viewContainerRef=E(xn);_animationsDisabled=E(Oi,{optional:!0})==="NoopAnimations";_document=E(ht);_ngZone=E(yA);_elementRef=E(eA);_renderer=E(an);_cleanupTransitionEnd;get hideToggle(){return this._hideToggle||this.accordion&&this.accordion.hideToggle}set hideToggle(e){this._hideToggle=e}_hideToggle=!1;get togglePosition(){return this._togglePosition||this.accordion&&this.accordion.togglePosition}set togglePosition(e){this._togglePosition=e}_togglePosition;afterExpand=new Ve;afterCollapse=new Ve;_inputChanges=new je;accordion=E(tIe,{optional:!0,skipSelf:!0});_lazyContent;_body;_bodyWrapper;_portal;_headerId=E(un).getId("mat-expansion-panel-header-");constructor(){super();let e=E(nIe,{optional:!0});this._expansionDispatcher=E(tD),e&&(this.hideToggle=e.hideToggle)}_hasSpacing(){return this.accordion?this.expanded&&this.accordion.displayMode==="default":!1}_getExpandedState(){return this.expanded?"expanded":"collapsed"}toggle(){this.expanded=!this.expanded}close(){this.expanded=!1}open(){this.expanded=!0}ngAfterContentInit(){this._lazyContent&&this._lazyContent._expansionPanel===this&&this.opened.pipe(In(null),$A(()=>this.expanded&&!this._portal),Pn(1)).subscribe(()=>{this._portal=new ba(this._lazyContent._template,this._viewContainerRef)}),this._setupAnimationEvents()}ngOnChanges(e){this._inputChanges.next(e)}ngOnDestroy(){super.ngOnDestroy(),this._cleanupTransitionEnd?.(),this._inputChanges.complete()}_containsFocus(){if(this._body){let e=this._document.activeElement,i=this._body.nativeElement;return e===i||i.contains(e)}return!1}_transitionEndListener=({target:e,propertyName:i})=>{e===this._bodyWrapper?.nativeElement&&i==="grid-template-rows"&&this._ngZone.run(()=>{this.expanded?this.afterExpand.emit():this.afterCollapse.emit()})};_setupAnimationEvents(){this._ngZone.runOutsideAngular(()=>{this._animationsDisabled?(this.opened.subscribe(()=>this._ngZone.run(()=>this.afterExpand.emit())),this.closed.subscribe(()=>this._ngZone.run(()=>this.afterCollapse.emit()))):setTimeout(()=>{let e=this._elementRef.nativeElement;this._cleanupTransitionEnd=this._renderer.listen(e,"transitionend",this._transitionEndListener),e.classList.add("mat-expansion-panel-animations-enabled")},200)})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-expansion-panel"]],contentQueries:function(i,n,o){if(i&1&&ni(o,XtA,5),i&2){let r;oA(r=rA())&&(n._lazyContent=r.first)}},viewQuery:function(i,n){if(i&1&&(At(HtA,5),At(ztA,5)),i&2){let o;oA(o=rA())&&(n._body=o.first),oA(o=rA())&&(n._bodyWrapper=o.first)}},hostAttrs:[1,"mat-expansion-panel"],hostVars:4,hostBindings:function(i,n){i&2&&iA("mat-expanded",n.expanded)("mat-expansion-panel-spacing",n._hasSpacing())},inputs:{hideToggle:[2,"hideToggle","hideToggle",IA],togglePosition:"togglePosition"},outputs:{afterExpand:"afterExpand",afterCollapse:"afterCollapse"},exportAs:["matExpansionPanel"],features:[gt([{provide:tIe,useValue:void 0},{provide:iIe,useExisting:t}]),Ct,ti],ngContentSelectors:jtA,decls:9,vars:4,consts:[["bodyWrapper",""],["body",""],[1,"mat-expansion-panel-content-wrapper"],["role","region",1,"mat-expansion-panel-content",3,"id"],[1,"mat-expansion-panel-body"],[3,"cdkPortalOutlet"]],template:function(i,n){i&1&&(Kt(PtA),NA(0),m(1,"div",2,0)(3,"div",3,1)(5,"div",4),NA(6,1),ne(7,VtA,0,0,"ng-template",5),p(),NA(8,2),p()()),i&2&&(y(),AA("inert",n.expanded?null:""),y(2),te("id",n.id),AA("aria-labelledby",n._headerId),y(4),te("cdkPortalOutlet",n._portal))},dependencies:[bc],styles:[".mat-expansion-panel{box-sizing:content-box;display:block;margin:0;overflow:hidden;position:relative;background:var(--mat-expansion-container-background-color, var(--mat-sys-surface));color:var(--mat-expansion-container-text-color, var(--mat-sys-on-surface));border-radius:var(--mat-expansion-container-shape, 12px)}.mat-expansion-panel.mat-expansion-panel-animations-enabled{transition:margin 225ms cubic-bezier(0.4, 0, 0.2, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12)}.mat-accordion .mat-expansion-panel:not(.mat-expanded),.mat-accordion .mat-expansion-panel:not(.mat-expansion-panel-spacing){border-radius:0}.mat-accordion .mat-expansion-panel:first-of-type{border-top-right-radius:var(--mat-expansion-container-shape, 12px);border-top-left-radius:var(--mat-expansion-container-shape, 12px)}.mat-accordion .mat-expansion-panel:last-of-type{border-bottom-right-radius:var(--mat-expansion-container-shape, 12px);border-bottom-left-radius:var(--mat-expansion-container-shape, 12px)}@media(forced-colors: active){.mat-expansion-panel{outline:solid 1px}}.mat-expansion-panel-content-wrapper{display:grid;grid-template-rows:0fr;grid-template-columns:100%}.mat-expansion-panel-animations-enabled .mat-expansion-panel-content-wrapper{transition:grid-template-rows 225ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel.mat-expanded>.mat-expansion-panel-content-wrapper{grid-template-rows:1fr}@supports not (grid-template-rows: 0fr){.mat-expansion-panel-content-wrapper{height:0}.mat-expansion-panel.mat-expanded>.mat-expansion-panel-content-wrapper{height:auto}}.mat-expansion-panel-content{display:flex;flex-direction:column;overflow:visible;min-height:0;visibility:hidden;font-family:var(--mat-expansion-container-text-font, var(--mat-sys-body-large-font));font-size:var(--mat-expansion-container-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-expansion-container-text-weight, var(--mat-sys-body-large-weight));line-height:var(--mat-expansion-container-text-line-height, var(--mat-sys-body-large-line-height));letter-spacing:var(--mat-expansion-container-text-tracking, var(--mat-sys-body-large-tracking))}.mat-expansion-panel-animations-enabled .mat-expansion-panel-content{transition:visibility 190ms linear}.mat-expansion-panel.mat-expanded>.mat-expansion-panel-content-wrapper>.mat-expansion-panel-content{visibility:visible}.mat-expansion-panel-body{padding:0 24px 16px}.mat-expansion-panel-spacing{margin:16px 0}.mat-accordion>.mat-expansion-panel-spacing:first-child,.mat-accordion>*:first-child:not(.mat-expansion-panel) .mat-expansion-panel-spacing{margin-top:0}.mat-accordion>.mat-expansion-panel-spacing:last-child,.mat-accordion>*:last-child:not(.mat-expansion-panel) .mat-expansion-panel-spacing{margin-bottom:0}.mat-action-row{border-top-style:solid;border-top-width:1px;display:flex;flex-direction:row;justify-content:flex-end;padding:16px 8px 16px 24px;border-top-color:var(--mat-expansion-actions-divider-color, var(--mat-sys-outline))}.mat-action-row .mat-button-base,.mat-action-row .mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-action-row .mat-button-base,[dir=rtl] .mat-action-row .mat-mdc-button-base{margin-left:0;margin-right:8px}"],encapsulation:2,changeDetection:0})}return t})();var oIe=(()=>{class t{panel=E(vH,{host:!0});_element=E(eA);_focusMonitor=E(ns);_changeDetectorRef=E(ut);_parentChangeSubscription=Ot.EMPTY;constructor(){E(Wn).load(Pr);let e=this.panel,i=E(nIe,{optional:!0}),n=E(new ws("tabindex"),{optional:!0}),o=e.accordion?e.accordion._stateChanges.pipe($A(r=>!!(r.hideToggle||r.togglePosition))):vr;this.tabIndex=parseInt(n||"")||0,this._parentChangeSubscription=Bi(e.opened,e.closed,o,e._inputChanges.pipe($A(r=>!!(r.hideToggle||r.disabled||r.togglePosition)))).subscribe(()=>this._changeDetectorRef.markForCheck()),e.closed.pipe($A(()=>e._containsFocus())).subscribe(()=>this._focusMonitor.focusVia(this._element,"program")),i&&(this.expandedHeight=i.expandedHeight,this.collapsedHeight=i.collapsedHeight)}expandedHeight;collapsedHeight;tabIndex=0;get disabled(){return this.panel.disabled}_toggle(){this.disabled||this.panel.toggle()}_isExpanded(){return this.panel.expanded}_getExpandedState(){return this.panel._getExpandedState()}_getPanelId(){return this.panel.id}_getTogglePosition(){return this.panel.togglePosition}_showToggle(){return!this.panel.hideToggle&&!this.panel.disabled}_getHeaderHeight(){let e=this._isExpanded();return e&&this.expandedHeight?this.expandedHeight:!e&&this.collapsedHeight?this.collapsedHeight:null}_keydown(e){switch(e.keyCode){case 32:case 13:Tr(e)||(e.preventDefault(),this._toggle());break;default:this.panel.accordion&&this.panel.accordion._handleHeaderKeydown(e);return}}focus(e,i){e?this._focusMonitor.focusVia(this._element,e,i):this._element.nativeElement.focus(i)}ngAfterViewInit(){this._focusMonitor.monitor(this._element).subscribe(e=>{e&&this.panel.accordion&&this.panel.accordion._handleHeaderFocus(this)})}ngOnDestroy(){this._parentChangeSubscription.unsubscribe(),this._focusMonitor.stopMonitoring(this._element)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=xe({type:t,selectors:[["mat-expansion-panel-header"]],hostAttrs:["role","button",1,"mat-expansion-panel-header","mat-focus-indicator"],hostVars:13,hostBindings:function(i,n){i&1&&ee("click",function(){return n._toggle()})("keydown",function(r){return n._keydown(r)}),i&2&&(AA("id",n.panel._headerId)("tabindex",n.disabled?-1:n.tabIndex)("aria-controls",n._getPanelId())("aria-expanded",n._isExpanded())("aria-disabled",n.panel.disabled),cn("height",n._getHeaderHeight()),iA("mat-expanded",n._isExpanded())("mat-expansion-toggle-indicator-after",n._getTogglePosition()==="after")("mat-expansion-toggle-indicator-before",n._getTogglePosition()==="before"))},inputs:{expandedHeight:"expandedHeight",collapsedHeight:"collapsedHeight",tabIndex:[2,"tabIndex","tabIndex",e=>e==null?0:ln(e)]},ngContentSelectors:WtA,decls:5,vars:3,consts:[[1,"mat-content"],[1,"mat-expansion-indicator"],["xmlns","http://www.w3.org/2000/svg","viewBox","0 -960 960 960","aria-hidden","true","focusable","false"],["d","M480-345 240-585l56-56 184 184 184-184 56 56-240 240Z"]],template:function(i,n){i&1&&(Kt(qtA),m(0,"span",0),NA(1),NA(2,1),NA(3,2),p(),ne(4,ZtA,3,0,"span",1)),i&2&&(iA("mat-content-hide-toggle",!n._showToggle()),y(4),$(n._showToggle()?4:-1))},styles:['.mat-expansion-panel-header{display:flex;flex-direction:row;align-items:center;padding:0 24px;border-radius:inherit;height:var(--mat-expansion-header-collapsed-state-height, 48px);font-family:var(--mat-expansion-header-text-font, var(--mat-sys-title-medium-font));font-size:var(--mat-expansion-header-text-size, var(--mat-sys-title-medium-size));font-weight:var(--mat-expansion-header-text-weight, var(--mat-sys-title-medium-weight));line-height:var(--mat-expansion-header-text-line-height, var(--mat-sys-title-medium-line-height));letter-spacing:var(--mat-expansion-header-text-tracking, var(--mat-sys-title-medium-tracking))}.mat-expansion-panel-animations-enabled .mat-expansion-panel-header{transition:height 225ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel-header::before{border-radius:inherit}.mat-expansion-panel-header.mat-expanded{height:var(--mat-expansion-header-expanded-state-height, 64px)}.mat-expansion-panel-header[aria-disabled=true]{color:var(--mat-expansion-header-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-expansion-panel-header:not([aria-disabled=true]){cursor:pointer}.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:var(--mat-expansion-header-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}@media(hover: none){.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:var(--mat-expansion-container-background-color, var(--mat-sys-surface))}}.mat-expansion-panel .mat-expansion-panel-header:not([aria-disabled=true]).cdk-keyboard-focused,.mat-expansion-panel .mat-expansion-panel-header:not([aria-disabled=true]).cdk-program-focused{background:var(--mat-expansion-header-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent))}.mat-expansion-panel-header._mat-animation-noopable{transition:none}.mat-expansion-panel-header:focus,.mat-expansion-panel-header:hover{outline:none}.mat-expansion-panel-header.mat-expanded:focus,.mat-expansion-panel-header.mat-expanded:hover{background:inherit}.mat-expansion-panel-header.mat-expansion-toggle-indicator-before{flex-direction:row-reverse}.mat-expansion-panel-header.mat-expansion-toggle-indicator-before .mat-expansion-indicator{margin:0 16px 0 0}[dir=rtl] .mat-expansion-panel-header.mat-expansion-toggle-indicator-before .mat-expansion-indicator{margin:0 0 0 16px}.mat-content{display:flex;flex:1;flex-direction:row;overflow:hidden}.mat-content.mat-content-hide-toggle{margin-right:8px}[dir=rtl] .mat-content.mat-content-hide-toggle{margin-right:0;margin-left:8px}.mat-expansion-toggle-indicator-before .mat-content.mat-content-hide-toggle{margin-left:24px;margin-right:0}[dir=rtl] .mat-expansion-toggle-indicator-before .mat-content.mat-content-hide-toggle{margin-right:24px;margin-left:0}.mat-expansion-panel-header-title{color:var(--mat-expansion-header-text-color, var(--mat-sys-on-surface))}.mat-expansion-panel-header-title,.mat-expansion-panel-header-description{display:flex;flex-grow:1;flex-basis:0;margin-right:16px;align-items:center}[dir=rtl] .mat-expansion-panel-header-title,[dir=rtl] .mat-expansion-panel-header-description{margin-right:0;margin-left:16px}.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title,.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description{color:inherit}.mat-expansion-panel-header-description{flex-grow:2;color:var(--mat-expansion-header-description-color, var(--mat-sys-on-surface-variant))}.mat-expansion-panel-animations-enabled .mat-expansion-indicator{transition:transform 225ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel-header.mat-expanded .mat-expansion-indicator{transform:rotate(180deg)}.mat-expansion-indicator::after{border-style:solid;border-width:0 2px 2px 0;content:"";display:inline-block;padding:3px;transform:rotate(45deg);vertical-align:middle;color:var(--mat-expansion-header-indicator-color, var(--mat-sys-on-surface-variant));display:var(--mat-expansion-legacy-header-indicator-display, none)}.mat-expansion-indicator svg{width:24px;height:24px;margin:0 -8px;vertical-align:middle;fill:var(--mat-expansion-header-indicator-color, var(--mat-sys-on-surface-variant));display:var(--mat-expansion-header-indicator-display, inline-block)}@media(forced-colors: active){.mat-expansion-panel-content{border-top:1px solid;border-top-left-radius:0;border-top-right-radius:0}}'],encapsulation:2,changeDetection:0})}return t})();var rIe=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=Oe({type:t,selectors:[["mat-panel-title"]],hostAttrs:[1,"mat-expansion-panel-header-title"]})}return t})();var sIe=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({imports:[ui,AIe,td]})}return t})();function $tA(t,A){t&1&&ve(0,"div",8)}function eiA(t,A){if(t&1&&(m(0,"span",14),T(1),p()),t&2){let e=M().$implicit,i=M();cn("left",i.getRelativeStart(e.span)+5,"%"),y(),FA("",(i.toMs(e.span.end_time)-i.toMs(e.span.start_time)).toFixed(2),"ms")}}function AiA(t,A){if(t&1){let e=Ue();m(0,"div",5),ee("click",function(){let n=q(e).$implicit,o=M();return W(o.selectRow(n))})("mouseenter",function(){let n=q(e).$implicit,o=M();return W(o.onHover(n))})("mouseleave",function(){q(e);let n=M();return W(n.onHoverOut())}),m(1,"div",6)(2,"div",7),Rt(3,$tA,1,0,"div",8,b1),p(),m(5,"span",9),T(6),p(),m(7,"div",10),T(8),p()(),m(9,"div",11)(10,"div",12),T(11),p(),ne(12,eiA,2,3,"span",13),p()()}if(t&2){let e=A.$implicit,i=M();iA("selected",i.rowSelected(e)),y(3),Nt(i.getArray(e.level)),y(2),iA("is-event-row",i.isEventRow(e)),y(),FA(" ",i.getSpanIcon(e.span.name)," "),y(),cn("width",400-e.level*20,"px"),iA("is-event-row",i.isEventRow(e)),y(),FA(" ",e.span.name," "),y(2),cn("left",i.getRelativeStart(e.span),"%")("width",i.getRelativeWidth(e.span),"%"),y(),FA(" ",(i.toMs(e.span.end_time)-i.toMs(e.span.start_time)).toFixed(2),"ms "),y(),$(i.getRelativeWidth(e.span)<10?12:-1)}}var I9=class t{spans=[];invocationId="";tree=[];eventData;baseStartTimeMs=0;totalDurationMs=1;flatTree=[];traceLabelIconMap=new Map([["Invocation","start"],["agent_run","directions_run"],["invoke_agent","directions_run"],["tool","build"],["call_llm","chat"]]);selectedRow=void 0;traceService=E(q1);constructor(){}ngOnInit(){this.tree=this.buildSpanTree(this.spans),this.flatTree=this.flattenTree(this.tree);let A=this.getGlobalTimes(this.spans);this.baseStartTimeMs=A.start,this.totalDurationMs=A.duration,this.traceService.selectedTraceRow$.subscribe(e=>this.selectedRow=e),this.traceService.eventData$.subscribe(e=>this.eventData=e)}buildSpanTree(A){let e=A.map(o=>ae({},o)),i=new Map,n=[];return e.forEach(o=>i.set(o.span_id,o)),e.forEach(o=>{if(o.parent_span_id&&i.has(o.parent_span_id)){let r=i.get(o.parent_span_id);r.children=r.children||[],r.children.push(o)}else n.push(o)}),n}getGlobalTimes(A){let e=Math.min(...A.map(n=>this.toMs(n.start_time))),i=Math.max(...A.map(n=>this.toMs(n.end_time)));return{start:e,duration:i-e}}toMs(A){return A/1e6}getRelativeStart(A){return(this.toMs(A.start_time)-this.baseStartTimeMs)/this.totalDurationMs*100}getRelativeWidth(A){return(this.toMs(A.end_time)-this.toMs(A.start_time))/this.totalDurationMs*100}flattenTree(A,e=0){return A.flatMap(n=>[{span:n,level:e},...n.children?this.flattenTree(n.children,e+1):[]])}getSpanIcon(A){for(let[e,i]of this.traceLabelIconMap.entries())if(A.startsWith(e))return i;return"start"}getArray(A){return Array.from({length:A})}selectRow(A){if(this.selectedRow&&this.selectedRow.span_id==A.span.span_id){this.traceService.selectedRow(void 0),this.traceService.setHoveredMessages(void 0,this.invocationId);return}this.traceService.selectedRow(A.span),this.traceService.setHoveredMessages(A.span,this.invocationId)}rowSelected(A){return this.selectedRow==A.span}isEventRow(A){if(!A.span.attributes)return!1;let e=A?.span.attributes["gcp.vertex.agent.event_id"];return!!(e&&this.eventData&&this.eventData.has(e))}onHover(A){this.traceService.setHoveredMessages(A.span,this.invocationId)}onHoverOut(){this.traceService.setHoveredMessages(void 0,this.invocationId),this.selectedRow&&this.traceService.setHoveredMessages(this.selectedRow,this.invocationId)}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-trace-tree"]],inputs:{spans:"spans",invocationId:"invocationId"},decls:8,vars:1,consts:[[2,"margin-top","15px"],[1,"invocation-id-container"],[1,"invocation-id"],[1,"trace-container"],[1,"trace-row",3,"selected"],[1,"trace-row",3,"click","mouseenter","mouseleave"],[1,"trace-row-left"],[1,"trace-indent"],[1,"indent-connector"],[1,"material-symbols-outlined",2,"margin-right","8px"],[1,"trace-label"],[1,"trace-bar-container"],[1,"trace-bar"],[1,"short-trace-bar-duration",3,"left"],[1,"short-trace-bar-duration"]],template:function(e,i){e&1&&(m(0,"div",0)(1,"div",1),T(2,"Invocation ID: "),m(3,"div",2),T(4),p()(),m(5,"div",3),Rt(6,AiA,13,16,"div",4,Fi),p()()),e&2&&(y(4),Pe(i.invocationId),y(2),Nt(i.flatTree))},styles:[".trace-container[_ngcontent-%COMP%]{width:100%;white-space:nowrap;font-size:12px}.trace-label[_ngcontent-%COMP%]{width:400px;color:var(--trace-tree-trace-label-color);font-family:Google Sans Mono,monospace;font-size:13px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:0px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.trace-bar-container[_ngcontent-%COMP%]{width:100%;position:relative;height:16px}.trace-bar[_ngcontent-%COMP%]{position:absolute;height:18px;background-color:var(--trace-tree-trace-bar-background-color);border-radius:4px;padding-left:4px;overflow:hidden;font-size:11px;line-height:16px;color:var(--trace-tree-trace-bar-color);font-family:Google Sans}.short-trace-bar-duration[_ngcontent-%COMP%]{position:absolute;color:var(--trace-tree-short-trace-bar-duration-color)}.trace-duration[_ngcontent-%COMP%]{color:var(--trace-tree-trace-duration-color);font-weight:400;margin-left:4px}.trace-row[_ngcontent-%COMP%]{display:flex;align-items:stretch;position:relative;height:32px;align-items:center;cursor:pointer}.trace-row[_ngcontent-%COMP%]:hover{background-color:var(--trace-tree-trace-row-hover-background-color)}.trace-row.selected[_ngcontent-%COMP%]{background-color:var(--trace-tree-trace-row-selected-background-color)}.trace-indent[_ngcontent-%COMP%]{display:flex;flex-shrink:0;height:100%}.indent-connector[_ngcontent-%COMP%]{width:20px;position:relative;height:100%}.vertical-line[_ngcontent-%COMP%]{position:absolute;top:0;bottom:0;left:9px;width:1px;background-color:var(--trace-tree-vertical-line-background-color)}.horizontal-line[_ngcontent-%COMP%]{position:absolute;top:50%;left:9px;width:10px;height:1px;background-color:var(--trace-tree-horizontal-line-background-color)}.trace-row-left[_ngcontent-%COMP%]{display:flex;width:50%}.invocation-id-container[_ngcontent-%COMP%]{color:var(--trace-tree-invocation-id-container-color);font-size:14px;font-style:normal;font-weight:700;line-height:20px;letter-spacing:0px;margin-bottom:5px}.invocation-id[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace}.trace-row-left[_ngcontent-%COMP%] span[_ngcontent-%COMP%], .trace-row-left[_ngcontent-%COMP%] div[_ngcontent-%COMP%]{color:var(--trace-tree-trace-row-left-span-div-color)}.trace-row-left[_ngcontent-%COMP%] .is-event-row[_ngcontent-%COMP%]{color:var(--trace-tree-trace-row-left-is-event-row-color)}"]})};var tiA={noInvocationsFound:"No invocations found",invocationsTitle:"Invocations"},aIe=new re("Trace Tab Messages",{factory:()=>tiA});function iiA(t,A){if(t&1&&(m(0,"div",1),T(1),p()),t&2){let e=M();y(),Pe(e.i18n.noInvocationsFound)}}function niA(t,A){if(t&1&&(m(0,"div",4)(1,"mat-expansion-panel")(2,"mat-expansion-panel-header")(3,"mat-panel-title"),T(4),p()(),ve(5,"app-trace-tree",5),p()()),t&2){let e=A.$implicit,i=M(2);y(4),FA(" ",i.invocToUserMsg.get(e.key)," "),y(),te("spans",e.value)("invocationId",i.findInvocIdFromTraceId(e.key))}}function oiA(t,A){if(t&1&&(m(0,"h2",2),T(1),p(),m(2,"div",3),Rt(3,niA,6,3,"div",4,Fi),Ii(5,"keyvalue"),p()),t&2){let e=M();y(),Pe(e.i18n.invocationsTitle),y(2),Nt(b4(5,1,e.invocTraces,e.mapOrderPreservingSort))}}var u9=class t{traceData=[];invocTraces=new Map;invocToUserMsg=new Map;i18n=E(aIe);constructor(){}ngOnInit(){}ngOnChanges(A){"traceData"in A&&this.rebuildTrace()}rebuildTrace(){this.invocTraces=this.traceData.reduce((A,e)=>{let i=e.trace_id,n=A.get(i);return n?(n.push(e),n.sort((o,r)=>o.start_time-r.start_time)):A.set(i,[e]),A},new Map);for(let[A,e]of this.invocTraces)this.invocToUserMsg.set(A,this.findUserMsgFromInvocGroup(e))}getArray(A){return Array.from({length:A})}findUserMsgFromInvocGroup(A){let e=A?.find(o=>o.attributes!==void 0&&"gcp.vertex.agent.invocation_id"in o.attributes);return e?JSON.parse(e.attributes["gcp.vertex.agent.llm_request"]).contents.filter(o=>o.role=="user").at(-1)?.parts[0]?.text??"[attachment]":"[no invocation id found]"}findInvocIdFromTraceId(A){return this.invocTraces.get(A)?.find(i=>i.attributes!==void 0&&"gcp.vertex.agent.invocation_id"in i.attributes).attributes["gcp.vertex.agent.invocation_id"]}mapOrderPreservingSort=(A,e)=>0;static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-trace-tab"]],inputs:{traceData:"traceData"},features:[ti],decls:3,vars:1,consts:[[1,"trace-wrapper"],[1,"empty-state"],["mat-dialog-title","",1,"trace-title"],[1,"trace-list-wrapper"],[1,"trace-item"],[3,"spans","invocationId"]],template:function(e,i){e&1&&(m(0,"div",0),ne(1,iiA,2,1,"div",1)(2,oiA,6,4),p()),e&2&&(y(),$(i.invocTraces.size===0?1:2))},dependencies:[tr,vH,oIe,rIe,I9,HI],styles:[".trace-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px}.trace-wrapper[_ngcontent-%COMP%] .empty-state[_ngcontent-%COMP%]{padding-top:1em;text-align:center;font-style:italic}.trace-container[_ngcontent-%COMP%]{width:100%;white-space:nowrap;font-size:12px}.trace-title[_ngcontent-%COMP%]{color:var(--trace-tab-trace-title-color);font-size:14px;font-style:normal;font-weight:700;line-height:20px;letter-spacing:0px}.trace-label[_ngcontent-%COMP%]{width:400px;color:var(--trace-tab-trace-label-color);text-overflow:ellipsis;font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:0px}.trace-bar-container[_ngcontent-%COMP%]{width:50vw;position:relative;height:16px}.trace-bar[_ngcontent-%COMP%]{position:absolute;height:18px;background-color:var(--trace-tab-trace-bar-background-color);border-radius:4px;padding-left:4px;overflow:hidden;font-size:11px;line-height:16px;color:var(--trace-tab-trace-bar-color);font-family:Google Sans}.trace-duration[_ngcontent-%COMP%]{color:var(--trace-tab-trace-duration-color);font-weight:400;margin-left:4px}.trace-row[_ngcontent-%COMP%]{display:flex;align-items:stretch;position:relative;height:32px}.trace-indent[_ngcontent-%COMP%]{display:flex;flex-shrink:0;height:100%}.indent-connector[_ngcontent-%COMP%]{width:20px;position:relative;height:100%}.vertical-line[_ngcontent-%COMP%]{position:absolute;top:0;bottom:0;left:9px;width:1px;background-color:var(--trace-tab-vertical-line-background-color)}.horizontal-line[_ngcontent-%COMP%]{position:absolute;top:50%;left:9px;width:10px;height:1px;background-color:var(--trace-tab-horizontal-line-background-color)}.trace-item[_ngcontent-%COMP%]{margin-top:5px}.trace-item[_ngcontent-%COMP%]{--mat-expansion-container-background-color: var(--trace-tab-trace-item-container-background-color)}.trace-item[_ngcontent-%COMP%]{--mat-expansion-header-focus-state-layer-color: var(--trace-tab-trace-item-header-focus-state-layer-color)}.trace-item[_ngcontent-%COMP%]{--mat-expansion-header-description-color: var(--trace-tab-trace-item-header-description-color)}.trace-item[_ngcontent-%COMP%]{--mat-expansion-header-text-size: 15}.trace-item[_ngcontent-%COMP%] .mat-expansion-panel-header.mat-expanded:focus{background-color:var(--trace-tab-mat-expansion-panel-header-focus-background-color)}.trace-item[_ngcontent-%COMP%] .mat-expansion-panel-header.mat-expanded{background-color:var(--trace-tab-mat-expansion-panel-header-background-color)}.trace-item[_ngcontent-%COMP%] .mat-expansion-panel-header.mat-expanded:hover{background-color:var(--trace-tab-mat-expansion-panel-header-hover-background-color)} .mat-expansion-panel-header-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden} .mat-expansion-panel-header-description{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}"]})};var riA={agentDevelopmentKitLabel:"Agent Development Kit",collapsePanelTooltip:"Collapse panel",traceTabLabel:"Trace",eventsTabLabel:"Events",stateTabLabel:"State",artifactsTabLabel:"Artifacts",sessionsTabLabel:"Sessions",evalTabLabel:"Eval",selectEventAriaLabel:"Select event",eventDetailsTabLabel:"Event",requestDetailsTabLabel:"Request",responseDetailsTabLabel:"Response",responseIsNotAvailable:"Response is not available",requestIsNotAvailable:"Request is not available"},cIe=new re("Side Panel Messages",{factory:()=>riA});var siA=["evalTabContainer"];function aiA(t,A){t&1&&En(0)}function ciA(t,A){if(t&1&&(m(0,"div"),ne(1,aiA,1,0,"ng-container",12),m(2,"div",13),T(3,"Powered by Agent Development Kit"),p()()),t&2){let e=M(2);y(),te("ngComponentOutlet",e.logoComponent)}}function liA(t,A){if(t&1&&(ve(0,"img",14),T(1)),t&2){let e=M(2);y(),FA(" ",e.i18n.agentDevelopmentKitLabel," ")}}function giA(t,A){if(t&1&&(m(0,"mat-option",17),T(1),p()),t&2){let e=A.$implicit;te("value",e),y(),Pe(e)}}function diA(t,A){t&1&&Rt(0,giA,2,2,"mat-option",17,Fi),t&2&&Nt(A)}function CiA(t,A){if(t&1&&(m(0,"mat-option",17),T(1),p()),t&2){let e=M(3);te("value",e.selectedAppControl().value),y(),Pe(e.selectedAppControl().value)}}function IiA(t,A){if(t&1){let e=Ue();m(0,"div",18)(1,"mat-icon",19),ee("click",function(){q(e);let n=M(3);return W(n.openAddItemDialog.emit(!0))}),T(2,"add"),p(),m(3,"mat-icon",20),ee("click",function(){q(e);let n=M(3);return W(!n.disableBuilderIcon()&&n.enterBuilderMode.emit(!0))}),T(4,"edit"),p()()}if(t&2){let e=M(3);y(3),cn("cursor",e.disableBuilderIcon()?"not-allowed":"pointer")("opacity",e.disableBuilderIcon()?"0.5":"1")("margin-right",32,"px"),te("matTooltip",e.disableBuilderIcon()?"Thia gent was not built by builder":"Edit in Builder Mode")}}function uiA(t,A){if(t&1){let e=Ue();m(0,"div",11)(1,"div",15)(2,"mat-select",16),ee("selectionChange",function(n){q(e);let o=M(2);return W(o.appSelectionChange.emit(n))}),ne(3,diA,2,0),Ii(4,"async"),ne(5,CiA,2,2,"mat-option",17),p()(),ne(6,IiA,5,7,"div",18),p()}if(t&2){let e,i=M(2);y(2),te("placeholder",i.isLoadingApps()()?"Loading...":"Select an agent")("formControl",i.selectedAppControl()),y(),$((e=Qi(4,5,i.apps$()))?3:-1,e),y(2),$(i.selectedAppControl().value&&i.isLoadingApps()()?5:-1),y(),$(i.isBuilderMode()?-1:6)}}function hiA(t,A){if(t&1){let e=Ue();m(0,"div",6)(1,"div",7)(2,"div",8)(3,"div",9),ne(4,ciA,4,1,"div")(5,liA,2,1),p(),m(6,"span",10),ee("click",function(){q(e);let n=M();return W(n.closePanel.emit())}),T(7,"left_panel_close"),p()()()(),ne(8,uiA,7,7,"div",11),Ii(9,"async")}if(t&2){let e=M();y(4),$(e.logoComponent?4:5),y(2),M1("matTooltip",e.i18n.collapsePanelTooltip),y(2),$(Qi(9,3,e.isApplicationSelectorEnabledObs())?8:-1)}}function BiA(t,A){t&1&&(m(0,"div",2),ve(1,"mat-progress-spinner",21),p())}function EiA(t,A){if(t&1&&(m(0,"span",28),T(1),p()),t&2){let e=M(3);y(),Pe(e.i18n.sessionsTabLabel)}}function fiA(t,A){t&1&&En(0)}function QiA(t,A){if(t&1&&(m(0,"mat-tab",23),ne(1,EiA,2,1,"ng-template",24)(2,fiA,1,0,"ng-container",27),p()),t&2){M();let e=Ji(19);y(2),te("ngTemplateOutlet",e)}}function miA(t,A){if(t&1&&(m(0,"span",28),T(1),p()),t&2){let e=M(3);y(),Pe(e.i18n.traceTabLabel)}}function piA(t,A){if(t&1&&(m(0,"mat-tab",23),ne(1,miA,2,1,"ng-template",24),ve(2,"app-trace-tab",29),p()),t&2){let e=M(2);y(2),te("traceData",e.traceData())}}function wiA(t,A){if(t&1&&(m(0,"span",28),T(1),p()),t&2){let e=M(2);y(),Pe(e.i18n.eventsTabLabel)}}function yiA(t,A){if(t&1&&(m(0,"span",28),T(1),p()),t&2){let e=M(2);y(),Pe(e.i18n.stateTabLabel)}}function DiA(t,A){if(t&1&&(m(0,"span",28),T(1),p()),t&2){let e=M(3);y(),Pe(e.i18n.artifactsTabLabel)}}function viA(t,A){if(t&1&&(m(0,"mat-tab"),ne(1,DiA,2,1,"ng-template",24),ve(2,"app-artifact-tab",30),p()),t&2){let e=M(2);y(2),te("artifacts",e.artifacts())}}function biA(t,A){if(t&1&&(m(0,"span",28),T(1),p()),t&2){let e=M(3);y(),Pe(e.i18n.sessionsTabLabel)}}function MiA(t,A){t&1&&En(0)}function SiA(t,A){if(t&1&&(m(0,"mat-tab",23),ne(1,biA,2,1,"ng-template",24)(2,MiA,1,0,"ng-container",27),p()),t&2){M();let e=Ji(19);y(2),te("ngTemplateOutlet",e)}}function kiA(t,A){if(t&1&&(m(0,"span",28),T(1),p()),t&2){let e=M(3);y(),Pe(e.i18n.evalTabLabel)}}function xiA(t,A){t&1&&(m(0,"mat-tab"),ne(1,kiA,2,1,"ng-template",24),En(2,null,1),p())}function _iA(t,A){if(t&1){let e=Ue();m(0,"app-session-tab",31),ee("sessionSelected",function(n){q(e);let o=M(2);return W(o.sessionSelected.emit(n))})("sessionReloaded",function(n){q(e);let o=M(2);return W(o.sessionReloaded.emit(n))}),p()}if(t&2){let e=M(2);te("userId",e.userId())("appName",e.appName())("sessionId",e.sessionId())}}function RiA(t,A){if(t&1){let e=Ue();m(0,"div",3)(1,"mat-tab-group",22),ee("selectedTabChange",function(n){q(e);let o=M();return W(o.tabChange.emit(n))}),Wa(2),Ii(3,"async"),ne(4,QiA,3,1,"mat-tab",23)(5,piA,3,1,"mat-tab",23),Ii(6,"async"),m(7,"mat-tab",23),ne(8,wiA,2,1,"ng-template",24),m(9,"app-event-tab",25),ee("selectedEvent",function(n){q(e);let o=M();return W(o.eventSelected.emit(n))}),p()(),m(10,"mat-tab"),ne(11,yiA,2,1,"ng-template",24),ve(12,"app-state-tab",26),p(),ne(13,viA,3,1,"mat-tab"),Ii(14,"async"),ne(15,SiA,3,1,"mat-tab",23)(16,xiA,4,0,"mat-tab"),Ii(17,"async"),p(),ne(18,_iA,1,3,"ng-template",null,0,a2),p()}if(t&2){let e=M(),i=s2(2);te("hidden",i);let n=Qi(3,9,e.isSessionsTabReorderingEnabledObs);y(4),$(n?4:-1),y(),$(Qi(6,11,e.isTraceEnabledObs)?5:-1),y(4),te("eventsMap",e.eventData())("traceData",e.traceData()),y(3),te("sessionState",e.currentSessionState()),y(),$(Qi(14,13,e.isArtifactsTabEnabledObs)?13:-1),y(2),$(n?-1:15),y(),$(Qi(17,15,e.isEvalEnabledObs)?16:-1)}}function NiA(t,A){if(t&1){let e=Ue();m(0,"div",44),ee("click",function(){q(e);let n=M(2);return W(n.openImageDialog.emit(n.rawSvgString()))}),p()}if(t&2){let e=M(2);te("innerHtml",e.renderedEventGraph(),J0)}}function LiA(t,A){t&1&&(m(0,"div",42),ve(1,"mat-progress-spinner",21),p())}function FiA(t,A){if(t&1&&(m(0,"div",43),T(1),p()),t&2){let e=M(2);y(),Pe(e.i18n.requestIsNotAvailable)}}function GiA(t,A){if(t&1&&(m(0,"div",40),ve(1,"ngx-json-viewer",41),p()),t&2){let e=M(2);y(),te("json",e.llmRequest())}}function KiA(t,A){t&1&&(m(0,"div",42),ve(1,"mat-progress-spinner",21),p())}function UiA(t,A){if(t&1&&(m(0,"div",43),T(1),p()),t&2){let e=M(2);y(),Pe(e.i18n.responseIsNotAvailable)}}function TiA(t,A){if(t&1&&(m(0,"div",40),ve(1,"ngx-json-viewer",41),p()),t&2){let e=M(2);y(),te("json",e.llmResponse())}}function OiA(t,A){if(t&1){let e=Ue();m(0,"div",4)(1,"div",32)(2,"div",33)(3,"mat-paginator",34),ee("page",function(n){q(e);let o=M();return W(o.page.emit(n))}),p(),m(4,"button",35)(5,"mat-icon",36),ee("click",function(){q(e);let n=M();return W(n.closeSelectedEvent.emit())}),T(6,"close"),p()()()(),m(7,"div")(8,"mat-tab-group")(9,"mat-tab",37)(10,"div",38),ne(11,NiA,1,1,"div",39),p(),m(12,"div",40),ve(13,"ngx-json-viewer",41),p()(),m(14,"mat-tab",37),ne(15,LiA,2,0,"div",42),Ii(16,"async"),ne(17,FiA,2,1,"div",43)(18,GiA,2,1,"div",40),p(),m(19,"mat-tab",37),ne(20,KiA,2,0,"div",42),Ii(21,"async"),ne(22,UiA,2,1,"div",43)(23,TiA,2,1,"div",40),p()()()()}if(t&2){let e=M(),i=s2(2);te("hidden",i),y(3),te("length",e.eventData().size)("pageSize",1)("pageIndex",e.selectedEventIndex()),AA("aria-label",e.i18n.selectEventAriaLabel),y(6),M1("label",e.i18n.eventDetailsTabLabel),y(2),$(e.renderedEventGraph()?11:-1),y(2),te("json",e.selectedEvent()),y(),M1("label",e.i18n.requestDetailsTabLabel),y(),$(Qi(16,12,e.uiStateService.isEventRequestResponseLoading())===!0?15:e.llmRequest()?18:17),y(4),M1("label",e.i18n.responseDetailsTabLabel),y(),$(Qi(21,14,e.uiStateService.isEventRequestResponseLoading())===!0?20:e.llmResponse()?23:22)}}var dQ=class t{appName=lt("");userId=lt("");sessionId=lt("");traceData=lt([]);eventData=lt(new Map);currentSessionState=lt();artifacts=lt([]);selectedEvent=lt();selectedEventIndex=lt();renderedEventGraph=lt();rawSvgString=lt(null);llmRequest=lt();llmResponse=lt();showSidePanel=lt(!1);isApplicationSelectorEnabledObs=lt(dA(!1));apps$=lt(dA([]));isLoadingApps=lt(mA(!1));selectedAppControl=lt(new g2("",{nonNullable:!0}));isBuilderMode=lt(!1);disableBuilderIcon=lt(!1);closePanel=No();appSelectionChange=No();tabChange=No();eventSelected=No();sessionSelected=No();sessionReloaded=No();evalCaseSelected=No();evalSetIdSelected=No();returnToSession=No();evalNotInstalled=No();page=No();closeSelectedEvent=No();openImageDialog=No();openAddItemDialog=No();enterBuilderMode=No();eventTabComponent=es(lQ);sessionTabComponent=es(gQ);evalTabComponent=es(a0);evalTabContainer=es("evalTabContainer",{read:xn});logoComponent=E(c9,{optional:!0});i18n=E(cIe);featureFlagService=E(Ks);evalTabComponentClass=E(n9,{optional:!0});environmentInjector=E(Hr);uiStateService=E(zl);destroyRef=E(Fr);isAlwaysOnSidePanelEnabledObs=this.featureFlagService.isAlwaysOnSidePanelEnabled();isTraceEnabledObs=this.featureFlagService.isTraceEnabled();isArtifactsTabEnabledObs=this.featureFlagService.isArtifactsTabEnabled();isEvalEnabledObs=this.featureFlagService.isEvalEnabled();isTokenStreamingEnabledObs=this.featureFlagService.isTokenStreamingEnabled();isMessageFileUploadEnabledObs=this.featureFlagService.isMessageFileUploadEnabled();isManualStateUpdateEnabledObs=this.featureFlagService.isManualStateUpdateEnabled();isBidiStreamingEnabledObs=this.featureFlagService.isBidiStreamingEnabled;isSessionsTabReorderingEnabledObs=this.featureFlagService.isSessionsTabReorderingEnabled();ngAfterViewInit(){setTimeout(()=>{this.initEvalTab()},500)}initEvalTab(){this.isEvalEnabledObs.pipe(_l()).subscribe(A=>{if(A){let e=this.evalTabContainer()?.createComponent(this.evalTabComponentClass??a0,{environmentInjector:this.environmentInjector});if(!e)return;Xr(this.environmentInjector,()=>{pa(()=>{e.setInput("appName",this.appName()),e.setInput("userId",this.userId()),e.setInput("sessionId",this.sessionId())})}),e.instance.sessionSelected.subscribe(i=>{this.sessionSelected.emit(i)}),e.instance.evalCaseSelected.subscribe(i=>{this.evalCaseSelected.emit(i)}),e.instance.evalSetIdSelected.subscribe(i=>{this.evalSetIdSelected.emit(i)}),e.instance.shouldReturnToSession.subscribe(i=>{this.returnToSession.emit(i)}),e.instance.evalNotInstalledMsg.subscribe(i=>{this.evalNotInstalled.emit(i)})}})}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-side-panel"]],viewQuery:function(e,i){e&1&&(Kr(i.eventTabComponent,lQ,5),Kr(i.sessionTabComponent,gQ,5),Kr(i.evalTabComponent,a0,5),Kr(i.evalTabContainer,siA,5,xn)),e&2&&Aa(4)},inputs:{appName:[1,"appName"],userId:[1,"userId"],sessionId:[1,"sessionId"],traceData:[1,"traceData"],eventData:[1,"eventData"],currentSessionState:[1,"currentSessionState"],artifacts:[1,"artifacts"],selectedEvent:[1,"selectedEvent"],selectedEventIndex:[1,"selectedEventIndex"],renderedEventGraph:[1,"renderedEventGraph"],rawSvgString:[1,"rawSvgString"],llmRequest:[1,"llmRequest"],llmResponse:[1,"llmResponse"],showSidePanel:[1,"showSidePanel"],isApplicationSelectorEnabledObs:[1,"isApplicationSelectorEnabledObs"],apps$:[1,"apps$"],isLoadingApps:[1,"isLoadingApps"],selectedAppControl:[1,"selectedAppControl"],isBuilderMode:[1,"isBuilderMode"],disableBuilderIcon:[1,"disableBuilderIcon"]},outputs:{closePanel:"closePanel",appSelectionChange:"appSelectionChange",tabChange:"tabChange",eventSelected:"eventSelected",sessionSelected:"sessionSelected",sessionReloaded:"sessionReloaded",evalCaseSelected:"evalCaseSelected",evalSetIdSelected:"evalSetIdSelected",returnToSession:"returnToSession",evalNotInstalled:"evalNotInstalled",page:"page",closeSelectedEvent:"closeSelectedEvent",openImageDialog:"openImageDialog",openAddItemDialog:"openAddItemDialog",enterBuilderMode:"enterBuilderMode"},decls:8,vars:9,consts:[["sessionsTabBody",""],["evalTabContainer",""],[1,"loading-spinner-container"],[1,"tabs-container",3,"hidden"],[1,"details-panel-container",3,"hidden"],[1,"resize-handler"],[2,"margin-top","20px","margin-left","20px","display","flex"],[2,"width","100%"],[1,"drawer-header"],[1,"drawer-logo"],[1,"material-symbols-outlined",2,"color","#c4c7c5","cursor","pointer","margin-right","15px",3,"click","matTooltip"],[1,"app-actions"],[4,"ngComponentOutlet"],[1,"powered-by-adk"],["src","assets/ADK-512-color.svg","width","32px","height","32px"],[1,"app-select-container"],[1,"app-select",3,"selectionChange","placeholder","formControl"],[1,"app-name-option",3,"value"],[1,"mode-toggle-container"],["matTooltip","Create new agent in builder mode",2,"cursor","pointer","margin-right","16px",3,"click"],[3,"click","matTooltip"],["mode","indeterminate","diameter","50"],[3,"selectedTabChange"],[1,"tabs-header"],["mat-tab-label",""],[3,"selectedEvent","eventsMap","traceData"],[3,"sessionState"],[4,"ngTemplateOutlet"],[1,"tab-label"],[3,"traceData"],[3,"artifacts"],[3,"sessionSelected","sessionReloaded","userId","appName","sessionId"],[1,"details-content"],[2,"display","flex","justify-content","flex-end","margin-top","10px"],[1,"event-paginator",3,"page","length","pageSize","pageIndex"],["mat-mini-fab",""],[3,"click"],[3,"label"],[1,"event-graph-container"],[3,"innerHtml"],[1,"json-viewer-container"],[3,"json"],[1,"request-response-loading-spinner-container"],[1,"request-response-empty-state"],[3,"click","innerHtml"]],template:function(e,i){if(e&1&&(ne(0,hiA,10,5),Ii(1,"async"),Wa(2),Ii(3,"async"),ne(4,BiA,2,0,"div",2)(5,RiA,20,17,"div",3)(6,OiA,24,16,"div",4),ve(7,"div",5)),e&2){$(Qi(1,4,i.isAlwaysOnSidePanelEnabledObs)===!1?0:-1),y(2);let n=S1(Qi(3,6,i.uiStateService.isSessionLoading()));y(2),$(n?4:-1),y(),$(i.appName()!=""&&i.showSidePanel()?5:-1),y(),$(i.selectedEvent()&&i.showSidePanel()?6:-1)}},dependencies:[ts,Kn,Fo,YI,nl,Ma,a9,g6,fH,u9,lQ,C9,pD,gQ,RAe,J5,ir,nd,j1,Ac,Yl,RB,cN,Z1],styles:[".drawer-header[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-between;align-items:center}.drawer-header[_ngcontent-%COMP%]{--mdc-filled-button-container-color: var(--side-panel-button-filled-container-color)}.drawer-header[_ngcontent-%COMP%]{--mdc-filled-button-label-text-color: var(--side-panel-button-filled-label-text-color)}.drawer-header[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{width:36px;height:36px;color:var(--side-panel-mat-icon-color);cursor:pointer;display:flex;align-items:center;justify-content:center}.tabs-container[_ngcontent-%COMP%]{width:100%;margin-top:20px}.tab-label[_ngcontent-%COMP%]{font-size:14px}.resize-handler[_ngcontent-%COMP%]{background:var(--side-panel-resize-handler-background-color);width:4px;border-radius:4px;position:absolute;display:block;height:20%;top:40%;right:0;z-index:9999;cursor:ew-resize}.json-viewer-container[_ngcontent-%COMP%]{margin:10px}.event-paginator[_ngcontent-%COMP%]{margin-top:-8px;margin-right:auto;background-color:inherit;display:flex;justify-content:center}[_nghost-%COMP%] .mat-mdc-paginator-page-size{display:none}.details-panel-container[_ngcontent-%COMP%]{position:absolute;width:100%;height:98%;left:0;right:0;bottom:0;background:var(--side-panel-details-panel-container-background-color);display:inline-block;justify-content:center;align-items:center;z-index:10}.details-content[_ngcontent-%COMP%]{color:var(--side-panel-details-content-color);font-size:14px}.event-graph-container[_ngcontent-%COMP%]{margin-top:16px;margin-bottom:16px;display:flex;justify-content:center;max-height:33%;cursor:pointer}.event-graph-container[_ngcontent-%COMP%] svg{width:100%;height:100%;display:block;object-fit:contain}.event-graph-container[_ngcontent-%COMP%] svg text{font-family:Google Sans Mono,monospace;font-size:11px}.drawer-logo[_ngcontent-%COMP%]{margin-left:9px;display:flex;align-items:center;font-size:16px;font-style:normal;font-weight:500;line-height:24px;letter-spacing:.1px}.drawer-logo[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{margin-right:9px}.powered-by-adk[_ngcontent-%COMP%]{font-size:10px;color:var(--side-panel-powered-by-adk-color);text-align:right;margin-top:-5px}.app-select[_ngcontent-%COMP%]{width:100%}.app-select-container[_ngcontent-%COMP%]{width:35%;margin-top:12px;background-color:var(--side-panel-app-select-container-background-color);margin-left:10px;height:30px;display:flex;justify-content:space-between;padding-left:20px;padding-right:20px;border-radius:10px;padding-top:5px}.app-select-container[_ngcontent-%COMP%]{--mat-select-placeholder-text-color: var(--side-panel-select-placeholder-text-color)}.app-select-container[_ngcontent-%COMP%]{--mat-select-enabled-trigger-text-color: var(--side-panel-select-enabled-trigger-text-color)}.app-select-container[_ngcontent-%COMP%]{--mat-select-enabled-arrow-color: var(--side-panel-select-enabled-arrow-color)}.app-name-option[_ngcontent-%COMP%], .app-select[_ngcontent-%COMP%]{color:var(--side-panel-app-name-option-color);font-family:Google Sans Mono,monospace;font-style:normal;font-weight:400;padding-left:unset}.mode-toggle-container[_ngcontent-%COMP%]{display:flex;align-items:center;margin-right:20px}.build-mode-button[_ngcontent-%COMP%]{margin:0 4px}.build-mode-button.mat-mdc-unelevated-button[_ngcontent-%COMP%]{height:30px}.app-actions[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;margin-top:12px;margin-left:10px}.loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;height:100%}.request-response-loading-spinner-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;margin-top:2em}.request-response-empty-state[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;margin-top:2em;font-style:italic}"]})};function JiA(t,A){t&1&&ve(0,"mat-progress-spinner",6)}function YiA(t,A){t&1&&(m(0,"div"),T(1,"Request is not available."),p())}function HiA(t,A){if(t&1&&(m(0,"div",3),ve(1,"ngx-json-viewer",4),p()),t&2){let e=M();y(),te("json",e.llmRequest)}}function ziA(t,A){t&1&&ve(0,"mat-progress-spinner",6)}function PiA(t,A){t&1&&(m(0,"div"),T(1,"Response is not available."),p())}function jiA(t,A){if(t&1&&(m(0,"div",3),ve(1,"ngx-json-viewer",4),p()),t&2){let e=M();y(),te("json",e.llmResponse)}}function ViA(t,A){if(t&1){let e=Ue();m(0,"div",12),ee("click",function(){q(e);let n=M();return W(n.openViewImageDialog(n.rawSvgString))}),p()}if(t&2){let e=M();te("innerHtml",e.renderedEventGraph,J0)}}var h9=class t{userId="";sessionId="";appName="";panelClosed=new Ve;renderedEventGraph;eventData;selectedRow=void 0;rawSvgString=null;llmRequest=void 0;llmResponse=void 0;llmRequestKey="gcp.vertex.agent.llm_request";llmResponseKey="gcp.vertex.agent.llm_response";dialog=E(na);traceService=E(q1);eventService=E(CE);graphService=E(IE);featureFlagService=E(Ks);sanitizer=E(dl);uiStateService=E(zl);isEventFilteringEnabled=_g(this.featureFlagService.isEventFilteringEnabled());constructor(){}ngOnInit(){this.traceService.selectedTraceRow$.subscribe(A=>{this.selectedRow=A;let e=this.getEventIdFromSpan();if(e){let i;this.isEventFilteringEnabled()&&this.selectedRow?.invoc_id&&this.selectedRow?.start_time&&(i={invocationId:this.selectedRow.invoc_id,timestamp:this.selectedRow.start_time/1e6});let n=ae({id:e},i);this.eventService.getEventTrace(n).pipe(Pt(()=>{this.uiStateService.setIsEventRequestResponseLoading(!0)})).subscribe(o=>{this.llmRequest=JSON.parse(o[this.llmRequestKey]),this.llmResponse=JSON.parse(o[this.llmResponseKey]),this.uiStateService.setIsEventRequestResponseLoading(!1)},()=>{this.uiStateService.setIsEventRequestResponseLoading(!1)}),this.getEventGraph(e)}}),this.traceService.eventData$.subscribe(A=>this.eventData=A)}openViewImageDialog(A){let e=this.dialog.open(W1,{maxWidth:"90vw",maxHeight:"90vh",data:{imageData:A}})}getEventDetails(){if(this.eventData&&this.selectedRow)return this.eventData.get(this.getEventIdFromSpan())}getEventIdFromSpan(){if(this.selectedRow)return this.selectedRow.attributes["gcp.vertex.agent.event_id"]}getEventGraph(A){this.eventService.getEvent(this.userId,this.appName,this.sessionId,A).subscribe(e=>Ci(this,null,function*(){if(!e.dotSrc){this.renderedEventGraph=void 0;return}let i=e.dotSrc,n=yield this.graphService.render(i);this.rawSvgString=n,this.renderedEventGraph=this.sanitizer.bypassSecurityTrustHtml(n)}))}closePanel(){this.panelClosed.emit(!0)}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-trace-event"]],inputs:{userId:"userId",sessionId:"sessionId",appName:"appName"},outputs:{panelClosed:"panelClosed"},decls:21,vars:8,consts:[[1,"wrapper"],["mat-stretch-tabs","false","mat-align-tabs","start"],["label","Event"],[1,"json-viewer-container"],[3,"json"],["label","Request"],["mode","indeterminate"],["label","Response"],["label","Graph"],[1,"event-graph-container"],[3,"innerHtml"],["mat-icon-button","",1,"tab-header-action",3,"click"],[3,"click","innerHtml"]],template:function(e,i){e&1&&(m(0,"div",0)(1,"mat-tab-group",1)(2,"mat-tab",2)(3,"div",3),ve(4,"ngx-json-viewer",4),p()(),m(5,"mat-tab",5),ne(6,JiA,1,0,"mat-progress-spinner",6),Ii(7,"async"),ne(8,YiA,2,0,"div")(9,HiA,2,1,"div",3),p(),m(10,"mat-tab",7),ne(11,ziA,1,0,"mat-progress-spinner",6),Ii(12,"async"),ne(13,PiA,2,0,"div")(14,jiA,2,1,"div",3),p(),m(15,"mat-tab",8)(16,"div",9),ne(17,ViA,1,1,"div",10),p()()(),m(18,"button",11),ee("click",function(){return i.closePanel()}),m(19,"mat-icon"),T(20,"close"),p()()()),e&2&&(y(4),te("json",i.getEventDetails()),y(2),$(Qi(7,4,i.uiStateService.isEventRequestResponseLoading())===!0?6:i.llmRequest?9:8),y(5),$(Qi(12,6,i.uiStateService.isEventRequestResponseLoading())===!0?11:i.llmResponse?14:13),y(6),$(i.renderedEventGraph?17:-1))},dependencies:[a9,g6,nd,j1,ya,ir,Z1,ts],styles:[".json-viewer-container[_ngcontent-%COMP%]{padding-top:8px;padding-left:12px;padding-right:12px;background-color:var(--trace-event-json-viewer-container-background-color)}.event-graph-container[_ngcontent-%COMP%]{text-align:center;padding-top:20px}.event-graph-container[_ngcontent-%COMP%] svg text{font-family:Google Sans Mono,monospace;font-size:11px}.wrapper[_ngcontent-%COMP%]{position:relative}.tab-header-action[_ngcontent-%COMP%]{position:absolute;top:0;right:0;height:48px;z-index:2;margin-right:10px}"]})};var Ud=new re("AgentBuilderService"),B9=class t{nodes=[];subAgentIdCounter=1;selectedToolSubject=new Mt(void 0);selectedNodeSubject=new Mt(void 0);selectedCallbackSubject=new Mt(void 0);loadedAgentDataSubject=new Mt(void 0);agentToolsMapSubject=new Mt(new Map);agentToolsSubject=new Mt(void 0);newAgentToolBoardSubject=new Mt(void 0);agentCallbacksMapSubject=new Mt(new Map);agentCallbacksSubject=new Mt(void 0);agentToolDeletionSubject=new Mt(void 0);deleteSubAgentSubject=new Mt("");addSubAgentSubject=new Mt({parentAgentName:""});tabChangeSubject=new Mt(void 0);agentToolBoardsSubject=new Mt(new Map);constructor(){}getNode(A){return this.nodes.find(i=>i.name===A)}getRootNode(){return this.nodes.find(e=>!!e.isRoot)}addNode(A){let e=this.nodes.findIndex(c=>c.name===A.name);e!==-1?this.nodes[e]=A:this.nodes.push(A);let i=/^sub_agent_(\d+)$/,n=A.name.match(i);if(n){let c=parseInt(n[1],10);c>=this.subAgentIdCounter&&(this.subAgentIdCounter=c+1)}let o=this.agentToolsMapSubject.value,r=new Map(o);r.set(A.name,A.tools||[]),this.agentToolsMapSubject.next(r);let s=this.agentCallbacksMapSubject.value,a=new Map(s);a.set(A.name,A.callbacks||[]),this.agentCallbacksMapSubject.next(a),this.setSelectedNode(this.selectedNodeSubject.value)}getNodes(){return this.nodes}clear(){this.nodes=[],this.subAgentIdCounter=1,this.setSelectedNode(void 0),this.setSelectedTool(void 0),this.agentToolsMapSubject.next(new Map),this.agentCallbacksMapSubject.next(new Map),this.setSelectedCallback(void 0),this.setAgentTools(),this.setAgentCallbacks()}getSelectedNode(){return this.selectedNodeSubject.asObservable()}setSelectedNode(A){this.selectedNodeSubject.next(A)}getSelectedTool(){return this.selectedToolSubject.asObservable()}setSelectedTool(A){this.selectedToolSubject.next(A)}getSelectedCallback(){return this.selectedCallbackSubject.asObservable()}setSelectedCallback(A){this.selectedCallbackSubject.next(A)}getNextSubAgentName(){return`sub_agent_${this.subAgentIdCounter++}`}addTool(A,e){let i=this.getNode(A);if(i){let n=i.tools||[];i.tools=[e,...n];let o=this.agentToolsMapSubject.value,r=new Map(o);r.set(A,i.tools),this.agentToolsMapSubject.next(r)}}deleteTool(A,e){let i=this.getNode(A);if(i&&i.tools){let n=i.tools.length;if(i.tools=i.tools.filter(o=>o.name!==e.name),i.tools.lengths.name===e.name))return{success:!1,error:`Callback with name '${e.name}' already exists`};i.callbacks.push(e),this.agentCallbacksSubject.next({agentName:A,callbacks:i.callbacks});let o=this.agentCallbacksMapSubject.value,r=new Map(o);return r.set(A,i.callbacks),this.agentCallbacksMapSubject.next(r),{success:!0}}catch(i){return{success:!1,error:"Failed to add callback: "+i.message}}}updateCallback(A,e,i){try{let n=this.getNode(A);if(!n)return{success:!1,error:"Agent not found"};if(!n.callbacks)return{success:!1,error:"No callbacks found for this agent"};let o=n.callbacks.findIndex(l=>l.name===e);if(o===-1)return{success:!1,error:"Callback not found"};if(n.callbacks.some((l,d)=>d!==o&&l.name===i.name))return{success:!1,error:`Callback with name '${i.name}' already exists`};let s=ae(ae({},n.callbacks[o]),i);n.callbacks[o]=s,this.agentCallbacksSubject.next({agentName:A,callbacks:n.callbacks});let a=this.agentCallbacksMapSubject.value,c=new Map(a);return c.set(A,n.callbacks),this.agentCallbacksMapSubject.next(c),this.selectedCallbackSubject.value?.name===e&&this.setSelectedCallback(s),{success:!0}}catch(n){return{success:!1,error:"Failed to update callback: "+n.message}}}deleteCallback(A,e){try{let i=this.getNode(A);if(!i)return{success:!1,error:"Agent not found"};if(!i.callbacks)return{success:!1,error:"No callbacks found for this agent"};let n=i.callbacks.findIndex(s=>s.name===e.name);if(n===-1)return{success:!1,error:"Callback not found"};i.callbacks.splice(n,1),this.agentCallbacksSubject.next({agentName:A,callbacks:i.callbacks});let o=this.agentCallbacksMapSubject.value,r=new Map(o);return r.set(A,i.callbacks),this.agentCallbacksMapSubject.next(r),this.selectedCallbackSubject.value?.name===e.name&&this.setSelectedCallback(void 0),{success:!0}}catch(i){return{success:!1,error:"Failed to delete callback: "+i.message}}}setLoadedAgentData(A){this.loadedAgentDataSubject.next(A)}getLoadedAgentData(){return this.loadedAgentDataSubject.asObservable()}getAgentToolsMap(){return this.agentToolsMapSubject.asObservable()}getAgentCallbacksMap(){return this.agentCallbacksMapSubject.asObservable()}requestSideTabChange(A){this.tabChangeSubject.next(A)}getSideTabChangeRequest(){return this.tabChangeSubject.asObservable()}requestNewTab(A,e){this.newAgentToolBoardSubject.next({toolName:A,currentAgentName:e})}getNewTabRequest(){return this.newAgentToolBoardSubject.asObservable().pipe(aA(e=>e?{tabName:e.toolName,currentAgentName:e.currentAgentName}:void 0))}requestTabDeletion(A){this.agentToolDeletionSubject.next(A)}getTabDeletionRequest(){return this.agentToolDeletionSubject.asObservable()}setAgentToolBoards(A){this.agentToolBoardsSubject.next(A)}getAgentToolBoards(){return this.agentToolBoardsSubject.asObservable()}getCurrentAgentToolBoards(){return this.agentToolBoardsSubject.value}getAgentTools(){return this.agentToolsSubject.asObservable()}getDeleteSubAgentSubject(){return this.deleteSubAgentSubject.asObservable()}setDeleteSubAgentSubject(A){this.deleteSubAgentSubject.next(A)}getAddSubAgentSubject(){return this.addSubAgentSubject.asObservable()}setAddSubAgentSubject(A,e,i){this.addSubAgentSubject.next({parentAgentName:A,agentClass:e,isFromEmptyGroup:i})}setAgentTools(A,e){if(A&&e){this.agentToolsSubject.next({agentName:A,tools:e});let i=this.agentToolsMapSubject.value,n=new Map(i);n.set(A,e),this.agentToolsMapSubject.next(n)}else this.agentToolsSubject.next(void 0)}getAgentCallbacks(){return this.agentCallbacksSubject.asObservable()}setAgentCallbacks(A,e){A&&e?this.agentCallbacksSubject.next({agentName:A,callbacks:e}):this.agentCallbacksSubject.next(void 0)}getParentNode(A,e,i,n){if(A){if(A.name===e.name)return i;for(let o of A.sub_agents){let r=this.getParentNode(o,e,A,n);if(r)return r}if(A.tools){for(let o of A.tools)if(o.toolType==="Agent Tool"){let r=n.get(o.toolAgentName||o.name);if(r){let s=this.getParentNode(r,e,A,n);if(s)return s}}}}}deleteNode(A){this.nodes=this.nodes.filter(e=>e.name!==A.name),this.setSelectedNode(this.selectedNodeSubject.value)}static \u0275fac=function(e){return new(e||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})};var E9=Symbol.for("yaml.alias"),f9=Symbol.for("yaml.document"),c0=Symbol.for("yaml.map"),bH=Symbol.for("yaml.pair"),xl=Symbol.for("yaml.scalar"),A1=Symbol.for("yaml.seq"),lc=Symbol.for("yaml.node.type"),dg=t=>!!t&&typeof t=="object"&&t[lc]===E9,l0=t=>!!t&&typeof t=="object"&&t[lc]===f9,g0=t=>!!t&&typeof t=="object"&&t[lc]===c0,bn=t=>!!t&&typeof t=="object"&&t[lc]===bH,qi=t=>!!t&&typeof t=="object"&&t[lc]===xl,d0=t=>!!t&&typeof t=="object"&&t[lc]===A1;function uo(t){if(t&&typeof t=="object")switch(t[lc]){case c0:case A1:return!0}return!1}function Ln(t){if(t&&typeof t=="object")switch(t[lc]){case E9:case c0:case xl:case A1:return!0}return!1}var Q9=t=>(qi(t)||uo(t))&&!!t.anchor;var Hc=Symbol("break visit"),lIe=Symbol("skip children"),Td=Symbol("remove node");function Od(t,A){let e=gIe(A);l0(t)?CQ(null,t.contents,e,Object.freeze([t]))===Td&&(t.contents=null):CQ(null,t,e,Object.freeze([]))}Od.BREAK=Hc;Od.SKIP=lIe;Od.REMOVE=Td;function CQ(t,A,e,i){let n=dIe(t,A,e,i);if(Ln(n)||bn(n))return CIe(t,i,n),CQ(t,n,e,i);if(typeof n!="symbol"){if(uo(A)){i=Object.freeze(i.concat(A));for(let o=0;ot.replace(/[!,[\]{}]/g,A=>qiA[A]),uQ=(()=>{class t{constructor(e,i){this.docStart=null,this.docEnd=!1,this.yaml=Object.assign({},t.defaultYaml,e),this.tags=Object.assign({},t.defaultTags,i)}clone(){let e=new t(this.yaml,this.tags);return e.docStart=this.docStart,e}atDocument(){let e=new t(this.yaml,this.tags);switch(this.yaml.version){case"1.1":this.atNextDocument=!0;break;case"1.2":this.atNextDocument=!1,this.yaml={explicit:t.defaultYaml.explicit,version:"1.2"},this.tags=Object.assign({},t.defaultTags);break}return e}add(e,i){this.atNextDocument&&(this.yaml={explicit:t.defaultYaml.explicit,version:"1.1"},this.tags=Object.assign({},t.defaultTags),this.atNextDocument=!1);let n=e.trim().split(/[ \t]+/),o=n.shift();switch(o){case"%TAG":{if(n.length!==2&&(i(0,"%TAG directive should contain exactly two parts"),n.length<2))return!1;let[r,s]=n;return this.tags[r]=s,!0}case"%YAML":{if(this.yaml.explicit=!0,n.length!==1)return i(0,"%YAML directive should contain exactly one part"),!1;let[r]=n;if(r==="1.1"||r==="1.2")return this.yaml.version=r,!0;{let s=/^\d+\.\d+$/.test(r);return i(6,`Unsupported YAML version ${r}`,s),!1}}default:return i(0,`Unknown directive ${o}`,!0),!1}}tagName(e,i){if(e==="!")return"!";if(e[0]!=="!")return i(`Not a valid tag: ${e}`),null;if(e[1]==="<"){let s=e.slice(2,-1);return s==="!"||s==="!!"?(i(`Verbatim tags aren't resolved, so ${e} is invalid.`),null):(e[e.length-1]!==">"&&i("Verbatim tags must end with a >"),s)}let[,n,o]=e.match(/^(.*!)([^!]*)$/s);o||i(`The ${e} tag has no suffix`);let r=this.tags[n];if(r)try{return r+decodeURIComponent(o)}catch(s){return i(String(s)),null}return n==="!"?e:(i(`Could not resolve tag: ${e}`),null)}tagString(e){for(let[i,n]of Object.entries(this.tags))if(e.startsWith(n))return i+WiA(e.substring(n.length));return e[0]==="!"?e:`!<${e}>`}toString(e){let i=this.yaml.explicit?[`%YAML ${this.yaml.version||"1.2"}`]:[],n=Object.entries(this.tags),o;if(e&&n.length>0&&Ln(e.contents)){let r={};Od(e.contents,(s,a)=>{Ln(a)&&a.tag&&(r[a.tag]=!0)}),o=Object.keys(r)}else o=[];for(let[r,s]of n)r==="!!"&&s==="tag:yaml.org,2002:"||(!e||o.some(a=>a.startsWith(s)))&&i.push(`%TAG ${r} ${s}`);return i.join(` +`)}}return t.defaultYaml={explicit:!1,version:"1.2"},t.defaultTags={"!!":"tag:yaml.org,2002:"},t})();function p9(t){if(/[\x00-\x19\s,[\]{}]/.test(t)){let e=`Anchor must not contain whitespace or control characters: ${JSON.stringify(t)}`;throw new Error(e)}return!0}function MH(t){let A=new Set;return Od(t,{Value(e,i){i.anchor&&A.add(i.anchor)}}),A}function SH(t,A){for(let e=1;;++e){let i=`${t}${e}`;if(!A.has(i))return i}}function IIe(t,A){let e=[],i=new Map,n=null;return{onAnchor:o=>{e.push(o),n??(n=MH(t));let r=SH(A,n);return n.add(r),r},setAnchors:()=>{for(let o of e){let r=i.get(o);if(typeof r=="object"&&r.anchor&&(qi(r.node)||uo(r.node)))r.node.anchor=r.anchor;else{let s=new Error("Failed to resolve repeated object (this should not happen)");throw s.source=o,s}}},sourceObjects:i}}function aI(t,A,e,i){if(i&&typeof i=="object")if(Array.isArray(i))for(let n=0,o=i.length;nks(i,String(n),e));if(t&&typeof t.toJSON=="function"){if(!e||!Q9(t))return t.toJSON(A,e);let i={aliasCount:0,count:1,res:void 0};e.anchors.set(t,i),e.onCreate=o=>{i.res=o,delete e.onCreate};let n=t.toJSON(A,e);return e.onCreate&&e.onCreate(n),n}return typeof t=="bigint"&&!e?.keep?Number(t):t}var cI=class{constructor(A){Object.defineProperty(this,lc,{value:A})}clone(){let A=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return this.range&&(A.range=this.range.slice()),A}toJS(A,{mapAsMap:e,maxAliasCount:i,onAnchor:n,reviver:o}={}){if(!l0(A))throw new TypeError("A document argument is required");let r={anchors:new Map,doc:A,keep:!0,mapAsMap:e===!0,mapKeyWarned:!1,maxAliasCount:typeof i=="number"?i:100},s=ks(this,"",r);if(typeof n=="function")for(let{count:a,res:c}of r.anchors.values())n(c,a);return typeof o=="function"?aI(o,{"":s},"",s):s}};var t1=class extends cI{constructor(A){super(E9),this.source=A,Object.defineProperty(this,"tag",{set(){throw new Error("Alias nodes cannot have tags")}})}resolve(A,e){let i;e?.aliasResolveCache?i=e.aliasResolveCache:(i=[],Od(A,{Node:(o,r)=>{(dg(r)||Q9(r))&&i.push(r)}}),e&&(e.aliasResolveCache=i));let n;for(let o of i){if(o===this)break;o.anchor===this.source&&(n=o)}return n}toJSON(A,e){if(!e)return{source:this.source};let{anchors:i,doc:n,maxAliasCount:o}=e,r=this.resolve(n,e);if(!r){let a=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new ReferenceError(a)}let s=i.get(r);if(s||(ks(r,null,e),s=i.get(r)),!s||s.res===void 0){let a="This should not happen: Alias anchor was not resolved?";throw new ReferenceError(a)}if(o>=0&&(s.count+=1,s.aliasCount===0&&(s.aliasCount=w9(n,r,i)),s.count*s.aliasCount>o)){let a="Excessive alias count indicates a resource exhaustion attack";throw new ReferenceError(a)}return s.res}toString(A,e,i){let n=`*${this.source}`;if(A){if(p9(this.source),A.options.verifyAliasOrder&&!A.anchors.has(this.source)){let o=`Unresolved alias (the anchor must be set before the alias): ${this.source}`;throw new Error(o)}if(A.implicitKey)return`${n} `}return n}};function w9(t,A,e){if(dg(A)){let i=A.resolve(t),n=e&&i&&e.get(i);return n?n.count*n.aliasCount:0}else if(uo(A)){let i=0;for(let n of A.items){let o=w9(t,n,e);o>i&&(i=o)}return i}else if(bn(A)){let i=w9(t,A.key,e),n=w9(t,A.value,e);return Math.max(i,n)}return 1}var y9=t=>!t||typeof t!="function"&&typeof t!="object",qt=(()=>{class t extends cI{constructor(e){super(xl),this.value=e}toJSON(e,i){return i?.keep?this.value:ks(this.value,e,i)}toString(){return String(this.value)}}return t.BLOCK_FOLDED="BLOCK_FOLDED",t.BLOCK_LITERAL="BLOCK_LITERAL",t.PLAIN="PLAIN",t.QUOTE_DOUBLE="QUOTE_DOUBLE",t.QUOTE_SINGLE="QUOTE_SINGLE",t})();var ZiA="tag:yaml.org,2002:";function XiA(t,A,e){if(A){let i=e.filter(o=>o.tag===A),n=i.find(o=>!o.format)??i[0];if(!n)throw new Error(`Tag ${A} not found`);return n}return e.find(i=>i.identify?.(t)&&!i.format)}function i1(t,A,e){if(l0(t)&&(t=t.contents),Ln(t))return t;if(bn(t)){let d=e.schema[c0].createNode?.(e.schema,null,e);return d.items.push(t),d}(t instanceof String||t instanceof Number||t instanceof Boolean||typeof BigInt<"u"&&t instanceof BigInt)&&(t=t.valueOf());let{aliasDuplicateObjects:i,onAnchor:n,onTagObj:o,schema:r,sourceObjects:s}=e,a;if(i&&t&&typeof t=="object"){if(a=s.get(t),a)return a.anchor??(a.anchor=n(t)),new t1(a.anchor);a={anchor:null,node:null},s.set(t,a)}A?.startsWith("!!")&&(A=ZiA+A.slice(2));let c=XiA(t,A,r.tags);if(!c){if(t&&typeof t.toJSON=="function"&&(t=t.toJSON()),!t||typeof t!="object"){let d=new qt(t);return a&&(a.node=d),d}c=t instanceof Map?r[c0]:Symbol.iterator in Object(t)?r[A1]:r[c0]}o&&(o(c),delete e.onTagObj);let l=c?.createNode?c.createNode(e.schema,t,e):typeof c?.nodeClass?.from=="function"?c.nodeClass.from(e.schema,t,e):new qt(t);return A?l.tag=A:c.default||(l.tag=c.tag),a&&(a.node=l),l}function C6(t,A,e){let i=e;for(let n=A.length-1;n>=0;--n){let o=A[n];if(typeof o=="number"&&Number.isInteger(o)&&o>=0){let r=[];r[o]=i,i=r}else i=new Map([[o,i]])}return i1(i,void 0,{aliasDuplicateObjects:!1,keepUndefined:!1,onAnchor:()=>{throw new Error("This should not happen, please report a bug.")},schema:t,sourceObjects:new Map})}var BQ=t=>t==null||typeof t=="object"&&!!t[Symbol.iterator]().next().done,hQ=class extends cI{constructor(A,e){super(A),Object.defineProperty(this,"schema",{value:e,configurable:!0,enumerable:!1,writable:!0})}clone(A){let e=Object.create(Object.getPrototypeOf(this),Object.getOwnPropertyDescriptors(this));return A&&(e.schema=A),e.items=e.items.map(i=>Ln(i)||bn(i)?i.clone(A):i),this.range&&(e.range=this.range.slice()),e}addIn(A,e){if(BQ(A))this.add(e);else{let[i,...n]=A,o=this.get(i,!0);if(uo(o))o.addIn(n,e);else if(o===void 0&&this.schema)this.set(i,C6(this.schema,n,e));else throw new Error(`Expected YAML collection at ${i}. Remaining path: ${n}`)}}deleteIn(A){let[e,...i]=A;if(i.length===0)return this.delete(e);let n=this.get(e,!0);if(uo(n))return n.deleteIn(i);throw new Error(`Expected YAML collection at ${e}. Remaining path: ${i}`)}getIn(A,e){let[i,...n]=A,o=this.get(i,!0);return n.length===0?!e&&qi(o)?o.value:o:uo(o)?o.getIn(n,e):void 0}hasAllNullValues(A){return this.items.every(e=>{if(!bn(e))return!1;let i=e.value;return i==null||A&&qi(i)&&i.value==null&&!i.commentBefore&&!i.comment&&!i.tag})}hasIn(A){let[e,...i]=A;if(i.length===0)return this.has(e);let n=this.get(e,!0);return uo(n)?n.hasIn(i):!1}setIn(A,e){let[i,...n]=A;if(n.length===0)this.set(i,e);else{let o=this.get(i,!0);if(uo(o))o.setIn(n,e);else if(o===void 0&&this.schema)this.set(i,C6(this.schema,n,e));else throw new Error(`Expected YAML collection at ${i}. Remaining path: ${n}`)}}};var uIe=t=>t.replace(/^(?!$)(?: $)?/gm,"#");function Cg(t,A){return/^\n+$/.test(t)?t.substring(1):A?t.replace(/^(?! *$)/gm,A):t}var Jd=(t,A,e)=>t.endsWith(` +`)?Cg(e,A):e.includes(` +`)?` +`+Cg(e,A):(t.endsWith(" ")?"":" ")+e;var kH="flow",D9="block",I6="quoted";function u6(t,A,e="flow",{indentAtStart:i,lineWidth:n=80,minContentWidth:o=20,onFold:r,onOverflow:s}={}){if(!n||n<0)return t;nn-Math.max(2,o)?c.push(0):d=n-i);let C,I,u=!1,h=-1,B=-1,f=-1;e===D9&&(h=hIe(t,h,A.length),h!==-1&&(d=h+a));for(let k;k=t[h+=1];){if(e===I6&&k==="\\"){switch(B=h,t[h+1]){case"x":h+=3;break;case"u":h+=5;break;case"U":h+=9;break;default:h+=1}f=h}if(k===` +`)e===D9&&(h=hIe(t,h,A.length)),d=h+A.length+a,C=void 0;else{if(k===" "&&I&&I!==" "&&I!==` +`&&I!==" "){let S=t[h+1];S&&S!==" "&&S!==` +`&&S!==" "&&(C=h)}if(h>=d)if(C)c.push(C),d=C+a,C=void 0;else if(e===I6){for(;I===" "||I===" ";)I=k,k=t[h+=1],u=!0;let S=h>f+1?h-2:B-1;if(l[S])return t;c.push(S),l[S]=!0,d=S+a,C=void 0}else u=!0}I=k}if(u&&s&&s(),c.length===0)return t;r&&r();let b=t.slice(0,c[0]);for(let k=0;k({indentAtStart:A?t.indent.length:t.indentAtStart,lineWidth:t.options.lineWidth,minContentWidth:t.options.minContentWidth}),M9=t=>/^(%|---|\.\.\.)/m.test(t);function $iA(t,A,e){if(!A||A<0)return!1;let i=A-e,n=t.length;if(n<=i)return!1;for(let o=0,r=0;oi)return!0;if(r=o+1,n-r<=i)return!1}return!0}function h6(t,A){let e=JSON.stringify(t);if(A.options.doubleQuotedAsJSON)return e;let{implicitKey:i}=A,n=A.options.doubleQuotedMinMultiLineLength,o=A.indent||(M9(t)?" ":""),r="",s=0;for(let a=0,c=e[a];c;c=e[++a])if(c===" "&&e[a+1]==="\\"&&e[a+2]==="n"&&(r+=e.slice(s,a)+"\\ ",a+=1,s=a,c="\\"),c==="\\")switch(e[a+1]){case"u":{r+=e.slice(s,a);let l=e.substr(a+2,4);switch(l){case"0000":r+="\\0";break;case"0007":r+="\\a";break;case"000b":r+="\\v";break;case"001b":r+="\\e";break;case"0085":r+="\\N";break;case"00a0":r+="\\_";break;case"2028":r+="\\L";break;case"2029":r+="\\P";break;default:l.substr(0,2)==="00"?r+="\\x"+l.substr(2):r+=e.substr(a,6)}a+=5,s=a+1}break;case"n":if(i||e[a+2]==='"'||e.length +`;let d,C;for(C=e.length;C>0;--C){let w=e[C-1];if(w!==` +`&&w!==" "&&w!==" ")break}let I=e.substring(C),u=I.indexOf(` +`);u===-1?d="-":e===I||u!==I.length-1?(d="+",o&&o()):d="",I&&(e=e.slice(0,-I.length),I[I.length-1]===` +`&&(I=I.slice(0,-1)),I=I.replace(_H,`$&${c}`));let h=!1,B,f=-1;for(B=0;B{_=!0});let J=u6(`${b}${w}${I}`,c,D9,K);if(!_)return`>${S} +${c}${J}`}return e=e.replace(/\n+/g,`$&${c}`),`|${S} +${c}${b}${e}${I}`}function enA(t,A,e,i){let{type:n,value:o}=t,{actualString:r,implicitKey:s,indent:a,indentStep:c,inFlow:l}=A;if(s&&o.includes(` +`)||l&&/[[\]{},]/.test(o))return EQ(o,A);if(/^[\n\t ,[\]{}#&*!|>'"%@`]|^[?-]$|^[?-][ \t]|[\n:][ \t]|[ \t]\n|[\n\t ]#|[\n\t :]$/.test(o))return s||l||!o.includes(` +`)?EQ(o,A):v9(t,A,e,i);if(!s&&!l&&n!==qt.PLAIN&&o.includes(` +`))return v9(t,A,e,i);if(M9(o)){if(a==="")return A.forceBlockIndent=!0,v9(t,A,e,i);if(s&&a===c)return EQ(o,A)}let d=o.replace(/\n+/g,`$& +${a}`);if(r){let C=h=>h.default&&h.tag!=="tag:yaml.org,2002:str"&&h.test?.test(d),{compat:I,tags:u}=A.doc.schema;if(u.some(C)||I?.some(C))return EQ(o,A)}return s?d:u6(d,a,kH,b9(A,!1))}function hh(t,A,e,i){let{implicitKey:n,inFlow:o}=A,r=typeof t.value=="string"?t:Object.assign({},t,{value:String(t.value)}),{type:s}=t;s!==qt.QUOTE_DOUBLE&&/[\x00-\x08\x0b-\x1f\x7f-\x9f\u{D800}-\u{DFFF}]/u.test(r.value)&&(s=qt.QUOTE_DOUBLE);let a=l=>{switch(l){case qt.BLOCK_FOLDED:case qt.BLOCK_LITERAL:return n||o?EQ(r.value,A):v9(r,A,e,i);case qt.QUOTE_DOUBLE:return h6(r.value,A);case qt.QUOTE_SINGLE:return xH(r.value,A);case qt.PLAIN:return enA(r,A,e,i);default:return null}},c=a(s);if(c===null){let{defaultKeyType:l,defaultStringType:d}=A.options,C=n&&l||d;if(c=a(C),c===null)throw new Error(`Unsupported default string type ${C}`)}return c}function S9(t,A){let e=Object.assign({blockQuote:!0,commentString:uIe,defaultKeyType:null,defaultStringType:"PLAIN",directives:null,doubleQuotedAsJSON:!1,doubleQuotedMinMultiLineLength:40,falseStr:"false",flowCollectionPadding:!0,indentSeq:!0,lineWidth:80,minContentWidth:20,nullStr:"null",simpleKeys:!1,singleQuote:null,trueStr:"true",verifyAliasOrder:!0},t.schema.toStringOptions,A),i;switch(e.collectionStyle){case"block":i=!1;break;case"flow":i=!0;break;default:i=null}return{anchors:new Set,doc:t,flowCollectionPadding:e.flowCollectionPadding?" ":"",indent:"",indentStep:typeof e.indent=="number"?" ".repeat(e.indent):" ",inFlow:i,options:e}}function AnA(t,A){if(A.tag){let n=t.filter(o=>o.tag===A.tag);if(n.length>0)return n.find(o=>o.format===A.format)??n[0]}let e,i;if(qi(A)){i=A.value;let n=t.filter(o=>o.identify?.(i));if(n.length>1){let o=n.filter(r=>r.test);o.length>0&&(n=o)}e=n.find(o=>o.format===A.format)??n.find(o=>!o.format)}else i=A,e=t.find(n=>n.nodeClass&&i instanceof n.nodeClass);if(!e){let n=i?.constructor?.name??(i===null?"null":typeof i);throw new Error(`Tag not resolved for ${n} value`)}return e}function tnA(t,A,{anchors:e,doc:i}){if(!i.directives)return"";let n=[],o=(qi(t)||uo(t))&&t.anchor;o&&p9(o)&&(e.add(o),n.push(`&${o}`));let r=t.tag??(A.default?null:A.tag);return r&&n.push(i.directives.tagString(r)),n.join(" ")}function n1(t,A,e,i){if(bn(t))return t.toString(A,e,i);if(dg(t)){if(A.doc.directives)return t.toString(A);if(A.resolvedAliases?.has(t))throw new TypeError("Cannot stringify circular structure without alias nodes");A.resolvedAliases?A.resolvedAliases.add(t):A.resolvedAliases=new Set([t]),t=t.resolve(A.doc)}let n,o=Ln(t)?t:A.doc.createNode(t,{onTagObj:a=>n=a});n??(n=AnA(A.doc.schema.tags,o));let r=tnA(o,n,A);r.length>0&&(A.indentAtStart=(A.indentAtStart??0)+r.length+1);let s=typeof n.stringify=="function"?n.stringify(o,A,e,i):qi(o)?hh(o,A,e,i):o.toString(A,e,i);return r?qi(o)||s[0]==="{"||s[0]==="["?`${r} ${s}`:`${r} +${A.indent}${s}`:s}function BIe({key:t,value:A},e,i,n){let{allNullValues:o,doc:r,indent:s,indentStep:a,options:{commentString:c,indentSeq:l,simpleKeys:d}}=e,C=Ln(t)&&t.comment||null;if(d){if(C)throw new Error("With simple keys, key nodes cannot have comments");if(uo(t)||!Ln(t)&&typeof t=="object"){let K="With simple keys, collection cannot be used as a key value";throw new Error(K)}}let I=!d&&(!t||C&&A==null&&!e.inFlow||uo(t)||(qi(t)?t.type===qt.BLOCK_FOLDED||t.type===qt.BLOCK_LITERAL:typeof t=="object"));e=Object.assign({},e,{allNullValues:!1,implicitKey:!I&&(d||!o),indent:s+a});let u=!1,h=!1,B=n1(t,e,()=>u=!0,()=>h=!0);if(!I&&!e.inFlow&&B.length>1024){if(d)throw new Error("With simple keys, single line scalar must not span more than 1024 characters");I=!0}if(e.inFlow){if(o||A==null)return u&&i&&i(),B===""?"?":I?`? ${B}`:B}else if(o&&!d||A==null&&I)return B=`? ${B}`,C&&!u?B+=Jd(B,e.indent,c(C)):h&&n&&n(),B;u&&(C=null),I?(C&&(B+=Jd(B,e.indent,c(C))),B=`? ${B} +${s}:`):(B=`${B}:`,C&&(B+=Jd(B,e.indent,c(C))));let f,b,k;Ln(A)?(f=!!A.spaceBefore,b=A.commentBefore,k=A.comment):(f=!1,b=null,k=null,A&&typeof A=="object"&&(A=r.createNode(A))),e.implicitKey=!1,!I&&!C&&qi(A)&&(e.indentAtStart=B.length+1),h=!1,!l&&a.length>=2&&!e.inFlow&&!I&&d0(A)&&!A.flow&&!A.tag&&!A.anchor&&(e.indent=e.indent.substring(2));let S=!1,w=n1(A,e,()=>S=!0,()=>h=!0),_=" ";if(C||f||b){if(_=f?` +`:"",b){let K=c(b);_+=` +${Cg(K,e.indent)}`}w===""&&!e.inFlow?_===` +`&&(_=` + +`):_+=` +${e.indent}`}else if(!I&&uo(A)){let K=w[0],J=w.indexOf(` +`),O=J!==-1,H=e.inFlow??A.flow??A.items.length===0;if(O||!H){let V=!1;if(O&&(K==="&"||K==="!")){let Z=w.indexOf(" ");K==="&"&&Z!==-1&&Zt===x9||typeof t=="symbol"&&t.description===x9,default:"key",tag:"tag:yaml.org,2002:merge",test:/^<<$/,resolve:()=>Object.assign(new qt(Symbol(x9)),{addToJSMap:NH}),stringify:()=>x9},EIe=(t,A)=>(C0.identify(A)||qi(A)&&(!A.type||A.type===qt.PLAIN)&&C0.identify(A.value))&&t?.doc.schema.tags.some(e=>e.tag===C0.tag&&e.default);function NH(t,A,e){if(e=t&&dg(e)?e.resolve(t.doc):e,d0(e))for(let i of e.items)RH(t,A,i);else if(Array.isArray(e))for(let i of e)RH(t,A,i);else RH(t,A,e)}function RH(t,A,e){let i=t&&dg(e)?e.resolve(t.doc):e;if(!g0(i))throw new Error("Merge sources must be maps or map aliases");let n=i.toJSON(null,t,Map);for(let[o,r]of n)A instanceof Map?A.has(o)||A.set(o,r):A instanceof Set?A.add(o):Object.prototype.hasOwnProperty.call(A,o)||Object.defineProperty(A,o,{value:r,writable:!0,enumerable:!0,configurable:!0});return A}function _9(t,A,{key:e,value:i}){if(Ln(e)&&e.addToJSMap)e.addToJSMap(t,A,i);else if(EIe(t,e))NH(t,A,i);else{let n=ks(e,"",t);if(A instanceof Map)A.set(n,ks(i,n,t));else if(A instanceof Set)A.add(n);else{let o=inA(e,n,t),r=ks(i,o,t);o in A?Object.defineProperty(A,o,{value:r,writable:!0,enumerable:!0,configurable:!0}):A[o]=r}}return A}function inA(t,A,e){if(A===null)return"";if(typeof A!="object")return String(A);if(Ln(t)&&e?.doc){let i=S9(e.doc,{});i.anchors=new Set;for(let o of e.anchors.keys())i.anchors.add(o.anchor);i.inFlow=!0,i.inStringifyKey=!0;let n=t.toString(i);if(!e.mapKeyWarned){let o=JSON.stringify(n);o.length>40&&(o=o.substring(0,36)+'..."'),k9(e.doc.options.logLevel,`Keys with collection values will be stringified due to JS Object restrictions: ${o}. Set mapAsMap: true to use object keys.`),e.mapKeyWarned=!0}return n}return JSON.stringify(A)}function fQ(t,A,e){let i=i1(t,void 0,e),n=i1(A,void 0,e);return new qr(i,n)}var qr=class t{constructor(A,e=null){Object.defineProperty(this,lc,{value:bH}),this.key=A,this.value=e}clone(A){let{key:e,value:i}=this;return Ln(e)&&(e=e.clone(A)),Ln(i)&&(i=i.clone(A)),new t(e,i)}toJSON(A,e){let i=e?.mapAsMap?new Map:{};return _9(e,i,this)}toString(A,e,i){return A?.doc?BIe(this,A,e,i):JSON.stringify(this)}};function N9(t,A,e){return(A.inFlow??t.flow?onA:nnA)(t,A,e)}function nnA({comment:t,items:A},e,{blockItemPrefix:i,flowChars:n,itemIndent:o,onChompKeep:r,onComment:s}){let{indent:a,options:{commentString:c}}=e,l=Object.assign({},e,{indent:o,type:null}),d=!1,C=[];for(let u=0;uB=null,()=>d=!0);B&&(f+=Jd(f,o,c(B))),d&&B&&(d=!1),C.push(i+f)}let I;if(C.length===0)I=n.start+n.end;else{I=C[0];for(let u=1;uB=null);ul||f.includes(` +`))&&(c=!0),d.push(f),l=d.length}let{start:C,end:I}=e;if(d.length===0)return C+I;if(!c){let u=d.reduce((h,B)=>h+B.length+2,2);c=A.options.lineWidth>0&&u>A.options.lineWidth}if(c){let u=C;for(let h of d)u+=h?` +${o}${n}${h}`:` +`;return`${u} +${n}${I}`}else return`${C}${r}${d.join(" ")}${r}${I}`}function R9({indent:t,options:{commentString:A}},e,i,n){if(i&&n&&(i=i.replace(/^\n+/,"")),i){let o=Cg(A(i),t);e.push(o.trimStart())}}function lI(t,A){let e=qi(A)?A.value:A;for(let i of t)if(bn(i)&&(i.key===A||i.key===e||qi(i.key)&&i.key.value===e))return i}var ls=class extends hQ{static get tagName(){return"tag:yaml.org,2002:map"}constructor(A){super(c0,A),this.items=[]}static from(A,e,i){let{keepUndefined:n,replacer:o}=i,r=new this(A),s=(a,c)=>{if(typeof o=="function")c=o.call(e,a,c);else if(Array.isArray(o)&&!o.includes(a))return;(c!==void 0||n)&&r.items.push(fQ(a,c,i))};if(e instanceof Map)for(let[a,c]of e)s(a,c);else if(e&&typeof e=="object")for(let a of Object.keys(e))s(a,e[a]);return typeof A.sortMapEntries=="function"&&r.items.sort(A.sortMapEntries),r}add(A,e){let i;bn(A)?i=A:!A||typeof A!="object"||!("key"in A)?i=new qr(A,A?.value):i=new qr(A.key,A.value);let n=lI(this.items,i.key),o=this.schema?.sortMapEntries;if(n){if(!e)throw new Error(`Key ${i.key} already set`);qi(n.value)&&y9(i.value)?n.value.value=i.value:n.value=i.value}else if(o){let r=this.items.findIndex(s=>o(i,s)<0);r===-1?this.items.push(i):this.items.splice(r,0,i)}else this.items.push(i)}delete(A){let e=lI(this.items,A);return e?this.items.splice(this.items.indexOf(e),1).length>0:!1}get(A,e){let n=lI(this.items,A)?.value;return(!e&&qi(n)?n.value:n)??void 0}has(A){return!!lI(this.items,A)}set(A,e){this.add(new qr(A,e),!0)}toJSON(A,e,i){let n=i?new i:e?.mapAsMap?new Map:{};e?.onCreate&&e.onCreate(n);for(let o of this.items)_9(e,n,o);return n}toString(A,e,i){if(!A)return JSON.stringify(this);for(let n of this.items)if(!bn(n))throw new Error(`Map items must all be pairs; found ${JSON.stringify(n)} instead`);return!A.allNullValues&&this.hasAllNullValues(!1)&&(A=Object.assign({},A,{allNullValues:!0})),N9(this,A,{blockItemPrefix:"",flowChars:{start:"{",end:"}"},itemIndent:A.indent||"",onChompKeep:i,onComment:e})}};var I0={collection:"map",default:!0,nodeClass:ls,tag:"tag:yaml.org,2002:map",resolve(t,A){return g0(t)||A("Expected a mapping for this tag"),t},createNode:(t,A,e)=>ls.from(t,A,e)};var Ta=class extends hQ{static get tagName(){return"tag:yaml.org,2002:seq"}constructor(A){super(A1,A),this.items=[]}add(A){this.items.push(A)}delete(A){let e=L9(A);return typeof e!="number"?!1:this.items.splice(e,1).length>0}get(A,e){let i=L9(A);if(typeof i!="number")return;let n=this.items[i];return!e&&qi(n)?n.value:n}has(A){let e=L9(A);return typeof e=="number"&&e=0?A:null}var u0={collection:"seq",default:!0,nodeClass:Ta,tag:"tag:yaml.org,2002:seq",resolve(t,A){return d0(t)||A("Expected a sequence for this tag"),t},createNode:(t,A,e)=>Ta.from(t,A,e)};var gI={identify:t=>typeof t=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:t=>t,stringify(t,A,e,i){return A=Object.assign({actualString:!0},A),hh(t,A,e,i)}};var Bh={identify:t=>t==null,createNode:()=>new qt(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^(?:~|[Nn]ull|NULL)?$/,resolve:()=>new qt(null),stringify:({source:t},A)=>typeof t=="string"&&Bh.test.test(t)?t:A.options.nullStr};var B6={identify:t=>typeof t=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:[Tt]rue|TRUE|[Ff]alse|FALSE)$/,resolve:t=>new qt(t[0]==="t"||t[0]==="T"),stringify({source:t,value:A},e){if(t&&B6.test.test(t)){let i=t[0]==="t"||t[0]==="T";if(A===i)return t}return A?e.options.trueStr:e.options.falseStr}};function Oa({format:t,minFractionDigits:A,tag:e,value:i}){if(typeof i=="bigint")return String(i);let n=typeof i=="number"?i:Number(i);if(!isFinite(n))return isNaN(n)?".nan":n<0?"-.inf":".inf";let o=JSON.stringify(i);if(!t&&A&&(!e||e==="tag:yaml.org,2002:float")&&/^\d/.test(o)){let r=o.indexOf(".");r<0&&(r=o.length,o+=".");let s=A-(o.length-r-1);for(;s-- >0;)o+="0"}return o}var F9={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:t=>t.slice(-3).toLowerCase()==="nan"?NaN:t[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:Oa},G9={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)[eE][-+]?[0-9]+$/,resolve:t=>parseFloat(t),stringify(t){let A=Number(t.value);return isFinite(A)?A.toExponential():Oa(t)}},K9={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:\.[0-9]+|[0-9]+\.[0-9]*)$/,resolve(t){let A=new qt(parseFloat(t)),e=t.indexOf(".");return e!==-1&&t[t.length-1]==="0"&&(A.minFractionDigits=t.length-e-1),A},stringify:Oa};var U9=t=>typeof t=="bigint"||Number.isInteger(t),LH=(t,A,e,{intAsBigInt:i})=>i?BigInt(t):parseInt(t.substring(A),e);function fIe(t,A,e){let{value:i}=t;return U9(i)&&i>=0?e+i.toString(A):Oa(t)}var T9={identify:t=>U9(t)&&t>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^0o[0-7]+$/,resolve:(t,A,e)=>LH(t,2,8,e),stringify:t=>fIe(t,8,"0o")},O9={identify:U9,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9]+$/,resolve:(t,A,e)=>LH(t,0,10,e),stringify:Oa},J9={identify:t=>U9(t)&&t>=0,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^0x[0-9a-fA-F]+$/,resolve:(t,A,e)=>LH(t,2,16,e),stringify:t=>fIe(t,16,"0x")};var QIe=[I0,u0,gI,Bh,B6,T9,O9,J9,F9,G9,K9];function mIe(t){return typeof t=="bigint"||Number.isInteger(t)}var Y9=({value:t})=>JSON.stringify(t),rnA=[{identify:t=>typeof t=="string",default:!0,tag:"tag:yaml.org,2002:str",resolve:t=>t,stringify:Y9},{identify:t=>t==null,createNode:()=>new qt(null),default:!0,tag:"tag:yaml.org,2002:null",test:/^null$/,resolve:()=>null,stringify:Y9},{identify:t=>typeof t=="boolean",default:!0,tag:"tag:yaml.org,2002:bool",test:/^true$|^false$/,resolve:t=>t==="true",stringify:Y9},{identify:mIe,default:!0,tag:"tag:yaml.org,2002:int",test:/^-?(?:0|[1-9][0-9]*)$/,resolve:(t,A,{intAsBigInt:e})=>e?BigInt(t):parseInt(t,10),stringify:({value:t})=>mIe(t)?t.toString():JSON.stringify(t)},{identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$/,resolve:t=>parseFloat(t),stringify:Y9}],snA={default:!0,tag:"",test:/^/,resolve(t,A){return A(`Unresolved plain scalar ${JSON.stringify(t)}`),t}},pIe=[I0,u0].concat(rnA,snA);var E6={identify:t=>t instanceof Uint8Array,default:!1,tag:"tag:yaml.org,2002:binary",resolve(t,A){if(typeof atob=="function"){let e=atob(t.replace(/[\n\r]/g,"")),i=new Uint8Array(e.length);for(let n=0;n1&&A("Each pair must have its own sequence indicator");let n=i.items[0]||new qr(new qt(null));if(i.commentBefore&&(n.key.commentBefore=n.key.commentBefore?`${i.commentBefore} +${n.key.commentBefore}`:i.commentBefore),i.comment){let o=n.value??n.key;o.comment=o.comment?`${i.comment} +${o.comment}`:i.comment}i=n}t.items[e]=bn(i)?i:new qr(i)}}else A("Expected a sequence for this tag");return t}function GH(t,A,e){let{replacer:i}=e,n=new Ta(t);n.tag="tag:yaml.org,2002:pairs";let o=0;if(A&&Symbol.iterator in Object(A))for(let r of A){typeof i=="function"&&(r=i.call(A,String(o++),r));let s,a;if(Array.isArray(r))if(r.length===2)s=r[0],a=r[1];else throw new TypeError(`Expected [key, value] tuple: ${r}`);else if(r&&r instanceof Object){let c=Object.keys(r);if(c.length===1)s=c[0],a=r[s];else throw new TypeError(`Expected tuple with one key, not ${c.length} keys`)}else s=r;n.items.push(fQ(s,a,e))}return n}var f6={collection:"seq",default:!1,tag:"tag:yaml.org,2002:pairs",resolve:FH,createNode:GH};var KH=(()=>{class t extends Ta{constructor(){super(),this.add=ls.prototype.add.bind(this),this.delete=ls.prototype.delete.bind(this),this.get=ls.prototype.get.bind(this),this.has=ls.prototype.has.bind(this),this.set=ls.prototype.set.bind(this),this.tag=t.tag}toJSON(e,i){if(!i)return super.toJSON(e);let n=new Map;i?.onCreate&&i.onCreate(n);for(let o of this.items){let r,s;if(bn(o)?(r=ks(o.key,"",i),s=ks(o.value,r,i)):r=ks(o,"",i),n.has(r))throw new Error("Ordered maps must not include duplicate keys");n.set(r,s)}return n}static from(e,i,n){let o=GH(e,i,n),r=new this;return r.items=o.items,r}}return t.tag="tag:yaml.org,2002:omap",t})(),Q6={collection:"seq",identify:t=>t instanceof Map,nodeClass:KH,default:!1,tag:"tag:yaml.org,2002:omap",resolve(t,A){let e=FH(t,A),i=[];for(let{key:n}of e.items)qi(n)&&(i.includes(n.value)?A(`Ordered maps must not include duplicate keys: ${n.value}`):i.push(n.value));return Object.assign(new KH,e)},createNode:(t,A,e)=>KH.from(t,A,e)};function wIe({value:t,source:A},e){return A&&(t?UH:TH).test.test(A)?A:t?e.options.trueStr:e.options.falseStr}var UH={identify:t=>t===!0,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:Y|y|[Yy]es|YES|[Tt]rue|TRUE|[Oo]n|ON)$/,resolve:()=>new qt(!0),stringify:wIe},TH={identify:t=>t===!1,default:!0,tag:"tag:yaml.org,2002:bool",test:/^(?:N|n|[Nn]o|NO|[Ff]alse|FALSE|[Oo]ff|OFF)$/,resolve:()=>new qt(!1),stringify:wIe};var yIe={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^(?:[-+]?\.(?:inf|Inf|INF)|\.nan|\.NaN|\.NAN)$/,resolve:t=>t.slice(-3).toLowerCase()==="nan"?NaN:t[0]==="-"?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,stringify:Oa},DIe={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"EXP",test:/^[-+]?(?:[0-9][0-9_]*)?(?:\.[0-9_]*)?[eE][-+]?[0-9]+$/,resolve:t=>parseFloat(t.replace(/_/g,"")),stringify(t){let A=Number(t.value);return isFinite(A)?A.toExponential():Oa(t)}},vIe={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",test:/^[-+]?(?:[0-9][0-9_]*)?\.[0-9_]*$/,resolve(t){let A=new qt(parseFloat(t.replace(/_/g,""))),e=t.indexOf(".");if(e!==-1){let i=t.substring(e+1).replace(/_/g,"");i[i.length-1]==="0"&&(A.minFractionDigits=i.length)}return A},stringify:Oa};var m6=t=>typeof t=="bigint"||Number.isInteger(t);function H9(t,A,e,{intAsBigInt:i}){let n=t[0];if((n==="-"||n==="+")&&(A+=1),t=t.substring(A).replace(/_/g,""),i){switch(e){case 2:t=`0b${t}`;break;case 8:t=`0o${t}`;break;case 16:t=`0x${t}`;break}let r=BigInt(t);return n==="-"?BigInt(-1)*r:r}let o=parseInt(t,e);return n==="-"?-1*o:o}function OH(t,A,e){let{value:i}=t;if(m6(i)){let n=i.toString(A);return i<0?"-"+e+n.substr(1):e+n}return Oa(t)}var bIe={identify:m6,default:!0,tag:"tag:yaml.org,2002:int",format:"BIN",test:/^[-+]?0b[0-1_]+$/,resolve:(t,A,e)=>H9(t,2,2,e),stringify:t=>OH(t,2,"0b")},MIe={identify:m6,default:!0,tag:"tag:yaml.org,2002:int",format:"OCT",test:/^[-+]?0[0-7_]+$/,resolve:(t,A,e)=>H9(t,1,8,e),stringify:t=>OH(t,8,"0")},SIe={identify:m6,default:!0,tag:"tag:yaml.org,2002:int",test:/^[-+]?[0-9][0-9_]*$/,resolve:(t,A,e)=>H9(t,0,10,e),stringify:Oa},kIe={identify:m6,default:!0,tag:"tag:yaml.org,2002:int",format:"HEX",test:/^[-+]?0x[0-9a-fA-F_]+$/,resolve:(t,A,e)=>H9(t,2,16,e),stringify:t=>OH(t,16,"0x")};var JH=(()=>{class t extends ls{constructor(e){super(e),this.tag=t.tag}add(e){let i;bn(e)?i=e:e&&typeof e=="object"&&"key"in e&&"value"in e&&e.value===null?i=new qr(e.key,null):i=new qr(e,null),lI(this.items,i.key)||this.items.push(i)}get(e,i){let n=lI(this.items,e);return!i&&bn(n)?qi(n.key)?n.key.value:n.key:n}set(e,i){if(typeof i!="boolean")throw new Error(`Expected boolean value for set(key, value) in a YAML set, not ${typeof i}`);let n=lI(this.items,e);n&&!i?this.items.splice(this.items.indexOf(n),1):!n&&i&&this.items.push(new qr(e))}toJSON(e,i){return super.toJSON(e,i,Set)}toString(e,i,n){if(!e)return JSON.stringify(this);if(this.hasAllNullValues(!0))return super.toString(Object.assign({},e,{allNullValues:!0}),i,n);throw new Error("Set items must all have null values")}static from(e,i,n){let{replacer:o}=n,r=new this(e);if(i&&Symbol.iterator in Object(i))for(let s of i)typeof o=="function"&&(s=o.call(i,s,s)),r.items.push(fQ(s,null,n));return r}}return t.tag="tag:yaml.org,2002:set",t})(),p6={collection:"map",identify:t=>t instanceof Set,nodeClass:JH,default:!1,tag:"tag:yaml.org,2002:set",createNode:(t,A,e)=>JH.from(t,A,e),resolve(t,A){if(g0(t)){if(t.hasAllNullValues(!0))return Object.assign(new JH,t);A("Set items must all have null values")}else A("Expected a mapping for this tag");return t}};function YH(t,A){let e=t[0],i=e==="-"||e==="+"?t.substring(1):t,n=r=>A?BigInt(r):Number(r),o=i.replace(/_/g,"").split(":").reduce((r,s)=>r*n(60)+n(s),n(0));return e==="-"?n(-1)*o:o}function xIe(t){let{value:A}=t,e=r=>r;if(typeof A=="bigint")e=r=>BigInt(r);else if(isNaN(A)||!isFinite(A))return Oa(t);let i="";A<0&&(i="-",A*=e(-1));let n=e(60),o=[A%n];return A<60?o.unshift(0):(A=(A-o[0])/n,o.unshift(A%n),A>=60&&(A=(A-o[0])/n,o.unshift(A))),i+o.map(r=>String(r).padStart(2,"0")).join(":").replace(/000000\d*$/,"")}var z9={identify:t=>typeof t=="bigint"||Number.isInteger(t),default:!0,tag:"tag:yaml.org,2002:int",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+$/,resolve:(t,A,{intAsBigInt:e})=>YH(t,e),stringify:xIe},P9={identify:t=>typeof t=="number",default:!0,tag:"tag:yaml.org,2002:float",format:"TIME",test:/^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\.[0-9_]*$/,resolve:t=>YH(t,!1),stringify:xIe},QQ={identify:t=>t instanceof Date,default:!0,tag:"tag:yaml.org,2002:timestamp",test:RegExp("^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})(?:(?:t|T|[ \\t]+)([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}(\\.[0-9]+)?)(?:[ \\t]*(Z|[-+][012]?[0-9](?::[0-9]{2})?))?)?$"),resolve(t){let A=t.match(QQ.test);if(!A)throw new Error("!!timestamp expects a date, starting with yyyy-mm-dd");let[,e,i,n,o,r,s]=A.map(Number),a=A[7]?Number((A[7]+"00").substr(1,3)):0,c=Date.UTC(e,i-1,n,o||0,r||0,s||0,a),l=A[8];if(l&&l!=="Z"){let d=YH(l,!1);Math.abs(d)<30&&(d*=60),c-=6e4*d}return new Date(c)},stringify:({value:t})=>t?.toISOString().replace(/(T00:00:00)?\.000Z$/,"")??""};var HH=[I0,u0,gI,Bh,UH,TH,bIe,MIe,SIe,kIe,yIe,DIe,vIe,E6,C0,Q6,f6,p6,z9,P9,QQ];var _Ie=new Map([["core",QIe],["failsafe",[I0,u0,gI]],["json",pIe],["yaml11",HH],["yaml-1.1",HH]]),RIe={binary:E6,bool:B6,float:K9,floatExp:G9,floatNaN:F9,floatTime:P9,int:O9,intHex:J9,intOct:T9,intTime:z9,map:I0,merge:C0,null:Bh,omap:Q6,pairs:f6,seq:u0,set:p6,timestamp:QQ},NIe={"tag:yaml.org,2002:binary":E6,"tag:yaml.org,2002:merge":C0,"tag:yaml.org,2002:omap":Q6,"tag:yaml.org,2002:pairs":f6,"tag:yaml.org,2002:set":p6,"tag:yaml.org,2002:timestamp":QQ};function j9(t,A,e){let i=_Ie.get(A);if(i&&!t)return e&&!i.includes(C0)?i.concat(C0):i.slice();let n=i;if(!n)if(Array.isArray(t))n=[];else{let o=Array.from(_Ie.keys()).filter(r=>r!=="yaml11").map(r=>JSON.stringify(r)).join(", ");throw new Error(`Unknown schema "${A}"; use one of ${o} or define customTags array`)}if(Array.isArray(t))for(let o of t)n=n.concat(o);else typeof t=="function"&&(n=t(n.slice()));return e&&(n=n.concat(C0)),n.reduce((o,r)=>{let s=typeof r=="string"?RIe[r]:r;if(!s){let a=JSON.stringify(r),c=Object.keys(RIe).map(l=>JSON.stringify(l)).join(", ");throw new Error(`Unknown custom tag ${a}; use one of ${c}`)}return o.includes(s)||o.push(s),o},[])}var anA=(t,A)=>t.keyA.key?1:0,w6=class t{constructor({compat:A,customTags:e,merge:i,resolveKnownTags:n,schema:o,sortMapEntries:r,toStringDefaults:s}){this.compat=Array.isArray(A)?j9(A,"compat"):A?j9(null,A):null,this.name=typeof o=="string"&&o||"core",this.knownTags=n?NIe:{},this.tags=j9(e,this.name,i),this.toStringOptions=s??null,Object.defineProperty(this,c0,{value:I0}),Object.defineProperty(this,xl,{value:gI}),Object.defineProperty(this,A1,{value:u0}),this.sortMapEntries=typeof r=="function"?r:r===!0?anA:null}clone(){let A=Object.create(t.prototype,Object.getOwnPropertyDescriptors(this));return A.tags=this.tags.slice(),A}};function LIe(t,A){let e=[],i=A.directives===!0;if(A.directives!==!1&&t.directives){let a=t.directives.toString(t);a?(e.push(a),i=!0):t.directives.docStart&&(i=!0)}i&&e.push("---");let n=S9(t,A),{commentString:o}=n.options;if(t.commentBefore){e.length!==1&&e.unshift("");let a=o(t.commentBefore);e.unshift(Cg(a,""))}let r=!1,s=null;if(t.contents){if(Ln(t.contents)){if(t.contents.spaceBefore&&i&&e.push(""),t.contents.commentBefore){let l=o(t.contents.commentBefore);e.push(Cg(l,""))}n.forceBlockIndent=!!t.comment,s=t.contents.comment}let a=s?void 0:()=>r=!0,c=n1(t.contents,n,()=>s=null,a);s&&(c+=Jd(c,"",o(s))),(c[0]==="|"||c[0]===">")&&e[e.length-1]==="---"?e[e.length-1]=`--- ${c}`:e.push(c)}else e.push(n1(t.contents,n));if(t.directives?.docEnd)if(t.comment){let a=o(t.comment);a.includes(` +`)?(e.push("..."),e.push(Cg(a,""))):e.push(`... ${a}`)}else e.push("...");else{let a=t.comment;a&&r&&(a=a.replace(/^\n+/,"")),a&&((!r||s)&&e[e.length-1]!==""&&e.push(""),e.push(Cg(o(a),"")))}return e.join(` +`)+` +`}var o1=class t{constructor(A,e,i){this.commentBefore=null,this.comment=null,this.errors=[],this.warnings=[],Object.defineProperty(this,lc,{value:f9});let n=null;typeof e=="function"||Array.isArray(e)?n=e:i===void 0&&e&&(i=e,e=void 0);let o=Object.assign({intAsBigInt:!1,keepSourceTokens:!1,logLevel:"warn",prettyErrors:!0,strict:!0,stringKeys:!1,uniqueKeys:!0,version:"1.2"},i);this.options=o;let{version:r}=o;i?._directives?(this.directives=i._directives.atDocument(),this.directives.yaml.explicit&&(r=this.directives.yaml.version)):this.directives=new uQ({version:r}),this.setSchema(r,i),this.contents=A===void 0?null:this.createNode(A,n,i)}clone(){let A=Object.create(t.prototype,{[lc]:{value:f9}});return A.commentBefore=this.commentBefore,A.comment=this.comment,A.errors=this.errors.slice(),A.warnings=this.warnings.slice(),A.options=Object.assign({},this.options),this.directives&&(A.directives=this.directives.clone()),A.schema=this.schema.clone(),A.contents=Ln(this.contents)?this.contents.clone(A.schema):this.contents,this.range&&(A.range=this.range.slice()),A}add(A){mQ(this.contents)&&this.contents.add(A)}addIn(A,e){mQ(this.contents)&&this.contents.addIn(A,e)}createAlias(A,e){if(!A.anchor){let i=MH(this);A.anchor=!e||i.has(e)?SH(e||"a",i):e}return new t1(A.anchor)}createNode(A,e,i){let n;if(typeof e=="function")A=e.call({"":A},"",A),n=e;else if(Array.isArray(e)){let B=b=>typeof b=="number"||b instanceof String||b instanceof Number,f=e.filter(B).map(String);f.length>0&&(e=e.concat(f)),n=e}else i===void 0&&e&&(i=e,e=void 0);let{aliasDuplicateObjects:o,anchorPrefix:r,flow:s,keepUndefined:a,onTagObj:c,tag:l}=i??{},{onAnchor:d,setAnchors:C,sourceObjects:I}=IIe(this,r||"a"),u={aliasDuplicateObjects:o??!0,keepUndefined:a??!1,onAnchor:d,onTagObj:c,replacer:n,schema:this.schema,sourceObjects:I},h=i1(A,l,u);return s&&uo(h)&&(h.flow=!0),C(),h}createPair(A,e,i={}){let n=this.createNode(A,null,i),o=this.createNode(e,null,i);return new qr(n,o)}delete(A){return mQ(this.contents)?this.contents.delete(A):!1}deleteIn(A){return BQ(A)?this.contents==null?!1:(this.contents=null,!0):mQ(this.contents)?this.contents.deleteIn(A):!1}get(A,e){return uo(this.contents)?this.contents.get(A,e):void 0}getIn(A,e){return BQ(A)?!e&&qi(this.contents)?this.contents.value:this.contents:uo(this.contents)?this.contents.getIn(A,e):void 0}has(A){return uo(this.contents)?this.contents.has(A):!1}hasIn(A){return BQ(A)?this.contents!==void 0:uo(this.contents)?this.contents.hasIn(A):!1}set(A,e){this.contents==null?this.contents=C6(this.schema,[A],e):mQ(this.contents)&&this.contents.set(A,e)}setIn(A,e){BQ(A)?this.contents=e:this.contents==null?this.contents=C6(this.schema,Array.from(A),e):mQ(this.contents)&&this.contents.setIn(A,e)}setSchema(A,e={}){typeof A=="number"&&(A=String(A));let i;switch(A){case"1.1":this.directives?this.directives.yaml.version="1.1":this.directives=new uQ({version:"1.1"}),i={resolveKnownTags:!1,schema:"yaml-1.1"};break;case"1.2":case"next":this.directives?this.directives.yaml.version=A:this.directives=new uQ({version:A}),i={resolveKnownTags:!0,schema:"core"};break;case null:this.directives&&delete this.directives,i=null;break;default:{let n=JSON.stringify(A);throw new Error(`Expected '1.1', '1.2' or null as first argument, but found: ${n}`)}}if(e.schema instanceof Object)this.schema=e.schema;else if(i)this.schema=new w6(Object.assign(i,e));else throw new Error("With a null YAML version, the { schema: Schema } option is required")}toJS({json:A,jsonArg:e,mapAsMap:i,maxAliasCount:n,onAnchor:o,reviver:r}={}){let s={anchors:new Map,doc:this,keep:!A,mapAsMap:i===!0,mapKeyWarned:!1,maxAliasCount:typeof n=="number"?n:100},a=ks(this.contents,e??"",s);if(typeof o=="function")for(let{count:c,res:l}of s.anchors.values())o(l,c);return typeof r=="function"?aI(r,{"":a},"",a):a}toJSON(A,e){return this.toJS({json:!0,jsonArg:A,mapAsMap:!1,onAnchor:e})}toString(A={}){if(this.errors.length>0)throw new Error("Document with errors cannot be stringified");if("indent"in A&&(!Number.isInteger(A.indent)||Number(A.indent)<=0)){let e=JSON.stringify(A.indent);throw new Error(`"indent" option must be a positive integer, not ${e}`)}return LIe(this,A)}};function mQ(t){if(uo(t))return!0;throw new Error("Expected a YAML collection as document contents")}var y6=class extends Error{constructor(A,e,i,n){super(),this.name=A,this.code=i,this.message=n,this.pos=e}},h0=class extends y6{constructor(A,e,i){super("YAMLParseError",A,e,i)}},D6=class extends y6{constructor(A,e,i){super("YAMLWarning",A,e,i)}},zH=(t,A)=>e=>{if(e.pos[0]===-1)return;e.linePos=e.pos.map(s=>A.linePos(s));let{line:i,col:n}=e.linePos[0];e.message+=` at line ${i}, column ${n}`;let o=n-1,r=t.substring(A.lineStarts[i-1],A.lineStarts[i]).replace(/[\n\r]+$/,"");if(o>=60&&r.length>80){let s=Math.min(o-39,r.length-79);r="\u2026"+r.substring(s),o-=s-1}if(r.length>80&&(r=r.substring(0,79)+"\u2026"),i>1&&/^ *$/.test(r.substring(0,o))){let s=t.substring(A.lineStarts[i-2],A.lineStarts[i-1]);s.length>80&&(s=s.substring(0,79)+`\u2026 +`),r=s+r}if(/[^ ]/.test(r)){let s=1,a=e.linePos[1];a&&a.line===i&&a.col>n&&(s=Math.max(1,Math.min(a.col-n,80-o)));let c=" ".repeat(o)+"^".repeat(s);e.message+=`: + +${r} +${c} +`}};function Yd(t,{flow:A,indicator:e,next:i,offset:n,onError:o,parentIndent:r,startOnNewline:s}){let a=!1,c=s,l=s,d="",C="",I=!1,u=!1,h=null,B=null,f=null,b=null,k=null,S=null,w=null;for(let J of t)switch(u&&(J.type!=="space"&&J.type!=="newline"&&J.type!=="comma"&&o(J.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),u=!1),h&&(c&&J.type!=="comment"&&J.type!=="newline"&&o(h,"TAB_AS_INDENT","Tabs are not allowed as indentation"),h=null),J.type){case"space":!A&&(e!=="doc-start"||i?.type!=="flow-collection")&&J.source.includes(" ")&&(h=J),l=!0;break;case"comment":{l||o(J,"MISSING_CHAR","Comments must be separated from other tokens by white space characters");let O=J.source.substring(1)||" ";d?d+=C+O:d=O,C="",c=!1;break}case"newline":c?d?d+=J.source:(!S||e!=="seq-item-ind")&&(a=!0):C+=J.source,c=!0,I=!0,(B||f)&&(b=J),l=!0;break;case"anchor":B&&o(J,"MULTIPLE_ANCHORS","A node can have at most one anchor"),J.source.endsWith(":")&&o(J.offset+J.source.length-1,"BAD_ALIAS","Anchor ending in : is ambiguous",!0),B=J,w??(w=J.offset),c=!1,l=!1,u=!0;break;case"tag":{f&&o(J,"MULTIPLE_TAGS","A node can have at most one tag"),f=J,w??(w=J.offset),c=!1,l=!1,u=!0;break}case e:(B||f)&&o(J,"BAD_PROP_ORDER",`Anchors and tags must be after the ${J.source} indicator`),S&&o(J,"UNEXPECTED_TOKEN",`Unexpected ${J.source} in ${A??"collection"}`),S=J,c=e==="seq-item-ind"||e==="explicit-key-ind",l=!1;break;case"comma":if(A){k&&o(J,"UNEXPECTED_TOKEN",`Unexpected , in ${A}`),k=J,c=!1,l=!1;break}default:o(J,"UNEXPECTED_TOKEN",`Unexpected ${J.type} token`),c=!1,l=!1}let _=t[t.length-1],K=_?_.offset+_.source.length:n;return u&&i&&i.type!=="space"&&i.type!=="newline"&&i.type!=="comma"&&(i.type!=="scalar"||i.source!=="")&&o(i.offset,"MISSING_CHAR","Tags and anchors must be separated from the next token by white space"),h&&(c&&h.indent<=r||i?.type==="block-map"||i?.type==="block-seq")&&o(h,"TAB_AS_INDENT","Tabs are not allowed as indentation"),{comma:k,found:S,spaceBefore:a,comment:d,hasNewline:I,anchor:B,tag:f,newlineAfterProp:b,end:K,start:w??K}}function dI(t){if(!t)return null;switch(t.type){case"alias":case"scalar":case"double-quoted-scalar":case"single-quoted-scalar":if(t.source.includes(` +`))return!0;if(t.end){for(let A of t.end)if(A.type==="newline")return!0}return!1;case"flow-collection":for(let A of t.items){for(let e of A.start)if(e.type==="newline")return!0;if(A.sep){for(let e of A.sep)if(e.type==="newline")return!0}if(dI(A.key)||dI(A.value))return!0}return!1;default:return!0}}function v6(t,A,e){if(A?.type==="flow-collection"){let i=A.end[0];i.indent===t&&(i.source==="]"||i.source==="}")&&dI(A)&&e(i,"BAD_INDENT","Flow end indicator should be more indented than parent",!0)}}function V9(t,A,e){let{uniqueKeys:i}=t.options;if(i===!1)return!1;let n=typeof i=="function"?i:(o,r)=>o===r||qi(o)&&qi(r)&&o.value===r.value;return A.some(o=>n(o.key,e))}var FIe="All mapping items must start at the same column";function GIe({composeNode:t,composeEmptyNode:A},e,i,n,o){let r=o?.nodeClass??ls,s=new r(e.schema);e.atRoot&&(e.atRoot=!1);let a=i.offset,c=null;for(let l of i.items){let{start:d,key:C,sep:I,value:u}=l,h=Yd(d,{indicator:"explicit-key-ind",next:C??I?.[0],offset:a,onError:n,parentIndent:i.indent,startOnNewline:!0}),B=!h.found;if(B){if(C&&(C.type==="block-seq"?n(a,"BLOCK_AS_IMPLICIT_KEY","A block sequence may not be used as an implicit map key"):"indent"in C&&C.indent!==i.indent&&n(a,"BAD_INDENT",FIe)),!h.anchor&&!h.tag&&!I){c=h.end,h.comment&&(s.comment?s.comment+=` +`+h.comment:s.comment=h.comment);continue}(h.newlineAfterProp||dI(C))&&n(C??d[d.length-1],"MULTILINE_IMPLICIT_KEY","Implicit keys need to be on a single line")}else h.found?.indent!==i.indent&&n(a,"BAD_INDENT",FIe);e.atKey=!0;let f=h.end,b=C?t(e,C,h,n):A(e,f,d,null,h,n);e.schema.compat&&v6(i.indent,C,n),e.atKey=!1,V9(e,s.items,b)&&n(f,"DUPLICATE_KEY","Map keys must be unique");let k=Yd(I??[],{indicator:"map-value-ind",next:u,offset:b.range[2],onError:n,parentIndent:i.indent,startOnNewline:!C||C.type==="block-scalar"});if(a=k.end,k.found){B&&(u?.type==="block-map"&&!k.hasNewline&&n(a,"BLOCK_AS_IMPLICIT_KEY","Nested mappings are not allowed in compact mappings"),e.options.strict&&h.startt&&(t.type==="block-map"||t.type==="block-seq");function UIe({composeNode:t,composeEmptyNode:A},e,i,n,o){let r=i.start.source==="{",s=r?"flow map":"flow sequence",a=o?.nodeClass??(r?ls:Ta),c=new a(e.schema);c.flow=!0;let l=e.atRoot;l&&(e.atRoot=!1),e.atKey&&(e.atKey=!1);let d=i.offset+i.start.source.length;for(let B=0;B0){let B=Hd(u,h,e.options.strict,n);B.comment&&(c.comment?c.comment+=` +`+B.comment:c.comment=B.comment),c.range=[i.offset,h,B.offset]}else c.range=[i.offset,h,h];return c}function VH(t,A,e,i,n,o){let r=e.type==="block-map"?GIe(t,A,e,i,o):e.type==="block-seq"?KIe(t,A,e,i,o):UIe(t,A,e,i,o),s=r.constructor;return n==="!"||n===s.tagName?(r.tag=s.tagName,r):(n&&(r.tag=n),r)}function TIe(t,A,e,i,n){let o=i.tag,r=o?A.directives.tagName(o.source,C=>n(o,"TAG_RESOLVE_FAILED",C)):null;if(e.type==="block-seq"){let{anchor:C,newlineAfterProp:I}=i,u=C&&o?C.offset>o.offset?C:o:C??o;u&&(!I||I.offsetC.tag===r&&C.collection===s);if(!a){let C=A.schema.knownTags[r];if(C&&C.collection===s)A.schema.tags.push(Object.assign({},C,{default:!1})),a=C;else return C?n(o,"BAD_COLLECTION_TYPE",`${C.tag} used for ${s} collection, but expects ${C.collection??"scalar"}`,!0):n(o,"TAG_RESOLVE_FAILED",`Unresolved tag: ${r}`,!0),VH(t,A,e,n,r)}let c=VH(t,A,e,n,r,a),l=a.resolve?.(c,C=>n(o,"TAG_RESOLVE_FAILED",C),A.options)??c,d=Ln(l)?l:new qt(l);return d.range=c.range,d.tag=r,a?.format&&(d.format=a.format),d}function qH(t,A,e){let i=A.offset,n=cnA(A,t.options.strict,e);if(!n)return{value:"",type:null,comment:"",range:[i,i,i]};let o=n.mode===">"?qt.BLOCK_FOLDED:qt.BLOCK_LITERAL,r=A.source?lnA(A.source):[],s=r.length;for(let h=r.length-1;h>=0;--h){let B=r[h][1];if(B===""||B==="\r")s=h;else break}if(s===0){let h=n.chomp==="+"&&r.length>0?` +`.repeat(Math.max(1,r.length-1)):"",B=i+n.length;return A.source&&(B+=A.source.length),{value:h,type:o,comment:n.comment,range:[i,B,B]}}let a=A.indent+n.indent,c=A.offset+n.length,l=0;for(let h=0;ha&&(a=B.length);else{B.length=s;--h)r[h][0].length>a&&(s=h+1);let d="",C="",I=!1;for(let h=0;ha||f[0]===" "?(C===" "?C=` +`:!I&&C===` +`&&(C=` + +`),d+=C+B.slice(a)+f,C=` +`,I=!0):f===""?C===` +`?d+=` +`:C=` +`:(d+=C+f,C=" ",I=!1)}switch(n.chomp){case"-":break;case"+":for(let h=s;he(i+C,I,u);switch(n){case"scalar":s=qt.PLAIN,a=gnA(o,c);break;case"single-quoted-scalar":s=qt.QUOTE_SINGLE,a=dnA(o,c);break;case"double-quoted-scalar":s=qt.QUOTE_DOUBLE,a=CnA(o,c);break;default:return e(t,"UNEXPECTED_TOKEN",`Expected a flow scalar value, but found: ${n}`),{value:"",type:null,comment:"",range:[i,i+o.length,i+o.length]}}let l=i+o.length,d=Hd(r,l,A,e);return{value:a,type:s,comment:d.comment,range:[i,l,d.offset]}}function gnA(t,A){let e="";switch(t[0]){case" ":e="a tab character";break;case",":e="flow indicator character ,";break;case"%":e="directive indicator character %";break;case"|":case">":{e=`block scalar indicator ${t[0]}`;break}case"@":case"`":{e=`reserved character ${t[0]}`;break}}return e&&A(0,"BAD_SCALAR_START",`Plain value cannot start with ${e}`),OIe(t)}function dnA(t,A){return(t[t.length-1]!=="'"||t.length===1)&&A(t.length,"MISSING_CHAR","Missing closing 'quote"),OIe(t.slice(1,-1)).replace(/''/g,"'")}function OIe(t){let A,e;try{A=new RegExp(`(.*?)(?o?t.slice(o,i+1):n)}else e+=n}return(t[t.length-1]!=='"'||t.length===1)&&A(t.length,"MISSING_CHAR",'Missing closing "quote'),e}function InA(t,A){let e="",i=t[A+1];for(;(i===" "||i===" "||i===` +`||i==="\r")&&!(i==="\r"&&t[A+2]!==` +`);)i===` +`&&(e+=` +`),A+=1,i=t[A+1];return e||(e=" "),{fold:e,offset:A}}var unA={0:"\0",a:"\x07",b:"\b",e:"\x1B",f:"\f",n:` +`,r:"\r",t:" ",v:"\v",N:"\x85",_:"\xA0",L:"\u2028",P:"\u2029"," ":" ",'"':'"',"/":"/","\\":"\\"," ":" "};function hnA(t,A,e,i){let n=t.substr(A,e),r=n.length===e&&/^[0-9a-fA-F]+$/.test(n)?parseInt(n,16):NaN;if(isNaN(r)){let s=t.substr(A-2,e+2);return i(A-2,"BAD_DQ_ESCAPE",`Invalid escape sequence ${s}`),s}return String.fromCodePoint(r)}function ZH(t,A,e,i){let{value:n,type:o,comment:r,range:s}=A.type==="block-scalar"?qH(t,A,i):WH(A,t.options.strict,i),a=e?t.directives.tagName(e.source,d=>i(e,"TAG_RESOLVE_FAILED",d)):null,c;t.options.stringKeys&&t.atKey?c=t.schema[xl]:a?c=BnA(t.schema,n,a,e,i):A.type==="scalar"?c=EnA(t,n,A,i):c=t.schema[xl];let l;try{let d=c.resolve(n,C=>i(e??A,"TAG_RESOLVE_FAILED",C),t.options);l=qi(d)?d:new qt(d)}catch(d){let C=d instanceof Error?d.message:String(d);i(e??A,"TAG_RESOLVE_FAILED",C),l=new qt(n)}return l.range=s,l.source=n,o&&(l.type=o),a&&(l.tag=a),c.format&&(l.format=c.format),r&&(l.comment=r),l}function BnA(t,A,e,i,n){if(e==="!")return t[xl];let o=[];for(let s of t.tags)if(!s.collection&&s.tag===e)if(s.default&&s.test)o.push(s);else return s;for(let s of o)if(s.test?.test(A))return s;let r=t.knownTags[e];return r&&!r.collection?(t.tags.push(Object.assign({},r,{default:!1,test:void 0})),r):(n(i,"TAG_RESOLVE_FAILED",`Unresolved tag: ${e}`,e!=="tag:yaml.org,2002:str"),t[xl])}function EnA({atKey:t,directives:A,schema:e},i,n,o){let r=e.tags.find(s=>(s.default===!0||t&&s.default==="key")&&s.test?.test(i))||e[xl];if(e.compat){let s=e.compat.find(a=>a.default&&a.test?.test(i))??e[xl];if(r.tag!==s.tag){let a=A.tagString(r.tag),c=A.tagString(s.tag),l=`Value may be parsed as either ${a} or ${c}`;o(n,"TAG_RESOLVE_FAILED",l,!0)}}return r}function JIe(t,A,e){if(A){e??(e=A.length);for(let i=e-1;i>=0;--i){let n=A[i];switch(n.type){case"space":case"comment":case"newline":t-=n.source.length;continue}for(n=A[++i];n?.type==="space";)t+=n.source.length,n=A[++i];break}}return t}var fnA={composeNode:XH,composeEmptyNode:q9};function XH(t,A,e,i){let n=t.atKey,{spaceBefore:o,comment:r,anchor:s,tag:a}=e,c,l=!0;switch(A.type){case"alias":c=QnA(t,A,i),(s||a)&&i(A,"ALIAS_PROPS","An alias node must not specify any properties");break;case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":case"block-scalar":c=ZH(t,A,a,i),s&&(c.anchor=s.source.substring(1));break;case"block-map":case"block-seq":case"flow-collection":c=TIe(fnA,t,A,e,i),s&&(c.anchor=s.source.substring(1));break;default:{let d=A.type==="error"?A.message:`Unsupported token (type: ${A.type})`;i(A,"UNEXPECTED_TOKEN",d),c=q9(t,A.offset,void 0,null,e,i),l=!1}}return s&&c.anchor===""&&i(s,"BAD_ALIAS","Anchor cannot be an empty string"),n&&t.options.stringKeys&&(!qi(c)||typeof c.value!="string"||c.tag&&c.tag!=="tag:yaml.org,2002:str")&&i(a??A,"NON_STRING_KEY","With stringKeys, all keys must be strings"),o&&(c.spaceBefore=!0),r&&(A.type==="scalar"&&A.source===""?c.comment=r:c.commentBefore=r),t.options.keepSourceTokens&&l&&(c.srcToken=A),c}function q9(t,A,e,i,{spaceBefore:n,comment:o,anchor:r,tag:s,end:a},c){let l={type:"scalar",offset:JIe(A,e,i),indent:-1,source:""},d=ZH(t,l,s,c);return r&&(d.anchor=r.source.substring(1),d.anchor===""&&c(r,"BAD_ALIAS","Anchor cannot be an empty string")),n&&(d.spaceBefore=!0),o&&(d.comment=o,d.range[2]=a),d}function QnA({options:t},{offset:A,source:e,end:i},n){let o=new t1(e.substring(1));o.source===""&&n(A,"BAD_ALIAS","Alias cannot be an empty string"),o.source.endsWith(":")&&n(A+e.length-1,"BAD_ALIAS","Alias ending in : is ambiguous",!0);let r=A+e.length,s=Hd(i,r,t.strict,n);return o.range=[A,r,s.offset],s.comment&&(o.comment=s.comment),o}function YIe(t,A,{offset:e,start:i,value:n,end:o},r){let s=Object.assign({_directives:A},t),a=new o1(void 0,s),c={atKey:!1,atRoot:!0,directives:a.directives,options:a.options,schema:a.schema},l=Yd(i,{indicator:"doc-start",next:n??o?.[0],offset:e,onError:r,parentIndent:0,startOnNewline:!0});l.found&&(a.directives.docStart=!0,n&&(n.type==="block-map"||n.type==="block-seq")&&!l.hasNewline&&r(l.end,"MISSING_CHAR","Block collection cannot start on same line with directives-end marker")),a.contents=n?XH(c,n,l,r):q9(c,l.end,i,null,l,r);let d=a.contents.range[2],C=Hd(o,d,!1,r);return C.comment&&(a.comment=C.comment),a.range=[e,d,C.offset],a}function b6(t){if(typeof t=="number")return[t,t+1];if(Array.isArray(t))return t.length===2?t:[t[0],t[1]];let{offset:A,source:e}=t;return[A,A+(typeof e=="string"?e.length:1)]}function HIe(t){let A="",e=!1,i=!1;for(let n=0;n{let r=b6(e);o?this.warnings.push(new D6(r,i,n)):this.errors.push(new h0(r,i,n))},this.directives=new uQ({version:A.version||"1.2"}),this.options=A}decorate(A,e){let{comment:i,afterEmptyLine:n}=HIe(this.prelude);if(i){let o=A.contents;if(e)A.comment=A.comment?`${A.comment} +${i}`:i;else if(n||A.directives.docStart||!o)A.commentBefore=i;else if(uo(o)&&!o.flow&&o.items.length>0){let r=o.items[0];bn(r)&&(r=r.key);let s=r.commentBefore;r.commentBefore=s?`${i} +${s}`:i}else{let r=o.commentBefore;o.commentBefore=r?`${i} +${r}`:i}}e?(Array.prototype.push.apply(A.errors,this.errors),Array.prototype.push.apply(A.warnings,this.warnings)):(A.errors=this.errors,A.warnings=this.warnings),this.prelude=[],this.errors=[],this.warnings=[]}streamInfo(){return{comment:HIe(this.prelude).comment,directives:this.directives,errors:this.errors,warnings:this.warnings}}*compose(A,e=!1,i=-1){for(let n of A)yield*cA(this.next(n));yield*cA(this.end(e,i))}*next(A){switch(A.type){case"directive":this.directives.add(A.source,(e,i,n)=>{let o=b6(A);o[0]+=e,this.onError(o,"BAD_DIRECTIVE",i,n)}),this.prelude.push(A.source),this.atDirectives=!0;break;case"document":{let e=YIe(this.options,this.directives,A,this.onError);this.atDirectives&&!e.directives.docStart&&this.onError(A,"MISSING_CHAR","Missing directives-end/doc-start indicator line"),this.decorate(e,!1),this.doc&&(yield this.doc),this.doc=e,this.atDirectives=!1;break}case"byte-order-mark":case"space":break;case"comment":case"newline":this.prelude.push(A.source);break;case"error":{let e=A.source?`${A.message}: ${JSON.stringify(A.source)}`:A.message,i=new h0(b6(A),"UNEXPECTED_TOKEN",e);this.atDirectives||!this.doc?this.errors.push(i):this.doc.errors.push(i);break}case"doc-end":{if(!this.doc){let i="Unexpected doc-end without preceding document";this.errors.push(new h0(b6(A),"UNEXPECTED_TOKEN",i));break}this.doc.directives.docEnd=!0;let e=Hd(A.end,A.offset+A.source.length,this.doc.options.strict,this.onError);if(this.decorate(this.doc,!0),e.comment){let i=this.doc.comment;this.doc.comment=i?`${i} +${e.comment}`:e.comment}this.doc.range[2]=e.offset;break}default:this.errors.push(new h0(b6(A),"UNEXPECTED_TOKEN",`Unsupported token ${A.type}`))}}*end(A=!1,e=-1){if(this.doc)this.decorate(this.doc,!0),yield this.doc,this.doc=null;else if(A){let i=Object.assign({_directives:this.directives},this.options),n=new o1(void 0,i);this.atDirectives&&this.onError(e,"MISSING_CHAR","Missing directives-end indicator line"),n.range=[0,e,e],this.decorate(n,!1),yield n}}};var $H=Symbol("break visit"),mnA=Symbol("skip children"),zIe=Symbol("remove item");function Eh(t,A){"type"in t&&t.type==="document"&&(t={start:t.start,value:t.value}),PIe(Object.freeze([]),t,A)}Eh.BREAK=$H;Eh.SKIP=mnA;Eh.REMOVE=zIe;Eh.itemAtPath=(t,A)=>{let e=t;for(let[i,n]of A){let o=e?.[i];if(o&&"items"in o)e=o.items[n];else return}return e};Eh.parentCollection=(t,A)=>{let e=Eh.itemAtPath(t,A.slice(0,-1)),i=A[A.length-1][0],n=e?.[i];if(n&&"items"in n)return n;throw new Error("Parent collection not found")};function PIe(t,A,e){let i=e(A,t);if(typeof i=="symbol")return i;for(let n of["key","value"]){let o=A[n];if(o&&"items"in o){for(let r=0;r":return"block-scalar-header"}return null}function B0(t){switch(t){case void 0:case" ":case` +`:case"\r":case" ":return!0;default:return!1}}var VIe=new Set("0123456789ABCDEFabcdef"),wnA=new Set("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-#;/?:@&=+$_.!~*'()"),Z9=new Set(",[]{}"),ynA=new Set(` ,[]{} +\r `),iz=t=>!t||ynA.has(t),S6=class{constructor(){this.atEnd=!1,this.blockScalarIndent=-1,this.blockScalarKeep=!1,this.buffer="",this.flowKey=!1,this.flowLevel=0,this.indentNext=0,this.indentValue=0,this.lineEndPos=null,this.next=null,this.pos=0}*lex(A,e=!1){if(A){if(typeof A!="string")throw TypeError("source is not a string");this.buffer=this.buffer?this.buffer+A:A,this.lineEndPos=null}this.atEnd=!e;let i=this.next??"stream";for(;i&&(e||this.hasChars(1));)i=yield*cA(this.parseNext(i))}atLineEnd(){let A=this.pos,e=this.buffer[A];for(;e===" "||e===" ";)e=this.buffer[++A];return!e||e==="#"||e===` +`?!0:e==="\r"?this.buffer[A+1]===` +`:!1}charAt(A){return this.buffer[this.pos+A]}continueScalar(A){let e=this.buffer[A];if(this.indentNext>0){let i=0;for(;e===" ";)e=this.buffer[++i+A];if(e==="\r"){let n=this.buffer[i+A+1];if(n===` +`||!n&&!this.atEnd)return A+i+1}return e===` +`||i>=this.indentNext||!e&&!this.atEnd?A+i:-1}if(e==="-"||e==="."){let i=this.buffer.substr(A,3);if((i==="---"||i==="...")&&B0(this.buffer[A+3]))return-1}return A}getLine(){let A=this.lineEndPos;return(typeof A!="number"||A!==-1&&Athis.indentValue&&!B0(this.charAt(1))&&(this.indentNext=this.indentValue),yield*cA(this.parseBlockStart())}*parseBlockStart(){let[A,e]=this.peek(2);if(!e&&!this.atEnd)return this.setNext("block-start");if((A==="-"||A==="?"||A===":")&&B0(e)){let i=(yield*cA(this.pushCount(1)))+(yield*cA(this.pushSpaces(!0)));return this.indentNext=this.indentValue+1,this.indentValue+=i,yield*cA(this.parseBlockStart())}return"doc"}*parseDocument(){yield*cA(this.pushSpaces(!0));let A=this.getLine();if(A===null)return this.setNext("doc");let e=yield*cA(this.pushIndicators());switch(A[e]){case"#":yield*cA(this.pushCount(A.length-e));case void 0:return yield*cA(this.pushNewline()),yield*cA(this.parseLineStart());case"{":case"[":return yield*cA(this.pushCount(1)),this.flowKey=!1,this.flowLevel=1,"flow";case"}":case"]":return yield*cA(this.pushCount(1)),"doc";case"*":return yield*cA(this.pushUntil(iz)),"doc";case'"':case"'":return yield*cA(this.parseQuotedScalar());case"|":case">":return e+=yield*cA(this.parseBlockScalarHeader()),e+=yield*cA(this.pushSpaces(!0)),yield*cA(this.pushCount(A.length-e)),yield*cA(this.pushNewline()),yield*cA(this.parseBlockScalar());default:return yield*cA(this.parsePlainScalar())}}*parseFlowCollection(){let A,e,i=-1;do A=yield*cA(this.pushNewline()),A>0?(e=yield*cA(this.pushSpaces(!1)),this.indentValue=i=e):e=0,e+=yield*cA(this.pushSpaces(!0));while(A+e>0);let n=this.getLine();if(n===null)return this.setNext("flow");if((i!==-1&&i"0"&&e<="9")this.blockScalarIndent=Number(e)-1;else if(e!=="-")break}return yield*cA(this.pushUntil(e=>B0(e)||e==="#"))}*parseBlockScalar(){let A=this.pos-1,e=0,i;e:for(let o=this.pos;i=this.buffer[o];++o)switch(i){case" ":e+=1;break;case` +`:A=o,e=0;break;case"\r":{let r=this.buffer[o+1];if(!r&&!this.atEnd)return this.setNext("block-scalar");if(r===` +`)break}default:break e}if(!i&&!this.atEnd)return this.setNext("block-scalar");if(e>=this.indentNext){this.blockScalarIndent===-1?this.indentNext=e:this.indentNext=this.blockScalarIndent+(this.indentNext===0?1:this.indentNext);do{let o=this.continueScalar(A+1);if(o===-1)break;A=this.buffer.indexOf(` +`,o)}while(A!==-1);if(A===-1){if(!this.atEnd)return this.setNext("block-scalar");A=this.buffer.length}}let n=A+1;for(i=this.buffer[n];i===" ";)i=this.buffer[++n];if(i===" "){for(;i===" "||i===" "||i==="\r"||i===` +`;)i=this.buffer[++n];A=n-1}else if(!this.blockScalarKeep)do{let o=A-1,r=this.buffer[o];r==="\r"&&(r=this.buffer[--o]);let s=o;for(;r===" ";)r=this.buffer[--o];if(r===` +`&&o>=this.pos&&o+1+e>s)A=o;else break}while(!0);return yield W9,yield*cA(this.pushToIndex(A+1,!0)),yield*cA(this.parseLineStart())}*parsePlainScalar(){let A=this.flowLevel>0,e=this.pos-1,i=this.pos-1,n;for(;n=this.buffer[++i];)if(n===":"){let o=this.buffer[i+1];if(B0(o)||A&&Z9.has(o))break;e=i}else if(B0(n)){let o=this.buffer[i+1];if(n==="\r"&&(o===` +`?(i+=1,n=` +`,o=this.buffer[i+1]):e=i),o==="#"||A&&Z9.has(o))break;if(n===` +`){let r=this.continueScalar(i+1);if(r===-1)break;i=Math.max(i,r-2)}}else{if(A&&Z9.has(n))break;e=i}return!n&&!this.atEnd?this.setNext("plain-scalar"):(yield W9,yield*cA(this.pushToIndex(e+1,!0)),A?"flow":"doc")}*pushCount(A){return A>0?(yield this.buffer.substr(this.pos,A),this.pos+=A,A):0}*pushToIndex(A,e){let i=this.buffer.slice(this.pos,A);return i?(yield i,this.pos+=i.length,i.length):(e&&(yield""),0)}*pushIndicators(){switch(this.charAt(0)){case"!":return(yield*cA(this.pushTag()))+(yield*cA(this.pushSpaces(!0)))+(yield*cA(this.pushIndicators()));case"&":return(yield*cA(this.pushUntil(iz)))+(yield*cA(this.pushSpaces(!0)))+(yield*cA(this.pushIndicators()));case"-":case"?":case":":{let A=this.flowLevel>0,e=this.charAt(1);if(B0(e)||A&&Z9.has(e))return A?this.flowKey&&(this.flowKey=!1):this.indentNext=this.indentValue+1,(yield*cA(this.pushCount(1)))+(yield*cA(this.pushSpaces(!0)))+(yield*cA(this.pushIndicators()))}}return 0}*pushTag(){if(this.charAt(1)==="<"){let A=this.pos+2,e=this.buffer[A];for(;!B0(e)&&e!==">";)e=this.buffer[++A];return yield*cA(this.pushToIndex(e===">"?A+1:A,!1))}else{let A=this.pos+1,e=this.buffer[A];for(;e;)if(wnA.has(e))e=this.buffer[++A];else if(e==="%"&&VIe.has(this.buffer[A+1])&&VIe.has(this.buffer[A+2]))e=this.buffer[A+=3];else break;return yield*cA(this.pushToIndex(A,!1))}}*pushNewline(){let A=this.buffer[this.pos];return A===` +`?yield*cA(this.pushCount(1)):A==="\r"&&this.charAt(1)===` +`?yield*cA(this.pushCount(2)):0}*pushSpaces(A){let e=this.pos-1,i;do i=this.buffer[++e];while(i===" "||A&&i===" ");let n=e-this.pos;return n>0&&(yield this.buffer.substr(this.pos,n),this.pos=e),n}*pushUntil(A){let e=this.pos,i=this.buffer[e];for(;!A(i);)i=this.buffer[++e];return yield*cA(this.pushToIndex(e,!1))}};var k6=class{constructor(){this.lineStarts=[],this.addNewLine=A=>this.lineStarts.push(A),this.linePos=A=>{let e=0,i=this.lineStarts.length;for(;e>1;this.lineStarts[o]=0;)switch(t[A].type){case"doc-start":case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":case"newline":break e}for(;t[++A]?.type==="space";);return t.splice(A,t.length)}function WIe(t){if(t.start.type==="flow-seq-start")for(let A of t.items)A.sep&&!A.value&&!CI(A.start,"explicit-key-ind")&&!CI(A.sep,"map-value-ind")&&(A.key&&(A.value=A.key),delete A.key,ZIe(A.value)?A.value.end?Array.prototype.push.apply(A.value.end,A.sep):A.value.end=A.sep:Array.prototype.push.apply(A.start,A.sep),delete A.sep)}var x6=class{constructor(A){this.atNewLine=!0,this.atScalar=!1,this.indent=0,this.offset=0,this.onKeyLine=!1,this.stack=[],this.source="",this.type="",this.lexer=new S6,this.onNewLine=A}*parse(A,e=!1){this.onNewLine&&this.offset===0&&this.onNewLine(0);for(let i of this.lexer.lex(A,e))yield*cA(this.next(i));e||(yield*cA(this.end()))}*next(A){if(this.source=A,this.atScalar){this.atScalar=!1,yield*cA(this.step()),this.offset+=A.length;return}let e=jIe(A);if(e)if(e==="scalar")this.atNewLine=!1,this.atScalar=!0,this.type="scalar";else{switch(this.type=e,yield*cA(this.step()),e){case"newline":this.atNewLine=!0,this.indent=0,this.onNewLine&&this.onNewLine(this.offset+A.length);break;case"space":this.atNewLine&&A[0]===" "&&(this.indent+=A.length);break;case"explicit-key-ind":case"map-value-ind":case"seq-item-ind":this.atNewLine&&(this.indent+=A.length);break;case"doc-mode":case"flow-error-end":return;default:this.atNewLine=!1}this.offset+=A.length}else{let i=`Not a YAML token: ${A}`;yield*cA(this.pop({type:"error",offset:this.offset,message:i,source:A})),this.offset+=A.length}}*end(){for(;this.stack.length>0;)yield*cA(this.pop())}get sourceToken(){return{type:this.type,offset:this.offset,indent:this.indent,source:this.source}}*step(){let A=this.peek(1);if(this.type==="doc-end"&&(!A||A.type!=="doc-end")){for(;this.stack.length>0;)yield*cA(this.pop());this.stack.push({type:"doc-end",offset:this.offset,source:this.source});return}if(!A)return yield*cA(this.stream());switch(A.type){case"document":return yield*cA(this.document(A));case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return yield*cA(this.scalar(A));case"block-scalar":return yield*cA(this.blockScalar(A));case"block-map":return yield*cA(this.blockMap(A));case"block-seq":return yield*cA(this.blockSequence(A));case"flow-collection":return yield*cA(this.flowCollection(A));case"doc-end":return yield*cA(this.documentEnd(A))}yield*cA(this.pop())}peek(A){return this.stack[this.stack.length-A]}*pop(A){let e=A??this.stack.pop();if(!e)yield{type:"error",offset:this.offset,source:"",message:"Tried to pop an empty stack"};else if(this.stack.length===0)yield e;else{let i=this.peek(1);switch(e.type==="block-scalar"?e.indent="indent"in i?i.indent:0:e.type==="flow-collection"&&i.type==="document"&&(e.indent=0),e.type==="flow-collection"&&WIe(e),i.type){case"document":i.value=e;break;case"block-scalar":i.props.push(e);break;case"block-map":{let n=i.items[i.items.length-1];if(n.value){i.items.push({start:[],key:e,sep:[]}),this.onKeyLine=!0;return}else if(n.sep)n.value=e;else{Object.assign(n,{key:e,sep:[]}),this.onKeyLine=!n.explicitKey;return}break}case"block-seq":{let n=i.items[i.items.length-1];n.value?i.items.push({start:[],value:e}):n.value=e;break}case"flow-collection":{let n=i.items[i.items.length-1];!n||n.value?i.items.push({start:[],key:e,sep:[]}):n.sep?n.value=e:Object.assign(n,{key:e,sep:[]});return}default:yield*cA(this.pop()),yield*cA(this.pop(e))}if((i.type==="document"||i.type==="block-map"||i.type==="block-seq")&&(e.type==="block-map"||e.type==="block-seq")){let n=e.items[e.items.length-1];n&&!n.sep&&!n.value&&n.start.length>0&&qIe(n.start)===-1&&(e.indent===0||n.start.every(o=>o.type!=="comment"||o.indent=A.indent){let i=!this.onKeyLine&&this.indent===A.indent,n=i&&(e.sep||e.explicitKey)&&this.type!=="seq-item-ind",o=[];if(n&&e.sep&&!e.value){let r=[];for(let s=0;sA.indent&&(r.length=0);break;default:r.length=0}}r.length>=2&&(o=e.sep.splice(r[1]))}switch(this.type){case"anchor":case"tag":n||e.value?(o.push(this.sourceToken),A.items.push({start:o}),this.onKeyLine=!0):e.sep?e.sep.push(this.sourceToken):e.start.push(this.sourceToken);return;case"explicit-key-ind":!e.sep&&!e.explicitKey?(e.start.push(this.sourceToken),e.explicitKey=!0):n||e.value?(o.push(this.sourceToken),A.items.push({start:o,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(e.explicitKey)if(e.sep)if(e.value)A.items.push({start:[],key:null,sep:[this.sourceToken]});else if(CI(e.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:o,key:null,sep:[this.sourceToken]}]});else if(ZIe(e.key)&&!CI(e.sep,"newline")){let r=pQ(e.start),s=e.key,a=e.sep;a.push(this.sourceToken),delete e.key,delete e.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:s,sep:a}]})}else o.length>0?e.sep=e.sep.concat(o,this.sourceToken):e.sep.push(this.sourceToken);else if(CI(e.start,"newline"))Object.assign(e,{key:null,sep:[this.sourceToken]});else{let r=pQ(e.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:r,key:null,sep:[this.sourceToken]}]})}else e.sep?e.value||n?A.items.push({start:o,key:null,sep:[this.sourceToken]}):CI(e.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):e.sep.push(this.sourceToken):Object.assign(e,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let r=this.flowScalar(this.type);n||e.value?(A.items.push({start:o,key:r,sep:[]}),this.onKeyLine=!0):e.sep?this.stack.push(r):(Object.assign(e,{key:r,sep:[]}),this.onKeyLine=!0);return}default:{let r=this.startBlockValue(A);if(r){if(r.type==="block-seq"){if(!e.explicitKey&&e.sep&&!CI(e.sep,"newline")){yield*cA(this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source}));return}}else i&&A.items.push({start:o});this.stack.push(r);return}}}}yield*cA(this.pop()),yield*cA(this.step())}*blockSequence(A){let e=A.items[A.items.length-1];switch(this.type){case"newline":if(e.value){let i="end"in e.value?e.value.end:void 0;(Array.isArray(i)?i[i.length-1]:void 0)?.type==="comment"?i?.push(this.sourceToken):A.items.push({start:[this.sourceToken]})}else e.start.push(this.sourceToken);return;case"space":case"comment":if(e.value)A.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(e.start,A.indent)){let n=A.items[A.items.length-2]?.value?.end;if(Array.isArray(n)){Array.prototype.push.apply(n,e.start),n.push(this.sourceToken),A.items.pop();return}}e.start.push(this.sourceToken)}return;case"anchor":case"tag":if(e.value||this.indent<=A.indent)break;e.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==A.indent)break;e.value||CI(e.start,"seq-item-ind")?A.items.push({start:[this.sourceToken]}):e.start.push(this.sourceToken);return}if(this.indent>A.indent){let i=this.startBlockValue(A);if(i){this.stack.push(i);return}}yield*cA(this.pop()),yield*cA(this.step())}*flowCollection(A){let e=A.items[A.items.length-1];if(this.type==="flow-error-end"){let i;do yield*cA(this.pop()),i=this.peek(1);while(i&&i.type==="flow-collection")}else if(A.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!e||e.sep?A.items.push({start:[this.sourceToken]}):e.start.push(this.sourceToken);return;case"map-value-ind":!e||e.value?A.items.push({start:[],key:null,sep:[this.sourceToken]}):e.sep?e.sep.push(this.sourceToken):Object.assign(e,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!e||e.value?A.items.push({start:[this.sourceToken]}):e.sep?e.sep.push(this.sourceToken):e.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let n=this.flowScalar(this.type);!e||e.value?A.items.push({start:[],key:n,sep:[]}):e.sep?this.stack.push(n):Object.assign(e,{key:n,sep:[]});return}case"flow-map-end":case"flow-seq-end":A.end.push(this.sourceToken);return}let i=this.startBlockValue(A);i?this.stack.push(i):(yield*cA(this.pop()),yield*cA(this.step()))}else{let i=this.peek(2);if(i.type==="block-map"&&(this.type==="map-value-ind"&&i.indent===A.indent||this.type==="newline"&&!i.items[i.items.length-1].sep))yield*cA(this.pop()),yield*cA(this.step());else if(this.type==="map-value-ind"&&i.type!=="flow-collection"){let n=X9(i),o=pQ(n);WIe(A);let r=A.end.splice(1,A.end.length);r.push(this.sourceToken);let s={type:"block-map",offset:A.offset,indent:A.indent,items:[{start:o,key:A,sep:r}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=s}else yield*cA(this.lineEnd(A))}}flowScalar(A){if(this.onNewLine){let e=this.source.indexOf(` +`)+1;for(;e!==0;)this.onNewLine(this.offset+e),e=this.source.indexOf(` +`,e)+1}return{type:A,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(A){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let e=X9(A),i=pQ(e);return i.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let e=X9(A),i=pQ(e);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start:i,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(A,e){return this.type!=="comment"||this.indent<=e?!1:A.every(i=>i.type==="newline"||i.type==="space")}*documentEnd(A){this.type!=="doc-mode"&&(A.end?A.end.push(this.sourceToken):A.end=[this.sourceToken],this.type==="newline"&&(yield*cA(this.pop())))}*lineEnd(A){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*cA(this.pop()),yield*cA(this.step());break;case"newline":this.onKeyLine=!1;case"space":case"comment":default:A.end?A.end.push(this.sourceToken):A.end=[this.sourceToken],this.type==="newline"&&(yield*cA(this.pop()))}}};function DnA(t){let A=t.prettyErrors!==!1;return{lineCounter:t.lineCounter||A&&new k6||null,prettyErrors:A}}function XIe(t,A={}){let{lineCounter:e,prettyErrors:i}=DnA(A),n=new x6(e?.addNewLine),o=new M6(A),r=null;for(let s of o.compose(n.parse(t),!0,t.length))if(!r)r=s;else if(r.options.logLevel!=="silent"){r.errors.push(new h0(s.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return i&&e&&(r.errors.forEach(zH(t,e)),r.warnings.forEach(zH(t,e))),r}function fh(t,A,e){let i;typeof A=="function"?i=A:e===void 0&&A&&typeof A=="object"&&(e=A);let n=XIe(t,e);if(!n)return null;if(n.warnings.forEach(o=>k9(n.options.logLevel,o)),n.errors.length>0){if(n.options.logLevel!=="silent")throw n.errors[0];n.errors=[]}return n.toJS(Object.assign({reviver:i},e))}function nz(t,A,e){let i=null;if(typeof A=="function"||Array.isArray(A)?i=A:e===void 0&&A&&(e=A),typeof e=="string"&&(e=e.length),typeof e=="number"){let n=Math.round(e);e=n<1?void 0:n>8?{indent:8}:{indent:n}}if(t===void 0){let{keepUndefined:n}=e??A??{};if(!n)return}return l0(t)&&!i?t.toString(e):new o1(t,i,e).toString(e)}var zd=class{static generateYamlFile(A,e,i,n,o=new Set){if(o.has(A.name))return;o.add(A.name);let r=A.isRoot?"root_agent.yaml":`${A.name}.yaml`,s=`${i}/${r}`,a=A.sub_agents?A.sub_agents.map(u=>({config_path:`./${u.name}.yaml`})):[],c={name:A.name,model:A.model,agent_class:A.agent_class,description:A.description||"",instruction:A.instruction,sub_agents:a,tools:this.buildToolsConfig(A.tools,n)};(!A.description||A.description.trim()==="")&&delete c.description,A.agent_class!="LlmAgent"&&(delete c.instruction,delete c.tools),A.agent_class==="LoopAgent"&&A.max_iterations&&(c.max_iterations=A.max_iterations);let l=this.buildCallbacksConfig(A.callbacks);Object.keys(l).length>0&&Object.assign(c,l);let d=nz(c),C=new Blob([d],{type:"application/x-yaml"}),I=new File([C],s,{type:"application/x-yaml"});e.append("files",I);for(let u of A.sub_agents??[])this.generateYamlFile(u,e,i,n,o);if(A.tools){for(let u of A.tools)if(u.toolType==="Agent Tool"){let h=u.toolAgentName||u.name;if(!h||h==="undefined"||h.trim()==="")continue;let B=n.get(h);B&&this.generateYamlFile(B,e,i,n,o)}}}static buildToolsConfig(A,e){return!A||A.length===0?[]:A.map(i=>{let n={name:i.name};if(i.toolType==="Agent Tool"){n.name="AgentTool";let o=i.toolAgentName||i.name;if(!o||o==="undefined"||o.trim()==="")return null;let r=e.get(o);return n.args={agent:{config_path:`./${o}.yaml`},skip_summarization:r?.skip_summarization||!1},n}return i.args&&Object.keys(i.args).some(r=>{let s=i.args[r];return s!=null&&s!==""})&&(n.args=i.args),n}).filter(i=>i!==null)}static buildCallbacksConfig(A){if(!A||A.length===0)return{};let e={};return A.forEach(i=>{let n=`${i.type}_callbacks`;e[n]||(e[n]=[]),e[n].push({name:i.name})}),e}};var E0=class t{static toolMenuTooltips=new Map([["Function tool","Build custom tools for your specific ADK agent needs."],["Built-in tool","Ready-to-use functionality such as Google Search or code executors that provide agents with common capabilities. "],["Agent tool","A sub-agent that can be invoked as a tool by another agent."]]);static toolDetailedInfo=new Map([["Function tool",{shortDescription:"Build custom tools for your specific ADK agent needs.",detailedDescription:"The ADK framework automatically inspects your Python function's signature\u2014including its name, docstring, parameters, type hints, and default values\u2014to generate a schema. This schema is what the LLM uses to understand the tool's purpose, when to use it, and what arguments it requires.",docLink:"https://google.github.io/adk-docs/tools/function-tools/"}],["Agent tool",{shortDescription:"Wraps a sub-agent as a callable tool, enabling modular and hierarchical agent architectures.",detailedDescription:"Agent tools allow you to use one agent as a tool within another agent, creating powerful multi-agent workflows.",docLink:"https://google.github.io/adk-docs/agents/multi-agents/#c-explicit-invocation-agenttool"}]]);static callbackMenuTooltips=new Map([["before_agent","Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed."],["after_agent","Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes."],["before_model","Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow."],["after_model","Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent."],["before_tool","Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it."],["after_tool","Called just after the tool's run_async method completes successfully."]]);static callbackDialogTooltips=new Map([["before_agent","Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed."],["after_agent","Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes."],["before_model","Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow."],["after_model","Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent."],["before_tool","Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it."],["after_tool","Called just after the tool's run_async method completes successfully."]]);static callbackDetailedInfo=new Map([["before_agent",{shortDescription:"Called immediately before the agent's _run_async_impl (or _run_live_impl) method is executed. It runs after the agent's InvocationContext is created but before its core logic begins.",detailedDescription:" Ideal for setting up resources or state needed only for this specific agent's run, performing validation checks on the session state (callback_context.state) before execution starts, logging the entry point of the agent's activity, or potentially modifying the invocation context before the core logic uses it.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-agent-callback"}],["after_agent",{shortDescription:"Called immediately after the agent's _run_async_impl (or _run_live_impl) method successfully completes.",detailedDescription:"Useful for cleanup tasks, post-execution validation, logging the completion of an agent's activity, modifying final state, or augmenting/replacing the agent's final output.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-agent-callback"}],["before_model",{shortDescription:"Called just before the generate_content_async (or equivalent) request is sent to the LLM within an LlmAgent's flow.",detailedDescription:"Allows inspection and modification of the request going to the LLM. Use cases include adding dynamic instructions, injecting few-shot examples based on state, modifying model config, implementing guardrails (like profanity filters), or implementing request-level caching.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-model-callback"}],["after_model",{shortDescription:"Called just after a response (LlmResponse) is received from the LLM, before it's processed further by the invoking agent.",detailedDescription:"Allows inspection or modification of the raw LLM response.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-model-callback"}],["before_tool",{shortDescription:"Called just before a specific tool's run_async method is invoked, after the LLM has generated a function call for it.",detailedDescription:"Allows inspection and modification of tool arguments, performing authorization checks before execution, logging tool usage attempts, or implementing tool-level caching.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#before-tool-callback"}],["after_tool",{shortDescription:"Called just after the tool's run_async method completes successfully.",detailedDescription:"Allows inspection and modification of the tool's result before it's sent back to the LLM (potentially after summarization). Useful for logging tool results, post-processing or formatting results, or saving specific parts of the result to the session state.",docLink:"https://google.github.io/adk-docs/callbacks/types-of-callbacks/#after-tool-callback"}]]);static getToolMenuTooltips(A){return t.toolMenuTooltips.get(A)}static getToolDetailedInfo(A){return t.toolDetailedInfo.get(A)}static getCallbackMenuTooltips(A){return t.callbackMenuTooltips.get(A)}static getCallbackDialogTooltips(A){return t.callbackDialogTooltips.get(A)}static getCallbackDetailedInfo(A){return t.callbackDetailedInfo.get(A)}};function bnA(t,A){if(t&1){let e=Ue();Qa(0),m(1,"div",6)(2,"div",7),ee("click",function(){q(e);let n=M();return W(n.toggleToolInfo())}),m(3,"mat-icon",8),T(4,"info"),p(),m(5,"div",9)(6,"span"),T(7,"Tool Information"),p()(),m(8,"button",10)(9,"mat-icon"),T(10),p()()(),m(11,"div",11)(12,"div",12)(13,"div",13),T(14),p(),m(15,"div",14),T(16),p()(),m(17,"div",15)(18,"a",16)(19,"mat-icon"),T(20,"open_in_new"),p(),m(21,"span"),T(22,"View Official Documentation"),p()()()()(),ma()}if(t&2){let e,i,n,o=M();y(10),Pe(o.isToolInfoExpanded?"expand_less":"expand_more"),y(),iA("expanded",o.isToolInfoExpanded),y(3),Pe((e=o.getToolInfo())==null?null:e.shortDescription),y(2),Pe((i=o.getToolInfo())==null?null:i.detailedDescription),y(2),te("href",(n=o.getToolInfo())==null?null:n.docLink,$r)}}function MnA(t,A){t&1&&(m(0,"mat-hint",19),T(1," Start with a letter or underscore, and contain only letters, digits, and underscores. "),p())}function SnA(t,A){if(t&1){let e=Ue();m(0,"mat-form-field",2)(1,"mat-label"),T(2),p(),m(3,"input",17),qn("ngModelChange",function(n){q(e);let o=M();return Vn(o.inputValue,n)||(o.inputValue=n),W(n)}),ee("keydown",function(n){q(e);let o=M();return W(o.onKeyDown(n))}),p(),ne(4,MnA,2,0,"mat-hint",18),p()}if(t&2){let e=M();y(2),Pe(e.data.inputLabel||"Input"),y(),jn("ngModel",e.inputValue),te("placeholder",e.data.inputPlaceholder||"Enter value"),y(),te("ngIf",!e.isInputValid())}}var f0=class t{constructor(A,e){this.dialogRef=A;this.data=e;this.inputValue=e.inputValue||""}inputValue="";isToolInfoExpanded=!1;isInputValid(){let A=this.inputValue.trim();return!(!A||!/^[a-zA-Z_]/.test(A)||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(A))}onCancel(){this.dialogRef.close()}onConfirm(){if(this.data.showInput){let A=this.inputValue.trim();if(!this.isInputValid())return;this.dialogRef.close(A)}else this.dialogRef.close("confirm")}onKeyDown(A){A.key==="Enter"&&this.data.showInput&&this.onConfirm()}getToolInfo(){if(this.data.toolType)return E0.getToolDetailedInfo(this.data.toolType)}toggleToolInfo(){this.isToolInfoExpanded=!this.isToolInfoExpanded}static \u0275fac=function(e){return new(e||t)(DA(co),DA(qo))};static \u0275cmp=xe({type:t,selectors:[["app-confirmation-dialog"]],decls:12,vars:6,consts:[["mat-dialog-title",""],[4,"ngIf"],[2,"width","100%","margin-top","16px"],["align","end"],["mat-button","",3,"click"],["mat-button","","color","primary","cdkFocusInitial","",3,"click","disabled"],[1,"tool-info-container"],[1,"tool-info-header",3,"click"],[1,"tool-info-icon"],[1,"tool-info-title"],["mat-icon-button","","type","button","aria-label","Toggle tool information",1,"tool-info-toggle"],[1,"tool-info-body"],[1,"tool-info-content"],[1,"tool-info-short"],[1,"tool-info-detailed"],[1,"tool-info-link-container"],["target","_blank","rel","noopener noreferrer",1,"tool-info-link",3,"href"],["matInput","","cdkFocusInitial","",3,"ngModelChange","keydown","ngModel","placeholder"],["style","font-size: 11px; color: #666;",4,"ngIf"],[2,"font-size","11px","color","#666"]],template:function(e,i){e&1&&(m(0,"h2",0),T(1),p(),m(2,"mat-dialog-content"),ne(3,bnA,23,6,"ng-container",1),m(4,"p"),T(5),p(),ne(6,SnA,5,4,"mat-form-field",2),p(),m(7,"mat-dialog-actions",3)(8,"button",4),ee("click",function(){return i.onCancel()}),T(9,"Cancel"),p(),m(10,"button",5),ee("click",function(){return i.onConfirm()}),T(11),p()()),e&2&&(y(),Pe(i.data.title),y(2),te("ngIf",i.data.showToolInfo&&i.getToolInfo()),y(2),Pe(i.data.message),y(),$(i.data.showInput?6:-1),y(4),te("disabled",i.data.showInput&&!i.isInputValid()),y(),FA(" ",i.data.confirmButtonText||"Confirm"," "))},dependencies:[Ur,bg,j0,Un,ya,ir,tr,jr,kr,gl,ds,q0,JB,L1,Gs,Kn,Mr,Fo,Cr],styles:["mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px}.tool-info-container[_ngcontent-%COMP%]{background-color:#8ab4f814;border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.tool-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.tool-info-header[_ngcontent-%COMP%]:hover .tool-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.tool-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.tool-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.tool-info-toggle[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.tool-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.tool-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.tool-info-content[_ngcontent-%COMP%]{flex:1}.tool-info-short[_ngcontent-%COMP%]{font-weight:500;color:#e3e3e3;margin-bottom:8px;line-height:1.4}.tool-info-detailed[_ngcontent-%COMP%]{color:#c4c7ca;font-size:14px;line-height:1.5}.tool-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.tool-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.tool-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.tool-info-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}"]})};function knA(t,A){if(t&1){let e=Ue();Qa(0),m(1,"div",6)(2,"div",7),ee("click",function(){q(e);let n=M();return W(n.toggleToolInfo())}),m(3,"mat-icon",8),T(4,"info"),p(),m(5,"div",9)(6,"span"),T(7,"Tool Information"),p()(),m(8,"button",10)(9,"mat-icon"),T(10),p()()(),m(11,"div",11)(12,"div",12)(13,"div",13),T(14),p(),m(15,"div",14),T(16),p()(),m(17,"div",15)(18,"a",16)(19,"mat-icon"),T(20,"open_in_new"),p(),m(21,"span"),T(22,"View Official Documentation"),p()()()()(),ma()}if(t&2){let e,i,n,o=M();y(10),Pe(o.isToolInfoExpanded?"expand_less":"expand_more"),y(),iA("expanded",o.isToolInfoExpanded),y(3),Pe((e=o.getToolInfo())==null?null:e.shortDescription),y(2),Pe((i=o.getToolInfo())==null?null:i.detailedDescription),y(2),te("href",(n=o.getToolInfo())==null?null:n.docLink,$r)}}function xnA(t,A){if(t&1){let e=Ue();m(0,"mat-form-field",2)(1,"input",17),qn("ngModelChange",function(n){q(e);let o=M();return Vn(o.toolName,n)||(o.toolName=n),W(n)}),ee("keydown.enter",function(){q(e);let n=M();return W(n.addTool())}),p()()}if(t&2){let e=M();y(),jn("ngModel",e.toolName)}}function _nA(t,A){if(t&1&&(m(0,"mat-option",20),T(1),p()),t&2){let e=A.$implicit;te("value",e),y(),FA(" ",e," ")}}function RnA(t,A){if(t&1){let e=Ue();m(0,"mat-form-field",2)(1,"mat-select",18),qn("ngModelChange",function(n){q(e);let o=M();return Vn(o.selectedBuiltInTool,n)||(o.selectedBuiltInTool=n),W(n)}),ne(2,_nA,2,2,"mat-option",19),p()()}if(t&2){let e=M();y(),jn("ngModel",e.selectedBuiltInTool),y(),te("ngForOf",e.builtInTools)}}var II=class t{constructor(A,e){this.data=A;this.dialogRef=e}toolName="";toolType="Function tool";selectedBuiltInTool="google_search";builtInTools=["EnterpriseWebSearchTool","exit_loop","FilesRetrieval","get_user_choice","google_search","load_artifacts","load_memory","LongRunningFunctionTool","preload_memory","url_context","VertexAiRagRetrieval","VertexAiSearchTool"];isEditMode=!1;isToolInfoExpanded=!1;ngOnInit(){this.toolType=this.data.toolType,this.isEditMode=this.data.isEditMode||!1,this.isEditMode&&this.data.toolName&&(this.toolType==="Function tool"?this.toolName=this.data.toolName:this.toolType==="Built-in tool"&&(this.selectedBuiltInTool=this.data.toolName))}addTool(){if(this.toolType==="Function tool"&&!this.toolName.trim())return;let A={toolType:this.toolType,isEditMode:this.isEditMode};this.toolType==="Function tool"?A.name=this.toolName.trim():this.toolType==="Built-in tool"&&(A.name=this.selectedBuiltInTool),this.dialogRef.close(A)}cancel(){this.dialogRef.close()}createDisabled(){return this.toolType==="Function tool"&&!this.toolName.trim()}getToolInfo(){return E0.getToolDetailedInfo(this.toolType)}toggleToolInfo(){this.isToolInfoExpanded=!this.isToolInfoExpanded}static \u0275fac=function(e){return new(e||t)(DA(qo),DA(co))};static \u0275cmp=xe({type:t,selectors:[["app-add-tool-dialog"]],decls:11,vars:6,consts:[["mat-dialog-title","",1,"dialog-title"],[4,"ngIf"],[2,"width","100%"],["align","end"],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click","disabled"],[1,"tool-info-container"],[1,"tool-info-header",3,"click"],[1,"tool-info-icon"],[1,"tool-info-title"],["mat-icon-button","","type","button","aria-label","Toggle tool information",1,"tool-info-toggle"],[1,"tool-info-body"],[1,"tool-info-content"],[1,"tool-info-short"],[1,"tool-info-detailed"],[1,"tool-info-link-container"],["target","_blank","rel","noopener noreferrer",1,"tool-info-link",3,"href"],["matInput","","placeholder","Enter full function name",3,"ngModelChange","keydown.enter","ngModel"],["placeholder","Select built-in tool",3,"ngModelChange","ngModel"],[3,"value",4,"ngFor","ngForOf"],[3,"value"]],template:function(e,i){e&1&&(m(0,"h2",0),T(1),p(),m(2,"mat-dialog-content"),ne(3,knA,23,6,"ng-container",1)(4,xnA,2,1,"mat-form-field",2)(5,RnA,3,2,"mat-form-field",2),p(),m(6,"mat-dialog-actions",3)(7,"button",4),ee("click",function(){return i.cancel()}),T(8,"Cancel"),p(),m(9,"button",5),ee("click",function(){return i.addTool()}),T(10),p()()),e&2&&(y(),Pe(i.isEditMode?"Editing Tool":"Add New Tool"),y(2),te("ngIf",i.getToolInfo()),y(),$(i.toolType==="Function tool"?4:-1),y(),$(i.toolType==="Built-in tool"?5:-1),y(4),te("disabled",i.createDisabled()),y(),FA(" ",i.isEditMode?"Save":"Create"," "))},dependencies:[Ur,k1,bg,Kn,Mr,Fo,Cr,tr,jr,ds,Gs,Yl,Ac,kr,Un,ya,ir],styles:[".dialog-title[_ngcontent-%COMP%]{color:#fff!important;font-family:Google Sans;font-size:24px}mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px}.tool-info-container[_ngcontent-%COMP%]{background-color:#8ab4f814;border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.tool-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.tool-info-header[_ngcontent-%COMP%]:hover .tool-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.tool-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.tool-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.tool-info-toggle[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.tool-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.tool-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.tool-info-content[_ngcontent-%COMP%]{flex:1}.tool-info-short[_ngcontent-%COMP%]{font-weight:500;color:#e3e3e3;margin-bottom:8px;line-height:1.4}.tool-info-detailed[_ngcontent-%COMP%]{color:#c4c7ca;font-size:14px;line-height:1.5}.tool-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.tool-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.tool-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.tool-info-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}"]})};var NnA={google_search:"search",EnterpriseWebSearchTool:"web",VertexAiSearchTool:"search",FilesRetrieval:"find_in_page",load_memory:"memory",preload_memory:"memory",url_context:"link",VertexAiRagRetrieval:"find_in_page",exit_loop:"sync",get_user_choice:"how_to_reg",load_artifacts:"image",LongRunningFunctionTool:"data_object"};function wQ(t,A){return A==="Agent Tool"?"smart_toy":A==="Built-in tool"?NnA[t]||"build":A==="Function tool"?"data_object":"build"}var LnA=(t,A)=>A.name;function FnA(t,A){if(t&1&&T(0),t&2){let e=M();FA(" Configure ",e.selectedBuiltInTool," ")}}function GnA(t,A){if(t&1&&T(0),t&2){let e=M();FA(" ",e.isEditMode?"Edit Built-in Tool":"Add Built-in Tool"," ")}}function KnA(t,A){if(t&1){let e=Ue();m(0,"div",8),ee("click",function(){let n=q(e).$implicit,o=M(3);return W(o.onToolSelected(n))}),m(1,"mat-icon",9),T(2),p(),m(3,"span",10),T(4),p()()}if(t&2){let e=A.$implicit,i=M(3);iA("selected",i.selectedBuiltInTool===e),y(2),Pe(i.getToolIcon(e)),y(2),Pe(e)}}function UnA(t,A){if(t&1&&(m(0,"div",4)(1,"h3",5),T(2),p(),m(3,"div",6),Rt(4,KnA,5,4,"div",7,Fi),p()()),t&2){let e=A.$implicit;y(2),Pe(e.name),y(2),Nt(e.tools)}}function TnA(t,A){if(t&1&&(m(0,"div",1),Rt(1,UnA,6,1,"div",4,LnA),p()),t&2){let e=M();y(),Nt(e.toolCategories)}}function OnA(t,A){if(t&1&&(m(0,"div",2)(1,"h3",11),T(2,"Configure Tool Arguments"),p(),ve(3,"app-json-editor",12),p()),t&2){let e=M();y(3),te("jsonString",e.toolArgsString)}}function JnA(t,A){if(t&1){let e=Ue();m(0,"button",14),ee("click",function(){q(e);let n=M(2);return W(n.backToToolSelection())}),T(1,"Back"),p()}}function YnA(t,A){if(t&1){let e=Ue();ne(0,JnA,2,0,"button",13),m(1,"button",14),ee("click",function(){q(e);let n=M();return W(n.saveArgs())}),T(2),p()}if(t&2){let e=M();$(e.isEditMode?-1:0),y(2),Pe(e.isEditMode?"Save":"Create")}}function HnA(t,A){if(t&1){let e=Ue();m(0,"button",14),ee("click",function(){q(e);let n=M();return W(n.cancel())}),T(1,"Cancel"),p(),m(2,"button",15),ee("click",function(){q(e);let n=M();return W(n.addTool())}),T(3),p()}if(t&2){let e=M();y(3),FA(" ",e.isEditMode?"Save":"Create"," ")}}var Qh=class t{constructor(A,e){this.data=A;this.dialogRef=e}jsonEditorComponent;selectedBuiltInTool="google_search";toolCategories=[{name:"Search Tools",tools:["google_search","EnterpriseWebSearchTool","VertexAiSearchTool"]},{name:"Context Tools",tools:["FilesRetrieval","load_memory","preload_memory","url_context","VertexAiRagRetrieval"]},{name:"Agent Function Tools",tools:["exit_loop","get_user_choice","load_artifacts","LongRunningFunctionTool"]}];builtInToolArgs=new Map([["EnterpriseWebSearchTool",[]],["exit_loop",[]],["FilesRetrieval",["name","description","input_dir"]],["get_user_choice",[]],["google_search",[]],["load_artifacts",[]],["load_memory",[]],["LongRunningFunctionTool",["func"]],["preload_memory",[]],["url_context",[]],["VertexAiRagRetrieval",["name","description","rag_corpora","rag_resources","similarity_top_k","vector_distance_threshold"]],["VertexAiSearchTool",["data_store_id","data_store_specs","search_engine_id","filter","max_results"]]]);isEditMode=!1;showArgsEditor=!1;toolArgs={};toolArgsString="";ngOnInit(){if(this.isEditMode=this.data.isEditMode||!1,this.isEditMode&&this.data.toolName){this.selectedBuiltInTool=this.data.toolName;let A=this.builtInToolArgs.get(this.data.toolName);if(A&&A.length>0){if(this.data.toolArgs)this.toolArgs=ae({},this.data.toolArgs),delete this.toolArgs.skip_summarization;else{this.toolArgs={};for(let e of A)this.toolArgs[e]=""}this.toolArgsString=JSON.stringify(this.toolArgs,null,2),this.showArgsEditor=!0}}}onToolSelected(A){this.selectedBuiltInTool=A;let e=this.builtInToolArgs.get(A);e&&e.length>0&&(this.initializeToolArgs(A,e),this.showArgsEditor=!0)}initializeToolArgs(A,e){this.toolArgs={};for(let i of e)this.toolArgs[i]="";this.toolArgsString=JSON.stringify(this.toolArgs,null,2)}backToToolSelection(){this.showArgsEditor=!1,this.toolArgs={},this.toolArgsString=""}saveArgs(){if(this.jsonEditorComponent)try{this.toolArgsString=this.jsonEditorComponent.getJsonString(),this.toolArgs=JSON.parse(this.toolArgsString)}catch(A){alert("Invalid JSON: "+A);return}this.addTool()}addTool(){let A={toolType:"Built-in tool",name:this.selectedBuiltInTool,isEditMode:this.isEditMode};Object.keys(this.toolArgs).length>0&&(A.args=this.toolArgs),this.dialogRef.close(A)}cancel(){this.dialogRef.close()}getToolIcon(A){return wQ(A,"Built-in tool")}static \u0275fac=function(e){return new(e||t)(DA(qo),DA(co))};static \u0275cmp=xe({type:t,selectors:[["app-built-in-tool-dialog"]],viewQuery:function(e,i){if(e&1&&At(r0,5),e&2){let n;oA(n=rA())&&(i.jsonEditorComponent=n.first)}},decls:9,vars:3,consts:[["mat-dialog-title","",1,"dialog-title"],[1,"tool-categories-container"],[1,"args-editor-container"],["align","end"],[1,"tool-category"],[1,"category-title"],[1,"tool-list"],[1,"tool-item",3,"selected"],[1,"tool-item",3,"click"],[1,"tool-icon"],[1,"tool-name"],[1,"args-editor-title"],[3,"jsonString"],["mat-button",""],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(e,i){e&1&&(m(0,"h2",0),ne(1,FnA,1,1)(2,GnA,1,1),p(),m(3,"mat-dialog-content"),ne(4,TnA,3,0,"div",1)(5,OnA,4,1,"div",2),p(),m(6,"mat-dialog-actions",3),ne(7,YnA,3,2)(8,HnA,4,1),p()),e&2&&(y(),$(i.showArgsEditor?1:2),y(3),$(i.showArgsEditor?5:4),y(3),$(i.showArgsEditor?7:8))},dependencies:[Ur,Kn,tr,jr,ir,kr,Un,r0],styles:[".dialog-title[_ngcontent-%COMP%]{color:#fff!important;font-family:Google Sans;font-size:24px}.tool-categories-container[_ngcontent-%COMP%]{padding:16px 0}.tool-category[_ngcontent-%COMP%]{margin-bottom:24px}.tool-category[_ngcontent-%COMP%]:last-child{margin-bottom:0}.category-title[_ngcontent-%COMP%]{font-family:Google Sans;font-size:16px;font-weight:500;color:#e8eaed;margin:0 0 12px;padding-left:8px}.tool-list[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.tool-item[_ngcontent-%COMP%]{display:flex;align-items:center;padding:12px 16px;border-radius:8px;cursor:pointer;transition:all .2s ease;background-color:#ffffff0d;min-width:0}.tool-item[_ngcontent-%COMP%]:hover{background-color:#ffffff1a}.tool-item.selected[_ngcontent-%COMP%]{background-color:#8ab4f833;border:1px solid #8ab4f8}.tool-item[_ngcontent-%COMP%] .tool-icon[_ngcontent-%COMP%]{color:#8ab4f8;margin-right:12px;font-size:20px;width:20px;height:20px;flex-shrink:0}.tool-item[_ngcontent-%COMP%] .tool-name[_ngcontent-%COMP%]{font-family:Google Sans;font-size:14px;color:#e8eaed;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.args-editor-container[_ngcontent-%COMP%]{padding:16px 0}.args-editor-title[_ngcontent-%COMP%]{font-family:Google Sans;font-size:16px;font-weight:500;color:#e8eaed;margin:0 0 16px}"]})};var znA=["chatMessages"],PnA=(t,A)=>({"user-message":t,"bot-message":A});function jnA(t,A){t&1&&(m(0,"div",7)(1,"mat-icon",12),T(2,"smart_toy"),p(),m(3,"h3"),T(4,"Assistant Ready"),p(),m(5,"p"),T(6,"Your builder assistant is ready to help you build agents."),p()())}function VnA(t,A){t&1&&(m(0,"div",15)(1,"span",16),T(2,"\u30FB\u30FB\u30FB"),p()())}function qnA(t,A){if(t&1&&(m(0,"div",18),T(1,"Assistant"),p(),ve(2,"markdown",19)),t&2){let e=M(2).$implicit;y(2),te("data",e.text)}}function WnA(t,A){if(t&1&&(m(0,"div",17),T(1),p()),t&2){let e=M(2).$implicit;y(),Pe(e.text)}}function ZnA(t,A){if(t&1&&ne(0,qnA,3,1)(1,WnA,2,1,"div",17),t&2){let e=M().$implicit;$(e.role==="bot"?0:1)}}function XnA(t,A){if(t&1&&(m(0,"div",13)(1,"mat-card",14),ne(2,VnA,3,0,"div",15)(3,ZnA,2,1),p()()),t&2){let e=A.$implicit;te("ngClass",tl(2,PnA,e.role==="user",e.role==="bot")),y(2),$(e.isLoading?2:3)}}function $nA(t,A){if(t&1&&Rt(0,XnA,4,5,"div",13,Fi),t&2){let e=M();Nt(e.messages)}}var $9=class t{isVisible=!0;appName="";closePanel=new Ve;reloadCanvas=new Ve;assistantAppName="__adk_agent_builder_assistant";userId="user";currentSession="";userMessage="";messages=[];shouldAutoScroll=!1;isGenerating=!1;chatMessages;agentService=E(Hl);sessionService=E(rd);agentBuilderService=E(Ud);constructor(){}ngOnInit(){this.sessionService.createSession(this.userId,this.assistantAppName).subscribe(A=>{this.currentSession=A.id;let e={appName:this.assistantAppName,userId:this.userId,sessionId:A.id,newMessage:{role:"user",parts:[{text:"hello"}]},streaming:!1,stateDelta:{root_directory:`${this.appName}/tmp/${this.appName}`}};this.messages.push({role:"bot",text:"",isLoading:!0}),this.shouldAutoScroll=!0,this.isGenerating=!0,this.agentService.runSse(e).subscribe({next:i=>Ci(this,null,function*(){if(i.content){let n="";for(let o of i.content.parts)o.text&&(n+=o.text);if(n){let o=this.messages[this.messages.length-1];o.role==="bot"&&o.isLoading&&(o.text=n,o.isLoading=!1,this.shouldAutoScroll=!0)}}}),error:i=>{console.error("SSE error:",i);let n=this.messages[this.messages.length-1];n.role==="bot"&&n.isLoading&&(n.text="Sorry, I encountered an error. Please try again.",n.isLoading=!1,this.shouldAutoScroll=!0),this.isGenerating=!1},complete:()=>{this.isGenerating=!1}})})}onClosePanel(){this.closePanel.emit()}sendMessage(A){if(A.trim()){this.saveAgent(this.appName),A!="____Something went wrong, please try again"&&this.messages.push({role:"user",text:A});let e=A;this.userMessage="",this.messages.push({role:"bot",text:"",isLoading:!0}),this.shouldAutoScroll=!0,this.isGenerating=!0;let i={appName:this.assistantAppName,userId:this.userId,sessionId:this.currentSession,newMessage:{role:"user",parts:[{text:e}]},streaming:!1};this.agentService.runSse(i).subscribe({next:n=>Ci(this,null,function*(){if(n.errorCode&&(n.errorCode=="MALFORMED_FUNCTION_CALL"||n.errorCode=="STOP")){this.sendMessage("____Something went wrong, please try again");return}if(n.content){let o="";for(let r of n.content.parts)r.text&&(o+=r.text);if(o){let r=this.messages[this.messages.length-1];r.role==="bot"&&r.isLoading&&(r.text=o,r.isLoading=!1,this.shouldAutoScroll=!0,this.reloadCanvas.emit())}}}),error:n=>{console.error("SSE error:",n);let o=this.messages[this.messages.length-1];o.role==="bot"&&o.isLoading&&(o.text="Sorry, I encountered an error. Please try again.",o.isLoading=!1,this.shouldAutoScroll=!0),this.isGenerating=!1},complete:()=>{this.isGenerating=!1}})}}ngAfterViewChecked(){this.shouldAutoScroll&&(this.scrollToBottom(),this.shouldAutoScroll=!1)}scrollToBottom(){try{this.chatMessages&&setTimeout(()=>{this.chatMessages.nativeElement.scrollTop=this.chatMessages.nativeElement.scrollHeight},50)}catch(A){console.error("Error scrolling to bottom:",A)}}onKeyDown(A){if(A.key==="Enter"){if(A.shiftKey)return;this.userMessage?.trim()&&this.currentSession&&(A.preventDefault(),this.sendMessage(this.userMessage))}}saveAgent(A){let e=this.agentBuilderService.getRootNode();if(!e)return;let i=new FormData,n=this.agentBuilderService.getCurrentAgentToolBoards();zd.generateYamlFile(e,i,A,n),this.agentService.agentBuildTmp(i).subscribe(o=>{console.log(o?"save to tmp":"something went wrong")})}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-builder-assistant"]],viewQuery:function(e,i){if(e&1&&At(znA,5),e&2){let n;oA(n=rA())&&(i.chatMessages=n.first)}},inputs:{isVisible:"isVisible",appName:"appName"},outputs:{closePanel:"closePanel",reloadCanvas:"reloadCanvas"},decls:21,vars:6,consts:[["chatMessages",""],[1,"builder-assistant-panel"],[1,"panel-header"],[1,"panel-title"],["mat-icon-button","","matTooltip","Close assistant panel",1,"close-btn",3,"click"],[1,"panel-content"],[1,"chat-messages"],[1,"assistant-placeholder"],[1,"chat-input-container"],[1,"input-wrapper"],["cdkTextareaAutosize","","cdkAutosizeMinRows","1","cdkAutosizeMaxRows","5","placeholder","Ask Gemini to build your agent",1,"assistant-input-box",3,"ngModelChange","keydown","ngModel","disabled"],["mat-icon-button","","matTooltip","Send message",1,"send-button",3,"click","disabled"],[1,"large-icon"],[3,"ngClass"],[1,"message-card"],[1,"loading-message"],[1,"dots"],[1,"message-text"],[1,"bot-label"],[1,"message-text",3,"data"]],template:function(e,i){if(e&1){let n=Ue();m(0,"div",1)(1,"div",2)(2,"div",3)(3,"mat-icon"),T(4,"auto_awesome"),p(),m(5,"span"),T(6,"Assistant"),p()(),m(7,"button",4),ee("click",function(){return q(n),W(i.onClosePanel())}),m(8,"mat-icon"),T(9,"close"),p()()(),m(10,"div",5)(11,"div",6,0),ne(13,jnA,7,0,"div",7)(14,$nA,2,0),p(),m(15,"div",8)(16,"div",9)(17,"textarea",10),qn("ngModelChange",function(r){return q(n),Vn(i.userMessage,r)||(i.userMessage=r),W(r)}),ee("keydown",function(r){return q(n),W(i.onKeyDown(r))}),p(),m(18,"button",11),ee("click",function(){return q(n),W(i.sendMessage(i.userMessage.trim()))}),m(19,"mat-icon"),T(20,"send"),p()()()()()()}e&2&&(iA("hidden",!i.isVisible),y(13),$(i.messages.length===0?13:14),y(4),jn("ngModel",i.userMessage),te("disabled",i.isGenerating),y(),te("disabled",!(i.userMessage!=null&&i.userMessage.trim())||i.isGenerating))},dependencies:[Ur,ta,Kn,Mr,Fo,Cr,ir,ya,Ma,sE,YB,z5,wy],styles:[".builder-assistant-panel[_ngcontent-%COMP%]{position:fixed;right:0;top:0;width:400px;height:100vh;background:#2b2b2b;border-left:1px solid #3c3c3c;box-shadow:-2px 0 10px #0006;z-index:1000;display:flex;flex-direction:column;transition:transform .3s ease}.builder-assistant-panel.hidden[_ngcontent-%COMP%]{transform:translate(100%)}.panel-header[_ngcontent-%COMP%]{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid #3c3c3c;background:#292929}.panel-title[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;font-weight:400;font-size:16px;color:#e3e3e3;font-family:Google Sans,Helvetica Neue,sans-serif}.panel-title[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:#e3e3e3;font-size:20px;width:20px;height:20px}.close-btn[_ngcontent-%COMP%]{color:#c4c7c5}.close-btn[_ngcontent-%COMP%]:hover{color:#e8eaed;background-color:#8ab4f81a}.panel-content[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;background:#2b2b2b;overflow:hidden}.assistant-placeholder[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;height:300px;color:#9aa0a6}.assistant-placeholder[_ngcontent-%COMP%] .large-icon[_ngcontent-%COMP%]{font-size:64px;width:64px;height:64px;margin-bottom:16px;color:#8ab4f8}.assistant-placeholder[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0 0 8px;font-size:20px;font-weight:500;color:#e8eaed;font-family:Google Sans,Helvetica Neue,sans-serif}.assistant-placeholder[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;font-size:14px;line-height:1.5;color:#9aa0a6}.chat-messages[_ngcontent-%COMP%]{flex:1;padding:20px;overflow-y:auto;display:flex;flex-direction:column}.chat-input-container[_ngcontent-%COMP%]{padding:16px 20px 20px;border-top:none;background:#2b2b2b}.input-wrapper[_ngcontent-%COMP%]{display:flex;align-items:center;background-color:#1a1a1a;border-radius:50px;padding:10px 6px 10px 18px;gap:8px}.assistant-input-box[_ngcontent-%COMP%]{flex:1;color:#e0e0e0;border:none;padding:0;background:transparent;resize:none;overflow:hidden;font-family:Google Sans,Helvetica Neue,sans-serif;font-size:14px;line-height:20px;min-height:20px;max-height:120px}.assistant-input-box[_ngcontent-%COMP%]::placeholder{color:gray;font-size:14px}.assistant-input-box[_ngcontent-%COMP%]:focus{outline:none}.assistant-input-box[_ngcontent-%COMP%]::-webkit-scrollbar{width:4px}.assistant-input-box[_ngcontent-%COMP%]::-webkit-scrollbar-thumb{background:#4a4a4a;border-radius:4px}.send-button[_ngcontent-%COMP%]{background-color:transparent;color:#888;width:36px;height:36px;min-width:36px;flex-shrink:0;margin:0;padding:0}.send-button[_ngcontent-%COMP%] .mat-mdc-button-touch-target{display:none}.send-button[_ngcontent-%COMP%] .mat-mdc-button-persistent-ripple{display:none}.send-button[_ngcontent-%COMP%]:disabled{background-color:transparent;color:#4a4a4a}.send-button[_ngcontent-%COMP%]:hover:not(:disabled){background-color:#ffffff14;color:#b0b0b0;border-radius:50%}.send-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.message-card[_ngcontent-%COMP%]{padding:10px 16px;margin:6px 0;font-size:14px;font-weight:400;position:relative;display:block;box-shadow:none;line-height:1.5;width:100%}.user-message[_ngcontent-%COMP%]{display:block;width:100%;margin-bottom:12px}.user-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{background-color:#1a1a1a;border:1px solid #404040;border-radius:4px;color:#e3e3e3;padding:8px 12px}.bot-message[_ngcontent-%COMP%]{display:block;width:100%;margin-bottom:0}.bot-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{background-color:transparent;border:none;border-radius:0;color:#d4d4d4;padding:0;margin:0}.bot-label[_ngcontent-%COMP%]{font-size:12px;font-weight:500;color:#9aa0a6;margin-bottom:8px;font-family:Google Sans,Helvetica Neue,sans-serif}.message-text[_ngcontent-%COMP%]{white-space:pre-line;word-break:break-word;overflow-wrap:break-word;font-family:Google Sans,Helvetica Neue,sans-serif}.message-text[_ngcontent-%COMP%] p{margin:0;line-height:1.4}.message-text[_ngcontent-%COMP%] p:first-child{margin-top:0}.message-text[_ngcontent-%COMP%] p:last-child{margin-bottom:0}.message-text[_ngcontent-%COMP%] ul, .message-text[_ngcontent-%COMP%] ol{margin:0;padding-left:1.5em}.message-text[_ngcontent-%COMP%] li{margin:0}.message-text[_ngcontent-%COMP%] code{background-color:#ffffff1a;padding:2px 4px;border-radius:3px;font-family:Monaco,Menlo,Ubuntu Mono,monospace;font-size:.9em}.message-text[_ngcontent-%COMP%] pre{background-color:#ffffff0d;padding:8px 12px;border-radius:6px;overflow-x:auto;margin:.5em 0}.message-text[_ngcontent-%COMP%] pre code{background:none;padding:0}.message-text[_ngcontent-%COMP%] blockquote{border-left:3px solid #8ab4f8;padding-left:12px;margin:.5em 0;font-style:italic;color:#c4c7c5}.message-text[_ngcontent-%COMP%] strong{font-weight:600}.message-text[_ngcontent-%COMP%] em{font-style:italic}.loading-message[_ngcontent-%COMP%]{display:flex;align-items:center;color:#9aa0a6;font-family:Google Sans,Helvetica Neue,sans-serif;padding:0;margin:0}.loading-message[_ngcontent-%COMP%] .dots[_ngcontent-%COMP%]{font-size:24px;letter-spacing:-12px;animation:_ngcontent-%COMP%_pulse 1.4s ease-in-out infinite;display:inline-block;line-height:1}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:.3}50%{opacity:1}}"]})};var yQ=class t{constructor(A,e){this.http=A;this.zone=e}apiServerDomain=oa.getApiServerBaseUrl();_currentApp=new Mt("");currentApp=this._currentApp.asObservable();isLoading=new Mt(!1);getApp(){return this.currentApp}setApp(A){this._currentApp.next(A)}getLoadingState(){return this.isLoading}runSse(A){let e=this.apiServerDomain+"/run_sse";return this.isLoading.next(!0),new nt(i=>{let n=this;fetch(e,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream"},body:JSON.stringify(A)}).then(o=>{let r=o.body?.getReader(),s=new TextDecoder("utf-8"),a="",c=()=>{r?.read().then(({done:l,value:d})=>{if(this.isLoading.next(!0),l)return this.isLoading.next(!1),i.complete();let C=s.decode(d,{stream:!0});a+=C;try{a.split(/\r?\n/).filter(u=>u.startsWith("data:")).forEach(u=>{let h=u.replace(/^data:\s*/,""),B=JSON.parse(h);n.zone.run(()=>i.next(B))}),a=""}catch(I){I instanceof SyntaxError&&c()}c()}).catch(l=>{n.zone.run(()=>i.error(l))})};c()}).catch(o=>{n.zone.run(()=>i.error(o))})})}listApps(){if(this.apiServerDomain!=null){let A=this.apiServerDomain+"/list-apps?relative_path=./";return this.http.get(A)}return new nt}agentBuild(A){if(this.apiServerDomain!=null){let e=this.apiServerDomain+"/builder/save";return this.http.post(e,A)}return new nt}agentBuildTmp(A){if(this.apiServerDomain!=null){let e=this.apiServerDomain+"/builder/save?tmp=true";return this.http.post(e,A)}return new nt}getAgentBuilder(A){if(this.apiServerDomain!=null){let e=this.apiServerDomain+`/builder/app/${A}?ts=${Date.now()}`;return this.http.get(e,{responseType:"text"})}return new nt}getAgentBuilderTmp(A){if(this.apiServerDomain!=null){let e=this.apiServerDomain+`/builder/app/${A}?ts=${Date.now()}&tmp=true`;return this.http.get(e,{responseType:"text"})}return new nt}getSubAgentBuilder(A,e){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/builder/app/${A}?ts=${Date.now()}&file_path=${e}&tmp=true`;return this.http.get(i,{responseType:"text"})}return new nt}agentChangeCancel(A){if(this.apiServerDomain!=null){let e=this.apiServerDomain+`/builder/app/${A}/cancel`;return this.http.post(e,{})}return new nt}static \u0275fac=function(e){return new(e||t)(UA(wa),UA(yA))};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})};var eS="http://www.w3.org/1999/xhtml",oz={svg:"http://www.w3.org/2000/svg",xhtml:eS,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function r1(t){var A=t+="",e=A.indexOf(":");return e>=0&&(A=t.slice(0,e))!=="xmlns"&&(t=t.slice(e+1)),oz.hasOwnProperty(A)?{space:oz[A],local:t}:t}function AoA(t){return function(){var A=this.ownerDocument,e=this.namespaceURI;return e===eS&&A.documentElement.namespaceURI===eS?A.createElement(t):A.createElementNS(e,t)}}function toA(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function AS(t){var A=r1(t);return(A.local?toA:AoA)(A)}function ioA(){}function mh(t){return t==null?ioA:function(){return this.querySelector(t)}}function eue(t){typeof t!="function"&&(t=mh(t));for(var A=this._groups,e=A.length,i=new Array(e),n=0;n=k&&(k=b+1);!(w=B[k])&&++k=0;)(r=i[n])&&(o&&r.compareDocumentPosition(o)^4&&o.parentNode.insertBefore(r,o),o=r);return this}function due(t){t||(t=hoA);function A(d,C){return d&&C?t(d.__data__,C.__data__):!d-!C}for(var e=this._groups,i=e.length,n=new Array(i),o=0;oA?1:t>=A?0:NaN}function Cue(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}function Iue(){return Array.from(this)}function uue(){for(var t=this._groups,A=0,e=t.length;A1?this.each((A==null?woA:typeof A=="function"?DoA:yoA)(t,A,e??"")):uI(this.node(),t)}function uI(t,A){return t.style.getPropertyValue(A)||nS(t).getComputedStyle(t,null).getPropertyValue(A)}function voA(t){return function(){delete this[t]}}function boA(t,A){return function(){this[t]=A}}function MoA(t,A){return function(){var e=A.apply(this,arguments);e==null?delete this[t]:this[t]=e}}function mue(t,A){return arguments.length>1?this.each((A==null?voA:typeof A=="function"?MoA:boA)(t,A)):this.node()[t]}function pue(t){return t.trim().split(/^|\s+/)}function sz(t){return t.classList||new wue(t)}function wue(t){this._node=t,this._names=pue(t.getAttribute("class")||"")}wue.prototype={add:function(t){var A=this._names.indexOf(t);A<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var A=this._names.indexOf(t);A>=0&&(this._names.splice(A,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};function yue(t,A){for(var e=sz(t),i=-1,n=A.length;++i=0&&(e=A.slice(i+1),A=A.slice(0,i)),{type:A,name:e}})}function PoA(t){return function(){var A=this.__on;if(A){for(var e=0,i=-1,n=A.length,o;e{}};function Yue(){for(var t=0,A=arguments.length,e={},i;t=0&&(i=e.slice(n+1),e=e.slice(0,n)),e&&!A.hasOwnProperty(e))throw new Error("unknown type: "+e);return{type:e,name:i}})}oS.prototype=Yue.prototype={constructor:oS,on:function(t,A){var e=this._,i=XoA(t+"",e),n,o=-1,r=i.length;if(arguments.length<2){for(;++o0)for(var e=new Array(n),i=0,n,o;i()=>t;function K6(t,{sourceEvent:A,subject:e,target:i,identifier:n,active:o,x:r,y:s,dx:a,dy:c,dispatch:l}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:A,enumerable:!0,configurable:!0},subject:{value:e,enumerable:!0,configurable:!0},target:{value:i,enumerable:!0,configurable:!0},identifier:{value:n,enumerable:!0,configurable:!0},active:{value:o,enumerable:!0,configurable:!0},x:{value:r,enumerable:!0,configurable:!0},y:{value:s,enumerable:!0,configurable:!0},dx:{value:a,enumerable:!0,configurable:!0},dy:{value:c,enumerable:!0,configurable:!0},_:{value:l}})}K6.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};function erA(t){return!t.ctrlKey&&!t.button}function ArA(){return this.parentNode}function trA(t,A){return A??{x:t.x,y:t.y}}function irA(){return navigator.maxTouchPoints||"ontouchstart"in this}function sS(){var t=erA,A=ArA,e=trA,i=irA,n={},o=ph("start","drag","end"),r=0,s,a,c,l,d=0;function C(S){S.on("mousedown.drag",I).filter(i).on("touchstart.drag",B).on("touchmove.drag",f,Hue).on("touchend.drag touchcancel.drag",b).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function I(S,w){if(!(l||!t.call(this,S,w))){var _=k(this,A.call(this,S,w),S,w,"mouse");_&&(js(S.view).on("mousemove.drag",u,wh).on("mouseup.drag",h,wh),L6(S.view),rS(S),c=!1,s=S.clientX,a=S.clientY,_("start",S))}}function u(S){if(hI(S),!c){var w=S.clientX-s,_=S.clientY-a;c=w*w+_*_>d}n.mouse("drag",S)}function h(S){js(S.view).on("mousemove.drag mouseup.drag",null),F6(S.view,c),hI(S),n.mouse("end",S)}function B(S,w){if(t.call(this,S,w)){var _=S.changedTouches,K=A.call(this,S,w),J=_.length,O,H;for(O=0;O>8&15|A>>4&240,A>>4&15|A&240,(A&15)<<4|A&15,1):e===8?cS(A>>24&255,A>>16&255,A>>8&255,(A&255)/255):e===4?cS(A>>12&15|A>>8&240,A>>8&15|A>>4&240,A>>4&15|A&240,((A&15)<<4|A&15)/255):null):(A=orA.exec(t))?new zc(A[1],A[2],A[3],1):(A=rrA.exec(t))?new zc(A[1]*255/100,A[2]*255/100,A[3]*255/100,1):(A=srA.exec(t))?cS(A[1],A[2],A[3],A[4]):(A=arA.exec(t))?cS(A[1]*255/100,A[2]*255/100,A[3]*255/100,A[4]):(A=crA.exec(t))?Zue(A[1],A[2]/100,A[3]/100,1):(A=lrA.exec(t))?Zue(A[1],A[2]/100,A[3]/100,A[4]):zue.hasOwnProperty(t)?Vue(zue[t]):t==="transparent"?new zc(NaN,NaN,NaN,0):null}function Vue(t){return new zc(t>>16&255,t>>8&255,t&255,1)}function cS(t,A,e,i){return i<=0&&(t=A=e=NaN),new zc(t,A,e,i)}function CrA(t){return t instanceof O6||(t=BI(t)),t?(t=t.rgb(),new zc(t.r,t.g,t.b,t.opacity)):new zc}function vQ(t,A,e,i){return arguments.length===1?CrA(t):new zc(t,A,e,i??1)}function zc(t,A,e,i){this.r=+t,this.g=+A,this.b=+e,this.opacity=+i}aS(zc,vQ,cz(O6,{brighter(t){return t=t==null?gS:Math.pow(gS,t),new zc(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?U6:Math.pow(U6,t),new zc(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new zc(Dh(this.r),Dh(this.g),Dh(this.b),dS(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:que,formatHex:que,formatHex8:IrA,formatRgb:Wue,toString:Wue}));function que(){return`#${yh(this.r)}${yh(this.g)}${yh(this.b)}`}function IrA(){return`#${yh(this.r)}${yh(this.g)}${yh(this.b)}${yh((isNaN(this.opacity)?1:this.opacity)*255)}`}function Wue(){let t=dS(this.opacity);return`${t===1?"rgb(":"rgba("}${Dh(this.r)}, ${Dh(this.g)}, ${Dh(this.b)}${t===1?")":`, ${t})`}`}function dS(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Dh(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function yh(t){return t=Dh(t),(t<16?"0":"")+t.toString(16)}function Zue(t,A,e,i){return i<=0?t=A=e=NaN:e<=0||e>=1?t=A=NaN:A<=0&&(t=NaN),new Q0(t,A,e,i)}function $ue(t){if(t instanceof Q0)return new Q0(t.h,t.s,t.l,t.opacity);if(t instanceof O6||(t=BI(t)),!t)return new Q0;if(t instanceof Q0)return t;t=t.rgb();var A=t.r/255,e=t.g/255,i=t.b/255,n=Math.min(A,e,i),o=Math.max(A,e,i),r=NaN,s=o-n,a=(o+n)/2;return s?(A===o?r=(e-i)/s+(e0&&a<1?0:r,new Q0(r,s,a,t.opacity)}function ehe(t,A,e,i){return arguments.length===1?$ue(t):new Q0(t,A,e,i??1)}function Q0(t,A,e,i){this.h=+t,this.s=+A,this.l=+e,this.opacity=+i}aS(Q0,ehe,cz(O6,{brighter(t){return t=t==null?gS:Math.pow(gS,t),new Q0(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?U6:Math.pow(U6,t),new Q0(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,A=isNaN(t)||isNaN(this.s)?0:this.s,e=this.l,i=e+(e<.5?e:1-e)*A,n=2*e-i;return new zc(lz(t>=240?t-240:t+120,n,i),lz(t,n,i),lz(t<120?t+240:t-120,n,i),this.opacity)},clamp(){return new Q0(Xue(this.h),lS(this.s),lS(this.l),dS(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let t=dS(this.opacity);return`${t===1?"hsl(":"hsla("}${Xue(this.h)}, ${lS(this.s)*100}%, ${lS(this.l)*100}%${t===1?")":`, ${t})`}`}}));function Xue(t){return t=(t||0)%360,t<0?t+360:t}function lS(t){return Math.max(0,Math.min(1,t||0))}function lz(t,A,e){return(t<60?A+(e-A)*t/60:t<180?e:t<240?A+(e-A)*(240-t)/60:A)*255}function gz(t,A,e,i,n){var o=t*t,r=o*t;return((1-3*t+3*o-r)*A+(4-6*o+3*r)*e+(1+3*t+3*o-3*r)*i+r*n)/6}function Ahe(t){var A=t.length-1;return function(e){var i=e<=0?e=0:e>=1?(e=1,A-1):Math.floor(e*A),n=t[i],o=t[i+1],r=i>0?t[i-1]:2*n-o,s=i()=>t;function urA(t,A){return function(e){return t+e*A}}function hrA(t,A,e){return t=Math.pow(t,e),A=Math.pow(A,e)-t,e=1/e,function(i){return Math.pow(t+i*A,e)}}function ihe(t){return(t=+t)==1?CS:function(A,e){return e-A?hrA(A,e,t):dz(isNaN(A)?e:A)}}function CS(t,A){var e=A-t;return e?urA(t,e):dz(isNaN(t)?A:t)}var IS=function t(A){var e=ihe(A);function i(n,o){var r=e((n=vQ(n)).r,(o=vQ(o)).r),s=e(n.g,o.g),a=e(n.b,o.b),c=CS(n.opacity,o.opacity);return function(l){return n.r=r(l),n.g=s(l),n.b=a(l),n.opacity=c(l),n+""}}return i.gamma=t,i}(1);function nhe(t){return function(A){var e=A.length,i=new Array(e),n=new Array(e),o=new Array(e),r,s;for(r=0;re&&(o=A.slice(e,o),s[r]?s[r]+=o:s[++r]=o),(i=i[0])===(n=n[0])?s[r]?s[r]+=n:s[++r]=n:(s[++r]=null,a.push({i:r,x:ug(i,n)})),e=Cz.lastIndex;return e180?l+=360:l-c>180&&(c+=360),C.push({i:d.push(n(d)+"rotate(",null,i)-2,x:ug(c,l)})):l&&d.push(n(d)+"rotate("+l+i)}function s(c,l,d,C){c!==l?C.push({i:d.push(n(d)+"skewX(",null,i)-2,x:ug(c,l)}):l&&d.push(n(d)+"skewX("+l+i)}function a(c,l,d,C,I,u){if(c!==d||l!==C){var h=I.push(n(I)+"scale(",null,",",null,")");u.push({i:h-4,x:ug(c,d)},{i:h-2,x:ug(l,C)})}else(d!==1||C!==1)&&I.push(n(I)+"scale("+d+","+C+")")}return function(c,l){var d=[],C=[];return c=t(c),l=t(l),o(c.translateX,c.translateY,l.translateX,l.translateY,d,C),r(c.rotate,l.rotate,d,C),s(c.skewX,l.skewX,d,C),a(c.scaleX,c.scaleY,l.scaleX,l.scaleY,d,C),c=l=null,function(I){for(var u=-1,h=C.length,B;++u=0&&t._call.call(void 0,A),t=t._next;--bQ}function lhe(){vh=(ES=z6.now())+fS,bQ=Y6=0;try{Che()}finally{bQ=0,vrA(),vh=0}}function DrA(){var t=z6.now(),A=t-ES;A>ghe&&(fS-=A,ES=t)}function vrA(){for(var t,A=BS,e,i=1/0;A;)A._call?(i>A._time&&(i=A._time),t=A,A=A._next):(e=A._next,A._next=null,A=t?t._next=e:BS=e);H6=t,Qz(i)}function Qz(t){if(!bQ){Y6&&(Y6=clearTimeout(Y6));var A=t-vh;A>24?(t<1/0&&(Y6=setTimeout(lhe,t-z6.now()-fS)),J6&&(J6=clearInterval(J6))):(J6||(ES=z6.now(),J6=setInterval(DrA,ghe)),bQ=1,dhe(lhe))}}function mS(t,A,e){var i=new P6;return A=A==null?0:+A,i.restart(n=>{i.stop(),t(n+A)},A,e),i}var brA=ph("start","end","cancel","interrupt"),MrA=[],hhe=0,Ihe=1,wS=2,pS=3,uhe=4,yS=5,V6=6;function EI(t,A,e,i,n,o){var r=t.__transition;if(!r)t.__transition={};else if(e in r)return;SrA(t,e,{name:A,index:i,group:n,on:brA,tween:MrA,time:o.time,delay:o.delay,duration:o.duration,ease:o.ease,timer:null,state:hhe})}function q6(t,A){var e=xs(t,A);if(e.state>hhe)throw new Error("too late; already scheduled");return e}function ha(t,A){var e=xs(t,A);if(e.state>pS)throw new Error("too late; already running");return e}function xs(t,A){var e=t.__transition;if(!e||!(e=e[A]))throw new Error("transition not found");return e}function SrA(t,A,e){var i=t.__transition,n;i[A]=e,e.timer=QS(o,0,e.time);function o(c){e.state=Ihe,e.timer.restart(r,e.delay,e.time),e.delay<=c&&r(c-e.delay)}function r(c){var l,d,C,I;if(e.state!==Ihe)return a();for(l in i)if(I=i[l],I.name===e.name){if(I.state===pS)return mS(r);I.state===uhe?(I.state=V6,I.timer.stop(),I.on.call("interrupt",t,t.__data__,I.index,I.group),delete i[l]):+lwS&&i.state=0&&(A=A.slice(0,e)),!A||A==="start"})}function qrA(t,A,e){var i,n,o=VrA(A)?q6:ha;return function(){var r=o(this,t),s=r.on;s!==i&&(n=(i=s).copy()).on(A,e),r.on=n}}function bhe(t,A){var e=this._id;return arguments.length<2?xs(this.node(),e).on.on(t):this.each(qrA(e,t,A))}function WrA(t){return function(){var A=this.parentNode;for(var e in this.__transition)if(+e!==t)return;A&&A.removeChild(this)}}function Mhe(){return this.on("end.remove",WrA(this._id))}function She(t){var A=this._name,e=this._id;typeof t!="function"&&(t=mh(t));for(var i=this._groups,n=i.length,o=new Array(n),r=0;r()=>t;function mz(t,{sourceEvent:A,target:e,transform:i,dispatch:n}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:A,enumerable:!0,configurable:!0},target:{value:e,enumerable:!0,configurable:!0},transform:{value:i,enumerable:!0,configurable:!0},_:{value:n}})}function m0(t,A,e){this.k=t,this.x=A,this.y=e}m0.prototype={constructor:m0,scale:function(t){return t===1?this:new m0(this.k*t,this.x,this.y)},translate:function(t,A){return t===0&A===0?this:new m0(this.k,this.x+this.k*t,this.y+this.k*A)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var fI=new m0(1,0,0);pz.prototype=m0.prototype;function pz(t){for(;!t.__zoom;)if(!(t=t.parentNode))return fI;return t.__zoom}function MS(t){t.stopImmediatePropagation()}function SQ(t){t.preventDefault(),t.stopImmediatePropagation()}function gsA(t){return(!t.ctrlKey||t.type==="wheel")&&!t.button}function dsA(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t,t.hasAttribute("viewBox")?(t=t.viewBox.baseVal,[[t.x,t.y],[t.x+t.width,t.y+t.height]]):[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]):[[0,0],[t.clientWidth,t.clientHeight]]}function Ohe(){return this.__zoom||fI}function CsA(t){return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function IsA(){return navigator.maxTouchPoints||"ontouchstart"in this}function usA(t,A,e){var i=t.invertX(A[0][0])-e[0][0],n=t.invertX(A[1][0])-e[1][0],o=t.invertY(A[0][1])-e[0][1],r=t.invertY(A[1][1])-e[1][1];return t.translate(n>i?(i+n)/2:Math.min(0,i)||Math.max(0,n),r>o?(o+r)/2:Math.min(0,o)||Math.max(0,r))}function wz(){var t=gsA,A=dsA,e=usA,i=CsA,n=IsA,o=[0,1/0],r=[[-1/0,-1/0],[1/0,1/0]],s=250,a=fz,c=ph("start","zoom","end"),l,d,C,I=500,u=150,h=0,B=10;function f(P){P.property("__zoom",Ohe).on("wheel.zoom",J,{passive:!1}).on("mousedown.zoom",O).on("dblclick.zoom",H).filter(n).on("touchstart.zoom",V).on("touchmove.zoom",Z).on("touchend.zoom touchcancel.zoom",ye).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}f.transform=function(P,se,X,ue){var oe=P.selection?P.selection():P;oe.property("__zoom",Ohe),P!==oe?w(P,se,X,ue):oe.interrupt().each(function(){_(this,arguments).event(ue).start().zoom(null,typeof se=="function"?se.apply(this,arguments):se).end()})},f.scaleBy=function(P,se,X,ue){f.scaleTo(P,function(){var oe=this.__zoom.k,le=typeof se=="function"?se.apply(this,arguments):se;return oe*le},X,ue)},f.scaleTo=function(P,se,X,ue){f.transform(P,function(){var oe=A.apply(this,arguments),le=this.__zoom,me=X==null?S(oe):typeof X=="function"?X.apply(this,arguments):X,Te=le.invert(me),$e=typeof se=="function"?se.apply(this,arguments):se;return e(k(b(le,$e),me,Te),oe,r)},X,ue)},f.translateBy=function(P,se,X,ue){f.transform(P,function(){return e(this.__zoom.translate(typeof se=="function"?se.apply(this,arguments):se,typeof X=="function"?X.apply(this,arguments):X),A.apply(this,arguments),r)},null,ue)},f.translateTo=function(P,se,X,ue,oe){f.transform(P,function(){var le=A.apply(this,arguments),me=this.__zoom,Te=ue==null?S(le):typeof ue=="function"?ue.apply(this,arguments):ue;return e(fI.translate(Te[0],Te[1]).scale(me.k).translate(typeof se=="function"?-se.apply(this,arguments):-se,typeof X=="function"?-X.apply(this,arguments):-X),le,r)},ue,oe)};function b(P,se){return se=Math.max(o[0],Math.min(o[1],se)),se===P.k?P:new m0(se,P.x,P.y)}function k(P,se,X){var ue=se[0]-X[0]*P.k,oe=se[1]-X[1]*P.k;return ue===P.x&&oe===P.y?P:new m0(P.k,ue,oe)}function S(P){return[(+P[0][0]+ +P[1][0])/2,(+P[0][1]+ +P[1][1])/2]}function w(P,se,X,ue){P.on("start.zoom",function(){_(this,arguments).event(ue).start()}).on("interrupt.zoom end.zoom",function(){_(this,arguments).event(ue).end()}).tween("zoom",function(){var oe=this,le=arguments,me=_(oe,le).event(ue),Te=A.apply(oe,le),$e=X==null?S(Te):typeof X=="function"?X.apply(oe,le):X,Je=Math.max(Te[1][0]-Te[0][0],Te[1][1]-Te[0][1]),Qe=oe.__zoom,He=typeof se=="function"?se.apply(oe,le):se,PA=a(Qe.invert($e).concat(Je/Qe.k),He.invert($e).concat(Je/He.k));return function(JA){if(JA===1)JA=He;else{var Ye=PA(JA),Ie=Je/Ye[2];JA=new m0(Ie,$e[0]-Ye[0]*Ie,$e[1]-Ye[1]*Ie)}me.zoom(null,JA)}})}function _(P,se,X){return!X&&P.__zooming||new K(P,se)}function K(P,se){this.that=P,this.args=se,this.active=0,this.sourceEvent=null,this.extent=A.apply(P,se),this.taps=0}K.prototype={event:function(P){return P&&(this.sourceEvent=P),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(P,se){return this.mouse&&P!=="mouse"&&(this.mouse[1]=se.invert(this.mouse[0])),this.touch0&&P!=="touch"&&(this.touch0[1]=se.invert(this.touch0[0])),this.touch1&&P!=="touch"&&(this.touch1[1]=se.invert(this.touch1[0])),this.that.__zoom=se,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(P){var se=js(this.that).datum();c.call(P,this.that,new mz(P,{sourceEvent:this.sourceEvent,target:f,type:P,transform:this.that.__zoom,dispatch:c}),se)}};function J(P,...se){if(!t.apply(this,arguments))return;var X=_(this,se).event(P),ue=this.__zoom,oe=Math.max(o[0],Math.min(o[1],ue.k*Math.pow(2,i.apply(this,arguments)))),le=Ig(P);if(X.wheel)(X.mouse[0][0]!==le[0]||X.mouse[0][1]!==le[1])&&(X.mouse[1]=ue.invert(X.mouse[0]=le)),clearTimeout(X.wheel);else{if(ue.k===oe)return;X.mouse=[le,ue.invert(le)],bh(this),X.start()}SQ(P),X.wheel=setTimeout(me,u),X.zoom("mouse",e(k(b(ue,oe),X.mouse[0],X.mouse[1]),X.extent,r));function me(){X.wheel=null,X.end()}}function O(P,...se){if(C||!t.apply(this,arguments))return;var X=P.currentTarget,ue=_(this,se,!0).event(P),oe=js(P.view).on("mousemove.zoom",$e,!0).on("mouseup.zoom",Je,!0),le=Ig(P,X),me=P.clientX,Te=P.clientY;L6(P.view),MS(P),ue.mouse=[le,this.__zoom.invert(le)],bh(this),ue.start();function $e(Qe){if(SQ(Qe),!ue.moved){var He=Qe.clientX-me,PA=Qe.clientY-Te;ue.moved=He*He+PA*PA>h}ue.event(Qe).zoom("mouse",e(k(ue.that.__zoom,ue.mouse[0]=Ig(Qe,X),ue.mouse[1]),ue.extent,r))}function Je(Qe){oe.on("mousemove.zoom mouseup.zoom",null),F6(Qe.view,ue.moved),SQ(Qe),ue.event(Qe).end()}}function H(P,...se){if(t.apply(this,arguments)){var X=this.__zoom,ue=Ig(P.changedTouches?P.changedTouches[0]:P,this),oe=X.invert(ue),le=X.k*(P.shiftKey?.5:2),me=e(k(b(X,le),ue,oe),A.apply(this,se),r);SQ(P),s>0?js(this).transition().duration(s).call(w,me,ue,P):js(this).call(f.transform,me,ue,P)}}function V(P,...se){if(t.apply(this,arguments)){var X=P.touches,ue=X.length,oe=_(this,se,P.changedTouches.length===ue).event(P),le,me,Te,$e;for(MS(P),me=0;me{let e=Math.max(0,Math.min(t.x+t.width,A.x+A.width)-Math.max(t.x,A.x)),i=Math.max(0,Math.min(t.y+t.height,A.y+A.height)-Math.max(t.y,A.y));return Math.ceil(e*i)};function oBe(t){if(t.length===0)return{x:0,y:0,width:0,height:0};let A={x:1/0,y:1/0,x2:-1/0,y2:-1/0};return t.forEach(e=>{let i=GaA(e);A=UaA(A,i)}),KaA(A)}function FaA(t,A,e){let i=A.find(o=>o.rawNode.id===t);if(!i)return[];let n=SS(i);return A.filter(o=>{if(o.rawNode.id===t)return!1;let r=LaA(SS(o),n);return e?.partially?r>0:r>=n.width*n.height})}function GaA(t){return{x:t.point().x,y:t.point().y,x2:t.point().x+t.size().width,y2:t.point().y+t.size().height}}function SS(t){return{x:t.globalPoint().x,y:t.globalPoint().y,width:t.width(),height:t.height()}}function KaA({x:t,y:A,x2:e,y2:i}){return{x:t,y:A,width:e-t,height:i-A}}function UaA(t,A){return{x:Math.min(t.x,A.x),y:Math.min(t.y,A.y),x2:Math.max(t.x2,A.x2),y2:Math.max(t.y2,A.y2)}}var kS=class{constructor(A){this.settings=A,this.curve=A.curve??"bezier",this.type=A.type??"default",this.mode=A.mode??"strict";let e=this.getValidators(A);this.validator=i=>e.every(n=>n(i))}getValidators(A){let e=[];return e.push(TaA),this.mode==="loose"&&e.push(OaA),A.validator&&e.push(A.validator),e}},TaA=t=>t.source!==t.target,OaA=t=>t.sourceHandle!==void 0&&t.targetHandle!==void 0;function xQ(t){return t.split("").reduce((A,e)=>(A=(A<<5)-A+e.charCodeAt(0),A&A),0)}var jc=(()=>{class t{constructor(){this.nodes=mA([],{equal:(e,i)=>!e.length&&!i.length?!0:e===i}),this.rawNodes=ot(()=>this.nodes().map(e=>e.rawNode)),this.edges=mA([],{equal:(e,i)=>!e.length&&!i.length?!0:e===i}),this.rawEdges=ot(()=>this.edges().map(e=>e.edge)),this.validEdges=ot(()=>{let e=this.nodes();return this.edges().filter(i=>e.includes(i.source())&&e.includes(i.target()))}),this.connection=mA(new kS({})),this.markers=ot(()=>{let e=new Map;this.validEdges().forEach(n=>{if(n.edge.markers?.start){let o=xQ(JSON.stringify(n.edge.markers.start));e.set(o,n.edge.markers.start)}if(n.edge.markers?.end){let o=xQ(JSON.stringify(n.edge.markers.end));e.set(o,n.edge.markers.end)}});let i=this.connection().settings.marker;if(i){let n=xQ(JSON.stringify(i));e.set(n,i)}return e}),this.entities=ot(()=>[...this.nodes(),...this.edges()]),this.minimap=mA(null)}getNode(e){return this.nodes().find(({rawNode:i})=>i.id===e)}getDetachedEdges(){return this.edges().filter(e=>e.detached())}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return t})();function JaA(t,A,e,i,n,o){let r=A/(t.width*(1+o)),s=e/(t.height*(1+o)),a=Math.min(r,s),c=YaA(a,i,n),l=t.x+t.width/2,d=t.y+t.height/2,C=A/2-l*c,I=e/2-d*c;return{x:C,y:I,zoom:c}}function YaA(t,A=0,e=1){return Math.min(Math.max(t,A),e)}function HaA(t,A,e){let i=t.zoom;return{x:-t.x/i,y:-t.y/i,width:A/i,height:e/i}}function zaA(t,A,e,i){let n=HaA(A,e,i);return!(t.x+t.widthn.x+n.width||t.y+t.heightn.y+n.height)}var PaA={detachedGroupsLayer:!1,virtualization:!1,virtualizationZoomThreshold:.5,lazyLoadTrigger:"immediate"},Ja=(()=>{class t{constructor(){this.entitiesSelectable=mA(!0),this.elevateNodesOnSelect=mA(!0),this.elevateEdgesOnSelect=mA(!0),this.view=mA([400,400]),this.computedFlowWidth=mA(0),this.computedFlowHeight=mA(0),this.minZoom=mA(.5),this.maxZoom=mA(3),this.background=mA({type:"solid",color:"#fff"}),this.snapGrid=mA([1,1]),this.optimization=mA(PaA)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return t})(),Mh=(()=>{class t{constructor(){this.entitiesService=E(jc),this.flowSettingsService=E(Ja),this.writableViewport=mA({changeType:"initial",state:t.getDefaultViewport(),duration:0}),this.readableViewport=mA(t.getDefaultViewport()),this.viewportChangeEnd$=new je}static getDefaultViewport(){return{zoom:1,x:0,y:0}}fitView(e={padding:.1,duration:0,nodes:[]}){let i=this.getBoundsNodes(e.nodes??[]),n=JaA(oBe(i),this.flowSettingsService.computedFlowWidth(),this.flowSettingsService.computedFlowHeight(),this.flowSettingsService.minZoom(),this.flowSettingsService.maxZoom(),e.padding??.1),o=e.duration??0;this.writableViewport.set({changeType:"absolute",state:n,duration:o})}triggerViewportChangeEvent(e){e==="end"&&this.viewportChangeEnd$.next()}getBoundsNodes(e){return e?.length?e.map(i=>this.entitiesService.nodes().find(({rawNode:n})=>n.id===i)).filter(i=>!!i):this.entitiesService.nodes()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return t})();function c1(t){return t!==void 0}var US=(()=>{class t{constructor(){this.element=E(eA).nativeElement}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["svg","rootSvgRef",""]]})}}return t})();function Jhe(){let t=window.navigator.userAgent.toLowerCase(),A=/(macintosh|macintel|macppc|mac68k|macos)/i,e=/(win32|win64|windows|wince)/i,i=/(iphone|ipad|ipod)/i,n=null;return A.test(t)?n="macos":i.test(t)?n="ios":e.test(t)?n="windows":/android/.test(t)?n="android":!n&&/linux/.test(t)&&(n="linux"),n}var bz=(()=>{class t{constructor(){this.actions=mA({multiSelection:[Jhe()==="macos"?"MetaLeft":"ControlLeft",Jhe()==="macos"?"MetaRight":"ControlRight"]}),this.actionsActive={multiSelection:!1},vo(this.actions).pipe(Si(()=>Bi(Ya(document,"keydown").pipe(Pt(e=>{for(let i in this.actions())(this.actions()[i]??[]).includes(e.code)&&(this.actionsActive[i]=!0)})),Ya(document,"keyup").pipe(Pt(e=>{for(let i in this.actions())(this.actions()[i]??[]).includes(e.code)&&(this.actionsActive[i]=!1)})))),va()).subscribe()}setShortcuts(e){this.actions.update(i=>ae(ae({},i),e))}isActiveAction(e){return this.actionsActive[e]}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return t})(),A8=(()=>{class t{constructor(){this.flowEntitiesService=E(jc),this.keyboardService=E(bz),this.viewport$=new je,this.resetSelection=this.viewport$.pipe(Pt(({start:e,end:i,target:n})=>{if(e&&i&&n){let o=t.delta,r=Math.abs(i.x-e.x),s=Math.abs(i.y-e.y),a=ri.selected.set(!1)),e&&e.selected.set(!0))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return t})(),yz=(()=>{class t{constructor(){this.rootSvg=E(US).element,this.host=E(eA).nativeElement,this.selectionService=E(A8),this.viewportService=E(Mh),this.flowSettingsService=E(Ja),this.zone=E(yA),this.rootSvgSelection=js(this.rootSvg),this.transform=mA(""),this.viewportForSelection={},this.manualViewportChangeEffect=pa(()=>{let e=this.viewportService.writableViewport(),i=e.state;if(e.changeType!=="initial"){if(c1(i.zoom)&&!c1(i.x)&&!c1(i.y)){this.rootSvgSelection.transition().duration(e.duration).call(this.zoomBehavior.scaleTo,i.zoom);return}if(c1(i.x)&&c1(i.y)&&!c1(i.zoom)){let n=As(this.viewportService.readableViewport).zoom;this.rootSvgSelection.transition().duration(e.duration).call(this.zoomBehavior.transform,fI.translate(i.x,i.y).scale(n));return}if(c1(i.x)&&c1(i.y)&&c1(i.zoom)){this.rootSvgSelection.transition().duration(e.duration).call(this.zoomBehavior.transform,fI.translate(i.x,i.y).scale(i.zoom));return}}},{allowSignalWrites:!0}),this.handleZoom=({transform:e})=>{this.viewportService.readableViewport.set(Dz(e)),this.transform.set(e.toString())},this.handleZoomStart=({transform:e})=>{this.viewportForSelection={start:Dz(e)}},this.handleZoomEnd=({transform:e,sourceEvent:i})=>{this.zone.run(()=>{this.viewportForSelection=_A(ae({},this.viewportForSelection),{end:Dz(e),target:jaA(i)}),this.viewportService.triggerViewportChangeEvent("end"),this.selectionService.setViewport(this.viewportForSelection)})},this.filterCondition=e=>e.type==="mousedown"||e.type==="touchstart"?e.target.closest(".vflow-node")===null:!0}ngOnInit(){this.zone.runOutsideAngular(()=>{this.zoomBehavior=wz().scaleExtent([this.flowSettingsService.minZoom(),this.flowSettingsService.maxZoom()]).filter(this.filterCondition).on("start",this.handleZoomStart).on("zoom",this.handleZoom).on("end",this.handleZoomEnd),this.rootSvgSelection.call(this.zoomBehavior).on("dblclick.zoom",null)})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["g","mapContext",""]],hostVars:1,hostBindings:function(i,n){i&2&&AA("transform",n.transform())}})}}return t})(),Dz=t=>({zoom:t.k,x:t.x,y:t.y}),jaA=t=>{if(t instanceof Event&&t.target instanceof Element)return t.target},xS=t=>Math.round(t*100)/100;function Pc(t,A){return Math.ceil(t/A)*A}var QI=(()=>{class t{constructor(){this.status=mA({state:"idle",payload:null})}setIdleStatus(){this.status.set({state:"idle",payload:null})}setConnectionStartStatus(e,i){this.status.set({state:"connection-start",payload:{source:e,sourceHandle:i}})}setReconnectionStartStatus(e,i,n){this.status.set({state:"reconnection-start",payload:{source:e,sourceHandle:i,oldEdge:n}})}setConnectionValidationStatus(e,i,n,o,r){this.status.set({state:"connection-validation",payload:{source:i,target:n,sourceHandle:o,targetHandle:r,valid:e}})}setReconnectionValidationStatus(e,i,n,o,r,s){this.status.set({state:"reconnection-validation",payload:{source:i,target:n,sourceHandle:o,targetHandle:r,valid:e,oldEdge:s}})}setConnectionEndStatus(e,i,n,o){this.status.set({state:"connection-end",payload:{source:e,target:i,sourceHandle:n,targetHandle:o}})}setReconnectionEndStatus(e,i,n,o,r){this.status.set({state:"reconnection-end",payload:{source:e,target:i,sourceHandle:n,targetHandle:o,oldEdge:r}})}setNodeDragStartStatus(e){this.status.set({state:"node-drag-start",payload:{node:e}})}setNodeDragEndStatus(e){this.status.set({state:"node-drag-end",payload:{node:e}})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return t})();function Yhe(t){return t.state==="node-drag-start"}function VaA(t){return t.state==="node-drag-end"}var rBe=(()=>{class t{constructor(){this.entitiesService=E(jc),this.settingsService=E(Ja),this.flowStatusService=E(QI)}enable(e,i){js(e).call(this.getDragBehavior(i))}disable(e){js(e).call(sS().on("drag",null))}destroy(e){js(e).on(".drag",null)}getDragBehavior(e){let i=[],n=[],o=r=>e.dragHandlesCount()?!!r.target.closest(".vflow-drag-handle"):!0;return sS().filter(o).on("start",r=>{i=this.getDragNodes(e),this.flowStatusService.setNodeDragStartStatus(e),n=i.map(s=>({x:s.point().x-r.x,y:s.point().y-r.y}))}).on("drag",r=>{i.forEach((s,a)=>{let c={x:xS(r.x+n[a].x),y:xS(r.y+n[a].y)};this.moveNode(s,c)})}).on("end",()=>{this.flowStatusService.setNodeDragEndStatus(e)})}getDragNodes(e){return e.selected()?this.entitiesService.nodes().filter(i=>i.selected()&&i.draggable()):[e]}moveNode(e,i){i=this.alignToGrid(i);let n=e.parent();n&&(i.x=Math.min(n.width()-e.width(),i.x),i.x=Math.max(0,i.x),i.y=Math.min(n.height()-e.height(),i.y),i.y=Math.max(0,i.y)),e.setPoint(i)}alignToGrid(e){let[i,n]=this.settingsService.snapGrid();return i>1&&(e.x=Pc(e.x,i)),n>1&&(e.y=Pc(e.y,n)),e}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return t})(),Hhe=(()=>{class t{constructor(){this.templateRef=E(en)}static ngTemplateContextGuard(e,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["ng-template","edge",""]]})}}return t})(),zhe=(()=>{class t{constructor(){this.templateRef=E(en)}static ngTemplateContextGuard(e,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["ng-template","connection",""]]})}}return t})(),Phe=(()=>{class t{constructor(){this.templateRef=E(en)}static ngTemplateContextGuard(e,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["ng-template","edgeLabelHtml",""]]})}}return t})(),_S=(()=>{class t{constructor(){this.templateRef=E(en)}static ngTemplateContextGuard(e,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["ng-template","nodeHtml",""]]})}}return t})(),jhe=(()=>{class t{constructor(){this.templateRef=E(en)}static ngTemplateContextGuard(e,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["ng-template","nodeSvg",""]]})}}return t})(),RS=(()=>{class t{constructor(){this.templateRef=E(en)}static ngTemplateContextGuard(e,i){return!0}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["ng-template","groupNode",""]]})}}return t})();function Vhe(t,A){let e=t.reduce((i,n)=>(i[n.rawNode.id]=n,i),{});A.forEach(i=>{i.source.set(e[i.edge.source]),i.target.set(e[i.edge.target])})}function $6(t){try{return new Proxy(t,{apply:()=>{}})(),!0}catch{return!1}}var Mz=(()=>{class t{constructor(){this._event$=new je,this.event$=this._event$.asObservable()}pushEvent(e){this._event$.next(e)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return t})(),_Q=(()=>{class t{constructor(){this.model=mA(null)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return t})(),sBe=(()=>{class t{constructor(){this.eventBus=E(Mz),this.nodeService=E(_Q),this.destroyRef=E(Fr),this.selected=this.nodeService.model().selected,this.data=mA(void 0)}ngOnInit(){this.trackEvents().pipe(va(this.destroyRef)).subscribe()}trackEvents(){let e=Object.getOwnPropertyNames(this),i=new Map;for(let n of e){let o=this[n];o instanceof Ve&&i.set(o,n),o instanceof c4&&i.set(qaA(o),n)}return Bi(...Array.from(i.keys()).map(n=>n.pipe(Pt(o=>{this.eventBus.pushEvent({nodeId:this.nodeService.model()?.rawNode.id??"",eventName:i.get(n),eventPayload:o})}))))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,standalone:!1})}}return t})();function qaA(t){return new nt(A=>{let e=t.subscribe(i=>{A.next(i)});return()=>{e.unsubscribe()}})}var WaA=(()=>{class t extends sBe{constructor(){super(...arguments),this.node=lt.required()}ngOnInit(){let e=this.node().data;e&&(this.data=e),super.ngOnInit()}static{this.\u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})()}static{this.\u0275dir=Oe({type:t,inputs:{node:[1,"node"]},standalone:!1,features:[Ct]})}}return t})(),ZaA=(()=>{class t extends sBe{constructor(){super(...arguments),this.node=lt.required()}ngOnInit(){this.node().data&&this.data.set(this.node().data),super.ngOnInit()}static{this.\u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})()}static{this.\u0275dir=Oe({type:t,inputs:{node:[1,"node"]},standalone:!1,features:[Ct]})}}return t})();function aBe(t){return Object.prototype.isPrototypeOf.call(ZaA,t)}function cBe(t){return Object.prototype.isPrototypeOf.call(WaA,t)}function XaA(t){return typeof t.point=="function"}function $aA(t){return aBe(t.type)?!0:$6(t.type)&&!$6(t.point)}function ecA(t){return cBe(t.type)?!0:$6(t.type)&&$6(t.point)}var NS=2;function AcA(t){return XaA(t)?t:_A(ae({},tcA(t)),{id:t.id,type:t.type})}function tcA(t){let A={};for(let e in t)Object.prototype.hasOwnProperty.call(t,e)&&(A[e]=mA(t[e]));return A}function icA(t,A,e){!A&&e2(t);let i=A??E(Dt);return e?Xr(i,e):i}function e8(t,A){let e=icA(e8,A?.injector),i;return ot(()=>(i||(i=As(()=>_g(t,_A(ae({},A),{injector:e})))),i()))}function ncA(t){return t.rawNode.type==="default-group"||t.rawNode.type==="template-group"}var Sh=(()=>{class t{constructor(){this.flowEntitiesService=E(jc),this.flowSettingsService=E(Ja),this.viewportService=E(Mh),this.nodes=ot(()=>this.flowSettingsService.optimization().virtualization?this.viewportNodesAfterInteraction().sort((e,i)=>e.renderOrder()-i.renderOrder()):[...this.flowEntitiesService.nodes()].sort((e,i)=>e.renderOrder()-i.renderOrder())),this.groups=ot(()=>this.nodes().filter(e=>!!e.children().length||ncA(e))),this.nonGroups=ot(()=>this.nodes().filter(e=>!this.groups().includes(e))),this.viewportNodes=ot(()=>{let e=this.flowEntitiesService.nodes(),i=this.viewportService.readableViewport(),n=this.flowSettingsService.computedFlowWidth(),o=this.flowSettingsService.computedFlowHeight();return e.filter(r=>{let{x:s,y:a}=r.globalPoint(),c=r.width(),l=r.height();return zaA({x:s,y:a,width:c,height:l},i,n,o)})}),this.viewportNodesAfterInteraction=e8(Bi(vo(this.flowEntitiesService.nodes).pipe(Qg(D0),$A(e=>!!e.length)),this.viewportService.viewportChangeEnd$.pipe(Ws(300))).pipe(aA(()=>{let e=this.viewportService.readableViewport(),i=this.flowSettingsService.optimization().virtualizationZoomThreshold;return e.zoomMath.max(...this.flowEntitiesService.nodes().map(e=>e.renderOrder())))}pullNode(e){e.renderOrder.set(this.maxOrder()+1),e.children().forEach(i=>this.pullNode(i))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return t})();function LS(t,A){A||(A={equal:Object.is});let e;return ot(()=>e=t(e),A)}var ocA=(()=>{class t{static{this.defaultWidth=100}static{this.defaultHeight=50}static{this.defaultColor="#1b262c"}constructor(e){this.rawNode=e,this.entitiesService=E(jc),this.settingsService=E(Ja),this.nodeRenderingService=E(Sh),this.isVisible=mA(!1),this.point=mA({x:0,y:0}),this.width=mA(t.defaultWidth),this.height=mA(t.defaultHeight),this.size=ot(()=>({width:this.width(),height:this.height()})),this.styleWidth=ot(()=>this.controlledByResizer()?`${this.width()}px`:"100%"),this.styleHeight=ot(()=>this.controlledByResizer()?`${this.height()}px`:"100%"),this.foWidth=ot(()=>this.width()+NS),this.foHeight=ot(()=>this.height()+NS),this.renderOrder=mA(0),this.selected=mA(!1),this.preview=mA({style:{}}),this.globalPoint=ot(()=>{let n=this.parent(),o=this.point().x,r=this.point().y;for(;n!==null;)o+=n.point().x,r+=n.point().y,n=n.parent();return{x:o,y:r}}),this.pointTransform=ot(()=>`translate(${this.globalPoint().x}, ${this.globalPoint().y})`),this.handles=mA([]),this.draggable=mA(!0),this.dragHandlesCount=mA(0),this.magnetRadius=20,this.isComponentType=$aA(this.rawNode)||ecA(this.rawNode),this.shouldLoad=LS(n=>{if(n||this.settingsService.optimization().lazyLoadTrigger==="immediate")return!0;if(this.settingsService.optimization().lazyLoadTrigger==="viewport"){if(aBe(this.rawNode.type)||cBe(this.rawNode.type))return!0;if($6(this.rawNode.type)||this.rawNode.type==="html-template"||this.rawNode.type==="svg-template"||this.rawNode.type==="template-group")return this.nodeRenderingService.viewportNodes().includes(this)}return!0}),this.componentInstance$=vo(this.shouldLoad).pipe($A(Boolean),Si(()=>this.rawNode.type()),br(()=>dA(this.rawNode.type)),za(1)),this.text=mA(""),this.componentTypeInputs={node:this.rawNode},this.parent=ot(()=>this.entitiesService.nodes().find(n=>n.rawNode.id===this.parentId())??null),this.children=ot(()=>this.entitiesService.nodes().filter(n=>n.parentId()===this.rawNode.id)),this.color=mA(t.defaultColor),this.controlledByResizer=mA(!1),this.resizable=mA(!1),this.resizing=mA(!1),this.resizerTemplate=mA(null),this.context={$implicit:{}},this.parentId=mA(null);let i=AcA(e);i.point&&(this.point=i.point),i.width&&(this.width=i.width),i.height&&(this.height=i.height),i.draggable&&(this.draggable=i.draggable),i.parentId&&(this.parentId=i.parentId),i.preview&&(this.preview=i.preview),i.type==="default-group"&&i.color&&(this.color=i.color),i.type==="default-group"&&i.resizable&&(this.resizable=i.resizable),i.type==="default"&&i.text&&(this.text=i.text),i.type==="html-template"&&(this.context={$implicit:{node:e,selected:this.selected.asReadonly(),shouldLoad:this.shouldLoad}}),i.type==="svg-template"&&(this.context={$implicit:{node:e,selected:this.selected.asReadonly(),width:this.width.asReadonly(),height:this.height.asReadonly(),shouldLoad:this.shouldLoad}}),i.type==="template-group"&&(this.context={$implicit:{node:e,selected:this.selected.asReadonly(),width:this.width.asReadonly(),height:this.height.asReadonly(),shouldLoad:this.shouldLoad}}),this.point$=vo(this.point),this.width$=vo(this.width),this.height$=vo(this.height),this.size$=vo(this.size),this.selected$=vo(this.selected),this.handles$=vo(this.handles)}setPoint(e){this.point.set(e)}}return t})(),Z6=class{constructor(A){this.edgeLabel=A,this.size=mA({width:0,height:0})}};function l1(t,A,e){return{x:(1-e)*t.x+e*A.x,y:(1-e)*t.y+e*A.y}}function Sz({sourcePoint:t,targetPoint:A}){return{path:`M ${t.x},${t.y}L ${A.x},${A.y}`,labelPoints:{start:l1(t,A,.15),center:l1(t,A,.5),end:l1(t,A,.85)}}}function kz({sourcePoint:t,targetPoint:A,sourcePosition:e,targetPosition:i}){let n={x:t.x-A.x,y:t.y-A.y},o=qhe(t,e,n),r=qhe(A,i,n),s=`M${t.x},${t.y} C${o.x},${o.y} ${r.x},${r.y} ${A.x},${A.y}`;return rcA(s,t,A,o,r)}function qhe(t,A,e){let i={x:0,y:0};switch(A){case"top":i.y=1;break;case"bottom":i.y=-1;break;case"right":i.x=1;break;case"left":i.x=-1;break}let n={x:e.x*Math.abs(i.x),y:e.y*Math.abs(i.y)},r=.25*25*Math.sqrt(Math.abs(n.x+n.y));return{x:t.x+i.x*r,y:t.y-i.y*r}}function rcA(t,A,e,i,n){return{path:t,labelPoints:{start:vz(A,e,i,n,.1),center:vz(A,e,i,n,.5),end:vz(A,e,i,n,.9)}}}function vz(t,A,e,i,n){let o=l1(t,e,n),r=l1(e,i,n),s=l1(i,A,n);return l1(l1(o,r,n),l1(r,s,n),n)}var Whe={left:{x:-1,y:0},right:{x:1,y:0},top:{x:0,y:-1},bottom:{x:0,y:1}};function scA(t,A){let e=Math.abs(A.x-t.x)/2,i=A.xA==="left"||A==="right"?t.xMath.sqrt(Math.pow(A.x-t.x,2)+Math.pow(A.y-t.y,2));function ccA({source:t,sourcePosition:A="bottom",target:e,targetPosition:i="top",offset:n}){let o=Whe[A],r=Whe[i],s={x:t.x+o.x*n,y:t.y+o.y*n},a={x:e.x+r.x*n,y:e.y+r.y*n},c=acA({source:s,sourcePosition:A,target:a}),l=c.x!==0?"x":"y",d=c[l],C=[],I,u,h={x:0,y:0},B={x:0,y:0},[f,b]=scA(t,e);if(o[l]*r[l]===-1){I=f,u=b;let S=[{x:I,y:s.y},{x:I,y:a.y}],w=[{x:s.x,y:u},{x:a.x,y:u}];o[l]===d?C=l==="x"?S:w:C=l==="x"?w:S}else{let S=[{x:s.x,y:a.y}],w=[{x:a.x,y:s.y}];if(l==="x"?C=o.x===d?w:S:C=o.y===d?S:w,A===i){let H=Math.abs(t[l]-e[l]);if(H<=n){let V=Math.min(n-1,n-H);o[l]===d?h[l]=(s[l]>t[l]?-1:1)*V:B[l]=(a[l]>e[l]?-1:1)*V}}if(A!==i){let H=l==="x"?"y":"x",V=o[l]===r[H],Z=s[H]>a[H],ye=s[H]=O?(I=(_.x+K.x)/2,u=C[0].y):(I=C[0].x,u=(_.y+K.y)/2)}return[[t,{x:s.x+h.x,y:s.y+h.y},...C,{x:a.x+B.x,y:a.y+B.y},e],I,u]}function lcA(t,A,e,i){let n=Math.min(Zhe(t,A)/2,Zhe(A,e)/2,i),{x:o,y:r}=A;if(t.x===o&&o===e.x||t.y===r&&r===e.y)return`L${o} ${r}`;if(t.y===r){let c=t.x{let f="";return B>0&&B{let h=C*u;if(h<=0)return o[0];if(h>=C)return o[c-1];let B=0,f=c-1;for(;B>>1;d[K](this.source()?.shouldLoad()??!1)&&(this.target()?.shouldLoad()??!1)),this.renderOrder=mA(0),this.detached=ot(()=>{let e=this.source(),i=this.target();if(!e||!i)return!0;let n=!1,o=!1;return this.edge.sourceHandle?n=!!e.handles().find(r=>r.rawHandle.id===this.edge.sourceHandle):n=!!e.handles().find(r=>r.rawHandle.type==="source"),this.edge.targetHandle?o=!!i.handles().find(r=>r.rawHandle.id===this.edge.targetHandle):o=!!i.handles().find(r=>r.rawHandle.type==="target"),!n||!o}),this.detached$=vo(this.detached),this.path=ot(()=>{let e=this.sourceHandle(),i=this.targetHandle();if(!e||!i)return{path:""};let n=this.getPathFactoryParams(e,i);switch(this.curve){case"straight":return Sz(n);case"bezier":return kz(n);case"smooth-step":return kQ(n);case"step":return kQ(n,0);default:return this.curve(n)}}),this.sourceHandle=LS(e=>{let i=null;return this.floating?i=this.closestHandles().sourceHandle:this.edge.sourceHandle?i=this.source()?.handles().find(n=>n.rawHandle.id===this.edge.sourceHandle)??null:i=this.source()?.handles().find(n=>n.rawHandle.type==="source")??null,i===null?e:i}),this.targetHandle=LS(e=>{let i=null;return this.floating?i=this.closestHandles().targetHandle:this.edge.targetHandle?i=this.target()?.handles().find(n=>n.rawHandle.id===this.edge.targetHandle)??null:i=this.target()?.handles().find(n=>n.rawHandle.type==="target")??null,i===null?e:i}),this.closestHandles=ot(()=>{let e=this.source(),i=this.target();if(!e||!i)return{sourceHandle:null,targetHandle:null};let n=this.flowEntitiesService.connection().mode==="strict"?e.handles().filter(c=>c.rawHandle.type==="source"):e.handles(),o=this.flowEntitiesService.connection().mode==="strict"?i.handles().filter(c=>c.rawHandle.type==="target"):i.handles();if(n.length===0||o.length===0)return{sourceHandle:null,targetHandle:null};let r=1/0,s=null,a=null;for(let c of n)for(let l of o){let d=c.pointAbsolute(),C=l.pointAbsolute(),I=Math.sqrt(Math.pow(d.x-C.x,2)+Math.pow(d.y-C.y,2));I{let e=this.edge.markers?.start;return e?`url(#${xQ(JSON.stringify(e))})`:""}),this.markerEndUrl=ot(()=>{let e=this.edge.markers?.end;return e?`url(#${xQ(JSON.stringify(e))})`:""}),this.context={$implicit:{edge:this.edge,path:ot(()=>this.path().path),markerStart:this.markerStartUrl,markerEnd:this.markerEndUrl,selected:this.selected.asReadonly(),shouldLoad:this.shouldLoad}},this.edgeLabels={},this.type=A.type??"default",this.curve=A.curve??"bezier",this.reconnectable=A.reconnectable??!1,this.floating=A.floating??!1,A.edgeLabels?.start&&(this.edgeLabels.start=new Z6(A.edgeLabels.start)),A.edgeLabels?.center&&(this.edgeLabels.center=new Z6(A.edgeLabels.center)),A.edgeLabels?.end&&(this.edgeLabels.end=new Z6(A.edgeLabels.end))}getPathFactoryParams(A,e){return{mode:"edge",edge:this.edge,sourcePoint:A.pointAbsolute(),targetPoint:e.pointAbsolute(),sourcePosition:A.rawHandle.position,targetPosition:e.rawHandle.position,allEdges:this.flowEntitiesService.rawEdges(),allNodes:this.flowEntitiesService.rawNodes()}}},FS=class{static nodes(A,e){let i=new Map;return e.forEach(n=>i.set(n.rawNode,n)),A.map(n=>i.get(n)??new ocA(n))}static edges(A,e){let i=new Map;return e.forEach(n=>i.set(n.edge,n)),A.map(n=>i.has(n)?i.get(n):new xz(n))}},gcA=25,_z=(()=>{class t{constructor(){this.entitiesService=E(jc),this.nodesPositionChange$=vo(this.entitiesService.nodes).pipe(Si(e=>Bi(...e.map(i=>i.point$.pipe(Pa(1),aA(()=>i))))),aA(e=>[{type:"position",id:e.rawNode.id,point:e.point()},...this.entitiesService.nodes().filter(i=>i!==e&&i.selected()).map(i=>({type:"position",id:i.rawNode.id,point:i.point()}))])),this.nodeSizeChange$=vo(this.entitiesService.nodes).pipe(Si(e=>Bi(...e.map(i=>i.size$.pipe(Pa(1),aA(()=>i))))),aA(e=>[{type:"size",id:e.rawNode.id,size:e.size()}])),this.nodeAddChange$=vo(this.entitiesService.nodes).pipe(k0(),aA(([e,i])=>i.filter(n=>!e.includes(n))),$A(e=>!!e.length),aA(e=>e.map(i=>({type:"add",id:i.rawNode.id})))),this.nodeRemoveChange$=vo(this.entitiesService.nodes).pipe(k0(),aA(([e,i])=>e.filter(n=>!i.includes(n))),$A(e=>!!e.length),aA(e=>e.map(i=>({type:"remove",id:i.rawNode.id})))),this.nodeSelectedChange$=vo(this.entitiesService.nodes).pipe(Si(e=>Bi(...e.map(i=>i.selected$.pipe(Ha(),Pa(1),aA(()=>i))))),aA(e=>[{type:"select",id:e.rawNode.id,selected:e.selected()}])),this.changes$=Bi(this.nodesPositionChange$,this.nodeSizeChange$,this.nodeAddChange$,this.nodeRemoveChange$,this.nodeSelectedChange$).pipe(Qg(D0,gcA))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return t})(),dcA=(t,A)=>t.length===A.length&&[...new Set([...t,...A])].every(e=>t.filter(i=>i===e).length===A.filter(i=>i===e).length),Rz=(()=>{class t{constructor(){this.entitiesService=E(jc),this.edgeDetachedChange$=Bi(vo(ot(()=>{let e=this.entitiesService.nodes();return As(this.entitiesService.edges).filter(({source:n,target:o})=>!e.includes(n())||!e.includes(o()))})),vo(this.entitiesService.edges).pipe(Si(e=>Wk(...e.map(i=>i.detached$.pipe(aA(()=>i))))),aA(e=>e.filter(i=>i.detached())),Pa(2))).pipe(Ha(dcA),$A(e=>!!e.length),aA(e=>e.map(({edge:i})=>({type:"detached",id:i.id})))),this.edgeAddChange$=vo(this.entitiesService.edges).pipe(k0(),aA(([e,i])=>i.filter(n=>!e.includes(n))),$A(e=>!!e.length),aA(e=>e.map(({edge:i})=>({type:"add",id:i.id})))),this.edgeRemoveChange$=vo(this.entitiesService.edges).pipe(k0(),aA(([e,i])=>e.filter(n=>!i.includes(n))),$A(e=>!!e.length),aA(e=>e.map(({edge:i})=>({type:"remove",id:i.id})))),this.edgeSelectChange$=vo(this.entitiesService.edges).pipe(Si(e=>Bi(...e.map(i=>i.selected$.pipe(Ha(),Pa(1),aA(()=>i))))),aA(e=>[{type:"select",id:e.edge.id,selected:e.selected()}])),this.changes$=Bi(this.edgeDetachedChange$,this.edgeAddChange$,this.edgeRemoveChange$,this.edgeSelectChange$).pipe(Qg(D0))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return t})(),CcA=(()=>{class t{constructor(){this.nodesChangeService=E(_z),this.edgesChangeService=E(Rz),this.onNodesChange=Xn(this.nodesChangeService.changes$),this.onNodesChangePosition=Xn(this.nodeChangesOfType("position"),{alias:"onNodesChange.position"}),this.onNodesChangePositionSignle=Xn(this.singleChange(this.nodeChangesOfType("position")),{alias:"onNodesChange.position.single"}),this.onNodesChangePositionMany=Xn(this.manyChanges(this.nodeChangesOfType("position")),{alias:"onNodesChange.position.many"}),this.onNodesChangeSize=Xn(this.nodeChangesOfType("size"),{alias:"onNodesChange.size"}),this.onNodesChangeSizeSingle=Xn(this.singleChange(this.nodeChangesOfType("size")),{alias:"onNodesChange.size.single"}),this.onNodesChangeSizeMany=Xn(this.manyChanges(this.nodeChangesOfType("size")),{alias:"onNodesChange.size.many"}),this.onNodesChangeAdd=Xn(this.nodeChangesOfType("add"),{alias:"onNodesChange.add"}),this.onNodesChangeAddSingle=Xn(this.singleChange(this.nodeChangesOfType("add")),{alias:"onNodesChange.add.single"}),this.onNodesChangeAddMany=Xn(this.manyChanges(this.nodeChangesOfType("add")),{alias:"onNodesChange.add.many"}),this.onNodesChangeRemove=Xn(this.nodeChangesOfType("remove"),{alias:"onNodesChange.remove"}),this.onNodesChangeRemoveSingle=Xn(this.singleChange(this.nodeChangesOfType("remove")),{alias:"onNodesChange.remove.single"}),this.onNodesChangeRemoveMany=Xn(this.manyChanges(this.nodeChangesOfType("remove")),{alias:"onNodesChange.remove.many"}),this.onNodesChangeSelect=Xn(this.nodeChangesOfType("select"),{alias:"onNodesChange.select"}),this.onNodesChangeSelectSingle=Xn(this.singleChange(this.nodeChangesOfType("select")),{alias:"onNodesChange.select.single"}),this.onNodesChangeSelectMany=Xn(this.manyChanges(this.nodeChangesOfType("select")),{alias:"onNodesChange.select.many"}),this.onEdgesChange=Xn(this.edgesChangeService.changes$),this.onNodesChangeDetached=Xn(this.edgeChangesOfType("detached"),{alias:"onEdgesChange.detached"}),this.onNodesChangeDetachedSingle=Xn(this.singleChange(this.edgeChangesOfType("detached")),{alias:"onEdgesChange.detached.single"}),this.onNodesChangeDetachedMany=Xn(this.manyChanges(this.edgeChangesOfType("detached")),{alias:"onEdgesChange.detached.many"}),this.onEdgesChangeAdd=Xn(this.edgeChangesOfType("add"),{alias:"onEdgesChange.add"}),this.onEdgeChangeAddSingle=Xn(this.singleChange(this.edgeChangesOfType("add")),{alias:"onEdgesChange.add.single"}),this.onEdgeChangeAddMany=Xn(this.manyChanges(this.edgeChangesOfType("add")),{alias:"onEdgesChange.add.many"}),this.onEdgeChangeRemove=Xn(this.edgeChangesOfType("remove"),{alias:"onEdgesChange.remove"}),this.onEdgeChangeRemoveSingle=Xn(this.singleChange(this.edgeChangesOfType("remove")),{alias:"onEdgesChange.remove.single"}),this.onEdgeChangeRemoveMany=Xn(this.manyChanges(this.edgeChangesOfType("remove")),{alias:"onEdgesChange.remove.many"}),this.onEdgeChangeSelect=Xn(this.edgeChangesOfType("select"),{alias:"onEdgesChange.select"}),this.onEdgeChangeSelectSingle=Xn(this.singleChange(this.edgeChangesOfType("select")),{alias:"onEdgesChange.select.single"}),this.onEdgeChangeSelectMany=Xn(this.manyChanges(this.edgeChangesOfType("select")),{alias:"onEdgesChange.select.many"})}nodeChangesOfType(e){return this.nodesChangeService.changes$.pipe(aA(i=>i.filter(n=>n.type===e)),$A(i=>!!i.length))}edgeChangesOfType(e){return this.edgesChangeService.changes$.pipe(aA(i=>i.filter(n=>n.type===e)),$A(i=>!!i.length))}singleChange(e){return e.pipe($A(i=>i.length===1),aA(([i])=>i))}manyChanges(e){return e.pipe($A(i=>i.length>1))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["","changesController",""]],outputs:{onNodesChange:"onNodesChange",onNodesChangePosition:"onNodesChange.position",onNodesChangePositionSignle:"onNodesChange.position.single",onNodesChangePositionMany:"onNodesChange.position.many",onNodesChangeSize:"onNodesChange.size",onNodesChangeSizeSingle:"onNodesChange.size.single",onNodesChangeSizeMany:"onNodesChange.size.many",onNodesChangeAdd:"onNodesChange.add",onNodesChangeAddSingle:"onNodesChange.add.single",onNodesChangeAddMany:"onNodesChange.add.many",onNodesChangeRemove:"onNodesChange.remove",onNodesChangeRemoveSingle:"onNodesChange.remove.single",onNodesChangeRemoveMany:"onNodesChange.remove.many",onNodesChangeSelect:"onNodesChange.select",onNodesChangeSelectSingle:"onNodesChange.select.single",onNodesChangeSelectMany:"onNodesChange.select.many",onEdgesChange:"onEdgesChange",onNodesChangeDetached:"onEdgesChange.detached",onNodesChangeDetachedSingle:"onEdgesChange.detached.single",onNodesChangeDetachedMany:"onEdgesChange.detached.many",onEdgesChangeAdd:"onEdgesChange.add",onEdgeChangeAddSingle:"onEdgesChange.add.single",onEdgeChangeAddMany:"onEdgesChange.add.many",onEdgeChangeRemove:"onEdgesChange.remove",onEdgeChangeRemoveSingle:"onEdgesChange.remove.single",onEdgeChangeRemoveMany:"onEdgesChange.remove.many",onEdgeChangeSelect:"onEdgesChange.select",onEdgeChangeSelectSingle:"onEdgesChange.select.single",onEdgeChangeSelectMany:"onEdgesChange.select.many"}})}}return t})(),TS=(()=>{class t{constructor(){this.host=E(eA).nativeElement,this.initialTouch$=new je,this.prevTouchEvent=null,this.mouseMovement$=Ya(this.host,"mousemove").pipe(aA(e=>({x:e.clientX,y:e.clientY,movementX:e.movementX,movementY:e.movementY,target:e.target,originalEvent:e})),Qg(ZQ),Rl()),this.touchMovement$=Bi(this.initialTouch$,Ya(this.host,"touchmove")).pipe(Pt(e=>e.preventDefault()),aA(e=>{let i=e.touches[0]?.clientX??0,n=e.touches[0]?.clientY??0,o=this.prevTouchEvent?e.touches[0].pageX-this.prevTouchEvent.touches[0].pageX:0,r=this.prevTouchEvent?e.touches[0].pageY-this.prevTouchEvent.touches[0].pageY:0,s=document.elementFromPoint(i,n);return{x:i,y:n,movementX:o,movementY:r,target:s,originalEvent:e}}),Pt(e=>this.prevTouchEvent=e.originalEvent),Qg(ZQ),Rl()),this.pointerMovement$=Bi(this.mouseMovement$,this.touchMovement$),this.touchEnd$=Ya(this.host,"touchend").pipe(aA(e=>{let i=e.changedTouches[0]?.clientX??0,n=e.changedTouches[0]?.clientY??0,o=document.elementFromPoint(i,n);return{x:i,y:n,target:o,originalEvent:e}}),Pt(()=>this.prevTouchEvent=null),Rl()),this.mouseUp$=Ya(this.host,"mouseup").pipe(aA(e=>{let i=e.clientX,n=e.clientY,o=e.target;return{x:i,y:n,target:o,originalEvent:e}}),Rl()),this.documentPointerEnd$=Bi(Ya(document,"mouseup"),Ya(document,"touchend")).pipe(Rl())}setInitialTouch(e){this.initialTouch$.next(e)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["svg","rootPointer",""]]})}}return t})(),X6=(()=>{class t{constructor(){this.pointerMovementDirective=E(TS),this.rootSvg=E(US).element,this.host=E(eA).nativeElement,this.svgCurrentSpacePoint=ot(()=>{let e=this.pointerMovement();return e?this.documentPointToFlowPoint({x:e.x,y:e.y}):{x:0,y:0}}),this.pointerMovement=_g(this.pointerMovementDirective.pointerMovement$)}documentPointToFlowPoint(e){let i=this.rootSvg.createSVGPoint();return i.x=e.x,i.y=e.y,i.matrixTransform(this.host.getScreenCTM().inverse())}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["g","spacePointContext",""]]})}}return t})();function IcA(t){return typeof t=="string"?{type:"solid",color:t}:t}function GS(t,A,e){let i=e.value;return e.value=function(...n){queueMicrotask(()=>{i?.apply(this,n)})},e}var lBe=(()=>{class t{constructor(){this.toolbars=mA([]),this.nodeToolbarsMap=ot(()=>{let e=new Map;return this.toolbars().forEach(i=>{let n=e.get(i.node)??[];e.set(i.node,[...n,i])}),e})}addToolbar(e){this.toolbars.update(i=>[...i,e])}removeToolbar(e){this.toolbars.update(i=>i.filter(n=>n!==e))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return XQ([GS],t.prototype,"addToolbar",null),XQ([GS],t.prototype,"removeToolbar",null),t})();function OS(t,A){return new nt(e=>{let i=new ResizeObserver(n=>{A.run(()=>e.next(n))});return t.forEach(n=>i.observe(n)),()=>i.disconnect()})}var ucA=(()=>{class t{constructor(){this.zone=E(yA),this.destroyRef=E(Fr),this.settingsService=E(Ja),this.model=lt.required(),this.edgeModel=lt.required(),this.point=lt({x:0,y:0}),this.htmlTemplate=lt(),this.edgeLabelWrapperRef=es.required("edgeLabelWrapper"),this.edgeLabelPoint=ot(()=>{let e=this.point(),{width:i,height:n}=this.model().size();return{x:e.x-i/2,y:e.y-n/2}}),this.edgeLabelStyle=ot(()=>{let e=this.model().edgeLabel;if(e.type==="default"&&e.style){let i=this.settingsService.background(),n="transparent";return i.type==="dots"&&(n=i.backgroundColor??"#fff"),i.type==="solid"&&(n=i.color),e.style.backgroundColor=e.style.backgroundColor??n,e.style}return null})}ngAfterViewInit(){let e=this.edgeLabelWrapperRef().nativeElement;OS([e],this.zone).pipe(In(null),Pt(()=>{let i=e.clientWidth+NS,n=e.clientHeight+NS;this.model().size.set({width:i,height:n})}),va(this.destroyRef)).subscribe()}getLabelContext(){return{$implicit:{edge:this.edgeModel().edge,label:this.model().edgeLabel}}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=xe({type:t,selectors:[["g","edgeLabel",""]],viewQuery:function(i,n){i&1&&Kr(n.edgeLabelWrapperRef,hsA,5),i&2&&Aa()},inputs:{model:[1,"model"],edgeModel:[1,"edgeModel"],point:[1,"point"],htmlTemplate:[1,"htmlTemplate"]},attrs:BsA,decls:1,vars:1,consts:[["edgeLabelWrapper",""],[1,"edge-label-wrapper"],[4,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(i,n){if(i&1&&ne(0,psA,2,2),i&2){let o;$((o=n.model())?0:-1,o)}},dependencies:[nl],styles:[".edge-label-wrapper[_ngcontent-%COMP%]{width:max-content;margin-top:1px;margin-left:1px}"],changeDetection:0})}}return t})();function gBe(t){let A={};return t.sourceHandle.rawHandle.type==="source"?(A.source=t.source,A.sourceHandle=t.sourceHandle):(A.source=t.target,A.sourceHandle=t.targetHandle),t.targetHandle.rawHandle.type==="target"?(A.target=t.target,A.targetHandle=t.targetHandle):(A.target=t.source,A.targetHandle=t.sourceHandle),A}var dBe=(()=>{class t{constructor(){this.statusService=E(QI),this.flowEntitiesService=E(jc),this.onConnect=Xn(vo(this.statusService.status).pipe($A(e=>e.state==="connection-end"),aA(e=>Xhe(e,this.isStrictMode())),Pt(()=>this.statusService.setIdleStatus()),$A(e=>this.flowEntitiesService.connection().validator(e)))),this.onReconnect=Xn(vo(this.statusService.status).pipe($A(e=>e.state==="reconnection-end"),aA(e=>{let i=Xhe(e,this.isStrictMode()),n=e.payload.oldEdge.edge;return{connection:i,oldEdge:n}}),Pt(()=>this.statusService.setIdleStatus()),$A(({connection:e})=>this.flowEntitiesService.connection().validator(e)))),this.isStrictMode=ot(()=>this.flowEntitiesService.connection().mode==="strict")}startConnection(e){this.statusService.setConnectionStartStatus(e.parentNode,e)}startReconnection(e,i){this.statusService.setReconnectionStartStatus(e.parentNode,e,i)}validateConnection(e){let i=this.statusService.status();if(i.state==="connection-start"||i.state==="reconnection-start"){let n=i.state==="reconnection-start",o=i.payload.source,r=e.parentNode,s=i.payload.sourceHandle,a=e;if(this.isStrictMode()){let l=gBe({source:i.payload.source,sourceHandle:i.payload.sourceHandle,target:e.parentNode,targetHandle:e});o=l.source,r=l.target,s=l.sourceHandle,a=l.targetHandle}let c=this.flowEntitiesService.connection().validator({source:o.rawNode.id,target:r.rawNode.id,sourceHandle:s.rawHandle.id,targetHandle:a.rawHandle.id});e.state.set(c?"valid":"invalid"),n?this.statusService.setReconnectionValidationStatus(c,i.payload.source,e.parentNode,i.payload.sourceHandle,e,i.payload.oldEdge):this.statusService.setConnectionValidationStatus(c,i.payload.source,e.parentNode,i.payload.sourceHandle,e)}}resetValidateConnection(e){e.state.set("idle");let i=this.statusService.status();(i.state==="connection-validation"||i.state==="reconnection-validation")&&(i.state==="reconnection-validation"?this.statusService.setReconnectionStartStatus(i.payload.source,i.payload.sourceHandle,i.payload.oldEdge):this.statusService.setConnectionStartStatus(i.payload.source,i.payload.sourceHandle))}endConnection(){let e=this.statusService.status();if(e.state==="connection-validation"||e.state==="reconnection-validation"){let i=e.state==="reconnection-validation",n=e.payload.source,o=e.payload.sourceHandle,r=e.payload.target,s=e.payload.targetHandle;i?this.statusService.setReconnectionEndStatus(n,r,o,s,e.payload.oldEdge):this.statusService.setConnectionEndStatus(n,r,o,s)}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["","onConnect",""],["","onReconnect",""]],outputs:{onConnect:"onConnect",onReconnect:"onReconnect"}})}}return t})();function Xhe(t,A){let e=t.payload.source,i=t.payload.target,n=t.payload.sourceHandle,o=t.payload.targetHandle;if(A){let l=gBe({source:t.payload.source,sourceHandle:t.payload.sourceHandle,target:t.payload.target,targetHandle:t.payload.targetHandle});e=l.source,i=l.target,n=l.sourceHandle,o=l.targetHandle}let r=e.rawNode.id,s=i.rawNode.id,a=n.rawHandle.id,c=o.rawHandle.id;return{source:r,target:s,sourceHandle:a,targetHandle:c}}var KS=(()=>{class t{constructor(){this.flowEntitiesService=E(jc),this.flowSettingsService=E(Ja),this.edges=ot(()=>this.flowSettingsService.optimization().virtualization?this.viewportEdges().sort((e,i)=>e.renderOrder()-i.renderOrder()):[...this.flowEntitiesService.validEdges()].sort((e,i)=>e.renderOrder()-i.renderOrder())),this.viewportEdges=ot(()=>this.flowEntitiesService.validEdges().filter(e=>{let i=e.sourceHandle(),n=e.targetHandle();return i&&n})),this.maxOrder=ot(()=>Math.max(...this.flowEntitiesService.validEdges().map(e=>e.renderOrder())))}pull(e){e.renderOrder()!==0&&this.maxOrder()===e.renderOrder()||e.renderOrder.set(this.maxOrder()+1)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return t})();function hcA(t){return window.TouchEvent&&t instanceof TouchEvent}var Gz=(()=>{class t{constructor(){this.hostElement=E(eA).nativeElement,this.pointerMovementDirective=E(TS),this.pointerOver=No(),this.pointerOut=No(),this.pointerStart=No(),this.pointerEnd=No(),this.wasPointerOver=!1,this.touchEnd=this.pointerMovementDirective.touchEnd$.pipe($A(({target:e})=>e===this.hostElement),Pt(({originalEvent:e})=>this.pointerEnd.emit(e)),va()).subscribe(),this.touchOverOut=this.pointerMovementDirective.touchMovement$.pipe(Pt(({target:e,originalEvent:i})=>{this.handleTouchOverAndOut(e,i)}),va()).subscribe()}onPointerStart(e){this.pointerStart.emit(e),hcA(e)&&this.pointerMovementDirective.setInitialTouch(e)}onPointerEnd(e){this.pointerEnd.emit(e)}onMouseOver(e){this.pointerOver.emit(e)}onMouseOut(e){this.pointerOut.emit(e)}handleTouchOverAndOut(e,i){e===this.hostElement?(this.pointerOver.emit(i),this.wasPointerOver=!0):(this.wasPointerOver&&this.pointerOut.emit(i),this.wasPointerOver=!1)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["","pointerStart",""],["","pointerEnd",""],["","pointerOver",""],["","pointerOut",""]],hostBindings:function(i,n){i&1&&ee("mousedown",function(r){return n.onPointerStart(r)})("touchstart",function(r){return n.onPointerStart(r)})("mouseup",function(r){return n.onPointerEnd(r)})("mouseover",function(r){return n.onMouseOver(r)})("mouseout",function(r){return n.onMouseOut(r)})},outputs:{pointerOver:"pointerOver",pointerOut:"pointerOut",pointerStart:"pointerStart",pointerEnd:"pointerEnd"}})}}return t})(),CBe=(()=>{class t{constructor(){this.injector=E(Dt),this.selectionService=E(A8),this.flowSettingsService=E(Ja),this.flowStatusService=E(QI),this.edgeRenderingService=E(KS),this.connectionController=E(dBe,{optional:!0}),this.model=lt.required(),this.edgeTemplate=lt(),this.edgeLabelHtmlTemplate=lt(),this.isReconnecting=ot(()=>{let e=this.flowStatusService.status();return(e.state==="reconnection-start"||e.state==="reconnection-validation")&&e.payload.oldEdge===this.model()})}select(){this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(this.model())}pull(){this.flowSettingsService.elevateEdgesOnSelect()&&this.edgeRenderingService.pull(this.model())}startReconnection(e,i){e.stopPropagation(),this.connectionController?.startReconnection(i,this.model())}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=xe({type:t,selectors:[["g","edge",""]],hostAttrs:[1,"selectable"],hostVars:2,hostBindings:function(i,n){i&2&&cn("visibility",n.isReconnecting()?"hidden":"visible")},inputs:{model:[1,"model"],edgeTemplate:[1,"edgeTemplate"],edgeLabelHtmlTemplate:[1,"edgeLabelHtmlTemplate"]},attrs:wsA,decls:6,vars:6,consts:[[1,"edge"],[1,"interactive-edge",3,"click"],[3,"ngTemplateOutlet","ngTemplateOutletContext","ngTemplateOutletInjector"],["edgeLabel","",3,"model","point","edgeModel","htmlTemplate"],["r","10",1,"reconnect-handle"],["r","10",1,"reconnect-handle",3,"pointerStart"]],template:function(i,n){if(i&1&&ne(0,ysA,2,6)(1,vsA,1,1)(2,MsA,1,1)(3,ksA,1,1)(4,_sA,1,1)(5,LsA,2,2),i&2){let o,r,s;$(n.model().type==="default"?0:-1),y(),$(n.model().type==="template"&&n.edgeTemplate()?1:-1),y(),$((o=n.model().edgeLabels.start)?2:-1,o),y(),$((r=n.model().edgeLabels.center)?3:-1,r),y(),$((s=n.model().edgeLabels.end)?4:-1,s),y(),$(n.model().sourceHandle()&&n.model().targetHandle()?5:-1)}},dependencies:[nl,ucA,Gz],styles:[".edge[_ngcontent-%COMP%]{fill:none;stroke-width:2;stroke:#b1b1b7}.edge_selected[_ngcontent-%COMP%]{stroke-width:2.5;stroke:#0f4c75}.interactive-edge[_ngcontent-%COMP%]{fill:none;stroke-width:20;stroke:transparent}.reconnect-handle[_ngcontent-%COMP%]{fill:transparent;cursor:move}"],changeDetection:0})}}return t})(),Nz=(()=>{class t{constructor(){this.node=mA(null)}createHandle(e){let i=this.node();i&&i.handles.update(n=>[...n,e])}destroyHandle(e){let i=this.node();i&&i.handles.update(n=>n.filter(o=>o!==e))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return XQ([GS],t.prototype,"createHandle",null),t})(),BcA=(()=>{class t{constructor(){this.handleModel=lt.required({alias:"handleSizeController"}),this.handleWrapper=E(eA)}ngAfterViewInit(){let e=this.handleWrapper.nativeElement,i=e.getBBox(),n=EcA(e);this.handleModel().size.set({width:i.width+n,height:i.height+n})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["","handleSizeController",""]],inputs:{handleModel:[1,"handleSizeController","handleModel"]}})}}return t})();function EcA(t){let A=t.firstElementChild;if(A){let e=getComputedStyle(A).strokeWidth,i=Number(e.replace("px",""));return isNaN(i)?0:i}return 0}var fcA=(()=>{class t{constructor(){this.selected=lt(!1)}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=xe({type:t,selectors:[["default-node"]],hostVars:2,hostBindings:function(i,n){i&2&&iA("selected",n.selected())},inputs:{selected:[1,"selected"]},ngContentSelectors:nBe,decls:1,vars:0,template:function(i,n){i&1&&(Kt(),NA(0))},styles:["[_nghost-%COMP%]{border:1.5px solid #1b262c;border-radius:5px;display:flex;align-items:center;justify-content:center;color:#000;background-color:#fff}.selected[_nghost-%COMP%]{border-width:2px}"],changeDetection:0})}}return t})(),QcA=(()=>{class t{get model(){return this.nodeAccessor.model()}constructor(){this.nodeAccessor=E(_Q),this.rootPointer=E(TS),this.viewportService=E(Mh),this.spacePointContext=E(X6),this.settingsService=E(Ja),this.hostRef=E(eA),this.resizable=lt(),this.resizerColor=lt("#2e414c"),this.gap=lt(1.5),this.resizer=es.required("resizer"),this.lineGap=3,this.handleSize=6,this.resizeSide=null,this.zoom=ot(()=>this.viewportService.readableViewport().zoom??0),this.minWidth=0,this.minHeight=0,this.maxWidth=1/0,this.maxHeight=1/0,this.resizeOnGlobalMouseMove=this.rootPointer.pointerMovement$.pipe($A(()=>this.resizeSide!==null),$A(e=>e.movementX!==0||e.movementY!==0),Pt(e=>this.resize(e)),va()).subscribe(),this.endResizeOnGlobalMouseUp=this.rootPointer.documentPointerEnd$.pipe(Pt(()=>this.endResize()),va()).subscribe(),pa(()=>{let e=this.resizable();typeof e=="boolean"?this.model.resizable.set(e):this.model.resizable.set(!0)},{allowSignalWrites:!0})}ngOnInit(){this.model.controlledByResizer.set(!0),this.model.resizerTemplate.set(this.resizer())}ngOnDestroy(){this.model.controlledByResizer.set(!1)}ngAfterViewInit(){this.minWidth=+getComputedStyle(this.hostRef.nativeElement).minWidth.replace("px","")||0,this.minHeight=+getComputedStyle(this.hostRef.nativeElement).minHeight.replace("px","")||0,this.maxWidth=+getComputedStyle(this.hostRef.nativeElement).maxWidth.replace("px","")||1/0,this.maxHeight=+getComputedStyle(this.hostRef.nativeElement).maxHeight.replace("px","")||1/0}startResize(e,i){i.stopPropagation(),this.resizeSide=e,this.model.resizing.set(!0)}resize(e){if(!this.resizeSide)return;let i=mcA(e.movementX,e.movementY,this.zoom()),n=this.applyResize(this.resizeSide,this.model,i,this.getDistanceToEdge(e)),{x:o,y:r,width:s,height:a}=pcA(n,this.model,this.resizeSide,this.minWidth,this.minHeight,this.maxWidth,this.maxHeight);this.model.setPoint({x:o,y:r}),this.model.width.set(s),this.model.height.set(a)}endResize(){this.resizeSide=null,this.model.resizing.set(!1)}getDistanceToEdge(e){let i=this.spacePointContext.documentPointToFlowPoint({x:e.x,y:e.y}),{x:n,y:o}=this.model.globalPoint();return{left:i.x-n,right:i.x-(n+this.model.width()),top:i.y-o,bottom:i.y-(o+this.model.height())}}applyResize(e,i,n,o){let{x:r,y:s}=i.point(),a=i.width(),c=i.height(),[l,d]=this.settingsService.snapGrid();switch(e){case"left":{let C=n.x+o.left,I=Pc(r+C,l),u=I-r;return{x:I,y:s,width:a-u,height:c}}case"right":{let C=n.x+o.right,I=Pc(a+C,l);return{x:r,y:s,width:I,height:c}}case"top":{let C=n.y+o.top,I=Pc(s+C,d),u=I-s;return{x:r,y:I,width:a,height:c-u}}case"bottom":{let C=n.y+o.bottom,I=Pc(c+C,d);return{x:r,y:s,width:a,height:I}}case"top-left":{let C=n.x+o.left,I=n.y+o.top,u=Pc(r+C,l),h=Pc(s+I,d),B=u-r,f=h-s;return{x:u,y:h,width:a-B,height:c-f}}case"top-right":{let C=n.x+o.right,I=n.y+o.top,u=Pc(s+I,d),h=u-s;return{x:r,y:u,width:Pc(a+C,l),height:c-h}}case"bottom-left":{let C=n.x+o.left,I=n.y+o.bottom,u=Pc(r+C,l),h=u-r;return{x:u,y:s,width:a-h,height:Pc(c+I,d)}}case"bottom-right":{let C=n.x+o.right,I=n.y+o.bottom;return{x:r,y:s,width:Pc(a+C,l),height:Pc(c+I,d)}}}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=xe({type:t,selectors:[["","resizable",""]],viewQuery:function(i,n){i&1&&Kr(n.resizer,FsA,5),i&2&&Aa()},inputs:{resizable:[1,"resizable"],resizerColor:[1,"resizerColor"],gap:[1,"gap"]},attrs:GsA,ngContentSelectors:nBe,decls:3,vars:0,consts:[["resizer",""],["stroke-width","2",1,"top",3,"pointerStart"],["stroke-width","2",1,"left",3,"pointerStart"],["stroke-width","2",1,"bottom",3,"pointerStart"],["stroke-width","2",1,"right",3,"pointerStart"],[1,"top-left",3,"pointerStart"],[1,"top-right",3,"pointerStart"],[1,"bottom-left",3,"pointerStart"],[1,"bottom-right",3,"pointerStart"]],template:function(i,n){i&1&&(Kt(),ne(0,KsA,9,40,"ng-template",null,0,a2),NA(2))},dependencies:[Gz],styles:[".top[_ngcontent-%COMP%]{cursor:n-resize}.left[_ngcontent-%COMP%]{cursor:w-resize}.right[_ngcontent-%COMP%]{cursor:e-resize}.bottom[_ngcontent-%COMP%]{cursor:s-resize}.top-left[_ngcontent-%COMP%]{cursor:nw-resize}.top-right[_ngcontent-%COMP%]{cursor:ne-resize}.bottom-left[_ngcontent-%COMP%]{cursor:sw-resize}.bottom-right[_ngcontent-%COMP%]{cursor:se-resize}"],changeDetection:0})}}return XQ([GS],t.prototype,"ngAfterViewInit",null),t})();function mcA(t,A,e){return{x:xS(t/e),y:xS(A/e)}}function pcA(t,A,e,i,n,o,r){let{x:s,y:a,width:c,height:l}=t;c=Math.max(c,0),l=Math.max(l,0),c=Math.max(i,c),l=Math.max(n,l),c=Math.min(o,c),l=Math.min(r,l),s=Math.min(s,A.point().x+A.width()-i),a=Math.min(a,A.point().y+A.height()-n),s=Math.max(s,A.point().x+A.width()-o),a=Math.max(a,A.point().y+A.height()-r);let d=A.parent();if(d){let I=d.width(),u=d.height(),h=A.point().x,B=A.point().y;s=Math.max(s,0),a=Math.max(a,0),e.includes("left")&&s===0&&(c=Math.min(c,h+A.width())),e.includes("top")&&a===0&&(l=Math.min(l,B+A.height())),c=Math.min(c,I-s),l=Math.min(l,u-a)}let C=oBe(A.children());return C&&(e.includes("left")&&(s=Math.min(s,A.point().x+A.width()-(C.x+C.width)),c=Math.max(c,C.x+C.width)),e.includes("right")&&(c=Math.max(c,C.x+C.width)),e.includes("bottom")&&(l=Math.max(l,C.y+C.height)),e.includes("top")&&(a=Math.min(a,A.point().y+A.height()-(C.y+C.height)),l=Math.max(l,C.y+C.height))),{x:s,y:a,width:c,height:l}}var Lz=class{constructor(A,e){this.rawHandle=A,this.parentNode=e,this.strokeWidth=2,this.size=mA({width:10+2*this.strokeWidth,height:10+2*this.strokeWidth}),this.pointAbsolute=ot(()=>({x:this.parentNode.globalPoint().x+this.hostOffset().x+this.sizeOffset().x,y:this.parentNode.globalPoint().y+this.hostOffset().y+this.sizeOffset().y})),this.state=mA("idle"),this.updateHostSizeAndPosition$=new je,this.hostSize=_g(this.updateHostSizeAndPosition$.pipe(aA(()=>this.getHostSize())),{initialValue:{width:0,height:0}}),this.hostPosition=_g(this.updateHostSizeAndPosition$.pipe(aA(()=>({x:this.hostReference instanceof HTMLElement?this.hostReference.offsetLeft:0,y:this.hostReference instanceof HTMLElement?this.hostReference.offsetTop:0}))),{initialValue:{x:0,y:0}}),this.hostOffset=ot(()=>{switch(this.rawHandle.position){case"left":return{x:-this.rawHandle.userOffsetX,y:-this.rawHandle.userOffsetY+this.hostPosition().y+this.hostSize().height/2};case"right":return{x:-this.rawHandle.userOffsetX+this.parentNode.size().width,y:-this.rawHandle.userOffsetY+this.hostPosition().y+this.hostSize().height/2};case"top":return{x:-this.rawHandle.userOffsetX+this.hostPosition().x+this.hostSize().width/2,y:-this.rawHandle.userOffsetY};case"bottom":return{x:-this.rawHandle.userOffsetX+this.hostPosition().x+this.hostSize().width/2,y:-this.rawHandle.userOffsetY+this.parentNode.size().height}}}),this.sizeOffset=ot(()=>{switch(this.rawHandle.position){case"left":return{x:-(this.size().width/2),y:0};case"right":return{x:this.size().width/2,y:0};case"top":return{x:0,y:-(this.size().height/2)};case"bottom":return{x:0,y:this.size().height/2}}}),this.hostReference=this.rawHandle.hostReference,this.template=this.rawHandle.template,this.templateContext={$implicit:{point:this.hostOffset,state:this.state,node:this.parentNode.rawNode}}}updateHost(){this.updateHostSizeAndPosition$.next()}getHostSize(){return this.hostReference instanceof HTMLElement?{width:this.hostReference.offsetWidth,height:this.hostReference.offsetHeight}:this.hostReference instanceof SVGGraphicsElement?this.hostReference.getBBox():{width:0,height:0}}},Kz=(()=>{class t{constructor(){this.injector=E(Dt),this.handleService=E(Nz),this.element=E(eA).nativeElement,this.destroyRef=E(Fr),this.position=lt.required(),this.type=lt.required(),this.id=lt(),this.template=lt(),this.offsetX=lt(0),this.offsetY=lt(0)}ngOnInit(){Xr(this.injector,()=>{let e=this.handleService.node();if(e){let i=new Lz({position:this.position(),type:this.type(),id:this.id(),hostReference:this.element.parentElement,template:this.template(),userOffsetX:this.offsetX(),userOffsetY:this.offsetY()},e);this.handleService.createHandle(i),requestAnimationFrame(()=>i.updateHost()),this.destroyRef.onDestroy(()=>this.handleService.destroyHandle(i))}})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=xe({type:t,selectors:[["handle"]],inputs:{position:[1,"position"],type:[1,"type"],id:[1,"id"],template:[1,"template"],offsetX:[1,"offsetX"],offsetY:[1,"offsetY"]},decls:0,vars:0,template:function(i,n){},encapsulation:2,changeDetection:0})}}return t})(),wcA=(()=>{class t{constructor(){this.nodeAccessor=E(_Q),this.zone=E(yA),this.destroyRef=E(Fr),this.hostElementRef=E(eA)}ngOnInit(){this.nodeAccessor.model().handles$.pipe(Si(i=>OS([...i.map(n=>n.hostReference),this.hostElementRef.nativeElement],this.zone).pipe(aA(()=>i))),Pt(i=>{i.forEach(n=>n.updateHost())}),va(this.destroyRef)).subscribe()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["","nodeHandlesController",""]]})}}return t})(),ycA=(()=>{class t{constructor(){this.nodeAccessor=E(_Q),this.zone=E(yA),this.destroyRef=E(Fr),this.hostElementRef=E(eA)}ngOnInit(){let e=this.nodeAccessor.model(),i=this.hostElementRef.nativeElement;Bi(OS([i],this.zone)).pipe(In(null),$A(()=>!e.resizing()),Pt(()=>{e.width.set(i.clientWidth),e.height.set(i.clientHeight)}),va(this.destroyRef)).subscribe()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["","nodeResizeController",""]]})}}return t})(),IBe=(()=>{class t{constructor(){this.injector=E(Dt),this.handleService=E(Nz),this.draggableService=E(rBe),this.flowStatusService=E(QI),this.nodeRenderingService=E(Sh),this.flowSettingsService=E(Ja),this.selectionService=E(A8),this.hostRef=E(eA),this.nodeAccessor=E(_Q),this.overlaysService=E(lBe),this.connectionController=E(dBe,{optional:!0}),this.model=lt.required(),this.nodeTemplate=lt(),this.nodeSvgTemplate=lt(),this.groupNodeTemplate=lt(),this.showMagnet=ot(()=>this.flowStatusService.status().state==="connection-start"||this.flowStatusService.status().state==="connection-validation"||this.flowStatusService.status().state==="reconnection-start"||this.flowStatusService.status().state==="reconnection-validation"),this.toolbars=ot(()=>this.overlaysService.nodeToolbarsMap().get(this.model()))}ngOnInit(){this.model().isVisible.set(!0),this.nodeAccessor.model.set(this.model()),this.handleService.node.set(this.model()),pa(()=>{this.model().draggable()?this.draggableService.enable(this.hostRef.nativeElement,this.model()):this.draggableService.disable(this.hostRef.nativeElement)},{injector:this.injector})}ngOnDestroy(){this.model().isVisible.set(!1),this.draggableService.destroy(this.hostRef.nativeElement)}startConnection(e,i){e.stopPropagation(),this.connectionController?.startConnection(i)}validateConnection(e){this.connectionController?.validateConnection(e)}resetValidateConnection(e){this.connectionController?.resetValidateConnection(e)}endConnection(){this.connectionController?.endConnection()}pullNode(){this.flowSettingsService.elevateNodesOnSelect()&&this.nodeRenderingService.pullNode(this.model())}selectNode(){this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(this.model())}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=xe({type:t,selectors:[["g","node",""]],hostAttrs:[1,"vflow-node"],inputs:{model:[1,"model"],nodeTemplate:[1,"nodeTemplate"],nodeSvgTemplate:[1,"nodeSvgTemplate"],groupNodeTemplate:[1,"groupNodeTemplate"]},features:[gt([Nz,_Q])],attrs:UsA,decls:11,vars:7,consts:[[1,"selectable"],["nodeHandlesController","",1,"selectable"],["rx","5","ry","5",1,"default-group-node",3,"resizable","gap","resizerColor","default-group-node_selected","stroke","fill"],[1,"selectable",3,"click"],["nodeHandlesController","",3,"selected"],[3,"outerHTML"],["type","source","position","right"],["type","target","position","left"],["nodeHandlesController","","nodeResizeController","",1,"wrapper"],[3,"ngTemplateOutlet","ngTemplateOutletContext","ngTemplateOutletInjector"],["nodeHandlesController","",1,"selectable",3,"click"],[3,"ngComponentOutlet","ngComponentOutletInputs","ngComponentOutletInjector"],["rx","5","ry","5",1,"default-group-node",3,"click","resizable","gap","resizerColor"],[3,"ngTemplateOutlet"],["r","5",1,"default-handle"],[3,"handleSizeController"],[1,"magnet"],["r","5",1,"default-handle",3,"pointerStart","pointerEnd"],[3,"pointerStart","pointerEnd","handleSizeController"],[4,"ngTemplateOutlet","ngTemplateOutletContext"],[1,"magnet",3,"pointerEnd","pointerOver","pointerOut"]],template:function(i,n){if(i&1&&(ne(0,TsA,5,12,":svg:foreignObject",0)(1,OsA,3,9,":svg:foreignObject",0)(2,JsA,2,3,":svg:g",1)(3,HsA,2,3)(4,zsA,1,11,":svg:rect",2)(5,PsA,2,3,":svg:g",1)(6,qsA,1,1),Rt(7,AaA,4,4,null,null,Fi),Rt(9,taA,2,4,":svg:foreignObject",null,Fi)),i&2){let o;$(n.model().rawNode.type==="default"?0:-1),y(),$(n.model().rawNode.type==="html-template"&&n.nodeTemplate()?1:-1),y(),$(n.model().rawNode.type==="svg-template"&&n.nodeSvgTemplate()?2:-1),y(),$(n.model().isComponentType?3:-1),y(),$(n.model().rawNode.type==="default-group"?4:-1),y(),$(n.model().rawNode.type==="template-group"&&n.groupNodeTemplate()?5:-1),y(),$((o=n.model().resizerTemplate())?6:-1,o),y(),Nt(n.model().handles()),y(2),Nt(n.toolbars())}},dependencies:[Gz,fcA,Kz,nl,YI,QcA,BcA,wcA,ycA,ts],styles:[".magnet[_ngcontent-%COMP%]{opacity:0}.wrapper[_ngcontent-%COMP%]{display:table-cell}.default-group-node[_ngcontent-%COMP%]{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected[_ngcontent-%COMP%]{stroke-width:2px}.default-handle[_ngcontent-%COMP%]{stroke:#fff;fill:#1b262c}"],changeDetection:0})}}return t})(),DcA=(()=>{class t{constructor(){this.flowStatusService=E(QI),this.spacePointContext=E(X6),this.flowEntitiesService=E(jc),this.model=lt.required(),this.template=lt(),this.path=ot(()=>{let e=this.flowStatusService.status(),i=this.model().curve;if(e.state==="connection-start"||e.state==="reconnection-start"){let n=e.payload.sourceHandle,o=n.pointAbsolute(),r=n.rawHandle.position,s=this.spacePointContext.svgCurrentSpacePoint(),a=$he(n.rawHandle.position),c=this.getPathFactoryParams(o,s,r,a);switch(i){case"straight":return Sz(c).path;case"bezier":return kz(c).path;case"smooth-step":return kQ(c).path;case"step":return kQ(c,0).path;default:return i(c).path}}if(e.state==="connection-validation"||e.state==="reconnection-validation"){let n=e.payload.sourceHandle,o=n.pointAbsolute(),r=n.rawHandle.position,s=e.payload.targetHandle,a=e.payload.valid?s.pointAbsolute():this.spacePointContext.svgCurrentSpacePoint(),c=e.payload.valid?s.rawHandle.position:$he(n.rawHandle.position),l=this.getPathFactoryParams(o,a,r,c);switch(i){case"straight":return Sz(l).path;case"bezier":return kz(l).path;case"smooth-step":return kQ(l).path;case"step":return kQ(l,0).path;default:return i(l).path}}return null}),this.markerUrl=ot(()=>{let e=this.model().settings.marker;return e?`url(#${xQ(JSON.stringify(e))})`:""}),this.defaultColor="rgb(177, 177, 183)"}getContext(){return{$implicit:{path:this.path,marker:this.markerUrl}}}getPathFactoryParams(e,i,n,o){return{mode:"connection",sourcePoint:e,targetPoint:i,sourcePosition:n,targetPosition:o,allEdges:this.flowEntitiesService.rawEdges(),allNodes:this.flowEntitiesService.rawNodes()}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=xe({type:t,selectors:[["g","connection",""]],inputs:{model:[1,"model"],template:[1,"template"]},attrs:iaA,decls:2,vars:2,consts:[["fill","none","stroke-width","2"],[4,"ngTemplateOutlet","ngTemplateOutletContext"]],template:function(i,n){i&1&&ne(0,oaA,1,1)(1,aaA,1,1),i&2&&($(n.model().type==="default"?0:-1),y(),$(n.model().type==="template"?1:-1))},dependencies:[nl],encapsulation:2,changeDetection:0})}}return t})();function $he(t){switch(t){case"top":return"bottom";case"bottom":return"top";case"left":return"right";case"right":return"left"}}function vcA(){return String.fromCharCode(65+Math.floor(Math.random()*26))+Date.now()}var bcA="#fff",McA=20,ScA=2,eBe="rgb(177, 177, 183)",ABe=.1,kcA=!0,xcA=(()=>{class t{constructor(){this.viewportService=E(Mh),this.rootSvg=E(US).element,this.settingsService=E(Ja),this.backgroundSignal=this.settingsService.background,this.scaledGap=ot(()=>{let e=this.backgroundSignal();return e.type==="dots"?this.viewportService.readableViewport().zoom*(e.gap??McA):0}),this.x=ot(()=>this.viewportService.readableViewport().x%this.scaledGap()),this.y=ot(()=>this.viewportService.readableViewport().y%this.scaledGap()),this.patternColor=ot(()=>{let e=this.backgroundSignal();return e.type==="dots"?e.color??eBe:eBe}),this.patternSize=ot(()=>{let e=this.backgroundSignal();return e.type==="dots"?this.viewportService.readableViewport().zoom*(e.size??ScA)/2:0}),this.bgImageSrc=ot(()=>{let e=this.backgroundSignal();return e.type==="image"?e.src:""}),this.imageSize=e8(vo(this.backgroundSignal).pipe(Si(()=>_cA(this.bgImageSrc())),aA(e=>({width:e.naturalWidth,height:e.naturalHeight}))),{initialValue:{width:0,height:0}}),this.scaledImageWidth=ot(()=>{let e=this.backgroundSignal();if(e.type==="image"){let i=e.fixed?1:this.viewportService.readableViewport().zoom;return this.imageSize().width*i*(e.scale??ABe)}return 0}),this.scaledImageHeight=ot(()=>{let e=this.backgroundSignal();if(e.type==="image"){let i=e.fixed?1:this.viewportService.readableViewport().zoom;return this.imageSize().height*i*(e.scale??ABe)}return 0}),this.imageX=ot(()=>{let e=this.backgroundSignal();return e.type==="image"?e.repeat?e.fixed?0:this.viewportService.readableViewport().x%this.scaledImageWidth():e.fixed?0:this.viewportService.readableViewport().x:0}),this.imageY=ot(()=>{let e=this.backgroundSignal();return e.type==="image"?e.repeat?e.fixed?0:this.viewportService.readableViewport().y%this.scaledImageHeight():e.fixed?0:this.viewportService.readableViewport().y:0}),this.repeated=ot(()=>{let e=this.backgroundSignal();return e.type==="image"&&(e.repeat??kcA)}),this.patternId=vcA(),this.patternUrl=`url(#${this.patternId})`,pa(()=>{let e=this.backgroundSignal();e.type==="dots"&&(this.rootSvg.style.backgroundColor=e.backgroundColor??bcA),e.type==="solid"&&(this.rootSvg.style.backgroundColor=e.color)})}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=xe({type:t,selectors:[["g","background",""]],attrs:caA,decls:2,vars:2,consts:[["patternUnits","userSpaceOnUse"],["x","0","y","0","width","100%","height","100%"]],template:function(i,n){i&1&&ne(0,laA,3,10)(1,CaA,2,2),i&2&&($(n.backgroundSignal().type==="dots"?0:-1),y(),$(n.backgroundSignal().type==="image"?1:-1))},encapsulation:2,changeDetection:0})}}return t})();function _cA(t){let A=new Image;return A.src=t,new Promise(e=>{A.onload=()=>e(A)})}var RcA=(()=>{class t{constructor(){this.markers=lt.required(),this.defaultColor="rgb(177, 177, 183)"}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=xe({type:t,selectors:[["defs","flowDefs",""]],inputs:{markers:[1,"markers"]},attrs:IaA,decls:3,vars:2,consts:[["viewBox","-10 -10 20 20","refX","0","refY","0"],["points","-5,-4 1,0 -5,4 -5,-4",1,"marker__arrow_closed",3,"stroke","stroke-width","fill"],["points","-5,-4 0,0 -5,4",1,"marker__arrow_default",3,"stroke","stroke-width"],["points","-5,-4 1,0 -5,4 -5,-4",1,"marker__arrow_closed"],["points","-5,-4 0,0 -5,4",1,"marker__arrow_default"]],template:function(i,n){i&1&&(Rt(0,BaA,3,7,":svg:marker",0,Fi),Ii(2,"keyvalue")),i&2&&Nt(Qi(2,0,n.markers()))},dependencies:[HI],styles:[".marker__arrow_default[_ngcontent-%COMP%]{stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;fill:none}.marker__arrow_closed[_ngcontent-%COMP%]{stroke-linecap:round;stroke-linejoin:round}"],changeDetection:0})}}return t})(),NcA=(()=>{class t{constructor(){this.host=E(eA),this.flowSettingsService=E(Ja),this.flowWidth=ot(()=>{let e=this.flowSettingsService.view();return e==="auto"?"100%":e[0]}),this.flowHeight=ot(()=>{let e=this.flowSettingsService.view();return e==="auto"?"100%":e[1]}),OS([this.host.nativeElement],E(yA)).pipe(Pt(([e])=>{this.flowSettingsService.computedFlowWidth.set(e.contentRect.width),this.flowSettingsService.computedFlowHeight.set(e.contentRect.height)}),va()).subscribe()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["svg","flowSizeController",""]],hostVars:2,hostBindings:function(i,n){i&2&&AA("width",n.flowWidth())("height",n.flowHeight())}})}}return t})(),LcA=(()=>{class t{constructor(){this.flowStatusService=E(QI)}resetConnection(){let e=this.flowStatusService.status();(e.state==="connection-start"||e.state==="reconnection-start")&&this.flowStatusService.setIdleStatus()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["svg","rootSvgContext",""]],hostBindings:function(i,n){i&1&&ee("mouseup",function(){return n.resetConnection()},!1,n2)("touchend",function(){return n.resetConnection()},!1,n2)("contextmenu",function(){return n.resetConnection()})}})}}return t})();function Fz(t,A){let e=[];for(let i of A){let{x:n,y:o}=i.globalPoint();t.x>=n&&t.x<=n+i.width()&&t.y>=o&&t.y<=o+i.height()&&e.push({x:t.x-n,y:t.y-o,spaceNodeId:i.rawNode.id})}return e.reverse(),e.push({spaceNodeId:null,x:t.x,y:t.y}),e}var Uz=(()=>{class t{static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return t})(),FcA=(()=>{class t extends Uz{shouldRenderNode(e){return!e.isVisible()}static{this.\u0275fac=(()=>{let e;return function(n){return(e||(e=ii(t)))(n||t)}})()}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return t})();function GcA(t,A){if(Object.keys(A.preview().style).length){TcA(t,A);return}if(A.rawNode.type==="default"){KcA(t,A);return}if(A.rawNode.type==="default-group"){UcA(t,A);return}OcA(t,A)}function KcA(t,A){let e=A.globalPoint(),i=A.width(),n=A.height();uBe(t,A,5),t.fillStyle="white",t.fill(),t.strokeStyle="#1b262c",t.lineWidth=1.5,t.stroke(),t.fillStyle="black",t.font="14px Arial",t.textAlign="center",t.textBaseline="middle";let o=e.x+i/2,r=e.y+n/2;t.fillText(A.text(),o,r)}function UcA(t,A){let e=A.globalPoint(),i=A.width(),n=A.height();t.globalAlpha=.05,t.fillStyle=A.color(),t.fillRect(e.x,e.y,i,n),t.globalAlpha=1,t.strokeStyle=A.color(),t.lineWidth=1.5,t.strokeRect(e.x,e.y,i,n)}function TcA(t,A){let e=A.globalPoint(),i=A.width(),n=A.height(),o=A.preview().style;if(o.borderRadius){let r=parseFloat(o.borderRadius);uBe(t,A,r)}else t.beginPath(),t.rect(e.x,e.y,i,n),t.closePath();o.backgroundColor&&(t.fillStyle=o.backgroundColor),o.borderColor&&(t.strokeStyle=o.borderColor),o.borderWidth&&(t.lineWidth=parseFloat(o.borderWidth)),t.fill(),t.stroke()}function OcA(t,A){let e=A.globalPoint(),i=A.width(),n=A.height();t.fillStyle="rgb(0 0 0 / 10%)",t.fillRect(e.x,e.y,i,n)}function uBe(t,A,e){let i=A.globalPoint(),n=A.width(),o=A.height();t.beginPath(),t.moveTo(i.x+e,i.y),t.lineTo(i.x+n-e,i.y),t.quadraticCurveTo(i.x+n,i.y,i.x+n,i.y+e),t.lineTo(i.x+n,i.y+o-e),t.quadraticCurveTo(i.x+n,i.y+o,i.x+n-e,i.y+o),t.lineTo(i.x+e,i.y+o),t.quadraticCurveTo(i.x,i.y+o,i.x,i.y+o-e),t.lineTo(i.x,i.y+e),t.quadraticCurveTo(i.x,i.y,i.x+e,i.y),t.closePath()}var JcA=(()=>{class t{constructor(){this.viewportService=E(Mh),this.renderStrategy=E(Uz),this.nodeRenderingService=E(Sh),this.renderer2=E(an),this.element=E(eA).nativeElement,this.ctx=this.element.getContext("2d"),this.width=lt(0),this.height=lt(0),this.dpr=window.devicePixelRatio,pa(()=>{this.renderer2.setProperty(this.element,"width",this.width()*this.dpr),this.renderer2.setProperty(this.element,"height",this.height()*this.dpr),this.renderer2.setStyle(this.element,"width",`${this.width()}px`),this.renderer2.setStyle(this.element,"height",`${this.height()}px`),this.ctx.scale(this.dpr,this.dpr)}),pa(()=>{let e=this.viewportService.readableViewport();this.ctx.clearRect(0,0,this.width(),this.height()),this.ctx.save(),this.ctx.setTransform(e.zoom*this.dpr,0,0,e.zoom*this.dpr,e.x*this.dpr,e.y*this.dpr);for(let i=0;i{class t{constructor(){this.nodeRenderingService=E(Sh),this.edgeRenderingService=E(KS),this.flowEntitiesService=E(jc),this.settingsService=E(Ja),this.flowInitialized=mA(!1),E(yA).runOutsideAngular(()=>Ci(this,null,function*(){yield YcA(2),this.flowInitialized.set(!0)}))}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275prov=be({token:t,factory:t.\u0275fac})}}return t})();function YcA(t){return new Promise(A=>{let e=0;function i(){e++,e{class t{constructor(){this.nodeRenderingService=E(Sh),this.flowStatus=E(QI),this.tolerance=lt(10),this.lineColor=lt("#1b262c"),this.isNodeDragging=ot(()=>Yhe(this.flowStatus.status())),this.intersections=LS(e=>{let i=this.flowStatus.status();if(Yhe(i)){let n=i.payload.node,o=iBe(SS(n)),r=this.nodeRenderingService.viewportNodes().filter(C=>C!==n).filter(C=>!n.children().includes(C)).map(C=>iBe(SS(C))),s=[],a=o.x,c=o.y,l=1/0,d=1/0;return r.forEach(C=>{let I=o.left+o.width/2,u=C.left+C.width/2;for(let[f,b,k,S]of[[I,u,u-o.width/2,!0],[o.left,C.left,C.left,!1],[o.left,C.right,C.right,!1],[o.right,C.left,C.left-o.width,!1],[o.right,C.right,C.right-o.width,!1]]){let w=Math.abs(f-b);if(w<=this.tolerance()){let _=Math.min(o.top,C.top),K=Math.max(o.bottom,C.bottom);if(s.push({x:b,y:_,x2:b,y2:K,isCenter:S}),we.payload.node),aA(e=>[e,this.intersections()]),Pt(([e,i])=>{if(i){let n={x:i.snappedX,y:i.snappedY},o=e.parent()?[e.parent()]:[];e.setPoint(Fz(n,o)[0])}}),va()).subscribe()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=xe({type:t,selectors:[["g","alignmentHelper",""]],inputs:{tolerance:[1,"tolerance"],lineColor:[1,"lineColor"]},attrs:faA,decls:1,vars:1,template:function(i,n){i&1&&ne(0,paA,1,1),i&2&&$(n.isNodeDragging()?0:-1)},encapsulation:2,changeDetection:0})}}return t})();var hBe=(()=>{class t{constructor(){this.viewportService=E(Mh),this.flowEntitiesService=E(jc),this.nodesChangeService=E(_z),this.edgesChangeService=E(Rz),this.nodeRenderingService=E(Sh),this.edgeRenderingService=E(KS),this.flowSettingsService=E(Ja),this.componentEventBusService=E(Mz),this.keyboardService=E(bz),this.injector=E(Dt),this.flowRenderingService=E(tBe),this.alignmentHelper=lt(!1),this.nodeModels=this.nodeRenderingService.nodes,this.groups=this.nodeRenderingService.groups,this.nonGroups=this.nodeRenderingService.nonGroups,this.edgeModels=this.edgeRenderingService.edges,this.onComponentNodeEvent=Xn(this.componentEventBusService.event$),this.nodeTemplateDirective=o2(_S),this.nodeSvgTemplateDirective=o2(jhe),this.groupNodeTemplateDirective=o2(RS),this.edgeTemplateDirective=o2(Hhe),this.edgeLabelHtmlDirective=o2(Phe),this.connectionTemplateDirective=o2(zhe),this.mapContext=es(yz),this.spacePointContext=es.required(X6),this.viewport=this.viewportService.readableViewport.asReadonly(),this.nodesChange=e8(this.nodesChangeService.changes$,{initialValue:[]}),this.edgesChange=e8(this.edgesChangeService.changes$,{initialValue:[]}),this.initialized=this.flowRenderingService.flowInitialized.asReadonly(),this.viewportChange$=vo(this.viewportService.readableViewport).pipe(Pa(1)),this.nodesChange$=this.nodesChangeService.changes$,this.edgesChange$=this.edgesChangeService.changes$,this.initialized$=vo(this.flowRenderingService.flowInitialized),this.markers=this.flowEntitiesService.markers,this.minimap=this.flowEntitiesService.minimap,this.flowOptimization=this.flowSettingsService.optimization,this.flowWidth=this.flowSettingsService.computedFlowWidth,this.flowHeight=this.flowSettingsService.computedFlowHeight}set view(e){this.flowSettingsService.view.set(e)}set minZoom(e){this.flowSettingsService.minZoom.set(e)}set maxZoom(e){this.flowSettingsService.maxZoom.set(e)}set background(e){this.flowSettingsService.background.set(IcA(e))}set optimization(e){this.flowSettingsService.optimization.update(i=>ae(ae({},i),e))}set entitiesSelectable(e){this.flowSettingsService.entitiesSelectable.set(e)}set keyboardShortcuts(e){this.keyboardService.setShortcuts(e)}set connection(e){this.flowEntitiesService.connection.set(e)}get connection(){return this.flowEntitiesService.connection()}set snapGrid(e){this.flowSettingsService.snapGrid.set(e)}set elevateNodesOnSelect(e){this.flowSettingsService.elevateNodesOnSelect.set(e)}set elevateEdgesOnSelect(e){this.flowSettingsService.elevateEdgesOnSelect.set(e)}set nodes(e){let i=Xr(this.injector,()=>FS.nodes(e,this.flowEntitiesService.nodes()));Vhe(i,this.flowEntitiesService.edges()),this.flowEntitiesService.nodes.set(i),i.forEach(n=>this.nodeRenderingService.pullNode(n))}set edges(e){let i=Xr(this.injector,()=>FS.edges(e,this.flowEntitiesService.edges()));Vhe(this.flowEntitiesService.nodes(),i),this.flowEntitiesService.edges.set(i)}viewportTo(e){this.viewportService.writableViewport.set({changeType:"absolute",state:e,duration:0})}zoomTo(e){this.viewportService.writableViewport.set({changeType:"absolute",state:{zoom:e},duration:0})}panTo(e){this.viewportService.writableViewport.set({changeType:"absolute",state:e,duration:0})}fitView(e){this.viewportService.fitView(e)}getNode(e){return this.flowEntitiesService.getNode(e)?.rawNode}getDetachedEdges(){return this.flowEntitiesService.getDetachedEdges().map(e=>e.edge)}documentPointToFlowPoint(e,i){let n=this.spacePointContext().documentPointToFlowPoint(e);return i?.spaces?Fz(n,this.nodeRenderingService.groups()):n}getIntesectingNodes(e,i={partially:!0}){return FaA(e,this.nodeModels(),i).map(n=>n.rawNode)}toNodeSpace(e,i){let n=this.nodeModels().find(r=>r.rawNode.id===e);if(!n)return{x:1/0,y:1/0};if(i===null)return n.globalPoint();let o=this.nodeModels().find(r=>r.rawNode.id===i);return o?Fz(n.globalPoint(),[o])[0]:{x:1/0,y:1/0}}trackNodes(e,{rawNode:i}){return i}trackEdges(e,{edge:i}){return i}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=xe({type:t,selectors:[["vflow"]],contentQueries:function(i,n,o){i&1&&(r2(o,n.nodeTemplateDirective,_S,5),r2(o,n.nodeSvgTemplateDirective,jhe,5),r2(o,n.groupNodeTemplateDirective,RS,5),r2(o,n.edgeTemplateDirective,Hhe,5),r2(o,n.edgeLabelHtmlDirective,Phe,5),r2(o,n.connectionTemplateDirective,zhe,5)),i&2&&Aa(6)},viewQuery:function(i,n){i&1&&(Kr(n.mapContext,yz,5),Kr(n.spacePointContext,X6,5)),i&2&&Aa(2)},inputs:{view:"view",minZoom:"minZoom",maxZoom:"maxZoom",background:"background",optimization:"optimization",entitiesSelectable:"entitiesSelectable",keyboardShortcuts:"keyboardShortcuts",connection:[2,"connection","connection",e=>new kS(e)],snapGrid:"snapGrid",elevateNodesOnSelect:"elevateNodesOnSelect",elevateEdgesOnSelect:"elevateEdgesOnSelect",nodes:"nodes",alignmentHelper:[1,"alignmentHelper"],edges:"edges"},outputs:{onComponentNodeEvent:"onComponentNodeEvent"},features:[gt([rBe,Mh,QI,jc,_z,Rz,Sh,KS,A8,Ja,Mz,bz,lBe,{provide:Uz,useClass:FcA},tBe]),Hw([{directive:CcA,outputs:["onNodesChange","onNodesChange","onNodesChange.position","onNodesChange.position","onNodesChange.position.single","onNodesChange.position.single","onNodesChange.position.many","onNodesChange.position.many","onNodesChange.size","onNodesChange.size","onNodesChange.size.single","onNodesChange.size.single","onNodesChange.size.many","onNodesChange.size.many","onNodesChange.add","onNodesChange.add","onNodesChange.add.single","onNodesChange.add.single","onNodesChange.add.many","onNodesChange.add.many","onNodesChange.remove","onNodesChange.remove","onNodesChange.remove.single","onNodesChange.remove.single","onNodesChange.remove.many","onNodesChange.remove.many","onNodesChange.select","onNodesChange.select","onNodesChange.select.single","onNodesChange.select.single","onNodesChange.select.many","onNodesChange.select.many","onEdgesChange","onEdgesChange","onEdgesChange.detached","onEdgesChange.detached","onEdgesChange.detached.single","onEdgesChange.detached.single","onEdgesChange.detached.many","onEdgesChange.detached.many","onEdgesChange.add","onEdgesChange.add","onEdgesChange.add.single","onEdgesChange.add.single","onEdgesChange.add.many","onEdgesChange.add.many","onEdgesChange.remove","onEdgesChange.remove","onEdgesChange.remove.single","onEdgesChange.remove.single","onEdgesChange.remove.many","onEdgesChange.remove.many","onEdgesChange.select","onEdgesChange.select","onEdgesChange.select.single","onEdgesChange.select.single","onEdgesChange.select.many","onEdgesChange.select.many"]}])],decls:11,vars:8,consts:[["flow",""],["rootSvgRef","","rootSvgContext","","rootPointer","","flowSizeController","",1,"root-svg"],["flowDefs","",3,"markers"],["background",""],["mapContext","","spacePointContext",""],["connection","",3,"model","template"],[3,"ngTemplateOutlet"],["previewFlow","",1,"preview-flow",3,"width","height"],["alignmentHelper",""],["alignmentHelper","",3,"tolerance","lineColor"],["node","",3,"model","groupNodeTemplate"],["edge","",3,"model","edgeTemplate","edgeLabelHtmlTemplate"],["node","",3,"model","nodeTemplate","nodeSvgTemplate"],["node","",3,"model","nodeTemplate","nodeSvgTemplate","groupNodeTemplate"]],template:function(i,n){if(i&1&&(ft(),m(0,"svg",1,0),ve(2,"defs",2)(3,"g",3),m(4,"g",4),ne(5,DaA,2,1),ve(6,"g",5),ne(7,SaA,6,0)(8,_aA,4,0),p(),ne(9,RaA,1,1,":svg:ng-container",6),p(),ne(10,NaA,1,2,"canvas",7)),i&2){let o,r,s;y(2),te("markers",n.markers()),y(3),$((o=n.alignmentHelper())?5:-1,o),y(),te("model",n.connection)("template",(r=n.connectionTemplateDirective())==null?null:r.templateRef),y(),$(n.flowOptimization().detachedGroupsLayer?7:-1),y(),$(n.flowOptimization().detachedGroupsLayer?-1:8),y(),$((s=n.minimap())?9:-1,s),y(),$(n.flowOptimization().virtualization?10:-1)}},dependencies:[US,LcA,TS,NcA,RcA,xcA,yz,X6,DcA,IBe,CBe,nl,JcA,HcA],styles:["[_nghost-%COMP%]{display:grid;grid-template-columns:1fr;width:100%;height:100%;-webkit-user-select:none;user-select:none}[_nghost-%COMP%] *{box-sizing:border-box}.root-svg[_ngcontent-%COMP%]{grid-row-start:1;grid-column-start:1}.preview-flow[_ngcontent-%COMP%]{pointer-events:none;grid-row-start:1;grid-column-start:1}"],changeDetection:0})}}return t})();var BBe=(()=>{class t{constructor(){this.flowSettingsService=E(Ja),this.selectionService=E(A8),this.parentEdge=E(CBe,{optional:!0}),this.parentNode=E(IBe,{optional:!0}),this.host=E(eA),this.selectOnEvent=this.getEvent$().pipe(Pt(()=>this.select()),va()).subscribe()}select(){let e=this.entity();e&&this.flowSettingsService.entitiesSelectable()&&this.selectionService.select(e)}entity(){return this.parentNode?this.parentNode.model():this.parentEdge?this.parentEdge.model():null}getEvent$(){return Ya(this.host.nativeElement,"click")}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275dir=Oe({type:t,selectors:[["","selectable",""]]})}}return t})();var PcA=["canvas"],jcA=["svgCanvas"],VcA=()=>({type:"dots",color:"#424242",size:1,gap:12}),qcA=()=>[12,12],WcA=(t,A)=>A.name;function ZcA(t,A){if(t&1){let e=Ue();m(0,"div",6)(1,"div",11)(2,"button",12),ee("click",function(){q(e);let n=M();return W(n.backToMainCanvas())}),m(3,"mat-icon"),T(4,"arrow_back"),p()(),m(5,"div",13)(6,"span",14),T(7,"smart_toy"),p(),m(8,"div",15)(9,"h3",16),T(10),p(),m(11,"p",17),T(12,"Agent Tool"),p()()()()()}if(t&2){let e=M();y(2),te("matTooltip",e.getBackButtonTooltip()),y(8),Pe(e.currentAgentTool())}}function XcA(t,A){if(t&1){let e=Ue();m(0,"span",18),ee("click",function(){q(e);let n=M();return W(n.toggleSidePanelRequest.emit())}),T(1,"left_panel_open"),p()}}function $cA(t,A){if(t&1){let e=Ue();ft(),m(0,"foreignObject"),$s(),m(1,"div",27),ee("click",function(n){return q(e),W(n.stopPropagation())}),m(2,"button",28,0),ee("click",function(n){return q(e),W(n.stopPropagation())}),m(4,"mat-icon"),T(5,"add"),p()(),m(6,"span",29),T(7,"Add sub-agent"),p(),m(8,"mat-menu",null,1)(10,"button",30),ee("click",function(n){let o;q(e);let r=Ji(3),s=M().$implicit,a=M(2);return W(a.handleAgentTypeSelection("LlmAgent",s.node.data==null||(o=s.node.data())==null?null:o.name,r,n,!0))}),m(11,"mat-icon"),T(12,"psychology"),p(),m(13,"span"),T(14,"LLM Agent"),p()(),m(15,"button",30),ee("click",function(n){let o;q(e);let r=Ji(3),s=M().$implicit,a=M(2);return W(a.handleAgentTypeSelection("SequentialAgent",s.node.data==null||(o=s.node.data())==null?null:o.name,r,n,!0))}),m(16,"mat-icon"),T(17,"more_horiz"),p(),m(18,"span"),T(19,"Sequential Agent"),p()(),m(20,"button",30),ee("click",function(n){let o;q(e);let r=Ji(3),s=M().$implicit,a=M(2);return W(a.handleAgentTypeSelection("LoopAgent",s.node.data==null||(o=s.node.data())==null?null:o.name,r,n,!0))}),m(21,"mat-icon"),T(22,"sync"),p(),m(23,"span"),T(24,"Loop Agent"),p()(),m(25,"button",30),ee("click",function(n){let o;q(e);let r=Ji(3),s=M().$implicit,a=M(2);return W(a.handleAgentTypeSelection("ParallelAgent",s.node.data==null||(o=s.node.data())==null?null:o.name,r,n,!0))}),m(26,"mat-icon"),T(27,"density_medium"),p(),m(28,"span"),T(29,"Parallel Agent"),p()()()()()}if(t&2){let e=Ji(9),i=M().$implicit;AA("width",200)("height",100)("x",i.width()/2-100)("y",i.height()/2-40),y(2),te("matMenuTriggerFor",e)}}function elA(t,A){t&1&&(ft(),ve(0,"handle",26))}function AlA(t,A){if(t&1){let e=Ue();ft(),m(0,"g")(1,"rect",21),ee("click",function(n){let o=q(e).$implicit,r=M(2);return W(r.onGroupClick(o.node,n))})("pointerdown",function(n){let o=q(e).$implicit,r=M(2);return W(r.onGroupPointerDown(o.node,n))}),p(),m(2,"foreignObject",22),$s(),m(3,"div",23)(4,"mat-icon",24),T(5),p(),m(6,"span",25),T(7),p()()(),ne(8,$cA,30,5,":svg:foreignObject")(9,elA,1,0,":svg:handle",26),p()}if(t&2){let e,i,n=A.$implicit,o=M(2);y(),cn("stroke",o.isGroupSelected(n.node)?"rgba(0, 187, 234, 0.8)":"rgba(0, 187, 234, 0.3)")("fill",o.isGroupSelected(n.node)?"rgba(0, 187, 234, 0.1)":"rgba(0, 187, 234, 0.03)")("stroke-width",o.isGroupSelected(n.node)?3:2),AA("width",n.width())("height",n.height()),y(),AA("width",200)("height",32),y(3),Pe(o.getAgentIcon(n.node.data==null||(e=n.node.data())==null?null:e.agent_class)),y(2),Pe(n.node.data==null||(i=n.node.data())==null?null:i.agent_class),y(),$(o.isGroupEmpty(n.node.id)?8:-1),y(),$(o.shouldShowTopHandle(n.node)?9:-1)}}function tlA(t,A){t&1&&(m(0,"span",35),T(1,"Root"),p())}function ilA(t,A){if(t&1){let e=Ue();m(0,"button",43),ee("click",function(n){q(e),M();let o=s2(1);return M(2).openDeleteSubAgentDialog(o),W(n.stopPropagation())}),m(1,"mat-icon"),T(2,"delete"),p()()}}function nlA(t,A){if(t&1){let e=Ue();m(0,"div",46),ee("click",function(n){let o=q(e).$implicit,r=M(2).$implicit;return M(2).selectTool(o,r.node),W(n.stopPropagation())}),m(1,"mat-icon",47),T(2),p(),m(3,"span",48),T(4),p()()}if(t&2){let e=A.$implicit,i=M(4);y(2),Pe(i.getToolIcon(e)),y(2),Pe(e.name)}}function olA(t,A){if(t&1&&(m(0,"div",38)(1,"div",44),Rt(2,nlA,5,2,"div",45,WcA),p()()),t&2){M();let e=s2(4);y(2),Nt(e)}}function rlA(t,A){if(t&1){let e=Ue();m(0,"div",39)(1,"button",49,2),ee("click",function(n){return q(e),W(n.stopPropagation())}),m(3,"span",50),T(4,"+"),p()(),m(5,"mat-menu",null,3)(7,"button",30),ee("click",function(n){let o;q(e);let r=Ji(2),s=M().$implicit,a=M(2);return W(a.handleAgentTypeSelection("LlmAgent",(o=s.node.data())==null?null:o.name,r,n))}),m(8,"mat-icon"),T(9,"psychology"),p(),m(10,"span"),T(11,"LLM Agent"),p()(),m(12,"button",30),ee("click",function(n){let o;q(e);let r=Ji(2),s=M().$implicit,a=M(2);return W(a.handleAgentTypeSelection("SequentialAgent",(o=s.node.data())==null?null:o.name,r,n))}),m(13,"mat-icon"),T(14,"more_horiz"),p(),m(15,"span"),T(16,"Sequential Agent"),p()(),m(17,"button",30),ee("click",function(n){let o;q(e);let r=Ji(2),s=M().$implicit,a=M(2);return W(a.handleAgentTypeSelection("LoopAgent",(o=s.node.data())==null?null:o.name,r,n))}),m(18,"mat-icon"),T(19,"sync"),p(),m(20,"span"),T(21,"Loop Agent"),p()(),m(22,"button",30),ee("click",function(n){let o;q(e);let r=Ji(2),s=M().$implicit,a=M(2);return W(a.handleAgentTypeSelection("ParallelAgent",(o=s.node.data())==null?null:o.name,r,n))}),m(23,"mat-icon"),T(24,"density_medium"),p(),m(25,"span"),T(26,"Parallel Agent"),p()()()()}if(t&2){let e=Ji(6);y(),te("matMenuTriggerFor",e)}}function slA(t,A){t&1&&ve(0,"handle",40)}function alA(t,A){t&1&&ve(0,"handle",26)}function clA(t,A){t&1&&ve(0,"handle",41)}function llA(t,A){t&1&&ve(0,"handle",42)}function glA(t,A){if(t&1){let e=Ue();Wa(0)(1)(2),Ii(3,"async"),Wa(4)(5),m(6,"div",31),ee("click",function(n){let o=q(e).$implicit,r=M(2);return W(r.onCustomTemplateNodeClick(o.node,n))})("pointerdown",function(n){let o=q(e).$implicit,r=M(2);return W(r.onNodePointerDown(o.node,n))}),m(7,"div",32)(8,"div",33)(9,"mat-icon",34),T(10),p(),T(11),ne(12,tlA,2,0,"span",35),p(),m(13,"div",36),ne(14,ilA,3,0,"button",37),p()(),ne(15,olA,4,0,"div",38)(16,rlA,27,1,"div",39)(17,slA,1,0,"handle",40)(18,alA,1,0,"handle",26)(19,clA,1,0,"handle",41)(20,llA,1,0,"handle",42),p()}if(t&2){let e=A.$implicit,i=M(2),n=e.node.data==null?null:e.node.data();y();let o=S1((n==null?null:n.name)||"root_agent"),r=Qi(3,17,i.toolsMap$);y(3);let a=S1(i.getToolsForNode(o,r)).length>0;y(2),iA("custom-node_selected",i.isNodeSelected(e.node))("custom-node_has-tools",a)("in-group",e.node.parentId&&e.node.parentId()),y(4),Pe(i.getAgentIcon(n==null?null:n.agent_class)),y(),FA(" ",o," "),y(),$(i.isRootAgent(o)?12:-1),y(2),$(i.isRootAgentForCurrentTab(o)?-1:14),y(),$(a?15:-1),y(),$(i.shouldShowAddButton(e.node)?16:-1),y(),$(i.shouldShowLeftHandle(e.node)?17:-1),y(),$(i.shouldShowTopHandle(e.node)?18:-1),y(),$(i.shouldShowRightHandle(e.node)?19:-1),y(),$(i.shouldShowBottomHandle(e.node)?20:-1)}}function dlA(t,A){if(t&1&&(m(0,"vflow",8),ne(1,AlA,10,14,"ng-template",19)(2,glA,21,20,"ng-template",20),p()),t&2){let e=M();te("nodes",e.vflowNodes())("edges",e.edges())("background",v4(4,VcA))("snapGrid",v4(5,qcA))}}function ClA(t,A){t&1&&(m(0,"div",9)(1,"div",51)(2,"mat-icon",52),T(3,"touch_app"),p(),m(4,"h4"),T(5,"Start Building Your ADK"),p(),m(6,"p"),T(7,"Drag components from the left panel to create your workflow"),p(),m(8,"div",53)(9,"div",54)(10,"mat-icon"),T(11,"drag_indicator"),p(),m(12,"span"),T(13,"Drag to move nodes"),p()(),m(14,"div",54)(15,"mat-icon"),T(16,"link"),p(),m(17,"span"),T(18,"Shift + Click to connect nodes"),p()()()()())}var RQ=class t{constructor(A,e,i){this.dialog=A;this.agentService=e;this.router=i;this.toolsMap$=this.agentBuilderService.getAgentToolsMap(),this.agentBuilderService.getSelectedTool().subscribe(n=>{this.selectedTool=n})}_snackBar=E(P1);canvasRef;svgCanvasRef;agentBuilderService=E(Ud);cdr=E(ut);showSidePanel=!0;showBuilderAssistant=!1;appNameInput="";toggleSidePanelRequest=new Ve;builderAssistantCloseRequest=new Ve;ctx;connections=mA([]);nodeId=1;edgeId=1;callbackId=1;toolId=1;appName="";nodes=mA([]);edges=mA([]);workflowShellWidth=340;workflowGroupWidth=420;workflowGroupHeight=220;workflowGroupYOffset=180;workflowGroupXOffset=-40;workflowInnerNodePoint={x:40,y:80};groupNodes=mA([]);vflowNodes=ot(()=>[...this.groupNodes(),...this.nodes()]);selectedAgents=[];selectedTool;selectedCallback;currentAgentTool=mA(null);agentToolBoards=mA(new Map);isAgentToolMode=!1;navigationStack=[];existingAgent=void 0;toolsMap$;nodePositions=new Map;ngOnInit(){this.agentService.getApp().subscribe(A=>{A&&(this.appName=A)}),this.appNameInput&&(this.appName=this.appNameInput),this.agentBuilderService.getNewTabRequest().subscribe(A=>{if(A){let{tabName:e,currentAgentName:i}=A;this.switchToAgentToolBoard(e,i)}}),this.agentBuilderService.getTabDeletionRequest().subscribe(A=>{A&&this.deleteAgentToolBoard(A)}),this.agentBuilderService.getSelectedCallback().subscribe(A=>{this.selectedCallback=A}),this.agentBuilderService.getAgentCallbacks().subscribe(A=>{if(A){let e=this.nodes().find(i=>i.data?i.data().name===A.agentName:void 0);if(e&&e.data){let i=e.data();i.callbacks=A.callbacks,e.data.set(i)}}}),this.agentBuilderService.getDeleteSubAgentSubject().subscribe(A=>{A&&this.openDeleteSubAgentDialog(A)}),this.agentBuilderService.getAddSubAgentSubject().subscribe(A=>{A.parentAgentName&&this.addSubAgent(A.parentAgentName,A.agentClass,A.isFromEmptyGroup)}),this.agentBuilderService.getSelectedNode().subscribe(A=>{this.selectedAgents=this.nodes().filter(e=>e.data&&e.data().name===A?.name)}),this.toolsMap$.subscribe(A=>{this.nodes().some(i=>i.parentId&&i.parentId())&&this.groupNodes().length>0&&this.updateGroupDimensions()})}ngOnChanges(A){A.appNameInput&&A.appNameInput.currentValue&&(this.appName=A.appNameInput.currentValue)}ngAfterViewInit(){}onCustomTemplateNodeClick(A,e){this.shouldIgnoreNodeInteraction(e.target)||this.selectAgentNode(A,{openConfig:!0})}onNodePointerDown(A,e){this.shouldIgnoreNodeInteraction(e.target)||this.selectAgentNode(A,{openConfig:!1})}onGroupClick(A,e){if(e.stopPropagation(),!A?.data)return;let i=A.data().name,n=this.nodes().find(o=>o.data&&o.data().name===i);n&&this.selectAgentNode(n,{openConfig:!0})}onGroupPointerDown(A,e){if(e.stopPropagation(),!A?.data)return;let i=A.data().name,n=this.nodes().find(o=>o.data&&o.data().name===i);n&&this.selectAgentNode(n,{openConfig:!1})}onCanvasClick(A){let e=A.target;if(!e)return;let i=[".custom-node",".action-button-bar",".add-subagent-btn",".open-panel-btn",".agent-tool-banner",".mat-mdc-menu-panel"];e.closest(i.join(","))||this.clearCanvasSelection()}shouldIgnoreNodeInteraction(A){return A?!!A.closest("mat-chip, .add-subagent-btn, .mat-mdc-menu-panel"):!1}selectAgentNode(A,e={}){if(!A?.data)return;let i=this.agentBuilderService.getNode(A.data().name);i&&(this.agentBuilderService.setSelectedTool(void 0),this.agentBuilderService.setSelectedNode(i),this.nodePositions.set(i.name,ae({},A.point())),e.openConfig&&this.agentBuilderService.requestSideTabChange("config"))}handleAgentTypeSelection(A,e,i,n,o=!1){n.stopPropagation(),i?.closeMenu(),this.onAgentTypeSelected(A,e,o)}clearCanvasSelection(){!this.selectedAgents.length&&!this.selectedTool&&!this.selectedCallback||(this.selectedAgents=[],this.selectedTool=void 0,this.selectedCallback=void 0,this.agentBuilderService.setSelectedNode(void 0),this.agentBuilderService.setSelectedTool(void 0),this.agentBuilderService.setSelectedCallback(void 0),this.cdr.markForCheck())}onAddResource(A){}onAgentTypeSelected(A,e,i=!1){e&&this.addSubAgent(e,A,i)}generateNodeId(){return this.nodeId+=1,this.nodeId.toString()}generateEdgeId(){return this.edgeId+=1,this.edgeId.toString()}createNode(A,e,i){let n=mA(A),r={id:this.generateNodeId(),point:mA(ae({},e)),type:"html-template",data:n};return i&&(r.parentId=mA(i)),this.nodePositions.set(A.name,ae({},r.point())),r}createWorkflowGroup(A,e,i,n,o,r){let s,a=null;if(n){let I=(o||this.groupNodes()).find(u=>u.id===n);if(I){let u=I.point(),h=I.height?I.height():this.workflowGroupHeight;if(r&&o){let B=r.filter(f=>f.parentId&&f.parentId()===I.id);if(B.length>0){let J=0;for(let O of B){let H=O.data?O.data():void 0,V=120;H&&H.tools&&H.tools.length>0&&(V+=20+H.tools.length*36),J=Math.max(J,V)}h=Math.max(220,80+J+40)}}s={x:u.x,y:u.y+h+60},a=null}else s={x:i.x+this.workflowGroupXOffset,y:i.y+this.workflowGroupYOffset}}else s={x:i.x+this.workflowGroupXOffset,y:i.y+this.workflowGroupYOffset};let c=this.generateNodeId(),l={id:c,point:mA(s),type:"template-group",data:mA(A),parentId:mA(a),width:mA(this.workflowGroupWidth),height:mA(this.workflowGroupHeight)},d=A.agent_class==="SequentialAgent"?{id:this.generateEdgeId(),source:e.id,sourceHandle:"source-bottom",target:c,targetHandle:"target-top"}:null;return{groupNode:l,edge:d}}calculateWorkflowChildPosition(A,e){let s=(e-20)/2;return{x:45+A*428,y:s}}createAgentNodeWithGroup(A,e,i,n,o){let r=this.createNode(A,e,i),s=null,a=null;if(this.isWorkflowAgent(A.agent_class)){let c=this.createWorkflowGroup(A,r,e,i,n,o);s=c.groupNode,a=c.edge}return{shellNode:r,groupNode:s,groupEdge:a}}createWorkflowChildEdge(A,e){return this.createWorkflowChildEdgeFromArrays(A,e,this.nodes(),this.groupNodes())}createWorkflowChildEdgeFromArrays(A,e,i,n){if(!e)return null;let o=n.find(s=>s.id===e);if(!o||!o.data)return null;let r=o.data().agent_class;if(r==="LoopAgent"||r==="ParallelAgent"){let s=i.find(a=>a.data&&a.data().name===o.data().name);if(s)return{id:this.generateEdgeId(),source:s.id,sourceHandle:"source-bottom",target:A.id,targetHandle:"target-top"}}if(r==="SequentialAgent"){let s=i.filter(l=>l.parentId&&l.parentId()===e);if(s.length===0)return null;s.sort((l,d)=>l.point().x-d.point().x);let a=s.findIndex(l=>l.id===A.id);if(a<=0)return null;let c=s[a-1];return{id:this.generateEdgeId(),source:c.id,sourceHandle:"source-right",target:A.id,targetHandle:"target-left"}}return null}isWorkflowAgent(A){return A?A==="SequentialAgent"||A==="ParallelAgent"||A==="LoopAgent":!1}addSubAgent(A,e="LlmAgent",i=!1){let n=this.nodes().find(d=>d.data&&d.data().name===A);if(!n||!n.data)return;let r={name:this.agentBuilderService.getNextSubAgentName(),agent_class:e,model:"gemini-2.5-flash",instruction:"You are a sub-agent that performs specialized tasks.",isRoot:!1,sub_agents:[],tools:[]},s=this.isWorkflowAgent(n.data().agent_class),a=n.parentId&&n.parentId()&&this.groupNodes().some(d=>d.id===n.parentId()),c,l=null;if(i&&s){let d=n.data();if(!d)return;let C=this.groupNodes().find(b=>b.data&&b.data()?.name===d.name);if(!C){console.error("Could not find group for workflow node");return}let I=this.agentBuilderService.getNode(n.data().name);if(!I){console.error("Could not find clicked agent data");return}let u=I.sub_agents.length,h=C.height?C.height():this.workflowGroupHeight,B=this.calculateWorkflowChildPosition(u,h),f=this.createAgentNodeWithGroup(r,B,C.id);c=f.shellNode,l=f.groupNode,I.sub_agents.push(r),l&&this.groupNodes.set([...this.groupNodes(),l]),f.groupEdge&&this.edges.set([...this.edges(),f.groupEdge])}else if(a){let d=n.parentId()??void 0,C=this.groupNodes().find(k=>k.id===d);if(!C||!C.data){console.error("Could not find parent group node");return}let I=C.data().name,u=this.agentBuilderService.getNode(I);if(!u){console.error("Could not find workflow parent agent");return}let h=u.sub_agents.length,B=C.height?C.height():this.workflowGroupHeight,f=this.calculateWorkflowChildPosition(h,B),b=this.createAgentNodeWithGroup(r,f,d);c=b.shellNode,l=b.groupNode,u.sub_agents.push(r),l&&this.groupNodes.set([...this.groupNodes(),l]),b.groupEdge&&this.edges.set([...this.edges(),b.groupEdge])}else{let d=n.data().sub_agents.length,C={x:n.point().x+d*400,y:n.point().y+300},I=this.createAgentNodeWithGroup(r,C);c=I.shellNode,l=I.groupNode;let u=this.agentBuilderService.getNode(n.data().name);u&&u.sub_agents.push(r),l&&this.groupNodes.set([...this.groupNodes(),l]),I.groupEdge&&this.edges.set([...this.edges(),I.groupEdge])}if(this.agentBuilderService.addNode(r),this.nodes.set([...this.nodes(),c]),this.selectedAgents=[c],(a||s)&&this.updateGroupDimensions(),s||a){let d=c.parentId?c.parentId()??void 0:void 0,C=this.createWorkflowChildEdge(c,d);C&&this.edges.set([...this.edges(),C])}else{let d={id:this.generateEdgeId(),source:n.id,sourceHandle:"source-bottom",target:c.id,targetHandle:"target-top"};this.edges.set([...this.edges(),d])}this.agentBuilderService.setSelectedNode(r),this.agentBuilderService.requestSideTabChange("config")}addTool(A){let e=this.nodes().find(o=>o.id===A);if(!e||!e.data)return;let i=e.data();if(!i)return;this.dialog.open(II,{width:"500px"}).afterClosed().subscribe(o=>{if(o)if(o.toolType==="Agent Tool")this.createAgentTool(i.name);else{let r={toolType:o.toolType,name:o.name};this.agentBuilderService.addTool(i.name,r),this.agentBuilderService.setSelectedTool(r)}})}addCallback(A){let e=this.nodes().find(o=>o.id===A);if(!e||!e.data)return;let i={name:`callback_${this.callbackId}`,type:"before_agent",code:`def callback_function(callback_context): + # Add your callback logic here + return None`,description:"Auto-generated callback"};this.callbackId++;let n=this.agentBuilderService.addCallback(e.data().name,i);n.success||this._snackBar.open(n.error||"Failed to add callback","Close",{duration:3e3,panelClass:["error-snackbar"]})}createAgentTool(A){this.dialog.open(f0,{width:"750px",height:"310px",data:{title:"Create Agent Tool",message:"Please enter a name for the agent tool:",confirmButtonText:"Create",showInput:!0,inputLabel:"Agent Tool Name",inputPlaceholder:"Enter agent tool name"}}).afterClosed().subscribe(i=>{i&&typeof i=="string"&&this.agentBuilderService.requestNewTab(i,A)})}deleteTool(A,e){let i=e.toolType==="Agent Tool",n=i&&e.toolAgentName||e.name;this.dialog.open(f0,{data:{title:i?"Delete Agent Tool":"Delete Tool",message:i?`Are you sure you want to delete the agent tool "${n}"? This will also delete the corresponding board.`:`Are you sure you want to delete ${n}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(r=>{r==="confirm"&&this.deleteToolWithoutDialog(A,e)})}deleteToolWithoutDialog(A,e){if(e.toolType==="Agent Tool"){let i=e.toolAgentName||e.name;this.deleteAgentToolAndBoard(A,e,i)}else this.agentBuilderService.deleteTool(A,e)}deleteAgentToolAndBoard(A,e,i){this.agentBuilderService.deleteTool(A,e),this.agentBuilderService.requestTabDeletion(i)}deleteCallback(A,e){this.dialog.open(f0,{data:{title:"Delete Callback",message:`Are you sure you want to delete ${e.name}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(n=>{if(n==="confirm"){let o=this.agentBuilderService.deleteCallback(A,e);o.success||this._snackBar.open(o.error||"Failed to delete callback","Close",{duration:3e3,panelClass:["error-snackbar"]}),this.cdr.detectChanges()}})}openDeleteSubAgentDialog(A){this.dialog.open(f0,{data:{title:"Delete sub agent",message:`Are you sure you want to delete ${A}? This will also delete all the underlying sub agents and tools.`,confirmButtonText:"Delete"}}).afterClosed().subscribe(i=>{i==="confirm"&&this.deleteSubAgent(A)})}deleteSubAgent(A){let e=this.agentBuilderService.getNode(A);if(!e)return;let i=this.agentBuilderService.getParentNode(this.agentBuilderService.getRootNode(),e,void 0,this.agentToolBoards());i&&(this.deleteSubAgentHelper(e,i),this.agentBuilderService.getSelectedNode().pipe(Pn(1),$A(n=>!!n)).subscribe(n=>{this.agentBuilderService.getNodes().includes(n)||this.agentBuilderService.setSelectedNode(i)}))}isNodeInSequentialWorkflow(A){if(!A.parentId||!A.parentId())return!1;let e=A.parentId(),i=this.groupNodes().find(n=>n.id===e);return!i||!i.data?!1:i.data().agent_class==="SequentialAgent"}getSequentialSiblings(A){if(!A.parentId||!A.parentId())return{previous:void 0,next:void 0};let e=A.parentId(),i=this.nodes().filter(o=>o.parentId&&o.parentId()===e);i.sort((o,r)=>o.point().x-r.point().x);let n=i.findIndex(o=>o.id===A.id);return n===-1?{previous:void 0,next:void 0}:{previous:n>0?i[n-1]:void 0,next:nn.data&&n.data().name===A.name);if(i){let n=this.isNodeInSequentialWorkflow(i),o,r;if(n){let a=this.getSequentialSiblings(i);o=a.previous,r=a.next}this.nodes.set(this.nodes().filter(a=>a.id!==i.id));let s=this.groupNodes().find(a=>a.data&&a.data().name===A.name);if(s){this.groupNodes.set(this.groupNodes().filter(c=>c.id!==s.id));let a=this.edges().filter(c=>c.target!==i.id&&c.source!==i.id&&c.target!==s.id&&c.source!==s.id);this.edges.set(a)}else{let a=this.edges().filter(c=>c.target!==i.id&&c.source!==i.id);this.edges.set(a)}if(n&&o&&r){let a={id:this.generateEdgeId(),source:o.id,sourceHandle:"source-right",target:r.id,targetHandle:"target-left"};this.edges.set([...this.edges(),a])}}this.nodePositions.delete(A.name),e.sub_agents=e.sub_agents.filter(n=>n.name!==A.name),this.agentBuilderService.deleteNode(A),i&&i.parentId&&i.parentId()&&this.updateGroupDimensions()}selectTool(A,e){if(A.toolType==="Agent Tool"){let i=A.name;this.switchToAgentToolBoard(i);return}if(A.toolType==="Function tool"||A.toolType==="Built-in tool"){if(e.data){let i=this.agentBuilderService.getNode(e.data().name);i&&this.editTool(A,i)}return}if(e.data){let i=this.agentBuilderService.getNode(e.data().name);i&&this.agentBuilderService.setSelectedNode(i)}this.agentBuilderService.setSelectedTool(A)}editTool(A,e){let i;A.toolType==="Built-in tool"?i=this.dialog.open(Qh,{width:"700px",maxWidth:"90vw",data:{toolName:A.name,isEditMode:!0,toolArgs:A.args}}):i=this.dialog.open(II,{width:"500px",data:{toolType:A.toolType,toolName:A.name,isEditMode:!0}}),i.afterClosed().subscribe(n=>{if(n&&n.isEditMode){let o=e.tools?.findIndex(r=>r.name===A.name);o!==void 0&&o!==-1&&e.tools&&(e.tools[o].name=n.name,n.args&&(e.tools[o].args=n.args),this.agentBuilderService.setAgentTools(e.name,e.tools))}})}selectCallback(A,e){if(e.data){let i=this.agentBuilderService.getNode(e.data().name);i&&this.agentBuilderService.setSelectedNode(i)}this.agentBuilderService.setSelectedCallback(A)}openToolsTab(A){if(A.data){let e=this.agentBuilderService.getNode(A.data().name);e&&this.agentBuilderService.setSelectedNode(e)}this.agentBuilderService.requestSideTabChange("tools")}saveAgent(A){let e=this.agentBuilderService.getRootNode();if(!e){this._snackBar.open("Please create an agent first.","OK");return}let i=new FormData,n=this.agentToolBoards();zd.generateYamlFile(e,i,A,n),this.agentService.agentBuild(i).subscribe(o=>{o?this.router.navigate(["/"],{queryParams:{app:A}}).then(()=>{window.location.reload()}):this._snackBar.open("Something went wrong, please try again","OK")})}isRootAgent(A){let e=this.agentBuilderService.getRootNode();return e?e.name===A:!1}isRootAgentForCurrentTab(A){return this.isAgentToolMode&&this.currentAgentTool()?A===this.currentAgentTool():this.isRootAgent(A)}shouldShowHorizontalHandle(A,e){if(!A.parentId||!A.parentId())return!1;let i=A.parentId(),n=this.groupNodes().find(a=>a.id===i);if(!n||!n.data||n.data().agent_class!=="SequentialAgent")return!1;let r=this.nodes().filter(a=>a.parentId&&a.parentId()===i);if(r.length<=1)return!1;r.sort((a,c)=>a.point().x-c.point().x);let s=r.findIndex(a=>a.id===A.id);return e==="left"?s>0:s0):!1}shouldShowTopHandle(A){let e=A.data?A.data():void 0,i=e?.name,n=i?this.isRootAgent(i):!1;if(A.type==="template-group")return e?.agent_class==="SequentialAgent";if(n)return!1;if(A.parentId&&A.parentId()){let r=A.parentId(),s=this.groupNodes().find(a=>a.id===r);if(s&&s.data){let a=s.data().agent_class;if(a==="LoopAgent"||a==="ParallelAgent")return!0}return!1}return!0}getToolsForNode(A,e){return!A||!e?[]:e.get(A)??[]}loadFromYaml(A,e){try{let i=fh(A);this.agentBuilderService.clear(),this.nodePositions.clear(),this.agentToolBoards.set(new Map),this.agentBuilderService.setAgentToolBoards(new Map),this.currentAgentTool.set(null),this.isAgentToolMode=!1,this.navigationStack=[];let n=_A(ae({name:i.name||"root_agent",agent_class:i.agent_class||"LlmAgent",model:i.model||"gemini-2.5-flash",instruction:i.instruction||"",description:i.description||""},i.max_iterations&&{max_iterations:i.max_iterations}),{isRoot:!0,sub_agents:i.sub_agents||[],tools:this.parseToolsFromYaml(i.tools||[]),callbacks:this.parseCallbacksFromYaml(i)});this.agentBuilderService.addNode(n),this.agentBuilderService.setSelectedNode(n),this.processAgentToolsFromYaml(n.tools||[],e),this.loadAgentBoard(n)}catch(i){console.error("Error parsing YAML:",i)}}parseToolsFromYaml(A){return A.map(e=>{let i={name:e.name,toolType:this.determineToolType(e),toolAgentName:e.name};if(e.name==="AgentTool"&&e.args&&e.args.agent&&e.args.agent.config_path){i.toolType="Agent Tool";let o=e.args.agent.config_path.replace("./","").replace(".yaml","");i.name=o,i.toolAgentName=o,i.args=e.args}else e.args&&(i.args=e.args);return i})}parseCallbacksFromYaml(A){let e=[];return Object.keys(A).forEach(i=>{if(i.endsWith("_callback")&&Array.isArray(A[i])){let n=i.replace("_callback","");A[i].forEach(o=>{o.name&&e.push({name:o.name,type:n})})}}),e}determineToolType(A){return A.name==="AgentTool"&&A.args&&A.args.agent?"Agent Tool":A.name&&A.name.includes(".")&&A.args?"Custom tool":A.name&&A.name.includes(".")&&!A.args?"Function tool":"Built-in tool"}processAgentToolsFromYaml(A,e){let i=A.filter(n=>n.toolType==="Agent Tool");for(let n of i)this.agentToolBoards().has(n.name)||this.loadAgentToolConfiguration(n,e)}loadAgentToolConfiguration(A,e){let i=A.name;this.agentService.getSubAgentBuilder(e,`${i}.yaml`).subscribe({next:n=>{if(n)try{let o=fh(n),r=_A(ae({name:o.name||i,agent_class:o.agent_class||"LlmAgent",model:o.model||"gemini-2.5-flash",instruction:o.instruction||`You are the ${i} agent that can be used as a tool by other agents.`,description:o.description||""},o.max_iterations&&{max_iterations:o.max_iterations}),{isRoot:!1,sub_agents:o.sub_agents||[],tools:this.parseToolsFromYaml(o.tools||[]),callbacks:this.parseCallbacksFromYaml(o),isAgentTool:!0,skip_summarization:!!A.args?.skip_summarization}),s=this.agentToolBoards();if(s.set(i,r),this.agentToolBoards.set(s),this.agentBuilderService.setAgentToolBoards(s),this.agentBuilderService.addNode(r),this.processAgentToolsFromYaml(r.tools||[],e),r.sub_agents&&r.sub_agents.length>0)for(let a of r.sub_agents)a.config_path&&this.agentService.getSubAgentBuilder(e,a.config_path).subscribe(c=>{if(c){let l=fh(c);this.processAgentToolsFromYaml(this.parseToolsFromYaml(l.tools||[]),e)}})}catch(o){console.error(`Error parsing YAML for agent tool ${i}:`,o),this.createDefaultAgentToolConfiguration(A)}else this.createDefaultAgentToolConfiguration(A)},error:n=>{console.error(`Error loading agent tool configuration for ${i}:`,n),this.createDefaultAgentToolConfiguration(A)}})}createDefaultAgentToolConfiguration(A){let e=A.name,i={name:e,agent_class:"LlmAgent",model:"gemini-2.5-flash",instruction:`You are the ${e} agent that can be used as a tool by other agents.`,isRoot:!1,sub_agents:[],tools:[],isAgentTool:!0,skip_summarization:!!A.args?.skip_summarization},n=this.agentToolBoards();n.set(e,i),this.agentToolBoards.set(n),this.agentBuilderService.setAgentToolBoards(n),this.agentBuilderService.addNode(i)}loadAgentTools(A){A.tools?(A.tools=A.tools.filter(e=>e.name&&e.name.trim()!==""),A.tools.map(e=>{e.toolType!=="Agent Tool"&&(e.name.includes(".")&&e.args?e.toolType="Custom tool":e.name.includes(".")&&!e.args?e.toolType="Function tool":e.toolType="Built-in tool")})):A.tools=[]}isNodeSelected(A){return this.selectedAgents.includes(A)}isGroupSelected(A){if(!A.data)return!1;let e=A.data().name,i=this.nodes().find(n=>n.data&&n.data().name===e);return i?this.isNodeSelected(i):!1}loadSubAgents(A,e){return Ci(this,null,function*(){let i=[{node:e,depth:1,index:1,parentShellId:void 0,parentAgent:void 0,parentGroupId:void 0}],n=[],o=[],r=[];for(;i.length>0;){let{node:s,depth:a,index:c,parentShellId:l,parentAgent:d,parentGroupId:C}=i.shift(),I=s;if(s.config_path)try{let S=yield qk(this.agentService.getSubAgentBuilder(A,s.config_path));I=fh(S),I.tools&&(I.tools=this.parseToolsFromYaml(I.tools||[])),this.processAgentToolsFromYaml(I.tools||[],A)}catch(S){console.error(`Failed to load agent from ${s.config_path}`,S);continue}if(d&&d.sub_agents){let S=d.sub_agents.indexOf(s);S!==-1&&(d.sub_agents[S]=I,this.agentBuilderService.addNode(d))}this.agentBuilderService.addNode(I);let u=this.nodePositions.get(I.name),h=this.isWorkflowAgent(I.agent_class),B=d?this.isWorkflowAgent(d.agent_class):!1,f,b,k=null;if(B&&!I.isRoot){let S=d?.sub_agents.indexOf(I)??c,w=o.find(J=>J.id===C),_=w?.height?w.height():this.workflowGroupHeight;f=u??this.calculateWorkflowChildPosition(S,_);let K=this.createAgentNodeWithGroup(I,f,C??void 0,o,n);b=K.shellNode,k=K.groupNode,n.push(b),k&&o.push(k),K.groupEdge&&r.push(K.groupEdge)}else{if(u)f=u;else if(!l)f={x:100,y:150};else{let w=n.find(_=>_.id===l);w?f={x:w.point().x+(c-1)*400,y:w.point().y+300}:f={x:100,y:a*150+50}}let S=this.createAgentNodeWithGroup(I,f,void 0,o,n);b=S.shellNode,k=S.groupNode,n.push(b),h&&!I.isRoot&&(k&&o.push(k),S.groupEdge&&r.push(S.groupEdge))}if(l)if(C){let S=this.createWorkflowChildEdgeFromArrays(b,C,n,o);S&&r.push(S)}else{let S={id:this.generateEdgeId(),source:l,sourceHandle:"source-bottom",target:b.id,targetHandle:"target-top"};r.push(S)}if(I.sub_agents&&I.sub_agents.length>0){let S=1,w=h&&k?k.id:C;for(let _ of I.sub_agents)i.push({node:_,parentShellId:b.id,depth:a+1,index:S,parentAgent:I,parentGroupId:w}),S++}}this.nodes.set(n),this.groupNodes.set(o),this.edges.set(r),this.updateGroupDimensions()})}switchToAgentToolBoard(A,e){let i=this.currentAgentTool()||"main";i!==A&&this.navigationStack.push(i);let n=this.agentToolBoards(),o=n.get(A);if(!o){o={isRoot:!1,name:A,agent_class:"LlmAgent",model:"gemini-2.5-flash",instruction:`You are the ${A} agent that can be used as a tool by other agents.`,sub_agents:[],tools:[],isAgentTool:!0,skip_summarization:!1};let r=new Map(n);r.set(A,o),this.agentToolBoards.set(r),this.agentBuilderService.setAgentToolBoards(r),e?this.addAgentToolToAgent(A,e):this.addAgentToolToRoot(A)}this.currentAgentTool.set(A),this.isAgentToolMode=!0,this.loadAgentBoard(o),this.agentBuilderService.setSelectedNode(o),this.agentBuilderService.requestSideTabChange("config")}backToMainCanvas(){if(this.navigationStack.length>0){let A=this.navigationStack.pop();if(A==="main"){this.currentAgentTool.set(null),this.isAgentToolMode=!1;let e=this.agentBuilderService.getRootNode();e&&(this.loadAgentBoard(e),this.agentBuilderService.setSelectedNode(e),this.agentBuilderService.requestSideTabChange("config"))}else{let i=this.agentToolBoards().get(A);i&&(this.currentAgentTool.set(A),this.isAgentToolMode=!0,this.loadAgentBoard(i),this.agentBuilderService.setSelectedNode(i),this.agentBuilderService.requestSideTabChange("config"))}}else{this.currentAgentTool.set(null),this.isAgentToolMode=!1;let A=this.agentBuilderService.getRootNode();A&&(this.loadAgentBoard(A),this.agentBuilderService.setSelectedNode(A),this.agentBuilderService.requestSideTabChange("config"))}}loadAgentBoard(A){return Ci(this,null,function*(){if(this.captureCurrentNodePositions(),this.nodes.set([]),this.groupNodes.set([]),this.edges.set([]),this.nodeId=0,this.edgeId=0,this.loadAgentTools(A),this.agentBuilderService.addNode(A),A.tools&&A.tools.length>0?this.agentBuilderService.setAgentTools(A.name,A.tools):this.agentBuilderService.setAgentTools(A.name,[]),A.sub_agents&&A.sub_agents.length>0)yield this.loadSubAgents(this.appName,A);else{let e=this.nodePositions.get(A.name)??{x:100,y:150},i=this.createNode(A,e);if(this.nodes.set([i]),this.isWorkflowAgent(A.agent_class)){let{groupNode:n,edge:o}=this.createWorkflowGroup(A,i,e);this.groupNodes.set([n]),o&&this.edges.set([o])}}this.agentBuilderService.setSelectedNode(A)})}addAgentToolToAgent(A,e){let i=this.agentBuilderService.getNode(e);if(i){if(i.tools&&i.tools.some(o=>o.name===A))return;let n={name:A,toolType:"Agent Tool",toolAgentName:A};i.tools||(i.tools=[]),i.tools.push(n),i.tools=i.tools.filter(o=>o.name&&o.name.trim()!==""),this.agentBuilderService.setAgentTools(e,i.tools)}}addAgentToolToRoot(A){let e=this.agentBuilderService.getRootNode();if(e){if(e.tools&&e.tools.some(n=>n.name===A))return;let i={name:A,toolType:"Agent Tool",toolAgentName:A};e.tools||(e.tools=[]),e.tools.push(i),this.agentBuilderService.setAgentTools("root_agent",e.tools)}}deleteAgentToolBoard(A){let e=this.agentToolBoards(),i=new Map(e);i.delete(A),this.agentToolBoards.set(i),this.agentBuilderService.setAgentToolBoards(i);let n=this.agentBuilderService.getNodes();for(let o of n)o.tools&&(o.tools=o.tools.filter(r=>!(r.toolType==="Agent Tool"&&(r.toolAgentName===A||r.name===A))),this.agentBuilderService.setAgentTools(o.name,o.tools));this.navigationStack=this.navigationStack.filter(o=>o!==A),this.currentAgentTool()===A&&this.backToMainCanvas()}getBackButtonTooltip(){if(this.navigationStack.length>0){let A=this.navigationStack[this.navigationStack.length-1];return A==="main"?"Back to Main Canvas":`Back to ${A}`}return"Back to Main Canvas"}onBuilderAssistantClose(){this.builderAssistantCloseRequest.emit()}reloadCanvasFromYaml(){this.appNameInput&&this.agentService.getAgentBuilderTmp(this.appNameInput).subscribe({next:A=>{A&&this.loadFromYaml(A,this.appNameInput)},error:A=>{console.error("Error reloading canvas:",A)}})}captureCurrentNodePositions(){for(let A of this.nodes()){if(!A?.data)continue;let e=A.data();e&&this.nodePositions.set(e.name,ae({},A.point()))}}updateGroupDimensions(){for(let a of this.groupNodes()){if(!a.data)continue;let c=a.data().name,l=this.nodes().filter(f=>f.parentId&&f.parentId()===a.id);if(l.length===0){a.width&&a.width.set(480),a.height&&a.height.set(220);continue}l.sort((f,b)=>f.point().x-b.point().x),l.forEach((f,b)=>{let K={x:45+b*428,y:80};if(f.point.set(K),f.data){let J=f.data();J&&this.nodePositions.set(J.name,K)}});let d=1/0,C=1/0,I=-1/0,u=-1/0;for(let f of l){let b=f.point(),k=f.data?f.data():void 0,S=120;k&&k.tools&&k.tools.length>0&&(S+=20+k.tools.length*36),d=Math.min(d,b.x),C=Math.min(C,b.y),I=Math.max(I,b.x+340+68),u=Math.max(u,b.y+S)}let h=I-d+40*2,B=u-C+40*2;a.width&&a.width.set(Math.max(480,h)),a.height&&a.height.set(Math.max(220,B))}}getToolIcon(A){return wQ(A.name,A.toolType)}getAgentIcon(A){switch(A){case"SequentialAgent":return"more_horiz";case"LoopAgent":return"sync";case"ParallelAgent":return"density_medium";case"LlmAgent":default:return"psychology"}}isGroupEmpty(A){return!this.nodes().some(i=>i.parentId&&i.parentId()===A)}shouldShowAddButton(A){let e=A.data?A.data():void 0;if(!e)return!1;let i=this.isWorkflowAgent(e.agent_class),n=A.parentId&&A.parentId();if(i&&!n||!this.isNodeSelected(A))return!1;if(n&&A.parentId){let o=A.parentId(),r=this.nodes().filter(a=>a.parentId&&a.parentId()===o);if(r.length===0)return!0;let s=r.reduce((a,c)=>c.point().x>a.point().x?c:a,r[0]);return A.id===s.id}return!0}static \u0275fac=function(e){return new(e||t)(DA(na),DA(yQ),DA(Da))};static \u0275cmp=xe({type:t,selectors:[["app-canvas"]],viewQuery:function(e,i){if(e&1&&(At(PcA,5),At(jcA,5)),e&2){let n;oA(n=rA())&&(i.canvasRef=n.first),oA(n=rA())&&(i.svgCanvasRef=n.first)}},inputs:{showSidePanel:"showSidePanel",showBuilderAssistant:"showBuilderAssistant",appNameInput:"appNameInput"},outputs:{toggleSidePanelRequest:"toggleSidePanelRequest",builderAssistantCloseRequest:"builderAssistantCloseRequest"},features:[ti],decls:7,vars:8,consts:[["emptyGroupMenuTrigger","matMenuTrigger"],["emptyGroupMenu","matMenu"],["agentMenuTrigger","matMenuTrigger"],["agentMenu","matMenu"],[1,"canvas-container"],[1,"canvas-workspace",3,"click"],[1,"agent-tool-banner"],["matTooltip","Open panel",1,"material-symbols-outlined","open-panel-btn"],["view","auto",3,"nodes","edges","background","snapGrid"],[1,"canvas-instructions"],[3,"closePanel","reloadCanvas","isVisible","appName"],[1,"banner-content"],["mat-icon-button","",1,"back-to-main-btn",3,"click","matTooltip"],[1,"banner-info"],[1,"material-symbols-outlined","banner-icon"],[1,"banner-text"],[1,"agent-tool-name"],[1,"banner-subtitle"],["matTooltip","Open panel",1,"material-symbols-outlined","open-panel-btn",3,"click"],["groupNode",""],["nodeHtml",""],["selectable","","rx","12","ry","12",3,"click","pointerdown"],["x","12","y","12"],[1,"workflow-group-chip"],[1,"workflow-chip-icon"],[1,"workflow-chip-label"],["type","target","position","top","id","target-top"],[1,"empty-group-placeholder",3,"click"],["mat-icon-button","","matTooltip","Add sub-agent","aria-label","Add sub-agent",3,"click","matMenuTriggerFor"],[1,"empty-group-label"],["mat-menu-item","",3,"click"],["selectable","",1,"custom-node",3,"click","pointerdown"],[1,"node-title-wrapper"],[1,"node-title"],[2,"margin-right","5px"],[1,"node-badge"],[1,"action-button-bar"],["matIconButton","","matTooltip","Delete sub-agent","aria-label","Delete sub-agent",1,"action-btn","delete-subagent-btn"],[1,"tools-container"],[1,"add-subagent-container"],["type","target","position","left","id","target-left"],["type","source","position","right","id","source-right"],["type","source","position","bottom","id","source-bottom"],["matIconButton","","matTooltip","Delete sub-agent","aria-label","Delete sub-agent",1,"action-btn","delete-subagent-btn",3,"click"],[1,"tools-list"],[1,"tool-item"],[1,"tool-item",3,"click"],[1,"tool-item-icon"],[1,"tool-item-name"],["matIconButton","","matTooltip","Add sub-agent","aria-label","Add sub-agent",1,"add-subagent-btn",3,"click","matMenuTriggerFor"],[1,"add-subagent-symbol"],[1,"instruction-content"],[1,"instruction-icon"],[1,"instruction-tips"],[1,"tip"]],template:function(e,i){e&1&&(m(0,"div",4)(1,"div",5),ee("click",function(o){return i.onCanvasClick(o)}),ne(2,ZcA,13,2,"div",6)(3,XcA,2,0,"span",7)(4,dlA,3,6,"vflow",8)(5,ClA,19,0,"div",9),p(),m(6,"app-builder-assistant",10),ee("closePanel",function(){return i.onBuilderAssistantClose()})("reloadCanvas",function(){return i.reloadCanvasFromYaml()}),p()()),e&2&&(y(),iA("has-banner",i.currentAgentTool()),y(),$(i.currentAgentTool()?2:-1),y(),$(i.showSidePanel?-1:3),y(),$(i.vflowNodes().length>0?4:-1),y(),$(i.vflowNodes().length===0?5:-1),y(),te("isVisible",i.showBuilderAssistant)("appName",i.appName))},dependencies:[hBe,Kz,BBe,_S,RS,ir,Ma,sd,m2,BE,ts,$9],styles:['[_nghost-%COMP%]{width:100%;height:100%;display:flex;flex-direction:column;flex:1;min-height:0}.canvas-container[_ngcontent-%COMP%]{width:100%;height:100%;background:linear-gradient(135deg,#0f0f0f,#1a1a1a);display:flex;flex-direction:column;border-radius:8px;overflow:hidden;box-shadow:0 8px 32px #0006;flex:1;min-height:0;position:relative}.canvas-header[_ngcontent-%COMP%]{background:linear-gradient(90deg,#1e1e1e,#2a2a2a);padding:16px 24px;border-bottom:2px solid #333;display:flex;justify-content:space-between;align-items:center}.canvas-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;color:#e8eaed;font-size:18px;font-weight:600;font-family:Google Sans,Helvetica Neue,sans-serif;background:linear-gradient(45deg,#8ab4f8,#4285f4);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.canvas-controls[_ngcontent-%COMP%]{display:flex;gap:8px}.canvas-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{background:#8ab4f81a;border:1px solid rgba(138,180,248,.3);color:#8ab4f8;transition:all .3s ease}.canvas-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{background:#8ab4f833;border-color:#8ab4f8;transform:translateY(-1px)}.canvas-workspace[_ngcontent-%COMP%]{flex:1;position:relative;overflow:hidden;background-color:#131314;min-height:0;width:100%;height:100%}.agent-tool-banner[_ngcontent-%COMP%]{position:absolute;top:0;left:0;right:0;z-index:1000;background:linear-gradient(135deg,#1e3a8a,#3b82f6);border-bottom:2px solid rgba(59,130,246,.3);box-shadow:0 4px 16px #0000004d}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%]{padding:12px 20px;display:flex;align-items:center;gap:16px}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .back-to-main-btn[_ngcontent-%COMP%]{background:#ffffff1a;color:#fff;border:1px solid rgba(255,255,255,.2);transition:all .2s ease}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .back-to-main-btn[_ngcontent-%COMP%]:hover{background:#fff3;transform:scale(1.05)}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .back-to-main-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;flex:1}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%] .banner-icon[_ngcontent-%COMP%]{font-size:28px;width:28px;height:28px;color:#ffffffe6}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%] .banner-text[_ngcontent-%COMP%] .agent-tool-name[_ngcontent-%COMP%]{margin:0;color:#fff;font-size:18px;font-weight:600;font-family:Google Sans,Helvetica Neue,sans-serif;line-height:1.2}.agent-tool-banner[_ngcontent-%COMP%] .banner-content[_ngcontent-%COMP%] .banner-info[_ngcontent-%COMP%] .banner-text[_ngcontent-%COMP%] .banner-subtitle[_ngcontent-%COMP%]{margin:0;color:#fffc;font-size:12px;font-weight:400;line-height:1}.canvas-workspace[_ngcontent-%COMP%]:has(.agent-tool-banner) vflow[_ngcontent-%COMP%]{padding-top:68px}.canvas-workspace.has-banner[_ngcontent-%COMP%] vflow{padding-top:68px!important} vflow{width:100%!important;height:100%!important;display:block!important} vflow .root-svg{background-color:#131314!important;color:#fff!important;width:100%!important;height:100%!important;min-width:100%!important;min-height:100%!important}.diagram-canvas[_ngcontent-%COMP%]{display:block;width:100%;height:100%;cursor:crosshair;transition:cursor .2s ease;object-fit:contain;image-rendering:pixelated}.diagram-canvas[_ngcontent-%COMP%]:active{cursor:grabbing}.canvas-instructions[_ngcontent-%COMP%]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none;z-index:1}.instruction-content[_ngcontent-%COMP%]{background:#131314e6;backdrop-filter:blur(10px);border:2px solid rgba(138,180,248,.2);border-radius:16px;padding:32px;box-shadow:0 8px 32px #0000004d}.instruction-content[_ngcontent-%COMP%] .instruction-icon[_ngcontent-%COMP%]{font-size:48px;width:48px;height:48px;color:#8ab4f8;margin-bottom:16px;animation:_ngcontent-%COMP%_pulse 2s infinite}.instruction-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#e8eaed;font-size:20px;font-weight:600;margin:0 0 12px;font-family:Google Sans,Helvetica Neue,sans-serif}.instruction-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:#9aa0a6;font-size:14px;margin:0 0 24px;line-height:1.5}.instruction-tips[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:12px;align-items:flex-start}.tip[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;color:#00bbea;font-size:13px}.tip[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}.connection-mode-indicator[_ngcontent-%COMP%]{position:absolute;top:20px;left:50%;transform:translate(-50%);z-index:10;animation:_ngcontent-%COMP%_slideDown .3s ease-out}.connection-indicator-content[_ngcontent-%COMP%]{background:linear-gradient(135deg,#1b73e8,#4285f4);color:#fff;padding:12px 20px;border-radius:24px;display:flex;align-items:center;gap:12px;box-shadow:0 4px 16px #1b73e866;border:1px solid rgba(255,255,255,.2)}.connection-indicator-content[_ngcontent-%COMP%] .connection-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px;animation:_ngcontent-%COMP%_pulse 1.5s infinite}.connection-indicator-content[_ngcontent-%COMP%] span[_ngcontent-%COMP%]{font-size:14px;font-weight:500;white-space:nowrap}.connection-indicator-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{background:#fff3;color:#fff;border:1px solid rgba(255,255,255,.3);width:32px;height:32px;min-width:32px}.connection-indicator-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{background:#ffffff4d;transform:scale(1.1)}.connection-indicator-content[_ngcontent-%COMP%] button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px}@keyframes _ngcontent-%COMP%_slideDown{0%{opacity:0;transform:translate(-50%) translateY(-20px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.canvas-footer[_ngcontent-%COMP%]{background:linear-gradient(90deg,#1e1e1e,#2a2a2a);padding:12px 24px;border-top:1px solid #333;display:flex;justify-content:space-between;align-items:center}.node-count[_ngcontent-%COMP%], .connection-count[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;color:#9aa0a6;font-size:13px;font-weight:500}.node-count[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%], .connection-count[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px;color:#00bbea}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.7;transform:scale(1.05)}}.canvas-workspace.drag-over[_ngcontent-%COMP%]{background:radial-gradient(circle at 20% 50%,rgba(66,133,244,.1) 0%,transparent 50%),radial-gradient(circle at 80% 20%,rgba(52,168,83,.1) 0%,transparent 50%),radial-gradient(circle at 40% 80%,rgba(251,188,4,.1) 0%,transparent 50%),#131314}.canvas-workspace.drag-over[_ngcontent-%COMP%]:before{content:"";position:absolute;inset:0;border:2px dashed #00BBEA;border-radius:8px;margin:16px;animation:_ngcontent-%COMP%_dashMove 1s linear infinite}@keyframes _ngcontent-%COMP%_dashMove{0%{border-color:#8ab4f84d}50%{border-color:#8ab4f8cc}to{border-color:#8ab4f84d}}@media (max-width: 768px){.canvas-header[_ngcontent-%COMP%]{padding:12px 16px}.canvas-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-size:16px}.instruction-content[_ngcontent-%COMP%]{padding:24px;margin:16px}.instruction-content[_ngcontent-%COMP%] .instruction-icon[_ngcontent-%COMP%]{font-size:36px;width:36px;height:36px}.instruction-content[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{font-size:18px}.canvas-footer[_ngcontent-%COMP%]{padding:8px 16px;flex-direction:column;gap:8px}}.custom-node[_ngcontent-%COMP%]{width:340px;background:#556b7466;border:1px solid #474747;border-radius:8px;align-items:center;position:relative;max-height:none;padding-bottom:0;overflow:visible}.custom-node[_ngcontent-%COMP%]:hover{border-color:#666}.custom-node_selected[_ngcontent-%COMP%]{border:2px solid;border-color:#00bbea}.custom-node_selected[_ngcontent-%COMP%] mat-chip[_ngcontent-%COMP%]{--mdc-chip-outline-color: rgba(255, 255, 255, .1)}.custom-node_selected[_ngcontent-%COMP%]:hover{border-color:#00bbea}[_nghost-%COMP%] .default-group-node{background-color:#1c1c1c!important;border:2px solid #3E3E3E!important}.node-title-wrapper[_ngcontent-%COMP%]{padding-top:12px;padding-bottom:12px;border-radius:8px 8px 0 0;display:flex;justify-content:space-between;align-items:center}.node-title[_ngcontent-%COMP%]{padding-left:12px;padding-right:12px;display:flex;align-items:center;color:#e8eaed;font-weight:500}.node-badge[_ngcontent-%COMP%]{margin-left:8px;padding:2px 6px;border-radius:999px;background:linear-gradient(135deg,#00bbea33,#004e7a66);color:#00bbea;font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.tools-container[_ngcontent-%COMP%]{padding:8px 12px;border-top:1px solid #444}.tools-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:4px}.tool-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:4px;cursor:pointer;transition:background-color .2s ease;color:#e8eaed}.tool-item[_ngcontent-%COMP%]:hover{background-color:#8ab4f81a}.tool-item[_ngcontent-%COMP%] .tool-item-icon[_ngcontent-%COMP%]{font-size:22px;width:22px;height:22px;color:#fff;flex-shrink:0}.tool-item[_ngcontent-%COMP%] .tool-item-name[_ngcontent-%COMP%]{font-family:Google Sans,sans-serif;font-size:15px;font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tool-item.more-tools[_ngcontent-%COMP%]{color:#9aa0a6;font-style:italic}.tool-item.more-tools[_ngcontent-%COMP%] .tool-item-icon[_ngcontent-%COMP%]{color:#9aa0a6}.custom-node_selected[_ngcontent-%COMP%] .node-title-wrapper[_ngcontent-%COMP%]{border-bottom-color:#ffffff1a}.custom-node_selected[_ngcontent-%COMP%] .node-title-wrapper[_ngcontent-%COMP%] .node-title[_ngcontent-%COMP%]{color:#00bbea}.tools-header[_ngcontent-%COMP%]{font-family:Google Sans;color:#a3a3a3;margin-bottom:10px;font-size:14px;font-weight:500;display:flex;align-items:center;justify-content:space-between}.callbacks-container[_ngcontent-%COMP%]{padding:12px 6px 12px 12px}.callbacks-header[_ngcontent-%COMP%]{font-family:Google Sans;color:#a3a3a3;margin-bottom:10px;font-size:14px;font-weight:500;display:flex;align-items:center;justify-content:space-between}.callback-type[_ngcontent-%COMP%]{font-size:11px;background:#8ab4f833;color:#00bbea;padding:2px 6px;border-radius:4px;margin-left:4px;font-weight:500}.add-callback-btn[_ngcontent-%COMP%]{background:none;border:none;cursor:pointer;border-radius:4px;width:28px;height:28px;padding:0}.add-callback-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin:0;font-size:18px;width:18px;height:18px}.add-callback-btn[_ngcontent-%COMP%]:hover{color:#e8eaed;background-color:#8ab4f81a;transform:scale(1.1)}.instruction-title[_ngcontent-%COMP%]{font-family:Google Sans;color:#a3a3a3;margin-bottom:10px}.instructions[_ngcontent-%COMP%]{font-family:Google Sans;margin-bottom:10px}.agent-resources[_ngcontent-%COMP%]{padding:8px 12px}.empty-resource[_ngcontent-%COMP%]{margin-top:8px;color:#9aa0a6;margin-bottom:8px;display:flex;font-size:13px}.empty-resource[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{display:none}.action-button-bar[_ngcontent-%COMP%]{display:flex;gap:8px;margin-right:4px}.action-button-bar[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%]{background:none;color:#9aa0a6;border:none;width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s ease;pointer-events:auto;border-radius:4px}.action-button-bar[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%]:hover{color:#e8eaed;background-color:#8ab4f81a;transform:scale(1.1)}.action-button-bar[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px;width:20px;height:20px}.action-button-bar[_ngcontent-%COMP%] .delete-subagent-btn[_ngcontent-%COMP%]:hover{color:#e8eaed}.add-tool-btn[_ngcontent-%COMP%]{background:none;border:none;cursor:pointer;border-radius:4px;width:28px;height:28px;padding:0}.add-tool-btn[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{margin:0;font-size:18px;width:18px;height:18px}.add-tool-btn[_ngcontent-%COMP%]:hover{color:#e8eaed;background-color:#8ab4f81a;transform:scale(1.1)}.add-subagent-container[_ngcontent-%COMP%]{position:absolute;left:50%;bottom:-68px;transform:translate(-50%);display:flex;justify-content:center;pointer-events:none}.custom-node.in-group[_ngcontent-%COMP%] .add-subagent-container[_ngcontent-%COMP%]{left:auto;right:-68px;bottom:50%;transform:translateY(50%)}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%]{width:48px;height:48px;border-radius:50%;border:2px solid #00BBEA;background:radial-gradient(circle at 50% 50%,#1f2330,#131314);color:#00bbea;display:flex;align-items:center;justify-content:center;padding:0;box-sizing:border-box;transition:transform .2s ease,box-shadow .2s ease,background .2s ease;pointer-events:auto}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%] .add-subagent-symbol[_ngcontent-%COMP%]{font-size:28px;line-height:1;font-weight:400}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%]:hover{transform:scale(1.05);box-shadow:0 4px 12px #00bbea59;background:radial-gradient(circle at 50% 50%,#222a3a,#16181d)}.add-subagent-container[_ngcontent-%COMP%] .add-subagent-btn[_ngcontent-%COMP%]:focus-visible{outline:none;box-shadow:0 0 0 3px #00bbea59}.open-panel-btn[_ngcontent-%COMP%]{position:absolute;width:24px;height:24px;color:#c4c7c5;cursor:pointer;margin-left:20px;margin-top:20px;z-index:9999}.custom-node[_ngcontent-%COMP%]:hover .action-button-bar[_ngcontent-%COMP%], .custom-node.custom-node_selected[_ngcontent-%COMP%] .action-button-bar[_ngcontent-%COMP%]{opacity:1;pointer-events:auto}[_nghost-%COMP%] div[nodehandlescontroller][noderesizecontroller].wrapper{height:0px!important;overflow:visible!important}[_nghost-%COMP%] foreignObject.selectable, [_nghost-%COMP%] foreignObject.selectable>div{overflow:visible!important}[_nghost-%COMP%] .interactive-edge{stroke:#00bbea!important;stroke-width:2!important}[_nghost-%COMP%] .default-handle{stroke:#00bbea!important;stroke-width:1!important;fill:#000!important}[_nghost-%COMP%] .reconnect-handle{stroke:#00bbea!important;stroke-width:2!important;fill:#00bbea26!important}[_nghost-%COMP%] .workflow-group-chip{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;background:#00bbea33;border:1px solid rgba(0,187,234,.4);border-radius:16px;color:#00bbea;font-family:Google Sans,sans-serif;font-size:12px;font-weight:500;height:32px;box-sizing:border-box;white-space:nowrap;backdrop-filter:blur(4px)}[_nghost-%COMP%] .workflow-group-chip .workflow-chip-icon{font-size:16px;width:16px;height:16px;line-height:16px}[_nghost-%COMP%] .workflow-group-chip .workflow-chip-label{color:#e8eaed;font-weight:500;font-size:12px;line-height:1}[_nghost-%COMP%] .empty-group-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:16px;border-radius:8px;text-align:center;background:#ffffff05;border:2px dashed rgba(0,187,234,.3);transition:all .3s ease}[_nghost-%COMP%] .empty-group-placeholder:hover{background:#ffffff0a;border-color:#00bbea80}[_nghost-%COMP%] .empty-group-placeholder button{border:2px solid #00BBEA;background-color:#00bbea1a;color:#00bbea;width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;border-radius:50%;transition:all .2s ease}[_nghost-%COMP%] .empty-group-placeholder button:hover{background-color:#00bbea33;transform:scale(1.1);box-shadow:0 4px 12px #00bbea59}[_nghost-%COMP%] .empty-group-placeholder button mat-icon{font-size:24px;width:24px;height:24px}[_nghost-%COMP%] .empty-group-placeholder .empty-group-label{font-size:13px;font-weight:500;color:#9aa0a6;font-family:Google Sans,sans-serif}']})};function IlA(t,A){t&1&&(m(0,"mat-hint",3),T(1," Start with a letter or underscore, and contain only letters, digits, and underscores. "),p())}var JS=class t{constructor(A,e){this.data=A;this.dialogRef=e}newAppName="";agentService=E(Hl);_snackBar=E(P1);router=E(Da);isNameValid(){let A=this.newAppName.trim();return!(!A||!/^[a-zA-Z_]/.test(A)||!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(A))}createNewApp(){let A=this.newAppName.trim();if(!this.isNameValid()){this._snackBar.open("App name must start with a letter or underscore and can only contain letters, digits, and underscores.","OK");return}if(this.data.existingAppNames.includes(A)){this._snackBar.open("App name already exists. Please choose a different name.","OK");return}let e={agent_class:"LlmAgent",instruction:"You are the root agent that coordinates other agents.",isRoot:!0,model:"gemini-2.5-flash",name:A,sub_agents:[],tools:[]},i=new FormData,n=new Map;zd.generateYamlFile(e,i,A,n),this.agentService.agentBuildTmp(i).subscribe(o=>{o?(this.router.navigate(["/"],{queryParams:{app:A,mode:"builder"}}).then(()=>{window.location.reload()}),this.dialogRef.close(!0)):this._snackBar.open("Something went wrong, please try again","OK")})}static \u0275fac=function(e){return new(e||t)(DA(qo),DA(co))};static \u0275cmp=xe({type:t,selectors:[["app-add-item-dialog"]],decls:10,vars:3,consts:[["mat-dialog-title","",1,"new-app-title"],[2,"padding-left","20px","padding-right","24px"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"],[2,"font-size","12px","color","#666"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click","disabled"]],template:function(e,i){e&1&&(m(0,"h2",0),T(1,"Create a new app"),p(),m(2,"mat-form-field",1)(3,"input",2),qn("ngModelChange",function(o){return Vn(i.newAppName,o)||(i.newAppName=o),o}),ee("keydown.enter",function(){return i.createNewApp()}),p(),ne(4,IlA,2,0,"mat-hint",3),p(),m(5,"mat-dialog-actions",4)(6,"button",5),T(7,"Cancel"),p(),m(8,"button",6),ee("click",function(){return i.createNewApp()}),T(9," Create "),p()()),e&2&&(y(3),jn("ngModel",i.newAppName),y(),$(i.isNameValid()?-1:4),y(4),te("disabled",!i.isNameValid()))},dependencies:[tr,ds,Gs,Kn,Mr,Fo,Cr,kr,Un,Jl,JB],styles:[".new-app-title[_ngcontent-%COMP%]{color:#fff!important;font-family:Google Sans;font-size:24px}"]})};var ulA=["callbackNameInput"];function hlA(t,A){if(t&1){let e=Ue();Qa(0),m(1,"div",8)(2,"div",9),ee("click",function(){q(e);let n=M();return W(n.toggleCallbackInfo())}),m(3,"mat-icon",10),T(4,"info"),p(),m(5,"div",11)(6,"span"),T(7,"Callback Information"),p()(),m(8,"button",12)(9,"mat-icon"),T(10),p()()(),m(11,"div",13)(12,"div",14)(13,"div",15),T(14),p(),m(15,"div",16),T(16),p()(),m(17,"div",17)(18,"a",18)(19,"mat-icon"),T(20,"open_in_new"),p(),m(21,"span"),T(22,"View Official Documentation"),p()()()()(),ma()}if(t&2){let e,i,n,o=M();y(10),Pe(o.isCallbackInfoExpanded?"expand_less":"expand_more"),y(),iA("expanded",o.isCallbackInfoExpanded),y(3),Pe((e=o.getCallbackInfo())==null?null:e.shortDescription),y(2),Pe((i=o.getCallbackInfo())==null?null:i.detailedDescription),y(2),te("href",(n=o.getCallbackInfo())==null?null:n.docLink,$r)}}function BlA(t,A){if(t&1&&(m(0,"mat-option",21),T(1),p()),t&2){let e=A.$implicit;te("value",e),y(),Pe(e)}}function ElA(t,A){if(t&1){let e=Ue();Qa(0),m(1,"mat-form-field",3)(2,"mat-label"),T(3,"Callback Type"),p(),m(4,"mat-select",19),qn("ngModelChange",function(n){q(e);let o=M();return Vn(o.callbackType,n)||(o.callbackType=n),W(n)}),ne(5,BlA,2,2,"mat-option",20),p()(),ma()}if(t&2){let e=M();y(4),jn("ngModel",e.callbackType),y(),te("ngForOf",e.availableCallbackTypes)}}function flA(t,A){t&1&&(m(0,"mat-error"),T(1,"Same callback name has been used"),p())}function QlA(t,A){t&1&&(m(0,"mat-error"),T(1,"Cannot have callback consist of two words"),p())}function mlA(t,A){t&1&&(m(0,"mat-error"),T(1,"Callback function names cannot have spaces"),p())}var Tz=class{isErrorState(A){return!!(A&&A.invalid)}},t8=class t{constructor(A,e){this.dialogRef=A;this.data=e;this.callbackType=e?.callbackType??"",this.existingCallbackNames=e?.existingCallbackNames??[],this.isEditMode=!!e?.isEditMode,this.availableCallbackTypes=e?.availableCallbackTypes??[],this.isEditMode&&e?.callback&&(this.callbackName=e.callback.name,this.callbackType=e.callback.type,this.originalCallbackName=e.callback.name,this.existingCallbackNames=this.existingCallbackNames.filter(i=>i!==this.originalCallbackName))}callbackNameInput;callbackName="";callbackType="";existingCallbackNames=[];matcher=new Tz;isEditMode=!1;availableCallbackTypes=[];originalCallbackName="";isCallbackInfoExpanded=!1;addCallback(){if(!this.callbackName.trim()||this.hasSpaces()||this.isDuplicateName())return;let A={name:this.callbackName.trim(),type:this.callbackType,isEditMode:this.isEditMode,originalName:this.originalCallbackName||this.callbackName.trim()};this.dialogRef.close(A)}cancel(){this.dialogRef.close()}isDuplicateName(){if(!Array.isArray(this.existingCallbackNames))return!1;let A=(this.callbackName||"").trim();return this.existingCallbackNames.includes(A)}hasSpaces(){return/\s/.test(this.callbackName||"")}createDisabled(){return!this.callbackName.trim()||this.isDuplicateName()||this.hasSpaces()}validate(){this.hasSpaces()?this.callbackNameInput.control.setErrors({hasSpaces:!0}):this.isDuplicateName()?this.callbackNameInput.control.setErrors({duplicateName:!0}):this.callbackNameInput.control.setErrors(null)}getCallbackInfo(){return E0.getCallbackDetailedInfo(this.callbackType)}toggleCallbackInfo(){this.isCallbackInfoExpanded=!this.isCallbackInfoExpanded}static \u0275fac=function(e){return new(e||t)(DA(co),DA(qo))};static \u0275cmp=xe({type:t,selectors:[["app-add-callback-dialog"]],viewQuery:function(e,i){if(e&1&&At(ulA,5),e&2){let n;oA(n=rA())&&(i.callbackNameInput=n.first)}},decls:18,vars:10,consts:[["callbackNameInput","ngModel"],["mat-dialog-title",""],[4,"ngIf"],[2,"width","100%"],["matInput","",3,"ngModelChange","keydown.enter","ngModel","errorStateMatcher"],["align","end"],["mat-button","",3,"click"],["mat-raised-button","","color","secondary",3,"click","disabled"],[1,"callback-info-container"],[1,"callback-info-header",3,"click"],[1,"callback-info-icon"],[1,"callback-info-title"],["mat-icon-button","","type","button","aria-label","Toggle callback information",1,"callback-info-toggle"],[1,"callback-info-body"],[1,"callback-info-content"],[1,"callback-info-short"],[1,"callback-info-detailed"],[1,"callback-info-link-container"],["target","_blank","rel","noopener noreferrer",1,"callback-info-link",3,"href"],[3,"ngModelChange","ngModel"],[3,"value",4,"ngFor","ngForOf"],[3,"value"]],template:function(e,i){if(e&1){let n=Ue();m(0,"h2",1),T(1),p(),m(2,"mat-dialog-content"),ne(3,hlA,23,6,"ng-container",2)(4,ElA,6,2,"ng-container",2),m(5,"mat-form-field",3)(6,"mat-label"),T(7,"Callback Name"),p(),m(8,"input",4,0),qn("ngModelChange",function(r){return q(n),Vn(i.callbackName,r)||(i.callbackName=r),W(r)}),ee("ngModelChange",function(){return q(n),W(i.validate())})("keydown.enter",function(){return q(n),W(i.addCallback())}),p(),ne(10,flA,2,0,"mat-error",2)(11,QlA,2,0,"mat-error",2)(12,mlA,2,0,"mat-error",2),p()(),m(13,"mat-dialog-actions",5)(14,"button",6),ee("click",function(){return q(n),W(i.cancel())}),T(15,"Cancel"),p(),m(16,"button",7),ee("click",function(){return q(n),W(i.addCallback())}),T(17),p()()}if(e&2){let n=Ji(9);y(),Pe(i.isEditMode?"Edit Callback":"Add "+i.callbackType+" Callback"),y(2),te("ngIf",i.getCallbackInfo()),y(),te("ngIf",i.isEditMode),y(4),jn("ngModel",i.callbackName),te("errorStateMatcher",i.matcher),y(2),te("ngIf",n.hasError("duplicateName")),y(),te("ngIf",n.hasError("hasSpaces")),y(),te("ngIf",n.hasError("hasSpaces")),y(4),te("disabled",i.createDisabled()),y(),FA(" ",i.isEditMode?"Save":"Add"," ")}},dependencies:[Ur,k1,bg,Kn,Mr,Fo,Cr,QAe,tr,kr,jr,j0,Un,ya,gl,ds,q0,pX,L1,Gs,xF,Yl,Ac,gD,ir],styles:[".callback-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;min-width:400px;max-width:600px}.full-width[_ngcontent-%COMP%]{width:100%}mat-dialog-content[_ngcontent-%COMP%]{padding:20px 24px;display:flex;flex-direction:column;gap:16px}mat-dialog-actions[_ngcontent-%COMP%]{padding:16px 24px;margin:0}mat-form-field[_ngcontent-%COMP%]{margin-top:8px!important}.mat-mdc-raised-button.mat-secondary[_ngcontent-%COMP%]:not([disabled]){background-color:#8ab4f8}.callback-info-container[_ngcontent-%COMP%]{background-color:#8ab4f814;border:1px solid rgba(138,180,248,.2);border-radius:8px;padding:16px;margin-bottom:16px}.callback-info-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;padding:4px 0}.callback-info-header[_ngcontent-%COMP%]:hover .callback-info-title[_ngcontent-%COMP%]{color:#a7c8ff}.callback-info-icon[_ngcontent-%COMP%]{color:#8ab4f8;font-size:20px;width:20px;height:20px;flex-shrink:0}.callback-info-title[_ngcontent-%COMP%]{flex:1;font-weight:500;color:#8ab4f8;font-size:14px;transition:color .2s ease}.callback-info-toggle[_ngcontent-%COMP%]{color:#8ab4f8;margin:-8px}.callback-info-toggle[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{transition:transform .2s ease}.callback-info-body[_ngcontent-%COMP%]{max-height:0;overflow:hidden;opacity:0;transition:max-height .3s ease,opacity .2s ease,margin-top .3s ease}.callback-info-body.expanded[_ngcontent-%COMP%]{max-height:500px;opacity:1;margin-top:12px}.callback-info-content[_ngcontent-%COMP%]{flex:1}.callback-info-short[_ngcontent-%COMP%]{font-weight:500;color:#e3e3e3;margin-bottom:8px;line-height:1.4}.callback-info-detailed[_ngcontent-%COMP%]{color:#c4c7ca;font-size:14px;line-height:1.5}.callback-info-link-container[_ngcontent-%COMP%]{margin-top:12px}.callback-info-link[_ngcontent-%COMP%]{color:#8ab4f8;text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:4px;transition:color .2s ease}.callback-info-link[_ngcontent-%COMP%]:hover{color:#a7c8ff}.callback-info-link[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:16px;width:16px;height:16px}"]})};var EBe=(t,A)=>A.name;function plA(t,A){if(t&1&&T(0),t&2){let e=M().$implicit;FA(" AgentTool: ",e.name," ")}}function wlA(t,A){if(t&1&&T(0),t&2){let e=M().$implicit;FA(" ",e.name," ")}}function ylA(t,A){t&1&&(m(0,"mat-icon",27),T(1,"chevron_right"),p())}function DlA(t,A){if(t&1){let e=Ue();m(0,"div",26),ee("click",function(){let n=q(e).$implicit,o=M(2);return W(o.selectAgentFromBreadcrumb(n))}),ne(1,plA,1,1)(2,wlA,1,1),p(),ne(3,ylA,2,0,"mat-icon",27)}if(t&2){let e=A.$implicit,i=A.$index,n=M(2);iA("current-agent",(n.currentSelectedAgent==null?null:n.currentSelectedAgent.name)===e.name),y(),$(i===0&&n.isInAgentToolContext()?1:2),y(2),$(i0?0:-1)}}function GlA(t,A){if(t&1){let e=Ue();m(0,"div",14)(1,"div",15)(2,"div"),T(3," Tools "),p(),m(4,"div")(5,"button",39,2)(7,"mat-icon"),T(8,"add"),p()(),m(9,"mat-menu",null,3)(11,"button",22),ee("click",function(){q(e);let n=M();return W(n.addTool("Function tool"))}),m(12,"span"),T(13,"Function tool"),p()(),m(14,"button",22),ee("click",function(){q(e);let n=M();return W(n.addTool("Built-in tool"))}),m(15,"span"),T(16,"Built-in tool"),p()(),m(17,"button",22),ee("click",function(){q(e);let n=M();return W(n.createAgentTool())}),m(18,"span"),T(19,"Agent tool"),p()()()()(),ne(20,FlA,1,1),Ii(21,"async"),p()}if(t&2){let e,i=Ji(10),n=M();y(5),te("matMenuTriggerFor",i),y(6),te("matTooltip",n.toolMenuTooltips("Function tool")),y(3),te("matTooltip",n.toolMenuTooltips("Built-in tool")),y(3),te("matTooltip",n.toolMenuTooltips("Agent tool")),y(3),$((e=Qi(21,5,n.toolsMap$))?20:-1,e)}}function KlA(t,A){if(t&1){let e=Ue();m(0,"mat-chip",42),ee("click",function(){let n=q(e).$implicit,o=M(2);return W(o.selectAgent(n))}),m(1,"mat-icon",43),T(2),p(),m(3,"span",44),T(4),p(),m(5,"button",47),ee("click",function(n){let o=q(e).$implicit;return M(2).deleteSubAgent(o.name),W(n.stopPropagation())}),m(6,"mat-icon"),T(7,"cancel"),p()()()}if(t&2){let e=A.$implicit,i=M(2);y(2),Pe(i.getAgentIcon(e.agent_class)),y(2),Pe(e.name)}}function UlA(t,A){if(t&1&&(m(0,"div",19)(1,"mat-chip-set",46),Rt(2,KlA,8,2,"mat-chip",41,EBe),p()()),t&2){let e=M();y(2),Nt(e.agentConfig.sub_agents)}}function TlA(t,A){if(t&1){let e=Ue();ve(0,"mat-divider"),m(1,"div",21),T(2,"Model (LLM) Interaction"),p(),m(3,"button",22),ee("click",function(){q(e);let n=M();return W(n.addCallback("before_model"))}),m(4,"span"),T(5,"Before Model"),p()(),m(6,"button",22),ee("click",function(){q(e);let n=M();return W(n.addCallback("after_model"))}),m(7,"span"),T(8,"After Model"),p()(),ve(9,"mat-divider"),m(10,"div",21),T(11,"Tool Execution"),p(),m(12,"button",22),ee("click",function(){q(e);let n=M();return W(n.addCallback("before_tool"))}),m(13,"span"),T(14,"Before Tool"),p()(),m(15,"button",22),ee("click",function(){q(e);let n=M();return W(n.addCallback("after_tool"))}),m(16,"span"),T(17,"After Tool"),p()()}if(t&2){let e=M();y(3),te("matTooltip",e.callbackMenuTooltips("before_model")),y(3),te("matTooltip",e.callbackMenuTooltips("after_model")),y(6),te("matTooltip",e.callbackMenuTooltips("before_tool")),y(3),te("matTooltip",e.callbackMenuTooltips("after_tool"))}}function OlA(t,A){if(t&1){let e=Ue();m(0,"div",51),ee("click",function(){let n=q(e).$implicit,o=M(3);return W(o.editCallback(n))}),m(1,"mat-chip",52)(2,"span",53)(3,"span",54),T(4),p(),m(5,"span",55),T(6),p()()(),m(7,"button",56),ee("click",function(n){let o=q(e).$implicit,r=M(3);return r.deleteCallback(r.agentConfig.name,o),W(n.stopPropagation())}),m(8,"mat-icon"),T(9,"remove"),p()()()}if(t&2){let e=A.$implicit;y(4),Pe(e.type),y(2),Pe(e.name)}}function JlA(t,A){if(t&1&&(m(0,"div",48)(1,"mat-chip-set",49),Rt(2,OlA,10,2,"div",50,Fi),p()()),t&2){let e=M(),i=M();y(2),Nt(e.get(i.agentConfig.name))}}function YlA(t,A){if(t&1&&ne(0,JlA,4,0,"div",48),t&2){let e=A,i=M();$(i.agentConfig&&e.get(i.agentConfig.name)&&e.get(i.agentConfig.name).length>0?0:-1)}}var YS=class t{CALLBACKS_TAB_INDEX=3;jsonEditorComponent;appNameInput="";exitBuilderMode=new Ve;closePanel=new Ve;featureFlagService=E(Ks);isAlwaysOnSidePanelEnabledObs=this.featureFlagService.isAlwaysOnSidePanelEnabled();toolArgsString=mA("");editingToolArgs=mA(!1);editingTool=null;selectedTabIndex=0;agentConfig={isRoot:!1,name:"",agent_class:"",model:"",instruction:"",sub_agents:[],tools:[],callbacks:[]};hierarchyPath=[];currentSelectedAgent=void 0;isRootAgentEditable=!0;models=["gemini-2.5-flash","gemini-2.5-pro"];agentTypes=["LlmAgent","LoopAgent","ParallelAgent","SequentialAgent"];agentBuilderService=E(Ud);dialog=E(na);agentService=E(Hl);snackBar=E(P1);router=E(Da);cdr=E(ut);selectedTool=void 0;toolAgentName="";toolTypes=["Custom tool","Function tool","Built-in tool","Agent Tool"];editingCallback=null;selectedCallback=void 0;callbackTypes=["before_agent","before_model","before_tool","after_tool","after_model","after_agent"];builtInTools=["EnterpriseWebSearchTool","exit_loop","FilesRetrieval","get_user_choice","google_search","load_artifacts","load_memory","LongRunningFunctionTool","preload_memory","url_context","VertexAiRagRetrieval","VertexAiSearchTool"];builtInToolArgs=new Map([["EnterpriseWebSearchTool",[]],["exit_loop",[]],["FilesRetrieval",["name","description","input_dir"]],["get_user_choice",[]],["google_search",[]],["load_artifacts",[]],["load_memory",[]],["LongRunningFunctionTool",["func"]],["preload_memory",[]],["url_context",[]],["VertexAiRagRetrieval",["name","description","rag_corpora","rag_resources","similarity_top_k","vector_distance_threshold"]],["VertexAiSearchTool",["data_store_id","data_store_specs","search_engine_id","filter","max_results"]]]);header="Select an agent or tool to edit";toolsMap$;callbacksMap$;getJsonStringForEditor(A){if(!A)return"{}";let e=ae({},A);return delete e.skip_summarization,JSON.stringify(e,null,2)}constructor(){this.toolsMap$=this.agentBuilderService.getAgentToolsMap(),this.callbacksMap$=this.agentBuilderService.getAgentCallbacksMap(),this.agentBuilderService.getSelectedNode().subscribe(A=>{this.agentConfig=A,this.currentSelectedAgent=A,A&&(this.editingTool=null,this.editingCallback=null,this.header="Agent configuration",this.updateBreadcrumb(A)),this.cdr.markForCheck()}),this.agentBuilderService.getSelectedTool().subscribe(A=>{this.selectedTool=A,!(A&&A.toolType==="Agent Tool")&&(A?(this.editingTool=A,this.editingToolArgs.set(!1),setTimeout(()=>{let e=A.toolType=="Function tool"?"Function tool":A.name;if(A.toolType=="Function tool"&&!A.name&&(A.name="Function tool"),A.toolType==="Custom tool")A.args||(A.args={}),this.toolArgsString.set(this.getJsonStringForEditor(A.args)),this.editingToolArgs.set(!0);else{let i=this.builtInToolArgs.get(e);if(i){A.args||(A.args={});for(let n of i)A.args&&(A.args[n]="")}this.toolArgsString.set(this.getJsonStringForEditor(A.args)),A.args&&this.getObjectKeys(A.args).length>0&&this.editingToolArgs.set(!0)}this.cdr.markForCheck()}),this.selectedTabIndex=2):this.editingTool=null,this.cdr.markForCheck())}),this.agentBuilderService.getSelectedCallback().subscribe(A=>{this.selectedCallback=A,A?(this.selectCallback(A),this.selectedTabIndex=this.CALLBACKS_TAB_INDEX):this.editingCallback=null,this.cdr.markForCheck()}),this.agentBuilderService.getAgentCallbacks().subscribe(A=>{this.agentConfig&&A&&this.agentConfig.name===A.agentName&&(this.agentConfig=_A(ae({},this.agentConfig),{callbacks:A.callbacks}),this.cdr.markForCheck())}),this.agentBuilderService.getSideTabChangeRequest().subscribe(A=>{A==="tools"?this.selectedTabIndex=2:A==="config"&&(this.selectedTabIndex=0)})}getObjectKeys(A){return A?Object.keys(A).filter(e=>e!=="skip_summarization"):[]}getCallbacksByType(){let A=new Map;return this.callbackTypes.forEach(e=>{A.set(e,[])}),this.agentConfig?.callbacks&&this.agentConfig.callbacks.forEach(e=>{let i=A.get(e.type);i&&i.push(e)}),A}updateBreadcrumb(A){this.hierarchyPath=this.buildHierarchyPath(A)}buildHierarchyPath(A){let e=[],i=this.findContextualRoot(A);return i?A.name===i.name?[i]:this.findPathToAgent(i,A,[i])||[A]:[A]}isInAgentToolContext(){return!this.hierarchyPath||this.hierarchyPath.length===0?!1:this.hierarchyPath[0]?.isAgentTool===!0}findContextualRoot(A){if(A.isAgentTool)return A;let e=this.agentBuilderService.getNodes();for(let n of e)if(n.isAgentTool&&this.findPathToAgent(n,A,[n]))return n;let i=this.agentBuilderService.getRootNode();if(i&&this.findPathToAgent(i,A,[i]))return i;if(A.isRoot)return A;for(let n of e)if(n.isRoot&&this.findPathToAgent(n,A,[n]))return n;return i}findPathToAgent(A,e,i){if(A.name===e.name)return i;for(let n of A.sub_agents){let o=[...i,n],r=this.findPathToAgent(n,e,o);if(r)return r}return null}selectAgentFromBreadcrumb(A){this.agentBuilderService.setSelectedNode(A),this.selectedTabIndex=0}selectAgent(A){this.agentBuilderService.setSelectedNode(A),this.selectedTabIndex=0}selectTool(A){if(A.toolType==="Agent Tool"){let e=A.name;this.agentBuilderService.requestNewTab(e);return}if(A.toolType==="Function tool"||A.toolType==="Built-in tool"){this.editTool(A);return}this.agentBuilderService.setSelectedTool(A)}editTool(A){if(!this.agentConfig)return;let e;A.toolType==="Built-in tool"?e=this.dialog.open(Qh,{width:"700px",maxWidth:"90vw",data:{toolName:A.name,isEditMode:!0,toolArgs:A.args}}):e=this.dialog.open(II,{width:"500px",data:{toolType:A.toolType,toolName:A.name,isEditMode:!0}}),e.afterClosed().subscribe(i=>{if(i&&i.isEditMode){let n=this.agentConfig.tools?.findIndex(o=>o.name===A.name);n!==void 0&&n!==-1&&this.agentConfig.tools&&(this.agentConfig.tools[n].name=i.name,i.args&&(this.agentConfig.tools[n].args=i.args),this.agentBuilderService.setAgentTools(this.agentConfig.name,this.agentConfig.tools))}})}addTool(A){if(this.agentConfig){let e;A==="Built-in tool"?e=this.dialog.open(Qh,{width:"700px",maxWidth:"90vw",data:{}}):e=this.dialog.open(II,{width:"500px",data:{toolType:A}}),e.afterClosed().subscribe(i=>{if(i){let n={toolType:i.toolType,name:i.name};this.agentBuilderService.addTool(this.agentConfig.name,n),this.agentBuilderService.setSelectedTool(n)}})}}addCallback(A){if(this.agentConfig){let e=this.agentConfig?.callbacks?.map(n=>n.name)??[];this.dialog.open(t8,{width:"500px",data:{callbackType:A,existingCallbackNames:e}}).afterClosed().subscribe(n=>{if(n){let o={name:n.name,type:n.type};this.agentBuilderService.addCallback(this.agentConfig.name,o)}})}}editCallback(A){if(!this.agentConfig)return;let e=this.agentConfig.callbacks?.map(n=>n.name)??[];this.dialog.open(t8,{width:"500px",data:{callbackType:A.type,existingCallbackNames:e,isEditMode:!0,callback:A,availableCallbackTypes:this.callbackTypes}}).afterClosed().subscribe(n=>{if(n&&n.isEditMode){let o=this.agentBuilderService.updateCallback(this.agentConfig.name,A.name,_A(ae({},A),{name:n.name,type:n.type}));o.success?this.cdr.markForCheck():console.error("Failed to update callback:",o.error)}})}deleteCallback(A,e){this.dialog.open(f0,{data:{title:"Delete Callback",message:`Are you sure you want to delete ${e.name}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(n=>{if(n==="confirm"){let o=this.agentBuilderService.deleteCallback(A,e);o.success?this.cdr.markForCheck():console.error("Failed to delete callback:",o.error)}})}addSubAgent(A){A&&this.agentBuilderService.setAddSubAgentSubject(A)}deleteSubAgent(A){this.agentBuilderService.setDeleteSubAgentSubject(A)}deleteTool(A,e){let i=e.toolType==="Agent Tool",n=i&&e.toolAgentName||e.name;this.dialog.open(f0,{data:{title:i?"Delete Agent Tool":"Delete Tool",message:i?`Are you sure you want to delete the agent tool "${n}"? This will also delete the corresponding board.`:`Are you sure you want to delete ${n}?`,confirmButtonText:"Delete"}}).afterClosed().subscribe(r=>{if(r==="confirm")if(e.toolType==="Agent Tool"){let s=e.toolAgentName||e.name;this.deleteAgentToolAndBoard(A,e,s)}else this.agentBuilderService.deleteTool(A,e)})}deleteAgentToolAndBoard(A,e,i){this.agentBuilderService.deleteTool(A,e),this.agentBuilderService.requestTabDeletion(i)}backToToolList(){this.editingTool=null,this.agentBuilderService.setSelectedTool(void 0)}editToolArgs(){this.editingToolArgs.set(!0)}cancelEditToolArgs(A){this.editingToolArgs.set(!1),this.toolArgsString.set(this.getJsonStringForEditor(A?.args))}saveToolArgs(A){if(this.jsonEditorComponent&&A)try{let e=JSON.parse(this.jsonEditorComponent.getJsonString()),i=A.args?A.args.skip_summarization:!1;A.args=e,A.args.skip_summarization=i,this.toolArgsString.set(JSON.stringify(A.args,null,2)),this.editingToolArgs.set(!1)}catch(e){console.error("Error parsing tool arguments JSON",e)}}onToolTypeSelectionChange(A){A?.toolType==="Built-in tool"?(A.name="google_search",this.onBuiltInToolSelectionChange(A)):A?.toolType==="Custom tool"?(A.args={},this.toolArgsString.set(this.getJsonStringForEditor(A.args)),this.editingToolArgs.set(!0)):A&&(A.name="",A.args={skip_summarization:!1},this.toolArgsString.set("{}"),this.editingToolArgs.set(!1))}onBuiltInToolSelectionChange(A){A&&(this.editingToolArgs.set(!1),setTimeout(()=>{A.args={skip_summarization:!1};let e=this.builtInToolArgs.get(A.name);if(e)for(let i of e)A.args&&(A.args[i]="");this.toolArgsString.set(this.getJsonStringForEditor(A.args)),A.args&&this.getObjectKeys(A.args).length>0&&this.editingToolArgs.set(!0),this.cdr.markForCheck()}))}selectCallback(A){this.editingCallback=A}backToCallbackList(){this.editingCallback=null}onCallbackTypeChange(A){}createAgentTool(){this.dialog.open(f0,{width:"750px",height:"450px",data:{title:"Create Agent Tool",message:"Please enter a name for the agent tool:",confirmButtonText:"Create",showInput:!0,inputLabel:"Agent Tool Name",inputPlaceholder:"Enter agent tool name",showToolInfo:!0,toolType:"Agent tool"}}).afterClosed().subscribe(e=>{if(e&&typeof e=="string"){let i=this.agentConfig?.name||"root_agent";this.agentBuilderService.requestNewTab(e,i)}})}saveChanges(){if(!this.agentBuilderService.getRootNode()){this.snackBar.open("Please create an agent first.","OK");return}this.appNameInput?this.saveAgent(this.appNameInput):this.agentService.getApp().subscribe(e=>{e?this.saveAgent(e):this.snackBar.open("No agent selected. Please select an agent first.","OK")})}cancelChanges(){this.agentService.agentChangeCancel(this.appNameInput).subscribe(A=>{}),this.exitBuilderMode.emit()}saveAgent(A){let e=this.agentBuilderService.getRootNode();if(!e){this.snackBar.open("Please create an agent first.","OK");return}let i=new FormData,n=this.agentBuilderService.getCurrentAgentToolBoards();zd.generateYamlFile(e,i,A,n),this.agentService.agentBuildTmp(i).subscribe(o=>{o&&this.agentService.agentBuild(i).subscribe(r=>{r?this.router.navigate(["/"],{queryParams:{app:A}}).then(()=>{window.location.reload()}):this.snackBar.open("Something went wrong, please try again","OK")})})}getToolIcon(A){return wQ(A.name,A.toolType)}getAgentIcon(A){switch(A){case"SequentialAgent":return"more_horiz";case"LoopAgent":return"sync";case"ParallelAgent":return"density_medium";case"LlmAgent":default:return"psychology"}}addSubAgentWithType(A){if(!this.agentConfig?.name)return;let e=this.agentConfig.agent_class!=="LlmAgent";this.agentBuilderService.setAddSubAgentSubject(this.agentConfig.name,A,e)}callbackMenuTooltips(A){return E0.getCallbackMenuTooltips(A)}toolMenuTooltips(A){return E0.getToolMenuTooltips(A)}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-builder-tabs"]],viewQuery:function(e,i){if(e&1&&At(r0,5),e&2){let n;oA(n=rA())&&(i.jsonEditorComponent=n.first)}},inputs:{appNameInput:"appNameInput"},outputs:{exitBuilderMode:"exitBuilderMode",closePanel:"closePanel"},decls:75,vars:12,consts:[["subAgentMenu","matMenu"],["callbacksMenu","matMenu"],["agentMenuTrigger","matMenuTrigger"],["toolsMenu","matMenu"],[2,"margin-top","20px","margin-left","20px","display","flex"],[2,"width","100%"],[1,"drawer-header"],[1,"drawer-logo"],["src","assets/ADK-512-color.svg","width","32px","height","32px"],["matTooltip","Collapse panel",1,"material-symbols-outlined",2,"color","#c4c7c5","cursor","pointer","margin-right","15px",3,"click"],[1,"builder-tabs-container"],[1,"builder-tab-content"],[1,"agent-breadcrumb-container"],[1,"content-wrapper"],[1,"builder-panel-wrapper"],[1,"panel-title"],[1,"config-form"],["mat-icon-button","","type","button","aria-label","Add sub agent",1,"panel-action-button",3,"matMenuTriggerFor"],["mat-menu-item","",3,"click"],[1,"tools-chips-container"],["mat-icon-button","","type","button","aria-label","Add callback",1,"panel-action-button",3,"matMenuTriggerFor"],[1,"menu-header"],["mat-menu-item","","matTooltipPosition","right",3,"click","matTooltip"],[1,"action-buttons"],["mat-raised-button","","color","secondary",1,"save-button",3,"click"],["mat-button","",1,"cancel-button",3,"click"],[1,"breadcrumb-chip",3,"click"],[1,"breadcrumb-arrow"],[1,"form-row"],[1,"agent-name-field"],["matInput","",3,"ngModelChange","ngModel","disabled"],[1,"agent-type-field"],["disabled","",3,"ngModelChange","ngModel"],[3,"value"],[3,"ngModel"],[3,"ngModelChange","ngModel"],["matInput","","rows","5",3,"ngModelChange","ngModel"],["matInput","","rows","3",3,"ngModelChange","ngModel"],["matInput","","type","number","min","1",3,"ngModelChange","ngModel"],["mat-icon-button","","type","button","aria-label","Add tool",1,"panel-action-button",3,"matMenuTriggerFor"],["aria-label","Tools"],[1,"tool-chip"],[1,"tool-chip",3,"click"],["matChipAvatar","",1,"tool-icon"],[1,"tool-chip-name"],["matChipRemove","","aria-label","Remove tool",3,"click"],["aria-label","Sub Agents"],["matChipRemove","","aria-label","Remove sub agent",3,"click"],[1,"tools-chips-container","callbacks-list"],["aria-label","Callbacks"],[1,"callback-row"],[1,"callback-row",3,"click"],[1,"callback-chip"],[1,"chip-content"],[1,"chip-type"],[1,"chip-name"],["mat-icon-button","","aria-label","Remove callback",1,"callback-remove",3,"click"]],template:function(e,i){if(e&1){let n=Ue();m(0,"div",4)(1,"div",5)(2,"div",6)(3,"div",7),ve(4,"img",8),T(5," Agent Development Kit "),p(),m(6,"span",9),ee("click",function(){return q(n),W(i.closePanel.emit())}),T(7,"left_panel_close"),p()()()(),m(8,"div",10)(9,"div",11),ne(10,vlA,3,0,"div",12),m(11,"div",13)(12,"div",14)(13,"div",15),T(14," Configuration "),p(),m(15,"div"),ne(16,RlA,16,7,"div",16),p()(),ne(17,GlA,22,7,"div",14),m(18,"div",14)(19,"div",15)(20,"div"),T(21," Sub Agents "),p(),m(22,"div")(23,"button",17)(24,"mat-icon"),T(25,"add"),p()(),m(26,"mat-menu",null,0)(28,"button",18),ee("click",function(){return q(n),W(i.addSubAgentWithType("LlmAgent"))}),m(29,"mat-icon"),T(30,"psychology"),p(),m(31,"span"),T(32,"LLM Agent"),p()(),m(33,"button",18),ee("click",function(){return q(n),W(i.addSubAgentWithType("SequentialAgent"))}),m(34,"mat-icon"),T(35,"more_horiz"),p(),m(36,"span"),T(37,"Sequential Agent"),p()(),m(38,"button",18),ee("click",function(){return q(n),W(i.addSubAgentWithType("LoopAgent"))}),m(39,"mat-icon"),T(40,"sync"),p(),m(41,"span"),T(42,"Loop Agent"),p()(),m(43,"button",18),ee("click",function(){return q(n),W(i.addSubAgentWithType("ParallelAgent"))}),m(44,"mat-icon"),T(45,"density_medium"),p(),m(46,"span"),T(47,"Parallel Agent"),p()()()()(),ne(48,UlA,4,0,"div",19),p(),m(49,"div",14)(50,"div",15)(51,"div"),T(52," Callbacks "),p(),m(53,"div")(54,"button",20)(55,"mat-icon"),T(56,"add"),p()(),m(57,"mat-menu",null,1)(59,"div",21),T(60,"Agent Lifecycle"),p(),m(61,"button",22),ee("click",function(){return q(n),W(i.addCallback("before_agent"))}),m(62,"span"),T(63,"Before Agent"),p()(),m(64,"button",22),ee("click",function(){return q(n),W(i.addCallback("after_agent"))}),m(65,"span"),T(66,"After Agent"),p()(),ne(67,TlA,18,4),p()()(),ne(68,YlA,1,1),Ii(69,"async"),p()(),m(70,"div",23)(71,"button",24),ee("click",function(){return q(n),W(i.saveChanges())}),T(72," Save "),p(),m(73,"button",25),ee("click",function(){return q(n),W(i.cancelChanges())}),T(74," Cancel "),p()()()()}if(e&2){let n,o=Ji(27),r=Ji(58);y(10),$(i.hierarchyPath.length>0?10:-1),y(6),$(i.agentConfig?16:-1),y(),$((i.agentConfig==null?null:i.agentConfig.agent_class)==="LlmAgent"?17:-1),y(6),te("matMenuTriggerFor",o),y(25),$(i.agentConfig&&i.agentConfig.sub_agents&&i.agentConfig.sub_agents.length>0?48:-1),y(6),te("matMenuTriggerFor",r),y(7),te("matTooltip",i.callbackMenuTooltips("before_agent")),y(3),te("matTooltip",i.callbackMenuTooltips("after_agent")),y(3),$((i.agentConfig==null?null:i.agentConfig.agent_class)==="LlmAgent"?67:-1),y(),$((n=Qi(69,10,i.callbacksMap$))?68:-1,n)}},dependencies:[Ur,ts,Kn,Mr,sN,Fo,gN,Cr,Un,Ih,sIe,ds,ir,Gs,ya,q0,Ac,Yl,Ma,sd,BE,m2,WCe,d6,jCe,VCe,qCe,mAe,aD],styles:[".builder-tabs-container[_ngcontent-%COMP%]{width:100%;margin-top:40px;height:calc(95vh - 20px);display:flex;flex-direction:column}.agent-breadcrumb-container[_ngcontent-%COMP%]{padding:2px 20px 8px;display:flex;align-items:center;gap:6px;flex-wrap:wrap;border-bottom:1px solid #444746}.breadcrumb-chip[_ngcontent-%COMP%]{background-color:transparent;color:#5c5f5e;font-family:Google Sans;font-size:16px;font-weight:500;border:none;cursor:pointer;transition:all .2s ease;padding:4px 8px;border-radius:4px;display:inline-block;-webkit-user-select:none;user-select:none}.breadcrumb-chip[_ngcontent-%COMP%]:hover{color:#aecbfa}.breadcrumb-chip.current-agent[_ngcontent-%COMP%]{color:#dadce0;font-weight:500}.breadcrumb-arrow[_ngcontent-%COMP%]{color:#666;font-size:16px;width:16px;height:16px}.builder-tab-content[_ngcontent-%COMP%]{color:#9aa0a6;display:flex;flex-direction:column;flex:1;overflow:hidden}.builder-tab-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:8px 0;font-size:14px;line-height:1.5}.builder-tab-content[_ngcontent-%COMP%]{--mdc-filled-text-field-container-color: #333537}.builder-tab-content[_ngcontent-%COMP%]{--mdc-filled-text-field-focus-active-indicator-color: #333537}.builder-tab-content[_ngcontent-%COMP%]{--mdc-filled-text-field-active-indicator-color: #333537}.builder-tab-content[_ngcontent-%COMP%]{--mdc-filled-text-field-hover-active-indicator-color: #333537}[_nghost-%COMP%] .mat-mdc-text-field-wrapper{border:none!important}.components-section[_ngcontent-%COMP%]{margin-bottom:32px}.components-section[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{color:#e8eaed;font-size:14px;font-weight:500;margin:0 0 16px;text-transform:uppercase;letter-spacing:.5px}.config-form[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:16px;margin-top:20px}.config-form[_ngcontent-%COMP%] .form-row[_ngcontent-%COMP%]{display:flex;gap:16px;align-items:flex-start}.config-form[_ngcontent-%COMP%] .form-row[_ngcontent-%COMP%] .agent-name-field[_ngcontent-%COMP%]{flex:1}.config-form[_ngcontent-%COMP%] .form-row[_ngcontent-%COMP%] .agent-type-field[_ngcontent-%COMP%]{width:32%}.config-form[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{width:100%}.config-form[_ngcontent-%COMP%] mat-checkbox[_ngcontent-%COMP%]{margin-bottom:8px}.config-form[_ngcontent-%COMP%] .tool-code-section[_ngcontent-%COMP%]{margin-top:16px}.config-form[_ngcontent-%COMP%] .tool-code-section[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0 0 8px;color:#9aa0a6;font-size:14px;font-weight:500}.config-form[_ngcontent-%COMP%] .tool-args-header[_ngcontent-%COMP%]{color:#e8eaed;font-size:14px;font-weight:500;letter-spacing:.5px;text-transform:uppercase}.json-editor-wrapper[_ngcontent-%COMP%]{height:300px;max-height:300px}.tab-content-container[_ngcontent-%COMP%]{margin-top:20px;overflow-y:auto}.agent-list-row[_ngcontent-%COMP%]{display:flex;margin-top:10px}.sub-agent-list-row[_ngcontent-%COMP%]{display:flex;margin-top:10px;margin-left:16px}.tree-view[_ngcontent-%COMP%] mat-tree[_ngcontent-%COMP%]{background-color:inherit!important}.tree-view[_ngcontent-%COMP%] expand-button[_ngcontent-%COMP%]{background-color:transparent;border:0}.node-item[_ngcontent-%COMP%]{display:flex;align-items:center}.node-icon[_ngcontent-%COMP%]{margin-right:14px}.node-name[_ngcontent-%COMP%]{margin-top:2px;display:flex;align-items:center}.no-tools-message[_ngcontent-%COMP%]{display:block;color:#9aa0a6;font-size:16px;margin-top:16px;margin-bottom:16px;text-align:center}.tools-list[_ngcontent-%COMP%]{list-style:none;padding:0}.tool-name[_ngcontent-%COMP%]{cursor:pointer;padding:11px;border-radius:8px;display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;background-color:#303030;color:#e8eaed;font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.tool-name[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{visibility:hidden}.tool-name[_ngcontent-%COMP%]:hover{background-color:#141414}.tool-name[_ngcontent-%COMP%]:hover button[_ngcontent-%COMP%]{visibility:visible}.tool-list-item-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;padding-right:8px} .tools-chips-container .mat-mdc-chip-set{width:100%} .tools-chips-container.callbacks-list .mat-mdc-chip-set{display:flex;flex-direction:column;gap:8px;width:100%} .tools-chips-container .mat-mdc-chip.tool-chip{background-color:#303030;color:#e8eaed;font-family:Google Sans,sans-serif;font-size:14px;font-weight:500;cursor:pointer;margin:4px} .tools-chips-container .mat-mdc-chip.tool-chip:hover{background-color:#3c4043} .tools-chips-container .mat-mdc-chip.tool-chip .mat-mdc-chip-action-label{display:flex;align-items:center;gap:6px} .tools-chips-container .mat-mdc-chip.tool-chip .tool-chip-name{display:inline-flex;align-items:center} .tools-chips-container .mat-mdc-chip.tool-chip .tool-icon{font-size:18px;width:18px;height:18px} .tools-chips-container .mat-mdc-chip.tool-chip .mat-mdc-chip-remove{opacity:1;color:#9aa0a6} .tools-chips-container .mat-mdc-chip.tool-chip .mat-mdc-chip-remove mat-icon{font-size:18px;width:18px;height:18px} .tools-chips-container .mat-mdc-chip.tool-chip .mat-mdc-chip-remove:hover{color:#e8eaed} .tools-chips-container .mat-mdc-chip.callback-chip{background:#333537;background-color:#333537;color:#f1f3f4;font-family:Google Sans,sans-serif;font-size:14px;display:flex;flex-direction:row;align-items:center;gap:12px;width:auto;height:40px;border-radius:8px;border:none;box-shadow:none;outline:none;--mdc-chip-outline-width: 0;--mdc-chip-outline-color: transparent;--mdc-chip-elevated-container-color: #333537;--mdc-chip-flat-container-color: #333537;flex:1 1 auto;min-width:0} .tools-chips-container .mat-mdc-chip.callback-chip:before, .tools-chips-container .mat-mdc-chip.callback-chip:after, .tools-chips-container .mat-mdc-chip.callback-chip .mat-mdc-chip-focus-overlay{border:none;box-shadow:none} .tools-chips-container .mat-mdc-chip.callback-chip .mat-mdc-chip-action-label{display:flex;flex:1;align-items:center;width:100%;gap:12px} .tools-chips-container .mat-mdc-chip.callback-chip .chip-content{display:flex;flex-direction:row;align-items:center;gap:12px;flex:1;min-width:0} .tools-chips-container .mat-mdc-chip.callback-chip .chip-type{color:#8f9aa6;font-size:13px;font-weight:500;white-space:nowrap} .tools-chips-container .mat-mdc-chip.callback-chip .chip-name{color:#f5f7f9;font-size:15px;font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis}.tools-chips-container[_ngcontent-%COMP%]{margin-top:12px;padding:0 4px}.tools-chips-container.callbacks-list[_ngcontent-%COMP%]{padding-right:0;padding-left:0}.callback-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px;width:100%;cursor:pointer}.callback-remove[_ngcontent-%COMP%]{color:#f1f3f4;cursor:pointer;width:32px;height:32px;min-width:32px;min-height:32px;display:inline-flex;align-items:center;justify-content:center;padding:0}.callback-remove[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:1;display:flex;align-items:center;justify-content:center;transform:translateY(.5px)}.back-button[_ngcontent-%COMP%]{margin-bottom:16px}.add-tool-button[_ngcontent-%COMP%]{width:100%;background:linear-gradient(0deg,#8ab4f83d 0% 100%),#202124;border:none;border-radius:4px;margin-top:12px;cursor:pointer}.add-tool-button-detail[_ngcontent-%COMP%]{display:flex;padding:8px 16px 8px 12px;justify-content:center}.add-tool-button-text[_ngcontent-%COMP%]{padding-top:2px;color:var(--Blue-100, #d2e3fc);font-family:Google Sans;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.agent-tool-section[_ngcontent-%COMP%]{margin-top:16px;padding:16px;border:1px solid rgba(255,255,255,.1);border-radius:8px;background-color:#ffffff05}.agent-tool-section[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{color:#e8eaed;font-size:16px;font-weight:500;margin:0 0 8px}.agent-tool-section[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:#9aa0a6;font-size:14px;margin:0 0 16px;line-height:1.5}.agent-tool-section[_ngcontent-%COMP%] .create-agent-tool-btn[_ngcontent-%COMP%]{background-color:#8ab4f8;color:#202124;font-weight:500}.agent-tool-section[_ngcontent-%COMP%] .create-agent-tool-btn[_ngcontent-%COMP%]:hover{background-color:#aecbfa}.no-callbacks-message[_ngcontent-%COMP%]{color:#9aa0a6;font-size:16px;margin-top:16px;text-align:center}.callback-name[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;padding-right:8px}.callback-section[_ngcontent-%COMP%]{margin-top:16px}.callback-section[_ngcontent-%COMP%] .callback-section-label[_ngcontent-%COMP%]{margin:0 0 8px;color:#9aa0a6;font-size:14px;font-weight:500;text-transform:none}.callback-groups-wrapper[_ngcontent-%COMP%]{margin-top:16px}.callback-group[_ngcontent-%COMP%]{margin-top:5px}.callback-group[_ngcontent-%COMP%]{--mat-expansion-container-background-color: #333537}.callback-group[_ngcontent-%COMP%]{--mat-expansion-header-focus-state-layer-color: red}.callback-group[_ngcontent-%COMP%]{--mat-expansion-header-description-color: #8e918f}.callback-group[_ngcontent-%COMP%]{--mat-expansion-header-text-size: 15}.callback-list[_ngcontent-%COMP%]{padding:8px 0}.no-callbacks-in-type[_ngcontent-%COMP%]{color:#9aa0a6;font-size:14px;font-style:italic;padding:12px;text-align:center}.callback-item[_ngcontent-%COMP%]{cursor:pointer;padding:8px 12px;border-radius:4px;display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;background-color:#303030;color:#e8eaed;font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.callback-item[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{visibility:hidden}.callback-item[_ngcontent-%COMP%]:hover{background-color:#444746}.callback-item[_ngcontent-%COMP%]:hover button[_ngcontent-%COMP%]{visibility:visible}.add-callback-icon[_ngcontent-%COMP%]{color:#8ab4f8}.add-callback-icon[_ngcontent-%COMP%]:hover{background-color:#8ab4f81a} .callback-group .mat-expansion-panel-header.mat-expanded:focus{background-color:#444746!important} .callback-group .mat-expansion-panel-header.mat-expanded{background-color:#444746!important} .callback-group .mat-expansion-panel-header.mat-expanded:hover{background-color:#444746!important} .callback-group .mat-expansion-panel-header-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}mat-tab-group[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;overflow:hidden;padding:16px 20px 0;min-height:0} .mat-mdc-tab-body-wrapper{flex:1;overflow:hidden;min-height:0} .mat-mdc-tab-body-content{flex:1;overflow:hidden;display:flex;flex-direction:column;min-height:0}mat-tab-group[_ngcontent-%COMP%]{flex:1;padding-bottom:0;display:flex;flex-direction:column;overflow:hidden} .mat-mdc-tab-body-wrapper{flex:1;overflow:hidden} .mat-mdc-tab-body-content{height:100%;overflow:hidden} .mat-drawer-inner-container{overflow:hidden}.action-buttons[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:8px;padding:16px 20px;border-top:1px solid rgba(255,255,255,.1);flex-shrink:0;margin-top:auto;background-color:#202124}.action-buttons[_ngcontent-%COMP%] .save-button[_ngcontent-%COMP%]{background-color:#8ab4f8;color:#202124;font-weight:500}.action-buttons[_ngcontent-%COMP%] .save-button[_ngcontent-%COMP%]:hover{background-color:#aecbfa}.action-buttons[_ngcontent-%COMP%] .cancel-button[_ngcontent-%COMP%]{color:#9aa0a6;border:1px solid rgba(154,160,166,.3)}.action-buttons[_ngcontent-%COMP%] .cancel-button[_ngcontent-%COMP%]:hover{background-color:#9aa0a61a;color:#e8eaed}.builder-panel-wrapper[_ngcontent-%COMP%]{border-bottom:1px solid #444746;padding:12px 24px}.panel-title[_ngcontent-%COMP%]{color:#c4c7c5;font-family:Google Sans;font-size:16px;font-style:normal;font-weight:500;line-height:24px;display:flex;justify-content:space-between}.panel-title[_ngcontent-%COMP%] .panel-action-button[_ngcontent-%COMP%]{color:#f1f3f4;width:32px;height:32px;min-width:32px;min-height:32px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;padding:0}.panel-title[_ngcontent-%COMP%] .panel-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:18px;width:18px;height:18px;line-height:1;display:flex;align-items:center;justify-content:center}.content-wrapper[_ngcontent-%COMP%]{flex:1;overflow-y:auto}.drawer-logo[_ngcontent-%COMP%]{margin-left:9px;display:flex;align-items:center;font-size:16px;font-style:normal;font-weight:500;line-height:24px;letter-spacing:.1px}.drawer-logo[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{margin-right:9px}.drawer-header[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-between;align-items:center}.drawer-header[_ngcontent-%COMP%]{--mdc-filled-button-container-color: var(--side-panel-button-filled-container-color)}.drawer-header[_ngcontent-%COMP%]{--mdc-filled-button-label-text-color: var(--side-panel-button-filled-label-text-color)}.drawer-header[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{width:36px;height:36px;color:var(--side-panel-mat-icon-color);cursor:pointer;display:flex;align-items:center;justify-content:center} .mat-mdc-menu-panel{background-color:#303030!important} .mat-mdc-menu-panel .menu-header{color:#9aa0a6;font-size:12px;padding:8px 16px;font-weight:500;text-transform:uppercase;pointer-events:none} .mat-mdc-menu-panel .mat-mdc-menu-item{color:#e8eaed} .mat-mdc-menu-panel .mat-mdc-menu-item:hover{background-color:#444746} .mat-mdc-menu-panel mat-divider{border-top-color:#444746;margin:4px 0}"],changeDetection:0})};var Oz={openPanelTooltip:"Open panel",evalCaseIdLabel:"Eval Case ID",cancelButton:"Cancel",saveButton:"Save",editEvalCaseTooltip:"Edit current eval case",deleteEvalCaseTooltip:"Delete current eval case",sessionIdLabel:"Session ID",userIdLabel:"User ID",loadingSessionLabel:"Loading session...",tokenStreamingLabel:"Token Streaming",createNewSessionTooltip:"Create a new Session",newSessionButton:"New Session",deleteSessionTooltip:"Delete current session",exportSessionTooltip:"Export current session",importSessionTooltip:"Import session",loadingAgentsLabel:"Loading agents, please wait...",welcomeMessage:"Welcome to ADK!",selectAgentMessage:"Select an agent on the left to begin with.",failedToLoadAgentsMessage:"Failed to load agents. To get started, run",errorMessageLabel:"Error message:",noAgentsFoundWarning:"Warning: No agents found in current folder."},Jz=new re("Chat Messages",{factory:()=>Oz});var HlA=["sideDrawer"],zlA=["bottomPanel"],PlA=[[["","adk-web-chat-container-top",""]]],jlA=["[adk-web-chat-container-top]"],VlA=t=>({"edit-mode":t}),qlA=()=>[];function WlA(t,A){if(t&1){let e=Ue();m(0,"span",8),ee("click",function(){q(e);let n=M();return W(n.toggleSidePanel())}),T(1,"left_panel_open"),p()}if(t&2){let e=M();te("matTooltip",e.i18n.openPanelTooltip)}}function ZlA(t,A){if(t&1){let e=Ue();m(0,"app-side-panel",9),ee("closePanel",function(){q(e);let n=M();return W(n.toggleSidePanel())})("tabChange",function(n){q(e);let o=M();return W(o.handleTabChange(n))})("eventSelected",function(n){q(e);let o=M();return W(o.selectEvent(n))})("sessionSelected",function(n){q(e);let o=M();return W(o.updateWithSelectedSession(n))})("sessionReloaded",function(n){q(e);let o=M();return W(o.updateWithSelectedSession(n))})("evalCaseSelected",function(n){q(e);let o=M();return W(o.updateWithSelectedEvalCase(n))})("evalSetIdSelected",function(n){q(e);let o=M();return W(o.updateSelectedEvalSetId(n))})("returnToSession",function(n){q(e);let o=M();return W(o.handleReturnToSession(n))})("evalNotInstalled",function(n){q(e);let o=M();return W(o.handleEvalNotInstalled(n))})("page",function(n){q(e);let o=M();return W(o.handlePageEvent(n))})("closeSelectedEvent",function(){q(e);let n=M();return W(n.closeSelectedEvent())})("openImageDialog",function(n){q(e);let o=M();return W(o.openViewImageDialog(n))})("appSelectionChange",function(n){q(e);let o=M();return W(o.onAppSelection(n))})("openAddItemDialog",function(){q(e);let n=M();return W(n.openAddItemDialog())})("enterBuilderMode",function(){q(e);let n=M();return W(n.enterBuilderMode())}),p()}if(t&2){let e=M();te("isApplicationSelectorEnabledObs",e.isApplicationSelectorEnabledObs)("apps$",e.apps$)("isLoadingApps",e.isLoadingApps)("selectedAppControl",e.selectedAppControl)("showSidePanel",e.showSidePanel)("appName",e.appName)("userId",e.userId)("sessionId",e.sessionId)("traceData",e.traceData)("eventData",e.eventData)("currentSessionState",e.currentSessionState)("artifacts",e.artifacts)("selectedEvent",e.selectedEvent)("selectedEventIndex",e.selectedEventIndex)("renderedEventGraph",e.renderedEventGraph)("rawSvgString",e.rawSvgString)("llmRequest",e.llmRequest)("llmResponse",e.llmResponse)("disableBuilderIcon",e.disableBuilderSwitch)}}function XlA(t,A){if(t&1){let e=Ue();m(0,"app-builder-tabs",10),ee("exitBuilderMode",function(){q(e);let n=M();return W(n.exitBuilderMode())})("closePanel",function(){q(e);let n=M();return W(n.toggleSidePanel())}),p(),ve(1,"div",11)}if(t&2){let e=M();te("appNameInput",e.appName)}}function $lA(t,A){if(t&1){let e=Ue();m(0,"div",6)(1,"div",12)(2,"button",13),ee("click",function(){q(e);let n=M();return W(n.saveAgentBuilder())}),m(3,"mat-icon"),T(4,"check"),p()(),m(5,"button",14),ee("click",function(){q(e);let n=M();return W(n.exitBuilderMode())}),m(6,"mat-icon"),T(7,"close"),p()(),m(8,"button",15),ee("click",function(){q(e);let n=M();return W(n.toggleBuilderAssistant())}),m(9,"mat-icon"),T(10,"assistant"),p()()(),m(11,"app-canvas",16),ee("toggleSidePanelRequest",function(){q(e);let n=M();return W(n.toggleSidePanel())})("builderAssistantCloseRequest",function(){q(e);let n=M();return W(n.toggleBuilderAssistant())}),p()()}if(t&2){let e=M();y(8),iA("active",e.showBuilderAssistant),y(3),te("showSidePanel",e.showSidePanel)("showBuilderAssistant",e.showBuilderAssistant)("appNameInput",e.appName)}}function egA(t,A){if(t&1){let e=Ue();m(0,"span",23),ee("click",function(){q(e);let n=M(3);return W(n.toggleSidePanel())}),T(1,"left_panel_open"),p()}if(t&2){let e=M(3);te("matTooltip",e.i18n.openPanelTooltip)}}function AgA(t,A){if(t&1){let e=Ue();m(0,"button",28),ee("click",function(){q(e);let n=M(4);return W(n.cancelEditEvalCase())}),T(1),p(),m(2,"button",29),ee("click",function(){q(e);let n=M(4);return W(n.saveEvalCase())}),T(3),p()}if(t&2){let e=M(4);y(),Pe(e.i18n.cancelButton),y(),te("disabled",!e.hasEvalCaseChanged()||e.isEvalCaseEditing()),y(),FA(" ",e.i18n.saveButton," ")}}function tgA(t,A){if(t&1){let e=Ue();m(0,"span",30),ee("click",function(){q(e);let n=M(4);return W(n.editEvalCase())}),T(1," edit "),p(),m(2,"span",30),ee("click",function(){q(e);let n=M(4);return W(n.deleteEvalCase())}),T(3," delete "),p()}if(t&2){let e=M(4);te("matTooltip",e.i18n.editEvalCaseTooltip),y(2),te("matTooltip",e.i18n.deleteEvalCaseTooltip)}}function igA(t,A){if(t&1&&(m(0,"div",24)(1,"div",25),T(2),p(),m(3,"div",26),T(4),p()(),m(5,"div",27),ne(6,AgA,4,3)(7,tgA,4,2),p()),t&2){let e=M(3);y(2),Pe(e.i18n.evalCaseIdLabel),y(2),Pe(e.evalCase.evalId),y(2),$(e.isEvalEditMode()?6:7)}}function ngA(t,A){if(t&1&&(m(0,"div",25),T(1),p(),m(2,"div",26),T(3),p(),m(4,"div",31),T(5),p(),m(6,"div",26),T(7),p(),m(8,"div",26),T(9),p()),t&2){let e=M(4);y(),Pe(e.i18n.sessionIdLabel),y(2),Pe(e.sessionId),y(2),FA(" ",e.i18n.userIdLabel," "),y(2),Pe(e.userId),y(2),Pe(e.userId)}}function ogA(t,A){if(t&1&&(m(0,"div",25),T(1),p()),t&2){let e=M(4);y(),Pe(e.i18n.loadingSessionLabel)}}function rgA(t,A){if(t&1){let e=Ue();m(0,"span",40),ee("click",function(){q(e);let n=M(5);return W(n.deleteSession(n.sessionId))}),T(1," delete "),p()}if(t&2){let e=M(5);te("matTooltip",e.i18n.deleteSessionTooltip)}}function sgA(t,A){if(t&1){let e=Ue();m(0,"span",41),ee("click",function(){q(e);let n=M(5);return W(n.exportSession())}),T(1," download "),p()}if(t&2){let e=M(5);te("matTooltip",e.i18n.exportSessionTooltip)}}function agA(t,A){if(t&1){let e=Ue();m(0,"span",42),ee("click",function(){q(e);let n=M(5);return W(n.importSession())}),T(1," upload "),p()}if(t&2){let e=M(5);te("matTooltip",e.i18n.importSessionTooltip)}}function cgA(t,A){if(t&1){let e=Ue();m(0,"div",27)(1,"div",32)(2,"mat-slide-toggle",33),Ii(3,"async"),ee("change",function(){q(e);let n=M(4);return W(n.toggleSse())}),T(4),p()(),ve(5,"mat-divider",34),m(6,"div",35)(7,"div",36),ee("click",function(){q(e);let n=M(4);return W(n.onNewSessionClick())}),m(8,"mat-icon"),T(9,"add"),p(),T(10),p(),ne(11,rgA,2,1,"span",37),Ii(12,"async"),ne(13,sgA,2,1,"span",38),Ii(14,"async"),ne(15,agA,2,1,"span",39),Ii(16,"async"),p()()}if(t&2){let e=M(4);y(2),te("checked",e.enableSseIndicator())("disabled",!Qi(3,9,e.isTokenStreamingEnabledObs)),y(2),FA(" ",e.i18n.tokenStreamingLabel," "),y(),te("vertical",!0),y(2),te("matTooltip",e.i18n.createNewSessionTooltip),y(3),FA(" ",e.i18n.newSessionButton," "),y(),$(Qi(12,11,e.isDeleteSessionEnabledObs)?11:-1),y(2),$(Qi(14,13,e.isExportSessionEnabledObs)?13:-1),y(2),$(Qi(16,15,e.importSessionEnabledObs)?15:-1)}}function lgA(t,A){if(t&1&&(m(0,"div",24),Wa(1),Ii(2,"async"),ne(3,ngA,10,5)(4,ogA,2,1,"div",25),p(),ne(5,cgA,17,17,"div",27)),t&2){let e=Qi(2,2,M(3).uiStateService.isSessionLoading());y(3),$(e===!1?3:4),y(2),$(e===!1?5:-1)}}function ggA(t,A){if(t&1&&(m(0,"div",17),ne(1,egA,2,1,"span",22)(2,igA,8,3)(3,lgA,6,4),p()),t&2){let e=M(2);te("ngClass",Al(3,VlA,e.isEvalEditMode())),y(),$(e.showSidePanel?-1:1),y(),$(e.evalCase?2:3)}}function dgA(t,A){if(t&1&&(m(0,"div",43)(1,"span"),T(2),p()()),t&2){let e=M(3);y(2),Pe(e.i18n.loadingAgentsLabel)}}function CgA(t,A){if(t&1&&(m(0,"span"),T(1),ve(2,"br"),T(3),p()),t&2){let e=M(4);y(),Pe(e.i18n.welcomeMessage),y(2),FA(" ",e.i18n.selectAgentMessage,"")}}function IgA(t,A){if(t&1&&(T(0),ve(1,"br"),m(2,"pre",45),T(3),p()),t&2){let e=M(5);FA(" ",e.i18n.errorMessageLabel," "),y(3),Pe(e.loadingError())}}function ugA(t,A){if(t&1&&(m(0,"pre",44),T(1),p()),t&2){let e=M(5);y(),Pe(e.i18n.noAgentsFoundWarning)}}function hgA(t,A){if(t&1&&(m(0,"div"),T(1),m(2,"pre"),T(3,"adk web"),p(),T(4," in the folder that contains the agents."),ve(5,"br"),ne(6,IgA,4,2)(7,ugA,2,1,"pre",44),p()),t&2){let e=M(4);y(),FA(" ",e.i18n.failedToLoadAgentsMessage," "),y(5),$(e.loadingError()?6:7)}}function BgA(t,A){if(t&1&&(m(0,"div",43),ne(1,CgA,4,2,"span"),Ii(2,"async"),ne(3,hgA,8,2,"div"),p()),t&2){let e=M(3);y(),$((Qi(2,1,e.apps$)||v4(3,qlA)).length>0?1:3)}}function EgA(t,A){if(t&1&&(ne(0,dgA,3,1,"div",43),Ii(1,"async"),ne(2,BgA,4,4,"div",43)),t&2){let e=M(2);$(e.isLoadingApps()?0:Qi(1,1,e.isApplicationSelectorEnabledObs)?2:-1)}}function fgA(t,A){if(t&1){let e=Ue();m(0,"button",46),ee("click",function(){q(e);let n=M(2);return W(n.openDialog())}),m(1,"mat-icon"),T(2,"priority_high"),p()()}}function QgA(t,A){if(t&1){let e=Ue();m(0,"app-chat-panel",47),Ii(1,"async"),qn("userInputChange",function(n){q(e);let o=M(2);return Vn(o.userInput,n)||(o.userInput=n),W(n)})("userEditEvalCaseMessageChange",function(n){q(e);let o=M(2);return Vn(o.userEditEvalCaseMessage,n)||(o.userEditEvalCaseMessage=n),W(n)}),ee("clickEvent",function(n){q(e);let o=M(2);return W(o.clickEvent(n))})("handleKeydown",function(n){q(e);let o=M(2);return W(o.handleKeydown(n.event,n.message))})("cancelEditMessage",function(n){q(e);let o=M(2);return W(o.cancelEditMessage(n))})("saveEditMessage",function(n){q(e);let o=M(2);return W(o.saveEditMessage(n))})("openViewImageDialog",function(n){q(e);let o=M(2);return W(o.openViewImageDialog(n))})("openBase64InNewTab",function(n){q(e);let o=M(2);return W(o.openBase64InNewTab(n.data,n.mimeType))})("editEvalCaseMessage",function(n){q(e);let o=M(2);return W(o.editEvalCaseMessage(n))})("deleteEvalCaseMessage",function(n){q(e);let o=M(2);return W(o.deleteEvalCaseMessage(n.message,n.index))})("editFunctionArgs",function(n){q(e);let o=M(2);return W(o.editFunctionArgs(n))})("fileSelect",function(n){q(e);let o=M(2);return W(o.onFileSelect(n))})("removeFile",function(n){q(e);let o=M(2);return W(o.removeFile(n))})("removeStateUpdate",function(){q(e);let n=M(2);return W(n.removeStateUpdate())})("sendMessage",function(n){q(e);let o=M(2);return W(o.sendMessage(n))})("updateState",function(){q(e);let n=M(2);return W(n.updateState())})("toggleAudioRecording",function(){q(e);let n=M(2);return W(n.toggleAudioRecording())})("toggleVideoRecording",function(){q(e);let n=M(2);return W(n.toggleVideoRecording())}),p()}if(t&2){let e,i=M(2);te("appName",i.appName)("messages",i.messages())("isChatMode",i.isChatMode())("evalCase",i.evalCase)("isEvalEditMode",i.isEvalEditMode())("isEvalCaseEditing",i.isEvalCaseEditing())("isEditFunctionArgsEnabled",(e=Qi(1,15,i.isEditFunctionArgsEnabledObs))!==null&&e!==void 0?e:!1),jn("userInput",i.userInput)("userEditEvalCaseMessage",i.userEditEvalCaseMessage),te("selectedFiles",i.selectedFiles)("updatedSessionState",i.updatedSessionState())("eventData",i.eventData)("isAudioRecording",i.isAudioRecording)("isVideoRecording",i.isVideoRecording)("hoveredEventMessageIndices",i.hoveredEventMessageIndices)}}function mgA(t,A){if(t&1){let e=Ue();m(0,"div",21,1),ve(2,"div",48),m(3,"app-trace-event",49),ee("panelClosed",function(){q(e);let n=M(2);return W(n.closeTraceEventDetailPanel())}),p()()}if(t&2){let e=M(2);y(3),te("userId",e.userId)("appName",e.appName)("sessionId",e.sessionId)}}function pgA(t,A){if(t&1&&(m(0,"div",7),NA(1),ne(2,ggA,4,5,"div",17),m(3,"mat-card",18),ne(4,EgA,3,3)(5,fgA,3,0,"button",19)(6,QgA,2,17,"app-chat-panel",20),p(),ne(7,mgA,4,3,"div",21),p()),t&2){let e=M();y(2),$(e.appName!=""?2:-1),y(2),$(e.selectedAppControl.value?-1:4),y(),$(e.longRunningEvents.length>0?5:-1),y(),$(e.appName!=""?6:-1),y(),$(e.bottomPanelVisible?7:-1)}}var wgA="root_agent";function ygA(t){for(t=t.replace(/-/g,"+").replace(/_/g,"/");t.length%4!==0;)t+="=";return t}var Yz=class t extends dD{nextPageLabel="Next Event";previousPageLabel="Previous Event";firstPageLabel="First Event";lastPageLabel="Last Event";getRangeLabel=(A,e,i)=>i===0?`Event 0 of ${i}`:(i=Math.max(i,0),`Event ${A*e+1} of ${i}`);static \u0275fac=(()=>{let A;return function(i){return(A||(A=ii(t)))(i||t)}})();static \u0275prov=be({token:t,factory:t.\u0275fac})},fBe="Restarting bidirectional streaming is not currently supported. Please refresh the page or start a new session.",HS=class t{i18n=E(Jz);_snackBar=E(P1);activatedRoute=E(Tl);agentService=E(Hl);artifactService=E(uD);changeDetectorRef=E(ut);dialog=E(na);document=E(ht);downloadService=E(dE);evalService=E(od);eventService=E(CE);featureFlagService=E(Ks);graphService=E(IE);localFileService=E(hD);location=E(fD);renderer=E(an);router=E(Da);safeValuesService=E(V1);sessionService=E(rd);streamChatService=E(ED);stringToColorService=E(uE);traceService=E(q1);uiStateService=E(zl);agentBuilderService=E(Ud);chatPanel=es.required(EE);canvasComponent=es.required(RQ);sideDrawer=es.required("sideDrawer");sidePanel=es.required(dQ);evalTab=es(a0);bottomPanelRef=es.required("bottomPanel");enableSseIndicator=mA(!1);isChatMode=mA(!0);isEvalCaseEditing=mA(!1);hasEvalCaseChanged=mA(!1);isEvalEditMode=mA(!1);isBuilderMode=mA(!1);videoElement;currentMessage="";messages=mA([]);lastTextChunk="";streamingTextMessage=null;latestThought="";artifacts=[];userInput="";userEditEvalCaseMessage="";userId="user";appName="";sessionId="";evalCase=null;updatedEvalCase=null;evalSetId="";isAudioRecording=!1;isVideoRecording=!1;longRunningEvents=[];functionCallEventId="";redirectUri=oa.getBaseUrlWithoutPath();showSidePanel=!0;showBuilderAssistant=!0;useSse=!1;currentSessionState={};root_agent=wgA;updatedSessionState=mA(null);isModelThinkingSubject=new Mt(!1);sessionHasUsedBidi=new Set;eventData=new Map;traceData=[];renderedEventGraph;rawSvgString=null;selectedEvent=void 0;selectedEventIndex=void 0;llmRequest=void 0;llmResponse=void 0;llmRequestKey="gcp.vertex.agent.llm_request";llmResponseKey="gcp.vertex.agent.llm_response";getMediaTypeFromMimetype=wD;selectedFiles=[];MediaType=Bu;selectedAppControl=new g2("",{nonNullable:!0});openBase64InNewTab=this.safeValuesService.openBase64InNewTab;isLoadingApps=mA(!1);loadingError=mA("");apps$=dA([]).pipe(Pt(()=>{this.isLoadingApps.set(!0),this.selectedAppControl.disable()}),Si(()=>this.agentService.listApps().pipe(br(A=>(this.loadingError.set(A.message),dA(void 0))))),Pn(1),Pt(A=>{this.isLoadingApps.set(!1),this.selectedAppControl.enable(),A?.length==1&&this.router.navigate([],{relativeTo:this.activatedRoute,queryParams:{app:A[0]}})}),za());importSessionEnabledObs=this.featureFlagService.isImportSessionEnabled();isEditFunctionArgsEnabledObs=this.featureFlagService.isEditFunctionArgsEnabled();isSessionUrlEnabledObs=this.featureFlagService.isSessionUrlEnabled();isApplicationSelectorEnabledObs=this.featureFlagService.isApplicationSelectorEnabled();isTokenStreamingEnabledObs=this.featureFlagService.isTokenStreamingEnabled();isExportSessionEnabledObs=this.featureFlagService.isExportSessionEnabled();isEventFilteringEnabled=_g(this.featureFlagService.isEventFilteringEnabled());isApplicationSelectorEnabled=_g(this.featureFlagService.isApplicationSelectorEnabled());isDeleteSessionEnabledObs=this.featureFlagService.isDeleteSessionEnabled();bottomPanelVisible=!1;hoveredEventMessageIndices=[];disableBuilderSwitch=!1;constructor(){}ngOnInit(){if(this.syncSelectedAppFromUrl(),this.updateSelectedAppUrl(),this.streamChatService.onStreamClose().subscribe(i=>{let n=`Please check server log for full details: +`+i;this.openSnackBar(n,"OK")}),new URL(window.location.href).searchParams.has("code")){let i=window.location.href;window.opener?.postMessage({authResponseUrl:i},window.origin),window.close()}this.agentService.getApp().subscribe(i=>{this.appName=i}),uc([this.agentService.getLoadingState(),this.isModelThinkingSubject]).subscribe(([i,n])=>{let o=this.messages()[this.messages().length-1];i?!o?.isLoading&&!this.streamingTextMessage&&this.messages.update(r=>[...r,{role:"bot",isLoading:!0}]):o?.isLoading&&!n&&(this.messages.update(r=>r.slice(0,-1)),this.changeDetectorRef.detectChanges())}),this.traceService.selectedTraceRow$.subscribe(i=>{let n=i?.attributes["gcp.vertex.agent.event_id"];n&&this.eventData.has(n)?this.bottomPanelVisible=!0:this.bottomPanelVisible=!1}),this.traceService.hoveredMessageIndices$.subscribe(i=>this.hoveredEventMessageIndices=i)}get sessionTab(){return this.sidePanel().sessionTabComponent()}ngAfterViewInit(){this.showSidePanel=!0,this.sideDrawer()?.open(),this.isApplicationSelectorEnabled()||this.loadSessionByUrlOrReset()}selectApp(A){A!=this.appName&&(this.agentService.setApp(A),this.loadSessionByUrlOrReset())}loadSessionByUrlOrReset(){this.isSessionUrlEnabledObs.subscribe(A=>{let e=this.activatedRoute.snapshot.queryParams,i=e.session,n=e.userId;if(n&&(this.userId=n),!A||!i){this.createSessionAndReset();return}i&&this.sessionService.getSession(this.userId,this.appName,i).pipe(Pn(1),br(o=>(this.openSnackBar("Cannot find specified session. Creating a new one.","OK"),this.createSessionAndReset(),dA(null)))).subscribe(o=>{o&&this.updateWithSelectedSession(o)})})}createSessionAndReset(){this.createSession(),this.eventData=new Map,this.messages.set([]),this.artifacts=[],this.userInput="",this.longRunningEvents=[]}createSession(){this.uiStateService.setIsSessionListLoading(!0),this.sessionService.createSession(this.userId,this.appName).subscribe(A=>{this.uiStateService.setIsSessionListLoading(!1),this.currentSessionState=A.state,this.sessionId=A.id??"",this.sessionTab?.refreshSession(),this.sessionTab?.reloadSession(this.sessionId),this.isSessionUrlEnabledObs.subscribe(e=>{e&&this.updateSelectedSessionUrl()})},()=>{this.uiStateService.setIsSessionListLoading(!1)})}sendMessage(A){return Ci(this,null,function*(){if(A.preventDefault(),!this.userInput.trim()&&this.selectedFiles.length<=0||A instanceof KeyboardEvent&&(A.isComposing||A.keyCode===229))return;if(this.userInput.trim()&&this.messages.update(i=>[...i,{role:"user",text:this.userInput}]),this.selectedFiles.length>0){let i=this.selectedFiles.map(n=>({file:n.file,url:n.url}));this.messages.update(n=>[...n,{role:"user",attachments:i}])}let e={appName:this.appName,userId:this.userId,sessionId:this.sessionId,newMessage:{role:"user",parts:yield this.getUserMessageParts()},streaming:this.useSse,stateDelta:this.updatedSessionState()};this.selectedFiles=[],this.streamingTextMessage=null,this.agentService.runSse(e).subscribe({next:i=>Ci(this,null,function*(){if(i.error){this.openSnackBar(i.error,"OK");return}if(i.content)for(let n of this.combineTextParts(i.content.parts))this.processPart(i,n),this.traceService.setEventData(this.eventData);else i.errorMessage?this.processErrorMessage(i):i.actions&&this.processActionArtifact(i);this.changeDetectorRef.detectChanges()}),error:i=>{console.error("Send message error:",i),this.openSnackBar(i,"OK")},complete:()=>{this.updatedSessionState()&&(this.currentSessionState=this.updatedSessionState(),this.updatedSessionState.set(null)),this.streamingTextMessage=null,this.sessionTab?.reloadSession(this.sessionId),this.eventService.getTrace(this.sessionId).pipe(br(i=>i.status===404?dA(null):dA([]))).subscribe(i=>{this.traceData=i,this.changeDetectorRef.detectChanges()}),this.traceService.setMessages(this.messages()),this.changeDetectorRef.detectChanges()}}),this.userInput="",this.changeDetectorRef.detectChanges()})}processErrorMessage(A){this.storeEvents(A,A),this.insertMessageBeforeLoadingMessage({text:A.errorMessage,role:"bot"})}processPart(A,e){let i=A.groundingMetadata?.searchEntryPoint?.renderedContent;if(e.text){this.isModelThinkingSubject.next(!1);let n=e.text;if(e.thought){if(n!==this.latestThought){this.storeEvents(e,A);let o={role:"bot",text:this.processThoughtText(n),thought:!0,eventId:A.id};this.insertMessageBeforeLoadingMessage(o)}this.latestThought=n}else if(this.streamingTextMessage){if(i&&(this.streamingTextMessage.renderedContent=A.groundingMetadata.searchEntryPoint.renderedContent),n==this.streamingTextMessage.text){this.storeEvents(e,A),this.streamingTextMessage=null;return}this.streamingTextMessage.text+=n}else if(this.streamingTextMessage={role:"bot",text:this.processThoughtText(n),thought:!!e.thought,eventId:A.id},i&&(this.streamingTextMessage.renderedContent=A.groundingMetadata.searchEntryPoint.renderedContent),this.insertMessageBeforeLoadingMessage(this.streamingTextMessage),!this.useSse){this.storeEvents(e,A),this.streamingTextMessage=null;return}}else e.thought?this.isModelThinkingSubject.next(!0):(this.isModelThinkingSubject.next(!1),this.storeEvents(e,A),this.storeMessage(e,A,A.author==="user"?"user":"bot"))}getUserMessageParts(){return Ci(this,null,function*(){let A=[];if(this.userInput.trim()&&A.push({text:`${this.userInput}`}),this.selectedFiles.length>0)for(let e of this.selectedFiles)A.push(yield this.localFileService.createMessagePartFromFile(e.file));return A})}processActionArtifact(A){A.actions&&A.actions.artifactDelta&&(this.storeEvents(null,A),this.storeMessage(null,A,"bot"))}combineTextParts(A){let e=[],i;for(let n of A)n.text&&!n.thought?i?i.text+=n.text:(i={text:n.text},e.push(i)):(i=void 0,e.push(n));return e}updateRedirectUri(A,e){try{let i=new URL(A);return i.searchParams.set("redirect_uri",e),i.toString()}catch(i){return console.warn("Failed to update redirect URI: ",i),A}}storeMessage(A,e,i,n,o){if(e?.author&&this.createAgentIconColorClass(e.author),e?.longRunningToolIds&&e.longRunningToolIds.length>0){this.getAsyncFunctionsFromParts(e.longRunningToolIds,e.content.parts,e.invocationId);let s=this.longRunningEvents[0].function;if(s.args.authConfig&&s.args.authConfig.exchangedAuthCredential&&s.args.authConfig.exchangedAuthCredential.oauth2){let a=s.args.authConfig.exchangedAuthCredential.oauth2.authUri,c=this.updateRedirectUri(a,this.redirectUri);this.openOAuthPopup(c).then(l=>{this.functionCallEventId=e.id,this.sendOAuthResponse(s,l,this.redirectUri)}).catch(l=>{console.error("OAuth Error:",l)})}else this.functionCallEventId=e.id}if(e?.actions&&e.actions.artifactDelta)for(let s in e.actions.artifactDelta)e.actions.artifactDelta.hasOwnProperty(s)&&this.renderArtifact(s,e.actions.artifactDelta[s]);e?.evalStatus&&this.isChatMode.set(!1);let r={role:i,evalStatus:e?.evalStatus,failedMetric:e?.failedMetric,evalScore:e?.evalScore,evalThreshold:e?.evalThreshold,actualInvocationToolUses:e?.actualInvocationToolUses,expectedInvocationToolUses:e?.expectedInvocationToolUses,actualFinalResponse:e?.actualFinalResponse,expectedFinalResponse:e?.expectedFinalResponse,invocationIndex:n!==void 0?n:void 0,finalResponsePartIndex:o?.finalResponsePartIndex!==void 0?o.finalResponsePartIndex:void 0,toolUseIndex:o?.toolUseIndex!==void 0?o.toolUseIndex:void 0};if(A){if(A.inlineData){let s=this.formatBase64Data(A.inlineData.data,A.inlineData.mimeType);r.inlineData={displayName:A.inlineData.displayName,data:s,mimeType:A.inlineData.mimeType}}else if(A.text)r.text=A.text,r.thought=!!A.thought,e?.groundingMetadata&&e.groundingMetadata.searchEntryPoint&&e.groundingMetadata.searchEntryPoint.renderedContent&&(r.renderedContent=e.groundingMetadata.searchEntryPoint.renderedContent),r.eventId=e?.id;else if(A.functionCall)r.functionCall=A.functionCall,r.eventId=e?.id;else if(A.functionResponse)r.functionResponse=A.functionResponse,r.eventId=e?.id;else if(A.executableCode)r.executableCode=A.executableCode;else if(A.codeExecutionResult&&(r.codeExecutionResult=A.codeExecutionResult,e.actions&&e.actions.artifact_delta))for(let s in e.actions.artifact_delta)e.actions.artifact_delta.hasOwnProperty(s)&&this.renderArtifact(s,e.actions.artifact_delta[s])}A&&Object.keys(A).length>0&&this.insertMessageBeforeLoadingMessage(r)}insertMessageBeforeLoadingMessage(A){this.messages.update(e=>{let i=e[e.length-1];return i?.isLoading?[...e.slice(0,-1),A,i]:[...e,A]})}formatBase64Data(A,e){let i=ygA(A);return`data:${e};base64,${i}`}renderArtifact(A,e){let i={role:"bot",inlineData:{data:"",mimeType:"image/png"}};this.insertMessageBeforeLoadingMessage(i);let n=this.messages(),r=n[n.length-1]?.isLoading?n.length-2:n.length-1;this.artifactService.getArtifactVersion(this.userId,this.appName,this.sessionId,A,e).subscribe(s=>{let a=s.inlineData.mimeType,c=this.formatBase64Data(s.inlineData.data,a),l=wD(a),d={name:this.createDefaultArtifactName(a),data:c,mimeType:a,mediaType:l};this.messages.update(C=>{let I=[...C];return I[r]={role:"bot",inlineData:d},I}),this.artifacts=[...this.artifacts,{id:A,data:c,mimeType:a,versionId:e,mediaType:wD(a)}]})}storeEvents(A,e){let i="";A==null&&e.actions.artifactDelta?i+="eventAction: artifact":A&&(A.text?i+="text:"+A.text:A.functionCall?i+="functionCall:"+A.functionCall.name:A.functionResponse?i+="functionResponse:"+A.functionResponse.name:A.executableCode?i+="executableCode:"+A.executableCode.code.slice(0,10):A.codeExecutionResult?i+="codeExecutionResult:"+A.codeExecutionResult.outcome:A.errorMessage&&(i+="errorMessage:"+A.errorMessage)),e.title=i,this.eventData.set(e.id,e),this.eventData=new Map(this.eventData)}sendOAuthResponse(A,e,i){this.longRunningEvents.pop();let n={appName:this.appName,userId:this.userId,sessionId:this.sessionId,newMessage:{role:"user",parts:[]}};var o=structuredClone(A.args.authConfig);o.exchangedAuthCredential.oauth2.authResponseUri=e,o.exchangedAuthCredential.oauth2.redirectUri=i,n.functionCallEventId=this.functionCallEventId,n.newMessage.parts.push({function_response:{id:A.id,name:A.name,response:o}});let r=[];this.agentService.runSse(n).subscribe({next:s=>Ci(this,null,function*(){r.push(s)}),error:s=>console.error("SSE error:",s),complete:()=>{this.processRunSseResponse(r)}})}processRunSseResponse(A){for(let e of A)if(e.content)for(let i of e.content.parts)this.processPart(e,i)}openDialog(){this.dialog.open(s9,{width:"600px",data:{event:this.longRunningEvents[0].function,appName:this.appName,userId:this.userId,sessionId:this.sessionId,functionCallEventId:this.functionCallEventId,invocationId:this.longRunningEvents[0].invocationId}}).afterClosed().subscribe(e=>{e&&(this.removeFinishedLongRunningEvents(e.events),this.processRunSseResponse(e.response),this.changeDetectorRef.detectChanges())})}removeFinishedLongRunningEvents(A){let e=new Set(A.map(i=>i.id));this.longRunningEvents=this.longRunningEvents.filter(i=>!e.has(i.id))}createAgentIconColorClass(A){let e=this.stringToColorService.stc(A),i=`custom-icon-color-${e.replace("#","")}`;this.injectCustomIconColorStyle(i,e)}clickEvent(A){let e=this.messages()[A].eventId;this.sideDrawer()?.open(),this.showSidePanel=!0,this.selectEvent(e)}ngOnDestroy(){this.streamChatService.closeStream()}onAppSelection(A){this.isAudioRecording&&(this.stopAudioRecording(),this.isAudioRecording=!1),this.isVideoRecording&&(this.stopVideoRecording(),this.isVideoRecording=!1),this.evalTab()?.resetEvalResults(),this.traceData=[],this.bottomPanelVisible=!1}toggleAudioRecording(){this.isAudioRecording?this.stopAudioRecording():this.startAudioRecording()}startAudioRecording(){if(this.sessionHasUsedBidi.has(this.sessionId)){this.openSnackBar(fBe,"OK");return}this.isAudioRecording=!0,this.streamChatService.startAudioChat({appName:this.appName,userId:this.userId,sessionId:this.sessionId}),this.messages.update(A=>[...A,{role:"user",text:"Speaking..."},{role:"bot",text:"Speaking..."}]),this.sessionHasUsedBidi.add(this.sessionId)}stopAudioRecording(){this.streamChatService.stopAudioChat(),this.isAudioRecording=!1}toggleVideoRecording(){this.isVideoRecording?this.stopVideoRecording():this.startVideoRecording()}startVideoRecording(){if(this.sessionHasUsedBidi.has(this.sessionId)){this.openSnackBar(fBe,"OK");return}let A=this.chatPanel()?.videoContainer;A&&(this.isVideoRecording=!0,this.streamChatService.startVideoChat({appName:this.appName,userId:this.userId,sessionId:this.sessionId,videoContainer:A}),this.messages.update(e=>[...e,{role:"user",text:"Speaking..."}]),this.sessionHasUsedBidi.add(this.sessionId))}stopVideoRecording(){let A=this.chatPanel()?.videoContainer;A&&(this.streamChatService.stopVideoChat(A),this.isVideoRecording=!1)}getAsyncFunctionsFromParts(A,e,i){for(let n of e)n.functionCall&&A.includes(n.functionCall.id)&&this.longRunningEvents.push({function:n.functionCall,invocationId:i})}openOAuthPopup(A){return new Promise((e,i)=>{if(!this.safeValuesService.windowOpen(window,A,"oauthPopup","width=600,height=700")){i("Popup blocked!");return}let o=r=>{if(r.origin!==window.location.origin)return;let{authResponseUrl:s}=r.data;s?(e(s),window.removeEventListener("message",o)):console.log("OAuth failed",r)};window.addEventListener("message",o)})}toggleSidePanel(){this.showSidePanel?this.sideDrawer()?.close():this.sideDrawer()?.open(),this.showSidePanel=!this.showSidePanel}handleTabChange(A){this.isChatMode()||(this.resetEditEvalCaseVars(),this.handleReturnToSession(!0))}handleReturnToSession(A){this.sessionTab?.getSession(this.sessionId),this.evalTab()?.resetEvalCase(),this.isChatMode.set(!0)}handleEvalNotInstalled(A){A&&this.openSnackBar(A,"OK")}resetEventsAndMessages(){this.eventData.clear(),this.messages.set([]),this.artifacts=[]}updateWithSelectedSession(A){!A||!A.id||!A.events||!A.state||(this.traceService.resetTraceService(),this.sessionId=A.id,this.currentSessionState=A.state,this.evalCase=null,this.isChatMode.set(!0),this.isSessionUrlEnabledObs.subscribe(e=>{e&&this.updateSelectedSessionUrl()}),this.resetEventsAndMessages(),A.events.forEach(e=>{e.content?.parts?.forEach(i=>{this.storeMessage(i,e,e.author==="user"?"user":"bot"),e.author&&e.author!=="user"&&this.storeEvents(i,e)})}),this.eventService.getTrace(this.sessionId).subscribe(e=>{this.traceData=e,this.traceService.setEventData(this.eventData),this.traceService.setMessages(this.messages())}),this.sessionService.canEdit(this.userId,A).subscribe(e=>{this.chatPanel()?.canEditSession.set(e)}),this.bottomPanelVisible=!1,this.changeDetectorRef.detectChanges())}updateWithSelectedEvalCase(A){this.evalCase=A,this.isChatMode.set(!1),this.resetEventsAndMessages();let e=0;for(let i of A.conversation){if(i.userContent?.parts)for(let n of i.userContent.parts)this.storeMessage(n,null,"user");if(i.intermediateData?.toolUses){let n=0;for(let o of i.intermediateData.toolUses){let r={functionCall:{name:o.name,args:o.args}};this.storeMessage(r,null,"bot",e,{toolUseIndex:n}),n++;let s={functionResponse:{name:o.name}};this.storeMessage(s,null,"bot")}}if(i.finalResponse?.parts){let n=0;for(let o of i.finalResponse.parts)this.storeMessage(o,null,"bot",e,{finalResponsePartIndex:n}),n++}e++}}updateSelectedEvalSetId(A){this.evalSetId=A}editEvalCaseMessage(A){this.isEvalCaseEditing.set(!0),this.userEditEvalCaseMessage=A.text,A.isEditing=!0,setTimeout(()=>{let e=this.chatPanel()?.textarea?.nativeElement;if(!e)return;e.focus();let i=e.value.length;A.text.charAt(i-1)===` +`&&i--,e.setSelectionRange(i,i)},0)}editFunctionArgs(A){this.isEvalCaseEditing.set(!0),this.dialog.open(s6,{maxWidth:"90vw",maxHeight:"90vh",data:{dialogHeader:"Edit function arguments",functionName:A.functionCall.name,jsonContent:A.functionCall.args}}).afterClosed().subscribe(i=>{this.isEvalCaseEditing.set(!1),i&&(this.hasEvalCaseChanged.set(!0),A.functionCall.args=i,this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[A.invocationIndex].intermediateData.toolUses[A.toolUseIndex].args=i)})}saveEvalCase(){this.evalService.updateEvalCase(this.appName,this.evalSetId,this.updatedEvalCase.evalId,this.updatedEvalCase).subscribe(A=>{this.openSnackBar("Eval case updated","OK"),this.resetEditEvalCaseVars()})}cancelEditEvalCase(){this.resetEditEvalCaseVars(),this.updateWithSelectedEvalCase(this.evalCase)}resetEditEvalCaseVars(){this.hasEvalCaseChanged.set(!1),this.isEvalCaseEditing.set(!1),this.isEvalEditMode.set(!1),this.updatedEvalCase=null}cancelEditMessage(A){A.isEditing=!1,this.isEvalCaseEditing.set(!1)}saveEditMessage(A){this.hasEvalCaseChanged.set(!0),this.isEvalCaseEditing.set(!1),A.isEditing=!1,A.text=this.userEditEvalCaseMessage?this.userEditEvalCaseMessage:" ",this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[A.invocationIndex].finalResponse.parts[A.finalResponsePartIndex]={text:this.userEditEvalCaseMessage},this.userEditEvalCaseMessage=""}handleKeydown(A,e){A.key==="Enter"&&!A.shiftKey?(A.preventDefault(),this.saveEditMessage(e)):A.key==="Escape"&&this.cancelEditMessage(e)}deleteEvalCaseMessage(A,e){this.hasEvalCaseChanged.set(!0),this.messages.update(i=>i.filter((n,o)=>o!==e)),this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[A.invocationIndex].finalResponse.parts.splice(A.finalResponsePartIndex,1)}editEvalCase(){this.isEvalEditMode.set(!0)}deleteEvalCase(){let A={title:"Confirm delete",message:`Are you sure you want to delete ${this.evalCase.evalId}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(l6,{width:"600px",data:A}).afterClosed().subscribe(i=>{i&&(this.evalTab()?.deleteEvalCase(this.evalCase.evalId),this.openSnackBar("Eval case deleted","OK"))})}onNewSessionClick(){this.createSession(),this.eventData.clear(),this.messages.set([]),this.artifacts=[],this.traceData=[],this.bottomPanelVisible=!1,this.evalTab()?.showEvalHistory&&this.evalTab()?.toggleEvalHistoryButton()}onFileSelect(A){let e=A.target;if(e.files)for(let i=0;i{A&&this.canvasComponent()?.loadFromYaml(A,this.appName)},error:A=>{console.error("Error loading agent configuration:",A),this._snackBar.open("Error loading agent configuration","OK")}})}exitBuilderMode(){let A=this.router.createUrlTree([],{queryParams:{mode:null},queryParamsHandling:"merge"}).toString();this.location.replaceState(A),this.isBuilderMode.set(!1),this.agentBuilderService.clear()}toggleBuilderAssistant(){this.showBuilderAssistant=!this.showBuilderAssistant}openAddItemDialog(){this.apps$.pipe(Pn(1)).subscribe(A=>{let e=this.dialog.open(JS,{width:"600px",data:{existingAppNames:A??[]}})})}saveAgentBuilder(){this.canvasComponent()?.saveAgent(this.appName)}selectEvent(A){this.selectedEvent=this.eventData.get(A),this.selectedEventIndex=this.getIndexOfKeyInMap(A);let e;this.isEventFilteringEnabled()&&this.selectedEvent.invocationId&&(this.selectedEvent.timestamp||this.selectedEvent.timestampInMillis)&&(e={invocationId:this.selectedEvent.invocationId,timestamp:this.selectedEvent.timestamp??this.selectedEvent.timestampInMillis});let i=ae({id:this.selectedEvent.id},e);this.uiStateService.setIsEventRequestResponseLoading(!0),this.eventService.getEventTrace(i).subscribe(n=>{n[this.llmRequestKey]&&(this.llmRequest=JSON.parse(n[this.llmRequestKey])),n[this.llmResponseKey]&&(this.llmResponse=JSON.parse(n[this.llmResponseKey])),this.uiStateService.setIsEventRequestResponseLoading(!1)},()=>{this.uiStateService.setIsEventRequestResponseLoading(!1)}),this.eventService.getEvent(this.userId,this.appName,this.sessionId,this.selectedEvent.id).subscribe(n=>Ci(this,null,function*(){if(!n.dotSrc){this.renderedEventGraph=void 0;return}let o=yield this.graphService.render(n.dotSrc);this.rawSvgString=o,this.renderedEventGraph=this.safeValuesService.bypassSecurityTrustHtml(o)}))}deleteSession(A){let e={title:"Confirm delete",message:`Are you sure you want to delete this session ${this.sessionId}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(l6,{width:"600px",data:e}).afterClosed().subscribe(n=>{n&&this.sessionService.deleteSession(this.userId,this.appName,A).subscribe(o=>{let r=this.sessionTab?.refreshSession(A);r?this.sessionTab?.getSession(r.id):window.location.reload()})})}syncSelectedAppFromUrl(){uc([this.router.events.pipe($A(A=>A instanceof ul),aA(()=>this.activatedRoute.snapshot.queryParams)),this.apps$]).subscribe(([A,e])=>{if(e&&e.length){let i=A.app;i&&e.includes(i)?(this.selectedAppControl.setValue(i),this.agentService.getAgentBuilder(i).subscribe(n=>{!n||n==""?(this.disableBuilderSwitch=!0,this.agentBuilderService.setLoadedAgentData(void 0)):(this.disableBuilderSwitch=!1,this.agentBuilderService.setLoadedAgentData(n))}),this.isBuilderMode.set(!1)):i&&this.openSnackBar(`Agent '${i}' not found`,"OK")}A.mode==="builder"&&this.enterBuilderMode()})}updateSelectedAppUrl(){this.selectedAppControl.valueChanges.pipe(Ha(),$A(Boolean)).subscribe(A=>{this.selectApp(A);let e=this.activatedRoute.snapshot.queryParams.app;A!==e&&this.router.navigate([],{queryParams:{app:A,mode:null},queryParamsHandling:"merge"})})}updateSelectedSessionUrl(){let A=this.router.createUrlTree([],{queryParams:{session:this.sessionId,userId:this.userId},queryParamsHandling:"merge"}).toString();this.location.replaceState(A)}handlePageEvent(A){if(A.pageIndex>=0){let e=this.getKeyAtIndexInMap(A.pageIndex);e&&this.selectEvent(e)}}closeSelectedEvent(){this.selectedEvent=void 0,this.selectedEventIndex=void 0}getIndexOfKeyInMap(A){let e=0,i=(o,r)=>0,n=Array.from(this.eventData.keys()).sort(i);for(let o of n){if(o===A)return e;e++}}getKeyAtIndexInMap(A){let e=(n,o)=>0,i=Array.from(this.eventData.keys()).sort(e);if(A>=0&&A{console.log(A),this.downloadService.downloadObjectAsJson(A,`session-${this.sessionId}.json`)})}updateState(){this.dialog.open(s6,{maxWidth:"90vw",maxHeight:"90vh",data:{dialogHeader:"Update state",jsonContent:this.currentSessionState}}).afterClosed().subscribe(e=>{e&&this.updatedSessionState.set(e)})}removeStateUpdate(){this.updatedSessionState.set(null)}closeTraceEventDetailPanel(){this.bottomPanelVisible=!1,this.traceService.selectedRow(void 0),this.traceService.setHoveredMessages(void 0,"")}importSession(){let A=document.createElement("input");A.type="file",A.accept="application/json",A.onchange=()=>{if(!A.files||A.files.length===0)return;let e=A.files[0],i=new FileReader;i.onload=n=>{if(n.target?.result)try{let o=JSON.parse(n.target.result);if(!o.userId||!o.appName||!o.events){this.openSnackBar("Invalid session file format","OK");return}this.sessionService.importSession(o.userId,o.appName,o.events).subscribe(r=>{this.openSnackBar("Session imported","OK"),this.sessionTab?.refreshSession()})}catch{this.openSnackBar("Error parsing session file","OK")}},i.readAsText(e)},A.click()}injectCustomIconColorStyle(A,e){if(this.document.getElementById(A))return;let i=this.renderer.createElement("style");this.renderer.setAttribute(i,"id",A),this.renderer.setAttribute(i,"type","text/css");let n=` + .${A} { + background-color: ${e} !important; + } + `;this.renderer.appendChild(i,this.renderer.createText(n)),this.renderer.appendChild(this.document.head,i)}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-chat"]],viewQuery:function(e,i){e&1&&(Kr(i.chatPanel,EE,5),Kr(i.canvasComponent,RQ,5),Kr(i.sideDrawer,HlA,5),Kr(i.sidePanel,dQ,5),Kr(i.evalTab,a0,5),Kr(i.bottomPanelRef,zlA,5)),e&2&&Aa(6)},features:[gt([{provide:dD,useClass:Yz},{provide:Jz,useValue:Oz}])],ngContentSelectors:jlA,decls:8,vars:3,consts:[["sideDrawer",""],["bottomPanel",""],["autosize","",1,"drawer-container"],[1,"material-symbols-outlined",2,"position","absolute","width","24px","height","24px","color","#c4c7c5","cursor","pointer","margin-left","20px","margin-top","20px","z-index","9999",3,"matTooltip"],["mode","side","appResizableDrawer","",1,"side-drawer"],[3,"isApplicationSelectorEnabledObs","apps$","isLoadingApps","selectedAppControl","showSidePanel","appName","userId","sessionId","traceData","eventData","currentSessionState","artifacts","selectedEvent","selectedEventIndex","renderedEventGraph","rawSvgString","llmRequest","llmResponse","disableBuilderIcon"],[1,"builder-mode-container"],[1,"chat-container"],[1,"material-symbols-outlined",2,"position","absolute","width","24px","height","24px","color","#c4c7c5","cursor","pointer","margin-left","20px","margin-top","20px","z-index","9999",3,"click","matTooltip"],[3,"closePanel","tabChange","eventSelected","sessionSelected","sessionReloaded","evalCaseSelected","evalSetIdSelected","returnToSession","evalNotInstalled","page","closeSelectedEvent","openImageDialog","appSelectionChange","openAddItemDialog","enterBuilderMode","isApplicationSelectorEnabledObs","apps$","isLoadingApps","selectedAppControl","showSidePanel","appName","userId","sessionId","traceData","eventData","currentSessionState","artifacts","selectedEvent","selectedEventIndex","renderedEventGraph","rawSvgString","llmRequest","llmResponse","disableBuilderIcon"],[3,"exitBuilderMode","closePanel","appNameInput"],[1,"resize-handler"],[1,"builder-exit-button"],["mat-icon-button","","matTooltip","Accept",1,"builder-mode-action-button",3,"click"],["mat-icon-button","","matTooltip","Exit Builder Mode",1,"builder-mode-action-button",3,"click"],["mat-icon-button","","matTooltip","Builder Assistant",1,"builder-mode-action-button",3,"click"],[3,"toggleSidePanelRequest","builderAssistantCloseRequest","showSidePanel","showBuilderAssistant","appNameInput"],[1,"chat-toolbar",3,"ngClass"],[1,"chat-card"],["mat-fab","","color","primary",1,"fab-button"],[3,"appName","messages","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","userEditEvalCaseMessage","selectedFiles","updatedSessionState","eventData","isAudioRecording","isVideoRecording","hoveredEventMessageIndices"],["appResizableBottomPanel","",1,"trace-detail-container"],[1,"material-symbols-outlined",2,"width","24px","height","24px","color","#c4c7c5","cursor","pointer","margin-left","20px","margin-top","-2px","z-index","9999",3,"matTooltip"],[1,"material-symbols-outlined",2,"width","24px","height","24px","color","#c4c7c5","cursor","pointer","margin-left","20px","margin-top","-2px","z-index","9999",3,"click","matTooltip"],[2,"display","flex"],[1,"toolbar-session-text"],[1,"toolbar-session-id"],[1,"toolbar-actions"],["mat-button","",2,"height","30px",3,"click"],["mat-flat-button","",2,"height","30px",3,"click","disabled"],[1,"material-symbols-outlined","toolbar-icon",3,"click","matTooltip"],[1,"toolbar-session-text",2,"margin-left","16px"],[1,"toolbar-sse-toggle"],[1,"example-margin",3,"change","checked","disabled"],[2,"margin-left","8px","margin-right","8px","height","22px",3,"vertical"],[2,"display","flex","align-items","center"],["id","toolbar-new-session-button",3,"click","matTooltip"],["id","toolbar-delete-session-button",1,"material-symbols-outlined","toolbar-icon",3,"matTooltip"],["id","toolbar-export-session-button",1,"material-symbols-outlined","toolbar-icon",3,"matTooltip"],["id","toolbar-import-session-button",1,"material-symbols-outlined","toolbar-icon",3,"matTooltip"],["id","toolbar-delete-session-button",1,"material-symbols-outlined","toolbar-icon",3,"click","matTooltip"],["id","toolbar-export-session-button",1,"material-symbols-outlined","toolbar-icon",3,"click","matTooltip"],["id","toolbar-import-session-button",1,"material-symbols-outlined","toolbar-icon",3,"click","matTooltip"],[1,"empty-state-container"],[1,"warning"],[1,"error"],["mat-fab","","color","primary",1,"fab-button",3,"click"],[3,"userInputChange","userEditEvalCaseMessageChange","clickEvent","handleKeydown","cancelEditMessage","saveEditMessage","openViewImageDialog","openBase64InNewTab","editEvalCaseMessage","deleteEvalCaseMessage","editFunctionArgs","fileSelect","removeFile","removeStateUpdate","sendMessage","updateState","toggleAudioRecording","toggleVideoRecording","appName","messages","isChatMode","evalCase","isEvalEditMode","isEvalCaseEditing","isEditFunctionArgsEnabled","userInput","userEditEvalCaseMessage","selectedFiles","updatedSessionState","eventData","isAudioRecording","isVideoRecording","hoveredEventMessageIndices"],[1,"bottom-resize-handler"],[3,"panelClosed","userId","appName","sessionId"]],template:function(e,i){e&1&&(Kt(PlA),m(0,"mat-drawer-container",2),ne(1,WlA,2,1,"span",3),m(2,"mat-drawer",4,0),ne(4,ZlA,1,19,"app-side-panel",5)(5,XlA,2,1),p(),ne(6,$lA,12,5,"div",6)(7,pgA,8,5,"div",7),p()),e&2&&(y(),$(!i.showSidePanel&&i.appName===""?1:-1),y(3),$(i.isBuilderMode()?5:4),y(2),$(i.isBuilderMode()?6:7))},dependencies:[LF,Ma,NF,mD,Kn,RB,ir,nd,ta,Un,FF,aD,sE,CX,QD,h9,ts,EE,dQ,RQ,YS],styles:[".expand-side-drawer[_ngcontent-%COMP%]{position:relative;top:4%;left:1%}.drawer-container[_ngcontent-%COMP%]{height:100%;background-color:var(--chat-drawer-container-background-color)}.drawer-header[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:space-between;align-items:center}.drawer-header[_ngcontent-%COMP%]{--mdc-filled-button-container-color: #89b4f8}.drawer-header[_ngcontent-%COMP%]{--mdc-filled-button-label-text-color: black}.drawer-header[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{width:36px;height:36px;color:#bdc1c6;cursor:pointer;display:flex;align-items:center;justify-content:center}.drawer-header[_ngcontent-%COMP%] .drawer-logo[_ngcontent-%COMP%]{margin-left:9px;display:flex;align-items:center;font-size:16px;font-style:normal;font-weight:500;line-height:24px;letter-spacing:.1px}.drawer-header[_ngcontent-%COMP%] .drawer-logo[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{margin-right:9px}.chat-container[_ngcontent-%COMP%]{width:100%;height:100%;max-width:100%;margin:auto;display:flex;flex-direction:column;flex:1}.event-container[_ngcontent-%COMP%]{color:var(--chat-event-container-color)}.chat-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;overflow:hidden;flex:1;min-height:12%;box-shadow:none;background-color:var(--chat-card-background-color)}.function-event-button[_ngcontent-%COMP%] .mdc-button__label[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace}.loading-bar[_ngcontent-%COMP%]{width:100px;margin:15px}.chat-messages[_ngcontent-%COMP%]{flex-grow:1;overflow-y:auto;padding:20px;margin-top:16px}.message-card[_ngcontent-%COMP%]{padding:5px 20px;margin:5px;border-radius:20px;max-width:80%;font-size:14px;font-weight:400;position:relative;display:inline-block}.function-event-button[_ngcontent-%COMP%]{background-color:var(--chat-function-event-button-background-color);margin:5px 5px 10px}.function-event-button-highlight[_ngcontent-%COMP%]{background-color:var(--chat-function-event-button-highlight-background-color);border-color:var(--chat-function-event-button-highlight-border-color)!important;color:var(--chat-function-event-button-highlight-color)!important}.user-message[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center}.user-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{background-color:var(--chat-user-message-message-card-background-color);align-self:flex-end;color:var(--chat-user-message-message-card-color);box-shadow:none}.bot-message[_ngcontent-%COMP%]{display:flex;align-items:center}.bot-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{background-color:var(--chat-bot-message-message-card-background-color);align-self:flex-start;color:var(--chat-bot-message-message-card-color);box-shadow:none}.bot-message[_ngcontent-%COMP%]:focus-within .message-card[_ngcontent-%COMP%]{background-color:var(--chat-bot-message-focus-within-message-card-background-color);border:1px solid var(--chat-bot-message-focus-within-message-card-border-color)}.message-textarea[_ngcontent-%COMP%]{background-color:var(--chat-message-textarea-background-color);max-width:100%;border:none;font-family:Google Sans,Helvetica Neue,sans-serif}.message-textarea[_ngcontent-%COMP%]:focus{background-color:var(--chat-message-textarea-focus-background-color);outline:none}.edit-message-buttons-container[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}.message-card[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%]{visibility:hidden;position:absolute;left:10px;z-index:10;background-color:var(--chat-eval-compare-container-background-color);overflow:hidden;border-radius:20px;padding:5px 20px;margin-bottom:10px;font-size:16px}.message-card[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .actual-result[_ngcontent-%COMP%]{border-right:2px solid var(--chat-actual-result-border-right-color);padding-right:8px;min-width:350px;max-width:350px}.message-card[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .expected-result[_ngcontent-%COMP%]{padding-left:12px;min-width:350px;max-width:350px}.message-card[_ngcontent-%COMP%]:hover .eval-compare-container[_ngcontent-%COMP%]{visibility:visible}.actual-expected-compare-container[_ngcontent-%COMP%]{display:flex}.score-threshold-container[_ngcontent-%COMP%]{display:flex;justify-content:center;gap:10px;align-items:center;margin-top:15px;font-size:14px;font-weight:600}.eval-response-header[_ngcontent-%COMP%]{padding-bottom:5px;border-bottom:2px solid var(--chat-eval-response-header-border-bottom-color);font-style:italic;font-weight:700}.header-expected[_ngcontent-%COMP%]{color:var(--chat-header-expected-color)}.header-actual[_ngcontent-%COMP%]{color:var(--chat-header-actual-color)}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:var(--chat-eval-pass-color)}.eval-fail[_ngcontent-%COMP%]{display:flex;color:var(--chat-eval-fail-color)}.navigation-button-sidepanel[_ngcontent-%COMP%]{margin-left:auto;margin-right:20px}.fab-button[_ngcontent-%COMP%]{position:fixed;bottom:200px;right:100px;z-index:1000}.sidepanel-toggle[_ngcontent-%COMP%]{position:relative;top:100px;z-index:1000}.side-drawer[_ngcontent-%COMP%]{background-color:var(--chat-side-drawer-background-color);color:var(--chat-side-drawer-color);border-radius:0}.file-preview[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px;margin-bottom:8px}.file-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:5px;background:var(--chat-file-item-background-color);padding:5px;border-radius:4px}button[_ngcontent-%COMP%]{margin-left:20px;margin-right:20px}.empty-state-container[_ngcontent-%COMP%]{color:var(--chat-empty-state-container-color);height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Google Sans,sans-serif;font-weight:400;letter-spacing:normal;line-height:24px;font-size:18px}.empty-state-container[_ngcontent-%COMP%] pre.warning[_ngcontent-%COMP%]{color:var(--chat-warning-color)}.empty-state-container[_ngcontent-%COMP%] pre.error[_ngcontent-%COMP%]{color:var(--chat-error-color)}[_nghost-%COMP%] .mat-mdc-unelevated-button:not(:disabled){color:var(--chat-mat-mdc-unelevated-button-color);background-color:var(--chat-mat-mdc-unelevated-button-background-color)}[_nghost-%COMP%] .mdc-linear-progress__buffer-dots{background:var(--chat-mdc-linear-progress-buffer-dots-background-color)}[_nghost-%COMP%] .mat-mdc-select-arrow-wrapper{margin-left:4px}[_nghost-%COMP%] .mat-mdc-text-field-wrapper{border:1px solid var(--chat-mat-mdc-text-field-wrapper-border-color)}[_nghost-%COMP%] .mdc-notched-outline__leading, [_nghost-%COMP%] .mdc-notched-outline__notch, [_nghost-%COMP%] .mdc-notched-outline__trailing{border:none}[_nghost-%COMP%] .mat-mdc-form-field-icon-suffix{padding:0 10px 0 40px}[_nghost-%COMP%] .segment-key{color:var(--chat-segment-key-color)!important}.mat-mdc-select-placeholder[_ngcontent-%COMP%]{margin-left:20px}.bottom-resize-handler[_ngcontent-%COMP%]{background:var(--chat-bottom-resize-handler-background-color);height:5px;border-radius:4px;position:absolute;display:block;width:20%;left:40%;top:0;right:0;z-index:9999;cursor:ns-resize}.trace-detail-container[_ngcontent-%COMP%]{position:relative;background-color:var(--chat-trace-detail-container-background-color)}.trace-detail-container[_ngcontent-%COMP%] app-trace-event[_ngcontent-%COMP%]{padding-top:8px}.new-session-button[_ngcontent-%COMP%]{margin-top:0;margin-left:50px;width:130px;height:28px;font-size:14px}.app-select-container[_ngcontent-%COMP%]{width:35%;background-color:#212123;height:30px;display:flex;justify-content:space-between;padding-left:20px;padding-right:20px;border-radius:10px;padding-top:5px}.app-select-container[_ngcontent-%COMP%]{--mat-select-placeholder-text-color: #8ab4f8}.app-select-container[_ngcontent-%COMP%]{--mat-select-enabled-trigger-text-color: #8ab4f8}.app-select-container[_ngcontent-%COMP%]{--mat-select-enabled-arrow-color: #8ab4f8}.adk-checkbox[_ngcontent-%COMP%]{position:fixed;bottom:0;left:0;right:0;margin-bottom:20px;margin-left:20px}.chat-toolbar[_ngcontent-%COMP%]{position:sticky;top:0;height:48px;background:var(--chat-toolbar-background-color);display:flex;align-items:center;z-index:10}.chat-toolbar.edit-mode[_ngcontent-%COMP%]{background:var(--chat-toolbar-edit-mode-background-color)}.toolbar-actions[_ngcontent-%COMP%]{margin-left:auto;display:flex;align-items:center}.toolbar-session-text[_ngcontent-%COMP%]{color:var(--chat-toolbar-session-text-color);font-family:Roboto;font-size:12px;font-style:normal;font-weight:500;line-height:12px;letter-spacing:.8px;text-transform:uppercase;margin-left:20px;padding-top:4px}.toolbar-session-id[_ngcontent-%COMP%]{color:var(--chat-toolbar-session-id-color);font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:400;line-height:20px;letter-spacing:.25px;margin-left:5px}.toolbar-icon[_ngcontent-%COMP%]{width:24px;height:24px;color:var(--chat-toolbar-icon-color);cursor:pointer;margin-right:16px}#toolbar-new-session-button[_ngcontent-%COMP%]{font-size:14px;margin-right:16px;color:var(--chat-toolbar-new-session-color);cursor:pointer;display:flex;align-items:center}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mat-switch-label-text-size: 14px}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mat-switch-label-text-color: var(--chat-toolbar-sse-toggle-label-text-color)}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mdc-switch-selected-track-color: var(--chat-toolbar-sse-toggle-selected-track-color)}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mdc-switch-selected-focus-track-color: var(--chat-toolbar-sse-toggle-selected-track-color)}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mdc-switch-selected-hover-track-color: var(--chat-toolbar-sse-toggle-selected-track-color)}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mdc-switch-selected-handle-color: var(--chat-toolbar-sse-toggle-selected-handle-color)}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mdc-switch-selected-focus-handle-color: var(--chat-toolbar-sse-toggle-selected-handle-color)}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mdc-switch-selected-hover-handle-color: var(--chat-toolbar-sse-toggle-selected-handle-color)}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mdc-switch-track-height: 24px}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mdc-switch-track-width: 46px}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mat-switch-track-outline-color: var(--chat-toolbar-sse-toggle-track-outline-color)}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mat-switch-with-icon-handle-size: 20px}[_nghost-%COMP%] pre{white-space:pre-wrap;word-break:break-word;overflow-x:auto;max-width:100%} .mat-drawer-content{display:flex!important} .mat-drawer{border-right:1px solid var(--chat-mat-drawer-border-right-color)!important}.builder-mode-container[_ngcontent-%COMP%]{position:relative;width:100%;height:100vh;display:flex;flex-direction:column;background-color:#131314}.builder-exit-button[_ngcontent-%COMP%]{position:absolute;top:20px;right:20px;z-index:1000}.builder-mode-action-button[_ngcontent-%COMP%]{background-color:#000000b3;color:#c4c7c5;border-radius:50%;transition:all .2s ease;margin-right:0!important}.builder-mode-action-button[_ngcontent-%COMP%]:hover{background-color:#ea4335cc;color:#fff}.builder-mode-action-button.active[_ngcontent-%COMP%]{background-color:#8ab4f8cc;color:#fff}.builder-mode-action-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px}app-canvas[_ngcontent-%COMP%]{width:100%!important;height:100%!important;flex:1!important;display:flex!important;flex-direction:column!important;min-height:0!important}.build-mode-container[_ngcontent-%COMP%]{display:flex;width:100%;height:100%;background-color:#131314}.build-left-panel[_ngcontent-%COMP%], .build-right-panel[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;background-color:#1b1b1b;border:1px solid #444746;margin:10px;border-radius:8px}.build-panel-header[_ngcontent-%COMP%]{background-color:#2d2d2d;padding:16px 20px;border-bottom:1px solid #444746;border-radius:8px 8px 0 0}.build-panel-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{margin:0;color:#e8eaed;font-size:16px;font-weight:500;font-family:Google Sans,Helvetica Neue,sans-serif}.build-panel-content[_ngcontent-%COMP%]{flex:1;padding:20px;color:#9aa0a6;overflow-y:auto}.build-panel-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin:0;font-size:14px;line-height:1.5}.app-name-option[_ngcontent-%COMP%], .app-select[_ngcontent-%COMP%]{color:#9aa0a6;font-family:Google Sans Mono,monospace;font-style:normal;font-weight:400;padding-left:unset}"]})};var NQ=class t{static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-root"]],decls:1,vars:0,template:function(e,i){e&1&&ve(0,"app-chat")},dependencies:[HS],encapsulation:2})};var DgA=[{path:"",component:NQ}],zS=class t{static \u0275fac=function(e){return new(e||t)};static \u0275mod=OA({type:t});static \u0275inj=TA({imports:[$y.forRoot(DgA),$y]})};var PS=class{static getRuntimeConfig(){return window.runtimeConfig}};function vgA(t,A){if(t&1&&(m(0,"a",0),ve(1,"img",1),T(2),p()),t&2){M();let e=s2(0),i=s2(1);y(),M1("src",e,$r),y(),FA(" ",i," ")}}function bgA(t,A){t&1&&(m(0,"div"),T(1," Invalid custom logo config. Make sure that your runtime config specifies both imgUrl and text in the logo field. "),p())}var jS=class t{logoConfig=PS.getRuntimeConfig().logo;static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-custom-logo"]],decls:4,vars:3,consts:[["href","/"],["width","32px","height","32px",1,"orcas-logo",3,"src"]],template:function(e,i){if(e&1&&(Wa(0)(1),ne(2,vgA,3,2,"a",0)(3,bgA,2,0,"div")),e&2){let n=S1(i.logoConfig==null?null:i.logoConfig.imageUrl);y();let o=S1(i.logoConfig==null?null:i.logoConfig.text);y(),$(n&&o?2:3)}},styles:[`a[_ngcontent-%COMP%]{color:inherit;text-decoration:none;display:flex;align-items:center;gap:8px} + + + + + + + + + + + + + + + + +`]})};var MgA=(t,A)=>({"font-style":t,color:A}),VS=class t{text=lt("");thought=lt(!1);static \u0275fac=function(e){return new(e||t)};static \u0275cmp=xe({type:t,selectors:[["app-markdown"]],inputs:{text:[1,"text"],thought:[1,"thought"]},features:[gt([Cm()])],decls:1,vars:5,consts:[[3,"data","ngStyle"]],template:function(e,i){e&1&&ve(0,"markdown",0),e&2&&te("data",i.text())("ngStyle",tl(2,MgA,i.thought()?"italic":"normal",i.thought()?"#9aa0a6":"white"))},dependencies:[Ur,OR,tee,wy],encapsulation:2})};var qS=class t{constructor(A){this.http=A}apiServerDomain=oa.getApiServerBaseUrl();getLatestArtifact(A,e,i,n){let o=this.apiServerDomain+`/apps/${e}/users/${A}/sessions/${i}/artifacts/${n}`;return this.http.get(o)}getArtifactVersion(A,e,i,n,o){let r=this.apiServerDomain+`/apps/${e}/users/${A}/sessions/${i}/artifacts/${n}/versions/${o}`;return this.http.get(r)}static \u0275fac=function(e){return new(e||t)(UA(wa))};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})};var WS=class t{audioContext=new AudioContext({sampleRate:22e3});lastAudioTime=0;playAudio(A){let e=this.combineAudioBuffer(A);e&&this.playPCM(e)}combineAudioBuffer(A){if(A.length===0)return;let e=A.reduce((o,r)=>o+r.length,0),i=new Uint8Array(e),n=0;for(let o of A)i.set(o,n),n+=o.length;return i}playPCM(A){let e=new Float32Array(A.length/2);for(let s=0;s=32768&&(a-=65536),e[s]=a/32768}let i=this.audioContext.createBuffer(1,e.length,22e3);i.copyToChannel(e,0);let n=this.audioContext.createBufferSource();n.buffer=i,n.connect(this.audioContext.destination);let o=this.audioContext.currentTime,r=Math.max(this.lastAudioTime,o);n.start(r),this.lastAudioTime=r+i.duration}static \u0275fac=function(e){return new(e||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})};var ZS=new re("AudioRecordingService"),XS=new re("AudioWorkletModulePath");var $S=class t{audioWorkletModulePath=E(XS);stream;audioContext;source;audioBuffer=[];startRecording(){return Ci(this,null,function*(){try{this.stream=yield navigator.mediaDevices.getUserMedia({audio:!0}),this.audioContext=new AudioContext,yield this.audioContext.audioWorklet.addModule(this.audioWorkletModulePath),this.source=this.audioContext.createMediaStreamSource(this.stream);let A=new AudioWorkletNode(this.audioContext,"audio-processor");A.port.onmessage=e=>{let i=e.data,n=this.float32ToPCM(i);this.audioBuffer.push(n)},this.source.connect(A),A.connect(this.audioContext.destination)}catch(A){console.error("Error accessing microphone:",A)}})}stopRecording(){this.source&&this.source.disconnect(),this.audioContext&&this.audioContext.close(),this.stream&&this.stream.getTracks().forEach(A=>A.stop())}getCombinedAudioBuffer(){if(this.audioBuffer.length===0)return;let A=this.audioBuffer.reduce((n,o)=>n+o.length,0),e=new Uint8Array(A),i=0;for(let n of this.audioBuffer)e.set(n,i),i+=n.length;return e}cleanAudioBuffer(){this.audioBuffer=[]}float32ToPCM(A){let e=new ArrayBuffer(A.length*2),i=new DataView(e);for(let n=0;nA[GAe]==="true"))}isEditFunctionArgsEnabled(){return this.route.queryParams.pipe(aA(A=>A[KAe]==="true"))}isSessionUrlEnabled(){return dA(!0)}isA2ACardEnabled(){return this.route.queryParams.pipe(aA(A=>A[UAe]==="true"))}isApplicationSelectorEnabled(){return dA(!0)}isAlwaysOnSidePanelEnabled(){return dA(!1)}isTraceEnabled(){return dA(!0)}isArtifactsTabEnabled(){return dA(!0)}isEvalEnabled(){return dA(!0)}isTokenStreamingEnabled(){return dA(!0)}isMessageFileUploadEnabled(){return dA(!0)}isManualStateUpdateEnabled(){return dA(!0)}isBidiStreamingEnabled(){return dA(!0)}isExportSessionEnabled(){return dA(!0)}isEventFilteringEnabled(){return dA(!1)}isDeleteSessionEnabled(){return dA(!0)}isLoadingAnimationsEnabled(){return dA(!0)}isSessionsTabReorderingEnabled(){return dA(!1)}static \u0275fac=function(e){return new(e||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})};var SgA=(()=>{var t=import.meta.url;return function(A={}){var e,i=A,n,o,r=new Promise((Q,D)=>{n=Q,o=D});i.agerrMessages=[],i.stderrMessages=[],u=Q=>i.stderrMessages.push(Q);var s=Object.assign({},i),a="./this.program",c=(Q,D)=>{throw D},l="",d,C;typeof document<"u"&&document.currentScript&&(l=document.currentScript.src),t&&(l=t),l.startsWith("blob:")?l="":l=l.substr(0,l.replace(/[?#].*/,"").lastIndexOf("/")+1),d=Q=>fetch(Q,{credentials:"same-origin"}).then(D=>D.ok?D.arrayBuffer():Promise.reject(new Error(D.status+" : "+D.url)));var I=console.log.bind(console),u=console.error.bind(console);Object.assign(i,s),s=null;var h;function B(Q){for(var D=atob(Q),R=new Uint8Array(D.length),v=0;vQ.startsWith(PA);function Ye(){var Q="data:application/octet-stream;base64,AGFzbQEAAAABmQd0YAJ/fwF/YAF/AGABfwF/YAJ/fwBgA39/fwF/YAN/f38AYAR/f39/AX9gBH9/f38AYAV/f39/fwF/YAZ/f39/f38Bf2AFf39/f38AYAZ/f39/f38AYAAAYAABf2AIf39/f39/f38Bf2AHf39/f39/fwF/YAF8AXxgAn9/AXxgAX8BfGAHf39/f39/fwBgA39/fwF8YAd/f39/fHx/AGACf3wAYAR8fHx/AXxgAnx8AXxgA398fABgCX9/f39/f39/fwBgBX9+fn5+AGAEf39/fABgCn9/f39/f39/f38Bf2ADf35/AX5gBH9/fHwBf2ADfHx8AXxgA39/fgBgAAF8YAR/f39/AXxgAn9/AX5gA39/fABgBX9/f39+AX9gA39/fgF/YAR/fn5/AGAEf398fwBgAn9+AGACfH8BfGABfwF+YAR/f398AX9gAn9+AX9gAn98AX9gA3x8fwF8YAN/fH8AYAh/f39/f39/fwBgBX9/f398AX9gC39/f39/f39/f39/AX9gBX9/fn9/AGAEf398fwF/YAABfmAFf39/f3wAYAN/f3wBf2ACfX0BfWAGf3x8fHx8AXxgA39/fwF+YAx/f39/f39/f39/f38Bf2AFf398f38Bf2AHf39/fHx/fwBgBn9/f3x/fwBgBn9/f39+fwF/YA9/f39/f39/f39/f39/f38AYAp/f39/f39/f39/AGAEf39/fwF+YAZ/fH9/f38Bf2AHf39/f39+fgF/YAZ/f39/fn4Bf2AHf39/f35/fwF/YAZ/f39/f34Bf2ACfn8AYAR/fn9/AX9gBH9/fHwBfGAFf398f38AYAl/f39/f39/f38Bf2AGf39/fH9/AX9gBH9/fHwAYAR+fn5+AX9gAn99AX9gAn5/AX9gCH9/f398fHx/AGADf31/AGABfAF/YAJ+fgF9YAJ/fQBgBH9/f34BfmADf35/AX9gBn99f39/fwBgBH9/fX8AYAN/fHwBf2AFf39/fH8AYAZ/f398fH8AYAZ8fHx/f38AYAJ+fgF8YAJ8fwF/YAR/fHx8AGAGf39/f398AGAEf3x/fwBgBnx8f3x8fwBgB398fHx8fHwAYAF/AX1gA39/fwF9YAN+fn4Bf2AEf35+fgBgBH98f38Bf2AKf3x/f39/f39/fwBgBX9/fHx8AGAFf39/f38BfGAD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uPwIKAIAQYT0AyACEB4aECgACyACIAAgAWw2AhBBuPwIKAIAQdPzAyACQRBqEB4aECgACxcAQQFBfyAAIAEgARA8IgAQqwIgAEYbCyUBAX8gACgCLCIAQQBBgAEgACgCABEEACIABH8gACgCEAVBAAsLNAEBfwJAIAAgARDnASIBRQ0AIAAoAiwiACABQQggACgCABEEACIARQ0AIAAoAhAhAgsgAgtuAQF/IwBBIGsiAyQAIANCADcDGCADQgA3AxAgAyACNgIMAkAgA0EQaiABIAIQwwsiAUEASARAIANB4I8LKAIAEHg2AgBBsokEIAMQNgwBCyAAIANBEGoiABCqBSABEKsCGiAAEF8LIANBIGokAAskAQF/IwBBEGsiAyQAIAMgAjYCDCAAIAEgAhCDDCADQRBqJAALMwEBfyACBEAgACEDA0AgAyABLQAAOgAAIANBAWohAyABQQFqIQEgAkEBayICDQALCyAAC6QBAQN/IwBBEGsiAiQAAkAgABAvIgMgACgCAEEDcSAAKQMIEJ0KIgEEfyABKAIYBUEACyIBDQAgAygCTCIBKAIAKAIMIgMEQCABKAIIIAAoAgBBA3EgACkDCCADEScAIgENAQtBACEBIAAoAgBBA3FBAkYNACACIAApAwg3AwggAkElNgIAQaDkCiEBQaDkCkEgQagYIAIQoQEaCyACQRBqJAAgAQsPACAAIAEgAiADQQAQ0QwLQwAgACAAIAGlIAG9Qv///////////wCDQoCAgICAgID4/wBWGyABIAC9Qv///////////wCDQoCAgICAgID4/wBYGwsVACAAEKgBBEAgACgCBA8LIAAQqQMLFAAgABAnBEAgAC0ADw8LIAAoAgQLVQACQCABBEAgAiABKAIITw0BIAAgASgCACABKAIEIAJqIAEoAgxwQcgAbGpByAAQHxoPC0GJ2gFB4oMBQT1BhyUQAAALQcK8A0HigwFBPUGHJRAAAAsmACAAIAEQ1QciAUUEQEEADwsgABDwASgCDCABKAIQQQJ0aigCAAsuACAALQAPIgBBAWpB/wFxQRFPBEBB38UDQcmEAUHJAEH+ngEQAAALIABB/wFHCwcAQQEQBwALFQAgACABQZEqQT1B4oMBQcgAEMgKC0MAIAAgACABpCABvUL///////////8Ag0KAgICAgICA+P8AVhsgASAAvUL///////////8Ag0KAgICAgICA+P8AWBsLCwAgACABQQAQhQcLPAEBf0EHIQICQAJAAkAgAEEoag4IAgICAgAAAAABC0EIDwsgAEF/RyABQX1NckUEQEEADwtBHSECCyACC0IBAX8gACABEOcBIgFFBEBBAA8LIAAoAjQgASgCIBDoASAAKAI0IgJBAEGAASACKAIAEQQAIAEgACgCNBDeAjYCIAtvAQJ/IAAtAAAiAgR/AkADQCABLQAAIgNFDQECQCACIANGDQAgAhCAAiABLQAAEIACRg0AIAAtAAAhAgwCCyABQQFqIQEgAC0AASECIABBAWohACACDQALQQAhAgsgAgVBAAsQgAIgAS0AABCAAmsLLAACQAJAAkAgACgCAEEDcUEBaw4DAQAAAgsgACgCKCEACyAAKAIYIQALIAALVQECfyAAIAFBMEEAIAEoAgBBA3FBA0cbaigCKBDnASIDBEAgACgCNCADKAIgEOgBIAAoAjQiAiABQQggAigCABEEACECIAMgACgCNBDeAjYCIAsgAgukAQMBfAF+AX8gAL0iAkI0iKdB/w9xIgNBsghNBHwgA0H9B00EQCAARAAAAAAAAAAAog8LAnwgAJkiAEQAAAAAAAAwQ6BEAAAAAAAAMMOgIAChIgFEAAAAAAAA4D9kBEAgACABoEQAAAAAAADwv6AMAQsgACABoCIAIAFEAAAAAAAA4L9lRQ0AGiAARAAAAAAAAPA/oAsiAJogACACQgBTGwUgAAsLKgEBfyMAQRBrIgMkACADIAI2AgwgACABIAJBgQRBABC2BxogA0EQaiQACykBAX8gAgRAIAAhAwNAIAMgAToAACADQQFqIQMgAkEBayICDQALCyAACxwBAX8gABCoAQRAIAAoAgAgABD4AhoQrwULIAALxwEBA38jAEEQayIFJAAgABAvIQYCQAJAIAAgAUEAEG0iBCACRXINACACQQEQRyIERQ0BIAQgBiABELIBNgIAAkAgACgCECICRQRAIAQgBDYCBAwBCyACIAIoAgQiBkYEQCACIAQ2AgQgBCACNgIEDAELIAQgBjYCBCACIAQ2AgQLIAAtAABBBHENACAAIARBABDzBwsgAwRAIAAgAUEBEG0aCyAFQRBqJAAgBA8LIAUgAjYCAEG4/AgoAgBB0/MDIAUQHhoQKAALCwAgACABQQEQhQcLOQAgAEUEQEEADwsCQAJAAkAgACgCAEEDcUEBaw4DAQAAAgsgACgCKCgCGA8LIAAoAhgPCyAAKAJICykAIAAoAjAQvgNBAEgEQEGx1AFBrsUBQZ0BQdI2EAAACyAAKAIwEL4DC2ABAn8CQCAAKAI8IgNFDQAgAygCbCIERQ0AIAAoAhAoApgBRQ0AIAAtAJkBQSBxBEAgACABIAIgBBEFAA8LIAAgACABIAJBEBAZIAIQmQIiACACIAMoAmwRBQAgABAYCwuLCAELfyAARQRAIAEQSA8LIAFBQE8EQEHgjwtBMDYCAEEADwsCf0EQIAFBC2pBeHEgAUELSRshBiAAQQhrIgQoAgQiCUF4cSEIAkAgCUEDcUUEQCAGQYACSQ0BIAZBBGogCE0EQCAEIQIgCCAGa0GQqAsoAgBBAXRNDQILQQAMAgsgBCAIaiEHAkAgBiAITQRAIAggBmsiA0EQSQ0BIAQgBiAJQQFxckECcjYCBCAEIAZqIgIgA0EDcjYCBCAHIAcoAgRBAXI2AgQgAiADELsFDAELQcikCygCACAHRgRAQbykCygCACAIaiIIIAZNDQIgBCAGIAlBAXFyQQJyNgIEIAQgBmoiAyAIIAZrIgJBAXI2AgRBvKQLIAI2AgBByKQLIAM2AgAMAQtBxKQLKAIAIAdGBEBBuKQLKAIAIAhqIgMgBkkNAgJAIAMgBmsiAkEQTwRAIAQgBiAJQQFxckECcjYCBCAEIAZqIgggAkEBcjYCBCADIARqIgMgAjYCACADIAMoAgRBfnE2AgQMAQsgBCAJQQFxIANyQQJyNgIEIAMgBGoiAiACKAIEQQFyNgIEQQAhAkEAIQgLQcSkCyAINgIAQbikCyACNgIADAELIAcoAgQiA0ECcQ0BIANBeHEgCGoiCyAGSQ0BIAsgBmshDCAHKAIMIQUCQCADQf8BTQRAIAcoAggiAiAFRgRAQbCkC0GwpAsoAgBBfiADQQN2d3E2AgAMAgsgAiAFNgIMIAUgAjYCCAwBCyAHKAIYIQoCQCAFIAdHBEAgBygCCCICIAU2AgwgBSACNgIIDAELAkAgBygCFCICBH8gB0EUagUgBygCECICRQ0BIAdBEGoLIQgDQCAIIQMgAiIFQRRqIQggAigCFCICDQAgBUEQaiEIIAUoAhAiAg0ACyADQQA2AgAMAQtBACEFCyAKRQ0AAkAgBygCHCIDQQJ0QeCmC2oiAigCACAHRgRAIAIgBTYCACAFDQFBtKQLQbSkCygCAEF+IAN3cTYCAAwCCwJAIAcgCigCEEYEQCAKIAU2AhAMAQsgCiAFNgIUCyAFRQ0BCyAFIAo2AhggBygCECICBEAgBSACNgIQIAIgBTYCGAsgBygCFCICRQ0AIAUgAjYCFCACIAU2AhgLIAxBD00EQCAEIAlBAXEgC3JBAnI2AgQgBCALaiICIAIoAgRBAXI2AgQMAQsgBCAGIAlBAXFyQQJyNgIEIAQgBmoiAyAMQQNyNgIEIAQgC2oiAiACKAIEQQFyNgIEIAMgDBC7BQsgBCECCyACCyICBEAgAkEIag8LIAEQSCIERQRAQQAPCyAEIABBfEF4IABBBGsoAgAiAkEDcRsgAkF4cWoiAiABIAEgAksbEB8aIAAQGCAECxQAIAAgAUEoQd4qQT9By8cBEKYEC30BA38CQAJAIAAiAUEDcUUNACABLQAARQRAQQAPCwNAIAFBAWoiAUEDcUUNASABLQAADQALDAELA0AgASICQQRqIQFBgIKECCACKAIAIgNrIANyQYCBgoR4cUGAgYKEeEYNAAsDQCACIgFBAWohAiABLQAADQALCyABIABrC5ABAQN/AkAgABAjIgIgAUkEQCMAQRBrIgQkACABIAJrIgIEQCACIAAQViIDIAAQIyIBa0sEQCAAIAMgAiADayABaiABIAEQmgcLIAEgABBCIgNqIAJBABDoCiAAIAEgAmoiABCjAyAEQQA6AA8gACADaiAEQQ9qENMBCyAEQRBqJAAMAQsgACAAEEIgARD8CgsL5xgDCn8EfAF+IwBBgAVrIgwkAANAIAYhDgJ/AkACQAJAAkACQCAFIgZBAWtBfUsNACAMIAApAAAiFzcD4AQgBiAXQiCIp08NAUEBIAZBB3F0IgsgBkEDdiINIAxB4ARqIBenIBdCgICAgJAEVBtqLQAAcQ0AIAMgBhDdCCEKIAYgACgCBCIJTw0CIAAhBSAJQSFPBH8gACgCAAUgBQsgDWoiBSAFLQAAIAtyOgAAAkAgCisDECITIAorAyAiFERIr7ya8td6PqBkRQ0AIAIgCigCAEE4bGoiBSsDACIVIAUrAxChmURIr7ya8td6PmVFDQAgAiAKKAIEQThsaiIFKwMAIhYgBSsDEKGZREivvJry13o+ZUUNACAMQgA3A/AEIAxCADcD6AQgDEIANwPgBAJAIAcEQCAMIBM5A/AEIAwgFDkD4AQgDCAWmjkD6AQgFZohEwwBCyAMIBY5A/AEIAwgFDkD6AQgDCAVOQPgBAsgDCATOQP4BCAMIAwpA+gENwMIIAwgDCkD8AQ3AxAgDCAMKQP4BDcDGCAMIAwpA+AENwMAIAEgDBDbBAsCQCAKKAIoIg1BAWsiD0F+SQ0AIAooAixBAWtBfkkNAAJAIAooAjBBAWtBfUsNACAKKAI0IghBAWtBfUsNACAKQTBqIQUgCkE0aiELIAxBmARqIAMgCBDyASAKKAIAIQggDCgCmAQhDSAKKAI0IA5GBEAgBCAIIA0QvAEgACABIAIgAyAEIAsoAgAgBiAHQQEQPiEEQQEMCAsgBCANIAgQvAEgACABIAIgAyAEIAooAjAgBiAHQQEQPiEEIAshBUEBDAcLIAAgASACIAMgBCANIAYgB0ECED4gACABIAIgAyAEIAooAiwgBiAHQQIQPiAAIAEgAiADIAQgCigCMCAGIAdBARA+IApBNGohBUEBDAYLIApBKGohCwJAIAooAjBBAWsiEUF+SSISDQAgCigCNEEBa0F+SQ0AAkAgD0F9Sw0AIAooAixBAWtBfUsNACAKQSxqIQUgCigCBCEIIAxB0ANqIAMgDRDyASAMKALUAyENIAooAiwgDkYEQCAEIA0gCBC8ASAAIAEgAiADIAQgCigCLCAGIAdBAhA+IQQgCyEFQQIMCAsgBCAIIA0QvAEgACABIAIgAyAEIAsoAgAgBiAHQQIQPiEEQQIMBwsgCkE0aiEFIAAgASACIAMgBCANIAYgB0ECED4gACABIAIgAyAEIAooAiwgBiAHQQIQPiAAIAEgAiADIAQgCigCMCAGIAdBARA+QQEMBgsgCiIJQTBqIQUgCUEsaiEKIAkoAixBAWshEAJAIA9BfU0EQCAQQX1LDQECQCARQX1LDQAgCSgCNCIPQQFrQX1LDQAgCUE0aiENIAxBiANqIAMgDxDyASAMKAKIAyEPIAxBwAJqIAMgCygCABDyASAMKALEAiEQAkAgCEECRgRAIA0oAgAgDkYNAQwJCyAKKAIAIA5HDQgLIAQgECAPELwBIQ4gACABIAIgAyAEIAooAgAgBiAHQQIQPiAAIAEgAiADIAQgDSgCACAGIAdBARA+IAAgASACIAMgDiALKAIAIAYgB0ECED4gDiEEQQEMCAsCQCAJKwAgIAIgCSgCAEE4bGoiBSsAGKGZREivvJry13o+ZUUNACAJKwAYIAUrABChmURIr7ya8td6PmVFDQAgDEH4AWogAyANEPIBIAIgCSgCAEE4bGooAiwhBSAMKAL8ASEKAkAgCEEBRw0AIAsoAgAgDkcNACAEIAUgChC8ASELIAAgASACIAMgBCAJKAIoIAYgB0ECED4gACABIAIgAyALIAkoAjAgBiAHQQEQPiAAIAEgAiADIAsgCSgCLCAGIAdBAhA+IAlBNGohBSALIQRBAQwJCyAEIAogBRC8ASAAIAEgAiADIAQgCSgCLCAGIAdBAhA+IAAgASACIAMgBCAJKAIwIAYgB0EBED4gACABIAIgAyAEIAkoAjQgBiAHQQEQPiEEIAshBUECDAgLIAkoAgQhBSAMQbABaiADIA0Q8gEgDCgCtAEhDQJAIAhBAUcNACAKKAIAIA5HDQAgBCANIAUQvAEhBSAAIAEgAiADIAQgCSgCLCAGIAdBAhA+IAAgASACIAMgBSAJKAI0IAYgB0EBED4gACABIAIgAyAFIAkoAjAgBiAHQQEQPiAFIQQgCyEFQQIMCAsgBCAFIA0QvAEgACABIAIgAyAEIAkoAiggBiAHQQIQPiAAIAEgAiADIAQgCSgCMCAGIAdBARA+IAAgASACIAMgBCAJKAI0IAYgB0EBED4hBCAKIQVBAgwHCyAQQX1LDQELIBJFBEAgCSsAECETIAkoAgAhDwwECyAJKwAQIRMgCSgCACEPIAkoAjQiEEEBa0F9Sw0DIAlBNGohCwJAIBMgAiAPQThsaiIKKwAIoZlESK+8mvLXej5lRQ0AIAkrAAggCisAAKGZREivvJry13o+ZUUNACAMQegAaiADIBAQ8gEgCSgCACEKIAwoAmghDQJAIAhBAkYEQCAJKAIwIA5GDQELIAQgCiANELwBIAAgASACIAMgBCAJKAIsIAYgB0ECED4gACABIAIgAyAEIAkoAjQgBiAHQQEQPiAAIAEgAiADIAQgCSgCKCAGIAdBAhA+IQRBAQwHCyAEIA0gChC8ASEFIAAgASACIAMgBCAJKAIwIAYgB0EBED4gACABIAIgAyAFIAkoAiggBiAHQQIQPiAAIAEgAiADIAUgCSgCLCAGIAdBAhA+IAUhBCALIQVBAQwGCyAMQSBqIAMgEBDyASACIAkoAgRBOGxqKAIsIQogDCgCICENAkAgCEECRw0AIAsoAgAgDkcNACAEIAogDRC8ASELIAAgASACIAMgBCAJKAI0IAYgB0EBED4gACABIAIgAyALIAkoAiwgBiAHQQIQPiAAIAEgAiADIAsgCSgCKCAGIAdBAhA+IAshBEEBDAYLIAQgDSAKELwBIAAgASACIAMgBCAJKAIoIAYgB0ECED4gACABIAIgAyAEIAkoAjAgBiAHQQEQPiAAIAEgAiADIAQgCSgCLCAGIAdBAhA+IQQgCyEFQQEMBQsgDEGABWokAA8LQaK7A0HbgQFBwgBB3yMQAAALQfC6A0HbgQFB0QBBpiIQAAALIAkrAAghFAJAAkACQCATIAIgD0E4bGoiCysACKGZREivvJry13o+ZUUNACAUIAsrAAChmURIr7ya8td6PmVFDQAgCSsAICACIAkoAgQiDkE4bGoiECsACKGZREivvJry13o+ZUUNACAJKwAYIBArAAChmURIr7ya8td6PmUNAQsCQCATIAIgCSgCBEE4bGoiDisAGKGZREivvJry13o+ZUUNACAUIA4rABChmURIr7ya8td6PmVFDQAgCSsAICALKwAYoZlESK+8mvLXej5lRQ0AIAkrABggCysAEKGZREivvJry13o+ZQ0CCyAAIAEgAiADIAQgDSAGIAdBAhA+IAAgASACIAMgBCAJKAIwIAYgB0EBED4gACABIAIgAyAEIAkoAiwgBiAHQQIQPiAJQTRqIQVBAQwDCyAIQQFGBEAgBCAPIA4QvAEhCyAAIAEgAiADIAQgCSgCKCAGIAdBAhA+IAAgASACIAMgBCAJKAIsIAYgB0ECED4gACABIAIgAyALIAkoAjQgBiAHQQEQPiALIQRBAQwDCyAEIA4gDxC8ASEFIAAgASACIAMgBCAJKAI0IAYgB0EBED4gACABIAIgAyAEIAkoAjAgBiAHQQEQPiAAIAEgAiADIAUgCSgCKCAGIAdBAhA+IAUhBCAKIQVBAgwCCyALKAIsIQsgDigCLCEOIAhBAUYEQCAEIAsgDhC8ASELIAAgASACIAMgBCAJKAIoIAYgB0ECED4gACABIAIgAyAEIAkoAiwgBiAHQQIQPiAAIAEgAiADIAsgCSgCNCAGIAdBARA+IAshBEEBDAILIAQgDiALELwBIQUgACABIAIgAyAEIAkoAjQgBiAHQQEQPiAAIAEgAiADIAQgCSgCMCAGIAdBARA+IAAgASACIAMgBSAJKAIoIAYgB0ECED4gBSEEIAohBUECDAELIAQgDyAQELwBIQUgACABIAIgAyAEIAsoAgAgBiAHQQIQPiAAIAEgAiADIAQgCSgCMCAGIAdBARA+IAAgASACIAMgBSAKKAIAIAYgB0ECED4gBSEEIA0hBUEBCyEIIAUoAgAhBQwACwALCQAgABBCIAFqCyAAA0AgAUEATEUEQCAAQZfYAxAaGiABQQFrIQEMAQsLC0MBAn8gABDwAQJAIAEoAhAiA0EATgRAIAAQyAUgA0oNAQtB0a0DQf7CAUHNA0GrIxAAAAsoAgwgASgCEEECdGooAgALEgAgABCoAQRAIAAoAgAPCyAAC8ABAQV/IwBBMGsiBCQAAkAgACgCPCIFRQ0AIAUoAmRFDQAgACgCECIGKAKYAUUNACADQQRxIgcEQCAEQQhqIAZBEGoiCEEoEB8aIAggBkE4akEoEB8aIANBe3EhAwsCQCAALQCZAUEgcQRAIAAgASACIAMgBSgCZBEHAAwBCyAAIAAgASACQRAQGSACEJkCIgEgAiADIAUoAmQRBwAgARAYCyAHRQ0AIAAoAhBBEGogBEEIakEoEB8aCyAEQTBqJAALwgECAXwCfyMAQRBrIgIkAAJ8IAC9QiCIp0H/////B3EiA0H7w6T/A00EQEQAAAAAAADwPyADQZ7BmvIDSQ0BGiAARAAAAAAAAAAAELcEDAELIAAgAKEgA0GAgMD/B08NABogACACEMUHIQMgAisDCCEAIAIrAwAhAQJAAkACQAJAIANBA3FBAWsOAwECAwALIAEgABC3BAwDCyABIABBARC2BJoMAgsgASAAELcEmgwBCyABIABBARC2BAsgAkEQaiQACwsAIAAgAUEQENIKCxcBAX9BDyEBIAAQJwR/QQ8FIAAoAggLC1oCAX8BfgJAAn9BACAARQ0AGiAArSABrX4iA6ciAiAAIAFyQYCABEkNABpBfyACIANCIIinGwsiAhBIIgBFDQAgAEEEay0AAEEDcUUNACAAQQAgAhAzGgsgAAvYKAELfyMAQRBrIgokAAJAAkACQAJAAkACQAJAAkACQAJAIABB9AFNBEBBsKQLKAIAIgRBECAAQQtqQfgDcSAAQQtJGyIGQQN2IgB2IgFBA3EEQAJAIAFBf3NBAXEgAGoiAkEDdCIBQdikC2oiACABQeCkC2ooAgAiASgCCCIFRgRAQbCkCyAEQX4gAndxNgIADAELIAUgADYCDCAAIAU2AggLIAFBCGohACABIAJBA3QiAkEDcjYCBCABIAJqIgEgASgCBEEBcjYCBAwLCyAGQbikCygCACIITQ0BIAEEQAJAQQIgAHQiAkEAIAJrciABIAB0cWgiAUEDdCIAQdikC2oiAiAAQeCkC2ooAgAiACgCCCIFRgRAQbCkCyAEQX4gAXdxIgQ2AgAMAQsgBSACNgIMIAIgBTYCCAsgACAGQQNyNgIEIAAgBmoiByABQQN0IgEgBmsiBUEBcjYCBCAAIAFqIAU2AgAgCARAIAhBeHFB2KQLaiEBQcSkCygCACECAn8gBEEBIAhBA3Z0IgNxRQRAQbCkCyADIARyNgIAIAEMAQsgASgCCAshAyABIAI2AgggAyACNgIMIAIgATYCDCACIAM2AggLIABBCGohAEHEpAsgBzYCAEG4pAsgBTYCAAwLC0G0pAsoAgAiC0UNASALaEECdEHgpgtqKAIAIgIoAgRBeHEgBmshAyACIQEDQAJAIAEoAhAiAEUEQCABKAIUIgBFDQELIAAoAgRBeHEgBmsiASADIAEgA0kiARshAyAAIAIgARshAiAAIQEMAQsLIAIoAhghCSACIAIoAgwiAEcEQCACKAIIIgEgADYCDCAAIAE2AggMCgsgAigCFCIBBH8gAkEUagUgAigCECIBRQ0DIAJBEGoLIQUDQCAFIQcgASIAQRRqIQUgACgCFCIBDQAgAEEQaiEFIAAoAhAiAQ0ACyAHQQA2AgAMCQtBfyEGIABBv39LDQAgAEELaiIBQXhxIQZBtKQLKAIAIgdFDQBBHyEIQQAgBmshAyAAQfT//wdNBEAgBkEmIAFBCHZnIgBrdkEBcSAAQQF0a0E+aiEICwJAAkACQCAIQQJ0QeCmC2ooAgAiAUUEQEEAIQAMAQtBACEAIAZBGSAIQQF2a0EAIAhBH0cbdCECA0ACQCABKAIEQXhxIAZrIgQgA08NACABIQUgBCIDDQBBACEDIAEhAAwDCyAAIAEoAhQiBCAEIAEgAkEddkEEcWooAhAiAUYbIAAgBBshACACQQF0IQIgAQ0ACwsgACAFckUEQEEAIQVBAiAIdCIAQQAgAGtyIAdxIgBFDQMgAGhBAnRB4KYLaigCACEACyAARQ0BCwNAIAAoAgRBeHEgBmsiAiADSSEBIAIgAyABGyEDIAAgBSABGyEFIAAoAhAiAQR/IAEFIAAoAhQLIgANAAsLIAVFDQAgA0G4pAsoAgAgBmtPDQAgBSgCGCEIIAUgBSgCDCIARwRAIAUoAggiASAANgIMIAAgATYCCAwICyAFKAIUIgEEfyAFQRRqBSAFKAIQIgFFDQMgBUEQagshAgNAIAIhBCABIgBBFGohAiAAKAIUIgENACAAQRBqIQIgACgCECIBDQALIARBADYCAAwHCyAGQbikCygCACIFTQRAQcSkCygCACEAAkAgBSAGayIBQRBPBEAgACAGaiICIAFBAXI2AgQgACAFaiABNgIAIAAgBkEDcjYCBAwBCyAAIAVBA3I2AgQgACAFaiIBIAEoAgRBAXI2AgRBACECQQAhAQtBuKQLIAE2AgBBxKQLIAI2AgAgAEEIaiEADAkLIAZBvKQLKAIAIgJJBEBBvKQLIAIgBmsiATYCAEHIpAtByKQLKAIAIgAgBmoiAjYCACACIAFBAXI2AgQgACAGQQNyNgIEIABBCGohAAwJC0EAIQAgBkEvaiIDAn9BiKgLKAIABEBBkKgLKAIADAELQZSoC0J/NwIAQYyoC0KAoICAgIAENwIAQYioCyAKQQxqQXBxQdiq1aoFczYCAEGcqAtBADYCAEHspwtBADYCAEGAIAsiAWoiBEEAIAFrIgdxIgEgBk0NCEHopwsoAgAiBQRAQeCnCygCACIIIAFqIgkgCE0gBSAJSXINCQsCQEHspwstAABBBHFFBEACQAJAAkACQEHIpAsoAgAiBQRAQfCnCyEAA0AgACgCACIIIAVNBEAgBSAIIAAoAgRqSQ0DCyAAKAIIIgANAAsLQQAQ5wMiAkF/Rg0DIAEhBEGMqAsoAgAiAEEBayIFIAJxBEAgASACayACIAVqQQAgAGtxaiEECyAEIAZNDQNB6KcLKAIAIgAEQEHgpwsoAgAiBSAEaiIHIAVNIAAgB0lyDQQLIAQQ5wMiACACRw0BDAULIAQgAmsgB3EiBBDnAyICIAAoAgAgACgCBGpGDQEgAiEACyAAQX9GDQEgBkEwaiAETQRAIAAhAgwEC0GQqAsoAgAiAiADIARrakEAIAJrcSICEOcDQX9GDQEgAiAEaiEEIAAhAgwDCyACQX9HDQILQeynC0HspwsoAgBBBHI2AgALIAEQ5wMiAkF/RkEAEOcDIgBBf0ZyIAAgAk1yDQUgACACayIEIAZBKGpNDQULQeCnC0HgpwsoAgAgBGoiADYCAEHkpwsoAgAgAEkEQEHkpwsgADYCAAsCQEHIpAsoAgAiAwRAQfCnCyEAA0AgAiAAKAIAIgEgACgCBCIFakYNAiAAKAIIIgANAAsMBAtBwKQLKAIAIgBBACAAIAJNG0UEQEHApAsgAjYCAAtBACEAQfSnCyAENgIAQfCnCyACNgIAQdCkC0F/NgIAQdSkC0GIqAsoAgA2AgBB/KcLQQA2AgADQCAAQQN0IgFB4KQLaiABQdikC2oiBTYCACABQeSkC2ogBTYCACAAQQFqIgBBIEcNAAtBvKQLIARBKGsiAEF4IAJrQQdxIgFrIgU2AgBByKQLIAEgAmoiATYCACABIAVBAXI2AgQgACACakEoNgIEQcykC0GYqAsoAgA2AgAMBAsgAiADTSABIANLcg0CIAAoAgxBCHENAiAAIAQgBWo2AgRByKQLIANBeCADa0EHcSIAaiIBNgIAQbykC0G8pAsoAgAgBGoiAiAAayIANgIAIAEgAEEBcjYCBCACIANqQSg2AgRBzKQLQZioCygCADYCAAwDC0EAIQAMBgtBACEADAQLQcCkCygCACACSwRAQcCkCyACNgIACyACIARqIQVB8KcLIQACQANAIAUgACgCACIBRwRAIAAoAggiAA0BDAILCyAALQAMQQhxRQ0DC0HwpwshAANAAkAgACgCACIBIANNBEAgAyABIAAoAgRqIgVJDQELIAAoAgghAAwBCwtBvKQLIARBKGsiAEF4IAJrQQdxIgFrIgc2AgBByKQLIAEgAmoiATYCACABIAdBAXI2AgQgACACakEoNgIEQcykC0GYqAsoAgA2AgAgAyAFQScgBWtBB3FqQS9rIgAgACADQRBqSRsiAUEbNgIEIAFB+KcLKQIANwIQIAFB8KcLKQIANwIIQfinCyABQQhqNgIAQfSnCyAENgIAQfCnCyACNgIAQfynC0EANgIAIAFBGGohAANAIABBBzYCBCAAQQhqIABBBGohACAFSQ0ACyABIANGDQAgASABKAIEQX5xNgIEIAMgASADayICQQFyNgIEIAEgAjYCAAJ/IAJB/wFNBEAgAkF4cUHYpAtqIQACf0GwpAsoAgAiAUEBIAJBA3Z0IgJxRQRAQbCkCyABIAJyNgIAIAAMAQsgACgCCAshASAAIAM2AgggASADNgIMQQwhAkEIDAELQR8hACACQf///wdNBEAgAkEmIAJBCHZnIgBrdkEBcSAAQQF0a0E+aiEACyADIAA2AhwgA0IANwIQIABBAnRB4KYLaiEBAkACQEG0pAsoAgAiBUEBIAB0IgRxRQRAQbSkCyAEIAVyNgIAIAEgAzYCAAwBCyACQRkgAEEBdmtBACAAQR9HG3QhACABKAIAIQUDQCAFIgEoAgRBeHEgAkYNAiAAQR12IQUgAEEBdCEAIAEgBUEEcWoiBCgCECIFDQALIAQgAzYCEAsgAyABNgIYQQghAiADIgEhAEEMDAELIAEoAggiACADNgIMIAEgAzYCCCADIAA2AghBACEAQRghAkEMCyADaiABNgIAIAIgA2ogADYCAAtBvKQLKAIAIgAgBk0NAEG8pAsgACAGayIBNgIAQcikC0HIpAsoAgAiACAGaiICNgIAIAIgAUEBcjYCBCAAIAZBA3I2AgQgAEEIaiEADAQLQeCPC0EwNgIAQQAhAAwDCyAAIAI2AgAgACAAKAIEIARqNgIEIAJBeCACa0EHcWoiCCAGQQNyNgIEIAFBeCABa0EHcWoiBCAGIAhqIgNrIQcCQEHIpAsoAgAgBEYEQEHIpAsgAzYCAEG8pAtBvKQLKAIAIAdqIgA2AgAgAyAAQQFyNgIEDAELQcSkCygCACAERgRAQcSkCyADNgIAQbikC0G4pAsoAgAgB2oiADYCACADIABBAXI2AgQgACADaiAANgIADAELIAQoAgQiAEEDcUEBRgRAIABBeHEhCSAEKAIMIQICQCAAQf8BTQRAIAQoAggiASACRgRAQbCkC0GwpAsoAgBBfiAAQQN2d3E2AgAMAgsgASACNgIMIAIgATYCCAwBCyAEKAIYIQYCQCACIARHBEAgBCgCCCIAIAI2AgwgAiAANgIIDAELAkAgBCgCFCIABH8gBEEUagUgBCgCECIARQ0BIARBEGoLIQEDQCABIQUgACICQRRqIQEgACgCFCIADQAgAkEQaiEBIAIoAhAiAA0ACyAFQQA2AgAMAQtBACECCyAGRQ0AAkAgBCgCHCIAQQJ0QeCmC2oiASgCACAERgRAIAEgAjYCACACDQFBtKQLQbSkCygCAEF+IAB3cTYCAAwCCwJAIAQgBigCEEYEQCAGIAI2AhAMAQsgBiACNgIUCyACRQ0BCyACIAY2AhggBCgCECIABEAgAiAANgIQIAAgAjYCGAsgBCgCFCIARQ0AIAIgADYCFCAAIAI2AhgLIAcgCWohByAEIAlqIgQoAgQhAAsgBCAAQX5xNgIEIAMgB0EBcjYCBCADIAdqIAc2AgAgB0H/AU0EQCAHQXhxQdikC2ohAAJ/QbCkCygCACIBQQEgB0EDdnQiAnFFBEBBsKQLIAEgAnI2AgAgAAwBCyAAKAIICyEBIAAgAzYCCCABIAM2AgwgAyAANgIMIAMgATYCCAwBC0EfIQIgB0H///8HTQRAIAdBJiAHQQh2ZyIAa3ZBAXEgAEEBdGtBPmohAgsgAyACNgIcIANCADcCECACQQJ0QeCmC2ohAAJAAkBBtKQLKAIAIgFBASACdCIFcUUEQEG0pAsgASAFcjYCACAAIAM2AgAMAQsgB0EZIAJBAXZrQQAgAkEfRxt0IQIgACgCACEBA0AgASIAKAIEQXhxIAdGDQIgAkEddiEBIAJBAXQhAiAAIAFBBHFqIgUoAhAiAQ0ACyAFIAM2AhALIAMgADYCGCADIAM2AgwgAyADNgIIDAELIAAoAggiASADNgIMIAAgAzYCCCADQQA2AhggAyAANgIMIAMgATYCCAsgCEEIaiEADAILAkAgCEUNAAJAIAUoAhwiAUECdEHgpgtqIgIoAgAgBUYEQCACIAA2AgAgAA0BQbSkCyAHQX4gAXdxIgc2AgAMAgsCQCAFIAgoAhBGBEAgCCAANgIQDAELIAggADYCFAsgAEUNAQsgACAINgIYIAUoAhAiAQRAIAAgATYCECABIAA2AhgLIAUoAhQiAUUNACAAIAE2AhQgASAANgIYCwJAIANBD00EQCAFIAMgBmoiAEEDcjYCBCAAIAVqIgAgACgCBEEBcjYCBAwBCyAFIAZBA3I2AgQgBSAGaiIEIANBAXI2AgQgAyAEaiADNgIAIANB/wFNBEAgA0F4cUHYpAtqIQACf0GwpAsoAgAiAUEBIANBA3Z0IgJxRQRAQbCkCyABIAJyNgIAIAAMAQsgACgCCAshASAAIAQ2AgggASAENgIMIAQgADYCDCAEIAE2AggMAQtBHyEAIANB////B00EQCADQSYgA0EIdmciAGt2QQFxIABBAXRrQT5qIQALIAQgADYCHCAEQgA3AhAgAEECdEHgpgtqIQECQAJAIAdBASAAdCICcUUEQEG0pAsgAiAHcjYCACABIAQ2AgAgBCABNgIYDAELIANBGSAAQQF2a0EAIABBH0cbdCEAIAEoAgAhAQNAIAEiAigCBEF4cSADRg0CIABBHXYhASAAQQF0IQAgAiABQQRxaiIHKAIQIgENAAsgByAENgIQIAQgAjYCGAsgBCAENgIMIAQgBDYCCAwBCyACKAIIIgAgBDYCDCACIAQ2AgggBEEANgIYIAQgAjYCDCAEIAA2AggLIAVBCGohAAwBCwJAIAlFDQACQCACKAIcIgFBAnRB4KYLaiIFKAIAIAJGBEAgBSAANgIAIAANAUG0pAsgC0F+IAF3cTYCAAwCCwJAIAIgCSgCEEYEQCAJIAA2AhAMAQsgCSAANgIUCyAARQ0BCyAAIAk2AhggAigCECIBBEAgACABNgIQIAEgADYCGAsgAigCFCIBRQ0AIAAgATYCFCABIAA2AhgLAkAgA0EPTQRAIAIgAyAGaiIAQQNyNgIEIAAgAmoiACAAKAIEQQFyNgIEDAELIAIgBkEDcjYCBCACIAZqIgUgA0EBcjYCBCADIAVqIAM2AgAgCARAIAhBeHFB2KQLaiEAQcSkCygCACEBAn9BASAIQQN2dCIHIARxRQRAQbCkCyAEIAdyNgIAIAAMAQsgACgCCAshBCAAIAE2AgggBCABNgIMIAEgADYCDCABIAQ2AggLQcSkCyAFNgIAQbikCyADNgIACyACQQhqIQALIApBEGokACAAC0oBAn8CQCAALQAAIgJFIAIgAS0AACIDR3INAANAIAEtAAEhAyAALQABIgJFDQEgAUEBaiEBIABBAWohACACIANGDQALCyACIANrC4IBAQJ/IwBBIGsiAiQAAkAgAEEAIACtIAGtfkIgiKcbRQRAIABFIAFFciAAIAEQRyIDckUNASACQSBqJAAgAw8LIAIgATYCBCACIAA2AgBBuPwIKAIAQYT0AyACEB4aECgACyACIAAgAWw2AhBBuPwIKAIAQdPzAyACQRBqEB4aECgAC1YBAX8jAEEQayIEJAACQCAARSABRXINACAAIAEQQSIARQ0AIAAtAABFDQAgAiADIAAgBEEMahDiASICIAIgA2MbIAAgBCgCDEYbIQILIARBEGokACACC0IBAX8gASACbCEEIAQCfyADKAJMQQBIBEAgACAEIAMQvwcMAQsgACAEIAMQvwcLIgBGBEAgAkEAIAEbDwsgACABbgs5AAJAIAAEQCABRQ0BIAAgARBJRQ8LQcPcAUHLgwFBDEHTwQAQAAALQZHcAUHLgwFBDUHTwQAQAAALFgAgACgCACIAQciqC0cEQCAAEJ0FCwskAQF/IwBBEGsiAyQAIAMgAjYCDCAAIAEgAhCBDCADQRBqJAALrgIDAn8CfAR+IwBBIGsiAiQAAkAgAJkiBCABmSIFIAS9IAW9VCIDGyIBvSIGQjSIIgdC/w9RDQAgBSAEIAMbIQACQCAGUA0AIAC9IghCNIgiCUL/D1ENACAJpyAHp2tBwQBOBEAgBCAFoCEBDAILAnwgCEKAgICAgICA8N8AWgRAIAFEAAAAAAAAMBSiIQEgAEQAAAAAAAAwFKIhAEQAAAAAAACwawwBC0QAAAAAAADwPyAGQv/////////nI1YNABogAUQAAAAAAACwa6IhASAARAAAAAAAALBroiEARAAAAAAAADAUCyACQRhqIAJBEGogABCbDCACQQhqIAIgARCbDCACKwMAIAIrAxCgIAIrAwigIAIrAxign6IhAQwBCyAAIQELIAJBIGokACABCwwAIAAgAUEcahCTCwsZAQF/IwBBEGsiASQAIAAQ4gsgAUEQaiQAC0oBAX8gACABSQRAIAAgASACEB8PCyACBEAgACACaiEDIAEgAmohAQNAIANBAWsiAyABQQFrIgEtAAA6AAAgAkEBayICDQALCyAACwgAQQEgABAZC5UCAQd/IwBBEGsiByQAAkACQCAAKAIIIgUgACgCDCICRwRAIAAoAgAhAyAAKAIEIQQMAQsgBUEBdEEBIAUbIgJB/////wNLBEBBxAAhAAwCCyAAKAIAIAJBAnQQOiIDRQRAQTAhAAwCCyADIAAoAgwiBkECdGpBACACIAZrQQJ0EDMaIAYgACgCCCIFIAAoAgQiBGpJBEAgBEECdCEIIAMgAiAGIARrIgZrIgRBAnRqIAMgCGogBkECdBBTGiAAIAQ2AgQLIAAgAjYCDCAAIAM2AgALIAMgBCAFaiACcEECdGogATYCACAAIAVBAWo2AgggB0EQaiQADwsgByAAEHg2AgBBuPwIKAIAQdqKBCAHEB4aECgACxsBAX9BCiEBIAAQqAEEfyAAEPgCQQFrBUEKCwvTAQIDfwJ+AkAgACkDcCIEUEUgBCAAKQN4IAAoAgQiASAAKAIsIgJrrHwiBVdxRQRAIAAQygUiA0EATg0BIAAoAiwhAiAAKAIEIQELIABCfzcDcCAAIAE2AmggACAFIAIgAWusfDcDeEF/DwsgBUIBfCEFIAAoAgQhASAAKAIIIQICQCAAKQNwIgRQDQAgBCAFfSIEIAIgAWusWQ0AIAEgBKdqIQILIAAgAjYCaCAAIAUgACgCLCIAIAFrrHw3A3ggACABTwRAIAFBAWsgAzoAAAsgAwvKAQICfwF8IwBBEGsiASQAAkAgAL1CIIinQf////8HcSICQfvDpP8DTQRAIAJBgIDA8gNJDQEgAEQAAAAAAAAAAEEAELYEIQAMAQsgAkGAgMD/B08EQCAAIAChIQAMAQsgACABEMUHIQIgASsDCCEAIAErAwAhAwJAAkACQAJAIAJBA3FBAWsOAwECAwALIAMgAEEBELYEIQAMAwsgAyAAELcEIQAMAgsgAyAAQQEQtgSaIQAMAQsgAyAAELcEmiEACyABQRBqJAAgAAt7AQN/AkAgARDtCiECIAAQmAchAyAAECMhBCACIANNBEAgABBCIgMgASACEOMLIwBBEGsiASQAIAAQIxogACACEKMDIAFBADYCDCADIAJBAnRqIAFBDGoQ3gEgAUEQaiQADAELIAAgAyACIANrIARBACAEIAIgARDmCgsLTwEDfwJAIAEQPCECIAAQViEDIAAQIyEEIAIgA00EQCAAEEIiAyABIAIQ5QsgACADIAIQ/AoMAQsgACADIAIgA2sgBEEAIAQgAiABEOkKCwsQACAAENsLIAEQ2wtzQQFzCxAAIAAQ3AsgARDcC3NBAXMLEgAgACABQZIkQTVBkoMBEMgBCwsAIAAgAUE4ENIKCxUAIAAtAA9B/wFGBEAgACgCABAYCwuVBQIDfwJ+IwBB4ABrIgUkAAJAAkACQAJAAkACQCAAQQIgAyAFQdgAakEAEJoDRQRAIAMNAiAEBEAgABDyBUUNBAsgBUIANwNQIAVCADcDSAwBCyAFQgA3A0ggBSAFKQNYNwNQIAVBAjYCSAsgBUFAayAFKQNQNwMAIAUgBSkDSDcDOCAAIAEgAiAFQThqENsCIgYNAiAAEP4NBEAgBSAFKQNQNwMwIAUgBSkDSDcDKCAAIAIgASAFQShqENsCIgYNAwsgBEUNACAAEDcgBSAFKQNQNwMgIAUgBSkDSDcDGCABIAIgBUEYahDbAiIGRQRAIAAQ/g1FDQEgABA3IAUgBSkDUDcDECAFIAUpA0g3AwggAiABIAVBCGoQ2wIiBkUNAQsgACAGELMGDAILIAQNAEEAIQYMAQtBACEGIwBBIGsiBCQAIARCADcDGCAEQgA3AxACfyAAEPIFBEAgBCAEKQMYNwMIIARBADYCECAEIAQpAxA3AwBBACAAIAEgAiAEENsCDQEaCyAALQAYQQRxRSABIAJHcgsgBEEgaiQARQ0AIABBAiADIAVB2ABqQQEQmgNFDQAgBSkDWCEIIAAgAUEBEIYBGiAAIAJBARCGARpBAUHgABBHIgZFDQEgAEECEJ8OIglCgICAgAFaDQIgBiAINwM4IAYgCDcDCCAGIAE2AlggBiACNgIoIAYgCadBBHQiAUEDcjYCMCAGIAFBAnI2AgAgACAGELMGIAAtABhBIHEEQCAGQYWhBUEQQQAQNRogACAGENQFCyAAIAYQhQggAEECIAYQ/QQLIAVB4ABqJAAgBg8LIAVB4AA2AgBBuPwIKAIAQdPzAyAFEB4aECgAC0HctgNB9MYBQcsBQfyjARAAAAvOBAEGfwJAAkACQCAAKAIEIgJFDQAgACgCECIBRQRAIAAgAjYCACAAIAIoAgA2AgQgAkEANgIAIAAgACgCACIBQQhqIgI2AhAgASgCBCEBIAAgAjYCDCAAIAEgAmo2AggMAgsgAigCBCAAKAIIIAFrTA0AIAIoAgAhASACIAAoAgA2AgAgACgCBCECIAAgATYCBCAAIAI2AgAgAkEIaiAAKAIQIgEgACgCCCABaxAfGiAAKAIQIQIgACAAKAIAIgFBCGoiAzYCECAAIAMgACgCDCACa2o2AgwgACADIAEoAgRqNgIIDAELIAAoAgghASAAKAIAIgRFIAAoAhAiBiAEQQhqR3JFBEBBACECIAEgBmtBAXQiBUEASA0CIAVFDQIgBUEIaiIBQQAgAUEAShsiA0UNAiAAKAIMIQEgBCADIAAoAhQoAgQRAAAiA0UNAiAAIAM2AgAgAyAFNgIEIAAgACgCAEEIaiICNgIQIAAgAiABIAZrajYCDCAAIAIgBWo2AggMAQtBACECIAEgBmsiAUEASA0BQYAIIQQgAUGACE8EQCABQQF0IgRBAEgNAgsgBEEIaiIBQQAgAUEAShsiAUUNASABIAAoAhQoAgARAgAiA0UNASADIAQ2AgQgAyAAKAIANgIAIAAgAzYCAAJ/IAAoAgwiAiAAKAIQIgFGBEAgAgwBCyADQQhqIAEgAiABaxAfGiAAKAIQIQIgACgCDAshASAAIANBCGoiAzYCECAAIAMgASACa2o2AgwgACADIARqNgIIC0EBIQILIAILiQEBAn8jAEGgAWsiBCQAIAQgACAEQZ4BaiABGyIFNgKUASAEIAFBAWsiAEEAIAAgAU0bNgKYASAEQQBBkAEQMyIAQX82AkwgAEGDBDYCJCAAQX82AlAgACAAQZ8BajYCLCAAIABBlAFqNgJUIAVBADoAACAAIAIgA0GBBEGCBBC2ByAAQaABaiQACw0AIAAQNygCECgCvAELUgEBfyMAQRBrIgQkAAJAIAFFDQAgACABEEEiAEUNACAALQAARQ0AIAIgACAEQQxqELcHIgEgAyABIANKGyAAIAQoAgxGGyECCyAEQRBqJAAgAgsgACABRQRAQZHcAUHLgwFBDUHTwQAQAAALIAAgARBJRQtAAQJ/IwBBEGsiASQAIAAQqgEiAkUEQCABIAAQPEEBajYCAEG4/AgoAgBB0/MDIAEQHhoQKAALIAFBEGokACACCygBAX8jAEEQayICJAAgAiABOgAPIAAgAkEPakEBEKsCGiACQRBqJAAL7wIBBn9BxKoLLQAABEBBwKoLKAIADwsjAEEgayICJAACQAJAA0AgAkEIaiIEIABBAnQiA2oCf0EBIAB0Qf////8HcSIFQQFyRQRAIAMoAgAMAQsgAEHy4wFB5ooFIAUbEL0HCyIDNgIAIANBf0YNASAAQQFqIgBBBkcNAAtBABDaC0UEQEGY+wghASAEQZj7CEEYENgBRQ0CQbD7CCEBIARBsPsIQRgQ2AFFDQJBACEAQdCoCy0AAEUEQANAIABBAnRBoKgLaiAAQeaKBRC9BzYCACAAQQFqIgBBBkcNAAtB0KgLQQE6AABBuKgLQaCoCygCADYCAAtBoKgLIQEgAkEIaiIAQaCoC0EYENgBRQ0CQbioCyEBIABBuKgLQRgQ2AFFDQJBGBBIIgFFDQELIAEgAikCCDcCACABIAIpAhg3AhAgASACKQIQNwIIDAELQQAhAQsgAkEgaiQAQcSqC0EBOgAAQcCqCyABNgIAIAELIAAgAARAIAAoAhQQGCAAKAIYEBggACgCHBAYIAAQGAsLCQAgAEEAEPkGC78KAgV/D34jAEHgAGsiBSQAIARC////////P4MhDCACIASFQoCAgICAgICAgH+DIQogAkL///////8/gyINQiCIIQ4gBEIwiKdB//8BcSEHAkACQCACQjCIp0H//wFxIglB//8Ba0GCgH5PBEAgB0H//wFrQYGAfksNAQsgAVAgAkL///////////8AgyILQoCAgICAgMD//wBUIAtCgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhCgwCCyADUCAEQv///////////wCDIgJCgICAgICAwP//AFQgAkKAgICAgIDA//8AURtFBEAgBEKAgICAgIAghCEKIAMhAQwCCyABIAtCgICAgICAwP//AIWEUARAIAIgA4RQBEBCgICAgICA4P//ACEKQgAhAQwDCyAKQoCAgICAgMD//wCEIQpCACEBDAILIAMgAkKAgICAgIDA//8AhYRQBEAgASALhEIAIQFQBEBCgICAgICA4P//ACEKDAMLIApCgICAgICAwP//AIQhCgwCCyABIAuEUARAQgAhAQwCCyACIAOEUARAQgAhAQwCCyALQv///////z9YBEAgBUHQAGogASANIAEgDSANUCIGG3kgBkEGdK18pyIGQQ9rELYBQRAgBmshBiAFKQNYIg1CIIghDiAFKQNQIQELIAJC////////P1YNACAFQUBrIAMgDCADIAwgDFAiCBt5IAhBBnStfKciCEEPaxC2ASAGIAhrQRBqIQYgBSkDSCEMIAUpA0AhAwsgA0IPhiILQoCA/v8PgyICIAFCIIgiBH4iECALQiCIIhMgAUL/////D4MiAX58Ig9CIIYiESABIAJ+fCILIBFUrSACIA1C/////w+DIg1+IhUgBCATfnwiESAMQg+GIhIgA0IxiIRC/////w+DIgMgAX58IhQgDyAQVK1CIIYgD0IgiIR8Ig8gAiAOQoCABIQiDH4iFiANIBN+fCIOIBJCIIhCgICAgAiEIgIgAX58IhAgAyAEfnwiEkIghnwiF3wh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AUpqIQIMAQsLIABBAEwgAEH/AE5yDQEgAiwAACAEKAIAQQFrSw0BCyADQQQ2AgALC4QBAQJ/IwBBEGsiAiQAIAAQqAEEQCAAKAIAIAAQ+AIaEK8FCyABECMaIAEQqAEhAyAAIAEoAgg2AgggACABKQIANwIAIAFBABDUASACQQA6AA8gASACQQ9qENMBAkAgACABRiIBIANyRQ0ACyAAEKgBIAFyRQRAIAAQqQMaCyACQRBqJAALUAEBfgJAIANBwABxBEAgASADQUBqrYYhAkIAIQEMAQsgA0UNACACIAOtIgSGIAFBwAAgA2utiIQhAiABIASGIQELIAAgATcDACAAIAI3AwgLzgkCBH8EfiMAQfAAayIGJAAgBEL///////////8AgyEJAkACQCABUCIFIAJC////////////AIMiCkKAgICAgIDA//8AfUKAgICAgIDAgIB/VCAKUBtFBEAgA0IAUiAJQoCAgICAgMD//wB9IgtCgICAgICAwICAf1YgC0KAgICAgIDAgIB/URsNAQsgBSAKQoCAgICAgMD//wBUIApCgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhBCABIQMMAgsgA1AgCUKAgICAgIDA//8AVCAJQoCAgICAgMD//wBRG0UEQCAEQoCAgICAgCCEIQQMAgsgASAKQoCAgICAgMD//wCFhFAEQEKAgICAgIDg//8AIAIgASADhSACIASFQoCAgICAgICAgH+FhFAiBRshBEIAIAEgBRshAwwCCyADIAlCgICAgICAwP//AIWEUA0BIAEgCoRQBEAgAyAJhEIAUg0CIAEgA4MhAyACIASDIQQMAgsgAyAJhFBFDQAgASEDIAIhBAwBCyADIAEgASADVCAJIApWIAkgClEbIggbIQogBCACIAgbIgxC////////P4MhCSACIAQgCBsiC0IwiKdB//8BcSEHIAxCMIinQf//AXEiBUUEQCAGQeAAaiAKIAkgCiAJIAlQIgUbeSAFQQZ0rXynIgVBD2sQtgEgBikDaCEJIAYpA2AhCkEQIAVrIQULIAEgAyAIGyEDIAtC////////P4MhASAHBH4gAQUgBkHQAGogAyABIAMgASABUCIHG3kgB0EGdK18pyIHQQ9rELYBQRAgB2shByAGKQNQIQMgBikDWAtCA4YgA0I9iIRCgICAgICA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AxA8EKsCGiAAQZzYA0EBEKsCGiACIAErAwgQsQsgACACEKoFIgAgABA8EKsCGiACEF8gAkEQaiQAC18BAn8gAkUEQEEADwsgAC0AACIDBH8CQANAIAMgAS0AACIERyAERXINASACQQFrIgJFDQEgAUEBaiEBIAAtAAEhAyAAQQFqIQAgAw0AC0EAIQMLIAMFQQALIAEtAABrCzoBAX8CQCACRQ0AIAAQLyACEM8DIgMgAkcNACADEHZFDQAgACABIAJBARCSDA8LIAAgASACQQAQkgwLLgAQmQwgACkDAEGgkAsQD0HIkAtB2JALQdSQC0HAkAsoAgAbKAIANgIAQaCQCwsoAQF/IAAoAkQiAUEBRgRAIAAQngwgAEEANgJEDwsgACABQQFrNgJEC5kBAQR/AkACQEHckQsoAgAiBCAAKAJMIgNB/////3txRgRAQX8hAiAAKAJEIgFB/////wdGDQIgACABQQFqNgJEDAELIABBzABqIQFBfyECAkAgA0EASARAIAFBADYCAAwBCyADDQILIAEgASgCACIBIAQgARs2AgAgAQ0BIABBxJELEJwMC0EAIQILIAIEQCAAQcSRCxCcDAsLHgAgAEUEQEGJ2gFBjoIBQRVBuo8BEAAACyAAKAIICwwAIABBhaEFQQAQbQs9AQJ/IABBACAAQQBKGyEAA0AgACAERkUEQCADIARBA3QiBWogAiABIAVqKwMAojkDACAEQQFqIQQMAQsLCz0AIAEoAgggAk0EQEHCvANB4oMBQT1BhyUQAAALIAAgASgCACABKAIEIAJqIAEoAgxwQcgAbGpByAAQHxoLnQIBB38jAEEQayIGJAACQAJAIAAoAggiBSAAKAIMIgFHBEAgACgCACECIAAoAgQhAwwBCyAFQQF0QQEgBRsiAUHmzJkzSwRAQcQAIQAMAgsgACgCACABQShsEDoiAkUEQEEwIQAMAgsgAiAAKAIMIgRBKGxqQQAgASAEa0EobBAzGiAEIAAoAggiBSAAKAIEIgNqSQRAIANBKGwhByACIAEgBCADayIEayIDQShsaiACIAdqIARBKGwQUxogACADNgIECyAAIAE2AgwgACACNgIACyACIAMgBWogAXBBKGxqQQBBKBAzGiAAIAAoAggiAEEBajYCCCAGQRBqJAAgAA8LIAYgABB4NgIAQbj8CCgCAEHa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IAQQtgIgARB5IQEMAAsACyAAEBshAyABQQFHIQYDQCADRQ0BAkAgBkUEQCADIAIgBSAEEDUaDAELIAAgAxAtIQEDQCABRQ0BIAEgAiAFIAQQNRogACABEDAhAQwACwALIAAgAxAcIQMMAAsACwsRACAAQQRBEEGAgICAARCDBwsxAQF/IAAoAgQiASgCICsDECABKwMYoCAAKwMIoSAAKAIAIgAoAiArAxAgACsDGKChC1ABAX9BCCEFAkACQAJAAkAgA0EBaw4EAwACAQILQRAhBQwCC0EEIQUMAQtBACEFCyAAIAEgAyAFIAQQhg4hACACQQBKBEAgACACEIUOCyAACy4BAn8gABAbIQEDQCABBEAgACABQQBBARCgCCACaiECIAAgARAcIQEMAQsLIAILpAEBA39BwAAQjwYiAiACKAIAQXxxQQFyNgIAIAJBwAIQjwYiATYCECACIAAQNzYCGCABQoCAgICAgID4PzcDYCABQQE6AKwBIAFCgICAgICAgPg/NwNYIAFBATYC7AEgAUKAgICAgICA+D83A1AgAUEANgLEAUEFQQQQ1QIhAyABQQA2AswBIAEgAzYCwAEgAUEFQQQQ1QI2AsgBIAAgAhDECCACCxMAIAAgASgCABDvDiABQgA3AgAL/QMBB38gBUEYQRQgAC0AABtqKAIAIAAQvAMiBigCKCAAKAIoIAEoAigQmAYgBEEAIARBAEobQQFqIQxBASELA0AgCyAMRkUEQCAAIgQgAhC7AyEAIAEiByADELsDIQECfyAELQAARQRAIAUoAhggABC8AyEJIAcoAighByAEKAIoIQggBigCKCEGIAArAwggBCsDEGEEQCAEKAIgIAYgCCAHEL0DIQYgCSgCKCEEQQFGBEAgACABIAYbIQcgASAAIAYbIQggCQwDCyABIAAgBhshByAAIAEgBhshCCAJDAILIAQoAiQgBiAIIAcQvQMhBiAJKAIoIQRBAUYEQCABIAAgBhshByAAIAEgBhshCCAJDAILIAAgASAGGyEHIAEgACAGGyEIIAkMAQsgBSgCFCAAELwDIQkgBygCKCEHIAQoAighCCAGKAIoIQYCfyAAKwMIIAQrAxBhBEAgBCgCICAGIAggBxC9AyEGIAkoAighBEECRgRAIAAgASAGGyEIIAEgACAGGwwCCyABIAAgBhshCCAAIAEg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QUBrJAALIwEBfyMAQRBrIgEkACABIAA2AgwgAUEMahCRByABQRBqJAALxQIBCH8jAEEgayICJAACQCAAIAJBHGoQmgUiAEUNACACKAIcIgVBAEwNAANAIAAtAAAiA0UNASADQS1HBEAgAEEBaiEADAELCyACQgA3AxAgAkIANwMIIABBAWohBkEAIQMDQCAEIAVIBEAgAyAGaiIHLAAAIggEQCACQQhqIAgQ+woCQCAHLQAAQdwARgRAIANFDQEgACADai0AAEHcAEcNAQsgBEEBaiEECyADQQFqIQMMAgUgAkEIahBfQQAhBAwDCwALCyABIwBBEGsiASQAAkAgAkEIaiIAECcEQCAAIAAQJCIFEMwCIgQNASABIAVBAWo2AgBBuPwIKAIAQdPzAyABEB4aECgACyAAQQAQ+wogACgCACEECyAAQgA3AgAgAEIANwIIIAFBEGokACAENgIAIAMgBmohBAsgAkEgaiQAIAQLVAEDfyMAQRBrIgEkAEHo5AooAgACQCAARQ0AIAAQqgEiAg0AIAEgABA8QQFqNgIAQbj8CCgCAEHT8wMgARAeGhAoAAtB6OQKIAI2AgAgAUEQaiQACw8AIAAgACgCACgCJBECAAsRACAAIAEgASgCACgCIBEDAAsRACAAIAEgASgCACgCLBEDAAsMACAAQYKGgCA2AAALEQAgABBCIAAQI0ECdGoQngcLDQAgACgCACABKAIARwsOACAAEEIgABAjahCeBwsWACAAIAEgAiADIAAoAgAoAiARBgAaCw4AIAAoAghB/////wdxC4ABAQJ/IwBBEGsiBCQAIwBBIGsiAyQAIANBGGogASABIAJBAnRqELIFIANBEGogAygCGCADKAIcIAAQ5AsgAyABIAMoAhAQsQU2AgwgAyAAIAMoAhQQqAM2AgggBEEIaiADQQxqIANBCGoQ/QEgA0EgaiQAIAQoAgwaIARBEGokAAtFAQF/IwBBEGsiBSQAIAUgASACIAMgBEKAgICAgICAgIB/hRC3ASAFKQMAIQEgACAFKQMINwMIIAAgATcDACAFQRBqJAALtQEBA38jAEEgayIDJAACQAJAIAEsAAAiAgRAIAEtAAENAQsgACACEMEFIQEMAQsgA0EAQSAQMxogAS0AACICBEADQCADIAJBA3ZBHHFqIgQgBCgCAEEBIAJ0cjYCACAB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IAJBBHRqIgMgAUEQayICQQhqKQMANwMIIAMgAikDADcDACAAIBEgEyAEEEMgERAYIA8gAikDCDcDKCAPIAIpAwA3AyAgDyABKQMYNwM4IA8gASkDEDcDMCAPIA8rAzAgDysDICABKwMAoaA5A0AgDyAPKwM4IA8rAyggASsDCKGgOQNIIAAgD0EwakECEDkgDyAPKQNINwM4IA8gDykDQDcDMCAAIA9BIGpBAhA5DBoFIBEgA0EEdCISaiIUIAEgEmoiEikDADcDACAUIBIpAwg3AwggA0EBaiEDDAELAAsACyACQQJqIgNBEBAZIgIgASkDCDcDCCACIAEpAwA3AwAgAiAQKQMgNwMQIAIgECkDKDcDGCACIBArAyAgECsDMCIGIBArA0ChRAAAAAAAAAhAoyIHoDkDICAQKwMoIQggECsDSCEJIBArAzghBSACIAYgB6A5AzAgAiAFIAUgCaFEAAAAAAAACECjIgWgOQM4IAIgCCAFoDkDKEEEIAMgA0EETRshESABQSBrIRNBBCEBA0AgASARRgRAIAAgAiADIAQQQyACEBggDyAQKQM4NwMoIA8gECkDMDcDICAPIBApAyg3AzggDyAQKQMgNwMwIAAgD0EgakECEDkMGQUgAiABQQR0IhJqIhQgEiATaiISKQMANwMAIBQgEikDCDcDCCABQQFqIQEMAQsACwALIAJBA2oiA0EQEBkiAiABQQhqKQMANwMIIAIgASkDADcDACACIAErAwAiBSAFIBArAxChIgZEAAAAAAAA0L+ioDkDECABKwMIIQggECsDSCEJIAIgECsDOCIHOQM4IAIgBSAGRAAAAAAAAALAoqA5AzAgAiAFIAYgBqChOQMgIAIgCCAHIAmhRAAAAAAAAAhAo6AiBTkDKCACIAU5AxggECsDMCEFIAIgBzkDSCACIAU5A0BBBCADIANBBE0bIREgAUEwayETQQQhAQNAIAEgEUYEQCAAIAIgAyAEEEMgAhAYDBgFIAIgAUEEdCISaiIUIBIgE2oiEikDADcDACAUIBIpAwg3AwggAUEBaiEBDAELAAsACyACQQRHDRtBBkEQEBkiAiABKQMINwMIIAIgASkDADcDACACIBApAyg3AxggAiAQKQMgNwMQIAIgECkDSDcDKCACIBApA0A3AyAgAiABKQMoNwM4IAIgASkDIDcDMCAC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AEcEQCACQbQBRg0BIAJBjgJGDQJBipYDQbDEAUGWAUHqiwEQAAALIAErAwghAyAAIAErAwA5AwggACADmjkDAA8LIAAgASsDADkDACAAIAErAwiaOQMIDwsgASsDCCEDIAAgASsDADkDCCAAIAM5AwAPCyAAIAEpAwA3AwAgACABKQMINwMICwoAIABBCGoQ2AMLDQAgACgCACABQQJ0agsZACAAEKgBBEAgACABEL8BDwsgACABENQBC2EBAX8jAEEQayICJAAgAiAANgIMAkAgACABRg0AA0AgAiABQQFrIgE2AgggACABTw0BIAIoAgwgAigCCBCyCyACIAIoAgxBAWoiADYCDCACKAIIIQEMAAsACyACQRBqJAALsQEBA38jAEEQayIHJAACQAJAIABFDQAgBCgCDCEGIAIgAWtBAnUiCEEASgRAIAAgASAIEOQDIAhHDQELIAYgAyABa0ECdSIBa0EAIAEgBkgbIgFBAEoEQCAAIAdBBGogASAFELsLIgUQQiABEOQDIQYgBRB3GiABIAZHDQELIAMgAmtBAnUiAUEASgRAIAAgAiABEOQDIAFHDQELIAQQvwsMAQtBACEACyAHQRBqJAAgAAuoAQEDfyMAQRBrIgckAAJAAkAgAEUNACAEKAIMIQYgAiABayIIQQBKBEAgACABIAgQ5AMgCEcNAQsgBiADIAFrIgFrQQAgASAGSBsiAUEASgRAIAAgB0EEaiABIAUQwAsiBRBCIAEQ5AMhBiAFEDQaIAEgBkcNAQsgAyACayIBQQBKBEAgACACIAEQ5AMgAUcNAQsgBBC/CwwBC0EAIQALIAdBEGokACAACw4AIAAgASgCADYCACAACwoAIAAgASAAa2oLCwAgAC0AC0H/AHEL6QEBBH8jAEEQayIEJAAgABBGIgMgAWoiASADQQF0QYAIIAMbIgIgASACSxshASAAECQhBQJAAkACQCAALQAPQf8BRgRAIANBf0YNAiAAKAIAIQIgAUUEQCACEBhBACECDAILIAIgARA6IgJFDQMgASADTQ0BIAIgA2pBACABIANrEDMaDAELIAFBARAZIgIgACAFEB8aIAAgBTYCBAsgAEH/AToADyAAIAE2AgggACACNgIAIARBEGokAA8LQd/JA0GYhQFBzQBB77oBEAAACyAEIAE2AgBBuPwIKAIAQdPzAyAEEB4aECgACwgAIABB/wFxC1ABAX4CQCADQcAAcQRAIAIgA0FAaq2IIQFCACECDAELIANFDQAgAkHAACADa62GIAEgA60iBIiEIQEgAiAEiCECCyAAIAE3AwAgACACNwMIC9sBAgF/An5BASEEAkAgAEIAUiABQv///////////wCDIgVCgICAgICAwP//AFYgBUKAgICAgIDA//8AURsNACACQgBSIANC////////////AIMiBkKAgICAgIDA//8AViAGQoCAgICAgMD//wBRGw0AIAAgAoQgBSAGhIRQBEBBAA8LIAEgA4NCAFkEQCAAIAJUIAEgA1MgASADURsEQEF/DwsgACAChSABIAOFhEIAUg8LIAAgAlYgASADVSABIANRGwRAQX8PCyAAIAKFIAEgA4WEQgBSIQQLIAQLFgAgAEUEQEEADwtB4I8LIAA2AgBBfwsLACAAIAEgAhEAAAtkAQJ/IwBBEGsiAyQAAkAgAEEAELUCIgBFDQACQAJAAkACQCABDgQAAQICAwsgACgCECECDAMLIAAoAgghAgwCCyAAKAIMIQIMAQsgAyABNgIAQeHOBCADEDYLIANBEGokACACC6QBAgN/AnwjAEEQayICJAAgABDDAiAAKAIQIgErAxhEAAAAAAAAUkCjIQQgASsDEEQAAAAAAABSQKMhBSAAEBshAQNAIAEEQCABKAIQKAKUASIDIAMrAwAgBaE5AwAgAyADKwMIIAShOQMIIAAgARAcIQEMAQsLIAIgACgCECIBKQMYNwMIIAIgASkDEDcDACAAIAIQgQ0gAEEBENgFIAJBEGokAAsPACABQQFqIAAgABCwAZ8LqAECBH8CfCABKAIAIQIgAEEEaiIDIQAgAyEBA0AgACgCACIABEAgACgCECIEKwMIIgYgAisDCCIHYwRAIABBBGohAAwCBSAAIAEgACACIARLIgQbIAYgB2QiBRshASAAIAAgBEECdGogBRshAAwCCwALCwJAAkAgASADRg0AIAIrAwgiBiABKAIQIgArAwgiB2MNACAAIAJNIAYgB2RyDQELIAMhAQsgAQtkAQF/IwBBEGsiBCQAIABBADsBHCAAQQA2AhggACADOQMIIAAgAjYCBCAAIAE2AgAgBCAANgIMIAFBNGogBEEMahDBASAAKAIEIAQgADYCCEEoaiAEQQhqEMEBIARB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BCgCECgClAEiBSsDADkDCCADIAUrAwg5AxAgA0EoaiAEIBYgFCAJER8ARQRAIANBATYCHCADIAc2AhggA0IANwNYIAMgBDYCACAHQQFqIQcgACAEEBwhBAwBCwtByIULKAIAEBhByIULQQA2AgAQmA0MAgtBACEHIAJBsANqQQBB0AAQMxogBQRAQciFCygCACEERP///////+9/IRRE////////7/8hGET////////v/yEbRP///////+9/IRkDQCAFIAdGBEBEmpmZmZmZqT8hFgJAIABBwOoAECYiAEUNACAALQAARQ0AIAAQsQIhFgtBkIYLIBsgGyAZoSAWoiIToCIXOQMAQZiGCyAZIBOhIhU5AwBBiIYLIBQgGCAUoSAWoiIToSIUOQMAQYCGCyAYIBOgIhM5AwAgAiAVOQPYAyACIBc5A+gDIAIgFTkDuAMgAiATOQPQAyACIBc5A8gDIAIgFDkD8AMgAiATOQPAAyACIBQ5A+ADIAEoAgAhAEEAEO8HIQkCQAJAIABBAkYEQCAJRQ0CIAJBsANqEJcNQQAhBQNAQciFCygCACEBQZSFCygCACEAQQAhBANAIAAgBEcEQCABIARB4ABsaiIJIAkrAwhEzczMzMzM8D+iOQMIIAkgCSsDEETNzMzMzMzwP6I5AxAgBEEBaiEEDAELCyAFQQFqIgUQ7wcNAAtBjOEKLQAARQ0BIAIgBTYCEEG4/AgoAgBByucDIAJBEGoQHhoMAQsgCUUNASACQbADahCXDUEAIQdBACEEA0AgAkGwA2oiASEAIAcEQCAAEJUNC0GohQtC/////////3c3AwBBoIULQv/////////3/wA3AwACQEGUhQsoAgAiAwRAIAAoAgAhCET////////vfyEURP///////+//IRZBACEAA0AgACADRg0CQaCFCyAUIAggAEECdGooAgAiBSsDABAqIhQ5AwBBqIULIBYgBSsDABAiIhY5AwAgAEEBaiEADAALAAtBlJsDQeDAAUHQAUHFmgEQAAALQbCFCyAIKAIAKwMIOQMAIAggA0ECdGpBBGsoAgArAwghE0HAhQsgFiAUoTkDAEG4hQsgEzkDAEQAAAAAAAAAACEVRAAAAAAAAAAAIRQjAEEwayINJAAQow0QpQ1BAUEQEBkiDEGYhQsoAgBBAnQiADYCBCAMIABBKBAZ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AUH/vwFB1QlBmTUQAAALQZrOAUH/vwFB6AlBmTUQAAALC3oBAX8jAEEQayIEJAAgAwRAIAMgACACIAIQ/AUiAjYCCEGM4QotAAAEQCAEIAI2AgBBuPwIKAIAQb3nAyAEEB4aCyADQQA2AhQgA0EAOgAMIAAgASADEKcIGiADKAIQIARBEGokAA8LQcbkAEGMxQFBhApB8eQAEAAACzwBAn8jAEEQayIBJABBASAAEEciAkUEQCABIAA2AgBBuPwIKAIAQdPzAyABEB4aECgACyABQRBqJAAgAgspAQF/A0AgACIBKAIQKAKwASIADQALA0AgASIAKAIQKAJ4IgENAAsgAAvgAQIIfAF/IAFBIEEYQcyECy0AACIMG2orAwAhBCACIAFBGEEgIAwbaisDACIFOQMYIAIgBDkDECACIAEpAzg3AwAgAiABQUBrKQMANwMIIAIgAisDACAERAAAAAAAAOA/oqEiBjkDACACIAIrAwggBUQAAAAAAADgP6KhIgc5AwggAysDACEIIAMrAwghCSADKwMQIQogACADKwMYIgsgBSAHoCIFIAUgC2MbOQMYIAAgCiAEIAagIgQgBCAKYxs5AxAgACAJIAcgByAJZBs5AwggACAIIAYgBiAIZBs5AwAL6QEBBH8jAEEQayIEJAAgABBGIgMgAWoiASADQQF0QYAIIAMbIgIgASACSxshASAAECQhBQJAAkACQCAALQAPQf8BRgRAIANBf0YNAiAAKAIAIQIgAUUEQCACEBhBACECDAILIAIgARA6IgJFDQMgASADTQ0BIAIgA2pBACABIANrEDMaDAELIAFBARBKIgIgACAFEB8aIAAgBTYCBAsgAEH/AToADyAAIAE2AgggACACNgIAIARBEGokAA8LQd/JA0GYhQFBzQBB77oBEAAACyAEIAE2AgBBuPwIKAIAQdPzAyAEEB4aECgAC3wBAXwgAEEATgRAIAFEAAAAAAAAAABjBEBBAA8LIAFEAAAAAAAA8D9kRSAAuCICRAAAwP///99BIAGjZEVyRQRAQf////8HDwsgASACoiIBmUQAAAAAAADgQWMEQCABqg8LQYCAgIB4DwtB3Z0DQZWEAUHKAEG83wAQAAALEgAgACABQa0kQS1BqsIBEMgBC7ECAQd/IwBBEGsiByQAAkACQCAAKAIIIgYgACgCDCICRwRA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ACADIAI2ArwBQaSECyABNgIAIANBADYCuAEgAQu5AQEDfyAAIABBMGoiAiAAKAIAQQNxQQNGGygCKCgCECIBKALgASABKALkASIBQQFqIAFBAmoQwgEhASAAIAIgACgCAEEDcUEDRhsoAigoAhAgATYC4AEgACACIAAoAgBBA3FBA0YbKAIoKAIQIgEgASgC5AEiA0EBajYC5AEgASgC4AEgA0ECdGogADYCACAAIAIgACgCAEEDcUEDRhsoAigoAhAiACgC4AEgACgC5AFBAnRqQQA2AgALIAAgACABIAIgAEGljwEQJiIABH8gABCRAgVBHgsQug8LTAAgASgCEEHAAWohAQNAIAEoAgAiAQRAIAEoAhAoApgCEBggASgCECgCoAIQGCABKAIQIgFBADYCsAEgAUG4AWohAQwBCwsgABCvDws/AQJ/IAAoAhAoAqgCIQADQCAAIgEoAgwiAEUgACABRnJFBEAgACgCDCICRQ0BIAEgAjYCDCACIQAMAQsLIAELCwAgACABQQEQww8LCwAgACABQQAQww8LugIBB38jAEEQayIHJAACQAJAIAAoAggiBiAAKAIMIgJHBEAgACgCACEDIAAoAgQhBAwBCyAGQQF0QQEgBhsiAkH///8/SwRAQcQAIQAMAgsgACgCACACQQV0EDoiA0UEQEEwIQAMAgsgAyAAKAIMIgVBBXRqQQAgAiAFa0EFdBAzGiAFIAAoAggiBiAAKAIEIgRqSQRAIARBBXQhCCADIAIgBSAEayIFayIEQQV0aiADIAhqIAVBBXQQUxogACAENgIECyAAIAI2AgwgACADNgIACyADIAQgBmogAnBBBXRqIgIgASkDADcDACACIAEpAxg3AxggAiABKQMQNwMQIAIgASkDCDcDCCAAIAAoAghBAWo2AgggB0EQaiQADwsgByAAEHg2AgBBuPwIKAIAQdqKBCAHEB4aECgAC1wAIAEoAgggAk0EQEHCvANB+YIBQQhBqSUQAAALIAAgASgCACABKAIEIAJqIAEoAgxwQQV0aiIBKQMANwMAIAAgASkDGDcDGCAAIAEpAxA3AxAgACABKQMINwMIC9oCAQV8IAEgAEE4bGoiACsAECEDAnwgACsAGCIEIAArAAgiBURIr7ya8td6PqBkRSAAKwAAIgYgA2NFIAQgBURIr7ya8td6vqBjcnFF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5DoQAAALIABBAnRB6M4IaigCAAsXACAAKAIAIgAgASgCACIBSiAAIAFIawu0AgEGfyMAQRBrIgckAAJAIAAgASACEL0DRQRAIAAoAgQgAUEYbGoiACEBAkAgACgCECIGIAAoAhQiAEcEQCABKAIIIQMgASgCDCEEDAELIAZBAXRBASAGGyIAQf////8DSwRAQcQAIQEMAwsgASgCCCAAQQJ0EDoiA0UEQEEwIQEMAwsgAyABKAIUIgVBAnRqQQAgACAFa0ECdBAzGiAFIAEoAhAiBiABKAIMIgRqSQRAIARBAnQhCCADIAAgBSAEayIFayIEQQJ0aiADIAhqIAVBAnQQUxogASAENgIMCyABIAA2AhQgASADNgIICyADIAQgBmogAHBBAnRqIAI2AgAgASABKAIQQQFqNgIQCyAHQRBqJAAPCyAHIAEQeDYCAEG4/AgoAgBB2ooEIAcQHhoQKAALFAAgACABQQJBmilBEUGuhAEQogILngECAn8BfgJAIAEgAkGABCABKAIAEQQAIgVFBEAgACgCECAAKAIAIgVBKGxqIgYgBTYCICAAIAVBAWo2AgAgBiEAIANFDQEgAyAAKAIgQQV0aiIFIAIpAwA3AwggAikDCCEHIAUgADYCACAFIAc3AxAgACAEOgAkIAEgBUEBIAEoAgARBAAaCyAFKAIADwtBgzJB5sUBQagCQdkcEAAAC8sDAgZ8A38jAEEQayIMJAADQAJAAkACQAJAAkAgBCACEDsiCygCAEEBaw4DAgEAAwsgCygCGCAMQRBqJAAPC0EkIQIgACsACCIFIAsrABAiB0RIr7ya8td6PqAiCGQNAiAFIAdESK+8mvLXer6gIgljRSAAKwAAIgogCysACCIGZHENAkEgIQIgBSAHoZlESK+8mvLXej5lRSAKIAahmURIr7ya8td6PmVFcg0CQSQhAiABKwAIIgUgCGQNAkEgQSRBICABKwAAIAZkGyAFIAljGyECDAILIAArAAAhBgJAAkAgACsACCIFIAMgCygCBCINQThsaiICKwAIoZlESK+8mvLXej5lBEAgBiACKwAAoZlESK+8mvLXej5lDQELIAUgAisAGKGZREivvJry13o+ZUUNASAGIAIrABChmURIr7ya8td6PmVFDQELIAUgASsDCKGZREivvJry13o+ZQRAQSBBJCABKwMAIAZj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FEEDdCIAaiAAIAdqKwMAIDWjOQMAIARBAWohFUEAIQBBACEDA0AgAyAURgRAA0AgACAERgRAQQAhAgNAIAIgEkYNBiAFIAJBA3QiAGogACANaisDADkDACACQQFqIQIMAAsABSAHIABBA3QiAmogAiAMaisDADkDACAAQQFqIQAMAQsACwALIA4gBCADayICQQJrIg9BA3QiF2oiESAHIBdqKwMAIjU5AwAgAkEBayECIAUgBCAPbEEDdGohFwNAIAIgBE8EQCARIDUgBSAPIBVsQQN0aisDAKM5AwAgA0EBaiEDDAIFIBEgNSAXIAJBA3QiGGorAwAgDiAYaisDAKKhIjU5AwAgAkEBaiECDAELAAsACwALQcTfCigCABoCQEGEtAFB+N4KEI0BQQBIDQACQEHI3wooAgBBCkYNAEGM3wooAgAiAEGI3wooAgBGDQBBjN8KIABBAWo2AgAgAEEKOgAADAELQfjeCkEKEMAHGgsLIA0QGCAMEBhBACEAA0BBzOEKLwEAIg4gAEsEQEHg4QorAwAhNRDXASE2IABBA3QiAiAKQaABamoiAyADKwMAIDUgNkQAAAAAAADwPyA1oSI1IDWgoqCiIjU5AwAgASgCECgClAEgAmoiAiA1IAIrAwCgOQMAIABBAWohAAwBCwsgCSgCECICIAIoApwBQQFqNgKcASACKAKYASISIAhqKAIAIQ1BACEAA0AgACAORgRAQQAhAwNAIAMgFkcEQAJAIAMgC0YNAEEAIQcgDSgCECgClAEgEiADQQJ0IgRqKAIAKAIQKAKUASAKQfABahCLDiE1A0AgByAORg0BIAdBA3QiACACKAKsASIMIAhqKAIAIARqKAIAaiIUIANBA3QiDyACKAKkASAIaigCAGorAwAgCkHwAWogAGorAwAiNiA2IAIoAqABIAhqKAIAIA9qKwMAoiA1o6GiIjY5AwAgAigCqAEiDyAIaigCACAAaiIRIDYgESsDAKA5AwAgBCAMaigCACAIaigCACAAaiIMKwMAITYgDCAUKwMAmiI3OQMAIAQgD2ooAgAgAGoiACA3IDahIAArAwCgOQMAIAdBAWohBwwACwALIANBAWohAwwBCwtBhOUKKAIABEBBACEAQczhCi8BACECRAAAAAAAAAAAITYDQCAAIAJHBEAgNiAKQaABaiAAQQN0aisDAJmgITYgAEEBaiEADAELCyABECAhACAKIDafOQM4IAogADYCMCATQcCuBCAKQTBqEDILIAUQGAwFBSACKAKoASAIaigCACAAQQN0akIANwMAIABBAWohAAwBCwALAAsgA0EBaiEDDAALAAsLQQAhAEGM4QotAAAEQEEBIAYgBkEBTBtBAWshBUHM4QovAQAhB0QAAAAAAAAAACE1A0AgACAFRwRAIAkoAhAiAigCmAEiCCAAQQJ0IgRqKAIAIRYgAEEBaiIBIQMDQCADIAZGBEAgASEADAMFIAggA0ECdGooAgAhC0EAIQBEAAAAAAAAAAAhNgNAIAAgB0cEQCAAQQN0Ig4gFigCECgClAFqKwMAIAsoAhAoApQBIA5qKwMAoSI3IDeiIDagITYgAEEBaiEADAELCyADQQN0IgAgAigCpAEgBGooAgBqKwMAIAIoAqABIARqKAIAIABqKwMAIjdEAAAAAAAAAMCiIDafoiA3IDeiIDagoKIgNaAhNSADQQFqIQMMAQsACwALCyAKIDU5AyAgE0H4jgEgCkEgahAyQcjhCigCACEBIAkoAhAoApwBIQAgChCQATkDGCAKIAA2AhAgCkGL0QNB5ooFIAAgAUYbNgIUIBNBs9IEIApBEGoQMgsgCSgCECgCnAEiAEHI4QooAgBGBEAgCiAJECA2AgQgCiAANgIAQbGBBCAKECsLIApBwAJqJAALIBBB0AFqJAAPC0GiuwNB24EBQcIAQd8jEAAAC4QBAQN/IwBBkAhrIgIkAAJAQczhCi8BAEEDSQ0AQejiCigCAEUNACAAEBshAQNAIAFFDQEgAiABKAIQKAKUASsDEEQAAAAAAABSQKI5AwAgAkEQaiIDQYAIQbaMASACEKEBGiABQejiCigCACADEHIgACABEBwhAQwACwALIAJBkAhqJAALpSECEn8KfCMAQfAAayIIJABBoOEKKwMAIRoCQAJAQZjhCigCAARAQaDhCkKAgICAgICAqcAANwMAIAAQ9gwgABDgByMAQZABayIEJAAgACIDQQBB498AQQAQISEHIABBAEGIyQFBABAhIQIgAEGqmgEQJhBqIRIgAkUEQCAAQQBBiMkBQeaKBRAhIQILIANBABCPDhoCQAJAA0AgAygCECgCmAEgAUECdGooAgAiAARAIAAoAhAiBi0AhwEEfyAGBSAAECBBvz0QxwJFDQMgACgCEAsoAnwiBgRAIAAgBkHI3wAQuwQLIAFBAWohAQwBCwsgAyAHIAIQ+QwCQCADELoCRQRAQQIhBwwBC0EAIQcgA0ECQd8wQQAQISIJRQ0AQZjhCigCAEECSA0AIAMQGyEKA0AgCgRAIAMgChAtIQYDQCAGBEACQCAGIAkQQSIBLQAARQ0AIAYgBEH8AGogBEH4AGoQ/QZEAAAAAAAAAAAhE0EAIQxEAAAAAAAAAAAhFUQAAAAAAAAAACEWRAAAAAAAAAAAIRRBACENA0AgBCAEQYwBajYCSCAEIARBgAFqNgJEIAQgBEHYAGo2AkAgAUHu8AAgBEFAaxBPQQJGBEBBASENIAQrA4ABIRUgASAEKAKMAWohASAEKwNYIRMLIAQgBEGMAWo2AjggBCAEQYABajYCNCAEIARB2ABqNgIwQQAhAiABQfrwACAEQTBqEE9BAkYEQEEBIQwgBCsDgAEhFCAEKwNYIRYgASAEKAKMAWohAQsgASEAA0ACQAJAAkACQCAALQAAIgcODgMCAgICAgICAgEBAQEBAAsgB0EgRw0BCyAAQQFqIQAMAgsgAkEBaiECA0ACQAJAIAdB/wFxIgcODgMBAQEBAQEBAQQEBAQEAAsgB0EgRg0DIAdBO0YNAgsgAC0AASEHIABBAWohAAwACwALCyACQQNwQQFGIAJBBE5xRQRAIAYQiAVBvIYLLQAAQbyGC0EBOgAAQQFxDQIgBkEwQQAgBigCAEEDcUEDRxtqKAIoECAhACAEIAZBUEEAIAYoAgBBA3FBAkcbaigCKBAgNgIkIAQgADYCIEG47QMgBEEgahArDAILIAJBEBAZIgshACACIQcDQCAHBEAgBCAEQYwBajYCGCAEIARBgAFqNgIUIAQgBEHYAGo2AhAgAUH98AAgBEEQahBPQQFMBEBBvIYLLQAAQbyGC0EBOgAAQQFxRQRAIAZBMEEAIAYoAgBBA3FBA0cbaigCKBAgIQAgBCAGQVBBACAGKAIAQQNxQQJHG2ooAigQIDYCBCAEIAA2AgBBv/YEIAQQKwsgCxAYIAYQiAUMBAUgBCgCjAEhDiAAIAQrA1g5AwAgACAEKwOAATkDCCAHQQFrIQcgAEEQaiEAIAEgDmohAQwCCwALCwNAIAEtAAAiDkEJayIAQRdLQQEgAHRBn4CABHFFckUEQCABQQFqIQEMAQsLIAYgAhD/BiEHIA0EQCAEKAJ8IQAgByAVOQMYIAcgEzkDECAHIAA2AggLIAwEQCAEKAJ4IQAgByAUOQMoIAcgFjkDICAHIAA2AgwLIAFBAWohAUEAIQADQCAAIAJHBEAgAEEEdCIPIAcoAgBqIhAgCyAPaiIPKQMANwMAIBAgDykDCDcDCCAAQQFqIQAMAQsLIAsQGCAODQALIAYoAhAiACgCYCIBBEAgBiABQePfABC7BCAGKAIQIQALIAAoAmwiAQRAIAYgAUHI3wAQuwQgBigCECEACyAAKAJkIgEEfyAGIAFB3t8AELsEIAYoAhAFIAALKAJoIgAEQCAGIABB1t8AELsECyAFQQFqIQULIAMgBhAwIQYMAQsLIAMgChAcIQoMAQsLIAVFBEBBACEHDAELQQJBASADELoCIAVGGyEHC0EAIQZBACECIAMoAhAoAggiACgCWCIMBEAgAEEANgJUQQEhAgsCQCAMDQBBmOEKKAIAQQFHDQAgAxDABEUNAEEBIQYgAygCECgCDCIARQ0AIABBADoAUQsgAxDDAiAMBEAgAygCECEKRAAAAAAAAAAAIRVEAAAAAAAAAAAhFkEAIQ1BACEOQQAhDyMAQUBqIgUkACADKAIQIgAoApABIRAgBEHYAGoiASAAKQMQNwMAIAEgACkDKDcDGCABIAApAyA3AxAgASAAKQMYNwMIAkAgACgCCCgCWCILRQ0AAkAgASsDACABKwMQYg0AIAErAwggASsDGGINACABQv////////93NwMYIAFC//////////f/ADcDACABQv/////////3/wA3AwggAUL/////////dzcDEAsgCygCCCEAA0AgDSALKAIATw0BIAVCADcDOCAFQgA3AzAgBUIANwMoIAVCADcDIAJAAkACQAJAAkACQAJAAkAgACgCAA4QAAABAQICAwQHBwUHBwcHBgcLIAAgACsDECIXIAArAyAiGKAiEzkDaCAAIAArAwgiGyAAKwMYIhygIhQ5A2AgACAXIBihIhc5A1ggACAbIByhIhg5A1AgASABKwMAIBgQKiAUECo5AwAgASABKwMYIBcQIiATECI5AxggASABKwMIIBcQKiATECo5AwggASABKwMQIBgQIiAUECI5AxAMBgsgBSAAKAIMIAAoAgggARDABiAAIAUpAxg3A2ggACAFKQMQNwNgIAAgBSkDCDcDWCAAIAUpAwA3A1AMBQsgBSAAKAIMIAAoAgggARDABiAAIAUpAxg3A2ggACAFKQMQNwNgIAAgBSkDCDcDWCAAIAUpAwA3A1AMBAsgBSAAKAIMIAAoAgggARDABiAAIAUpAxg3A2ggACAFKQMQNwNgIAAgBSkDCDcDWCAAIAUpAwA3A1AMAwsgAEE4EI8DNgJwIAAoAigQZiEJIAAoAnAiESAJNgIAIBEgACgCGEH0yQhqLQAAOgAwIAUgGTkDMCAFIA42AiAgBSAFKAI4QYB/cSAPQf8AcXI2AjggECgCiAEiCSAFQSBqQQEgCSgCABEEACEJIAAoAnAiESAJNgIEIAUgECAREIwHIAArAwghEyAAKAJwIgkrAyghFyAJKwMgIRQCQAJAAkACQCAJLQAwQewAaw4HAAMBAwMDAgMLIBMgFKAhFiATIRUMAgsgEyAURAAAAAAAAOA/oiIVoCEWIBMgFaEhFQwBCyATIBShIRUgEyEWCyAAKwMQIRMgCSsDECEUIAAgFjkDYCAAIBU5A1AgACATIBSgIhM5A2ggACATIBehIhQ5A1ggASABKwMQIBUQIiAWECI5AxAgASABKwMYIBQQIiATECI5AxggASABKwMAIBUQKiAWECo5AwAgASABKwMIIBQQKiATECo5AwggCygCDA0CIAtBkwI2AgwMAgsgACgCECEOIAArAwghGQwBCyAAKAIIIQ8LIA1BAWohDSAAQfgAaiEADAALAAsgBUFAayQAIAogBCkDcDcDKCAKIAQpA2g3AyAgCiAEKQNgNwMYIAogBCkDWDcDEAsCQCAMIBJyDQAgAygCECIAKwMQRAAAAAAAAAAAYQRAIAArAxhEAAAAAAAAAABhDQELIAMQgw0LIAMQ7QchAAJAAkAgB0UNACAAIAZyQQFGBEAgAxAbIQEDQCABRQ0CIAMgARAtIQADQCAABEAgABCIBSAAKAIQKAJgEL4BIAAoAhAoAmwQvgEgACgCECgCZBC+ASAAKAIQKAJoEL4BIAMgABAwIQAMAQsLIAMgARAcIQEMAAsACyAHQQJGDQELIANBABDYBQwCC0HQ4QpBATYCAAwBCyAAECAhACAEIAMQIDYCVCAEIAA2AlBBvJMEIARB0ABqEDZBfyECCyAEQZABaiQAIAJBAE4EQCADQQAQggYMAgtBsqIEQQAQggEMAgsgAEGqmgEQJhBqIQRBoOEKIAAQuQo5AwAgABD2DAJ/IABB6KYBECYiAwRAQQEhAUEBIANB5ooFEGUNARpBACEBQQAgA0Ge3gEQZQ0BGkEBIQFBASADQek8EGUNARpBBCADQc6vARBlDQEaQQIgA0GHPxBlDQEaQQMgA0H04AAQZQ0BGiAIIAAQIDYCJCAIIAM2AiBB2MIEIAhBIGoQKwtBASEBQQELIQYgACAIQThqEJoNAkAgAEH79QAQJiIDRQ0AIANB5ooFEGUNACADQYghEGUEQEEBIQcMAQsgA0GfIhBlBEBBAiEHDAELIANB3v4AEGUNACADQaE3EGUEQCAAQQJBjuwAQQAQIQRAQQMhBwwCCyAIIAAQIDYCAEG/mAQgCBArQZjqBEEAEIIBDAELIAggABAgNgIUIAggAzYCEEGawgQgCEEQahArCyAAQQAgCEHQAGoQpwghAkG4hgsgAEF/QQgQ/AUiAzYCAAJAAkACQAJAIAJFBEAgAUUgA0EATnINAUG4hgtBCDYCACAIQQI2AmAMAgsgA0EATg0BQbiGC0EINgIADAELIAhBAjYCYCADQQBIDQELQQAhAyMAQdAAayICJAAgAkIANwNIIAJCADcDQAJ/IAAQOEUEQCAIQQA2AjRBAAwBCyACQgA3AyAgAkIANwMwIAJCADcDGCACQgA3AyggAkGyAzYCPCACQbMDNgI4IAAQGyEBA0AgAQRAIAEoAhBBADYCsAEgACABEBwhAQwBCwsgABAbIQEDQCABBEACQCABQX8gAigCPBEAAA0AIAEoAhAtAIcBQQNHDQAgA0UEQCACQUBrIgNB5b8BEPoFIAIgAigCIDYCECADIAJBEGoQ+QUgACADEPgFQQEQlgEiA0GsK0GYAkEBEDUaIAJBGGogAxBVQQEhBQsgACABIAMgAkEoahD3BRoLIAAgARAcIQEMAQsLIAAQGyEBA0AgAQRAIAFBfyACKAI8EQAARQRAIAJBQGsiA0HlvwEQ+gUgAiACKAIgNgIAIAMgAhD5BSAAIAMQ+AVBARCWASIDQawrQZgCQQEQNRogACABIAMgAkEoahD3BRogAkEYaiADEFULIAAgARAcIQEMAQsLIAJBKGoQpgggAkFAaxBfIAggAigCIDYCNCAIIAU6ADMgAkEYahClCAshAyACQdAAaiQAAkAgCCgCNCICQQJPBEBBACEBAkADQCABIAJPBEAgCC0AM0UEQEEAIQEMAwsFIAMgAUECdGooAgAiAkEAELYDGiAAIAIgBiAHIAhBOGoiBRDfByACIAUQ9QMaIAJBAhCLAgJAIAQEQCACEN4HDAELIAIQsQMLIAFBAWohASAIKAI0IQIMAQsLIAJBARAZIgFBAToAACAIKAI0IQILIAggATYCZCAIQQE6AFwgCEG4hgsoAgA2AlggAiADIAAgCEHQAGoQoA4aIAEQGAwBCyAAIAAgBiAHIAhBOGoiARDfByAAIAEQ9QMaIAQEQCAAEN4HDAELIAAQsQMLIAAQwwIgABDgB0EAIQIDQCAIKAI0IAJNBEAgAxAYIAAQNxB6IQIDQCACRQ0EIAIQxwEEQCACQawrQZgCQQEQNRogACACEIwGIAIQwwILIAIQeSECDAALAAUgAyACQQJ0aigCACIBEI0OIAFBrCsQ4wEgACABELoBIAJBAWohAgwBCwALAAsgACAAIAYgByAIQThqIgMQ3wcgACADEPUDGiAAEOAHIAQEQCAAEN4HDAELIAAQsQMLIAAgBEEBcxCCBgtBoOEKIBo5AwALIAhB8ABqJAALhwIBA38jAEHQAGsiAyQAAkAgAEHjHBAmIgRFDQAgBCwAACIFRQ0AAkACQCAFQV9xQcEAa0EZTQRAIARB/4sBEMcCBEBBACEBDAQLIARBjMEAEMcCBEBBASEBDAQLIARBrvIAEMcCRQ0BIARBBmohBAwCCyABQQJGIAVBMGtBCklyDQEMAgsgAUECRw0BCwJAIAQsAABBMGtBCU0EQCADIANBzABqNgIQIARB664BIANBEGoQT0EASg0BCyADENYBp0EqcyIBNgJMIAMgAaw3AwAgA0EjaiIBQSlByq4BIAMQoQEaIABB4xwgARDrAQsgAiADKAJMNgIAQQIhAQsgA0HQAGokACABC/NLBCR/BHwBfQJ+IwBBsAJrIg4kACAHQQBOBEBBjOEKLQAABEBBsOYKEK4BCwJAAkACfyAGQQJGBEBBjOEKLQAABEBB0vUAQRhBAUG4/AgoAgAQTBoLIAAgARDlBwwBCwJAAkAgBkEBaw4DAAMBAwsgACABEOgHIh0NA0GOmARBABArQdHqBEEAEIIBDAILQYzhCi0AAARAQev1AEEVQQFBuPwIKAIAEEwaCyAAIAEQ5wcLIh0NAQtBjOEKLQAABEBBujNBGkEBQbj8CCgCABBMGgsgACgCCARAIAAgARDmByEdDAELIAAgARDXBSEdC0GM4QotAAAEQCAOEJABOQOQAkG4/AgoAgAiCEHG0wQgDkGQAmoQMkH5MEEZQQEgCBBMGkGw5goQrgELIAVBA3EhIgJAAkACQAJ/IAVBBHFFIAFBAkhyRQRAQTIgASABQTJPGyIIQQQQGSEVIAEgCGxBCBAZIQlBACEFA0AgBSAIRwRAIBUgBUECdGogCSABIAVsQQN0ajYCACAFQQFqIQUMAQsLQQAhBSAOQQA2AqwCIAZBAkYhDSABQTIgCEEBdCIJIAlBMk0bIgkgASAJSRsiCSABbBDAASELIAEQwAEhFCAAIhYoAgghGyAOIAkQwAEiEjYCrAJBACEAIAlBACAJQQBKGyEKA0AgACAKRwRAIBIgAEECdGogCyAAIAFsQQJ0ajYCACAAQQFqIQAMAQsLIA0EQCAWIAEQ+wcLEKsBIAFvIQsgEigCACEAAkAgDQRAIAsgFiABIAAQwgQMAQsgCyAWIAEgABD2AwtBACEAIAFBACABQQBKGyERQQAhCgNAIAAgEUYEQEEBIAkgCUEBTBshGEEBIQ8DQCAPIBhHBEAgEiAPQQJ0aiITKAIAIQACQCANBEAgCyAWIAEgABDCBAwBCyALIBYgASAAEPYDC0EAIQBBACEKA0AgACARRwRAIBQgAEECdCIQaiIXIBcoAgAiFyATKAIAIBBqKAIAIhAgECAXShsiEDYCACAQIAogCiAQSCIQGyEKIAAgCyAQGyELIABBAWohAAwBCwsgD0EBaiEPDAELCyAUEBggDQRAIBYgASAbEPoHCwUgFCAAQQJ0Ig9qIBIoAgAgD2ooAgAiDzYCACAPIAogCiAPSCIPGyEKIAAgCyAPGyELIABBAWohAAwBCwsgDigCrAIhD0EAIQsgCUEAIAlBAEobIRIgAUEAIAFBAEobIQogAbchLQNAIAsgEkcEQCAPIAtBAnRqIQ1EAAAAAAAAAAAhLEEAIQADQCAAIApHBEAgLCANKAIAIABBAnRqKAIAt6AhLCAAQQFqIQAMAQsLAn8gLCAtoyIsmUQAAAAAAADgQWMEQCAsqgwBC0GAgICAeAshFEEAIQADQCAAIApHBEAgDSgCACAAQQJ0aiIRIBEoAgAgFGs2AgAgAEEBaiEADAELCyALQQFqIQsMAQsLIA4oAqwCIRJBACELIAgiAEEAIAhBAEobIREgCEEEEBkhDwNAIAsgEUcEQCAPIAtBAnRqIAlBCBAZNgIAIAtBAWohCwwBCwtBACELIAlBACAJQQBKGyEQIABBCBAZIRsgCUEEEBkhDSAJIAlsQQgQGSEIIAlBA3QhCgNAIAsgEEYEQEEAIQggAUEAIAFBAEobIRhBASEUA0AgCCAQRwRAIBIgCEECdCILaiETIAsgDWooAgAhF0EAIQoDQCAKIBRHBEAgEiAKQQJ0IhxqIR9EAAAAAAAAAAAhLEEAIQsDQCALIBhHBEAgLCALQQJ0Ih4gHygCAGooAgAgEygCACAeaigCAGy3oCEsIAtBAWohCwwBCwsgDSAcaigCACAIQQN0aiAsOQMAIBcgCkEDdGogLDkDACAKQQFqIQoMAQsLIBRBAWohFCAIQQFqIQgMAQsLIA0gCSAAIA8gGxDJDRpBACEKQQAhCQNAIAkgEUYEQANAIAogEUcEQCAPIApBAnRqKAIAEBggCkEBaiEKDAELCwUgFSAJQQJ0IghqIRQgCCAPaiETQQAhCANARAAAAAAAAAAAISxBACELIAggGEcEQANAIAsgEEcEQCASIAtBAnRqKAIAIAhBAnRqKAIAtyATKAIAIAtBA3RqKwMAoiAsoCEsIAtBAWohCwwBCwsgFCgCACAIQQN0aiAsOQMAIAhBAWohCAwBCwsgCUEBaiEJDAELCyAPEBggGxAYIA0oAgAQGCANEBgFIA0gC0ECdGogCDYCACALQQFqIQsgCCAKaiEIDAELCyAOKAKsAigCABAYIA4oAqwCEBggAUEEEBkhGwNAIAEgBUcEQCAbIAVBAnRqQX82AgAgBUEBaiEFDAELCyAWKAIIISUgBkECRgRAIBYgARD7BwtBACEFIAFBBBAZIQ9BKEEEEBkhHyABQShsQQQQGSEIQShBBBAZIQ0DQCAFQShHBEAgDSAFQQJ0aiAIIAEgBWxBAnRqNgIAIAVBAWohBQwBCwsgGxCrASABbyIIQQJ0akEANgIAIB8gCDYCACANKAIAIRECQCAGQQJGBEAgCCAWIAEgERDCBAwBCyAIIBYgASAREPYDC0EBIQtBACEFA0AgASAFRgRAA0ACQCALQShGBEBBACEFA0AgASAFRg0CIA8gBUECdGpBfzYCACAFQQFqIQUMAAsACyAbIAhBAnRqIAs2AgAgHyALQQJ0IgVqIAg2AgAgBSANaigCACEKAkAgBkECRgRAIAggFiABIAoQwgQMAQsgCCAWIAEgChD2AwtBACEJQQAhBQNAIAEgBUYEQCALQQFqIQsMAwUgDyAFQQJ0IgxqIhIgEigCACISIAogDGooAgAiDCAMIBJKGyIMNgIAAkAgCSAMTgRAIAkgDEcNARCrASAFQQFqbw0BCyAMIQkgBSEICyAFQQFqIQUMAQsACwALCyABQQFrIQkgAUEEEBkhFyABQRAQGSEUQQAhC0EAIQxBACEIQQAhEgNAAn8CQCABIAhHBEAgGyAIQQJ0IhhqKAIAIhNBAEgNASAUIAhBBHRqIgUgCUEEEBkiEDYCBCAJQQQQGSEKIAVBAToADCAFIAk2AgAgBSAKNgIIIA0gE0ECdGohGEEAIQUDQCAFIAhGBEAgCCEFA0AgBSAJRgRAIAkMBgUgECAFQQJ0IhNqIAVBAWoiBTYCACAKIBNqIBgoAgAgBUECdGooAgA2AgAMAQsACwAFIBAgBUECdCITaiAFNgIAIAogE2ogGCgCACATaigCADYCACAFQQFqIQUMAQsACwALIA8QGCAXEBggERAYIA0QGEEAIQsgAUEUEBkhGSABIBJqIgVBBBAZIQkgBUEEEBkhCiAiQQJHIREDQCABIAtHBEAgGSALQRRsaiIIIAo2AgggCCAJNgIEQQEhBSAIIBQgC0EEdGoiCCgCAEEBaiIMNgIAQQEgDCAMQQFNGyEPIAgoAghBBGshEkQAAAAAAAAAACEsAkAgEUUEQANAIAUgD0YNAiAJIAVBAnQiDWogCCgCBCANakEEaygCADYCACAKIA1qQwAAgL8gDSASaigCALIiMCAwlJUiMDgCACAFQQFqIQUgLCAwu6EhLAwACwALA0AgBSAPRg0BIAkgBUECdCINaiAIKAIEIA1qQQRrKAIANgIAIAogDWpDAACAvyANIBJqKAIAspUiMDgCACAFQQFqIQUgLCAwu6EhLAwACwALIAkgCzYCACAKICy2OAIAIAtBAWohCyAKIAxBAnQiBWohCiAFIAlqIQkMAQsLIARBBBAZIhIgACAEbEEIEBkiCDYCAEEBIAQgBEEBTBshCUEBIQUDQCAFIAlGBEBBACEJIARBACAEQQBKGyEYA0AgCSAYRwRAIBIgCUECdGooAgAhDEEAIQUDQCAAIAVHBEAgDCAFQQN0akIANwMAIAVBAWohBQwBCwsgCUEBaiEJDAELCwJAIARBAkcEQEEAIQUDQCAFIBhGDQIgEiAFQQJ0aigCACAFQQN0akKAgICAgICA+D83AwAgBUEBaiEFDAALAAsgCEKAgICAgICA+D83AwAgEigCBCIkIQVBACEKQQAhCyMAQSBrIgwkACAMIAU2AhwgDEEANgIUIAxBADYCECAVKAIAIREgAUECdCEPQQAhBSMAQeAAayIJJAAgCUIANwM4IAlCADcDMAJAIAFBAE4EQCABQQQQGSEeIAFBBBAZISAgAUEEEBkhDSABQQQQGSEQA0AgASAFRgRAQayGCygCAEGwhgsoAgByRQRAQbCGCyARNgIAQayGC0HeAzYCACABQQJPBEAgDSABQQRB3wMQlQELQQAhBUGwhgtBADYCAEGshgtBADYCAANAIAEgBUYEQEEAIQUgCSABQQFrIhNBACABIBNPGyIINgJcIAkgCDYCWCAJIAhBEBAZIhc2AlQCQCABRQ0AA0AgBSATRgRAIBNBAXYhBQNAIAVBf0YNAyAJQdQAaiAFEP0MIAVBAWshBQwACwAFIBEgDSAFQQJ0aigCACIcQQN0aisDACEsIBEgDSAFQQFqIghBAnRqKAIAIhpBA3RqKwMAIS0gFyAFQQR0aiIFIBo2AgQgBSAcNgIAIAUgLSAsoTkDCCAIIQUMAQsACwALQQEgASABQQFNGyEIQQEhBQNAIAUgCEYEQAJAIAFFDQBBACEFA0AgBSATRg0BICAgDSAFQQJ0aigCAEECdGogDSAFQQFqIgVBAnRqKAIANgIADAALAAsFIB4gDSAFQQJ0aiIXKAIAQQJ0aiAXQQRrKAIANgIAIAVBAWohBQwBCwsgD0EAIA9BAEobISYgDUEEaiEnIA1BBGshKEEAIQ9BACEIA0ACQAJAAkACQCAjICZGBEAgCSAINgI8IAkgCzYCOCAJIAo2AjQgCSAPNgIwIAkoAlQhBQwBCyAJKAJUIQUgCSgCWCIaBEAgBSgCACEXIAUoAgQhHCAFIAUgGkEEdGpBEGsiISkDADcDACAFKwMIISwgBSAhKQMINwMIIAkgGkEBazYCWCAJQdQAakEAEP0MQQFBEBAZIhogLDkDCCAaIBw2AgQgGiAXNgIAIAggC0cNAyAIQQF0QQEgCBsiBUH/////A0sEQEHEACEIDAULIA8gBUECdBA6Ig9FBEBBMCEIDAULIA8gCEECdGpBACAFIAhrQQJ0EDMaIAggCmogCE0NAiAKQQJ0ISEgDyAFIAggCmsiCGsiCkECdGogDyAhaiAIQQJ0EFMaDAILIAkgCDYCPCAJIAs2AjggCSAKNgI0IAkgDzYCMAsgHhAYICAQGCANEBggEBAYIAUQGEEAIQggAUEEEBkhDSALQQF0IAFqIhBBBBAZIREgEEEEEBkhBUEAIQoDQCABIApGBEADQCAIIAtGBEBBACEIA0AgCCAQRgRAIAwgAUEUEBkiCjYCGEEAIQgCQANAIAEgCEYEQAJAIA0QGANAIAsEQCAJQTBqIAtBAWsiCxD8DCEIIAkoAjggC00EQEHCvANB/8ABQSdBiCoQAAALIAkgCzYCOCAIKAIEIQUgCCgCACENIAgQGCANQQBIDQIgBUEASA0FIAogDUEUbGoiESgCBCETIBEoAgAhEEEAIQgDQCAIIBBHBEAgCEECdCEXIAhBAWohCCAFIBMgF2ooAgBHDQEMAwsLIBEgEEEBajYCACATIBBBAnRqIAU2AgAgCiAFQRRsaiIFIAUoAgAiCEEBajYCACAFKAIEIAhBAnRqIA02AgAgCigCCEUNASARKAIIIgggCCoCAEMAAIC/kjgCACAFKAIIIgUgBSoCAEMAAIC/kjgCAAwBCwsgDxAYIAlB4ABqJAAMFAsFIAogCEEUbGoiECAFNgIIIBBBATYCACAQIBE2AgQgESAINgIAIAVBADYCACARIA0gCEECdGooAgBBAnQiEGohESAFIBBqIQUgCEEBaiEIDAELC0Gq0QFB/8ABQbQCQaiAARAAAAtBlNEBQf/AAUG1AkGogAEQAAAFIAUgCEECdGpBgICA/AM2AgAgCEEBaiEIDAELAAsABSAJQTBqIAgQ/AwiCigCBCETIA0gCigCAEECdGoiCiAKKAIAQQFqNgIAIA0gE0ECdGoiCiAKKAIAQQFqNgIAIAhBAWohCAwBCwALAAUgDSAKQQJ0akEBNgIAIApBAWohCgwBCwALAAsgBSEICyAPIAogC2ogCHBBAnRqIBo2AgAgECAcQQJ0IilqKAIAIQUCQCAQIBdBAnQiKmooAgAiIUUNACAQICAgKCAhQQJ0aigCACIaQQJ0aiIrKAIAQQJ0aigCACAFTw0AIAkgHDYCRCAJIBo2AkAgCSARIBxBA3RqKwMAIBEgGkEDdGorAwChOQNIIAkgCSkDSDcDKCAJIAkpA0A3AyAgCUHUAGogCUEgahD7DCArIBw2AgAgHiApaiAaNgIACwJAIAUgE08NACAQIB4gJyAFQQJ0aigCACIFQQJ0aiIcKAIAQQJ0aigCACAhTQ0AIAkgBTYCRCAJIBc2AkAgCSARIAVBA3RqKwMAIBEgF0EDdGorAwChOQNIIAkgCSkDSDcDGCAJIAkpA0A3AxAgCUHUAGogCUEQahD7DCAcIBc2AgAgICAqaiAFNgIACyALQQFqIQsgI0EBaiEjDAELCyAJIAgQeDYCAEG4/AgoAgBB2ooEIAkQHhoQKAAFIBAgDSAFQQJ0aigCAEECdGogBTYCACAFQQFqIQUMAQsACwALBSANIAVBAnRqIAU2AgAgBUEBaiEFDAELC0GOtwNBrIIBQRxB5hsQAAALQb2dA0H/wAFBvwJBwoABEAAACyAMKAIYIBUgASAAIAxBFGoQxg0gDCgCFCENIAAgAGxBCBAZIQggDCAAQQQQGSILNgIQQQAhBSAAQQAgAEEAShshCiAAQQN0IQkDQCAFIApGBEBBACEJIABBACAAQQBKGyEPIAFBACABQQBKGyERA0AgCSAKRwRAIAsgCUECdCIFaiEQIAUgFWohE0EAIQgDQEQAAAAAAAAAACEsQQAhBSAIIA9HBEADQCAFIBFHBEAgEygCACAFQQN0aisDACANIAVBAnRqKAIAIAhBAnRqKgIAu6IgLKAhLCAFQQFqIQUMAQsLIBAoAgAgCEEDdGogLDkDACAIQQFqIQgMAQsLIAlBAWohCQwBCwsFIAsgBUECdGogCDYCACAFQQFqIQUgCCAJaiEIDAELCyAMKAIUKAIAEBggDCgCFBAYIAwoAhAgAEEBIAxBHGogDEEIahDJDSAMQSBqJAANAEEAIQUDQCAAIAVHBEAgJCAFQQN0akIANwMAIAVBAWohBQwBCwsgJEKAgICAgICA+D83AwgLQQAhBQNAIAUgGEcEQCAVIAEgACASIAVBAnQiCGooAgAgAiAIaigCABDCDSAFQQFqIQUMAQsLIA5BADYCpAIgDkEANgKoAiAZIBUgASAAIA5BqAJqEMYNIA4oAqgCIQogACAAbEEEEBkhCCAOIABBBBAZIgw2AqQCQQAhBSAAQQAgAEEAShshCwNAIAUgC0YEQEEAIQkgAEEAIABBAEobIQ0gAUEAIAFBAEobIQ8DQCAJIAtHBEAgDCAJQQJ0IgVqIREgBSAVaiEQQQAhCANARAAAAAAAAAAAISxBACEFIAggDUcEQANAIAUgD0cEQCAQKAIAIAVBA3RqKwMAIAogBUECdGooAgAgCEECdGoqAgC7oiAsoCEsIAVBAWohBQwBCwsgESgCACAIQQJ0aiAstjgCACAIQQFqIQgMAQsLIAlBAWohCQwBCwsFIAwgBUECdGogCDYCACAFQQFqIQUgCCAAQQJ0aiEIDAELCyAOKAKoAigCABAYIA4oAqgCEBggAUEIEBkhDCAAQQgQGSELIAIgFCAEIAEgIhD6DCEtQQAhBUEAIQ0DQAJAQQAhCSANQTFLIAVyIhNBAXENAANAIAkgGEcEQCACIAlBAnQiF2ohD0EAIQoDQCABIApHBEAgDCAKQQN0IhxqIghCADcDACAUIApBBHRqKAIIQQRrIR4gGSAKQRRsaiIRKAIIISAgESgCBCEjQQEhBUQAAAAAAAAAACEsA0AgESgCACAFTQRAIAggLCAPKAIAIBxqKwMAoiAIKwMAoDkDACAKQQFqIQoMAwUgAiAEIAogIyAFQQJ0IhBqKAIAIhoQtQ0iLkSgwuv+S0i0OWQEQCAIIBAgIGoqAgCMIBAgHmooAgCylLsgLqMiLiAPKAIAIBpBA3RqKwMAoiAIKwMAoDkDACAsIC6hISwLIAVBAWohBQwBCwALAAsLIBUgACABIAwgCxDHDSAOKAKkAiASIBdqKAIAIgUgCyAARPyp8dJNYlA/IABBABC9DQ0CIBUgASAAIAUgDygCABDCDSAJQQFqIQkMAQsLQQAhBSANQQFxRQRAIAIgFCAEIAEgIhD6DCIsIC2hmSAsRLu919nffNs9oKNBwOEKKwMAYyEFICwhLQsgDUEBaiENDAELCyALEBggDBAYIAZBAkYEQCAWIAEgJRD6BwtBACEFA0AgASAFRwRAIBQgBUEEdGoiAC0ADEEBRgRAIAAoAgQQGCAAKAIIEBgLIAVBAWohBQwBCwsgFBAYIBkoAgQQGCAZKAIIEBggGRAYIBsQGCAfEBggEigCABAYIBIQGCAOKAKkAiIABEAgACgCABAYIA4oAqQCEBgLIBUoAgAQGCAVEBhBACEZIBNBAXFFBEBBfyENQQAhHUEAIRRBACEVQQAhEkEAIQ9BACEIQQAhFgwKCwNAIBggGUYEQEEBDAoFIAIgGUECdGohAEQAAAAAAADwPyEsQQAhBUEAIQwDQCABIAxHBEAgACgCACAMQQN0aisDAJkiLSAsICwgLWMbISwgDEEBaiEMDAELCwNAIAEgBUcEQCAAKAIAIAVBA3RqIgYgBisDACAsozkDACAFQQFqIQUMAQsLQQAhBQNAIAEgBUcEQBDXASEsIAAoAgAgBUEDdGoiBiAsRAAAAAAAAOC/oESN7bWg98awPqIgBisDAKA5AwAgBUEBaiEFDAELCyABIAAoAgAQ0QIgGUEBaiEZDAELAAsABSASIAVBAnRqIAggACAFbEEDdGo2AgAgBUEBaiEFDAELAAsAC0EAIQVBACEKIAxBJ0wEQEEBIQogAUEEEBkhGSABQQQQGSELIAEhDAsgFCAIQQR0aiIQIAs2AgggECAZNgIEIBAgCjoADCAQQSg2AgADfyAFQShGBH8gDEEoayEMIAtBoAFqIQsgGUGgAWohGUEoBSAZIAVBAnQiCmogCiAfaigCADYCACAKIAtqIAogDWooAgAgGGooAgA2AgAgBUEBaiEFDAELCwsgCEEBaiEIIBJqIRIMAAsABSAPIAVBAnQiCWogCSARaigCACIJNgIAIAkgDCAJIAxKIgkbIQwgBSAIIAkbIQggBUEBaiEFDAELAAsACyABIAQgAiADEOkHRQshHkEAIQ1BjOEKLQAABEAgDhCQATkDgAJBuPwIKAIAQZ2/ASAOQYACahAyCyAHRSABQQFGcg0BQQAhCkGM4QotAAAEQCAOEJABOQPwAUG4/AgoAgAiAEHG0wQgDkHwAWoQMkGs6ABBGkEBIAAQTBpBsOYKEK4BCyAEQQAgBEEAShshESABQQAgAUEAShshECAEQQQQGSEWIAEgBGwiDUEEEBkhGQNAIAogEUcEQCAWIApBAnQiAGogGSABIApsQQJ0aiIGNgIAIAAgAmohAEEAIQUDQCAFIBBHBEAgBiAFQQJ0aiAAKAIAIAVBA3RqKwMAtjgCACAFQQFqIQUMAQsLIApBAWohCgwBCwsCQCAiQQFrQQJJBEAgAUEBaiABbEECbSEYIAGyIAFBAWsiBrKUICJBAkYEQCAYIB0QxAQLIBggHRCCCEEAIQogBkEAIAZBAEobIRcgAUEQEBkhFCABIQtBACEFQQAhCANAIAggF0YEQAJAIAEhDEEAIQUDQCAFIBBGDQEgHSAKQQJ0aiAUIAVBBHRqIgApAwAgACkDCBC5BTgCACAKIAxqIQogBUEBaiEFIAxBAWshDAwACwALBSAUIAhBBHRqIQxBASEJIAVBASALIAtBAUwbakEBayEVQgAhMUIAITIDQCAFQQFqIQAgBSAVRwRAIA5B4AFqIB0gAEECdGoqAgAQugUgDkHQAWogMSAyIA4pA+ABIjEgDikD6AEiMhC3ASAOQcABaiAMIAlBBHRqIgUpAwAgBSkDCCAxIDIQ+gIgBSAOKQPAATcDACAFIA4pA8gBNwMIIAlBAWohCSAOKQPYASEyIA4pA9ABITEgACEFDAELCyAOQbABaiAMKQMAIAwpAwggMSAyEPoCIAwgDikDsAE3AwAgDCAOKQO4ATcDCCALQQFrIQsgCEEBaiEIIAAhBQwBCwsgBEEEEBkiFSANQQQQGSIANgIAQQEgBCAEQQFMGyEEQQEhBQNAIAQgBUcEQCAVIAVBAnRqIAAgASAFbEECdGo2AgAgBUEBaiEFDAELC0G4/AgoAgAhGyABQQQQGSESIAFBBBAZIQ8gGEEEEBkhCEGM4QotAAAEQCAOEJABOQOgASAbQcbTBCAOQaABahAyQcbVA0EPQQEgGxBMGkGw5goQrgELIBRBEGohICABQQR0ISNDAAAAP5S7IS5E////////738hLCAiQQJHIRxBACEAQQAhDQNAIABBAXEgByANTHINAiAUQQAgIxAzIR8gHEUEQCAYIB0gCBCBCAsgLCEtQQAhEyAGIQBBACEKQQAhBANAIAQgF0YEQCABIQlBACEMA0BBACEFIAwgEEYEQEEAIQwDQCAMIBFGBEACQEQAAAAAAAAAACEsA0AgBSARRg0BICwgASAWIAVBAnQiAGooAgAgACAVaigCABDQAqAhLCAFQQFqIQUMAAsACwUgCCABIBYgDEECdCIAaigCACAAIBVqKAIAEIQDIAxBAWohDAwBCwsgLCAsoCAuoCEsQQAhBQNAIAUgEUcEQCAdIAEgFiAFQQJ0aiIAKAIAIBIQhAMgBUEBaiEFICwgASAAKAIAIBIQ0AKhISwMAQsLQQAhCkHA4QorAwAiLyAtICyhmSAto2QgLCAvY3IhAAJAA0AgCiARRwRAIBYgCkECdCIEaiIJKAIAIQUCQCAeRQRAIAEgBSASEL8NQQAhBSAdIBIgBCAVaigCACABIAEQwwRBAEgNBANAIAUgEEYNAiADIAVBAnQiBGooAgAoAhAtAIcBQQFNBEAgCSgCACAEaiAEIBJqKgIAOAIACyAFQQFqIQUMAAsACyAdIAUgBCAVaigCACABIAEQwwRBAEgNAwsgCkEBaiEKDAELCwJAIA1BBXANAEGM4QotAABFDQAgDiAsOQMgIBtBvtMDIA5BIGoQMiANQQVqQTJwDQBBCiAbEKwBGgsgDUEBaiENDAULQX8hDQwHBSAIIBNBAnRqIB8gDEEEdGoiACkDACAAKQMIELkFOAIAIAkgE2ohEyAMQQFqIQwgCUEBayEJDAELAAsABSAAQQAgAEEAShshCSABIARBf3NqIgxDAAAAACAPEPcDQQAhCwNAIAsgEUcEQCAWIAtBAnRqIRpBACEFA0AgACAFRwRAIA8gBUECdCIkaiIhIBooAgAgBEECdGoiJSoCACAkICVqKgIEkyIwIDCUICEqAgCSOAIAIAVBAWohBQwBCwsgC0EBaiELDAELCyAMIA8QgAhBACEFA0AgBSAJRwRAIA8gBUECdGoiDCoCACIwQ///f39gIDBDAAAAAF1yBEAgDEEANgIACyAFQQFqIQUMAQsLIApBAWohCiAgIARBBHQiGmohC0IAITFBACEFQgAhMgJAIBxFBEADQCAFIAlGBEAMAwUgCCAKQQJ0aiIMIA8gBUECdGoqAgAgDCoCAJQiMDgCACAOQeAAaiAwELoFIA5B0ABqIDEgMiAOKQNgIjEgDikDaCIyELcBIA5BQGsgCyAFQQR0aiIMKQMAIAwpAwggMSAyEPoCIAwgDikDQDcDACAMIA4pA0g3AwggCkEBaiEKIAVBAWohBSAOKQNYITIgDikDUCExDAELAAsACwNAIAUgCUYNASAIIApBAnRqIA8gBUECdGoqAgAiMDgCACAOQZABaiAwELoFIA5BgAFqIDEgMiAOKQOQASIxIA4pA5gBIjIQtwEgDkHwAGogCyAFQQR0aiIMKQMAIAwpAwggMSAyEPoCIAwgDikDcDcDACAMIA4pA3g3AwggCkEBaiEKIAVBAWohBSAOKQOIASEyIA4pA4ABITEMAAsACyAOQTBqIBogH2oiBSkDACAFKQMIIDEgMhD6AiAFIA4pAzA3AwAgBSAOKQM4NwMIIABBAWshACAEQQFqIQQMAQsACwALAAtB7/MCQYnCAUGyB0GN9QAQAAALQQAhCkGM4QotAAAEQEEBIAEgAUEBTBtBAWshBkQAAAAAAAAAACEtQQAhBANAIAYgCkcEQEEBIAEgAUEBTBshA0EBIQkgBCEAA0AgAyAJRwRAIABBAWohAEQAAAAAAAAAACEsQQAhBQNAIAUgEUcEQCAsIBYgBUECdGooAgAgCkECdGoiByoCACAHIAlBAnRqKgIAkyIwIDCUu6AhLCAFQQFqIQUMAQsLRAAAAAAAAPA/IB0gAEECdGoqAgC7Ii6fIC4gIkECRhujICyfoSIsICyiIC6iIC2gIS0gCUEBaiEJDAELCyABQQFrIQEgCkEBaiEKIAMgBGohBAwBCwsgDhCQATkDECAOIA02AgggDiAtOQMAIBtBztIEIA4QMgtBACEKA0AgCiARRg0BIAIgCkECdCIAaiEBIAAgFmohAEEAIQUDQCAFIBBHBEAgASgCACAFQQN0aiAAKAIAIAVBAnRqKgIAuzkDACAFQQFqIQUMAQsLIApBAWohCgwACwALIBkQGCAWEBggHRAYIBUEQCAVKAIAEBggFRAYCyASEBggDxAYIBQQGAwBCyAdIQgLIAgQGAsgDkGwAmokACANCz4BA38gABAvIQIgACgCECIBBEADQCABKAIEIAIgASgCAEEAEI4BGiABEBgiASAAKAIQRw0ACwsgAEEANgIQC5AEAQt/IAFBACABQQBKGyEIIAAoAgghCQNAIAIgCEZFBEAgACACQRRsaigCACADaiEDIAJBAWohAgwBCwsgA0EEEBkhBCABQQQQGSEGQQAhAwJ/IAAoAghFBEADQCADIAhHBEAgACADQRRsaiIFIAQ2AgggACADIAYQ/QcgBSgCACICQQJrIQogAkEBayELQQEhAgNAIAIgC0sEQCAAIAMgBhD8ByADQQFqIQMgBCAFKAIAQQJ0aiEEDAMFIAQgAkECdCIHaiAKIAAgBSgCBCAHaigCACIHQRRsaigCAGogACAHIAYQ/gdBAXRrszgCACACQQFqIQIMAQsACwALCyAAIAEQ1wUMAQsDQCADIAhHBEAgACADIAYQ/QcgACADQRRsaiIFKAIAIgJBAmshCyACQQFrIQdBASECA0AgAiAHSwRAIAAgAyAGEPwHIAUgBDYCCCADQQFqIQMgBCAFKAIAQQJ0aiEEDAMFIAQgAkECdCIKaiALIAAgBSgCBCAKaigCACIMQRRsaigCAGogACAMIAYQ/gdBAXRrsyAFKAIIIApqKgIAEMkFOAIAIAJBAWohAgwBCwALAAsLIAAgARDmBwsgBhAYIAAoAggQGEEAIQIgAEEANgIIAkAgCUUNAANAIAIgCEYNASAAIAJBFGxqIgMgCTYCCCACQQFqIQIgCSADKAIAQQJ0aiEJDAALAAsL5QMCDX8BfSABQQAgAUEAShshDiABQQFqIAFsQQJtQQQQGSEMIAFBBBAZIQQgASEKA0AgCyAORwRAIAshBkEAIQIjAEEQayIFJAAgBUEANgIEIAFBACABQQBKGyEDIAEQwAEhCQNAIAIgA0YEQCAEIAZBAnRqQQA2AgBBASAAIAZBFGxqIg0oAgAiAyADQQFNGyEHQQEhAgNAIAIgB0YEQCAFQQhqIAYgCSAEIAEQug0DQAJAIAVBCGogBUEEaiAJIAQQuQ1FDQAgBCAFKAIEIgNBAnRqKgIAIg9D//9/f1sNACAAIANBFGxqIQdBASECA0AgAiAHKAIATw0CIAVBCGogAkECdCIDIAcoAgRqKAIAIA8gBygCCCADaioCAJIgCSAEELgNIAJBAWohAgwACwALCyAFKAIIEBggCRAYIAVBEGokAAUgBCACQQJ0IgMgDSgCBGooAgBBAnRqIA0oAgggA2oqAgA4AgAgAkEBaiECDAELCwUgBCACQQJ0akH////7BzYCACACQQFqIQIMAQsLIAggCmohAwNAIAMgCEcEQCAMIAhBAnRqIAQgBkECdGoqAgA4AgAgBkEBaiEGIAhBAWohCAwBCwsgCkEBayEKIAtBAWohCyADIQgMAQsLIAQQGCAMC/8BAwt/AXwCfSMAQRBrIgQkAAJAIAAoAghFBEAMAQsgAUEAIAFBAEobIQogACABEOYHIQUDQCACIApHBEBBASEDQQEgACACQRRsaiIJKAIAIgYgBkEBTRshBiAFIAEgAmwgAiAIaiIIa0ECdGohCwNAIAMgBkYEQCACQQFqIQIMAwUgAiADQQJ0IgwgCSgCBGooAgAiB0wEQCALIAdBAnRqIgcqAgAhDiAHIAkoAgggDGoqAgAiDzgCACANIA4gD5OLu6AhDQsgA0EBaiEDDAELAAsACwtBjOEKLQAARQ0AIAQgDTkDAEG4/AgoAgBBlrUEIAQQMgsgBEEQaiQAIAUL3wQDC38BfAF9IAFBACABQQBKGyEFIAFBAWogAWxBAm1BBBAZIQogASABRAAAAAAAAAAAEIoDIQYgASABRAAAAAAAAAAAEIoDIQsCQCAAKAIIRQRAA0AgAiAFRg0CQQEhA0EBIAAgAkEUbGoiBygCACIEIARBAU0bIQQgBiACQQJ0aiEIA0AgAyAERkUEQCAGIAcoAgQgA0ECdGooAgAiCUECdGooAgAgAkEDdGpCgICAgICAgPi/fzcDACAIKAIAIAlBA3RqQoCAgICAgID4v383AwAgA0EBaiEDDAELCyACQQFqIQIMAAsACwNAIAIgBUYNAUEBIQNBASAAIAJBFGxqIgcoAgAiBCAEQQFNGyEEIAYgAkECdGohCANAIAMgBEYEQCACQQFqIQIMAgUgBiADQQJ0IgkgBygCBGooAgAiDEECdGooAgAgAkEDdGpEAAAAAAAA8L8gBygCCCAJaioCALujIg05AwAgCCgCACAMQQN0aiANOQMAIANBAWohAwwBCwALAAsACwJAIAEgBiALEP4MBEBBACEDIAFBACABQQBKGyEHQQAhAgNAIAIgB0YNAiABIANqIQAgCyACQQJ0aiEEIAIhBQNAIAAgA0ZFBEAgCiADQQJ0aiACIAVHBH0gBCgCACIIIAJBA3RqKwMAIAVBA3QiCSALIAVBAnRqKAIAaisDAKAgCCAJaisDACINIA2gobYFQwAAAAALOAIAIAVBAWohBSADQQFqIQMMAQsLIAFBAWshASACQQFqIQIgACEDDAALAAsgChAYQQAhCgsgBhCJAyALEIkDIAoL0gICCX8BfCAAQQAgAEEAShshCyACKAIEIQYgAigCACEHIAFBA0ghCQNAIAUgC0YEQAJAQQAhBCABQQAgAUEAShshAQNAIAEgBEYNASAAIAIgBEECdGooAgAQ0QIgBEEBaiEEDAALAAsFAkACQCADIAVBAnRqKAIAKAIQIgQtAIcBIgwEQCAHIAQoApQBIgQrAwA5AwAgBiAEKwMIOQMAIAkNASAEQRBqIQhBAiEEA0AgASAERg0CIAIgBEECdGooAgAgBUEDdGogCCsDADkDACAEQQFqIQQgCEEIaiEIDAALAAsgBxDXATkDACAGENcBOQMAQQIhBCAJDQEDQCABIARGDQIQ1wEhDSACIARBAnRqKAIAIAVBA3RqIA05AwAgBEEBaiEEDAALAAtBASAKIAxBAUcbIQoLIAVBAWohBSAHQQhqIQcgBkEIaiEGDAELCyAKCzIAIAAEQCAAKAIEQSFPBEAgACgCABAYCyAAQgA3AgAPC0GT2wFB24EBQfMAQZAiEAAACy8AIAAgATYCBCAAQQA2AgAgAUEhTwRAIAAgAUEDdiABQQdxQQBHakEBEBk2AgALC3gBAn8CQAJAAkAgAQ4EAQAAAAILIAAQGyEDIAFBAUchBANAIANFDQICQCAERQRAIAMgAhDjAQwBCyAAIAMQLSEBA0AgAUUNASABIAIQ4wEgACABEDAhAQwACwALIAAgAxAcIQMMAAsACyAAIABBHCACQQEQzAMaCwvfCQIMfwl8AkAgACgCSCAARw0AIAAoAhAiASgCCCgCVEUNAAJ/AkAgASsDEEQAAAAAAAAAAGINACABKwMYRAAAAAAAAAAAYg0AQQAMAQsgABCDDSAAKAIQIQFBAQshAyABKAJ0QQFxIgQEQCABKwAoIQ4gASABKwAgOQMoIAEgDjkDIAsCQAJ8AkACQAJAIAEoAggiAigCVEEBaw4FAgAFBQEFCyACKwNAIg1EAAAAAAAAAABlDQQgDSABKwMgoyINRAAAAAAAAPA/YyACKwNIIAErAyijIg5EAAAAAAAA8D9jckUNAyANIA5jBEAgDiANoyEORAAAAAAAAPA/IQ0MBAsgDSAOowwCCyACKwNAIg5EAAAAAAAAAABlDQMgDiABKwMgoyIORAAAAAAAAPA/ZEUNAyACKwNIIAErAyijIg1EAAAAAAAA8D9kRQ0DIA4gDRAqIg4hDQwCCyABKwMoIAErAyCjIg4gAisDECINYwRAIA0gDqMhDkQAAAAAAADwPyENDAILIA4gDaMLIQ1EAAAAAAAA8D8hDgsgDiANIAQbIQ8gDSAOIAQbIQ0CQEGY4QooAgBBAkgNACANRAAAAAAAAPC/oCEUIA9EAAAAAAAA8L+gIRUgABAbIQYDQCAGRQ0BIAAgBhAtIQMDQAJAIAMEQCADKAIQIgcoAggiAUUNASABKAIEIghBAWshCUEAIQQgFCADQTBBACADKAIAQQNxIgJBA0cbaigCKCgCECgClAEiBSsDCKJEAAAAAAAAUkCiIRAgFSAFKwMAokQAAAAAAABSQKIhESAUIANBUEEAIAJBAkcbaigCKCgCECgClAEiAisDCKJEAAAAAAAAUkCiIRIgFSACKwMAokQAAAAAAABSQKIhEyABKAIAIQIDQCAEIAhGBEACQCAHKAJgIgFFDQAgAS0AUUEBRw0AIAEgDyABKwM4ojkDOCABIA0gASsDQKI5A0ALAkAgBygCZCIBRQ0AIAEtAFFBAUcNACABIBMgASsDOKA5AzggASASIAErA0CgOQNACyAHKAJoIgFFDQMgAS0AUUEBRw0DIAEgESABKwM4oDkDOCABIBAgASsDQKA5A0AMAwsgAigCBCIKQQFrIQsgAigCACEBQQAhBSAEIAlHIQwDQCAFIApGBEAgAigCCARAIAIgESACKwMQoDkDECACIBAgAisDGKA5AxgLIAIoAgwEQCACIBMgAisDIKA5AyAgAiASIAIrAyigOQMoCyAEQQFqIQQgAkEwaiECDAIFIAECfCAEIAVyRQRAIAEgESABKwMAoDkDACAQIAErAwigDAELIAErAwAhDiAMIAUgC0dyRQRAIAEgEyAOoDkDACASIAErAwigDAELIAEgDyAOojkDACANIAErAwiiCzkDCCAFQQFqIQUgAUEQaiEBDAELAAsACwALIAAgBhAcIQYMAgsgACADEDAhAwwACwALAAsgABAbIQEDQCABBEAgASgCECgClAEiAiAPIAIrAwCiOQMAIAIgDSACKwMIojkDCCAAIAEQHCEBDAELCyAAIA8gDRCCDUEBIQMLIAAQGyEBA0AgAQRAIAEoAhAiAiACKAKUASIEKwMARAAAAAAAAFJAojkDECACIAQrAwhEAAAAAAAAUkCiOQMYIAAgARAcIQEMAQsLIAML7AIBBH8jAEGAAWsiByQAIAJBACACQQBKGyECAkADQCACIAhGBEAgBCADIAMgBEgbIQQDQCADIARGIgINAyAGIANBAnRqKAIAIQggByAAKQMINwM4IAcgACkDADcDMCAHIAEpAwg3AyggByABKQMANwMgIAcgBSADQQR0aiIJKQMINwMYIAcgCSkDADcDECAHIAUgCEEEdGoiCCkDCDcDCCAHIAgpAwA3AwAgA0EBaiEDIAdBMGogB0EgaiAHQRBqIAcQvgRFDQALDAILIAYgCEECdGooAgAhCSAHIAApAwg3A3ggByAAKQMANwNwIAcgASkDCDcDaCAHIAEpAwA3A2AgByAFIAhBBHRqIgopAwg3A1ggByAKKQMANwNQIAcgBSAJQQR0aiIJKQMINwNIIAcgCSkDADcDQCAIQQFqIQggB0HwAGogB0HgAGogB0HQAGogB0FAaxC+BEUNAAtBACECCyAHQYABaiQAIAIL/RECGn8MfCMAQTBrIgMkAEHIhQsoAgAhBUGUhQsoAgAhAgNAIAIgD0YEQANAIAJBAWsgC00EQEGM4QotAABBAUsEQCADIBA2AiQgAyAANgIgQbj8CCgCAEHl5wMgA0EgahAeGgsgA0EwaiQAIBAPC0HIhQsoAgAgC0HgAGxqIhNBKGohCSALQQFqIg8hCwNAIAIgC00EQCAPIQsMAgUgAyATKQMQNwMYIAMgEykDCDcDECADQciFCygCACALQeAAbGoiBykDEDcDCCADIAcpAwg3AwBBACECQQAhBiMAQbAEayIBJAAgASADKQMYNwOoAyABIAMpAxA3A6ADIAEgCSkDCDcDmAMgASAJKQMANwOQAyABQeADaiABQaADaiABQZADahDiBSABIAMpAxg3A4gDIAEgAykDEDcDgAMgASAJKQMYNwP4AiABIAkpAxA3A/ACIAFB0ANqIAFBgANqIAFB8AJqEOIFIAEgAykDCDcD6AIgASADKQMANwPgAiABIAcpAzA3A9gCIAEgBykDKDcD0AIgAUHAA2ogAUHgAmogAUHQAmoQ4gUgASADKQMINwPIAiABIAMpAwA3A8ACIAEgBykDQDcDuAIgASAHKQM4NwOwAiABQbADaiABQcACaiABQbACahDiBQJAIAErA+ADIAErA7ADZUUNACABKwPAAyABKwPQA2VFDQAgASsD6AMgASsDuANlRQ0AIAErA8gDIAErA9gDZUUNAEEBIQIgCSgCKCIFQQFxBEAgBy0AUEEBcQ0BCwJAIAVBAnFFDQAgBy0AUEECcUUNACADKwMQIAMrAwChIhsgG6IgAysDGCADKwMIoSIbIBuioCAJKwMQIAkrAwChIAcrAzigIAcrAyihIhsgG6JEAAAAAAAA0D+iZEUhAgwBC0HQhQsoAgAiBUUEQEHQhQtBzIULKAIAELcCNgIAQdSFC0HMhQsoAgAQtwI2AgBB0IULKAIAIQULIAkoAiAiDEEAIAxBAEobIQggAysDGCEbIAMrAxAhHCAJKAIkIQQgBSECA0AgBiAIRwRAIAIgHCAEKwMAoDkDACACIBsgBCsDCKA5AwggBkEBaiEGIAJBEGohAiAEQRBqIQQMAQsLQQAhBiAHKAJIIg1BACANQQBKGyEIIAMrAwghGyADKwMAIRwgBygCTCEEQdSFCygCACIUIQIDQCAGIAhHBEAgAiAcIAQrAwCgOQMAIAIgGyAEKwMIoDkDCCAGQQFqIQYgAkEQaiECIARBEGohBAwBCwsgDUEBdCEXIAxBAXQhGCANQQFrIRkgDEEBayEaQQAhAkEAIQRBACEGQQAhCAJAAkADQCABIAUgCEEEdGoiCikDCDcDqAIgASAKKQMANwOgAiABIAUgCCAaaiAMb0EEdGoiESkDCDcDmAIgASARKQMANwOQAiABQaAEaiABQaACaiABQZACahCtDSABIBQgBkEEdGoiDikDCDcDiAIgASAOKQMANwOAAiABIBQgBiAZaiANb0EEdGoiEikDCDcD+AEgASASKQMANwPwASABQZAEaiABQYACaiABQfABahCtDSABQgA3A/gDIAFCADcD6AEgASABKQOoBDcD2AEgASABKQOYBDcDyAEgAUIANwPwAyABQgA3A+ABIAEgASkDoAQ3A9ABIAEgASkDkAQ3A8ABIAErA+gBIAErA9gBIhuhIAErA8ABIAErA9ABIhyhoiABKwPIASAboSABKwPgASAcoaKhIR8gASARKQMINwO4ASABIBEpAwA3A7ABIAEgCikDCDcDqAEgASAKKQMANwOgASABIA4pAwg3A5gBIAEgDikDADcDkAEgAUGwAWogAUGgAWogAUGQAWoQrA0hFSABIBIpAwg3A4gBIAEgEikDADcDgAEgASAOKQMINwN4IAEgDikDADcDcCABIAopAwg3A2ggASAKKQMANwNgIAFBgAFqIAFB8ABqIAFB4ABqEKwNIRYgASARKQMINwNYIAEgESkDADcDUCABIAopAwg3A0ggASAKKQMANwNAIAEgEikDCDcDOCABIBIpAwA3AzAgASAOKQMINwMoIAEgDikDADcDICABKwMwIiAgASsDWCIbIAFBQGsiCisDCCIhoaIgASsDICIlICEgG6EiIqIgASsDUCIeIAErAygiHSABKwM4IhyhoiImIAor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JGoQ6gUgAhCxASECDAELAAsACyABKAIUIQIgASgCECIFBEAgBSgCBCIIKwMAIQ8gCCsDCCEQIAEoAgQiCCsDACERIAgrAwghEiAAQSAQiwEgBSgCACABKAIAIBIgEaEgECAPoaBEAAAAAAAA4D+iELQDNgIYIABBKGogAEEYahDBASAFIAEoAhQ2AhQLIAJFDQAgAigCBCIFKwMAIQ8gBSsDCCEQIAEoAgQiBSsDACERIAUrAwghEiAAQSAQiwEgASgCACACKAIAIBIgEaEgECAPoaBEAAAAAAAA4D+iELQDNgIYIABBKGogAEEYahDBASACIAEoAhA2AhALIABBOGogAEEkahDqBQwBCyAAQThqIABBJGoQswMiAiAAKAI4RwRAIAEgAhCKCCgCECICNgIQIAIgATYCFAsgAEE4aiAAQSRqELMDELEBIgIgC0YNACABIAIoAhAiAjYCFCACIAE2AhALIAZBGGohBgwACwAFIAIgBkECdGoiCSgCACAFIAZBBXQiC2oiBysDACIPIAcrAwggD6FEAAAAAAAA4D+ioCIPOQMIIAAgDzkDKCAAQThqIgUgCSAHIABBKGoiBxDdDSAAQQA2AhggACABKAIAIAtqKwMQOQMoIABBxABqIgkgAEEYaiIMIAUgBxDpBSAAQQE2AhggACABKAIAIAtqKwMYOQMoIAZBAWohBiAJIAwgBSAHEOkFIAUQ2wEMAQsACwALIA4QggIaIApBEGokAAUgCkEEaiABIAZBBXRqIgAgAEEQaiAAQQhqIABBGGoQzw0gBkEBaiEGDAELCwtSAQF/QcAAEIsBIgJCADcDKCACQQA6ACQgAkEANgIgIAJCADcDGCACIAE5AxAgAkQAAAAAAADwPzkDCCACIAA2AgAgAkIANwMwIAJCADcDOCACC1IAIAAgASACIAQQ0gICQCADIAIgBCgCABEAAEUNACACIAMQuQEgAiABIAQoAgARAABFDQAgASACELkBIAEgACAEKAIAEQAARQ0AIAAgARC5AQsLOwECfyAAKAIAIgEEQCABIQADQCAAIgEoAgQiAA0ACyABDwsDQCAAIAAoAggiASgCAEYgASEADQALIAALXQEEfyAAQaDYCjYCAEGIhQtBADYCACAAQQRqIgJBBGohBCACKAIAIQEDQCABIARHBEAgASgCECIDBEAgAxDrDRoL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RQ0BQcDlCigCACIBBH8gASAAQYAEIAEoAgARBAAFQQALDwtB16ABQdHGAUGsBUH2qwEQAAALQczPAUHRxgFBrQVB9qsBEAAACxUBAX8Q0AMhAEEPQbDlCigCACAAGwuZAgECfyABKAJEIQEDQCABLQAAIgIEQAJAAkAgAUHv3wFBBRCBAkUNACABQbPYAUEHEIECRQ0AIAFB4uIBQQUQgQJFDQAgAUGw1wFBCRCBAg0BCwJ/AkADQAJAAkACQCACQf8BcSICQQprDgQEAQECAAsgAkUNAwsgAS0AASECIAFBAWohAQwBCwtBASABLQABQQpHDQEaIAFBAmohAQwECyACQQBHCyECIAEgAmohAQwCCwJ/AkADQAJAAkACQCACQf8BcSIDQQprDgQEAQECAAsgA0UNAwsgACACwBBnIAEtAAEhAiABQQFqIQEMAQsLQQJBASABLQABQQpGGwwBCyADQQBHCyECIABBChBnIAEgAmohAQwBCwsLyAICAn8BfCMAQYACayIDJAAgAisDECEFIAMgACkDCDcDeCADIAApAwA3A3AgAyABKQMINwNoIAMgASkDADcDYCADQeABaiADQfAAaiADQeAAahDSAwJAIAUgAysD4AFmRQ0AIAMgACkDCDcDWCADIAApAwA3A1AgAyABKQMINwNIIAMgASkDADcDQCADQcABaiADQdAAaiADQUBrENIDIAMrA9ABIAIrAwBmRQ0AIAIrAxggAyAAKQMINwM4IAMgACkDADcDMCADIAEpAwg3AyggAyABKQMANwMgIANBoAFqIANBMGogA0EgahDSAyADKwOoAWZFDQAgAyAAKQMINwMYIAMgACkDADcDECADIAEpAwg3AwggAyABKQMANwMAIANBgAFqIANBEGogAxDSAyADKwOYASACKwMIZiEECyADQYACaiQAIAQLagICfAF/AkAgASsDECAAKwA4IgIgACsDGEQAAAAAAADgP6IiA6FmRQ0AIAErAwAgAyACoGVFDQAgASsDGCAAKwBAIgIgACsDIEQAAAAAAADgP6IiA6FmRQ0AIAErAwggAyACoGUhBAsgBAsoAQF/A38gAAR/IAAoAgQQpwogAWpBAWohASAAKAIAIQAMAQUgAQsLC/oCAQZ/IwBBEGsiBiQAAkACQAJAIAAoAgAiAy0AAEEjRgRAIAMtAAEiAkHf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AkACQAJAIAEoAgBBAmsODQAAAQECAwQEBgcIBQUJCyABKAIMEBgMCAsgASgCDBAYDAcLIAEoAgwQGAwGCyABKAIoEBgMBQsgASgCCBAYDAQLQQAhAgJAAkACQAJAIAEoAghBAWsOAgABAwsDQCABKAI0IQMgAiABKAIwTg0CIAMgAkEEdGooAggQGCACQQFqIQIMAAsACwNAIAEoAkQhAyACIAEoAkBODQEgAyACQQR0aigCCBAYIAJBAWohAgwACwALIAMQGAsMAwsgASgCEBAYDAILIAEoAggQGAwBCyABKAIoEBgLIARBAWohBAwBCwsgBRAYIAAQGAsJACAAQQA2AgALSQEBfyMAQRBrIgMkAAJAAkAgAkEeSw0AIAEtAHhBAXENACABQQE6AHgMAQsgAhD9CiEBCyADQRBqJAAgACACNgIEIAAgATYCAAtAAQF/IwBBEGsiASQAIAAQoQMaIAFB/////wM2AgwgAUH/////BzYCCCABQQxqIAFBCGoQ6AsoAgAgAUEQaiQACwsAIABBADYCACAACzcBAX8jAEEQayIDJAAgAyABEO0CNgIMIAMgAhDtAjYCCCAAIANBDGogA0EIahCwBSADQRBqJAALTgEBfyMAQRBrIgMkACADIAE2AgggAyAANgIMIAMgAjYCBEEAIQEgA0EEaiIAIANBDGoQrQVFBEAgACADQQhqEK0FIQELIANBEGokACABC98BAQN/IAAQJCAAEEZPBEAgABBGIgJBAWoiAyACQQF0QYAIIAIbIgQgAyAESxshAyAAECQhBAJAIAAtAA9B/wFGBEAgACgCACACIANBARCcBSECDAELIANBARBKIgIgACAEEB8aIAAgBDYCBAsgAEH/AToADyAAIAM2AgggACACNgIACyAAECQhAgJAIAAQJwRAIAAgAmogAToAACAAIAAtAA9BAWo6AA8gABAkQRBJDQFBvMADQcmEAUGdAkGUugEQAAALIAAoAgAgAmogAToAACAAIAAoAgRBAWo2AgQLCzQBAX8jAEEQayIDJAAgABAjGiAAIAIQowMgA0EAOgAPIAEgAmogA0EPahDTASADQRBqJAALHAAgAEH/////A0sEQBCTAQALIABBAnRBBBDdCwsJACAAEJIHEBgLngcBCn8jAEGgAWsiAiQAAkAgAEUNAEEBQRQQSiIDQdAAIAEg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ELILCyACIAEgASACKAIAEN4LIAZBDGogAyAAKAIAENYLIAFqNgIAIAZBEGokAAtCACABIAIgAyAEQQQQpQIhASADLQAAQQRxRQRAIAAgAUHQD2ogAUHsDmogASABQeQASRsgAUHFAEgbQewOazYCAAsLQAAgAiADIABBCGogACgCCCgCBBECACIAIABBoAJqIAUgBEEAEKcFIABrIgBBnwJMBEAgASAAQQxtQQxvNgIACwtAACACIAMgAEEIaiAAKAIIKAIAEQIAIgAgAEGoAWogBSAEQQAQpwUgAGsiAEGnAUwEQCABIABBDG1BB282AgALC0IAIAEgAiADIARBBBCmAiEBIAMtAABBBHFFBEAgACABQdAPaiABQewOaiABIAFB5ABJGyABQcUASBtB7A5rNgIACwtAACACIAMgAEEIaiAAKAIIKAIEEQIAIgAgAEGgAmogBSAEQQAQqQUgAGsiAEGfAkwEQCABIABBDG1BDG82AgALC0AAIAIgAyAAQQhqIAAoAggoAgARAgAiACAAQagBaiAFIARBABCpBSAAayIAQacBTARAIAEgAEEMbUEHbzYCAAsLBABBAgveAQEFfyMAQRBrIgckACMAQRBrIgMkACAAIQQCQCABQff///8DTQRAAkAgARCZBQRAIAQgARDUAQwBCyADQQhqIAEQ1gNBAWoQ1QMgAygCDBogBCADKAIIIgAQ/AEgBCADKAIMEPsBIAQgARC/AQsjAEEQayIFJAAgBSACNgIMIAAhAiABIQYDQCAGBEAgAiAFKAIMNgIAIAZBAWshBiACQQRqIQIMAQsLIAVBEGokACADQQA2AgQgACABQQJ0aiADQQRqEN4BIANBEGokAAwBCxDMAQALIAdBEGokACAEC8AFAQ5/IwBBEGsiCyQAIAYQzQEhCiALQQRqIAYQ3QMiDhDKASAFIAM2AgACQAJAIAAiBy0AACIGQStrDgMAAQABCyAKIAbAENIBIQYgBSAFKAIAIghBBGo2AgAgCCAGNgIAIABBAWohBwsCQAJAIAIgByIGa0EBTA0AIAYtAABBMEcNACAGLQABQSByQfgARw0AIApBMBDSASEIIAUgBSgCACIHQQRqNgIAIAcgCDYCACAKIAYsAAEQ0gEhCCAFIAUoAgAiB0EEajYCACAHIAg2AgAgBkECaiIHIQYDQCACIAZNDQIg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QX8LCAAgABCoBxoLRAECfwJAIAAoAgAgASgCACAAKAIEIgAgASgCBCICIAAgAkkiAxsQ6gEiAQ0AQQEhASAAIAJLDQBBf0EAIAMbIQELIAELvg8CBX8PfiMAQdACayIFJAAgBEL///////8/gyEKIAJC////////P4MhCyACIASFQoCAgICAgICAgH+DIQwgBEIwiKdB//8BcSEIAkACQCACQjCIp0H//wFxIglB//8Ba0GCgH5PBEAgCEH//wFrQYGAfksNAQsgAVAgAkL///////////8AgyINQoCAgICAgMD//wBUIA1CgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhDAwCCyADUCAEQv///////////wCDIgJCgICAgICAwP//AFQgAkKAgICAgIDA//8AURtFBEAgBEKAgICAgIAghCEMIAMhAQwCCyABIA1CgICAgICAwP//AIWEUARAIAMgAkKAgICAgIDA//8AhYRQBEBCACEBQoCAgICAgOD//wAhDAwDCyAMQoCAgICAgMD//wCEIQxCACEBDAILIAMgAkKAgICAgIDA//8AhYRQBEBCACEBDAILIAEgDYRQBEBCgICAgICA4P//ACAMIAIgA4RQGyEMQgAhAQwCCyACIAOEUARAIAxCgICAgICAwP//AIQhDEIAIQEMAgsgDUL///////8/WARAIAVBwAJqIAEgCyABIAsgC1AiBht5IAZBBnStfKciBkEPaxC2AUEQIAZrIQYgBSkDyAIhCyAFKQPAAiEBCyACQv///////z9WDQAgBUGwAmogAyAKIAMgCiAKUCIHG3kgB0EGdK18pyIHQQ9rELYBIAYgB2pBEGshBiAFKQO4AiEKIAUpA7ACIQMLIAVBoAJqIApCgICAgICAwACEIhJCD4YgA0IxiIQiAkIAQoCAgICw5ryC9QAgAn0iBEIAEKABIAVBkAJqQgAgBSkDqAJ9QgAgBEIAEKABIAVBgAJqIAUpA5gCQgGGIAUpA5ACQj+IhCIEQgAgAkIAEKABIAVB8AFqIARCAEIAIAUpA4gCfUIAEKABIAVB4AFqIAUpA/gBQgGGIAUpA/ABQj+IhCIEQgAgAkIAEKABIAVB0AFqIARCAEIAIAUpA+gBfUIAEKABIAVBwAFqIAUpA9gBQgGGIAUpA9ABQj+IhCIEQgAgAkIAEKABIAVBsAFqIARCAEIAIAUpA8gBfUIAEKABIAVBoAFqIAJCACAFKQO4AUIBhiAFKQOwAUI/iIRCAX0iAkIAEKABIAVBkAFqIANCD4ZCACACQgAQoAEgBUHwAGogAkIAQgAgBSkDqAEgBSkDoAEiDSAFKQOYAXwiBCANVK18IARCAVatfH1CABCgASAFQYABakIBIAR9QgAgAkIAEKABIAYgCSAIa2ohBgJ/IAUpA3AiE0IBhiIOIAUpA4gBIg9CAYYgBSkDgAFCP4iEfCIQQufsAH0iFEIgiCICIAtCgICAgICAwACEIhVCAYYiFkIgiCIEfiIRIAFCAYYiDUIgiCIKIBAgFFatIA4gEFatIAUpA3hCAYYgE0I/iIQgD0I/iHx8fEIBfSITQiCIIhB+fCIOIBFUrSAOIA4gE0L/////D4MiEyABQj+IIhcgC0IBhoRC/////w+DIgt+fCIOVq18IAQgEH58IAQgE34iESALIBB+fCIPIBFUrUIghiAPQiCIhHwgDiAOIA9CIIZ8Ig5WrXwgDiAOIBRC/////w+DIhQgC34iESACIAp+fCIPIBFUrSAPIA8gEyANQv7///8PgyIRfnwiD1atfHwiDlatfCAOIAQgFH4iGCAQIBF+fCIEIAIgC358IgsgCiATfnwiEEIgiCALIBBWrSAEIBhUrSAEIAtWrXx8QiCGhHwiBCAOVK18IAQgDyACIBF+IgIgCiAUfnwiCkIgiCACIApWrUIghoR8IgIgD1StIAIgEEIghnwgAlStfHwiAiAEVK18IgRC/////////wBYBEAgFiAXhCEVIAVB0ABqIAIgBCADIBIQoAEgAUIxhiAFKQNYfSAFKQNQIgFCAFKtfSEKQgAgAX0hCyAGQf7/AGoMAQsgBUHgAGogBEI/hiACQgGIhCICIARCAYgiBCADIBIQoAEgAUIwhiAFKQNofSAFKQNgIg1CAFKtfSEKQgAgDX0hCyABIQ0gBkH//wBqCyIGQf//AU4EQCAMQoCAgICAgMD//wCEIQxCACEBDAELAn4gBkEASgRAIApCAYYgC0I/iIQhASAEQv///////z+DIAatQjCGhCEKIAtCAYYMAQsgBkGPf0wEQEIAIQEMAgsgBUFAayACIARBASAGaxCsAyAFQTBqIA0gFSAGQfAAahC2ASAFQSBqIAMgEiAFKQNAIgIgBSkDSCIKEKABIAUpAzggBSkDKEIBhiAFKQMgIgFCP4iEfSAFKQMwIgQgAUIBhiINVK19IQEgBCANfQshBCAFQRBqIAMgEkIDQgAQoAEgBSADIBJCBUIAEKABIAogAiACIAMgBCACQgGDIgR8IgNUIAEgAyAEVK18IgEgElYgASASURutfCICVq18IgQgAiACIARCgICAgICAwP//AFQgAyAFKQMQViABIAUpAxgiBFYgASAEURtxrXwiAlatfCIEIAIgBEKAgICAgIDA//8AVCADIAUpAwBWIAEgBSkDCCIDViABIANRG3GtfCIBIAJUrXwgDIQhDAsgACABNwMAIAAgDDcDCCAFQdACaiQAC8ABAgF/An5BfyEDAkAgAEIAUiABQv///////////wCDIgRCgICAgICAwP//AFYgBEKAgICAgIDA//8AURsNACACQv///////////wCDIgVCgICAgICAwP//AFYgBUKAgICAgIDA//8AUnENACAAIAQgBYSEUARAQQAPCyABIAKDQgBZBEAgASACUiABIAJTcQ0BIAAgASAChYRCAFIPCyAAQgBSIAEgAlUgASACURsNACAAIAEgAoWEQgBSIQMLIAMLnwMBBX9BECECAkBBECAAIABBEE0bIgMgA0EBa3FFBEAgAyEADAELA0AgAiIAQQF0IQIgACADSQ0ACwtBQCAAayABTQRAQeCPC0EwNgIAQQAPC0EQIAFBC2pBeHEgAUELSRsiAyAAakEMahBIIgJFBEBBAA8LIAJBCGshAQJAIABBAWsgAnFFBEAgASEADAELIAJBBGsiBSgCACIGQXhxIAAgAmpBAWtBACAAa3FBCGsiAiAAQQAgAiABa0EPTRtqIgAgAWsiAmshBCAGQQNxRQRAIAEoAgAhASAAIAQ2AgQgACABIAJqNgIADAELIAAgBCAAKAIEQQFxckECcjYCBCAAIARqIgQgBCgCBEEBcjYCBCAFIAIgBSgCAEEBcXJBAnI2AgAgASACaiIEIAQoAgRBAXI2AgQgASACELsFCwJAIAAoAgQiAUEDcUUNACABQXhxIgIgA0EQak0NACAAIAMgAUEBcXJBAnI2AgQgACADaiIBIAIgA2siA0EDcjYCBCAAIAJqIgIgAigCBEEBcjYCBCABIAMQuwULIABBCGoLEgAgAEUEQEEADwsgACABELQHC+UeAg9/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ACEHA0AgASENIAcgDkH/////B3NKDQIgByAOaiEOAkACQAJAAkAgASIHLQAAIgsEQANAAkACQCALQf8BcSIBRQRAIAchAQwBCyABQSVHDQEgByELA0AgCy0AAUElRwRAIAshAQwCCyAHQQFqIQcgCy0AAiALQQJqIgEhC0ElRg0ACwsgByANayIHIA5B/////wdzIhdKDQkgAARAIAAgDSAHEKkBCyAHDQcgCCABNgI8IAFBAWohB0F/IRACQCABLAABQTBrIgpBCUsNACABLQACQSRHDQAgAUEDaiEHQQEhEiAKIRALIAggBzYCPEEAIQwCQCAHLAAAIgtBIGsiAUEfSwRAIAchCgwBCyAHIQpBASABdCIBQYnRBHFFDQADQCAIIAdBAWoiCjYCPCABIAxyIQwgBywAASILQSBrIgFBIE8NASAKIQdBASABdCIBQYnRBHENAAsLAkAgC0EqRgRAAn8CQCAKLAABQTBrIgFBCUsNACAKLQACQSRHDQACfyAARQRAIAQgAUECdGpBCjYCAEEADAELIAMgAUEDdGooAgALIQ8gCkEDaiEBQQEMAQsgEg0GIApBAWohASAARQRAIAggATYCPEEAIRJBACEPDAMLIAIgAigCACIHQQRqNgIAIAcoAgAhD0EACyESIAggATYCPCAPQQBODQFBACAPayEPIAxBgMAAciEMDAELIAhBPGoQhQwiD0EASA0KIAgoAjwhAQtBACEHQX8hCQJ/QQAgAS0AAEEuRw0AGiABLQABQSpGBEACfwJAIAEsAAJBMGsiCkEJSw0AIAEtAANBJEcNACABQQRqIQECfyAARQRAIAQgCkECdGpBCjYCAEEADAELIAMgCkEDdGooAgALDAELIBINBiABQQJqIQFBACAARQ0AGiACIAIoAgAiCkEEajYCACAKKAIACyEJIAggATYCPCAJQQBODAELIAggAUEBajYCPCAIQTxqEIUMIQkgCCgCPCEBQQELIRMDQCAHIRRBHCEKIAEiGCwAACIHQfsAa0FGSQ0LIAFBAWohASAHIBRBOmxqQY+OCWotAAAiB0EBa0EISQ0ACyAIIAE2AjwCQCAHQRtHBEAgB0UNDCAQQQBOBEAgAEUEQCAEIBBBAnRqIAc2AgAMDAsgCCADIBBBA3RqKQMANwMwDAILIABFDQggCEEwaiAHIAIgBhCEDAwB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AgALIARB8AJqIBcgFiANEI8MIAQpA/gCIRUgBCkD8AILIRYgDiAVNwMoIA4gFjcDICAEQZDGAGokACAOKQMoIRUgDikDICEWDAELQgAhFQsgACAWNwMAIAAgFTcDCCAOQTBqJAALwwYCBH8DfiMAQYABayIFJAACQAJAAkAgAyAEQgBCABCtA0UNAAJ/IARC////////P4MhCgJ/IARCMIinQf//AXEiB0H//wFHBEBBBCAHDQEaQQJBAyADIAqEUBsMAgsgAyAKhFALC0UNACACQjCIpyIIQf//AXEiBkH//wFHDQELIAVBEGogASACIAMgBBBrIAUgBSkDECICIAUpAxgiASACIAEQ/QsgBSkDCCECIAUpAwAhBAwBCyABIAJC////////////AIMiCiADIARC////////////AIMiCRCtA0EATARAIAEgCiADIAkQrQMEQCABIQQMAgsgBUHwAGogASACQgBCABBrIAUpA3ghAiAFKQNwIQQMAQsgBEIwiKdB//8BcSEHIAYEfiABBSAFQeAAaiABIApCAEKAgICAgIDAu8AAEGsgBSkDaCIKQjCIp0H4AGshBiAFKQNgCyEEIAdFBEAgBUHQAGogAyAJQgBCgICAgICAwLvAABBrIAUpA1giCUIwiKdB+ABrIQcgBSkDUCEDCyAJQv///////z+DQoCAgICAgMAAhCELIApC////////P4NCgICAgICAwACEIQogBiAHSgRAA0ACfiAKIAt9IAMgBFatfSIJQgBZBEAgCSAEIAN9IgSEUARAIAVBIGogASACQgBCABBrIAUpAyghAiAFKQMgIQQMBQsgCUIBhiAEQj+IhAwBCyAKQgGGIARCP4iECyEKIARCAYYhBCAGQQFrIgYgB0oNAAsgByEGCwJAIAogC30gAyAEVq19IglCAFMEQCAKIQkMAQsgCSAEIAN9IgSEQgBSDQAgBUEwaiABIAJCAEIAEGsgBSkDOCECIAUpAzAhBAwBCyAJQv///////z9YBEADQCAEQj+IIAZBAWshBiAEQgGGIQQgCUIBhoQiCUKAgICAgIDAAFQNAAsLIAhBgIACcSEHIAZBAEwEQCAFQUBrIAQgCUL///////8/gyAGQfgAaiAHcq1CMIaEQgBCgICAgICAwMM/EGsgBSkDSCECIAUpA0AhBAwBCyAJQv///////z+DIAYgB3KtQjCGhCECCyAAIAQ3AwAgACACNwMIIAVBgAFqJAALvwIBAX8jAEHQAGsiBCQAAkAgA0GAgAFOBEAgBEEgaiABIAJCAEKAgICAgICA//8AEGsgBCkDKCECIAQpAyAhASADQf//AUkEQCADQf//AGshAwwCCyAEQRBqIAEgAkIAQoCAgICAgID//wAQa0H9/wIgAyADQf3/Ak8bQf7/AWshAyAEKQMYIQIgBCkDECEBDAELIANBgYB/Sg0AIARBQGsgASACQgBCgICAgICAgDkQayAEKQNIIQIgBCkDQCEBIANB9IB+SwRAIANBjf8AaiEDDAELIARBMGogASACQgBCgICAgICAgDkQa0HogX0gAyADQeiBfU0bQZr+AWohAyAEKQM4IQIgBCkDMCEBCyAEIAEgAkIAIANB//8Aaq1CMIYQayAAIAQpAwg3AwggACAEKQMANwMAIARB0ABqJAALPAAgACABNwMAIAAgAkL///////8/gyACQoCAgICAgMD//wCDQjCIpyADQjCIp0GAgAJxcq1CMIaENwMICxcBAX8gAEEAIAEQ/QIiAiAAayABIAIbCywAIAAgARDVByIBRQRADwsCQCADBEAgACABIAIQsgQMAQsgACABIAIQiwwLC6UBAQV/QdiSCygCACIDBEBB1JILKAIAIQUDQCAAIAUgAkECdGoiBCgCACIGRgRAIAQgATYCACAAEBgPCyAGIAFFckUEQCAEIAE2AgBBACEBCyACQQFqIgIgA0cNAAsLAkAgAUUNAEHUkgsoAgAgA0ECdEEEahA6IgBFDQBB1JILIAA2AgBB2JILQdiSCygCACICQQFqNgIAIAAgAkECdGogATYCAAsLCgAgAGhBACAAGwuYAQEFfyMAQYACayIFJAACQCACQQJIDQAgASACQQJ0aiIHIAU2AgAgAEUNAANAIAcoAgAgASgCAEGAAiAAIABBgAJPGyIEEB8aQQAhAwNAIAEgA0ECdGoiBigCACABIANBAWoiA0ECdGooAgAgBBAfGiAGIAYoAgAgBGo2AgAgAiADRw0ACyAAIARrIgANAAsLIAVBgAJqJAALKQEBfyAAKAIAQQFrEJQMIgEEfyABBSAAKAIEEJQMIgBBIHJBACAAGwsLWwEBfyMAQRBrIgMkACADAn4gAUHAAHFFBEBCACABQYCAhAJxQYCAhAJHDQEaCyADIAJBBGo2AgwgAjUCAAs3AwBBnH8gACABQYCAAnIgAxALEOkDIANBEGokAAseAQF/IAAQ8AEiAQRAIAAgARCdDCAAQYWhBRDjAQsLRQEBf0H4kAstAABBAXFFIgAEQEHMkAtB0JALQYCRC0GgkQsQEEHYkAtBoJELNgIAQdSQC0GAkQs2AgBB+JALQQE6AAALCy4BAX8gAUH/AXEhAQNAIAJFBEBBAA8LIAAgAkEBayICaiIDLQAAIAFHDQALIAMLRQECfCAAIAIgAqIiBDkDACABIAIgAkQAAAACAACgQaIiAyACIAOhoCICoSIDIAOiIAIgAqAgA6IgAiACoiAEoaCgOQMACzQBAX8gAEEANgKAASAAQQE2AkQgACABKAJsIgI2AoQBIAIEQCACIAA2AoABCyABIAA2AmwLWQEDfyAAEC8hAyAAEMgFIgBBACAAQQBKGyEEQQAhAANAIAEoAgwhAiAAIARGRQRAIAMgAiAAQQJ0aigCACICIAIQdkEARxCOARogAEEBaiEADAELCyACEBgLPgEBfyAAKAJEBEAgACgCgAEhASAAKAKEASIABEAgACABNgKAAQsgAQRAIAEgADYChAEPC0GwkgsgADYCAAsLagAgAEEASARAQXgQ6QMaDwsCfwJAIABBAE4EQEHmigUtAAANASAAIAEQFgwCCwJAIABBnH9HBEBB5ooFLQAAQS9GQQBxDQEMAgsMAQtB5ooFIAEQFQwBCyAAQeaKBSABQYAgEBQLEOkDGgsVAQF/EPQDIQBBD0GA5AooAgAgABsLLwAgACAAIAGWIAG8Qf////8HcUGAgID8B0sbIAEgALxB/////wdxQYCAgPwHTRsLMgACfyAAKAJMQQBIBEAgACgCPAwBCyAAKAI8CyIAQQBIBH9B4I8LQQg2AgBBfwUgAAsL7gEBBX8gAUGFoQVBEEEAEDUhBAJAIAAgASgCAEEDcRCwAyIDBEACQCAEKAIIIgJFBEAgBCAAEDcgASgCAEEDcRCwAzYCCCAEIAEQyAVBBBAZNgIMIANBAEGAASADKAIAEQQAIQADQCAARQ0CIAAoAgwQdiEGIAEQLyECIAAoAgwhBQJ/IAYEQCACIAUQ1gIMAQsgAiAFELIBCyECIAQoAgwgACgCEEECdGogAjYCACADIABBCCADKAIAEQQAIQAMAAsACyACIANHDQILDwtB5SZB/sIBQagBQeEuEAAAC0HYJkH+wgFBtgFB4S4QAAALGQAgACAAKAIAIgBB/////wMgABs2AgAgAAsiAAJ/IAAoAkxBAEgEQCAAKAIADAELIAAoAgALQQR2QQFxC8IEAwN8A38CfgJ8AkAgABC1BEH/D3EiBUQAAAAAAACQPBC1BCIEa0QAAAAAAACAQBC1BCAEa0kEQCAFIQQMAQsgBCAFSwRAIABEAAAAAAAA8D+gDwtBACEERAAAAAAAAJBAELUEIAVLDQBEAAAAAAAAAAAgAL0iB0KAgICAgICAeFENARpEAAAAAAAA8H8QtQQgBU0EQCAARAAAAAAAAPA/oA8LIAdCAFMEQEQAAAAAAAAAEBCnDA8LRAAAAAAAAABwEKcMDwsgAEHw6QgrAwCiQfjpCCsDACIBoCICIAGhIgFBiOoIKwMAoiABQYDqCCsDAKIgAKCgIgEgAaIiACAAoiABQajqCCsDAKJBoOoIKwMAoKIgACABQZjqCCsDAKJBkOoIKwMAoKIgAr0iB6dBBHRB8A9xIgVB4OoIaisDACABoKCgIQEgBUHo6ghqKQMAIAdCLYZ8IQggBEUEQAJ8IAdCgICAgAiDUARAIAhCgICAgICAgIg/fb8iACABoiAAoEQAAAAAAAAAf6IMAQsgCEKAgICAgICA8D98vyICIAGiIgEgAqAiA0QAAAAAAADwP2MEfCMAQRBrIgQgBEKAgICAgICACDcDCCAEKwMIRAAAAAAAABAAojkDCEQAAAAAAAAAACADRAAAAAAAAPA/oCIAIAEgAiADoaAgA0QAAAAAAADwPyAAoaCgoEQAAAAAAADwv6AiACAARAAAAAAAAAAAYRsFIAMLRAAAAAAAABAAogsPCyAIvyIAIAGiIACgCwsYAQF/IwBBEGsiASAAOQMIIAAgASsDCKILjwIBAn8gACAALQAYQSByOgAYIABBgPcJQRRBABA1IgFB6PYJQcT0CSgCABChAjYCCCABQej2CUHE9AkoAgAQoQI2AgwgAUHo9glBxPQJKAIAEKECNgIQAkACQCAAKAJEIgIEQCABIAJBABC1AiICRg0CIAEoAgggAigCCBDqAhogASgCDCACKAIMEOoCGiABKAIQIAIoAhAQ6gIaDAELQcTkCigCACICRSAAIAJGcg0AIAJBABC1AiICKAIIIAEoAgggAEEBEMQHIAIoAgwgASgCDCAAQQIQxAcgAigCECABKAIQIABBABDEBwsgACgCRCIBIAAgARsgABCjDA8LQam4AUH+wgFB7wBBySYQAAALTQEDf0EBIQEDQCAAKAIQIgMoArgBIQIgASADKAK0AUpFBEAgAiABQQJ0aigCACICKAIQKAIMEL4BIAIQqQwgAUEBaiEBDAELCyACEBgLFQAgAEHLuwFBKkHbwQFBsagDEJMFC+YDAgZ/BnwjAEHgAGsiAyQAIAAoAhAiAisDGCEJIAIrAxAhCkGM4QotAABBAk8EQCABELMCIAMgABAgNgJQQbj8CCgCAEHx/wMgA0HQAGoQHhoLAkAgAUUEQEG4/AgoAgAhBgwBC0G4/AgoAgAhBiAAEBshAiADQUBrIQUDQCACRQ0BAkAgAigCECIEKAKAASAARw0AIAQgCiAEKwMQoDkDECAEIAkgBCsDGKA5AxhBjOEKLQAAQQJJDQAgARCzAiACECAhBCACKAIQIgcrAxAhCCAFIAcrAxg5AwAgAyAIOQM4IAMgBDYCMCAGQe60BCADQTBqEDILIAAgAhAcIQIMAAsACyABQQFqIQdBASEEA0AgACgCECICKAK0ASAETgRAIAIoArgBIARBAnRqKAIAIQUgAQRAIAkgBSgCECICKwMooCEIIAogAisDIKAhCyAJIAIrAxigIQwgCiACKwMQoCENQYzhCi0AAEECTwRAIAEQswIgBRAgIQIgAyAIOQMgIAMgCzkDGCADIAw5AxAgAyANOQMIIAMgAjYCACAGQdy0BCADEDIgBSgCECECCyACIAg5AyggAiALOQMgIAIgDDkDGCACIA05AxALIAUgBxCrDCAEQQFqIQQMAQsLIANB4ABqJAALyRMDDX8LfAF+IwBBwAJrIgQkACAAKAJIIQxBjOEKLQAAQQJPBEAgARCzAiAEIAAQIDYCkAJBuPwIKAIAQc76AyAEQZACahAeGgsgAUEBaiEGQQEhAgNAIAAoAhAiCCgCtAEgAk4EQCAIKAK4ASACQQJ0aigCACIIIAYQrAwgAkEBaiECIAgQOCADaiEDDAELCwJAAkACQCAAEDggA2siDSAAKAIQIggoArQBaiIGDQAgCCgCDA0AIAhCADcDECAIQoCAgICAgICZwAA3AyggCEKAgICAgICAmcAANwMgIAhCADcDGAwBCwJAAn8CQCAAQQRBBCAEQaACahD9A0ECTQRAIARBAzYCsAIMAQtBACAEKAKwAkEERw0BGiAELQC8AkECcUUNAiAMQQBBuBdBABAhIgUgDEEBQbgXQQAQISIHcgRAIAQgBkEEEBk2ArgCDAMLIAQgABAgNgKAAkGTpAMgBEGAAmoQKwtBAAshB0EAIQULIAZBIBAZIQggBkEEEBkhDEEAIQJBASEDA0AgACgCECIKKAK0ASADTgRAIAggAkEFdGoiCSAKKAK4ASADQQJ0aigCACILKAIQIgopAxA3AwAgCSAKKQMoNwMYIAkgCikDIDcDECAJIAopAxg3AwggBCgCuAJFIAVFckUEQCALIAVBAEEAEGQhCSAEKAK4AiACQQJ0aiAJNgIACyAMIAJBAnRqIAs2AgAgA0EBaiEDIAJBAWohAgwBCwsCQCANQQBMDQAgABAbIQMDQCADRQ0BIAMoAhAiBSgCgAFFBEAgBSAANgKAASAFKwNYIRAgBSsDYCEPIAUrA1AhESAIIAJBBXRqIgVCADcDACAFIBE5AxggBSAQIA+gOQMQIAVCADcDCCAEKAK4AkUgB0VyRQRAIAMgB0EAQQAQZCEFIAQoArgCIAJBAnRqIAU2AgALIAwgAkECdGogAzYCACACQQFqIQILIAAgAxAcIQMMAAsACyAGQQBIDQEgBEGgAmohB0EAIQJBACEFIwBB8ABrIgMkAAJAIAZFDQACQAJAIAcoAhBBA2sOAgABAgsgBiAIIAcoAggQpQ4hCUGM4QotAAAEQCADIAk2AlBBuPwIKAIAQc7QBCADQdAAahAeGgsgCUEATA0BIAZBEBAZIQoDQCACIAZGBEBBACECIAZBBBAZIQsDQCACIAZGBEAgCyAGQQRBrgMQlQFBACECEM0DIQ0gBkEQEBkhBQNAIAIgBkYEQCALEBhBACECA0AgAiAGRgRAIAoQGCANEN8CQQAhAkGM4QotAABBAkkNCUG4/AgoAgAhBwNAIAIgBkYNCiAFIAJBBHRqIgkrAwAhECADIAkrAwg5AxAgAyAQOQMIIAMgAjYCACAHQbuxBCADEDIgAkEBaiECDAALAAUgCiACQQR0aigCBBAYIAJBAWohAgwBCwALAAUgAiALIAJBAnRqKAIAIg4gDSAFIA4oAgxBBHRqIAkgBygCCCAIEKgIIAJBAWohAgwBCwALAAUgCyACQQJ0aiAKIAJBBHRqNgIAIAJBAWohAgwBCwALAAUgCiACQQR0aiILIAI2AgwgBygCCCENIANCADcDaCADQgA3A2AgAyAIIAJBBXRqIgUpAwg3AzggA0FAayAFKQMQNwMAIAMgBSkDGDcDSCAFKQMAIRogA0IANwMoIAMgGjcDMCADQgA3AyAgA0EwaiALIAkgDSADQSBqQeaKBRCkDiACQQFqIQIMAQsACwALIAYgCCAHEKIOIQULIANB8ABqJAAgBSEKIAQoArgCEBhBuPwIKAIAIQdE////////7/8hEET////////vfyERRP///////+9/IRJE////////7/8hFkEAIQIDQCACIAZHBEAgCCACQQV0aiIFKwMAIRcgCiACQQR0aiILKwMAIRMgBSsDCCEVIAUrAxAhFCAAKAIQKAK0ASENIAwgAkECdGooAgAiCSgCECEDIBYgCysDCCIYIAUrAxigIg8QIiEWIBAgEyAUoCIUECIhECASIBggFaAiFRAqIRIgESATIBegIhMQKiERAkAgAiANSARAIAMgDzkDKCADIBQ5AyAgAyAVOQMYIAMgEzkDEEGM4QotAABBAkkNASABELMCIAkQICEDIAQgDzkD0AEgBCAUOQPIASAEIBU5A8ABIAQgEzkDuAEgBCADNgKwASAHQdy0BCAEQbABahAyDAELIAMgFSAPoEQAAAAAAADgP6I5AxggAyATIBSgRAAAAAAAAOA/ojkDEEGM4QotAABBAkkNACABELMCIAkQICEDIAkoAhAiBSsDECEPIAQgBSsDGDkD8AEgBCAPOQPoASAEIAM2AuABIAdB7rQEIARB4AFqEDILIAJBAWohAgwBCwsCQCAAKAIQIgIoAgwiA0UNACADKwMYIg8gBkUEQCADKwMgIRZEAAAAAAAAAAAhEUQAAAAAAAAAACESIA8hEAsgECARoaEiD0QAAAAAAAAAAGRFDQAgECAPRAAAAAAAAOA/oiIPoCEQIBEgD6EhEQsgECAEKAKoArhEAAAAAAAA4D+iRAAAAAAAAAAAIAFBAEobIg+gIRQgESAPoSEQIBYgAisDWCAPoKAhESASIAIrAzggD6ChIQ9BjOEKLQAAQQJPBEAgARCzAiAAECAhAiAEIBE5A6ABIAQgFDkDmAEgBCAPOQOQASAEIBA5A4gBIAQg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uPwIKAIAQai0BCACEDILIAJB8ABqJAALswYCCn8FfCMAQdABayIBJAACQCAAKAJAIgRFDQAgBEEEEOEEIQUgAEEwaiIHIQMDQCACIARGBEAgBSAEQQRB6AMQlQFBACECIARBCBDhBCEDA0AgAiAERgRAAn8gACsDCCIMIAArAwBhBEAgASAAKQMoNwOIASABIAApAyA3A4ABIAEgACkDGDcDeCABIAApAxA3A3AgBCADIAFB8ABqELYMDAELIAArAyAhCyAAKwMoIQ0gASAAKwMQOQOwASABIAArAxg5A7gBIAEgCyANIAugIA0gC6EiCyALoiAMRAAAAAAAABBAoqCfoUQAAAAAAADgP6IiC6E5A8ABIAEgDSALoTkDyAEgASABKQO4ATcDmAEgASABKQPAATcDoAEgASABKQPIATcDqAEgASABKQOwATcDkAEgBCADIAFBkAFqELYMCyEIQbj8CCgCACEJQYzhCi0AAARAIAArAxAhCyAAKwMYIQ0gACsDICEMIAEgACsDKDkDaCABIAw5A2AgASANOQNYIAEgCzkDUCAJQcu0BCABQdAAahAyCyABQUBrIQpBACECA0AgAiAERgRAIAUQGCADEBggCBAYQQAhAgNAIAIgBEYNByAHKAIAIgAoAjxFBEAgABC0DAsgAkEBaiECIABBNGohBwwACwALIAUgAkECdGooAgAiBiAIIAJBBXRqIgApAwA3AxAgBiAAKQMYNwMoIAYgACkDEDcDICAGIAApAwg3AxhBjOEKLQAABEAgAyACQQN0aisDACEPIAArAwAhCyAAKwMIIQ0gACsDECEMIAEgACsDGCIOOQNIIAogDDkDACABIA05AzggASALOQMwIAEgDCAOojkDKCABIA0gDkQAAAAAAADgP6IiDqA5AyAgASALIAxEAAAAAAAA4D+iIgygOQMYIAEgDSAOoTkDECABIAsgDKE5AwggASAPOQMAIAlB0/wEIAEQMgsgAkEBaiECDAALAAUgAyACQQN0aiAFIAJBAnRqKAIAKwMAOQMAIAJBAWohAgwBCwALAAUgBSACQQJ0aiADKAIAIgM2AgAgAkEBaiECIANBNGohAwwBCwALAAsgAUHQAWokAAvYAgIGfwJ8ELEMIgYgADYCOCAGQQA2AjxBASEEA0AgACgCECIFKAK0ASAETgRAIAUoArgBIARB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8ABqEB4aCyAAEBshAgNAIAIEQCACKAIQQQA2ArgBIAAgAhAcIQIMAQsLQYzhCi0AAEECTwRAIAEoAhAhAiAIIAAQIDYCZCAIIAI2AmBBuPwIKAIAQeuCBCAIQeAAahAeGgsgASABKAIQQQFqNgIQIAhB1PYJKAIANgJcQd+vASAIQdwAakEAEOQBIgpBrCtBmAJBARA1GkE4EFQhAiAKKAIQIAI2AowBIAAQNyECIAooAhAgAigCEC8BsAE7AbABIAAgCkHI4gAQ1wcgACAKQYbhABDXByAAIApBn94BENcHIAhBmAFqIQcgCEGQAWohBiAIQYgBaiEJQQEhDANAIAAoAhAiAigCtAEgDE4EQCACKAK4ASAMQQJ0aigCACIDEIEFIAogAxAgENYHIgQoAhAiAiALNgKIASACIAM2AugBAkACQCABKAIEIgVFBEBE////////738hG0T////////v/yEaDAELRP///////+9/IRtE////////7/8hGiADIAUQQSICLQAARQ0AIAEoAgAgA0cEQCACIAMoAkQgBRBBEElFDQELIAhBADoArAEgCCAJNgJEIAggBjYCSCAIIAc2AkwgCCAIQawBajYCUCAIIAhBgAFqNgJAIAJBhMgBIAhBQGsQT0EETgRAIAgrA5gBIRogCCsDkAEhHiAIKwOIASEbIAgrA4ABIRxBoOEKKwMAIh1EAAAAAAAAAABkBEAgHiAdoyEeIBsgHaMhGyAcIB2jIRwgGiAdoyEaCyAEKAIQQQNBAkEBIAgtAKwBIgJBP0YbIAJBIUYbOgCHAQwCCyADECAhBSAIIAI2AjQgCCAFNgIwQeX0AyAIQTBqECsLRP///////+//IR5E////////738hHAsgC0EBaiELIAMQGyECA0AgAgRAIAIoAhAgBDYCuAEgAyACEBwhAgwBCwsgBCgCECICLQCHAQRAIAIoApQBIgIgGiAboEQAAAAAAADgP6I5AwggAiAeIBygRAAAAAAAAOA/ojkDAAsgDEEBaiEMDAELCyAAEBshAgJ/AkADQCACBEACQCACKAIQIgMoArgBDQACQCADKALoASIERQ0AIAQgACgCECgCjAEoAjBGDQAgAhAgIQEgABAgIQAgCCACKAIQKALoARAgNgIoIAggADYCJCAIIAE2AiBB6YQFIAhBIGoQNgwECyADIAA2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AgAgACABQZSFCygCAEECdGo2AgQLQQAhAQNAQZSFCygCACICIAFNBEAgACgCACACQQRB1wMQlQEgACAAKAIANgJIBSAAKAIAIAFBAnRqQciFCygCACABQeAAbGoiAkEIajYCACACQQE2AhwgAkIANwNYIAFBAWohAQwBCwsLNwECfyMAQSBrIgMkACAAEDhBAk4EQCAAIAEgA0EIaiIBEJkNIAAgARD1AyECCyADQSBqJAAgAgvmAgIGfwR8IAAQlQ0gACgCBCEFIAAoAgAhAANAAkAgBSAAIgFLBEAgAEEEaiIAIAVPDQIgASgCACIDKwMAIgcgASgCBCICKwMAYg0CIAMrAwgiCCACKwMIYg0CIAFBCGohA0ECIQICQANAIAMgBU8NASADKAIAIgQrAwghCSAEKwMAIgogB2IgCCAJYnJFBEAgA0EEaiEDIAJBAWohAgwBCwsgCCAJYg0AIAogB6EgArijIQdBASEBA0AgACADTw0DIAAoAgAiAiABuCAHoiACKwMAoDkDACAAQQRqIQAgAUEBaiEBDAALAAtByIULKAIAIQIDQCAAIANPDQIgACgCACIEIAEoAgAiBisDACACIAYoAhBB4ABsaiIGKwM4IAYrAyihIAIgBCgCEEHgAGxqIgQrAzggBCsDKKGgRAAAAAAAAOA/oqA5AwAgAEEEaiEAIAFBBGohAQwACwALDwsgAyEADAALAAuPAQEBfwNAQZSFCygCACAATQRAQcyFC0EANgIAQdCFCygCABAYQdSFCygCABAYQdiFCygCABAYQdSFC0EANgIAQdCFC0EANgIAQdiFC0EANgIAQciFCygCACIABH8gACgCWBAYQciFCygCAAVBAAsQGAVByIULKAIAIABB4ABsaigCTBAYIABBAWohAAwBCwsLvQMCB38BfiMAQTBrIgUkAEHnnQEhCAJAAkAgAUUNACABLQAARQ0AQZzQCCEEA0ACQAJAIAQoAgQiA0UEQEHc0QghBAwBCyABIAMQLkUgBCgCACIGQRJGBH8gASADIAMQPBCBAgVBAQtFckUNASAEKAIIIgdFBEAgBSADNgIgQcXDBCAFQSBqECsgAkHP/AA2AgQgAkEBNgIAQZzQCCEEDAELIAIgBzYCBCACIAY2AgAgBkESRw0AIAQoAgQQPCABaiMAQRBrIgMkACADIANBDGo2AgBB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QYiFC0GIhQsoAgBBAWoiAjYCACAAIAI2AiwgABCXCANAAkAgABCVCCICRQ0AIAIQuAJEAAAAAAAAAABjRQ0AIABBMGoQywQgAigCACIBKAIgIgMoAjAgAygCNEYEQCADEJcIIAIoAgAhAQsgAisDCCEHIAErAxghCCACKAIEKwMYIQkgACgCACEBIAAoAgQhBCADKAIAIQUgAygCBCEGQYiFC0GIhQsoAgBBAWo2AgAgACADIAQgAWsgBiAFa0kiBBshASADIAAgBBsiACABIAIgCSAIoSAHoSIHmiAHIAQbEPEFIAAQlQgaIAEQlQgaIABBMGogAUEwahDxDSAAQYiFCygCADYCLCABQQE6ACgMAQsLC+wBAQN/IwBBEGsiAyQAIAMgATYCDCABQQE6ACQgASgCOCEEIAEoAjQhAQNAIAEgBEcEQCABKAIAKAIEIgUtACRFBEAgACAFIAIQ6g0LIAFBBGohAQwBCwsjAEEQayIAJAAgAEEBNgIIIABBDBCLATYCDCAAKAIMIgFBADYCBCABQQA2AgAgASADKAIMNgIIIAAoAgwhASAAQQA2AgwgACgCDCIEBEAgACgCCBogBBAYCyAAQRBqJAAgASACNgIAIAEgAigCBCIANgIEIAAgATYCACACIAE2AgQgAiACKAIIQQFqNgIIIANBEGokAAsZACAAQTxqEIICGiAAQTBqEIICGiAAEIICCxoAIABBgICAgARPBEAQgwgACyAAQQJ0EIsBC5EBAQN/IAEoAgQhAiAAKAIAIQQgACgCBCEDA0AgAyAERkUEQCACQQRrIgIgA0EEayIDKAIANgIADAELCyABIAI2AgQgACgCACEDIAAgAjYCACABIAM2AgQgACgCBCECIAAgASgCCDYCBCABIAI2AgggACgCCCECIAAgASgCDDYCCCABIAI2AgwgASABKAIENgIAC34BAn8CQCADQQJIDQAgACADQQJrQQF2IgNBAnRqIgQoAgAgAUEEayIBKAIAIAIoAgARAABFDQAgASgCACEFA0ACQCABIAQiASgCADYCACADRQ0AIAAgA0EBa0EBdiIDQQJ0aiIEKAIAIAUgAigCABEAAA0BCwsgASAFNgIACwtEAQF/IwBBEGsiASQAIAFBADYCDCAAIAAoAgAoAgBBABDwBSAAIAAoAgAoAgBBACABQQxqEJEIGiABKAIMIAFBEGokAAtOAQJ/IwBB0ABrIgIkACAAKAJAIgNBABCNBUG49glHBEAgA0G49gkQjQUaCyACIAE3AwggACgCQCIAIAJBBCAAKAIAEQQAIAJB0ABqJAALyQQBCX8gACICKAIEIQYgASgCACIAIQMgASgCBCEBIwBBIGsiCSQAAkAgASAAa0ECdSIFQQBMDQAgAigCCCACKAIEIgBrQQJ1IAVOBEACQCAAIAZrIgRBAnUiCCAFTgRAIAMgBUECdGohBwwBCyABIAMgBGoiB2shBCABIAdHBEAgACAHIAQQUxoLIAIgACAEajYCBCAIQQBMDQILIAAhBCAGIAIoAgQiASAGIAVBAnRqIgprIghqIQUgASEAA0AgBCAFTQRAIAIgADYCBCABIApHBEAgASAIayAGIAgQUxoLBSAAIAUoAgA2AgAgAEEEaiEAIAVBBGohBQwBCwsgAyAHRg0BIAYgAyAHIANrEFMaDAELIAlBDGogAiAAIAIoAgBrQQJ1IAVqEO4FIAYgAigCAGtBAnUgAkEIahCOCCIBKAIIIgAgBUECdGohBANAIAAgBEcEQCAAIAMoAgA2AgAgA0EEaiEDIABBBGohAAwBCwsgASAENgIIIAIoAgAhBCAGIQAgASgCBCEDA0AgACAERwRAIANBBGsiAyAAQQRrIgAoAgA2AgAMAQsLIAEgAzYCBCACKAIEIgUgBmshACABKAIIIQQgBSAGRwRAIAQgBiAAEFMaIAEoAgQhAwsgASAAIARqNgIIIAIoAgAhACACIAM2AgAgASAANgIEIAIoAgQhACACIAEoAgg2AgQgASAANgIIIAIoAgghACACIAEoAgw2AgggASAANgIMIAEgASgCBDYCACABEI0ICyAJQSBqJAAgAhDzDQtjAgJ/AXwgAigCBCIDKwMYIAIoAgAiBCsDGKEgAisDCKEhBSADKAIgIQMgBCgCICEEIAAoAgQgACgCAGsgASgCBCABKAIAa0kEQCADIAQgAiAFEPEFDwsgBCADIAIgBZoQ8QUL4gIBCX8gACgCACEFIAAoAgQhACMAQRBrIgMkACADQb8DNgIMAkAgACAFa0ECdSIGQQJIDQAgBkECa0EBdiEIA0AgCEEASA0BIAUgCEECdGohBAJAIAZBAkgNACAGQQJrQQF2IgkgBCAFayIAQQJ1SA0AIAUgAEEBdSIBQQFyIgJBAnRqIQAgBiABQQJqIgFKBEAgASACIAAoAgAgACgCBCADKAIMEQAAIgEbIQIgAEEEaiAAIAEbIQALIAAoAgAgBCgCACADKAIMEQAADQAgBCgCACEBA0ACQCAEIAAiBCgCADYCACACIAlKDQAgBSACQQF0IgdBAXIiAkECdGohACAGIAdBAmoiB0oEQCAHIAIgACgCACAAKAIEIAMoAgwRAAAiBxshAiAAQQRqIAAgBxshAAsgACgCACABIAMoAgwRAABFDQELCyAEIAE2AgALIAhBAWshCAwACwALIANBEGokAAtGAgF8An8gACgCBCEDIAAoAgAhAAN8IAAgA0YEfCABBSAAKAIAIgIrAwggAisDGKEgAisDEKIgAaAhASAAQQRqIQAMAQsLC2wCAX8CfCMAQRBrIgIkACACIAE2AgwgASAANgIgIAAgAkEMahDBASAAIAIoAgwiASsDECIDIAArAxigIgQ5AxggACADIAErAwggASsDGKGiIAArAyCgIgM5AyAgACADIASjOQMQIAJBEGokAAsnACAAIAAoAhhFIAAoAhAgAXJyIgE2AhAgACgCFCABcQRAEJMBAAsLMAEDfyAAKAIEIgQgAUEEaiICayEDIAIgBEcEQCABIAIgAxBTGgsgACABIANqNgIEC34BA38gACgCACIBQTRqIAEoAjghAyABKAI0IQEDQAJAIAEgA0YNACABKAIAIABGDQAgAUEEaiEBDAELCyABEPcNIAAoAgQiAUEoaiABKAIsIQMgASgCKCEBA0ACQCABIANGDQAgASgCACAARg0AIAFBBGohAQwBCwsgARD3DQvqAQEIfyAAQay1AxDTAiECIAEoAgAhBiMAQRBrIgMkACADQQhqIgQgAhC2BRoCQCAELQAARQ0AIAIgAigCAEEMaygCAGoiBSgCBBogA0EEaiIEIAUQUSAEEPMLIQUgBBBOIAMgAhDyCyEHIAIgAigCAEEMaygCAGoiCBDxCyEJIAMgBSAHKAIAIAggCSAGIAUoAgAoAhARCAA2AgQgBBC0BUUNACACIAIoAgBBDGsoAgBqQQUQtwULIANBCGoQtQUgA0EQaiQAIAJBv+YBENMCIAEoAiArAxAgASsDGKAQrQdB5rQDENMCGiAACw4AIABBpwVBqMEBENAKCzgBAX8gABAbIQEDQCABBEAgASgC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BEAgBSAAKAIQIgAoAugBQcgAbGoiASABKwMYIgkgByAHIAljGzkDGCAFIAAoAuwBQcgAbGoiACAAKwMQIgcgCCAHIAhkGzkDEAsgAwtwAQJ/QQEhBANAIAQgACgCECIDKAK0AUpFBEAgAygCuAEgBEECdGooAgAgASACELQOIARBAWohBAwBCwsgAyABIAMrAxCiOQMQIAMgAiADKwMYojkDGCADIAEgAysDIKI5AyAgAyACIAMrAyiiOQMoC+UEAgh/BHxBASECA0AgAiAAKAIQIgMoArQBSkUEQCADKAK4ASACQQJ0aigCACABELUOIAJBAWohAgwBCwsgABBjIQIgACgCECEDAkAgACACRgRAIAMoAuwBIQVEAADA////38EhCkQAAMD////fQSELIAMoAugBIgghBANAIAQgBUoEQCADKAK0ASIAQQAgAEEAShtBAWohAEEBIQIDQCAAIAJGDQQgCiADKAK4ASACQQJ0aigCACgCECIEKwMgRAAAAAAAACBAoCIMIAogDGQbIQogCyAEKwMQRAAAAAAAACDAoCIMIAsgDGMbIQsgAkEBaiECDAALAAUCQCADKALEASAEQcgAbGoiACgCACIGRQ0AQQEhAiAAKAIEIgcoAgAiAEUNAANAIAAoAhAiAC0ArAEiCUUgAiAGTnJFBEAgByACQQJ0aigCACEAIAJBAWohAgwBCwsgCQ0AIAZBAmshAiAAKwMQIAArA1ihIQwgByAGQQJ0akEEayEAA0AgACgCACgCECIALQCsAQRAIAcgAkECdGohACACQQFrIQIMAQsLIAogACsDECAAKwNgoCINIAogDWQbIQogCyAMIAsgDGMbIQsLIARBAWohBAwBCwALAAsgAygC6AEhCCADKALsASEFIAMoAoQCKAIQKAL0AbchCiADKAKAAigCECgC9AG3IQsLIAEoAhAoAsQBIgAgBUHIAGxqKAIEKAIAKAIQKwMYIQwgACAIQcgAbGooAgQoAgAoAhArAxghDSADIAo5AyAgAyALOQMQIAMgDSADKwOAAaA5AyggAyAMIAMrA3ihOQMYC6IBAgJ8AX8CQAJ/Qf////8HIABBqiEQJiIDRQ0AGiAAEDghACADELECIQEgAEEASA0BQQAgAUQAAAAAAAAAAGMNABogALghAiABRAAAAAAAAPA/ZARAQf////8HRAAAwP///99BIAGjIAJjDQEaCyABIAKiIgGZRAAAAAAAAOBBYwRAIAGqDwtBgICAgHgLDwtB3Z0DQZWEAUHKAEG83wAQAAALiAICB38BfCMAQRBrIgQkACAAQfzhCigCAEEIQQAQZCAAEP8FtyEIIAAoAhAiASgC6AEhAyABKAKEAiEFIAEoAoACIQYDQCADIAEoAuwBSkUEQAJAIANByABsIgcgASgCxAFqIgIoAgBFDQAgAigCBCgCACICRQRAIAAQICEBIAQgAzYCBCAEIAE2AgBB1L0EIAQQNgwBCyAGIAIgAigCECsDWCAIoCABKwNgoEEAEKQBGiAAKAIQIgEoAsQBIAdqIgIoAgQgAigCAEECdGpBBGsoAgAiAiAFIAIoAhArA2AgCKAgASsDQKBBABCkARoLIANBAWohAyAAKAIQIQEMAQsLIARBEGokAAvbAgIKfwF8IABB/OEKKAIAQQhBABBkIQdBASEBA0AgACgCECIFKAK0ASIEIAFIBEAgB7chC0EBIQEDQCABIARKRQRAIAFBAnQhCSABQQFqIgchAQNAIAUoArgBIgIgCWooAgAhAyABIARKRQRAIAIgAUECdGooAgAiBiADIAMoAhAoAugBIAYoAhAoAugBSiICGyIIKAIQIgooAuwBIAMgBiACGyIDKAIQIgYoAugBIgJOBEAgCCADIAJByABsIgIgCigCxAFqKAIEKAIAKAIQKAL4ASAGKALEASACaigCBCgCACgCECgC+AFIIgIbKAIQKAKEAiADIAggAhsoAhAoAoACIAtBABCkARogACgCECIFKAK0ASEECyABQQFqIQEMAQsLIAMQuA4gACgCECIFKAK0ASEEIAchAQwBCwsFIAUoArgBIAFBAnRqKAIAEP8FIAFBAWohAQwBCwsLnAECA38BfCAAQfzhCigCAEEIQQAQZCAAEP8FtyEEQQEhAQNAIAEgACgCECICKAK0AUpFBEAgAigCuAEgAUECdGooAgAiAhD/BSAAKAIQIgMoAoACIAIoAhAoAoACIAMrA2AgBKBBABCkARogAigCECgChAIgACgCECIDKAKEAiADKwNAIASgQQAQpAEaIAIQuQ4gAUEBaiEBDAELCwulAwIHfwF8IABB/OEKKAIAQQhBABBktyEIIAAoAhAiASgC6AEhBEEBIQUDQCABKALsASAESARAA0AC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4EFjBEAgEaoMAQtBgICAgHgLIghBACAIQQBKIgcbIglBAWq4IAUoApwBEKQBGiADIAEgAUEwayIFIAEoAgBBA3FBAkYbKAIoQQBBACAIayAHGyIIQQFquCABKAIQKAKcARCkARogAygCECABIAYgASgCAEEDcSIDQQNGGygCKCgCECgC9AEgCUF/c2oiBiABIAUgA0ECRhsoAigoAhAoAvQBIAhBf3NqIgEgASAGShs2AvQBIAJBAWohAiAEKAIQIgUoApACIQEMAAsACyAFQbgBaiEBDAELCwJAIAAoAhAiASgCtAFBAEoEfyAAELsOIAAQug4gABC5DiAAELgOIAAoAhAFIAELKAIIIgEoAlRBA0cNACABKwNAIhEgASsDSCISokQAAAAAAADwP2UNACAAELcOIAAoAhAiASgCgAIgASgChAIgEiARIAEoAnRBAXEbIhFEAAAAAOD/70AgEUQAAAAA4P/vQGMbQegHEKQBGgsCQCAAQQIgABC2DhDWBEUNACAAKAIQIgIoAugBIQUDQAJAAkAgAigC7AEiCyAFTgRAQQAhByACKALEASAFQcgAbGoiCCgCACIJQQAgCUEAShshA0EAIQEDQCABIANGDQNBACEEAkAgCCgCBCABQQJ0aigCACIHKAIQIgooApACIgxFDQADQCAMIARBAnRqKAIAIgZFDQEgBkFQQQAgBigCAEEDcSINQQJHG2ooAigoAhAoAvQBIAVKDQQgBEEBaiEEIAZBMEEAIA1BA0cbaigCKCgCECgC9AEgBUwNAAsMAwtBACEEAkAgCigCiAIiCkUNAANAIAogBEECdGooAgAiBkUNASAGQTBBACAGKAIAQQNxIgxBA0cbaigCKCgCECgC9AEgBUoNBCAEQQFqIQQgBSAGQVBBACAMQQJHG2ooAigoAhAoAvQBTg0ACwwDCyABQQFqIQEMAAsACyAAQQIgABC2DhDWBEUNA0GWoANBhMQBQYsBQZ/oABAAAAsgASEDCwJAIAdFIAMgCUhyRQRAIAhBzABBvH8gBSALSBtqKAIAKAIAIgJFDQEgCCgCBCgCACEDIAAQuwIiASgCEEECOgCsASABIANEAAAAAAAAAABBABCkARogASACRAAAAAAAAAAAQQAQpAEaIAEoAhAgAygCECgC9AEiASACKAIQKAL0ASICIAEgAkgbNgL0ASAA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IAQgAisDADkDKCAEIAg3AyAgAEGr1gQgBEEgahAyIANBAWohAwwACwALAkAgBAJ8IAEoAhAgA0EobGoiBSgCFCICIAUoAhgiBkYEQCACKwMoIAIrAzigRAAAAAAAAOA/oiEHIAIrAzAgAisDQKBEAAAAAAAA4D+iDAELIAUgBiACIAItAABBAXEbIgIoAiQiBigCBEYEQCACKwMoIAIrAzigRAAAAAAAAOA/oiEHIAIrA0AMAQsgBSAGKAIMRgRAIAIrAyggAisDOKBEAAAAAAAA4D+iIQcgAisDMAwBCyAFIAYoAghGBEAgAisDKCEHIAIrAzAgAisDQKBEAAAAAAAA4D+iDAELIAYoAgAgBUcNASACKwM4IQcgAisDMCACKwNAoEQAAAAAAADgP6ILOQMQIAQgBzkDCCAEIAM2AgAgAEHD1gQgBBAyIANBAWohAwwBCwtBhp8EQQAQNhAoAAtB9OEDIAAQjQEaIARBMGokAAvmVAIafwp8IwBB0AJrIgckACAAELoCQQgQGSEYQbzhCi0AAEEBRgRAEM0DIRkLIABB7cgBECYhAkHggwtBADYCAAJAIAJFDQAgAi0AACIFRQ0AA0ACQEHggwsCfwJAAkACQAJAIAVB/wFxIghB7QBrDgcBBQUFBQIDAAtBCCAIQeMARg0DGiAIQekARwRAIAgNBQwHC0ESDAMLQQEMAgtBBAwBC0ECCyAGciIGNgIACyACQQFqIgItAAAhBQwACwALIAEEQEGL6QRBABArCwJ/IwBB4AJrIgMkAEEBQRwQGSEOAkAgACIIEDhBAE4EQCAOIAAQOCIKNgIEIA4gCkHIABAZIgY2AgxE////////738hHET////////v/yEfIAAQGyEFRP///////+//IR1E////////738hHiAGIQEDQCAFBEAgBSgCECIAKwMQISIgACsDYCEhIAArA1ghIyAAKwMYISAgACsDUCEkIAEgASgCAEEBcjYCACABICAgJEQAAAAAAADgP6JEAAAAAAAA8D8QIiIkoCIlOQNAIAEgICAkoSIgOQMwIAEgIiAjICGgRAAAAAAAAOA/okQAAAAAAADwPxAiIiGgIiM5AzggASAiICGhIiI5AyggACABNgKAASABQcgAaiEBIB8gJRAiIR8gHCAgECohHCAdICMQIiEdIB4gIhAqIR4gCCAFEBwh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Amo2AgBBJQ8LIAJBFUYNDwsgAyAANgIADBELIAMgAUEBajYCAEEVDwsgAyABQQFqNgIAQREPCyACIAFBAWoiAWsiBkEATA0MQQAhBQJAAkACQAJAAkACQCAHIAEtAABqLQAAIghBBWsOAwECAwALIAhBFmsOAwMEAwQLIAZBAUYNDiAAIAEgACgC4AIRAAANAyAAIAEgACgC1AIRAABFDQNBAiEEDAILIAZBA0kNDSAAIAEgACgC5AIRAAANAiAAIAEgACgC2AIRAABFDQJBAyEEDAELIAZBBEkNDCAAIAEgACgC6AIRAAANASAAIAEgACgC3AIRAABFDQFBBCEECyABIARqIQEDQCACIAFrIgZBAEwEQEFsDwtBASEEQRQhBQJAAkACQAJAAkAgByABLQAAai0AAEEFaw4gAAECBAYGBgQEBAQEBAQEBAYDBAMDAwMEBAYEBgQEBAYECyAGQQFGDRAgACABIAAoAuACEQAADQMgACABIAAoAsgCEQAARQ0DQQIhBAwCCyAGQQNJDQ8gACABIAAoAuQCEQAADQIgACABIAAoAswCEQAARQ0CQQMhBAwBCyAGQQRJDQ4gACABIAAoAugCEQAADQEgACABIAAoAtACEQAARQ0BQQQhBAsgASAEaiEBDAELC0EAIQULIAMgATYCACAFDwsgAiABa0ECSA0JIAAgASAAKALgAhEAAA0IQQIhBCAAIAEgACgC1AIRAAANAiAAIAEgACgCyAIRAABFDQgMBQsgAiABa0EDSA0IIAAgASAAKALkAhEAAA0HQQMhBCAAIAEgACgC2AIRAAANASAAIAEgACgCzAIRAABFDQcMBAsgAiABa0EESA0HIAAgASAAKALoAhEAAA0GQQQhBCAAIAEgACgC3AIRAABFDQELDAMLIAAgASAAKALQAhEAAEUNBAwBC0ETIQUMAQtBEyEFCyABIARqIQQCQAJAAkACQANAIAIgBCIBayIEQQBMDQQCQAJAAkACQAJAAkACQCAHIAEtAABqLQAAQQVrDiABAgMKBAQECgoKCQoKCgoEBAAFAAAAAAoKBAoECAYEBAoLIAFBAWohBAwGCyAEQQFGDQwgACABIAAoAuACEQAADQggACABIAAoAsgCEQAARQ0IIAFBAmohBAwFCyAEQQNJDQsgACABIAAoAuQCEQAADQcgACABIAAoAswC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AgAgAiEIA0AgAyAIRgRAIAMhCAwGCyAILQAARQ0FIAhBAWohCAwACwALIAQgAjYCAEEBDAILIAQoAgAhAgsgAiADRwsgEUEQaiQADwsgBygCACEFDAALAAumBQEMfyMAQRBrIg8kACACIQgDQAJAIAMgCEYEQCADIQgMAQsgCCgCAEUNACAIQQRqIQgMAQsLIAcgBTYCACAEIAI2AgACQANAAkACQCACIANGIAUgBkZyBH8gAgUgDyABKQIANwMIQQEhECAAKAIIIQkjAEEQayIOJAAgDiAJNgIMIA5BCGogDkEMahCPAiAFIQkgBiAFayEKQQAhDCMAQRBrIhEkAAJAIAQoAgAiC0UgCCACa0ECdSISRXINACAKQQAgBRshCgNAIBFBDGogCSAKQQRJGyALKAIAELQHIg1Bf0YEQEF/IQwMAgsgCQR/IApBA00EQCAKIA1JDQMgCSARQQxqIA0QHxoLIAogDWshCiAJIA1qBUEACyEJIAsoAgBFBEBBACELDAILIAwgDWohDCALQQRqIQsgEkEBayISDQALCyAJBEAgBCALNgIACyARQRBqJAAQjgIgDkEQaiQAAkACQAJAAkAgDEEBag4CAAgBCyAHIAU2AgADQCACIAQoAgBGDQIgBSACKAIAIAAoAggQlAciAUF/Rg0CIAcgBygCACABaiIFNgIAIAJBBGohAgwACwALIAcgBygCACAMaiIFNgIAIAUgBkYNASADIAhGBEAgBCgCACECIAMhCAwGCyAPQQRqIgJBACAAKAIIEJQHIghBf0YNBCAGIAcoAgBrIAhJDQYDQCAIBEAgAi0AACEFIAcgBygCACIJQQFqNgIAIAkgBToAACAIQQFrIQggAkEBaiECDAELCyAEIAQoAgBBBGoiAjYCACACIQgDQCADIAhGBEAgAyEIDAULIAgoAgBFDQQgCEEEaiEIDAALAAsgBCACNgIADAMLIAQoAgALIANHIRAMAwsgBygCACEFDAELC0ECIRALIA9BEGokACAQCwkAIAAQmAsQGAszACMAQRBrIgAkACAAIAQ2AgwgACADIAJrNgIIIABBDGogAEEIahDoCygCACAAQRBqJAALNAADQCABIAJGRQRAIAQgAyABLAAAIgAgAEEASBs6AAAgBEEBaiEEIAFBAWohAQwBCwsgAQsMACACIAEgAUEASBsLKgAD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IAZHDQALCyAGQSBqJAAgAQvnAgEBfyMAQYACayIAJAAgACACNgL4ASAAIAE2AvwBIABBxAFqEFIhBiAAQRBqIgIgAxBRIAIQzgFB8LcJQYq4CSAAQdABahD3AiACEE4gAEG4AWoQUiIDIAMQVhA9IAAgA0EAED8iATYCtAEgACACNgIMIABBADYCCANAAkAgAEH8AWogAEH4AWoQXA0AIAAoArQBIAMQIyABakYEQCADECMhAiADIAMQI0EBdBA9IAMgAxBWED0gACACIANBABA/IgFqNgK0AQsgAEH8AWoiAhCFAUEQIAEgAEG0AWogAEEIakEAIAYgAEEQaiAAQQxqIABB0AFqEN4DDQAgAhCZARoMAQsLIAMgACgCtAEgAWsQPSADEEIQaCAAIAU2AgAgABDGC0EBRwRAIARBBDYCAAsgAEH8AWogAEH4AWoQXARAIAQgBCgCAEECcjYCAAsgACgC/AEgAxA0GiAGEDQaIABBgAJqJAAL0AMBAX4jAEGQAmsiACQAIAAgAjYCiAIgACABNgKMAiAAQdABaiADIABB4AFqIABB3wFqIABB3gFqEKYHIABBxAFqEFIiASABEFYQPSAAIAFBABA/IgI2AsABIAAgAEEgajYCHCAAQQA2AhggAEEBOgAXIABBxQA6ABYDQAJAIABBjAJqIABBiAJqEFwNACAAKALAASABECMgAmpGBEAgARAjIQMgASABECNBAXQQPSABIAEQVhA9IAAgAyABQQAQPyICajYCwAELIABBjAJqIgMQhQEgAEEXaiAAQRZqIAIgAEHAAWogACwA3wEgACwA3gEgAEHQAWogAEEgaiAAQRxqIABBGGogAEHgAWoQpQcNACADEJkBGgwBCwsCQCAAQdABahAjRQ0AIAAtABdBAUcNACAAKAIcIgMgAEEgamtBnwFKDQAgACADQQRqNgIcIAMgACgCGDYCAAsgACACIAAoAsABIAQQxwsgACkDACEGIAUgACkDCDcDCCAFIAY3AwAgAEHQAWogAEEgaiAAKAIcIAQQtAEgAEGMAmogAEGIAmoQXARAIAQgBCgCAEECcjYCAAsgACgCjAIgARA0GiAAQdABahA0GiAAQZACaiQAC7kDACMAQYACayIAJAAgACACNgL4ASAAIAE2AvwBIABBwAFqIAMgAEHQAWogAEHPAWogAEHOAWoQpgcgAEG0AWoQUiIBIAEQVhA9IAAgAUEAED8iAjYCsAEgACAAQRBqNgIMIABBADYCCCAAQQE6AAcgAEHFADoABgNAAkAgAEH8AWogAEH4AWoQXA0AIAAoArABIAEQIyACakYEQCABECMhAyABIAEQI0EBdBA9IAEgARBWED0gACADIAFBABA/IgJqNgKwAQsgAEH8AWoiAxCFASAAQQdqIABBBmogAiAAQbABaiAALADPASAALADOASAAQcABaiAAQRBqIABBDGogAEEIaiAAQdABahClBw0AIAMQmQEaDAELCwJAIABBwAFqECNFDQAgAC0AB0EBRw0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCsAEgBBDICzkDACAAQcABaiAAQRBqIAAoAgwgBBC0ASAAQfwBaiAAQfgBahBcBEAgBCAEKAIAQQJyNgIACyAAKAL8ASABEDQaIABBwAFqEDQaIABBgAJqJAALuQMAIwBBgAJrIgAkACAAIAI2AvgBIAAgATYC/AEgAEHAAWogAyAAQdABaiAAQc8BaiAAQc4BahCmByAAQbQBahBSIgEgARBWED0gACABQQAQPyICNgKwASAAIABBEGo2AgwgAEEANgIIIABBAToAByAAQcUAOgAGA0ACQCAAQfwBaiAAQfgBahBcDQAgACgCsAEgARAjIAJqRgRAIAEQIyEDIAEgARAjQQF0ED0gASABEFYQPSAAIAMgAUEAED8iAmo2ArABCyAAQfwBaiIDEIUBIABBB2ogAEEGaiACIABBsAFqIAAsAM8BIAAsAM4BIABBwAFqIABBEGogAEEMaiAAQQhqIABB0AFqEKUHDQAgAxCZARoMAQsLAkAgAEHAAWoQI0UNACAALQAHQQFHDQAgACgCDCIDIABBEGprQZ8BSg0AIAAgA0EEajYCDCADIAAoAgg2AgALIAUgAiAAKAKwASAEEMkLOAIAIABBwAFqIABBEGogACgCDCAEELQBIABB/AFqIABB+AFqEFwEQCAEIAQoAgBBAnI2AgALIAAoAvwBIAEQNBogAEHAAWoQNBogAEGAAmokAAuPAwEBfyMAQYACayIAJAAgACACNgL4ASAAIAE2AvwBIAMQqQIhBiAAQcQBaiADIABB9wFqEKsEIABBuAFqEFIiASABEFYQ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8bic1j83A4gCAkAgAygCmAJBEkcgBEECR3JFBEAgAyADKAKgAjYC5AEgAyADKwOoAjkD8AEgA0GIAWogABCBA0EBIQUgAy0AmAFBAXFFDQEgAysDiAEhCCADIAMrA5ABRAAAAAAAAFJAozkDkAIgAyAIRAAAAAAAAFJAozkDiAIMAQsgA0F/NgLkASAEQQJHIQULQYzhCi0AAARAIANBKGoiASADQbABakHYABAfGiMAQeABayICJABBweIEQRtBAUG4/AgoAgAiBBBMGiACIAErAwA5A9ABIARBjK4EIAJB0AFqEDIgAS0ALCEGIAIgASgCKDYCxAEgAiAGQQFxNgLAASAEQfzOBCACQcABahAeGiABKwMIIQggAkKas+bMmbPm5D83A7gBIAIgCDkDsAEgBEGprgQgAkGwAWoQMiACIAEoAhA2AqABIARBiMsEIAJBoAFqEB4aIAIgASgCFDYClAEgAkEtNgKQASAEQfTLBCACQZABahAeGiACIAEoAhg2AoABIAJC/NPGl93JmKg/NwN4IAJCs+bMmbPmzPE/NwNwIARBocsEIAJB8ABqEDIgASsDICEIIAIgBkEBdkEBcTYCYCACIAg5A1ggAkLNmbPmzJmz9j83A1AgBEG5zQQgAkHQAGoQMiACIAErA0g5A0ggAkEANgJEIAIgBkECdkEBcTYCQCAEQdetBCACQUBrEDIgASgCMCEGIAEoAjQhByABKwNAIQggAiABLQA4NgIwIAIgCDkDKCACIAc2AiQgAiAGQQJ0QfDRCGooAgA2AiAgBEH4zAQgAkEgahAyIAIgASgCPEECdEGQ0ghqKAIANgIQIARBrIQEIAJBEGoQHhogAiABKAJQNgIAIARBxs4EIAIQHhogAkHgAWokAAsgACADQawBahCjCCEEAkAgAygCrAFBAUYEQCADIAMpA5ACNwMQIAMgAykDiAI3AwggACADQbABaiADQQhqEM8MIAVFBEAgACADQZgCahD1AxoLIAAQsQMMAQsgAEECQQggA0GIAWoQ/QMaIANBAToAlAFBACECA0AgAygCrAEiASACTQRAIAEgBCAAIANBiAFqEP0FDAILIAQgAkECdGooAgAiAUEAELYDGiADIAMpA5ACNwMgIAMgAykDiAI3AxggASADQbABaiADQRhqEM8MIAVFBEAgASADQZgCahD1AxoL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CBDUA0GMIBCNB0G48wlBwAMQAQALIAEoAggoAiAiAy0AKA0BIAMQ6Q0MAQsLAkAgBUEEaiICKAIIRQ0AIAIoAgQiACgCACIBIAIoAgAoAgQiAzYCBCADIAE2AgAgAkEANgIIA0AgACACRg0BIAAoAgQgABAYIQAMAAsACyAFQRBqJAALugECAn8CfET////////v/yEEAnxE////////7/8gASgCACgCICICKAIsIAEoAhhKDQAaRP///////+//IAIgASgCBCgCIEYNABogARC4AgshBQJAIAAoAgAoAiAiAigCLCAAKAIYSg0AIAIgACgCBCgCIEYNACAAELgCIQQLIAQgBWEEQCABKAIAKAIAIgIgACgCACgCACIDRgRAIAEoAgQoAgAgACgCBCgCAEgPCyACIANIDwsgBCAFZAsZAQJ+IAApAwgiAiABKQMIIgNWIAIgA1RrCzMAIAAQ5Q0gACABKAIANgIAIAAgASgCBDYCBCAAIAEoAgg2AgggAUEANgIIIAFCADcCAAvKAQEHfyMAQRBrIgUkACAAQQA2AgggAEIANwIAQShBNCACGyEHIAEoAgQhCCABKAIAIQQDQCAEIAhHBEAgBCgCACAHaiIDKAIEIQkgAygCACEDA0AgAyAJRgRAIARBBGohBAwDBSAFIAMoAgAiBjYCDCAGQYiFCygCADYCGAJAAkAgAgRAIAYoAgAoAiAgAUcNAQsgAg0BIAYoAgQoAiAgAUYNAQsgACAFQQxqEMEBCyADQQRqIQMMAQsACwALCyAAEPMNIAVBEGokAAsdACAAKAIAQQR2IgAgASgCAEEEdiIBSyAAIAFJaws+AQJ8An9BfyAAKwMAIgIgASsDACIDYw0AGkEBIAIgA2QNABpBfyAAKwMIIgIgASsDCCIDYw0AGiACIANkCwscACAAKAIMIAEoAgxqIAAoAgQgASgCBGprQQJtCxwAIAAoAgggASgCCGogACgCACABKAIAamtBAm0LjAEBB38CQCAAKAIgIgMgASgCKCIESg0AIAEoAiAiBSAAKAIoIgZKDQBBASECIAAoAiwiByABKAIkIghIDQAgACgCECABKAIQayAHIAEoAixqIAAoAiQgCGprQQJtaiAGIAMgBWprIARqQQJtIAEoAgwiASAAKAIMIgBrIAAgAWsgACABShtqTCECCyACC4wBAQd/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KAIAQQR2IgEgACgCAEEEdiIASQ0CIAAgAUkhAgwCC0EBIQIMAQtBfyECCyAEQeADaiQAIAILCQAgASAAEI0BCxYAIAEgAiAAEMMHRQRAQQAPCyABEDwLJQAgACgCACgCECgC+AEiACABKAIAKAIQKAL4ASIBSiAAIAFIawsSACABQcO/ASACKAIIQQEQNRoLEgAgAUHSvwEgAigCBEEBEDUaCxIAIAFBs78BIAIoAgBBARA1GgsZAEF/IAAoAgAiACABKAIAIgFLIAAgAUkbCyUAIAAoAgAoAhAoAvQBIgAgASgCACgCECgC9AEiAUogACABSGsLJQAgASgCACgCECgC9AEiASAAKAIAKAIQKAL0ASIASiAAIAFKawtAAgJ8AX8gACsDACICIAErAwAiA2QEQCAAKwMIIAErAwhlRQ8LIAIgA2MEf0EAQX8gACsDCCABKwMIZhsFQQALC9wBAQV/IAAoAighBQNAIAUoAgQhASAFKAIAIANLBEAgASADQRhsakEIaiEBQQAhAgNAIAEoAgggAksEQCABIAIQ2wgaIAEgAhCZBhogAkEBaiECDAELCyABQgA3AgQgASgCABAYIAFCADcCCCABQgA3AgAgA0EBaiEDDAELCyABEBggBRAYIABBGGohAiAAKAIgIQECQANAIAEgBE0NASACIAQQXRogBCAAKAIgIgFJIARBAWohBA0AC0HCvANBkoMBQTVBpikQAAALIABCADcCHCAAKAIYEBggABAYCyABAnxBAUF/QQAgACsDACICIAErAwAiA2MbIAIgA2QbCw8AIAAoAhAQmwEaIAAQGAtaAgF8AX9BfyAAKwMIIAErAwihIgJESK+8mvLXej5kIAJESK+8mvLXer5jGyIDBH8gAwVBfyAAKwMAIAErAwChIgJESK+8mvLXej5kIAJESK+8mvLXer5jGwsLWgIBfAF/QX8gACsDACABKwMAoSICREivvJry13o+ZCACREivvJry13q+YxsiAwR/IAMFQX8gACsDCCABKwMIoSICREivvJry13o+ZCACREivvJry13q+YxsLCyMAIAAoAhAoAgBBBHYiACABKAIQKAIAQQR2IgFLIAAgAUlrCxQAIAAoAhBBHGogAEcEQCAAEBgLC44BAgF/BHwjAEEwayIDJAAgAyABKAIIIgQ2AiQgAyAENgIgIABB6YMF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BEGk3AQgA0HgAWoQgQEgA0GUgwsoAgA2AtABIAMgBiAHIA2goiIGOQPAASADIAogCyAMoKIiBzkDyAEgBEHD3QQgA0HAAWoQgQEgAyABNgKwASAEQZ7YAyADQbABahCBASAAIAQQnAYQGhogARAYIAIEQCADQYgBaiIBIAAoAhBBOGpBKBAfGiABQwAAAAAQwAMhASADQgA3A4ABIANCADcDeCADQgA3A3AgAEHQ5gQgA0HwAGoQHSADQoCAgICAgID4PzcDYCADIAg5A1ggAyAFOQNQIABByNwEIANB0ABqEB0gA0FAayAAKALoArK7OQMAIANCADcDOCADQgA3AzAgAEGk3AQgA0EwahAdIANBlIMLKAIANgIgIAMgBjkDECADIAc5AxggAEHD3QQgA0EQahAdIAMgATYCACAAQZ7YAyADEB0gARAYCyADQeACahBfIANB8AJqJAAL7QMCA38GfCMAQdABayIDJAAgAigCACEEIAIoAgQiBSsDECEGIAMgBSgCADYCsAEgAyAGOQOoASADIAQ2AqABIABB7YcEIANBoAFqEB1BlIMLQZCDCygCAEEJazYCAAJ8IAErAwAiBiACLQAwIgRB7ABGDQAaIARB8gBGBEAgBiACKwMgoQwBCyAGIAIrAyBEAAAAAAAA4L+ioAshBiAAKwPwAyEHIAArA4AEIQggASsDCCEJIAArA+gDIQogACsD+AMhCyADQfgAaiIBIAAoAhBBEGpBKBAfGiABQwAAAAAQwAMhASADQgA3A8gBIANCADcDwAEgAigCBCgCACEEIAIoAgAhBSADQgA3A3AgA0KAgICAgICA6D83A2ggAyAFNgJkIAMgBDYCYCADQcABaiIEQfXlAyADQeAAahCBASADIAIoAgQrAxAgACsD6AOiOQNQIARB5a4EIANB0ABqEIEBIANBQGsgACgC6AKyuzkDACADQgA3AzggA0IANwMwIARBpNwEIANBMGoQgQEgA0GUgwsoAgA2AiAgAyAKIAYgC6CiOQMQIAMgByAJIAigojkDGCAEQcPdBCADQRBqEIEBIAMgATYCACAEQZ7YAyADEIEBIAAgBBCcBhAaGiAEEF8gARAYIANB0AFqJAALHAAgAEGCuwQQGhpBkIMLQZCDCygCAEEFajYCAAscACAAQfC6BBAaGkGQgwtBkIMLKAIAQQVrNgIA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NBDoBDYCOAJAIABBrCtBAEEBEDUEQCAAKAIQKAIIDQELIAEtAJsBQQRxDQBBk7kEQQAQNgwBCyABQQA2AiQgASABKAKYAUGAgIDAAHI2ApgBIAIgABC6BhogARCPBCACEJ0ECyADQRBqJAAgAhCdBCACEBgPCyAAKAIAKAKgARDvCAsLGwAgAEH41gMQGhogACABEIwBIABBgN4EEBoaC2gBAn8gAEG1ngEQGhogAEEAQQAQ4gQgAEGszQMQGhoDQCACIANHBEAgACABIANBBHRqIgQrAwAQfSAAQSwQZyAAIAQrAwiaEH0gA0EBaiIDIAJGDQEgAEEgEGcMAQsLIABB6d0EEBoaCwurmQqVAwBBgAgL5oIF/9j/AMXQ08YAfgB7JXN9ACAtdGFncyB7JWQlcyVwfQAgJS4wZn0AJXMgeyAlcyB9AHxlZGdlbGFiZWx8ACAtZm9udCB7AHF1YXJ0egBpZHggPT0gc3oAY250ID09IHN6AGxvegBncmFwaHZpegBndndyaXRlX25vX3oAcG9ydGhveHkAc2NhbGV4eQAvc3ZnL25hdnkAaW52ZW1wdHkAbm9kZV9zZXRfaXNfZW1wdHkAbm9kZXNfaXNfZW1wdHkAcmVmZXJlbmNlIHRvIGJpbmFyeSBlbnRpdHkAYXN5bmNocm9ub3VzIGVudGl0eQBpbmNvbXBsZXRlIG1hcmt1cCBpbiBwYXJhbWV0ZXIgZW50aXR5AGVudGl0eSBkZWNsYXJlZCBpbiBwYXJhbWV0ZXIgZW50aXR5AGNhbm5vdCBzdXNwZW5kIGluIGV4dGVybmFsIHBhcmFtZXRlciBlbnRpdHkAWE1MIG9yIHRleHQgZGVjbGFyYXRpb24gbm90IGF0IHN0YXJ0IG9mIGVudGl0eQB1bmRlZmluZWQgZW50aXR5AHBhcnNlci0+bV9vcGVuSW50ZXJuYWxFbnRpdGllcyA9PSBvcGVuRW50aXR5AHBhcnNlci0+bV9vcGVuVmFsdWVFbnRpdGllcyA9PSBvcGVuRW50aXR5AHBhcnNlci0+bV9vcGVuQXR0cmlidXRlRW50aXRpZXMgPT0gb3BlbkVudGl0eQBpbmZpbml0eQBsaXN0LT5zaXplIDwgbGlzdC0+Y2FwYWNpdHkAZmFudGFzeQBTcGFyc2VNYXRyaXhfY29vcmRpbmF0ZV9mb3JtX2FkZF9lbnRyeQAvc3ZnL2l2b3J5AG91dCBvZiBtZW1vcnkARmVicnVhcnkASmFudWFyeQBndnBsdWdpbl9kb3RfbGF5b3V0X0xUWF9saWJyYXJ5AGd2cGx1Z2luX25lYXRvX2xheW91dF9MVFhfbGlicmFyeQBndnBsdWdpbl9jb3JlX0xUWF9saWJyYXJ5AGdhdGhlcl90aW1lX2VudHJvcHkAbm9kZXNfY29weQBhbGJhbnkASnVseQBTcGFyc2VNYXRyaXhfbXVsdGlwbHkAZXF1YWxseQBhc3NlbWJseQBzdW1tZXJza3kAc2h5AHNhdGlzZnkAYmVhdXRpZnkAbm9qdXN0aWZ5AENsYXNzaWZ5AC9zdmcvbGlnaHRncmV5AC9zdmcvZGltZ3JleQAvc3ZnL2RhcmtncmV5AC9zdmcvbGlnaHRzbGF0ZWdyZXkAL3N2Zy9kYXJrc2xhdGVncmV5AC9zdmcvc2xhdGVncmV5AHdlYmdyZXkAeDExZ3JleQAvc3ZnL2dyZXkAbW92ZSB0byBmcm9udCBsb2NrIGluY29uc2lzdGVuY3kAZXh0cmFjdF9hZGphY2VuY3kAbWVyZ2Vfb25ld2F5AGFycmF5AGFsbG9jQXJyYXkAL3N2Zy9saWdodGdyYXkAL3N2Zy9kaW1ncmF5AC9zdmcvZGFya2dyYXkAL3N2Zy9saWdodHNsYXRlZ3JheQAvc3ZnL2RhcmtzbGF0ZWdyYXkAL3N2Zy9zbGF0ZWdyYXkAd2ViZ3JheQB4MTFncmF5AC9zdmcvZ3JheQBUaHVyc2RheQBUdWVzZGF5AFdlZG5lc2RheQBTYXR1cmRheQBTdW5kYXkATW9uZGF5AEZyaWRheQBNYXkALi4vLi4vbGliL2NncmFwaC9ncmFtbWFyLnkALi4vLi4vbGliL2NvbW1vbi9odG1scGFyc2UueQAlbS8lZC8leQBwb3J0aG95eABwb3J0aG9feXgAeHh4AGJveAB2aWV3Qm94AGNoa0JvdW5kQm94AC9NZWRpYUJveABnZXRfZWRnZV9sYWJlbF9tYXRyaXgAaWRlYWxfZGlzdGFuY2VfbWF0cml4AG11c3Qgbm90IHVuZGVjbGFyZSBwcmVmaXgAdW5ib3VuZCBwcmVmaXgAaHRtbGxleABtYXgAIyUwMnglMDJ4JTAyeAAjJTJ4JTJ4JTJ4JTJ4ACMlMXglMXglMXgALSsgICAwWDB4AC0wWCswWCAwWC0weCsweCAweAByYXJyb3cAbGFycm93AEhlbHZldGljYS1OYXJyb3cAYXJyb3dfbGVuZ3RoX2Nyb3cAL3N2Zy9zbm93AHNwcmluZ19lbGVjdHJpY2FsX2VtYmVkZGluZ19zbG93AC9zdmcvbGlnaHR5ZWxsb3cAL3N2Zy9ncmVlbnllbGxvdwAvc3ZnL2xpZ2h0Z29sZGVucm9keWVsbG93AC9zdmcveWVsbG93AGZhdGFsIGVycm9yIC0gc2Nhbm5lciBpbnB1dCBidWZmZXIgb3ZlcmZsb3cAZmxleCBzY2FubmVyIHB1c2gtYmFjayBvdmVyZmxvdwBjb3VyaWVybmV3AFNwcmluZ1Ntb290aGVyX25ldwBUcmlhbmdsZVNtb290aGVyX25ldwBkaWFnX3ByZWNvbl9uZXcAUXVhZFRyZWVfbmV3AFN0cmVzc01ham9yaXphdGlvblNtb290aGVyMl9uZXcAbiAmJiBuZXcAc2tldwBzdHJ2aWV3AC9zdmcvaG9uZXlkZXcAIC1hbmNob3IgdwBzb3J0dgBwb3Y6cG92AE5vdgBpbnYAZXF1aXYAcGl2AG5vbmFtZS5ndgBHRF9yYW5rKGcpW3JdLmF2ID09IEdEX3JhbmsoZylbcl0udgBjYyVzXyV6dQBjYyVzKyV6dQAvc3ZnL3BlcnUAbnUAbXUAJWMlbGx1AFRodQB0YXUAVGF1AE51AE11AF9wb3J0XyVzXyglZClfKCVkKV8ldQBOdW1iZXIgb2YgaXRlcmF0aW9ucyA9ICV1AE51bWJlciBvZiBpbmNyZWFzZXMgPSAldQBwbGFpbnRleHQAc3RyZXNzd3QAaW5wdXQAdGV4dGxheW91dABkb3RfbGF5b3V0AG5lYXRvX2xheW91dABpbml0TGF5b3V0AGNsdXN0AG1hcENsdXN0AGxhYmVsanVzdABzY0FkanVzdABBdWd1c3QAZWRnZXNmaXJzdABub2Rlc2ZpcnN0AG1heGltYWxfaW5kZXBlbmRlbnRfZWRnZV9zZXRfaGVhdmVzdF9lZGdlX3Blcm5vZGVfc3VwZXJub2Rlc19maXJzdABleGlzdAByZWFsaWduTm9kZWxpc3QAYXBwZW5kTm9kZWxpc3QAZGVmYXVsdGRpc3QAbWluZGlzdABwb3dlcl9kaXN0AGdyYXBoX2Rpc3QAYXZnX2Rpc3QAZ2V0RWRnZUxpc3QAaXF1ZXN0AGxvd2FzdABzcHJpbmdfZWxlY3RyaWNhbF9lbWJlZGRpbmdfZmFzdABndl9zb3J0AHZpZXdwb3J0AHRhaWxwb3J0AHVuZXhwZWN0ZWQgcGFyc2VyIHN0YXRlIC0gcGxlYXNlIHNlbmQgYSBidWcgcmVwb3J0AGhlYWRwb3J0AGh0bWxfcG9ydABpbnNlcnQAUlRyZWVJbnNlcnQAZmluZFNWZXJ0AHN0YXJ0AHBhcnQAZXN0aW1hdGVfdGV4dF93aWR0aF8xcHQAcXVvdAB/cm9vdABub3QAbWFrZV92bl9zbG90AGVtaXRfeGRvdAB4ZG90Onhkb3QAZXBzOnhkb3QAc3ZnOnhkb3QAanBnOnhkb3QAcG5nOnhkb3QAanBlZzp4ZG90AGdpZjp4ZG90AGpwZTp4ZG90AHhkb3QxLjQ6eGRvdAB4ZG90MS4yOnhkb3QAc2RvdABtaWRkb3QAZ3Y6ZG90AHBsYWluLWV4dDpkb3QAZG90OmRvdABlcHM6ZG90AGNhbm9uOmRvdABwbGFpbjpkb3QAc3ZnOmRvdABqcGc6ZG90AHBuZzpkb3QAanBlZzpkb3QAZ2lmOmRvdABqcGU6ZG90AH9ib3QAZG9Eb3QAb2JqbGlzdF9mcm9udABwb2ludHNfZnJvbnQAY29sb3JzZWdzX2Zyb250AG5vZGVsaXN0X3BvcF9mcm9udABwYnNfc2l6ZV9mcm9udABzcGFuLT5mb250AHZhZ3hicHJpbnQAeGRvdF9wb2ludABkZWNpZGVfcG9pbnQAVW5zYXRpc2ZpZWQgY29uc3RyYWludAB0cmFuc3BhcmVudABjb21wb25lbnQAaW52YWxpZCBhcmd1bWVudABjb21tZW50AGp1bmsgYWZ0ZXIgZG9jdW1lbnQgZWxlbWVudABjZW50AGkgPT0gZWNudABhcmlhbG10AGx0AGNpcmN1aXQAcG9seV9pbml0AE11bHRpbGV2ZWxfaW5pdABuc2xpbWl0AG1jbGltaXQAUG9ydHJhaXQAbGlnaHQAdmlydHVhbF93ZWlnaHQAbGhlaWdodABLUF9SaWdodABCb29rbWFuLUxpZ2h0AGd0AEtQX0xlZnQAY2hhcnNldABpbnNldABiaXRhcnJheV9yZXNldABzdWJzZXQAYml0YXJyYXlfc2V0AG1hdHJpeF9zZXQAbm9kZWxpc3Rfc2V0AGVkZ2VfbGlzdF9zZXQAdHJhcHNfc2V0AG5vZGVzX3NldABzY2FybGV0AC9zdmcvZGFya3Zpb2xldAAvc3ZnL2JsdWV2aW9sZXQAL3N2Zy92aW9sZXQAVHJlYnVjaGV0AGFneGdldAB0YWlsdGFyZ2V0AGxhYmVsdGFyZ2V0AGVkZ2V0YXJnZXQAaGVhZHRhcmdldABiaXRhcnJheV9nZXQAZGVnbGlzdF9nZXQAbm9kZWxpc3RfZ2V0AGFkal9saXN0X2dldABzZWdfbGlzdF9nZXQAc2FtZV9saXN0X2dldABlZGdlX2xpc3RfZ2V0AG5vZGVfbGlzdF9nZXQAc2ZvbnRfZ2V0AGVkZ2Vfc2V0X2dldAByb3dzX2dldAB0c3RzX2dldABwb2ludHNfZ2V0AHBhaXJzX2dldAB0cmFwc19nZXQAY2VsbHNfZ2V0AGNvbG9yc2Vnc19nZXQAYm94ZXNfZ2V0AHRyaWFuZ2xlc19nZXQAY3ljbGVzX2dldABxbm9kZXNfZ2V0AGVzdGFja19nZXQAaW50X3N0YWNrX2dldABkZnNfc3RhY2tfZ2V0AG5vZGVfc3RhY2tfZ2V0AGJlemllcl9wYXRoX2dldABub2RlX3F1ZXVlX2dldABzdHlsZXNoZWV0AHN0cmljdABhZ2NvcHlkaWN0AGFnbWFrZWRhdGFkaWN0AHJlYy0+ZGljdCA9PSBkYXRhZGljdAB3cml0ZV9kaWN0AHNlY3QAZW5jb2Rpbmcgc3BlY2lmaWVkIGluIFhNTCBkZWNsYXJhdGlvbiBpcyBpbmNvcnJlY3QAYXNwZWN0AGxheWVyc2VsZWN0AEtQX1N1YnRyYWN0AFF1YWRUcmVlX3JlcHVsc2l2ZV9mb3JjZV9pbnRlcmFjdABjb21wYWN0AE9jdAByZXF1ZXN0ZWQgZmVhdHVyZSByZXF1aXJlcyBYTUxfRFREIHN1cHBvcnQgaW4gRXhwYXQAbGFiZWxmbG9hdABsYWJlbF9mbG9hdABTcGFyc2VNYXRyaXhfZnJvbV9jb29yZGluYXRlX2Zvcm1hdAAvc3ZnL3doZWF0AG9iamxpc3RfYXQAZGVnbGlzdF9hdABub2RlbGlzdF9hdABhZGpfbGlzdF9hdABzZWdfbGlzdF9hdABzYW1lX2xpc3RfYXQAZWRnZV9saXN0X2F0AG5vZGVfbGlzdF9hdABzZm9udF9hdABlZGdlX3NldF9hdAByb3dzX2F0AHRzdHNfYXQAcG9pbnRzX2F0AHBhaXJzX2F0AHRyYXBzX2F0AGh0ZXh0c3BhbnNfYXQAY2VsbHNfYXQAY29sb3JzZWdzX2F0AGJveGVzX2F0AHRyaWFuZ2xlc19hdABjeWNsZXNfYXQAcW5vZGVzX2F0AGVzdGFja19hdABpbnRfc3RhY2tfYXQAZGZzX3N0YWNrX2F0AG5vZGVfc3RhY2tfYXQAbm9kZV9xdWV1ZV9hdABTYXQAQWdyYXBoaW5mb190AEFnZWRnZWluZm9fdABBZ25vZGVpbmZvX3QAXHQAZmxhdGluZGV4KGFnaGVhZChlKSkgPCBNLT5ucm93cwBtaW51cwBvcGx1cwBoZWFydHMAc2FtcGxlcG9pbnRzAGRpcmVkZ2Vjb25zdHJhaW50cwBsZXZlbCBhc3NpZ25tZW50IGNvbnN0cmFpbnRzAHh5IHBzZXVkby1vcnRob2dvbmFsIGNvbnN0cmFpbnRzAHl4IHBzZXVkby1vcnRob2dvbmFsIGNvbnN0cmFpbnRzAHh5IG9ydGhvZ29uYWwgY29uc3RyYWludHMAeXggb3J0aG9nb25hbCBjb25zdHJhaW50cwBsaW5lIHNlZ21lbnRzAHNldF9jZWxsX2hlaWdodHMAcmVjdHMAYWNjb3VudGluZ1JlcG9ydFN0YXRzAGVudGl0eVRyYWNraW5nUmVwb3J0U3RhdHMAWmFwZkRpbmdiYXRzAHJlbWluY3Jvc3MAY29tcHJlc3MAZ3Z1c2Vyc2hhcGVfZmlsZV9hY2Nlc3MAYnJhc3MAY2xhc3MAYXBwbHlhdHRycwBhZ21ha2VhdHRycwBiaW5kYXR0cnMAcGFyc2VfbGF5ZXJzAG1rQ2x1c3RlcnMAcm91bmRfY29ybmVycwBtYWtlX2JhcnJpZXJzAGNkYXRhLm50b3BsZXZlbCA9PSBhZ25ub2RlcyhnKSAtIGNkYXRhLm52YXJzAGNhbm5vdCByZWFsbG9jIG9wcwBjYW5ub3QgcmVhbGxvYyBwbmxwcwBlcHMAY29yZV9sb2FkaW1hZ2VfcHMAZXBzOnBzAHBzMjpwcwAobGliKTpwcwBndl90cmltX3plcm9zAGFneGJ1Zl90cmltX3plcm9zAHRleGd5cmVoZXJvcwBpbWFnZXBvcwB0aW5vcwBzZXRFZGdlTGFiZWxQb3MAU2V0dGluZyBpbml0aWFsIHBvc2l0aW9ucwB4bGludGVyc2VjdGlvbnMAY29sdW1ucwBub2Rlc19jb250YWlucwBkZWphdnVzYW5zAG5pbWJ1c3NhbnMAbGliZXJhdGlvbnNhbnMAZnJlZXNhbnMAT3BlblNhbnMAb2Zmc2V0ID09IG5fdGVybXMAZGl0ZW1zAGRpYW1zAGZsYXRpbmRleChhZ3RhaWwoZSkpIDwgTS0+bmNvbHMAY2Fubm90IHJlYWxsb2MgZHEucG5scwBjYW5ub3QgcmVhbGxvYyBwbmxzAGxldmVscwBmb3JjZWxhYmVscwBkaWFnb25hbHMAbWVyZ2VfcmFua3MAc3BsaXRCbG9ja3MAaW52aXMAY2Fubm90IHJlYWxsb2MgdHJpcwBzZXRfY2VsbF93aWR0aHMAQ2FsY3VsYXRpbmcgc2hvcnRlc3QgcGF0aHMAeWVzAHNob3dib3hlcwBiZWF1dGlmeV9sZWF2ZXMAYXR0YWNoX2VkZ2VfbGFiZWxfY29vcmRpbmF0ZXMAcG9seWxpbmVzAHNwbGluZXMAb3J0aG9nb25hbCBsaW5lcwB0ZXhneXJldGVybWVzAG90aW1lcwBUaW1lcwBmb250bmFtZXMAcHJlZml4IG11c3Qgbm90IGJlIGJvdW5kIHRvIG9uZSBvZiB0aGUgcmVzZXJ2ZWQgbmFtZXNwYWNlIG5hbWVzAFNwYXJzZU1hdHJpeF9zdW1fcmVwZWF0X2VudHJpZXMAcGVyaXBoZXJpZXMAR2V0QnJhbmNoZXMAZiA8IGdyYXBoW2pdLm5lZGdlcwBtaW5tYXhfZWRnZXMAZXhjaGFuZ2VfdHJlZV9lZGdlcwBtYWtlU3RyYWlnaHRFZGdlcwB1bmRvQ2x1c3RlckVkZ2VzAGNvbXBvdW5kRWRnZXMAbWVyZ2VfdHJlZXMAX19jbHVzdGVybm9kZXMAYWdubm9kZXMATkRfaWQobnApID09IG5fbm9kZXMATG9hZE5vZGVzAHNpZGVzAHNwYWRlcwB2ZXJ0aWNlcwBjb29yZHMAc2V0Ym91bmRzAG1kcwBjZHMAbWFrZVNlbGZBcmNzAGVtaXRfZWRnZV9ncmFwaGljcwBjbHVicwBjb25zb2xhcwAlbGYlMnMAClN0cmluZyBzdGFydGluZzo8JS44MHMAClN0cmluZyBzdGFydGluZzoiJS44MHMAICUuKnMAJXMlcwBleHBhdDogQWNjb3VudGluZyglcCk6IERpcmVjdCAlMTBsbHUsIGluZGlyZWN0ICUxMGxsdSwgYW1wbGlmaWNhdGlvbiAlOC4yZiVzACUuKnMlYyVzACAlczolcwBfXyVkOiVzAC8lcy8lcwAlcy0lcwAsJXMAIGZvbnQtZmFtaWx5PSIlcwAiIHN0cm9rZS1kYXNoYXJyYXk9IiVzACIgY2xhc3M9IiVzAHBvbHkgJXMAKCglZiwlZiksKCVmLCVmKSkgJXMgJXMAY29sb3IgJXMAcm9vdCA9ICVzACBUaXRsZTogJXMAInN0cmljdCI6ICVzAGNvdXIAdXRyAGFwcGVuZGF0dHIAYWRkYXR0cgBiZWdpbnN0cgBmc3RyAHN0cnZpZXdfc3RyAHBvdl9jb2xvcl9hc19zdHIAdnBzYyE9bnVsbHB0cgBiZW5kVG9TdHIAdWFycgBjcmFycgBsYXJyAGhhcnIAZGFycgB1QXJyAHJBcnIAbEFycgBoQXJyAGRBcnIAQXByAFNwYXJzZU1hdHJpeF9tdWx0aXBseV92ZWN0b3IAdGVybWluYXRvcgBpbnN1bGF0b3IAaW50ZXJuYWxFbnRpdHlQcm9jZXNzb3IAdGV4Z3lyZWN1cnNvcgBzeW50YXggZXJyb3IAbW9uZXlfZ2V0IGVycm9yAEVycm9yAHJmbG9vcgBsZmxvb3IAbGFiZWxmb250Y29sb3IAcGVuY29sb3IAZmlsbGNvbG9yAGJnY29sb3IAcm93IG1ham9yAGNvbHVtbiBtYWpvcgBuZWlnaGJvcgBzdHlsZV9vcgBtcgByYW5rZGlyAHBhZ2VkaXIAbGF5ZXIAdXBwZXIgPj0gbG93ZXIATm9kZUNvdmVyAC9zdmcvc2lsdmVyAGNsdXN0ZXIAZXhwYW5kQ2x1c3RlcgBycHJvbW90ZXIAbHByb21vdGVyAGNlbnRlcgBtYXhpdGVyAHBhcnRpYWwgY2hhcmFjdGVyACEgcm9vdFBhcnNlci0+bV9wYXJlbnRQYXJzZXIAZGtncmVlbmNvcHBlcgBjb29sY29wcGVyAGd2X3NvcnRfY29tcGFyX3dyYXBwZXIAdGFwZXIAb3ZlcmxhcF9iZXppZXIAZmlnX2JlemllcgBjb3VyaWVyAENvdXJpZXIAaGllcgBkYWdnZXIARGFnZ2VyAG91dHB1dG9yZGVyAHBvc3RvcmRlcgBmbGF0X3Jlb3JkZXIAY2VsbGJvcmRlcgBmaXhMYWJlbE9yZGVyAGN5bGluZGVyAC9zdmcvbGF2ZW5kZXIAcmVuZGVyAGZvbGRlcgBjbHVzdGVyX2xlYWRlcgBORF9VRl9zaXplKG4pIDw9IDEgfHwgbiA9PSBsZWFkZXIAT2N0b2JlcgByZWZlcmVuY2UgdG8gaW52YWxpZCBjaGFyYWN0ZXIgbnVtYmVyAE5vdmVtYmVyAFNlcHRlbWJlcgBEZWNlbWJlcgBtYWNyAGJyAHN0YXIAZmVsZHNwYXIAcmVndWxhcgBodGV4dHNwYW5zX2NsZWFyAGlvc19iYXNlOjpjbGVhcgBicnZiYXIATWFyAFxyAE5EX3JhbmsodikgPT0gcgBzdHJlcQBzdHJ2aWV3X2VxAHN0cnZpZXdfc3RyX2VxAHN0cnZpZXdfY2FzZV9zdHJfZXEAc3Rydmlld19jYXNlX2VxAHZwACUlQmVnaW5Qcm9sb2cKL0RvdERpY3QgMjAwIGRpY3QgZGVmCkRvdERpY3QgYmVnaW4KCi9zZXR1cExhdGluMSB7Cm1hcmsKL0VuY29kaW5nVmVjdG9yIDI1NiBhcnJheSBkZWYKIEVuY29kaW5nVmVjdG9yIDAKCklTT0xhdGluMUVuY29kaW5nIDAgMjU1IGdldGludGVydmFsIHB1dGludGVydmFsCkVuY29kaW5nVmVjdG9yIDQ1IC9oeXBoZW4gcHV0CgolIFNldCB1cCBJU08gTGF0aW4gMSBjaGFyYWN0ZXIgZW5jb2RpbmcKL3N0YXJuZXRJU08gewogICAgICAgIGR1cCBkdXAgZmluZGZvbnQgZHVwIGxlbmd0aCBkaWN0IGJlZ2luCiAgICAgICAgeyAxIGluZGV4IC9GSUQgbmUgeyBkZWYgfXsgcG9wIHBvcCB9IGlmZWxzZQogICAgICAgIH0gZm9yYWxsCiAgICAgICAgL0VuY29kaW5nIEVuY29kaW5nVmVjdG9yIGRlZgogICAgICAgIGN1cnJlbnRkaWN0IGVuZCBkZWZpbmVmb250Cn0gZGVmCi9UaW1lcy1Sb21hbiBzdGFybmV0SVNPIGRlZgovVGltZXMtSXRhbGljIHN0YXJuZXRJU08gZGVmCi9UaW1lcy1Cb2xkIHN0YXJuZXRJU08gZGVmCi9UaW1lcy1Cb2xkSXRhbGljIHN0YXJuZXRJU08gZGVmCi9IZWx2ZXRpY2Egc3Rhcm5ldElTTyBkZWYKL0hlbHZldGljYS1PYmxpcXVlIHN0YXJuZXRJU08gZGVmCi9IZWx2ZXRpY2EtQm9sZCBzdGFybmV0SVNPIGRlZgovSGVsdmV0aWNhLUJvbGRPYmxpcXVlIHN0YXJuZXRJU08gZGVmCi9Db3VyaWVyIHN0YXJuZXRJU08gZGVmCi9Db3VyaWVyLU9ibGlxdWUgc3Rhcm5ldElTTyBkZWYKL0NvdXJpZXItQm9sZCBzdGFybmV0SVNPIGRlZgovQ291cmllci1Cb2xkT2JsaXF1ZSBzdGFybmV0SVNPIGRlZgpjbGVhcnRvbWFyawp9IGJpbmQgZGVmCgolJUJlZ2luUmVzb3VyY2U6IHByb2NzZXQgZ3JhcGh2aXogMCAwCi9jb29yZC1mb250LWZhbWlseSAvVGltZXMtUm9tYW4gZGVmCi9kZWZhdWx0LWZvbnQtZmFtaWx5IC9UaW1lcy1Sb21hbiBkZWYKL2Nvb3JkZm9udCBjb29yZC1mb250LWZhbWlseSBmaW5kZm9udCA4IHNjYWxlZm9udCBkZWYKCi9JbnZTY2FsZUZhY3RvciAxLjAgZGVmCi9zZXRfc2NhbGUgewogICAgICAgZHVwIDEgZXhjaCBkaXYgL0ludlNjYWxlRmFjdG9yIGV4Y2ggZGVmCiAgICAgICBzY2FsZQp9IGJpbmQgZGVmCgolIHN0eWxlcwovc29saWQgeyBbXSAwIHNldGRhc2ggfSBiaW5kIGRlZgovZGFzaGVkIHsgWzkgSW52U2NhbGVGYWN0b3IgbXVsIGR1cCBdIDAgc2V0ZGFzaCB9IGJpbmQgZGVmCi9kb3R0ZWQgeyBbMSBJbnZTY2FsZUZhY3RvciBtdWwgNiBJbnZTY2FsZUZhY3RvciBtdWxdIDAgc2V0ZGFzaCB9IGJpbmQgZGVmCi9pbnZpcyB7L2ZpbGwge25ld3BhdGh9IGRlZiAvc3Ryb2tlIHtuZXdwYXRofSBkZWYgL3Nob3cge3BvcCBuZXdwYXRofSBkZWZ9IGJpbmQgZGVmCi9ib2xkIHsgMiBzZXRsaW5ld2lkdGggfSBiaW5kIGRlZgovZmlsbGVkIHsgfSBiaW5kIGRlZgovdW5maWxsZWQgeyB9IGJpbmQgZGVmCi9yb3VuZGVkIHsgfSBiaW5kIGRlZgovZGlhZ29uYWxzIHsgfSBiaW5kIGRlZgovdGFwZXJlZCB7IH0gYmluZCBkZWYKCiUgaG9va3MgZm9yIHNldHRpbmcgY29sb3IgCi9ub2RlY29sb3IgeyBzZXRoc2Jjb2xvciB9IGJpbmQgZGVmCi9lZGdlY29sb3IgeyBzZXRoc2Jjb2xvciB9IGJpbmQgZGVmCi9ncmFwaGNvbG9yIHsgc2V0aHNiY29sb3IgfSBiaW5kIGRlZgovbm9wY29sb3Ige3BvcCBwb3AgcG9wfSBiaW5kIGRlZgoKL2JlZ2lucGFnZSB7CSUgaSBqIG5wYWdlcwoJL25wYWdlcyBleGNoIGRlZgoJL2ogZXhjaCBkZWYKCS9pIGV4Y2ggZGVmCgkvc3RyIDEwIHN0cmluZyBkZWYKCW5wYWdlcyAxIGd0IHsKCQlnc2F2ZQoJCQljb29yZGZvbnQgc2V0Zm9udAoJCQkwIDAgbW92ZXRvCgkJCShcKCkgc2hvdyBpIHN0ciBjdnMgc2hvdyAoLCkgc2hvdyBqIHN0ciBjdnMgc2hvdyAoXCkpIHNob3cKCQlncmVzdG9yZQoJfSBpZgp9IGJpbmQgZGVmCgovc2V0X2ZvbnQgewoJZmluZGZvbnQgZXhjaAoJc2NhbGVmb250IHNldGZvbnQKfSBkZWYKCiUgZHJhdyB0ZXh0IGZpdHRlZCB0byBpdHMgZXhwZWN0ZWQgd2lkdGgKL2FsaWduZWR0ZXh0IHsJCQklIHdpZHRoIHRleHQKCS90ZXh0IGV4Y2ggZGVmCgkvd2lkdGggZXhjaCBkZWYKCWdzYXZlCgkJd2lkdGggMCBndCB7CgkJCVtdIDAgc2V0ZGFzaAoJCQl0ZXh0IHN0cmluZ3dpZHRoIHBvcCB3aWR0aCBleGNoIHN1YiB0ZXh0IGxlbmd0aCBkaXYgMCB0ZXh0IGFzaG93CgkJfSBpZgoJZ3Jlc3RvcmUKfSBkZWYKCi9ib3hwcmltIHsJCQkJJSB4Y29ybmVyIHljb3JuZXIgeHNpemUgeXNpemUKCQk0IDIgcm9sbAoJCW1vdmV0bwoJCTIgY29weQoJCWV4Y2ggMCBybGluZXRvCgkJMCBleGNoIHJsaW5ldG8KCQlwb3AgbmVnIDAgcmxpbmV0bwoJCWNsb3NlcGF0aAp9IGJpbmQgZGVmCgovZWxsaXBzZV9wYXRoIHsKCS9yeSBleGNoIGRlZgoJL3J4IGV4Y2ggZGVmCgkveSBleGNoIGRlZgoJL3ggZXhjaCBkZWYKCW1hdHJpeCBjdXJyZW50bWF0cml4CgluZXdwYXRoCgl4IHkgdHJhbnNsYXRlCglyeCByeSBzY2FsZQoJMCAwIDEgMCAzNjAgYXJjCglzZXRtYXRyaXgKfSBiaW5kIGRlZgoKL2VuZHBhZ2UgeyBzaG93cGFnZSB9IGJpbmQgZGVmCi9zaG93cGFnZSB7IH0gZGVmCgovbGF5ZXJjb2xvcnNlcQoJWwklIGxheWVyIGNvbG9yIHNlcXVlbmNlIC0gZGFya2VzdCB0byBsaWdodGVzdAoJCVswIDAgMF0KCQlbLjIgLjggLjhdCgkJWy40IC44IC44XQoJCVsuNiAuOCAuOF0KCQlbLjggLjggLjhdCgldCmRlZgoKL2xheWVybGVuIGxheWVyY29sb3JzZXEgbGVuZ3RoIGRlZgoKL3NldGxheWVyIHsvbWF4bGF5ZXIgZXhjaCBkZWYgL2N1cmxheWVyIGV4Y2ggZGVmCglsYXllcmNvbG9yc2VxIGN1cmxheWVyIDEgc3ViIGxheWVybGVuIG1vZCBnZXQKCWFsb2FkIHBvcCBzZXRoc2Jjb2xvcgoJL25vZGVjb2xvciB7bm9wY29sb3J9IGRlZgoJL2VkZ2Vjb2xvciB7bm9wY29sb3J9IGRlZgoJL2dyYXBoY29sb3Ige25vcGNvbG9yfSBkZWYKfSBiaW5kIGRlZgoKL29ubGF5ZXIgeyBjdXJsYXllciBuZSB7aW52aXN9IGlmIH0gZGVmCgovb25sYXllcnMgewoJL215dXBwZXIgZXhjaCBkZWYKCS9teWxvd2VyIGV4Y2ggZGVmCgljdXJsYXllciBteWxvd2VyIGx0CgljdXJsYXllciBteXVwcGVyIGd0CglvcgoJe2ludmlzfSBpZgp9IGRlZgoKL2N1cmxheWVyIDAgZGVmCgolJUVuZFJlc291cmNlCiUlRW5kUHJvbG9nCiUlQmVnaW5TZXR1cAoxNCBkZWZhdWx0LWZvbnQtZmFtaWx5IHNldF9mb250CiUgL2Fycm93bGVuZ3RoIDEwIGRlZgolIC9hcnJvd3dpZHRoIDUgZGVmCgolIG1ha2Ugc3VyZSBwZGZtYXJrIGlzIGhhcm1sZXNzIGZvciBQUy1pbnRlcnByZXRlcnMgb3RoZXIgdGhhbiBEaXN0aWxsZXIKL3BkZm1hcmsgd2hlcmUge3BvcH0ge3VzZXJkaWN0IC9wZGZtYXJrIC9jbGVhcnRvbWFyayBsb2FkIHB1dH0gaWZlbHNlCiUgbWFrZSAnPDwnIGFuZCAnPj4nIHNhZmUgb24gUFMgTGV2ZWwgMSBkZXZpY2VzCi9sYW5ndWFnZWxldmVsIHdoZXJlIHtwb3AgbGFuZ3VhZ2VsZXZlbH17MX0gaWZlbHNlCjIgbHQgewogICAgdXNlcmRpY3QgKDw8KSBjdm4gKFspIGN2biBsb2FkIHB1dAogICAgdXNlcmRpY3QgKD4+KSBjdm4gKFspIGN2biBsb2FkIHB1dAp9IGlmCgolJUVuZFNldHVwAHN1cABncm91cABjdXAAdGhpbnNwAGVuc3AAZW1zcABuYnNwAHBlcnAAd2VpZXJwAGdlbmVyYXRlLWNvbnN0cmFpbnRzLmNwcABibG9jay5jcHAAY3NvbHZlX1ZQU0MuY3BwAH90b3AAcHJvcABhZ3hicG9wAG5vcABhc3ltcABjb21wAGZpbmRDQ29tcABibXAAc2NhbGVfY2xhbXAAeGxwAGxwICE9IGNscAB0YWlsX2xwAGhlYWRfbHAAdGFpbHRvb2x0aXAAbGFiZWx0b29sdGlwAGVkZ2V0b29sdGlwAGhlYWR0b29sdGlwAGhlbGxpcAB0YWlsY2xpcABoZWFkY2xpcAAvc3ZnL3BhcGF5YXdoaXAAaHAAdHJhbnNwb3NlX3N0ZXAAY29tcHV0ZVN0ZXAAbGF5ZXJsaXN0c2VwAGxheWVyc2VwAGlwc2VwAHJhbmtzZXAAbm9kZXNlcABzdWJncmFwaHMgbmVzdGVkIG1vcmUgdGhhbiAlZCBkZWVwAFNlcABzZmRwAGNwAHdlYnAAaWRtYXAAY2x1c3Rlcl9tYXAAY21hcHg6bWFwAGVwczptYXAAY21hcHhfbnA6bWFwAGltYXBfbnA6bWFwAGlzbWFwOm1hcABpbWFwOm1hcABjbWFwOm1hcABzdmc6bWFwAGpwZzptYXAAcG5nOm1hcABqcGVnOm1hcABnaWY6bWFwAGpwZTptYXAAb3ZlcmxhcABsZXZlbHNnYXAAY2FwAEtQX1VwACVJOiVNOiVTICVwAHN0YXJ0IDw9IHAAcnNxdW8AbHNxdW8AcmRxdW8AbGRxdW8AYmRxdW8Ac2JxdW8AcnNhcXVvAGxzYXF1bwByYXF1bwBsYXF1bwBhdXRvAE51bml0bwAvc3ZnL3RvbWF0bwBuZWF0bwBldXJvAC9zdmcvZ2FpbnNib3JvAE1ldGhvZFplcm8AbWljcm8AbmltYnVzbW9ubwBsaWJlcmF0aW9ubW9ubwBmcmVlbW9ubwBhcmltbwByYXRpbwBwb3J0aG8AcmhvAFJobwAvc3ZnL2luZGlnbwBwaW5mbwBjY2dyYXBoaW5mbwBjY2dub2RlaW5mbwBjbF9lZGdlX2luZm8AZ2V0UGFja0luZm8AbWFrZUluZm8AcGFyc2VQYWNrTW9kZUluZm8AY2lyY28AaWNvAFwlMDNvAC9zdmcvcm9zeWJyb3duAC9zdmcvc2FuZHlicm93bgB2ZXJ5ZGFya2Jyb3duAC9zdmcvc2FkZGxlYnJvd24AL3N2Zy9icm93bgBLUF9Eb3duAGNhbm5vdCBjaGFuZ2Ugc2V0dGluZyBvbmNlIHBhcnNpbmcgaGFzIGJlZ3VuAFN1bgBKdW4AdGhvcm4AL3N2Zy9jcmltc29uAHhkb3RfanNvbgB4ZG90X2pzb246anNvbgBqc29uMDpqc29uAG9taWNyb24AT21pY3JvbgBzY2Fyb24AU2Nhcm9uAHdlYm1hcm9vbgB4MTFtYXJvb24AL3N2Zy9tYXJvb24AL3N2Zy9saWdodHNhbG1vbgAvc3ZnL2RhcmtzYWxtb24AL3N2Zy9zYWxtb24AdXBzaWxvbgBlcHNpbG9uAFVwc2lsb24ARXBzaWxvbgByZXNvbHV0aW9uAGRpc3RvcnRpb24Ac3RkOjpleGNlcHRpb24AcGFydGl0aW9uAGRvdF9wb3NpdGlvbgBTZXR0aW5nIHVwIHN0cmVzcyBmdW5jdGlvbgB1bmNsb3NlZCBDREFUQSBzZWN0aW9uAHBvc3RhY3Rpb24Acm90YXRpb24Ab3JpZW50YXRpb24AYWJvbWluYXRpb24AYWNjb3VudGluZ0dldEN1cnJlbnRBbXBsaWZpY2F0aW9uAHhkb3R2ZXJzaW9uAFNUc2V0VW5pb24APHBvbHlnb24AaGV4YWdvbgBzZXB0YWdvbgBwZW50YWdvbgB0cmlwbGVvY3RhZ29uAGRvdWJsZW9jdGFnb24AL3N2Zy9sZW1vbmNoaWZmb24ATW9uAHBsdXNtbgBub3RpbgBpc2luAC9zdmcvbW9jY2FzaW4AcGluAG1pbgB2b3JvX21hcmdpbgBpbmZpbgBvbmVkX29wdGltaXplcl90cmFpbgBwbGFpbgBtYWtlX2NoYWluAG1lcmdlX2NoYWluAGRlbGV0ZU1pbgBmaW5kTWluAHZhbGlnbgBiYWxpZ24AeWVuAE11bHRpbGV2ZWxfY29hcnNlbgBjdXJyZW4AUG9ic29wZW4AZ3ZfZm9wZW4AZ3Z1c2Vyc2hhcGVfb3BlbgBlbnRpdHlUcmFja2luZ09uT3BlbgAvc3ZnL2xpbmVuAGRpbWVuAG1pbmxlbgBzdHlsZV90b2tlbgB1bmNsb3NlZCB0b2tlbgAvc3ZnL3llbGxvd2dyZWVuAG1lZGl1bWZvcmVzdGdyZWVuAC9zdmcvZm9yZXN0Z3JlZW4AL3N2Zy9saWdodGdyZWVuAGh1bnRlcnNncmVlbgAvc3ZnL2xhd25ncmVlbgAvc3ZnL2RhcmtncmVlbgAvc3ZnL21lZGl1bXNwcmluZ2dyZWVuAC9zdmcvc3ByaW5nZ3JlZW4AL3N2Zy9kYXJrb2xpdmVncmVlbgAvc3ZnL2xpbWVncmVlbgAvc3ZnL3BhbGVncmVlbgB3ZWJncmVlbgAvc3ZnL2xpZ2h0c2VhZ3JlZW4AL3N2Zy9tZWRpdW1zZWFncmVlbgAvc3ZnL2RhcmtzZWFncmVlbgAvc3ZnL3NlYWdyZWVuAHgxMWdyZWVuAC9zdmcvZ3JlZW4AR3JlZW4AL3N2Zy9saWdodGN5YW4AL3N2Zy9kYXJrY3lhbgAvc3ZnL2N5YW4AbmV3dGFuAGRhcmt0YW4AL3N2Zy90YW4Acm93c3BhbgBjb2xzcGFuAG5hbgB0aW1lc25ld3JvbWFuAG5pbWJ1c3JvbWFuAHRpbWVzcm9tYW4AVGltZXMtUm9tYW4AUGFsYXRpbm8tUm9tYW4ATmV3Q2VudHVyeVNjaGxiay1Sb21hbgBKYW4AR0RfcmFuayhnKVtyXS5uIDw9IEdEX3JhbmsoZylbcl0uYW4AYWd4YnB1dF9uAFxuAG5fbm9kZXMgPT0gZ3JhcGgtPm4AQS0+bSA9PSBBLT5uAGpvYi0+b2JqLT51Lm4AcywlbGYsJWxmJW4AIGUsJWxmLCVsZiVuACVkICUxWyJdJW4AdiA9PSBuAG56YyA9PSBuAGIgPT0gbgBuY2x1c3RlciA8PSBuAHBzeW0AYWxlZnN5bQB0aGV0YXN5bQBxdWFudHVtAHN1bQAvc3ZnL3BsdW0AaW52dHJhcGV6aXVtAG1lZGl1bQA5OnByaXNtAGxybQBjdXN0b20AYXB0ci0+dGFnID09IFRfYXRvbQAvZGV2L3VyYW5kb20AZ3ZfcmFuZG9tAHJsbQBzaW0ASU1EU19naXZlbl9kaW0Ab3JkbQBwYXJhbGxlbG9ncmFtAC9zdmcvbWludGNyZWFtAEp1bAB0bABmcmFzbABTeW1ib2wAZmluZENvbAA8P3htbAB5dW1sAHV1bWwAb3VtbABpdW1sAGV1bWwAYXVtbABZdW1sAFV1bWwAT3VtbABJdW1sAEV1bWwAQXVtbABjb3JlX2xvYWRpbWFnZV92cm1sAGpwZzp2cm1sAHBuZzp2cm1sAGpwZWc6dnJtbABnaWY6dnJtbABqcGU6dnJtbABidWxsAGZpbGwAL3N2Zy9zZWFzaGVsbABmb3JhbGwAQXByaWwAcGVybWlsAHJjZWlsAGxjZWlsAGNjZWRpbABDY2VkaWwAYXJyb3d0YWlsAGx0YWlsAHNhbWV0YWlsAGxldmVsID49IDAgJiYgbGV2ZWwgPD0gbi0+bGV2ZWwAc3RyZXNzX21ham9yaXphdGlvbl9rRF9ta2VybmVsAGlzX3BhcmFsbGVsAENhbGN1bGF0aW5nIGNpcmN1aXQgbW9kZWwAQ2FsY3VsYXRpbmcgc3Vic2V0IG1vZGVsAENhbGN1bGF0aW5nIE1EUyBtb2RlbAB4bGFiZWwAdGFpbGxhYmVsAGhlYWRsYWJlbABtYWtlX2xhYmVsAGdyYXBoIGxhYmVsAGlleGNsAG9ianAtPmxibABvdmFsAG1lcmdldmlydHVhbAAvc3ZnL2xpZ2h0Y29yYWwAL3N2Zy9jb3JhbABTcGFyc2VNYXRyaXhfZnJvbV9jb29yZGluYXRlX2FycmF5c19pbnRlcm5hbABNdWx0aWxldmVsX2NvYXJzZW5faW50ZXJuYWwAUXVhZFRyZWVfYWRkX2ludGVybmFsAGFycm93X2xlbmd0aF9ub3JtYWwAYXJpYWwAcmFkaWFsAC9zdmcvdGVhbAByZWFsAGxvY2FsAGVzdGltYXRlX2NoYXJhY3Rlcl93aWR0aF9jYW5vbmljYWwAZ2xvYmFsAHEtPmwALi4vLi4vbGliL2NncmFwaC9zY2FuLmwAdGs6dGsAZ2lmOnRrAHBhdGNod29yawB0b2sAYm9vawBBdmFudEdhcmRlLUJvb2sAc2luawBvdmVybGFwX3NocmluawBzcGljeXBpbmsAL3N2Zy9ob3RwaW5rAC9zdmcvbGlnaHRwaW5rAC9zdmcvZGVlcHBpbmsAbmVvbnBpbmsAL3N2Zy9waW5rAG5ld3JhbmsAY2x1c3RlcnJhbmsAX25ld19yYW5rAGluc3RhbGxfaW5fcmFuawByZW1vdmVfZnJvbV9yYW5rAC9zdmcvY29ybnNpbGsAb25lYmxvY2sAdi0+bGVmdC0+YmxvY2sgPT0gdi0+cmlnaHQtPmJsb2NrAC9zdmcvZmlyZWJyaWNrAFBRY2hlY2sAcGFjawAvc3ZnL2JsYWNrAEJsYWNrAHNmb250X2JhY2sAcm93c19iYWNrAHRzdHNfYmFjawBjb2xvcnNlZ3NfYmFjawBub2RlX2xpc3RfcG9wX2JhY2sAc2ZvbnRfcG9wX2JhY2sAdHN0c19wb3BfYmFjawBlc3RhY2tfcG9wX2JhY2sAZGZzX3N0YWNrX3BvcF9iYWNrAGRmc19zdGFja19iYWNrAHp3agB6d25qAGpvYi0+b2JqAGdldGludHJzeGkAcHNpAFBzaQBDYWxpYnJpAEZyaQB0d29waQBkcGkAdm9yb25vaQBWb3Jvbm9pAGNoYW5pAGRlbWkAQm9va21hbi1EZW1pAEF2YW50R2FyZGUtRGVtaQAvc3ZnL2RhcmtraGFraQAvc3ZnL2toYWtpAHBoaQBjaGkAUGhpAENoaQBkaQBYaQBQaQBORF9pZChucCkgPT0gaQBTdHJlc3NNYWpvcml6YXRpb25TbW9vdGhlcl9zbW9vdGgAU3ByaW5nU21vb3RoZXJfc21vb3RoAGJvdGgAc3RhcnRzd2l0aABsaW5lbGVuZ3RoAGJhZF9hcnJheV9uZXdfbGVuZ3RoAGF2ZXJhZ2VfZWRnZV9sZW5ndGgAZXRoAHBlbndpZHRoAGx3aWR0aABzZXRsaW5ld2lkdGgAc2hvcnRwYXRoAGZvbnRwYXRoAFBvYnNwYXRoAGJlZ2lucGF0aABpbWFnZXBhdGgAZW5kcGF0aABzdHJhaWdodF9wYXRoAG1hcF9wYXRoADxwYXRoAGNhbm5vdCBmaW5kIHRyaWFuZ2xlIHBhdGgAL3N2Zy9sYXZlbmRlcmJsdXNoAGZsZXNoAG9zbGFzaABPc2xhc2gAZHRzdHJoYXNoAHN0cmRpY3RfaGFzaABuZGFzaABtZGFzaABkaWdyYXBoAHN1YmdyYXBoAGNvbnN0cnVjdF9ncmFwaABjaGtTZ3JhcGgAY2xvc2VzdF9wYWlyczJncmFwaABhZ2RlbGV0ZSBvbiB3cm9uZyBncmFwaABjb25uZWN0R3JhcGgAdXBzaWgAJXNsaW5lLXRocm91Z2gAZmxhdF9zZWFyY2gAY2hhblNlYXJjaABSVHJlZVNlYXJjaABNYXJjaABEaXNjb25CcmFuY2gAUGlja0JyYW5jaABBZGRCcmFuY2gALi4vLi4vbGliL3V0aWwvYml0YXJyYXkuaAAuLi8uLi9saWIvdXRpbC9zdHJ2aWV3LmgALi4vLi4vbGliL2NpcmNvZ2VuL25vZGVsaXN0LmgALi4vLi4vbGliL3V0aWwvc29ydC5oAC4uLy4uL2xpYi9jZ3JhcGgvbm9kZV9zZXQuaAAuLi8uLi9saWIvY29tbW9uL2dsb2JhbHMuaAAuLi8uLi9saWIvY29tbW9uL2JveGVzLmgALi4vLi4vbGliL29ydGhvL3N0cnVjdHVyZXMuaAAuLi8uLi9saWIvZG90Z2VuL2RvdHByb2NzLmgALi4vLi4vbGliL3V0aWwvc3RyZXEuaAAuLi8uLi9saWIvb3J0aG8vdHJhcC5oAC4uLy4uL2xpYi91dGlsL3N0YXJ0c3dpdGguaAAuLi8uLi9saWIvdXRpbC9ndl9tYXRoLmgALi4vLi4vbGliL29ydGhvL3Jhd2dyYXBoLmgALi4vLi4vbGliL3V0aWwvYWd4YnVmLmgALi4vLi4vbGliL3V0aWwvdG9rZW5pemUuaAAuLi8uLi9saWIvY29tbW9uL2h0bWx0YWJsZS5oAC4uLy4uL2xpYi91dGlsL2FsbG9jLmgAYXV4ZwBjb3JlX2xvYWRpbWFnZV9zdmcAc3ZnOnN2ZwBqcGc6c3ZnAHBuZzpzdmcAanBlZzpzdmcAZ2lmOnN2ZwBqcGU6c3ZnAHN2Z19pbmxpbmU6c3ZnAEF1ZwBkb1Byb2xvZwBwb3dlcl9pdGVyYXRpb25fb3J0aG9nAHBuZwBpZGVhbF9kaXN0X3NjaGVtZSB2YWx1ZSB3cm9uZwB4ZG90IHZlcnNpb24gIiVzIiB0b28gbG9uZwBjb25nAGxibGVuY2xvc2luZwBiYXNpY19zdHJpbmcAZmFpbHVyZSBtYWxsb2MnaW5nIGZvciByZXN1bHQgc3RyaW5nAHNwcmluZwBvcmRlcmluZwBnZW5lcmF0ZVJhbmRvbU9yZGVyaW5nAGFyaW5nAEFyaW5nAERhbXBpbmcAV2FybmluZwBvdmVybGFwX3NjYWxpbmcAeCBhbmQgeSBzY2FsaW5nAG9sZCBzY2FsaW5nAHNtb290aGluZwB1bmtub3duIGVuY29kaW5nAG11bHRpbGV2ZWxfc3ByaW5nX2VsZWN0cmljYWxfZW1iZWRkaW5nAHNwcmluZ19lbGVjdHJpY2FsX3NwcmluZ19lbWJlZGRpbmcAY2VsbHBhZGRpbmcAY2VsbHNwYWNpbmcAcmFuZwBsYW5nAGZpdmVwb3ZlcmhhbmcAdGhyZWVwb3ZlcmhhbmcAbm92ZXJoYW5nAGVtaXRfaHRtbF9pbWcAbGcAb3JpZwBzemxpZwBvZWxpZwBhZWxpZwBPRWxpZwBBRWxpZwBjb3JlX2xvYWRpbWFnZV9maWcAanBnOmZpZwBwbmc6ZmlnAGZpZzpmaWcAanBlZzpmaWcAZ2lmOmZpZwBqcGU6ZmlnAGVnZwBuZXh0X3NlZwByZWcAanBlZwBpID09IGRlZwBkZwBjZwBjbG9zZXN1YmcAbWlzbWF0Y2hlZCB0YWcAYmV6LT5zZmxhZwBiZXotPmVmbGFnACEqZmxhZwAhZmxhZwA8ZwAlLjVnLCUuNWcsJS41ZywlLjVnACUuNWcgJS41ZwAlZyAlZwBib3hJbnRlcnNlY3RmAGVwc2YAYWdlZGdlc2VxY21wZgBjY3dyb3RhdGVwZgBmbm9mAGluZgBzZWxmAGhhbGYAJWxmJWxmJWxmJWxmACVsZiwlbGYsJWxmLCVsZiwlbGYAJSpmICUqZiAlbGYgJWxmAGxpYmVyYXRpb25zZXJpZgBmcmVlc2VyaWYAc2Fucy1TZXJpZgBnaWYAL3N2Zy9wZWFjaHB1ZmYAcmlmZgBhY2NvdW50aW5nUmVwb3J0RGlmZgB0YWlsaHJlZgBsYWJlbGhyZWYAZWRnZWhyZWYAaGVhZGhyZWYAb3JkZgBwZGYAc2lnbWFmAFxmACUuMExmACVMZgB1cy0+ZgAlLjAzZgAlcyB0cmFuc21pdCAlLjNmAHJnYjwlOS4zZiwgJTkuM2YsICU5LjNmPiB0cmFuc21pdCAlLjNmACUuMDJmACUuMmYAJS4wZiwlLjBmLCUuMGYsJS4wZgAgJS4wZiwlLjBmACUuMGYgJS4wZiAlLjBmICUuMGYAIiBmaWxsLW9wYWNpdHk9IiVmACIgc3Ryb2tlLW9wYWNpdHk9IiVmAApmaW5hbCBlID0gJWYAYnJvbnplAGFycm93c2l6ZQBsYWJlbGZvbnRzaXplAHNlYXJjaHNpemUAZml4ZWRzaXplAG5vZGVsaXN0X3NpemUAbm9kZV9zZXRfc2l6ZQB0cmFwc19zaXplAGNlbGxzX3NpemUAbm9kZXNfc2l6ZQB0ZXh0c3Bhbl9zaXplAHN2Z19zaXplAGNhcGFjaXR5ID4gZGljdC0+c2l6ZQBjYXBhY2l0eSA+IHNlbGYtPnNpemUAYnouc2l6ZQBwb2ludC1zaXplAG5vcm1hbGl6ZQBFTGluaXRpYWxpemUAbWtNYXplAGljdXJ2ZQBub2RlbGlzdF9yZW1vdmUAYWRqX2xpc3RfcmVtb3ZlAG5vZGVfc2V0X3JlbW92ZQBzdHJkaWN0X3JlbW92ZQBzb2x2ZQAhdi0+YWN0aXZlAC1hY3RpdmUAZm9udF9pbl9saXN0X3Blcm1pc3NpdmUAL3N2Zy9vbGl2ZQB1Z3JhdmUAb2dyYXZlAGlncmF2ZQBlZ3JhdmUAYWdyYXZlAFVncmF2ZQBPZ3JhdmUASWdyYXZlAEVncmF2ZQBBZ3JhdmUAdHJ1ZQAvc3ZnL2Jpc3F1ZQBvYmxpcXVlAEF2YW50R2FyZGUtQm9va09ibGlxdWUAQXZhbnRHYXJkZS1EZW1pT2JsaXF1ZQBIZWx2ZXRpY2EtTmFycm93LUJvbGRPYmxpcXVlAENvdXJpZXItQm9sZE9ibGlxdWUASGVsdmV0aWNhLUJvbGRPYmxpcXVlAEhlbHZldGljYS1OYXJyb3ctT2JsaXF1ZQBDb3VyaWVyLU9ibGlxdWUASGVsdmV0aWNhLU9ibGlxdWUAbmF2eWJsdWUAL3N2Zy9saWdodHNreWJsdWUAL3N2Zy9kZWVwc2t5Ymx1ZQAvc3ZnL3NreWJsdWUAbmV3bWlkbmlnaHRibHVlAC9zdmcvbWlkbmlnaHRibHVlAC9zdmcvbGlnaHRibHVlAC9zdmcvY2FkZXRibHVlAC9zdmcvY29ybmZsb3dlcmJsdWUAL3N2Zy9kb2RnZXJibHVlAC9zdmcvcG93ZGVyYmx1ZQBuZW9uYmx1ZQAvc3ZnL21lZGl1bWJsdWUAL3N2Zy9saWdodHN0ZWVsYmx1ZQAvc3ZnL3N0ZWVsYmx1ZQAvc3ZnL3JveWFsYmx1ZQAvc3ZnL2RhcmtibHVlAHJpY2hibHVlAGxpZ2h0c2xhdGVibHVlAC9zdmcvbWVkaXVtc2xhdGVibHVlAC9zdmcvZGFya3NsYXRlYmx1ZQAvc3ZnL3NsYXRlYmx1ZQAvc3ZnL2FsaWNlYmx1ZQAvc3ZnL2JsdWUAY2FsbFN0b3JlRW50aXR5VmFsdWUAc3RvcmVBdHRyaWJ1dGVWYWx1ZQBCbHVlAG5lYXRvX2VucXVldWUAVHVlAGNvbnZlcnRTUHRvUm91dGUAeWFjdXRlAHVhY3V0ZQBvYWN1dGUAaWFjdXRlAGVhY3V0ZQBhYWN1dGUAWWFjdXRlAFVhY3V0ZQBPYWN1dGUASWFjdXRlAEVhY3V0ZQBBYWN1dGUAcmVmZXJlbmNlIHRvIGV4dGVybmFsIGVudGl0eSBpbiBhdHRyaWJ1dGUAZHVwbGljYXRlIGF0dHJpYnV0ZQBub3RlAHByaW1lcnNpdGUAcmlib3NpdGUAcmVzdHJpY3Rpb25zaXRlAHByb3RlYXNlc2l0ZQAvc3ZnL2dob3N0d2hpdGUAL3N2Zy9uYXZham93aGl0ZQAvc3ZnL2Zsb3JhbHdoaXRlAC9zdmcvYW50aXF1ZXdoaXRlAC9zdmcvd2hpdGUAV2hpdGUAcG9wX29ial9zdGF0ZQBwY3Bfcm90YXRlAGNvbmNlbnRyYXRlAGRlY29yYXRlAFF1YWRUcmVlX3JlcHVsc2l2ZV9mb3JjZV9hY2N1bXVsYXRlAG5vdHJhbnNsYXRlAC9zdmcvY2hvY29sYXRlAGdlb21VcGRhdGUAaW52aG91c2UAL3N2Zy9jaGFydHJldXNlAG5vZGVsaXN0X3JldmVyc2UAWE1MX1BhcnNlADxlbGxpcHNlAGR1c3R5cm9zZQAvc3ZnL21pc3R5cm9zZQBTcGFyc2VNYXRyaXhfdHJhbnNwb3NlAGFnY2xvc2UAZW50aXR5VHJhY2tpbmdPbkNsb3NlAFNwYXJzZU1hdHJpeF9tdWx0aXBseV9kZW5zZQBmYWxzZQAvc3ZnL21lZGl1bXR1cnF1b2lzZQAvc3ZnL2Rhcmt0dXJxdW9pc2UAL3N2Zy9wYWxldHVycXVvaXNlAC9zdmcvdHVycXVvaXNlAHBoYXNlAC9zdmcvYXp1cmUAc2lnbmF0dXJlAGNvcmUATXNxdWFyZQBQYWxhdGlubyBMaW5vdHlwZQBBLT50eXBlID09IEItPnR5cGUAc3VwZQBlbGxpcHNlX3RhbmdlbnRfc2xvcGUAZ3ZyZW5kZXJfdXNlcnNoYXBlAG1pdGVyX3NoYXBlAGxhbmRzY2FwZQBMYW5kc2NhcGUASnVuZQBub25lAGRvY3VtZW50IGlzIG5vdCBzdGFuZGFsb25lAGNvdXNpbmUAL3N2Zy9tZWRpdW1hcXVhbWFyaW5lAC9zdmcvYXF1YW1hcmluZQA8cG9seWxpbmUAJXNvdmVybGluZQB1bmRlcmxpbmUAUHJvdXRlc3BsaW5lAGxpbmVhcl9zcGxpbmUAYl9zcGxpbmUAb2xpbmUAYWd4YnVmX2lzX2lubGluZQBzdmdfaW5saW5lAHJlZmluZQBwcmltZQBQcmltZQAvc3ZnL2xpbWUAY29sb3JzY2hlbWUAbGFiZWxfc2NoZW1lAHNhbWUAbGFiZWxmb250bmFtZQBVRl9zZXRuYW1lAGZvbnRfbmFtZQBmb250LT5uYW1lAHVzLT5uYW1lAHJlc2VydmVkIHByZWZpeCAoeG1sKSBtdXN0IG5vdCBiZSB1bmRlY2xhcmVkIG9yIGJvdW5kIHRvIGFub3RoZXIgbmFtZXNwYWNlIG5hbWUAc3R5bGUAL3N2Zy90aGlzdGxlAHRpdGxlAC9zdmcvbWVkaXVtcHVycGxlAGRhcmtwdXJwbGUAd2VicHVycGxlAHJlYmVjY2FwdXJwbGUAdmVyeV9saWdodF9wdXJwbGUAbWVkX3B1cnBsZQB4MTFwdXJwbGUAL3N2Zy9wdXJwbGUAc2hhcGVmaWxlAGdyYWRpZW50YW5nbGUAcmVjdGFuZ2xlAFJlY3RhbmdsZQBsYWJlbGFuZ2xlAGludnRyaWFuZ2xlAGRlc3RpbmF0aW9uIHBvaW50IG5vdCBpbiBhbnkgdHJpYW5nbGUAc291cmNlIHBvaW50IG5vdCBpbiBhbnkgdHJpYW5nbGUAZGZzQ3ljbGUAZG91YmxlY2lyY2xlAE1jaXJjbGUAaW52aXNpYmxlAHRob3JuZGFsZQBpbnB1dHNjYWxlAG9zY2FsZQBpbWFnZXNjYWxlAC9zdmcvd2hpdGVzbW9rZQBtYW5kYXJpbm9yYW5nZQAvc3ZnL2RhcmtvcmFuZ2UAL3N2Zy9vcmFuZ2UAL3N2Zy9iZWlnZQBuZXdlZGdlAGRlbGV0ZV9mYXN0X2VkZ2UAZGVsZXRlX2ZsYXRfZWRnZQBhZGRfdHJlZV9lZGdlAG1ha2VTdHJhaWdodEVkZ2UAbWFrZVNlbGZFZGdlAG1ha2VDb21wb3VuZEVkZ2UAIXVzZV9zdGFnZQBvc2FnZQBwYWdlAGd2bG9hZGltYWdlAHZlZQB0ZWUAUVVBRF9UUkVFX0hZQlJJRCwgc2l6ZSBsYXJnZXIgdGhhbiAlZCwgc3dpdGNoIHRvIGZhc3QgcXVhZHRyZWUAZmVhc2libGVfdHJlZQBTcGFyc2VNYXRyaXhfZGl2aWRlX3Jvd19ieV9kZWdyZWUAbm9kZWxpc3RfZnJlZQBzZm9udF9mcmVlAG5vZGVfc2V0X2ZyZWUAcm93c19mcmVlAGNlbGxzX2ZyZWUAbmV3bm9kZQBpbnN0YWxsbm9kZQBhZ25vZGUAZGVsZXRlX2Zhc3Rfbm9kZQBwYWNrbW9kZQBTcGxpdE5vZGUAb3RpbGRlAG50aWxkZQBhdGlsZGUAT3RpbGRlAE50aWxkZQBBdGlsZGUAZGl2aWRlAHRyYWRlAGdyYXBodml6X25vZGVfaW5kdWNlAHNvdXJjZQByZXB1bHNpdmVmb3JjZQBpbGxlZ2FsIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlAGVycm9yIGluIHByb2Nlc3NpbmcgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZQByZWN1cnNpdmUgZW50aXR5IHJlZmVyZW5jZQBsYWJlbGRpc3RhbmNlAFRCX2JhbGFuY2UAVEJiYWxhbmNlAGRldmljZQBtb25vc3BhY2UAL3N2Zy9vbGRsYWNlAGZhY2UAc3ViZQAgLWFuY2hvciBlAHMxLT5jb21tX2Nvb3JkPT1zMi0+Y29tbV9jb29yZABNcmVjb3JkAGZvcndhcmQAcHJvZABsaWdodGdvbGRlbnJvZABtZWRpdW1nb2xkZW5yb2QAL3N2Zy9kYXJrZ29sZGVucm9kAC9zdmcvcGFsZWdvbGRlbnJvZAAvc3ZnL2dvbGRlbnJvZAAvc3ZnL2J1cmx5d29vZABsaWdodHdvb2QAbWVkaXVtd29vZABkYXJrd29vZABfYmFja2dyb3VuZABjb21wb3VuZABubyBlbGVtZW50IGZvdW5kAGZhdGFsIGZsZXggc2Nhbm5lciBpbnRlcm5hbCBlcnJvci0tbm8gYWN0aW9uIGZvdW5kAC9zdmcvYmxhbmNoZWRhbG1vbmQAYXJyb3dfbGVuZ3RoX2RpYW1vbmQATWRpYW1vbmQAbm9kZV9zZXRfZmluZABzdHJkaWN0X2ZpbmQAZ3Z1c2Vyc2hhcGVfZmluZABub2RlbGlzdF90cnlfYXBwZW5kAGVkZ2VfbGlzdF90cnlfYXBwZW5kAHNmb250X3RyeV9hcHBlbmQAdHJhcHNfdHJ5X2FwcGVuZABjZWxsc190cnlfYXBwZW5kAG5vZGVzX3RyeV9hcHBlbmQAbm9kZV9xdWV1ZV90cnlfYXBwZW5kAHNob3dfYm94ZXNfcHJlcGVuZABFTGxlZnRibmQAZXhwYW5kAGN1bWJlcmxhbmQAYnJpZ2h0Z29sZABvbGRnb2xkAC9zdmcvZ29sZABib2xkAEhlbHZldGljYS1OYXJyb3ctQm9sZABUaW1lcy1Cb2xkAENvdXJpZXItQm9sZABQYWxhdGluby1Cb2xkAE5ld0NlbnR1cnlTY2hsYmstQm9sZABIZWx2ZXRpY2EtQm9sZAAlMCpsbGQAJSpsbGQAKyVsbGQAbi0+YnJhbmNoW2ldLmNoaWxkACUrLjRsZAAlcyVsZABzb2xpZAAvc3ZnL21lZGl1bW9yY2hpZAAvc3ZnL2RhcmtvcmNoaWQAL3N2Zy9vcmNoaWQAaWxsZWdhbCBjaGFyYWN0ZXIocykgaW4gcHVibGljIGlkAGRpamtzdHJhX3NnZABmaXhlZABjdXJ2ZWQAZGVyaXZlZABkb3R0ZWQAbWVtb3J5IGV4aGF1c3RlZABsb2NhbGUgbm90IHN1cHBvcnRlZABwYXJzaW5nIGFib3J0ZWQAcGFyc2VyIG5vdCBzdGFydGVkAGF0dHJpYnV0ZSBtYWNyb3Mgbm90IGltcGxlbWVudGVkAGFjY291bnRpbmdEaWZmVG9sZXJhdGVkAGZhdGFsIGZsZXggc2Nhbm5lciBpbnRlcm5hbCBlcnJvci0tZW5kIG9mIGJ1ZmZlciBtaXNzZWQAY29uZGVuc2VkAC9zdmcvbWVkaXVtdmlvbGV0cmVkAC9zdmcvcGFsZXZpb2xldHJlZABJbXByb3BlciAlcyB2YWx1ZSAlcyAtIGlnbm9yZWQAJXMgdmFsdWUgJXMgPCAlZCAtIHRvbyBzbWFsbCAtIGlnbm9yZWQAJXMgdmFsdWUgJXMgPiAlZCAtIHRvbyBsYXJnZSAtIGlnbm9yZWQAL3N2Zy9pbmRpYW5yZWQAL3N2Zy9kYXJrcmVkAGEgc3VjY2Vzc2Z1bCBwcmlvciBjYWxsIHRvIGZ1bmN0aW9uIFhNTF9HZXRCdWZmZXIgaXMgcmVxdWlyZWQAdGFwZXJlZAAvc3ZnL29yYW5nZXJlZAByZXNlcnZlZCBwcmVmaXggKHhtbG5zKSBtdXN0IG5vdCBiZSBkZWNsYXJlZCBvciB1bmRlY2xhcmVkAC9zdmcvcmVkAHN0cmlwZWQAaWxsLWNvbmRpdGlvbmVkAHVuZGVmaW5lZABub3QgY29uc3RyYWluZWQAbGFiZWxhbGlnbmVkAHRleHQgZGVjbGFyYXRpb24gbm90IHdlbGwtZm9ybWVkAFhNTCBkZWNsYXJhdGlvbiBub3Qgd2VsbC1mb3JtZWQAdW5maWxsZWQAaW5wdXQgaW4gZmxleCBzY2FubmVyIGZhaWxlZAB0cmlhbmd1bGF0aW9uIGZhaWxlZABwYXJzaW5nIGZpbmlzaGVkAGRhc2hlZABsaW1pdCBvbiBpbnB1dCBhbXBsaWZpY2F0aW9uIGZhY3RvciAoZnJvbSBEVEQgYW5kIGVudGl0aWVzKSBicmVhY2hlZAB3ZWRnZWQAc2l6ZSA9PSBmcmVlZAByb3VuZGVkAHNwbGluZSBbJS4wM2YsICUuMDNmXSAtLSBbJS4wM2YsICUuMDNmXSBpcyBob3Jpem9udGFsOyB3aWxsIGJlIHRyaXZpYWxseSBib3VuZGVkAHNwbGluZSBbJS4wM2YsICUuMDNmXSAtLSBbJS4wM2YsICUuMDNmXSBpcyB2ZXJ0aWNhbDsgd2lsbCBiZSB0cml2aWFsbHkgYm91bmRlZABwYXJzZXIgbm90IHN1c3BlbmRlZABwYXJzZXIgc3VzcGVuZGVkAFdlZABSZWQAU3BhcnNlTWF0cml4X2FkZABub2RlX3NldF9hZGQAc3RyZGljdF9hZGQAZGQgIT0gcGFyZW50X2RkAEtQX0FkZABwYWQAeGxoZHhsb2FkAHhsaGR4dW5sb2FkAHJlYWQAYXJyb3doZWFkAGxoZWFkAHNhbWVoZWFkAGJveDNkACVzXyVkAF9zcGFuXyVkAF9ibG9ja18lZABfd2Vha18lZABfY2xvbmVfJWQALiVkACVZLSVtLSVkACVsZiwlZAAlcyBpbiBsaW5lICVkACUlJSVCb3VuZGluZ0JveDogJWQgJWQgJWQgJWQAIl9zdWJncmFwaF9jbnQiOiAlZAAiX2d2aWQiOiAlZAAiaGVhZCI6ICVkAGFneGJwdXRjAHZwc2MAY3AtPnNyYwB1Y2lyYwBvY2lyYwBpY2lyYwBlY2lyYwBhY2lyYwBVY2lyYwBPY2lyYwBJY2lyYwBFY2lyYwBBY2lyYwBsYWJlbGxvYwBndl9yZWNhbGxvYwBzdGQ6OmJhZF9hbGxvYwBiYWtlcnNjaG9jAHNlbWlTd2VldENob2MAb2JqbGlzdF9zeW5jAGRlZ2xpc3Rfc3luYwBub2RlbGlzdF9zeW5jAGNsaXN0X3N5bmMAbm9kZV9saXN0X3N5bmMAZWRnZV9zZXRfc3luYwBwb2ludHNfc3luYwBzdHJzX3N5bmMAQWdyYXBoc19zeW5jAGJveGVzX3N5bmMAbGF5ZXJfbmFtZXNfc3luYwBzbm9kZXNfc3luYwB2YXJhcnJfc3luYwBiZXppZXJfcGF0aF9zeW5jAHBic19zaXplX3N5bmMAbWMAU3BhcnNlTWF0cml4X2lzX3N5bW1ldHJpYwBBLT5pc19wYXR0ZXJuX3N5bW1ldHJpYwBwaWM6cGljAGl0YWxpYwBCb29rbWFuLUxpZ2h0SXRhbGljAFphcGZDaGFuY2VyeS1NZWRpdW1JdGFsaWMAQm9va21hbi1EZW1pSXRhbGljAFRpbWVzLUJvbGRJdGFsaWMAUGFsYXRpbm8tQm9sZEl0YWxpYwBOZXdDZW50dXJ5U2NobGJrLUJvbGRJdGFsaWMAVGltZXMtSXRhbGljAFBhbGF0aW5vLUl0YWxpYwBOZXdDZW50dXJ5U2NobGJrLUl0YWxpYwByYWRpYwAjZmNmY2ZjAHJvdXRlc3BsaW5lczogJWQgZWRnZXMsICV6dSBib3hlcyAlLjJmIHNlYwA6ICUuMmYgc2VjAGxpc3RkZWxyZWMAbGV2ZWwgZ3JhcGggcmVjAGxldmVsIGVkZ2UgcmVjAGxldmVsIG5vZGUgcmVjAERlYwBfbmVhdG9fY2MAYmMAdmlzaWJpbGl0eS5jAFNwYXJzZU1hdHJpeC5jAGh0bWxsZXguYwBpbmRleC5jAHNtYXJ0X2luaV94LmMAZ3ZyZW5kZXJfY29yZV9wb3YuYwBjdnQuYwBsYXlvdXQuYwB0ZXh0c3Bhbl9sdXQuYwBhZGp1c3QuYwBub2RlbGlzdC5jAHNob3J0ZXN0LmMAY2xvc2VzdC5jAHNhbWVwb3J0LmMAZ3ZyZW5kZXJfY29yZV9kb3QuYwBjb25zdHJhaW50LmMAZG90aW5pdC5jAG5lYXRvaW5pdC5jAHBhdGNod29ya2luaXQuYwBvc2FnZWluaXQuYwBlbWl0LmMAZmxhdC5jAGFycm93cy5jAG1pbmNyb3NzLmMAc3RyZXNzLmMAcG9zdF9wcm9jZXNzLmMAY2NvbXBzLmMAbnMuYwB1dGlscy5jAHhsYWJlbHMuYwBzaGFwZXMuYwBkb3RzcGxpbmVzLmMAbmVhdG9zcGxpbmVzLmMAY2x1c3RlcmVkZ2VzLmMAaGVkZ2VzLmMAYXR0ci5jAHJlZnN0ci5jAGZhc3Rnci5jAGNsdXN0ZXIuYwB0YXBlci5jAGd2cmVuZGVyLmMAc3BsaXQucS5jAGRlY29tcC5jAGd2cmVuZGVyX2NvcmVfbWFwLmMAb3J0aG8uYwBndnJlbmRlcl9jb3JlX2pzb24uYwBwYXJ0aXRpb24uYwBwb3NpdGlvbi5jAGd2cGx1Z2luLmMAZ3ZfZm9wZW4uYwB0ZXh0c3Bhbi5jAGdlb20uYwByYW5kb20uYwByb3V0ZXNwbC5jAHhtbC5jAE11bHRpbGV2ZWwuYwBzcHJpbmdfZWxlY3RyaWNhbC5jAGd2cmVuZGVyX2NvcmVfdGsuYwByYW5rLmMAcGFjay5jAGJsb2NrcGF0aC5jAGR0c3RyaGFzaC5jAHJhd2dyYXBoLmMAZ3ZyZW5kZXJfY29yZV9zdmcuYwBndnJlbmRlcl9jb3JlX2ZpZy5jAHN0dWZmLmMAbWF6ZS5jAHF1YWRfcHJvZ19zb2x2ZS5jAHNwYXJzZV9zb2x2ZS5jAHJvdXRlLmMAd3JpdGUuYwBjb2x4bGF0ZS5jAHhtbHBhcnNlLmMAZWxsaXBzZS5jAGd2bG9hZGltYWdlX2NvcmUuYwBndnVzZXJzaGFwZS5jAGNpcmNsZS5jAGh0bWx0YWJsZS5jAGVkZ2UuYwBndmxvYWRpbWFnZS5jAGJsb2NrdHJlZS5jAFF1YWRUcmVlLmMAbm9kZS5jAG5vZGVfaW5kdWNlLmMAZ3ZkZXZpY2UuYwBjb21wb3VuZC5jAHRyYXBlem9pZC5jAHNnZC5jAGNvbmMuYwByZWMuYwBkaWprc3RyYS5jAGZQUS5jAGNsYXNzMi5jACVsZiwlbGYsJWxmLCVsZiVjACVsZiwlbGYsJWxmLCVbXixdJWMAXCVjACRjAHdiAG5zdWIAc2V0aHNiAHJiAHByb3RlY3RfcnNxYgBqb2IAY29yZV9sb2FkaW1hZ2VfcHNsaWIARmViAG9kYgBpbml0X3NwbGluZXNfYmIAYmV6aWVyX2JiAHByb3RlaW5zdGFiAHJuYXN0YWIAL3N2Zy9vbGl2ZWRyYWIAXGIAcndhAC9zdmcvYXF1YQBpb3RhAElvdGEAL3N2Zy9kYXJrbWFnZW50YQAvc3ZnL21hZ2VudGEAZGVsdGEARGVsdGEAemV0YQB0aGV0YQBUaGV0YQBiZXRhAFpldGEAQmV0YQBwcmV2ICE9IG9iai0+ZGF0YQBtYWtlR3JhcGhEYXRhAEV0YQBuaW1idXNzYW5zYQBwYXJhAGthcHBhAEthcHBhAC9zdmcvc2llbm5hAFZlcmRhbmEAZ2FtbWEAR2FtbWEAc2lnbWEAU2lnbWEAY29uc29sYQBuYWJsYQAvc3ZnL2Z1Y2hzaWEAR2VvcmdpYQBhbHBoYQBBbHBoYQBvbWVnYQBPbWVnYQBhcmVhAGxhbWJkYQBMYW1iZGEAaGVsdmV0aWNhAEhlbHZldGljYQBtaWNhAD48YQBgAF90ZHJhd18AX3RsZHJhd18AX2hsZHJhd18AX2xkcmF3XwBfaGRyYXdfAF9kcmF3XwBhZ3hzZXRfAGRvdF9zcGxpbmVzXwAlc18AcGFnZSVkLCVkXwBfY2NfACBpZD0iYV8AXgBTdGFydGluZyBwaGFzZSAyIFtkb3RfbWluY3Jvc3NdAFN0YXJ0aW5nIHBoYXNlIDMgW2RvdF9wb3NpdGlvbl0Abl9lZGdlcyA9PSBncmFwaC0+c291cmNlc1tncmFwaC0+bl0AU3RhcnRpbmcgcGhhc2UgMSBbZG90X3JhbmtdAGpkW21hc2tbamNba11dXSA9PSBqY1trXQBqY1ttYXNrW2piW2tdXV0gPT0gamJba10AbmVlZGxlW2ldICE9IG5lZWRsZVtqXQBqYVttYXNrW2phW2pdXV0gPT0gamFbal0AcS0+cXRzW2lpXQAhcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLnRha2VuW2ldAHIuYm91bmRhcnlbaV0gPD0gci5ib3VuZGFyeVtOVU1ESU1TICsgaV0AWyUuMDNmLCUuMDNmXQBbaW50ZXJuYWwgaGFyZC1jb2RlZF0AbnAtPmNlbGxzWzFdAG5wLT5jZWxsc1swXQB1cy0+bmFtZVswXQBjcC0+c3JjWzBdAFsuLl0AXFwAInBvaW50cyI6IFsAInN0b3BzIjogWwAJWwBaAGNvbXB1dGVTY2FsZVhZAHk8PVkAJWEgJWIgJWQgJUg6JU06JVMgJVkAUE9TSVgAeSA+PSBJTlRfTUlOICYmIHkgPD0gSU5UX01BWAB4ID49IElOVF9NSU4gJiYgeCA8PSBJTlRfTUFYAHcgPj0gMCAmJiB3IDw9IElOVF9NQVgAZV9jbnQgPD0gSU5UX01BWABwYWlyLnJpZ2h0IDw9IElOVF9NQVgAcGFpci5sZWZ0IDw9IElOVF9NQVgAdGFyZ2V0IDw9IElOVF9NQVgAbnNlZ3MgPD0gSU5UX01BWABuX2VkZ2VzIDw9IElOVF9NQVgAc3RwLm52ZXJ0aWNlcyA8PSBJTlRfTUFYAG9ic1twb2x5X2ldLT5wbiA8PSBJTlRfTUFYAGlucHV0X3JvdXRlLnBuIDw9IElOVF9NQVgAZ3JhcGgtPm4gPD0gSU5UX01BWABoID49IDAgJiYgaCA8PSBJTlRfTUFYAGVfY250IC0gMSA8PSBJTlRfTUFYAGNsaXN0X3NpemUoJmxpc3QpIC0gMSA8PSBJTlRfTUFYAGxheWVyX25hbWVzX3NpemUoJmxheWVySURzKSAtIDEgPD0gSU5UX01BWABzdHJsZW4oYXJncykgPD0gSU5UX01BWABvYmpsaXN0X3NpemUoJm9iamwpIDw9IElOVF9NQVgAZWRnZV9saXN0X3NpemUoJmN0eC0+VHJlZV9lZGdlKSA8PSBJTlRfTUFYAG5vZGVfc2V0X3NpemUoZy0+bl9pZCkgPD0gSU5UX01BWABpIDwgSU5UX01BWAByZXN1bHQgPD0gKGludClVQ0hBUl9NQVgAc3N6IDw9IFVDSEFSX01BWABjb2wgPj0gMCAmJiBjb2wgPD0gVUlOVDE2X01BWAB4PD1YAFcAVgBVAFxUAFRFWFQAU1RSRVNTX01BSk9SSVpBVElPTl9QT1dFUl9ESVNUAFNUUkVTU19NQUpPUklaQVRJT05fR1JBUEhfRElTVABTVFJFU1NfTUFKT1JJWkFUSU9OX0FWR19ESVNUAEZBU1QARk9OVABiID09IEJfUklHSFQASEVJR0hUAEJfTEVGVABfJWxsdV9TVVNQRUNUAEJUAFRyZWJ1Y2hldCBNUwBJTlZJUwAlSDolTTolUwBWUgBUUgBBLT5mb3JtYXQgPT0gQi0+Zm9ybWF0ICYmIEEtPmZvcm1hdCA9PSBGT1JNQVRfQ1NSAExSAERJUgBIUgBDRU5URVIAJSVUUkFJTEVSAEEtPnR5cGUgPT0gTUFUUklYX1RZUEVfUkVBTCB8fCBBLT50eXBlID09IE1BVFJJWF9UWVBFX0lOVEVHRVIAQ0VMTEJPUkRFUgBCUgAqUgBRAEVYUABCX1VQAFNVUABUT1AATwBtYXBOAFxOAEJfRE9XTgBUSE9STgAlJUJFR0lOAFJPV1NQQU4AQ09MU1BBTgBOQU4AUE0AQk9UVE9NAEJNAEFNACVIOiVNAFxMAHRhaWxVUkwAbGFiZWxVUkwAZWRnZVVSTABoZWFkVVJMAEhUTUwAeCE9TlVMTABFRF90b192aXJ0KG9yaWcpID09IE5VTEwARURfdG9fdmlydChlKSA9PSBOVUxMAHByZWZpeCAhPSBOVUxMAGR0ZC0+c2NhZmZJbmRleCAhPSBOVUxMAHNtLT5MdyAhPSBOVUxMAGlucHV0ICE9IE5VTEwAbGlzdCAhPSBOVUxMAHJlZmVyZW50ICE9IE5VTEwAZGljdCAhPSBOVUxMAGRpY3QtPmJ1Y2tldHMgIT0gTlVMTABhdHRyICE9IE5VTEwAbGVhZGVyICE9IE5VTEwAaXRlbSAhPSBOVUxMAGhheXN0YWNrICE9IE5VTEwAb3J0aG9nICE9IE5VTEwAc2VsZiAhPSBOVUxMAHZhbHVlICE9IE5VTEwAZmlsZW5hbWUgIT0gTlVMTABqb2ItPm91dHB1dF9maWxlICE9IE5VTEwAbW9kZSAhPSBOVUxMAHNvdXJjZSAhPSBOVUxMAHhkICE9IE5VTEwAc20tPkx3ZCAhPSBOVUxMAGpvYiAhPSBOVUxMAHNvdXJjZS5kYXRhICE9IE5VTEwAYi5kYXRhICE9IE5VTEwAYS5kYXRhICE9IE5VTEwAbGlzdCAmJiBsaXN0WzBdICE9IE5VTEwAQUYgIT0gTlVMTABzbS0+RCAhPSBOVUxMAEVEX3RvX3ZpcnQob3JpZykgIT0gTlVMTABMQ19BTEwAQkwAYmVzdGNvc3QgPCBIVUdFX1ZBTABOT1JNQUwAUkFESUFMAEEtPnR5cGUgPT0gTUFUUklYX1RZUEVfUkVBTABVUlcgQ2hhbmNlcnkgTABVUlcgQm9va21hbiBMAENlbnR1cnkgU2Nob29sYm9vayBMAFVSVyBHb3RoaWMgTABLSwBKAGkgPCBNQVhfSQBQLT5lbmQudGhldGEgPCAyICogTV9QSQBBU0NJSQBcSABFVEgAV0lEVEgARE9URk9OVFBBVEgAR0RGT05UUEFUSABta05Db25zdHJhaW50RwBcRwBFWFBBVF9FTlRJVFlfREVCVUcARVhQQVRfRU5UUk9QWV9ERUJVRwBFWFBBVF9BQ0NPVU5USU5HX0RFQlVHAFJORwBTUFJJTkcAQ0VMTFBBRERJTkcAQ0VMTFNQQUNJTkcATEFORwBJTUcAXHhGACUlRU9GAElORgBceEZGAFJJRkYAZGVsdGEgPD0gMHhGRkZGAFx4RUYAXHhERgBceENGAFx4QkYAXHhBRgBceDlGAFx4OEYAXHg3RgBceDFGAFx4RQBcRQBQT0lOVC1TSVpFAFRSVUUAQ0xPU0UARkFMU0UAa2V5ICE9IFRPTUJTVE9ORQByICE9IFRPTUJTVE9ORQBraW5kID09IExUX05PTkUAR1JBRElFTlRBTkdMRQBUUklBTkdMRQBNSURETEUASU5WSVNJQkxFAFRBQkxFAEFHVFlQRShvYmopID09IEFHSU5FREdFIHx8IEFHVFlQRShvYmopID09IEFHT1VURURHRQBceEZFAFx4RUUAXHhERQBCX05PREUAXHhDRQBceEJFAFx4QUUAXHg5RQBceDhFAFx4MUUAVEQAQS0+Zm9ybWF0ID09IEZPUk1BVF9DT09SRABuICYmIGkgPj0gMCAmJiBpIDwgTk9ERUNBUkQAJSVFTkQASFlCUklEAFNPTElEAFx4RkQAXHhFRABET1RURUQAREFTSEVEAFJPVU5ERUQAXHhERABceENEAFx4QkQAXHhBRABceDlEAFx4OEQAXHgxRABceEMAZGVsZXRlVlBTQwBceEZDAFx4RUMAXHhEQwBceENDAFx4QkMAXHhBQwBceDlDAFx4OEMAXHgxQwBceEIAU1VCAFx4RkIAXHhFQgBceERCAFx4Q0IAXHhCQgBceEFCAFx4OUIAXHg4QgBceDFCAEEgJiYgQgBceEZBAFx4RUEAXHhEQQBceENBAFx4QkEAXHhBQQBceDlBAFx4OEEAXHgxQQBAAD8APCVzPgA8bmlsPgA8L3RzcGFuPjwvdGV4dFBhdGg+AAogICAgPCU5LjNmLCAlOS4zZiwgJTkuM2Y+AD4KPHRpdGxlPgA8Rk9OVD4APEJSPgA8SFRNTD4APC9IVE1MPgA8SU1HPgBTeW50YXggZXJyb3I6IG5vbi1zcGFjZSBzdHJpbmcgdXNlZCBiZWZvcmUgPFRBQkxFPgBTeW50YXggZXJyb3I6IG5vbi1zcGFjZSBzdHJpbmcgdXNlZCBhZnRlciA8L1RBQkxFPgA8VEQ+AC0+ACI+AAlba2V5PQA8PQA8ACYjeCV4OwAmcXVvdDsAJmx0OwAmZ3Q7ACZhbXA7ACMlZDsAJiMzOTsAJiM0NTsAJiM5MzsAJiMxMzsAJiMxNjA7ACYjMTA7ADtzdG9wLW9wYWNpdHk6ACUlQm91bmRpbmdCb3g6AGNhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzIGFuZCBzZXR0aW5nIHVwIHN0cmVzcyB0ZXJtczoAPHN0b3Agb2Zmc2V0PSIlLjAzZiIgc3R5bGU9InN0b3AtY29sb3I6ADxzdG9wIG9mZnNldD0iMSIgc3R5bGU9InN0b3AtY29sb3I6ADxzdG9wIG9mZnNldD0iMCIgc3R5bGU9InN0b3AtY29sb3I6AHNvbHZpbmcgbW9kZWw6AC9cOgBncmV5OQBncmF5OQBceEY5AFx4RTkAXHhEOQBceEM5AFx4QjkAXHhBOQBncmV5OTkAZ3JheTk5AFx4OTkAZ3JleTg5AGdyYXk4OQBceDg5ADAxMjM0NTY3ODkAZ3JleTc5AGdyYXk3OQBncmV5NjkAZ3JheTY5AGdyZXk1OQBncmF5NTkAZ3JleTQ5AGdyYXk0OQBncmV5MzkAZ3JheTM5AGdyZXkyOQBncmF5MjkAZ3JleTE5AGdyYXkxOQBceDE5AC9yZGd5OS85AC9idXB1OS85AC9yZHB1OS85AC9wdWJ1OS85AC95bGduYnU5LzkAL2duYnU5LzkAL3JkeWxidTkvOQAvcmRidTkvOQAvZ3JleXM5LzkAL2dyZWVuczkvOQAvYmx1ZXM5LzkAL3B1cnBsZXM5LzkAL29yYW5nZXM5LzkAL3JlZHM5LzkAL3B1b3I5LzkAL3lsb3JicjkvOQAvcHVidWduOS85AC9idWduOS85AC9wcmduOS85AC9yZHlsZ245LzkAL3lsZ245LzkAL3NwZWN0cmFsOS85AC9waXlnOS85AC9icmJnOS85AC9wdXJkOS85AC95bG9ycmQ5LzkAL29ycmQ5LzkAL3BhaXJlZDkvOQAvc2V0MzkvOQAvc2V0MTkvOQAvcGFzdGVsMTkvOQAvcGFpcmVkMTIvOQAvc2V0MzEyLzkAL3JkZ3kxMS85AC9yZHlsYnUxMS85AC9yZGJ1MTEvOQAvcHVvcjExLzkAL3ByZ24xMS85AC9yZHlsZ24xMS85AC9zcGVjdHJhbDExLzkAL3BpeWcxMS85AC9icmJnMTEvOQAvcGFpcmVkMTEvOQAvc2V0MzExLzkAL3JkZ3kxMC85AC9yZHlsYnUxMC85AC9yZGJ1MTAvOQAvcHVvcjEwLzkAL3ByZ24xMC85AC9yZHlsZ24xMC85AC9zcGVjdHJhbDEwLzkAL3BpeWcxMC85AC9icmJnMTAvOQAvcGFpcmVkMTAvOQAvc2V0MzEwLzkAZ3JleTgAZ3JheTgAXHg4AHV0ZjgAI2Y4ZjhmOAAjZThlOGU4AFx4RjgAR0lGOABceEU4AFx4RDgAXHhDOABceEI4AFx4QTgAZ3JleTk4AGdyYXk5OABceDk4AGdyZXk4OABncmF5ODgAXHg4OABncmV5NzgAZ3JheTc4AGdyZXk2OABncmF5NjgAZ3JleTU4AGdyYXk1OABncmV5NDgAZ3JheTQ4AGdyZXkzOABncmF5MzgAZ3JleTI4AGdyYXkyOABncmV5MTgAZ3JheTE4AFx4MTgAL3JkZ3k5LzgAL2J1cHU5LzgAL3JkcHU5LzgAL3B1YnU5LzgAL3lsZ25idTkvOAAvZ25idTkvOAAvcmR5bGJ1OS84AC9yZGJ1OS84AC9ncmV5czkvOAAvZ3JlZW5zOS84AC9ibHVlczkvOAAvcHVycGxlczkvOAAvb3JhbmdlczkvOAAvcmVkczkvOAAvcHVvcjkvOAAveWxvcmJyOS84AC9wdWJ1Z245LzgAL2J1Z245LzgAL3ByZ245LzgAL3JkeWxnbjkvOAAveWxnbjkvOAAvc3BlY3RyYWw5LzgAL3BpeWc5LzgAL2JyYmc5LzgAL3B1cmQ5LzgAL3lsb3JyZDkvOAAvb3JyZDkvOAAvcGFpcmVkOS84AC9zZXQzOS84AC9zZXQxOS84AC9wYXN0ZWwxOS84AC9yZGd5OC84AC9idXB1OC84AC9yZHB1OC84AC9wdWJ1OC84AC95bGduYnU4LzgAL2duYnU4LzgAL3JkeWxidTgvOAAvcmRidTgvOAAvYWNjZW50OC84AC9ncmV5czgvOAAvZ3JlZW5zOC84AC9ibHVlczgvOAAvcHVycGxlczgvOAAvb3JhbmdlczgvOAAvcmVkczgvOAAvcHVvcjgvOAAveWxvcmJyOC84AC9wdWJ1Z244LzgAL2J1Z244LzgAL3ByZ244LzgAL3JkeWxnbjgvOAAveWxnbjgvOAAvc3BlY3RyYWw4LzgAL3BpeWc4LzgAL2JyYmc4LzgAL3B1cmQ4LzgAL3lsb3JyZDgvOAAvb3JyZDgvOAAvcGFpcmVkOC84AC9zZXQzOC84AC9zZXQyOC84AC9wYXN0ZWwyOC84AC9kYXJrMjgvOAAvc2V0MTgvOAAvcGFzdGVsMTgvOAAvcGFpcmVkMTIvOAAvc2V0MzEyLzgAL3JkZ3kxMS84AC9yZHlsYnUxMS84AC9yZGJ1MTEvOAAvcHVvcjExLzgAL3ByZ24xMS84AC9yZHlsZ24xMS84AC9zcGVjdHJhbDExLzgAL3BpeWcxMS84AC9icmJnMTEvOAAvcGFpcmVkMTEvOAAvc2V0MzExLzgAL3JkZ3kxMC84AC9yZHlsYnUxMC84AC9yZGJ1MTAvOAAvcHVvcjEwLzgAL3ByZ24xMC84AC9yZHlsZ24xMC84AC9zcGVjdHJhbDEwLzgAL3BpeWcxMC84AC9icmJnMTAvOAAvcGFpcmVkMTAvOAAvc2V0MzEwLzgAdXRmLTgAQy5VVEYtOABncmV5NwBncmF5NwBceDcAXHhGNwBceEU3AFx4RDcAXHhDNwBceEI3AFx4QTcAZ3JleTk3AGdyYXk5NwBceDk3AGdyZXk4NwBncmF5ODcAXHg4NwBncmV5NzcAZ3JheTc3AGdyZXk2NwBncmF5NjcAZ3JleTU3AGdyYXk1NwBncmV5NDcAZ3JheTQ3AGdyZXkzNwBncmF5MzcAZ3JleTI3AGdyYXkyNwBncmV5MTcAZ3JheTE3AFx4MTcAL3JkZ3k5LzcAL2J1cHU5LzcAL3JkcHU5LzcAL3B1YnU5LzcAL3lsZ25idTkvNwAvZ25idTkvNwAvcmR5bGJ1OS83AC9yZGJ1OS83AC9ncmV5czkvNwAvZ3JlZW5zOS83AC9ibHVlczkvNwAvcHVycGxlczkvNwAvb3JhbmdlczkvNwAvcmVkczkvNwAvcHVvcjkvNwAveWxvcmJyOS83AC9wdWJ1Z245LzcAL2J1Z245LzcAL3ByZ245LzcAL3JkeWxnbjkvNwAveWxnbjkvNwAvc3BlY3RyYWw5LzcAL3BpeWc5LzcAL2JyYmc5LzcAL3B1cmQ5LzcAL3lsb3JyZDkvNwAvb3JyZDkvNwAvcGFpcmVkOS83AC9zZXQzOS83AC9zZXQxOS83AC9wYXN0ZWwxOS83AC9yZGd5OC83AC9idXB1OC83AC9yZHB1OC83AC9wdWJ1OC83AC95bGduYnU4LzcAL2duYnU4LzcAL3JkeWxidTgvNwAvcmRidTgvNwAvYWNjZW50OC83AC9ncmV5czgvNwAvZ3JlZW5zOC83AC9ibHVlczgvNwAvcHVycGxlczgvNwAvb3JhbmdlczgvNwAvcmVkczgvNwAvcHVvcjgvNwAveWxvcmJyOC83AC9wdWJ1Z244LzcAL2J1Z244LzcAL3ByZ244LzcAL3JkeWxnbjgvNwAveWxnbjgvNwAvc3BlY3RyYWw4LzcAL3BpeWc4LzcAL2JyYmc4LzcAL3B1cmQ4LzcAL3lsb3JyZDgvNwAvb3JyZDgvNwAvcGFpcmVkOC83AC9zZXQzOC83AC9zZXQyOC83AC9wYXN0ZWwyOC83AC9kYXJrMjgvNwAvc2V0MTgvNwAvcGFzdGVsMTgvNwAvcmRneTcvNwAvYnVwdTcvNwAvcmRwdTcvNwAvcHVidTcvNwAveWxnbmJ1Ny83AC9nbmJ1Ny83AC9yZHlsYnU3LzcAL3JkYnU3LzcAL2FjY2VudDcvNwAvZ3JleXM3LzcAL2dyZWVuczcvNwAvYmx1ZXM3LzcAL3B1cnBsZXM3LzcAL29yYW5nZXM3LzcAL3JlZHM3LzcAL3B1b3I3LzcAL3lsb3JicjcvNwAvcHVidWduNy83AC9idWduNy83AC9wcmduNy83AC9yZHlsZ243LzcAL3lsZ243LzcAL3NwZWN0cmFsNy83AC9waXlnNy83AC9icmJnNy83AC9wdXJkNy83AC95bG9ycmQ3LzcAL29ycmQ3LzcAL3BhaXJlZDcvNwAvc2V0MzcvNwAvc2V0MjcvNwAvcGFzdGVsMjcvNwAvZGFyazI3LzcAL3NldDE3LzcAL3Bhc3RlbDE3LzcAL3BhaXJlZDEyLzcAL3NldDMxMi83AC9yZGd5MTEvNwAvcmR5bGJ1MTEvNwAvcmRidTExLzcAL3B1b3IxMS83AC9wcmduMTEvNwAvcmR5bGduMTEvNwAvc3BlY3RyYWwxMS83AC9waXlnMTEvNwAvYnJiZzExLzcAL3BhaXJlZDExLzcAL3NldDMxMS83AC9yZGd5MTAvNwAvcmR5bGJ1MTAvNwAvcmRidTEwLzcAL3B1b3IxMC83AC9wcmduMTAvNwAvcmR5bGduMTAvNwAvc3BlY3RyYWwxMC83AC9waXlnMTAvNwAvYnJiZzEwLzcAL3BhaXJlZDEwLzcAL3NldDMxMC83ADEuNwBncmV5NgBncmF5NgBceDYAXHhGNgBceEU2AFx4RDYAXHhDNgBceEI2AFx4QTYAZ3JleTk2AGdyYXk5NgBceDk2AGdyZXk4NgBncmF5ODYAXHg4NgBncmV5NzYAZ3JheTc2AGdyZXk2NgBncmF5NjYAZ3JleTU2AGdyYXk1NgBncmV5NDYAZ3JheTQ2AGdyZXkzNgBncmF5MzYAZ3JleTI2AGdyYXkyNgBncmV5MTYAZ3JheTE2AFx4MTYAL3JkZ3k5LzYAL2J1cHU5LzYAL3JkcHU5LzYAL3B1YnU5LzYAL3lsZ25idTkvNgAvZ25idTkvNgAvcmR5bGJ1OS82AC9yZGJ1OS82AC9ncmV5czkvNgAvZ3JlZW5zOS82AC9ibHVlczkvNgAvcHVycGxlczkvNgAvb3JhbmdlczkvNgAvcmVkczkvNgAvcHVvcjkvNgAveWxvcmJyOS82AC9wdWJ1Z245LzYAL2J1Z245LzYAL3ByZ245LzYAL3JkeWxnbjkvNgAveWxnbjkvNgAvc3BlY3RyYWw5LzYAL3BpeWc5LzYAL2JyYmc5LzYAL3B1cmQ5LzYAL3lsb3JyZDkvNgAvb3JyZDkvNgAvcGFpcmVkOS82AC9zZXQzOS82AC9zZXQxOS82AC9wYXN0ZWwxOS82AC9yZGd5OC82AC9idXB1OC82AC9yZHB1OC82AC9wdWJ1OC82AC95bGduYnU4LzYAL2duYnU4LzYAL3JkeWxidTgvNgAvcmRidTgvNgAvYWNjZW50OC82AC9ncmV5czgvNgAvZ3JlZW5zOC82AC9ibHVlczgvNgAvcHVycGxlczgvNgAvb3JhbmdlczgvNgAvcmVkczgvNgAvcHVvcjgvNgAveWxvcmJyOC82AC9wdWJ1Z244LzYAL2J1Z244LzYAL3ByZ244LzYAL3JkeWxnbjgvNgAveWxnbjgvNgAvc3BlY3RyYWw4LzYAL3BpeWc4LzYAL2JyYmc4LzYAL3B1cmQ4LzYAL3lsb3JyZDgvNgAvb3JyZDgvNgAvcGFpcmVkOC82AC9zZXQzOC82AC9zZXQyOC82AC9wYXN0ZWwyOC82AC9kYXJrMjgvNgAvc2V0MTgvNgAvcGFzdGVsMTgvNgAvcmRneTcvNgAvYnVwdTcvNgAvcmRwdTcvNgAvcHVidTcvNgAveWxnbmJ1Ny82AC9nbmJ1Ny82AC9yZHlsYnU3LzYAL3JkYnU3LzYAL2FjY2VudDcvNgAvZ3JleXM3LzYAL2dyZWVuczcvNgAvYmx1ZXM3LzYAL3B1cnBsZXM3LzYAL29yYW5nZXM3LzYAL3JlZHM3LzYAL3B1b3I3LzYAL3lsb3JicjcvNgAvcHVidWduNy82AC9idWduNy82AC9wcmduNy82AC9yZHlsZ243LzYAL3lsZ243LzYAL3NwZWN0cmFsNy82AC9waXlnNy82AC9icmJnNy82AC9wdXJkNy82AC95bG9ycmQ3LzYAL29ycmQ3LzYAL3BhaXJlZDcvNgAvc2V0MzcvNgAvc2V0MjcvNgAvcGFzdGVsMjcvNgAvZGFyazI3LzYAL3NldDE3LzYAL3Bhc3RlbDE3LzYAL3JkZ3k2LzYAL2J1cHU2LzYAL3JkcHU2LzYAL3B1YnU2LzYAL3lsZ25idTYvNgAvZ25idTYvNgAvcmR5bGJ1Ni82AC9yZGJ1Ni82AC9hY2NlbnQ2LzYAL2dyZXlzNi82AC9ncmVlbnM2LzYAL2JsdWVzNi82AC9wdXJwbGVzNi82AC9vcmFuZ2VzNi82AC9yZWRzNi82AC9wdW9yNi82AC95bG9yYnI2LzYAL3B1YnVnbjYvNgAvYnVnbjYvNgAvcHJnbjYvNgAvcmR5bGduNi82AC95bGduNi82AC9zcGVjdHJhbDYvNgAvcGl5ZzYvNgAvYnJiZzYvNgAvcHVyZDYvNgAveWxvcnJkNi82AC9vcnJkNi82AC9wYWlyZWQ2LzYAL3NldDM2LzYAL3NldDI2LzYAL3Bhc3RlbDI2LzYAL2RhcmsyNi82AC9zZXQxNi82AC9wYXN0ZWwxNi82AC9wYWlyZWQxMi82AC9zZXQzMTIvNgAvcmRneTExLzYAL3JkeWxidTExLzYAL3JkYnUxMS82AC9wdW9yMTEvNgAvcHJnbjExLzYAL3JkeWxnbjExLzYAL3NwZWN0cmFsMTEvNgAvcGl5ZzExLzYAL2JyYmcxMS82AC9wYWlyZWQxMS82AC9zZXQzMTEvNgAvcmRneTEwLzYAL3JkeWxidTEwLzYAL3JkYnUxMC82AC9wdW9yMTAvNgAvcHJnbjEwLzYAL3JkeWxnbjEwLzYAL3NwZWN0cmFsMTAvNgAvcGl5ZzEwLzYAL2JyYmcxMC82AC9wYWlyZWQxMC82AC9zZXQzMTAvNgBncmV5NQBncmF5NQBceDUAYmlnNQBceEY1AFx4RTUAXHhENQBceEM1AFx4QjUAXHhBNQBncmV5OTUAZ3JheTk1AFx4OTUAZ3JleTg1AGdyYXk4NQBceDg1AGdyZXk3NQBncmF5NzUAZ3JleTY1AGdyYXk2NQBncmV5NTUAZ3JheTU1AGdyZXk0NQBncmF5NDUAZ3JleTM1AGdyYXkzNQBncmV5MjUAZ3JheTI1AGdyZXkxNQBncmF5MTUAXHgxNQBncmF5MDUAL3JkZ3k5LzUAL2J1cHU5LzUAL3JkcHU5LzUAL3B1YnU5LzUAL3lsZ25idTkvNQAvZ25idTkvNQAvcmR5bGJ1OS81AC9yZGJ1OS81AC9ncmV5czkvNQAvZ3JlZW5zOS81AC9ibHVlczkvNQAvcHVycGxlczkvNQAvb3JhbmdlczkvNQAvcmVkczkvNQAvcHVvcjkvNQAveWxvcmJyOS81AC9wdWJ1Z245LzUAL2J1Z245LzUAL3ByZ245LzUAL3JkeWxnbjkvNQAveWxnbjkvNQAvc3BlY3RyYWw5LzUAL3BpeWc5LzUAL2JyYmc5LzUAL3B1cmQ5LzUAL3lsb3JyZDkvNQAvb3JyZDkvNQAvcGFpcmVkOS81AC9zZXQzOS81AC9zZXQxOS81AC9wYXN0ZWwxOS81AC9yZGd5OC81AC9idXB1OC81AC9yZHB1OC81AC9wdWJ1OC81AC95bGduYnU4LzUAL2duYnU4LzUAL3JkeWxidTgvNQAvcmRidTgvNQAvYWNjZW50OC81AC9ncmV5czgvNQAvZ3JlZW5zOC81AC9ibHVlczgvNQAvcHVycGxlczgvNQAvb3JhbmdlczgvNQAvcmVkczgvNQAvcHVvcjgvNQAveWxvcmJyOC81AC9wdWJ1Z244LzUAL2J1Z244LzUAL3ByZ244LzUAL3JkeWxnbjgvNQAveWxnbjgvNQAvc3BlY3RyYWw4LzUAL3BpeWc4LzUAL2JyYmc4LzUAL3B1cmQ4LzUAL3lsb3JyZDgvNQAvb3JyZDgvNQAvcGFpcmVkOC81AC9zZXQzOC81AC9zZXQyOC81AC9wYXN0ZWwyOC81AC9kYXJrMjgvNQAvc2V0MTgvNQAvcGFzdGVsMTgvNQAvcmRneTcvNQAvYnVwdTcvNQAvcmRwdTcvNQAvcHVidTcvNQAveWxnbmJ1Ny81AC9nbmJ1Ny81AC9yZHlsYnU3LzUAL3JkYnU3LzUAL2FjY2VudDcvNQAvZ3JleXM3LzUAL2dyZWVuczcvNQAvYmx1ZXM3LzUAL3B1cnBsZXM3LzUAL29yYW5nZXM3LzUAL3JlZHM3LzUAL3B1b3I3LzUAL3lsb3JicjcvNQAvcHVidWduNy81AC9idWduNy81AC9wcmduNy81AC9yZHlsZ243LzUAL3lsZ243LzUAL3NwZWN0cmFsNy81AC9waXlnNy81AC9icmJnNy81AC9wdXJkNy81AC95bG9ycmQ3LzUAL29ycmQ3LzUAL3BhaXJlZDcvNQAvc2V0MzcvNQAvc2V0MjcvNQAvcGFzdGVsMjcvNQAvZGFyazI3LzUAL3NldDE3LzUAL3Bhc3RlbDE3LzUAL3JkZ3k2LzUAL2J1cHU2LzUAL3JkcHU2LzUAL3B1YnU2LzUAL3lsZ25idTYvNQAvZ25idTYvNQAvcmR5bGJ1Ni81AC9yZGJ1Ni81AC9hY2NlbnQ2LzUAL2dyZXlzNi81AC9ncmVlbnM2LzUAL2JsdWVzNi81AC9wdXJwbGVzNi81AC9vcmFuZ2VzNi81AC9yZWRzNi81AC9wdW9yNi81AC95bG9yYnI2LzUAL3B1YnVnbjYvNQAvYnVnbjYvNQAvcHJnbjYvNQAvcmR5bGduNi81AC95bGduNi81AC9zcGVjdHJhbDYvNQAvcGl5ZzYvNQAvYnJiZzYvNQAvcHVyZDYvNQAveWxvcnJkNi81AC9vcnJkNi81AC9wYWlyZWQ2LzUAL3NldDM2LzUAL3NldDI2LzUAL3Bhc3RlbDI2LzUAL2RhcmsyNi81AC9zZXQxNi81AC9wYXN0ZWwxNi81AC9yZGd5NS81AC9idXB1NS81AC9yZHB1NS81AC9wdWJ1NS81AC95bGduYnU1LzUAL2duYnU1LzUAL3JkeWxidTUvNQAvcmRidTUvNQAvYWNjZW50NS81AC9ncmV5czUvNQAvZ3JlZW5zNS81AC9ibHVlczUvNQAvcHVycGxlczUvNQAvb3JhbmdlczUvNQAvcmVkczUvNQAvcHVvcjUvNQAveWxvcmJyNS81AC9wdWJ1Z241LzUAL2J1Z241LzUAL3ByZ241LzUAL3JkeWxnbjUvNQAveWxnbjUvNQAvc3BlY3RyYWw1LzUAL3BpeWc1LzUAL2JyYmc1LzUAL3B1cmQ1LzUAL3lsb3JyZDUvNQAvb3JyZDUvNQAvcGFpcmVkNS81AC9zZXQzNS81AC9zZXQyNS81AC9wYXN0ZWwyNS81AC9kYXJrMjUvNQAvc2V0MTUvNQAvcGFzdGVsMTUvNQAvcGFpcmVkMTIvNQAvc2V0MzEyLzUAL3JkZ3kxMS81AC9yZHlsYnUxMS81AC9yZGJ1MTEvNQAvcHVvcjExLzUAL3ByZ24xMS81AC9yZHlsZ24xMS81AC9zcGVjdHJhbDExLzUAL3BpeWcxMS81AC9icmJnMTEvNQAvcGFpcmVkMTEvNQAvc2V0MzExLzUAL3JkZ3kxMC81AC9yZHlsYnUxMC81AC9yZGJ1MTAvNQAvcHVvcjEwLzUAL3ByZ24xMC81AC9yZHlsZ24xMC81AC9zcGVjdHJhbDEwLzUAL3BpeWcxMC81AC9icmJnMTAvNQAvcGFpcmVkMTAvNQAvc2V0MzEwLzUAYmlnLTUAQklHLTUAIC1kYXNoIDUAaXZvcnk0AGdyZXk0AGRhcmtzbGF0ZWdyYXk0AFx4NABzbm93NABsaWdodHllbGxvdzQAaG9uZXlkZXc0AHdoZWF0NAB0b21hdG80AHJvc3licm93bjQAbWFyb29uNABsaWdodHNhbG1vbjQAbGVtb25jaGlmZm9uNABzcHJpbmdncmVlbjQAZGFya29saXZlZ3JlZW40AHBhbGVncmVlbjQAZGFya3NlYWdyZWVuNABsaWdodGN5YW40AHRhbjQAcGx1bTQAc2Vhc2hlbGw0AGNvcmFsNABob3RwaW5rNABsaWdodHBpbms0AGRlZXBwaW5rNABjb3Juc2lsazQAZmlyZWJyaWNrNABraGFraTQAbGF2ZW5kZXJibHVzaDQAcGVhY2hwdWZmNABiaXNxdWU0AGxpZ2h0c2t5Ymx1ZTQAZGVlcHNreWJsdWU0AGxpZ2h0Ymx1ZTQAY2FkZXRibHVlNABkb2RnZXJibHVlNABsaWdodHN0ZWVsYmx1ZTQAcm95YWxibHVlNABzbGF0ZWJsdWU0AG5hdmFqb3doaXRlNABhbnRpcXVld2hpdGU0AGNob2NvbGF0ZTQAY2hhcnRyZXVzZTQAbWlzdHlyb3NlNABwYWxldHVycXVvaXNlNABhenVyZTQAdGhlcmU0AGFxdWFtYXJpbmU0AHRoaXN0bGU0AG1lZGl1bXB1cnBsZTQAZGFya29yYW5nZTQAbGlnaHRnb2xkZW5yb2Q0AGRhcmtnb2xkZW5yb2Q0AGJ1cmx5d29vZDQAZ29sZDQAbWVkaXVtb3JjaGlkNABkYXJrb3JjaGlkNABwYWxldmlvbGV0cmVkNABpbmRpYW5yZWQ0AG9yYW5nZXJlZDQAb2xpdmVkcmFiNABtYWdlbnRhNABzaWVubmE0AFx4RjQAXHhFNABceEQ0AFx4QzQAXHhCNABceEE0AGdyZXk5NABncmF5OTQAXHg5NABncmV5ODQAZ3JheTg0AFx4ODQAZ3JleTc0AGdyYXk3NABncmV5NjQAZ3JheTY0AGdyZXk1NABncmF5NTQAZ3JleTQ0AGdyYXk0NABncmV5MzQAZ3JheTM0AGZyYWMzNABncmV5MjQAZ3JheTI0AGdyZXkxNABncmF5MTQAXHgxNABmcmFjMTQAL3JkZ3k5LzQAL2J1cHU5LzQAL3JkcHU5LzQAL3B1YnU5LzQAL3lsZ25idTkvNAAvZ25idTkvNAAvcmR5bGJ1OS80AC9yZGJ1OS80AC9ncmV5czkvNAAvZ3JlZW5zOS80AC9ibHVlczkvNAAvcHVycGxlczkvNAAvb3JhbmdlczkvNAAvcmVkczkvNAAvcHVvcjkvNAAveWxvcmJyOS80AC9wdWJ1Z245LzQAL2J1Z245LzQAL3ByZ245LzQAL3JkeWxnbjkvNAAveWxnbjkvNAAvc3BlY3RyYWw5LzQAL3BpeWc5LzQAL2JyYmc5LzQAL3B1cmQ5LzQAL3lsb3JyZDkvNAAvb3JyZDkvNAAvcGFpcmVkOS80AC9zZXQzOS80AC9zZXQxOS80AC9wYXN0ZWwxOS80AC9yZGd5OC80AC9idXB1OC80AC9yZHB1OC80AC9wdWJ1OC80AC95bGduYnU4LzQAL2duYnU4LzQAL3JkeWxidTgvNAAvcmRidTgvNAAvYWNjZW50OC80AC9ncmV5czgvNAAvZ3JlZW5zOC80AC9ibHVlczgvNAAvcHVycGxlczgvNAAvb3JhbmdlczgvNAAvcmVkczgvNAAvcHVvcjgvNAAveWxvcmJyOC80AC9wdWJ1Z244LzQAL2J1Z244LzQAL3ByZ244LzQAL3JkeWxnbjgvNAAveWxnbjgvNAAvc3BlY3RyYWw4LzQAL3BpeWc4LzQAL2JyYmc4LzQAL3B1cmQ4LzQAL3lsb3JyZDgvNAAvb3JyZDgvNAAvcGFpcmVkOC80AC9zZXQzOC80AC9zZXQyOC80AC9wYXN0ZWwyOC80AC9kYXJrMjgvNAAvc2V0MTgvNAAvcGFzdGVsMTgvNAAvcmRneTcvNAAvYnVwdTcvNAAvcmRwdTcvNAAvcHVidTcvNAAveWxnbmJ1Ny80AC9nbmJ1Ny80AC9yZHlsYnU3LzQAL3JkYnU3LzQAL2FjY2VudDcvNAAvZ3JleXM3LzQAL2dyZWVuczcvNAAvYmx1ZXM3LzQAL3B1cnBsZXM3LzQAL29yYW5nZXM3LzQAL3JlZHM3LzQAL3B1b3I3LzQAL3lsb3JicjcvNAAvcHVidWduNy80AC9idWduNy80AC9wcmduNy80AC9yZHlsZ243LzQAL3lsZ243LzQAL3NwZWN0cmFsNy80AC9waXlnNy80AC9icmJnNy80AC9wdXJkNy80AC95bG9ycmQ3LzQAL29ycmQ3LzQAL3BhaXJlZDcvNAAvc2V0MzcvNAAvc2V0MjcvNAAvcGFzdGVsMjcvNAAvZGFyazI3LzQAL3NldDE3LzQAL3Bhc3RlbDE3LzQAL3JkZ3k2LzQAL2J1cHU2LzQAL3JkcHU2LzQAL3B1YnU2LzQAL3lsZ25idTYvNAAvZ25idTYvNAAvcmR5bGJ1Ni80AC9yZGJ1Ni80AC9hY2NlbnQ2LzQAL2dyZXlzNi80AC9ncmVlbnM2LzQAL2JsdWVzNi80AC9wdXJwbGVzNi80AC9vcmFuZ2VzNi80AC9yZWRzNi80AC9wdW9yNi80AC95bG9yYnI2LzQAL3B1YnVnbjYvNAAvYnVnbjYvNAAvcHJnbjYvNAAvcmR5bGduNi80AC95bGduNi80AC9zcGVjdHJhbDYvNAAvcGl5ZzYvNAAvYnJiZzYvNAAvcHVyZDYvNAAveWxvcnJkNi80AC9vcnJkNi80AC9wYWlyZWQ2LzQAL3NldDM2LzQAL3NldDI2LzQAL3Bhc3RlbDI2LzQAL2RhcmsyNi80AC9zZXQxNi80AC9wYXN0ZWwxNi80AC9yZGd5NS80AC9idXB1NS80AC9yZHB1NS80AC9wdWJ1NS80AC95bGduYnU1LzQAL2duYnU1LzQAL3JkeWxidTUvNAAvcmRidTUvNAAvYWNjZW50NS80AC9ncmV5czUvNAAvZ3JlZW5zNS80AC9ibHVlczUvNAAvcHVycGxlczUvNAAvb3JhbmdlczUvNAAvcmVkczUvNAAvcHVvcjUvNAAveWxvcmJyNS80AC9wdWJ1Z241LzQAL2J1Z241LzQAL3ByZ241LzQAL3JkeWxnbjUvNAAveWxnbjUvNAAvc3BlY3RyYWw1LzQAL3BpeWc1LzQAL2JyYmc1LzQAL3B1cmQ1LzQAL3lsb3JyZDUvNAAvb3JyZDUvNAAvcGFpcmVkNS80AC9zZXQzNS80AC9zZXQyNS80AC9wYXN0ZWwyNS80AC9kYXJrMjUvNAAvc2V0MTUvNAAvcGFzdGVsMTUvNAAvcmRneTQvNAAvYnVwdTQvNAAvcmRwdTQvNAAvcHVidTQvNAAveWxnbmJ1NC80AC9nbmJ1NC80AC9yZHlsYnU0LzQAL3JkYnU0LzQAL2FjY2VudDQvNAAvZ3JleXM0LzQAL2dyZWVuczQvNAAvYmx1ZXM0LzQAL3B1cnBsZXM0LzQAL29yYW5nZXM0LzQAL3JlZHM0LzQAL3B1b3I0LzQAL3lsb3JicjQvNAAvcHVidWduNC80AC9idWduNC80AC9wcmduNC80AC9yZHlsZ240LzQAL3lsZ240LzQAL3NwZWN0cmFsNC80AC9waXlnNC80AC9icmJnNC80AC9wdXJkNC80AC95bG9ycmQ0LzQAL29ycmQ0LzQAL3BhaXJlZDQvNAAvc2V0MzQvNAAvc2V0MjQvNAAvcGFzdGVsMjQvNAAvZGFyazI0LzQAL3NldDE0LzQAL3Bhc3RlbDE0LzQAL3BhaXJlZDEyLzQAL3NldDMxMi80AC9yZGd5MTEvNAAvcmR5bGJ1MTEvNAAvcmRidTExLzQAL3B1b3IxMS80AC9wcmduMTEvNAAvcmR5bGduMTEvNAAvc3BlY3RyYWwxMS80AC9waXlnMTEvNAAvYnJiZzExLzQAL3BhaXJlZDExLzQAL3NldDMxMS80AC9yZGd5MTAvNAAvcmR5bGJ1MTAvNAAvcmRidTEwLzQAL3B1b3IxMC80AC9wcmduMTAvNAAvcmR5bGduMTAvNAAvc3BlY3RyYWwxMC80AC9waXlnMTAvNAAvYnJiZzEwLzQAL3BhaXJlZDEwLzQAL3NldDMxMC80ADEuNABuID49IDQAc2lkZXMgPT0gNABpdm9yeTMAU3BhcnNlTWF0cml4X211bHRpcGx5MwBncmV5MwBkYXJrc2xhdGVncmF5MwBceDMAc25vdzMAbGlnaHR5ZWxsb3czAGhvbmV5ZGV3MwB3aGVhdDMAc3VwMwB0b21hdG8zAHJvc3licm93bjMAbWFyb29uMwBsaWdodHNhbG1vbjMAbGVtb25jaGlmZm9uMwBzcHJpbmdncmVlbjMAZGFya29saXZlZ3JlZW4zAHBhbGVncmVlbjMAZGFya3NlYWdyZWVuMwBsaWdodGN5YW4zAHRhbjMAcGx1bTMAc2Vhc2hlbGwzAGNvcmFsMwBob3RwaW5rMwBsaWdodHBpbmszAGRlZXBwaW5rMwBjb3Juc2lsazMAZmlyZWJyaWNrMwBraGFraTMAbGF2ZW5kZXJibHVzaDMAcGVhY2hwdWZmMwBiaXNxdWUzAGxpZ2h0c2t5Ymx1ZTMAZGVlcHNreWJsdWUzAGxpZ2h0Ymx1ZTMAY2FkZXRibHVlMwBkb2RnZXJibHVlMwBsaWdodHN0ZWVsYmx1ZTMAcm95YWxibHVlMwBzbGF0ZWJsdWUzAG5hdmFqb3doaXRlMwBhbnRpcXVld2hpdGUzAGNob2NvbGF0ZTMAY2hhcnRyZXVzZTMAbWlzdHlyb3NlMwBwYWxldHVycXVvaXNlMwBhenVyZTMAYXF1YW1hcmluZTMAdGhpc3RsZTMAbWVkaXVtcHVycGxlMwBkYXJrb3JhbmdlMwBsaWdodGdvbGRlbnJvZDMAZGFya2dvbGRlbnJvZDMAYnVybHl3b29kMwBnb2xkMwBtZWRpdW1vcmNoaWQzAGRhcmtvcmNoaWQzAHBhbGV2aW9sZXRyZWQzAGluZGlhbnJlZDMAb3JhbmdlcmVkMwBvbGl2ZWRyYWIzAG1hZ2VudGEzAHNpZW5uYTMAXHhGMwBceEUzAFx4RDMAXHhDMwBceEIzAFx4QTMAZ3JleTkzAGdyYXk5MwBceDkzAGdyZXk4MwBncmF5ODMAXHg4MwBncmV5NzMAZ3JheTczAGdyZXk2MwBncmF5NjMAZ3JleTUzAGdyYXk1MwBncmV5NDMAZ3JheTQzAGdyZXkzMwBncmF5MzMAZ3JleTIzAGdyYXkyMwBncmV5MTMAZ3JheTEzAFx4MTMAL3JkZ3k5LzMAL2J1cHU5LzMAL3JkcHU5LzMAL3B1YnU5LzMAL3lsZ25idTkvMwAvZ25idTkvMwAvcmR5bGJ1OS8zAC9yZGJ1OS8zAC9ncmV5czkvMwAvZ3JlZW5zOS8zAC9ibHVlczkvMwAvcHVycGxlczkvMwAvb3JhbmdlczkvMwAvcmVkczkvMwAvcHVvcjkvMwAveWxvcmJyOS8zAC9wdWJ1Z245LzMAL2J1Z245LzMAL3ByZ245LzMAL3JkeWxnbjkvMwAveWxnbjkvMwAvc3BlY3RyYWw5LzMAL3BpeWc5LzMAL2JyYmc5LzMAL3B1cmQ5LzMAL3lsb3JyZDkvMwAvb3JyZDkvMwAvcGFpcmVkOS8zAC9zZXQzOS8zAC9zZXQxOS8zAC9wYXN0ZWwxOS8zAC9yZGd5OC8zAC9idXB1OC8zAC9yZHB1OC8zAC9wdWJ1OC8zAC95bGduYnU4LzMAL2duYnU4LzMAL3JkeWxidTgvMwAvcmRidTgvMwAvYWNjZW50OC8zAC9ncmV5czgvMwAvZ3JlZW5zOC8zAC9ibHVlczgvMwAvcHVycGxlczgvMwAvb3JhbmdlczgvMwAvcmVkczgvMwAvcHVvcjgvMwAveWxvcmJyOC8zAC9wdWJ1Z244LzMAL2J1Z244LzMAL3ByZ244LzMAL3JkeWxnbjgvMwAveWxnbjgvMwAvc3BlY3RyYWw4LzMAL3BpeWc4LzMAL2JyYmc4LzMAL3B1cmQ4LzMAL3lsb3JyZDgvMwAvb3JyZDgvMwAvcGFpcmVkOC8zAC9zZXQzOC8zAC9zZXQyOC8zAC9wYXN0ZWwyOC8zAC9kYXJrMjgvMwAvc2V0MTgvMwAvcGFzdGVsMTgvMwAvcmRneTcvMwAvYnVwdTcvMwAvcmRwdTcvMwAvcHVidTcvMwAveWxnbmJ1Ny8zAC9nbmJ1Ny8zAC9yZHlsYnU3LzMAL3JkYnU3LzMAL2FjY2VudDcvMwAvZ3JleXM3LzMAL2dyZWVuczcvMwAvYmx1ZXM3LzMAL3B1cnBsZXM3LzMAL29yYW5nZXM3LzMAL3JlZHM3LzMAL3B1b3I3LzMAL3lsb3JicjcvMwAvcHVidWduNy8zAC9idWduNy8zAC9wcmduNy8zAC9yZHlsZ243LzMAL3lsZ243LzMAL3NwZWN0cmFsNy8zAC9waXlnNy8zAC9icmJnNy8zAC9wdXJkNy8zAC95bG9ycmQ3LzMAL29ycmQ3LzMAL3BhaXJlZDcvMwAvc2V0MzcvMwAvc2V0MjcvMwAvcGFzdGVsMjcvMwAvZGFyazI3LzMAL3NldDE3LzMAL3Bhc3RlbDE3LzMAL3JkZ3k2LzMAL2J1cHU2LzMAL3JkcHU2LzMAL3B1YnU2LzMAL3lsZ25idTYvMwAvZ25idTYvMwAvcmR5bGJ1Ni8zAC9yZGJ1Ni8zAC9hY2NlbnQ2LzMAL2dyZXlzNi8zAC9ncmVlbnM2LzMAL2JsdWVzNi8zAC9wdXJwbGVzNi8zAC9vcmFuZ2VzNi8zAC9yZWRzNi8zAC9wdW9yNi8zAC95bG9yYnI2LzMAL3B1YnVnbjYvMwAvYnVnbjYvMwAvcHJnbjYvMwAvcmR5bGduNi8zAC95bGduNi8zAC9zcGVjdHJhbDYvMwAvcGl5ZzYvMwAvYnJiZzYvMwAvcHVyZDYvMwAveWxvcnJkNi8zAC9vcnJkNi8zAC9wYWlyZWQ2LzMAL3NldDM2LzMAL3NldDI2LzMAL3Bhc3RlbDI2LzMAL2RhcmsyNi8zAC9zZXQxNi8zAC9wYXN0ZWwxNi8zAC9yZGd5NS8zAC9idXB1NS8zAC9yZHB1NS8zAC9wdWJ1NS8zAC95bGduYnU1LzMAL2duYnU1LzMAL3JkeWxidTUvMwAvcmRidTUvMwAvYWNjZW50NS8zAC9ncmV5czUvMwAvZ3JlZW5zNS8zAC9ibHVlczUvMwAvcHVycGxlczUvMwAvb3JhbmdlczUvMwAvcmVkczUvMwAvcHVvcjUvMwAveWxvcmJyNS8zAC9wdWJ1Z241LzMAL2J1Z241LzMAL3ByZ241LzMAL3JkeWxnbjUvMwAveWxnbjUvMwAvc3BlY3RyYWw1LzMAL3BpeWc1LzMAL2JyYmc1LzMAL3B1cmQ1LzMAL3lsb3JyZDUvMwAvb3JyZDUvMwAvcGFpcmVkNS8zAC9zZXQzNS8zAC9zZXQyNS8zAC9wYXN0ZWwyNS8zAC9kYXJrMjUvMwAvc2V0MTUvMwAvcGFzdGVsMTUvMwAvcmRneTQvMwAvYnVwdTQvMwAvcmRwdTQvMwAvcHVidTQvMwAveWxnbmJ1NC8zAC9nbmJ1NC8zAC9yZHlsYnU0LzMAL3JkYnU0LzMAL2FjY2VudDQvMwAvZ3JleXM0LzMAL2dyZWVuczQvMwAvYmx1ZXM0LzMAL3B1cnBsZXM0LzMAL29yYW5nZXM0LzMAL3JlZHM0LzMAL3B1b3I0LzMAL3lsb3JicjQvMwAvcHVidWduNC8zAC9idWduNC8zAC9wcmduNC8zAC9yZHlsZ240LzMAL3lsZ240LzMAL3NwZWN0cmFsNC8zAC9waXlnNC8zAC9icmJnNC8zAC9wdXJkNC8zAC95bG9ycmQ0LzMAL29ycmQ0LzMAL3BhaXJlZDQvMwAvc2V0MzQvMwAvc2V0MjQvMwAvcGFzdGVsMjQvMwAvZGFyazI0LzMAL3NldDE0LzMAL3Bhc3RlbDE0LzMAL3JkZ3kzLzMAL2J1cHUzLzMAL3JkcHUzLzMAL3B1YnUzLzMAL3lsZ25idTMvMwAvZ25idTMvMwAvcmR5bGJ1My8zAC9yZGJ1My8zAC9hY2NlbnQzLzMAL2dyZXlzMy8zAC9ncmVlbnMzLzMAL2JsdWVzMy8zAC9wdXJwbGVzMy8zAC9vcmFuZ2VzMy8zAC9yZWRzMy8zAC9wdW9yMy8zAC95bG9yYnIzLzMAL3B1YnVnbjMvMwAvYnVnbjMvMwAvcHJnbjMvMwAvcmR5bGduMy8zAC95bGduMy8zAC9zcGVjdHJhbDMvMwAvcGl5ZzMvMwAvYnJiZzMvMwAvcHVyZDMvMwAveWxvcnJkMy8zAC9vcnJkMy8zAC9wYWlyZWQzLzMAL3NldDMzLzMAL3NldDIzLzMAL3Bhc3RlbDIzLzMAL2RhcmsyMy8zAC9zZXQxMy8zAC9wYXN0ZWwxMy8zAC9wYWlyZWQxMi8zAC9zZXQzMTIvMwAvcmRneTExLzMAL3JkeWxidTExLzMAL3JkYnUxMS8zAC9wdW9yMTEvMwAvcHJnbjExLzMAL3JkeWxnbjExLzMAL3NwZWN0cmFsMTEvMwAvcGl5ZzExLzMAL2JyYmcxMS8zAC9wYWlyZWQxMS8zAC9zZXQzMTEvMwAvcmRneTEwLzMAL3JkeWxidTEwLzMAL3JkYnUxMC8zAC9wdW9yMTAvMwAvcHJnbjEwLzMAL3JkeWxnbjEwLzMAL3NwZWN0cmFsMTAvMwAvcGl5ZzEwLzMAL2JyYmcxMC8zAC9wYWlyZWQxMC8zAC9zZXQzMTAvMwBpdm9yeTIAZ3JleTIAZGFya3NsYXRlZ3JheTIAXHgyAHNub3cyAGxpZ2h0eWVsbG93MgBob25leWRldzIAUlRyZWVJbnNlcnQyAHdoZWF0MgBzdXAyAG5vcDIAdG9tYXRvMgByb3N5YnJvd24yAG1hcm9vbjIAbGlnaHRzYWxtb24yAGxlbW9uY2hpZmZvbjIAc3ByaW5nZ3JlZW4yAGRhcmtvbGl2ZWdyZWVuMgBwYWxlZ3JlZW4yAGRhcmtzZWFncmVlbjIAbGlnaHRjeWFuMgB0YW4yAHBsdW0yAHNlYXNoZWxsMgBjb3JhbDIAaG90cGluazIAbGlnaHRwaW5rMgBkZWVwcGluazIAY29ybnNpbGsyAGZpcmVicmljazIAa2hha2kyAGxhdmVuZGVyYmx1c2gyAHBlYWNocHVmZjIAYnJvbnplMgBiaXNxdWUyAGxpZ2h0c2t5Ymx1ZTIAZGVlcHNreWJsdWUyAGxpZ2h0Ymx1ZTIAY2FkZXRibHVlMgBkb2RnZXJibHVlMgBsaWdodHN0ZWVsYmx1ZTIAcm95YWxibHVlMgBzbGF0ZWJsdWUyAG5hdmFqb3doaXRlMgBhbnRpcXVld2hpdGUyAGNob2NvbGF0ZTIAY2hhcnRyZXVzZTIAbWlzdHlyb3NlMgBwYWxldHVycXVvaXNlMgBhenVyZTIAYXF1YW1hcmluZTIAdGhpc3RsZTIAbWVkaXVtcHVycGxlMgBkYXJrb3JhbmdlMgBsaWdodGdvbGRlbnJvZDIAZGFya2dvbGRlbnJvZDIAYnVybHl3b29kMgBnb2xkMgBtZWRpdW1vcmNoaWQyAGRhcmtvcmNoaWQyAHBhbGV2aW9sZXRyZWQyAGluZGlhbnJlZDIAb3JhbmdlcmVkMgBvbGl2ZWRyYWIyAG1hZ2VudGEyAHNpZW5uYTIAXHhGMgBceEUyAFx4RDIAXHhDMgBceEIyAFx4QTIAZ3JleTkyAGdyYXk5MgBceDkyAGdyZXk4MgBncmF5ODIAXHg4MgBncmV5NzIAZ3JheTcyAGdyZXk2MgBncmF5NjIAZ3JleTUyAGdyYXk1MgBncmV5NDIAZ3JheTQyAGdyZXkzMgBncmF5MzIAZ3JleTIyAGdyYXkyMgBncmV5MTIAZ3JheTEyAFx4MTIAZnJhYzEyAC9wYWlyZWQxMi8xMgAvc2V0MzEyLzEyAC9yZGd5OS8yAC9idXB1OS8yAC9yZHB1OS8yAC9wdWJ1OS8yAC95bGduYnU5LzIAL2duYnU5LzIAL3JkeWxidTkvMgAvcmRidTkvMgAvZ3JleXM5LzIAL2dyZWVuczkvMgAvYmx1ZXM5LzIAL3B1cnBsZXM5LzIAL29yYW5nZXM5LzIAL3JlZHM5LzIAL3B1b3I5LzIAL3lsb3JicjkvMgAvcHVidWduOS8yAC9idWduOS8yAC9wcmduOS8yAC9yZHlsZ245LzIAL3lsZ245LzIAL3NwZWN0cmFsOS8yAC9waXlnOS8yAC9icmJnOS8yAC9wdXJkOS8yAC95bG9ycmQ5LzIAL29ycmQ5LzIAL3BhaXJlZDkvMgAvc2V0MzkvMgAvc2V0MTkvMgAvcGFzdGVsMTkvMgAvcmRneTgvMgAvYnVwdTgvMgAvcmRwdTgvMgAvcHVidTgvMgAveWxnbmJ1OC8yAC9nbmJ1OC8yAC9yZHlsYnU4LzIAL3JkYnU4LzIAL2FjY2VudDgvMgAvZ3JleXM4LzIAL2dyZWVuczgvMgAvYmx1ZXM4LzIAL3B1cnBsZXM4LzIAL29yYW5nZXM4LzIAL3JlZHM4LzIAL3B1b3I4LzIAL3lsb3JicjgvMgAvcHVidWduOC8yAC9idWduOC8yAC9wcmduOC8yAC9yZHlsZ244LzIAL3lsZ244LzIAL3NwZWN0cmFsOC8yAC9waXlnOC8yAC9icmJnOC8yAC9wdXJkOC8yAC95bG9ycmQ4LzIAL29ycmQ4LzIAL3BhaXJlZDgvMgAvc2V0MzgvMgAvc2V0MjgvMgAvcGFzdGVsMjgvMgAvZGFyazI4LzIAL3NldDE4LzIAL3Bhc3RlbDE4LzIAL3JkZ3k3LzIAL2J1cHU3LzIAL3JkcHU3LzIAL3B1YnU3LzIAL3lsZ25idTcvMgAvZ25idTcvMgAvcmR5bGJ1Ny8yAC9yZGJ1Ny8yAC9hY2NlbnQ3LzIAL2dyZXlzNy8yAC9ncmVlbnM3LzIAL2JsdWVzNy8yAC9wdXJwbGVzNy8yAC9vcmFuZ2VzNy8yAC9yZWRzNy8yAC9wdW9yNy8yAC95bG9yYnI3LzIAL3B1YnVnbjcvMgAvYnVnbjcvMgAvcHJnbjcvMgAvcmR5bGduNy8yAC95bGduNy8yAC9zcGVjdHJhbDcvMgAvcGl5ZzcvMgAvYnJiZzcvMgAvcHVyZDcvMgAveWxvcnJkNy8yAC9vcnJkNy8yAC9wYWlyZWQ3LzIAL3NldDM3LzIAL3NldDI3LzIAL3Bhc3RlbDI3LzIAL2RhcmsyNy8yAC9zZXQxNy8yAC9wYXN0ZWwxNy8yAC9yZGd5Ni8yAC9idXB1Ni8yAC9yZHB1Ni8yAC9wdWJ1Ni8yAC95bGduYnU2LzIAL2duYnU2LzIAL3JkeWxidTYvMgAvcmRidTYvMgAvYWNjZW50Ni8yAC9ncmV5czYvMgAvZ3JlZW5zNi8yAC9ibHVlczYvMgAvcHVycGxlczYvMgAvb3JhbmdlczYvMgAvcmVkczYvMgAvcHVvcjYvMgAveWxvcmJyNi8yAC9wdWJ1Z242LzIAL2J1Z242LzIAL3ByZ242LzIAL3JkeWxnbjYvMgAveWxnbjYvMgAvc3BlY3RyYWw2LzIAL3BpeWc2LzIAL2JyYmc2LzIAL3B1cmQ2LzIAL3lsb3JyZDYvMgAvb3JyZDYvMgAvcGFpcmVkNi8yAC9zZXQzNi8yAC9zZXQyNi8yAC9wYXN0ZWwyNi8yAC9kYXJrMjYvMgAvc2V0MTYvMgAvcGFzdGVsMTYvMgAvcmRneTUvMgAvYnVwdTUvMgAvcmRwdTUvMgAvcHVidTUvMgAveWxnbmJ1NS8yAC9nbmJ1NS8yAC9yZHlsYnU1LzIAL3JkYnU1LzIAL2FjY2VudDUvMgAvZ3JleXM1LzIAL2dyZWVuczUvMgAvYmx1ZXM1LzIAL3B1cnBsZXM1LzIAL29yYW5nZXM1LzIAL3JlZHM1LzIAL3B1b3I1LzIAL3lsb3JicjUvMgAvcHVidWduNS8yAC9idWduNS8yAC9wcmduNS8yAC9yZHlsZ241LzIAL3lsZ241LzIAL3NwZWN0cmFsNS8yAC9waXlnNS8yAC9icmJnNS8yAC9wdXJkNS8yAC95bG9ycmQ1LzIAL29ycmQ1LzIAL3BhaXJlZDUvMgAvc2V0MzUvMgAvc2V0MjUvMgAvcGFzdGVsMjUvMgAvZGFyazI1LzIAL3NldDE1LzIAL3Bhc3RlbDE1LzIAL3JkZ3k0LzIAL2J1cHU0LzIAL3JkcHU0LzIAL3B1YnU0LzIAL3lsZ25idTQvMgAvZ25idTQvMgAvcmR5bGJ1NC8yAC9yZGJ1NC8yAC9hY2NlbnQ0LzIAL2dyZXlzNC8yAC9ncmVlbnM0LzIAL2JsdWVzNC8yAC9wdXJwbGVzNC8yAC9vcmFuZ2VzNC8yAC9yZWRzNC8yAC9wdW9yNC8yAC95bG9yYnI0LzIAL3B1YnVnbjQvMgAvYnVnbjQvMgAvcHJnbjQvMgAvcmR5bGduNC8yAC95bGduNC8yAC9zcGVjdHJhbDQvMgAvcGl5ZzQvMgAvYnJiZzQvMgAvcHVyZDQvMgAveWxvcnJkNC8yAC9vcnJkNC8yAC9wYWlyZWQ0LzIAL3NldDM0LzIAL3NldDI0LzIAL3Bhc3RlbDI0LzIAL2RhcmsyNC8yAC9zZXQxNC8yAC9wYXN0ZWwxNC8yAC9yZGd5My8yAC9idXB1My8yAC9yZHB1My8yAC9wdWJ1My8yAC95bGduYnUzLzIAL2duYnUzLzIAL3JkeWxidTMvMgAvcmRidTMvMgAvYWNjZW50My8yAC9ncmV5czMvMgAvZ3JlZW5zMy8yAC9ibHVlczMvMgAvcHVycGxlczMvMgAvb3JhbmdlczMvMgAvcmVkczMvMgAvcHVvcjMvMgAveWxvcmJyMy8yAC9wdWJ1Z24zLzIAL2J1Z24zLzIAL3ByZ24zLzIAL3JkeWxnbjMvMgAveWxnbjMvMgAvc3BlY3RyYWwzLzIAL3BpeWczLzIAL2JyYmczLzIAL3B1cmQzLzIAL3lsb3JyZDMvMgAvb3JyZDMvMgAvcGFpcmVkMy8yAC9zZXQzMy8yAC9zZXQyMy8yAC9wYXN0ZWwyMy8yAC9kYXJrMjMvMgAvc2V0MTMvMgAvcGFzdGVsMTMvMgAvcGFpcmVkMTIvMgAvc2V0MzEyLzIAL3JkZ3kxMS8yAC9yZHlsYnUxMS8yAC9yZGJ1MTEvMgAvcHVvcjExLzIAL3ByZ24xMS8yAC9yZHlsZ24xMS8yAC9zcGVjdHJhbDExLzIAL3BpeWcxMS8yAC9icmJnMTEvMgAvcGFpcmVkMTEvMgAvc2V0MzExLzIAL3JkZ3kxMC8yAC9yZHlsYnUxMC8yAC9yZGJ1MTAvMgAvcHVvcjEwLzIAL3ByZ24xMC8yAC9yZHlsZ24xMC8yAC9zcGVjdHJhbDEwLzIAL3BpeWcxMC8yAC9icmJnMTAvMgAvcGFpcmVkMTAvMgAvc2V0MzEwLzIAMTMuMS4yACAtZGFzaCAyAHN6ID49IDIAbGVuID49IDIAZXhwID09IDEgfHwgZXhwID09IDIAZGltID09IDIATkRfb3V0KHYpLnNpemUgPT0gMgBpdm9yeTEAZ3JleTEAZGFya3NsYXRlZ3JheTEAXHgxAHNub3cxAGxpZ2h0eWVsbG93MQBob25leWRldzEAbnNsaW1pdDEAd2hlYXQxAHN1cDEAbm9wMQB0b21hdG8xAHJvc3licm93bjEAbWFyb29uMQBsaWdodHNhbG1vbjEAbGVtb25jaGlmZm9uMQBsYXRpbjEAYWdvcGVuMQBzcHJpbmdncmVlbjEAZGFya29saXZlZ3JlZW4xAHBhbGVncmVlbjEAZGFya3NlYWdyZWVuMQBsaWdodGN5YW4xAHRhbjEAcGx1bTEAc2Vhc2hlbGwxAGNvcmFsMQBob3RwaW5rMQBsaWdodHBpbmsxAGRlZXBwaW5rMQBjb3Juc2lsazEAZmlyZWJyaWNrMQBqMCA8PSBpMSAmJiBpMSA8PSBqMQBraGFraTEAbGF2ZW5kZXJibHVzaDEAcGVhY2hwdWZmMQBiaXNxdWUxAGxpZ2h0c2t5Ymx1ZTEAZGVlcHNreWJsdWUxAGxpZ2h0Ymx1ZTEAY2FkZXRibHVlMQBkb2RnZXJibHVlMQBsaWdodHN0ZWVsYmx1ZTEAcm95YWxibHVlMQBzbGF0ZWJsdWUxAG5hdmFqb3doaXRlMQBhbnRpcXVld2hpdGUxAGNob2NvbGF0ZTEAY2hhcnRyZXVzZTEAbWlzdHlyb3NlMQBwYWxldHVycXVvaXNlMQBhenVyZTEAYXF1YW1hcmluZTEAdGhpc3RsZTEAbWVkaXVtcHVycGxlMQBkYXJrb3JhbmdlMQBhcmdfZTAgJiYgYXJnX2UxAGxpZ2h0Z29sZGVucm9kMQBkYXJrZ29sZGVucm9kMQBidXJseXdvb2QxAGdvbGQxAG1lZGl1bW9yY2hpZDEAZGFya29yY2hpZDEAcGFsZXZpb2xldHJlZDEAaW5kaWFucmVkMQBvcmFuZ2VyZWQxAG9saXZlZHJhYjEAbWFnZW50YTEAc2llbm5hMQBceEYxAFx4RTEAXHhEMQBceEMxAFx4QjEAXHhBMQBncmV5OTEAZ3JheTkxAFx4OTEAZ3JleTgxAGdyYXk4MQBceDgxAGdyZXk3MQBncmF5NzEAZ3JleTYxAGdyYXk2MQBncmV5NTEAZ3JheTUxAGdyZXk0MQBncmF5NDEAZ3JleTMxAGdyYXkzMQBncmV5MjEAZ3JheTIxAGdyZXkxMQBncmF5MTEAXHgxMQAvcGFpcmVkMTIvMTEAL3NldDMxMi8xMQAvcmRneTExLzExAC9yZHlsYnUxMS8xMQAvcmRidTExLzExAC9wdW9yMTEvMTEAL3ByZ24xMS8xMQAvcmR5bGduMTEvMTEAL3NwZWN0cmFsMTEvMTEAL3BpeWcxMS8xMQAvYnJiZzExLzExAC9wYWlyZWQxMS8xMQAvc2V0MzExLzExAGNzW2ldLT5zbGFjaygpPi0wLjAwMDAwMDEAL3JkZ3k5LzEAL2J1cHU5LzEAL3JkcHU5LzEAL3B1YnU5LzEAL3lsZ25idTkvMQAvZ25idTkvMQAvcmR5bGJ1OS8xAC9yZGJ1OS8xAC9ncmV5czkvMQAvZ3JlZW5zOS8xAC9ibHVlczkvMQAvcHVycGxlczkvMQAvb3JhbmdlczkvMQAvcmVkczkvMQAvcHVvcjkvMQAveWxvcmJyOS8xAC9wdWJ1Z245LzEAL2J1Z245LzEAL3ByZ245LzEAL3JkeWxnbjkvMQAveWxnbjkvMQAvc3BlY3RyYWw5LzEAL3BpeWc5LzEAL2JyYmc5LzEAL3B1cmQ5LzEAL3lsb3JyZDkvMQAvb3JyZDkvMQAvcGFpcmVkOS8xAC9zZXQzOS8xAC9zZXQxOS8xAC9wYXN0ZWwxOS8xAC9yZGd5OC8xAC9idXB1OC8xAC9yZHB1OC8xAC9wdWJ1OC8xAC95bGduYnU4LzEAL2duYnU4LzEAL3JkeWxidTgvMQAvcmRidTgvMQAvYWNjZW50OC8xAC9ncmV5czgvMQAvZ3JlZW5zOC8xAC9ibHVlczgvMQAvcHVycGxlczgvMQAvb3JhbmdlczgvMQAvcmVkczgvMQAvcHVvcjgvMQAveWxvcmJyOC8xAC9wdWJ1Z244LzEAL2J1Z244LzEAL3ByZ244LzEAL3JkeWxnbjgvMQAveWxnbjgvMQAvc3BlY3RyYWw4LzEAL3BpeWc4LzEAL2JyYmc4LzEAL3B1cmQ4LzEAL3lsb3JyZDgvMQAvb3JyZDgvMQAvcGFpcmVkOC8xAC9zZXQzOC8xAC9zZXQyOC8xAC9wYXN0ZWwyOC8xAC9kYXJrMjgvMQAvc2V0MTgvMQAvcGFzdGVsMTgvMQAvcmRneTcvMQAvYnVwdTcvMQAvcmRwdTcvMQAvcHVidTcvMQAveWxnbmJ1Ny8xAC9nbmJ1Ny8xAC9yZHlsYnU3LzEAL3JkYnU3LzEAL2FjY2VudDcvMQAvZ3JleXM3LzEAL2dyZWVuczcvMQAvYmx1ZXM3LzEAL3B1cnBsZXM3LzEAL29yYW5nZXM3LzEAL3JlZHM3LzEAL3B1b3I3LzEAL3lsb3JicjcvMQAvcHVidWduNy8xAC9idWduNy8xAC9wcmduNy8xAC9yZHlsZ243LzEAL3lsZ243LzEAL3NwZWN0cmFsNy8xAC9waXlnNy8xAC9icmJnNy8xAC9wdXJkNy8xAC95bG9ycmQ3LzEAL29ycmQ3LzEAL3BhaXJlZDcvMQAvc2V0MzcvMQAvc2V0MjcvMQAvcGFzdGVsMjcvMQAvZGFyazI3LzEAL3NldDE3LzEAL3Bhc3RlbDE3LzEAL3JkZ3k2LzEAL2J1cHU2LzEAL3JkcHU2LzEAL3B1YnU2LzEAL3lsZ25idTYvMQAvZ25idTYvMQAvcmR5bGJ1Ni8xAC9yZGJ1Ni8xAC9hY2NlbnQ2LzEAL2dyZXlzNi8xAC9ncmVlbnM2LzEAL2JsdWVzNi8xAC9wdXJwbGVzNi8xAC9vcmFuZ2VzNi8xAC9yZWRzNi8xAC9wdW9yNi8xAC95bG9yYnI2LzEAL3B1YnVnbjYvMQAvYnVnbjYvMQAvcHJnbjYvMQAvcmR5bGduNi8xAC95bGduNi8xAC9zcGVjdHJhbDYvMQAvcGl5ZzYvMQAvYnJiZzYvMQAvcHVyZDYvMQAveWxvcnJkNi8xAC9vcnJkNi8xAC9wYWlyZWQ2LzEAL3NldDM2LzEAL3NldDI2LzEAL3Bhc3RlbDI2LzEAL2RhcmsyNi8xAC9zZXQxNi8xAC9wYXN0ZWwxNi8xAC9yZGd5NS8xAC9idXB1NS8xAC9yZHB1NS8xAC9wdWJ1NS8xAC95bGduYnU1LzEAL2duYnU1LzEAL3JkeWxidTUvMQAvcmRidTUvMQAvYWNjZW50NS8xAC9ncmV5czUvMQAvZ3JlZW5zNS8xAC9ibHVlczUvMQAvcHVycGxlczUvMQAvb3JhbmdlczUvMQAvcmVkczUvMQAvcHVvcjUvMQAveWxvcmJyNS8xAC9wdWJ1Z241LzEAL2J1Z241LzEAL3ByZ241LzEAL3JkeWxnbjUvMQAveWxnbjUvMQAvc3BlY3RyYWw1LzEAL3BpeWc1LzEAL2JyYmc1LzEAL3B1cmQ1LzEAL3lsb3JyZDUvMQAvb3JyZDUvMQAvcGFpcmVkNS8xAC9zZXQzNS8xAC9zZXQyNS8xAC9wYXN0ZWwyNS8xAC9kYXJrMjUvMQAvc2V0MTUvMQAvcGFzdGVsMTUvMQAvcmRneTQvMQAvYnVwdTQvMQAvcmRwdTQvMQAvcHVidTQvMQAveWxnbmJ1NC8xAC9nbmJ1NC8xAC9yZHlsYnU0LzEAL3JkYnU0LzEAL2FjY2VudDQvMQAvZ3JleXM0LzEAL2dyZWVuczQvMQAvYmx1ZXM0LzEAL3B1cnBsZXM0LzEAL29yYW5nZXM0LzEAL3JlZHM0LzEAL3B1b3I0LzEAL3lsb3JicjQvMQAvcHVidWduNC8xAC9idWduNC8xAC9wcmduNC8xAC9yZHlsZ240LzEAL3lsZ240LzEAL3NwZWN0cmFsNC8xAC9waXlnNC8xAC9icmJnNC8xAC9wdXJkNC8xAC95bG9ycmQ0LzEAL29ycmQ0LzEAL3BhaXJlZDQvMQAvc2V0MzQvMQAvc2V0MjQvMQAvcGFzdGVsMjQvMQAvZGFyazI0LzEAL3NldDE0LzEAL3Bhc3RlbDE0LzEAL3JkZ3kzLzEAL2J1cHUzLzEAL3JkcHUzLzEAL3B1YnUzLzEAL3lsZ25idTMvMQAvZ25idTMvMQAvcmR5bGJ1My8xAC9yZGJ1My8xAC9hY2NlbnQzLzEAL2dyZXlzMy8xAC9ncmVlbnMzLzEAL2JsdWVzMy8xAC9wdXJwbGVzMy8xAC9vcmFuZ2VzMy8xAC9yZWRzMy8xAC9wdW9yMy8xAC95bG9yYnIzLzEAL3B1YnVnbjMvMQAvYnVnbjMvMQAvcHJnbjMvMQAvcmR5bGduMy8xAC95bGduMy8xAC9zcGVjdHJhbDMvMQAvcGl5ZzMvMQAvYnJiZzMvMQAvcHVyZDMvMQAveWxvcnJkMy8xAC9vcnJkMy8xAC9wYWlyZWQzLzEAL3NldDMzLzEAL3NldDIzLzEAL3Bhc3RlbDIzLzEAL2RhcmsyMy8xAC9zZXQxMy8xAC9wYXN0ZWwxMy8xAC9wYWlyZWQxMi8xAC9zZXQzMTIvMQAvcmRneTExLzEAL3JkeWxidTExLzEAL3JkYnUxMS8xAC9wdW9yMTEvMQAvcHJnbjExLzEAL3JkeWxnbjExLzEAL3NwZWN0cmFsMTEvMQAvcGl5ZzExLzEAL2JyYmcxMS8xAC9wYWlyZWQxMS8xAC9zZXQzMTEvMQAvcmRneTEwLzEAL3JkeWxidTEwLzEAL3JkYnUxMC8xAC9wdW9yMTAvMQAvcHJnbjEwLzEAL3JkeWxnbjEwLzEAL3NwZWN0cmFsMTAvMQAvcGl5ZzEwLzEAL2JyYmcxMC8xAC9wYWlyZWQxMC8xAC9zZXQzMTAvMQBsYXRpbi0xAElTT184ODU5LTEASVNPODg1OS0xAElTTy04ODU5LTEAaSA+PSAxAHEtPm4gPT0gMQBydHAtPnNwbGl0LlBhcnRpdGlvbnNbMF0ucGFydGl0aW9uW2ldID09IDAgfHwgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLnBhcnRpdGlvbltpXSA9PSAxAGJ6LnNpemUgJSAzID09IDEAZWRnZV9saXN0X3NpemUoJmN0eC0+VHJlZV9lZGdlKSA9PSBjdHgtPk5fbm9kZXMgLSAxAG5vZGVfc2V0X3NpemUoZy0+bl9pZCkgPT0gb3NpemUgKyAxAG4tPmNvdW50ICsgKCpubiktPmNvdW50ID09IE5PREVDQVJEICsgMQBydHAtPnNwbGl0LlBhcnRpdGlvbnNbMF0uY291bnRbMF0gKyBydHAtPnNwbGl0LlBhcnRpdGlvbnNbMF0uY291bnRbMV0gPT0gTk9ERUNBUkQgKyAxAGdyZXkwAGdyYXkwAGpzb24wACNmMGYwZjAAI2UwZTBlMAB4Yi0+dS5zLmxvY2F0ZWQgPiBBR1hCVUZfSU5MSU5FX1NJWkVfMABcMABUMABceEYwAFx4RTAAXHhEMABceEMwAFx4QjAAXHhBMABncmV5OTAAZ3JheTkwAFx4OTAAZ3JleTgwAGdyYXk4MABceDgwACM4MDgwODAAZ3JleTcwAGdyYXk3MABjY3dyb3QgPT0gMCB8fCBjY3dyb3QgPT0gOTAgfHwgY2N3cm90ID09IDE4MCB8fCBjY3dyb3QgPT0gMjcwAGN3cm90ID09IDAgfHwgY3dyb3QgPT0gOTAgfHwgY3dyb3QgPT0gMTgwIHx8IGN3cm90ID09IDI3MABncmV5NjAAZ3JheTYwAGdyZXk1MABncmF5NTAAZ3JleTQwAGdyYXk0MAByLndpZHRoKCk8MWU0MABncmV5MzAAZ3JheTMwACMzMDMwMzAAZ3JleTIwAGdyYXkyMAAyMDI1MDgwOC4yMzIwAGdyZXkxMABncmF5MTAAXHgxMAAjMTAxMDEwAC9wYWlyZWQxMi8xMAAvc2V0MzEyLzEwAC9yZGd5MTEvMTAAL3JkeWxidTExLzEwAC9yZGJ1MTEvMTAAL3B1b3IxMS8xMAAvcHJnbjExLzEwAC9yZHlsZ24xMS8xMAAvc3BlY3RyYWwxMS8xMAAvcGl5ZzExLzEwAC9icmJnMTEvMTAAL3BhaXJlZDExLzEwAC9zZXQzMTEvMTAAL3JkZ3kxMC8xMAAvcmR5bGJ1MTAvMTAAL3JkYnUxMC8xMAAvcHVvcjEwLzEwAC9wcmduMTAvMTAAL3JkeWxnbjEwLzEwAC9zcGVjdHJhbDEwLzEwAC9waXlnMTAvMTAAL2JyYmcxMC8xMAAvcGFpcmVkMTAvMTAAL3NldDMxMC8xMAAxMjAwAGdyZXkxMDAAZ3JheTEwMABJU08tSVItMTAwADEwMDAwACUhUFMtQWRvYmUtMy4wAG56ID4gMABsaXN0LT5jYXBhY2l0eSA+IDAAZGlzdCA+IDAAcGF0aGNvdW50ID4gMAB3Z3QgPiAwAG5zaXRlcyA+IDAAc2lkZXMgPiAwAHJ2ID09IDAgfHwgKE5EX29yZGVyKHJ2KS1ORF9vcmRlcih2KSkqZGlyID4gMABsZW4gPiAwAHF0MS0+biA+IDAgJiYgcXQyLT5uID4gMAB3aWR0aCA+IDAAbGlzdC0+c2l6ZSA+IDAAZGljdC0+c2l6ZSA+IDAAc3BsLT5zaXplID4gMABzZWxmLT5zaXplID4gMABiei5zaXplID4gMABib3VuZCA+IDAAZ3JhcGgtPndlaWdodHNbeF0gPiAwAGdyYXBoLT53ZWlnaHRzW25fZWRnZXNdID4gMABtID4gMCAmJiBuID4gMCAmJiBueiA+PSAwAHQgPj0gMABubm9kZXMgPj0gMABuX29icyA+PSAwAG4gPj0gMABuLT5sZXZlbCA+PSAwAHRvdGFsID49IDAAb3JpZ2luYWwgPj0gMABNYXhyYW5rID49IDAAUGFjayA+PSAwAGlpIDwgMTw8ZGltICYmIGlpID49IDAAd2lkdGggPj0gMABqZGlhZyA+PSAwAGlkaWFnID49IDAAZCA+PSAwAHJ0cC0+c3BsaXQuUGFydGl0aW9uc1swXS5jb3VudFswXSA+PSAwICYmIHJ0cC0+c3BsaXQuUGFydGl0aW9uc1swXS5jb3VudFsxXSA+PSAwAFYgPj0gMABhZ25ub2RlcyhncmFwaCkgPj0gMABhZ25ub2RlcyhnKSA+PSAwAEVEX3RyZWVfaW5kZXgoZSkgPj0gMABFRF9jb3VudChlKSA+PSAwAG9ianAxLT5zei54ID09IDAgJiYgb2JqcDEtPnN6LnkgPT0gMABjX2NudCA9PSAwAHJhbmtfcmVzdWx0ID09IDAAZ2V0dGltZW9mZGF5X3JlcyA9PSAwAGogPT0gMABORF9pbihyaWdodCkuc2l6ZSArIE5EX291dChyaWdodCkuc2l6ZSA9PSAwAGEuc2hhcGUgPT0gMCB8fCBiLnNoYXBlID09IDAAZHRzaXplKGRlc3QpID09IDAAZHRzaXplKGctPm5fc2VxKSA9PSAwAGR0c2l6ZShnLT5nX3NlcSkgPT0gMABkdHNpemUoZy0+ZV9zZXEpID09IDAAR0RfbWlucmFuayhnKSA9PSAwAGR0c2l6ZShnLT5nX2lkKSA9PSAwAGR0c2l6ZShnLT5lX2lkKSA9PSAwAGNvc3ggIT0gMCB8fCBzaW54ICE9IDAAbWVtY21wKCZzdHlsZSwgJihncmFwaHZpel9wb2x5Z29uX3N0eWxlX3QpezB9LCBzaXplb2Yoc3R5bGUpKSAhPSAwAHJlc3VsdCA9PSAoaW50KShzaXplIC0gMSkgfHwgcmVzdWx0IDwgMABtYXNrW2lpXSA8IDAATkRfaGVhcGluZGV4KHYpIDwgMABcLwBYMTEvAGd2UmVuZGVySm9icyAlczogJS4yZiBzZWNzLgAlLipzLgBzcGVjaWZpZWQgcm9vdCBub2RlICIlcyIgd2FzIG5vdCBmb3VuZC4AR3JhcGggJXMgaGFzIGFycmF5IHBhY2tpbmcgd2l0aCB1c2VyIHZhbHVlcyBidXQgbm8gInNvcnR2IiBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkLgAxLgAtMC4AJSFQUy1BZG9iZS0AJVBERi0APCEtLQAgLAArACoAc3RyZXEoYXB0ci0+dS5uYW1lLEtleSkAIWlzX2V4YWN0bHlfZXF1YWwoUi54LCBRLngpIHx8ICFpc19leGFjdGx5X2VxdWFsKFIueSwgUS55KQBORF9vcmRlcih2KSA8IE5EX29yZGVyKHcpAHUgPT0gVUZfZmluZCh1KQAhcG9pbnRzX2lzX2VtcHR5KHBsaXN0KQAhb2JqbGlzdF9pc19lbXB0eShsaXN0KQAhc2ZvbnRfaXNfZW1wdHkobGlzdCkAIXJvd3NfaXNfZW1wdHkobGlzdCkAIXRzdHNfaXNfZW1wdHkobGlzdCkAIXBvaW50c19pc19lbXB0eShsaXN0KQAhY29sb3JzZWdzX2lzX2VtcHR5KGxpc3QpACFkZnNfc3RhY2tfaXNfZW1wdHkobGlzdCkAIXBic19zaXplX2lzX2VtcHR5KGxpc3QpAG9iamxpc3RfaXNfY29udGlndW91cyhsaXN0KQBkZWdsaXN0X2lzX2NvbnRpZ3VvdXMobGlzdCkAbm9kZWxpc3RfaXNfY29udGlndW91cyhsaXN0KQBjbGlzdF9pc19jb250aWd1b3VzKGxpc3QpAG5vZGVfbGlzdF9pc19jb250aWd1b3VzKGxpc3QpAGVkZ2Vfc2V0X2lzX2NvbnRpZ3VvdXMobGlzdCkAcG9pbnRzX2lzX2NvbnRpZ3VvdXMobGlzdCkAc3Ryc19pc19jb250aWd1b3VzKGxpc3QpAEFncmFwaHNfaXNfY29udGlndW91cyhsaXN0KQBib3hlc19pc19jb250aWd1b3VzKGxpc3QpAGxheWVyX25hbWVzX2lzX2NvbnRpZ3VvdXMobGlzdCkAc25vZGVzX2lzX2NvbnRpZ3VvdXMobGlzdCkAdmFyYXJyX2lzX2NvbnRpZ3VvdXMobGlzdCkAYmV6aWVyX3BhdGhfaXNfY29udGlndW91cyhsaXN0KQBwYnNfc2l6ZV9pc19jb250aWd1b3VzKGxpc3QpAG9uZSA8PSBub2RlbGlzdF9zaXplKGxpc3QpAG5wIDwgbm9kZWxpc3Rfc2l6ZShsaXN0KQBzdGQ6OmlzX2hlYXAoaGVhcC5iZWdpbigpLCBoZWFwLmVuZCgpLCBndCkAIShxLT5xdHMpACFpbnRzX2lzX2VtcHR5KCZsZWF2ZXMpAG9uX2hlYXAocikAbm9kZV9zZXRfc2l6ZShnLT5uX2lkKSA9PSAoc2l6ZV90KWR0c2l6ZShnLT5uX3NlcSkATkRfcmFuayhmcm9tKSA8IE5EX3JhbmsodG8pAG5vdCB3ZWxsLWZvcm1lZCAoaW52YWxpZCB0b2tlbikAYWdzdWJyZXAoZyxuKQBuICE9IE5EX25leHQobikAZmluZF9mYXN0X25vZGUoZywgbikAKG51bGwpACghamNuKSAmJiAoIXZhbCkAIShxLT5sKQBzeW0tPmlkID49IDAgJiYgc3ltLT5pZCA8IHRvcGRpY3RzaXplKG9iaikAbW92ZSB0byAoJS4wZiwgJS4wZikAOyBzcGxpbmUgdG8gKCUuMGYsICUuMGYpADsgbGluZSB0byAoJS4wZiwgJS4wZikAU3BhcnNlTWF0cml4X2lzX3N5bW1ldHJpYyhBLCB0cnVlKQB2YWx1ZSAmJiBzdHJsZW4odmFsdWUpAFNwYXJzZU1hdHJpeF9pc19zeW1tZXRyaWMoQSwgZmFsc2UpACF1c2Vfc3RhZ2UgfHwgc2l6ZSA8PSBzaXplb2Yoc3RhZ2UpAEVEX2xhYmVsKGZlKQAhVFJFRV9FREdFKGUpACFjb25zdHJhaW5pbmdfZmxhdF9lZGdlKGcsIGUpAG5vZGVfc2V0X2lzX2VtcHR5KGctPm5faWQpAHJfJWQpAGxfJWQpAChsaWIpACFTcGFyc2VNYXRyaXhfaGFzX2RpYWdvbmFsKEEpACBzY2FubmluZyBhIEhUTUwgc3RyaW5nIChtaXNzaW5nICc+Jz8gYmFkIG5lc3Rpbmc/IGxvbmdlciB0aGFuICVkPykAIHNjYW5uaW5nIGEgcXVvdGVkIHN0cmluZyAobWlzc2luZyBlbmRxdW90ZT8gbG9uZ2VyIHRoYW4gJWQ/KQAgc2Nhbm5pbmcgYSAvKi4uLiovIGNvbW1lbnQgKG1pc3NpbmcgJyovPyBsb25nZXIgdGhhbiAlZD8pAGZhbGxiYWNrKDQpAG9uX2hlYXAocjApIHx8IG9uX2hlYXAocjEpAGFndGFpbChlKSA9PSBVRl9maW5kKGFndGFpbChlKSkAYWdoZWFkKGUpID09IFVGX2ZpbmQoYWdoZWFkKGUpKQBvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfZ2V0X25leHRfYnVmZmVyKCkAb3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHl5X2NyZWF0ZV9idWZmZXIoKQBvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXllbnN1cmVfYnVmZmVyX3N0YWNrKCkAc3RyZXEobW9kZSwgInIiKSB8fCBzdHJlcShtb2RlLCAicmIiKSB8fCBzdHJlcShtb2RlLCAidyIpIHx8IHN0cmVxKG1vZGUsICJ3YiIpAHBuYW1lICE9IE5VTEwgJiYgIXN0cmVxKHBuYW1lLCAiIikAc2V0bGluZXdpZHRoKAApIHJvdGF0ZSglZCkgdHJhbnNsYXRlKAAgdHJhbnNmb3JtPSJzY2FsZSgATk9UQVRJT04oACAoACBuZWFyICclcycAJWxmLCVsZiwlbGYsJyVbXiddJwBpc2RpZ2l0KChpbnQpZG90cFsxXSkgJiYgaXNkaWdpdCgoaW50KWRvdHBbMl0pICYmIGRvdHBbM10gPT0gJ1wwJwAmACUAJAB1cmwoIwA8dGV4dFBhdGggeGxpbms6aHJlZj0iIwA8YXJlYSBzaGFwZT0icG9seSIAIGZpbGw9IiMlMDJ4JTAyeCUwMngiAChzZXEgJiBTRVFfTUFTSykgPT0gc2VxICYmICJzZXF1ZW5jZSBJRCBvdmVyZmxvdyIAZ3Zfc29ydF9jb21wYXIgPT0gTlVMTCAmJiBndl9zb3J0X2FyZyA9PSBOVUxMICYmICJ1bnN1cHBvcnRlZCByZWN1cnNpdmUgY2FsbCB0byBndl9zb3J0IgBndl9zb3J0X2NvbXBhciAhPSBOVUxMICYmICJubyBjb21wYXJhdG9yIHNldCBpbiBndl9zb3J0IgBvcC0+b3AudS5wb2x5Z29uLmNudCA8PSBJTlRfTUFYICYmICJwb2x5Z29uIGNvdW50IGV4Y2VlZHMgZ3ZyZW5kZXJfcG9seWdvbiBzdXBwb3J0IgAgdGV4dC1hbmNob3I9InN0YXJ0IgBwLnggIT0gYSAmJiAiY2Fubm90IGhhbmRsZSBlbGxpcHNlIHRhbmdlbnQgc2xvcGUgaW4gaG9yaXpvbnRhbCBleHRyZW1lIHBvaW50IgBmdWxsX2xlbmd0aF93aXRob3V0X3NoYWZ0ID4gMCAmJiAibm9uLXBvc2l0aXZlIGZ1bGwgbGVuZ3RoIHdpdGhvdXQgc2hhZnQiADxhcmVhIHNoYXBlPSJyZWN0IgBzaXplID4gMCAmJiAiYXR0ZW1wdCB0byBhbGxvY2F0ZSBhcnJheSBvZiAwLXNpemVkIGVsZW1lbnRzIgBpbmRleCA8IHNlbGYtPnNpemVfYml0cyAmJiAib3V0IG9mIGJvdW5kcyBhY2Nlc3MiAGluZGV4IDwgc2VsZi5zaXplX2JpdHMgJiYgIm91dCBvZiBib3VuZHMgYWNjZXNzIgAqczEgIT0gKnMyICYmICJkdXBsaWNhdGUgc2VwYXJhdG9yIGNoYXJhY3RlcnMiAEdEX21pbnJhbmsoc3ViZykgPD0gR0RfbWF4cmFuayhzdWJnKSAmJiAiY29ycnVwdGVkIHJhbmsgYm91bmRzIgBpbmRleCA8IGxpc3QtPnNpemUgJiYgImluZGV4IG91dCBvZiBib3VuZHMiAGluZGV4IDwgbm9kZWxpc3Rfc2l6ZShsaXN0KSAmJiAiaW5kZXggb3V0IG9mIGJvdW5kcyIAaW5kZXggPCBlZGdlX2xpc3Rfc2l6ZShsaXN0KSAmJiAiaW5kZXggb3V0IG9mIGJvdW5kcyIAaW5kZXggPCB0cmFwc19zaXplKGxpc3QpICYmICJpbmRleCBvdXQgb2YgYm91bmRzIgBpbmRleCA8IG5vZGVzX3NpemUobGlzdCkgJiYgImluZGV4IG91dCBvZiBib3VuZHMiACh1aW50cHRyX3QpcyAlIDIgPT0gMCAmJiAiaGVhcCBwb2ludGVyIHdpdGggbG93IGJpdCBzZXQgd2lsbCBjb2xsaWRlIHdpdGggYW5vbnltb3VzIElEcyIAICgrJTZsZCBieXRlcyAlc3wldSwgeG1scGFyc2UuYzolZCkgJSpzIgAgZm9udC1mYW1pbHk9IiVzIgAgZm9udC13ZWlnaHQ9IiVzIgAgZmlsbD0iJXMiACBmb250LXN0cmV0Y2g9IiVzIgAgZm9udC1zdHlsZT0iJXMiAGJhZCBlZGdlIGxlbiAiJXMiACBiYXNlbGluZS1zaGlmdD0ic3VwZXIiAGFneGJsZW4oeGIpIDw9IHNpemVvZih4Yi0+dS5zdG9yZSkgJiYgImFneGJ1ZiBjb3JydXB0aW9uIgBjZWxsLnJvdyA8IHRhYmxlLT5yb3dfY291bnQgJiYgIm91dCBvZiByYW5nZSBjZWxsIgBjZWxsLmNvbCA8IHRhYmxlLT5jb2x1bW5fY291bnQgJiYgIm91dCBvZiByYW5nZSBjZWxsIgAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIAZnVsbF9sZW5ndGggPiAwICYmICJub24tcG9zaXRpdmUgZnVsbCBsZW5ndGgiAGZ1bGxfYmFzZV93aWR0aCA+IDAgJiYgIm5vbi1wb3NpdGl2ZSBmdWxsIGJhc2Ugd2lkdGgiAG5vbWluYWxfYmFzZV93aWR0aCA+IDAgJiYgIm5vbi1wb3NpdGl2ZSBub21pbmFsIGJhc2Ugd2lkdGgiACIgd2lkdGg9IiVncHgiIGhlaWdodD0iJWdweCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pbllNaW4gbWVldCIgeD0iJWciIHk9IiVnIgAiIHdpZHRoPSIlZ3B4IiBoZWlnaHQ9IiVncHgiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIG1lZXQiIHg9IiVnIiB5PSIlZyIAIGZvbnQtc2l6ZT0iJS4yZiIAIGZpbGwtb3BhY2l0eT0iJWYiADx0ZXh0IHhtbDpzcGFjZT0icHJlc2VydmUiAGlzZmluaXRlKG0pICYmICJlbGxpcHNlIHRhbmdlbnQgc2xvcGUgaXMgaW5maW5pdGUiACh4Yi0+dS5zLmxvY2F0ZWQgPT0gQUdYQlVGX09OX0hFQVAgfHwgeGItPnUucy5sb2NhdGVkIDw9IHNpemVvZih4Yi0+dS5zdG9yZSkpICYmICJjb3JydXB0ZWQgYWd4YnVmIHR5cGUiACB0ZXh0LWFuY2hvcj0ibWlkZGxlIgA8YXJlYSBzaGFwZT0iY2lyY2xlIgBjZWxsLT5yb3cgKyBjZWxsLT5yb3dzcGFuIDw9IHRhYmxlLT5yb3dfY291bnQgJiYgImNlbGwgc3BhbnMgaGlnaGVyIHRoYW4gY29udGFpbmluZyB0YWJsZSIAY2VsbC5yb3cgKyBjZWxsLnJvd3NwYW4gPD0gdGFibGUtPnJvd19jb3VudCAmJiAiY2VsbCBzcGFucyBoaWdoZXIgdGhhbiBjb250YWluaW5nIHRhYmxlIgBjZWxsLT5jb2wgKyBjZWxsLT5jb2xzcGFuIDw9IHRhYmxlLT5jb2x1bW5fY291bnQgJiYgImNlbGwgc3BhbnMgd2lkZXIgdGhhbiBjb250YWluaW5nIHRhYmxlIgBjZWxsLmNvbCArIGNlbGwuY29sc3BhbiA8PSB0YWJsZS0+Y29sdW1uX2NvdW50ICYmICJjZWxsIHNwYW5zIHdpZGVyIHRoYW4gY29udGFpbmluZyB0YWJsZSIAb2xkX25tZW1iIDwgU0laRV9NQVggLyBzaXplICYmICJjbGFpbWVkIHByZXZpb3VzIGV4dGVudCBpcyB0b28gbGFyZ2UiAHRoZXRhID49IDAgJiYgdGhldGEgPD0gTV9QSSAmJiAidGhldGEgb3V0IG9mIHJhbmdlIgB0YWJsZS0+aGVpZ2h0cyA9PSBOVUxMICYmICJ0YWJsZSBoZWlnaHRzIGNvbXB1dGVkIHR3aWNlIgB0YWJsZS0+d2lkdGhzID09IE5VTEwgJiYgInRhYmxlIHdpZHRocyBjb21wdXRlZCB0d2ljZSIAIHRleHQtYW5jaG9yPSJlbmQiACBmb250LXdlaWdodD0iYm9sZCIAIGZvbnQtc3R5bGU9Iml0YWxpYyIAIGJhc2VsaW5lLXNoaWZ0PSJzdWIiAFwiAGxsZW4gPD0gSU5UX01BWCAmJiAiWE1MIHRva2VuIHRvbyBsb25nIGZvciBleHBhdCBBUEkiACIgcnk9IgBfcCIgc3RhcnRPZmZzZXQ9IjUwJSI+PHRzcGFuIHg9IjAiIGR5PSIAIiBjeT0iACIgeT0iACIgcng9IgAgY3g9IgAgeD0iACB0YXJnZXQ9IgAgcG9pbnRzPSIAIGNvb3Jkcz0iACB0ZXh0LWRlY29yYXRpb249IgAgZmlsbD0iACIgc3Ryb2tlLXdpZHRoPSIAPGltYWdlIHhsaW5rOmhyZWY9IgA8P3htbC1zdHlsZXNoZWV0IGhyZWY9IgAiIG5hbWU9IgAgeGxpbms6dGl0bGU9IgAgdGl0bGU9IgAiIHN0cm9rZT0iADxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9IgA8ZGVmcz4KPHJhZGlh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CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2NhbGUgPDEuMDAsIDEuMDAsIDEuNTA+ICogMi41MAogICAgICAgICAgICB0cmFuc2xhdGUgPDAuMDAsIDAuMDAsIDAuMDA+CiAgICAgICAgfQogICAgICAgIGZpbmlzaCB7IGFtYmllbnQgMSBkaWZmdXNlIDAgfQogICAgfQogICAgc2NhbGUgMTAwMDAKfQovL21pc3QKZm9nIHsgZm9nX3R5cGUgMgogICAgZGlzdGFuY2UgNTAKICAgIGNvbG9yIHJnYiA8MS4wMCwgMS4wMCwgMS4wMD4gKiAwLjc1CiAgICBmb2dfb2Zmc2V0IDAuMTAKICAgIGZvZ19hbHQgMS41MAogICAgdHVyYnVsZW5jZSAxLjc1Cn0KLy9nbmQKcGxhbmUgeyA8MC4wMCwgMS4wMCwgMC4wMD4sIDAKICAgIHRleHR1cmUgewogICAgICAgIHBpZ21lbnR7IGNvbG9yIHJnYiA8MC4yNSwgMC40NSwgMC4wMD4gfQogICAgICAgIG5vcm1hbCB7IGJ1bXBzIDAuNzUgc2NhbGUgMC4wMSB9CiAgICAgICAgZmluaXNoIHsgcGhvbmcgMC4xMCB9CiAgICB9Cn0KAGNhbWVyYSB7IGxvY2F0aW9uIDwlLjNmICwgJS4zZiAsIC01MDAuMDAwPgogICAgICAgICBsb29rX2F0ICA8JS4zZiAsICUuM2YgLCAwLjAwMD4KICAgICAgICAgcmlnaHQgeCAqIGltYWdlX3dpZHRoIC8gaW1hZ2VfaGVpZ2h0CiAgICAgICAgIGFuZ2xlICUuM2YKfQoAICAgIG1hdGVyaWFsIE1hdGVyaWFsIHsKAFNoYXBlIHsKACAgYXBwZWFyYW5jZSBBcHBlYXJhbmNlIHsKAC91c2VyX3NoYXBlXyVkIHsKAGdyYXBoIEcgewoAYXJyb3doZWFkID0gNyAlcyBub3QgdXNlZCBieSBncmFwaHZpegoAYm94cmFkID0gMCAlcyBubyByb3VuZGVkIGNvcm5lcnMgaW4gZ3JhcGh2aXoKAG91dCBvZiBtZW1vcnkKACVzOiBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5CgBHcmFwaHZpeiBidWlsdCB3aXRob3V0IGFueSB0cmlhbmd1bGF0aW9uIGxpYnJhcnkKAHJlbW92ZV9vdmVybGFwOiBHcmFwaHZpeiBub3QgYnVpbHQgd2l0aCB0cmlhbmd1bGF0aW9uIGxpYnJhcnkKACVzIGZpbGwgaGFzIG5vIG1lYW5pbmcgaW4gRFdCIDIsIGdwaWMgY2FuIHVzZSBmaWxsIG9yIGZpbGxlZCwgMTB0aCBFZGl0aW9uIHVzZXMgZmlsbCBvbmx5CgBib3hyYWQ9Mi4wICVzIHdpbGwgYmUgcmVzZXQgdG8gMC4wIGJ5IGdwaWMgb25seQoAJWQgJWQgIyUwMnglMDJ4JTAyeAoASGVhcCBvdmVyZmxvdwoAdGV4dCB7CiAgICB0dGYgIiVzIiwKICAgICIlcyIsICUuM2YsICUuM2YKICAgICAgICBub19zaGFkb3cKACVkICVkICVkICUuMGYgJWQgJWQgJWQgJWQgJWQgJS4xZiAlZCAlZCAlZCAlZCAlZCAlenUKAHRvdGFsIGFkZGVkIHNvIGZhciA9ICV6dQoAcm9vdCA9ICVzIG1heCBzdGVwcyB0byByb290ID0gJWxsdQoALnBzICUuMGYqXG4oU0Z1LyUuMGZ1CgAgIG1hcmdpbiAldQoATnVtYmVyIG9mIGl0ZXJhdGlvbnMgPSAldQoAb3ZlcmxhcCBbJXVdIDogJXUKACAlcyBhbGlnbmVkdGV4dAoAbGF5ZXJzIG5vdCBzdXBwb3J0ZWQgaW4gJXMgb3V0cHV0CgBhZGRfdHJlZV9lZGdlOiBlbXB0eSBvdXRlZGdlIGxpc3QKAGFkZF90cmVlX2VkZ2U6IGVtcHR5IGluZWRnZSBsaXN0CgBObyBsaWJ6IHN1cHBvcnQKACVzIC5QUyB3L28gYXJncyBjYXVzZXMgR05VIHBpYyB0byBzY2FsZSBkcmF3aW5nIHRvIGZpdCA4LjV4MTEgcGFwZXI7IERXQiBkb2VzIG5vdAoAJXMgR05VIHBpYyBzdXBwb3J0cyBhIGxpbmV0aGljayB2YXJpYWJsZSB0byBzZXQgbGluZSB0aGlja25lc3M7IERXQiBhbmQgMTB0aCBFZC4gZG8gbm90CgAlcyBHTlUgcGljIHN1cHBvcnRzIGEgYm94cmFkIHZhcmlhYmxlIHRvIGRyYXcgYm94ZXMgd2l0aCByb3VuZGVkIGNvcm5lcnM7IERXQiBhbmQgMTB0aCBFZC4gZG8gbm90CgAgLyVzIHNldF9mb250CgAlcyUuKnMgaXMgbm90IGEgdHJvZmYgZm9udAoAY2VsbCBzaXplIHRvbyBzbWFsbCBmb3IgY29udGVudAoAdGFibGUgc2l6ZSB0b28gc21hbGwgZm9yIGNvbnRlbnQKACUlRW5kRG9jdW1lbnQKAFVuY2xvc2VkIGNvbW1lbnQKAExhYmVsIGNsb3NlZCBiZWZvcmUgZW5kIG9mIEhUTUwgZWxlbWVudAoAUG9ydHJhaXQKAGZpeGVkIGNlbGwgc2l6ZSB3aXRoIHVuc3BlY2lmaWVkIHdpZHRoIG9yIGhlaWdodAoAZml4ZWQgdGFibGUgc2l6ZSB3aXRoIHVuc3BlY2lmaWVkIHdpZHRoIG9yIGhlaWdodAoAcG9zIGF0dHJpYnV0ZSBmb3IgZWRnZSAoJXMsJXMpIGRvZXNuJ3QgaGF2ZSAzbisxIHBvaW50cwoAICBnZW5lcmF0ZWQgJWQgY29uc3RyYWludHMKAHNwbGluZXMgYW5kIGNsdXN0ZXIgZWRnZXMgbm90IHN1cHBvcnRlZCAtIHVzaW5nIGxpbmUgc2VnbWVudHMKAG9iamVjdHMKAFdhcm5pbmc6IG5vZGUgJXMsIHBvc2l0aW9uICVzLCBleHBlY3RlZCB0d28gZmxvYXRzCgBmb250IG5hbWUgJXMgY29udGFpbnMgY2hhcmFjdGVycyB0aGF0IG1heSBub3QgYmUgYWNjZXB0ZWQgYnkgc29tZSBQUyB2aWV3ZXJzCgBmb250IG5hbWUgJXMgaXMgbG9uZ2VyIHRoYW4gMjkgY2hhcmFjdGVycyB3aGljaCBtYXkgYmUgcmVqZWN0ZWQgYnkgc29tZSBQUyB2aWV3ZXJzCgBjYW5ub3QgYWxsb2NhdGUgcHMKAHNjYWxlPTEuMCAlcyByZXF1aXJlZCBmb3IgY29tcGFyaXNvbnMKAFNldHRpbmcgaW5pdGlhbCBwb3NpdGlvbnMKACVzIERXQiAyIGNvbXBhdGliaWxpdHkgZGVmaW5pdGlvbnMKAGFycmF5IHBhY2tpbmc6ICVzICV6dSByb3dzICV6dSBjb2x1bW5zCgBzeW50YXggYW1iaWd1aXR5IC0gYmFkbHkgZGVsaW1pdGVkIG51bWJlciAnJXMnIGluIGxpbmUgJWQgb2YgJXMgc3BsaXRzIGludG8gdHdvIHRva2VucwoAZWRnZSBsYWJlbHMgd2l0aCBzcGxpbmVzPWN1cnZlZCBub3Qgc3VwcG9ydGVkIGluIGRvdCAtIHVzZSB4bGFiZWxzCgBmbGF0IGVkZ2UgYmV0d2VlbiBhZGphY2VudCBub2RlcyBvbmUgb2Ygd2hpY2ggaGFzIGEgcmVjb3JkIHNoYXBlIC0gcmVwbGFjZSByZWNvcmRzIHdpdGggSFRNTC1saWtlIGxhYmVscwoAb3V0IG9mIG1lbW9yeSB3aGVuIHRyeWluZyB0byBhbGxvY2F0ZSAlenUgYnl0ZXMKAGludGVnZXIgb3ZlcmZsb3cgd2hlbiB0cnlpbmcgdG8gYWxsb2NhdGUgJXp1ICogJXp1IGJ5dGVzCgB1cGRhdGU6IG1pc21hdGNoZWQgbGNhIGluIHRyZWV1cGRhdGVzCgBncmFwaCAlcywgY29vcmQgJXMsIGV4cGVjdGVkIGZvdXIgZG91YmxlcwoAbm9kZSAlcywgcG9zaXRpb24gJXMsIGV4cGVjdGVkIHR3byBkb3VibGVzCgBGb3VuZCAlZCBEaUctQ29MYSBib3VuZGFyaWVzCgBJbmNoZXMKACglNHp1KSAlN3p1IG5vZGVzICU3enUgZWRnZXMKAGNvbXBvdW5kRWRnZXM6IGNvdWxkIG5vdCBjb25zdHJ1Y3Qgb2JzdGFjbGVzIC0gZmFsbGluZyBiYWNrIHRvIHN0cmFpZ2h0IGxpbmUgZWRnZXMKAHRoZSBib3VuZGluZyBib3hlcyBvZiBzb21lIG5vZGVzIHRvdWNoIC0gZmFsbGluZyBiYWNrIHRvIHN0cmFpZ2h0IGxpbmUgZWRnZXMKAGNvbXBvdW5kRWRnZXM6IG5vZGVzIHRvdWNoIC0gZmFsbGluZyBiYWNrIHRvIHN0cmFpZ2h0IGxpbmUgZWRnZXMKAHNvbWUgbm9kZXMgd2l0aCBtYXJnaW4gKCUuMDJmLCUuMDJmKSB0b3VjaCAtIGZhbGxpbmcgYmFjayB0byBzdHJhaWdodCBsaW5lIGVkZ2VzCgBtZXJnZTI6IGdyYXBoICVzLCByYW5rICVkIGhhcyBvbmx5ICVkIDwgJWQgbm9kZXMKAFNjYW5uaW5nIGdyYXBoICVzLCAlZCBub2RlcwoAV2FybmluZzogbm8gaGFyZC1jb2RlZCBtZXRyaWNzIGZvciAnJXMnLiAgRmFsbGluZyBiYWNrIHRvICdUaW1lcycgbWV0cmljcwoAaW4gZWRnZSAlcyVzJXMKAFVzaW5nICVzOiAlczolcwoARm9ybWF0OiAiJXMiIG5vdCByZWNvZ25pemVkLiBVc2Ugb25lIG9mOiVzCgBMYXlvdXQgdHlwZTogIiVzIiBub3QgcmVjb2duaXplZC4gVXNlIG9uZSBvZjolcwoAbGF5b3V0ICVzCgAuZnQgJXMKAGJhZCBsYWJlbCBmb3JtYXQgJXMKAGluIHJvdXRlc3BsaW5lcywgZWRnZSBpcyBhIGxvb3AgYXQgJXMKACAgICAgICAlN2Qgbm9kZXMgJTdkIGVkZ2VzICU3enUgY29tcG9uZW50cyAlcwoAaW4gbGFiZWwgb2YgZWRnZSAlcyAlcyAlcwoAICBFZGdlICVzICVzICVzCgBvcnRobyAlcyAlcwoAcG9seWxpbmUgJXMgJXMKAHNwbGluZSAlcyAlcwoAcmVjdGFuZ2xlICglLjBmLCUuMGYpICglLjBmLCUuMGYpICVzICVzCgBpbiBjbHVzdGVyICVzCgAlcyB3YXMgYWxyZWFkeSBpbiBhIHJhbmtzZXQsIGRlbGV0ZWQgZnJvbSBjbHVzdGVyICVzCgAlcyAtPiAlczogdGFpbCBub3QgaW5zaWRlIHRhaWwgY2x1c3RlciAlcwoAJXMgLT4gJXM6IGhlYWQgaXMgaW5zaWRlIHRhaWwgY2x1c3RlciAlcwoAaGVhZCBjbHVzdGVyICVzIGluc2lkZSB0YWlsIGNsdXN0ZXIgJXMKAGhlYWQgbm9kZSAlcyBpbnNpZGUgdGFpbCBjbHVzdGVyICVzCgAlcyAtPiAlczogaGVhZCBub3QgaW5zaWRlIGhlYWQgY2x1c3RlciAlcwoAJXMgLT4gJXM6IHRhaWwgaXMgaW5zaWRlIGhlYWQgY2x1c3RlciAlcwoAdGFpbCBjbHVzdGVyICVzIGluc2lkZSBoZWFkIGNsdXN0ZXIgJXMKAHRhaWwgbm9kZSAlcyBpbnNpZGUgaGVhZCBjbHVzdGVyICVzCgBVbmhhbmRsZWQgYWRqdXN0IG9wdGlvbiAlcwoAcmVwb3NpdGlvbiAlcwoAbm8gcG9zaXRpb24gZm9yIGVkZ2Ugd2l0aCB4bGFiZWwgJXMKAG5vIHBvc2l0aW9uIGZvciBlZGdlIHdpdGggdGFpbCBsYWJlbCAlcwoAbm8gcG9zaXRpb24gZm9yIGVkZ2Ugd2l0aCBsYWJlbCAlcwoAbm8gcG9zaXRpb24gZm9yIGVkZ2Ugd2l0aCBoZWFkIGxhYmVsICVzCgAvLyoqKiBiZWdpbl9ncmFwaCAlcwoATWF4LiBpdGVyYXRpb25zICglZCkgcmVhY2hlZCBvbiBncmFwaCAlcwoAQ291bGQgbm90IHBhcnNlICJfYmFja2dyb3VuZCIgYXR0cmlidXRlIGluIGdyYXBoICVzCgBpbiBsYWJlbCBvZiBncmFwaCAlcwoAQ3JlYXRpbmcgZWRnZXMgdXNpbmcgJXMKAEFkanVzdGluZyAlcyB1c2luZyAlcwoAJXMgd2hpbGUgb3BlbmluZyAlcwoAZGVyaXZlIGdyYXBoIF9kZ18lZCBvZiAlcwoAIF0gICV6dSB0cnVlICVzCgBdICAlZCB0cnVlICVzCgAgXSAgJXp1IGZhbHNlICVzCgBdICAlZCBmYWxzZSAlcwoAbWFrZVBvbHk6IHVua25vd24gc2hhcGUgdHlwZSAlcwoAbWFrZUFkZFBvbHk6IHVua25vd24gc2hhcGUgdHlwZSAlcwoAdXNpbmcgJXMgZm9yIHVua25vd24gc2hhcGUgJXMKACAgb2N0cmVlIHNjaGVtZSAlcwoAY2FuJ3Qgb3BlbiBsaWJyYXJ5IGZpbGUgJXMKAGNhbid0IGZpbmQgbGlicmFyeSBmaWxlICVzCgBCb3VuZGluZ0JveCBub3QgZm91bmQgaW4gZXBzZiBmaWxlICVzCgBjb3VsZG4ndCBvcGVuIGVwc2YgZmlsZSAlcwoAY291bGRuJ3QgcmVhZCBmcm9tIGVwc2YgZmlsZSAlcwoAaW4gbm9kZSAlcwoAc2hhcGVmaWxlIG5vdCBzZXQgb3Igbm90IGZvdW5kIGZvciBlcHNmIG5vZGUgJXMKAGluIGxhYmVsIG9mIG5vZGUgJXMKAGVuZCAlcwoAcmFua2luZzogZmFpbHVyZSB0byBjcmVhdGUgc3Ryb25nIGNvbnN0cmFpbnQgZWRnZSBiZXR3ZWVuIG5vZGVzICVzIGFuZCAlcwoAb29wcywgaW50ZXJuYWwgZXJyb3I6IHVuaGFuZGxlZCBjb2xvciB0eXBlPSVkICVzCgAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlLjFmICVkICVkICVkICVkICVkICVkCiAlZCAlcwoALy8qKiogdGV4dHNwYW46ICVzLCBmb250c2l6ZSA9ICUuM2YsIGZvbnRuYW1lID0gJXMKAHRyaWVzID0gJWQsIG1vZGUgPSAlcwoALy8qKiogY29tbWVudDogJXMKAGZvbnRuYW1lOiAiJXMiIHJlc29sdmVkIHRvOiAlcwoAJSUlJVBhZ2VPcmllbnRhdGlvbjogJXMKAGRlbGF1bmF5X3RyaWFuZ3VsYXRpb246ICVzCgBkZWxhdW5heV90cmk6ICVzCgBndnByaW50ZjogJXMKAG5lc3Rpbmcgbm90IGFsbG93ZWQgaW4gc3R5bGU6ICVzCgB1bm1hdGNoZWQgJyknIGluIHN0eWxlOiAlcwoAdW5tYXRjaGVkICcoJyBpbiBzdHlsZTogJXMKACUlJSVUaXRsZTogJXMKACVzIFRpdGxlOiAlcwoAIyBUaXRsZTogJXMKAC8vKioqIGJlZ2luX25vZGU6ICVzCgByZWFsbG9jIGZhaWxlZDogJXMKAGxpYi9wYXRocGxhbi8lczolZDogJXMKAGdyaWQoJWQsJWQpOiAlcwoAQ291bGQgbm90IG9wZW4gIiVzIiBmb3Igd3JpdGluZyA6ICVzCgBzdGFydCBwb3J0OiAoJS41ZywgJS41ZyksIHRhbmdlbnQgYW5nbGU6ICUuNWcsICVzCgBlbmQgcG9ydDogKCUuNWcsICUuNWcpLCB0YW5nZW50IGFuZ2xlOiAlLjVnLCAlcwoAIFslenVdICVwIHNldCAlZCAoJS4wMmYsJS4wMmYpICglLjAyZiwlLjAyZikgJXMKACUlICVzCgAjICVzCgAgIG1vZGUgICAlcwoAY29uanVnYXRlX2dyYWRpZW50OiB1bmV4cGVjdGVkIGxlbmd0aCAwIHZlY3RvcgoAJXMgdG8gY2hhbmdlIGRyYXdpbmcgc2l6ZSwgbXVsdGlwbHkgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb24gdGhlIC5QUyBsaW5lIGFib3ZlIGFuZCB0aGUgbnVtYmVyIG9uIHRoZSB0d28gbGluZXMgYmVsb3cgKHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlcikgYnkgYSBzY2FsZSBmYWN0b3IKAGFkZF9zZWdtZW50OiBlcnJvcgoAJS41ZyAlLjVnICUuNWcgJXNjb2xvcgoAMCAwIDAgZWRnZWNvbG9yCgAwLjggMC44IDAuOCBzZXRyZ2Jjb2xvcgoAMCAwIDEgc2V0cmdiY29sb3IKADEgMCAwIHNldHJnYmNvbG9yCgAwIDAgMCBzZXRyZ2Jjb2xvcgoAJWQgJWQgc2V0bGF5ZXIKAC8vKioqIGVuZF9sYXllcgoAVVRGLTggaW5wdXQgdXNlcyBub24tTGF0aW4xIGNoYXJhY3RlcnMgd2hpY2ggY2Fubm90IGJlIGhhbmRsZWQgYnkgdGhpcyBQb3N0U2NyaXB0IGRyaXZlcgoATGV0dGVyCgAvLyoqKiBiZWdpbl9jbHVzdGVyCgAvLyoqKiBlbmRfY2x1c3RlcgoAcmVtb3ZpbmcgZW1wdHkgY2x1c3RlcgoAQ2VudGVyCgBXYXJuaW5nOiBubyB2YWx1ZSBmb3Igd2lkdGggb2Ygbm9uLUFTQ0lJIGNoYXJhY3RlciAldS4gRmFsbGluZyBiYWNrIHRvIHdpZHRoIG9mIHNwYWNlIGNoYXJhY3RlcgoAYmFzZSByZWZlcmVyCgAlJVBhZ2VUcmFpbGVyCgAlJVRyYWlsZXIKAC8vKioqIGJlemllcgoAIiVzIiB3YXMgbm90IGZvdW5kIGFzIGEgZmlsZSBvciBhcyBhIHNoYXBlIGxpYnJhcnkgbWVtYmVyCgBzdG9wCgAgY3VydmV0bwoAbmV3cGF0aCAlLjBmICUuMGYgbW92ZXRvCgAlLjBmICUuMGYgbGluZXRvCgAgbGF5b3V0PW5lYXRvCgBub2RlICVzIGluIGdyYXBoICVzIGhhcyBubyBwb3NpdGlvbgoAJXMgbWF4cHNodCBhbmQgbWF4cHN3aWQgaGF2ZSBubyBtZWFuaW5nIGluIERXQiAyLjAsIHNldCBwYWdlIGJvdW5kYXJpZXMgaW4gZ3BpYyBhbmQgaW4gMTB0aCBFZGl0aW9uCgAlcyBhcnJvd2hlYWQgaGFzIG5vIG1lYW5pbmcgaW4gRFdCIDIsIGFycm93aGVhZCA9IDcgbWFrZXMgZmlsbGVkIGFycm93aGVhZHMgaW4gZ3BpYyBhbmQgaW4gMTB0aCBFZGl0aW9uCgAlcyBhcnJvd2hlYWQgaXMgdW5kZWZpbmVkIGluIERXQiAyLCBpbml0aWFsbHkgMSBpbiBncGljLCAyIGluIDEwdGggRWRpdGlvbgoAbWFqb3JpemF0aW9uCgAvLyoqKiBwb2x5Z29uCgBvdmVyZmxvdyB3aGVuIGNvbXB1dGluZyBlZGdlIHdlaWdodCBzdW0KAHNmZHAgb25seSBzdXBwb3J0cyBzdGFydD1yYW5kb20KAG5vZGUgcG9zaXRpb25zIGFyZSBpZ25vcmVkIHVubGVzcyBzdGFydD1yYW5kb20KAGNsb3NlcGF0aCBmaWxsCgAgZWxsaXBzZV9wYXRoIGZpbGwKACAgJS4wZiAlLjBmIGNlbGwKACVmICVmICVmICVmIGNlbGwKAGdyYXBoICVzIGlzIGRpc2Nvbm5lY3RlZC4gSGVuY2UsIHRoZSBjaXJjdWl0IG1vZGVsCgBncmFwaCBpcyBkaXNjb25uZWN0ZWQuIEhlbmNlLCB0aGUgY2lyY3VpdCBtb2RlbAoAZWRnZXMgaW4gZ3JhcGggJXMgaGF2ZSBubyBsZW4gYXR0cmlidXRlLiBIZW5jZSwgdGhlIG1kcyBtb2RlbAoAY2lyY3VpdCBtb2RlbCBub3QgeWV0IHN1cHBvcnRlZCBpbiBHbW9kZT1zZ2QsIHJldmVydGluZyB0byBzaG9ydHBhdGggbW9kZWwKAG1kcyBtb2RlbCBub3QgeWV0IHN1cHBvcnRlZCBpbiBHbW9kZT1zZ2QsIHJldmVydGluZyB0byBzaG9ydHBhdGggbW9kZWwKAG5vZGUgJyVzJywgZ3JhcGggJyVzJyBzaXplIHRvbyBzbWFsbCBmb3IgbGFiZWwKACVzIERXQiAyIGRvZXNuJ3QgdXNlIGZpbGwgYW5kIGRvZXNuJ3QgZGVmaW5lIGZpbGx2YWwKAFsge0NhdGFsb2d9IDw8IC9VUkkgPDwgL0Jhc2UgJXMgPj4gPj4KL1BVVCBwZGZtYXJrCgBbIC9Dcm9wQm94IFslZCAlZCAlZCAlZF0gL1BBR0VTIHBkZm1hcmsKACAgL0JvcmRlciBbIDAgMCAwIF0KICAvQWN0aW9uIDw8IC9TdWJ0eXBlIC9VUkkgL1VSSSAlcyA+PgogIC9TdWJ0eXBlIC9MaW5rCi9BTk4gcGRmbWFyawoAdHJvdWJsZSBpbiBpbml0X3JhbmsKAGxpbmV0aGljayA9IDA7IG9sZGxpbmV0aGljayA9IGxpbmV0aGljawoAIHNldGxpbmV3aWR0aAoAZ3NhdmUKJWQgJWQgJWQgJWQgYm94cHJpbSBjbGlwIG5ld3BhdGgKAGdzYXZlICVnICVnIHRyYW5zbGF0ZSBuZXdwYXRoCgAvLyoqKiBlbmRfZ3JhcGgKAGxheW91dCBhdHRyaWJ1dGUgaXMgaW52YWxpZCBleGNlcHQgb24gdGhlIHJvb3QgZ3JhcGgKAGluIGNoZWNrcGF0aCwgYm94ZXMgJXp1IGFuZCAlenUgZG9uJ3QgdG91Y2gKAG1lcmdlX29uZXdheSBnbGl0Y2gKACVzIGRvbid0IGNoYW5nZSBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgaW4gdGhpcyBkcmF3aW5nCgBOb2RlIG5vdCBhZGphY2VudCB0byBjZWxsIC0tIEFib3J0aW5nCgBpbmNvbXBhcmFibGUgc2VnbWVudHMgISEgLS0gQWJvcnRpbmcKAEFsdGVybmF0aXZlbHksIGNvbnNpZGVyIHJ1bm5pbmcgbmVhdG8gdXNpbmcgLUdwYWNrPXRydWUgb3IgZGVjb21wb3NpbmcKAGxhYmVsX3NjaGVtZSA9ICVkID4gNCA6IGlnbm9yaW5nCgBndnJlbmRlcl9zZXRfc3R5bGU6IHVuc3VwcG9ydGVkIHN0eWxlICVzIC0gaWdub3JpbmcKAEFycm93IHR5cGUgIiVzIiB1bmtub3duIC0gaWdub3JpbmcKAGZkcCBkb2VzIG5vdCBzdXBwb3J0IHN0YXJ0PXNlbGYgLSBpZ25vcmluZwoAJXMgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgMSBvciAyIC0gaWdub3JpbmcKAE1vcmUgdGhhbiAyIGNvbG9ycyBzcGVjaWZpZWQgZm9yIGEgZ3JhZGllbnQgLSBpZ25vcmluZyByZW1haW5pbmcKAGFzIHJlcXVpcmVkIGJ5IHRoZSAtbiBmbGFnCgBiYlslc10gJS41ZyAlLjVnICUuNWcgJS41ZwoAL3BhdGhib3ggewogICAgL1kgZXhjaCAlLjVnIHN1YiBkZWYKICAgIC9YIGV4Y2ggJS41ZyBzdWIgZGVmCiAgICAveSBleGNoICUuNWcgc3ViIGRlZgogICAgL3ggZXhjaCAlLjVnIHN1YiBkZWYKICAgIG5ld3BhdGggeCB5IG1vdmV0bwogICAgWCB5IGxpbmV0bwogICAgWCBZIGxpbmV0bwogICAgeCBZIGxpbmV0bwogICAgY2xvc2VwYXRoIHN0cm9rZQogfSBkZWYKL2RiZ3N0YXJ0IHsgZ3NhdmUgJS41ZyAlLjVnIHRyYW5zbGF0ZSB9IGRlZgovYXJyb3dsZW5ndGggMTAgZGVmCi9hcnJvd3dpZHRoIGFycm93bGVuZ3RoIDIgZGl2IGRlZgovYXJyb3doZWFkIHsKICAgIGdzYXZlCiAgICByb3RhdGUKICAgIGN1cnJlbnRwb2ludAogICAgbmV3cGF0aAogICAgbW92ZXRvCiAgICBhcnJvd2xlbmd0aCBhcnJvd3dpZHRoIDIgZGl2IHJsaW5ldG8KICAgIDAgYXJyb3d3aWR0aCBuZWcgcmxpbmV0bwogICAgY2xvc2VwYXRoIGZpbGwKICAgIGdyZXN0b3JlCn0gYmluZCBkZWYKL21ha2VhcnJvdyB7CiAgICBjdXJyZW50cG9pbnQgZXhjaCBwb3Agc3ViIGV4Y2ggY3VycmVudHBvaW50IHBvcCBzdWIgYXRhbgogICAgYXJyb3doZWFkCn0gYmluZCBkZWYKL3BvaW50IHsgICAgbmV3cGF0aCAgICAyIDAgMzYwIGFyYyBmaWxsfSBkZWYvbWFrZXZlYyB7CiAgICAvWSBleGNoIGRlZgogICAgL1ggZXhjaCBkZWYKICAgIC95IGV4Y2ggZGVmCiAgICAveCBleGNoIGRlZgogICAgbmV3cGF0aCB4IHkgbW92ZXRvCiAgICBYIFkgbGluZXRvIHN0cm9rZQogICAgWCBZIG1vdmV0bwogICAgeCB5IG1ha2VhcnJvdwp9IGRlZgoAL3BhdGhib3ggewogICAgL1ggZXhjaCBuZWcgJS41ZyBzdWIgZGVmCiAgICAvWSBleGNoICUuNWcgc3ViIGRlZgogICAgL3ggZXhjaCBuZWcgJS41ZyBzdWIgZGVmCiAgICAveSBleGNoICUuNWcgc3ViIGRlZgogICAgbmV3cGF0aCB4IHkgbW92ZXRvCiAgICBYIHkgbGluZXRv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eSBhbGxvY2F0aW9uIGZhaWx1cmUKACVzOiB2c25wcmludGYgZmFpbHVyZQoAZW5kcGFnZQpzaG93cGFnZQpncmVzdG9yZQoAZW5kCnJlc3RvcmUKAGxheW91dCB3YXMgbm90IGRvbmUKAExheW91dCB3YXMgbm90IGRvbmUKAC8vKioqIHBvbHlsaW5lCgB0cnlpbmcgdG8gZGVsZXRlIGEgbm9uLWxpbmUKACMgZW5kIG9mIEZJRyBmaWxlCgBTaW5nbGUKAHJlbmRlcmVyIGZvciAlcyBpcyB1bmF2YWlsYWJsZQoAZHluYW1pYyBsb2FkaW5nIG5vdCBhdmFpbGFibGUKACUuMGYgJS4wZiBsaW5ldG8gc3Ryb2tlCgBjbG9zZXBhdGggc3Ryb2tlCgAgZWxsaXBzZV9wYXRoIHN0cm9rZQoALy8qKiogYmVnaW5fZWRnZQoALy8qKiogZW5kX2VkZ2UKAGxvc3QgJXMgJXMgZWRnZQoAb3ZlcmZsb3cgd2hlbiBjYWxjdWxhdGluZyB2aXJ0dWFsIHdlaWdodCBvZiBlZGdlCgBhZGRfdHJlZV9lZGdlOiBtaXNzaW5nIHRyZWUgZWRnZQoAaW4gcm91dGVzcGxpbmVzLCBjYW5ub3QgZmluZCBOT1JNQUwgZWRnZQoAc2hvd3BhZ2UKACVkICVkICVkIGJlZ2lucGFnZQoALy8qKiogYmVnaW5fcGFnZQoALy8qKiogZW5kX3BhZ2UKAEZpbGVuYW1lICIlcyIgaXMgdW5zYWZlCgBsYWJlbDogYXJlYSB0b28gbGFyZ2UgZm9yIHJ0cmVlCgAvLyoqKiBlbmRfbm9kZQoAVXNpbmcgZGVmYXVsdCBjYWxjdWxhdGlvbiBmb3Igcm9vdCBub2RlCgBjb250YWluX25vZGVzIGNsdXN0ICVzIHJhbmsgJWQgbWlzc2luZyBub2RlCgAlZiAlZiAlZiAlZiBub2RlCgA8PCAvUGFnZVNpemUgWyVkICVkXSA+PiBzZXRwYWdlZGV2aWNlCgBpbiBjaGVja3BhdGgsIGJveCAlenUgaGFzIExMIGNvb3JkID4gVVIgY29vcmQKAGluIGNoZWNrcGF0aCwgYm94IDAgaGFzIExMIGNvb3JkID4gVVIgY29vcmQKAGNsdXN0ZXIgbmFtZWQgJXMgbm90IGZvdW5kCgBpbnRlZ2VyIG92ZXJmbG93IGR1cmluZyBsaXN0IHByZXBlbmQKAG1pbmNyb3NzOiBwYXNzICVkIGl0ZXIgJWQgdHJ5aW5nICVkIGN1cl9jcm9zcyAlbGxkIGJlc3RfY3Jvc3MgJWxsZAoAbm9kZSAlcywgcG9ydCAlcyB1bnJlY29nbml6ZWQKACVzJXMgdW5zdXBwb3J0ZWQKAGNsdXN0ZXIgY3ljbGUgJXMgLS0gJXMgbm90IHN1cHBvcnRlZAoAJXMgLT4gJXM6IHNwbGluZSBzaXplID4gMSBub3Qgc3VwcG9ydGVkCgBsYXlvdXQgYWJvcnRlZAoAcGFnZWRpcj0lcyBpZ25vcmVkCgBUd28gY2x1c3RlcnMgbmFtZWQgJXMgLSB0aGUgc2Vjb25kIHdpbGwgYmUgaWdub3JlZAoASWxsZWdhbCBhdHRyaWJ1dGUgJXMgaW4gJXMgLSBpZ25vcmVkCgBVbmtub3duIHZhbHVlICVzIGZvciBhdHRyaWJ1dGUgIm1vZGVsIiBpbiBncmFwaCAlcyAtIGlnbm9yZWQKAElsbGVnYWwgdmFsdWUgJXMgZm9yIGF0dHJpYnV0ZSAibW9kZSIgaW4gZ3JhcGggJXMgLSBpZ25vcmVkCgBzdGFydD0wIG5vdCBzdXBwb3J0ZWQgd2l0aCBtb2RlPXNlbGYgLSBpZ25vcmVkCgBPdmVybGFwIHZhbHVlICIlcyIgdW5zdXBwb3J0ZWQgLSBpZ25vcmVkCgBVbmtub3duIHZhbHVlICVzIGZvciBST1dTIC0gaWdub3JlZAoAVW5rbm93biB2YWx1ZSAlcyBmb3IgQ09MVU1OUyAtIGlnbm9yZWQKAElsbGVnYWwgdmFsdWUgJXMgZm9yIFZBTElHTiAtIGlnbm9yZWQKAElsbGVnYWwgdmFsdWUgJXMgZm9yIEFMSUdOIC0gaWdub3JlZAoASWxsZWdhbCB2YWx1ZSAlcyBmb3IgRklYRURTSVpFIC0gaWdub3JlZAoASWxsZWdhbCB2YWx1ZSAlLipzIGZvciBTVFlMRSAtIGlnbm9yZWQKAElsbGVnYWwgdmFsdWUgJXMgZm9yIEJBTElHTiBpbiBURCAtIGlnbm9yZWQKAElsbGVnYWwgdmFsdWUgJXMgZm9yIEFMSUdOIGluIFREIC0gaWdub3JlZAoAUk9XU1BBTiB2YWx1ZSBjYW5ub3QgYmUgMCAtIGlnbm9yZWQKAENPTFNQQU4gdmFsdWUgY2Fubm90IGJlIDAgLSBpZ25vcmVkCgBub2RlICVzLCBwb3J0ICVzLCB1bnJlY29nbml6ZWQgY29tcGFzcyBwb2ludCAnJXMnIC0gaWdub3JlZAoAVW5rbm93biAic3BsaW5lcyIgdmFsdWU6ICIlcyIgLSBpZ25vcmVkCgBpbiByb3V0ZXNwbGluZXMsIFBzaG9ydGVzdHBhdGggZmFpbGVkCgBpbiByb3V0ZXNwbGluZXMsIFByb3V0ZXNwbGluZSBmYWlsZWQKACMgcGx1Z2luIGxvYWRpbmcgb2YgZGVwZW5kZW5jeSAiJS4qcyIgZmFpbGVkCgBQYXJzaW5nIG9mICIlcyIgZmFpbGVkCgAlczolZDogY2xhaW1lZCB1bnJlYWNoYWJsZSBjb2RlIHdhcyByZWFjaGVkCgAjIHVuc3VjY2Vzc2Z1bCBwbHVnaW4gbG9hZAoAJS41ZyAlLjVnIHRyYW5zbGF0ZSBuZXdwYXRoIHVzZXJfc2hhcGVfJWQKAG5zaXplc2NhbGU9JWYsaXRlcmF0aW9ucz0lZAoAY3RybC0+b3ZlcmxhcD0lZAoAJXMgJWQgbm9kZXMgJWQgZWRnZXMgbWF4aXRlcj0lZCBiYWxhbmNlPSVkCgAvLyoqKiBiZWdpbl9sYXllcjogJXMsICVkLyVkCgBkZWdlbmVyYXRlIGNvbmNlbnRyYXRlZCByYW5rICVzLCVkCgAgIG1heCBsZXZlbHMgJWQKAAklcyAlZAoAICBCYXJuZXMtSHV0dCBjb25zdGFudCAlLjAzZiB0b2xlcmFuY2UgICUuMDNmIG1heGl0ZXIgJWQKAGd2d3JpdGVfbm9feiBwcm9ibGVtICVkCgAgIHF1YWR0cmVlIHNpemUgJWQgbWF4X2xldmVsICVkCgByZWJ1aWxkX3ZsaXN0czogbGVhZCBpcyBudWxsIGZvciByYW5rICVkCgByZWJ1aWxkX3ZsaXN0czogcmFuayBsZWFkICVzIG5vdCBpbiBvcmRlciAlZCBvZiByYW5rICVkCgAgIHNtb290aGluZyAlcyBvdmVybGFwICVkIGluaXRpYWxfc2NhbGluZyAlLjAzZiBkb19zaHJpbmtpbmcgJWQKACAgY29vbGluZyAlLjAzZiBzdGVwIHNpemUgICUuMDNmIGFkYXB0aXZlICVkCgBVbnN1cHBvcnRlZCBjaGFyc2V0IHZhbHVlICVkCgBpbiByb3V0ZXNwbGluZXMsIGlsbGVnYWwgdmFsdWVzIG9mIHByZXYgJWQgYW5kIG5leHQgJWQsIGxpbmUgJWQKACAgZWRnZV9sYWJlbGluZ19zY2hlbWUgJWQKAGFnZGljdG9mOiB1bmtub3duIGtpbmQgJWQKACAgcmFuZG9tIHN0YXJ0ICVkIHNlZWQgJWQKACVkICVkICVkICUuMGYgJWQgJWQgJWQgJWQgJWQgJS4xZiAlZCAlZCAlZCAlZAoAJSUlJVBhZ2VCb3VuZGluZ0JveDogJWQgJWQgJWQgJWQKACUlJSVCb3VuZGluZ0JveDogJWQgJWQgJWQgJWQKACUlJSVQYWdlOiAlZCAlZAoAJXMgbm8uIGNlbGxzICVkIFcgJWQgSCAlZAoATWF4cmFuayA9ICVkLCBtaW5yYW5rID0gJWQKAHN0ZXAgc2l6ZSA9ICVkCgAlJSUlUGFnZXM6ICVkCgAjIFBhZ2VzOiAlZAoAJSUlJUVuZFBhZ2U6ICVkCgAiZm9udGNoYXIiOiAlZAoAICBmbGFncyAgJWQKACAgc2l6ZSAgICVkCgAlcyBkYXNod2lkIGlzIDAuMSBpbiAxMHRoIEVkaXRpb24sIDAuMDUgaW4gRFdCIDIgYW5kIGluIGdwaWMKACVzIG1heHBzaHQgYW5kIG1heHBzd2lkIGFyZSBwcmVkZWZpbmVkIHRvIDExLjAgYW5kIDguNSBpbiBncGljCgAgJWQlcyBpdGVyYXRpb25zICUuMmYgc2VjCgAKZmluYWwgZSA9ICVmICVkIGl0ZXJhdGlvbnMgJS4yZiBzZWMKACVkIG5vZGVzICUuMmYgc2VjCgAlcyV6dSBub2RlcyAlenUgZWRnZXMgJWQgaXRlciAlLjJmIHNlYwoACmZpbmlzaGVkIGluICUuMmYgc2VjCgA6ICUuMmYgc2VjCgAgbm9kZVtzaGFwZT1wb2ludF0KACJyZWN0IjogWyUuMDNmLCUuMDNmLCUuMDNmLCUuMDNmXQoAaW5zdGFsbF9pbl9yYW5rLCBsaW5lICVkOiBORF9vcmRlciglcykgWyVkXSA+IEdEX3JhbmsoUm9vdClbJWRdLmFuIFslZF0KAGluc3RhbGxfaW5fcmFuaywgbGluZSAlZDogR0RfcmFuayhnKVslZF0udiArIE5EX29yZGVyKCVzKSBbJWRdID4gR0RfcmFuayhnKVslZF0uYXYgKyBHRF9yYW5rKFJvb3QpWyVkXS5hbiBbJWRdCgBpbnN0YWxsX2luX3JhbmssIGxpbmUgJWQ6IHJhbmsgJWQgbm90IGluIHJhbmsgcmFuZ2UgWyVkLCVkXQoAZmFpbGVkIGF0IG5vZGUgJWRbMV0KAGZhaWxlZCBhdCBub2RlICVkWzBdCgAgICVkIC0tICVkW2xhYmVsPSIlZiJdCgAgICVkIFtwb3M9IiUuMGYsJS4wZiEiXQoAIF0KAERvdDogWwoAIm9iamVjdHMiOiBbCgAic3ViZ3JhcGhzIjogWwoAImVkZ2VzIjogWwoAIm5vZGVzIjogWwoAWCBlbHNlIFoKCWRlZmluZSBzZXRmaWxsdmFsIFkgZmlsbHZhbCA9IFk7CglkZWZpbmUgYm9sZCBZIFk7CglkZWZpbmUgZmlsbGVkIFkgZmlsbCBZOwpaCgBpZiBib3hyYWQgPiAxLjAgJiYgZGFzaHdpZCA8IDAuMDc1IHRoZW4gWAoJZmlsbHZhbCA9IDE7CglkZWZpbmUgZmlsbCBZIFk7CglkZWZpbmUgc29saWQgWSBZOwoJZGVmaW5lIHJlc2V0IFkgc2NhbGU9MS4wIFk7ClgKACBBQk9SVElORwoAJSVFT0YKACVzIHJlc3RvcmUgcG9pbnQgc2l6ZSBhbmQgZm9udAoucHMgXG4oLlMKLmZ0IFxuKERGCgBdCi5QRQoAaW52YWxpZGF0ZV9wYXRoOiBza2lwcGVkIG92ZXIgTENBCgBJbnZhbGlkICVkLWJ5dGUgVVRGOCBmb3VuZCBpbiBpbnB1dCBvZiBncmFwaCAlcyAtIHRyZWF0ZWQgYXMgTGF0aW4tMS4gUGVyaGFwcyAiLUdjaGFyc2V0PWxhdGluMSIgaXMgbmVlZGVkPwoAVVRGOCBjb2RlcyA+IDQgYnl0ZXMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIChncmFwaCAlcykgLSB0cmVhdGVkIGFzIExhdGluLTEuIFBlcmhhcHMgIi1HY2hhcnNldD1sYXRpbjEiIGlzIG5lZWRlZD8KADwvdGV4dD4KADwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KADwvcmFkaWFsR3JhZGllbnQ+CjwvZGVmcz4KADwvbWFwPgoAPC9zdmc+CgA8L2E+CjwvZz4KACAgICByb3RhdGUgICA8JTkuM2YsICU5LjNmLCAlOS4zZj4KACAgICBzY2FsZSAgICA8JTkuM2YsICU5LjNmLCAlOS4zZj4KADwvdGl0bGU+CgAiIHR5cGU9InRleHQvY3NzIj8+CgA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KACAgICB0cmFuc2xhdGU8JTkuM2YsICU5LjNmLCAlZC4wMDA+CgA7Ii8+CgAgUGFnZXM6ICVkIC0tPgoAKQogLS0+CgAgLT4KADwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgoAKSI+CgByXyVkIiBjeD0iNTAlJSIgY3k9IjUwJSUiIHI9Ijc1JSUiIGZ4PSIlLjBmJSUiIGZ5PSIlLjBmJSUiPgoAIiA+CgAjZGVjbGFyZSAlcyA9ICVzOwoACSVzCXNvcnJ5LCB0aGUgZ3JvZmYgZm9sa3MgY2hhbmdlZCBncGljOyBzZW5kIGFueSBjb21wbGFpbnQgdG8gdGhlbTsKAAklcwlpbnN0YWxsIGEgbW9yZSByZWNlbnQgdmVyc2lvbiBvZiBncGljIG9yIHN3aXRjaCB0byBEV0Igb3IgMTB0aCBFZGl0aW9uIHBpYzsKAF07CgBpZiBmaWxsdmFsID4gMC40IHRoZW4gWAoJZGVmaW5lIHNldGZpbGx2YWwgWSBmaWxsdmFsID0gMSAtIFk7CglkZWZpbmUgYm9sZCBZIHRoaWNrbmVzcyAyIFk7CgAjdmVyc2lvbiAzLjY7CgBlbGxpcHNlIGF0dHJzMCAlc3dpZCAlLjVmIGh0ICUuNWYgYXQgKCUuNWYsJS41Zik7CgAiIGF0ICglLjVmLCUuNWYpOwoAJSVCZWdpbkRvY3VtZW50OgoAJXp1IGJveGVzOgoAcGFjayBpbmZvOgoAc3ByaW5nX2VsZWN0cmljYWxfY29udHJvbDoKAFVuc3VwcG9ydGVkIGNoYXJzZXQgIiVzIiAtIGFzc3VtaW5nIHV0Zi04CgAgICAgICBhbWJpZW50SW50ZW5zaXR5IDAuMzMKACNGSUcgMy4yCgAtMgoAJXMgbm9uLWZhdGFsIHJ1bi10aW1lIHBpYyB2ZXJzaW9uIGRldGVybWluYXRpb24sIHZlcnNpb24gMgoAJXMgZmlsbHZhbCBpcyAwLjMgaW4gMTB0aCBFZGl0aW9uIChmaWxsIDAgbWVhbnMgYmxhY2spLCAwLjUgaW4gZ3BpYyAoZmlsbCAwIG1lYW5zIHdoaXRlKSwgdW5kZWZpbmVkIGluIERXQiAyCgAlcyByZXNldCB3b3JrcyBpbiBncGljIGFuZCAxMHRoIGVkaXRpb24sIGJ1dCBpc24ndCBkZWZpbmVkIGluIERXQiAyCgBzZXR1cExhdGluMQoAXDAwMQoAJXMgICAgICAgIHRvbGVyYW5jZSAwLjAxCgAgICAgdG9sZXJhbmNlIDAuMQoAJSVQYWdlczogMQoAICAgICAgICBkaWZmdXNlQ29sb3IgMSAxIDEKADEwMC4wMAoAIEVQU0YtMy4wCgAlcyBib3hyYWQgaXMgbm93IDAuMCBpbiBncGljLCBlbHNlIGl0IHJlbWFpbnMgMi4wCgBzcGhlcmUgezwlOS4zZiwgJTkuM2YsICU5LjNmPiwgMS4wCgBXYXJuaW5nOiBubyB2YWx1ZSBmb3Igd2lkdGggb2YgQVNDSUkgY2hhcmFjdGVyICV1LiBGYWxsaW5nIGJhY2sgdG8gMAoAaW5zdGFsbF9pbl9yYW5rLCBsaW5lICVkOiAlcyAlcyByYW5rICVkIGkgPSAlZCBhbiA9IDAKAGNvbmNlbnRyYXRlPXRydWUgbWF5IG5vdCB3b3JrIGNvcnJlY3RseS4KAE5vIGxpYnogc3VwcG9ydC4KAHR3b3BpOiB1c2Ugb2Ygd2VpZ2h0PTAgY3JlYXRlcyBkaXNjb25uZWN0ZWQgY29tcG9uZW50LgoAdGhlIGdyYXBoIGludG8gY29ubmVjdGVkIGNvbXBvbmVudHMuCgBPcnRob2dvbmFsIGVkZ2VzIGRvIG5vdCBjdXJyZW50bHkgaGFuZGxlIGVkZ2UgbGFiZWxzLiBUcnkgdXNpbmcgeGxhYmVscy4KAG1pbmNyb3NzICVzOiAlbGxkIGNyb3NzaW5ncywgJS4yZiBzZWNzLgoAJXMgaXMgbm90IGEga25vd24gY29sb3IuCgBpcyBpbmFwcHJvcHJpYXRlLiBSZXZlcnRpbmcgdG8gdGhlIHNob3J0ZXN0IHBhdGggbW9kZWwuCgBpcyB1bmRlZmluZWQuIFJldmVydGluZyB0byB0aGUgc2hvcnRlc3QgcGF0aCBtb2RlbC4KAFVuYWJsZSB0byByZWNsYWltIGJveCBzcGFjZSBpbiBzcGxpbmUgcm91dGluZyBmb3IgZWRnZSAiJXMiIC0+ICIlcyIuIFNvbWV0aGluZyBpcyBwcm9iYWJseSBzZXJpb3VzbHkgd3JvbmcuCgBFcnJvciBkdXJpbmcgY29udmVyc2lvbiB0byAiVVRGLTgiLiBRdWl0aW5nLgoAb3JkZXJpbmcgJyVzJyBub3QgcmVjb2duaXplZC4KAGdyYWRpZW50IHBlbiBjb2xvcnMgbm90IHlldCBzdXBwb3J0ZWQuCgAgIGluaXRDTWFqVlBTQyBkb25lOiAlZCBnbG9iYWwgY29uc3RyYWludHMgZ2VuZXJhdGVkLgoAVGhlIGNoYXJhY3RlciAnJWMnIGFwcGVhcnMgaW4gYm90aCB0aGUgbGF5ZXJzZXAgYW5kIGxheWVybGlzdHNlcCBhdHRyaWJ1dGVzIC0gbGF5ZXJsaXN0c2VwIGlnbm9yZWQuCgB0aGUgYXNwZWN0IGF0dHJpYnV0ZSBoYXMgYmVlbiBkaXNhYmxlZCBkdWUgdG8gaW1wbGVtZW50YXRpb24gZmxhd3MgLSBhdHRyaWJ1dGUgaWdub3JlZC4KAFRoZSBsYXllcnNlbGVjdCBhdHRyaWJ1dGUgIiVzIiBkb2VzIG5vdCBtYXRjaCBhbnkgbGF5ZXIgc3BlY2lmZWQgYnkgdGhlIGxheWVycyBhdHRyaWJ1dGUgLSBpZ25vcmVkLgoAJXp1IG91dCBvZiAlenUgbGFiZWxzIHBvc2l0aW9uZWQuCgAlenUgb3V0IG9mICV6dSBleHRlcmlvciBsYWJlbHMgcG9zaXRpb25lZC4KACAgZ2VuZXJhdGUgZWRnZSBjb25zdHJhaW50cy4uLgoAR2VuZXJhdGluZyBOb24tb3ZlcmxhcCBDb25zdHJhaW50cy4uLgoAR2VuZXJhdGluZyBFZGdlIENvbnN0cmFpbnRzLi4uCgBHZW5lcmF0aW5nIERpRy1Db0xhIEVkZ2UgQ29uc3RyYWludHMuLi4KAFJlbW92aW5nIG92ZXJsYXBzIGFzIHBvc3Rwcm9jZXNzLi4uCgAuLi4gJS4qcyUuKnMgLi4uCgBFZGdlIGxlbmd0aCAlZiBsYXJnZXIgdGhhbiBtYXhpbXVtICVkIGFsbG93ZWQuCkNoZWNrIGZvciBvdmVyd2lkZSBub2RlKHMpLgoAb3JkZXJpbmcgJyVzJyBub3QgcmVjb2duaXplZCBmb3Igbm9kZSAnJXMnLgoAcG9seWdvbiB7ICV6dSwKAHNwaGVyZV9zd2VlcCB7CiAgICAlcwogICAgJXp1LAoAImRpcmVjdGVkIjogJXMsCgAid2lkdGgiOiAlLjAzZiwKACJzaXplIjogJS4wM2YsCgAidGFpbCI6ICVkLAoAIl9ndmlkIjogJWQsCgAicHQiOiBbJS4wM2YsJS4wM2ZdLAoAInAxIjogWyUuMDNmLCUuMDNmXSwKACJwMCI6IFslLjAzZiwlLjAzZl0sCgAicDEiOiBbJS4wM2YsJS4wM2YsJS4wM2ZdLAoAInAwIjogWyUuMDNmLCUuMDNmLCUuMDNmXSwKACJvcCI6ICJ0IiwKACJncmFkIjogImxpbmVhciIsCgAiZ3JhZCI6ICJyYWRpYWwiLAoAImdyYWQiOiAibm9uZSIsCgAJJXMgaWYgeW91IHVzZSBncGljIGFuZCBpdCBiYXJmcyBvbiBlbmNvdW50ZXJpbmcgInNvbGlkIiwKACJvcCI6ICIlYyIsCgAiYWxpZ24iOiAiJWMiLAoAIm9wIjogIlQiLAoAIm9wIjogIlMiLAoAIm9wIjogIkwiLAoAIm9wIjogIkYiLAoAZXhwYXQ6IEVudHJvcHk6ICVzIC0tPiAweCUwKmx4ICglbHUgYnl0ZXMpCgBzeW50YXggZXJyb3IgaW4gcG9zIGF0dHJpYnV0ZSBmb3IgZWRnZSAoJXMsJXMpCgBnZXRzcGxpbmVwb2ludHM6IG5vIHNwbGluZSBwb2ludHMgYXZhaWxhYmxlIGZvciBlZGdlICglcywlcykKAG1ha2VTcGxpbmU6IGZhaWxlZCB0byBtYWtlIHNwbGluZSBlZGdlICglcywlcykKACMgR2VuZXJhdGVkIGJ5ICVzIHZlcnNpb24gJXMgKCVzKQoAJSUlJUNyZWF0b3I6ICVzIHZlcnNpb24gJXMgKCVzKQoAJXMgQ3JlYXRvcjogJXMgdmVyc2lvbiAlcyAoJXMpCgBzZWdtZW50IFsoJS41ZywgJS41ZyksKCUuNWcsJS41ZyldIGRvZXMgbm90IGludGVyc2VjdCBib3ggbGw9KCUuNWcsJS41ZyksdXI9KCUuNWcsJS41ZykKACV6dSAoJS41ZywgJS41ZyksICglLjVnLCAlLjVnKQoAcGFjayB2YWx1ZSAlZCBpcyBzbWFsbGVyIHRoYW4gZXNlcCAoJS4wM2YsJS4wM2YpCgBzZXAgdmFsdWUgKCUuMDNmLCUuMDNmKSBpcyBzbWFsbGVyIHRoYW4gZXNlcCAoJS4wM2YsJS4wM2YpCgBzY2FsZSA9ICglLjAzZiwlLjAzZikKAHNlZyMlZCA6ICglLjNmLCAlLjNmKSAoJS4zZiwgJS4zZikKACV6dSBvYmpzICV6dSB4bGFiZWxzIGZvcmNlPSVkIGJiPSglLjAyZiwlLjAyZikgKCUuMDJmLCUuMDJmKQoAY2MgKCVkIGNlbGxzKSBhdCAoJS4wZiwlLjBmKQoAY2MgKCVkIGNlbGxzKSBhdCAoJWQsJWQpICglLjBmLCUuMGYpCgBjaGFubmVsICUuMGYgKCVmLCVmKQoARWRnZSBzZXBhcmF0aW9uOiBhZGQ9JWQgKCVmLCVmKQoATm9kZSBzZXBhcmF0aW9uOiBhZGQ9JWQgKCVmLCVmKQoAcm9vdCAlZCAoJWYpICVkICglZikKACVmIC0gJWYgJWYgJWYgJWYgPSAlZiAoJWYgJWYgJWYgJWYpCgAlJUJvdW5kaW5nQm94OiAoYXRlbmQpCgAlJVBhZ2VzOiAoYXRlbmQpCgBleHBhdDogRW50aXRpZXMoJXApOiBDb3VudCAlOXUsIGRlcHRoICUydS8lMnUgJSpzJXMlczsgJXMgbGVuZ3RoICVkICh4bWxwYXJzZS5jOiVkKQoAY2FudmFzIHNpemUgKCVkLCVkKSBleGNlZWRzIFBERiBsaW1pdCAoJWQpCgkoc3VnZ2VzdCBzZXR0aW5nIGEgYm91bmRpbmcgYm94IHNpemUsIHNlZSBkb3QoMSkpCgBlcnJvciBpbiBjb2xvcnhsYXRlKCkKAHRydW5jYXRpbmcgc3R5bGUgJyVzJwoASWxsZWdhbCB2YWx1ZSBpbiAiJXMiIGNvbG9yIGF0dHJpYnV0ZTsgZmxvYXQgZXhwZWN0ZWQgYWZ0ZXIgJzsnCgBkZWZpbmUgYXR0cnMwICUlICUlOyBkZWZpbmUgdW5maWxsZWQgJSUgJSU7IGRlZmluZSByb3VuZGVkICUlICUlOyBkZWZpbmUgZGlhZ29uYWxzICUlICUlCgA8c3ZnIHdpZHRoPSIlZHB0IiBoZWlnaHQ9IiVkcHQiCgAjIGRlcGVuZGVuY2llcyAiJS4qcyIgZGlkIG5vdCBtYXRjaCAiJS4qcyIKACMgdHlwZSAiJS4qcyIgZGlkIG5vdCBtYXRjaCAiJS4qcyIKACRjIGNyZWF0ZSBpbWFnZSAlLjJmICUuMmYgLWltYWdlICJwaG90b18lcyIKAE5vIG9yIGltcHJvcGVyIGltYWdlIGZpbGU9IiVzIgoAZmlsZSBsb2FkaW5nIGlzIGRpc2FibGVkIGJlY2F1c2UgdGhlIGVudmlyb25tZW50IGNvbnRhaW5zIFNFUlZFUl9OQU1FPSIlcyIKAENvdWxkIG5vdCBwYXJzZSB4ZG90ICIlcyIKAE5vIGxvYWRpbWFnZSBwbHVnaW4gZm9yICIlcyIKACBbJXp1XSAoJS4wMmYsJS4wMmYpICglLjAyZiwlLjAyZikgJXAgIiVzIgoAZm9udG5hbWU6IHVuYWJsZSB0byByZXNvbHZlICIlcyIKAER1cGxpY2F0ZSBjbHVzdGVyIG5hbWUgIiVzIgoAdW5yZWNvZ25pemVkIGFwaSBuYW1lICIlcyIKAGltYWdlIGNyZWF0ZSBwaG90byAicGhvdG9fJXMiIC1maWxlICIlcyIKAE5vIG9yIGltcHJvcGVyIHNoYXBlZmlsZT0iJXMiIGZvciBub2RlICIlcyIKAE5vIG9yIGltcHJvcGVyIGltYWdlPSIlcyIgZm9yIG5vZGUgIiVzIgoAbm9kZSAiJXMiIGlzIGNvbnRhaW5lZCBpbiB0d28gbm9uLWNvbXBhcmFibGUgY2x1c3RlcnMgIiVzIiBhbmQgIiVzIgoARXJyb3I6IG5vZGUgIiVzIiBiZWxvbmdzIHRvIHR3byBub24tbmVzdGVkIGNsdXN0ZXJzICIlcyIgYW5kICIlcyIKACAgIiVzIgoAI2luY2x1ZGUgImNvbG9ycy5pbmMiCiNpbmNsdWRlICJ0ZXh0dXJlcy5pbmMiCiNpbmNsdWRlICJzaGFwZXMuaW5jIgoAVW5rbm93biBIVE1MIGVsZW1lbnQgPCVzPiBvbiBsaW5lICVsdSAKACVzIGluIGxpbmUgJWx1IAoAc2NhbGUgYnkgJWcsJWcgCgBjb21wcmVzcyAlZyAKAExheW91dCB3YXMgbm90IGRvbmUuICBNaXNzaW5nIGxheW91dCBwbHVnaW5zPyAKAIlQTkcNChoKACUlIVBTLUFkb2JlLTIuMAolJSUlQm91bmRpbmdCb3g6IChhdGVuZCkKL3BvaW50IHsKICAvWSBleGNoIGRlZgogIC9YIGV4Y2ggZGVmCiAgbmV3cGF0aAogIFggWSAzIDAgMzYwIGFyYyBmaWxsCn0gZGVmCi9jZWxsIHsKICAvWSBleGNoIGRlZgogIC9YIGV4Y2ggZGVmCiAgL3kgZXhjaCBkZWYKICAveCBleGNoIGRlZgogIG5ld3BhdGgKICB4IHkgbW92ZXRvCiAgeCBZIGxpbmV0bwogIFggWSBsaW5ldG8KICBYIHkgbGluZXRvCiAgY2xvc2VwYXRoIHN0cm9rZQp9IGRlZgovbm9kZSB7CiAvdSBleGNoIGRlZgogL3IgZXhjaCBkZWYKIC9kIGV4Y2ggZGVmCiAvbCBleGNoIGRlZgogbmV3cGF0aCBsIGQgbW92ZXRvCiByIGQgbGluZXRvIHIgdSBsaW5ldG8gbCB1IGxpbmV0bwogY2xvc2VwYXRoIGZpbGwKfSBkZWYKCgAJAEHxigULtgMBAQEBAQEBAQIDAQECAQEBAQEBAQEBAQEBAQEBAQEBAgEEBQEBAQEBAQYBAQcICQoKCgoKCgoKCgoBAQsBDAENDg8QERITFBUWExMTExcYGRMaGxwdExMTExMBHgEBEwEfICEiIxMkJSYTExMTJygpEyorLC0TExMTEwEBAQEBExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMuExMTLxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTMBMTExMTExMTExMTExMTExMAAAAAAAAEAAQAHAAcACEAIQAkACIACgACABYACQAiACIAIgAVAB0AAQAUABQAFAAUABQAFAAUAAgABAAFABwAGwAXABwAIQAgAB8AHgAJABMAAAAVABIAFQADAAcAFQAVABQAFAAUABQAFAAUABQAFAAIAAQABQAFAAYAHAAaABgAGQAhAAcAFQAUABQAFAAUABQAFAALABQADQAUAAwAFAAUABQADgAUABQAFAAQABQADwAUABEAQbKOBQuVBAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAMABAAHAAMABAAFAAUABgAGAAgABwAHABEAFgASABEAEgAIAAgADwAPABcADwAYAA8AGQAaABoAHgAWADQAHgAFADIABgAiACIAMwAXABgANQAZABoAGgAqADYAKgA0ADcAMgBFADsAPAAzADsAPABGADUARwBIAEwANgAiAEkASgA3AEUATgBQAGIAUQBSAFQARgBHAFUASABMAFYASQBKAFgAWgBOAEQAUABRAFIAVAA4AC8ALABVACkAVgAbABAAWABaAF0AXQBdAF0AXQBdAF0AXgBeAF4AXgBeAF4AXgBfAF8AXwBfAF8AXwBfAGAACQBgAGAAYABgAGAAYQBhAGMAAgBjAGMAYwBjAGMAZAAAAGQAAABkAGQAZABlAAAAZQBlAGUAZQBlAGYAAAAAAGYAZgBmAGYAZwAAAGcAZwBnAGcAaAAAAGgAaABoAGgAaABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAEHUkgULzQGuAC4ALwAzADUAMAA3AKoA2wDbANsA2wAAAD0AhwA3ADcA2wDbAAAAKAA1AC4AMgAvAGIAAAAAAEcAAADbANsAUQAAANsA2wDbAAAA2wCEAFUA2wCCANsAAACBANsAAAA+AEIAQQBIAEQAUgBbAAAAAABeAF8A2wAAANsA2wDbAAAAAAB7AEkAVwBSAFoAWgBdAAAAXwAAAF8AAABlAF0AXwAAAF0AbgBqAAAAaQAAAG4AAADbAJMAmgChAKgAqwBwALEAuAC/AMYAzQDTAEGylAULzwFcAAEAXQBdAF4AXgBfAF8AXABcAFwAXABcAGAAXABcAFwAYQBcAFwAYgBiAGIAYgBiAGIAYgBjAGQAZQBmAFwAXABcAGcAXABcAFwAYABcAFwAYQBcAGEAXABoAGEAXABiAGIAYgBiAGIAYgBiAGIAYwBkAGUAZQBcAGYAXABcAFwAZwBoAGEAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAAAAXABcAFwAXABcAFwAXABcAFwAXABcAFwAQZGWBQswAQECAwEEAQUBBgcHAQYGBgYGBgYGBgYGBgYGBgYDBgYGBgYGBgYGBgYGBgYGBgYGAEHSlgULowQKAAsADAANAA4ACgAPABAAEQASABMACgAUABUAFQAVABYAFwAVABgAFQAVABkAFQAVABUAGgAVABUACgAVABUAFQAWABcAGAAVABUAGQAVABUAFQAaABUAFQAVABUAGwAMAAwAJAAeAB4AIAAhACAAIQAkACUAJgAtADIALwAuACoAJQAmACgAKQAzACoANAArADUANgA3ADwAMgBHAD0AIgBFACIAPwBAAEYAMwA0AEgANQA2ADcALwBJACoARwBKAEUATABcADwARgBcAD0ATQBIAE4ATwBSAEkAQQBQAFEASgBMAFMAVAAxAFUAVgBXAE0ATgBYAE8AUgBZAFAAUQBaAFsAUwBEAFQAVQBWAFcASwBEACwAWAAsAFkAOAAsAFoAWwAdAB0AHQAdAB0AHQAdAB8AHwAfAB8AHwAfAB8AIwAjACMAIwAjACMAIwAnAFwAJwAnACcAJwAnADAAMAA5ABwAOQA5ADkAOQA5ADoAXAA6AFwAOgA6ADoAOwBcADsAOwA7ADsAOwA+AFwAXAA+AD4APgA+AEIAXABCAEIAQgBCAEMAXABDAEMAQwBDAEMACQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAMAAAADQAAAA4AAAAOAEGAmwUL0QUR7u4TCAPu/u7u7gHu7u4B7u4J/u4SFRfuEgHu7u7uCg3u7u7u7u7u7u4B7u4WCAEBGQ4Y7u4bGBru7h3u7u7uARX77u7u7hAe7u7uAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWEQICAgICAgICAgICAgISEAITAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIUAhUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg4CDwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBAgMEBQYHCAkKCwwNAAAACwMEBQ8HAwwNBgwNDgwNGhUAAQADBw4GDwgMDRITCSoQERAWLzANMhETLjIUEhQSQRMsE0JAKkIZ//8sAAAAACIMDQ4jDwkQEQoQEcwQES1F/AEG9g8H9iQCEBEvMCg2SUomMTs8PTYqOTo+Py/YQEQwNyVHQzVIKwAAOAAAAAAAAwkAAAABDgILDAgjJCUzODoADRASGxYcEicvIhcwHjkGBzIFDxEUGCkAEykAAAAAADQVKB0eACEmMR8uOxksABsAIBoqKzcANTYtAAAAAAACAgEAAwMBAAEAAQEBAAIBAQACAgMBAQAABQABAwEDBQMBAQEBAgABAAQCAAIDAQADAgEAAQEAAQEBAwAAAAAAFxgYGBkaGxscHB0dHh4fHyAgISEiIyMlJiQkJycoKCgpKSoqKisrLCwtLi4vMDEzMjQ0NDU1NTY2NzcAAAAA7u787u7u7u7uHyDu+e/u7u4M7u7uBg/u7vLu7u7u7vXuAEHhoAULLwMIBCEFCxITJxQVFikyQRcYGRosMzRCRhscHS4eSx8ga2V5AF9BR19zdHJkYXRhAEGgoQULFe0fAAC/DAAAowwAAGhUAAB7UgAABgBBwKEFC+PrAc7GAABVXcl/yX//ALS3AAC7LdS+rtT/AKypAAAUd/39wIb/AG7FAABVXcl/yX//AFS2AAC7LdS+rtT/AEyoAAAUd/39wIb/ALCbAAAqZv///5n/AA7EAABVXcl/yX//APS0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AAAYX/391J7/ALKVAAATef39u4T/AH6KAAANpPz8jVn/AFuDAAAHsu/vZUj/AKB9AAAD2tfXMB//ADt5AAAA/7OzAAD/ACp2AAAA/39/AAD/ANLIAACOROOmzuP/AA7NAAC+mZpqPZr/ALi5AACQ07QfeLT/ALCrAABBYd+y34r/ALSdAABSuKAzoCz/ACCRAAAAY/v7mpn/AJ2IAAD+4ePjGhz/AIKBAAAXj/39v2//AL17AAAV////fwD/AEx3AADGKtbKstb/AFrIAACOROOmzuP/AIvMAAC+mZpqPZr/ADq+AAAqZv///5n/AEC5AACQ07QfeLT/ADirAABBYd+y34r/ADydAABSuKAzoCz/AKiQAAAAY/v7mpn/ACWIAAD+4ePjGhz/AAqBAAAXj/39v2//AEV7AAAV////fwD/ANR2AADGKtbKstb/AOLHAACOROOmzuP/AAjMAAC+mZpqPZr/ALe9AAAqZv///5n/ADqvAAAPxbGxWSj/AMi4AACQ07QfeLT/AMCqAABBYd+y34r/AMScAABSuKAzoCz/ADCQAAAAY/v7mpn/AK2HAAD+4ePjGhz/AJKAAAAXj/39v2//AM16AAAV////fwD/AFx2AADGKtbKstb/AJrHAACOROOmzuP/AIC4AACQ07QfeLT/AHiqAABBYd+y34r/ADrGAACOROOmzuP/ACC3AACQ07QfeLT/ABipAABBYd+y34r/AHycAABSuKAzoCz/ANrEAACOROOmzuP/AMC1AACQ07QfeLT/ALinAABBYd+y34r/ABybAABSuKAzoCz/AOiPAAAAY/v7mpn/AHrDAACOROOmzuP/AGC0AACQ07QfeLT/AFimAABBYd+y34r/ALyZAABSuKAzoCz/AIiOAAAAY/v7mpn/AGWHAAD+4ePjGhz/ABrCAACOROOmzuP/AACzAACQ07QfeLT/APikAABBYd+y34r/AFyYAABSuKAzoCz/ACiNAAAAY/v7mpn/AAWGAAD+4ePjGhz/AEqAAAAXj/39v2//ALrAAACOROOmzuP/AKCxAACQ07QfeLT/AJijAABBYd+y34r/APyWAABSuKAzoCz/AMiLAAAAY/v7mpn/AKWEAAD+4ePjGhz/AOp+AAAXj/39v2//AIV6AAAV////fwD/AHm/AACOROOmzuP/AF+wAACQ07QfeLT/AFei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AADSFejn1Oj/AGWIAABMHvDZ8NP/AEqBAABQRNum26D/AIV7AABYe65armH/ABR3AABhxXgbeDf/ACLIAADO/0tAAEv/AE7MAABhxXgbeDf/AP29AABl/0QARBv/AAi5AADOrYN2KoP/AACrAADHV6uZcKv/AASdAADHM8/Cpc//AHCQAADSFejn1Oj/AO2HAAAAAPf39/f/ANKAAABMHvDZ8NP/AA17AABQRNum26D/AJx2AABYe65armH/AEHHAADERsOvjcP/ACe4AAAAAPf39/f/AB+qAABSWr9/v3v/AOHFAADJqJR7MpT/AMe2AADHM8/Cpc//AL+oAABQRNum26D/ACOcAABm/4gAiDf/AIHEAADJqJR7MpT/AGe1AADHM8/Cpc//AF+nAAAAAPf39/f/AMOaAABQRNum26D/AI+PAABm/4gAiDf/ACHDAADOrYN2KoP/AAe0AADERsOvjcP/AP+lAADSFejn1Oj/AGOZAABMHvDZ8NP/AC+OAABSWr9/v3v/AAyHAABhxXgbeDf/AMHBAADOrYN2KoP/AKeyAADERsOvjcP/AJ+kAADSFejn1Oj/AAOYAAAAAPf39/f/AM+MAABMHvDZ8NP/AKyFAABSWr9/v3v/APF/AABhxXgbeDf/AGHAAADOrYN2KoP/AEexAADHV6uZcKv/AD+jAADHM8/Cpc//AKOWAADSFejn1Oj/AG+LAABMHvDZ8NP/AEyEAABQRNum26D/AJF+AABYe65armH/ACx6AABhxXgbeDf/ACC/AADOrYN2KoP/AAawAADHV6uZcKv/AP6hAADHM8/Cpc//AGKVAADSFejn1Oj/AC6KAAAAAPf39/f/AAuDAABMHvDZ8NP/AFB9AABQRNum26D/AOt4AABYe65armH/ANp1AABhxXgbeDf/AJ3GAAC9C/Ls5/L/AIO3AACXPdumvdv/AHupAACNxb4rjL7/AD3FAAC5CPbx7vb/ACO2AACbKOG9yeH/ABuoAACRcM90qc//AH+bAACP97AFcLD/AN3DAAC5CPbx7vb/AMO0AACbKOG9yeH/ALumAACRcM90qc//AB+aAACNxb4rjL7/AOuOAACP940EWo3/AH3CAAC5CPbx7vb/AGOzAACoGObQ0eb/AFulAACXPdumvdv/AL+YAACRcM90qc//AIuNAACNxb4rjL7/AGiG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AAALm/z8jWL/AMynAACcTcuNoMv/ADCbAADkZufnisP/APyPAAA6m9im2FT/AI7DAAByeMJmwqX/AHS0AAALm/z8jWL/AGymAACcTcuNoMv/ANCZAADkZufnisP/AJyOAAA6m9im2FT/AHmHAAAi0P//2S//AC7CAAByeMJmwqX/ABSzAAALm/z8jWL/AAylAACcTcuNoMv/AHCYAADkZufnisP/ADyNAAA6m9im2FT/ABmGAAAi0P//2S//AF6AAAAZWuXlxJT/AM7AAAByeMJmwqX/ALSxAAALm/z8jWL/AKyjAACcTcuNoMv/ABCXAADkZufnisP/ANyLAAA6m9im2FT/ALmEAAAi0P//2S//AP5+AAAZWuXlxJT/AJl6AAAAALOzs7P/AN7IAAB4VNON08f/ABvNAADTUr28gL3/AMS5AAAqTP///7P/ALyrAACvJdq+utr/AMCdAAAEi/v7gHL/ACyRAACQZNOAsdP/AKmIAAAWnP39tGL/AI6BAAA6ht6z3mn/AMl7AADpL/z8zeX/AFh3AAAAANnZ2dn/AGbIAAB4VNON08f/AJjMAADTUr28gL3/AEe+AABNKevM68X/AEy5AAAqTP///7P/AESrAACvJdq+utr/AEidAAAEi/v7gHL/ALSQAACQZNOAsdP/ADGIAAAWnP39tGL/ABaBAAA6ht6z3mn/AFF7AADpL/z8zeX/AOB2AAAAANnZ2dn/AO7HAAB4VNON08f/ABXMAADTUr28gL3/AMS9AABNKevM68X/AEevAAAlkP//7W//ANS4AAAqTP///7P/AMyqAACvJdq+utr/ANCcAAAEi/v7gHL/ADyQAACQZNOAsdP/ALmHAAAWnP39tGL/AJ6AAAA6ht6z3mn/ANl6AADpL/z8zeX/AGh2AAAAANnZ2dn/AKXHAAB4VNON08f/AIu4AAAqTP///7P/AIOqAACvJdq+utr/AEXGAAB4VNON08f/ACu3AAAqTP///7P/ACOpAACvJdq+utr/AIecAAAEi/v7gHL/AOXEAAB4VNON08f/AMu1AAAqTP///7P/AMOnAACvJdq+utr/ACebAAAEi/v7gHL/APOPAACQZNOAsdP/AIXDAAB4VNON08f/AGu0AAAqTP///7P/AGOmAACvJdq+utr/AMeZAAAEi/v7gHL/AJOOAACQZNOAsdP/AHCHAAAWnP39tGL/ACXCAAB4VNON08f/AAuzAAAqTP///7P/AAOlAACvJdq+utr/AGeYAAAEi/v7gHL/ADONAACQZNOAsdP/ABCGAAAWnP39tGL/AFWAAAA6ht6z3mn/AMXAAAB4VNON08f/AKuxAAAqTP///7P/AKOjAACvJdq+utr/AAeXAAAEi/v7gHL/ANOLAACQZNOAsdP/ALCEAAAWnP39tGL/APV+AAA6ht6z3mn/AJB6AADpL/z8zeX/AIS/AAB4VNON08f/AGqwAAAqTP///7P/AGKiAACvJdq+utr/AMaVAAAEi/v7gHL/AJKKAACQZNOAsdP/AG+DAAAWnP39tGL/ALR9AAA6ht6z3mn/AE95AADpL/z8zeX/AD52AAAAANnZ2dn/ALDIAADt/Z6eAUL/AOnMAACxgqJeT6L/AJa5AAD6tNXVPk//AI6rAAAKuPT0bUP/AJKdAAAUnf39rmH/AP6QAAAfc/7+4Iv/AHuIAAAxYPXm9Zj/AGCBAABPQd2r3aT/AJt7AAByeMJmwqX/ACp3AACPu70yiL3/ADjIAADt/Z6eAUL/AGbMAACPu70yiL3/ABW+AACxgqJeT6L/AB65AAD6tNXVPk//ABarAAAKuPT0bUP/ABqdAAAUnf39rmH/AIaQAAAfc/7+4Iv/AAOIAAAqQP///7//AOiAAAAxYPXm9Zj/ACN7AABPQd2r3aT/ALJ2AAByeMJmwqX/AF7HAAANpPz8jVn/AES4AAAqQP///7//ADyqAABRTdWZ1ZT/AP7FAAD+4dfXGRz/AOS2AAAUnf39rmH/ANyoAABPQd2r3aT/AECcAACPxLorg7r/AJ7EAAD+4dfXGRz/AIS1AAAUnf39rmH/AHynAAAqQP///7//AOCaAABPQd2r3aT/AKyPAACPxLorg7r/AD7DAAD6tNXVPk//ACS0AAANpPz8jVn/ABymAAAfc/7+4Iv/AICZAAAxYPXm9Zj/AEyOAABRTdWZ1ZT/ACmHAACPu70yiL3/AN7BAAD6tNXVPk//AMSyAAANpPz8jVn/ALykAAAfc/7+4Iv/ACCYAAAqQP///7//AOyMAAAxYPXm9Zj/AMmFAABRTdWZ1ZT/AA6AAACPu70yiL3/AH7AAAD6tNXVPk//AGSxAAAKuPT0bUP/AFyjAAAUnf39rmH/AMCWAAAfc/7+4Iv/AIyLAAAxYPXm9Zj/AGmEAABPQd2r3aT/AK5+AAByeMJmwqX/AEl6AACPu70yiL3/AD2/AAD6tNXVPk//ACOwAAAKuPT0bUP/ABuiAAAUnf39rmH/AH+VAAAfc/7+4Iv/AEuKAAAqQP///7//ACiDAAAxYPXm9Zj/AG19AABPQd2r3aT/AAh5AAByeMJmwqX/APd1AACPu70yiL3/AFFLAACTD//w+P//ALVMAAAYI/r669f/ALVkAAB///8A////ACVPAABxgP9//9T/AE1OAAB/D//w////APFRAAAqGvX19dz/ADhJAAAXOv//5MT/AGs9AAAAAAAAAAD/AKlVAAAZMf//683/AGBLAACq//8AAP//AIURAADAzuKKK+L/AOYyAAAAvqWlKir/ACNVAAAXY97euIf/AGZKAACAZ6BfnqD/AFlNAAA///9//wD/ADZNAAAR2tLSaR7/AGU7AAALr///f1D/AHVKAACak+1kle3/ABY9AAAhIv//+Nz/ADQzAAD259zcFDz/AH03AAB///8A////APRKAACq/4sAAIv/AG83AAB//4sAi4v/AO5UAAAe77i4hgv/AG8IAAAAAKmpqan/AI02AABV/2QAZAD/AKQHAAAAAKmpqan/AH8+AAAnbr29t2v/AMlkAADU/4uLAIv/AMQ2AAA6jmtVay//ANVRAAAX////jAD/AIdXAADGwMyZMsz/AFZZAAAA/4uLAAD/ALQzAAAKeenplnr/ACY3AABVPbyPvI//AC9LAACvj4tIPYv/AJEIAAB/Z08vT0//AMYHAAB/Z08vT0//ABJOAACA/9EAztH/AHURAADH/9OUANP/ALY8AADo6///FJP/ABdKAACK//8Av///AGIIAAAAAGlpaWn/AJcHAAAAAGlpaWn/AIlKAACU4f8ekP//AE89AAAAzrKyIiL/AKRMAAAcD///+vD/AFA2AABVwIsiiyL/AI5lAADU////AP//ANwxAAAAANzc3Nz/AINMAACqB//4+P//AMxWAAAj////1wD/ABRVAAAe2drapSD/AMMIAAAAAICAgID/AE83AABV/4AAgAD/AJYKAAA70P+t/y//APgHAAAAAICAgID/AJ8LAABVD//w//D/AJo8AADplv//abT/AEdZAAAAjM3NXFz/ADoyAADC/4JLAIL/AH4GAAAqD/////D/AI4+AAAmavDw5oz/AN8fAACqFPrm5vr/AM0/AADwD///8PX/AH42AABA//x8/AD/AAI1AAAmMf//+s3/AFdKAACJP+at2Ob/AFU7AAAAd/DwgID/AGA3AAB/H//g////AKcKAAAqKPr6+tL/AFMIAAAAANPT09P/AGE2AABVZO6Q7pD/AIgHAAAAANPT09P/AKc8AAD4Sf//tsH/AKMzAAAMhP//oHr/AP82AAB90bIgsqr/AAVKAACPdfqHzvr/AH0IAACUOJl3iJn/ALIHAACUOJl3iJn/AMJKAACXNN6wxN7/AIUKAAAqH////+D/AK1PAABV//8A/wD/ANg2AABVwM0yzTL/APo1AAAVFPr68Ob/ANpkAADU////AP//AJczAAAA/4CAAAD/AA9PAABxgM1mzar/ALJKAACq/80AAM3/AHVXAADMmNO6VdP/AHVQAAC3fNuTcNv/ABI3AABnqbM8s3H/ABpLAACwj+57aO7/AJw2AABv//oA+pr/AP1NAAB9p9FI0cz/ALJYAADk5MfHFYX/AEVKAACqxnAZGXD/AF85AABqCf/1//r/AJdNAAAEHv//5OH/ACo1AAAaSf//5LX/AJNMAAAZUf//3q3/AIwEAACq/4AAAID/AHlUAAAbF/399eb/AOJIAAAq/4CAgAD/AJ9kAAA4wI5rjiP/AOVRAAAb////pQD/AKlZAAAL////RQD/AJdXAADWe9racNb/AAFVAAAmSO7u6Kr/AOc2AABVZPuY+5j/ACVOAAB/Q+6v7u7/AMdYAADxfNvbcJP/ADAwAAAaKf//79X/AGNGAAAURv//2rn/ABgMAAAUsM3NhT//AM08AAD3P///wMv/ANk4AADURt3doN3/AJlKAACEO+aw4Ob/ANFQAADU/4CAAID/APNZAAAA////AAD/AKgyAAAAPby8j4//AOVKAACfteFBaeH/ANUyAAAR3IuLRRP/AMQzAAAEivr6gHL/ALcyAAATmvT0pGD/ADg3AABnqosui1f/ABg6AAAREP//9e7/AFRlAAANt6CgUi3/ALMeAAAAAMDAwMD/AChKAACLbOuHzuv/AEJLAACvj81qWs3/AKQIAACUOJBwgJD/ANkHAACUOJBwgJD/AFoKAAAABf//+vr/ALM2AABq//8A/3//ANZKAACSm7RGgrT/AJY3AAAYVNLStIz/APA7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AAA///9//wD/AKGtAAA//+527gD/ALifAAA//81mzQD/AAeTAAA//4tFiwD/ADtNAAAR2tLSaR7/AAm8AAAR2///fyT/AJatAAAR2+7udiH/AK2fAAAR2s3NZh3/APySAAAR3IuLRRP/AGo7AAALr///f1D/ABO7AAAHqf//clb/AK2sAAAGqe7ualD/AMyeAAAGqc3NW0X/ABuSAAAGqIuLPi//AHpKAACak+1kle3/ABs9AAAhIv//+Nz/ADi7AAAhIv//+Nz/ANKsAAAiI+7u6M3/APGeAAAiIs3NyLH/AECSAAAjIouLiHj/ADkzAAD259zcFDz/AII3AAB///8A////APi6AAB///8A////AJKsAAB//+4A7u7/ALGeAAB//80Azc3/AACSAAB//4sAi4v/APlKAACq/4sAAIv/AHQ3AAB//4sAi4v/APNUAAAe77i4hgv/AJG8AAAe8P//uQ//AA2uAAAe8O7urQ7/ACSgAAAe8M3NlQz/AHqTAAAe8IuLZQj/AHQIAAAAAKmpqan/AJI2AABV/2QAZAD/AKkHAAAAAKmpqan/AIQ+AAAnbr29t2v/AM5kAADU/4uLAIv/AMk2AAA6jmtVay//AMq6AAA6j//K/3D/AGSsAAA6j+687mj/AIOeAAA6j82izVr/ANKRAAA6j4tuiz3/ANpRAAAX////jAD/AGS8AAAV////fwD/APGtAAAV/+7udgD/AAigAAAV/83NZgD/AF6TAAAV/4uLRQD/AIxXAADGwMyZMsz/AL+8AADGwf+/Pv//ADuuAADGwO6yOu7/AFKgAADGwM2aMs3/AKiTAADGwItoIov/AFtZAAAA/4uLAAD/ALkzAAAKeenplnr/ACs3AABVPbyPvI//AOW6AABVPv/B/8H/AH+sAABVPu607rT/AJ6eAABVPs2bzZv/AO2RAABVPotpi2n/ADRLAACvj4tIPYv/AJYIAAB/Z08vT0//AC66AAB/aP+X////ANOrAAB/Z+6N7u7/AASeAAB/aM15zc3/AFiRAAB/aItSi4v/AMsHAAB/Z08vT0//ABdOAACA/9EAztH/AHoRAADH/9OUANP/ALs8AADo6///FJP/AC67AADo6///FJP/AMisAADo6+7uEon/AOeeAADo683NEHb/ADaSAADn7IuLClD/ABxKAACK//8Av///AJm7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AACfts06X83/AMuSAACft4snQIv/ANoyAAAR3IuLRRP/AMkzAAAEivr6gHL/AJi6AAAJlv//jGn/AEGsAAAJlu7ugmL/AGCeAAAJls3NcFT/AK+RAAAJlouLTDn/ALwyAAATmvT0pGD/AD03AABnqosui1f/AOm6AABnq/9U/5//AIOsAABnq+5O7pT/AKKeAABnq81DzYD/APGRAABnqosui1f/AB06AAAREP//9e7/AAm7AAAREP//9e7/AKOsAAASEe7u5d7/AMKeAAASEc3Nxb//ABGSAAASEIuLhoL/AFllAAANt6CgUi3/AAS9AAANuP//gkf/AICuAAANuO7ueUL/AJegAAANuM3NaDn/AO2TAAANuYuLRyb/ALgeAAAAAMDAwMD/AC1KAACLbOuHzuv/AJ27AACQeP+Hzv//ACqtAACQeO5+wO7/AEGfAACQeM1sps3/AJCSAACRd4tKcIv/AEdLAACvj81qWs3/AOO7AACvkP+Db///AHCtAACvkO56Z+7/AIefAACvkM1pWc3/ANaSAACvkItHPIv/AKkIAACUOJBwgJD/ADK6AACVOP/G4v//ANerAACVOO650+7/AAieAACUOc2fts3/AFyRAACVOItse4v/AN4HAACUOJBwgJD/AF8KAAAABf//+vr/AEG6AAAABf//+vr/AOarAAAABe7u6en/ABeeAAAABM3Nycn/AGuRAAAAA4uLiYn/ALg2AABq//8A/3//AL26AABq//8A/3//AFesAABq/+4A7nb/AHaeAABq/80AzWb/AMWRAABq/4sAi0X/ANtKAACSm7RGgrT/AM27AACSnP9juP//AFqtAACSnO5crO7/AHGfAACSnM1PlM3/AMCSAACTm4s2ZIv/AJs3AAAYVNLStIz/AP66AAAUsP//pU//AJisAAAUsO7umkn/ALeeAAAUsM3NhT//AAaSAAAUsIuLWiv/APU7AAB//4AAgID/AGdQAADUHdjYv9j/AE28AADUHv//4f//ANqtAADUHu7u0u7/APGfAADUHc3Ntc3/AEeTAADUHYuLe4v/AMoxAAAGuP//Y0f/AHi6AAAGuP//Y0f/ACGsAAAGuO7uXEL/AECeAAAGuM3NTzn/AI+RAAAGuYuLNib/ACMQAAAqAP////4AAD1OAAB7tuBA4ND/AC+8AACB//8A9f//ALytAACB/+4A5e7/ANOfAACB/80Axc3/ACKTAACB/4sAhov/AJoRAADUc+7ugu7/ANBYAADj19DQIJD/AM+8AADrwf//Ppb/AEuuAADrwO7uOoz/AGKgAADrwM3NMnj/ALiTAADrwIuLIlL/ALMIAAAAAICAgID/APY2AABV/4AAgAD/AOgHAAAAAICAgID/AIMzAAAA/4CAAAD/AJJQAADU/4CAAID/AHIUAAAbRPX13rP/AGe6AAAbRf//57r/ABCsAAAbRO7u2K7/ADSeAAAbRM3Nupb/AIiRAAAbQ4uLfmb/AMxMAAAAAP//////ALtRAAAAAPX19fX/ALsIAAAAAL6+vr7/AEY3AABV//8A/wD/APAHAAAAAL6+vr7/AI0zAADvubCwMGD/AMdQAADE3fCgIPD/AMYKAAAq/////wD/AEy6AAAq/////wD/APGrAAAq/+7u7gD/ACKeAAAq/83NzQD/AHaRAAAq/4uLiwD/ADI2AAA4wM2azTL/AEGwjQcLA7R7AgBBvo0HC4UIoED/////////////////////////////////////////////////////////////////////////////////////AAKqAkQDAAQABKoGOQZxAaoCqgIABIMEAAKqAgACOQIABAAEAAQABAAEAAQABAAEAAQABDkCOQKDBIMEgwSNA14HxwVWBVYFxwXjBHMExwXHBaoCHQPHBeMEHQfHBccFcwTHBVYFcwTjBMcFxwWNB8cFxwXjBKoCOQKqAsEDAASqAo0DAASNAwAEjQOqAgAEAAQ5AjkCAAQ5AjkGAAQABAAEAASqAh0DOQIABAAExwUABAAEjQPXA5oB1wNUBP///////////////////////////////////////////////////////////////////////////////////////wACqgJxBAAEAAQACKoGOQKqAqoCAASPBAACqgIAAjkCAAQABAAEAAQABAAEAAQABAAEAASqAqoCjwSPBI8EAARxB8cFVgXHBccFVgXjBDkGOQYdAwAEOQZWBY0HxwU5BuMEOQbHBXMEVgXHBccFAAjHBccFVgWqAjkCqgKmBAAEqgIABHMEjQNzBI0DqgIABHMEOQKqAnMEOQKqBnMEAARzBHMEjQMdA6oCcwQABMcFAAQABI0DJwPDAScDKQT///////////////////////////////////////////////////////////////////////////////////////8AAqoCXAMABAAEqgY5BrYBqgKqAgAEZgUAAqoCAAI5AgAEAAQABAAEAAQABAAEAAQABAAEqgKqAmYFZgVmBQAEXAfjBOMEVgXHBeME4wTHBccFqgKNA1YFcwSqBlYFxwXjBMcF4wQABHMExwXjBKoG4wRzBHMEHQM5Ah0DYAMABKoCAAQABI0DAASNAzkCAAQABDkCOQKNAzkCxwUABAAEAAQABB0DHQM5AgAEjQNWBY0DjQMdAzMDMwIzA1QE////////////////////////////////////////////////////////////////////////////////////////AAIdA3EEAAQABKoGOQY5AqoCqgIABI8EAAKqAgACOQIABAAEAAQABAAEAAQABAAEAAQABKoCqgKPBI8EjwQABKgGVgVWBVYFxwVWBVYFxwU5Bh0DAARWBeMEHQfHBccF4wTHBVYFcwTjBMcFVgUdB1YF4wTjBKoCOQKqAo8EAASqAgAEAASNAwAEjQOqAgAEcwQ5AjkCAAQ5AjkGcwQABAAEAAQdAx0DOQJzBI0DVgUABI0DHQPJAsMByQKPBP//3HsCAEHOlQcLhQigQP////////////////////////////////////////////////////////////////////////////////////85AjkC1wJzBHMEHQdWBYcBqgKqAh0DrAQ5AqoCOQI5AnMEcwRzBHMEcwRzBHMEcwRzBHMEOQI5AqwErASsBHMEHwhWBVYFxwXHBVYF4wQ5BscFOQIABFYFcwSqBscFOQZWBTkGxwVWBeMExwVWBY0HVgVWBeMEOQI5AjkCwQNzBKoCcwRzBAAEcwRzBDkCcwRzBMcBxwEABMcBqgZzBHMEcwRzBKoCAAQ5AnMEAATHBQAEAAQABKwCFAKsAqwE////////////////////////////////////////////////////////////////////////////////////////OQKqAssDcwRzBB0HxwXnAaoCqgIdA6wEOQKqAjkCOQJzBHMEcwRzBHMEcwRzBHMEcwRzBKoCqgKsBKwErATjBM0HxwXHBccFxwVWBeMEOQbHBTkCcwTHBeMEqgbHBTkGVgU5BscFVgXjBMcFVgWNB1YFVgXjBKoCOQKqAqwEcwSqAnME4wRzBOMEcwSqAuME4wQ5AjkCcwQ5Ah0H4wTjBOME4wQdA3MEqgLjBHMEOQZzBHMEAAQdAz0CHQOsBP///////////////////////////////////////////////////////////////////////////////////////zkCOQLXAnMEcwQdB1YFhwGqAqoCHQOsBDkCqgI5AjkCcwRzBHMEcwRzBHMEcwRzBHMEcwQ5AjkCrASsBKwEcwQfCFYFVgXHBccFVgXjBDkGxwU5AgAEVgVzBKoGxwU5BlYFOQbHBVYF4wTHBVYFjQdWBVYF4wQ5AjkCOQLBA3MEqgJzBHMEAARzBHMEOQJzBHMExwHHAQAExwGqBnMEcwRzBHMEqgIABDkCcwQABMcFAAQABAAErAIUAqwCrAT///////////////////////////////////////////////////////////////////////////////////////85AqoCywNzBHMEHQfHBecBqgKqAh0DrAQ5AqoCOQI5AnMEcwRzBHMEcwRzBHMEcwRzBHMEqgKqAqwErASsBOMEzQfHBccFxwXHBVYF4wQ5BscFOQJzBMcF4wSqBscFOQZWBTkGxwVWBeMExwVWBY0HVgVWBeMEqgI5AqoCrARzBKoCcwTjBHME4wRzBKoC4wTjBDkCOQJzBDkCHQfjBOME4wTjBB0DcwSqAuMEcwQ5BnMEcwQABB0DPQIdA6wE//8QfAIAQd6dBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////80EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQT////////////////////////////////////////////////////////////////////////////////////////NBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0E////////////////////////////////////////////////////////////////////////////////////////zQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBP///////////////////////////////////////////////////////////////////////////////////////80EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQT//zh8AgBB7aUHC4YIQI9AAAD///////////////////////////////8CAf///////////////////////////////////////////////wIB5ACIAVgCWAKiA7UC3QA9AT0BwgFYAuQAqAHkABsBWAJYAlgCWAJYAlgCWAJYAlgCWALkAOQAWAJYAlgCuwGyA9kCpAKhAuYCRwIkAtYC+QIBAUQBcQIfAlcD5AL/AnkC/wKdAmcCWgLYArECTQSKAlQCTQI7ARsBOwFYAvQB9AESAkcCzwFHAhQCTQFKAjgC6ADsAPQBKAFYAzgCLAJHAkcCZgHhAV4BMQIDAkkDDQICAs8BYAEJAWABWAL//wAA////////////////////////////////DwH///////////////////////////////////////////////8PAfgAwAFYAlgCsQPWAvMAZgFmAcUBWAL4ALIB+AA5AVgCWAJYAlgCWAJYAlgCWAJYAlgC+AD4AFgCWAJYAssBtgPoArACqAL6AlUCMgLgAgUDGgFiAZkCMgJkA+wCEQOMAhEDrgJ3Am0C4gLJAlkEoAJqAl0CYgE5AWIBWAL0AfQBIwJYAtgBWAIeAmwBXAJJAv8AAwEYAj8BbQNJAkACWAJYAogB6AGAAUMCDwJVAyICDgLaAYcBIAGHAVgC//8AAP///////////////////////////////wIB////////////////////////////////////////////////AgHkAIgBWAJYAqIDtQLdAD0BPQHCAVgC5ACoAeQAGwFYAlgCWAJYAlgCWAJYAlgCWAJYAuQA5ABYAlgCWAK7AbID2QKkAqEC5gJHAiQC1gL5AgEBRAFxAh8CWAPjAv8CeQL/Ap0CZwJaAtgCsAJNBIoCVAJNAjsBGwE7AVgC9AH0ARICRwLPAUcCFAJNAUoCOALoAOwA9AEoAVgDOAIsAkcCRwJmAeEBXgExAgMCSQMNAgICzwFgAQkBYAFYAv//AAD///////////////////////////////8PAf///////////////////////////////////////////////w8B+ADAAVgCWAKxA9YC8wBmAWYBxQFYAvgAsgH4ADkBWAJYAlgCWAJYAlgCWAJYAlgCWAL4APgAWAJYAlgCywG2A+gCsAKoAvoCVQIyAuACBQMaAWIBmAIyAmUD6wIRA4wCEQOuAncCbQLiAskCWQSgAmoCXQJiATkBYgFYAvQB9AEjAlgC2AFYAh4CbAFcAkkC/wADARgCPwFtA0kCQAJYAlgCiAHoAYABQwIPAlUDIgIOAtoBhwEgAYcBWAL//0B8AgBB/q0HC4UIoED/////////////////////////////////////////////////////////////////////////////////////iwI1A64DtAYXBZoHPQYzAh8DHwMABLQGiwLjAosCsgIXBRcFFwUXBRcFFwUXBRcFFwUXBbICsgK0BrQGtAY/BAAIeQV9BZYFKQYOBZoEMwYEBlwCXAI/BXUE5wb8BUwG0wRMBo8FFAXjBNsFeQXpB3sF4wR7BR8DsgIfA7QGAAQABOcEFAVmBBQF7ATRAhQFEgU5AjkCogQ5AssHEgXlBBQFFAVKAysEIwMSBbwEiwa8BLwEMwQXBbICFwW0Bv///////////////////////////////////////////////////////////////////////////////////////8kCpgMrBLQGkQUECPoGcwKoA6gDLwS0BgoDUgMKA+wCkQWRBZEFkQWRBZEFkQWRBZEFkQUzAzMDtAa0BrQGpAQACDEGGQbfBaQGdwV3BZEGsgb6AvoCMwYZBfYHsgbNBt0FzQYpBsMFdQV/BjEG0wgrBssFzQWoA+wCqAO0BgAEAARmBboFvgS6BW0FewO6BbIFvgK+AlIFvgJWCLIFfwW6BboF8gPDBNMDsgU3BWQHKQU3BagEsgXsArIFtAb///////////////////////////////////////////////////////////////////////////////////////+LAjUDrgO0BhcFmgc9BjMCHwMfAwAEtAaLAuMCiwKyAhcFFwUXBRcFFwUXBRcFFwUXBRcFsgKyArQGtAa0Bj8EAAh5BX0FlgUpBg4FmgQzBgQGXAJcAj8FdQTnBvwFTAbTBEwGjwUUBeME2wV5BekHewXjBHsFHwOyAh8DtAYABAAE5wQUBWYEFAXsBNECFAUSBTkCOQKiBDkCywcSBeUEFAUUBUoDKwQjAxIFvASLBrwEvAQzBBcFsgIXBbQG////////////////////////////////////////////////////////////////////////////////////////yQKmAysEkQWRBQQI+gZzAqgDqAMvBLQGCgNSAwoD7AKRBZEFkQWRBZEFkQWRBZEFkQWRBTMDMwO0BrQGtAakBAAIMQYZBt8FpAZ3BXcFkQayBvoC+gIzBhkF9geyBs0G3QXNBikGwwV1BX8GMQbTCCsGywXNBagD7AKoA7QGAAQABGYFugW+BLoFbQV7A7oFsgW+Ar4CUgW+AlYIsgV/BboFugXyA8ME0wOyBTcFZAcpBTcFqASyBewCsgW0Bv//SHwCAEGOtgcLhQigQGYE////////////////////////////////AAD///////////////////////////////////////////////9mBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYE//9mBP///////////////////////////////wAA////////////////////////////////////////////////ZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBP//ZgT///////////////////////////////8AAP///////////////////////////////////////////////2YEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgT///////////////////////////////////////////////////////////////////////////////////////9mBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYE//9UfAIAQZ6+BwuFCKBA/////////////////////////////////////////////////////////////////////////////////////2kC8AKZAjIEMgTNBKYFRwHwAvAC8AIyBPAC8ALwAjIEMgQyBDIEMgQyBDIEMgQyBDIEMgTwAvACMgQyBDIE8AIqBrgEhwTJBOgESQQzBGkFPAU6AtADmwQNBK0FGwVkBXYEaAWoBNkDpQQwBbME0QZ0BJAEZwTwAtgC8AIyBDIEMgQ0BHUE9gN1BF0E9QIEBF8ESALvAgkEXAKkBl8ESwR1BHUEHAM9AywDXwTrA/QFAgTyA8wD8AIyBPACMgT///////////////////////////////////////////////////////////////////////////////////////9pAvAC7wKwBLAEeQWmBdYB8ALwAnUDsATwAvAC8AIfA7AEsASwBLAEsASwBLAEsASwBLAE8ALwArAEsASwBIEDKgYRBcME5QQkBY0EqwRfBXgFOgJDBPAEbAT2BVcFoAWyBKwF4wQXBOUEbAX5BBIHzgToBHsENwPYAjcDsASwBLAEQwSnBBgEpQSZBPUCBAS+BGMC7wJiBFwC4Aa5BIcEqQSsBGsDcgMsA7oEOARFBmsERQQ6BHgDsAR4A7AE////////////////////////////////////////////////////////////////////////////////////////aQLwApkCMgTZA80EpgVHAfAC8ALwAjIE8ALwAvACMgQyBDIEMgQyBDIEMgQyBDIEMgQyBPAC8AIyBDIEMgTwAioG4wSHBMkE6ARJBDMEaQU8BToC0AObBA0EFwYbBWQFWQRkBagE2QOlBDAFswTRBnQEkARnBPAC2ALwAjIEMgQyBDQEdQSuA3UETAQ2AwQEdQR0Au8CCQSQAqQGXwRLBHUEdQRVAz0DXAN0BOsD9AUCBPIDzAPwAjIE8AIyBP///////////////////////////////////////////////////////////////////////////////////////2kC8AIgA7AEsATcBaYFaQLwAvACdQOwBPAC8ALwAi0DsASwBLAEsASwBLAEsASwBLAEsATwAvACsASwBLAELQMqBukEuATnBA8FvwSvBGkFbQU6Av0DMwU6BEoGSAWeBasEKAb9BAMEewVLBXcFaQdBBXgF5ATiA9ID4gOwBLAEsAS+BL8E8QO/BGoESANIBH8EnQIaA1EEjwKkBn8EjwTKBMoEkwOsA4EDdQRrBDAGmwSDBEME4gOwBOIDsAT//2B8AgBBrsYHC4UIoED/////////////////////////////////////////////////////////////////////////////////////0AImA6wDjAYWBZwI0AUmAqIDogMWBYwG6QKiA+kCogMWBRYFFgUWBRYFFgUWBRYFFgUWBaIDogOMBowGjAZdBAAIeAV8BZYFKgYPBZkENAYDBl4DowOLBXQEvgb8BUwG0wRMBpAFeAXuBNsFeAXpB3sF7AR7BaIDogOiA4wGFgUWBc4E/AQrBPwExATQAvwEEAUyAsECvAQyAsgHEAXbBPwE/ARqAysEJwMQBbwEjAa8BLwENAQUBaIDFAWMBv///////////////////////////////////////////////////////////////////////////////////////7wCOAOzBPAGsAUtCuYGqAJZBFkEsAXwBuQC1wPkAoQFsAWwBbAFsAWwBbAFsAWwBbAFsAU4AzgD8AbwBvAG7wS2BzYGGAbKBaQGdwU0BX0GswZeBHEEKwYZBZUHxgbNBt0FzQZCBq8FdAV/BhwGBwkcBuUFiQVZBIQFWQTwBrAFsAVYBZgFtQSYBVAFYQOYBbMFvAI5A14FvAJ3CLMFfgWYBZgF+gO/BKUDswUzBdYHWgU1BcYEsAVZBLAF8Ab////////////////////////////////////////////////////////////////////////////////////////QAiYDrAOMBhYFnAjQBSYCogOiAxYFjAbpAqID6QKiAxYFFgUWBRYFFgUWBRYFFgUWBRYFogOiA4wGjAaMBl0EAAh2BXwFlgUgBg8FmQQ0BgMGXgOjA4sFdAS+BvwFTAbTBEwGkAV4Be4E2wV2BewHewXsBHsFogOiA6IDjAYWBRYFzgT8BCsE/ATEBNAC+QQQBTICwQKyBDICyQcQBdsE/AT8BGoDKwQnAxAFugSMBrwEugQ0BBQFogMUBYwG////////////////////////////////////////////////////////////////////////////////////////vAI4A7ME8AawBS0K5gaoAlkEWQSwBfAG5ALXA+QChAWwBbAFsAWwBbAFsAWwBbAFsAWwBTgDOAPwBvAG8AbvBLYHNgYYBsoFpAZ3BTQFfQazBl4EcQQrBhkFlQfGBs0G3QXNBkIGrwV0BX8GHAYHCRwG5QWJBVkEhAVZBPAGsAWwBVgFmAW1BJgFUAVhA5gFswW8AjkDXgW8AncIswV8BZgFmAX6A78EpQOzBTEF1gdaBTUFxgSwBVkEsAXwBv//aHwCAEG+zgcLhQigQP////////////////////////////////////////////////////////////////////////////////////8UAiMCNQMrBZMElgbXBcUBXgJeAmoEkwT2AZMCIQLwApMEkwSTBJMEkwSTBJMEkwSTBJMEIQIhApMEkwSTBG8DMQcQBS8FDAXVBXMEIQTTBecFOwIjAukEJwQ5BwgGOwbRBDsG8gRkBG0E0wXDBGgHngR7BJEEogLwAqICVgSWA54EcwTnBM8D5wR9BLYCYgTpBAYCBgIzBAYCcQfpBNUE5wTnBEQD0QPTAukEAgQ5BjEECAS+AwgDaAQIA5ME////////////////////////////////////////////////////////////////////////////////////////FAJKAscDKwWRBDUHAAYhArYCtgJcBJEEUgKTAkgCTgORBJEEkQSRBJEEkQSRBJEEkQSRBEgCUgKRBJEEkQTRAy0HhQVgBRkF7AV7BGQEywUfBqYCpgJQBYUEiweBBl4GBgVeBkgFaASiBAwGMwW8B1YF/gSiBKYCTgOmAkIESgPbBNUEEAUdBBAFugQZA4UEQgVxAnEC9gRxAtsHQgX0BBAFEAWiA/oDeQNCBY0E2QagBI0E5wMnA2gEJwORBP///////////////////////////////////////////////////////////////////////////////////////xQCEgIXAysFaARYBlwFvAFIAkgCagRoBOwBfwIGAs0CaARoBGgEaARoBGgEaARoBGgEaAQGAgYCaARoBGgEagPHBnEEyQSuBFQFFwTHA2oFbQUvAiMCdQTLA7IGngXDBYcEwwWNBAQE/ANoBWIE0QYnBAYEPwRKAs0CSgIjBCcDbwSFBJ4EmgOeBPIDgQICBJ4ECAIIAucDCAL6Bp4EfQSeBJ4EKwNtA5gCngSyA7wF0wOyA40DywJoBMsCaAT///////////////////////////////////////////////////////////////////////////////////////8UAkoCoAMrBWgE2QaqBQoCtgK2AlwEaAQ5ApMCSAJeA2gEaARoBGgEaARoBGgEaARoBGgESAJIAmgEaARoBKwD2QYGBfYE5QRqBVYEPwSFBZoFkwKmAucEJQQKBwoG1wWkBNcF3wQ9BD8EhwW4BCcH2QSDBEoEpgJeA6YCOQQzA28EwQTDBN0DwQR1BPwCVATVBGACYAKLBGACPQfVBK4EwwTBBF4DyQNIA9UEGQROBj8EJwSkA9cCaATXAmgE//9wfAIAQc7WBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////+4BpgJLAyUF4QSKBq8FuQEAAwADxwMlBSgC/gIoAsAD6QRwA3gEagSFBDoEhwQFBMUEhwSAAoACJQUlBSUF1ANuB14FOwUjBf4FOgXLBM0FhQYeAyQEjgXUBGsHIwb0BeEE9AWdBX0E8wQNBlUFzgevBewE0AQAA8ADAAMlBSUFAAQIBHsEogOYBN4DmgITBKgEWAJWAkkESgIMB7oEUASSBHoERwN1A8MCmgT5A+YFCgTwA40DcQMAA3EDJQX///////////////////////////////////////////////////////////////////////////////////////8IAgMDFASgBSAFCQdlBicCkwOTA9sDoAWgAggDoALGA5wF6wMDBf8EMgXLBC8FbwRpBS8F8ALwAqAFoAWgBWMEvAcRBg8GuQWsBsUFXwV1Bk4HkQPDBIkGfAUwCLcGjwacBY8GYQYxBXkFqwYZBgMJeAbbBYQFkwPGA5MDoAWgBQAExAQqBUAETgWTBCUDnQRwBdQCxQIOBcECIAiFBRYFQwUwBSkEGgQuA2oFiQToBrQEfwQ0BAAEGgMABKAF////////////////////////////////////////////////////////////////////////////////////////7gGmAksDJQXhBIoGrwW5AQADAAPHAyUFKAL+AigCwAPpBHADeARqBIUEOgSHBPkDxQSHBBIDEgMlBSUFJQXUA24HXgU7BSMF/gU6BcsEzQWFBh4DJASOBdQEawcjBtgF4QTYBZ0FfQTzBA0GVQXOB68F7ATQBAADwAMAAyUFJQUABJUEbgShA5oExgOhApUEgARhAlQCOQRIAgkHuARMBKAEcQSxA3MDxwKaBE4ElAYCBHoEjQNxAwADcQMlBf///////////////////////////////////////////////////////////////////////////////////////wgCAwMUBKAFIAUJB2UGJwKTA5MD2wOgBaACCAOgAsYDnAXrAwMF/wQyBcsELwWIBGkFLwXwAvACoAWgBaAFYwS8BxEGEwa5BawGxQVfBXUGTgebA8MEiQZ8BUQIowaPBqYFjwZhBjkFeQWrBhkGAwlrBtsFhAWTA8YDkwOgBaAFAARIBTEFSQRNBXUEDAMyBWcF7QLrAiEF1gIECIUFFgVNBTMFRQQjBFYDewXmBHgHqwRbBSMEAAQaAwAEoAX//3h8AgBB3t4HC8gKoED/////////////////////////////////////////////////////////////////////////////////////zwGbAjUD/AMOBLgFdQXEAW0CbQL8A/wD/wFzAgUCFwMOBA4EDgQOBA4EDgQOBA4EDgQOBCQCJAL8A/wD/AO1AycHoQRaBEQE7AToA60DDAX8BAQCjQIoBF0D1wYqBUwFIgRiBVgErQPmAyIFigQeBycE5gO/A3QCFwN0AvwD/ANUAtUDNARiAzQE+wNxAsQDNATWAeoBowPWAWQGNAQ4BDQENATKAiEDrgI0BJ0DuAV3A58DKQOEAq8DhAL8A///AAD///////////////////////////////8AAP///////////////////////////////////////////////88BmwKCA/wDDgTVBaMF3gF+An4C/AP8AxACcwIjAnADDgQOBA4EDgQOBA4EDgQOBA4EDgQ1AjUC/AP8A/wDtQMwB9kEfAQ8BAsF5wOsAxkFDAUiAqYCYARiA/4GRQVpBUIEfQWBBMgD9gM5BbsEQAdoBCgE0wOZAnADmQL8A/wDZwLzA0sEWQNLBAcEiALLA0sE9wELAtcD9wGCBksETQRLBEsE2AIxA8YCSwTJA/YFrQPKAy4DwALNA8AC/AP////////////////////////////////////////////////////////////////////////////////////////PAZsCNQP8Aw4EuAV1BcQBbQJtAvwD/AP/AXMCBQIaAw4EDgQOBA4EDgQOBA4EDgQOBA4EJAIkAvwD/AP8A7UDJwehBFoELgTsBOgDrQMMBfwEBAKNAigEXQPXBigFPAUiBFAFWASeA+YDIgWKBB8HJwTmA78DdAITA3QC/AP8A1QCHQQdBFQDHQTSA3ECHQQdBNYB6gGjA9YBVAYdBBsEHQQdBL4CHQOuAh0EkQO4BXcDlAMpA4QCrwOEAvwD////////////////////////////////////////////////////////////////////////////////////////zwGbAoID/AMOBNUFowXeAX4CfgL8A/wDEAJzAiMCeQMOBA4EDgQOBA4EDgQOBA4EDgQOBDUCNQL8A/wD/AO1AzAH2QR8BCYECwXnA6wDGQUMBSICpgJgBGID/gZABVkF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AABTLwAAGCEAACY+AAC+AwAAu0sAAP0AAACkNQAApQAAAJA5AAD/AAAA82QAALYDAAAMPgAADSAAABA+AAAMIAAAxkMBAAgAAAADAAAAK0MAAG3SAAALAAAABgAAACoYAABZbAAAAgAAAAEAAAC4LwAAjHcAAAQAAAACAAAAX0YAAAAEAAADAAAABAAAAFJFAAB50gAABQAAAAUAAAC2RgAABAQAAAQAAAAHAAAAABgAAIo5AAAFAAAACQAAAIw5AAD+bwAABAAAAAoAAAByRgAAsP4BAAQAAAAMAAAAnjIAAAAAAQAAAdDR0tPU1dbX2NkAQdb9BwsJ8L8AAAAAAAABAEHo/QcLDWludmlzAABmaWxsZWQAQYD+BwsaDR0AAJlUAAC1OAAAtgsAANt7AAAFyQAAPJEAQcD+Bwt5//////////////////////////////////////////8AAAAAAAAABP7//4f+//8HAAAAAAAAAAD//3////9///////////N//v3//////3///////////w/g/////zH8////AAAAAAAAAP//////////////AQD4AwBB0P8HC0FA1///+/////9/f1T9/w8A/t////////////7f/////wMA////////nxn////PPwMAAAAAAAD+////fwL+////fwBBmoAIC7MB////BwcAAAAAAP7//wf+BwAAAAD+//////////98/38vAGAAAADg////////IwAAAP8DAAAA4J/5///9xQMAAACwAwADAOCH+f///W0DAAAAXgAAHADgr/v///3tIwAAAAABAAAA4J/5///9zSMAAACwAwAAAODHPdYYx78DAAAAAAAAAADg3/3///3vAwAAAAADAAAA4N/9///97wMAAABAAwAAAODf/f///f8DAAAAAAMAQeCBCAsZ/v////9/DQA/AAAAAAAAAJYl8P6ubA0gHwBBiIIICwb//v///wMAQbSCCAty/////z8A/////38A7doHAAAAAFABUDGCq2IsAAAAAEAAyYD1BwAAAAAIAQL/////////////////////////D///////////////A///Pz//////Pz//qv///z/////////fX9wfzw//H9wfAAAAAEBMAEGwgwgLAQcAQcCDCAsmgAAAAP4DAAD+////////////HwD+/////////////wfg/////x8AQYCECAsV//////////////////////////8/AEGghAgLFf//////////////////////////DwBBxYQIC8kCYP8H/v//h/7//wcAAAAAAACAAP//f////3//////AAAAAAAAAP//////////////AQD4AwADAAAAAAD//////////z8AAAADAAAAwNf///v/////f39U/f8PAP7f///////////+3/////97AP///////58Z////zz8DAAAAAAAA/v///38C/v///38A/v/7//+7FgD///8HBwAAAAAA/v//B///BwD/A////////////3z/f+///z3/A+7////////z/z8e/8//AADun/n///3F0585gLDP/wMA5If5///9bdOHOQBewP8fAO6v+////e3zvzsAAMH/AADun/n///3N8485wLDD/wAA7Mc91hjHv8PHPYAAgP8AAO7f/f///e/D3z1gAMP/AADs3/3///3vw989YEDD/wAA7N/9///9/8PPPYAAw/8AQaCHCAs4/v////9//wf/f/8DAAAAAJYl8P6ubP87Xz//AwAAAAAAAAAD/wOgwv/+////A/7/3w+//v8//gIAQfqHCAtn/x8CAAAAoAAAAP7/PgD+////////////H2b+/////////////3dgAAAAYQAAAGIAAABjAAAAZAAAAGUAAABmAAAAZwAAAGgAAABpAAAAagAAAGsAAABsAAAAbQAAAG4AAABvAAAAAQBB8YgICwUVCgAACQBBiIkIC+ABFRAMExweAw0fICEiIxsaERkZGRkZGRkZGRkWEgIOCw8cGBgYGBgYFhYWFhYWFhYWFhYWFhYWFhYWFhYUHAQcFhwYGBgYGBgWFhYWFhYWFhYWFhYWFhYWFhYWFhwkHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcFhwcHBwcHBwcHBwWHBocHBYcHBwcHBYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWHBYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYcFhYWFhYWFhYAQZCLCAsSAgMEBQYHCAAACQoLDA0ODxARAEGuiwgLBBITABQAQcCLCAsCFRYAQd6LCAtSAQEBAQEBAQEBAQEBAQEBAQEBAQEB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ACdxAAA+cAAA6W8AAG1vAABJbwAAIW8AAB9vAAAcbwAAY2wAAE1sAAAcbAAAGmwAAAlsAAAHbAAAZWsAAElrAACwagAArmoAAKxqAACqagAAKmgAAAFoAAD/ZwAA5GcAAOJnAABPZgAATWYAAOtlAADpZQAAr2QAAC9kAAASXQAAmVQAAIRHAADHRQAArUIAAL8+AAAcPgAACj4AAEo8AABsOQAAtTgAAKYyAAB5MQAAFSEAANEgAAANHQAA1BUAAIgMAAAEDAAAtgsAACcKAABJCQAAeQQAAEQEAAA7BAAALwQAAAkEAAA2cAAAAAAAAAgArv/RAAoArv+u/wsArv+u/67/rv+u/67/rv+u/wUA0QCu/9EA0QDRANEA0QDRANEA0QCu//v/rv8OAOz/rv+u/67/rv/RANEA0QDRANEADQAlAAwAQgAQAFAAEwBtAHsAFACYAA8ApgDDAK7/rv+u/67/rv+u/67/rv+u/67/rv+u/67/rv+u/67/rv+u/67/rv+u/67/rv+u/xcArv93AK7/BwAuAK7/JgCu/xcAEQAjAK7/DQCu/67/rv+u/zoArv+u/zUArv+u/67/KACu/wcArv87AEUArv9IAK7/rv+u/67/rv8AQfG/CAvBBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygAAAAAAAAAAAICAgICAhAMWQEAH1AIAwcSExRXFhcIC2kMHwoFDA4pESsPLRAvMCAyBjQ1GxwdHgsMISIjJCUmJygMGBkXBAobHBogKgohIiMkJSYnKAwKDlMKLFgxWFhYWFhYDBscDy5YMyEiIyQlJicoGxz/U///ISIj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cm1hdGlvbgBJbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBNdWx0aWhvcCBhdHRlbXB0ZWQAUmVxdWlyZWQga2V5IG5vdCBhdmFpbGFibGUAS2V5IGhhcyBleHBpcmVkAEtleSBoYXMgYmVlbiByZXZva2VkAEtleSB3YXMgcmVqZWN0ZWQgYnkgc2VydmljZQAAAAAApQJbAPABtQWMBSUBgwYdA5QE/wDHAzEDCwa8AY8BfwPKBCsA2gavAEIDTgPcAQ4EFQChBg0BlAILAjgGZAK8Av8CXQPnBAsHzwLLBe8F2wXhAh4GRQKFAIICbANvBPEA8wMYBdkA2gNMBlQCewGdA70EAABRABUCuwCzA20A/wGFBC8F+QQ4AGUBRgGfALcGqAFzAlMBAEGIjQkLDCEEAAAAAAAAAAAvAgBBqI0JCwY1BEcEVgQAQb6NCQsCoAQAQdKNCQsiRgVgBW4FYQYAAM8BAAAAAAAAAADJBukG+QYeBzkHSQdeBwBBgI4JC5EB0XSeAFedvSqAcFIP//8+JwoAAABkAAAA6AMAABAnAACghgEAQEIPAICWmAAA4fUFGAAAADUAAABxAAAAa////877//+Sv///AAAAAAAAAAAZAAsAGRkZAAAAAAUAAAAAAAAJAAAAAAsAAAAAAAAAABkACgoZGRkDCgcAAQAJCxgAAAkGCwAACwAGGQAAABkZGQBBoY8JCyEOAAAAAAAAAAAZAAsNGRkZAA0AAAIACQ4AAAAJAA4AAA4AQduPCQsBDABB548JCxUTAAAAABMAAAAACQwAAAAAAAwAAAwAQZWQCQsBEABBoZAJCxUPAAAABA8AAAAACRAAAAAAABAAABAAQc+QCQsBEgBB25AJCx4RAAAAABEAAAAACRIAAAAAABIAABIAABoAAAAaGhoAQZKRCQsOGgAAABoaGgAAAAAAAAkAQcORCQsBFABBz5EJCxUXAAAAABcAAAAACRQAAAAAABQAABQAQf2RCQsBFgBBiZIJCycVAAAAABUAAAAACRYAAAAAABYAABYAADAxMjM0NTY3ODlBQkNERUYAQdSSCQsCAwIAQfySCQsI//////////8AQcCTCQv1CP////////////////////////////////////////////////////////////////8AAQIDBAUGBwgJ/////////woLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIj////////CgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiP/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAECBAcDBgUAAAAAAAAAAgAAwAMAAMAEAADABQAAwAYAAMAHAADACAAAwAkAAMAKAADACwAAwAwAAMANAADADgAAwA8AAMAQAADAEQAAwBIAAMATAADAFAAAwBUAAMAWAADAFwAAwBgAAMAZAADAGgAAwBsAAMAcAADAHQAAwB4AAMAfAADAAAAAswEAAMMCAADDAwAAwwQAAMMFAADDBgAAwwcAAMMIAADDCQAAwwoAAMMLAADDDAAAww0AANMOAADDDwAAwwAADLsBAAzDAgAMwwMADMMEAAzbAAAAAIRMAgAFAgAABgIAAAcCAAAIAgAACQIAAAoCAAALAgAADAIAAA0CAAAOAgAADwIAABACAAARAgAAEgIAAAQAAAAAAAAAwEwCABMCAAAUAgAA/P////z////ATAIAFQIAABYCAADoSwIA/EsCAAAAAAAITQIAFwIAABgCAAAHAgAACAIAABkCAAAaAgAACwIAAAwCAAANAgAAGwIAAA8CAAAcAgAAEQIAAB0CAAD4dwIAWEwCABxOAgBOU3QzX18yOWJhc2ljX2lvc0ljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRQAAANB3AgCMTAIATlN0M19fMjE1YmFzaWNfc3RyZWFtYnVmSWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFAAAAAFR4AgDYTAIAAAAAAAEAAABMTAIAA/T//05TdDNfXzIxM2Jhc2ljX29zdHJlYW1JY05TXzExY2hhcl90cmFpdHNJY0VFRUUAAPh3AgAUTQIAhEwCAE5TdDNfXzIxNWJhc2ljX3N0cmluZ2J1ZkljTlNfMTFjaGFyX3RyYWl0c0ljRUVOU185YWxsb2NhdG9ySWNFRUVFAAAAOAAAAAAAAAC4TQIAHgIAAB8CAADI////yP///7hNAgAgAgAAIQIAAGRNAgCcTQIAsE0CAHhNAgA4AAAAAAAAAMBMAgATAgAAFAIAAMj////I////wEwCABUC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ABUAAABURgAAAAAAAKZeAADqSQAA2GUAQbz+CQseREkAABEAAABURgAAAAAAAKZeAAAXVwAA/G4AANZWAEHk/gkLOhoAAABORgAA1lYAAAAAAAATXwAA/G4AANZWAAAAAAAApl4AABsAAABORgAA1lYAAKZeAABMXwAA/G4AQaj/CQsepl4AABkAAABORgAAAAAAAKZeAADzNwAA/G4AANI3AEHQ/wkLBhgAAABORgBB4P8JCwoJVwAAb04AANZWAEH0/wkLOh4AAABORgAA1lYAAAAAAAD/XgAAb04AANZWAAAAAAAApl4AAB8AAABORgAA1lYAAKZeAAA8XwAAb04AQbiACgsepl4AAB0AAABORgAAAAAAAKZeAADkNwAAb04AANI3AEHggAoLBhwAAABORgBB8IAKCwZ7OQAAezkAQYSBCgsGIAAAAE8GAEGUgQoLCvFWAABJGgAA1lYAQaiBCgs6AgAAAE5GAADWVgAAAAAAAO5eAABJGgAA1lYAAAAAAACmXgAAAwAAAE5GAADWVgAApl4AAC9fAABJGgBB7IEKCxqmXgAAAQAAAE5GAAAAAAAApl4AANg3AABJGgBBmIIKCwJORgBBpIIKCyrBXgAA324AAPA4AAAAAAAApl4AACEAAABORgAAAAAAAKZeAAARFwAAFRcAQdyCCgsGIgAAAE8GAEHsggoLWQgAAAAEAAAAAAAAADgAAAAKAAAAOQAAAAgAAAD/////AAAAAAAAAAAKAAAAAAAAAAgAAAD/////AAAAAAAAAAA6AAAAAAAAAAgAAAD/////AAAAAAAAAAA7AEHYgwoLAQQAQYCECgu3CDwAAABAAAAAQQAAAEIAAABDAAAARAAAAD4AAABAAAAAQQAAAEUAAAAAAAAARgAAADwAAABAAAAAQQAAAEIAAABDAAAARAAAAD0AAABHAAAASAAAAEkAAABKAAAASwAAAD8AAABMAAAAQQAAAE0AAAAAAAAATgAAADwAAABAAAAAQQAAAE8AAABDAAAARAAAAGIJAAAAggIAgIYCAAAAAADENAAAAIICALCGAgAAAAAAhU0AAACCAgDghgIAAAAAAEM7AAAAggIA4IYCAAAAAAB+UQAAAIICABCHAgAAAAAABhAAABiCAgAQhwIAAAAAAEFFAAAAggIAUIcCAAAAAABeUQAAAIICAICHAgAA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";return Q}var Ie;function We(Q){if(Q==Ie&&h)return new Uint8Array(h);var D=f(Q);if(D)return D;throw"both async and sync fetching of the wasm failed"}function we(Q){return Promise.resolve().then(()=>We(Q))}function Ze(Q,D,R){return we(Q).then(v=>WebAssembly.instantiate(v,D)).then(R,v=>{u(`failed to asynchronously prepare wasm: ${v}`),He(v)})}function Ge(Q,D,R,v){return Ze(D,R,v)}function LA(){return{a:Hn}}function Fe(){var Q=LA();function D(v,U){return ZA=v.exports,b=ZA.y,Z(),le(ZA.z),Qe(),ZA}Je();function R(v){D(v.instance)}return Ie??=Ye(),Ge(h,Ie,Q,R).catch(o),{}}function pe(Q){return i.agerrMessages.push(KA(Q)),0}function Wt(Q){this.name="ExitStatus",this.message=`Program terminated with exit(${Q})`,this.status=Q}var Qt=Q=>{Q.forEach(D=>D(i))};function BA(Q,D="i8"){switch(D.endsWith("*")&&(D="*"),D){case"i1":return S[Q];case"i8":return S[Q];case"i16":return _[Q>>1];case"i32":return K[Q>>2];case"i64":return H[Q>>3];case"float":return O[Q>>2];case"double":return V[Q>>3];case"*":return J[Q>>2];default:He(`invalid type for getValue: ${D}`)}}var _t=Q=>Ki(Q),VA=()=>lr(),YA=typeof TextDecoder<"u"?new TextDecoder:void 0,Jt=(Q,D=0,R=NaN)=>{for(var v=D+R,U=D;Q[U]&&!(U>=v);)++U;if(U-D>16&&Q.buffer&&YA)return YA.decode(Q.subarray(D,U));for(var Y="";D>10,56320|CA&1023)}}return Y},KA=(Q,D)=>Q?Jt(w,Q,D):"",di=(Q,D,R,v)=>{He(`Assertion failed: ${KA(Q)}, at: `+[D?KA(D):"unknown filename",R,v?KA(v):"unknown function"])};class G{constructor(D){this.excPtr=D,this.ptr=D-24}set_type(D){J[this.ptr+4>>2]=D}get_type(){return J[this.ptr+4>>2]}set_destructor(D){J[this.ptr+8>>2]=D}get_destructor(){return J[this.ptr+8>>2]}set_caught(D){D=D?1:0,S[this.ptr+12]=D}get_caught(){return S[this.ptr+12]!=0}set_rethrown(D){D=D?1:0,S[this.ptr+13]=D}get_rethrown(){return S[this.ptr+13]!=0}init(D,R){this.set_adjusted_ptr(0),this.set_type(D),this.set_destructor(R)}set_adjusted_ptr(D){J[this.ptr+16>>2]=D}get_adjusted_ptr(){return J[this.ptr+16>>2]}}var z=0,Ae=(Q,D,R)=>{var v=new G(Q);throw v.init(D,R),z=Q,z},de={isAbs:Q=>Q.charAt(0)==="/",splitPath:Q=>{var D=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return D.exec(Q).slice(1)},normalizeArray:(Q,D)=>{for(var R=0,v=Q.length-1;v>=0;v--){var U=Q[v];U==="."?Q.splice(v,1):U===".."?(Q.splice(v,1),R++):R&&(Q.splice(v,1),R--)}if(D)for(;R;R--)Q.unshift("..");return Q},normalize:Q=>{var D=de.isAbs(Q),R=Q.substr(-1)==="/";return Q=de.normalizeArray(Q.split("/").filter(v=>!!v),!D).join("/"),!Q&&!D&&(Q="."),Q&&R&&(Q+="/"),(D?"/":"")+Q},dirname:Q=>{var D=de.splitPath(Q),R=D[0],v=D[1];return!R&&!v?".":(v&&(v=v.substr(0,v.length-1)),R+v)},basename:Q=>{if(Q==="/")return"/";Q=de.normalize(Q),Q=Q.replace(/\/$/,"");var D=Q.lastIndexOf("/");return D===-1?Q:Q.substr(D+1)},join:(...Q)=>de.normalize(Q.join("/")),join2:(Q,D)=>de.normalize(Q+"/"+D)},Ne=()=>{if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function")return Q=>crypto.getRandomValues(Q);He("initRandomDevice")},pA=Q=>(pA=Ne())(Q),vA={resolve:(...Q)=>{for(var D="",R=!1,v=Q.length-1;v>=-1&&!R;v--){var U=v>=0?Q[v]:L.cwd();if(typeof U!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!U)return"";D=U+"/"+D,R=de.isAbs(U)}return D=de.normalizeArray(D.split("/").filter(Y=>!!Y),!R).join("/"),(R?"/":"")+D||"."},relative:(Q,D)=>{Q=vA.resolve(Q).substr(1),D=vA.resolve(D).substr(1);function R(CA){for(var hA=0;hA=0&&CA[it]==="";it--);return hA>it?[]:CA.slice(hA,it-hA+1)}for(var v=R(Q.split("/")),U=R(D.split("/")),Y=Math.min(v.length,U.length),ie=Y,ce=0;ce{for(var D=0,R=0;R=55296&&v<=57343?(D+=4,++R):D+=3}return D},wt=(Q,D,R,v)=>{if(!(v>0))return 0;for(var U=R,Y=R+v-1,ie=0;ie=55296&&ce<=57343){var Le=Q.charCodeAt(++ie);ce=65536+((ce&1023)<<10)|Le&1023}if(ce<=127){if(R>=Y)break;D[R++]=ce}else if(ce<=2047){if(R+1>=Y)break;D[R++]=192|ce>>6,D[R++]=128|ce&63}else if(ce<=65535){if(R+2>=Y)break;D[R++]=224|ce>>12,D[R++]=128|ce>>6&63,D[R++]=128|ce&63}else{if(R+3>=Y)break;D[R++]=240|ce>>18,D[R++]=128|ce>>12&63,D[R++]=128|ce>>6&63,D[R++]=128|ce&63}}return D[R]=0,R-U};function st(Q,D,R){var v=R>0?R:Re(Q)+1,U=new Array(v),Y=wt(Q,U,0,U.length);return D&&(U.length=Y),U}var nA=()=>{if(!Ke.length){var Q=null;if(typeof window<"u"&&typeof window.prompt=="function"&&(Q=window.prompt("Input: "),Q!==null&&(Q+=` +`)),!Q)return null;Ke=st(Q,!0)}return Ke.shift()},Bt={ttys:[],init(){},shutdown(){},register(Q,D){Bt.ttys[Q]={input:[],output:[],ops:D},L.registerDevice(Q,Bt.stream_ops)},stream_ops:{open(Q){var D=Bt.ttys[Q.node.rdev];if(!D)throw new L.ErrnoError(43);Q.tty=D,Q.seekable=!1},close(Q){Q.tty.ops.fsync(Q.tty)},fsync(Q){Q.tty.ops.fsync(Q.tty)},read(Q,D,R,v,U){if(!Q.tty||!Q.tty.ops.get_char)throw new L.ErrnoError(60);for(var Y=0,ie=0;ie0&&(I(Jt(Q.output)),Q.output=[])},ioctl_tcgets(Q){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(Q,D,R){return 0},ioctl_tiocgwinsz(Q){return[24,80]}},default_tty1_ops:{put_char(Q,D){D===null||D===10?(u(Jt(Q.output)),Q.output=[]):D!=0&&Q.output.push(D)},fsync(Q){Q.output&&Q.output.length>0&&(u(Jt(Q.output)),Q.output=[])}}},Wi=(Q,D)=>{w.fill(0,Q,Q+D)},Qn=(Q,D)=>Math.ceil(Q/D)*D,dn=Q=>{Q=Qn(Q,65536);var D=Ri(65536,Q);return D&&Wi(D,Q),D},HA={ops_table:null,mount(Q){return HA.createNode(null,"/",16895,0)},createNode(Q,D,R,v){if(L.isBlkdev(R)||L.isFIFO(R))throw new L.ErrnoError(63);HA.ops_table||={dir:{node:{getattr:HA.node_ops.getattr,setattr:HA.node_ops.setattr,lookup:HA.node_ops.lookup,mknod:HA.node_ops.mknod,rename:HA.node_ops.rename,unlink:HA.node_ops.unlink,rmdir:HA.node_ops.rmdir,readdir:HA.node_ops.readdir,symlink:HA.node_ops.symlink},stream:{llseek:HA.stream_ops.llseek}},file:{node:{getattr:HA.node_ops.getattr,setattr:HA.node_ops.setattr},stream:{llseek:HA.stream_ops.llseek,read:HA.stream_ops.read,write:HA.stream_ops.write,allocate:HA.stream_ops.allocate,mmap:HA.stream_ops.mmap,msync:HA.stream_ops.msync}},link:{node:{getattr:HA.node_ops.getattr,setattr:HA.node_ops.setattr,readlink:HA.node_ops.readlink},stream:{}},chrdev:{node:{getattr:HA.node_ops.getattr,setattr:HA.node_ops.setattr},stream:L.chrdev_stream_ops}};var U=L.createNode(Q,D,R,v);return L.isDir(U.mode)?(U.node_ops=HA.ops_table.dir.node,U.stream_ops=HA.ops_table.dir.stream,U.contents={}):L.isFile(U.mode)?(U.node_ops=HA.ops_table.file.node,U.stream_ops=HA.ops_table.file.stream,U.usedBytes=0,U.contents=null):L.isLink(U.mode)?(U.node_ops=HA.ops_table.link.node,U.stream_ops=HA.ops_table.link.stream):L.isChrdev(U.mode)&&(U.node_ops=HA.ops_table.chrdev.node,U.stream_ops=HA.ops_table.chrdev.stream),U.timestamp=Date.now(),Q&&(Q.contents[D]=U,Q.timestamp=U.timestamp),U},getFileDataAsTypedArray(Q){return Q.contents?Q.contents.subarray?Q.contents.subarray(0,Q.usedBytes):new Uint8Array(Q.contents):new Uint8Array(0)},expandFileStorage(Q,D){var R=Q.contents?Q.contents.length:0;if(!(R>=D)){var v=1024*1024;D=Math.max(D,R*(R>>0),R!=0&&(D=Math.max(D,256));var U=Q.contents;Q.contents=new Uint8Array(D),Q.usedBytes>0&&Q.contents.set(U.subarray(0,Q.usedBytes),0)}},resizeFileStorage(Q,D){if(Q.usedBytes!=D)if(D==0)Q.contents=null,Q.usedBytes=0;else{var R=Q.contents;Q.contents=new Uint8Array(D),R&&Q.contents.set(R.subarray(0,Math.min(D,Q.usedBytes))),Q.usedBytes=D}},node_ops:{getattr(Q){var D={};return D.dev=L.isChrdev(Q.mode)?Q.id:1,D.ino=Q.id,D.mode=Q.mode,D.nlink=1,D.uid=0,D.gid=0,D.rdev=Q.rdev,L.isDir(Q.mode)?D.size=4096:L.isFile(Q.mode)?D.size=Q.usedBytes:L.isLink(Q.mode)?D.size=Q.link.length:D.size=0,D.atime=new Date(Q.timestamp),D.mtime=new Date(Q.timestamp),D.ctime=new Date(Q.timestamp),D.blksize=4096,D.blocks=Math.ceil(D.size/D.blksize),D},setattr(Q,D){D.mode!==void 0&&(Q.mode=D.mode),D.timestamp!==void 0&&(Q.timestamp=D.timestamp),D.size!==void 0&&HA.resizeFileStorage(Q,D.size)},lookup(Q,D){throw L.genericErrors[44]},mknod(Q,D,R,v){return HA.createNode(Q,D,R,v)},rename(Q,D,R){if(L.isDir(Q.mode)){var v;try{v=L.lookupNode(D,R)}catch{}if(v)for(var U in v.contents)throw new L.ErrnoError(55)}delete Q.parent.contents[Q.name],Q.parent.timestamp=Date.now(),Q.name=R,D.contents[R]=Q,D.timestamp=Q.parent.timestamp},unlink(Q,D){delete Q.contents[D],Q.timestamp=Date.now()},rmdir(Q,D){var R=L.lookupNode(Q,D);for(var v in R.contents)throw new L.ErrnoError(55);delete Q.contents[D],Q.timestamp=Date.now()},readdir(Q){var D=[".",".."];for(var R of Object.keys(Q.contents))D.push(R);return D},symlink(Q,D,R){var v=HA.createNode(Q,D,41471,0);return v.link=R,v},readlink(Q){if(!L.isLink(Q.mode))throw new L.ErrnoError(28);return Q.link}},stream_ops:{read(Q,D,R,v,U){var Y=Q.node.contents;if(U>=Q.node.usedBytes)return 0;var ie=Math.min(Q.node.usedBytes-U,v);if(ie>8&&Y.subarray)D.set(Y.subarray(U,U+ie),R);else for(var ce=0;ce0||R+D{var U=v?"":`al ${Q}`;d(Q).then(Y=>{D(new Uint8Array(Y)),U&&Qe()},Y=>{if(R)R();else throw`Loading data file "${Q}" failed.`}),U&&Je()},Gi=(Q,D,R,v,U,Y)=>{L.createDataFile(Q,D,R,v,U,Y)},oi=[],Yt=(Q,D,R,v)=>{typeof Browser<"u"&&Browser.init();var U=!1;return oi.forEach(Y=>{U||Y.canHandle(D)&&(Y.handle(Q,D,R,v),U=!0)}),U},xi=(Q,D,R,v,U,Y,ie,ce,Le,CA)=>{var hA=D?vA.resolve(de.join2(Q,D)):Q;function it(et){function RA(jA){CA?.(),ce||Gi(Q,D,jA,v,U,Le),Y?.(),Qe()}Yt(et,hA,RA,()=>{ie?.(),Qe()})||RA(et)}Je(),typeof R=="string"?Cn(R,it,ie):it(R)},Pi=Q=>{var D={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},R=D[Q];if(typeof R>"u")throw new Error(`Unknown file open mode: ${Q}`);return R},Xt=(Q,D)=>{var R=0;return Q&&(R|=365),D&&(R|=146),R},L={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,ErrnoError:class{constructor(Q){this.name="ErrnoError",this.errno=Q}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(Q){this.node=Q}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(Q){this.shared.flags=Q}get position(){return this.shared.position}set position(Q){this.shared.position=Q}},FSNode:class{constructor(Q,D,R,v){Q||(Q=this),this.parent=Q,this.mount=Q.mount,this.mounted=null,this.id=L.nextInode++,this.name=D,this.mode=R,this.node_ops={},this.stream_ops={},this.rdev=v,this.readMode=365,this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(Q){Q?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(Q){Q?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return L.isDir(this.mode)}get isDevice(){return L.isChrdev(this.mode)}},lookupPath(Q,D={}){if(Q=vA.resolve(Q),!Q)return{path:"",node:null};var R={follow_mount:!0,recurse_count:0};if(D=Object.assign(R,D),D.recurse_count>8)throw new L.ErrnoError(32);for(var v=Q.split("/").filter(it=>!!it),U=L.root,Y="/",ie=0;ie40)throw new L.ErrnoError(32)}}return{path:Y,node:U}},getPath(Q){for(var D;;){if(L.isRoot(Q)){var R=Q.mount.mountpoint;return D?R[R.length-1]!=="/"?`${R}/${D}`:R+D:R}D=D?`${Q.name}/${D}`:Q.name,Q=Q.parent}},hashName(Q,D){for(var R=0,v=0;v>>0)%L.nameTable.length},hashAddNode(Q){var D=L.hashName(Q.parent.id,Q.name);Q.name_next=L.nameTable[D],L.nameTable[D]=Q},hashRemoveNode(Q){var D=L.hashName(Q.parent.id,Q.name);if(L.nameTable[D]===Q)L.nameTable[D]=Q.name_next;else for(var R=L.nameTable[D];R;){if(R.name_next===Q){R.name_next=Q.name_next;break}R=R.name_next}},lookupNode(Q,D){var R=L.mayLookup(Q);if(R)throw new L.ErrnoError(R);for(var v=L.hashName(Q.id,D),U=L.nameTable[v];U;U=U.name_next){var Y=U.name;if(U.parent.id===Q.id&&Y===D)return U}return L.lookup(Q,D)},createNode(Q,D,R,v){var U=new L.FSNode(Q,D,R,v);return L.hashAddNode(U),U},destroyNode(Q){L.hashRemoveNode(Q)},isRoot(Q){return Q===Q.parent},isMountpoint(Q){return!!Q.mounted},isFile(Q){return(Q&61440)===32768},isDir(Q){return(Q&61440)===16384},isLink(Q){return(Q&61440)===40960},isChrdev(Q){return(Q&61440)===8192},isBlkdev(Q){return(Q&61440)===24576},isFIFO(Q){return(Q&61440)===4096},isSocket(Q){return(Q&49152)===49152},flagsToPermissionString(Q){var D=["r","w","rw"][Q&3];return Q&512&&(D+="w"),D},nodePermissions(Q,D){return L.ignorePermissions?0:D.includes("r")&&!(Q.mode&292)||D.includes("w")&&!(Q.mode&146)||D.includes("x")&&!(Q.mode&73)?2:0},mayLookup(Q){if(!L.isDir(Q.mode))return 54;var D=L.nodePermissions(Q,"x");return D||(Q.node_ops.lookup?0:2)},mayCreate(Q,D){try{var R=L.lookupNode(Q,D);return 20}catch{}return L.nodePermissions(Q,"wx")},mayDelete(Q,D,R){var v;try{v=L.lookupNode(Q,D)}catch(Y){return Y.errno}var U=L.nodePermissions(Q,"wx");if(U)return U;if(R){if(!L.isDir(v.mode))return 54;if(L.isRoot(v)||L.getPath(v)===L.cwd())return 10}else if(L.isDir(v.mode))return 31;return 0},mayOpen(Q,D){return Q?L.isLink(Q.mode)?32:L.isDir(Q.mode)&&(L.flagsToPermissionString(D)!=="r"||D&512)?31:L.nodePermissions(Q,L.flagsToPermissionString(D)):44},MAX_OPEN_FDS:4096,nextfd(){for(var Q=0;Q<=L.MAX_OPEN_FDS;Q++)if(!L.streams[Q])return Q;throw new L.ErrnoError(33)},getStreamChecked(Q){var D=L.getStream(Q);if(!D)throw new L.ErrnoError(8);return D},getStream:Q=>L.streams[Q],createStream(Q,D=-1){return Q=Object.assign(new L.FSStream,Q),D==-1&&(D=L.nextfd()),Q.fd=D,L.streams[D]=Q,Q},closeStream(Q){L.streams[Q]=null},dupStream(Q,D=-1){var R=L.createStream(Q,D);return R.stream_ops?.dup?.(R),R},chrdev_stream_ops:{open(Q){var D=L.getDevice(Q.node.rdev);Q.stream_ops=D.stream_ops,Q.stream_ops.open?.(Q)},llseek(){throw new L.ErrnoError(70)}},major:Q=>Q>>8,minor:Q=>Q&255,makedev:(Q,D)=>Q<<8|D,registerDevice(Q,D){L.devices[Q]={stream_ops:D}},getDevice:Q=>L.devices[Q],getMounts(Q){for(var D=[],R=[Q];R.length;){var v=R.pop();D.push(v),R.push(...v.mounts)}return D},syncfs(Q,D){typeof Q=="function"&&(D=Q,Q=!1),L.syncFSRequests++,L.syncFSRequests>1&&u(`warning: ${L.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`);var R=L.getMounts(L.root.mount),v=0;function U(ie){return L.syncFSRequests--,D(ie)}function Y(ie){if(ie)return Y.errored?void 0:(Y.errored=!0,U(ie));++v>=R.length&&U(null)}R.forEach(ie=>{if(!ie.type.syncfs)return Y(null);ie.type.syncfs(ie,Q,Y)})},mount(Q,D,R){var v=R==="/",U=!R,Y;if(v&&L.root)throw new L.ErrnoError(10);if(!v&&!U){var ie=L.lookupPath(R,{follow_mount:!1});if(R=ie.path,Y=ie.node,L.isMountpoint(Y))throw new L.ErrnoError(10);if(!L.isDir(Y.mode))throw new L.ErrnoError(54)}var ce={type:Q,opts:D,mountpoint:R,mounts:[]},Le=Q.mount(ce);return Le.mount=ce,ce.root=Le,v?L.root=Le:Y&&(Y.mounted=ce,Y.mount&&Y.mount.mounts.push(ce)),Le},unmount(Q){var D=L.lookupPath(Q,{follow_mount:!1});if(!L.isMountpoint(D.node))throw new L.ErrnoError(28);var R=D.node,v=R.mounted,U=L.getMounts(v);Object.keys(L.nameTable).forEach(ie=>{for(var ce=L.nameTable[ie];ce;){var Le=ce.name_next;U.includes(ce.mount)&&L.destroyNode(ce),ce=Le}}),R.mounted=null;var Y=R.mount.mounts.indexOf(v);R.mount.mounts.splice(Y,1)},lookup(Q,D){return Q.node_ops.lookup(Q,D)},mknod(Q,D,R){var v=L.lookupPath(Q,{parent:!0}),U=v.node,Y=de.basename(Q);if(!Y||Y==="."||Y==="..")throw new L.ErrnoError(28);var ie=L.mayCreate(U,Y);if(ie)throw new L.ErrnoError(ie);if(!U.node_ops.mknod)throw new L.ErrnoError(63);return U.node_ops.mknod(U,Y,D,R)},create(Q,D){return D=D!==void 0?D:438,D&=4095,D|=32768,L.mknod(Q,D,0)},mkdir(Q,D){return D=D!==void 0?D:511,D&=1023,D|=16384,L.mknod(Q,D,0)},mkdirTree(Q,D){for(var R=Q.split("/"),v="",U=0;U"u"&&(R=D,D=438),D|=8192,L.mknod(Q,D,R)},symlink(Q,D){if(!vA.resolve(Q))throw new L.ErrnoError(44);var R=L.lookupPath(D,{parent:!0}),v=R.node;if(!v)throw new L.ErrnoError(44);var U=de.basename(D),Y=L.mayCreate(v,U);if(Y)throw new L.ErrnoError(Y);if(!v.node_ops.symlink)throw new L.ErrnoError(63);return v.node_ops.symlink(v,U,Q)},rename(Q,D){var R=de.dirname(Q),v=de.dirname(D),U=de.basename(Q),Y=de.basename(D),ie,ce,Le;if(ie=L.lookupPath(Q,{parent:!0}),ce=ie.node,ie=L.lookupPath(D,{parent:!0}),Le=ie.node,!ce||!Le)throw new L.ErrnoError(44);if(ce.mount!==Le.mount)throw new L.ErrnoError(75);var CA=L.lookupNode(ce,U),hA=vA.relative(Q,v);if(hA.charAt(0)!==".")throw new L.ErrnoError(28);if(hA=vA.relative(D,R),hA.charAt(0)!==".")throw new L.ErrnoError(55);var it;try{it=L.lookupNode(Le,Y)}catch{}if(CA!==it){var et=L.isDir(CA.mode),RA=L.mayDelete(ce,U,et);if(RA)throw new L.ErrnoError(RA);if(RA=it?L.mayDelete(Le,Y,et):L.mayCreate(Le,Y),RA)throw new L.ErrnoError(RA);if(!ce.node_ops.rename)throw new L.ErrnoError(63);if(L.isMountpoint(CA)||it&&L.isMountpoint(it))throw new L.ErrnoError(10);if(Le!==ce&&(RA=L.nodePermissions(ce,"w"),RA))throw new L.ErrnoError(RA);L.hashRemoveNode(CA);try{ce.node_ops.rename(CA,Le,Y),CA.parent=Le}catch(jA){throw jA}finally{L.hashAddNode(CA)}}},rmdir(Q){var D=L.lookupPath(Q,{parent:!0}),R=D.node,v=de.basename(Q),U=L.lookupNode(R,v),Y=L.mayDelete(R,v,!0);if(Y)throw new L.ErrnoError(Y);if(!R.node_ops.rmdir)throw new L.ErrnoError(63);if(L.isMountpoint(U))throw new L.ErrnoError(10);R.node_ops.rmdir(R,v),L.destroyNode(U)},readdir(Q){var D=L.lookupPath(Q,{follow:!0}),R=D.node;if(!R.node_ops.readdir)throw new L.ErrnoError(54);return R.node_ops.readdir(R)},unlink(Q){var D=L.lookupPath(Q,{parent:!0}),R=D.node;if(!R)throw new L.ErrnoError(44);var v=de.basename(Q),U=L.lookupNode(R,v),Y=L.mayDelete(R,v,!1);if(Y)throw new L.ErrnoError(Y);if(!R.node_ops.unlink)throw new L.ErrnoError(63);if(L.isMountpoint(U))throw new L.ErrnoError(10);R.node_ops.unlink(R,v),L.destroyNode(U)},readlink(Q){var D=L.lookupPath(Q),R=D.node;if(!R)throw new L.ErrnoError(44);if(!R.node_ops.readlink)throw new L.ErrnoError(28);return vA.resolve(L.getPath(R.parent),R.node_ops.readlink(R))},stat(Q,D){var R=L.lookupPath(Q,{follow:!D}),v=R.node;if(!v)throw new L.ErrnoError(44);if(!v.node_ops.getattr)throw new L.ErrnoError(63);return v.node_ops.getattr(v)},lstat(Q){return L.stat(Q,!0)},chmod(Q,D,R){var v;if(typeof Q=="string"){var U=L.lookupPath(Q,{follow:!R});v=U.node}else v=Q;if(!v.node_ops.setattr)throw new L.ErrnoError(63);v.node_ops.setattr(v,{mode:D&4095|v.mode&-4096,timestamp:Date.now()})},lchmod(Q,D){L.chmod(Q,D,!0)},fchmod(Q,D){var R=L.getStreamChecked(Q);L.chmod(R.node,D)},chown(Q,D,R,v){var U;if(typeof Q=="string"){var Y=L.lookupPath(Q,{follow:!v});U=Y.node}else U=Q;if(!U.node_ops.setattr)throw new L.ErrnoError(63);U.node_ops.setattr(U,{timestamp:Date.now()})},lchown(Q,D,R){L.chown(Q,D,R,!0)},fchown(Q,D,R){var v=L.getStreamChecked(Q);L.chown(v.node,D,R)},truncate(Q,D){if(D<0)throw new L.ErrnoError(28);var R;if(typeof Q=="string"){var v=L.lookupPath(Q,{follow:!0});R=v.node}else R=Q;if(!R.node_ops.setattr)throw new L.ErrnoError(63);if(L.isDir(R.mode))throw new L.ErrnoError(31);if(!L.isFile(R.mode))throw new L.ErrnoError(28);var U=L.nodePermissions(R,"w");if(U)throw new L.ErrnoError(U);R.node_ops.setattr(R,{size:D,timestamp:Date.now()})},ftruncate(Q,D){var R=L.getStreamChecked(Q);if((R.flags&2097155)===0)throw new L.ErrnoError(28);L.truncate(R.node,D)},utime(Q,D,R){var v=L.lookupPath(Q,{follow:!0}),U=v.node;U.node_ops.setattr(U,{timestamp:Math.max(D,R)})},open(Q,D,R){if(Q==="")throw new L.ErrnoError(44);D=typeof D=="string"?Pi(D):D,D&64?(R=typeof R>"u"?438:R,R=R&4095|32768):R=0;var v;if(typeof Q=="object")v=Q;else{Q=de.normalize(Q);try{var U=L.lookupPath(Q,{follow:!(D&131072)});v=U.node}catch{}}var Y=!1;if(D&64)if(v){if(D&128)throw new L.ErrnoError(20)}else v=L.mknod(Q,R,0),Y=!0;if(!v)throw new L.ErrnoError(44);if(L.isChrdev(v.mode)&&(D&=-513),D&65536&&!L.isDir(v.mode))throw new L.ErrnoError(54);if(!Y){var ie=L.mayOpen(v,D);if(ie)throw new L.ErrnoError(ie)}D&512&&!Y&&L.truncate(v,0),D&=-131713;var ce=L.createStream({node:v,path:L.getPath(v),flags:D,seekable:!0,position:0,stream_ops:v.stream_ops,ungotten:[],error:!1});return ce.stream_ops.open&&ce.stream_ops.open(ce),ce},close(Q){if(L.isClosed(Q))throw new L.ErrnoError(8);Q.getdents&&(Q.getdents=null);try{Q.stream_ops.close&&Q.stream_ops.close(Q)}catch(D){throw D}finally{L.closeStream(Q.fd)}Q.fd=null},isClosed(Q){return Q.fd===null},llseek(Q,D,R){if(L.isClosed(Q))throw new L.ErrnoError(8);if(!Q.seekable||!Q.stream_ops.llseek)throw new L.ErrnoError(70);if(R!=0&&R!=1&&R!=2)throw new L.ErrnoError(28);return Q.position=Q.stream_ops.llseek(Q,D,R),Q.ungotten=[],Q.position},read(Q,D,R,v,U){if(v<0||U<0)throw new L.ErrnoError(28);if(L.isClosed(Q))throw new L.ErrnoError(8);if((Q.flags&2097155)===1)throw new L.ErrnoError(8);if(L.isDir(Q.node.mode))throw new L.ErrnoError(31);if(!Q.stream_ops.read)throw new L.ErrnoError(28);var Y=typeof U<"u";if(!Y)U=Q.position;else if(!Q.seekable)throw new L.ErrnoError(70);var ie=Q.stream_ops.read(Q,D,R,v,U);return Y||(Q.position+=ie),ie},write(Q,D,R,v,U,Y){if(v<0||U<0)throw new L.ErrnoError(28);if(L.isClosed(Q))throw new L.ErrnoError(8);if((Q.flags&2097155)===0)throw new L.ErrnoError(8);if(L.isDir(Q.node.mode))throw new L.ErrnoError(31);if(!Q.stream_ops.write)throw new L.ErrnoError(28);Q.seekable&&Q.flags&1024&&L.llseek(Q,0,2);var ie=typeof U<"u";if(!ie)U=Q.position;else if(!Q.seekable)throw new L.ErrnoError(70);var ce=Q.stream_ops.write(Q,D,R,v,U,Y);return ie||(Q.position+=ce),ce},allocate(Q,D,R){if(L.isClosed(Q))throw new L.ErrnoError(8);if(D<0||R<=0)throw new L.ErrnoError(28);if((Q.flags&2097155)===0)throw new L.ErrnoError(8);if(!L.isFile(Q.node.mode)&&!L.isDir(Q.node.mode))throw new L.ErrnoError(43);if(!Q.stream_ops.allocate)throw new L.ErrnoError(138);Q.stream_ops.allocate(Q,D,R)},mmap(Q,D,R,v,U){if((v&2)!==0&&(U&2)===0&&(Q.flags&2097155)!==2)throw new L.ErrnoError(2);if((Q.flags&2097155)===1)throw new L.ErrnoError(2);if(!Q.stream_ops.mmap)throw new L.ErrnoError(43);if(!D)throw new L.ErrnoError(28);return Q.stream_ops.mmap(Q,D,R,v,U)},msync(Q,D,R,v,U){return Q.stream_ops.msync?Q.stream_ops.msync(Q,D,R,v,U):0},ioctl(Q,D,R){if(!Q.stream_ops.ioctl)throw new L.ErrnoError(59);return Q.stream_ops.ioctl(Q,D,R)},readFile(Q,D={}){if(D.flags=D.flags||0,D.encoding=D.encoding||"binary",D.encoding!=="utf8"&&D.encoding!=="binary")throw new Error(`Invalid encoding type "${D.encoding}"`);var R,v=L.open(Q,D.flags),U=L.stat(Q),Y=U.size,ie=new Uint8Array(Y);return L.read(v,ie,0,Y,0),D.encoding==="utf8"?R=Jt(ie):D.encoding==="binary"&&(R=ie),L.close(v),R},writeFile(Q,D,R={}){R.flags=R.flags||577;var v=L.open(Q,R.flags,R.mode);if(typeof D=="string"){var U=new Uint8Array(Re(D)+1),Y=wt(D,U,0,U.length);L.write(v,U,0,Y,void 0,R.canOwn)}else if(ArrayBuffer.isView(D))L.write(v,D,0,D.byteLength,void 0,R.canOwn);else throw new Error("Unsupported data type");L.close(v)},cwd:()=>L.currentPath,chdir(Q){var D=L.lookupPath(Q,{follow:!0});if(D.node===null)throw new L.ErrnoError(44);if(!L.isDir(D.node.mode))throw new L.ErrnoError(54);var R=L.nodePermissions(D.node,"x");if(R)throw new L.ErrnoError(R);L.currentPath=D.path},createDefaultDirectories(){L.mkdir("/tmp"),L.mkdir("/home"),L.mkdir("/home/web_user")},createDefaultDevices(){L.mkdir("/dev"),L.registerDevice(L.makedev(1,3),{read:()=>0,write:(v,U,Y,ie,ce)=>ie}),L.mkdev("/dev/null",L.makedev(1,3)),Bt.register(L.makedev(5,0),Bt.default_tty_ops),Bt.register(L.makedev(6,0),Bt.default_tty1_ops),L.mkdev("/dev/tty",L.makedev(5,0)),L.mkdev("/dev/tty1",L.makedev(6,0));var Q=new Uint8Array(1024),D=0,R=()=>(D===0&&(D=pA(Q).byteLength),Q[--D]);L.createDevice("/dev","random",R),L.createDevice("/dev","urandom",R),L.mkdir("/dev/shm"),L.mkdir("/dev/shm/tmp")},createSpecialDirectories(){L.mkdir("/proc");var Q=L.mkdir("/proc/self");L.mkdir("/proc/self/fd"),L.mount({mount(){var D=L.createNode(Q,"fd",16895,73);return D.node_ops={lookup(R,v){var U=+v,Y=L.getStreamChecked(U),ie={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>Y.path}};return ie.parent=ie,ie}},D}},{},"/proc/self/fd")},createStandardStreams(Q,D,R){Q?L.createDevice("/dev","stdin",Q):L.symlink("/dev/tty","/dev/stdin"),D?L.createDevice("/dev","stdout",null,D):L.symlink("/dev/tty","/dev/stdout"),R?L.createDevice("/dev","stderr",null,R):L.symlink("/dev/tty1","/dev/stderr"),L.open("/dev/stdin",0),L.open("/dev/stdout",1),L.open("/dev/stderr",1)},staticInit(){[44].forEach(Q=>{L.genericErrors[Q]=new L.ErrnoError(Q),L.genericErrors[Q].stack=""}),L.nameTable=new Array(4096),L.mount(HA,{},"/"),L.createDefaultDirectories(),L.createDefaultDevices(),L.createSpecialDirectories(),L.filesystems={MEMFS:HA}},init(Q,D,R){L.initialized=!0,L.createStandardStreams(Q,D,R)},quit(){L.initialized=!1;for(var Q=0;Qthis.length-1||RA<0)){var jA=RA%this.chunkSize,rn=RA/this.chunkSize|0;return this.getter(rn)[jA]}}setDataGetter(RA){this.getter=RA}cacheLength(){var RA=new XMLHttpRequest;if(RA.open("HEAD",R,!1),RA.send(null),!(RA.status>=200&&RA.status<300||RA.status===304))throw new Error("Couldn't load "+R+". Status: "+RA.status);var jA=Number(RA.getResponseHeader("Content-length")),rn,j=(rn=RA.getResponseHeader("Accept-Ranges"))&&rn==="bytes",Ee=(rn=RA.getResponseHeader("Content-Encoding"))&&rn==="gzip",qe=1024*1024;j||(qe=jA);var kA=(wA,yt)=>{if(wA>yt)throw new Error("invalid range ("+wA+", "+yt+") or no bytes requested!");if(yt>jA-1)throw new Error("only "+jA+" bytes available! programmer error!");var at=new XMLHttpRequest;if(at.open("GET",R,!1),jA!==qe&&at.setRequestHeader("Range","bytes="+wA+"-"+yt),at.responseType="arraybuffer",at.overrideMimeType&&at.overrideMimeType("text/plain; charset=x-user-defined"),at.send(null),!(at.status>=200&&at.status<300||at.status===304))throw new Error("Couldn't load "+R+". Status: "+at.status);return at.response!==void 0?new Uint8Array(at.response||[]):st(at.responseText||"",!0)},MA=this;MA.setDataGetter(wA=>{var yt=wA*qe,at=(wA+1)*qe-1;if(at=Math.min(at,jA-1),typeof MA.chunks[wA]>"u"&&(MA.chunks[wA]=kA(yt,at)),typeof MA.chunks[wA]>"u")throw new Error("doXHR failed!");return MA.chunks[wA]}),(Ee||!jA)&&(qe=jA=1,jA=this.getter(0).length,qe=jA,I("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=jA,this._chunkSize=qe,this.lengthKnown=!0}get length(){return this.lengthKnown||this.cacheLength(),this._length}get chunkSize(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}if(typeof XMLHttpRequest<"u"){throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var ie,ce}else var ce={isDevice:!1,url:R};var Le=L.createFile(Q,D,ce,v,U);ce.contents?Le.contents=ce.contents:ce.url&&(Le.contents=null,Le.url=ce.url),Object.defineProperties(Le,{usedBytes:{get:function(){return this.contents.length}}});var CA={},hA=Object.keys(Le.stream_ops);hA.forEach(et=>{var RA=Le.stream_ops[et];CA[et]=(...jA)=>(L.forceLoadFile(Le),RA(...jA))});function it(et,RA,jA,rn,j){var Ee=et.node.contents;if(j>=Ee.length)return 0;var qe=Math.min(Ee.length-j,rn);if(Ee.slice)for(var kA=0;kA(L.forceLoadFile(Le),it(et,RA,jA,rn,j)),CA.mmap=(et,RA,jA,rn,j)=>{L.forceLoadFile(Le);var Ee=dn(RA);if(!Ee)throw new L.ErrnoError(48);return it(et,S,Ee,RA,jA),{ptr:Ee,allocated:!0}},Le.stream_ops=CA,Le}},ct={DEFAULT_POLLMASK:5,calculateAt(Q,D,R){if(de.isAbs(D))return D;var v;if(Q===-100)v=L.cwd();else{var U=ct.getStreamFromFD(Q);v=U.path}if(D.length==0){if(!R)throw new L.ErrnoError(44);return v}return de.join2(v,D)},doStat(Q,D,R){var v=Q(D);K[R>>2]=v.dev,K[R+4>>2]=v.mode,J[R+8>>2]=v.nlink,K[R+12>>2]=v.uid,K[R+16>>2]=v.gid,K[R+20>>2]=v.rdev,H[R+24>>3]=BigInt(v.size),K[R+32>>2]=4096,K[R+36>>2]=v.blocks;var U=v.atime.getTime(),Y=v.mtime.getTime(),ie=v.ctime.getTime();return H[R+40>>3]=BigInt(Math.floor(U/1e3)),J[R+48>>2]=U%1e3*1e3*1e3,H[R+56>>3]=BigInt(Math.floor(Y/1e3)),J[R+64>>2]=Y%1e3*1e3*1e3,H[R+72>>3]=BigInt(Math.floor(ie/1e3)),J[R+80>>2]=ie%1e3*1e3*1e3,H[R+88>>3]=BigInt(v.ino),0},doMsync(Q,D,R,v,U){if(!L.isFile(D.node.mode))throw new L.ErrnoError(43);if(v&2)return 0;var Y=w.slice(Q,Q+R);L.msync(D,Y,U,R,v)},getStreamFromFD(Q){var D=L.getStreamChecked(Q);return D},varargs:void 0,getStr(Q){var D=KA(Q);return D}};function Di(Q,D,R,v){try{if(D=ct.getStr(D),D=ct.calculateAt(Q,D),R&-8)return-28;var U=L.lookupPath(D,{follow:!0}),Y=U.node;if(!Y)return-44;var ie="";return R&4&&(ie+="r"),R&2&&(ie+="w"),R&1&&(ie+="x"),ie&&L.nodePermissions(Y,ie)?-2:0}catch(ce){if(typeof L>"u"||ce.name!=="ErrnoError")throw ce;return-ce.errno}}function mn(){var Q=K[+ct.varargs>>2];return ct.varargs+=4,Q}var pn=mn;function so(Q,D,R){ct.varargs=R;try{var v=ct.getStreamFromFD(Q);switch(D){case 0:{var U=mn();if(U<0)return-28;for(;L.streams[U];)U++;var Y;return Y=L.dupStream(v,U),Y.fd}case 1:case 2:return 0;case 3:return v.flags;case 4:{var U=mn();return v.flags|=U,0}case 12:{var U=pn(),ie=0;return _[U+ie>>1]=2,0}case 13:case 14:return 0}return-28}catch(ce){if(typeof L>"u"||ce.name!=="ErrnoError")throw ce;return-ce.errno}}function $o(Q,D){try{var R=ct.getStreamFromFD(Q);return ct.doStat(L.stat,R.path,D)}catch(v){if(typeof L>"u"||v.name!=="ErrnoError")throw v;return-v.errno}}function Ao(Q,D,R){ct.varargs=R;try{var v=ct.getStreamFromFD(Q);switch(D){case 21509:return v.tty?0:-59;case 21505:{if(!v.tty)return-59;if(v.tty.ops.ioctl_tcgets){var U=v.tty.ops.ioctl_tcgets(v),Y=pn();K[Y>>2]=U.c_iflag||0,K[Y+4>>2]=U.c_oflag||0,K[Y+8>>2]=U.c_cflag||0,K[Y+12>>2]=U.c_lflag||0;for(var ie=0;ie<32;ie++)S[Y+ie+17]=U.c_cc[ie]||0;return 0}return 0}case 21510:case 21511:case 21512:return v.tty?0:-59;case 21506:case 21507:case 21508:{if(!v.tty)return-59;if(v.tty.ops.ioctl_tcsets){for(var Y=pn(),ce=K[Y>>2],Le=K[Y+4>>2],CA=K[Y+8>>2],hA=K[Y+12>>2],it=[],ie=0;ie<32;ie++)it.push(S[Y+ie+17]);return v.tty.ops.ioctl_tcsets(v.tty,D,{c_iflag:ce,c_oflag:Le,c_cflag:CA,c_lflag:hA,c_cc:it})}return 0}case 21519:{if(!v.tty)return-59;var Y=pn();return K[Y>>2]=0,0}case 21520:return v.tty?-28:-59;case 21531:{var Y=pn();return L.ioctl(v,D,Y)}case 21523:{if(!v.tty)return-59;if(v.tty.ops.ioctl_tiocgwinsz){var et=v.tty.ops.ioctl_tiocgwinsz(v.tty),Y=pn();_[Y>>1]=et[0],_[Y+2>>1]=et[1]}return 0}case 21524:return v.tty?0:-59;case 21515:return v.tty?0:-59;default:return-28}}catch(RA){if(typeof L>"u"||RA.name!=="ErrnoError")throw RA;return-RA.errno}}function Fn(Q,D,R,v){try{D=ct.getStr(D);var U=v&256,Y=v&4096;return v=v&-6401,D=ct.calculateAt(Q,D,Y),ct.doStat(U?L.lstat:L.stat,D,R)}catch(ie){if(typeof L>"u"||ie.name!=="ErrnoError")throw ie;return-ie.errno}}function Qr(Q,D,R,v){ct.varargs=v;try{D=ct.getStr(D),D=ct.calculateAt(Q,D);var U=v?mn():0;return L.open(D,R,U).fd}catch(Y){if(typeof L>"u"||Y.name!=="ErrnoError")throw Y;return-Y.errno}}function mr(Q,D){try{return Q=ct.getStr(Q),ct.doStat(L.stat,Q,D)}catch(R){if(typeof L>"u"||R.name!=="ErrnoError")throw R;return-R.errno}}var zo=()=>{He("")},On=Q=>Q%4===0&&(Q%100!==0||Q%400===0),ho=[0,31,60,91,121,152,182,213,244,274,305,335],sA=[0,31,59,90,120,151,181,212,243,273,304,334],_i=Q=>{var D=On(Q.getFullYear()),R=D?ho:sA,v=R[Q.getMonth()]+Q.getDate()-1;return v},Zi=9007199254740992,Jn=-9007199254740992,Bo=Q=>QZi?NaN:Number(Q);function pr(Q,D){Q=Bo(Q);var R=new Date(Q*1e3);K[D>>2]=R.getSeconds(),K[D+4>>2]=R.getMinutes(),K[D+8>>2]=R.getHours(),K[D+12>>2]=R.getDate(),K[D+16>>2]=R.getMonth(),K[D+20>>2]=R.getFullYear()-1900,K[D+24>>2]=R.getDay();var v=_i(R)|0;K[D+28>>2]=v,K[D+36>>2]=-(R.getTimezoneOffset()*60);var U=new Date(R.getFullYear(),0,1),Y=new Date(R.getFullYear(),6,1).getTimezoneOffset(),ie=U.getTimezoneOffset(),ce=(Y!=ie&&R.getTimezoneOffset()==Math.min(ie,Y))|0;K[D+32>>2]=ce}function Mi(Q,D,R,v,U,Y,ie){U=Bo(U);try{if(isNaN(U))return 61;var ce=ct.getStreamFromFD(v),Le=L.mmap(ce,Q,U,D,R),CA=Le.ptr;return K[Y>>2]=Le.allocated,J[ie>>2]=CA,0}catch(hA){if(typeof L>"u"||hA.name!=="ErrnoError")throw hA;return-hA.errno}}function Mo(Q,D,R,v,U,Y){Y=Bo(Y);try{var ie=ct.getStreamFromFD(U);R&2&&ct.doMsync(Q,ie,D,v,Y)}catch(ce){if(typeof L>"u"||ce.name!=="ErrnoError")throw ce;return-ce.errno}}var wr=(Q,D,R)=>wt(Q,w,D,R),yr=(Q,D,R,v)=>{var U=new Date().getFullYear(),Y=new Date(U,0,1),ie=new Date(U,6,1),ce=Y.getTimezoneOffset(),Le=ie.getTimezoneOffset(),CA=Math.max(ce,Le);J[Q>>2]=CA*60,K[D>>2]=+(ce!=Le);var hA=RA=>{var jA=RA>=0?"-":"+",rn=Math.abs(RA),j=String(Math.floor(rn/60)).padStart(2,"0"),Ee=String(rn%60).padStart(2,"0");return`UTC${jA}${j}${Ee}`},it=hA(ce),et=hA(Le);LeDate.now(),Mn=()=>2147483648,wn=Q=>{var D=b.buffer,R=(Q-D.byteLength+65535)/65536|0;try{return b.grow(R),Z(),1}catch{}},Ft=Q=>{var D=w.length;Q>>>=0;var R=Mn();if(Q>R)return!1;for(var v=1;v<=4;v*=2){var U=D*(1+.2/v);U=Math.min(U,Q+100663296);var Y=Math.min(R,Qn(Math.max(Q,U),65536)),ie=wn(Y);if(ie)return!0}return!1},Yn={},Me=()=>a,gA=()=>{if(!gA.strings){var Q=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",D={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:Q,_:Me()};for(var R in Yn)Yn[R]===void 0?delete D[R]:D[R]=Yn[R];var v=[];for(var R in D)v.push(`${R}=${D[R]}`);gA.strings=v}return gA.strings},EA=(Q,D)=>{for(var R=0;R{var R=0;return gA().forEach((v,U)=>{var Y=D+R;J[Q+U*4>>2]=Y,EA(v,Y),R+=v.length+1}),0},bA=(Q,D)=>{var R=gA();J[Q>>2]=R.length;var v=0;return R.forEach(U=>v+=U.length+1),J[D>>2]=v,0},fe=Q=>{c(Q,new Wt(Q))},ke=(Q,D)=>{fe(Q)},Xe=ke;function qA(Q){try{var D=ct.getStreamFromFD(Q);return L.close(D),0}catch(R){if(typeof L>"u"||R.name!=="ErrnoError")throw R;return R.errno}}var Gt=(Q,D,R,v)=>{for(var U=0,Y=0;Y>2],ce=J[D+4>>2];D+=8;var Le=L.read(Q,S,ie,ce,v);if(Le<0)return-1;if(U+=Le,Le>2]=Y,0}catch(ie){if(typeof L>"u"||ie.name!=="ErrnoError")throw ie;return ie.errno}}function Sn(Q,D,R,v){D=Bo(D);try{if(isNaN(D))return 61;var U=ct.getStreamFromFD(Q);return L.llseek(U,D,R),H[v>>3]=BigInt(U.position),U.getdents&&D===0&&R===0&&(U.getdents=null),0}catch(Y){if(typeof L>"u"||Y.name!=="ErrnoError")throw Y;return Y.errno}}var So=(Q,D,R,v)=>{for(var U=0,Y=0;Y>2],ce=J[D+4>>2];D+=8;var Le=L.write(Q,S,ie,ce,v);if(Le<0)return-1;if(U+=Le,Le>2]=Y,0}catch(ie){if(typeof L>"u"||ie.name!=="ErrnoError")throw ie;return ie.errno}}var on=Q=>{var D=i["_"+Q];return D},Tt=(Q,D)=>{S.set(Q,D)},Xi=Q=>io(Q),to=Q=>{var D=Re(Q)+1,R=Xi(D);return wr(Q,R,D),R},vt=(Q,D,R,v,U)=>{var Y={string:jA=>{var rn=0;return jA!=null&&jA!==0&&(rn=to(jA)),rn},array:jA=>{var rn=Xi(jA.length);return Tt(jA,rn),rn}};function ie(jA){return D==="string"?KA(jA):D==="boolean"?!!jA:jA}var ce=on(Q),Le=[],CA=0;if(v)for(var hA=0;hA(i._viz_set_y_invert=ZA.A)(Q),i._viz_set_reduce=Q=>(i._viz_set_reduce=ZA.B)(Q),i._viz_get_graphviz_version=()=>(i._viz_get_graphviz_version=ZA.C)(),i._free=Q=>(i._free=ZA.D)(Q),i._malloc=Q=>(i._malloc=ZA.E)(Q),i._viz_get_plugin_list=Q=>(i._viz_get_plugin_list=ZA.G)(Q),i._viz_create_graph=(Q,D,R)=>(i._viz_create_graph=ZA.H)(Q,D,R),i._viz_read_one_graph=Q=>(i._viz_read_one_graph=ZA.I)(Q),i._viz_string_dup=(Q,D)=>(i._viz_string_dup=ZA.J)(Q,D),i._viz_string_dup_html=(Q,D)=>(i._viz_string_dup_html=ZA.K)(Q,D),i._viz_string_free=(Q,D)=>(i._viz_string_free=ZA.L)(Q,D),i._viz_string_free_html=(Q,D)=>(i._viz_string_free_html=ZA.M)(Q,D),i._viz_add_node=(Q,D)=>(i._viz_add_node=ZA.N)(Q,D),i._viz_add_edge=(Q,D,R)=>(i._viz_add_edge=ZA.O)(Q,D,R),i._viz_add_subgraph=(Q,D)=>(i._viz_add_subgraph=ZA.P)(Q,D),i._viz_set_default_graph_attribute=(Q,D,R)=>(i._viz_set_default_graph_attribute=ZA.Q)(Q,D,R),i._viz_set_default_node_attribute=(Q,D,R)=>(i._viz_set_default_node_attribute=ZA.R)(Q,D,R),i._viz_set_default_edge_attribute=(Q,D,R)=>(i._viz_set_default_edge_attribute=ZA.S)(Q,D,R),i._viz_set_attribute=(Q,D,R)=>(i._viz_set_attribute=ZA.T)(Q,D,R),i._viz_free_graph=Q=>(i._viz_free_graph=ZA.U)(Q),i._viz_create_context=()=>(i._viz_create_context=ZA.V)(),i._viz_free_context=Q=>(i._viz_free_context=ZA.W)(Q),i._viz_layout=(Q,D,R)=>(i._viz_layout=ZA.X)(Q,D,R),i._viz_free_layout=(Q,D)=>(i._viz_free_layout=ZA.Y)(Q,D),i._viz_reset_errors=()=>(i._viz_reset_errors=ZA.Z)(),i._viz_render=(Q,D,R)=>(i._viz_render=ZA._)(Q,D,R);var Ri=(Q,D)=>(Ri=ZA.$)(Q,D),Ki=Q=>(Ki=ZA.aa)(Q),io=Q=>(io=ZA.ba)(Q),lr=()=>(lr=ZA.ca)();i.ccall=vt,i.getValue=BA,i.PATH=de,i.UTF8ToString=KA,i.stringToUTF8=wr,i.lengthBytesUTF8=Re,i.FS=L;var ri,fs;Te=function Q(){ri||Eo(),ri||(Te=Q)};function Eo(){if(me>0||!fs&&(fs=1,X(),me>0))return;function Q(){ri||(ri=1,i.calledRun=1,!k&&(ue(),n(i),oe()))}Q()}return Eo(),e=r,e}})(),QBe=[[/^Error: (.*)/,"error"],[/^Warning: (.*)/,"warning"]];function kgA(t){return t.map(A=>{for(let e=0;e{if(typeof e.name!="string")throw new Error("image name must be a string");if(typeof e.width!="number"&&typeof e.width!="string")throw new Error("image width must be a number or string");if(typeof e.height!="number"&&typeof e.height!="string")throw new Error("image height must be a number or string");let i=t.PATH.join("/",e.name),n=` + +`;return t.FS.createPath("/",t.PATH.dirname(i)),t.FS.writeFile(i,n),i}):[]}function NgA(t,A){for(let e of A)t.FS.analyzePath(e).exists&&t.FS.unlink(e)}function LgA(t,A,e){let i;try{let n=t.lengthBytesUTF8(A);return i=t.ccall("malloc","number",["number"],[n+1]),t.stringToUTF8(A,i,n+1),t.ccall("viz_read_one_graph","number",["number"],[i])}finally{i&&t.ccall("free","number",["number"],[i])}}function FgA(t,A,e){let i=t.ccall("viz_create_graph","number",["string","number","number"],[A.name,typeof A.directed<"u"?A.directed:!0,typeof A.strict<"u"?A.strict:!1]);return yBe(t,i,A),i}function yBe(t,A,e){DBe(t,A,e),e.nodes&&e.nodes.forEach(i=>{let n=t.ccall("viz_add_node","number",["number","string"],[A,String(i.name)]);i.attributes&&wBe(t,A,n,i.attributes)}),e.edges&&e.edges.forEach(i=>{let n=t.ccall("viz_add_edge","number",["number","string","string"],[A,String(i.tail),String(i.head)]);i.attributes&&wBe(t,A,n,i.attributes)}),e.subgraphs&&e.subgraphs.forEach(i=>{let n=t.ccall("viz_add_subgraph","number",["number","string"],[A,String(i.name)]);yBe(t,n,i)})}function DBe(t,A,e){if(e.graphAttributes)for(let[i,n]of Object.entries(e.graphAttributes))nk(t,A,n,o=>{t.ccall("viz_set_default_graph_attribute","number",["number","string","number"],[A,i,o])});if(e.nodeAttributes)for(let[i,n]of Object.entries(e.nodeAttributes))nk(t,A,n,o=>{t.ccall("viz_set_default_node_attribute","number",["number","string","number"],[A,i,o])});if(e.edgeAttributes)for(let[i,n]of Object.entries(e.edgeAttributes))nk(t,A,n,o=>{t.ccall("viz_set_default_edge_attribute","number",["number","string","number"],[A,i,o])})}function wBe(t,A,e,i){for(let[n,o]of Object.entries(i))nk(t,A,o,r=>{t.ccall("viz_set_attribute","number",["number","string","number"],[e,n,r])})}function nk(t,A,e,i){let n;if(typeof e=="object"&&"html"in e?n=t.ccall("viz_string_dup_html","number",["number","string"],[A,String(e.html)]):n=t.ccall("viz_string_dup","number",["number","string"],[A,String(e)]),n==0)throw new Error("couldn't dup string");i(n),typeof e=="object"&&"html"in e?t.ccall("viz_string_free_html","number",["number","number"],[A,n]):t.ccall("viz_string_free","number",["number","number"],[A,n])}var Hz=class{constructor(A){this.module=A}get graphvizVersion(){return _gA(this.module)}get formats(){return mBe(this.module,"device")}get engines(){return mBe(this.module,"layout")}renderFormats(A,e,i={}){return pBe(this.module,A,e,ae({engine:"dot"},i))}render(A,e={}){let i;e.format===void 0?i="dot":i=e.format;let n=pBe(this.module,A,[i],ae({engine:"dot"},e));return n.status==="success"&&(n.output=n.output[i]),n}renderString(A,e={}){let i=this.render(A,e);if(i.status!=="success")throw new Error(i.errors.find(n=>n.level=="error")?.message||"render failed");return i.output}renderSVGElement(A,e={}){let i=this.renderString(A,_A(ae({},e),{format:"svg"}));return new DOMParser().parseFromString(i,"image/svg+xml").documentElement}renderJSON(A,e={}){let i=this.renderString(A,_A(ae({},e),{format:"json"}));return JSON.parse(i)}};function vBe(){return SgA().then(t=>new Hz(t))}var ok=class t{render(A){return Ci(this,null,function*(){let e={format:"svg",engine:"dot"};return(yield vBe()).renderString(A,e)})}static \u0275fac=function(e){return new(e||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})};var rk=new re("AudioPlayingService");var sk=new re("VideoService");var ak=new re("WebSocketService");var ck=class t{createMessagePartFromFile(A){return Ci(this,null,function*(){return{inlineData:{displayName:A.name,data:yield this.readFileAsBytes(A),mimeType:A.type}}})}readFileAsBytes(A){return new Promise((e,i)=>{let n=new FileReader;n.onload=o=>{let r=o.target.result.split(",")[1];e(r)},n.onerror=i,n.readAsDataURL(A)})}static \u0275fac=function(e){return new(e||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})};var lk=class t extends o9{createFunctionResponse(A,e,i){return{function_response:{id:A,name:e,response:{response:i}}}}static \u0275fac=(()=>{let A;return function(i){return(A||(A=ii(t)))(i||t)}})();static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})};var gk=class t extends BD{sanitizer=E(dl);windowOpen(A,e,i,n){return A.open(e,i,n)}createObjectUrl(A){return URL.createObjectURL(A)}openBlobUrl(A){let e=this.createObjectUrl(A);return this.windowOpen(window,e,"_blank")}setAnchorHref(A,e){A.href=e}bypassSecurityTrustHtml(A){return this.sanitizer.bypassSecurityTrustHtml(A)}static \u0275fac=(()=>{let A;return function(i){return(A||(A=ii(t)))(i||t)}})();static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})};var dk=class t{constructor(A){this.http=A}apiServerDomain=oa.getApiServerBaseUrl();createSession(A,e){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${e}/users/${A}/sessions`;return this.http.post(i,null)}return new nt}listSessions(A,e){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${e}/users/${A}/sessions`;return this.http.get(i)}return new nt}deleteSession(A,e,i){let n=this.apiServerDomain+`/apps/${e}/users/${A}/sessions/${i}`;return this.http.delete(n)}getSession(A,e,i){let n=this.apiServerDomain+`/apps/${e}/users/${A}/sessions/${i}`;return this.http.get(n)}importSession(A,e,i){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/apps/${e}/users/${A}/sessions`;return this.http.post(n,{appName:e,userId:A,events:i})}return new nt}canEdit(A,e){return dA(!0)}static \u0275fac=function(e){return new(e||t)(UA(wa))};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})};var Ck=class t{audioRecordingService=E(ZS);videoService=E(sk);webSocketService=E(ak);audioIntervalId=void 0;videoIntervalId=void 0;constructor(){}startAudioChat(n){return Ci(this,arguments,function*({appName:A,userId:e,sessionId:i}){let o=window.location.protocol==="https:"?"wss":"ws";this.webSocketService.connect(`${o}://${oa.getWSServerUrl()}/run_live?app_name=${A}&user_id=${e}&session_id=${i}`),yield this.startAudioStreaming()})}stopAudioChat(){this.stopAudioStreaming(),this.webSocketService.closeConnection()}startAudioStreaming(){return Ci(this,null,function*(){try{yield this.audioRecordingService.startRecording(),this.audioIntervalId=setInterval(()=>this.sendBufferedAudio(),250)}catch(A){console.error("Error accessing microphone:",A)}})}stopAudioStreaming(){clearInterval(this.audioIntervalId),this.audioIntervalId=void 0,this.audioRecordingService.stopRecording()}sendBufferedAudio(){let A=this.audioRecordingService.getCombinedAudioBuffer();if(!A)return;let e={blob:{mime_type:"audio/pcm",data:A}};this.webSocketService.sendMessage(e),this.audioRecordingService.cleanAudioBuffer()}startVideoChat(o){return Ci(this,arguments,function*({appName:A,userId:e,sessionId:i,videoContainer:n}){let r=window.location.protocol==="https:"?"wss":"ws";this.webSocketService.connect(`${r}://${oa.getWSServerUrl()}/run_live?app_name=${A}&user_id=${e}&session_id=${i}`),yield this.startAudioStreaming(),yield this.startVideoStreaming(n)})}stopVideoChat(A){this.stopAudioStreaming(),this.stopVideoStreaming(A),this.webSocketService.closeConnection()}startVideoStreaming(A){return Ci(this,null,function*(){try{yield this.videoService.startRecording(A),this.videoIntervalId=setInterval(()=>Ci(this,null,function*(){return yield this.sendCapturedFrame()}),1e3)}catch(e){console.error("Error accessing camera:",e)}})}sendCapturedFrame(){return Ci(this,null,function*(){let A=yield this.videoService.getCapturedFrame();if(!A)return;let e={blob:{mime_type:"image/jpeg",data:A}};this.webSocketService.sendMessage(e)})}stopVideoStreaming(A){clearInterval(this.videoIntervalId),this.videoIntervalId=void 0,this.videoService.stopRecording(A)}onStreamClose(){return this.webSocketService.onCloseReason()}closeStream(){this.webSocketService.closeConnection()}static \u0275fac=function(e){return new(e||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})};var YEe=JQ(JEe());var uk=class t{stc(A){return(0,YEe.default)(A)}static \u0275fac=function(e){return new(e||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})};var hk=class t{selectedTraceRowSource=new Mt(void 0);selectedTraceRow$=this.selectedTraceRowSource.asObservable();eventDataSource=new Mt(void 0);eventData$=this.eventDataSource.asObservable();hoveredMessageIndicesSource=new Mt([]);hoveredMessageIndices$=this.hoveredMessageIndicesSource.asObservable();messagesSource=new Mt([]);messages$=this.messagesSource.asObservable();selectedRow(A){this.selectedTraceRowSource.next(A)}setEventData(A){this.eventDataSource.next(A)}setMessages(A){this.messagesSource.next(A)}setHoveredMessages(A,e){if(!A){this.hoveredMessageIndicesSource.next([]);return}let i=A.attributes,n=i&&i["gcp.vertex.agent.event_id"],o=0,r=[];for(let s of this.messagesSource.value){if(s.role=="user"){o++;continue}if(this.eventDataSource.value?.get(s.eventId).invocationId!=e){o++;continue}if(n)if(i["gcp.vertex.agent.event_id"]==s.eventId){r.push(o),o++;continue}else{o++;continue}else{r.push(o),o++;continue}}this.hoveredMessageIndicesSource.next(r)}resetTraceService(){this.eventDataSource.next(void 0),this.messagesSource.next([]),this.hoveredMessageIndicesSource.next([])}static \u0275fac=function(e){return new(e||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})};var Bk=class t{mediaRecorder;stream;renderer;videoElement;videoBuffer=[];constructor(A){this.renderer=A.createRenderer(null,null)}createVideoElement(A){A?.nativeElement&&(this.clearVideoElement(A),this.videoElement=this.renderer.createElement("video"),this.renderer.setAttribute(this.videoElement,"width","400"),this.renderer.setAttribute(this.videoElement,"height","300"),this.renderer.setAttribute(this.videoElement,"autoplay","true"),this.renderer.setAttribute(this.videoElement,"muted","true"),this.renderer.appendChild(A.nativeElement,this.videoElement))}startRecording(A){return Ci(this,null,function*(){this.createVideoElement(A);try{this.stream=yield navigator.mediaDevices.getUserMedia({video:!0}),this.videoElement&&(this.videoElement.srcObject=this.stream),this.mediaRecorder=new MediaRecorder(this.stream,{mimeType:"video/webm"}),this.mediaRecorder.start(1e3)}catch(e){console.error("Error accessing camera/microphone:",e)}})}getCapturedFrame(){return Ci(this,null,function*(){try{let A=yield this.captureFrame();return this.blobToUint8Array(A)}catch(A){console.error("Error capturing frame:",A);return}})}blobToUint8Array(A){return Ci(this,null,function*(){let e=yield A.arrayBuffer();return new Uint8Array(e)})}captureFrame(){return Ci(this,null,function*(){return new Promise((A,e)=>{try{if(!this.videoElement){e(new Error("Video element not available"));return}let i=document.createElement("canvas");i.width=this.videoElement.videoWidth,i.height=this.videoElement.videoHeight;let n=i.getContext("2d");if(!n){e(new Error("Canvas context not supported"));return}n.drawImage(this.videoElement,0,0,i.width,i.height),i.toBlob(o=>{o?A(o):e(new Error("Failed to create image blob"))},"image/png")}catch(i){e(i)}})})}stopRecording(A){this.mediaRecorder&&this.mediaRecorder.stop(),this.stream&&this.stream.getTracks().forEach(e=>e.stop()),this.clearVideoElement(A)}clearVideoElement(A){let e=A.nativeElement.querySelector("video");e&&this.renderer.removeChild(A.nativeElement,e)}static \u0275fac=function(e){return new(e||t)(UA(fa))};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})};var OdA={url:"",deserializer:t=>JSON.parse(t.data),serializer:t=>JSON.stringify(t)},JdA="WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }",o8=class t extends Th{constructor(A,e){if(super(),this._socket=null,A instanceof nt)this.destination=e,this.source=A;else{let i=this._config=Object.assign({},OdA);if(this._output=new je,typeof A=="string")i.url=A;else for(let n in A)A.hasOwnProperty(n)&&(i[n]=A[n]);if(!i.WebSocketCtor&&WebSocket)i.WebSocketCtor=WebSocket;else if(!i.WebSocketCtor)throw new Error("no WebSocket constructor can be found");this.destination=new Zc}}lift(A){let e=new t(this._config,this.destination);return e.operator=A,e.source=this,e}_resetState(){this._socket=null,this.source||(this.destination=new Zc),this._output=new je}multiplex(A,e,i){let n=this;return new nt(o=>{try{n.next(A())}catch(s){o.error(s)}let r=n.subscribe({next:s=>{try{i(s)&&o.next(s)}catch(a){o.error(a)}},error:s=>o.error(s),complete:()=>o.complete()});return()=>{try{n.next(e())}catch(s){o.error(s)}r.unsubscribe()}})}_connectSocket(){let{WebSocketCtor:A,protocol:e,url:i,binaryType:n}=this._config,o=this._output,r=null;try{r=e?new A(i,e):new A(i),this._socket=r,n&&(this._socket.binaryType=n)}catch(a){o.error(a);return}let s=new Ot(()=>{this._socket=null,r&&r.readyState===1&&r.close()});r.onopen=a=>{let{_socket:c}=this;if(!c){r.close(),this._resetState();return}let{openObserver:l}=this._config;l&&l.next(a);let d=this.destination;this.destination=Wd.create(C=>{if(r.readyState===1)try{let{serializer:I}=this._config;r.send(I(C))}catch(I){this.destination.error(I)}},C=>{let{closingObserver:I}=this._config;I&&I.next(void 0),C&&C.code?r.close(C.code,C.reason):o.error(new TypeError(JdA)),this._resetState()},()=>{let{closingObserver:C}=this._config;C&&C.next(void 0),r.close(),this._resetState()}),d&&d instanceof Zc&&s.add(d.subscribe(this.destination))},r.onerror=a=>{this._resetState(),o.error(a)},r.onclose=a=>{r===this._socket&&this._resetState();let{closeObserver:c}=this._config;c&&c.next(a),a.wasClean?o.complete():o.error(a)},r.onmessage=a=>{try{let{deserializer:c}=this._config;o.next(c(a))}catch(c){o.error(c)}}}_subscribe(A){let{source:e}=this;return e?e.subscribe(A):(this._socket||this._connectSocket(),this._output.subscribe(A),A.add(()=>{let{_socket:i}=this;this._output.observers.length===0&&(i&&(i.readyState===1||i.readyState===0)&&i.close(),this._resetState())}),A)}unsubscribe(){let{_socket:A}=this;A&&(A.readyState===1||A.readyState===0)&&A.close(),this._resetState(),super.unsubscribe()}};var Ek=class t{audioPlayingService=E(rk);socket$;messages$=new Mt("");audioBuffer=[];audioIntervalId=null;closeReasonSubject=new je;connect(A){this.socket$=new o8({url:A,serializer:e=>JSON.stringify(e),deserializer:e=>e.data,closeObserver:{next:e=>{this.emitWsCloseReason(e.reason)}}}),this.socket$.subscribe(e=>{this.handleIncomingAudio(e),this.messages$.next(e)},e=>{console.error("WebSocket error:",e)}),this.audioIntervalId=setInterval(()=>this.playIncomingAudio(),250)}playIncomingAudio(){this.audioPlayingService.playAudio(this.audioBuffer),this.audioBuffer=[]}sendMessage(A){if(A.blob.data=this.arrayBufferToBase64(A.blob.data.buffer),!this.socket$||this.socket$.closed){console.error("WebSocket is not open.");return}this.socket$.next(A)}closeConnection(){clearInterval(this.audioIntervalId),this.audioIntervalId=null,this.socket$&&this.socket$.complete()}getMessages(){return this.messages$.asObservable()}arrayBufferToBase64(A){let e="",i=new Uint8Array(A),n=i.byteLength;for(let o=0;oA&&e),za({bufferSize:1,refCount:!0}))}setIsSessionLoading(A){this._isSessionLoading.next(A)}isSessionListLoading(){return this._isSessionListLoading.pipe(e4(this.featureFlagService.isLoadingAnimationsEnabled()),aA(([A,e])=>A&&e),za({bufferSize:1,refCount:!0}))}setIsSessionListLoading(A){this._isSessionListLoading.next(A)}isEventRequestResponseLoading(){return this._isEventRequestResponseLoading.pipe(e4(this.featureFlagService.isLoadingAnimationsEnabled()),aA(([A,e])=>A&&e),za({bufferSize:1,refCount:!0}))}setIsEventRequestResponseLoading(A){this._isEventRequestResponseLoading.next(A)}static \u0275fac=function(e){return new(e||t)};static \u0275prov=be({token:t,factory:t.\u0275fac,providedIn:"root"})};fetch("./assets/config/runtime-config.json").then(t=>t.json()).then(t=>{window.runtimeConfig=t,WN(NQ,{providers:[M_(ZN,Kn,VR,zS,L1,gl,j0),{provide:rd,useClass:dk},{provide:Hl,useClass:yQ},{provide:ak,useClass:Ek},{provide:XS,useValue:"./assets/audio-processor.js"},{provide:ZS,useClass:$S},{provide:rk,useClass:WS},{provide:sk,useClass:Bk},{provide:ED,useClass:Ck},{provide:CE,useClass:tk},{provide:od,useClass:Ak},{provide:uD,useClass:qS},{provide:dE,useClass:ek},{provide:q1,useClass:hk},{provide:Ks,useClass:ik},{provide:IE,useClass:ok},{provide:uE,useClass:uk},{provide:V1,useClass:gk},{provide:hD,useClass:ck},{provide:r9,useClass:lk},{provide:vD,useValue:VS},...t.logo?[{provide:c9,useValue:jS}]:[],{provide:Ud,useClass:B9},{provide:n9,useValue:a0},F$(),Cm(),{provide:fD,useClass:Fl},{provide:zl,useClass:fk}]}).catch(A=>console.error(A))}); diff --git a/src/google/adk/cli/browser/main-W7QZBYAR.js b/src/google/adk/cli/browser/main-W7QZBYAR.js deleted file mode 100644 index fa3ca0a5f8..0000000000 --- a/src/google/adk/cli/browser/main-W7QZBYAR.js +++ /dev/null @@ -1,3914 +0,0 @@ -/** - * Copyright 2025 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import{a as rA,b as Ye,c as J7,d as Je,e as jQ,f as Ao}from"./chunk-EQDQRRRY.js";var PP=Je((X0e,OP)=>{"use strict";OP.exports=[{value:"#B0171F",name:"indian red"},{value:"#DC143C",css:!0,name:"crimson"},{value:"#FFB6C1",css:!0,name:"lightpink"},{value:"#FFAEB9",name:"lightpink 1"},{value:"#EEA2AD",name:"lightpink 2"},{value:"#CD8C95",name:"lightpink 3"},{value:"#8B5F65",name:"lightpink 4"},{value:"#FFC0CB",css:!0,name:"pink"},{value:"#FFB5C5",name:"pink 1"},{value:"#EEA9B8",name:"pink 2"},{value:"#CD919E",name:"pink 3"},{value:"#8B636C",name:"pink 4"},{value:"#DB7093",css:!0,name:"palevioletred"},{value:"#FF82AB",name:"palevioletred 1"},{value:"#EE799F",name:"palevioletred 2"},{value:"#CD6889",name:"palevioletred 3"},{value:"#8B475D",name:"palevioletred 4"},{value:"#FFF0F5",name:"lavenderblush 1"},{value:"#FFF0F5",css:!0,name:"lavenderblush"},{value:"#EEE0E5",name:"lavenderblush 2"},{value:"#CDC1C5",name:"lavenderblush 3"},{value:"#8B8386",name:"lavenderblush 4"},{value:"#FF3E96",name:"violetred 1"},{value:"#EE3A8C",name:"violetred 2"},{value:"#CD3278",name:"violetred 3"},{value:"#8B2252",name:"violetred 4"},{value:"#FF69B4",css:!0,name:"hotpink"},{value:"#FF6EB4",name:"hotpink 1"},{value:"#EE6AA7",name:"hotpink 2"},{value:"#CD6090",name:"hotpink 3"},{value:"#8B3A62",name:"hotpink 4"},{value:"#872657",name:"raspberry"},{value:"#FF1493",name:"deeppink 1"},{value:"#FF1493",css:!0,name:"deeppink"},{value:"#EE1289",name:"deeppink 2"},{value:"#CD1076",name:"deeppink 3"},{value:"#8B0A50",name:"deeppink 4"},{value:"#FF34B3",name:"maroon 1"},{value:"#EE30A7",name:"maroon 2"},{value:"#CD2990",name:"maroon 3"},{value:"#8B1C62",name:"maroon 4"},{value:"#C71585",css:!0,name:"mediumvioletred"},{value:"#D02090",name:"violetred"},{value:"#DA70D6",css:!0,name:"orchid"},{value:"#FF83FA",name:"orchid 1"},{value:"#EE7AE9",name:"orchid 2"},{value:"#CD69C9",name:"orchid 3"},{value:"#8B4789",name:"orchid 4"},{value:"#D8BFD8",css:!0,name:"thistle"},{value:"#FFE1FF",name:"thistle 1"},{value:"#EED2EE",name:"thistle 2"},{value:"#CDB5CD",name:"thistle 3"},{value:"#8B7B8B",name:"thistle 4"},{value:"#FFBBFF",name:"plum 1"},{value:"#EEAEEE",name:"plum 2"},{value:"#CD96CD",name:"plum 3"},{value:"#8B668B",name:"plum 4"},{value:"#DDA0DD",css:!0,name:"plum"},{value:"#EE82EE",css:!0,name:"violet"},{value:"#FF00FF",vga:!0,name:"magenta"},{value:"#FF00FF",vga:!0,css:!0,name:"fuchsia"},{value:"#EE00EE",name:"magenta 2"},{value:"#CD00CD",name:"magenta 3"},{value:"#8B008B",name:"magenta 4"},{value:"#8B008B",css:!0,name:"darkmagenta"},{value:"#800080",vga:!0,css:!0,name:"purple"},{value:"#BA55D3",css:!0,name:"mediumorchid"},{value:"#E066FF",name:"mediumorchid 1"},{value:"#D15FEE",name:"mediumorchid 2"},{value:"#B452CD",name:"mediumorchid 3"},{value:"#7A378B",name:"mediumorchid 4"},{value:"#9400D3",css:!0,name:"darkviolet"},{value:"#9932CC",css:!0,name:"darkorchid"},{value:"#BF3EFF",name:"darkorchid 1"},{value:"#B23AEE",name:"darkorchid 2"},{value:"#9A32CD",name:"darkorchid 3"},{value:"#68228B",name:"darkorchid 4"},{value:"#4B0082",css:!0,name:"indigo"},{value:"#8A2BE2",css:!0,name:"blueviolet"},{value:"#9B30FF",name:"purple 1"},{value:"#912CEE",name:"purple 2"},{value:"#7D26CD",name:"purple 3"},{value:"#551A8B",name:"purple 4"},{value:"#9370DB",css:!0,name:"mediumpurple"},{value:"#AB82FF",name:"mediumpurple 1"},{value:"#9F79EE",name:"mediumpurple 2"},{value:"#8968CD",name:"mediumpurple 3"},{value:"#5D478B",name:"mediumpurple 4"},{value:"#483D8B",css:!0,name:"darkslateblue"},{value:"#8470FF",name:"lightslateblue"},{value:"#7B68EE",css:!0,name:"mediumslateblue"},{value:"#6A5ACD",css:!0,name:"slateblue"},{value:"#836FFF",name:"slateblue 1"},{value:"#7A67EE",name:"slateblue 2"},{value:"#6959CD",name:"slateblue 3"},{value:"#473C8B",name:"slateblue 4"},{value:"#F8F8FF",css:!0,name:"ghostwhite"},{value:"#E6E6FA",css:!0,name:"lavender"},{value:"#0000FF",vga:!0,css:!0,name:"blue"},{value:"#0000EE",name:"blue 2"},{value:"#0000CD",name:"blue 3"},{value:"#0000CD",css:!0,name:"mediumblue"},{value:"#00008B",name:"blue 4"},{value:"#00008B",css:!0,name:"darkblue"},{value:"#000080",vga:!0,css:!0,name:"navy"},{value:"#191970",css:!0,name:"midnightblue"},{value:"#3D59AB",name:"cobalt"},{value:"#4169E1",css:!0,name:"royalblue"},{value:"#4876FF",name:"royalblue 1"},{value:"#436EEE",name:"royalblue 2"},{value:"#3A5FCD",name:"royalblue 3"},{value:"#27408B",name:"royalblue 4"},{value:"#6495ED",css:!0,name:"cornflowerblue"},{value:"#B0C4DE",css:!0,name:"lightsteelblue"},{value:"#CAE1FF",name:"lightsteelblue 1"},{value:"#BCD2EE",name:"lightsteelblue 2"},{value:"#A2B5CD",name:"lightsteelblue 3"},{value:"#6E7B8B",name:"lightsteelblue 4"},{value:"#778899",css:!0,name:"lightslategray"},{value:"#708090",css:!0,name:"slategray"},{value:"#C6E2FF",name:"slategray 1"},{value:"#B9D3EE",name:"slategray 2"},{value:"#9FB6CD",name:"slategray 3"},{value:"#6C7B8B",name:"slategray 4"},{value:"#1E90FF",name:"dodgerblue 1"},{value:"#1E90FF",css:!0,name:"dodgerblue"},{value:"#1C86EE",name:"dodgerblue 2"},{value:"#1874CD",name:"dodgerblue 3"},{value:"#104E8B",name:"dodgerblue 4"},{value:"#F0F8FF",css:!0,name:"aliceblue"},{value:"#4682B4",css:!0,name:"steelblue"},{value:"#63B8FF",name:"steelblue 1"},{value:"#5CACEE",name:"steelblue 2"},{value:"#4F94CD",name:"steelblue 3"},{value:"#36648B",name:"steelblue 4"},{value:"#87CEFA",css:!0,name:"lightskyblue"},{value:"#B0E2FF",name:"lightskyblue 1"},{value:"#A4D3EE",name:"lightskyblue 2"},{value:"#8DB6CD",name:"lightskyblue 3"},{value:"#607B8B",name:"lightskyblue 4"},{value:"#87CEFF",name:"skyblue 1"},{value:"#7EC0EE",name:"skyblue 2"},{value:"#6CA6CD",name:"skyblue 3"},{value:"#4A708B",name:"skyblue 4"},{value:"#87CEEB",css:!0,name:"skyblue"},{value:"#00BFFF",name:"deepskyblue 1"},{value:"#00BFFF",css:!0,name:"deepskyblue"},{value:"#00B2EE",name:"deepskyblue 2"},{value:"#009ACD",name:"deepskyblue 3"},{value:"#00688B",name:"deepskyblue 4"},{value:"#33A1C9",name:"peacock"},{value:"#ADD8E6",css:!0,name:"lightblue"},{value:"#BFEFFF",name:"lightblue 1"},{value:"#B2DFEE",name:"lightblue 2"},{value:"#9AC0CD",name:"lightblue 3"},{value:"#68838B",name:"lightblue 4"},{value:"#B0E0E6",css:!0,name:"powderblue"},{value:"#98F5FF",name:"cadetblue 1"},{value:"#8EE5EE",name:"cadetblue 2"},{value:"#7AC5CD",name:"cadetblue 3"},{value:"#53868B",name:"cadetblue 4"},{value:"#00F5FF",name:"turquoise 1"},{value:"#00E5EE",name:"turquoise 2"},{value:"#00C5CD",name:"turquoise 3"},{value:"#00868B",name:"turquoise 4"},{value:"#5F9EA0",css:!0,name:"cadetblue"},{value:"#00CED1",css:!0,name:"darkturquoise"},{value:"#F0FFFF",name:"azure 1"},{value:"#F0FFFF",css:!0,name:"azure"},{value:"#E0EEEE",name:"azure 2"},{value:"#C1CDCD",name:"azure 3"},{value:"#838B8B",name:"azure 4"},{value:"#E0FFFF",name:"lightcyan 1"},{value:"#E0FFFF",css:!0,name:"lightcyan"},{value:"#D1EEEE",name:"lightcyan 2"},{value:"#B4CDCD",name:"lightcyan 3"},{value:"#7A8B8B",name:"lightcyan 4"},{value:"#BBFFFF",name:"paleturquoise 1"},{value:"#AEEEEE",name:"paleturquoise 2"},{value:"#AEEEEE",css:!0,name:"paleturquoise"},{value:"#96CDCD",name:"paleturquoise 3"},{value:"#668B8B",name:"paleturquoise 4"},{value:"#2F4F4F",css:!0,name:"darkslategray"},{value:"#97FFFF",name:"darkslategray 1"},{value:"#8DEEEE",name:"darkslategray 2"},{value:"#79CDCD",name:"darkslategray 3"},{value:"#528B8B",name:"darkslategray 4"},{value:"#00FFFF",name:"cyan"},{value:"#00FFFF",css:!0,name:"aqua"},{value:"#00EEEE",name:"cyan 2"},{value:"#00CDCD",name:"cyan 3"},{value:"#008B8B",name:"cyan 4"},{value:"#008B8B",css:!0,name:"darkcyan"},{value:"#008080",vga:!0,css:!0,name:"teal"},{value:"#48D1CC",css:!0,name:"mediumturquoise"},{value:"#20B2AA",css:!0,name:"lightseagreen"},{value:"#03A89E",name:"manganeseblue"},{value:"#40E0D0",css:!0,name:"turquoise"},{value:"#808A87",name:"coldgrey"},{value:"#00C78C",name:"turquoiseblue"},{value:"#7FFFD4",name:"aquamarine 1"},{value:"#7FFFD4",css:!0,name:"aquamarine"},{value:"#76EEC6",name:"aquamarine 2"},{value:"#66CDAA",name:"aquamarine 3"},{value:"#66CDAA",css:!0,name:"mediumaquamarine"},{value:"#458B74",name:"aquamarine 4"},{value:"#00FA9A",css:!0,name:"mediumspringgreen"},{value:"#F5FFFA",css:!0,name:"mintcream"},{value:"#00FF7F",css:!0,name:"springgreen"},{value:"#00EE76",name:"springgreen 1"},{value:"#00CD66",name:"springgreen 2"},{value:"#008B45",name:"springgreen 3"},{value:"#3CB371",css:!0,name:"mediumseagreen"},{value:"#54FF9F",name:"seagreen 1"},{value:"#4EEE94",name:"seagreen 2"},{value:"#43CD80",name:"seagreen 3"},{value:"#2E8B57",name:"seagreen 4"},{value:"#2E8B57",css:!0,name:"seagreen"},{value:"#00C957",name:"emeraldgreen"},{value:"#BDFCC9",name:"mint"},{value:"#3D9140",name:"cobaltgreen"},{value:"#F0FFF0",name:"honeydew 1"},{value:"#F0FFF0",css:!0,name:"honeydew"},{value:"#E0EEE0",name:"honeydew 2"},{value:"#C1CDC1",name:"honeydew 3"},{value:"#838B83",name:"honeydew 4"},{value:"#8FBC8F",css:!0,name:"darkseagreen"},{value:"#C1FFC1",name:"darkseagreen 1"},{value:"#B4EEB4",name:"darkseagreen 2"},{value:"#9BCD9B",name:"darkseagreen 3"},{value:"#698B69",name:"darkseagreen 4"},{value:"#98FB98",css:!0,name:"palegreen"},{value:"#9AFF9A",name:"palegreen 1"},{value:"#90EE90",name:"palegreen 2"},{value:"#90EE90",css:!0,name:"lightgreen"},{value:"#7CCD7C",name:"palegreen 3"},{value:"#548B54",name:"palegreen 4"},{value:"#32CD32",css:!0,name:"limegreen"},{value:"#228B22",css:!0,name:"forestgreen"},{value:"#00FF00",vga:!0,name:"green 1"},{value:"#00FF00",vga:!0,css:!0,name:"lime"},{value:"#00EE00",name:"green 2"},{value:"#00CD00",name:"green 3"},{value:"#008B00",name:"green 4"},{value:"#008000",vga:!0,css:!0,name:"green"},{value:"#006400",css:!0,name:"darkgreen"},{value:"#308014",name:"sapgreen"},{value:"#7CFC00",css:!0,name:"lawngreen"},{value:"#7FFF00",name:"chartreuse 1"},{value:"#7FFF00",css:!0,name:"chartreuse"},{value:"#76EE00",name:"chartreuse 2"},{value:"#66CD00",name:"chartreuse 3"},{value:"#458B00",name:"chartreuse 4"},{value:"#ADFF2F",css:!0,name:"greenyellow"},{value:"#CAFF70",name:"darkolivegreen 1"},{value:"#BCEE68",name:"darkolivegreen 2"},{value:"#A2CD5A",name:"darkolivegreen 3"},{value:"#6E8B3D",name:"darkolivegreen 4"},{value:"#556B2F",css:!0,name:"darkolivegreen"},{value:"#6B8E23",css:!0,name:"olivedrab"},{value:"#C0FF3E",name:"olivedrab 1"},{value:"#B3EE3A",name:"olivedrab 2"},{value:"#9ACD32",name:"olivedrab 3"},{value:"#9ACD32",css:!0,name:"yellowgreen"},{value:"#698B22",name:"olivedrab 4"},{value:"#FFFFF0",name:"ivory 1"},{value:"#FFFFF0",css:!0,name:"ivory"},{value:"#EEEEE0",name:"ivory 2"},{value:"#CDCDC1",name:"ivory 3"},{value:"#8B8B83",name:"ivory 4"},{value:"#F5F5DC",css:!0,name:"beige"},{value:"#FFFFE0",name:"lightyellow 1"},{value:"#FFFFE0",css:!0,name:"lightyellow"},{value:"#EEEED1",name:"lightyellow 2"},{value:"#CDCDB4",name:"lightyellow 3"},{value:"#8B8B7A",name:"lightyellow 4"},{value:"#FAFAD2",css:!0,name:"lightgoldenrodyellow"},{value:"#FFFF00",vga:!0,name:"yellow 1"},{value:"#FFFF00",vga:!0,css:!0,name:"yellow"},{value:"#EEEE00",name:"yellow 2"},{value:"#CDCD00",name:"yellow 3"},{value:"#8B8B00",name:"yellow 4"},{value:"#808069",name:"warmgrey"},{value:"#808000",vga:!0,css:!0,name:"olive"},{value:"#BDB76B",css:!0,name:"darkkhaki"},{value:"#FFF68F",name:"khaki 1"},{value:"#EEE685",name:"khaki 2"},{value:"#CDC673",name:"khaki 3"},{value:"#8B864E",name:"khaki 4"},{value:"#F0E68C",css:!0,name:"khaki"},{value:"#EEE8AA",css:!0,name:"palegoldenrod"},{value:"#FFFACD",name:"lemonchiffon 1"},{value:"#FFFACD",css:!0,name:"lemonchiffon"},{value:"#EEE9BF",name:"lemonchiffon 2"},{value:"#CDC9A5",name:"lemonchiffon 3"},{value:"#8B8970",name:"lemonchiffon 4"},{value:"#FFEC8B",name:"lightgoldenrod 1"},{value:"#EEDC82",name:"lightgoldenrod 2"},{value:"#CDBE70",name:"lightgoldenrod 3"},{value:"#8B814C",name:"lightgoldenrod 4"},{value:"#E3CF57",name:"banana"},{value:"#FFD700",name:"gold 1"},{value:"#FFD700",css:!0,name:"gold"},{value:"#EEC900",name:"gold 2"},{value:"#CDAD00",name:"gold 3"},{value:"#8B7500",name:"gold 4"},{value:"#FFF8DC",name:"cornsilk 1"},{value:"#FFF8DC",css:!0,name:"cornsilk"},{value:"#EEE8CD",name:"cornsilk 2"},{value:"#CDC8B1",name:"cornsilk 3"},{value:"#8B8878",name:"cornsilk 4"},{value:"#DAA520",css:!0,name:"goldenrod"},{value:"#FFC125",name:"goldenrod 1"},{value:"#EEB422",name:"goldenrod 2"},{value:"#CD9B1D",name:"goldenrod 3"},{value:"#8B6914",name:"goldenrod 4"},{value:"#B8860B",css:!0,name:"darkgoldenrod"},{value:"#FFB90F",name:"darkgoldenrod 1"},{value:"#EEAD0E",name:"darkgoldenrod 2"},{value:"#CD950C",name:"darkgoldenrod 3"},{value:"#8B6508",name:"darkgoldenrod 4"},{value:"#FFA500",name:"orange 1"},{value:"#FF8000",css:!0,name:"orange"},{value:"#EE9A00",name:"orange 2"},{value:"#CD8500",name:"orange 3"},{value:"#8B5A00",name:"orange 4"},{value:"#FFFAF0",css:!0,name:"floralwhite"},{value:"#FDF5E6",css:!0,name:"oldlace"},{value:"#F5DEB3",css:!0,name:"wheat"},{value:"#FFE7BA",name:"wheat 1"},{value:"#EED8AE",name:"wheat 2"},{value:"#CDBA96",name:"wheat 3"},{value:"#8B7E66",name:"wheat 4"},{value:"#FFE4B5",css:!0,name:"moccasin"},{value:"#FFEFD5",css:!0,name:"papayawhip"},{value:"#FFEBCD",css:!0,name:"blanchedalmond"},{value:"#FFDEAD",name:"navajowhite 1"},{value:"#FFDEAD",css:!0,name:"navajowhite"},{value:"#EECFA1",name:"navajowhite 2"},{value:"#CDB38B",name:"navajowhite 3"},{value:"#8B795E",name:"navajowhite 4"},{value:"#FCE6C9",name:"eggshell"},{value:"#D2B48C",css:!0,name:"tan"},{value:"#9C661F",name:"brick"},{value:"#FF9912",name:"cadmiumyellow"},{value:"#FAEBD7",css:!0,name:"antiquewhite"},{value:"#FFEFDB",name:"antiquewhite 1"},{value:"#EEDFCC",name:"antiquewhite 2"},{value:"#CDC0B0",name:"antiquewhite 3"},{value:"#8B8378",name:"antiquewhite 4"},{value:"#DEB887",css:!0,name:"burlywood"},{value:"#FFD39B",name:"burlywood 1"},{value:"#EEC591",name:"burlywood 2"},{value:"#CDAA7D",name:"burlywood 3"},{value:"#8B7355",name:"burlywood 4"},{value:"#FFE4C4",name:"bisque 1"},{value:"#FFE4C4",css:!0,name:"bisque"},{value:"#EED5B7",name:"bisque 2"},{value:"#CDB79E",name:"bisque 3"},{value:"#8B7D6B",name:"bisque 4"},{value:"#E3A869",name:"melon"},{value:"#ED9121",name:"carrot"},{value:"#FF8C00",css:!0,name:"darkorange"},{value:"#FF7F00",name:"darkorange 1"},{value:"#EE7600",name:"darkorange 2"},{value:"#CD6600",name:"darkorange 3"},{value:"#8B4500",name:"darkorange 4"},{value:"#FFA54F",name:"tan 1"},{value:"#EE9A49",name:"tan 2"},{value:"#CD853F",name:"tan 3"},{value:"#CD853F",css:!0,name:"peru"},{value:"#8B5A2B",name:"tan 4"},{value:"#FAF0E6",css:!0,name:"linen"},{value:"#FFDAB9",name:"peachpuff 1"},{value:"#FFDAB9",css:!0,name:"peachpuff"},{value:"#EECBAD",name:"peachpuff 2"},{value:"#CDAF95",name:"peachpuff 3"},{value:"#8B7765",name:"peachpuff 4"},{value:"#FFF5EE",name:"seashell 1"},{value:"#FFF5EE",css:!0,name:"seashell"},{value:"#EEE5DE",name:"seashell 2"},{value:"#CDC5BF",name:"seashell 3"},{value:"#8B8682",name:"seashell 4"},{value:"#F4A460",css:!0,name:"sandybrown"},{value:"#C76114",name:"rawsienna"},{value:"#D2691E",css:!0,name:"chocolate"},{value:"#FF7F24",name:"chocolate 1"},{value:"#EE7621",name:"chocolate 2"},{value:"#CD661D",name:"chocolate 3"},{value:"#8B4513",name:"chocolate 4"},{value:"#8B4513",css:!0,name:"saddlebrown"},{value:"#292421",name:"ivoryblack"},{value:"#FF7D40",name:"flesh"},{value:"#FF6103",name:"cadmiumorange"},{value:"#8A360F",name:"burntsienna"},{value:"#A0522D",css:!0,name:"sienna"},{value:"#FF8247",name:"sienna 1"},{value:"#EE7942",name:"sienna 2"},{value:"#CD6839",name:"sienna 3"},{value:"#8B4726",name:"sienna 4"},{value:"#FFA07A",name:"lightsalmon 1"},{value:"#FFA07A",css:!0,name:"lightsalmon"},{value:"#EE9572",name:"lightsalmon 2"},{value:"#CD8162",name:"lightsalmon 3"},{value:"#8B5742",name:"lightsalmon 4"},{value:"#FF7F50",css:!0,name:"coral"},{value:"#FF4500",name:"orangered 1"},{value:"#FF4500",css:!0,name:"orangered"},{value:"#EE4000",name:"orangered 2"},{value:"#CD3700",name:"orangered 3"},{value:"#8B2500",name:"orangered 4"},{value:"#5E2612",name:"sepia"},{value:"#E9967A",css:!0,name:"darksalmon"},{value:"#FF8C69",name:"salmon 1"},{value:"#EE8262",name:"salmon 2"},{value:"#CD7054",name:"salmon 3"},{value:"#8B4C39",name:"salmon 4"},{value:"#FF7256",name:"coral 1"},{value:"#EE6A50",name:"coral 2"},{value:"#CD5B45",name:"coral 3"},{value:"#8B3E2F",name:"coral 4"},{value:"#8A3324",name:"burntumber"},{value:"#FF6347",name:"tomato 1"},{value:"#FF6347",css:!0,name:"tomato"},{value:"#EE5C42",name:"tomato 2"},{value:"#CD4F39",name:"tomato 3"},{value:"#8B3626",name:"tomato 4"},{value:"#FA8072",css:!0,name:"salmon"},{value:"#FFE4E1",name:"mistyrose 1"},{value:"#FFE4E1",css:!0,name:"mistyrose"},{value:"#EED5D2",name:"mistyrose 2"},{value:"#CDB7B5",name:"mistyrose 3"},{value:"#8B7D7B",name:"mistyrose 4"},{value:"#FFFAFA",name:"snow 1"},{value:"#FFFAFA",css:!0,name:"snow"},{value:"#EEE9E9",name:"snow 2"},{value:"#CDC9C9",name:"snow 3"},{value:"#8B8989",name:"snow 4"},{value:"#BC8F8F",css:!0,name:"rosybrown"},{value:"#FFC1C1",name:"rosybrown 1"},{value:"#EEB4B4",name:"rosybrown 2"},{value:"#CD9B9B",name:"rosybrown 3"},{value:"#8B6969",name:"rosybrown 4"},{value:"#F08080",css:!0,name:"lightcoral"},{value:"#CD5C5C",css:!0,name:"indianred"},{value:"#FF6A6A",name:"indianred 1"},{value:"#EE6363",name:"indianred 2"},{value:"#8B3A3A",name:"indianred 4"},{value:"#CD5555",name:"indianred 3"},{value:"#A52A2A",css:!0,name:"brown"},{value:"#FF4040",name:"brown 1"},{value:"#EE3B3B",name:"brown 2"},{value:"#CD3333",name:"brown 3"},{value:"#8B2323",name:"brown 4"},{value:"#B22222",css:!0,name:"firebrick"},{value:"#FF3030",name:"firebrick 1"},{value:"#EE2C2C",name:"firebrick 2"},{value:"#CD2626",name:"firebrick 3"},{value:"#8B1A1A",name:"firebrick 4"},{value:"#FF0000",vga:!0,name:"red 1"},{value:"#FF0000",vga:!0,css:!0,name:"red"},{value:"#EE0000",name:"red 2"},{value:"#CD0000",name:"red 3"},{value:"#8B0000",name:"red 4"},{value:"#8B0000",css:!0,name:"darkred"},{value:"#800000",vga:!0,css:!0,name:"maroon"},{value:"#8E388E",name:"sgi beet"},{value:"#7171C6",name:"sgi slateblue"},{value:"#7D9EC0",name:"sgi lightblue"},{value:"#388E8E",name:"sgi teal"},{value:"#71C671",name:"sgi chartreuse"},{value:"#8E8E38",name:"sgi olivedrab"},{value:"#C5C1AA",name:"sgi brightgray"},{value:"#C67171",name:"sgi salmon"},{value:"#555555",name:"sgi darkgray"},{value:"#1E1E1E",name:"sgi gray 12"},{value:"#282828",name:"sgi gray 16"},{value:"#515151",name:"sgi gray 32"},{value:"#5B5B5B",name:"sgi gray 36"},{value:"#848484",name:"sgi gray 52"},{value:"#8E8E8E",name:"sgi gray 56"},{value:"#AAAAAA",name:"sgi lightgray"},{value:"#B7B7B7",name:"sgi gray 72"},{value:"#C1C1C1",name:"sgi gray 76"},{value:"#EAEAEA",name:"sgi gray 92"},{value:"#F4F4F4",name:"sgi gray 96"},{value:"#FFFFFF",vga:!0,css:!0,name:"white"},{value:"#F5F5F5",name:"white smoke"},{value:"#F5F5F5",name:"gray 96"},{value:"#DCDCDC",css:!0,name:"gainsboro"},{value:"#D3D3D3",css:!0,name:"lightgrey"},{value:"#C0C0C0",vga:!0,css:!0,name:"silver"},{value:"#A9A9A9",css:!0,name:"darkgray"},{value:"#808080",vga:!0,css:!0,name:"gray"},{value:"#696969",css:!0,name:"dimgray"},{value:"#696969",name:"gray 42"},{value:"#000000",vga:!0,css:!0,name:"black"},{value:"#FCFCFC",name:"gray 99"},{value:"#FAFAFA",name:"gray 98"},{value:"#F7F7F7",name:"gray 97"},{value:"#F2F2F2",name:"gray 95"},{value:"#F0F0F0",name:"gray 94"},{value:"#EDEDED",name:"gray 93"},{value:"#EBEBEB",name:"gray 92"},{value:"#E8E8E8",name:"gray 91"},{value:"#E5E5E5",name:"gray 90"},{value:"#E3E3E3",name:"gray 89"},{value:"#E0E0E0",name:"gray 88"},{value:"#DEDEDE",name:"gray 87"},{value:"#DBDBDB",name:"gray 86"},{value:"#D9D9D9",name:"gray 85"},{value:"#D6D6D6",name:"gray 84"},{value:"#D4D4D4",name:"gray 83"},{value:"#D1D1D1",name:"gray 82"},{value:"#CFCFCF",name:"gray 81"},{value:"#CCCCCC",name:"gray 80"},{value:"#C9C9C9",name:"gray 79"},{value:"#C7C7C7",name:"gray 78"},{value:"#C4C4C4",name:"gray 77"},{value:"#C2C2C2",name:"gray 76"},{value:"#BFBFBF",name:"gray 75"},{value:"#BDBDBD",name:"gray 74"},{value:"#BABABA",name:"gray 73"},{value:"#B8B8B8",name:"gray 72"},{value:"#B5B5B5",name:"gray 71"},{value:"#B3B3B3",name:"gray 70"},{value:"#B0B0B0",name:"gray 69"},{value:"#ADADAD",name:"gray 68"},{value:"#ABABAB",name:"gray 67"},{value:"#A8A8A8",name:"gray 66"},{value:"#A6A6A6",name:"gray 65"},{value:"#A3A3A3",name:"gray 64"},{value:"#A1A1A1",name:"gray 63"},{value:"#9E9E9E",name:"gray 62"},{value:"#9C9C9C",name:"gray 61"},{value:"#999999",name:"gray 60"},{value:"#969696",name:"gray 59"},{value:"#949494",name:"gray 58"},{value:"#919191",name:"gray 57"},{value:"#8F8F8F",name:"gray 56"},{value:"#8C8C8C",name:"gray 55"},{value:"#8A8A8A",name:"gray 54"},{value:"#878787",name:"gray 53"},{value:"#858585",name:"gray 52"},{value:"#828282",name:"gray 51"},{value:"#7F7F7F",name:"gray 50"},{value:"#7D7D7D",name:"gray 49"},{value:"#7A7A7A",name:"gray 48"},{value:"#787878",name:"gray 47"},{value:"#757575",name:"gray 46"},{value:"#737373",name:"gray 45"},{value:"#707070",name:"gray 44"},{value:"#6E6E6E",name:"gray 43"},{value:"#666666",name:"gray 40"},{value:"#636363",name:"gray 39"},{value:"#616161",name:"gray 38"},{value:"#5E5E5E",name:"gray 37"},{value:"#5C5C5C",name:"gray 36"},{value:"#595959",name:"gray 35"},{value:"#575757",name:"gray 34"},{value:"#545454",name:"gray 33"},{value:"#525252",name:"gray 32"},{value:"#4F4F4F",name:"gray 31"},{value:"#4D4D4D",name:"gray 30"},{value:"#4A4A4A",name:"gray 29"},{value:"#474747",name:"gray 28"},{value:"#454545",name:"gray 27"},{value:"#424242",name:"gray 26"},{value:"#404040",name:"gray 25"},{value:"#3D3D3D",name:"gray 24"},{value:"#3B3B3B",name:"gray 23"},{value:"#383838",name:"gray 22"},{value:"#363636",name:"gray 21"},{value:"#333333",name:"gray 20"},{value:"#303030",name:"gray 19"},{value:"#2E2E2E",name:"gray 18"},{value:"#2B2B2B",name:"gray 17"},{value:"#292929",name:"gray 16"},{value:"#262626",name:"gray 15"},{value:"#242424",name:"gray 14"},{value:"#212121",name:"gray 13"},{value:"#1F1F1F",name:"gray 12"},{value:"#1C1C1C",name:"gray 11"},{value:"#1A1A1A",name:"gray 10"},{value:"#171717",name:"gray 9"},{value:"#141414",name:"gray 8"},{value:"#121212",name:"gray 7"},{value:"#0F0F0F",name:"gray 6"},{value:"#0D0D0D",name:"gray 5"},{value:"#0A0A0A",name:"gray 4"},{value:"#080808",name:"gray 3"},{value:"#050505",name:"gray 2"},{value:"#030303",name:"gray 1"},{value:"#F5F5F5",css:!0,name:"whitesmoke"}]});var VP=Je(($0e,T2)=>{"use strict";var p8=PP(),jP=p8.filter(function(t){return!!t.css}),qP=p8.filter(function(t){return!!t.vga});T2.exports=function(t){var e=T2.exports.get(t);return e&&e.value};T2.exports.get=function(t){return t=t||"",t=t.trim().toLowerCase(),p8.filter(function(e){return e.name.toLowerCase()===t}).pop()};T2.exports.all=T2.exports.get.all=function(){return p8};T2.exports.get.css=function(t){return t?(t=t||"",t=t.trim().toLowerCase(),jP.filter(function(e){return e.name.toLowerCase()===t}).pop()):jP};T2.exports.get.vga=function(t){return t?(t=t||"",t=t.trim().toLowerCase(),qP.filter(function(e){return e.name.toLowerCase()===t}).pop()):qP}});var Qj=Je((A2e,Ej)=>{"use strict";var N3A=1/0,_3A="[object Symbol]",G3A=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,ij="\\ud800-\\udfff",U3A="\\u0300-\\u036f\\ufe20-\\ufe23",K3A="\\u20d0-\\u20f0",nj="\\u2700-\\u27bf",oj="a-z\\xdf-\\xf6\\xf8-\\xff",Y3A="\\xac\\xb1\\xd7\\xf7",J3A="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",T3A="\\u2000-\\u206f",H3A=" \\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",rj="A-Z\\xc0-\\xd6\\xd8-\\xde",z3A="\\ufe0e\\ufe0f",sj=Y3A+J3A+T3A+H3A,aj="['\u2019]",ZP="["+sj+"]",O3A="["+U3A+K3A+"]",cj="\\d+",P3A="["+nj+"]",lj="["+oj+"]",gj="[^"+ij+sj+cj+nj+oj+rj+"]",j3A="\\ud83c[\\udffb-\\udfff]",q3A="(?:"+O3A+"|"+j3A+")",V3A="[^"+ij+"]",Ij="(?:\\ud83c[\\udde6-\\uddff]){2}",Cj="[\\ud800-\\udbff][\\udc00-\\udfff]",UB="["+rj+"]",Z3A="\\u200d",WP="(?:"+lj+"|"+gj+")",W3A="(?:"+UB+"|"+gj+")",XP="(?:"+aj+"(?:d|ll|m|re|s|t|ve))?",$P="(?:"+aj+"(?:D|LL|M|RE|S|T|VE))?",dj=q3A+"?",Bj="["+z3A+"]?",X3A="(?:"+Z3A+"(?:"+[V3A,Ij,Cj].join("|")+")"+Bj+dj+")*",$3A=Bj+dj+X3A,AfA="(?:"+[P3A,Ij,Cj].join("|")+")"+$3A,efA=RegExp([UB+"?"+lj+"+"+XP+"(?="+[ZP,UB,"$"].join("|")+")",W3A+"+"+$P+"(?="+[ZP,UB+WP,"$"].join("|")+")",UB+"?"+WP+"+"+XP,UB+"+"+$P,cj,AfA].join("|"),"g"),tfA=/[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,ifA=typeof global=="object"&&global&&global.Object===Object&&global,nfA=typeof self=="object"&&self&&self.Object===Object&&self,ofA=ifA||nfA||Function("return this")();function rfA(t){return t.match(G3A)||[]}function sfA(t){return tfA.test(t)}function afA(t){return t.match(efA)||[]}var cfA=Object.prototype,lfA=cfA.toString,Aj=ofA.Symbol,ej=Aj?Aj.prototype:void 0,tj=ej?ej.toString:void 0;function gfA(t){if(typeof t=="string")return t;if(CfA(t))return tj?tj.call(t):"";var e=t+"";return e=="0"&&1/t==-N3A?"-0":e}function IfA(t){return!!t&&typeof t=="object"}function CfA(t){return typeof t=="symbol"||IfA(t)&&lfA.call(t)==_3A}function dfA(t){return t==null?"":gfA(t)}function BfA(t,e,A){return t=dfA(t),e=A?void 0:e,e===void 0?sfA(t)?afA(t):rfA(t):t.match(e)||[]}Ej.exports=BfA});var Lj=Je((e2e,xj)=>{"use strict";var EfA=1/0,QfA="[object Symbol]",hfA=/^\s+/,Vk="\\ud800-\\udfff",pj="\\u0300-\\u036f\\ufe20-\\ufe23",wj="\\u20d0-\\u20f0",Dj="\\ufe0e\\ufe0f",ufA="["+Vk+"]",jk="["+pj+wj+"]",qk="\\ud83c[\\udffb-\\udfff]",ffA="(?:"+jk+"|"+qk+")",yj="[^"+Vk+"]",vj="(?:\\ud83c[\\udde6-\\uddff]){2}",bj="[\\ud800-\\udbff][\\udc00-\\udfff]",Mj="\\u200d",kj=ffA+"?",Sj="["+Dj+"]?",mfA="(?:"+Mj+"(?:"+[yj,vj,bj].join("|")+")"+Sj+kj+")*",pfA=Sj+kj+mfA,wfA="(?:"+[yj+jk+"?",jk,vj,bj,ufA].join("|")+")",DfA=RegExp(qk+"(?="+qk+")|"+wfA+pfA,"g"),yfA=RegExp("["+Mj+Vk+pj+wj+Dj+"]"),vfA=typeof global=="object"&&global&&global.Object===Object&&global,bfA=typeof self=="object"&&self&&self.Object===Object&&self,MfA=vfA||bfA||Function("return this")();function kfA(t){return t.split("")}function SfA(t,e,A,i){for(var n=t.length,o=A+(i?1:-1);i?o--:++o-1;);return A}function FfA(t){return yfA.test(t)}function hj(t){return FfA(t)?NfA(t):kfA(t)}function NfA(t){return t.match(DfA)||[]}var _fA=Object.prototype,GfA=_fA.toString,uj=MfA.Symbol,fj=uj?uj.prototype:void 0,mj=fj?fj.toString:void 0;function UfA(t,e,A){var i=-1,n=t.length;e<0&&(e=-e>n?0:n+e),A=A>n?n:A,A<0&&(A+=n),n=e>A?0:A-e>>>0,e>>>=0;for(var o=Array(n);++i=i?t:UfA(t,e,A)}function YfA(t){return!!t&&typeof t=="object"}function JfA(t){return typeof t=="symbol"||YfA(t)&&GfA.call(t)==QfA}function TfA(t){return t==null?"":Rj(t)}function HfA(t,e,A){if(t=TfA(t),t&&(A||e===void 0))return t.replace(hfA,"");if(!t||!(e=Rj(e)))return t;var i=hj(t),n=LfA(i,hj(e));return KfA(i,n).join("")}xj.exports=HfA});var $j=Je((t2e,Xj)=>{"use strict";var Zk=1/0,zfA=9007199254740991,OfA=17976931348623157e292,Fj=NaN,PfA="[object Symbol]",jfA=/^\s+|\s+$/g,qfA=/^[-+]0x[0-9a-f]+$/i,VfA=/^0b[01]+$/i,ZfA=/^0o[0-7]+$/i,AS="\\ud800-\\udfff",Yj="\\u0300-\\u036f\\ufe20-\\ufe23",Jj="\\u20d0-\\u20f0",Tj="\\ufe0e\\ufe0f",WfA="["+AS+"]",Wk="["+Yj+Jj+"]",Xk="\\ud83c[\\udffb-\\udfff]",XfA="(?:"+Wk+"|"+Xk+")",Hj="[^"+AS+"]",zj="(?:\\ud83c[\\udde6-\\uddff]){2}",Oj="[\\ud800-\\udbff][\\udc00-\\udfff]",Pj="\\u200d",jj=XfA+"?",qj="["+Tj+"]?",$fA="(?:"+Pj+"(?:"+[Hj,zj,Oj].join("|")+")"+qj+jj+")*",AmA=qj+jj+$fA,emA="(?:"+[Hj+Wk+"?",Wk,zj,Oj,WfA].join("|")+")",$k=RegExp(Xk+"(?="+Xk+")|"+emA+AmA,"g"),tmA=RegExp("["+Pj+AS+Yj+Jj+Tj+"]"),imA=parseInt,nmA=typeof global=="object"&&global&&global.Object===Object&&global,omA=typeof self=="object"&&self&&self.Object===Object&&self,rmA=nmA||omA||Function("return this")(),smA=cmA("length");function amA(t){return t.split("")}function cmA(t){return function(e){return e?.[t]}}function eS(t){return tmA.test(t)}function Vj(t){return eS(t)?gmA(t):smA(t)}function lmA(t){return eS(t)?ImA(t):amA(t)}function gmA(t){for(var e=$k.lastIndex=0;$k.test(t);)e++;return e}function ImA(t){return t.match($k)||[]}var CmA=Object.prototype,dmA=CmA.toString,Nj=rmA.Symbol,BmA=Math.ceil,EmA=Math.floor,_j=Nj?Nj.prototype:void 0,Gj=_j?_j.toString:void 0;function Uj(t,e){var A="";if(!t||e<1||e>zfA)return A;do e%2&&(A+=t),e=EmA(e/2),e&&(t+=t);while(e);return A}function QmA(t,e,A){var i=-1,n=t.length;e<0&&(e=-e>n?0:n+e),A=A>n?n:A,A<0&&(A+=n),n=e>A?0:A-e>>>0,e>>>=0;for(var o=Array(n);++i=i?t:QmA(t,e,A)}function umA(t,e){e=e===void 0?" ":Zj(e);var A=e.length;if(A<2)return A?Uj(e,t):e;var i=Uj(e,BmA(t/Vj(e)));return eS(e)?hmA(lmA(i),0,t).join(""):i.slice(0,t)}function Kj(t){var e=typeof t;return!!t&&(e=="object"||e=="function")}function fmA(t){return!!t&&typeof t=="object"}function Wj(t){return typeof t=="symbol"||fmA(t)&&dmA.call(t)==PfA}function mmA(t){if(!t)return t===0?t:0;if(t=wmA(t),t===Zk||t===-Zk){var e=t<0?-1:1;return e*OfA}return t===t?t:0}function pmA(t){var e=mmA(t),A=e%1;return e===e?A?e-A:e:0}function wmA(t){if(typeof t=="number")return t;if(Wj(t))return Fj;if(Kj(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=Kj(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=t.replace(jfA,"");var A=VfA.test(t);return A||ZfA.test(t)?imA(t.slice(2),A?2:8):qfA.test(t)?Fj:+t}function DmA(t){return t==null?"":Zj(t)}function ymA(t,e,A){t=DmA(t),e=pmA(e);var i=e?Vj(t):0;return e&&i{"use strict";Aq.exports=(t,e,A,i)=>{let n=(t+(i||"")).toString().includes("%");if(typeof t=="string"?[t,e,A,i]=t.match(/(0?\.?\d{1,3})%?\b/g).map(Number):i!==void 0&&(i=parseFloat(i)),typeof t!="number"||typeof e!="number"||typeof A!="number"||t>255||e>255||A>255)throw new TypeError("Expected three numbers below 256");if(typeof i=="number"){if(!n&&i>=0&&i<=1)i=Math.round(255*i);else if(n&&i>=0&&i<=100)i=Math.round(255*i/100);else throw new TypeError(`Expected alpha value (${i}) as a fraction or percentage`);i=(i|256).toString(16).slice(1)}else i="";return(A|e<<8|t<<16|1<<24).toString(16).slice(1)+i}});var iq=Je((n2e,tq)=>{"use strict";var Ju="a-f\\d",vmA=`#?[${Ju}]{3}[${Ju}]?`,bmA=`#?[${Ju}]{6}([${Ju}]{2})?`,MmA=new RegExp(`[^#${Ju}]`,"gi"),kmA=new RegExp(`^${vmA}$|^${bmA}$`,"i");tq.exports=(t,e={})=>{if(typeof t!="string"||MmA.test(t)||!kmA.test(t))throw new TypeError("Expected a valid hex string");t=t.replace(/^#/,"");let A=1;t.length===8&&(A=Number.parseInt(t.slice(6,8),16)/255,t=t.slice(0,6)),t.length===4&&(A=Number.parseInt(t.slice(3,4).repeat(2),16)/255,t=t.slice(0,3)),t.length===3&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]);let i=Number.parseInt(t,16),n=i>>16,o=i>>8&255,r=i&255,s=typeof e.alpha=="number"?e.alpha:A;if(e.format==="array")return[n,o,r,s];if(e.format==="css"){let a=s===1?"":` / ${Number((s*100).toFixed(2))}%`;return`rgb(${n} ${o} ${r}${a})`}return{red:n,green:o,blue:r,alpha:s}}});var rq=Je((o2e,oq)=>{"use strict";var SmA=VP(),RmA=Qj(),xmA=Lj(),LmA=$j(),FmA=eq(),nq=iq(),tS=.75,iS=.25,nS=16777215,NmA=49979693;oq.exports=function(t){return"#"+UmA(String(JSON.stringify(t)))};function _mA(t){var e=RmA(t),A=[];return e.forEach(function(i){var n=SmA(i);n&&A.push(nq(xmA(n,"#"),{format:"array"}))}),A}function GmA(t){var e=[0,0,0];return t.forEach(function(A){for(var i=0;i<3;i++)e[i]+=A[i]}),[e[0]/t.length,e[1]/t.length,e[2]/t.length]}function UmA(t){var e,A=_mA(t);A.length>0&&(e=GmA(A));var i=1,n=0,o=1;if(t.length>0)for(var r=0;rn&&(n=t[r].charCodeAt(0)),o=parseInt(nS/n),i=(i+t[r].charCodeAt(0)*o*NmA)%nS;var s=(i*t.length%nS).toString(16);s=LmA(s,6,s);var a=nq(s,{format:"array"});return e?FmA(iS*a[0]+tS*e[0],iS*a[1]+tS*e[1],iS*a[2]+tS*e[2]):s}});var xq=Je(QS=>{"use strict";var Rq={b:"\b",f:"\f",n:` -`,r:"\r",t:" ",'"':'"',"/":"/","\\":"\\"},NpA=97;QS.parse=function(t,e,A){var i={},n=0,o=0,r=0,s=A&&A.bigint&&typeof BigInt<"u";return{data:a("",!0),pointers:i};function a(U,H){c();var q;L(U,"value");var j=E();switch(j){case"t":B("rue"),q=!0;break;case"f":B("alse"),q=!1;break;case"n":B("ull"),q=null;break;case'"':q=l();break;case"[":q=C(U);break;case"{":q=d(U);break;default:h(),"-0123456789".indexOf(j)>=0?q=I():_()}return L(U,"valueEnd"),c(),H&&rNumber.MAX_SAFE_INTEGER||q="a"&&q<="f"?H+=q.charCodeAt()-NpA+10:q>="0"&&q<="9"?H+=+q:K()}return String.fromCharCode(H)}function D(){for(var U="";t[r]>="0"&&t[r]<="9";)U+=E();if(U.length)return U;z(),_()}function L(U,H){R(U,H,w())}function R(U,H,q){i[U]=i[U]||{},i[U][H]=q}function w(){return{line:n,column:o,pos:r}}function _(){throw new SyntaxError("Unexpected token "+t[r]+" in JSON at position "+r)}function K(){h(),_()}function z(){if(r>=t.length)throw new SyntaxError("Unexpected end of JSON input")}};QS.stringify=function(t,e,A){if(!x8(t))return;var i=0,n,o,r=typeof A=="object"?A.space:A;switch(typeof r){case"number":var s=r>10?10:r<0?0:Math.floor(r);r=s&&R(s," "),n=s,o=s;break;case"string":r=r.slice(0,10),n=0,o=0;for(var a=0;a=0}var GpA=/"|\\/g,UpA=/[\b]/g,KpA=/\f/g,YpA=/\n/g,JpA=/\r/g,TpA=/\t/g;function L8(t){return t=t.replace(GpA,"\\$&").replace(KpA,"\\f").replace(UpA,"\\b").replace(YpA,"\\n").replace(JpA,"\\r").replace(TpA,"\\t"),'"'+t+'"'}var HpA=/~/g,zpA=/\//g;function ES(t){return t.replace(HpA,"~0").replace(zpA,"~1")}});var XW=Je((zfe,WW)=>{"use strict";var ZW=function(t,e){var A,i,n=1,o=0,r=0,s=String.alphabet;function a(c,l,I){if(I){for(A=l;I=a(c,A),I<76&&I>65;)++A;return+c.slice(l-1,A)}return I=s&&s.indexOf(c.charAt(l)),I>-1?I+76:(I=c.charCodeAt(l)||0,I<45||I>127?I:I<46?65:I<48?I-1:I<58?I+18:I<65?I-11:I<91?I+11:I<97?I-37:I<123?I+5:I-63)}if((t+="")!=(e+="")){for(;n;)if(i=a(t,o++),n=a(e,r++),i<76&&n<76&&i>66&&n>66&&(i=a(t,o,o),n=a(e,r,o=A),r=A),i!=n)return i{"use strict";Object.defineProperty(vn,"__esModule",{value:!0});vn.regexpCode=vn.getEsmExportName=vn.getProperty=vn.safeStringify=vn.stringify=vn.strConcat=vn.addCodeArg=vn.str=vn._=vn.nil=vn._Code=vn.Name=vn.IDENTIFIER=vn._CodeOrName=void 0;var C4=class{};vn._CodeOrName=C4;vn.IDENTIFIER=/^[a-z$_][a-z$_0-9]*$/i;var IC=class extends C4{constructor(e){if(super(),!vn.IDENTIFIER.test(e))throw new Error("CodeGen: name must be a valid identifier");this.str=e}toString(){return this.str}emptyStr(){return!1}get names(){return{[this.str]:1}}};vn.Name=IC;var Nc=class extends C4{constructor(e){super(),this._items=typeof e=="string"?[e]:e}toString(){return this.str}emptyStr(){if(this._items.length>1)return!1;let e=this._items[0];return e===""||e==='""'}get str(){var e;return(e=this._str)!==null&&e!==void 0?e:this._str=this._items.reduce((A,i)=>`${A}${i}`,"")}get names(){var e;return(e=this._names)!==null&&e!==void 0?e:this._names=this._items.reduce((A,i)=>(i instanceof IC&&(A[i.str]=(A[i.str]||0)+1),A),{})}};vn._Code=Nc;vn.nil=new Nc("");function AX(t,...e){let A=[t[0]],i=0;for(;i{"use strict";Object.defineProperty(Ma,"__esModule",{value:!0});Ma.ValueScope=Ma.ValueScopeName=Ma.Scope=Ma.varKinds=Ma.UsedValueState=void 0;var ba=B4(),tR=class extends Error{constructor(e){super(`CodeGen: "code" for ${e} not defined`),this.value=e.value}},f5=function(t){return t[t.Started=0]="Started",t[t.Completed=1]="Completed",t}(f5||(Ma.UsedValueState=f5={}));Ma.varKinds={const:new ba.Name("const"),let:new ba.Name("let"),var:new ba.Name("var")};var m5=class{constructor({prefixes:e,parent:A}={}){this._names={},this._prefixes=e,this._parent=A}toName(e){return e instanceof ba.Name?e:this.name(e)}name(e){return new ba.Name(this._newName(e))}_newName(e){let A=this._names[e]||this._nameGroup(e);return`${e}${A.index++}`}_nameGroup(e){var A,i;if(!((i=(A=this._parent)===null||A===void 0?void 0:A._prefixes)===null||i===void 0)&&i.has(e)||this._prefixes&&!this._prefixes.has(e))throw new Error(`CodeGen: prefix "${e}" is not allowed in this scope`);return this._names[e]={prefix:e,index:0}}};Ma.Scope=m5;var p5=class extends ba.Name{constructor(e,A){super(A),this.prefix=e}setValue(e,{property:A,itemIndex:i}){this.value=e,this.scopePath=(0,ba._)`.${new ba.Name(A)}[${i}]`}};Ma.ValueScopeName=p5;var TvA=(0,ba._)`\n`,iR=class extends m5{constructor(e){super(e),this._values={},this._scope=e.scope,this.opts=Ye(rA({},e),{_n:e.lines?TvA:ba.nil})}get(){return this._scope}name(e){return new p5(e,this._newName(e))}value(e,A){var i;if(A.ref===void 0)throw new Error("CodeGen: ref must be passed in value");let n=this.toName(e),{prefix:o}=n,r=(i=A.key)!==null&&i!==void 0?i:A.ref,s=this._values[o];if(s){let l=s.get(r);if(l)return l}else s=this._values[o]=new Map;s.set(r,n);let a=this._scope[o]||(this._scope[o]=[]),c=a.length;return a[c]=A.ref,n.setValue(A,{property:o,itemIndex:c}),n}getValue(e,A){let i=this._values[e];if(i)return i.get(A)}scopeRefs(e,A=this._values){return this._reduceValues(A,i=>{if(i.scopePath===void 0)throw new Error(`CodeGen: name "${i}" has no value`);return(0,ba._)`${e}${i.scopePath}`})}scopeCode(e=this._values,A,i){return this._reduceValues(e,n=>{if(n.value===void 0)throw new Error(`CodeGen: name "${n}" has no value`);return n.value.code},A,i)}_reduceValues(e,A,i={},n){let o=ba.nil;for(let r in e){let s=e[r];if(!s)continue;let a=i[r]=i[r]||new Map;s.forEach(c=>{if(a.has(c))return;a.set(c,f5.Started);let l=A(c);if(l){let I=this.opts.es5?Ma.varKinds.var:Ma.varKinds.const;o=(0,ba._)`${o}${I} ${c} = ${l};${this.opts._n}`}else if(l=n?.(c))o=(0,ba._)`${o}${l}${this.opts._n}`;else throw new tR(c);a.set(c,f5.Completed)})}return o}};Ma.ValueScope=iR});var An=Je(Xi=>{"use strict";Object.defineProperty(Xi,"__esModule",{value:!0});Xi.or=Xi.and=Xi.not=Xi.CodeGen=Xi.operators=Xi.varKinds=Xi.ValueScopeName=Xi.ValueScope=Xi.Scope=Xi.Name=Xi.regexpCode=Xi.stringify=Xi.getProperty=Xi.nil=Xi.strConcat=Xi.str=Xi._=void 0;var Bn=B4(),ul=nR(),I1=B4();Object.defineProperty(Xi,"_",{enumerable:!0,get:function(){return I1._}});Object.defineProperty(Xi,"str",{enumerable:!0,get:function(){return I1.str}});Object.defineProperty(Xi,"strConcat",{enumerable:!0,get:function(){return I1.strConcat}});Object.defineProperty(Xi,"nil",{enumerable:!0,get:function(){return I1.nil}});Object.defineProperty(Xi,"getProperty",{enumerable:!0,get:function(){return I1.getProperty}});Object.defineProperty(Xi,"stringify",{enumerable:!0,get:function(){return I1.stringify}});Object.defineProperty(Xi,"regexpCode",{enumerable:!0,get:function(){return I1.regexpCode}});Object.defineProperty(Xi,"Name",{enumerable:!0,get:function(){return I1.Name}});var b5=nR();Object.defineProperty(Xi,"Scope",{enumerable:!0,get:function(){return b5.Scope}});Object.defineProperty(Xi,"ValueScope",{enumerable:!0,get:function(){return b5.ValueScope}});Object.defineProperty(Xi,"ValueScopeName",{enumerable:!0,get:function(){return b5.ValueScopeName}});Object.defineProperty(Xi,"varKinds",{enumerable:!0,get:function(){return b5.varKinds}});Xi.operators={GT:new Bn._Code(">"),GTE:new Bn._Code(">="),LT:new Bn._Code("<"),LTE:new Bn._Code("<="),EQ:new Bn._Code("==="),NEQ:new Bn._Code("!=="),NOT:new Bn._Code("!"),OR:new Bn._Code("||"),AND:new Bn._Code("&&"),ADD:new Bn._Code("+")};var N0=class{optimizeNodes(){return this}optimizeNames(e,A){return this}},oR=class extends N0{constructor(e,A,i){super(),this.varKind=e,this.name=A,this.rhs=i}render({es5:e,_n:A}){let i=e?ul.varKinds.var:this.varKind,n=this.rhs===void 0?"":` = ${this.rhs}`;return`${i} ${this.name}${n};`+A}optimizeNames(e,A){if(e[this.name.str])return this.rhs&&(this.rhs=cE(this.rhs,e,A)),this}get names(){return this.rhs instanceof Bn._CodeOrName?this.rhs.names:{}}},D5=class extends N0{constructor(e,A,i){super(),this.lhs=e,this.rhs=A,this.sideEffects=i}render({_n:e}){return`${this.lhs} = ${this.rhs};`+e}optimizeNames(e,A){if(!(this.lhs instanceof Bn.Name&&!e[this.lhs.str]&&!this.sideEffects))return this.rhs=cE(this.rhs,e,A),this}get names(){let e=this.lhs instanceof Bn.Name?{}:rA({},this.lhs.names);return v5(e,this.rhs)}},rR=class extends D5{constructor(e,A,i,n){super(e,i,n),this.op=A}render({_n:e}){return`${this.lhs} ${this.op}= ${this.rhs};`+e}},sR=class extends N0{constructor(e){super(),this.label=e,this.names={}}render({_n:e}){return`${this.label}:`+e}},aR=class extends N0{constructor(e){super(),this.label=e,this.names={}}render({_n:e}){return`break${this.label?` ${this.label}`:""};`+e}},cR=class extends N0{constructor(e){super(),this.error=e}render({_n:e}){return`throw ${this.error};`+e}get names(){return this.error.names}},lR=class extends N0{constructor(e){super(),this.code=e}render({_n:e}){return`${this.code};`+e}optimizeNodes(){return`${this.code}`?this:void 0}optimizeNames(e,A){return this.code=cE(this.code,e,A),this}get names(){return this.code instanceof Bn._CodeOrName?this.code.names:{}}},E4=class extends N0{constructor(e=[]){super(),this.nodes=e}render(e){return this.nodes.reduce((A,i)=>A+i.render(e),"")}optimizeNodes(){let{nodes:e}=this,A=e.length;for(;A--;){let i=e[A].optimizeNodes();Array.isArray(i)?e.splice(A,1,...i):i?e[A]=i:e.splice(A,1)}return e.length>0?this:void 0}optimizeNames(e,A){let{nodes:i}=this,n=i.length;for(;n--;){let o=i[n];o.optimizeNames(e,A)||(HvA(e,o.names),i.splice(n,1))}return i.length>0?this:void 0}get names(){return this.nodes.reduce((e,A)=>CC(e,A.names),{})}},_0=class extends E4{render(e){return"{"+e._n+super.render(e)+"}"+e._n}},gR=class extends E4{},IR=(()=>{class t extends _0{}return t.kind="else",t})(),w5=(()=>{class t extends _0{constructor(A,i){super(i),this.condition=A}render(A){let i=`if(${this.condition})`+super.render(A);return this.else&&(i+="else "+this.else.render(A)),i}optimizeNodes(){super.optimizeNodes();let A=this.condition;if(A===!0)return this.nodes;let i=this.else;if(i){let n=i.optimizeNodes();i=this.else=Array.isArray(n)?new IR(n):n}if(i)return A===!1?i instanceof t?i:i.nodes:this.nodes.length?this:new t(rX(A),i instanceof t?[i]:i.nodes);if(!(A===!1||!this.nodes.length))return this}optimizeNames(A,i){var n;if(this.else=(n=this.else)===null||n===void 0?void 0:n.optimizeNames(A,i),!!(super.optimizeNames(A,i)||this.else))return this.condition=cE(this.condition,A,i),this}get names(){let A=super.names;return v5(A,this.condition),this.else&&CC(A,this.else.names),A}}return t.kind="if",t})(),M5=(()=>{class t extends _0{}return t.kind="for",t})(),CR=class extends M5{constructor(e){super(),this.iteration=e}render(e){return`for(${this.iteration})`+super.render(e)}optimizeNames(e,A){if(super.optimizeNames(e,A))return this.iteration=cE(this.iteration,e,A),this}get names(){return CC(super.names,this.iteration.names)}},dR=class extends M5{constructor(e,A,i,n){super(),this.varKind=e,this.name=A,this.from=i,this.to=n}render(e){let A=e.es5?ul.varKinds.var:this.varKind,{name:i,from:n,to:o}=this;return`for(${A} ${i}=${n}; ${i}<${o}; ${i}++)`+super.render(e)}get names(){let e=v5(super.names,this.from);return v5(e,this.to)}},y5=class extends M5{constructor(e,A,i,n){super(),this.loop=e,this.varKind=A,this.name=i,this.iterable=n}render(e){return`for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})`+super.render(e)}optimizeNames(e,A){if(super.optimizeNames(e,A))return this.iterable=cE(this.iterable,e,A),this}get names(){return CC(super.names,this.iterable.names)}},tX=(()=>{class t extends _0{constructor(A,i,n){super(),this.name=A,this.args=i,this.async=n}render(A){return`${this.async?"async ":""}function ${this.name}(${this.args})`+super.render(A)}}return t.kind="func",t})(),iX=(()=>{class t extends E4{render(A){return"return "+super.render(A)}}return t.kind="return",t})(),BR=class extends _0{render(e){let A="try"+super.render(e);return this.catch&&(A+=this.catch.render(e)),this.finally&&(A+=this.finally.render(e)),A}optimizeNodes(){var e,A;return super.optimizeNodes(),(e=this.catch)===null||e===void 0||e.optimizeNodes(),(A=this.finally)===null||A===void 0||A.optimizeNodes(),this}optimizeNames(e,A){var i,n;return super.optimizeNames(e,A),(i=this.catch)===null||i===void 0||i.optimizeNames(e,A),(n=this.finally)===null||n===void 0||n.optimizeNames(e,A),this}get names(){let e=super.names;return this.catch&&CC(e,this.catch.names),this.finally&&CC(e,this.finally.names),e}},nX=(()=>{class t extends _0{constructor(A){super(),this.error=A}render(A){return`catch(${this.error})`+super.render(A)}}return t.kind="catch",t})(),oX=(()=>{class t extends _0{render(A){return"finally"+super.render(A)}}return t.kind="finally",t})(),ER=class{constructor(e,A={}){this._values={},this._blockStarts=[],this._constants={},this.opts=Ye(rA({},A),{_n:A.lines?` -`:""}),this._extScope=e,this._scope=new ul.Scope({parent:e}),this._nodes=[new gR]}toString(){return this._root.render(this.opts)}name(e){return this._scope.name(e)}scopeName(e){return this._extScope.name(e)}scopeValue(e,A){let i=this._extScope.value(e,A);return(this._values[i.prefix]||(this._values[i.prefix]=new Set)).add(i),i}getScopeValue(e,A){return this._extScope.getValue(e,A)}scopeRefs(e){return this._extScope.scopeRefs(e,this._values)}scopeCode(){return this._extScope.scopeCode(this._values)}_def(e,A,i,n){let o=this._scope.toName(A);return i!==void 0&&n&&(this._constants[o.str]=i),this._leafNode(new oR(e,o,i)),o}const(e,A,i){return this._def(ul.varKinds.const,e,A,i)}let(e,A,i){return this._def(ul.varKinds.let,e,A,i)}var(e,A,i){return this._def(ul.varKinds.var,e,A,i)}assign(e,A,i){return this._leafNode(new D5(e,A,i))}add(e,A){return this._leafNode(new rR(e,Xi.operators.ADD,A))}code(e){return typeof e=="function"?e():e!==Bn.nil&&this._leafNode(new lR(e)),this}object(...e){let A=["{"];for(let[i,n]of e)A.length>1&&A.push(","),A.push(i),(i!==n||this.opts.es5)&&(A.push(":"),(0,Bn.addCodeArg)(A,n));return A.push("}"),new Bn._Code(A)}if(e,A,i){if(this._blockNode(new w5(e)),A&&i)this.code(A).else().code(i).endIf();else if(A)this.code(A).endIf();else if(i)throw new Error('CodeGen: "else" body without "then" body');return this}elseIf(e){return this._elseNode(new w5(e))}else(){return this._elseNode(new IR)}endIf(){return this._endBlockNode(w5,IR)}_for(e,A){return this._blockNode(e),A&&this.code(A).endFor(),this}for(e,A){return this._for(new CR(e),A)}forRange(e,A,i,n,o=this.opts.es5?ul.varKinds.var:ul.varKinds.let){let r=this._scope.toName(e);return this._for(new dR(o,r,A,i),()=>n(r))}forOf(e,A,i,n=ul.varKinds.const){let o=this._scope.toName(e);if(this.opts.es5){let r=A instanceof Bn.Name?A:this.var("_arr",A);return this.forRange("_i",0,(0,Bn._)`${r}.length`,s=>{this.var(o,(0,Bn._)`${r}[${s}]`),i(o)})}return this._for(new y5("of",n,o,A),()=>i(o))}forIn(e,A,i,n=this.opts.es5?ul.varKinds.var:ul.varKinds.const){if(this.opts.ownProperties)return this.forOf(e,(0,Bn._)`Object.keys(${A})`,i);let o=this._scope.toName(e);return this._for(new y5("in",n,o,A),()=>i(o))}endFor(){return this._endBlockNode(M5)}label(e){return this._leafNode(new sR(e))}break(e){return this._leafNode(new aR(e))}return(e){let A=new iX;if(this._blockNode(A),this.code(e),A.nodes.length!==1)throw new Error('CodeGen: "return" should have one node');return this._endBlockNode(iX)}try(e,A,i){if(!A&&!i)throw new Error('CodeGen: "try" without "catch" and "finally"');let n=new BR;if(this._blockNode(n),this.code(e),A){let o=this.name("e");this._currNode=n.catch=new nX(o),A(o)}return i&&(this._currNode=n.finally=new oX,this.code(i)),this._endBlockNode(nX,oX)}throw(e){return this._leafNode(new cR(e))}block(e,A){return this._blockStarts.push(this._nodes.length),e&&this.code(e).endBlock(A),this}endBlock(e){let A=this._blockStarts.pop();if(A===void 0)throw new Error("CodeGen: not in self-balancing block");let i=this._nodes.length-A;if(i<0||e!==void 0&&i!==e)throw new Error(`CodeGen: wrong number of nodes: ${i} vs ${e} expected`);return this._nodes.length=A,this}func(e,A=Bn.nil,i,n){return this._blockNode(new tX(e,A,i)),n&&this.code(n).endFunc(),this}endFunc(){return this._endBlockNode(tX)}optimize(e=1){for(;e-- >0;)this._root.optimizeNodes(),this._root.optimizeNames(this._root.names,this._constants)}_leafNode(e){return this._currNode.nodes.push(e),this}_blockNode(e){this._currNode.nodes.push(e),this._nodes.push(e)}_endBlockNode(e,A){let i=this._currNode;if(i instanceof e||A&&i instanceof A)return this._nodes.pop(),this;throw new Error(`CodeGen: not in block "${A?`${e.kind}/${A.kind}`:e.kind}"`)}_elseNode(e){let A=this._currNode;if(!(A instanceof w5))throw new Error('CodeGen: "else" without "if"');return this._currNode=A.else=e,this}get _root(){return this._nodes[0]}get _currNode(){let e=this._nodes;return e[e.length-1]}set _currNode(e){let A=this._nodes;A[A.length-1]=e}};Xi.CodeGen=ER;function CC(t,e){for(let A in e)t[A]=(t[A]||0)+(e[A]||0);return t}function v5(t,e){return e instanceof Bn._CodeOrName?CC(t,e.names):t}function cE(t,e,A){if(t instanceof Bn.Name)return i(t);if(!n(t))return t;return new Bn._Code(t._items.reduce((o,r)=>(r instanceof Bn.Name&&(r=i(r)),r instanceof Bn._Code?o.push(...r._items):o.push(r),o),[]));function i(o){let r=A[o.str];return r===void 0||e[o.str]!==1?o:(delete e[o.str],r)}function n(o){return o instanceof Bn._Code&&o._items.some(r=>r instanceof Bn.Name&&e[r.str]===1&&A[r.str]!==void 0)}}function HvA(t,e){for(let A in e)t[A]=(t[A]||0)-(e[A]||0)}function rX(t){return typeof t=="boolean"||typeof t=="number"||t===null?!t:(0,Bn._)`!${QR(t)}`}Xi.not=rX;var zvA=sX(Xi.operators.AND);function OvA(...t){return t.reduce(zvA)}Xi.and=OvA;var PvA=sX(Xi.operators.OR);function jvA(...t){return t.reduce(PvA)}Xi.or=jvA;function sX(t){return(e,A)=>e===Bn.nil?A:A===Bn.nil?e:(0,Bn._)`${QR(e)} ${t} ${QR(A)}`}function QR(t){return t instanceof Bn.Name?t:(0,Bn._)`(${t})`}});var bn=Je(en=>{"use strict";Object.defineProperty(en,"__esModule",{value:!0});en.checkStrictMode=en.getErrorPath=en.Type=en.useFunc=en.setEvaluated=en.evaluatedPropsToName=en.mergeEvaluated=en.eachItem=en.unescapeJsonPointer=en.escapeJsonPointer=en.escapeFragment=en.unescapeFragment=en.schemaRefOrVal=en.schemaHasRulesButRef=en.schemaHasRules=en.checkUnknownRules=en.alwaysValidSchema=en.toHash=void 0;var Do=An(),qvA=B4();function VvA(t){let e={};for(let A of t)e[A]=!0;return e}en.toHash=VvA;function ZvA(t,e){return typeof e=="boolean"?e:Object.keys(e).length===0?!0:(lX(t,e),!gX(e,t.self.RULES.all))}en.alwaysValidSchema=ZvA;function lX(t,e=t.schema){let{opts:A,self:i}=t;if(!A.strictSchema||typeof e=="boolean")return;let n=i.RULES.keywords;for(let o in e)n[o]||dX(t,`unknown keyword: "${o}"`)}en.checkUnknownRules=lX;function gX(t,e){if(typeof t=="boolean")return!t;for(let A in t)if(e[A])return!0;return!1}en.schemaHasRules=gX;function WvA(t,e){if(typeof t=="boolean")return!t;for(let A in t)if(A!=="$ref"&&e.all[A])return!0;return!1}en.schemaHasRulesButRef=WvA;function XvA({topSchemaRef:t,schemaPath:e},A,i,n){if(!n){if(typeof A=="number"||typeof A=="boolean")return A;if(typeof A=="string")return(0,Do._)`${A}`}return(0,Do._)`${t}${e}${(0,Do.getProperty)(i)}`}en.schemaRefOrVal=XvA;function $vA(t){return IX(decodeURIComponent(t))}en.unescapeFragment=$vA;function A9A(t){return encodeURIComponent(uR(t))}en.escapeFragment=A9A;function uR(t){return typeof t=="number"?`${t}`:t.replace(/~/g,"~0").replace(/\//g,"~1")}en.escapeJsonPointer=uR;function IX(t){return t.replace(/~1/g,"/").replace(/~0/g,"~")}en.unescapeJsonPointer=IX;function e9A(t,e){if(Array.isArray(t))for(let A of t)e(A);else e(t)}en.eachItem=e9A;function aX({mergeNames:t,mergeToName:e,mergeValues:A,resultToName:i}){return(n,o,r,s)=>{let a=r===void 0?o:r instanceof Do.Name?(o instanceof Do.Name?t(n,o,r):e(n,o,r),r):o instanceof Do.Name?(e(n,r,o),o):A(o,r);return s===Do.Name&&!(a instanceof Do.Name)?i(n,a):a}}en.mergeEvaluated={props:aX({mergeNames:(t,e,A)=>t.if((0,Do._)`${A} !== true && ${e} !== undefined`,()=>{t.if((0,Do._)`${e} === true`,()=>t.assign(A,!0),()=>t.assign(A,(0,Do._)`${A} || {}`).code((0,Do._)`Object.assign(${A}, ${e})`))}),mergeToName:(t,e,A)=>t.if((0,Do._)`${A} !== true`,()=>{e===!0?t.assign(A,!0):(t.assign(A,(0,Do._)`${A} || {}`),fR(t,A,e))}),mergeValues:(t,e)=>t===!0?!0:rA(rA({},t),e),resultToName:CX}),items:aX({mergeNames:(t,e,A)=>t.if((0,Do._)`${A} !== true && ${e} !== undefined`,()=>t.assign(A,(0,Do._)`${e} === true ? true : ${A} > ${e} ? ${A} : ${e}`)),mergeToName:(t,e,A)=>t.if((0,Do._)`${A} !== true`,()=>t.assign(A,e===!0?!0:(0,Do._)`${A} > ${e} ? ${A} : ${e}`)),mergeValues:(t,e)=>t===!0?!0:Math.max(t,e),resultToName:(t,e)=>t.var("items",e)})};function CX(t,e){if(e===!0)return t.var("props",!0);let A=t.var("props",(0,Do._)`{}`);return e!==void 0&&fR(t,A,e),A}en.evaluatedPropsToName=CX;function fR(t,e,A){Object.keys(A).forEach(i=>t.assign((0,Do._)`${e}${(0,Do.getProperty)(i)}`,!0))}en.setEvaluated=fR;var cX={};function t9A(t,e){return t.scopeValue("func",{ref:e,code:cX[e.code]||(cX[e.code]=new qvA._Code(e.code))})}en.useFunc=t9A;var hR=function(t){return t[t.Num=0]="Num",t[t.Str=1]="Str",t}(hR||(en.Type=hR={}));function i9A(t,e,A){if(t instanceof Do.Name){let i=e===hR.Num;return A?i?(0,Do._)`"[" + ${t} + "]"`:(0,Do._)`"['" + ${t} + "']"`:i?(0,Do._)`"/" + ${t}`:(0,Do._)`"/" + ${t}.replace(/~/g, "~0").replace(/\\//g, "~1")`}return A?(0,Do.getProperty)(t).toString():"/"+uR(t)}en.getErrorPath=i9A;function dX(t,e,A=t.opts.strictSchema){if(A){if(e=`strict mode: ${e}`,A===!0)throw new Error(e);t.self.logger.warn(e)}}en.checkStrictMode=dX});var G0=Je(mR=>{"use strict";Object.defineProperty(mR,"__esModule",{value:!0});var Ss=An(),n9A={data:new Ss.Name("data"),valCxt:new Ss.Name("valCxt"),instancePath:new Ss.Name("instancePath"),parentData:new Ss.Name("parentData"),parentDataProperty:new Ss.Name("parentDataProperty"),rootData:new Ss.Name("rootData"),dynamicAnchors:new Ss.Name("dynamicAnchors"),vErrors:new Ss.Name("vErrors"),errors:new Ss.Name("errors"),this:new Ss.Name("this"),self:new Ss.Name("self"),scope:new Ss.Name("scope"),json:new Ss.Name("json"),jsonPos:new Ss.Name("jsonPos"),jsonLen:new Ss.Name("jsonLen"),jsonPart:new Ss.Name("jsonPart")};mR.default=n9A});var Q4=Je(Rs=>{"use strict";Object.defineProperty(Rs,"__esModule",{value:!0});Rs.extendErrors=Rs.resetErrorsCount=Rs.reportExtraError=Rs.reportError=Rs.keyword$DataError=Rs.keywordError=void 0;var fn=An(),k5=bn(),Zs=G0();Rs.keywordError={message:({keyword:t})=>(0,fn.str)`must pass "${t}" keyword validation`};Rs.keyword$DataError={message:({keyword:t,schemaType:e})=>e?(0,fn.str)`"${t}" keyword must be ${e} ($data)`:(0,fn.str)`"${t}" keyword is invalid ($data)`};function o9A(t,e=Rs.keywordError,A,i){let{it:n}=t,{gen:o,compositeRule:r,allErrors:s}=n,a=QX(t,e,A);i??(r||s)?BX(o,a):EX(n,(0,fn._)`[${a}]`)}Rs.reportError=o9A;function r9A(t,e=Rs.keywordError,A){let{it:i}=t,{gen:n,compositeRule:o,allErrors:r}=i,s=QX(t,e,A);BX(n,s),o||r||EX(i,Zs.default.vErrors)}Rs.reportExtraError=r9A;function s9A(t,e){t.assign(Zs.default.errors,e),t.if((0,fn._)`${Zs.default.vErrors} !== null`,()=>t.if(e,()=>t.assign((0,fn._)`${Zs.default.vErrors}.length`,e),()=>t.assign(Zs.default.vErrors,null)))}Rs.resetErrorsCount=s9A;function a9A({gen:t,keyword:e,schemaValue:A,data:i,errsCount:n,it:o}){if(n===void 0)throw new Error("ajv implementation error");let r=t.name("err");t.forRange("i",n,Zs.default.errors,s=>{t.const(r,(0,fn._)`${Zs.default.vErrors}[${s}]`),t.if((0,fn._)`${r}.instancePath === undefined`,()=>t.assign((0,fn._)`${r}.instancePath`,(0,fn.strConcat)(Zs.default.instancePath,o.errorPath))),t.assign((0,fn._)`${r}.schemaPath`,(0,fn.str)`${o.errSchemaPath}/${e}`),o.opts.verbose&&(t.assign((0,fn._)`${r}.schema`,A),t.assign((0,fn._)`${r}.data`,i))})}Rs.extendErrors=a9A;function BX(t,e){let A=t.const("err",e);t.if((0,fn._)`${Zs.default.vErrors} === null`,()=>t.assign(Zs.default.vErrors,(0,fn._)`[${A}]`),(0,fn._)`${Zs.default.vErrors}.push(${A})`),t.code((0,fn._)`${Zs.default.errors}++`)}function EX(t,e){let{gen:A,validateName:i,schemaEnv:n}=t;n.$async?A.throw((0,fn._)`new ${t.ValidationError}(${e})`):(A.assign((0,fn._)`${i}.errors`,e),A.return(!1))}var dC={keyword:new fn.Name("keyword"),schemaPath:new fn.Name("schemaPath"),params:new fn.Name("params"),propertyName:new fn.Name("propertyName"),message:new fn.Name("message"),schema:new fn.Name("schema"),parentSchema:new fn.Name("parentSchema")};function QX(t,e,A){let{createErrors:i}=t.it;return i===!1?(0,fn._)`{}`:c9A(t,e,A)}function c9A(t,e,A={}){let{gen:i,it:n}=t,o=[l9A(n,A),g9A(t,A)];return I9A(t,e,o),i.object(...o)}function l9A({errorPath:t},{instancePath:e}){let A=e?(0,fn.str)`${t}${(0,k5.getErrorPath)(e,k5.Type.Str)}`:t;return[Zs.default.instancePath,(0,fn.strConcat)(Zs.default.instancePath,A)]}function g9A({keyword:t,it:{errSchemaPath:e}},{schemaPath:A,parentSchema:i}){let n=i?e:(0,fn.str)`${e}/${t}`;return A&&(n=(0,fn.str)`${n}${(0,k5.getErrorPath)(A,k5.Type.Str)}`),[dC.schemaPath,n]}function I9A(t,{params:e,message:A},i){let{keyword:n,data:o,schemaValue:r,it:s}=t,{opts:a,propertyName:c,topSchemaRef:l,schemaPath:I}=s;i.push([dC.keyword,n],[dC.params,typeof e=="function"?e(t):e||(0,fn._)`{}`]),a.messages&&i.push([dC.message,typeof A=="function"?A(t):A]),a.verbose&&i.push([dC.schema,r],[dC.parentSchema,(0,fn._)`${l}${I}`],[Zs.default.data,o]),c&&i.push([dC.propertyName,c])}});var uX=Je(lE=>{"use strict";Object.defineProperty(lE,"__esModule",{value:!0});lE.boolOrEmptySchema=lE.topBoolOrEmptySchema=void 0;var C9A=Q4(),d9A=An(),B9A=G0(),E9A={message:"boolean schema is false"};function Q9A(t){let{gen:e,schema:A,validateName:i}=t;A===!1?hX(t,!1):typeof A=="object"&&A.$async===!0?e.return(B9A.default.data):(e.assign((0,d9A._)`${i}.errors`,null),e.return(!0))}lE.topBoolOrEmptySchema=Q9A;function h9A(t,e){let{gen:A,schema:i}=t;i===!1?(A.var(e,!1),hX(t)):A.var(e,!0)}lE.boolOrEmptySchema=h9A;function hX(t,e){let{gen:A,data:i}=t,n={gen:A,keyword:"false schema",data:i,schema:!1,schemaCode:!1,schemaValue:!1,params:{},it:t};(0,C9A.reportError)(n,E9A,void 0,e)}});var pR=Je(gE=>{"use strict";Object.defineProperty(gE,"__esModule",{value:!0});gE.getRules=gE.isJSONType=void 0;var u9A=["string","number","integer","boolean","null","object","array"],f9A=new Set(u9A);function m9A(t){return typeof t=="string"&&f9A.has(t)}gE.isJSONType=m9A;function p9A(){let t={number:{type:"number",rules:[]},string:{type:"string",rules:[]},array:{type:"array",rules:[]},object:{type:"object",rules:[]}};return{types:Ye(rA({},t),{integer:!0,boolean:!0,null:!0}),rules:[{rules:[]},t.number,t.string,t.array,t.object],post:{rules:[]},all:{},keywords:{}}}gE.getRules=p9A});var wR=Je(C1=>{"use strict";Object.defineProperty(C1,"__esModule",{value:!0});C1.shouldUseRule=C1.shouldUseGroup=C1.schemaHasRulesForType=void 0;function w9A({schema:t,self:e},A){let i=e.RULES.types[A];return i&&i!==!0&&fX(t,i)}C1.schemaHasRulesForType=w9A;function fX(t,e){return e.rules.some(A=>mX(t,A))}C1.shouldUseGroup=fX;function mX(t,e){var A;return t[e.keyword]!==void 0||((A=e.definition.implements)===null||A===void 0?void 0:A.some(i=>t[i]!==void 0))}C1.shouldUseRule=mX});var h4=Je(xs=>{"use strict";Object.defineProperty(xs,"__esModule",{value:!0});xs.reportTypeError=xs.checkDataTypes=xs.checkDataType=xs.coerceAndCheckDataType=xs.getJSONTypes=xs.getSchemaTypes=xs.DataType=void 0;var D9A=pR(),y9A=wR(),v9A=Q4(),Ui=An(),pX=bn(),IE=function(t){return t[t.Correct=0]="Correct",t[t.Wrong=1]="Wrong",t}(IE||(xs.DataType=IE={}));function b9A(t){let e=wX(t.type);if(e.includes("null")){if(t.nullable===!1)throw new Error("type: null contradicts nullable: false")}else{if(!e.length&&t.nullable!==void 0)throw new Error('"nullable" cannot be used without "type"');t.nullable===!0&&e.push("null")}return e}xs.getSchemaTypes=b9A;function wX(t){let e=Array.isArray(t)?t:t?[t]:[];if(e.every(D9A.isJSONType))return e;throw new Error("type must be JSONType or JSONType[]: "+e.join(","))}xs.getJSONTypes=wX;function M9A(t,e){let{gen:A,data:i,opts:n}=t,o=k9A(e,n.coerceTypes),r=e.length>0&&!(o.length===0&&e.length===1&&(0,y9A.schemaHasRulesForType)(t,e[0]));if(r){let s=yR(e,i,n.strictNumbers,IE.Wrong);A.if(s,()=>{o.length?S9A(t,e,o):vR(t)})}return r}xs.coerceAndCheckDataType=M9A;var DX=new Set(["string","number","integer","boolean","null"]);function k9A(t,e){return e?t.filter(A=>DX.has(A)||e==="array"&&A==="array"):[]}function S9A(t,e,A){let{gen:i,data:n,opts:o}=t,r=i.let("dataType",(0,Ui._)`typeof ${n}`),s=i.let("coerced",(0,Ui._)`undefined`);o.coerceTypes==="array"&&i.if((0,Ui._)`${r} == 'object' && Array.isArray(${n}) && ${n}.length == 1`,()=>i.assign(n,(0,Ui._)`${n}[0]`).assign(r,(0,Ui._)`typeof ${n}`).if(yR(e,n,o.strictNumbers),()=>i.assign(s,n))),i.if((0,Ui._)`${s} !== undefined`);for(let c of A)(DX.has(c)||c==="array"&&o.coerceTypes==="array")&&a(c);i.else(),vR(t),i.endIf(),i.if((0,Ui._)`${s} !== undefined`,()=>{i.assign(n,s),R9A(t,s)});function a(c){switch(c){case"string":i.elseIf((0,Ui._)`${r} == "number" || ${r} == "boolean"`).assign(s,(0,Ui._)`"" + ${n}`).elseIf((0,Ui._)`${n} === null`).assign(s,(0,Ui._)`""`);return;case"number":i.elseIf((0,Ui._)`${r} == "boolean" || ${n} === null - || (${r} == "string" && ${n} && ${n} == +${n})`).assign(s,(0,Ui._)`+${n}`);return;case"integer":i.elseIf((0,Ui._)`${r} === "boolean" || ${n} === null - || (${r} === "string" && ${n} && ${n} == +${n} && !(${n} % 1))`).assign(s,(0,Ui._)`+${n}`);return;case"boolean":i.elseIf((0,Ui._)`${n} === "false" || ${n} === 0 || ${n} === null`).assign(s,!1).elseIf((0,Ui._)`${n} === "true" || ${n} === 1`).assign(s,!0);return;case"null":i.elseIf((0,Ui._)`${n} === "" || ${n} === 0 || ${n} === false`),i.assign(s,null);return;case"array":i.elseIf((0,Ui._)`${r} === "string" || ${r} === "number" - || ${r} === "boolean" || ${n} === null`).assign(s,(0,Ui._)`[${n}]`)}}}function R9A({gen:t,parentData:e,parentDataProperty:A},i){t.if((0,Ui._)`${e} !== undefined`,()=>t.assign((0,Ui._)`${e}[${A}]`,i))}function DR(t,e,A,i=IE.Correct){let n=i===IE.Correct?Ui.operators.EQ:Ui.operators.NEQ,o;switch(t){case"null":return(0,Ui._)`${e} ${n} null`;case"array":o=(0,Ui._)`Array.isArray(${e})`;break;case"object":o=(0,Ui._)`${e} && typeof ${e} == "object" && !Array.isArray(${e})`;break;case"integer":o=r((0,Ui._)`!(${e} % 1) && !isNaN(${e})`);break;case"number":o=r();break;default:return(0,Ui._)`typeof ${e} ${n} ${t}`}return i===IE.Correct?o:(0,Ui.not)(o);function r(s=Ui.nil){return(0,Ui.and)((0,Ui._)`typeof ${e} == "number"`,s,A?(0,Ui._)`isFinite(${e})`:Ui.nil)}}xs.checkDataType=DR;function yR(t,e,A,i){if(t.length===1)return DR(t[0],e,A,i);let n,o=(0,pX.toHash)(t);if(o.array&&o.object){let r=(0,Ui._)`typeof ${e} != "object"`;n=o.null?r:(0,Ui._)`!${e} || ${r}`,delete o.null,delete o.array,delete o.object}else n=Ui.nil;o.number&&delete o.integer;for(let r in o)n=(0,Ui.and)(n,DR(r,e,A,i));return n}xs.checkDataTypes=yR;var x9A={message:({schema:t})=>`must be ${t}`,params:({schema:t,schemaValue:e})=>typeof t=="string"?(0,Ui._)`{type: ${t}}`:(0,Ui._)`{type: ${e}}`};function vR(t){let e=L9A(t);(0,v9A.reportError)(e,x9A)}xs.reportTypeError=vR;function L9A(t){let{gen:e,data:A,schema:i}=t,n=(0,pX.schemaRefOrVal)(t,i,"type");return{gen:e,keyword:"type",data:A,schema:i.type,schemaCode:n,schemaValue:n,parentSchema:i,params:{},it:t}}});var vX=Je(S5=>{"use strict";Object.defineProperty(S5,"__esModule",{value:!0});S5.assignDefaults=void 0;var CE=An(),F9A=bn();function N9A(t,e){let{properties:A,items:i}=t.schema;if(e==="object"&&A)for(let n in A)yX(t,n,A[n].default);else e==="array"&&Array.isArray(i)&&i.forEach((n,o)=>yX(t,o,n.default))}S5.assignDefaults=N9A;function yX(t,e,A){let{gen:i,compositeRule:n,data:o,opts:r}=t;if(A===void 0)return;let s=(0,CE._)`${o}${(0,CE.getProperty)(e)}`;if(n){(0,F9A.checkStrictMode)(t,`default is ignored for: ${s}`);return}let a=(0,CE._)`${s} === undefined`;r.useDefaults==="empty"&&(a=(0,CE._)`${a} || ${s} === null || ${s} === ""`),i.if(a,(0,CE._)`${s} = ${(0,CE.stringify)(A)}`)}});var _c=Je(ro=>{"use strict";Object.defineProperty(ro,"__esModule",{value:!0});ro.validateUnion=ro.validateArray=ro.usePattern=ro.callValidateCode=ro.schemaProperties=ro.allSchemaProperties=ro.noPropertyInData=ro.propertyInData=ro.isOwnProperty=ro.hasPropFunc=ro.reportMissingProp=ro.checkMissingProp=ro.checkReportMissingProp=void 0;var zo=An(),bR=bn(),d1=G0(),_9A=bn();function G9A(t,e){let{gen:A,data:i,it:n}=t;A.if(kR(A,i,e,n.opts.ownProperties),()=>{t.setParams({missingProperty:(0,zo._)`${e}`},!0),t.error()})}ro.checkReportMissingProp=G9A;function U9A({gen:t,data:e,it:{opts:A}},i,n){return(0,zo.or)(...i.map(o=>(0,zo.and)(kR(t,e,o,A.ownProperties),(0,zo._)`${n} = ${o}`)))}ro.checkMissingProp=U9A;function K9A(t,e){t.setParams({missingProperty:e},!0),t.error()}ro.reportMissingProp=K9A;function bX(t){return t.scopeValue("func",{ref:Object.prototype.hasOwnProperty,code:(0,zo._)`Object.prototype.hasOwnProperty`})}ro.hasPropFunc=bX;function MR(t,e,A){return(0,zo._)`${bX(t)}.call(${e}, ${A})`}ro.isOwnProperty=MR;function Y9A(t,e,A,i){let n=(0,zo._)`${e}${(0,zo.getProperty)(A)} !== undefined`;return i?(0,zo._)`${n} && ${MR(t,e,A)}`:n}ro.propertyInData=Y9A;function kR(t,e,A,i){let n=(0,zo._)`${e}${(0,zo.getProperty)(A)} === undefined`;return i?(0,zo.or)(n,(0,zo.not)(MR(t,e,A))):n}ro.noPropertyInData=kR;function MX(t){return t?Object.keys(t).filter(e=>e!=="__proto__"):[]}ro.allSchemaProperties=MX;function J9A(t,e){return MX(e).filter(A=>!(0,bR.alwaysValidSchema)(t,e[A]))}ro.schemaProperties=J9A;function T9A({schemaCode:t,data:e,it:{gen:A,topSchemaRef:i,schemaPath:n,errorPath:o},it:r},s,a,c){let l=c?(0,zo._)`${t}, ${e}, ${i}${n}`:e,I=[[d1.default.instancePath,(0,zo.strConcat)(d1.default.instancePath,o)],[d1.default.parentData,r.parentData],[d1.default.parentDataProperty,r.parentDataProperty],[d1.default.rootData,d1.default.rootData]];r.opts.dynamicRef&&I.push([d1.default.dynamicAnchors,d1.default.dynamicAnchors]);let C=(0,zo._)`${l}, ${A.object(...I)}`;return a!==zo.nil?(0,zo._)`${s}.call(${a}, ${C})`:(0,zo._)`${s}(${C})`}ro.callValidateCode=T9A;var H9A=(0,zo._)`new RegExp`;function z9A({gen:t,it:{opts:e}},A){let i=e.unicodeRegExp?"u":"",{regExp:n}=e.code,o=n(A,i);return t.scopeValue("pattern",{key:o.toString(),ref:o,code:(0,zo._)`${n.code==="new RegExp"?H9A:(0,_9A.useFunc)(t,n)}(${A}, ${i})`})}ro.usePattern=z9A;function O9A(t){let{gen:e,data:A,keyword:i,it:n}=t,o=e.name("valid");if(n.allErrors){let s=e.let("valid",!0);return r(()=>e.assign(s,!1)),s}return e.var(o,!0),r(()=>e.break()),o;function r(s){let a=e.const("len",(0,zo._)`${A}.length`);e.forRange("i",0,a,c=>{t.subschema({keyword:i,dataProp:c,dataPropType:bR.Type.Num},o),e.if((0,zo.not)(o),s)})}}ro.validateArray=O9A;function P9A(t){let{gen:e,schema:A,keyword:i,it:n}=t;if(!Array.isArray(A))throw new Error("ajv implementation error");if(A.some(a=>(0,bR.alwaysValidSchema)(n,a))&&!n.opts.unevaluated)return;let r=e.let("valid",!1),s=e.name("_valid");e.block(()=>A.forEach((a,c)=>{let l=t.subschema({keyword:i,schemaProp:c,compositeRule:!0},s);e.assign(r,(0,zo._)`${r} || ${s}`),t.mergeValidEvaluated(l,s)||e.if((0,zo.not)(r))})),t.result(r,()=>t.reset(),()=>t.error(!0))}ro.validateUnion=P9A});var RX=Je(pg=>{"use strict";Object.defineProperty(pg,"__esModule",{value:!0});pg.validateKeywordUsage=pg.validSchemaType=pg.funcKeywordCode=pg.macroKeywordCode=void 0;var Ws=An(),BC=G0(),j9A=_c(),q9A=Q4();function V9A(t,e){let{gen:A,keyword:i,schema:n,parentSchema:o,it:r}=t,s=e.macro.call(r.self,n,o,r),a=SX(A,i,s);r.opts.validateSchema!==!1&&r.self.validateSchema(s,!0);let c=A.name("valid");t.subschema({schema:s,schemaPath:Ws.nil,errSchemaPath:`${r.errSchemaPath}/${i}`,topSchemaRef:a,compositeRule:!0},c),t.pass(c,()=>t.error(!0))}pg.macroKeywordCode=V9A;function Z9A(t,e){var A;let{gen:i,keyword:n,schema:o,parentSchema:r,$data:s,it:a}=t;X9A(a,e);let c=!s&&e.compile?e.compile.call(a.self,o,r,a):e.validate,l=SX(i,n,c),I=i.let("valid");t.block$data(I,C),t.ok((A=e.valid)!==null&&A!==void 0?A:I);function C(){if(e.errors===!1)E(),e.modifying&&kX(t),h(()=>t.error());else{let u=e.async?d():B();e.modifying&&kX(t),h(()=>W9A(t,u))}}function d(){let u=i.let("ruleErrs",null);return i.try(()=>E((0,Ws._)`await `),D=>i.assign(I,!1).if((0,Ws._)`${D} instanceof ${a.ValidationError}`,()=>i.assign(u,(0,Ws._)`${D}.errors`),()=>i.throw(D))),u}function B(){let u=(0,Ws._)`${l}.errors`;return i.assign(u,null),E(Ws.nil),u}function E(u=e.async?(0,Ws._)`await `:Ws.nil){let D=a.opts.passContext?BC.default.this:BC.default.self,L=!("compile"in e&&!s||e.schema===!1);i.assign(I,(0,Ws._)`${u}${(0,j9A.callValidateCode)(t,l,D,L)}`,e.modifying)}function h(u){var D;i.if((0,Ws.not)((D=e.valid)!==null&&D!==void 0?D:I),u)}}pg.funcKeywordCode=Z9A;function kX(t){let{gen:e,data:A,it:i}=t;e.if(i.parentData,()=>e.assign(A,(0,Ws._)`${i.parentData}[${i.parentDataProperty}]`))}function W9A(t,e){let{gen:A}=t;A.if((0,Ws._)`Array.isArray(${e})`,()=>{A.assign(BC.default.vErrors,(0,Ws._)`${BC.default.vErrors} === null ? ${e} : ${BC.default.vErrors}.concat(${e})`).assign(BC.default.errors,(0,Ws._)`${BC.default.vErrors}.length`),(0,q9A.extendErrors)(t)},()=>t.error())}function X9A({schemaEnv:t},e){if(e.async&&!t.$async)throw new Error("async keyword in sync schema")}function SX(t,e,A){if(A===void 0)throw new Error(`keyword "${e}" failed to compile`);return t.scopeValue("keyword",typeof A=="function"?{ref:A}:{ref:A,code:(0,Ws.stringify)(A)})}function $9A(t,e,A=!1){return!e.length||e.some(i=>i==="array"?Array.isArray(t):i==="object"?t&&typeof t=="object"&&!Array.isArray(t):typeof t==i||A&&typeof t>"u")}pg.validSchemaType=$9A;function AbA({schema:t,opts:e,self:A,errSchemaPath:i},n,o){if(Array.isArray(n.keyword)?!n.keyword.includes(o):n.keyword!==o)throw new Error("ajv implementation error");let r=n.dependencies;if(r?.some(s=>!Object.prototype.hasOwnProperty.call(t,s)))throw new Error(`parent schema must have dependencies of ${o}: ${r.join(",")}`);if(n.validateSchema&&!n.validateSchema(t[o])){let a=`keyword "${o}" value is invalid at path "${i}": `+A.errorsText(n.validateSchema.errors);if(e.validateSchema==="log")A.logger.error(a);else throw new Error(a)}}pg.validateKeywordUsage=AbA});var LX=Je(B1=>{"use strict";Object.defineProperty(B1,"__esModule",{value:!0});B1.extendSubschemaMode=B1.extendSubschemaData=B1.getSubschema=void 0;var wg=An(),xX=bn();function ebA(t,{keyword:e,schemaProp:A,schema:i,schemaPath:n,errSchemaPath:o,topSchemaRef:r}){if(e!==void 0&&i!==void 0)throw new Error('both "keyword" and "schema" passed, only one allowed');if(e!==void 0){let s=t.schema[e];return A===void 0?{schema:s,schemaPath:(0,wg._)`${t.schemaPath}${(0,wg.getProperty)(e)}`,errSchemaPath:`${t.errSchemaPath}/${e}`}:{schema:s[A],schemaPath:(0,wg._)`${t.schemaPath}${(0,wg.getProperty)(e)}${(0,wg.getProperty)(A)}`,errSchemaPath:`${t.errSchemaPath}/${e}/${(0,xX.escapeFragment)(A)}`}}if(i!==void 0){if(n===void 0||o===void 0||r===void 0)throw new Error('"schemaPath", "errSchemaPath" and "topSchemaRef" are required with "schema"');return{schema:i,schemaPath:n,topSchemaRef:r,errSchemaPath:o}}throw new Error('either "keyword" or "schema" must be passed')}B1.getSubschema=ebA;function tbA(t,e,{dataProp:A,dataPropType:i,data:n,dataTypes:o,propertyName:r}){if(n!==void 0&&A!==void 0)throw new Error('both "data" and "dataProp" passed, only one allowed');let{gen:s}=e;if(A!==void 0){let{errorPath:c,dataPathArr:l,opts:I}=e,C=s.let("data",(0,wg._)`${e.data}${(0,wg.getProperty)(A)}`,!0);a(C),t.errorPath=(0,wg.str)`${c}${(0,xX.getErrorPath)(A,i,I.jsPropertySyntax)}`,t.parentDataProperty=(0,wg._)`${A}`,t.dataPathArr=[...l,t.parentDataProperty]}if(n!==void 0){let c=n instanceof wg.Name?n:s.let("data",n,!0);a(c),r!==void 0&&(t.propertyName=r)}o&&(t.dataTypes=o);function a(c){t.data=c,t.dataLevel=e.dataLevel+1,t.dataTypes=[],e.definedProperties=new Set,t.parentData=e.data,t.dataNames=[...e.dataNames,c]}}B1.extendSubschemaData=tbA;function ibA(t,{jtdDiscriminator:e,jtdMetadata:A,compositeRule:i,createErrors:n,allErrors:o}){i!==void 0&&(t.compositeRule=i),n!==void 0&&(t.createErrors=n),o!==void 0&&(t.allErrors=o),t.jtdDiscriminator=e,t.jtdMetadata=A}B1.extendSubschemaMode=ibA});var SR=Je((lme,FX)=>{"use strict";FX.exports=function t(e,A){if(e===A)return!0;if(e&&A&&typeof e=="object"&&typeof A=="object"){if(e.constructor!==A.constructor)return!1;var i,n,o;if(Array.isArray(e)){if(i=e.length,i!=A.length)return!1;for(n=i;n--!==0;)if(!t(e[n],A[n]))return!1;return!0}if(e.constructor===RegExp)return e.source===A.source&&e.flags===A.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===A.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===A.toString();if(o=Object.keys(e),i=o.length,i!==Object.keys(A).length)return!1;for(n=i;n--!==0;)if(!Object.prototype.hasOwnProperty.call(A,o[n]))return!1;for(n=i;n--!==0;){var r=o[n];if(!t(e[r],A[r]))return!1}return!0}return e!==e&&A!==A}});var _X=Je((gme,NX)=>{"use strict";var E1=NX.exports=function(t,e,A){typeof e=="function"&&(A=e,e={}),A=e.cb||A;var i=typeof A=="function"?A:A.pre||function(){},n=A.post||function(){};R5(e,i,n,t,"",t)};E1.keywords={additionalItems:!0,items:!0,contains:!0,additionalProperties:!0,propertyNames:!0,not:!0,if:!0,then:!0,else:!0};E1.arrayKeywords={items:!0,allOf:!0,anyOf:!0,oneOf:!0};E1.propsKeywords={$defs:!0,definitions:!0,properties:!0,patternProperties:!0,dependencies:!0};E1.skipKeywords={default:!0,enum:!0,const:!0,required:!0,maximum:!0,minimum:!0,exclusiveMaximum:!0,exclusiveMinimum:!0,multipleOf:!0,maxLength:!0,minLength:!0,pattern:!0,format:!0,maxItems:!0,minItems:!0,uniqueItems:!0,maxProperties:!0,minProperties:!0};function R5(t,e,A,i,n,o,r,s,a,c){if(i&&typeof i=="object"&&!Array.isArray(i)){e(i,n,o,r,s,a,c);for(var l in i){var I=i[l];if(Array.isArray(I)){if(l in E1.arrayKeywords)for(var C=0;C{"use strict";Object.defineProperty(ka,"__esModule",{value:!0});ka.getSchemaRefs=ka.resolveUrl=ka.normalizeId=ka._getFullPath=ka.getFullPath=ka.inlineRef=void 0;var obA=bn(),rbA=SR(),sbA=_X(),abA=new Set(["type","format","pattern","maxLength","minLength","maxProperties","minProperties","maxItems","minItems","maximum","minimum","uniqueItems","multipleOf","required","enum","const"]);function cbA(t,e=!0){return typeof t=="boolean"?!0:e===!0?!RR(t):e?GX(t)<=e:!1}ka.inlineRef=cbA;var lbA=new Set(["$ref","$recursiveRef","$recursiveAnchor","$dynamicRef","$dynamicAnchor"]);function RR(t){for(let e in t){if(lbA.has(e))return!0;let A=t[e];if(Array.isArray(A)&&A.some(RR)||typeof A=="object"&&RR(A))return!0}return!1}function GX(t){let e=0;for(let A in t){if(A==="$ref")return 1/0;if(e++,!abA.has(A)&&(typeof t[A]=="object"&&(0,obA.eachItem)(t[A],i=>e+=GX(i)),e===1/0))return 1/0}return e}function UX(t,e="",A){A!==!1&&(e=dE(e));let i=t.parse(e);return KX(t,i)}ka.getFullPath=UX;function KX(t,e){return t.serialize(e).split("#")[0]+"#"}ka._getFullPath=KX;var gbA=/#\/?$/;function dE(t){return t?t.replace(gbA,""):""}ka.normalizeId=dE;function IbA(t,e,A){return A=dE(A),t.resolve(e,A)}ka.resolveUrl=IbA;var CbA=/^[a-z_][-a-z0-9._]*$/i;function dbA(t,e){if(typeof t=="boolean")return{};let{schemaId:A,uriResolver:i}=this.opts,n=dE(t[A]||e),o={"":n},r=UX(i,n,!1),s={},a=new Set;return sbA(t,{allKeys:!0},(I,C,d,B)=>{if(B===void 0)return;let E=r+C,h=o[B];typeof I[A]=="string"&&(h=u.call(this,I[A])),D.call(this,I.$anchor),D.call(this,I.$dynamicAnchor),o[C]=h;function u(L){let R=this.opts.uriResolver.resolve;if(L=dE(h?R(h,L):L),a.has(L))throw l(L);a.add(L);let w=this.refs[L];return typeof w=="string"&&(w=this.refs[w]),typeof w=="object"?c(I,w.schema,L):L!==dE(E)&&(L[0]==="#"?(c(I,s[L],L),s[L]=I):this.refs[L]=E),L}function D(L){if(typeof L=="string"){if(!CbA.test(L))throw new Error(`invalid anchor "${L}"`);u.call(this,`#${L}`)}}}),s;function c(I,C,d){if(C!==void 0&&!rbA(I,C))throw l(d)}function l(I){return new Error(`reference "${I}" resolves to more than one schema`)}}ka.getSchemaRefs=dbA});var p4=Je(Q1=>{"use strict";Object.defineProperty(Q1,"__esModule",{value:!0});Q1.getData=Q1.KeywordCxt=Q1.validateFunctionCode=void 0;var zX=uX(),YX=h4(),LR=wR(),x5=h4(),BbA=vX(),m4=RX(),xR=LX(),yt=An(),Bi=G0(),EbA=u4(),U0=bn(),f4=Q4();function QbA(t){if(jX(t)&&(qX(t),PX(t))){fbA(t);return}OX(t,()=>(0,zX.topBoolOrEmptySchema)(t))}Q1.validateFunctionCode=QbA;function OX({gen:t,validateName:e,schema:A,schemaEnv:i,opts:n},o){n.code.es5?t.func(e,(0,yt._)`${Bi.default.data}, ${Bi.default.valCxt}`,i.$async,()=>{t.code((0,yt._)`"use strict"; ${JX(A,n)}`),ubA(t,n),t.code(o)}):t.func(e,(0,yt._)`${Bi.default.data}, ${hbA(n)}`,i.$async,()=>t.code(JX(A,n)).code(o))}function hbA(t){return(0,yt._)`{${Bi.default.instancePath}="", ${Bi.default.parentData}, ${Bi.default.parentDataProperty}, ${Bi.default.rootData}=${Bi.default.data}${t.dynamicRef?(0,yt._)`, ${Bi.default.dynamicAnchors}={}`:yt.nil}}={}`}function ubA(t,e){t.if(Bi.default.valCxt,()=>{t.var(Bi.default.instancePath,(0,yt._)`${Bi.default.valCxt}.${Bi.default.instancePath}`),t.var(Bi.default.parentData,(0,yt._)`${Bi.default.valCxt}.${Bi.default.parentData}`),t.var(Bi.default.parentDataProperty,(0,yt._)`${Bi.default.valCxt}.${Bi.default.parentDataProperty}`),t.var(Bi.default.rootData,(0,yt._)`${Bi.default.valCxt}.${Bi.default.rootData}`),e.dynamicRef&&t.var(Bi.default.dynamicAnchors,(0,yt._)`${Bi.default.valCxt}.${Bi.default.dynamicAnchors}`)},()=>{t.var(Bi.default.instancePath,(0,yt._)`""`),t.var(Bi.default.parentData,(0,yt._)`undefined`),t.var(Bi.default.parentDataProperty,(0,yt._)`undefined`),t.var(Bi.default.rootData,Bi.default.data),e.dynamicRef&&t.var(Bi.default.dynamicAnchors,(0,yt._)`{}`)})}function fbA(t){let{schema:e,opts:A,gen:i}=t;OX(t,()=>{A.$comment&&e.$comment&&ZX(t),ybA(t),i.let(Bi.default.vErrors,null),i.let(Bi.default.errors,0),A.unevaluated&&mbA(t),VX(t),MbA(t)})}function mbA(t){let{gen:e,validateName:A}=t;t.evaluated=e.const("evaluated",(0,yt._)`${A}.evaluated`),e.if((0,yt._)`${t.evaluated}.dynamicProps`,()=>e.assign((0,yt._)`${t.evaluated}.props`,(0,yt._)`undefined`)),e.if((0,yt._)`${t.evaluated}.dynamicItems`,()=>e.assign((0,yt._)`${t.evaluated}.items`,(0,yt._)`undefined`))}function JX(t,e){let A=typeof t=="object"&&t[e.schemaId];return A&&(e.code.source||e.code.process)?(0,yt._)`/*# sourceURL=${A} */`:yt.nil}function pbA(t,e){if(jX(t)&&(qX(t),PX(t))){wbA(t,e);return}(0,zX.boolOrEmptySchema)(t,e)}function PX({schema:t,self:e}){if(typeof t=="boolean")return!t;for(let A in t)if(e.RULES.all[A])return!0;return!1}function jX(t){return typeof t.schema!="boolean"}function wbA(t,e){let{schema:A,gen:i,opts:n}=t;n.$comment&&A.$comment&&ZX(t),vbA(t),bbA(t);let o=i.const("_errs",Bi.default.errors);VX(t,o),i.var(e,(0,yt._)`${o} === ${Bi.default.errors}`)}function qX(t){(0,U0.checkUnknownRules)(t),DbA(t)}function VX(t,e){if(t.opts.jtd)return TX(t,[],!1,e);let A=(0,YX.getSchemaTypes)(t.schema),i=(0,YX.coerceAndCheckDataType)(t,A);TX(t,A,!i,e)}function DbA(t){let{schema:e,errSchemaPath:A,opts:i,self:n}=t;e.$ref&&i.ignoreKeywordsWithRef&&(0,U0.schemaHasRulesButRef)(e,n.RULES)&&n.logger.warn(`$ref: keywords ignored in schema at path "${A}"`)}function ybA(t){let{schema:e,opts:A}=t;e.default!==void 0&&A.useDefaults&&A.strictSchema&&(0,U0.checkStrictMode)(t,"default is ignored in the schema root")}function vbA(t){let e=t.schema[t.opts.schemaId];e&&(t.baseId=(0,EbA.resolveUrl)(t.opts.uriResolver,t.baseId,e))}function bbA(t){if(t.schema.$async&&!t.schemaEnv.$async)throw new Error("async schema in sync schema")}function ZX({gen:t,schemaEnv:e,schema:A,errSchemaPath:i,opts:n}){let o=A.$comment;if(n.$comment===!0)t.code((0,yt._)`${Bi.default.self}.logger.log(${o})`);else if(typeof n.$comment=="function"){let r=(0,yt.str)`${i}/$comment`,s=t.scopeValue("root",{ref:e.root});t.code((0,yt._)`${Bi.default.self}.opts.$comment(${o}, ${r}, ${s}.schema)`)}}function MbA(t){let{gen:e,schemaEnv:A,validateName:i,ValidationError:n,opts:o}=t;A.$async?e.if((0,yt._)`${Bi.default.errors} === 0`,()=>e.return(Bi.default.data),()=>e.throw((0,yt._)`new ${n}(${Bi.default.vErrors})`)):(e.assign((0,yt._)`${i}.errors`,Bi.default.vErrors),o.unevaluated&&kbA(t),e.return((0,yt._)`${Bi.default.errors} === 0`))}function kbA({gen:t,evaluated:e,props:A,items:i}){A instanceof yt.Name&&t.assign((0,yt._)`${e}.props`,A),i instanceof yt.Name&&t.assign((0,yt._)`${e}.items`,i)}function TX(t,e,A,i){let{gen:n,schema:o,data:r,allErrors:s,opts:a,self:c}=t,{RULES:l}=c;if(o.$ref&&(a.ignoreKeywordsWithRef||!(0,U0.schemaHasRulesButRef)(o,l))){n.block(()=>XX(t,"$ref",l.all.$ref.definition));return}a.jtd||SbA(t,e),n.block(()=>{for(let C of l.rules)I(C);I(l.post)});function I(C){(0,LR.shouldUseGroup)(o,C)&&(C.type?(n.if((0,x5.checkDataType)(C.type,r,a.strictNumbers)),HX(t,C),e.length===1&&e[0]===C.type&&A&&(n.else(),(0,x5.reportTypeError)(t)),n.endIf()):HX(t,C),s||n.if((0,yt._)`${Bi.default.errors} === ${i||0}`))}}function HX(t,e){let{gen:A,schema:i,opts:{useDefaults:n}}=t;n&&(0,BbA.assignDefaults)(t,e.type),A.block(()=>{for(let o of e.rules)(0,LR.shouldUseRule)(i,o)&&XX(t,o.keyword,o.definition,e.type)})}function SbA(t,e){t.schemaEnv.meta||!t.opts.strictTypes||(RbA(t,e),t.opts.allowUnionTypes||xbA(t,e),LbA(t,t.dataTypes))}function RbA(t,e){if(e.length){if(!t.dataTypes.length){t.dataTypes=e;return}e.forEach(A=>{WX(t.dataTypes,A)||FR(t,`type "${A}" not allowed by context "${t.dataTypes.join(",")}"`)}),NbA(t,e)}}function xbA(t,e){e.length>1&&!(e.length===2&&e.includes("null"))&&FR(t,"use allowUnionTypes to allow union type keyword")}function LbA(t,e){let A=t.self.RULES.all;for(let i in A){let n=A[i];if(typeof n=="object"&&(0,LR.shouldUseRule)(t.schema,n)){let{type:o}=n.definition;o.length&&!o.some(r=>FbA(e,r))&&FR(t,`missing type "${o.join(",")}" for keyword "${i}"`)}}}function FbA(t,e){return t.includes(e)||e==="number"&&t.includes("integer")}function WX(t,e){return t.includes(e)||e==="integer"&&t.includes("number")}function NbA(t,e){let A=[];for(let i of t.dataTypes)WX(e,i)?A.push(i):e.includes("integer")&&i==="number"&&A.push("integer");t.dataTypes=A}function FR(t,e){let A=t.schemaEnv.baseId+t.errSchemaPath;e+=` at "${A}" (strictTypes)`,(0,U0.checkStrictMode)(t,e,t.opts.strictTypes)}var L5=class{constructor(e,A,i){if((0,m4.validateKeywordUsage)(e,A,i),this.gen=e.gen,this.allErrors=e.allErrors,this.keyword=i,this.data=e.data,this.schema=e.schema[i],this.$data=A.$data&&e.opts.$data&&this.schema&&this.schema.$data,this.schemaValue=(0,U0.schemaRefOrVal)(e,this.schema,i,this.$data),this.schemaType=A.schemaType,this.parentSchema=e.schema,this.params={},this.it=e,this.def=A,this.$data)this.schemaCode=e.gen.const("vSchema",$X(this.$data,e));else if(this.schemaCode=this.schemaValue,!(0,m4.validSchemaType)(this.schema,A.schemaType,A.allowUndefined))throw new Error(`${i} value must be ${JSON.stringify(A.schemaType)}`);("code"in A?A.trackErrors:A.errors!==!1)&&(this.errsCount=e.gen.const("_errs",Bi.default.errors))}result(e,A,i){this.failResult((0,yt.not)(e),A,i)}failResult(e,A,i){this.gen.if(e),i?i():this.error(),A?(this.gen.else(),A(),this.allErrors&&this.gen.endIf()):this.allErrors?this.gen.endIf():this.gen.else()}pass(e,A){this.failResult((0,yt.not)(e),void 0,A)}fail(e){if(e===void 0){this.error(),this.allErrors||this.gen.if(!1);return}this.gen.if(e),this.error(),this.allErrors?this.gen.endIf():this.gen.else()}fail$data(e){if(!this.$data)return this.fail(e);let{schemaCode:A}=this;this.fail((0,yt._)`${A} !== undefined && (${(0,yt.or)(this.invalid$data(),e)})`)}error(e,A,i){if(A){this.setParams(A),this._error(e,i),this.setParams({});return}this._error(e,i)}_error(e,A){(e?f4.reportExtraError:f4.reportError)(this,this.def.error,A)}$dataError(){(0,f4.reportError)(this,this.def.$dataError||f4.keyword$DataError)}reset(){if(this.errsCount===void 0)throw new Error('add "trackErrors" to keyword definition');(0,f4.resetErrorsCount)(this.gen,this.errsCount)}ok(e){this.allErrors||this.gen.if(e)}setParams(e,A){A?Object.assign(this.params,e):this.params=e}block$data(e,A,i=yt.nil){this.gen.block(()=>{this.check$data(e,i),A()})}check$data(e=yt.nil,A=yt.nil){if(!this.$data)return;let{gen:i,schemaCode:n,schemaType:o,def:r}=this;i.if((0,yt.or)((0,yt._)`${n} === undefined`,A)),e!==yt.nil&&i.assign(e,!0),(o.length||r.validateSchema)&&(i.elseIf(this.invalid$data()),this.$dataError(),e!==yt.nil&&i.assign(e,!1)),i.else()}invalid$data(){let{gen:e,schemaCode:A,schemaType:i,def:n,it:o}=this;return(0,yt.or)(r(),s());function r(){if(i.length){if(!(A instanceof yt.Name))throw new Error("ajv implementation error");let a=Array.isArray(i)?i:[i];return(0,yt._)`${(0,x5.checkDataTypes)(a,A,o.opts.strictNumbers,x5.DataType.Wrong)}`}return yt.nil}function s(){if(n.validateSchema){let a=e.scopeValue("validate$data",{ref:n.validateSchema});return(0,yt._)`!${a}(${A})`}return yt.nil}}subschema(e,A){let i=(0,xR.getSubschema)(this.it,e);(0,xR.extendSubschemaData)(i,this.it,e),(0,xR.extendSubschemaMode)(i,e);let n=Ye(rA(rA({},this.it),i),{items:void 0,props:void 0});return pbA(n,A),n}mergeEvaluated(e,A){let{it:i,gen:n}=this;i.opts.unevaluated&&(i.props!==!0&&e.props!==void 0&&(i.props=U0.mergeEvaluated.props(n,e.props,i.props,A)),i.items!==!0&&e.items!==void 0&&(i.items=U0.mergeEvaluated.items(n,e.items,i.items,A)))}mergeValidEvaluated(e,A){let{it:i,gen:n}=this;if(i.opts.unevaluated&&(i.props!==!0||i.items!==!0))return n.if(A,()=>this.mergeEvaluated(e,yt.Name)),!0}};Q1.KeywordCxt=L5;function XX(t,e,A,i){let n=new L5(t,A,e);"code"in A?A.code(n,i):n.$data&&A.validate?(0,m4.funcKeywordCode)(n,A):"macro"in A?(0,m4.macroKeywordCode)(n,A):(A.compile||A.validate)&&(0,m4.funcKeywordCode)(n,A)}var _bA=/^\/(?:[^~]|~0|~1)*$/,GbA=/^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;function $X(t,{dataLevel:e,dataNames:A,dataPathArr:i}){let n,o;if(t==="")return Bi.default.rootData;if(t[0]==="/"){if(!_bA.test(t))throw new Error(`Invalid JSON-pointer: ${t}`);n=t,o=Bi.default.rootData}else{let c=GbA.exec(t);if(!c)throw new Error(`Invalid JSON-pointer: ${t}`);let l=+c[1];if(n=c[2],n==="#"){if(l>=e)throw new Error(a("property/index",l));return i[e-l]}if(l>e)throw new Error(a("data",l));if(o=A[e-l],!n)return o}let r=o,s=n.split("/");for(let c of s)c&&(o=(0,yt._)`${o}${(0,yt.getProperty)((0,U0.unescapeJsonPointer)(c))}`,r=(0,yt._)`${r} && ${o}`);return r;function a(c,l){return`Cannot access ${c} ${l} levels up, current level is ${e}`}}Q1.getData=$X});var F5=Je(_R=>{"use strict";Object.defineProperty(_R,"__esModule",{value:!0});var NR=class extends Error{constructor(e){super("validation failed"),this.errors=e,this.ajv=this.validation=!0}};_R.default=NR});var w4=Je(KR=>{"use strict";Object.defineProperty(KR,"__esModule",{value:!0});var GR=u4(),UR=class extends Error{constructor(e,A,i,n){super(n||`can't resolve reference ${i} from id ${A}`),this.missingRef=(0,GR.resolveUrl)(e,A,i),this.missingSchema=(0,GR.normalizeId)((0,GR.getFullPath)(e,this.missingRef))}};KR.default=UR});var _5=Je(Gc=>{"use strict";Object.defineProperty(Gc,"__esModule",{value:!0});Gc.resolveSchema=Gc.getCompilingSchema=Gc.resolveRef=Gc.compileSchema=Gc.SchemaEnv=void 0;var fl=An(),UbA=F5(),EC=G0(),ml=u4(),A$=bn(),KbA=p4(),BE=class{constructor(e){var A;this.refs={},this.dynamicAnchors={};let i;typeof e.schema=="object"&&(i=e.schema),this.schema=e.schema,this.schemaId=e.schemaId,this.root=e.root||this,this.baseId=(A=e.baseId)!==null&&A!==void 0?A:(0,ml.normalizeId)(i?.[e.schemaId||"$id"]),this.schemaPath=e.schemaPath,this.localRefs=e.localRefs,this.meta=e.meta,this.$async=i?.$async,this.refs={}}};Gc.SchemaEnv=BE;function JR(t){let e=e$.call(this,t);if(e)return e;let A=(0,ml.getFullPath)(this.opts.uriResolver,t.root.baseId),{es5:i,lines:n}=this.opts.code,{ownProperties:o}=this.opts,r=new fl.CodeGen(this.scope,{es5:i,lines:n,ownProperties:o}),s;t.$async&&(s=r.scopeValue("Error",{ref:UbA.default,code:(0,fl._)`require("ajv/dist/runtime/validation_error").default`}));let a=r.scopeName("validate");t.validateName=a;let c={gen:r,allErrors:this.opts.allErrors,data:EC.default.data,parentData:EC.default.parentData,parentDataProperty:EC.default.parentDataProperty,dataNames:[EC.default.data],dataPathArr:[fl.nil],dataLevel:0,dataTypes:[],definedProperties:new Set,topSchemaRef:r.scopeValue("schema",this.opts.code.source===!0?{ref:t.schema,code:(0,fl.stringify)(t.schema)}:{ref:t.schema}),validateName:a,ValidationError:s,schema:t.schema,schemaEnv:t,rootId:A,baseId:t.baseId||A,schemaPath:fl.nil,errSchemaPath:t.schemaPath||(this.opts.jtd?"":"#"),errorPath:(0,fl._)`""`,opts:this.opts,self:this},l;try{this._compilations.add(t),(0,KbA.validateFunctionCode)(c),r.optimize(this.opts.code.optimize);let I=r.toString();l=`${r.scopeRefs(EC.default.scope)}return ${I}`,this.opts.code.process&&(l=this.opts.code.process(l,t));let d=new Function(`${EC.default.self}`,`${EC.default.scope}`,l)(this,this.scope.get());if(this.scope.value(a,{ref:d}),d.errors=null,d.schema=t.schema,d.schemaEnv=t,t.$async&&(d.$async=!0),this.opts.code.source===!0&&(d.source={validateName:a,validateCode:I,scopeValues:r._values}),this.opts.unevaluated){let{props:B,items:E}=c;d.evaluated={props:B instanceof fl.Name?void 0:B,items:E instanceof fl.Name?void 0:E,dynamicProps:B instanceof fl.Name,dynamicItems:E instanceof fl.Name},d.source&&(d.source.evaluated=(0,fl.stringify)(d.evaluated))}return t.validate=d,t}catch(I){throw delete t.validate,delete t.validateName,l&&this.logger.error("Error compiling schema, function code:",l),I}finally{this._compilations.delete(t)}}Gc.compileSchema=JR;function YbA(t,e,A){var i;A=(0,ml.resolveUrl)(this.opts.uriResolver,e,A);let n=t.refs[A];if(n)return n;let o=HbA.call(this,t,A);if(o===void 0){let r=(i=t.localRefs)===null||i===void 0?void 0:i[A],{schemaId:s}=this.opts;r&&(o=new BE({schema:r,schemaId:s,root:t,baseId:e}))}if(o!==void 0)return t.refs[A]=JbA.call(this,o)}Gc.resolveRef=YbA;function JbA(t){return(0,ml.inlineRef)(t.schema,this.opts.inlineRefs)?t.schema:t.validate?t:JR.call(this,t)}function e$(t){for(let e of this._compilations)if(TbA(e,t))return e}Gc.getCompilingSchema=e$;function TbA(t,e){return t.schema===e.schema&&t.root===e.root&&t.baseId===e.baseId}function HbA(t,e){let A;for(;typeof(A=this.refs[e])=="string";)e=A;return A||this.schemas[e]||N5.call(this,t,e)}function N5(t,e){let A=this.opts.uriResolver.parse(e),i=(0,ml._getFullPath)(this.opts.uriResolver,A),n=(0,ml.getFullPath)(this.opts.uriResolver,t.baseId,void 0);if(Object.keys(t.schema).length>0&&i===n)return YR.call(this,A,t);let o=(0,ml.normalizeId)(i),r=this.refs[o]||this.schemas[o];if(typeof r=="string"){let s=N5.call(this,t,r);return typeof s?.schema!="object"?void 0:YR.call(this,A,s)}if(typeof r?.schema=="object"){if(r.validate||JR.call(this,r),o===(0,ml.normalizeId)(e)){let{schema:s}=r,{schemaId:a}=this.opts,c=s[a];return c&&(n=(0,ml.resolveUrl)(this.opts.uriResolver,n,c)),new BE({schema:s,schemaId:a,root:t,baseId:n})}return YR.call(this,A,r)}}Gc.resolveSchema=N5;var zbA=new Set(["properties","patternProperties","enum","dependencies","definitions"]);function YR(t,{baseId:e,schema:A,root:i}){var n;if(((n=t.fragment)===null||n===void 0?void 0:n[0])!=="/")return;for(let s of t.fragment.slice(1).split("/")){if(typeof A=="boolean")return;let a=A[(0,A$.unescapeFragment)(s)];if(a===void 0)return;A=a;let c=typeof A=="object"&&A[this.opts.schemaId];!zbA.has(s)&&c&&(e=(0,ml.resolveUrl)(this.opts.uriResolver,e,c))}let o;if(typeof A!="boolean"&&A.$ref&&!(0,A$.schemaHasRulesButRef)(A,this.RULES)){let s=(0,ml.resolveUrl)(this.opts.uriResolver,e,A.$ref);o=N5.call(this,i,s)}let{schemaId:r}=this.opts;if(o=o||new BE({schema:A,schemaId:r,root:i,baseId:e}),o.schema!==o.root.schema)return o}});var t$=Je((hme,ObA)=>{ObA.exports={$id:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#",description:"Meta-schema for $data reference (JSON AnySchema extension proposal)",type:"object",required:["$data"],properties:{$data:{type:"string",anyOf:[{format:"relative-json-pointer"},{format:"json-pointer"}]}},additionalProperties:!1}});var n$=Je((ume,i$)=>{"use strict";var PbA={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};i$.exports={HEX:PbA}});var I$=Je((fme,g$)=>{"use strict";var{HEX:jbA}=n$(),qbA=/^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$/u;function a$(t){if(l$(t,".")<3)return{host:t,isIPV4:!1};let e=t.match(qbA)||[],[A]=e;return A?{host:ZbA(A,"."),isIPV4:!0}:{host:t,isIPV4:!1}}function TR(t,e=!1){let A="",i=!0;for(let n of t){if(jbA[n]===void 0)return;n!=="0"&&i===!0&&(i=!1),i||(A+=n)}return e&&A.length===0&&(A="0"),A}function VbA(t){let e=0,A={error:!1,address:"",zone:""},i=[],n=[],o=!1,r=!1,s=!1;function a(){if(n.length){if(o===!1){let c=TR(n);if(c!==void 0)i.push(c);else return A.error=!0,!1}n.length=0}return!0}for(let c=0;c7){A.error=!0;break}c-1>=0&&t[c-1]===":"&&(r=!0);continue}else if(l==="%"){if(!a())break;o=!0}else{n.push(l);continue}}return n.length&&(o?A.zone=n.join(""):s?i.push(n.join("")):i.push(TR(n))),A.address=i.join(""),A}function c$(t){if(l$(t,":")<2)return{host:t,isIPV6:!1};let e=VbA(t);if(e.error)return{host:t,isIPV6:!1};{let A=e.address,i=e.address;return e.zone&&(A+="%"+e.zone,i+="%25"+e.zone),{host:A,escapedHost:i,isIPV6:!0}}}function ZbA(t,e){let A="",i=!0,n=t.length;for(let o=0;o{"use strict";var eMA=/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$/iu,tMA=/([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-.:;=@]|%[\da-f]{2})+)/iu;function C$(t){return typeof t.secure=="boolean"?t.secure:String(t.scheme).toLowerCase()==="wss"}function d$(t){return t.host||(t.error=t.error||"HTTP URIs must have a host."),t}function B$(t){let e=String(t.scheme).toLowerCase()==="https";return(t.port===(e?443:80)||t.port==="")&&(t.port=void 0),t.path||(t.path="/"),t}function iMA(t){return t.secure=C$(t),t.resourceName=(t.path||"/")+(t.query?"?"+t.query:""),t.path=void 0,t.query=void 0,t}function nMA(t){if((t.port===(C$(t)?443:80)||t.port==="")&&(t.port=void 0),typeof t.secure=="boolean"&&(t.scheme=t.secure?"wss":"ws",t.secure=void 0),t.resourceName){let[e,A]=t.resourceName.split("?");t.path=e&&e!=="/"?e:void 0,t.query=A,t.resourceName=void 0}return t.fragment=void 0,t}function oMA(t,e){if(!t.path)return t.error="URN can not be parsed",t;let A=t.path.match(tMA);if(A){let i=e.scheme||t.scheme||"urn";t.nid=A[1].toLowerCase(),t.nss=A[2];let n=`${i}:${e.nid||t.nid}`,o=HR[n];t.path=void 0,o&&(t=o.parse(t,e))}else t.error=t.error||"URN can not be parsed.";return t}function rMA(t,e){let A=e.scheme||t.scheme||"urn",i=t.nid.toLowerCase(),n=`${A}:${e.nid||i}`,o=HR[n];o&&(t=o.serialize(t,e));let r=t,s=t.nss;return r.path=`${i||e.nid}:${s}`,e.skipEscape=!0,r}function sMA(t,e){let A=t;return A.uuid=A.nss,A.nss=void 0,!e.tolerant&&(!A.uuid||!eMA.test(A.uuid))&&(A.error=A.error||"UUID is not valid."),A}function aMA(t){let e=t;return e.nss=(t.uuid||"").toLowerCase(),e}var E$={scheme:"http",domainHost:!0,parse:d$,serialize:B$},cMA={scheme:"https",domainHost:E$.domainHost,parse:d$,serialize:B$},G5={scheme:"ws",domainHost:!0,parse:iMA,serialize:nMA},lMA={scheme:"wss",domainHost:G5.domainHost,parse:G5.parse,serialize:G5.serialize},gMA={scheme:"urn",parse:oMA,serialize:rMA,skipNormalize:!0},IMA={scheme:"urn:uuid",parse:sMA,serialize:aMA,skipNormalize:!0},HR={http:E$,https:cMA,ws:G5,wss:lMA,urn:gMA,"urn:uuid":IMA};Q$.exports=HR});var f$=Je((pme,K5)=>{"use strict";var{normalizeIPv6:CMA,normalizeIPv4:dMA,removeDotSegments:D4,recomposeAuthority:BMA,normalizeComponentEncoding:U5}=I$(),zR=h$();function EMA(t,e){return typeof t=="string"?t=Dg(K0(t,e),e):typeof t=="object"&&(t=K0(Dg(t,e),e)),t}function QMA(t,e,A){let i=Object.assign({scheme:"null"},A),n=u$(K0(t,i),K0(e,i),i,!0);return Dg(n,Ye(rA({},i),{skipEscape:!0}))}function u$(t,e,A,i){let n={};return i||(t=K0(Dg(t,A),A),e=K0(Dg(e,A),A)),A=A||{},!A.tolerant&&e.scheme?(n.scheme=e.scheme,n.userinfo=e.userinfo,n.host=e.host,n.port=e.port,n.path=D4(e.path||""),n.query=e.query):(e.userinfo!==void 0||e.host!==void 0||e.port!==void 0?(n.userinfo=e.userinfo,n.host=e.host,n.port=e.port,n.path=D4(e.path||""),n.query=e.query):(e.path?(e.path.charAt(0)==="/"?n.path=D4(e.path):((t.userinfo!==void 0||t.host!==void 0||t.port!==void 0)&&!t.path?n.path="/"+e.path:t.path?n.path=t.path.slice(0,t.path.lastIndexOf("/")+1)+e.path:n.path=e.path,n.path=D4(n.path)),n.query=e.query):(n.path=t.path,e.query!==void 0?n.query=e.query:n.query=t.query),n.userinfo=t.userinfo,n.host=t.host,n.port=t.port),n.scheme=t.scheme),n.fragment=e.fragment,n}function hMA(t,e,A){return typeof t=="string"?(t=unescape(t),t=Dg(U5(K0(t,A),!0),Ye(rA({},A),{skipEscape:!0}))):typeof t=="object"&&(t=Dg(U5(t,!0),Ye(rA({},A),{skipEscape:!0}))),typeof e=="string"?(e=unescape(e),e=Dg(U5(K0(e,A),!0),Ye(rA({},A),{skipEscape:!0}))):typeof e=="object"&&(e=Dg(U5(e,!0),Ye(rA({},A),{skipEscape:!0}))),t.toLowerCase()===e.toLowerCase()}function Dg(t,e){let A={host:t.host,scheme:t.scheme,userinfo:t.userinfo,port:t.port,path:t.path,query:t.query,nid:t.nid,nss:t.nss,uuid:t.uuid,fragment:t.fragment,reference:t.reference,resourceName:t.resourceName,secure:t.secure,error:""},i=Object.assign({},e),n=[],o=zR[(i.scheme||A.scheme||"").toLowerCase()];o&&o.serialize&&o.serialize(A,i),A.path!==void 0&&(i.skipEscape?A.path=unescape(A.path):(A.path=escape(A.path),A.scheme!==void 0&&(A.path=A.path.split("%3A").join(":")))),i.reference!=="suffix"&&A.scheme&&n.push(A.scheme,":");let r=BMA(A);if(r!==void 0&&(i.reference!=="suffix"&&n.push("//"),n.push(r),A.path&&A.path.charAt(0)!=="/"&&n.push("/")),A.path!==void 0){let s=A.path;!i.absolutePath&&(!o||!o.absolutePath)&&(s=D4(s)),r===void 0&&(s=s.replace(/^\/\//u,"/%2F")),n.push(s)}return A.query!==void 0&&n.push("?",A.query),A.fragment!==void 0&&n.push("#",A.fragment),n.join("")}var uMA=Array.from({length:127},(t,e)=>/[^!"$&'()*+,\-.;=_`a-z{}~]/u.test(String.fromCharCode(e)));function fMA(t){let e=0;for(let A=0,i=t.length;A126||uMA[e])return!0;return!1}var mMA=/^(?:([^#/:?]+):)?(?:\/\/((?:([^#/?@]*)@)?(\[[^#/?\]]+\]|[^#/:?]*)(?::(\d*))?))?([^#?]*)(?:\?([^#]*))?(?:#((?:.|[\n\r])*))?/u;function K0(t,e){let A=Object.assign({},e),i={scheme:void 0,userinfo:void 0,host:"",port:void 0,path:"",query:void 0,fragment:void 0},n=t.indexOf("%")!==-1,o=!1;A.reference==="suffix"&&(t=(A.scheme?A.scheme+":":"")+"//"+t);let r=t.match(mMA);if(r){if(i.scheme=r[1],i.userinfo=r[3],i.host=r[4],i.port=parseInt(r[5],10),i.path=r[6]||"",i.query=r[7],i.fragment=r[8],isNaN(i.port)&&(i.port=r[5]),i.host){let a=dMA(i.host);if(a.isIPV4===!1){let c=CMA(a.host);i.host=c.host.toLowerCase(),o=c.isIPV6}else i.host=a.host,o=!0}i.scheme===void 0&&i.userinfo===void 0&&i.host===void 0&&i.port===void 0&&i.query===void 0&&!i.path?i.reference="same-document":i.scheme===void 0?i.reference="relative":i.fragment===void 0?i.reference="absolute":i.reference="uri",A.reference&&A.reference!=="suffix"&&A.reference!==i.reference&&(i.error=i.error||"URI is not a "+A.reference+" reference.");let s=zR[(A.scheme||i.scheme||"").toLowerCase()];if(!A.unicodeSupport&&(!s||!s.unicodeSupport)&&i.host&&(A.domainHost||s&&s.domainHost)&&o===!1&&fMA(i.host))try{i.host=URL.domainToASCII(i.host.toLowerCase())}catch(a){i.error=i.error||"Host's domain name can not be converted to ASCII: "+a}(!s||s&&!s.skipNormalize)&&(n&&i.scheme!==void 0&&(i.scheme=unescape(i.scheme)),n&&i.host!==void 0&&(i.host=unescape(i.host)),i.path&&(i.path=escape(unescape(i.path))),i.fragment&&(i.fragment=encodeURI(decodeURIComponent(i.fragment)))),s&&s.parse&&s.parse(i,A)}else i.error=i.error||"URI can not be parsed.";return i}var OR={SCHEMES:zR,normalize:EMA,resolve:QMA,resolveComponents:u$,equal:hMA,serialize:Dg,parse:K0};K5.exports=OR;K5.exports.default=OR;K5.exports.fastUri=OR});var p$=Je(PR=>{"use strict";Object.defineProperty(PR,"__esModule",{value:!0});var m$=f$();m$.code='require("ajv/dist/runtime/uri").default';PR.default=m$});var S$=Je(ls=>{"use strict";Object.defineProperty(ls,"__esModule",{value:!0});ls.CodeGen=ls.Name=ls.nil=ls.stringify=ls.str=ls._=ls.KeywordCxt=void 0;var pMA=p4();Object.defineProperty(ls,"KeywordCxt",{enumerable:!0,get:function(){return pMA.KeywordCxt}});var EE=An();Object.defineProperty(ls,"_",{enumerable:!0,get:function(){return EE._}});Object.defineProperty(ls,"str",{enumerable:!0,get:function(){return EE.str}});Object.defineProperty(ls,"stringify",{enumerable:!0,get:function(){return EE.stringify}});Object.defineProperty(ls,"nil",{enumerable:!0,get:function(){return EE.nil}});Object.defineProperty(ls,"Name",{enumerable:!0,get:function(){return EE.Name}});Object.defineProperty(ls,"CodeGen",{enumerable:!0,get:function(){return EE.CodeGen}});var wMA=F5(),b$=w4(),DMA=pR(),y4=_5(),yMA=An(),v4=u4(),Y5=h4(),qR=bn(),w$=t$(),vMA=p$(),M$=(t,e)=>new RegExp(t,e);M$.code="new RegExp";var bMA=["removeAdditional","useDefaults","coerceTypes"],MMA=new Set(["validate","serialize","parse","wrapper","root","schema","keyword","pattern","formats","validate$data","func","obj","Error"]),kMA={errorDataPath:"",format:"`validateFormats: false` can be used instead.",nullable:'"nullable" keyword is supported by default.',jsonPointers:"Deprecated jsPropertySyntax can be used instead.",extendRefs:"Deprecated ignoreKeywordsWithRef can be used instead.",missingRefs:"Pass empty schema with $id that should be ignored to ajv.addSchema.",processCode:"Use option `code: {process: (code, schemaEnv: object) => string}`",sourceCode:"Use option `code: {source: true}`",strictDefaults:"It is default now, see option `strict`.",strictKeywords:"It is default now, see option `strict`.",uniqueItems:'"uniqueItems" keyword is always validated.',unknownFormats:"Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).",cache:"Map is used as cache, schema object as key.",serialize:"Map is used as cache, schema object as key.",ajvErrors:"It is default now."},SMA={ignoreKeywordsWithRef:"",jsPropertySyntax:"",unicode:'"minLength"/"maxLength" account for unicode characters by default.'},D$=200;function RMA(t){var e,A,i,n,o,r,s,a,c,l,I,C,d,B,E,h,u,D,L,R,w,_,K,z,U;let H=t.strict,q=(e=t.code)===null||e===void 0?void 0:e.optimize,j=q===!0||q===void 0?1:q||0,gA=(i=(A=t.code)===null||A===void 0?void 0:A.regExp)!==null&&i!==void 0?i:M$,QA=(n=t.uriResolver)!==null&&n!==void 0?n:vMA.default;return{strictSchema:(r=(o=t.strictSchema)!==null&&o!==void 0?o:H)!==null&&r!==void 0?r:!0,strictNumbers:(a=(s=t.strictNumbers)!==null&&s!==void 0?s:H)!==null&&a!==void 0?a:!0,strictTypes:(l=(c=t.strictTypes)!==null&&c!==void 0?c:H)!==null&&l!==void 0?l:"log",strictTuples:(C=(I=t.strictTuples)!==null&&I!==void 0?I:H)!==null&&C!==void 0?C:"log",strictRequired:(B=(d=t.strictRequired)!==null&&d!==void 0?d:H)!==null&&B!==void 0?B:!1,code:t.code?Ye(rA({},t.code),{optimize:j,regExp:gA}):{optimize:j,regExp:gA},loopRequired:(E=t.loopRequired)!==null&&E!==void 0?E:D$,loopEnum:(h=t.loopEnum)!==null&&h!==void 0?h:D$,meta:(u=t.meta)!==null&&u!==void 0?u:!0,messages:(D=t.messages)!==null&&D!==void 0?D:!0,inlineRefs:(L=t.inlineRefs)!==null&&L!==void 0?L:!0,schemaId:(R=t.schemaId)!==null&&R!==void 0?R:"$id",addUsedSchema:(w=t.addUsedSchema)!==null&&w!==void 0?w:!0,validateSchema:(_=t.validateSchema)!==null&&_!==void 0?_:!0,validateFormats:(K=t.validateFormats)!==null&&K!==void 0?K:!0,unicodeRegExp:(z=t.unicodeRegExp)!==null&&z!==void 0?z:!0,int32range:(U=t.int32range)!==null&&U!==void 0?U:!0,uriResolver:QA}}var b4=class{constructor(e={}){this.schemas={},this.refs={},this.formats={},this._compilations=new Set,this._loading={},this._cache=new Map,e=this.opts=rA(rA({},e),RMA(e));let{es5:A,lines:i}=this.opts.code;this.scope=new yMA.ValueScope({scope:{},prefixes:MMA,es5:A,lines:i}),this.logger=GMA(e.logger);let n=e.validateFormats;e.validateFormats=!1,this.RULES=(0,DMA.getRules)(),y$.call(this,kMA,e,"NOT SUPPORTED"),y$.call(this,SMA,e,"DEPRECATED","warn"),this._metaOpts=NMA.call(this),e.formats&&LMA.call(this),this._addVocabularies(),this._addDefaultMetaSchema(),e.keywords&&FMA.call(this,e.keywords),typeof e.meta=="object"&&this.addMetaSchema(e.meta),xMA.call(this),e.validateFormats=n}_addVocabularies(){this.addKeyword("$async")}_addDefaultMetaSchema(){let{$data:e,meta:A,schemaId:i}=this.opts,n=w$;i==="id"&&(n=rA({},w$),n.id=n.$id,delete n.$id),A&&e&&this.addMetaSchema(n,n[i],!1)}defaultMeta(){let{meta:e,schemaId:A}=this.opts;return this.opts.defaultMeta=typeof e=="object"?e[A]||e:void 0}validate(e,A){let i;if(typeof e=="string"){if(i=this.getSchema(e),!i)throw new Error(`no schema with key or ref "${e}"`)}else i=this.compile(e);let n=i(A);return"$async"in i||(this.errors=i.errors),n}compile(e,A){let i=this._addSchema(e,A);return i.validate||this._compileSchemaEnv(i)}compileAsync(e,A){if(typeof this.opts.loadSchema!="function")throw new Error("options.loadSchema should be a function");let{loadSchema:i}=this.opts;return n.call(this,e,A);function n(l,I){return Ao(this,null,function*(){yield o.call(this,l.$schema);let C=this._addSchema(l,I);return C.validate||r.call(this,C)})}function o(l){return Ao(this,null,function*(){l&&!this.getSchema(l)&&(yield n.call(this,{$ref:l},!0))})}function r(l){return Ao(this,null,function*(){try{return this._compileSchemaEnv(l)}catch(I){if(!(I instanceof b$.default))throw I;return s.call(this,I),yield a.call(this,I.missingSchema),r.call(this,l)}})}function s({missingSchema:l,missingRef:I}){if(this.refs[l])throw new Error(`AnySchema ${l} is loaded but ${I} cannot be resolved`)}function a(l){return Ao(this,null,function*(){let I=yield c.call(this,l);this.refs[l]||(yield o.call(this,I.$schema)),this.refs[l]||this.addSchema(I,l,A)})}function c(l){return Ao(this,null,function*(){let I=this._loading[l];if(I)return I;try{return yield this._loading[l]=i(l)}finally{delete this._loading[l]}})}}addSchema(e,A,i,n=this.opts.validateSchema){if(Array.isArray(e)){for(let r of e)this.addSchema(r,void 0,i,n);return this}let o;if(typeof e=="object"){let{schemaId:r}=this.opts;if(o=e[r],o!==void 0&&typeof o!="string")throw new Error(`schema ${r} must be string`)}return A=(0,v4.normalizeId)(A||o),this._checkUnique(A),this.schemas[A]=this._addSchema(e,i,A,n,!0),this}addMetaSchema(e,A,i=this.opts.validateSchema){return this.addSchema(e,A,!0,i),this}validateSchema(e,A){if(typeof e=="boolean")return!0;let i;if(i=e.$schema,i!==void 0&&typeof i!="string")throw new Error("$schema must be a string");if(i=i||this.opts.defaultMeta||this.defaultMeta(),!i)return this.logger.warn("meta-schema not available"),this.errors=null,!0;let n=this.validate(i,e);if(!n&&A){let o="schema is invalid: "+this.errorsText();if(this.opts.validateSchema==="log")this.logger.error(o);else throw new Error(o)}return n}getSchema(e){let A;for(;typeof(A=v$.call(this,e))=="string";)e=A;if(A===void 0){let{schemaId:i}=this.opts,n=new y4.SchemaEnv({schema:{},schemaId:i});if(A=y4.resolveSchema.call(this,n,e),!A)return;this.refs[e]=A}return A.validate||this._compileSchemaEnv(A)}removeSchema(e){if(e instanceof RegExp)return this._removeAllSchemas(this.schemas,e),this._removeAllSchemas(this.refs,e),this;switch(typeof e){case"undefined":return this._removeAllSchemas(this.schemas),this._removeAllSchemas(this.refs),this._cache.clear(),this;case"string":{let A=v$.call(this,e);return typeof A=="object"&&this._cache.delete(A.schema),delete this.schemas[e],delete this.refs[e],this}case"object":{let A=e;this._cache.delete(A);let i=e[this.opts.schemaId];return i&&(i=(0,v4.normalizeId)(i),delete this.schemas[i],delete this.refs[i]),this}default:throw new Error("ajv.removeSchema: invalid parameter")}}addVocabulary(e){for(let A of e)this.addKeyword(A);return this}addKeyword(e,A){let i;if(typeof e=="string")i=e,typeof A=="object"&&(this.logger.warn("these parameters are deprecated, see docs for addKeyword"),A.keyword=i);else if(typeof e=="object"&&A===void 0){if(A=e,i=A.keyword,Array.isArray(i)&&!i.length)throw new Error("addKeywords: keyword must be string or non-empty array")}else throw new Error("invalid addKeywords parameters");if(KMA.call(this,i,A),!A)return(0,qR.eachItem)(i,o=>jR.call(this,o)),this;JMA.call(this,A);let n=Ye(rA({},A),{type:(0,Y5.getJSONTypes)(A.type),schemaType:(0,Y5.getJSONTypes)(A.schemaType)});return(0,qR.eachItem)(i,n.type.length===0?o=>jR.call(this,o,n):o=>n.type.forEach(r=>jR.call(this,o,n,r))),this}getKeyword(e){let A=this.RULES.all[e];return typeof A=="object"?A.definition:!!A}removeKeyword(e){let{RULES:A}=this;delete A.keywords[e],delete A.all[e];for(let i of A.rules){let n=i.rules.findIndex(o=>o.keyword===e);n>=0&&i.rules.splice(n,1)}return this}addFormat(e,A){return typeof A=="string"&&(A=new RegExp(A)),this.formats[e]=A,this}errorsText(e=this.errors,{separator:A=", ",dataVar:i="data"}={}){return!e||e.length===0?"No errors":e.map(n=>`${i}${n.instancePath} ${n.message}`).reduce((n,o)=>n+A+o)}$dataMetaSchema(e,A){let i=this.RULES.all;e=JSON.parse(JSON.stringify(e));for(let n of A){let o=n.split("/").slice(1),r=e;for(let s of o)r=r[s];for(let s in i){let a=i[s];if(typeof a!="object")continue;let{$data:c}=a.definition,l=r[s];c&&l&&(r[s]=k$(l))}}return e}_removeAllSchemas(e,A){for(let i in e){let n=e[i];(!A||A.test(i))&&(typeof n=="string"?delete e[i]:n&&!n.meta&&(this._cache.delete(n.schema),delete e[i]))}}_addSchema(e,A,i,n=this.opts.validateSchema,o=this.opts.addUsedSchema){let r,{schemaId:s}=this.opts;if(typeof e=="object")r=e[s];else{if(this.opts.jtd)throw new Error("schema must be object");if(typeof e!="boolean")throw new Error("schema must be object or boolean")}let a=this._cache.get(e);if(a!==void 0)return a;i=(0,v4.normalizeId)(r||i);let c=v4.getSchemaRefs.call(this,e,i);return a=new y4.SchemaEnv({schema:e,schemaId:s,meta:A,baseId:i,localRefs:c}),this._cache.set(a.schema,a),o&&!i.startsWith("#")&&(i&&this._checkUnique(i),this.refs[i]=a),n&&this.validateSchema(e,!0),a}_checkUnique(e){if(this.schemas[e]||this.refs[e])throw new Error(`schema with key or id "${e}" already exists`)}_compileSchemaEnv(e){if(e.meta?this._compileMetaSchema(e):y4.compileSchema.call(this,e),!e.validate)throw new Error("ajv implementation error");return e.validate}_compileMetaSchema(e){let A=this.opts;this.opts=this._metaOpts;try{y4.compileSchema.call(this,e)}finally{this.opts=A}}};b4.ValidationError=wMA.default;b4.MissingRefError=b$.default;ls.default=b4;function y$(t,e,A,i="error"){for(let n in t){let o=n;o in e&&this.logger[i](`${A}: option ${n}. ${t[o]}`)}}function v$(t){return t=(0,v4.normalizeId)(t),this.schemas[t]||this.refs[t]}function xMA(){let t=this.opts.schemas;if(t)if(Array.isArray(t))this.addSchema(t);else for(let e in t)this.addSchema(t[e],e)}function LMA(){for(let t in this.opts.formats){let e=this.opts.formats[t];e&&this.addFormat(t,e)}}function FMA(t){if(Array.isArray(t)){this.addVocabulary(t);return}this.logger.warn("keywords option as map is deprecated, pass array");for(let e in t){let A=t[e];A.keyword||(A.keyword=e),this.addKeyword(A)}}function NMA(){let t=rA({},this.opts);for(let e of bMA)delete t[e];return t}var _MA={log(){},warn(){},error(){}};function GMA(t){if(t===!1)return _MA;if(t===void 0)return console;if(t.log&&t.warn&&t.error)return t;throw new Error("logger must implement log, warn and error methods")}var UMA=/^[a-z_$][a-z0-9_$:-]*$/i;function KMA(t,e){let{RULES:A}=this;if((0,qR.eachItem)(t,i=>{if(A.keywords[i])throw new Error(`Keyword ${i} is already defined`);if(!UMA.test(i))throw new Error(`Keyword ${i} has invalid name`)}),!!e&&e.$data&&!("code"in e||"validate"in e))throw new Error('$data keyword must have "code" or "validate" function')}function jR(t,e,A){var i;let n=e?.post;if(A&&n)throw new Error('keyword with "post" flag cannot have "type"');let{RULES:o}=this,r=n?o.post:o.rules.find(({type:a})=>a===A);if(r||(r={type:A,rules:[]},o.rules.push(r)),o.keywords[t]=!0,!e)return;let s={keyword:t,definition:Ye(rA({},e),{type:(0,Y5.getJSONTypes)(e.type),schemaType:(0,Y5.getJSONTypes)(e.schemaType)})};e.before?YMA.call(this,r,s,e.before):r.rules.push(s),o.all[t]=s,(i=e.implements)===null||i===void 0||i.forEach(a=>this.addKeyword(a))}function YMA(t,e,A){let i=t.rules.findIndex(n=>n.keyword===A);i>=0?t.rules.splice(i,0,e):(t.rules.push(e),this.logger.warn(`rule ${A} is not defined`))}function JMA(t){let{metaSchema:e}=t;e!==void 0&&(t.$data&&this.opts.$data&&(e=k$(e)),t.validateSchema=this.compile(e,!0))}var TMA={$ref:"https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#"};function k$(t){return{anyOf:[t,TMA]}}});var R$=Je(VR=>{"use strict";Object.defineProperty(VR,"__esModule",{value:!0});var HMA={keyword:"id",code(){throw new Error('NOT SUPPORTED: keyword "id", use "$id" for schema ID')}};VR.default=HMA});var N$=Je(QC=>{"use strict";Object.defineProperty(QC,"__esModule",{value:!0});QC.callRef=QC.getValidate=void 0;var zMA=w4(),x$=_c(),Sa=An(),QE=G0(),L$=_5(),J5=bn(),OMA={keyword:"$ref",schemaType:"string",code(t){let{gen:e,schema:A,it:i}=t,{baseId:n,schemaEnv:o,validateName:r,opts:s,self:a}=i,{root:c}=o;if((A==="#"||A==="#/")&&n===c.baseId)return I();let l=L$.resolveRef.call(a,c,n,A);if(l===void 0)throw new zMA.default(i.opts.uriResolver,n,A);if(l instanceof L$.SchemaEnv)return C(l);return d(l);function I(){if(o===c)return T5(t,r,o,o.$async);let B=e.scopeValue("root",{ref:c});return T5(t,(0,Sa._)`${B}.validate`,c,c.$async)}function C(B){let E=F$(t,B);T5(t,E,B,B.$async)}function d(B){let E=e.scopeValue("schema",s.code.source===!0?{ref:B,code:(0,Sa.stringify)(B)}:{ref:B}),h=e.name("valid"),u=t.subschema({schema:B,dataTypes:[],schemaPath:Sa.nil,topSchemaRef:E,errSchemaPath:A},h);t.mergeEvaluated(u),t.ok(h)}}};function F$(t,e){let{gen:A}=t;return e.validate?A.scopeValue("validate",{ref:e.validate}):(0,Sa._)`${A.scopeValue("wrapper",{ref:e})}.validate`}QC.getValidate=F$;function T5(t,e,A,i){let{gen:n,it:o}=t,{allErrors:r,schemaEnv:s,opts:a}=o,c=a.passContext?QE.default.this:Sa.nil;i?l():I();function l(){if(!s.$async)throw new Error("async schema referenced by sync schema");let B=n.let("valid");n.try(()=>{n.code((0,Sa._)`await ${(0,x$.callValidateCode)(t,e,c)}`),d(e),r||n.assign(B,!0)},E=>{n.if((0,Sa._)`!(${E} instanceof ${o.ValidationError})`,()=>n.throw(E)),C(E),r||n.assign(B,!1)}),t.ok(B)}function I(){t.result((0,x$.callValidateCode)(t,e,c),()=>d(e),()=>C(e))}function C(B){let E=(0,Sa._)`${B}.errors`;n.assign(QE.default.vErrors,(0,Sa._)`${QE.default.vErrors} === null ? ${E} : ${QE.default.vErrors}.concat(${E})`),n.assign(QE.default.errors,(0,Sa._)`${QE.default.vErrors}.length`)}function d(B){var E;if(!o.opts.unevaluated)return;let h=(E=A?.validate)===null||E===void 0?void 0:E.evaluated;if(o.props!==!0)if(h&&!h.dynamicProps)h.props!==void 0&&(o.props=J5.mergeEvaluated.props(n,h.props,o.props));else{let u=n.var("props",(0,Sa._)`${B}.evaluated.props`);o.props=J5.mergeEvaluated.props(n,u,o.props,Sa.Name)}if(o.items!==!0)if(h&&!h.dynamicItems)h.items!==void 0&&(o.items=J5.mergeEvaluated.items(n,h.items,o.items));else{let u=n.var("items",(0,Sa._)`${B}.evaluated.items`);o.items=J5.mergeEvaluated.items(n,u,o.items,Sa.Name)}}}QC.callRef=T5;QC.default=OMA});var _$=Je(ZR=>{"use strict";Object.defineProperty(ZR,"__esModule",{value:!0});var PMA=R$(),jMA=N$(),qMA=["$schema","$id","$defs","$vocabulary",{keyword:"$comment"},"definitions",PMA.default,jMA.default];ZR.default=qMA});var G$=Je(WR=>{"use strict";Object.defineProperty(WR,"__esModule",{value:!0});var H5=An(),h1=H5.operators,z5={maximum:{okStr:"<=",ok:h1.LTE,fail:h1.GT},minimum:{okStr:">=",ok:h1.GTE,fail:h1.LT},exclusiveMaximum:{okStr:"<",ok:h1.LT,fail:h1.GTE},exclusiveMinimum:{okStr:">",ok:h1.GT,fail:h1.LTE}},VMA={message:({keyword:t,schemaCode:e})=>(0,H5.str)`must be ${z5[t].okStr} ${e}`,params:({keyword:t,schemaCode:e})=>(0,H5._)`{comparison: ${z5[t].okStr}, limit: ${e}}`},ZMA={keyword:Object.keys(z5),type:"number",schemaType:"number",$data:!0,error:VMA,code(t){let{keyword:e,data:A,schemaCode:i}=t;t.fail$data((0,H5._)`${A} ${z5[e].fail} ${i} || isNaN(${A})`)}};WR.default=ZMA});var U$=Je(XR=>{"use strict";Object.defineProperty(XR,"__esModule",{value:!0});var M4=An(),WMA={message:({schemaCode:t})=>(0,M4.str)`must be multiple of ${t}`,params:({schemaCode:t})=>(0,M4._)`{multipleOf: ${t}}`},XMA={keyword:"multipleOf",type:"number",schemaType:"number",$data:!0,error:WMA,code(t){let{gen:e,data:A,schemaCode:i,it:n}=t,o=n.opts.multipleOfPrecision,r=e.let("res"),s=o?(0,M4._)`Math.abs(Math.round(${r}) - ${r}) > 1e-${o}`:(0,M4._)`${r} !== parseInt(${r})`;t.fail$data((0,M4._)`(${i} === 0 || (${r} = ${A}/${i}, ${s}))`)}};XR.default=XMA});var Y$=Je($R=>{"use strict";Object.defineProperty($R,"__esModule",{value:!0});function K$(t){let e=t.length,A=0,i=0,n;for(;i=55296&&n<=56319&&i{"use strict";Object.defineProperty(Ax,"__esModule",{value:!0});var hC=An(),$MA=bn(),AkA=Y$(),ekA={message({keyword:t,schemaCode:e}){let A=t==="maxLength"?"more":"fewer";return(0,hC.str)`must NOT have ${A} than ${e} characters`},params:({schemaCode:t})=>(0,hC._)`{limit: ${t}}`},tkA={keyword:["maxLength","minLength"],type:"string",schemaType:"number",$data:!0,error:ekA,code(t){let{keyword:e,data:A,schemaCode:i,it:n}=t,o=e==="maxLength"?hC.operators.GT:hC.operators.LT,r=n.opts.unicode===!1?(0,hC._)`${A}.length`:(0,hC._)`${(0,$MA.useFunc)(t.gen,AkA.default)}(${A})`;t.fail$data((0,hC._)`${r} ${o} ${i}`)}};Ax.default=tkA});var T$=Je(ex=>{"use strict";Object.defineProperty(ex,"__esModule",{value:!0});var ikA=_c(),O5=An(),nkA={message:({schemaCode:t})=>(0,O5.str)`must match pattern "${t}"`,params:({schemaCode:t})=>(0,O5._)`{pattern: ${t}}`},okA={keyword:"pattern",type:"string",schemaType:"string",$data:!0,error:nkA,code(t){let{data:e,$data:A,schema:i,schemaCode:n,it:o}=t,r=o.opts.unicodeRegExp?"u":"",s=A?(0,O5._)`(new RegExp(${n}, ${r}))`:(0,ikA.usePattern)(t,i);t.fail$data((0,O5._)`!${s}.test(${e})`)}};ex.default=okA});var H$=Je(tx=>{"use strict";Object.defineProperty(tx,"__esModule",{value:!0});var k4=An(),rkA={message({keyword:t,schemaCode:e}){let A=t==="maxProperties"?"more":"fewer";return(0,k4.str)`must NOT have ${A} than ${e} properties`},params:({schemaCode:t})=>(0,k4._)`{limit: ${t}}`},skA={keyword:["maxProperties","minProperties"],type:"object",schemaType:"number",$data:!0,error:rkA,code(t){let{keyword:e,data:A,schemaCode:i}=t,n=e==="maxProperties"?k4.operators.GT:k4.operators.LT;t.fail$data((0,k4._)`Object.keys(${A}).length ${n} ${i}`)}};tx.default=skA});var z$=Je(ix=>{"use strict";Object.defineProperty(ix,"__esModule",{value:!0});var S4=_c(),R4=An(),akA=bn(),ckA={message:({params:{missingProperty:t}})=>(0,R4.str)`must have required property '${t}'`,params:({params:{missingProperty:t}})=>(0,R4._)`{missingProperty: ${t}}`},lkA={keyword:"required",type:"object",schemaType:"array",$data:!0,error:ckA,code(t){let{gen:e,schema:A,schemaCode:i,data:n,$data:o,it:r}=t,{opts:s}=r;if(!o&&A.length===0)return;let a=A.length>=s.loopRequired;if(r.allErrors?c():l(),s.strictRequired){let d=t.parentSchema.properties,{definedProperties:B}=t.it;for(let E of A)if(d?.[E]===void 0&&!B.has(E)){let h=r.schemaEnv.baseId+r.errSchemaPath,u=`required property "${E}" is not defined at "${h}" (strictRequired)`;(0,akA.checkStrictMode)(r,u,r.opts.strictRequired)}}function c(){if(a||o)t.block$data(R4.nil,I);else for(let d of A)(0,S4.checkReportMissingProp)(t,d)}function l(){let d=e.let("missing");if(a||o){let B=e.let("valid",!0);t.block$data(B,()=>C(d,B)),t.ok(B)}else e.if((0,S4.checkMissingProp)(t,A,d)),(0,S4.reportMissingProp)(t,d),e.else()}function I(){e.forOf("prop",i,d=>{t.setParams({missingProperty:d}),e.if((0,S4.noPropertyInData)(e,n,d,s.ownProperties),()=>t.error())})}function C(d,B){t.setParams({missingProperty:d}),e.forOf(d,i,()=>{e.assign(B,(0,S4.propertyInData)(e,n,d,s.ownProperties)),e.if((0,R4.not)(B),()=>{t.error(),e.break()})},R4.nil)}}};ix.default=lkA});var O$=Je(nx=>{"use strict";Object.defineProperty(nx,"__esModule",{value:!0});var x4=An(),gkA={message({keyword:t,schemaCode:e}){let A=t==="maxItems"?"more":"fewer";return(0,x4.str)`must NOT have ${A} than ${e} items`},params:({schemaCode:t})=>(0,x4._)`{limit: ${t}}`},IkA={keyword:["maxItems","minItems"],type:"array",schemaType:"number",$data:!0,error:gkA,code(t){let{keyword:e,data:A,schemaCode:i}=t,n=e==="maxItems"?x4.operators.GT:x4.operators.LT;t.fail$data((0,x4._)`${A}.length ${n} ${i}`)}};nx.default=IkA});var P5=Je(ox=>{"use strict";Object.defineProperty(ox,"__esModule",{value:!0});var P$=SR();P$.code='require("ajv/dist/runtime/equal").default';ox.default=P$});var j$=Je(sx=>{"use strict";Object.defineProperty(sx,"__esModule",{value:!0});var rx=h4(),gs=An(),CkA=bn(),dkA=P5(),BkA={message:({params:{i:t,j:e}})=>(0,gs.str)`must NOT have duplicate items (items ## ${e} and ${t} are identical)`,params:({params:{i:t,j:e}})=>(0,gs._)`{i: ${t}, j: ${e}}`},EkA={keyword:"uniqueItems",type:"array",schemaType:"boolean",$data:!0,error:BkA,code(t){let{gen:e,data:A,$data:i,schema:n,parentSchema:o,schemaCode:r,it:s}=t;if(!i&&!n)return;let a=e.let("valid"),c=o.items?(0,rx.getSchemaTypes)(o.items):[];t.block$data(a,l,(0,gs._)`${r} === false`),t.ok(a);function l(){let B=e.let("i",(0,gs._)`${A}.length`),E=e.let("j");t.setParams({i:B,j:E}),e.assign(a,!0),e.if((0,gs._)`${B} > 1`,()=>(I()?C:d)(B,E))}function I(){return c.length>0&&!c.some(B=>B==="object"||B==="array")}function C(B,E){let h=e.name("item"),u=(0,rx.checkDataTypes)(c,h,s.opts.strictNumbers,rx.DataType.Wrong),D=e.const("indices",(0,gs._)`{}`);e.for((0,gs._)`;${B}--;`,()=>{e.let(h,(0,gs._)`${A}[${B}]`),e.if(u,(0,gs._)`continue`),c.length>1&&e.if((0,gs._)`typeof ${h} == "string"`,(0,gs._)`${h} += "_"`),e.if((0,gs._)`typeof ${D}[${h}] == "number"`,()=>{e.assign(E,(0,gs._)`${D}[${h}]`),t.error(),e.assign(a,!1).break()}).code((0,gs._)`${D}[${h}] = ${B}`)})}function d(B,E){let h=(0,CkA.useFunc)(e,dkA.default),u=e.name("outer");e.label(u).for((0,gs._)`;${B}--;`,()=>e.for((0,gs._)`${E} = ${B}; ${E}--;`,()=>e.if((0,gs._)`${h}(${A}[${B}], ${A}[${E}])`,()=>{t.error(),e.assign(a,!1).break(u)})))}}};sx.default=EkA});var q$=Je(cx=>{"use strict";Object.defineProperty(cx,"__esModule",{value:!0});var ax=An(),QkA=bn(),hkA=P5(),ukA={message:"must be equal to constant",params:({schemaCode:t})=>(0,ax._)`{allowedValue: ${t}}`},fkA={keyword:"const",$data:!0,error:ukA,code(t){let{gen:e,data:A,$data:i,schemaCode:n,schema:o}=t;i||o&&typeof o=="object"?t.fail$data((0,ax._)`!${(0,QkA.useFunc)(e,hkA.default)}(${A}, ${n})`):t.fail((0,ax._)`${o} !== ${A}`)}};cx.default=fkA});var V$=Je(lx=>{"use strict";Object.defineProperty(lx,"__esModule",{value:!0});var L4=An(),mkA=bn(),pkA=P5(),wkA={message:"must be equal to one of the allowed values",params:({schemaCode:t})=>(0,L4._)`{allowedValues: ${t}}`},DkA={keyword:"enum",schemaType:"array",$data:!0,error:wkA,code(t){let{gen:e,data:A,$data:i,schema:n,schemaCode:o,it:r}=t;if(!i&&n.length===0)throw new Error("enum must have non-empty array");let s=n.length>=r.opts.loopEnum,a,c=()=>a??(a=(0,mkA.useFunc)(e,pkA.default)),l;if(s||i)l=e.let("valid"),t.block$data(l,I);else{if(!Array.isArray(n))throw new Error("ajv implementation error");let d=e.const("vSchema",o);l=(0,L4.or)(...n.map((B,E)=>C(d,E)))}t.pass(l);function I(){e.assign(l,!1),e.forOf("v",o,d=>e.if((0,L4._)`${c()}(${A}, ${d})`,()=>e.assign(l,!0).break()))}function C(d,B){let E=n[B];return typeof E=="object"&&E!==null?(0,L4._)`${c()}(${A}, ${d}[${B}])`:(0,L4._)`${A} === ${E}`}}};lx.default=DkA});var Z$=Je(gx=>{"use strict";Object.defineProperty(gx,"__esModule",{value:!0});var ykA=G$(),vkA=U$(),bkA=J$(),MkA=T$(),kkA=H$(),SkA=z$(),RkA=O$(),xkA=j$(),LkA=q$(),FkA=V$(),NkA=[ykA.default,vkA.default,bkA.default,MkA.default,kkA.default,SkA.default,RkA.default,xkA.default,{keyword:"type",schemaType:["string","array"]},{keyword:"nullable",schemaType:"boolean"},LkA.default,FkA.default];gx.default=NkA});var Cx=Je(F4=>{"use strict";Object.defineProperty(F4,"__esModule",{value:!0});F4.validateAdditionalItems=void 0;var uC=An(),Ix=bn(),_kA={message:({params:{len:t}})=>(0,uC.str)`must NOT have more than ${t} items`,params:({params:{len:t}})=>(0,uC._)`{limit: ${t}}`},GkA={keyword:"additionalItems",type:"array",schemaType:["boolean","object"],before:"uniqueItems",error:_kA,code(t){let{parentSchema:e,it:A}=t,{items:i}=e;if(!Array.isArray(i)){(0,Ix.checkStrictMode)(A,'"additionalItems" is ignored when "items" is not an array of schemas');return}W$(t,i)}};function W$(t,e){let{gen:A,schema:i,data:n,keyword:o,it:r}=t;r.items=!0;let s=A.const("len",(0,uC._)`${n}.length`);if(i===!1)t.setParams({len:e.length}),t.pass((0,uC._)`${s} <= ${e.length}`);else if(typeof i=="object"&&!(0,Ix.alwaysValidSchema)(r,i)){let c=A.var("valid",(0,uC._)`${s} <= ${e.length}`);A.if((0,uC.not)(c),()=>a(c)),t.ok(c)}function a(c){A.forRange("i",e.length,s,l=>{t.subschema({keyword:o,dataProp:l,dataPropType:Ix.Type.Num},c),r.allErrors||A.if((0,uC.not)(c),()=>A.break())})}}F4.validateAdditionalItems=W$;F4.default=GkA});var dx=Je(N4=>{"use strict";Object.defineProperty(N4,"__esModule",{value:!0});N4.validateTuple=void 0;var X$=An(),j5=bn(),UkA=_c(),KkA={keyword:"items",type:"array",schemaType:["object","array","boolean"],before:"uniqueItems",code(t){let{schema:e,it:A}=t;if(Array.isArray(e))return $$(t,"additionalItems",e);A.items=!0,!(0,j5.alwaysValidSchema)(A,e)&&t.ok((0,UkA.validateArray)(t))}};function $$(t,e,A=t.schema){let{gen:i,parentSchema:n,data:o,keyword:r,it:s}=t;l(n),s.opts.unevaluated&&A.length&&s.items!==!0&&(s.items=j5.mergeEvaluated.items(i,A.length,s.items));let a=i.name("valid"),c=i.const("len",(0,X$._)`${o}.length`);A.forEach((I,C)=>{(0,j5.alwaysValidSchema)(s,I)||(i.if((0,X$._)`${c} > ${C}`,()=>t.subschema({keyword:r,schemaProp:C,dataProp:C},a)),t.ok(a))});function l(I){let{opts:C,errSchemaPath:d}=s,B=A.length,E=B===I.minItems&&(B===I.maxItems||I[e]===!1);if(C.strictTuples&&!E){let h=`"${r}" is ${B}-tuple, but minItems or maxItems/${e} are not specified or different at path "${d}"`;(0,j5.checkStrictMode)(s,h,C.strictTuples)}}}N4.validateTuple=$$;N4.default=KkA});var AAA=Je(Bx=>{"use strict";Object.defineProperty(Bx,"__esModule",{value:!0});var YkA=dx(),JkA={keyword:"prefixItems",type:"array",schemaType:["array"],before:"uniqueItems",code:t=>(0,YkA.validateTuple)(t,"items")};Bx.default=JkA});var tAA=Je(Ex=>{"use strict";Object.defineProperty(Ex,"__esModule",{value:!0});var eAA=An(),TkA=bn(),HkA=_c(),zkA=Cx(),OkA={message:({params:{len:t}})=>(0,eAA.str)`must NOT have more than ${t} items`,params:({params:{len:t}})=>(0,eAA._)`{limit: ${t}}`},PkA={keyword:"items",type:"array",schemaType:["object","boolean"],before:"uniqueItems",error:OkA,code(t){let{schema:e,parentSchema:A,it:i}=t,{prefixItems:n}=A;i.items=!0,!(0,TkA.alwaysValidSchema)(i,e)&&(n?(0,zkA.validateAdditionalItems)(t,n):t.ok((0,HkA.validateArray)(t)))}};Ex.default=PkA});var iAA=Je(Qx=>{"use strict";Object.defineProperty(Qx,"__esModule",{value:!0});var Uc=An(),q5=bn(),jkA={message:({params:{min:t,max:e}})=>e===void 0?(0,Uc.str)`must contain at least ${t} valid item(s)`:(0,Uc.str)`must contain at least ${t} and no more than ${e} valid item(s)`,params:({params:{min:t,max:e}})=>e===void 0?(0,Uc._)`{minContains: ${t}}`:(0,Uc._)`{minContains: ${t}, maxContains: ${e}}`},qkA={keyword:"contains",type:"array",schemaType:["object","boolean"],before:"uniqueItems",trackErrors:!0,error:jkA,code(t){let{gen:e,schema:A,parentSchema:i,data:n,it:o}=t,r,s,{minContains:a,maxContains:c}=i;o.opts.next?(r=a===void 0?1:a,s=c):r=1;let l=e.const("len",(0,Uc._)`${n}.length`);if(t.setParams({min:r,max:s}),s===void 0&&r===0){(0,q5.checkStrictMode)(o,'"minContains" == 0 without "maxContains": "contains" keyword ignored');return}if(s!==void 0&&r>s){(0,q5.checkStrictMode)(o,'"minContains" > "maxContains" is always invalid'),t.fail();return}if((0,q5.alwaysValidSchema)(o,A)){let E=(0,Uc._)`${l} >= ${r}`;s!==void 0&&(E=(0,Uc._)`${E} && ${l} <= ${s}`),t.pass(E);return}o.items=!0;let I=e.name("valid");s===void 0&&r===1?d(I,()=>e.if(I,()=>e.break())):r===0?(e.let(I,!0),s!==void 0&&e.if((0,Uc._)`${n}.length > 0`,C)):(e.let(I,!1),C()),t.result(I,()=>t.reset());function C(){let E=e.name("_valid"),h=e.let("count",0);d(E,()=>e.if(E,()=>B(h)))}function d(E,h){e.forRange("i",0,l,u=>{t.subschema({keyword:"contains",dataProp:u,dataPropType:q5.Type.Num,compositeRule:!0},E),h()})}function B(E){e.code((0,Uc._)`${E}++`),s===void 0?e.if((0,Uc._)`${E} >= ${r}`,()=>e.assign(I,!0).break()):(e.if((0,Uc._)`${E} > ${s}`,()=>e.assign(I,!1).break()),r===1?e.assign(I,!0):e.if((0,Uc._)`${E} >= ${r}`,()=>e.assign(I,!0)))}}};Qx.default=qkA});var rAA=Je(yg=>{"use strict";Object.defineProperty(yg,"__esModule",{value:!0});yg.validateSchemaDeps=yg.validatePropertyDeps=yg.error=void 0;var hx=An(),VkA=bn(),_4=_c();yg.error={message:({params:{property:t,depsCount:e,deps:A}})=>{let i=e===1?"property":"properties";return(0,hx.str)`must have ${i} ${A} when property ${t} is present`},params:({params:{property:t,depsCount:e,deps:A,missingProperty:i}})=>(0,hx._)`{property: ${t}, - missingProperty: ${i}, - depsCount: ${e}, - deps: ${A}}`};var ZkA={keyword:"dependencies",type:"object",schemaType:"object",error:yg.error,code(t){let[e,A]=WkA(t);nAA(t,e),oAA(t,A)}};function WkA({schema:t}){let e={},A={};for(let i in t){if(i==="__proto__")continue;let n=Array.isArray(t[i])?e:A;n[i]=t[i]}return[e,A]}function nAA(t,e=t.schema){let{gen:A,data:i,it:n}=t;if(Object.keys(e).length===0)return;let o=A.let("missing");for(let r in e){let s=e[r];if(s.length===0)continue;let a=(0,_4.propertyInData)(A,i,r,n.opts.ownProperties);t.setParams({property:r,depsCount:s.length,deps:s.join(", ")}),n.allErrors?A.if(a,()=>{for(let c of s)(0,_4.checkReportMissingProp)(t,c)}):(A.if((0,hx._)`${a} && (${(0,_4.checkMissingProp)(t,s,o)})`),(0,_4.reportMissingProp)(t,o),A.else())}}yg.validatePropertyDeps=nAA;function oAA(t,e=t.schema){let{gen:A,data:i,keyword:n,it:o}=t,r=A.name("valid");for(let s in e)(0,VkA.alwaysValidSchema)(o,e[s])||(A.if((0,_4.propertyInData)(A,i,s,o.opts.ownProperties),()=>{let a=t.subschema({keyword:n,schemaProp:s},r);t.mergeValidEvaluated(a,r)},()=>A.var(r,!0)),t.ok(r))}yg.validateSchemaDeps=oAA;yg.default=ZkA});var aAA=Je(ux=>{"use strict";Object.defineProperty(ux,"__esModule",{value:!0});var sAA=An(),XkA=bn(),$kA={message:"property name must be valid",params:({params:t})=>(0,sAA._)`{propertyName: ${t.propertyName}}`},ASA={keyword:"propertyNames",type:"object",schemaType:["object","boolean"],error:$kA,code(t){let{gen:e,schema:A,data:i,it:n}=t;if((0,XkA.alwaysValidSchema)(n,A))return;let o=e.name("valid");e.forIn("key",i,r=>{t.setParams({propertyName:r}),t.subschema({keyword:"propertyNames",data:r,dataTypes:["string"],propertyName:r,compositeRule:!0},o),e.if((0,sAA.not)(o),()=>{t.error(!0),n.allErrors||e.break()})}),t.ok(o)}};ux.default=ASA});var mx=Je(fx=>{"use strict";Object.defineProperty(fx,"__esModule",{value:!0});var V5=_c(),pl=An(),eSA=G0(),Z5=bn(),tSA={message:"must NOT have additional properties",params:({params:t})=>(0,pl._)`{additionalProperty: ${t.additionalProperty}}`},iSA={keyword:"additionalProperties",type:["object"],schemaType:["boolean","object"],allowUndefined:!0,trackErrors:!0,error:tSA,code(t){let{gen:e,schema:A,parentSchema:i,data:n,errsCount:o,it:r}=t;if(!o)throw new Error("ajv implementation error");let{allErrors:s,opts:a}=r;if(r.props=!0,a.removeAdditional!=="all"&&(0,Z5.alwaysValidSchema)(r,A))return;let c=(0,V5.allSchemaProperties)(i.properties),l=(0,V5.allSchemaProperties)(i.patternProperties);I(),t.ok((0,pl._)`${o} === ${eSA.default.errors}`);function I(){e.forIn("key",n,h=>{!c.length&&!l.length?B(h):e.if(C(h),()=>B(h))})}function C(h){let u;if(c.length>8){let D=(0,Z5.schemaRefOrVal)(r,i.properties,"properties");u=(0,V5.isOwnProperty)(e,D,h)}else c.length?u=(0,pl.or)(...c.map(D=>(0,pl._)`${h} === ${D}`)):u=pl.nil;return l.length&&(u=(0,pl.or)(u,...l.map(D=>(0,pl._)`${(0,V5.usePattern)(t,D)}.test(${h})`))),(0,pl.not)(u)}function d(h){e.code((0,pl._)`delete ${n}[${h}]`)}function B(h){if(a.removeAdditional==="all"||a.removeAdditional&&A===!1){d(h);return}if(A===!1){t.setParams({additionalProperty:h}),t.error(),s||e.break();return}if(typeof A=="object"&&!(0,Z5.alwaysValidSchema)(r,A)){let u=e.name("valid");a.removeAdditional==="failing"?(E(h,u,!1),e.if((0,pl.not)(u),()=>{t.reset(),d(h)})):(E(h,u),s||e.if((0,pl.not)(u),()=>e.break()))}}function E(h,u,D){let L={keyword:"additionalProperties",dataProp:h,dataPropType:Z5.Type.Str};D===!1&&Object.assign(L,{compositeRule:!0,createErrors:!1,allErrors:!1}),t.subschema(L,u)}}};fx.default=iSA});var gAA=Je(wx=>{"use strict";Object.defineProperty(wx,"__esModule",{value:!0});var nSA=p4(),cAA=_c(),px=bn(),lAA=mx(),oSA={keyword:"properties",type:"object",schemaType:"object",code(t){let{gen:e,schema:A,parentSchema:i,data:n,it:o}=t;o.opts.removeAdditional==="all"&&i.additionalProperties===void 0&&lAA.default.code(new nSA.KeywordCxt(o,lAA.default,"additionalProperties"));let r=(0,cAA.allSchemaProperties)(A);for(let I of r)o.definedProperties.add(I);o.opts.unevaluated&&r.length&&o.props!==!0&&(o.props=px.mergeEvaluated.props(e,(0,px.toHash)(r),o.props));let s=r.filter(I=>!(0,px.alwaysValidSchema)(o,A[I]));if(s.length===0)return;let a=e.name("valid");for(let I of s)c(I)?l(I):(e.if((0,cAA.propertyInData)(e,n,I,o.opts.ownProperties)),l(I),o.allErrors||e.else().var(a,!0),e.endIf()),t.it.definedProperties.add(I),t.ok(a);function c(I){return o.opts.useDefaults&&!o.compositeRule&&A[I].default!==void 0}function l(I){t.subschema({keyword:"properties",schemaProp:I,dataProp:I},a)}}};wx.default=oSA});var BAA=Je(Dx=>{"use strict";Object.defineProperty(Dx,"__esModule",{value:!0});var IAA=_c(),W5=An(),CAA=bn(),dAA=bn(),rSA={keyword:"patternProperties",type:"object",schemaType:"object",code(t){let{gen:e,schema:A,data:i,parentSchema:n,it:o}=t,{opts:r}=o,s=(0,IAA.allSchemaProperties)(A),a=s.filter(E=>(0,CAA.alwaysValidSchema)(o,A[E]));if(s.length===0||a.length===s.length&&(!o.opts.unevaluated||o.props===!0))return;let c=r.strictSchema&&!r.allowMatchingProperties&&n.properties,l=e.name("valid");o.props!==!0&&!(o.props instanceof W5.Name)&&(o.props=(0,dAA.evaluatedPropsToName)(e,o.props));let{props:I}=o;C();function C(){for(let E of s)c&&d(E),o.allErrors?B(E):(e.var(l,!0),B(E),e.if(l))}function d(E){for(let h in c)new RegExp(E).test(h)&&(0,CAA.checkStrictMode)(o,`property ${h} matches pattern ${E} (use allowMatchingProperties)`)}function B(E){e.forIn("key",i,h=>{e.if((0,W5._)`${(0,IAA.usePattern)(t,E)}.test(${h})`,()=>{let u=a.includes(E);u||t.subschema({keyword:"patternProperties",schemaProp:E,dataProp:h,dataPropType:dAA.Type.Str},l),o.opts.unevaluated&&I!==!0?e.assign((0,W5._)`${I}[${h}]`,!0):!u&&!o.allErrors&&e.if((0,W5.not)(l),()=>e.break())})})}}};Dx.default=rSA});var EAA=Je(yx=>{"use strict";Object.defineProperty(yx,"__esModule",{value:!0});var sSA=bn(),aSA={keyword:"not",schemaType:["object","boolean"],trackErrors:!0,code(t){let{gen:e,schema:A,it:i}=t;if((0,sSA.alwaysValidSchema)(i,A)){t.fail();return}let n=e.name("valid");t.subschema({keyword:"not",compositeRule:!0,createErrors:!1,allErrors:!1},n),t.failResult(n,()=>t.reset(),()=>t.error())},error:{message:"must NOT be valid"}};yx.default=aSA});var QAA=Je(vx=>{"use strict";Object.defineProperty(vx,"__esModule",{value:!0});var cSA=_c(),lSA={keyword:"anyOf",schemaType:"array",trackErrors:!0,code:cSA.validateUnion,error:{message:"must match a schema in anyOf"}};vx.default=lSA});var hAA=Je(bx=>{"use strict";Object.defineProperty(bx,"__esModule",{value:!0});var X5=An(),gSA=bn(),ISA={message:"must match exactly one schema in oneOf",params:({params:t})=>(0,X5._)`{passingSchemas: ${t.passing}}`},CSA={keyword:"oneOf",schemaType:"array",trackErrors:!0,error:ISA,code(t){let{gen:e,schema:A,parentSchema:i,it:n}=t;if(!Array.isArray(A))throw new Error("ajv implementation error");if(n.opts.discriminator&&i.discriminator)return;let o=A,r=e.let("valid",!1),s=e.let("passing",null),a=e.name("_valid");t.setParams({passing:s}),e.block(c),t.result(r,()=>t.reset(),()=>t.error(!0));function c(){o.forEach((l,I)=>{let C;(0,gSA.alwaysValidSchema)(n,l)?e.var(a,!0):C=t.subschema({keyword:"oneOf",schemaProp:I,compositeRule:!0},a),I>0&&e.if((0,X5._)`${a} && ${r}`).assign(r,!1).assign(s,(0,X5._)`[${s}, ${I}]`).else(),e.if(a,()=>{e.assign(r,!0),e.assign(s,I),C&&t.mergeEvaluated(C,X5.Name)})})}}};bx.default=CSA});var uAA=Je(Mx=>{"use strict";Object.defineProperty(Mx,"__esModule",{value:!0});var dSA=bn(),BSA={keyword:"allOf",schemaType:"array",code(t){let{gen:e,schema:A,it:i}=t;if(!Array.isArray(A))throw new Error("ajv implementation error");let n=e.name("valid");A.forEach((o,r)=>{if((0,dSA.alwaysValidSchema)(i,o))return;let s=t.subschema({keyword:"allOf",schemaProp:r},n);t.ok(n),t.mergeEvaluated(s)})}};Mx.default=BSA});var pAA=Je(kx=>{"use strict";Object.defineProperty(kx,"__esModule",{value:!0});var $5=An(),mAA=bn(),ESA={message:({params:t})=>(0,$5.str)`must match "${t.ifClause}" schema`,params:({params:t})=>(0,$5._)`{failingKeyword: ${t.ifClause}}`},QSA={keyword:"if",schemaType:["object","boolean"],trackErrors:!0,error:ESA,code(t){let{gen:e,parentSchema:A,it:i}=t;A.then===void 0&&A.else===void 0&&(0,mAA.checkStrictMode)(i,'"if" without "then" and "else" is ignored');let n=fAA(i,"then"),o=fAA(i,"else");if(!n&&!o)return;let r=e.let("valid",!0),s=e.name("_valid");if(a(),t.reset(),n&&o){let l=e.let("ifClause");t.setParams({ifClause:l}),e.if(s,c("then",l),c("else",l))}else n?e.if(s,c("then")):e.if((0,$5.not)(s),c("else"));t.pass(r,()=>t.error(!0));function a(){let l=t.subschema({keyword:"if",compositeRule:!0,createErrors:!1,allErrors:!1},s);t.mergeEvaluated(l)}function c(l,I){return()=>{let C=t.subschema({keyword:l},s);e.assign(r,s),t.mergeValidEvaluated(C,r),I?e.assign(I,(0,$5._)`${l}`):t.setParams({ifClause:l})}}}};function fAA(t,e){let A=t.schema[e];return A!==void 0&&!(0,mAA.alwaysValidSchema)(t,A)}kx.default=QSA});var wAA=Je(Sx=>{"use strict";Object.defineProperty(Sx,"__esModule",{value:!0});var hSA=bn(),uSA={keyword:["then","else"],schemaType:["object","boolean"],code({keyword:t,parentSchema:e,it:A}){e.if===void 0&&(0,hSA.checkStrictMode)(A,`"${t}" without "if" is ignored`)}};Sx.default=uSA});var DAA=Je(Rx=>{"use strict";Object.defineProperty(Rx,"__esModule",{value:!0});var fSA=Cx(),mSA=AAA(),pSA=dx(),wSA=tAA(),DSA=iAA(),ySA=rAA(),vSA=aAA(),bSA=mx(),MSA=gAA(),kSA=BAA(),SSA=EAA(),RSA=QAA(),xSA=hAA(),LSA=uAA(),FSA=pAA(),NSA=wAA();function _SA(t=!1){let e=[SSA.default,RSA.default,xSA.default,LSA.default,FSA.default,NSA.default,vSA.default,bSA.default,ySA.default,MSA.default,kSA.default];return t?e.push(mSA.default,wSA.default):e.push(fSA.default,pSA.default),e.push(DSA.default),e}Rx.default=_SA});var yAA=Je(xx=>{"use strict";Object.defineProperty(xx,"__esModule",{value:!0});var Qr=An(),GSA={message:({schemaCode:t})=>(0,Qr.str)`must match format "${t}"`,params:({schemaCode:t})=>(0,Qr._)`{format: ${t}}`},USA={keyword:"format",type:["number","string"],schemaType:"string",$data:!0,error:GSA,code(t,e){let{gen:A,data:i,$data:n,schema:o,schemaCode:r,it:s}=t,{opts:a,errSchemaPath:c,schemaEnv:l,self:I}=s;if(!a.validateFormats)return;n?C():d();function C(){let B=A.scopeValue("formats",{ref:I.formats,code:a.code.formats}),E=A.const("fDef",(0,Qr._)`${B}[${r}]`),h=A.let("fType"),u=A.let("format");A.if((0,Qr._)`typeof ${E} == "object" && !(${E} instanceof RegExp)`,()=>A.assign(h,(0,Qr._)`${E}.type || "string"`).assign(u,(0,Qr._)`${E}.validate`),()=>A.assign(h,(0,Qr._)`"string"`).assign(u,E)),t.fail$data((0,Qr.or)(D(),L()));function D(){return a.strictSchema===!1?Qr.nil:(0,Qr._)`${r} && !${u}`}function L(){let R=l.$async?(0,Qr._)`(${E}.async ? await ${u}(${i}) : ${u}(${i}))`:(0,Qr._)`${u}(${i})`,w=(0,Qr._)`(typeof ${u} == "function" ? ${R} : ${u}.test(${i}))`;return(0,Qr._)`${u} && ${u} !== true && ${h} === ${e} && !${w}`}}function d(){let B=I.formats[o];if(!B){D();return}if(B===!0)return;let[E,h,u]=L(B);E===e&&t.pass(R());function D(){if(a.strictSchema===!1){I.logger.warn(w());return}throw new Error(w());function w(){return`unknown format "${o}" ignored in schema at path "${c}"`}}function L(w){let _=w instanceof RegExp?(0,Qr.regexpCode)(w):a.code.formats?(0,Qr._)`${a.code.formats}${(0,Qr.getProperty)(o)}`:void 0,K=A.scopeValue("formats",{key:o,ref:w,code:_});return typeof w=="object"&&!(w instanceof RegExp)?[w.type||"string",w.validate,(0,Qr._)`${K}.validate`]:["string",w,K]}function R(){if(typeof B=="object"&&!(B instanceof RegExp)&&B.async){if(!l.$async)throw new Error("async format in sync schema");return(0,Qr._)`await ${u}(${i})`}return typeof h=="function"?(0,Qr._)`${u}(${i})`:(0,Qr._)`${u}.test(${i})`}}}};xx.default=USA});var vAA=Je(Lx=>{"use strict";Object.defineProperty(Lx,"__esModule",{value:!0});var KSA=yAA(),YSA=[KSA.default];Lx.default=YSA});var bAA=Je(hE=>{"use strict";Object.defineProperty(hE,"__esModule",{value:!0});hE.contentVocabulary=hE.metadataVocabulary=void 0;hE.metadataVocabulary=["title","description","default","deprecated","readOnly","writeOnly","examples"];hE.contentVocabulary=["contentMediaType","contentEncoding","contentSchema"]});var kAA=Je(Fx=>{"use strict";Object.defineProperty(Fx,"__esModule",{value:!0});var JSA=_$(),TSA=Z$(),HSA=DAA(),zSA=vAA(),MAA=bAA(),OSA=[JSA.default,TSA.default,(0,HSA.default)(),zSA.default,MAA.metadataVocabulary,MAA.contentVocabulary];Fx.default=OSA});var RAA=Je(Aw=>{"use strict";Object.defineProperty(Aw,"__esModule",{value:!0});Aw.DiscrError=void 0;var SAA=function(t){return t.Tag="tag",t.Mapping="mapping",t}(SAA||(Aw.DiscrError=SAA={}))});var LAA=Je(_x=>{"use strict";Object.defineProperty(_x,"__esModule",{value:!0});var uE=An(),Nx=RAA(),xAA=_5(),PSA=w4(),jSA=bn(),qSA={message:({params:{discrError:t,tagName:e}})=>t===Nx.DiscrError.Tag?`tag "${e}" must be string`:`value of tag "${e}" must be in oneOf`,params:({params:{discrError:t,tag:e,tagName:A}})=>(0,uE._)`{error: ${t}, tag: ${A}, tagValue: ${e}}`},VSA={keyword:"discriminator",type:"object",schemaType:"object",error:qSA,code(t){let{gen:e,data:A,schema:i,parentSchema:n,it:o}=t,{oneOf:r}=n;if(!o.opts.discriminator)throw new Error("discriminator: requires discriminator option");let s=i.propertyName;if(typeof s!="string")throw new Error("discriminator: requires propertyName");if(i.mapping)throw new Error("discriminator: mapping is not supported");if(!r)throw new Error("discriminator: requires oneOf keyword");let a=e.let("valid",!1),c=e.const("tag",(0,uE._)`${A}${(0,uE.getProperty)(s)}`);e.if((0,uE._)`typeof ${c} == "string"`,()=>l(),()=>t.error(!1,{discrError:Nx.DiscrError.Tag,tag:c,tagName:s})),t.ok(a);function l(){let d=C();e.if(!1);for(let B in d)e.elseIf((0,uE._)`${c} === ${B}`),e.assign(a,I(d[B]));e.else(),t.error(!1,{discrError:Nx.DiscrError.Mapping,tag:c,tagName:s}),e.endIf()}function I(d){let B=e.name("valid"),E=t.subschema({keyword:"oneOf",schemaProp:d},B);return t.mergeEvaluated(E,uE.Name),B}function C(){var d;let B={},E=u(n),h=!0;for(let R=0;R{ZSA.exports={$schema:"http://json-schema.org/draft-07/schema#",$id:"http://json-schema.org/draft-07/schema#",title:"Core schema meta-schema",definitions:{schemaArray:{type:"array",minItems:1,items:{$ref:"#"}},nonNegativeInteger:{type:"integer",minimum:0},nonNegativeIntegerDefault0:{allOf:[{$ref:"#/definitions/nonNegativeInteger"},{default:0}]},simpleTypes:{enum:["array","boolean","integer","null","number","object","string"]},stringArray:{type:"array",items:{type:"string"},uniqueItems:!0,default:[]}},type:["object","boolean"],properties:{$id:{type:"string",format:"uri-reference"},$schema:{type:"string",format:"uri"},$ref:{type:"string",format:"uri-reference"},$comment:{type:"string"},title:{type:"string"},description:{type:"string"},default:!0,readOnly:{type:"boolean",default:!1},examples:{type:"array",items:!0},multipleOf:{type:"number",exclusiveMinimum:0},maximum:{type:"number"},exclusiveMaximum:{type:"number"},minimum:{type:"number"},exclusiveMinimum:{type:"number"},maxLength:{$ref:"#/definitions/nonNegativeInteger"},minLength:{$ref:"#/definitions/nonNegativeIntegerDefault0"},pattern:{type:"string",format:"regex"},additionalItems:{$ref:"#"},items:{anyOf:[{$ref:"#"},{$ref:"#/definitions/schemaArray"}],default:!0},maxItems:{$ref:"#/definitions/nonNegativeInteger"},minItems:{$ref:"#/definitions/nonNegativeIntegerDefault0"},uniqueItems:{type:"boolean",default:!1},contains:{$ref:"#"},maxProperties:{$ref:"#/definitions/nonNegativeInteger"},minProperties:{$ref:"#/definitions/nonNegativeIntegerDefault0"},required:{$ref:"#/definitions/stringArray"},additionalProperties:{$ref:"#"},definitions:{type:"object",additionalProperties:{$ref:"#"},default:{}},properties:{type:"object",additionalProperties:{$ref:"#"},default:{}},patternProperties:{type:"object",additionalProperties:{$ref:"#"},propertyNames:{format:"regex"},default:{}},dependencies:{type:"object",additionalProperties:{anyOf:[{$ref:"#"},{$ref:"#/definitions/stringArray"}]}},propertyNames:{$ref:"#"},const:!0,enum:{type:"array",items:!0,minItems:1,uniqueItems:!0},type:{anyOf:[{$ref:"#/definitions/simpleTypes"},{type:"array",items:{$ref:"#/definitions/simpleTypes"},minItems:1,uniqueItems:!0}]},format:{type:"string"},contentMediaType:{type:"string"},contentEncoding:{type:"string"},if:{$ref:"#"},then:{$ref:"#"},else:{$ref:"#"},allOf:{$ref:"#/definitions/schemaArray"},anyOf:{$ref:"#/definitions/schemaArray"},oneOf:{$ref:"#/definitions/schemaArray"},not:{$ref:"#"}},default:!0}});var _AA=Je((Oo,Gx)=>{"use strict";Object.defineProperty(Oo,"__esModule",{value:!0});Oo.MissingRefError=Oo.ValidationError=Oo.CodeGen=Oo.Name=Oo.nil=Oo.stringify=Oo.str=Oo._=Oo.KeywordCxt=Oo.Ajv=void 0;var WSA=S$(),XSA=kAA(),$SA=LAA(),NAA=FAA(),ARA=["/properties"],ew="http://json-schema.org/draft-07/schema",fE=class extends WSA.default{_addVocabularies(){super._addVocabularies(),XSA.default.forEach(e=>this.addVocabulary(e)),this.opts.discriminator&&this.addKeyword($SA.default)}_addDefaultMetaSchema(){if(super._addDefaultMetaSchema(),!this.opts.meta)return;let e=this.opts.$data?this.$dataMetaSchema(NAA,ARA):NAA;this.addMetaSchema(e,ew,!1),this.refs["http://json-schema.org/schema"]=ew}defaultMeta(){return this.opts.defaultMeta=super.defaultMeta()||(this.getSchema(ew)?ew:void 0)}};Oo.Ajv=fE;Gx.exports=Oo=fE;Gx.exports.Ajv=fE;Object.defineProperty(Oo,"__esModule",{value:!0});Oo.default=fE;var eRA=p4();Object.defineProperty(Oo,"KeywordCxt",{enumerable:!0,get:function(){return eRA.KeywordCxt}});var mE=An();Object.defineProperty(Oo,"_",{enumerable:!0,get:function(){return mE._}});Object.defineProperty(Oo,"str",{enumerable:!0,get:function(){return mE.str}});Object.defineProperty(Oo,"stringify",{enumerable:!0,get:function(){return mE.stringify}});Object.defineProperty(Oo,"nil",{enumerable:!0,get:function(){return mE.nil}});Object.defineProperty(Oo,"Name",{enumerable:!0,get:function(){return mE.Name}});Object.defineProperty(Oo,"CodeGen",{enumerable:!0,get:function(){return mE.CodeGen}});var tRA=F5();Object.defineProperty(Oo,"ValidationError",{enumerable:!0,get:function(){return tRA.default}});var iRA=w4();Object.defineProperty(Oo,"MissingRefError",{enumerable:!0,get:function(){return iRA.default}})});var GAA=Je(tw=>{"use strict";(function(t){"use strict";function e(x){return x!==null?Object.prototype.toString.call(x)==="[object Array]":!1}function A(x){return x!==null?Object.prototype.toString.call(x)==="[object Object]":!1}function i(x,Y){if(x===Y)return!0;var P=Object.prototype.toString.call(x);if(P!==Object.prototype.toString.call(Y))return!1;if(e(x)===!0){if(x.length!==Y.length)return!1;for(var X=0;X",9:"Array"},L="EOF",R="UnquotedIdentifier",w="QuotedIdentifier",_="Rbracket",K="Rparen",z="Comma",U="Colon",H="Rbrace",q="Number",j="Current",gA="Expref",QA="Pipe",BA="Or",lA="And",vA="EQ",tA="GT",cA="LT",pA="GTE",VA="LTE",oe="NE",KA="Flatten",CA="Star",TA="Filter",Ze="Dot",He="Not",uA="Lbrace",eA="Lbracket",UA="Lparen",aA="Literal",le={".":Ze,"*":CA,",":z,":":U,"{":uA,"}":H,"]":_,"(":UA,")":K,"@":j},SA={"<":!0,">":!0,"=":!0,"!":!0},Ue={" ":!0," ":!0,"\n":!0};function mA(x){return x>="a"&&x<="z"||x>="A"&&x<="Z"||x==="_"}function sA(x){return x>="0"&&x<="9"||x==="-"}function xt(x){return x>="a"&&x<="z"||x>="A"&&x<="Z"||x>="0"&&x<="9"||x==="_"}function tt(){}tt.prototype={tokenize:function(x){var Y=[];this._current=0;for(var P,X,bA;this._current")return x[this._current]==="="?(this._current++,{type:pA,value:">=",start:Y}):{type:tA,value:">",start:Y};if(P==="="&&x[this._current]==="=")return this._current++,{type:vA,value:"==",start:Y}},_consumeLiteral:function(x){this._current++;for(var Y=this._current,P=x.length,X;x[this._current]!=="`"&&this._current=0)return!0;if(P.indexOf(x)>=0)return!0;if(X.indexOf(x[0])>=0)try{return JSON.parse(x),!0}catch{return!1}else return!1}};var de={};de[L]=0,de[R]=0,de[w]=0,de[_]=0,de[K]=0,de[z]=0,de[H]=0,de[q]=0,de[j]=0,de[gA]=0,de[QA]=1,de[BA]=2,de[lA]=3,de[vA]=5,de[tA]=5,de[cA]=5,de[pA]=5,de[VA]=5,de[oe]=5,de[KA]=9,de[CA]=20,de[TA]=21,de[Ze]=40,de[He]=45,de[uA]=50,de[eA]=55,de[UA]=60;function Dt(){}Dt.prototype={parse:function(x){this._loadTokens(x),this.index=0;var Y=this.expression(0);if(this._lookahead(0)!==L){var P=this._lookaheadToken(0),X=new Error("Unexpected token type: "+P.type+", value: "+P.value);throw X.name="ParserError",X}return Y},_loadTokens:function(x){var Y=new tt,P=Y.tokenize(x);P.push({type:L,value:"",start:x.length}),this.tokens=P},expression:function(x){var Y=this._lookaheadToken(0);this._advance();for(var P=this.nud(Y),X=this._lookahead(0);x=0)return this.expression(x);if(Y===eA)return this._match(eA),this._parseMultiselectList();if(Y===uA)return this._match(uA),this._parseMultiselectHash()},_parseProjectionRHS:function(x){var Y;if(de[this._lookahead(0)]<10)Y={type:"Identity"};else if(this._lookahead(0)===eA)Y=this.expression(x);else if(this._lookahead(0)===TA)Y=this.expression(x);else if(this._lookahead(0)===Ze)this._match(Ze),Y=this._parseDotRHS(x);else{var P=this._lookaheadToken(0),X=new Error("Sytanx error, unexpected token: "+P.value+"("+P.type+")");throw X.name="ParserError",X}return Y},_parseMultiselectList:function(){for(var x=[];this._lookahead(0)!==_;){var Y=this.expression(0);if(x.push(Y),this._lookahead(0)===z&&(this._match(z),this._lookahead(0)===_))throw new Error("Unexpected token Rbracket")}return this._match(_),{type:"MultiSelectList",children:x}},_parseMultiselectHash:function(){for(var x=[],Y=[R,w],P,X,bA,Be;;){if(P=this._lookaheadToken(0),Y.indexOf(P.type)<0)throw new Error("Expecting an identifier token, got: "+P.type);if(X=P.value,this._advance(),this._match(U),bA=this.expression(0),Be={type:"KeyValuePair",name:X,value:bA},x.push(Be),this._lookahead(0)===z)this._match(z);else if(this._lookahead(0)===H){this._match(H);break}}return{type:"MultiSelectHash",children:x}}};function _e(x){this.runtime=x}_e.prototype={search:function(x,Y){return this.visit(x,Y)},visit:function(x,Y){var P,X,bA,Be,Ee,kA,DA,gt,Ve,ZA;switch(x.type){case"Field":return Y!==null&&A(Y)?(kA=Y[x.name],kA===void 0?null:kA):null;case"Subexpression":for(bA=this.visit(x.children[0],Y),ZA=1;ZA0)for(ZA=qi;ZAxe;ZA+=nn)bA.push(Y[ZA]);return bA;case"Projection":var mi=this.visit(x.children[0],Y);if(!e(mi))return null;for(Ve=[],ZA=0;ZAEe;break;case pA:bA=Be>=Ee;break;case cA:bA=Be=x&&(Y=P<0?x-1:x),Y}};function Le(x){this._interpreter=x,this.functionTable={abs:{_func:this._functionAbs,_signature:[{types:[a]}]},avg:{_func:this._functionAvg,_signature:[{types:[h]}]},ceil:{_func:this._functionCeil,_signature:[{types:[a]}]},contains:{_func:this._functionContains,_signature:[{types:[l,I]},{types:[c]}]},ends_with:{_func:this._functionEndsWith,_signature:[{types:[l]},{types:[l]}]},floor:{_func:this._functionFloor,_signature:[{types:[a]}]},length:{_func:this._functionLength,_signature:[{types:[l,I,C]}]},map:{_func:this._functionMap,_signature:[{types:[B]},{types:[I]}]},max:{_func:this._functionMax,_signature:[{types:[h,u]}]},merge:{_func:this._functionMerge,_signature:[{types:[C],variadic:!0}]},max_by:{_func:this._functionMaxBy,_signature:[{types:[I]},{types:[B]}]},sum:{_func:this._functionSum,_signature:[{types:[h]}]},starts_with:{_func:this._functionStartsWith,_signature:[{types:[l]},{types:[l]}]},min:{_func:this._functionMin,_signature:[{types:[h,u]}]},min_by:{_func:this._functionMinBy,_signature:[{types:[I]},{types:[B]}]},type:{_func:this._functionType,_signature:[{types:[c]}]},keys:{_func:this._functionKeys,_signature:[{types:[C]}]},values:{_func:this._functionValues,_signature:[{types:[C]}]},sort:{_func:this._functionSort,_signature:[{types:[u,h]}]},sort_by:{_func:this._functionSortBy,_signature:[{types:[I]},{types:[B]}]},join:{_func:this._functionJoin,_signature:[{types:[l]},{types:[u]}]},reverse:{_func:this._functionReverse,_signature:[{types:[l,I]}]},to_array:{_func:this._functionToArray,_signature:[{types:[c]}]},to_string:{_func:this._functionToString,_signature:[{types:[c]}]},to_number:{_func:this._functionToNumber,_signature:[{types:[c]}]},not_null:{_func:this._functionNotNull,_signature:[{types:[c],variadic:!0}]}}}Le.prototype={callFunction:function(x,Y){var P=this.functionTable[x];if(P===void 0)throw new Error("Unknown function: "+x+"()");return this._validateArgs(x,Y,P._signature),P._func.call(this,Y)},_validateArgs:function(x,Y,P){var X;if(P[P.length-1].variadic){if(Y.length=0;bA--)X+=P[bA];return X}else{var Be=x[0].slice(0);return Be.reverse(),Be}},_functionAbs:function(x){return Math.abs(x[0])},_functionCeil:function(x){return Math.ceil(x[0])},_functionAvg:function(x){for(var Y=0,P=x[0],X=0;X=0},_functionFloor:function(x){return Math.floor(x[0])},_functionLength:function(x){return A(x[0])?Object.keys(x[0]).length:x[0].length},_functionMap:function(x){for(var Y=[],P=this._interpreter,X=x[0],bA=x[1],Be=0;Be0){var Y=this._getTypeName(x[0][0]);if(Y===a)return Math.max.apply(Math,x[0]);for(var P=x[0],X=P[0],bA=1;bA0){var Y=this._getTypeName(x[0][0]);if(Y===a)return Math.min.apply(Math,x[0]);for(var P=x[0],X=P[0],bA=1;bArt?1:ZAbA&&(bA=Ee,Be=P[kA]);return Be},_functionMinBy:function(x){for(var Y=x[1],P=x[0],X=this.createKeyFunction(Y,[a,l]),bA=1/0,Be,Ee,kA=0;kA"u"?tw.jmespath={}:tw)});function O7(t,e){return Object.is(t,e)}var Lr=null,zf=!1,P7=1,ia=Symbol("SIGNAL");function Ti(t){let e=Lr;return Lr=t,e}function j7(){return Lr}var Bd={version:0,lastCleanEpoch:0,dirty:!1,producerNode:void 0,producerLastReadVersion:void 0,producerIndexOfThis:void 0,nextProducerIndex:0,liveConsumerNode:void 0,liveConsumerIndexOfThis:void 0,consumerAllowSignalWrites:!1,consumerIsAlwaysLive:!1,kind:"unknown",producerMustRecompute:()=>!1,producerRecomputeValue:()=>{},consumerMarkedDirty:()=>{},consumerOnSignalRead:()=>{}};function VQ(t){if(zf)throw new Error("");if(Lr===null)return;Lr.consumerOnSignalRead(t);let e=Lr.nextProducerIndex++;if(Vf(Lr),et.nextProducerIndex;)t.producerNode.pop(),t.producerLastReadVersion.pop(),t.producerIndexOfThis.pop()}}function jf(t){Vf(t);for(let e=0;e0}function Vf(t){t.producerNode??=[],t.producerIndexOfThis??=[],t.producerLastReadVersion??=[]}function ZU(t){t.liveConsumerNode??=[],t.liveConsumerIndexOfThis??=[]}function WU(t){return t.producerNode!==void 0}function Zf(t,e){let A=Object.create(YgA);A.computation=t,e!==void 0&&(A.equal=e);let i=()=>{if(q7(A),VQ(A),A.value===Of)throw A.error;return A.value};return i[ia]=A,i}var T7=Symbol("UNSET"),H7=Symbol("COMPUTING"),Of=Symbol("ERRORED"),YgA=Ye(rA({},Bd),{value:T7,dirty:!0,error:null,equal:O7,kind:"computed",producerMustRecompute(t){return t.value===T7||t.value===H7},producerRecomputeValue(t){if(t.value===H7)throw new Error("Detected cycle in computations.");let e=t.value;t.value=H7;let A=ZQ(t),i,n=!1;try{i=t.computation(),Ti(null),n=e!==T7&&e!==Of&&i!==Of&&t.equal(e,i)}catch(o){i=Of,t.error=o}finally{Pf(t,A)}if(n){t.value=e;return}t.value=i,t.version++}});function JgA(){throw new Error}var XU=JgA;function $U(t){XU(t)}function W7(t){XU=t}var TgA=null;function X7(t,e){let A=Object.create(Wf);A.value=t,e!==void 0&&(A.equal=e);let i=()=>(VQ(A),A.value);return i[ia]=A,i}function XQ(t,e){Z7()||$U(t),t.equal(t.value,e)||(t.value=e,HgA(t))}function $7(t,e){Z7()||$U(t),XQ(t,e(t.value))}var Wf=Ye(rA({},Bd),{equal:O7,value:void 0,kind:"signal"});function HgA(t){t.version++,qU(),V7(t),TgA?.()}function Av(t){let e=Ti(null);try{return t()}finally{Ti(e)}}var ev;function $Q(){return ev}function n0(t){let e=ev;return ev=t,e}var Xf=Symbol("NotFound");function Xt(t){return typeof t=="function"}function Ed(t){let A=t(i=>{Error.call(i),i.stack=new Error().stack});return A.prototype=Object.create(Error.prototype),A.prototype.constructor=A,A}var $f=Ed(t=>function(A){t(this),this.message=A?`${A.length} errors occurred during unsubscription: -${A.map((i,n)=>`${n+1}) ${i.toString()}`).join(` - `)}`:"",this.name="UnsubscriptionError",this.errors=A});function cI(t,e){if(t){let A=t.indexOf(e);0<=A&&t.splice(A,1)}}var Kt=class t{constructor(e){this.initialTeardown=e,this.closed=!1,this._parentage=null,this._finalizers=null}unsubscribe(){let e;if(!this.closed){this.closed=!0;let{_parentage:A}=this;if(A)if(this._parentage=null,Array.isArray(A))for(let o of A)o.remove(this);else A.remove(this);let{initialTeardown:i}=this;if(Xt(i))try{i()}catch(o){e=o instanceof $f?o.errors:[o]}let{_finalizers:n}=this;if(n){this._finalizers=null;for(let o of n)try{AK(o)}catch(r){e=e??[],r instanceof $f?e=[...e,...r.errors]:e.push(r)}}if(e)throw new $f(e)}}add(e){var A;if(e&&e!==this)if(this.closed)AK(e);else{if(e instanceof t){if(e.closed||e._hasParent(this))return;e._addParent(this)}(this._finalizers=(A=this._finalizers)!==null&&A!==void 0?A:[]).push(e)}}_hasParent(e){let{_parentage:A}=this;return A===e||Array.isArray(A)&&A.includes(e)}_addParent(e){let{_parentage:A}=this;this._parentage=Array.isArray(A)?(A.push(e),A):A?[A,e]:e}_removeParent(e){let{_parentage:A}=this;A===e?this._parentage=null:Array.isArray(A)&&cI(A,e)}remove(e){let{_finalizers:A}=this;A&&cI(A,e),e instanceof t&&e._removeParent(this)}};Kt.EMPTY=(()=>{let t=new Kt;return t.closed=!0,t})();var tv=Kt.EMPTY;function Am(t){return t instanceof Kt||t&&"closed"in t&&Xt(t.remove)&&Xt(t.add)&&Xt(t.unsubscribe)}function AK(t){Xt(t)?t():t.unsubscribe()}var $c={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var Qd={setTimeout(t,e,...A){let{delegate:i}=Qd;return i?.setTimeout?i.setTimeout(t,e,...A):setTimeout(t,e,...A)},clearTimeout(t){let{delegate:e}=Qd;return(e?.clearTimeout||clearTimeout)(t)},delegate:void 0};function em(t){Qd.setTimeout(()=>{let{onUnhandledError:e}=$c;if(e)e(t);else throw t})}function Ah(){}var eK=iv("C",void 0,void 0);function tK(t){return iv("E",void 0,t)}function iK(t){return iv("N",t,void 0)}function iv(t,e,A){return{kind:t,value:e,error:A}}var lI=null;function hd(t){if($c.useDeprecatedSynchronousErrorHandling){let e=!lI;if(e&&(lI={errorThrown:!1,error:null}),t(),e){let{errorThrown:A,error:i}=lI;if(lI=null,A)throw i}}else t()}function nK(t){$c.useDeprecatedSynchronousErrorHandling&&lI&&(lI.errorThrown=!0,lI.error=t)}var o0=class extends Kt{constructor(e){super(),this.isStopped=!1,e?(this.destination=e,Am(e)&&e.add(this)):this.destination=VgA}static create(e,A,i){return new r0(e,A,i)}next(e){this.isStopped?ov(iK(e),this):this._next(e)}error(e){this.isStopped?ov(tK(e),this):(this.isStopped=!0,this._error(e))}complete(){this.isStopped?ov(eK,this):(this.isStopped=!0,this._complete())}unsubscribe(){this.closed||(this.isStopped=!0,super.unsubscribe(),this.destination=null)}_next(e){this.destination.next(e)}_error(e){try{this.destination.error(e)}finally{this.unsubscribe()}}_complete(){try{this.destination.complete()}finally{this.unsubscribe()}}},jgA=Function.prototype.bind;function nv(t,e){return jgA.call(t,e)}var rv=class{constructor(e){this.partialObserver=e}next(e){let{partialObserver:A}=this;if(A.next)try{A.next(e)}catch(i){tm(i)}}error(e){let{partialObserver:A}=this;if(A.error)try{A.error(e)}catch(i){tm(i)}else tm(e)}complete(){let{partialObserver:e}=this;if(e.complete)try{e.complete()}catch(A){tm(A)}}},r0=class extends o0{constructor(e,A,i){super();let n;if(Xt(e)||!e)n={next:e??void 0,error:A??void 0,complete:i??void 0};else{let o;this&&$c.useDeprecatedNextContext?(o=Object.create(e),o.unsubscribe=()=>this.unsubscribe(),n={next:e.next&&nv(e.next,o),error:e.error&&nv(e.error,o),complete:e.complete&&nv(e.complete,o)}):n=e}this.destination=new rv(n)}};function tm(t){$c.useDeprecatedSynchronousErrorHandling?nK(t):em(t)}function qgA(t){throw t}function ov(t,e){let{onStoppedNotification:A}=$c;A&&Qd.setTimeout(()=>A(t,e))}var VgA={closed:!0,next:Ah,error:qgA,complete:Ah};var ud=typeof Symbol=="function"&&Symbol.observable||"@@observable";function Ys(t){return t}function sv(...t){return av(t)}function av(t){return t.length===0?Ys:t.length===1?t[0]:function(A){return t.reduce((i,n)=>n(i),A)}}var ct=(()=>{class t{constructor(A){A&&(this._subscribe=A)}lift(A){let i=new t;return i.source=this,i.operator=A,i}subscribe(A,i,n){let o=WgA(A)?A:new r0(A,i,n);return hd(()=>{let{operator:r,source:s}=this;o.add(r?r.call(o,s):s?this._subscribe(o):this._trySubscribe(o))}),o}_trySubscribe(A){try{return this._subscribe(A)}catch(i){A.error(i)}}forEach(A,i){return i=oK(i),new i((n,o)=>{let r=new r0({next:s=>{try{A(s)}catch(a){o(a),r.unsubscribe()}},error:o,complete:n});this.subscribe(r)})}_subscribe(A){var i;return(i=this.source)===null||i===void 0?void 0:i.subscribe(A)}[ud](){return this}pipe(...A){return av(A)(this)}toPromise(A){return A=oK(A),new A((i,n)=>{let o;this.subscribe(r=>o=r,r=>n(r),()=>i(o))})}}return t.create=e=>new t(e),t})();function oK(t){var e;return(e=t??$c.Promise)!==null&&e!==void 0?e:Promise}function ZgA(t){return t&&Xt(t.next)&&Xt(t.error)&&Xt(t.complete)}function WgA(t){return t&&t instanceof o0||ZgA(t)&&Am(t)}function cv(t){return Xt(t?.lift)}function li(t){return e=>{if(cv(e))return e.lift(function(A){try{return t(A,this)}catch(i){this.error(i)}});throw new TypeError("Unable to lift unknown Observable type")}}function ai(t,e,A,i,n){return new lv(t,e,A,i,n)}var lv=class extends o0{constructor(e,A,i,n,o,r){super(e),this.onFinalize=o,this.shouldUnsubscribe=r,this._next=A?function(s){try{A(s)}catch(a){e.error(a)}}:super._next,this._error=n?function(s){try{n(s)}catch(a){e.error(a)}finally{this.unsubscribe()}}:super._error,this._complete=i?function(){try{i()}catch(s){e.error(s)}finally{this.unsubscribe()}}:super._complete}unsubscribe(){var e;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){let{closed:A}=this;super.unsubscribe(),!A&&((e=this.onFinalize)===null||e===void 0||e.call(this))}}};function fd(){return li((t,e)=>{let A=null;t._refCount++;let i=ai(e,void 0,void 0,void 0,()=>{if(!t||t._refCount<=0||0<--t._refCount){A=null;return}let n=t._connection,o=A;A=null,n&&(!o||n===o)&&n.unsubscribe(),e.unsubscribe()});t.subscribe(i),i.closed||(A=t.connect())})}var l2=class extends ct{constructor(e,A){super(),this.source=e,this.subjectFactory=A,this._subject=null,this._refCount=0,this._connection=null,cv(e)&&(this.lift=e.lift)}_subscribe(e){return this.getSubject().subscribe(e)}getSubject(){let e=this._subject;return(!e||e.isStopped)&&(this._subject=this.subjectFactory()),this._subject}_teardown(){this._refCount=0;let{_connection:e}=this;this._subject=this._connection=null,e?.unsubscribe()}connect(){let e=this._connection;if(!e){e=this._connection=new Kt;let A=this.getSubject();e.add(this.source.subscribe(ai(A,void 0,()=>{this._teardown(),A.complete()},i=>{this._teardown(),A.error(i)},()=>this._teardown()))),e.closed&&(this._connection=null,e=Kt.EMPTY)}return e}refCount(){return fd()(this)}};var rK=Ed(t=>function(){t(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"});var OA=(()=>{class t extends ct{constructor(){super(),this.closed=!1,this.currentObservers=null,this.observers=[],this.isStopped=!1,this.hasError=!1,this.thrownError=null}lift(A){let i=new md(this,this);return i.operator=A,i}_throwIfClosed(){if(this.closed)throw new rK}next(A){hd(()=>{if(this._throwIfClosed(),!this.isStopped){this.currentObservers||(this.currentObservers=Array.from(this.observers));for(let i of this.currentObservers)i.next(A)}})}error(A){hd(()=>{if(this._throwIfClosed(),!this.isStopped){this.hasError=this.isStopped=!0,this.thrownError=A;let{observers:i}=this;for(;i.length;)i.shift().error(A)}})}complete(){hd(()=>{if(this._throwIfClosed(),!this.isStopped){this.isStopped=!0;let{observers:A}=this;for(;A.length;)A.shift().complete()}})}unsubscribe(){this.isStopped=this.closed=!0,this.observers=this.currentObservers=null}get observed(){var A;return((A=this.observers)===null||A===void 0?void 0:A.length)>0}_trySubscribe(A){return this._throwIfClosed(),super._trySubscribe(A)}_subscribe(A){return this._throwIfClosed(),this._checkFinalizedStatuses(A),this._innerSubscribe(A)}_innerSubscribe(A){let{hasError:i,isStopped:n,observers:o}=this;return i||n?tv:(this.currentObservers=null,o.push(A),new Kt(()=>{this.currentObservers=null,cI(o,A)}))}_checkFinalizedStatuses(A){let{hasError:i,thrownError:n,isStopped:o}=this;i?A.error(n):o&&A.complete()}asObservable(){let A=new ct;return A.source=this,A}}return t.create=(e,A)=>new md(e,A),t})(),md=class extends OA{constructor(e,A){super(),this.destination=e,this.source=A}next(e){var A,i;(i=(A=this.destination)===null||A===void 0?void 0:A.next)===null||i===void 0||i.call(A,e)}error(e){var A,i;(i=(A=this.destination)===null||A===void 0?void 0:A.error)===null||i===void 0||i.call(A,e)}complete(){var e,A;(A=(e=this.destination)===null||e===void 0?void 0:e.complete)===null||A===void 0||A.call(e)}_subscribe(e){var A,i;return(i=(A=this.source)===null||A===void 0?void 0:A.subscribe(e))!==null&&i!==void 0?i:tv}};var Mi=class extends OA{constructor(e){super(),this._value=e}get value(){return this.getValue()}_subscribe(e){let A=super._subscribe(e);return!A.closed&&e.next(this._value),A}getValue(){let{hasError:e,thrownError:A,_value:i}=this;if(e)throw A;return this._throwIfClosed(),i}next(e){super.next(this._value=e)}};var eh={now(){return(eh.delegate||Date).now()},delegate:void 0};var Al=class extends OA{constructor(e=1/0,A=1/0,i=eh){super(),this._bufferSize=e,this._windowTime=A,this._timestampProvider=i,this._buffer=[],this._infiniteTimeWindow=!0,this._infiniteTimeWindow=A===1/0,this._bufferSize=Math.max(1,e),this._windowTime=Math.max(1,A)}next(e){let{isStopped:A,_buffer:i,_infiniteTimeWindow:n,_timestampProvider:o,_windowTime:r}=this;A||(i.push(e),!n&&i.push(o.now()+r)),this._trimBuffer(),super.next(e)}_subscribe(e){this._throwIfClosed(),this._trimBuffer();let A=this._innerSubscribe(e),{_infiniteTimeWindow:i,_buffer:n}=this,o=n.slice();for(let r=0;rt.complete());function rm(t){return t&&Xt(t.schedule)}function gv(t){return t[t.length-1]}function sm(t){return Xt(gv(t))?t.pop():void 0}function Pl(t){return rm(gv(t))?t.pop():void 0}function aK(t,e){return typeof gv(t)=="number"?t.pop():e}function lK(t,e,A,i){function n(o){return o instanceof A?o:new A(function(r){r(o)})}return new(A||(A=Promise))(function(o,r){function s(l){try{c(i.next(l))}catch(I){r(I)}}function a(l){try{c(i.throw(l))}catch(I){r(I)}}function c(l){l.done?o(l.value):n(l.value).then(s,a)}c((i=i.apply(t,e||[])).next())})}function cK(t){var e=typeof Symbol=="function"&&Symbol.iterator,A=e&&t[e],i=0;if(A)return A.call(t);if(t&&typeof t.length=="number")return{next:function(){return t&&i>=t.length&&(t=void 0),{value:t&&t[i++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function gI(t){return this instanceof gI?(this.v=t,this):new gI(t)}function gK(t,e,A){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var i=A.apply(t,e||[]),n,o=[];return n=Object.create((typeof AsyncIterator=="function"?AsyncIterator:Object).prototype),s("next"),s("throw"),s("return",r),n[Symbol.asyncIterator]=function(){return this},n;function r(d){return function(B){return Promise.resolve(B).then(d,I)}}function s(d,B){i[d]&&(n[d]=function(E){return new Promise(function(h,u){o.push([d,E,h,u])>1||a(d,E)})},B&&(n[d]=B(n[d])))}function a(d,B){try{c(i[d](B))}catch(E){C(o[0][3],E)}}function c(d){d.value instanceof gI?Promise.resolve(d.value.v).then(l,I):C(o[0][2],d)}function l(d){a("next",d)}function I(d){a("throw",d)}function C(d,B){d(B),o.shift(),o.length&&a(o[0][0],o[0][1])}}function IK(t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e=t[Symbol.asyncIterator],A;return e?e.call(t):(t=typeof cK=="function"?cK(t):t[Symbol.iterator](),A={},i("next"),i("throw"),i("return"),A[Symbol.asyncIterator]=function(){return this},A);function i(o){A[o]=t[o]&&function(r){return new Promise(function(s,a){r=t[o](r),n(s,a,r.done,r.value)})}}function n(o,r,s,a){Promise.resolve(a).then(function(c){o({value:c,done:s})},r)}}var wd=t=>t&&typeof t.length=="number"&&typeof t!="function";function am(t){return Xt(t?.then)}function cm(t){return Xt(t[ud])}function lm(t){return Symbol.asyncIterator&&Xt(t?.[Symbol.asyncIterator])}function gm(t){return new TypeError(`You provided ${t!==null&&typeof t=="object"?"an invalid object":`'${t}'`} where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`)}function XgA(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Im=XgA();function Cm(t){return Xt(t?.[Im])}function dm(t){return gK(this,arguments,function*(){let A=t.getReader();try{for(;;){let{value:i,done:n}=yield gI(A.read());if(n)return yield gI(void 0);yield yield gI(i)}}finally{A.releaseLock()}})}function Bm(t){return Xt(t?.getReader)}function eo(t){if(t instanceof ct)return t;if(t!=null){if(cm(t))return $gA(t);if(wd(t))return A0A(t);if(am(t))return e0A(t);if(lm(t))return CK(t);if(Cm(t))return t0A(t);if(Bm(t))return i0A(t)}throw gm(t)}function $gA(t){return new ct(e=>{let A=t[ud]();if(Xt(A.subscribe))return A.subscribe(e);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function A0A(t){return new ct(e=>{for(let A=0;A{t.then(A=>{e.closed||(e.next(A),e.complete())},A=>e.error(A)).then(null,em)})}function t0A(t){return new ct(e=>{for(let A of t)if(e.next(A),e.closed)return;e.complete()})}function CK(t){return new ct(e=>{n0A(t,e).catch(A=>e.error(A))})}function i0A(t){return CK(dm(t))}function n0A(t,e){var A,i,n,o;return lK(this,void 0,void 0,function*(){try{for(A=IK(t);i=yield A.next(),!i.done;){let r=i.value;if(e.next(r),e.closed)return}}catch(r){n={error:r}}finally{try{i&&!i.done&&(o=A.return)&&(yield o.call(A))}finally{if(n)throw n.error}}e.complete()})}function na(t,e,A,i=0,n=!1){let o=e.schedule(function(){A(),n?t.add(this.schedule(null,i)):this.unsubscribe()},i);if(t.add(o),!n)return o}function Em(t,e=0){return li((A,i)=>{A.subscribe(ai(i,n=>na(i,t,()=>i.next(n),e),()=>na(i,t,()=>i.complete(),e),n=>na(i,t,()=>i.error(n),e)))})}function Qm(t,e=0){return li((A,i)=>{i.add(t.schedule(()=>A.subscribe(i),e))})}function dK(t,e){return eo(t).pipe(Qm(e),Em(e))}function BK(t,e){return eo(t).pipe(Qm(e),Em(e))}function EK(t,e){return new ct(A=>{let i=0;return e.schedule(function(){i===t.length?A.complete():(A.next(t[i++]),A.closed||this.schedule())})})}function QK(t,e){return new ct(A=>{let i;return na(A,e,()=>{i=t[Im](),na(A,e,()=>{let n,o;try{({value:n,done:o}=i.next())}catch(r){A.error(r);return}o?A.complete():A.next(n)},0,!0)}),()=>Xt(i?.return)&&i.return()})}function hm(t,e){if(!t)throw new Error("Iterable cannot be null");return new ct(A=>{na(A,e,()=>{let i=t[Symbol.asyncIterator]();na(A,e,()=>{i.next().then(n=>{n.done?A.complete():A.next(n.value)})},0,!0)})})}function hK(t,e){return hm(dm(t),e)}function uK(t,e){if(t!=null){if(cm(t))return dK(t,e);if(wd(t))return EK(t,e);if(am(t))return BK(t,e);if(lm(t))return hm(t,e);if(Cm(t))return QK(t,e);if(Bm(t))return hK(t,e)}throw gm(t)}function oo(t,e){return e?uK(t,e):eo(t)}function Me(...t){let e=Pl(t);return oo(t,e)}function g2(t,e){let A=Xt(t)?t:()=>t,i=n=>n.error(A());return new ct(e?n=>e.schedule(i,0,n):i)}function I2(t){return!!t&&(t instanceof ct||Xt(t.lift)&&Xt(t.subscribe))}var s0=Ed(t=>function(){t(this),this.name="EmptyError",this.message="no elements in sequence"});function fK(t){return t instanceof Date&&!isNaN(t)}function je(t,e){return li((A,i)=>{let n=0;A.subscribe(ai(i,o=>{i.next(t.call(e,o,n++))}))})}var{isArray:o0A}=Array;function r0A(t,e){return o0A(e)?t(...e):t(e)}function Dd(t){return je(e=>r0A(t,e))}var{isArray:s0A}=Array,{getPrototypeOf:a0A,prototype:c0A,keys:l0A}=Object;function um(t){if(t.length===1){let e=t[0];if(s0A(e))return{args:e,keys:null};if(g0A(e)){let A=l0A(e);return{args:A.map(i=>e[i]),keys:A}}}return{args:t,keys:null}}function g0A(t){return t&&typeof t=="object"&&a0A(t)===c0A}function fm(t,e){return t.reduce((A,i,n)=>(A[i]=e[n],A),{})}function Js(...t){let e=Pl(t),A=sm(t),{args:i,keys:n}=um(t);if(i.length===0)return oo([],e);let o=new ct(I0A(i,e,n?r=>fm(n,r):Ys));return A?o.pipe(Dd(A)):o}function I0A(t,e,A=Ys){return i=>{mK(e,()=>{let{length:n}=t,o=new Array(n),r=n,s=n;for(let a=0;a{let c=oo(t[a],e),l=!1;c.subscribe(ai(i,I=>{o[a]=I,l||(l=!0,s--),s||i.next(A(o.slice()))},()=>{--r||i.complete()}))},i)},i)}}function mK(t,e,A){t?na(A,t,e):e()}function pK(t,e,A,i,n,o,r,s){let a=[],c=0,l=0,I=!1,C=()=>{I&&!a.length&&!c&&e.complete()},d=E=>c{o&&e.next(E),c++;let h=!1;eo(A(E,l++)).subscribe(ai(e,u=>{n?.(u),o?d(u):e.next(u)},()=>{h=!0},void 0,()=>{if(h)try{for(c--;a.length&&cB(u)):B(u)}C()}catch(u){e.error(u)}}))};return t.subscribe(ai(e,d,()=>{I=!0,C()})),()=>{s?.()}}function tr(t,e,A=1/0){return Xt(e)?tr((i,n)=>je((o,r)=>e(i,o,n,r))(eo(t(i,n))),A):(typeof e=="number"&&(A=e),li((i,n)=>pK(i,n,t,A)))}function C2(t=1/0){return tr(Ys,t)}function wK(){return C2(1)}function d2(...t){return wK()(oo(t,Pl(t)))}function jl(t){return new ct(e=>{eo(t()).subscribe(e)})}function nh(...t){let e=sm(t),{args:A,keys:i}=um(t),n=new ct(o=>{let{length:r}=A;if(!r){o.complete();return}let s=new Array(r),a=r,c=r;for(let l=0;l{I||(I=!0,c--),s[l]=C},()=>a--,void 0,()=>{(!a||!I)&&(c||o.next(i?fm(i,s):s),o.complete())}))}});return e?n.pipe(Dd(e)):n}var C0A=["addListener","removeListener"],d0A=["addEventListener","removeEventListener"],B0A=["on","off"];function oh(t,e,A,i){if(Xt(A)&&(i=A,A=void 0),i)return oh(t,e,A).pipe(Dd(i));let[n,o]=h0A(t)?d0A.map(r=>s=>t[r](e,s,A)):E0A(t)?C0A.map(DK(t,e)):Q0A(t)?B0A.map(DK(t,e)):[];if(!n&&wd(t))return tr(r=>oh(r,e,A))(eo(t));if(!n)throw new TypeError("Invalid event target");return new ct(r=>{let s=(...a)=>r.next(1o(s)})}function DK(t,e){return A=>i=>t[A](e,i)}function E0A(t){return Xt(t.addListener)&&Xt(t.removeListener)}function Q0A(t){return Xt(t.on)&&Xt(t.off)}function h0A(t){return Xt(t.addEventListener)&&Xt(t.removeEventListener)}function II(t=0,e,A=sK){let i=-1;return e!=null&&(rm(e)?A=e:i=e),new ct(n=>{let o=fK(t)?+t-A.now():t;o<0&&(o=0);let r=0;return A.schedule(function(){n.closed||(n.next(r++),0<=i?this.schedule(void 0,i):n.complete())},o)})}function zn(...t){let e=Pl(t),A=aK(t,1/0),i=t;return i.length?i.length===1?eo(i[0]):C2(A)(oo(i,e)):sr}function kt(t,e){return li((A,i)=>{let n=0;A.subscribe(ai(i,o=>t.call(e,o,n++)&&i.next(o)))})}function yK(t){return li((e,A)=>{let i=!1,n=null,o=null,r=!1,s=()=>{if(o?.unsubscribe(),o=null,i){i=!1;let c=n;n=null,A.next(c)}r&&A.complete()},a=()=>{o=null,r&&A.complete()};e.subscribe(ai(A,c=>{i=!0,n=c,o||eo(t(c)).subscribe(o=ai(A,s,a))},()=>{r=!0,(!i||!o||o.closed)&&A.complete()}))})}function yd(t,e=ih){return yK(()=>II(t,e))}function mr(t){return li((e,A)=>{let i=null,n=!1,o;i=e.subscribe(ai(A,void 0,void 0,r=>{o=eo(t(r,mr(t)(e))),i?(i.unsubscribe(),i=null,o.subscribe(A)):n=!0})),n&&(i.unsubscribe(),i=null,o.subscribe(A))})}function vK(t,e,A,i,n){return(o,r)=>{let s=A,a=e,c=0;o.subscribe(ai(r,l=>{let I=c++;a=s?t(a,l,I):(s=!0,l),i&&r.next(a)},n&&(()=>{s&&r.next(a),r.complete()})))}}function ql(t,e){return Xt(e)?tr(t,e,1):tr(t,1)}function el(t,e=ih){return li((A,i)=>{let n=null,o=null,r=null,s=()=>{if(n){n.unsubscribe(),n=null;let c=o;o=null,i.next(c)}};function a(){let c=r+t,l=e.now();if(l{o=c,r=e.now(),n||(n=e.schedule(a,t),i.add(n))},()=>{s(),i.complete()},void 0,()=>{o=n=null}))})}function B2(t){return li((e,A)=>{let i=!1;e.subscribe(ai(A,n=>{i=!0,A.next(n)},()=>{i||A.next(t),A.complete()}))})}function On(t){return t<=0?()=>sr:li((e,A)=>{let i=0;e.subscribe(ai(A,n=>{++i<=t&&(A.next(n),t<=i&&A.complete())}))})}function vd(t){return je(()=>t)}function tl(t,e=Ys){return t=t??u0A,li((A,i)=>{let n,o=!0;A.subscribe(ai(i,r=>{let s=e(r);(o||!t(n,s))&&(o=!1,n=s,i.next(r))}))})}function u0A(t,e){return t===e}function mm(t=f0A){return li((e,A)=>{let i=!1;e.subscribe(ai(A,n=>{i=!0,A.next(n)},()=>i?A.complete():A.error(t())))})}function f0A(){return new s0}function Vl(t){return li((e,A)=>{try{e.subscribe(A)}finally{A.add(t)}})}function Zl(t,e){let A=arguments.length>=2;return i=>i.pipe(t?kt((n,o)=>t(n,o,i)):Ys,On(1),A?B2(e):mm(()=>new s0))}function bd(t){return t<=0?()=>sr:li((e,A)=>{let i=[];e.subscribe(ai(A,n=>{i.push(n),t{for(let n of i)A.next(n);A.complete()},void 0,()=>{i=null}))})}function Iv(t,e){let A=arguments.length>=2;return i=>i.pipe(t?kt((n,o)=>t(n,o,i)):Ys,bd(1),A?B2(e):mm(()=>new s0))}function pm(){return li((t,e)=>{let A,i=!1;t.subscribe(ai(e,n=>{let o=A;A=n,i&&e.next([o,n]),i=!0}))})}function Cv(t,e){return li(vK(t,e,arguments.length>=2,!0))}function rh(t={}){let{connector:e=()=>new OA,resetOnError:A=!0,resetOnComplete:i=!0,resetOnRefCountZero:n=!0}=t;return o=>{let r,s,a,c=0,l=!1,I=!1,C=()=>{s?.unsubscribe(),s=void 0},d=()=>{C(),r=a=void 0,l=I=!1},B=()=>{let E=r;d(),E?.unsubscribe()};return li((E,h)=>{c++,!I&&!l&&C();let u=a=a??e();h.add(()=>{c--,c===0&&!I&&!l&&(s=dv(B,n))}),u.subscribe(h),!r&&c>0&&(r=new r0({next:D=>u.next(D),error:D=>{I=!0,C(),s=dv(d,A,D),u.error(D)},complete:()=>{l=!0,C(),s=dv(d,i),u.complete()}}),eo(E).subscribe(r))})(o)}}function dv(t,e,...A){if(e===!0){t();return}if(e===!1)return;let i=new r0({next:()=>{i.unsubscribe(),t()}});return eo(e(...A)).subscribe(i)}function a0(t,e,A){let i,n=!1;return t&&typeof t=="object"?{bufferSize:i=1/0,windowTime:e=1/0,refCount:n=!1,scheduler:A}=t:i=t??1/0,rh({connector:()=>new Al(i,e,A),resetOnError:!0,resetOnComplete:!1,resetOnRefCountZero:n})}function CI(t){return kt((e,A)=>t<=A)}function Pn(...t){let e=Pl(t);return li((A,i)=>{(e?d2(t,A,e):d2(t,A)).subscribe(i)})}function jn(t,e){return li((A,i)=>{let n=null,o=0,r=!1,s=()=>r&&!n&&i.complete();A.subscribe(ai(i,a=>{n?.unsubscribe();let c=0,l=o++;eo(t(a,l)).subscribe(n=ai(i,I=>i.next(e?e(a,I,l,c++):I),()=>{n=null,s()}))},()=>{r=!0,s()}))})}function St(t){return li((e,A)=>{eo(t).subscribe(ai(A,()=>A.complete(),Ah)),!A.closed&&e.subscribe(A)})}function Bv(t,e=!1){return li((A,i)=>{let n=0;A.subscribe(ai(i,o=>{let r=t(o,n++);(r||e)&&i.next(o),!r&&i.complete()}))})}function Qo(t,e,A){let i=Xt(t)||e||A?{next:t,error:e,complete:A}:t;return i?li((n,o)=>{var r;(r=i.subscribe)===null||r===void 0||r.call(i);let s=!0;n.subscribe(ai(o,a=>{var c;(c=i.next)===null||c===void 0||c.call(i,a),o.next(a)},()=>{var a;s=!1,(a=i.complete)===null||a===void 0||a.call(i),o.complete()},a=>{var c;s=!1,(c=i.error)===null||c===void 0||c.call(i,a),o.error(a)},()=>{var a,c;s&&((a=i.unsubscribe)===null||a===void 0||a.call(i)),(c=i.finalize)===null||c===void 0||c.call(i)}))}):Ys}var uY="https://angular.dev/best-practices/security#preventing-cross-site-scripting-xss",Ae=class extends Error{code;constructor(e,A){super(K9(e,A)),this.code=e}};function m0A(t){return`NG0${Math.abs(t)}`}function K9(t,e){return`${m0A(t)}${e?": "+e:""}`}var fY=Symbol("InputSignalNode#UNSET"),p0A=Ye(rA({},Wf),{transformFn:void 0,applyValueToInputSignal(t,e){XQ(t,e)}});function mY(t,e){let A=Object.create(p0A);A.value=t,A.transformFn=e?.transform;function i(){if(VQ(A),A.value===fY){let n=null;throw new Ae(-950,n)}return A.value}return i[ia]=A,i}function uh(t){return{toString:t}.toString()}var wm="__parameters__";function w0A(t){return function(...A){if(t){let i=t(...A);for(let n in i)this[n]=i[n]}}}function pY(t,e,A){return uh(()=>{let i=w0A(e);function n(...o){if(this instanceof n)return i.apply(this,o),this;let r=new n(...o);return s.annotation=r,s;function s(a,c,l){let I=a.hasOwnProperty(wm)?a[wm]:Object.defineProperty(a,wm,{value:[]})[wm];for(;I.length<=l;)I.push(null);return(I[l]=I[l]||[]).push(r),a}}return n.prototype.ngMetadataName=t,n.annotationCls=n,n})}var sa=globalThis;function ho(t){for(let e in t)if(t[e]===ho)return e;throw Error("Could not find renamed property on target object.")}function D0A(t,e){for(let A in e)e.hasOwnProperty(A)&&!t.hasOwnProperty(A)&&(t[A]=e[A])}function ra(t){if(typeof t=="string")return t;if(Array.isArray(t))return`[${t.map(ra).join(", ")}]`;if(t==null)return""+t;let e=t.overriddenName||t.name;if(e)return`${e}`;let A=t.toString();if(A==null)return""+A;let i=A.indexOf(` -`);return i>=0?A.slice(0,i):A}function Sv(t,e){return t?e?`${t} ${e}`:t:e||""}var y0A=ho({__forward_ref__:ho});function Ir(t){return t.__forward_ref__=Ir,t.toString=function(){return ra(this())},t}function ns(t){return wY(t)?t():t}function wY(t){return typeof t=="function"&&t.hasOwnProperty(y0A)&&t.__forward_ref__===Ir}function NA(t){return{token:t.token,providedIn:t.providedIn||null,factory:t.factory,value:void 0}}function Ie(t){return{providers:t.providers||[],imports:t.imports||[]}}function lp(t){return bK(t,yY)||bK(t,vY)}function DY(t){return lp(t)!==null}function bK(t,e){return t.hasOwnProperty(e)?t[e]:null}function v0A(t){let e=t&&(t[yY]||t[vY]);return e||null}function MK(t){return t&&(t.hasOwnProperty(kK)||t.hasOwnProperty(b0A))?t[kK]:null}var yY=ho({\u0275prov:ho}),kK=ho({\u0275inj:ho}),vY=ho({ngInjectableDef:ho}),b0A=ho({ngInjectorDef:ho}),dA=class{_desc;ngMetadataName="InjectionToken";\u0275prov;constructor(e,A){this._desc=e,this.\u0275prov=void 0,typeof A=="number"?this.__NG_ELEMENT_ID__=A:A!==void 0&&(this.\u0275prov=NA({token:this,providedIn:A.providedIn||"root",factory:A.factory}))}get multi(){return this}toString(){return`InjectionToken ${this._desc}`}};function bY(t){return t&&!!t.\u0275providers}var M0A=ho({\u0275cmp:ho}),k0A=ho({\u0275dir:ho}),S0A=ho({\u0275pipe:ho}),R0A=ho({\u0275mod:ho}),Fm=ho({\u0275fac:ho}),lh=ho({__NG_ELEMENT_ID__:ho}),SK=ho({__NG_ENV_ID__:ho});function EI(t){return typeof t=="string"?t:t==null?"":String(t)}function x0A(t){return typeof t=="function"?t.name||t.toString():typeof t=="object"&&t!=null&&typeof t.type=="function"?t.type.name||t.type.toString():EI(t)}function MY(t,e){throw new Ae(-200,t)}function Y9(t,e){throw new Ae(-201,!1)}var Gi=function(t){return t[t.Default=0]="Default",t[t.Host=1]="Host",t[t.Self=2]="Self",t[t.SkipSelf=4]="SkipSelf",t[t.Optional=8]="Optional",t}(Gi||{}),Rv;function kY(){return Rv}function oa(t){let e=Rv;return Rv=t,e}function SY(t,e,A){let i=lp(t);if(i&&i.providedIn=="root")return i.value===void 0?i.value=i.factory():i.value;if(A&Gi.Optional)return null;if(e!==void 0)return e;Y9(t,"Injector")}var L0A={},dI=L0A,xv="__NG_DI_FLAG__",Nm=class{injector;constructor(e){this.injector=e}retrieve(e,A){let i=A;return this.injector.get(e,i.optional?Xf:dI,i)}},_m="ngTempTokenPath",F0A="ngTokenPath",N0A=/\n/gm,_0A="\u0275",RK="__source";function G0A(t,e=Gi.Default){if($Q()===void 0)throw new Ae(-203,!1);if($Q()===null)return SY(t,void 0,e);{let A=$Q(),i;return A instanceof Nm?i=A.injector:i=A,i.get(t,e&Gi.Optional?null:void 0,e)}}function we(t,e=Gi.Default){return(kY()||G0A)(ns(t),e)}function f(t,e=Gi.Default){return we(t,gp(e))}function gp(t){return typeof t>"u"||typeof t=="number"?t:0|(t.optional&&8)|(t.host&&1)|(t.self&&2)|(t.skipSelf&&4)}function Lv(t){let e=[];for(let A=0;A ");else if(typeof e=="object"){let o=[];for(let r in e)if(e.hasOwnProperty(r)){let s=e[r];o.push(r+":"+(typeof s=="string"?JSON.stringify(s):ra(s)))}n=`{${o.join(", ")}}`}return`${A}${i?"("+i+")":""}[${n}]: ${t.replace(N0A,` - `)}`}var MI=RY(pY("Optional"),8);var fh=RY(pY("SkipSelf"),4);function QI(t,e){let A=t.hasOwnProperty(Fm);return A?t[Fm]:null}function J0A(t,e,A){if(t.length!==e.length)return!1;for(let i=0;iArray.isArray(A)?J9(A,e):e(A))}function xY(t,e,A){e>=t.length?t.push(A):t.splice(e,0,A)}function Gm(t,e){return e>=t.length-1?t.pop():t.splice(e,1)[0]}function H0A(t,e){let A=[];for(let i=0;ie;){let o=n-2;t[n]=t[o],n--}t[e]=A,t[e+1]=i}}function Ip(t,e,A){let i=mh(t,e);return i>=0?t[i|1]=A:(i=~i,z0A(t,i,e,A)),i}function Ev(t,e){let A=mh(t,e);if(A>=0)return t[A|1]}function mh(t,e){return O0A(t,e,1)}function O0A(t,e,A){let i=0,n=t.length>>A;for(;n!==i;){let o=i+(n-i>>1),r=t[o<e?n=o:i=o+1}return~(n<{A.push(r)};return J9(e,r=>{let s=r;Fv(s,o,[],i)&&(n||=[],n.push(s))}),n!==void 0&&UY(n,o),A}function UY(t,e){for(let A=0;A{e(o,i)})}}function Fv(t,e,A,i){if(t=ns(t),!t)return!1;let n=null,o=MK(t),r=!o&&h2(t);if(!o&&!r){let a=t.ngModule;if(o=MK(a),o)n=a;else return!1}else{if(r&&!r.standalone)return!1;n=t}let s=i.has(n);if(r){if(s)return!1;if(i.add(n),r.dependencies){let a=typeof r.dependencies=="function"?r.dependencies():r.dependencies;for(let c of a)Fv(c,e,A,i)}}else if(o){if(o.imports!=null&&!s){i.add(n);let c;try{J9(o.imports,l=>{Fv(l,e,A,i)&&(c||=[],c.push(l))})}finally{}c!==void 0&&UY(c,e)}if(!s){let c=QI(n)||(()=>new n);e({provide:n,useFactory:c,deps:Ts},n),e({provide:FY,useValue:n,multi:!0},n),e({provide:Fd,useValue:()=>we(n),multi:!0},n)}let a=o.providers;if(a!=null&&!s){let c=t;T9(a,l=>{e(l,c)})}}else return!1;return n!==t&&t.providers!==void 0}function T9(t,e){for(let A of t)bY(A)&&(A=A.\u0275providers),Array.isArray(A)?T9(A,e):e(A)}var q0A=ho({provide:String,useValue:ho});function KY(t){return t!==null&&typeof t=="object"&&q0A in t}function V0A(t){return!!(t&&t.useExisting)}function Z0A(t){return!!(t&&t.useFactory)}function Nd(t){return typeof t=="function"}function W0A(t){return!!t.useClass}var Cp=new dA(""),km={},xK={},Qv;function dp(){return Qv===void 0&&(Qv=new Um),Qv}var pr=class{},Ih=class extends pr{parent;source;scopes;records=new Map;_ngOnDestroyHooks=new Set;_onDestroyHooks=[];get destroyed(){return this._destroyed}_destroyed=!1;injectorDefTypes;constructor(e,A,i,n){super(),this.parent=A,this.source=i,this.scopes=n,_v(e,r=>this.processProvider(r)),this.records.set(LY,Md(void 0,this)),n.has("environment")&&this.records.set(pr,Md(void 0,this));let o=this.records.get(Cp);o!=null&&typeof o.value=="string"&&this.scopes.add(o.value),this.injectorDefTypes=new Set(this.get(FY,Ts,Gi.Self))}retrieve(e,A){let i=A;return this.get(e,i.optional?Xf:dI,i)}destroy(){ah(this),this._destroyed=!0;let e=Ti(null);try{for(let i of this._ngOnDestroyHooks)i.ngOnDestroy();let A=this._onDestroyHooks;this._onDestroyHooks=[];for(let i of A)i()}finally{this.records.clear(),this._ngOnDestroyHooks.clear(),this.injectorDefTypes.clear(),Ti(e)}}onDestroy(e){return ah(this),this._onDestroyHooks.push(e),()=>this.removeOnDestroy(e)}runInContext(e){ah(this);let A=n0(this),i=oa(void 0),n;try{return e()}finally{n0(A),oa(i)}}get(e,A=dI,i=Gi.Default){if(ah(this),e.hasOwnProperty(SK))return e[SK](this);i=gp(i);let n,o=n0(this),r=oa(void 0);try{if(!(i&Gi.SkipSelf)){let a=this.records.get(e);if(a===void 0){let c=t2A(e)&&lp(e);c&&this.injectableDefInScope(c)?a=Md(Nv(e),km):a=null,this.records.set(e,a)}if(a!=null)return this.hydrate(e,a,i)}let s=i&Gi.Self?dp():this.parent;return A=i&Gi.Optional&&A===dI?null:A,s.get(e,A)}catch(s){if(s.name==="NullInjectorError"){if((s[_m]=s[_m]||[]).unshift(ra(e)),o)throw s;return K0A(s,e,"R3InjectorError",this.source)}else throw s}finally{oa(r),n0(o)}}resolveInjectorInitializers(){let e=Ti(null),A=n0(this),i=oa(void 0),n;try{let o=this.get(Fd,Ts,Gi.Self);for(let r of o)r()}finally{n0(A),oa(i),Ti(e)}}toString(){let e=[],A=this.records;for(let i of A.keys())e.push(ra(i));return`R3Injector[${e.join(", ")}]`}processProvider(e){e=ns(e);let A=Nd(e)?e:ns(e&&e.provide),i=$0A(e);if(!Nd(e)&&e.multi===!0){let n=this.records.get(A);n||(n=Md(void 0,km,!0),n.factory=()=>Lv(n.multi),this.records.set(A,n)),A=e,n.multi.push(e)}this.records.set(A,i)}hydrate(e,A,i){let n=Ti(null);try{return A.value===xK?MY(ra(e)):A.value===km&&(A.value=xK,A.value=A.factory(void 0,i)),typeof A.value=="object"&&A.value&&e2A(A.value)&&this._ngOnDestroyHooks.add(A.value),A.value}finally{Ti(n)}}injectableDefInScope(e){if(!e.providedIn)return!1;let A=ns(e.providedIn);return typeof A=="string"?A==="any"||this.scopes.has(A):this.injectorDefTypes.has(A)}removeOnDestroy(e){let A=this._onDestroyHooks.indexOf(e);A!==-1&&this._onDestroyHooks.splice(A,1)}};function Nv(t){let e=lp(t),A=e!==null?e.factory:QI(t);if(A!==null)return A;if(t instanceof dA)throw new Ae(204,!1);if(t instanceof Function)return X0A(t);throw new Ae(204,!1)}function X0A(t){if(t.length>0)throw new Ae(204,!1);let A=v0A(t);return A!==null?()=>A.factory(t):()=>new t}function $0A(t){if(KY(t))return Md(void 0,t.useValue);{let e=YY(t);return Md(e,km)}}function YY(t,e,A){let i;if(Nd(t)){let n=ns(t);return QI(n)||Nv(n)}else if(KY(t))i=()=>ns(t.useValue);else if(Z0A(t))i=()=>t.useFactory(...Lv(t.deps||[]));else if(V0A(t))i=(n,o)=>we(ns(t.useExisting),o!==void 0&&o&Gi.Optional?Gi.Optional:void 0);else{let n=ns(t&&(t.useClass||t.provide));if(A2A(t))i=()=>new n(...Lv(t.deps));else return QI(n)||Nv(n)}return i}function ah(t){if(t.destroyed)throw new Ae(205,!1)}function Md(t,e,A=!1){return{factory:t,value:e,multi:A?[]:void 0}}function A2A(t){return!!t.deps}function e2A(t){return t!==null&&typeof t=="object"&&typeof t.ngOnDestroy=="function"}function t2A(t){return typeof t=="function"||typeof t=="object"&&t instanceof dA}function _v(t,e){for(let A of t)Array.isArray(A)?_v(A,e):A&&bY(A)?_v(A.\u0275providers,e):e(A)}function ga(t,e){let A;t instanceof Ih?(ah(t),A=t):A=new Nm(t);let i,n=n0(A),o=oa(void 0);try{return e()}finally{n0(n),oa(o)}}function H9(){return kY()!==void 0||$Q()!=null}function z9(t){if(!H9())throw new Ae(-203,!1)}function i2A(t){let e=sa.ng;if(e&&e.\u0275compilerFacade)return e.\u0275compilerFacade;throw new Error("JIT compiler unavailable")}function n2A(t){return typeof t=="function"}var ig=0,ki=1,gi=2,ps=3,ol=4,Ia=5,_d=6,Km=7,Fr=8,Gd=9,c0=10,Wo=11,Ch=12,LK=13,Hd=14,Oa=15,hI=16,kd=17,l0=18,Bp=19,JY=20,E2=21,hv=22,uI=23,wc=24,xd=25,Nr=26,O9=1;var fI=7,Ym=8,Ud=9,ms=10;function Q2(t){return Array.isArray(t)&&typeof t[O9]=="object"}function C0(t){return Array.isArray(t)&&t[O9]===!0}function P9(t){return(t.flags&4)!==0}function zd(t){return t.componentOffset>-1}function Ep(t){return(t.flags&1)===1}function rl(t){return!!t.template}function Jm(t){return(t[gi]&512)!==0}function Od(t){return(t[gi]&256)===256}var Gv=class{previousValue;currentValue;firstChange;constructor(e,A,i){this.previousValue=e,this.currentValue=A,this.firstChange=i}isFirstChange(){return this.firstChange}};function TY(t,e,A,i){e!==null?e.applyValueToInputSignal(e,i):t[A]=i}var ti=(()=>{let t=()=>HY;return t.ngInherit=!0,t})();function HY(t){return t.type.prototype.ngOnChanges&&(t.setInput=r2A),o2A}function o2A(){let t=OY(this),e=t?.current;if(e){let A=t.previous;if(A===Xl)t.previous=e;else for(let i in e)A[i]=e[i];t.current=null,this.ngOnChanges(e)}}function r2A(t,e,A,i,n){let o=this.declaredInputs[i],r=OY(t)||s2A(t,{previous:Xl,current:null}),s=r.current||(r.current={}),a=r.previous,c=a[o];s[o]=new Gv(c&&c.currentValue,A,a===Xl),TY(t,e,n,A)}var zY="__ngSimpleChanges__";function OY(t){return t[zY]||null}function s2A(t,e){return t[zY]=e}var FK=null;var Ro=function(t,e=null,A){FK?.(t,e,A)},PY="svg",a2A="math";function $l(t){for(;Array.isArray(t);)t=t[ig];return t}function c2A(t){for(;Array.isArray(t);){if(typeof t[O9]=="object")return t;t=t[ig]}return null}function jY(t,e){return $l(e[t])}function ng(t,e){return $l(e[t.index])}function j9(t,e){return t.data[e]}function q9(t,e){return t[e]}function l2A(t,e,A,i){A>=t.data.length&&(t.data[A]=null,t.blueprint[A]=null),e[A]=i}function Ag(t,e){let A=e[t];return Q2(A)?A:A[ig]}function g2A(t){return(t[gi]&4)===4}function V9(t){return(t[gi]&128)===128}function I2A(t){return C0(t[ps])}function u2(t,e){return e==null?null:t[e]}function qY(t){t[kd]=0}function VY(t){t[gi]&1024||(t[gi]|=1024,V9(t)&&Pd(t))}function C2A(t,e){for(;t>0;)e=e[Hd],t--;return e}function Qp(t){return!!(t[gi]&9216||t[wc]?.dirty)}function Uv(t){t[c0].changeDetectionScheduler?.notify(8),t[gi]&64&&(t[gi]|=1024),Qp(t)&&Pd(t)}function Pd(t){t[c0].changeDetectionScheduler?.notify(0);let e=mI(t);for(;e!==null&&!(e[gi]&8192||(e[gi]|=8192,!V9(e)));)e=mI(e)}function ZY(t,e){if(Od(t))throw new Ae(911,!1);t[E2]===null&&(t[E2]=[]),t[E2].push(e)}function d2A(t,e){if(t[E2]===null)return;let A=t[E2].indexOf(e);A!==-1&&t[E2].splice(A,1)}function mI(t){let e=t[ps];return C0(e)?e[ps]:e}function Z9(t){return t[Km]??=[]}function W9(t){return t.cleanup??=[]}function B2A(t,e,A,i){let n=Z9(e);n.push(A),t.firstCreatePass&&W9(t).push(i,n.length-1)}var xi={lFrame:tJ(null),bindingsEnabled:!0,skipHydrationRootTNode:null};var Kv=!1;function E2A(){return xi.lFrame.elementDepthCount}function Q2A(){xi.lFrame.elementDepthCount++}function h2A(){xi.lFrame.elementDepthCount--}function X9(){return xi.bindingsEnabled}function WY(){return xi.skipHydrationRootTNode!==null}function u2A(t){return xi.skipHydrationRootTNode===t}function f2A(){xi.skipHydrationRootTNode=null}function ei(){return xi.lFrame.lView}function Yo(){return xi.lFrame.tView}function RA(t){return xi.lFrame.contextLView=t,t[Fr]}function xA(t){return xi.lFrame.contextLView=null,t}function os(){let t=XY();for(;t!==null&&t.type===64;)t=t.parent;return t}function XY(){return xi.lFrame.currentTNode}function m2A(){let t=xi.lFrame,e=t.currentTNode;return t.isParent?e:e.parent}function kI(t,e){let A=xi.lFrame;A.currentTNode=t,A.isParent=e}function $9(){return xi.lFrame.isParent}function Ab(){xi.lFrame.isParent=!1}function p2A(){return xi.lFrame.contextLView}function $Y(){return Kv}function Tm(t){let e=Kv;return Kv=t,e}function wh(){let t=xi.lFrame,e=t.bindingRootIndex;return e===-1&&(e=t.bindingRootIndex=t.tView.bindingStartIndex),e}function w2A(){return xi.lFrame.bindingIndex}function D2A(t){return xi.lFrame.bindingIndex=t}function f2(){return xi.lFrame.bindingIndex++}function eb(t){let e=xi.lFrame,A=e.bindingIndex;return e.bindingIndex=e.bindingIndex+t,A}function y2A(){return xi.lFrame.inI18n}function v2A(t,e){let A=xi.lFrame;A.bindingIndex=A.bindingRootIndex=t,Yv(e)}function b2A(){return xi.lFrame.currentDirectiveIndex}function Yv(t){xi.lFrame.currentDirectiveIndex=t}function tb(t){let e=xi.lFrame.currentDirectiveIndex;return e===-1?null:t[e]}function ib(){return xi.lFrame.currentQueryIndex}function hp(t){xi.lFrame.currentQueryIndex=t}function M2A(t){let e=t[ki];return e.type===2?e.declTNode:e.type===1?t[Ia]:null}function AJ(t,e,A){if(A&Gi.SkipSelf){let n=e,o=t;for(;n=n.parent,n===null&&!(A&Gi.Host);)if(n=M2A(o),n===null||(o=o[Hd],n.type&10))break;if(n===null)return!1;e=n,t=o}let i=xi.lFrame=eJ();return i.currentTNode=e,i.lView=t,!0}function nb(t){let e=eJ(),A=t[ki];xi.lFrame=e,e.currentTNode=A.firstChild,e.lView=t,e.tView=A,e.contextLView=t,e.bindingIndex=A.bindingStartIndex,e.inI18n=!1}function eJ(){let t=xi.lFrame,e=t===null?null:t.child;return e===null?tJ(t):e}function tJ(t){let e={currentTNode:null,isParent:!0,lView:null,tView:null,selectedIndex:-1,contextLView:null,elementDepthCount:0,currentNamespace:null,currentDirectiveIndex:-1,bindingRootIndex:-1,bindingIndex:-1,currentQueryIndex:0,parent:t,child:null,inI18n:!1};return t!==null&&(t.child=e),e}function iJ(){let t=xi.lFrame;return xi.lFrame=t.parent,t.currentTNode=null,t.lView=null,t}var nJ=iJ;function ob(){let t=iJ();t.isParent=!0,t.tView=null,t.selectedIndex=-1,t.contextLView=null,t.elementDepthCount=0,t.currentDirectiveIndex=-1,t.currentNamespace=null,t.bindingRootIndex=-1,t.bindingIndex=-1,t.currentQueryIndex=0}function k2A(t){return(xi.lFrame.contextLView=C2A(t,xi.lFrame.contextLView))[Fr]}function d0(){return xi.lFrame.selectedIndex}function pI(t){xi.lFrame.selectedIndex=t}function Dh(){let t=xi.lFrame;return j9(t.tView,t.selectedIndex)}function ar(){xi.lFrame.currentNamespace=PY}function SI(){S2A()}function S2A(){xi.lFrame.currentNamespace=null}function R2A(){return xi.lFrame.currentNamespace}var oJ=!0;function up(){return oJ}function fp(t){oJ=t}function x2A(t,e,A){let{ngOnChanges:i,ngOnInit:n,ngDoCheck:o}=e.type.prototype;if(i){let r=HY(e);(A.preOrderHooks??=[]).push(t,r),(A.preOrderCheckHooks??=[]).push(t,r)}n&&(A.preOrderHooks??=[]).push(0-t,n),o&&((A.preOrderHooks??=[]).push(t,o),(A.preOrderCheckHooks??=[]).push(t,o))}function rb(t,e){for(let A=e.directiveStart,i=e.directiveEnd;A=i)break}else e[a]<0&&(t[kd]+=65536),(s>14>16&&(t[gi]&3)===e&&(t[gi]+=16384,NK(s,o)):NK(s,o)}var Ld=-1,wI=class{factory;injectImpl;resolving=!1;canSeeViewProviders;multi;componentProviders;index;providerFactory;constructor(e,A,i){this.factory=e,this.canSeeViewProviders=A,this.injectImpl=i}};function F2A(t){return(t.flags&8)!==0}function N2A(t){return(t.flags&16)!==0}function _2A(t,e,A){let i=0;for(;ie){r=o-1;break}}}for(;o>16}function zm(t,e){let A=U2A(t),i=e;for(;A>0;)i=i[Hd],A--;return i}var Jv=!0;function Om(t){let e=Jv;return Jv=t,e}var K2A=256,cJ=K2A-1,lJ=5,Y2A=0,Wl={};function J2A(t,e,A){let i;typeof A=="string"?i=A.charCodeAt(0)||0:A.hasOwnProperty(lh)&&(i=A[lh]),i==null&&(i=A[lh]=Y2A++);let n=i&cJ,o=1<>lJ)]|=o}function Pm(t,e){let A=gJ(t,e);if(A!==-1)return A;let i=e[ki];i.firstCreatePass&&(t.injectorIndex=e.length,fv(i.data,t),fv(e,null),fv(i.blueprint,null));let n=sb(t,e),o=t.injectorIndex;if(aJ(n)){let r=Hm(n),s=zm(n,e),a=s[ki].data;for(let c=0;c<8;c++)e[o+c]=s[r+c]|a[r+c]}return e[o+8]=n,o}function fv(t,e){t.push(0,0,0,0,0,0,0,0,e)}function gJ(t,e){return t.injectorIndex===-1||t.parent&&t.parent.injectorIndex===t.injectorIndex||e[t.injectorIndex+8]===null?-1:t.injectorIndex}function sb(t,e){if(t.parent&&t.parent.injectorIndex!==-1)return t.parent.injectorIndex;let A=0,i=null,n=e;for(;n!==null;){if(i=EJ(n),i===null)return Ld;if(A++,n=n[Hd],i.injectorIndex!==-1)return i.injectorIndex|A<<16}return Ld}function Tv(t,e,A){J2A(t,e,A)}function T2A(t,e){if(e==="class")return t.classes;if(e==="style")return t.styles;let A=t.attrs;if(A){let i=A.length,n=0;for(;n>20,I=i?s:s+l,C=n?s+l:c;for(let d=I;d=a&&B.type===A)return d}if(n){let d=r[a];if(d&&rl(d)&&d.type===A)return a}return null}function dh(t,e,A,i,n){let o=t[A],r=e.data;if(o instanceof wI){let s=o;s.resolving&&MY(x0A(r[A]));let a=Om(s.canSeeViewProviders);s.resolving=!0;let c,l=s.injectImpl?oa(s.injectImpl):null,I=AJ(t,i,Gi.Default);try{o=t[A]=s.factory(void 0,n,r,t,i),e.firstCreatePass&&A>=i.directiveStart&&x2A(A,r[A],e)}finally{l!==null&&oa(l),Om(a),s.resolving=!1,nJ()}}return o}function z2A(t){if(typeof t=="string")return t.charCodeAt(0)||0;let e=t.hasOwnProperty(lh)?t[lh]:void 0;return typeof e=="number"?e>=0?e&cJ:O2A:e}function GK(t,e,A){let i=1<>lJ)]&i)}function UK(t,e){return!(t&Gi.Self)&&!(t&Gi.Host&&e)}var BI=class{_tNode;_lView;constructor(e,A){this._tNode=e,this._lView=A}get(e,A,i){return dJ(this._tNode,this._lView,e,gp(i),A)}};function O2A(){return new BI(os(),ei())}function Hi(t){return uh(()=>{let e=t.prototype.constructor,A=e[Fm]||Hv(e),i=Object.prototype,n=Object.getPrototypeOf(t.prototype).constructor;for(;n&&n!==i;){let o=n[Fm]||Hv(n);if(o&&o!==A)return o;n=Object.getPrototypeOf(n)}return o=>new o})}function Hv(t){return wY(t)?()=>{let e=Hv(ns(t));return e&&e()}:QI(t)}function P2A(t,e,A,i,n){let o=t,r=e;for(;o!==null&&r!==null&&r[gi]&2048&&!Jm(r);){let s=BJ(o,r,A,i|Gi.Self,Wl);if(s!==Wl)return s;let a=o.parent;if(!a){let c=r[JY];if(c){let l=c.get(A,Wl,i);if(l!==Wl)return l}a=EJ(r),r=r[Hd]}o=a}return n}function EJ(t){let e=t[ki],A=e.type;return A===2?e.declTNode:A===1?t[Ia]:null}function ab(t){return T2A(os(),t)}function KK(t,e=null,A=null,i){let n=QJ(t,e,A,i);return n.resolveInjectorInitializers(),n}function QJ(t,e=null,A=null,i,n=new Set){let o=[A||Ts,j0A(t)];return i=i||(typeof t=="object"?void 0:ra(t)),new Ih(o,e||dp(),i||null,n)}var Rt=class t{static THROW_IF_NOT_FOUND=dI;static NULL=new Um;static create(e,A){if(Array.isArray(e))return KK({name:""},A,e,"");{let i=e.name??"";return KK({name:i},e.parent,e.providers,i)}}static \u0275prov=NA({token:t,providedIn:"any",factory:()=>we(LY)});static __NG_ELEMENT_ID__=-1};var wr=class{attributeName;constructor(e){this.attributeName=e}__NG_ELEMENT_ID__=()=>ab(this.attributeName);toString(){return`HostAttributeToken ${this.attributeName}`}},j2A=new dA("");j2A.__NG_ELEMENT_ID__=t=>{let e=os();if(e===null)throw new Ae(204,!1);if(e.type&2)return e.value;if(t&Gi.Optional)return null;throw new Ae(204,!1)};var hJ=!1,m2=(()=>{class t{static __NG_ELEMENT_ID__=q2A;static __NG_ENV_ID__=A=>A}return t})(),jm=class extends m2{_lView;constructor(e){super(),this._lView=e}onDestroy(e){let A=this._lView;return Od(A)?(e(),()=>{}):(ZY(A,e),()=>d2A(A,e))}};function q2A(){return new jm(ei())}var DI=class{},cb=new dA("",{providedIn:"root",factory:()=>!1});var uJ=new dA(""),fJ=new dA(""),B0=(()=>{class t{taskId=0;pendingTasks=new Set;get _hasPendingTasks(){return this.hasPendingTasks.value}hasPendingTasks=new Mi(!1);add(){this._hasPendingTasks||this.hasPendingTasks.next(!0);let A=this.taskId++;return this.pendingTasks.add(A),A}has(A){return this.pendingTasks.has(A)}remove(A){this.pendingTasks.delete(A),this.pendingTasks.size===0&&this._hasPendingTasks&&this.hasPendingTasks.next(!1)}ngOnDestroy(){this.pendingTasks.clear(),this._hasPendingTasks&&this.hasPendingTasks.next(!1)}static \u0275prov=NA({token:t,providedIn:"root",factory:()=>new t})}return t})();var zv=class extends OA{__isAsync;destroyRef=void 0;pendingTasks=void 0;constructor(e=!1){super(),this.__isAsync=e,H9()&&(this.destroyRef=f(m2,{optional:!0})??void 0,this.pendingTasks=f(B0,{optional:!0})??void 0)}emit(e){let A=Ti(null);try{super.next(e)}finally{Ti(A)}}subscribe(e,A,i){let n=e,o=A||(()=>null),r=i;if(e&&typeof e=="object"){let a=e;n=a.next?.bind(a),o=a.error?.bind(a),r=a.complete?.bind(a)}this.__isAsync&&(o=this.wrapInTimeout(o),n&&(n=this.wrapInTimeout(n)),r&&(r=this.wrapInTimeout(r)));let s=super.subscribe({next:n,error:o,complete:r});return e instanceof Kt&&e.add(s),s}wrapInTimeout(e){return A=>{let i=this.pendingTasks?.add();setTimeout(()=>{try{e(A)}finally{i!==void 0&&this.pendingTasks?.remove(i)}})}}},WA=zv;function Bh(...t){}function mJ(t){let e,A;function i(){t=Bh;try{A!==void 0&&typeof cancelAnimationFrame=="function"&&cancelAnimationFrame(A),e!==void 0&&clearTimeout(e)}catch{}}return e=setTimeout(()=>{t(),i()}),typeof requestAnimationFrame=="function"&&(A=requestAnimationFrame(()=>{t(),i()})),()=>i()}function YK(t){return queueMicrotask(()=>t()),()=>{t=Bh}}var lb="isAngularZone",qm=lb+"_ID",V2A=0,Qe=class t{hasPendingMacrotasks=!1;hasPendingMicrotasks=!1;isStable=!0;onUnstable=new WA(!1);onMicrotaskEmpty=new WA(!1);onStable=new WA(!1);onError=new WA(!1);constructor(e){let{enableLongStackTrace:A=!1,shouldCoalesceEventChangeDetection:i=!1,shouldCoalesceRunChangeDetection:n=!1,scheduleInRootZone:o=hJ}=e;if(typeof Zone>"u")throw new Ae(908,!1);Zone.assertZonePatched();let r=this;r._nesting=0,r._outer=r._inner=Zone.current,Zone.TaskTrackingZoneSpec&&(r._inner=r._inner.fork(new Zone.TaskTrackingZoneSpec)),A&&Zone.longStackTraceZoneSpec&&(r._inner=r._inner.fork(Zone.longStackTraceZoneSpec)),r.shouldCoalesceEventChangeDetection=!n&&i,r.shouldCoalesceRunChangeDetection=n,r.callbackScheduled=!1,r.scheduleInRootZone=o,X2A(r)}static isInAngularZone(){return typeof Zone<"u"&&Zone.current.get(lb)===!0}static assertInAngularZone(){if(!t.isInAngularZone())throw new Ae(909,!1)}static assertNotInAngularZone(){if(t.isInAngularZone())throw new Ae(909,!1)}run(e,A,i){return this._inner.run(e,A,i)}runTask(e,A,i,n){let o=this._inner,r=o.scheduleEventTask("NgZoneEvent: "+n,e,Z2A,Bh,Bh);try{return o.runTask(r,A,i)}finally{o.cancelTask(r)}}runGuarded(e,A,i){return this._inner.runGuarded(e,A,i)}runOutsideAngular(e){return this._outer.run(e)}},Z2A={};function gb(t){if(t._nesting==0&&!t.hasPendingMicrotasks&&!t.isStable)try{t._nesting++,t.onMicrotaskEmpty.emit(null)}finally{if(t._nesting--,!t.hasPendingMicrotasks)try{t.runOutsideAngular(()=>t.onStable.emit(null))}finally{t.isStable=!0}}}function W2A(t){if(t.isCheckStableRunning||t.callbackScheduled)return;t.callbackScheduled=!0;function e(){mJ(()=>{t.callbackScheduled=!1,Ov(t),t.isCheckStableRunning=!0,gb(t),t.isCheckStableRunning=!1})}t.scheduleInRootZone?Zone.root.run(()=>{e()}):t._outer.run(()=>{e()}),Ov(t)}function X2A(t){let e=()=>{W2A(t)},A=V2A++;t._inner=t._inner.fork({name:"angular",properties:{[lb]:!0,[qm]:A,[qm+A]:!0},onInvokeTask:(i,n,o,r,s,a)=>{if($2A(a))return i.invokeTask(o,r,s,a);try{return JK(t),i.invokeTask(o,r,s,a)}finally{(t.shouldCoalesceEventChangeDetection&&r.type==="eventTask"||t.shouldCoalesceRunChangeDetection)&&e(),TK(t)}},onInvoke:(i,n,o,r,s,a,c)=>{try{return JK(t),i.invoke(o,r,s,a,c)}finally{t.shouldCoalesceRunChangeDetection&&!t.callbackScheduled&&!A1A(a)&&e(),TK(t)}},onHasTask:(i,n,o,r)=>{i.hasTask(o,r),n===o&&(r.change=="microTask"?(t._hasPendingMicrotasks=r.microTask,Ov(t),gb(t)):r.change=="macroTask"&&(t.hasPendingMacrotasks=r.macroTask))},onHandleError:(i,n,o,r)=>(i.handleError(o,r),t.runOutsideAngular(()=>t.onError.emit(r)),!1)})}function Ov(t){t._hasPendingMicrotasks||(t.shouldCoalesceEventChangeDetection||t.shouldCoalesceRunChangeDetection)&&t.callbackScheduled===!0?t.hasPendingMicrotasks=!0:t.hasPendingMicrotasks=!1}function JK(t){t._nesting++,t.isStable&&(t.isStable=!1,t.onUnstable.emit(null))}function TK(t){t._nesting--,gb(t)}var Vm=class{hasPendingMicrotasks=!1;hasPendingMacrotasks=!1;isStable=!0;onUnstable=new WA;onMicrotaskEmpty=new WA;onStable=new WA;onError=new WA;run(e,A,i){return e.apply(A,i)}runGuarded(e,A,i){return e.apply(A,i)}runOutsideAngular(e){return e()}runTask(e,A,i,n){return e.apply(A,i)}};function $2A(t){return pJ(t,"__ignore_ng_zone__")}function A1A(t){return pJ(t,"__scheduler_tick__")}function pJ(t,e){return!Array.isArray(t)||t.length!==1?!1:t[0]?.data?.[e]===!0}function e1A(t="zone.js",e){return t==="noop"?new Vm:t==="zone.js"?new Qe(e):t}var aa=class{_console=console;handleError(e){this._console.error("ERROR",e)}},t1A=new dA("",{providedIn:"root",factory:()=>{let t=f(Qe),e=f(aa);return A=>t.runOutsideAngular(()=>e.handleError(A))}});function HK(t,e){return mY(t,e)}function i1A(t){return mY(fY,t)}var wJ=(HK.required=i1A,HK);function n1A(){return jd(os(),ei())}function jd(t,e){return new ee(ng(t,e))}var ee=(()=>{class t{nativeElement;constructor(A){this.nativeElement=A}static __NG_ELEMENT_ID__=n1A}return t})();function DJ(t){return t instanceof ee?t.nativeElement:t}function p2(t){return typeof t=="function"&&t[ia]!==void 0}function Jo(t,e){let A=X7(t,e?.equal),i=A[ia];return A.set=n=>XQ(i,n),A.update=n=>$7(i,n),A.asReadonly=o1A.bind(A),A}function o1A(){let t=this[ia];if(t.readonlyFn===void 0){let e=()=>this();e[ia]=t,t.readonlyFn=e}return t.readonlyFn}function yJ(t){return p2(t)&&typeof t.set=="function"}function r1A(){return this._results[Symbol.iterator]()}var ca=class{_emitDistinctChangesOnly;dirty=!0;_onDirty=void 0;_results=[];_changesDetected=!1;_changes=void 0;length=0;first=void 0;last=void 0;get changes(){return this._changes??=new OA}constructor(e=!1){this._emitDistinctChangesOnly=e}get(e){return this._results[e]}map(e){return this._results.map(e)}filter(e){return this._results.filter(e)}find(e){return this._results.find(e)}reduce(e,A){return this._results.reduce(e,A)}forEach(e){this._results.forEach(e)}some(e){return this._results.some(e)}toArray(){return this._results.slice()}toString(){return this._results.toString()}reset(e,A){this.dirty=!1;let i=T0A(e);(this._changesDetected=!J0A(this._results,i,A))&&(this._results=i,this.length=i.length,this.last=i[this.length-1],this.first=i[0])}notifyOnChanges(){this._changes!==void 0&&(this._changesDetected||!this._emitDistinctChangesOnly)&&this._changes.next(this)}onDirty(e){this._onDirty=e}setDirty(){this.dirty=!0,this._onDirty?.()}destroy(){this._changes!==void 0&&(this._changes.complete(),this._changes.unsubscribe())}[Symbol.iterator]=r1A};function vJ(t){return(t.flags&128)===128}var bJ=function(t){return t[t.OnPush=0]="OnPush",t[t.Default=1]="Default",t}(bJ||{}),MJ=new Map,s1A=0;function a1A(){return s1A++}function c1A(t){MJ.set(t[Bp],t)}function Pv(t){MJ.delete(t[Bp])}var zK="__ngContext__";function qd(t,e){Q2(e)?(t[zK]=e[Bp],c1A(e)):t[zK]=e}function kJ(t){return RJ(t[Ch])}function SJ(t){return RJ(t[ol])}function RJ(t){for(;t!==null&&!C0(t);)t=t[ol];return t}var jv;function xJ(t){jv=t}function LJ(){if(jv!==void 0)return jv;if(typeof document<"u")return document;throw new Ae(210,!1)}var Vd=new dA("",{providedIn:"root",factory:()=>l1A}),l1A="ng",Ib=new dA(""),og=new dA("",{providedIn:"platform",factory:()=>"unknown"});var Si=new dA(""),yh=new dA("",{providedIn:"root",factory:()=>LJ().body?.querySelector("[ngCspNonce]")?.getAttribute("ngCspNonce")||null});var g1A="h",I1A="b";var FJ=!1,C1A=new dA("",{providedIn:"root",factory:()=>FJ});var Cb=function(t){return t[t.CHANGE_DETECTION=0]="CHANGE_DETECTION",t[t.AFTER_NEXT_RENDER=1]="AFTER_NEXT_RENDER",t}(Cb||{}),Zd=new dA(""),OK=new Set;function E0(t){OK.has(t)||(OK.add(t),performance?.mark?.("mark_feature_usage",{detail:{feature:t}}))}var db=(()=>{class t{view;node;constructor(A,i){this.view=A,this.node=i}static __NG_ELEMENT_ID__=d1A}return t})();function d1A(){return new db(ei(),os())}var Sd=function(t){return t[t.EarlyRead=0]="EarlyRead",t[t.Write=1]="Write",t[t.MixedReadWrite=2]="MixedReadWrite",t[t.Read=3]="Read",t}(Sd||{}),NJ=(()=>{class t{impl=null;execute(){this.impl?.execute()}static \u0275prov=NA({token:t,providedIn:"root",factory:()=>new t})}return t})(),B1A=[Sd.EarlyRead,Sd.Write,Sd.MixedReadWrite,Sd.Read],E1A=(()=>{class t{ngZone=f(Qe);scheduler=f(DI);errorHandler=f(aa,{optional:!0});sequences=new Set;deferredRegistrations=new Set;executing=!1;constructor(){f(Zd,{optional:!0})}execute(){let A=this.sequences.size>0;A&&Ro(16),this.executing=!0;for(let i of B1A)for(let n of this.sequences)if(!(n.erroredOrDestroyed||!n.hooks[i]))try{n.pipelinedValue=this.ngZone.runOutsideAngular(()=>this.maybeTrace(()=>{let o=n.hooks[i];return o(n.pipelinedValue)},n.snapshot))}catch(o){n.erroredOrDestroyed=!0,this.errorHandler?.handleError(o)}this.executing=!1;for(let i of this.sequences)i.afterRun(),i.once&&(this.sequences.delete(i),i.destroy());for(let i of this.deferredRegistrations)this.sequences.add(i);this.deferredRegistrations.size>0&&this.scheduler.notify(7),this.deferredRegistrations.clear(),A&&Ro(17)}register(A){let{view:i}=A;i!==void 0?((i[xd]??=[]).push(A),Pd(i),i[gi]|=8192):this.executing?this.deferredRegistrations.add(A):this.addSequence(A)}addSequence(A){this.sequences.add(A),this.scheduler.notify(7)}unregister(A){this.executing&&this.sequences.has(A)?(A.erroredOrDestroyed=!0,A.pipelinedValue=void 0,A.once=!0):(this.sequences.delete(A),this.deferredRegistrations.delete(A))}maybeTrace(A,i){return i?i.run(Cb.AFTER_NEXT_RENDER,A):A()}static \u0275prov=NA({token:t,providedIn:"root",factory:()=>new t})}return t})(),qv=class{impl;hooks;view;once;snapshot;erroredOrDestroyed=!1;pipelinedValue=void 0;unregisterOnDestroy;constructor(e,A,i,n,o,r=null){this.impl=e,this.hooks=A,this.view=i,this.once=n,this.snapshot=r,this.unregisterOnDestroy=o?.onDestroy(()=>this.destroy())}afterRun(){this.erroredOrDestroyed=!1,this.pipelinedValue=void 0,this.snapshot?.dispose(),this.snapshot=null}destroy(){this.impl.unregister(this),this.unregisterOnDestroy?.();let e=this.view?.[xd];e&&(this.view[xd]=e.filter(A=>A!==this))}};function vh(t,e){!e?.injector&&z9(vh);let A=e?.injector??f(Rt);return E0("NgAfterRender"),_J(t,A,e,!1)}function To(t,e){!e?.injector&&z9(To);let A=e?.injector??f(Rt);return E0("NgAfterNextRender"),_J(t,A,e,!0)}function Q1A(t,e){if(t instanceof Function){let A=[void 0,void 0,void 0,void 0];return A[e]=t,A}else return[t.earlyRead,t.write,t.mixedReadWrite,t.read]}function _J(t,e,A,i){let n=e.get(NJ);n.impl??=e.get(E1A);let o=e.get(Zd,null,{optional:!0}),r=A?.phase??Sd.MixedReadWrite,s=A?.manualCleanup!==!0?e.get(m2):null,a=e.get(db,null,{optional:!0}),c=new qv(n.impl,Q1A(t,r),a?.view,i,s,o?.snapshot(null));return n.impl.register(c),c}var h1A=(t,e,A,i)=>{};function u1A(t,e,A,i){h1A(t,e,A,i)}var f1A=()=>null;function GJ(t,e,A=!1){return f1A(t,e,A)}function UJ(t,e){let A=t.contentQueries;if(A!==null){let i=Ti(null);try{for(let n=0;nt,createScript:t=>t,createScriptURL:t=>t})}catch{}return Dm}function mp(t){return m1A()?.createHTML(t)||t}var ym;function p1A(){if(ym===void 0&&(ym=null,sa.trustedTypes))try{ym=sa.trustedTypes.createPolicy("angular#unsafe-bypass",{createHTML:t=>t,createScript:t=>t,createScriptURL:t=>t})}catch{}return ym}function PK(t){return p1A()?.createHTML(t)||t}var g0=class{changingThisBreaksApplicationSecurity;constructor(e){this.changingThisBreaksApplicationSecurity=e}toString(){return`SafeValue must use [property]=binding: ${this.changingThisBreaksApplicationSecurity} (see ${uY})`}},Zv=class extends g0{getTypeName(){return"HTML"}},Wv=class extends g0{getTypeName(){return"Style"}},Xv=class extends g0{getTypeName(){return"Script"}},$v=class extends g0{getTypeName(){return"URL"}},A9=class extends g0{getTypeName(){return"ResourceURL"}};function sl(t){return t instanceof g0?t.changingThisBreaksApplicationSecurity:t}function w2(t,e){let A=w1A(t);if(A!=null&&A!==e){if(A==="ResourceURL"&&e==="URL")return!0;throw new Error(`Required a safe ${e}, got a ${A} (see ${uY})`)}return A===e}function w1A(t){return t instanceof g0&&t.getTypeName()||null}function KJ(t){return new Zv(t)}function YJ(t){return new Wv(t)}function JJ(t){return new Xv(t)}function TJ(t){return new $v(t)}function HJ(t){return new A9(t)}function D1A(t){let e=new t9(t);return y1A()?new e9(e):e}var e9=class{inertDocumentHelper;constructor(e){this.inertDocumentHelper=e}getInertBodyElement(e){e=""+e;try{let A=new window.DOMParser().parseFromString(mp(e),"text/html").body;return A===null?this.inertDocumentHelper.getInertBodyElement(e):(A.firstChild?.remove(),A)}catch{return null}}},t9=class{defaultDoc;inertDocument;constructor(e){this.defaultDoc=e,this.inertDocument=this.defaultDoc.implementation.createHTMLDocument("sanitization-inert")}getInertBodyElement(e){let A=this.inertDocument.createElement("template");return A.innerHTML=mp(e),A}};function y1A(){try{return!!new window.DOMParser().parseFromString(mp(""),"text/html")}catch{return!1}}var v1A=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:\/?#]*(?:[\/?#]|$))/i;function pp(t){return t=String(t),t.match(v1A)?t:"unsafe:"+t}function Q0(t){let e={};for(let A of t.split(","))e[A]=!0;return e}function bh(...t){let e={};for(let A of t)for(let i in A)A.hasOwnProperty(i)&&(e[i]=!0);return e}var zJ=Q0("area,br,col,hr,img,wbr"),OJ=Q0("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),PJ=Q0("rp,rt"),b1A=bh(PJ,OJ),M1A=bh(OJ,Q0("address,article,aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul")),k1A=bh(PJ,Q0("a,abbr,acronym,audio,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video")),jK=bh(zJ,M1A,k1A,b1A),jJ=Q0("background,cite,href,itemtype,longdesc,poster,src,xlink:href"),S1A=Q0("abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,scope,scrolling,shape,size,sizes,span,srclang,srcset,start,summary,tabindex,target,title,translate,type,usemap,valign,value,vspace,width"),R1A=Q0("aria-activedescendant,aria-atomic,aria-autocomplete,aria-busy,aria-checked,aria-colcount,aria-colindex,aria-colspan,aria-controls,aria-current,aria-describedby,aria-details,aria-disabled,aria-dropeffect,aria-errormessage,aria-expanded,aria-flowto,aria-grabbed,aria-haspopup,aria-hidden,aria-invalid,aria-keyshortcuts,aria-label,aria-labelledby,aria-level,aria-live,aria-modal,aria-multiline,aria-multiselectable,aria-orientation,aria-owns,aria-placeholder,aria-posinset,aria-pressed,aria-readonly,aria-relevant,aria-required,aria-roledescription,aria-rowcount,aria-rowindex,aria-rowspan,aria-selected,aria-setsize,aria-sort,aria-valuemax,aria-valuemin,aria-valuenow,aria-valuetext"),x1A=bh(jJ,S1A,R1A),L1A=Q0("script,style,template"),i9=class{sanitizedSomething=!1;buf=[];sanitizeChildren(e){let A=e.firstChild,i=!0,n=[];for(;A;){if(A.nodeType===Node.ELEMENT_NODE?i=this.startElement(A):A.nodeType===Node.TEXT_NODE?this.chars(A.nodeValue):this.sanitizedSomething=!0,i&&A.firstChild){n.push(A),A=_1A(A);continue}for(;A;){A.nodeType===Node.ELEMENT_NODE&&this.endElement(A);let o=N1A(A);if(o){A=o;break}A=n.pop()}}return this.buf.join("")}startElement(e){let A=qK(e).toLowerCase();if(!jK.hasOwnProperty(A))return this.sanitizedSomething=!0,!L1A.hasOwnProperty(A);this.buf.push("<"),this.buf.push(A);let i=e.attributes;for(let n=0;n"),!0}endElement(e){let A=qK(e).toLowerCase();jK.hasOwnProperty(A)&&!zJ.hasOwnProperty(A)&&(this.buf.push(""))}chars(e){this.buf.push(VK(e))}};function F1A(t,e){return(t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_CONTAINED_BY)!==Node.DOCUMENT_POSITION_CONTAINED_BY}function N1A(t){let e=t.nextSibling;if(e&&t!==e.previousSibling)throw qJ(e);return e}function _1A(t){let e=t.firstChild;if(e&&F1A(t,e))throw qJ(e);return e}function qK(t){let e=t.nodeName;return typeof e=="string"?e:"FORM"}function qJ(t){return new Error(`Failed to sanitize html because the element is clobbered: ${t.outerHTML}`)}var G1A=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,U1A=/([^\#-~ |!])/g;function VK(t){return t.replace(/&/g,"&").replace(G1A,function(e){let A=e.charCodeAt(0),i=e.charCodeAt(1);return"&#"+((A-55296)*1024+(i-56320)+65536)+";"}).replace(U1A,function(e){return"&#"+e.charCodeAt(0)+";"}).replace(//g,">")}var vm;function Eb(t,e){let A=null;try{vm=vm||D1A(t);let i=e?String(e):"";A=vm.getInertBodyElement(i);let n=5,o=i;do{if(n===0)throw new Error("Failed to sanitize html because the input is unstable");n--,i=o,o=A.innerHTML,A=vm.getInertBodyElement(i)}while(i!==o);let s=new i9().sanitizeChildren(ZK(A)||A);return mp(s)}finally{if(A){let i=ZK(A)||A;for(;i.firstChild;)i.firstChild.remove()}}}function ZK(t){return"content"in t&&K1A(t)?t.content:null}function K1A(t){return t.nodeType===Node.ELEMENT_NODE&&t.nodeName==="TEMPLATE"}var jr=function(t){return t[t.NONE=0]="NONE",t[t.HTML=1]="HTML",t[t.STYLE=2]="STYLE",t[t.SCRIPT=3]="SCRIPT",t[t.URL=4]="URL",t[t.RESOURCE_URL=5]="RESOURCE_URL",t}(jr||{});function RI(t){let e=VJ();return e?PK(e.sanitize(jr.HTML,t)||""):w2(t,"HTML")?PK(sl(t)):Eb(LJ(),EI(t))}function ja(t){let e=VJ();return e?e.sanitize(jr.URL,t)||"":w2(t,"URL")?sl(t):pp(EI(t))}function VJ(){let t=ei();return t&&t[c0].sanitizer}var Y1A=/^>|^->||--!>|)/g,T1A="\u200B$1\u200B";function H1A(t){return t.replace(Y1A,e=>e.replace(J1A,T1A))}function wp(t){return t.ownerDocument.defaultView}function Wd(t){return t.ownerDocument}function ZJ(t){return t instanceof Function?t():t}function z1A(t,e,A){let i=t.length;for(;;){let n=t.indexOf(e,A);if(n===-1)return n;if(n===0||t.charCodeAt(n-1)<=32){let o=e.length;if(n+o===i||t.charCodeAt(n+o)<=32)return n}A=n+1}}var WJ="ng-template";function O1A(t,e,A,i){let n=0;if(i){for(;n-1){let o;for(;++no?I="":I=n[l+1].toLowerCase(),i&2&&c!==I){if(il(i))return!1;r=!0}}}}return il(i)||r}function il(t){return(t&1)===0}function q1A(t,e,A,i){if(e===null)return-1;let n=0;if(i||!A){let o=!1;for(;n-1)for(A++;A0?'="'+s+'"':"")+"]"}else i&8?n+="."+r:i&4&&(n+=" "+r);else n!==""&&!il(r)&&(e+=WK(o,n),n=""),i=r,o=o||!il(i);A++}return n!==""&&(e+=WK(o,n)),e}function AIA(t){return t.map($1A).join(",")}function eIA(t){let e=[],A=[],i=1,n=2;for(;iNr&&nT(t,e,Nr,!1),Ro(r?2:0,n),A(i,n)}finally{pI(o),Ro(r?3:1,n)}}function yp(t,e,A){EIA(t,e,A),(A.flags&64)===64&&QIA(t,e,A)}function mb(t,e,A=ng){let i=e.localNames;if(i!==null){let n=e.index+1;for(let o=0;onull;function dIA(t){return t==="class"?"className":t==="for"?"htmlFor":t==="formaction"?"formAction":t==="innerHtml"?"innerHTML":t==="readonly"?"readOnly":t==="tabindex"?"tabIndex":t}function vp(t,e,A,i,n,o,r,s){if(!s&&wb(e,t,A,i,n)){zd(e)&&BIA(A,e.index);return}if(e.type&3){let a=ng(e,A);i=dIA(i),n=r!=null?r(n,e.value||"",i):n,o.setProperty(a,i,n)}else e.type&12}function BIA(t,e){let A=Ag(e,t);A[gi]&16||(A[gi]|=64)}function EIA(t,e,A){let i=A.directiveStart,n=A.directiveEnd;zd(A)&&lIA(e,A,t.data[i+A.componentOffset]),t.firstCreatePass||Pm(A,e);let o=A.initialInputs;for(let r=i;r=0?i[s]():i[-s].unsubscribe(),r+=2}else{let s=i[A[r+1]];A[r].call(s)}i!==null&&(e[Km]=null);let n=e[E2];if(n!==null){e[E2]=null;for(let r=0;r{Pd(t.lView)},consumerOnSignalRead(){this.lView[wc]=this}});function HIA(t){let e=t[wc]??Object.create(zIA);return e.lView=t,e}var zIA=Ye(rA({},Bd),{consumerIsAlwaysLive:!0,kind:"template",consumerMarkedDirty:t=>{let e=mI(t.lView);for(;e&&!dT(e[ki]);)e=mI(e);e&&VY(e)},consumerOnSignalRead(){this.lView[wc]=this}});function dT(t){return t.type!==2}function BT(t){if(t[uI]===null)return;let e=!0;for(;e;){let A=!1;for(let i of t[uI])i.dirty&&(A=!0,i.zone===null||Zone.current===i.zone?i.run():i.zone.run(()=>i.run()));e=A&&!!(t[gi]&8192)}}var OIA=100;function ET(t,e=!0,A=0){let n=t[c0].rendererFactory,o=!1;o||n.begin?.();try{PIA(t,A)}catch(r){throw e&&pIA(t,r),r}finally{o||n.end?.()}}function PIA(t,e){let A=$Y();try{Tm(!0),r9(t,e);let i=0;for(;Qp(t);){if(i===OIA)throw new Ae(103,!1);i++,r9(t,1)}}finally{Tm(A)}}function jIA(t,e,A,i){if(Od(e))return;let n=e[gi],o=!1,r=!1;nb(e);let s=!0,a=null,c=null;o||(dT(t)?(c=KIA(e),a=ZQ(c)):j7()===null?(s=!1,c=HIA(e),a=ZQ(c)):e[wc]&&(WQ(e[wc]),e[wc]=null));try{qY(e),D2A(t.bindingStartIndex),A!==null&&oT(t,e,A,2,i);let l=(n&3)===3;if(!o)if(l){let d=t.preOrderCheckHooks;d!==null&&Sm(e,d,null)}else{let d=t.preOrderHooks;d!==null&&Rm(e,d,0,null),uv(e,0)}if(r||qIA(e),BT(e),QT(e,0),t.contentQueries!==null&&UJ(t,e),!o)if(l){let d=t.contentCheckHooks;d!==null&&Sm(e,d)}else{let d=t.contentHooks;d!==null&&Rm(e,d,1),uv(e,1)}ZIA(t,e);let I=t.components;I!==null&&uT(e,I,0);let C=t.viewQuery;if(C!==null&&Vv(2,C,i),!o)if(l){let d=t.viewCheckHooks;d!==null&&Sm(e,d)}else{let d=t.viewHooks;d!==null&&Rm(e,d,2),uv(e,2)}if(t.firstUpdatePass===!0&&(t.firstUpdatePass=!1),e[hv]){for(let d of e[hv])d();e[hv]=null}o||(IT(e),e[gi]&=-73)}catch(l){throw o||Pd(e),l}finally{c!==null&&(Pf(c,a),s&&JIA(c)),ob()}}function QT(t,e){for(let A=kJ(t);A!==null;A=SJ(A))for(let i=ms;i0&&(t[A-1][ol]=i[ol]);let o=Gm(t,ms+e);bIA(i[ki],i);let r=o[l0];r!==null&&r.detachView(o[ki]),i[ps]=null,i[ol]=null,i[gi]&=-129}return i}function WIA(t,e,A,i){let n=ms+i,o=A.length;i>0&&(A[n-1][ol]=e),i-1&&(Eh(e,i),Gm(A,i))}this._attachedToViewContainer=!1}bp(this._lView[ki],this._lView)}onDestroy(e){ZY(this._lView,e)}markForCheck(){kb(this._cdRefInjectingView||this._lView,4)}detach(){this._lView[gi]&=-129}reattach(){Uv(this._lView),this._lView[gi]|=128}detectChanges(){this._lView[gi]|=1024,ET(this._lView,this.notifyErrorHandler)}checkNoChanges(){}attachToViewContainerRef(){if(this._appRef)throw new Ae(902,!1);this._attachedToViewContainer=!0}detachFromAppRef(){this._appRef=null;let e=Jm(this._lView),A=this._lView[hI];A!==null&&!e&&bb(A,this._lView),sT(this._lView[ki],this._lView)}attachToAppRef(e){if(this._attachedToViewContainer)throw new Ae(902,!1);this._appRef=e;let A=Jm(this._lView),i=this._lView[hI];i!==null&&!A&&wT(i,this._lView),Uv(this._lView)}};var wn=(()=>{class t{static __NG_ELEMENT_ID__=ACA}return t})(),XIA=wn,$IA=class extends XIA{_declarationLView;_declarationTContainer;elementRef;constructor(e,A,i){super(),this._declarationLView=e,this._declarationTContainer=A,this.elementRef=i}get ssrId(){return this._declarationTContainer.tView?.ssrId||null}createEmbeddedView(e,A){return this.createEmbeddedViewImpl(e,A)}createEmbeddedViewImpl(e,A,i){let n=Mh(this._declarationLView,this._declarationTContainer,e,{embeddedViewInjector:A,dehydratedView:i});return new Qh(n)}};function ACA(){return Sp(os(),ei())}function Sp(t,e){return t.type&4?new $IA(e,t,jd(t,e)):null}function Sh(t,e,A,i,n){let o=t.data[e];if(o===null)o=eCA(t,e,A,i,n),y2A()&&(o.flags|=32);else if(o.type&64){o.type=A,o.value=i,o.attrs=n;let r=m2A();o.injectorIndex=r===null?-1:r.injectorIndex}return kI(o,!0),o}function eCA(t,e,A,i,n){let o=XY(),r=$9(),s=r?o:o&&o.parent,a=t.data[e]=iCA(t,s,A,e,i,n);return tCA(t,a,o,r),a}function tCA(t,e,A,i){t.firstChild===null&&(t.firstChild=e),A!==null&&(i?A.child==null&&e.parent!==null&&(A.child=e):A.next===null&&(A.next=e,e.prev=A))}function iCA(t,e,A,i,n,o){let r=e?e.injectorIndex:-1,s=0;return WY()&&(s|=128),{type:A,index:i,insertBeforeIndex:null,injectorIndex:r,directiveStart:-1,directiveEnd:-1,directiveStylingLast:-1,componentOffset:-1,propertyBindings:null,flags:s,providerIndexes:0,value:n,attrs:o,mergedAttrs:null,localNames:null,initialInputs:null,inputs:null,hostDirectiveInputs:null,outputs:null,hostDirectiveOutputs:null,directiveToIndex:null,tView:null,next:null,prev:null,projectionNext:null,child:null,parent:e,projection:null,styles:null,stylesWithoutHost:null,residualStyles:void 0,classes:null,classesWithoutHost:null,residualClasses:void 0,classBindings:0,styleBindings:0}}var qie=new RegExp(`^(\\d+)*(${I1A}|${g1A})*(.*)`);var nCA=()=>null;function Jd(t,e){return nCA(t,e)}var oCA=class{},DT=class{},s9=class{resolveComponentFactory(e){throw Error(`No component factory found for ${ra(e)}.`)}},Rp=class{static NULL=new s9},ws=class{},Wi=(()=>{class t{destroyNode=null;static __NG_ELEMENT_ID__=()=>rCA()}return t})();function rCA(){let t=ei(),e=os(),A=Ag(e.index,t);return(Q2(A)?A:t)[Wo]}var sCA=(()=>{class t{static \u0275prov=NA({token:t,providedIn:"root",factory:()=>null})}return t})();var pv={},a9=class{injector;parentInjector;constructor(e,A){this.injector=e,this.parentInjector=A}get(e,A,i){i=gp(i);let n=this.injector.get(e,pv,i);return n!==pv||A===pv?n:this.parentInjector.get(e,A,i)}};function c9(t,e,A){let i=A?t.styles:null,n=A?t.classes:null,o=0;if(e!==null)for(let r=0;r0&&(A.directiveToIndex=new Map);for(let C=0;C0;){let A=t[--e];if(typeof A=="number"&&A<0)return A}return 0}function QCA(t,e,A){if(A){if(e.exportAs)for(let i=0;i{let[A,i,n]=t[e],o={propName:A,templateName:e,isSignal:(i&Dp.SignalBased)!==0};return n&&(o.transform=n),o})}function fCA(t){return Object.keys(t).map(e=>({propName:t[e],templateName:e}))}function mCA(t,e,A){let i=e instanceof pr?e:e?.injector;return i&&t.getStandaloneInjector!==null&&(i=t.getStandaloneInjector(i)||i),i?new a9(A,i):A}function pCA(t){let e=t.get(ws,null);if(e===null)throw new Ae(407,!1);let A=t.get(sCA,null),i=t.get(DI,null);return{rendererFactory:e,sanitizer:A,changeDetectionScheduler:i}}function wCA(t,e){let A=(t.selectors[0][0]||"div").toLowerCase();return $J(e,A,A==="svg"?PY:A==="math"?a2A:null)}var yI=class extends DT{componentDef;ngModule;selector;componentType;ngContentSelectors;isBoundToModule;cachedInputs=null;cachedOutputs=null;get inputs(){return this.cachedInputs??=uCA(this.componentDef.inputs),this.cachedInputs}get outputs(){return this.cachedOutputs??=fCA(this.componentDef.outputs),this.cachedOutputs}constructor(e,A){super(),this.componentDef=e,this.ngModule=A,this.componentType=e.type,this.selector=AIA(e.selectors),this.ngContentSelectors=e.ngContentSelectors??[],this.isBoundToModule=!!A}create(e,A,i,n){Ro(22);let o=Ti(null);try{let r=this.componentDef,s=i?["ng-version","19.2.14"]:eIA(this.componentDef.selectors[0]),a=hb(0,null,null,1,0,null,null,null,null,[s],null),c=mCA(r,n||this.ngModule,e),l=pCA(c),I=l.rendererFactory.createRenderer(null,r),C=i?gIA(I,i,r.encapsulation,c):wCA(r,I),d=ub(null,a,null,512|tT(r),null,null,l,I,c,null,GJ(C,c,!0));d[Nr]=C,nb(d);let B=null;try{let E=bT(Nr,a,d,"#host",()=>[this.componentDef],!0,0);C&&(eT(I,C,E),qd(C,d)),yp(a,d,E),Bb(a,E,d),MT(a,E),A!==void 0&&DCA(E,this.ngContentSelectors,A),B=Ag(E.index,d),d[Fr]=B[Fr],Db(a,d,null)}catch(E){throw B!==null&&Pv(B),Pv(d),E}finally{Ro(23),ob()}return new l9(this.componentType,d)}finally{Ti(o)}}},l9=class extends oCA{_rootLView;instance;hostView;changeDetectorRef;componentType;location;previousInputValues=null;_tNode;constructor(e,A){super(),this._rootLView=A,this._tNode=j9(A[ki],Nr),this.location=jd(this._tNode,A),this.instance=Ag(this._tNode.index,A)[Fr],this.hostView=this.changeDetectorRef=new Qh(A,void 0,!1),this.componentType=e}setInput(e,A){let i=this._tNode;if(this.previousInputValues??=new Map,this.previousInputValues.has(e)&&Object.is(this.previousInputValues.get(e),A))return;let n=this._rootLView,o=wb(i,n[ki],n,e,A);this.previousInputValues.set(e,A);let r=Ag(i.index,n);kb(r,1)}get injector(){return new BI(this._tNode,this._rootLView)}destroy(){this.hostView.destroy()}onDestroy(e){this.hostView.onDestroy(e)}};function DCA(t,e,A){let i=t.projection=[];for(let n=0;n{class t{static __NG_ELEMENT_ID__=yCA}return t})();function yCA(){let t=os();return ST(t,ei())}var vCA=Nn,kT=class extends vCA{_lContainer;_hostTNode;_hostLView;constructor(e,A,i){super(),this._lContainer=e,this._hostTNode=A,this._hostLView=i}get element(){return jd(this._hostTNode,this._hostLView)}get injector(){return new BI(this._hostTNode,this._hostLView)}get parentInjector(){let e=sb(this._hostTNode,this._hostLView);if(aJ(e)){let A=zm(e,this._hostLView),i=Hm(e),n=A[ki].data[i+8];return new BI(n,A)}else return new BI(null,this._hostLView)}clear(){for(;this.length>0;)this.remove(this.length-1)}get(e){let A=iY(this._lContainer);return A!==null&&A[e]||null}get length(){return this._lContainer.length-ms}createEmbeddedView(e,A,i){let n,o;typeof i=="number"?n=i:i!=null&&(n=i.index,o=i.injector);let r=Jd(this._lContainer,e.ssrId),s=e.createEmbeddedViewImpl(A||{},o,r);return this.insertImpl(s,n,Yd(this._hostTNode,r)),s}createComponent(e,A,i,n,o){let r=e&&!n2A(e),s;if(r)s=A;else{let B=A||{};s=B.index,i=B.injector,n=B.projectableNodes,o=B.environmentInjector||B.ngModuleRef}let a=r?e:new yI(h2(e)),c=i||this.parentInjector;if(!o&&a.ngModule==null){let E=(r?c:this.parentInjector).get(pr,null);E&&(o=E)}let l=h2(a.componentType??{}),I=Jd(this._lContainer,l?.id??null),C=I?.firstChild??null,d=a.create(c,n,C,o);return this.insertImpl(d.hostView,s,Yd(this._hostTNode,I)),d}insert(e,A){return this.insertImpl(e,A,!0)}insertImpl(e,A,i){let n=e._lView;if(I2A(n)){let s=this.indexOf(e);if(s!==-1)this.detach(s);else{let a=n[ps],c=new kT(a,a[Ia],a[ps]);c.detach(c.indexOf(e))}}let o=this._adjustIndex(A),r=this._lContainer;return kh(r,n,o,i),e.attachToViewContainerRef(),xY(wv(r),o,e),e}move(e,A){return this.insert(e,A)}indexOf(e){let A=iY(this._lContainer);return A!==null?A.indexOf(e):-1}remove(e){let A=this._adjustIndex(e,-1),i=Eh(this._lContainer,A);i&&(Gm(wv(this._lContainer),A),bp(i[ki],i))}detach(e){let A=this._adjustIndex(e,-1),i=Eh(this._lContainer,A);return i&&Gm(wv(this._lContainer),A)!=null?new Qh(i):null}_adjustIndex(e,A=0){return e??this.length+A}};function iY(t){return t[Ym]}function wv(t){return t[Ym]||(t[Ym]=[])}function ST(t,e){let A,i=e[t.index];return C0(i)?A=i:(A=fT(i,e,null,t),e[t.index]=A,fb(e,A)),MCA(A,e,t,i),new kT(A,t,e)}function bCA(t,e){let A=t[Wo],i=A.createComment(""),n=ng(e,t),o=A.parentNode(n);return Zm(A,o,i,A.nextSibling(n),!1),i}var MCA=RCA,kCA=()=>!1;function SCA(t,e,A){return kCA(t,e,A)}function RCA(t,e,A,i){if(t[fI])return;let n;A.type&8?n=$l(i):n=bCA(e,A),t[fI]=n}var g9=class t{queryList;matches=null;constructor(e){this.queryList=e}clone(){return new t(this.queryList)}setDirty(){this.queryList.setDirty()}},I9=class t{queries;constructor(e=[]){this.queries=e}createEmbeddedView(e){let A=e.queries;if(A!==null){let i=e.contentQueries!==null?e.contentQueries[0]:A.length,n=[];for(let o=0;o0)i.push(r[s/2]);else{let c=o[s+1],l=e[-a];for(let I=ms;Ie.trim())}function FT(t,e,A){t.queries===null&&(t.queries=new C9),t.queries.track(new d9(e,A))}function UCA(t,e){let A=t.contentQueries||(t.contentQueries=[]),i=A.length?A[A.length-1]:-1;e!==i&&A.push(t.queries.length-1,e)}function xb(t,e){return t.queries.getByIndex(e)}function NT(t,e){let A=t[ki],i=xb(A,e);return i.crossesNgTemplate?B9(A,t,e,[]):RT(A,t,i,e)}function _T(t,e,A){let i,n=Zf(()=>{i._dirtyCounter();let o=TCA(i,t);if(e&&o===void 0)throw new Ae(-951,!1);return o});return i=n[ia],i._dirtyCounter=Jo(0),i._flatValue=void 0,n}function KCA(t){return _T(!0,!1,t)}function YCA(t){return _T(!0,!0,t)}function JCA(t,e){let A=t[ia];A._lView=ei(),A._queryIndex=e,A._queryList=Rb(A._lView,e),A._queryList.onDirty(()=>A._dirtyCounter.update(i=>i+1))}function TCA(t,e){let A=t._lView,i=t._queryIndex;if(A===void 0||i===void 0||A[gi]&4)return e?void 0:Ts;let n=Rb(A,i),o=NT(A,i);return n.reset(o,DJ),e?n.first:n._changesDetected||t._flatValue===void 0?t._flatValue=n.toArray():t._flatValue}function nY(t,e){return KCA(e)}function HCA(t,e){return YCA(e)}var GT=(nY.required=HCA,nY);function zCA(t){let e=[],A=new Map;function i(n){let o=A.get(n);if(!o){let r=t(n);A.set(n,o=r.then(qCA))}return o}return Ap.forEach((n,o)=>{let r=[];n.templateUrl&&r.push(i(n.templateUrl).then(c=>{n.template=c}));let s=typeof n.styles=="string"?[n.styles]:n.styles||[];if(n.styles=s,n.styleUrl&&n.styleUrls?.length)throw new Error("@Component cannot define both `styleUrl` and `styleUrls`. Use `styleUrl` if the component has one stylesheet, or `styleUrls` if it has multiple");if(n.styleUrls?.length){let c=n.styles.length,l=n.styleUrls;n.styleUrls.forEach((I,C)=>{s.push(""),r.push(i(I).then(d=>{s[c+C]=d,l.splice(l.indexOf(I),1),l.length==0&&(n.styleUrls=void 0)}))})}else n.styleUrl&&r.push(i(n.styleUrl).then(c=>{s.push(c),n.styleUrl=void 0}));let a=Promise.all(r).then(()=>VCA(o));e.push(a)}),PCA(),Promise.all(e).then(()=>{})}var Ap=new Map,OCA=new Set;function PCA(){let t=Ap;return Ap=new Map,t}function jCA(){return Ap.size===0}function qCA(t){return typeof t=="string"?t:t.text()}function VCA(t){OCA.delete(t)}var I0=class{},Lb=class{};var ep=class extends I0{ngModuleType;_parent;_bootstrapComponents=[];_r3Injector;instance;destroyCbs=[];componentFactoryResolver=new Xm(this);constructor(e,A,i,n=!0){super(),this.ngModuleType=e,this._parent=A;let o=NY(e);this._bootstrapComponents=ZJ(o.bootstrap),this._r3Injector=QJ(e,A,[{provide:I0,useValue:this},{provide:Rp,useValue:this.componentFactoryResolver},...i],ra(e),new Set(["environment"])),n&&this.resolveInjectorInitializers()}resolveInjectorInitializers(){this._r3Injector.resolveInjectorInitializers(),this.instance=this._r3Injector.get(this.ngModuleType)}get injector(){return this._r3Injector}destroy(){let e=this._r3Injector;!e.destroyed&&e.destroy(),this.destroyCbs.forEach(A=>A()),this.destroyCbs=null}onDestroy(e){this.destroyCbs.push(e)}},tp=class extends Lb{moduleType;constructor(e){super(),this.moduleType=e}create(e){return new ep(this.moduleType,e,[])}};function ZCA(t,e,A){return new ep(t,e,A,!1)}var E9=class extends I0{injector;componentFactoryResolver=new Xm(this);instance=null;constructor(e){super();let A=new Ih([...e.providers,{provide:I0,useValue:this},{provide:Rp,useValue:this.componentFactoryResolver}],e.parent||dp(),e.debugName,new Set(["environment"]));this.injector=A,e.runEnvironmentInitializers&&A.resolveInjectorInitializers()}destroy(){this.injector.destroy()}onDestroy(e){this.injector.onDestroy(e)}};function Rh(t,e,A=null){return new E9({providers:t,parent:e,debugName:A,runEnvironmentInitializers:!0}).injector}var WCA=(()=>{class t{_injector;cachedInjectors=new Map;constructor(A){this._injector=A}getOrCreateStandaloneInjector(A){if(!A.standalone)return null;if(!this.cachedInjectors.has(A)){let i=GY(!1,A.type),n=i.length>0?Rh([i],this._injector,`Standalone[${A.type.name}]`):null;this.cachedInjectors.set(A,n)}return this.cachedInjectors.get(A)}ngOnDestroy(){try{for(let A of this.cachedInjectors.values())A!==null&&A.destroy()}finally{this.cachedInjectors.clear()}}static \u0275prov=NA({token:t,providedIn:"environment",factory:()=>new t(we(pr))})}return t})();function zA(t){return uh(()=>{let e=UT(t),A=Ye(rA({},e),{decls:t.decls,vars:t.vars,template:t.template,consts:t.consts||null,ngContentSelectors:t.ngContentSelectors,onPush:t.changeDetection===bJ.OnPush,directiveDefs:null,pipeDefs:null,dependencies:e.standalone&&t.dependencies||null,getStandaloneInjector:e.standalone?n=>n.get(WCA).getOrCreateStandaloneInjector(A):null,getExternalStyles:null,signals:t.signals??!1,data:t.data||{},encapsulation:t.encapsulation||eg.Emulated,styles:t.styles||Ts,_:null,schemas:t.schemas||null,tView:null,id:""});e.standalone&&E0("NgStandalone"),KT(A);let i=t.dependencies;return A.directiveDefs=oY(i,!1),A.pipeDefs=oY(i,!0),A.id=tdA(A),A})}function XCA(t){return h2(t)||_Y(t)}function $CA(t){return t!==null}function Ce(t){return uh(()=>({type:t.type,bootstrap:t.bootstrap||Ts,declarations:t.declarations||Ts,imports:t.imports||Ts,exports:t.exports||Ts,transitiveCompileScopes:null,schemas:t.schemas||null,id:t.id||null}))}function AdA(t,e){if(t==null)return Xl;let A={};for(let i in t)if(t.hasOwnProperty(i)){let n=t[i],o,r,s,a;Array.isArray(n)?(s=n[0],o=n[1],r=n[2]??o,a=n[3]||null):(o=n,r=n,s=Dp.None,a=null),A[o]=[i,s,a],e[o]=r}return A}function edA(t){if(t==null)return Xl;let e={};for(let A in t)t.hasOwnProperty(A)&&(e[t[A]]=A);return e}function jA(t){return uh(()=>{let e=UT(t);return KT(e),e})}function xp(t){return{type:t.type,name:t.name,factory:null,pure:t.pure!==!1,standalone:t.standalone??!0,onDestroy:t.type.prototype.ngOnDestroy||null}}function UT(t){let e={};return{type:t.type,providersResolver:null,factory:null,hostBindings:t.hostBindings||null,hostVars:t.hostVars||0,hostAttrs:t.hostAttrs||null,contentQueries:t.contentQueries||null,declaredInputs:e,inputConfig:t.inputs||Xl,exportAs:t.exportAs||null,standalone:t.standalone??!0,signals:t.signals===!0,selectors:t.selectors||Ts,viewQuery:t.viewQuery||null,features:t.features||null,setInput:null,findHostDirectiveDefs:null,hostDirectives:null,inputs:AdA(t.inputs,e),outputs:edA(t.outputs),debugInfo:null}}function KT(t){t.features?.forEach(e=>e(t))}function oY(t,e){if(!t)return null;let A=e?P0A:XCA;return()=>(typeof t=="function"?t():t).map(i=>A(i)).filter($CA)}function tdA(t){let e=0,A=typeof t.consts=="function"?"":t.consts,i=[t.selectors,t.ngContentSelectors,t.hostVars,t.hostAttrs,A,t.vars,t.decls,t.encapsulation,t.standalone,t.signals,t.exportAs,JSON.stringify(t.inputs),JSON.stringify(t.outputs),Object.getOwnPropertyNames(t.type.prototype),!!t.contentQueries,!!t.viewQuery];for(let o of i.join("|"))e=Math.imul(31,e)+o.charCodeAt(0)<<0;return e+=2147483648,"c"+e}function idA(t){return Object.getPrototypeOf(t.prototype).constructor}function lt(t){let e=idA(t.type),A=!0,i=[t];for(;e;){let n;if(rl(t))n=e.\u0275cmp||e.\u0275dir;else{if(e.\u0275cmp)throw new Ae(903,!1);n=e.\u0275dir}if(n){if(A){i.push(n);let r=t;r.inputs=Dv(t.inputs),r.declaredInputs=Dv(t.declaredInputs),r.outputs=Dv(t.outputs);let s=n.hostBindings;s&&adA(t,s);let a=n.viewQuery,c=n.contentQueries;if(a&&rdA(t,a),c&&sdA(t,c),ndA(t,n),D0A(t.outputs,n.outputs),rl(n)&&n.data.animation){let l=t.data;l.animation=(l.animation||[]).concat(n.data.animation)}}let o=n.features;if(o)for(let r=0;r=0;i--){let n=t[i];n.hostVars=e+=n.hostVars,n.hostAttrs=Kd(n.hostAttrs,A=Kd(A,n.hostAttrs))}}function Dv(t){return t===Xl?{}:t===Ts?[]:t}function rdA(t,e){let A=t.viewQuery;A?t.viewQuery=(i,n)=>{e(i,n),A(i,n)}:t.viewQuery=e}function sdA(t,e){let A=t.contentQueries;A?t.contentQueries=(i,n,o)=>{e(i,n,o),A(i,n,o)}:t.contentQueries=e}function adA(t,e){let A=t.hostBindings;A?t.hostBindings=(i,n)=>{e(i,n),A(i,n)}:t.hostBindings=e}function YT(t){let e=A=>{let i=Array.isArray(t);A.hostDirectives===null?(A.findHostDirectiveDefs=JT,A.hostDirectives=i?t.map(Q9):[t]):i?A.hostDirectives.unshift(...t.map(Q9)):A.hostDirectives.unshift(t)};return e.ngInherit=!0,e}function JT(t,e,A){if(t.hostDirectives!==null)for(let i of t.hostDirectives)if(typeof i=="function"){let n=i();for(let o of n)rY(Q9(o),e,A)}else rY(i,e,A)}function rY(t,e,A){let i=_Y(t.directive);cdA(i.declaredInputs,t.inputs),JT(i,e,A),A.set(i,t),e.push(i)}function Q9(t){return typeof t=="function"?{directive:ns(t),inputs:Xl,outputs:Xl}:{directive:ns(t.directive),inputs:sY(t.inputs),outputs:sY(t.outputs)}}function sY(t){if(t===void 0||t.length===0)return Xl;let e={};for(let A=0;A{class t{log(A){console.log(A)}warn(A){console.warn(A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"platform"})}return t})();var Gb=new dA(""),xh=new dA(""),Lp=(()=>{class t{_ngZone;registry;_isZoneStable=!0;_callbacks=[];_taskTrackingZone=null;_destroyRef;constructor(A,i,n){this._ngZone=A,this.registry=i,H9()&&(this._destroyRef=f(m2,{optional:!0})??void 0),Ub||(BdA(n),n.addToWindow(i)),this._watchAngularEvents(),A.run(()=>{this._taskTrackingZone=typeof Zone>"u"?null:Zone.current.get("TaskTrackingZone")})}_watchAngularEvents(){let A=this._ngZone.onUnstable.subscribe({next:()=>{this._isZoneStable=!1}}),i=this._ngZone.runOutsideAngular(()=>this._ngZone.onStable.subscribe({next:()=>{Qe.assertNotInAngularZone(),queueMicrotask(()=>{this._isZoneStable=!0,this._runCallbacksIfReady()})}}));this._destroyRef?.onDestroy(()=>{A.unsubscribe(),i.unsubscribe()})}isStable(){return this._isZoneStable&&!this._ngZone.hasPendingMacrotasks}_runCallbacksIfReady(){if(this.isStable())queueMicrotask(()=>{for(;this._callbacks.length!==0;){let A=this._callbacks.pop();clearTimeout(A.timeoutId),A.doneCb()}});else{let A=this.getPendingTasks();this._callbacks=this._callbacks.filter(i=>i.updateCb&&i.updateCb(A)?(clearTimeout(i.timeoutId),!1):!0)}}getPendingTasks(){return this._taskTrackingZone?this._taskTrackingZone.macroTasks.map(A=>({source:A.source,creationLocation:A.creationLocation,data:A.data})):[]}addCallback(A,i,n){let o=-1;i&&i>0&&(o=setTimeout(()=>{this._callbacks=this._callbacks.filter(r=>r.timeoutId!==o),A()},i)),this._callbacks.push({doneCb:A,timeoutId:o,updateCb:n})}whenStable(A,i,n){if(n&&!this._taskTrackingZone)throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is "zone.js/plugins/task-tracking" loaded?');this.addCallback(A,i,n),this._runCallbacksIfReady()}registerApplication(A){this.registry.registerApplication(A,this)}unregisterApplication(A){this.registry.unregisterApplication(A)}findProviders(A,i,n){return[]}static \u0275fac=function(i){return new(i||t)(we(Qe),we(Fp),we(xh))};static \u0275prov=NA({token:t,factory:t.\u0275fac})}return t})(),Fp=(()=>{class t{_applications=new Map;registerApplication(A,i){this._applications.set(A,i)}unregisterApplication(A){this._applications.delete(A)}unregisterAllApplications(){this._applications.clear()}getTestability(A){return this._applications.get(A)||null}getAllTestabilities(){return Array.from(this._applications.values())}getAllRootElements(){return Array.from(this._applications.keys())}findTestabilityInTree(A,i=!0){return Ub?.findTestabilityInTree(this,A,i)??null}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"platform"})}return t})();function BdA(t){Ub=t}var Ub,zT=(()=>{class t{static \u0275prov=NA({token:t,providedIn:"root",factory:()=>new h9})}return t})(),h9=class{queuedEffectCount=0;queues=new Map;schedule(e){this.enqueue(e)}remove(e){let A=e.zone,i=this.queues.get(A);i.has(e)&&(i.delete(e),this.queuedEffectCount--)}enqueue(e){let A=e.zone;this.queues.has(A)||this.queues.set(A,new Set);let i=this.queues.get(A);i.has(e)||(this.queuedEffectCount++,i.add(e))}flush(){for(;this.queuedEffectCount>0;)for(let[e,A]of this.queues)e===null?this.flushQueue(A):e.run(()=>this.flushQueue(A))}flushQueue(e){for(let A of e)e.delete(A),this.queuedEffectCount--,A.run()}};function D2(t){return!!t&&typeof t.then=="function"}function Kb(t){return!!t&&typeof t.subscribe=="function"}var OT=new dA("");function Yb(t){return ph([{provide:OT,multi:!0,useValue:t}])}var PT=(()=>{class t{resolve;reject;initialized=!1;done=!1;donePromise=new Promise((A,i)=>{this.resolve=A,this.reject=i});appInits=f(OT,{optional:!0})??[];injector=f(Rt);constructor(){}runInitializers(){if(this.initialized)return;let A=[];for(let n of this.appInits){let o=ga(this.injector,n);if(D2(o))A.push(o);else if(Kb(o)){let r=new Promise((s,a)=>{o.subscribe({complete:s,error:a})});A.push(r)}}let i=()=>{this.done=!0,this.resolve()};Promise.all(A).then(()=>{i()}).catch(n=>{this.reject(n)}),A.length===0&&i(),this.initialized=!0}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),Jb=new dA("");function EdA(){W7(()=>{throw new Ae(600,!1)})}function QdA(t){return t.isBoundToModule}var hdA=10;function jT(t,e){return Array.isArray(e)?e.reduce(jT,t):rA(rA({},t),e)}var la=(()=>{class t{_runningTick=!1;_destroyed=!1;_destroyListeners=[];_views=[];internalErrorHandler=f(t1A);afterRenderManager=f(NJ);zonelessEnabled=f(cb);rootEffectScheduler=f(zT);dirtyFlags=0;tracingSnapshot=null;externalTestViews=new Set;afterTick=new OA;get allViews(){return[...this.externalTestViews.keys(),...this._views]}get destroyed(){return this._destroyed}componentTypes=[];components=[];isStable=f(B0).hasPendingTasks.pipe(je(A=>!A));constructor(){f(Zd,{optional:!0})}whenStable(){let A;return new Promise(i=>{A=this.isStable.subscribe({next:n=>{n&&i()}})}).finally(()=>{A.unsubscribe()})}_injector=f(pr);_rendererFactory=null;get injector(){return this._injector}bootstrap(A,i){return this.bootstrapImpl(A,i)}bootstrapImpl(A,i,n=Rt.NULL){Ro(10);let o=A instanceof DT;if(!this._injector.get(PT).done){let d="";throw new Ae(405,d)}let s;o?s=A:s=this._injector.get(Rp).resolveComponentFactory(A),this.componentTypes.push(s.componentType);let a=QdA(s)?void 0:this._injector.get(I0),c=i||s.selector,l=s.create(n,[],c,a),I=l.location.nativeElement,C=l.injector.get(Gb,null);return C?.registerApplication(I),l.onDestroy(()=>{this.detachView(l.hostView),Lm(this.components,l),C?.unregisterApplication(I)}),this._loadComponent(l),Ro(11,l),l}tick(){this.zonelessEnabled||(this.dirtyFlags|=1),this._tick()}_tick(){Ro(12),this.tracingSnapshot!==null?this.tracingSnapshot.run(Cb.CHANGE_DETECTION,this.tickImpl):this.tickImpl()}tickImpl=()=>{if(this._runningTick)throw new Ae(101,!1);let A=Ti(null);try{this._runningTick=!0,this.synchronize()}catch(i){this.internalErrorHandler(i)}finally{this._runningTick=!1,this.tracingSnapshot?.dispose(),this.tracingSnapshot=null,Ti(A),this.afterTick.next(),Ro(13)}};synchronize(){this._rendererFactory===null&&!this._injector.destroyed&&(this._rendererFactory=this._injector.get(ws,null,{optional:!0}));let A=0;for(;this.dirtyFlags!==0&&A++Qp(A))){this.dirtyFlags|=2;return}else this.dirtyFlags&=-8}attachView(A){let i=A;this._views.push(i),i.attachToAppRef(this)}detachView(A){let i=A;Lm(this._views,i),i.detachFromAppRef()}_loadComponent(A){this.attachView(A.hostView),this.tick(),this.components.push(A),this._injector.get(Jb,[]).forEach(n=>n(A))}ngOnDestroy(){if(!this._destroyed)try{this._destroyListeners.forEach(A=>A()),this._views.slice().forEach(A=>A.destroy())}finally{this._destroyed=!0,this._views=[],this._destroyListeners=[]}}onDestroy(A){return this._destroyListeners.push(A),()=>Lm(this._destroyListeners,A)}destroy(){if(this._destroyed)throw new Ae(406,!1);let A=this._injector;A.destroy&&!A.destroyed&&A.destroy()}get viewCount(){return this._views.length}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function Lm(t,e){let A=t.indexOf(e);A>-1&&t.splice(A,1)}function udA(t,e,A,i){if(!A&&!Qp(t))return;ET(t,e,A&&!i?0:1)}function Ne(t,e,A,i){let n=ei(),o=f2();if(Pa(n,o,e)){let r=Yo(),s=Dh();uIA(s,n,t,e,A,i)}return Ne}function qT(t,e,A,i){return Pa(t,f2(),A)?e+EI(A)+i:qa}function fdA(t,e,A,i,n,o){let r=w2A(),s=HT(t,r,A,n);return eb(2),s?e+EI(A)+i+EI(n)+o:qa}function bm(t,e){return t<<17|e<<2}function vI(t){return t>>17&32767}function mdA(t){return(t&2)==2}function pdA(t,e){return t&131071|e<<17}function u9(t){return t|2}function Td(t){return(t&131068)>>2}function yv(t,e){return t&-131069|e<<2}function wdA(t){return(t&1)===1}function f9(t){return t|1}function DdA(t,e,A,i,n,o){let r=o?e.classBindings:e.styleBindings,s=vI(r),a=Td(r);t[i]=A;let c=!1,l;if(Array.isArray(A)){let I=A;l=I[1],(l===null||mh(I,l)>0)&&(c=!0)}else l=A;if(n)if(a!==0){let C=vI(t[s+1]);t[i+1]=bm(C,s),C!==0&&(t[C+1]=yv(t[C+1],i)),t[s+1]=pdA(t[s+1],i)}else t[i+1]=bm(s,0),s!==0&&(t[s+1]=yv(t[s+1],i)),s=i;else t[i+1]=bm(a,0),s===0?s=i:t[a+1]=yv(t[a+1],i),a=i;c&&(t[i+1]=u9(t[i+1])),aY(t,l,i,!0),aY(t,l,i,!1),ydA(e,l,t,i,o),r=bm(s,a),o?e.classBindings=r:e.styleBindings=r}function ydA(t,e,A,i,n){let o=n?t.residualClasses:t.residualStyles;o!=null&&typeof e=="string"&&mh(o,e)>=0&&(A[i+1]=f9(A[i+1]))}function aY(t,e,A,i){let n=t[A+1],o=e===null,r=i?vI(n):Td(n),s=!1;for(;r!==0&&(s===!1||o);){let a=t[r],c=t[r+1];vdA(a,e)&&(s=!0,t[r+1]=i?f9(c):u9(c)),r=i?vI(c):Td(c)}s&&(t[A+1]=i?u9(n):f9(n))}function vdA(t,e){return t===null||e==null||(Array.isArray(t)?t[1]:t)===e?!0:Array.isArray(t)&&typeof e=="string"?mh(t,e)>=0:!1}var nl={textEnd:0,key:0,keyEnd:0,value:0,valueEnd:0};function bdA(t){return t.substring(nl.key,nl.keyEnd)}function MdA(t){return kdA(t),VT(t,ZT(t,0,nl.textEnd))}function VT(t,e){let A=nl.textEnd;return A===e?-1:(e=nl.keyEnd=SdA(t,nl.key=e,A),ZT(t,e,A))}function kdA(t){nl.key=0,nl.keyEnd=0,nl.value=0,nl.valueEnd=0,nl.textEnd=t.length}function ZT(t,e,A){for(;e32;)e++;return e}function yA(t,e,A){let i=ei(),n=f2();if(Pa(i,n,e)){let o=Yo(),r=Dh();vp(o,r,i,t,e,i[Wo],A,!1)}return yA}function m9(t,e,A,i,n){wb(e,t,A,n?"class":"style",i)}function uo(t,e,A){return XT(t,e,A,!1),uo}function ue(t,e){return XT(t,e,null,!0),ue}function fo(t){$T(_dA,WT,t,!0)}function WT(t,e){for(let A=MdA(e);A>=0;A=VT(e,A))Ip(t,bdA(e),!0)}function XT(t,e,A,i){let n=ei(),o=Yo(),r=eb(2);if(o.firstUpdatePass&&eH(o,t,r,i),e!==qa&&Pa(n,r,e)){let s=o.data[d0()];tH(o,s,n,n[Wo],t,n[r+1]=UdA(e,A),i,r)}}function $T(t,e,A,i){let n=Yo(),o=eb(2);n.firstUpdatePass&&eH(n,null,o,i);let r=ei();if(A!==qa&&Pa(r,o,A)){let s=n.data[d0()];if(iH(s,i)&&!AH(n,o)){let a=i?s.classesWithoutHost:s.stylesWithoutHost;a!==null&&(A=Sv(a,A||"")),m9(n,s,r,A,i)}else GdA(n,s,r,r[Wo],r[o+1],r[o+1]=NdA(t,e,A),i,o)}}function AH(t,e){return e>=t.expandoStartIndex}function eH(t,e,A,i){let n=t.data;if(n[A+1]===null){let o=n[d0()],r=AH(t,A);iH(o,i)&&e===null&&!r&&(e=!1),e=RdA(n,o,e,i),DdA(n,o,e,A,r,i)}}function RdA(t,e,A,i){let n=tb(t),o=i?e.residualClasses:e.residualStyles;if(n===null)(i?e.classBindings:e.styleBindings)===0&&(A=vv(null,t,e,A,i),A=hh(A,e.attrs,i),o=null);else{let r=e.directiveStylingLast;if(r===-1||t[r]!==n)if(A=vv(n,t,e,A,i),o===null){let a=xdA(t,e,i);a!==void 0&&Array.isArray(a)&&(a=vv(null,t,e,a[1],i),a=hh(a,e.attrs,i),LdA(t,e,i,a))}else o=FdA(t,e,i)}return o!==void 0&&(i?e.residualClasses=o:e.residualStyles=o),A}function xdA(t,e,A){let i=A?e.classBindings:e.styleBindings;if(Td(i)!==0)return t[vI(i)]}function LdA(t,e,A,i){let n=A?e.classBindings:e.styleBindings;t[vI(n)]=i}function FdA(t,e,A){let i,n=e.directiveEnd;for(let o=1+e.directiveStylingLast;o0;){let a=t[n],c=Array.isArray(a),l=c?a[1]:a,I=l===null,C=A[n+1];C===qa&&(C=I?Ts:void 0);let d=I?Ev(C,i):l===i?C:void 0;if(c&&!np(d)&&(d=Ev(a,i)),np(d)&&(s=d,r))return s;let B=t[n+1];n=r?vI(B):Td(B)}if(e!==null){let a=o?e.residualClasses:e.residualStyles;a!=null&&(s=Ev(a,i))}return s}function np(t){return t!==void 0}function UdA(t,e){return t==null||t===""||(typeof e=="string"?t=t+e:typeof t=="object"&&(t=ra(sl(t)))),t}function iH(t,e){return(t.flags&(e?8:16))!==0}function nH(t,e,A){let i=ei(),n=qT(i,t,e,A);$T(Ip,WT,n,!0)}var p9=class{destroy(e){}updateValue(e,A){}swap(e,A){let i=Math.min(e,A),n=Math.max(e,A),o=this.detach(n);if(n-i>1){let r=this.detach(i);this.attach(i,o),this.attach(n,r)}else this.attach(i,o)}move(e,A){this.attach(A,this.detach(e))}};function bv(t,e,A,i,n){return t===A&&Object.is(e,i)?1:Object.is(n(t,e),n(A,i))?-1:0}function KdA(t,e,A){let i,n,o=0,r=t.length-1,s=void 0;if(Array.isArray(e)){let a=e.length-1;for(;o<=r&&o<=a;){let c=t.at(o),l=e[o],I=bv(o,c,o,l,A);if(I!==0){I<0&&t.updateValue(o,l),o++;continue}let C=t.at(r),d=e[a],B=bv(r,C,a,d,A);if(B!==0){B<0&&t.updateValue(r,d),r--,a--;continue}let E=A(o,c),h=A(r,C),u=A(o,l);if(Object.is(u,h)){let D=A(a,d);Object.is(D,E)?(t.swap(o,r),t.updateValue(r,d),a--,r--):t.move(r,o),t.updateValue(o,l),o++;continue}if(i??=new op,n??=gY(t,o,r,A),w9(t,i,o,u))t.updateValue(o,l),o++,r++;else if(n.has(u))i.set(E,t.detach(o)),r--;else{let D=t.create(o,e[o]);t.attach(o,D),o++,r++}}for(;o<=a;)lY(t,i,A,o,e[o]),o++}else if(e!=null){let a=e[Symbol.iterator](),c=a.next();for(;!c.done&&o<=r;){let l=t.at(o),I=c.value,C=bv(o,l,o,I,A);if(C!==0)C<0&&t.updateValue(o,I),o++,c=a.next();else{i??=new op,n??=gY(t,o,r,A);let d=A(o,I);if(w9(t,i,o,d))t.updateValue(o,I),o++,r++,c=a.next();else if(!n.has(d))t.attach(o,t.create(o,I)),o++,r++,c=a.next();else{let B=A(o,l);i.set(B,t.detach(o)),r--}}}for(;!c.done;)lY(t,i,A,t.length,c.value),c=a.next()}for(;o<=r;)t.destroy(t.detach(r--));i?.forEach(a=>{t.destroy(a)})}function w9(t,e,A,i){return e!==void 0&&e.has(i)?(t.attach(A,e.get(i)),e.delete(i),!0):!1}function lY(t,e,A,i,n){if(w9(t,e,i,A(i,n)))t.updateValue(i,n);else{let o=t.create(i,n);t.attach(i,o)}}function gY(t,e,A,i){let n=new Set;for(let o=e;o<=A;o++)n.add(i(o,t.at(o)));return n}var op=class{kvMap=new Map;_vMap=void 0;has(e){return this.kvMap.has(e)}delete(e){if(!this.has(e))return!1;let A=this.kvMap.get(e);return this._vMap!==void 0&&this._vMap.has(A)?(this.kvMap.set(e,this._vMap.get(A)),this._vMap.delete(A)):this.kvMap.delete(e),!0}get(e){return this.kvMap.get(e)}set(e,A){if(this.kvMap.has(e)){let i=this.kvMap.get(e);this._vMap===void 0&&(this._vMap=new Map);let n=this._vMap;for(;n.has(i);)i=n.get(i);n.set(i,A)}else this.kvMap.set(e,A)}forEach(e){for(let[A,i]of this.kvMap)if(e(i,A),this._vMap!==void 0){let n=this._vMap;for(;n.has(i);)i=n.get(i),e(i,A)}}};function GA(t,e){E0("NgControlFlow");let A=ei(),i=f2(),n=A[i]!==qa?A[i]:-1,o=n!==-1?rp(A,Nr+n):void 0,r=0;if(Pa(A,i,t)){let s=Ti(null);try{if(o!==void 0&&pT(o,r),t!==-1){let a=Nr+t,c=rp(A,a),l=b9(A[ki],a),I=Jd(c,l.tView.ssrId),C=Mh(A,l,e,{dehydratedView:I});kh(c,C,r,Yd(l,I))}}finally{Ti(s)}}else if(o!==void 0){let s=mT(o,r);s!==void 0&&(s[Fr]=e)}}var D9=class{lContainer;$implicit;$index;constructor(e,A,i){this.lContainer=e,this.$implicit=A,this.$index=i}get $count(){return this.lContainer.length-ms}};function Xd(t){return t}function to(t,e){return e}var y9=class{hasEmptyBlock;trackByFn;liveCollection;constructor(e,A,i){this.hasEmptyBlock=e,this.trackByFn=A,this.liveCollection=i}};function Dn(t,e,A,i,n,o,r,s,a,c,l,I,C){E0("NgControlFlow");let d=ei(),B=Yo(),E=a!==void 0,h=ei(),u=s?r.bind(h[Oa][Fr]):r,D=new y9(E,u);h[Nr+t]=D,ip(d,B,t+1,e,A,i,n,u2(B.consts,o)),E&&ip(d,B,t+2,a,c,l,I,u2(B.consts,C))}var v9=class extends p9{lContainer;hostLView;templateTNode;operationsCounter=void 0;needsIndexUpdate=!1;constructor(e,A,i){super(),this.lContainer=e,this.hostLView=A,this.templateTNode=i}get length(){return this.lContainer.length-ms}at(e){return this.getLView(e)[Fr].$implicit}attach(e,A){let i=A[_d];this.needsIndexUpdate||=e!==this.length,kh(this.lContainer,A,e,Yd(this.templateTNode,i))}detach(e){return this.needsIndexUpdate||=e!==this.length-1,YdA(this.lContainer,e)}create(e,A){let i=Jd(this.lContainer,this.templateTNode.tView.ssrId),n=Mh(this.hostLView,this.templateTNode,new D9(this.lContainer,A,e),{dehydratedView:i});return this.operationsCounter?.recordCreate(),n}destroy(e){bp(e[ki],e),this.operationsCounter?.recordDestroy()}updateValue(e,A){this.getLView(e)[Fr].$implicit=A}reset(){this.needsIndexUpdate=!1,this.operationsCounter?.reset()}updateIndexes(){if(this.needsIndexUpdate)for(let e=0;e(fp(!0),$J(i,n,R2A()));function HdA(t,e,A,i,n){let o=e.consts,r=u2(o,i),s=Sh(e,t,8,"ng-container",r);r!==null&&c9(s,r,!0);let a=u2(o,n);return X9()&&Sb(e,A,s,a,pb),s.mergedAttrs=Kd(s.mergedAttrs,s.attrs),e.queries!==null&&e.queries.elementStart(e,s),s}function y2(t,e,A){let i=ei(),n=Yo(),o=t+Nr,r=n.firstCreatePass?HdA(o,n,i,e,A):n.data[o];kI(r,!0);let s=zdA(n,i,r,t);return i[o]=s,up()&&Mp(n,i,s,r),qd(s,i),Ep(r)&&(yp(n,i,r),Bb(n,r,i)),A!=null&&mb(i,r),y2}function v2(){let t=os(),e=Yo();return $9()?Ab():(t=t.parent,kI(t,!1)),e.firstCreatePass&&(rb(e,t),P9(t)&&e.queries.elementEnd(t)),v2}function _r(t,e,A){return y2(t,e,A),v2(),_r}var zdA=(t,e,A,i)=>(fp(!0),nIA(e[Wo],""));function be(){return ei()}function Hs(t,e,A){let i=ei(),n=f2();if(Pa(i,n,e)){let o=Yo(),r=Dh();vp(o,r,i,t,e,i[Wo],A,!0)}return Hs}function Tb(t,e,A){let i=ei(),n=f2();if(Pa(i,n,e)){let o=Yo(),r=Dh(),s=tb(o.data),a=rT(s,r,i);vp(o,r,i,t,e,a,A,!0)}return Tb}var sp="en-US";var OdA=sp;function PdA(t){typeof t=="string"&&(OdA=t.toLowerCase().replace(/_/g,"-"))}function IY(t,e,A){return function i(n){if(n===Function)return A;let o=zd(t)?Ag(t.index,e):e;kb(o,5);let r=e[Fr],s=CY(e,r,A,n),a=i.__ngNextListenerFn__;for(;a;)s=CY(e,r,a,n)&&s,a=a.__ngNextListenerFn__;return s}}function CY(t,e,A,i){let n=Ti(null);try{return Ro(6,e,A),A(i)!==!1}catch(o){return jdA(t,o),!1}finally{Ro(7,e,A),Ti(n)}}function jdA(t,e){let A=t[Gd],i=A?A.get(aa,null):null;i&&i.handleError(e)}function dY(t,e,A,i,n,o){let r=e[A],s=e[ki],c=s.data[A].outputs[i],l=r[c],I=s.firstCreatePass?W9(s):null,C=Z9(e),d=l.subscribe(o),B=C.length;C.push(o,d),I&&I.push(n,t.index,B,-(B+1))}function hA(t,e,A,i){let n=ei(),o=Yo(),r=os();return zb(o,n,n[Wo],r,t,e,i),hA}function Hb(t,e){let A=os(),i=ei(),n=Yo(),o=tb(n.data),r=rT(o,A,i);return zb(n,i,r,A,t,e),Hb}function qdA(t,e,A,i){let n=t.cleanup;if(n!=null)for(let o=0;oa?s[a]:null}typeof r=="string"&&(o+=2)}return null}function zb(t,e,A,i,n,o,r){let s=Ep(i),c=t.firstCreatePass?W9(t):null,l=Z9(e),I=!0;if(i.type&3||r){let C=ng(i,e),d=r?r(C):C,B=l.length,E=r?u=>r($l(u[i.index])):i.index,h=null;if(!r&&s&&(h=qdA(t,e,n,i.index)),h!==null){let u=h.__ngLastListenerFn__||h;u.__ngNextListenerFn__=o,h.__ngLastListenerFn__=o,I=!1}else{o=IY(i,e,o),u1A(e,d,n,o);let u=A.listen(d,n,o);l.push(o,u),c&&c.push(n,E,B,B+1)}}else o=IY(i,e,o);if(I){let C=i.outputs?.[n],d=i.hostDirectiveOutputs?.[n];if(d&&d.length)for(let B=0;B(fp(!0),tIA(e[Wo],i));function Gt(t){return Et("",t,""),Gt}function Et(t,e,A){let i=ei(),n=qT(i,t,e,A);return n!==qa&&sH(i,d0(),n),Et}function Ob(t,e,A,i,n){let o=ei(),r=fdA(o,t,e,A,i,n);return r!==qa&&sH(o,d0(),r),Ob}function sH(t,e,A){let i=jY(e,t);iIA(t[Wo],i,A)}function Ca(t,e,A){yJ(e)&&(e=e());let i=ei(),n=f2();if(Pa(i,n,e)){let o=Yo(),r=Dh();vp(o,r,i,t,e,i[Wo],A,!1)}return Ca}function Va(t,e){let A=yJ(t);return A&&t.set(e),A}function da(t,e){let A=ei(),i=Yo(),n=os();return zb(i,A,A[Wo],n,t,e),da}function XdA(t,e,A){let i=Yo();if(i.firstCreatePass){let n=rl(t);M9(A,i.data,i.blueprint,n,!0),M9(e,i.data,i.blueprint,n,!1)}}function M9(t,e,A,i,n){if(t=ns(t),Array.isArray(t))for(let o=0;o>20;if(Nd(t)||!t.multi){let d=new wI(c,n,PA),B=kv(a,e,n?l:l+C,I);B===-1?(Tv(Pm(s,r),o,a),Mv(o,t,e.length),e.push(a),s.directiveStart++,s.directiveEnd++,n&&(s.providerIndexes+=1048576),A.push(d),r.push(d)):(A[B]=d,r[B]=d)}else{let d=kv(a,e,l+C,I),B=kv(a,e,l,l+C),E=d>=0&&A[d],h=B>=0&&A[B];if(n&&!h||!n&&!E){Tv(Pm(s,r),o,a);let u=eBA(n?ABA:$dA,A.length,n,i,c);!n&&h&&(A[B].providerFactory=u),Mv(o,t,e.length,0),e.push(a),s.directiveStart++,s.directiveEnd++,n&&(s.providerIndexes+=1048576),A.push(u),r.push(u)}else{let u=aH(A[n?B:d],c,!n&&i);Mv(o,t,d>-1?d:B,u)}!n&&i&&h&&A[B].componentProviders++}}}function Mv(t,e,A,i){let n=Nd(e),o=W0A(e);if(n||o){let a=(o?ns(e.useClass):e).prototype.ngOnDestroy;if(a){let c=t.destroyHooks||(t.destroyHooks=[]);if(!n&&e.multi){let l=c.indexOf(A);l===-1?c.push(A,[i,a]):c[l+1].push(i,a)}else c.push(A,a)}}}function aH(t,e,A){return A&&t.componentProviders++,t.multi.push(e)-1}function kv(t,e,A,i){for(let n=A;n{A.providersResolver=(i,n)=>XdA(i,n?n(t):t,e)}}function cH(t,e,A){let i=wh()+t,n=ei();return n[i]===qa?Nb(n,i,A?e.call(A):e()):gdA(n,i)}function qr(t,e,A,i){return gH(ei(),wh(),t,e,A,i)}function b2(t,e,A,i,n){return IH(ei(),wh(),t,e,A,i,n)}function lH(t,e){let A=t[e];return A===qa?void 0:A}function gH(t,e,A,i,n,o){let r=e+A;return Pa(t,r,n)?Nb(t,r+1,o?i.call(o,n):i(n)):lH(t,r+1)}function IH(t,e,A,i,n,o,r){let s=e+A;return HT(t,s,n,o)?Nb(t,s+2,r?i.call(r,n,o):i(n,o)):lH(t,s+2)}function Za(t,e){let A=Yo(),i,n=t+Nr;A.firstCreatePass?(i=tBA(e,A.pipeRegistry),A.data[n]=i,i.onDestroy&&(A.destroyHooks??=[]).push(n,i.onDestroy)):i=A.data[n];let o=i.factory||(i.factory=QI(i.type,!0)),r,s=oa(PA);try{let a=Om(!1),c=o();return Om(a),l2A(A,ei(),n,c),c}finally{oa(s)}}function tBA(t,e){if(e)for(let A=e.length-1;A>=0;A--){let i=e[A];if(t===i.name)return i}}function M2(t,e,A){let i=t+Nr,n=ei(),o=q9(n,i);return CH(n,i)?gH(n,wh(),e,o.transform,A,o):o.transform(A)}function Lh(t,e,A,i){let n=t+Nr,o=ei(),r=q9(o,n);return CH(o,n)?IH(o,wh(),e,r.transform,A,i,r):r.transform(A,i)}function CH(t,e){return t[ki].data[e].pure}function Fh(t,e){return Sp(t,e)}var Mm=null;function iBA(t){Mm!==null&&(t.defaultEncapsulation!==Mm.defaultEncapsulation||t.preserveWhitespaces!==Mm.preserveWhitespaces)||(Mm=t)}var bI=class{full;major;minor;patch;constructor(e){this.full=e;let A=e.split(".");this.major=A[0],this.minor=A[1],this.patch=A.slice(2).join(".")}},Pb=new bI("19.2.14"),S9=class{ngModuleFactory;componentFactories;constructor(e,A){this.ngModuleFactory=e,this.componentFactories=A}},dH=(()=>{class t{compileModuleSync(A){return new tp(A)}compileModuleAsync(A){return Promise.resolve(this.compileModuleSync(A))}compileModuleAndAllComponentsSync(A){let i=this.compileModuleSync(A),n=NY(A),o=ZJ(n.declarations).reduce((r,s)=>{let a=h2(s);return a&&r.push(new yI(a)),r},[]);return new S9(i,o)}compileModuleAndAllComponentsAsync(A){return Promise.resolve(this.compileModuleAndAllComponentsSync(A))}clearCache(){}clearCacheFor(A){}getModuleId(A){}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),nBA=new dA("");function oBA(t,e,A){let i=new tp(A);return Promise.resolve(i)}function BY(t){for(let e=t.length-1;e>=0;e--)if(t[e]!==void 0)return t[e]}var rBA=(()=>{class t{zone=f(Qe);changeDetectionScheduler=f(DI);applicationRef=f(la);_onMicrotaskEmptySubscription;initialize(){this._onMicrotaskEmptySubscription||(this._onMicrotaskEmptySubscription=this.zone.onMicrotaskEmpty.subscribe({next:()=>{this.changeDetectionScheduler.runningTick||this.zone.run(()=>{this.applicationRef.tick()})}}))}ngOnDestroy(){this._onMicrotaskEmptySubscription?.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function sBA({ngZoneFactory:t,ignoreChangesOutsideZone:e,scheduleInRootZone:A}){return t??=()=>new Qe(Ye(rA({},BH()),{scheduleInRootZone:A})),[{provide:Qe,useFactory:t},{provide:Fd,multi:!0,useFactory:()=>{let i=f(rBA,{optional:!0});return()=>i.initialize()}},{provide:Fd,multi:!0,useFactory:()=>{let i=f(aBA);return()=>{i.initialize()}}},e===!0?{provide:uJ,useValue:!0}:[],{provide:fJ,useValue:A??hJ}]}function BH(t){return{enableLongStackTrace:!1,shouldCoalesceEventChangeDetection:t?.eventCoalescing??!1,shouldCoalesceRunChangeDetection:t?.runCoalescing??!1}}var aBA=(()=>{class t{subscription=new Kt;initialized=!1;zone=f(Qe);pendingTasks=f(B0);initialize(){if(this.initialized)return;this.initialized=!0;let A=null;!this.zone.isStable&&!this.zone.hasPendingMacrotasks&&!this.zone.hasPendingMicrotasks&&(A=this.pendingTasks.add()),this.zone.runOutsideAngular(()=>{this.subscription.add(this.zone.onStable.subscribe(()=>{Qe.assertNotInAngularZone(),queueMicrotask(()=>{A!==null&&!this.zone.hasPendingMacrotasks&&!this.zone.hasPendingMicrotasks&&(this.pendingTasks.remove(A),A=null)})}))}),this.subscription.add(this.zone.onUnstable.subscribe(()=>{Qe.assertInAngularZone(),A??=this.pendingTasks.add()}))}ngOnDestroy(){this.subscription.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var cBA=(()=>{class t{appRef=f(la);taskService=f(B0);ngZone=f(Qe);zonelessEnabled=f(cb);tracing=f(Zd,{optional:!0});disableScheduling=f(uJ,{optional:!0})??!1;zoneIsDefined=typeof Zone<"u"&&!!Zone.root.run;schedulerTickApplyArgs=[{data:{__scheduler_tick__:!0}}];subscriptions=new Kt;angularZoneId=this.zoneIsDefined?this.ngZone._inner?.get(qm):null;scheduleInRootZone=!this.zonelessEnabled&&this.zoneIsDefined&&(f(fJ,{optional:!0})??!1);cancelScheduledCallback=null;useMicrotaskScheduler=!1;runningTick=!1;pendingRenderTaskId=null;constructor(){this.subscriptions.add(this.appRef.afterTick.subscribe(()=>{this.runningTick||this.cleanup()})),this.subscriptions.add(this.ngZone.onUnstable.subscribe(()=>{this.runningTick||this.cleanup()})),this.disableScheduling||=!this.zonelessEnabled&&(this.ngZone instanceof Vm||!this.zoneIsDefined)}notify(A){if(!this.zonelessEnabled&&A===5)return;let i=!1;switch(A){case 0:{this.appRef.dirtyFlags|=2;break}case 3:case 2:case 4:case 5:case 1:{this.appRef.dirtyFlags|=4;break}case 6:{this.appRef.dirtyFlags|=2,i=!0;break}case 12:{this.appRef.dirtyFlags|=16,i=!0;break}case 13:{this.appRef.dirtyFlags|=2,i=!0;break}case 11:{i=!0;break}case 9:case 8:case 7:case 10:default:this.appRef.dirtyFlags|=8}if(this.appRef.tracingSnapshot=this.tracing?.snapshot(this.appRef.tracingSnapshot)??null,!this.shouldScheduleTick(i))return;let n=this.useMicrotaskScheduler?YK:mJ;this.pendingRenderTaskId=this.taskService.add(),this.scheduleInRootZone?this.cancelScheduledCallback=Zone.root.run(()=>n(()=>this.tick())):this.cancelScheduledCallback=this.ngZone.runOutsideAngular(()=>n(()=>this.tick()))}shouldScheduleTick(A){return!(this.disableScheduling&&!A||this.appRef.destroyed||this.pendingRenderTaskId!==null||this.runningTick||this.appRef._runningTick||!this.zonelessEnabled&&this.zoneIsDefined&&Zone.current.get(qm+this.angularZoneId))}tick(){if(this.runningTick||this.appRef.destroyed)return;if(this.appRef.dirtyFlags===0){this.cleanup();return}!this.zonelessEnabled&&this.appRef.dirtyFlags&7&&(this.appRef.dirtyFlags|=1);let A=this.taskService.add();try{this.ngZone.run(()=>{this.runningTick=!0,this.appRef._tick()},void 0,this.schedulerTickApplyArgs)}catch(i){throw this.taskService.remove(A),i}finally{this.cleanup()}this.useMicrotaskScheduler=!0,YK(()=>{this.useMicrotaskScheduler=!1,this.taskService.remove(A)})}ngOnDestroy(){this.subscriptions.unsubscribe(),this.cleanup()}cleanup(){if(this.runningTick=!1,this.cancelScheduledCallback?.(),this.cancelScheduledCallback=null,this.pendingRenderTaskId!==null){let A=this.pendingRenderTaskId;this.pendingRenderTaskId=null,this.taskService.remove(A)}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function lBA(){return typeof $localize<"u"&&$localize.locale||sp}var Np=new dA("",{providedIn:"root",factory:()=>f(Np,Gi.Optional|Gi.SkipSelf)||lBA()});var ap=new dA(""),gBA=new dA("");function sh(t){return!t.moduleRef}function IBA(t){let e=sh(t)?t.r3Injector:t.moduleRef.injector,A=e.get(Qe);return A.run(()=>{sh(t)?t.r3Injector.resolveInjectorInitializers():t.moduleRef.resolveInjectorInitializers();let i=e.get(aa,null),n;if(A.runOutsideAngular(()=>{n=A.onError.subscribe({next:o=>{i.handleError(o)}})}),sh(t)){let o=()=>e.destroy(),r=t.platformInjector.get(ap);r.add(o),e.onDestroy(()=>{n.unsubscribe(),r.delete(o)})}else{let o=()=>t.moduleRef.destroy(),r=t.platformInjector.get(ap);r.add(o),t.moduleRef.onDestroy(()=>{Lm(t.allPlatformModules,t.moduleRef),n.unsubscribe(),r.delete(o)})}return dBA(i,A,()=>{let o=e.get(PT);return o.runInitializers(),o.donePromise.then(()=>{let r=e.get(Np,sp);if(PdA(r||sp),!e.get(gBA,!0))return sh(t)?e.get(la):(t.allPlatformModules.push(t.moduleRef),t.moduleRef);if(sh(t)){let a=e.get(la);return t.rootComponent!==void 0&&a.bootstrap(t.rootComponent),a}else return CBA(t.moduleRef,t.allPlatformModules),t.moduleRef})})})}function CBA(t,e){let A=t.injector.get(la);if(t._bootstrapComponents.length>0)t._bootstrapComponents.forEach(i=>A.bootstrap(i));else if(t.instance.ngDoBootstrap)t.instance.ngDoBootstrap(A);else throw new Ae(-403,!1);e.push(t)}function dBA(t,e,A){try{let i=A();return D2(i)?i.catch(n=>{throw e.runOutsideAngular(()=>t.handleError(n)),n}):i}catch(i){throw e.runOutsideAngular(()=>t.handleError(i)),i}}var EH=(()=>{class t{_injector;_modules=[];_destroyListeners=[];_destroyed=!1;constructor(A){this._injector=A}bootstrapModuleFactory(A,i){let n=i?.scheduleInRootZone,o=()=>e1A(i?.ngZone,Ye(rA({},BH({eventCoalescing:i?.ngZoneEventCoalescing,runCoalescing:i?.ngZoneRunCoalescing})),{scheduleInRootZone:n})),r=i?.ignoreChangesOutsideZone,s=[sBA({ngZoneFactory:o,ignoreChangesOutsideZone:r}),{provide:DI,useExisting:cBA}],a=ZCA(A.moduleType,this.injector,s);return IBA({moduleRef:a,allPlatformModules:this._modules,platformInjector:this.injector})}bootstrapModule(A,i=[]){let n=jT({},i);return oBA(this.injector,n,A).then(o=>this.bootstrapModuleFactory(o,n))}onDestroy(A){this._destroyListeners.push(A)}get injector(){return this._injector}destroy(){if(this._destroyed)throw new Ae(404,!1);this._modules.slice().forEach(i=>i.destroy()),this._destroyListeners.forEach(i=>i());let A=this._injector.get(ap,null);A&&(A.forEach(i=>i()),A.clear()),this._destroyed=!0}get destroyed(){return this._destroyed}static \u0275fac=function(i){return new(i||t)(we(Rt))};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"platform"})}return t})(),gh=null,QH=new dA("");function BBA(t){if(gh&&!gh.get(QH,!1))throw new Ae(400,!1);EdA(),gh=t;let e=t.get(EH);return hBA(t),e}function jb(t,e,A=[]){let i=`Platform: ${e}`,n=new dA(i);return(o=[])=>{let r=hH();if(!r||r.injector.get(QH,!1)){let s=[...A,...o,{provide:n,useValue:!0}];t?t(s):BBA(EBA(s,i))}return QBA(n)}}function EBA(t=[],e){return Rt.create({name:e,providers:[{provide:Cp,useValue:"platform"},{provide:ap,useValue:new Set([()=>gh=null])},...t]})}function QBA(t){let e=hH();if(!e)throw new Ae(401,!1);return e}function hH(){return gh?.get(EH)??null}function hBA(t){let e=t.get(Ib,null);ga(t,()=>{e?.forEach(A=>A())})}var It=(()=>{class t{static __NG_ELEMENT_ID__=uBA}return t})();function uBA(t){return fBA(os(),ei(),(t&16)===16)}function fBA(t,e,A){if(zd(t)&&!A){let i=Ag(t.index,e);return new Qh(i,i)}else if(t.type&175){let i=e[Oa];return new Qh(i,e)}return null}var R9=class{constructor(){}supports(e){return TT(e)}create(e){return new x9(e)}},mBA=(t,e)=>e,x9=class{length=0;collection;_linkedRecords=null;_unlinkedRecords=null;_previousItHead=null;_itHead=null;_itTail=null;_additionsHead=null;_additionsTail=null;_movesHead=null;_movesTail=null;_removalsHead=null;_removalsTail=null;_identityChangesHead=null;_identityChangesTail=null;_trackByFn;constructor(e){this._trackByFn=e||mBA}forEachItem(e){let A;for(A=this._itHead;A!==null;A=A._next)e(A)}forEachOperation(e){let A=this._itHead,i=this._removalsHead,n=0,o=null;for(;A||i;){let r=!i||A&&A.currentIndex{r=this._trackByFn(n,s),A===null||!Object.is(A.trackById,r)?(A=this._mismatch(A,s,r,n),i=!0):(i&&(A=this._verifyReinsertion(A,s,r,n)),Object.is(A.item,s)||this._addIdentityChange(A,s)),A=A._next,n++}),this.length=n;return this._truncate(A),this.collection=e,this.isDirty}get isDirty(){return this._additionsHead!==null||this._movesHead!==null||this._removalsHead!==null||this._identityChangesHead!==null}_reset(){if(this.isDirty){let e;for(e=this._previousItHead=this._itHead;e!==null;e=e._next)e._nextPrevious=e._next;for(e=this._additionsHead;e!==null;e=e._nextAdded)e.previousIndex=e.currentIndex;for(this._additionsHead=this._additionsTail=null,e=this._movesHead;e!==null;e=e._nextMoved)e.previousIndex=e.currentIndex;this._movesHead=this._movesTail=null,this._removalsHead=this._removalsTail=null,this._identityChangesHead=this._identityChangesTail=null}}_mismatch(e,A,i,n){let o;return e===null?o=this._itTail:(o=e._prev,this._remove(e)),e=this._unlinkedRecords===null?null:this._unlinkedRecords.get(i,null),e!==null?(Object.is(e.item,A)||this._addIdentityChange(e,A),this._reinsertAfter(e,o,n)):(e=this._linkedRecords===null?null:this._linkedRecords.get(i,n),e!==null?(Object.is(e.item,A)||this._addIdentityChange(e,A),this._moveAfter(e,o,n)):e=this._addAfter(new L9(A,i),o,n)),e}_verifyReinsertion(e,A,i,n){let o=this._unlinkedRecords===null?null:this._unlinkedRecords.get(i,null);return o!==null?e=this._reinsertAfter(o,e._prev,n):e.currentIndex!=n&&(e.currentIndex=n,this._addToMoves(e,n)),e}_truncate(e){for(;e!==null;){let A=e._next;this._addToRemovals(this._unlink(e)),e=A}this._unlinkedRecords!==null&&this._unlinkedRecords.clear(),this._additionsTail!==null&&(this._additionsTail._nextAdded=null),this._movesTail!==null&&(this._movesTail._nextMoved=null),this._itTail!==null&&(this._itTail._next=null),this._removalsTail!==null&&(this._removalsTail._nextRemoved=null),this._identityChangesTail!==null&&(this._identityChangesTail._nextIdentityChange=null)}_reinsertAfter(e,A,i){this._unlinkedRecords!==null&&this._unlinkedRecords.remove(e);let n=e._prevRemoved,o=e._nextRemoved;return n===null?this._removalsHead=o:n._nextRemoved=o,o===null?this._removalsTail=n:o._prevRemoved=n,this._insertAfter(e,A,i),this._addToMoves(e,i),e}_moveAfter(e,A,i){return this._unlink(e),this._insertAfter(e,A,i),this._addToMoves(e,i),e}_addAfter(e,A,i){return this._insertAfter(e,A,i),this._additionsTail===null?this._additionsTail=this._additionsHead=e:this._additionsTail=this._additionsTail._nextAdded=e,e}_insertAfter(e,A,i){let n=A===null?this._itHead:A._next;return e._next=n,e._prev=A,n===null?this._itTail=e:n._prev=e,A===null?this._itHead=e:A._next=e,this._linkedRecords===null&&(this._linkedRecords=new cp),this._linkedRecords.put(e),e.currentIndex=i,e}_remove(e){return this._addToRemovals(this._unlink(e))}_unlink(e){this._linkedRecords!==null&&this._linkedRecords.remove(e);let A=e._prev,i=e._next;return A===null?this._itHead=i:A._next=i,i===null?this._itTail=A:i._prev=A,e}_addToMoves(e,A){return e.previousIndex===A||(this._movesTail===null?this._movesTail=this._movesHead=e:this._movesTail=this._movesTail._nextMoved=e),e}_addToRemovals(e){return this._unlinkedRecords===null&&(this._unlinkedRecords=new cp),this._unlinkedRecords.put(e),e.currentIndex=null,e._nextRemoved=null,this._removalsTail===null?(this._removalsTail=this._removalsHead=e,e._prevRemoved=null):(e._prevRemoved=this._removalsTail,this._removalsTail=this._removalsTail._nextRemoved=e),e}_addIdentityChange(e,A){return e.item=A,this._identityChangesTail===null?this._identityChangesTail=this._identityChangesHead=e:this._identityChangesTail=this._identityChangesTail._nextIdentityChange=e,e}},L9=class{item;trackById;currentIndex=null;previousIndex=null;_nextPrevious=null;_prev=null;_next=null;_prevDup=null;_nextDup=null;_prevRemoved=null;_nextRemoved=null;_nextAdded=null;_nextMoved=null;_nextIdentityChange=null;constructor(e,A){this.item=e,this.trackById=A}},F9=class{_head=null;_tail=null;add(e){this._head===null?(this._head=this._tail=e,e._nextDup=null,e._prevDup=null):(this._tail._nextDup=e,e._prevDup=this._tail,e._nextDup=null,this._tail=e)}get(e,A){let i;for(i=this._head;i!==null;i=i._nextDup)if((A===null||A<=i.currentIndex)&&Object.is(i.trackById,e))return i;return null}remove(e){let A=e._prevDup,i=e._nextDup;return A===null?this._head=i:A._nextDup=i,i===null?this._tail=A:i._prevDup=A,this._head===null}},cp=class{map=new Map;put(e){let A=e.trackById,i=this.map.get(A);i||(i=new F9,this.map.set(A,i)),i.add(e)}get(e,A){let i=e,n=this.map.get(i);return n?n.get(e,A):null}remove(e){let A=e.trackById;return this.map.get(A).remove(e)&&this.map.delete(A),e}get isEmpty(){return this.map.size===0}clear(){this.map.clear()}};function EY(t,e,A){let i=t.previousIndex;if(i===null)return i;let n=0;return A&&i{if(A&&A.key===n)this._maybeAddToChanges(A,i),this._appendAfter=A,A=A._next;else{let o=this._getOrCreateRecordForKey(n,i);A=this._insertBeforeOrAppend(A,o)}}),A){A._prev&&(A._prev._next=null),this._removalsHead=A;for(let i=A;i!==null;i=i._nextRemoved)i===this._mapHead&&(this._mapHead=null),this._records.delete(i.key),i._nextRemoved=i._next,i.previousValue=i.currentValue,i.currentValue=null,i._prev=null,i._next=null}return this._changesTail&&(this._changesTail._nextChanged=null),this._additionsTail&&(this._additionsTail._nextAdded=null),this.isDirty}_insertBeforeOrAppend(e,A){if(e){let i=e._prev;return A._next=e,A._prev=i,e._prev=A,i&&(i._next=A),e===this._mapHead&&(this._mapHead=A),this._appendAfter=e,e}return this._appendAfter?(this._appendAfter._next=A,A._prev=this._appendAfter):this._mapHead=A,this._appendAfter=A,null}_getOrCreateRecordForKey(e,A){if(this._records.has(e)){let n=this._records.get(e);this._maybeAddToChanges(n,A);let o=n._prev,r=n._next;return o&&(o._next=r),r&&(r._prev=o),n._next=null,n._prev=null,n}let i=new G9(e);return this._records.set(e,i),i.currentValue=A,this._addToAdditions(i),i}_reset(){if(this.isDirty){let e;for(this._previousMapHead=this._mapHead,e=this._previousMapHead;e!==null;e=e._next)e._nextPrevious=e._next;for(e=this._changesHead;e!==null;e=e._nextChanged)e.previousValue=e.currentValue;for(e=this._additionsHead;e!=null;e=e._nextAdded)e.previousValue=e.currentValue;this._changesHead=this._changesTail=null,this._additionsHead=this._additionsTail=null,this._removalsHead=null}}_maybeAddToChanges(e,A){Object.is(A,e.currentValue)||(e.previousValue=e.currentValue,e.currentValue=A,this._addToChanges(e))}_addToAdditions(e){this._additionsHead===null?this._additionsHead=this._additionsTail=e:(this._additionsTail._nextAdded=e,this._additionsTail=e)}_addToChanges(e){this._changesHead===null?this._changesHead=this._changesTail=e:(this._changesTail._nextChanged=e,this._changesTail=e)}_forEach(e,A){e instanceof Map?e.forEach(A):Object.keys(e).forEach(i=>A(e[i],i))}},G9=class{key;previousValue=null;currentValue=null;_nextPrevious=null;_next=null;_prev=null;_nextAdded=null;_nextRemoved=null;_nextChanged=null;constructor(e){this.key=e}};function QY(){return new rg([new R9])}var rg=(()=>{class t{factories;static \u0275prov=NA({token:t,providedIn:"root",factory:QY});constructor(A){this.factories=A}static create(A,i){if(i!=null){let n=i.factories.slice();A=A.concat(n)}return new t(A)}static extend(A){return{provide:t,useFactory:i=>t.create(A,i||QY()),deps:[[t,new fh,new MI]]}}find(A){let i=this.factories.find(n=>n.supports(A));if(i!=null)return i;throw new Ae(901,!1)}}return t})();function hY(){return new _p([new N9])}var _p=(()=>{class t{static \u0275prov=NA({token:t,providedIn:"root",factory:hY});factories;constructor(A){this.factories=A}static create(A,i){if(i){let n=i.factories.slice();A=A.concat(n)}return new t(A)}static extend(A){return{provide:t,useFactory:i=>t.create(A,i||hY()),deps:[[t,new fh,new MI]]}}find(A){let i=this.factories.find(n=>n.supports(A));if(i)return i;throw new Ae(901,!1)}}return t})();var uH=jb(null,"core",[]),fH=(()=>{class t{constructor(A){}static \u0275fac=function(i){return new(i||t)(we(la))};static \u0275mod=Ce({type:t});static \u0275inj=Ie({})}return t})();function ie(t){return typeof t=="boolean"?t:t!=null&&t!=="false"}function zi(t,e=NaN){return!isNaN(parseFloat(t))&&!isNaN(Number(t))?Number(t):e}function Ba(t){return Av(t)}function h0(t,e){return Zf(t,e?.equal)}var U9=class{[ia];constructor(e){this[ia]=e}destroy(){this[ia].destroy()}};function Nh(t,e){!e?.injector&&z9(Nh);let A=e?.injector??f(Rt),i=e?.manualCleanup!==!0?A.get(m2):null,n,o=A.get(db,null,{optional:!0}),r=A.get(DI);return o!==null&&!e?.forceRoot?(n=DBA(o.view,r,t),i instanceof jm&&i._lView===o.view&&(i=null)):n=yBA(t,A.get(zT),r),n.injector=A,i!==null&&(n.onDestroyFn=i.onDestroy(()=>n.destroy())),new U9(n)}var mH=Ye(rA({},Bd),{consumerIsAlwaysLive:!0,consumerAllowSignalWrites:!0,dirty:!0,hasRun:!1,cleanupFns:void 0,zone:null,kind:"effect",onDestroyFn:Bh,run(){if(this.dirty=!1,this.hasRun&&!jf(this))return;this.hasRun=!0;let t=i=>(this.cleanupFns??=[]).push(i),e=ZQ(this),A=Tm(!1);try{this.maybeCleanup(),this.fn(t)}finally{Tm(A),Pf(this,e)}},maybeCleanup(){if(this.cleanupFns?.length)try{for(;this.cleanupFns.length;)this.cleanupFns.pop()()}finally{this.cleanupFns=[]}}}),pBA=Ye(rA({},mH),{consumerMarkedDirty(){this.scheduler.schedule(this),this.notifier.notify(12)},destroy(){WQ(this),this.onDestroyFn(),this.maybeCleanup(),this.scheduler.remove(this)}}),wBA=Ye(rA({},mH),{consumerMarkedDirty(){this.view[gi]|=8192,Pd(this.view),this.notifier.notify(13)},destroy(){WQ(this),this.onDestroyFn(),this.maybeCleanup(),this.view[uI]?.delete(this)}});function DBA(t,e,A){let i=Object.create(wBA);return i.view=t,i.zone=typeof Zone<"u"?Zone.current:null,i.notifier=e,i.fn=A,t[uI]??=new Set,t[uI].add(i),i.consumerMarkedDirty(i),i}function yBA(t,e,A){let i=Object.create(pBA);return i.fn=t,i.scheduler=e,i.notifier=A,i.zone=typeof Zone<"u"?Zone.current:null,i.scheduler.schedule(i),i.notifier.notify(12),i}function Gp(t,e){let A=h2(t),i=e.elementInjector||dp();return new yI(A).create(i,e.projectableNodes,e.hostElement,e.environmentInjector)}function pH(t){let e=h2(t);if(!e)return null;let A=new yI(e);return{get selector(){return A.selector},get type(){return A.componentType},get inputs(){return A.inputs},get outputs(){return A.outputs},get ngContentSelectors(){return A.ngContentSelectors},get isStandalone(){return e.standalone},get isSignal(){return e.signals}}}var at=new dA("");var yH=null;function Wa(){return yH}function qb(t){yH??=t}var _h=class{},Gh=(()=>{class t{historyGo(A){throw new Error("")}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:()=>f(vH),providedIn:"platform"})}return t})(),Vb=new dA(""),vH=(()=>{class t extends Gh{_location;_history;_doc=f(at);constructor(){super(),this._location=window.location,this._history=window.history}getBaseHrefFromDOM(){return Wa().getBaseHref(this._doc)}onPopState(A){let i=Wa().getGlobalEventTarget(this._doc,"window");return i.addEventListener("popstate",A,!1),()=>i.removeEventListener("popstate",A)}onHashChange(A){let i=Wa().getGlobalEventTarget(this._doc,"window");return i.addEventListener("hashchange",A,!1),()=>i.removeEventListener("hashchange",A)}get href(){return this._location.href}get protocol(){return this._location.protocol}get hostname(){return this._location.hostname}get port(){return this._location.port}get pathname(){return this._location.pathname}get search(){return this._location.search}get hash(){return this._location.hash}set pathname(A){this._location.pathname=A}pushState(A,i,n){this._history.pushState(A,i,n)}replaceState(A,i,n){this._history.replaceState(A,i,n)}forward(){this._history.forward()}back(){this._history.back()}historyGo(A=0){this._history.go(A)}getState(){return this._history.state}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:()=>new t,providedIn:"platform"})}return t})();function Up(t,e){return t?e?t.endsWith("/")?e.startsWith("/")?t+e.slice(1):t+e:e.startsWith("/")?t+e:`${t}/${e}`:t:e}function wH(t){let e=t.search(/#|\?|$/);return t[e-1]==="/"?t.slice(0,e-1)+t.slice(e):t}function al(t){return t&&t[0]!=="?"?`?${t}`:t}var u0=(()=>{class t{historyGo(A){throw new Error("")}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:()=>f(Yp),providedIn:"root"})}return t})(),Kp=new dA(""),Yp=(()=>{class t extends u0{_platformLocation;_baseHref;_removeListenerFns=[];constructor(A,i){super(),this._platformLocation=A,this._baseHref=i??this._platformLocation.getBaseHrefFromDOM()??f(at).location?.origin??""}ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}onPopState(A){this._removeListenerFns.push(this._platformLocation.onPopState(A),this._platformLocation.onHashChange(A))}getBaseHref(){return this._baseHref}prepareExternalUrl(A){return Up(this._baseHref,A)}path(A=!1){let i=this._platformLocation.pathname+al(this._platformLocation.search),n=this._platformLocation.hash;return n&&A?`${i}${n}`:i}pushState(A,i,n,o){let r=this.prepareExternalUrl(n+al(o));this._platformLocation.pushState(A,i,r)}replaceState(A,i,n,o){let r=this.prepareExternalUrl(n+al(o));this._platformLocation.replaceState(A,i,r)}forward(){this._platformLocation.forward()}back(){this._platformLocation.back()}getState(){return this._platformLocation.getState()}historyGo(A=0){this._platformLocation.historyGo?.(A)}static \u0275fac=function(i){return new(i||t)(we(Gh),we(Kp,8))};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),Dc=(()=>{class t{_subject=new OA;_basePath;_locationStrategy;_urlChangeListeners=[];_urlChangeSubscription=null;constructor(A){this._locationStrategy=A;let i=this._locationStrategy.getBaseHref();this._basePath=MBA(wH(DH(i))),this._locationStrategy.onPopState(n=>{this._subject.next({url:this.path(!0),pop:!0,state:n.state,type:n.type})})}ngOnDestroy(){this._urlChangeSubscription?.unsubscribe(),this._urlChangeListeners=[]}path(A=!1){return this.normalize(this._locationStrategy.path(A))}getState(){return this._locationStrategy.getState()}isCurrentPathEqualTo(A,i=""){return this.path()==this.normalize(A+al(i))}normalize(A){return t.stripTrailingSlash(bBA(this._basePath,DH(A)))}prepareExternalUrl(A){return A&&A[0]!=="/"&&(A="/"+A),this._locationStrategy.prepareExternalUrl(A)}go(A,i="",n=null){this._locationStrategy.pushState(n,"",A,i),this._notifyUrlChangeListeners(this.prepareExternalUrl(A+al(i)),n)}replaceState(A,i="",n=null){this._locationStrategy.replaceState(n,"",A,i),this._notifyUrlChangeListeners(this.prepareExternalUrl(A+al(i)),n)}forward(){this._locationStrategy.forward()}back(){this._locationStrategy.back()}historyGo(A=0){this._locationStrategy.historyGo?.(A)}onUrlChange(A){return this._urlChangeListeners.push(A),this._urlChangeSubscription??=this.subscribe(i=>{this._notifyUrlChangeListeners(i.url,i.state)}),()=>{let i=this._urlChangeListeners.indexOf(A);this._urlChangeListeners.splice(i,1),this._urlChangeListeners.length===0&&(this._urlChangeSubscription?.unsubscribe(),this._urlChangeSubscription=null)}}_notifyUrlChangeListeners(A="",i){this._urlChangeListeners.forEach(n=>n(A,i))}subscribe(A,i,n){return this._subject.subscribe({next:A,error:i??void 0,complete:n??void 0})}static normalizeQueryParams=al;static joinWithSlash=Up;static stripTrailingSlash=wH;static \u0275fac=function(i){return new(i||t)(we(u0))};static \u0275prov=NA({token:t,factory:()=>vBA(),providedIn:"root"})}return t})();function vBA(){return new Dc(we(u0))}function bBA(t,e){if(!t||!e.startsWith(t))return e;let A=e.substring(t.length);return A===""||["/",";","?","#"].includes(A[0])?A:e}function DH(t){return t.replace(/\/index.html$/,"")}function MBA(t){if(new RegExp("^(https?:)?//").test(t)){let[,A]=t.split(/\/\/[^\/]+/);return A}return t}var $b=(()=>{class t extends u0{_platformLocation;_baseHref="";_removeListenerFns=[];constructor(A,i){super(),this._platformLocation=A,i!=null&&(this._baseHref=i)}ngOnDestroy(){for(;this._removeListenerFns.length;)this._removeListenerFns.pop()()}onPopState(A){this._removeListenerFns.push(this._platformLocation.onPopState(A),this._platformLocation.onHashChange(A))}getBaseHref(){return this._baseHref}path(A=!1){let i=this._platformLocation.hash??"#";return i.length>0?i.substring(1):i}prepareExternalUrl(A){let i=Up(this._baseHref,A);return i.length>0?"#"+i:i}pushState(A,i,n,o){let r=this.prepareExternalUrl(n+al(o))||this._platformLocation.pathname;this._platformLocation.pushState(A,i,r)}replaceState(A,i,n,o){let r=this.prepareExternalUrl(n+al(o))||this._platformLocation.pathname;this._platformLocation.replaceState(A,i,r)}forward(){this._platformLocation.forward()}back(){this._platformLocation.back()}getState(){return this._platformLocation.getState()}historyGo(A=0){this._platformLocation.historyGo?.(A)}static \u0275fac=function(i){return new(i||t)(we(Gh),we(Kp,8))};static \u0275prov=NA({token:t,factory:t.\u0275fac})}return t})();var Zb=/\s+/,bH=[],Xa=(()=>{class t{_ngEl;_renderer;initialClasses=bH;rawClass;stateMap=new Map;constructor(A,i){this._ngEl=A,this._renderer=i}set klass(A){this.initialClasses=A!=null?A.trim().split(Zb):bH}set ngClass(A){this.rawClass=typeof A=="string"?A.trim().split(Zb):A}ngDoCheck(){for(let i of this.initialClasses)this._updateState(i,!0);let A=this.rawClass;if(Array.isArray(A)||A instanceof Set)for(let i of A)this._updateState(i,!0);else if(A!=null)for(let i of Object.keys(A))this._updateState(i,!!A[i]);this._applyStateDiff()}_updateState(A,i){let n=this.stateMap.get(A);n!==void 0?(n.enabled!==i&&(n.changed=!0,n.enabled=i),n.touched=!0):this.stateMap.set(A,{enabled:i,changed:!0,touched:!0})}_applyStateDiff(){for(let A of this.stateMap){let i=A[0],n=A[1];n.changed?(this._toggleClass(i,n.enabled),n.changed=!1):n.touched||(n.enabled&&this._toggleClass(i,!1),this.stateMap.delete(i)),n.touched=!1}}_toggleClass(A,i){A=A.trim(),A.length>0&&A.split(Zb).forEach(n=>{i?this._renderer.addClass(this._ngEl.nativeElement,n):this._renderer.removeClass(this._ngEl.nativeElement,n)})}static \u0275fac=function(i){return new(i||t)(PA(ee),PA(Wi))};static \u0275dir=jA({type:t,selectors:[["","ngClass",""]],inputs:{klass:[0,"class","klass"],ngClass:"ngClass"}})}return t})();var Jp=class{$implicit;ngForOf;index;count;constructor(e,A,i,n){this.$implicit=e,this.ngForOf=A,this.index=i,this.count=n}get first(){return this.index===0}get last(){return this.index===this.count-1}get even(){return this.index%2===0}get odd(){return!this.even}},Hp=(()=>{class t{_viewContainer;_template;_differs;set ngForOf(A){this._ngForOf=A,this._ngForOfDirty=!0}set ngForTrackBy(A){this._trackByFn=A}get ngForTrackBy(){return this._trackByFn}_ngForOf=null;_ngForOfDirty=!0;_differ=null;_trackByFn;constructor(A,i,n){this._viewContainer=A,this._template=i,this._differs=n}set ngForTemplate(A){A&&(this._template=A)}ngDoCheck(){if(this._ngForOfDirty){this._ngForOfDirty=!1;let A=this._ngForOf;!this._differ&&A&&(this._differ=this._differs.find(A).create(this.ngForTrackBy))}if(this._differ){let A=this._differ.diff(this._ngForOf);A&&this._applyChanges(A)}}_applyChanges(A){let i=this._viewContainer;A.forEachOperation((n,o,r)=>{if(n.previousIndex==null)i.createEmbeddedView(this._template,new Jp(n.item,this._ngForOf,-1,-1),r===null?void 0:r);else if(r==null)i.remove(o===null?void 0:o);else if(o!==null){let s=i.get(o);i.move(s,r),MH(s,n)}});for(let n=0,o=i.length;n{let o=i.get(n.currentIndex);MH(o,n)})}static ngTemplateContextGuard(A,i){return!0}static \u0275fac=function(i){return new(i||t)(PA(Nn),PA(wn),PA(rg))};static \u0275dir=jA({type:t,selectors:[["","ngFor","","ngForOf",""]],inputs:{ngForOf:"ngForOf",ngForTrackBy:"ngForTrackBy",ngForTemplate:"ngForTemplate"}})}return t})();function MH(t,e){t.context.$implicit=e.item}var Uh=(()=>{class t{_viewContainer;_context=new Tp;_thenTemplateRef=null;_elseTemplateRef=null;_thenViewRef=null;_elseViewRef=null;constructor(A,i){this._viewContainer=A,this._thenTemplateRef=i}set ngIf(A){this._context.$implicit=this._context.ngIf=A,this._updateView()}set ngIfThen(A){kH(A,!1),this._thenTemplateRef=A,this._thenViewRef=null,this._updateView()}set ngIfElse(A){kH(A,!1),this._elseTemplateRef=A,this._elseViewRef=null,this._updateView()}_updateView(){this._context.$implicit?this._thenViewRef||(this._viewContainer.clear(),this._elseViewRef=null,this._thenTemplateRef&&(this._thenViewRef=this._viewContainer.createEmbeddedView(this._thenTemplateRef,this._context))):this._elseViewRef||(this._viewContainer.clear(),this._thenViewRef=null,this._elseTemplateRef&&(this._elseViewRef=this._viewContainer.createEmbeddedView(this._elseTemplateRef,this._context)))}static ngIfUseIfTypeGuard;static ngTemplateGuard_ngIf;static ngTemplateContextGuard(A,i){return!0}static \u0275fac=function(i){return new(i||t)(PA(Nn),PA(wn))};static \u0275dir=jA({type:t,selectors:[["","ngIf",""]],inputs:{ngIf:"ngIf",ngIfThen:"ngIfThen",ngIfElse:"ngIfElse"}})}return t})(),Tp=class{$implicit=null;ngIf=null};function kH(t,e){if(t&&!t.createEmbeddedView)throw new Ae(2020,!1)}var Kh=(()=>{class t{_ngEl;_differs;_renderer;_ngStyle=null;_differ=null;constructor(A,i,n){this._ngEl=A,this._differs=i,this._renderer=n}set ngStyle(A){this._ngStyle=A,!this._differ&&A&&(this._differ=this._differs.find(A).create())}ngDoCheck(){if(this._differ){let A=this._differ.diff(this._ngStyle);A&&this._applyChanges(A)}}_setStyle(A,i){let[n,o]=A.split("."),r=n.indexOf("-")===-1?void 0:tg.DashCase;i!=null?this._renderer.setStyle(this._ngEl.nativeElement,n,o?`${i}${o}`:i,r):this._renderer.removeStyle(this._ngEl.nativeElement,n,r)}_applyChanges(A){A.forEachRemovedItem(i=>this._setStyle(i.key,null)),A.forEachAddedItem(i=>this._setStyle(i.key,i.currentValue)),A.forEachChangedItem(i=>this._setStyle(i.key,i.currentValue))}static \u0275fac=function(i){return new(i||t)(PA(ee),PA(_p),PA(Wi))};static \u0275dir=jA({type:t,selectors:[["","ngStyle",""]],inputs:{ngStyle:"ngStyle"}})}return t})(),Yh=(()=>{class t{_viewContainerRef;_viewRef=null;ngTemplateOutletContext=null;ngTemplateOutlet=null;ngTemplateOutletInjector=null;constructor(A){this._viewContainerRef=A}ngOnChanges(A){if(this._shouldRecreateView(A)){let i=this._viewContainerRef;if(this._viewRef&&i.remove(i.indexOf(this._viewRef)),!this.ngTemplateOutlet){this._viewRef=null;return}let n=this._createContextForwardProxy();this._viewRef=i.createEmbeddedView(this.ngTemplateOutlet,n,{injector:this.ngTemplateOutletInjector??void 0})}}_shouldRecreateView(A){return!!A.ngTemplateOutlet||!!A.ngTemplateOutletInjector}_createContextForwardProxy(){return new Proxy({},{set:(A,i,n)=>this.ngTemplateOutletContext?Reflect.set(this.ngTemplateOutletContext,i,n):!1,get:(A,i,n)=>{if(this.ngTemplateOutletContext)return Reflect.get(this.ngTemplateOutletContext,i,n)}})}static \u0275fac=function(i){return new(i||t)(PA(Nn))};static \u0275dir=jA({type:t,selectors:[["","ngTemplateOutlet",""]],inputs:{ngTemplateOutletContext:"ngTemplateOutletContext",ngTemplateOutlet:"ngTemplateOutlet",ngTemplateOutletInjector:"ngTemplateOutletInjector"},features:[ti]})}return t})();function kBA(t,e){return new Ae(2100,!1)}var Wb=class{createSubscription(e,A){return Ba(()=>e.subscribe({next:A,error:i=>{throw i}}))}dispose(e){Ba(()=>e.unsubscribe())}},Xb=class{createSubscription(e,A){return e.then(i=>A?.(i),i=>{throw i}),{unsubscribe:()=>{A=null}}}dispose(e){e.unsubscribe()}},SBA=new Xb,RBA=new Wb,Jh=(()=>{class t{_ref;_latestValue=null;markForCheckOnValueUpdate=!0;_subscription=null;_obj=null;_strategy=null;constructor(A){this._ref=A}ngOnDestroy(){this._subscription&&this._dispose(),this._ref=null}transform(A){if(!this._obj){if(A)try{this.markForCheckOnValueUpdate=!1,this._subscribe(A)}finally{this.markForCheckOnValueUpdate=!0}return this._latestValue}return A!==this._obj?(this._dispose(),this.transform(A)):this._latestValue}_subscribe(A){this._obj=A,this._strategy=this._selectStrategy(A),this._subscription=this._strategy.createSubscription(A,i=>this._updateLatestValue(A,i))}_selectStrategy(A){if(D2(A))return SBA;if(Kb(A))return RBA;throw kBA(t,A)}_dispose(){this._strategy.dispose(this._subscription),this._latestValue=null,this._subscription=null,this._obj=null}_updateLatestValue(A,i){A===this._obj&&(this._latestValue=i,this.markForCheckOnValueUpdate&&this._ref?.markForCheck())}static \u0275fac=function(i){return new(i||t)(PA(It,16))};static \u0275pipe=xp({name:"async",type:t,pure:!1})}return t})();function xBA(t,e){return{key:t,value:e}}var Th=(()=>{class t{differs;constructor(A){this.differs=A}differ;keyValues=[];compareFn=SH;transform(A,i=SH){if(!A||!(A instanceof Map)&&typeof A!="object")return null;this.differ??=this.differs.find(A).create();let n=this.differ.diff(A),o=i!==this.compareFn;return n&&(this.keyValues=[],n.forEachItem(r=>{this.keyValues.push(xBA(r.key,r.currentValue))})),(n||o)&&(i&&this.keyValues.sort(i),this.compareFn=i),this.keyValues}static \u0275fac=function(i){return new(i||t)(PA(_p,16))};static \u0275pipe=xp({name:"keyvalue",type:t,pure:!1})}return t})();function SH(t,e){let A=t.key,i=e.key;if(A===i)return 0;if(A==null)return 1;if(i==null)return-1;if(typeof A=="string"&&typeof i=="string")return A{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({})}return t})();function Hh(t,e){e=encodeURIComponent(e);for(let A of t.split(";")){let i=A.indexOf("="),[n,o]=i==-1?[A,""]:[A.slice(0,i),A.slice(i+1)];if(n.trim()===e)return decodeURIComponent(o)}return null}var zp="browser",RH="server";function sg(t){return t===zp}function Op(t){return t===RH}var xI=class{};var xH=(()=>{class t{static \u0275prov=NA({token:t,providedIn:"root",factory:()=>new AM(f(at),window)})}return t})(),AM=class{document;window;offset=()=>[0,0];constructor(e,A){this.document=e,this.window=A}setOffset(e){Array.isArray(e)?this.offset=()=>e:this.offset=e}getScrollPosition(){return[this.window.scrollX,this.window.scrollY]}scrollToPosition(e){this.window.scrollTo(e[0],e[1])}scrollToAnchor(e){let A=LBA(this.document,e);A&&(this.scrollToElement(A),A.focus())}setHistoryScrollRestoration(e){this.window.history.scrollRestoration=e}scrollToElement(e){let A=e.getBoundingClientRect(),i=A.left+this.window.pageXOffset,n=A.top+this.window.pageYOffset,o=this.offset();this.window.scrollTo(i-o[0],n-o[1])}};function LBA(t,e){let A=t.getElementById(e)||t.getElementsByName(e)[0];if(A)return A;if(typeof t.createTreeWalker=="function"&&t.body&&typeof t.body.attachShadow=="function"){let i=t.createTreeWalker(t.body,NodeFilter.SHOW_ELEMENT),n=i.currentNode;for(;n;){let o=n.shadowRoot;if(o){let r=o.getElementById(e)||o.querySelector(`[name="${e}"]`);if(r)return r}n=i.nextNode()}}return null}var qp=new dA(""),nM=(()=>{class t{_zone;_plugins;_eventNameToPlugin=new Map;constructor(A,i){this._zone=i,A.forEach(n=>{n.manager=this}),this._plugins=A.slice().reverse()}addEventListener(A,i,n,o){return this._findPluginFor(i).addEventListener(A,i,n,o)}getZone(){return this._zone}_findPluginFor(A){let i=this._eventNameToPlugin.get(A);if(i)return i;if(i=this._plugins.find(o=>o.supports(A)),!i)throw new Ae(5101,!1);return this._eventNameToPlugin.set(A,i),i}static \u0275fac=function(i){return new(i||t)(we(qp),we(Qe))};static \u0275prov=NA({token:t,factory:t.\u0275fac})}return t})(),zh=class{_doc;constructor(e){this._doc=e}manager},Pp="ng-app-id";function LH(t){for(let e of t)e.remove()}function FH(t,e){let A=e.createElement("style");return A.textContent=t,A}function FBA(t,e,A,i){let n=t.head?.querySelectorAll(`style[${Pp}="${e}"],link[${Pp}="${e}"]`);if(n)for(let o of n)o.removeAttribute(Pp),o instanceof HTMLLinkElement?i.set(o.href.slice(o.href.lastIndexOf("/")+1),{usage:0,elements:[o]}):o.textContent&&A.set(o.textContent,{usage:0,elements:[o]})}function tM(t,e){let A=e.createElement("link");return A.setAttribute("rel","stylesheet"),A.setAttribute("href",t),A}var oM=(()=>{class t{doc;appId;nonce;inline=new Map;external=new Map;hosts=new Set;isServer;constructor(A,i,n,o={}){this.doc=A,this.appId=i,this.nonce=n,this.isServer=Op(o),FBA(A,i,this.inline,this.external),this.hosts.add(A.head)}addStyles(A,i){for(let n of A)this.addUsage(n,this.inline,FH);i?.forEach(n=>this.addUsage(n,this.external,tM))}removeStyles(A,i){for(let n of A)this.removeUsage(n,this.inline);i?.forEach(n=>this.removeUsage(n,this.external))}addUsage(A,i,n){let o=i.get(A);o?o.usage++:i.set(A,{usage:1,elements:[...this.hosts].map(r=>this.addElement(r,n(A,this.doc)))})}removeUsage(A,i){let n=i.get(A);n&&(n.usage--,n.usage<=0&&(LH(n.elements),i.delete(A)))}ngOnDestroy(){for(let[,{elements:A}]of[...this.inline,...this.external])LH(A);this.hosts.clear()}addHost(A){this.hosts.add(A);for(let[i,{elements:n}]of this.inline)n.push(this.addElement(A,FH(i,this.doc)));for(let[i,{elements:n}]of this.external)n.push(this.addElement(A,tM(i,this.doc)))}removeHost(A){this.hosts.delete(A)}addElement(A,i){return this.nonce&&i.setAttribute("nonce",this.nonce),this.isServer&&i.setAttribute(Pp,this.appId),A.appendChild(i)}static \u0275fac=function(i){return new(i||t)(we(at),we(Vd),we(yh,8),we(og))};static \u0275prov=NA({token:t,factory:t.\u0275fac})}return t})(),eM={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/",math:"http://www.w3.org/1998/Math/MathML"},rM=/%COMP%/g;var _H="%COMP%",NBA=`_nghost-${_H}`,_BA=`_ngcontent-${_H}`,GBA=!0,UBA=new dA("",{providedIn:"root",factory:()=>GBA});function KBA(t){return _BA.replace(rM,t)}function YBA(t){return NBA.replace(rM,t)}function GH(t,e){return e.map(A=>A.replace(rM,t))}var jh=(()=>{class t{eventManager;sharedStylesHost;appId;removeStylesOnCompDestroy;doc;platformId;ngZone;nonce;tracingService;rendererByCompId=new Map;defaultRenderer;platformIsServer;constructor(A,i,n,o,r,s,a,c=null,l=null){this.eventManager=A,this.sharedStylesHost=i,this.appId=n,this.removeStylesOnCompDestroy=o,this.doc=r,this.platformId=s,this.ngZone=a,this.nonce=c,this.tracingService=l,this.platformIsServer=Op(s),this.defaultRenderer=new Oh(A,r,a,this.platformIsServer,this.tracingService)}createRenderer(A,i){if(!A||!i)return this.defaultRenderer;this.platformIsServer&&i.encapsulation===eg.ShadowDom&&(i=Ye(rA({},i),{encapsulation:eg.Emulated}));let n=this.getOrCreateRenderer(A,i);return n instanceof jp?n.applyToHost(A):n instanceof Ph&&n.applyStyles(),n}getOrCreateRenderer(A,i){let n=this.rendererByCompId,o=n.get(i.id);if(!o){let r=this.doc,s=this.ngZone,a=this.eventManager,c=this.sharedStylesHost,l=this.removeStylesOnCompDestroy,I=this.platformIsServer,C=this.tracingService;switch(i.encapsulation){case eg.Emulated:o=new jp(a,c,i,this.appId,l,r,s,I,C);break;case eg.ShadowDom:return new iM(a,c,A,i,r,s,this.nonce,I,C);default:o=new Ph(a,c,i,l,r,s,I,C);break}n.set(i.id,o)}return o}ngOnDestroy(){this.rendererByCompId.clear()}componentReplaced(A){this.rendererByCompId.delete(A)}static \u0275fac=function(i){return new(i||t)(we(nM),we(oM),we(Vd),we(UBA),we(at),we(og),we(Qe),we(yh),we(Zd,8))};static \u0275prov=NA({token:t,factory:t.\u0275fac})}return t})(),Oh=class{eventManager;doc;ngZone;platformIsServer;tracingService;data=Object.create(null);throwOnSyntheticProps=!0;constructor(e,A,i,n,o){this.eventManager=e,this.doc=A,this.ngZone=i,this.platformIsServer=n,this.tracingService=o}destroy(){}destroyNode=null;createElement(e,A){return A?this.doc.createElementNS(eM[A]||A,e):this.doc.createElement(e)}createComment(e){return this.doc.createComment(e)}createText(e){return this.doc.createTextNode(e)}appendChild(e,A){(NH(e)?e.content:e).appendChild(A)}insertBefore(e,A,i){e&&(NH(e)?e.content:e).insertBefore(A,i)}removeChild(e,A){A.remove()}selectRootElement(e,A){let i=typeof e=="string"?this.doc.querySelector(e):e;if(!i)throw new Ae(-5104,!1);return A||(i.textContent=""),i}parentNode(e){return e.parentNode}nextSibling(e){return e.nextSibling}setAttribute(e,A,i,n){if(n){A=n+":"+A;let o=eM[n];o?e.setAttributeNS(o,A,i):e.setAttribute(A,i)}else e.setAttribute(A,i)}removeAttribute(e,A,i){if(i){let n=eM[i];n?e.removeAttributeNS(n,A):e.removeAttribute(`${i}:${A}`)}else e.removeAttribute(A)}addClass(e,A){e.classList.add(A)}removeClass(e,A){e.classList.remove(A)}setStyle(e,A,i,n){n&(tg.DashCase|tg.Important)?e.style.setProperty(A,i,n&tg.Important?"important":""):e.style[A]=i}removeStyle(e,A,i){i&tg.DashCase?e.style.removeProperty(A):e.style[A]=""}setProperty(e,A,i){e!=null&&(e[A]=i)}setValue(e,A){e.nodeValue=A}listen(e,A,i,n){if(typeof e=="string"&&(e=Wa().getGlobalEventTarget(this.doc,e),!e))throw new Ae(5102,!1);let o=this.decoratePreventDefault(i);return this.tracingService?.wrapEventListener&&(o=this.tracingService.wrapEventListener(e,A,o)),this.eventManager.addEventListener(e,A,o,n)}decoratePreventDefault(e){return A=>{if(A==="__ngUnwrap__")return e;(this.platformIsServer?this.ngZone.runGuarded(()=>e(A)):e(A))===!1&&A.preventDefault()}}};function NH(t){return t.tagName==="TEMPLATE"&&t.content!==void 0}var iM=class extends Oh{sharedStylesHost;hostEl;shadowRoot;constructor(e,A,i,n,o,r,s,a,c){super(e,o,r,a,c),this.sharedStylesHost=A,this.hostEl=i,this.shadowRoot=i.attachShadow({mode:"open"}),this.sharedStylesHost.addHost(this.shadowRoot);let l=n.styles;l=GH(n.id,l);for(let C of l){let d=document.createElement("style");s&&d.setAttribute("nonce",s),d.textContent=C,this.shadowRoot.appendChild(d)}let I=n.getExternalStyles?.();if(I)for(let C of I){let d=tM(C,o);s&&d.setAttribute("nonce",s),this.shadowRoot.appendChild(d)}}nodeOrShadowRoot(e){return e===this.hostEl?this.shadowRoot:e}appendChild(e,A){return super.appendChild(this.nodeOrShadowRoot(e),A)}insertBefore(e,A,i){return super.insertBefore(this.nodeOrShadowRoot(e),A,i)}removeChild(e,A){return super.removeChild(null,A)}parentNode(e){return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(e)))}destroy(){this.sharedStylesHost.removeHost(this.shadowRoot)}},Ph=class extends Oh{sharedStylesHost;removeStylesOnCompDestroy;styles;styleUrls;constructor(e,A,i,n,o,r,s,a,c){super(e,o,r,s,a),this.sharedStylesHost=A,this.removeStylesOnCompDestroy=n;let l=i.styles;this.styles=c?GH(c,l):l,this.styleUrls=i.getExternalStyles?.(c)}applyStyles(){this.sharedStylesHost.addStyles(this.styles,this.styleUrls)}destroy(){this.removeStylesOnCompDestroy&&this.sharedStylesHost.removeStyles(this.styles,this.styleUrls)}},jp=class extends Ph{contentAttr;hostAttr;constructor(e,A,i,n,o,r,s,a,c){let l=n+"-"+i.id;super(e,A,i,o,r,s,a,c,l),this.contentAttr=KBA(l),this.hostAttr=YBA(l)}applyToHost(e){this.applyStyles(),this.setAttribute(e,this.hostAttr,"")}createElement(e,A){let i=super.createElement(e,A);return super.setAttribute(i,this.contentAttr,""),i}};var Vp=class t extends _h{supportsDOMEvents=!0;static makeCurrent(){qb(new t)}onAndCancel(e,A,i,n){return e.addEventListener(A,i,n),()=>{e.removeEventListener(A,i,n)}}dispatchEvent(e,A){e.dispatchEvent(A)}remove(e){e.remove()}createElement(e,A){return A=A||this.getDefaultDocument(),A.createElement(e)}createHtmlDocument(){return document.implementation.createHTMLDocument("fakeTitle")}getDefaultDocument(){return document}isElementNode(e){return e.nodeType===Node.ELEMENT_NODE}isShadowRoot(e){return e instanceof DocumentFragment}getGlobalEventTarget(e,A){return A==="window"?window:A==="document"?e:A==="body"?e.body:null}getBaseHref(e){let A=JBA();return A==null?null:TBA(A)}resetBaseElement(){qh=null}getUserAgent(){return window.navigator.userAgent}getCookie(e){return Hh(document.cookie,e)}},qh=null;function JBA(){return qh=qh||document.head.querySelector("base"),qh?qh.getAttribute("href"):null}function TBA(t){return new URL(t,document.baseURI).pathname}var Zp=class{addToWindow(e){sa.getAngularTestability=(i,n=!0)=>{let o=e.findTestabilityInTree(i,n);if(o==null)throw new Ae(5103,!1);return o},sa.getAllAngularTestabilities=()=>e.getAllTestabilities(),sa.getAllAngularRootElements=()=>e.getAllRootElements();let A=i=>{let n=sa.getAllAngularTestabilities(),o=n.length,r=function(){o--,o==0&&i()};n.forEach(s=>{s.whenStable(r)})};sa.frameworkStabilizers||(sa.frameworkStabilizers=[]),sa.frameworkStabilizers.push(A)}findTestabilityInTree(e,A,i){if(A==null)return null;let n=e.getTestability(A);return n??(i?Wa().isShadowRoot(A)?this.findTestabilityInTree(e,A.host,!0):this.findTestabilityInTree(e,A.parentElement,!0):null)}},HBA=(()=>{class t{build(){return new XMLHttpRequest}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac})}return t})(),KH=(()=>{class t extends zh{constructor(A){super(A)}supports(A){return!0}addEventListener(A,i,n,o){return A.addEventListener(i,n,o),()=>this.removeEventListener(A,i,n,o)}removeEventListener(A,i,n,o){return A.removeEventListener(i,n,o)}static \u0275fac=function(i){return new(i||t)(we(at))};static \u0275prov=NA({token:t,factory:t.\u0275fac})}return t})(),UH=["alt","control","meta","shift"],zBA={"\b":"Backspace"," ":"Tab","\x7F":"Delete","\x1B":"Escape",Del:"Delete",Esc:"Escape",Left:"ArrowLeft",Right:"ArrowRight",Up:"ArrowUp",Down:"ArrowDown",Menu:"ContextMenu",Scroll:"ScrollLock",Win:"OS"},OBA={alt:t=>t.altKey,control:t=>t.ctrlKey,meta:t=>t.metaKey,shift:t=>t.shiftKey},YH=(()=>{class t extends zh{constructor(A){super(A)}supports(A){return t.parseEventName(A)!=null}addEventListener(A,i,n,o){let r=t.parseEventName(i),s=t.eventCallback(r.fullKey,n,this.manager.getZone());return this.manager.getZone().runOutsideAngular(()=>Wa().onAndCancel(A,r.domEventName,s,o))}static parseEventName(A){let i=A.toLowerCase().split("."),n=i.shift();if(i.length===0||!(n==="keydown"||n==="keyup"))return null;let o=t._normalizeKey(i.pop()),r="",s=i.indexOf("code");if(s>-1&&(i.splice(s,1),r="code."),UH.forEach(c=>{let l=i.indexOf(c);l>-1&&(i.splice(l,1),r+=c+".")}),r+=o,i.length!=0||o.length===0)return null;let a={};return a.domEventName=n,a.fullKey=r,a}static matchEventFullKeyCode(A,i){let n=zBA[A.key]||A.key,o="";return i.indexOf("code.")>-1&&(n=A.code,o="code."),n==null||!n?!1:(n=n.toLowerCase(),n===" "?n="space":n==="."&&(n="dot"),UH.forEach(r=>{if(r!==n){let s=OBA[r];s(A)&&(o+=r+".")}}),o+=n,o===i)}static eventCallback(A,i,n){return o=>{t.matchEventFullKeyCode(o,A)&&n.runGuarded(()=>i(o))}}static _normalizeKey(A){return A==="esc"?"escape":A}static \u0275fac=function(i){return new(i||t)(we(at))};static \u0275prov=NA({token:t,factory:t.\u0275fac})}return t})();function PBA(){Vp.makeCurrent()}function jBA(){return new aa}function qBA(){return xJ(document),document}var VBA=[{provide:og,useValue:zp},{provide:Ib,useValue:PBA,multi:!0},{provide:at,useFactory:qBA}],Wp=jb(uH,"browser",VBA);var ZBA=[{provide:xh,useClass:Zp},{provide:Gb,useClass:Lp,deps:[Qe,Fp,xh]},{provide:Lp,useClass:Lp,deps:[Qe,Fp,xh]}],WBA=[{provide:Cp,useValue:"root"},{provide:aa,useFactory:jBA},{provide:qp,useClass:KH,multi:!0,deps:[at]},{provide:qp,useClass:YH,multi:!0,deps:[at]},jh,oM,nM,{provide:ws,useExisting:jh},{provide:xI,useClass:HBA},[]],Vh=(()=>{class t{constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({providers:[...WBA,...ZBA],imports:[f0,fH]})}return t})();var AB=class{},Zh=class{},S2=class t{headers;normalizedNames=new Map;lazyInit;lazyUpdate=null;constructor(e){e?typeof e=="string"?this.lazyInit=()=>{this.headers=new Map,e.split(` -`).forEach(A=>{let i=A.indexOf(":");if(i>0){let n=A.slice(0,i),o=A.slice(i+1).trim();this.addHeaderEntry(n,o)}})}:typeof Headers<"u"&&e instanceof Headers?(this.headers=new Map,e.forEach((A,i)=>{this.addHeaderEntry(i,A)})):this.lazyInit=()=>{this.headers=new Map,Object.entries(e).forEach(([A,i])=>{this.setHeaderEntries(A,i)})}:this.headers=new Map}has(e){return this.init(),this.headers.has(e.toLowerCase())}get(e){this.init();let A=this.headers.get(e.toLowerCase());return A&&A.length>0?A[0]:null}keys(){return this.init(),Array.from(this.normalizedNames.values())}getAll(e){return this.init(),this.headers.get(e.toLowerCase())||null}append(e,A){return this.clone({name:e,value:A,op:"a"})}set(e,A){return this.clone({name:e,value:A,op:"s"})}delete(e,A){return this.clone({name:e,value:A,op:"d"})}maybeSetNormalizedName(e,A){this.normalizedNames.has(A)||this.normalizedNames.set(A,e)}init(){this.lazyInit&&(this.lazyInit instanceof t?this.copyFrom(this.lazyInit):this.lazyInit(),this.lazyInit=null,this.lazyUpdate&&(this.lazyUpdate.forEach(e=>this.applyUpdate(e)),this.lazyUpdate=null))}copyFrom(e){e.init(),Array.from(e.headers.keys()).forEach(A=>{this.headers.set(A,e.headers.get(A)),this.normalizedNames.set(A,e.normalizedNames.get(A))})}clone(e){let A=new t;return A.lazyInit=this.lazyInit&&this.lazyInit instanceof t?this.lazyInit:this,A.lazyUpdate=(this.lazyUpdate||[]).concat([e]),A}applyUpdate(e){let A=e.name.toLowerCase();switch(e.op){case"a":case"s":let i=e.value;if(typeof i=="string"&&(i=[i]),i.length===0)return;this.maybeSetNormalizedName(e.name,A);let n=(e.op==="a"?this.headers.get(A):void 0)||[];n.push(...i),this.headers.set(A,n);break;case"d":let o=e.value;if(!o)this.headers.delete(A),this.normalizedNames.delete(A);else{let r=this.headers.get(A);if(!r)return;r=r.filter(s=>o.indexOf(s)===-1),r.length===0?(this.headers.delete(A),this.normalizedNames.delete(A)):this.headers.set(A,r)}break}}addHeaderEntry(e,A){let i=e.toLowerCase();this.maybeSetNormalizedName(e,i),this.headers.has(i)?this.headers.get(i).push(A):this.headers.set(i,[A])}setHeaderEntries(e,A){let i=(Array.isArray(A)?A:[A]).map(o=>o.toString()),n=e.toLowerCase();this.headers.set(n,i),this.maybeSetNormalizedName(e,n)}forEach(e){this.init(),Array.from(this.normalizedNames.keys()).forEach(A=>e(this.normalizedNames.get(A),this.headers.get(A)))}};var $p=class{encodeKey(e){return JH(e)}encodeValue(e){return JH(e)}decodeKey(e){return decodeURIComponent(e)}decodeValue(e){return decodeURIComponent(e)}};function XBA(t,e){let A=new Map;return t.length>0&&t.replace(/^\?/,"").split("&").forEach(n=>{let o=n.indexOf("="),[r,s]=o==-1?[e.decodeKey(n),""]:[e.decodeKey(n.slice(0,o)),e.decodeValue(n.slice(o+1))],a=A.get(r)||[];a.push(s),A.set(r,a)}),A}var $BA=/%(\d[a-f0-9])/gi,AEA={40:"@","3A":":",24:"$","2C":",","3B":";","3D":"=","3F":"?","2F":"/"};function JH(t){return encodeURIComponent(t).replace($BA,(e,A)=>AEA[A]??e)}function Xp(t){return`${t}`}var m0=class t{map;encoder;updates=null;cloneFrom=null;constructor(e={}){if(this.encoder=e.encoder||new $p,e.fromString){if(e.fromObject)throw new Ae(2805,!1);this.map=XBA(e.fromString,this.encoder)}else e.fromObject?(this.map=new Map,Object.keys(e.fromObject).forEach(A=>{let i=e.fromObject[A],n=Array.isArray(i)?i.map(Xp):[Xp(i)];this.map.set(A,n)})):this.map=null}has(e){return this.init(),this.map.has(e)}get(e){this.init();let A=this.map.get(e);return A?A[0]:null}getAll(e){return this.init(),this.map.get(e)||null}keys(){return this.init(),Array.from(this.map.keys())}append(e,A){return this.clone({param:e,value:A,op:"a"})}appendAll(e){let A=[];return Object.keys(e).forEach(i=>{let n=e[i];Array.isArray(n)?n.forEach(o=>{A.push({param:i,value:o,op:"a"})}):A.push({param:i,value:n,op:"a"})}),this.clone(A)}set(e,A){return this.clone({param:e,value:A,op:"s"})}delete(e,A){return this.clone({param:e,value:A,op:"d"})}toString(){return this.init(),this.keys().map(e=>{let A=this.encoder.encodeKey(e);return this.map.get(e).map(i=>A+"="+this.encoder.encodeValue(i)).join("&")}).filter(e=>e!=="").join("&")}clone(e){let A=new t({encoder:this.encoder});return A.cloneFrom=this.cloneFrom||this,A.updates=(this.updates||[]).concat(e),A}init(){this.map===null&&(this.map=new Map),this.cloneFrom!==null&&(this.cloneFrom.init(),this.cloneFrom.keys().forEach(e=>this.map.set(e,this.cloneFrom.map.get(e))),this.updates.forEach(e=>{switch(e.op){case"a":case"s":let A=(e.op==="a"?this.map.get(e.param):void 0)||[];A.push(Xp(e.value)),this.map.set(e.param,A);break;case"d":if(e.value!==void 0){let i=this.map.get(e.param)||[],n=i.indexOf(Xp(e.value));n!==-1&&i.splice(n,1),i.length>0?this.map.set(e.param,i):this.map.delete(e.param)}else{this.map.delete(e.param);break}}}),this.cloneFrom=this.updates=null)}};var A6=class{map=new Map;set(e,A){return this.map.set(e,A),this}get(e){return this.map.has(e)||this.map.set(e,e.defaultValue()),this.map.get(e)}delete(e){return this.map.delete(e),this}has(e){return this.map.has(e)}keys(){return this.map.keys()}};function eEA(t){switch(t){case"DELETE":case"GET":case"HEAD":case"OPTIONS":case"JSONP":return!1;default:return!0}}function TH(t){return typeof ArrayBuffer<"u"&&t instanceof ArrayBuffer}function HH(t){return typeof Blob<"u"&&t instanceof Blob}function zH(t){return typeof FormData<"u"&&t instanceof FormData}function tEA(t){return typeof URLSearchParams<"u"&&t instanceof URLSearchParams}var OH="Content-Type",PH="Accept",qH="X-Request-URL",VH="text/plain",ZH="application/json",iEA=`${ZH}, ${VH}, */*`,$d=class t{url;body=null;headers;context;reportProgress=!1;withCredentials=!1;responseType="json";method;params;urlWithParams;transferCache;constructor(e,A,i,n){this.url=A,this.method=e.toUpperCase();let o;if(eEA(this.method)||n?(this.body=i!==void 0?i:null,o=n):o=i,o&&(this.reportProgress=!!o.reportProgress,this.withCredentials=!!o.withCredentials,o.responseType&&(this.responseType=o.responseType),o.headers&&(this.headers=o.headers),o.context&&(this.context=o.context),o.params&&(this.params=o.params),this.transferCache=o.transferCache),this.headers??=new S2,this.context??=new A6,!this.params)this.params=new m0,this.urlWithParams=A;else{let r=this.params.toString();if(r.length===0)this.urlWithParams=A;else{let s=A.indexOf("?"),a=s===-1?"?":sC.set(d,e.setHeaders[d]),c)),e.setParams&&(l=Object.keys(e.setParams).reduce((C,d)=>C.set(d,e.setParams[d]),l)),new t(A,i,r,{params:l,headers:c,context:I,reportProgress:a,responseType:n,withCredentials:s,transferCache:o})}},LI=function(t){return t[t.Sent=0]="Sent",t[t.UploadProgress=1]="UploadProgress",t[t.ResponseHeader=2]="ResponseHeader",t[t.DownloadProgress=3]="DownloadProgress",t[t.Response=4]="Response",t[t.User=5]="User",t}(LI||{}),eB=class{headers;status;statusText;url;ok;type;constructor(e,A=200,i="OK"){this.headers=e.headers||new S2,this.status=e.status!==void 0?e.status:A,this.statusText=e.statusText||i,this.url=e.url||null,this.ok=this.status>=200&&this.status<300}},e6=class t extends eB{constructor(e={}){super(e)}type=LI.ResponseHeader;clone(e={}){return new t({headers:e.headers||this.headers,status:e.status!==void 0?e.status:this.status,statusText:e.statusText||this.statusText,url:e.url||this.url||void 0})}},Wh=class t extends eB{body;constructor(e={}){super(e),this.body=e.body!==void 0?e.body:null}type=LI.Response;clone(e={}){return new t({body:e.body!==void 0?e.body:this.body,headers:e.headers||this.headers,status:e.status!==void 0?e.status:this.status,statusText:e.statusText||this.statusText,url:e.url||this.url||void 0})}},Xh=class extends eB{name="HttpErrorResponse";message;error;ok=!1;constructor(e){super(e,0,"Unknown Error"),this.status>=200&&this.status<300?this.message=`Http failure during parsing for ${e.url||"(unknown url)"}`:this.message=`Http failure response for ${e.url||"(unknown url)"}: ${e.status} ${e.statusText}`,this.error=e.error||null}},nEA=200,oEA=204;function sM(t,e){return{body:e,headers:t.headers,context:t.context,observe:t.observe,params:t.params,reportProgress:t.reportProgress,responseType:t.responseType,withCredentials:t.withCredentials,transferCache:t.transferCache}}var Ds=(()=>{class t{handler;constructor(A){this.handler=A}request(A,i,n={}){let o;if(A instanceof $d)o=A;else{let a;n.headers instanceof S2?a=n.headers:a=new S2(n.headers);let c;n.params&&(n.params instanceof m0?c=n.params:c=new m0({fromObject:n.params})),o=new $d(A,i,n.body!==void 0?n.body:null,{headers:a,context:n.context,params:c,reportProgress:n.reportProgress,responseType:n.responseType||"json",withCredentials:n.withCredentials,transferCache:n.transferCache})}let r=Me(o).pipe(ql(a=>this.handler.handle(a)));if(A instanceof $d||n.observe==="events")return r;let s=r.pipe(kt(a=>a instanceof Wh));switch(n.observe||"body"){case"body":switch(o.responseType){case"arraybuffer":return s.pipe(je(a=>{if(a.body!==null&&!(a.body instanceof ArrayBuffer))throw new Ae(2806,!1);return a.body}));case"blob":return s.pipe(je(a=>{if(a.body!==null&&!(a.body instanceof Blob))throw new Ae(2807,!1);return a.body}));case"text":return s.pipe(je(a=>{if(a.body!==null&&typeof a.body!="string")throw new Ae(2808,!1);return a.body}));case"json":default:return s.pipe(je(a=>a.body))}case"response":return s;default:throw new Ae(2809,!1)}}delete(A,i={}){return this.request("DELETE",A,i)}get(A,i={}){return this.request("GET",A,i)}head(A,i={}){return this.request("HEAD",A,i)}jsonp(A,i){return this.request("JSONP",A,{params:new m0().append(i,"JSONP_CALLBACK"),observe:"body",responseType:"json"})}options(A,i={}){return this.request("OPTIONS",A,i)}patch(A,i,n={}){return this.request("PATCH",A,sM(n,i))}post(A,i,n={}){return this.request("POST",A,sM(n,i))}put(A,i,n={}){return this.request("PUT",A,sM(n,i))}static \u0275fac=function(i){return new(i||t)(we(AB))};static \u0275prov=NA({token:t,factory:t.\u0275fac})}return t})();var rEA=new dA("");function WH(t,e){return e(t)}function sEA(t,e){return(A,i)=>e.intercept(A,{handle:n=>t(n,i)})}function aEA(t,e,A){return(i,n)=>ga(A,()=>e(i,o=>t(o,n)))}var XH=new dA(""),cM=new dA(""),$H=new dA(""),lM=new dA("",{providedIn:"root",factory:()=>!0});function cEA(){let t=null;return(e,A)=>{t===null&&(t=(f(XH,{optional:!0})??[]).reduceRight(sEA,WH));let i=f(B0);if(f(lM)){let o=i.add();return t(e,A).pipe(Vl(()=>i.remove(o)))}else return t(e,A)}}var t6=(()=>{class t extends AB{backend;injector;chain=null;pendingTasks=f(B0);contributeToStability=f(lM);constructor(A,i){super(),this.backend=A,this.injector=i}handle(A){if(this.chain===null){let i=Array.from(new Set([...this.injector.get(cM),...this.injector.get($H,[])]));this.chain=i.reduceRight((n,o)=>aEA(n,o,this.injector),WH)}if(this.contributeToStability){let i=this.pendingTasks.add();return this.chain(A,n=>this.backend.handle(n)).pipe(Vl(()=>this.pendingTasks.remove(i)))}else return this.chain(A,i=>this.backend.handle(i))}static \u0275fac=function(i){return new(i||t)(we(Zh),we(pr))};static \u0275prov=NA({token:t,factory:t.\u0275fac})}return t})();var lEA=/^\)\]\}',?\n/,gEA=RegExp(`^${qH}:`,"m");function IEA(t){return"responseURL"in t&&t.responseURL?t.responseURL:gEA.test(t.getAllResponseHeaders())?t.getResponseHeader(qH):null}var aM=(()=>{class t{xhrFactory;constructor(A){this.xhrFactory=A}handle(A){if(A.method==="JSONP")throw new Ae(-2800,!1);let i=this.xhrFactory;return(i.\u0275loadImpl?oo(i.\u0275loadImpl()):Me(null)).pipe(jn(()=>new ct(o=>{let r=i.build();if(r.open(A.method,A.urlWithParams),A.withCredentials&&(r.withCredentials=!0),A.headers.forEach((E,h)=>r.setRequestHeader(E,h.join(","))),A.headers.has(PH)||r.setRequestHeader(PH,iEA),!A.headers.has(OH)){let E=A.detectContentTypeHeader();E!==null&&r.setRequestHeader(OH,E)}if(A.responseType){let E=A.responseType.toLowerCase();r.responseType=E!=="json"?E:"text"}let s=A.serializeBody(),a=null,c=()=>{if(a!==null)return a;let E=r.statusText||"OK",h=new S2(r.getAllResponseHeaders()),u=IEA(r)||A.url;return a=new e6({headers:h,status:r.status,statusText:E,url:u}),a},l=()=>{let{headers:E,status:h,statusText:u,url:D}=c(),L=null;h!==oEA&&(L=typeof r.response>"u"?r.responseText:r.response),h===0&&(h=L?nEA:0);let R=h>=200&&h<300;if(A.responseType==="json"&&typeof L=="string"){let w=L;L=L.replace(lEA,"");try{L=L!==""?JSON.parse(L):null}catch(_){L=w,R&&(R=!1,L={error:_,text:L})}}R?(o.next(new Wh({body:L,headers:E,status:h,statusText:u,url:D||void 0})),o.complete()):o.error(new Xh({error:L,headers:E,status:h,statusText:u,url:D||void 0}))},I=E=>{let{url:h}=c(),u=new Xh({error:E,status:r.status||0,statusText:r.statusText||"Unknown Error",url:h||void 0});o.error(u)},C=!1,d=E=>{C||(o.next(c()),C=!0);let h={type:LI.DownloadProgress,loaded:E.loaded};E.lengthComputable&&(h.total=E.total),A.responseType==="text"&&r.responseText&&(h.partialText=r.responseText),o.next(h)},B=E=>{let h={type:LI.UploadProgress,loaded:E.loaded};E.lengthComputable&&(h.total=E.total),o.next(h)};return r.addEventListener("load",l),r.addEventListener("error",I),r.addEventListener("timeout",I),r.addEventListener("abort",I),A.reportProgress&&(r.addEventListener("progress",d),s!==null&&r.upload&&r.upload.addEventListener("progress",B)),r.send(s),o.next({type:LI.Sent}),()=>{r.removeEventListener("error",I),r.removeEventListener("abort",I),r.removeEventListener("load",l),r.removeEventListener("timeout",I),A.reportProgress&&(r.removeEventListener("progress",d),s!==null&&r.upload&&r.upload.removeEventListener("progress",B)),r.readyState!==r.DONE&&r.abort()}})))}static \u0275fac=function(i){return new(i||t)(we(xI))};static \u0275prov=NA({token:t,factory:t.\u0275fac})}return t})(),Az=new dA(""),CEA="XSRF-TOKEN",dEA=new dA("",{providedIn:"root",factory:()=>CEA}),BEA="X-XSRF-TOKEN",EEA=new dA("",{providedIn:"root",factory:()=>BEA}),$h=class{},QEA=(()=>{class t{doc;cookieName;lastCookieString="";lastToken=null;parseCount=0;constructor(A,i){this.doc=A,this.cookieName=i}getToken(){let A=this.doc.cookie||"";return A!==this.lastCookieString&&(this.parseCount++,this.lastToken=Hh(A,this.cookieName),this.lastCookieString=A),this.lastToken}static \u0275fac=function(i){return new(i||t)(we(at),we(dEA))};static \u0275prov=NA({token:t,factory:t.\u0275fac})}return t})();function hEA(t,e){let A=t.url.toLowerCase();if(!f(Az)||t.method==="GET"||t.method==="HEAD"||A.startsWith("http://")||A.startsWith("https://"))return e(t);let i=f($h).getToken(),n=f(EEA);return i!=null&&!t.headers.has(n)&&(t=t.clone({headers:t.headers.set(n,i)})),e(t)}var gM=function(t){return t[t.Interceptors=0]="Interceptors",t[t.LegacyInterceptors=1]="LegacyInterceptors",t[t.CustomXsrfConfiguration=2]="CustomXsrfConfiguration",t[t.NoXsrfProtection=3]="NoXsrfProtection",t[t.JsonpSupport=4]="JsonpSupport",t[t.RequestsMadeViaParent=5]="RequestsMadeViaParent",t[t.Fetch=6]="Fetch",t}(gM||{});function uEA(t,e){return{\u0275kind:t,\u0275providers:e}}function ez(...t){let e=[Ds,aM,t6,{provide:AB,useExisting:t6},{provide:Zh,useFactory:()=>f(rEA,{optional:!0})??f(aM)},{provide:cM,useValue:hEA,multi:!0},{provide:Az,useValue:!0},{provide:$h,useClass:QEA}];for(let A of t)e.push(...A.\u0275providers);return ph(e)}var jH=new dA("");function tz(){return uEA(gM.LegacyInterceptors,[{provide:jH,useFactory:cEA},{provide:cM,useExisting:jH,multi:!0}])}var IM=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({providers:[ez(tz())]})}return t})();var iz=(()=>{class t{_doc;constructor(A){this._doc=A}getTitle(){return this._doc.title}setTitle(A){this._doc.title=A||""}static \u0275fac=function(i){return new(i||t)(we(at))};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var cl=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:function(i){let n=null;return i?n=new(i||t):n=we(fEA),n},providedIn:"root"})}return t})(),fEA=(()=>{class t extends cl{_doc;constructor(A){super(),this._doc=A}sanitize(A,i){if(i==null)return null;switch(A){case jr.NONE:return i;case jr.HTML:return w2(i,"HTML")?sl(i):Eb(this._doc,String(i)).toString();case jr.STYLE:return w2(i,"Style")?sl(i):i;case jr.SCRIPT:if(w2(i,"Script"))return sl(i);throw new Ae(5200,!1);case jr.URL:return w2(i,"URL")?sl(i):pp(String(i));case jr.RESOURCE_URL:if(w2(i,"ResourceURL"))return sl(i);throw new Ae(5201,!1);default:throw new Ae(5202,!1)}}bypassSecurityTrustHtml(A){return KJ(A)}bypassSecurityTrustStyle(A){return YJ(A)}bypassSecurityTrustScript(A){return JJ(A)}bypassSecurityTrustUrl(A){return TJ(A)}bypassSecurityTrustResourceUrl(A){return HJ(A)}static \u0275fac=function(i){return new(i||t)(we(at))};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var gz=(()=>{class t{_renderer;_elementRef;onChange=A=>{};onTouched=()=>{};constructor(A,i){this._renderer=A,this._elementRef=i}setProperty(A,i){this._renderer.setProperty(this._elementRef.nativeElement,A,i)}registerOnTouched(A){this.onTouched=A}registerOnChange(A){this.onChange=A}setDisabledState(A){this.setProperty("disabled",A)}static \u0275fac=function(i){return new(i||t)(PA(Wi),PA(ee))};static \u0275dir=jA({type:t})}return t})(),mEA=(()=>{class t extends gz{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275dir=jA({type:t,features:[lt]})}return t})(),yc=new dA("");var pEA={provide:yc,useExisting:Ir(()=>vc),multi:!0};function wEA(){let t=Wa()?Wa().getUserAgent():"";return/android (\d+)/.test(t.toLowerCase())}var DEA=new dA(""),vc=(()=>{class t extends gz{_compositionMode;_composing=!1;constructor(A,i,n){super(A,i),this._compositionMode=n,this._compositionMode==null&&(this._compositionMode=!wEA())}writeValue(A){let i=A??"";this.setProperty("value",i)}_handleInput(A){(!this._compositionMode||this._compositionMode&&!this._composing)&&this.onChange(A)}_compositionStart(){this._composing=!0}_compositionEnd(A){this._composing=!1,this._compositionMode&&this.onChange(A)}static \u0275fac=function(i){return new(i||t)(PA(Wi),PA(ee),PA(DEA,8))};static \u0275dir=jA({type:t,selectors:[["input","formControlName","",3,"type","checkbox"],["textarea","formControlName",""],["input","formControl","",3,"type","checkbox"],["textarea","formControl",""],["input","ngModel","",3,"type","checkbox"],["textarea","ngModel",""],["","ngDefaultControl",""]],hostBindings:function(i,n){i&1&&hA("input",function(r){return n._handleInput(r.target.value)})("blur",function(){return n.onTouched()})("compositionstart",function(){return n._compositionStart()})("compositionend",function(r){return n._compositionEnd(r.target.value)})},standalone:!1,features:[ht([pEA]),lt]})}return t})();function EM(t){return t==null||QM(t)===0}function QM(t){return t==null?null:Array.isArray(t)||typeof t=="string"?t.length:t instanceof Set?t.size:null}var w0=new dA(""),ru=new dA(""),yEA=/^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[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])?)*$/,$a=class{static min(e){return vEA(e)}static max(e){return bEA(e)}static required(e){return MEA(e)}static requiredTrue(e){return kEA(e)}static email(e){return SEA(e)}static minLength(e){return REA(e)}static maxLength(e){return xEA(e)}static pattern(e){return LEA(e)}static nullValidator(e){return Iz()}static compose(e){return hz(e)}static composeAsync(e){return uz(e)}};function vEA(t){return e=>{if(e.value==null||t==null)return null;let A=parseFloat(e.value);return!isNaN(A)&&A{if(e.value==null||t==null)return null;let A=parseFloat(e.value);return!isNaN(A)&&A>t?{max:{max:t,actual:e.value}}:null}}function MEA(t){return EM(t.value)?{required:!0}:null}function kEA(t){return t.value===!0?null:{required:!0}}function SEA(t){return EM(t.value)||yEA.test(t.value)?null:{email:!0}}function REA(t){return e=>{let A=e.value?.length??QM(e.value);return A===null||A===0?null:A{let A=e.value?.length??QM(e.value);return A!==null&&A>t?{maxlength:{requiredLength:t,actualLength:A}}:null}}function LEA(t){if(!t)return Iz;let e,A;return typeof t=="string"?(A="",t.charAt(0)!=="^"&&(A+="^"),A+=t,t.charAt(t.length-1)!=="$"&&(A+="$"),e=new RegExp(A)):(A=t.toString(),e=t),i=>{if(EM(i.value))return null;let n=i.value;return e.test(n)?null:{pattern:{requiredPattern:A,actualValue:n}}}}function Iz(t){return null}function Cz(t){return t!=null}function dz(t){return D2(t)?oo(t):t}function Bz(t){let e={};return t.forEach(A=>{e=A!=null?rA(rA({},e),A):e}),Object.keys(e).length===0?null:e}function Ez(t,e){return e.map(A=>A(t))}function FEA(t){return!t.validate}function Qz(t){return t.map(e=>FEA(e)?e:A=>e.validate(A))}function hz(t){if(!t)return null;let e=t.filter(Cz);return e.length==0?null:function(A){return Bz(Ez(A,e))}}function hM(t){return t!=null?hz(Qz(t)):null}function uz(t){if(!t)return null;let e=t.filter(Cz);return e.length==0?null:function(A){let i=Ez(A,e).map(dz);return nh(i).pipe(je(Bz))}}function uM(t){return t!=null?uz(Qz(t)):null}function nz(t,e){return t===null?[e]:Array.isArray(t)?[...t,e]:[t,e]}function fz(t){return t._rawValidators}function mz(t){return t._rawAsyncValidators}function CM(t){return t?Array.isArray(t)?t:[t]:[]}function n6(t,e){return Array.isArray(t)?t.includes(e):t===e}function oz(t,e){let A=CM(e);return CM(t).forEach(n=>{n6(A,n)||A.push(n)}),A}function rz(t,e){return CM(e).filter(A=>!n6(t,A))}var o6=class{get value(){return this.control?this.control.value:null}get valid(){return this.control?this.control.valid:null}get invalid(){return this.control?this.control.invalid:null}get pending(){return this.control?this.control.pending:null}get disabled(){return this.control?this.control.disabled:null}get enabled(){return this.control?this.control.enabled:null}get errors(){return this.control?this.control.errors:null}get pristine(){return this.control?this.control.pristine:null}get dirty(){return this.control?this.control.dirty:null}get touched(){return this.control?this.control.touched:null}get status(){return this.control?this.control.status:null}get untouched(){return this.control?this.control.untouched:null}get statusChanges(){return this.control?this.control.statusChanges:null}get valueChanges(){return this.control?this.control.valueChanges:null}get path(){return null}_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators=[];_rawAsyncValidators=[];_setValidators(e){this._rawValidators=e||[],this._composedValidatorFn=hM(this._rawValidators)}_setAsyncValidators(e){this._rawAsyncValidators=e||[],this._composedAsyncValidatorFn=uM(this._rawAsyncValidators)}get validator(){return this._composedValidatorFn||null}get asyncValidator(){return this._composedAsyncValidatorFn||null}_onDestroyCallbacks=[];_registerOnDestroy(e){this._onDestroyCallbacks.push(e)}_invokeOnDestroyCallbacks(){this._onDestroyCallbacks.forEach(e=>e()),this._onDestroyCallbacks=[]}reset(e=void 0){this.control&&this.control.reset(e)}hasError(e,A){return this.control?this.control.hasError(e,A):!1}getError(e,A){return this.control?this.control.getError(e,A):null}},p0=class extends o6{name;get formDirective(){return null}get path(){return null}},Ac=class extends o6{_parent=null;name=null;valueAccessor=null},r6=class{_cd;constructor(e){this._cd=e}get isTouched(){return this._cd?.control?._touched?.(),!!this._cd?.control?.touched}get isUntouched(){return!!this._cd?.control?.untouched}get isPristine(){return this._cd?.control?._pristine?.(),!!this._cd?.control?.pristine}get isDirty(){return!!this._cd?.control?.dirty}get isValid(){return this._cd?.control?._status?.(),!!this._cd?.control?.valid}get isInvalid(){return!!this._cd?.control?.invalid}get isPending(){return!!this._cd?.control?.pending}get isSubmitted(){return this._cd?._submitted?.(),!!this._cd?.submitted}},NEA={"[class.ng-untouched]":"isUntouched","[class.ng-touched]":"isTouched","[class.ng-pristine]":"isPristine","[class.ng-dirty]":"isDirty","[class.ng-valid]":"isValid","[class.ng-invalid]":"isInvalid","[class.ng-pending]":"isPending"},Bse=Ye(rA({},NEA),{"[class.ng-submitted]":"isSubmitted"}),Ea=(()=>{class t extends r6{constructor(A){super(A)}static \u0275fac=function(i){return new(i||t)(PA(Ac,2))};static \u0275dir=jA({type:t,selectors:[["","formControlName",""],["","ngModel",""],["","formControl",""]],hostVars:14,hostBindings:function(i,n){i&2&&ue("ng-untouched",n.isUntouched)("ng-touched",n.isTouched)("ng-pristine",n.isPristine)("ng-dirty",n.isDirty)("ng-valid",n.isValid)("ng-invalid",n.isInvalid)("ng-pending",n.isPending)},standalone:!1,features:[lt]})}return t})(),pz=(()=>{class t extends r6{constructor(A){super(A)}static \u0275fac=function(i){return new(i||t)(PA(p0,10))};static \u0275dir=jA({type:t,selectors:[["","formGroupName",""],["","formArrayName",""],["","ngModelGroup",""],["","formGroup",""],["form",3,"ngNoForm",""],["","ngForm",""]],hostVars:16,hostBindings:function(i,n){i&2&&ue("ng-untouched",n.isUntouched)("ng-touched",n.isTouched)("ng-pristine",n.isPristine)("ng-dirty",n.isDirty)("ng-valid",n.isValid)("ng-invalid",n.isInvalid)("ng-pending",n.isPending)("ng-submitted",n.isSubmitted)},standalone:!1,features:[lt]})}return t})();var Au="VALID",i6="INVALID",tB="PENDING",eu="DISABLED",R2=class{},s6=class extends R2{value;source;constructor(e,A){super(),this.value=e,this.source=A}},iu=class extends R2{pristine;source;constructor(e,A){super(),this.pristine=e,this.source=A}},nu=class extends R2{touched;source;constructor(e,A){super(),this.touched=e,this.source=A}},iB=class extends R2{status;source;constructor(e,A){super(),this.status=e,this.source=A}},a6=class extends R2{source;constructor(e){super(),this.source=e}},c6=class extends R2{source;constructor(e){super(),this.source=e}};function fM(t){return(C6(t)?t.validators:t)||null}function _EA(t){return Array.isArray(t)?hM(t):t||null}function mM(t,e){return(C6(e)?e.asyncValidators:t)||null}function GEA(t){return Array.isArray(t)?uM(t):t||null}function C6(t){return t!=null&&!Array.isArray(t)&&typeof t=="object"}function wz(t,e,A){let i=t.controls;if(!(e?Object.keys(i):i).length)throw new Ae(1e3,"");if(!i[A])throw new Ae(1001,"")}function Dz(t,e,A){t._forEachChild((i,n)=>{if(A[n]===void 0)throw new Ae(1002,"")})}var nB=class{_pendingDirty=!1;_hasOwnPendingAsyncValidator=null;_pendingTouched=!1;_onCollectionChange=()=>{};_updateOn;_parent=null;_asyncValidationSubscription;_composedValidatorFn;_composedAsyncValidatorFn;_rawValidators;_rawAsyncValidators;value;constructor(e,A){this._assignValidators(e),this._assignAsyncValidators(A)}get validator(){return this._composedValidatorFn}set validator(e){this._rawValidators=this._composedValidatorFn=e}get asyncValidator(){return this._composedAsyncValidatorFn}set asyncValidator(e){this._rawAsyncValidators=this._composedAsyncValidatorFn=e}get parent(){return this._parent}get status(){return Ba(this.statusReactive)}set status(e){Ba(()=>this.statusReactive.set(e))}_status=h0(()=>this.statusReactive());statusReactive=Jo(void 0);get valid(){return this.status===Au}get invalid(){return this.status===i6}get pending(){return this.status==tB}get disabled(){return this.status===eu}get enabled(){return this.status!==eu}errors;get pristine(){return Ba(this.pristineReactive)}set pristine(e){Ba(()=>this.pristineReactive.set(e))}_pristine=h0(()=>this.pristineReactive());pristineReactive=Jo(!0);get dirty(){return!this.pristine}get touched(){return Ba(this.touchedReactive)}set touched(e){Ba(()=>this.touchedReactive.set(e))}_touched=h0(()=>this.touchedReactive());touchedReactive=Jo(!1);get untouched(){return!this.touched}_events=new OA;events=this._events.asObservable();valueChanges;statusChanges;get updateOn(){return this._updateOn?this._updateOn:this.parent?this.parent.updateOn:"change"}setValidators(e){this._assignValidators(e)}setAsyncValidators(e){this._assignAsyncValidators(e)}addValidators(e){this.setValidators(oz(e,this._rawValidators))}addAsyncValidators(e){this.setAsyncValidators(oz(e,this._rawAsyncValidators))}removeValidators(e){this.setValidators(rz(e,this._rawValidators))}removeAsyncValidators(e){this.setAsyncValidators(rz(e,this._rawAsyncValidators))}hasValidator(e){return n6(this._rawValidators,e)}hasAsyncValidator(e){return n6(this._rawAsyncValidators,e)}clearValidators(){this.validator=null}clearAsyncValidators(){this.asyncValidator=null}markAsTouched(e={}){let A=this.touched===!1;this.touched=!0;let i=e.sourceControl??this;this._parent&&!e.onlySelf&&this._parent.markAsTouched(Ye(rA({},e),{sourceControl:i})),A&&e.emitEvent!==!1&&this._events.next(new nu(!0,i))}markAllAsTouched(e={}){this.markAsTouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:this}),this._forEachChild(A=>A.markAllAsTouched(e))}markAsUntouched(e={}){let A=this.touched===!0;this.touched=!1,this._pendingTouched=!1;let i=e.sourceControl??this;this._forEachChild(n=>{n.markAsUntouched({onlySelf:!0,emitEvent:e.emitEvent,sourceControl:i})}),this._parent&&!e.onlySelf&&this._parent._updateTouched(e,i),A&&e.emitEvent!==!1&&this._events.next(new nu(!1,i))}markAsDirty(e={}){let A=this.pristine===!0;this.pristine=!1;let i=e.sourceControl??this;this._parent&&!e.onlySelf&&this._parent.markAsDirty(Ye(rA({},e),{sourceControl:i})),A&&e.emitEvent!==!1&&this._events.next(new iu(!1,i))}markAsPristine(e={}){let A=this.pristine===!1;this.pristine=!0,this._pendingDirty=!1;let i=e.sourceControl??this;this._forEachChild(n=>{n.markAsPristine({onlySelf:!0,emitEvent:e.emitEvent})}),this._parent&&!e.onlySelf&&this._parent._updatePristine(e,i),A&&e.emitEvent!==!1&&this._events.next(new iu(!0,i))}markAsPending(e={}){this.status=tB;let A=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new iB(this.status,A)),this.statusChanges.emit(this.status)),this._parent&&!e.onlySelf&&this._parent.markAsPending(Ye(rA({},e),{sourceControl:A}))}disable(e={}){let A=this._parentMarkedDirty(e.onlySelf);this.status=eu,this.errors=null,this._forEachChild(n=>{n.disable(Ye(rA({},e),{onlySelf:!0}))}),this._updateValue();let i=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new s6(this.value,i)),this._events.next(new iB(this.status,i)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._updateAncestors(Ye(rA({},e),{skipPristineCheck:A}),this),this._onDisabledChange.forEach(n=>n(!0))}enable(e={}){let A=this._parentMarkedDirty(e.onlySelf);this.status=Au,this._forEachChild(i=>{i.enable(Ye(rA({},e),{onlySelf:!0}))}),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent}),this._updateAncestors(Ye(rA({},e),{skipPristineCheck:A}),this),this._onDisabledChange.forEach(i=>i(!1))}_updateAncestors(e,A){this._parent&&!e.onlySelf&&(this._parent.updateValueAndValidity(e),e.skipPristineCheck||this._parent._updatePristine({},A),this._parent._updateTouched({},A))}setParent(e){this._parent=e}getRawValue(){return this.value}updateValueAndValidity(e={}){if(this._setInitialStatus(),this._updateValue(),this.enabled){let i=this._cancelExistingSubscription();this.errors=this._runValidator(),this.status=this._calculateStatus(),(this.status===Au||this.status===tB)&&this._runAsyncValidator(i,e.emitEvent)}let A=e.sourceControl??this;e.emitEvent!==!1&&(this._events.next(new s6(this.value,A)),this._events.next(new iB(this.status,A)),this.valueChanges.emit(this.value),this.statusChanges.emit(this.status)),this._parent&&!e.onlySelf&&this._parent.updateValueAndValidity(Ye(rA({},e),{sourceControl:A}))}_updateTreeValidity(e={emitEvent:!0}){this._forEachChild(A=>A._updateTreeValidity(e)),this.updateValueAndValidity({onlySelf:!0,emitEvent:e.emitEvent})}_setInitialStatus(){this.status=this._allControlsDisabled()?eu:Au}_runValidator(){return this.validator?this.validator(this):null}_runAsyncValidator(e,A){if(this.asyncValidator){this.status=tB,this._hasOwnPendingAsyncValidator={emitEvent:A!==!1};let i=dz(this.asyncValidator(this));this._asyncValidationSubscription=i.subscribe(n=>{this._hasOwnPendingAsyncValidator=null,this.setErrors(n,{emitEvent:A,shouldHaveEmitted:e})})}}_cancelExistingSubscription(){if(this._asyncValidationSubscription){this._asyncValidationSubscription.unsubscribe();let e=this._hasOwnPendingAsyncValidator?.emitEvent??!1;return this._hasOwnPendingAsyncValidator=null,e}return!1}setErrors(e,A={}){this.errors=e,this._updateControlsErrors(A.emitEvent!==!1,this,A.shouldHaveEmitted)}get(e){let A=e;return A==null||(Array.isArray(A)||(A=A.split(".")),A.length===0)?null:A.reduce((i,n)=>i&&i._find(n),this)}getError(e,A){let i=A?this.get(A):this;return i&&i.errors?i.errors[e]:null}hasError(e,A){return!!this.getError(e,A)}get root(){let e=this;for(;e._parent;)e=e._parent;return e}_updateControlsErrors(e,A,i){this.status=this._calculateStatus(),e&&this.statusChanges.emit(this.status),(e||i)&&this._events.next(new iB(this.status,A)),this._parent&&this._parent._updateControlsErrors(e,A,i)}_initObservables(){this.valueChanges=new WA,this.statusChanges=new WA}_calculateStatus(){return this._allControlsDisabled()?eu:this.errors?i6:this._hasOwnPendingAsyncValidator||this._anyControlsHaveStatus(tB)?tB:this._anyControlsHaveStatus(i6)?i6:Au}_anyControlsHaveStatus(e){return this._anyControls(A=>A.status===e)}_anyControlsDirty(){return this._anyControls(e=>e.dirty)}_anyControlsTouched(){return this._anyControls(e=>e.touched)}_updatePristine(e,A){let i=!this._anyControlsDirty(),n=this.pristine!==i;this.pristine=i,this._parent&&!e.onlySelf&&this._parent._updatePristine(e,A),n&&this._events.next(new iu(this.pristine,A))}_updateTouched(e={},A){this.touched=this._anyControlsTouched(),this._events.next(new nu(this.touched,A)),this._parent&&!e.onlySelf&&this._parent._updateTouched(e,A)}_onDisabledChange=[];_registerOnCollectionChange(e){this._onCollectionChange=e}_setUpdateStrategy(e){C6(e)&&e.updateOn!=null&&(this._updateOn=e.updateOn)}_parentMarkedDirty(e){let A=this._parent&&this._parent.dirty;return!e&&!!A&&!this._parent._anyControlsDirty()}_find(e){return null}_assignValidators(e){this._rawValidators=Array.isArray(e)?e.slice():e,this._composedValidatorFn=_EA(this._rawValidators)}_assignAsyncValidators(e){this._rawAsyncValidators=Array.isArray(e)?e.slice():e,this._composedAsyncValidatorFn=GEA(this._rawAsyncValidators)}},oB=class extends nB{constructor(e,A,i){super(fM(A),mM(i,A)),this.controls=e,this._initObservables(),this._setUpdateStrategy(A),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}controls;registerControl(e,A){return this.controls[e]?this.controls[e]:(this.controls[e]=A,A.setParent(this),A._registerOnCollectionChange(this._onCollectionChange),A)}addControl(e,A,i={}){this.registerControl(e,A),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}removeControl(e,A={}){this.controls[e]&&this.controls[e]._registerOnCollectionChange(()=>{}),delete this.controls[e],this.updateValueAndValidity({emitEvent:A.emitEvent}),this._onCollectionChange()}setControl(e,A,i={}){this.controls[e]&&this.controls[e]._registerOnCollectionChange(()=>{}),delete this.controls[e],A&&this.registerControl(e,A),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}contains(e){return this.controls.hasOwnProperty(e)&&this.controls[e].enabled}setValue(e,A={}){Dz(this,!0,e),Object.keys(e).forEach(i=>{wz(this,!0,i),this.controls[i].setValue(e[i],{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A)}patchValue(e,A={}){e!=null&&(Object.keys(e).forEach(i=>{let n=this.controls[i];n&&n.patchValue(e[i],{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A))}reset(e={},A={}){this._forEachChild((i,n)=>{i.reset(e?e[n]:null,{onlySelf:!0,emitEvent:A.emitEvent})}),this._updatePristine(A,this),this._updateTouched(A,this),this.updateValueAndValidity(A)}getRawValue(){return this._reduceChildren({},(e,A,i)=>(e[i]=A.getRawValue(),e))}_syncPendingControls(){let e=this._reduceChildren(!1,(A,i)=>i._syncPendingControls()?!0:A);return e&&this.updateValueAndValidity({onlySelf:!0}),e}_forEachChild(e){Object.keys(this.controls).forEach(A=>{let i=this.controls[A];i&&e(i,A)})}_setUpControls(){this._forEachChild(e=>{e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange)})}_updateValue(){this.value=this._reduceValue()}_anyControls(e){for(let[A,i]of Object.entries(this.controls))if(this.contains(A)&&e(i))return!0;return!1}_reduceValue(){let e={};return this._reduceChildren(e,(A,i,n)=>((i.enabled||this.disabled)&&(A[n]=i.value),A))}_reduceChildren(e,A){let i=e;return this._forEachChild((n,o)=>{i=A(i,n,o)}),i}_allControlsDisabled(){for(let e of Object.keys(this.controls))if(this.controls[e].enabled)return!1;return Object.keys(this.controls).length>0||this.disabled}_find(e){return this.controls.hasOwnProperty(e)?this.controls[e]:null}};var dM=class extends oB{};var rB=new dA("",{providedIn:"root",factory:()=>d6}),d6="always";function yz(t,e){return[...e.path,t]}function ou(t,e,A=d6){pM(t,e),e.valueAccessor.writeValue(t.value),(t.disabled||A==="always")&&e.valueAccessor.setDisabledState?.(t.disabled),KEA(t,e),JEA(t,e),YEA(t,e),UEA(t,e)}function l6(t,e,A=!0){let i=()=>{};e.valueAccessor&&(e.valueAccessor.registerOnChange(i),e.valueAccessor.registerOnTouched(i)),I6(t,e),t&&(e._invokeOnDestroyCallbacks(),t._registerOnCollectionChange(()=>{}))}function g6(t,e){t.forEach(A=>{A.registerOnValidatorChange&&A.registerOnValidatorChange(e)})}function UEA(t,e){if(e.valueAccessor.setDisabledState){let A=i=>{e.valueAccessor.setDisabledState(i)};t.registerOnDisabledChange(A),e._registerOnDestroy(()=>{t._unregisterOnDisabledChange(A)})}}function pM(t,e){let A=fz(t);e.validator!==null?t.setValidators(nz(A,e.validator)):typeof A=="function"&&t.setValidators([A]);let i=mz(t);e.asyncValidator!==null?t.setAsyncValidators(nz(i,e.asyncValidator)):typeof i=="function"&&t.setAsyncValidators([i]);let n=()=>t.updateValueAndValidity();g6(e._rawValidators,n),g6(e._rawAsyncValidators,n)}function I6(t,e){let A=!1;if(t!==null){if(e.validator!==null){let n=fz(t);if(Array.isArray(n)&&n.length>0){let o=n.filter(r=>r!==e.validator);o.length!==n.length&&(A=!0,t.setValidators(o))}}if(e.asyncValidator!==null){let n=mz(t);if(Array.isArray(n)&&n.length>0){let o=n.filter(r=>r!==e.asyncValidator);o.length!==n.length&&(A=!0,t.setAsyncValidators(o))}}}let i=()=>{};return g6(e._rawValidators,i),g6(e._rawAsyncValidators,i),A}function KEA(t,e){e.valueAccessor.registerOnChange(A=>{t._pendingValue=A,t._pendingChange=!0,t._pendingDirty=!0,t.updateOn==="change"&&vz(t,e)})}function YEA(t,e){e.valueAccessor.registerOnTouched(()=>{t._pendingTouched=!0,t.updateOn==="blur"&&t._pendingChange&&vz(t,e),t.updateOn!=="submit"&&t.markAsTouched()})}function vz(t,e){t._pendingDirty&&t.markAsDirty(),t.setValue(t._pendingValue,{emitModelToViewChange:!1}),e.viewToModelUpdate(t._pendingValue),t._pendingChange=!1}function JEA(t,e){let A=(i,n)=>{e.valueAccessor.writeValue(i),n&&e.viewToModelUpdate(i)};t.registerOnChange(A),e._registerOnDestroy(()=>{t._unregisterOnChange(A)})}function bz(t,e){t==null,pM(t,e)}function TEA(t,e){return I6(t,e)}function wM(t,e){if(!t.hasOwnProperty("model"))return!1;let A=t.model;return A.isFirstChange()?!0:!Object.is(e,A.currentValue)}function HEA(t){return Object.getPrototypeOf(t.constructor)===mEA}function Mz(t,e){t._syncPendingControls(),e.forEach(A=>{let i=A.control;i.updateOn==="submit"&&i._pendingChange&&(A.viewToModelUpdate(i._pendingValue),i._pendingChange=!1)})}function DM(t,e){if(!e)return null;Array.isArray(e);let A,i,n;return e.forEach(o=>{o.constructor===vc?A=o:HEA(o)?i=o:n=o}),n||i||A||null}function zEA(t,e){let A=t.indexOf(e);A>-1&&t.splice(A,1)}var OEA={provide:p0,useExisting:Ir(()=>su)},tu=Promise.resolve(),su=(()=>{class t extends p0{callSetDisabledState;get submitted(){return Ba(this.submittedReactive)}_submitted=h0(()=>this.submittedReactive());submittedReactive=Jo(!1);_directives=new Set;form;ngSubmit=new WA;options;constructor(A,i,n){super(),this.callSetDisabledState=n,this.form=new oB({},hM(A),uM(i))}ngAfterViewInit(){this._setUpdateStrategy()}get formDirective(){return this}get control(){return this.form}get path(){return[]}get controls(){return this.form.controls}addControl(A){tu.then(()=>{let i=this._findContainer(A.path);A.control=i.registerControl(A.name,A.control),ou(A.control,A,this.callSetDisabledState),A.control.updateValueAndValidity({emitEvent:!1}),this._directives.add(A)})}getControl(A){return this.form.get(A.path)}removeControl(A){tu.then(()=>{let i=this._findContainer(A.path);i&&i.removeControl(A.name),this._directives.delete(A)})}addFormGroup(A){tu.then(()=>{let i=this._findContainer(A.path),n=new oB({});bz(n,A),i.registerControl(A.name,n),n.updateValueAndValidity({emitEvent:!1})})}removeFormGroup(A){tu.then(()=>{let i=this._findContainer(A.path);i&&i.removeControl(A.name)})}getFormGroup(A){return this.form.get(A.path)}updateModel(A,i){tu.then(()=>{this.form.get(A.path).setValue(i)})}setValue(A){this.control.setValue(A)}onSubmit(A){return this.submittedReactive.set(!0),Mz(this.form,this._directives),this.ngSubmit.emit(A),this.form._events.next(new a6(this.control)),A?.target?.method==="dialog"}onReset(){this.resetForm()}resetForm(A=void 0){this.form.reset(A),this.submittedReactive.set(!1),this.form._events.next(new c6(this.form))}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.form._updateOn=this.options.updateOn)}_findContainer(A){return A.pop(),A.length?this.form.get(A):this.form}static \u0275fac=function(i){return new(i||t)(PA(w0,10),PA(ru,10),PA(rB,8))};static \u0275dir=jA({type:t,selectors:[["form",3,"ngNoForm","",3,"formGroup",""],["ng-form"],["","ngForm",""]],hostBindings:function(i,n){i&1&&hA("submit",function(r){return n.onSubmit(r)})("reset",function(){return n.onReset()})},inputs:{options:[0,"ngFormOptions","options"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],standalone:!1,features:[ht([OEA]),lt]})}return t})();function sz(t,e){let A=t.indexOf(e);A>-1&&t.splice(A,1)}function az(t){return typeof t=="object"&&t!==null&&Object.keys(t).length===2&&"value"in t&&"disabled"in t}var _I=class extends nB{defaultValue=null;_onChange=[];_pendingValue;_pendingChange=!1;constructor(e=null,A,i){super(fM(A),mM(i,A)),this._applyFormState(e),this._setUpdateStrategy(A),this._initObservables(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator}),C6(A)&&(A.nonNullable||A.initialValueIsDefault)&&(az(e)?this.defaultValue=e.value:this.defaultValue=e)}setValue(e,A={}){this.value=this._pendingValue=e,this._onChange.length&&A.emitModelToViewChange!==!1&&this._onChange.forEach(i=>i(this.value,A.emitViewToModelChange!==!1)),this.updateValueAndValidity(A)}patchValue(e,A={}){this.setValue(e,A)}reset(e=this.defaultValue,A={}){this._applyFormState(e),this.markAsPristine(A),this.markAsUntouched(A),this.setValue(this.value,A),this._pendingChange=!1}_updateValue(){}_anyControls(e){return!1}_allControlsDisabled(){return this.disabled}registerOnChange(e){this._onChange.push(e)}_unregisterOnChange(e){sz(this._onChange,e)}registerOnDisabledChange(e){this._onDisabledChange.push(e)}_unregisterOnDisabledChange(e){sz(this._onDisabledChange,e)}_forEachChild(e){}_syncPendingControls(){return this.updateOn==="submit"&&(this._pendingDirty&&this.markAsDirty(),this._pendingTouched&&this.markAsTouched(),this._pendingChange)?(this.setValue(this._pendingValue,{onlySelf:!0,emitModelToViewChange:!1}),!0):!1}_applyFormState(e){az(e)?(this.value=this._pendingValue=e.value,e.disabled?this.disable({onlySelf:!0,emitEvent:!1}):this.enable({onlySelf:!0,emitEvent:!1})):this.value=this._pendingValue=e}};var PEA=t=>t instanceof _I;var jEA={provide:Ac,useExisting:Ir(()=>ec)},cz=Promise.resolve(),ec=(()=>{class t extends Ac{_changeDetectorRef;callSetDisabledState;control=new _I;static ngAcceptInputType_isDisabled;_registered=!1;viewModel;name="";isDisabled;model;options;update=new WA;constructor(A,i,n,o,r,s){super(),this._changeDetectorRef=r,this.callSetDisabledState=s,this._parent=A,this._setValidators(i),this._setAsyncValidators(n),this.valueAccessor=DM(this,o)}ngOnChanges(A){if(this._checkForErrors(),!this._registered||"name"in A){if(this._registered&&(this._checkName(),this.formDirective)){let i=A.name.previousValue;this.formDirective.removeControl({name:i,path:this._getPath(i)})}this._setUpControl()}"isDisabled"in A&&this._updateDisabled(A),wM(A,this.viewModel)&&(this._updateValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.formDirective&&this.formDirective.removeControl(this)}get path(){return this._getPath(this.name)}get formDirective(){return this._parent?this._parent.formDirective:null}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}_setUpControl(){this._setUpdateStrategy(),this._isStandalone()?this._setUpStandalone():this.formDirective.addControl(this),this._registered=!0}_setUpdateStrategy(){this.options&&this.options.updateOn!=null&&(this.control._updateOn=this.options.updateOn)}_isStandalone(){return!this._parent||!!(this.options&&this.options.standalone)}_setUpStandalone(){ou(this.control,this,this.callSetDisabledState),this.control.updateValueAndValidity({emitEvent:!1})}_checkForErrors(){this._checkName()}_checkName(){this.options&&this.options.name&&(this.name=this.options.name),!this._isStandalone()&&this.name}_updateValue(A){cz.then(()=>{this.control.setValue(A,{emitViewToModelChange:!1}),this._changeDetectorRef?.markForCheck()})}_updateDisabled(A){let i=A.isDisabled.currentValue,n=i!==0&&ie(i);cz.then(()=>{n&&!this.control.disabled?this.control.disable():!n&&this.control.disabled&&this.control.enable(),this._changeDetectorRef?.markForCheck()})}_getPath(A){return this._parent?yz(A,this._parent):[A]}static \u0275fac=function(i){return new(i||t)(PA(p0,9),PA(w0,10),PA(ru,10),PA(yc,10),PA(It,8),PA(rB,8))};static \u0275dir=jA({type:t,selectors:[["","ngModel","",3,"formControlName","",3,"formControl",""]],inputs:{name:"name",isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"],options:[0,"ngModelOptions","options"]},outputs:{update:"ngModelChange"},exportAs:["ngModel"],standalone:!1,features:[ht([jEA]),lt,ti]})}return t})();var kz=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["form",3,"ngNoForm","",3,"ngNativeValidate",""]],hostAttrs:["novalidate",""],standalone:!1})}return t})();var yM=new dA(""),qEA={provide:Ac,useExisting:Ir(()=>vM)},vM=(()=>{class t extends Ac{_ngModelWarningConfig;callSetDisabledState;viewModel;form;set isDisabled(A){}model;update=new WA;static _ngModelWarningSentOnce=!1;_ngModelWarningSent=!1;constructor(A,i,n,o,r){super(),this._ngModelWarningConfig=o,this.callSetDisabledState=r,this._setValidators(A),this._setAsyncValidators(i),this.valueAccessor=DM(this,n)}ngOnChanges(A){if(this._isControlChanged(A)){let i=A.form.previousValue;i&&l6(i,this,!1),ou(this.form,this,this.callSetDisabledState),this.form.updateValueAndValidity({emitEvent:!1})}wM(A,this.viewModel)&&(this.form.setValue(this.model),this.viewModel=this.model)}ngOnDestroy(){this.form&&l6(this.form,this,!1)}get path(){return[]}get control(){return this.form}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}_isControlChanged(A){return A.hasOwnProperty("form")}static \u0275fac=function(i){return new(i||t)(PA(w0,10),PA(ru,10),PA(yc,10),PA(yM,8),PA(rB,8))};static \u0275dir=jA({type:t,selectors:[["","formControl",""]],inputs:{form:[0,"formControl","form"],isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"]},outputs:{update:"ngModelChange"},exportAs:["ngForm"],standalone:!1,features:[ht([qEA]),lt,ti]})}return t})(),VEA={provide:p0,useExisting:Ir(()=>GI)},GI=(()=>{class t extends p0{callSetDisabledState;get submitted(){return Ba(this._submittedReactive)}set submitted(A){this._submittedReactive.set(A)}_submitted=h0(()=>this._submittedReactive());_submittedReactive=Jo(!1);_oldForm;_onCollectionChange=()=>this._updateDomValue();directives=[];form=null;ngSubmit=new WA;constructor(A,i,n){super(),this.callSetDisabledState=n,this._setValidators(A),this._setAsyncValidators(i)}ngOnChanges(A){A.hasOwnProperty("form")&&(this._updateValidators(),this._updateDomValue(),this._updateRegistrations(),this._oldForm=this.form)}ngOnDestroy(){this.form&&(I6(this.form,this),this.form._onCollectionChange===this._onCollectionChange&&this.form._registerOnCollectionChange(()=>{}))}get formDirective(){return this}get control(){return this.form}get path(){return[]}addControl(A){let i=this.form.get(A.path);return ou(i,A,this.callSetDisabledState),i.updateValueAndValidity({emitEvent:!1}),this.directives.push(A),i}getControl(A){return this.form.get(A.path)}removeControl(A){l6(A.control||null,A,!1),zEA(this.directives,A)}addFormGroup(A){this._setUpFormContainer(A)}removeFormGroup(A){this._cleanUpFormContainer(A)}getFormGroup(A){return this.form.get(A.path)}addFormArray(A){this._setUpFormContainer(A)}removeFormArray(A){this._cleanUpFormContainer(A)}getFormArray(A){return this.form.get(A.path)}updateModel(A,i){this.form.get(A.path).setValue(i)}onSubmit(A){return this._submittedReactive.set(!0),Mz(this.form,this.directives),this.ngSubmit.emit(A),this.form._events.next(new a6(this.control)),A?.target?.method==="dialog"}onReset(){this.resetForm()}resetForm(A=void 0){this.form.reset(A),this._submittedReactive.set(!1),this.form._events.next(new c6(this.form))}_updateDomValue(){this.directives.forEach(A=>{let i=A.control,n=this.form.get(A.path);i!==n&&(l6(i||null,A),PEA(n)&&(ou(n,A,this.callSetDisabledState),A.control=n))}),this.form._updateTreeValidity({emitEvent:!1})}_setUpFormContainer(A){let i=this.form.get(A.path);bz(i,A),i.updateValueAndValidity({emitEvent:!1})}_cleanUpFormContainer(A){if(this.form){let i=this.form.get(A.path);i&&TEA(i,A)&&i.updateValueAndValidity({emitEvent:!1})}}_updateRegistrations(){this.form._registerOnCollectionChange(this._onCollectionChange),this._oldForm&&this._oldForm._registerOnCollectionChange(()=>{})}_updateValidators(){pM(this.form,this),this._oldForm&&I6(this._oldForm,this)}static \u0275fac=function(i){return new(i||t)(PA(w0,10),PA(ru,10),PA(rB,8))};static \u0275dir=jA({type:t,selectors:[["","formGroup",""]],hostBindings:function(i,n){i&1&&hA("submit",function(r){return n.onSubmit(r)})("reset",function(){return n.onReset()})},inputs:{form:[0,"formGroup","form"]},outputs:{ngSubmit:"ngSubmit"},exportAs:["ngForm"],standalone:!1,features:[ht([VEA]),lt,ti]})}return t})();var ZEA={provide:Ac,useExisting:Ir(()=>bM)},bM=(()=>{class t extends Ac{_ngModelWarningConfig;_added=!1;viewModel;control;name=null;set isDisabled(A){}model;update=new WA;static _ngModelWarningSentOnce=!1;_ngModelWarningSent=!1;constructor(A,i,n,o,r){super(),this._ngModelWarningConfig=r,this._parent=A,this._setValidators(i),this._setAsyncValidators(n),this.valueAccessor=DM(this,o)}ngOnChanges(A){this._added||this._setUpControl(),wM(A,this.viewModel)&&(this.viewModel=this.model,this.formDirective.updateModel(this,this.model))}ngOnDestroy(){this.formDirective&&this.formDirective.removeControl(this)}viewToModelUpdate(A){this.viewModel=A,this.update.emit(A)}get path(){return yz(this.name==null?this.name:this.name.toString(),this._parent)}get formDirective(){return this._parent?this._parent.formDirective:null}_setUpControl(){this.control=this.formDirective.addControl(this),this._added=!0}static \u0275fac=function(i){return new(i||t)(PA(p0,13),PA(w0,10),PA(ru,10),PA(yc,10),PA(yM,8))};static \u0275dir=jA({type:t,selectors:[["","formControlName",""]],inputs:{name:[0,"formControlName","name"],isDisabled:[0,"disabled","isDisabled"],model:[0,"ngModel","model"]},outputs:{update:"ngModelChange"},standalone:!1,features:[ht([ZEA]),lt,ti]})}return t})();var Sz=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({})}return t})(),BM=class extends nB{constructor(e,A,i){super(fM(A),mM(i,A)),this.controls=e,this._initObservables(),this._setUpdateStrategy(A),this._setUpControls(),this.updateValueAndValidity({onlySelf:!0,emitEvent:!!this.asyncValidator})}controls;at(e){return this.controls[this._adjustIndex(e)]}push(e,A={}){this.controls.push(e),this._registerControl(e),this.updateValueAndValidity({emitEvent:A.emitEvent}),this._onCollectionChange()}insert(e,A,i={}){this.controls.splice(e,0,A),this._registerControl(A),this.updateValueAndValidity({emitEvent:i.emitEvent})}removeAt(e,A={}){let i=this._adjustIndex(e);i<0&&(i=0),this.controls[i]&&this.controls[i]._registerOnCollectionChange(()=>{}),this.controls.splice(i,1),this.updateValueAndValidity({emitEvent:A.emitEvent})}setControl(e,A,i={}){let n=this._adjustIndex(e);n<0&&(n=0),this.controls[n]&&this.controls[n]._registerOnCollectionChange(()=>{}),this.controls.splice(n,1),A&&(this.controls.splice(n,0,A),this._registerControl(A)),this.updateValueAndValidity({emitEvent:i.emitEvent}),this._onCollectionChange()}get length(){return this.controls.length}setValue(e,A={}){Dz(this,!1,e),e.forEach((i,n)=>{wz(this,!1,n),this.at(n).setValue(i,{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A)}patchValue(e,A={}){e!=null&&(e.forEach((i,n)=>{this.at(n)&&this.at(n).patchValue(i,{onlySelf:!0,emitEvent:A.emitEvent})}),this.updateValueAndValidity(A))}reset(e=[],A={}){this._forEachChild((i,n)=>{i.reset(e[n],{onlySelf:!0,emitEvent:A.emitEvent})}),this._updatePristine(A,this),this._updateTouched(A,this),this.updateValueAndValidity(A)}getRawValue(){return this.controls.map(e=>e.getRawValue())}clear(e={}){this.controls.length<1||(this._forEachChild(A=>A._registerOnCollectionChange(()=>{})),this.controls.splice(0),this.updateValueAndValidity({emitEvent:e.emitEvent}))}_adjustIndex(e){return e<0?e+this.length:e}_syncPendingControls(){let e=this.controls.reduce((A,i)=>i._syncPendingControls()?!0:A,!1);return e&&this.updateValueAndValidity({onlySelf:!0}),e}_forEachChild(e){this.controls.forEach((A,i)=>{e(A,i)})}_updateValue(){this.value=this.controls.filter(e=>e.enabled||this.disabled).map(e=>e.value)}_anyControls(e){return this.controls.some(A=>A.enabled&&e(A))}_setUpControls(){this._forEachChild(e=>this._registerControl(e))}_allControlsDisabled(){for(let e of this.controls)if(e.enabled)return!1;return this.controls.length>0||this.disabled}_registerControl(e){e.setParent(this),e._registerOnCollectionChange(this._onCollectionChange)}_find(e){return this.at(e)??null}};function lz(t){return!!t&&(t.asyncValidators!==void 0||t.validators!==void 0||t.updateOn!==void 0)}var Rz=(()=>{class t{useNonNullable=!1;get nonNullable(){let A=new t;return A.useNonNullable=!0,A}group(A,i=null){let n=this._reduceControls(A),o={};return lz(i)?o=i:i!==null&&(o.validators=i.validator,o.asyncValidators=i.asyncValidator),new oB(n,o)}record(A,i=null){let n=this._reduceControls(A);return new dM(n,i)}control(A,i,n){let o={};return this.useNonNullable?(lz(i)?o=i:(o.validators=i,o.asyncValidators=n),new _I(A,Ye(rA({},o),{nonNullable:!0}))):new _I(A,i,n)}array(A,i,n){let o=A.map(r=>this._createControl(r));return new BM(o,i,n)}_reduceControls(A){let i={};return Object.keys(A).forEach(n=>{i[n]=this._createControl(A[n])}),i}_createControl(A){if(A instanceof _I)return A;if(A instanceof nB)return A;if(Array.isArray(A)){let i=A[0],n=A.length>1?A[1]:null,o=A.length>2?A[2]:null;return this.control(i,n,o)}else return this.control(A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var B6=(()=>{class t{static withConfig(A){return{ngModule:t,providers:[{provide:rB,useValue:A.callSetDisabledState??d6}]}}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[Sz]})}return t})(),xz=(()=>{class t{static withConfig(A){return{ngModule:t,providers:[{provide:yM,useValue:A.warnOnNgModelWithFormControl??"always"},{provide:rB,useValue:A.callSetDisabledState??d6}]}}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[Sz]})}return t})();var Li="primary",fu=Symbol("RouteTitle"),xM=class{params;constructor(e){this.params=e||{}}has(e){return Object.prototype.hasOwnProperty.call(this.params,e)}get(e){if(this.has(e)){let A=this.params[e];return Array.isArray(A)?A[0]:A}return null}getAll(e){if(this.has(e)){let A=this.params[e];return Array.isArray(A)?A:[A]}return[]}get keys(){return Object.keys(this.params)}};function JI(t){return new xM(t)}function Yz(t,e,A){let i=A.path.split("/");if(i.length>t.length||A.pathMatch==="full"&&(e.hasChildren()||i.lengthi[o]===n)}else return t===e}function Tz(t){return t.length>0?t[t.length-1]:null}function N2(t){return I2(t)?t:D2(t)?oo(Promise.resolve(t)):Me(t)}var XEA={exact:zz,subset:Oz},Hz={exact:$EA,subset:AQA,ignored:()=>!0};function Lz(t,e,A){return XEA[A.paths](t.root,e.root,A.matrixParams)&&Hz[A.queryParams](t.queryParams,e.queryParams)&&!(A.fragment==="exact"&&t.fragment!==e.fragment)}function $EA(t,e){return ag(t,e)}function zz(t,e,A){if(!KI(t.segments,e.segments)||!h6(t.segments,e.segments,A)||t.numberOfChildren!==e.numberOfChildren)return!1;for(let i in e.children)if(!t.children[i]||!zz(t.children[i],e.children[i],A))return!1;return!0}function AQA(t,e){return Object.keys(e).length<=Object.keys(t).length&&Object.keys(e).every(A=>Jz(t[A],e[A]))}function Oz(t,e,A){return Pz(t,e,e.segments,A)}function Pz(t,e,A,i){if(t.segments.length>A.length){let n=t.segments.slice(0,A.length);return!(!KI(n,A)||e.hasChildren()||!h6(n,A,i))}else if(t.segments.length===A.length){if(!KI(t.segments,A)||!h6(t.segments,A,i))return!1;for(let n in e.children)if(!t.children[n]||!Oz(t.children[n],e.children[n],i))return!1;return!0}else{let n=A.slice(0,t.segments.length),o=A.slice(t.segments.length);return!KI(t.segments,n)||!h6(t.segments,n,i)||!t.children[Li]?!1:Pz(t.children[Li],e,o,i)}}function h6(t,e,A){return e.every((i,n)=>Hz[A](t[n].parameters,i.parameters))}var lg=class{root;queryParams;fragment;_queryParamMap;constructor(e=new _n([],{}),A={},i=null){this.root=e,this.queryParams=A,this.fragment=i}get queryParamMap(){return this._queryParamMap??=JI(this.queryParams),this._queryParamMap}toString(){return iQA.serialize(this)}},_n=class{segments;children;parent=null;constructor(e,A){this.segments=e,this.children=A,Object.values(A).forEach(i=>i.parent=this)}hasChildren(){return this.numberOfChildren>0}get numberOfChildren(){return Object.keys(this.children).length}toString(){return u6(this)}},x2=class{path;parameters;_parameterMap;constructor(e,A){this.path=e,this.parameters=A}get parameterMap(){return this._parameterMap??=JI(this.parameters),this._parameterMap}toString(){return qz(this)}};function eQA(t,e){return KI(t,e)&&t.every((A,i)=>ag(A.parameters,e[i].parameters))}function KI(t,e){return t.length!==e.length?!1:t.every((A,i)=>A.path===e[i].path)}function tQA(t,e){let A=[];return Object.entries(t.children).forEach(([i,n])=>{i===Li&&(A=A.concat(e(n,i)))}),Object.entries(t.children).forEach(([i,n])=>{i!==Li&&(A=A.concat(e(n,i)))}),A}var TI=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:()=>new L2,providedIn:"root"})}return t})(),L2=class{parse(e){let A=new NM(e);return new lg(A.parseRootSegment(),A.parseQueryParams(),A.parseFragment())}serialize(e){let A=`/${au(e.root,!0)}`,i=rQA(e.queryParams),n=typeof e.fragment=="string"?`#${nQA(e.fragment)}`:"";return`${A}${i}${n}`}},iQA=new L2;function u6(t){return t.segments.map(e=>qz(e)).join("/")}function au(t,e){if(!t.hasChildren())return u6(t);if(e){let A=t.children[Li]?au(t.children[Li],!1):"",i=[];return Object.entries(t.children).forEach(([n,o])=>{n!==Li&&i.push(`${n}:${au(o,!1)}`)}),i.length>0?`${A}(${i.join("//")})`:A}else{let A=tQA(t,(i,n)=>n===Li?[au(t.children[Li],!1)]:[`${n}:${au(i,!1)}`]);return Object.keys(t.children).length===1&&t.children[Li]!=null?`${u6(t)}/${A[0]}`:`${u6(t)}/(${A.join("//")})`}}function jz(t){return encodeURIComponent(t).replace(/%40/g,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",")}function E6(t){return jz(t).replace(/%3B/gi,";")}function nQA(t){return encodeURI(t)}function FM(t){return jz(t).replace(/\(/g,"%28").replace(/\)/g,"%29").replace(/%26/gi,"&")}function f6(t){return decodeURIComponent(t)}function Fz(t){return f6(t.replace(/\+/g,"%20"))}function qz(t){return`${FM(t.path)}${oQA(t.parameters)}`}function oQA(t){return Object.entries(t).map(([e,A])=>`;${FM(e)}=${FM(A)}`).join("")}function rQA(t){let e=Object.entries(t).map(([A,i])=>Array.isArray(i)?i.map(n=>`${E6(A)}=${E6(n)}`).join("&"):`${E6(A)}=${E6(i)}`).filter(A=>A);return e.length?`?${e.join("&")}`:""}var sQA=/^[^\/()?;#]+/;function MM(t){let e=t.match(sQA);return e?e[0]:""}var aQA=/^[^\/()?;=#]+/;function cQA(t){let e=t.match(aQA);return e?e[0]:""}var lQA=/^[^=?&#]+/;function gQA(t){let e=t.match(lQA);return e?e[0]:""}var IQA=/^[^&#]+/;function CQA(t){let e=t.match(IQA);return e?e[0]:""}var NM=class{url;remaining;constructor(e){this.url=e,this.remaining=e}parseRootSegment(){return this.consumeOptional("/"),this.remaining===""||this.peekStartsWith("?")||this.peekStartsWith("#")?new _n([],{}):new _n([],this.parseChildren())}parseQueryParams(){let e={};if(this.consumeOptional("?"))do this.parseQueryParam(e);while(this.consumeOptional("&"));return e}parseFragment(){return this.consumeOptional("#")?decodeURIComponent(this.remaining):null}parseChildren(){if(this.remaining==="")return{};this.consumeOptional("/");let e=[];for(this.peekStartsWith("(")||e.push(this.parseSegment());this.peekStartsWith("/")&&!this.peekStartsWith("//")&&!this.peekStartsWith("/(");)this.capture("/"),e.push(this.parseSegment());let A={};this.peekStartsWith("/(")&&(this.capture("/"),A=this.parseParens(!0));let i={};return this.peekStartsWith("(")&&(i=this.parseParens(!1)),(e.length>0||Object.keys(A).length>0)&&(i[Li]=new _n(e,A)),i}parseSegment(){let e=MM(this.remaining);if(e===""&&this.peekStartsWith(";"))throw new Ae(4009,!1);return this.capture(e),new x2(f6(e),this.parseMatrixParams())}parseMatrixParams(){let e={};for(;this.consumeOptional(";");)this.parseParam(e);return e}parseParam(e){let A=cQA(this.remaining);if(!A)return;this.capture(A);let i="";if(this.consumeOptional("=")){let n=MM(this.remaining);n&&(i=n,this.capture(i))}e[f6(A)]=f6(i)}parseQueryParam(e){let A=gQA(this.remaining);if(!A)return;this.capture(A);let i="";if(this.consumeOptional("=")){let r=CQA(this.remaining);r&&(i=r,this.capture(i))}let n=Fz(A),o=Fz(i);if(e.hasOwnProperty(n)){let r=e[n];Array.isArray(r)||(r=[r],e[n]=r),r.push(o)}else e[n]=o}parseParens(e){let A={};for(this.capture("(");!this.consumeOptional(")")&&this.remaining.length>0;){let i=MM(this.remaining),n=this.remaining[i.length];if(n!=="/"&&n!==")"&&n!==";")throw new Ae(4010,!1);let o;i.indexOf(":")>-1?(o=i.slice(0,i.indexOf(":")),this.capture(o),this.capture(":")):e&&(o=Li);let r=this.parseChildren();A[o]=Object.keys(r).length===1?r[Li]:new _n([],r),this.consumeOptional("//")}return A}peekStartsWith(e){return this.remaining.startsWith(e)}consumeOptional(e){return this.peekStartsWith(e)?(this.remaining=this.remaining.substring(e.length),!0):!1}capture(e){if(!this.consumeOptional(e))throw new Ae(4011,!1)}};function Vz(t){return t.segments.length>0?new _n([],{[Li]:t}):t}function Zz(t){let e={};for(let[i,n]of Object.entries(t.children)){let o=Zz(n);if(i===Li&&o.segments.length===0&&o.hasChildren())for(let[r,s]of Object.entries(o.children))e[r]=s;else(o.segments.length>0||o.hasChildren())&&(e[i]=o)}let A=new _n(t.segments,e);return dQA(A)}function dQA(t){if(t.numberOfChildren===1&&t.children[Li]){let e=t.children[Li];return new _n(t.segments.concat(e.segments),e.children)}return t}function gB(t){return t instanceof lg}function Wz(t,e,A=null,i=null){let n=Xz(t);return $z(n,e,A,i)}function Xz(t){let e;function A(o){let r={};for(let a of o.children){let c=A(a);r[a.outlet]=c}let s=new _n(o.url,r);return o===t&&(e=s),s}let i=A(t.root),n=Vz(i);return e??n}function $z(t,e,A,i){let n=t;for(;n.parent;)n=n.parent;if(e.length===0)return kM(n,n,n,A,i);let o=BQA(e);if(o.toRoot())return kM(n,n,new _n([],{}),A,i);let r=EQA(o,n,t),s=r.processChildren?lu(r.segmentGroup,r.index,o.commands):eO(r.segmentGroup,r.index,o.commands);return kM(n,r.segmentGroup,s,A,i)}function p6(t){return typeof t=="object"&&t!=null&&!t.outlets&&!t.segmentPath}function Iu(t){return typeof t=="object"&&t!=null&&t.outlets}function kM(t,e,A,i,n){let o={};i&&Object.entries(i).forEach(([a,c])=>{o[a]=Array.isArray(c)?c.map(l=>`${l}`):`${c}`});let r;t===e?r=A:r=AO(t,e,A);let s=Vz(Zz(r));return new lg(s,o,n)}function AO(t,e,A){let i={};return Object.entries(t.children).forEach(([n,o])=>{o===e?i[n]=A:i[n]=AO(o,e,A)}),new _n(t.segments,i)}var w6=class{isAbsolute;numberOfDoubleDots;commands;constructor(e,A,i){if(this.isAbsolute=e,this.numberOfDoubleDots=A,this.commands=i,e&&i.length>0&&p6(i[0]))throw new Ae(4003,!1);let n=i.find(Iu);if(n&&n!==Tz(i))throw new Ae(4004,!1)}toRoot(){return this.isAbsolute&&this.commands.length===1&&this.commands[0]=="/"}};function BQA(t){if(typeof t[0]=="string"&&t.length===1&&t[0]==="/")return new w6(!0,0,t);let e=0,A=!1,i=t.reduce((n,o,r)=>{if(typeof o=="object"&&o!=null){if(o.outlets){let s={};return Object.entries(o.outlets).forEach(([a,c])=>{s[a]=typeof c=="string"?c.split("/"):c}),[...n,{outlets:s}]}if(o.segmentPath)return[...n,o.segmentPath]}return typeof o!="string"?[...n,o]:r===0?(o.split("/").forEach((s,a)=>{a==0&&s==="."||(a==0&&s===""?A=!0:s===".."?e++:s!=""&&n.push(s))}),n):[...n,o]},[]);return new w6(A,e,i)}var cB=class{segmentGroup;processChildren;index;constructor(e,A,i){this.segmentGroup=e,this.processChildren=A,this.index=i}};function EQA(t,e,A){if(t.isAbsolute)return new cB(e,!0,0);if(!A)return new cB(e,!1,NaN);if(A.parent===null)return new cB(A,!0,0);let i=p6(t.commands[0])?0:1,n=A.segments.length-1+i;return QQA(A,n,t.numberOfDoubleDots)}function QQA(t,e,A){let i=t,n=e,o=A;for(;o>n;){if(o-=n,i=i.parent,!i)throw new Ae(4005,!1);n=i.segments.length}return new cB(i,!1,n-o)}function hQA(t){return Iu(t[0])?t[0].outlets:{[Li]:t}}function eO(t,e,A){if(t??=new _n([],{}),t.segments.length===0&&t.hasChildren())return lu(t,e,A);let i=uQA(t,e,A),n=A.slice(i.commandIndex);if(i.match&&i.pathIndexo!==Li)&&t.children[Li]&&t.numberOfChildren===1&&t.children[Li].segments.length===0){let o=lu(t.children[Li],e,A);return new _n(t.segments,o.children)}return Object.entries(i).forEach(([o,r])=>{typeof r=="string"&&(r=[r]),r!==null&&(n[o]=eO(t.children[o],e,r))}),Object.entries(t.children).forEach(([o,r])=>{i[o]===void 0&&(n[o]=r)}),new _n(t.segments,n)}}function uQA(t,e,A){let i=0,n=e,o={match:!1,pathIndex:0,commandIndex:0};for(;n=A.length)return o;let r=t.segments[n],s=A[i];if(Iu(s))break;let a=`${s}`,c=i0&&a===void 0)break;if(a&&c&&typeof c=="object"&&c.outlets===void 0){if(!_z(a,c,r))return o;i+=2}else{if(!_z(a,{},r))return o;i++}n++}return{match:!0,pathIndex:n,commandIndex:i}}function _M(t,e,A){let i=t.segments.slice(0,e),n=0;for(;n{typeof i=="string"&&(i=[i]),i!==null&&(e[A]=_M(new _n([],{}),0,i))}),e}function Nz(t){let e={};return Object.entries(t).forEach(([A,i])=>e[A]=`${i}`),e}function _z(t,e,A){return t==A.path&&ag(e,A.parameters)}var m6="imperative",Gr=function(t){return t[t.NavigationStart=0]="NavigationStart",t[t.NavigationEnd=1]="NavigationEnd",t[t.NavigationCancel=2]="NavigationCancel",t[t.NavigationError=3]="NavigationError",t[t.RoutesRecognized=4]="RoutesRecognized",t[t.ResolveStart=5]="ResolveStart",t[t.ResolveEnd=6]="ResolveEnd",t[t.GuardsCheckStart=7]="GuardsCheckStart",t[t.GuardsCheckEnd=8]="GuardsCheckEnd",t[t.RouteConfigLoadStart=9]="RouteConfigLoadStart",t[t.RouteConfigLoadEnd=10]="RouteConfigLoadEnd",t[t.ChildActivationStart=11]="ChildActivationStart",t[t.ChildActivationEnd=12]="ChildActivationEnd",t[t.ActivationStart=13]="ActivationStart",t[t.ActivationEnd=14]="ActivationEnd",t[t.Scroll=15]="Scroll",t[t.NavigationSkipped=16]="NavigationSkipped",t}(Gr||{}),ic=class{id;url;constructor(e,A){this.id=e,this.url=A}},F2=class extends ic{type=Gr.NavigationStart;navigationTrigger;restoredState;constructor(e,A,i="imperative",n=null){super(e,A),this.navigationTrigger=i,this.restoredState=n}toString(){return`NavigationStart(id: ${this.id}, url: '${this.url}')`}},nc=class extends ic{urlAfterRedirects;type=Gr.NavigationEnd;constructor(e,A,i){super(e,A),this.urlAfterRedirects=i}toString(){return`NavigationEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}')`}},Qa=function(t){return t[t.Redirect=0]="Redirect",t[t.SupersededByNewNavigation=1]="SupersededByNewNavigation",t[t.NoDataFromResolver=2]="NoDataFromResolver",t[t.GuardRejected=3]="GuardRejected",t}(Qa||{}),IB=function(t){return t[t.IgnoredSameUrlNavigation=0]="IgnoredSameUrlNavigation",t[t.IgnoredByUrlHandlingStrategy=1]="IgnoredByUrlHandlingStrategy",t}(IB||{}),cg=class extends ic{reason;code;type=Gr.NavigationCancel;constructor(e,A,i,n){super(e,A),this.reason=i,this.code=n}toString(){return`NavigationCancel(id: ${this.id}, url: '${this.url}')`}},gg=class extends ic{reason;code;type=Gr.NavigationSkipped;constructor(e,A,i,n){super(e,A),this.reason=i,this.code=n}},CB=class extends ic{error;target;type=Gr.NavigationError;constructor(e,A,i,n){super(e,A),this.error=i,this.target=n}toString(){return`NavigationError(id: ${this.id}, url: '${this.url}', error: ${this.error})`}},Cu=class extends ic{urlAfterRedirects;state;type=Gr.RoutesRecognized;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`RoutesRecognized(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},D6=class extends ic{urlAfterRedirects;state;type=Gr.GuardsCheckStart;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`GuardsCheckStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},y6=class extends ic{urlAfterRedirects;state;shouldActivate;type=Gr.GuardsCheckEnd;constructor(e,A,i,n,o){super(e,A),this.urlAfterRedirects=i,this.state=n,this.shouldActivate=o}toString(){return`GuardsCheckEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state}, shouldActivate: ${this.shouldActivate})`}},v6=class extends ic{urlAfterRedirects;state;type=Gr.ResolveStart;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`ResolveStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},b6=class extends ic{urlAfterRedirects;state;type=Gr.ResolveEnd;constructor(e,A,i,n){super(e,A),this.urlAfterRedirects=i,this.state=n}toString(){return`ResolveEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`}},M6=class{route;type=Gr.RouteConfigLoadStart;constructor(e){this.route=e}toString(){return`RouteConfigLoadStart(path: ${this.route.path})`}},k6=class{route;type=Gr.RouteConfigLoadEnd;constructor(e){this.route=e}toString(){return`RouteConfigLoadEnd(path: ${this.route.path})`}},S6=class{snapshot;type=Gr.ChildActivationStart;constructor(e){this.snapshot=e}toString(){return`ChildActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},R6=class{snapshot;type=Gr.ChildActivationEnd;constructor(e){this.snapshot=e}toString(){return`ChildActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},x6=class{snapshot;type=Gr.ActivationStart;constructor(e){this.snapshot=e}toString(){return`ActivationStart(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},L6=class{snapshot;type=Gr.ActivationEnd;constructor(e){this.snapshot=e}toString(){return`ActivationEnd(path: '${this.snapshot.routeConfig&&this.snapshot.routeConfig.path||""}')`}},dB=class{routerEvent;position;anchor;type=Gr.Scroll;constructor(e,A,i){this.routerEvent=e,this.position=A,this.anchor=i}toString(){let e=this.position?`${this.position[0]}, ${this.position[1]}`:null;return`Scroll(anchor: '${this.anchor}', position: '${e}')`}},du=class{},BB=class{url;navigationBehaviorOptions;constructor(e,A){this.url=e,this.navigationBehaviorOptions=A}};function mQA(t,e){return t.providers&&!t._injector&&(t._injector=Rh(t.providers,e,`Route: ${t.path}`)),t._injector??e}function ll(t){return t.outlet||Li}function pQA(t,e){let A=t.filter(i=>ll(i)===e);return A.push(...t.filter(i=>ll(i)!==e)),A}function mu(t){if(!t)return null;if(t.routeConfig?._injector)return t.routeConfig._injector;for(let e=t.parent;e;e=e.parent){let A=e.routeConfig;if(A?._loadedInjector)return A._loadedInjector;if(A?._injector)return A._injector}return null}var F6=class{rootInjector;outlet=null;route=null;children;attachRef=null;get injector(){return mu(this.route?.snapshot)??this.rootInjector}constructor(e){this.rootInjector=e,this.children=new HI(this.rootInjector)}},HI=(()=>{class t{rootInjector;contexts=new Map;constructor(A){this.rootInjector=A}onChildOutletCreated(A,i){let n=this.getOrCreateContext(A);n.outlet=i,this.contexts.set(A,n)}onChildOutletDestroyed(A){let i=this.getContext(A);i&&(i.outlet=null,i.attachRef=null)}onOutletDeactivated(){let A=this.contexts;return this.contexts=new Map,A}onOutletReAttached(A){this.contexts=A}getOrCreateContext(A){let i=this.getContext(A);return i||(i=new F6(this.rootInjector),this.contexts.set(A,i)),i}getContext(A){return this.contexts.get(A)||null}static \u0275fac=function(i){return new(i||t)(we(pr))};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),N6=class{_root;constructor(e){this._root=e}get root(){return this._root.value}parent(e){let A=this.pathFromRoot(e);return A.length>1?A[A.length-2]:null}children(e){let A=GM(e,this._root);return A?A.children.map(i=>i.value):[]}firstChild(e){let A=GM(e,this._root);return A&&A.children.length>0?A.children[0].value:null}siblings(e){let A=UM(e,this._root);return A.length<2?[]:A[A.length-2].children.map(n=>n.value).filter(n=>n!==e)}pathFromRoot(e){return UM(e,this._root).map(A=>A.value)}};function GM(t,e){if(t===e.value)return e;for(let A of e.children){let i=GM(t,A);if(i)return i}return null}function UM(t,e){if(t===e.value)return[e];for(let A of e.children){let i=UM(t,A);if(i.length)return i.unshift(e),i}return[]}var tc=class{value;children;constructor(e,A){this.value=e,this.children=A}toString(){return`TreeNode(${this.value})`}};function aB(t){let e={};return t&&t.children.forEach(A=>e[A.value.outlet]=A),e}var Bu=class extends N6{snapshot;constructor(e,A){super(e),this.snapshot=A,PM(this,e)}toString(){return this.snapshot.toString()}};function tO(t){let e=wQA(t),A=new Mi([new x2("",{})]),i=new Mi({}),n=new Mi({}),o=new Mi({}),r=new Mi(""),s=new ha(A,i,o,r,n,Li,t,e.root);return s.snapshot=e.root,new Bu(new tc(s,[]),e)}function wQA(t){let e={},A={},i={},n="",o=new YI([],e,i,n,A,Li,t,null,{});return new Eu("",new tc(o,[]))}var ha=class{urlSubject;paramsSubject;queryParamsSubject;fragmentSubject;dataSubject;outlet;component;snapshot;_futureSnapshot;_routerState;_paramMap;_queryParamMap;title;url;params;queryParams;fragment;data;constructor(e,A,i,n,o,r,s,a){this.urlSubject=e,this.paramsSubject=A,this.queryParamsSubject=i,this.fragmentSubject=n,this.dataSubject=o,this.outlet=r,this.component=s,this._futureSnapshot=a,this.title=this.dataSubject?.pipe(je(c=>c[fu]))??Me(void 0),this.url=e,this.params=A,this.queryParams=i,this.fragment=n,this.data=o}get routeConfig(){return this._futureSnapshot.routeConfig}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=this.params.pipe(je(e=>JI(e))),this._paramMap}get queryParamMap(){return this._queryParamMap??=this.queryParams.pipe(je(e=>JI(e))),this._queryParamMap}toString(){return this.snapshot?this.snapshot.toString():`Future(${this._futureSnapshot})`}};function _6(t,e,A="emptyOnly"){let i,{routeConfig:n}=t;return e!==null&&(A==="always"||n?.path===""||!e.component&&!e.routeConfig?.loadComponent)?i={params:rA(rA({},e.params),t.params),data:rA(rA({},e.data),t.data),resolve:rA(rA(rA(rA({},t.data),e.data),n?.data),t._resolvedData)}:i={params:rA({},t.params),data:rA({},t.data),resolve:rA(rA({},t.data),t._resolvedData??{})},n&&nO(n)&&(i.resolve[fu]=n.title),i}var YI=class{url;params;queryParams;fragment;data;outlet;component;routeConfig;_resolve;_resolvedData;_routerState;_paramMap;_queryParamMap;get title(){return this.data?.[fu]}constructor(e,A,i,n,o,r,s,a,c){this.url=e,this.params=A,this.queryParams=i,this.fragment=n,this.data=o,this.outlet=r,this.component=s,this.routeConfig=a,this._resolve=c}get root(){return this._routerState.root}get parent(){return this._routerState.parent(this)}get firstChild(){return this._routerState.firstChild(this)}get children(){return this._routerState.children(this)}get pathFromRoot(){return this._routerState.pathFromRoot(this)}get paramMap(){return this._paramMap??=JI(this.params),this._paramMap}get queryParamMap(){return this._queryParamMap??=JI(this.queryParams),this._queryParamMap}toString(){let e=this.url.map(i=>i.toString()).join("/"),A=this.routeConfig?this.routeConfig.path:"";return`Route(url:'${e}', path:'${A}')`}},Eu=class extends N6{url;constructor(e,A){super(A),this.url=e,PM(this,A)}toString(){return iO(this._root)}};function PM(t,e){e.value._routerState=t,e.children.forEach(A=>PM(t,A))}function iO(t){let e=t.children.length>0?` { ${t.children.map(iO).join(", ")} } `:"";return`${t.value}${e}`}function SM(t){if(t.snapshot){let e=t.snapshot,A=t._futureSnapshot;t.snapshot=A,ag(e.queryParams,A.queryParams)||t.queryParamsSubject.next(A.queryParams),e.fragment!==A.fragment&&t.fragmentSubject.next(A.fragment),ag(e.params,A.params)||t.paramsSubject.next(A.params),WEA(e.url,A.url)||t.urlSubject.next(A.url),ag(e.data,A.data)||t.dataSubject.next(A.data)}else t.snapshot=t._futureSnapshot,t.dataSubject.next(t._futureSnapshot.data)}function KM(t,e){let A=ag(t.params,e.params)&&eQA(t.url,e.url),i=!t.parent!=!e.parent;return A&&!i&&(!t.parent||KM(t.parent,e.parent))}function nO(t){return typeof t.title=="string"||t.title===null}var oO=new dA(""),jM=(()=>{class t{activated=null;get activatedComponentRef(){return this.activated}_activatedRoute=null;name=Li;activateEvents=new WA;deactivateEvents=new WA;attachEvents=new WA;detachEvents=new WA;routerOutletData=wJ(void 0);parentContexts=f(HI);location=f(Nn);changeDetector=f(It);inputBinder=f(pu,{optional:!0});supportsBindingToComponentInputs=!0;ngOnChanges(A){if(A.name){let{firstChange:i,previousValue:n}=A.name;if(i)return;this.isTrackedInParentContexts(n)&&(this.deactivate(),this.parentContexts.onChildOutletDestroyed(n)),this.initializeOutletWithName()}}ngOnDestroy(){this.isTrackedInParentContexts(this.name)&&this.parentContexts.onChildOutletDestroyed(this.name),this.inputBinder?.unsubscribeFromRouteData(this)}isTrackedInParentContexts(A){return this.parentContexts.getContext(A)?.outlet===this}ngOnInit(){this.initializeOutletWithName()}initializeOutletWithName(){if(this.parentContexts.onChildOutletCreated(this.name,this),this.activated)return;let A=this.parentContexts.getContext(this.name);A?.route&&(A.attachRef?this.attach(A.attachRef,A.route):this.activateWith(A.route,A.injector))}get isActivated(){return!!this.activated}get component(){if(!this.activated)throw new Ae(4012,!1);return this.activated.instance}get activatedRoute(){if(!this.activated)throw new Ae(4012,!1);return this._activatedRoute}get activatedRouteData(){return this._activatedRoute?this._activatedRoute.snapshot.data:{}}detach(){if(!this.activated)throw new Ae(4012,!1);this.location.detach();let A=this.activated;return this.activated=null,this._activatedRoute=null,this.detachEvents.emit(A.instance),A}attach(A,i){this.activated=A,this._activatedRoute=i,this.location.insert(A.hostView),this.inputBinder?.bindActivatedRouteToOutletComponent(this),this.attachEvents.emit(A.instance)}deactivate(){if(this.activated){let A=this.component;this.activated.destroy(),this.activated=null,this._activatedRoute=null,this.deactivateEvents.emit(A)}}activateWith(A,i){if(this.isActivated)throw new Ae(4013,!1);this._activatedRoute=A;let n=this.location,r=A.snapshot.component,s=this.parentContexts.getOrCreateContext(this.name).children,a=new YM(A,s,n.injector,this.routerOutletData);this.activated=n.createComponent(r,{index:n.length,injector:a,environmentInjector:i}),this.changeDetector.markForCheck(),this.inputBinder?.bindActivatedRouteToOutletComponent(this),this.activateEvents.emit(this.activated.instance)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["router-outlet"]],inputs:{name:"name",routerOutletData:[1,"routerOutletData"]},outputs:{activateEvents:"activate",deactivateEvents:"deactivate",attachEvents:"attach",detachEvents:"detach"},exportAs:["outlet"],features:[ti]})}return t})(),YM=class{route;childContexts;parent;outletData;constructor(e,A,i,n){this.route=e,this.childContexts=A,this.parent=i,this.outletData=n}get(e,A){return e===ha?this.route:e===HI?this.childContexts:e===oO?this.outletData:this.parent.get(e,A)}},pu=new dA(""),qM=(()=>{class t{outletDataSubscriptions=new Map;bindActivatedRouteToOutletComponent(A){this.unsubscribeFromRouteData(A),this.subscribeToRouteData(A)}unsubscribeFromRouteData(A){this.outletDataSubscriptions.get(A)?.unsubscribe(),this.outletDataSubscriptions.delete(A)}subscribeToRouteData(A){let{activatedRoute:i}=A,n=Js([i.queryParams,i.params,i.data]).pipe(jn(([o,r,s],a)=>(s=rA(rA(rA({},o),r),s),a===0?Me(s):Promise.resolve(s)))).subscribe(o=>{if(!A.isActivated||!A.activatedComponentRef||A.activatedRoute!==i||i.component===null){this.unsubscribeFromRouteData(A);return}let r=pH(i.component);if(!r){this.unsubscribeFromRouteData(A);return}for(let{templateName:s}of r.inputs)A.activatedComponentRef.setInput(s,o[s])});this.outletDataSubscriptions.set(A,n)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac})}return t})(),VM=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["ng-component"]],exportAs:["emptyRouterOutlet"],decls:1,vars:0,template:function(i,n){i&1&&JA(0,"router-outlet")},dependencies:[jM],encapsulation:2})}return t})();function ZM(t){let e=t.children&&t.children.map(ZM),A=e?Ye(rA({},t),{children:e}):rA({},t);return!A.component&&!A.loadComponent&&(e||A.loadChildren)&&A.outlet&&A.outlet!==Li&&(A.component=VM),A}function DQA(t,e,A){let i=Qu(t,e._root,A?A._root:void 0);return new Bu(i,e)}function Qu(t,e,A){if(A&&t.shouldReuseRoute(e.value,A.value.snapshot)){let i=A.value;i._futureSnapshot=e.value;let n=yQA(t,e,A);return new tc(i,n)}else{if(t.shouldAttach(e.value)){let o=t.retrieve(e.value);if(o!==null){let r=o.route;return r.value._futureSnapshot=e.value,r.children=e.children.map(s=>Qu(t,s)),r}}let i=vQA(e.value),n=e.children.map(o=>Qu(t,o));return new tc(i,n)}}function yQA(t,e,A){return e.children.map(i=>{for(let n of A.children)if(t.shouldReuseRoute(i.value,n.value.snapshot))return Qu(t,i,n);return Qu(t,i)})}function vQA(t){return new ha(new Mi(t.url),new Mi(t.params),new Mi(t.queryParams),new Mi(t.fragment),new Mi(t.data),t.outlet,t.component,t)}var EB=class{redirectTo;navigationBehaviorOptions;constructor(e,A){this.redirectTo=e,this.navigationBehaviorOptions=A}},rO="ngNavigationCancelingError";function G6(t,e){let{redirectTo:A,navigationBehaviorOptions:i}=gB(e)?{redirectTo:e,navigationBehaviorOptions:void 0}:e,n=sO(!1,Qa.Redirect);return n.url=A,n.navigationBehaviorOptions=i,n}function sO(t,e){let A=new Error(`NavigationCancelingError: ${t||""}`);return A[rO]=!0,A.cancellationCode=e,A}function bQA(t){return aO(t)&&gB(t.url)}function aO(t){return!!t&&t[rO]}var MQA=(t,e,A,i)=>je(n=>(new JM(e,n.targetRouterState,n.currentRouterState,A,i).activate(t),n)),JM=class{routeReuseStrategy;futureState;currState;forwardEvent;inputBindingEnabled;constructor(e,A,i,n,o){this.routeReuseStrategy=e,this.futureState=A,this.currState=i,this.forwardEvent=n,this.inputBindingEnabled=o}activate(e){let A=this.futureState._root,i=this.currState?this.currState._root:null;this.deactivateChildRoutes(A,i,e),SM(this.futureState.root),this.activateChildRoutes(A,i,e)}deactivateChildRoutes(e,A,i){let n=aB(A);e.children.forEach(o=>{let r=o.value.outlet;this.deactivateRoutes(o,n[r],i),delete n[r]}),Object.values(n).forEach(o=>{this.deactivateRouteAndItsChildren(o,i)})}deactivateRoutes(e,A,i){let n=e.value,o=A?A.value:null;if(n===o)if(n.component){let r=i.getContext(n.outlet);r&&this.deactivateChildRoutes(e,A,r.children)}else this.deactivateChildRoutes(e,A,i);else o&&this.deactivateRouteAndItsChildren(A,i)}deactivateRouteAndItsChildren(e,A){e.value.component&&this.routeReuseStrategy.shouldDetach(e.value.snapshot)?this.detachAndStoreRouteSubtree(e,A):this.deactivateRouteAndOutlet(e,A)}detachAndStoreRouteSubtree(e,A){let i=A.getContext(e.value.outlet),n=i&&e.value.component?i.children:A,o=aB(e);for(let r of Object.values(o))this.deactivateRouteAndItsChildren(r,n);if(i&&i.outlet){let r=i.outlet.detach(),s=i.children.onOutletDeactivated();this.routeReuseStrategy.store(e.value.snapshot,{componentRef:r,route:e,contexts:s})}}deactivateRouteAndOutlet(e,A){let i=A.getContext(e.value.outlet),n=i&&e.value.component?i.children:A,o=aB(e);for(let r of Object.values(o))this.deactivateRouteAndItsChildren(r,n);i&&(i.outlet&&(i.outlet.deactivate(),i.children.onOutletDeactivated()),i.attachRef=null,i.route=null)}activateChildRoutes(e,A,i){let n=aB(A);e.children.forEach(o=>{this.activateRoutes(o,n[o.value.outlet],i),this.forwardEvent(new L6(o.value.snapshot))}),e.children.length&&this.forwardEvent(new R6(e.value.snapshot))}activateRoutes(e,A,i){let n=e.value,o=A?A.value:null;if(SM(n),n===o)if(n.component){let r=i.getOrCreateContext(n.outlet);this.activateChildRoutes(e,A,r.children)}else this.activateChildRoutes(e,A,i);else if(n.component){let r=i.getOrCreateContext(n.outlet);if(this.routeReuseStrategy.shouldAttach(n.snapshot)){let s=this.routeReuseStrategy.retrieve(n.snapshot);this.routeReuseStrategy.store(n.snapshot,null),r.children.onOutletReAttached(s.contexts),r.attachRef=s.componentRef,r.route=s.route.value,r.outlet&&r.outlet.attach(s.componentRef,s.route.value),SM(s.route.value),this.activateChildRoutes(e,null,r.children)}else r.attachRef=null,r.route=n,r.outlet&&r.outlet.activateWith(n,r.injector),this.activateChildRoutes(e,null,r.children)}else this.activateChildRoutes(e,null,i)}},U6=class{path;route;constructor(e){this.path=e,this.route=this.path[this.path.length-1]}},lB=class{component;route;constructor(e,A){this.component=e,this.route=A}};function kQA(t,e,A){let i=t._root,n=e?e._root:null;return cu(i,n,A,[i.value])}function SQA(t){let e=t.routeConfig?t.routeConfig.canActivateChild:null;return!e||e.length===0?null:{node:t,guards:e}}function hB(t,e){let A=Symbol(),i=e.get(t,A);return i===A?typeof t=="function"&&!DY(t)?t:e.get(t):i}function cu(t,e,A,i,n={canDeactivateChecks:[],canActivateChecks:[]}){let o=aB(e);return t.children.forEach(r=>{RQA(r,o[r.value.outlet],A,i.concat([r.value]),n),delete o[r.value.outlet]}),Object.entries(o).forEach(([r,s])=>gu(s,A.getContext(r),n)),n}function RQA(t,e,A,i,n={canDeactivateChecks:[],canActivateChecks:[]}){let o=t.value,r=e?e.value:null,s=A?A.getContext(t.value.outlet):null;if(r&&o.routeConfig===r.routeConfig){let a=xQA(r,o,o.routeConfig.runGuardsAndResolvers);a?n.canActivateChecks.push(new U6(i)):(o.data=r.data,o._resolvedData=r._resolvedData),o.component?cu(t,e,s?s.children:null,i,n):cu(t,e,A,i,n),a&&s&&s.outlet&&s.outlet.isActivated&&n.canDeactivateChecks.push(new lB(s.outlet.component,r))}else r&&gu(e,s,n),n.canActivateChecks.push(new U6(i)),o.component?cu(t,null,s?s.children:null,i,n):cu(t,null,A,i,n);return n}function xQA(t,e,A){if(typeof A=="function")return A(t,e);switch(A){case"pathParamsChange":return!KI(t.url,e.url);case"pathParamsOrQueryParamsChange":return!KI(t.url,e.url)||!ag(t.queryParams,e.queryParams);case"always":return!0;case"paramsOrQueryParamsChange":return!KM(t,e)||!ag(t.queryParams,e.queryParams);case"paramsChange":default:return!KM(t,e)}}function gu(t,e,A){let i=aB(t),n=t.value;Object.entries(i).forEach(([o,r])=>{n.component?e?gu(r,e.children.getContext(o),A):gu(r,null,A):gu(r,e,A)}),n.component?e&&e.outlet&&e.outlet.isActivated?A.canDeactivateChecks.push(new lB(e.outlet.component,n)):A.canDeactivateChecks.push(new lB(null,n)):A.canDeactivateChecks.push(new lB(null,n))}function wu(t){return typeof t=="function"}function LQA(t){return typeof t=="boolean"}function FQA(t){return t&&wu(t.canLoad)}function NQA(t){return t&&wu(t.canActivate)}function _QA(t){return t&&wu(t.canActivateChild)}function GQA(t){return t&&wu(t.canDeactivate)}function UQA(t){return t&&wu(t.canMatch)}function cO(t){return t instanceof s0||t?.name==="EmptyError"}var Q6=Symbol("INITIAL_VALUE");function QB(){return jn(t=>Js(t.map(e=>e.pipe(On(1),Pn(Q6)))).pipe(je(e=>{for(let A of e)if(A!==!0){if(A===Q6)return Q6;if(A===!1||KQA(A))return A}return!0}),kt(e=>e!==Q6),On(1)))}function KQA(t){return gB(t)||t instanceof EB}function YQA(t,e){return tr(A=>{let{targetSnapshot:i,currentSnapshot:n,guards:{canActivateChecks:o,canDeactivateChecks:r}}=A;return r.length===0&&o.length===0?Me(Ye(rA({},A),{guardsResult:!0})):JQA(r,i,n,t).pipe(tr(s=>s&&LQA(s)?TQA(i,o,t,e):Me(s)),je(s=>Ye(rA({},A),{guardsResult:s})))})}function JQA(t,e,A,i){return oo(t).pipe(tr(n=>jQA(n.component,n.route,A,e,i)),Zl(n=>n!==!0,!0))}function TQA(t,e,A,i){return oo(e).pipe(ql(n=>d2(zQA(n.route.parent,i),HQA(n.route,i),PQA(t,n.path,A),OQA(t,n.route,A))),Zl(n=>n!==!0,!0))}function HQA(t,e){return t!==null&&e&&e(new x6(t)),Me(!0)}function zQA(t,e){return t!==null&&e&&e(new S6(t)),Me(!0)}function OQA(t,e,A){let i=e.routeConfig?e.routeConfig.canActivate:null;if(!i||i.length===0)return Me(!0);let n=i.map(o=>jl(()=>{let r=mu(e)??A,s=hB(o,r),a=NQA(s)?s.canActivate(e,t):ga(r,()=>s(e,t));return N2(a).pipe(Zl())}));return Me(n).pipe(QB())}function PQA(t,e,A){let i=e[e.length-1],o=e.slice(0,e.length-1).reverse().map(r=>SQA(r)).filter(r=>r!==null).map(r=>jl(()=>{let s=r.guards.map(a=>{let c=mu(r.node)??A,l=hB(a,c),I=_QA(l)?l.canActivateChild(i,t):ga(c,()=>l(i,t));return N2(I).pipe(Zl())});return Me(s).pipe(QB())}));return Me(o).pipe(QB())}function jQA(t,e,A,i,n){let o=e&&e.routeConfig?e.routeConfig.canDeactivate:null;if(!o||o.length===0)return Me(!0);let r=o.map(s=>{let a=mu(e)??n,c=hB(s,a),l=GQA(c)?c.canDeactivate(t,e,A,i):ga(a,()=>c(t,e,A,i));return N2(l).pipe(Zl())});return Me(r).pipe(QB())}function qQA(t,e,A,i){let n=e.canLoad;if(n===void 0||n.length===0)return Me(!0);let o=n.map(r=>{let s=hB(r,t),a=FQA(s)?s.canLoad(e,A):ga(t,()=>s(e,A));return N2(a)});return Me(o).pipe(QB(),lO(i))}function lO(t){return sv(Qo(e=>{if(typeof e!="boolean")throw G6(t,e)}),je(e=>e===!0))}function VQA(t,e,A,i){let n=e.canMatch;if(!n||n.length===0)return Me(!0);let o=n.map(r=>{let s=hB(r,t),a=UQA(s)?s.canMatch(e,A):ga(t,()=>s(e,A));return N2(a)});return Me(o).pipe(QB(),lO(i))}var hu=class{segmentGroup;constructor(e){this.segmentGroup=e||null}},uu=class extends Error{urlTree;constructor(e){super(),this.urlTree=e}};function sB(t){return g2(new hu(t))}function ZQA(t){return g2(new Ae(4e3,!1))}function WQA(t){return g2(sO(!1,Qa.GuardRejected))}var TM=class{urlSerializer;urlTree;constructor(e,A){this.urlSerializer=e,this.urlTree=A}lineralizeSegments(e,A){let i=[],n=A.root;for(;;){if(i=i.concat(n.segments),n.numberOfChildren===0)return Me(i);if(n.numberOfChildren>1||!n.children[Li])return ZQA(`${e.redirectTo}`);n=n.children[Li]}}applyRedirectCommands(e,A,i,n,o){if(typeof A!="string"){let s=A,{queryParams:a,fragment:c,routeConfig:l,url:I,outlet:C,params:d,data:B,title:E}=n,h=ga(o,()=>s({params:d,data:B,queryParams:a,fragment:c,routeConfig:l,url:I,outlet:C,title:E}));if(h instanceof lg)throw new uu(h);A=h}let r=this.applyRedirectCreateUrlTree(A,this.urlSerializer.parse(A),e,i);if(A[0]==="/")throw new uu(r);return r}applyRedirectCreateUrlTree(e,A,i,n){let o=this.createSegmentGroup(e,A.root,i,n);return new lg(o,this.createQueryParams(A.queryParams,this.urlTree.queryParams),A.fragment)}createQueryParams(e,A){let i={};return Object.entries(e).forEach(([n,o])=>{if(typeof o=="string"&&o[0]===":"){let s=o.substring(1);i[n]=A[s]}else i[n]=o}),i}createSegmentGroup(e,A,i,n){let o=this.createSegments(e,A.segments,i,n),r={};return Object.entries(A.children).forEach(([s,a])=>{r[s]=this.createSegmentGroup(e,a,i,n)}),new _n(o,r)}createSegments(e,A,i,n){return A.map(o=>o.path[0]===":"?this.findPosParam(e,o,n):this.findOrReturn(o,i))}findPosParam(e,A,i){let n=i[A.path.substring(1)];if(!n)throw new Ae(4001,!1);return n}findOrReturn(e,A){let i=0;for(let n of A){if(n.path===e.path)return A.splice(i),n;i++}return e}},HM={matched:!1,consumedSegments:[],remainingSegments:[],parameters:{},positionalParamSegments:{}};function XQA(t,e,A,i,n){let o=gO(t,e,A);return o.matched?(i=mQA(e,i),VQA(i,e,A,n).pipe(je(r=>r===!0?o:rA({},HM)))):Me(o)}function gO(t,e,A){if(e.path==="**")return $QA(A);if(e.path==="")return e.pathMatch==="full"&&(t.hasChildren()||A.length>0)?rA({},HM):{matched:!0,consumedSegments:[],remainingSegments:A,parameters:{},positionalParamSegments:{}};let n=(e.matcher||Yz)(A,t,e);if(!n)return rA({},HM);let o={};Object.entries(n.posParams??{}).forEach(([s,a])=>{o[s]=a.path});let r=n.consumed.length>0?rA(rA({},o),n.consumed[n.consumed.length-1].parameters):o;return{matched:!0,consumedSegments:n.consumed,remainingSegments:A.slice(n.consumed.length),parameters:r,positionalParamSegments:n.posParams??{}}}function $QA(t){return{matched:!0,parameters:t.length>0?Tz(t).parameters:{},consumedSegments:t,remainingSegments:[],positionalParamSegments:{}}}function Gz(t,e,A,i){return A.length>0&&thA(t,A,i)?{segmentGroup:new _n(e,ehA(i,new _n(A,t.children))),slicedSegments:[]}:A.length===0&&ihA(t,A,i)?{segmentGroup:new _n(t.segments,AhA(t,A,i,t.children)),slicedSegments:A}:{segmentGroup:new _n(t.segments,t.children),slicedSegments:A}}function AhA(t,e,A,i){let n={};for(let o of A)if(Y6(t,e,o)&&!i[ll(o)]){let r=new _n([],{});n[ll(o)]=r}return rA(rA({},i),n)}function ehA(t,e){let A={};A[Li]=e;for(let i of t)if(i.path===""&&ll(i)!==Li){let n=new _n([],{});A[ll(i)]=n}return A}function thA(t,e,A){return A.some(i=>Y6(t,e,i)&&ll(i)!==Li)}function ihA(t,e,A){return A.some(i=>Y6(t,e,i))}function Y6(t,e,A){return(t.hasChildren()||e.length>0)&&A.pathMatch==="full"?!1:A.path===""}function nhA(t,e,A){return e.length===0&&!t.children[A]}var zM=class{};function ohA(t,e,A,i,n,o,r="emptyOnly"){return new OM(t,e,A,i,n,r,o).recognize()}var rhA=31,OM=class{injector;configLoader;rootComponentType;config;urlTree;paramsInheritanceStrategy;urlSerializer;applyRedirects;absoluteRedirectCount=0;allowRedirects=!0;constructor(e,A,i,n,o,r,s){this.injector=e,this.configLoader=A,this.rootComponentType=i,this.config=n,this.urlTree=o,this.paramsInheritanceStrategy=r,this.urlSerializer=s,this.applyRedirects=new TM(this.urlSerializer,this.urlTree)}noMatchError(e){return new Ae(4002,`'${e.segmentGroup}'`)}recognize(){let e=Gz(this.urlTree.root,[],[],this.config).segmentGroup;return this.match(e).pipe(je(({children:A,rootSnapshot:i})=>{let n=new tc(i,A),o=new Eu("",n),r=Wz(i,[],this.urlTree.queryParams,this.urlTree.fragment);return r.queryParams=this.urlTree.queryParams,o.url=this.urlSerializer.serialize(r),{state:o,tree:r}}))}match(e){let A=new YI([],Object.freeze({}),Object.freeze(rA({},this.urlTree.queryParams)),this.urlTree.fragment,Object.freeze({}),Li,this.rootComponentType,null,{});return this.processSegmentGroup(this.injector,this.config,e,Li,A).pipe(je(i=>({children:i,rootSnapshot:A})),mr(i=>{if(i instanceof uu)return this.urlTree=i.urlTree,this.match(i.urlTree.root);throw i instanceof hu?this.noMatchError(i):i}))}processSegmentGroup(e,A,i,n,o){return i.segments.length===0&&i.hasChildren()?this.processChildren(e,A,i,o):this.processSegment(e,A,i,i.segments,n,!0,o).pipe(je(r=>r instanceof tc?[r]:[]))}processChildren(e,A,i,n){let o=[];for(let r of Object.keys(i.children))r==="primary"?o.unshift(r):o.push(r);return oo(o).pipe(ql(r=>{let s=i.children[r],a=pQA(A,r);return this.processSegmentGroup(e,a,s,r,n)}),Cv((r,s)=>(r.push(...s),r)),B2(null),Iv(),tr(r=>{if(r===null)return sB(i);let s=IO(r);return shA(s),Me(s)}))}processSegment(e,A,i,n,o,r,s){return oo(A).pipe(ql(a=>this.processSegmentAgainstRoute(a._injector??e,A,a,i,n,o,r,s).pipe(mr(c=>{if(c instanceof hu)return Me(null);throw c}))),Zl(a=>!!a),mr(a=>{if(cO(a))return nhA(i,n,o)?Me(new zM):sB(i);throw a}))}processSegmentAgainstRoute(e,A,i,n,o,r,s,a){return ll(i)!==r&&(r===Li||!Y6(n,o,i))?sB(n):i.redirectTo===void 0?this.matchSegmentAgainstRoute(e,n,i,o,r,a):this.allowRedirects&&s?this.expandSegmentAgainstRouteUsingRedirect(e,n,A,i,o,r,a):sB(n)}expandSegmentAgainstRouteUsingRedirect(e,A,i,n,o,r,s){let{matched:a,parameters:c,consumedSegments:l,positionalParamSegments:I,remainingSegments:C}=gO(A,n,o);if(!a)return sB(A);typeof n.redirectTo=="string"&&n.redirectTo[0]==="/"&&(this.absoluteRedirectCount++,this.absoluteRedirectCount>rhA&&(this.allowRedirects=!1));let d=new YI(o,c,Object.freeze(rA({},this.urlTree.queryParams)),this.urlTree.fragment,Uz(n),ll(n),n.component??n._loadedComponent??null,n,Kz(n)),B=_6(d,s,this.paramsInheritanceStrategy);d.params=Object.freeze(B.params),d.data=Object.freeze(B.data);let E=this.applyRedirects.applyRedirectCommands(l,n.redirectTo,I,d,e);return this.applyRedirects.lineralizeSegments(n,E).pipe(tr(h=>this.processSegment(e,i,A,h.concat(C),r,!1,s)))}matchSegmentAgainstRoute(e,A,i,n,o,r){let s=XQA(A,i,n,e,this.urlSerializer);return i.path==="**"&&(A.children={}),s.pipe(jn(a=>a.matched?(e=i._injector??e,this.getChildConfig(e,i,n).pipe(jn(({routes:c})=>{let l=i._loadedInjector??e,{parameters:I,consumedSegments:C,remainingSegments:d}=a,B=new YI(C,I,Object.freeze(rA({},this.urlTree.queryParams)),this.urlTree.fragment,Uz(i),ll(i),i.component??i._loadedComponent??null,i,Kz(i)),E=_6(B,r,this.paramsInheritanceStrategy);B.params=Object.freeze(E.params),B.data=Object.freeze(E.data);let{segmentGroup:h,slicedSegments:u}=Gz(A,C,d,c);if(u.length===0&&h.hasChildren())return this.processChildren(l,c,h,B).pipe(je(L=>new tc(B,L)));if(c.length===0&&u.length===0)return Me(new tc(B,[]));let D=ll(i)===o;return this.processSegment(l,c,h,u,D?Li:o,!0,B).pipe(je(L=>new tc(B,L instanceof tc?[L]:[])))}))):sB(A)))}getChildConfig(e,A,i){return A.children?Me({routes:A.children,injector:e}):A.loadChildren?A._loadedRoutes!==void 0?Me({routes:A._loadedRoutes,injector:A._loadedInjector}):qQA(e,A,i,this.urlSerializer).pipe(tr(n=>n?this.configLoader.loadChildren(e,A).pipe(Qo(o=>{A._loadedRoutes=o.routes,A._loadedInjector=o.injector})):WQA(A))):Me({routes:[],injector:e})}};function shA(t){t.sort((e,A)=>e.value.outlet===Li?-1:A.value.outlet===Li?1:e.value.outlet.localeCompare(A.value.outlet))}function ahA(t){let e=t.value.routeConfig;return e&&e.path===""}function IO(t){let e=[],A=new Set;for(let i of t){if(!ahA(i)){e.push(i);continue}let n=e.find(o=>i.value.routeConfig===o.value.routeConfig);n!==void 0?(n.children.push(...i.children),A.add(n)):e.push(i)}for(let i of A){let n=IO(i.children);e.push(new tc(i.value,n))}return e.filter(i=>!A.has(i))}function Uz(t){return t.data||{}}function Kz(t){return t.resolve||{}}function chA(t,e,A,i,n,o){return tr(r=>ohA(t,e,A,i,r.extractedUrl,n,o).pipe(je(({state:s,tree:a})=>Ye(rA({},r),{targetSnapshot:s,urlAfterRedirects:a}))))}function lhA(t,e){return tr(A=>{let{targetSnapshot:i,guards:{canActivateChecks:n}}=A;if(!n.length)return Me(A);let o=new Set(n.map(a=>a.route)),r=new Set;for(let a of o)if(!r.has(a))for(let c of CO(a))r.add(c);let s=0;return oo(r).pipe(ql(a=>o.has(a)?ghA(a,i,t,e):(a.data=_6(a,a.parent,t).resolve,Me(void 0))),Qo(()=>s++),bd(1),tr(a=>s===r.size?Me(A):sr))})}function CO(t){let e=t.children.map(A=>CO(A)).flat();return[t,...e]}function ghA(t,e,A,i){let n=t.routeConfig,o=t._resolve;return n?.title!==void 0&&!nO(n)&&(o[fu]=n.title),IhA(o,t,e,i).pipe(je(r=>(t._resolvedData=r,t.data=_6(t,t.parent,A).resolve,null)))}function IhA(t,e,A,i){let n=LM(t);if(n.length===0)return Me({});let o={};return oo(n).pipe(tr(r=>ChA(t[r],e,A,i).pipe(Zl(),Qo(s=>{if(s instanceof EB)throw G6(new L2,s);o[r]=s}))),bd(1),je(()=>o),mr(r=>cO(r)?sr:g2(r)))}function ChA(t,e,A,i){let n=mu(e)??i,o=hB(t,n),r=o.resolve?o.resolve(e,A):ga(n,()=>o(e,A));return N2(r)}function RM(t){return jn(e=>{let A=t(e);return A?oo(A).pipe(je(()=>e)):Me(e)})}var WM=(()=>{class t{buildTitle(A){let i,n=A.root;for(;n!==void 0;)i=this.getResolvedTitleForRoute(n)??i,n=n.children.find(o=>o.outlet===Li);return i}getResolvedTitleForRoute(A){return A.data[fu]}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:()=>f(dO),providedIn:"root"})}return t})(),dO=(()=>{class t extends WM{title;constructor(A){super(),this.title=A}updateTitle(A){let i=this.buildTitle(A);i!==void 0&&this.title.setTitle(i)}static \u0275fac=function(i){return new(i||t)(we(iz))};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),zI=new dA("",{providedIn:"root",factory:()=>({})}),uB=new dA(""),J6=(()=>{class t{componentLoaders=new WeakMap;childrenLoaders=new WeakMap;onLoadStartListener;onLoadEndListener;compiler=f(dH);loadComponent(A){if(this.componentLoaders.get(A))return this.componentLoaders.get(A);if(A._loadedComponent)return Me(A._loadedComponent);this.onLoadStartListener&&this.onLoadStartListener(A);let i=N2(A.loadComponent()).pipe(je(EO),Qo(o=>{this.onLoadEndListener&&this.onLoadEndListener(A),A._loadedComponent=o}),Vl(()=>{this.componentLoaders.delete(A)})),n=new l2(i,()=>new OA).pipe(fd());return this.componentLoaders.set(A,n),n}loadChildren(A,i){if(this.childrenLoaders.get(i))return this.childrenLoaders.get(i);if(i._loadedRoutes)return Me({routes:i._loadedRoutes,injector:i._loadedInjector});this.onLoadStartListener&&this.onLoadStartListener(i);let o=BO(i,this.compiler,A,this.onLoadEndListener).pipe(Vl(()=>{this.childrenLoaders.delete(i)})),r=new l2(o,()=>new OA).pipe(fd());return this.childrenLoaders.set(i,r),r}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function BO(t,e,A,i){return N2(t.loadChildren()).pipe(je(EO),tr(n=>n instanceof Lb||Array.isArray(n)?Me(n):oo(e.compileModuleAsync(n))),je(n=>{i&&i(t);let o,r,s=!1;return Array.isArray(n)?(r=n,s=!0):(o=n.create(A).injector,r=o.get(uB,[],{optional:!0,self:!0}).flat()),{routes:r.map(ZM),injector:o}}))}function dhA(t){return t&&typeof t=="object"&&"default"in t}function EO(t){return dhA(t)?t.default:t}var T6=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:()=>f(BhA),providedIn:"root"})}return t})(),BhA=(()=>{class t{shouldProcessUrl(A){return!0}extract(A){return A}merge(A,i){return A}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),XM=new dA(""),$M=new dA("");function QO(t,e,A){let i=t.get($M),n=t.get(at);return t.get(Qe).runOutsideAngular(()=>{if(!n.startViewTransition||i.skipNextTransition)return i.skipNextTransition=!1,new Promise(c=>setTimeout(c));let o,r=new Promise(c=>{o=c}),s=n.startViewTransition(()=>(o(),EhA(t))),{onViewTransitionCreated:a}=i;return a&&ga(t,()=>a({transition:s,from:e,to:A})),r})}function EhA(t){return new Promise(e=>{To({read:()=>setTimeout(e)},{injector:t})})}var Ak=new dA(""),H6=(()=>{class t{currentNavigation=null;currentTransition=null;lastSuccessfulNavigation=null;events=new OA;transitionAbortSubject=new OA;configLoader=f(J6);environmentInjector=f(pr);destroyRef=f(m2);urlSerializer=f(TI);rootContexts=f(HI);location=f(Dc);inputBindingEnabled=f(pu,{optional:!0})!==null;titleStrategy=f(WM);options=f(zI,{optional:!0})||{};paramsInheritanceStrategy=this.options.paramsInheritanceStrategy||"emptyOnly";urlHandlingStrategy=f(T6);createViewTransition=f(XM,{optional:!0});navigationErrorHandler=f(Ak,{optional:!0});navigationId=0;get hasRequestedNavigation(){return this.navigationId!==0}transitions;afterPreactivation=()=>Me(void 0);rootComponentType=null;destroyed=!1;constructor(){let A=n=>this.events.next(new M6(n)),i=n=>this.events.next(new k6(n));this.configLoader.onLoadEndListener=i,this.configLoader.onLoadStartListener=A,this.destroyRef.onDestroy(()=>{this.destroyed=!0})}complete(){this.transitions?.complete()}handleNavigationRequest(A){let i=++this.navigationId;this.transitions?.next(Ye(rA({},A),{extractedUrl:this.urlHandlingStrategy.extract(A.rawUrl),targetSnapshot:null,targetRouterState:null,guards:{canActivateChecks:[],canDeactivateChecks:[]},guardsResult:null,id:i}))}setupNavigations(A){return this.transitions=new Mi(null),this.transitions.pipe(kt(i=>i!==null),jn(i=>{let n=!1,o=!1;return Me(i).pipe(jn(r=>{if(this.navigationId>i.id)return this.cancelNavigationTransition(i,"",Qa.SupersededByNewNavigation),sr;this.currentTransition=i,this.currentNavigation={id:r.id,initialUrl:r.rawUrl,extractedUrl:r.extractedUrl,targetBrowserUrl:typeof r.extras.browserUrl=="string"?this.urlSerializer.parse(r.extras.browserUrl):r.extras.browserUrl,trigger:r.source,extras:r.extras,previousNavigation:this.lastSuccessfulNavigation?Ye(rA({},this.lastSuccessfulNavigation),{previousNavigation:null}):null};let s=!A.navigated||this.isUpdatingInternalState()||this.isUpdatedBrowserUrl(),a=r.extras.onSameUrlNavigation??A.onSameUrlNavigation;if(!s&&a!=="reload"){let c="";return this.events.next(new gg(r.id,this.urlSerializer.serialize(r.rawUrl),c,IB.IgnoredSameUrlNavigation)),r.resolve(!1),sr}if(this.urlHandlingStrategy.shouldProcessUrl(r.rawUrl))return Me(r).pipe(jn(c=>(this.events.next(new F2(c.id,this.urlSerializer.serialize(c.extractedUrl),c.source,c.restoredState)),c.id!==this.navigationId?sr:Promise.resolve(c))),chA(this.environmentInjector,this.configLoader,this.rootComponentType,A.config,this.urlSerializer,this.paramsInheritanceStrategy),Qo(c=>{i.targetSnapshot=c.targetSnapshot,i.urlAfterRedirects=c.urlAfterRedirects,this.currentNavigation=Ye(rA({},this.currentNavigation),{finalUrl:c.urlAfterRedirects});let l=new Cu(c.id,this.urlSerializer.serialize(c.extractedUrl),this.urlSerializer.serialize(c.urlAfterRedirects),c.targetSnapshot);this.events.next(l)}));if(s&&this.urlHandlingStrategy.shouldProcessUrl(r.currentRawUrl)){let{id:c,extractedUrl:l,source:I,restoredState:C,extras:d}=r,B=new F2(c,this.urlSerializer.serialize(l),I,C);this.events.next(B);let E=tO(this.rootComponentType).snapshot;return this.currentTransition=i=Ye(rA({},r),{targetSnapshot:E,urlAfterRedirects:l,extras:Ye(rA({},d),{skipLocationChange:!1,replaceUrl:!1})}),this.currentNavigation.finalUrl=l,Me(i)}else{let c="";return this.events.next(new gg(r.id,this.urlSerializer.serialize(r.extractedUrl),c,IB.IgnoredByUrlHandlingStrategy)),r.resolve(!1),sr}}),Qo(r=>{let s=new D6(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot);this.events.next(s)}),je(r=>(this.currentTransition=i=Ye(rA({},r),{guards:kQA(r.targetSnapshot,r.currentSnapshot,this.rootContexts)}),i)),YQA(this.environmentInjector,r=>this.events.next(r)),Qo(r=>{if(i.guardsResult=r.guardsResult,r.guardsResult&&typeof r.guardsResult!="boolean")throw G6(this.urlSerializer,r.guardsResult);let s=new y6(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects),r.targetSnapshot,!!r.guardsResult);this.events.next(s)}),kt(r=>r.guardsResult?!0:(this.cancelNavigationTransition(r,"",Qa.GuardRejected),!1)),RM(r=>{if(r.guards.canActivateChecks.length!==0)return Me(r).pipe(Qo(s=>{let a=new v6(s.id,this.urlSerializer.serialize(s.extractedUrl),this.urlSerializer.serialize(s.urlAfterRedirects),s.targetSnapshot);this.events.next(a)}),jn(s=>{let a=!1;return Me(s).pipe(lhA(this.paramsInheritanceStrategy,this.environmentInjector),Qo({next:()=>a=!0,complete:()=>{a||this.cancelNavigationTransition(s,"",Qa.NoDataFromResolver)}}))}),Qo(s=>{let a=new b6(s.id,this.urlSerializer.serialize(s.extractedUrl),this.urlSerializer.serialize(s.urlAfterRedirects),s.targetSnapshot);this.events.next(a)}))}),RM(r=>{let s=a=>{let c=[];a.routeConfig?.loadComponent&&!a.routeConfig._loadedComponent&&c.push(this.configLoader.loadComponent(a.routeConfig).pipe(Qo(l=>{a.component=l}),je(()=>{})));for(let l of a.children)c.push(...s(l));return c};return Js(s(r.targetSnapshot.root)).pipe(B2(null),On(1))}),RM(()=>this.afterPreactivation()),jn(()=>{let{currentSnapshot:r,targetSnapshot:s}=i,a=this.createViewTransition?.(this.environmentInjector,r.root,s.root);return a?oo(a).pipe(je(()=>i)):Me(i)}),je(r=>{let s=DQA(A.routeReuseStrategy,r.targetSnapshot,r.currentRouterState);return this.currentTransition=i=Ye(rA({},r),{targetRouterState:s}),this.currentNavigation.targetRouterState=s,i}),Qo(()=>{this.events.next(new du)}),MQA(this.rootContexts,A.routeReuseStrategy,r=>this.events.next(r),this.inputBindingEnabled),On(1),Qo({next:r=>{n=!0,this.lastSuccessfulNavigation=this.currentNavigation,this.events.next(new nc(r.id,this.urlSerializer.serialize(r.extractedUrl),this.urlSerializer.serialize(r.urlAfterRedirects))),this.titleStrategy?.updateTitle(r.targetRouterState.snapshot),r.resolve(!0)},complete:()=>{n=!0}}),St(this.transitionAbortSubject.pipe(Qo(r=>{throw r}))),Vl(()=>{!n&&!o&&this.cancelNavigationTransition(i,"",Qa.SupersededByNewNavigation),this.currentTransition?.id===i.id&&(this.currentNavigation=null,this.currentTransition=null)}),mr(r=>{if(this.destroyed)return i.resolve(!1),sr;if(o=!0,aO(r))this.events.next(new cg(i.id,this.urlSerializer.serialize(i.extractedUrl),r.message,r.cancellationCode)),bQA(r)?this.events.next(new BB(r.url,r.navigationBehaviorOptions)):i.resolve(!1);else{let s=new CB(i.id,this.urlSerializer.serialize(i.extractedUrl),r,i.targetSnapshot??void 0);try{let a=ga(this.environmentInjector,()=>this.navigationErrorHandler?.(s));if(a instanceof EB){let{message:c,cancellationCode:l}=G6(this.urlSerializer,a);this.events.next(new cg(i.id,this.urlSerializer.serialize(i.extractedUrl),c,l)),this.events.next(new BB(a.redirectTo,a.navigationBehaviorOptions))}else throw this.events.next(s),r}catch(a){this.options.resolveNavigationPromiseOnError?i.resolve(!1):i.reject(a)}}return sr}))}))}cancelNavigationTransition(A,i,n){let o=new cg(A.id,this.urlSerializer.serialize(A.extractedUrl),i,n);this.events.next(o),A.resolve(!1)}isUpdatingInternalState(){return this.currentTransition?.extractedUrl.toString()!==this.currentTransition?.currentUrlTree.toString()}isUpdatedBrowserUrl(){let A=this.urlHandlingStrategy.extract(this.urlSerializer.parse(this.location.path(!0))),i=this.currentNavigation?.targetBrowserUrl??this.currentNavigation?.extractedUrl;return A.toString()!==i?.toString()&&!this.currentNavigation?.extras.skipLocationChange}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function QhA(t){return t!==m6}var hO=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:()=>f(hhA),providedIn:"root"})}return t})(),K6=class{shouldDetach(e){return!1}store(e,A){}shouldAttach(e){return!1}retrieve(e){return null}shouldReuseRoute(e,A){return e.routeConfig===A.routeConfig}},hhA=(()=>{class t extends K6{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),uO=(()=>{class t{urlSerializer=f(TI);options=f(zI,{optional:!0})||{};canceledNavigationResolution=this.options.canceledNavigationResolution||"replace";location=f(Dc);urlHandlingStrategy=f(T6);urlUpdateStrategy=this.options.urlUpdateStrategy||"deferred";currentUrlTree=new lg;getCurrentUrlTree(){return this.currentUrlTree}rawUrlTree=this.currentUrlTree;getRawUrlTree(){return this.rawUrlTree}createBrowserPath({finalUrl:A,initialUrl:i,targetBrowserUrl:n}){let o=A!==void 0?this.urlHandlingStrategy.merge(A,i):i,r=n??o;return r instanceof lg?this.urlSerializer.serialize(r):r}commitTransition({targetRouterState:A,finalUrl:i,initialUrl:n}){i&&A?(this.currentUrlTree=i,this.rawUrlTree=this.urlHandlingStrategy.merge(i,n),this.routerState=A):this.rawUrlTree=n}routerState=tO(null);getRouterState(){return this.routerState}stateMemento=this.createStateMemento();updateStateMemento(){this.stateMemento=this.createStateMemento()}createStateMemento(){return{rawUrlTree:this.rawUrlTree,currentUrlTree:this.currentUrlTree,routerState:this.routerState}}resetInternalState({finalUrl:A}){this.routerState=this.stateMemento.routerState,this.currentUrlTree=this.stateMemento.currentUrlTree,this.rawUrlTree=this.urlHandlingStrategy.merge(this.currentUrlTree,A??this.rawUrlTree)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:()=>f(uhA),providedIn:"root"})}return t})(),uhA=(()=>{class t extends uO{currentPageId=0;lastSuccessfulId=-1;restoredState(){return this.location.getState()}get browserPageId(){return this.canceledNavigationResolution!=="computed"?this.currentPageId:this.restoredState()?.\u0275routerPageId??this.currentPageId}registerNonRouterCurrentEntryChangeListener(A){return this.location.subscribe(i=>{i.type==="popstate"&&setTimeout(()=>{A(i.url,i.state,"popstate")})})}handleRouterEvent(A,i){A instanceof F2?this.updateStateMemento():A instanceof gg?this.commitTransition(i):A instanceof Cu?this.urlUpdateStrategy==="eager"&&(i.extras.skipLocationChange||this.setBrowserUrl(this.createBrowserPath(i),i)):A instanceof du?(this.commitTransition(i),this.urlUpdateStrategy==="deferred"&&!i.extras.skipLocationChange&&this.setBrowserUrl(this.createBrowserPath(i),i)):A instanceof cg&&(A.code===Qa.GuardRejected||A.code===Qa.NoDataFromResolver)?this.restoreHistory(i):A instanceof CB?this.restoreHistory(i,!0):A instanceof nc&&(this.lastSuccessfulId=A.id,this.currentPageId=this.browserPageId)}setBrowserUrl(A,{extras:i,id:n}){let{replaceUrl:o,state:r}=i;if(this.location.isCurrentPathEqualTo(A)||o){let s=this.browserPageId,a=rA(rA({},r),this.generateNgRouterState(n,s));this.location.replaceState(A,"",a)}else{let s=rA(rA({},r),this.generateNgRouterState(n,this.browserPageId+1));this.location.go(A,"",s)}}restoreHistory(A,i=!1){if(this.canceledNavigationResolution==="computed"){let n=this.browserPageId,o=this.currentPageId-n;o!==0?this.location.historyGo(o):this.getCurrentUrlTree()===A.finalUrl&&o===0&&(this.resetInternalState(A),this.resetUrlToCurrentUrlTree())}else this.canceledNavigationResolution==="replace"&&(i&&this.resetInternalState(A),this.resetUrlToCurrentUrlTree())}resetUrlToCurrentUrlTree(){this.location.replaceState(this.urlSerializer.serialize(this.getRawUrlTree()),"",this.generateNgRouterState(this.lastSuccessfulId,this.currentPageId))}generateNgRouterState(A,i){return this.canceledNavigationResolution==="computed"?{navigationId:A,\u0275routerPageId:i}:{navigationId:A}}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function z6(t,e){t.events.pipe(kt(A=>A instanceof nc||A instanceof cg||A instanceof CB||A instanceof gg),je(A=>A instanceof nc||A instanceof gg?0:(A instanceof cg?A.code===Qa.Redirect||A.code===Qa.SupersededByNewNavigation:!1)?2:1),kt(A=>A!==2),On(1)).subscribe(()=>{e()})}var fhA={paths:"exact",fragment:"ignored",matrixParams:"ignored",queryParams:"exact"},mhA={paths:"subset",fragment:"ignored",matrixParams:"ignored",queryParams:"subset"},Ig=(()=>{class t{get currentUrlTree(){return this.stateManager.getCurrentUrlTree()}get rawUrlTree(){return this.stateManager.getRawUrlTree()}disposed=!1;nonRouterCurrentEntryChangeSubscription;console=f(_b);stateManager=f(uO);options=f(zI,{optional:!0})||{};pendingTasks=f(B0);urlUpdateStrategy=this.options.urlUpdateStrategy||"deferred";navigationTransitions=f(H6);urlSerializer=f(TI);location=f(Dc);urlHandlingStrategy=f(T6);_events=new OA;get events(){return this._events}get routerState(){return this.stateManager.getRouterState()}navigated=!1;routeReuseStrategy=f(hO);onSameUrlNavigation=this.options.onSameUrlNavigation||"ignore";config=f(uB,{optional:!0})?.flat()??[];componentInputBindingEnabled=!!f(pu,{optional:!0});constructor(){this.resetConfig(this.config),this.navigationTransitions.setupNavigations(this).subscribe({error:A=>{this.console.warn(A)}}),this.subscribeToNavigationEvents()}eventsSubscription=new Kt;subscribeToNavigationEvents(){let A=this.navigationTransitions.events.subscribe(i=>{try{let n=this.navigationTransitions.currentTransition,o=this.navigationTransitions.currentNavigation;if(n!==null&&o!==null){if(this.stateManager.handleRouterEvent(i,o),i instanceof cg&&i.code!==Qa.Redirect&&i.code!==Qa.SupersededByNewNavigation)this.navigated=!0;else if(i instanceof nc)this.navigated=!0;else if(i instanceof BB){let r=i.navigationBehaviorOptions,s=this.urlHandlingStrategy.merge(i.url,n.currentRawUrl),a=rA({browserUrl:n.extras.browserUrl,info:n.extras.info,skipLocationChange:n.extras.skipLocationChange,replaceUrl:n.extras.replaceUrl||this.urlUpdateStrategy==="eager"||QhA(n.source)},r);this.scheduleNavigation(s,m6,null,a,{resolve:n.resolve,reject:n.reject,promise:n.promise})}}whA(i)&&this._events.next(i)}catch(n){this.navigationTransitions.transitionAbortSubject.next(n)}});this.eventsSubscription.add(A)}resetRootComponentType(A){this.routerState.root.component=A,this.navigationTransitions.rootComponentType=A}initialNavigation(){this.setUpLocationChangeListener(),this.navigationTransitions.hasRequestedNavigation||this.navigateToSyncWithBrowser(this.location.path(!0),m6,this.stateManager.restoredState())}setUpLocationChangeListener(){this.nonRouterCurrentEntryChangeSubscription??=this.stateManager.registerNonRouterCurrentEntryChangeListener((A,i,n)=>{this.navigateToSyncWithBrowser(A,n,i)})}navigateToSyncWithBrowser(A,i,n){let o={replaceUrl:!0},r=n?.navigationId?n:null;if(n){let a=rA({},n);delete a.navigationId,delete a.\u0275routerPageId,Object.keys(a).length!==0&&(o.state=a)}let s=this.parseUrl(A);this.scheduleNavigation(s,i,r,o)}get url(){return this.serializeUrl(this.currentUrlTree)}getCurrentNavigation(){return this.navigationTransitions.currentNavigation}get lastSuccessfulNavigation(){return this.navigationTransitions.lastSuccessfulNavigation}resetConfig(A){this.config=A.map(ZM),this.navigated=!1}ngOnDestroy(){this.dispose()}dispose(){this._events.unsubscribe(),this.navigationTransitions.complete(),this.nonRouterCurrentEntryChangeSubscription&&(this.nonRouterCurrentEntryChangeSubscription.unsubscribe(),this.nonRouterCurrentEntryChangeSubscription=void 0),this.disposed=!0,this.eventsSubscription.unsubscribe()}createUrlTree(A,i={}){let{relativeTo:n,queryParams:o,fragment:r,queryParamsHandling:s,preserveFragment:a}=i,c=a?this.currentUrlTree.fragment:r,l=null;switch(s??this.options.defaultQueryParamsHandling){case"merge":l=rA(rA({},this.currentUrlTree.queryParams),o);break;case"preserve":l=this.currentUrlTree.queryParams;break;default:l=o||null}l!==null&&(l=this.removeEmptyProps(l));let I;try{let C=n?n.snapshot:this.routerState.snapshot.root;I=Xz(C)}catch{(typeof A[0]!="string"||A[0][0]!=="/")&&(A=[]),I=this.currentUrlTree.root}return $z(I,A,l,c??null)}navigateByUrl(A,i={skipLocationChange:!1}){let n=gB(A)?A:this.parseUrl(A),o=this.urlHandlingStrategy.merge(n,this.rawUrlTree);return this.scheduleNavigation(o,m6,null,i)}navigate(A,i={skipLocationChange:!1}){return phA(A),this.navigateByUrl(this.createUrlTree(A,i),i)}serializeUrl(A){return this.urlSerializer.serialize(A)}parseUrl(A){try{return this.urlSerializer.parse(A)}catch{return this.urlSerializer.parse("/")}}isActive(A,i){let n;if(i===!0?n=rA({},fhA):i===!1?n=rA({},mhA):n=i,gB(A))return Lz(this.currentUrlTree,A,n);let o=this.parseUrl(A);return Lz(this.currentUrlTree,o,n)}removeEmptyProps(A){return Object.entries(A).reduce((i,[n,o])=>(o!=null&&(i[n]=o),i),{})}scheduleNavigation(A,i,n,o,r){if(this.disposed)return Promise.resolve(!1);let s,a,c;r?(s=r.resolve,a=r.reject,c=r.promise):c=new Promise((I,C)=>{s=I,a=C});let l=this.pendingTasks.add();return z6(this,()=>{queueMicrotask(()=>this.pendingTasks.remove(l))}),this.navigationTransitions.handleNavigationRequest({source:i,restoredState:n,currentUrlTree:this.currentUrlTree,currentRawUrl:this.currentUrlTree,rawUrl:A,extras:o,resolve:s,reject:a,promise:c,currentSnapshot:this.routerState.snapshot,currentRouterState:this.routerState}),c.catch(I=>Promise.reject(I))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function phA(t){for(let e=0;e{class t{router;injector;preloadingStrategy;loader;subscription;constructor(A,i,n,o){this.router=A,this.injector=i,this.preloadingStrategy=n,this.loader=o}setUpPreloading(){this.subscription=this.router.events.pipe(kt(A=>A instanceof nc),ql(()=>this.preload())).subscribe(()=>{})}preload(){return this.processRoutes(this.injector,this.router.config)}ngOnDestroy(){this.subscription&&this.subscription.unsubscribe()}processRoutes(A,i){let n=[];for(let o of i){o.providers&&!o._injector&&(o._injector=Rh(o.providers,A,`Route: ${o.path}`));let r=o._injector??A,s=o._loadedInjector??r;(o.loadChildren&&!o._loadedRoutes&&o.canLoad===void 0||o.loadComponent&&!o._loadedComponent)&&n.push(this.preloadConfig(r,o)),(o.children||o._loadedRoutes)&&n.push(this.processRoutes(s,o.children??o._loadedRoutes))}return oo(n).pipe(C2())}preloadConfig(A,i){return this.preloadingStrategy.preload(i,()=>{let n;i.loadChildren&&i.canLoad===void 0?n=this.loader.loadChildren(A,i):n=Me(null);let o=n.pipe(tr(r=>r===null?Me(void 0):(i._loadedRoutes=r.routes,i._loadedInjector=r.injector,this.processRoutes(r.injector??A,r.routes))));if(i.loadComponent&&!i._loadedComponent){let r=this.loader.loadComponent(i);return oo([o,r]).pipe(C2())}else return o})}static \u0275fac=function(i){return new(i||t)(we(Ig),we(pr),we(Du),we(J6))};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),mO=new dA(""),DhA=(()=>{class t{urlSerializer;transitions;viewportScroller;zone;options;routerEventsSubscription;scrollEventsSubscription;lastId=0;lastSource="imperative";restoredId=0;store={};constructor(A,i,n,o,r={}){this.urlSerializer=A,this.transitions=i,this.viewportScroller=n,this.zone=o,this.options=r,r.scrollPositionRestoration||="disabled",r.anchorScrolling||="disabled"}init(){this.options.scrollPositionRestoration!=="disabled"&&this.viewportScroller.setHistoryScrollRestoration("manual"),this.routerEventsSubscription=this.createScrollEvents(),this.scrollEventsSubscription=this.consumeScrollEvents()}createScrollEvents(){return this.transitions.events.subscribe(A=>{A instanceof F2?(this.store[this.lastId]=this.viewportScroller.getScrollPosition(),this.lastSource=A.navigationTrigger,this.restoredId=A.restoredState?A.restoredState.navigationId:0):A instanceof nc?(this.lastId=A.id,this.scheduleScrollEvent(A,this.urlSerializer.parse(A.urlAfterRedirects).fragment)):A instanceof gg&&A.code===IB.IgnoredSameUrlNavigation&&(this.lastSource=void 0,this.restoredId=0,this.scheduleScrollEvent(A,this.urlSerializer.parse(A.url).fragment))})}consumeScrollEvents(){return this.transitions.events.subscribe(A=>{A instanceof dB&&(A.position?this.options.scrollPositionRestoration==="top"?this.viewportScroller.scrollToPosition([0,0]):this.options.scrollPositionRestoration==="enabled"&&this.viewportScroller.scrollToPosition(A.position):A.anchor&&this.options.anchorScrolling==="enabled"?this.viewportScroller.scrollToAnchor(A.anchor):this.options.scrollPositionRestoration!=="disabled"&&this.viewportScroller.scrollToPosition([0,0]))})}scheduleScrollEvent(A,i){this.zone.runOutsideAngular(()=>{setTimeout(()=>{this.zone.run(()=>{this.transitions.events.next(new dB(A,this.lastSource==="popstate"?this.store[this.restoredId]:null,i))})},0)})}ngOnDestroy(){this.routerEventsSubscription?.unsubscribe(),this.scrollEventsSubscription?.unsubscribe()}static \u0275fac=function(i){yT()};static \u0275prov=NA({token:t,factory:t.\u0275fac})}return t})();function yhA(t){return t.routerState.root}function yu(t,e){return{\u0275kind:t,\u0275providers:e}}function vhA(){let t=f(Rt);return e=>{let A=t.get(la);if(e!==A.components[0])return;let i=t.get(Ig),n=t.get(pO);t.get(tk)===1&&i.initialNavigation(),t.get(yO,null,Gi.Optional)?.setUpPreloading(),t.get(mO,null,Gi.Optional)?.init(),i.resetRootComponentType(A.componentTypes[0]),n.closed||(n.next(),n.complete(),n.unsubscribe())}}var pO=new dA("",{factory:()=>new OA}),tk=new dA("",{providedIn:"root",factory:()=>1});function wO(){let t=[{provide:tk,useValue:0},Yb(()=>{let e=f(Rt);return e.get(Vb,Promise.resolve()).then(()=>new Promise(i=>{let n=e.get(Ig),o=e.get(pO);z6(n,()=>{i(!0)}),e.get(H6).afterPreactivation=()=>(i(!0),o.closed?Me(void 0):o),n.initialNavigation()}))})];return yu(2,t)}function DO(){let t=[Yb(()=>{f(Ig).setUpLocationChangeListener()}),{provide:tk,useValue:2}];return yu(3,t)}var yO=new dA("");function vO(t){return yu(0,[{provide:yO,useExisting:fO},{provide:Du,useExisting:t}])}function bO(){return yu(8,[qM,{provide:pu,useExisting:qM}])}function MO(t){E0("NgRouterViewTransitions");let e=[{provide:XM,useValue:QO},{provide:$M,useValue:rA({skipNextTransition:!!t?.skipInitialTransition},t)}];return yu(9,e)}var kO=[Dc,{provide:TI,useClass:L2},Ig,HI,{provide:ha,useFactory:yhA,deps:[Ig]},J6,[]],O6=(()=>{class t{constructor(){}static forRoot(A,i){return{ngModule:t,providers:[kO,[],{provide:uB,multi:!0,useValue:A},[],i?.errorHandler?{provide:Ak,useValue:i.errorHandler}:[],{provide:zI,useValue:i||{}},i?.useHash?MhA():khA(),bhA(),i?.preloadingStrategy?vO(i.preloadingStrategy).\u0275providers:[],i?.initialNavigation?ShA(i):[],i?.bindToComponentInputs?bO().\u0275providers:[],i?.enableViewTransitions?MO().\u0275providers:[],RhA()]}}static forChild(A){return{ngModule:t,providers:[{provide:uB,multi:!0,useValue:A}]}}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({})}return t})();function bhA(){return{provide:mO,useFactory:()=>{let t=f(xH),e=f(Qe),A=f(zI),i=f(H6),n=f(TI);return A.scrollOffset&&t.setOffset(A.scrollOffset),new DhA(n,i,t,e,A)}}}function MhA(){return{provide:u0,useClass:$b}}function khA(){return{provide:u0,useClass:Yp}}function ShA(t){return[t.initialNavigation==="disabled"?DO().\u0275providers:[],t.initialNavigation==="enabledBlocking"?wO().\u0275providers:[]]}var ek=new dA("");function RhA(){return[{provide:ek,useFactory:vhA},{provide:Jb,multi:!0,useExisting:ek}]}var nk;try{nk=typeof Intl<"u"&&Intl.v8BreakIterator}catch{nk=!1}var Ii=(()=>{class t{_platformId=f(og);isBrowser=this._platformId?sg(this._platformId):typeof document=="object"&&!!document;EDGE=this.isBrowser&&/(edge)/i.test(navigator.userAgent);TRIDENT=this.isBrowser&&/(msie|trident)/i.test(navigator.userAgent);BLINK=this.isBrowser&&!!(window.chrome||nk)&&typeof CSS<"u"&&!this.EDGE&&!this.TRIDENT;WEBKIT=this.isBrowser&&/AppleWebKit/i.test(navigator.userAgent)&&!this.BLINK&&!this.EDGE&&!this.TRIDENT;IOS=this.isBrowser&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!("MSStream"in window);FIREFOX=this.isBrowser&&/(firefox|minefield)/i.test(navigator.userAgent);ANDROID=this.isBrowser&&/android/i.test(navigator.userAgent)&&!this.TRIDENT;SAFARI=this.isBrowser&&/safari/i.test(navigator.userAgent)&&this.WEBKIT;constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var fB,SO=["color","button","checkbox","date","datetime-local","email","file","hidden","image","month","number","password","radio","range","reset","search","submit","tel","text","time","url","week"];function ok(){if(fB)return fB;if(typeof document!="object"||!document)return fB=new Set(SO),fB;let t=document.createElement("input");return fB=new Set(SO.filter(e=>(t.setAttribute("type",e),t.type===e))),fB}var vu;function FhA(){if(vu==null&&typeof window<"u")try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:()=>vu=!0}))}finally{vu=vu||!1}return vu}function bc(t){return FhA()?t:!!t.capture}var gl=function(t){return t[t.NORMAL=0]="NORMAL",t[t.NEGATED=1]="NEGATED",t[t.INVERTED=2]="INVERTED",t}(gl||{}),P6,OI;function j6(){if(OI==null){if(typeof document!="object"||!document||typeof Element!="function"||!Element)return OI=!1,OI;if("scrollBehavior"in document.documentElement.style)OI=!0;else{let t=Element.prototype.scrollTo;t?OI=!/\{\s*\[native code\]\s*\}/.test(t.toString()):OI=!1}}return OI}function mB(){if(typeof document!="object"||!document)return gl.NORMAL;if(P6==null){let t=document.createElement("div"),e=t.style;t.dir="rtl",e.width="1px",e.overflow="auto",e.visibility="hidden",e.pointerEvents="none",e.position="absolute";let A=document.createElement("div"),i=A.style;i.width="2px",i.height="1px",t.appendChild(A),document.body.appendChild(t),P6=gl.NORMAL,t.scrollLeft===0&&(t.scrollLeft=1,P6=t.scrollLeft===0?gl.NEGATED:gl.INVERTED),t.remove()}return P6}var ik;function NhA(){if(ik==null){let t=typeof document<"u"?document.head:null;ik=!!(t&&(t.createShadowRoot||t.attachShadow))}return ik}function RO(t){if(NhA()){let e=t.getRootNode?t.getRootNode():null;if(typeof ShadowRoot<"u"&&ShadowRoot&&e instanceof ShadowRoot)return e}return null}function pB(){let t=typeof document<"u"&&document?document.activeElement:null;for(;t&&t.shadowRoot;){let e=t.shadowRoot.activeElement;if(e===t)break;t=e}return t}function oc(t){return t.composedPath?t.composedPath()[0]:t.target}function rk(){return typeof __karma__<"u"&&!!__karma__||typeof jasmine<"u"&&!!jasmine||typeof jest<"u"&&!!jest||typeof Mocha<"u"&&!!Mocha}function sk(t,e,A,i,n){let o=parseInt(Pb.major),r=parseInt(Pb.minor);return o>19||o===19&&r>0||o===0&&r===0?t.listen(e,A,i,n):(e.addEventListener(A,i,n),()=>{e.removeEventListener(A,i,n)})}var q6=new WeakMap,Rn=(()=>{class t{_appRef;_injector=f(Rt);_environmentInjector=f(pr);load(A){let i=this._appRef=this._appRef||this._injector.get(la),n=q6.get(i);n||(n={loaders:new Set,refs:[]},q6.set(i,n),i.onDestroy(()=>{q6.get(i)?.refs.forEach(o=>o.destroy()),q6.delete(i)})),n.loaders.has(A)||(n.loaders.add(A),n.refs.push(Gp(A,{environmentInjector:this._environmentInjector})))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),bu=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["ng-component"]],exportAs:["cdkVisuallyHidden"],decls:0,vars:0,template:function(i,n){},styles:[".cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap;outline:0;-webkit-appearance:none;-moz-appearance:none;left:0}[dir=rtl] .cdk-visually-hidden{left:auto;right:0}"],encapsulation:2,changeDetection:0})}return t})();function ir(t,...e){return e.length?e.some(A=>t[A]):t.altKey||t.shiftKey||t.ctrlKey||t.metaKey}function Xo(t){return t!=null&&`${t}`!="false"}function zs(t,e=0){return ak(t)?Number(t):arguments.length===2?e:0}function ak(t){return!isNaN(parseFloat(t))&&!isNaN(Number(t))}function wB(t){return Array.isArray(t)?t:[t]}function Cr(t){return t==null?"":typeof t=="string"?t:`${t}px`}function ua(t){return t instanceof ee?t.nativeElement:t}function _hA(t){if(t.type==="characterData"&&t.target instanceof Comment)return!0;if(t.type==="childList"){for(let e=0;e{class t{create(A){return typeof MutationObserver>"u"?null:new MutationObserver(A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),LO=(()=>{class t{_mutationObserverFactory=f(xO);_observedElements=new Map;_ngZone=f(Qe);constructor(){}ngOnDestroy(){this._observedElements.forEach((A,i)=>this._cleanupObserver(i))}observe(A){let i=ua(A);return new ct(n=>{let r=this._observeElement(i).pipe(je(s=>s.filter(a=>!_hA(a))),kt(s=>!!s.length)).subscribe(s=>{this._ngZone.run(()=>{n.next(s)})});return()=>{r.unsubscribe(),this._unobserveElement(i)}})}_observeElement(A){return this._ngZone.runOutsideAngular(()=>{if(this._observedElements.has(A))this._observedElements.get(A).count++;else{let i=new OA,n=this._mutationObserverFactory.create(o=>i.next(o));n&&n.observe(A,{characterData:!0,childList:!0,subtree:!0}),this._observedElements.set(A,{observer:n,stream:i,count:1})}return this._observedElements.get(A).stream})}_unobserveElement(A){this._observedElements.has(A)&&(this._observedElements.get(A).count--,this._observedElements.get(A).count||this._cleanupObserver(A))}_cleanupObserver(A){if(this._observedElements.has(A)){let{observer:i,stream:n}=this._observedElements.get(A);i&&i.disconnect(),n.complete(),this._observedElements.delete(A)}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),V6=(()=>{class t{_contentObserver=f(LO);_elementRef=f(ee);event=new WA;get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._disabled?this._unsubscribe():this._subscribe()}_disabled=!1;get debounce(){return this._debounce}set debounce(A){this._debounce=zs(A),this._subscribe()}_debounce;_currentSubscription=null;constructor(){}ngAfterContentInit(){!this._currentSubscription&&!this.disabled&&this._subscribe()}ngOnDestroy(){this._unsubscribe()}_subscribe(){this._unsubscribe();let A=this._contentObserver.observe(this._elementRef);this._currentSubscription=(this.debounce?A.pipe(el(this.debounce)):A).subscribe(this.event)}_unsubscribe(){this._currentSubscription?.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","cdkObserveContent",""]],inputs:{disabled:[2,"cdkObserveContentDisabled","disabled",ie],debounce:"debounce"},outputs:{event:"cdkObserveContent"},exportAs:["cdkObserveContent"]})}return t})(),DB=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({providers:[xO]})}return t})();var FO=new Set,PI,GhA=(()=>{class t{_platform=f(Ii);_nonce=f(yh,{optional:!0});_matchMedia;constructor(){this._matchMedia=this._platform.isBrowser&&window.matchMedia?window.matchMedia.bind(window):KhA}matchMedia(A){return(this._platform.WEBKIT||this._platform.BLINK)&&UhA(A,this._nonce),this._matchMedia(A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function UhA(t,e){if(!FO.has(t))try{PI||(PI=document.createElement("style"),e&&PI.setAttribute("nonce",e),PI.setAttribute("type","text/css"),document.head.appendChild(PI)),PI.sheet&&(PI.sheet.insertRule(`@media ${t} {body{ }}`,0),FO.add(t))}catch(A){console.error(A)}}function KhA(t){return{matches:t==="all"||t==="",media:t,addListener:()=>{},removeListener:()=>{}}}var Z6=(()=>{class t{_mediaMatcher=f(GhA);_zone=f(Qe);_queries=new Map;_destroySubject=new OA;constructor(){}ngOnDestroy(){this._destroySubject.next(),this._destroySubject.complete()}isMatched(A){return NO(wB(A)).some(n=>this._registerQuery(n).mql.matches)}observe(A){let n=NO(wB(A)).map(r=>this._registerQuery(r).observable),o=Js(n);return o=d2(o.pipe(On(1)),o.pipe(CI(1),el(0))),o.pipe(je(r=>{let s={matches:!1,breakpoints:{}};return r.forEach(({matches:a,query:c})=>{s.matches=s.matches||a,s.breakpoints[c]=a}),s}))}_registerQuery(A){if(this._queries.has(A))return this._queries.get(A);let i=this._mediaMatcher.matchMedia(A),o={observable:new ct(r=>{let s=a=>this._zone.run(()=>r.next(a));return i.addListener(s),()=>{i.removeListener(s)}}).pipe(Pn(i),je(({matches:r})=>({query:A,matches:r})),St(this._destroySubject)),mql:i};return this._queries.set(A,o),o}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function NO(t){return t.map(e=>e.split(",")).reduce((e,A)=>e.concat(A)).map(e=>e.trim())}var _O={XSmall:"(max-width: 599.98px)",Small:"(min-width: 600px) and (max-width: 959.98px)",Medium:"(min-width: 960px) and (max-width: 1279.98px)",Large:"(min-width: 1280px) and (max-width: 1919.98px)",XLarge:"(min-width: 1920px)",Handset:"(max-width: 599.98px) and (orientation: portrait), (max-width: 959.98px) and (orientation: landscape)",Tablet:"(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait), (min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)",Web:"(min-width: 840px) and (orientation: portrait), (min-width: 1280px) and (orientation: landscape)",HandsetPortrait:"(max-width: 599.98px) and (orientation: portrait)",TabletPortrait:"(min-width: 600px) and (max-width: 839.98px) and (orientation: portrait)",WebPortrait:"(min-width: 840px) and (orientation: portrait)",HandsetLandscape:"(max-width: 959.98px) and (orientation: landscape)",TabletLandscape:"(min-width: 960px) and (max-width: 1279.98px) and (orientation: landscape)",WebLandscape:"(min-width: 1280px) and (orientation: landscape)"};var JO=" ";function Ek(t,e,A){let i=A8(t,e);A=A.trim(),!i.some(n=>n.trim()===A)&&(i.push(A),t.setAttribute(e,i.join(JO)))}function i8(t,e,A){let i=A8(t,e);A=A.trim();let n=i.filter(o=>o!==A);n.length?t.setAttribute(e,n.join(JO)):t.removeAttribute(e)}function A8(t,e){return t.getAttribute(e)?.match(/\S+/g)??[]}var TO="cdk-describedby-message",W6="cdk-describedby-host",Ik=0,HO=(()=>{class t{_platform=f(Ii);_document=f(at);_messageRegistry=new Map;_messagesContainer=null;_id=`${Ik++}`;constructor(){f(Rn).load(bu),this._id=f(Vd)+"-"+Ik++}describe(A,i,n){if(!this._canBeDescribed(A,i))return;let o=ck(i,n);typeof i!="string"?(GO(i,this._id),this._messageRegistry.set(o,{messageElement:i,referenceCount:0})):this._messageRegistry.has(o)||this._createMessageElement(i,n),this._isElementDescribedByMessage(A,o)||this._addMessageReference(A,o)}removeDescription(A,i,n){if(!i||!this._isElementNode(A))return;let o=ck(i,n);if(this._isElementDescribedByMessage(A,o)&&this._removeMessageReference(A,o),typeof i=="string"){let r=this._messageRegistry.get(o);r&&r.referenceCount===0&&this._deleteMessageElement(o)}this._messagesContainer?.childNodes.length===0&&(this._messagesContainer.remove(),this._messagesContainer=null)}ngOnDestroy(){let A=this._document.querySelectorAll(`[${W6}="${this._id}"]`);for(let i=0;in.indexOf(TO)!=0);A.setAttribute("aria-describedby",i.join(" "))}_addMessageReference(A,i){let n=this._messageRegistry.get(i);Ek(A,"aria-describedby",n.messageElement.id),A.setAttribute(W6,this._id),n.referenceCount++}_removeMessageReference(A,i){let n=this._messageRegistry.get(i);n.referenceCount--,i8(A,"aria-describedby",n.messageElement.id),A.removeAttribute(W6)}_isElementDescribedByMessage(A,i){let n=A8(A,"aria-describedby"),o=this._messageRegistry.get(i),r=o&&o.messageElement.id;return!!r&&n.indexOf(r)!=-1}_canBeDescribed(A,i){if(!this._isElementNode(A))return!1;if(i&&typeof i=="object")return!0;let n=i==null?"":`${i}`.trim(),o=A.getAttribute("aria-label");return n?!o||o.trim()!==n:!1}_isElementNode(A){return A.nodeType===this._document.ELEMENT_NODE}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function ck(t,e){return typeof t=="string"?`${e||""}/${t}`:t}function GO(t,e){t.id||(t.id=`${TO}-${e}-${Ik++}`)}var $hA=200,Ck=class{_letterKeyStream=new OA;_items=[];_selectedItemIndex=-1;_pressedLetters=[];_skipPredicateFn;_selectedItem=new OA;selectedItem=this._selectedItem;constructor(e,A){let i=typeof A?.debounceInterval=="number"?A.debounceInterval:$hA;A?.skipPredicate&&(this._skipPredicateFn=A.skipPredicate),this.setItems(e),this._setupKeyHandler(i)}destroy(){this._pressedLetters=[],this._letterKeyStream.complete(),this._selectedItem.complete()}setCurrentSelectedItemIndex(e){this._selectedItemIndex=e}setItems(e){this._items=e}handleKey(e){let A=e.keyCode;e.key&&e.key.length===1?this._letterKeyStream.next(e.key.toLocaleUpperCase()):(A>=65&&A<=90||A>=48&&A<=57)&&this._letterKeyStream.next(String.fromCharCode(A))}isTyping(){return this._pressedLetters.length>0}reset(){this._pressedLetters=[]}_setupKeyHandler(e){this._letterKeyStream.pipe(Qo(A=>this._pressedLetters.push(A)),el(e),kt(()=>this._pressedLetters.length>0),je(()=>this._pressedLetters.join("").toLocaleUpperCase())).subscribe(A=>{for(let i=1;ie.disabled;constructor(e,A){this._items=e,e instanceof ca?this._itemChangesSubscription=e.changes.subscribe(i=>this._itemsChanged(i.toArray())):p2(e)&&(this._effectRef=Nh(()=>this._itemsChanged(e()),{injector:A}))}tabOut=new OA;change=new OA;skipPredicate(e){return this._skipPredicateFn=e,this}withWrap(e=!0){return this._wrap=e,this}withVerticalOrientation(e=!0){return this._vertical=e,this}withHorizontalOrientation(e){return this._horizontal=e,this}withAllowedModifierKeys(e){return this._allowedModifierKeys=e,this}withTypeAhead(e=200){this._typeaheadSubscription.unsubscribe();let A=this._getItemsArray();return this._typeahead=new Ck(A,{debounceInterval:typeof e=="number"?e:void 0,skipPredicate:i=>this._skipPredicateFn(i)}),this._typeaheadSubscription=this._typeahead.selectedItem.subscribe(i=>{this.setActiveItem(i)}),this}cancelTypeahead(){return this._typeahead?.reset(),this}withHomeAndEnd(e=!0){return this._homeAndEnd=e,this}withPageUpDown(e=!0,A=10){return this._pageUpAndDown={enabled:e,delta:A},this}setActiveItem(e){let A=this._activeItem();this.updateActiveItem(e),this._activeItem()!==A&&this.change.next(this._activeItemIndex)}onKeydown(e){let A=e.keyCode,n=["altKey","ctrlKey","metaKey","shiftKey"].every(o=>!e[o]||this._allowedModifierKeys.indexOf(o)>-1);switch(A){case 9:this.tabOut.next();return;case 40:if(this._vertical&&n){this.setNextItemActive();break}else return;case 38:if(this._vertical&&n){this.setPreviousItemActive();break}else return;case 39:if(this._horizontal&&n){this._horizontal==="rtl"?this.setPreviousItemActive():this.setNextItemActive();break}else return;case 37:if(this._horizontal&&n){this._horizontal==="rtl"?this.setNextItemActive():this.setPreviousItemActive();break}else return;case 36:if(this._homeAndEnd&&n){this.setFirstItemActive();break}else return;case 35:if(this._homeAndEnd&&n){this.setLastItemActive();break}else return;case 33:if(this._pageUpAndDown.enabled&&n){let o=this._activeItemIndex-this._pageUpAndDown.delta;this._setActiveItemByIndex(o>0?o:0,1);break}else return;case 34:if(this._pageUpAndDown.enabled&&n){let o=this._activeItemIndex+this._pageUpAndDown.delta,r=this._getItemsArray().length;this._setActiveItemByIndex(o-1&&i!==this._activeItemIndex&&(this._activeItemIndex=i,this._typeahead?.setCurrentSelectedItemIndex(i))}}},t8=class extends e8{setActiveItem(e){this.activeItem&&this.activeItem.setInactiveStyles(),super.setActiveItem(e),this.activeItem&&this.activeItem.setActiveStyles()}},qI=class extends e8{_origin="program";setFocusOrigin(e){return this._origin=e,this}setActiveItem(e){super.setActiveItem(e),this.activeItem&&this.activeItem.focus(this._origin)}};var Mu=(()=>{class t{_platform=f(Ii);constructor(){}isDisabled(A){return A.hasAttribute("disabled")}isVisible(A){return euA(A)&&getComputedStyle(A).visibility==="visible"}isTabbable(A){if(!this._platform.isBrowser)return!1;let i=AuA(cuA(A));if(i&&(UO(i)===-1||!this.isVisible(i)))return!1;let n=A.nodeName.toLowerCase(),o=UO(A);return A.hasAttribute("contenteditable")?o!==-1:n==="iframe"||n==="object"||this._platform.WEBKIT&&this._platform.IOS&&!suA(A)?!1:n==="audio"?A.hasAttribute("controls")?o!==-1:!1:n==="video"?o===-1?!1:o!==null?!0:this._platform.FIREFOX||A.hasAttribute("controls"):A.tabIndex>=0}isFocusable(A,i){return auA(A)&&!this.isDisabled(A)&&(i?.ignoreVisibility||this.isVisible(A))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function AuA(t){try{return t.frameElement}catch{return null}}function euA(t){return!!(t.offsetWidth||t.offsetHeight||typeof t.getClientRects=="function"&&t.getClientRects().length)}function tuA(t){let e=t.nodeName.toLowerCase();return e==="input"||e==="select"||e==="button"||e==="textarea"}function iuA(t){return ouA(t)&&t.type=="hidden"}function nuA(t){return ruA(t)&&t.hasAttribute("href")}function ouA(t){return t.nodeName.toLowerCase()=="input"}function ruA(t){return t.nodeName.toLowerCase()=="a"}function zO(t){if(!t.hasAttribute("tabindex")||t.tabIndex===void 0)return!1;let e=t.getAttribute("tabindex");return!!(e&&!isNaN(parseInt(e,10)))}function UO(t){if(!zO(t))return null;let e=parseInt(t.getAttribute("tabindex")||"",10);return isNaN(e)?-1:e}function suA(t){let e=t.nodeName.toLowerCase(),A=e==="input"&&t.type;return A==="text"||A==="password"||e==="select"||e==="textarea"}function auA(t){return iuA(t)?!1:tuA(t)||nuA(t)||t.hasAttribute("contenteditable")||zO(t)}function cuA(t){return t.ownerDocument&&t.ownerDocument.defaultView||window}var dk=class{_element;_checker;_ngZone;_document;_injector;_startAnchor;_endAnchor;_hasAttached=!1;startAnchorListener=()=>this.focusLastTabbableElement();endAnchorListener=()=>this.focusFirstTabbableElement();get enabled(){return this._enabled}set enabled(e){this._enabled=e,this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(e,this._startAnchor),this._toggleAnchorTabIndex(e,this._endAnchor))}_enabled=!0;constructor(e,A,i,n,o=!1,r){this._element=e,this._checker=A,this._ngZone=i,this._document=n,this._injector=r,o||this.attachAnchors()}destroy(){let e=this._startAnchor,A=this._endAnchor;e&&(e.removeEventListener("focus",this.startAnchorListener),e.remove()),A&&(A.removeEventListener("focus",this.endAnchorListener),A.remove()),this._startAnchor=this._endAnchor=null,this._hasAttached=!1}attachAnchors(){return this._hasAttached?!0:(this._ngZone.runOutsideAngular(()=>{this._startAnchor||(this._startAnchor=this._createAnchor(),this._startAnchor.addEventListener("focus",this.startAnchorListener)),this._endAnchor||(this._endAnchor=this._createAnchor(),this._endAnchor.addEventListener("focus",this.endAnchorListener))}),this._element.parentNode&&(this._element.parentNode.insertBefore(this._startAnchor,this._element),this._element.parentNode.insertBefore(this._endAnchor,this._element.nextSibling),this._hasAttached=!0),this._hasAttached)}focusInitialElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusInitialElement(e)))})}focusFirstTabbableElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusFirstTabbableElement(e)))})}focusLastTabbableElementWhenReady(e){return new Promise(A=>{this._executeOnStable(()=>A(this.focusLastTabbableElement(e)))})}_getRegionBoundary(e){let A=this._element.querySelectorAll(`[cdk-focus-region-${e}], [cdkFocusRegion${e}], [cdk-focus-${e}]`);return e=="start"?A.length?A[0]:this._getFirstTabbableElement(this._element):A.length?A[A.length-1]:this._getLastTabbableElement(this._element)}focusInitialElement(e){let A=this._element.querySelector("[cdk-focus-initial], [cdkFocusInitial]");if(A){if(!this._checker.isFocusable(A)){let i=this._getFirstTabbableElement(A);return i?.focus(e),!!i}return A.focus(e),!0}return this.focusFirstTabbableElement(e)}focusFirstTabbableElement(e){let A=this._getRegionBoundary("start");return A&&A.focus(e),!!A}focusLastTabbableElement(e){let A=this._getRegionBoundary("end");return A&&A.focus(e),!!A}hasAttached(){return this._hasAttached}_getFirstTabbableElement(e){if(this._checker.isFocusable(e)&&this._checker.isTabbable(e))return e;let A=e.children;for(let i=0;i=0;i--){let n=A[i].nodeType===this._document.ELEMENT_NODE?this._getLastTabbableElement(A[i]):null;if(n)return n}return null}_createAnchor(){let e=this._document.createElement("div");return this._toggleAnchorTabIndex(this._enabled,e),e.classList.add("cdk-visually-hidden"),e.classList.add("cdk-focus-trap-anchor"),e.setAttribute("aria-hidden","true"),e}_toggleAnchorTabIndex(e,A){e?A.setAttribute("tabindex","0"):A.removeAttribute("tabindex")}toggleAnchors(e){this._startAnchor&&this._endAnchor&&(this._toggleAnchorTabIndex(e,this._startAnchor),this._toggleAnchorTabIndex(e,this._endAnchor))}_executeOnStable(e){this._injector?To(e,{injector:this._injector}):setTimeout(e)}},n8=(()=>{class t{_checker=f(Mu);_ngZone=f(Qe);_document=f(at);_injector=f(Rt);constructor(){f(Rn).load(bu)}create(A,i=!1){return new dk(A,this._checker,this._ngZone,this._document,i,this._injector)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function ku(t){return t.buttons===0||t.detail===0}function Su(t){let e=t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0];return!!e&&e.identifier===-1&&(e.radiusX==null||e.radiusX===1)&&(e.radiusY==null||e.radiusY===1)}var luA=new dA("cdk-input-modality-detector-options"),guA={ignoreKeys:[18,17,224,91,16]},OO=650,yB=bc({passive:!0,capture:!0}),IuA=(()=>{class t{_platform=f(Ii);modalityDetected;modalityChanged;get mostRecentModality(){return this._modality.value}_mostRecentTarget=null;_modality=new Mi(null);_options;_lastTouchMs=0;_onKeydown=A=>{this._options?.ignoreKeys?.some(i=>i===A.keyCode)||(this._modality.next("keyboard"),this._mostRecentTarget=oc(A))};_onMousedown=A=>{Date.now()-this._lastTouchMs{if(Su(A)){this._modality.next("keyboard");return}this._lastTouchMs=Date.now(),this._modality.next("touch"),this._mostRecentTarget=oc(A)};constructor(){let A=f(Qe),i=f(at),n=f(luA,{optional:!0});this._options=rA(rA({},guA),n),this.modalityDetected=this._modality.pipe(CI(1)),this.modalityChanged=this.modalityDetected.pipe(tl()),this._platform.isBrowser&&A.runOutsideAngular(()=>{i.addEventListener("keydown",this._onKeydown,yB),i.addEventListener("mousedown",this._onMousedown,yB),i.addEventListener("touchstart",this._onTouchstart,yB)})}ngOnDestroy(){this._modality.complete(),this._platform.isBrowser&&(document.removeEventListener("keydown",this._onKeydown,yB),document.removeEventListener("mousedown",this._onMousedown,yB),document.removeEventListener("touchstart",this._onTouchstart,yB))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),CuA=new dA("liveAnnouncerElement",{providedIn:"root",factory:duA});function duA(){return null}var BuA=new dA("LIVE_ANNOUNCER_DEFAULT_OPTIONS"),EuA=0,o8=(()=>{class t{_ngZone=f(Qe);_defaultOptions=f(BuA,{optional:!0});_liveElement;_document=f(at);_previousTimeout;_currentPromise;_currentResolve;constructor(){let A=f(CuA,{optional:!0});this._liveElement=A||this._createLiveElement()}announce(A,...i){let n=this._defaultOptions,o,r;return i.length===1&&typeof i[0]=="number"?r=i[0]:[o,r]=i,this.clear(),clearTimeout(this._previousTimeout),o||(o=n&&n.politeness?n.politeness:"polite"),r==null&&n&&(r=n.duration),this._liveElement.setAttribute("aria-live",o),this._liveElement.id&&this._exposeAnnouncerToModals(this._liveElement.id),this._ngZone.runOutsideAngular(()=>(this._currentPromise||(this._currentPromise=new Promise(s=>this._currentResolve=s)),clearTimeout(this._previousTimeout),this._previousTimeout=setTimeout(()=>{this._liveElement.textContent=A,typeof r=="number"&&(this._previousTimeout=setTimeout(()=>this.clear(),r)),this._currentResolve?.(),this._currentPromise=this._currentResolve=void 0},100),this._currentPromise))}clear(){this._liveElement&&(this._liveElement.textContent="")}ngOnDestroy(){clearTimeout(this._previousTimeout),this._liveElement?.remove(),this._liveElement=null,this._currentResolve?.(),this._currentPromise=this._currentResolve=void 0}_createLiveElement(){let A="cdk-live-announcer-element",i=this._document.getElementsByClassName(A),n=this._document.createElement("div");for(let o=0;o .cdk-overlay-container [aria-modal="true"]');for(let n=0;n{class t{_ngZone=f(Qe);_platform=f(Ii);_inputModalityDetector=f(IuA);_origin=null;_lastFocusOrigin;_windowFocused=!1;_windowFocusTimeoutId;_originTimeoutId;_originFromTouchInteraction=!1;_elementInfo=new Map;_monitoredElementCount=0;_rootNodeFocusListenerCount=new Map;_detectionMode;_windowFocusListener=()=>{this._windowFocused=!0,this._windowFocusTimeoutId=setTimeout(()=>this._windowFocused=!1)};_document=f(at,{optional:!0});_stopInputModalityDetector=new OA;constructor(){let A=f(QuA,{optional:!0});this._detectionMode=A?.detectionMode||$6.IMMEDIATE}_rootNodeFocusAndBlurListener=A=>{let i=oc(A);for(let n=i;n;n=n.parentElement)A.type==="focus"?this._onFocus(A,n):this._onBlur(A,n)};monitor(A,i=!1){let n=ua(A);if(!this._platform.isBrowser||n.nodeType!==1)return Me();let o=RO(n)||this._getDocument(),r=this._elementInfo.get(n);if(r)return i&&(r.checkChildren=!0),r.subject;let s={checkChildren:i,subject:new OA,rootNode:o};return this._elementInfo.set(n,s),this._registerGlobalListeners(s),s.subject}stopMonitoring(A){let i=ua(A),n=this._elementInfo.get(i);n&&(n.subject.complete(),this._setClasses(i),this._elementInfo.delete(i),this._removeGlobalListeners(n))}focusVia(A,i,n){let o=ua(A),r=this._getDocument().activeElement;o===r?this._getClosestElementsInfo(o).forEach(([s,a])=>this._originChanged(s,i,a)):(this._setOrigin(i),typeof o.focus=="function"&&o.focus(n))}ngOnDestroy(){this._elementInfo.forEach((A,i)=>this.stopMonitoring(i))}_getDocument(){return this._document||document}_getWindow(){return this._getDocument().defaultView||window}_getFocusOrigin(A){return this._origin?this._originFromTouchInteraction?this._shouldBeAttributedToTouch(A)?"touch":"program":this._origin:this._windowFocused&&this._lastFocusOrigin?this._lastFocusOrigin:A&&this._isLastInteractionFromInputLabel(A)?"mouse":"program"}_shouldBeAttributedToTouch(A){return this._detectionMode===$6.EVENTUAL||!!A?.contains(this._inputModalityDetector._mostRecentTarget)}_setClasses(A,i){A.classList.toggle("cdk-focused",!!i),A.classList.toggle("cdk-touch-focused",i==="touch"),A.classList.toggle("cdk-keyboard-focused",i==="keyboard"),A.classList.toggle("cdk-mouse-focused",i==="mouse"),A.classList.toggle("cdk-program-focused",i==="program")}_setOrigin(A,i=!1){this._ngZone.runOutsideAngular(()=>{if(this._origin=A,this._originFromTouchInteraction=A==="touch"&&i,this._detectionMode===$6.IMMEDIATE){clearTimeout(this._originTimeoutId);let n=this._originFromTouchInteraction?OO:1;this._originTimeoutId=setTimeout(()=>this._origin=null,n)}})}_onFocus(A,i){let n=this._elementInfo.get(i),o=oc(A);!n||!n.checkChildren&&i!==o||this._originChanged(i,this._getFocusOrigin(o),n)}_onBlur(A,i){let n=this._elementInfo.get(i);!n||n.checkChildren&&A.relatedTarget instanceof Node&&i.contains(A.relatedTarget)||(this._setClasses(i),this._emitOrigin(n,null))}_emitOrigin(A,i){A.subject.observers.length&&this._ngZone.run(()=>A.subject.next(i))}_registerGlobalListeners(A){if(!this._platform.isBrowser)return;let i=A.rootNode,n=this._rootNodeFocusListenerCount.get(i)||0;n||this._ngZone.runOutsideAngular(()=>{i.addEventListener("focus",this._rootNodeFocusAndBlurListener,X6),i.addEventListener("blur",this._rootNodeFocusAndBlurListener,X6)}),this._rootNodeFocusListenerCount.set(i,n+1),++this._monitoredElementCount===1&&(this._ngZone.runOutsideAngular(()=>{this._getWindow().addEventListener("focus",this._windowFocusListener)}),this._inputModalityDetector.modalityDetected.pipe(St(this._stopInputModalityDetector)).subscribe(o=>{this._setOrigin(o,!0)}))}_removeGlobalListeners(A){let i=A.rootNode;if(this._rootNodeFocusListenerCount.has(i)){let n=this._rootNodeFocusListenerCount.get(i);n>1?this._rootNodeFocusListenerCount.set(i,n-1):(i.removeEventListener("focus",this._rootNodeFocusAndBlurListener,X6),i.removeEventListener("blur",this._rootNodeFocusAndBlurListener,X6),this._rootNodeFocusListenerCount.delete(i))}--this._monitoredElementCount||(this._getWindow().removeEventListener("focus",this._windowFocusListener),this._stopInputModalityDetector.next(),clearTimeout(this._windowFocusTimeoutId),clearTimeout(this._originTimeoutId))}_originChanged(A,i,n){this._setClasses(A,i),this._emitOrigin(n,i),this._lastFocusOrigin=i}_getClosestElementsInfo(A){let i=[];return this._elementInfo.forEach((n,o)=>{(o===A||n.checkChildren&&o.contains(A))&&i.push([o,n])}),i}_isLastInteractionFromInputLabel(A){let{_mostRecentTarget:i,mostRecentModality:n}=this._inputModalityDetector;if(n!=="mouse"||!i||i===A||A.nodeName!=="INPUT"&&A.nodeName!=="TEXTAREA"||A.disabled)return!1;let o=A.labels;if(o){for(let r=0;r{class t{_elementRef=f(ee);_focusMonitor=f(dr);_monitorSubscription;_focusOrigin=null;cdkFocusChange=new WA;constructor(){}get focusOrigin(){return this._focusOrigin}ngAfterViewInit(){let A=this._elementRef.nativeElement;this._monitorSubscription=this._focusMonitor.monitor(A,A.nodeType===1&&A.hasAttribute("cdkMonitorSubtreeFocus")).subscribe(i=>{this._focusOrigin=i,this.cdkFocusChange.emit(i)})}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef),this._monitorSubscription&&this._monitorSubscription.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","cdkMonitorElementFocus",""],["","cdkMonitorSubtreeFocus",""]],outputs:{cdkFocusChange:"cdkFocusChange"},exportAs:["cdkMonitorFocus"]})}return t})(),jI=function(t){return t[t.NONE=0]="NONE",t[t.BLACK_ON_WHITE=1]="BLACK_ON_WHITE",t[t.WHITE_ON_BLACK=2]="WHITE_ON_BLACK",t}(jI||{}),KO="cdk-high-contrast-black-on-white",YO="cdk-high-contrast-white-on-black",lk="cdk-high-contrast-active",Qk=(()=>{class t{_platform=f(Ii);_hasCheckedHighContrastMode;_document=f(at);_breakpointSubscription;constructor(){this._breakpointSubscription=f(Z6).observe("(forced-colors: active)").subscribe(()=>{this._hasCheckedHighContrastMode&&(this._hasCheckedHighContrastMode=!1,this._applyBodyHighContrastModeCssClasses())})}getHighContrastMode(){if(!this._platform.isBrowser)return jI.NONE;let A=this._document.createElement("div");A.style.backgroundColor="rgb(1,2,3)",A.style.position="absolute",this._document.body.appendChild(A);let i=this._document.defaultView||window,n=i&&i.getComputedStyle?i.getComputedStyle(A):null,o=(n&&n.backgroundColor||"").replace(/ /g,"");switch(A.remove(),o){case"rgb(0,0,0)":case"rgb(45,50,54)":case"rgb(32,32,32)":return jI.WHITE_ON_BLACK;case"rgb(255,255,255)":case"rgb(255,250,239)":return jI.BLACK_ON_WHITE}return jI.NONE}ngOnDestroy(){this._breakpointSubscription.unsubscribe()}_applyBodyHighContrastModeCssClasses(){if(!this._hasCheckedHighContrastMode&&this._platform.isBrowser&&this._document.body){let A=this._document.body.classList;A.remove(lk,KO,YO),this._hasCheckedHighContrastMode=!0;let i=this.getHighContrastMode();i===jI.BLACK_ON_WHITE?A.add(lk,KO):i===jI.WHITE_ON_BLACK&&A.add(lk,YO)}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),r8=(()=>{class t{constructor(){f(Qk)._applyBodyHighContrastModeCssClasses()}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[DB]})}return t})(),gk={},sn=(()=>{class t{_appId=f(Vd);getId(A){return this._appId!=="ng"&&(A+=this._appId),gk.hasOwnProperty(A)||(gk[A]=0),`${A}${gk[A]++}`}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var huA=new dA("cdk-dir-doc",{providedIn:"root",factory:uuA});function uuA(){return f(at)}var fuA=/^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)/i;function muA(t){let e=t?.toLowerCase()||"";return e==="auto"&&typeof navigator<"u"&&navigator?.language?fuA.test(navigator.language)?"rtl":"ltr":e==="rtl"?"rtl":"ltr"}var mo=(()=>{class t{value="ltr";change=new WA;constructor(){let A=f(huA,{optional:!0});if(A){let i=A.body?A.body.dir:null,n=A.documentElement?A.documentElement.dir:null;this.value=muA(i||n||"ltr")}}ngOnDestroy(){this.change.complete()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var _2=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({})}return t})();var puA=["text"],wuA=[[["mat-icon"]],"*"],DuA=["mat-icon","*"];function yuA(t,e){if(t&1&&JA(0,"mat-pseudo-checkbox",1),t&2){let A=O();yA("disabled",A.disabled)("state",A.selected?"checked":"unchecked")}}function vuA(t,e){if(t&1&&JA(0,"mat-pseudo-checkbox",3),t&2){let A=O();yA("disabled",A.disabled)}}function buA(t,e){if(t&1&&(S(0,"span",4),AA(1),F()),t&2){let A=O();G(),Et("(",A.group.label,")")}}var MuA=["mat-internal-form-field",""],kuA=["*"];var it=(()=>{class t{constructor(){f(Qk)._applyBodyHighContrastModeCssClasses()}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[_2,_2]})}return t})(),$I=class{_defaultMatcher;ngControl;_parentFormGroup;_parentForm;_stateChanges;errorState=!1;matcher;constructor(e,A,i,n,o){this._defaultMatcher=e,this.ngControl=A,this._parentFormGroup=i,this._parentForm=n,this._stateChanges=o}updateErrorState(){let e=this.errorState,A=this._parentFormGroup||this._parentForm,i=this.matcher||this._defaultMatcher,n=this.ngControl?this.ngControl.control:null,o=i?.isErrorState(n,A)??!1;o!==e&&(this.errorState=o,this._stateChanges.next())}};var bB=(()=>{class t{isErrorState(A,i){return!!(A&&A.invalid&&(A.touched||i&&i.submitted))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),lr=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["structural-styles"]],decls:0,vars:0,template:function(i,n){},styles:['.mat-focus-indicator{position:relative}.mat-focus-indicator::before{top:0;left:0;right:0;bottom:0;position:absolute;box-sizing:border-box;pointer-events:none;display:var(--mat-focus-indicator-display, none);border-width:var(--mat-focus-indicator-border-width, 3px);border-style:var(--mat-focus-indicator-border-style, solid);border-color:var(--mat-focus-indicator-border-color, transparent);border-radius:var(--mat-focus-indicator-border-radius, 4px)}.mat-focus-indicator:focus::before{content:""}@media(forced-colors: active){html{--mat-focus-indicator-display: block}}'],encapsulation:2,changeDetection:0})}return t})();var Os=function(t){return t[t.FADING_IN=0]="FADING_IN",t[t.VISIBLE=1]="VISIBLE",t[t.FADING_OUT=2]="FADING_OUT",t[t.HIDDEN=3]="HIDDEN",t}(Os||{}),fk=class{_renderer;element;config;_animationForciblyDisabledThroughCss;state=Os.HIDDEN;constructor(e,A,i,n=!1){this._renderer=e,this.element=A,this.config=i,this._animationForciblyDisabledThroughCss=n}fadeOut(){this._renderer.fadeOutRipple(this)}},jO=bc({passive:!0,capture:!0}),mk=class{_events=new Map;addHandler(e,A,i,n){let o=this._events.get(A);if(o){let r=o.get(i);r?r.add(n):o.set(i,new Set([n]))}else this._events.set(A,new Map([[i,new Set([n])]])),e.runOutsideAngular(()=>{document.addEventListener(A,this._delegateEventHandler,jO)})}removeHandler(e,A,i){let n=this._events.get(e);if(!n)return;let o=n.get(A);o&&(o.delete(i),o.size===0&&n.delete(A),n.size===0&&(this._events.delete(e),document.removeEventListener(e,this._delegateEventHandler,jO)))}_delegateEventHandler=e=>{let A=oc(e);A&&this._events.get(e.type)?.forEach((i,n)=>{(n===A||n.contains(A))&&i.forEach(o=>o.handleEvent(e))})}},a8={enterDuration:225,exitDuration:150},SuA=800,qO=bc({passive:!0,capture:!0}),VO=["mousedown","touchstart"],ZO=["mouseup","mouseleave","touchend","touchcancel"],RuA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["ng-component"]],hostAttrs:["mat-ripple-style-loader",""],decls:0,vars:0,template:function(i,n){},styles:[".mat-ripple{overflow:hidden;position:relative}.mat-ripple:not(:empty){transform:translateZ(0)}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0, 0, 0.2, 1);transform:scale3d(0, 0, 0);background-color:var(--mat-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface) 10%, transparent))}@media(forced-colors: active){.mat-ripple-element{display:none}}.cdk-drag-preview .mat-ripple-element,.cdk-drag-placeholder .mat-ripple-element{display:none}"],encapsulation:2,changeDetection:0})}return t})(),vB=class t{_target;_ngZone;_platform;_containerElement;_triggerElement;_isPointerDown=!1;_activeRipples=new Map;_mostRecentTransientRipple;_lastTouchStartEvent;_pointerUpEventsRegistered=!1;_containerRect;static _eventManager=new mk;constructor(e,A,i,n,o){this._target=e,this._ngZone=A,this._platform=n,n.isBrowser&&(this._containerElement=ua(i)),o&&o.get(Rn).load(RuA)}fadeInRipple(e,A,i={}){let n=this._containerRect=this._containerRect||this._containerElement.getBoundingClientRect(),o=rA(rA({},a8),i.animation);i.centered&&(e=n.left+n.width/2,A=n.top+n.height/2);let r=i.radius||xuA(e,A,n),s=e-n.left,a=A-n.top,c=o.enterDuration,l=document.createElement("div");l.classList.add("mat-ripple-element"),l.style.left=`${s-r}px`,l.style.top=`${a-r}px`,l.style.height=`${r*2}px`,l.style.width=`${r*2}px`,i.color!=null&&(l.style.backgroundColor=i.color),l.style.transitionDuration=`${c}ms`,this._containerElement.appendChild(l);let I=window.getComputedStyle(l),C=I.transitionProperty,d=I.transitionDuration,B=C==="none"||d==="0s"||d==="0s, 0s"||n.width===0&&n.height===0,E=new fk(this,l,i,B);l.style.transform="scale3d(1, 1, 1)",E.state=Os.FADING_IN,i.persistent||(this._mostRecentTransientRipple=E);let h=null;return!B&&(c||o.exitDuration)&&this._ngZone.runOutsideAngular(()=>{let u=()=>{h&&(h.fallbackTimer=null),clearTimeout(L),this._finishRippleTransition(E)},D=()=>this._destroyRipple(E),L=setTimeout(D,c+100);l.addEventListener("transitionend",u),l.addEventListener("transitioncancel",D),h={onTransitionEnd:u,onTransitionCancel:D,fallbackTimer:L}}),this._activeRipples.set(E,h),(B||!c)&&this._finishRippleTransition(E),E}fadeOutRipple(e){if(e.state===Os.FADING_OUT||e.state===Os.HIDDEN)return;let A=e.element,i=rA(rA({},a8),e.config.animation);A.style.transitionDuration=`${i.exitDuration}ms`,A.style.opacity="0",e.state=Os.FADING_OUT,(e._animationForciblyDisabledThroughCss||!i.exitDuration)&&this._finishRippleTransition(e)}fadeOutAll(){this._getActiveRipples().forEach(e=>e.fadeOut())}fadeOutAllNonPersistent(){this._getActiveRipples().forEach(e=>{e.config.persistent||e.fadeOut()})}setupTriggerEvents(e){let A=ua(e);!this._platform.isBrowser||!A||A===this._triggerElement||(this._removeTriggerEvents(),this._triggerElement=A,VO.forEach(i=>{t._eventManager.addHandler(this._ngZone,i,A,this)}))}handleEvent(e){e.type==="mousedown"?this._onMousedown(e):e.type==="touchstart"?this._onTouchStart(e):this._onPointerUp(),this._pointerUpEventsRegistered||(this._ngZone.runOutsideAngular(()=>{ZO.forEach(A=>{this._triggerElement.addEventListener(A,this,qO)})}),this._pointerUpEventsRegistered=!0)}_finishRippleTransition(e){e.state===Os.FADING_IN?this._startFadeOutTransition(e):e.state===Os.FADING_OUT&&this._destroyRipple(e)}_startFadeOutTransition(e){let A=e===this._mostRecentTransientRipple,{persistent:i}=e.config;e.state=Os.VISIBLE,!i&&(!A||!this._isPointerDown)&&e.fadeOut()}_destroyRipple(e){let A=this._activeRipples.get(e)??null;this._activeRipples.delete(e),this._activeRipples.size||(this._containerRect=null),e===this._mostRecentTransientRipple&&(this._mostRecentTransientRipple=null),e.state=Os.HIDDEN,A!==null&&(e.element.removeEventListener("transitionend",A.onTransitionEnd),e.element.removeEventListener("transitioncancel",A.onTransitionCancel),A.fallbackTimer!==null&&clearTimeout(A.fallbackTimer)),e.element.remove()}_onMousedown(e){let A=ku(e),i=this._lastTouchStartEvent&&Date.now(){let A=e.state===Os.VISIBLE||e.config.terminateOnPointerUp&&e.state===Os.FADING_IN;!e.config.persistent&&A&&e.fadeOut()}))}_getActiveRipples(){return Array.from(this._activeRipples.keys())}_removeTriggerEvents(){let e=this._triggerElement;e&&(VO.forEach(A=>t._eventManager.removeHandler(A,e,this)),this._pointerUpEventsRegistered&&(ZO.forEach(A=>e.removeEventListener(A,this,qO)),this._pointerUpEventsRegistered=!1))}};function xuA(t,e,A){let i=Math.max(Math.abs(t-A.left),Math.abs(t-A.right)),n=Math.max(Math.abs(e-A.top),Math.abs(e-A.bottom));return Math.sqrt(i*i+n*n)}var G2=new dA("mat-ripple-global-options"),rs=(()=>{class t{_elementRef=f(ee);_animationMode=f(Si,{optional:!0});color;unbounded;centered;radius=0;animation;get disabled(){return this._disabled}set disabled(A){A&&this.fadeOutAllNonPersistent(),this._disabled=A,this._setupTriggerEventsIfEnabled()}_disabled=!1;get trigger(){return this._trigger||this._elementRef.nativeElement}set trigger(A){this._trigger=A,this._setupTriggerEventsIfEnabled()}_trigger;_rippleRenderer;_globalOptions;_isInitialized=!1;constructor(){let A=f(Qe),i=f(Ii),n=f(G2,{optional:!0}),o=f(Rt);this._globalOptions=n||{},this._rippleRenderer=new vB(this,A,this._elementRef,i,o)}ngOnInit(){this._isInitialized=!0,this._setupTriggerEventsIfEnabled()}ngOnDestroy(){this._rippleRenderer._removeTriggerEvents()}fadeOutAll(){this._rippleRenderer.fadeOutAll()}fadeOutAllNonPersistent(){this._rippleRenderer.fadeOutAllNonPersistent()}get rippleConfig(){return{centered:this.centered,radius:this.radius,color:this.color,animation:rA(rA(rA({},this._globalOptions.animation),this._animationMode==="NoopAnimations"?{enterDuration:0,exitDuration:0}:{}),this.animation),terminateOnPointerUp:this._globalOptions.terminateOnPointerUp}}get rippleDisabled(){return this.disabled||!!this._globalOptions.disabled}_setupTriggerEventsIfEnabled(){!this.disabled&&this._isInitialized&&this._rippleRenderer.setupTriggerEvents(this.trigger)}launch(A,i=0,n){return typeof A=="number"?this._rippleRenderer.fadeInRipple(A,i,rA(rA({},this.rippleConfig),n)):this._rippleRenderer.fadeInRipple(0,0,rA(rA({},this.rippleConfig),A))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","mat-ripple",""],["","matRipple",""]],hostAttrs:[1,"mat-ripple"],hostVars:2,hostBindings:function(i,n){i&2&&ue("mat-ripple-unbounded",n.unbounded)},inputs:{color:[0,"matRippleColor","color"],unbounded:[0,"matRippleUnbounded","unbounded"],centered:[0,"matRippleCentered","centered"],radius:[0,"matRippleRadius","radius"],animation:[0,"matRippleAnimation","animation"],disabled:[0,"matRippleDisabled","disabled"],trigger:[0,"matRippleTrigger","trigger"]},exportAs:["matRipple"]})}return t})(),Ps=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[it,it]})}return t})(),wk=(()=>{class t{_animationMode=f(Si,{optional:!0});state="unchecked";disabled=!1;appearance="full";constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-pseudo-checkbox"]],hostAttrs:[1,"mat-pseudo-checkbox"],hostVars:12,hostBindings:function(i,n){i&2&&ue("mat-pseudo-checkbox-indeterminate",n.state==="indeterminate")("mat-pseudo-checkbox-checked",n.state==="checked")("mat-pseudo-checkbox-disabled",n.disabled)("mat-pseudo-checkbox-minimal",n.appearance==="minimal")("mat-pseudo-checkbox-full",n.appearance==="full")("_mat-animation-noopable",n._animationMode==="NoopAnimations")},inputs:{state:"state",disabled:"disabled",appearance:"appearance"},decls:0,vars:0,template:function(i,n){},styles:['.mat-pseudo-checkbox{border-radius:2px;cursor:pointer;display:inline-block;vertical-align:middle;box-sizing:border-box;position:relative;flex-shrink:0;transition:border-color 90ms cubic-bezier(0, 0, 0.2, 0.1),background-color 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox::after{position:absolute;opacity:0;content:"";border-bottom:2px solid currentColor;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 0.1)}.mat-pseudo-checkbox._mat-animation-noopable{transition:none !important;animation:none !important}.mat-pseudo-checkbox._mat-animation-noopable::after{transition:none}.mat-pseudo-checkbox-disabled{cursor:default}.mat-pseudo-checkbox-indeterminate::after{left:1px;opacity:1;border-radius:2px}.mat-pseudo-checkbox-checked::after{left:1px;border-left:2px solid currentColor;transform:rotate(-45deg);opacity:1;box-sizing:content-box}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-minimal-pseudo-checkbox-selected-checkmark-color, var(--mat-sys-primary))}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-minimal-pseudo-checkbox-disabled-selected-checkmark-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full{border-color:var(--mat-full-pseudo-checkbox-unselected-icon-color, var(--mat-sys-on-surface-variant));border-width:2px;border-style:solid}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-disabled{border-color:var(--mat-full-pseudo-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate{background-color:var(--mat-full-pseudo-checkbox-selected-icon-color, var(--mat-sys-primary));border-color:rgba(0,0,0,0)}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{color:var(--mat-full-pseudo-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled{background-color:var(--mat-full-pseudo-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked.mat-pseudo-checkbox-disabled::after,.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate.mat-pseudo-checkbox-disabled::after{color:var(--mat-full-pseudo-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}.mat-pseudo-checkbox{width:18px;height:18px}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-checked::after{width:14px;height:6px;transform-origin:center;top:-4.2426406871px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-minimal.mat-pseudo-checkbox-indeterminate::after{top:8px;width:16px}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-checked::after{width:10px;height:4px;transform-origin:center;top:-2.8284271247px;left:0;bottom:0;right:0;margin:auto}.mat-pseudo-checkbox-full.mat-pseudo-checkbox-indeterminate::after{top:6px;width:12px}'],encapsulation:2,changeDetection:0})}return t})(),Dk=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[it]})}return t})(),yk=new dA("MAT_OPTION_PARENT_COMPONENT"),vk=new dA("MatOptgroup");var pk=class{source;isUserInput;constructor(e,A=!1){this.source=e,this.isUserInput=A}},U2=(()=>{class t{_element=f(ee);_changeDetectorRef=f(It);_parent=f(yk,{optional:!0});group=f(vk,{optional:!0});_signalDisableRipple=!1;_selected=!1;_active=!1;_disabled=!1;_mostRecentViewValue="";get multiple(){return this._parent&&this._parent.multiple}get selected(){return this._selected}value;id=f(sn).getId("mat-option-");get disabled(){return this.group&&this.group.disabled||this._disabled}set disabled(A){this._disabled=A}get disableRipple(){return this._signalDisableRipple?this._parent.disableRipple():!!this._parent?.disableRipple}get hideSingleSelectionIndicator(){return!!(this._parent&&this._parent.hideSingleSelectionIndicator)}onSelectionChange=new WA;_text;_stateChanges=new OA;constructor(){let A=f(Rn);A.load(lr),A.load(bu),this._signalDisableRipple=!!this._parent&&p2(this._parent.disableRipple)}get active(){return this._active}get viewValue(){return(this._text?.nativeElement.textContent||"").trim()}select(A=!0){this._selected||(this._selected=!0,this._changeDetectorRef.markForCheck(),A&&this._emitSelectionChangeEvent())}deselect(A=!0){this._selected&&(this._selected=!1,this._changeDetectorRef.markForCheck(),A&&this._emitSelectionChangeEvent())}focus(A,i){let n=this._getHostElement();typeof n.focus=="function"&&n.focus(i)}setActiveStyles(){this._active||(this._active=!0,this._changeDetectorRef.markForCheck())}setInactiveStyles(){this._active&&(this._active=!1,this._changeDetectorRef.markForCheck())}getLabel(){return this.viewValue}_handleKeydown(A){(A.keyCode===13||A.keyCode===32)&&!ir(A)&&(this._selectViaInteraction(),A.preventDefault())}_selectViaInteraction(){this.disabled||(this._selected=this.multiple?!this._selected:!0,this._changeDetectorRef.markForCheck(),this._emitSelectionChangeEvent(!0))}_getTabIndex(){return this.disabled?"-1":"0"}_getHostElement(){return this._element.nativeElement}ngAfterViewChecked(){if(this._selected){let A=this.viewValue;A!==this._mostRecentViewValue&&(this._mostRecentViewValue&&this._stateChanges.next(),this._mostRecentViewValue=A)}}ngOnDestroy(){this._stateChanges.complete()}_emitSelectionChangeEvent(A=!1){this.onSelectionChange.emit(new pk(this,A))}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-option"]],viewQuery:function(i,n){if(i&1&&Te(puA,7),i&2){let o;XA(o=$A())&&(n._text=o.first)}},hostAttrs:["role","option",1,"mat-mdc-option","mdc-list-item"],hostVars:11,hostBindings:function(i,n){i&1&&hA("click",function(){return n._selectViaInteraction()})("keydown",function(r){return n._handleKeydown(r)}),i&2&&(Hs("id",n.id),Ne("aria-selected",n.selected)("aria-disabled",n.disabled.toString()),ue("mdc-list-item--selected",n.selected)("mat-mdc-option-multiple",n.multiple)("mat-mdc-option-active",n.active)("mdc-list-item--disabled",n.disabled))},inputs:{value:"value",id:"id",disabled:[2,"disabled","disabled",ie]},outputs:{onSelectionChange:"onSelectionChange"},exportAs:["matOption"],ngContentSelectors:DuA,decls:8,vars:5,consts:[["text",""],["aria-hidden","true",1,"mat-mdc-option-pseudo-checkbox",3,"disabled","state"],[1,"mdc-list-item__primary-text"],["state","checked","aria-hidden","true","appearance","minimal",1,"mat-mdc-option-pseudo-checkbox",3,"disabled"],[1,"cdk-visually-hidden"],["aria-hidden","true","mat-ripple","",1,"mat-mdc-option-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled"]],template:function(i,n){i&1&&(jt(wuA),_A(0,yuA,1,2,"mat-pseudo-checkbox",1),Fe(1),S(2,"span",2,0),Fe(4,1),F(),_A(5,vuA,1,1,"mat-pseudo-checkbox",3)(6,buA,2,1,"span",4),JA(7,"div",5)),i&2&&(GA(n.multiple?0:-1),G(5),GA(!n.multiple&&n.selected&&!n.hideSingleSelectionIndicator?5:-1),G(),GA(n.group&&n.group._inert?6:-1),G(),yA("matRippleTrigger",n._getHostElement())("matRippleDisabled",n.disabled||n.disableRipple))},dependencies:[wk,rs],styles:['.mat-mdc-option{-webkit-user-select:none;user-select:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;min-height:48px;padding:0 16px;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0);color:var(--mat-option-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-option-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-option-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-option-label-text-size, var(--mat-sys-body-large-size));letter-spacing:var(--mat-option-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-option-label-text-weight, var(--mat-sys-body-large-weight))}.mat-mdc-option:hover:not(.mdc-list-item--disabled){background-color:var(--mat-option-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-option:focus.mdc-list-item,.mat-mdc-option.mat-mdc-option-active.mdc-list-item{background-color:var(--mat-option-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent));outline:0}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-multiple){background-color:var(--mat-option-selected-state-layer-color, var(--mat-sys-secondary-container))}.mat-mdc-option.mdc-list-item--selected:not(.mdc-list-item--disabled):not(.mat-mdc-option-multiple) .mdc-list-item__primary-text{color:var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option .mat-pseudo-checkbox{--mat-minimal-pseudo-checkbox-selected-checkmark-color: var(--mat-option-selected-state-label-text-color, var(--mat-sys-on-secondary-container))}.mat-mdc-option.mdc-list-item{align-items:center;background:rgba(0,0,0,0)}.mat-mdc-option.mdc-list-item--disabled{cursor:default;pointer-events:none}.mat-mdc-option.mdc-list-item--disabled .mat-mdc-option-pseudo-checkbox,.mat-mdc-option.mdc-list-item--disabled .mdc-list-item__primary-text,.mat-mdc-option.mdc-list-item--disabled>mat-icon{opacity:.38}.mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:32px}[dir=rtl] .mat-mdc-optgroup .mat-mdc-option:not(.mat-mdc-option-multiple){padding-left:16px;padding-right:32px}.mat-mdc-option .mat-icon,.mat-mdc-option .mat-pseudo-checkbox-full{margin-right:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-icon,[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-full{margin-right:0;margin-left:16px}.mat-mdc-option .mat-pseudo-checkbox-minimal{margin-left:16px;flex-shrink:0}[dir=rtl] .mat-mdc-option .mat-pseudo-checkbox-minimal{margin-right:16px;margin-left:0}.mat-mdc-option .mat-mdc-option-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-mdc-option .mdc-list-item__primary-text{white-space:normal;font-size:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;font-family:inherit;text-decoration:inherit;text-transform:inherit;margin-right:auto}[dir=rtl] .mat-mdc-option .mdc-list-item__primary-text{margin-right:0;margin-left:auto}@media(forced-colors: active){.mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{content:"";position:absolute;top:50%;right:16px;transform:translateY(-50%);width:10px;height:0;border-bottom:solid 10px;border-radius:10px}[dir=rtl] .mat-mdc-option.mdc-list-item--selected:not(:has(.mat-mdc-option-pseudo-checkbox))::after{right:auto;left:16px}}.mat-mdc-option-multiple{--mdc-list-list-item-selected-container-color:var(--mdc-list-list-item-container-color, transparent)}.mat-mdc-option-active .mat-focus-indicator::before{content:""}'],encapsulation:2,changeDetection:0})}return t})();function AP(t,e,A){if(A.length){let i=e.toArray(),n=A.toArray(),o=0;for(let r=0;rA+i?Math.max(0,t-i+e):A}var bk=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[Ps,it,Dk]})}return t})(),WO={capture:!0},XO=["focus","mousedown","mouseenter","touchstart"],hk="mat-ripple-loader-uninitialized",uk="mat-ripple-loader-class-name",$O="mat-ripple-loader-centered",s8="mat-ripple-loader-disabled",Mk=(()=>{class t{_document=f(at,{optional:!0});_animationMode=f(Si,{optional:!0});_globalRippleOptions=f(G2,{optional:!0});_platform=f(Ii);_ngZone=f(Qe);_injector=f(Rt);_hosts=new Map;constructor(){this._ngZone.runOutsideAngular(()=>{for(let A of XO)this._document?.addEventListener(A,this._onInteraction,WO)})}ngOnDestroy(){let A=this._hosts.keys();for(let i of A)this.destroyRipple(i);for(let i of XO)this._document?.removeEventListener(i,this._onInteraction,WO)}configureRipple(A,i){A.setAttribute(hk,this._globalRippleOptions?.namespace??""),(i.className||!A.hasAttribute(uk))&&A.setAttribute(uk,i.className||""),i.centered&&A.setAttribute($O,""),i.disabled&&A.setAttribute(s8,"")}setDisabled(A,i){let n=this._hosts.get(A);n?(n.target.rippleDisabled=i,!i&&!n.hasSetUpEvents&&(n.hasSetUpEvents=!0,n.renderer.setupTriggerEvents(A))):i?A.setAttribute(s8,""):A.removeAttribute(s8)}_onInteraction=A=>{let i=oc(A);if(i instanceof HTMLElement){let n=i.closest(`[${hk}="${this._globalRippleOptions?.namespace??""}"]`);n&&this._createRipple(n)}};_createRipple(A){if(!this._document||this._hosts.has(A))return;A.querySelector(".mat-ripple")?.remove();let i=this._document.createElement("span");i.classList.add("mat-ripple",A.getAttribute(uk)),A.append(i);let n=this._animationMode==="NoopAnimations",o=this._globalRippleOptions,r=n?0:o?.animation?.enterDuration??a8.enterDuration,s=n?0:o?.animation?.exitDuration??a8.exitDuration,a={rippleDisabled:n||o?.disabled||A.hasAttribute(s8),rippleConfig:{centered:A.hasAttribute($O),terminateOnPointerUp:o?.terminateOnPointerUp,animation:{enterDuration:r,exitDuration:s}}},c=new vB(a,this._ngZone,i,this._platform,this._injector),l=!a.rippleDisabled;l&&c.setupTriggerEvents(A),this._hosts.set(A,{target:a,renderer:c,hasSetUpEvents:l}),A.removeAttribute(hk)}destroyRipple(A){let i=this._hosts.get(A);i&&(i.renderer._removeTriggerEvents(),this._hosts.delete(A))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),MB=(()=>{class t{labelPosition;static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["div","mat-internal-form-field",""]],hostAttrs:[1,"mdc-form-field","mat-internal-form-field"],hostVars:2,hostBindings:function(i,n){i&2&&ue("mdc-form-field--align-end",n.labelPosition==="before")},inputs:{labelPosition:"labelPosition"},attrs:MuA,ngContentSelectors:kuA,decls:1,vars:0,template:function(i,n){i&1&&(jt(),Fe(0))},styles:[".mat-internal-form-field{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-flex;align-items:center;vertical-align:middle}.mat-internal-form-field>label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0;order:0}[dir=rtl] .mat-internal-form-field>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px}.mdc-form-field--align-end>label{margin-left:auto;margin-right:0;padding-left:0;padding-right:4px;order:-1}[dir=rtl] .mdc-form-field--align-end .mdc-form-field--align-end label{margin-left:0;margin-right:auto;padding-left:4px;padding-right:0}"],encapsulation:2,changeDetection:0})}return t})();var LuA=["mat-button",""],kk=[[["",8,"material-icons",3,"iconPositionEnd",""],["mat-icon",3,"iconPositionEnd",""],["","matButtonIcon","",3,"iconPositionEnd",""]],"*",[["","iconPositionEnd","",8,"material-icons"],["mat-icon","iconPositionEnd",""],["","matButtonIcon","","iconPositionEnd",""]]],Sk=[".material-icons:not([iconPositionEnd]), mat-icon:not([iconPositionEnd]), [matButtonIcon]:not([iconPositionEnd])","*",".material-icons[iconPositionEnd], mat-icon[iconPositionEnd], [matButtonIcon][iconPositionEnd]"];var FuA="@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-icon-button.mat-mdc-icon-button{outline:solid 1px}}",NuA=["mat-fab",""],_uA=["mat-mini-fab",""],GuA='.mat-mdc-fab-base{-webkit-user-select:none;user-select:none;position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:56px;height:56px;padding:0;border:none;fill:currentColor;text-decoration:none;cursor:pointer;-moz-appearance:none;-webkit-appearance:none;overflow:visible;transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1),opacity 15ms linear 30ms,transform 270ms 0ms cubic-bezier(0, 0, 0.2, 1);flex-shrink:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-fab-base .mat-mdc-button-ripple,.mat-mdc-fab-base .mat-mdc-button-persistent-ripple,.mat-mdc-fab-base .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-fab-base .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-fab-base .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-fab-base .mdc-button__label,.mat-mdc-fab-base .mat-icon{z-index:1;position:relative}.mat-mdc-fab-base .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute}.mat-mdc-fab-base:focus>.mat-focus-indicator::before{content:""}.mat-mdc-fab-base._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-fab-base::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mat-mdc-fab-base[hidden]{display:none}.mat-mdc-fab-base::-moz-focus-inner{padding:0;border:0}.mat-mdc-fab-base:active,.mat-mdc-fab-base:focus{outline:none}.mat-mdc-fab-base:hover{cursor:pointer}.mat-mdc-fab-base>svg{width:100%}.mat-mdc-fab-base .mat-icon,.mat-mdc-fab-base .material-icons{transition:transform 180ms 90ms cubic-bezier(0, 0, 0.2, 1);fill:currentColor;will-change:transform}.mat-mdc-fab-base .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-fab-base[disabled],.mat-mdc-fab-base.mat-mdc-button-disabled{cursor:default;pointer-events:none}.mat-mdc-fab-base[disabled],.mat-mdc-fab-base[disabled]:focus,.mat-mdc-fab-base.mat-mdc-button-disabled,.mat-mdc-fab-base.mat-mdc-button-disabled:focus{box-shadow:none}.mat-mdc-fab-base.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-fab{background-color:var(--mdc-fab-container-color, var(--mat-sys-primary-container));border-radius:var(--mdc-fab-container-shape, var(--mat-sys-corner-large));color:var(--mat-fab-foreground-color, var(--mat-sys-on-primary-container, inherit));box-shadow:var(--mdc-fab-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab:hover{box-shadow:var(--mdc-fab-hover-container-elevation-shadow, var(--mat-sys-level4))}.mat-mdc-fab:focus{box-shadow:var(--mdc-fab-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab:active,.mat-mdc-fab:focus:active{box-shadow:var(--mdc-fab-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab[disabled],.mat-mdc-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-fab-disabled-state-foreground-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-fab-disabled-state-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-fab .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:50%;width:48px;transform:translate(-50%, -50%);display:var(--mat-fab-touch-target-display, block)}.mat-mdc-fab .mat-ripple-element{background-color:var(--mat-fab-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-fab .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-state-layer-color, var(--mat-sys-on-primary-container))}.mat-mdc-fab.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-disabled-state-layer-color)}.mat-mdc-fab:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-fab.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-fab.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-fab.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-fab:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-mini-fab{width:40px;height:40px;background-color:var(--mdc-fab-small-container-color, var(--mat-sys-primary-container));border-radius:var(--mdc-fab-small-container-shape, var(--mat-sys-corner-medium));color:var(--mat-fab-small-foreground-color, var(--mat-sys-on-primary-container, inherit));box-shadow:var(--mdc-fab-small-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab:hover{box-shadow:var(--mdc-fab-small-hover-container-elevation-shadow, var(--mat-sys-level4))}.mat-mdc-mini-fab:focus{box-shadow:var(--mdc-fab-small-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab:active,.mat-mdc-mini-fab:focus:active{box-shadow:var(--mdc-fab-small-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab[disabled],.mat-mdc-mini-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-fab-small-disabled-state-foreground-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-fab-small-disabled-state-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-mini-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-mini-fab .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:50%;width:48px;transform:translate(-50%, -50%);display:var(--mat-fab-small-touch-target-display)}.mat-mdc-mini-fab .mat-ripple-element{background-color:var(--mat-fab-small-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-mini-fab .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-small-state-layer-color, var(--mat-sys-on-primary-container))}.mat-mdc-mini-fab.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-small-disabled-state-layer-color)}.mat-mdc-mini-fab:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-mini-fab.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-mini-fab.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-mini-fab.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-mini-fab:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-extended-fab{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;border-radius:24px;padding-left:20px;padding-right:20px;width:auto;max-width:100%;line-height:normal;height:var(--mdc-extended-fab-container-height, 56px);border-radius:var(--mdc-extended-fab-container-shape, var(--mat-sys-corner-large));font-family:var(--mdc-extended-fab-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-extended-fab-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mdc-extended-fab-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mdc-extended-fab-label-text-tracking, var(--mat-sys-label-large-tracking));box-shadow:var(--mdc-extended-fab-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab:hover{box-shadow:var(--mdc-extended-fab-hover-container-elevation-shadow, var(--mat-sys-level4))}.mat-mdc-extended-fab:focus{box-shadow:var(--mdc-extended-fab-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab:active,.mat-mdc-extended-fab:focus:active{box-shadow:var(--mdc-extended-fab-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab[disabled],.mat-mdc-extended-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none}.mat-mdc-extended-fab[disabled],.mat-mdc-extended-fab[disabled]:focus,.mat-mdc-extended-fab.mat-mdc-button-disabled,.mat-mdc-extended-fab.mat-mdc-button-disabled:focus{box-shadow:none}.mat-mdc-extended-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}[dir=rtl] .mat-mdc-extended-fab .mdc-button__label+.mat-icon,[dir=rtl] .mat-mdc-extended-fab .mdc-button__label+.material-icons,.mat-mdc-extended-fab>.mat-icon,.mat-mdc-extended-fab>.material-icons{margin-left:-8px;margin-right:12px}.mat-mdc-extended-fab .mdc-button__label+.mat-icon,.mat-mdc-extended-fab .mdc-button__label+.material-icons,[dir=rtl] .mat-mdc-extended-fab>.mat-icon,[dir=rtl] .mat-mdc-extended-fab>.material-icons{margin-left:12px;margin-right:-8px}.mat-mdc-extended-fab .mat-mdc-button-touch-target{width:100%}',UuA=["mat-icon-button",""],KuA=["*"];var YuA=new dA("MAT_BUTTON_CONFIG");var JuA=[{attribute:"mat-button",mdcClasses:["mdc-button","mat-mdc-button"]},{attribute:"mat-flat-button",mdcClasses:["mdc-button","mdc-button--unelevated","mat-mdc-unelevated-button"]},{attribute:"mat-raised-button",mdcClasses:["mdc-button","mdc-button--raised","mat-mdc-raised-button"]},{attribute:"mat-stroked-button",mdcClasses:["mdc-button","mdc-button--outlined","mat-mdc-outlined-button"]},{attribute:"mat-fab",mdcClasses:["mdc-fab","mat-mdc-fab-base","mat-mdc-fab"]},{attribute:"mat-mini-fab",mdcClasses:["mdc-fab","mat-mdc-fab-base","mdc-fab--mini","mat-mdc-mini-fab"]},{attribute:"mat-icon-button",mdcClasses:["mdc-icon-button","mat-mdc-icon-button"]}],l8=(()=>{class t{_elementRef=f(ee);_ngZone=f(Qe);_animationMode=f(Si,{optional:!0});_focusMonitor=f(dr);_rippleLoader=f(Mk);_isFab=!1;color;get disableRipple(){return this._disableRipple}set disableRipple(A){this._disableRipple=A,this._updateRippleDisabled()}_disableRipple=!1;get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._updateRippleDisabled()}_disabled=!1;ariaDisabled;disabledInteractive;constructor(){f(Rn).load(lr);let A=f(YuA,{optional:!0}),i=this._elementRef.nativeElement,n=i.classList;this.disabledInteractive=A?.disabledInteractive??!1,this.color=A?.color??null,this._rippleLoader?.configureRipple(i,{className:"mat-mdc-button-ripple"});for(let{attribute:o,mdcClasses:r}of JuA)i.hasAttribute(o)&&n.add(...r)}ngAfterViewInit(){this._focusMonitor.monitor(this._elementRef,!0)}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef),this._rippleLoader?.destroyRipple(this._elementRef.nativeElement)}focus(A="program",i){A?this._focusMonitor.focusVia(this._elementRef.nativeElement,A,i):this._elementRef.nativeElement.focus(i)}_getAriaDisabled(){return this.ariaDisabled!=null?this.ariaDisabled:this.disabled&&this.disabledInteractive?!0:null}_getDisabledAttribute(){return this.disabledInteractive||!this.disabled?null:!0}_updateRippleDisabled(){this._rippleLoader?.setDisabled(this._elementRef.nativeElement,this.disableRipple||this.disabled)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,inputs:{color:"color",disableRipple:[2,"disableRipple","disableRipple",ie],disabled:[2,"disabled","disabled",ie],ariaDisabled:[2,"aria-disabled","ariaDisabled",ie],disabledInteractive:[2,"disabledInteractive","disabledInteractive",ie]}})}return t})();var Dr=(()=>{class t extends l8{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275cmp=zA({type:t,selectors:[["button","mat-button",""],["button","mat-raised-button",""],["button","mat-flat-button",""],["button","mat-stroked-button",""]],hostVars:14,hostBindings:function(i,n){i&2&&(Ne("disabled",n._getDisabledAttribute())("aria-disabled",n._getAriaDisabled()),fo(n.color?"mat-"+n.color:""),ue("mat-mdc-button-disabled",n.disabled)("mat-mdc-button-disabled-interactive",n.disabledInteractive)("_mat-animation-noopable",n._animationMode==="NoopAnimations")("mat-unthemed",!n.color)("mat-mdc-button-base",!0))},exportAs:["matButton"],features:[lt],attrs:LuA,ngContentSelectors:Sk,decls:7,vars:4,consts:[[1,"mat-mdc-button-persistent-ripple"],[1,"mdc-button__label"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(i,n){i&1&&(jt(kk),JA(0,"span",0),Fe(1),S(2,"span",1),Fe(3,1),F(),Fe(4,2),JA(5,"span",2)(6,"span",3)),i&2&&ue("mdc-button__ripple",!n._isFab)("mdc-fab__ripple",n._isFab)},styles:['.mat-mdc-button-base{text-decoration:none}.mdc-button{-webkit-user-select:none;user-select:none;position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:64px;border:none;outline:none;line-height:inherit;-webkit-appearance:none;overflow:visible;vertical-align:middle;background:rgba(0,0,0,0);padding:0 8px}.mdc-button::-moz-focus-inner{padding:0;border:0}.mdc-button:active{outline:none}.mdc-button:hover{cursor:pointer}.mdc-button:disabled{cursor:default;pointer-events:none}.mdc-button[hidden]{display:none}.mdc-button .mdc-button__label{position:relative}.mat-mdc-button{padding:0 var(--mat-text-button-horizontal-padding, 12px);height:var(--mdc-text-button-container-height, 40px);font-family:var(--mdc-text-button-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-text-button-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mdc-text-button-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mdc-text-button-label-text-transform);font-weight:var(--mdc-text-button-label-text-weight, var(--mat-sys-label-large-weight))}.mat-mdc-button,.mat-mdc-button .mdc-button__ripple{border-radius:var(--mdc-text-button-container-shape, var(--mat-sys-corner-full))}.mat-mdc-button:not(:disabled){color:var(--mdc-text-button-label-text-color, var(--mat-sys-primary))}.mat-mdc-button[disabled],.mat-mdc-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-text-button-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-button:has(.material-icons,mat-icon,[matButtonIcon]){padding:0 var(--mat-text-button-with-icon-horizontal-padding, 16px)}.mat-mdc-button>.mat-icon{margin-right:var(--mat-text-button-icon-spacing, 8px);margin-left:var(--mat-text-button-icon-offset, -4px)}[dir=rtl] .mat-mdc-button>.mat-icon{margin-right:var(--mat-text-button-icon-offset, -4px);margin-left:var(--mat-text-button-icon-spacing, 8px)}.mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-text-button-icon-offset, -4px);margin-left:var(--mat-text-button-icon-spacing, 8px)}[dir=rtl] .mat-mdc-button .mdc-button__label+.mat-icon{margin-right:var(--mat-text-button-icon-spacing, 8px);margin-left:var(--mat-text-button-icon-offset, -4px)}.mat-mdc-button .mat-ripple-element{background-color:var(--mat-text-button-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-text-button-state-layer-color, var(--mat-sys-primary))}.mat-mdc-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-text-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-text-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-text-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-text-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:0;right:0;transform:translateY(-50%);display:var(--mat-text-button-touch-target-display, block)}.mat-mdc-unelevated-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mdc-filled-button-container-height, 40px);font-family:var(--mdc-filled-button-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-filled-button-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mdc-filled-button-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mdc-filled-button-label-text-transform);font-weight:var(--mdc-filled-button-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-filled-button-horizontal-padding, 24px)}.mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-filled-button-icon-spacing, 8px);margin-left:var(--mat-filled-button-icon-offset, -8px)}[dir=rtl] .mat-mdc-unelevated-button>.mat-icon{margin-right:var(--mat-filled-button-icon-offset, -8px);margin-left:var(--mat-filled-button-icon-spacing, 8px)}.mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-filled-button-icon-offset, -8px);margin-left:var(--mat-filled-button-icon-spacing, 8px)}[dir=rtl] .mat-mdc-unelevated-button .mdc-button__label+.mat-icon{margin-right:var(--mat-filled-button-icon-spacing, 8px);margin-left:var(--mat-filled-button-icon-offset, -8px)}.mat-mdc-unelevated-button .mat-ripple-element{background-color:var(--mat-filled-button-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-filled-button-state-layer-color, var(--mat-sys-on-primary))}.mat-mdc-unelevated-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-filled-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-unelevated-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-filled-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-unelevated-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-filled-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-unelevated-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-filled-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-unelevated-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:0;right:0;transform:translateY(-50%);display:var(--mat-filled-button-touch-target-display, block)}.mat-mdc-unelevated-button:not(:disabled){color:var(--mdc-filled-button-label-text-color, var(--mat-sys-on-primary));background-color:var(--mdc-filled-button-container-color, var(--mat-sys-primary))}.mat-mdc-unelevated-button,.mat-mdc-unelevated-button .mdc-button__ripple{border-radius:var(--mdc-filled-button-container-shape, var(--mat-sys-corner-full))}.mat-mdc-unelevated-button[disabled],.mat-mdc-unelevated-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-filled-button-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mdc-filled-button-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-unelevated-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-raised-button{transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);box-shadow:var(--mdc-protected-button-container-elevation-shadow, var(--mat-sys-level1));height:var(--mdc-protected-button-container-height, 40px);font-family:var(--mdc-protected-button-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-protected-button-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mdc-protected-button-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mdc-protected-button-label-text-transform);font-weight:var(--mdc-protected-button-label-text-weight, var(--mat-sys-label-large-weight));padding:0 var(--mat-protected-button-horizontal-padding, 24px)}.mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-protected-button-icon-spacing, 8px);margin-left:var(--mat-protected-button-icon-offset, -8px)}[dir=rtl] .mat-mdc-raised-button>.mat-icon{margin-right:var(--mat-protected-button-icon-offset, -8px);margin-left:var(--mat-protected-button-icon-spacing, 8px)}.mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-protected-button-icon-offset, -8px);margin-left:var(--mat-protected-button-icon-spacing, 8px)}[dir=rtl] .mat-mdc-raised-button .mdc-button__label+.mat-icon{margin-right:var(--mat-protected-button-icon-spacing, 8px);margin-left:var(--mat-protected-button-icon-offset, -8px)}.mat-mdc-raised-button .mat-ripple-element{background-color:var(--mat-protected-button-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-protected-button-state-layer-color, var(--mat-sys-primary))}.mat-mdc-raised-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-protected-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-raised-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-protected-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-raised-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-protected-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-raised-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-protected-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-raised-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:0;right:0;transform:translateY(-50%);display:var(--mat-protected-button-touch-target-display, block)}.mat-mdc-raised-button:not(:disabled){color:var(--mdc-protected-button-label-text-color, var(--mat-sys-primary));background-color:var(--mdc-protected-button-container-color, var(--mat-sys-surface))}.mat-mdc-raised-button,.mat-mdc-raised-button .mdc-button__ripple{border-radius:var(--mdc-protected-button-container-shape, var(--mat-sys-corner-full))}.mat-mdc-raised-button:hover{box-shadow:var(--mdc-protected-button-hover-container-elevation-shadow, var(--mat-sys-level2))}.mat-mdc-raised-button:focus{box-shadow:var(--mdc-protected-button-focus-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button:active,.mat-mdc-raised-button:focus:active{box-shadow:var(--mdc-protected-button-pressed-container-elevation-shadow, var(--mat-sys-level1))}.mat-mdc-raised-button[disabled],.mat-mdc-raised-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-protected-button-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mdc-protected-button-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-raised-button[disabled].mat-mdc-button-disabled,.mat-mdc-raised-button.mat-mdc-button-disabled.mat-mdc-button-disabled{box-shadow:var(--mdc-protected-button-disabled-container-elevation-shadow, var(--mat-sys-level0))}.mat-mdc-raised-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-outlined-button{border-style:solid;transition:border 280ms cubic-bezier(0.4, 0, 0.2, 1);height:var(--mdc-outlined-button-container-height, 40px);font-family:var(--mdc-outlined-button-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-outlined-button-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mdc-outlined-button-label-text-tracking, var(--mat-sys-label-large-tracking));text-transform:var(--mdc-outlined-button-label-text-transform);font-weight:var(--mdc-outlined-button-label-text-weight, var(--mat-sys-label-large-weight));border-radius:var(--mdc-outlined-button-container-shape, var(--mat-sys-corner-full));border-width:var(--mdc-outlined-button-outline-width, 1px);padding:0 var(--mat-outlined-button-horizontal-padding, 24px)}.mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-outlined-button-icon-spacing, 8px);margin-left:var(--mat-outlined-button-icon-offset, -8px)}[dir=rtl] .mat-mdc-outlined-button>.mat-icon{margin-right:var(--mat-outlined-button-icon-offset, -8px);margin-left:var(--mat-outlined-button-icon-spacing, 8px)}.mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-outlined-button-icon-offset, -8px);margin-left:var(--mat-outlined-button-icon-spacing, 8px)}[dir=rtl] .mat-mdc-outlined-button .mdc-button__label+.mat-icon{margin-right:var(--mat-outlined-button-icon-spacing, 8px);margin-left:var(--mat-outlined-button-icon-offset, -8px)}.mat-mdc-outlined-button .mat-ripple-element{background-color:var(--mat-outlined-button-ripple-color, color-mix(in srgb, var(--mat-sys-primary) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-outlined-button-state-layer-color, var(--mat-sys-primary))}.mat-mdc-outlined-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-outlined-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-outlined-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-outlined-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-outlined-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-outlined-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-outlined-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-outlined-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-outlined-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:0;right:0;transform:translateY(-50%);display:var(--mat-outlined-button-touch-target-display, block)}.mat-mdc-outlined-button:not(:disabled){color:var(--mdc-outlined-button-label-text-color, var(--mat-sys-primary));border-color:var(--mdc-outlined-button-outline-color, var(--mat-sys-outline))}.mat-mdc-outlined-button[disabled],.mat-mdc-outlined-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-outlined-button-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:var(--mdc-outlined-button-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-outlined-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-outlined-button .mdc-button__ripple{border-width:var(--mdc-outlined-button-outline-width, 1px);border-style:solid;border-color:rgba(0,0,0,0)}.mat-mdc-button,.mat-mdc-unelevated-button,.mat-mdc-raised-button,.mat-mdc-outlined-button{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple,.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-button .mat-mdc-button-ripple,.mat-mdc-unelevated-button .mat-mdc-button-ripple,.mat-mdc-raised-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-unelevated-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-raised-button .mat-mdc-button-persistent-ripple::before,.mat-mdc-outlined-button .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-button .mdc-button__label,.mat-mdc-button .mat-icon,.mat-mdc-unelevated-button .mdc-button__label,.mat-mdc-unelevated-button .mat-icon,.mat-mdc-raised-button .mdc-button__label,.mat-mdc-raised-button .mat-icon,.mat-mdc-outlined-button .mdc-button__label,.mat-mdc-outlined-button .mat-icon{z-index:1;position:relative}.mat-mdc-button .mat-focus-indicator,.mat-mdc-unelevated-button .mat-focus-indicator,.mat-mdc-raised-button .mat-focus-indicator,.mat-mdc-outlined-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute}.mat-mdc-button:focus>.mat-focus-indicator::before,.mat-mdc-unelevated-button:focus>.mat-focus-indicator::before,.mat-mdc-raised-button:focus>.mat-focus-indicator::before,.mat-mdc-outlined-button:focus>.mat-focus-indicator::before{content:""}.mat-mdc-button._mat-animation-noopable,.mat-mdc-unelevated-button._mat-animation-noopable,.mat-mdc-raised-button._mat-animation-noopable,.mat-mdc-outlined-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-button>.mat-icon,.mat-mdc-unelevated-button>.mat-icon,.mat-mdc-raised-button>.mat-icon,.mat-mdc-outlined-button>.mat-icon{display:inline-block;position:relative;vertical-align:top;font-size:1.125rem;height:1.125rem;width:1.125rem}.mat-mdc-outlined-button .mat-mdc-button-ripple,.mat-mdc-outlined-button .mdc-button__ripple{top:-1px;left:-1px;bottom:-1px;right:-1px}.mat-mdc-unelevated-button .mat-focus-indicator::before,.mat-mdc-raised-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-outlined-button .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 3px)*-1)}',"@media(forced-colors: active){.mat-mdc-button:not(.mdc-button--outlined),.mat-mdc-unelevated-button:not(.mdc-button--outlined),.mat-mdc-raised-button:not(.mdc-button--outlined),.mat-mdc-outlined-button:not(.mdc-button--outlined),.mat-mdc-icon-button.mat-mdc-icon-button{outline:solid 1px}}"],encapsulation:2,changeDetection:0})}return t})();var iP=new dA("mat-mdc-fab-default-options",{providedIn:"root",factory:nP});function nP(){return{color:"accent"}}var c8=nP(),oP=(()=>{class t extends l8{_options=f(iP,{optional:!0});_isFab=!0;extended;constructor(){super(),this._options=this._options||c8,this.color=this._options.color||c8.color}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["button","mat-fab",""]],hostVars:18,hostBindings:function(i,n){i&2&&(Ne("disabled",n._getDisabledAttribute())("aria-disabled",n._getAriaDisabled()),fo(n.color?"mat-"+n.color:""),ue("mat-mdc-button-disabled",n.disabled)("mat-mdc-button-disabled-interactive",n.disabledInteractive)("_mat-animation-noopable",n._animationMode==="NoopAnimations")("mat-unthemed",!n.color)("mat-mdc-button-base",!0)("mdc-fab--extended",n.extended)("mat-mdc-extended-fab",n.extended))},inputs:{extended:[2,"extended","extended",ie]},exportAs:["matButton"],features:[lt],attrs:NuA,ngContentSelectors:Sk,decls:7,vars:4,consts:[[1,"mat-mdc-button-persistent-ripple"],[1,"mdc-button__label"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(i,n){i&1&&(jt(kk),JA(0,"span",0),Fe(1),S(2,"span",1),Fe(3,1),F(),Fe(4,2),JA(5,"span",2)(6,"span",3)),i&2&&ue("mdc-button__ripple",!n._isFab)("mdc-fab__ripple",n._isFab)},styles:['.mat-mdc-fab-base{-webkit-user-select:none;user-select:none;position:relative;display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;width:56px;height:56px;padding:0;border:none;fill:currentColor;text-decoration:none;cursor:pointer;-moz-appearance:none;-webkit-appearance:none;overflow:visible;transition:box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1),opacity 15ms linear 30ms,transform 270ms 0ms cubic-bezier(0, 0, 0.2, 1);flex-shrink:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-fab-base .mat-mdc-button-ripple,.mat-mdc-fab-base .mat-mdc-button-persistent-ripple,.mat-mdc-fab-base .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-fab-base .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-fab-base .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-fab-base .mdc-button__label,.mat-mdc-fab-base .mat-icon{z-index:1;position:relative}.mat-mdc-fab-base .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute}.mat-mdc-fab-base:focus>.mat-focus-indicator::before{content:""}.mat-mdc-fab-base._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-fab-base::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mat-mdc-fab-base[hidden]{display:none}.mat-mdc-fab-base::-moz-focus-inner{padding:0;border:0}.mat-mdc-fab-base:active,.mat-mdc-fab-base:focus{outline:none}.mat-mdc-fab-base:hover{cursor:pointer}.mat-mdc-fab-base>svg{width:100%}.mat-mdc-fab-base .mat-icon,.mat-mdc-fab-base .material-icons{transition:transform 180ms 90ms cubic-bezier(0, 0, 0.2, 1);fill:currentColor;will-change:transform}.mat-mdc-fab-base .mat-focus-indicator::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 2px)*-1)}.mat-mdc-fab-base[disabled],.mat-mdc-fab-base.mat-mdc-button-disabled{cursor:default;pointer-events:none}.mat-mdc-fab-base[disabled],.mat-mdc-fab-base[disabled]:focus,.mat-mdc-fab-base.mat-mdc-button-disabled,.mat-mdc-fab-base.mat-mdc-button-disabled:focus{box-shadow:none}.mat-mdc-fab-base.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-fab{background-color:var(--mdc-fab-container-color, var(--mat-sys-primary-container));border-radius:var(--mdc-fab-container-shape, var(--mat-sys-corner-large));color:var(--mat-fab-foreground-color, var(--mat-sys-on-primary-container, inherit));box-shadow:var(--mdc-fab-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab:hover{box-shadow:var(--mdc-fab-hover-container-elevation-shadow, var(--mat-sys-level4))}.mat-mdc-fab:focus{box-shadow:var(--mdc-fab-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab:active,.mat-mdc-fab:focus:active{box-shadow:var(--mdc-fab-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-fab[disabled],.mat-mdc-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-fab-disabled-state-foreground-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-fab-disabled-state-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-fab .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:50%;width:48px;transform:translate(-50%, -50%);display:var(--mat-fab-touch-target-display, block)}.mat-mdc-fab .mat-ripple-element{background-color:var(--mat-fab-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-fab .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-state-layer-color, var(--mat-sys-on-primary-container))}.mat-mdc-fab.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-disabled-state-layer-color)}.mat-mdc-fab:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-fab.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-fab.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-fab.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-fab:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-mini-fab{width:40px;height:40px;background-color:var(--mdc-fab-small-container-color, var(--mat-sys-primary-container));border-radius:var(--mdc-fab-small-container-shape, var(--mat-sys-corner-medium));color:var(--mat-fab-small-foreground-color, var(--mat-sys-on-primary-container, inherit));box-shadow:var(--mdc-fab-small-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab:hover{box-shadow:var(--mdc-fab-small-hover-container-elevation-shadow, var(--mat-sys-level4))}.mat-mdc-mini-fab:focus{box-shadow:var(--mdc-fab-small-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab:active,.mat-mdc-mini-fab:focus:active{box-shadow:var(--mdc-fab-small-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-mini-fab[disabled],.mat-mdc-mini-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mat-fab-small-disabled-state-foreground-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-fab-small-disabled-state-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-mdc-mini-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-mini-fab .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:50%;width:48px;transform:translate(-50%, -50%);display:var(--mat-fab-small-touch-target-display)}.mat-mdc-mini-fab .mat-ripple-element{background-color:var(--mat-fab-small-ripple-color, color-mix(in srgb, var(--mat-sys-on-primary-container) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-mini-fab .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-small-state-layer-color, var(--mat-sys-on-primary-container))}.mat-mdc-mini-fab.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-fab-small-disabled-state-layer-color)}.mat-mdc-mini-fab:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-mini-fab.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-mini-fab.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-mini-fab.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-mini-fab:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-fab-small-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-extended-fab{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;border-radius:24px;padding-left:20px;padding-right:20px;width:auto;max-width:100%;line-height:normal;height:var(--mdc-extended-fab-container-height, 56px);border-radius:var(--mdc-extended-fab-container-shape, var(--mat-sys-corner-large));font-family:var(--mdc-extended-fab-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mdc-extended-fab-label-text-size, var(--mat-sys-label-large-size));font-weight:var(--mdc-extended-fab-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mdc-extended-fab-label-text-tracking, var(--mat-sys-label-large-tracking));box-shadow:var(--mdc-extended-fab-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab:hover{box-shadow:var(--mdc-extended-fab-hover-container-elevation-shadow, var(--mat-sys-level4))}.mat-mdc-extended-fab:focus{box-shadow:var(--mdc-extended-fab-focus-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab:active,.mat-mdc-extended-fab:focus:active{box-shadow:var(--mdc-extended-fab-pressed-container-elevation-shadow, var(--mat-sys-level3))}.mat-mdc-extended-fab[disabled],.mat-mdc-extended-fab.mat-mdc-button-disabled{cursor:default;pointer-events:none}.mat-mdc-extended-fab[disabled],.mat-mdc-extended-fab[disabled]:focus,.mat-mdc-extended-fab.mat-mdc-button-disabled,.mat-mdc-extended-fab.mat-mdc-button-disabled:focus{box-shadow:none}.mat-mdc-extended-fab.mat-mdc-button-disabled-interactive{pointer-events:auto}[dir=rtl] .mat-mdc-extended-fab .mdc-button__label+.mat-icon,[dir=rtl] .mat-mdc-extended-fab .mdc-button__label+.material-icons,.mat-mdc-extended-fab>.mat-icon,.mat-mdc-extended-fab>.material-icons{margin-left:-8px;margin-right:12px}.mat-mdc-extended-fab .mdc-button__label+.mat-icon,.mat-mdc-extended-fab .mdc-button__label+.material-icons,[dir=rtl] .mat-mdc-extended-fab>.mat-icon,[dir=rtl] .mat-mdc-extended-fab>.material-icons{margin-left:12px;margin-right:-8px}.mat-mdc-extended-fab .mat-mdc-button-touch-target{width:100%}'],encapsulation:2,changeDetection:0})}return t})(),rP=(()=>{class t extends l8{_options=f(iP,{optional:!0});_isFab=!0;constructor(){super(),this._options=this._options||c8,this.color=this._options.color||c8.color}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["button","mat-mini-fab",""]],hostVars:14,hostBindings:function(i,n){i&2&&(Ne("disabled",n._getDisabledAttribute())("aria-disabled",n._getAriaDisabled()),fo(n.color?"mat-"+n.color:""),ue("mat-mdc-button-disabled",n.disabled)("mat-mdc-button-disabled-interactive",n.disabledInteractive)("_mat-animation-noopable",n._animationMode==="NoopAnimations")("mat-unthemed",!n.color)("mat-mdc-button-base",!0))},exportAs:["matButton"],features:[lt],attrs:_uA,ngContentSelectors:Sk,decls:7,vars:4,consts:[[1,"mat-mdc-button-persistent-ripple"],[1,"mdc-button__label"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(i,n){i&1&&(jt(kk),JA(0,"span",0),Fe(1),S(2,"span",1),Fe(3,1),F(),Fe(4,2),JA(5,"span",2)(6,"span",3)),i&2&&ue("mdc-button__ripple",!n._isFab)("mdc-fab__ripple",n._isFab)},styles:[GuA],encapsulation:2,changeDetection:0})}return t})();var kB=(()=>{class t extends l8{constructor(){super(),this._rippleLoader.configureRipple(this._elementRef.nativeElement,{centered:!0})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["button","mat-icon-button",""]],hostVars:14,hostBindings:function(i,n){i&2&&(Ne("disabled",n._getDisabledAttribute())("aria-disabled",n._getAriaDisabled()),fo(n.color?"mat-"+n.color:""),ue("mat-mdc-button-disabled",n.disabled)("mat-mdc-button-disabled-interactive",n.disabledInteractive)("_mat-animation-noopable",n._animationMode==="NoopAnimations")("mat-unthemed",!n.color)("mat-mdc-button-base",!0))},exportAs:["matButton"],features:[lt],attrs:UuA,ngContentSelectors:KuA,decls:4,vars:0,consts:[[1,"mat-mdc-button-persistent-ripple","mdc-icon-button__ripple"],[1,"mat-focus-indicator"],[1,"mat-mdc-button-touch-target"]],template:function(i,n){i&1&&(jt(),JA(0,"span",0),Fe(1),JA(2,"span",1)(3,"span",2))},styles:['.mat-mdc-icon-button{-webkit-user-select:none;user-select:none;display:inline-block;position:relative;box-sizing:border-box;border:none;outline:none;background-color:rgba(0,0,0,0);fill:currentColor;color:inherit;text-decoration:none;cursor:pointer;z-index:0;overflow:visible;border-radius:50%;flex-shrink:0;text-align:center;width:var(--mdc-icon-button-state-layer-size, 40px);height:var(--mdc-icon-button-state-layer-size, 40px);padding:calc(calc(var(--mdc-icon-button-state-layer-size, 40px) - var(--mdc-icon-button-icon-size, 24px)) / 2);font-size:var(--mdc-icon-button-icon-size, 24px);color:var(--mdc-icon-button-icon-color, var(--mat-sys-on-surface-variant));-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-icon-button .mat-mdc-button-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple,.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:inherit}.mat-mdc-icon-button .mat-mdc-button-ripple{overflow:hidden}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{content:"";opacity:0}.mat-mdc-icon-button .mdc-button__label,.mat-mdc-icon-button .mat-icon{z-index:1;position:relative}.mat-mdc-icon-button .mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute}.mat-mdc-icon-button:focus>.mat-focus-indicator::before{content:""}.mat-mdc-icon-button .mat-ripple-element{background-color:var(--mat-icon-button-ripple-color, color-mix(in srgb, var(--mat-sys-on-surface-variant) calc(var(--mat-sys-pressed-state-layer-opacity) * 100%), transparent))}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button.mat-mdc-button-disabled .mat-mdc-button-persistent-ripple::before{background-color:var(--mat-icon-button-disabled-state-layer-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button:hover>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-icon-button.cdk-program-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.cdk-keyboard-focused>.mat-mdc-button-persistent-ripple::before,.mat-mdc-icon-button.mat-mdc-button-disabled-interactive:focus>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mat-mdc-icon-button:active>.mat-mdc-button-persistent-ripple::before{opacity:var(--mat-icon-button-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity))}.mat-mdc-icon-button .mat-mdc-button-touch-target{position:absolute;top:50%;height:48px;left:50%;width:48px;transform:translate(-50%, -50%);display:var(--mat-icon-button-touch-target-display, block)}.mat-mdc-icon-button._mat-animation-noopable{transition:none !important;animation:none !important}.mat-mdc-icon-button[disabled],.mat-mdc-icon-button.mat-mdc-button-disabled{cursor:default;pointer-events:none;color:var(--mdc-icon-button-disabled-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-icon-button.mat-mdc-button-disabled-interactive{pointer-events:auto}.mat-mdc-icon-button img,.mat-mdc-icon-button svg{width:var(--mdc-icon-button-icon-size, 24px);height:var(--mdc-icon-button-icon-size, 24px);vertical-align:baseline}.mat-mdc-icon-button .mat-mdc-button-persistent-ripple{border-radius:50%}.mat-mdc-icon-button[hidden]{display:none}.mat-mdc-icon-button.mat-unthemed:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-primary:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-accent:not(.mdc-ripple-upgraded):focus::before,.mat-mdc-icon-button.mat-warn:not(.mdc-ripple-upgraded):focus::before{background:rgba(0,0,0,0);opacity:1}',FuA],encapsulation:2,changeDetection:0})}return t})();var AC=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[it,Ps,it]})}return t})();var g8=class{};function I8(t){return t&&typeof t.connect=="function"&&!(t instanceof l2)}var SB=function(t){return t[t.REPLACED=0]="REPLACED",t[t.INSERTED=1]="INSERTED",t[t.MOVED=2]="MOVED",t[t.REMOVED=3]="REMOVED",t}(SB||{}),Ru=new dA("_ViewRepeater"),RB=class{applyChanges(e,A,i,n,o){e.forEachOperation((r,s,a)=>{let c,l;if(r.previousIndex==null){let I=i(r,s,a);c=A.createEmbeddedView(I.templateRef,I.context,I.index),l=SB.INSERTED}else a==null?(A.remove(s),l=SB.REMOVED):(c=A.get(s),A.move(c,a),l=SB.MOVED);o&&o({context:c?.context,operation:l,record:r})})}detach(){}};var K2=class{_multiple;_emitChanges;compareWith;_selection=new Set;_deselectedToEmit=[];_selectedToEmit=[];_selected;get selected(){return this._selected||(this._selected=Array.from(this._selection.values())),this._selected}changed=new OA;constructor(e=!1,A,i=!0,n){this._multiple=e,this._emitChanges=i,this.compareWith=n,A&&A.length&&(e?A.forEach(o=>this._markSelected(o)):this._markSelected(A[0]),this._selectedToEmit.length=0)}select(...e){this._verifyValueAssignment(e),e.forEach(i=>this._markSelected(i));let A=this._hasQueuedChanges();return this._emitChangeEvent(),A}deselect(...e){this._verifyValueAssignment(e),e.forEach(i=>this._unmarkSelected(i));let A=this._hasQueuedChanges();return this._emitChangeEvent(),A}setSelection(...e){this._verifyValueAssignment(e);let A=this.selected,i=new Set(e);e.forEach(o=>this._markSelected(o)),A.filter(o=>!i.has(this._getConcreteValue(o,i))).forEach(o=>this._unmarkSelected(o));let n=this._hasQueuedChanges();return this._emitChangeEvent(),n}toggle(e){return this.isSelected(e)?this.deselect(e):this.select(e)}clear(e=!0){this._unmarkAll();let A=this._hasQueuedChanges();return e&&this._emitChangeEvent(),A}isSelected(e){return this._selection.has(this._getConcreteValue(e))}isEmpty(){return this._selection.size===0}hasValue(){return!this.isEmpty()}sort(e){this._multiple&&this.selected&&this._selected.sort(e)}isMultipleSelection(){return this._multiple}_emitChangeEvent(){this._selected=null,(this._selectedToEmit.length||this._deselectedToEmit.length)&&(this.changed.next({source:this,added:this._selectedToEmit,removed:this._deselectedToEmit}),this._deselectedToEmit=[],this._selectedToEmit=[])}_markSelected(e){e=this._getConcreteValue(e),this.isSelected(e)||(this._multiple||this._unmarkAll(),this.isSelected(e)||this._selection.add(e),this._emitChanges&&this._selectedToEmit.push(e))}_unmarkSelected(e){e=this._getConcreteValue(e),this.isSelected(e)&&(this._selection.delete(e),this._emitChanges&&this._deselectedToEmit.push(e))}_unmarkAll(){this.isEmpty()||this._selection.forEach(e=>this._unmarkSelected(e))}_verifyValueAssignment(e){e.length>1&&this._multiple}_hasQueuedChanges(){return!!(this._deselectedToEmit.length||this._selectedToEmit.length)}_getConcreteValue(e,A){if(this.compareWith){A=A??this._selection;for(let i of A)if(this.compareWith(e,i))return i;return e}else return e}};var xB=(()=>{class t{_listeners=[];notify(A,i){for(let n of this._listeners)n(A,i)}listen(A){return this._listeners.push(A),()=>{this._listeners=this._listeners.filter(i=>A!==i)}}ngOnDestroy(){this._listeners=[]}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var TuA=20,Y2=(()=>{class t{_ngZone=f(Qe);_platform=f(Ii);_renderer=f(ws).createRenderer(null,null);_cleanupGlobalListener;constructor(){}_scrolled=new OA;_scrolledCount=0;scrollContainers=new Map;register(A){this.scrollContainers.has(A)||this.scrollContainers.set(A,A.elementScrolled().subscribe(()=>this._scrolled.next(A)))}deregister(A){let i=this.scrollContainers.get(A);i&&(i.unsubscribe(),this.scrollContainers.delete(A))}scrolled(A=TuA){return this._platform.isBrowser?new ct(i=>{this._cleanupGlobalListener||(this._cleanupGlobalListener=this._ngZone.runOutsideAngular(()=>this._renderer.listen("document","scroll",()=>this._scrolled.next())));let n=A>0?this._scrolled.pipe(yd(A)).subscribe(i):this._scrolled.subscribe(i);return this._scrolledCount++,()=>{n.unsubscribe(),this._scrolledCount--,this._scrolledCount||(this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0)}}):Me()}ngOnDestroy(){this._cleanupGlobalListener?.(),this._cleanupGlobalListener=void 0,this.scrollContainers.forEach((A,i)=>this.deregister(i)),this._scrolled.complete()}ancestorScrolled(A,i){let n=this.getAncestorScrollContainers(A);return this.scrolled(i).pipe(kt(o=>!o||n.indexOf(o)>-1))}getAncestorScrollContainers(A){let i=[];return this.scrollContainers.forEach((n,o)=>{this._scrollableContainsElement(o,A)&&i.push(o)}),i}_scrollableContainsElement(A,i){let n=ua(i),o=A.getElementRef().nativeElement;do if(n==o)return!0;while(n=n.parentElement);return!1}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),D0=(()=>{class t{elementRef=f(ee);scrollDispatcher=f(Y2);ngZone=f(Qe);dir=f(mo,{optional:!0});_scrollElement=this.elementRef.nativeElement;_destroyed=new OA;_renderer=f(Wi);_cleanupScroll;_elementScrolled=new OA;constructor(){}ngOnInit(){this._cleanupScroll=this.ngZone.runOutsideAngular(()=>this._renderer.listen(this._scrollElement,"scroll",A=>this._elementScrolled.next(A))),this.scrollDispatcher.register(this)}ngOnDestroy(){this._cleanupScroll?.(),this._elementScrolled.complete(),this.scrollDispatcher.deregister(this),this._destroyed.next(),this._destroyed.complete()}elementScrolled(){return this._elementScrolled}getElementRef(){return this.elementRef}scrollTo(A){let i=this.elementRef.nativeElement,n=this.dir&&this.dir.value=="rtl";A.left==null&&(A.left=n?A.end:A.start),A.right==null&&(A.right=n?A.start:A.end),A.bottom!=null&&(A.top=i.scrollHeight-i.clientHeight-A.bottom),n&&mB()!=gl.NORMAL?(A.left!=null&&(A.right=i.scrollWidth-i.clientWidth-A.left),mB()==gl.INVERTED?A.left=A.right:mB()==gl.NEGATED&&(A.left=A.right?-A.right:A.right)):A.right!=null&&(A.left=i.scrollWidth-i.clientWidth-A.right),this._applyScrollToOptions(A)}_applyScrollToOptions(A){let i=this.elementRef.nativeElement;j6()?i.scrollTo(A):(A.top!=null&&(i.scrollTop=A.top),A.left!=null&&(i.scrollLeft=A.left))}measureScrollOffset(A){let i="left",n="right",o=this.elementRef.nativeElement;if(A=="top")return o.scrollTop;if(A=="bottom")return o.scrollHeight-o.clientHeight-o.scrollTop;let r=this.dir&&this.dir.value=="rtl";return A=="start"?A=r?n:i:A=="end"&&(A=r?i:n),r&&mB()==gl.INVERTED?A==i?o.scrollWidth-o.clientWidth-o.scrollLeft:o.scrollLeft:r&&mB()==gl.NEGATED?A==i?o.scrollLeft+o.scrollWidth-o.clientWidth:-o.scrollLeft:A==i?o.scrollLeft:o.scrollWidth-o.clientWidth-o.scrollLeft}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","cdk-scrollable",""],["","cdkScrollable",""]]})}return t})(),HuA=20,Mc=(()=>{class t{_platform=f(Ii);_listeners;_viewportSize;_change=new OA;_document=f(at,{optional:!0});constructor(){let A=f(Qe),i=f(ws).createRenderer(null,null);A.runOutsideAngular(()=>{if(this._platform.isBrowser){let n=o=>this._change.next(o);this._listeners=[i.listen("window","resize",n),i.listen("window","orientationchange",n)]}this.change().subscribe(()=>this._viewportSize=null)})}ngOnDestroy(){this._listeners?.forEach(A=>A()),this._change.complete()}getViewportSize(){this._viewportSize||this._updateViewportSize();let A={width:this._viewportSize.width,height:this._viewportSize.height};return this._platform.isBrowser||(this._viewportSize=null),A}getViewportRect(){let A=this.getViewportScrollPosition(),{width:i,height:n}=this.getViewportSize();return{top:A.top,left:A.left,bottom:A.top+n,right:A.left+i,height:n,width:i}}getViewportScrollPosition(){if(!this._platform.isBrowser)return{top:0,left:0};let A=this._document,i=this._getWindow(),n=A.documentElement,o=n.getBoundingClientRect(),r=-o.top||A.body.scrollTop||i.scrollY||n.scrollTop||0,s=-o.left||A.body.scrollLeft||i.scrollX||n.scrollLeft||0;return{top:r,left:s}}change(A=HuA){return A>0?this._change.pipe(yd(A)):this._change}_getWindow(){return this._document.defaultView||window}_updateViewportSize(){let A=this._getWindow();this._viewportSize=this._platform.isBrowser?{width:A.innerWidth,height:A.innerHeight}:{width:0,height:0}}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var Cl=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({})}return t})(),xu=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[_2,Cl,_2,Cl]})}return t})();var Lu=class{_attachedHost;attach(e){return this._attachedHost=e,e.attach(this)}detach(){let e=this._attachedHost;e!=null&&(this._attachedHost=null,e.detach())}get isAttached(){return this._attachedHost!=null}setAttachedHost(e){this._attachedHost=e}},dl=class extends Lu{component;viewContainerRef;injector;componentFactoryResolver;projectableNodes;constructor(e,A,i,n,o){super(),this.component=e,this.viewContainerRef=A,this.injector=i,this.projectableNodes=o}},ys=class extends Lu{templateRef;viewContainerRef;context;injector;constructor(e,A,i,n){super(),this.templateRef=e,this.viewContainerRef=A,this.context=i,this.injector=n}get origin(){return this.templateRef.elementRef}attach(e,A=this.context){return this.context=A,super.attach(e)}detach(){return this.context=void 0,super.detach()}},Rk=class extends Lu{element;constructor(e){super(),this.element=e instanceof ee?e.nativeElement:e}},J2=class{_attachedPortal;_disposeFn;_isDisposed=!1;hasAttached(){return!!this._attachedPortal}attach(e){if(e instanceof dl)return this._attachedPortal=e,this.attachComponentPortal(e);if(e instanceof ys)return this._attachedPortal=e,this.attachTemplatePortal(e);if(this.attachDomPortal&&e instanceof Rk)return this._attachedPortal=e,this.attachDomPortal(e)}attachDomPortal=null;detach(){this._attachedPortal&&(this._attachedPortal.setAttachedHost(null),this._attachedPortal=null),this._invokeDisposeFn()}dispose(){this.hasAttached()&&this.detach(),this._invokeDisposeFn(),this._isDisposed=!0}setDisposeFn(e){this._disposeFn=e}_invokeDisposeFn(){this._disposeFn&&(this._disposeFn(),this._disposeFn=null)}};var Fu=class extends J2{outletElement;_appRef;_defaultInjector;_document;constructor(e,A,i,n,o){super(),this.outletElement=e,this._appRef=i,this._defaultInjector=n,this._document=o}attachComponentPortal(e){let A;if(e.viewContainerRef){let i=e.injector||e.viewContainerRef.injector,n=i.get(I0,null,{optional:!0})||void 0;A=e.viewContainerRef.createComponent(e.component,{index:e.viewContainerRef.length,injector:i,ngModuleRef:n,projectableNodes:e.projectableNodes||void 0}),this.setDisposeFn(()=>A.destroy())}else A=Gp(e.component,{elementInjector:e.injector||this._defaultInjector||Rt.NULL,environmentInjector:this._appRef.injector,projectableNodes:e.projectableNodes||void 0}),this._appRef.attachView(A.hostView),this.setDisposeFn(()=>{this._appRef.viewCount>0&&this._appRef.detachView(A.hostView),A.destroy()});return this.outletElement.appendChild(this._getComponentRootNode(A)),this._attachedPortal=e,A}attachTemplatePortal(e){let A=e.viewContainerRef,i=A.createEmbeddedView(e.templateRef,e.context,{injector:e.injector});return i.rootNodes.forEach(n=>this.outletElement.appendChild(n)),i.detectChanges(),this.setDisposeFn(()=>{let n=A.indexOf(i);n!==-1&&A.remove(n)}),this._attachedPortal=e,i}attachDomPortal=e=>{let A=e.element;A.parentNode;let i=this._document.createComment("dom-portal");A.parentNode.insertBefore(i,A),this.outletElement.appendChild(A),this._attachedPortal=e,super.setDisposeFn(()=>{i.parentNode&&i.parentNode.replaceChild(A,i)})};dispose(){super.dispose(),this.outletElement.remove()}_getComponentRootNode(e){return e.hostView.rootNodes[0]}};var sP=(()=>{class t extends ys{constructor(){let A=f(wn),i=f(Nn);super(A,i)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","cdkPortal",""]],exportAs:["cdkPortal"],features:[lt]})}return t})();var fa=(()=>{class t extends J2{_moduleRef=f(I0,{optional:!0});_document=f(at);_viewContainerRef=f(Nn);_isInitialized=!1;_attachedRef;constructor(){super()}get portal(){return this._attachedPortal}set portal(A){this.hasAttached()&&!A&&!this._isInitialized||(this.hasAttached()&&super.detach(),A&&super.attach(A),this._attachedPortal=A||null)}attached=new WA;get attachedRef(){return this._attachedRef}ngOnInit(){this._isInitialized=!0}ngOnDestroy(){super.dispose(),this._attachedRef=this._attachedPortal=null}attachComponentPortal(A){A.setAttachedHost(this);let i=A.viewContainerRef!=null?A.viewContainerRef:this._viewContainerRef,n=i.createComponent(A.component,{index:i.length,injector:A.injector||i.injector,projectableNodes:A.projectableNodes||void 0,ngModuleRef:this._moduleRef||void 0});return i!==this._viewContainerRef&&this._getRootNode().appendChild(n.hostView.rootNodes[0]),super.setDisposeFn(()=>n.destroy()),this._attachedPortal=A,this._attachedRef=n,this.attached.emit(n),n}attachTemplatePortal(A){A.setAttachedHost(this);let i=this._viewContainerRef.createEmbeddedView(A.templateRef,A.context,{injector:A.injector});return super.setDisposeFn(()=>this._viewContainerRef.clear()),this._attachedPortal=A,this._attachedRef=i,this.attached.emit(i),i}attachDomPortal=A=>{let i=A.element;i.parentNode;let n=this._document.createComment("dom-portal");A.setAttachedHost(this),i.parentNode.insertBefore(n,i),this._getRootNode().appendChild(i),this._attachedPortal=A,super.setDisposeFn(()=>{n.parentNode&&n.parentNode.replaceChild(i,n)})};_getRootNode(){let A=this._viewContainerRef.element.nativeElement;return A.nodeType===A.ELEMENT_NODE?A:A.parentNode}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","cdkPortalOutlet",""]],inputs:{portal:[0,"cdkPortalOutlet","portal"]},outputs:{attached:"attached"},exportAs:["cdkPortalOutlet"],features:[lt]})}return t})();var dg=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({})}return t})();var aP=j6(),xk=class{_viewportRuler;_previousHTMLStyles={top:"",left:""};_previousScrollPosition;_isEnabled=!1;_document;constructor(e,A){this._viewportRuler=e,this._document=A}attach(){}enable(){if(this._canBeEnabled()){let e=this._document.documentElement;this._previousScrollPosition=this._viewportRuler.getViewportScrollPosition(),this._previousHTMLStyles.left=e.style.left||"",this._previousHTMLStyles.top=e.style.top||"",e.style.left=Cr(-this._previousScrollPosition.left),e.style.top=Cr(-this._previousScrollPosition.top),e.classList.add("cdk-global-scrollblock"),this._isEnabled=!0}}disable(){if(this._isEnabled){let e=this._document.documentElement,A=this._document.body,i=e.style,n=A.style,o=i.scrollBehavior||"",r=n.scrollBehavior||"";this._isEnabled=!1,i.left=this._previousHTMLStyles.left,i.top=this._previousHTMLStyles.top,e.classList.remove("cdk-global-scrollblock"),aP&&(i.scrollBehavior=n.scrollBehavior="auto"),window.scroll(this._previousScrollPosition.left,this._previousScrollPosition.top),aP&&(i.scrollBehavior=o,n.scrollBehavior=r)}}_canBeEnabled(){if(this._document.documentElement.classList.contains("cdk-global-scrollblock")||this._isEnabled)return!1;let A=this._document.body,i=this._viewportRuler.getViewportSize();return A.scrollHeight>i.height||A.scrollWidth>i.width}};var Lk=class{_scrollDispatcher;_ngZone;_viewportRuler;_config;_scrollSubscription=null;_overlayRef;_initialScrollPosition;constructor(e,A,i,n){this._scrollDispatcher=e,this._ngZone=A,this._viewportRuler=i,this._config=n}attach(e){this._overlayRef,this._overlayRef=e}enable(){if(this._scrollSubscription)return;let e=this._scrollDispatcher.scrolled(0).pipe(kt(A=>!A||!this._overlayRef.overlayElement.contains(A.getElementRef().nativeElement)));this._config&&this._config.threshold&&this._config.threshold>1?(this._initialScrollPosition=this._viewportRuler.getViewportScrollPosition().top,this._scrollSubscription=e.subscribe(()=>{let A=this._viewportRuler.getViewportScrollPosition().top;Math.abs(A-this._initialScrollPosition)>this._config.threshold?this._detach():this._overlayRef.updatePosition()})):this._scrollSubscription=e.subscribe(this._detach)}disable(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}detach(){this.disable(),this._overlayRef=null}_detach=()=>{this.disable(),this._overlayRef.hasAttached()&&this._ngZone.run(()=>this._overlayRef.detach())}},C8=class{enable(){}disable(){}attach(){}};function Fk(t,e){return e.some(A=>{let i=t.bottomA.bottom,o=t.rightA.right;return i||n||o||r})}function cP(t,e){return e.some(A=>{let i=t.topA.bottom,o=t.leftA.right;return i||n||o||r})}var Nk=class{_scrollDispatcher;_viewportRuler;_ngZone;_config;_scrollSubscription=null;_overlayRef;constructor(e,A,i,n){this._scrollDispatcher=e,this._viewportRuler=A,this._ngZone=i,this._config=n}attach(e){this._overlayRef,this._overlayRef=e}enable(){if(!this._scrollSubscription){let e=this._config?this._config.scrollThrottle:0;this._scrollSubscription=this._scrollDispatcher.scrolled(e).subscribe(()=>{if(this._overlayRef.updatePosition(),this._config&&this._config.autoClose){let A=this._overlayRef.overlayElement.getBoundingClientRect(),{width:i,height:n}=this._viewportRuler.getViewportSize();Fk(A,[{width:i,height:n,bottom:n,right:i,top:0,left:0}])&&(this.disable(),this._ngZone.run(()=>this._overlayRef.detach()))}})}}disable(){this._scrollSubscription&&(this._scrollSubscription.unsubscribe(),this._scrollSubscription=null)}detach(){this.disable(),this._overlayRef=null}},OuA=(()=>{class t{_scrollDispatcher=f(Y2);_viewportRuler=f(Mc);_ngZone=f(Qe);_document=f(at);constructor(){}noop=()=>new C8;close=A=>new Lk(this._scrollDispatcher,this._ngZone,this._viewportRuler,A);block=()=>new xk(this._viewportRuler,this._document);reposition=A=>new Nk(this._scrollDispatcher,this._viewportRuler,this._ngZone,A);static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),Bg=class{positionStrategy;scrollStrategy=new C8;panelClass="";hasBackdrop=!1;backdropClass="cdk-overlay-dark-backdrop";width;height;minWidth;minHeight;maxWidth;maxHeight;direction;disposeOnNavigation=!1;constructor(e){if(e){let A=Object.keys(e);for(let i of A)e[i]!==void 0&&(this[i]=e[i])}}};var _k=class{connectionPair;scrollableViewProperties;constructor(e,A){this.connectionPair=e,this.scrollableViewProperties=A}};var BP=(()=>{class t{_attachedOverlays=[];_document=f(at);_isAttached;constructor(){}ngOnDestroy(){this.detach()}add(A){this.remove(A),this._attachedOverlays.push(A)}remove(A){let i=this._attachedOverlays.indexOf(A);i>-1&&this._attachedOverlays.splice(i,1),this._attachedOverlays.length===0&&this.detach()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),PuA=(()=>{class t extends BP{_ngZone=f(Qe);_renderer=f(ws).createRenderer(null,null);_cleanupKeydown;add(A){super.add(A),this._isAttached||(this._ngZone.runOutsideAngular(()=>{this._cleanupKeydown=this._renderer.listen("body","keydown",this._keydownListener)}),this._isAttached=!0)}detach(){this._isAttached&&(this._cleanupKeydown?.(),this._isAttached=!1)}_keydownListener=A=>{let i=this._attachedOverlays;for(let n=i.length-1;n>-1;n--)if(i[n]._keydownEvents.observers.length>0){this._ngZone.run(()=>i[n]._keydownEvents.next(A));break}};static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),juA=(()=>{class t extends BP{_platform=f(Ii);_ngZone=f(Qe,{optional:!0});_cursorOriginalValue;_cursorStyleIsSet=!1;_pointerDownEventTarget;add(A){if(super.add(A),!this._isAttached){let i=this._document.body;this._ngZone?this._ngZone.runOutsideAngular(()=>this._addEventListeners(i)):this._addEventListeners(i),this._platform.IOS&&!this._cursorStyleIsSet&&(this._cursorOriginalValue=i.style.cursor,i.style.cursor="pointer",this._cursorStyleIsSet=!0),this._isAttached=!0}}detach(){if(this._isAttached){let A=this._document.body;A.removeEventListener("pointerdown",this._pointerDownListener,!0),A.removeEventListener("click",this._clickListener,!0),A.removeEventListener("auxclick",this._clickListener,!0),A.removeEventListener("contextmenu",this._clickListener,!0),this._platform.IOS&&this._cursorStyleIsSet&&(A.style.cursor=this._cursorOriginalValue,this._cursorStyleIsSet=!1),this._isAttached=!1}}_addEventListeners(A){A.addEventListener("pointerdown",this._pointerDownListener,!0),A.addEventListener("click",this._clickListener,!0),A.addEventListener("auxclick",this._clickListener,!0),A.addEventListener("contextmenu",this._clickListener,!0)}_pointerDownListener=A=>{this._pointerDownEventTarget=oc(A)};_clickListener=A=>{let i=oc(A),n=A.type==="click"&&this._pointerDownEventTarget?this._pointerDownEventTarget:i;this._pointerDownEventTarget=null;let o=this._attachedOverlays.slice();for(let r=o.length-1;r>-1;r--){let s=o[r];if(s._outsidePointerEvents.observers.length<1||!s.hasAttached())continue;if(lP(s.overlayElement,i)||lP(s.overlayElement,n))break;let a=s._outsidePointerEvents;this._ngZone?this._ngZone.run(()=>a.next(A)):a.next(A)}};static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function lP(t,e){let A=typeof ShadowRoot<"u"&&ShadowRoot,i=e;for(;i;){if(i===t)return!0;i=A&&i instanceof ShadowRoot?i.host:i.parentNode}return!1}var EP=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["ng-component"]],hostAttrs:["cdk-overlay-style-loader",""],decls:0,vars:0,template:function(i,n){},styles:[".cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed}@layer cdk-overlay{.cdk-overlay-container{z-index:1000}}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute}@layer cdk-overlay{.cdk-global-overlay-wrapper{z-index:1000}}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;display:flex;max-width:100%;max-height:100%}@layer cdk-overlay{.cdk-overlay-pane{z-index:1000}}.cdk-overlay-backdrop{position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:auto;-webkit-tap-highlight-color:rgba(0,0,0,0);opacity:0}@layer cdk-overlay{.cdk-overlay-backdrop{z-index:1000;transition:opacity 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}}.cdk-overlay-backdrop-showing{opacity:1}@media(forced-colors: active){.cdk-overlay-backdrop-showing{opacity:.6}}@layer cdk-overlay{.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing,.cdk-high-contrast-active .cdk-overlay-transparent-backdrop{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;display:flex;flex-direction:column;min-width:1px;min-height:1px}@layer cdk-overlay{.cdk-overlay-connected-position-bounding-box{z-index:1000}}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}"],encapsulation:2,changeDetection:0})}return t})(),d8=(()=>{class t{_platform=f(Ii);_containerElement;_document=f(at);_styleLoader=f(Rn);constructor(){}ngOnDestroy(){this._containerElement?.remove()}getContainerElement(){return this._loadStyles(),this._containerElement||this._createContainer(),this._containerElement}_createContainer(){let A="cdk-overlay-container";if(this._platform.isBrowser||rk()){let n=this._document.querySelectorAll(`.${A}[platform="server"], .${A}[platform="test"]`);for(let o=0;o{let e=this.element;clearTimeout(this._fallbackTimeout),this._cleanupTransitionEnd?.(),this._cleanupTransitionEnd=this._renderer.listen(e,"transitionend",this.dispose),this._fallbackTimeout=setTimeout(this.dispose,500),e.style.pointerEvents="none",e.classList.remove("cdk-overlay-backdrop-showing")})}dispose=()=>{clearTimeout(this._fallbackTimeout),this._cleanupClick?.(),this._cleanupTransitionEnd?.(),this._cleanupClick=this._cleanupTransitionEnd=this._fallbackTimeout=void 0,this.element.remove()}},LB=class{_portalOutlet;_host;_pane;_config;_ngZone;_keyboardDispatcher;_document;_location;_outsideClickDispatcher;_animationsDisabled;_injector;_renderer;_backdropClick=new OA;_attachments=new OA;_detachments=new OA;_positionStrategy;_scrollStrategy;_locationChanges=Kt.EMPTY;_backdropRef=null;_previousHostParent;_keydownEvents=new OA;_outsidePointerEvents=new OA;_renders=new OA;_afterRenderRef;_afterNextRenderRef;constructor(e,A,i,n,o,r,s,a,c,l=!1,I,C){this._portalOutlet=e,this._host=A,this._pane=i,this._config=n,this._ngZone=o,this._keyboardDispatcher=r,this._document=s,this._location=a,this._outsideClickDispatcher=c,this._animationsDisabled=l,this._injector=I,this._renderer=C,n.scrollStrategy&&(this._scrollStrategy=n.scrollStrategy,this._scrollStrategy.attach(this)),this._positionStrategy=n.positionStrategy,this._afterRenderRef=Ba(()=>vh(()=>{this._renders.next()},{injector:this._injector}))}get overlayElement(){return this._pane}get backdropElement(){return this._backdropRef?.element||null}get hostElement(){return this._host}attach(e){!this._host.parentElement&&this._previousHostParent&&this._previousHostParent.appendChild(this._host);let A=this._portalOutlet.attach(e);return this._positionStrategy&&this._positionStrategy.attach(this),this._updateStackingOrder(),this._updateElementSize(),this._updateElementDirection(),this._scrollStrategy&&this._scrollStrategy.enable(),this._afterNextRenderRef?.destroy(),this._afterNextRenderRef=To(()=>{this.hasAttached()&&this.updatePosition()},{injector:this._injector}),this._togglePointerEvents(!0),this._config.hasBackdrop&&this._attachBackdrop(),this._config.panelClass&&this._toggleClasses(this._pane,this._config.panelClass,!0),this._attachments.next(),this._keyboardDispatcher.add(this),this._config.disposeOnNavigation&&(this._locationChanges=this._location.subscribe(()=>this.dispose())),this._outsideClickDispatcher.add(this),typeof A?.onDestroy=="function"&&A.onDestroy(()=>{this.hasAttached()&&this._ngZone.runOutsideAngular(()=>Promise.resolve().then(()=>this.detach()))}),A}detach(){if(!this.hasAttached())return;this.detachBackdrop(),this._togglePointerEvents(!1),this._positionStrategy&&this._positionStrategy.detach&&this._positionStrategy.detach(),this._scrollStrategy&&this._scrollStrategy.disable();let e=this._portalOutlet.detach();return this._detachments.next(),this._keyboardDispatcher.remove(this),this._detachContentWhenEmpty(),this._locationChanges.unsubscribe(),this._outsideClickDispatcher.remove(this),e}dispose(){let e=this.hasAttached();this._positionStrategy&&this._positionStrategy.dispose(),this._disposeScrollStrategy(),this._backdropRef?.dispose(),this._locationChanges.unsubscribe(),this._keyboardDispatcher.remove(this),this._portalOutlet.dispose(),this._attachments.complete(),this._backdropClick.complete(),this._keydownEvents.complete(),this._outsidePointerEvents.complete(),this._outsideClickDispatcher.remove(this),this._host?.remove(),this._afterNextRenderRef?.destroy(),this._previousHostParent=this._pane=this._host=this._backdropRef=null,e&&this._detachments.next(),this._detachments.complete(),this._afterRenderRef.destroy(),this._renders.complete()}hasAttached(){return this._portalOutlet.hasAttached()}backdropClick(){return this._backdropClick}attachments(){return this._attachments}detachments(){return this._detachments}keydownEvents(){return this._keydownEvents}outsidePointerEvents(){return this._outsidePointerEvents}getConfig(){return this._config}updatePosition(){this._positionStrategy&&this._positionStrategy.apply()}updatePositionStrategy(e){e!==this._positionStrategy&&(this._positionStrategy&&this._positionStrategy.dispose(),this._positionStrategy=e,this.hasAttached()&&(e.attach(this),this.updatePosition()))}updateSize(e){this._config=rA(rA({},this._config),e),this._updateElementSize()}setDirection(e){this._config=Ye(rA({},this._config),{direction:e}),this._updateElementDirection()}addPanelClass(e){this._pane&&this._toggleClasses(this._pane,e,!0)}removePanelClass(e){this._pane&&this._toggleClasses(this._pane,e,!1)}getDirection(){let e=this._config.direction;return e?typeof e=="string"?e:e.value:"ltr"}updateScrollStrategy(e){e!==this._scrollStrategy&&(this._disposeScrollStrategy(),this._scrollStrategy=e,this.hasAttached()&&(e.attach(this),e.enable()))}_updateElementDirection(){this._host.setAttribute("dir",this.getDirection())}_updateElementSize(){if(!this._pane)return;let e=this._pane.style;e.width=Cr(this._config.width),e.height=Cr(this._config.height),e.minWidth=Cr(this._config.minWidth),e.minHeight=Cr(this._config.minHeight),e.maxWidth=Cr(this._config.maxWidth),e.maxHeight=Cr(this._config.maxHeight)}_togglePointerEvents(e){this._pane.style.pointerEvents=e?"":"none"}_attachBackdrop(){let e="cdk-overlay-backdrop-showing";this._backdropRef?.dispose(),this._backdropRef=new Gk(this._document,this._renderer,this._ngZone,A=>{this._backdropClick.next(A)}),this._animationsDisabled&&this._backdropRef.element.classList.add("cdk-overlay-backdrop-noop-animation"),this._config.backdropClass&&this._toggleClasses(this._backdropRef.element,this._config.backdropClass,!0),this._host.parentElement.insertBefore(this._backdropRef.element,this._host),!this._animationsDisabled&&typeof requestAnimationFrame<"u"?this._ngZone.runOutsideAngular(()=>{requestAnimationFrame(()=>this._backdropRef?.element.classList.add(e))}):this._backdropRef.element.classList.add(e)}_updateStackingOrder(){this._host.nextSibling&&this._host.parentNode.appendChild(this._host)}detachBackdrop(){this._animationsDisabled?(this._backdropRef?.dispose(),this._backdropRef=null):this._backdropRef?.detach()}_toggleClasses(e,A,i){let n=wB(A||[]).filter(o=>!!o);n.length&&(i?e.classList.add(...n):e.classList.remove(...n))}_detachContentWhenEmpty(){this._ngZone.runOutsideAngular(()=>{let e=this._renders.pipe(St(zn(this._attachments,this._detachments))).subscribe(()=>{(!this._pane||!this._host||this._pane.children.length===0)&&(this._pane&&this._config.panelClass&&this._toggleClasses(this._pane,this._config.panelClass,!1),this._host&&this._host.parentElement&&(this._previousHostParent=this._host.parentElement,this._host.remove()),e.unsubscribe())})})}_disposeScrollStrategy(){let e=this._scrollStrategy;e?.disable(),e?.detach?.()}},gP="cdk-overlay-connected-position-bounding-box",quA=/([A-Za-z%]+)$/,Uk=class{_viewportRuler;_document;_platform;_overlayContainer;_overlayRef;_isInitialRender;_lastBoundingBoxSize={width:0,height:0};_isPushed=!1;_canPush=!0;_growAfterOpen=!1;_hasFlexibleDimensions=!0;_positionLocked=!1;_originRect;_overlayRect;_viewportRect;_containerRect;_viewportMargin=0;_scrollables=[];_preferredPositions=[];_origin;_pane;_isDisposed;_boundingBox;_lastPosition;_lastScrollVisibility;_positionChanges=new OA;_resizeSubscription=Kt.EMPTY;_offsetX=0;_offsetY=0;_transformOriginSelector;_appliedPanelClasses=[];_previousPushAmount;positionChanges=this._positionChanges;get positions(){return this._preferredPositions}constructor(e,A,i,n,o){this._viewportRuler=A,this._document=i,this._platform=n,this._overlayContainer=o,this.setOrigin(e)}attach(e){this._overlayRef&&this._overlayRef,this._validatePositions(),e.hostElement.classList.add(gP),this._overlayRef=e,this._boundingBox=e.hostElement,this._pane=e.overlayElement,this._isDisposed=!1,this._isInitialRender=!0,this._lastPosition=null,this._resizeSubscription.unsubscribe(),this._resizeSubscription=this._viewportRuler.change().subscribe(()=>{this._isInitialRender=!0,this.apply()})}apply(){if(this._isDisposed||!this._platform.isBrowser)return;if(!this._isInitialRender&&this._positionLocked&&this._lastPosition){this.reapplyLastPosition();return}this._clearPanelClasses(),this._resetOverlayElementStyles(),this._resetBoundingBoxStyles(),this._viewportRect=this._getNarrowedViewportRect(),this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._containerRect=this._overlayContainer.getContainerElement().getBoundingClientRect();let e=this._originRect,A=this._overlayRect,i=this._viewportRect,n=this._containerRect,o=[],r;for(let s of this._preferredPositions){let a=this._getOriginPoint(e,n,s),c=this._getOverlayPoint(a,A,s),l=this._getOverlayFit(c,A,i,s);if(l.isCompletelyWithinViewport){this._isPushed=!1,this._applyPosition(s,a);return}if(this._canFitWithFlexibleDimensions(l,c,i)){o.push({position:s,origin:a,overlayRect:A,boundingBoxRect:this._calculateBoundingBoxRect(a,s)});continue}(!r||r.overlayFit.visibleAreaa&&(a=l,s=c)}this._isPushed=!1,this._applyPosition(s.position,s.origin);return}if(this._canPush){this._isPushed=!0,this._applyPosition(r.position,r.originPoint);return}this._applyPosition(r.position,r.originPoint)}detach(){this._clearPanelClasses(),this._lastPosition=null,this._previousPushAmount=null,this._resizeSubscription.unsubscribe()}dispose(){this._isDisposed||(this._boundingBox&&eC(this._boundingBox.style,{top:"",left:"",right:"",bottom:"",height:"",width:"",alignItems:"",justifyContent:""}),this._pane&&this._resetOverlayElementStyles(),this._overlayRef&&this._overlayRef.hostElement.classList.remove(gP),this.detach(),this._positionChanges.complete(),this._overlayRef=this._boundingBox=null,this._isDisposed=!0)}reapplyLastPosition(){if(this._isDisposed||!this._platform.isBrowser)return;let e=this._lastPosition;if(e){this._originRect=this._getOriginRect(),this._overlayRect=this._pane.getBoundingClientRect(),this._viewportRect=this._getNarrowedViewportRect(),this._containerRect=this._overlayContainer.getContainerElement().getBoundingClientRect();let A=this._getOriginPoint(this._originRect,this._containerRect,e);this._applyPosition(e,A)}else this.apply()}withScrollableContainers(e){return this._scrollables=e,this}withPositions(e){return this._preferredPositions=e,e.indexOf(this._lastPosition)===-1&&(this._lastPosition=null),this._validatePositions(),this}withViewportMargin(e){return this._viewportMargin=e,this}withFlexibleDimensions(e=!0){return this._hasFlexibleDimensions=e,this}withGrowAfterOpen(e=!0){return this._growAfterOpen=e,this}withPush(e=!0){return this._canPush=e,this}withLockedPosition(e=!0){return this._positionLocked=e,this}setOrigin(e){return this._origin=e,this}withDefaultOffsetX(e){return this._offsetX=e,this}withDefaultOffsetY(e){return this._offsetY=e,this}withTransformOriginOn(e){return this._transformOriginSelector=e,this}_getOriginPoint(e,A,i){let n;if(i.originX=="center")n=e.left+e.width/2;else{let r=this._isRtl()?e.right:e.left,s=this._isRtl()?e.left:e.right;n=i.originX=="start"?r:s}A.left<0&&(n-=A.left);let o;return i.originY=="center"?o=e.top+e.height/2:o=i.originY=="top"?e.top:e.bottom,A.top<0&&(o-=A.top),{x:n,y:o}}_getOverlayPoint(e,A,i){let n;i.overlayX=="center"?n=-A.width/2:i.overlayX==="start"?n=this._isRtl()?-A.width:0:n=this._isRtl()?0:-A.width;let o;return i.overlayY=="center"?o=-A.height/2:o=i.overlayY=="top"?0:-A.height,{x:e.x+n,y:e.y+o}}_getOverlayFit(e,A,i,n){let o=CP(A),{x:r,y:s}=e,a=this._getOffset(n,"x"),c=this._getOffset(n,"y");a&&(r+=a),c&&(s+=c);let l=0-r,I=r+o.width-i.width,C=0-s,d=s+o.height-i.height,B=this._subtractOverflows(o.width,l,I),E=this._subtractOverflows(o.height,C,d),h=B*E;return{visibleArea:h,isCompletelyWithinViewport:o.width*o.height===h,fitsInViewportVertically:E===o.height,fitsInViewportHorizontally:B==o.width}}_canFitWithFlexibleDimensions(e,A,i){if(this._hasFlexibleDimensions){let n=i.bottom-A.y,o=i.right-A.x,r=IP(this._overlayRef.getConfig().minHeight),s=IP(this._overlayRef.getConfig().minWidth),a=e.fitsInViewportVertically||r!=null&&r<=n,c=e.fitsInViewportHorizontally||s!=null&&s<=o;return a&&c}return!1}_pushOverlayOnScreen(e,A,i){if(this._previousPushAmount&&this._positionLocked)return{x:e.x+this._previousPushAmount.x,y:e.y+this._previousPushAmount.y};let n=CP(A),o=this._viewportRect,r=Math.max(e.x+n.width-o.width,0),s=Math.max(e.y+n.height-o.height,0),a=Math.max(o.top-i.top-e.y,0),c=Math.max(o.left-i.left-e.x,0),l=0,I=0;return n.width<=o.width?l=c||-r:l=e.xB&&!this._isInitialRender&&!this._growAfterOpen&&(r=e.y-B/2)}let a=A.overlayX==="start"&&!n||A.overlayX==="end"&&n,c=A.overlayX==="end"&&!n||A.overlayX==="start"&&n,l,I,C;if(c)C=i.width-e.x+this._viewportMargin*2,l=e.x-this._viewportMargin;else if(a)I=e.x,l=i.right-e.x;else{let d=Math.min(i.right-e.x+i.left,e.x),B=this._lastBoundingBoxSize.width;l=d*2,I=e.x-d,l>B&&!this._isInitialRender&&!this._growAfterOpen&&(I=e.x-B/2)}return{top:r,left:I,bottom:s,right:C,width:l,height:o}}_setBoundingBoxStyles(e,A){let i=this._calculateBoundingBoxRect(e,A);!this._isInitialRender&&!this._growAfterOpen&&(i.height=Math.min(i.height,this._lastBoundingBoxSize.height),i.width=Math.min(i.width,this._lastBoundingBoxSize.width));let n={};if(this._hasExactPosition())n.top=n.left="0",n.bottom=n.right=n.maxHeight=n.maxWidth="",n.width=n.height="100%";else{let o=this._overlayRef.getConfig().maxHeight,r=this._overlayRef.getConfig().maxWidth;n.height=Cr(i.height),n.top=Cr(i.top),n.bottom=Cr(i.bottom),n.width=Cr(i.width),n.left=Cr(i.left),n.right=Cr(i.right),A.overlayX==="center"?n.alignItems="center":n.alignItems=A.overlayX==="end"?"flex-end":"flex-start",A.overlayY==="center"?n.justifyContent="center":n.justifyContent=A.overlayY==="bottom"?"flex-end":"flex-start",o&&(n.maxHeight=Cr(o)),r&&(n.maxWidth=Cr(r))}this._lastBoundingBoxSize=i,eC(this._boundingBox.style,n)}_resetBoundingBoxStyles(){eC(this._boundingBox.style,{top:"0",left:"0",right:"0",bottom:"0",height:"",width:"",alignItems:"",justifyContent:""})}_resetOverlayElementStyles(){eC(this._pane.style,{top:"",left:"",bottom:"",right:"",position:"",transform:""})}_setOverlayElementStyles(e,A){let i={},n=this._hasExactPosition(),o=this._hasFlexibleDimensions,r=this._overlayRef.getConfig();if(n){let l=this._viewportRuler.getViewportScrollPosition();eC(i,this._getExactOverlayY(A,e,l)),eC(i,this._getExactOverlayX(A,e,l))}else i.position="static";let s="",a=this._getOffset(A,"x"),c=this._getOffset(A,"y");a&&(s+=`translateX(${a}px) `),c&&(s+=`translateY(${c}px)`),i.transform=s.trim(),r.maxHeight&&(n?i.maxHeight=Cr(r.maxHeight):o&&(i.maxHeight="")),r.maxWidth&&(n?i.maxWidth=Cr(r.maxWidth):o&&(i.maxWidth="")),eC(this._pane.style,i)}_getExactOverlayY(e,A,i){let n={top:"",bottom:""},o=this._getOverlayPoint(A,this._overlayRect,e);if(this._isPushed&&(o=this._pushOverlayOnScreen(o,this._overlayRect,i)),e.overlayY==="bottom"){let r=this._document.documentElement.clientHeight;n.bottom=`${r-(o.y+this._overlayRect.height)}px`}else n.top=Cr(o.y);return n}_getExactOverlayX(e,A,i){let n={left:"",right:""},o=this._getOverlayPoint(A,this._overlayRect,e);this._isPushed&&(o=this._pushOverlayOnScreen(o,this._overlayRect,i));let r;if(this._isRtl()?r=e.overlayX==="end"?"left":"right":r=e.overlayX==="end"?"right":"left",r==="right"){let s=this._document.documentElement.clientWidth;n.right=`${s-(o.x+this._overlayRect.width)}px`}else n.left=Cr(o.x);return n}_getScrollVisibility(){let e=this._getOriginRect(),A=this._pane.getBoundingClientRect(),i=this._scrollables.map(n=>n.getElementRef().nativeElement.getBoundingClientRect());return{isOriginClipped:cP(e,i),isOriginOutsideView:Fk(e,i),isOverlayClipped:cP(A,i),isOverlayOutsideView:Fk(A,i)}}_subtractOverflows(e,...A){return A.reduce((i,n)=>i-Math.max(n,0),e)}_getNarrowedViewportRect(){let e=this._document.documentElement.clientWidth,A=this._document.documentElement.clientHeight,i=this._viewportRuler.getViewportScrollPosition();return{top:i.top+this._viewportMargin,left:i.left+this._viewportMargin,right:i.left+e-this._viewportMargin,bottom:i.top+A-this._viewportMargin,width:e-2*this._viewportMargin,height:A-2*this._viewportMargin}}_isRtl(){return this._overlayRef.getDirection()==="rtl"}_hasExactPosition(){return!this._hasFlexibleDimensions||this._isPushed}_getOffset(e,A){return A==="x"?e.offsetX==null?this._offsetX:e.offsetX:e.offsetY==null?this._offsetY:e.offsetY}_validatePositions(){}_addPanelClasses(e){this._pane&&wB(e).forEach(A=>{A!==""&&this._appliedPanelClasses.indexOf(A)===-1&&(this._appliedPanelClasses.push(A),this._pane.classList.add(A))})}_clearPanelClasses(){this._pane&&(this._appliedPanelClasses.forEach(e=>{this._pane.classList.remove(e)}),this._appliedPanelClasses=[])}_getOriginRect(){let e=this._origin;if(e instanceof ee)return e.nativeElement.getBoundingClientRect();if(e instanceof Element)return e.getBoundingClientRect();let A=e.width||0,i=e.height||0;return{top:e.y,bottom:e.y+i,left:e.x,right:e.x+A,height:i,width:A}}};function eC(t,e){for(let A in e)e.hasOwnProperty(A)&&(t[A]=e[A]);return t}function IP(t){if(typeof t!="number"&&t!=null){let[e,A]=t.split(quA);return!A||A==="px"?parseFloat(e):null}return t||null}function CP(t){return{top:Math.floor(t.top),right:Math.floor(t.right),bottom:Math.floor(t.bottom),left:Math.floor(t.left),width:Math.floor(t.width),height:Math.floor(t.height)}}function VuA(t,e){return t===e?!0:t.isOriginClipped===e.isOriginClipped&&t.isOriginOutsideView===e.isOriginOutsideView&&t.isOverlayClipped===e.isOverlayClipped&&t.isOverlayOutsideView===e.isOverlayOutsideView}var dP="cdk-global-overlay-wrapper",Kk=class{_overlayRef;_cssPosition="static";_topOffset="";_bottomOffset="";_alignItems="";_xPosition="";_xOffset="";_width="";_height="";_isDisposed=!1;attach(e){let A=e.getConfig();this._overlayRef=e,this._width&&!A.width&&e.updateSize({width:this._width}),this._height&&!A.height&&e.updateSize({height:this._height}),e.hostElement.classList.add(dP),this._isDisposed=!1}top(e=""){return this._bottomOffset="",this._topOffset=e,this._alignItems="flex-start",this}left(e=""){return this._xOffset=e,this._xPosition="left",this}bottom(e=""){return this._topOffset="",this._bottomOffset=e,this._alignItems="flex-end",this}right(e=""){return this._xOffset=e,this._xPosition="right",this}start(e=""){return this._xOffset=e,this._xPosition="start",this}end(e=""){return this._xOffset=e,this._xPosition="end",this}width(e=""){return this._overlayRef?this._overlayRef.updateSize({width:e}):this._width=e,this}height(e=""){return this._overlayRef?this._overlayRef.updateSize({height:e}):this._height=e,this}centerHorizontally(e=""){return this.left(e),this._xPosition="center",this}centerVertically(e=""){return this.top(e),this._alignItems="center",this}apply(){if(!this._overlayRef||!this._overlayRef.hasAttached())return;let e=this._overlayRef.overlayElement.style,A=this._overlayRef.hostElement.style,i=this._overlayRef.getConfig(),{width:n,height:o,maxWidth:r,maxHeight:s}=i,a=(n==="100%"||n==="100vw")&&(!r||r==="100%"||r==="100vw"),c=(o==="100%"||o==="100vh")&&(!s||s==="100%"||s==="100vh"),l=this._xPosition,I=this._xOffset,C=this._overlayRef.getConfig().direction==="rtl",d="",B="",E="";a?E="flex-start":l==="center"?(E="center",C?B=I:d=I):C?l==="left"||l==="end"?(E="flex-end",d=I):(l==="right"||l==="start")&&(E="flex-start",B=I):l==="left"||l==="start"?(E="flex-start",d=I):(l==="right"||l==="end")&&(E="flex-end",B=I),e.position=this._cssPosition,e.marginLeft=a?"0":d,e.marginTop=c?"0":this._topOffset,e.marginBottom=this._bottomOffset,e.marginRight=a?"0":B,A.justifyContent=E,A.alignItems=c?"flex-start":this._alignItems}dispose(){if(this._isDisposed||!this._overlayRef)return;let e=this._overlayRef.overlayElement.style,A=this._overlayRef.hostElement,i=A.style;A.classList.remove(dP),i.justifyContent=i.alignItems=e.marginTop=e.marginBottom=e.marginLeft=e.marginRight=e.position="",this._overlayRef=null,this._isDisposed=!0}},ZuA=(()=>{class t{_viewportRuler=f(Mc);_document=f(at);_platform=f(Ii);_overlayContainer=f(d8);constructor(){}global(){return new Kk}flexibleConnectedTo(A){return new Uk(A,this._viewportRuler,this._document,this._platform,this._overlayContainer)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),nr=(()=>{class t{scrollStrategies=f(OuA);_overlayContainer=f(d8);_positionBuilder=f(ZuA);_keyboardDispatcher=f(PuA);_injector=f(Rt);_ngZone=f(Qe);_document=f(at);_directionality=f(mo);_location=f(Dc);_outsideClickDispatcher=f(juA);_animationsModuleType=f(Si,{optional:!0});_idGenerator=f(sn);_renderer=f(ws).createRenderer(null,null);_appRef;_styleLoader=f(Rn);constructor(){}create(A){this._styleLoader.load(EP);let i=this._createHostElement(),n=this._createPaneElement(i),o=this._createPortalOutlet(n),r=new Bg(A);return r.direction=r.direction||this._directionality.value,new LB(o,i,n,r,this._ngZone,this._keyboardDispatcher,this._document,this._location,this._outsideClickDispatcher,this._animationsModuleType==="NoopAnimations",this._injector.get(pr),this._renderer)}position(){return this._positionBuilder}_createPaneElement(A){let i=this._document.createElement("div");return i.id=this._idGenerator.getId("cdk-overlay-"),i.classList.add("cdk-overlay-pane"),A.appendChild(i),i}_createHostElement(){let A=this._document.createElement("div");return this._overlayContainer.getContainerElement().appendChild(A),A}_createPortalOutlet(A){return this._appRef||(this._appRef=this._injector.get(la)),new Fu(A,null,this._appRef,this._injector,this._document)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),WuA=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom"},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"}],QP=new dA("cdk-connected-overlay-scroll-strategy",{providedIn:"root",factory:()=>{let t=f(nr);return()=>t.scrollStrategies.reposition()}}),Nu=(()=>{class t{elementRef=f(ee);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","cdk-overlay-origin",""],["","overlay-origin",""],["","cdkOverlayOrigin",""]],exportAs:["cdkOverlayOrigin"]})}return t})(),Yk=(()=>{class t{_overlay=f(nr);_dir=f(mo,{optional:!0});_overlayRef;_templatePortal;_backdropSubscription=Kt.EMPTY;_attachSubscription=Kt.EMPTY;_detachSubscription=Kt.EMPTY;_positionSubscription=Kt.EMPTY;_offsetX;_offsetY;_position;_scrollStrategyFactory=f(QP);_disposeOnNavigation=!1;_ngZone=f(Qe);origin;positions;positionStrategy;get offsetX(){return this._offsetX}set offsetX(A){this._offsetX=A,this._position&&this._updatePositionStrategy(this._position)}get offsetY(){return this._offsetY}set offsetY(A){this._offsetY=A,this._position&&this._updatePositionStrategy(this._position)}width;height;minWidth;minHeight;backdropClass;panelClass;viewportMargin=0;scrollStrategy;open=!1;disableClose=!1;transformOriginSelector;hasBackdrop=!1;lockPosition=!1;flexibleDimensions=!1;growAfterOpen=!1;push=!1;get disposeOnNavigation(){return this._disposeOnNavigation}set disposeOnNavigation(A){this._disposeOnNavigation=A}backdropClick=new WA;positionChange=new WA;attach=new WA;detach=new WA;overlayKeydown=new WA;overlayOutsideClick=new WA;constructor(){let A=f(wn),i=f(Nn);this._templatePortal=new ys(A,i),this.scrollStrategy=this._scrollStrategyFactory()}get overlayRef(){return this._overlayRef}get dir(){return this._dir?this._dir.value:"ltr"}ngOnDestroy(){this._attachSubscription.unsubscribe(),this._detachSubscription.unsubscribe(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this._overlayRef&&this._overlayRef.dispose()}ngOnChanges(A){this._position&&(this._updatePositionStrategy(this._position),this._overlayRef.updateSize({width:this.width,minWidth:this.minWidth,height:this.height,minHeight:this.minHeight}),A.origin&&this.open&&this._position.apply()),A.open&&(this.open?this._attachOverlay():this._detachOverlay())}_createOverlay(){(!this.positions||!this.positions.length)&&(this.positions=WuA);let A=this._overlayRef=this._overlay.create(this._buildConfig());this._attachSubscription=A.attachments().subscribe(()=>this.attach.emit()),this._detachSubscription=A.detachments().subscribe(()=>this.detach.emit()),A.keydownEvents().subscribe(i=>{this.overlayKeydown.next(i),i.keyCode===27&&!this.disableClose&&!ir(i)&&(i.preventDefault(),this._detachOverlay())}),this._overlayRef.outsidePointerEvents().subscribe(i=>{let n=this._getOriginElement(),o=oc(i);(!n||n!==o&&!n.contains(o))&&this.overlayOutsideClick.next(i)})}_buildConfig(){let A=this._position=this.positionStrategy||this._createPositionStrategy(),i=new Bg({direction:this._dir||"ltr",positionStrategy:A,scrollStrategy:this.scrollStrategy,hasBackdrop:this.hasBackdrop,disposeOnNavigation:this.disposeOnNavigation});return(this.width||this.width===0)&&(i.width=this.width),(this.height||this.height===0)&&(i.height=this.height),(this.minWidth||this.minWidth===0)&&(i.minWidth=this.minWidth),(this.minHeight||this.minHeight===0)&&(i.minHeight=this.minHeight),this.backdropClass&&(i.backdropClass=this.backdropClass),this.panelClass&&(i.panelClass=this.panelClass),i}_updatePositionStrategy(A){let i=this.positions.map(n=>({originX:n.originX,originY:n.originY,overlayX:n.overlayX,overlayY:n.overlayY,offsetX:n.offsetX||this.offsetX,offsetY:n.offsetY||this.offsetY,panelClass:n.panelClass||void 0}));return A.setOrigin(this._getOrigin()).withPositions(i).withFlexibleDimensions(this.flexibleDimensions).withPush(this.push).withGrowAfterOpen(this.growAfterOpen).withViewportMargin(this.viewportMargin).withLockedPosition(this.lockPosition).withTransformOriginOn(this.transformOriginSelector)}_createPositionStrategy(){let A=this._overlay.position().flexibleConnectedTo(this._getOrigin());return this._updatePositionStrategy(A),A}_getOrigin(){return this.origin instanceof Nu?this.origin.elementRef:this.origin}_getOriginElement(){return this.origin instanceof Nu?this.origin.elementRef.nativeElement:this.origin instanceof ee?this.origin.nativeElement:typeof Element<"u"&&this.origin instanceof Element?this.origin:null}_attachOverlay(){this._overlayRef?this._overlayRef.getConfig().hasBackdrop=this.hasBackdrop:this._createOverlay(),this._overlayRef.hasAttached()||this._overlayRef.attach(this._templatePortal),this.hasBackdrop?this._backdropSubscription=this._overlayRef.backdropClick().subscribe(A=>{this.backdropClick.emit(A)}):this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe(),this.positionChange.observers.length>0&&(this._positionSubscription=this._position.positionChanges.pipe(Bv(()=>this.positionChange.observers.length>0)).subscribe(A=>{this._ngZone.run(()=>this.positionChange.emit(A)),this.positionChange.observers.length===0&&this._positionSubscription.unsubscribe()}))}_detachOverlay(){this._overlayRef&&this._overlayRef.detach(),this._backdropSubscription.unsubscribe(),this._positionSubscription.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","cdk-connected-overlay",""],["","connected-overlay",""],["","cdkConnectedOverlay",""]],inputs:{origin:[0,"cdkConnectedOverlayOrigin","origin"],positions:[0,"cdkConnectedOverlayPositions","positions"],positionStrategy:[0,"cdkConnectedOverlayPositionStrategy","positionStrategy"],offsetX:[0,"cdkConnectedOverlayOffsetX","offsetX"],offsetY:[0,"cdkConnectedOverlayOffsetY","offsetY"],width:[0,"cdkConnectedOverlayWidth","width"],height:[0,"cdkConnectedOverlayHeight","height"],minWidth:[0,"cdkConnectedOverlayMinWidth","minWidth"],minHeight:[0,"cdkConnectedOverlayMinHeight","minHeight"],backdropClass:[0,"cdkConnectedOverlayBackdropClass","backdropClass"],panelClass:[0,"cdkConnectedOverlayPanelClass","panelClass"],viewportMargin:[0,"cdkConnectedOverlayViewportMargin","viewportMargin"],scrollStrategy:[0,"cdkConnectedOverlayScrollStrategy","scrollStrategy"],open:[0,"cdkConnectedOverlayOpen","open"],disableClose:[0,"cdkConnectedOverlayDisableClose","disableClose"],transformOriginSelector:[0,"cdkConnectedOverlayTransformOriginOn","transformOriginSelector"],hasBackdrop:[2,"cdkConnectedOverlayHasBackdrop","hasBackdrop",ie],lockPosition:[2,"cdkConnectedOverlayLockPosition","lockPosition",ie],flexibleDimensions:[2,"cdkConnectedOverlayFlexibleDimensions","flexibleDimensions",ie],growAfterOpen:[2,"cdkConnectedOverlayGrowAfterOpen","growAfterOpen",ie],push:[2,"cdkConnectedOverlayPush","push",ie],disposeOnNavigation:[2,"cdkConnectedOverlayDisposeOnNavigation","disposeOnNavigation",ie]},outputs:{backdropClick:"backdropClick",positionChange:"positionChange",attach:"attach",detach:"detach",overlayKeydown:"overlayKeydown",overlayOutsideClick:"overlayOutsideClick"},exportAs:["cdkConnectedOverlay"],features:[ti]})}return t})();function XuA(t){return()=>t.scrollStrategies.reposition()}var $uA={provide:QP,deps:[nr],useFactory:XuA},El=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({providers:[nr,$uA],imports:[_2,dg,xu,xu]})}return t})();var Jk=class{_box;_destroyed=new OA;_resizeSubject=new OA;_resizeObserver;_elementObservables=new Map;constructor(e){this._box=e,typeof ResizeObserver<"u"&&(this._resizeObserver=new ResizeObserver(A=>this._resizeSubject.next(A)))}observe(e){return this._elementObservables.has(e)||this._elementObservables.set(e,new ct(A=>{let i=this._resizeSubject.subscribe(A);return this._resizeObserver?.observe(e,{box:this._box}),()=>{this._resizeObserver?.unobserve(e),i.unsubscribe(),this._elementObservables.delete(e)}}).pipe(kt(A=>A.some(i=>i.target===e)),a0({bufferSize:1,refCount:!0}),St(this._destroyed))),this._elementObservables.get(e)}destroy(){this._destroyed.next(),this._destroyed.complete(),this._resizeSubject.complete(),this._elementObservables.clear()}},B8=(()=>{class t{_cleanupErrorListener;_observers=new Map;_ngZone=f(Qe);constructor(){typeof ResizeObserver<"u"}ngOnDestroy(){for(let[,A]of this._observers)A.destroy();this._observers.clear(),this._cleanupErrorListener?.()}observe(A,i){let n=i?.box||"content-box";return this._observers.has(n)||this._observers.set(n,new Jk(n)),this._observers.get(n).observe(A)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var Ci=function(t){return t[t.State=0]="State",t[t.Transition=1]="Transition",t[t.Sequence=2]="Sequence",t[t.Group=3]="Group",t[t.Animate=4]="Animate",t[t.Keyframes=5]="Keyframes",t[t.Style=6]="Style",t[t.Trigger=7]="Trigger",t[t.Reference=8]="Reference",t[t.AnimateChild=9]="AnimateChild",t[t.AnimateRef=10]="AnimateRef",t[t.Query=11]="Query",t[t.Stagger=12]="Stagger",t}(Ci||{}),kc="*";function sc(t,e){return{type:Ci.Trigger,name:t,definitions:e,options:{}}}function ss(t,e=null){return{type:Ci.Animate,styles:e,timings:t}}function hP(t,e=null){return{type:Ci.Sequence,steps:t,options:e}}function po(t){return{type:Ci.Style,styles:t,offset:null}}function js(t,e,A){return{type:Ci.State,name:t,styles:e,options:A}}function Vr(t,e,A=null){return{type:Ci.Transition,expr:t,animation:e,options:A}}function Tk(t=null){return{type:Ci.AnimateChild,options:t}}function Hk(t,e,A=null){return{type:Ci.Query,selector:t,animation:e,options:A}}var Eg=class{_onDoneFns=[];_onStartFns=[];_onDestroyFns=[];_originalOnDoneFns=[];_originalOnStartFns=[];_started=!1;_destroyed=!1;_finished=!1;_position=0;parentPlayer=null;totalTime;constructor(e=0,A=0){this.totalTime=e+A}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}onStart(e){this._originalOnStartFns.push(e),this._onStartFns.push(e)}onDone(e){this._originalOnDoneFns.push(e),this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}hasStarted(){return this._started}init(){}play(){this.hasStarted()||(this._onStart(),this.triggerMicrotask()),this._started=!0}triggerMicrotask(){queueMicrotask(()=>this._onFinish())}_onStart(){this._onStartFns.forEach(e=>e()),this._onStartFns=[]}pause(){}restart(){}finish(){this._onFinish()}destroy(){this._destroyed||(this._destroyed=!0,this.hasStarted()||this._onStart(),this.finish(),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}reset(){this._started=!1,this._finished=!1,this._onStartFns=this._originalOnStartFns,this._onDoneFns=this._originalOnDoneFns}setPosition(e){this._position=this.totalTime?e*this.totalTime:1}getPosition(){return this.totalTime?this._position/this.totalTime:1}triggerCallback(e){let A=e=="start"?this._onStartFns:this._onDoneFns;A.forEach(i=>i()),A.length=0}},tC=class{_onDoneFns=[];_onStartFns=[];_finished=!1;_started=!1;_destroyed=!1;_onDestroyFns=[];parentPlayer=null;totalTime=0;players;constructor(e){this.players=e;let A=0,i=0,n=0,o=this.players.length;o==0?queueMicrotask(()=>this._onFinish()):this.players.forEach(r=>{r.onDone(()=>{++A==o&&this._onFinish()}),r.onDestroy(()=>{++i==o&&this._onDestroy()}),r.onStart(()=>{++n==o&&this._onStart()})}),this.totalTime=this.players.reduce((r,s)=>Math.max(r,s.totalTime),0)}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}init(){this.players.forEach(e=>e.init())}onStart(e){this._onStartFns.push(e)}_onStart(){this.hasStarted()||(this._started=!0,this._onStartFns.forEach(e=>e()),this._onStartFns=[])}onDone(e){this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}hasStarted(){return this._started}play(){this.parentPlayer||this.init(),this._onStart(),this.players.forEach(e=>e.play())}pause(){this.players.forEach(e=>e.pause())}restart(){this.players.forEach(e=>e.restart())}finish(){this._onFinish(),this.players.forEach(e=>e.finish())}destroy(){this._onDestroy()}_onDestroy(){this._destroyed||(this._destroyed=!0,this._onFinish(),this.players.forEach(e=>e.destroy()),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}reset(){this.players.forEach(e=>e.reset()),this._destroyed=!1,this._finished=!1,this._started=!1}setPosition(e){let A=e*this.totalTime;this.players.forEach(i=>{let n=i.totalTime?Math.min(1,A/i.totalTime):1;i.setPosition(n)})}getPosition(){let e=this.players.reduce((A,i)=>A===null||i.totalTime>A.totalTime?i:A,null);return e!=null?e.getPosition():0}beforeDestroy(){this.players.forEach(e=>{e.beforeDestroy&&e.beforeDestroy()})}triggerCallback(e){let A=e=="start"?this._onStartFns:this._onDoneFns;A.forEach(i=>i()),A.length=0}},FB="!";var A4A=["notch"],e4A=["matFormFieldNotchedOutline",""],t4A=["*"],i4A=["textField"],n4A=["iconPrefixContainer"],o4A=["textPrefixContainer"],r4A=["iconSuffixContainer"],s4A=["textSuffixContainer"],a4A=["*",[["mat-label"]],[["","matPrefix",""],["","matIconPrefix",""]],[["","matTextPrefix",""]],[["","matTextSuffix",""]],[["","matSuffix",""],["","matIconSuffix",""]],[["mat-error"],["","matError",""]],[["mat-hint",3,"align","end"]],[["mat-hint","align","end"]]],c4A=["*","mat-label","[matPrefix], [matIconPrefix]","[matTextPrefix]","[matTextSuffix]","[matSuffix], [matIconSuffix]","mat-error, [matError]","mat-hint:not([align='end'])","mat-hint[align='end']"];function l4A(t,e){t&1&&JA(0,"span",21)}function g4A(t,e){if(t&1&&(S(0,"label",20),Fe(1,1),_A(2,l4A,1,0,"span",21),F()),t&2){let A=O(2);yA("floating",A._shouldLabelFloat())("monitorResize",A._hasOutline())("id",A._labelId),Ne("for",A._control.disableAutomaticLabeling?null:A._control.id),G(2),GA(!A.hideRequiredMarker&&A._control.required?2:-1)}}function I4A(t,e){if(t&1&&_A(0,g4A,3,5,"label",20),t&2){let A=O();GA(A._hasFloatingLabel()?0:-1)}}function C4A(t,e){t&1&&JA(0,"div",7)}function d4A(t,e){}function B4A(t,e){if(t&1&&_A(0,d4A,0,0,"ng-template",13),t&2){O(2);let A=cr(1);yA("ngTemplateOutlet",A)}}function E4A(t,e){if(t&1&&(S(0,"div",9),_A(1,B4A,1,1,null,13),F()),t&2){let A=O();yA("matFormFieldNotchedOutlineOpen",A._shouldLabelFloat()),G(),GA(A._forceDisplayInfixLabel()?-1:1)}}function Q4A(t,e){t&1&&(S(0,"div",10,2),Fe(2,2),F())}function h4A(t,e){t&1&&(S(0,"div",11,3),Fe(2,3),F())}function u4A(t,e){}function f4A(t,e){if(t&1&&_A(0,u4A,0,0,"ng-template",13),t&2){O();let A=cr(1);yA("ngTemplateOutlet",A)}}function m4A(t,e){t&1&&(S(0,"div",14,4),Fe(2,4),F())}function p4A(t,e){t&1&&(S(0,"div",15,5),Fe(2,5),F())}function w4A(t,e){t&1&&JA(0,"div",16)}function D4A(t,e){if(t&1&&(S(0,"div",18),Fe(1,6),F()),t&2){let A=O();yA("@transitionMessages",A._subscriptAnimationState)}}function y4A(t,e){if(t&1&&(S(0,"mat-hint",22),AA(1),F()),t&2){let A=O(2);yA("id",A._hintLabelId),G(),Gt(A.hintLabel)}}function v4A(t,e){if(t&1&&(S(0,"div",19),_A(1,y4A,2,2,"mat-hint",22),Fe(2,7),JA(3,"div",23),Fe(4,8),F()),t&2){let A=O();yA("@transitionMessages",A._subscriptAnimationState),G(),GA(A.hintLabel?1:-1)}}var Q8=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["mat-label"]]})}return t})(),b4A=new dA("MatError");var uP=(()=>{class t{align="start";id=f(sn).getId("mat-mdc-hint-");static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["mat-hint"]],hostAttrs:[1,"mat-mdc-form-field-hint","mat-mdc-form-field-bottom-align"],hostVars:4,hostBindings:function(i,n){i&2&&(Hs("id",n.id),Ne("align",null),ue("mat-mdc-form-field-hint-end",n.align==="end"))},inputs:{align:"align",id:"id"}})}return t})(),M4A=new dA("MatPrefix");var vP=new dA("MatSuffix"),bP=(()=>{class t{set _isTextSelector(A){this._isText=!0}_isText=!1;static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","matSuffix",""],["","matIconSuffix",""],["","matTextSuffix",""]],inputs:{_isTextSelector:[0,"matTextSuffix","_isTextSelector"]},features:[ht([{provide:vP,useExisting:t}])]})}return t})(),MP=new dA("FloatingLabelParent"),fP=(()=>{class t{_elementRef=f(ee);get floating(){return this._floating}set floating(A){this._floating=A,this.monitorResize&&this._handleResize()}_floating=!1;get monitorResize(){return this._monitorResize}set monitorResize(A){this._monitorResize=A,this._monitorResize?this._subscribeToResize():this._resizeSubscription.unsubscribe()}_monitorResize=!1;_resizeObserver=f(B8);_ngZone=f(Qe);_parent=f(MP);_resizeSubscription=new Kt;constructor(){}ngOnDestroy(){this._resizeSubscription.unsubscribe()}getWidth(){return k4A(this._elementRef.nativeElement)}get element(){return this._elementRef.nativeElement}_handleResize(){setTimeout(()=>this._parent._handleLabelResized())}_subscribeToResize(){this._resizeSubscription.unsubscribe(),this._ngZone.runOutsideAngular(()=>{this._resizeSubscription=this._resizeObserver.observe(this._elementRef.nativeElement,{box:"border-box"}).subscribe(()=>this._handleResize())})}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["label","matFormFieldFloatingLabel",""]],hostAttrs:[1,"mdc-floating-label","mat-mdc-floating-label"],hostVars:2,hostBindings:function(i,n){i&2&&ue("mdc-floating-label--float-above",n.floating)},inputs:{floating:"floating",monitorResize:"monitorResize"}})}return t})();function k4A(t){let e=t;if(e.offsetParent!==null)return e.scrollWidth;let A=e.cloneNode(!0);A.style.setProperty("position","absolute"),A.style.setProperty("transform","translate(-9999px, -9999px)"),document.documentElement.appendChild(A);let i=A.scrollWidth;return A.remove(),i}var mP="mdc-line-ripple--active",E8="mdc-line-ripple--deactivating",pP=(()=>{class t{_elementRef=f(ee);_cleanupTransitionEnd;constructor(){let A=f(Qe),i=f(Wi);A.runOutsideAngular(()=>{this._cleanupTransitionEnd=i.listen(this._elementRef.nativeElement,"transitionend",this._handleTransitionEnd)})}activate(){let A=this._elementRef.nativeElement.classList;A.remove(E8),A.add(mP)}deactivate(){this._elementRef.nativeElement.classList.add(E8)}_handleTransitionEnd=A=>{let i=this._elementRef.nativeElement.classList,n=i.contains(E8);A.propertyName==="opacity"&&n&&i.remove(mP,E8)};ngOnDestroy(){this._cleanupTransitionEnd()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["div","matFormFieldLineRipple",""]],hostAttrs:[1,"mdc-line-ripple"]})}return t})(),wP=(()=>{class t{_elementRef=f(ee);_ngZone=f(Qe);open=!1;_notch;constructor(){}ngAfterViewInit(){let A=this._elementRef.nativeElement.querySelector(".mdc-floating-label");A?(this._elementRef.nativeElement.classList.add("mdc-notched-outline--upgraded"),typeof requestAnimationFrame=="function"&&(A.style.transitionDuration="0s",this._ngZone.runOutsideAngular(()=>{requestAnimationFrame(()=>A.style.transitionDuration="")}))):this._elementRef.nativeElement.classList.add("mdc-notched-outline--no-label")}_setNotchWidth(A){!this.open||!A?this._notch.nativeElement.style.width="":this._notch.nativeElement.style.width=`calc(${A}px * var(--mat-mdc-form-field-floating-label-scale, 0.75) + 9px)`}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["div","matFormFieldNotchedOutline",""]],viewQuery:function(i,n){if(i&1&&Te(A4A,5),i&2){let o;XA(o=$A())&&(n._notch=o.first)}},hostAttrs:[1,"mdc-notched-outline"],hostVars:2,hostBindings:function(i,n){i&2&&ue("mdc-notched-outline--notched",n.open)},inputs:{open:[0,"matFormFieldNotchedOutlineOpen","open"]},attrs:e4A,ngContentSelectors:t4A,decls:5,vars:0,consts:[["notch",""],[1,"mat-mdc-notch-piece","mdc-notched-outline__leading"],[1,"mat-mdc-notch-piece","mdc-notched-outline__notch"],[1,"mat-mdc-notch-piece","mdc-notched-outline__trailing"]],template:function(i,n){i&1&&(jt(),JA(0,"div",1),S(1,"div",2,0),Fe(3),F(),JA(4,"div",3))},encapsulation:2,changeDetection:0})}return t})(),S4A={transitionMessages:sc("transitionMessages",[js("enter",po({opacity:1,transform:"translateY(0%)"})),Vr("void => enter",[po({opacity:0,transform:"translateY(-5px)"}),ss("300ms cubic-bezier(0.55, 0, 0.55, 0.2)")])])},_u=(()=>{class t{value;stateChanges;id;placeholder;ngControl;focused;empty;shouldLabelFloat;required;disabled;errorState;controlType;autofilled;userAriaDescribedBy;disableAutomaticLabeling;static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t})}return t})();var Gu=new dA("MatFormField"),R4A=new dA("MAT_FORM_FIELD_DEFAULT_OPTIONS"),DP="fill",x4A="auto",yP="fixed",L4A="translateY(-50%)",Qg=(()=>{class t{_elementRef=f(ee);_changeDetectorRef=f(It);_dir=f(mo);_platform=f(Ii);_idGenerator=f(sn);_defaults=f(R4A,{optional:!0});_animationMode=f(Si,{optional:!0});_textField;_iconPrefixContainer;_textPrefixContainer;_iconSuffixContainer;_textSuffixContainer;_floatingLabel;_notchedOutline;_lineRipple;_formFieldControl;_prefixChildren;_suffixChildren;_errorChildren;_hintChildren;_labelChild=GT(Q8);get hideRequiredMarker(){return this._hideRequiredMarker}set hideRequiredMarker(A){this._hideRequiredMarker=Xo(A)}_hideRequiredMarker=!1;color="primary";get floatLabel(){return this._floatLabel||this._defaults?.floatLabel||x4A}set floatLabel(A){A!==this._floatLabel&&(this._floatLabel=A,this._changeDetectorRef.markForCheck())}_floatLabel;get appearance(){return this._appearance}set appearance(A){let i=this._appearance,n=A||this._defaults?.appearance||DP;this._appearance=n,this._appearance==="outline"&&this._appearance!==i&&(this._needsOutlineLabelOffsetUpdate=!0)}_appearance=DP;get subscriptSizing(){return this._subscriptSizing||this._defaults?.subscriptSizing||yP}set subscriptSizing(A){this._subscriptSizing=A||this._defaults?.subscriptSizing||yP}_subscriptSizing=null;get hintLabel(){return this._hintLabel}set hintLabel(A){this._hintLabel=A,this._processHints()}_hintLabel="";_hasIconPrefix=!1;_hasTextPrefix=!1;_hasIconSuffix=!1;_hasTextSuffix=!1;_labelId=this._idGenerator.getId("mat-mdc-form-field-label-");_hintLabelId=this._idGenerator.getId("mat-mdc-hint-");_subscriptAnimationState="";get _control(){return this._explicitFormFieldControl||this._formFieldControl}set _control(A){this._explicitFormFieldControl=A}_destroyed=new OA;_isFocused=null;_explicitFormFieldControl;_needsOutlineLabelOffsetUpdate=!1;_previousControl=null;_stateChanges;_valueChanges;_describedByChanges;_injector=f(Rt);constructor(){let A=this._defaults;A&&(A.appearance&&(this.appearance=A.appearance),this._hideRequiredMarker=!!A?.hideRequiredMarker,A.color&&(this.color=A.color))}ngAfterViewInit(){this._updateFocusState(),this._subscriptAnimationState="enter",this._changeDetectorRef.detectChanges()}ngAfterContentInit(){this._assertFormFieldControl(),this._initializeSubscript(),this._initializePrefixAndSuffix(),this._initializeOutlineLabelOffsetSubscriptions()}ngAfterContentChecked(){this._assertFormFieldControl(),this._control!==this._previousControl&&(this._initializeControl(this._previousControl),this._previousControl=this._control)}ngOnDestroy(){this._stateChanges?.unsubscribe(),this._valueChanges?.unsubscribe(),this._describedByChanges?.unsubscribe(),this._destroyed.next(),this._destroyed.complete()}getLabelId=h0(()=>this._hasFloatingLabel()?this._labelId:null);getConnectedOverlayOrigin(){return this._textField||this._elementRef}_animateAndLockLabel(){this._hasFloatingLabel()&&(this.floatLabel="always")}_initializeControl(A){let i=this._control,n="mat-mdc-form-field-type-";A&&this._elementRef.nativeElement.classList.remove(n+A.controlType),i.controlType&&this._elementRef.nativeElement.classList.add(n+i.controlType),this._stateChanges?.unsubscribe(),this._stateChanges=i.stateChanges.subscribe(()=>{this._updateFocusState(),this._changeDetectorRef.markForCheck()}),this._describedByChanges?.unsubscribe(),this._describedByChanges=i.stateChanges.pipe(Pn([void 0,void 0]),je(()=>[i.errorState,i.userAriaDescribedBy]),pm(),kt(([[o,r],[s,a]])=>o!==s||r!==a)).subscribe(()=>this._syncDescribedByIds()),this._valueChanges?.unsubscribe(),i.ngControl&&i.ngControl.valueChanges&&(this._valueChanges=i.ngControl.valueChanges.pipe(St(this._destroyed)).subscribe(()=>this._changeDetectorRef.markForCheck()))}_checkPrefixAndSuffixTypes(){this._hasIconPrefix=!!this._prefixChildren.find(A=>!A._isText),this._hasTextPrefix=!!this._prefixChildren.find(A=>A._isText),this._hasIconSuffix=!!this._suffixChildren.find(A=>!A._isText),this._hasTextSuffix=!!this._suffixChildren.find(A=>A._isText)}_initializePrefixAndSuffix(){this._checkPrefixAndSuffixTypes(),zn(this._prefixChildren.changes,this._suffixChildren.changes).subscribe(()=>{this._checkPrefixAndSuffixTypes(),this._changeDetectorRef.markForCheck()})}_initializeSubscript(){this._hintChildren.changes.subscribe(()=>{this._processHints(),this._changeDetectorRef.markForCheck()}),this._errorChildren.changes.subscribe(()=>{this._syncDescribedByIds(),this._changeDetectorRef.markForCheck()}),this._validateHints(),this._syncDescribedByIds()}_assertFormFieldControl(){this._control}_updateFocusState(){this._control.focused&&!this._isFocused?(this._isFocused=!0,this._lineRipple?.activate()):!this._control.focused&&(this._isFocused||this._isFocused===null)&&(this._isFocused=!1,this._lineRipple?.deactivate()),this._textField?.nativeElement.classList.toggle("mdc-text-field--focused",this._control.focused)}_initializeOutlineLabelOffsetSubscriptions(){this._prefixChildren.changes.subscribe(()=>this._needsOutlineLabelOffsetUpdate=!0),vh(()=>{this._needsOutlineLabelOffsetUpdate&&(this._needsOutlineLabelOffsetUpdate=!1,this._updateOutlineLabelOffset())},{injector:this._injector}),this._dir.change.pipe(St(this._destroyed)).subscribe(()=>this._needsOutlineLabelOffsetUpdate=!0)}_shouldAlwaysFloat(){return this.floatLabel==="always"}_hasOutline(){return this.appearance==="outline"}_forceDisplayInfixLabel(){return!this._platform.isBrowser&&this._prefixChildren.length&&!this._shouldLabelFloat()}_hasFloatingLabel=h0(()=>!!this._labelChild());_shouldLabelFloat(){return this._hasFloatingLabel()?this._control.shouldLabelFloat||this._shouldAlwaysFloat():!1}_shouldForward(A){let i=this._control?this._control.ngControl:null;return i&&i[A]}_getDisplayedMessages(){return this._errorChildren&&this._errorChildren.length>0&&this._control.errorState?"error":"hint"}_handleLabelResized(){this._refreshOutlineNotchWidth()}_refreshOutlineNotchWidth(){!this._hasOutline()||!this._floatingLabel||!this._shouldLabelFloat()?this._notchedOutline?._setNotchWidth(0):this._notchedOutline?._setNotchWidth(this._floatingLabel.getWidth())}_processHints(){this._validateHints(),this._syncDescribedByIds()}_validateHints(){this._hintChildren}_syncDescribedByIds(){if(this._control){let A=[];if(this._control.userAriaDescribedBy&&typeof this._control.userAriaDescribedBy=="string"&&A.push(...this._control.userAriaDescribedBy.split(" ")),this._getDisplayedMessages()==="hint"){let i=this._hintChildren?this._hintChildren.find(o=>o.align==="start"):null,n=this._hintChildren?this._hintChildren.find(o=>o.align==="end"):null;i?A.push(i.id):this._hintLabel&&A.push(this._hintLabelId),n&&A.push(n.id)}else this._errorChildren&&A.push(...this._errorChildren.map(i=>i.id));this._control.setDescribedByIds(A)}}_updateOutlineLabelOffset(){if(!this._hasOutline()||!this._floatingLabel)return;let A=this._floatingLabel.element;if(!(this._iconPrefixContainer||this._textPrefixContainer)){A.style.transform="";return}if(!this._isAttachedToDom()){this._needsOutlineLabelOffsetUpdate=!0;return}let i=this._iconPrefixContainer?.nativeElement,n=this._textPrefixContainer?.nativeElement,o=this._iconSuffixContainer?.nativeElement,r=this._textSuffixContainer?.nativeElement,s=i?.getBoundingClientRect().width??0,a=n?.getBoundingClientRect().width??0,c=o?.getBoundingClientRect().width??0,l=r?.getBoundingClientRect().width??0,I=this._dir.value==="rtl"?"-1":"1",C=`${s+a}px`,B=`calc(${I} * (${C} + var(--mat-mdc-form-field-label-offset-x, 0px)))`;A.style.transform=`var( - --mat-mdc-form-field-label-transform, - ${L4A} translateX(${B}) - )`;let E=s+a+c+l;this._elementRef.nativeElement.style.setProperty("--mat-form-field-notch-max-width",`calc(100% - ${E}px)`)}_isAttachedToDom(){let A=this._elementRef.nativeElement;if(A.getRootNode){let i=A.getRootNode();return i&&i!==A}return document.documentElement.contains(A)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-form-field"]],contentQueries:function(i,n,o){if(i&1&&(oH(o,n._labelChild,Q8,5),ci(o,_u,5),ci(o,M4A,5),ci(o,vP,5),ci(o,b4A,5),ci(o,uP,5)),i&2){rH();let r;XA(r=$A())&&(n._formFieldControl=r.first),XA(r=$A())&&(n._prefixChildren=r),XA(r=$A())&&(n._suffixChildren=r),XA(r=$A())&&(n._errorChildren=r),XA(r=$A())&&(n._hintChildren=r)}},viewQuery:function(i,n){if(i&1&&(Te(i4A,5),Te(n4A,5),Te(o4A,5),Te(r4A,5),Te(s4A,5),Te(fP,5),Te(wP,5),Te(pP,5)),i&2){let o;XA(o=$A())&&(n._textField=o.first),XA(o=$A())&&(n._iconPrefixContainer=o.first),XA(o=$A())&&(n._textPrefixContainer=o.first),XA(o=$A())&&(n._iconSuffixContainer=o.first),XA(o=$A())&&(n._textSuffixContainer=o.first),XA(o=$A())&&(n._floatingLabel=o.first),XA(o=$A())&&(n._notchedOutline=o.first),XA(o=$A())&&(n._lineRipple=o.first)}},hostAttrs:[1,"mat-mdc-form-field"],hostVars:42,hostBindings:function(i,n){i&2&&ue("mat-mdc-form-field-label-always-float",n._shouldAlwaysFloat())("mat-mdc-form-field-has-icon-prefix",n._hasIconPrefix)("mat-mdc-form-field-has-icon-suffix",n._hasIconSuffix)("mat-form-field-invalid",n._control.errorState)("mat-form-field-disabled",n._control.disabled)("mat-form-field-autofilled",n._control.autofilled)("mat-form-field-no-animations",n._animationMode==="NoopAnimations")("mat-form-field-appearance-fill",n.appearance=="fill")("mat-form-field-appearance-outline",n.appearance=="outline")("mat-form-field-hide-placeholder",n._hasFloatingLabel()&&!n._shouldLabelFloat())("mat-focused",n._control.focused)("mat-primary",n.color!=="accent"&&n.color!=="warn")("mat-accent",n.color==="accent")("mat-warn",n.color==="warn")("ng-untouched",n._shouldForward("untouched"))("ng-touched",n._shouldForward("touched"))("ng-pristine",n._shouldForward("pristine"))("ng-dirty",n._shouldForward("dirty"))("ng-valid",n._shouldForward("valid"))("ng-invalid",n._shouldForward("invalid"))("ng-pending",n._shouldForward("pending"))},inputs:{hideRequiredMarker:"hideRequiredMarker",color:"color",floatLabel:"floatLabel",appearance:"appearance",subscriptSizing:"subscriptSizing",hintLabel:"hintLabel"},exportAs:["matFormField"],features:[ht([{provide:Gu,useExisting:t},{provide:MP,useExisting:t}])],ngContentSelectors:c4A,decls:18,vars:21,consts:[["labelTemplate",""],["textField",""],["iconPrefixContainer",""],["textPrefixContainer",""],["textSuffixContainer",""],["iconSuffixContainer",""],[1,"mat-mdc-text-field-wrapper","mdc-text-field",3,"click"],[1,"mat-mdc-form-field-focus-overlay"],[1,"mat-mdc-form-field-flex"],["matFormFieldNotchedOutline","",3,"matFormFieldNotchedOutlineOpen"],[1,"mat-mdc-form-field-icon-prefix"],[1,"mat-mdc-form-field-text-prefix"],[1,"mat-mdc-form-field-infix"],[3,"ngTemplateOutlet"],[1,"mat-mdc-form-field-text-suffix"],[1,"mat-mdc-form-field-icon-suffix"],["matFormFieldLineRipple",""],[1,"mat-mdc-form-field-subscript-wrapper","mat-mdc-form-field-bottom-align"],[1,"mat-mdc-form-field-error-wrapper"],[1,"mat-mdc-form-field-hint-wrapper"],["matFormFieldFloatingLabel","",3,"floating","monitorResize","id"],["aria-hidden","true",1,"mat-mdc-form-field-required-marker","mdc-floating-label--required"],[3,"id"],[1,"mat-mdc-form-field-hint-spacer"]],template:function(i,n){if(i&1){let o=be();jt(a4A),_A(0,I4A,1,1,"ng-template",null,0,Fh),S(2,"div",6,1),hA("click",function(s){return RA(o),xA(n._control.onContainerClick(s))}),_A(4,C4A,1,0,"div",7),S(5,"div",8),_A(6,E4A,2,2,"div",9)(7,Q4A,3,0,"div",10)(8,h4A,3,0,"div",11),S(9,"div",12),_A(10,f4A,1,1,null,13),Fe(11),F(),_A(12,m4A,3,0,"div",14)(13,p4A,3,0,"div",15),F(),_A(14,w4A,1,0,"div",16),F(),S(15,"div",17),_A(16,D4A,2,1,"div",18)(17,v4A,5,2,"div",19),F()}if(i&2){let o;G(2),ue("mdc-text-field--filled",!n._hasOutline())("mdc-text-field--outlined",n._hasOutline())("mdc-text-field--no-label",!n._hasFloatingLabel())("mdc-text-field--disabled",n._control.disabled)("mdc-text-field--invalid",n._control.errorState),G(2),GA(!n._hasOutline()&&!n._control.disabled?4:-1),G(2),GA(n._hasOutline()?6:-1),G(),GA(n._hasIconPrefix?7:-1),G(),GA(n._hasTextPrefix?8:-1),G(2),GA(!n._hasOutline()||n._forceDisplayInfixLabel()?10:-1),G(2),GA(n._hasTextSuffix?12:-1),G(),GA(n._hasIconSuffix?13:-1),G(),GA(n._hasOutline()?-1:14),G(),ue("mat-mdc-form-field-subscript-dynamic-size",n.subscriptSizing==="dynamic"),G(),GA((o=n._getDisplayedMessages())==="error"?16:o==="hint"?17:-1)}},dependencies:[fP,wP,Yh,pP,uP],styles:['.mdc-text-field{display:inline-flex;align-items:baseline;padding:0 16px;position:relative;box-sizing:border-box;overflow:hidden;will-change:opacity,transform,color;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.mdc-text-field__input{width:100%;min-width:0;border:none;border-radius:0;background:none;padding:0;-moz-appearance:none;-webkit-appearance:none;height:28px}.mdc-text-field__input::-webkit-calendar-picker-indicator{display:none}.mdc-text-field__input::-ms-clear{display:none}.mdc-text-field__input:focus{outline:none}.mdc-text-field__input:invalid{box-shadow:none}.mdc-text-field__input::placeholder{opacity:0}.mdc-text-field__input::-moz-placeholder{opacity:0}.mdc-text-field__input::-webkit-input-placeholder{opacity:0}.mdc-text-field__input:-ms-input-placeholder{opacity:0}.mdc-text-field--no-label .mdc-text-field__input::placeholder,.mdc-text-field--focused .mdc-text-field__input::placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-moz-placeholder,.mdc-text-field--focused .mdc-text-field__input::-moz-placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{opacity:1}.mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{opacity:1}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::-moz-placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive::-webkit-input-placeholder{opacity:0}.mdc-text-field--disabled:not(.mdc-text-field--no-label) .mdc-text-field__input.mat-mdc-input-disabled-interactive:-ms-input-placeholder{opacity:0}.mdc-text-field--outlined .mdc-text-field__input,.mdc-text-field--filled.mdc-text-field--no-label .mdc-text-field__input{height:100%}.mdc-text-field--outlined .mdc-text-field__input{display:flex;border:none !important;background-color:rgba(0,0,0,0)}.mdc-text-field--disabled .mdc-text-field__input{pointer-events:auto}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input{color:var(--mdc-filled-text-field-input-text-color, var(--mat-sys-on-surface));caret-color:var(--mdc-filled-text-field-caret-color, var(--mat-sys-primary))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:var(--mdc-filled-text-field-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::-moz-placeholder{color:var(--mdc-filled-text-field-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:var(--mdc-filled-text-field-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:var(--mdc-filled-text-field-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__input{caret-color:var(--mdc-filled-text-field-error-caret-color)}.mdc-text-field--filled.mdc-text-field--disabled .mdc-text-field__input{color:var(--mdc-filled-text-field-disabled-input-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input{color:var(--mdc-outlined-text-field-input-text-color, var(--mat-sys-on-surface));caret-color:var(--mdc-outlined-text-field-caret-color, var(--mat-sys-primary))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::placeholder{color:var(--mdc-outlined-text-field-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::-moz-placeholder{color:var(--mdc-outlined-text-field-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input::-webkit-input-placeholder{color:var(--mdc-outlined-text-field-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-text-field__input:-ms-input-placeholder{color:var(--mdc-outlined-text-field-input-text-placeholder-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-text-field__input{caret-color:var(--mdc-outlined-text-field-error-caret-color)}.mdc-text-field--outlined.mdc-text-field--disabled .mdc-text-field__input{color:var(--mdc-outlined-text-field-disabled-input-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}@media(forced-colors: active){.mdc-text-field--disabled .mdc-text-field__input{background-color:Window}}.mdc-text-field--filled{height:56px;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:var(--mdc-filled-text-field-container-shape, var(--mat-sys-corner-extra-small));border-top-right-radius:var(--mdc-filled-text-field-container-shape, var(--mat-sys-corner-extra-small))}.mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:var(--mdc-filled-text-field-container-color, var(--mat-sys-surface-variant))}.mdc-text-field--filled.mdc-text-field--disabled{background-color:var(--mdc-filled-text-field-disabled-container-color, color-mix(in srgb, var(--mat-sys-on-surface) 4%, transparent))}.mdc-text-field--outlined{height:56px;overflow:visible;padding-right:max(16px,var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small)));padding-left:max(16px,var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small)) + 4px)}[dir=rtl] .mdc-text-field--outlined{padding-right:max(16px,var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small)) + 4px);padding-left:max(16px,var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small)))}.mdc-floating-label{position:absolute;left:0;transform-origin:left top;line-height:1.15rem;text-align:left;text-overflow:ellipsis;white-space:nowrap;cursor:text;overflow:hidden;will-change:transform}[dir=rtl] .mdc-floating-label{right:0;left:auto;transform-origin:right top;text-align:right}.mdc-text-field .mdc-floating-label{top:50%;transform:translateY(-50%);pointer-events:none}.mdc-notched-outline .mdc-floating-label{display:inline-block;position:relative;max-width:100%}.mdc-text-field--outlined .mdc-floating-label{left:4px;right:auto}[dir=rtl] .mdc-text-field--outlined .mdc-floating-label{left:auto;right:4px}.mdc-text-field--filled .mdc-floating-label{left:16px;right:auto}[dir=rtl] .mdc-text-field--filled .mdc-floating-label{left:auto;right:16px}.mdc-text-field--disabled .mdc-floating-label{cursor:default}@media(forced-colors: active){.mdc-text-field--disabled .mdc-floating-label{z-index:1}}.mdc-text-field--filled.mdc-text-field--no-label .mdc-floating-label{display:none}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mdc-filled-text-field-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-floating-label{color:var(--mdc-filled-text-field-focus-label-text-color, var(--mat-sys-primary))}.mdc-text-field--filled:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-floating-label{color:var(--mdc-filled-text-field-hover-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-floating-label{color:var(--mdc-filled-text-field-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-floating-label{color:var(--mdc-filled-text-field-error-label-text-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mdc-floating-label{color:var(--mdc-filled-text-field-error-focus-label-text-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-floating-label{color:var(--mdc-filled-text-field-error-hover-label-text-color, var(--mat-sys-on-error-container))}.mdc-text-field--filled .mdc-floating-label{font-family:var(--mdc-filled-text-field-label-text-font, var(--mat-sys-body-large-font));font-size:var(--mdc-filled-text-field-label-text-size, var(--mat-sys-body-large-size));font-weight:var(--mdc-filled-text-field-label-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mdc-filled-text-field-label-text-tracking, var(--mat-sys-body-large-tracking))}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mdc-floating-label{color:var(--mdc-outlined-text-field-label-text-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-floating-label{color:var(--mdc-outlined-text-field-focus-label-text-color, var(--mat-sys-primary))}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-floating-label{color:var(--mdc-outlined-text-field-hover-label-text-color, var(--mat-sys-on-surface))}.mdc-text-field--outlined.mdc-text-field--disabled .mdc-floating-label{color:var(--mdc-outlined-text-field-disabled-label-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-floating-label{color:var(--mdc-outlined-text-field-error-label-text-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mdc-floating-label{color:var(--mdc-outlined-text-field-error-focus-label-text-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--disabled):hover .mdc-floating-label{color:var(--mdc-outlined-text-field-error-hover-label-text-color, var(--mat-sys-on-error-container))}.mdc-text-field--outlined .mdc-floating-label{font-family:var(--mdc-outlined-text-field-label-text-font, var(--mat-sys-body-large-font));font-size:var(--mdc-outlined-text-field-label-text-size, var(--mat-sys-body-large-size));font-weight:var(--mdc-outlined-text-field-label-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mdc-outlined-text-field-label-text-tracking, var(--mat-sys-body-large-tracking))}.mdc-floating-label--float-above{cursor:auto;transform:translateY(-106%) scale(0.75)}.mdc-text-field--filled .mdc-floating-label--float-above{transform:translateY(-106%) scale(0.75)}.mdc-text-field--outlined .mdc-floating-label--float-above{transform:translateY(-37.25px) scale(1);font-size:.75rem}.mdc-notched-outline .mdc-floating-label--float-above{text-overflow:clip}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:133.3333333333%}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{transform:translateY(-34.75px) scale(0.75)}.mdc-text-field--outlined.mdc-notched-outline--upgraded .mdc-floating-label--float-above,.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:1rem}.mdc-floating-label--required:not(.mdc-floating-label--hide-required-marker)::after{margin-left:1px;margin-right:0;content:"*"}[dir=rtl] .mdc-floating-label--required:not(.mdc-floating-label--hide-required-marker)::after{margin-left:0;margin-right:1px}.mdc-notched-outline{display:flex;position:absolute;top:0;right:0;left:0;box-sizing:border-box;width:100%;max-width:100%;height:100%;text-align:left;pointer-events:none}[dir=rtl] .mdc-notched-outline{text-align:right}.mdc-text-field--outlined .mdc-notched-outline{z-index:1}.mat-mdc-notch-piece{box-sizing:border-box;height:100%;pointer-events:none;border-top:1px solid;border-bottom:1px solid}.mdc-text-field--focused .mat-mdc-notch-piece{border-width:2px}.mdc-text-field--outlined:not(.mdc-text-field--disabled) .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-outline-color, var(--mat-sys-outline));border-width:var(--mdc-outlined-text-field-outline-width, 1px)}.mdc-text-field--outlined:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-hover-outline-color, var(--mat-sys-on-surface))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-focus-outline-color, var(--mat-sys-primary))}.mdc-text-field--outlined.mdc-text-field--disabled .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-disabled-outline-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-error-outline-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--focused):hover .mdc-notched-outline .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-error-hover-outline-color, var(--mat-sys-on-error-container))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--invalid.mdc-text-field--focused .mat-mdc-notch-piece{border-color:var(--mdc-outlined-text-field-error-focus-outline-color, var(--mat-sys-error))}.mdc-text-field--outlined:not(.mdc-text-field--disabled).mdc-text-field--focused .mdc-notched-outline .mat-mdc-notch-piece{border-width:var(--mdc-outlined-text-field-focus-outline-width, 2px)}.mdc-notched-outline__leading{border-left:1px solid;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small));border-bottom-left-radius:var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small))}.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__leading{width:max(12px,var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small)))}[dir=rtl] .mdc-notched-outline__leading{border-left:none;border-right:1px solid;border-bottom-left-radius:0;border-top-left-radius:0;border-top-right-radius:var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small));border-bottom-right-radius:var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small))}.mdc-notched-outline__trailing{flex-grow:1;border-left:none;border-right:1px solid;border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small));border-bottom-right-radius:var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small))}[dir=rtl] .mdc-notched-outline__trailing{border-left:1px solid;border-right:none;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small));border-bottom-left-radius:var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small))}.mdc-notched-outline__notch{flex:0 0 auto;width:auto}.mdc-text-field--outlined .mdc-notched-outline .mdc-notched-outline__notch{max-width:min(var(--mat-form-field-notch-max-width, 100%),100% - max(12px,var(--mdc-outlined-text-field-container-shape, var(--mat-sys-corner-extra-small)))*2)}.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:1px}.mdc-text-field--focused.mdc-text-field--outlined .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-top:2px}.mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:0;padding-right:8px;border-top:none;--mat-form-field-notch-max-width: 100%}[dir=rtl] .mdc-notched-outline--notched .mdc-notched-outline__notch{padding-left:8px;padding-right:0}.mdc-notched-outline--no-label .mdc-notched-outline__notch{display:none}.mdc-line-ripple::before,.mdc-line-ripple::after{position:absolute;bottom:0;left:0;width:100%;border-bottom-style:solid;content:""}.mdc-line-ripple::before{z-index:1;border-bottom-width:var(--mdc-filled-text-field-active-indicator-height, 1px)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::before{border-bottom-color:var(--mdc-filled-text-field-active-indicator-color, var(--mat-sys-on-surface-variant))}.mdc-text-field--filled:not(.mdc-text-field--disabled):not(.mdc-text-field--focused):hover .mdc-line-ripple::before{border-bottom-color:var(--mdc-filled-text-field-hover-active-indicator-color, var(--mat-sys-on-surface))}.mdc-text-field--filled.mdc-text-field--disabled .mdc-line-ripple::before{border-bottom-color:var(--mdc-filled-text-field-disabled-active-indicator-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid .mdc-line-ripple::before{border-bottom-color:var(--mdc-filled-text-field-error-active-indicator-color, var(--mat-sys-error))}.mdc-text-field--filled:not(.mdc-text-field--disabled).mdc-text-field--invalid:not(.mdc-text-field--focused):hover .mdc-line-ripple::before{border-bottom-color:var(--mdc-filled-text-field-error-hover-active-indicator-color, var(--mat-sys-on-error-container))}.mdc-line-ripple::after{transform:scaleX(0);opacity:0;z-index:2}.mdc-text-field--filled .mdc-line-ripple::after{border-bottom-width:var(--mdc-filled-text-field-focus-active-indicator-height, 2px)}.mdc-text-field--filled:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:var(--mdc-filled-text-field-focus-active-indicator-color, var(--mat-sys-primary))}.mdc-text-field--filled.mdc-text-field--invalid:not(.mdc-text-field--disabled) .mdc-line-ripple::after{border-bottom-color:var(--mdc-filled-text-field-error-focus-active-indicator-color, var(--mat-sys-error))}.mdc-line-ripple--active::after{transform:scaleX(1);opacity:1}.mdc-line-ripple--deactivating::after{opacity:0}.mdc-text-field--disabled{pointer-events:none}.mat-mdc-form-field-textarea-control{vertical-align:middle;resize:vertical;box-sizing:border-box;height:auto;margin:0;padding:0;border:none;overflow:auto}.mat-mdc-form-field-input-control.mat-mdc-form-field-input-control{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font:inherit;letter-spacing:inherit;text-decoration:inherit;text-transform:inherit;border:none}.mat-mdc-form-field .mat-mdc-floating-label.mdc-floating-label{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;line-height:normal;pointer-events:all;will-change:auto}.mat-mdc-form-field:not(.mat-form-field-disabled) .mat-mdc-floating-label.mdc-floating-label{cursor:inherit}.mdc-text-field--no-label:not(.mdc-text-field--textarea) .mat-mdc-form-field-input-control.mdc-text-field__input,.mat-mdc-text-field-wrapper .mat-mdc-form-field-input-control{height:auto}.mat-mdc-text-field-wrapper .mat-mdc-form-field-input-control.mdc-text-field__input[type=color]{height:23px}.mat-mdc-text-field-wrapper{height:auto;flex:auto;will-change:auto}.mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding-left:0;--mat-mdc-form-field-label-offset-x: -16px}.mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-right:0}[dir=rtl] .mat-mdc-text-field-wrapper{padding-left:16px;padding-right:16px}[dir=rtl] .mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper{padding-left:0}[dir=rtl] .mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper{padding-right:0}.mat-form-field-disabled .mdc-text-field__input::placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input::-moz-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input::-webkit-input-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-disabled .mdc-text-field__input:-ms-input-placeholder{color:var(--mat-form-field-disabled-input-text-placeholder-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-label-always-float .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms;opacity:1}.mat-mdc-text-field-wrapper .mat-mdc-form-field-infix .mat-mdc-floating-label{left:auto;right:auto}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-text-field__input{display:inline-block}.mat-mdc-form-field .mat-mdc-text-field-wrapper.mdc-text-field .mdc-notched-outline__notch{padding-top:0}.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field .mdc-notched-outline__notch{border-left:1px solid rgba(0,0,0,0)}[dir=rtl] .mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field.mat-mdc-form-field .mdc-notched-outline__notch{border-left:none;border-right:1px solid rgba(0,0,0,0)}.mat-mdc-form-field-infix{min-height:var(--mat-form-field-container-height, 56px);padding-top:var(--mat-form-field-filled-with-label-container-padding-top, 24px);padding-bottom:var(--mat-form-field-filled-with-label-container-padding-bottom, 8px)}.mdc-text-field--outlined .mat-mdc-form-field-infix,.mdc-text-field--no-label .mat-mdc-form-field-infix{padding-top:var(--mat-form-field-container-vertical-padding, 16px);padding-bottom:var(--mat-form-field-container-vertical-padding, 16px)}.mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:calc(var(--mat-form-field-container-height, 56px)/2)}.mdc-text-field--filled .mat-mdc-floating-label{display:var(--mat-form-field-filled-label-display, block)}.mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{--mat-mdc-form-field-label-transform: translateY(calc(calc(6.75px + var(--mat-form-field-container-height, 56px) / 2) * -1)) scale(var(--mat-mdc-form-field-floating-label-scale, 0.75));transform:var(--mat-mdc-form-field-label-transform)}.mat-mdc-form-field-subscript-wrapper{box-sizing:border-box;width:100%;position:relative}.mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field-error-wrapper{position:absolute;top:0;left:0;right:0;padding:0 16px}.mat-mdc-form-field-subscript-dynamic-size .mat-mdc-form-field-hint-wrapper,.mat-mdc-form-field-subscript-dynamic-size .mat-mdc-form-field-error-wrapper{position:static}.mat-mdc-form-field-bottom-align::before{content:"";display:inline-block;height:16px}.mat-mdc-form-field-bottom-align.mat-mdc-form-field-subscript-dynamic-size::before{content:unset}.mat-mdc-form-field-hint-end{order:1}.mat-mdc-form-field-hint-wrapper{display:flex}.mat-mdc-form-field-hint-spacer{flex:1 0 1em}.mat-mdc-form-field-error{display:block;color:var(--mat-form-field-error-text-color, var(--mat-sys-error))}.mat-mdc-form-field-subscript-wrapper,.mat-mdc-form-field-bottom-align::before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-form-field-subscript-text-font, var(--mat-sys-body-small-font));line-height:var(--mat-form-field-subscript-text-line-height, var(--mat-sys-body-small-line-height));font-size:var(--mat-form-field-subscript-text-size, var(--mat-sys-body-small-size));letter-spacing:var(--mat-form-field-subscript-text-tracking, var(--mat-sys-body-small-tracking));font-weight:var(--mat-form-field-subscript-text-weight, var(--mat-sys-body-small-weight))}.mat-mdc-form-field-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;opacity:0;pointer-events:none;background-color:var(--mat-form-field-state-layer-color, var(--mat-sys-on-surface))}.mat-mdc-text-field-wrapper:hover .mat-mdc-form-field-focus-overlay{opacity:var(--mat-form-field-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-mdc-form-field.mat-focused .mat-mdc-form-field-focus-overlay{opacity:var(--mat-form-field-focus-state-layer-opacity, 0)}select.mat-mdc-form-field-input-control{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(0,0,0,0);display:inline-flex;box-sizing:border-box}select.mat-mdc-form-field-input-control:not(:disabled){cursor:pointer}select.mat-mdc-form-field-input-control:not(.mat-mdc-native-select-inline) option{color:var(--mat-form-field-select-option-text-color, var(--mat-sys-neutral10))}select.mat-mdc-form-field-input-control:not(.mat-mdc-native-select-inline) option:disabled{color:var(--mat-form-field-select-disabled-option-text-color, color-mix(in srgb, var(--mat-sys-neutral10) 38%, transparent))}.mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-infix::after{content:"";width:0;height:0;border-left:5px solid rgba(0,0,0,0);border-right:5px solid rgba(0,0,0,0);border-top:5px solid;position:absolute;right:0;top:50%;margin-top:-2.5px;pointer-events:none;color:var(--mat-form-field-enabled-select-arrow-color, var(--mat-sys-on-surface-variant))}[dir=rtl] .mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-infix::after{right:auto;left:0}.mat-mdc-form-field-type-mat-native-select.mat-focused .mat-mdc-form-field-infix::after{color:var(--mat-form-field-focus-select-arrow-color, var(--mat-sys-primary))}.mat-mdc-form-field-type-mat-native-select.mat-form-field-disabled .mat-mdc-form-field-infix::after{color:var(--mat-form-field-disabled-select-arrow-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-input-control{padding-right:15px}[dir=rtl] .mat-mdc-form-field-type-mat-native-select .mat-mdc-form-field-input-control{padding-right:0;padding-left:15px}@media(forced-colors: active){.mat-form-field-appearance-fill .mat-mdc-text-field-wrapper{outline:solid 1px}}@media(forced-colors: active){.mat-form-field-appearance-fill.mat-form-field-disabled .mat-mdc-text-field-wrapper{outline-color:GrayText}}@media(forced-colors: active){.mat-form-field-appearance-fill.mat-focused .mat-mdc-text-field-wrapper{outline:dashed 3px}}@media(forced-colors: active){.mat-mdc-form-field.mat-focused .mdc-notched-outline{border:dashed 3px}}.mat-mdc-form-field-input-control[type=date],.mat-mdc-form-field-input-control[type=datetime],.mat-mdc-form-field-input-control[type=datetime-local],.mat-mdc-form-field-input-control[type=month],.mat-mdc-form-field-input-control[type=week],.mat-mdc-form-field-input-control[type=time]{line-height:1}.mat-mdc-form-field-input-control::-webkit-datetime-edit{line-height:1;padding:0;margin-bottom:-2px}.mat-mdc-form-field{--mat-mdc-form-field-floating-label-scale: 0.75;display:inline-flex;flex-direction:column;min-width:0;text-align:left;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-form-field-container-text-font, var(--mat-sys-body-large-font));line-height:var(--mat-form-field-container-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mat-form-field-container-text-size, var(--mat-sys-body-large-size));letter-spacing:var(--mat-form-field-container-text-tracking, var(--mat-sys-body-large-tracking));font-weight:var(--mat-form-field-container-text-weight, var(--mat-sys-body-large-weight))}.mat-mdc-form-field .mdc-text-field--outlined .mdc-floating-label--float-above{font-size:calc(var(--mat-form-field-outlined-label-text-populated-size)*var(--mat-mdc-form-field-floating-label-scale))}.mat-mdc-form-field .mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:var(--mat-form-field-outlined-label-text-populated-size)}[dir=rtl] .mat-mdc-form-field{text-align:right}.mat-mdc-form-field-flex{display:inline-flex;align-items:baseline;box-sizing:border-box;width:100%}.mat-mdc-text-field-wrapper{width:100%;z-index:0}.mat-mdc-form-field-icon-prefix,.mat-mdc-form-field-icon-suffix{align-self:center;line-height:0;pointer-events:auto;position:relative;z-index:1}.mat-mdc-form-field-icon-prefix>.mat-icon,.mat-mdc-form-field-icon-suffix>.mat-icon{padding:0 12px;box-sizing:content-box}.mat-mdc-form-field-icon-prefix{color:var(--mat-form-field-leading-icon-color, var(--mat-sys-on-surface-variant))}.mat-form-field-disabled .mat-mdc-form-field-icon-prefix{color:var(--mat-form-field-disabled-leading-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-trailing-icon-color, var(--mat-sys-on-surface-variant))}.mat-form-field-disabled .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-disabled-trailing-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-form-field-invalid .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-trailing-icon-color, var(--mat-sys-error))}.mat-form-field-invalid:not(.mat-focused):not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper:hover .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-hover-trailing-icon-color, var(--mat-sys-on-error-container))}.mat-form-field-invalid.mat-focused .mat-mdc-text-field-wrapper .mat-mdc-form-field-icon-suffix{color:var(--mat-form-field-error-focus-trailing-icon-color, var(--mat-sys-error))}.mat-mdc-form-field-icon-prefix,[dir=rtl] .mat-mdc-form-field-icon-suffix{padding:0 4px 0 0}.mat-mdc-form-field-icon-suffix,[dir=rtl] .mat-mdc-form-field-icon-prefix{padding:0 0 0 4px}.mat-mdc-form-field-subscript-wrapper .mat-icon,.mat-mdc-form-field label .mat-icon{width:1em;height:1em;font-size:inherit}.mat-mdc-form-field-infix{flex:auto;min-width:0;width:180px;position:relative;box-sizing:border-box}.mat-mdc-form-field-infix:has(textarea[cols]){width:auto}.mat-mdc-form-field .mdc-notched-outline__notch{margin-left:-1px;-webkit-clip-path:inset(-9em -999em -9em 1px);clip-path:inset(-9em -999em -9em 1px)}[dir=rtl] .mat-mdc-form-field .mdc-notched-outline__notch{margin-left:0;margin-right:-1px;-webkit-clip-path:inset(-9em 1px -9em -999em);clip-path:inset(-9em 1px -9em -999em)}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:transform 150ms cubic-bezier(0.4, 0, 0.2, 1),color 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-text-field__input{transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-text-field__input::placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-text-field__input::-moz-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-text-field__input::-webkit-input-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-text-field__input:-ms-input-placeholder{transition:opacity 67ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--no-label .mdc-text-field__input::placeholder,.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--focused .mdc-text-field__input::placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--no-label .mdc-text-field__input::-moz-placeholder,.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--focused .mdc-text-field__input::-moz-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--no-label .mdc-text-field__input::-webkit-input-placeholder,.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--focused .mdc-text-field__input::-webkit-input-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--no-label .mdc-text-field__input:-ms-input-placeholder,.mat-mdc-form-field:not(.mat-form-field-no-animations).mdc-text-field--focused .mdc-text-field__input:-ms-input-placeholder{transition-delay:40ms;transition-duration:110ms}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-text-field--filled:not(.mdc-ripple-upgraded):focus .mdc-text-field__ripple::before{transition-duration:75ms}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-line-ripple::after{transition:transform 180ms cubic-bezier(0.4, 0, 0.2, 1),opacity 180ms cubic-bezier(0.4, 0, 0.2, 1)}.mdc-notched-outline .mdc-floating-label{max-width:calc(100% + 1px)}.mdc-notched-outline--upgraded .mdc-floating-label--float-above{max-width:calc(133.3333333333% + 1px)}'],encapsulation:2,data:{animation:[S4A.transitionMessages]},changeDetection:0})}return t})(),y0=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[it,DB,it]})}return t})();var F4A=["trigger"],N4A=["panel"],_4A=[[["mat-select-trigger"]],"*"],G4A=["mat-select-trigger","*"];function U4A(t,e){if(t&1&&(S(0,"span",4),AA(1),F()),t&2){let A=O();G(),Gt(A.placeholder)}}function K4A(t,e){t&1&&Fe(0)}function Y4A(t,e){if(t&1&&(S(0,"span",11),AA(1),F()),t&2){let A=O(2);G(),Gt(A.triggerValue)}}function J4A(t,e){if(t&1&&(S(0,"span",5),_A(1,K4A,1,0)(2,Y4A,2,1,"span",11),F()),t&2){let A=O();G(),GA(A.customTrigger?1:2)}}function T4A(t,e){if(t&1){let A=be();S(0,"div",12,1),hA("@transformPanel.done",function(n){RA(A);let o=O();return xA(o._panelDoneAnimatingStream.next(n.toState))})("keydown",function(n){RA(A);let o=O();return xA(o._handleKeydown(n))}),Fe(2,1),F()}if(t&2){let A=O();nH("mat-mdc-select-panel mdc-menu-surface mdc-menu-surface--open ",A._getPanelTheme(),""),yA("ngClass",A.panelClass)("@transformPanel","showing"),Ne("id",A.id+"-panel")("aria-multiselectable",A.multiple)("aria-label",A.ariaLabel||null)("aria-labelledby",A._getPanelAriaLabelledby())}}var H4A={transformPanelWrap:sc("transformPanelWrap",[Vr("* => void",Hk("@transformPanel",[Tk()],{optional:!0}))]),transformPanel:sc("transformPanel",[js("void",po({opacity:0,transform:"scale(1, 0.8)"})),Vr("void => showing",ss("120ms cubic-bezier(0, 0, 0.2, 1)",po({opacity:1,transform:"scale(1, 1)"}))),Vr("* => void",ss("100ms linear",po({opacity:0})))])};var kP=new dA("mat-select-scroll-strategy",{providedIn:"root",factory:()=>{let t=f(nr);return()=>t.scrollStrategies.reposition()}});function z4A(t){return()=>t.scrollStrategies.reposition()}var O4A=new dA("MAT_SELECT_CONFIG"),P4A={provide:kP,deps:[nr],useFactory:z4A},j4A=new dA("MatSelectTrigger"),zk=class{source;value;constructor(e,A){this.source=e,this.value=A}},NB=(()=>{class t{_viewportRuler=f(Mc);_changeDetectorRef=f(It);_elementRef=f(ee);_dir=f(mo,{optional:!0});_idGenerator=f(sn);_parentFormField=f(Gu,{optional:!0});ngControl=f(Ac,{self:!0,optional:!0});_liveAnnouncer=f(o8);_defaultOptions=f(O4A,{optional:!0});_initialized=new OA;options;optionGroups;customTrigger;_positions=[{originX:"start",originY:"bottom",overlayX:"start",overlayY:"top"},{originX:"end",originY:"bottom",overlayX:"end",overlayY:"top"},{originX:"start",originY:"top",overlayX:"start",overlayY:"bottom",panelClass:"mat-mdc-select-panel-above"},{originX:"end",originY:"top",overlayX:"end",overlayY:"bottom",panelClass:"mat-mdc-select-panel-above"}];_scrollOptionIntoView(A){let i=this.options.toArray()[A];if(i){let n=this.panel.nativeElement,o=AP(A,this.options,this.optionGroups),r=i._getHostElement();A===0&&o===1?n.scrollTop=0:n.scrollTop=eP(r.offsetTop,r.offsetHeight,n.scrollTop,n.offsetHeight)}}_positioningSettled(){this._scrollOptionIntoView(this._keyManager.activeItemIndex||0)}_getChangeEvent(A){return new zk(this,A)}_scrollStrategyFactory=f(kP);_panelOpen=!1;_compareWith=(A,i)=>A===i;_uid=this._idGenerator.getId("mat-select-");_triggerAriaLabelledBy=null;_previousControl;_destroy=new OA;_errorStateTracker;stateChanges=new OA;disableAutomaticLabeling=!0;userAriaDescribedBy;_selectionModel;_keyManager;_preferredOverlayOrigin;_overlayWidth;_onChange=()=>{};_onTouched=()=>{};_valueId=this._idGenerator.getId("mat-select-value-");_panelDoneAnimatingStream=new OA;_scrollStrategy;_overlayPanelClass=this._defaultOptions?.overlayPanelClass||"";get focused(){return this._focused||this._panelOpen}_focused=!1;controlType="mat-select";trigger;panel;_overlayDir;panelClass;disabled=!1;disableRipple=!1;tabIndex=0;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(A){this._hideSingleSelectionIndicator=A,this._syncParentProperties()}_hideSingleSelectionIndicator=this._defaultOptions?.hideSingleSelectionIndicator??!1;get placeholder(){return this._placeholder}set placeholder(A){this._placeholder=A,this.stateChanges.next()}_placeholder;get required(){return this._required??this.ngControl?.control?.hasValidator($a.required)??!1}set required(A){this._required=A,this.stateChanges.next()}_required;get multiple(){return this._multiple}set multiple(A){this._selectionModel,this._multiple=A}_multiple=!1;disableOptionCentering=this._defaultOptions?.disableOptionCentering??!1;get compareWith(){return this._compareWith}set compareWith(A){this._compareWith=A,this._selectionModel&&this._initializeSelection()}get value(){return this._value}set value(A){this._assignValue(A)&&this._onChange(A)}_value;ariaLabel="";ariaLabelledby;get errorStateMatcher(){return this._errorStateTracker.matcher}set errorStateMatcher(A){this._errorStateTracker.matcher=A}typeaheadDebounceInterval;sortComparator;get id(){return this._id}set id(A){this._id=A||this._uid,this.stateChanges.next()}_id;get errorState(){return this._errorStateTracker.errorState}set errorState(A){this._errorStateTracker.errorState=A}panelWidth=this._defaultOptions&&typeof this._defaultOptions.panelWidth<"u"?this._defaultOptions.panelWidth:"auto";canSelectNullableOptions=this._defaultOptions?.canSelectNullableOptions??!1;optionSelectionChanges=jl(()=>{let A=this.options;return A?A.changes.pipe(Pn(A),jn(()=>zn(...A.map(i=>i.onSelectionChange)))):this._initialized.pipe(jn(()=>this.optionSelectionChanges))});openedChange=new WA;_openedStream=this.openedChange.pipe(kt(A=>A),je(()=>{}));_closedStream=this.openedChange.pipe(kt(A=>!A),je(()=>{}));selectionChange=new WA;valueChange=new WA;constructor(){let A=f(bB),i=f(su,{optional:!0}),n=f(GI,{optional:!0}),o=f(new wr("tabindex"),{optional:!0});this.ngControl&&(this.ngControl.valueAccessor=this),this._defaultOptions?.typeaheadDebounceInterval!=null&&(this.typeaheadDebounceInterval=this._defaultOptions.typeaheadDebounceInterval),this._errorStateTracker=new $I(A,this.ngControl,n,i,this.stateChanges),this._scrollStrategy=this._scrollStrategyFactory(),this.tabIndex=o==null?0:parseInt(o)||0,this.id=this.id}ngOnInit(){this._selectionModel=new K2(this.multiple),this.stateChanges.next(),this._panelDoneAnimatingStream.pipe(tl(),St(this._destroy)).subscribe(()=>this._panelDoneAnimating(this.panelOpen)),this._viewportRuler.change().pipe(St(this._destroy)).subscribe(()=>{this.panelOpen&&(this._overlayWidth=this._getOverlayWidth(this._preferredOverlayOrigin),this._changeDetectorRef.detectChanges())})}ngAfterContentInit(){this._initialized.next(),this._initialized.complete(),this._initKeyManager(),this._selectionModel.changed.pipe(St(this._destroy)).subscribe(A=>{A.added.forEach(i=>i.select()),A.removed.forEach(i=>i.deselect())}),this.options.changes.pipe(Pn(null),St(this._destroy)).subscribe(()=>{this._resetOptions(),this._initializeSelection()})}ngDoCheck(){let A=this._getTriggerAriaLabelledby(),i=this.ngControl;if(A!==this._triggerAriaLabelledBy){let n=this._elementRef.nativeElement;this._triggerAriaLabelledBy=A,A?n.setAttribute("aria-labelledby",A):n.removeAttribute("aria-labelledby")}i&&(this._previousControl!==i.control&&(this._previousControl!==void 0&&i.disabled!==null&&i.disabled!==this.disabled&&(this.disabled=i.disabled),this._previousControl=i.control),this.updateErrorState())}ngOnChanges(A){(A.disabled||A.userAriaDescribedBy)&&this.stateChanges.next(),A.typeaheadDebounceInterval&&this._keyManager&&this._keyManager.withTypeAhead(this.typeaheadDebounceInterval)}ngOnDestroy(){this._keyManager?.destroy(),this._destroy.next(),this._destroy.complete(),this.stateChanges.complete(),this._clearFromModal()}toggle(){this.panelOpen?this.close():this.open()}open(){this._canOpen()&&(this._parentFormField&&(this._preferredOverlayOrigin=this._parentFormField.getConnectedOverlayOrigin()),this._overlayWidth=this._getOverlayWidth(this._preferredOverlayOrigin),this._applyModalPanelOwnership(),this._panelOpen=!0,this._keyManager.withHorizontalOrientation(null),this._highlightCorrectOption(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())}_trackedModal=null;_applyModalPanelOwnership(){let A=this._elementRef.nativeElement.closest('body > .cdk-overlay-container [aria-modal="true"]');if(!A)return;let i=`${this.id}-panel`;this._trackedModal&&i8(this._trackedModal,"aria-owns",i),Ek(A,"aria-owns",i),this._trackedModal=A}_clearFromModal(){if(!this._trackedModal)return;let A=`${this.id}-panel`;i8(this._trackedModal,"aria-owns",A),this._trackedModal=null}close(){this._panelOpen&&(this._panelOpen=!1,this._keyManager.withHorizontalOrientation(this._isRtl()?"rtl":"ltr"),this._changeDetectorRef.markForCheck(),this._onTouched(),this.stateChanges.next())}writeValue(A){this._assignValue(A)}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A,this._changeDetectorRef.markForCheck(),this.stateChanges.next()}get panelOpen(){return this._panelOpen}get selected(){return this.multiple?this._selectionModel?.selected||[]:this._selectionModel?.selected[0]}get triggerValue(){if(this.empty)return"";if(this._multiple){let A=this._selectionModel.selected.map(i=>i.viewValue);return this._isRtl()&&A.reverse(),A.join(", ")}return this._selectionModel.selected[0].viewValue}updateErrorState(){this._errorStateTracker.updateErrorState()}_isRtl(){return this._dir?this._dir.value==="rtl":!1}_handleKeydown(A){this.disabled||(this.panelOpen?this._handleOpenKeydown(A):this._handleClosedKeydown(A))}_handleClosedKeydown(A){let i=A.keyCode,n=i===40||i===38||i===37||i===39,o=i===13||i===32,r=this._keyManager;if(!r.isTyping()&&o&&!ir(A)||(this.multiple||A.altKey)&&n)A.preventDefault(),this.open();else if(!this.multiple){let s=this.selected;r.onKeydown(A);let a=this.selected;a&&s!==a&&this._liveAnnouncer.announce(a.viewValue,1e4)}}_handleOpenKeydown(A){let i=this._keyManager,n=A.keyCode,o=n===40||n===38,r=i.isTyping();if(o&&A.altKey)A.preventDefault(),this.close();else if(!r&&(n===13||n===32)&&i.activeItem&&!ir(A))A.preventDefault(),i.activeItem._selectViaInteraction();else if(!r&&this._multiple&&n===65&&A.ctrlKey){A.preventDefault();let s=this.options.some(a=>!a.disabled&&!a.selected);this.options.forEach(a=>{a.disabled||(s?a.select():a.deselect())})}else{let s=i.activeItemIndex;i.onKeydown(A),this._multiple&&o&&A.shiftKey&&i.activeItem&&i.activeItemIndex!==s&&i.activeItem._selectViaInteraction()}}_onFocus(){this.disabled||(this._focused=!0,this.stateChanges.next())}_onBlur(){this._focused=!1,this._keyManager?.cancelTypeahead(),!this.disabled&&!this.panelOpen&&(this._onTouched(),this._changeDetectorRef.markForCheck(),this.stateChanges.next())}_onAttached(){this._overlayDir.positionChange.pipe(On(1)).subscribe(()=>{this._changeDetectorRef.detectChanges(),this._positioningSettled()})}_getPanelTheme(){return this._parentFormField?`mat-${this._parentFormField.color}`:""}get empty(){return!this._selectionModel||this._selectionModel.isEmpty()}_initializeSelection(){Promise.resolve().then(()=>{this.ngControl&&(this._value=this.ngControl.value),this._setSelectionByValue(this._value),this.stateChanges.next()})}_setSelectionByValue(A){if(this.options.forEach(i=>i.setInactiveStyles()),this._selectionModel.clear(),this.multiple&&A)Array.isArray(A),A.forEach(i=>this._selectOptionByValue(i)),this._sortValues();else{let i=this._selectOptionByValue(A);i?this._keyManager.updateActiveItem(i):this.panelOpen||this._keyManager.updateActiveItem(-1)}this._changeDetectorRef.markForCheck()}_selectOptionByValue(A){let i=this.options.find(n=>{if(this._selectionModel.isSelected(n))return!1;try{return(n.value!=null||this.canSelectNullableOptions)&&this._compareWith(n.value,A)}catch{return!1}});return i&&this._selectionModel.select(i),i}_assignValue(A){return A!==this._value||this._multiple&&Array.isArray(A)?(this.options&&this._setSelectionByValue(A),this._value=A,!0):!1}_skipPredicate=A=>this.panelOpen?!1:A.disabled;_getOverlayWidth(A){return this.panelWidth==="auto"?(A instanceof Nu?A.elementRef:A||this._elementRef).nativeElement.getBoundingClientRect().width:this.panelWidth===null?"":this.panelWidth}_syncParentProperties(){if(this.options)for(let A of this.options)A._changeDetectorRef.markForCheck()}_initKeyManager(){this._keyManager=new t8(this.options).withTypeAhead(this.typeaheadDebounceInterval).withVerticalOrientation().withHorizontalOrientation(this._isRtl()?"rtl":"ltr").withHomeAndEnd().withPageUpDown().withAllowedModifierKeys(["shiftKey"]).skipPredicate(this._skipPredicate),this._keyManager.tabOut.subscribe(()=>{this.panelOpen&&(!this.multiple&&this._keyManager.activeItem&&this._keyManager.activeItem._selectViaInteraction(),this.focus(),this.close())}),this._keyManager.change.subscribe(()=>{this._panelOpen&&this.panel?this._scrollOptionIntoView(this._keyManager.activeItemIndex||0):!this._panelOpen&&!this.multiple&&this._keyManager.activeItem&&this._keyManager.activeItem._selectViaInteraction()})}_resetOptions(){let A=zn(this.options.changes,this._destroy);this.optionSelectionChanges.pipe(St(A)).subscribe(i=>{this._onSelect(i.source,i.isUserInput),i.isUserInput&&!this.multiple&&this._panelOpen&&(this.close(),this.focus())}),zn(...this.options.map(i=>i._stateChanges)).pipe(St(A)).subscribe(()=>{this._changeDetectorRef.detectChanges(),this.stateChanges.next()})}_onSelect(A,i){let n=this._selectionModel.isSelected(A);!this.canSelectNullableOptions&&A.value==null&&!this._multiple?(A.deselect(),this._selectionModel.clear(),this.value!=null&&this._propagateChanges(A.value)):(n!==A.selected&&(A.selected?this._selectionModel.select(A):this._selectionModel.deselect(A)),i&&this._keyManager.setActiveItem(A),this.multiple&&(this._sortValues(),i&&this.focus())),n!==this._selectionModel.isSelected(A)&&this._propagateChanges(),this.stateChanges.next()}_sortValues(){if(this.multiple){let A=this.options.toArray();this._selectionModel.sort((i,n)=>this.sortComparator?this.sortComparator(i,n,A):A.indexOf(i)-A.indexOf(n)),this.stateChanges.next()}}_propagateChanges(A){let i;this.multiple?i=this.selected.map(n=>n.value):i=this.selected?this.selected.value:A,this._value=i,this.valueChange.emit(i),this._onChange(i),this.selectionChange.emit(this._getChangeEvent(i)),this._changeDetectorRef.markForCheck()}_highlightCorrectOption(){if(this._keyManager)if(this.empty){let A=-1;for(let i=0;i0}focus(A){this._elementRef.nativeElement.focus(A)}_getPanelAriaLabelledby(){if(this.ariaLabel)return null;let A=this._parentFormField?.getLabelId()||null,i=A?A+" ":"";return this.ariaLabelledby?i+this.ariaLabelledby:A}_getAriaActiveDescendant(){return this.panelOpen&&this._keyManager&&this._keyManager.activeItem?this._keyManager.activeItem.id:null}_getTriggerAriaLabelledby(){if(this.ariaLabel)return null;let A=this._parentFormField?.getLabelId(),i=(A?A+" ":"")+this._valueId;return this.ariaLabelledby&&(i+=" "+this.ariaLabelledby),i}_panelDoneAnimating(A){this.openedChange.emit(A)}setDescribedByIds(A){A.length?this._elementRef.nativeElement.setAttribute("aria-describedby",A.join(" ")):this._elementRef.nativeElement.removeAttribute("aria-describedby")}onContainerClick(){this.focus(),this.open()}get shouldLabelFloat(){return this.panelOpen||!this.empty||this.focused&&!!this.placeholder}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-select"]],contentQueries:function(i,n,o){if(i&1&&(ci(o,j4A,5),ci(o,U2,5),ci(o,vk,5)),i&2){let r;XA(r=$A())&&(n.customTrigger=r.first),XA(r=$A())&&(n.options=r),XA(r=$A())&&(n.optionGroups=r)}},viewQuery:function(i,n){if(i&1&&(Te(F4A,5),Te(N4A,5),Te(Yk,5)),i&2){let o;XA(o=$A())&&(n.trigger=o.first),XA(o=$A())&&(n.panel=o.first),XA(o=$A())&&(n._overlayDir=o.first)}},hostAttrs:["role","combobox","aria-haspopup","listbox",1,"mat-mdc-select"],hostVars:19,hostBindings:function(i,n){i&1&&hA("keydown",function(r){return n._handleKeydown(r)})("focus",function(){return n._onFocus()})("blur",function(){return n._onBlur()}),i&2&&(Ne("id",n.id)("tabindex",n.disabled?-1:n.tabIndex)("aria-controls",n.panelOpen?n.id+"-panel":null)("aria-expanded",n.panelOpen)("aria-label",n.ariaLabel||null)("aria-required",n.required.toString())("aria-disabled",n.disabled.toString())("aria-invalid",n.errorState)("aria-activedescendant",n._getAriaActiveDescendant()),ue("mat-mdc-select-disabled",n.disabled)("mat-mdc-select-invalid",n.errorState)("mat-mdc-select-required",n.required)("mat-mdc-select-empty",n.empty)("mat-mdc-select-multiple",n.multiple))},inputs:{userAriaDescribedBy:[0,"aria-describedby","userAriaDescribedBy"],panelClass:"panelClass",disabled:[2,"disabled","disabled",ie],disableRipple:[2,"disableRipple","disableRipple",ie],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:zi(A)],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",ie],placeholder:"placeholder",required:[2,"required","required",ie],multiple:[2,"multiple","multiple",ie],disableOptionCentering:[2,"disableOptionCentering","disableOptionCentering",ie],compareWith:"compareWith",value:"value",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],errorStateMatcher:"errorStateMatcher",typeaheadDebounceInterval:[2,"typeaheadDebounceInterval","typeaheadDebounceInterval",zi],sortComparator:"sortComparator",id:"id",panelWidth:"panelWidth",canSelectNullableOptions:[2,"canSelectNullableOptions","canSelectNullableOptions",ie]},outputs:{openedChange:"openedChange",_openedStream:"opened",_closedStream:"closed",selectionChange:"selectionChange",valueChange:"valueChange"},exportAs:["matSelect"],features:[ht([{provide:_u,useExisting:t},{provide:yk,useExisting:t}]),ti],ngContentSelectors:G4A,decls:11,vars:8,consts:[["fallbackOverlayOrigin","cdkOverlayOrigin","trigger",""],["panel",""],["cdk-overlay-origin","",1,"mat-mdc-select-trigger",3,"click"],[1,"mat-mdc-select-value"],[1,"mat-mdc-select-placeholder","mat-mdc-select-min-line"],[1,"mat-mdc-select-value-text"],[1,"mat-mdc-select-arrow-wrapper"],[1,"mat-mdc-select-arrow"],["viewBox","0 0 24 24","width","24px","height","24px","focusable","false","aria-hidden","true"],["d","M7 10l5 5 5-5z"],["cdk-connected-overlay","","cdkConnectedOverlayLockPosition","","cdkConnectedOverlayHasBackdrop","","cdkConnectedOverlayBackdropClass","cdk-overlay-transparent-backdrop",3,"backdropClick","attach","detach","cdkConnectedOverlayPanelClass","cdkConnectedOverlayScrollStrategy","cdkConnectedOverlayOrigin","cdkConnectedOverlayOpen","cdkConnectedOverlayPositions","cdkConnectedOverlayWidth"],[1,"mat-mdc-select-min-line"],["role","listbox","tabindex","-1",3,"keydown","ngClass"]],template:function(i,n){if(i&1){let o=be();jt(_4A),S(0,"div",2,0),hA("click",function(){return RA(o),xA(n.open())}),S(3,"div",3),_A(4,U4A,2,1,"span",4)(5,J4A,3,1,"span",5),F(),S(6,"div",6)(7,"div",7),ar(),S(8,"svg",8),JA(9,"path",9),F()()()(),_A(10,T4A,3,9,"ng-template",10),hA("backdropClick",function(){return RA(o),xA(n.close())})("attach",function(){return RA(o),xA(n._onAttached())})("detach",function(){return RA(o),xA(n.close())})}if(i&2){let o=cr(1);G(3),Ne("id",n._valueId),G(),GA(n.empty?4:5),G(6),yA("cdkConnectedOverlayPanelClass",n._overlayPanelClass)("cdkConnectedOverlayScrollStrategy",n._scrollStrategy)("cdkConnectedOverlayOrigin",n._preferredOverlayOrigin||o)("cdkConnectedOverlayOpen",n.panelOpen)("cdkConnectedOverlayPositions",n._positions)("cdkConnectedOverlayWidth",n._overlayWidth)}},dependencies:[Nu,Yk,Xa],styles:['.mat-mdc-select{display:inline-block;width:100%;outline:none;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-select-enabled-trigger-text-color, var(--mat-sys-on-surface));font-family:var(--mat-select-trigger-text-font, var(--mat-sys-body-large-font));line-height:var(--mat-select-trigger-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mat-select-trigger-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-select-trigger-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mat-select-trigger-text-tracking, var(--mat-sys-body-large-tracking))}div.mat-mdc-select-panel{box-shadow:var(--mat-select-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12))}.mat-mdc-select-disabled{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-disabled .mat-mdc-select-placeholder{color:var(--mat-select-disabled-trigger-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-trigger{display:inline-flex;align-items:center;cursor:pointer;position:relative;box-sizing:border-box;width:100%}.mat-mdc-select-disabled .mat-mdc-select-trigger{-webkit-user-select:none;user-select:none;cursor:default}.mat-mdc-select-value{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mat-mdc-select-value-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mat-mdc-select-arrow-wrapper{height:24px;flex-shrink:0;display:inline-flex;align-items:center}.mat-form-field-appearance-fill .mdc-text-field--no-label .mat-mdc-select-arrow-wrapper{transform:none}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-invalid .mat-mdc-select-arrow,.mat-form-field-invalid:not(.mat-form-field-disabled) .mat-mdc-form-field-infix::after{color:var(--mat-select-invalid-arrow-color, var(--mat-sys-error))}.mat-mdc-select-arrow{width:10px;height:5px;position:relative;color:var(--mat-select-enabled-arrow-color, var(--mat-sys-on-surface-variant))}.mat-mdc-form-field.mat-focused .mat-mdc-select-arrow{color:var(--mat-select-focused-arrow-color, var(--mat-sys-primary))}.mat-mdc-form-field .mat-mdc-select.mat-mdc-select-disabled .mat-mdc-select-arrow{color:var(--mat-select-disabled-arrow-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-select-arrow svg{fill:currentColor;position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}@media(forced-colors: active){.mat-mdc-select-arrow svg{fill:CanvasText}.mat-mdc-select-disabled .mat-mdc-select-arrow svg{fill:GrayText}}div.mat-mdc-select-panel{width:100%;max-height:275px;outline:0;overflow:auto;padding:8px 0;border-radius:4px;box-sizing:border-box;position:static;background-color:var(--mat-select-panel-background-color, var(--mat-sys-surface-container))}@media(forced-colors: active){div.mat-mdc-select-panel{outline:solid 1px}}.cdk-overlay-pane:not(.mat-mdc-select-panel-above) div.mat-mdc-select-panel{border-top-left-radius:0;border-top-right-radius:0;transform-origin:top center}.mat-mdc-select-panel-above div.mat-mdc-select-panel{border-bottom-left-radius:0;border-bottom-right-radius:0;transform-origin:bottom center}div.mat-mdc-select-panel .mat-mdc-option{--mdc-list-list-item-container-color: var(--mat-select-panel-background-color)}.mat-mdc-select-placeholder{transition:color 400ms 133.3333333333ms cubic-bezier(0.25, 0.8, 0.25, 1);color:var(--mat-select-placeholder-text-color, var(--mat-sys-on-surface-variant))}.mat-form-field-no-animations .mat-mdc-select-placeholder,._mat-animation-noopable .mat-mdc-select-placeholder{transition:none}.mat-form-field-hide-placeholder .mat-mdc-select-placeholder{color:rgba(0,0,0,0);-webkit-text-fill-color:rgba(0,0,0,0);transition:none;display:block}.mat-mdc-form-field-type-mat-select:not(.mat-form-field-disabled) .mat-mdc-text-field-wrapper{cursor:pointer}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mat-mdc-floating-label{max-width:calc(100% - 18px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-fill .mdc-floating-label--float-above{max-width:calc(100%/0.75 - 24px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-notched-outline__notch{max-width:calc(100% - 60px)}.mat-mdc-form-field-type-mat-select.mat-form-field-appearance-outline .mdc-text-field--label-floating .mdc-notched-outline__notch{max-width:calc(100% - 24px)}.mat-mdc-select-min-line:empty::before{content:" ";white-space:pre;width:1px;display:inline-block;visibility:hidden}.mat-form-field-appearance-fill .mat-mdc-select-arrow-wrapper{transform:var(--mat-select-arrow-transform, translateY(-8px))}'],encapsulation:2,data:{animation:[H4A.transformPanel]},changeDetection:0})}return t})();var u8=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({providers:[P4A],imports:[El,bk,it,Cl,y0,bk,it]})}return t})();var q4A=["tooltip"],LP=20;var FP=new dA("mat-tooltip-scroll-strategy",{providedIn:"root",factory:()=>{let t=f(nr);return()=>t.scrollStrategies.reposition({scrollThrottle:LP})}});function V4A(t){return()=>t.scrollStrategies.reposition({scrollThrottle:LP})}var Z4A={provide:FP,deps:[nr],useFactory:V4A};function W4A(){return{showDelay:0,hideDelay:0,touchendHideDelay:1500}}var X4A=new dA("mat-tooltip-default-options",{providedIn:"root",factory:W4A});var RP="tooltip-panel",xP=bc({passive:!0}),$4A=8,A3A=8,e3A=24,t3A=200,_B=(()=>{class t{_elementRef=f(ee);_ngZone=f(Qe);_platform=f(Ii);_ariaDescriber=f(HO);_focusMonitor=f(dr);_dir=f(mo);_injector=f(Rt);_defaultOptions=f(X4A,{optional:!0});_overlayRef;_tooltipInstance;_portal;_position="below";_positionAtOrigin=!1;_disabled=!1;_tooltipClass;_viewInitialized=!1;_pointerExitEventsInitialized=!1;_tooltipComponent=i3A;_viewportMargin=8;_currentPosition;_cssClassPrefix="mat-mdc";_ariaDescriptionPending;_dirSubscribed=!1;get position(){return this._position}set position(A){A!==this._position&&(this._position=A,this._overlayRef&&(this._updatePosition(this._overlayRef),this._tooltipInstance?.show(0),this._overlayRef.updatePosition()))}get positionAtOrigin(){return this._positionAtOrigin}set positionAtOrigin(A){this._positionAtOrigin=Xo(A),this._detach(),this._overlayRef=null}get disabled(){return this._disabled}set disabled(A){let i=Xo(A);this._disabled!==i&&(this._disabled=i,i?this.hide(0):this._setupPointerEnterEventsIfNeeded(),this._syncAriaDescription(this.message))}get showDelay(){return this._showDelay}set showDelay(A){this._showDelay=zs(A)}_showDelay;get hideDelay(){return this._hideDelay}set hideDelay(A){this._hideDelay=zs(A),this._tooltipInstance&&(this._tooltipInstance._mouseLeaveHideDelay=this._hideDelay)}_hideDelay;touchGestures="auto";get message(){return this._message}set message(A){let i=this._message;this._message=A!=null?String(A).trim():"",!this._message&&this._isTooltipVisible()?this.hide(0):(this._setupPointerEnterEventsIfNeeded(),this._updateTooltipMessage()),this._syncAriaDescription(i)}_message="";get tooltipClass(){return this._tooltipClass}set tooltipClass(A){this._tooltipClass=A,this._tooltipInstance&&this._setTooltipClass(this._tooltipClass)}_passiveListeners=[];_touchstartTimeout=null;_destroyed=new OA;_isDestroyed=!1;constructor(){let A=this._defaultOptions;A&&(this._showDelay=A.showDelay,this._hideDelay=A.hideDelay,A.position&&(this.position=A.position),A.positionAtOrigin&&(this.positionAtOrigin=A.positionAtOrigin),A.touchGestures&&(this.touchGestures=A.touchGestures),A.tooltipClass&&(this.tooltipClass=A.tooltipClass)),this._viewportMargin=$4A}ngAfterViewInit(){this._viewInitialized=!0,this._setupPointerEnterEventsIfNeeded(),this._focusMonitor.monitor(this._elementRef).pipe(St(this._destroyed)).subscribe(A=>{A?A==="keyboard"&&this._ngZone.run(()=>this.show()):this._ngZone.run(()=>this.hide(0))})}ngOnDestroy(){let A=this._elementRef.nativeElement;this._touchstartTimeout&&clearTimeout(this._touchstartTimeout),this._overlayRef&&(this._overlayRef.dispose(),this._tooltipInstance=null),this._passiveListeners.forEach(([i,n])=>{A.removeEventListener(i,n,xP)}),this._passiveListeners.length=0,this._destroyed.next(),this._destroyed.complete(),this._isDestroyed=!0,this._ariaDescriber.removeDescription(A,this.message,"tooltip"),this._focusMonitor.stopMonitoring(A)}show(A=this.showDelay,i){if(this.disabled||!this.message||this._isTooltipVisible()){this._tooltipInstance?._cancelPendingAnimations();return}let n=this._createOverlay(i);this._detach(),this._portal=this._portal||new dl(this._tooltipComponent,this._injector.get(Nn));let o=this._tooltipInstance=n.attach(this._portal).instance;o._triggerElement=this._elementRef.nativeElement,o._mouseLeaveHideDelay=this._hideDelay,o.afterHidden().pipe(St(this._destroyed)).subscribe(()=>this._detach()),this._setTooltipClass(this._tooltipClass),this._updateTooltipMessage(),o.show(A)}hide(A=this.hideDelay){let i=this._tooltipInstance;i&&(i.isVisible()?i.hide(A):(i._cancelPendingAnimations(),this._detach()))}toggle(A){this._isTooltipVisible()?this.hide():this.show(void 0,A)}_isTooltipVisible(){return!!this._tooltipInstance&&this._tooltipInstance.isVisible()}_createOverlay(A){if(this._overlayRef){let r=this._overlayRef.getConfig().positionStrategy;if((!this.positionAtOrigin||!A)&&r._origin instanceof ee)return this._overlayRef;this._detach()}let i=this._injector.get(Y2).getAncestorScrollContainers(this._elementRef),n=this._injector.get(nr),o=n.position().flexibleConnectedTo(this.positionAtOrigin?A||this._elementRef:this._elementRef).withTransformOriginOn(`.${this._cssClassPrefix}-tooltip`).withFlexibleDimensions(!1).withViewportMargin(this._viewportMargin).withScrollableContainers(i);return o.positionChanges.pipe(St(this._destroyed)).subscribe(r=>{this._updateCurrentPositionClass(r.connectionPair),this._tooltipInstance&&r.scrollableViewProperties.isOverlayClipped&&this._tooltipInstance.isVisible()&&this._ngZone.run(()=>this.hide(0))}),this._overlayRef=n.create({direction:this._dir,positionStrategy:o,panelClass:`${this._cssClassPrefix}-${RP}`,scrollStrategy:this._injector.get(FP)()}),this._updatePosition(this._overlayRef),this._overlayRef.detachments().pipe(St(this._destroyed)).subscribe(()=>this._detach()),this._overlayRef.outsidePointerEvents().pipe(St(this._destroyed)).subscribe(()=>this._tooltipInstance?._handleBodyInteraction()),this._overlayRef.keydownEvents().pipe(St(this._destroyed)).subscribe(r=>{this._isTooltipVisible()&&r.keyCode===27&&!ir(r)&&(r.preventDefault(),r.stopPropagation(),this._ngZone.run(()=>this.hide(0)))}),this._defaultOptions?.disableTooltipInteractivity&&this._overlayRef.addPanelClass(`${this._cssClassPrefix}-tooltip-panel-non-interactive`),this._dirSubscribed||(this._dirSubscribed=!0,this._dir.change.pipe(St(this._destroyed)).subscribe(()=>{this._overlayRef&&this._updatePosition(this._overlayRef)})),this._overlayRef}_detach(){this._overlayRef&&this._overlayRef.hasAttached()&&this._overlayRef.detach(),this._tooltipInstance=null}_updatePosition(A){let i=A.getConfig().positionStrategy,n=this._getOrigin(),o=this._getOverlayPosition();i.withPositions([this._addOffset(rA(rA({},n.main),o.main)),this._addOffset(rA(rA({},n.fallback),o.fallback))])}_addOffset(A){let i=A3A,n=!this._dir||this._dir.value=="ltr";return A.originY==="top"?A.offsetY=-i:A.originY==="bottom"?A.offsetY=i:A.originX==="start"?A.offsetX=n?-i:i:A.originX==="end"&&(A.offsetX=n?i:-i),A}_getOrigin(){let A=!this._dir||this._dir.value=="ltr",i=this.position,n;i=="above"||i=="below"?n={originX:"center",originY:i=="above"?"top":"bottom"}:i=="before"||i=="left"&&A||i=="right"&&!A?n={originX:"start",originY:"center"}:(i=="after"||i=="right"&&A||i=="left"&&!A)&&(n={originX:"end",originY:"center"});let{x:o,y:r}=this._invertPosition(n.originX,n.originY);return{main:n,fallback:{originX:o,originY:r}}}_getOverlayPosition(){let A=!this._dir||this._dir.value=="ltr",i=this.position,n;i=="above"?n={overlayX:"center",overlayY:"bottom"}:i=="below"?n={overlayX:"center",overlayY:"top"}:i=="before"||i=="left"&&A||i=="right"&&!A?n={overlayX:"end",overlayY:"center"}:(i=="after"||i=="right"&&A||i=="left"&&!A)&&(n={overlayX:"start",overlayY:"center"});let{x:o,y:r}=this._invertPosition(n.overlayX,n.overlayY);return{main:n,fallback:{overlayX:o,overlayY:r}}}_updateTooltipMessage(){this._tooltipInstance&&(this._tooltipInstance.message=this.message,this._tooltipInstance._markForCheck(),To(()=>{this._tooltipInstance&&this._overlayRef.updatePosition()},{injector:this._injector}))}_setTooltipClass(A){this._tooltipInstance&&(this._tooltipInstance.tooltipClass=A,this._tooltipInstance._markForCheck())}_invertPosition(A,i){return this.position==="above"||this.position==="below"?i==="top"?i="bottom":i==="bottom"&&(i="top"):A==="end"?A="start":A==="start"&&(A="end"),{x:A,y:i}}_updateCurrentPositionClass(A){let{overlayY:i,originX:n,originY:o}=A,r;if(i==="center"?this._dir&&this._dir.value==="rtl"?r=n==="end"?"left":"right":r=n==="start"?"left":"right":r=i==="bottom"&&o==="top"?"above":"below",r!==this._currentPosition){let s=this._overlayRef;if(s){let a=`${this._cssClassPrefix}-${RP}-`;s.removePanelClass(a+this._currentPosition),s.addPanelClass(a+r)}this._currentPosition=r}}_setupPointerEnterEventsIfNeeded(){this._disabled||!this.message||!this._viewInitialized||this._passiveListeners.length||(this._platformSupportsMouseEvents()?this._passiveListeners.push(["mouseenter",A=>{this._setupPointerExitEventsIfNeeded();let i;A.x!==void 0&&A.y!==void 0&&(i=A),this.show(void 0,i)}]):this.touchGestures!=="off"&&(this._disableNativeGesturesIfNecessary(),this._passiveListeners.push(["touchstart",A=>{let i=A.targetTouches?.[0],n=i?{x:i.clientX,y:i.clientY}:void 0;this._setupPointerExitEventsIfNeeded(),this._touchstartTimeout&&clearTimeout(this._touchstartTimeout);let o=500;this._touchstartTimeout=setTimeout(()=>{this._touchstartTimeout=null,this.show(void 0,n)},this._defaultOptions?.touchLongPressShowDelay??o)}])),this._addListeners(this._passiveListeners))}_setupPointerExitEventsIfNeeded(){if(this._pointerExitEventsInitialized)return;this._pointerExitEventsInitialized=!0;let A=[];if(this._platformSupportsMouseEvents())A.push(["mouseleave",i=>{let n=i.relatedTarget;(!n||!this._overlayRef?.overlayElement.contains(n))&&this.hide()}],["wheel",i=>this._wheelListener(i)]);else if(this.touchGestures!=="off"){this._disableNativeGesturesIfNecessary();let i=()=>{this._touchstartTimeout&&clearTimeout(this._touchstartTimeout),this.hide(this._defaultOptions?.touchendHideDelay)};A.push(["touchend",i],["touchcancel",i])}this._addListeners(A),this._passiveListeners.push(...A)}_addListeners(A){A.forEach(([i,n])=>{this._elementRef.nativeElement.addEventListener(i,n,xP)})}_platformSupportsMouseEvents(){return!this._platform.IOS&&!this._platform.ANDROID}_wheelListener(A){if(this._isTooltipVisible()){let i=this._injector.get(at).elementFromPoint(A.clientX,A.clientY),n=this._elementRef.nativeElement;i!==n&&!n.contains(i)&&this.hide()}}_disableNativeGesturesIfNecessary(){let A=this.touchGestures;if(A!=="off"){let i=this._elementRef.nativeElement,n=i.style;(A==="on"||i.nodeName!=="INPUT"&&i.nodeName!=="TEXTAREA")&&(n.userSelect=n.msUserSelect=n.webkitUserSelect=n.MozUserSelect="none"),(A==="on"||!i.draggable)&&(n.webkitUserDrag="none"),n.touchAction="none",n.webkitTapHighlightColor="transparent"}}_syncAriaDescription(A){this._ariaDescriptionPending||(this._ariaDescriptionPending=!0,this._ariaDescriber.removeDescription(this._elementRef.nativeElement,A,"tooltip"),this._isDestroyed||To({write:()=>{this._ariaDescriptionPending=!1,this.message&&!this.disabled&&this._ariaDescriber.describe(this._elementRef.nativeElement,this.message,"tooltip")}},{injector:this._injector}))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","matTooltip",""]],hostAttrs:[1,"mat-mdc-tooltip-trigger"],hostVars:2,hostBindings:function(i,n){i&2&&ue("mat-mdc-tooltip-disabled",n.disabled)},inputs:{position:[0,"matTooltipPosition","position"],positionAtOrigin:[0,"matTooltipPositionAtOrigin","positionAtOrigin"],disabled:[0,"matTooltipDisabled","disabled"],showDelay:[0,"matTooltipShowDelay","showDelay"],hideDelay:[0,"matTooltipHideDelay","hideDelay"],touchGestures:[0,"matTooltipTouchGestures","touchGestures"],message:[0,"matTooltip","message"],tooltipClass:[0,"matTooltipClass","tooltipClass"]},exportAs:["matTooltip"]})}return t})(),i3A=(()=>{class t{_changeDetectorRef=f(It);_elementRef=f(ee);_isMultiline=!1;message;tooltipClass;_showTimeoutId;_hideTimeoutId;_triggerElement;_mouseLeaveHideDelay;_animationsDisabled;_tooltip;_closeOnInteraction=!1;_isVisible=!1;_onHide=new OA;_showAnimation="mat-mdc-tooltip-show";_hideAnimation="mat-mdc-tooltip-hide";constructor(){let A=f(Si,{optional:!0});this._animationsDisabled=A==="NoopAnimations"}show(A){this._hideTimeoutId!=null&&clearTimeout(this._hideTimeoutId),this._showTimeoutId=setTimeout(()=>{this._toggleVisibility(!0),this._showTimeoutId=void 0},A)}hide(A){this._showTimeoutId!=null&&clearTimeout(this._showTimeoutId),this._hideTimeoutId=setTimeout(()=>{this._toggleVisibility(!1),this._hideTimeoutId=void 0},A)}afterHidden(){return this._onHide}isVisible(){return this._isVisible}ngOnDestroy(){this._cancelPendingAnimations(),this._onHide.complete(),this._triggerElement=null}_handleBodyInteraction(){this._closeOnInteraction&&this.hide(0)}_markForCheck(){this._changeDetectorRef.markForCheck()}_handleMouseLeave({relatedTarget:A}){(!A||!this._triggerElement.contains(A))&&(this.isVisible()?this.hide(this._mouseLeaveHideDelay):this._finalizeAnimation(!1))}_onShow(){this._isMultiline=this._isTooltipMultiline(),this._markForCheck()}_isTooltipMultiline(){let A=this._elementRef.nativeElement.getBoundingClientRect();return A.height>e3A&&A.width>=t3A}_handleAnimationEnd({animationName:A}){(A===this._showAnimation||A===this._hideAnimation)&&this._finalizeAnimation(A===this._showAnimation)}_cancelPendingAnimations(){this._showTimeoutId!=null&&clearTimeout(this._showTimeoutId),this._hideTimeoutId!=null&&clearTimeout(this._hideTimeoutId),this._showTimeoutId=this._hideTimeoutId=void 0}_finalizeAnimation(A){A?this._closeOnInteraction=!0:this.isVisible()||this._onHide.next()}_toggleVisibility(A){let i=this._tooltip.nativeElement,n=this._showAnimation,o=this._hideAnimation;if(i.classList.remove(A?o:n),i.classList.add(A?n:o),this._isVisible!==A&&(this._isVisible=A,this._changeDetectorRef.markForCheck()),A&&!this._animationsDisabled&&typeof getComputedStyle=="function"){let r=getComputedStyle(i);(r.getPropertyValue("animation-duration")==="0s"||r.getPropertyValue("animation-name")==="none")&&(this._animationsDisabled=!0)}A&&this._onShow(),this._animationsDisabled&&(i.classList.add("_mat-animation-noopable"),this._finalizeAnimation(A))}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-tooltip-component"]],viewQuery:function(i,n){if(i&1&&Te(q4A,7),i&2){let o;XA(o=$A())&&(n._tooltip=o.first)}},hostAttrs:["aria-hidden","true"],hostBindings:function(i,n){i&1&&hA("mouseleave",function(r){return n._handleMouseLeave(r)})},decls:4,vars:4,consts:[["tooltip",""],[1,"mdc-tooltip","mat-mdc-tooltip",3,"animationend","ngClass"],[1,"mat-mdc-tooltip-surface","mdc-tooltip__surface"]],template:function(i,n){if(i&1){let o=be();S(0,"div",1,0),hA("animationend",function(s){return RA(o),xA(n._handleAnimationEnd(s))}),S(2,"div",2),AA(3),F()()}i&2&&(ue("mdc-tooltip--multiline",n._isMultiline),yA("ngClass",n.tooltipClass),G(3),Gt(n.message))},dependencies:[Xa],styles:['.mat-mdc-tooltip{position:relative;transform:scale(0);display:inline-flex}.mat-mdc-tooltip::before{content:"";top:0;right:0;bottom:0;left:0;z-index:-1;position:absolute}.mat-mdc-tooltip-panel-below .mat-mdc-tooltip::before{top:-8px}.mat-mdc-tooltip-panel-above .mat-mdc-tooltip::before{bottom:-8px}.mat-mdc-tooltip-panel-right .mat-mdc-tooltip::before{left:-8px}.mat-mdc-tooltip-panel-left .mat-mdc-tooltip::before{right:-8px}.mat-mdc-tooltip._mat-animation-noopable{animation:none;transform:scale(1)}.mat-mdc-tooltip-surface{word-break:normal;overflow-wrap:anywhere;padding:4px 8px;min-width:40px;max-width:200px;min-height:24px;max-height:40vh;box-sizing:border-box;overflow:hidden;text-align:center;will-change:transform,opacity;background-color:var(--mdc-plain-tooltip-container-color, var(--mat-sys-inverse-surface));color:var(--mdc-plain-tooltip-supporting-text-color, var(--mat-sys-inverse-on-surface));border-radius:var(--mdc-plain-tooltip-container-shape, var(--mat-sys-corner-extra-small));font-family:var(--mdc-plain-tooltip-supporting-text-font, var(--mat-sys-body-small-font));font-size:var(--mdc-plain-tooltip-supporting-text-size, var(--mat-sys-body-small-size));font-weight:var(--mdc-plain-tooltip-supporting-text-weight, var(--mat-sys-body-small-weight));line-height:var(--mdc-plain-tooltip-supporting-text-line-height, var(--mat-sys-body-small-line-height));letter-spacing:var(--mdc-plain-tooltip-supporting-text-tracking, var(--mat-sys-body-small-tracking))}.mat-mdc-tooltip-surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mdc-tooltip--multiline .mat-mdc-tooltip-surface{text-align:left}[dir=rtl] .mdc-tooltip--multiline .mat-mdc-tooltip-surface{text-align:right}.mat-mdc-tooltip-panel{line-height:normal}.mat-mdc-tooltip-panel.mat-mdc-tooltip-panel-non-interactive{pointer-events:none}@keyframes mat-mdc-tooltip-show{0%{opacity:0;transform:scale(0.8)}100%{opacity:1;transform:scale(1)}}@keyframes mat-mdc-tooltip-hide{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(0.8)}}.mat-mdc-tooltip-show{animation:mat-mdc-tooltip-show 150ms cubic-bezier(0, 0, 0.2, 1) forwards}.mat-mdc-tooltip-hide{animation:mat-mdc-tooltip-hide 75ms cubic-bezier(0.4, 0, 1, 1) forwards}'],encapsulation:2,changeDetection:0})}return t})();var f8=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({providers:[Z4A],imports:[r8,El,it,it,Cl]})}return t})();function n3A(t,e){if(t&1&&(S(0,"mat-option",17),AA(1),F()),t&2){let A=e.$implicit;yA("value",A),G(),Et(" ",A," ")}}function o3A(t,e){if(t&1){let A=be();S(0,"mat-form-field",14)(1,"mat-select",16,0),hA("selectionChange",function(n){RA(A);let o=O(2);return xA(o._changePageSize(n.value))}),Dn(3,n3A,2,2,"mat-option",17,to),F(),S(5,"div",18),hA("click",function(){RA(A);let n=cr(2);return xA(n.open())}),F()()}if(t&2){let A=O(2);yA("appearance",A._formFieldAppearance)("color",A.color),G(),yA("value",A.pageSize)("disabled",A.disabled)("aria-labelledby",A._pageSizeLabelId)("panelClass",A.selectConfig.panelClass||"")("disableOptionCentering",A.selectConfig.disableOptionCentering),G(2),yn(A._displayedPageSizeOptions)}}function r3A(t,e){if(t&1&&(S(0,"div",15),AA(1),F()),t&2){let A=O(2);G(),Gt(A.pageSize)}}function s3A(t,e){if(t&1&&(S(0,"div",3)(1,"div",13),AA(2),F(),_A(3,o3A,6,7,"mat-form-field",14)(4,r3A,2,1,"div",15),F()),t&2){let A=O();G(),Ne("id",A._pageSizeLabelId),G(),Et(" ",A._intl.itemsPerPageLabel," "),G(),GA(A._displayedPageSizeOptions.length>1?3:-1),G(),GA(A._displayedPageSizeOptions.length<=1?4:-1)}}function a3A(t,e){if(t&1){let A=be();S(0,"button",19),hA("click",function(){RA(A);let n=O();return xA(n._buttonClicked(0,n._previousButtonsDisabled()))}),ar(),S(1,"svg",8),JA(2,"path",20),F()()}if(t&2){let A=O();yA("matTooltip",A._intl.firstPageLabel)("matTooltipDisabled",A._previousButtonsDisabled())("disabled",A._previousButtonsDisabled()),Ne("aria-label",A._intl.firstPageLabel)}}function c3A(t,e){if(t&1){let A=be();S(0,"button",21),hA("click",function(){RA(A);let n=O();return xA(n._buttonClicked(n.getNumberOfPages()-1,n._nextButtonsDisabled()))}),ar(),S(1,"svg",8),JA(2,"path",22),F()()}if(t&2){let A=O();yA("matTooltip",A._intl.lastPageLabel)("matTooltipDisabled",A._nextButtonsDisabled())("disabled",A._nextButtonsDisabled()),Ne("aria-label",A._intl.lastPageLabel)}}var iC=(()=>{class t{changes=new OA;itemsPerPageLabel="Items per page:";nextPageLabel="Next page";previousPageLabel="Previous page";firstPageLabel="First page";lastPageLabel="Last page";getRangeLabel=(A,i,n)=>{if(n==0||i==0)return`0 of ${n}`;n=Math.max(n,0);let o=A*i,r=o{class t{_intl=f(iC);_changeDetectorRef=f(It);_formFieldAppearance;_pageSizeLabelId=f(sn).getId("mat-paginator-page-size-label-");_intlChanges;_isInitialized=!1;_initializedStream=new Al(1);color;get pageIndex(){return this._pageIndex}set pageIndex(A){this._pageIndex=Math.max(A||0,0),this._changeDetectorRef.markForCheck()}_pageIndex=0;get length(){return this._length}set length(A){this._length=A||0,this._changeDetectorRef.markForCheck()}_length=0;get pageSize(){return this._pageSize}set pageSize(A){this._pageSize=Math.max(A||0,0),this._updateDisplayedPageSizeOptions()}_pageSize;get pageSizeOptions(){return this._pageSizeOptions}set pageSizeOptions(A){this._pageSizeOptions=(A||[]).map(i=>zi(i,0)),this._updateDisplayedPageSizeOptions()}_pageSizeOptions=[];hidePageSize=!1;showFirstLastButtons=!1;selectConfig={};disabled=!1;page=new WA;_displayedPageSizeOptions;initialized=this._initializedStream;constructor(){let A=this._intl,i=f(C3A,{optional:!0});if(this._intlChanges=A.changes.subscribe(()=>this._changeDetectorRef.markForCheck()),i){let{pageSize:n,pageSizeOptions:o,hidePageSize:r,showFirstLastButtons:s}=i;n!=null&&(this._pageSize=n),o!=null&&(this._pageSizeOptions=o),r!=null&&(this.hidePageSize=r),s!=null&&(this.showFirstLastButtons=s)}this._formFieldAppearance=i?.formFieldAppearance||"outline"}ngOnInit(){this._isInitialized=!0,this._updateDisplayedPageSizeOptions(),this._initializedStream.next()}ngOnDestroy(){this._initializedStream.complete(),this._intlChanges.unsubscribe()}nextPage(){this.hasNextPage()&&this._navigate(this.pageIndex+1)}previousPage(){this.hasPreviousPage()&&this._navigate(this.pageIndex-1)}firstPage(){this.hasPreviousPage()&&this._navigate(0)}lastPage(){this.hasNextPage()&&this._navigate(this.getNumberOfPages()-1)}hasPreviousPage(){return this.pageIndex>=1&&this.pageSize!=0}hasNextPage(){let A=this.getNumberOfPages()-1;return this.pageIndexA-i),this._changeDetectorRef.markForCheck())}_emitPageEvent(A){this.page.emit({previousPageIndex:A,pageIndex:this.pageIndex,pageSize:this.pageSize,length:this.length})}_navigate(A){let i=this.pageIndex;A!==i&&(this.pageIndex=A,this._emitPageEvent(i))}_buttonClicked(A,i){i||this._navigate(A)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-paginator"]],hostAttrs:["role","group",1,"mat-mdc-paginator"],inputs:{color:"color",pageIndex:[2,"pageIndex","pageIndex",zi],length:[2,"length","length",zi],pageSize:[2,"pageSize","pageSize",zi],pageSizeOptions:"pageSizeOptions",hidePageSize:[2,"hidePageSize","hidePageSize",ie],showFirstLastButtons:[2,"showFirstLastButtons","showFirstLastButtons",ie],selectConfig:"selectConfig",disabled:[2,"disabled","disabled",ie]},outputs:{page:"page"},exportAs:["matPaginator"],decls:14,vars:12,consts:[["selectRef",""],[1,"mat-mdc-paginator-outer-container"],[1,"mat-mdc-paginator-container"],[1,"mat-mdc-paginator-page-size"],[1,"mat-mdc-paginator-range-actions"],["aria-live","polite",1,"mat-mdc-paginator-range-label"],["mat-icon-button","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-first",3,"matTooltip","matTooltipDisabled","disabled"],["mat-icon-button","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-previous",3,"click","matTooltip","matTooltipDisabled","disabled"],["viewBox","0 0 24 24","focusable","false","aria-hidden","true",1,"mat-mdc-paginator-icon"],["d","M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"],["mat-icon-button","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-next",3,"click","matTooltip","matTooltipDisabled","disabled"],["d","M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"],["mat-icon-button","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-last",3,"matTooltip","matTooltipDisabled","disabled"],[1,"mat-mdc-paginator-page-size-label"],[1,"mat-mdc-paginator-page-size-select",3,"appearance","color"],[1,"mat-mdc-paginator-page-size-value"],["hideSingleSelectionIndicator","",3,"selectionChange","value","disabled","aria-labelledby","panelClass","disableOptionCentering"],[3,"value"],[1,"mat-mdc-paginator-touch-target",3,"click"],["mat-icon-button","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-first",3,"click","matTooltip","matTooltipDisabled","disabled"],["d","M18.41 16.59L13.82 12l4.59-4.59L17 6l-6 6 6 6zM6 6h2v12H6z"],["mat-icon-button","","type","button","matTooltipPosition","above","disabledInteractive","",1,"mat-mdc-paginator-navigation-last",3,"click","matTooltip","matTooltipDisabled","disabled"],["d","M5.59 7.41L10.18 12l-4.59 4.59L7 18l6-6-6-6zM16 6h2v12h-2z"]],template:function(i,n){i&1&&(S(0,"div",1)(1,"div",2),_A(2,s3A,5,4,"div",3),S(3,"div",4)(4,"div",5),AA(5),F(),_A(6,a3A,3,4,"button",6),S(7,"button",7),hA("click",function(){return n._buttonClicked(n.pageIndex-1,n._previousButtonsDisabled())}),ar(),S(8,"svg",8),JA(9,"path",9),F()(),SI(),S(10,"button",10),hA("click",function(){return n._buttonClicked(n.pageIndex+1,n._nextButtonsDisabled())}),ar(),S(11,"svg",8),JA(12,"path",11),F()(),_A(13,c3A,3,4,"button",12),F()()()),i&2&&(G(2),GA(n.hidePageSize?-1:2),G(3),Et(" ",n._intl.getRangeLabel(n.pageIndex,n.pageSize,n.length)," "),G(),GA(n.showFirstLastButtons?6:-1),G(),yA("matTooltip",n._intl.previousPageLabel)("matTooltipDisabled",n._previousButtonsDisabled())("disabled",n._previousButtonsDisabled()),Ne("aria-label",n._intl.previousPageLabel),G(3),yA("matTooltip",n._intl.nextPageLabel)("matTooltipDisabled",n._nextButtonsDisabled())("disabled",n._nextButtonsDisabled()),Ne("aria-label",n._intl.nextPageLabel),G(3),GA(n.showFirstLastButtons?13:-1))},dependencies:[Qg,NB,U2,kB,_B],styles:[".mat-mdc-paginator{display:block;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:var(--mat-paginator-container-text-color, var(--mat-sys-on-surface));background-color:var(--mat-paginator-container-background-color, var(--mat-sys-surface));font-family:var(--mat-paginator-container-text-font, var(--mat-sys-body-small-font));line-height:var(--mat-paginator-container-text-line-height, var(--mat-sys-body-small-line-height));font-size:var(--mat-paginator-container-text-size, var(--mat-sys-body-small-size));font-weight:var(--mat-paginator-container-text-weight, var(--mat-sys-body-small-weight));letter-spacing:var(--mat-paginator-container-text-tracking, var(--mat-sys-body-small-tracking));--mat-form-field-container-height:var(--mat-paginator-form-field-container-height, 40px);--mat-form-field-container-vertical-padding:var(--mat-paginator-form-field-container-vertical-padding, 8px)}.mat-mdc-paginator .mat-mdc-select-value{font-size:var(--mat-paginator-select-trigger-text-size, var(--mat-sys-body-small-size))}.mat-mdc-paginator .mat-mdc-form-field-subscript-wrapper{display:none}.mat-mdc-paginator .mat-mdc-select{line-height:1.5}.mat-mdc-paginator-outer-container{display:flex}.mat-mdc-paginator-container{display:flex;align-items:center;justify-content:flex-end;padding:0 8px;flex-wrap:wrap;width:100%;min-height:var(--mat-paginator-container-size, 56px)}.mat-mdc-paginator-page-size{display:flex;align-items:baseline;margin-right:8px}[dir=rtl] .mat-mdc-paginator-page-size{margin-right:0;margin-left:8px}.mat-mdc-paginator-page-size-label{margin:0 4px}.mat-mdc-paginator-page-size-select{margin:0 4px;width:84px}.mat-mdc-paginator-range-label{margin:0 32px 0 24px}.mat-mdc-paginator-range-actions{display:flex;align-items:center}.mat-mdc-paginator-icon{display:inline-block;width:28px;fill:var(--mat-paginator-enabled-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-icon-button[aria-disabled] .mat-mdc-paginator-icon{fill:var(--mat-paginator-disabled-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}[dir=rtl] .mat-mdc-paginator-icon{transform:rotate(180deg)}@media(forced-colors: active){.mat-mdc-icon-button[disabled] .mat-mdc-paginator-icon,.mat-mdc-paginator-icon{fill:currentColor;fill:CanvasText}.mat-mdc-paginator-range-actions .mat-mdc-icon-button{outline:solid 1px}}.mat-mdc-paginator-touch-target{display:var(--mat-paginator-touch-target-display, block);position:absolute;top:50%;left:50%;width:84px;height:48px;background-color:rgba(0,0,0,0);transform:translate(-50%, -50%);cursor:pointer}"],encapsulation:2,changeDetection:0})}return t})(),_P=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({providers:[g3A],imports:[AC,u8,f8,Ok]})}return t})();function B3A(t,e){if(t&1){let A=be();S(0,"div",1)(1,"button",2),hA("click",function(){RA(A);let n=O();return xA(n.action())}),AA(2),F()()}if(t&2){let A=O();G(2),Et(" ",A.data.action," ")}}var E3A=["label"];function Q3A(t,e){}var h3A=Math.pow(2,31)-1,Uu=class{_overlayRef;instance;containerInstance;_afterDismissed=new OA;_afterOpened=new OA;_onAction=new OA;_durationTimeoutId;_dismissedByAction=!1;constructor(e,A){this._overlayRef=A,this.containerInstance=e,e._onExit.subscribe(()=>this._finishDismiss())}dismiss(){this._afterDismissed.closed||this.containerInstance.exit(),clearTimeout(this._durationTimeoutId)}dismissWithAction(){this._onAction.closed||(this._dismissedByAction=!0,this._onAction.next(),this._onAction.complete(),this.dismiss()),clearTimeout(this._durationTimeoutId)}closeWithAction(){this.dismissWithAction()}_dismissAfter(e){this._durationTimeoutId=setTimeout(()=>this.dismiss(),Math.min(e,h3A))}_open(){this._afterOpened.closed||(this._afterOpened.next(),this._afterOpened.complete())}_finishDismiss(){this._overlayRef.dispose(),this._onAction.closed||this._onAction.complete(),this._afterDismissed.next({dismissedByAction:this._dismissedByAction}),this._afterDismissed.complete(),this._dismissedByAction=!1}afterDismissed(){return this._afterDismissed}afterOpened(){return this.containerInstance._onEnter}onAction(){return this._onAction}},GP=new dA("MatSnackBarData"),GB=class{politeness="assertive";announcementMessage="";viewContainerRef;duration=0;panelClass;direction;data=null;horizontalPosition="center";verticalPosition="bottom"},u3A=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","matSnackBarLabel",""]],hostAttrs:[1,"mat-mdc-snack-bar-label","mdc-snackbar__label"]})}return t})(),f3A=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","matSnackBarActions",""]],hostAttrs:[1,"mat-mdc-snack-bar-actions","mdc-snackbar__actions"]})}return t})(),m3A=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","matSnackBarAction",""]],hostAttrs:[1,"mat-mdc-snack-bar-action","mdc-snackbar__action"]})}return t})(),p3A=(()=>{class t{snackBarRef=f(Uu);data=f(GP);constructor(){}action(){this.snackBarRef.dismissWithAction()}get hasAction(){return!!this.data.action}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["simple-snack-bar"]],hostAttrs:[1,"mat-mdc-simple-snack-bar"],exportAs:["matSnackBar"],decls:3,vars:2,consts:[["matSnackBarLabel",""],["matSnackBarActions",""],["mat-button","","matSnackBarAction","",3,"click"]],template:function(i,n){i&1&&(S(0,"div",0),AA(1),F(),_A(2,B3A,3,1,"div",1)),i&2&&(G(),Et(" ",n.data.message,` -`),G(),GA(n.hasAction?2:-1))},dependencies:[Dr,u3A,f3A,m3A],styles:[".mat-mdc-simple-snack-bar{display:flex}"],encapsulation:2,changeDetection:0})}return t})(),w3A={snackBarState:sc("state",[js("void, hidden",po({transform:"scale(0.8)",opacity:0})),js("visible",po({transform:"scale(1)",opacity:1})),Vr("* => visible",ss("150ms cubic-bezier(0, 0, 0.2, 1)")),Vr("* => void, * => hidden",ss("75ms cubic-bezier(0.4, 0.0, 1, 1)",po({opacity:0})))])},D3A=(()=>{class t extends J2{_ngZone=f(Qe);_elementRef=f(ee);_changeDetectorRef=f(It);_platform=f(Ii);snackBarConfig=f(GB);_document=f(at);_trackedModals=new Set;_announceDelay=150;_announceTimeoutId;_destroyed=!1;_portalOutlet;_onAnnounce=new OA;_onExit=new OA;_onEnter=new OA;_animationState="void";_live;_label;_role;_liveElementId=f(sn).getId("mat-snack-bar-container-live-");constructor(){super();let A=this.snackBarConfig;A.politeness==="assertive"&&!A.announcementMessage?this._live="assertive":A.politeness==="off"?this._live="off":this._live="polite",this._platform.FIREFOX&&(this._live==="polite"&&(this._role="status"),this._live==="assertive"&&(this._role="alert"))}attachComponentPortal(A){this._assertNotAttached();let i=this._portalOutlet.attachComponentPortal(A);return this._afterPortalAttached(),i}attachTemplatePortal(A){this._assertNotAttached();let i=this._portalOutlet.attachTemplatePortal(A);return this._afterPortalAttached(),i}attachDomPortal=A=>{this._assertNotAttached();let i=this._portalOutlet.attachDomPortal(A);return this._afterPortalAttached(),i};onAnimationEnd(A){let{fromState:i,toState:n}=A;if((n==="void"&&i!=="void"||n==="hidden")&&this._completeExit(),n==="visible"){let o=this._onEnter;this._ngZone.run(()=>{o.next(),o.complete()})}}enter(){this._destroyed||(this._animationState="visible",this._changeDetectorRef.markForCheck(),this._changeDetectorRef.detectChanges(),this._screenReaderAnnounce())}exit(){return this._ngZone.run(()=>{this._animationState="hidden",this._changeDetectorRef.markForCheck(),this._elementRef.nativeElement.setAttribute("mat-exit",""),clearTimeout(this._announceTimeoutId)}),this._onExit}ngOnDestroy(){this._destroyed=!0,this._clearFromModals(),this._completeExit()}_completeExit(){queueMicrotask(()=>{this._onExit.next(),this._onExit.complete()})}_afterPortalAttached(){let A=this._elementRef.nativeElement,i=this.snackBarConfig.panelClass;i&&(Array.isArray(i)?i.forEach(r=>A.classList.add(r)):A.classList.add(i)),this._exposeToModals();let n=this._label.nativeElement,o="mdc-snackbar__label";n.classList.toggle(o,!n.querySelector(`.${o}`))}_exposeToModals(){let A=this._liveElementId,i=this._document.querySelectorAll('body > .cdk-overlay-container [aria-modal="true"]');for(let n=0;n{let i=A.getAttribute("aria-owns");if(i){let n=i.replace(this._liveElementId,"").trim();n.length>0?A.setAttribute("aria-owns",n):A.removeAttribute("aria-owns")}}),this._trackedModals.clear()}_assertNotAttached(){this._portalOutlet.hasAttached()}_screenReaderAnnounce(){this._announceTimeoutId||this._ngZone.runOutsideAngular(()=>{this._announceTimeoutId=setTimeout(()=>{let A=this._elementRef.nativeElement.querySelector("[aria-hidden]"),i=this._elementRef.nativeElement.querySelector("[aria-live]");if(A&&i){let n=null;this._platform.isBrowser&&document.activeElement instanceof HTMLElement&&A.contains(document.activeElement)&&(n=document.activeElement),A.removeAttribute("aria-hidden"),i.appendChild(A),n?.focus(),this._onAnnounce.next(),this._onAnnounce.complete()}},this._announceDelay)})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-snack-bar-container"]],viewQuery:function(i,n){if(i&1&&(Te(fa,7),Te(E3A,7)),i&2){let o;XA(o=$A())&&(n._portalOutlet=o.first),XA(o=$A())&&(n._label=o.first)}},hostAttrs:[1,"mdc-snackbar","mat-mdc-snack-bar-container"],hostVars:1,hostBindings:function(i,n){i&1&&Hb("@state.done",function(r){return n.onAnimationEnd(r)}),i&2&&Tb("@state",n._animationState)},features:[lt],decls:6,vars:3,consts:[["label",""],[1,"mdc-snackbar__surface","mat-mdc-snackbar-surface"],[1,"mat-mdc-snack-bar-label"],["aria-hidden","true"],["cdkPortalOutlet",""]],template:function(i,n){i&1&&(S(0,"div",1)(1,"div",2,0)(3,"div",3),_A(4,Q3A,0,0,"ng-template",4),F(),JA(5,"div"),F()()),i&2&&(G(5),Ne("aria-live",n._live)("role",n._role)("id",n._liveElementId))},dependencies:[fa],styles:[".mat-mdc-snack-bar-container{display:flex;align-items:center;justify-content:center;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0);margin:8px}.mat-mdc-snack-bar-handset .mat-mdc-snack-bar-container{width:100vw}.mat-mdc-snackbar-surface{box-shadow:0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);display:flex;align-items:center;justify-content:flex-start;box-sizing:border-box;padding-left:0;padding-right:8px}[dir=rtl] .mat-mdc-snackbar-surface{padding-right:0;padding-left:8px}.mat-mdc-snack-bar-container .mat-mdc-snackbar-surface{min-width:344px;max-width:672px}.mat-mdc-snack-bar-handset .mat-mdc-snackbar-surface{width:100%;min-width:0}@media(forced-colors: active){.mat-mdc-snackbar-surface{outline:solid 1px}}.mat-mdc-snack-bar-container .mat-mdc-snackbar-surface{color:var(--mdc-snackbar-supporting-text-color, var(--mat-sys-inverse-on-surface));border-radius:var(--mdc-snackbar-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mdc-snackbar-container-color, var(--mat-sys-inverse-surface))}.mdc-snackbar__label{width:100%;flex-grow:1;box-sizing:border-box;margin:0;padding:14px 8px 14px 16px}[dir=rtl] .mdc-snackbar__label{padding-left:8px;padding-right:16px}.mat-mdc-snack-bar-container .mdc-snackbar__label{font-family:var(--mdc-snackbar-supporting-text-font, var(--mat-sys-body-medium-font));font-size:var(--mdc-snackbar-supporting-text-size, var(--mat-sys-body-medium-size));font-weight:var(--mdc-snackbar-supporting-text-weight, var(--mat-sys-body-medium-weight));line-height:var(--mdc-snackbar-supporting-text-line-height, var(--mat-sys-body-medium-line-height))}.mat-mdc-snack-bar-actions{display:flex;flex-shrink:0;align-items:center;box-sizing:border-box}.mat-mdc-snack-bar-handset,.mat-mdc-snack-bar-container,.mat-mdc-snack-bar-label{flex:1 1 auto}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled).mat-unthemed{color:var(--mat-snack-bar-button-color, var(--mat-sys-inverse-primary))}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled){--mat-text-button-state-layer-color:currentColor;--mat-text-button-ripple-color:currentColor}.mat-mdc-snack-bar-container .mat-mdc-button.mat-mdc-snack-bar-action:not(:disabled) .mat-ripple-element{opacity:.1}"],encapsulation:2,data:{animation:[w3A.snackBarState]}})}return t})();function y3A(){return new GB}var v3A=new dA("mat-snack-bar-default-options",{providedIn:"root",factory:y3A}),UP=(()=>{class t{_overlay=f(nr);_live=f(o8);_injector=f(Rt);_breakpointObserver=f(Z6);_parentSnackBar=f(t,{optional:!0,skipSelf:!0});_defaultConfig=f(v3A);_snackBarRefAtThisLevel=null;simpleSnackBarComponent=p3A;snackBarContainerComponent=D3A;handsetCssClass="mat-mdc-snack-bar-handset";get _openedSnackBarRef(){let A=this._parentSnackBar;return A?A._openedSnackBarRef:this._snackBarRefAtThisLevel}set _openedSnackBarRef(A){this._parentSnackBar?this._parentSnackBar._openedSnackBarRef=A:this._snackBarRefAtThisLevel=A}constructor(){}openFromComponent(A,i){return this._attach(A,i)}openFromTemplate(A,i){return this._attach(A,i)}open(A,i="",n){let o=rA(rA({},this._defaultConfig),n);return o.data={message:A,action:i},o.announcementMessage===A&&(o.announcementMessage=void 0),this.openFromComponent(this.simpleSnackBarComponent,o)}dismiss(){this._openedSnackBarRef&&this._openedSnackBarRef.dismiss()}ngOnDestroy(){this._snackBarRefAtThisLevel&&this._snackBarRefAtThisLevel.dismiss()}_attachSnackBarContainer(A,i){let n=i&&i.viewContainerRef&&i.viewContainerRef.injector,o=Rt.create({parent:n||this._injector,providers:[{provide:GB,useValue:i}]}),r=new dl(this.snackBarContainerComponent,i.viewContainerRef,o),s=A.attach(r);return s.instance.snackBarConfig=i,s.instance}_attach(A,i){let n=rA(rA(rA({},new GB),this._defaultConfig),i),o=this._createOverlay(n),r=this._attachSnackBarContainer(o,n),s=new Uu(r,o);if(A instanceof wn){let a=new ys(A,null,{$implicit:n.data,snackBarRef:s});s.instance=r.attachTemplatePortal(a)}else{let a=this._createInjector(n,s),c=new dl(A,void 0,a),l=r.attachComponentPortal(c);s.instance=l.instance}return this._breakpointObserver.observe(_O.HandsetPortrait).pipe(St(o.detachments())).subscribe(a=>{o.overlayElement.classList.toggle(this.handsetCssClass,a.matches)}),n.announcementMessage&&r._onAnnounce.subscribe(()=>{this._live.announce(n.announcementMessage,n.politeness)}),this._animateSnackBar(s,n),this._openedSnackBarRef=s,this._openedSnackBarRef}_animateSnackBar(A,i){A.afterDismissed().subscribe(()=>{this._openedSnackBarRef==A&&(this._openedSnackBarRef=null),i.announcementMessage&&this._live.clear()}),this._openedSnackBarRef?(this._openedSnackBarRef.afterDismissed().subscribe(()=>{A.containerInstance.enter()}),this._openedSnackBarRef.dismiss()):A.containerInstance.enter(),i.duration&&i.duration>0&&A.afterOpened().subscribe(()=>A._dismissAfter(i.duration))}_createOverlay(A){let i=new Bg;i.direction=A.direction;let n=this._overlay.position().global(),o=A.direction==="rtl",r=A.horizontalPosition==="left"||A.horizontalPosition==="start"&&!o||A.horizontalPosition==="end"&&o,s=!r&&A.horizontalPosition!=="center";return r?n.left("0"):s?n.right("0"):n.centerHorizontally(),A.verticalPosition==="top"?n.top("0"):n.bottom("0"),i.positionStrategy=n,this._overlay.create(i)}_createInjector(A,i){let n=A&&A.viewContainerRef&&A.viewContainerRef.injector;return Rt.create({parent:n||this._injector,providers:[{provide:Uu,useValue:i},{provide:GP,useValue:A.data}]})}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var b3A=(()=>{var t=import.meta.url;return function(e={}){var A,i=e,n,o,r=new Promise((Q,m)=>{n=Q,o=m});i.agerrMessages=[],i.stderrMessages=[],B=Q=>i.stderrMessages.push(Q);var s=Object.assign({},i),a="./this.program",c=(Q,m)=>{throw m},l="",I,C;typeof document<"u"&&document.currentScript&&(l=document.currentScript.src),t&&(l=t),l.startsWith("blob:")?l="":l=l.substr(0,l.replace(/[?#].*/,"").lastIndexOf("/")+1),I=Q=>fetch(Q,{credentials:"same-origin"}).then(m=>m.ok?m.arrayBuffer():Promise.reject(new Error(m.status+" : "+m.url)));var d=console.log.bind(console),B=console.error.bind(console);Object.assign(i,s),s=null;var E;function h(Q){for(var m=atob(Q),v=new Uint8Array(m.length),p=0;pQ.startsWith(Ze);function uA(){var Q="data:application/octet-stream;base64,AGFzbQEAAAABmQd0YAJ/fwF/YAF/AGABfwF/YAJ/fwBgA39/fwF/YAN/f38AYAR/f39/AX9gBX9/f39/AX9gBH9/f38AYAZ/f39/f38Bf2AFf39/f38AYAZ/f39/f38AYAAAYAABf2AIf39/f39/f38Bf2AHf39/f39/fwF/YAF8AXxgAn9/AXxgAX8BfGAHf39/f39/fwBgA39/fwF8YAd/f39/fHx/AGACf3wAYAR8fHx/AXxgAnx8AXxgA398fABgCX9/f39/f39/fwBgBX9+fn5+AGAEf39/fABgCn9/f39/f39/f38Bf2ADf35/AX5gBH9/fHwBf2ADfHx8AXxgA39/fgBgAAF8YAR/f39/AXxgA39/fABgAn9/AX5gBX9/f39+AX9gA39/fgF/YAR/fn5/AGAEf398fwBgAn9+AGACfH8BfGABfwF+YAR/f398AX9gAn9+AX9gAn98AX9gA3x8fwF8YAN/fH8AYAh/f39/f39/fwBgA39/fwF+YAV/f39/fAF/YAt/f39/f39/f39/fwF/YAV/f35/fwBgBH9/fH8Bf2AFf39/f3wAYAN/f3wBf2ACfX0BfWAGf3x8fHx8AXxgDH9/f39/f39/f39/fwF/YAV/f3x/fwF/YAd/f398fH9/AGAGf39/fH9/AGAGf39/f35/AX9gD39/f39/f39/f39/f39/fwBgCn9/f39/f39/f38AYAR/f39/AX5gBn98f39/fwF/YAd/f39/f35+AX9gBn9/f39+fgF/YAd/f39/fn9/AX9gBn9/f39/fgF/YAJ+fwBgBH9+f38Bf2AEf398fAF8YAV/f3x/fwBgCX9/f39/f39/fwF/YAZ/f398f38Bf2AEf398fABgBH5+fn4Bf2ACf30Bf2ACfn8Bf2AIf39/f3x8fH8AYAN/fX8AYAF8AX9gAn5+AX1gAn99AGAEf39/fgF+YAN/fn8Bf2AAAX5gBn99f39/fwBgBH9/fX8AYAN/fHwBf2AFf39/fH8AYAZ/f398fH8AYAZ8fHx/f38AYAJ+fgF8YAJ8fwF/YAR/fHx8AGAGf39/f398AGAEf3x/fwBgBnx8f3x8fwBgB398fHx8fHwAYAF/AX1gA39/fwF9YAN+fn4Bf2AEf35+fgBgBH98f38Bf2AKf3x/f39/f39/fwBgBX9/fHx8AGAFf39/f38BfGADfHx8AX9gBX9/fX9/AGAHf39/f3x/fwF/YAR8fHx8AXwCkQEYAWEBYQAIAWEBYgAFAWEBYwAGAWEBZAAGAWEBZQACAWEBZgAEAWEBZwAiAWEBaAABAWEBaQAMAWEBagAEAWEBawACAWEBbAAGAWEBbQBHAWEBbgBIAWEBbwACAWEBcABJAWEBcQAIAWEBcgBKAWEBcwAAAWEBdAAAAWEBdQAGAWEBdgAAAWEBdwAAAWEBeAAGA9AUzhQBAAACAAUEBAIGGAICBQAMAgAYAwAAAAIABRAEAgYDAgIABQIAAxoAAwACAAgQAwICAABLAAEEGAMCBAYCAgIQAwMAAAADBwIGAgYAAgEDAw0MAQIbBAEAAgAFAgQCBQICAgIEFgEEAAUFAwACAgQGCAQCAwUEBCIEBgMMCAQDAAICBgIDAgoAGwYDNwJMAgIFAg0YARgAFAIAAggDKBsKAwMBBAIBAwIDBQICCgIHAAMCDAICAAAEAwADAwUiBCMAAQMEAwcCAxEDBAQDAAMDBAUCAikFAgMDAwICAwMDAwUEBAIEAgIPAwgCFggFAwMFAQAqAgMCBQEDFgEGBQcJAQEEBAAAAwcHBgQEAgACBRYEEhABIwAKAhIHAgIDCwUGABkBAU0CAA4OCAAAAgAEFAMIAAAAAAUEAwAGAU4CAQMEAQMCBE8CAAEAOBUCAAICAwMDAgACCAIDBRsAKwQAAggDGREIAwUKCgE5AQAFLAIDAAMtHBwABQAFBwoCAQUCAQUCAAMDCQkAAAICKFACBAABEQAtAAALAQADAAAEAgJRAwIuBQACAwICAwMHDQMADQURAgMCAwIFAAAdAh0CAgMCAAQGAwJSAgECAgIBAQQHBlMiDQAIVAM5AQUOBgIIAy8AAwQREQEKAQIDBQEAAAMEAQECAwsBAgABCQQNAwIDBAoHAQcFAAUIAwAECAUEAAACBFUwGBAJAAUBBQYAAgAIBwMpAgEBAQwBCAIIAAUCBiwAAQQDAgAAAgMFBAMBAQAxBQUBAwUCABoFAwMAAhkBAwcACAIDAAYGAQEGBQYGCQENAAgAAwEBBgECAAAAAAoKCAEKCQoDAgICAAIGAAEDAgICAwQIAA8AAg8FAwACAQUABQMCAQAAA1YDVwMGWAAAAQMTAwJZBjoCWhAIDQUUAQAUAwgKAAMDHwIAHAEBEQMfBVsDXAgIEggDEQgBAAgFHAICOzsIBgIDAwUECAIIARMDAwMFBQAAAAECAwMDAgQDAgICAgAFBwcCBQIEATIBMQEBBQMBBBwABwQEDQEBAwUBAQEFBAACAAIABQgGAAEEAwgAA10BAQIGAwQOAAUGBgYGAQYCAwIHAgIAIQ8EBgEAAgECBgYCAgAFAQAFXgAIBwMEAwAJCQQFXwAIDgYGDgUJCwUFCAAFAwADMwICAgAEAmAAAgAKAwIBAgEEPAoABDwKAgIAAgIGLwIAKgMCYQUABwAECAABAgAKBAACEAgCYgEQEAgFYwEABQUDAQQAPQYABQUSEgANAgEBCgEBBA4AAAAABgUBAwIPAgUCAwACAwUDAgEHCQMFAwUFBAMFAwMMAQYHLwoCAgMBBggTIwIAAgIBAQAAAgAGAgMFFAMBAAMCAQQTPgEAAAIBAQMNAAABAAUDAwMBATMBBgACBQIDAwEBAwQDAwgDBQQDAwADAAEBCQIHAAICAwAADAoFAAEDDAMuAQMDAwgFBQgIAgFkHBQICAUEBAQEBwQEAAQEHgMDAA0TBQEDAQMFBgMKZQQAAgMDAgIEBQQDDwADGGYkBWcZAwQLAwIFBQYCAAEBAwUHBQUFEgIDAAMDAQECAgIDAQIABAMCAwMBBg8DAwksAgMBCAMOAAIDaAIJCQ8JBQYGHQAAAgYAAQEFBwQAAQYGBgcEBgYGBwAEBgYGBwYdBDUdCAACAQMEAAUAAAADAQIFBwMhBQUFBScBKwMCAg0DBAACAgAAAQMAAgMACAUFAgACAQQSPwAXPj8DBRIMFAULBAQECUAJQAYGBwUFDwIGCA8OCwYLCQIFBwUCAQECCAIyBQUyATMBAgECAwIDAgMBBQIAAgUEBQIAAQACAgcODgAHDg4CBw4CAAEBAQMCAQEEAwIEBEFCBEFCAgIKAAM1DQMCAhYFAzUDAwADCwoLCwoLCwECBBMTBAEEExMDCQQIFGlDBgkGQwYABQIGAQIHAAICAgICAAAAAgMCBQgFCAEAAgUDBQMCAgMCAAIBAAICAgIAAAEbagAABCEEBQgCDysQMCUICBsoawADAQIFAgMEAgwEJA0BAwEDAzoBAgICARAQAQEDAwMBAxENAQEBBgQEAQUkKQAFAAABAwABAAoDAwcCAQADAwUABRMAAxYFBAACAQwEbD03BQttGi0BAwEBAwASAQsBbgAxBQMCCAkBBAgFbwMAAwQBAwMZAQQIBQgwBANwAwcFAAABAAQHAQABDAUDAgIGAgEMAAEADAwECAAEBQUFBAEABAgjAAgIcQYKCAYFcgUFCAoRCAgKCgcKFgEBAQoMBggECwoCBAEBAwEDBggBAxEDAwMBAgESAQUCLgIDCAIDBQESAwMDAQACAQEGBAIABQgAAgkDBwMBARQDAQQAKgMDAQEBAAAFAwIAAyUAAgYZBAsEBgICAQEFCAIBAAMAAwIZAwIBAQEAAQEBAQgBAQMCAgIKAAIAAAAEBxMBAQMBCwgLBgADAQAABQgCAQEDAAsHBAEDAQEDAQMBBQMBAAUCAwUIAQMDACUABAUAAAAABAEBAQwEAQEBBCUBBgIDAAMDAQMDAwgBCAIDAQEBAwABAQIABgUFBAECAwYAAQMDBgMACg0KOApzBAcRBAAAAAQGBgMIBwAAAQABAgEkBQUDAwYBAAMWAgEUAAQIAQEKAwoLCAMDAwgBCAMIAAUECAMDAwUICAUFAQoBAQEBCAEBAQoDBQgIBQUKAQEBCAEAAQEKAQEFAAgIBQMFAQEBAQUICAUFAQEBAQEIICAgIAEFAwUAAwUFAQICAgIAAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAwUGBgYGBgcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBggEAAYAAAYGBgYGBgYHBwcGCAQABgAABgYGBgYGBgAAAAAAAAAHBwcHBgQABQYAAAYGBgYGBicGBAYGIQQGBwYIBwcAAAAAAAMDAAMAAwcAAAgBAwMDAAMACAEBAQEBAQEBAAAABBcVFRcVFxUVFxUXFRcVBAAAAQANAgEBAgICCwsLCgoKCAgIBAEBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAwMDAwMDAgIBAQIHAgcODgEHBwQGBAAEAAEHBAYEAAQABgYGBAELCwlFCUUPDw8PDw8OCQkJCQkOCQkJCQkHRjQmByYHBwdGNCYHJgcHCQkCCQkJCQkJCQkJCQkJCQkJCQQIBwQIBwEFAQIIATYAAAICAgECBAICBAg2BAEABAQDRB4EHgQCBAwDBAENAQUFBQUABAAAAAAAAgQCDQEBAQEBAQEBAAEBAAAAAQEBAQAFAQQBAQAAAQUABAAAAB8fAAQBAQABAQEBAQEAAAADBQAAAAAAAAABAAMAAAAEAAQCAgAABAAABQUFAAAAAAEAAQAAAAEICAgBCAgICAMFCAgFBQUBAQEBAQEBAQEIAQEBAwUICAUFAQEBAQUICAUFAQEBAQEBBAcBcAHGBsYGBQcBAYQCgIACBggBfwFBsLQPCwelASEBeQIAAXoA4AgBQQDeEwFCAN0TAUMA3BMBRAAYAUUASAFGAQABRwDbEwFIANoTAUkA2RMBSgDYEwFLANcTAUwA1hMBTQDVEwFOANQTAU8A0xMBUADSEwFRANETAVIA0BMBUwDPEwFUAM4TAVUAzRMBVgDMEwFXAMsTAVgAyhMBWQDJEwFaAMgTAV8AxxMBJAC9EwJhYQCUEgJiYQCTEgJjYQCSEgnrDAEAQQELxQaQE40S/hHpEeAR3xHXEdQRzxEYxRG7ELcQrhDzCJEQihDDFLQUsxSkFKIUoBSfFIwUixSCDfgT8BPDB/QTnAeYBZgFkRKQEo8SjhKMEosSihKJEogShxKGErcKhRKEEoMSghKBErcKgBL/Ef0R/BH7EfgR9xH2EfUR9BH6EfMR8hHxEZEK8BHvEe4R6xHqEegR5xHmEfkR5RHkEeMR7RHsEeIR4RHeEd0R3BHbEdoR2RHYEdYR1RHTEdIR0RHQEc4RzRHMEcsRyhHJEcgRxxHGEcQRwxGCCsIRwRHAEb8RvhG9EbwR9wm7EboRuRG4EbcRphGlEaQRoxGiEaERoBGfEZ4RnRGcEZsRmhGZEZgRlxGWEbYRtRG0EbMRshGxEbARrxGuEa0RrBGrEaoRqRGoEacRlRGUEZMRkQqREfsQ6gmQEY8RjhGNEYwRixGKEYkRiBGHEYYRhRGEEYMRghGBEYAR/xD2EJIR7hDoEOcQ/hD9EPgQ/BD6EPkQ9xD1EPQQ8xDyEPEQ8BDvEO0Q7BDrEOoQ6RDmEDlI5RDQBv8J2gbkEP0J2wbOBuMQ/gmBCuIQ4RDFBskJ4BDfEN4QmAXdENwQ2xDaENkQ2BDXENYQ1RDUENMQ0hDRENAQzxDOEM0QzBDLEMoQyRDIEMcQxhDFEMQQwxDCEMEQwBC/EL4QvRC8EOgEuhC5ELgQthC1ELQQsxCyELEQsBCvEK0QrBCrEKoQqRCoEKcQphCYBTaVBxqkEKMQohChEKAQnxCeEJ0QnBCbEJoQmRCbBpgQmwaXEJsGlhCVEJQQkxCSEJAQ5QicB48QjhCNEIwQixCJEIgQhxCGEIUQmQbjCJkG4wiZBoQQgxCCEIEQgBD/D/4P/Q+cB/wP+w/6D/kPgAT4D4AE9w+ABPYPgAT1D4AE9A/zD/IP8Q/wD+8P7g/tD+cP5RTkFN4I4xTiFOEU4BTfFN4U3RTcFNsU5QjaFNkU2BTXFNYU1RTUFNMU0hTRFNAUzxTOFM0UzBTLFMoUyRTIFMcUxhTFFMQUwhTBFMAUvxS+FL0UuBS8FLsUuhS5FLcUthSlELUUshSxFJEGsBSvFK4UrRSkAaQBwQGsFKsUqhSpFKgUpxSRBqYU5w+RBqUUoxShFMkEnhSdFJwUmxSaFJkUmBSXFI0OlhSVFJQUkxSSFJEUkBSRBo0U2wqHFIgU3w2FFIoUiRSGCIYUhBTPDYMUghT3CW7eCvgCgRSAFKwN/hP/E9UF/ROLDfoT/BP7E6QBpAGsDfkT9hP1E+sM8hPvE+oT6RPoE+UT2wf3E/ET8xPuE+0T7BPrE+cT5hPgE98T5BPjE+IT4RMOxBPDE8UTxhOoA6QBwhPBE8ATvxO+E6sHvBOqB7sTuhO5E6QBpAG4E7cTthP0C7UT9AunB+4LtBOzE6QHrBOtE6sTsBOvE64TowfhC6oTqROhB6cT5wPnA+cD5wOKC74SvBK6ErgSthK0ErISsBKuEqwSqhKoEqYSpBKOC+USgAiIC9kS2BLXEtYS1RKJC9QS0xLSEpML0BLPEs4SzRLMEqQByxLKEv0KyRLHEsYSxRLDEsES/ArIErITsRPEEsISwBL4Am5u5BLjEuIS4RLgEt8S3hLdEokL3BLbEtoSbocLhwueBOgE6ATREugEboQLgwueBKQBpAGCC5YFboQLgwueBKQBpAGCC5YFboAL/wqeBKQBpAH+CpYFboAL/wqeBKQBpAH+CpYF+AJuphOlE6QT+AJuoxOiE6ETbqATnxOeE50TxgvGC5wTmxOaE5kTmBNulxOWE5UTlBO/C78LkxOSE5ETjxOOE26NE4wTixOKE4kTiBOHE4YTboUThBODE4ITgROAE/8S/hL4Am61C/0S/BL7EvoS+RL4Er8SuxK3EqsSpxKzEq8S+AJutQv3EvYS9RL0EvMS8hK9ErkStRKpEqUSsRKtEosH+grxEosH+grwEm6cBZwF8QHxAfEBqgukAesC6wJunAWcBfEB8QHxAaoLpAHrAusCbpsFmwXxAfEB8QGpC6QB6wLrAm6bBZsF8QHxAfEBqQukAesC6wJu7xLuEm7tEuwSbusS6hJu6RLoEm6UC+cSqgdulAvmEqoH+AKjEpMB+AJu5wPnA6ISmRKcEqESbpoSnRKgEm6bEp4SnxJulxJulhJumBLcCuwKlRLsCtwKCrXkM84UgAwBB38CQCAARQ0AIABBCGsiAyAAQQRrKAIAIgJBeHEiAGohBQJAIAJBAXENACACQQJxRQ0BIAMgAygCACIEayIDQeCgCygCAEkNASAAIARqIQACQAJAAkBB5KALKAIAIANHBEAgAygCDCEBIARB/wFNBEAgASADKAIIIgJHDQJB0KALQdCgCygCAEF+IARBA3Z3cTYCAAwFCyADKAIYIQYgASADRwRAIAMoAggiAiABNgIMIAEgAjYCCAwECyADKAIUIgIEfyADQRRqBSADKAIQIgJFDQMgA0EQagshBANAIAQhByACIgFBFGohBCABKAIUIgINACABQRBqIQQgASgCECICDQALIAdBADYCAAwDCyAFKAIEIgJBA3FBA0cNA0HYoAsgADYCACAFIAJBfnE2AgQgAyAAQQFyNgIEIAUgADYCAA8LIAIgATYCDCABIAI2AggMAgtBACEBCyAGRQ0AAkAgAygCHCIEQQJ0QYCjC2oiAigCACADRgRAIAIgATYCACABDQFB1KALQdSgCygCAEF+IAR3cTYCAAwCCwJAIAMgBigCEEYEQCAGIAE2AhAMAQsgBiABNgIUCyABRQ0BCyABIAY2AhggAygCECICBEAgASACNgIQIAIgATYCGAsgAygCFCICRQ0AIAEgAjYCFCACIAE2AhgLIAMgBU8NACAFKAIEIgRBAXFFDQACQAJAAkACQCAEQQJxRQRAQeigCygCACAFRgRAQeigCyADNgIAQdygC0HcoAsoAgAgAGoiADYCACADIABBAXI2AgQgA0HkoAsoAgBHDQZB2KALQQA2AgBB5KALQQA2AgAPC0HkoAsoAgAgBUYEQEHkoAsgAzYCAEHYoAtB2KALKAIAIABqIgA2AgAgAyAAQQFyNgIEIAAgA2ogADYCAA8LIARBeHEgAGohACAFKAIMIQEgBEH/AU0EQCAFKAIIIgIgAUYEQEHQoAtB0KALKAIAQX4gBEEDdndxNgIADAULIAIgATYCDCABIAI2AggMBAsgBSgCGCEGIAEgBUcEQCAFKAIIIgIgATYCDCABIAI2AggMAwsgBSgCFCICBH8gBUEUagUgBSgCECICRQ0CIAVBEGoLIQQDQCAEIQcgAiIBQRRqIQQgASgCFCICDQAgAUEQaiEEIAEoAhAiAg0ACyAHQQA2AgAMAgsgBSAEQX5xNgIEIAMgAEEBcjYCBCAAIANqIAA2AgAMAwtBACEBCyAGRQ0AAkAgBSgCHCIEQQJ0QYCjC2oiAigCACAFRgRAIAIgATYCACABDQFB1KALQdSgCygCAEF+IAR3cTYCAAwCCwJAIAUgBigCEEYEQCAGIAE2AhAMAQsgBiABNgIUCyABRQ0BCyABIAY2AhggBSgCECICBEAgASACNgIQIAIgATYCGAsgBSgCFCICRQ0AIAEgAjYCFCACIAE2AhgLIAMgAEEBcjYCBCAAIANqIAA2AgAgA0HkoAsoAgBHDQBB2KALIAA2AgAPCyAAQf8BTQRAIABBeHFB+KALaiECAn9B0KALKAIAIgRBASAAQQN2dCIAcUUEQEHQoAsgACAEcjYCACACDAELIAIoAggLIQAgAiADNgIIIAAgAzYCDCADIAI2AgwgAyAANgIIDwtBHyEBIABB////B00EQCAAQSYgAEEIdmciAmt2QQFxIAJBAXRrQT5qIQELIAMgATYCHCADQgA3AhAgAUECdEGAowtqIQQCfwJAAn9B1KALKAIAIgdBASABdCICcUUEQEHUoAsgAiAHcjYCACAEIAM2AgBBGCEBQQgMAQsgAEEZIAFBAXZrQQAgAUEfRxt0IQEgBCgCACEEA0AgBCICKAIEQXhxIABGDQIgAUEddiEEIAFBAXQhASACIARBBHFqIgcoAhAiBA0ACyAHIAM2AhBBGCEBIAIhBEEICyEAIAMiAgwBCyACKAIIIgQgAzYCDCACIAM2AghBGCEAQQghAUEACyEHIAEgA2ogBDYCACADIAI2AgwgACADaiAHNgIAQfCgC0HwoAsoAgBBAWsiAEF/IAAbNgIACwt+AQJ/IwBBIGsiAiQAAkAgAEEAIACtIAGtfkIgiKcbRQRAQQAgACAAIAEQQyIDGw0BIAJBIGokACADDwsgAiABNgIEIAIgADYCAEG4+AgoAgBBgO8DIAIQHhoQJwALIAIgACABbDYCEEG4+AgoAgBBz+4DIAJBEGoQHhoQJwALFwBBAUF/IAAgASABEDsiABCjAiAARhsLJQEBfyAAKAIsIgBBAEGAASAAKAIAEQQAIgAEfyAAKAIQBUEACws0AQF/AkAgACABEOUBIgFFDQAgACgCLCIAIAFBCCAAKAIAEQQAIgBFDQAgACgCECECCyACC24BAX8jAEEgayIDJAAgA0IANwMYIANCADcDECADIAI2AgwCQCADQRBqIAEgAhC5CyIBQQBIBEAgA0GAjAsoAgAQczYCAEG5hAQgAxA2DAELIAAgA0EQaiIAEKQFIAEQowIaIAAQZQsgA0EgaiQACyQBAX8jAEEQayIDJAAgAyACNgIMIAAgASACEP0LIANBEGokAAszAQF/IAIEQCAAIQMDQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQQFrIgINAAsLIAALpAEBA38jAEEQayICJAACQCAAEC8iAyAAKAIAQQNxIAApAwgQmAoiAQR/IAEoAhgFQQALIgENACADKAJMIgEoAgAoAgwiAwRAIAEoAgggACgCAEEDcSAAKQMIIAMRJwAiAQ0BC0EAIQEgACgCAEEDcUECRg0AIAIgACkDCDcDCCACQSU2AgBBoOAKIQFBoOAKQSBBjBggAhChARoLIAJBEGokACABCw8AIAAgASACIANBABDEDAtDACAAIAAgAaUgAb1C////////////AINCgICAgICAgPj/AFYbIAEgAL1C////////////AINCgICAgICAgPj/AFgbCxUAIAAQpwEEQCAAKAIEDwsgABCjAwsUACAAECgEQCAALQAPDwsgACgCBAtVAAJAIAEEQCACIAEoAghPDQEgACABKAIAIAEoAgQgAmogASgCDHBByABsakHIABAfGg8LQfrUAUGzgQFBPUHmJBAAAAtBjbcDQbOBAUE9QeYkEAAACyYAIAAgARDMByIBRQRAQQAPCyAAEOsBKAIMIAEoAhBBAnRqKAIACwcAQQEQBwALLgAgAC0ADyIAQQFqQf8BcUERTwRAQdvAA0GaggFByQBBwpwBEAAACyAAQf8BRwtNAAJAIAAEQCABIAAoAghPDQEgACgCACAAKAIEIAFqIAAoAgxwQcgAbGoPC0H61AFBs4EBQT1BkSkQAAALQY23A0GzgQFBPUGRKRAA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AgALQcCkCyEBIAJBCGoiAEHApAtBGBDWAUUNAkHYpAshASAAQdikC0EYENYBRQ0CQRgQSCIBRQ0BCyABIAIpAgg3AgAgASACKQIYNwIQIAEgAikCEDcCCAwBC0EAIQELIAJBIGokAEHkpgtBAToAAEHgpgsgATYCACABCwUAEAgACyAAIAAEQCAAKAIUEBggACgCGBAYIAAoAhwQGCAAEBgLCwkAIABBABDxBgu/CgIFfw9+IwBB4ABrIgUkACAEQv///////z+DIQwgAiAEhUKAgICAgICAgIB/gyEKIAJC////////P4MiDUIgiCEOIARCMIinQf//AXEhBwJAAkAgAkIwiKdB//8BcSIJQf//AWtBgoB+TwRAIAdB//8Ba0GBgH5LDQELIAFQIAJC////////////AIMiC0KAgICAgIDA//8AVCALQoCAgICAgMD//wBRG0UEQCACQoCAgICAgCCEIQoMAgsgA1AgBEL///////////8AgyICQoCAgICAgMD//wBUIAJCgICAgICAwP//AFEbRQRAIARCgICAgICAIIQhCiADIQEMAgsgASALQoCAgICAgMD//wCFhFAEQCACIAOEUARAQoCAgICAgOD//wAhCkIAIQEMAwsgCkKAgICAgIDA//8AhCEKQgAhAQwCCyADIAJCgICAgICAwP//AIWEUARAIAEgC4RCACEBUARAQoCAgICAgOD//wAhCgwDCyAKQoCAgICAgMD//wCEIQoMAgsgASALhFAEQEIAIQEMAgsgAiADhFAEQEIAIQEMAgsgC0L///////8/WARAIAVB0ABqIAEgDSABIA0gDVAiBht5IAZBBnStfKciBkEPaxC1AUEQIAZrIQYgBSkDWCINQiCIIQ4gBSkDUCEBCyACQv///////z9WDQAgBUFAayADIAwgAyAMIAxQIggbeSAIQQZ0rXynIghBD2sQtQEgBiAIa0EQaiEGIAUpA0ghDCAFKQNAIQMLIANCD4YiC0KAgP7/D4MiAiABQiCIIgR+IhAgC0IgiCITIAFC/////w+DIgF+fCIPQiCGIhEgASACfnwiCyARVK0gAiANQv////8PgyINfiIVIAQgE358IhEgDEIPhiISIANCMYiEQv////8PgyIDIAF+fCIUIA8gEFStQiCGIA9CIIiEfCIPIAIgDkKAgASEIgx+IhYg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AXJFBEAgABCjAxoLIAJBEGokAAtQAQF+AkAgA0HAAHEEQCABIANBQGqthiECQgAhAQwBCyADRQ0AIAIgA60iBIYgAUHAACADa62IhCECIAEgBIYhAQsgACABNwMAIAAgAjcDCAvOCQIEfwR+IwBB8ABrIgYkACAEQv///////////wCDIQkCQAJAIAFQIgUgAkL///////////8AgyIKQoCAgICAgMD//wB9QoCAgICAgMCAgH9UIApQG0UEQCADQgBSIAlCgICAgICAwP//AH0iC0KAgICAgIDAgIB/ViALQoCAgICAgMCAgH9RGw0BCyAFIApCgICAgICAwP//AFQgCkKAgICAgIDA//8AURtFBEAgAkKAgICAgIAghCEEIAEhAwwCCyADUCAJQoCAgICAgMD//wBUIAlCgICAgICAwP//AFEbRQRAIARCgICAgICAIIQhBAwCCyABIApCgICAgICAwP//AIWEUARAQoCAgICAgOD//wAgAiABIAOFIAIgBIVCgICAgICAgICAf4WEUCIFGyEEQgAgASAFGyEDDAILIAMgCUKAgICAgIDA//8AhYRQDQEgASAKhFAEQCADIAmEQgBSDQIgASADgyEDIAIgBIMhBAwCCyADIAmEUEUNACABIQMgAiEEDAELIAMgASABIANUIAkgClYgCSAKURsiCBshCiAEIAIgCBsiDEL///////8/gyEJIAIgBCAIGyILQjCIp0H//wFxIQcgDEIwiKdB//8BcSIFRQRAIAZB4ABqIAogCSAKIAkgCVAiBRt5IAVBBnStfKciBUEPaxC1ASAGKQNoIQkgBikDYCEKQRAgBWshBQsgASADIAgbIQMgC0L///////8/gyEBIAcEfiABBSAGQdAAaiADIAEgAyABIAFQIgcbeSAHQQZ0rXynIgdBD2sQtQFBECAHayEHIAYpA1AhAyAGKQNYC0IDhiADQj2IhEKAgICAgICABIQhASAJQgOGIApCPYiEIAIgBIUhBAJ+IANCA4YiAiAFIAdGDQAaIAUgB2siB0H/AEsEQEIAIQFCAQwBCyAGQUBrIAIgAUGAASAHaxC1ASAGQTBqIAIgASAHEKUDIAYpAzghASAGKQMwIAYpA0AgBikDSIRCAFKthAshCUKAgICAgICABIQhCyAKQgOGIQoCQCAEQgBTBEBCACEDQgAhBCAJIAqFIAEgC4WEUA0CIAogCX0hAiALIAF9IAkgClatfSIEQv////////8DVg0BIAZBIGogAiAEIAIgBCAEUCIHG3kgB0EGdK18p0EMayIHELUBIAUgB2shBSAGKQMoIQQgBikDICECDAELIAkgCnwiAiAJVK0gASALfHwiBEKAgICAgICACINQDQAgCUIBgyAEQj+GIAJCAYiEhCECIAVBAWohBSAEQgGIIQQLIAxCgICAgICAgICAf4MhAyAFQf//AU4EQCADQoCAgICAgMD//wCEIQRCACEDDAELQQAhBwJAIAVBAEoEQCAFIQcMAQsgBkEQaiACIAQgBUH/AGoQtQEgBiACIARBASAFaxClAyAGKQMAIAYpAxAgBikDGIRCAFKthCECIAYpAwghBAsgBEI9hiACQgOIhCEBIARCA4hC////////P4MgB61CMIaEIAOEIQQCQAJAIAKnQQdxIgVBBEcEQCAEIAEgASAFQQRLrXwiA1atfCEEDAELIAQgASABIAFCAYN8IgNWrXwhBAwBCyAFRQ0BCwsgACADNwMAIAAgBDcDCCAGQfAAaiQAC2sBAX8jAEGAAmsiBSQAIARBgMAEcSACIANMckUEQCAFIAEgAiADayIDQYACIANBgAJJIgEbEDMaIAFFBEADQCAAIAVBgAIQqAEgA0GAAmsiA0H/AUsNAAsLIAAgBSADEKgBCyAFQYACaiQAC1kBAX8CQAJAAkACQCABKAIAIgJBA3EEfyACBSAAIAEoAkRHDQQgASgCAAtBA3FBAWsOAwABAQILIAAgARDXBA8LIAAgARCgBg8LIAEQugEPC0G2/gBBABA2C14BAX8jAEEgayICJAAgAiAAKAIANgIIIAIgACgCBDYCDCACIAAoAgg2AhAgAEIANwIEIAIgACsDEDkDGCAAIAEQogEgASACQQhqIgAQogEgAEEEchDZASACQSBqJAALxQYBBH8gACgCRCEDIAAQeiEBA0AgAQRAIAEQeSABELoBIQEMAQsLIAAQGyEBA0AgAQRAIAAgARAcIAAgARDXBCEBDAELCyAAKAJMQSxqEI4KIAAoAkxBOGoQjgogACAAEPUHAkACQAJAAkACQAJAIAAoAjAiAQRAIAEQtwMNAQJAIABBMGoiAQRAIAEoAgAiAgR/IAIoAgAQGCABKAIABUEACxAYIAFBADYCAAwB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DAseACAARQRAQfrUAUH6/wBBFUGLjQEQAAALIAAoAggLDAAgAEGFnQVBABBtCz0BAn8gAEEAIABBAEobIQADQCAAIARGRQRAIAMgBEEDdCIFaiACIAEgBWorAwCiOQMAIARBAWohBAwBCwsLPQAgASgCCCACTQRAQY23A0GzgQFBPUHmJBAAAAsgACABKAIAIAEoAgQgAmogASgCDHBByABsakHIABAfGgs7AQJ/IwBB0ABrIgEkACABQShqIgJBAEEoEDMaIAAgASACQSgQHyIBEOEPIAAoAgggAUHQAGokAEEBawuhAQECfwJAAkAgARA7IgJFDQAgABBHIAAQJGsgAkkEQCAAIAIQ8QILIAAQJCEDIAAQKARAIAAgA2ogASACEB8aIAJBgAJPDQIgACAALQAPIAJqOgAPIAAQJEEQSQ0BQbi7A0GaggFBhQJBpe4AEAAACyAAKAIAIANqIAEgAhAfGiAAIAAoAgQgAmo2AgQLDwtB6c8BQZqCAUGDAkGl7gAQAAALZQEBfwJAIAErAwAgASsDEGNFDQAgASsDCCABKwMYY0UNACAAIAAoAlAiAkEBajYCUCAAKAJUIAJBBXRqIgAgASkDGDcDGCAAIAEpAxA3AxAgACABKQMINwMIIAAgASkDADcDAAsLBwAgABBRGgsPACAAIAAoAgAoAgwRAgALBwAgABAjRQsRACAAIAEgASgCACgCHBEDAAsRACAAIAEgASgCACgCGBEDAAsuACAAIAAoAghBgICAgHhxIAFB/////wdxcjYCCCAAIAAoAghBgICAgHhyNgIICwkAIAAgATYCAAsLACAAIAEgAhCrBQsTACAAIAEgAiAAKAIAKAIMEQQACyMBAX8gAkEATgR/IAAoAgggAkECdGooAgAgAXFBAEcFQQALCxMAIABBIHIgACAAQcEAa0EaSRsLggEBAn8gAkUEQEEADwsgAC0AACIDBH8CQANAIAEtAAAiBEUNASACQQFrIgJFDQECQCADIARGDQAgAxD7ASABLQAAEPsBRg0AIAAtAAAhAwwCCyABQQFqIQEgAC0AASEDIABBAWohACADDQALQQAhAwsgAwVBAAsQ+wEgAS0AABD7AWsLPQEDfyMAQRBrIgEkACABIAA2AgwgASgCDCICKAIAIgMEQCACIAM2AgQgAigCCBogAxAYCyABQRBqJAAg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A0AgAUUNAiABQQAgAiADIAQQrwIgARB5IQEMAAsACyAAEBshAyABQQFHIQYDQCADRQ0BAkAgBkUEQCADIAIgBSAEEDUaDAELIAAgAxAtIQEDQCABRQ0BIAEgAiAFIAQQNRogACABEDAhAQwACwALIAAgAxAcIQMMAAsACwsRACAAQQRBEEGAgICAARD7BgsxAQF/IAAoAgQiASgCICsDECABKwMYoCAAKwMIoSAAKAIAIgAoAiArAxAgACsDGKChC1ABAX9BCCEFAkACQAJAAkAgA0EBaw4EAwACAQILQRAhBQwCC0EEIQUMAQtBACEFCyAAIAEgAyAFIAQQgA4hACACQQBKBEAgACACEP8NCyAACy4BAn8gABAbIQEDQCABBEAgACABQQBBARCXCCACaiECIAAgARAcIQEMAQsLIAILpAEBA39BwAAQigYiAiACKAIAQXxxQQFyNgIAIAJBwAIQigYiATYCECACIAAQNzYCGCABQoCAgICAgID4PzcDYCABQQE6AKwBIAFCgICAgICAgPg/NwNYIAFBATYC7AEgAUKAgICAgICA+D83A1AgAUEANgLEAUEFQQQQzQIhAyABQQA2AswBIAEgAzYCwAEgAUEFQQQQzQI2AsgBIAAgAhDCCCACCxMAIAAgASgCABDiDiABQgA3AgAL/QMBB38gBUEYQRQgAC0AABtqKAIAIAAQtQMiBigCKCAAKAIoIAEoAigQkgYgBEEAIARBAEobQQFqIQxBASELA0AgCyAMRkUEQCAAIgQgAhC0AyEAIAEiByADELQDIQECfyAELQAARQRAIAUoAhggABC1AyEJIAcoAighByAEKAIoIQggBigCKCEGIAArAwggBCsDEGEEQCAEKAIgIAYgCCAHELYDIQYgCSgCKCEEQQFGBEAgACABIAYbIQcgASAAIAYbIQggCQwDCyABIAAgBhshByAAIAEgBhshCCAJDAILIAQoAiQgBiAIIAcQtgMhBiAJKAIoIQRBAUYEQCABIAAgBhshByAAIAEgBhshCCAJDAILIAAgASAGGyEHIAEgACAGGyEIIAkMAQsgBSgCFCAAELUDIQkgBygCKCEHIAQoAighCCAGKAIoIQYCfyAAKwMIIAQrAxBhBEAgBCgCICAGIAggBxC2AyEGIAkoAighBEECRgRAIAAgASAGGyEIIAEgACAGGwwC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BCsDAKAhAiAEQQhqIQQMAQsLIAIgALejIQIDQCAABEAgASABKwMAIAKhOQMAIABBAWshACABQQhqIQEMAQsLC3oBAn8gASAAIAMoAgARAAAhBSACIAEgAygCABEAACEEAkAgBUUEQCAERQRADwsgASACELkBIAEgACADKAIAEQAARQ0BIAAgARC5AQwBCyAEBEAgACACELkBDAELIAAgARC5ASACIAEgAygCABEAAEUNACABIAIQuQELC5MDAQt/IAEQOyECIwBBEGsiCiQAAkAgCkEIaiAAELEFIgwtAABBAUcNACAAIAAoAgBBDGsoAgBqIgUoAhghAyABIAJqIgsgASAFKAIEQbABcUEgRhshCSAFKAJMIgJBf0YEQCMAQRBrIgQkACAEQQxqIgcgBRBQIAdBoKgLEKUCIgJBICACKAIAKAIcEQAAIQIgBxBNIARBEGokACAFIAI2AkwLIALAIQdBACECIwBBEGsiCCQAAkAgA0UNACAFKAIMIQYgCSABayIEQQBKBEAgAyABIAQgAygCACgCMBEEACAERw0BCyAGIAsgAWsiAWtBACABIAZIGyIGQQBKBEAgCEEEaiIEIAYgBxDiCiADIAgoAgQgBCAILAAPQQBIGyAGIAMoAgAoAjARBAAgBBA0GiAGRw0BCyALIAlrIgFBAEoEQCADIAkgASADKAIAKAIwEQQAIAFHDQELIAVBADYCDCADIQILIAhBEGokACACDQAgACAAKAIAQQxrKAIAakEFEO8NCyAMELAFIApBEGokACAAC6ULAQ9/AkAgAEUNAAJAAkACQAJAAkACQAJAIAAoAiBFBEBBASEDIAAtACQiAkECcQ0HIAEEQCACQQFxDQgLIAAoAgAgACgCBEcNCEEAIQMgABCYCCINRQ0HQQAhAiAAKAIAIgRBACAEQQBKGyEPIA0oAhghDCANKAIUIQkgACgCGCEQIAAoAhQhCiAEQQQQSiEHA0AgAiAPRkUEQCAHIAJBAnRqQX82AgAgAkEBaiECDAELCwJAQQggACgCECABG0EBaw4IAAQHAwcHBwIHC0F/IAQgBEEASBtBAWohBCANKAIcIQ4gACgCHCELQQAhAgNAIAIgBEYEQANAIAUgD0YNByAKIAVBAnQiA2ooAgAiBCAKIAVBAWoiBUECdCIGaigCACICIAIgBEgbIQggBCECA0Ag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FCAGQQA2AmAgBkIANwJYIAZCADcCcCAGQQA2AnggBkIANwJEIAZBADoAQCAGIAI2AjggBkEANgIoIAZBADYCPCAGIAI2AkwgBkIANwKMASAGQQA6AIgBIAZCATcCgAEgBiACNgKUASAGQgA3ApgBIAZBADoAoAEgBkIANwKkASAGQgA3AqwBIAZCADcCtAELIAFBADYCkAMgASAGNgL8AiABQQA2AogDIAFBADYCyAIgAUEANgLAAiABQQA2ArgCIAFCADcD6AMgAUEhOgDwAyABQQA2AoACIAFBADYCiAEgAUEAOwH0ASABQgA3ArgDIAFBADYC8AEgAUIANwKkAyABIAI2AswDIAFCADcCwAMgAUEANgLIAyABQQA6AKwDIAFBADYC4AMgAUIANwLYAyABQgA3AtADIAEgAjYC5AMgAUHPATYCoAIgAUGbATYCiAIgAUEANgKcAiABQoCAgIAQNwKUAiAEBEBBACEGA0AgBCAGaiAGQQFqIQYtAAANAAsgBiABKAIMEQIAIgIEQCACIAQgBhAfGgsgASACNgLwAQsgAUEANgKAAyABQaABaiABQZwBakEAENoGGiABQgA3AwAgAUFAa0EAQcAAEDMaIAFCADcCjAEgAUEANgKEASABQgA3ApQBIAFCADcDsAMgAUEANgI0IAFBAToAMCABQQA2AiwgAUIANwIkIAFBADYCxAIgAUEANgK8AiABQgA3AqQCIAFCADcCrAIgAUEANgK0AiABIAEoAggiAjYCHCABIAI2AhggASABNgKAASABQdQCakEAQSYQMxogAUEANgKYAyABQQA2AowDIAFBADYChAMgAUEANgLQAiABQQE6AMwCIAFBADYChAIgAUEAOgDABCABQgA3AvQDIAFCADcD+AEgAUIANwOQBCABQgA3AoQEIAFBADsBgAQgAUIANwOYBCABQgA3A6AEIAFCADcDqARBqdoBENUGIQIgAUIANwOwBCABQoCAgAQ3A6gEIAFBgICglgQ2AqQEIAEgAjYCoAQgAUIANwO4BCABQYLaARDVBjYCvAQCQCAERQ0AIAEoAvABDQAgARDnCQwCCyABQZCLCDYC7AEgAQwDCyABQQA2AvwCIAEoAjggASgCFBEBACABKAKgAyABKAIUEQEADAELQQAMAQsgASABKAIUEQEAQQALIgE2AgAgByAFKAI0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ABCyASECIAAoAhAiASAAKAIUQQJ0aiEDA0AgASADTw0CIAFBADYCACABQQRqIQEMAAsACyAAKAIQIQIgAEEANgIQDAELIAAoAgghAQsgAEEANgIYIABBADYCDCAAIAFB/19xNgIIIAILCAAgABCbARoL8gECA38BfCMAQSBrIgIkACAAQSxqIgQQ7wQoAgAhAyACIAEpAxg3AxggAiABKQMQNwMQIAIgASkDCDcDCCACIAEpAwA3AwACQCADRQ0AAkAgAigCBA0AIAMoAgQiAUUNACACIAE2AgQLAkAgAisDEEQAAAAAAAAAAGNFDQAgAysDECIFRAAAAAAAAAAAZkUNACACIAU5AxALAkAgAigCAA0AIAMoAgAiAUUNACACIAE2AgALIAMoAhhB/wBxIgFFDQAgAiACKAIYIAFyNgIYCyAEIAAoAjwoAogBIgAgAkEBIAAoAgARBAAQuQkgAkEgaiQAC28BAX8jAEEgayIDJAAgA0IANwMYIANCADcDCCADQoCAgICAgID4v383AxAgAyACNgIYIANCADcDACABBEAgACADQbCgCkEDIAFBpuABEI8ECyAAKAI8KAKIASIAIANBASAAKAIAEQQAIANBIGokAAsLACAAQeDUBBDXCQsTACAAKAIAQTRqIAEgARA7EOkJC0UAAkAgABAoBEAgABAkQQ9GDQELIABBABDHAwsCQCAAECgEQCAAQQA6AA8MAQsgAEEANgIECyAAECgEfyAABSAAKAIACwtaAQJ/IwBBEGsiAyQAIAMgATYCDCADIANBC2oiBDYCBCAAIANBDGoiASACIANBBGogASAAKAI4EQcAGiADKAIEIQAgAywACyEBIANBEGokAEF/IAEgACAERhsLpQICA38BfiMAQYABayIEJAAgASgCACIGEC8oAhAoAnQgBCACOQM4IAQgAzkDMEEDcSIFBEAgBCAEKQM4NwMYIAQgBCkDMDcDECAEQUBrIARBEGogBUHaAGwQvwogBCAEKQNINwM4IAQgBCkDQDcDMAsgBEIANwNYIARCADcDUCAEIAQpAzgiBzcDaCAEIAc3A3ggBCAEKQMwIgc3A2AgBEIANwNIIARCADcDQCAEIAc3A3AgASAGKAIQKAIIKAIEKAIMIARBQGtBARCMBSAFBEAgBCAEKQNINwMIIAQgBCkDQDcDACAEQSBqIAQg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IwBBEGsiASQAQejgCigCAAJAIABFDQAgABCpASICDQAgASAAEDtBAWo2AgBBuPgIKAIAQc/uAyABEB4aECcAC0Ho4AogAjYCACABQRBqJAALDwAgACAAKAIAKAIkEQIACxEAIAAgASABKAIAKAIgEQMACxEAIAAgASABKAIAKAIsEQMACwwAIABBgoaAIDYAAAsRACAAEEIgABAjQQJ0ahCXBwsNACAAKAIAIAEoAgBHCw4AIAAQQiAAECNqEJcHCxYAIAAgASACIAMgACgCACgCIBEGABoLDgAgACgCCEH/////B3EL6QEBBH8jAEEQayIEJAAgABBHIgMgAWoiASADQQF0QYAIIAMbIgIgASACSxshASAAECQhBQJAAkACQCAALQAPQf8BRgRAIANBf0YNAiAAKAIAIQIgAUUEQCACEBhBACECDAILIAIgARA5IgJFDQMgASADTQ0BIAIgA2pBACABIANrEDMaDAELIAFBARAZIgIgACAFEB8aIAAgBTYCBAsgAEH/AToADyAAIAE2AgggACACNgIAIARBEGokAA8LQdvEA0HpggFBzQBB9LYBEAAACyAEIAE2AgBBuPgIKAIAQc/uAyAEEB4aECcAC4ABAQJ/IwBBEGsiBCQAIwBBIGsiAyQAIANBGGogASABIAJBAnRqEK0FIANBEGogAygCGCADKAIcIAAQ3gsgAyABIAMoAhAQrAU2AgwgAyAAIAMoAhQQogM2AgggBEEIaiADQQxqIANBCGoQ+AEgA0EgaiQAIAQoAgwaIARBEGokAAtFAQF/IwBBEGsiBSQAIAUgASACIAMgBEKAgICAgICAgIB/hRC2ASAFKQMAIQEgACAFKQMINwMIIAAgATcDACAFQRBqJAALtQEBA38jAEEgayIDJAACQAJAIAEsAAAiAgRAIAEtAAENAQsgACACELsFIQEMAQsgA0EAQSAQMxogAS0AACICBEADQCADIAJBA3ZBHHFqIgQgBCgCAEEBIAJ0cjYCACABLQABIQIgAUEBaiEBIAINAAsLIAAiAS0AACICRQ0AA0AgAyACQQN2QRxxaigCACACdkEBcQ0BIAEtAAEhAiABQQFqIQEgAg0ACwsgA0EgaiQAIAEgAGsLqAEAAkAgAUGACE4EQCAARAAAAAAAAOB/oiEAIAFB/w9JBEAgAUH/B2shAQwCCyAARAAA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AQsLIANBAWohAyABIARqIQQMAQsLIAULHAAgABDHDiAAKAIAEBggAEIANwIIIABCADcCAAtBAQF/AkAgACsDACABKwMQZA0AIAErAwAgACsDEGQNACAAKwMIIAErAxhkDQAgASsDCCAAKwMYZA0AQQEhAgsgAgvCAQEIfCABKwMAIgMgASsDECIEZARAIAAgAikDADcDACAAIAIpAxg3AxggACACKQMQNwMQIAAgAikDCDcDCA8LIAIrAwAiBSACKwMQIgZkBEAgACABKQMANwMAIAAgASkDGDcDGCAAIAEpAxA3AxAgACABKQMINwMIDwsgAisDCCEHIAErAwghCCACKwMYIQkgASsDGCEKIAAgBCAGECo5AxAgACADIAUQKjkDACAAIAogCRAqOQMYIAAgCCAHECo5AwgLrgEDAn4DfwF8IwBBEGsiBCQAAkACQCAAKwMAIAArAxBkDQBCASEBA0AgA0ECRg0CAn4gACADQQN0aiIFKwMQIAUrAwChIgZEAAAAAAAA8ENjIAZEAAAAAAAAAABmcQRAIAaxDAELQgALIgJQDQEgBCACQgAgAUIAEKABIAQpAwhQBEAgA0EBaiEDIAEgAn4hAQwBCwtBgbgEQQAQNhAnAAtCACEBCyAEQRBqJAAgAQsIAEEBIAAQSgvBAQEDfwJAAkAgACgCECICKAKwASIEIAFHBEAgACABKAIQIgMoArABRw0BC0G+mQRBABArDAELIARFBEAgAiABNgKwASACKAKsASIAIAMoAqwBSgRAIAMgADYCrAELA0AgAUUNAiABKAIQIgAgAC8BqAEgAi8BqAFqOwGoASAAIAAvAZoBIAIvAZoBajsBmgEgACAAKAKcASACKAKcAWo2ApwBIAAoArABIQEMAAsAC0Gg1AFB0L4BQaYCQZkQEAAACwsTACAAIAFBrCVB7gVBgsABEJwEC0QAQez/CigCACABSwRAIABB5P8KKAIAQej/CigCACABakHw/wooAgBwQShsakEoEB8aDwtBjbcDQb+8AUEwQZIlEAAAC4QBAQJ/IAAgACgCBCIEQQFqNgIEIAAoAhQgBEEYbGoiACABKAIgNgIMIAIoAiAhBSAAQQA2AgggACADOQMAIAAgBTYCECABKAIcIAEuARAiBUECdGogBDYCACABIAVBAWo7ARAgAigCHCACLgEQIgFBAnRq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3AMgAUcNAQsgBBC6CwwBC0EAIQALIAdBEGokACAAC6gBAQN/IwBBEGsiByQAAkACQCAARQ0AIAQoAgwhBiACIAFrIghBAEoEQCAAIAEgCBDcAyAIRw0BCyAGIAMgAWsiAWtBACABIAZIGyIBQQBKBEAgACAHQQRqIAEgBRC7CyIFEEIgARDcAyEGIAUQNBogASAGRw0BCyADIAJrIgFBAEoEQCAAIAIgARDcAyABRw0BCyAEELoLDAELQQAhAAsgB0EQaiQAIAALDgAgACABKAIANgIAIAALCgAgACABIABragsLACAALQALQf8AcQsIACAAQf8BcQtQAQF+AkAgA0HAAHEEQCACIANBQGqtiCEBQgAhAgwBCyADRQ0AIAJBwAAgA2uthiABIAOtIgSIhCEBIAIgBIghAgsgACABNwMAIAAgAjcDCAvbAQIBfwJ+QQEhBAJAIABCAFIgAUL///////////8AgyIFQoCAgICAgMD//wBWIAVCgICAgICAwP//AFEbDQAgAkIAUiADQv///////////wCDIgZCgICAgICAwP//AFYgBkKAgICAgIDA//8AURsNACAAIAKEIAUgBoSEUARAQQAPCyABIAODQgBZBEAgACACVCABIANTIAEgA1EbBEBBfw8LIAAgAoUgASADhYRCAFIPCyAAIAJWIAEgA1UgASADURsEQEF/DwsgACAChSABIAOFhEIAUiEECyAECxYAIABFBEBBAA8LQYCMCyAANgIAQX8LCwAgACABIAIRAAALZAECfyMAQRBrIgMkAAJAIABBABCuAiIARQ0AAkACQAJAAkAgAQ4EAAECAgMLIAAoAhAhAgwDCyAAKAIIIQIMAgsgACgCDCECDAELIAMgATYCAEHCyQQgAxA2CyADQRBqJAAgAgukAQIDfwJ8IwBBEGsiAiQAIAAQvAIgACgCECIBKwMYRAAAAAAAAFJAoyEEIAErAxBEAAAAAAAAUkCjIQUgABAbIQEDQCABBEAgASgCECgClAEiAyADKwMAIAWhOQMAIAMgAysDCCAEoTkDCCAAIAEQHCEBDAELCyACIAAoAhAiASkDGDcDCCACIAEpAxA3AwAgACACEP0MIABBARDSBSACQRBqJAALDwAgAUEBaiAAIAAQrwGfC6gBAgR/AnwgASgCACECIABBBGoiAyEAIAMhAQNAIAAo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EBggBxAYQQAhCAwBCyACIAEoAgQ2AgBB0foDIAIQKwsgCCANaiENDAELIAAQOEEATgRAQZSBCyAAEDg2AgBBmIELAn9BlIELKAIAQQRquJ8iE5lEAAAAAAAA4EFjBEAgE6oMAQtBgICAgHgLNgIAQciBC0GUgQsoAgBB4AAQGTYCACAAEBshAyACQbADaiAAEPoCIAIrA7ADIRQCfyACLQDAA0UEQCACKwO4AyETQdQDDAELIAIrA7gDRAAAAAAAAFJAoyETIBREAAAAAAAAUkCjIRRB1QMLIQcCQANAIAhBlIELKAIAIgRPDQFByIELKAIAIAhB4ABsaiIEIAMoAhAoApQBIgYrAwA5AwggBCAGKwMIOQMQIARBKGogAyAUIBMgBxEfAEUEQCAEQQE2AhwgBCAINgIYIARCADcDWCAEIAM2AgAgCEEBaiEIIAAgAxAcIQMMAQsLQciBCygCABAYQciBC0EANgIAEJQNDAILQQAhCCACQbADakEAQdAAEDMaIAQEQEHIgQsoAgAhB0T////////vfyETRP///////+//IRVE////////7/8hFkT////////vfyEXA0AgBCAIRgRARJqZmZmZmak/IRQCQCAAQbPoABAmIgBFDQAgAC0AAEUNACAAEKoCIRQLQZCCCyAWIBYgF6EgFKIiGaAiFjkDAEGYggsgFyAZoSIXOQMAQYiCCyATIBUgE6EgFKIiFKEiEzkDAEGAggsgFSAUoCIUOQMAIAIgFzkD2AMgAiAWOQPoAyACIBc5A7gDIAIgFDkD0AMgAiAWOQPIAyACIBM5A/ADIAIgFDkDwAMgAiATOQPgAyABKAIAIQBBABDoByEHAkACQCAAQQJGBEAgB0UNAiACQbADahCTDUEAIQQDQEHIgQsoAgAhAUGUgQsoAgAhB0EAIQMDQCADIAdHBEAgASADQeAAbGoiACAAKwMIRM3MzMzMzPA/ojkDCCAAIAArAxBEzczMzMzM8D+iOQMQIANBAWohAwwBCwsgBEEBaiIEEOgHDQALQYzdCi0AAEUNASACIAQ2AhBBuPgIKAIAQcbiAyACQRBqEB4aDAELIAdFDQEgAkGwA2oQkw1BACEIQQAhAwNAIAJBsANqIgEhACAIBEAgABCRDQtBqIELQv////////93NwMAQaCBC0L/////////9/8ANwMAAkBB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BA0AIAMoAmgiAEECSQ0AIAUQvwMoAgBFDQAgAEECRwRAQfecBEEAECsLIAEgA0HgAGoiABC/AygCABBkNgIAIANByABqIABBARCVAiADKAJIBEAgA0EwaiAAQQEQlQIgASADKAIwEGQ2AgQLIAICfCADQeAAaiIAEL8DLQAQQQFGBEAgABC/AysDCAwBCyADQRhqIANB4ABqIgBBARCVAkQAAAAAAAAAACADLQAoQQFHDQAaIAMgAEEBEJUCRAAAAAAAAPA/IAMrAwihCzkDAEEBIQQLIANB4ABqEIsEIANB8ABqJAAgBAtbAQJ/IwBBIGsiAiQAA0AgASAAKAIIT0UEQCACQQhqIAAgARCVAiACKAIIEBggAUEBaiEBDAELCyAAQgA3AgQgACgCABAYIABCADcCCCAAQgA3AgAgAkEgaiQAC68BAQF/IAAoAhAiAUUEQEH6+QBBsr0BQf8AQZyXARAAAAsgASgC3AEQGCABKALYARAYIAEoAuABEBggASgC5AEQGCABKALoARAYIAEoAuwBEBggASgC8AEQGCABKAL0ARAYIAEoAvgBEBggASgC/AEQGCABKAKAAhAYIAEoAoQCEBggASgCiAIQGCABKAKYAhAYIAEoAqQCEBggASgCoAIQGCAAIAEoAgA2AhAgARAYC54BAQJ/QbgCEIgDIgEgACgCECICNgIAIAAgATYCECACBEAgAUEQaiACQRBqQSgQHxogAUE4aiACQThqQSgQHxogASACKAKYATYCmAEgASACKAKcATYCnAEgASACKwOgATkDoAEgASACKAKIATYCiAEgAUHgAGogAkHgAGpBKBAfGiABDwsgAUKAgICAgICA+D83A6ABIAFCAzcDmAEgAQvjAwIIfwJ+IwBBIGsiBiQAQaziCigCACEDAkACQAJAIAAoAgQiBUEDbEECayIHQajiCigCACIESwRAIARB/////wBPDQEgB0GAgICAAU8NAiADIAdBBHQiAhA5IgNFDQMgBEEEdCIEIAJJBEAgAyAEakEAIAIgBGsQMxoLQajiCiAHNgIAQaziCiADNgIACyADIAAoAgAiACkDADcDACADIAApAwg3AwggACkDACEKIAMgACkDCDcDGCADIAo3AxBBAiEEQQIgBSAFQQJNG0EBayEJQQEhBQNAIAUgCUZFBEAgAyAEQQR0aiICIAAgBUEEdGoiCCkDADcDACACIAgpAwg3AwggCCkDACEKIAIgCCkDCCILNwMYIAIgCjcDECACIAo3AyAgAiALNwMoIARBA2ohBCAFQQFqIQUMAQsLIAMgBEEEdGoiAiAAIAlBBHRqIgApAwA3AwAgAiAAKQMINwMIIAApAwAhCiACIAApAwg3AxggAiAKNwMQIAEgAzYCACABIAc2AgQgBkEgaiQADwtB28QDQemCAUHNAEH0tgEQAAALIAZBEDYCBCAGIAc2AgBBuPgIKAIAQYDvAyAGEB4aECcACyAGIAI2AhBBuPgIKAIAQc/uAyAGQRBqEB4aECcAC3gBBH8jAEEQayIGJAADQCAEKAIAIgcEQCAEKAIEIQggBEEIaiEEIAACfyAHIAIgA0EIQeEBEOkDIgkEQCABIAggCSgCBBEAACAAKAIgcgwBCyAGIAU2AgQgBiAHNgIAQdW8BCAGECtBAQs2AiAMAQsLIAZBEGokAAtEAQN/A0AgACgCACECIAAoAhAoAgghAyABIAAoAghPRQRAIAIgAUECdGooAgAgAxEBACABQQFqIQEMAQsLIAIgAxEBAAtLAQJ/QX8hAQJAIABBCHUiAkHYAWtBCEkNAAJAIAJB/wFHBEAgAg0BIABB6IQIai0AAA0BDAILIABBfnFB/v8DRg0BCyAAIQELIAEL0QEBAX8CQCAAQQBIDQAgAEH/AE0EQCABIAA6AABBAQ8LIABB/w9NBEAgASAAQT9xQYABcjoAASABIABBBnZBwAFyOgAAQQIPCyAAQf//A00EQCABIABBP3FBgAFyOgACIAEgAEEMdkHgAXI6AAAgASAAQQZ2QT9xQYABcjoAAUEDDwsgAEH//8MASw0AIAEgAEE/cUGAAXI6AAMgASAAQRJ2QfABcjoAACABIABBBnZBP3FBgAFyOgACIAEgAEEMdkE/cUGAAXI6AAFBBCECCyACC1oBAn8gACgCmAEhAQNAIAEEQCABKAIEIAEoAsgEEBggASgCzAQQGCABEBghAQwBCwtB2OEKQQA2AgBB3OEKQQA2AgAgAEEANgK4ASAAQgA3A5gBIABBADYCHAufDAIIfwh8IwBBMGsiBiQAAkAgAQRAIAErAxAhDiABKwMAIREgBiABKwMIIhUgASsDGCIToEQAAAAAAADgP6IiEjkDKCAGIBEgDqBEAAAAAAAA4D+iIhQ5AyAMAQsgBkIANwMoIAZCADcDICAAEC8hByAAKAIQIggrA1giDyAIKwNQRAAAAAAAAOA/oiIQIAcoAhAtAHRBAXEiBxshEyAQIA8gBxshDiAPmiIPIBCaIhAgBxshFSAQIA8gBxshEQsgAUEARyENIA4gExAiIRBBASELRAAAAAAAAAAAIQ8CQAJAIANFDQAgAy0AACIMRQ0AIBBEAAAAAAAAEECiIRBBACEIQQAhBwJAAn8CQAJAAkACQAJAAkACQAJAIAxB3wBrDgcEBwcHCwcBAAsgDEHzAGsOBQEGBgYCBAsgAy0AAQ0FAkAgBQRAIAZBIGogBSASIBAQ3gIMAQsgBiAOOQMgCyAEQQJxIQdBASEJDAcLIAYgFTkDKCADLQABIgNB9wBHBEAgA0HlAEcEQCADDQUgBQRAIAZBIGogBSAQmiAUEN4CC0EBIQkgBEEBcSEHRBgtRFT7Ifm/IQ8MCAsCQCAFBEAgBkEgaiAFIBCaIBAQ3gIMAQsgBiAOOQMgCyAEQQNxIQdBASEJRBgtRFT7Iem/IQ8MBwsCQCAFBEAgBkEgaiAFIBCaIg4gDhDeAgwBCyAGIBE5AyALIARBCXEhB0EBIQlE0iEzf3zZAsAhDwwGCyADLQABDQMCQCAFBEAgBkEgaiAFIBIgEJoQ3gIMAQsgBiAROQMgCyAEQQhxIQdBASEJRBgtRFT7IQlAIQ8MBQtBASEKIAQMAwsgDEHuAEcNASAGIBM5AyggAy0AASIDQfcARwRAIANB5QBHBEAgAw0CIAUEQCAGQSBqIAUgECAUEN4CCyAEQQRxIQdBASEJRBgtRFT7Ifk/IQ8MBQsCQCAFBEAgBkEgaiAFIBAgEBDeAgwBCyAGIA45AyALIARBBnEhB0EBIQlEGC1EVPsh6T8hDwwECwJAIAUEQCAGQSBqIAUgECAQmhDeAgwBCyAGIBE5AyALIARBDHEhB0EBIQlE0iEzf3zZAkAhDwwDCyAGIBI5AygLQQEhCEEACyEHDAILQQAhC0EBIQ0MAQtBACEIQQAhBwsgABAvKAIQKAJ0IQMgBiAGKQMoNwMIIAYgBikDIDcDACAGQRBqIAYgA0EDcUHaAGwQvwogBiAGKQMYNwMoIAYgBikDEDcDIAJAIAoNAAJAAkACQCAAEC8oAhAoAnRBA3FBAWsOAwEAAgMLAkACQCAHQQFrDgQBBAQABAtBASEHDAMLQQQhBwwCCyAHQQFrIgNB/wFxIgRBCE9BiwEgBHZBAXFFcg0BQoiCiJCgwICBBCADQQN0rUL4AYOIpyEHDAELIAdBAWsiA0H/AXEiBEEIT0GLASAEdkEBcUVyDQBCiIiIkKDAgIEBIANBA3StQvgBg4inIQcLIAIgATYCGCACIAc6ACEgAiAGKQMgNwMAIAIgBikDKDcDCCAPIQ4CQAJAAkACQCAAEC8oAhAoAnRBA3FBAWsOAwEAAgMLIA+aIQ4MAgsgD0QYLURU+yH5v6AhDgwBCyAPRBgtRFT7IQlAYQRARBgtRFT7Ifm/IQ4MAQsgD0TSITN/fNkCQGEEQEQYLURU+yHpvyEODAELRBgtRFT7Ifk/IQ4gD0QYLURU+yH5P2EEQEQAAAAAAAAAACEODAELIA9EAAAAAAAAAABhDQAgD0QYLURU+yHpv2EEQETSITN/fNkCQCEODAELIA8iDkQYLURU+yH5v2INAEQYLURU+yEJQCEOCyACIA45AxAgBisDKCEOAn8gBisDICIPRAAAAAAAAAAAYQRAQYABIA5EAAAAAAAAAABhDQEaCyAOIA8QqwFE0iEzf3zZEkCgIg5EGC1EVPshGcCgIA4gDkQYLURU+yEZQGYbRAAAAAAAAHBAokQYLURU+yEZQKMiDplEAAAAAAAA4EFjBEAgDqoMAQtBgICAgHgLIQEgAiAJOgAdIAIgAToAICACIAo6AB8gAiALOgAeIAIgDToAHCAGQTBqJAAgCAukAQEGfwJAIAAEQCABRQ0BIAEgAhDXBiEFIAAoAgAiBgRAQQEgACgCCHQhBAsgBEEBayEHA0ACQEEAIQAgAyAERg0AAkACQCAGIAMgBWogB3FBAnRqKAIAIghBAWoOAgECAAsgASACIAgiABDDCQ0BCyADQQFqIQMMAQsLIAAPC0GY1QFBx74BQeIBQa2pARAAAAtBsdUBQce+AUHjAUGtqQEQAAALGgEBfxDJAyEAQbfhCi0AAEGs4QooAgAgABsLVAEBfCAAKAIQIgAgAEEoQSAgARtqKwMARAAAAAAAAFJAokQAAAAAAADgP6IiAjkDWCAAIAI5A2AgACAAQSBBKCABG2orAwBEAAAAAAAAUkCiOQNQC9ABAQJ/IwBBIGsiASQAIAFCADcDECABQgA3AwgDQCABIABBAWo2AhwgAC0AACIABEACQAJAIABBJkcNACABQRxqEKMKIgANAEEmIQAMAQsgAEH+AE0NACAAQf4PTQRAIAFBCGogAEEGdkFAchCcASAAQT9xQYB/ciEADAELIAFBCGoiAiAAQQx2QWByEJwBIAIgAEEGdkE/cUGAf3IQnAEgAEE/cUGAf3IhAAsgAUEIaiAAwBCcASABKAIcIQAMAQsLIAFBCGoQlQMgAUEgaiQAC3cBAn8gASAAEEciAWoiAiABQQF0QYAIIAEbIgMgAiADSxshAiAAECQhAwJAIAAtAA9B/wFGBEAgACgCACABIAJBARCRASEBDAELIAJBARAZIgEgACADEB8aIAAgAzYCBAsgAEH/AToADyAAIAI2AgggACABNgIACzAAIAEQLyABIAJBAEEBEF4iAUHPKUG4AUEBEDUaIAAgARC1BSABKAIQQQE6AHEgAQunAgEHfyMAQRBrIgokAAJAIAAEQAJAIAAoAggiCCAAKAIMIgVHBEAgACgCACEGIAAoAgQhBwwBCyAIQQF0QQEgCBsiBUH/////A0sEQEHEACEADAMLIAAoAgAgBUECdBA5IgZFBEBBMCEADAMLIAYgACgCDCIJQQJ0akEAIAUgCWtBAnQQMxogCSAAKAIIIgggACgCBCIHakkEQCAHQQJ0IQsgBiAFIAkgB2siCWsiB0ECdGogBiALaiAJQQJ0EFIaIAAgBzYCBAsgACAFNgIMIAAgBjYCAAsgBiAHIAhqIAVwQQJ0aiABNgIAIAAgCEEBajYCCCAKQRBqJAAPC0H61AEgBCADIAIQAAALIAogABBzNgIAQbj4CCgCAEHhhQQgChAeGhAnAAtJAAJAIAAEQCABIAAoAghPDQEgACgCACAAKAIEIAFqIAAoAgxwQQJ0aigCAA8LQfrUASAEIAMgAhAAAAtBjbcDIAQgAyACEAAACwkAIABBBBDbCwsLACAEIAI2AgBBAws5AQJ/IwBBEGsiAyQAIANBDGoiBCABEFAgAiAEENUDIgEQyQE2AgAgACABEMgBIAQQTSADQRBqJAALNwECfyMAQRBrIgIkACACQQxqIgMgABBQIAMQywFB8LMJQYq0CSABEMICIAMQTSACQRBqJAAgAQs5AQJ/IwBBEGsiAyQAIANBDGoiBCABEFAgAiAEENcDIgEQyQE6AAAgACABEMgBIAQQTSADQRBqJAAL9wYBC38jAEEwayIGJAAgAS0AACIBQQRxIQsgAUEIcSEMIAFBAXEhCiABQQJxIQ0DQCAAIgctAAAiBARAIAghCSAEwCEIIAdBAWohAAJ/AkACQAJAAkACQAJAIARBPGsOAwEEAgALIARBLUYNAiAEQSZHDQMCQCAKDQAgAC0AACIFQTtGDQAgACEBAkAgBUEjRgRAIActAAJBIHJB+ABHBEAgB0ECaiEBA0AgASwAACEFIAFBAWohASAFQTBrQQpJDQALDAILIAdBA2ohAQNAAkAgAS0AACIFwEEwa0EKSQ0AIAVB/wFxIg5B4QBrQQZJDQAgDkHBAGtBBUsNAwsgAUEBaiEBDAALAAsDQCABLQAAIQUgAUEBaiEBIAVB3wFxwEHBAGtBGkkNAAsLIAVB/wFxQTtGDQQLIANB3OEBIAIRAAAMBQsgA0HS4QEgAhEAAAwECyADQdfhASACEQAADAMLIA1FDQEgA0Ht4QEgAhEAAAwCCyAJQf8BcUEgRyAIQSBHckUEQCALRQ0BIANB/+EBIAIRAAAMAgsCQAJAAkACQCAEQQprDgQBAwMCAAsgBEEnRwRAIARBIkcNAyADQcvhASACEQAADAULIANB5+EBIAIRAAAMBAsgCkUNAiADQYbiASACEQAADAMLIApFDQEgA0H54QEgAhEAAAwCCyAMRSAIQQBOcg0AAn9BAiAEQeABcUHAAUYNABpBAyAEQfABcUHgAUYNABogBEH4AXFB8AFGQQJ0CyIJRSEFQQEhAQNAIAVBAXEiBEUgASAJSXEEQCABIAdqLQAARSEFIAFBAWohAQwBBSAERQRAIAYCfwJAAkACQAJAIAlBAmsOAwMAAQILIActAAJBP3EgBy0AAUE/cUEGdHIgCEEPcUEMdHIMAwsgBy0AA0E/cSAHLQACQT9xQQZ0ciAHLQABQT9xQQx0ciAIQQdxQRJ0cgwCCyAGQaEBNgIEIAZBjcABNgIAQbj4CCgCAEHYwwQgBhAeGhBpAAsgAC0AAEE/cSAIQR9xQQZ0cgs2AhAgBkEjaiIBQQ1BxOEBIAZBEGoQoQEaIAAgCWpBAWshACADIAEgAhEAAAwECwsLQfznBEEtQQFBuPgIKAIAEFMaECcACyAGQQA6ACQgBiAIOgAjIAMgBkEjaiACEQAAC0EATg0BCwsgBkEwaiQAC6cBAQR/IwBBEGsiBSQAIAEQOyECIwBBEGsiAyQAAkAgAkH3////B00EQAJAIAIQqQUEQCAAIAIQ0wEgACEEDAELIANBCGogAhDaA0EBahDZAyADKAIMGiAAIAMoAggiBBD3ASAAIAMoAgwQ9gEgACACEL4BCyAEIAEgAhCnAiADQQA6AAcgAiAEaiADQQdqENIBIANBEGokAAwBCxDKAQALIAVBEGokAAuvBAEEfyMAQRBrIgQkAAJAAkAgAARAIAFFDQECQCABQcQ/EGMNACABQYLEARBjDQAgAUGaFxBjDQAgAUHzwwEQY0UNAwsgAS0AACECIARBtgM2AgACQCAAQcGEIEGAgCAgAkH3AEYbIAQQkgwiA0EASA0AIwBBIGsiAiQAAn8CQAJAQfPEASABLAAAEM0BRQRAQYCMC0EcNgIADAELQZgJEEgiAA0BC0EADAELIABBAEGQARAzGiABQSsQzQFFBEAgAEEIQQQgAS0AAEHyAEYbNgIACwJAIAEtAABB4QBHBEAgACgCACEBDAELIANBA0EAEAUiAUGACHFFBEAgAiABQYAIcqw3AxAgA0EEIAJBEGoQBRoLIAAgACgCAEGAAXIiATYCAAsgAEF/NgJQIABBgAg2AjAgACADNgI8IAAgAEGYAWo2AiwCQCABQQhxDQAgAiACQRhqrTcDACADQZOoASACEAkNACAAQQo2AlALIABB+gM2AiggAEH7AzYCJCAAQfwDNgIgIABB/QM2AgxBiYwLLQAARQRAIABBfzYCTAsgAEHgjQsoAgAiATYCOCABBEAgASAANgI0C0HgjQsgADYCACAACyEFIAJBIGokACAFDQBBgIwLKAIAIQAgAxC/B0GAjAsgADYCAEEAIQULIARBEGokACAFDwtBr9YBQdy/AUEhQb7pABAAAAtB2dYBQdy/AUEiQb7pABAAAAtBwa4DQdy/AUEkQb7pABAAAAvPAwIFfwF+IwBB0ABrIgMkAAJ/QQAgAkUNABogA0HIAGogAkE6ENQBIAAgAUECdGooAkAhBAJAIAMoAkwiByADKAJIai0AAEE6RgRAIAQhAUEBIQYDQCABBEAgA0FAayABKAIEQToQ1AFBACEFIAQhAgNAIAEgAkYEQAJAIAVBAXENACAHBEAgAyADKQJINwMwIAMgAykCQDcDKCADQTBqIANBKGoQogdFDQELIAEoAgQhACADIAEoAgwoAgg2AiQgAyAANgIgQcjgCkGBNyADQSBqEIwBQQAhBgsgASgCACEBDAMFQQAhACABKAIEIAIoAgQQLgR/QQEFIAEoAgwoAgggAigCDCgCCBAuC0UgBUEBcXIhBSACKAIAIQIMAQsACwALCyAGRQ0BCyADQgA3A0BBASEBQQAhAgNAIAQEQCADQThqIAQoAgRBOhDUAQJAIAIEQCADIAMpA0A3AxggAyADKQM4NwMQIANBGGogA0EQahCiBw0BCyADIAMpAzhCIIk3AwBByOAKQaU2IAMQjAFBACEBCyADIAMpAzgiCDcDQCAIpyECIAQoAgAhBAwBCwtB74YFIAFBAXENARoLQcjgChCmAgsgA0HQAGokAAsXACAAIAM2AhAgACACNgIMIAAgATYCCAsNACAAIAEgAkEBEMIHCxIAIAAgASACQv////8PELkFpwvSCgENfyABLAAAIgJFBEAgAA8LAkAgACACEM0BIgBFDQAgAS0AAUUEQCAADwsgAC0AAUUNACABLQACRQRAIAAtAAEiAkEARyEEAkAgAkUNACAALQAAQQh0IAJyIgIgAS0AASABLQAAQQh0ciIFRg0AIABBAWohAQNAIAEiAC0AASIDQQBHIQQgA0UNASAAQQFqIQEgAkEIdEGA/gNxIANyIgIgBUcNAAsLIABBACAEGw8LIAAtAAJFDQAgAS0AA0UEQCAAQQJqIQIgAC0AAiIEQQBHIQMCQAJAIARFDQAgAC0AAUEQdCAALQAAQRh0ciAEQQh0ciIEIAEtAAFBEHQgAS0AAEEYdHIgAS0AAkEIdHIiBUYNAANAIAJBAWohACACLQABIgFBAEchAyABRQ0CIAAhAiABIARyQQh0IgQgBUcNAAsMAQsgAiEACyAAQQJrQQAgAxsPCyAALQADRQ0AIAEtAARFBEAgAEEDaiECIAAtAAMiBEEARyEDAkACQCAERQ0AIAAtAAFBEHQgAC0AAEEYdHIgAC0AAkEIdHIgBHIiBCABKAAAIgBBGHQgAEGA/gNxQQh0ciAAQQh2QYD+A3EgAEEYdnJyIgVGDQADQCACQQFqIQAgAi0AASIBQQBHIQMgAUUNAiAAIQIgBEEIdCABciIEIAVHDQALDAELIAIhAAsgAEEDa0EAIAMbDwsgACEEQQAhAiMAQaAIayIIJAAgCEGYCGpCADcDACAIQZAIakIANwMAIAhCADcDiAggCEIANwOACAJAAkACQAJAIAEiBS0AACIBRQRAQX8hCUEBIQAMAQsDQCAEIAZqLQAARQ0EIAggAUH/AXFBAnRqIAZBAWoiBjYCACAIQYAIaiABQQN2QRxxaiIAIAAoAgBBASABdHI2AgAgBSAGai0AACIBDQALQQEhAEF/IQkgBkEBSw0BC0F/IQNBASEHDAELQQEhCkEBIQEDQAJ/IAUgCWogAWotAAAiAyAAIAVqLQAAIgdGBEAgASAKRgRAIAIgCmohAkEBDAILIAFBAWoMAQsgAyAHSwRAIAAgCWshCiAAIQJBAQwBCyACIglBAWohAkEBIQpBAQsiASACaiIAIAZJDQALQX8hA0EAIQBBASECQQEhB0EBIQEDQAJ/IAMgBWogAWotAAAiCyACIAVqLQAAIgxGBEAgASAHRgRAIAAgB2ohAEEBDAILIAFBAWoMAQsgCyAMSQRAIAIgA2shByACIQBBAQwBCyAAIgNBAWohAEEBIQdBAQsiASAAaiICIAZJDQALIAohAAsCfyAFIAUgByAAIANBAWogCUEBaksiABsiCmogAyAJIAAbIgtBAWoiBxDWAQRAIAsgBiALQX9zaiIAIAAgC0kbQQFqIQpBAAwBCyAGIAprCyENIAZBAWshDiAGQT9yIQxBACEDIAQhAANAAkAgBCAAayAGTw0AQQAhAiAEQQAgDBD2AiIBIAQgDGogARshBCABRQ0AIAEgAGsgBkkNAgsCfwJ/IAYgCEGACGogACAOai0AACIBQQN2QRxxaigCACABdkEBcUUNABogCCABQQJ0aigCACIBIAZHBEAgBiABayIBIAMgASADSxsMAQsCQCAFIAciASADIAEgA0sbIgJqLQAAIgkEQANAIAAgAmotAAAgCUH/AXFHDQIgBSACQQFqIgJqLQAAIgkNAAsLA0AgASADTQRAIAAhAgwGCyAFIAFBAWsiAWotAAAgACABai0AAEYNAAsgCiEBIA0MAgsgAiALawshAUEACyEDIAAgAWohAAwACwALIAhBoAhqJAAgAiEECyAEC8wBAQN/IwBBIGsiA0IANwMYIANCADcDECADQgA3AwggA0IANwMAIAEtAAAiAkUEQEEADwsgAS0AAUUEQCAAIQEDQCABIgNBAWohASADLQAAIAJGDQALIAMgAGsPCwNAIAMgAkEDdkEccWoiBCAEKAIAQQEgAnRyNgIAIAEtAAEhAiABQQFqIQEgAg0ACwJAIAAiAS0AACICRQ0AA0AgAyACQQN2QRxxaigCACACdkEBcUUNASABLQABIQIgAUEBaiEBIAINAAsLIAEgAGsLgAEBBH8gACAAQT0QuwUiAUYEQEEADwsCQCAAIAEgAGsiBGotAAANAEGEjAsoAgAiAUUNACABKAIAIgJFDQADQAJAIAAgAiAEEOgBRQRAIAEoAgAgBGoiAi0AAEE9Rg0BCyABKAIEIQIgAUEEaiEBIAINAQwCCwsgAkEBaiEDCyADC+ICAQV/AkACQAJAIAIoAkxBAE4EQCABQQJIDQEMAgtBASEGIAFBAUoNAQsgAiACKAJIIgJBAWsgAnI2AkggAUEBRw0BIABBADoAACAADwsgAUEBayEEIAAhAQJAA0ACQAJAAkAgAigCBCIDIAIoAggiBUYNAAJ/IANBCiAFIANrEPYCIgcEQCAHIAIoAgQiA2tBAWoMAQsgAigCCCACKAIEIgNrCyEFIAEgAyAFIAQgBCAFSxsiAxAfGiACIAIoAgQgA2oiBTYCBCABIANqIQEgBw0CIAQgA2siBEUNAiAFIAIoAghGDQAgAiAFQQFqNgIEIAUtAAAhAwwBCyACEMQFIgNBAE4NAEEAIQQgACABRg0DIAItAABBEHENAQwDCyABIAM6AAAgAUEBaiEBIANB/wFxQQpGDQAgBEEBayIEDQELCyAARQRAQQAhBAwBCyABQQA6AAAgACEECyAGDQALIAQLCQAgAL1CNIinC5kBAQN8IAAgAKIiAyADIAOioiADRHzVz1o62eU9okTrnCuK5uVavqCiIAMgA0R9/rFX4x3HPqJE1WHBGaABKr+gokSm+BARERGBP6CgIQUgACADoiEEIAJFBEAgBCADIAWiRElVVVVVVcW/oKIgAKAPCyAAIAMgAUQAAAAAAADgP6IgBCAFoqGiIAGhIARESVVVVVVVxT+ioKELkgEBA3xEAAAAAAAA8D8gACAAoiICRAAAAAAAAOA/oiIDoSIERAAAAAAAAPA/IAShIAOhIAIgAiACIAJEkBXLGaAB+j6iRHdRwRZswVa/oKJETFVVVVVVpT+goiACIAKiIgMgA6IgAiACRNQ4iL7p+qi9okTEsbS9nu4hPqCiRK1SnIBPfpK+oKKgoiAAIAGioaCgC40BACAAIAAgACAAIAAgAEQJ9/0N4T0CP6JEiLIBdeDvST+gokQ7j2i1KIKkv6CiRFVEiA5Vwck/oKJEfW/rAxLW1L+gokRVVVVVVVXFP6CiIAAgACAAIABEgpIuscW4sz+iRFkBjRtsBua/oKJEyIpZnOUqAECgokRLLYocJzoDwKCiRAAAAAAAAPA/oKMLTgEBf0EBQRwQGSIGIAU6ABQgBiAAIAEQsQE2AggCfyADBEAgACACEM4CDAELIAAgAhCxAQshBSAGIAA2AhggBiAENgIQIAYgBTYCDCAGC0wAAkAgAARAIAEgACgCCE8NASAAKAIAIAAoAgQgAWogACgCDHBBAnRqDwtB+tQBQfr/AEEVQeIoEAAAC0GNtwNB+v8AQRVB4igQAAALagIBfwJ8IwBBIGsiAyQAAkAgACACECYiAEUNACADIANBEGo2AgQgAyADQRhqNgIAIABB84kBIAMQTkECRw0AIAMrAxghBCADKwMQIQUgAUEBOgBRIAEgBTkDQCABIAQ5AzgLIANBIGokAAtEAQF/IABB3ClBwAJBARA1GiAAEIQFIAAQLygCEC8BsAFBCBAZIQEgACgCECABNgKUASAAIAAQLygCECgCdEEBcRCXBAtbAQF/IAAoAgQiAyABSwRAIANBIU8EfyAAKAIABSAACyABQQN2aiIAIAAtAAAiAEEBIAFBB3EiAXRyIABBfiABd3EgAhs6AAAPC0G7tQNBx/8AQdAAQYoiEAAAC7gDAQl8AkACQEEBQX9BACAAKwMIIgggASsDCCIJoSIFIAIrAwAiCyABKwMAIgShoiACKwMIIgogCaEgACsDACIGIAShIgyioSIHRC1DHOviNhq/YxsgB0QtQxzr4jYaP2QbIgANACAEIAZiBEBBASEBIAYgC2MgBCALZHENAiAEIAtjRSAGIAtkRXINAQwCC0EBIQEgCCAKYyAJIApkcQ0BIAggCmRFDQAgCSAKYw0BCwJAQQFBf0EAIAUgAysDACIFIAShoiADKwMIIgcgCaEgDJqioCIMRC1DHOviNhq/YxsgDEQtQxzr4jYaP2QbIgINACAEIAZiBEBBASEBIAUgBmQgBCAFZHENAiAEIAVjRSAFIAZjRXINAQwCC0EBIQEgByAJYyAHIAhkcQ0BIAcgCGNFDQAgByAJZA0BCyAAIAJsQQFBf0EAIAogB6EiCiAGIAWhoiAIIAehIAsgBaEiBqKhIghELUMc6+I2Gr9jGyAIRC1DHOviNho/ZBtBAUF/QQAgCiAEIAWhoiAJIAehIAaioSIERC1DHOviNhq/YxsgBEQtQxzr4jYaP2QbbHFBH3YhAQsgAQvmAQIFfwJ8IwBBMGsiAiQAIAAoAgQiBEEBayEGIAAoAgAhBQNAIAQgAyIARwRAIAIgBSAAIAZqIARwQQR0aiIDKQMINwMoIAIgAykDADcDICACIAUgAEEEdGoiAykDCDcDGCACIAMpAwA3AxAgAiABKQMINwMIIAIgASkDADcDACAAQQFqIQNBAUF/QQAgAisDKCACKwMYIgehIAIrAwAgAisDECIIoaIgAisDCCAHoSACKwMgIAihoqEiB0QtQxzr4jYav2MbIAdELUMc6+I2Gj9kG0EBRw0BCwsgAkEwaiQAIAAgBE8LDwAgACAAQbvgABAmEJINCzABAX9BoIILEPEHIgJBADYCICACIAE6ABAgAiAANgIIIAJBADYCFCACQQA2AgwgAguPBgIPfwF9IwBBEGsiCSQAIAJBACACQQBKGyELIAIQvwEhBwNAIAQgC0YEQCADIABBAnRqQQA2AgBBASABIABBFGxqIgooAgAiBCAEQQFNGyEFQQEhBANAIAQgBUYEQEEAIQRBACEFIAJBAUcEQCACQQFrIggQvwEhBQsgCSAINgIMIAkgBTYCCEEAIQYDQCAEIAtGRQRAIAAgBEcEQCAFIAZBAnRqIAQ2AgAgByAEQQJ0aiAGNgIAIAZBAWohBgsgBEEBaiEEDAELCyAIQQJtIQQDQCAEQQBIBEAgBUEEayEOQf////8HIQADQAJAIAhFDQAgBSgCACEEIAUgDiAIQQJ0aigCACICNgIAIAcgAkECdGpBADYCACAJIAhBAWsiCDYCDCAJQQhqQQAgByADELUNIAMgBEECdGooAgAiCkH/////B0YNAEEBIQJBASABIARBFGxqIg0oAgAiACAAQQFNGyEPA0AgAiAPRgRAIAohAAwDCwJ/IAJBAnQiACANKAIIaioCACITi0MAAABPXQRAIBOoDAELQYCAgIB4CyAKaiIGIAMgDSgCBCAAaigCACIQQQJ0IgBqIgwoAgBIBEAgACAHaiIRKAIAIQQgDCAGNgIAA0ACQCAEQQBMDQAgAyAFIARBAXYiAEECdGooAgAiDEECdCISaigCACAGTA0AIAUgBEECdGogDDYCACAHIBJqIAQ2AgAgACEEDAELCyAFIARBAnRqIBA2AgAgESAENgIACyACQQFqIQIMAAsACwsgAEEKaiEAQQAhBANAIAQgC0cEQCADIARBAnRqIgEoAgBB/////wdGBEAgASAANgIACyAEQQFqIQQMAQsLIAUQGCAHEBggCUEQaiQABSAJQQhqIAQgByADELUNIARBAWshBAwBCwsFIAMgBEECdCIGIAooAgRqKAIAQQJ0agJ/IAooAgggBmoqAgAiE4tDAAAAT10EQCATqAwBC0GAgICAeAs2AgAgBEEBaiEEDAELCwUgAyAEQQJ0akH/////BzYCACAEQQFqIQQMAQsLC/sDAwl/AX0CfCADQQQQGSEFIANBBBAZIQYgA0EEEBkhCCADQQQQGSEKIAMgARD+AiADIAIQ/gIgACADIAEgChD9AiADIAoQ/gIgA0EAIANBAEobIQkDQCAHIAlHBEAgBSAHQQJ0IgtqIAIgC2oqAgAgCiALaioCAJM4AgAgB0EBaiEHDAELCyADIAUgBhC5DSAEQQAgBEEAShshByAEQQFrIQsgAyAFIAUQyAIhD0EAIQIDQAJAAkACQCACIAdGDQBBACEEIANBACADQQBKGyEJQ8rySfEhDgNAIAQgCUcEQCAOIAUgBEECdGoqAgCLEMMFIQ4gBEEBaiEEDAELCyAOu0T8qfHSTWJQP2RFDQAgAyAGEP4CIAMgARD+AiADIAUQ/gIgACADIAYgCBD9AiADIAgQ/gIgAyAGIAgQyAIiEEQAAAAAAAAAAGENACADIAEgDyAQo7YiDiAGEOAFIAIgC04NAiADIAUgDowgCBDgBSADIAUgBRDIAiEQIA9EAAAAAAAAAABiDQFB84cEQQAQNkEBIQwLIAUQGCAGEBggCBAYIAoQGCAMDwsgECAPo7YhDkEAIQQDfCADIARGBHwgEAUgBiAEQQJ0IglqIg0gDiANKgIAlCAFIAlqKgIAkjgCACAEQQFqIQQMAQsLIQ8LIAJBAWohAgwACwALPgICfwF9IABBACAAQQBKGyEAA0AgACACRkUEQCABIAJBAnRqIgMgAyoCACIEIASUOAIAIAJBAWohAgwBCwsLOwAgAUEBaiEBA0AgAQRAIAAgAiADKwMAoiAAKwMAoDkDACABQQFrIQEgAEEIaiEAIANBCGohAwwBCwsLFgBBfyAAQQJ0IABB/////wNLGxCKAQsbACAABEAgACgCABC/BCAAKAIEEL8EIAAQGAsLWQECfyAAIAAoAgAiAigCBCIBNgIAIAEEQCABIAA2AggLIAIgACgCCCIBNgIIAkAgASgCACAARgRAIAEgAjYCAAwBCyABIAI2AgQLIAIgADYCBCAAIAI2AggLWQECfyAAIAAoAgQiAigCACIBNgIEIAEEQCABIAA2AggLIAIgACgCCCIBNgIIAkAgASgCACAARgRAIAEgAjYCAAwBCyABIAI2AgQLIAIgADYCACAAIAI2AggLNQEBf0EIEMwDEJIFIgBByO4JNgIAIABBBGpBvTkQhwcgAEGM7wk2AgAgAEGY7wlBzwMQAQALtAIBDH8gACgCACAAKAIEEI4IRQRAQYKmA0Hm3ABBwABB9+gAEAAACyAAKAIAIQQgACgCBCEFIwBBEGsiByQAIAdBvwM2AgwgBSAEa0ECdSIIQQJOBEACQCAHQQxqIQkgBCgCACEKIAQhASAIQQJrQQJtIQsDQCACQQF0IgxBAXIhBiACQQJ0IAFqQQRqIQMCQCAIIAxBAmoiAkwEQCAGIQIMAQsgAiAGIAMoAgAgAygCBCAJKAIAEQAAIgYbIQIgA0EEaiADIAYbIQMLIAEgAygCADYCACADIQEgAiALTA0ACyAFQQRrIgUgAUYEQCABIAo2AgAMAQsgASAFKAIANgIAIAUgCjYCACAEIAFBBGoiASAJIAEgBGtBAnUQ6A0LCyAHQRBqJAAgACAAKAIEQQRrNgIEC48CAQR/IAAoAiBBAUYEQCAAKAIMIgQgACgCCCIFQQFqTARAIAAgACgCFCAEIAVBC2oiBEEEEJEBNgIUIAAgACgCGCAAKAIMIARBBBCRATYCGCAAKAIoIgYEQCAAAn8gACgCHCIHBEAgByAAKAIMIAQgBhCRAQwBCyAEIAYQSgs2AhwLIAAgBDYCDAsgBUECdCIEIAAoAhRqIAE2AgAgACgCGCAEaiACNgIAIAAoAigiBARAIAAoAhwgBCAFbGogAyAEEB8aCyAAKAIAIAFMBEAgACABQQFqNgIACyAAKAIEIAJMBEAgACACQQFqNgIECyAAIAAoAghBAWo2AggPC0Gt3QFByrsBQf8JQbsMEAAAC9oBAQJ/IABFBEBBAA8LIAAoAgAgACgCBCAAKAIIIAAoAhAgACgCKCAAKAIgEP4NIgEoAhQgACgCFCAAKAIAQQJ0QQRqEB8aIAAoAhQgACgCAEECdGooAgAiAgRAIAEoAhggACgCGCACQQJ0EB8aCyAAKAIcIgIEQCABKAIcIAIgACgCCCAAKAIobBAfGgsgASABLQAkQX5xIAAtACRBAXFyIgI6ACQgASACQX1xIAAtACRBAnFyIgI6ACQgASACQfsBcSAALQAkQQRxcjoAJCABIAAoAgg2AgggAQuZAgEDfyABKAIQIgQoArABRQRAIAFBMEEAIAEoAgBBA3EiBUEDRxtqKAIoKAIQKAL0ASIGIAFBUEEAIAVBAkcbaigCKCgCECgC9AEiBSAFIAZIGyEGIAQgAjYCsAEDQCABKAIQIQUCQCADRQRAIAIoAhAhBAwBCyACKAIQIgQgBC8BqAEgBS8BqAFqOwGoAQsgBCAELwGaASAFLwGaAWo7AZoBIAQgBCgCnAEgBSgCnAFqNgKcASAGIAIgAkEwayIEIAIoAgBBA3FBAkYbKAIoIgUoAhAoAvQBRwRAIAAgBRCoDiACIAQgAigCAEEDcUECRhsoAigoAhAoAsgBKAIAIgINAQsLDwtBoNQBQb3DAUGIAUHr6AAQAAALbQECfwJAIAAoAhAiAC0AVCIDIAEoAhAiAS0AVEcNAAJAIAArAzggASsDOGEEQCAAKwNAIAErA0BhDQELIAMNAQsgACsDECABKwMQYQRAQQEhAiAAKwMYIAErAxhhDQELIAAtACxBAXMhAgsgAgsVACAAIAEgAkHRJEHHAEGVvgEQ1QoLLwACf0EAIAAoAhAiAC0ArAFBAUcNABpBASAAKALEAUEBSw0AGiAAKALMAUEBSwsLnBICD38GfgJAAkAgAQRAIAJFDQEgAigCACIGQT9MBEAgAkEIaiEIQQAhAwJAA0AgA0HAAEYNASADQShsIANBAWohAyAIaiIAKAIgDQALIAAgAUEoEB8aIAIgBkEBajYCAEEADwtB1t0BQeLCAUGgAUG9/wAQAAALIANFDQIgACEGIwBB8AdrIgQkAAJAIAIEQCABBEAgBkEIaiEJIAJBCGohByACKAIEIRACQANAAkAgBUHAAEYEQCAGQYgUaiABQSgQHxogBkHIFGogCSkDGDcDACAGQcAUaiAJKQMQNwMAIAZBuBRqIAkpAwg3AwAgBiAJKQMANwOwFCAGQbAUaiEBQQEhBwNAIAdBwQBGDQIgBCABKQMINwOIAyAEIAEpAxA3A5ADIAQgASkDGDcDmAMgBCABKQMANwOAAyAEIAkgB0EobGoiACkDCDcD6AIgBCAAKQMQNwPwAiAEIAApAxg3A/gCIAQgACkDADcD4AIgBEHgA2ogBEGAA2ogBEHgAmoQhgMgASAEKQP4AzcDGCABIAQpA/ADNwMQIAEgBCkD6AM3AwggASAEKQPgAzcDACAHQQFqIQcMAAsACyAHIAVBKGwiCGoiACgCIEUNAiAIIAlqIABBKBAfGiAFQQFqIQUMAQsLIAQgASkDGDcD2AIgBCABKQMQNwPQAiAEIAEpAwg3A8gCIAQgASkDADcDwAIgBiAEQcACahCHAzcD0BQgAhDhDiAGQgA3A+AYIARCADcD6AMgBEKAgICAgICA+L9/NwPwAyAEQoCAgICAgID4PzcD4AMgBEIANwP4AyAGQaAZaiIIIAQpA/gDNwMAIAZBmBlqIgEgBCkD8AM3AwAgBkGQGWoiACAEKQPoAzcDACAGIAQpA+ADNwOIGSAGQgA3A6gZIAZBsBlqQgA3AwAgBkGAGWogCCkDADcDACAGQfgYaiABKQMANwMAIAZB8BhqIAApAwA3AwAgBiAGKQOIGTcD6BggBkHcFmohDyAGQYgZaiELIAZB6BhqIQwgBkHgGGohESAGQdgUaiESQQAhBQNAIAVBwQBHBEAgDyAFQQJ0IgBqQQA2AgAgACASakF/NgIAIAVBAWohBQwBCwtBACEFAkACQAJAA0AgBUHBAEYEQAJAQQAhAEEAIQgDQCAAQcAARwRAIAkgAEEobGohDSAEQeADaiAAQQN0aiEHIABBAWoiASEFA0AgBUHBAEYEQCABIQAMAwUgBCANKQMINwOIAiAEIA0pAxA3A5ACIAQgDSkDGDcDmAIgBCANKQMANwOAAiAEIAkgBUEobGoiCikDCDcD6AEgBCAKKQMQNwPwASAEIAopAxg3A/gBIAQgCikDADcD4AEgBEHAA2ogBEGAAmogBEHgAWoQhgMgBCAEKQPYAzcD2AEgBCAEKQPQAzcD0AEgBCAEKQPIAzcDyAEgBCAEKQPAAzcDwAEgBEHAAWoQhwMgBykDACAEQeADaiAFQQN0aikDAHx9IhMgFCATIBRWIgobIRQgACAIIAobIQggBSAOIAobIQ4gBUEBaiEFDAELAAsACwtBACEAIAYgCEEAEIAGIAYgDkEBEIAGQQAhCANAAkAgBigC5BgiByAGKALgGCIFaiEBIAVBwABKIAdBwABKciABQcAASnINAEIAIRRBACEHQQAhBQNAIAVBwQBGBEAgBiAIIAAQgAYMAwUgDyAFQQJ0aigCAEUEQCAEIAkgBUEobGoiASkDGDcD+AMgBCABKQMQNwPwAyAEIAEpAwg3A+gDIAQgASkDADcD4AMgBCABKQMINwOoASAEIAEpAxA3A7ABIAQgASkDGDcDuAEgBCABKQMANwOgASAEIAwpAwg3A4gBIAQgDCkDEDcDkAEgBCAMKQMYNwOYASAEIAwpAwA3A4ABIARBwANqIARBoAFqIARBgAFqEIYDIAQgBCkD2AM3A3ggBCAEKQPQAzcDcCAEIAQpA8gDNwNoIAQgBCkDwAM3A2AgBEHgAGoQhwMhFiAGKQOoGSEXIAQgBCkD6AM3A0ggBCAEKQPwAzcDUCAEIAQpA/gDNwNYIAQgBCkD4AM3A0AgBCALKQMINwMoIAQgCykDEDcDMCAEIAspAxg3AzggBCALKQMANwMgIARBoANqIARBQGsgBEEgahCGAyAEIAQpA7gDIhg3A9gDIAQgBCkDsAMiFTcD0AMgBCAEKQOoAyITNwPIAyAEIBM3AwggBCAVNwMQIAQgGDcDGCAEIAQpA6ADIhM3A8ADIAQgEzcDACAEEIcDIAYpA7AZfSIVIBYgF30iE1QhAQJAIBUgE30gEyAVfSATIBVUGyITIBRYIAdxRQRAIAEhACATIRQgBSEIDAELIBMgFFINACAFIAggESABQQJ0aigCACARIABBAnRqKAIASCIHGyEIIAEgACAHGyEAC0EBIQcLIAVBAWohBQwBCwALAAsLIAFBwABMBEAgBUHAAEohAEEAIQUDQCAFQcEARwRAIA8gBUECdGooAgBFBEAgBiAFIAAQgAYLIAVBAWohBQwBCwsgBigC5BghByAGKALgGCEFCyAFIAdqQcEARw0AIAUgB3JBAEgNAyADEKwIIgE2AgAgAiAQNgIEIAEgEDYCBEEAIQUDQCAFQcEARwRAIBIgBUECdGooAgAiAEECTw0GIAYgCSAFQShsaiABIAIgABtBABDKBBogBUEBaiEFDAELCyADKAIAKAIAIAIoAgBqQcEARw0FIARB8AdqJAAMCQsFIAQgCSAFQShsaiIAKQMYNwO4AiAEIAApAxA3A7ACIAQgACkDCDcDqAIgBCAAKQMANwOgAiAEQeADaiAFQQN0aiAEQaACahCHAzcDACAFQQFqIQUMAQsLQZePA0H2vgFBtAFB3uEAEAAAC0HGmQNB9r4BQbYBQd7hABAAAAtBrY0DQfa+AUGGAkGGNRAAAAtB744DQfa+AUHGAEGxpAEQAAALQfarAUH2vgFB3QBB2zMQAAALQfHEAUH2vgFBJUGxpAEQAAALQajvAEH2vgFBJEGxpAEQAAALQQEPC0HxxAFB4sIBQZQBQb3/ABAAAAtBqO8AQeLCAUGVAUG9/wAQAAALQfIWQeLCAUGjAUG9/wAQAAALtQgCEn8CfiMAQSBrIgckAAJAIAAEQEGwgAsoAgAiDygCECIEKALoASEKA0ACQCAEKALsASAKSgRAIApByABsIhAgBCgCxAFqIgEtADFBAUYEQCABKQM4IRMMAgsgASgCBCEOIAAQ/g5CACETQQAhBUEAIQgDQCAPKAIQIgQoAsQBIBBqIgIoAgAiAyAITARAQQAhASADQQAgA0EAShshBQNAIAEgBUYEQAJAQQAhASACKAJIIgVBACAFQQBKGyEFA0AgASAFRg0BIAIoAkwgAUECdGooAgAoAhAiAy0AoQFBAUYEQCAHIAMpAsABNwMQIBMgB0EQakF/EPQOrHwhEwsgAUEBaiEBDAALAAsFIAIoAgQgAUECdGooAgAoAhAiAy0AoQFBAUYEQCAHIAMpAsgBNwMYIBMgB0EYakEBEPQOrHwhEwsgAUEBaiEBDAELCyACQQE6ADEgAiATNwM4DAMLAkAgBUEATA0AIA4gCEECdGohA0EAIQQDQCADKAIAKAIQKALIASAEQQJ0aigCACICRQ0BIAUgAkFQQQAgAigCAEEDcUECRxtqKAIoKAIQKAL4ASIBIAEgBUgbIQYDQCABIAZHBEAgAUEBaiIBIAAoAghJBH4gACABEIQGIAIoAhAuAZoBbKwFQgALIBN8IRMMAQsLIARBAWohBAwACwALIA4gCEECdGohEUEAIQsCQANAIBEoAgAoAhAoAsgBIAtBAnRqKAIAIgwEQAJAIAAoAggiASAMQVBBACAMKAIAQQNxQQJHG2ooAigoAhAoAvgBIgJLDQAgAkEBaiINIAFLBEADQCABIA1PDQICQCAAKAIMIgMgAUcEQCAAKAIAIQYgACgCBCEEDAELIAFBAXRBASABGyIDQf////8DSwRAQcQAIQAMDQsgACgCACADQQJ0EDkiBkUEQEEwIQAMDQsgBiAAKAIMIglBAnRqQQAgAyAJa0ECdBAzGiAJIAAoAggiASAAKAIEIgRqSQRAIARBAnQhEiAGIAMgCSAEayIJayIEQQJ0aiAGIBJqIAlBAnQQUhogACAENgIECyAAIAM2AgwgACAGNgIACyAGIAEgBGogA3BBAnRqQQA2AgAgACABQQFqIgE2AggMAAsACyABIA1NDQADQCABIA1NDQEgACABQQFrEIQGGiAAIAAoAghBAWsiATYCCAwACwALIAAgAhCEBiEBIAIgACgCCE8NAiACIAUgAiAFShshBSAAKAIAIAAoAgQgAmogACgCDHBBAnRqIAEgDCgCEC4BmgFqNgIAIAtBAWohCwwBCwsgCEEBaiEIDAELC0GkuANBgIEBQRVBvSIQAAALIAdBIGokACAUDwsgCkEBaiEKIBMgFHwhFAwACwALQfXVAUHJvQFB1QxBuCwQAAALIAcgABBzNgIAQbj4CCgCAEHhhQQgBxAeGhAnAAuDAQECfyAAIAFBARCOASIBKAIQQQA2AsQBQQUQuwghAiABKAIQIgNBADYCzAEgAyACNgLAAUEFELsIIQIgASgCECIDIAI2AsgBQaSACygCACICIAAgAhsoAhBBuAFBwAEgAhtqIAE2AgAgAyACNgK8AUGkgAsgATYCACADQQA2ArgBIAELuQEBA38gACAAQTBqIgIgACgCAEEDcUEDRhsoAigoAhAiASgC4AEgASgC5AEiAUEBaiABQQJqEM8BIQEgACACIAAoAgBBA3FBA0YbKAIoKAIQIAE2AuABIAAgAiAAKAIAQQNxQQNGGygCKCgCECIBIAEoAuQBIgNBAWo2AuQBIAEoAuABIANBAnRqIAA2AgAgACACIAAoAgBBA3FBA0YbKAIoKAIQIgAoAuABIAAoAuQBQQJ0akEANgIACyAAIAAgASACIABB9owBECYiAAR/IAAQjAIFQR4LEKsPC0wAIAEoAhBBwAFqIQEDQCABKAIAIgEEQCABKAIQKAKYAhAYIAEoAhAoAqACEBggASgCECIBQQA2ArABIAFBuAFqIQEMAQsLIAAQow8LPwECfyAAKAIQKAKoAiEAA0AgACIBKAIMIgBFIAAgAUZyRQRAIAAoAgwiAkUNASABIAI2AgwgAiEADAELCyABCwsAIAAgAUEBELQPCwsAIAAgAUEAELQPCzwAQez/CigCACAATQRAQY23A0G/vAFBMEGnKRAAAAtB5P8KKAIAQej/CigCACAAakHw/wooAgBwQShsagu6AgEHfyMAQRBrIgckAAJAAkAgACgCCCIGIAAoAgwiAkcEQCAAKAIAIQMgACgCBCEEDAELIAZBAXRBASAGGyICQf///z9LBEBBxAAhAAwCCyAAKAIAIAJBBXQQOSIDRQRAQTAhAAwCCyADIAAoAgwiBUEFdGpBACACIAVrQQV0EDMaIAUgACgCCCIGIAAoAgQiBGpJBEAgBEEFdCEIIAMgAiAFIARrIgVrIgRBBXRqIAMgCGogBUEFdBBSGiAAIAQ2AgQLIAAgAjYCDCAAIAM2AgALIAMgBCAGaiACcEEFdGoiAiABKQMANwMAIAIgASkDGDcDGCACIAEpAxA3AxAgAiABKQMINwMIIAAgACgCCEEBajYCCCAHQRBqJAAPCyAHIAAQczYCAEG4+AgoAgBB4YUEIAcQHhoQJwALXAAgASgCCCACTQRAQY23A0HKgAFBCEGIJRAAAAsgACABKAIAIAEoAgQgAmogASgCDHBBBXRqIgEpAwA3AwAgACABKQMYNwMYIAAgASkDEDcDECAAIAEpAwg3AwgL2gIBBXwgASAAQThsaiIAKwAQIQMCfCAAKwAYIgQgACsACCIFREivvJry13o+oGRFIAArAAAiBiADY0UgBCAFREivvJry13q+oGNycUUEQCAEIAIrAwgiB6GZREivvJry13o+ZQRARAAAAAAAAPA/RAAAAAAAAPC/IAIrAwAgA2MbDAILIAUgB6GZREivvJry13o+ZQRARAAAAAAAAPA/RAAAAAAAAPC/IAIrAwAgBmMbDAILIAMgBqEgByAFoaIgBCAFoSACKwAAIAahoqEMAQsgBCACKwMIIgehmURIr7ya8td6PmUEQEQAAAAAAADwP0QAAAAAAADwvyACKwMAIANjGwwBCyAFIAehmURIr7ya8td6PmUEQEQAAAAAAADwP0QAAAAAAADwvyACKwMAIAZjGwwBCyAGIAOhIAcgBKGiIAUgBKEgAisAACADoaKhC0QAAAAAAAAAAGQLhgEBAn8CQCAAIAEpAwgQvANFDQAgABA3IABGBEAgACABEG8hAgNAIAIEQCAAIAIgARB0IAAgAhCgBiECDAELCyAALQAYQSBxBEAgARCNDAsgACABEPUHIAEQ2AcgAEEBIAEpAwgQ2AYLIAAgAUESQQBBABDFAw0AIAAQNyAARgRAIAEQGAsLC4MBAQN/IwBBIGsiASQAIAAoAhAiAigCDCIDQQxPBEAgAUHkADYCFCABQbTAATYCEEG4+AgoAgBB2MMEIAFBEGoQHhoQaQALIAEgAigCCDYCCCABIANBAnQiAkHYxwhqKAIANgIEIAEgAkGIyAhqKAIANgIAIABBkAggARAdIAFBIGokAAspAQF/QfDDASEBIAAgAC0AkAFBAUYEfyAAKAKMASgCAAVB8MMBCxAaGgt0AQJ/IwBBIGsiAiQAAkAgAK0gAa1+QiCIUARAIAAgARBDIgNFDQEgAkEgaiQAIAMPCyACIAE2AgQgAiAANgIAQbj4CCgCAEGA7wMgAhAeGhAnAAsgAiAAIAFsNgIQQbj4CCgCAEHP7gMgAkEQahAeGhAnAAv8AgEDfyMAQUBqIgMkAAJAIAGZRPyp8dJNYkA/YwRAIABBruMBEBoaDAELIAFEAAAAAAAA8L+gmUT8qfHSTWJAP2MEQCAAQYrjARAaGgwBCyADIAE5AzAgAEHi4gEgA0EwahAdCyACKAIAIQQCQAJAAkACQAJAIAIoAiAiAkEBaw4EAQICAAILIARByccIEEkNAiAAQbDHCBAaGgwDCyADIARB/wFxNgIgIAMgBEEQdkH/AXE2AiggAyAEQQh2Qf8BcTYCJCAAQckTIANBIGoQHQwCCyADQaABNgIEIANB+MABNgIAQbj4CCgCAEHYwwQgAxAeGhBpAAsgACAEEBoaCyAAQYziARAaGgJAAkAgAkEBRw0AIARBGHYiBUH/AUYNACADIAW4RAAAAAAA4G9AozkDECAAQdSMASADQRBqEB0MAQsCQCACQQRHDQAgBEHJxwgQSQ0AIABBxJ4DEBoaDAELIABBz58DEBoaCyAAQdTZBBAaGiADQUBrJAAL2AMBAn8jAEGQAWsiAyQAIAAoAhAhBCAAQc/IAxAaGgJAAkACQAJAAkAgAQ4EAwIAAQILIABB4LADEBoaIAQoAtwBIgEEQCAAIAEQiwEgAEHfABBmCyADIAI2AnAgAEHoqgMgA0HwAGoQHQwDCyAAQeCwAxAaGiAEKALcASIBBEAgACABEIsBIABB3wAQZgsgAyACNgKAASAAQeKqAyADQYABahAdDAILIANByABqIgEgBEE4akEoEB8aIAAgARDhCCAEKAJYQQFHDQEgBC0AOyIBRSABQf8BRnINASADIAG4RAAAAAAA4G9AozkDQCAAQaGMASADQUBrEB0MAQsgAEG8xwgQGhoLIABBtckDEBoaIANBGGoiASAEQRBqQSgQHxogACABEOEIIAQrA6ABRAAAAAAAAPC/oJlEexSuR+F6dD9jRQRAIABB18gDEBoaIAAgBCsDoAEQfAtBwccIIQECQAJAAkAgBCgCmAFBAWsOAgEAAgtBxccIIQELIAMgATYCECAAQbI3IANBEGoQHQsCQCAEKAIwQQFHDQAgBC0AEyIBRSABQf8BRnINACADIAG4RAAAAAAA4G9AozkDACAAQbSMASADEB0LIABBIhBmIANBkAFqJAALJQAgACABKAIAEOYBIAAgAkEBIAAoAgARBAAaIAEgABDWAjYCAAsTACAAQbfPAyAAKAIQQRBqEOkIC3MBAX8gABAkIAAQR08EQCAAQQEQ+QMLIAAQJCECAkAgABAoBEAgACACaiABOgAAIAAgAC0AD0EBajoADyAAECRBEEkNAUG4uwNBmoIBQZ0CQZm2ARAAAAsgACgCACACaiABOgAAIAAgACgCBEEBajYCBAsLOQAgACABKAIAEOYBIAAgAkECIAAoAgARBABFBEBBixRBtsIBQaABQfDzABAAAAsgASAAENYCNgIACy8BAX8gAMAiAUEASCABQV9xQcEAa0EaSSABQTBrQQpJciAAQS1rQf8BcUECSXJyC8sBAQV/IAAoAgAiAkEDIAFBABDdAxogAigCYCIBBEAgACABKAIQIgMoAgwiBTYCTCAAIAMoAhAiBDYCVCAAIAMoAgAiAzYCUCAAIAEoAgQ2AlggACAAKAKYASAEKAIAciIENgKYASACKAJUIgEEQCAAIAEoAhAiAigCDDYCPCAAIAIoAhAiBjYCRCAAIAEoAgQ2AkggACAGKAIAIARyNgKYASAFBEAgACACKAIANgJAQawCDwsgACADNgJAQawCDwsgAEEA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IgFFDQEgAiABELoIGgwACwALIAILSwEDfyAAKAIQIgIgAigCtAEiBEEBaiIDNgK0ASACKAK4ASADIARBAmoQzwEhAiAAKAIQIAI2ArgBIAIgA0ECdGogATYCACABEPsEC4YDAQN/IAEgAUEwaiIDIAEoAgBBA3FBA0YbKAIoKAIQIgIoAtABIAIoAtQBIgJBAWogAkECahDPASECIAEgAyABKAIAQQNxQQNGGygCKCgCECACNgLQASABIAMgASgCAEEDcUEDRhsoAigoAhAiAiACKALUASIEQQFqNgLUASACKALQASAEQQJ0aiABNgIAIAEgAyABKAIAQQNxQQNGGygCKCgCECIDKALQASADKALUAUECdGpBADYCACABIAFBMGsiAyABKAIAQQNxQQJGGygCKCgCECICKALYASACKALcASICQQFqIAJBAmoQzwEhAiABIAMgASgCAEEDcUECRhsoAigoAhAgAjYC2AEgASADIAEoAgBBA3FBAkYbKAIoKAIQIgIgAigC3AEiBEEBajYC3AEgAigC2AEgBEECdGogATYCACABIAMgASgCAEEDcUECRhsoAigoAhAiASgC2AEgASgC3AFBAnRqQQA2AgAgACgCEEEBOgDwASAAEGEoAhBBAToA8AELgAEBAn9BwAEhAyAAIQIDQCACKAIQIANqKAIAIgIEQEG4ASEDIAEgAkcNAQsLIAIEQCABKAIQIgIoArwBIQEgAigCuAEiAgRAIAIoAhAgATYCvAELIAEgACABGygCEEG4AUHAASABG2ogAjYCAA8LQeenA0HQvgFBvgFBl6QBEAAACwkAQQEgABDNAgsgAQF/QRAQiAMiAyACNgIIIAMgATYCBCADIAA2AgAgAwthAQR/IAAoAgQhBAJAA0AgAiAERg0BIAJBAnQgAkEBaiECIAAoAgAiBWoiAygCACABRw0ACyAAIARBAWsiATYCBCADIAUgAUECdCIBaigCADYCACAAKAIAIAFqQQA2AgALCzsBAX8gACgCCCIBRQRAQZKiA0H1vQFBkAlB3fkAEAAACyAAKAIAIAEgACgCBGpBAWsgACgCDHBBFGxqCzsBAX8gACgCCCIBRQRAQcyhA0H1vQFByQJBhPkAEAAACyAAKAIAIAEgACgCBGpBAWsgACgCDHBBBHRqCx8AIABFBEBB+tQBQYLAAUHuBUG9jQEQAAALIAAoAggLKAAgAEEFTwRAQZDRAUGdvwFB/wNB5jgQAAALIABBAnRB6MoIaigCAAsXACAAKAIAIgAgASgCACIBSiAAIAFIawu0AgEGfyMAQRBrIgckAAJAIAAgASACELYDRQRAIAAoAgQgAUEYbGoiACEBAkAgACgCECIGIAAoAhQiAEcEQCABKAIIIQMgASgCDCEEDAELIAZBAXRBASAGGyIAQf////8DSwRAQcQAIQEMAwsgASgCCCAAQQJ0EDkiA0UEQEEwIQEMAwsgAyABKAIUIgVBAnRqQQAgACAFa0ECdBAzGiAFIAEoAhAiBiABKAIMIgRqSQRAIARBAnQhCCADIAAgBSAEayIFayIEQQJ0aiADIAhqIAVBAnQQUhogASAENgIMCyABIAA2AhQgASADNgIICyADIAQgBmogAHBBAnRqIAI2AgAgASABKAIQQQFqNgIQCyAHQRBqJAAPCyAHIAEQczYCAEG4+AgoAgBB4YUEIAcQHhoQJwALngECAn8BfgJAIAEgAkGABCABKAIAEQQAIgVFBEAgACgCECAAKAIAIgVBKGxqIgYgBTYCICAAIAVBAWo2AgAgBiEAIANFDQEgAyAAKAIgQQV0aiIFIAIpAwA3AwggAikDCCEHIAUgADYCACAFIAc3AxAgACAEOgAkIAEgBUEBIAEoAgARBAAaCyAFKAIADwtBmTBBqMEBQakCQb0cEAAAC8sDAgZ8A38jAEEQayIMJAADQAJAAkACQAJAAkAgBCACEDwiCygCAEEBaw4DAgEAAwsgCygCGCAMQRBqJAAPC0EkIQIgACsACCIFIAsrABAiB0RIr7ya8td6PqAiCGQNAiAFIAdESK+8mvLXer6gIgljRSAAKwAAIgogCysACCIGZHENAkEgIQIgBSAHoZlESK+8mvLXej5lRSAKIAahmURIr7ya8td6PmVFcg0CQSQhAiABKwAIIgUgCGQNAkEgQSRBICABKwAAIAZkGyAFIAljGyECDAILIAArAAAhBgJAAkAgACsACCIFIAMgCygCBCINQThsaiICKwAIoZlESK+8mvLXej5lBEAgBiACKwAAoZlESK+8mvLXej5lDQELIAUgAisAGKGZREivvJry13o+ZUUNASAGIAIrABChmURIr7ya8td6PmVFDQELIAUgASsDCKGZREivvJry13o+ZQRAQSBBJCABKwMAIAZjGyECDAMLQSBBJCANIAMgARDWBBshAgwCC0EgQSQgDSADIAAQ1gQbIQIMAQsgDEGzAjYCBCAMQY3DATYCAEG4+AgoAgBB2MMEIAwQHhoQaQALIAIgC2ooAgAhAgwACwALQwACQCAAECgEQCAAECRBD0YNAQsgABDjDwsCQCAAECgEQCAAQQA6AA8MAQsgAEEANgIECyAAECgEfyAABSAAKAIACwu3DQIIfwN8IwBBwAJrIgQkAAJAIAAQNyIJIAAoAgBBA3EiCkEAEOgDIgVFDQADQCAFRQ0BAkAgACAFEEEiA0UNACADLQAARQRAIAUoAghBoPQAEExFDQELIAFBmfIEEBoaIAEgAigCABBAIAUoAgggAiABELcCIAFB7tEDEBoaAkAgAi0ABUEBRw0AAkAgBSgCCCIDQdnHARBMDQAgA0HJxwEQTA0AIANB0ccBEEwNACADQa/HARBMDQAgA0HAxwEQTA0AIANBt8cBEExFDQELIAAgBRBBIgNFDQEgAy0AAEUNASADQQAQ8woiCEUEQCAEIAM2AgBBsv4EIAQQKwwCCyABQeyGBRAaGiACIAIoAgAiA0EBajYCACABIAMQQCABQYfTBBAaGkEAIQcDQCAIKAIAIAdNBEAgAiACKAIAQQFrNgIAIAFB7IYFEBoaIAEgAigCABBAIAFBscoBEBoaIAgQ5QoMAwsgBwRAIAFBmfIEEBoaCyAIKAIIIQMgAiACKAIAIgZBAWo2AgAgASAGEEAgAUHK3QMQGhogASACKAIAEEACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAyAHQdAAbGoiAygCACIGDhAKCgAAAQECAwQEBgcLBQUICQsgBEHQAEHwACAGQQJGGzYCUCABQc/xBCAEQdAAahAdIAEgAigCABBAIAEgA0EIahDfCAwKCyAEQcIAQeIAIAZBBEYbNgJgIAFBz/EEIARB4ABqEB0gASACKAIAEEAgASADQQhqEN8IDAkLIAFBhPIEQQAQHSABIAIoAgAQQCABIANBCGoQ3wgMCAsgAUHs8QRBABAdIAEgAigCABBAIAMrAwghCyAEIAMrAxA5A5gBIAQgCzkDkAEgAUHX7wQgBEGQAWoQHSABIAIoAgAQQCAEQeMAQfIAIAMoAhgiBkEBRhtB7AAgBhs2AoABIAFB3PEEIARBgAFqEB0gASACKAIAEEAgBCADKwMgOQNwIAFBm+8EIARB8ABqEB0gASACKAIAEEAgAUGy0QMQGhogAygCKCACIAEQtwIgAUEKEGYMBwsgBEHDAEHjACAGQQhGGzYCoAEgAUHP8QQgBEGgAWoQHSABIAIoAgAQQCABQYPxBEEAEB0gASACKAIAEEAgAUHL0QMQGhogAygCCCACIAEQtwIgAUEKEGYMBgsgBEHDAEHjACAGQQ1GGzYCkAIgAUHP8QQgBEGQAmoQHSABIAIoAgAQQAJAAkACQCADKAIIDgIAAQILIAFBg/EEQQAQHSABIAIoAgAQQCABQcvRAxAaGiADKAIQIAIgARC3AiABQQoQZgwHCyABQd3wBEEAEB0gASACKAIAEEAgASACKAIAEEAgAysDECELIAQgAysDGDkDiAIgBCALOQOAAiABQYPwBCAEQYACahAdIAEgAigCABBAIAMrAyAhCyAEIAMrAyg5A/gBIAQgCzkD8AEgAUHt7wQgBEHwAWoQHSABIAIoAgAQQCABIAMoAjAgAygCNCACEOYPDAYLIAFB8PAEQQAQHSABIAIoAgAQQCABIAIoAgAQQCADKwMQIQsgAysDGCEMIAQgAysDIDkD4AEgBCAMOQPYASAEIAs5A9ABIAFBtfAEIARB0AFqEB0gASACKAIAEEAgAysDKCELIAMrAzAhDCAEIAMrAzg5A8ABIAQgDDkDuAEgBCALOQOwASABQZnwBCAEQbABahAdIAEgAigCABBAIAEgAygCQCADKAJEIAIQ5g8MBQsgAUGQ8gRBABAdIAEgAigCABBAIAQgAysDCDkDoAIgAUGs7wQgBEGgAmoQHSABIAIoAgAQQCABQejRAxAaGiADKAIQIAIgARC3AiABQQoQZgwECyABQfjxBEEAEB0gASACKAIAEEAgAUHe0QMQGhogAygCCCACIAEQtwIgAUEKEGYMAwsgAUHR8ARBABAdIAEgAigCABBAIAQgAygCCDYCsAIgAUHsywQgBEGwAmoQHQwCCyAEQbICNgIUIARBpb8BNgIQQbj4CCgCAEHYwwQgBEEQahAeGhBpAAsgBEHlAEHFACAGGzYCQCABQc/xBCAEQUBrEB0gASACKAIAEEAgAysDCCELIAMrAxAhDCADKwMYIQ0gBCADKwMgOQM4IAQgDTkDMCAEIAw5AyggBCALOQMgIAFB0s8EIARBIGoQHQsgAiACKAIAQQFrIgM2AgAgASADEEAgAUGvCBAaGiAHQQFqIQcMAAsACyAAIAUQQSACIAEQtwILIAkgCiAFEOgDIQUMAAsACyAEQcACaiQAC7ECAgR/AnwjAEHwAGsiASQAQdz+CkHc/gooAgAiBEEBajYCAAJ8IAAoAhAiAygCiAEiAkUEQEQAAAAAAABJQCEFRAAAAAAAAElADAELIAK3RBgtRFT7IQlAokQAAAAAAIBmQKMiBRBFRAAAAAAAAPA/IAUQV6FEAAAAAAAASUCiEDIhBUQAAAAAAADwP6BEAAAAAAAASUCiEDILIQYgAEHcyQMQGhogAygC3AEiAgRAIAAgAhCLASAAQd8AEGYLIAEgBTkDYCABIAY5A1ggASAENgJQIABB4doEIAFB0ABqEB0gAUEoaiICIANBOGpBKBAfGiAARAAAAAAAAAAAIAIQ2wQgAEQAAAAAAADwPyABIANB4ABqQSgQHyIBENsEIABB2tcEEBoaIAFB8ABqJAAgBAuAAwIEfwF8IwBBgAFrIgMkAEHY/gpB2P4KKAIAIgVBAWo2AgAgACgCECIEKAKIASEGIANCADcDeCADQgA3A3AgA0IANwNoIANCADcDYCABIANB4ABqIAIgBrdEGC1EVPshCUCiRAAAAAAAgGZAo0EAEOoGIABBwMkDEBoaIAQoAtwBIgEEQCAAIAEQiwEgAEHfABBmCyADIAU2AlAgAEGH0gMgA0HQAGoQHSAAQaTKAxAaGiAAIAMrA2AQfCAAQZ3KAxAaGiAAIAMrA2gQfCAAQZbKAxAaGiAAIAMrA3AQfCAAQY/KAxAaGiAAIAMrA3gQfCAAQZ7bBBAaGiAEKwOQASEHIANBKGoiASAEQThqQSgQHxogACAHRPyp8dJNYlC/oEQAAAAAAAAAACAHRAAAAAAAAAAAZBsgARDbBCAAIAQrA5ABIgdEAAAAAAAA8D8gB0QAAAAAAAAAAGQbIAMgBEHgAGpBKBAfIgEQ2wQgAEG/1wQQGhogAUGAAWokACAFCwsAIABB7rMEEBoaC6gIAgJ/BHwjAEGwAmsiCCQAAkACQCACRSADRXINACAAKAJAIgkgBEVyRQRAIAQtAABFDQECQAJAAkACQCABDgMAAQIDCyACKwMAIQogAisDGCELIAIrAxAhDCAIIAIrAwg5AzAgCCAMOQMoIAggCzkDICAIIAo5AxggCCAENgIQIABB5qoEIAhBEGoQHQwECyACKwMQIQsgAisDACEKIAggAisDCDkDUCAIIAsgCqE5A1ggCCAKOQNIIAggBDYCQCAAQcyqBCAIQUBrEB0MAwsgCCAENgJwIABB1TcgCEHwAGoQHUEAIQQDQCADIARGBEAgAEHshgUQGhoMBAUgAiAEQQR0aiIBKwMAIQogCCABKwMIOQNoIAggCjkDYCAAQYKMASAIQeAAahAdIARBAWohBAwBCwALAAsgCEE7NgIEIAhBib8BNgIAQbj4CCgCAEHYwwQgCBAeGhBpAAsgBEUgCUEBR3JFBEAgBC0AAEUNASABRQRAIAIrAwAhCiACKwMYIQsgAisDECEMIAIrAwghDSAIIAU2AqQBIAggBDYCoAEgCCANOQOYASAIIAw5A5ABIAggCzkDiAEgCCAKOQOAASAAQZ/3AyAIQYABahAdDAILIAhBxgA2ArQBIAhBib8BNgKwAUG4+AgoAgBB2MMEIAhBsAFqEB4aEGkACyAJQX5xQQJHDQAgAUEDTw0BIAAgAUECdEGUxwhqKAIAEBoaAkAgB0UNACAHLQAARQ0AIABBhMoDEBoaIAAgBxDkCCAAQdzLAxAaGgsCQCAERQ0AIAQtAABFDQAgAEGMyQMQGhogACAEEOQIIABB3MsDEBoaCwJAIAZFDQAgBi0AAEUNACAAQZ7IAxAaGiAAIAYQiwEgAEHcywMQGhoLAkAgBUUNACAFLQAARQ0AIABBrMkDEBoaIAAgBRCLASAAQdzLAxAaGgsgAEHWywMQGhogAEGyyAMQGhogAisDACEKAkACQAJAAkAgAUEBaw4CAgEACyACKwMYIQsgAisDECEMIAggAisDCDkD+AEgCCAMOQPwASAIIAs5A+gBIAggCjkD4AEgAEHuiwEgCEHgAWoQHQwCCyAIIAIrAwg5A5gCIAggCjkDkAIgAEGDjAEgCEGQAmoQHUEBIQQDQCADIARGDQIgAiAEQQR0aiIBKwMAIQogCCABKwMIOQOIAiAIIAo5A4ACIABB94sBIAhBgAJqEB0gBEEBaiEEDAALAAsgAisDCCELIAIrAxAhDCAIIAo5A8ABIAggDCAKoTkD0AEgCCALOQPIASAAQfOLASAIQcABahAdCyAAKAJAQQNGBEAgAEHV2QQQGhoMAQsgAEGa2wQQGhoLIAhBsAJqJAAPCyAIQdUANgKkAiAIQYm/ATYCoAJBuPgIKAIAQdjDBCAIQaACahAeGhBpAAsLAEHA5gpBAjYCAAs9AQF/IwBBEGsiAyQAIAMgATkDACAAQaWLASADEIwBIAAQoQYgAEEgENoBIABB74YFIAIQ6AggA0EQaiQACxMAIABB2s8DIAAoAhBBOGoQ6QgL/QICBX8BfCMAQTBrIgEkACABQgA3AyggAUIANwMgAkAgACgCECICKwOgASIGIAIoAgxBA3RBgKgKaiIDKwMAoZlE/Knx0k1iQD9mBH8gAyAGOQMAIAFBIGoiAkGzrwMQ7wEgASAAKAIQKwOgATkDECACQd6LASABQRBqEIwBIAIQoQYgAkEpENoBIABByM8DIAIQwgEQvQMgACgCEAUgAgsoAqgBIgRFDQADQCAEKAIAIgNFDQEgBEEEaiEEIANBpbIBEGMNACADQf2qARBjDQAgA0Gx/AAQYw0AIAFBIGogAxDvAQNAIAMtAAAgA0EBaiICIQMNAAsgAi0AAARAIAFBIGpBKBDaAUHvhgUhAwNAIAItAAAEQCABIAI2AgQgASADNgIAIAFBIGpBrzYgARCMAQNAIAItAAAgAkEBaiECDQALQe6fAyEDDAEFIAFBIGpBKRDaAQsLCyAAQcjPAyABQSBqEMIBEL0DDAALAAsgAUEgahBlIAFBMGokAAtrAQJ/IwBBEGsiAyQAIANCADcDCCADQgA3AwADQAJAIAItAAAiBEHcAEcEQCAEDQEgACABIAMQwgEQciADEGUgA0EQaiQADwsgA0HcABDaASACLQAAIQQLIAMgBMAQ2gEgAkEBaiECDAALAAvHAQEDfyMAQRBrIgIkACABQVBBACABKAIAQQNxQQJHG2oiAUFQQQAgASgCAEEDcSIDQQJHG2ooAighBCABQTBBACADQQNHG2ooAighAyACIAEpAwg3AwggAiABKQMANwMAAkAgACADIAQgAhDTAkUNACAAEDcgAEYEQCAALQAYQSBxBEAgARCNDAsgACABEPUHIAEQ2AcgAEECIAEpAwgQ2AYLIAAgAUEPQQBBABDFAw0AIAAQNyAARgRAIAEQGAsLIAJBEGokAAuSAgEFfyAAEJ0FIQMgABAkIQECQAJAAkADQCABIgJFDQEgAyABQQFrIgFqLQAAQS5HDQALIAAQJCEBA0AgAUEBayEFIAEgAkcEQCADIAVqLQAAQTBHDQILAkAgABAoBEAgAC0ADyIERQ0EIAAgBEEBazoADwwBCyAAIAAoAgRBAWs2AgQLIAEgAkcgBSEBDQALIAAQJCIBQQJJDQAgASADaiIBQQJrIgItAABBLUcNACABQQFrLQAAQTBHDQAgAkEwOgAAIAAQKARAIAAtAA8iAUUNAyAAIAFBAWs6AA8PCyAAIAAoAgRBAWs2AgQLDwtBj5ADQZqCAUGAA0HRLhAAAAtBj5ADQZqCAUGWA0HRLhAAAAsaACAAIAEQsQEiASACEL4DIAAgAUEAEI0BGgtFACAAIAFBmNMDIAIrAwBEAAAAAAAAUkCjEI0DIAAgAUGY0wMgAyACKwMIIgOhIANB6N0KLQAAG0QAAAAAAABSQKMQjQMLfQEDfyMAQTBrIgIkACAAECAhAyAAEC8hBAJAAkAgAwRAQX8hACAEIAEgAxCmBkF/Rw0BDAILIAIgACkDCDcDACACQRBqIgNBHkGr0QEgAhChARpBfyEAIAEgAyAEKAJMKAIEKAIEEQAAQX9GDQELQQAhAAsgAkEwaiQAIAAL/QMBBX8gBEUEQCADQQAQ4gIhBwsgA0EAQYABIAMoAgARBAAhBgJAAkADQCAGBEACQAJAIAYoAgwiBQRAIAUtAAANAQsgBi0AFg0AIAdFDQEgByAGQQQgBygCABEEACIFRQ0FIAUoAgwiCQRAIAktAAANAQsgBS0AFg0BCwJAIAhFBEBBfyEFIAAgARDSAkF/Rg0FIAEgAiAAKAJMKAIEKAIEEQAAQX9GDQUgAUHKygEgACgCTCgCBCgCBBEAAEF/Rg0FQfTkCkH05AooAgBBAWo2AgAMAQtBfyEFIAFBmfIEIAAoAkwoAgQoAgQRAABBf0YNBCAAIAEQ0gJBf0YNBAsgACABIAYoAghBARC4AkF/Rg0DIAFBwOEBIAAoAkwoAgQoAgQRAABBf0YNAyAAIAEgBigCDEEBELgCQX9GDQMgCEEBaiEICyADIAZBCCADKAIAEQQAIQYMAQsLAkAgCEEASgRAQX8hBUH05ApB9OQKKAIAQQFrNgIAIAhBAUcEQCABQeyGBSAAKAJMKAIEKAIEEQAAQX9GDQMgACABENICQX9GDQMLQX9BACABQc3cBCAAKAJMKAIEKAIEEQAAQX9GIgAbIQUgBA0CIABFDQEMAgtBACEFIAQNAQsgAyAHEOICGkEAIQULIAUPC0Gq7wBB2MEBQbACQc0mEAAACx4AIAAgASAAIAIQsQEiAkEBELgCIAAgAkEAEI0BGgulIQIJfwN8IwBB0AJrIgYkAAJ/IAAgAhCICkHnB0YEQCAGIABBASACEKUENgIEIAYgAjYCAEGZ9QMgBhA2QX8MAQsjAEEQayIJJAAgAUHCKUGYAkEBEDUaIAEoAhAgADYCkAEgARA3IAFHBEAgARA3QcIpQZgCQQEQNRogARA3KAIQIAA2ApABCwJ/AkACQAJAIAFBoxkQJiICRQ0AIABBADYCpAEgACACEIgKQecHRw0AIAkgAEEBIAIQpQQ2AgQgCSACNgIAQZn1AyAJEDYMAQsgACgCpAEiCg0BC0F/DAELQQEQ1AIgACgCrAEoAgBBAXEhCyMAQUBqIgIkAEEBQeAAEBkhACABKAIQIAA2AgggAUHR5gAQJiIABEAgAkIANwM4IAJCADcDMCABEP4BIQMgAiAANgIkIAJB9/0AQcj+ACADGzYCICACQTBqIQAjAEEwayIEJAAgBCACQSBqIgM2AgwgBCADNgIsIAQgAzYCEAJAAkACQAJAAkACQEEAQQBBpwggAxBgIgdBAEgNAEEBIQMgB0EBaiEFAkAgByAAEEcgABAkayIITwRAIAAQKEEAIAUgCGsiCEEBRhsNASAAIAgQhgoLQQAhAwsgBEIANwMYIARCADcDECADIAdBEE9xDQEgBEEQaiEIIAcgAwR/IAgFIAAQdQsgBUGnCCAEKAIsEGAiBUcgBUEATnENAiAFQQBMDQAgABAoBEAgBUGAAk8NBCADBEAgABB1IARBEGogBRAfGgsgACAALQAPIAVqOgAPIAAQJEEQSQ0BQbi7A0GaggFB2AFBzR8QAAALIAMNBCAAIAAoAgQgBWo2AgQLIARBMGokAAwEC0HqqQNBmoIBQcsBQc0fEAAAC0H9nQNBmoIBQdABQc0fEAAAC0HQzwFBmoIBQdMBQc0fEAAAC0GnogFBmoIBQdoBQc0fEAAACwJAIAAQKARAIAAQJEEPRg0BCyAAECQgABBHTwRAIABBARCGCgsgABAkIQMgABAoBEAgACADakEAOgAAIAAgAC0AD0EBajoADyAAECRBEEkNAUG4uwNBmoIBQZ0CQZm2ARAAAAsgACgCACADakEAOgAAIAAgACgCBEEBajYCBAsCQCAAECgEQCAAQQA6AA8MAQsgAEEANgIECyABIAAQKAR/IAAFIAAoAgALELIOGiAAEGULAkAgAUHI/AAQJiIARQRAQdnZARCrBCIARQ0BCwJAAkBB5dkBQT0QuwUiA0Hl2QFHBEAgA0Hl2QFrIgNB5dkBai0AAEUNAQtBgIwLQRw2AgAMAQsgAyAAEDsiBWpBAmoQSCIERQ0AIARB5dkBIAMQHxogAyAEaiIHQT06AAAgB0EBaiAAIAVBAWoQHxoCQAJAAkACQEGEjAsoAgAiAEUEQEEAIQAMAQsgACgCACIFDQELQQAhAwwBCyADQQFqIQdBACEDA0AgBCAFIAcQ6AFFBEAgACgCACAAIAQ2AgAgBBCMDAwDCyADQQFqIQMgACgCBCEFIABBBGohACAFDQALQYSMCygCACEACyADQQJ0IgdBCGohBQJAAkAgAEHwjgsoAgAiCEYEQCAIIAUQOSIADQEMAgsgBRBIIgBFDQEgAwRAIABBhIwLKAIAIAcQHxoLQfCOCygCABAYCyAAIANBAnRqIgMgBDYCACADQQA2AgRBhIwLIAA2AgBB8I4LIAA2AgAgBARAQQAgBBCMDAsMAQsgBBAYCwsLQQEhAAJAIAEgAUEAQeYhQQAQIUHU8gEQkAEiA0H0jAMQLkUNACADQbrwAhAuRQ0AIANBo/ECEC5FDQAgA0GRjQMQLkUNACADQfyMAxAuRQ0AIANBh40DEC5FDQAgA0G5lQMQLkUNAEECIQAgA0HFnQIQLkUNACADQcSMAhAuRQ0AQQAhACADQdTyARAuRQ0AIANB8+kBEC5FDQAgAiADNgIQQcneBCACQRBqECsLIAEoAhAgADoAcwJAQZDdCigCAA0AQYjdCiABQeT8ABAmIgA2AgAgAA0AQYjdCkGE3QooAgA2AgALIAEgAUEAQcDvAEEAECFEAAAAAAAAAABEAAAAAAAAAAAQSyEMIAEoAhAoAgggDDkDAAJ/QQAgAUGGOxAmIgBFDQAaQQEgAEGQ0gEQTA0AGkECIABBudEBEEwNABpBA0EAIABB99MBEEwbCyEAIAEoAhAgAEEFbCAAQQJ0IAsbNgJ0IAIgASABQQBB9d4AQQAQIUQAAAAAAADQP0R7FK5H4XqUPxBLIgw5AzAgASgCEAJ/IAxEAAAAAAAAUkCiIgxEAAAAAAAA4D9EAAAAAAAA4L8gDEQAAAAAAAAAAGYboCIMmUQAAAAAAADgQWMEQCAMqgwBC0GAgICAeAs2AvgBAkAgASABQQBB7d4AQQAQIUEAEHsiAwRAIAIgAkEwajYCAAJAAkAgA0GHigEgAhBORQRARAAAAAAAAOA/IQwMAQtEexSuR+F6lD8hDCACKwMwIg1EexSuR+F6lD9jRQ0BCyACIAw5AzAgDCENCyABKAIQIQAgA0GpDhCpBEUNASAAQQE6AJQCDAELIAJCgICAgICAgPA/NwMwIAEoAhAhAEQAAAAAAADgPyENCyAAAn8gDUQAAAAAAABSQKIiDEQAAAAAAADgP0QAAAAAAADgvyAMRAAAAAAAAAAAZhugIgyZRAAAAAAAAOBBYwRAIAyqDAELQYCAgIB4CzYC/AEgASABQQBB7zFBABAhQQBBABBiIQAgASgCEEH/ASAAIABB/wFOGzoA8QEgASABQQBB5TJBABAhQQAQe0GwnQpBwJ0KEO8GIQAgASgCECAANgL0AQJAIAFBmOIAECYiA0UEQCABKAIQIQAMAQsgA0Gs4QAQTARAIAEoAhAiACgCCEEENgJUDAELIANBvywQTARAIAEoAhAiACgCCEEDNgJUDAELIANBzqoBEEwEQCABKAIQIgAoAghBBTYCVAwBCyADQYbyABBMBEAgASgCECIAKAIIQQI2AlQMAQsgASgCECEAIAMQqgIiDEQAAAAAAAAAAGRFDQAgACgCCCIDIAw5AxAgA0EBNgJUCyABQZmOASAAKAIIQUBrEIcKIQAgASgCECgCCCIDIAA6AFAgAUG4ogEgA0EwahCHChogAUHcOxAmEGshACABKAIQKAIIIAA6AFICQAJ/IAFBrpcBECYiAARAIAAQjAJB2gBGDAELIAFB5eYAECYiAARAIAAtAABB3wFxQcwARgwBCyABQZKbARAmIgBFDQEgABBrCyEAIAEoAhAoAgggADoAUQtBuN0KIAFB0vcAECZBkJ0KQaCdChDvBjYCAEG83QogAUG1lwEQJhBrOgAAQdDdCkEANgIAQdTdCkEANgIAIAEoAhAoAghCADcDGAJAAkAgAUGj+gAQJiIABEAgAC0AAA0BCyABQePlABAmIgBFDQEgAC0AAEUNAQsgASgCECgCCCAAEKoCOQMYCyABEPsEQdjdCkKb0t2ahPeFz8cANwMAQezdCiABQQBBhIUBQQAQITYCAEH43QogAUEAQaufAUEAECE2AgBB/N0KIAFBAEG46ABBABAhNgIAQYDeCiABQQFBvSFBABAhNgIAQYTeCiABQQFBuPwAQQAQITYCAEGI3gogAUEBQYybAUEAECE2AgBBjN4KIAFBAUHUOkEAECE2AgBBkN4KIAFBAUHIOkEAECE2AgBBrN4KIAFBAUGgngFBABAhNgIAQZTeCiABQQFB7YwBQQAQITYCAEGY3gogAUEBQZ6dAUEAECE2AgBBnN4KIAFBAUG1OkEAECE2AgBBoN4KIAFBAUGg9ABBABAhIgA2AgAgAEUEQEGg3gogAUEBQaD0AEGU0wEQITYCAAtBpN4KIAFBAUH08wBBABAhNgIAQbDeCiABQQFB7zFBABAhNgIAQezeCiABQQFBofwAQQAQITYCAEG83gogAUEBQYSFAUEAECE2AgBBtN4KIAFBAUGQNUEAECE2AgBBuN4KIAFBAUHPM0EAECE2AgBBxN4KIAFBAUH2FkEAECE2AgBBwN4KIAFBAUHl5gBBABAhNgIAQcjeCiABQQFB7uUAQQAQITYCAEHM3gogAUEBQYGNAUEAECE2AgBB0N4KIAFBAUHvoAFBABAhNgIAQdTeCiABQQFB8C5BABAhNgIAQajeCiABQQFB2Q5BABAhNgIAQdjeCiABQQFBljtBABAhNgIAQdzeCiABQQFBodwAQQAQITYCAEHg3gogAUEBQa4gQQAQITYCAEHk3gogAUEBQZ01QQAQITYCAEHo3gogAUEBQfkIQQAQITYCAEHw3gogAUEBQaufAUEAECE2AgBB9N4KIAFBAkG1IUEAECE2AgBB/N4KIAFBAkHUOkEAECE2AgBBgN8KIAFBAkHIOkEAECE2AgBBhN8KIAFBAkHtjAFBABAhNgIAQYjfCiABQQJBnp0BQQAQITYCAEGM3wogAUECQbU6QQAQITYCAEGQ3wogAUECQaD0AEEAECE2AgBBlN8KIAFBAkH08wBBABAhNgIAQbjfCiABQQJBkShBABAhNgIAQZjfCiABQQJBkjtBABAhNgIAQcTfCiABQQJBhfQAQQAQITYCAEHI3wogAUECQfvzAEEAECE2AgBBzN8KIAFBAkHojAFBABAhNgIAQdDfCiABQQJBmZ0BQQAQITYCAEHU3wogAUECQbA6QQAQITYCAEHY3wogAUECQYmmAUEAECE2AgBB3N8KIAFBAkHNnwFBABAhNgIAQfjeCiABQQJB/ukAQQAQITYCAEGk3wogAUECQe8xQQAQITYCAEGc3wogAUECQaCeAUEAECE2AgBBoN8KIAFBAkHBlwFBABAhNgIAQajfCiABQQJB3owBQQAQITYCAEGs3wogAUECQfwfQQAQITYCAEGw3wogAUECQZY7QQAQITYCAEG03wogAUECQa4gQQAQITYCAEHg3wogAUECQZHeAEEAECE2AgBB5N8KIAFBAkGa3gBBABAhNgIAQejfCiABQQJBofwAQQAQITYCAEEAIQAjAEEgayIDJAACQAJAIAFBlKgBECYiBARAIAQtAAANAQsgAUHZxwEQJiIERQ0BIAQtAABFDQELIARB+AAQ8woiAA0AIAMgARAgNgIQQdf8AyADQRBqECsgAyAENgIAQfqBBSADEIIBQQAhAAsgA0EgaiQAIAEoAhAoAgggADYCWAJAIAFB6awBECYiAEUNACAALQAARQ0AIAAgARCDASEAIAEoAhAoAgggADYCXAsgAkFAayQAIAEoAhAoAgghACABEDcoAhAgADYCCAJAIAooAgAiAEUNACABIAARAQAgCigCBCIARQ0AIAEoAhAgADYClAELQQAQ1AJBAAshACAJQRBqJABBfyAAQX9GDQAaAkAgASgCECIAKAIILQBRQQFGBEAgACsDGCEMIAArAxAhDSAAKwMoIQ4gBiAAKwMgEDI5AyggBiAOEDI5AyAgBiANEDI5AxggBiAMEDI5AxAgBkHQAGpBgAJBjYwBIAZBEGoQoQEaDAELIAArAxAhDCAAKwMYIQ0gACsDICEOIAYgACsDKBAyOQNIIAZBQGsgDhAyOQMAIAYgDRAyOQM4IAYgDBAyOQMwIAZB0ABqQYACQY2MASAGQTBqEKEBGgsgAUHKxAEgBkHQAGoQrQdBAAsgBkHQAmokAAudBQENf0EAQQFBoPQAQZTTARAhGhCCCSIAQQA2AiQgAEGg2Ao2AiAgAEGZAjYCECAAQciiCjYCAAJAIAAiAigCICIFRQ0AA0AgBSgCACIARQ0BAkAgAC0AAEHnAEcNACAAQdsNEKkERQ0AIAUoAgQhAyMAQRBrIgckACADKAIAIQACQEEBQQwQQyIEBEAgBEEANgIEIAQgABBkNgIIIAQgAigCaDYCACACIAQ2AmggAygCBCEGA0BBACEIIAYoAgQiCwRAA0AgCyAIQRRsaiIJKAIEIgMEQCAGKAIAIQAgCSgCCCEKIwBBMGsiASQAIAMQqQEiDARAIAFBKGogA0E6ENQBIAIgAEECdGpBQGshAwNAAkAgAygCACIARQ0AIAFBIGogACgCBEE6ENQBIAEgASkCKDcDGCABIAEpAiA3AxAgAUEYaiABQRBqEPULQQBMDQAgAygCACEDDAELCwNAAkAgAygCACIARQ0AIAFBIGogACgCBEE6ENQBIAEgASkCKDcDCCABIAEpAiA3AwAgAUEIaiABELIFRQ0AIAogAygCACIAKAIITg0AIAAhAwwBCwtBAUEUEBkiACADKAIANgIAIAMgADYCACAAIAk2AhAgACAENgIMIAAgCjYCCCAAIAw2AgQLIAFBMGokACAIQQFqIQgMAQsLIAZBCGohBgwBCwsgB0EQaiQADAELIAdBDDYCAEG4+AgoAgBBz+4DIAcQHhoQJwALCyAFQQhqIQUMAAsACyACQQA6ACwgAkECQYcZQQAQ3QMiAARAIAIgACgCECgCDDYCjAELIAJBIzYChAEgAkEkNgKAASACQSU2AnwgAkF/NgJ4IAJCgICAgIAENwNwIAIgAkHwAGpBrPAJKAIAEJcBNgKIASACC+IBAQR/QcDiCigCACIBBEAgARCbARpBwOIKQQA2AgALIAAoAjghAQNAIAEEQCABKAIEIAEQGCEBDAELCyAAKAJoIQEDQCABBEAgASgCACABKAIEEBggASgCCBAYIAEQGCEBDAELCyAAEJMEIAAoAigQGCAAKAIwEBggACgCiAEQmwEaIABBQGshBANAIANBBUcEQCAEIANBAnRqKAIAIQEDQCABBEAgASgCACABKAIEEBggARAYIQEMAQsLIANBAWohAwwBCwsgACgCrAIQGCAAEBhBlN0KKAIAGkGI4AooAgAaCxIAIAAoArgBIgAEQCAAEIYECwvHAQEGfyMAQRBrIgMkACABQVBBACABKAIAQQNxIgRBAkcbaiIFKAIoIQYgAUEwQQAgBEEDRxtqIgQoAighBwNAAkAgAEUNACADIAEpAwg3AwggAyABKQMANwMAIAAgByAGIAMQ0wINACAAIAcQ5QEhAiAAKAI0IAJBIGogBRDdBCAAKAI4IAJBGGogBRDdBCAAIAYQ5QEhAiAAKAI0IAJBHGogBBDdBCAAKAI4IAJBFGogBBDdBCAAKAJEIQAMAQsLIANBEGokAAu5AQEDfyMAQTBrIgMkAAJAIAIoAgAiBEUNACAELQAARQ0AIAAoAjwhBCAAKAIQIgUEQCAFKAKYAUUNAQsCQCAALQCZAUEgcQRAIAMgASkDCDcDKCADIAEpAwA3AyAMAQsgAyABKQMINwMYIAMgASkDADcDECADQSBqIAAgA0EQahCwBgsgBEUNACAEKAJYIgFFDQAgAyADKQMoNwMIIAMgAykDIDcDACAAIAMgAiABEQUACyADQTBqJAALIgEBfwJAIAAoAjwiAUUNACABKAIwIgFFDQAgACABEQEACwsiAQF/AkAgACgCPCIBRQ0AIAEoAiwiAUUNACAAIAERAQALCyIBAX8CQCAAKAI8IgFFDQAgASgCKCIBRQ0AIAAgAREBAAsLewEGfCABKwOQBCEHIAErA4gEIQggASsD4AIhBCABKwOABCEDIAErA/gDIQUCfCABKALoAgRAIAUgAisDAKAhBiADIAIrAwigmgwBCyADIAIrAwigIQYgBSACKwMAoAshAyAAIAQgB6IgBqI5AwggACAEIAiiIAOiOQMAC4EBAQF/AkAgAUGc8gAQTA0AIAEhAwNAIAMsAAAhAiADQQFqIQMgAkE6a0F1Sw0ACyACRQRAIAEQjAIPC0F/IQIgACgCrAJFDQBBASEDA38gAyAAKAKwAkoNASABIAAoAqwCIANBAnRqKAIAEEwEfyADBSADQQFqIQMMAQsLIQILIAIL0S4DDH8JfAF+IwBB8ANrIgMkAEGM3QotAAAEQEGw4goQrAELAkACQCABQcIpQQBBARA1BEAgASgCECgCCA0BC0GfgwVBABA2QX8hAkGM3QotAABFDQEgARAgIQAgAxCPATkDCCADIAA2AgBBuPgIKAIAQcHlBCADEDEMAQsgARAbIQQCQANAIAQEQCAEKAIQIgIgAisDECIOIAIrA1ihOQMwIAIgDiACKwNgoDkDQCACIAIrAxgiDiACKwNQRAAAAAAAAOA/oiIQoTkDOCACIA4gEKA5A0ggASAEEC0hBwNAIAcEQCAHKAIQKAIIIgUEQCAFKAIERQ0FIANBsANqIAUoAgAiAkEwEB8aIANB4AJqIgYgAkEwEB8aIANBkANqIAYQiwkgAysDqAMhDiADKwOgAyEQIAMrA5gDIREgAysDkAMhEkEAIQIDQCAFKAIEIAJLBEAgAgRAIANBsANqIAUoAgAgAkEwbGoiBkEwEB8aIANBsAJqIgggBkEwEB8aIANBkANqIAgQiwkgAysDkAMhDyADKwOYAyEUIAMrA6ADIRMgDiADKwOoAxAiIQ4gECATECIhECARIBQQKiERIBIgDxAqIRILIAMoArgDBEAgAyADKQPIAzcDqAIgAyADKQPAAzcDoAIgAyADKAKwAyIGKQMINwOYAiADIAYpAwA3A5ACIANBkANqIANBoAJqIANBkAJqEMoDIAMrA5ADIQ8gAysDmAMhFCADKwOgAyETIA4gAysDqAMQIiEOIBAgExAiIRAgESAUECohESASIA8QKiESCyADKAK8AwRAIAMgAykD2AM3A4gCIAMgAykD0AM3A4ACIAMgAygCsAMgAygCtANBBHRqQRBrIgYpAwg3A/gBIAMgBikDADcD8AEgA0GQA2ogA0GAAmogA0HwAWoQygMgAysDkAMhDyADKwOYAyEUIAMrA6ADIRMgDiADKwOoAxAiIQ4gECATECIhECARIBQQKiERIBIgDxAqIRILIAJBAWohAgwBCwsgBSAOOQMgIAUgEDkDGCAFIBE5AxAgBSASOQMICyABIAcQMCEHDAELCyABIAQQHCEEDAELCyAAQQA6AJ0CIAAgATYCoAECQCABQbjoABAmIgJFDQAgAyADQZADajYC5AEgAyADQbADajYC4AEgAkHziQEgA0HgAWoQTiICQQBMDQAgACADKwOwA0QAAAAAAABSQKIiDjkDwAEgACAOOQPIASACQQFHBEAgACADKwOQA0QAAAAAAABSQKI5A8gBCyAAQQE6AJ0CCyAAQQA6AJwCAkAgAUHFtAEQJiICRQ0AIAMgA0GQA2o2AtQBIAMgA0GwA2o2AtABIAJB84kBIANB0AFqEE4iAkEATA0AIAAgAysDsANEAAAAAAAAUkCiIg45A9ABIAAgDjkD2AEgAkEBRwRAIAAgAysDkANEAAAAAAAAUkCiOQPYAQsgAEEBOgCcAgsgAEEAOgCeAiAAIAEoAhAoAggiAikDMDcD4AEgACACKQM4NwPoAQJAIAEoAhAoAggiAisDMET8qfHSTWJQP2RFDQAgAisDOET8qfHSTWJQP2RFDQAgAEEBOgCeAgsgAi0AUSECIABBn9gBNgK8ASAAQdoAQQAgAhs2ApgCAkAgAUGOOxAmIgJFDQAgAi0AAEUNACAAIAI2ArwBCyAAIAEoAhAiAikDEDcD+AEgACACKQMoNwOQAiAAIAIpAyA3A4gCIAAgAikDGDcDgAJB8N0KIAFBAEHPM0EAECE2AgBB9N0KIAFBAEGh/ABBABAhNgIAIABBAEGY3gooAgBBy+0AEJABNgK4AkEAQZTeCigCAEQAAAAAAAAsQEQAAAAAAADwPxBLIQ4gAEG8ogo2AsgCIAAgDjkDwAIgACABECA2ArQBIAAoAqgCEBggAEEANgKoAiAAKAKsAhAYIABBADYCrAIgACgCtAIQGCAAQQA2ArQCAkACQAJAAkAgAUGTLRAmIgIEQCAAIAFB3t4AECYiBEGW0wMgBBs2AqACIAAgAUHR3gAQJiIEQe6fAyAEGyIENgKkAiAAKAKgAiIFIAQQ9AIgBWoiBEEAIAQtAAAbIgQEQCADIAQsAAA2AsABQajpBCADQcABahArIABB74YFNgKkAgsgACACEGQ2AqgCIANCADcDuAMgA0IANwOwAyADQbADakEAEGcgACgCqAIhAgNAIAIgACgCoAIQugUiAgRAIANBsANqIAIQZ0EAIQIMAQsLIAMoArgDIgJBAWsiCUEASA0EAn8gAkEBTQRAIAMoArADDAELIANBsANqQQAQZyADKAKwAyEIIAMoArwDIQYgAygCtAMhBwNAIAcEQCAGRQ0GIAgoAgAhBCAGIQIDQCACBEAgCCACQQFrIgJBAnRqIgooAgAgCiAENgIAIQQMAQUgB0EBayEHDAMLAAsACwsgAygCuAMgBksNAyAAIAg2AqwCQQALEBggACAJNgKwAiABQZcnECYiBkUNASAGLQAARQ0BQQAhBCAAKAKwAkECakEEEEohBUEBIQIDQCAAKAKwAiIHIAJOBEAgACACIAcgBhCKCQRAIAUgBEEBaiIEQQJ0aiACNgIACyACQQFqIQIMAQsLAkAgBARAIAUgBDYCACAFIARBAnRqIAdBAWo2AgQMAQsgAyAGNgKwAUHm6gQgA0GwAWoQKyAFEBhBACEFCyAAIAU2ArQCDAELIABBATYCsAILQQEQ1AIgA0GYA2ohCSADQbgDaiELQfDFCCgCACEMIAAgACgCmAEiAjYCnAEDQAJAAkACQCACBEACfyAAKAI8IgVFBEBBACEEQQAMAQsgBSgCDCEEIAUoAggLIQUgAiAENgIYIAIgBTYCFCACIAA2AgwgACgCsAEhBCACIAw2AtgEIAJBkKEKNgLUBCACIAQ2AhwgASgCECgCCEUEQEGFtARBABA2QQAQ1AJBfyECQYzdCi0AAEUNCiABECAhACADEI8BOQMoIAMgADYCIEG4+AgoAgBBweUEIANBIGoQMQwKCyACIAIgAigCNBDiBCIFNgI4QQEhBAJAIAVBFUYNACAFQecHRgRAIAMgAigCNDYCoAFB97QEIANBoAFqEDZBABDUAkF/IQJBjN0KLQAARQ0LIAEQICEAIAMQjwE5A5gBIAMgADYCkAFBuPgIKAIAQcHlBCADQZABahAxDAsLAkAgAUGNPRAmIgVFDQAgBUHpGRBJRQ0BIAVB3hkQSQ0AQRAhBAwBC0EAIQQLIAIgAigCmAEgBHI2ApgBAkAgACgCuAEiBARAIAQtAJgBQSBxBEAgAigCNCAEKAI0EElFDQILIAQQhgQgAEEANgIcIABBADYCuAELQejkCkEANgIADAILQejkCigCACIERQ0BIAQgAjYCCCACIAQoAiQ2AiQMAgtBACECQQAQ1AJBjN0KLQAARQ0IIAEQICEAIAMQjwE5AxggAyAANgIQQbj4CCgCAEHB5QQgA0EQahAxDAgLIAIoAjwhCkEBIQQjAEFAaiIHJAAgAigCACEFAn8CQAJAAkAgAigCTCIGRQ0AIAYoAgAiBkUNACACIAYRAQAMAQsgAigCKA0AIAIoAiQNAAJAIAUtAA1FBEAgAigCICEFDAELQdjgCiACKAIUIgVBvBcgBRsQpwUgAigCGCIFBEAgByAFQQFqNgIwQdjgCkGvtQEgB0EwahCmBQtB2OAKQS4QxwMgAigCNCIIEDsgCGoiBiEFA0AgBS0AAEE6RgRAIAcgBUEBajYCJCAHIAVBf3MgBmo2AiBB2OAKQc6eAyAHQSBqEKYFIAUhBgsgBSAIRyAFQQFrIQUNAAsgByAINgIUIAcgBiAIazYCEEHY4ApBpjYgB0EQahCmBSACQdjgChCkBSIFNgIgCyAFBEAgAiAFQZoXEKQEIgU2AiQgBQ0BIAIoAgwoAhAhBSACKAIgIQYgB0GAjAsoAgAQczYCBCAHIAY2AgBBnoYEIAcgBREDAAwCCyACQcD4CCgCADYCJAtBACACLQCZAUEEcUUNARpBh+QEQQAgAigCDCgCEBEDAAtBAQshBSAHQUBrJAACQCAFDQBBACEEIApFDQAgCigCACIFRQ0AIAIgBREBAAsgBA0BIAAgAjYCuAELIAJBgKIKNgJoIAJBADYCCAJAIAIoAgAiBC0AnAJBAUYEQCACIAQpA9ABNwPwASACIAQpA9gBNwP4AQwBCyACKAI4QawCRgRAIAIgAigCRCsDCCIOOQP4ASACIA45A/ABDAELIAJCgICAgICAgIjAADcD8AEgAkKAgICAgICAiMAANwP4AQsCQCAELQCdAkEBRgRAIAIgBCkDwAE3A6ADIAIgBCkDyAE3A6gDDAELIAIoAjgiBUEeS0EBIAV0QZiAgIMEcUVyRQRAIAJCgICAgICAgKHAADcDoAMgAkKAgICAgICAocAANwOoAwwBCyAFQawCRgRAIAIgAigCVCIFKQMINwOgAyACIAUpAxA3A6gDDAELIAJCADcDoAMgAkIANwOoAwsCQCABKAIQKAIIKwMYIg5EAAAAAAAAAABiBEAgAiAOOQOwAyACIA45A7gDDAELAkAgBCgCuAEiBUUNACAFLQCAAUEBRw0AIAIgBSkDcDcDsAMgAiAFKQN4NwO4AwwBCyACKAI4QawCRgRAIAIgAigCVCIFKQMoNwOwAyACIAUpAzA3A7gDDAELIAJCgICAgICAgKzAADcDsAMgAkKAgICAgICArMAANwO4AwsgBCsD+AEhFCAEKwOAAiETIAQrA4gCIRUgAiAEKwOQAiIWIAIrAPgBIg6gIhA5A+gBIAIgFSACKwDwASIRoCISOQPgASACIBMgDqEiDjkD2AEgAiAUIBGhIhE5A9ABIANCgICAgICAgPg/NwPoAyAQIA6hIRAgEiARoSERRAAAAAAAAPA/IQ4CQCABKAIQKAIIIgUrA0AiEkT8qfHSTWJQP2RFDQAgBSsDSCIPRPyp8dJNYlA/ZEUNACASIBIgESARRPyp8dJNYlA/ZRsiEWMgDyAPIBAgEET8qfHSTWJQP2UbIhBjckUEQCAPIBBkRSARIBJjRXINASAFLQBQQQFxRQ0BCyADIBIgEaMgDyAQoxAqIg45A+gDCyADIBYgE6BEAAAAAAAA4D+iOQO4AyADIBUgFKBEAAAAAAAA4D+iOQOwAyACIAQoApgCNgLoAiADIA4gEKI5A5gDIAMgDiARojkDkAMgAUHSGxAmIgQEQCADIAQQO0EBahCIAyIFNgKMASADIAk2AoQBIAMgA0HoA2o2AogBIAMgA0GQA2o2AoABAkAgBEGEsAMgA0GAAWoQTkEERgRAIAEoAkggBUEAEI4BIgRFDQEgAyAEKAIQIgQpAxg3A7gDIAMgBCkDEDcDsAMMAQsgA0EAOgDnAyADIAk2AmQgAyAFNgJsIAMgA0HnA2o2AnAgAyADQZADajYCYCADIANB6ANqNgJoIARB2MMBIANB4ABqEE5BBEYEQCABKAJIIAVBABCOASIERQ0BIAMgBCgCECIEKQMYNwO4AyADIAQpAxA3A7ADDAELIAMgCzYCUCADIAk2AkQgAyADQbADajYCTCADIANB6ANqNgJIIAMgA0GQA2o2AkAgBEHniQEgA0FAaxBOGgsgBRAYIAMrA+gDIQ4LIAIgAykDkAM3A/ACIAIgAykDmAM3A/gCIAIgDjkD4AIgAiADKQOwAzcD0AIgAiADKQO4AzcD2AIgAisD8AIiDiACKwP4AiIQIAIoAugCIgQbIRIgECAOIAQbIQ4gAisDqAMhESACKwOgAyEQAkACQCACKAIAIgYtAJ4CQQFHDQAgAi0AmAFBIHFFDQAgBisD6AEgESARoKEhDwJAIAIgBisD4AEgECAQoKEiFEQtQxzr4jYaP2MEf0EBBSACAn8gDiAUoyITmUQAAAAAAADgQWMEQCATqgwBC0GAgICAeAsiBDYCpAEgDiAEtyAUoqFELUMc6+I2Gj9kRQ0BIARBAWoLIgQ2AqQBCwJAIAIgD0QtQxzr4jYaP2MEf0EBBSACAn8gEiAPoyITmUQAAAAAAADgQWMEQCATqgwBC0GAgICAeAsiBTYCqAEgEiAFtyAPoqFELUMc6+I2Gj9kRQ0BIAVBAWoLIgU2AqgBCyACIAQgBWw2AswBIBIgDxAqIRIgDiAUECohDgwBCwJ8IAIoAkRFBEBEAAAAAAAAAAAhD0QAAAAAAAAAAAwBCyACKAJUIgQrAxggBCsDICARIBGgoUQAAAAAAAAAABAiIQ8gECAQoKFEAAAAAAAAAAAQIgsgAkEBNgLMASACQoGAgIAQNwKkASAPIBIQIiEPIA4QIiEUCyACQgA3AqwBIAJCADcCtAEgAkIANwK8ASACAn8gECAQoCAUoCACKwOwA6JEAAAAAAAAUkCjIhNEAAAAAAAA4D9EAAAAAAAA4L8gE0QAAAAAAAAAAGYboCITmUQAAAAAAADgQWMEQCATqgwBC0GAgICAeAs2AsADIAICfyARIBGgIA+gIAIrA7gDokQAAAAAAABSQKMiE0QAAAAAAADgP0QAAAAAAADgvyATRAAAAAAAAAAAZhugIhOZRAAAAAAAAOBBYwRAIBOqDAELQYCAgIB4CzYCxAMgA0GwA2oiBCACIAYoArwBLAAAEIkJIAIgAykDsAM3ArQBIAQgAiAGKAK8ASwAARCJCSACIAMpA7ADIhc3ArwBAkAgAigCtAEgF6dqIgQgBEEfdSIEcyAEa0EBRgRAIAIoArgBIBdCIIinaiIEIARBH3UiBHMgBGtBAUYNAQsgAkIBNwK8ASACQoCAgIAQNwK0ASADIAYoArwBNgIwQY28BCADQTBqECsLRAAAAAAAAAAAIRMCfEQAAAAAAAAAACABKAIQKAIILQBSQQFHDQAaIBQgDqFEAAAAAAAA4D+iRAAAAAAAAAAAIA4gFGMbIRNEAAAAAAAAAAAgDyASZEUNABogDyASoUQAAAAAAADgP6ILIRUCQCACKALoAiIERQRAIBAhFCARIRAgDiEPIBIhDiAVIREgEyEVDAELIBEhFCASIQ8gEyERCyACIBAgEaAiEDkDiAMgAiAUIBWgIhE5A4ADIAIgDiAQoCISOQOYAyACIA8gEaAiFDkDkAMgAiAOIAIrA+ACIg6jOQPIAiACIA8gDqM5A8ACIAICfyARIAIrA7ADIg6iRAAAAAAAAFJAoyIPRAAAAAAAAOA/RAAAAAAAAOC/IA9EAAAAAAAAAABmG6AiD5lEAAAAAAAA4EFjBEAgD6oMAQtBgICAgHgLIgU2AsgDIAICfyAQIAIrA7gDIg+iRAAAAAAAAFJAoyITRAAAAAAAAOA/RAAAAAAAAOC/IBNEAAAAAAAAAABmG6AiE5lEAAAAAAAA4EFjBEAgE6oMAQtBgICAgHgLIgY2AswDIAICfyASIA+iRAAAAAAAAFJAoyIPRAAAAAAAAOA/RAAAAAAAAOC/IA9EAAAAAAAAAABmG6AiD5lEAAAAAAAA4EFjBEAgD6oMAQtBgICAgHgLIgc2AtQDIAICfyAUIA6iRAAAAAAAAFJAoyIORAAAAAAAAOA/RAAAAAAAAOC/IA5EAAAAAAAAAABmG6AiDplEAAAAAAAA4EFjBEAgDqoMAQtBgICAgHgLIgg2AtADIAQEQCACIBQ5A5gDIAIgEjkDkAMgAiAROQOIAyACIBA5A4ADIAIgB60gCK1CIIaENwPQAyACIAatIAWtQiCGhDcDyAMLIAItAJgBQYABcUUEQCACIAEQkgkLQejkCiACNgIACwJAIAAoApwBIgQoAgQiAkUNACACKAI0DQAgAiAEKAI0NgI0CyAAIAI2ApwBDAALAAtBu6QDQbK9AUGsCEGXuAEQAAALQeeVA0GyvQFBrAhBl7gBEAAAC0HzzQFBsr0BQc4IQY0tEAAAC0GllwNBsr0BQcEdQbPEARAAAAsgA0HwA2okACACCzAAIAAoAghFBEBB4aEDQbK9AUGQBkGDHxAAAAsgACgCACAAKAIEIAAoAgxwQQR0aguzAQECfyMAQZABayICJAACQCAAEJMJBEAgASgCEEEBRgRAIAFBADYCECABIAApAwA3AwAgASAAKQMINwMICyACIAApADg3A1ggAiAAKQAwNwNQQRgQiAMiAEEANgIQIAAgAikDUDcDACAAIAIpA1g3AwggASAANgIQDAELIAIgAEQAAAAAAADgPyACQdAAaiIAIAJBEGoiAxClASADIAAgARC0BhC0BiEACyACQZABaiQAIAALWwEDf0HA4gooAgAiAUUEQEHA4gpBpKIKQazwCSgCABCXASIBNgIACyABIABBBCABKAIAEQQAIgFFBEBBwOIKKAIAIgIoAgAhAyACIAAQZEEBIAMRBAAaCyABRQtHAQR/IAFBEBBKIQMDfyABIAJGBH8gAwUgAyACQQR0aiIEIAAgAkEYbGoiBSsDADkDACAEIAUrAwg5AwggAkEBaiECDAELCwubAQEFfyMAQRBrIgMkACACQf2KARAmIQQgAkGC3gAQJiEFIAJBxSMQJiEGIANCADcDCCADQgA3AwAgAQR/IAEoAgAFQQALIQECQCAEBEAgBC0AAA0BCyACQfbTARAmIQQLIAAgAiADELwGIQcgACABIAQgBQR/IAUgAhCHBAVBAAsiASAGIAcgAhCZCRogARAYIAMQZSADQRBqJAAL7AECBXwBf0EBIAIgAkEBTRshCSABKwMIIgUhBiABKwMAIgchCEEBIQIDQCACIAlGRQRAAkAgCCABKwMYIgRkBEAgBCEIDAELIAQgB2RFDQAgBCEHCwJAIAYgASsDICIEZARAIAQhBgwBCyAEIAVkRQ0AIAQhBQsgAUEYaiEBIAJBAWohAgwBCwsgACAHOQMQIAAgCDkDACAAIAU5AxggACAGOQMIIAMgAysDECAIECIgBxAiOQMQIAMgAysDGCAGECIgBRAiOQMYIAMgAysDACAIECogBxAqOQMAIAMgAysDCCAGECogBRAqOQMIC+IDAgN/BHwjAEHwAGsiBCQAIAAoAhArA6ABIQkgAiAEQeAAahDnBCIGQQFrQQJPBEBBMCECIARB0ABqIQUCQCADBEAgBCABKQMgNwMgIAQgASkDKDcDKCAEIAEpAzg3AzggBCABKQMwNwMwIAQgASkDCDcDSCAEIAEpAwA3A0BBECECDAELIAQgASkDADcDICAEIAEpAwg3AyggBCABKQMYNwM4IAQgASkDEDcDMCAEIAEpAyg3A0ggBCABKQMgNwNACyAFIAEgAmoiASkDADcDACAFIAEpAwg3AwggBCsDMCEKIAQgBCsDICIIOQMwIAQgCDkDQCAJRAAAAAAAAOA/ZARAIABEAAAAAAAA4D8QgwILIAogCKEhCEEAIQEgBCgCaCECA0ACQCABIAJGDQAgBEEIaiAEQeAAaiABEJUCIAQoAggiA0UNACAEKwMQIgdEAAAAAAAAAABlBEAgAUEBaiEBDAIFIAAgAxBdIAQgCiAIIAeiIAQrAyCgIAFBAWoiASACRhsiBzkDQCAEIAc5AzAgACAEQSBqQQRBARBEIAQgBCsDMCIHOQNQIAQgBzkDIAwCCwALCyAJRAAAAAAAAOA/ZARAIAAgCRCDAgsgBEHgAGoQiwQLIARB8ABqJAAgBgsVACAAIAFBGEGaKUGdA0GyvQEQjwULcwEBfyAAECQgABBHTwRAIABBARD5AwsgABAkIQECQCAAECgEQCAAIAFqQQA6AAAgACAALQAPQQFqOgAPIAAQJEEQSQ0BQbi7A0GaggFBnQJBmbYBEAAACyAAKAIAIAFqQQA6AAAgACAAKAIEQQFqNgIECwvwAQEDfyMAQSBrIgQkACAAKAIAKAKgASIFKAIQKAIIKAJcIQMgACACEJgJAkACQCABQemsARAmIgBFDQAgAC0AAEUNACACIAAQwwMMAQsgASAFRiIFIANFckUEQCAEIAM2AhAgAkH1xwEgBEEQahCAAQtBACEAQQAhAwJAAkACQAJAIAEQjgIOAwABAgMLQcj+AEG1GSAFGyEDIAEoAgBBBHYhAAwCCyABKAIAQQR2IQBBo6QBIQMMAQsgASgCAEEEdiEAQfOhASEDCyAEIAA2AgQgBCADNgIAIAJBkKwBIAQQgAELIAIQwgMgBEEgaiQAC6sSAw5/C3wBfiMAQYABayIEJAAgACsD4AIhECABKwMIIREgASsDACESIAAoAgAoAqABIQggACsDgAQhFAJ/IAAoAugCBEAgESAQIAArA5AEoqMgACsD+AOhIRMgEpohESAAQYgEagwBCyASIBAgACsDiASioyAAKwP4A6EhEyAAQZAEagsrAwAhFSAEIBNEAAAAAAAA8D8gEKMiEqA5A3AgBCATIBKhOQNgIAQgESAQIBWioyAUoSIQIBKgOQN4IAQgECASoTkDaCAIEBshAwJAA0AgAwRAIAggAxAtIQEDQCABBEAgBCAEKQN4NwNYIAQgBCkDcDcDUCAEIAQpA2g3A0ggBCAEKQNgNwNAAn8gBEFAayEFQQAhCiMAQbACayICJAACQAJ/AkAgASgCECIGKAIIIglFDQAgCSsAGCAFKwMAZkUNACAFKwMQIAkrAAhmRQ0AIAkrACAgBSsDCGZFDQAgBSsDGCAJKwAQZkUNAAJAA0AgCiAJKAIETw0BIAkoAgAhBiACIAUpAxg3A4gCIAIgBSkDEDcDgAIgAiAFKQMINwP4ASACIAUpAwA3A/ABIAJBwAFqIAYgCkEwbGpBMBAfGiACKALEASIMRQ0EIAIgAigCwAEiCykDCDcDqAIgAiALKQMANwOgAkEBIQYCQANAIAYgDEcEQCACIAsgBkEEdGoiBykDCDcDmAIgAiAHKQMANwOQAiACIAcpAwg3A7gBIAcpAwAhGyACIAIpA6gCNwOoASACIAIpA/gBNwOIASACIAIpA4ACNwOQASACIAIpA4gCNwOYASACIBs3A7ABIAIgAikDoAI3A6ABIAIgAikD8AE3A4ABAn9BACEHIAIrA4ABIhMgAisDsAEiEGUiDUUgECACKwOQASISZUVyRQRAIAIrA7gBIhEgAisDiAFmIBEgAisDmAFlcSEHCwJAAkAgEyACKwOgASIUZSIOIBIgFGZxRQRAIAdFDQEMAgsgByACKwOoASIRIAIrA4gBZiARIAIrA5gBZXEiD0cNASAHIA9xRQ0AQQEMAgsgAisDuAEhEQJAAkAgECAUYQRAIA1FDQEgAisDiAEiEyACKwOoAWUgESATZnNFDQEgECASZQ0DDAELIAIrA6gBIhYgEWEEQCAOIBAgE2ZGDQEgAisDiAEgEWVFDQEgESACKwOYAWUNAwwBCyAQIBQQKiEYIAIrA5gBIRVBACEHIBMgEKEgFiARoSAUIBChoyIZoiARoCIaIAIrA4gBIhdmRSATIBhmRSAQIBQQIiIUIBNmRXJyRSAVIBpmcQ0BIBIgGGZFIBcgEiAToSAZoiAaoCIYZUUgFSAYZkVyckUgEiAUZXENASARIBYQIiEUIBEgFhAqIhYgF2VFIBMgECAXIBGhIBmjoCIQZUUgECASZUVyckUgFCAXZnENASAVIBZmRSATIBAgFSAXoSAZo6AiEGVFIBAgEmVFcnINACAUIBVmDQELQX8hBwsgBwwBC0EAC0F/Rw0CIAIgAikDmAI3A6gCIAIgAikDkAI3A6ACIAZBAWohBgwBCwsgAigCyAEEQCACIAIpA9gBNwN4IAIgAikD0AE3A3AgAiALKQMINwNoIAspAwAhGyACIAIpA/gBNwNIIAIgAikDgAI3A1AgAiACKQOIAjcDWCACIBs3A2AgAiACKQPwATcDQCACQfAAaiACQeAAaiACQUBrEKAKDQELIAIoAswBBEAgAiACKQPoATcDOCACIAIpA+ABNwMwIAIgAigCwAEgAigCxAFBBHRqQRBrIgYpAwg3AyggBikDACEbIAIgAikD+AE3AwggAiACKQOAAjcDECACIAIpA4gCNwMYIAIgGzcDICACIAIpA/ABNwMAIAJBMGogAkEgaiACEKAKDQELIApBAWohCgwBCwtBAQwCCyABKAIQIQYLAkAgBigCYCIGRQ0AIAUrAxAgBisAOCIQIAYrAxhEAAAAAAAA4D+iIhGhZkUNACAFKwMAIBEgEKBlRQ0AIAUrAxggBisAQCIQIAYrAyBEAAAAAAAA4D+iIhGhZkUNAEEBIAUrAwggESAQoGUNARoLQQALIAJBsAJqJAAMAQtBi44BQfq9AUG1CkHQPBAAAAsNBCAIIAEQMCEBDAELCyAIIAMQHCEDDAELCyAIKAIsIgFBAEGAAiABKAIAEQQAIgEEfyABKAIQBUEACyEBA0AgAQRAIAQgBCkDeDcDOCAEIAQpA3A3AzAgBCAEKQNoNwMoIAQgBCkDYDcDIEEAIQUjAEHwAGsiAyQAAkAgBCsDMCIQIAEoAhAiAisDMGZFDQAgBCsDICIRIAIrA0BlRQ0AIAQrAzgiEyACKwM4ZkUNACAEKwMoIhIgAisDSGVFDQAgAisAECEUIAMgAisAGCASIBOgRAAAAAAAAOA/oqE5A2ggAyAUIBAgEaBEAAAAAAAA4D+ioTkDYCADQRhqIgVBAEHIABAzGiADIAE2AhggAigCCCgCBCgCDCECIAMgAykDaDcDECADIAMpA2A3AwggBSADQQhqIAIRAAAhBQsgA0HwAGokACAFDQJBACEDAkAgCCABEOUBIgFFDQAgCCgCLCICIAFBECACKAIAEQQAIgFFDQAgASgCECEDCyADIQEMAQsLIAQgBCkDeDcDGCAEIAQpA3A3AxAgBCAEKQNoNwMIIAQgBCkDYDcDACAIIAQQmgkiASAIIAEbIQELIAAoAsAEIgMgAUcEQAJAIANFDQACQAJAAkAgAxCOAg4DAAECAwsgAygCECIDIAMtAHBB/gFxOgBwDAILIAMoAhAiAyADLQCFAUH+AXE6AIUBDAELIAMoAhAiAyADLQB0Qf4BcToAdAsgAEEANgLIBCAAIAE2AsAEAkAgAUUNAAJAAkACQAJAIAEQjgIOAwABAgQLIAEoAhAiAyADLQBwQQFyOgBwIAFBAEGC3gBBABAhIgMNAgwDCyABKAIQIgMgAy0AhQFBAXI6AIUBIAEQL0EBQYLeAEEAECEiAw0BDAILIAEoAhAiAyADLQB0QQFyOgB0IAFBUEEAIAEoAgBBA3FBAkcbaigCKBAvQQJBgt4AQQAQISIDRQ0BCyAAIAEgAxBBIAEQgwE2AsgECyAAQQE6AJkECyAEQYABaiQAC7kCAgN/AnwjAEEwayIEJAAgASABKAJIIAEoAkwiBUEBaiAFQQJqQTgQkQEiBTYCSCAFIAEoAkwiBkE4bGoiBSADOgAwIAUgAjYCAAJ8AkAgAkUNACACLQAARQ0AIARCADcDKCAEQgA3AyAgBEIANwMYIARCADcDECAEIAEoAgQ2AhAgBCABKwMQOQMgIAUgACgCiAEiAiAEQRBqQQEgAigCABEEADYCBCAEIAAgBRCAByAEKwMIIQcgASgCTCEGIAQrAwAMAQsgBQJ/IAErAxBEMzMzMzMz8z+iIgiZRAAAAAAAAOBBYwRAIAiqDAELQYCAgIB4C7ciBzkDKEQAAAAAAAAAAAshCCABIAZBAWo2AkwgASAHIAErAyCgOQMgIAEgASsDGCIHIAggByAIZBs5AxggBEEwaiQACxMAIAAgAUG/JEH8AEHMggEQxgELrgEBBH8gACgCACECAkACQAJAAkAgACgCBEEBaw4DAAIBAgsgAkHUAGohBQJAIAIoAnBBf0YEQCAFEKwJDAELIAIoAlQhAyACKAJoEBggAigCbBAYA0AgAygCACIEBEAgBEHYAGpBABDABiAEEOoEIAQQGCADQQRqIQMMAQsLIAUoAgAQGAsgAhDqBCACEBgMAgsgAigCIBAYIAIQGAwBCyACEK0JCyABBEAgABAYCws2AQF/IwBBIGsiAyQAIAMgAjkDGCADIAE5AxAgACADQQhqQQQgACgCABEEACADQSBqJABBAEcLiAEBBH8CQCAABEADQCACIAAoAghPDQIgACgCACAAKAIEIAJqIAAoAgxwQQV0aiIBKAIEIQQgASgCACEDQQAhAQNAIAEgBEZFBEAgAyABQThsaigCABAYIAFBAWohAQwBCwsgAxAYIAJBAWohAgwACwALQfrUAUGJEkE1QYc/EAAACyAAQgA3AgQLVQEBfwJAIAAEQANAIAEgACgCCE8NAiAAKAIAIAAoAgQgAWogACgCDHBBOGxqKAIAEBggAUEBaiEBDAALAAtB+tQBQYkSQSxBiD8QAAALIABCADcCBAtbAQN/IAAoAgAiAAR/AkAgACgCqAIiAUUNACABIAAoArACIgJJDQAgACgCnAEiAyACIAEgAEGwA2ogAygCMBEIACAAIAAoAqgCNgKwAgsgACgCsANBAWoFQQALC9sDAQR/IwBBEGsiBSQAIAAgATYCqAIgAEHcATYCoAICQAJAAkADQCAFQQA2AgwgACAAKAKcASIEIAEgAiAFQQxqIAQoAgARBgAiByABIAUoAgxBlC5BABCXAkUEQCAAENoCQSshBAwECyAAIAUoAgwiBjYCrAJBCSEEAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgB0ELaw4FAhADEAEACwJAIAdBBGoOBQcQBgUMAAsgB0FxRw0PIAMgACgCXAR/IAAgACgCnAEgASAGEIgBIAAoAvgDQQJGDQ8gBSgCDAUgBgs2AgBBACEEDA8LIAAoAlxFDQIgACAAKAKcASABIAYQiAEMAgsgACAAKAKcASABIAYQywYNAQwLCyAAIAAoApwBIAEgBhDMBkUNCgsgACgC+ANBAWsOAwUEAwYLIAAtAPwDRQ0BQQUhBAwKCyAALQD8A0UNAEEGIQQMCQsgAyABNgIAQQAhBAwICyAAIAUoAgwiADYCqAIgAyAANgIAQQAhBAwHCyAAIAUoAgw2AqgCDAULIAAtAMAERQ0AQRchBAwFCyAAIAUoAgwiATYCqAIMAQsLIAAgBjYCqAJBBCEEDAILQQEhBAwBC0EjIQQLIAVBEGokACAEC5UBAgV+AX8gACkDECEEIAApAxghAiAAKQMAIQUgACkDCCEDA0AgASAHRkUEQCACIAR8IgQgAyAFfCIFIANCDYmFIgN8IgYgA0IRiYUhAyAEIAJCEImFIgJCFYkgAiAFQiCJfCIFhSECIAZCIIkhBCAHQQFqIQcMAQsLIAAgAjcDGCAAIAU3AwAgACADNwMIIAAgBDcDEAueAQIEfwF+IABBIGohBSAAQShqIQMgASACaiEEA0AgAygCACICIANPIAEgBE9yRQRAIAEtAAAhBiADIAJBAWo2AgAgAiAGOgAAIAFBAWohAQwBCyACIANPBEAgACAAKQMgIgcgACkDGIU3AxggAEECEMYGIAAgBTYCKCAAIAcgACkDAIU3AwAgACAAKQMwQgh8NwMwIAEgBEkNAQsLIAALzx8BD38jAEEwayIIJAAgCCADNgIsIAAoAvwCIRICfyAAKAKcASACRgRAIABBqAJqIQ4gAEGsAmoMAQsgACgCtAIiDkEEagshEyAOIAM2AgAgEkHQAGohFCAAQbgDaiENIAhBJWohFQJAAkADQCAIIAgoAiwiAzYCKAJ/AkACQCACIAMgBCAIQShqIAIoAgQRBgAiA0EFaiILDgMAAQABCyAIKAIsIgogBCAGGwwBCyAIKAIsIQogCCgCKAshCSAAIAMgCiAJQZoXIAcQlwJFBEAgABDaAkErIQoMAwsgEyAIKAIoIgM2AgBBESEKAkAgCAJ/AkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAsOEwwBAAQDAgYGBwcIDgoLBQkPHxARCyAGBEAgBSAIKAIsNgIAQQAhCgwfCyATIAQ2AgACQCAAKAJIIgMEQCAIQQo6AAwgACgCBCAIQQxqQQEgAxEFAAwBCyAAKAJcRQ0AIAAgAiAIKAIsIAQQiAELIAFFDR0gACgC0AIgAUYNDAwbCyAGBEAgBSAIKAIsNgIAQQAhCgweCyABQQBMDRwgACgC0AIgAUcNGiAFIAgoAiw2AgBBACEKDB0LIA4gAzYCAEEEIQoMHAsgBkUEQEEFIQoMHAsgBSAIKAIsNgIAQQAhCgwbCyAGRQRAQQYhCgwbCyAFIAgoAiw2AgBBACEKDBoLIAggAiACKAJAIgkgCCgCLGogAyAJayACKAIsEQQAIgM6ACQgA0H/AXEEQCAAQQkgCEEkaiIJIBVB3BdBARCXAhogACgCSCIDBEAgACgCBCAJQQEgAxEFAAwTCyAAKAJcRQ0SIAAgAiAIKAIsIAgoAigQiAEMEgtBASEKIBQgAiACKAJAIgMgCCgCLGogCCgCKCADaxCHASIDRQ0ZIAAgEiADQQAQmgEhCyASIBIoAmA2AlwCQAJAIBItAIEBBEAgEi0AggFFDQELIAtFBEBBCyEKDBwLIAstACMNAUEYIQoMGwsgCw0AIAAoAoQBIgkEQCAAKAIEIANBACAJEQUADBMLIAAoAlxFDRIgACACIAgoAiwgCCgCKBCIAQwSCyALLQAgBEBBDCEKDBoLIAsoAhwEQEEPIQoMGgsgCygCBARAIAAtAMwCDQ0gACgChAEiAwRAIAAoAgQgCygCAEEAIAMRBQAMEwsgACgCXEUNEiAAIAIgCCgCLCAIKAIoEIgBDBILIAAoAnwEQCALQQE6ACACQCAAKAL8AiIPKAKcASIMRQ0AIAAoAsQDIgMgACgCwANGBEAgDRBfRQ0QIAAoAsQDIQMLIAAgA0EBajYCxAMgA0E9OgAAQQAhAyAPKAKcASgCFCAALQDwA0EAR2siCUEAIAlBAEobIRADQCADIBBGDQEgACgCxAMiCSAAKALAA0YEQCANEF9FDREgACgCxAMhCQsgDygCnAEoAhAgA2otAAAhESAAIAlBAWo2AsQDIAkgEToAACADQQFqIQMMAAsACyAIIA8oAjwiAzYCDCAMRSEJIAggAwR/IAMgDygCREECdGoFQQALNgIQA0AgCEEMahDWBiIQBEAgECgCBEUNASAJRQRAIAAoAsQDIgMgACgCwANGBEAgDRBfRQ0SIAAoAsQDIQMLIAAgA0EBajYCxAMgA0EMOgAACyAQKAIAIQwDQAJAIAAoAsADIQkgACgCxAMhAyAMLQAAIhFFDQAgAyAJRgRAIA0QX0UNEyAMLQAAIREgACgCxAMhAwsgACADQQFqNgLEAyADIBE6AAAgDEEBaiEMDAELCyADIAlGBEAgDRBfRQ0RIAAoAsQDIQMLIAAgA0EBajYCxAMgA0E9OgAAQQAhCSAQKAIEKAIUIAAtAPADQQBHayIDQQAgA0EAShshEUEAIQMDQCADIBFGDQIgACgCxAMiDCAAKALAA0YEQCANEF9FDRIgACgCxAMhDAsgECgCBCgCECADai0AACEWIAAgDEEBajYCxAMgDCAWOgAAIANBAWohAwwACwALCyAIIA8oAgAiAzYCDCAIIAMEfyADIA8oAghBAnRqBUEACzYCEANAIAhBDGoQ1gYiAwRAIAMtACBFDQEgCUUEQCAAKALEAyIJIAAoAsADRgRAIA0QX0UNEiAAKALEAyEJCyAAIAlBAWo2AsQDIAlBDDoAAAsgAygCACEDA0AgAy0AACIMRQRAQQAhCQwDCyAAKALEAyIJIAAoAsADRgRAIA0QX0UNEiADLQAAIQwgACgCxAMhCQsgACAJQQFqNgLEAyAJIAw6AAAgA0EBaiEDDAALAAsLIAAoAsQDIgMgACgCwANGBEAgDRBfRQ0PIAAoAsQDIQMLIAAgA0EBajYCxAMgA0EAOgAAIAAoAsgDIQMgC0EAOgAgIANFDRogACgCgAEgAyALKAIUIAsoAhAgCygCGCAAKAJ8EQcARQRAQRUhCgwbCyAAIAAoAsgDNgLEAwwSCyAAKAJcRQ0RIAAgAiAIKAIsIAgoAigQiAEMEQsCQCAAKAKIAyIDBEAgACADKAIANgKIAwwBC0EBIQpBMCAAKAIMEQIAIgNFDRkgA0EgIAAoAgwRAgAiCTYCJCAJRQRAIAMgACgCFBEBAAwaCyADIAlBIGo2AigLIANBADYCLCADIAAoAoQDNgIAIAAgAzYChAMgA0IANwIQIAMgCCgCLCACKAJAaiIJNgIEIAMgAiAJIAIoAhwRAAA2AgggACAAKALQAkEBajYC0AIgAygCCCAIIAMoAgQiCjYCJCADQQxqIQsgA0EsaiEQIApqIQ8gAygCKCEMIAMoAiQhCgNAAkAgCCAKNgIMIAIgCEEkaiAPIAhBDGogDEEBayACKAI4EQcAIAgoAgwiESADKAIkIglrIQpBAUYgCCgCJCAPT3INACAJIAMoAiggCWtBAXQiDCAAKAIQEQAAIglFDQ8gAyAJNgIkIAMgCSAMaiIMNgIoIAkgCmohCgwBCwsgAyAKNgIYIAMgCTYCDCARQQA6AAAgACACIAgoAiwgCyAQIAcQzQkiCg0YIAAoAkAiAwRAIAAoAgQgCygCACAAKAKgAyADEQUADBALIAAoAlxFDQ8gACACIAgoAiwgCCgCKBCIAQwPCyACKAJAIQMgCCgCLCEJIAhBADYCJCAIIA0gAiADIAlqIgMgAiADIAIoAhwRAAAgA2oQhwEiAzYCDCADRQ0MIAAgACgCxAM2AsgDIAAgAiAIKAIsIAhBDGogCEEkakECEM0JIgoEQCAAIAgoAiQQzAkMGAsgACAAKALEAzYCyAMCQAJAIAAoAkAiA0UEQCAAKAJEIgMNASAAKAJcRQ0CIAAgAiAIKAIsIAgoAigQiAEMAgsgACgCBCAIKAIMIAAoAqADIAMRBQAgACgCRCIDRQ0BIAAoAkBFDQAgDiATKAIANgIAIAAoAkQhAwsgACgCBCAIKAIMIAMRAwALIA0QmQIgACAIKAIkEMwJIAAoAtACDQ8CQAJAIAAoAvgDQQFrDgMAEg8BCyAALQDABA0OCyAAIAgoAiggBCAFEMUGIQoMFwsgACgC0AIgAUYNEyAAKAKEAyEKAkAgAiAIKAIsIAIoAkBBAXRqIgMgAigCHBEAACIJIAooAghGBEAgCigCBCADIAkQ1gFFDQELIA4gAzYCAEEHIQoMFwsgACAKKAIANgKEAyAKIAAoAogDNgIAIAAgCjYCiAMgACAAKALQAkEBazYC0AICQCAAKAJEIgMEQAJAIAAtAPQBRQ0AIAooAhAiCUUNACAKKAIMIAooAhxqIQMDQCAJLQAAIgsEQCADIAs6AAAgA0EBaiEDIAlBAWohCQwBCwsCQCAALQD1AUUNACAKKAIUIglFDQAgAyAALQDwAzoAAANAIANBAWohAyAJLQAAIgtFDQEgAyALOgAAIAlBAWohCQwACwALIANBADoAACAAKAJEIQMLIAAoAgQgCigCDCADEQMADAELIAAoAlxFDQAgACACIAgoAiwgCCgCKBCIAQsDQCAKKAIsIgMEQCADIQkgCiAAKAJ0IgsEfyAAKAIEIAMoAgAoAgAgCxEDACAKKAIsBSAJCygCBDYCLCADIAAoApADNgIEIAAgAzYCkAMgAygCACADKAIINgIEDAELCyAAKALQAg0OAkACQCAAKAL4A0EBaw4DABEOAQsgAC0AwAQNDQsgACAIKAIoIAQgBRDFBiEKDBYLIAIgCCgCLCACKAIoEQAAIgNBAEgEQEEOIQoMFgsgACgCSCIJBEAgACgCBCAIQQxqIgwgAyAMEJIEIAkRBQAMDgsgACgCXEUNDSAAIAIgCCgCLCAIKAIoEIgBDA0LIAAoAkgiCQRAIAhBCjoADCAAKAIEIAhBDGpBASAJEQUADA0LIAAoAlxFDQwgACACIAgoAiwgAxCIAQwMCwJAIAAoAlQiCQRAIAAoAgQgCREBAAwBCyAAKAJcRQ0AIAAgAiAIKAIsIAMQiAELIAAgAiAIQShqIAQgBSAGIAcQygkiCg0TIAgoAigNCyAAQdsBNgKgAkEAIQoMEwsgBgRAIAUgCCgCLDYCAEEAIQoMEwsCQCAAKAJIIgMEQCACLQBERQRAIAggACgCODYCDCACIAhBLGogBCAIQQxqIAAoAjwgAigCOBEHABogACgCBCAAKAI4IgIgCCgCDCACayAAKAJIEQUADAILIAAoAgQgCCgCLCICIAQgAmsgAxEFAAwBCyAAKAJcRQ0AIAAgAiAIKAIsIAQQiAELIAFFBEAgDiAENgIADBILIAAoAtACIAFGDQAgDiAENgIADA8LIAUgBDYCAEEAIQoMEQsgACgCSCIJBEAgAi0AREUEQANAIAggACgCODYCDCACIAhBLGogAyAIQQxqIAAoAjwgAigCOBEHACATIAgoAiw2AgAgACgCBCAAKAI4IgogCCgCDCAKayAJEQUAQQFNDQsgDiAIKAIsNgIAIAgoAighAwwACwALIAAoAgQgCCgCLCIKIAMgCmsgCREFAAwJCyAAKAJcRQ0IIAAgAiAIKAIsIAMQiAEMCAsgACACIAgoAiwgAxDLBg0HDAQLIAAgAiAIKAIsIAMQzAZFDQMMBgsgACgCXEUNBSAAIAIgCCgCLCADEIgBDAULIAAgC0EAQQAQ8gRFDQQMDAsgC0EAOgAgDAsLQQEhCgwKCyAAQdwBNgKgAgwBCyANEJkCCwJAIAAoAvgDQQFrDgMCAQADCyAOIAgoAigiADYCACAFIAA2AgBBACEKDAcLIA4gCCgCKDYCAEEjIQoMBgsgCCgCKCIDIAAtAMAERQ0BGiAFIAM2AgBBACEKDAULIAgoAigLIgM2AiwgDiADNgIADAELC0ENIQoMAQtBAyEKCyAIQTBqJAAgCgucAQIBfwJ+IwBB0ABrIgIkACAAIAJBCGoQ0AkgAkIANwNIIAIgAkE4ajYCQCACIAIpAwgiA0L1ys2D16zbt/MAhTcDGCACIAIpAxAiBELzytHLp4zZsvQAhTcDMCACIANC4eSV89bs2bzsAIU3AyggAiAEQu3ekfOWzNy35ACFNwMgIAJBGGogASABEM8JEMcGEM4JIAJB0ABqJACnC24BAX8gAEEAEPEEIgAoAvQDRQRAIAAgACgCsARBAWo2ArAEIAAgACgCtARBAWoiAzYCtAQgAyAAKAK4BCIDSwRAIAAgA0EBajYCuAQLIAAgAUHLzwMgAhDSCQ8LQf07QevBAUHGwABB2OkAEAAAC6oBAQN/AkAgACgCTEUEQEEBIQQgACgCXEUNASAAIAEgAiADEIgBQQEPCyAAQbgDaiIFIAEgAiABKAJAQQF0aiICIAEgAiABKAIcEQAAIAJqIgIQhwEiBkUNACAAIAAoAsQDNgLIAyAFIAEgASACIAEoAiARAAAgAyABKAJAQQF0axCHASIBRQ0AIAEQ0QkgACgCBCAGIAEgACgCTBEFACAFEJkCQQEhBAsgBAtsAQF/AkAgACgCUEUEQCAAKAJcRQ0BIAAgASACIAMQiAFBAQ8LIABBuANqIgQgASACIAEoAkAiAUECdGogAyABQX1sahCHASIBRQRAQQAPCyABENEJIAAoAgQgASAAKAJQEQMAIAQQmQILQQELaAECfwJAIAAoAvwCIgRB0ABqIAEgAiADEIcBIgJFDQAgACAEQRRqIAJBGBCaASIBRQ0AAkAgAiABKAIARwRAIAQgBCgCYDYCXAwBCyAEIAQoAlw2AmAgACABENUJRQ0BCyABIQULIAULOQACQCAAIAAoAvQDQQBHIAAoApwBIAEgAiADIAAtAPwDRUEAEMgGIgMNACAAENYJDQBBASEDCyADC5UBAQN/IAAiASEDA0ACfwJAAkACQAJAIAMtAAAiAkEKaw4EAQMDAQALIAJBIEYNACACRQ0BDAILIAAgACABRg0CGkEgIQIgAUEBay0AAEEgRw0BIAEMAgsgACABRwR/IAFBAWsiACABIAAtAABBIEYbBSAAC0EAOgAADwsgASACOgAAIAFBAWoLIANBAWohAyEBDAALAAtZAQJ/IwBBEGsiBCQAIAQgATYCDCAAKAKcASIFIAEgAiAEQQxqIAUoAgARBgAhBSAAIAAoApwBIAEgAiAFIAQoAgwgAyAALQD8A0VBAUEAEOEJIARBEGokAAsTACAAQYABc0ECdEH8sQhqKAIACywBAX8DQCAABEAgACgCBCAAKAIQIAEoAhQRAQAgACABKAIUEQEAIQAMAQsLC9QBAQZ/IAAoAhQgACgCDEECdGooAgAoAhwgACgCLGohASAAKAIkIQQgACgCUCECA0AgAiAESQRAIAItAAAiAwR/IANB8IYFai0AAAVBAQshAyABQQF0QfCIBWovAQAEQCAAIAI2AkQgACABNgJACwNAAkADQCABIAFBAXQiBUHQjgVqLgEAIANqQQF0IgZBsIoFai4BAEYNASAFQbCQBWouAQAiAUHdAEgNAAsgA0GQkgVqLQAAIQMMAQsLIAJBAWohAiAGQdCSBWouAQAhAQwBCwsgAQuXBgEIfyABKAIAIQUCQCADLQAAIgZFBEAgBQRAQRwPC0EBIQtBKCEHDAELQQEhC0EoIQcgBUUNACAFLQAAQfgARw0AIAUtAAFB7QBHDQAgBS0AAkHsAEcNACAFLQADIggEQCAIQe4ARw0BIAUtAARB8wBHDQEgBS0ABQ0BQScPC0EBIQpBACELQSYhBwtBASEIQQEhDEEAIQUCQANAIAZB/wFxIgkEQAJAIAhB/wFxRSAFQSRLckUEQCAJIAVB0K8Iai0AAEYNAQtBACEICwJAIAsgDHFFDQAgBUEdTQRAIAkgBUGAsAhqLQAARg0BC0EAIQwLAkAgAC0A9AFFDQAgCSAALQDwA0cNAEECIQYgCUEhaw5eAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAMAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAAMLIAMgBUEBaiIFai0AACEGDAELCyAHIQYgCiAFQSRGIAhB/wFxQQBHcUcNACAMRSAFQR1HckUEQEEoDwsgBSAALQDwA0EAR2ohBwJAIAAoApADIgUEQCAFKAIYIAdIBEBBASEGIAdB5////wdLDQMgBSgCECAHQRhqIgggACgCEBEAACIJRQ0DIAUgCDYCGCAFIAk2AhALIAAgBSgCBDYCkAMgBSgCECEIDAELQQEhBkEcIAAoAgwRAgAiBUUgB0Hn////B0tyDQEgBSAHQRhqIgYgACgCDBECACIINgIQIAhFBEAgBSAAKAIUEQEAQQEPCyAFIAY2AhgLIAUgBzYCFCAIIAMgBxAfGiAALQDwAyIGBEAgBSgCECAHakEBayAGOgAACyAFIAI2AgwgBSABNgIAIAUgASgCBDYCCCABAn8CQCADLQAADQAgASAAKAL8AkGYAWpHDQBBAAwBCyAFCzYCBCAFIAQoAgA2AgQgBCAFNgIAQQAhBiACRQ0AIAAoAnAiAkUNACAAKAIEIAEoAgAgA0EAIAEoAgQbIAIRBQALIAYLbgEDfyMAQRBrIgEkAAJAIAAQqwQiAgRAQYCMC0EANgIAIAFBADYCDCACIAFBDGpBChCoBCEAAkBBgIwLKAIADQAgAiABKAIMIgNGDQAgAy0AAEUNAgtBgIwLQQA2AgALQQAhAAsgAUEQaiQAIAALPgEEfyAAKAIAIQEgACgCBCEDA0AgASADRgRAQQAPCyAAIAFBBGoiBDYCACABKAIAIQIgBCEBIAJFDQALIAILvAICAX4CfyAABEAgACAAEDsiBEF4cWohAyAErSECA0AgAkKV08fetfKp0kZ+IQIgACADRkUEQCACIAApAABCldPH3rXyqdJGfiICQi+IIAKFQpXTx9618qnSRn6FIQIgAEEIaiEADAELCyACQoCAgICAgICAAUIAIAEbhSECAkACQAJAAkACQAJAAkACQCAEQQdxQQFrDgcGBQQDAgEABwsgAzEABkIwhiAChSECCyADMQAFQiiGIAKFIQILIAMxAARCIIYgAoUhAgsgAzEAA0IYhiAChSECCyADMQACQhCGIAKFIQILIAMxAAFCCIYgAoUhAgsgAiADMQAAhSECCyACQpXTx9618qnSRn4iAkIviCAChUKV08fetfKp0kZ+IgJCL4ggAoWnDwtBsdUBQce+AUGYAUHe/QAQAAALJAAgACABIAIQkwogACgCTCIAKAIIIAEgAiAAKAIAKAIIESEAC9EDAQF/AkAgASACRgRAIANBADYCAAwBCwJAAkAgACABIAIQ3QJBCWsiB0EXS0EBIAd0QZOAgARxRXINAANAIAAgASAAKAJAaiIBIAIQ3QJBCWsiB0EXTQRAQQEgB3RBk4CABHENAQsLIAEgAkYEQCADQQA2AgAMAwsgAyABNgIAAkACQAJAA0ACQCAAIAEgAhDdAiIHQQlrQQJJDQAgB0E9Rg0CIAdBDUYgB0EgRnINACAHQX9GDQUgASAAKAJAaiEBDAELCyAEIAE2AgADQCAAIAEgACgCQGoiASACEN0CIgRBCWsiB0EXSw0CQQEgB3RBk4CABHENAAsMAQsgBCABNgIADAELIARBPUcNAQsgASADKAIARg0AA0AgACABIAAoAkBqIgEgAhDdAiIDQQlrQQJJDQACQCADQSBrDgMBAgMACyADQQ1GDQALIANBJ0YNAQsgBiABNgIAQQAPCyAFIAEgACgCQGoiBDYCAANAIAMgACAEIAIQ3QIiAUcEQCABQTprQXVLIAFBX3FB2wBrQWVLciABQd8ARiABQS1rQQJJcnIEQCAEIAAoAkBqIQQMAgUgBiAENgIAQQAPCwALCyAGIAQgACgCQGo2AgALQQELEQAgACABIAJB2wBB2gAQ2QoLpgUBCn8gAEGghAhB7AIQHyEEQQAhAANAAkACQCAAQYABRgRAIARB9AJqIQggBEH0BmohCSAEQcgAaiEHQQAhAAJ/A0AgAEGAAkcEQAJAIAEgAEECdCIKaigCACIFQX9GBEAgACAHakEBOgAAIAggAEEBdGpB//8DOwEAIAkgCmpBATsBAAwBCyAFQQBIBEBBACACRSAFQXxJcg0EGiAAIAdqQQMgBWs6AAAgCSAKakEAOgAAIAggAEEBdGpBADsBAAwBCyAFQf8ATQRAIAVB6IQIai0AACIGRSAGQRxGckUgACAFR3ENBiAAIAdqIAY6AAAgCSAKaiIGIAU6AAEgBkEBOgAAIAggAEEBdGogBUF/IAUbOwEADAELIAUQkQRBAEgEQCAAIAdqQQA6AAAgCCAAQQF0akH//wM7AQAgCSAKakEBOwEADAELIAVB//8DSw0FAkBBASAFdCIMIAVBBXZBB3FBAnQiDSAFQQh2IgZBkIcIai0AAEEFdHJBoPoHaigCAHEEQCAAIAdqQRY6AAAMAQsgACAHaiELIAZBkIkIai0AAEEFdCANckGg+gdqKAIAIAxxBEAgC0EaOgAADAELIAtBHDoAAAsgCSAKaiIGIAUgBkEBahCSBDoAACAIIABBAXRqIAU7AQALIABBAWohAAwBCwsgBCACNgLsAiAEIAM2AvACIAIEQCAEQdQANgLoAiAEQdQANgLkAiAEQdQANgLgAiAEQdUANgLcAiAEQdUANgLYAiAEQdUANgLUAiAEQdYANgLQAiAEQdYANgLMAiAEQdYANgLIAgsgBEHXADYCPCAEQdgANgI4IAQLDwsgAEHohAhqLQAAIgZFIAZBHEZyDQEgASAAQQJ0aigCACAARg0BC0EADwsgAEEBaiEADAALAAtJAQF/IwBBEGsiASQAAkAgAEHL5QAQJiIARQ0AIAEgAUEIajYCACAAQYeKASABEE5BAEwNAEHA3QogASsDCDkDAAsgAUEQaiQAC3MBAn8CQCAAKAKYASICRQRAIAAQ/AQiAjYCnAEgACACNgKYAQwBC0Hc4QooAgAiA0UNACADKAIEIgINABD8BCECQdzhCigCACACNgIEC0Hc4QogAjYCACACIAA2AgAgAiABNgI0IABBAyABQQAQ3QNBAEcLCgAgAEHxDhCLCgtHAQF/A0AgASAAKAIwTkUEQCAAKAI4IAFBAnRqKAIAEN8GIAFBAWohAQwBCwsgACgCPBAYIAAoAjQQvQEgACgCOBAYIAAQGAtYAQF/QczhCigCAAR/A0BB0OEKKAIAIAFNBEBBAA8LQczhCigCACABQQJ0aigCACgCACAAEExFBEAgAUEBaiEBDAELC0HM4QooAgAgAUECdGooAgAFQQALC7kKARF/IwBBEGsiDyQAQcgAEFQhC0HU4QooAgAhBCAAKAIQKAJ4IQxBASEFA0ACQAJAAkACQCAELQAAIgpB3ABHBEAgCg0BDAQLIARBAWohByAELQABIgpB+wBrQQNJDQEgByEEIApB3ABGDQELAkACQAJAAkAgCkH7AGsOAwIBAAELIAlBAWshCQwCCyAKQfwARyAJcg0BIAVBAWohBUEAIQkMAwsgCUEBaiEJCyAJQQBIDQIMAQsgByEECyAEQQFqIQQMAQsLIAVBBBAZIQcgCyABOgBAIAsgBzYCOCADQQFqIREgAUEBcyESIANBAWshE0HU4QooAgAhBCACQX9zIRRBACEHIAMhAUEAIQJBACEFQQAhCQJAA0BBASEKAkACQAJAAkACQAJAAkACQAJAA0AgCkEBcUUNBiAELQAAIgZBAWtB/wFxQR5NBEBBASEKQdThCiAEQQFqIgQ2AgAMAQsCQAJAAkAgBkH7AGsOAwECAgALAkACQAJAIAZBPGsOAwEJAgALIAZFDQMgBkHcAEcNCCAELQABIgZB+wBrQQNJDQcgBkE8aw4DBwYHBQsgBUEGcQ0MIAwtAFINByAFQRJyIQUgAyIHIRAMCwsgDC0AUg0GIAVBEHFFDQsCQCAHIBFNDQAgB0EBayICIBBGDQAgAiAHIAItAABBIEYbIQcLIAdBADoAACADEKkBIgJFDQkgBUFvcSEFQdThCigCACEEDAoLQdThCiAEQQFqNgIAIAUNCiAELQABRQ0KIAAgEkEAIAMQ4QYhBiALKAI4IAlBAnRqIAY2AgBBASEKIAlBAWohCUHU4QooAgAhBEEEIQUgBg0BDAoLIBQgBkVxIAVBEHFyDQkgBUEEcUUEQEHIABBUIQ0gCygCOCAJQQJ0aiANNgIAIAlBAWohCQsgAgRAIA0gAjYCPAsgBUEFcUUEQCADIAhqQSA6AAAgBUEBciEFIAhBAWohCAsgBUEBcQRAIAMgCGohBAJAIAhBAkgNACABIARBAWsiAkYNACACIAQgAi0AAEEgRhshBAtBACEIIARBADoAACAAIANBAkEAIAwtAFIbIAwrAxAgDCgCBCAMKAIIENUCIQEgDUEBOgBAIA0gATYCNCADIQELQQAhAkEAIQpB1OEKKAIAIgQtAAAiBkUNAAsgBkH9AEYNBEEAIQUMBwsgBkUNAiAGQSBHDQAgDC0AUkEBRg0AQQEhDgwBCyADIAhqQdwAOgAAIAVBCXIhBSAIQQFqIQgLQdThCiAEQQFqIgQ2AgALIAVBBHEEQCAELQAAQSBHDQULIAVBGHFFBEAgBSAFQQlyIAQtAABBIEYbIQULAkAgBUEIcQRAIAMgCGohCgJAAkAgDiAELQAAIgZBIEdyDQAgCkEBay0AAEEgRw0AIAwtAFJBAUcNAQsgCiAGOgAAIAhBAWohCAsgCCATaiABIA4bIQEMAQsgBUEQcUUNAAJAIA4gBC0AACIGQSBHckUEQCADIAdGDQEgB0EBay0AAEEgRg0BCyAHIAY6AAAgB0EBaiEHQdThCigCACEECyAHQQFrIBAgDhshEAtB1OEKIARBAWoiBDYCAANAIAQsAAAiBkG/f0oNBkHU4QogBEEBaiIENgIAIAMgCGogBjoAACAIQQFqIQgMAAsAC0HU4QogBEEBajYCAAsgCyAJNgIwDAQLIA8gAxA7QQFqNgIAQbj4CCgCAEHP7gMgDxAeGhAnAAtB1OEKIARBAWoiBDYCAAwBCwsgCxDfBiACEBhBACELCyAPQRBqJAAgCwuuBAIGfwh8RAAAAAAAAChAIREgAUECdEEEakEQEBkhBQNAIAEgBEYEQAJAIAIoAgBBDHZB/wBxQQFrIQhBACEEQQAhAgNAIAIhBiABIARGDQEgESAAIARBAWoiB0EAIAEgB0sbQQR0aiIJKwMAIAAgBEEEdGoiAisDACIMoSIPIAkrAwggAisDCCINoSIQEE+jIQoCQAJAAkAgCA4FAQICAAACCyAKRAAAAAAAAAhAoyEKDAELIApEAAAAAAAA4D+iIQoLIAwhDiANIQsgAwRAIApEAAAAAAAA4D+iIg4gEKIgDaAhCyAOIA+iIAygIQ4LIAUgBkEEdGoiAiALOQMIIAIgDjkDACACRAAAAAAAAPA/IAqhIgsgEKIgDaA5AyggAiALIA+iIAygOQMgIAIgCiAQoiANoDkDGCACIAogD6IgDKA5AxAgBkEDaiECIAchBCADRQ0AIAUgAkEEdGoiAiAKRAAAAAAAAOC/okQAAAAAAADwP6AiCyAQoiANoDkDCCACIAsgD6IgDKA5AwAgBkEEaiECDAALAAsFIBEgACAEQQFqIgdBACABIAdLG0EEdGoiBisDACAAIARBBHRqIgQrAwChIAYrAwggBCsDCKEQT0QAAAAAAAAIQKMQKiERIAchBAwBCwsgBSAGQQR0aiIAIAUpAwA3AwAgACAFKQMINwMIIAAgBSkDEDcDECAAIAUpAxg3AxggACAFKQMgNwMgIAAgBSkDKDcDKCAFCyoAIAAoAgRBgAggACgCCBCsBAR/IAAgACgCBCIANgIAIAAtAAAFQQALwAtiAQJ/IwBBEGsiASQAAkAgACgCACICBEAgAiAAKAIEIgAQxAIiAkUNASABQRBqJAAgAg8LQZzXAUHh/wBBK0G7OBAAAAsgASAAQQFqNgIAQbj4CCgCAEHP7gMgARAeGhAnAAtaAQJ/AkAgACgCACIDBEAgAUUNASAAKAIEIgAgARA7IgJGIAMgASAAIAIgACACSRsQ6AFFcQ8LQb/XAUHh/wBB5ABB1z8QAAALQZLXAUHh/wBB5QBB1z8QAAAL9xoDDH8FfAJ+IwBB4BFrIgMkAAJAAkAgAgRAIAItAAANAQsgAEJ/NwIADAELAn9BkN0KKAIABEBBwOEKKAIADAELQcDhCigCACIFQYjdCigCACIEQcjhCigCAEYNABpByOEKIAQ2AgBBACAFRQ0AGiAFEJsBGkHA4QpBADYCAEEACyABKAIQKAIIKwMYIRFFBEBBwOEKQbT/CUHE8AkoAgAQlwE2AgALAn4CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCACEJ0KIgRFBEBBAUHQABAZIgRBACACELEBNgIIIAQQnApFDRIgBCgCFCIBRQ0BQQAhAiADQfAJakEANgIAIANCADcD6AkgA0IANwPgCQJAIANB4AlqQQFBFCABEMIFQRRHDQADQCACQQpGDQEgAkEEdCEBIAJBAWohAiADQeAJaiABQZD4B2oiBSgCACABQZT4B2ooAgAQ1gENAAsgBCAFKAIIIgI2AhggBCAFKAIMNgIcAkACQCACQQlrDgIAAQYLAkAgA0HgCWpBPkEUEPYCDQADQCAEKAIUEOQDIgFBPkYNASABQX9HDQALDAULIANBADYC0AEgA0HQAWoiAUEBQQQgBCgCFBDCBUEERw0EIAFBAXIhAQNAIAMoAtABQbzm2bsGRgRAQQghAiAEQQg2AhggBEHUgwE2AhwMBwsgBCgCFBDkAyICQX9GDQUgAS8AACEFIAMgAS0AAjoA0gEgAyAFOwHQASADIAI6ANMBDAALAAsgAygC6AlB14qJggVHDREgBEELNgIYIARBrN8ANgIcDAULIARBADYCGCAEQe6qAzYCHAwFCyAEEOcGDBALQZ+LAUGTwgFB4QVBx+kAEAAACyAEKAIYIQILIAIODQEEAgMFCwYMCQwMAAoMCyAEQQA2AkAgBCgCFEEPQQAQqQIaIAQoAhQQ5AMgBCgCFCEBQdgARw0GIAFBGEEAEKkCGiAEKAIUQQQgA0HgCWoQmwJFDQsgBCgCFEEEIANB0AFqEJsCDQcMCwsgBCAEKAIIEOAGIgE2AkQgAQ0KIAMgBCgCCDYCAEG9jQQgAxArDAwLIARBADYCQCAEKAIUQQZBABCpAhogBCgCFEECIANB4AlqEJsCRQ0JIAQoAhRBAiADQdABahCbAkUNCSAEIAMoAuAJtzkDMCAEIAMoAtABtzkDOAwJCyAEQQA2AkAgBCgCFEEQQQAQqQIaIAQoAhRBBCADQeAJahCaAkUNCCAEKAIUQQQgA0HQAWoQmgJFDQggBCADKALgCbc5AzAgBCADKALQAbc5AzgMCAsgBEEANgJAIAQoAhRBEEEAEKkCGiAEKAIUQQIgA0HgCWoQmwJFDQcgBCgCFEECIANB0AFqEJsCRQ0HIAQoAhRBAiADQbABahCbAkUNByAEKAIUQQIgA0HQCWoQmwJFDQcgBCADKALQASADKALgCUEQdHK3OQMwIAQgAygC0AkgAygCsAFBEHRytzkDOAwHCyAEQQA2AkAgBCgCFBDiAwNAIAQoAhRBASADQeAJahCaAkUEQCADIAQoAgg2AhBBwMMEIANBEGoQKwwICyADKALgCSICQf8BRg0AQbX5ByACQQsQ9gINACAEKAIUIQECQAJAAkAgAkHAAWsOAwACAQILIAFBA0EBEKkCDQkgBCgCFEECIANBsAFqEJoCRQ0JIAQoAhRBAiADQdAJahCaAkUNCSAEIAMoArABtzkDOCAEIAMoAtAJtzkDMAwJCyABQQNBARCpAg0IIAQoAhRBAiADQbABahCaAkUNCCAEKAIUQQIgA0HQCWoQmgJFDQggBCADKAKwAbc5AzggBCADKALQCbc5AzAMCAsgAUECIANB0AFqEJoCRQ0HIAQoAhQgAygC0AFBAmtBARCpAhoMAAsACyAEQcgANgJAIAQoAhQQ4gMDQCADQeAJaiIBQYAIIAQoAhQQrARFDQYgAUGb4gEQqQQiAUUNACADIANBoAFqNgIsIAMgA0HQCWo2AiggAyADQbABajYCJCADIANB0AFqNgIgIAFB0bUBIANBIGoQTkEERw0ACyAEIAMoAtABIgG3OQMgIAQgAygCsAEiArc5AyggBCADKALQCSABa7c5AzAgBCADKAKgASACa7c5AzgMBQsgAUEaQQAQqQIaIAQoAhRBAiADQeAJahCbAkUNBCAEKAIUQQIgA0HQAWoQmwJFDQQLIAQgAygC4Am3OQMwIAQgAygC0AG3OQM4DAMLIANB6AlqQgA3AwAgA0IANwPgCSAEKAIUEOIDQQAhBQJAA0AgByAFQQFxcQ0BAn8DQCAEKAIUEOQDIgFBf0cEQEEAIAFBCkYNAhogA0HgCWogAcAQmwoMAQsLQQELAkAgA0HgCWoiARAoBEAgARAkQQ9GDQELIANB4AlqQQAQmwoLAkAgA0HgCWoQKARAIANBADoA7wkMAQsgA0EANgLkCQsgA0HgCWoiARAoIQIgASADKALgCSACGyEIAkADQCAIQQJqIQtBACECAkADQCACIAhqIgwtAAAiBkUNAUEBIQECQCAGQeEAa0H/AXFBGU0EQANAIAEiDUEBaiEBIAggAiIGQQFqIgJqLQAAIglB3wFxQcEAa0H/AXFBGkkNAAsgCUE9Rw0CIAYgC2otAABBIkcNAkEAIQEgBkEDaiIGIQIDQCACIAhqLQAAIglFDQMgCUEiRg0CIAFBAWohASACQQFqIQIMAAsACyACQQFqIQIMAQsLIAMgDTYC1AEgAyAMNgLQASADIAMpAtABNwOYASADIAYgCGoiAjYC2AEgAyABNgLcASABIAJqQQFqIQggA0GYAWpBuPwAEOUGBEAgAyADKQLYATcDSCADQcgAahDkBiECIAMgA0GtAWoiATYCRCADIANBsAFqIgY2AkACQCACQe41IANBQGsQTkECRwRAIAMgBjYCMCACQYeKASADQTBqEE5BAUcNAUHnHCEBC0EBIQUgAysDsAEgARCaCiEPCyACEBggB0EAIQdFDQJBASEHDAELIAMgAykC0AE3A5ABIANBkAFqQb0hEOUGBEAgAyADKQLYATcDaCADQegAahDkBiECIAMgA0GtAWoiATYCZCADIANBsAFqIgY2AmACQCACQe41IANB4ABqEE5BAkcEQCADIAY2AlAgAkGHigEgA0HQAGoQTkEBRw0BQeccIQELQQEhByADKwOwASABEJoKIRALIAIQGEEBIQIgBUEBcUEAIQVFDQIMAwsgAyADKQLQATcDiAEgA0GIAWpByhIQ5QZFDQEgAyADKQLYATcDgAEgA0GAAWoQ5AYhASADIANB0AlqNgJwIAMgA0GgAWo2AnQgAUH7iQEgA0HwAGoQTkECRgRAIAMrA9AJIRNBASEOIAMrA6ABIRILIAEQGAwBCwsgBSECCyAOBEAgDyATIAJBAXEbIQ8gECASIAcbIRAMAgsgAiEFRQ0ACyAPRAAAAAAAAAAAIAJBAXEbIQ8gEEQAAAAAAAAAACAHGyEQCyAEQQA2AkACQCAPRAAAAAAAAAAAZkUgD0QAAMD////fQWVFckUEQCAEAn8gD5lEAAAAAAAA4EFjBEAgD6oMAQtBgICAgHgLtzkDMCAQRAAAAAAAAAAAZkUgEEQAAMD////fQWVFcg0BIAQCfyAQmUQAAAAAAADgQWMEQCAQqgwBC0GAgICAeAu3OQM4IAMtAO8JQf8BRw0EIAMoAuAJEBgMBAtBu8sBQZPCAUHoAkHWjQEQAAALQabNAUGTwgFB6gJB1o0BEAAACyAEQQA2AkAgBCgCFEEGQQAQqQIaIAQoAhRBASADQeAJahCaAkUNASAEKAIUQQEgA0HQAWoQmgJFDQEgBCADKALgCbc5AzAgBCADKALQAbc5AzgMAQsgBEEANgJAIAQoAhQQ4gMgBCgCFCEBA0AgA0HQAWoiAkGACCABEKwERQ0BIAJB3hIQqQQiBUUNAAsgAyABNgLYCSADIAVBCWo2AtAJIAMgAjYC1AkgA0HQCWoiARCZCiADKALQCS0AACICBH8gAgUgARDjBgtB/wFxQdsARw0AIAMgAygC0AlBAWo2AtAJIANB0AlqIgIgA0HgCWoiARCABSABIANBsAFqEP8EDQAgAiABEIAFIAEgA0G4AWoQ/wQNACACIAEQgAUgASADQcABahD/BA0AIAIgARCABSABIANByAFqEP8EDQAgBCADKwOwASIPOQMgIAQgAysDuAEiEDkDKCAEIAMrA8ABIA+hOQMwIAQgAysDyAEgEKE5AzgLIAQQ5wZBwOEKKAIAIgEgBEEBIAEoAgARBAAaIARFDQILAn8gBCsDOEQAAAAAAABSQKIgBCgCQCIBtyARRAAAAAAAAFhAIBFEAAAAAAAA8D9mGyABGyIPoyIQmUQAAAAAAADgQWMEQCAQqgwBC0GAgICAeAutAn8gBCsDMEQAAAAAAABSQKIgD6MiD5lEAAAAAAAA4EFjBEAgD6oMAQtBgICAgHgLrSEVQiCGDAILIAQoAggiAQRAQQAgAUEAEI0BGgsgBBAYC0L/////DyEVQoCAgIBwCyEUIAAgFCAVhDcCAAsgA0HgEWokAAsnAQF/AkAgAC0AEUEBRw0AIAAoAhQiAUUNACABEOYDIABBADYCFAsLhwMBA39BASEEIAAiAiEDAkACQAJAIAEOAgIBAAsCQANAIAIiAS0AACIDRQ0BIAFBAWohAiADQf8ASQ0AIAFBAmohAkEAIQQgA0H8AXFBwAFGDQALQbjhCi0AAEG44QpBAToAACAAIQNBAXENAkH8igRBABArDAILIAAhAyAEDQELIAAhASMAQRBrIgIkACACQgA3AwggAkIANwMAA0AgAS0AACIDBEAgA0H/AEkEfyABQQFqBSABLQABQT9xIANBBnRyIQMgAUECagshASACIAPAEJwBDAELCyACEJUDIAJBEGokACEDC0EoIQEgAyECAkADQAJAIAHAEIEFAkAgAi0AACIBQShrQQJJIAFB3ABGckUEQCABDQFBKRCBBSAAIANHBEAgAxAYCwJAEMkDBEAQlgRBD0YNAQtBABCBBQsQyQNFDQJBt+EKQQA6AAAMBAtB3AAQgQUgAi0AACEBCyACQQFqIQIMAQsLQazhCkEANgIACxDJAyEAQajhCkGo4QooAgAgABsLqQIBA38jAEGgCGsiBSQAAkACQAJAIAFFDQBBASEEA0AgBEEBcUUNAiABIANBAnRqKAIAIgRFDQEgA0EBaiEDIAQtAABBAEchBAwACwALA0AgAigCACIEBEAgACAEEBoaIABB7IYFEBoaIAJBBGohAgwBCwsgAUUNAQtBACEEA0AgASAEQQJ0aigCACICRQ0BAkAgAi0AAEUNACACEIUFIgNFBEAgBSACNgIAQdj/AyAFECsMAQsgA0HEPxCkBCICBEADQCAFQSBqIgNBAEGACBAzGiAAIAMgA0EBQYAIIAIQwgUiAxCjAhogA0H/B0sNAAsgAEHshgUQGhogAhDmAwwBCyAFIAM2AhBBvP8DIAVBEGoQKwsgBEEBaiEEDAALAAsgBUGgCGokAAufAwIGfAN/IARBAXEhDAJAIAJBAkYEQCAAKwMIIgYgACsDGCAGoSIFoCEHIAYgBaEhBiAAKwMAIgUgACsDECAFoSIIoCEKIAUgCKEhCAwBCyAAKwMAIgohCCAAKwMIIgchBgNAIAIgC0YNASAAIAtBBHRqIg0rAwgiBSAHIAUgB2QbIQcgDSsDACIJIAogCSAKZBshCiAFIAYgBSAGYxshBiAJIAggCCAJZBshCCALQQFqIQsMAAsACyAEQQJxIQAgBiAHIAahRAAAAAAAAOA/oqAhBSAIIAogCKFEAAAAAAAA4D+ioCEJAn8gDARAIAEgCTkDACABIAUgBZogABs5AwggASAJIAihIAUgBqEQTyIDRAAAAAAAANA/ojkDEEEYDAELIAcgBaEhByAKIAmhIQggAxBFIQogAxBXIQMCfCAABEAgByADoiIDIAWgIQYgBSADoQwBCyAFIAahmiADoiAFoSEGIAcgA6IgBaELIQcgASAGOQMYIAEgBzkDCCABIAkgCCAKoiIDoTkDACADIAmgIQNBEAsgAWogAzkDAAuNBAEFfyMAQTBrIgMkACADIAA2AiwgAUGI4QooAgBHBEBBiOEKIAE2AgBBjOEKQQA6AAALIANCADcDICADQgA3AxgDQCADIABBAWo2AiwgAC0AACICBEACQAJAAkACQAJ/IAJBwAFPBEBBASACQeABSQ0BGkECIAJB8AFJDQEaQQMgAkH4AUkNARpBjOEKLQAAQYzhCkEBOgAAQQFxRQRAIAMgARAgNgIQQb3WBCADQRBqECsLIAIgA0EYahCkCiECQX8MAQsgAkEmRg0BQQALIQVBACEEIAVBACAFQQBKGyEGIAMoAiwhAANAIAQgBkYNAyAALAAAQb9/Sg0CIANBGGogAsAQnAEgBEEBaiEEIAAtAAAhAiAAQQFqIQAMAAsACyADQSxqEKMKIgJFBEBBJiECDAMLIAJB/gBNDQIgAkH+D00EQCADQRhqIAJBBnZBQHIQnAEgAkE/cUGAf3IhAgwDCyADQRhqIgAgAkEMdkFgchCcASAAIAJBBnZBP3FBgH9yEJwBIAJBP3FBgH9yIQIMAgtBjOEKLQAAQYzhCkEBOgAAIAMgADYCLEEBcUUEQCADIAEQIDYCBCADIAVBAWo2AgBB0NUEIAMQKwsgAkH/AXEgA0EYahCkCiECDAELIAMgADYCLAsgA0EYaiACwBCcASADKAIsIQAMAQsLIANBGGoQlQMgA0EwaiQAC8EBAQR/IwBBMGsiBCQAIAQgAjYCJCAEIAE2AiAgBEIANwMYIAQgAyADQTBqIgUgAygCAEEDcSIGQQNGGygCKDYCKCAEIAMgA0EwayIHIAZBAkYbKAIoNgIsIAAgBEEYakEBIAAoAgARBAAaIAQgATYCDCAEIAI2AgggBEIANwMAIAQgAyAHIAMoAgBBA3EiAUECRhsoAig2AhAgBCADIAUgAUEDRhsoAig2AhQgACAEQQEgACgCABEEABogBEEwaiQACzMBAX8CQCAEDQBBACEEIAEQjgIiBUECSw0AIAAgBSACQe+GBRAhIQQLIAEgBCADEHIgBAtOACABIABBhN8KKAIARAAAAAAAACxARAAAAAAAAPA/EEs5AwAgASAAQYjfCigCAEHL7QAQkAE2AgggASAAQYzfCigCAEHj+AAQkAE2AgwLPAECfwNAAkAgASADQQJ0aigCACIERQ0AIAAEQCAAIAQQSUUNAQsgA0EBaiEDDAELCyACIANBAnRqKAIACzMAIAAgASgCECgClAEiASsDAEQAAAAAAABSQKI5AwAgACABKwMIRAAAAAAAAFJAojkDCAtlAQJ/AkAgAEUNACAALAAAIgNFDQACQCAAQbuZARAuRQ0AIABBj+IAEC5FDQBBASECIABB948BEC5FDQAgAEHrMRAuRQ0AIAEhAiADQTBrQQlLDQAgABCMAkEARyECCyACDwsgAQvzAgIBfwJ8IwBBoAFrIgYkACAGIAAgBRDLAyIIIAiiIgc5AwggBCAFNgIIIAQgASACQQR0aiIFKQMANwMQIAQgBSkDCDcDGAJAIAIgA08NACAHIAUrAwAgASACQQNqIgBBBHRqIgMrAwChIgcgB6IgBSsDCCADKwMIoSIHIAeioGRFDQAgACECCyAGIAEgAkEEdGoiACkDODcDGCAGIAApAzA3AxAgBiAAKQMoNwMoIAYgACkDIDcDICAGIAApAxg3AzggBiAAKQMQNwMwIAYgBSkDCDcDSCAGIAUpAwA3A0AgBkFAayEBIAhEAAAAAAAAAABkBEAgBiABNgJYIAYgBkEIajYCXCAGQdgAakEmIAZBEGpBABCMBQsgACABKQMANwMAIAAgASkDCDcDCCAAIAYpAzg3AxggACAGKQMwNwMQIAAgBikDKDcDKCAAIAYpAyA3AyAgACAGKQMYNwM4IAAgBikDEDcDMCAGQaABaiQAIAIL8QICAX8CfCMAQaABayIGJAAgBiAAIAUQywMiCCAIoiIHOQMIIAQgBTYCDCAEIAEgA0EEdGoiACIFQTBqKQMANwMgIAQgACkDODcDKAJAIAIgA08NACAHIAArAwAgBSsDMKEiByAHoiAAKwMIIAArAzihIgcgB6KgZEUNACADQQNrIQMLIAYgASADQQR0aiIAQQhqKQMANwNIIAYgACkDADcDQCAGIAApAxg3AzggBiAAKQMQNwMwIAYgACkDKDcDKCAGIAApAyA3AyAgBiAFKQMwNwMQIAYgBSkDODcDGCAIRAAAAAAAAAAAZARAIAYgBkEIajYCXCAGIAZBEGoiATYCWCAGQdgAakEmIAFBARCMBQsgACAGQUBrIgEpAwA3AwAgACABKQMINwMIIAAgBikDODcDGCAAIAYpAzA3AxAgACAGKQMoNwMoIAAgBikDIDcDICAAIAYpAxg3AzggACAGKQMQNwMwIAZBoAFqJAAgAwtfAQF/A0ACQAJAIAEoAgAiAwR/IABFDQEgACADIAMQOyIDEOgBDQIgAiACKAIAIAEoAgRyNgIAIAAgA2oFIAALDwtBsdUBQcqBAUEMQd77ABAAAAsgAUEIaiEBDAALAAv7AgEEfyMAQRBrIgQkACABQQA2AgAgAiAAEC8Q/gFBAEciAzYCAAJAQZjfCigCACIFRQ0AAkAgACAFEEEiBS0AAEUNAEGA5QchAwNAIAMoAgAiBkUNASAFIAYQSQRAIANBDGohAwwBBSABIAMoAgQ2AgAgAiADKAIIIgM2AgAMAwsACwALIAIoAgAhAwsCQCADQQFHDQAgABAvQQJB5LQBQQAQISIDRQ0AIAAgAxBBIgMtAABFDQAgAyACELoKCwJAIAEoAgBBAUcNACAAEC9BAkHH8gBBABAhIgNFDQAgACADEEEiAy0AAEUNACADIAEQugoLIAAoAhAtAJkBQQFGBEAgACAAQTBrIgMgACgCAEEDcUECRhsoAigQLyAAIAMgACgCAEEDcSIDQQJGGygCKCAAQTBBACADQQNHG2ooAihBAEEAEF4gBEEMaiAEQQhqEPUGIAIgAigCACAEKAIMcjYCACABIAEoAgAgBCgCCHI2AgALIARBEGokAAvDFwIIfw18IwBB8ABrIgckAAJAAkACQAJAAkACQCAAIAFBAnRqKAIAIgkoAhAiBi0ALA0AIAYtAFQNACAGLQAxIQggBi0AWSEKDAELIAYtADEiCEEIcQ0BIAYtAFkiCkEIcQ0BIAhBBXFFDQAgCCAKRg0CC0EBQX8gCUEwQQAgCSgCAEEDcUEDRxtqKAIoIgwoAhAiCSsDGCIOIAYrAxigIhEgDiAGKwNAoCISZiILGyAJKwMQIhMgBisDOKAhFyATIAYrAxCgIRUgCSsDYCEOIAggChCJBSEIIAREAAAAAAAA4D+iIAK4o0QAAAAAAAAAQBAiIQ8gESASoEQAAAAAAADgP6IhGEQAAAAAAAAAACEEIA4gEyAOoCIQIBehRAAAAAAAAAhAohAqIRQgDiAQIBWhRAAAAAAAAAhAohAqIRBBf0EBIAsbIAhBwQBHIAhBIEdxIBEgEmJyG7cgD6IhFkEAIQgDQCACIAhGDQQgACABQQJ0aigCACEGIAcgEyADIA6gIg6gIg85A0AgByAYOQM4IAcgDzkDMCAHIA85AyAgByASOQNoIAcgEiAWIASgIgShIg85A1ggByAXOQNgIAcgFyADIBSgIhREAAAAAAAACECjoDkDUCAHIA85A0ggByAROQMIIAcgESAEoCIPOQMoIAcgDzkDGCAHIBU5AwAgByAVIAMgEKAiEEQAAAAAAAAIQKOgOQMQAkAgBigCECgCYEUNACAGQTBBACAGKAIAQQNxQQNHG2ooAigQLyEKIAYoAhAoAmAiCSAJQSBBGCAKKAIQKAJ0QQFxG2orAwAiD0QAAAAAAADgP6IgDiAMKAIQIgorAxCgoDkDOCAKKwMYIRkgCUEBOgBRIAkgGTkDQCADIA9jRQ0AIA4gDyADoaAhDgsgAUEBaiEBIAYgBkFQQQAgBigCAEEDcUECRxtqKAIoIAdBByAFEJ4BIAhBAWohCAwACwALIAhBAnENASAGLQBZIgpBAnENAUEBQX8gCUEwQQAgCSgCAEEDcUEDRxtqKAIoIgwoAhAiCSsDGCIOIAYrAxigIhEgDiAGKwNAoCISZiILGyAJKwMQIhMgBisDOKAhFyATIAYrAxCgIRUgCSsDWCEOIAggChCJBSEIIAREAAAAAAAA4D+iIAK4o0QAAAAAAAAAQBAiIQ8gESASoEQAAAAAAADgP6IhGEQAAAAAAAAAACEEIA4gFyAOoCAToUQAAAAAAAAIQKIQKiEUIA4gFSAOoCAToUQAAAAAAAAIQKIQKiEQQX9BASALGyAIQcMARyAIQQxHcSARIBJichu3IA+iIRZBACEIA0AgAiAIRg0DIAAgAUECdGooAgAhBiAHIBMgAyAOoCIOoSIPOQNAIAcgGDkDOCAHIA85AzAgByAPOQMgIAcgEjkDaCAHIBIgFiAEoCIEoSIPOQNYIAcgFzkDYCAHIBcgAyAUoCIURAAAAAAAAAhAo6E5A1AgByAPOQNIIAcgETkDCCAHIBEgBKAiDzkDKCAHIA85AxggByAVOQMAIAcgFSADIBCgIhBEAAAAAAAACECjoTkDEAJAIAYoAhAoAmBFDQAgBkEwQQAgBigCAEEDcUEDRxtqKAIoEC8hCiAGKAIQKAJgIgkgDCgCECILKwMQIA6hIAlBIEEYIAooAhAoAnRBAXEbaisDACIPRAAAAAAAAOC/oqA5AzggCysDGCEZIAlBAToAUSAJIBk5A0AgAyAPY0UNACAOIA8gA6GgIQ4LIAFBAWohASAGIAZBUEEAIAYoAgBBA3FBAkcbaigCKCAHQQcgBRCeASAIQQFqIQgMAAsACyAIQQRxDQAgCEEBcQRAIAlBMEEAIAkoAgBBA3FBA0cbaigCKCIMKAIQIgkrAxghFCAJKwNQIAYrA0AhEyAGKwMYIRUgCCAKEIkFIQggCSsDECIOIAYrAxCgIhEgDiAGKwM4oCISoEQAAAAAAADgP6IhGEQAAAAAAAAAACEOIANEAAAAAAAA4D+iIAK4o0QAAAAAAAAAQBAiIQ9EAAAAAAAA4D+iIgMgAyAUIBOgIhOgIBShRAAAAAAAAAhAohAqIRcgAyADIBQgFaAiFaAgFKFEAAAAAAAACECiECohECAPQQBBAUF/IBEgEmYbIgZrIAYgCEHDAEYbt6IhFkEAIQgDQCACIAhGDQMgACABQQJ0aigCACEGIAcgFCAEIAOgIgOhIg85A0ggByAPOQM4IAcgGDkDMCAHIA85AyggByATOQNoIAcgEyAEIBegIhdEAAAAAAAACECjoTkDWCAHIBI5A2AgByASIBYgDqAiDqEiDzkDUCAHIA85A0AgByAROQMAIAcgESAOoCIPOQMgIAcgFTkDCCAHIBUgBCAQoCIQRAAAAAAAAAhAo6E5AxggByAPOQMQAkAgBigCECgCYEUNACAGQTBBACAGKAIAQQNxQQNHG2ooAigQLyEKIAYoAhAoAmAiCSAMKAIQIgsrAxggA6EgCUEYQSAgCigCECgCdEEBcRtqKwMAIg9EAAAAAAAA4L+ioDkDQCALKwMQIRkgCUEBOgBRIAkgGTkDOCAEIA9jRQ0AIAMgDyAEoaAhAwsgAUEBaiEBIAYgBkFQQQAgBigCAEEDcUECRxtqKAIoIAdBByAFEJ4BIAhBAWohCAwACwALQcSeA0GnvgFBtwlBiaIBEAAACyMAQfAAayIIJABEAAAAAAAA8D9EAAAAAAAA8L8gACABQQJ0aigCACIJQTBBACAJKAIAQQNxQQNHG2ooAigiDCgCECIGKwMQIg4gCSgCECIJKwMQoCIUIA4gCSsDOKAiEmYbIREgBisDUEQAAAAAAADgP6IhEyAGKwMYIhcgCSsDQKAhFSAXIAkrAxigIQ8gCS0AMSAJLQBZEIkFIQkgA0QAAAAAAADgP6IgArijRAAAAAAAAABAECIhAwJAAkACQAJAAkACQAJAAkACQAJAAkAgCUElaw4PBQEKCgIKCgoKCgUDCgoFAAsCQCAJQckAaw4NBgkJCgoKCgoKCgcICQALAkAgCUEOaw4CBQAECyARIAMgBisDYCASIA6hoaCiIRAMCQsgESADIAYrA1ggDiASoaGgoiEQDAgLIBEgAyAGKwNgIBQgDqGhoKIhEAwHCyARIAMgBisDYCAUIA6hoaCiIRAMBgsgCUE5a0ECTw0FCyARIAYrA1ggDiAUoaEgBisDYCASIA6hoaBEAAAAAAAACECjoiEQDAQLIBEgAyAGKwNYIA4gFKGhoKIhEAwDCyARIAYrA1ggDiAUoaGiIRAMAgsgESADIAYrA1ggDiAUoaEgBisDYCASIA6hoaBEAAAAAAAA4D+ioKIhEAwBCyARIAMgA6AgBisDWCAOIBShoSAGKwNgIBIgDqGhoEQAAAAAAADgP6KgoiEQCyAUIBKgRAAAAAAAAOA/oiEZIBMgFyAToCIYIBWhRAAAAAAAAAhAohAqIQ4gEyAYIA+hRAAAAAAAAAhAohAqIRhBACEJA0AgAiAJRwRAIAAgAUECdGooAgAhBiAIIBcgBCAToCIToCIWOQNIIAggFjkDOCAIIBk5AzAgCCAWOQMoIAggFTkDaCAIIBUgBCAOoCIORAAAAAAAAAhAo6A5A1ggCCASOQNgIAggEiARIAOiIBCgIhChIhY5A1AgCCAWOQNAIAggFDkDACAIIBQgEKAiFjkDICAIIA85AwggCCAPIAQgGKAiGEQAAAAAAAAIQKOgOQMYIAggFjkDEAJAIAYoAhAoAmBFDQAgBkEwQQAgBigCAEEDcUEDRxtqKAIoEC8hCyAGKAIQKAJgIgogCkEYQSAgCygCECgCdEEBcRtqKwMAIhZEAAAAAAAA4D+iIBMgDCgCECILKwMYoKA5A0AgCysDECEaIApBAToAUSAKIBo5AzggBCAWY0UNACATIBYgBKGgIRMLIAFBAWohASAGIAZBUEEAIAYoAgBBA3FBAkcbaigCKCAIQQcgBRCeASAJQQFqIQkMAQsLIAhB8ABqJAALIAdB8ABqJAAL+gEBBH8jAEEQayIEJAADQCAAIgMoAhAiAigCeCIABEAgAi0AcA0BCwsgAigCCCIARQRAQQFBKBAZIQAgAygCECAANgIICwJAIAAoAgQiAkHVqtUqSQRAIAAoAgAgAkEwbCICQTBqIgUQOSIARQ0BIAAgAmpBAEEwEDMaIAMoAhAoAggiAyAANgIAIAMgAygCBCIDQQFqNgIEIAFBEBAZIQIgACADQTBsaiIAIAE2AgQgACACNgIAIABBCGpBAEEoEDMaIARBEGokACAADwtB28QDQemCAUHNAEH0tgEQAAALIAQgBTYCAEG4+AgoAgBBz+4DIAQQHhoQJwAL0AECBX8BfCMAQUBqIgUkACABKAIQIgYrA2AhCQNAIARBBEZFBEAgBSAEQQR0IgdqIgggAiAHaiIHKwMAIAYrAxChOQMAIAggBysDCCAGKwMYoTkDCCAEQQFqIQQMAQsLIAAgBigCCCgCBCgCDCAFIAMQjAUgASgCECEAQQAhBANAIARBBEZFBEAgAiAEQQR0IgFqIgMgASAFaiIBKwMAIAArAxCgOQMAIAMgASsDCCAAKwMYoDkDCCAEQQFqIQQMAQsLIAAgCTkDYCAFQUBrJAALagEBfyMAQRBrIggkAAJ/AkACQCABIAcQLkUEQCAAIAAvASQgBnI7ASQMAQsgASAFEC5FBEAgACAALwEkIARyOwEkDAELIAEgAxAuDQELQQAMAQsgCCABNgIAIAIgCBArQQELIAhBEGokAAstAQF/IAMoAgAiBEUEQEGysgNBmIABQRNBszwQAAALIAAgASACKAIAIAQRBAALcgECfyMAQSBrIgQkAAJAIAAgA0kEQEEAIAAgACACEEMiBRsNASAEQSBqJAAgBQ8LIAQgAjYCBCAEIAA2AgBBuPgIKAIAQYDvAyAEEB4aECcACyAEIAAgAXQ2AhBBuPgIKAIAQc/uAyAEQRBqEB4aECcAC1QAIAchAiAGIQQgBSEDAkACQAJAAkAgAUEPaw4EAwEBAgALIAFBKUYNAQtBfyECQZ4BIQQgAUEcRw0AIAAoAhANAEE7DwsgACAENgIAIAIhAwsgAwskAQF/IwBBEGsiAyQAIAMgATYCDCACIAAgARCoEyADQRBqJAALMQAgACgCCCABTQRAQY23AyAFIAQgAxAAAAsgACgCACAAKAIEIAFqIAAoAgxwIAJ0agtLAQJ/IAAoAgQiB0EIdSEGIAdBAXEEQCADKAIAIAYQgwchBgsgACgCACIAIAEgAiADIAZqIARBAiAHQQJxGyAFIAAoAgAoAhQRCwALkwYCCX8BfCMAQSBrIgUkACAFQQA2AhwCQCACKAIEIgYEQCAGKAIAIgNFDQEgBigCCEUEQAJAAkBB8OAKKAIAIgRFDQAgBCADEC4NAEH04AooAgAhBAwBCyAEEBhB8OAKIAMQZCIDNgIAQfTgCiADQYD1CUEjQSRBIhDpAyIENgIACyAGIAQ2AggLQQAhBEGM3QotAAAEQCAFQRxqQQAgBigCABC1BhshBAtBACEDAkAgASgCjAEiAUUNACABKAIAIgFFDQAgAiAEIAERAAAhAwsCQAJAIANFBEAgAigCBCIBKAIYIQMgASsDECEMIAJCADcDICACQgA3AxAgAkIANwMIIAIgDEQzMzMzMzPzP6I5AyggAiAMRJqZmZmZmbk/ojkDGCACIAwCfCABKAIAIQEgAigCACEJIANBAXEhByADQQJxQQF2IQMjAEEgayIIJAACQAJAAkAgAQRAIAlFDQEgARDgCiIKQZAGQZACIAMbQZAEQRAgAxsgBxtqIQtBACEHA0AgCS0AACIBRQ0DAkAgAcBBAE4EQCABIQMMAQtBICEDQezgCi0AAA0AQezgCkEBOgAAIAggATYCEEGmjAQgCEEQahArCwJAIAsgA0EBdGouAQAiAUF/RgRAQQAhAUHt4AotAAANAUHt4ApBAToAACAIIAM2AgBB4OIEIAgQKwwBCyABQQBIDQULIAlBAWohCSABIAdqIQcMAAsAC0GynQFBnLwBQcAGQdIcEAAAC0HzGEGcvAFBwQZB0hwQAAALIAorAwghDCAIQSBqJAAgB7ggDKMMAQtBnpkDQZy8AUG6BkH49QAQAAALojkDICAERQ0CIARB58kBNgIADAELIARFDQELIAYoAgAhAUG4+AgoAgAhAyAFKAIcIgQEQCAFIAQ2AhQgBSABNgIQIANB0oMEIAVBEGoQHhoMAQsgBSABNgIAIANBl/8EIAUQHhoLIAAgAikDIDcDACAAIAIpAyg3AwggBUEgaiQADwtBwh9B578BQdUAQciNARAAAAtBvJ0BQee/AUHYAEHIjQEQAAALIAACQCABIAAoAgRHDQAgACgCHEEBRg0AIAAgAjYCHAsLmgEAIABBAToANQJAIAIgACgCBEcNACAAQQE6ADQCQCAAKAIQIgJFBEAgAEEBNgIkIAAgAzYCGCAAIAE2AhAgA0EBRw0CIAAoAjBBAUYNAQwCCyABIAJGBEAgACgCGCICQQJGBEAgACADNgIYIAMhAgsgACgCMEEBRw0CIAJBAUYNAQwCCyAAIAAoAiRBAWo2AiQLIABBAToANgsLCgAgACABaigCAAt2AQF/IAAoAiQiA0UEQCAAIAI2AhggACABNgIQIABBATYCJCAAIAAoAjg2AhQPCwJAAkAgACgCFCAAKAI4Rw0AIAAoAhAgAUcNACAAKAIYQQJHDQEgACACNgIYDwsgAEEBOgA2IABBAjYCGCAAIANBAWo2AiQLC7MBAQN/IwBBEGsiAiQAIAIgATYCDAJAAkACfyAAEKcBIgRFBEBBASEBIAAQowMMAQsgABDwAkEBayEBIAAoAgQLIgMgAUYEQCAAIAFBASABIAEQnQsgABBCGgwBCyAAEEIaIAQNACAAIgEgA0EBahDTAQwBCyAAKAIAIQEgACADQQFqEL4BCyABIANBAnRqIgAgAkEMahDcASACQQA2AgggAEEEaiACQQhqENwBIAJBEGokAAscACAAEJIFIgBB3O4JNgIAIABBBGogARCHByAACzgBAn8gARA7IgJBDWoQigEiA0EANgIIIAMgAjYCBCADIAI2AgAgACADQQxqIAEgAkEBahAfNgIACw0AIAAgASACQn8QuQULBwAgAEEMagsnAQF/IAAoAgAhASMAQRBrIgAkACAAIAE2AgwgACgCDCAAQRBqJAALFwAgACgCCBBoRwRAIAAoAggQzgsLIAALsgEBBn8jAEEQayICJAACQCAAIAJBDGoQ+QoiBARAIAIoAgwiA0EYEEohBSABIAM2AgAgBSEAAkADQCADIAZLBEAgACAEIAJBCGoiBxDgATkDACAEIAIoAggiA0YNAiAAIAMgBxDgATkDCCADIAIoAggiBEYNAiAAQgA3AxAgBkEBaiEGIABBGGohACABKAIAIQMMAQsLIAEgBTYCBAwCCyAFEBgLQQAhBAsgAkEQaiQAIAQLNgEBfyMAQRBrIgMkACADIAI2AgwgA0EIaiADQQxqEIoCIAAgARCuByEAEIkCIANBEGokACAACxMAIAAgACgCAEEBayIANgIAIAAL1QICA3wCfyMAQRBrIgkkAAJAIAFEAAAAAAAAAABlBEAgAiIGIgEhAAwBCwJ/RAAAAAAAAAAAIABEAAAAAAAAGECiIABEAAAAAAAA8D9mGyIAmUQAAAAAAADgQWMEQCAAqgwBC0GAgICAeAshCiACRAAAAAAAAPA/IAEgACAKt6EiB6KhoiEIIAJEAAAAAAAA8D8gAaGiIQAgAiEGIAJEAAAAAAAA8D8gAUQAAAAAAADwPyAHoaKhoiIHIQECQAJAAkACQAJAAkAgCg4GBgUAAQIDBAsgACEGIAIhASAHIQAMBQsgACEGIAghASACIQAMBAsgByEGIAAhASACIQAMAwsgACEBIAghAAwCCyAJQdYANgIEIAlB4MEBNgIAQbj4CCgCAEHYwwQgCRAeGhBpAAsgCCEGIAIhAQsgAyAGOQMAIAQgATkDACAFIAA5AwAgCUEQaiQACzMBAX8jAEEQayICJAAgAiAAKAIANgIMIAIgAigCDCABQQJ0ajYCDCACKAIMIAJBEGokAAsbAQF/QQEhASAAEKcBBH8gABDwAkEBawVBAQsLMAEBfyMAQRBrIgIkACACIAAoAgA2AgwgAiACKAIMIAFqNgIMIAIoAgwgAkEQaiQAC9ABAQN/IwBBEGsiBSQAAkBB9////wcgAWsgAk8EQCAAEEIhBiAFQQRqIgcgAUHz////A0kEfyAFIAFBAXQ2AgwgBSABIAJqNgIEIAcgBUEMahDbAygCABDaA0EBagVB9////wcLENkDIAUoAgQhAiAFKAIIGiAEBEAgAiAGIAQQpwILIAMgBEcEQCACIARqIAQgBmogAyAEaxCnAgsgAUEKRwRAIAYQqgULIAAgAhD3ASAAIAUoAggQ9gEgBUEQaiQADAELEMoBAAsgACADEL4BC8YBAQR/IwBBEGsiBCQAAkAgARCnAUUEQCAAIAEoAgg2AgggACABKQIANwIAIAAQowMaDAELIAEoAgAhBSABKAIEIQIjAEEQayIDJAACQAJAAkAgAhCpBQRAIAAiASACENMBDAELIAJB9////wdLDQEgA0EIaiACENoDQQFqENkDIAMoAgwaIAAgAygCCCIBEPcBIAAgAygCDBD2ASAAIAIQvgELIAEgBSACQQFqEKcCIANBEGokAAwBCxDKAQALCyAEQRBqJAALLAECfwJAIAAoAiQiAkUNACAALQCQAQ0AIAAoAgAoAmwNACACEOUDIQELIAELDwAgACAAKAIAQQRqNgIACyEBAX8jAEEQayIBJAAgAUEMaiAAEJ0CKAIAIAFBEGokAAsPACAAIAAoAgBBAWo2AgALWQECfyMAQRBrIgMkACACKAIAIQQgAAJ/IAEgAGtBAnUiAgRAA0AgACAEIAAoAgBGDQIaIABBBGohACACQQFrIgINAAsLQQALIgAgASAAGxCiAyADQRBqJAAL+AMBAX8jAEEQayIMJAAgDCAANgIMAkACQCAAIAVGBEAgAS0AAEEBRw0BQQAhACABQQA6AAAgBCAEKAIAIgFBAWo2AgAgAUEuOgAAIAcQI0UNAiAJKAIAIgEgCGtBnwFKDQIgCigCACECIAkgAUEEajYCACABIAI2AgAMAgsCQAJAIAAgBkcNACAHECNFDQAgAS0AAEEBRw0CIAkoAgAiACAIa0GfAUoNASAKKAIAIQEgCSAAQQRqNgIAIAAgATYCAEEAIQAgCkEANgIADAMLIAsgC0GAAWogDEEMahCZByALayIAQQJ1IgZBH0oNASAGQfCzCWosAAAhBQJAAkAgAEF7cSIAQdgARwRAIABB4ABHDQEgAyAEKAIAIgFHBEBBfyEAIAFBAWssAAAQ2AMgAiwAABDYA0cNBgsgBCABQQFqNgIAIAEgBToAAAwDCyACQdAAOgAADAELIAUQ2AMiACACLAAARw0AIAIgABD7AToAACABLQAAQQFHDQAgAUEAOgAAIAcQI0UNACAJKAIAIgAgCGtBnwFKDQAgCigCACEBIAkgAEEEajYCACAAIAE2AgALIAQgBCgCACIAQQFqNgIAIAAgBToAAEEAIQAgBkEVSg0CIAogCigCAEEBajYCAAwCC0EAIQAMAQtBfyEACyAMQRBqJAAgAAtVAQJ/IwBBEGsiBiQAIAZBDGoiBSABEFAgBRDLAUHwswlBkLQJIAIQwgIgAyAFENUDIgEQ8gE2AgAgBCABEMkBNgIAIAAgARDIASAFEE0gBkEQaiQACwgAIAAgARAaCy8BAX8jAEEQayIDJAAgACAAIAIsAAAgASAAaxD2AiIAIAEgABsQogMgA0EQaiQAC/ADAQF/IwBBEGsiDCQAIAwgADoADwJAAkAgACAFRgRAIAEtAABBAUcNAUEAIQAgAUEAOgAAIAQgBCgCACIBQQFqNgIAIAFBLjoAACAHECNFDQIgCSgCACIBIAhrQZ8BSg0CIAooAgAhAiAJIAFBBGo2AgAgASACNgIADAILAkACQCAAIAZHDQAgBxAjRQ0AIAEtAABBAUcNAiAJKAIAIgAgCGtBnwFKDQEgCigCACEBIAkgAEEEajYCACAAIAE2AgBBACEAIApBADYCAAwDCyALIAtBIGogDEEPahCdByALayIFQR9KDQEgBUHwswlqLAAAIQYCQAJAAkACQCAFQX5xQRZrDgMBAgACCyADIAQoAgAiAUcEQEF/IQAgAUEBaywAABDYAyACLAAAENgDRw0GCyAEIAFBAWo2AgAgASAGOgAADAMLIAJB0AA6AAAMAQsgBhDYAyIAIAIsAABHDQAgAiAAEPsBOgAAIAEtAABBAUcNACABQQA6AAAgBxAjRQ0AIAkoAgAiACAIa0GfAUoNACAKKAIAIQEgCSAAQQRqNgIAIAAgATYCAAsgBCAEKAIAIgBBAWo2AgAgACAGOgAAQQAhACAFQRVKDQIgCiAKKAIAQQFqNgIADAILQQAhAAwBC0F/IQALIAxBEGokACAAC1UBAn8jAEEQayIGJAAgBkEMaiIFIAEQUCAFEMwBQfCzCUGQtAkgAhDvAiADIAUQ1wMiARDyAToAACAEIAEQyQE6AAAgACABEMgBIAUQTSAGQRBqJAALnAEBA39BNSEBAkAgACgCHCICIAAoAhgiA0EGakEHcGtBB2pBB24gAyACayICQfECakEHcEEDSWoiA0E1RwRAIAMiAQ0BQTQhAQJAAkAgAkEGakEHcEEEaw4CAQADCyAAKAIUQZADb0EBaxDPC0UNAgtBNQ8LAkACQCACQfMCakEHcEEDaw4CAAIBCyAAKAIUEM8LDQELQQEhAQsgAQtqAQJ/IABBlJgJNgIAIAAoAighAQNAIAEEQEEAIAAgAUEBayIBQQJ0IgIgACgCJGooAgAgACgCICACaigCABEFAAwBCwsgAEEcahBNIAAoAiAQGCAAKAIkEBggACgCMBAYIAAoAjwQGCAAC1kBA38CQCAAKAIAIgIEQCABKAIAIgNFDQEgACgCBCIAIAEoAgRGBH8gAiADIAAQ/AEFQQELRQ8LQb/XAUHh/wBBM0H6PxAAAAtBsNcBQeH/AEE0Qfo/EAAACzoBAX8gAEGAlwkoAgAiATYCACAAIAFBDGsoAgBqQYyXCSgCADYCACAAQQRqEKQHGiAAQThqEPYLIAALGAAgAEGUlAk2AgAgAEEgahA0GiAAEKsHCx0AIwBBEGsiAyQAIAAgASACEOQLIANBEGokACAAC64BAQZ/IwBBEGsiAiQAIAJBCGoiAyAAELEFGgJAIAMtAABFDQAgAkEEaiIDIAAgACgCAEEMaygCAGoQUCADEO0LIQQgAxBNIAIgABDsCyEFIAAgACgCAEEMaygCAGoiBhDrCyEHIAIgBCAFKAIAIAYgByABIAQoAgAoAiARNAA2AgQgAxCvBUUNACAAIAAoAgBBDGsoAgBqQQUQswULIAJBCGoQsAUgAkEQaiQAIAALDAAgAEEEahD2CyAACygBAn8jAEEQayICJAAgASgCACAAKAIASCEDIAJBEGokACABIAAgAxsLEAAgACABNwMIIABCADcDAAsCAAsUACAAQaSTCTYCACAAQQRqEE0gAAvzAwICfgV/IwBBIGsiBSQAIAFC////////P4MhAgJ+IAFCMIhC//8BgyIDpyIEQYH4AGtB/Q9NBEAgAkIEhiAAQjyIhCECIARBgPgAa60hAwJAIABC//////////8PgyIAQoGAgICAgICACFoEQCACQgF8IQIMAQsgAEKAgICAgICAgAhSDQAgAkIBgyACfCECC0IAIAIgAkL/////////B1YiBBshACAErSADfAwBCyAAIAKEUCADQv//AVJyRQRAIAJCBIYgAEI8iIRCgICAgICAgASEIQBC/w8MAQsgBEH+hwFLBEBCACEAQv8PDAELQYD4AEGB+AAgA1AiBxsiCCAEayIGQfAASgRAQgAhAEIADAELIAVBEGogACACIAJCgICAgICAwACEIAcbIgJBgAEgBmsQtQEgBSAAIAIgBhClAyAFKQMIQgSGIAUpAwAiAkI8iIQhAAJAIAQgCEcgBSkDECAFKQMYhEIAUnGtIAJC//////////8Pg4QiAkKBgICAgICAgAhaBEAgAEIBfCEADAELIAJCgICAgICAgIAIUg0AIABCAYMgAHwhAAsgAEKAgICAgICACIUgACAAQv////////8HViIEGyEAIAStCyECIAVBIGokACABQoCAgICAgICAgH+DIAJCNIaEIACEvwuZAQECfwJAIAAQLyIEIAAoAgBB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IAIoApwBQQFqNgKcASACKAKYASISIAhqKAIAIQ1BACEAA0AgACAORgRAQQAhAwNAIAMgFkcEQAJAIAMgC0YNAEEAIQcgDSgCECgClAEgEiADQQJ0IgRqKAIAKAIQKAKUASAKQfABahCEDiE1A0AgByAORg0BIAdBA3QiACACKAKsASIMIAhqKAIAIARqKAIAaiIUIANBA3QiDyACKAKkASAIaigCAGorAwAgCkHwAWogAGorAwAiNiA2IAIoAqABIAhqKAIAIA9qKwMAoiA1o6GiIjY5AwAgAigCqAEiDyAIaigCACAAaiIRIBErAwAgNqA5AwAgBCAMaigCACAIaigCACAAaiIMKwMAITYgDCAUKwMAmiI3OQMAIAQgD2ooAgAgAGoiACA3IDahIAArAwCgOQMAIAdBAWohBwwACwALIANBAWohAwwBCwtBhOEKKAIABEBBACEAQczdCi8BACECRAAAAAAAAAAAITYDQCAAIAJHBEAgNiAKQaABaiAAQQN0aisDAJmgITYgAEEBaiEADAELCyABECAhACAKIDafOQM4IAogADYCMCATQcepBCAKQTBqEDELIAUQGAwFBSACKAKoASAIaigCACAAQQN0akIANwMAIABBAWohAAwBCwALAAsgA0EBaiEDDAALAAsLQQAhAEGM3QotAAAEQEEBIAYgBkEBTBtBAWshBUHM3QovAQAhB0QAAAAAAAAAACE1A0AgACAFRwRAIAkoAhAiAigCmAEiCCAAQQJ0IgRqKAIAIRYgAEEBaiIBIQMDQCADIAZGBEAgASEADAMFIAggA0ECdGooAgAhC0EAIQBEAAAAAAAAAAAhNgNAIAAgB0cEQCAAQQN0Ig4gFigCECgClAFqKwMAIAsoAhAoApQBIA5qKwMAoSI3IDeiIDagITYgAEEBaiEADAELCyADQQN0IgAgAigCpAEgBGooAgBqKwMAIAIoAqABIARqKAIAIABqKwMAIjdEAAAAAAAAAMCiIDafoiA3IDeiIDagoKIgNaAhNSADQQFqIQMMAQsACwALCyAKIDU5AyAgE0HJjAEgCkEgahAxQcjdCigCACEBIAkoAhAoApwBIQAgChCPATkDGCAKIAA2AhAgCkGHzANB74YFIAAgAUYbNgIUIBNBlM0EIApBEGoQMQsgCSgCECgCnAEiAEHI3QooAgBGBEAgCiAJ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ACkDKDcDGCABIAApAyA3AxAgASAAKQMYNwMIAkAgACgCCCgCWCILRQ0AAkAgASsDACABKwMQYg0AIAErAwggASsDGGINACABQv////////93NwMYIAFC//////////f/ADcDACABQv/////////3/wA3AwggAUL/////////dzcDEAsgCygCCCEAA0AgDSALKAIATw0BIAVCADcDOCAFQgA3AzAgBUIANwMoIAVCADcDIAJAAkACQAJAAkACQAJAAkAgACgCAA4QAAABAQICAwQHBwUHBwcHBgcLIAAgACsDECIXIAArAyAiGKAiEzkDaCAAIAArAwgiGyAAKwMYIhygIhQ5A2AgACAXIBihIhc5A1ggACAbIByhIhg5A1AgASABKwMAIBgQKiAUECo5AwAgASABKwMYIBcQIiATECI5AxggASABKwMIIBcQKiATECo5AwggASABKwMQIBgQIiAUECI5AxAMBgsgBSAAKAIMIAAoAgggARC4BiAAIAUpAxg3A2ggACAFKQMQNwNgIAAgBSkDCDcDWCAAIAUpAwA3A1AMBQsgBSAAKAIMIAAoAgggARC4BiAAIAUpAxg3A2ggACAFKQMQNwNgIAAgBSkDCDcDWCAAIAUpAwA3A1AMBAsgBSAAKAIMIAAoAgggARC4BiAAIAUpAxg3A2ggACAFKQMQNwNgIAAgBSkDCDcDWCAAIAUpAwA3A1AMAwsgAEE4EIgDNgJwIAAoAigQZCEJIAAoAnAiESAJNgIAIBEgACgCGEH0xQhqLQAAOgAwIAUgGTkDMCAFIA42AiAgBSAFKAI4QYB/cSAPQf8AcXI2AjggECgCiAEiCSAFQSBqQQEgCSgCABEEACEJIAAoAnAiESAJNgIEIAUgECAREIAHIAArAwghEyAAKAJwIgkrAyghFyAJKwMgIRQCQAJAAkACQCAJLQAwQewAaw4HAAMBAwMDAgMLIBMgFKAhFiATIRUMAgsgEyAURAAAAAAAAOA/oiIVoCEWIBMgFaEhFQwBCyATIBShIRUgEyEWCyAAKwMQIRMgCSsDECEUIAAgFjkDYCAAIBU5A1AgACATIBSgIhM5A2ggACATIBehIhQ5A1ggASABKwMQIBUQIiAWECI5AxAgASABKwMYIBQQIiATECI5AxggASABKwMAIBUQKiAWECo5AwAgASABKwMIIBQQKiAT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ASAKKQMINwOoASABIAopAwA3A6ABIAEgDikDCDcDmAEgASAOKQMANwOQASABQbABaiABQaABaiABQZABahClDSEVIAEgEikDCDcDiAEgASASKQMANwOAASABIA4pAwg3A3ggASAOKQMANwNwIAEgCikDCDcDaCABIAopAwA3A2AgAUGAAWogAUHwAGogAUHgAGoQpQ0hFiABIBEpAwg3A1ggASARKQMANwNQIAEgCikDCDcDSCABIAopAwA3A0AgASASKQMINwM4IAEgEikDADcDMCABIA4pAwg3AyggASAOKQMANwMgIAErAzAiICABKwNYIhsgAUFAayIKKwMIIiGhoiABKwMgIiUgISAboSIioiABKwNQIh4gASsDKCIdIAErAzgiHKGiIiYgCisDACIjIBwgHaGioKCgIiREAAAAAAAAAABiBH8gASAlIBwgG6GiICYgICAbIB2hoqCgICSjIh0gIqIgG6A5A4gEIAEgHSAjIB6hoiAeoDkDgAQgHUQAAAAAAADwP2UgHUQAAAAAAAAAAGZxICAgIqIgHiAcICGhoiAjIBsgHKGioKCaICSjIhtEAAAAAAAAAABmIBtEAAAAAAAA8D9lcXEFQQALDQECQCAWIB9EAAAAAAAAAABiIBVyckUEQCAEQQFqIQQgCEEBaiAMbyEIDAELIB9EAAAAAAAAAABmBEAgFQRAIARBAWohBCAIQQFqIAxvIQgMAgsgAkEBaiECIAZBAWogDW8hBgwBCyAWBEAgAkEBaiECIAZBAWogDW8hBgwBCyAEQQFqIQQgCEEBaiAMbyEICyAEIAxIIAIgDUhyRSAEIBhOckUgAiAXSHENAAsCQEHQgQsoAgAiAisAACIbIAErA7ADZUUNACAbIAErA8ADZkUNACACKwAIIhsgASsDuANlRQ0AIBsgASsDyANmRQ0AIAcoAkghBSABIAIpAwg3AxggASACKQMANwMQQQEhAkHUgQsoAgAgBSABQRBqEKINDQMLQdSBCygCACIFKwAAIhsgASsD0ANlRQ0BIBsgASsD4ANmRQ0BIAUrAAgiGyABKwPYA2VFDQFBACECIBsgASsD6ANmRQ0CIAkoAiAhAiABIAUpAwg3AwggASAFKQMANwMAQdCBCygCACACIAEQog0hAgwCC0EBIQIMAQtBACECCyABQbAEaiQAIAIEQCATQQE6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aiAEIAVqKAIANgIAIAFBAWohAQsgAkEBaiECDAELCyAHIAE2AgAgBCECIAghAwwACwALA0AgAyAAKAIATg0BIAkgA0EBaiIIQQJ0aiEFA0AgAiAFKAIAIgRORQRAIAMgBiACQQJ0aigCACIERwRAIAYgAUECdGogBDYCACABQQFqIQELIAJBAWohAgwBCwsgBSABNgIAIAQhAiAIIQMMAAsACyAAIAE2AgggACEBCyABC+MMARN/AkACQCAARSABRXJFBEAgASgCICAAKAIgcg0BIAAoAhAiAiABKAIQRw0CAkAgACgCACIEIAEoAgBHDQAgACgCBCIDIAEoAgRHDQAgASgCGCETIAEoAhQhDiAAKAIYIRQgACgCFCEPIAQgAyABKAIIIAAoAghqIAJBABCyAiINBEBBACECIANBACADQQBKGyEIIA0oAhghECANKAIUIQsgA0EEEEohCQNAIAIgCEZFBEAgCSACQQJ0akF/NgIAIAJBAWohAgwBCwtBACECIAtBADYCAAJAAkACQAJAAkAgACgCEEEBaw4IAAEEAgQEBAMECyAEQQAgBEEAShshDCANKAIcIQQgASgCHCEDIAAoAhwhEUEAIQADQCAAIAxGDQQgDyAAQQFqIgFBAnQiCGohCiAPIABBAnQiBWooAgAhAANAIAAgCigCAE5FBEAgCSAUIABBAnRqKAIAIgdBAnRqIAI2AgAgECACQQJ0aiAHNgIAIAQgAkEDdGogESAAQQN0aisDADkDACAAQQFqIQAgAkEBaiECDAELCyAFIAtqIQogCCAOaiEHIAUgDmooAgAhAANAIAAgBygCAE5FBEACQCAJIBMgAEECdGooAgAiBUECdGooAgAiBiAKKAIASARAIBAgAkECdGogBTYCACAEIAJBA3RqIAMgAEEDdGorAwA5AwAgAkEBaiECDAELIAQgBkEDdGoiBSADIABBA3RqKwMAIAUrAwCgOQMACyAAQQFqIQAMAQsLIAggC2ogAjYCACABIQAMAAsACyAEQQAgBEEAShshDCANKAIcIQQgASgCHCEIIAAoAhwhEUEAIQADQCAAIAxGDQMgDyAAQQFqIgFBAnQiBWohCiAPIABBAnQiA2ooAgAhAANAIAAgCigCAE5FBEAgCSAUIABBAnRqKAIAIgdBAnRqIAI2AgAgECACQQJ0aiAHNgIAIAQgAkEEdGoiByARIABBBHRqIgYrAwA5AwAgByAGKwMIOQMIIABBAWohACACQQFqIQIMAQsLIAMgC2ohCiAFIA5qIQcgAyAOaigCACEAA0AgACAHKAIATkUEQAJAIAkgEyAAQQJ0aigCACIDQQJ0aigCACIGIAooAgBIBEAgECACQQJ0aiADNgIAIAQgAkEEdGoiAyAIIABBBHRqIgYrAwA5AwAgAyAGKwMIOQMIIAJBAWohAgwBCyAEIAZBBHRqIgMgCCAAQQR0aiIGKwMAIAMrAwCgOQMAIAMgBisDCCADKwMIoDkDCAsgAEEBaiEADAELCyAFIAtqIAI2AgAgASEADAALAAsgBEEAIARBAEobIQwgDSgCHCEEIAEoAhwhAyAAKAIcIRFBACEAA0AgACAMRg0CIA8gAEEBaiIBQQJ0IghqIQogDyAAQQJ0IgVqKAIAIQADQCAAIAooAgBORQRAIAkgFCAAQQJ0IgdqKAIAIgZBAnRqIAI2AgAgECACQQJ0IhJqIAY2AgAgBCASaiAHIBFqKAIANgIAIABBAWohACACQQFqIQIMAQsLIAUgC2ohCiAIIA5qIQcgBSAOaigCACEAA0AgACAHKAIATkUEQAJAIAkgEyAAQQJ0IgVqKAIAIgZBAnRqKAIAIhIgCigCAEgEQCAQIAJBAnQiEmogBjYCACAEIBJqIAMgBWooAgA2AgAgAkEBaiECDAELIAQgEkECdGoiBiAGKAIAIAMgBWooAgBqNgIACyAAQQFqIQAMAQsLIAggC2ogAjYCACABIQAMAAsACyAEQQAgBEEAShshCEEAIQADQCAAIAhGDQEgDyAAQQFqIgFBAnQiBGohBSAPIABBAnQiA2ooAgAhAANAIAAgBSgCAE5FBEAgCSAUIABBAnRqKAIAIgxBAnRqIAI2AgAgECACQQJ0aiAMNgIAIABBAWohACACQQFqIQIMAQsLIAMgC2ohBSAEIA5qIQwgAyAOaigCACEAA0AgACAMKAIATkUEQCAJIBMgAEECdGooAgAiA0ECdGooAgAgBSgCAEgEQCAQIAJBAnRqIAM2AgAgAkEBaiECCyAAQQFqIQAMAQsLIAQgC2ogAjYCACABIQAMAAsACyANIAI2AggLIAkQGAsgDQ8LQarfAUHKuwFBwwVBhLQBEAAAC0He0QFByrsBQcQFQYS0ARAAAAtBxZoBQcq7AUHFBUGEtAEQAAALQwEBfyAAIAEQ5QEiBEUEQEEADwsgAwR/IAAoAjQgBEEgahD8DQVBAAshASACBH8gACgCNCAEQRxqEPwNIAFqBSABCwvMCAIQfwF8AkAgAEUNACAAKAIgRQRAIAAoAhghDSAAKAIUIQcgACgCBCIIIAAoAgAiAiAAKAIIIgEgACgCEEEAELICIgkgATYCCCAJKAIYIQ4gCSgCFCEDQX8gCCAIQQBIG0EBaiEKQQAhAQNAIAEgCkYEQEEAIQEgAkEAIAJBAEobIQogA0EEaiEGA0ACQCABIApGBEBBACEBIAhBACAIQQBKGyECA0AgASACRg0CIAFBAnQhBiADIAFBAWoiAUECdGoiBCAEKAIAIAMgBmooAgBqNgIADAALAAsgByABQQFqIgJBAnRqIQQgByABQQJ0aigCACEBA0AgBCgCACABTARAIAIhAQwDBSAGIA0gAUECdGooAgBBAnRqIgsgCygCAEEBajYCACABQQFqIQEMAQsACwALC0EAIQICQAJAAkACQAJAAkAgACgCEEEBaw4IAAEEAgQEBAMECyAJKAIcIQYgACgCHCEEA0AgAiAKRg0FIAcgAkEBaiIAQQJ0aiELIAcgAkECdGooAgAhAQNAIAsoAgAgAUwEQCAAIQIMAgUgDiADIA0gAUECdGoiBSgCAEECdGooAgBBAnRqIAI2AgAgBCABQQN0aisDACERIAMgBSgCAEECdGoiBSAFKAIAIgVBAWo2AgAgBiAFQQN0aiAROQMAIAFBAWohAQwBCwALAAsACyAJKAIcIQYgACgCHCEEQQAhAANAIAAgCkYNBCAHIABBAWoiAkECdGohCyAHIABBAnRqKAIAIQEDQCALKAIAIAFMBEAgAiEADAIFIA4gAyANIAFBAnRqIgUoAgBBAnRqKAIAQQJ0aiAANgIAIAYgAyAFKAIAQQJ0aiIFKAIAIgxBBHRqIg8gBCABQQR0aiIQKwMAOQMAIA8gECsDCDkDCCAFIAxBAWo2AgAgAUEBaiEBDAELAAsACwALIAkoAhwhBiAAKAIcIQRBACEAA0AgACAKRg0DIAcgAEEBaiICQQJ0aiELIAcgAEECdGooAgAhAQNAIAsoAgAgAUwEQCACIQAMAgUgDiADIA0gAUECdCIFaiIMKAIAQQJ0aigCAEECdGogADYCACAEIAVqKAIAIQUgAyAMKAIAQQJ0aiIMIAwoAgAiDEEBajYCACAGIAxBAnRqIAU2AgAgAUEBaiEBDAELAAsACwALA0AgAiAKRg0CIAcgAkEBaiIAQQJ0aiEGIAcgAkECdGooAgAhAQNAIAYoAgAgAUwEQCAAIQIMAgUgAyANIAFBAnRqKAIAQQJ0aiIEIAQoAgAiBEEBajYCACAOIARBAnRqIAI2AgAgAUEBaiEBDAELAAsACwALIAkQagwECwNAIAhBAExFBEAgAyAIQQJ0aiADIAhBAWsiCEECdGooAgA2AgAMAQsLIANBADYCACAJDwUgAyABQQJ0akEANgIAIAFBAWohAQwBCwALAAtB+NEBQcq7AUHGAEHqmAEQAAALQQALCwAgACABQQIQmggLPgECfCABtyEDA0BBzN0KLwEAIAJKBEAQ1QEhBCAAKAIQKAKUASACQQN0aiAEIAOiOQMAIAJBAWohAgwBCwsL9wECAn8CfCMAQTBrIgMkACAAIAEQLSEBA0AgAQRAAkACQCACRQ0AIAEgAhBBIgQtAABFDQAgAyADQShqNgIgAkAgBEGHigEgA0EgahBOQQBMDQAgAysDKCIFRAAAAAAAAAAAYw0AIAVEAAAAAAAAAABiDQJBmN0KKAIADQILIAMgBDYCEEGOuwMgA0EQahArIAAQICEEIANCgICAgICAgPg/NwMIIAMgBDYCAEGxqgQgAxCCAQsgA0KAgICAgICA+D83AyhEAAAAAAAA8D8hBQsgASgCECAFOQOIASAGIAWgIQYgACABEDAhAQwBCwsgA0EwaiQAIAYLkAEBBX8jAEHgAGsiAyQAIABBAUGE+ABB74YFECEhBSAAQQFBtT1B74YFECEhBiAAEBshAiABQQJJIQEDQCACBEAgA0E3aiIEIAIoAhA0AvQBEIkOIAIgBSAEEHIgAUUEQCADQQ5qIgQgAigCEDQC+AEQiQ4gAiAGIAQQcgsgACACEBwhAgwBCwsgA0HgAGokAAvYAQECfyAAEHohAQNAIAEEQCABEJ0IIAEQeSEBDAELCwJAIABBwilBAEEBEDVFDQAgACgCECgCCBAYIAAoAhAiAUEANgIIIAEoArgBEBggACgCECgCjAIQGCAAKAIQKALYARAYIAAoAhAiAigCxAEEQCACKALoASEBA0AgASACKALsAUpFBEAgAigCxAEgAUHIAGxqKAIMEBggAUEBaiEBIAAoAhAhAgwBCwsgAigCxAFBuH9BACACKALoAUF/RhtqEBgLIAAQNyAARg0AIAAoAhAoAgwQvQELC54CAQN/IwBBQGoiAiQAIAJCADcDOCACQgA3AzACfyAAEDhFBEAgAUEANgIAQQAMAQsgAkIANwMQIAJCADcDICACQgA3AwggAkIANwMYIAJBsgM2AiwgAkGzAzYCKCAAEBshAwNAIAMEQCADKAIQQQA2ArABIAAgAxAcIQMMAQsLIAAQGyEDA0AgAwRAIANBfyACKAIsEQAARQRAIAJBMGoiBEEAEPUFIAIgAigCEDYCACAEIAIQ9AUgACAEEPMFQQEQlQEiBEHCKUGYAkEBEDUaIAAgAyAEIAJBGGoQ8gUaIAJBCGogBBBnCyAAIAMQHCEDDAELCyACQRhqEKEIIAJBMGoQZSABIAIoAhA2AgAgAkEIahCgCAsgAkFAayQAC64BAQN/IwBBEGsiBCQAIAAQRyICIAFqIgEgAkEBdEGACCACGyIDIAEgA0sbIQEgABAkIQMCQAJAIAAtAA9B/wFGBEAgACgCACACIAFBARCRASECDAELQQAgASABQQEQQyICGw0BIAIgACADEB8aIAAgAzYCBAsgAEH/AToADyAAIAE2AgggACACNgIAIARBEGokAA8LIAQgATYCAEG4+AgoAgBBz+4DIAQQHhoQJwALqwEBBX8gACgCBCECAkACQANAIAIEQCAAKAIMIgNFDQIgACgCACgCACEBA0AgAwRAIAAoAgAgA0EBayIDQQJ0aiIEKAIAIAQgATYCACEBDAEFIAAgAkEBayICNgIEDAMLAAsACwsgACgCCCAAKAIMSw0BIABCADcCCCAAKAIAIABCADcCAA8LQeeVA0HsvQFB7wBB/7cBEAAAC0GFpANB7L0BQe8AQf+3ARAAAAtAAQF/A0AgASAAKAIIT0UEQCAAIAEQlA4aIAFBAWohAQwBCwsgAEIANwIEIAAoAgAQGCAAQgA3AgggAEIANwIAC/8EAgJ/AX0gAEGopAEQJiEDIwBB4ABrIgAkAAJAAkAgAgRAIAIgATYCECACQgA3AhggAkEANgIEIANFDQIgA0GmEBCXDgRAIAJBBDYCECADLQAFQd8ARwRAIANBBWohAwwDCyADQQZqIQMDQAJAAkACQAJAAkACQAJAAkAgAy0AACIEQewAaw4KBAsLCwsLBQsCAQALAkAgBEHiAGsOAgMGAAtBwAAhASAEQekARw0KDAYLQQIhAQwFC0EQIQEMBAtBICEBDAMLQQQhAQwCC0EIIQEMAQtBASEBCyACIAIoAhwgAXI2AhwgA0EBaiEDDAALAAsgA0GQJxCXDgRAIAJBBTYCECAAIABB3ABqNgJQAkAgA0EGakHUjAEgAEHQAGoQTkEATA0AIAAqAlwiBUMAAAAAXkUNACACIAU4AgAMBAsgAkGAgID8AzYCAAwDCyADQbI7EGMEQCACQQE2AhAMAwsgA0HI/gAQYwRAIAJBAzYCEAwDCyADQaOkARBjRQ0CIAJBAjYCEAwCC0G54gBBzsABQb0JQfniABAAAAsgACAAQdwAajYCQCADQZa2ASAAQUBrEE5BAEwNACAAKAJcIgFBAEwNACACIAE2AgQLQYzdCi0AAARAQaHeBEELQQFBuPgIKAIAIgEQUxogACACKAIQQQFrIgNBBE0EfyADQQJ0QaTLCGooAgAFQbuxAQs2AjAgAUHmhwQgAEEwahAeGiACKAIQQQVGBEAgACACKgIAuzkDICABQaiuBCAAQSBqEDELIAAgAigCBDYCECABQYnMBCAAQRBqEB4aIAAgAigCHDYCACABQfzLBCAAEB4aCyACKAIQIABB4ABqJAALqQUCA38HfCAGIAEoAgxBBXRqIgcrAxghCyAHKwMQIQwgBysDCCENIAcrAwAhDgJAIABFBEACfyALIA2hIAVBAXS4IgqgIAS4Ig+jmyIQmUQAAAAAAADgQWMEQCAQqgwBC0GAgICAeAtBfm0hBQJ/IAwgDqEgCqAgD6ObIgqZRAAAAAAAAOBBYwRAIAqqDAELQYCAgIB4C0F+bSAFIAEgAiADIAQgBhD/AQ0BC0EAQQAgASACIAMgBCAGEP8BDQBBASEAIAwgDqGbIAsgDaGbZkUEQANAQQAhB0EAIABrIQUDQAJAIAUgB04EQCAFIQgDQCAAIAhGDQIgCCAHIAEgAiADIAQgBhD/ASAIQQFqIQhFDQALDAULIAUgByABIAIgAyAEIAYQ/wENBCAHQQFrIQcMAQsLA0AgACAHRwRAIAAgByABIAIgAyAEIAYQ/wEgB0EBaiEHRQ0BDAQLCyAAIQcDQAJAIAUgB04EQCAAIQUDQCAFQQBMDQIgByAFIAEgAiADIAQgBhD/ASAFQQFrIQVFDQALDAULIAcgACABIAIgAyAEIAYQ/wENBCAHQQFrIQcMAQsLIABBAWohAAwACwALA0BBACEHQQAgAGshCANAIAAgB0YEQCAIIQcDQCAAIAdGBEAgACEHA0ACQCAHIAhMBEAgACEFA0AgBSAITA0CIAcgBSABIAIgAyAEIAYQ/wENCSAFQQFrIQUMAAsACyAHIAAgASACIAMgBCAGEP8BDQcgB0EBayEHDAELCwNAIAcEQCAHIAUgASACIAMgBCAGEP8BIAdBAWohB0UNAQwHCwsgAEEBaiEADAQLIAAgByABIAIgAyAEIAYQ/wEgB0EBaiEHRQ0ACwwDCyAHIAggASACIAMgBCAGEP8BIAdBAWohB0UNAAsLCwuRCgMEfwN8AX4jAEGwAWsiByQAAkACQCAGRQ0AIAAoAhAoAggiBkUNACAFuCELA0AgCCAGKAIETw0CIAYoAgAgCEEwbGoiASgCDCABKAIIIQUgASgCBCEJIAEoAgAhBiAHIAEpAyg3A6gBIAcgASkDIDcDoAEgBwJ/IAUEQCAHIAEpAxg3A5gBIAcgASkDEDcDkAFBASEFIAYMAQsgByAGKQMINwOYASAHIAYpAwA3A5ABQQIhBSAGQRBqCyIBKQMINwOIASAHIAEpAwA3A4ABIAQgBysDmAGgIQwgBwJ8IAMgBysDkAGgIg1EAAAAAAAAAABmBEAgDSALowwBCyANRAAAAAAAAPA/oCALo0QAAAAAAADwv6ALOQOQASAHIAxEAAAAAAAAAABmBHwgDCALowUgDEQAAAAAAADwP6AgC6NEAAAAAAAA8L+gCzkDmAEgBCAHKwOIAaAhDCAHAnwgAyAHKwOAAaAiDUQAAAAAAAAAAGYEQCANIAujDAELIA1EAAAAAAAA8D+gIAujRAAAAAAAAPC/oAs5A4ABIAcgDEQAAAAAAAAAAGYEfCAMIAujBSAMRAAAAAAAAPA/oCALo0QAAAAAAADwv6ALOQOIASAHIAcpA5gBNwN4IAcgBykDiAE3A2ggByAHKQOQATcDcCAHIAcpA4ABNwNgIAdB8ABqIAdB4ABqIAIQ9gUgBSAJIAUgCUsbIQEDQCABIAVGRQRAIAcgBykDiAE3A5gBIAcgBykDgAE3A5ABIAcgBiAFQQR0aiIJKQMINwOIASAHIAkpAwA3A4ABIAQgBysDiAGgIQwgBwJ8IAMgBysDgAGgIg1EAAAAAAAAAABmBEAgDSALowwBCyANRAAAAAAAAPA/oCALo0QAAAAAAADwv6ALOQOAASAHIAxEAAAAAAAAAABmBHwgDCALowUgDEQAAAAAAADwP6AgC6NEAAAAAAAA8L+gCzkDiAEgByAHKQOYATcDWCAHIAcpA4gBNwNIIAcgBykDkAE3A1AgByAHKQOAATcDQCAHQdAAaiAHQUBrIAIQ9gUgBUEBaiEFDAELCwRAIAcpA4gBIQ4gByAHKQOoATcDiAEgByAONwOYASAHKQOAASEOIAcgBykDoAE3A4ABIAcgDjcDkAEgBCAHKwOIAaAhDCAHAnwgAyAHKwOAAaAiDUQAAAAAAAAAAGYEQCANIAujDAELIA1EAAAAAAAA8D+gIAujRAAAAAAAAPC/oAs5A4ABIAcgDEQAAAAAAAAAAGYEfCAMIAujBSAMRAAAAAAAAPA/oCALo0QAAAAAAADwv6ALOQOIASAHIAcpA5gBNwM4IAcgBykDiAE3AyggByAHKQOQATcDMCAHIAcpA4ABNwMgIAdBMGogB0EgaiACEPYFCyAIQQFqIQggACgCECgCCCEGDAALAAsgB0GAAWogAEFQQQAgACgCAEEDcUECRxtqKAIoEPAGIAQgBysDiAGgIQQgBwJ8IAMgBysDgAGgIgNEAAAAAAAAAABmBEAgAyAFuKMMAQsgA0QAAAAAAADwP6AgBbijRAAAAAAAAPC/oAs5A4ABIAcgBEQAAAAAAAAAAGYEfCAEIAW4owUgBEQAAAAAAADwP6AgBbijRAAAAAAAAPC/oAs5A4gBIAcgASkDCDcDGCABKQMAIQ4gByAHKQOIATcDCCAHIA43AxAgByAHKQOAATcDACAHQRBqIAcgAhD2BQsgB0GwAWokAAupAQEFfyAAEBshAgNAIAIEQCACKAIQQQA2AugBIAAgAhAtIQMDQCADBEACQCADKAIQKAKwASIBRQ0AA0AgASABQTBrIgQgASgCAEEDcUECRhsoAigoAhAiBS0ArAFBAUcNASAFQQA2AugBIAEgBCABKAIAQQNxQQJGGygCKCgCECgCyAEoAgAiAQ0ACwsgACADEDAhAwwBCwsgACACEBwhAgwBCwsgABChDgtiAQN/IAAgAUYEQEEBDwsgACgCECgCyAEhA0EAIQADQAJAIAMgAEECdGooAgAiAkEARyEEIAJFDQAgAEEBaiEAIAJBUEEAIAIoAgBBA3FBAkcbaigCKCABEKYIRQ0BCwsgBAsVACAAIAFBBEGHKUHHAEGVvgEQ/gYLIwAgACgCCEUEQEHhoQNBlb4BQccAQYMfEAAACyAAQQAQpwgLDgAgAEHHAEGVvgEQywoLmAECA38CfCAAKAIQIgEoAsQBBEAgASgCyAEhAQNAIAEoAgAiAygCECICQfgAaiEBIAItAHANAAsgAigCYCIBKwMgIQQgASsDGCEFIAAQLyECIAMoAhAoAmAiASAAKAIQIgArAxAgBCAFIAIoAhAoAnRBAXEbRAAAAAAAAOA/oqA5AzggACsDGCEEIAFBAToAUSABIAQ5A0ALCz4BAnwgACABKwMAIgIQMjkDACAAIAErAwgiAxAyOQMIIAAgAiABKwMQoBAyOQMQIAAgAyABKwMYoBAyOQMYC0MBAn8jAEEQayIAJABBAUGIFBBDIgFFBEAgAEGIFDYCAEG4+AgoAgBBz+4DIAAQHhoQJwALIAEQ4Q4gAEEQaiQAIAELEgAgACABQZokQRdB1LwBEJwECxQAIAAgAUEUQfooQSJB1LwBEI8FC5kBAQR/IwBBMGsiASQAIAFBGGpBBHIhBANAIAIgACgCCE9FBEAgAUEEaiAAIAIQgQYgASABKAIUNgIoIAEgASkCDDcDICABIAEpAgQ3AxhBACEDA0AgAyABKAIkT0UEQCAEIAMQrQgaIANBAWohAwwBCwsgAUIANwMgIAEoAhwQGCACQQFqIQIMAQsLIABCADcCBCABQTBqJAALCwBBACAAIAEQ9Q4L2wIBBX8CQCABKAIQIgUoAugBDQBBtIALKAIAIQYCQCACBEADQCAFKALIASAEQQJ0aigCACIHRQ0CIAcQ6w5FBEAgBiADQQJ0aiAHNgIAIAEoAhAhBSADQQFqIQMLIARBAWohBAwACwALA0AgBSgCwAEgBEECdGooAgAiB0UNASAHEOsORQRAIAYgA0ECdGogBzYCACABKAIQIQUgA0EBaiEDCyAEQQFqIQQMAAsACyADQQJIDQAgBiADQQJ0akEANgIAIAYgA0EEQagDEJQBQVBBMCACGyEBQQJBAyACGyECQQEhBANAIAYgBEECdGoiBSgCACIDRQ0BIAVBBGsoAgAiBSABQQAgBSgCAEEDcSACRxtqKAIoIgUgAyABQQAgAygCAEEDcSACRxtqKAIoIgMQng8NASAFIANBABDDCCIDKAIQQQQ6AHAgACADEIgGIARBAWohBAwACwALCxMAIAAgAUG4qgFBFkGAgQEQmwQLpwQCDX8EfiAAKAIQIgQoAuwBIQYgBCgC6AEhAgNAIAIgBkoEQAJAA0AgBCgC6AEhAkIAIREDQCAEKALsASEDAkADQCACIANKDQEgBCgCxAEiBSACQcgAbCIJaiIGLQAwRQRAIAJBAWohAgwBCwtBACEIIAZBADoAMCACQQFqIQZBsIALKAIAIQxCACESIAJBAWtByABsIQoDQCAFIAZByABsIgtqIQ0gBSAJaiIOKAIAQQFrIQUCQANAIAUgCEwNASAOKAIEIgMgCEECdGooAgAiBygCECgC+AEgAyAIQQFqIghBAnRqKAIAIgMoAhAoAvgBTg0GIAAgByADEIAPDQACfiACQQBMBEBCACEPQgAMAQsgByADEPMOIQ8gAyAHEPMOCyEQIA0oAgBBAEoEQCAPIAcgAxDyDqx8IQ8gECADIAcQ8g6sfCEQCyABRSAPQgBXciAPIBBSciAPIBBXcQ0ACyAHIAMQtAggDCgCECgCxAEiAyAJakEAOgAxIAAoAhAiBCgCxAEiBSAJakEBOgAwIAQoAugBIAJIBEAgAyAKakEAOgAxIAUgCmpBAToAMAsgDyAQfSASfCESIAIgBCgC7AFODQEgAyALakEAOgAxIAUgC2pBAToAMAwBCwsgESASfCERIAYhAgwBCwsgEUIAVQ0ACw8LBSAEKALEASACQcgAbGpBAToAMCACQQFqIQIMAQsLQcegA0HJvQFBuAVBtt4AEAAAC3IBBH8gACgCECICKAL4ASEDIAIgASgCECgC+AEiBDYC+AEgAigC9AFByABsIgJBsIALKAIAIgUoAhAoAsQBaigCBCAEQQJ0aiAANgIAIAEoAhAgAzYC+AEgBSgCECgCxAEgAmooAgQgA0ECdGogATYCAAuCAQEGfyAAKAIQIgMoAuwBIQQgAygC6AEhAQNAIAEgBEpFBEBBACEAIAMoAsQBIAFByABsaiIFKAIAIgJBACACQQBKGyECA0AgACACRkUEQCAFKAIEIABBAnRqKAIAKAIQIgYgBigC+AG3OQMQIABBAWohAAwBCwsgAUEBaiEBDAELCwvyAQEHf0EBIQEDQCAAKAIQIgIoArQBIAFIBEACQCACKAKMAkUNACACKALoASEBA0AgASACKALsAUoNASABQQJ0IgUgAigCjAJqKAIAIgMEQCAAIANBfxD7DiEEIAAgA0EBEPsOIQMgACgCECgCjAIgBWogBDYCACAAEGEhBSABQcgAbCIGIAAoAhAiAigCxAFqIgcgBSgCECgCxAEgBmooAgQgBCgCECgC+AEiBEECdGo2AgQgByADKAIQKAL4ASAEa0EBajYCAAsgAUEBaiEBDAALAAsFIAIoArgBIAFBAnRqKAIAELYIIAFBAWohAQwBCwsL4w4DFn8DfgJ8IwBBIGsiCiQAQv///////////wAhGiABQQJPBEAgAhDLBCEaIAAQtQgLQbj4CCgCACEVIBohGQJAA0ACQCAaIRsCQAJAAkAgAUECaw4CAQMAC0HI3QooAgAhAwJAIAAQYSAARw0AIAAgASACEIQPRQ0AQn8hGQwFCyABRQRAIAAQgw8LQQQgAyADQQROGyEDIAAQgg8gAhDLBCIaIBlVDQEgABC1CCAaIRkMAQtByN0KKAIAIQMgGSAbUwRAIAAQgQ8LIBkhGgtBACEOIANBACADQQBKGyEWQQAhDwNAAkACQCAOIBZGDQBBjN0KLQAABEAgCiAZNwMYIAogGjcDECAKIA82AgggCiAONgIEIAogATYCACAVQbm6BCAKEB4aCyAaUCAPQbiACygCAE5yDQAgACgCECEDAn8gDkEBcSIXRQRAIANB7AFqIQRBASESIAMoAugBIgMgA0GwgAsoAgAoAhAoAugBTGoMAQsgA0HoAWohBEF/IRIgAygC7AEiAyADQbCACygCACgCECgC7AFOawshESAPQQFqIQ8gDkECcSETIAQoAgAgEmohGANAIBEgGEYNAkEAIQlBvIALKAIAIgVBBGshCCAAKAIQKALEASIDIBFByABsIhRqKAIEIQsDQCADIBRqIhAoAgAiByAJTARAQQAhCSAHQQAgB0EAShshDEEAIQYDQAJAAn8CQCAGIAxHBEAgCyAGQQJ0aigCACgCECIFKALMAQ0DIAUoAsQBDQMgBQJ8IAUoAtwBBEAgBSgC2AEiDSgCACIDQTBBACADKAIAQQNxQQNHG2ooAighA0EBIQQDQCANIARBAnRqKAIAIggEQCAIQTBBACAIKAIAQQNxQQNHG2ooAigiCCADIAgoAhAoAvgBIAMoAhAoAvgBShshAyAEQQFqIQQMAQsLIAMoAhArA4ACIhxEAAAAAAAAAABmRQ0DIBxEAAAAAAAA8D+gDAELIAUoAtQBRQ0CIAUoAtABIg0oAgAiA0FQQQAgAygCAEEDcUECRxtqKAIoIQNBASEEA0AgDSAEQQJ0aigCACIIBEAgCEFQQQAgCCgCAEEDcUECRxtqKAIoIgggAyAIKAIQKAL4ASADKAIQKAL4AUgbIQMgBEEBaiEEDAELCyADKAIQKwOAAiIcRAAAAAAAAAAAZEUNAiAcRAAAAAAAAPC/oAs5A4ACQQAMAgtBACEIQQBBfCAJQQFxG0EAIBMbIQwgECgCBCIGIAdBAnRqIQQDQAJAIAdBAEoEQCAHQQFrIQcgBiEDA0AgAyAETw0CA0AgAyAETw0DIAMoAgAiECgCECsDgAIiHEQAAAAAAAAAAGMEQCADQQRqIQMMAQVBACEFA0AgA0EEaiIDIARPDQUgAygCACELIAUiCUEBcQRAQQEhBSALKAIQKALoAQ0BCyAAIBAgCxCADw0DIAsoAhAiBSsDgAIiHUQAAAAAAAAAAGZFBEAgBSgC6AFBAEcgCXIhBQwBCwsgHCAdZCATRSAcIB1mcXJFDQIgECALELQIIAhBAWohCAwCCwALAAsACwJAIAhFDQBBsIALKAIAKAIQKALEASAUaiIDQQA6ADEgEUEATA0AIANBF2tBADoAAAsgESASaiERDAgLIAQgDGohBAwACwALQQELIAlyIQkLIAZBAWohBgwACwAFIAsgCUECdGooAgAiECgCECEHAkAgF0UEQCAHKALAASEMQQAhA0EAIQYDQCAMIAZBAnRqKAIAIgRFDQIgBCgCECINLgGaAUEASgRAIAUgA0ECdGogDS0AMCAEQTBBACAEKAIAQQNxQQNHG2ooAigoAhAoAvgBQQh0cjYCACADQQFqIQMLIAZBAWohBgwACwALIAcoAsgBIQxBACEDQQAhBgNAIAwgBkECdGooAgAiBEUNASAEKAIQIg0uAZoBQQBKBEAgBSADQQJ0aiANLQBYIARBUEEAIAQoAgBBA3FBAkcbaigCKCgCECgC+AFBCHRyNgIAIANBAWohAwsgBkEBaiEGDAALAAtEAAAAAAAA8L8hHAJAAkACQAJAIAMOAwMAAQILIAUoAgC3IRwMAgsgBSgCBCAFKAIAakECbbchHAwBCyAFIANBBEGmAxCUASADQQF2IQYCfCADQQFxBEAgBSAGQQJ0aigCALcMAQsgBSAGQQJ0aiIHQQRrKAIAIgYgBSgCAGsiBCAIIANBAnRqKAIAIAcoAgAiA2siB0YEQCADIAZqQQJttwwBCyAGtyAHt6IgA7cgBLeioCAEIAdqt6MLIRwgECgCECEHCyAHIBw5A4ACIAlBAWohCSAAKAIQKALEASEDDAELAAsACwALIAFBAWohAUIAIRsgGkIAUg0DDAILIAAgE0EARxCzCCAZIAIQywQiGlkEQCAAELUIQQAgDyAauSAZuUTXo3A9CtfvP6JjGyEPIBohGQsgDkEBaiEODAALAAsLIBkgG1MEQCAAEIEPCyAZQgBXDQAgAEEAELMIIAIQywQhGQsgCkEgaiQAIBkLogIBA38jAEEgayICJAACQEHs3QooAgAiAUG83gooAgByRQ0AIAAgAUEAEHsiAQRAIAFBsRkQYwRAIABBARDxDgwCCyABQYbpABBjBEAgAEEAEPEODAILIAEtAABFDQEgAiABNgIQQaroBCACQRBqEDYMAQsgABB6IQEDQCABBEAgARDFAUUEQCABELgICyABEHkhAQwBCwtBvN4KKAIARQ0AIAAQGyEBA0AgAUUNAQJAIAFBvN4KKAIAQQAQeyIDRQ0AIANBsRkQYwRAIAAgAUEBELEIDAELIANBhukAEGMEQCAAIAFBABCxCAwBCyADLQAARQ0AIAIgARAgNgIEIAIgAzYCAEGt7gQgAhA2CyAAIAEQHCEBDAALAAsgAkEgaiQAC7kCAQV/IAEoAhAiBEEBNgIIIAQoAhQoAhAoAvgBIQQgAyACEDhBAnRqIAQ2AgAgAiABQQEQhgEaIAAgARAtIQQDQCAEBEAgBSAEQVBBACAEKAIAQQNxIgZBAkcbaigCKCIHKAIQIggoAhQoAhAoAvgBIARBMEEAIAZBA0cbaigCKCgCECgCFCgCECgC+AFKaiEFIAgoAghFBEAgACAHIAIgAxC5CCAFaiEFCyAAIAQQMCEEDAELCyAAIAEQuQIhBANAIAQEQCAFIARBUEEAIAQoAgBBA3EiAUECRxtqKAIoKAIQKAIUKAIQKAL4ASAEQTBBACABQQNHG2ooAigiASgCECIGKAIUKAIQKAL4AUpqIQUgBigCCEUEQCAAIAEgAiADELkIIAVqIQULIAAgBBCPAyEEDAELCyAFCx4AIAEEQCAAEIICIQAgARCCAigCECAANgKoAQsgAAtyAQJ/IwBBIGsiASQAAkAgAEGAgICABEkEQCAAQQQQQyICRQ0BIAFBIGokACACDwsgAUEENgIEIAEgADYCAEG4+AgoAgBBgO8DIAEQHhoQJwALIAEgAEECdDYCEEG4+AgoAgBBz+4DIAFBEGoQHhoQJwALjQEBAX8CQCABKAIQIgMoApABDQAgAyACNgKQASAAIAEQLSEDA0AgAwRAIAAgA0FQQQAgAygCAEEDcUECRxtqKAIoIAIQvAggACADEDAhAwwBCwsgACABELkCIQMDQCADRQ0BIAAgA0EwQQAgAygCAEEDcUEDRxtqKAIoIAIQvAggACADEI8DIQMMAAsACwsLACAAQdEnECYQawv9BQEKfyMAQUBqIgMkACADQgA3AxhBnIALQQFBnIALKAIAQQFqIgYgBkEBTRs2AgAgA0IANwMQIAAoAhBBADYC3AEgABAbIQYgAUEATCEJQQAhAQJAA0ACQAJAAkACQCAGRQRAA0AgASAHRg0CIANBEGogBxCaDxogB0EBaiEHDAALAAsCQAJAIAkNACAGKAIQIgIoAugBIgRFDQAgBCgCECgCjAIgAigC9AFBAnRqKAIAIQIMAQsgBiICEKYBIAJHDQMLIAIoAhAoArABQZyACygCAEYNAiAAKAIQQQA2AsABQaCAC0EANgIAIANBEGogAhCZDwNAIAMoAhgiAUUEQEEAIQEMAwsgA0EQaiABQQFrIgEQmg8hBCADIAE2AhggBEUNAkGcgAsoAgAiAiAEKAIQIgEoArABRg0AIAEgAjYCsAFBACEFQaCACygCACICIAAgAhsoAhBBuAFBwAEgAhtqIAQ2AgAgASACNgK8AUGggAsgBDYCACABQQA2ArgBIAMgBCgCECIBKQPYATcDICADIAEpA9ABNwMoIAMgASkDwAE3AzAgAyABKQPIATcDOANAIAVBBEYNAQJAIANBIGogBUEDdGoiASgCACIKRQ0AIAEoAgQiAkUNAANAIAJFDQEgBCAKIAJBAWsiAkECdGooAgAiCEFQQQAgCCgCAEEDcSILQQJHG2ooAigiAUYEQCAIQTBBACALQQNHG2ooAighAQsgASgCECgCsAFBnIALKAIARg0AIAEQpgEgAUcNACADQRBqIAEQmQ8MAAsACyAFQQFqIQUMAAsACwALIAMoAhAQGCADQUBrJAAPCyAAKAIQIgIgAigC3AEiBEEBaiIFNgLcASAEQf////8DTw0BIAIoAtgBIAVBAnQiBRA5IgJFDQMgACgCECIFIAI2AtgBIAIgBEECdGogBSgCwAE2AgALIAAgBhAcIQYMAQsLQdvEA0HpggFBzQBB9LYBEAAACyADIAU2AgBBuPgIKAIAQc/uAyADEB4aECcACywBAX8gACgCBCICBEAgAiABNgIMCyAAIAE2AgQgACgCAEUEQCAAIAE2AgALC20BA38gABCQAiAAIABBMGsiASAAKAIAQQNxIgJBAkYbKAIoIAAgAEEwaiIDIAJBA0YbKAIoELIDIgIEQCAAIAIQiQMPCyAAIAEgACgCAEEDcSIBQQJGGygCKCAAIAMgAUEDRhsoAiggABDjARoLiAEBAX8gAARAAkAgACgCECgCeCIBRQ0AIAEoAhAiASgCsAEgAEcNACABQQA2ArABCyAAQTBBACAAKAIAQQNxQQNHG2ooAigoAhBB0AFqIAAQjAYgAEFQQQAgACgCAEEDcUECRxtqKAIoKAIQQdgBaiAAEIwGDwtB69YBQdC+AUHfAUHZoQEQAAALVgECfyABKAIQIgIgACgCECIDKALAASIANgK4ASAABEAgACgCECABNgK8AQsgAyABNgLAASACQQA2ArwBIAAgAUYEQEHXpwNB0L4BQbkBQZ6kARAAAAsL8QIBBX9B4AAQigYiBCAEKAIwQQNyIgU2AjAgBCAEKAIAQXxxQQJyIgY2AgBBuAEQigYhAyAEIAA2AlggBCADNgIQIAQgATYCKCADQQE6AHAgAgRAIAQgAigCACIHQXBxIgEgBUEPcXI2AjAgBCAGQQ5xIAFyNgIAIAMgAigCECIBLwGoATsBqAEgAyABLwGaATsBmgEgAyABKAKcATYCnAEgAyABKAKsATYCrAFBECEFAkAgA0EQaiACQTBBACAHQQNxIgZBA0cbaigCKCIHIABHBH8gACACQVBBACAGQQJHG2ooAihHDQFBOAVBEAsgAWpBKBAfGgtBOCEAAkAgA0E4aiAEKAIoIgUgAkFQQQAgBkECRxtqKAIoRwR/IAUgB0cNAUEQBUE4CyABakEoEB8aCyABKAKwAUUEQCABIAQ2ArABCyADIAI2AnggBA8LIANBATYCrAEgA0EBOwGoASADQQE7AZoBIANBATYCnAEgBAvOAgEHfwNAIAEoAhAiAygCwAEgBUECdGooAgAiAgRAAkAgAigCECIGKAKkAUEASARAIAJBMEEAIAIoAgBBA3EiA0EDRxtqKAIoKAIQIgcoArACIgggACgCME4EQCAIIAAoAjRMDQILIAJBUEEAIANBAkcbaigCKCgCECgC9AEgBygC9AEgBigCrAFqayIDIAAoAjhOBEAgACgCLA0CCyAAIAM2AjggACACNgIsDAELIAJBMEEAIAIoAgBBA3FBA0cbaigCKCICKAIQKAKwAiADKAKwAk4NACAAIAIQxAgLIAVBAWohBQwBBQNAAkAgAygCoAIgBEECdGooAgAiAkUNACAAKAI4QQBMDQAgAkFQQQAgAigCAEEDcUECRxtqKAIoIgIoAhAoArACIAMoArACSARAIAAgAhDECCABKAIQIQMLIARBAWohBAwBCwsLCwvOAgEHfwNAIAEoAhAiAygCyAEgBUECdGooAgAiAgRAAkAgAigCECIGKAKkAUEASARAIAJBUEEAIAIoAgBBA3EiA0ECRxtqKAIoKAIQIgcoArACIgggACgCME4EQCAIIAAoAjRMDQILIAcoAvQBIAJBMEEAIANBA0cbaigCKCgCECgC9AEgBigCrAFqayIDIAAoAjhOBEAgACgCLA0CCyAAIAM2AjggACACNgIsDAELIAJBUEEAIAIoAgBBA3FBAkcbaigCKCICKAIQKAKwAiADKAKwAk4NACAAIAIQxQgLIAVBAWohBQwBBQNAAkAgAygCmAIgBEECdGooAgAiAkUNACAAKAI4QQBMDQAgAkEwQQAgAigCAEEDcUEDRxtqKAIoIgIoAhAoArACIAMoArACSARAIAAgAhDFCCABKAIQIQMLIARBAWohBAwBCwsLCwvKBQEIfyMAQSBrIgQkACAAKAIAIgAoAhAhCyAAKAIIIQkCQCADRQRAIAIhAAwBCyAEQgA3AxggBEIANwMQIAQgAjYCACAEIAM2AgQgBEEQaiEAIwBBMGsiBSQAIAUgBDYCDCAFIAQ2AiwgBSAENgIQAkACQAJAAkACQAJAQQBBAEGCNyAEEGAiCkEASA0AQQEhByAKQQFqIQYCQCAKIAAQRyAAECRrIghPBEAgABAoQQAgBiAIayIIQQFGGw0BIAAgCBD5AwtBACEHCyAFQgA3AxggBUIANwMQIAcgCkEQT3ENASAFQRBqIQggCiAHBH8gCAUgABB1CyAGQYI3IAUoAiwQYCIGRyAGQQBOcQ0CIAZBAEwNACAAECgEQCAGQYACTw0EIAcEQCAAEHUgBUEQaiAGEB8aCyAAIAAtAA8gBmo6AA8gABAkQRBJDQFBuLsDQZqCAUHYAUHNHxAAAAsgBw0EIAAgACgCBCAGajYCBAsgBUEwaiQADAQLQeqpA0GaggFBywFBzR8QAAALQf2dA0GaggFB0AFBzR8QAAALQdDPAUGaggFB0wFBzR8QAAALQaeiAUGaggFB2gFBzR8QAAALAkAgABAoBEAgABAkQQ9GDQELIARBEGoiABAkIAAQR08EQCAAQQEQ+QMLIARBEGoiABAkIQUgABAoBEAgACAFakEAOgAAIAQgBC0AH0EBajoAHyAAECRBEEkNAUG4uwNBmoIBQZ0CQZm2ARAAAAsgBCgCECAFakEAOgAAIAQgBCgCFEEBajYCFAsCQCAEQRBqECgEQCAEQQA6AB8MAQsgBEEANgIUCyAEQRBqIgUQKCEAIAkgBSAEKAIQIAAbELEBIQAgCSACQQAQjQEaIAkgA0EAEI0BGiAFEGULIAtBCGpBgwIgCygCACABQQEQjgEgABCLBhC/CCAJIAFBABCNARogBEEgaiQAC58DAQZ/A0ACQCAAKAIQIgUoAqACIAJBAnRqKAIAIgRFBEADQCAFKAKYAiADQQJ0aigCACICRQ0CIAEgAkcEQCACQTBBACACKAIAQQNxQQNHG2ooAiggAhDHCCAAKAIQIQULIANBAWohAwwACwALIAEgBEcEQCAEQVBBACAEKAIAQQNxQQJHG2ooAiggBBDHCAsgAkEBaiECDAELCwJAAkAgAQRAQQEhAiABIAFBMEEAIAEoAgBBA3EiAEEDRxtqKAIoIgUoAhAiBCgCqAJHBEAgAUFQQQAgAEECRxtqKAIoIgUoAhAhBEF/IQILIAQoAsgBIQZBACEAQQAhAwNAAkAgBiADQQJ0aigCACIHRQRAIAQoAsABIQRBACEDA0AgBCADQQJ0aigCACIGRQ0CIAYgBSACEKIPIgZBAEggACAAIAZqIgBKRw0GIANBAWohAwwACwALIAcgBSACEKIPIgdBAEggACAAIAdqIgBKRw0DIANBAWohAwwBCwsgASgCECAANgKgAQsPC0GfkQRBABA2ECcAC0GfkQRBABA2ECcAC7gBAQR/IAAoAhAiBCAEKAL0ASACajYC9AEDQCAEKAKYAiADQQJ0aigCACIFBEAgASAFQTBBACAFKAIAQQNxQQNHG2ooAigiBUcEQCAFIAAgAhDICCAAKAIQIQQLIANBAWohAwwBBQNAAkAgBCgCoAIgBkECdGooAgAiA0UNACABIANBUEEAIAMoAgBBA3FBAkcbaigCKCIDRwRAIAMgACACEMgIIAAoAhAhBAsgBkEBaiEGDAELCwsLC/IEAQZ/IAAQ0AQhBwJAIAIEQCACQVBBACACKAIAQQNxIgNBAkcbaigCKCgCECgC9AEgAigCECgCrAEgAkEwQQAgA0EDRxtqKAIoKAIQKAL0AWpGDQELA0AgACgCECIEKALIASAFQQJ0aigCACIDBEAgAygCAEEDcSEEAkAgAygCECgCpAFBAE4EQCADQVBBACAEQQJHG2ooAigiAyABRg0BIAMgACACEMkIIQIMAQsgAyADQTBrIgggBEECRhsoAigQ0AQgB0YNACACBEAgAyAIIAMoAgBBA3EiBEECRhsoAigoAhAoAvQBIANBMEEAIARBA0cbaigCKCgCECgC9AEgAygCECgCrAFqayACQVBBACACKAIAQQNxIgRBAkcbaigCKCgCECgC9AEgAkEwQQAgBEEDRxtqKAIoKAIQKAL0ASACKAIQKAKsAWprTg0BCyADIQILIAVBAWohBQwBBQNAIAQoAsABIAZBAnRqKAIAIgNFDQMgAygCAEEDcSEFAkAgAygCECgCpAFBAE4EQCADQTBBACAFQQNHG2ooAigiAyABRg0BIAMgACACEMkIIQIMAQsgAyADQTBqIgQgBUEDRhsoAigQ0AQgB0YNACACBEAgA0FQQQAgAygCAEEDcSIFQQJHG2ooAigoAhAoAvQBIAMgBCAFQQNGGygCKCgCECgC9AEgAygCECgCrAFqayACQVBBACACKAIAQQNxIgVBAkcbaigCKCgCECgC9AEgAkEwQQAgBUEDRxtqKAIoKAIQKAL0ASACKAIQKAKsAWprTg0BCyADIQILIAZBAWohBiAAKAIQIQQMAAsACwALAAsgAgvOAQEFfyAAKAIEIQUgACgCACEDIAEhAANAIAFBAXQiAkECaiEEIAUgAkEBciICSwRAIAIgASADIAJBAnRqKAIAKAIEIAMgAUECdGooAgAoAgRIGyEACyAEIAVJBEAgBCAAIAMgBEECdGooAgAoAgQgAyAAQQJ0aigCACgCBEgbIQALIAAgAUcEQCADIAFBAnRqIgQoAgAhAiAEIAMgAEECdGoiBigCADYCACAGIAI2AgAgBCgCACABNgIIIAIgADYCCCAAIQEgACAFSQ0BCwsLegEBfyABKAIIIgJFBEBBh5cDQfW9AUHJAkGs+QAQAAALIAJBAWsiAiABKAIITwRAQY23A0H1vQFByQJByCQQAAALIAAgASgCACABKAIEIAJqIAEoAgxwQQR0aiICKQIANwIAIAAgAikCCDcCCCABIAEoAghBAWs2AggL7gUBB38jAEEQayIHJAACQAJAAkACf0HctgQgASgCECIEKAKkAUEATg0AGiAAKAIUIgJBAEgNAiAEIAI2AqQBAkAgACgCGCIEIAJHBEAgACgCDCEDIAAoAhAhBQwBCyACQQF0QQEgAhsiBEH/////A0sEQEHEACEBDAULIAAoAgwgBEECdBA5IgNFBEBBMCEBDAULIAMgACgCGCIGQQJ0akEAIAQgBmtBAnQQMxogBiAAKAIUIgIgACgCECIFakkEQCAFQQJ0IQggAyAEIAYgBWsiBmsiBUECdGogAyAIaiAGQQJ0EFIaIAAgBTYCEAsgACAENgIYIAAgAzYCDAsgAyACIAVqIARwQQJ0aiABNgIAIAAgAkEBajYCFCABIAFBMGoiBCABKAIAQQNxIgJBA0YbKAIoIgMoAhAoArABRQRAIAAgACgCCCICQQFqNgIIIAAoAgQgAkECdGogAzYCACABKAIAQQNxIQILIAEgBCABIAFBMGsiBCACQQJGGygCKCIDKAIQKAKwAQR/IAIFIAAgACgCCCICQQFqNgIIIAAoAgQgAkECdGogAzYCACABKAIAQQNxC0EDRhsoAigiAigCECIAQQE2ArABIAAgACgCpAIiA0EBajYCpAIgACgCoAIgA0ECdGogATYCAEEAIQAgAigCECIDKAKgAiADKAKkAkECdGpBADYCAEGo4wMgAigCECICKALIASACKAKkAkECdGpBBGsoAgBFDQAaIAEgBCABKAIAQQNxQQJGGygCKCIEKAIQIgJB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AygCBCIFNgIAIANBBGohAyAFDQALIARBBHIhBAwBCyAGQYQxEEwEQANAIAMgAygCBCIFNgIAIANBBGohAyAFDQALIARBCHIhBAwBCyAGQaYxEEwEQCACQQRqIQIgBEEgciEEDAELIAZB3PUAEEwEQANAIAMgAygCBCIFNgIAIANBBGohAyAFDQALIARBA3IhBAwBCwJAIAZBo7EBEExFDQAgACgCECgCCCgCCCIFRQ0AIAUoAghBBEcNACAFKwMQELsHmUQAAAAAAADgP2NFDQAgBSkDGEIAUg0AIAUpAyBCAFINAANAIAMgAygCBCIFNgIAIANBBGohAyAFDQALIARBwAByIQQMAQsCQCAGQbuzARBMRQ0AIAAoAhAoAggoAggiBUUNACAFKAIIQQJLDQADQCADIAMoAgQiBTYCACADQQRqIQMgBQ0ACyAEQYAEciEEDAELIAJBBGohAgwACwALIAEgACgCECgCCCgCCCIABH8gBEGA4B9xRSAAKAAoIgBBgOAfcUVyRQRAQfWbA0GMvgFBvANB+joQAAALIAAgBHIiAkGA4B9xIABBAXEgBEEBcXJyIAJBAnFyIAJBBHFyIAJBCHFyIAJBEHFyIAJBIHFyIAJBwABxciACQYABcXIgAkGAAnFyIAJBgARxciACQYAIcXIgAkGAEHFyBSAECzYCACAHC6YBAgF/BHwjAEEgayICJAAgASgCECIBKwAQIQMgASsDYCEFIAIgASsDUEQAAAAAAADoP6JEAAAAAAAA4D+iIgQgASsAGKAiBjkDGCACIAY5AwggAiADIAVEfGEyVTAq5T+iIgOgIgU5AwAgAiAFIAMgA6ChOQMQIAAgAkECEDogAiACKwMIIAQgBKChIgQ5AxggAiAEOQMIIAAgAkECEDogAkEgaiQACzcBA38DQCABQQNHBEAgACABQQJ0aiICKAIAIgMEQCADEJsBGiACQQA2AgALIAFBAWohAQwBCwsLDAAgAEE6EM0BQQBHC2AAIABBADYCACACIAAQjAoiAARAIAEgABDkAQsCQEHs3gooAgAiAEUNACACIAAQQSIARQ0AIAAtAABFDQAgASACQezeCigCAEQAAAAAAADwP0QAAAAAAAAAABBLEIMCCwsEAEEACzABAX8jAEEQayICJAAgABAgIQAgAiABNgIEIAIgADYCAEH9ugQgAhAr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cSIDQQprDgQEAQECAAsgA0UNAwsgACACwBBmIAEtAAEhAiABQQFqIQEMAQsLQQJBASABLQABQQpGGwwBCyADQQBHCyECIABBChBmIAEgAmohAQwBCwsLyAICAn8BfCMAQYACayIDJAAgAisDECEFIAMgACkDCDcDeCADIAApAwA3A3AgAyABKQMINwNoIAMgASkDADcDYCADQeABaiADQfAAaiADQeAAahDKAwJAIAUgAysD4AFmRQ0AIAMgACkDCDcDWCADIAApAwA3A1AgAyABKQMINwNIIAMgASkDADcDQCADQcABaiADQdAAaiADQUBrEMoDIAMrA9ABIAIrAwBmRQ0AIAIrAxggAyAAKQMINwM4IAMgACkDADcDMCADIAEpAwg3AyggAyABKQMANwMgIANBoAFqIANBMGogA0EgahDKAyADKwOoAWZFDQAgAyAAKQMINwMYIAMgACkDADcDECADIAEpAwg3AwggAyABKQMANwMAIANBgAFqIANBEGogAxDKAyADKwOYASACKwMIZiEECyADQYACaiQAIAQLagICfAF/AkAgASsDECAAKwA4IgIgACsDGEQAAAAAAADgP6IiA6FmRQ0AIAErAwAgAyACoGVFDQAgASsDGCAAKwBAIgIgACsDIEQAAAAAAADgP6IiA6FmRQ0AIAErAwggAyACoGUhBAsgBAsoAQF/A38gAAR/IAAoAgQQogogAWpBAWohASAAKAIAIQAMAQUgAQsLC/oCAQZ/IwBBEGsiBiQAAkACQAJAIAAoAgAiAy0AAEEjRgRAIAMtAAEiAkHfAXFB2ABGBEBBAiEBA0AgAUEIRg0DAkAgASADai0AACICQcEAa0H/AXFBBkkEQEFJIQUMAQsgAkHhAGtB/wFxQQZJBEBBqX8hBQwBC0FQIQUgAkEwa0H/AXFBCUsNBQsgAiAFaiICIARBBHRqIQQgAUEBaiEBDAALAAtBASEBA0AgAUEIRg0CIAEgA2otAAAiAkEwa0H/AXFBCUsNAyABQQFqIQEgBEEKbCACakEwayEEDAALAAsgBiADNgIIA0AgBiABNgIMIAFBCEYNAyABIANqIgUtAAAiAkUEQCACIQQMBAsgAkE7RgRAIAZBCGpBsOgHQfwBQQhBNxDpAyICRQ0EIAVBAWohAyACKAIEIQQMBAUgAUEBaiEBDAELAAsAC0EI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QRBrIgMkACADIAI6AA8DQCABBEAgACADLQAPOgAAIAFBAWshASAAQQFqIQAMAQsLIANBEGokAAuLAgEDfyMAQRBrIggkACABQX9zQff///8HaiACTwRAIAAQQiEJIAhBBGoiCiABQfP///8DSQR/IAggAUEBdDYCDCAIIAEgAmo2AgQgCiAIQQxqENsDKAIAENoDQQFqBUH3////BwsQ2QMgCCgCBCECIAgoAggaIAQEQCACIAkgBBCnAgsgBgRAIAIgBGogByAGEKcCCyADIAQgBWoiCmshByADIApHBEAgAiAEaiAGaiAEIAlqIAVqIAcQpwILIAFBCkcEQCAJEKoFCyAAIAIQ9wEgACAIKAIIEPYBIAAgBCAGaiAHaiIAEL4BIAhBADoADCAAIAJqIAhBDGoQ0gEgCEEQaiQADwsQygEAC78CAQZ/IAAoAgghBSAAKAIMIQYDQCAAKAIAIARLBEAgBSAAKAIEIARsaiEBIAYEQCABIAYRAQALAkACQAJAAkACQAJAAkACQAJAAkAgASgCAEECaw4NAAABAQIDBAQGBwgFBQkLIAEoAgwQGAwICyABKAIMEBgMBwsgASgCDBAYDAYLIAEoAigQGAwFCyABKAIIEBgMBAtBACECAkACQAJAAkAgASgCCEEBaw4CAAEDCwNAIAEoAjQhAyACIAEoAjBODQIgAyACQQR0aigCCBAYIAJBAWohAgwACwALA0AgASgCRCEDIAIgASgCQE4NASADIAJBBHRqKAIIEBggAkEBaiECDAALAAsgAxAYCwwDCyABKAIQEBgMAgsgASgCCBAYDAELIAEoAigQGAsgBEEBaiEEDAELCyAFEBggABAYCxYAIAAgASACQoCAgICAgICAgH8QuQULCQAgABBoNgIACyMBAn8gACEBA0AgASICQQRqIQEgAigCAA0ACyACIABrQQJ1Cw8AIAAgACgCAEEEazYCAAsKACAAKAIAQQRrC98BAQN/IAAQJCAAEEdPBEAgABBHIgJBAWoiAyACQQF0QYAIIAIbIgQgAyAESxshAyAAECQhBAJAIAAtAA9B/wFGBEAgACgCACACIANBARCXBSECDAELIANBARBKIgIgACAEEB8aIAAgBDYCBAsgAEH/AToADyAAIAM2AgggACACNgIACyAAECQhAgJAIAAQKARAIAAgAmogAToAACAAIAAtAA9BAWo6AA8gABAkQRBJDQFBuLsDQZqCAUGdAkGZtgEQAAALIAAoAgAgAmogAToAACAAIAAoAgRBAWo2AgQLCwcAIAAoAgQLLQEBfyMAQRBrIgIkAAJAIAAgAUYEQCAAQQA6AHgMAQsgARCdBAsgAkEQaiQACxMAIAAQkwUoAgAgACgCAGtBAnULLAEBfyAAKAIEIQIDQCABIAJHBEAgABCbAxogAkEEayECDAELCyAAIAE2AgQLCQAgAEEANgIAC0kBAX8jAEEQayIDJAACQAJAIAJBHksNACABLQB4QQFxDQAgAUEBOgB4DAELIAIQ+AohAQsgA0EQaiQAIAAgAjYCBCAAIAE2AgALQAEBfyMAQRBrIgEkACAAEJsDGiABQf////8DNgIMIAFB/////wc2AgggAUEMaiABQQhqEOILKAIAIAFBEGokAAueBwEKfyMAQaABayICJAACQCAARQ0AQQFBFBBKIgNB0AAgASABQdAATRsiBjYCBAJ/IAMoAgAiAUUEQEHkACEFQeQAIAYQSgwBCyADKAIIIAEgAUHkAGoiBSAGEJcFCyEHIAJBKGohCiACQRhqIQggAkEwaiEJIAJBEGohAQJAA0AgAC0AACIEQQlrIgtBF0tBASALdEGfgIAEcUVyRQRAIABBAWohAAwBCyAAQQFqIQACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAEQcIAaw4TBggVAQsVFQ0VFQkVFRUDFRUMCgALAkAgBEHiAGsOBAUHFQIACyAEQfAAaw4FAxQUFA0OCyACQQA2AggMEQsgAkEBNgIIDBALIAJBAjYCCAwOCyACQQM2AggMDQsgAkEENgIIDAsLIAJBBTYCCAwKCyAAIAJBmAFqEOYCIgBFDQ0gAigCmAEgAkHYAGoQgQtFDQ0gAigCWEUEQCACQQk2AgggAiACKAJgNgIQDA0LIAJBDjYCCAwICyAAIAJBmAFqEOYCIgBFDQwgAigCmAEgAkHYAGoQgQtFDQwgAigCWEUEQCACQQg2AgggAiACKAJgNgIQDAwLIAJBDTYCCAwHCyACQQY2AgggACABEIwHIgBFDQsMCgsgAkEHNgIIIAAgARDHASIARQ0KIAAgCBDHASIARQ0KIAAgAkGcAWoQlQUhACACQQJBASACKAKcASIEG0EAIARBAE4bNgIgIABFDQogACAKEMcBIgBFDQogACAJEOYCIgBFDQoMCQsgAkEKNgIIIAAgARDHASIARQ0JIAAgCBDmAiIARQ0JDAgLIAJBCzYCCCAAIAEQ5gIiAEUNCAwHCyACQQw2AgggACABEPsKIgBFDQcgACAJEOYCIgBFDQcMBgsgAkEPNgIIIAAgARD5CiIARQ0GDAULIARFDQcMBQsgASACQdgAakHAABAfGgwDCyAAIAEQjAciAEUNAwwCCyAAIAEQjAciAEUNAgwBCyAAIAEQ+woiAEUNAQsgBSADKAIAIgRGBH8gByAFIAVBAXQiBSAGEJcFIQcgAygCAAUgBAsgBmwgB2ogAkEIakHQABAfGiADIAMoAgBBAWo2AgAMAQsLIAMgAygCEEEBcjYCEAsgAygCACIABEAgAyAHIAUgACAGEJcFNgIIDAELIAcQGCADEBhBACEDCyACQaABaiQAIAMLCwAgAEEANgIAIAALNwEBfyMAQRBrIgMkACADIAEQ5QI2AgwgAyACEOUCNgIIIAAgA0EMaiADQQhqEKsFIANBEGokAAtOAQF/IwBBEGsiAyQAIAMgATYCCCADIAA2AgwgAyACNgIEQQAhASADQQRqIgAgA0EMahCoBUUEQCAAIANBCGoQqAUhAQsgA0EQaiQAIAELNAEBfyMAQRBrIgMkACAAECMaIAAgAhCdAyADQQA6AA8gASACaiADQQ9qENIBIANBEGokAAscACAAQf////8DSwRAEJMBAAsgAEECdEEEENcLCzYBAX8jAEEQayICJAAgASAAIAJBDGpBChCoBDYCACACKAIMIQEgAkEQaiQAIAFBACAAIAFHGwsJACAAEIsHEBgLgwEBBH8jAEEQayICJAAgASAAIAJBDGoiBBDgATkDAAJAIAAgAigCDCIDRg0AIAEgAyAEEOABOQMIIAMgAigCDCIARg0AIAEgACAEEOABOQMQIAAgAigCDCIDRg0AIAEgAyAEEOABOQMYIAIoAgwiAEEAIAAgA0cbIQULIAJBEGokACAFCxUAIABBkL8JNgIAIABBEGoQNBogAAsVACAAQei+CTYCACAAQQxqEDQaIAALtwMBBH8CQCADIAIiAGtBA0hBAXINACAALQAAQe8BRw0AIAAtAAFBuwFHDQAgAEEDQQAgAC0AAkG/AUYbaiEACwNAAkAgBCAHTSAAIANPcg0AIAAsAAAiAUH/AXEhBQJ/QQEgAUEATg0AGiABQUJJDQEgAUFfTQRAIAMgAGtBAkgNAiAALQABQcABcUGAAUcNAkECDAELIAFBb00EQCADIABrQQNIDQIgAC0AAiAALAABIQECQAJAIAVB7QFHBEAgBUHgAUcNASABQWBxQaB/Rg0CDAULIAFBoH9ODQQMAQsgAUG/f0oNAwtBwAFxQYABRw0CQQMMAQsgAyAAa0EESCABQXRLcg0BIAAtAAMhBiAALQACIQggACwAASEBAkACQAJAAkAgBUHwAWsOBQACAgIBAgsgAUHwAGpB/wFxQTBPDQQMAgsgAUGQf04NAwwBCyABQb9/Sg0CCyAIQcABcUGAAUcgBkHAAXFBgAFHciAGQT9xIAhBBnRBwB9xIAVBEnRBgIDwAHEgAUE/cUEMdHJyckH//8MAS3INAUEECyEBIAdBAWohByAAIAFqIQAMAQsLIAAgAmsL0QQBBH8jAEEQayIAJAAgACACNgIMIAAgBTYCCAJ/IAAgAjYCDCAAIAU2AggCQAJAA0ACQCAAKAIMIgEgA08NACAAKAIIIgogBk8NACABLAAAIgVB/wFxIQICfyAFQQBOBEAgAkH//8MASw0FQQEMAQsgBUFCSQ0EIAVBX00EQEEBIAMgAWtBAkgNBhpBAiEFIAEtAAEiCEHAAXFBgAFHDQQgCEE/cSACQQZ0QcAPcXIhAkECDAELIAVBb00EQEEBIQUgAyABayIJQQJIDQQgASwAASEIAkACQCACQe0BRwRAIAJB4AFHDQEgCEFgcUGgf0YNAgwICyAIQaB/SA0BDAcLIAhBv39KDQYLIAlBAkYNBCABLQACIgVBwAFxQYABRw0FIAVBP3EgAkEMdEGA4ANxIAhBP3FBBnRyciECQQMMAQsgBUF0Sw0EQQEhBSADIAFrIglBAkgNAyABLAABIQgCQAJAAkACQCACQfABaw4FAAICAgECCyAIQfAAakH/AXFBME8NBwwCCyAIQZB/Tg0GDAELIAhBv39KDQULIAlBAkYNAyABLQACIgtBwAFxQYABRw0EIAlBA0YNAyABLQADIglBwAFxQYABRw0EQQIhBSAJQT9xIAtBBnRBwB9xIAJBEnRBgIDwAHEgCEE/cUEMdHJyciICQf//wwBLDQNBBAshBSAKIAI2AgAgACABIAVqNgIMIAAgACgCCEEEajYCCAwBCwsgASADSSEFCyAFDAELQQILIAQgACgCDDYCACAHIAAoAgg2AgAgAEEQaiQAC4oEACMAQRBrIgAkACAAIAI2AgwgACAFNgIIAn8gACACNgIMIAAgBTYCCCAAKAIMIQECQANAAkAgASADTwRAQQAhAgwBC0ECIQIgASgCACIBQf//wwBLIAFBgHBxQYCwA0ZyDQACQCABQf8ATQRAQQEhAiAGIAAoAggiBWtBAEwNAiAAIAVBAWo2AgggBSABOgAADAELIAFB/w9NBEAgBiAAKAIIIgJrQQJIDQQgACACQQFqNgIIIAIgAUEGdkHAAXI6AAAgACAAKAIIIgJBAWo2AgggAiABQT9xQYABcjoAAAwBCyAGIAAoAggiAmshBSABQf//A00EQCAFQQNIDQQgACACQQFqNgIIIAIgAUEMdkHgAXI6AAAgACAAKAIIIgJBAWo2AgggAiABQQZ2QT9xQYABcjoAACAAIAAoAggiAkEBajYCCCACIAFBP3FBgAFyOgAADAELIAVBBEgNAyAAIAJBAWo2AgggAiABQRJ2QfABcjoAACAAIAAoAggiAkEBajYCCCACIAFBDHZBP3FBgAFyOgAAIAAgACgCCCICQQFqNgIIIAIgAUEGdkE/cUGAAXI6AAAgACAAKAIIIgJBAWo2AgggAiABQT9xQYABcjoAAAsgACAAKAIMQQRqIgE2AgwMAQsLIAIMAQtBAQsgBCAAKAIMNgIAIAcgACgCCDYCACAAQRBqJAALpgQBBX8jAEEQayIEJAACQAJAAkACQAJAIAAtAAAiAkEjRg0BIAJBKEcEQCACQS9GDQIgAkHbAEcNASABQQE2AgBBACECIABBAWoiBSABQQhqEMcBIgBFDQUgACABQRBqEMcBIgBFDQUgACABQRhqEMcBIgBFDQUgACABQSBqEMcBIgBFDQUgACABQShqEJUFIgNFDQVBACEAIAEoAihBEBBKIQIDQCABKAIoIABKBEAgAyAEQQhqEMcBIgNFDQYgAiAAQQR0aiIGIAQrAwg5AwAgAEEBaiEAIAMgBkEIahDmAiIDDQEMBgsLIAEgAjYCLCAFIQIMBQsgAUECNgIAQQAhAiAAQQFqIgUgAUEIahDHASIARQ0EIAAgAUEQahDHASIARQ0EIAAgAUEYahDHASIARQ0EIAAgAUEgahDHASIARQ0EIAAgAUEoahDHASIARQ0EIAAgAUEwahDHASIARQ0EIAAgAUE4ahCVBSIDRQ0EQQAhACABKAI4QRAQSiECA0AgASgCOCAASgRAIAMgBEEIahDHASIDRQ0EIAIgAEEEdGoiBiAEKwMIOQMAIABBAWohACADIAZBCGoQ5gIiAw0BDAQLCyABIAI2AjwgBSECDAQLIALAIgVBX3FBwQBrQRpPBEBBACECIAVBMGtBCUsNBAsLIAEgADYCCCABQQA2AgAgACECDAILIAIQGEEAIQIMAQsgAhAYQQAhAgsgBEEQaiQAIAILyQMBBH8CQCADIAIiAGtBA0hBAXINACAALQAAQe8BRw0AIAAtAAFBuwFHDQAgAEEDQQAgAC0AAkG/AUYbaiEACwNAAkAgBCAGTSAAIANPcg0AAn8gAEEBaiAALQAAIgHAQQBODQAaIAFBwgFJDQEgAUHfAU0EQCADIABrQQJIDQIgAC0AAUHAAXFBgAFHDQIgAEECagwBCyABQe8BTQRAIAMgAGtBA0gNAiAALQACIAAsAAEhBQJAAkAgAUHtAUcEQCABQeABRw0BIAVBYHFBoH9GDQIMBQsgBUGgf04NBAwBCyAFQb9/Sg0DC0HAAXFBgAFHDQIgAEEDagwBCyADIABrQQRIIAFB9AFLciAEIAZrQQJJcg0BIAAtAAMhByAALQACIQggACwAASEFAkACQAJAAkAgAUHwAWsOBQACAgIBAgsgBUHwAGpB/wFxQTBPDQQMAgsgBUGQf04NAwwBCyAFQb9/Sg0CCyAIQcABcUGAAUcgB0HAAXFBgAFHciAHQT9xIAhBBnRBwB9xIAFBEnRBgIDwAHEgBUE/cUEMdHJyckH//8MAS3INASAGQQFqIQYgAEEEagshACAGQQFqIQYMAQsLIAAgAmsLqQUBBH8jAEEQayIAJAAgACACNgIMIAAgBTYCCAJ/IAAgAjYCDCAAIAU2AggCQAJAA0ACQCAAKAIMIgEgA08NACAAKAIIIgUgBk8NAEECIQkgAAJ/IAEtAAAiAsBBAE4EQCAFIAI7AQAgAUEBagwBCyACQcIBSQ0EIAJB3wFNBEBBASADIAFrQQJIDQYaIAEtAAEiCEHAAXFBgAFHDQQgBSAIQT9xIAJBBnRBwA9xcjsBACABQQJqDAELIAJB7wFNBEBBASEJIAMgAWsiCkECSA0EIAEsAAEhCAJAAkAgAkHtAUcEQCACQeABRw0BIAhBYHFBoH9HDQgMAgsgCEGgf04NBwwBCyAIQb9/Sg0GCyAKQQJGDQQgAS0AAiIJQcABcUGAAUcNBSAFIAlBP3EgCEE/cUEGdCACQQx0cnI7AQAgAUEDagwBCyACQfQBSw0EQQEhCSADIAFrIgpBAkgNAyABLQABIgvAIQgCQAJAAkACQCACQfABaw4FAAICAgECCyAIQfAAakH/AXFBME8NBwwCCyAIQZB/Tg0GDAELIAhBv39KDQULIApBAkYNAyABLQACIghBwAFxQYABRw0EIApBA0YNAyABLQADIgFBwAFxQYABRw0EIAYgBWtBA0gNA0ECIQkgAUE/cSIBIAhBBnQiCkHAH3EgC0EMdEGA4A9xIAJBB3EiAkESdHJyckH//8MASw0DIAUgCEEEdkEDcSALQQJ0IglBwAFxIAJBCHRyIAlBPHFyckHA/wBqQYCwA3I7AQAgACAFQQJqNgIIIAUgASAKQcAHcXJBgLgDcjsBAiAAKAIMQQRqCzYCDCAAIAAoAghBAmo2AggMAQsLIAEgA0khCQsgCQwBC0ECCyAEIAAoAgw2AgAgByAAKAIINgIAIABBEGokAAvjBQEBfyMAQRBrIgAkACAAIAI2AgwgACAFNgIIAn8gACACNgIMIAAgBTYCCCAAKAIMIQICQAJAA0AgAiADTwRAQQAhBQwCC0ECIQUCQAJAIAIvAQAiAUH/AE0EQEEBIQUgBiAAKAIIIgJrQQBMDQQgACACQQFqNgIIIAIgAToAAAwBCyABQf8PTQRAIAYgACgCCCICa0ECSA0FIAAgAkEBajYCCCACIAFBBnZBwAFyOgAAIAAgACgCCCICQQFqNgIIIAIgAUE/cUGAAXI6AAAMAQsgAUH/rwNNBEAgBiAAKAIIIgJrQQNIDQUgACACQQFqNgIIIAIgAUEMdkHgAXI6AAAgACAAKAIIIgJBAWo2AgggAiABQQZ2QT9xQYABcjoAACAAIAAoAggiAkEBajYCCCACIAFBP3FBgAFyOgAADAELIAFB/7cDTQRAQQEhBSADIAJrQQNIDQQgAi8BAiIIQYD4A3FBgLgDRw0CIAYgACgCCGtBBEgNBCAIQf8HcSABQQp0QYD4A3EgAUHAB3EiBUEKdHJyQf//P0sNAiAAIAJBAmo2AgwgACAAKAIIIgJBAWo2AgggAiAFQQZ2QQFqIgJBAnZB8AFyOgAAIAAgACgCCCIFQQFqNgIIIAUgAkEEdEEwcSABQQJ2QQ9xckGAAXI6AAAgACAAKAIIIgJBAWo2AgggAiAIQQZ2QQ9xIAFBBHRBMHFyQYABcjoAACAAIAAoAggiAUEBajYCCCABIAhBP3FBgAFyOgAADAELIAFBgMADSQ0DIAYgACgCCCICa0EDSA0EIAAgAkEBajYCCCACIAFBDHZB4AFyOgAAIAAgACgCCCICQQFqNgIIIAIgAUEGdkG/AXE6AAAgACAAKAIIIgJBAWo2AgggAiABQT9xQYABcjoAAAsgACAAKAIMQQJqIgI2AgwMAQsLQQIMAgsgBQwBC0EBCyAEIAAoAgw2AgAgByAAKAIINgIAIABBEGokAAs+AQJ/IwBBEGsiASQAIAEgADYCDCABQQhqIAFBDGoQigJBBEEBQcSOCygCACgCABshAhCJAiABQRBqJAAgAgs6AQF/IwBBEGsiBSQAIAUgBDYCDCAFQQhqIAVBDGoQigIgACABIAIgAxC4BSEAEIkCIAVBEGokACAACxIAIAQgAjYCACAHIAU2AgBBAwsqAQF/IABB/LUJNgIAAkAgACgCCCIBRQ0AIAAtAAxBAUcNACABEBgLIAALBAAgAQsnAQF/IAAoAgAoAgAoAgBBlKgLQZSoCygCAEEBaiIANgIAIAA2AgQLywoBCH9BkKgLLQAARQRAIwBBEGsiBSQAQYioCy0AAEUEQCMAQRBrIgYkACAGQQE2AgxB6KYLIAYoAgwQcSIBQei1CTYCACMAQRBrIgMkACABQQhqIgJCADcCACADQQA2AgwgAkEIahD0CkEAOgB8IANBBGogAhCdAigCABogA0EAOgAKIwBBEGsiBCQAIAIQ8gpBHkkEQBDKAQALIARBCGogAhCbA0EeEPEKIAIgBCgCCCIHNgIEIAIgBzYCACAEKAIMIQggAhCTBSAHIAhBAnRqNgIAIARBEGokACACQR4QkgsgA0EBOgAKIANBEGokACABQZABakHz3gEQowQgAhC+AhogAhCQC0H8sQtBARBxQYjKCTYCACABQfyxC0HApQsQcBB2QYSyC0EBEHFBqMoJNgIAIAFBhLILQcilCxBwEHZBjLILQQEQcSICQQA6AAwgAkEANgIIIAJB/LUJNgIAIAJBsLYJNgIIIAFBjLILQaCoCxBwEHZBnLILQQEQcUHowQk2AgAgAUGcsgtBmKgLEHAQdkGksgtBARBxQYDDCTYCACABQaSyC0GoqAsQcBB2QayyC0EBEHEiAkG4vgk2AgAgAhBoNgIIIAFBrLILQbCoCxBwEHZBuLILQQEQcUGUxAk2AgAgAUG4sgtBuKgLEHAQdkHAsgtBARBxQfzFCTYCACABQcCyC0HIqAsQcBB2QciyC0EBEHFBiMUJNgIAIAFByLILQcCoCxBwEHZB0LILQQEQcUHwxgk2AgAgAUHQsgtB0KgLEHAQdkHYsgtBARBxIgJBrtgAOwEIIAJB6L4JNgIAIAJBDGoQURogAUHYsgtB2KgLEHAQdkHwsgtBARBxIgJCroCAgMAFNwIIIAJBkL8JNgIAIAJBEGoQURogAUHwsgtB4KgLEHAQdkGMswtBARBxQcjKCTYCACABQYyzC0HQpQsQcBB2QZSzC0EBEHFBwMwJNgIAIAFBlLMLQdilCxBwEHZBnLMLQQEQcUGUzgk2AgAgAUGcswtB4KULEHAQdkGkswtBARBxQYDQCTYCACABQaSzC0HopQsQcBB2QayzC0EBEHFB5NcJNgIAIAFBrLMLQZCmCxBwEHZBtLMLQQEQcUH42Ak2AgAgAUG0swtBmKYLEHAQdkG8swtBARBxQezZCTYCACABQbyzC0GgpgsQcBB2QcSzC0EBEHFB4NoJNgIAIAFBxLMLQaimCxBwEHZBzLMLQQEQcUHU2wk2AgAgAUHMswtBsKYLEHAQdkHUswtBARBxQfzcCTYCACABQdSzC0G4pgsQcBB2QdyzC0EBEHFBpN4JNgIAIAFB3LMLQcCmCxBwEHZB5LMLQQEQcUHM3wk2AgAgAUHkswtByKYLEHAQdkHsswtBARBxIgJBuOkJNgIIIAJByNEJNgIAIAJB+NEJNgIIIAFB7LMLQfClCxBwEHZB+LMLQQEQcSICQdzpCTYCCCACQdTTCTYCACACQYTUCTYCCCABQfizC0H4pQsQcBB2QYS0C0EBEHEiAkEIahDnCiACQcTVCTYCACABQYS0C0GApgsQcBB2QZC0C0EBEHEiAkEIahDnCiACQeTWCTYCACABQZC0C0GIpgsQcBB2QZy0C0EBEHFB9OAJNgIAIAFBnLQLQdCmCxBwEHZBpLQLQQEQcUHs4Qk2AgAgAUGktAtB2KYLEHAQdiAGQRBqJAAgBUHopgs2AghBhKgLIAUoAggQnQIaQYioC0EBOgAACyAFQRBqJABBjKgLQYSoCxCNC0GQqAtBAToAAAsgAEGMqAsoAgAiADYCACAAEIwLCxEAIABB6KYLRwRAIAAQjwsLCxMAIAAgASgCACIANgIAIAAQjAsLnQEBBH8gAEHotQk2AgAgAEEIaiEBA0AgARC+AiACSwRAIAEgAhCcAygCAARAIAEgAhCcAygCABCZBQsgAkEBaiECDAELCyAAQZABahA0GiMAQRBrIgIkACACQQxqIAEQnQIiASgCACIDKAIABEAgAxCQCyABKAIAGiABKAIAEJsDIAEoAgAiASgCACABEO4KGhDtCgsgAkEQaiQAIAALDwAgACAAKAIEQQFqNgIECwwAIAAgACgCABDvCguYAwEEfyMAQRBrIgMkACADIAI2AgQgAyABNgIAIwBBMGsiASQAIAEgAzYCDCABIAM2AiwgASADNgIQAkACQAJAAkACQAJAQQBBAEGQNyADEGAiBkEASA0AQQEhBCAGQQFqIQICQCAGIAAQRyAAECRrIgVPBEAgABAoQQAgAiAFayIFQQFGGw0BIAAgBRDQAQtBACEECyABQgA3AxggAUIANwMQIAQgBkEQT3ENASABQRBqIQUgBiAEBH8gBQUgABB1CyACQZA3IAEoAiwQYCICRyACQQBOcQ0CIAJBAEwNACAAECgEQCACQYACTw0EIAQEQCAAEHUgAUEQaiACEB8aCyAAIAAtAA8gAmo6AA8gABAkQRBJDQFBuLsDQZqCAUHYAUHNHxAAAAsgBA0EIAAgACgCBCACajYCBAsgAUEwaiQADAQLQeqpA0GaggFBywFBzR8QAAALQf2dA0GaggFB0AFBzR8QAAALQdDPAUGaggFB0wFBzR8QAAALQaeiAUGaggFB2gFBzR8QAAALIAAQ3AIgA0EQaiQAC3sBA38jAEEQayIEJAAgBEEEaiICIAA2AgAgAiAAKAIEIgM2AgQgAiADIAFBAnRqNgIIIAIiAygCBCEBIAIoAgghAgNAIAEgAkYEQCADKAIAIAMoAgQ2AgQgBEEQaiQABSAAEJsDGiABEPAKIAMgAUEEaiIBNgIEDAELCwsgACAAQbi+CTYCACAAKAIIEGhHBEAgACgCCBDOCwsgAAsEAEF/C6YBAQN/IwBBEGsiBCQAIwBBIGsiAyQAIANBGGogACABEPUKIANBEGogAygCGCADKAIcIAIQ3gsgAygCECEFIwBBEGsiASQAIAEgADYCDCABQQxqIgAgBSAAEIoHa0ECdRCQByEAIAFBEGokACADIAA2AgwgAyACIAMoAhQQogM2AgggBEEIaiADQQxqIANBCGoQ+AEgA0EgaiQAIAQoAgwgBEEQaiQAC4EGAQp/IwBBEGsiEyQAIAIgADYCAEEEQQAgBxshFSADQYAEcSEWA0AgFEEERgRAIA0QI0EBSwRAIBMgDRDeATYCDCACIBNBDGpBARCQByANEOwCIAIoAgAQlQs2AgALIANBsAFxIgNBEEcEQCABIANBIEYEfyACKAIABSAACzYCAAsgE0EQaiQABQJAAkACQAJAAkACQCAIIBRqLQAADgUAAQMCBAULIAEgAigCADYCAAwECyABIAIoAgA2AgAgBkEgENEBIQcgAiACKAIAIg9BBGo2AgAgDyAHNgIADAMLIA0Q8wENAiANQQAQoQUoAgAhByACIAIoAgAiD0EEajYCACAPIAc2AgAMAgsgDBDzASAWRXINASACIAwQ3gEgDBDsAiACKAIAEJULNgIADAELIAIoAgAgBCAVaiIEIQcDQAJAIAUgB00NACAGQcAAIAcoAgAQ+QFFDQAgB0EEaiEHDAELCyAOQQBKBEAgAigCACEPIA4hEANAIBBFIAQgB09yRQRAIBBBAWshECAHQQRrIgcoAgAhESACIA9BBGoiEjYCACAPIBE2AgAgEiEPDAELCwJAIBBFBEBBACERDAELIAZBMBDRASERIAIoAgAhDwsDQCAPQQRqIRIgEEEASgRAIA8gETYCACAQQQFrIRAgEiEPDAELCyACIBI2AgAgDyAJNgIACwJAIAQgB0YEQCAGQTAQ0QEhDyACIAIoAgAiEEEEaiIHNgIAIBAgDzYCAAwBCyALEPMBBH9BfwUgC0EAED8sAAALIRFBACEPQQAhEgNAIAQgB0cEQAJAIA8gEUcEQCAPIRAMAQsgAiACKAIAIhBBBGo2AgAgECAKNgIAQQAhECALECMgEkEBaiISTQRAIA8hEQwBCyALIBIQPy0AAEH/AEYEQEF/IREMAQsgCyASED8sAAAhEQsgB0EEayIHKAIAIQ8gAiACKAIAIhhBBGo2AgAgGCAPNgIAIBBBAWohDwwBCwsgAigCACEHCyAHEJ4FCyAUQQFqIRQMAQsLC9kCAQF/IwBBEGsiCiQAIAkCfyAABEAgAhCcCyEAAkAgAQRAIApBBGoiASAAEOoCIAMgCigCBDYAACABIAAQ6QIMAQsgCkEEaiIBIAAQmgUgAyAKKAIENgAAIAEgABD0AQsgCCABEJ4CIAEQeBogBCAAEPIBNgIAIAUgABDJATYCACAKQQRqIgEgABDIASAGIAEQtAEgARA0GiABIAAQ9QEgByABEJ4CIAEQeBogABDoAgwBCyACEJsLIQACQCABBEAgCkEEaiIBIAAQ6gIgAyAKKAIENgAAIAEgABDpAgwBCyAKQQRqIgEgABCaBSADIAooAgQ2AAAgASAAEPQBCyAIIAEQngIgARB4GiAEIAAQ8gE2AgAgBSAAEMkBNgIAIApBBGoiASAAEMgBIAYgARC0ASABEDQaIAEgABD1ASAHIAEQngIgARB4GiAAEOgCCzYCACAKQRBqJAALowEBA38jAEEQayIEJAAjAEEgayIDJAAgA0EYaiAAIAEQ9QogA0EQaiADKAIYIAMoAhwgAhDgCyADKAIQIQUjAEEQayIBJAAgASAANgIMIAFBDGoiACAFIAAQigdrEJIHIQAgAUEQaiQAIAMgADYCDCADIAIgAygCFBCiAzYCCCAEQQhqIANBDGogA0EIahD4ASADQSBqJAAgBCgCDCAEQRBqJAAL1gUBCn8jAEEQayIUJAAgAiAANgIAIANBgARxIRYDQCAVQQRGBEAgDRAjQQFLBEAgFCANEN4BNgIMIAIgFEEMakEBEJIHIA0Q7gIgAigCABCYCzYCAAsgA0GwAXEiA0EQRwRAIAEgA0EgRgR/IAIoAgAFIAALNgIACyAUQRBqJAAFAkACQAJAAkACQAJAIAggFWotAAAOBQABAwIEBQsgASACKAIANgIADAQLIAEgAigCADYCACAGQSAQnwEhDyACIAIoAgAiEEEBajYCACAQIA86AAAMAwsgDRDzAQ0CIA1BABA/LQAAIQ8gAiACKAIAIhBBAWo2AgAgECAPOgAADAILIAwQ8wEgFkVyDQEgAiAMEN4BIAwQ7gIgAigCABCYCzYCAAwBCyACKAIAIAQgB2oiBCERA0ACQCAFIBFNDQAgBkHAACARLAAAEPoBRQ0AIBFBAWohEQwBCwsgDiIPQQBKBEADQCAPRSAEIBFPckUEQCAPQQFrIQ8gEUEBayIRLQAAIRAgAiACKAIAIhJBAWo2AgAgEiAQOgAADAELCyAPBH8gBkEwEJ8BBUEACyESA0AgAiACKAIAIhBBAWo2AgAgD0EASgRAIBAgEjoAACAPQQFrIQ8MAQsLIBAgCToAAAsCQCAEIBFGBEAgBkEwEJ8BIQ8gAiACKAIAIhBBAWo2AgAgECAPOgAADAELIAsQ8wEEf0F/BSALQQAQPywAAAshEEEAIQ9BACETA0AgBCARRg0BAkAgDyAQRwRAIA8hEgwBCyACIAIoAgAiEEEBajYCACAQIAo6AABBACESIAsQIyATQQFqIhNNBEAgDyEQDAELIAsgExA/LQAAQf8ARgRAQX8hEAwBCyALIBMQPywAACEQCyARQQFrIhEtAAAhDyACIAIoAgAiGEEBajYCACAYIA86AAAgEkEBaiEPDAALAAsgAigCABCeAwsgFUEBaiEVDAELCwvZAgEBfyMAQRBrIgokACAJAn8gAARAIAIQpAshAAJAIAEEQCAKQQRqIgEgABDqAiADIAooAgQ2AAAgASAAEOkCDAELIApBBGoiASAAEJoFIAMgCigCBDYAACABIAAQ9AELIAggARC0ASABEDQaIAQgABDyAToAACAFIAAQyQE6AAAgCkEEaiIBIAAQyAEgBiABELQBIAEQNBogASAAEPUBIAcgARC0ASABEDQaIAAQ6AIMAQsgAhCjCyEAAkAgAQRAIApBBGoiASAAEOoCIAMgCigCBDYAACABIAAQ6QIMAQsgCkEEaiIBIAAQmgUgAyAKKAIENgAAIAEgABD0AQsgCCABELQBIAEQNBogBCAAEPIBOgAAIAUgABDJAToAACAKQQRqIgEgABDIASAGIAEQtAEgARA0GiABIAAQ9QEgByABELQBIAEQNBogABDoAgs2AgAgCkEQaiQACwsAIABBoKYLEKUCCwsAIABBqKYLEKUCC9UBAQN/IwBBEGsiBSQAAkBB9////wMgAWsgAk8EQCAAEEIhBiAFQQRqIgcgAUHz////AUkEfyAFIAFBAXQ2AgwgBSABIAJqNgIEIAcgBUEMahDbAygCABDOA0EBagVB9////wMLEM0DIAUoAgQhAiAFKAIIGiAEBEAgAiAGIAQQ8gILIAMgBEcEQCAEQQJ0IgcgAmogBiAHaiADIARrEPICCyABQQFHBEAgBhCdBAsgACACEPcBIAAgBSgCCBD2ASAFQRBqJAAMAQsQygEACyAAIAMQvgELCQAgACABEKsLCx8BAX8gASgCABDoCyECIAAgASgCADYCBCAAIAI2AgALzw8BCn8jAEGQBGsiCyQAIAsgCjYCiAQgCyABNgKMBAJAIAAgC0GMBGoQWgRAIAUgBSgCAEEEcjYCAEEAIQAMAQsgC0GkBDYCSCALIAtB6ABqIAtB8ABqIAtByABqIgEQfiIPKAIAIgo2AmQgCyAKQZADajYCYCABEFEhESALQTxqEFEhDCALQTBqEFEhDiALQSRqEFEhDSALQRhqEFEhECMAQRBrIgokACALAn8gAgRAIApBBGoiASADEJwLIgIQ6gIgCyAKKAIENgBcIAEgAhDpAiANIAEQngIgARB4GiABIAIQ9AEgDiABEJ4CIAEQeBogCyACEPIBNgJYIAsgAhDJATYCVCABIAIQyAEgESABELQBIAEQNBogASACEPUBIAwgARCeAiABEHgaIAIQ6AIMAQsgCkEEaiIBIAMQmwsiAhDqAiALIAooAgQ2AFwgASACEOkCIA0gARCeAiABEHgaIAEgAhD0ASAOIAEQngIgARB4GiALIAIQ8gE2AlggCyACEMkBNgJUIAEgAhDIASARIAEQtAEgARA0GiABIAIQ9QEgDCABEJ4CIAEQeBogAhDoAgs2AhQgCkEQaiQAIAkgCCgCADYCACAEQYAEcSESQQAhA0EAIQEDQCABIQICQAJAAkACQCADQQRGDQAgACALQYwEahBaDQBBACEKAkACQAJAAkACQAJAIAtB3ABqIANqLQAADgUBAAQDBQkLIANBA0YNByAHQQEgABCEARD5AQRAIAtBDGogABCfCyAQIAsoAgwQhQcMAgsgBSAFKAIAQQRyNgIAQQAhAAwGCyADQQNGDQYLA0AgACALQYwEahBaDQYgB0EBIAAQhAEQ+QFFDQYgC0EMaiAAEJ8LIBAgCygCDBCFBwwACwALAkAgDhAjRQ0AIAAQhAEgDhBCKAIARw0AIAAQmAEaIAZBADoAACAOIAIgDhAjQQFLGyEBDAYLAkAgDRAjRQ0AIAAQhAEgDRBCKAIARw0AIAAQmAEaIAZBAToAACANIAIgDRAjQQFLGyEBDAYLAkAgDhAjRQ0AIA0QI0UNACAFIAUoAgBBBHI2AgBBACEADAQLIA4QI0UEQCANECNFDQULIAYgDRAjRToAAAwECyASIAIgA0ECSXJyRQRAQQAhASADQQJGIAstAF9BAEdxRQ0FCyALIAwQ3gE2AgggC0EMaiALQQhqEKEDIQECQCADRQ0AIAMgC2otAFtBAUsNAANAAkAgCyAMEOwCNgIIIAEgC0EIahDtAkUNACAHQQEgASgCACgCABD5AUUNACABEJYHDAELCyALIAwQ3gE2AgggASgCACALQQhqIgQoAgBrQQJ1IgogEBAjTQRAIAsgEBDsAjYCCCAEQQAgCmsQkAcgEBDsAiEKIAwQ3gEhEyMAQRBrIhQkABDlAiEEIAoQ5QIhCiAEIBMQ5QIgCiAEa0F8cRDWAUUgFEEQaiQADQELIAsgDBDeATYCBCABIAtBCGogC0EEahChAygCADYCAAsgCyABKAIANgIIA0ACQCALIAwQ7AI2AgQgC0EIaiIBIAtBBGoQ7QJFDQAgACALQYwEahBaDQAgABCEASABKAIAKAIARw0AIAAQmAEaIAEQlgcMAQsLIBJFDQMgCyAMEOwCNgIEIAtBCGogC0EEahDtAkUNAyAFIAUoAgBBBHI2AgBBACEADAILA0ACQCAAIAtBjARqEFoNAAJ/IAdBwAAgABCEASIBEPkBBEAgCSgCACIEIAsoAogERgRAIAggCSALQYgEahDRAyAJKAIAIQQLIAkgBEEEajYCACAEIAE2AgAgCkEBagwBCyARECNFIApFcg0BIAEgCygCVEcNASALKAJkIgEgCygCYEYEQCAPIAtB5ABqIAtB4ABqENEDIAsoAmQhAQsgCyABQQRqNgJkIAEgCjYCAEEACyEKIAAQmAEaDAELCyAKRSALKAJkIgEgDygCAEZyRQRAIAsoAmAgAUYEQCAPIAtB5ABqIAtB4ABqENEDIAsoAmQhAQsgCyABQQRqNgJkIAEgCjYCAAsCQCALKAIUQQBMDQACQCAAIAtBjARqEFpFBEAgABCEASALKAJYRg0BCyAFIAUoAgBBBHI2AgBBACEADAMLA0AgABCYARogCygCFEEATA0BAkAgACALQYwEahBaRQRAIAdBwAAgABCEARD5AQ0BCyAFIAUoAgBBBHI2AgBBACEADAQLIAkoAgAgCygCiARGBEAgCCAJIAtBiARqENEDCyAAEIQBIQEgCSAJKAIAIgRBBGo2AgAgBCABNgIAIAsgCygCFEEBazYCFAwACwALIAIhASAIKAIAIAkoAgBHDQMgBSAFKAIAQQRyNgIAQQAhAAwBCwJAIAJFDQBBASEKA0AgAhAjIApNDQECQCAAIAtBjARqEFpFBEAgABCEASACIAoQoQUoAgBGDQELIAUgBSgCAEEEcjYCAEEAIQAMAwsgABCYARogCkEBaiEKDAALAAtBASEAIA8oAgAgCygCZEYNAEEAIQAgC0EANgIMIBEgDygCACALKAJkIAtBDGoQswEgCygCDARAIAUgBSgCAEEEcjYCAAwBC0EBIQALIBAQeBogDRB4GiAOEHgaIAwQeBogERA0GiAPEH0MAwsgAiEBCyADQQFqIQMMAAsACyALQZAEaiQAIAALIgECfxDIBSEAEO0DIQEgAEH43wpqIABB+N8KKAIAaiABGwsgACAAIAEQ4wMQkgEgARDQAygCACEBIAAQ0AMgATYCAAsLACAAQZCmCxClAgsLACAAQZimCxClAguHBAEGfyMAQSBrIgQkAAJAAkACQCABRAAANCb1awzDYwRAIABBoPMJEKcFDAELIAFEAAA0JvVrDENkBEAgAEGh8wkQpwUMAQsgBCABOQMQIABBpYsBIARBEGoQpgUgABCdBSEGIAAQJCECAkADQCACIgNFDQEgBiACQQFrIgJqLQAAQS5HDQALIAAQJCECA0AgAkEBayEFIAIgA0cEQCAFIAZqLQAAQTBHDQILAkAgABAoBEAgAC0ADyIHRQ0FIAAgB0EBazoADwwBCyAAIAAoAgRBAWs2AgQLIAIgA0cgBSECDQALIAAQJCICQQJJDQAgAiAGaiICQQJrIgMtAABBLUcNACACQQFrLQAAQTBHDQAgA0EwOgAAIAAQKARAIAAtAA8iAkUNBCAAIAJBAWs6AA8MAQsgACAAKAIEQQFrNgIECwJAIAAQKARAIAAgABAkIgIQxAIiAw0BIAQgAkEBajYCAEG4+AgoAgBBz+4DIAQQHhoQJwALIABBABDHAyAAKAIAIQMLIABCADcCACAAQgA3AghBASEFAkAgAyICQdOfAxC/AkUEQCACQdKfAxC/AkUNAUECIQUgAkEBaiECCyACIAMgBWogAhA7EFIaCyAAIAMQpwUgAxAYCyAEQSBqJAAPC0GPkANBmoIBQYADQdEuEAAAC0GPkANBmoIBQZYDQdEuEAAAC8YBAQZ/IwBBEGsiBCQAIAAQ0AMoAgAhBUEBAn8gAigCACAAKAIAayIDQf////8HSQRAIANBAXQMAQtBfwsiAyADQQFNGyEDIAEoAgAhBiAAKAIAIQcgBUGkBEYEf0EABSAAKAIACyADEDkiCARAIAVBpARHBEAgABDjAxoLIARBCjYCBCAAIARBCGogCCAEQQRqEH4iBRCiCyAFEH0gASAAKAIAIAYgB2tqNgIAIAIgAyAAKAIAajYCACAEQRBqJAAPCxCTAQALIAEBfyABKAIAEPALwCECIAAgASgCADYCBCAAIAI6AAAL5A8BCn8jAEGQBGsiCyQAIAsgCjYCiAQgCyABNgKMBAJAIAAgC0GMBGoQWwRAIAUgBSgCAEEEcjYCAEEAIQAMAQsgC0GkBDYCTCALIAtB6ABqIAtB8ABqIAtBzABqIgEQfiIPKAIAIgo2AmQgCyAKQZADajYCYCABEFEhESALQUBrEFEhDCALQTRqEFEhDiALQShqEFEhDSALQRxqEFEhECMAQRBrIgokACALAn8gAgRAIApBBGoiASADEKQLIgIQ6gIgCyAKKAIENgBcIAEgAhDpAiANIAEQtAEgARA0GiABIAIQ9AEgDiABELQBIAEQNBogCyACEPIBOgBbIAsgAhDJAToAWiABIAIQyAEgESABELQBIAEQNBogASACEPUBIAwgARC0ASABEDQaIAIQ6AIMAQsgCkEEaiIBIAMQowsiAhDqAiALIAooAgQ2AFwgASACEOkCIA0gARC0ASABEDQaIAEgAhD0ASAOIAEQtAEgARA0GiALIAIQ8gE6AFsgCyACEMkBOgBaIAEgAhDIASARIAEQtAEgARA0GiABIAIQ9QEgDCABELQBIAEQNBogAhDoAgs2AhggCkEQaiQAIAkgCCgCADYCACAEQYAEcSESQQAhA0EAIQEDQCABIQICQAJAAkACQCADQQRGDQAgACALQYwEahBbDQBBACEKAkACQAJAAkACQAJAIAtB3ABqIANqLQAADgUBAAQDBQkLIANBA0YNByAHQQEgABCFARD6AQRAIAtBEGogABCnCyAQIAssABAQkQUMAgsgBSAFKAIAQQRyNgIAQQAhAAwGCyADQQNGDQYLA0AgACALQYwEahBbDQYgB0EBIAAQhQEQ+gFFDQYgC0EQaiAAEKcLIBAgCywAEBCRBQwACwALAkAgDhAjRQ0AIAAQhQFB/wFxIA5BABA/LQAARw0AIAAQmQEaIAZBADoAACAOIAIgDhAjQQFLGyEBDAYLAkAgDRAjRQ0AIAAQhQFB/wFxIA1BABA/LQAARw0AIAAQmQEaIAZBAToAACANIAIgDRAjQQFLGyEBDAYLAkAgDhAjRQ0AIA0QI0UNACAFIAUoAgBBBHI2AgBBACEADAQLIA4QI0UEQCANECNFDQULIAYgDRAjRToAAAwECyASIAIgA0ECSXJyRQRAQQAhASADQQJGIAstAF9BAEdxRQ0FCyALIAwQ3gE2AgwgC0EQaiALQQxqEKEDIQECQCADRQ0AIAMgC2otAFtBAUsNAANAAkAgCyAMEO4CNgIMIAEgC0EMahDtAkUNACAHQQEgASgCACwAABD6AUUNACABEJgHDAELCyALIAwQ3gE2AgwgASgCACALQQxqIgQoAgBrIgogEBAjTQRAIAsgEBDuAjYCDCAEQQAgCmsQkgcgEBDuAiEKIAwQ3gEhEyMAQRBrIhQkABDlAiEEIAoQ5QIhCiAEIBMQ5QIgCiAEaxDWAUUgFEEQaiQADQELIAsgDBDeATYCCCABIAtBDGogC0EIahChAygCADYCAAsgCyABKAIANgIMA0ACQCALIAwQ7gI2AgggC0EMaiIBIAtBCGoQ7QJFDQAgACALQYwEahBbDQAgABCFAUH/AXEgASgCAC0AAEcNACAAEJkBGiABEJgHDAELCyASRQ0DIAsgDBDuAjYCCCALQQxqIAtBCGoQ7QJFDQMgBSAFKAIAQQRyNgIAQQAhAAwCCwNAAkAgACALQYwEahBbDQACfyAHQcAAIAAQhQEiARD6AQRAIAkoAgAiBCALKAKIBEYEQCAIIAkgC0GIBGoQpgsgCSgCACEECyAJIARBAWo2AgAgBCABOgAAIApBAWoMAQsgERAjRSAKRXINASALLQBaIAFB/wFxRw0BIAsoAmQiASALKAJgRgRAIA8gC0HkAGogC0HgAGoQ0QMgCygCZCEBCyALIAFBBGo2AmQgASAKNgIAQQALIQogABCZARoMAQsLIApFIAsoAmQiASAPKAIARnJFBEAgCygCYCABRgRAIA8gC0HkAGogC0HgAGoQ0QMgCygCZCEBCyALIAFBBGo2AmQgASAKNgIACwJAIAsoAhhBAEwNAAJAIAAgC0GMBGoQW0UEQCAAEIUBQf8BcSALLQBbRg0BCyAFIAUoAgBBBHI2AgBBACEADAMLA0AgABCZARogCygCGEEATA0BAkAgACALQYwEahBbRQRAIAdBwAAgABCFARD6AQ0BCyAFIAUoAgBBBHI2AgBBACEADAQLIAkoAgAgCygCiARGBEAgCCAJIAtBiARqEKYLCyAAEIUBIQEgCSAJKAIAIgRBAWo2AgAgBCABOgAAIAsgCygCGEEBazYCGAwACwALIAIhASAIKAIAIAkoAgBHDQMgBSAFKAIAQQRyNgIAQQAhAAwBCwJAIAJFDQBBASEKA0AgAhAjIApNDQECQCAAIAtBjARqEFtFBEAgABCFAUH/AXEgAiAKED8tAABGDQELIAUgBSgCAEEEcjYCAEEAIQAMAwsgABCZARogCkEBaiEKDAALAAtBASEAIA8oAgAgCygCZEYNAEEAIQAgC0EANgIQIBEgDygCACALKAJkIAtBEGoQswEgCygCEARAIAUgBSgCAEEEcjYCAAwBC0EBIQALIBAQNBogDRA0GiAOEDQaIAwQNBogERA0GiAPEH0MAwsgAiEBCyADQQFqIQMMAAsACyALQZAEaiQAIAALDAAgAEEBQS0QtgsaCwwAIABBAUEtELsLGgsKACABIABrQQJ1CxwBAX8gAC0AACECIAAgAS0AADoAACABIAI6AAALZQEBfyMAQRBrIgYkACAGQQA6AA8gBiAFOgAOIAYgBDoADSAGQSU6AAwgBQRAIAZBDWogBkEOahCsCwsgAiABIAEgAigCABDYCyAGQQxqIAMgACgCABDQCyABajYCACAGQRBqJAALQgAgASACIAMgBEEEEJ8CIQEgAy0AAEEEcUUEQCAAIAFB0A9qIAFB7A5qIAEgAUHkAEkbIAFBxQBIG0HsDms2AgALC0AAIAIgAyAAQQhqIAAoAggoAgQRAgAiACAAQaACaiAFIARBABCiBSAAayIAQZ8CTARAIAEgAEEMbUEMbzYCAAsLQAAgAiADIABBCGogACgCCCgCABECACIAIABBqAFqIAUgBEEAEKIFIABrIgBBpwFMBEAgASAAQQxtQQdvNgIACwtCACABIAIgAyAEQQQQoAIhASADLQAAQQRxRQRAIAAgAUHQD2ogAUHsDmogASABQeQASRsgAUHFAEgbQewOazYCAAsLQAAgAiADIABBCGogACgCCCgCBBECACIAIABBoAJqIAUgBEEAEKUFIABrIgBBnwJMBEAgASAAQQxtQQxvNgIACwtAACACIAMgAEEIaiAAKAIIKAIAEQIAIgAgAEGoAWogBSAEQQAQpQUgAGsiAEGnAUwEQCABIABBDG1BB282AgALC4cBAQF/IAAtAJkBQQRxRQRAAkAgACgCTCIBRQ0AIAEoAggiAUUNACAAIAERAQAPCyAAEJUHGgJAIAAoAiBFDQAgACgCJCIBQcD4CCgCAEYNACAALQCQAQ0AIAEEQCABEOYDIABBADYCJAsgAEEANgIgCw8LQe3jA0EAIAAoAgwoAhARAwAQJwALBABBAgveAQEFfyMAQRBrIgckACMAQRBrIgMkACAAIQQCQCABQff///8DTQRAAkAgARCUBQRAIAQgARDTAQwBCyADQQhqIAEQzgNBAWoQzQMgAygCDBogBCADKAIIIgAQ9wEgBCADKAIMEPYBIAQgARC+AQsjAEEQayIFJAAgBSACNgIMIAAhAiABIQYDQCAGBEAgAiAFKAIMNgIAIAZBAWshBiACQQRqIQIMAQsLIAVBEGokACADQQA2AgQgACABQQJ0aiADQQRqENwBIANBEGokAAwBCxDKAQALIAdBEGokACAEC8AFAQ5/IwBBEGsiCyQAIAYQywEhCiALQQRqIAYQ1QMiDhDIASAFIAM2AgACQAJAIAAiBy0AACIGQStrDgMAAQABCyAKIAbAENEBIQYgBSAFKAIAIghBBGo2AgAgCCAGNgIAIABBAWohBwsCQAJAIAIgByIGa0EBTA0AIAYtAABBMEcNACAGLQABQSByQfgARw0AIApBMBDRASEIIAUgBSgCACIHQQRqNgIAIAcgCDYCACAKIAYsAAEQ0QEhCCAFIAUoAgAiB0EEajYCACAHIAg2AgAgBkECaiIHIQYDQCACIAZNDQIgBiwAABBoIRIQ0wtFDQIgBkEBaiEGDAALAAsDQCACIAZNDQEgBiwAABBoIRQQ0gtFDQEgBkEBaiEGDAALAAsCQCALQQRqEPMBBEAgCiAHIAYgBSgCABDCAiAFIAUoAgAgBiAHa0ECdGo2AgAMAQsgByAGEJ4DIA4QyQEhDyAHIQgDQCAGIAhNBEAgAyAHIABrQQJ0aiAFKAIAEJ4FBQJAIAtBBGoiDSAMED8sAABBAEwNACAJIA0gDBA/LAAARw0AIAUgBSgCACIJQQRqNgIAIAkgDzYCACAMIAwgDRAjQQFrSWohDEEAIQkLIAogCCwAABDRASENIAUgBSgCACIQQQRqNgIAIBAgDTYCACAIQQFqIQggCUEBaiEJDAELCwsCQAJAA0AgAiAGTQ0BIAZBAWohCCAGLAAAIgZBLkcEQCAKIAYQ0QEhBiAFIAUoAgAiB0EEajYCACAHIAY2AgAgCCEGDAELCyAOEPIBIQYgBSAFKAIAIgdBBGoiCTYCACAHIAY2AgAMAQsgBSgCACEJIAYhCAsgCiAIIAIgCRDCAiAFIAUoAgAgAiAIa0ECdGoiBTYCACAEIAUgAyABIABrQQJ0aiABIAJGGzYCACALQQRqEDQaIAtBEGokAAvmAwEIfyMAQRBrIgskACAGEMsBIQogC0EEaiIHIAYQ1QMiBhDIAQJAIAcQ8wEEQCAKIAAgAiADEMICIAUgAyACIABrQQJ0aiIGNgIADAELIAUgAzYCAAJAAkAgACIHLQAAIghBK2sOAwABAAELIAogCMAQ0QEhByAFIAUoAgAiCEEEajYCACAIIAc2AgAgAEEBaiEHCwJAIAIgB2tBAkgNACAHLQAAQTBHDQAgBy0AAUEgckH4AEcNACAKQTAQ0QEhCCAFIAUoAgAiCUEEajYCACAJIAg2AgAgCiAHLAABENEBIQggBSAFKAIAIglBBGo2AgAgCSAINgIAIAdBAmohBwsgByACEJ4DQQAhCSAGEMkBIQ1BACEIIAchBgN/IAIgBk0EfyADIAcgAGtBAnRqIAUoAgAQngUgBSgCAAUCQCALQQRqIgwgCBA/LQAARQ0AIAkgDCAIED8sAABHDQAgBSAFKAIAIglBBGo2AgAgCSANNgIAIAggCCAMECNBAWtJaiEIQQAhCQsgCiAGLAAAENEBIQwgBSAFKAIAIg5BBGo2AgAgDiAMNgIAIAZBAWohBiAJQQFqIQkMAQsLIQYLIAQgBiADIAEgAGtBAnRqIAEgAkYbNgIAIAtBBGoQNBogC0EQaiQAC+sCAQR/IwBBIGsiAyQAIAMgAjYCHCADIAI2AgACQAJAAkACQAJAQQBBACABIAIQYCICQQBIBEAgAiEBDAELQQEhBCACQQFqIQYCQCACIAAQRyAAECRrIgVPBEAgABAoQQAgBiAFayIFQQFGGw0BIAAgBRDQAQtBACEECyADQgA3AwggA0IANwMAIAQgAkEQT3ENASADIQUgAiAEBH8gBQUgABB1CyAGIAEgAygCHBBgIgFHIAFBAE5xDQIgAUEATA0AIAAQKARAIAFBgAJPDQQgBARAIAAQdSADIAEQHxoLIAAgAC0ADyABajoADyAAECRBEEkNAUG4uwNBmoIBQdgBQc0fEAAACyAEDQQgACAAKAIEIAFqNgIECyADQSBqJAAgAQ8LQeqpA0GaggFBywFBzR8QAAALQf2dA0GaggFB0AFBzR8QAAALQdDPAUGaggFB0wFBzR8QAAALQaeiAUGaggFB2gFBzR8QAAALDwAgACgCDBogAEEANgIMCx8BAX8jAEEQayIDJAAgACABIAIQ4gogA0EQaiQAIAALsAUBDn8jAEEQayILJAAgBhDMASEJIAtBBGogBhDXAyIOEMgBIAUgAzYCAAJAAkAgACIHLQAAIgZBK2sOAwABAAELIAkgBsAQnwEhBiAFIAUoAgAiCEEBajYCACAIIAY6AAAgAEEBaiEHCwJAAkAgAiAHIgZrQQFMDQAgBi0AAEEwRw0AIAYtAAFBIHJB+ABHDQAgCUEwEJ8BIQggBSAFKAIAIgdBAWo2AgAgByAIOgAAIAkgBiwAARCfASEIIAUgBSgCACIHQQFqNgIAIAcgCDoAACAGQQJqIgchBgNAIAIgBk0NAiAGLAAAEGghEhDTC0UNAiAGQQFqIQYMAAsACwNAIAIgBk0NASAGLAAAEGghFBDSC0UNASAGQQFqIQYMAAsACwJAIAtBBGoQ8wEEQCAJIAcgBiAFKAIAEO8CIAUgBSgCACAGIAdrajYCAAwBCyAHIAYQngMgDhDJASEPIAchCANAIAYgCE0EQCADIAcgAGtqIAUoAgAQngMFAkAgC0EEaiINIAwQPywAAEEATA0AIAogDSAMED8sAABHDQAgBSAFKAIAIgpBAWo2AgAgCiAPOgAAIAwgDCANECNBAWtJaiEMQQAhCgsgCSAILAAAEJ8BIQ0gBSAFKAIAIhBBAWo2AgAgECANOgAAIAhBAWohCCAKQQFqIQoMAQsLCwNAAkACQCACIAZNBEAgBiEIDAELIAZBAWohCCAGLAAAIgZBLkcNASAOEPIBIQYgBSAFKAIAIgdBAWo2AgAgByAGOgAACyAJIAggAiAFKAIAEO8CIAUgBSgCACACIAhraiIFNgIAIAQgBSADIAEgAGtqIAEgAkYbNgIAIAtBBGoQNBogC0EQaiQADwsgCSAGEJ8BIQYgBSAFKAIAIgdBAWo2AgAgByAGOgAAIAghBgwACwAL3QMBCH8jAEEQayILJAAgBhDMASEKIAtBBGoiByAGENcDIgYQyAECQCAHEPMBBEAgCiAAIAIgAxDvAiAFIAMgAiAAa2oiBjYCAAwBCyAFIAM2AgACQAJAIAAiBy0AACIIQStrDgMAAQABCyAKIAjAEJ8BIQcgBSAFKAIAIghBAWo2AgAgCCAHOgAAIABBAWohBwsCQCACIAdrQQJIDQAgBy0AAEEwRw0AIActAAFBIHJB+ABHDQAgCkEwEJ8BIQggBSAFKAIAIglBAWo2AgAgCSAIOgAAIAogBywAARCfASEIIAUgBSgCACIJQQFqNgIAIAkgCDoAACAHQQJqIQcLIAcgAhCeA0EAIQkgBhDJASENQQAhCCAHIQYDfyACIAZNBH8gAyAHIABraiAFKAIAEJ4DIAUoAgAFAkAgC0EEaiIMIAgQPy0AAEUNACAJIAwgCBA/LAAARw0AIAUgBSgCACIJQQFqNgIAIAkgDToAACAIIAggDBAjQQFrSWohCEEAIQkLIAogBiwAABCfASEMIAUgBSgCACIOQQFqNgIAIA4gDDoAACAGQQFqIQYgCUEBaiEJDAELCyEGCyAEIAYgAyABIABraiABIAJGGzYCACALQQRqEDQaIAtBEGokAAtnAQJ/IwBBEGsiAyQAA0ACQCABLQAAIgJB3ABHBEAgAgRAIALAIgJBAE4EQCAAIAIQZgwDCyADIAI2AgAgAEGW4wAgAxAdDAILIANBEGokAA8LIABBs8oBEBoaCyABQQFqIQEMAAsAC5oDAQJ/IwBB0AJrIgAkACAAIAI2AsgCIAAgATYCzAIgAxCkAiEGIAMgAEHQAWoQoAQhByAAQcQBaiADIABBxAJqEJ8EIABBuAFqEFEiASABEFUQPSAAIAFBABA/IgI2ArQBIAAgAEEQajYCDCAAQQA2AggDQAJAIABBzAJqIABByAJqEFoNACAAKAK0ASABECMgAmpGBEAgARAjIQMgASABECNBAXQQPSABIAEQVRA9IAAgAyABQQAQPyICajYCtAELIABBzAJqIgMQhAEgBiACIABBtAFqIABBCGogACgCxAIgAEHEAWogAEEQaiAAQQxqIAcQ1AMNACADEJgBGgwBCwsCQCAAQcQBahAjRQ0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCtAEgBCAGEMULNgIAIABBxAFqIABBEGogACgCDCAEELMBIABBzAJqIABByAJqEFoEQCAEIAQoAgBBAnI2AgALIAAoAswCIAEQNBogAEHEAWoQNBogAEHQAmokAAtEAQF/IwBBEGsiAyQAIAMgATYCDCADIAI2AgggA0EEaiADQQxqEIoCIABB4OAAIAMoAggQ+wshABCJAiADQRBqJAAgAAuxAgIEfgV/IwBBIGsiCCQAAkACQAJAIAEgAkcEQEGAjAsoAgAhDEGAjAtBADYCACMAQRBrIgkkABBoGiMAQRBrIgokACMAQRBrIgskACALIAEgCEEcakECELIHIAspAwAhBCAKIAspAwg3AwggCiAENwMAIAtBEGokACAKKQMAIQQgCSAKKQMINwMIIAkgBDcDACAKQRBqJAAgCSkDACEEIAggCSkDCDcDECAIIAQ3AwggCUEQaiQAIAgpAxAhBCAIKQMIIQVBgIwLKAIAIgFFDQEgCCgCHCACRw0CIAUhBiAEIQcgAUHEAEcNAwwCCyADQQQ2AgAMAgtBgIwLIAw2AgAgCCgCHCACRg0BCyADQQQ2AgAgBiEFIAchBAsgACAFNwMAIAAgBDcDCCAIQSBqJAALnwECAn8BfCMAQRBrIgMkAAJAAkACQCAAIAFHBEBBgIwLKAIAIQRBgIwLQQA2AgAQaBogACADQQxqEOABIQUCQEGAjAsoAgAiAARAIAMoAgwgAUYNAQwDC0GAjAsgBDYCACADKAIMIAFHDQIMBAsgAEHEAEcNAwwCCyACQQQ2AgAMAgtEAAAAAAAAAAAhBQsgAkEENgIACyADQRBqJAAgBQu8AQIDfwF9IwBBEGsiAyQAAkACQAJAIAAgAUcEQEGAjAsoAgAhBUGAjAtBADYCABBoGiMAQRBrIgQkACAEIAAgA0EMakEAELIHIAQpAwAgBCkDCBC0BSEGIARBEGokAAJAQYCMCygCACIABEAgAygCDCABRg0BDAMLQYCMCyAFNgIAIAMoAgwgAUcNAgwECyAAQcQARw0DDAILIAJBBDYCAAwCC0MAAAAAIQYLIAJBBDYCAAsgA0EQaiQAIAYLwwECA38BfiMAQRBrIgQkAAJ+AkACQCAAIAFHBEACQAJAIAAtAAAiBUEtRw0AIABBAWoiACABRw0ADAELQYCMCygCACEGQYCMC0EANgIAEGgaIAAgBEEMaiADEIgHIQcCQEGAjAsoAgAiAARAIAQoAgwgAUcNASAAQcQARg0EDAULQYCMCyAGNgIAIAQoAgwgAUYNBAsLCyACQQQ2AgBCAAwCCyACQQQ2AgBCfwwBC0IAIAd9IAcgBUEtRhsLIARBEGokAAvUAQIDfwF+IwBBEGsiBCQAAn8CQAJAAkAgACABRwRAAkACQCAALQAAIgVBLUcNACAAQQFqIgAgAUcNAAwBC0GAjAsoAgAhBkGAjAtBADYCABBoGiAAIARBDGogAxCIByEHAkBBgIwLKAIAIgAEQCAEKAIMIAFHDQEgAEHEAEYNBQwEC0GAjAsgBjYCACAEKAIMIAFGDQMLCwsgAkEENgIAQQAMAwsgB0L/////D1gNAQsgAkEENgIAQX8MAQtBACAHpyIAayAAIAVBLUYbCyAEQRBqJAALjwMBAX8jAEGAAmsiACQAIAAgAjYC+AEgACABNgL8ASADEKQCIQYgAEHEAWogAyAAQfcBahChBCAAQbgBahBRIgEgARBVED0gACABQQAQPyICNgK0ASAAIABBEGo2AgwgAEEANgIIA0ACQCAAQfwBaiAAQfgBahBbDQAgACgCtAEgARAjIAJqRgRAIAEQIyEDIAEgARAjQQF0ED0gASABEFUQPSAAIAMgAUEAED8iAmo2ArQBCyAAQfwBaiIDEIUBIAYgAiAAQbQBaiAAQQhqIAAsAPcBIABBxAFqIABBEGogAEEMakHwswkQ1gMNACADEJkBGgwBCwsCQCAAQcQBahAjRQ0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCtAEgBCAGEMULNgIAIABBxAFqIABBEGogACgCDCAEELMBIABB/AFqIABB+AFqEFsEQCAEIAQoAgBBAnI2AgALIAAoAvwBIAEQNBogAEHEAWoQNBogAEGAAmokAAvZAQIDfwF+IwBBEGsiBCQAAn8CQAJAAkAgACABRwRAAkACQCAALQAAIgVBLUcNACAAQQFqIgAgAUcNAAwBC0GAjAsoAgAhBkGAjAtBADYCABBoGiAAIARBDGogAxCIByEHAkBBgIwLKAIAIgAEQCAEKAIMIAFHDQEgAEHEAEYNBQwEC0GAjAsgBjYCACAEKAIMIAFGDQMLCwsgAkEENgIAQQAMAwsgB0L//wNYDQELIAJBBDYCAEH//wMMAQtBACAHpyIAayAAIAVBLUYbCyAEQRBqJABB//8DcQu3AQIBfgJ/IwBBEGsiBSQAAkACQCAAIAFHBEBBgIwLKAIAIQZBgIwLQQA2AgAQaBogACAFQQxqIAMQ5gohBAJAQYCMCygCACIABEAgBSgCDCABRw0BIABBxABGDQMMBAtBgIwLIAY2AgAgBSgCDCABRg0DCwsgAkEENgIAQgAhBAwBCyACQQQ2AgAgBEIAVQRAQv///////////wAhBAwBC0KAgICAgICAgIB/IQQLIAVBEGokACAEC8ABAgJ/AX4jAEEQayIEJAACfwJAAkAgACABRwRAQYCMCygCACEFQYCMC0EANgIAEGgaIAAgBEEMaiADEOYKIQYCQEGAjAsoAgAiAARAIAQoAgwgAUcNASAAQcQARg0EDAMLQYCMCyAFNgIAIAQoAgwgAUYNAgsLIAJBBDYCAEEADAILIAZCgICAgHhTIAZC/////wdVcg0AIAanDAELIAJBBDYCAEH/////ByAGQgBVDQAaQYCAgIB4CyAEQRBqJAALCgAgASAAa0EMbQuwAQEDfwJAIAEgAhCeCyEEIwBBEGsiAyQAIARB9////wNNBEACQCAEEJQFBEAgACAEENMBIAAhBQwBCyADQQhqIAQQzgNBAWoQzQMgAygCDBogACADKAIIIgUQ9wEgACADKAIMEPYBIAAgBBC+AQsDQCABIAJHBEAgBSABENwBIAVBBGohBSABQQRqIQEMAQsLIANBADYCBCAFIANBBGoQ3AEgA0EQaiQADAELEMoBAAsLMQEBf0HEjgsoAgAhASAABEBBxI4LQaiMCyAAIABBf0YbNgIAC0F/IAEgAUGojAtGGwufCAEFfyABKAIAIQQCQAJAAkACQAJAAkACfwJAAkACQAJAIANFDQAgAygCACIGRQ0AIABFBEAgAiEDDAQLIANBADYCACACIQMMAQsCQEHEjgsoAgAoAgBFBEAgAEUNASACRQ0LIAIhBgNAIAQsAAAiAwRAIAAgA0H/vwNxNgIAIABBBGohACAEQQFqIQQgBkEBayIGDQEMDQsLIABBADYCACABQQA2AgAgAiAGaw8LIAIhAyAARQ0CQQEhBQwBCyAEEDsPCwNAAkACQAJAAn8CQCAFRQRAIAQtAAAiBUEDdiIHQRBrIAcgBkEadWpyQQdLDQogBEEBaiEHIAVBgAFrIAZBBnRyIgVBAEgNASAHDAILIANFDQ4DQCAELQAAIgVBAWtB/gBLBEAgBSEGDAYLIARBA3EgA0EFSXJFBEACQANAIAQoAgAiBkGBgoQIayAGckGAgYKEeHENASAAIAZB/wFxNgIAIAAgBC0AATYCBCAAIAQtAAI2AgggACAELQADNgIMIABBEGohACAEQQRqIQQgA0EEayIDQQRLDQALIAQtAAAhBgsgBkH/AXEiBUEBa0H+AEsNBgsgACAFNgIAIABBBGohACAEQQFqIQQgA0EBayIDDQALDA4LIActAABBgAFrIgdBP0sNASAHIAVBBnQiCHIhBSAEQQJqIgcgCEEATg0AGiAHLQAAQYABayIHQT9LDQEgByAFQQZ0ciEFIARBA2oLIQQgACAFNgIAIANBAWshAyAAQQRqIQAMAQtBgIwLQRk2AgAgBEEBayEEDAkLQQEhBQwBCyAFQcIBayIFQTJLDQUgBEEBaiEEIAVBAnRB0JEJaigCACEGQQAhBQwACwALQQEMAQtBAAshBQNAIAVFBEAgBC0AAEEDdiIFQRBrIAZBGnUgBWpyQQdLDQICfyAEQQFqIgUgBkGAgIAQcUUNABogBSwAAEFATgRAIARBAWshBAwGCyAEQQJqIgUgBkGAgCBxRQ0AGiAFLAAAQUBOBEAgBEEBayEEDAYLIARBA2oLIQQgA0EBayEDQQEhBQwBCwNAAkAgBEEDcSAELQAAIgZBAWtB/gBLcg0AIAQoAgAiBkGBgoQIayAGckGAgYKEeHENAANAIANBBGshAyAEKAIEIQYgBEEEaiEEIAYgBkGBgoQIa3JBgIGChHhxRQ0ACwsgBkH/AXEiBUEBa0H+AE0EQCADQQFrIQMgBEEBaiEEDAELCyAFQcIBayIFQTJLDQIgBEEBaiEEIAVBAnRB0JEJaigCACEGQQAhBQwACwALIARBAWshBCAGDQEgBC0AACEGCyAGQf8BcQ0AIAAEQCAAQQA2AgAgAUEANgIACyACIANrDwtBgIwLQRk2AgAgAEUNAQsgASAENgIAC0F/DwsgASAENgIAIAILDgAgABDUCwRAIAAQGAsLOAAgAEHQD2sgACAAQZPx//8HShsiAEEDcQRAQQAPCyAAQewOaiIAQeQAbwRAQQEPCyAAQZADb0UL7xICD38EfiMAQYABayIIJAAgAQRAAn8DQAJAAn8gAi0AACIFQSVHBEAgCSAFRQ0EGiAAIAlqIAU6AAAgCUEBagwBC0EAIQVBASEHAkACQAJAIAItAAEiBkEtaw4EAQICAQALIAZB3wBHDQELIAYhBSACLQACIQZBAiEHC0EAIQ4CQAJ/IAIgB2ogBkH/AXEiEkErRmoiDSwAAEEwa0EJTQRAIA0gCEEMakEKEKgEIQIgCCgCDAwBCyAIIA02AgxBACECIA0LIgctAAAiBkHDAGsiCkEWS0EBIAp0QZmAgAJxRXINACACIg4NACAHIA1HIQ4LIAZBzwBGIAZBxQBGcgR/IActAAEhBiAHQQFqBSAHCyECIAhBEGohByAFIQ1BACEFIwBB0ABrIgokAEGmEiEMQTAhEEGogAghCwJAIAgCfwJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACfgJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBsAiBkElaw5WIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQEDBCctBwgJCi0tLQ0tLS0tEBIUFhgXHB4gLS0tLS0tAAImBgUtCAItCy0tDA4tDy0lERMVLRkbHR8tCyADKAIYIgVBBk0NIgwqCyADKAIYIgVBBksNKSAFQYeACGoMIgsgAygCECIFQQtLDSggBUGOgAhqDCELIAMoAhAiBUELSw0nIAVBmoAIagwgCyADNAIUQuwOfELkAH8hFAwjC0HfACEQCyADNAIMIRQMIQtBs7UBIQwMHwsgAzQCFCIVQuwOfCEUAkAgAygCHCIFQQJMBEAgFCAVQusOfCADEKAHQQFGGyEUDAELIAVB6QJJDQAgFULtDnwgFCADEKAHQQFGGyEUCyAGQecARg0ZDCALIAM0AgghFAweC0ECIQUgAygCCCIGRQRAQgwhFAwgCyAGrCIUQgx9IBQgBkEMShshFAwfCyADKAIcQQFqrCEUQQMhBQweCyADKAIQQQFqrCEUDBsLIAM0AgQhFAwaCyAIQQE2AnxB7IYFIQUMHgtBp4AIQaaACCADKAIIQQtKGwwUC0HQ0wEhDAwWC0EAIQtBACERIwBBEGsiDyQAIAM0AhQhFAJ+IAMoAhAiDEEMTwRAIAwgDEEMbSIGQQxsayIFQQxqIAUgBUEASBshDCAGIAVBH3VqrCAUfCEUCyAPQQxqIQYgFEICfUKIAVgEQCAUpyILQcQAa0ECdSEFAkAgBgJ/IAtBA3FFBEAgBUEBayEFIAZFDQJBAQwBCyAGRQ0BQQALNgIACyALQYDnhA9sIAVBgKMFbGpBgNav4wdqrAwBCyAUQuQAfSIUIBRCkAN/IhZCkAN+fSIVQj+HpyAWp2ohEwJAAkACQCAVpyIFQZADaiAFIBVCAFMbIgUEfwJ/IAVByAFOBEAgBUGsAk8EQEEDIQsgBUGsAmsMAgtBAiELIAVByAFrDAELIAVB5ABrIAUgBUHjAEoiCxsLIgUNAUEABUEBCyEFIAYNAQwCCyAFQQJ2IREgBUEDcUUhBSAGRQ0BCyAGIAU2AgALIBRCgOeED34gESALQRhsIBNB4QBsamogBWusQoCjBX58QoCqusMDfAshFCAMQQJ0QcCYCWooAgAiBUGAowVqIAUgDygCDBsgBSAMQQFKGyEFIAMoAgwhBiADNAIIIRUgAzQCBCEWIAM0AgAgD0EQaiQAIBQgBax8IAZBAWusQoCjBX58IBVCkBx+fCAWQjx+fHwgAzQCJH0MCAsgAzQCACEUDBULIAhBATYCfEHuhgUhBQwZC0HP0QEhDAwSCyADKAIYIgVBByAFG6wMBAsgAygCHCADKAIYa0EHakEHbq0hFAwRCyADKAIcIAMoAhhBBmpBB3BrQQdqQQdurSEUDBALIAMQoAetIRQMDwsgAzQCGAshFEEBIQUMDwtBqYAIIQsMCgtBqoAIIQsMCQsgAzQCFELsDnxC5ACBIhQgFEI/hyIUhSAUfSEUDAoLIAM0AhQiFULsDnwhFCAVQqQ/Uw0KIAogFDcDMCAIIAdB5ABB8KsBIApBMGoQoQE2AnwgByEFDA4LIAMoAiBBAEgEQCAIQQA2AnxB74YFIQUMDgsgCiADKAIkIgVBkBxtIgZB5ABsIAUgBkGQHGxrwUE8bcFqNgJAIAggB0HkAEGJrAEgCkFAaxChATYCfCAHIQUMDQsgAygCIEEASARAIAhBADYCfEHvhgUhBQwNCyADKAIoEJQMDAsLIAhBATYCfEHcsAMhBQwLCyAUQuQAgSEUDAULIAVBgIAIcgsgBBDRCwwHC0GrgAghCwsgCyAEENELIQwLIAggB0HkACAMIAMgBBDQCyIFNgJ8IAdBACAFGyEFDAULQQIhBQwBC0EEIQULAkAgDSAQIA0bIgZB3wBHBEAgBkEtRw0BIAogFDcDECAIIAdB5ABB8asBIApBEGoQoQE2AnwgByEFDAQLIAogFDcDKCAKIAU2AiAgCCAHQeQAQeqrASAKQSBqEKEBNgJ8IAchBQwDCyAKIBQ3AwggCiAFNgIAIAggB0HkAEHjqwEgChChATYCfCAHIQUMAgtB658DCyIFEDs2AnwLIApB0ABqJAAgBSIHRQ0BAkAgDkUEQCAIKAJ8IQUMAQsCfwJAAkAgBy0AACIGQStrDgMBAAEACyAIKAJ8DAELIActAAEhBiAHQQFqIQcgCCgCfEEBawshBQJAIAZB/wFxQTBHDQADQCAHLAABIgZBMGtBCUsNASAHQQFqIQcgBUEBayEFIAZBMEYNAAsLIAggBTYCfEEAIQYDQCAGIg1BAWohBiAHIA1qLAAAQTBrQQpJDQALIA4gBSAFIA5JGyEGAkAgACAJaiADKAIUQZRxSAR/QS0FIBJBK0cNASAGIAVrIA1qQQNBBSAIKAIMLQAAQcMARhtJDQFBKws6AAAgBkEBayEGIAlBAWohCQsgASAJTSAFIAZPcg0AA0AgACAJakEwOgAAIAlBAWohCSAGQQFrIgYgBU0NASABIAlLDQALCyAIIAUgASAJayIGIAUgBkkbIgU2AnwgACAJaiAHIAUQHxogCCgCfCAJagshCSACQQFqIQIgASAJSw0BCwsgAUEBayAJIAEgCUYbIQlBAAshBiAAIAlqQQA6AAALIAhBgAFqJAAgBgu+AQECfyAAQQ5GBEBB3PIBQcbZASABKAIAGw8LIABB//8DcSICQf//A0cgAEEQdSIDQQVKckUEQCABIANBAnRqKAIAIgBBCGpB894BIAAbDwtB74YFIQACQAJ/AkACQAJAIANBAWsOBQABBAQCBAsgAkEBSw0DQfCYCQwCCyACQTFLDQJBgJkJDAELIAJBA0sNAUHAmwkLIQAgAkUEQCAADwsDQCAALQAAIABBAWohAA0AIAJBAWsiAg0ACwsgAAsKACAAQTBrQQpJCxcAIABBMGtBCkkgAEEgckHhAGtBBklyCycAIABBAEcgAEGY9whHcSAAQbD3CEdxIABBwKQLR3EgAEHYpAtHcQssAQF/IAAoAgAiAQRAIAEQ6QtBfxDDAkUEQCAAKAIARQ8LIABBADYCAAtBAQssAQF/IAAoAgAiAQRAIAEQ8QtBfxDDAkUEQCAAKAIARQ8LIABBADYCAAtBAQuJAgEEfyABENoLBEBBBCABIAFBBE0bIQFBASAAIABBAU0bIQADQAJAIAAgACABakEBa0EAIAFrcSICIAAgAksbIQVBACEEIwBBEGsiAyQAAkAgAUEDcQ0AIAUgAXANAAJ/AkBBMAJ/IAFBCEYEQCAFEEgMAQtBHCEEIAFBA3EgAUEESXINASABQQJ2IgIgAkEBa3ENAUEwQUAgAWsgBUkNAhpBECABIAFBEE0bIAUQ+QsLIgJFDQEaIAMgAjYCDEEAIQQLIAQLIQJBACADKAIMIAIbIQQLIANBEGokACAEIgMNAEGstAsoAgAiAkUNACACEQwADAELCyADRQRAEMoBCyADDwsgABCKAQsHACABIABrCwkAIAAgARDYCwsHACAAQQhLCxMAIAEQ2gsEQCAAEBgPCyAAEBgLEgAgAEIANwIAIABBADYCCCAACxMAIAIEQCAAIAEgAkECdBBSGgsLRQEBfyMAQRBrIgQkACAEIAI2AgwgAyABIAIgAWsiAUECdRDdCyAEIAEgA2o2AgggACAEQQxqIARBCGoQ+AEgBEEQaiQACxAAIAIEQCAAIAEgAhBSGgsLQgEBfyMAQRBrIgQkACAEIAI2AgwgAyABIAIgAWsiARDfCyAEIAEgA2o2AgggACAEQQxqIARBCGoQ+AEgBEEQaiQACwkAIAAQowcQGAskAQJ/IwBBEGsiAiQAIAEgABCoBSEDIAJBEGokACABIAAgAxsLDgBBACAAIABBfxDDAhsLsAEBA38CQCABIAIQ2QshBCMAQRBrIgMkACAEQff///8HTQRAAkAgBBCpBQRAIAAgBBDTASAAIQUMAQsgA0EIaiAEENoDQQFqENkDIAMoAgwaIAAgAygCCCIFEPcBIAAgAygCDBD2ASAAIAQQvgELA0AgASACRwRAIAUgARDSASAFQQFqIQUgAUEBaiEBDAELCyADQQA6AAcgBSADQQdqENIBIANBEGokAAwBCxDKAQALCw8AIAAgACgCGCABajYCGAsXACAAIAI2AhwgACABNgIUIAAgATYCGAtXAQJ/AkAgACgCACICRQ0AAn8gAigCGCIDIAIoAhxGBEAgAiABIAIoAgAoAjQRAAAMAQsgAiADQQRqNgIYIAMgATYCACABC0F/EMMCRQ0AIABBADYCAAsLMQEBfyAAKAIMIgEgACgCEEYEQCAAIAAoAgAoAigRAgAPCyAAIAFBBGo2AgwgASgCAAsnAQF/IAAoAgwiASAAKAIQRgRAIAAgACgCACgCJBECAA8LIAEoAgALJwEBfwJAIAAoAgAiAkUNACACIAEQ7wtBfxDDAkUNACAAQQA2AgALC1MBA38CQEF/IAAoAkwQwwJFBEAgACgCTCEADAELIAAjAEEQayIBJAAgAUEMaiICIAAQUCACEMwBQSAQnwEhACACEE0gAUEQaiQAIAA2AkwLIADACxoAIAAgASABKAIAQQxrKAIAaigCGDYCACAACwsAIABB4KULEKUCCwkAIAAQpwcQGAs9AQF/IAAoAhgiAiAAKAIcRgRAIAAgARCkAyAAKAIAKAI0EQAADwsgACACQQFqNgIYIAIgAToAACABEKQDCzQBAX8gACgCDCIBIAAoAhBGBEAgACAAKAIAKAIoEQIADwsgACABQQFqNgIMIAEsAAAQpAMLKgEBfyAAKAIMIgEgACgCEEYEQCAAIAAoAgAoAiQRAgAPCyABLAAAEKQDCw8AIAAgACgCACgCGBECAAsIACAAKAIQRQsEAEF/C0QBAn8CQCAAKAIAIAEoAgAgACgCBCIAIAEoAgQiAiAAIAJJIgMbEOgBIgENAEEBIQEgACACSw0AQX9BACADGyEBCyABCwgAIAAQoQcaC74PAgV/D34jAEHQAmsiBSQAIARC////////P4MhCiACQv///////z+DIQsgAiAEhUKAgICAgICAgIB/gyEMIARCMIinQf//AXEhCAJAAkAgAkIwiKdB//8BcSIJQf//AWtBgoB+TwRAIAhB//8Ba0GBgH5LDQELIAFQIAJC////////////AIMiDUKAgICAgIDA//8AVCANQoCAgICAgMD//wBRG0UEQCACQoCAgICAgCCEIQwMAgsgA1AgBEL///////////8AgyICQoCAgICAgMD//wBUIAJCgICAgICAwP//AFEbRQRAIARCgICAgICAIIQhDCADIQEMAgsgASANQoCAgICAgMD//wCFhFAEQCADIAJCgICAgICAwP//AIWEUARAQgAhAUKAgICAgIDg//8AIQwMAwsgDEKAgICAgIDA//8AhCEMQgAhAQwCCyADIAJCgICAgICAwP//AIWEUARAQgAhAQwCCyABIA2EUARAQoCAgICAgOD//wAgDCACIAOEUBshDEIAIQEMAgsgAiADhFAEQCAMQoCAgICAgMD//wCEIQxCACEBDAILIA1C////////P1gEQCAFQcACaiABIAsgASALIAtQIgYbeSAGQQZ0rXynIgZBD2sQtQFBECAGayEGIAUpA8gCIQsgBSkDwAIhAQsgAkL///////8/Vg0AIAVBsAJqIAMgCiADIAogClAiBxt5IAdBBnStfKciB0EPaxC1ASAGIAdqQRBrIQYgBSkDuAIhCiAFKQOwAiEDCyAFQaACaiAKQoCAgICAgMAAhCISQg+GIANCMYiEIgJCAEKAgICAsOa8gvUAIAJ9IgRCABCgASAFQZACakIAIAUpA6gCfUIAIARCABCgASAFQYACaiAFKQOYAkIBhiAFKQOQAkI/iIQiBEIAIAJCABCgASAFQfABaiAEQgBCACAFKQOIAn1CABCgASAFQeABaiAFKQP4AUIBhiAFKQPwAUI/iIQiBEIAIAJCABCgASAFQdABaiAEQgBCACAFKQPoAX1CABCgASAFQcABaiAFKQPYAUIBhiAFKQPQAUI/iIQiBEIAIAJCABCgASAFQbABaiAEQgBCACAFKQPIAX1CABCgASAFQaABaiACQgAgBSkDuAFCAYYgBSkDsAFCP4iEQgF9IgJCABCgASAFQZABaiADQg+GQgAgAkIAEKABIAVB8ABqIAJCAEIAIAUpA6gBIAUpA6ABIg0gBSkDmAF8IgQgDVStfCAEQgFWrXx9QgAQoAEgBUGAAWpCASAEfUIAIAJCABCgASAGIAkgCGtqIQYCfyAFKQNwIhNCAYYiDiAFKQOIASIPQgGGIAUpA4ABQj+IhHwiEELn7AB9IhRCIIgiAiALQoCAgICAgMAAhCIVQgGGIhZCIIgiBH4iESABQgGGIg1CIIgiCiAQIBRWrSAOIBBWrSAFKQN4QgGGIBNCP4iEIA9CP4h8fHxCAX0iE0IgiCIQfnwiDiARVK0gDiAOIBNC/////w+DIhMgAUI/iCIXIAtCAYaEQv////8PgyILfnwiDlatfCAEIBB+fCAEIBN+IhEgCyAQfnwiDyARVK1CIIYgD0IgiIR8IA4gDiAPQiCGfCIOVq18IA4gDiAUQv////8PgyIUIAt+IhEgAiAKfnwiDyARVK0gDyAPIBMgDUL+////D4MiEX58Ig9WrXx8Ig5WrXwgDiAEIBR+IhggECARfnwiBCACIAt+fCILIAogE358IhBCIIggCyAQVq0gBCAYVK0gBCALVq18fEIghoR8IgQgDlStfCAEIA8gAiARfiICIAogFH58IgpCIIggAiAKVq1CIIaEfCICIA9UrSACIBBCIIZ8IAJUrXx8IgIgBFStfCIEQv////////8AWARAIBYgF4QhFSAFQdAAaiACIAQgAyASEKABIAFCMYYgBSkDWH0gBSkDUCIBQgBSrX0hCkIAIAF9IQsgBkH+/wBqDAELIAVB4ABqIARCP4YgAkIBiIQiAiAEQgGIIgQgAyASEKABIAFCMIYgBSkDaH0gBSkDYCINQgBSrX0hCkIAIA19IQsgASENIAZB//8AagsiBkH//wFOBEAgDEKAgICAgIDA//8AhCEMQgAhAQwBCwJ+IAZBAEoEQCAKQgGGIAtCP4iEIQEgBEL///////8/gyAGrUIwhoQhCiALQgGGDAELIAZBj39MBEBCACEBDAILIAVBQGsgAiAEQQEgBmsQpQMgBUEwaiANIBUgBkHwAGoQtQEgBUEgaiADIBIgBSkDQCICIAUpA0giChCgASAFKQM4IAUpAyhCAYYgBSkDICIBQj+IhH0gBSkDMCIEIAFCAYYiDVStfSEBIAQgDX0LIQQgBUEQaiADIBJCA0IAEKABIAUgAyASQgVCABCgASAKIAIgAiADIAQgAkIBgyIEfCIDVCABIAMgBFStfCIBIBJWIAEgElEbrXwiAlatfCIEIAIgAiAEQoCAgICAgMD//wBUIAMgBSkDEFYgASAFKQMYIgRWIAEgBFEbca18IgJWrXwiBCACIARCgICAgICAwP//AFQgAyAFKQMAViABIAUpAwgiA1YgASADURtxrXwiASACVK18IAyEIQwLIAAgATcDACAAIAw3AwggBUHQAmokAAvAAQIBfwJ+QX8hAwJAIABCAFIgAUL/////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QX8gDhshDgsgBUUNASAMEBggABAYDAELQX8hDgsgBkGwAmokACADQZABaiQAIA4LQwACQCAARQ0AAkACQAJAAkAgAUECag4GAAECAgQDBAsgACACPAAADwsgACACPQEADwsgACACPgIADwsgACACNwMACwsPACAAIAEgAkEAQQAQrwcLDQAgACABIAJBABDCBwu8AgACQAJAAkACQAJAAkACQAJAAkACQAJAIAFBCWsOEgAICQoICQECAwQKCQoKCAkFBgcLIAIgAigCACIBQQRqNgIAIAAgASgCADYCAA8LIAIgAigCACIBQQRqNgIAIAAgATIBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATMBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATAAADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATEAADcDAA8LIAIgAigCAEEHakF4cSIBQQhqNgIAIAAgASsDADkDAA8LIAAgAiADEQMACw8LIAIgAigCACIBQQRqNgIAIAAgATQCADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATUCADcDAA8LIAIgAigCAEEHakF4cSIBQQhqNgIAIAAgASkDADcDAAtvAQV/IAAoAgAiAywAAEEwayIBQQlLBEBBAA8LA0BBfyEEIAJBzJmz5gBNBEBBfyABIAJBCmwiBWogASAFQf////8Hc0sbIQQLIAAgA0EBaiIFNgIAIAMsAAEgBCECIAUhA0EwayIBQQpJDQALIAIL9RICEn8CfiMAQUBqIggkACAIIAE2AjwgCEEnaiEWIAhBKGohEQJAAkACQAJAA0BBACEHA0AgASENIAcgDkH/////B3NKDQIgByAOaiEOAkACQAJAAkAgASIHLQAAIgsEQANAAkACQCALQf8BcSIBRQRAIAchAQwBCyABQSVHDQEgByELA0AgCy0AAUElRwRAIAshAQwCCyAHQQFqIQcgCy0AAiALQQJqIgEhC0ElRg0ACwsgByANayIHIA5B/////wdzIhdKDQkgAARAIAAgDSAHEKgBCyAHDQcgCCABNgI8IAFBAWohB0F/IRACQCABLAABQTBrIgpBCUsNACABLQACQSRHDQAgAUEDaiEHQQEhEiAKIRALIAggBzYCPEEAIQwCQCAHLAAAIgtBIGsiAUEfSwRAIAchCgwBCyAHIQpBASAB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8ABqIAEgAkIAQgAQbCAFKQN4IQIgBSkDcCEEDAELIARCMIinQf//AXEhByAGBH4gAQUgBUHgAGogASAKQgBCgICAgICAwLvAABBsIAUpA2giCkIwiKdB+ABrIQYgBSkDYAshBCAHRQRAIAVB0ABqIAMgCUIAQoCAgICAgMC7wAAQbCAFKQNYIglCMIinQfgAayEHIAUpA1AhAwsgCUL///////8/g0KAgICAgIDAAIQhCyAKQv///////z+DQoCAgICAgMAAhCEKIAYgB0oEQANAAn4gCiALfSADIARWrX0iCUIAWQRAIAkgBCADfSIEhFAEQCAFQSBqIAEgAkIAQgAQbCAFKQMoIQIgBSkDICEEDAULIAlCAYYgBEI/iIQMAQsgCkIBhiAEQj+IhAshCiAEQgGGIQQgBkEBayIGIAdKDQALIAchBgsCQCAKIAt9IAMgBFatfSIJQgBTBEAgCiEJDAELIAkgBCADfSIEhEIAUg0AIAVBMGogASACQgBCABBsIAUpAzghAiAFKQMwIQQMAQsgCUL///////8/WARAA0AgBEI/iCAGQQFrIQYgBEIBhiEEIAlCAYaEIglCgICAgICAwABUDQALCyAIQYCAAnEhByAGQQBMBEAgBUFAayAEIAlC////////P4MgBkH4AGogB3KtQjCGhEIAQoCAgICAgMDDPxBsIAUpA0ghAiAFKQNAIQQMAQsgCUL///////8/gyAGIAdyrUIwhoQhAgsgACAENwMAIAAgAjcDCCAFQYABaiQAC78CAQF/IwBB0ABrIgQkAAJAIANBgIABTgRAIARBIGogASACQgBCgICAgICAgP//ABBsIAQpAyghAiAEKQMgIQEgA0H//wFJBEAgA0H//wBrIQMMAgsgBEEQaiABIAJCAEKAgICAgICA//8AEGxB/f8CIAMgA0H9/wJPG0H+/wFrIQMgBCkDGCECIAQpAxAhAQwBCyADQYGAf0oNACAEQUBrIAEgAkIAQoCAgICAgIA5EGwgBCkDSCECIAQpA0AhASADQfSAfksEQCADQY3/AGohAwwBCyAEQTBqIAEgAkIAQoCAgICAgIA5EGxB6IF9IAMgA0HogX1NG0Ga/gFqIQMgBCkDOCECIAQpAzAhAQsgBCABIAJCACADQf//AGqtQjCGEGwgACAEKQMINwMIIAAgBCkDADcDACAE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IAIgAzYC6AECQAJAIAEoAgQiBUUEQET////////vfyEbRP///////+//IRoMAQtE////////738hG0T////////v/yEaIAMgBRBBIgItAABFDQAgASgCACADRwRAIAIgAygCRCAFEEEQSUUNAQsgCEEAOgCsASAIIAk2AkQgCCAGNgJIIAggBzYCTCAIIAhBrAFqNgJQIAggCEGAAWo2AkAgAkHGwwEgCEFAaxBOQQROBEAgCCsDmAEhGiAIKwOQASEeIAgrA4gBIRsgCCsDgAEhHEGg3QorAwAiHUQAAAAAAAAAAGQEQCAeIB2jIR4gGyAdoyEbIBwgHaMhHCAaIB2jIRoLIAQoAhBBA0ECQQEgCC0ArAEiAkE/RhsgAkEhRhs6AIcBDAILIAMQICEFIAggAjYCNCAIIAU2AjBB4e8DIAhBMGoQKwtE////////7/8hHkT////////vfyEcCyALQQFqIQsgAxAbIQIDQCACBEAgAigCECAENgK4ASADIAIQHCECDAELCyAEKAIQIgItAIcBBEAgAigClAEiAiAaIBugRAAAAAAAAOA/ojkDCCACIB4gHKBEAAAAAAAA4D+iOQMACyAMQQFqIQwMAQsLIAAQGyECAn8CQANAIAIEQAJAIAIoAhAiAygCuAENAAJAIAMoAugBIgRFDQAgBCAAKAIQKAKMASgCMEYNACACECAhASAAECAhACAIIAIoAhAoAugBECA2AiggCCAANgIkIAggATYCIEHygAUgCEEgahA2DAQLIAMgADYC6AEgAy0AhgENACAKIAIQIBDPByEDIAIoAhAiBCADNgK4ASADKAIQIgMgCzYCiAEgAyAEKwMgOQMgIAMgBCsDKDkDKCADIAQrA1g5A1ggAyAEKwNgOQNgIAMgBCsDUDkDUCADIAQoAgg2AgggAyAEKAIMNgIMIAQtAIcBIgUEQCADKAKUASIHIAQoApQBIgQrAwA5AwAgByAEKwMIOQMIIAMgBToAhwELIAtBAWohCyADKAKAASACNgIICyAAIAIQHCECDAELCyAAEBshDgNAIA4EQCAOKAIQKAK4ASEDIAAgDhAtIQIDQCACBEAgAyACQVBBACACKAIAQQNxQQJHG2ooAigoAhAoArgBIgRHBEACfyADIARJBEAgCiADIARBAEEBEF4MAQsgCiAEIANBAEEBEF4LIgdB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ABC8AkEAIQULIAAgASgCAEYhDCAIKAJ8IgJFDQAgCygCACgCECIBKwMoIR8gASsDICEeIAErAxghIyABKwMQIRpBACACQQFGDQEaIB8gBSsDCCIboCEfIB4gBSsDACIcoCEeICMgG6AhIyAaIBygIRogCyEEIAUhAgNAIAQoAgQiAQRAIARBBGohBCACKwMQIRsgASgCECIBKwMQIRwgASsDGCEdIAErAyAhICAfIAErAyggAisDGCIhoBAiIR8gHiAgIBugECIhHiAjIB0gIaAQKiEjIBogHCAboBAqIRogAkEQaiECDAEFQQAMAwsACwALIAEoAgwhAiAAIAEoAghBNkEDEGK3IR4gACACQSRBAxBityEfRAAAAAAAAAAAIRpBAQshASAAKAIQIgIoAgwiAwR/IB4gAysDGBAyIB4gGqGhIhtEAAAAAAAA4D+iIhygIB4gG0QAAAAAAAAAAGQiAxshHiAaIByhIBogAxshGkEABSABCyAMckUEQCAAQfzdCigCAEEIQQAQYrchJCAAKAIQIQILICQgGqEhHCAkICOhIAIrAzigIR0gAisDWCEgAkAgAQ0AIAshDCAFIQIDQCAMKAIAIgRFDQECfyACRQRAIB0hGyAcIRpBAAwBCyAdIAIrAwigIRsgHCACKwMAoCEaIAJBEGoLIQEgDEEEaiEMIBtEAAAAAAAAUkCjIRsgGkQAAAAAAABSQKMhGiAEEBshAgNAIAIEQCACKAIQKAKUASIDIBogAysDAKA5AwAgAyAbIAMrAwigOQMIIAQgAhAcIQIMAQUgASECDAILAAsACwALIAooAhAoAowBIgFCADcDCCABQgA3AxAgASAeICQgHKCgRAAAAAAAAFJAozkDGCABIB8gICAkIB2goKBEAAAAAAAAUkCjOQMgIAUQGCAKEBshAgNAIAIEQAJAIAIoAhAiASgC6AEiAwRAIAMoAhAoAowBIgMgASgClAEiBCsDACABKwMgIhtEAAAAAAAA4D+ioSIcOQMIIAQrAwghHSABKwMoIRogAyAbIBygOQMYIAMgHSAaRAAAAAAAAOA/oqEiGzkDECADIBogG6A5AyAMAQsgASgCgAEoAggiA0UNACADKAIQKAKUASIDIAEoApQBIgErAwA5AwAgAyABKwMIOQMICyAKIAIQHCECDAELCyAAKAIQKAKMASIBIAoo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DaEgCCALoaMgCSALoaIgDaAhBQwFCyACIAogCiANoSAIIAuhoyIMIAiioSIOIAUgBSAGoSAJIAehoyIGIAmioSIFoSAGIAyhIgejOQMAIAYgDqIgBSAMoqEgB6MhBQwECyAAIAFBABDHAkF/RgRAIAEgAEEBEMcCQX9HBEAgByEMIAYhDgwDCyANIAogASAAQQAQxwJBf0YiABshDiALIAggABshDAwCCyAJIQwgBSEOIAAgAUEBEMcCQX9GDQJBACEPIAshDCANIQ4gCCEHIAohBiABIABBABDHAkF/Rw0EDAILIAggC6EgBSAKoaIgCiANoSAJIAihomEEQCACIAk5AwAMAwsgAiAHOQMAIAYhBQwCCyAJIQcgBSEGCyACIAwgB6BEAAAAAAAA4D+iOQMAIA4gBqBEAAAAAAAA4D+iIQULIAMgBTkDAEEBIQ8LIA8L9gECCHwBfyAAKwMIIQMgACsDACEEIAErAwghBSABKwMAIQYCfyAAKAIQIgsoAgQgAEYEQCALKAIADAELIABBGGoLIgsrAwghCCALKwMAIQcCfyABKAIQIgAoAgQgAUYEQCAAKAIADAELIAFBGGoLIgArAwghCSAAKwMAIQogAkF/IAcgBKEiByAFIAOhoiAIIAOhIgUgBiAEoaKhIgZEAAAAAAAAAABkIAZEAAAAAAAAAABjGyIANgIAIAJBfyAHIAkgA6GiIAUgCiAEoaKhIgNEAAAAAAAAAABkIANEAAAAAAAAAABjGyIBNgIEIAIgACABbDYCCAtNAQJ8An9BASAAKAIAIgArAwAiAiABKAIAIgErAwAiA2QNABpBfyACIANjDQAaQQEgACsDCCICIAErAwgiA2QNABpBf0EAIAIgA2MbCwvgDgMUfwp8AX4jAEHwAGsiAyQAIAFBACABQQBKGyESIAFBKBAZIQ8DQCACIBJGRQRAIAAgAkECdGooAgAoAgQgDGohDCACQQFqIQIMAQsLIAxBGBAZIhBBGGshBQNAIAggEkcEQCAPIAhBKGxqIgQgECAGQRhsajYCACAAIAhBAnRqKAIAIg0oAgQhCkEAIQJE////////738hFkT////////v/yEXRP///////+//IRlE////////738hGANAIAIgCkYEQCAEIBc5AyAgBCAZOQMYIAQgFjkDECAEIBg5AwggBCAFIAZBGGxq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BCsDGKEgAisDCKEhBSADKAIgIQMgBCgCICEEIAAoAgQgACgCAGsgASgCBCABKAIAa0kEQCADIAQgAiAFEOwFDwsgBCADIAIgBZoQ7AUL4gIBCX8gACgCACEFIAAoAgQhACMAQRBrIgMkACADQb8DNgIMAkAgACAFa0ECdSIGQQJIDQAgBkECa0EBdiEIA0AgCEEASA0BIAUgCEECdGohBAJAIAZBAkgNACAGQQJrQQF2IgkgBCAFayIAQQJ1SA0AIAUgAEEBdSIBQQFyIgJBAnRqIQAgBiABQQJqIgFKBEAgASACIAAoAgAgACgCBCADKAIMEQAAIgEbIQIgAEEEaiAAIAEbIQALIAAoAgAgBCgCACADKAIMEQAADQAgBCgCACEBA0ACQCAEIAAiBCgCADYCACACIAlKDQAgBSACQQF0IgdBAXIiAkECdGohACAGIAdBAmoiB0oEQCAHIAIgACgCACAAKAIEIAMoAgwRAAAiBxshAiAAQQRqIAAgBxshAAsgACgCACABIAMoAgwRAABFDQELCyAEIAE2AgALIAhBAWshCAwACwALIANBEGokAAtGAgF8An8gACgCBCEDIAAoAgAhAAN8IAAgA0YEfCABBSAAKAIAIgIrAwggAisDGKEgAisDEKIgAaAhASAAQQRqIQAMAQsLC2wCAX8CfCMAQRBrIgIkACACIAE2AgwgASAANgIgIAAgAkEMahDAASAAIAIoAgwiASsDECIDIAArAxigIgQ5AxggACADIAErAwggASsDGKGiIAArAyCgIgM5AyAgACADIASjOQMQIAJBEGokAAsnACAAIAAoAhhFIAAoAhAgAXJyIgE2AhAgACgCFCABcQRAEJMBAAsLMAEDfyAAKAIEIgQgAUEEaiICayEDIAIgBEcEQCABIAIgAxBSGgsgACABIANqNgIEC34BA38gACgCACIBQTRqIAEoAjghAyABKAI0IQEDQAJAIAEgA0YNACABKAIAIABGDQAgAUEEaiEBDAELCyABEPANIAAoAgQiAUEoaiABKAIsIQMgASgCKCEBA0ACQCABIANGDQAgASgCACAARg0AIAFBBGohAQwBCwsgARDwDQvqAQEIfyAAQfevAxDLAiECIAEoAgAhBiMAQRBrIgMkACADQQhqIgQgAhCxBRoCQCAELQAARQ0AIAIgAigCAEEMaygCAGoi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oCEMIANBAWohAyAAIAIQHCECDAALAAtB2N0KAnwCQCAAQdwaECYiA0UNACADLQAARQ0AQcDdCisDACADEKoCECIMAQsgDEEBIAcgB0EBTBu4oyAEt5+iRAAAAAAAAPA/oAsiDDkDAEGY3QooAgAgAXJFBEAgBCAEIAwQgwMhASAAKAIQIAE2AqABIAQgBEQAAAAAAADwPxCDAyEBIAAoAhAgATYCpAEgBEHM3QovAQBEAAAAAAAA8D8QgwMhASAAKAIQIAE2AqgBIARBACAEQQBKGyEBQczdCi8BACEIIARBAWoiCkEEEBkhB0EAIQMDQCABIANGRQRAIAcgA0ECdGogCkEEEBkiCTYCAEEAIQYDQCABIAZGRQRAIAkgBkECdGogCEEIEBkiCzYCAEEAIQIDQCACIAhGRQRAIAsgAkEDdGpCADcDACACQQFqIQIMAQsLIAZBAWohBgwBCwsgCSABQQJ0akEANgIAIANBAWohAwwBCwsgByABQQJ0akEANgIAIAAoAhAgBzYCrAELIAVBEGokACAECykBAX8jAEEQayICJAAgAiABNwMAIABBKUHxqwEgAhChARogAkEQaiQAC0sAIAAQNyAARwRAIABBwilBmAJBARA1GgsgACABRgRAIAAQNygCECABNgK8AQsgABB6IQADQCAABEAgACABEIoOIAAQeSEADAELCwuRAgEEfyABQcIpQZgCQQEQNRogASgCECICIAAoAhAiAykDEDcDECACIAMpAyg3AyggAiADKQMgNwMgIAIgAykDGDcDGCABKAIQIgIgACgCECIDLQCTAjoAkwIgAkEwaiADQTBqQcAAEB8aIAEoAhAgACgCECgCtAEiAjYCtAEgAkEBakEEEBkhAyABKAIQIAM2ArgBIAJBACACQQBKG0EBaiEFQQEhAgNAIAAoAhAhAyACIAVGRQRAIAJBAnQiBCADKAK4AWooAgAQkw4hAyABKAIQKAK4ASAEaiADNgIAIAAoAhAoArgBIARqKAIAIAMQiw4gAkEBaiECDAELCyABKAIQIAMoAgw2AgwgA0EANgIMC3MBAX8gACgCECgCwAEQGCAAKAIQKALIARAYIAAoAhAoAtABEBggACgCECgC2AEQGCAAKAIQKALgARAYIAAoAhAoAngQvQEgACgCECgCfBC9ASAAKAIQKAIIIgEEQCAAIAEo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ACACCzUBAX8CfwJAQazfCigCACIBRQ0AIAAgARBBIgFFDQAgAS0AAEUNAEEBIAEQa0UNARoLQQALCzsBAn8CQCAAKAIQIgIoAugBIgFFDQAgASgCECIBLQCQAg0AIAEoAowCIAIoAvQBQQJ0aigCACEACyAAC/IBAQZ/QQEhAQNAIAEgACgCECICKAK0AUpFBEAgAigCuAEgAUECdGooAgAQoQ4gAUEBaiEBDAELCyAAEBshAgNAIAIEQCACKAIQIgEoAugBRQRAIAEgADYC6AELIAAgAhAtIQMDQCADBEACQCADKAIQKAKwASIBRQ0AA0AgASABQTBrIgUgASgCAEEDcSIGQQJGGygCKCgCECIELQCsAUEBRw0BIAEgBSAEKALoAQR/IAYFIAQgADYC6AEgASgCAEEDcQtBAkYbKAIoKAIQKALIASgCACIBDQALCyAAIAMQMCEDDAELCyAAIAIQHCECDAELCwu1AwEIfyMAQRBrIgQkACAAEBshAQN/IAEEfyABKAIQIgYtALUBQQdGBH8gARCyCiABKAIQBSAGC0EANgLoASAAIAEQHCEBDAEFQQELCyEFA0ACQCAAKAIQIgEoArQBIAVOBEAgASgCuAEgBUECdGooAgAiAxAbIQEDQCABRQ0CIAMgARAcAkAgASgCEC0AtQEEQCABECAhAiAEIAAQIDYCBCAEIAI2AgBB1/cDIAQQKyADIAEQuAEMAQsgAygCECgCiAIhAiABEKYBIAFHBEBB4aADQfq9AUGTAUGnnQEQAAALIAEoAhAiByACNgLwASACKAIQIgIgAigC7AEgBygC7AFqNgLsASABKAIQIgJBBzoAtQEgAiADNgLoASADIAEQLSECA0AgAkUNAQJAIAIoAhAoArABIgFFDQADQCABIAFBMGsiByABKAIAQQNxQQJGGygCKCgCECIILQCsAUEBRw0BIAggAzYC6AEgASAHIAEoAgBBA3FBAkYbKAIoKAIQKALIASgCACIBDQALCyADIAIQMCECDAALAAshAQwACwALIARBEGokAA8LIAVBAWohBQwACwAL9wYBCX8gABCgDiEEIAEQoA4iBSgCECgC9AEiByAEKAIQKAL0ASIGSgRAAkAgBCACKAIQIggoArABIgNBMEEAIAMoAgBBA3EiCUEDRxtqKAIoRgRAIANBUEEAIAlBAkcbaigC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BCsDeKAiCiAIIApkGyEICyAEKALoASABKALoAUYEQCAHIAkgBCsDgAGgIgogByAKZBshBwsgAyAGciEDIAJBAWohAgwBCwsgABBhIQIgACgCECEBAkAgACACRg0AIAEoAgxFDQAgABA3QQEhAyAAKAIQIQEoAhAtAHRBAXENACAHIAErA1igIQcgCCABKwM4oCEICyABIAc5A4ABIAEgCDkDeCAAEGEgAEcEQCAFIAAoAhAiACgC6AFByABsaiIBIAErAxgiCSAHIAcgCWMbOQMYIAUgACgC7AFByABsaiIAIAArAxAiByAIIAcgCGQbOQMQCyADC3ABAn9BASEEA0AgBCAAKAIQIgMoArQBSkUEQCADKAK4ASAEQQJ0aigCACABIAIQrA4gBEEBaiEEDAELCyADIAEgAysDEKI5AxAgAyACIAMrAxiiOQMYIAMgASADKwMgojkDICADIAIgAysDKKI5AygL5QQCCH8EfEEBIQIDQCACIAAoAhAiAygCtAFKRQRAIAMoArgBIAJBAnRqKAIAIAEQrQ4gAkEBaiECDAELCyAAEGEhAiAAKAIQIQMCQCAAIAJGBEAgAygC7AEhBUQAAMD////fwSEKRAAAwP///99BIQsgAygC6AEiCCEEA0AgBCAFSgRAIAMoArQBIgBBACAAQQBKG0EBaiEAQQEhAgNAIAAgAkYNBCAKIAMoArgBIAJBAnRqKAIAKAIQIgQrAyBEAAAAAAAAIECgIgwgCiAMZBshCiALIAQrAxBEAAAAAAAAIMCgIgwgCyAMYxshCyACQQFqIQIMAAsABQJAIAMoAsQBIARByABsaiIAKAIAIgZFDQBBASECIAAoAgQiBygCACIARQ0AA0AgACgCECIALQCsASIJRSACIAZOckUEQCAHIAJBAnRqKAIAIQAgAkEBaiECDAELCyAJDQAgBkECayECIAArAxAgACsDWKEhDCAHIAZBAnRqQQRrIQADQCAAKAIAKAIQIgAtAKwBBEAgByACQQJ0aiEAIAJBAWshAgwBCwsgCiAAKwMQIAArA2CgIg0gCiANZBshCiALIAwgCyAMYxshCwsgBEEBaiEEDAELAAsACyADKALoASEIIAMoAuwBIQUgAygChAIoAhAoAvQBtyEKIAMoAoACKAIQKAL0AbchCwsgASgCECgCxAEiACAFQcgAbGooAgQoAgAoAhArAxghDCAAIAhByABsaigCBCgCACgCECsDGCENIAMgCjkDICADIAs5AxAgAyANIAMrA4ABoDkDKCADIAwgAysDeKE5AxgLogECAnwBfwJAAn9B/////wcgAEGOIRAmIgNFDQAaIAAQOCEAIAMQqgIhASAAQQBIDQFBACABRAAAAAAAAAAAYw0AGiAAuCECIAFEAAAAAAAA8D9kBEBB/////wdEAADA////30EgAaMgAmMNARoLIAEgAqIiAZlEAAAAAAAA4EFjBEAgAaoPC0GAgICAeAsPC0HimANB5oEBQcoAQa/dABAAAAuIAgIHfwF8IwBBEGsiBCQAIABB/N0KKAIAQQhBABBiIAAQ+wW3IQggACgCECIBKALoASEDIAEoAoQCIQUgASgCgAIhBgNAIAMgASgC7AFKRQRAAkAgA0HIAGwiByABKALEAWoiAigCAEUNACACKAIEKAIAIgJFBEAgABAgIQEgBCADNgIEIAQgATYCAEHbuAQgBBA2DAELIAYgAiACKAIQKwNYIAigIAErA2CgQQAQowEaIAAoAhAiASgCxAEgB2oiAigCBCACKAIAQQJ0akEEaygCACICIAUgAigCECsDYCAIoCABKwNAoEEAEKMBGgsgA0EBaiEDIAAoAhAhAQwBCwsgBEEQaiQAC9sCAgp/AXwgAEH83QooAgBBCEEAEGIhB0EBIQEDQCAAKAIQIgUoArQBIgQgAUgEQCAHtyELQQEhAQNAIAEgBEpFBEAgAUECdCEJIAFBAWoiByEBA0AgBSgCuAEiAiAJaigCACEDIAEgBEpFBEAgAiABQQJ0aigCACIGIAMgAygCECgC6AEgBigCECgC6AFKIgIbIggoAhAiCigC7AEgAyAGIAIbIgMoAhAiBigC6AEiAk4EQCAIIAMgAkHIAGwiAiAKKALEAWooAgQoAgAoAhAoAvgBIAYoAsQBIAJqKAIEKAIAKAIQKAL4AUgiAhsoAhAoAoQCIAMgCCACGygCECgCgAIgC0EAEKMBGiAAKAIQIgUoArQBIQQLIAFBAWohAQwBCwsgAxCwDiAAKAIQIgUoArQBIQQgByEBDAELCwUgBSgCuAEgAUECdGooAgAQ+wUgAUEBaiEBDAELCwucAQIDfwF8IABB/N0KKAIAQQhBABBiIAAQ+wW3IQRBASEBA0AgASAAKAIQIgIoArQBSkUEQCACKAK4ASABQQJ0aigCACICEPsFIAAoAhAiAygCgAIgAigCECgCgAIgAysDYCAEoEEAEKMBGiACKAIQKAKEAiAAKAIQIgMoAoQCIAMrA0AgBKBBABCjARogAhCxDiABQQFqIQEMAQsLC3UBAX8jAEEgayICJABBmPIJQYzyCSkCADcCACACIAE2AhQgARA7IQEgAkEANgIcIAIgATYCGCACQZTyCTYCECACQfjwCTYCDAJ/IAAEQCAAIAJBFGogAkEMahD1DgwBCyACQRRqIAJBDGoQsAgLIAJBIGokAAulAwIHfwF8IABB/N0KKAIAQQhBABBityEIIAAoAhAiASgC6AEhBEEBIQUDQCABKALsASAESARAA0ACQCAFIAEoArQBSg0AIAEoArgBIAVBAnRqKAIAELMOIAVBAWohBSAAKAIQIQEMAQsLBQJAIARByABsIgYgASgCxAFqIgEoAgBFDQAgASgCBCgCACIHRQ0AIAcoAhAoAvgBIQECQAJAA0AgAUEATA0CIAAQYSgCECgCxAEgBmooAgQgAUEBayIBQQJ0aigCACICKAIQIgMtAKwBRQ0BIAAgAhCpDkUNAAsgAigCECEDCyACIAAoAhAoAoACIAMrA2AgCKBBABCjARoLIAAoAhAoAsQBIAZqKAIAIAcoAhAoAvgBaiEBAkADQCABIAAQYSgCECgCxAEgBmooAgBODQIgABBhKAIQKALEASAGaigCBCABQQJ0aigCACICKAIQIgMtAKwBRQ0BIAFBAWohASAAIAIQqQ5FDQALIAIoAhAhAwsgACgCECgChAIgAiADKwNYIAigQQAQowEaCyAEQQFqIQQgACgCECEBDAELCwuaAQECfwJAIAAQYSAARg0AIAAQrw4gACgCECIBKAKAAiABKAKEAhCyAyIBBEAgASgCECIBIAEoApwBQYABajYCnAEMAQsgACgCECIBKAKAAiABKAKEAkQAAAAAAADwP0GAARCjARoLQQEhAQNAIAEgACgCECICKAK0AUpFBEAgAigCuAEgAUECdGooAgAQtA4gAUEBaiEBDAELCwvFBwIKfwN8IAAoAhAiASgC6AEhCSABKALEASEEA0AgCSABKALsAUpFBEAgBCAJQcgAbGohBUEAIQIDQCAFKAIAIAJKBEAgBSgCBCACQQJ0aigCACIKKAIQIgYr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G6AiEZlEAAAAAAAA4EFjBEAgEaoMAQtBgICAgHgLt6AiESARIBRjGyIRmUQAAAAAAADgQWMEQCARqgwBC0GAgICAeAsiByAHIAlIGzYCrAEgAyADKAKcASIDIAEoApwBIgEgASADSBs2ApwBDAELIAEoAhAiASgCYA0AIAkgAyAHtyABKAKcARCjARoLIAVBAWohBQwACwALAAsLIAFBwAFqIQEDQCABKAIAIgQEQEEAIQMCQCAEKAIQIgUoApACIgFFDQADQCABIANBAnRqKAIAIgFFDQEgABC0AiICKAIQQQI6AKwBIAIgASABQTBqIgYgASgCAEEDcUEDRhsoAigCfyABKAIQIgUrAzggBSsDEKEiEZlEAAAAAAAA4EFjBEAgEaoMAQtBgICAgHgLIghBACAIQQBKIgcbIglBAWq4IAUoApwBEKMBGiACIAEgAUEwayIFIAEoAgBBA3FBAkYbKAIoQQBBACAIayAHGyIIQQFquCABKAIQKAKcARCjARogAigCECABIAYgASgCAEEDcSICQQNGGygCKCgCECgC9AEgCUF/c2oiBiABIAUgAkECRhsoAigoAhAoAvQBIAhBf3NqIgEgASAGShs2AvQBIANBAWohAyAEKAIQIgUoApACIQEMAAsACyAFQbgBaiEBDAELCwJAIAAoAhAiASgCtAFBAEoEfyAAELQOIAAQsw4gABCxDiAAELAOIAAoAhAFIAELKAIIIgEoAlRBA0cNACABKwNAIhEgASsDSCISokQAAAAAAADwP2UNACAAEK8OIAAoAhAiASgCgAIgASgChAIgEiARIAEoAnRBAXEbIhFEAAAAAOD/70AgEUQAAAAA4P/vQGMbQegHEKMBGgsCQCAAQQIgABCuDhDOBEUNACAAKAIQIgMoAugBIQUDQAJAAkAgAygC7AEiCyAFTgRAQQAhByADKALEASAFQcgAbGoiCCgCACIJQQAgCUEAShshAkEAIQEDQCABIAJGDQNBACEEAkAgCCgCBCABQQJ0aigCACIHKAIQIgooApACIgxFDQADQCAMIARBAnRqKAIAIgZFDQEgBkFQQQAgBigCAEEDcSINQQJHG2ooAigoAhAoAvQBIAVKDQQgBEEBaiEEIAZBMEEAIA1BA0cbaigCKCgCECgC9AEgBUwNAAsMAwtBACEEAkAgCigCiAIiCkUNAANA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CigCACEmQcTeCigCACEgQbjeCigCACFAQbTeCigCACFBQbzeCigCACFCQbDeCigCACFDQaTeCigCACFEQaDeCigCACFFQZzeCigCACFGQZjeCigCACFHQZTeCigCACFIQazeCigCACFJQYjeCigCACFKQYTeCigCACFLQYDeCigCACFMQZTfCigCACFNQcjfCigCACFOQeDfCigCACFPQczfCigCACFQQdDfCigCACFRQdTfCigCACFSQbjfCigCACFTQZDfCigCACFUQcTfCigCACFVQeTfCigCACFWQYTfCigCACFXQYjfCigCACFYQYzfCigCACFZQfjeCigCACFaQfTeCigCACFbQcDfCigCACFcQbzfCigCACFdQZjfCigCACFeQazfCigCACFfQazfCkEANgIAQZjfCiAHQQJBkjtBABAhNgIAQbzfCiAHQQJB9LQBQQAQITYCAEHA3wogB0ECQdfyAEEAECE2AgBB9N4KIAdBAkG1IUEAECEiAzYCACADRQRAQfTeCiAHQQJBtSFB74YFECE2AgALQQAhBkGM3wpBADYCAEH43gpBADYCAEGI3wogB0ECQZ6dAUEAECE2AgBBhN8KIAdBAkHtjAFBABAhNgIAQeTfCiAHQQJBmt4AQQAQITYCAEHE3wpBADYCAEGQ3wogB0ECQaD0AEEAECE2AgBBuN8KIAdBAkGcKEEAECE2AgBB1N8KQQA2AgBB0N8KIAdBAkGZnQFBABAhNgIAQczfCiAHQQJB6IwBQQAQITYCAEHg3wogB0ECQZHeAEEAECE2AgBByN8KQQA2AgBBlN8KQQA2AgBBgN4KIAdBAUG9IUEAECE2AgBBhN4KIAdBAUG4/ABBABAhNgIAQYjeCiAHQQFBjJsBQQAQITYCAEGs3gpBADYCAEGU3gogB0EBQe2MAUEAECE2AgBBmN4KIAdBAUGenQFBABAhNgIAQZzeCkEANgIAQaDeCiAHQQFBoPQAQQAQITYCAEGk3gpBADYCAEGw3gpBADYCAEG83gogB0EBQYSFAUEAECE2AgBBtN4KIAdBAUGQNUEAECE2AgBBuN4KIAdBAUHPM0EAECE2AgBBxN4KIAdBAUH2FkEAECE2AgBBwN4KIAdBAUHl5gBBABAhNgIAQcjeCiAHQQFB7uUAQQAQITYCAEHM3gogB0EBQfmsAUEAECE2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BUEwaiIBELcIIgxCAFMEQCABEIUGQX8hAgwDBSAEQQFqIQQgCyAMfCELIAAoAhAhAwwCCwALCwJAIAZBAU0EQCADKALoASEEDAELIAMoAtgBIQdBACEBA0AgBiAIRgRAIANBATYC3AEgAyAHKAIANgLAASADQcCACygCACIENgLoASADQcSACygCADYC7AEMAgsgByAIQQJ0aigCACECIAEEQCABKAIQIAI2ArgBCyACKAIQIAE2ArwBA0AgAiIBKAIQKAK4ASICDQALIAhBAWohCAwACwALQbj4CCgCACEKQQEhCQJAA0ACQCADKALsASAESARAA0AgCSADKAK0ASIBSg0CIAMoArgBIAlBAnRqKAIAIAVBMGoQhQ8iDEIAUw0EIAlBAWohCSALIAx8IQsgACgCECEDDAALAAsgBEHIAGwiCCADKALEAWoiAiACKAIIIgE2AgAgAiACKAIMIgY2AgRBACECIAFBACABQQBKGyEHA0ACQCACIAdHBEAgBiACQQJ0aigCACIBDQFBjN0KLQAABEAgABAgIQEgBSAAKAIQKALEASAIaigCADYCLCAFIAI2AiggBSAENgIkIAUgATYCICAKQbLzAyAFQSBqEB4aIAAoAhAhAwsgAygCxAEgCGogAjYCAAsgBEEBaiEEDAMLIAEoAhAgAjYC+AEgAkEBaiECDAALAAsLAkAgAUEATA0AIABBtCwQJiIBBEAgARBrRQ0BCyAAEKUIQayAC0EBOgAAIABBAiAFQTBqIgEQtwgiC0IAWQ0AIAEQhQZBfyECDAILIAVBMGoQhQZBvIALKAIAIgEEQCABEBhBvIALQQA2AgALQbSACygCACIBBEAgARAYQbSAC0EANgIAC0EBIQIDQCAAKAIQIgQoArQBIAJOBEAgBCgCuAEgAkECdGooAgAQtgggAkEBaiECDAELCyAEKALoASEJA0BBACEGIAQoAuwBIAlOBEADQCAEKALEASAJQcgAbGoiASgCACAGSgRAIAEoAgQgBkECdGooAgAiBygCECIBIAY2AvgBQQAhAiABKALQASIIBEADQCAIIAJBAnRqKAIAIgEEQCABKAIQLQBwQQRGBH8gARDBCCABKAIQEBggARAYIAcoAhAoAtABIQggAkEBawUgAgtBAWohAgwBCwsgACgCECEECyAGQQFqIQYMAQsLIAEoAkAi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ASACQTBBACACKAIAQQNxQQNHG2ooAigiARCmASABRgRAIAIQwAggAygCECEBDAELC0H2rANBx8ABQYUDQfszEAAACyAAQQAQvghBACEBA0AgACgCECICKALcASABSwRAIAIgAigC2AEgAUECdGooAgAiAjYCwAEgAiEDA0AgAwRAIAMoAhAiA0EANgKwASADKAK4ASEDDAELCwNAIAIEQCACEJsPIAIoAhAoArgBIQIMAQsLIAFBAWohAQwBCwsCQCAAKAIQIgIoAuQBRQRAIAIoAuABRQ0BCyAAEBshAUEAIQMDQCABBEACQCABEKYBIAFHDQACQCABKAIQIgIoAswBDQAgACgCECgC5AEiBEUgASAERnINACABIARBABDjASIDKAIQIgJBADYCnAEgAiAKNgKsASABKAIQIQILIAIoAsQBDQAgACgCECgC4AEiAkUgASACRnINACACIAFBABDjASIDKAIQIgJBADYCnAEgAiAFNgKsAQsgACABEBwhAQwBCwsgA0UNACAAQQAQvggLIAAiBEHq7wIQJiIABH8gBBA4IAAQqgIQ+gMFQf////8HCyEDQQAhAANAIAAgBCgCECICKALcAUkEQCACIAIoAtgBIABBAnRqKAIANgLAASAEIAIoArQBRSADEM4EGiAAQQFqIQAMAQsLIAQQGyEBIAQoAhAhAAJAIAEEQCAAQv////93NwPoAQNAIAEEQAJAIAEgARCmASIARgRAIAEoAhAiAygC9AEhAgwBCyABKAIQIgMgAygC9AEgACgCECgC9AFqIgI2AvQBCyACIAQoAhAiACgC7AFKBEAgACACNgLsAQsgAiAAKALoAUgEQCAAIAI2AugBCyADLQC1ASIARSAAQQZGckUEQCABELIKCyAEIAEQHCEBDAELCyAEEGEgBEcNAUG43QooAgBB5ABGBEBBASEBA0AgASAEKAIQIgAoArQBSg0DIAAoArgBIAFBAnRqKAIAEI0PIAFBAWohAQwACwALIAQQYRB6IQEDQCABRQ0CIAEoAhAtAJICQQdGBEAgBCABEIwPCyABEHkhAQwACwALIABCADcD6AELIAZCADcDCCAGQgA3AwBBACECA38gBCgCECIAKALcASACTQR/IAQQGwUgACAAKALYASACQQJ0aigCACIBNgLAAQNAIAEEQCABKAIQQcABakEAEIsPIAEoAhBByAFqIAYQiw8gASgCECIAQQA2ArABIAAoArgBIQEMAQsLIAJBAWohAgwBCwshAwNAAkAgAwRAIAQgAxAtIQEDQCABRQ0CAkAgASgCECIAKAKwASICRQ0AIAEgAigCECgCeEYNACAAQQA2ArABCyAEIAEQMCEBDAALAAsgBBAbIQUDQCAFBEAgBCAFEC0hAQNAIAEEQAJAIAEoAhAoArABIgBFDQAgACgCECgCeCABRw0AIAYgABBnIAEoAhBBADYCsAELIAQgARAwIQEMAQsLIAQgBRAcIQUMAQsLIAYoAgwhAyAGKAIEIQoCQAJAA0AgCgRAIANFDQIgBigCACgCACECIAMhAQNAIAEEQCAGKAIAIAFBAWsiAUECdGoiBSgCACAFIAI2AgAhAgwBBSAKQQFrIQoMAwsACwALCyAGQQA2AgQgBigCCCIAIANLDQEgAARAIAYoAgAgAEEEQaIDEJQBC0EAIQFBACEDQQAhAgNAAkAgBigCCCIFIAJNBEADQCABIAVPDQIgBiABEIoPGiABQQFqIQEgBigCCCEFDAALAAsgAyAGIAIQig8iAEcEQCAAKAIQEBggABAYCyACQQFqIQIgACEDDAELCyAGQgA3AgQgBigCABAYIAZCADcDCCAGQgA3AwAgBCgCECgC2AEQGCAEKAIQQgA3A9gBIAZBEGokAA8LQeeVA0HHwAFBJkHbtwEQAAALQbSjA0HHwAFBJkHbtwEQAAALIAQgAxAcIQMMAAsAC6kBAQJ/IwBBEGsiBCQAAkACQAJAIAAgASACQQBBABBeIgUNACAAIAIgAUEAQQAQXiIFDQAgACABIAJBAEEBEF4iBUUNAQsgAygCECICKAKsASEBIAUoAhAiACAAKAKcASACKAKcAWo2ApwBIAAgACgCrAEiACABIAAgAUobNgKsAQwBCyABECAhACAEIAIQIDYCBCAEIAA2AgBBsoEEIAQQNgsgBEEQaiQACw0BAX8gACgCICAAEBgLmgMBAn8CQCAAEBtFDQAgABDFAQRAAkAgAQRAIAEoAhAoAswBIQIgACgCECIDIAE2AsgBIAMgAkEBajYCzAEgASAAEIcGIAEgABCJDwwBCyAAKAIQQQA2AswBCyAAIQELIAAQeiECA0AgAgRAIAIgARCVDyACEHkhAgwBCwsCQCAAEMUBRQ0AIAAQGyECA0AgAkUNASACKAIQIgMoAugBRQRAIAMgADYC6AELIAAgAhAcIQIMAAsACwJAIABBhPgAECYiAkUNACACLQAARQ0AAkACQCACQa/oABBJRQ0AIAJBh6UBEElFDQAgAkHFExBJRQ0BIAJB7/YAEElFDQEgAkGUnQEQSQ0CIAAQhgYaDAILIAAQhgYgAUUNASABKAIQKALQARC6CCECIAEoAhAgAjYC0AEMAQsgABCGBiABRQ0AIAEoAhAoAtQBELoIIQIgASgCECACNgLUAQsgABDFAUUNACAAKAIQIgEoAtABIgJFDQAgAiABKALUAUcNACAAEIYGIQEgACgCECIAIAE2AtQBIAAgATYC0AELC28BA38gACgCEC0AcUEBcQRAIAAQGyEBA0AgAQRAIAAgARAtIQIDQCACBEAgAigCECIDIAMoAqwBQQF0NgKsASAAIAIQMCECDAELCyAAIAEQHCEBDAELCyAAKAIQIgAgACgC/AFBAWpBAm02AvwBCwvxEQEQfyMAQZABayIKJAACQAJAIABByvcAECYQawRAIAAoAhAiAiACLwGIAUEQcjsBiAFBpIALQQA2AgAgCkHU8gkoAgA2AhxBvyogCkEcakEAEOIBIgNB/roBQZgCQQEQNRojAEEQayIFJABBAUEMEEMiAUUEQCAFQQw2AgBBuPgIKAIAQc/uAyAFEB4aECcACyABQfzRCjYCBCABQcjSCjYCACABIAMoAkwiAigCKDYCCCACIAE2AiggBUEQaiQAIAAQlg8gAEHq7wIQJiICBH8gABA4IAIQqgIQ+gMFQf////8HCyEQIABBABCVD0GkgAtBADYCACAAEBshAQNAIAEEQCABEIICIAFGBEAgAyABECAQzAQhAiABKAIQIAI2AqQBCyAAIAEQHCEBDAELCyAAEBshAQNAIAEEQCABKAIQKAKkAUUEQCABEIICIQIgASgCECACKAIQKAKkATYCpAELIAAgARAcIQEMAQsLIAAQGyELA0AgC0UNAiALKAIQKAKkASEFIAAgCxAtIQYDQAJAAkACQCAGBEACQEGs3wooAgAiAkUNACAGIAIQQSICRQ0AIAItAABFDQAgAhBrRQ0ECyAFIAYgBkEwayIOIAYoAgBBA3FBAkYbKAIoEIICKAIQKAKkASICRg0DIAYgDiAGKAIAQQNxIgRBAkYiARsoAigoAhAoAugBIQ0gBkEwQQAgBEEDRxtqKAIoIgcoAhAoAugBIgwhCCAGQQBBUCABG2ooAigoAhAoAugBIg8hAQJAAkAgDCAPRg0AA0AgASAIRwRAIAgoAhAiCSgCzAEgASgCECIEKALMAU4EQCAJKALIASEIBSAEKALIASEBCwwBCwsgCCAMRg0AIAggD0cNAQsCQCAMBEAgBxCCAiAMKAIQKALUAUYNAQsgDUUNAyAGIA4gBigCAEEDcUECRhsoAigQggIgDSgCECgC0AFHDQMLIAUhASACIQUMAwsCQCAMEL0IRQRAIA0QvQhFDQELIAMgBRC5AiEBA0AgAQRAIAMgAUEwQQAgASgCAEEDcUEDRxtqKAIoEC0iBARAIARBUEEAIAQoAgBBA3FBAkcbaigCKCACRg0HCyADIAEQjwMhAQwBCwtBqIALQaiACygCACIBQQFqNgIAIAogATYCECAKQSBqIgFB5ABBnLUBIApBEGoQoQEaIAMgAyABEMwEIgEgBUEAQQEQXiADIAEgAkEAQQEQXiEBKAIQIgQgBCgCrAEiAkEAIAJBAEobNgKsASAEIAQoApwBIAYoAhAiBCgCnAFB6AdsajYCnAEgASgCECIJIAkoAqwBIgEgBCgCrAEiAiABIAJKGzYCrAEgCSAJKAKcASAEKAKcAWo2ApwBDAQLIAMgBSACIAYQkw8MAwsgACALEBwhCwwECyACIQELIAMgBSABIAYQkw8LIAAgBhAwIQYMAAsACwALIAAQkg8MAQsgACADQQBBABCRDyADEBshAQNAIAEEQCABKAIQIgJBADoAtAEgAkEANgKwASADIAEQHCEBDAELCyADEBshAQNAIAEEQCADIAEQkA8gAyABEBwhAQwBCwsgAxAbIQEDQCABBEAgASgCEEEANgKQASADIAEQHCEBDAELC0EAIQkgAxAbIQEDQCABBEAgASgCECgCkAFFBEAgAyABIAlBAWoiCRC8CAsgAyABEBwhAQwBCwsCQCAJQQJIDQAgA0HvHBDMBCECIAMQGyEBQQEhCANAIAFFDQEgCCABKAIQKAKQAUYEQCADIAIgAUEAQQEQXhogCEEBaiEICyADIAEQHCEBDAALAAsgAxAbIQcDQCAHBEAgAyAHEC0hAQNAIAEEQCAHKAIQIgIoAsgBIAIoAswBIgJBAWogAkECahDPASEFIAcoAhAiAiAFNgLIASACIAIoAswBIgJBAWo2AswBIAUgAkECdGogATYCACAHKAIQIgIoAsgBIAIoAswBQQJ0akEANgIAIAEgAUEwayIEIAEoAgBBA3FBAkYbKAIoKAIQIgIoAsABIAIoAsQBIgJBAWogAkECahDPASECIAEgBCABKAIAQQNxQQJGGygCKCgCECACNgLAASABIAQgASgCAEEDcUECRhsoAigoAhAiBSAFKALEASICQQFqNgLEASAFKALAASACQQJ0aiABNgIAIAEgBCABKAIAQQNxQQJGGygCKCgCECICKALAASACKALEAUECdGpBADYCACADIAEQMCEBDAELCyADIAcQHCEHDAELCyADQQEgECAAQfaMARAmIgIEfyACEIwCBUF/CxCrDxogACgCEEL/////dzcD6AFBACEHAkAgCUECSA0AIAlBAWoiAhC7CCEHQQEhAQNAIAEgAkYNASAHIAFBAnRqQf////8HNgIAIAFBAWohAQwACwALIAAQGyEIA0AgCARAIAgQggIhAiAIKAIQIgUgAigCECgCpAEoAhAiAigC9AEiBDYC9AEgBCAAKAIQIgEoAuwBSgRAIAEgBDYC7AELIAQgASgC6AFIBEAgASAENgLoAQsgBwRAIAUgAigCkAEiAjYCkAEgByACQQJ0aiICIAIoAgAiAiAEIAIgBEgbNgIACyAAIAgQHCEIDAELCwJAIAcEQCAAEBshAQNAIAEEQCABKAIQIgIgAigC9AEgByACKAKQAUECdGooAgBrNgL0ASAAIAEQHCEBDAEFQQEhBgwDCwALAAtBACEGIAAoAhAoAugBIgVBAEwNACAAEBshAQNAIAEEQCABKAIQIgIgAigC9AEgBWs2AvQBIAAgARAcIQEMAQsLIAAoAhAiAiACKALoASAFazYC6AEgAiACKALsASAFazYC7AELIAAgBhCPDyADEBshAQNAIAEEQCABKAIQKALAARAYIAEoAhAoAsgBEBggAyABEBwhAQwBCwsgABAbKAIQKAKAARAYIAAQGyEBA0AgAQRAIAEoAhBBADYCgAEgACABEBwhAQwBCwsgBxAYIAMQugELQYzdCi0AAARAIAogACgCECkD6AFCIIk3AwBBuPgIKAIAQZPLBCAKEB4aCyAKQZABaiQAC44BAQR/IAAoAhBC/////3c3A+gBIAAQGyEDA0ACQCAAKAIQIQEgA0UNACADKAIQKAL0ASIEIAEoAuwBSgRAIAEgBDYC7AELIAQgASgC6AFIBEAgASAENgLoAQsgAyEBIAIEQCABIAIgBCACKAIQKAL0AUgbIQELIAAgAxAcIQMgASECDAELCyABIAI2AogCC6gCAQd/IwBBEGsiByQAIAEoAhBBnIALKAIAQQFqNgKwAQJAAkAgACgCCCIFIAAoAgwiAkcEQCAAKAIAIQMgACgCBCEEDAELIAVBAXRBASAFGyICQf////8DSwRAQcQAIQAMAgsgACgCACACQQJ0EDkiA0UEQEEwIQAMAgsgAyAAKAIMIgZBAnRqQQAgAiAGa0ECdBAzGiAGIAAoAggiBSAAKAIEIgRqSQRAIARBAnQhCCADIAIgBiAEayIGayIEQQJ0aiADIAhqIAZBAnQQUhogACAENgIECyAAIAI2AgwgACADNgIACyADIAQgBWogAnBBAnRqIAE2AgAgACAFQQFqNgIIIAdBEGokAA8LIAcgABBzNgIAQbj4CCgCAEHhhQQgBxAeGhAnAAsSACAAIAFB3SVBO0GAvwEQxgELlAEBBH8gACgCECIBKAKwAUUEQCABQQE6ALQBIAFBATYCsAEDQCABKALIASACQQJ0aigCACIDBEACQCADQVBBACADKAIAQQNxQQJHG2ooAigiASgCECIELQC0AQRAIAMQwAggAkEBayECDAELIAQoArABDQAgARCbDwsgAkEBaiECIAAoAhAhAQwBCwsgAUEAOgC0AQsLnAEBBX8gAEEwQQAgACgCAEEDcUEDRxtqKAIoKAIQIgIoAuABIQQgAigC5AEhAwJAA0AgASADRwRAIAFBAnQhBSABQQFqIQEgACAEIAVqKAIARw0BDAILCyACIAQgA0EBaiADQQJqEM8BIgE2AuABIAIgAigC5AEiAkEBaiIDNgLkASABIAJBAnRqIAA2AgAgASADQQJ0akEANgIACwvwAgEDfyAAIABBMGoiAiAAKAIAQQNxQQNGGygCKCgCECIBKALIASABKALMASIBQQFqIAFBAmoQzwEhASAAIAIgACgCAEEDcUEDRhsoAigoAhAgATYCyAEgACACIAAoAgBBA3FBA0YbKAIoKAIQIgEgASgCzAEiA0EBajYCzAEgASgCyAEgA0ECdGogADYCACAAIAIgACgCAEEDcUEDRhsoAigoAhAiAigCyAEgAigCzAFBAnRqQQA2AgAgACAAQTBrIgIgACgCAEEDcUECRhsoAigoAhAiASgCwAEgASgCxAEiAUEBaiABQQJqEM8BIQEgACACIAAoAgBBA3FBAkYbKAIoKAIQIAE2AsABIAAgAiAAKAIAQQNxQQJGGygCKCgCECIBIAEoAsQBIgNBAWo2AsQBIAEoAsABIANBAnRqIAA2AgAgACACIAAoAgBBA3FBAkYbKAIoKAIQIgIoAsABIAIoAsQBQQJ0akEANgIAIAALQgECfyMAQRBrIgIkACABKAIQIQMgAiAAKAIQKQLQATcDCCACIAMpAtgBNwMAIAAgAkEIaiABIAIQnw8gAkEQaiQAC60BAQN/AkACQCABKAIEIgVFDQAgAygCBCIGRQ0AIAUgBk8EQCADKAIAIQJBACEBA0AgAiABQQJ0aigCACIERQ0DIAFBAWohASAEQTBBACAEKAIAQQNxQQNHG2ooAiggAEcNAAsMAQsgASgCACEAQQAhAQNAIAAgAUECdGooAgAiBEUNAiABQQFqIQEgBEFQQQAgBCgCAEEDcUECRxtqKAIoIAJHDQALCyAEDwtBAAsVACAAIAEgAkHPJUGQCUH1vQEQ0woLqgIBB38jAEEQayIEJAAgACgCACIDKAIQIQUgAygCCCEGIAIEQBD/DgsgBUEYaiICIQADQCAAKAIAIgAEQCAAKAIIRQRAEP8OCyAAQQxqIQAMAQsLIAFBggJrIgFBA0kEQCADIAEQ1wggAiEAA0AgACgCACIABEACQCAAKAIAQYsCRg0AAkAgACgCBCIDLQAVBEAgBSgCACAGRg0BCyAAKAIIEHcgACgCCCEDIAUoAgAhByAAKAIEKAIIIQgEQCAHIAEgCCADEOoDIQMMAQsgByABIAggAxAhIQMLIAUoAgAgBkcNACADQQE6ABYLIABBDGohAAwBCwsgBiACELUCIARBEGokAA8LIARB9gI2AgQgBEHuETYCAEG4+AgoAgBB2MMEIAQQHhoQaQAL2QEBBH8gAEEwQQAgACgCAEEDcSIFQQNHG2ooAigiBiEDAn8CQCABIAZGBH8gAEFQQQAgBUECRxtqKAIoBSADCygCECgCsAIiAyABKAIQIgQoAqwCTgRAIAMgBCgCsAJMDQELIAAoAhAoApwBIQNBAAwBC0EAIQMgACgCECIEKAKkAUEATgR/IAQoAqABBUEACyAEKAKcAWshA0EBCyEEQQAgA2sgA0EBQX8gAkEATAR/IAEgBkYFIABBUEEAIAVBAkcbaigCKCABRgsbIgBBACAAayAEG0EASBsLVQECfyAAKAIEEBggAEIANwIEIABBDGohAgNAIAEgACgCFE9FBEAgAiABEPsDGiABQQFqIQEMAQsLIABCADcCECAAKAIMEBggAkIANwIIIAJCADcCAAucAQEEf0GAgICAeCECQf////8HIQEgACgCACgCEEHAAWoiAyEAA0AgACgCACIABEAgACgCECIELQCsAUUEQCACIAQoAvQBIgAgACACSBshAiABIAAgACABShshAQsgBEG4AWohAAwBBQNAAkAgAygCACIARQ0AIAAoAhAiACAAKAL0ASABazYC9AEgAEG4AWohAwwBCwsLCyACIAFrC5cBAQJ/A0ACQAJAIAEoAhAiAigCrAJBf0YNACACQX82AqwCIAIoAqgCIgNFDQAgAigCsAIgACgCECgCsAJIDQEgACABRg0AQa3VBEEAEDYLDwsgA0EwQQAgAygCAEEDcSIBQQNHG2ooAigiAiADQVBBACABQQJHG2ooAigiASACKAIQKAKwAiABKAIQKAKwAkobIQEMAAsAC7YBAQN/QQAgAmshBiABKAIQKAKwAiEFA0ACQCAFIAAoAhAiASgCrAJOBEAgBSABKAKwAkwNAQsgASgCqAIiASgCECIEIAQoAqABIAYgAiADIAAgASABQTBqIgQgASgCAEEDcUEDRhsoAihHRhtqNgKgASABIAQgASgCAEEDcSIAQQNGGygCKCIEIAFBUEEAIABBAkcbaigCKCIAIAQoAhAoArACIAAoAhAoArACShshAAwBCwsgAAuXAQEDfyABQVBBACABKAIAQQNxIgJBAkcbaigCKCIEKAIQKAKwAiEDIAFBMEEAIAJBA0cbaigCKCIBKAIQKAKwAiECIABB/////wc2AjggAEEANgIsIAAgASAEIAIgA0giAhsoAhAiAygCrAI2AjAgACADKAKwAjYCNAJAIAJFBEAgACAEEMUIDAELIAAgARDECAsgACgCLAtUAQJ/IwBBIGsiAiQAA0AgASAAKAIIT0UEQCACQQxqIAAgARCgDyABQQFqIQEMAQsLIABCADcCBCAAKAIAEBggAEIANwII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ogI2AggPCyABQdbRARAuRQRAIABBAEEgENkCIQEgACgCQCABNgIAIABBpwI2AggPCyABQaHQARAuRQRAIABBAEEEENkCIQEgACgCQCABNgIAIABBowI2AggPCyABQY3TARAuRQRAIABBAEHAABDZAiEBIAAoAkAgATYCACAAQaQCNgIIDwsgAUHK2QEQLkUEQCAAQQBBAhDZAiEBIAAoAkAgATYCACAAQaECNgIIDwsgAUGF0wEQLkUEQCAAQQBBCBDZAiEBIAAoAkAgATYCACAAQaUCNgIIDwsgAUH53gEQLkUEQCAAQQBBEBDZAiEBIAAoAkAgATYCACAAQaYCNgIIDwsgAUH00gEQLkUEQCAAKAJAQQA2AgAgACAAKAJAQcigCkEBIAJBreABEI8EIABBmwI2AggPCyABQZfSARAuRQRAIABBlQI2AggPCyABQdjRARAuRQRAIABBmAI2AggPCyABQejaARAuRQRAIABBKBBUIgFB0KAKQQIgAkHB4AEQjwQgACgCQCABNgIAIABBnQI2AggPCyABQfrTARAuRQRAIABBhgI2AggPCyAAIAEQxgkLhgEBAn8jAEEQayIEJAAgBCABNgIMAkAgACAAKAKcASAEQQxqIAIgAyAALQD8A0VBABDKCSIBDQBBACEBIAQoAgwiBUUNACAAKAL0AwRAIABB3QE2AqACIAAgBSACIAMQyQkhAQwBCyAAQdYBNgKgAiAAIAUgAiADEM4GIQELIARBEGokACABC44DAQN/IwBBEGsiAiQAAkACQCAAKAK0AiIERQRAQRchAwwBCyAEKAIMIgEtACEEQCABKAIIIAIgASgCBCIGIAEoAgxqIgM2AgwgBmohBQJ/IAEtACIEQCAAKALsASIEIAMgBSACQQxqIgYgBCgCABEGACEEIAAgACgC7AEgAyAFIAQgAigCDCAGQQBBAEEBEOEJDAELIAAgBCgCECAAKALsASADIAUgAkEMakEAQQEQyAYLIgMNAQJAIAUgAigCDCIDRg0AAkACQCAAKAL4A0EBaw4DAAIBAgsgAC0AwARFDQELIAEgAyABKAIEazYCDEEAIQMMAgtBACEDIAFBADoAISAAQQE6AMAEDAELIAAgAUHQLxCSAyAAKAK0AiAERw0BQQAhAyABQQA6ACAgACAAKAK0AigCCDYCtAIgBCAAKAK4AjYC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EqIgDiAQoqEgEaFEAAAAAAAAAABmRg0BCyABQQFrIQpBASEGAkADQCABIAZGDQEgBkEBaiEGIA0gByAIAn8gCUUEQCACIgNBAWogAXAMAQsgBCAKaiABcCEDIAQLIgJqQQR0aiILKwAAIAcgCCADIgRqQQR0aiIDKwAAIhChIg+iIAsrAAggAysACCISoSIOIAyioSASIA+iIA4gEKKhIhChRAAAAAAAAAAAZiAPRAAAAAAAAAAAoiAORAAAAAAAAAAAoqEgEKFEAAAAAAAAAABmRg0ACyAAIAQ2AhxBACEGDAELIAAgBDYCHEEBIQYLIAVBMGokACAGC+QCAQN/IwBBkAFrIgQkAAJAIAItAABFBEAgAEHA+QdBKBAfGgwBCyAEQQ86AGcCQAJAIAEoAhAiBSgCeC0AUkEBRgRAAn8CQCACRQ0AIAItAABFDQACQCABKAIQKAJ4KAJIIgUoAgRBAkYNACAFKAIAIAIQqwkiBUUNACAEIAUtACM6AGcgBUEwaiEGCyAGDAELQZCvA0GqwgFBkwdBoBwQAAALIgYNASABKAIQIQULIARBGGoiBkEAQcgAEDMaQQAhAyAFKAIIKAIIQYCJCkcEQCAEIAE2AhggBiEDCyABQQAgBEHoAGogAiAELQBnIAMQlARFDQEgASACEJIKDAELIAEgBiAEQegAaiADQY/IASADGyIDIAQtAGdBABCUBEUNACABECAhASAEIAM2AgggBCACNgIEIAQgATYCAEHfwQQgBBArCyAEQQA2AowBIAAgBEHoAGpBKBAfGgsgBEGQAWokAAsaACAAKAIQKAIMIgAEQCAAKAIsEBggABAYCwupBQIEfAh/QTAQVCEGIAAoAhAoAggoAggoAgQhCgJ8IABBhN4KKAIARP///////+9/RHsUrkfheoQ/EEsgAEGA3gooAgBE////////739EexSuR+F6lD8QSyIBECoiAr1C//////////f/AFIgAb1C//////////f/AFJyRQRAIAAoAhAiBUKas+bMmbPm1D83AyAgBUKas+bMmbPm1D83AyhEzczMzMzMDEAMAQsgAkRhMlUwKqkzPxAiIQEgACgCECIFIAEgAiACRAAAAAAAAAAAZBsiATkDICAFIAE5AyggAUQAAAAAAABSQKILIQNBASELQQEgAEG43gooAgAgCkEAEGIiByAH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aiIDJAAgA0FAayQAQQAgByABGyEDDAELIAMhBSMAQUBqIgMkACABIAdOBEAgA0IANwIcIANCADcCJCADQgA3AiwgA0IANwIUIANBADYCECADQZjrCTYCDCADIAU2AgQgA0EANgI8IANCgYCAgICAgIABNwI0IAMgATYCCCAFIANBBGogByAHQQFBACAFKAIAKAIUEQsAIAFBACADKAIcGyEICyADQUBrJAAgCCIDDQAjAEFAaiIDJAAgA0EANgIQIANB6OoJNgIMIAMgATYCCCADQZjrCTYCBEEAIQEgA0EUakEAQScQMxogA0EANgI8IANBAToAOyAFIANBBGogB0EBQQAgBSgCACgCGBEKAAJAAkACQCADKAIoDgIAAQILIAMoAhhBACADKAIkQQFGG0EAIAMoAiBBAUYbQQAgAygCLEEBRhshAQwBCyADKAIcQQFHBEAgAygCLA0BIAMoAiBBAUcNASADKAIkQQFHDQELIAMoAhQhAQsgA0FAayQAIAEhAwsgBkEQaiQAQQAgA0UNABogBEEIakEAQTgQMxogBEEBOgA7IARBfzYCECAEIAA2AgwgBCADNgIEIARBATYCNCADIARBBGogAigCAEEBIAMoAgAoAhwRCAAgBCgCHCIAQQFGBEAgAiAEKAIUNgIACyAAQQFGCyAEQUBrJAALAwAACwkAQeipCxB4GgslAEH0qQstAABFBEBB6KkLQfjACRDPA0H0qQtBAToAAAtB6KkLCwkAQdipCxA0GgslAEHkqQstAABFBEBB2KkLQdfgABCjBEHkqQtBAToAAAtB2KkLCwkAQcipCxB4GgslAEHUqQstAABFBEBByKkLQaTACRDPA0HUqQtBAToAAAtByKkLCwkAQbipCxA0GgslAEHEqQstAABFBEBBuKkLQebKARCjBEHEqQtBAToAAAtBuKkLCwkAQaipCxB4GgslAEG0qQstAABFBEBBqKkLQYDACRDPA0G0qQtBAToAAAtBqKkLCwkAQZzcChA0GgsaAEGlqQstAABFBEBBpakLQQE6AAALQZzcCgsJAEGYqQsQeBoLJQBBpKkLLQAARQRAQZipC0HcvwkQzwNBpKkLQQE6AAALQZipCwsJAEGQ3AoQNBoLGgBBlakLLQAARQRAQZWpC0EBOgAAC0GQ3AoLGwBB+LELIQADQCAAQQxrEHgiAEHg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AQsLIAcgBTYCACAEIAI2AgACQANAAkACQCACIANGIAUgBkZyBH8gAgUgDyABKQIANwMIQQEhECAAKAIIIQkjAEEQayIOJAAgDiAJNgIMIA5BCGogDkEMahCKAiAFIQkgBiAFayEKQQAhDCMAQRBrIhEkAAJAIAQoAgAiC0UgCCACa0ECdSISRXINACAKQQAgBRshCgNAIBFBDGogCSAKQQRJGyALKAIAEK4HIg1Bf0YEQEF/IQwMAgsgCQR/IApBA00EQCAKIA1JDQMgCSARQQxqIA0QHxoLIAogDWshCiAJIA1qBUEACyEJIAsoAgBFBEBBACELDAILIAwgDWohDCALQQRqIQsgEkEBayISDQALCyAJBEAgBCALNgIACyARQRBqJAAQiQIgDkEQaiQAAkACQAJAAkAgDEEBag4CAAgBCyAHIAU2AgADQCACIAQoAgBGDQIgBSACKAIAIAAoAggQjQciAUF/Rg0CIAcgBygCACABaiIFNgIAIAJBBGohAgwACwALIAcgBygCACAMaiIFNgIAIAUgBkYNASADIAhGBEAgBCgCACECIAMhCAwGCyAPQQRqIgJBACAAKAIIEI0HIghBf0YNBCAGIAcoAgBrIAhJDQYDQCAIBEAgAi0AACEFIAcgBygCACIJQQFqNgIAIAkgBToAACAIQQFrIQggAkEBaiECDAELCyAEIAQoAgBBBGoiAjYCACACIQgDQCADIAhGBEAgAyEIDAULIAgoAgBFDQQgCEEEaiEIDAALAAsgBCACNgIADAMLIAQoAgALIANHIRAMAwsgBygCACEFDAELC0ECIRALIA9BEGokACAQCwkAIAAQkwsQGAszACMAQRBrIgAkACAAIAQ2AgwgACADIAJrNgIIIABBDGogAEEIahDiCygCACAAQRBqJAALNAADQCABIAJGRQRAIAQgAyABLAAAIgAgAEEASBs6AAAgBEEBaiEEIAFBAWohAQwBCwsgAQsMACACIAEgAUEASBsLKgADQCABIAJGRQRAIAMgAS0AADoAACADQQFqIQMgAUEBaiEBDAELCyABCw8AIAAgASACQeCnCRDJCgseACABQQBOBH9B4KcJKAIAIAFBAnRqKAIABSABC8ALDwAgACABIAJB1JsJEMkKCx4AIAFBAE4Ef0HUmwkoAgAgAUECdGooAgAFIAELwAsJACAAEIgL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AQsgAEHsAmoiAxCEASAAQQdqIABBBmogAiAAQbwBaiAAKALcASAAKALYASAAQcwBaiAAQRBqIABBDGogAEEIaiAAQeABahCaBw0AIAMQmAEaDAELCwJAIABBzAFqECNFDQAgAC0AB0EBRw0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCvAEgBBDCCzkDACAAQcwBaiAAQRBqIAAoAgwgBBCzASAAQewCaiAAQegCahBaBEAgBCAEKAIAQQJyNgIACyAAKALsAiABEDQaIABBzAFqEDQaIABB8AJqJAALuQMAIwBB8AJrIgAkACAAIAI2AugCIAAgATYC7AIgAEHMAWogAyAAQeABaiAAQdwBaiAAQdgBahCbByAAQcABahBRIgEgARBVED0gACABQQAQPyICNgK8ASAAIABBEGo2AgwgAEEANgIIIABBAToAByAAQcUAOgAGA0ACQCAAQewCaiAAQegCahBaDQAgACgCvAEgARAjIAJqRgRAIAEQIyEDIAEgARAjQQF0ED0gASABEFUQPSAAIAMgAUEAED8iAmo2ArwBCyAAQewCaiIDEIQBIABBB2ogAEEGaiACIABBvAFqIAAoAtwBIAAoAtgBIABBzAFqIABBEGogAEEMaiAAQQhqIABB4AFqEJoHDQAgAxCYARoMAQsLAkAgAEHMAWoQI0UNACAALQAHQQFHDQAgACgCDCIDIABBEGprQZ8BSg0AIAAgA0EEajYCDCADIAAoAgg2AgALIAUgAiAAKAK8ASAEEMMLOAIAIABBzAFqIABBEGogACgCDCAEELMBIABB7AJqIABB6AJqEFoEQCAEIAQoAgBBAnI2AgALIAAoAuwCIAEQNBogAEHMAWoQNBogAEHwAmokAAuaAwECfyMAQdACayIAJAAgACACNgLIAiAAIAE2AswCIAMQpAIhBiADIABB0AFqEKAEIQcgAEHEAWogAyAAQcQCahCfBCAAQbgBahBRIgEgARBVED0gACABQQAQPyICNgK0ASAAIABBEGo2AgwgAEEANgIIA0ACQCAAQcwCaiAAQcgCahBaDQAgACgCtAEgARAjIAJqRgRAIAEQIyEDIAEgARAjQQF0ED0gASABEFUQPSAAIAMgAUEAED8iAmo2ArQBCyAAQcwCaiIDEIQBIAYgAiAA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AkAgAEH8AWogAEH4AWoQWw0AIAAoArQBIAMQIyABakYEQCADECMhAiADIAMQI0EBdBA9IAMgAxBVED0gACACIANBABA/IgFqNgK0AQsgAEH8AWoiAhCFAUEQIAEgAEG0AWogAEEIakEAIAYgAEEQaiAAQQxqIABB0AFqENYDDQAgAhCZARoMAQsLIAMgACgCtAEgAWsQPSADEEIQaCAAIAU2AgAgABDAC0EBRwRAIARBBDYCAAsgAEH8AWogAEH4AWoQWwRAIAQgBCgCAEECcjYCAAsgACgC/AEgAxA0GiAGEDQaIABBgAJqJAAL0AMBAX4jAEGQAmsiACQAIAAgAjYCiAIgACABNgKMAiAAQdABaiADIABB4AFqIABB3wFqIABB3gFqEJ8HIABBxAFqEFEiASABEFUQPSAAIAFBABA/IgI2AsABIAAgAEEgajYCHCAAQQA2AhggAEEBOgAXIABBxQA6ABYDQAJAIABBjAJqIABBiAJqEFsNACAAKALAASABECMgAmpGBEAgARAjIQMgASABECNBAXQQPSABIAEQVRA9IAAgAyABQQAQPyICajYCwAELIABBjAJqIgMQhQEgAEEXaiAAQRZqIAIgAEHAAWogACwA3wEgACwA3gEgAEHQAWogAEEgaiAAQRxqIABBGGogAEHgAWoQngcNACADEJkBGgwBCwsCQCAAQdABahAjRQ0AIAAtABdBAUcNACAAKAIcIgMgAEEgamtBnwFKDQAgACADQQRqNgIcIAMgACgCGDYCAAsgACACIAAoAsABIAQQwQsgACkDACEGIAUgACkDCDcDCCAFIAY3AwAgAEHQAWogAEEgaiAAKAIcIAQQswEgAEGMAmogAEGIAmoQWwRAIAQgBCgCAEECcjYCAAsgACgCjAIgARA0GiAAQdABahA0GiAAQZACaiQAC7kDACMAQYACayIAJAAgACACNgL4ASAAIAE2AvwBIABBwAFqIAMgAEHQAWogAEHPAWogAEHOAWoQnwcgAEG0AWoQUSIBIAEQVRA9IAAgAUEAED8iAjYCsAEgACAAQRBqNgIMIABBADYCCCAAQQE6AAcgAEHFADoABgNAAkAgAEH8AWogAEH4AWoQWw0AIAAoArABIAEQIyACakYEQCABECMhAyABIAEQI0EBdBA9IAEgARBVED0gACADIAFBABA/IgJqNgKwAQsgAEH8AWoiAxCFASAAQQdqIABBBmogAiAAQbABaiAALADPASAALADOASAAQcABaiAAQRBqIABBDGogAEEIaiAAQdABahCeBw0AIAMQmQEaDAELCwJAIABBwAFqECNFDQAgAC0AB0EBRw0AIAAoAgwiAyAAQRBqa0GfAUoNACAAIANBBGo2AgwgAyAAKAIINgIACyAFIAIgACgCsAEgBBDCCzkDACAAQcABaiAAQRBqIAAoAgwgBBCzASAAQfwBaiAAQfgBahBbBEAgBCAEKAIAQQJyNgIACyAAKAL8ASABEDQaIABBwAFqEDQaIABBgAJqJAALuQMAIwBBgAJrIgAkACAAIAI2AvgBIAAgATYC/AEgAEHAAWogAyAAQdABaiAAQc8BaiAAQc4BahCfByAAQbQBahBRIgEgARBVED0gACABQQAQPyICNgKwASAAIABBEGo2AgwgAEEANgIIIABBAToAByAAQcUAOgAGA0ACQCAAQfwBaiAAQfgBahBbDQAgACgCsAEgARAjIAJqRgRAIAEQIyEDIAEgARAjQQF0ED0gASABEFUQPSAAIAMgAUEAED8iAmo2ArABCyAAQfwBaiIDEIUBIABBB2ogAEEGaiACIABBsAFqIAAsAM8BIAAsAM4BIABBwAFqIABBEGogAEEMaiAAQQhqIABB0AFqEJ4HDQAgAxCZARoMAQsLAkAgAEHAAWoQI0UNACAALQAHQQFHDQAgACgCDCIDIABBEGprQZ8BSg0AIAAgA0EEajYCDCADIAAoAgg2AgALIAUgAiAAKAKwASAEEMMLOAIAIABBwAFqIABBEGogACgCDCAEELMBIABB/AFqIABB+AFqEFsEQCAEIAQoAgBBAnI2AgALIAAoAvwBIAEQNBogAEHAAWoQNBogAEGAAmokAAuPAwEBfyMAQYACayIAJAAgACACNgL4ASAAIAE2AvwBIAMQpAIhBiAAQcQBaiADIABB9wFqEKEEIABBuAFqEFEiASABEFUQPSAAIAFBABA/IgI2ArQBIAAgAEEQajYCDCAAQQA2AggDQAJAIABB/AFqIABB+AFqEFsNACAAKAK0ASABECMgAmpGBEAgARAjIQMgASABECNBAXQQPSABIAEQVRA9IAAgAyABQQAQPyICajYCtAELIABB/AFqIgMQhQEgBiACIABBtAFqIABBCGogACwA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QQJHIQULQYzdCi0AAARAIANBKGoiASADQbABakHYABAfGiMAQeABayICJABBrd4EQRtBAUG4+AgoAgAiBBBTGiACIAErAwA5A9ABIARBk6kEIAJB0AFqEDEgAS0ALCEGIAIgASgCKDYCxAEgAiAGQQFxNgLAASAEQd3JBCACQcABahAeGiABKwMIIQggAkKas+bMmbPm5D83A7gBIAIgCDkDsAEgBEGwqQQgAkGwAWoQMSACIAEoAhA2AqABIARB6cUEIAJBoAFqEB4aIAIgASgCFDYClAEgAkEtNgKQASAEQdXGBCACQZABahAeGiACIAEoAhg2AoABIAJC/NPGl93JmKg/NwN4IAJCs+bMmbPmzPE/NwNwIARBgsYEIAJB8ABqEDEgASsDICEIIAIgBkEBdkEBcTYCYCACIAg5A1ggAkLNmbPmzJmz9j83A1AgBEGayAQgAkHQAGoQMSACIAErA0g5A0ggAkEANgJEIAIgBkECdkEBcTYCQCAEQd6oBCACQUBrEDEgASgCMCEGIAEoAjQhByABKwNAIQggAiABLQA4NgIwIAIgCDkDKCACIAc2AiQgAiAGQQJ0QfDNCGooAgA2AiAgBEHZxwQgAkEgahAxIAIgASgCPEECdEGQzghqKAIANgIQIARBqP8DIAJBEGoQHhogAiABKAJQNgIAIARBp8kEIAIQHhogAkHgAWokAAsgACADQawBahCeCCEEAkAgAygCrAFBAUYEQCADIAMpA5ACNwMQIAMgAykDiAI3AwggACADQbABaiADQQhqEMwMIAVFBEAgACADQZgCahDuAxoLIAAQqgMMAQsgAEECQQggA0GIAWoQ9gMaIANBAToAlAFBACECA0AgAygCrAEiASACTQRAIAEgBCAAIANBiAFqEPgFDAILIAQgAkECdGooAgAiAUEAEK8DGiADIAMpA5ACNwMgIAMgAykDiAI3AxggASADQbABaiADQRhqEMwMIAVFBEAgASADQZgCahDuAxoLIAFBAhCGAiABEKoDIAJBAWohAgwACwALQQAhAQNAIAMoAqwBIAFLBEAgACAEIAFBAnRqKAIAELgBIAFBAWohAQwBCwsgBBAYCyAAELEDIANBsAJqJAALQwECfAJ/QQEgACsDCCICIAErAwgiA2QNABpBfyACIANjDQAaQQEgACsDECICIAErAxAiA2QNABpBf0EAIAIgA2MbCwsHACAAEKIMC8kUAhB/CHwjAEFAaiIJJABBoN0KKwMAIRZBoN0KIAAQtAo5AwAgAEECEIYCQTgQVCEBIAAoAhAgATYCjAEgACAAQQBBu/AAQQAQIUECQQIQYiEBIAAQNygCECABOwGwAUEKIQEgABA3KAIQLwGwAUEJTQRAIAAQNygCEC8BsAEhAQsgABA3KAIQIAE7AbABQczdCiABOwEAIABBACAAENEHQfiCC0Gg8AkoAgAiASgCADYCAEH8ggsgASgCBDYCAEGEgwsgASgCCDYCAEGMgwsgASgCDDYCAEG4gwtCADcDAEGQgwsgASsDEDkDAEGYgwsgASsDGDkDAEGIgwsgACAAQQBB4ztBABAhQdgEQQAQYjYCAEGggwsgACAAQQBBoNkBQQAQIUQzMzMzMzPTP0QAAAAAAAAAABBLIhE5AwBBoPAJKAIAIgEgETkDICABKwMoIhFEAAAAAAAA8L9hBEAgACAAQQBBuZADQQAQIUQAAAAAAADwv0QAAAAAAAAAABBLIRELQYCDC0EBNgIAQaiDCyAROQMAQbCDCyAAQQJBgIMLENwHIgE2AgAgAUUEQEGdnARBABArQYCDC0ECNgIAC0HQgwtBiIMLKAIAQYyDCygCAGxB5ABtNgIAAkBB+IILKAIARQ0AQbiDCysDAEQAAAAAAAAAAGVFDQBBuIMLQaCDCysDAEQAAAAAAAAIQKI5AwALIwBBIGsiBSQAIABBAUHcKUHAAkEBEK8CIwBB4ABrIgMkACADQgA3A1AgA0IANwNIIAAiAhCpCiEPQez+CUGs8AkoAgAQlwEhCyAAQdk0QQEQlQEiCkHCKUGYAkEBEDUaIAAQGyEMA0AgDARAAkAgDCgCEC0AhgENACACIAwQLSEAA0AgAEUNAUEAIRACQCAAQVBBACAAKAIAQQNxIgFBAkcbaigCKCIIKAIQLQCGAQ0AIA8gAEEwQQAgAUEDRxtqKAIoIgEQqAoiBCAPIAgQqAoiBnJFDQAgBCAGRgRAIAEQICEEIAMgARAgNgIEIAMgBDYCAEGuuwQgAxArDAELIAMgAEEwQQAgACgCAEEDcSIOQQNHG2ooAig2AlggAyAAQVBBACAOQQJHG2ooAig2AlwCQCALIANB2ABqQYAEIAsoAgARBAAiDgRAIAAgDigCECAOKAIUEJoEGgwBCyAGBEAgBARAIAYgBBCuAQRAIAQQICEBIAMgBhAgNgIkIAMgATYCIEGE+gMgA0EgahArDAQLIAQgBhCuAQRAIAYQICEBIAMgBBAgNgIUIAMgATYCEEHi+AMgA0EQahArDAQLIAsgASAIIAAgASAEIANByABqIgEgChCDBSAIIAYgASAKEIMFEJoEEOwGDAILIAYgARCuAQRAIAEQICEBIAMgBhAgNgI0IAMgATYCMEGs+gMgA0EwahArDAMLIAsgASAIIAAgASAIIAYgA0HIAGogChCDBRCaBBDsBgwBCyAEIAgQrgEEQCAIECAhASADIAQQIDYCRCADIAE2AkBBivkDIANBQGsQKwwCCyALIAEgCCAAIAEgBCADQcgAaiAKEIMFIAgQmgQQ7AYLQQEhEAsgDSAQaiENIAIgABAwIQAMAAsACyACIAwQHCEMDAELCyADLQBXQf8BRgRAIAMoAkgQGAsgCxCbARogChAbIQADQCAABEAgCiAAEBwgAiAAELgBIQAMAQsLIAoQugEgDQRAIAJB1+IAQQxBABA1IA02AggLIA8QmwEaIANB4ABqJAAgAhA4QQFqQQQQGSEAIAIoAhAgADYCmAEgAhAbIQADQCAABEAgABCEBSAAEC8oAhAvAbABQQgQGSEBIAAoAhAgATYClAEgACAAEC8oAhAoAnRBAXEQlwQgAigCECgCmAEgB0ECdGogADYCACAAKAIQIAc2AogBIAdBAWohByACIAAQHCEADAELCyACQQJBgeoAQQAQISEBIAIQGyEHA0AgBwRAIAIgBxAtIQADQCAABEAgAEHPKUG4AUEBEDUaIABB9N4KKAIARAAAAAAAAPA/RAAAAAAAAAAAEEshESAAKAIQIBE5A4ABIAAgAUGg8AkoAgArAyBEAAAAAAAAAAAQSyERIAAoAhAgETkDiAEgABCWAyACIAAQMCEADAELCyACIAcQHCEHDAELCwJAIAJBAUH1LkEAECEiB0UNAEG4+AgoAgAhCCACQQFBq+gAQQAQISEEQQAhAwNAIAIoAhAoApgBIANBAnRqKAIAIgFFDQECQCABIAcQQSIALQAARQ0AIAUgASgCECgClAEiBjYCECAFQQA6AB8gBSAGQQhqNgIUIAUgBUEfajYCGCAAQc7DASAFQRBqEE5BAk4EQEEAIQACQEGg3QorAwBEAAAAAAAAAABkRQ0AA0AgAEECRg0BIAYgAEEDdGoiCiAKKwMAQaDdCisDAKM5AwAgAEEBaiEADAALAAsgASgCECIAQQE6AIcBIAUtAB9BIUcEfyAERQ0CIAEgBBBBEGtFDQIgASgCEAUgAAtBAzoAhwEMAQsgARAgIQEgBSAANgIEIAUgATYCACAIQdHpAyAFEB4aCyADQQFqIQMMAAsACyAFQSBqJAAgCSACQQBBpjVBABAhNgIQIAkgAkEAQbj8AEEAECE2AhQgAkEAQb0hQQAQISEAIAlBADYCHCAJIAI2AgwgCSAANgIYIAkgAkECQQQgCUEgahD2AzYCMCACIAlBDGoQ5QxFBEAgAhAbIQEDQCABBEAgASgCECIALQCGAUEBRgRAIAAoAugBKAIQKAKMASIDKwMYIREgAysDCCESIAAoApQBIgUgAysDICADKwMQoSITRAAAAAAAAOA/oiIVOQMIIAUgESASoSIRRAAAAAAAAOA/oiIUOQMAIAAgEzkDKCAAIBE5AyAgAUHs3gooAgBEAAAAAAAA8D9EAAAAAAAAAAAQSyESIAEoAhAiACATIBKgOQNwIAAgESASoDkDaCAAIBREAAAAAAAAUkCiIhE5A2AgACAROQNYIAAgE0QAAAAAAABSQKI5A1AgACgCDCgCLCIAIBVEAAAAAAAAUkCiIhOaIhUgEkQAAAAAAADgP6IiEqEiFDkDeCAAIBEgEqAiFzkDcCAAIBQ5A2ggACARmiIUIBKhIhg5A2AgACATIBKgIhI5A1ggACAYOQNQIAAgEjkDSCAAIBc5A0AgACAVOQM4IAAgETkDMCAAIBU5AyggACAUOQMgIAAgEzkDGCAAIBQ5AxAgACATOQMIIAAgETkDAAsgAiABEBwhAQwBCwsgAiACEOQMIAIQ4wwgAhDmBxoCQCACKAIQLwGIAUEOcSIARQ0AAkAgAEEJSQRAIAAhAQwBC0EMIQECQCAAQQxGBEAgAkHjA0EKEIANRQ0BQZjdCkECNgIACyACQdfiAEEAEG0EQEGJ6QNBABArQQIhAQwBCyACIAAQ0wUgACEBC0GY3QpBADYCAAtB0N0KKAIAQQBKDQAgAiABENMFCyACQQAQ/QVBoN0KIBY5AwALIAlBQGskAAusBwIKfwR8IwBB8ABrIgMkACAAEBshCgNAIAoEQCAAIAoQLSEHA0ACQAJAAkACQCAHBEAgBygCEC8BqAEhBCAHQVBBACAHKAIAQQNxIgJBAkcbaigCKCIGIApGBEAgBEUNBSAHIAAoAhAoAvgBEIYNDAULIARFDQQgB0EwQQAgAkEDRxtqKAIoIQUgAyAGKAIQIgkoAugBIgI2AkAgBSgCECIIKALoASEEIANCADcDYCADQgA3A1ggAyAENgJsAkAgCS0AhgFBAUcEQCACIQkgBiECDAELIAMgAigCECgCjAEoAjAiCTYCQAsCQCAILQCGAUEBRwRAIAQhCCAFIQQMAQsgAyAEKAIQKAKMASgCMCIINgJsCwJAIAkoAhAoAowBKAIsIgYgCCgCECgCjAEoAiwiBUoEQCADQdgAaiAGIAIgBSADQUBrIAEQ6AwgAygCQCICKAIQKAKMASgCMCEJDAELIAUgBkwNACADQdgAaiAFIAQgBiADQewAaiABEOgMIAMoAmwiBCgCECgCjAEoAjAhCAsDQCAJIgUgCCIGRwRAIANB2ABqIgggBUEAIAIgARDQBSAIIAYgBEEAIAEQ0AUgBigCECgCjAEoAjAhCCAFKAIQKAKMASgCMCEJIAUhAiAGIQQMAQsLIANB2ABqIgUgBiAEIAIgARDQBSADKAJgQQBIDQEgBRDnDAJAAkAgBRDWByADKAJgIgQQjA0EQCAHIQIgBRDWByAEEI4NIgsNAkEAIQtB/PADQQAQKwwBCyAMDQAgA0FAayAAEPoCIABBCEEIEPcFIQJBnvIDQQAQKyABKwMAIg0gArciDmYgDiABKwMIIg9lcgRAIAMgDzkDMCADIA05AyggAyACNgIgQcP1BCADQSBqEIIBDAELIAMrA0AiECANZSADKwNIIg4gD2VyRQ0AIAMgDzkDGCADIA05AxAgAyAOOQMIIAMgEDkDAEH19QQgAxCCAQtBASEMDAQLA0AgAkUNBCACKAIQIANBQGsgAiALQQAQgw0gAykDQDcDkAEgAygCYEEASA0DIANB2ABqIgQQ5wwgAiAEENYHIAMoAmBBABCBDSACKAIQKAKwASECDAALAAsgACAKEBwhCgwGC0HYzgFBsb4BQeEBQb80EAAAC0HYzgFBsb4BQYICQb80EAAACyADQgA3AlwgAygCWBAYIANCADcCYCADQgA3AlgLIAAgBxAwIQcMAAsACwsgCwRAIAsQjQ0LIANB8ABqJAAgDAtbAQJ/IAAQGyEBA0AgAQRAIAAgARAtIQIDQCACBEAgAhC7AiAAIAIQMCECDAELCyABEOECIAAgARAcIQEMAQsLIAAQ6QwgACgCECgCmAEQGCAAKAIQKAKMARAYCy8BAX8gACgCGCAAKAIIQQAQjQEaIAAoAhggACgCDCIBIAEQd0EARxCNARogABAYCz4BAn8Cf0F/IAAoAgAiAiABKAIAIgNIDQAaQQEgAiADSg0AGkF/IAAoAgQiACABKAIEIgFIDQAaIAAgAUoLC4cBAQJ/AkBB5IILKAIAIgMoAgQiAiADKAIIRwRAIAMhAQwBCyADKAIMIgFFBEAgAyACIAMoAgBrQRRtQQF0EO8MIgE2AgwLQeSCCyABNgIAIAEgASgCACICNgIECyABIAJBFGo2AgQgAiAAKAIANgIAIAAoAgQhACACQQA2AgggAiAANgIEIAILagECfyAAEBshAQNAIAEEQCAAIAEQLSECA0AgAgRAIAIQuwIgACACEDAhAgwBCwsgARDhAiAAIAEQHCEBDAELCwJAQZjdCigCAEUEQEHUggsoAgBBAE4NAQsgABCGDgsgACgCECgCuAEQGAsJACABIAIQ4QELEQAgACABQcyCC0HIggsQ+gYL2ggDDn8BfAF+IwBBQGoiBCQAQZjdCigCAAJ/An9BASACQQZIDQAaIAAQOEEEEBkhByAAEBshAyACQQhGIQwDQCADBEAgAyABIAwQhQ0hBSADKAIQIQgCQCAFBEAgCCAJNgKwAiAHIAlBAnRqIAU2AgAgCUEBaiEJDAELIAhBqXc2ArACCyAAIAMQHCEDDAELCyAHRQRAQQAhB0EBDAELIAcgCRCMDQRAQQEhA0EAIAJBCEYNAhogByAJEI4NDAILIAJBCEYEQEHQ8QNBABArQQAMAQsgASsDACERIAQgASsDCDkDKCAEIBE5AyBB4PIDIARBIGoQK0EACyENQQAhA0EACyEKQYzdCi0AAARAQbj4CCgCACAEAn9BuTIgAyACQQhGcQ0AGkHSKyAKRQ0AGkGxMkGnMiACQQpGGws2AhBBov0DIARBEGoQHhoLQQFKIQ4CQCAKBEAgABAbIQEDQCABRQ0CIAAgARAtIQMDQCADBEAgAygCECAEQThqIAMgCkEBEIMNIAQpAzg3A5ABIAAgAxAwIQMMAQsLIAAgARAcIQEMAAsACyADQQFzIAJBCEdyDQAgAEEAEMwPQQEhDgtBuPgIKAIAIQ8gABAbIQsgAkEKRyEQA0AgCwRAIAAgCxAtIQEDQCABBEAgAUFQQQAgASgCAEEDcUECRxtqKAIoIQUgASgCECEDAkACQCAORQ0AIAMoAghFDQAgARCZAwwBCyADLwGoASIDRQ0AIAUgC0YEQCABIAAoAkgoAhAoAvgBEIYNDAELIAoEQEEAIQVBASADwSIDQQAgA0EAShtBvN0KLQAAGyEIIAEhAwNAIAUgCEYNAgJAIBBFBEAgAyAHIAlBARCBDQwBCyAEIAMoAhApA5ABIhI3AwggBCASNwMwIARBCGogBEE4ahCOBEGM3QotAABBAk8EQCADQTBBACADKAIAQQNxQQNHG2ooAigQICEGIAQgA0FQQQAgAygCAEEDcUECRxtqKAIoECA2AgQgBCAGNgIAIA9BgfcDIAQQHhoLIAMgA0FQQQAgAygCAEEDcUECRxtqKAIoIAQoAjggBCgCPEGE1QoQngEgAxCZAwsgBUEBaiEFIAMoAhAoArABIQMMAAsAC0EBIQYgASIIIQMDQAJAIAYhBSADIAMoAhAoArABIgxGDQAgBUEBaiEGIAwiAw0BCwtBACEDIAVBBBAZIQYCQANAIAMgBUYEQCAFQQBOBEAgACAGIAUgAkGE1QoQsA8gBhAYDAMLBSAGIANBAnRqIAg2AgAgA0EBaiEDIAgoAhAoArABIQgMAQsLQdLLAUGCwAFBrAdB+KEBEAAACwsgACABEDAhAQwBCwsgACALEBwhCwwBCwsgCgRAIAoQjQ0LIA1FBEBBACEDIAlBACAJQQBKGyEAA0AgACADRwRAIAcgA0ECdGoiASgCACgCABAYIAEoAgAQGCADQQFqIQMMAQsLIAcQGAsgBEFAayQAQQALrgECAnwDfwJAIAAoAgAiBCABKAIAIgVLDQBBfyEGAkAgBCAFSQ0AIAAoAhgiBCABKAIYIgVLDQEgBCAFSQ0AIAArAwgiAiABKwMIIgNkDQEgAiADYw0AIAArAxAiAiABKwMQIgNkDQEgAiADYw0AIAArAyAiAiABKwMgIgNkDQEgAiADYw0AQQEhBiAAKwMoIgIgASsDKCIDZA0AQX9BACACIANjGyEGCyAGDwtBAQsvAEHAABBUIgFBCGogAEEIakEwEB8aIAEgACgCOCIANgI4IAAoAhBBATsBqAEgAQtIAQJ8An9BfyAAKAIAIgArAwgiAiABKAIAIgErAwgiA2MNABpBASACIANkDQAaQX8gACsDACICIAErAwAiA2MNABogAiADZAsLygYCCH8FfCMAQRBrIgYkAAJ/AkAgASgCECIFKALoAQRAIAZBBDYCDCAFKwMgIQ0gBSsDKCEMIABBATYCKEEEELACIgQgDEQAAAAAAADgP6IiDpoiDDkDOCAEIA1EAAAAAAAA4D+iIg05AzAgBCAMOQMoIAQgDZoiDDkDICAEIA45AxggBCAMOQMQIAQgDjkDCCAEIA05AwAMAQsCQAJAAkACQAJAIAEQ3wJBAWsOAwABAgMLIAYgASgCECgCDCIIKAIIIgk2AgwCQCAJQQNPBEAgCRCwAiEEIAgoAiwhCkEAIQUDQCAFIAlGDQIgBCAFQQR0IgdqIgsgByAKaiIHKwMARAAAAAAAAFJAozkDACALIAcrAwhEAAAAAAAAUkCjOQMIIAVBAWohBQwACwALIAEgBkEMakQAAAAAAAAAAEQAAAAAAAAAABDcBSEECyABKAIQKAIIKAIAQcYSEEwEQCAAQQE2AigMBQsCQCABKAIQKAIIKAIAQbfnABBMRQ0AIAQgBigCDBCkDUUNACAAQQE2AigMBQsgCCgCCEECSw0DIAgoAgBFDQMgAEECNgIoDAQLIAZBBDYCDEEEELACIQQgASgCECgCDCIBKwMYIQ8gASsDICEQIAErAxAhDSAEIAErAyhEAAAAAAAAUkCjIgw5AzggBCANRAAAAAAAAFJAoyIOOQMwIAQgDDkDKCAEIBBEAAAAAAAAUkCjIg05AyAgBCAPRAAAAAAAAFJAoyIMOQMYIAQgDTkDECAEIAw5AwggBCAOOQMAIABBATYCKAwDCyAAQQI2AiggASAGQQxqRAAAAAAAAAAARAAAAAAAAAAAENwFIQQMAgsgBiABKAIQKAIIKAIANgIAQcT+AyAGEDZBAQwCCyAAQQA2AigLQQAhASAGKAIMIQcCQAJAIAJEAAAAAAAA8D9iBEAgBCEFDAELIAQhBSADRAAAAAAAAPA/YQ0BCwNAIAEgB0YNASAFIAIgBSsDAKI5AwAgBSADIAUrAwiiOQMIIAFBAWohASAFQRBqIQUMAAsACyAAIAc2AiAgACAENgIkIAQgByAAIABBEGoQow1BACAHQcyBCygCAE0NABpBzIELIAc2AgBBAAsgBkEQaiQAC7MHAgZ/BHwjAEEQayIGJAACfwJAIAEoAhAiBCgC6AEEQCAGQQQ2AgwgBCsDKCEKIAQrAyAhCyAAQQE2AihBBBCwAiIEIAIgC0QAAAAAAADgP6KgIgI5AzAgBCADIApEAAAAAAAA4D+ioCIDOQMYIAQgAzkDCCAEIAI5AwAgBCADmiIDOQM4IAQgAzkDKCAEIAKaIgI5AyAgBCACOQMQDAELAkACQAJAAkACQCABEN8CQQFrDgMAAQIDCyAGIAEoAhAiBygCDCIFKAIIIgg2AgxBASEEAkAgBygCCCgCAEHGEhBMDQAgASgCECgCCCgCAEG35wAQTARAIAUoAiwgCBCkDQ0BC0ECIQQgBSgCCEECTQRAIAUoAgANAQtBACEECyAAIAQ2AiggCEEDTwRAIAgQsAIhBCAFKAIsIQUgACgCKEEBRg0EQQAhAQNAIAEgCEYNBiAFIAFBBHQiB2oiCSsDCCEKIAQgB2oiByAKIAMgCSsDACILIAoQTyIKo0QAAAAAAADwP6CiRAAAAAAAAFJAozkDCCAHIAsgAiAKo0QAAAAAAADwP6CiRAAAAAAAAFJAozkDACABQQFqIQEMAAsACyABIAZBDGogAiADENwFIQQMBAsgBkEENgIMQQQQsAIhBCABKAIQKAIMIgErAxghCiABKwMgIQsgASsDECEMIAQgAyABKwMoRAAAAAAAAFJAo6AiDTkDOCAEIAxEAAAAAAAAUkCjIAKhIgw5AzAgBCANOQMoIAQgAiALRAAAAAAAAFJAo6AiAjkDICAEIApEAAAAAAAAUkCjIAOhIgM5AxggBCACOQMQIAQgAzkDCCAEIAw5AwAgAEEBNgIoDAMLIABBAjYCKCABIAZBDGogAiADENwFIQQMAgsgBiABKAIQKAIIKAIANgIAQeX+AyAGEDZBAQwCCyAEIAIgBSsDAEQAAAAAAABSQKOgOQMAIAQgAyAFKwMIRAAAAAAAAFJAo6A5AwggBCAFKwMQRAAAAAAAAFJAoyACoTkDECAEIAMgBSsDGEQAAAAAAABSQKOgOQMYIAQgBSsDIEQAAAAAAABSQKMgAqE5AyAgBCAFKwMoRAAAAAAAAFJAoyADoTkDKCAEIAIgBSsDMEQAAAAAAABSQKOgOQMwIAQgBSsDOEQAAAAAAABSQKMgA6E5AzgLIAAgBDYCJCAAIAYoAgwiATYCICAEIAEgACAAQRBqEKMNQQAgAUHMgQsoAgBNDQAaQcyBCyABNgIAQQALIAZBEGokAAsRACAAIAFBkIELQYyBCxD6BgstAQJ9QX8gAiAAKAIAQQJ0aioCACIDIAIgASgCAEECdGoqAgAiBF4gAyAEXRsLEgAgAEE0ahDzAyAAQShqEPMDCwkAIAAQzw0QGAtEAgF/AnwgACgCBCgCBCABKAIEKAIERgRAIAAoAgBFIAEoAgBBAEdxDwsgACsDECIDIAErAxAiBGQEf0EABSADIARjCwsJACAAEN8NEBgLCQAgABCGCBAYC4wKAgl/AnwjAEGgAWsiBiQAIAAQ4A0gBkEANgKcASAAQQRqIQkgAEEkaiEEAkACQAJAA0AgBCgCACECRP///////+9/IQogBCgCBCIFIQEDfCACIAVGBHwgCkRIr7ya8td6vmNFIAEgBUZyRQRAIAEgBCgCBEEEaygCADYCAAJAIAQoAgQgBCgCAGtBAnVBAWsiBSAEKAIEIAQoAgAiAmtBAnUiAUsEQCMAQSBrIgckAAJAIAUgAWsiCCAEKAIIIAQoAgQiAmtBAnVNBEAgBCgCBCIBIAhBAnRqIQIDQCABIAJGBEAgBCACNgIEBSABQQA2AgAgAUEEaiEBDAELCwwBCyAHQQxqIAQgAiAEKAIAa0ECdSAIahDpBSAEKAIEIAQoAgBrQQJ1IARBCGoQiQgiBSgCCCIBIAhBAnRqIQIDQCABIAJHBEAgAUEANgIAIAFBBGohAQwBCwsgBSACNgIIIAQgBRDnDSAFEIgICyAHQSBqJAAMAQsgASAFSwRAIAQgAiAFQQJ0ajYCBAsLCyAKBSAKIAIoAgAiBxCxAiILZARAIAYgBzYCnAEgAiEBIAshCgsgAkEEaiECDAELC0RIr7ya8td6vmMEQCAGKAKcASIFLQAcQQFGDQIgBiAFKAIAKAIgIgg2AgQgBiAFKAIEIgEoAiAiAjYCmAEgAiAIRwRAIAggAiAFEOsNDAILIANBkc4ATg0DIAUoAgAhAiMAQRBrIgckACAIIAgoAgAoAgBBABDrBSAHIAggASACQQBBAEEAEIsIIAcoAgghAiAHQRBqJAAgCCAGQQRqIgEgBkGYAWogAhCKCCAIQQE6ACggBiACNgIQIAQgBkEQaiICEMABIAYoAgQgBigCmAEgBRDrDSACIAkgARD0AyADQQFqIQMMAQsLIAkQ6AVBACEBA0AgASAAKAIcTw0DIAFBAnQgAUEBaiEBIAAoAhhqKAIAIgIQsQJESK+8mvLXer5jRQ0ACyAGQRBqIgFB+JYJNgI4IAFB5JYJNgIAIAFBhJcJKAIAIgA2AgAgASAAQQxrKAIAakGIlwkoAgA2AgAgASABKAIAQQxrKAIAaiIAQQA2AhQgACABQQRqIgM2AhggAEEANgIMIABCgqCAgOAANwIEIAAgA0U2AhAgAEEgakEAQSgQMxogAEEcahCLCyAAQoCAgIBwNwJIIAFB5JYJNgIAIAFB+JYJNgI4IANBpJMJNgIAIANBBGoQiwsgA0IANwIYIANCADcCECADQgA3AgggA0IANwIgIANBlJQJNgIAIANBEDYCMCADQgA3AiggAUGH0AMQywIgAigCABDyDUHwnwMQywIgAisDCBCmB0G/4QEQywIgAigCBBDyDUH3rwMQywIgAhCxAhCmB0GxrwMQywJBho8BQe+GBSACLQAcGxDLAhpBCBDMAyAGQQRqIQcjAEEQayIBJAACQCADKAIwIgBBEHEEQCADKAIYIAMoAixLBEAgAyADKAIYNgIsCyAHIAMoAhQgAygCLCABQQ9qEKUHGgwBCyAAQQhxBEAgByADKAIIIAMoAhAgAUEOahClBxoMAQsjAEEQayIAJAAgBxDcCxogAEEQaiQACyABQRBqJAAQkgUiAEHc7gk2AgAgAEEEaiAHEEIQhwcgAEG47wlBwAMQAQALQfuOAUHx3ABBtgFByA4QAAALQQgQzANB3ssDEIYHQbjvCUHAAxABAAsgBkGgAWokAAs+AgF8AX8gAEEEaiICEOENIQEDQCAAIAAoAgAoAgARAQAgABDgDSABIAIQ4Q0iAaGZRC1DHOviNho/ZA0ACwuGBQIMfwF8IAAgACgCACgCABEBACMAQRBrIgMkACAAQQhqIQkgAEEEaiEEAkACQANAIAQoAgAhAQNAIAEgCUYEQAJAIAQoAgAhAQNAAkAgASAJRgRAQQAhAQwBCwJAIAEoAhAiCBDpDSICRQ0AIAIrAxBEAAAAAAAAAABjRQ0AIANBADYCDCADQQA2AggjAEEQayIKJAAgCCADQQxqIgsgA0EIaiIFIAIQigggBSgCACIBIAgrAxAiDTkDECABIA0gASsDGKI5AyAgCygCABDiDSAFIAIoAgQoAiAiATYCACABEO0NIQ0gBSgCACIBIA05AyAgASANIAErAxijOQMQIAEQkQgDQAJAIAEQjQgiAkUNACACELECRAAAAAAAAAAAY0UNACABQTxqEMMEIAIoAgQoAiAiBhCRCCABIAYgASgCBCABKAIAayAGKAIEIAYoAgBrSyIMGyEHIAYgASAMGyIBIAcgAiACKAIAKwMYIAIrAwigIAIoAgQrAxihIg2aIA0gDBsQ7AUgARCNCBogBxCNCBogAUE8aiAHQTxqEOoNIAdBAToAKAwBCwsgCEEBOgAoIApBCGoiASAEIAsQ9AMgASAEIAUQ9AMgCkEQaiQAIAQQ6AUMBgsgARCwASEBDAELCwNAIAEgACgCHE8NASAAKAIYIAFBAnRqKAIAELECREivvJry13q+Y0UEQCABQQFqIQEMAQsLIAAoAhggAUECdGooAgAQsQJESK+8mvLXer5kRQ0EQQgQzANB8B8QhgdBuO8JQcADEAEACwUgASgCECICEJIIIAIQkQggARCwASEBDAELCwsgA0EQaiQADAELQd73AkHx3ABB/wBB3pwBEAAACwv7AgEIfyMAQRBrIgUkACAFQQRqIgFBADYCCCABIAE2AgQgASABNgIAIABBBGoiAigCECIDQQAgA0EAShshByACKAIMIQgDQCAEIAdGBEADQCADIAZKBEAgAigCDCAGQQJ0aigCACIEKAIoIAQoAixGBEAgAiAEIAEQ4w0gAigCECEDCyAGQQFqIQYMAQsLBSAIIARBAnRqKAIAQQA6ACQgBEEBaiEEDAELCwNAAkAgASgCBCIBIAVBBGpGBEAgAhDoBUEAIQEDQCABIAAoAhxPDQIgAUECdCABQQFqIQEgACgCGGooAgAQsQJESK+8mvLXer5jRQ0AC0EIEMwDQfAfEIYHQbjvCUHAAxABAAsgASgCCCgCICIDLQAoDQEgAxDiDQwBCwsCQCAFQQRqIgIoAghFDQAgAigCBCIAKAIAIgEgAigCACgCBCIDNgIEIAMgATYCACACQQA2AggDQCAAIAJGDQEgACgCBCAAEBghAAwACwALIAVBEGokAAsZAQJ+IAApAwgiAiABKQMIIgNWIAIgA1RrCx0AIAAoAgBBBHYiACABKAIAQQR2IgFLIAAgAUlrC7oBAgJ/AnxE////////7/8hBAJ8RP///////+//IAEoAgAoAiAiAigCLCABKAIYSg0AGkT////////v/yACIAEoAgQoAiBGDQAaIAEQsQILIQUCQCAAKAIAKAIgIgIoAiwgACgCGEoNACACIAAoAgQoAiBGDQAgABCxAiEECyAEIAVhBEAgASgCACgCACICIAAoAgAoAgAiA0YEQCABKAIEKAIAIAAoAgQoAgBIDwsgAiADSA8LIAQgBWQLMwAgABDeDSAAIAEoAgA2AgAgACABKAIENgIEIAAgASgCCDYCCCABQQA2AgggAUIANwIAC8oBAQd/IwBBEGsiBSQAIABBADYCCCAAQgA3AgBBKEE0IAIbIQcgASgCBCEIIAEoAgAhBANAIAQgCEcEQCAEKAIAIAdqIgMoAgQhCSADKAIAIQMDQCADIAlGBEAgBEEEaiEEDAMFIAUgAygCACIGNgIMIAZBiIELKAIANgIYAkACQCACBEAgBigCACgCICABRw0BCyACDQEgBigCBCgCICABRg0BCyAAIAVBDGoQwAELIANBBGohAwwBCwALAAsLIAAQ7A0gBUEQaiQACz4BAnwCf0F/IAArAwAiAiABKwMAIgNjDQAaQQEgAiADZA0AGkF/IAArAwgiAiABKwMIIgNjDQAaIAIgA2QLCxwAIAAoAgwgASgCDGogACgCBCABKAIEamtBAm0LHAAgACgCCCABKAIIaiAAKAIAIAEoAgBqa0ECbQuMAQEHfwJAIAAoAiAiAyABKAIoIgRKDQAgASgCICIFIAAoAigiBkoNAEEBIQIgACgCLCIHIAEoAiQiCEgNACAAKAIQIAEoAhBrIAcgASgCLGogACgCJCAIamtBAm1qIAYgAyAFamsgBGpBAm0gASgCDCIBIAAoAgwiAGsgACABayAAIAFKG2pMIQILIAILjAEBB38CQCAAKAIkIgMgASgCLCIESg0AIAEoAiQiBSAAKAIsIgZKDQBBASECIAAoAigiByABKAIgIghIDQAgACgCDCABKAIMayABKAIoIAcgCCAAKAIgamtqQQJtaiAEIAZqIAMgBWprQQJtIAEoAhAiASAAKAIQIgBrIAAgAWsgACABShtqTCECCyACCyABAX8gACgCICABKAIoTAR/IAEoAiAgACgCKEwFQQALCyABAX8gACgCJCABKAIs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fyAAKAIAIgAgASgCACIBSyAAIAFJGwslACAAKAIAKAIQKAL0ASIAIAEoAgAoAhAoAvQBIgFKIAAgAUhrCyUAIAEoAgAoAhAoAvQBIgEgACgCACgCECgC9AEiAEogACABSmsLQAICfAF/IAArAwAiAiABKwMAIgNkBEAgACsDCCABKwMIZUUPCyACIANjBH9BAEF/IAArAwggASsDCGYbBUEACwu0AQEFfyAAKAIoIQQDQCAEKAIEIQEgBCgCACACSwRAIAEgAkEYbGpBCGohAUEAIQMDQCABKAIIIANLBEAgASADENkIGiADQQFqIQMMAQsLIAFCADcCBCABKAIAEBggAUIANwIIIAFCADcCACACQQFqIQIMAQsLIAEQGCAEEBggAEEYaiEBA0AgACgCICAFSwRAIAEgBRBcGiAFQQFqIQUMAQsLIABCADcCHCAAKAIYEBggABAYCyABAnxBAUF/QQAgACsDACICIAErAwAiA2MbIAIgA2QbCw8AIAAoAhAQmwEaIAAQGAtaAgF8AX9BfyAAKwMIIAErAwihIgJESK+8mvLXej5kIAJESK+8mvLXer5jGyIDBH8gAwVBfyAAKwMAIAErAwChIgJESK+8mvLXej5kIAJESK+8mvLXer5jGwsLWgIBfAF/QX8gACsDACABKwMAoSICREivvJry13o+ZCACREivvJry13q+YxsiAwR/IAMFQX8gACsDCCABKwMIoSICREivvJry13o+ZCACREivvJry13q+YxsLCyMAIAAoAhAoAgBBBHYiACABKAIQKAIAQQR2IgFLIAAgAUlrCxQAIAAoAhBBHGogAEcEQCAAEBgLC44BAgF/BHwjAEEwayIDJAAgAyABKAIIIgQ2AiQgAyAENgIgIABB8v8EIANBIGoQHSACKwMAIQUgAisDECEGIAIrAwghByACKwMYIQggAyABKAIINgIQIAMgCCAHoEQAAAAAAADgP6I5AwggAyAGIAWgRAAAAAAAAOA/ojkDACAAQZn9BCADEB0gA0EwaiQACwIAC90DAgF/AnwjAEGgAWsiBCQAAkACQCAABEAgAUUNASABKAIIRQ0CIAEoAkQEQCAEIAIpAwA3A2AgBCACKQMINwNoIAQgAikDGDcDiAEgBCACKQMQNwOAASAEIAQrA2giBTkDmAEgBCAEKwNgIgY5A3AgBCAEKwOA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ID09IHN6AGNudCA9PSBzegBsb3oAZ3JhcGh2aXoAZ3Z3cml0ZV9ub196AHBvcnRob3h5AHNjYWxleHkAL3N2Zy9uYXZ5AGludmVtcHR5AG5vZGVfc2V0X2lzX2VtcHR5AG5vZGVzX2lzX2VtcHR5AHJlZmVyZW5jZSB0byBiaW5hcnkgZW50aXR5AGFzeW5jaHJvbm91cyBlbnRpdHkAaW5jb21wbGV0ZSBtYXJrdXAgaW4gcGFyYW1ldGVyIGVudGl0eQBlbnRpdHkgZGVjbGFyZWQgaW4gcGFyYW1ldGVyIGVudGl0eQBjYW5ub3Qgc3VzcGVuZCBpbiBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXR5AFhNTCBvciB0ZXh0IGRlY2xhcmF0aW9uIG5vdCBhdCBzdGFydCBvZiBlbnRpdHkAdW5kZWZpbmVkIGVudGl0eQBwYXJzZXItPm1fb3BlbkludGVybmFsRW50aXRpZXMgPT0gb3BlbkVudGl0eQBwYXJzZXItPm1fb3BlblZhbHVlRW50aXRpZXMgPT0gb3BlbkVudGl0eQBwYXJzZXItPm1fb3BlbkF0dHJpYnV0ZUVudGl0aWVzID09IG9wZW5FbnRpdHkAaW5maW5pdHkAZmFudGFzeQBTcGFyc2VNYXRyaXhfY29vcmRpbmF0ZV9mb3JtX2FkZF9lbnRyeQAvc3ZnL2l2b3J5AG91dCBvZiBtZW1vcnkARmVicnVhcnkASmFudWFyeQBndnBsdWdpbl9kb3RfbGF5b3V0X0xUWF9saWJyYXJ5AGd2cGx1Z2luX25lYXRvX2xheW91dF9MVFhfbGlicmFyeQBndnBsdWdpbl9jb3JlX0xUWF9saWJyYXJ5AGdhdGhlcl90aW1lX2VudHJvcHkAbm9kZXNfY29weQBhbGJhbnkASnVseQBTcGFyc2VNYXRyaXhfbXVsdGlwbHkAZXF1YWxseQBhc3NlbWJseQBzdW1tZXJza3kAc2h5AHNhdGlzZnkAYmVhdXRpZnkAbm9qdXN0aWZ5AENsYXNzaWZ5AC9zdmcvbGlnaHRncmV5AC9zdmcvZGltZ3JleQAvc3ZnL2RhcmtncmV5AC9zdmcvbGlnaHRzbGF0ZWdyZXkAL3N2Zy9kYXJrc2xhdGVncmV5AC9zdmcvc2xhdGVncmV5AHdlYmdyZXkAeDExZ3JleQAvc3ZnL2dyZXkAbW92ZSB0byBmcm9udCBsb2NrIGluY29uc2lzdGVuY3kAZXh0cmFjdF9hZGphY2VuY3kAbWVyZ2Vfb25ld2F5AGFycmF5AGFsbG9jQXJyYXkAL3N2Zy9saWdodGdyYXkAL3N2Zy9kaW1ncmF5AC9zdmcvZGFya2dyYXkAL3N2Zy9saWdodHNsYXRlZ3JheQAvc3ZnL2RhcmtzbGF0ZWdyYXkAL3N2Zy9zbGF0ZWdyYXkAd2ViZ3JheQB4MTFncmF5AC9zdmcvZ3JheQBUaHVyc2RheQBUdWVzZGF5AFdlZG5lc2RheQBTYXR1cmRheQBTdW5kYXkATW9uZGF5AEZyaWRheQBNYXkALi4vLi4vbGliL2NncmFwaC9ncmFtbWFyLnkALi4vLi4vbGliL2NvbW1vbi9odG1scGFyc2UueQAlbS8lZC8leQBwb3J0aG95eABwb3J0aG9feXgAeHh4AGJveAB2aWV3Qm94AGNoa0JvdW5kQm94AC9NZWRpYUJveABnZXRfZWRnZV9sYWJlbF9tYXRyaXgAaWRlYWxfZGlzdGFuY2VfbWF0cml4AG11c3Qgbm90IHVuZGVjbGFyZSBwcmVmaXgAdW5ib3VuZCBwcmVmaXgAaHRtbGxleABtYXgAIyUwMnglMDJ4JTAyeAAjJTJ4JTJ4JTJ4JTJ4ACMlMXglMXglMXgALSsgICAwWDB4AC0wWCswWCAwWC0weCsweCAweAByYXJyb3cAbGFycm93AEhlbHZldGljYS1OYXJyb3cAYXJyb3dfbGVuZ3RoX2Nyb3cAL3N2Zy9zbm93AHNwcmluZ19lbGVjdHJpY2FsX2VtYmVkZGluZ19zbG93AC9zdmcvbGlnaHR5ZWxsb3cAL3N2Zy9ncmVlbnllbGxvdwAvc3ZnL2xpZ2h0Z29sZGVucm9keWVsbG93AC9zdmcveWVsbG93AGZhdGFsIGVycm9yIC0gc2Nhbm5lciBpbnB1dCBidWZmZXIgb3ZlcmZsb3cAZmxleCBzY2FubmVyIHB1c2gtYmFjayBvdmVyZmxvdwBjb3VyaWVybmV3AFNwcmluZ1Ntb290aGVyX25ldwBUcmlhbmdsZVNtb290aGVyX25ldwBkaWFnX3ByZWNvbl9uZXcAUXVhZFRyZWVfbmV3AFN0cmVzc01ham9yaXphdGlvblNtb290aGVyMl9uZXcAbiAmJiBuZXcAc2tldwBzdHJ2aWV3AC9zdmcvaG9uZXlkZXcAIC1hbmNob3IgdwBzb3J0dgBwb3Y6cG92AE5vdgBpbnYAZXF1aXYAcGl2AG5vbmFtZS5ndgBHRF9yYW5rKGcpW3JdLmF2ID09IEdEX3JhbmsoZylbcl0udgBjYyVzXyV6dQBjYyVzKyV6dQAvc3ZnL3BlcnUAbnUAbXUAJWMlbGx1AFRodQB0YXUAVGF1AE51AE11AF9wb3J0XyVzXyglZClfKCVkKV8ldQBOdW1iZXIgb2YgaXRlcmF0aW9ucyA9ICV1AE51bWJlciBvZiBpbmNyZWFzZXMgPSAldQBwbGFpbnRleHQAc3RyZXNzd3QAaW5wdXQAdGV4dGxheW91dABkb3RfbGF5b3V0AG5lYXRvX2xheW91dABpbml0TGF5b3V0AGNsdXN0AG1hcENsdXN0AGxhYmVsanVzdABzY0FkanVzdABBdWd1c3QAZWRnZXNmaXJzdABub2Rlc2ZpcnN0AG1heGltYWxfaW5kZXBlbmRlbnRfZWRnZV9zZXRfaGVhdmVzdF9lZGdlX3Blcm5vZGVfc3VwZXJub2Rlc19maXJzdABleGlzdAByZWFsaWduTm9kZWxpc3QAYXBwZW5kTm9kZWxpc3QAZGVmYXVsdGRpc3QAbWluZGlzdABwb3dlcl9kaXN0AGdyYXBoX2Rpc3QAYXZnX2Rpc3QAZ2V0RWRnZUxpc3QAaXF1ZXN0AGxvd2FzdABzcHJpbmdfZWxlY3RyaWNhbF9lbWJlZGRpbmdfZmFzdABndl9zb3J0AHZpZXdwb3J0AHRhaWxwb3J0AHVuZXhwZWN0ZWQgcGFyc2VyIHN0YXRlIC0gcGxlYXNlIHNlbmQgYSBidWcgcmVwb3J0AGhlYWRwb3J0AGh0bWxfcG9ydABpbnNlcnQAUlRyZWVJbnNlcnQAZmluZFNWZXJ0AHN0YXJ0AHBhcnQAZXN0aW1hdGVfdGV4dF93aWR0aF8xcHQAcXVvdAB/cm9vdABub3QAbWFrZV92bl9zbG90AGVtaXRfeGRvdAB4ZG90Onhkb3QAZXBzOnhkb3QAc3ZnOnhkb3QAanBnOnhkb3QAcG5nOnhkb3QAanBlZzp4ZG90AGdpZjp4ZG90AGpwZTp4ZG90AHhkb3QxLjQ6eGRvdAB4ZG90MS4yOnhkb3QAc2RvdABtaWRkb3QAZ3Y6ZG90AHBsYWluLWV4dDpkb3QAZG90OmRvdABlcHM6ZG90AGNhbm9uOmRvdABwbGFpbjpkb3QAc3ZnOmRvdABqcGc6ZG90AHBuZzpkb3QAanBlZzpkb3QAZ2lmOmRvdABqcGU6ZG90AH9ib3QAZG9Eb3QAb2JqbGlzdF9mcm9udABwb2ludHNfZnJvbnQAY29sb3JzZWdzX2Zyb250AG5vZGVsaXN0X3BvcF9mcm9udABwYnNfc2l6ZV9mcm9udABzcGFuLT5mb250AHZhZ3hicHJpbnQAeGRvdF9wb2ludABkZWNpZGVfcG9pbnQAVW5zYXRpc2ZpZWQgY29uc3RyYWludAB0cmFuc3BhcmVudABjb21wb25lbnQAaW52YWxpZCBhcmd1bWVudABjb21tZW50AGp1bmsgYWZ0ZXIgZG9jdW1lbnQgZWxlbWVudABjZW50AGkgPT0gZWNudABhcmlhbG10AGx0AGNpcmN1aXQAcG9seV9pbml0AE11bHRpbGV2ZWxfaW5pdABuc2xpbWl0AG1jbGltaXQAUG9ydHJhaXQAbGlnaHQAdmlydHVhbF93ZWlnaHQAbGhlaWdodABLUF9SaWdodABCb29rbWFuLUxpZ2h0AGd0AEtQX0xlZnQAY2hhcnNldABpbnNldABiaXRhcnJheV9yZXNldABzdWJzZXQAYml0YXJyYXlfc2V0AG1hdHJpeF9zZXQAbm9kZWxpc3Rfc2V0AGVkZ2VfbGlzdF9zZXQAaW50c19zZXQAdHJhcHNfc2V0AG5vZGVzX3NldABzY2FybGV0AC9zdmcvZGFya3Zpb2xldAAvc3ZnL2JsdWV2aW9sZXQAL3N2Zy92aW9sZXQAVHJlYnVjaGV0AGFneGdldAB0YWlsdGFyZ2V0AGxhYmVsdGFyZ2V0AGVkZ2V0YXJnZXQAaGVhZHRhcmdldABiaXRhcnJheV9nZXQAZGVnbGlzdF9nZXQAbm9kZWxpc3RfZ2V0AGFkal9saXN0X2dldABzZWdfbGlzdF9nZXQAc2FtZV9saXN0X2dldABlZGdlX2xpc3RfZ2V0AHNmb250X2dldABlZGdlX3NldF9nZXQAcm93c19nZXQAdHN0c19nZXQAcG9pbnRzX2dldABwYWlyc19nZXQAdHJhcHNfZ2V0AGNlbGxzX2dldABjb2xvcnNlZ3NfZ2V0AGJveGVzX2dldAB0cmlhbmdsZXNfZ2V0AGN5Y2xlc19nZXQAcW5vZGVzX2dldABlc3RhY2tfZ2V0AGludF9zdGFja19nZXQAZGZzX3N0YWNrX2dldABub2RlX3N0YWNrX2dldABiZXppZXJfcGF0aF9nZXQAbm9kZV9xdWV1ZV9nZXQAc3R5bGVzaGVldABzdHJpY3QAYWdjb3B5ZGljdABhZ21ha2VkYXRhZGljdAByZWMtPmRpY3QgPT0gZGF0YWRpY3QAd3JpdGVfZGljdABzZWN0AGVuY29kaW5nIHNwZWNpZmllZCBpbiBYTUwgZGVjbGFyYXRpb24gaXMgaW5jb3JyZWN0AGFzcGVjdABsYXllcnNlbGVjdABLUF9TdWJ0cmFjdABRdWFkVHJlZV9yZXB1bHNpdmVfZm9yY2VfaW50ZXJhY3QAY29tcGFjdABPY3QAcmVxdWVzdGVkIGZlYXR1cmUgcmVxdWlyZXMgWE1MX0RURCBzdXBwb3J0IGluIEV4cGF0AGxhYmVsZmxvYXQAbGFiZWxfZmxvYXQAU3BhcnNlTWF0cml4X2Zyb21fY29vcmRpbmF0ZV9mb3JtYXQAL3N2Zy93aGVhdABkZWdsaXN0X2F0AG5vZGVsaXN0X2F0AGFkal9saXN0X2F0AHNhbWVfbGlzdF9hdABwb2ludHNfYXQAdHJhcHNfYXQAY29sb3JzZWdzX2F0AHRyaWFuZ2xlc19hdABxbm9kZXNfYXQAU2F0AEFncmFwaGluZm9fdABBZ2VkZ2VpbmZvX3QAQWdub2RlaW5mb190AFx0AGZsYXRpbmRleChhZ2hlYWQoZSkpIDwgTS0+bnJvd3MAbWludXMAb3BsdXMAaGVhcnRzAHNhbXBsZXBvaW50cwBkaXJlZGdlY29uc3RyYWludHMAbGV2ZWwgYXNzaWdubWVudCBjb25zdHJhaW50cwB4eSBwc2V1ZG8tb3J0aG9nb25hbCBjb25zdHJhaW50cwB5eCBwc2V1ZG8tb3J0aG9nb25hbCBjb25zdHJhaW50cwB4eSBvcnRob2dvbmFsIGNvbnN0cmFpbnRzAHl4IG9ydGhvZ29uYWwgY29uc3RyYWludHMAbGluZSBzZWdtZW50cwBzZXRfY2VsbF9oZWlnaHRzAHJlY3RzAGFjY291bnRpbmdSZXBvcnRTdGF0cwBlbnRpdHlUcmFja2luZ1JlcG9ydFN0YXRzAFphcGZEaW5nYmF0cwByZW1pbmNyb3NzAGNvbXByZXNzAGd2dXNlcnNoYXBlX2ZpbGVfYWNjZXNzAGJyYXNzAGNsYXNzAGFwcGx5YXR0cnMAYWdtYWtlYXR0cnMAYmluZGF0dHJzAHBhcnNlX2xheWVycwBta0NsdXN0ZXJzAHJvdW5kX2Nvcm5lcnMAbWFrZV9iYXJyaWVycwBjZGF0YS5udG9wbGV2ZWwgPT0gYWdubm9kZXMoZykgLSBjZGF0YS5udmFycwBjYW5ub3QgcmVhbGxvYyBvcHMAY2Fubm90IHJlYWxsb2MgcG5scHMAZXBzAGNvcmVfbG9hZGltYWdlX3BzAGVwczpwcwBwczI6cHMAKGxpYik6cHMAZ3ZfdHJpbV96ZXJvcwBhZ3hidWZfdHJpbV96ZXJvcwB0ZXhneXJlaGVyb3MAaW1hZ2Vwb3MAdGlub3MAc2V0RWRnZUxhYmVsUG9zAFNldHRpbmcgaW5pdGlhbCBwb3NpdGlvbnMAeGxpbnRlcnNlY3Rpb25zAGNvbHVtbnMAbm9kZXNfY29udGFpbnMAZGVqYXZ1c2FucwBuaW1idXNzYW5zAGxpYmVyYXRpb25zYW5zAGZyZWVzYW5zAE9wZW5TYW5zAG9mZnNldCA9PSBuX3Rlcm1zAGRpdGVtcwBkaWFtcwBmbGF0aW5kZXgoYWd0YWlsKGUpKSA8IE0tPm5jb2xzAGNhbm5vdCByZWFsbG9jIGRxLnBubHMAY2Fubm90IHJlYWxsb2MgcG5scwBsZXZlbHMAZm9yY2VsYWJlbHMAZGlhZ29uYWxzAG1lcmdlX3JhbmtzAHNwbGl0QmxvY2tzAGludmlzAGNhbm5vdCByZWFsbG9jIHRyaXMAc2V0X2NlbGxfd2lkdGhzAENhbGN1bGF0aW5nIHNob3J0ZXN0IHBhdGhzAHllcwBzaG93Ym94ZXMAYmVhdXRpZnlfbGVhdmVzAGF0dGFjaF9lZGdlX2xhYmVsX2Nvb3JkaW5hdGVzAHBvbHlsaW5lcwBzcGxpbmVzAG9ydGhvZ29uYWwgbGluZXMAdGV4Z3lyZXRlcm1lcwBvdGltZXMAVGltZXMAZm9udG5hbWVzAHByZWZpeCBtdXN0IG5vdCBiZSBib3VuZCB0byBvbmUgb2YgdGhlIHJlc2VydmVkIG5hbWVzcGFjZSBuYW1lcwBTcGFyc2VNYXRyaXhfc3VtX3JlcGVhdF9lbnRyaWVzAHBlcmlwaGVyaWVzAEdldEJyYW5jaGVzAGYgPCBncmFwaFtqXS5uZWRnZXMAbWlubWF4X2VkZ2VzAGV4Y2hhbmdlX3RyZWVfZWRnZXMAbWFrZVN0cmFpZ2h0RWRnZXMAdW5kb0NsdXN0ZXJFZGdlcwBjb21wb3VuZEVkZ2VzAG1lcmdlX3RyZWVzAF9fY2x1c3Rlcm5vZGVzAGFnbm5vZGVzAE5EX2lkKG5wKSA9PSBuX25vZGVzAExvYWROb2RlcwBzaWRlcwBzcGFkZXMAdmVydGljZXMAY29vcmRzAHNldGJvdW5kcwBtZHMAY2RzAG1ha2VTZWxmQXJjcwBlbWl0X2VkZ2VfZ3JhcGhpY3MAY2x1YnMAY29uc29sYXMAJWxmJTJzAApTdHJpbmcgc3RhcnRpbmc6PCUuODBzAApTdHJpbmcgc3RhcnRpbmc6IiUuODBzACAlLipzACUuKnMlcyVzAGV4cGF0OiBBY2NvdW50aW5nKCVwKTogRGlyZWN0ICUxMGxsdSwgaW5kaXJlY3QgJTEwbGx1LCBhbXBsaWZpY2F0aW9uICU4LjJmJXMAICVzOiVzAF9fJWQ6JXMALyVzLyVzACVzLSVzACwlcwAgZm9udC1mYW1pbHk9IiVzACIgc3Ryb2tlLWRhc2hhcnJheT0iJXMAIiBjbGFzcz0iJXMAcG9seSAlcwAoKCVmLCVmKSwoJWYsJWYpKSAlcyAlcwBjb2xvciAlcwAgVGl0bGU6ICVzACJzdHJpY3QiOiAlcwBjb3VyAHV0cgBhcHBlbmRhdHRyAGFkZGF0dHIAYmVnaW5zdHIAc3Rydmlld19zdHIAcG92X2NvbG9yX2FzX3N0cgB2cHNjIT1udWxscHRyAGJlbmRUb1N0cgB1YXJyAGNyYXJyAGxhcnIAaGFycgBkYXJyAHVBcnIAckFycgBsQXJyAGhBcnIAZEFycgBBcHIAU3BhcnNlTWF0cml4X211bHRpcGx5X3ZlY3RvcgB0ZXJtaW5hdG9yAGluc3VsYXRvcgBpbnRlcm5hbEVudGl0eVByb2Nlc3NvcgB0ZXhneXJlY3Vyc29yAHN5bnRheCBlcnJvcgBtb25leV9nZXQgZXJyb3IARXJyb3IAcmZsb29yAGxmbG9vcgBsYWJlbGZvbnRjb2xvcgBwZW5jb2xvcgBmaWxsY29sb3IAYmdjb2xvcgByb3cgbWFqb3IAY29sdW1uIG1ham9yAG5laWdoYm9yAHN0eWxlX29yAG1yAHJhbmtkaXIAcGFnZWRpcgBsYXllcgBOb2RlQ292ZXIAL3N2Zy9zaWx2ZXIAY2x1c3RlcgBleHBhbmRDbHVzdGVyAHJwcm9tb3RlcgBscHJvbW90ZXIAY2VudGVyAG1heGl0ZXIAcGFydGlhbCBjaGFyYWN0ZXIAISByb290UGFyc2VyLT5tX3BhcmVudFBhcnNlcgBka2dyZWVuY29wcGVyAGNvb2xjb3BwZXIAZ3Zfc29ydF9jb21wYXJfd3JhcHBlcgB0YXBlcgBvdmVybGFwX2JlemllcgBmaWdfYmV6aWVyAGNvdXJpZXIAQ291cmllcgBoaWVyAGRhZ2dlcgBEYWdnZXIAb3V0cHV0b3JkZXIAcG9zdG9yZGVyAGZsYXRfcmVvcmRlcgBjZWxsYm9yZGVyAGZpeExhYmVsT3JkZXIAY3lsaW5kZXIAL3N2Zy9sYXZlbmRlcgByZW5kZXIAZm9sZGVyAGNsdXN0ZXJfbGVhZGVyAE5EX1VGX3NpemUobikgPD0gMSB8fCBuID09IGxlYWRlcgBPY3RvYmVyAHJlZmVyZW5jZSB0byBpbnZhbGlkIGNoYXJhY3RlciBudW1iZXIATm92ZW1iZXIAU2VwdGVtYmVyAERlY2VtYmVyAG1hY3IAYnIAc3RhcgBmZWxkc3BhcgByZWd1bGFyAGh0ZXh0c3BhbnNfY2xlYXIAaW9zX2Jhc2U6OmNsZWFyAGJydmJhcgBNYXIAXHIATkRfcmFuayh2KSA9PSByAHN0cmVxAHN0cnZpZXdfZXEAc3Rydmlld19zdHJfZXEAc3Rydmlld19jYXNlX3N0cl9lcQBzdHJ2aWV3X2Nhc2VfZXEAdnAAJSVCZWdpblByb2xvZwovRG90RGljdCAyMDAgZGljdCBkZWYKRG90RGljdCBiZWdpbgoKL3NldHVwTGF0aW4xIHsKbWFyawovRW5jb2RpbmdWZWN0b3IgMjU2IGFycmF5IGRlZgogRW5jb2RpbmdWZWN0b3IgMAoKSVNPTGF0aW4xRW5jb2RpbmcgMCAyNTUgZ2V0aW50ZXJ2YWwgcHV0aW50ZXJ2YWwKRW5jb2RpbmdWZWN0b3IgNDUgL2h5cGhlbiBwdXQKCiUgU2V0IHVwIElTTyBMYXRpbiAxIGNoYXJhY3RlciBlbmNvZGluZwovc3Rhcm5ldElTTyB7CiAgICAgICAgZHVwIGR1cCBmaW5kZm9udCBkdXAgbGVuZ3RoIGRpY3QgYmVnaW4KICAgICAgICB7IDEgaW5kZXggL0ZJRCBuZSB7IGRlZiB9eyBwb3AgcG9wIH0gaWZlbHNlCiAgICAgICAgfSBmb3JhbGwKICAgICAgICAvRW5jb2RpbmcgRW5jb2RpbmdWZWN0b3IgZGVmCiAgICAgICAgY3VycmVudGRpY3QgZW5kIGRlZmluZWZvbnQKfSBkZWYKL1RpbWVzLVJvbWFuIHN0YXJuZXRJU08gZGVmCi9UaW1lcy1JdGFsaWMgc3Rhcm5ldElTTyBkZWYKL1RpbWVzLUJvbGQgc3Rhcm5ldElTTyBkZWYKL1RpbWVzLUJvbGRJdGFsaWMgc3Rhcm5ldElTTyBkZWYKL0hlbHZldGljYSBzdGFybmV0SVNPIGRlZgovSGVsdmV0aWNhLU9ibGlxdWUgc3Rhcm5ldElTTyBkZWYKL0hlbHZldGljYS1Cb2xkIHN0YXJuZXRJU08gZGVmCi9IZWx2ZXRpY2EtQm9sZE9ibGlxdWUgc3Rhcm5ldElTTyBkZWYKL0NvdXJpZXIgc3Rhcm5ldElTTyBkZWYKL0NvdXJpZXItT2JsaXF1ZSBzdGFybmV0SVNPIGRlZgovQ291cmllci1Cb2xkIHN0YXJuZXRJU08gZGVmCi9Db3VyaWVyLUJvbGRPYmxpcXVlIHN0YXJuZXRJU08gZGVmCmNsZWFydG9tYXJrCn0gYmluZCBkZWYKCiUlQmVnaW5SZXNvdXJjZTogcHJvY3NldCBncmFwaHZpeiAwIDAKL2Nvb3JkLWZvbnQtZmFtaWx5IC9UaW1lcy1Sb21hbiBkZWYKL2RlZmF1bHQtZm9udC1mYW1pbHkgL1RpbWVzLVJvbWFuIGRlZgovY29vcmRmb250IGNvb3JkLWZvbnQtZmFtaWx5IGZpbmRmb250IDggc2NhbGVmb250IGRlZgoKL0ludlNjYWxlRmFjdG9yIDEuMCBkZWYKL3NldF9zY2FsZSB7CiAgICAgICBkdXAgMSBleGNoIGRpdiAvSW52U2NhbGVGYWN0b3IgZXhjaCBkZWYKICAgICAgIHNjYWxlCn0gYmluZCBkZWYKCiUgc3R5bGVzCi9zb2xpZCB7IFtdIDAgc2V0ZGFzaCB9IGJpbmQgZGVmCi9kYXNoZWQgeyBbOSBJbnZTY2FsZUZhY3RvciBtdWwgZHVwIF0gMCBzZXRkYXNoIH0gYmluZCBkZWYKL2RvdHRlZCB7IFsxIEludlNjYWxlRmFjdG9yIG11bCA2IEludlNjYWxlRmFjdG9yIG11bF0gMCBzZXRkYXNoIH0gYmluZCBkZWYKL2ludmlzIHsvZmlsbCB7bmV3cGF0aH0gZGVmIC9zdHJva2Uge25ld3BhdGh9IGRlZiAvc2hvdyB7cG9wIG5ld3BhdGh9IGRlZn0gYmluZCBkZWYKL2JvbGQgeyAyIHNldGxpbmV3aWR0aCB9IGJpbmQgZGVmCi9maWxsZWQgeyB9IGJpbmQgZGVmCi91bmZpbGxlZCB7IH0gYmluZCBkZWYKL3JvdW5kZWQgeyB9IGJpbmQgZGVmCi9kaWFnb25hbHMgeyB9IGJpbmQgZGVmCi90YXBlcmVkIHsgfSBiaW5kIGRlZgoKJSBob29rcyBmb3Igc2V0dGluZyBjb2xvciAKL25vZGVjb2xvciB7IHNldGhzYmNvbG9yIH0gYmluZCBkZWYKL2VkZ2Vjb2xvciB7IHNldGhzYmNvbG9yIH0gYmluZCBkZWYKL2dyYXBoY29sb3IgeyBzZXRoc2Jjb2xvciB9IGJpbmQgZGVmCi9ub3Bjb2xvciB7cG9wIHBvcCBwb3B9IGJpbmQgZGVmCgovYmVnaW5wYWdlIHsJJSBpIGogbnBhZ2VzCgkvbnBhZ2VzIGV4Y2ggZGVmCgkvaiBleGNoIGRlZgoJL2kgZXhjaCBkZWYKCS9zdHIgMTAgc3RyaW5nIGRlZgoJbnBhZ2VzIDEgZ3QgewoJCWdzYXZlCgkJCWNvb3JkZm9udCBzZXRmb250CgkJCTAgMCBtb3ZldG8KCQkJKFwoKSBzaG93IGkgc3RyIGN2cyBzaG93ICgsKSBzaG93IGogc3RyIGN2cyBzaG93IChcKSkgc2hvdwoJCWdyZXN0b3JlCgl9IGlmCn0gYmluZCBkZWYKCi9zZXRfZm9udCB7CglmaW5kZm9udCBleGNoCglzY2FsZWZvbnQgc2V0Zm9udAp9IGRlZgoKJSBkcmF3IHRleHQgZml0dGVkIHRvIGl0cyBleHBlY3RlZCB3aWR0aAovYWxpZ25lZHRleHQgewkJCSUgd2lkdGggdGV4dAoJL3RleHQgZXhjaCBkZWYKCS93aWR0aCBleGNoIGRlZgoJZ3NhdmUKCQl3aWR0aCAwIGd0IHsKCQkJW10gMCBzZXRkYXNoCgkJCXRleHQgc3RyaW5nd2lkdGggcG9wIHdpZHRoIGV4Y2ggc3ViIHRleHQgbGVuZ3RoIGRpdiAwIHRleHQgYXNob3cKCQl9IGlmCglncmVzdG9yZQp9IGRlZgoKL2JveHByaW0gewkJCQklIHhjb3JuZXIgeWNvcm5lciB4c2l6ZSB5c2l6ZQoJCTQgMiByb2xsCgkJbW92ZXRvCgkJMiBjb3B5CgkJZXhjaCAwIHJsaW5ldG8KCQkwIGV4Y2ggcmxpbmV0bwoJCXBvcCBuZWcgMCBybGluZXRvCgkJY2xvc2VwYXRoCn0gYmluZCBkZWYKCi9lbGxpcHNlX3BhdGggewoJL3J5IGV4Y2ggZGVmCgkvcnggZXhjaCBkZWYKCS95IGV4Y2ggZGVmCgkveCBleGNoIGRlZgoJbWF0cml4IGN1cnJlbnRtYXRyaXgKCW5ld3BhdGgKCXggeSB0cmFuc2xhdGUKCXJ4IHJ5IHNjYWxlCgkwIDAgMSAwIDM2MCBhcmMKCXNldG1hdHJpeAp9IGJpbmQgZGVmCgovZW5kcGFnZSB7IHNob3dwYWdlIH0gYmluZCBkZWYKL3Nob3dwYWdlIHsgfSBkZWYKCi9sYXllcmNvbG9yc2VxCglbCSUgbGF5ZXIgY29sb3Igc2VxdWVuY2UgLSBkYXJrZXN0IHRvIGxpZ2h0ZXN0CgkJWzAgMCAwXQoJCVsuMiAuOCAuOF0KCQlbLjQgLjggLjhdCgkJWy42IC44IC44XQoJCVsuOCAuOCAuOF0KCV0KZGVmCgovbGF5ZXJsZW4gbGF5ZXJjb2xvcnNlcSBsZW5ndGggZGVmCgovc2V0bGF5ZXIgey9tYXhsYXllciBleGNoIGRlZiAvY3VybGF5ZXIgZXhjaCBkZWYKCWxheWVyY29sb3JzZXEgY3VybGF5ZXIgMSBzdWIgbGF5ZXJsZW4gbW9kIGdldAoJYWxvYWQgcG9wIHNldGhzYmNvbG9yCgkvbm9kZWNvbG9yIHtub3Bjb2xvcn0gZGVmCgkvZWRnZWNvbG9yIHtub3Bjb2xvcn0gZGVmCgkvZ3JhcGhjb2xvciB7bm9wY29sb3J9IGRlZgp9IGJpbmQgZGVmCgovb25sYXllciB7IGN1cmxheWVyIG5lIHtpbnZpc30gaWYgfSBkZWYKCi9vbmxheWVycyB7CgkvbXl1cHBlciBleGNoIGRlZgoJL215bG93ZXIgZXhjaCBkZWYKCWN1cmxheWVyIG15bG93ZXIgbHQKCWN1cmxheWVyIG15dXBwZXIgZ3QKCW9yCgl7aW52aXN9IGlmCn0gZGVmCgovY3VybGF5ZXIgMCBkZWYKCiUlRW5kUmVzb3VyY2UKJSVFbmRQcm9sb2cKJSVCZWdpblNldHVwCjE0IGRlZmF1bHQtZm9udC1mYW1pbHkgc2V0X2ZvbnQKJSAvYXJyb3dsZW5ndGggMTAgZGVmCiUgL2Fycm93d2lkdGggNSBkZWYKCiUgbWFrZSBzdXJlIHBkZm1hcmsgaXMgaGFybWxlc3MgZm9yIFBTLWludGVycHJldGVycyBvdGhlciB0aGFuIERpc3RpbGxlcgovcGRmbWFyayB3aGVyZSB7cG9wfSB7dXNlcmRpY3QgL3BkZm1hcmsgL2NsZWFydG9tYXJrIGxvYWQgcHV0fSBpZmVsc2UKJSBtYWtlICc8PCcgYW5kICc+Picgc2FmZSBvbiBQUyBMZXZlbCAxIGRldmljZXMKL2xhbmd1YWdlbGV2ZWwgd2hlcmUge3BvcCBsYW5ndWFnZWxldmVsfXsxfSBpZmVsc2UKMiBsdCB7CiAgICB1c2VyZGljdCAoPDwpIGN2biAoWykgY3ZuIGxvYWQgcHV0CiAgICB1c2VyZGljdCAoPj4pIGN2biAoWykgY3ZuIGxvYWQgcHV0Cn0gaWYKCiUlRW5kU2V0dXAAc3VwAGdyb3VwAGN1cAB0aGluc3AAZW5zcABlbXNwAG5ic3AAcGVycAB3ZWllcnAAZ2VuZXJhdGUtY29uc3RyYWludHMuY3BwAGJsb2NrLmNwcABjc29sdmVfVlBTQy5jcHAAf3RvcABwcm9wAGFneGJwb3AAbm9wAGFzeW1wAGNvbXAAZmluZENDb21wAGJtcABzY2FsZV9jbGFtcAB4bHAAbHAgIT0gY2xwAHRhaWxfbHAAaGVhZF9scAB0YWlsdG9vbHRpcABsYWJlbHRvb2x0aXAAZWRnZXRvb2x0aXAAaGVhZHRvb2x0aXAAaGVsbGlwAHRhaWxjbGlwAGhlYWRjbGlwAC9zdmcvcGFwYXlhd2hpcABocAB0cmFuc3Bvc2Vfc3RlcABjb21wdXRlU3RlcABsYXllcmxpc3RzZXAAbGF5ZXJzZXAAaXBzZXAAcmFua3NlcABub2Rlc2VwAHN1YmdyYXBocyBuZXN0ZWQgbW9yZSB0aGFuICVkIGRlZXAAU2VwAHNmZHAAY3AAd2VicABpZG1hcABjbHVzdGVyX21hcABjbWFweDptYXAAZXBzOm1hcABjbWFweF9ucDptYXAAaW1hcF9ucDptYXAAaXNtYXA6bWFwAGltYXA6bWFwAGNtYXA6bWFwAHN2ZzptYXAAanBnOm1hcABwbmc6bWFwAGpwZWc6bWFwAGdpZjptYXAAanBlOm1hcABvdmVybGFwAGxldmVsc2dhcABjYXAAS1BfVXAAJUk6JU06JVMgJXAAc3RhcnQgPD0gcAByc3F1bwBsc3F1bwByZHF1bwBsZHF1bwBiZHF1bwBzYnF1bwByc2FxdW8AbHNhcXVvAHJhcXVvAGxhcXVvAGF1dG8ATnVuaXRvAC9zdmcvdG9tYXRvAG5lYXRvAGV1cm8AL3N2Zy9nYWluc2Jvcm8ATWV0aG9kWmVybwBtaWNybwBuaW1idXNtb25vAGxpYmVyYXRpb25tb25vAGZyZWVtb25vAGFyaW1vAHJhdGlvAHBvcnRobwByaG8AUmhvAC9zdmcvaW5kaWdvAHBpbmZvAGNjZ3JhcGhpbmZvAGNjZ25vZGVpbmZvAGNsX2VkZ2VfaW5mbwBnZXRQYWNrSW5mbwBtYWtlSW5mbwBwYXJzZVBhY2tNb2RlSW5mbwBjaXJjbwBpY28AXCUwM28AL3N2Zy9yb3N5YnJvd24AL3N2Zy9zYW5keWJyb3duAHZlcnlkYXJrYnJvd24AL3N2Zy9zYWRkbGVicm93bgAvc3ZnL2Jyb3duAEtQX0Rvd24AY2Fubm90IGNoYW5nZSBzZXR0aW5nIG9uY2UgcGFyc2luZyBoYXMgYmVndW4AU3VuAEp1bgB0aG9ybgAvc3ZnL2NyaW1zb24AeGRvdF9qc29uAHhkb3RfanNvbjpqc29uAGpzb24wOmpzb24Ab21pY3JvbgBPbWljcm9uAHNjYXJvbgBTY2Fyb24Ad2VibWFyb29uAHgxMW1hcm9vbgAvc3ZnL21hcm9vbgAvc3ZnL2xpZ2h0c2FsbW9uAC9zdmcvZGFya3NhbG1vbgAvc3ZnL3NhbG1vbgB1cHNpbG9uAGVwc2lsb24AVXBzaWxvbgBFcHNpbG9uAHJlc29sdXRpb24AZGlzdG9ydGlvbgBzdGQ6OmV4Y2VwdGlvbgBwYXJ0aXRpb24AZG90X3Bvc2l0aW9uAFNldHRpbmcgdXAgc3RyZXNzIGZ1bmN0aW9uAHVuY2xvc2VkIENEQVRBIHNlY3Rpb24AcG9zdGFjdGlvbgByb3RhdGlvbgBvcmllbnRhdGlvbgBhYm9taW5hdGlvbgBhY2NvdW50aW5nR2V0Q3VycmVudEFtcGxpZmljYXRpb24AeGRvdHZlcnNpb24AU1RzZXRVbmlvbgA8cG9seWdvbgBoZXhhZ29uAHNlcHRhZ29uAHBlbnRhZ29uAHRyaXBsZW9jdGFnb24AZG91Ymxlb2N0YWdvbgAvc3ZnL2xlbW9uY2hpZmZvbgBNb24AcGx1c21uAG5vdGluAGlzaW4AL3N2Zy9tb2NjYXNpbgBwaW4AbWluAHZvcm9fbWFyZ2luAGluZmluAG9uZWRfb3B0aW1pemVyX3RyYWluAHBsYWluAG1ha2VfY2hhaW4AbWVyZ2VfY2hhaW4AZGVsZXRlTWluAGZpbmRNaW4AdmFsaWduAGJhbGlnbgB5ZW4ATXVsdGlsZXZlbF9jb2Fyc2VuAGN1cnJlbgBQb2Jzb3BlbgBndl9mb3BlbgBndnVzZXJzaGFwZV9vcGVuAGVudGl0eVRyYWNraW5nT25PcGVuAC9zdmcvbGluZW4AZGltZW4AbWlubGVuAHN0eWxlX3Rva2VuAHVuY2xvc2VkIHRva2VuAC9zdmcveWVsbG93Z3JlZW4AbWVkaXVtZm9yZXN0Z3JlZW4AL3N2Zy9mb3Jlc3RncmVlbgAvc3ZnL2xpZ2h0Z3JlZW4AaHVudGVyc2dyZWVuAC9zdmcvbGF3bmdyZWVuAC9zdmcvZGFya2dyZWVuAC9zdmcvbWVkaXVtc3ByaW5nZ3JlZW4AL3N2Zy9zcHJpbmdncmVlbgAvc3ZnL2RhcmtvbGl2ZWdyZWVuAC9zdmcvbGltZWdyZWVuAC9zdmcvcGFsZWdyZWVuAHdlYmdyZWVuAC9zdmcvbGlnaHRzZWFncmVlbgAvc3ZnL21lZGl1bXNlYWdyZWVuAC9zdmcvZGFya3NlYWdyZWVuAC9zdmcvc2VhZ3JlZW4AeDExZ3JlZW4AL3N2Zy9ncmVlbgBHcmVlbgAvc3ZnL2xpZ2h0Y3lhbgAvc3ZnL2RhcmtjeWFuAC9zdmcvY3lhbgBuZXd0YW4AZGFya3RhbgAvc3ZnL3RhbgByb3dzcGFuAGNvbHNwYW4AbmFuAHRpbWVzbmV3cm9tYW4AbmltYnVzcm9tYW4AdGltZXNyb21hbgBUaW1lcy1Sb21hbgBQYWxhdGluby1Sb21hbgBOZXdDZW50dXJ5U2NobGJrLVJvbWFuAEphbgBHRF9yYW5rKGcpW3JdLm4gPD0gR0RfcmFuayhnKVtyXS5hbgBhZ3hicHV0X24AXG4Abl9ub2RlcyA9PSBncmFwaC0+bgBBLT5tID09IEEtPm4Aam9iLT5vYmotPnUubgBzLCVsZiwlbGYlbgAgZSwlbGYsJWxmJW4AJWQgJTFbIl0lbgB2ID09IG4AbnpjID09IG4AYiA9PSBuAG5jbHVzdGVyIDw9IG4AcHN5bQBhbGVmc3ltAHRoZXRhc3ltAHF1YW50dW0Ac3VtAC9zdmcvcGx1bQBpbnZ0cmFwZXppdW0AbWVkaXVtADk6cHJpc20AbHJtAGN1c3RvbQBhcHRyLT50YWcgPT0gVF9hdG9tAC9kZXYvdXJhbmRvbQBndl9yYW5kb20AcmxtAHNpbQBJTURTX2dpdmVuX2RpbQBvcmRtAHBhcmFsbGVsb2dyYW0AL3N2Zy9taW50Y3JlYW0ASnVsAHRsAGZyYXNsAFN5bWJvbABmaW5kQ29sADw/eG1sAHl1bWwAdXVtbABvdW1sAGl1bWwAZXVtbABhdW1sAFl1bWwAVXVtbABPdW1sAEl1bWwARXVtbABBdW1sAGNvcmVfbG9hZGltYWdlX3ZybWwAanBnOnZybWwAcG5nOnZybWwAanBlZzp2cm1sAGdpZjp2cm1sAGpwZTp2cm1sAGJ1bGwAZmlsbAAvc3ZnL3NlYXNoZWxsAGZvcmFsbABBcHJpbABwZXJtaWwAcmNlaWwAbGNlaWwAY2NlZGlsAENjZWRpbABhcnJvd3RhaWwAbHRhaWwAc2FtZXRhaWwAbGV2ZWwgPj0gMCAmJiBsZXZlbCA8PSBuLT5sZXZlbABzdHJlc3NfbWFqb3JpemF0aW9uX2tEX21rZXJuZWwAaXNfcGFyYWxsZWwAQ2FsY3VsYXRpbmcgY2lyY3VpdCBtb2RlbABDYWxjdWxhdGluZyBzdWJzZXQgbW9kZWwAQ2FsY3VsYXRpbmcgTURTIG1vZGVsAHhsYWJlbAB0YWlsbGFiZWwAaGVhZGxhYmVsAG1ha2VfbGFiZWwAZ3JhcGggbGFiZWwAaWV4Y2wAb2JqcC0+bGJsAG92YWwAbWVyZ2V2aXJ0dWFsAC9zdmcvbGlnaHRjb3JhbAAvc3ZnL2NvcmFsAFNwYXJzZU1hdHJpeF9mcm9tX2Nvb3JkaW5hdGVfYXJyYXlzX2ludGVybmFsAE11bHRpbGV2ZWxfY29hcnNlbl9pbnRlcm5hbABRdWFkVHJlZV9hZGRfaW50ZXJuYWwAYXJyb3dfbGVuZ3RoX25vcm1hbABhcmlhbAByYWRpYWwAL3N2Zy90ZWFsAHJlYWwAbG9jYWwAZXN0aW1hdGVfY2hhcmFjdGVyX3dpZHRoX2Nhbm9uaWNhbABnbG9iYWwAcS0+bAAuLi8uLi9saWIvY2dyYXBoL3NjYW4ubAB0azp0awBnaWY6dGsAcGF0Y2h3b3JrAHRvawBib29rAEF2YW50R2FyZGUtQm9vawBzaW5rAG92ZXJsYXBfc2hyaW5rAHNwaWN5cGluawAvc3ZnL2hvdHBpbmsAL3N2Zy9saWdodHBpbmsAL3N2Zy9kZWVwcGluawBuZW9ucGluawAvc3ZnL3BpbmsAbmV3cmFuawBjbHVzdGVycmFuawBfbmV3X3JhbmsAaW5zdGFsbF9pbl9yYW5rAHJlbW92ZV9mcm9tX3JhbmsAL3N2Zy9jb3Juc2lsawBvbmVibG9jawB2LT5sZWZ0LT5ibG9jayA9PSB2LT5yaWdodC0+YmxvY2sAL3N2Zy9maXJlYnJpY2sAUFFjaGVjawBwYWNrAC9zdmcvYmxhY2sAQmxhY2sAc2ZvbnRfYmFjawByb3dzX2JhY2sAdHN0c19iYWNrAGNvbG9yc2Vnc19iYWNrAHNmb250X3BvcF9iYWNrAHRzdHNfcG9wX2JhY2sAZXN0YWNrX3BvcF9iYWNrAGRmc19zdGFja19wb3BfYmFjawBkZnNfc3RhY2tfYmFjawB6d2oAenduagBqb2ItPm9iagBnZXRpbnRyc3hpAHBzaQBQc2kAQ2FsaWJyaQBGcmkAdHdvcGkAZHBpAHZvcm9ub2kAVm9yb25vaQBjaGFuaQBkZW1pAEJvb2ttYW4tRGVtaQBBdmFudEdhcmRlLURlbWkAL3N2Zy9kYXJra2hha2kAL3N2Zy9raGFraQBwaGkAY2hpAFBoaQBDaGkAZGkAWGkAUGkATkRfaWQobnApID09IGkAU3RyZXNzTWFqb3JpemF0aW9uU21vb3RoZXJfc21vb3RoAFNwcmluZ1Ntb290aGVyX3Ntb290aABib3RoAHN0YXJ0c3dpdGgAbGluZWxlbmd0aABiYWRfYXJyYXlfbmV3X2xlbmd0aABhdmVyYWdlX2VkZ2VfbGVuZ3RoAGV0aABwZW53aWR0aABsd2lkdGgAc2V0bGluZXdpZHRoAHNob3J0cGF0aABmb250cGF0aABQb2JzcGF0aABiZWdpbnBhdGgAaW1hZ2VwYXRoAGVuZHBhdGgAc3RyYWlnaHRfcGF0aABtYXBfcGF0aAA8cGF0aABjYW5ub3QgZmluZCB0cmlhbmdsZSBwYXRoAC9zdmcvbGF2ZW5kZXJibHVzaABmbGVzaABvc2xhc2gAT3NsYXNoAGR0c3RyaGFzaABzdHJkaWN0X2hhc2gAbmRhc2gAbWRhc2gAZGlncmFwaABzdWJncmFwaABjb25zdHJ1Y3RfZ3JhcGgAY2hrU2dyYXBoAGNsb3Nlc3RfcGFpcnMyZ3JhcGgAYWdkZWxldGUgb24gd3JvbmcgZ3JhcGgAY29ubmVjdEdyYXBoAG1rTWF6ZUdyYXBoAHVwc2loACVzbGluZS10aHJvdWdoAGZsYXRfc2VhcmNoAGNoYW5TZWFyY2gAUlRyZWVTZWFyY2gATWFyY2gARGlzY29uQnJhbmNoAFBpY2tCcmFuY2gAQWRkQnJhbmNoAC4uLy4uL2xpYi91dGlsL2JpdGFycmF5LmgALi4vLi4vbGliL3V0aWwvc3Rydmlldy5oAC4uLy4uL2xpYi9jaXJjb2dlbi9ub2RlbGlzdC5oAC4uLy4uL2xpYi91dGlsL3NvcnQuaAAuLi8uLi9saWIvY2dyYXBoL25vZGVfc2V0LmgALi4vLi4vbGliL2NvbW1vbi9ib3hlcy5oAC4uLy4uL2xpYi9vcnRoby9zdHJ1Y3R1cmVzLmgALi4vLi4vbGliL2RvdGdlbi9kb3Rwcm9jcy5oAC4uLy4uL2xpYi91dGlsL3N0cmVxLmgALi4vLi4vbGliL29ydGhvL3RyYXAuaAAuLi8uLi9saWIvdXRpbC9zdGFydHN3aXRoLmgALi4vLi4vbGliL3V0aWwvZ3ZfbWF0aC5oAC4uLy4uL2xpYi9vcnRoby9yYXdncmFwaC5oAC4uLy4uL2xpYi91dGlsL2FneGJ1Zi5oAC4uLy4uL2xpYi91dGlsL3Rva2VuaXplLmgALi4vLi4vbGliL2NvbW1vbi9odG1sdGFibGUuaAAuLi8uLi9saWIvdXRpbC9hbGxvYy5oAGF1eGcAY29yZV9sb2FkaW1hZ2Vfc3ZnAHN2ZzpzdmcAanBnOnN2ZwBwbmc6c3ZnAGpwZWc6c3ZnAGdpZjpzdmcAanBlOnN2ZwBzdmdfaW5saW5lOnN2ZwBBdWcAZG9Qcm9sb2cAcG93ZXJfaXRlcmF0aW9uX29ydGhvZwBwbmcAaWRlYWxfZGlzdF9zY2hlbWUgdmFsdWUgd3JvbmcAeGRvdCB2ZXJzaW9uICIlcyIgdG9vIGxvbmcAY29uZwBsYmxlbmNsb3NpbmcAYmFzaWNfc3RyaW5nAGZhaWx1cmUgbWFsbG9jJ2luZyBmb3IgcmVzdWx0IHN0cmluZwBzcHJpbmcAb3JkZXJpbmcAZ2VuZXJhdGVSYW5kb21PcmRlcmluZwBhcmluZwBBcmluZwBEYW1waW5nAFdhcm5pbmcAb3ZlcmxhcF9zY2FsaW5nAHggYW5kIHkgc2NhbGluZwBvbGQgc2NhbGluZwBzbW9vdGhpbmcAdW5rbm93biBlbmNvZGluZwBtdWx0aWxldmVsX3NwcmluZ19lbGVjdHJpY2FsX2VtYmVkZGluZwBzcHJpbmdfZWxlY3RyaWNhbF9zcHJpbmdfZW1iZWRkaW5nAGNlbGxwYWRkaW5nAGNlbGxzcGFjaW5nAHJhbmcAbGFuZwBmaXZlcG92ZXJoYW5nAHRocmVlcG92ZXJoYW5nAG5vdmVyaGFuZwBlbWl0X2h0bWxfaW1nAGxnAG9yaWcAc3psaWcAb2VsaWcAYWVsaWcAT0VsaWcAQUVsaWcAY29yZV9sb2FkaW1hZ2VfZmlnAGpwZzpmaWcAcG5nOmZpZwBmaWc6ZmlnAGpwZWc6ZmlnAGdpZjpmaWcAanBlOmZpZwBlZ2cAbmV4dF9zZWcAcmVnAGpwZWcAaSA9PSBkZWcAZGcAY2cAY2xvc2VzdWJnAG1pc21hdGNoZWQgdGFnAGJlei0+c2ZsYWcAYmV6LT5lZmxhZwAhKmZsYWcAIWZsYWcAPGcAJS41ZywlLjVnLCUuNWcsJS41ZwAlLjVnICUuNWcAJWcgJWcAYm94SW50ZXJzZWN0ZgBlcHNmAGFnZWRnZXNlcWNtcGYAY2N3cm90YXRlcGYAZm5vZgBpbmYAc2VsZgBoYWxmACVsZiVsZiVsZiVsZgAlbGYsJWxmLCVsZiwlbGYsJWxmACUqZiAlKmYgJWxmICVsZgBsaWJlcmF0aW9uc2VyaWYAZnJlZXNlcmlmAHNhbnMtU2VyaWYAZ2lmAC9zdmcvcGVhY2hwdWZmAHJpZmYAYWNjb3VudGluZ1JlcG9ydERpZmYAdGFpbGhyZWYAbGFiZWxocmVmAGVkZ2VocmVmAGhlYWRocmVmAG9yZGYAcGRmAHNpZ21hZgBcZgAlLjBMZgAlTGYAdXMtPmYAJS4wM2YAJXMgdHJhbnNtaXQgJS4zZgByZ2I8JTkuM2YsICU5LjNmLCAlOS4zZj4gdHJhbnNtaXQgJS4zZgAlLjAyZgAlLjJmACUuMGYsJS4wZiwlLjBmLCUuMGYAICUuMGYsJS4wZgAlLjBmICUuMGYgJS4wZiAlLjBmACIgZmlsbC1vcGFjaXR5PSIlZgAiIHN0cm9rZS1vcGFjaXR5PSIlZgAKZmluYWwgZSA9ICVmAGJyb256ZQBhcnJvd3NpemUAbGFiZWxmb250c2l6ZQBzZWFyY2hzaXplAGZpeGVkc2l6ZQBub2RlbGlzdF9zaXplAG5vZGVfc2V0X3NpemUAdHJhcHNfc2l6ZQBjZWxsc19zaXplAG5vZGVzX3NpemUAdGV4dHNwYW5fc2l6ZQBzdmdfc2l6ZQBjYXBhY2l0eSA+IGRpY3QtPnNpemUAY2FwYWNpdHkgPiBzZWxmLT5zaXplAGJ6LnNpemUAcG9pbnQtc2l6ZQBub3JtYWxpemUAbWtNYXplAGljdXJ2ZQBub2RlbGlzdF9yZW1vdmUAYWRqX2xpc3RfcmVtb3ZlAG5vZGVfc2V0X3JlbW92ZQBzdHJkaWN0X3JlbW92ZQBzb2x2ZQAhdi0+YWN0aXZlAC1hY3RpdmUAZm9udF9pbl9saXN0X3Blcm1pc3NpdmUAL3N2Zy9vbGl2ZQB1Z3JhdmUAb2dyYXZlAGlncmF2ZQBlZ3JhdmUAYWdyYXZlAFVncmF2ZQBPZ3JhdmUASWdyYXZlAEVncmF2ZQBBZ3JhdmUAdHJ1ZQAvc3ZnL2Jpc3F1ZQBvYmxpcXVlAEF2YW50R2FyZGUtQm9va09ibGlxdWUAQXZhbnRHYXJkZS1EZW1pT2JsaXF1ZQBIZWx2ZXRpY2EtTmFycm93LUJvbGRPYmxpcXVlAENvdXJpZXItQm9sZE9ibGlxdWUASGVsdmV0aWNhLUJvbGRPYmxpcXVlAEhlbHZldGljYS1OYXJyb3ctT2JsaXF1ZQBDb3VyaWVyLU9ibGlxdWUASGVsdmV0aWNhLU9ibGlxdWUAbmF2eWJsdWUAL3N2Zy9saWdodHNreWJsdWUAL3N2Zy9kZWVwc2t5Ymx1ZQAvc3ZnL3NreWJsdWUAbmV3bWlkbmlnaHRibHVlAC9zdmcvbWlkbmlnaHRibHVlAC9zdmcvbGlnaHRibHVlAC9zdmcvY2FkZXRibHVlAC9zdmcvY29ybmZsb3dlcmJsdWUAL3N2Zy9kb2RnZXJibHVlAC9zdmcvcG93ZGVyYmx1ZQBuZW9uYmx1ZQAvc3ZnL21lZGl1bWJsdWUAL3N2Zy9saWdodHN0ZWVsYmx1ZQAvc3ZnL3N0ZWVsYmx1ZQAvc3ZnL3JveWFsYmx1ZQAvc3ZnL2RhcmtibHVlAHJpY2hibHVlAGxpZ2h0c2xhdGVibHVlAC9zdmcvbWVkaXVtc2xhdGVibHVlAC9zdmcvZGFya3NsYXRlYmx1ZQAvc3ZnL3NsYXRlYmx1ZQAvc3ZnL2FsaWNlYmx1ZQAvc3ZnL2JsdWUAY2FsbFN0b3JlRW50aXR5VmFsdWUAc3RvcmVBdHRyaWJ1dGVWYWx1ZQBCbHVlAG5lYXRvX2VucXVldWUAVHVlAGNvbnZlcnRTUHRvUm91dGUAeWFjdXRlAHVhY3V0ZQBvYWN1dGUAaWFjdXRlAGVhY3V0ZQBhYWN1dGUAWWFjdXRlAFVhY3V0ZQBPYWN1dGUASWFjdXRlAEVhY3V0ZQBBYWN1dGUAcmVmZXJlbmNlIHRvIGV4dGVybmFsIGVudGl0eSBpbiBhdHRyaWJ1dGUAZHVwbGljYXRlIGF0dHJpYnV0ZQBub3RlAHByaW1lcnNpdGUAcmlib3NpdGUAcmVzdHJpY3Rpb25zaXRlAHByb3RlYXNlc2l0ZQAvc3ZnL2dob3N0d2hpdGUAL3N2Zy9uYXZham93aGl0ZQAvc3ZnL2Zsb3JhbHdoaXRlAC9zdmcvYW50aXF1ZXdoaXRlAC9zdmcvd2hpdGUAV2hpdGUAcG9wX29ial9zdGF0ZQBwY3Bfcm90YXRlAGNvbmNlbnRyYXRlAGRlY29yYXRlAFF1YWRUcmVlX3JlcHVsc2l2ZV9mb3JjZV9hY2N1bXVsYXRlAG5vdHJhbnNsYXRlAC9zdmcvY2hvY29sYXRlAGdlb21VcGRhdGUAaW52aG91c2UAL3N2Zy9jaGFydHJldXNlAG5vZGVsaXN0X3JldmVyc2UAWE1MX1BhcnNlADxlbGxpcHNlAGR1c3R5cm9zZQAvc3ZnL21pc3R5cm9zZQBTcGFyc2VNYXRyaXhfdHJhbnNwb3NlAGFnY2xvc2UAZW50aXR5VHJhY2tpbmdPbkNsb3NlAFNwYXJzZU1hdHJpeF9tdWx0aXBseV9kZW5zZQBmYWxzZQAvc3ZnL21lZGl1bXR1cnF1b2lzZQAvc3ZnL2Rhcmt0dXJxdW9pc2UAL3N2Zy9wYWxldHVycXVvaXNlAC9zdmcvdHVycXVvaXNlAHBoYXNlAC9zdmcvYXp1cmUAc2lnbmF0dXJlAGNvcmUATXNxdWFyZQBQYWxhdGlubyBMaW5vdHlwZQBBLT50eXBlID09IEItPnR5cGUAc3VwZQBlbGxpcHNlX3RhbmdlbnRfc2xvcGUAZ3ZyZW5kZXJfdXNlcnNoYXBlAG1pdGVyX3NoYXBlAGxhbmRzY2FwZQBMYW5kc2NhcGUASnVuZQBub25lAGRvY3VtZW50IGlzIG5vdCBzdGFuZGFsb25lAGNvdXNpbmUAL3N2Zy9tZWRpdW1hcXVhbWFyaW5lAC9zdmcvYXF1YW1hcmluZQA8cG9seWxpbmUAJXNvdmVybGluZQB1bmRlcmxpbmUAUHJvdXRlc3BsaW5lAGxpbmVhcl9zcGxpbmUAYl9zcGxpbmUAb2xpbmUAYWd4YnVmX2lzX2lubGluZQBzdmdfaW5saW5lAHJlZmluZQBwcmltZQBQcmltZQAvc3ZnL2xpbWUAY29sb3JzY2hlbWUAbGFiZWxfc2NoZW1lAHNhbWUAbGFiZWxmb250bmFtZQBVRl9zZXRuYW1lAGZvbnRfbmFtZQBmb250LT5uYW1lAHVzLT5uYW1lAHJlc2VydmVkIHByZWZpeCAoeG1sKSBtdXN0IG5vdCBiZSB1bmRlY2xhcmVkIG9yIGJvdW5kIHRvIGFub3RoZXIgbmFtZXNwYWNlIG5hbWUAc3R5bGUAL3N2Zy90aGlzdGxlAHRpdGxlAC9zdmcvbWVkaXVtcHVycGxlAGRhcmtwdXJwbGUAd2VicHVycGxlAHJlYmVjY2FwdXJwbGUAdmVyeV9saWdodF9wdXJwbGUAbWVkX3B1cnBsZQB4MTFwdXJwbGUAL3N2Zy9wdXJwbGUAc2hhcGVmaWxlAGdyYWRpZW50YW5nbGUAcmVjdGFuZ2xlAFJlY3RhbmdsZQBsYWJlbGFuZ2xlAGludnRyaWFuZ2xlAGRlc3RpbmF0aW9uIHBvaW50IG5vdCBpbiBhbnkgdHJpYW5nbGUAc291cmNlIHBvaW50IG5vdCBpbiBhbnkgdHJpYW5nbGUAZGZzQ3ljbGUAZG91YmxlY2lyY2xlAE1jaXJjbGUAaW52aXNpYmxlAHRob3JuZGFsZQBpbnB1dHNjYWxlAG9zY2FsZQBpbWFnZXNjYWxlAC9zdmcvd2hpdGVzbW9rZQBtYW5kYXJpbm9yYW5nZQAvc3ZnL2RhcmtvcmFuZ2UAL3N2Zy9vcmFuZ2UAL3N2Zy9iZWlnZQBuZXdlZGdlAGRlbGV0ZV9mYXN0X2VkZ2UAZGVsZXRlX2ZsYXRfZWRnZQBhZGRfdHJlZV9lZGdlAG1ha2VTdHJhaWdodEVkZ2UAbWFrZVNlbGZFZGdlAG1ha2VDb21wb3VuZEVkZ2UAIXVzZV9zdGFnZQBvc2FnZQBwYWdlAGd2bG9hZGltYWdlAHZlZQB0ZWUAUVVBRF9UUkVFX0hZQlJJRCwgc2l6ZSBsYXJnZXIgdGhhbiAlZCwgc3dpdGNoIHRvIGZhc3QgcXVhZHRyZWUAZmVhc2libGVfdHJlZQBTcGFyc2VNYXRyaXhfZGl2aWRlX3Jvd19ieV9kZWdyZWUAbm9kZWxpc3RfZnJlZQBzZm9udF9mcmVlAG5vZGVfc2V0X2ZyZWUAcm93c19mcmVlAGNlbGxzX2ZyZWUAbmV3bm9kZQBpbnN0YWxsbm9kZQBhZ25vZGUAZGVsZXRlX2Zhc3Rfbm9kZQBwYWNrbW9kZQBTcGxpdE5vZGUAb3RpbGRlAG50aWxkZQBhdGlsZGUAT3RpbGRlAE50aWxkZQBBdGlsZGUAZGl2aWRlAHRyYWRlAGdyYXBodml6X25vZGVfaW5kdWNlAHNvdXJjZQByZXB1bHNpdmVmb3JjZQBpbGxlZ2FsIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlAGVycm9yIGluIHByb2Nlc3NpbmcgZXh0ZXJuYWwgZW50aXR5IHJlZmVyZW5jZQByZWN1cnNpdmUgZW50aXR5IHJlZmVyZW5jZQBsYWJlbGRpc3RhbmNlAFRCX2JhbGFuY2UAVEJiYWxhbmNlAGRldmljZQBtb25vc3BhY2UAL3N2Zy9vbGRsYWNlAGZhY2UAc3ViZQAgLWFuY2hvciBlAHMxLT5jb21tX2Nvb3JkPT1zMi0+Y29tbV9jb29yZABNcmVjb3JkAGZvcndhcmQAcHJvZABsaWdodGdvbGRlbnJvZABtZWRpdW1nb2xkZW5yb2QAL3N2Zy9kYXJrZ29sZGVucm9kAC9zdmcvcGFsZWdvbGRlbnJvZAAvc3ZnL2dvbGRlbnJvZAAvc3ZnL2J1cmx5d29vZABsaWdodHdvb2QAbWVkaXVtd29vZABkYXJrd29vZABfYmFja2dyb3VuZABjb21wb3VuZABubyBlbGVtZW50IGZvdW5kAGZhdGFsIGZsZXggc2Nhbm5lciBpbnRlcm5hbCBlcnJvci0tbm8gYWN0aW9uIGZvdW5kAC9zdmcvYmxhbmNoZWRhbG1vbmQAYXJyb3dfbGVuZ3RoX2RpYW1vbmQATWRpYW1vbmQAbm9kZV9zZXRfZmluZABzdHJkaWN0X2ZpbmQAZ3Z1c2Vyc2hhcGVfZmluZABub2RlbGlzdF90cnlfYXBwZW5kAGVkZ2VfbGlzdF90cnlfYXBwZW5kAHNmb250X3RyeV9hcHBlbmQAdHJhcHNfdHJ5X2FwcGVuZABjZWxsc190cnlfYXBwZW5kAG5vZGVzX3RyeV9hcHBlbmQAbm9kZV9xdWV1ZV90cnlfYXBwZW5kAGV4cGFuZABjdW1iZXJsYW5kAGJyaWdodGdvbGQAb2xkZ29sZAAvc3ZnL2dvbGQAYm9sZABIZWx2ZXRpY2EtTmFycm93LUJvbGQAVGltZXMtQm9sZABDb3VyaWVyLUJvbGQAUGFsYXRpbm8tQm9sZABOZXdDZW50dXJ5U2NobGJrLUJvbGQASGVsdmV0aWNhLUJvbGQAJTAqbGxkACUqbGxkACslbGxkAG4tPmJyYW5jaFtpXS5jaGlsZAAlKy40bGQAJXMlbGQAc29saWQAL3N2Zy9tZWRpdW1vcmNoaWQAL3N2Zy9kYXJrb3JjaGlkAC9zdmcvb3JjaGlkAGlsbGVnYWwgY2hhcmFjdGVyKHMpIGluIHB1YmxpYyBpZABkaWprc3RyYV9zZ2QAZml4ZWQAY3VydmVkAGRlcml2ZWQAZG90dGVkAG1lbW9yeSBleGhhdXN0ZWQAbG9jYWxlIG5vdCBzdXBwb3J0ZWQAcGFyc2luZyBhYm9ydGVkAHBhcnNlciBub3Qgc3RhcnRlZABhdHRyaWJ1dGUgbWFjcm9zIG5vdCBpbXBsZW1lbnRlZABhY2NvdW50aW5nRGlmZlRvbGVyYXRlZABmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLWVuZCBvZiBidWZmZXIgbWlzc2VkAGNvbmRlbnNlZAAvc3ZnL21lZGl1bXZpb2xldHJlZAAvc3ZnL3BhbGV2aW9sZXRyZWQASW1wcm9wZXIgJXMgdmFsdWUgJXMgLSBpZ25vcmVkACVzIHZhbHVlICVzIDwgJWQgLSB0b28gc21hbGwgLSBpZ25vcmVkACVzIHZhbHVlICVzID4gJWQgLSB0b28gbGFyZ2UgLSBpZ25vcmVkAC9zdmcvaW5kaWFucmVkAC9zdmcvZGFya3JlZABhIHN1Y2Nlc3NmdWwgcHJpb3IgY2FsbCB0byBmdW5jdGlvbiBYTUxfR2V0QnVmZmVyIGlzIHJlcXVpcmVkAHRhcGVyZWQAL3N2Zy9vcmFuZ2VyZWQAcmVzZXJ2ZWQgcHJlZml4ICh4bWxucykgbXVzdCBub3QgYmUgZGVjbGFyZWQgb3IgdW5kZWNsYXJlZAAvc3ZnL3JlZABzdHJpcGVkAGlsbC1jb25kaXRpb25lZAB1bmRlZmluZWQAbm90IGNvbnN0cmFpbmVkAGxhYmVsYWxpZ25lZAB0ZXh0IGRlY2xhcmF0aW9uIG5vdCB3ZWxsLWZvcm1lZABYTUwgZGVjbGFyYXRpb24gbm90IHdlbGwtZm9ybWVkAHVuZmlsbGVkAGlucHV0IGluIGZsZXggc2Nhbm5lciBmYWlsZWQAdHJpYW5ndWxhdGlvbiBmYWlsZWQAcGFyc2luZyBmaW5pc2hlZABkYXNoZWQAbGltaXQgb24gaW5wdXQgYW1wbGlmaWNhdGlvbiBmYWN0b3IgKGZyb20gRFREIGFuZCBlbnRpdGllcykgYnJlYWNoZWQAd2VkZ2VkAHNpemU9PWZyZWVkAHJvdW5kZWQAcGFyc2VyIG5vdCBzdXNwZW5kZWQAcGFyc2VyIHN1c3BlbmRlZABXZWQAUmVkAFNwYXJzZU1hdHJpeF9hZGQAbm9kZV9zZXRfYWRkAHN0cmRpY3RfYWRkAGRkICE9IHBhcmVudF9kZABLUF9BZGQAcGFkAHhsaGR4bG9hZAB4bGhkeHVubG9hZAByZWFkAGFycm93aGVhZABsaGVhZABzYW1laGVhZABib3gzZAAlc18lZABfc3Bhbl8lZABfYmxvY2tfJWQAX3dlYWtfJWQAX2Nsb25lXyVkAC4lZAAlWS0lbS0lZAAlbGYsJWQAJXMgaW4gbGluZSAlZAAlJSUlQm91bmRpbmdCb3g6ICVkICVkICVkICVkACJfc3ViZ3JhcGhfY250IjogJWQAIl9ndmlkIjogJWQAImhlYWQiOiAlZABhZ3hicHV0YwB2cHNjAGNwLT5zcmMAdWNpcmMAb2NpcmMAaWNpcmMAZWNpcmMAYWNpcmMAVWNpcmMAT2NpcmMASWNpcmMARWNpcmMAQWNpcmMAbGFiZWxsb2MAZ3ZfcmVjYWxsb2MAc3RkOjpiYWRfYWxsb2MAYmFrZXJzY2hvYwBzZW1pU3dlZXRDaG9jAG9iamxpc3Rfc3luYwBkZWdsaXN0X3N5bmMAbm9kZWxpc3Rfc3luYwBjbGlzdF9zeW5jAGVkZ2Vfc2V0X3N5bmMAcG9pbnRzX3N5bmMAc3Ryc19zeW5jAEFncmFwaHNfc3luYwBib3hlc19zeW5jAGxheWVyX25hbWVzX3N5bmMAc25vZGVzX3N5bmMAdmFyYXJyX3N5bmMAYmV6aWVyX3BhdGhfc3luYwBwYnNfc2l6ZV9zeW5jAG1jAFNwYXJzZU1hdHJpeF9pc19zeW1tZXRyaWMAQS0+aXNfcGF0dGVybl9zeW1tZXRyaWMAcGljOnBpYwBpdGFsaWMAQm9va21hbi1MaWdodEl0YWxpYwBaYXBmQ2hhbmNlcnktTWVkaXVtSXRhbGljAEJvb2ttYW4tRGVtaUl0YWxpYwBUaW1lcy1Cb2xkSXRhbGljAFBhbGF0aW5vLUJvbGRJdGFsaWMATmV3Q2VudHVyeVNjaGxiay1Cb2xkSXRhbGljAFRpbWVzLUl0YWxpYwBQYWxhdGluby1JdGFsaWMATmV3Q2VudHVyeVNjaGxiay1JdGFsaWMAcmFkaWMAI2ZjZmNmYwA6ICUuMmYgc2VjAGxpc3RkZWxyZWMAbGV2ZWwgZ3JhcGggcmVjAGxldmVsIGVkZ2UgcmVjAGxldmVsIG5vZGUgcmVjAERlYwBfbmVhdG9fY2MAYmMAdmlzaWJpbGl0eS5jAFNwYXJzZU1hdHJpeC5jAGh0bWxsZXguYwBpbmRleC5jAHNtYXJ0X2luaV94LmMAZ3ZyZW5kZXJfY29yZV9wb3YuYwBjdnQuYwBsYXlvdXQuYwB0ZXh0c3Bhbl9sdXQuYwBhZGp1c3QuYwBub2RlbGlzdC5jAHNob3J0ZXN0LmMAY2xvc2VzdC5jAHNhbWVwb3J0LmMAZ3ZyZW5kZXJfY29yZV9kb3QuYwBjb25zdHJhaW50LmMAZG90aW5pdC5jAG5lYXRvaW5pdC5jAHBhdGNod29ya2luaXQuYwBvc2FnZWluaXQuYwBlbWl0LmMAZmxhdC5jAGFycm93cy5jAG1pbmNyb3NzLmMAc3RyZXNzLmMAcG9zdF9wcm9jZXNzLmMAY2NvbXBzLmMAbnMuYwB1dGlscy5jAHhsYWJlbHMuYwBzaGFwZXMuYwBkb3RzcGxpbmVzLmMAbmVhdG9zcGxpbmVzLmMAY2x1c3RlcmVkZ2VzLmMAYXR0ci5jAHJlZnN0ci5jAGZhc3Rnci5jAGNsdXN0ZXIuYwB0YXBlci5jAGd2cmVuZGVyLmMAc3BsaXQucS5jAGRlY29tcC5jAGd2cmVuZGVyX2NvcmVfbWFwLmMAb3J0aG8uYwBndnJlbmRlcl9jb3JlX2pzb24uYwBwYXJ0aXRpb24uYwBwb3NpdGlvbi5jAGd2cGx1Z2luLmMAZ3ZfZm9wZW4uYwB0ZXh0c3Bhbi5jAGdlb20uYwByYW5kb20uYwByb3V0ZXNwbC5jAHhtbC5jAE11bHRpbGV2ZWwuYwBzcHJpbmdfZWxlY3RyaWNhbC5jAGd2cmVuZGVyX2NvcmVfdGsuYwByYW5rLmMAcGFjay5jAGJsb2NrcGF0aC5jAGR0c3RyaGFzaC5jAHJhd2dyYXBoLmMAZ3ZyZW5kZXJfY29yZV9zdmcuYwBndnJlbmRlcl9jb3JlX2ZpZy5jAHN0dWZmLmMAbWF6ZS5jAHF1YWRfcHJvZ19zb2x2ZS5jAHNwYXJzZV9zb2x2ZS5jAHJvdXRlLmMAd3JpdGUuYwBjb2x4bGF0ZS5jAHhtbHBhcnNlLmMAZWxsaXBzZS5jAGd2bG9hZGltYWdlX2NvcmUuYwBndnVzZXJzaGFwZS5jAGNpcmNsZS5jAGh0bWx0YWJsZS5jAGVkZ2UuYwBndmxvYWRpbWFnZS5jAGJsb2NrdHJlZS5jAFF1YWRUcmVlLmMAbm9kZS5jAG5vZGVfaW5kdWNlLmMAZ3ZkZXZpY2UuYwBjb21wb3VuZC5jAHRyYXBlem9pZC5jAHNnZC5jAGNvbmMuYwByZWMuYwBkaWprc3RyYS5jAGZQUS5jAGNsYXNzMi5jACVsZiwlbGYsJWxmLCVsZiVjACVsZiwlbGYsJWxmLCVbXixdJWMAXCVjACRjAHdiAG5zdWIAc2V0aHNiAHJiAHByb3RlY3RfcnNxYgBqb2IAY29yZV9sb2FkaW1hZ2VfcHNsaWIARmViAG9kYgBpbml0X3NwbGluZXNfYmIAYmV6aWVyX2JiAHByb3RlaW5zdGFiAHJuYXN0YWIAL3N2Zy9vbGl2ZWRyYWIAXGIAcndhAC9zdmcvYXF1YQBpb3RhAElvdGEAL3N2Zy9kYXJrbWFnZW50YQAvc3ZnL21hZ2VudGEAZGVsdGEARGVsdGEAemV0YQB0aGV0YQBUaGV0YQBiZXRhAFpldGEAQmV0YQBwcmV2ICE9IG9iai0+ZGF0YQBtYWtlR3JhcGhEYXRhAEV0YQBuaW1idXNzYW5zYQBwYXJhAGthcHBhAEthcHBhAC9zdmcvc2llbm5hAFZlcmRhbmEAZ2FtbWEAR2FtbWEAc2lnbWEAU2lnbWEAY29uc29sYQBuYWJsYQAvc3ZnL2Z1Y2hzaWEAR2VvcmdpYQBhbHBoYQBBbHBoYQBvbWVnYQBPbWVnYQBhcmVhAGxhbWJkYQBMYW1iZGEAaGVsdmV0aWNhAEhlbHZldGljYQBtaWNhAD48YQBgAF90ZHJhd18AX3RsZHJhd18AX2hsZHJhd18AX2xkcmF3XwBfaGRyYXdfAF9kcmF3XwBhZ3hzZXRfAGRvdF9zcGxpbmVzXwAlc18AcGFnZSVkLCVkXwBfY2NfACBpZD0iYV8AXgBuX2VkZ2VzID09IGdyYXBoLT5zb3VyY2VzW2dyYXBoLT5uXQBqZFttYXNrW2pjW2tdXV0gPT0gamNba10AamNbbWFza1tqYltrXV1dID09IGpiW2tdAGphW21hc2tbamFbal1dXSA9PSBqYVtqXQBxLT5xdHNbaWldACFydHAtPnNwbGl0LlBhcnRpdGlvbnNbMF0udGFrZW5baV0Aci5ib3VuZGFyeVtpXSA8PSByLmJvdW5kYXJ5W05VTURJTVMgKyBpXQBbJS4wM2YsJS4wM2ZdAFtpbnRlcm5hbCBoYXJkLWNvZGVkXQBucC0+Y2VsbHNbMV0AbnAtPmNlbGxzWzBdAHVzLT5uYW1lWzBdAGNwLT5zcmNbMF0AWy4uXQBcXAAicG9pbnRzIjogWwAic3RvcHMiOiBbAAlbAFoAY29tcHV0ZVNjYWxlWFkAeTw9WQAlYSAlYiAlZCAlSDolTTolUyAlWQBQT1NJWAB5ID49IElOVF9NSU4gJiYgeSA8PSBJTlRfTUFYAHggPj0gSU5UX01JTiAmJiB4IDw9IElOVF9NQVgAdyA+PSAwICYmIHcgPD0gSU5UX01BWABlX2NudCA8PSBJTlRfTUFYAHBhaXIucmlnaHQgPD0gSU5UX01BWABwYWlyLmxlZnQgPD0gSU5UX01BWAB0YXJnZXQgPD0gSU5UX01BWABuc2VncyA8PSBJTlRfTUFYAG5fZWRnZXMgPD0gSU5UX01BWABzdHAubnZlcnRpY2VzIDw9IElOVF9NQVgAb2JzW3BvbHlfaV0tPnBuIDw9IElOVF9NQVgAaW5wdXRfcm91dGUucG4gPD0gSU5UX01BWABncmFwaC0+biA8PSBJTlRfTUFYAGggPj0gMCAmJiBoIDw9IElOVF9NQVgAZV9jbnQgLSAxIDw9IElOVF9NQVgAY2xpc3Rfc2l6ZSgmbGlzdCkgLSAxIDw9IElOVF9NQVgAbGF5ZXJfbmFtZXNfc2l6ZSgmbGF5ZXJJRHMpIC0gMSA8PSBJTlRfTUFYAHN0cmxlbihhcmdzKSA8PSBJTlRfTUFYAHNub2Rlc19zaXplKCZjcF9zaWRlcykgPD0gSU5UX01BWABvYmpsaXN0X3NpemUoJm9iamwpIDw9IElOVF9NQVgAZWRnZV9saXN0X3NpemUoJmN0eC0+VHJlZV9lZGdlKSA8PSBJTlRfTUFYAG5vZGVfc2V0X3NpemUoZy0+bl9pZCkgPD0gSU5UX01BWABpIDwgSU5UX01BWAByZXN1bHQgPD0gKGludClVQ0hBUl9NQVgAc3N6IDw9IFVDSEFSX01BWABjb2wgPj0gMCAmJiBjb2wgPD0gVUlOVDE2X01BWAB4PD1YAFcAVgBVAFxUAFRFWFQAU1RSRVNTX01BSk9SSVpBVElPTl9QT1dFUl9ESVNUAFNUUkVTU19NQUpPUklaQVRJT05fR1JBUEhfRElTVABTVFJFU1NfTUFKT1JJWkFUSU9OX0FWR19ESVNUAEZBU1QARk9OVABiID09IEJfUklHSFQASEVJR0hUAEJfTEVGVABfJWxsdV9TVVNQRUNUAEJUAFRyZWJ1Y2hldCBNUwBJTlZJUwAlSDolTTolUwBWUgBUUgBBLT5mb3JtYXQgPT0gQi0+Zm9ybWF0ICYmIEEtPmZvcm1hdCA9PSBGT1JNQVRfQ1NSAExSAERJUgBIUgBDRU5URVIAJSVUUkFJTEVSAEEtPnR5cGUgPT0gTUFUUklYX1RZUEVfUkVBTCB8fCBBLT50eXBlID09IE1BVFJJWF9UWVBFX0lOVEVHRVIAQ0VMTEJPUkRFUgBCUgAqUgBRAEVYUABCX1VQAFNVUABUT1AATwBtYXBOAFxOAEJfRE9XTgBUSE9STgAlJUJFR0lOAFJPV1NQQU4AQ09MU1BBTgBOQU4AUE0AQk9UVE9NAEJNAEFNACVIOiVNAFxMAHRhaWxVUkwAbGFiZWxVUkwAZWRnZVVSTABoZWFkVVJMAEhUTUwAeCE9TlVMTABFRF90b192aXJ0KG9yaWcpID09IE5VTEwARURfdG9fdmlydChlKSA9PSBOVUxMAHByZWZpeCAhPSBOVUxMAGR0ZC0+c2NhZmZJbmRleCAhPSBOVUxMAHNtLT5MdyAhPSBOVUxMAGlucHV0ICE9IE5VTEwAbGlzdCAhPSBOVUxMAHJlZmVyZW50ICE9IE5VTEwAZGljdCAhPSBOVUxMAGRpY3QtPmJ1Y2tldHMgIT0gTlVMTABhdHRyICE9IE5VTEwAbGVhZGVyICE9IE5VTEwAaXRlbSAhPSBOVUxMAGhheXN0YWNrICE9IE5VTEwAc2NyYXRjaCAhPSBOVUxMAG9ydGhvZyAhPSBOVUxMAHNlbGYgIT0gTlVMTAB2YWx1ZSAhPSBOVUxMAGZpbGVuYW1lICE9IE5VTEwAam9iLT5vdXRwdXRfZmlsZSAhPSBOVUxMAG1vZGUgIT0gTlVMTABzb3VyY2UgIT0gTlVMTAB4ZCAhPSBOVUxMAHNtLT5Md2QgIT0gTlVMTABqb2IgIT0gTlVMTABzb3VyY2UuZGF0YSAhPSBOVUxMAGIuZGF0YSAhPSBOVUxMAGEuZGF0YSAhPSBOVUxMAGxpc3QgJiYgbGlzdFswXSAhPSBOVUxMAEFGICE9IE5VTEwAc20tPkQgIT0gTlVMTABFRF90b192aXJ0KG9yaWcpICE9IE5VTEwATENfQUxMAEJMAGJlc3Rjb3N0IDwgSFVHRV9WQUwATk9STUFMAFJBRElBTABBLT50eXBlID09IE1BVFJJWF9UWVBFX1JFQUwAVVJXIENoYW5jZXJ5IEwAVVJXIEJvb2ttYW4gTABDZW50dXJ5IFNjaG9vbGJvb2sgTABVUlcgR290aGljIEwAS0sASgBpIDwgTUFYX0kAUC0+ZW5kLnRoZXRhIDwgMiAqIE1fUEkAQVNDSUkAXEgARVRIAFdJRFRIAERPVEZPTlRQQVRIAEdERk9OVFBBVEgAbWtOQ29uc3RyYWludEcAXEcARVhQQVRfRU5USVRZX0RFQlVHAEVYUEFUX0VOVFJPUFlfREVCVUcARVhQQVRfQUNDT1VOVElOR19ERUJVRwBSTkcAU1BSSU5HAENFTExQQURESU5HAENFTExTUEFDSU5HAExBTkcASU1HAFx4RgAlJUVPRgBJTkYAXHhGRgBSSUZGAGRlbHRhIDw9IDB4RkZGRgBceEVGAFx4REYAXHhDRgBceEJGAFx4QUYAXHg5RgBceDhGAFx4N0YAXHgxRgBceEUAXEUAUE9JTlQtU0laRQBUUlVFAENMT1NFAEZBTFNFAGtleSAhPSBUT01CU1RPTkUAciAhPSBUT01CU1RPTkUAa2luZCA9PSBMVF9OT05FAEdSQURJRU5UQU5HTEUAVFJJQU5HTEUATUlERExFAElOVklTSUJMRQBUQUJMRQBBR1RZUEUob2JqKSA9PSBBR0lORURHRSB8fCBBR1RZUEUob2JqKSA9PSBBR09VVEVER0UAXHhGRQBceEVFAFx4REUAQl9OT0RFAFx4Q0UAXHhCRQBceEFFAFx4OUUAXHg4RQBceDFFAFREAEEtPmZvcm1hdCA9PSBGT1JNQVRfQ09PUkQAbiAmJiBpID49IDAgJiYgaSA8IE5PREVDQVJEACUlRU5EAEhZQlJJRABTT0xJRABceEZEAFx4RUQARE9UVEVEAERBU0hFRABST1VOREVEAFx4REQAXHhDRABceEJEAFx4QUQAXHg5RABceDhEAFx4MUQAXHhDAGRlbGV0ZVZQU0MAXHhGQwBceEVDAFx4REMAXHhDQwBceEJDAFx4QUMAXHg5QwBceDhDAFx4MUMAXHhCAFNVQgBceEZCAFx4RUIAXHhEQgBceENCAFx4QkIAXHhBQgBceDlCAFx4OEIAXHgxQgBBICYmIEIAXHhGQQBceEVBAFx4REEAXHhDQQBceEJBAFx4QUEAXHg5QQBceDhBAFx4MUEAQAA/ADwlcz4APG5pbD4APC90c3Bhbj48L3RleHRQYXRoPgAKICAgIDwlOS4zZiwgJTkuM2YsICU5LjNmPgA+Cjx0aXRsZT4APEZPTlQ+ADxCUj4APEhUTUw+ADwvSFRNTD4APElNRz4AU3ludGF4IGVycm9yOiBub24tc3BhY2Ugc3RyaW5nIHVzZWQgYmVmb3JlIDxUQUJMRT4AU3ludGF4IGVycm9yOiBub24tc3BhY2Ugc3RyaW5nIHVzZWQgYWZ0ZXIgPC9UQUJMRT4APFREPgAtPgAiPgAJW2tleT0APD0APAAmI3gleDsAJnF1b3Q7ACZsdDsAJmd0OwAmYW1wOwAjJWQ7ACYjMzk7ACYjNDU7ACYjOTM7ACYjMTM7ACYjMTYwOwAmIzEwOwA7c3RvcC1vcGFjaXR5OgAlJUJvdW5kaW5nQm94OgBjYWxjdWxhdGluZyBzaG9ydGVzdCBwYXRocyBhbmQgc2V0dGluZyB1cCBzdHJlc3MgdGVybXM6ADxzdG9wIG9mZnNldD0iJS4wM2YiIHN0eWxlPSJzdG9wLWNvbG9yOgA8c3RvcCBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOgA8c3RvcCBvZmZzZXQ9IjAiIHN0eWxlPSJzdG9wLWNvbG9yOgBzb2x2aW5nIG1vZGVsOgAvXDoAZ3JleTkAZ3JheTkAXHhGOQBceEU5AFx4RDkAXHhDOQBceEI5AFx4QTkAZ3JleTk5AGdyYXk5OQBceDk5AGdyZXk4OQBncmF5ODkAXHg4OQAwMTIzNDU2Nzg5AGdyZXk3OQBncmF5NzkAZ3JleTY5AGdyYXk2OQBncmV5NTkAZ3JheTU5AGdyZXk0OQBncmF5NDkAZ3JleTM5AGdyYXkzOQBncmV5MjkAZ3JheTI5AGdyZXkxOQBncmF5MTkAXHgxOQAvcmRneTkvOQAvYnVwdTkvOQAvcmRwdTkvOQAvcHVidTkvOQAveWxnbmJ1OS85AC9nbmJ1OS85AC9yZHlsYnU5LzkAL3JkYnU5LzkAL2dyZXlzOS85AC9ncmVlbnM5LzkAL2JsdWVzOS85AC9wdXJwbGVzOS85AC9vcmFuZ2VzOS85AC9yZWRzOS85AC9wdW9yOS85AC95bG9yYnI5LzkAL3B1YnVnbjkvOQAvYnVnbjkvOQAvcHJnbjkvOQAvcmR5bGduOS85AC95bGduOS85AC9zcGVjdHJhbDkvOQAvcGl5ZzkvOQAvYnJiZzkvOQAvcHVyZDkvOQAveWxvcnJkOS85AC9vcnJkOS85AC9wYWlyZWQ5LzkAL3NldDM5LzkAL3NldDE5LzkAL3Bhc3RlbDE5LzkAL3BhaXJlZDEyLzkAL3NldDMxMi85AC9yZGd5MTEvOQAvcmR5bGJ1MTEvOQAvcmRidTExLzkAL3B1b3IxMS85AC9wcmduMTEvOQAvcmR5bGduMTEvOQAvc3BlY3RyYWwxMS85AC9waXlnMTEvOQAvYnJiZzExLzkAL3BhaXJlZDExLzkAL3NldDMxMS85AC9yZGd5MTAvOQAvcmR5bGJ1MTAvOQAvcmRidTEwLzkAL3B1b3IxMC85AC9wcmduMTAvOQAvcmR5bGduMTAvOQAvc3BlY3RyYWwxMC85AC9waXlnMTAvOQAvYnJiZzEwLzkAL3BhaXJlZDEwLzkAL3NldDMxMC85AGdyZXk4AGdyYXk4AFx4OAB1dGY4ACNmOGY4ZjgAI2U4ZThlOABceEY4AEdJRjgAXHhFOABceEQ4AFx4QzgAXHhCOABceEE4AGdyZXk5OABncmF5OTgAXHg5OABncmV5ODgAZ3JheTg4AFx4ODgAZ3JleTc4AGdyYXk3OABncmV5NjgAZ3JheTY4AGdyZXk1OABncmF5NTgAZ3JleTQ4AGdyYXk0OABncmV5MzgAZ3JheTM4AGdyZXkyOABncmF5MjgAZ3JleTE4AGdyYXkxOABceDE4AC9yZGd5OS84AC9idXB1OS84AC9yZHB1OS84AC9wdWJ1OS84AC95bGduYnU5LzgAL2duYnU5LzgAL3JkeWxidTkvOAAvcmRidTkvOAAvZ3JleXM5LzgAL2dyZWVuczkvOAAvYmx1ZXM5LzgAL3B1cnBsZXM5LzgAL29yYW5nZXM5LzgAL3JlZHM5LzgAL3B1b3I5LzgAL3lsb3JicjkvOAAvcHVidWduOS84AC9idWduOS84AC9wcmduOS84AC9yZHlsZ245LzgAL3lsZ245LzgAL3NwZWN0cmFsOS84AC9waXlnOS84AC9icmJnOS84AC9wdXJkOS84AC95bG9ycmQ5LzgAL29ycmQ5LzgAL3BhaXJlZDkvOAAvc2V0MzkvOAAvc2V0MTkvOAAvcGFzdGVsMTkvOAAvcmRneTgvOAAvYnVwdTgvOAAvcmRwdTgvOAAvcHVidTgvOAAveWxnbmJ1OC84AC9nbmJ1OC84AC9yZHlsYnU4LzgAL3JkYnU4LzgAL2FjY2VudDgvOAAvZ3JleXM4LzgAL2dyZWVuczgvOAAvYmx1ZXM4LzgAL3B1cnBsZXM4LzgAL29yYW5nZXM4LzgAL3JlZHM4LzgAL3B1b3I4LzgAL3lsb3JicjgvOAAvcHVidWduOC84AC9idWduOC84AC9wcmduOC84AC9yZHlsZ244LzgAL3lsZ244LzgAL3NwZWN0cmFsOC84AC9waXlnOC84AC9icmJnOC84AC9wdXJkOC84AC95bG9ycmQ4LzgAL29ycmQ4LzgAL3BhaXJlZDgvOAAvc2V0MzgvOAAvc2V0MjgvOAAvcGFzdGVsMjgvOAAvZGFyazI4LzgAL3NldDE4LzgAL3Bhc3RlbDE4LzgAL3BhaXJlZDEyLzgAL3NldDMxMi84AC9yZGd5MTEvOAAvcmR5bGJ1MTEvOAAvcmRidTExLzgAL3B1b3IxMS84AC9wcmduMTEvOAAvcmR5bGduMTEvOAAvc3BlY3RyYWwxMS84AC9waXlnMTEvOAAvYnJiZzExLzgAL3BhaXJlZDExLzgAL3NldDMxMS84AC9yZGd5MTAvOAAvcmR5bGJ1MTAvOAAvcmRidTEwLzgAL3B1b3IxMC84AC9wcmduMTAvOAAvcmR5bGduMTAvOAAvc3BlY3RyYWwxMC84AC9waXlnMTAvOAAvYnJiZzEwLzgAL3BhaXJlZDEwLzgAL3NldDMxMC84AHV0Zi04AEMuVVRGLTgAZ3JleTcAZ3JheTcAXHg3AFx4RjcAXHhFNwBceEQ3AFx4QzcAXHhCNwBceEE3AGdyZXk5NwBncmF5OTcAXHg5NwBncmV5ODcAZ3JheTg3AFx4ODcAZ3JleTc3AGdyYXk3NwBncmV5NjcAZ3JheTY3AGdyZXk1NwBncmF5NTcAZ3JleTQ3AGdyYXk0NwBncmV5MzcAZ3JheTM3AGdyZXkyNwBncmF5MjcAZ3JleTE3AGdyYXkxNwBceDE3AC9yZGd5OS83AC9idXB1OS83AC9yZHB1OS83AC9wdWJ1OS83AC95bGduYnU5LzcAL2duYnU5LzcAL3JkeWxidTkvNwAvcmRidTkvNwAvZ3JleXM5LzcAL2dyZWVuczkvNwAvYmx1ZXM5LzcAL3B1cnBsZXM5LzcAL29yYW5nZXM5LzcAL3JlZHM5LzcAL3B1b3I5LzcAL3lsb3JicjkvNwAvcHVidWduOS83AC9idWduOS83AC9wcmduOS83AC9yZHlsZ245LzcAL3lsZ245LzcAL3NwZWN0cmFsOS83AC9waXlnOS83AC9icmJnOS83AC9wdXJkOS83AC95bG9ycmQ5LzcAL29ycmQ5LzcAL3BhaXJlZDkvNwAvc2V0MzkvNwAvc2V0MTkvNwAvcGFzdGVsMTkvNwAvcmRneTgvNwAvYnVwdTgvNwAvcmRwdTgvNwAvcHVidTgvNwAveWxnbmJ1OC83AC9nbmJ1OC83AC9yZHlsYnU4LzcAL3JkYnU4LzcAL2FjY2VudDgvNwAvZ3JleXM4LzcAL2dyZWVuczgvNwAvYmx1ZXM4LzcAL3B1cnBsZXM4LzcAL29yYW5nZXM4LzcAL3JlZHM4LzcAL3B1b3I4LzcAL3lsb3JicjgvNwAvcHVidWduOC83AC9idWduOC83AC9wcmduOC83AC9yZHlsZ244LzcAL3lsZ244LzcAL3NwZWN0cmFsOC83AC9waXlnOC83AC9icmJnOC83AC9wdXJkOC83AC95bG9ycmQ4LzcAL29ycmQ4LzcAL3BhaXJlZDgvNwAvc2V0MzgvNwAvc2V0MjgvNwAvcGFzdGVsMjgvNwAvZGFyazI4LzcAL3NldDE4LzcAL3Bhc3RlbDE4LzcAL3JkZ3k3LzcAL2J1cHU3LzcAL3JkcHU3LzcAL3B1YnU3LzcAL3lsZ25idTcvNwAvZ25idTcvNwAvcmR5bGJ1Ny83AC9yZGJ1Ny83AC9hY2NlbnQ3LzcAL2dyZXlzNy83AC9ncmVlbnM3LzcAL2JsdWVzNy83AC9wdXJwbGVzNy83AC9vcmFuZ2VzNy83AC9yZWRzNy83AC9wdW9yNy83AC95bG9yYnI3LzcAL3B1YnVnbjcvNwAvYnVnbjcvNwAvcHJnbjcvNwAvcmR5bGduNy83AC95bGduNy83AC9zcGVjdHJhbDcvNwAvcGl5ZzcvNwAvYnJiZzcvNwAvcHVyZDcvNwAveWxvcnJkNy83AC9vcnJkNy83AC9wYWlyZWQ3LzcAL3NldDM3LzcAL3NldDI3LzcAL3Bhc3RlbDI3LzcAL2RhcmsyNy83AC9zZXQxNy83AC9wYXN0ZWwxNy83AC9wYWlyZWQxMi83AC9zZXQzMTIvNwAvcmRneTExLzcAL3JkeWxidTExLzcAL3JkYnUxMS83AC9wdW9yMTEvNwAvcHJnbjExLzcAL3JkeWxnbjExLzcAL3NwZWN0cmFsMTEvNwAvcGl5ZzExLzcAL2JyYmcxMS83AC9wYWlyZWQxMS83AC9zZXQzMTEvNwAvcmRneTEwLzcAL3JkeWxidTEwLzcAL3JkYnUxMC83AC9wdW9yMTAvNwAvcHJnbjEwLzcAL3JkeWxnbjEwLzcAL3NwZWN0cmFsMTAvNwAvcGl5ZzEwLzcAL2JyYmcxMC83AC9wYWlyZWQxMC83AC9zZXQzMTAvNwAxLjcAZ3JleTYAZ3JheTYAXHg2AFx4RjYAXHhFNgBceEQ2AFx4QzYAXHhCNgBceEE2AGdyZXk5NgBncmF5OTYAXHg5NgBncmV5ODYAZ3JheTg2AFx4ODYAZ3JleTc2AGdyYXk3NgBncmV5NjYAZ3JheTY2AGdyZXk1NgBncmF5NTYAZ3JleTQ2AGdyYXk0NgBncmV5MzYAZ3JheTM2AGdyZXkyNgBncmF5MjYAZ3JleTE2AGdyYXkxNgBceDE2AC9yZGd5OS82AC9idXB1OS82AC9yZHB1OS82AC9wdWJ1OS82AC95bGduYnU5LzYAL2duYnU5LzYAL3JkeWxidTkvNgAvcmRidTkvNgAvZ3JleXM5LzYAL2dyZWVuczkvNgAvYmx1ZXM5LzYAL3B1cnBsZXM5LzYAL29yYW5nZXM5LzYAL3JlZHM5LzYAL3B1b3I5LzYAL3lsb3JicjkvNgAvcHVidWduOS82AC9idWduOS82AC9wcmduOS82AC9yZHlsZ245LzYAL3lsZ245LzYAL3NwZWN0cmFsOS82AC9waXlnOS82AC9icmJnOS82AC9wdXJkOS82AC95bG9ycmQ5LzYAL29ycmQ5LzYAL3BhaXJlZDkvNgAvc2V0MzkvNgAvc2V0MTkvNgAvcGFzdGVsMTkvNgAvcmRneTgvNgAvYnVwdTgvNgAvcmRwdTgvNgAvcHVidTgvNgAveWxnbmJ1OC82AC9nbmJ1OC82AC9yZHlsYnU4LzYAL3JkYnU4LzYAL2FjY2VudDgvNgAvZ3JleXM4LzYAL2dyZWVuczgvNgAvYmx1ZXM4LzYAL3B1cnBsZXM4LzYAL29yYW5nZXM4LzYAL3JlZHM4LzYAL3B1b3I4LzYAL3lsb3JicjgvNgAvcHVidWduOC82AC9idWduOC82AC9wcmduOC82AC9yZHlsZ244LzYAL3lsZ244LzYAL3NwZWN0cmFsOC82AC9waXlnOC82AC9icmJnOC82AC9wdXJkOC82AC95bG9ycmQ4LzYAL29ycmQ4LzYAL3BhaXJlZDgvNgAvc2V0MzgvNgAvc2V0MjgvNgAvcGFzdGVsMjgvNgAvZGFyazI4LzYAL3NldDE4LzYAL3Bhc3RlbDE4LzYAL3JkZ3k3LzYAL2J1cHU3LzYAL3JkcHU3LzYAL3B1YnU3LzYAL3lsZ25idTcvNgAvZ25idTcvNgAvcmR5bGJ1Ny82AC9yZGJ1Ny82AC9hY2NlbnQ3LzYAL2dyZXlzNy82AC9ncmVlbnM3LzYAL2JsdWVzNy82AC9wdXJwbGVzNy82AC9vcmFuZ2VzNy82AC9yZWRzNy82AC9wdW9yNy82AC95bG9yYnI3LzYAL3B1YnVnbjcvNgAvYnVnbjcvNgAvcHJnbjcvNgAvcmR5bGduNy82AC95bGduNy82AC9zcGVjdHJhbDcvNgAvcGl5ZzcvNgAvYnJiZzcvNgAvcHVyZDcvNgAveWxvcnJkNy82AC9vcnJkNy82AC9wYWlyZWQ3LzYAL3NldDM3LzYAL3NldDI3LzYAL3Bhc3RlbDI3LzYAL2RhcmsyNy82AC9zZXQxNy82AC9wYXN0ZWwxNy82AC9yZGd5Ni82AC9idXB1Ni82AC9yZHB1Ni82AC9wdWJ1Ni82AC95bGduYnU2LzYAL2duYnU2LzYAL3JkeWxidTYvNgAvcmRidTYvNgAvYWNjZW50Ni82AC9ncmV5czYvNgAvZ3JlZW5zNi82AC9ibHVlczYvNgAvcHVycGxlczYvNgAvb3JhbmdlczYvNgAvcmVkczYvNgAvcHVvcjYvNgAveWxvcmJyNi82AC9wdWJ1Z242LzYAL2J1Z242LzYAL3ByZ242LzYAL3JkeWxnbjYvNgAveWxnbjYvNgAvc3BlY3RyYWw2LzYAL3BpeWc2LzYAL2JyYmc2LzYAL3B1cmQ2LzYAL3lsb3JyZDYvNgAvb3JyZDYvNgAvcGFpcmVkNi82AC9zZXQzNi82AC9zZXQyNi82AC9wYXN0ZWwyNi82AC9kYXJrMjYvNgAvc2V0MTYvNgAvcGFzdGVsMTYvNgAvcGFpcmVkMTIvNgAvc2V0MzEyLzYAL3JkZ3kxMS82AC9yZHlsYnUxMS82AC9yZGJ1MTEvNgAvcHVvcjExLzYAL3ByZ24xMS82AC9yZHlsZ24xMS82AC9zcGVjdHJhbDExLzYAL3BpeWcxMS82AC9icmJnMTEvNgAvcGFpcmVkMTEvNgAvc2V0MzExLzYAL3JkZ3kxMC82AC9yZHlsYnUxMC82AC9yZGJ1MTAvNgAvcHVvcjEwLzYAL3ByZ24xMC82AC9yZHlsZ24xMC82AC9zcGVjdHJhbDEwLzYAL3BpeWcxMC82AC9icmJnMTAvNgAvcGFpcmVkMTAvNgAvc2V0MzEwLzYAZ3JleTUAZ3JheTUAXHg1AGJpZzUAXHhGNQBceEU1AFx4RDUAXHhDNQBceEI1AFx4QTUAZ3JleTk1AGdyYXk5NQBceDk1AGdyZXk4NQBncmF5ODUAXHg4NQBncmV5NzUAZ3JheTc1AGdyZXk2NQBncmF5NjUAZ3JleTU1AGdyYXk1NQAyMDI1MDcwMS4wOTU1AGdyZXk0NQBncmF5NDUAZ3JleTM1AGdyYXkzNQBncmV5MjUAZ3JheTI1AGdyZXkxNQBncmF5MTUAXHgxNQBncmF5MDUAL3JkZ3k5LzUAL2J1cHU5LzUAL3JkcHU5LzUAL3B1YnU5LzUAL3lsZ25idTkvNQAvZ25idTkvNQAvcmR5bGJ1OS81AC9yZGJ1OS81AC9ncmV5czkvNQAvZ3JlZW5zOS81AC9ibHVlczkvNQAvcHVycGxlczkvNQAvb3JhbmdlczkvNQAvcmVkczkvNQAvcHVvcjkvNQAveWxvcmJyOS81AC9wdWJ1Z245LzUAL2J1Z245LzUAL3ByZ245LzUAL3JkeWxnbjkvNQAveWxnbjkvNQAvc3BlY3RyYWw5LzUAL3BpeWc5LzUAL2JyYmc5LzUAL3B1cmQ5LzUAL3lsb3JyZDkvNQAvb3JyZDkvNQAvcGFpcmVkOS81AC9zZXQzOS81AC9zZXQxOS81AC9wYXN0ZWwxOS81AC9yZGd5OC81AC9idXB1OC81AC9yZHB1OC81AC9wdWJ1OC81AC95bGduYnU4LzUAL2duYnU4LzUAL3JkeWxidTgvNQAvcmRidTgvNQAvYWNjZW50OC81AC9ncmV5czgvNQAvZ3JlZW5zOC81AC9ibHVlczgvNQAvcHVycGxlczgvNQAvb3JhbmdlczgvNQAvcmVkczgvNQAvcHVvcjgvNQAveWxvcmJyOC81AC9wdWJ1Z244LzUAL2J1Z244LzUAL3ByZ244LzUAL3JkeWxnbjgvNQAveWxnbjgvNQAvc3BlY3RyYWw4LzUAL3BpeWc4LzUAL2JyYmc4LzUAL3B1cmQ4LzUAL3lsb3JyZDgvNQAvb3JyZDgvNQAvcGFpcmVkOC81AC9zZXQzOC81AC9zZXQyOC81AC9wYXN0ZWwyOC81AC9kYXJrMjgvNQAvc2V0MTgvNQAvcGFzdGVsMTgvNQAvcmRneTcvNQAvYnVwdTcvNQAvcmRwdTcvNQAvcHVidTcvNQAveWxnbmJ1Ny81AC9nbmJ1Ny81AC9yZHlsYnU3LzUAL3JkYnU3LzUAL2FjY2VudDcvNQAvZ3JleXM3LzUAL2dyZWVuczcvNQAvYmx1ZXM3LzUAL3B1cnBsZXM3LzUAL29yYW5nZXM3LzUAL3JlZHM3LzUAL3B1b3I3LzUAL3lsb3JicjcvNQAvcHVidWduNy81AC9idWduNy81AC9wcmduNy81AC9yZHlsZ243LzUAL3lsZ243LzUAL3NwZWN0cmFsNy81AC9waXlnNy81AC9icmJnNy81AC9wdXJkNy81AC95bG9ycmQ3LzUAL29ycmQ3LzUAL3BhaXJlZDcvNQAvc2V0MzcvNQAvc2V0MjcvNQAvcGFzdGVsMjcvNQAvZGFyazI3LzUAL3NldDE3LzUAL3Bhc3RlbDE3LzUAL3JkZ3k2LzUAL2J1cHU2LzUAL3JkcHU2LzUAL3B1YnU2LzUAL3lsZ25idTYvNQAvZ25idTYvNQAvcmR5bGJ1Ni81AC9yZGJ1Ni81AC9hY2NlbnQ2LzUAL2dyZXlzNi81AC9ncmVlbnM2LzUAL2JsdWVzNi81AC9wdXJwbGVzNi81AC9vcmFuZ2VzNi81AC9yZWRzNi81AC9wdW9yNi81AC95bG9yYnI2LzUAL3B1YnVnbjYvNQAvYnVnbjYvNQAvcHJnbjYvNQAvcmR5bGduNi81AC95bGduNi81AC9zcGVjdHJhbDYvNQAvcGl5ZzYvNQAvYnJiZzYvNQAvcHVyZDYvNQAveWxvcnJkNi81AC9vcnJkNi81AC9wYWlyZWQ2LzUAL3NldDM2LzUAL3NldDI2LzUAL3Bhc3RlbDI2LzUAL2RhcmsyNi81AC9zZXQxNi81AC9wYXN0ZWwxNi81AC9yZGd5NS81AC9idXB1NS81AC9yZHB1NS81AC9wdWJ1NS81AC95bGduYnU1LzUAL2duYnU1LzUAL3JkeWxidTUvNQAvcmRidTUvNQAvYWNjZW50NS81AC9ncmV5czUvNQAvZ3JlZW5zNS81AC9ibHVlczUvNQAvcHVycGxlczUvNQAvb3JhbmdlczUvNQAvcmVkczUvNQAvcHVvcjUvNQAveWxvcmJyNS81AC9wdWJ1Z241LzUAL2J1Z241LzUAL3ByZ241LzUAL3JkeWxnbjUvNQAveWxnbjUvNQAvc3BlY3RyYWw1LzUAL3BpeWc1LzUAL2JyYmc1LzUAL3B1cmQ1LzUAL3lsb3JyZDUvNQAvb3JyZDUvNQAvcGFpcmVkNS81AC9zZXQzNS81AC9zZXQyNS81AC9wYXN0ZWwyNS81AC9kYXJrMjUvNQAvc2V0MTUvNQAvcGFzdGVsMTUvNQAvcGFpcmVkMTIvNQAvc2V0MzEyLzUAL3JkZ3kxMS81AC9yZHlsYnUxMS81AC9yZGJ1MTEvNQAvcHVvcjExLzUAL3ByZ24xMS81AC9yZHlsZ24xMS81AC9zcGVjdHJhbDExLzUAL3BpeWcxMS81AC9icmJnMTEvNQAvcGFpcmVkMTEvNQAvc2V0MzExLzUAL3JkZ3kxMC81AC9yZHlsYnUxMC81AC9yZGJ1MTAvNQAvcHVvcjEwLzUAL3ByZ24xMC81AC9yZHlsZ24xMC81AC9zcGVjdHJhbDEwLzUAL3BpeWcxMC81AC9icmJnMTAvNQAvcGFpcmVkMTAvNQAvc2V0MzEwLzUAYmlnLTUAQklHLTUAIC1kYXNoIDUAaXZvcnk0AGdyZXk0AGRhcmtzbGF0ZWdyYXk0AFx4NABzbm93NABsaWdodHllbGxvdzQAaG9uZXlkZXc0AHdoZWF0NAB0b21hdG80AHJvc3licm93bjQAbWFyb29uNABsaWdodHNhbG1vbjQAbGVtb25jaGlmZm9uNABzcHJpbmdncmVlbjQAZGFya29saXZlZ3JlZW40AHBhbGVncmVlbjQAZGFya3NlYWdyZWVuNABsaWdodGN5YW40AHRhbjQAcGx1bTQAc2Vhc2hlbGw0AGNvcmFsNABob3RwaW5rNABsaWdodHBpbms0AGRlZXBwaW5rNABjb3Juc2lsazQAZmlyZWJyaWNrNABraGFraTQAbGF2ZW5kZXJibHVzaDQAcGVhY2hwdWZmNABiaXNxdWU0AGxpZ2h0c2t5Ymx1ZTQAZGVlcHNreWJsdWU0AGxpZ2h0Ymx1ZTQAY2FkZXRibHVlNABkb2RnZXJibHVlNABsaWdodHN0ZWVsYmx1ZTQAcm95YWxibHVlNABzbGF0ZWJsdWU0AG5hdmFqb3doaXRlNABhbnRpcXVld2hpdGU0AGNob2NvbGF0ZTQAY2hhcnRyZXVzZTQAbWlzdHlyb3NlNABwYWxldHVycXVvaXNlNABhenVyZTQAdGhlcmU0AGFxdWFtYXJpbmU0AHRoaXN0bGU0AG1lZGl1bXB1cnBsZTQAZGFya29yYW5nZTQAbGlnaHRnb2xkZW5yb2Q0AGRhcmtnb2xkZW5yb2Q0AGJ1cmx5d29vZDQAZ29sZDQAbWVkaXVtb3JjaGlkNABkYXJrb3JjaGlkNABwYWxldmlvbGV0cmVkNABpbmRpYW5yZWQ0AG9yYW5nZXJlZDQAb2xpdmVkcmFiNABtYWdlbnRhNABzaWVubmE0AFx4RjQAXHhFNABceEQ0AFx4QzQAXHhCNABceEE0AGdyZXk5NABncmF5OTQAXHg5NABncmV5ODQAZ3JheTg0AFx4ODQAZ3JleTc0AGdyYXk3NABncmV5NjQAZ3JheTY0AGdyZXk1NABncmF5NTQAZ3JleTQ0AGdyYXk0NABncmV5MzQAZ3JheTM0AGZyYWMzNABncmV5MjQAZ3JheTI0AGdyZXkxNABncmF5MTQAXHgxNABmcmFjMTQAL3JkZ3k5LzQAL2J1cHU5LzQAL3JkcHU5LzQAL3B1YnU5LzQAL3lsZ25idTkvNAAvZ25idTkvNAAvcmR5bGJ1OS80AC9yZGJ1OS80AC9ncmV5czkvNAAvZ3JlZW5zOS80AC9ibHVlczkvNAAvcHVycGxlczkvNAAvb3JhbmdlczkvNAAvcmVkczkvNAAvcHVvcjkvNAAveWxvcmJyOS80AC9wdWJ1Z245LzQAL2J1Z245LzQAL3ByZ245LzQAL3JkeWxnbjkvNAAveWxnbjkvNAAvc3BlY3RyYWw5LzQAL3BpeWc5LzQAL2JyYmc5LzQAL3B1cmQ5LzQAL3lsb3JyZDkvNAAvb3JyZDkvNAAvcGFpcmVkOS80AC9zZXQzOS80AC9zZXQxOS80AC9wYXN0ZWwxOS80AC9yZGd5OC80AC9idXB1OC80AC9yZHB1OC80AC9wdWJ1OC80AC95bGduYnU4LzQAL2duYnU4LzQAL3JkeWxidTgvNAAvcmRidTgvNAAvYWNjZW50OC80AC9ncmV5czgvNAAvZ3JlZW5zOC80AC9ibHVlczgvNAAvcHVycGxlczgvNAAvb3JhbmdlczgvNAAvcmVkczgvNAAvcHVvcjgvNAAveWxvcmJyOC80AC9wdWJ1Z244LzQAL2J1Z244LzQAL3ByZ244LzQAL3JkeWxnbjgvNAAveWxnbjgvNAAvc3BlY3RyYWw4LzQAL3BpeWc4LzQAL2JyYmc4LzQAL3B1cmQ4LzQAL3lsb3JyZDgvNAAvb3JyZDgvNAAvcGFpcmVkOC80AC9zZXQzOC80AC9zZXQyOC80AC9wYXN0ZWwyOC80AC9kYXJrMjgvNAAvc2V0MTgvNAAvcGFzdGVsMTgvNAAvcmRneTcvNAAvYnVwdTcvNAAvcmRwdTcvNAAvcHVidTcvNAAveWxnbmJ1Ny80AC9nbmJ1Ny80AC9yZHlsYnU3LzQAL3JkYnU3LzQAL2FjY2VudDcvNAAvZ3JleXM3LzQAL2dyZWVuczcvNAAvYmx1ZXM3LzQAL3B1cnBsZXM3LzQAL29yYW5nZXM3LzQAL3JlZHM3LzQAL3B1b3I3LzQAL3lsb3JicjcvNAAvcHVidWduNy80AC9idWduNy80AC9wcmduNy80AC9yZHlsZ243LzQAL3lsZ243LzQAL3NwZWN0cmFsNy80AC9waXlnNy80AC9icmJnNy80AC9wdXJkNy80AC95bG9ycmQ3LzQAL29ycmQ3LzQAL3BhaXJlZDcvNAAvc2V0MzcvNAAvc2V0MjcvNAAvcGFzdGVsMjcvNAAvZGFyazI3LzQAL3NldDE3LzQAL3Bhc3RlbDE3LzQAL3JkZ3k2LzQAL2J1cHU2LzQAL3JkcHU2LzQAL3B1YnU2LzQAL3lsZ25idTYvNAAvZ25idTYvNAAvcmR5bGJ1Ni80AC9yZGJ1Ni80AC9hY2NlbnQ2LzQAL2dyZXlzNi80AC9ncmVlbnM2LzQAL2JsdWVzNi80AC9wdXJwbGVzNi80AC9vcmFuZ2VzNi80AC9yZWRzNi80AC9wdW9yNi80AC95bG9yYnI2LzQAL3B1YnVnbjYvNAAvYnVnbjYvNAAvcHJnbjYvNAAvcmR5bGduNi80AC95bGduNi80AC9zcGVjdHJhbDYvNAAvcGl5ZzYvNAAvYnJiZzYvNAAvcHVyZDYvNAAveWxvcnJkNi80AC9vcnJkNi80AC9wYWlyZWQ2LzQAL3NldDM2LzQAL3NldDI2LzQAL3Bhc3RlbDI2LzQAL2RhcmsyNi80AC9zZXQxNi80AC9wYXN0ZWwxNi80AC9yZGd5NS80AC9idXB1NS80AC9yZHB1NS80AC9wdWJ1NS80AC95bGduYnU1LzQAL2duYnU1LzQAL3JkeWxidTUvNAAvcmRidTUvNAAvYWNjZW50NS80AC9ncmV5czUvNAAvZ3JlZW5zNS80AC9ibHVlczUvNAAvcHVycGxlczUvNAAvb3JhbmdlczUvNAAvcmVkczUvNAAvcHVvcjUvNAAveWxvcmJyNS80AC9wdWJ1Z241LzQAL2J1Z241LzQAL3ByZ241LzQAL3JkeWxnbjUvNAAveWxnbjUvNAAvc3BlY3RyYWw1LzQAL3BpeWc1LzQAL2JyYmc1LzQAL3B1cmQ1LzQAL3lsb3JyZDUvNAAvb3JyZDUvNAAvcGFpcmVkNS80AC9zZXQzNS80AC9zZXQyNS80AC9wYXN0ZWwyNS80AC9kYXJrMjUvNAAvc2V0MTUvNAAvcGFzdGVsMTUvNAAvcmRneTQvNAAvYnVwdTQvNAAvcmRwdTQvNAAvcHVidTQvNAAveWxnbmJ1NC80AC9nbmJ1NC80AC9yZHlsYnU0LzQAL3JkYnU0LzQAL2FjY2VudDQvNAAvZ3JleXM0LzQAL2dyZWVuczQvNAAvYmx1ZXM0LzQAL3B1cnBsZXM0LzQAL29yYW5nZXM0LzQAL3JlZHM0LzQAL3B1b3I0LzQAL3lsb3JicjQvNAAvcHVidWduNC80AC9idWduNC80AC9wcmduNC80AC9yZHlsZ240LzQAL3lsZ240LzQAL3NwZWN0cmFsNC80AC9waXlnNC80AC9icmJnNC80AC9wdXJkNC80AC95bG9ycmQ0LzQAL29ycmQ0LzQAL3BhaXJlZDQvNAAvc2V0MzQvNAAvc2V0MjQvNAAvcGFzdGVsMjQvNAAvZGFyazI0LzQAL3NldDE0LzQAL3Bhc3RlbDE0LzQAL3BhaXJlZDEyLzQAL3NldDMxMi80AC9yZGd5MTEvNAAvcmR5bGJ1MTEvNAAvcmRidTExLzQAL3B1b3IxMS80AC9wcmduMTEvNAAvcmR5bGduMTEvNAAvc3BlY3RyYWwxMS80AC9waXlnMTEvNAAvYnJiZzExLzQAL3BhaXJlZDExLzQAL3NldDMxMS80AC9yZGd5MTAvNAAvcmR5bGJ1MTAvNAAvcmRidTEwLzQAL3B1b3IxMC80AC9wcmduMTAvNAAvcmR5bGduMTAvNAAvc3BlY3RyYWwxMC80AC9waXlnMTAvNAAvYnJiZzEwLzQAL3BhaXJlZDEwLzQAL3NldDMxMC80ADEuNABuID49IDQAc2lkZXMgPT0gNABpdm9yeTMAU3BhcnNlTWF0cml4X211bHRpcGx5MwBncmV5MwBkYXJrc2xhdGVncmF5MwBceDMAc25vdzMAbGlnaHR5ZWxsb3czAGhvbmV5ZGV3MwB3aGVhdDMAc3VwMwB0b21hdG8zAHJvc3licm93bjMAbWFyb29uMwBsaWdodHNhbG1vbjMAbGVtb25jaGlmZm9uMwBzcHJpbmdncmVlbjMAZGFya29saXZlZ3JlZW4zAHBhbGVncmVlbjMAZGFya3NlYWdyZWVuMwBsaWdodGN5YW4zAHRhbjMAcGx1bTMAc2Vhc2hlbGwzAGNvcmFsMwBob3RwaW5rMwBsaWdodHBpbmszAGRlZXBwaW5rMwBjb3Juc2lsazMAZmlyZWJyaWNrMwBraGFraTMAbGF2ZW5kZXJibHVzaDMAcGVhY2hwdWZmMwBiaXNxdWUzAGxpZ2h0c2t5Ymx1ZTMAZGVlcHNreWJsdWUzAGxpZ2h0Ymx1ZTMAY2FkZXRibHVlMwBkb2RnZXJibHVlMwBsaWdodHN0ZWVsYmx1ZTMAcm95YWxibHVlMwBzbGF0ZWJsdWUzAG5hdmFqb3doaXRlMwBhbnRpcXVld2hpdGUzAGNob2NvbGF0ZTMAY2hhcnRyZXVzZTMAbWlzdHlyb3NlMwBwYWxldHVycXVvaXNlMwBhenVyZTMAYXF1YW1hcmluZTMAdGhpc3RsZTMAbWVkaXVtcHVycGxlMwBkYXJrb3JhbmdlMwBsaWdodGdvbGRlbnJvZDMAZGFya2dvbGRlbnJvZDMAYnVybHl3b29kMwBnb2xkMwBtZWRpdW1vcmNoaWQzAGRhcmtvcmNoaWQzAHBhbGV2aW9sZXRyZWQzAGluZGlhbnJlZDMAb3JhbmdlcmVkMwBvbGl2ZWRyYWIzAG1hZ2VudGEzAHNpZW5uYTMAXHhGMwBceEUzAFx4RDMAXHhDMwBceEIzAFx4QTMAZ3JleTkzAGdyYXk5MwBceDkzAGdyZXk4MwBncmF5ODMAXHg4MwBncmV5NzMAZ3JheTczAGdyZXk2MwBncmF5NjMAZ3JleTUzAGdyYXk1MwBncmV5NDMAZ3JheTQzAGdyZXkzMwBncmF5MzMAZ3JleTIzAGdyYXkyMwBncmV5MTMAZ3JheTEzAFx4MTMAL3JkZ3k5LzMAL2J1cHU5LzMAL3JkcHU5LzMAL3B1YnU5LzMAL3lsZ25idTkvMwAvZ25idTkvMwAvcmR5bGJ1OS8zAC9yZGJ1OS8zAC9ncmV5czkvMwAvZ3JlZW5zOS8zAC9ibHVlczkvMwAvcHVycGxlczkvMwAvb3JhbmdlczkvMwAvcmVkczkvMwAvcHVvcjkvMwAveWxvcmJyOS8zAC9wdWJ1Z245LzMAL2J1Z245LzMAL3ByZ245LzMAL3JkeWxnbjkvMwAveWxnbjkvMwAvc3BlY3RyYWw5LzMAL3BpeWc5LzMAL2JyYmc5LzMAL3B1cmQ5LzMAL3lsb3JyZDkvMwAvb3JyZDkvMwAvcGFpcmVkOS8zAC9zZXQzOS8zAC9zZXQxOS8zAC9wYXN0ZWwxOS8zAC9yZGd5OC8zAC9idXB1OC8zAC9yZHB1OC8zAC9wdWJ1OC8zAC95bGduYnU4LzMAL2duYnU4LzMAL3JkeWxidTgvMwAvcmRidTgvMwAvYWNjZW50OC8zAC9ncmV5czgvMwAvZ3JlZW5zOC8zAC9ibHVlczgvMwAvcHVycGxlczgvMwAvb3JhbmdlczgvMwAvcmVkczgvMwAvcHVvcjgvMwAveWxvcmJyOC8zAC9wdWJ1Z244LzMAL2J1Z244LzMAL3ByZ244LzMAL3JkeWxnbjgvMwAveWxnbjgvMwAvc3BlY3RyYWw4LzMAL3BpeWc4LzMAL2JyYmc4LzMAL3B1cmQ4LzMAL3lsb3JyZDgvMwAvb3JyZDgvMwAvcGFpcmVkOC8zAC9zZXQzOC8zAC9zZXQyOC8zAC9wYXN0ZWwyOC8zAC9kYXJrMjgvMwAvc2V0MTgvMwAvcGFzdGVsMTgvMwAvcmRneTcvMwAvYnVwdTcvMwAvcmRwdTcvMwAvcHVidTcvMwAveWxnbmJ1Ny8zAC9nbmJ1Ny8zAC9yZHlsYnU3LzMAL3JkYnU3LzMAL2FjY2VudDcvMwAvZ3JleXM3LzMAL2dyZWVuczcvMwAvYmx1ZXM3LzMAL3B1cnBsZXM3LzMAL29yYW5nZXM3LzMAL3JlZHM3LzMAL3B1b3I3LzMAL3lsb3JicjcvMwAvcHVidWduNy8zAC9idWduNy8zAC9wcmduNy8zAC9yZHlsZ243LzMAL3lsZ243LzMAL3NwZWN0cmFsNy8zAC9waXlnNy8zAC9icmJnNy8zAC9wdXJkNy8zAC95bG9ycmQ3LzMAL29ycmQ3LzMAL3BhaXJlZDcvMwAvc2V0MzcvMwAvc2V0MjcvMwAvcGFzdGVsMjcvMwAvZGFyazI3LzMAL3NldDE3LzMAL3Bhc3RlbDE3LzMAL3JkZ3k2LzMAL2J1cHU2LzMAL3JkcHU2LzMAL3B1YnU2LzMAL3lsZ25idTYvMwAvZ25idTYvMwAvcmR5bGJ1Ni8zAC9yZGJ1Ni8zAC9hY2NlbnQ2LzMAL2dyZXlzNi8zAC9ncmVlbnM2LzMAL2JsdWVzNi8zAC9wdXJwbGVzNi8zAC9vcmFuZ2VzNi8zAC9yZWRzNi8zAC9wdW9yNi8zAC95bG9yYnI2LzMAL3B1YnVnbjYvMwAvYnVnbjYvMwAvcHJnbjYvMwAvcmR5bGduNi8zAC95bGduNi8zAC9zcGVjdHJhbDYvMwAvcGl5ZzYvMwAvYnJiZzYvMwAvcHVyZDYvMwAveWxvcnJkNi8zAC9vcnJkNi8zAC9wYWlyZWQ2LzMAL3NldDM2LzMAL3NldDI2LzMAL3Bhc3RlbDI2LzMAL2RhcmsyNi8zAC9zZXQxNi8zAC9wYXN0ZWwxNi8zAC9yZGd5NS8zAC9idXB1NS8zAC9yZHB1NS8zAC9wdWJ1NS8zAC95bGduYnU1LzMAL2duYnU1LzMAL3JkeWxidTUvMwAvcmRidTUvMwAvYWNjZW50NS8zAC9ncmV5czUvMwAvZ3JlZW5zNS8zAC9ibHVlczUvMwAvcHVycGxlczUvMwAvb3JhbmdlczUvMwAvcmVkczUvMwAvcHVvcjUvMwAveWxvcmJyNS8zAC9wdWJ1Z241LzMAL2J1Z241LzMAL3ByZ241LzMAL3JkeWxnbjUvMwAveWxnbjUvMwAvc3BlY3RyYWw1LzMAL3BpeWc1LzMAL2JyYmc1LzMAL3B1cmQ1LzMAL3lsb3JyZDUvMwAvb3JyZDUvMwAvcGFpcmVkNS8zAC9zZXQzNS8zAC9zZXQyNS8zAC9wYXN0ZWwyNS8zAC9kYXJrMjUvMwAvc2V0MTUvMwAvcGFzdGVsMTUvMwAvcmRneTQvMwAvYnVwdTQvMwAvcmRwdTQvMwAvcHVidTQvMwAveWxnbmJ1NC8zAC9nbmJ1NC8zAC9yZHlsYnU0LzMAL3JkYnU0LzMAL2FjY2VudDQvMwAvZ3JleXM0LzMAL2dyZWVuczQvMwAvYmx1ZXM0LzMAL3B1cnBsZXM0LzMAL29yYW5nZXM0LzMAL3JlZHM0LzMAL3B1b3I0LzMAL3lsb3JicjQvMwAvcHVidWduNC8zAC9idWduNC8zAC9wcmduNC8zAC9yZHlsZ240LzMAL3lsZ240LzMAL3NwZWN0cmFsNC8zAC9waXlnNC8zAC9icmJnNC8zAC9wdXJkNC8zAC95bG9ycmQ0LzMAL29ycmQ0LzMAL3BhaXJlZDQvMwAvc2V0MzQvMwAvc2V0MjQvMwAvcGFzdGVsMjQvMwAvZGFyazI0LzMAL3NldDE0LzMAL3Bhc3RlbDE0LzMAL3JkZ3kzLzMAL2J1cHUzLzMAL3JkcHUzLzMAL3B1YnUzLzMAL3lsZ25idTMvMwAvZ25idTMvMwAvcmR5bGJ1My8zAC9yZGJ1My8zAC9hY2NlbnQzLzMAL2dyZXlzMy8zAC9ncmVlbnMzLzMAL2JsdWVzMy8zAC9wdXJwbGVzMy8zAC9vcmFuZ2VzMy8zAC9yZWRzMy8zAC9wdW9yMy8zAC95bG9yYnIzLzMAL3B1YnVnbjMvMwAvYnVnbjMvMwAvcHJnbjMvMwAvcmR5bGduMy8zAC95bGduMy8zAC9zcGVjdHJhbDMvMwAvcGl5ZzMvMwAvYnJiZzMvMwAvcHVyZDMvMwAveWxvcnJkMy8zAC9vcnJkMy8zAC9wYWlyZWQzLzMAL3NldDMzLzMAL3NldDIzLzMAL3Bhc3RlbDIzLzMAL2RhcmsyMy8zAC9zZXQxMy8zAC9wYXN0ZWwxMy8zAC9wYWlyZWQxMi8zAC9zZXQzMTIvMwAvcmRneTExLzMAL3JkeWxidTExLzMAL3JkYnUxMS8zAC9wdW9yMTEvMwAvcHJnbjExLzMAL3JkeWxnbjExLzMAL3NwZWN0cmFsMTEvMwAvcGl5ZzExLzMAL2JyYmcxMS8zAC9wYWlyZWQxMS8zAC9zZXQzMTEvMwAvcmRneTEwLzMAL3JkeWxidTEwLzMAL3JkYnUxMC8zAC9wdW9yMTAvMwAvcHJnbjEwLzMAL3JkeWxnbjEwLzMAL3NwZWN0cmFsMTAvMwAvcGl5ZzEwLzMAL2JyYmcxMC8zAC9wYWlyZWQxMC8zAC9zZXQzMTAvMwBpdm9yeTIAZ3JleTIAZGFya3NsYXRlZ3JheTIAXHgyAHNub3cyAGxpZ2h0eWVsbG93MgBob25leWRldzIAUlRyZWVJbnNlcnQyAHdoZWF0MgBzdXAyAG5vcDIAdG9tYXRvMgByb3N5YnJvd24yAG1hcm9vbjIAbGlnaHRzYWxtb24yAGxlbW9uY2hpZmZvbjIAc3ByaW5nZ3JlZW4yAGRhcmtvbGl2ZWdyZWVuMgBwYWxlZ3JlZW4yAGRhcmtzZWFncmVlbjIAbGlnaHRjeWFuMgB0YW4yAHBsdW0yAHNlYXNoZWxsMgBjb3JhbDIAaG90cGluazIAbGlnaHRwaW5rMgBkZWVwcGluazIAY29ybnNpbGsyAGZpcmVicmljazIAa2hha2kyAGxhdmVuZGVyYmx1c2gyAHBlYWNocHVmZjIAYnJvbnplMgBiaXNxdWUyAGxpZ2h0c2t5Ymx1ZTIAZGVlcHNreWJsdWUyAGxpZ2h0Ymx1ZTIAY2FkZXRibHVlMgBkb2RnZXJibHVlMgBsaWdodHN0ZWVsYmx1ZTIAcm95YWxibHVlMgBzbGF0ZWJsdWUyAG5hdmFqb3doaXRlMgBhbnRpcXVld2hpdGUyAGNob2NvbGF0ZTIAY2hhcnRyZXVzZTIAbWlzdHlyb3NlMgBwYWxldHVycXVvaXNlMgBhenVyZTIAYXF1YW1hcmluZTIAdGhpc3RsZTIAbWVkaXVtcHVycGxlMgBkYXJrb3JhbmdlMgBsaWdodGdvbGRlbnJvZDIAZGFya2dvbGRlbnJvZDIAYnVybHl3b29kMgBnb2xkMgBtZWRpdW1vcmNoaWQyAGRhcmtvcmNoaWQyAHBhbGV2aW9sZXRyZWQyAGluZGlhbnJlZDIAb3JhbmdlcmVkMgBvbGl2ZWRyYWIyAG1hZ2VudGEyAHNpZW5uYTIAXHhGMgBceEUyAFx4RDIAXHhDMgBceEIyAFx4QTIAZ3JleTkyAGdyYXk5MgBceDkyAGdyZXk4MgBncmF5ODIAXHg4MgBncmV5NzIAZ3JheTcyAGdyZXk2MgBncmF5NjIAZ3JleTUyAGdyYXk1MgBncmV5NDIAZ3JheTQyAGdyZXkzMgBncmF5MzIAZ3JleTIyAGdyYXkyMgBncmV5MTIAZ3JheTEyAFx4MTIAZnJhYzEyAC9wYWlyZWQxMi8xMgAvc2V0MzEyLzEyAC9yZGd5OS8yAC9idXB1OS8yAC9yZHB1OS8yAC9wdWJ1OS8yAC95bGduYnU5LzIAL2duYnU5LzIAL3JkeWxidTkvMgAvcmRidTkvMgAvZ3JleXM5LzIAL2dyZWVuczkvMgAvYmx1ZXM5LzIAL3B1cnBsZXM5LzIAL29yYW5nZXM5LzIAL3JlZHM5LzIAL3B1b3I5LzIAL3lsb3JicjkvMgAvcHVidWduOS8yAC9idWduOS8yAC9wcmduOS8yAC9yZHlsZ245LzIAL3lsZ245LzIAL3NwZWN0cmFsOS8yAC9waXlnOS8yAC9icmJnOS8yAC9wdXJkOS8yAC95bG9ycmQ5LzIAL29ycmQ5LzIAL3BhaXJlZDkvMgAvc2V0MzkvMgAvc2V0MTkvMgAvcGFzdGVsMTkvMgAvcmRneTgvMgAvYnVwdTgvMgAvcmRwdTgvMgAvcHVidTgvMgAveWxnbmJ1OC8yAC9nbmJ1OC8yAC9yZHlsYnU4LzIAL3JkYnU4LzIAL2FjY2VudDgvMgAvZ3JleXM4LzIAL2dyZWVuczgvMgAvYmx1ZXM4LzIAL3B1cnBsZXM4LzIAL29yYW5nZXM4LzIAL3JlZHM4LzIAL3B1b3I4LzIAL3lsb3JicjgvMgAvcHVidWduOC8yAC9idWduOC8yAC9wcmduOC8yAC9yZHlsZ244LzIAL3lsZ244LzIAL3NwZWN0cmFsOC8yAC9waXlnOC8yAC9icmJnOC8yAC9wdXJkOC8yAC95bG9ycmQ4LzIAL29ycmQ4LzIAL3BhaXJlZDgvMgAvc2V0MzgvMgAvc2V0MjgvMgAvcGFzdGVsMjgvMgAvZGFyazI4LzIAL3NldDE4LzIAL3Bhc3RlbDE4LzIAL3JkZ3k3LzIAL2J1cHU3LzIAL3JkcHU3LzIAL3B1YnU3LzIAL3lsZ25idTcvMgAvZ25idTcvMgAvcmR5bGJ1Ny8yAC9yZGJ1Ny8yAC9hY2NlbnQ3LzIAL2dyZXlzNy8yAC9ncmVlbnM3LzIAL2JsdWVzNy8yAC9wdXJwbGVzNy8yAC9vcmFuZ2VzNy8yAC9yZWRzNy8yAC9wdW9yNy8yAC95bG9yYnI3LzIAL3B1YnVnbjcvMgAvYnVnbjcvMgAvcHJnbjcvMgAvcmR5bGduNy8yAC95bGduNy8yAC9zcGVjdHJhbDcvMgAvcGl5ZzcvMgAvYnJiZzcvMgAvcHVyZDcvMgAveWxvcnJkNy8yAC9vcnJkNy8yAC9wYWlyZWQ3LzIAL3NldDM3LzIAL3NldDI3LzIAL3Bhc3RlbDI3LzIAL2RhcmsyNy8yAC9zZXQxNy8yAC9wYXN0ZWwxNy8yAC9yZGd5Ni8yAC9idXB1Ni8yAC9yZHB1Ni8yAC9wdWJ1Ni8yAC95bGduYnU2LzIAL2duYnU2LzIAL3JkeWxidTYvMgAvcmRidTYvMgAvYWNjZW50Ni8yAC9ncmV5czYvMgAvZ3JlZW5zNi8yAC9ibHVlczYvMgAvcHVycGxlczYvMgAvb3JhbmdlczYvMgAvcmVkczYvMgAvcHVvcjYvMgAveWxvcmJyNi8yAC9wdWJ1Z242LzIAL2J1Z242LzIAL3ByZ242LzIAL3JkeWxnbjYvMgAveWxnbjYvMgAvc3BlY3RyYWw2LzIAL3BpeWc2LzIAL2JyYmc2LzIAL3B1cmQ2LzIAL3lsb3JyZDYvMgAvb3JyZDYvMgAvcGFpcmVkNi8yAC9zZXQzNi8yAC9zZXQyNi8yAC9wYXN0ZWwyNi8yAC9kYXJrMjYvMgAvc2V0MTYvMgAvcGFzdGVsMTYvMgAvcmRneTUvMgAvYnVwdTUvMgAvcmRwdTUvMgAvcHVidTUvMgAveWxnbmJ1NS8yAC9nbmJ1NS8yAC9yZHlsYnU1LzIAL3JkYnU1LzIAL2FjY2VudDUvMgAvZ3JleXM1LzIAL2dyZWVuczUvMgAvYmx1ZXM1LzIAL3B1cnBsZXM1LzIAL29yYW5nZXM1LzIAL3JlZHM1LzIAL3B1b3I1LzIAL3lsb3JicjUvMgAvcHVidWduNS8yAC9idWduNS8yAC9wcmduNS8yAC9yZHlsZ241LzIAL3lsZ241LzIAL3NwZWN0cmFsNS8yAC9waXlnNS8yAC9icmJnNS8yAC9wdXJkNS8yAC95bG9ycmQ1LzIAL29ycmQ1LzIAL3BhaXJlZDUvMgAvc2V0MzUvMgAvc2V0MjUvMgAvcGFzdGVsMjUvMgAvZGFyazI1LzIAL3NldDE1LzIAL3Bhc3RlbDE1LzIAL3JkZ3k0LzIAL2J1cHU0LzIAL3JkcHU0LzIAL3B1YnU0LzIAL3lsZ25idTQvMgAvZ25idTQvMgAvcmR5bGJ1NC8yAC9yZGJ1NC8yAC9hY2NlbnQ0LzIAL2dyZXlzNC8yAC9ncmVlbnM0LzIAL2JsdWVzNC8yAC9wdXJwbGVzNC8yAC9vcmFuZ2VzNC8yAC9yZWRzNC8yAC9wdW9yNC8yAC95bG9yYnI0LzIAL3B1YnVnbjQvMgAvYnVnbjQvMgAvcHJnbjQvMgAvcmR5bGduNC8yAC95bGduNC8yAC9zcGVjdHJhbDQvMgAvcGl5ZzQvMgAvYnJiZzQvMgAvcHVyZDQvMgAveWxvcnJkNC8yAC9vcnJkNC8yAC9wYWlyZWQ0LzIAL3NldDM0LzIAL3NldDI0LzIAL3Bhc3RlbDI0LzIAL2RhcmsyNC8yAC9zZXQxNC8yAC9wYXN0ZWwxNC8yAC9yZGd5My8yAC9idXB1My8yAC9yZHB1My8yAC9wdWJ1My8yAC95bGduYnUzLzIAL2duYnUzLzIAL3JkeWxidTMvMgAvcmRidTMvMgAvYWNjZW50My8yAC9ncmV5czMvMgAvZ3JlZW5zMy8yAC9ibHVlczMvMgAvcHVycGxlczMvMgAvb3JhbmdlczMvMgAvcmVkczMvMgAvcHVvcjMvMgAveWxvcmJyMy8yAC9wdWJ1Z24zLzIAL2J1Z24zLzIAL3ByZ24zLzIAL3JkeWxnbjMvMgAveWxnbjMvMgAvc3BlY3RyYWwzLzIAL3BpeWczLzIAL2JyYmczLzIAL3B1cmQzLzIAL3lsb3JyZDMvMgAvb3JyZDMvMgAvcGFpcmVkMy8yAC9zZXQzMy8yAC9zZXQyMy8yAC9wYXN0ZWwyMy8yAC9kYXJrMjMvMgAvc2V0MTMvMgAvcGFzdGVsMTMvMgAvcGFpcmVkMTIvMgAvc2V0MzEyLzIAL3JkZ3kxMS8yAC9yZHlsYnUxMS8yAC9yZGJ1MTEvMgAvcHVvcjExLzIAL3ByZ24xMS8yAC9yZHlsZ24xMS8yAC9zcGVjdHJhbDExLzIAL3BpeWcxMS8yAC9icmJnMTEvMgAvcGFpcmVkMTEvMgAvc2V0MzExLzIAL3JkZ3kxMC8yAC9yZHlsYnUxMC8yAC9yZGJ1MTAvMgAvcHVvcjEwLzIAL3ByZ24xMC8yAC9yZHlsZ24xMC8yAC9zcGVjdHJhbDEwLzIAL3BpeWcxMC8yAC9icmJnMTAvMgAvcGFpcmVkMTAvMgAvc2V0MzEwLzIAMS4yACAtZGFzaCAyAHN6ID49IDIAbGVuID49IDIAZXhwID09IDEgfHwgZXhwID09IDIAZGltID09IDIATkRfb3V0KHYpLnNpemUgPT0gMgBpdm9yeTEAZ3JleTEAZGFya3NsYXRlZ3JheTEAXHgxAHNub3cxAGxpZ2h0eWVsbG93MQBob25leWRldzEAbnNsaW1pdDEAd2hlYXQxAHN1cDEAbm9wMQB0b21hdG8xAHJvc3licm93bjEAbWFyb29uMQBsaWdodHNhbG1vbjEAbGVtb25jaGlmZm9uMQBsYXRpbjEAYWdvcGVuMQBzcHJpbmdncmVlbjEAZGFya29saXZlZ3JlZW4xAHBhbGVncmVlbjEAZGFya3NlYWdyZWVuMQBsaWdodGN5YW4xAHRhbjEAcGx1bTEAc2Vhc2hlbGwxAGNvcmFsMQBob3RwaW5rMQBsaWdodHBpbmsxAGRlZXBwaW5rMQBjb3Juc2lsazEAZmlyZWJyaWNrMQBqMCA8PSBpMSAmJiBpMSA8PSBqMQBraGFraTEAbGF2ZW5kZXJibHVzaDEAcGVhY2hwdWZmMQBiaXNxdWUxAGxpZ2h0c2t5Ymx1ZTEAZGVlcHNreWJsdWUxAGxpZ2h0Ymx1ZTEAY2FkZXRibHVlMQBkb2RnZXJibHVlMQBsaWdodHN0ZWVsYmx1ZTEAcm95YWxibHVlMQBzbGF0ZWJsdWUxAG5hdmFqb3doaXRlMQBhbnRpcXVld2hpdGUxAGNob2NvbGF0ZTEAY2hhcnRyZXVzZTEAbWlzdHlyb3NlMQBwYWxldHVycXVvaXNlMQBhenVyZTEAYXF1YW1hcmluZTEAdGhpc3RsZTEAbWVkaXVtcHVycGxlMQBkYXJrb3JhbmdlMQBhcmdfZTAgJiYgYXJnX2UxAGxpZ2h0Z29sZGVucm9kMQBkYXJrZ29sZGVucm9kMQBidXJseXdvb2QxAGdvbGQxAG1lZGl1bW9yY2hpZDEAZGFya29yY2hpZDEAcGFsZXZpb2xldHJlZDEAaW5kaWFucmVkMQBvcmFuZ2VyZWQxAG9saXZlZHJhYjEAbWFnZW50YTEAc2llbm5hMQBceEYxAFx4RTEAXHhEMQBceEMxAFx4QjEAXHhBMQBncmV5OTEAZ3JheTkxAFx4OTEAZ3JleTgxAGdyYXk4MQBceDgxAGdyZXk3MQBncmF5NzEAZ3JleTYxAGdyYXk2MQBncmV5NTEAZ3JheTUxAGdyZXk0MQBncmF5NDEAZ3JleTMxAGdyYXkzMQBncmV5MjEAZ3JheTIxAGdyZXkxMQBncmF5MTEAXHgxMQAvcGFpcmVkMTIvMTEAL3NldDMxMi8xMQAvcmRneTExLzExAC9yZHlsYnUxMS8xMQAvcmRidTExLzExAC9wdW9yMTEvMTEAL3ByZ24xMS8xMQAvcmR5bGduMTEvMTEAL3NwZWN0cmFsMTEvMTEAL3BpeWcxMS8xMQAvYnJiZzExLzExAC9wYWlyZWQxMS8xMQAvc2V0MzExLzExAGNzW2ldLT5zbGFjaygpPi0wLjAwMDAwMDEAL3JkZ3k5LzEAL2J1cHU5LzEAL3JkcHU5LzEAL3B1YnU5LzEAL3lsZ25idTkvMQAvZ25idTkvMQAvcmR5bGJ1OS8xAC9yZGJ1OS8xAC9ncmV5czkvMQAvZ3JlZW5zOS8xAC9ibHVlczkvMQAvcHVycGxlczkvMQAvb3JhbmdlczkvMQAvcmVkczkvMQAvcHVvcjkvMQAveWxvcmJyOS8xAC9wdWJ1Z245LzEAL2J1Z245LzEAL3ByZ245LzEAL3JkeWxnbjkvMQAveWxnbjkvMQAvc3BlY3RyYWw5LzEAL3BpeWc5LzEAL2JyYmc5LzEAL3B1cmQ5LzEAL3lsb3JyZDkvMQAvb3JyZDkvMQAvcGFpcmVkOS8xAC9zZXQzOS8xAC9zZXQxOS8xAC9wYXN0ZWwxOS8xAC9yZGd5OC8xAC9idXB1OC8xAC9yZHB1OC8xAC9wdWJ1OC8xAC95bGduYnU4LzEAL2duYnU4LzEAL3JkeWxidTgvMQAvcmRidTgvMQAvYWNjZW50OC8xAC9ncmV5czgvMQAvZ3JlZW5zOC8xAC9ibHVlczgvMQAvcHVycGxlczgvMQAvb3JhbmdlczgvMQAvcmVkczgvMQAvcHVvcjgvMQAveWxvcmJyOC8xAC9wdWJ1Z244LzEAL2J1Z244LzEAL3ByZ244LzEAL3JkeWxnbjgvMQAveWxnbjgvMQAvc3BlY3RyYWw4LzEAL3BpeWc4LzEAL2JyYmc4LzEAL3B1cmQ4LzEAL3lsb3JyZDgvMQAvb3JyZDgvMQAvcGFpcmVkOC8xAC9zZXQzOC8xAC9zZXQyOC8xAC9wYXN0ZWwyOC8xAC9kYXJrMjgvMQAvc2V0MTgvMQAvcGFzdGVsMTgvMQAvcmRneTcvMQAvYnVwdTcvMQAvcmRwdTcvMQAvcHVidTcvMQAveWxnbmJ1Ny8xAC9nbmJ1Ny8xAC9yZHlsYnU3LzEAL3JkYnU3LzEAL2FjY2VudDcvMQAvZ3JleXM3LzEAL2dyZWVuczcvMQAvYmx1ZXM3LzEAL3B1cnBsZXM3LzEAL29yYW5nZXM3LzEAL3JlZHM3LzEAL3B1b3I3LzEAL3lsb3JicjcvMQAvcHVidWduNy8xAC9idWduNy8xAC9wcmduNy8xAC9yZHlsZ243LzEAL3lsZ243LzEAL3NwZWN0cmFsNy8xAC9waXlnNy8xAC9icmJnNy8xAC9wdXJkNy8xAC95bG9ycmQ3LzEAL29ycmQ3LzEAL3BhaXJlZDcvMQAvc2V0MzcvMQAvc2V0MjcvMQAvcGFzdGVsMjcvMQAvZGFyazI3LzEAL3NldDE3LzEAL3Bhc3RlbDE3LzEAL3JkZ3k2LzEAL2J1cHU2LzEAL3JkcHU2LzEAL3B1YnU2LzEAL3lsZ25idTYvMQAvZ25idTYvMQAvcmR5bGJ1Ni8xAC9yZGJ1Ni8xAC9hY2NlbnQ2LzEAL2dyZXlzNi8xAC9ncmVlbnM2LzEAL2JsdWVzNi8xAC9wdXJwbGVzNi8xAC9vcmFuZ2VzNi8xAC9yZWRzNi8xAC9wdW9yNi8xAC95bG9yYnI2LzEAL3B1YnVnbjYvMQAvYnVnbjYvMQAvcHJnbjYvMQAvcmR5bGduNi8xAC95bGduNi8xAC9zcGVjdHJhbDYvMQAvcGl5ZzYvMQAvYnJiZzYvMQAvcHVyZDYvMQAveWxvcnJkNi8xAC9vcnJkNi8xAC9wYWlyZWQ2LzEAL3NldDM2LzEAL3NldDI2LzEAL3Bhc3RlbDI2LzEAL2RhcmsyNi8xAC9zZXQxNi8xAC9wYXN0ZWwxNi8xAC9yZGd5NS8xAC9idXB1NS8xAC9yZHB1NS8xAC9wdWJ1NS8xAC95bGduYnU1LzEAL2duYnU1LzEAL3JkeWxidTUvMQAvcmRidTUvMQAvYWNjZW50NS8xAC9ncmV5czUvMQAvZ3JlZW5zNS8xAC9ibHVlczUvMQAvcHVycGxlczUvMQAvb3JhbmdlczUvMQAvcmVkczUvMQAvcHVvcjUvMQAveWxvcmJyNS8xAC9wdWJ1Z241LzEAL2J1Z241LzEAL3ByZ241LzEAL3JkeWxnbjUvMQAveWxnbjUvMQAvc3BlY3RyYWw1LzEAL3BpeWc1LzEAL2JyYmc1LzEAL3B1cmQ1LzEAL3lsb3JyZDUvMQAvb3JyZDUvMQAvcGFpcmVkNS8xAC9zZXQzNS8xAC9zZXQyNS8xAC9wYXN0ZWwyNS8xAC9kYXJrMjUvMQAvc2V0MTUvMQAvcGFzdGVsMTUvMQAvcmRneTQvMQAvYnVwdTQvMQAvcmRwdTQvMQAvcHVidTQvMQAveWxnbmJ1NC8xAC9nbmJ1NC8xAC9yZHlsYnU0LzEAL3JkYnU0LzEAL2FjY2VudDQvMQAvZ3JleXM0LzEAL2dyZWVuczQvMQAvYmx1ZXM0LzEAL3B1cnBsZXM0LzEAL29yYW5nZXM0LzEAL3JlZHM0LzEAL3B1b3I0LzEAL3lsb3JicjQvMQAvcHVidWduNC8xAC9idWduNC8xAC9wcmduNC8xAC9yZHlsZ240LzEAL3lsZ240LzEAL3NwZWN0cmFsNC8xAC9waXlnNC8xAC9icmJnNC8xAC9wdXJkNC8xAC95bG9ycmQ0LzEAL29ycmQ0LzEAL3BhaXJlZDQvMQAvc2V0MzQvMQAvc2V0MjQvMQAvcGFzdGVsMjQvMQAvZGFyazI0LzEAL3NldDE0LzEAL3Bhc3RlbDE0LzEAL3JkZ3kzLzEAL2J1cHUzLzEAL3JkcHUzLzEAL3B1YnUzLzEAL3lsZ25idTMvMQAvZ25idTMvMQAvcmR5bGJ1My8xAC9yZGJ1My8xAC9hY2NlbnQzLzEAL2dyZXlzMy8xAC9ncmVlbnMzLzEAL2JsdWVzMy8xAC9wdXJwbGVzMy8xAC9vcmFuZ2VzMy8xAC9yZWRzMy8xAC9wdW9yMy8xAC95bG9yYnIzLzEAL3B1YnVnbjMvMQAvYnVnbjMvMQAvcHJnbjMvMQAvcmR5bGduMy8xAC95bGduMy8xAC9zcGVjdHJhbDMvMQAvcGl5ZzMvMQAvYnJiZzMvMQAvcHVyZDMvMQAveWxvcnJkMy8xAC9vcnJkMy8xAC9wYWlyZWQzLzEAL3NldDMzLzEAL3NldDIzLzEAL3Bhc3RlbDIzLzEAL2RhcmsyMy8xAC9zZXQxMy8xAC9wYXN0ZWwxMy8xAC9wYWlyZWQxMi8xAC9zZXQzMTIvMQAvcmRneTExLzEAL3JkeWxidTExLzEAL3JkYnUxMS8xAC9wdW9yMTEvMQAvcHJnbjExLzEAL3JkeWxnbjExLzEAL3NwZWN0cmFsMTEvMQAvcGl5ZzExLzEAL2JyYmcxMS8xAC9wYWlyZWQxMS8xAC9zZXQzMTEvMQAvcmRneTEwLzEAL3JkeWxidTEwLzEAL3JkYnUxMC8xAC9wdW9yMTAvMQAvcHJnbjEwLzEAL3JkeWxnbjEwLzEAL3NwZWN0cmFsMTAvMQAvcGl5ZzEwLzEAL2JyYmcxMC8xAC9wYWlyZWQxMC8xAC9zZXQzMTAvMQBsYXRpbi0xAElTT184ODU5LTEASVNPODg1OS0xAElTTy04ODU5LTEAaSA+PSAxAHEtPm4gPT0gMQBydHAtPnNwbGl0LlBhcnRpdGlvbnNbMF0ucGFydGl0aW9uW2ldID09IDAgfHwgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLnBhcnRpdGlvbltpXSA9PSAxAGJ6LnNpemUgJSAzID09IDEAZWRnZV9saXN0X3NpemUoJmN0eC0+VHJlZV9lZGdlKSA9PSBjdHgtPk5fbm9kZXMgLSAxAG5vZGVfc2V0X3NpemUoZy0+bl9pZCkgPT0gb3NpemUgKyAxAG4tPmNvdW50ICsgKCpubiktPmNvdW50ID09IE5PREVDQVJEICsgMQBydHAtPnNwbGl0LlBhcnRpdGlvbnNbMF0uY291bnRbMF0gKyBydHAtPnNwbGl0LlBhcnRpdGlvbnNbMF0uY291bnRbMV0gPT0gTk9ERUNBUkQgKyAxAGdyZXkwAGdyYXkwAGpzb24wACNmMGYwZjAAI2UwZTBlMAB4Yi0+dS5zLmxvY2F0ZWQgPiBBR1hCVUZfSU5MSU5FX1NJWkVfMABcMABUMABceEYwAFx4RTAAXHhEMABceEMwAFx4QjAAXHhBMABncmV5OTAAZ3JheTkwAFx4OTAAZ3JleTgwAGdyYXk4MABceDgwACM4MDgwODAAZ3JleTcwAGdyYXk3MABjY3dyb3QgPT0gMCB8fCBjY3dyb3QgPT0gOTAgfHwgY2N3cm90ID09IDE4MCB8fCBjY3dyb3QgPT0gMjcwAGN3cm90ID09IDAgfHwgY3dyb3QgPT0gOTAgfHwgY3dyb3QgPT0gMTgwIHx8IGN3cm90ID09IDI3MABncmV5NjAAZ3JheTYwAGdyZXk1MABncmF5NTAAZ3JleTQwAGdyYXk0MAByLndpZHRoKCk8MWU0MABncmV5MzAAZ3JheTMwACMzMDMwMzAAZ3JleTIwAGdyYXkyMABncmV5MTAAZ3JheTEwAFx4MTAAIzEwMTAxMAAvcGFpcmVkMTIvMTAAL3NldDMxMi8xMAAvcmRneTExLzEwAC9yZHlsYnUxMS8xMAAvcmRidTExLzEwAC9wdW9yMTEvMTAAL3ByZ24xMS8xMAAvcmR5bGduMTEvMTAAL3NwZWN0cmFsMTEvMTAAL3BpeWcxMS8xMAAvYnJiZzExLzEwAC9wYWlyZWQxMS8xMAAvc2V0MzExLzEwAC9yZGd5MTAvMTAAL3JkeWxidTEwLzEwAC9yZGJ1MTAvMTAAL3B1b3IxMC8xMAAvcHJnbjEwLzEwAC9yZHlsZ24xMC8xMAAvc3BlY3RyYWwxMC8xMAAvcGl5ZzEwLzEwAC9icmJnMTAvMTAAL3BhaXJlZDEwLzEwAC9zZXQzMTAvMTAAMTIwMABncmV5MTAwAGdyYXkxMDAASVNPLUlSLTEwMAAxMDAwMAAlIVBTLUFkb2JlLTMuMAAxMy4xLjAAbnogPiAwAGxpc3QtPmNhcGFjaXR5ID4gMABkaXN0ID4gMABwYXRoY291bnQgPiAwAHdndCA+IDAAbnNpdGVzID4gMABzaWRlcyA+IDAAcnYgPT0gMCB8fCAoTkRfb3JkZXIocnYpLU5EX29yZGVyKHYpKSpkaXIgPiAwAGxlbiA+IDAAcXQxLT5uID4gMCAmJiBxdDItPm4gPiAwAHdpZHRoID4gMABsaXN0LT5zaXplID4gMABkaWN0LT5zaXplID4gMABzcGwtPnNpemUgPiAwAHNlbGYtPnNpemUgPiAwAGJ6LnNpemUgPiAwAGJvdW5kID4gMABncmFwaC0+d2VpZ2h0c1t4XSA+IDAAZ3JhcGgtPndlaWdodHNbbl9lZGdlc10gPiAwAG0gPiAwICYmIG4gPiAwICYmIG56ID49IDAAdCA+PSAwAG5ub2RlcyA+PSAwAG5fb2JzID49IDAAbiA+PSAwAG4tPmxldmVsID49IDAAdG90YWwgPj0gMABvcmlnaW5hbCA+PSAwAE1heHJhbmsgPj0gMABQYWNrID49IDAAaWkgPCAxPDxkaW0gJiYgaWkgPj0gMAB3aWR0aCA+PSAwAGpkaWFnID49IDAAaWRpYWcgPj0gMABkID49IDAAcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzBdID49IDAgJiYgcnRwLT5zcGxpdC5QYXJ0aXRpb25zWzBdLmNvdW50WzFdID49IDAAViA+PSAwAGFnbm5vZGVzKGdyYXBoKSA+PSAwAGFnbm5vZGVzKGcpID49IDAARURfdHJlZV9pbmRleChlKSA+PSAwAEVEX2NvdW50KGUpID49IDAAb2JqcDEtPnN6LnggPT0gMCAmJiBvYmpwMS0+c3oueSA9PSAwAGNfY250ID09IDAAcmFua19yZXN1bHQgPT0gMABnZXR0aW1lb2ZkYXlfcmVzID09IDAAaiA9PSAwAE5EX2luKHJpZ2h0KS5zaXplICsgTkRfb3V0KHJpZ2h0KS5zaXplID09IDAAYS5zaGFwZSA9PSAwIHx8IGIuc2hhcGUgPT0gMABkdHNpemUoZGVzdCkgPT0gMABkdHNpemUoZy0+bl9zZXEpID09IDAAZHRzaXplKGctPmdfc2VxKSA9PSAwAGR0c2l6ZShnLT5lX3NlcSkgPT0gMABHRF9taW5yYW5rKGcpID09IDAAZHRzaXplKGctPmdfaWQpID09IDAAZHRzaXplKGctPmVfaWQpID09IDAAY29zeCAhPSAwIHx8IHNpbnggIT0gMABtZW1jbXAoJnN0eWxlLCAmKGdyYXBodml6X3BvbHlnb25fc3R5bGVfdCl7MH0sIHNpemVvZihzdHlsZSkpICE9IDAAcmVzdWx0ID09IChpbnQpKHNpemUgLSAxKSB8fCByZXN1bHQgPCAwAG1hc2tbaWldIDwgMABORF9oZWFwaW5kZXgodikgPCAwAFwvAFgxMS8AJS4qcy4Ac3BlY2lmaWVkIHJvb3Qgbm9kZSAiJXMiIHdhcyBub3QgZm91bmQuAEdyYXBoICVzIGhhcyBhcnJheSBwYWNraW5nIHdpdGggdXNlciB2YWx1ZXMgYnV0IG5vICJzb3J0diIgYXR0cmlidXRlcyBhcmUgZGVmaW5lZC4AMS4ALTAuACUhUFMtQWRvYmUtACVQREYtADwhLS0AICwAKwAqAHN0cmVxKGFwdHItPnUubmFtZSxLZXkpACFpc19leGFjdGx5X2VxdWFsKFIueCwgUS54KSB8fCAhaXNfZXhhY3RseV9lcXVhbChSLnksIFEueSkATkRfb3JkZXIodikgPCBORF9vcmRlcih3KQB1ID09IFVGX2ZpbmQodSkAIXBvaW50c19pc19lbXB0eShwbGlzdCkAIW9iamxpc3RfaXNfZW1wdHkobGlzdCkAIXNmb250X2lzX2VtcHR5KGxpc3QpACFyb3dzX2lzX2VtcHR5KGxpc3QpACF0c3RzX2lzX2VtcHR5KGxpc3QpACFwb2ludHNfaXNfZW1wdHkobGlzdCkAIWNvbG9yc2Vnc19pc19lbXB0eShsaXN0KQAhZGZzX3N0YWNrX2lzX2VtcHR5KGxpc3QpACFwYnNfc2l6ZV9pc19lbXB0eShsaXN0KQBvYmpsaXN0X2lzX2NvbnRpZ3VvdXMobGlzdCkAZGVnbGlzdF9pc19jb250aWd1b3VzKGxpc3QpAG5vZGVsaXN0X2lzX2NvbnRpZ3VvdXMobGlzdCkAY2xpc3RfaXNfY29udGlndW91cyhsaXN0KQBlZGdlX3NldF9pc19jb250aWd1b3VzKGxpc3QpAHBvaW50c19pc19jb250aWd1b3VzKGxpc3QpAHN0cnNfaXNfY29udGlndW91cyhsaXN0KQBBZ3JhcGhzX2lzX2NvbnRpZ3VvdXMobGlzdCkAYm94ZXNfaXNfY29udGlndW91cyhsaXN0KQBsYXllcl9uYW1lc19pc19jb250aWd1b3VzKGxpc3QpAHNub2Rlc19pc19jb250aWd1b3VzKGxpc3QpAHZhcmFycl9pc19jb250aWd1b3VzKGxpc3QpAGJlemllcl9wYXRoX2lzX2NvbnRpZ3VvdXMobGlzdCkAcGJzX3NpemVfaXNfY29udGlndW91cyhsaXN0KQBvbmUgPD0gbm9kZWxpc3Rfc2l6ZShsaXN0KQBucCA8IG5vZGVsaXN0X3NpemUobGlzdCkAc3RkOjppc19oZWFwKGhlYXAuYmVnaW4oKSwgaGVhcC5lbmQoKSwgZ3QpACEocS0+cXRzKQAhaW50c19pc19lbXB0eSgmbGVhdmVzKQBvbl9oZWFwKHIpAG5vZGVfc2V0X3NpemUoZy0+bl9pZCkgPT0gKHNpemVfdClkdHNpemUoZy0+bl9zZXEpAE5EX3JhbmsoZnJvbSkgPCBORF9yYW5rKHRvKQBub3Qgd2VsbC1mb3JtZWQgKGludmFsaWQgdG9rZW4pAGFnc3VicmVwKGcsbikAbiAhPSBORF9uZXh0KG4pAGZpbmRfZmFzdF9ub2RlKGcsIG4pAChudWxsKQAoIWpjbikgJiYgKCF2YWwpACEocS0+bCkAc3ltLT5pZCA+PSAwICYmIHN5bS0+aWQgPCB0b3BkaWN0c2l6ZShvYmopAG1vdmUgdG8gKCUuMGYsICUuMGYpADsgc3BsaW5lIHRvICglLjBmLCAlLjBmKQA7IGxpbmUgdG8gKCUuMGYsICUuMGYpAFNwYXJzZU1hdHJpeF9pc19zeW1tZXRyaWMoQSwgdHJ1ZSkAdmFsdWUgJiYgc3RybGVuKHZhbHVlKQBTcGFyc2VNYXRyaXhfaXNfc3ltbWV0cmljKEEsIGZhbHNlKQAhdXNlX3N0YWdlIHx8IHNpemUgPD0gc2l6ZW9mKHN0YWdlKQBFRF9sYWJlbChmZSkAIVRSRUVfRURHRShlKQAhY29uc3RyYWluaW5nX2ZsYXRfZWRnZShnLCBlKQBub2RlX3NldF9pc19lbXB0eShnLT5uX2lkKQByXyVkKQBsXyVkKQAobGliKQAhU3BhcnNlTWF0cml4X2hhc19kaWFnb25hbChBKQAgc2Nhbm5pbmcgYSBIVE1MIHN0cmluZyAobWlzc2luZyAnPic/IGJhZCBuZXN0aW5nPyBsb25nZXIgdGhhbiAlZD8pACBzY2FubmluZyBhIHF1b3RlZCBzdHJpbmcgKG1pc3NpbmcgZW5kcXVvdGU/IGxvbmdlciB0aGFuICVkPykAIHNjYW5uaW5nIGEgLyouLi4qLyBjb21tZW50IChtaXNzaW5nICcqLz8gbG9uZ2VyIHRoYW4gJWQ/KQBmYWxsYmFjayg0KQBvbl9oZWFwKHIwKSB8fCBvbl9oZWFwKHIxKQBhZ3RhaWwoZSkgPT0gVUZfZmluZChhZ3RhaWwoZSkpAGFnaGVhZChlKSA9PSBVRl9maW5kKGFnaGVhZChlKSkAb3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHl5X2dldF9uZXh0X2J1ZmZlcigpAG91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eV9jcmVhdGVfYnVmZmVyKCkAb3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHl5ZW5zdXJlX2J1ZmZlcl9zdGFjaygpAHN0cmVxKG1vZGUsICJyIikgfHwgc3RyZXEobW9kZSwgInJiIikgfHwgc3RyZXEobW9kZSwgInciKSB8fCBzdHJlcShtb2RlLCAid2IiKQBwbmFtZSAhPSBOVUxMICYmICFzdHJlcShwbmFtZSwgIiIpAHNldGxpbmV3aWR0aCgAKSByb3RhdGUoJWQpIHRyYW5zbGF0ZSgAIHRyYW5zZm9ybT0ic2NhbGUoAE5PVEFUSU9OKAAgKAAgbmVhciAnJXMnACVsZiwlbGYsJWxmLCclW14nXScAaXNkaWdpdCgoaW50KWRvdHBbMV0pICYmIGlzZGlnaXQoKGludClkb3RwWzJdKSAmJiBkb3RwWzNdID09ICdcMCcAJgAlACQAdXJsKCMAPHRleHRQYXRoIHhsaW5rOmhyZWY9IiMAPGFyZWEgc2hhcGU9InBvbHkiACBmaWxsPSIjJTAyeCUwMnglMDJ4IgAoc2VxICYgU0VRX01BU0spID09IHNlcSAmJiAic2VxdWVuY2UgSUQgb3ZlcmZsb3ciAGd2X3NvcnRfY29tcGFyID09IE5VTEwgJiYgZ3Zfc29ydF9hcmcgPT0gTlVMTCAmJiAidW5zdXBwb3J0ZWQgcmVjdXJzaXZlIGNhbGwgdG8gZ3Zfc29ydCIAZ3Zfc29ydF9jb21wYXIgIT0gTlVMTCAmJiAibm8gY29tcGFyYXRvciBzZXQgaW4gZ3Zfc29ydCIAb3AtPm9wLnUucG9seWdvbi5jbnQgPD0gSU5UX01BWCAmJiAicG9seWdvbiBjb3VudCBleGNlZWRzIGd2cmVuZGVyX3BvbHlnb24gc3VwcG9ydCIAIHRleHQtYW5jaG9yPSJzdGFydCIAcC54ICE9IGEgJiYgImNhbm5vdCBoYW5kbGUgZWxsaXBzZSB0YW5nZW50IHNsb3BlIGluIGhvcml6b250YWwgZXh0cmVtZSBwb2ludCIAZnVsbF9sZW5ndGhfd2l0aG91dF9zaGFmdCA+IDAgJiYgIm5vbi1wb3NpdGl2ZSBmdWxsIGxlbmd0aCB3aXRob3V0IHNoYWZ0IgA8YXJlYSBzaGFwZT0icmVjdCIAc2l6ZSA+IDAgJiYgImF0dGVtcHQgdG8gYWxsb2NhdGUgYXJyYXkgb2YgMC1zaXplZCBlbGVtZW50cyIAaW5kZXggPCBzZWxmLT5zaXplX2JpdHMgJiYgIm91dCBvZiBib3VuZHMgYWNjZXNzIgBpbmRleCA8IHNlbGYuc2l6ZV9iaXRzICYmICJvdXQgb2YgYm91bmRzIGFjY2VzcyIAKnMxICE9ICpzMiAmJiAiZHVwbGljYXRlIHNlcGFyYXRvciBjaGFyYWN0ZXJzIgBHRF9taW5yYW5rKHN1YmcpIDw9IEdEX21heHJhbmsoc3ViZykgJiYgImNvcnJ1cHRlZCByYW5rIGJvdW5kcyIAaW5kZXggPCBsaXN0LT5zaXplICYmICJpbmRleCBvdXQgb2YgYm91bmRzIgBpbmRleCA8IG5vZGVsaXN0X3NpemUobGlzdCkgJiYgImluZGV4IG91dCBvZiBib3VuZHMiAGluZGV4IDwgZWRnZV9saXN0X3NpemUobGlzdCkgJiYgImluZGV4IG91dCBvZiBib3VuZHMiAGluZGV4IDwgaW50c19zaXplKGxpc3QpICYmICJpbmRleCBvdXQgb2YgYm91bmRzIgBpbmRleCA8IHRyYXBzX3NpemUobGlzdCkgJiYgImluZGV4IG91dCBvZiBib3VuZHMiAGluZGV4IDwgbm9kZXNfc2l6ZShsaXN0KSAmJiAiaW5kZXggb3V0IG9mIGJvdW5kcyIAKHVpbnRwdHJfdClzICUgMiA9PSAwICYmICJoZWFwIHBvaW50ZXIgd2l0aCBsb3cgYml0IHNldCB3aWxsIGNvbGxpZGUgd2l0aCBhbm9ueW1vdXMgSURzIgAgKCslNmxkIGJ5dGVzICVzfCV1LCB4bWxwYXJzZS5jOiVkKSAlKnMiACBmb250LWZhbWlseT0iJXMiACBmb250LXdlaWdodD0iJXMiACBmaWxsPSIlcyIAIGZvbnQtc3RyZXRjaD0iJXMiACBmb250LXN0eWxlPSIlcyIAYmFkIGVkZ2UgbGVuICIlcyIAIGJhc2VsaW5lLXNoaWZ0PSJzdXBlciIAYWd4Ymxlbih4YikgPD0gc2l6ZW9mKHhiLT51LnN0b3JlKSAmJiAiYWd4YnVmIGNvcnJ1cHRpb24iAGNlbGwucm93IDwgdGFibGUtPnJvd19jb3VudCAmJiAib3V0IG9mIHJhbmdlIGNlbGwiAGNlbGwuY29sIDwgdGFibGUtPmNvbHVtbl9jb3VudCAmJiAib3V0IG9mIHJhbmdlIGNlbGwiACB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgBmdWxsX2xlbmd0aCA+IDAgJiYgIm5vbi1wb3NpdGl2ZSBmdWxsIGxlbmd0aCIAZnVsbF9iYXNlX3dpZHRoID4gMCAmJiAibm9uLXBvc2l0aXZlIGZ1bGwgYmFzZSB3aWR0aCIAbm9taW5hbF9iYXNlX3dpZHRoID4gMCAmJiAibm9uLXBvc2l0aXZlIG5vbWluYWwgYmFzZSB3aWR0aCIAIiB3aWR0aD0iJWdweCIgaGVpZ2h0PSIlZ3B4IiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pbiBtZWV0IiB4PSIlZyIgeT0iJWciACIgd2lkdGg9IiVncHgiIGhlaWdodD0iJWdweCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCIgeD0iJWciIHk9IiVnIgAgZm9udC1zaXplPSIlLjJmIgAgZmlsbC1vcGFjaXR5PSIlZiIAPHRleHQgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIAaXNmaW5pdGUobSkgJiYgImVsbGlwc2UgdGFuZ2VudCBzbG9wZSBpcyBpbmZpbml0ZSIAKHhiLT51LnMubG9jYXRlZCA9PSBBR1hCVUZfT05fSEVBUCB8fCB4Yi0+dS5zLmxvY2F0ZWQgPD0gc2l6ZW9mKHhiLT51LnN0b3JlKSkgJiYgImNvcnJ1cHRlZCBhZ3hidWYgdHlwZSIAIHRleHQtYW5jaG9yPSJtaWRkbGUiADxhcmVhIHNoYXBlPSJjaXJjbGUiAGNlbGwtPnJvdyArIGNlbGwtPnJvd3NwYW4gPD0gdGFibGUtPnJvd19jb3VudCAmJiAiY2VsbCBzcGFucyBoaWdoZXIgdGhhbiBjb250YWluaW5nIHRhYmxlIgBjZWxsLnJvdyArIGNlbGwucm93c3BhbiA8PSB0YWJsZS0+cm93X2NvdW50ICYmICJjZWxsIHNwYW5zIGhpZ2hlciB0aGFuIGNvbnRhaW5pbmcgdGFibGUiAGNlbGwtPmNvbCArIGNlbGwtPmNvbHNwYW4gPD0gdGFibGUtPmNvbHVtbl9jb3VudCAmJiAiY2VsbCBzcGFucyB3aWRlciB0aGFuIGNvbnRhaW5pbmcgdGFibGUiAGNlbGwuY29sICsgY2VsbC5jb2xzcGFuIDw9IHRhYmxlLT5jb2x1bW5fY291bnQgJiYgImNlbGwgc3BhbnMgd2lkZXIgdGhhbiBjb250YWluaW5nIHRhYmxlIgBvbGRfbm1lbWIgPCBTSVpFX01BWCAvIHNpemUgJiYgImNsYWltZWQgcHJldmlvdXMgZXh0ZW50IGlzIHRvbyBsYXJnZSIAdGhldGEgPj0gMCAmJiB0aGV0YSA8PSBNX1BJICYmICJ0aGV0YSBvdXQgb2YgcmFuZ2UiAHRhYmxlLT5oZWlnaHRzID09IE5VTEwgJiYgInRhYmxlIGhlaWdodHMgY29tcHV0ZWQgdHdpY2UiAHRhYmxlLT53aWR0aHMgPT0gTlVMTCAmJiAidGFibGUgd2lkdGhzIGNvbXB1dGVkIHR3aWNlIgAgdGV4dC1hbmNob3I9ImVuZCIAIGZvbnQtd2VpZ2h0PSJib2xkIgAgZm9udC1zdHlsZT0iaXRhbGljIgAgYmFzZWxpbmUtc2hpZnQ9InN1YiIAXCIAbGxlbiA8PSBJTlRfTUFYICYmICJYTUwgdG9rZW4gdG9vIGxvbmcgZm9yIGV4cGF0IEFQSSIAIiByeT0iAF9wIiBzdGFydE9mZnNldD0iNTAlIj48dHNwYW4geD0iMCIgZHk9IgAiIGN5PSIAIiB5PSIAIiByeD0iACBjeD0iACB4PSIAIHRhcmdldD0iACBwb2ludHM9IgAgY29vcmRzPSIAIHRleHQtZGVjb3JhdGlvbj0iACBmaWxsPSIAIiBzdHJva2Utd2lkdGg9IgA8aW1hZ2UgeGxpbms6aHJlZj0iADw/eG1sLXN0eWxlc2hlZXQgaHJlZj0iACIgbmFtZT0iACB4bGluazp0aXRsZT0iACB0aXRsZT0iACIgc3Ryb2tlPSIAPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0iADxkZWZzPgo8cmFkaWFsR3JhZGllbnQgaWQ9IgA8bWFwIGlkPSIAPGcgaWQ9IgAgZD0iACIgeTI9IgAiIHgyPSIAIiB5MT0iAHgxPSIAIHZpZXdCb3g9IiVkLjAwICVkLjAwICVkLjAwICVkLjAwIgAgdHJhbnNmb3JtPSJyb3RhdGUoJWQgJWcgJWcpIgBhZ3hibGVuKCZjdHgtPlNidWYpID09IDAgJiYgInBlbmRpbmcgc3RyaW5nIGRhdGEgdGhhdCB3YXMgbm90IGNvbnN1bWVkIChtaXNzaW5nICIgImVuZHN0cigpL2VuZGh0bWxzdHIoKT8pIgAgYWx0PSIiAEN5Y2xlIEVycm9yIQBQdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbGVkIQA8IS0tIEdlbmVyYXRlZCBieSAAJXMlenUgLSMlMDJ4JTAyeCUwMnglMDJ4IAAlcyV6dSAtIyUwMnglMDJ4JTAyeCAAJWMgJXp1IAB0ICV1IAAgY3JlYXRlIHRleHQgAHhMYXlvdXQgAGRlZmF1bHQgAHN0cmljdCAAJXMlenUgLSVzIAAgLXNtb290aCBiZXppZXIgACBtb3ZldG8gACB2ZXJzaW9uIAAgY3JlYXRlIHBvbHlnb24gACAtdGV4dCB7JXN9IC1maWxsIAAgY3JlYXRlIG92YWwgACAtd2lkdGggAG5ld3BhdGggAGdyYXBoIABzLCUuNWcsJS41ZyAAJS41ZywlLjVnLCUuNWcsJS41ZyAAZSwlLjVnLCUuNWcgACVnICVnIAAlLjAzbGYgACUuM2YgACVkICVkICVkICVkICVkICVkICUuMWYgJS40ZiAlZCAlLjFmICUuMWYgJS4wZiAlLjBmIAAgLW91dGxpbmUgACBjcmVhdGUgbGluZSAAbm9kZSAAJWQgAFRvdGFsIHNpemUgPiAxIGluICIlcyIgY29sb3Igc3BlYyAAWyAvUmVjdCBbIABUIABTIABPUEVOIABJIABGIABFIABDIAAgLT4gAFJhbmsgc2VwYXJhdGlvbiA9IABuZXR3b3JrIHNpbXBsZXg6IABVbnNhdGlzZmllZCBjb25zdHJhaW50OiAAQ2FsY3VsYXRpbmcgc2hvcnRlc3QgcGF0aHM6IAAlczogAFNvbHZpbmcgbW9kZWw6IABTZXR0aW5nIHVwIHNwcmluZyBtb2RlbDogAGNvbnZlcnQgZ3JhcGg6IAAgVGl0bGU6IABbR3JhcGh2aXpdICVzOiVkOiAlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6IAAidGV4dCI6IAB7ImZyYWMiOiAlLjAzZiwgImNvbG9yIjogACJuYW1lIjogACJzdHlsZSI6IAAiZmFjZSI6IAAyIAA8IS0tIAAgLS0gACUgAF9wIiAAbF8lZCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIAANICAgICAgICAgICAgICAgIGl0ZXIgPSAlZCwgc3RlcCA9ICVmIEZub3JtID0gJWYgbnogPSAlZCAgSyA9ICVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAKICAgIAA6CSAAICAgICVzfQoAdHJ5aW5nIHRvIGFkZCB0byByZWN0IHslZiArLy0gJWYsICVmICsvLSAlZn0KACNkZWZhdWx0IHsgZmluaXNoIHsgYW1iaWVudCAwLjEgZGlmZnVzZSAwLjkgfSB9CgBwaWdtZW50IHsgY29sb3IgJXMgfQoAbGlnaHRfc291cmNlIHsgPDE1MDAsMzAwMCwtMjUwMD4gY29sb3IgV2hpdGUgfQoAZ2xvYmFsX3NldHRpbmdzIHsgYXNzdW1lZF9nYW1tYSAxLjAgfQoAICAgIHRleHR1cmUgSW1hZ2VUZXh0dXJlIHsgdXJsICIlcyIgfQoAICAgIH0KAC8vc2t5CnBsYW5lIHsgPDAsIDEsIDA+LCAxIGhvbGxvdwogICAgdGV4dHVyZSB7CiAgICAgICAgcGlnbWVudCB7IGJvem8gdHVyYnVsZW5jZSAwLjk1CiAgICAgICAgICAgIGNvbG9yX21hcCB7CiAgICAgICAgICAgICAgICBbMC4wMCByZ2IgPDAuMDUsIDAuMjAsIDAuNTA+XQogICAgICAgICAgICAgICAgWzAuNTAgcmdiIDwwLjA1LCAwLjIwLCAwLjUwPl0KICAgICAgICAgICAgICAgIFswLjc1IHJnYiA8MS4wMCwgMS4wMCwgMS4wMD5dCiAgICAgICAgICAgICAgICBbMC43NSByZ2IgPDAuMjUsIDAuMjUsIDAuMjU+XQogICAgICAgICAgICAgICAgWzEuMDAgcmdiIDwwLjUwLCAwLjUwLCAwLjUwPl0KICAgICAgICAgICAgfQogICAgICAgICAgICBzY2FsZSA8MS4wMCwgMS4wMCwgMS41MD4gKiAyLjUwCiAgICAgICAgICAgIHRyYW5zbGF0ZSA8MC4wMCwgMC4wMCwgMC4wMD4KICAgICAgICB9CiAgICAgICAgZmluaXNoIHsgYW1iaWVudCAxIGRpZmZ1c2UgMCB9CiAgICB9CiAgICBzY2FsZSAxMDAwMAp9Ci8vbWlzdApmb2cgeyBmb2dfdHlwZSAyCiAgICBkaXN0YW5jZSA1MAogICAgY29sb3IgcmdiIDwxLjAwLCAxLjAwLCAxLjAwPiAqIDAuNzUKICAgIGZvZ19vZmZzZXQgMC4xMAogICAgZm9nX2FsdCAxLjUwCiAgICB0dXJidWxlbmNlIDEuNzUKfQovL2duZApwbGFuZSB7IDwwLjAwLCAxLjAwLCAwLjAwPiwgMAogICAgdGV4dHVyZSB7CiAgICAgICAgcGlnbWVudHsgY29sb3IgcmdiIDwwLjI1LCAwLjQ1LCAwLjAwPiB9CiAgICAgICAgbm9ybWFsIHsgYnVtcHMgMC43NSBzY2FsZSAwLjAxIH0KICAgICAgICBmaW5pc2ggeyBwaG9uZyAwLjEwIH0KICAgIH0KfQoAY2FtZXJhIHsgbG9jYXRpb24gPCUuM2YgLCAlLjNmICwgLTUwMC4wMDA+CiAgICAgICAgIGxvb2tfYXQgIDwlLjNmICwgJS4zZiAsIDAuMDAwPgogICAgICAgICByaWdodCB4ICogaW1hZ2Vfd2lkdGggLyBpbWFnZV9oZWlnaHQKICAgICAgICAgYW5nbGUgJS4zZgp9CgAgICAgbWF0ZXJpYWwgTWF0ZXJpYWwgewoAU2hhcGUgewoAICBhcHBlYXJhbmNlIEFwcGVhcmFuY2UgewoAL3VzZXJfc2hhcGVfJWQgewoAZ3JhcGggRyB7CgBhcnJvd2hlYWQgPSA3ICVzIG5vdCB1c2VkIGJ5IGdyYXBodml6CgBib3hyYWQgPSAwICVzIG5vIHJvdW5kZWQgY29ybmVycyBpbiBncmFwaHZpegoAb3V0IG9mIG1lbW9yeQoAJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkKAEdyYXBodml6IGJ1aWx0IHdpdGhvdXQgYW55IHRyaWFuZ3VsYXRpb24gbGlicmFyeQoAcmVtb3ZlX292ZXJsYXA6IEdyYXBodml6IG5vdCBidWlsdCB3aXRoIHRyaWFuZ3VsYXRpb24gbGlicmFyeQoAJXMgZmlsbCBoYXMgbm8gbWVhbmluZyBpbiBEV0IgMiwgZ3BpYyBjYW4gdXNlIGZpbGwgb3IgZmlsbGVkLCAxMHRoIEVkaXRpb24gdXNlcyBmaWxsIG9ubHkKAGJveHJhZD0yLjAgJXMgd2lsbCBiZSByZXNldCB0byAwLjAgYnkgZ3BpYyBvbmx5CgAlZCAlZCAjJTAyeCUwMnglMDJ4CgBIZWFwIG92ZXJmbG93CgB0ZXh0IHsKICAgIHR0ZiAiJXMiLAogICAgIiVzIiwgJS4zZiwgJS4zZgogICAgICAgIG5vX3NoYWRvdwoAJWQgJWQgJWQgJS4wZiAlZCAlZCAlZCAlZCAlZCAlLjFmICVkICVkICVkICVkICVkICV6dQoAdG90YWwgYWRkZWQgc28gZmFyID0gJXp1CgByb290ID0gJXMgbWF4IHN0ZXBzIHRvIHJvb3QgPSAlbGx1CgAucHMgJS4wZipcbihTRnUvJS4wZnUKACAgbWFyZ2luICV1CgBOdW1iZXIgb2YgaXRlcmF0aW9ucyA9ICV1CgBvdmVybGFwIFsldV0gOiAldQoAICVzIGFsaWduZWR0ZXh0CgBsYXllcnMgbm90IHN1cHBvcnRlZCBpbiAlcyBvdXRwdXQKAGFkZF90cmVlX2VkZ2U6IGVtcHR5IG91dGVkZ2UgbGlzdAoAYWRkX3RyZWVfZWRnZTogZW1wdHkgaW5lZGdlIGxpc3QKAE5vIGxpYnogc3VwcG9ydAoAJXMgLlBTIHcvbyBhcmdzIGNhdXNlcyBHTlUgcGljIHRvIHNjYWxlIGRyYXdpbmcgdG8gZml0IDguNXgxMSBwYXBlcjsgRFdCIGRvZXMgbm90CgAlcyBHTlUgcGljIHN1cHBvcnRzIGEgbGluZXRoaWNrIHZhcmlhYmxlIHRvIHNldCBsaW5lIHRoaWNrbmVzczsgRFdCIGFuZCAxMHRoIEVkLiBkbyBub3QKACVzIEdOVSBwaWMgc3VwcG9ydHMgYSBib3hyYWQgdmFyaWFibGUgdG8gZHJhdyBib3hlcyB3aXRoIHJvdW5kZWQgY29ybmVyczsgRFdCIGFuZCAxMHRoIEVkLiBkbyBub3QKACAvJXMgc2V0X2ZvbnQKACVzJS4qcyBpcyBub3QgYSB0cm9mZiBmb250CgBjZWxsIHNpemUgdG9vIHNtYWxsIGZvciBjb250ZW50CgB0YWJsZSBzaXplIHRvbyBzbWFsbCBmb3IgY29udGVudAoAJSVFbmREb2N1bWVudAoAVW5jbG9zZWQgY29tbWVudAoATGFiZWwgY2xvc2VkIGJlZm9yZSBlbmQgb2YgSFRNTCBlbGVtZW50CgBQb3J0cmFpdAoAZml4ZWQgY2VsbCBzaXplIHdpdGggdW5zcGVjaWZpZWQgd2lkdGggb3IgaGVpZ2h0CgBmaXhlZCB0YWJsZSBzaXplIHdpdGggdW5zcGVjaWZpZWQgd2lkdGggb3IgaGVpZ2h0CgBwb3MgYXR0cmlidXRlIGZvciBlZGdlICglcywlcykgZG9lc24ndCBoYXZlIDNuKzEgcG9pbnRzCgAgIGdlbmVyYXRlZCAlZCBjb25zdHJhaW50cwoAc3BsaW5lcyBhbmQgY2x1c3RlciBlZGdlcyBub3Qgc3VwcG9ydGVkIC0gdXNpbmcgbGluZSBzZWdtZW50cwoAb2JqZWN0cwoAV2FybmluZzogbm9kZSAlcywgcG9zaXRpb24gJXMsIGV4cGVjdGVkIHR3byBmbG9hdHMKAGZvbnQgbmFtZSAlcyBjb250YWlucyBjaGFyYWN0ZXJzIHRoYXQgbWF5IG5vdCBiZSBhY2NlcHRlZCBieSBzb21lIFBTIHZpZXdlcnMKAGZvbnQgbmFtZSAlcyBpcyBsb25nZXIgdGhhbiAyOSBjaGFyYWN0ZXJzIHdoaWNoIG1heSBiZSByZWplY3RlZCBieSBzb21lIFBTIHZpZXdlcnMKAGNhbm5vdCBhbGxvY2F0ZSBwcwoAc2NhbGU9MS4wICVzIHJlcXVpcmVkIGZvciBjb21wYXJpc29ucwoAU2V0dGluZyBpbml0aWFsIHBvc2l0aW9ucwoAJXMgRFdCIDIgY29tcGF0aWJpbGl0eSBkZWZpbml0aW9ucwoAYXJyYXkgcGFja2luZzogJXMgJXp1IHJvd3MgJXp1IGNvbHVtbnMKAHN5bnRheCBhbWJpZ3VpdHkgLSBiYWRseSBkZWxpbWl0ZWQgbnVtYmVyICclcycgaW4gbGluZSAlZCBvZiAlcyBzcGxpdHMgaW50byB0d28gdG9rZW5zCgBlZGdlIGxhYmVscyB3aXRoIHNwbGluZXM9Y3VydmVkIG5vdCBzdXBwb3J0ZWQgaW4gZG90IC0gdXNlIHhsYWJlbHMKAGZsYXQgZWRnZSBiZXR3ZWVuIGFkamFjZW50IG5vZGVzIG9uZSBvZiB3aGljaCBoYXMgYSByZWNvcmQgc2hhcGUgLSByZXBsYWNlIHJlY29yZHMgd2l0aCBIVE1MLWxpa2UgbGFiZWxzCgBvdXQgb2YgbWVtb3J5IHdoZW4gdHJ5aW5nIHRvIGFsbG9jYXRlICV6dSBieXRlcwoAaW50ZWdlciBvdmVyZmxvdyB3aGVuIHRyeWluZyB0byBhbGxvY2F0ZSAlenUgKiAlenUgYnl0ZXMKAHVwZGF0ZTogbWlzbWF0Y2hlZCBsY2EgaW4gdHJlZXVwZGF0ZXMKAGdyYXBoICVzLCBjb29yZCAlcywgZXhwZWN0ZWQgZm91ciBkb3VibGVzCgBub2RlICVzLCBwb3NpdGlvbiAlcywgZXhwZWN0ZWQgdHdvIGRvdWJsZXMKAEZvdW5kICVkIERpRy1Db0xhIGJvdW5kYXJpZXMKAEluY2hlcwoAKCU0enUpICU3enUgbm9kZXMgJTd6dSBlZGdlcwoAY29tcG91bmRFZGdlczogY291bGQgbm90IGNvbnN0cnVjdCBvYnN0YWNsZXMgLSBmYWxsaW5nIGJhY2sgdG8gc3RyYWlnaHQgbGluZSBlZGdlcwoAdGhlIGJvdW5kaW5nIGJveGVzIG9mIHNvbWUgbm9kZXMgdG91Y2ggLSBmYWxsaW5nIGJhY2sgdG8gc3RyYWlnaHQgbGluZSBlZGdlcwoAY29tcG91bmRFZGdlczogbm9kZXMgdG91Y2ggLSBmYWxsaW5nIGJhY2sgdG8gc3RyYWlnaHQgbGluZSBlZGdlcwoAc29tZSBub2RlcyB3aXRoIG1hcmdpbiAoJS4wMmYsJS4wMmYpIHRvdWNoIC0gZmFsbGluZyBiYWNrIHRvIHN0cmFpZ2h0IGxpbmUgZWRnZXMKAG1lcmdlMjogZ3JhcGggJXMsIHJhbmsgJWQgaGFzIG9ubHkgJWQgPCAlZCBub2RlcwoAU2Nhbm5pbmcgZ3JhcGggJXMsICVkIG5vZGVzCgBXYXJuaW5nOiBubyBoYXJkLWNvZGVkIG1ldHJpY3MgZm9yICclcycuICBGYWxsaW5nIGJhY2sgdG8gJ1RpbWVzJyBtZXRyaWNzCgBpbiBlZGdlICVzJXMlcwoAVXNpbmcgJXM6ICVzOiVzCgBGb3JtYXQ6ICIlcyIgbm90IHJlY29nbml6ZWQuIFVzZSBvbmUgb2Y6JXMKAExheW91dCB0eXBlOiAiJXMiIG5vdCByZWNvZ25pemVkLiBVc2Ugb25lIG9mOiVzCgBsYXlvdXQgJXMKAC5mdCAlcwoAYmFkIGxhYmVsIGZvcm1hdCAlcwoAaW4gcm91dGVzcGxpbmVzLCBlZGdlIGlzIGEgbG9vcCBhdCAlcwoAICAgICAgICU3ZCBub2RlcyAlN2QgZWRnZXMgJTd6dSBjb21wb25lbnRzICVzCgBpbiBsYWJlbCBvZiBlZGdlICVzICVzICVzCgAgIEVkZ2UgJXMgJXMgJXMKAG9ydGhvICVzICVzCgBwb2x5bGluZSAlcyAlcwoAc3BsaW5lICVzICVzCgByZWN0YW5nbGUgKCUuMGYsJS4wZikgKCUuMGYsJS4wZikgJXMgJXMKAGluIGNsdXN0ZXIgJXMKACVzIHdhcyBhbHJlYWR5IGluIGEgcmFua3NldCwgZGVsZXRlZCBmcm9tIGNsdXN0ZXIgJXMKACVzIC0+ICVzOiB0YWlsIG5vdCBpbnNpZGUgdGFpbCBjbHVzdGVyICVzCgAlcyAtPiAlczogaGVhZCBpcyBpbnNpZGUgdGFpbCBjbHVzdGVyICVzCgBoZWFkIGNsdXN0ZXIgJXMgaW5zaWRlIHRhaWwgY2x1c3RlciAlcwoAaGVhZCBub2RlICVzIGluc2lkZSB0YWlsIGNsdXN0ZXIgJXMKACVzIC0+ICVzOiBoZWFkIG5vdCBpbnNpZGUgaGVhZCBjbHVzdGVyICVzCgAlcyAtPiAlczogdGFpbCBpcyBpbnNpZGUgaGVhZCBjbHVzdGVyICVzCgB0YWlsIGNsdXN0ZXIgJXMgaW5zaWRlIGhlYWQgY2x1c3RlciAlcwoAdGFpbCBub2RlICVzIGluc2lkZSBoZWFkIGNsdXN0ZXIgJXMKAFVuaGFuZGxlZCBhZGp1c3Qgb3B0aW9uICVzCgByZXBvc2l0aW9uICVzCgBubyBwb3NpdGlvbiBmb3IgZWRnZSB3aXRoIHhsYWJlbCAlcwoAbm8gcG9zaXRpb24gZm9yIGVkZ2Ugd2l0aCB0YWlsIGxhYmVsICVzCgBubyBwb3NpdGlvbiBmb3IgZWRnZSB3aXRoIGxhYmVsICVzCgBubyBwb3NpdGlvbiBmb3IgZWRnZSB3aXRoIGhlYWQgbGFiZWwgJXMKAC8vKioqIGJlZ2luX2dyYXBoICVzCgBNYXguIGl0ZXJhdGlvbnMgKCVkKSByZWFjaGVkIG9uIGdyYXBoICVzCgBDb3VsZCBub3QgcGFyc2UgIl9iYWNrZ3JvdW5kIiBhdHRyaWJ1dGUgaW4gZ3JhcGggJXMKAGluIGxhYmVsIG9mIGdyYXBoICVzCgBDcmVhdGluZyBlZGdlcyB1c2luZyAlcwoAQWRqdXN0aW5nICVzIHVzaW5nICVzCgAlcyB3aGlsZSBvcGVuaW5nICVzCgBkZXJpdmUgZ3JhcGggX2RnXyVkIG9mICVzCgAgXSAgJXp1IHRydWUgJXMKAF0gICVkIHRydWUgJXMKACBdICAlenUgZmFsc2UgJXMKAF0gICVkIGZhbHNlICVzCgBtYWtlUG9seTogdW5rbm93biBzaGFwZSB0eXBlICVzCgBtYWtlQWRkUG9seTogdW5rbm93biBzaGFwZSB0eXBlICVzCgB1c2luZyAlcyBmb3IgdW5rbm93biBzaGFwZSAlcwoAICBvY3RyZWUgc2NoZW1lICVzCgBjYW4ndCBvcGVuIGxpYnJhcnkgZmlsZSAlcwoAY2FuJ3QgZmluZCBsaWJyYXJ5IGZpbGUgJXMKAEJvdW5kaW5nQm94IG5vdCBmb3VuZCBpbiBlcHNmIGZpbGUgJXMKAGNvdWxkbid0IG9wZW4gZXBzZiBmaWxlICVzCgBjb3VsZG4ndCByZWFkIGZyb20gZXBzZiBmaWxlICVzCgBpbiBub2RlICVzCgBzaGFwZWZpbGUgbm90IHNldCBvciBub3QgZm91bmQgZm9yIGVwc2Ygbm9kZSAlcwoAaW4gbGFiZWwgb2Ygbm9kZSAlcwoAZW5kICVzCgByYW5raW5nOiBmYWlsdXJlIHRvIGNyZWF0ZSBzdHJvbmcgY29uc3RyYWludCBlZGdlIGJldHdlZW4gbm9kZXMgJXMgYW5kICVzCgBvb3BzLCBpbnRlcm5hbCBlcnJvcjogdW5oYW5kbGVkIGNvbG9yIHR5cGU9JWQgJXMKACVkICVkICVkICVkICVkICVkICVkICVkICVkICUuMWYgJWQgJWQgJWQgJWQgJWQgJWQKICVkICVzCgByb290ID0gJXMKAC8vKioqIHRleHRzcGFuOiAlcywgZm9udHNpemUgPSAlLjNmLCBmb250bmFtZSA9ICVzCgB0cmllcyA9ICVkLCBtb2RlID0gJXMKAC8vKioqIGNvbW1lbnQ6ICVzCgBmb250bmFtZTogIiVzIiByZXNvbHZlZCB0bzogJXMKACUlJSVQYWdlT3JpZW50YXRpb246ICVzCgBkZWxhdW5heV90cmlhbmd1bGF0aW9uOiAlcwoAZGVsYXVuYXlfdHJpOiAlcwoAZ3ZwcmludGY6ICVzCgBuZXN0aW5nIG5vdCBhbGxvd2VkIGluIHN0eWxlOiAlcwoAdW5tYXRjaGVkICcpJyBpbiBzdHlsZTogJXMKAHVubWF0Y2hlZCAnKCcgaW4gc3R5bGU6ICVzCgAlJSUlVGl0bGU6ICVzCgAlcyBUaXRsZTogJXMKACMgVGl0bGU6ICVzCgAvLyoqKiBiZWdpbl9ub2RlOiAlcwoAcmVhbGxvYyBmYWlsZWQ6ICVzCgBsaWIvcGF0aHBsYW4vJXM6JWQ6ICVzCgBncmlkKCVkLCVkKTogJXMKAENvdWxkIG5vdCBvcGVuICIlcyIgZm9yIHdyaXRpbmcgOiAlcwoAc3RhcnQgcG9ydDogKCUuNWcsICUuNWcpLCB0YW5nZW50IGFuZ2xlOiAlLjVnLCAlcwoAZW5kIHBvcnQ6ICglLjVnLCAlLjVnKSwgdGFuZ2VudCBhbmdsZTogJS41ZywgJXMKACBbJXp1XSAlcCBzZXQgJWQgKCUuMDJmLCUuMDJmKSAoJS4wMmYsJS4wMmYpICVzCgAlJSAlcwoAIyAlcwoAICBtb2RlICAgJXMKAGNvbmp1Z2F0ZV9ncmFkaWVudDogdW5leHBlY3RlZCBsZW5ndGggMCB2ZWN0b3IKACVzIHRvIGNoYW5nZSBkcmF3aW5nIHNpemUsIG11bHRpcGx5IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9uIHRoZSAuUFMgbGluZSBhYm92ZSBhbmQgdGhlIG51bWJlciBvbiB0aGUgdHdvIGxpbmVzIGJlbG93IChyb3VuZGVkIHRvIHRoZSBuZWFyZXN0IGludGVnZXIpIGJ5IGEgc2NhbGUgZmFjdG9yCgBhZGRfc2VnbWVudDogZXJyb3IKACUuNWcgJS41ZyAlLjVnICVzY29sb3IKADAgMCAwIGVkZ2Vjb2xvcgoAMC44IDAuOCAwLjggc2V0cmdiY29sb3IKADAgMCAxIHNldHJnYmNvbG9yCgAxIDAgMCBzZXRyZ2Jjb2xvcgoAMCAwIDAgc2V0cmdiY29sb3IKACVkICVkIHNldGxheWVyCgAvLyoqKiBlbmRfbGF5ZXIKAFVURi04IGlucHV0IHVzZXMgbm9uLUxhdGluMSBjaGFyYWN0ZXJzIHdoaWNoIGNhbm5vdCBiZSBoYW5kbGVkIGJ5IHRoaXMgUG9zdFNjcmlwdCBkcml2ZXIKAExldHRlcgoALy8qKiogYmVnaW5fY2x1c3RlcgoALy8qKiogZW5kX2NsdXN0ZXIKAHJlbW92aW5nIGVtcHR5IGNsdXN0ZXIKAENlbnRlcgoAV2FybmluZzogbm8gdmFsdWUgZm9yIHdpZHRoIG9mIG5vbi1BU0NJSSBjaGFyYWN0ZXIgJXUuIEZhbGxpbmcgYmFjayB0byB3aWR0aCBvZiBzcGFjZSBjaGFyYWN0ZXIKAGJhc2UgcmVmZXJlcgoAJSVQYWdlVHJhaWxlcgoAJSVUcmFpbGVyCgAvLyoqKiBiZXppZXIKACIlcyIgd2FzIG5vdCBmb3VuZCBhcyBhIGZpbGUgb3IgYXMgYSBzaGFwZSBsaWJyYXJ5IG1lbWJlcgoAc3RvcAoAIGN1cnZldG8KAG5ld3BhdGggJS4wZiAlLjBmIG1vdmV0bwoAJS4wZiAlLjBmIGxpbmV0bwoAIGxheW91dD1uZWF0bwoAbm9kZSAlcyBpbiBncmFwaCAlcyBoYXMgbm8gcG9zaXRpb24KACVzIG1heHBzaHQgYW5kIG1heHBzd2lkIGhhdmUgbm8gbWVhbmluZyBpbiBEV0IgMi4wLCBzZXQgcGFnZSBib3VuZGFyaWVzIGluIGdwaWMgYW5kIGluIDEwdGggRWRpdGlvbgoAJXMgYXJyb3doZWFkIGhhcyBubyBtZWFuaW5nIGluIERXQiAyLCBhcnJvd2hlYWQgPSA3IG1ha2VzIGZpbGxlZCBhcnJvd2hlYWRzIGluIGdwaWMgYW5kIGluIDEwdGggRWRpdGlvbgoAJXMgYXJyb3doZWFkIGlzIHVuZGVmaW5lZCBpbiBEV0IgMiwgaW5pdGlhbGx5IDEgaW4gZ3BpYywgMiBpbiAxMHRoIEVkaXRpb24KAG1ham9yaXphdGlvbgoALy8qKiogcG9seWdvbgoAb3ZlcmZsb3cgd2hlbiBjb21wdXRpbmcgZWRnZSB3ZWlnaHQgc3VtCgBzZmRwIG9ubHkgc3VwcG9ydHMgc3RhcnQ9cmFuZG9tCgBub2RlIHBvc2l0aW9ucyBhcmUgaWdub3JlZCB1bmxlc3Mgc3RhcnQ9cmFuZG9tCgBjbG9zZXBhdGggZmlsbAoAIGVsbGlwc2VfcGF0aCBmaWxsCgAgICUuMGYgJS4wZiBjZWxsCgAlZiAlZiAlZiAlZiBjZWxsCgBncmFwaCAlcyBpcyBkaXNjb25uZWN0ZWQuIEhlbmNlLCB0aGUgY2lyY3VpdCBtb2RlbAoAZ3JhcGggaXMgZGlzY29ubmVjdGVkLiBIZW5jZSwgdGhlIGNpcmN1aXQgbW9kZWwKAGVkZ2VzIGluIGdyYXBoICVzIGhhdmUgbm8gbGVuIGF0dHJpYnV0ZS4gSGVuY2UsIHRoZSBtZHMgbW9kZWwKAGNpcmN1aXQgbW9kZWwgbm90IHlldCBzdXBwb3J0ZWQgaW4gR21vZGU9c2dkLCByZXZlcnRpbmcgdG8gc2hvcnRwYXRoIG1vZGVsCgBtZHMgbW9kZWwgbm90IHlldCBzdXBwb3J0ZWQgaW4gR21vZGU9c2dkLCByZXZlcnRpbmcgdG8gc2hvcnRwYXRoIG1vZGVsCgBub2RlICclcycsIGdyYXBoICclcycgc2l6ZSB0b28gc21hbGwgZm9yIGxhYmVsCgAlcyBEV0IgMiBkb2Vzbid0IHVzZSBmaWxsIGFuZCBkb2Vzbid0IGRlZmluZSBmaWxsdmFsCgBbIHtDYXRhbG9nfSA8PCAvVVJJIDw8IC9CYXNlICVzID4+ID4+Ci9QVVQgcGRmbWFyawoAWyAvQ3JvcEJveCBbJWQgJWQgJWQgJWRdIC9QQUdFUyBwZGZtYXJrCgAgIC9Cb3JkZXIgWyAwIDAgMCBdCiAgL0FjdGlvbiA8PCAvU3VidHlwZSAvVVJJIC9VUkkgJXMgPj4KICAvU3VidHlwZSAvTGluawovQU5OIHBkZm1hcmsKAHRyb3VibGUgaW4gaW5pdF9yYW5rCgBsaW5ldGhpY2sgPSAwOyBvbGRsaW5ldGhpY2sgPSBsaW5ldGhpY2sKACBzZXRsaW5ld2lkdGgKAGdzYXZlCiVkICVkICVkICVkIGJveHByaW0gY2xpcCBuZXdwYXRoCgBnc2F2ZSAlZyAlZyB0cmFuc2xhdGUgbmV3cGF0aAoALy8qKiogZW5kX2dyYXBoCgBsYXlvdXQgYXR0cmlidXRlIGlzIGludmFsaWQgZXhjZXB0IG9uIHRoZSByb290IGdyYXBoCgBpbiBjaGVja3BhdGgsIGJveGVzICV6dSBhbmQgJXp1IGRvbid0IHRvdWNoCgBtZXJnZV9vbmV3YXkgZ2xpdGNoCgAlcyBkb24ndCBjaGFuZ2UgYW55dGhpbmcgYmVsb3cgdGhpcyBsaW5lIGluIHRoaXMgZHJhd2luZwoATm9kZSBub3QgYWRqYWNlbnQgdG8gY2VsbCAtLSBBYm9ydGluZwoAaW5jb21wYXJhYmxlIHNlZ21lbnRzICEhIC0tIEFib3J0aW5nCgBBbHRlcm5hdGl2ZWx5LCBjb25zaWRlciBydW5uaW5nIG5lYXRvIHVzaW5nIC1HcGFjaz10cnVlIG9yIGRlY29tcG9zaW5nCgBsYWJlbF9zY2hlbWUgPSAlZCA+IDQgOiBpZ25vcmluZwoAZ3ZyZW5kZXJfc2V0X3N0eWxlOiB1bnN1cHBvcnRlZCBzdHlsZSAlcyAtIGlnbm9yaW5nCgBBcnJvdyB0eXBlICIlcyIgdW5rbm93biAtIGlnbm9yaW5nCgBmZHAgZG9lcyBub3Qgc3VwcG9ydCBzdGFydD1zZWxmIC0gaWdub3JpbmcKACVzIGF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlIDEgb3IgMiAtIGlnbm9yaW5nCgBNb3JlIHRoYW4gMiBjb2xvcnMgc3BlY2lmaWVkIGZvciBhIGdyYWRpZW50IC0gaWdub3JpbmcgcmVtYWluaW5nCgBhcyByZXF1aXJlZCBieSB0aGUgLW4gZmxhZwoAYmJbJXNdICUuNWcgJS41ZyAlLjVnICUuNWcKAC9wYXRoYm94IHsKICAgIC9ZIGV4Y2ggJS41ZyBzdWIgZGVmCiAgICAvWCBleGNoICUuNWcgc3ViIGRlZgogICAgL3kgZXhjaCAlLjVnIHN1YiBkZWYKICAgIC94IGV4Y2ggJS41ZyBzdWIgZGVmCiAgICBuZXdwYXRoIHggeSBtb3ZldG8KICAgIFggeSBsaW5ldG8KICAgIFggWSBsaW5ldG8KICAgIHggWSBsaW5ldG8KICAgIGNsb3NlcGF0aCBzdHJva2UKIH0gZGVmCi9kYmdzdGFydCB7IGdzYXZlICUuNWcgJS41ZyB0cmFuc2xhdGUgfSBkZWYKL2Fycm93bGVuZ3RoIDEwIGRlZgovYXJyb3d3aWR0aCBhcnJvd2xlbmd0aCAyIGRpdiBkZWYKL2Fycm93aGVhZCB7CiAgICBnc2F2ZQogICAgcm90YXRlCiAgICBjdXJyZW50cG9pbnQKICAgIG5ld3BhdGgKICAgIG1vdmV0bwogICAgYXJyb3dsZW5ndGggYXJyb3d3aWR0aCAyIGRpdiBybGluZXRvCiAgICAwIGFycm93d2lkdGggbmVnIHJsaW5ldG8KICAgIGNsb3NlcGF0aCBmaWxsCiAgICBncmVzdG9yZQp9IGJpbmQgZGVmCi9tYWtlYXJyb3cgewogICAgY3VycmVudHBvaW50IGV4Y2ggcG9wIHN1YiBleGNoIGN1cnJlbnRwb2ludCBwb3Agc3ViIGF0YW4KICAgIGFycm93aGVhZAp9IGJpbmQgZGVmCi9wb2ludCB7ICAgIG5ld3BhdGggICAgMiAwIDM2MCBhcmMgZmlsbH0gZGVmL21ha2V2ZWMgewogICAgL1kgZXhjaCBkZWYKICAgIC9YIGV4Y2ggZGVmCiAgICAveSBleGNoIGRlZgogICAgL3ggZXhjaCBkZWYKICAgIG5ld3BhdGggeCB5IG1vdmV0bwogICAgWCBZIGxpbmV0byBzdHJva2UKICAgIFggWSBtb3ZldG8KICAgIHggeSBtYWtlYXJyb3cKfSBkZWYKAC9wYXRoYm94IHsKICAgIC9YIGV4Y2ggbmVnICUuNWcgc3ViIGRlZgogICAgL1kgZXhjaCAlLjVnIHN1YiBkZWYKICAgIC94IGV4Y2ggbmVnICUuNWcgc3ViIGRlZgogICAgL3kgZXhjaCAlLjVnIHN1YiBkZWYKICAgIG5ld3BhdGggeCB5IG1vdmV0bwogICAgWCB5IGxpbmV0bwogICAgWCBZIGxpbmV0bwogICAgeCBZIGxpbmV0bwogICAgY2xvc2VwYXRoIHN0cm9rZQp9IGRlZgoAJSFQUy1BZG9iZS0yLjAKL25vZGUgewogIC9ZIGV4Y2ggZGVmCiAgL1ggZXhjaCBkZWYKICAveSBleGNoIGRlZgogIC94IGV4Y2ggZGVmCiAgbmV3cGF0aAogIHggeSBtb3ZldG8KICB4IFkgbGluZXRvCiAgWCBZIGxpbmV0bwogIFggeSBsaW5ldG8KICBjbG9zZXBhdGggZmlsbAp9IGRlZgovY2VsbCB7CiAgL1kgZXhjaCBkZWYKICAvWCBleGNoIGRlZgogIC95IGV4Y2ggZGVmCiAgL3ggZXhjaCBkZWYKICBuZXdwYXRoCiAgeCB5IG1vdmV0bwogIHggWSBsaW5ldG8KICBYIFkgbGluZXRvCiAgWCB5IGxpbmV0bwogIGNsb3NlcGF0aCBzdHJva2UKfSBkZWYKAH0gYmluZCBkZWYKAC5QUyAlLjVmICUuNWYKAG92ZXJsYXA6ICVzIHZhbHVlICVkIHNjYWxpbmcgJS4wNGYKACAgYmVhdXRpZnlfbGVhdmVzICVkIG5vZGUgd2VpZ2h0cyAlZCByb3RhdGlvbiAlLjAzZgoAICByZXB1bHNpdmUgZXhwb25lbnQ6ICUuMDNmCgAgIEsgOiAlLjAzZiBDIDogJS4wM2YKACVzICUuM2YKAAppbnRlcnNlY3Rpb24gYXQgJS4zZiAlLjNmCgAgICAgc2NhbGUgJS4zZgoAdG9ydXMgeyAlLjNmLCAlLjNmCgAgICAgPCU5LjNmLCAlOS4zZiwgJTkuM2Y+LCAlLjNmCgAgaW4gJXMgLSBzZXR0aW5nIHRvICUuMDJmCgBjaXJjbGUgJXMgJS4wZiwlLjBmLCUuMGYKAHJlY3QgJXMgJS4wZiwlLjBmICUuMGYsJS4wZgoAJWQgJWQgJWQgJS4wZiAlZCAlZCAlZCAlZCAlZCAlLjNmICVkICUuNGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmCgAgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZiAlLjBmICUuMGYgJS4wZgoAJSUlJVBhZ2U6IDEgMQolJSUlUGFnZUJvdW5kaW5nQm94OiAlLjBmICUuMGYgJS4wZiAlLjBmCgBwb3NbJXp1XSAlLjBmICUuMGYKAC5uciBTRiAlLjBmCnNjYWxldGhpY2tuZXNzID0gJS4wZgoAJXMgc2F2ZSBwb2ludCBzaXplIGFuZCBmb250Ci5uciAuUyBcbigucwoubnIgREYgXG4oLmYKAHNob3dwYWdlCiUlJSVUcmFpbGVyCiUlJSVCb3VuZGluZ0JveDogJS5mICUuZiAlLmYgJS5mCgBhZGRpbmcgJXp1IGl0ZW1zLCB0b3RhbCBhcmVhID0gJWYsIHcgPSAlZiwgYXJlYS93PSVmCgBnYXA9JWYsJWYKACAgYXNwZWN0ICVmCgBhICVmIGIgJWYgYyAlZiBkICVmIHIgJWYKAG1vZGVsICVkIHNtYXJ0X2luaXQgJWQgc3RyZXNzd3QgJWQgaXRlcmF0aW9ucyAlZCB0b2wgJWYKAFNvbHZpbmcgbW9kZWwgJWQgaXRlcmF0aW9ucyAlZCB0b2wgJWYKACVzIGNvb3JkICUuNWcgJS41ZyBodCAlZiB3aWR0aCAlZgoAcmVjICVmICVmICVmICVmCgAlcyA6ICVmICVmICVmICVmCgAlcyA6ICVmICVmCgBtYXhwc2h0ID0gJWYKbWF4cHN3aWQgPSAlZgoAbWRzTW9kZWw6IGRlbHRhID0gJWYKACByMSAlZiByMiAlZgoAUGFja2luZzogY29tcHV0ZSBncmlkIHNpemUKAGdzYXZlCgAlJUVuZENvbW1lbnRzCnNhdmUKAFVucmVjb2duaXplZCBjaGFyYWN0ZXIgJyVjJyAoJWQpIGluIHNpZGVzIGF0dHJpYnV0ZQoASW1hZ2VzIHVuc3VwcG9ydGVkIGluICJiYWNrZ3JvdW5kIiBhdHRyaWJ1dGUKACVzIEdOVSBwaWMgdnMuIDEwdGggRWRpdGlvbiBkXChlJ3RlbnRlCgByZXNldCAlcyBzZXQgdG8ga25vd24gc3RhdGUKACVnICVnIHNldF9zY2FsZSAlZCByb3RhdGUgJWcgJWcgdHJhbnNsYXRlCgAlZiAlZiB0cmFuc2xhdGUKACVkICVkIHRyYW5zbGF0ZQoALy8qKiogZWxsaXBzZQoAVW5yZWNvZ25pemVkIG92ZXJsYXAgdmFsdWUgIiVzIiAtIHVzaW5nIGZhbHNlCgBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlCgAlczogdnNucHJpbnRmIGZhaWx1cmUKAGVuZHBhZ2UKc2hvd3BhZ2UKZ3Jlc3RvcmUKAGVuZApyZXN0b3JlCgBsYXlvdXQgd2FzIG5vdCBkb25lCgBMYXlvdXQgd2FzIG5vdCBkb25lCgAvLyoqKiBwb2x5bGluZQoAdHJ5aW5nIHRvIGRlbGV0ZSBhIG5vbi1saW5lCgAjIGVuZCBvZiBGSUcgZmlsZQoAU2luZ2xlCgByZW5kZXJlciBmb3IgJXMgaXMgdW5hdmFpbGFibGUKAGR5bmFtaWMgbG9hZGluZyBub3QgYXZhaWxhYmxlCgAlLjBmICUuMGYgbGluZXRvIHN0cm9rZQoAY2xvc2VwYXRoIHN0cm9rZQoAIGVsbGlwc2VfcGF0aCBzdHJva2UKAC8vKioqIGJlZ2luX2VkZ2UKAC8vKioqIGVuZF9lZGdlCgBsb3N0ICVzICVzIGVkZ2UKAG92ZXJmbG93IHdoZW4gY2FsY3VsYXRpbmcgdmlydHVhbCB3ZWlnaHQgb2YgZWRnZQoAYWRkX3RyZWVfZWRnZTogbWlzc2luZyB0cmVlIGVkZ2UKAGluIHJvdXRlc3BsaW5lcywgY2Fubm90IGZpbmQgTk9STUFMIGVkZ2UKAHNob3dwYWdlCgAlZCAlZCAlZCBiZWdpbnBhZ2UKAC8vKioqIGJlZ2luX3BhZ2UKAC8vKioqIGVuZF9wYWdlCgBGaWxlbmFtZSAiJXMiIGlzIHVuc2FmZQoAbGFiZWw6IGFyZWEgdG9vIGxhcmdlIGZvciBydHJlZQoALy8qKiogZW5kX25vZGUKAFVzaW5nIGRlZmF1bHQgY2FsY3VsYXRpb24gZm9yIHJvb3Qgbm9kZQoAY29udGFpbl9ub2RlcyBjbHVzdCAlcyByYW5rICVkIG1pc3Npbmcgbm9kZQoAJWYgJWYgJWYgJWYgbm9kZQoAPDwgL1BhZ2VTaXplIFslZCAlZF0gPj4gc2V0cGFnZWRldmljZQoAaW4gY2hlY2twYXRoLCBib3ggJXp1IGhhcyBMTCBjb29yZCA+IFVSIGNvb3JkCgBpbiBjaGVja3BhdGgsIGJveCAwIGhhcyBMTCBjb29yZCA+IFVSIGNvb3JkCgBjbHVzdGVyIG5hbWVkICVzIG5vdCBmb3VuZAoAbWluY3Jvc3M6IHBhc3MgJWQgaXRlciAlZCB0cnlpbmcgJWQgY3VyX2Nyb3NzICVsbGQgYmVzdF9jcm9zcyAlbGxkCgBub2RlICVzLCBwb3J0ICVzIHVucmVjb2duaXplZAoAJXMlcyB1bnN1cHBvcnRlZAoAY2x1c3RlciBjeWNsZSAlcyAtLSAlcyBub3Qgc3VwcG9ydGVkCgAlcyAtPiAlczogc3BsaW5lIHNpemUgPiAxIG5vdCBzdXBwb3J0ZWQKAGxheW91dCBhYm9ydGVkCgBwYWdlZGlyPSVzIGlnbm9yZWQKAFR3byBjbHVzdGVycyBuYW1lZCAlcyAtIHRoZSBzZWNvbmQgd2lsbCBiZSBpZ25vcmVkCgBJbGxlZ2FsIGF0dHJpYnV0ZSAlcyBpbiAlcyAtIGlnbm9yZWQKAFVua25vd24gdmFsdWUgJXMgZm9yIGF0dHJpYnV0ZSAibW9kZWwiIGluIGdyYXBoICVzIC0gaWdub3JlZAoASWxsZWdhbCB2YWx1ZSAlcyBmb3IgYXR0cmlidXRlICJtb2RlIiBpbiBncmFwaCAlcyAtIGlnbm9yZWQKAHN0YXJ0PTAgbm90IHN1cHBvcnRlZCB3aXRoIG1vZGU9c2VsZiAtIGlnbm9yZWQKAE92ZXJsYXAgdmFsdWUgIiVzIiB1bnN1cHBvcnRlZCAtIGlnbm9yZWQKAFVua25vd24gdmFsdWUgJXMgZm9yIFJPV1MgLSBpZ25vcmVkCgBVbmtub3duIHZhbHVlICVzIGZvciBDT0xVTU5TIC0gaWdub3JlZAoASWxsZWdhbCB2YWx1ZSAlcyBmb3IgVkFMSUdOIC0gaWdub3JlZAoASWxsZWdhbCB2YWx1ZSAlcyBmb3IgQUxJR04gLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICVzIGZvciBGSVhFRFNJWkUgLSBpZ25vcmVkCgBJbGxlZ2FsIHZhbHVlICUuKnMgZm9yIFNUWUxFIC0gaWdub3JlZAoASWxsZWdhbCB2YWx1ZSAlcyBmb3IgQkFMSUdOIGluIFREIC0gaWdub3JlZAoASWxsZWdhbCB2YWx1ZSAlcyBmb3IgQUxJR04gaW4gVEQgLSBpZ25vcmVkCgBST1dTUEFOIHZhbHVlIGNhbm5vdCBiZSAwIC0gaWdub3JlZAoAQ09MU1BBTiB2YWx1ZSBjYW5ub3QgYmUgMCAtIGlnbm9yZWQKAG5vZGUgJXMsIHBvcnQgJXMsIHVucmVjb2duaXplZCBjb21wYXNzIHBvaW50ICclcycgLSBpZ25vcmVkCgBVbmtub3duICJzcGxpbmVzIiB2YWx1ZTogIiVzIiAtIGlnbm9yZWQKAGluIHJvdXRlc3BsaW5lcywgUHNob3J0ZXN0cGF0aCBmYWlsZWQKAGluIHJvdXRlc3BsaW5lcywgUHJvdXRlc3BsaW5lIGZhaWxlZAoAIyBwbHVnaW4gbG9hZGluZyBvZiBkZXBlbmRlbmN5ICIlLipzIiBmYWlsZWQKAFBhcnNpbmcgb2YgIiVzIiBmYWlsZWQKACVzOiVkOiBjbGFpbWVkIHVucmVhY2hhYmxlIGNvZGUgd2FzIHJlYWNoZWQKACMgdW5zdWNjZXNzZnVsIHBsdWdpbiBsb2FkCgAlLjVnICUuNWcgdHJhbnNsYXRlIG5ld3BhdGggdXNlcl9zaGFwZV8lZAoAbnNpemVzY2FsZT0lZixpdGVyYXRpb25zPSVkCgBjdHJsLT5vdmVybGFwPSVkCgAlcyAlZCBub2RlcyAlZCBlZGdlcyBtYXhpdGVyPSVkIGJhbGFuY2U9JWQKAC8vKioqIGJlZ2luX2xheWVyOiAlcywgJWQvJWQKAGRlZ2VuZXJhdGUgY29uY2VudHJhdGVkIHJhbmsgJXMsJWQKACAgbWF4IGxldmVscyAlZAoACSVzICVkCgAgIEJhcm5lcy1IdXR0IGNvbnN0YW50ICUuMDNmIHRvbGVyYW5jZSAgJS4wM2YgbWF4aXRlciAlZAoAZ3Z3cml0ZV9ub196IHByb2JsZW0gJWQKACAgcXVhZHRyZWUgc2l6ZSAlZCBtYXhfbGV2ZWwgJWQKAHJlYnVpbGRfdmxpc3RzOiBsZWFkIGlzIG51bGwgZm9yIHJhbmsgJWQKAHJlYnVpbGRfdmxpc3RzOiByYW5rIGxlYWQgJXMgbm90IGluIG9yZGVyICVkIG9mIHJhbmsgJWQKACAgc21vb3RoaW5nICVzIG92ZXJsYXAgJWQgaW5pdGlhbF9zY2FsaW5nICUuMDNmIGRvX3Nocmlua2luZyAlZAoAICBjb29saW5nICUuMDNmIHN0ZXAgc2l6ZSAgJS4wM2YgYWRhcHRpdmUgJWQKAFVuc3VwcG9ydGVkIGNoYXJzZXQgdmFsdWUgJWQKAGluIHJvdXRlc3BsaW5lcywgaWxsZWdhbCB2YWx1ZXMgb2YgcHJldiAlZCBhbmQgbmV4dCAlZCwgbGluZSAlZAoAICBlZGdlX2xhYmVsaW5nX3NjaGVtZSAlZAoAYWdkaWN0b2Y6IHVua25vd24ga2luZCAlZAoAICByYW5kb20gc3RhcnQgJWQgc2VlZCAlZAoAJWQgJWQgJWQgJS4wZiAlZCAlZCAlZCAlZCAlZCAlLjFmICVkICVkICVkICVkCgAlJSUlUGFnZUJvdW5kaW5nQm94OiAlZCAlZCAlZCAlZAoAJSUlJUJvdW5kaW5nQm94OiAlZCAlZCAlZCAlZAoAJSUlJVBhZ2U6ICVkICVkCgAlcyBuby4gY2VsbHMgJWQgVyAlZCBIICVkCgBNYXhyYW5rID0gJWQsIG1pbnJhbmsgPSAlZAoAc3RlcCBzaXplID0gJWQKACUlJSVQYWdlczogJWQKACMgUGFnZXM6ICVkCgAlJSUlRW5kUGFnZTogJWQKACJmb250Y2hhciI6ICVkCgAgIGZsYWdzICAlZAoAICBzaXplICAgJWQKACVzIGRhc2h3aWQgaXMgMC4xIGluIDEwdGggRWRpdGlvbiwgMC4wNSBpbiBEV0IgMiBhbmQgaW4gZ3BpYwoAJXMgbWF4cHNodCBhbmQgbWF4cHN3aWQgYXJlIHByZWRlZmluZWQgdG8gMTEuMCBhbmQgOC41IGluIGdwaWMKACAlZCVzIGl0ZXJhdGlvbnMgJS4yZiBzZWMKAApmaW5hbCBlID0gJWYgJWQgaXRlcmF0aW9ucyAlLjJmIHNlYwoAcm91dGVzcGxpbmVzOiAlZCBlZGdlcywgJXp1IGJveGVzICUuMmYgc2VjCgAlZCBub2RlcyAlLjJmIHNlYwoAJXMlenUgbm9kZXMgJXp1IGVkZ2VzICVkIGl0ZXIgJS4yZiBzZWMKAApmaW5pc2hlZCBpbiAlLjJmIHNlYwoAOiAlLjJmIHNlYwoAIG5vZGVbc2hhcGU9cG9pbnRdCgBTdGFydGluZyBwaGFzZSAyIFtkb3RfbWluY3Jvc3NdCgBTdGFydGluZyBwaGFzZSAzIFtkb3RfcG9zaXRpb25dCgBTdGFydGluZyBwaGFzZSAxIFtkb3RfcmFua10KACJyZWN0IjogWyUuMDNmLCUuMDNmLCUuMDNmLCUuMDNmXQoAaW5zdGFsbF9pbl9yYW5rLCBsaW5lICVkOiBORF9vcmRlciglcykgWyVkXSA+IEdEX3JhbmsoUm9vdClbJWRdLmFuIFslZF0KAGluc3RhbGxfaW5fcmFuaywgbGluZSAlZDogR0RfcmFuayhnKVslZF0udiArIE5EX29yZGVyKCVzKSBbJWRdID4gR0RfcmFuayhnKVslZF0uYXYgKyBHRF9yYW5rKFJvb3QpWyVkXS5hbiBbJWRdCgBpbnN0YWxsX2luX3JhbmssIGxpbmUgJWQ6IHJhbmsgJWQgbm90IGluIHJhbmsgcmFuZ2UgWyVkLCVkXQoAZmFpbGVkIGF0IG5vZGUgJWRbMV0KAGZhaWxlZCBhdCBub2RlICVkWzBdCgAgICVkIC0tICVkW2xhYmVsPSIlZiJdCgAgICVkIFtwb3M9IiUuMGYsJS4wZiEiXQoAIF0KAERvdDogWwoAIm9iamVjdHMiOiBbCgAic3ViZ3JhcGhzIjogWwoAImVkZ2VzIjogWwoAIm5vZGVzIjogWwoAWCBlbHNlIFoKCWRlZmluZSBzZXRmaWxsdmFsIFkgZmlsbHZhbCA9IFk7CglkZWZpbmUgYm9sZCBZIFk7CglkZWZpbmUgZmlsbGVkIFkgZmlsbCBZOwpaCgBpZiBib3hyYWQgPiAxLjAgJiYgZGFzaHdpZCA8IDAuMDc1IHRoZW4gWAoJZmlsbHZhbCA9IDE7CglkZWZpbmUgZmlsbCBZIFk7CglkZWZpbmUgc29saWQgWSBZOwoJZGVmaW5lIHJlc2V0IFkgc2NhbGU9MS4wIFk7ClgKACBBQk9SVElORwoAJSVFT0YKACVzIHJlc3RvcmUgcG9pbnQgc2l6ZSBhbmQgZm9udAoucHMgXG4oLlMKLmZ0IFxuKERGCgBdCi5QRQoAaW52YWxpZGF0ZV9wYXRoOiBza2lwcGVkIG92ZXIgTENBCgBJbnZhbGlkICVkLWJ5dGUgVVRGOCBmb3VuZCBpbiBpbnB1dCBvZiBncmFwaCAlcyAtIHRyZWF0ZWQgYXMgTGF0aW4tMS4gUGVyaGFwcyAiLUdjaGFyc2V0PWxhdGluMSIgaXMgbmVlZGVkPwoAVVRGOCBjb2RlcyA+IDQgYnl0ZXMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIChncmFwaCAlcykgLSB0cmVhdGVkIGFzIExhdGluLTEuIFBlcmhhcHMgIi1HY2hhcnNldD1sYXRpbjEiIGlzIG5lZWRlZD8KADwvdGV4dD4KADwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KADwvcmFkaWFsR3JhZGllbnQ+CjwvZGVmcz4KADwvbWFwPgoAPC9zdmc+CgA8L2E+CjwvZz4KACAgICByb3RhdGUgICA8JTkuM2YsICU5LjNmLCAlOS4zZj4KACAgICBzY2FsZSAgICA8JTkuM2YsICU5LjNmLCAlOS4zZj4KADwvdGl0bGU+CgAiIHR5cGU9InRleHQvY3NzIj8+CgA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KACAgICB0cmFuc2xhdGU8JTkuM2YsICU5LjNmLCAlZC4wMDA+CgA7Ii8+CgAgUGFnZXM6ICVkIC0tPgoAKQogLS0+CgAgLT4KADwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgoAKSI+CgByXyVkIiBjeD0iNTAlJSIgY3k9IjUwJSUiIHI9Ijc1JSUiIGZ4PSIlLjBmJSUiIGZ5PSIlLjBmJSUiPgoAIiA+CgAjZGVjbGFyZSAlcyA9ICVzOwoACSVzCXNvcnJ5LCB0aGUgZ3JvZmYgZm9sa3MgY2hhbmdlZCBncGljOyBzZW5kIGFueSBjb21wbGFpbnQgdG8gdGhlbTsKAAklcwlpbnN0YWxsIGEgbW9yZSByZWNlbnQgdmVyc2lvbiBvZiBncGljIG9yIHN3aXRjaCB0byBEV0Igb3IgMTB0aCBFZGl0aW9uIHBpYzsKAF07CgBpZiBmaWxsdmFsID4gMC40IHRoZW4gWAoJZGVmaW5lIHNldGZpbGx2YWwgWSBmaWxsdmFsID0gMSAtIFk7CglkZWZpbmUgYm9sZCBZIHRoaWNrbmVzcyAyIFk7CgAjdmVyc2lvbiAzLjY7CgBlbGxpcHNlIGF0dHJzMCAlc3dpZCAlLjVmIGh0ICUuNWYgYXQgKCUuNWYsJS41Zik7CgAiIGF0ICglLjVmLCUuNWYpOwoAJSVCZWdpbkRvY3VtZW50OgoAJXp1IGJveGVzOgoAcGFjayBpbmZvOgoAc3ByaW5nX2VsZWN0cmljYWxfY29udHJvbDoKAFVuc3VwcG9ydGVkIGNoYXJzZXQgIiVzIiAtIGFzc3VtaW5nIHV0Zi04CgAgICAgICBhbWJpZW50SW50ZW5zaXR5IDAuMzMKACNGSUcgMy4yCgAtMgoAJXMgbm9uLWZhdGFsIHJ1bi10aW1lIHBpYyB2ZXJzaW9uIGRldGVybWluYXRpb24sIHZlcnNpb24gMgoAJXMgZmlsbHZhbCBpcyAwLjMgaW4gMTB0aCBFZGl0aW9uIChmaWxsIDAgbWVhbnMgYmxhY2spLCAwLjUgaW4gZ3BpYyAoZmlsbCAwIG1lYW5zIHdoaXRlKSwgdW5kZWZpbmVkIGluIERXQiAyCgAlcyByZXNldCB3b3JrcyBpbiBncGljIGFuZCAxMHRoIGVkaXRpb24sIGJ1dCBpc24ndCBkZWZpbmVkIGluIERXQiAyCgBzZXR1cExhdGluMQoAXDAwMQoAJXMgICAgICAgIHRvbGVyYW5jZSAwLjAxCgAgICAgdG9sZXJhbmNlIDAuMQoAJSVQYWdlczogMQoAICAgICAgICBkaWZmdXNlQ29sb3IgMSAxIDEKADEwMC4wMAoAIEVQU0YtMy4wCgAlcyBib3hyYWQgaXMgbm93IDAuMCBpbiBncGljLCBlbHNlIGl0IHJlbWFpbnMgMi4wCgBzcGhlcmUgezwlOS4zZiwgJTkuM2YsICU5LjNmPiwgMS4wCgBXYXJuaW5nOiBubyB2YWx1ZSBmb3Igd2lkdGggb2YgQVNDSUkgY2hhcmFjdGVyICV1LiBGYWxsaW5nIGJhY2sgdG8gMAoAaW5zdGFsbF9pbl9yYW5rLCBsaW5lICVkOiAlcyAlcyByYW5rICVkIGkgPSAlZCBhbiA9IDAKAGNvbmNlbnRyYXRlPXRydWUgbWF5IG5vdCB3b3JrIGNvcnJlY3RseS4KAE5vIGxpYnogc3VwcG9ydC4KAHR3b3BpOiB1c2Ugb2Ygd2VpZ2h0PTAgY3JlYXRlcyBkaXNjb25uZWN0ZWQgY29tcG9uZW50LgoAdGhlIGdyYXBoIGludG8gY29ubmVjdGVkIGNvbXBvbmVudHMuCgBPcnRob2dvbmFsIGVkZ2VzIGRvIG5vdCBjdXJyZW50bHkgaGFuZGxlIGVkZ2UgbGFiZWxzLiBUcnkgdXNpbmcgeGxhYmVscy4KAGd2UmVuZGVySm9icyAlczogJS4yZiBzZWNzLgoAbWluY3Jvc3MgJXM6ICVsbGQgY3Jvc3NpbmdzLCAlLjJmIHNlY3MuCgAlcyBpcyBub3QgYSBrbm93biBjb2xvci4KAGlzIGluYXBwcm9wcmlhdGUuIFJldmVydGluZyB0byB0aGUgc2hvcnRlc3QgcGF0aCBtb2RlbC4KAGlzIHVuZGVmaW5lZC4gUmV2ZXJ0aW5nIHRvIHRoZSBzaG9ydGVzdCBwYXRoIG1vZGVsLgoAVW5hYmxlIHRvIHJlY2xhaW0gYm94IHNwYWNlIGluIHNwbGluZSByb3V0aW5nIGZvciBlZGdlICIlcyIgLT4gIiVzIi4gU29tZXRoaW5nIGlzIHByb2JhYmx5IHNlcmlvdXNseSB3cm9uZy4KAEVycm9yIGR1cmluZyBjb252ZXJzaW9uIHRvICJVVEYtOCIuIFF1aXRpbmcuCgBvcmRlcmluZyAnJXMnIG5vdCByZWNvZ25pemVkLgoAZ3JhZGllbnQgcGVuIGNvbG9ycyBub3QgeWV0IHN1cHBvcnRlZC4KACAgaW5pdENNYWpWUFNDIGRvbmU6ICVkIGdsb2JhbCBjb25zdHJhaW50cyBnZW5lcmF0ZWQuCgBUaGUgY2hhcmFjdGVyICclYycgYXBwZWFycyBpbiBib3RoIHRoZSBsYXllcnNlcCBhbmQgbGF5ZXJsaXN0c2VwIGF0dHJpYnV0ZXMgLSBsYXllcmxpc3RzZXAgaWdub3JlZC4KAHRoZSBhc3BlY3QgYXR0cmlidXRlIGhhcyBiZWVuIGRpc2FibGVkIGR1ZSB0byBpbXBsZW1lbnRhdGlvbiBmbGF3cyAtIGF0dHJpYnV0ZSBpZ25vcmVkLgoAVGhlIGxheWVyc2VsZWN0IGF0dHJpYnV0ZSAiJXMiIGRvZXMgbm90IG1hdGNoIGFueSBsYXllciBzcGVjaWZlZCBieSB0aGUgbGF5ZXJzIGF0dHJpYnV0ZSAtIGlnbm9yZWQuCgAlenUgb3V0IG9mICV6dSBsYWJlbHMgcG9zaXRpb25lZC4KACV6dSBvdXQgb2YgJXp1IGV4dGVyaW9yIGxhYmVscyBwb3NpdGlvbmVkLgoAICBnZW5lcmF0ZSBlZGdlIGNvbnN0cmFpbnRzLi4uCgBHZW5lcmF0aW5nIE5vbi1vdmVybGFwIENvbnN0cmFpbnRzLi4uCgBHZW5lcmF0aW5nIEVkZ2UgQ29uc3RyYWludHMuLi4KAEdlbmVyYXRpbmcgRGlHLUNvTGEgRWRnZSBDb25zdHJhaW50cy4uLgoAUmVtb3Zpbmcgb3ZlcmxhcHMgYXMgcG9zdHByb2Nlc3MuLi4KAC4uLiAlLipzJS4qcyAuLi4KAEVkZ2UgbGVuZ3RoICVmIGxhcmdlciB0aGFuIG1heGltdW0gJWQgYWxsb3dlZC4KQ2hlY2sgZm9yIG92ZXJ3aWRlIG5vZGUocykuCgBvcmRlcmluZyAnJXMnIG5vdCByZWNvZ25pemVkIGZvciBub2RlICclcycuCgBwb2x5Z29uIHsgJXp1LAoAc3BoZXJlX3N3ZWVwIHsKICAgICVzCiAgICAlenUsCgAiZGlyZWN0ZWQiOiAlcywKACJ3aWR0aCI6ICUuMDNmLAoAInNpemUiOiAlLjAzZiwKACJ0YWlsIjogJWQsCgAiX2d2aWQiOiAlZCwKACJwdCI6IFslLjAzZiwlLjAzZl0sCgAicDEiOiBbJS4wM2YsJS4wM2ZdLAoAInAwIjogWyUuMDNmLCUuMDNmXSwKACJwMSI6IFslLjAzZiwlLjAzZiwlLjAzZl0sCgAicDAiOiBbJS4wM2YsJS4wM2YsJS4wM2ZdLAoAIm9wIjogInQiLAoAImdyYWQiOiAibGluZWFyIiwKACJncmFkIjogInJhZGlhbCIsCgAiZ3JhZCI6ICJub25lIiwKAAklcyBpZiB5b3UgdXNlIGdwaWMgYW5kIGl0IGJhcmZzIG9uIGVuY291bnRlcmluZyAic29saWQiLAoAIm9wIjogIiVjIiwKACJhbGlnbiI6ICIlYyIsCgAib3AiOiAiVCIsCgAib3AiOiAiUyIsCgAib3AiOiAiTCIsCgAib3AiOiAiRiIsCgBleHBhdDogRW50cm9weTogJXMgLS0+IDB4JTAqbHggKCVsdSBieXRlcykKAHN5bnRheCBlcnJvciBpbiBwb3MgYXR0cmlidXRlIGZvciBlZGdlICglcywlcykKAGdldHNwbGluZXBvaW50czogbm8gc3BsaW5lIHBvaW50cyBhdmFpbGFibGUgZm9yIGVkZ2UgKCVzLCVzKQoAbWFrZVNwbGluZTogZmFpbGVkIHRvIG1ha2Ugc3BsaW5lIGVkZ2UgKCVzLCVzKQoAIyBHZW5lcmF0ZWQgYnkgJXMgdmVyc2lvbiAlcyAoJXMpCgAlJSUlQ3JlYXRvcjogJXMgdmVyc2lvbiAlcyAoJXMpCgAlcyBDcmVhdG9yOiAlcyB2ZXJzaW9uICVzICglcykKAHNlZ21lbnQgWyglLjVnLCAlLjVnKSwoJS41ZywlLjVnKV0gZG9lcyBub3QgaW50ZXJzZWN0IGJveCBsbD0oJS41ZywlLjVnKSx1cj0oJS41ZywlLjVnKQoAJXp1ICglLjVnLCAlLjVnKSwgKCUuNWcsICUuNWcpCgBwYWNrIHZhbHVlICVkIGlzIHNtYWxsZXIgdGhhbiBlc2VwICglLjAzZiwlLjAzZikKAHNlcCB2YWx1ZSAoJS4wM2YsJS4wM2YpIGlzIHNtYWxsZXIgdGhhbiBlc2VwICglLjAzZiwlLjAzZikKAHNjYWxlID0gKCUuMDNmLCUuMDNmKQoAc2VnIyVkIDogKCUuM2YsICUuM2YpICglLjNmLCAlLjNmKQoAJXp1IG9ianMgJXp1IHhsYWJlbHMgZm9yY2U9JWQgYmI9KCUuMDJmLCUuMDJmKSAoJS4wMmYsJS4wMmYpCgBjYyAoJWQgY2VsbHMpIGF0ICglLjBmLCUuMGYpCgBjYyAoJWQgY2VsbHMpIGF0ICglZCwlZCkgKCUuMGYsJS4wZikKAGNoYW5uZWwgJS4wZiAoJWYsJWYpCgBFZGdlIHNlcGFyYXRpb246IGFkZD0lZCAoJWYsJWYpCgBOb2RlIHNlcGFyYXRpb246IGFkZD0lZCAoJWYsJWYpCgByb290ICVkICglZikgJWQgKCVmKQoAJWYgLSAlZiAlZiAlZiAlZiA9ICVmICglZiAlZiAlZiAlZikKACUlQm91bmRpbmdCb3g6IChhdGVuZCkKACUlUGFnZXM6IChhdGVuZCkKAGV4cGF0OiBFbnRpdGllcyglcCk6IENvdW50ICU5dSwgZGVwdGggJTJ1LyUydSAlKnMlcyVzOyAlcyBsZW5ndGggJWQgKHhtbHBhcnNlLmM6JWQpCgBjYW52YXMgc2l6ZSAoJWQsJWQpIGV4Y2VlZHMgUERGIGxpbWl0ICglZCkKCShzdWdnZXN0IHNldHRpbmcgYSBib3VuZGluZyBib3ggc2l6ZSwgc2VlIGRvdCgxKSkKAGVycm9yIGluIGNvbG9yeGxhdGUoKQoAdHJ1bmNhdGluZyBzdHlsZSAnJXMnCgBJbGxlZ2FsIHZhbHVlIGluICIlcyIgY29sb3IgYXR0cmlidXRlOyBmbG9hdCBleHBlY3RlZCBhZnRlciAnOycKAGRlZmluZSBhdHRyczAgJSUgJSU7IGRlZmluZSB1bmZpbGxlZCAlJSAlJTsgZGVmaW5lIHJvdW5kZWQgJSUgJSU7IGRlZmluZSBkaWFnb25hbHMgJSUgJSUKADxzdmcgd2lkdGg9IiVkcHQiIGhlaWdodD0iJWRwdCIKACMgZGVwZW5kZW5jaWVzICIlLipzIiBkaWQgbm90IG1hdGNoICIlLipzIgoAIyB0eXBlICIlLipzIiBkaWQgbm90IG1hdGNoICIlLipzIgoAJGMgY3JlYXRlIGltYWdlICUuMmYgJS4yZiAtaW1hZ2UgInBob3RvXyVzIgoATm8gb3IgaW1wcm9wZXIgaW1hZ2UgZmlsZT0iJXMiCgBmaWxlIGxvYWRpbmcgaXMgZGlzYWJsZWQgYmVjYXVzZSB0aGUgZW52aXJvbm1lbnQgY29udGFpbnMgU0VSVkVSX05BTUU9IiVzIgoAQ291bGQgbm90IHBhcnNlIHhkb3QgIiVzIgoATm8gbG9hZGltYWdlIHBsdWdpbiBmb3IgIiVzIgoAIFslenVdICglLjAyZiwlLjAyZikgKCUuMDJmLCUuMDJmKSAlcCAiJXMiCgBmb250bmFtZTogdW5hYmxlIHRvIHJlc29sdmUgIiVzIgoARHVwbGljYXRlIGNsdXN0ZXIgbmFtZSAiJXMiCgB1bnJlY29nbml6ZWQgYXBpIG5hbWUgIiVzIgoAaW1hZ2UgY3JlYXRlIHBob3RvICJwaG90b18lcyIgLWZpbGUgIiVzIgoATm8gb3IgaW1wcm9wZXIgc2hhcGVmaWxlPSIlcyIgZm9yIG5vZGUgIiVzIgoATm8gb3IgaW1wcm9wZXIgaW1hZ2U9IiVzIiBmb3Igbm9kZSAiJXMiCgBub2RlICIlcyIgaXMgY29udGFpbmVkIGluIHR3byBub24tY29tcGFyYWJsZSBjbHVzdGVycyAiJXMiIGFuZCAiJXMiCgBFcnJvcjogbm9kZSAiJXMiIGJlbG9uZ3MgdG8gdHdvIG5vbi1uZXN0ZWQgY2x1c3RlcnMgIiVzIiBhbmQgIiVzIgoAICAiJXMiCgAjaW5jbHVkZSAiY29sb3JzLmluYyIKI2luY2x1ZGUgInRleHR1cmVzLmluYyIKI2luY2x1ZGUgInNoYXBlcy5pbmMiCgBVbmtub3duIEhUTUwgZWxlbWVudCA8JXM+IG9uIGxpbmUgJWx1IAoAJXMgaW4gbGluZSAlbHUgCgBzY2FsZSBieSAlZywlZyAKAGNvbXByZXNzICVnIAoATGF5b3V0IHdhcyBub3QgZG9uZS4gIE1pc3NpbmcgbGF5b3V0IHBsdWdpbnM/IAoAiVBORw0KGgoAJSUhUFMtQWRvYmUtMi4wCiUlJSVCb3VuZGluZ0JveDogKGF0ZW5kKQovcG9pbnQgewogIC9ZIGV4Y2ggZGVmCiAgL1ggZXhjaCBkZWYKICBuZXdwYXRoCiAgWCBZIDMgMCAzNjAgYXJjIGZpbGwKfSBkZWYKL2NlbGwgewogIC9ZIGV4Y2ggZGVmCiAgL1ggZXhjaCBkZWYKICAveSBleGNoIGRlZgogIC94IGV4Y2ggZGVmCiAgbmV3cGF0aAogIHggeSBtb3ZldG8KICB4IFkgbGluZXRvCiAgWCBZIGxpbmV0bwogIFggeSBsaW5ldG8KICBjbG9zZXBhdGggc3Ryb2tlCn0gZGVmCi9ub2RlIHsKIC91IGV4Y2ggZGVmCiAvciBleGNoIGRlZgogL2QgZXhjaCBkZWYKIC9sIGV4Y2ggZGVmCiBuZXdwYXRoIGwgZCBtb3ZldG8KIHIgZCBsaW5ldG8gciB1IGxpbmV0byBsIHUgbGluZXRvCiBjbG9zZXBhdGggZmlsbAp9IGRlZgoKAAkAAAEBAQEBAQEBAgMBAQIBAQEBAQEBAQEBAQEBAQEBAQECAQQFAQEBAQEBBgEBBwgJCgoKCgoKCgoKCgEBCwEMAQ0ODxAREhMUFRYTExMTFxgZExobHB0TExMTEwEeAQETAR8gISIjEyQlJhMTExMnKCkTKissLRMTExMTAQEBAQETExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEy4TExMvExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMwExMTExMTExMTExMTExMTEwAAAAAAAAQABAAcABwAIQAhACQAIgAKAAIAFgAJACIAIgAiABUAHQABABQAFAAUABQAFAAUABQACAAEAAUAHAAbABcAHAAhACAAHwAeAAkAEwAAABUAEgAVAAMABwAVABUAFAAUABQAFAAUABQAFAAUAAgABAAFAAUABgAcABoAGAAZACEABwAVABQAFAAUABQAFAAUAAsAFAANABQADAAUABQAFAAOABQAFAAUABAAFAAPABQAEQBBsooFC5UEAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAwAEAAcAAwAEAAUABQAGAAYACAAHAAcAEQAWABIAEQASAAgACAAPAA8AFwAPABgADwAZABoAGgAeABYANAAeAAUAMgAGACIAIgAzABcAGAA1ABkAGgAaACoANgAqADQANwAyAEUAOwA8ADMAOwA8AEYANQBHAEgATAA2ACIASQBKADcARQBOAFAAYgBRAFIAVABGAEcAVQBIAEwAVgBJAEoAWABaAE4ARABQAFEAUgBUADgALwAsAFUAKQBWABsAEABYAFoAXQBdAF0AXQBdAF0AXQBeAF4AXgBeAF4AXgBeAF8AXwBfAF8AXwBfAF8AYAAJAGAAYABgAGAAYABhAGEAYwACAGMAYwBjAGMAYwBkAAAAZAAAAGQAZABkAGUAAABlAGUAZQBlAGUAZgAAAAAAZgBmAGYAZgBnAAAAZwBnAGcAZwBoAAAAaABoAGgAaABoAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAQdSOBQvNAa4ALgAvADMANQAwADcAqgDbANsA2wDbAAAAPQCHADcANwDbANsAAAAoADUALgAyAC8AYgAAAAAARwAAANsA2wBRAAAA2wDbANsAAADbAIQAVQDbAIIA2wAAAIEA2wAAAD4AQgBBAEgARABSAFsAAAAAAF4AXwDbAAAA2wDbANsAAAAAAHsASQBXAFIAWgBaAF0AAABfAAAAXwAAAGUAXQBfAAAAXQBuAGoAAABpAAAAbgAAANsAkwCaAKEAqACrAHAAsQC4AL8AxgDNANMAQbKQBQvPAVwAAQBdAF0AXgBeAF8AXwBcAFwAXABcAFwAYABcAFwAXABhAFwAXABiAGIAYgBiAGIAYgBiAGMAZABlAGYAXABcAFwAZwBcAFwAXABgAFwAXABhAFwAYQBcAGgAYQBcAGIAYgBiAGIAYgBiAGIAYgBjAGQAZQBlAFwAZgBcAFwAXABnAGgAYQBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAYgBiAGIAAABcAFwAXABcAFwAXABcAFwAXABcAFwAXABBkZIFCzABAQIDAQQBBQEGBwcBBgYGBgYGBgYGBgYGBgYGBgMGBgYGBgYGBgYGBgYGBgYGBgYAQdKSBQujBAoACwAMAA0ADgAKAA8AEAARABIAEwAKABQAFQAVABUAFgAXABUAGAAVABUAGQAVABUAFQAaABUAFQAKABUAFQAVABYAFwAYABUAFQAZABUAFQAVABoAFQAVABUAFQAbAAwADAAkAB4AHgAgACEAIAAhACQAJQAmAC0AMgAvAC4AKgAlACYAKAApADMAKgA0ACsANQA2ADcAPAAyAEcAPQAiAEUAIgA/AEAARgAzADQASAA1ADYANwAvAEkAKgBHAEoARQBMAFwAPABGAFwAPQBNAEgATgBPAFIASQBBAFAAUQBKAEwAUwBUADEAVQBWAFcATQBOAFgATwBSAFkAUABRAFoAWwBTAEQAVABVAFYAVwBLAEQALABYACwAWQA4ACwAWgBbAB0AHQAdAB0AHQAdAB0AHwAfAB8AHwAfAB8AHwAjACMAIwAjACMAIwAjACcAXAAnACcAJwAnACcAMAAwADkAHAA5ADkAOQA5ADkAOgBcADoAXAA6ADoAOgA7AFwAOwA7ADsAOwA7AD4AXABcAD4APgA+AD4AQgBcAEIAQgBCAEIAQwBcAEMAQwBDAEMAQwAJAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAAwAAAANAAAADgAAAA4AQYCXBQvRBRHu7hMIA+7+7u7uAe7u7gHu7gn+7hIVF+4SAe7u7u4KDe7u7u7u7u7u7gHu7hYIAQEZDhju7hsYGu7uHe7u7u4BFfvu7u7uEB7u7u4AAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhYRAgICAgICAgICAgICAhIQAhMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAhQCFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICDgIPAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgECAwQFBgcICQoLDA0AAAALAwQFDwcDDA0GDA0ODA0aFQABAAMHDgYPCAwNEhMJKhAREBYvMA0yERMuMhQSFBJBEywTQkAqQhn//ywAAAAAIgwNDiMPCRARChARzBARLUX8AQb2Dwf2JAIQES8wKDZJSiYxOzw9Nio5Oj4/L9hARDA3JUdDNUgrAAA4AAAAAAADCQAAAAEOAgsMCCMkJTM4OgANEBIbFhwSJy8iFzAeOQYHMgUPERQYKQATKQAAAAAANBUoHR4AISYxHy47GSwAGwAgGiorNwA1Ni0AAAAAAAICAQADAwEAAQABAQEAAgEBAAICAwEBAAAFAAEDAQMFAwEBAQECAAEABAIAAgMBAAMCAQABAQABAQEDAAAAAAAXGBgYGRobGxwcHR0eHh8fICAhISIjIyUmJCQnJygoKCkpKioqKyssLC0uLi8wMTMyNDQ0NTU1NjY3NwAAAADu7vzu7u7u7u4fIO757+7u7gzu7u4GD+7u8u7u7u7u9e4AQeGcBQsvAwgEIQULEhMnFBUWKTJBFxgZGiwzNEJGGxwdLh5LHyBrZXkAX0FHX3N0cmRhdGEAQaCdBQsV4B4AAKMMAACHDAAALFMAAD9RAAAGAEHAnQUL4+sBWsQAAFVdyX/Jf/8AQ7UAALst1L6u1P8AO6cAABR3/f3Ahv8A+sIAAFVdyX/Jf/8A47MAALst1L6u1P8A26UAABR3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/////gAAAU0AAHu24EDg0P8Au7kAAIH//wD1//8AS6sAAIH/7gDl7v8AYp0AAIH/zQDFzf8AsZAAAIH/iwCGi/8AhxEAANRz7u6C7v8Ad1cAAOPX0NAgkP8AW7oAAOvB//8+lv8A2qsAAOvA7u46jP8A8Z0AAOvAzc0yeP8AR5EAAOvAi4siUv8AlwgAAAAAgICAgP8A6TUAAFX/gACAAP8AzAcAAAAAgICAgP8AdjIAAAD/gIAAAP8AVk8AANT/gIAAgP8AURQAABtE9fXes/8A87cAABtF///nuv8An6kAABtE7u7Yrv8Aw5sAABtEzc26lv8AF48AABtDi4t+Zv8AkEsAAAAA//////8Af1AAAAAA9fX19f8AnwgAAAAAvr6+vv8AOTYAAFX//wD/AP8A1AcAAAAAvr6+vv8AgDIAAO+5sLAwYP8Ai08AAMTd8KAg8P8AqgoAACr/////AP8A2LcAACr/////AP8AgKkAACr/7u7uAP8AsZsAACr/zc3NAP8ABY8AACr/i4uLAP8AJTUAADjAzZrNMv8AQbCJBwsDtHkCAEG+iQcLhQigQP////////////////////////////////////////////////////////////////////////////////////8AAqoCRAMABAAEqgY5BnEBqgKqAgAEgwQAAqoCAAI5AgAEAAQABAAEAAQABAAEAAQABAAEOQI5AoMEgwSDBI0DXgfHBVYFVgXHBeMEcwTHBccFqgIdA8cF4wQdB8cFxwVzBMcFVgVzBOMExwXHBY0HxwXHBeMEqgI5AqoCwQMABKoCjQMABI0DAASNA6oCAAQABDkCOQIABDkCOQYABAAEAAQABKoCHQM5AgAEAATHBQAEAASNA9cDmgHXA1QE////////////////////////////////////////////////////////////////////////////////////////AAKqAnEEAAQABAAIqgY5AqoCqgIABI8EAAKqAgACOQIABAAEAAQABAAEAAQABAAEAAQABKoCqgKPBI8EjwQABHEHxwVWBccFxwVWBeMEOQY5Bh0DAAQ5BlYFjQfHBTkG4wQ5BscFcwRWBccFxwUACMcFxwVWBaoCOQKqAqYEAASqAgAEcwSNA3MEjQOqAgAEcwQ5AqoCcwQ5AqoGcwQABHMEcwSNAx0DqgJzBAAExwUABAAEjQMnA8MBJwMpBP///////////////////////////////////////////////////////////////////////////////////////wACqgJcAwAEAASqBjkGtgGqAqoCAARmBQACqgIAAjkCAAQABAAEAAQABAAEAAQABAAEAASqAqoCZgVmBWYFAARcB+ME4wRWBccF4wTjBMcFxwWqAo0DVgVzBKoGVgXHBeMExwXjBAAEcwTHBeMEqgbjBHMEcwQdAzkCHQNgAwAEqgIABAAEjQMABI0DOQIABAAEOQI5Ao0DOQLHBQAEAAQABAAEHQMdAzkCAASNA1YFjQONAx0DMwMzAjMDVAT///////////////////////////////////////////////////////////////////////////////////////8AAh0DcQQABAAEqgY5BjkCqgKqAgAEjwQAAqoCAAI5AgAEAAQABAAEAAQABAAEAAQABAAEqgKqAo8EjwSPBAAEqAZWBVYFVgXHBVYFVgXHBTkGHQMABFYF4wQdB8cFxwXjBMcFVgVzBOMExwVWBR0HVgXjBOMEqgI5AqoCjwQABKoCAAQABI0DAASNA6oCAARzBDkCOQIABDkCOQZzBAAEAAQABB0DHQM5AnMEjQNWBQAEjQMdA8kCwwHJAo8E///ceQIAQc6RBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////zkCOQLXAnMEcwQdB1YFhwGqAqoCHQOsBDkCqgI5AjkCcwRzBHMEcwRzBHMEcwRzBHMEcwQ5AjkCrASsBKwEcwQfCFYFVgXHBccFVgXjBDkGxwU5AgAEVgVzBKoGxwU5BlYFOQbHBVYF4wTHBVYFjQdWBVYF4wQ5AjkCOQLBA3MEqgJzBHMEAARzBHMEOQJzBHMExwHHAQAExwGqBnMEcwRzBHMEqgIABDkCcwQABMcFAAQABAAErAIUAqwCrAT///////////////////////////////////////////////////////////////////////////////////////85AqoCywNzBHMEHQfHBecBqgKqAh0DrAQ5AqoCOQI5AnMEcwRzBHMEcwRzBHMEcwRzBHMEqgKqAqwErASsBOMEzQfHBccFxwXHBVYF4wQ5BscFOQJzBMcF4wSqBscFOQZWBTkGxwVWBeMExwVWBY0HVgVWBeMEqgI5AqoCrARzBKoCcwTjBHME4wRzBKoC4wTjBDkCOQJzBDkCHQfjBOME4wTjBB0DcwSqAuMEcwQ5BnMEcwQABB0DPQIdA6wE////////////////////////////////////////////////////////////////////////////////////////OQI5AtcCcwRzBB0HVgWHAaoCqgIdA6wEOQKqAjkCOQJzBHMEcwRzBHMEcwRzBHMEcwRzBDkCOQKsBKwErARzBB8IVgVWBccFxwVWBeMEOQbHBTkCAARWBXMEqgbHBTkGVgU5BscFVgXjBMcFVgWNB1YFVgXjBDkCOQI5AsEDcwSqAnMEcwQABHMEcwQ5AnMEcwTHAccBAATHAaoGcwRzBHMEcwSqAgAEOQJzBAAExwUABAAEAASsAhQCrAKsBP///////////////////////////////////////////////////////////////////////////////////////zkCqgLLA3MEcwQdB8cF5wGqAqoCHQOsBDkCqgI5AjkCcwRzBHMEcwRzBHMEcwRzBHMEcwSqAqoCrASsBKwE4wTNB8cFxwXHBccFVgXjBDkGxwU5AnMExwXjBKoGxwU5BlYFOQbHBVYF4wTHBVYFjQdWBVYF4wSqAjkCqgKsBHMEqgJzBOMEcwTjBHMEqgLjBOMEOQI5AnMEOQIdB+ME4wTjBOMEHQNzBKoC4wRzBDkGcwRzBAAEHQM9Ah0DrAT//xB6AgBB3pkHC4UIoED/////////////////////////////////////////////////////////////////////////////////////zQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBP///////////////////////////////////////////////////////////////////////////////////////80EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQT////////////////////////////////////////////////////////////////////////////////////////NBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0E////////////////////////////////////////////////////////////////////////////////////////zQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBM0EzQTNBP//OHoCAEHtoQcLhghAj0AAAP///////////////////////////////wIB////////////////////////////////////////////////AgHkAIgBWAJYAqIDtQLdAD0BPQHCAVgC5ACoAeQAGwFYAlgCWAJYAlgCWAJYAlgCWAJYAuQA5ABYAlgCWAK7AbID2QKkAqEC5gJHAiQC1gL5AgEBRAFxAh8CVwPkAv8CeQL/Ap0CZwJaAtgCsQJNBIoCVAJNAjsBGwE7AVgC9AH0ARICRwLPAUcCFAJNAUoCOALoAOwA9AEoAVgDOAIsAkcCRwJmAeEBXgExAgMCSQMNAgICzwFgAQkBYAFYAv//AAD///////////////////////////////8PAf///////////////////////////////////////////////w8B+ADAAVgCWAKxA9YC8wBmAWYBxQFYAvgAsgH4ADkBWAJYAlgCWAJYAlgCWAJYAlgCWAL4APgAWAJYAlgCywG2A+gCsAKoAvoCVQIyAuACBQMaAWIBmQIyAmQD7AIRA4wCEQOuAncCbQLiAskCWQSgAmoCXQJiATkBYgFYAvQB9AEjAlgC2AFYAh4CbAFcAkkC/wADARgCPwFtA0kCQAJYAlgCiAHoAYABQwIPAlUDIgIOAtoBhwEgAYcBWAL//wAA////////////////////////////////AgH///////////////////////////////////////////////8CAeQAiAFYAlgCogO1At0APQE9AcIBWALkAKgB5AAbAVgCWAJYAlgCWAJYAlgCWAJYAlgC5ADkAFgCWAJYArsBsgPZAqQCoQLmAkcCJALWAvkCAQFEAXECHwJYA+MC/wJ5Av8CnQJnAloC2AKwAk0EigJUAk0COwEbATsBWAL0AfQBEgJHAs8BRwIUAk0BSgI4AugA7AD0ASgBWAM4AiwCRwJHAmYB4QFeATECAwJJAw0CAgLPAWABCQFgAVgC//8AAP///////////////////////////////w8B////////////////////////////////////////////////DwH4AMABWAJYArED1gLzAGYBZgHFAVgC+ACyAfgAOQFYAlgCWAJYAlgCWAJYAlgCWAJYAvgA+ABYAlgCWALLAbYD6AKwAqgC+gJVAjIC4AIFAxoBYgGYAjICZQPrAhEDjAIRA64CdwJtAuICyQJZBKACagJdAmIBOQFiAVgC9AH0ASMCWALYAVgCHgJsAVwCSQL/AAMBGAI/AW0DSQJAAlgCWAKIAegBgAFDAg8CVQMiAg4C2gGHASABhwFYAv//QHoCAEH+qQcLhQigQP////////////////////////////////////////////////////////////////////////////////////+LAjUDrgO0BhcFmgc9BjMCHwMfAwAEtAaLAuMCiwKyAhcFFwUXBRcFFwUXBRcFFwUXBRcFsgKyArQGtAa0Bj8EAAh5BX0FlgUpBg4FmgQzBgQGXAJcAj8FdQTnBvwFTAbTBEwGjwUUBeME2wV5BekHewXjBHsFHwOyAh8DtAYABAAE5wQUBWYEFAXsBNECFAUSBTkCOQKiBDkCywcSBeUEFAUUBUoDKwQjAxIFvASLBrwEvAQzBBcFsgIXBbQG////////////////////////////////////////////////////////////////////////////////////////yQKmAysEtAaRBQQI+gZzAqgDqAMvBLQGCgNSAwoD7AKRBZEFkQWRBZEFkQWRBZEFkQWRBTMDMwO0BrQGtAakBAAIMQYZBt8FpAZ3BXcFkQayBvoC+gIzBhkF9geyBs0G3QXNBikGwwV1BX8GMQbTCCsGywXNBagD7AKoA7QGAAQABGYFugW+BLoFbQV7A7oFsgW+Ar4CUgW+AlYIsgV/BboFugXyA8ME0wOyBTcFZAcpBTcFqASyBewCsgW0Bv///////////////////////////////////////////////////////////////////////////////////////4sCNQOuA7QGFwWaBz0GMwIfAx8DAAS0BosC4wKLArICFwUXBRcFFwUXBRcFFwUXBRcFFwWyArICtAa0BrQGPwQACHkFfQWWBSkGDgWaBDMGBAZcAlwCPwV1BOcG/AVMBtMETAaPBRQF4wTbBXkF6Qd7BeMEewUfA7ICHwO0BgAEAATnBBQFZgQUBewE0QIUBRIFOQI5AqIEOQLLBxIF5QQUBRQFSgMrBCMDEgW8BIsGvAS8BDMEFwWyAhcFtAb////////////////////////////////////////////////////////////////////////////////////////JAqYDKwSRBZEFBAj6BnMCqAOoAy8EtAYKA1IDCgPsApEFkQWRBZEFkQWRBZEFkQWRBZEFMwMzA7QGtAa0BqQEAAgxBhkG3wWkBncFdwWRBrIG+gL6AjMGGQX2B7IGzQbdBc0GKQbDBXUFfwYxBtMIKwbLBc0FqAPsAqgDtAYABAAEZgW6Bb4EugVtBXsDugWyBb4CvgJSBb4CVgiyBX8FugW6BfIDwwTTA7IFNwVkBykFNwWoBLIF7AKyBbQG//9IegIAQY6yBwuFCKBAZgT///////////////////////////////8AAP///////////////////////////////////////////////2YEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgT//2YE////////////////////////////////AAD///////////////////////////////////////////////9mBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYE//9mBP///////////////////////////////wAA////////////////////////////////////////////////ZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBP///////////////////////////////////////////////////////////////////////////////////////2YEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgRmBGYEZgT//1R6AgBBnroHC4UIoED/////////////////////////////////////////////////////////////////////////////////////aQLwApkCMgQyBM0EpgVHAfAC8ALwAjIE8ALwAvACMgQyBDIEMgQyBDIEMgQyBDIEMgQyBPAC8AIyBDIEMgTwAioGuASHBMkE6ARJBDMEaQU8BToC0AObBA0ErQUbBWQFdgRoBagE2QOlBDAFswTRBnQEkARnBPAC2ALwAjIEMgQyBDQEdQT2A3UEXQT1AgQEXwRIAu8CCQRcAqQGXwRLBHUEdQQcAz0DLANfBOsD9AUCBPIDzAPwAjIE8AIyBP///////////////////////////////////////////////////////////////////////////////////////2kC8ALvArAEsAR5BaYF1gHwAvACdQOwBPAC8ALwAh8DsASwBLAEsASwBLAEsASwBLAEsATwAvACsASwBLAEgQMqBhEFwwTlBCQFjQSrBF8FeAU6AkME8ARsBPYFVwWgBbIErAXjBBcE5QRsBfkEEgfOBOgEewQ3A9gCNwOwBLAEsARDBKcEGASlBJkE9QIEBL4EYwLvAmIEXALgBrkEhwSpBKwEawNyAywDugQ4BEUGawRFBDoEeAOwBHgDsAT///////////////////////////////////////////////////////////////////////////////////////9pAvACmQIyBNkDzQSmBUcB8ALwAvACMgTwAvAC8AIyBDIEMgQyBDIEMgQyBDIEMgQyBDIE8ALwAjIEMgQyBPACKgbjBIcEyQToBEkEMwRpBTwFOgLQA5sEDQQXBhsFZAVZBGQFqATZA6UEMAWzBNEGdASQBGcE8ALYAvACMgQyBDIENAR1BK4DdQRMBDYDBAR1BHQC7wIJBJACpAZfBEsEdQR1BFUDPQNcA3QE6wP0BQIE8gPMA/ACMgTwAjIE////////////////////////////////////////////////////////////////////////////////////////aQLwAiADsASwBNwFpgVpAvAC8AJ1A7AE8ALwAvACLQOwBLAEsASwBLAEsASwBLAEsASwBPAC8AKwBLAEsAQtAyoG6QS4BOcEDwW/BK8EaQVtBToC/QMzBToESgZIBZ4FqwQoBv0EAwR7BUsFdwVpB0EFeAXkBOID0gPiA7AEsASwBL4EvwTxA78EagRIA0gEfwSdAhoDUQSPAqQGfwSPBMoEygSTA6wDgQN1BGsEMAabBIMEQwTiA7AE4gOwBP//YHoCAEGuwgcLhQigQP/////////////////////////////////////////////////////////////////////////////////////QAiYDrAOMBhYFnAjQBSYCogOiAxYFjAbpAqID6QKiAxYFFgUWBRYFFgUWBRYFFgUWBRYFogOiA4wGjAaMBl0EAAh4BXwFlgUqBg8FmQQ0BgMGXgOjA4sFdAS+BvwFTAbTBEwGkAV4Be4E2wV4BekHewXsBHsFogOiA6IDjAYWBRYFzgT8BCsE/ATEBNAC/AQQBTICwQK8BDICyAcQBdsE/AT8BGoDKwQnAxAFvASMBrwEvAQ0BBQFogMUBYwG////////////////////////////////////////////////////////////////////////////////////////vAI4A7ME8AawBS0K5gaoAlkEWQSwBfAG5ALXA+QChAWwBbAFsAWwBbAFsAWwBbAFsAWwBTgDOAPwBvAG8AbvBLYHNgYYBsoFpAZ3BTQFfQazBl4EcQQrBhkFlQfGBs0G3QXNBkIGrwV0BX8GHAYHCRwG5QWJBVkEhAVZBPAGsAWwBVgFmAW1BJgFUAVhA5gFswW8AjkDXgW8AncIswV+BZgFmAX6A78EpQOzBTMF1gdaBTUFxgSwBVkEsAXwBv///////////////////////////////////////////////////////////////////////////////////////9ACJgOsA4wGFgWcCNAFJgKiA6IDFgWMBukCogPpAqIDFgUWBRYFFgUWBRYFFgUWBRYFFgWiA6IDjAaMBowGXQQACHYFfAWWBSAGDwWZBDQGAwZeA6MDiwV0BL4G/AVMBtMETAaQBXgF7gTbBXYF7Ad7BewEewWiA6IDogOMBhYFFgXOBPwEKwT8BMQE0AL5BBAFMgLBArIEMgLJBxAF2wT8BPwEagMrBCcDEAW6BIwGvAS6BDQEFAWiAxQFjAb///////////////////////////////////////////////////////////////////////////////////////+8AjgDswTwBrAFLQrmBqgCWQRZBLAF8AbkAtcD5AKEBbAFsAWwBbAFsAWwBbAFsAWwBbAFOAM4A/AG8AbwBu8Etgc2BhgGygWkBncFNAV9BrMGXgRxBCsGGQWVB8YGzQbdBc0GQgavBXQFfwYcBgcJHAblBYkFWQSEBVkE8AawBbAFWAWYBbUEmAVQBWEDmAWzBbwCOQNeBbwCdwizBXwFmAWYBfoDvwSlA7MFMQXWB1oFNQXGBLAFWQSwBfAG//9oegIAQb7KBwuFCKBA/////////////////////////////////////////////////////////////////////////////////////xQCIwI1AysFkwSWBtcFxQFeAl4CagSTBPYBkwIhAvACkwSTBJMEkwSTBJMEkwSTBJMEkwQhAiECkwSTBJMEbwMxBxAFLwUMBdUFcwQhBNMF5wU7AiMC6QQnBDkHCAY7BtEEOwbyBGQEbQTTBcMEaAeeBHsEkQSiAvACogJWBJYDngRzBOcEzwPnBH0EtgJiBOkEBgIGAjMEBgJxB+kE1QTnBOcERAPRA9MC6QQCBDkGMQQIBL4DCANoBAgDkwT///////////////////////////////////////////////////////////////////////////////////////8UAkoCxwMrBZEENQcABiECtgK2AlwEkQRSApMCSAJOA5EEkQSRBJEEkQSRBJEEkQSRBJEESAJSApEEkQSRBNEDLQeFBWAFGQXsBXsEZATLBR8GpgKmAlAFhQSLB4EGXgYGBV4GSAVoBKIEDAYzBbwHVgX+BKIEpgJOA6YCQgRKA9sE1QQQBR0EEAW6BBkDhQRCBXECcQL2BHEC2wdCBfQEEAUQBaID+gN5A0IFjQTZBqAEjQTnAycDaAQnA5EE////////////////////////////////////////////////////////////////////////////////////////FAISAhcDKwVoBFgGXAW8AUgCSAJqBGgE7AF/AgYCzQJoBGgEaARoBGgEaARoBGgEaARoBAYCBgJoBGgEaARqA8cGcQTJBK4EVAUXBMcDagVtBS8CIwJ1BMsDsgaeBcMFhwTDBY0EBAT8A2gFYgTRBicEBgQ/BEoCzQJKAiMEJwNvBIUEngSaA54E8gOBAgIEngQIAggC5wMIAvoGngR9BJ4EngQrA20DmAKeBLIDvAXTA7IDjQPLAmgEywJoBP///////////////////////////////////////////////////////////////////////////////////////xQCSgKgAysFaATZBqoFCgK2ArYCXARoBDkCkwJIAl4DaARoBGgEaARoBGgEaARoBGgEaARIAkgCaARoBGgErAPZBgYF9gTlBGoFVgQ/BIUFmgWTAqYC5wQlBAoHCgbXBaQE1wXfBD0EPwSHBbgEJwfZBIMESgSmAl4DpgI5BDMDbwTBBMME3QPBBHUE/AJUBNUEYAJgAosEYAI9B9UErgTDBMEEXgPJA0gD1QQZBE4GPwQnBKQD1wJoBNcCaAT//3B6AgBBztIHC4UIoED/////////////////////////////////////////////////////////////////////////////////////7gGmAksDJQXhBIoGrwW5AQADAAPHAyUFKAL+AigCwAPpBHADeARqBIUEOgSHBAUExQSHBIACgAIlBSUFJQXUA24HXgU7BSMF/gU6BcsEzQWFBh4DJASOBdQEawcjBvQF4QT0BZ0FfQTzBA0GVQXOB68F7ATQBAADwAMAAyUFJQUABAgEewSiA5gE3gOaAhMEqARYAlYCSQRKAgwHugRQBJIEegRHA3UDwwKaBPkD5gUKBPADjQNxAwADcQMlBf///////////////////////////////////////////////////////////////////////////////////////wgCAwMUBKAFIAUJB2UGJwKTA5MD2wOgBaACCAOgAsYDnAXrAwMF/wQyBcsELwVvBGkFLwXwAvACoAWgBaAFYwS8BxEGDwa5BawGxQVfBXUGTgeRA8MEiQZ8BTAItwaPBpwFjwZhBjEFeQWrBhkGAwl4BtsFhAWTA8YDkwOgBaAFAATEBCoFQAROBZMEJQOdBHAF1ALFAg4FwQIgCIUFFgVDBTAFKQQaBC4DagWJBOgGtAR/BDQEAAQaAwAEoAX////////////////////////////////////////////////////////////////////////////////////////uAaYCSwMlBeEEigavBbkBAAMAA8cDJQUoAv4CKALAA+kEcAN4BGoEhQQ6BIcE+QPFBIcEEgMSAyUFJQUlBdQDbgdeBTsFIwX+BToFywTNBYUGHgMkBI4F1ARrByMG2AXhBNgFnQV9BPMEDQZVBc4HrwXsBNAEAAPAAwADJQUlBQAElQRuBKEDmgTGA6EClQSABGECVAI5BEgCCQe4BEwEoARxBLEDcwPHApoETgSUBgIEegSNA3EDAANxAyUF////////////////////////////////////////////////////////////////////////////////////////CAIDAxQEoAUgBQkHZQYnApMDkwPbA6AFoAIIA6ACxgOcBesDAwX/BDIFywQvBYgEaQUvBfAC8AKgBaAFoAVjBLwHEQYTBrkFrAbFBV8FdQZOB5sDwwSJBnwFRAijBo8GpgWPBmEGOQV5BasGGQYDCWsG2wWEBZMDxgOTA6AFoAUABEgFMQVJBE0FdQQMAzIFZwXtAusCIQXWAgQIhQUWBU0FMwVFBCMEVgN7BeYEeAerBFsFIwQABBoDAASgBf//eHoCAEHe2gcLyAqgQP/////////////////////////////////////////////////////////////////////////////////////PAZsCNQP8Aw4EuAV1BcQBbQJtAvwD/AP/AXMCBQIXAw4EDgQOBA4EDgQOBA4EDgQOBA4EJAIkAvwD/AP8A7UDJwehBFoERATsBOgDrQMMBfwEBAKNAigEXQPXBioFTAUiBGIFWAStA+YDIgWKBB4HJwTmA78DdAIXA3QC/AP8A1QC1QM0BGIDNAT7A3ECxAM0BNYB6gGjA9YBZAY0BDgENAQ0BMoCIQOuAjQEnQO4BXcDnwMpA4QCrwOEAvwD//8AAP///////////////////////////////wAA////////////////////////////////////////////////zwGbAoID/AMOBNUFowXeAX4CfgL8A/wDEAJzAiMCcAMOBA4EDgQOBA4EDgQOBA4EDgQOBDUCNQL8A/wD/AO1AzAH2QR8BDwECwXnA6wDGQUMBSICpgJgBGID/gZFBWkFQgR9BYEEyAP2AzkFuwRAB2gEKATTA5kCcAOZAvwD/ANnAvMDSwRZA0sEBwSIAssDSwT3AQsC1wP3AYIGSwRNBEsESwTYAjEDxgJLBMkD9gWtA8oDLgPAAs0DwAL8A////////////////////////////////////////////////////////////////////////////////////////88BmwI1A/wDDgS4BXUFxAFtAm0C/AP8A/8BcwIFAhoDDgQOBA4EDgQOBA4EDgQOBA4EDgQkAiQC/AP8A/wDtQMnB6EEWgQuBOwE6AOtAwwF/AQEAo0CKARdA9cGKAU8BSIEUAVYBJ4D5gMiBYoEHwcnBOYDvwN0AhMDdAL8A/wDVAIdBB0EVAMdBNIDcQIdBB0E1gHqAaMD1gFUBh0EGwQdBB0EvgIdA64CHQSRA7gFdwOUAykDhAKvA4QC/AP////////////////////////////////////////////////////////////////////////////////////////PAZsCggP8Aw4E1QWjBd4BfgJ+AvwD/AMQAnMCIwJ5Aw4EDgQOBA4EDgQOBA4EDgQOBA4ENQI1AvwD/AP8A7UD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AAC7OAAAqAAAAGc/AADSAwAAwzIAAMUDAACIOAAA/AAAAEYuAAAYIQAABj0AAL4DAAB/SgAA/QAAAJc0AAClAAAAgzgAAP8AAAC1YgAAtgMAAOw8AAANIAAA8DwAAAwgAADPQQEACAAAAAMAAAD8QQAA1s8AAAsAAAAGAAAAQBcAAMppAAACAAAAAQAAAKsuAAANdQAABAAAAAIAAAAwRQAAAAQAAAMAAAAEAAAAI0QAAOLPAAAFAAAABQAAAIdFAAAEBAAABAAAAAcAAAAWFwAAfTgAAAUAAAAJAAAAfzgAAH9tAAAEAAAACgAAAENFAACw/AEABAAAAAwAAACRMQAAAAABAAAB0NHS09TV1tfY2QBB1vkHCwnwvwAAAAAAAAEAQej5BwsNaW52aXMAAGZpbGxlZABBgPoHCxoUHAAAXVMAAKg3AACaCwAAXHkAAJHGAADLjgBBwPoHC3n//////////////////////////////////////////wAAAAAAAAAE/v//h/7//wcAAAAAAAAAAP//f////3//////////83/+/f//////f///////////D+D/////Mfz///8AAAAAAAAA//////////////8BAPgDAEHQ+wcLQUDX///7/////39/VP3/DwD+3////////////t//////AwD///////+fGf///88/AwAAAAAAAP7///9/Av7///9/AEGa/AcLswH///8HBwAAAAAA/v//B/4HAAAAAP7//////////3z/fy8AYAAAAOD///////8jAAAA/wMAAADgn/n///3FAwAAALADAAMA4If5///9bQMAAABeAAAcAOCv+////e0jAAAAAAEAAADgn/n///3NIwAAALADAAAA4Mc91hjHvwMAAAAAAAAAAODf/f///e8DAAAAAAMAAADg3/3///3vAwAAAEADAAAA4N/9///9/wMAAAAAAwBB4P0HCxn+/////38NAD8AAAAAAAAAliXw/q5sDSAfAEGI/gcLBv/+////AwBBtP4HC3L/////PwD/////fwDt2gcAAAAAUAFQMYKrYiwAAAAAQADJgPUHAAAAAAgBAv////////////////////////8P//////////////8D//8/P/////8/P/+q////P////////99f3B/PD/8f3B8AAAAAQEwAQbD/BwsBBwBBwP8HCyaAAAAA/gMAAP7///////////8fAP7/////////////B+D/////HwBBgIAICxX//////////////////////////z8AQaCACAsV//////////////////////////8PAEHFgAgLyQJg/wf+//+H/v//BwAAAAAAAIAA//9/////f/////8AAAAAAAAA//////////////8BAPgDAAMAAAAAAP//////////PwAAAAMAAADA1///+/////9/f1T9/w8A/t////////////7f/////3sA////////nxn////PPwMAAAAAAAD+////fwL+////fwD+//v//7sWAP///wcHAAAAAAD+//8H//8HAP8D////////////fP9/7///Pf8D7v////////P/Px7/z/8AAO6f+f///cXTnzmAsM//AwDkh/n///1t04c5AF7A/x8A7q/7///97fO/OwAAwf8AAO6f+f///c3zjznAsMP/AADsxz3WGMe/w8c9gACA/wAA7t/9///978PfPWAAw/8AAOzf/f///e/D3z1gQMP/AADs3/3///3/w889gADD/wBBoIMICzj+/////3//B/9//wMAAAAAliXw/q5s/ztfP/8DAAAAAAAAAAP/A6DC//7///8D/v/fD7/+/z/+AgBB+oMIC2f/HwIAAACgAAAA/v8+AP7///////////8fZv7/////////////d2AAAABhAAAAYgAAAGMAAABkAAAAZQAAAGYAAABnAAAAaAAAAGkAAABqAAAAawAAAGwAAABtAAAAbgAAAG8AAAABAEHxhAgLBRUKAAAJAEGIhQgL4AEVEAwTHB4DDR8gISIjGxoRGRkZGRkZGRkZGRYSAg4LDxwYGBgYGBgWFhYWFhYWFhYWFhYWFhYWFhYWFhQcBBwWHBgYGBgYGBYWFhYWFhYWFhYWFhYWFhYWFhYWHCQcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwWHBwcHBwcHBwcHBYcGhwcFhwcHBwcFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYcFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhwWFhYWFhYWFgBBkIcICxICAwQFBgcIAAAJCgsMDQ4PEBEAQa6HCAsEEhMAFABBwIcI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ADYQAACdUgAAlAUAAO5SAADbBAAAJx8AAMAEAADTSgAAZQUAAPZCAABdEwAAOjMAAMBSAACwTQAA5A0AABUFAADdEwAA7DEAAK4JAACUCQAA7wQAAANZAADiWAAASlYAAOtZAADWWQAAu1YAAF5ZAAA5BQAA0E4AAF9YAABvGQAAHRAAAApYAAB2WQAAy1YAAHvIAADXugAAVqwAAG2eAADDkQAAiIYAAGx/AACxeQAATHUAADByAADUbwAAoG8AAGtvAAAvbwAAoG4AALJtAABoyAAAxLoAAEOsAABangAAsJEAAHWGAABZfwAAnnkAADl1AAAdcgAAz28AAJtvAABmbwAAKm8AAJtuAACtbQAAVcgAALG6AAAwrAAAR54AAJ2RAABihgAARn8AAIt5AAAmdQAACnIAAMpvAACWbwAAYW8AACVvAACWbgAAqG0AAFDIAACsugAAK6wAAEKeAACYkQAAXYYAAEF/AACGeQAAIXUAAAVyAADFbwAAkW8AAFxvAAAgbwAAkW4AAKNtAABLyAAAp7oAACasAAA9ngAAk5EAAFiGAAA8fwAAgXkAABx1AAAAcgAAwG8AAIxvAABXbwAAG28AAIxuAACebQAARsgAAKK6AAAhrAAAOJ4AAI6RAABThgAAN38AAHx5AAAXdQAA+3EAALtvAACHbwAAUm8AABZvAACAbgAAmW0AAEHIAACdugAAHKwAADOeAACJkQAAToYAADJ/AAB3eQAAEnUAAPZxAAC2bwAAgm8AAE1vAAD7bgAAe24AAJRtAAA8yAAAmLoAABesAAAungAAhJEAAEmGAAAtfwAAcnkAAAh1AADxcQAAsW8AAH1vAABIbwAA9m4AAHZuAAB6bQAANsgAAMm3AABxqQAAopsAAPaOAABAhgAAKX8AAG55AADvdAAA6RQAAC83AAB1bwAAOW8AALMfAADBbQAAbG0AAHnJAAA+uwAAvawAANSeAAAxkgAA/YYAANN/AAAYegAAs3UAAKJyAADZbwAApW8AAHBvAAA0bwAApW4AALxtAACY6QAAB+YAAJfjAACIFwIAXtgAAFzYAABa2AAAWNgAAPfXAACx1wAA8s8AAPDPAADuzwAA688AANTPAABMzwAARM8AAOvHAACrtwAAU6kAAG2bAADYjgAAMoYAABt/AABgeQAA4XQAAONxAAAKcQAAwnAAAMBwAAC2cAAA4G8AAN5vAADcbwAAr28AAHNvAAA3bwAAqG4AAL9tAABqbQAA7mwAAMpsAACibAAAoGwAAJ1sAADUaQAAvmkAAI1pAACLaQAAemkAAHhpAADWaAAAumgAACFoAAAfaAAAHWgAABtoAAB5ZQAAUGUAAE5lAAAzZQAAMWUAABFkAAAPZAAArWMAAKtjAABxYgAA8WEAABdbAABdUwAAVUYAAJhEAAB+QQAAnz0AAPw8AADqPAAAPTsAAF84AACoNwAAmTEAAGwwAAAIIAAAxB8AABQcAADqFAAAbAwAAOgLAACaCwAACwoAAC0JAAB5BAAARAQAADsEAAAvBAAACQQAALdtAAAAAAAACACu/9EACgCu/67/CwCu/67/rv+u/67/rv+u/67/BQDRAK7/0QDRANEA0QDRANEA0QDRAK7/+/+u/w4A7P+u/67/rv+u/9EA0QDRANEA0QANACUADABCABAAUAATAG0AewAUAJgADwCmAMMArv+u/67/rv+u/67/rv+u/67/rv+u/67/rv+u/67/rv+u/67/rv+u/67/rv+u/67/FwCu/3cArv8HAC4Arv8mAK7/FwARACMArv8NAK7/rv+u/67/OgCu/67/NQCu/67/rv8oAK7/BwCu/zsARQCu/0gArv+u/67/rv+u/wBB8bsIC8EGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKAAAAAAAAAAAAgICAgICEAxZAQAfUAgDBxITFFcWFwgLaQwfCgUMDikRKw8tEC8wIDIGNDUbHB0eCwwhIiMkJSYnKAwYGRcEChscGiAqCiEiIyQlJicoDAoOUwosWDFYWFhYWFgMGxwPLlgzISIjJCUmJygbHP9T//8hIiMkJSYnKAz//wX///8JFP//////DBsc/xAVFiEiIyQlJicoGxz/////ISIjJCUmJygM/xITFBEWF////////wwbHP///xIhIiMkJSYnKBsc/////yEiIyQlJicoDP///////xP///////8MGxz/////ISIjJCUmJygbHP////8hIiMkJSYnKBITFBUWFxgZ////////////IyQlJicbEhMUFhciNmgBHzhWISACGxsbXhsbNzlwNtLCTwQ8IkciPyJEIiJYImUiIgUGX2A5BAcICQoLDA0OBGZnXWptBQZvWDtxBwgJCgsMDQ4Ecjxbcz5hRhsSExQWFwQFBj9BYkkHCAkKCwwNDgUGAFwAAAcICQoLDA0OBAAATwAAAFNCAAAAAAAEBQYARFRVBwgJCgsMDQ4FBgAAAAAHCAkKCwwNDgQAKiwuRzEzAAAAAAAABAUGAAAASgcICQoLDA0OBQYAAAAABwgJCgsMDQ4EAAAAAAAATAAAAAAAAAQFBgAAAAAHCAkKCwwNDgUGAAAAAAcICQoLDA0OKSstLzAyNDUAQbvCCAsuKSstMDIABC8AJCMAEhQWGhweIBgABQcvLy8ALy8AAAkIKAAAASICBgAAAAAACABB9sIICz4lAyYTCikVCyoXDi0ZERsMKx0NLB8PIRAAMwAwAC9DADEALwA1LidCMkEAOjgAPDRFADYAQAAAPwBENzs5PQBBwcMIC0UCAwMBAQIBAQEDAwMDAwMDAwEBAQEBAQEBAQEBAQEBAQECAQECAAYBAwMDAwMBAAECAwAEAQIDAAQABAAEAAMCAQIBAgEAQZHECAtFKSoqKissLC0tLS0tLS0tLS0uLzAxMjM0NTY3ODk6Ozw9Pj4/P0FAQkJCQkJCQ0NERERGRUdHR0lISkhLSExITU1OTk9PAEHgxAgLxgGu/67//P/oAPb///8aAAAAJwABADIArv+u/wIAJAADAC8Arv+u/67/rv+u//7/lACu/wkAGwCu/7z/rv+u/6//rv+u/67/rv+u/67/rv8AAAADDxARIzokPSVAFUMmRSdIGEsZTRooHE4dHlBRUllabGtuY2RXaQBIAAAAKAAAABgAAAA4AAAAGAAAAAgAAAAOAAAAbG5yc29saWQAAHNldGxpbmV3aWR0aAAx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Qbj4CAugEFCsAgDorAIAeK0CAE5vIGVycm9yIGluZm9ybWF0aW9uAElsbGVnYWwgYnl0ZSBzZXF1ZW5jZQBEb21haW4gZXJyb3IAUmVzdWx0IG5vdCByZXByZXNlbnRhYmxlAE5vdCBhIHR0eQBQZXJtaXNzaW9uIGRlbmllZABPcGVyYXRpb24gbm90IHBlcm1pdHRlZABObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5AE5vIHN1Y2ggcHJvY2VzcwBGaWxlIGV4aXN0cwBWYWx1ZSB0b28gbGFyZ2UgZm9yIGRhdGEgdHlwZQBObyBzcGFjZSBsZWZ0IG9uIGRldmljZQBPdXQgb2YgbWVtb3J5AFJlc291cmNlIGJ1c3kASW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwAUmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUASW52YWxpZCBzZWVrAENyb3NzLWRldmljZSBsaW5rAFJlYWQtb25seSBmaWxlIHN5c3RlbQBEaXJlY3Rvcnkgbm90IGVtcHR5AENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcgBPcGVyYXRpb24gdGltZWQgb3V0AENvbm5lY3Rpb24gcmVmdXNlZABIb3N0IGlzIGRvd24ASG9zdCBpcyB1bnJlYWNoYWJsZQBBZGRyZXNzIGluIHVzZQBCcm9rZW4gcGlwZQBJL08gZXJyb3IATm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcwBCbG9jayBkZXZpY2UgcmVxdWlyZWQATm8gc3VjaCBkZXZpY2UATm90IGEgZGlyZWN0b3J5AElzIGEgZGlyZWN0b3J5AFRleHQgZmlsZSBidXN5AEV4ZWMgZm9ybWF0IGVycm9yAEludmFsaWQgYXJndW1lbnQAQXJndW1lbnQgbGlzdCB0b28gbG9uZwBTeW1ib2xpYyBsaW5rIGxvb3AARmlsZW5hbWUgdG9vIGxvbmcAVG9vIG1hbnkgb3BlbiBmaWxlcyBpbiBzeXN0ZW0ATm8gZmlsZSBkZXNjcmlwdG9ycyBhdmFpbGFibGUAQmFkIGZpbGUgZGVzY3JpcHRvcgBObyBjaGlsZCBwcm9jZXNzAEJhZCBhZGRyZXNzAEZpbGUgdG9vIGxhcmdlAFRvbyBtYW55IGxpbmtzAE5vIGxvY2tzIGF2YWlsYWJsZQBSZXNvdXJjZSBkZWFkbG9jayB3b3VsZCBvY2N1cgBTdGF0ZSBub3QgcmVjb3ZlcmFibGUAUHJldmlvdXMgb3duZXIgZGllZABPcGVyYXRpb24gY2FuY2VsZWQARnVuY3Rpb24gbm90IGltcGxlbWVudGVkAE5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlAElkZW50aWZpZXIgcmVtb3ZlZABEZXZpY2Ugbm90IGEgc3RyZWFtAE5vIGRhdGEgYXZhaWxhYmxlAERldmljZSB0aW1lb3V0AE91dCBvZiBzdHJlYW1zIHJlc291cmNlcwBMaW5rIGhhcyBiZWVuIHNldmVyZWQAUHJvdG9jb2wgZXJyb3IAQmFkIG1lc3NhZ2UARmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZQBOb3QgYSBzb2NrZXQARGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZABNZXNzYWdlIHRvbyBsYXJnZQBQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQAUHJvdG9jb2wgbm90IGF2YWlsYWJsZQBQcm90b2NvbCBub3Qgc3VwcG9ydGVkAFNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQATm90IHN1cHBvcnRlZABQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZABBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sAEFkZHJlc3Mgbm90IGF2YWlsYWJsZQBOZXR3b3JrIGlzIGRvd24ATmV0d29yayB1bnJlYWNoYWJsZQBDb25uZWN0aW9uIHJlc2V0IGJ5IG5ldHdvcmsAQ29ubmVjdGlvbiBhYm9ydGVkAE5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUAU29ja2V0IGlzIGNvbm5lY3RlZABTb2NrZXQgbm90IGNvbm5lY3RlZABDYW5ub3Qgc2VuZCBhZnRlciBzb2NrZXQgc2h1dGRvd24AT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MAT3BlcmF0aW9uIGluIHByb2dyZXNzAFN0YWxlIGZpbGUgaGFuZGxlAFJlbW90ZSBJL08gZXJyb3IAUXVvdGEgZXhjZWVkZWQATm8gbWVkaXVtIGZvdW5kAFdyb25nIG1lZGl1bSB0eXBlAE11bHRpaG9wIGF0dGVtcHRlZABSZXF1aXJlZCBrZXkgbm90IGF2YWlsYWJsZQBLZXkgaGFzIGV4cGlyZWQAS2V5IGhhcyBiZWVuIHJldm9rZWQAS2V5IHdhcyByZWplY3RlZCBieSBzZXJ2aWNlAAAAAAClAlsA8AG1BYwFJQGDBh0DlAT/AMcDMQMLBrwBjwF/A8oEKwDaBq8AQgNOA9wBDgQVAKEGDQGUAgsCOAZkArwC/wJdA+cECwfPAssF7wXbBeECHgZFAoUAggJsA28E8QDzAxgF2QDaA0wGVAJ7AZ0DvQQAAFEAFQK7ALMDbQD/AYUELwX5BDgAZQFGAZ8AtwaoAXMCUwEAQYiJCQsMIQQAAAAAAAAAAC8CAEGoiQkLBjUERwRWBABBvokJCwKgBABB0okJCyJGBWAFbgVhBgAAzwEAAAAAAAAAAMkG6Qb5Bh4HOQdJB14HAEGAigkLkQHRdJ4AV529KoBwUg///z4nCgAAAGQAAADoAwAAECcAAKCGAQBAQg8AgJaYAADh9QUYAAAANQAAAHEAAABr////zvv//5K///8AAAAAAAAAABkACwAZGRkAAAAABQAAAAAAAAkAAAAACwAAAAAAAAAAGQAKChkZGQMKBwABAAkLGAAACQYLAAALAAYZAAAAGRkZAEGhiwkLIQ4AAAAAAAAAABkACw0ZGRkADQAAAgAJDgAAAAkADgAADgBB24sJCwEMAEHniwkLFRMAAAAAEwAAAAAJDAAAAAAADAAADABBlYwJCwEQAEGhjAkLFQ8AAAAEDwAAAAAJEAAAAAAAEAAAEABBz4wJCwESAEHbjAkLHhEAAAAAEQAAAAAJEgAAAAAAEgAAEgAAGgAAABoaGgBBko0JCw4aAAAAGhoaAAAAAAAACQBBw40JCwEUAEHPjQkLFRcAAAAAFwAAAAAJFAAAAAAAFAAAFABB/Y0JCwEWAEGJjgkLJxUAAAAAFQAAAAAJFgAAAAAAFgAAFgAAMDEyMzQ1Njc4OUFCQ0RFRgBB1I4JCwIDAgBB/I4JCwj//////////wBBwI8JC/UI/////////////////////////////////////////////////////////////////wABAgMEBQYHCAn/////////CgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiP///////8KCwwNDg8QERITFBUWFxgZGhscHR4fICEiI/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAQIEBwMGBQAAAAAAAAACAADAAwAAwAQAAMAFAADABgAAwAcAAMAIAADACQAAwAoAAMALAADADAAAwA0AAMAOAADADwAAwBAAAMARAADAEgAAwBMAAMAUAADAFQAAwBYAAMAXAADAGAAAwBkAAMAaAADAGwAAwBwAAMAdAADAHgAAwB8AAMAAAACzAQAAwwIAAMMDAADDBAAAwwUAAMMGAADDBwAAwwgAAMMJAADDCgAAwwsAAMMMAADDDQAA0w4AAMMPAADDAAAMuwEADMMCAAzDAwAMwwQADNsAAAAAhEoCAAUCAAAGAgAABwIAAAgCAAAJAgAACgIAAAsCAAAMAgAADQIAAA4CAAAPAgAAEAIAABECAAASAgAABAAAAAAAAADASgIAEwIAABQCAAD8/////P///8BKAgAVAgAAFgIAAOhJAgD8SQIAAAAAAAhLAgAXAgAAGAIAAAcCAAAIAgAAGQIAABoCAAALAgAADAIAAA0CAAAbAgAADwIAABwCAAARAgAAHQIAAPh1AgBYSgIAHEwCAE5TdDNfXzI5YmFzaWNfaW9zSWNOU18xMWNoYXJfdHJhaXRzSWNFRUVFAAAA0HUCAIxKAgBOU3QzX18yMTViYXNpY19zdHJlYW1idWZJY05TXzExY2hhcl90cmFpdHNJY0VFRUUAAAAAVHYCANhKAgAAAAAAAQAAAExKAgAD9P//TlN0M19fMjEzYmFzaWNfb3N0cmVhbUljTlNfMTFjaGFyX3RyYWl0c0ljRUVFRQAA+HUCABRLAgCESgIATlN0M19fMjE1YmFzaWNfc3RyaW5nYnVmSWNOU18xMWNoYXJfdHJhaXRzSWNFRU5TXzlhbGxvY2F0b3JJY0VFRUUAAAA4AAAAAAAAALhLAgAeAgAAHwIAAMj////I////uEsCACACAAAhAgAAZEsCAJxLAgCwSwIAeEsCADgA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";return Q}var eA;function UA(Q){if(Q==eA&&E)return new Uint8Array(E);var m=u(Q);if(m)return m;throw"both async and sync fetching of the wasm failed"}function aA(Q){return Promise.resolve().then(()=>UA(Q))}function le(Q,m,v){return aA(Q).then(p=>WebAssembly.instantiate(p,m)).then(v,p=>{B(`failed to asynchronously prepare wasm: ${p}`),TA(p)})}function SA(Q,m,v,p){return le(m,v,p)}function Ue(){return{a:Xn}}function mA(){var Q=Ue();function m(p,N){return se=p.exports,D=se.y,j(),cA(se.z),CA(),se}KA();function v(p){m(p.instance)}return eA??=uA(),SA(E,eA,Q,v).catch(o),{}}function sA(Q){return i.agerrMessages.push(Re(Q)),0}function xt(Q){this.name="ExitStatus",this.message=`Program terminated with exit(${Q})`,this.status=Q}var tt=Q=>{Q.forEach(m=>m(i))};function de(Q,m="i8"){switch(m.endsWith("*")&&(m="*"),m){case"i1":return R[Q];case"i8":return R[Q];case"i16":return _[Q>>1];case"i32":return K[Q>>2];case"i64":return H[Q>>3];case"float":return U[Q>>2];case"double":return q[Q>>3];case"*":return z[Q>>2];default:TA(`invalid type for getValue: ${m}`)}}var Dt=Q=>Yi(Q),_e=()=>Hr(),Le=typeof TextDecoder<"u"?new TextDecoder:void 0,bt=(Q,m=0,v=NaN)=>{for(var p=m+v,N=m;Q[N]&&!(N>=p);)++N;if(N-m>16&&Q.buffer&&Le)return Le.decode(Q.subarray(m,N));for(var J="";m>10,56320|te&1023)}}return J},Re=(Q,m)=>Q?bt(w,Q,m):"",$t=(Q,m,v,p)=>{TA(`Assertion failed: ${Re(Q)}, at: `+[m?Re(m):"unknown filename",v,p?Re(p):"unknown function"])};class x{constructor(m){this.excPtr=m,this.ptr=m-24}set_type(m){z[this.ptr+4>>2]=m}get_type(){return z[this.ptr+4>>2]}set_destructor(m){z[this.ptr+8>>2]=m}get_destructor(){return z[this.ptr+8>>2]}set_caught(m){m=m?1:0,R[this.ptr+12]=m}get_caught(){return R[this.ptr+12]!=0}set_rethrown(m){m=m?1:0,R[this.ptr+13]=m}get_rethrown(){return R[this.ptr+13]!=0}init(m,v){this.set_adjusted_ptr(0),this.set_type(m),this.set_destructor(v)}set_adjusted_ptr(m){z[this.ptr+16>>2]=m}get_adjusted_ptr(){return z[this.ptr+16>>2]}}var Y=0,P=(Q,m,v)=>{var p=new x(Q);throw p.init(m,v),Y=Q,Y},X={isAbs:Q=>Q.charAt(0)==="/",splitPath:Q=>{var m=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return m.exec(Q).slice(1)},normalizeArray:(Q,m)=>{for(var v=0,p=Q.length-1;p>=0;p--){var N=Q[p];N==="."?Q.splice(p,1):N===".."?(Q.splice(p,1),v++):v&&(Q.splice(p,1),v--)}if(m)for(;v;v--)Q.unshift("..");return Q},normalize:Q=>{var m=X.isAbs(Q),v=Q.substr(-1)==="/";return Q=X.normalizeArray(Q.split("/").filter(p=>!!p),!m).join("/"),!Q&&!m&&(Q="."),Q&&v&&(Q+="/"),(m?"/":"")+Q},dirname:Q=>{var m=X.splitPath(Q),v=m[0],p=m[1];return!v&&!p?".":(p&&(p=p.substr(0,p.length-1)),v+p)},basename:Q=>{if(Q==="/")return"/";Q=X.normalize(Q),Q=Q.replace(/\/$/,"");var m=Q.lastIndexOf("/");return m===-1?Q:Q.substr(m+1)},join:(...Q)=>X.normalize(Q.join("/")),join2:(Q,m)=>X.normalize(Q+"/"+m)},bA=()=>{if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function")return Q=>crypto.getRandomValues(Q);TA("initRandomDevice")},Be=Q=>(Be=bA())(Q),Ee={resolve:(...Q)=>{for(var m="",v=!1,p=Q.length-1;p>=-1&&!v;p--){var N=p>=0?Q[p]:M.cwd();if(typeof N!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!N)return"";m=N+"/"+m,v=X.isAbs(N)}return m=X.normalizeArray(m.split("/").filter(J=>!!J),!v).join("/"),(v?"/":"")+m||"."},relative:(Q,m)=>{Q=Ee.resolve(Q).substr(1),m=Ee.resolve(m).substr(1);function v(te){for(var re=0;re=0&&te[Pe]==="";Pe--);return re>Pe?[]:te.slice(re,Pe-re+1)}for(var p=v(Q.split("/")),N=v(m.split("/")),J=Math.min(p.length,N.length),V=J,Z=0;Z{for(var m=0,v=0;v=55296&&p<=57343?(m+=4,++v):m+=3}return m},gt=(Q,m,v,p)=>{if(!(p>0))return 0;for(var N=v,J=v+p-1,V=0;V=55296&&Z<=57343){var FA=Q.charCodeAt(++V);Z=65536+((Z&1023)<<10)|FA&1023}if(Z<=127){if(v>=J)break;m[v++]=Z}else if(Z<=2047){if(v+1>=J)break;m[v++]=192|Z>>6,m[v++]=128|Z&63}else if(Z<=65535){if(v+2>=J)break;m[v++]=224|Z>>12,m[v++]=128|Z>>6&63,m[v++]=128|Z&63}else{if(v+3>=J)break;m[v++]=240|Z>>18,m[v++]=128|Z>>12&63,m[v++]=128|Z>>6&63,m[v++]=128|Z&63}}return m[v]=0,v-N};function Ve(Q,m,v){var p=v>0?v:DA(Q)+1,N=new Array(p),J=gt(Q,N,0,N.length);return m&&(N.length=J),N}var ZA=()=>{if(!kA.length){var Q=null;if(typeof window<"u"&&typeof window.prompt=="function"&&(Q=window.prompt("Input: "),Q!==null&&(Q+=` -`)),!Q)return null;kA=Ve(Q,!0)}return kA.shift()},rt={ttys:[],init(){},shutdown(){},register(Q,m){rt.ttys[Q]={input:[],output:[],ops:m},M.registerDevice(Q,rt.stream_ops)},stream_ops:{open(Q){var m=rt.ttys[Q.node.rdev];if(!m)throw new M.ErrnoError(43);Q.tty=m,Q.seekable=!1},close(Q){Q.tty.ops.fsync(Q.tty)},fsync(Q){Q.tty.ops.fsync(Q.tty)},read(Q,m,v,p,N){if(!Q.tty||!Q.tty.ops.get_char)throw new M.ErrnoError(60);for(var J=0,V=0;V0&&(d(bt(Q.output)),Q.output=[])},ioctl_tcgets(Q){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(Q,m,v){return 0},ioctl_tiocgwinsz(Q){return[24,80]}},default_tty1_ops:{put_char(Q,m){m===null||m===10?(B(bt(Q.output)),Q.output=[]):m!=0&&Q.output.push(m)},fsync(Q){Q.output&&Q.output.length>0&&(B(bt(Q.output)),Q.output=[])}}},Ei=(Q,m)=>{w.fill(0,Q,Q+m)},tn=(Q,m)=>Math.ceil(Q/m)*m,qi=Q=>{Q=tn(Q,65536);var m=vi(65536,Q);return m&&Ei(m,Q),m},xe={ops_table:null,mount(Q){return xe.createNode(null,"/",16895,0)},createNode(Q,m,v,p){if(M.isBlkdev(v)||M.isFIFO(v))throw new M.ErrnoError(63);xe.ops_table||={dir:{node:{getattr:xe.node_ops.getattr,setattr:xe.node_ops.setattr,lookup:xe.node_ops.lookup,mknod:xe.node_ops.mknod,rename:xe.node_ops.rename,unlink:xe.node_ops.unlink,rmdir:xe.node_ops.rmdir,readdir:xe.node_ops.readdir,symlink:xe.node_ops.symlink},stream:{llseek:xe.stream_ops.llseek}},file:{node:{getattr:xe.node_ops.getattr,setattr:xe.node_ops.setattr},stream:{llseek:xe.stream_ops.llseek,read:xe.stream_ops.read,write:xe.stream_ops.write,allocate:xe.stream_ops.allocate,mmap:xe.stream_ops.mmap,msync:xe.stream_ops.msync}},link:{node:{getattr:xe.node_ops.getattr,setattr:xe.node_ops.setattr,readlink:xe.node_ops.readlink},stream:{}},chrdev:{node:{getattr:xe.node_ops.getattr,setattr:xe.node_ops.setattr},stream:M.chrdev_stream_ops}};var N=M.createNode(Q,m,v,p);return M.isDir(N.mode)?(N.node_ops=xe.ops_table.dir.node,N.stream_ops=xe.ops_table.dir.stream,N.contents={}):M.isFile(N.mode)?(N.node_ops=xe.ops_table.file.node,N.stream_ops=xe.ops_table.file.stream,N.usedBytes=0,N.contents=null):M.isLink(N.mode)?(N.node_ops=xe.ops_table.link.node,N.stream_ops=xe.ops_table.link.stream):M.isChrdev(N.mode)&&(N.node_ops=xe.ops_table.chrdev.node,N.stream_ops=xe.ops_table.chrdev.stream),N.timestamp=Date.now(),Q&&(Q.contents[m]=N,Q.timestamp=N.timestamp),N},getFileDataAsTypedArray(Q){return Q.contents?Q.contents.subarray?Q.contents.subarray(0,Q.usedBytes):new Uint8Array(Q.contents):new Uint8Array(0)},expandFileStorage(Q,m){var v=Q.contents?Q.contents.length:0;if(!(v>=m)){var p=1024*1024;m=Math.max(m,v*(v>>0),v!=0&&(m=Math.max(m,256));var N=Q.contents;Q.contents=new Uint8Array(m),Q.usedBytes>0&&Q.contents.set(N.subarray(0,Q.usedBytes),0)}},resizeFileStorage(Q,m){if(Q.usedBytes!=m)if(m==0)Q.contents=null,Q.usedBytes=0;else{var v=Q.contents;Q.contents=new Uint8Array(m),v&&Q.contents.set(v.subarray(0,Math.min(m,Q.usedBytes))),Q.usedBytes=m}},node_ops:{getattr(Q){var m={};return m.dev=M.isChrdev(Q.mode)?Q.id:1,m.ino=Q.id,m.mode=Q.mode,m.nlink=1,m.uid=0,m.gid=0,m.rdev=Q.rdev,M.isDir(Q.mode)?m.size=4096:M.isFile(Q.mode)?m.size=Q.usedBytes:M.isLink(Q.mode)?m.size=Q.link.length:m.size=0,m.atime=new Date(Q.timestamp),m.mtime=new Date(Q.timestamp),m.ctime=new Date(Q.timestamp),m.blksize=4096,m.blocks=Math.ceil(m.size/m.blksize),m},setattr(Q,m){m.mode!==void 0&&(Q.mode=m.mode),m.timestamp!==void 0&&(Q.timestamp=m.timestamp),m.size!==void 0&&xe.resizeFileStorage(Q,m.size)},lookup(Q,m){throw M.genericErrors[44]},mknod(Q,m,v,p){return xe.createNode(Q,m,v,p)},rename(Q,m,v){if(M.isDir(Q.mode)){var p;try{p=M.lookupNode(m,v)}catch{}if(p)for(var N in p.contents)throw new M.ErrnoError(55)}delete Q.parent.contents[Q.name],Q.parent.timestamp=Date.now(),Q.name=v,m.contents[v]=Q,m.timestamp=Q.parent.timestamp},unlink(Q,m){delete Q.contents[m],Q.timestamp=Date.now()},rmdir(Q,m){var v=M.lookupNode(Q,m);for(var p in v.contents)throw new M.ErrnoError(55);delete Q.contents[m],Q.timestamp=Date.now()},readdir(Q){var m=[".",".."];for(var v of Object.keys(Q.contents))m.push(v);return m},symlink(Q,m,v){var p=xe.createNode(Q,m,41471,0);return p.link=v,p},readlink(Q){if(!M.isLink(Q.mode))throw new M.ErrnoError(28);return Q.link}},stream_ops:{read(Q,m,v,p,N){var J=Q.node.contents;if(N>=Q.node.usedBytes)return 0;var V=Math.min(Q.node.usedBytes-N,p);if(V>8&&J.subarray)m.set(J.subarray(N,N+V),v);else for(var Z=0;Z0||v+m{var N=p?"":`al ${Q}`;I(Q).then(J=>{m(new Uint8Array(J)),N&&CA()},J=>{if(v)v();else throw`Loading data file "${Q}" failed.`}),N&&KA()},mi=(Q,m,v,p,N,J)=>{M.createDataFile(Q,m,v,p,N,J)},Ot=[],Lt=(Q,m,v,p)=>{typeof Browser<"u"&&Browser.init();var N=!1;return Ot.forEach(J=>{N||J.canHandle(m)&&(J.handle(Q,m,v,p),N=!0)}),N},ii=(Q,m,v,p,N,J,V,Z,FA,te)=>{var re=m?Ee.resolve(X.join2(Q,m)):Q;function Pe(ze){function ye(Ge){te?.(),Z||mi(Q,m,Ge,p,N,FA),J?.(),CA()}Lt(ze,re,ye,()=>{V?.(),CA()})||ye(ze)}KA(),typeof v=="string"?nn(v,Pe,V):Pe(v)},_i=Q=>{var m={r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},v=m[Q];if(typeof v>"u")throw new Error(`Unknown file open mode: ${Q}`);return v},Tt=(Q,m)=>{var v=0;return Q&&(v|=365),m&&(v|=146),v},M={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,ErrnoError:class{constructor(Q){this.name="ErrnoError",this.errno=Q}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(Q){this.node=Q}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(Q){this.shared.flags=Q}get position(){return this.shared.position}set position(Q){this.shared.position=Q}},FSNode:class{constructor(Q,m,v,p){Q||(Q=this),this.parent=Q,this.mount=Q.mount,this.mounted=null,this.id=M.nextInode++,this.name=m,this.mode=v,this.node_ops={},this.stream_ops={},this.rdev=p,this.readMode=365,this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(Q){Q?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(Q){Q?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return M.isDir(this.mode)}get isDevice(){return M.isChrdev(this.mode)}},lookupPath(Q,m={}){if(Q=Ee.resolve(Q),!Q)return{path:"",node:null};var v={follow_mount:!0,recurse_count:0};if(m=Object.assign(v,m),m.recurse_count>8)throw new M.ErrnoError(32);for(var p=Q.split("/").filter(Pe=>!!Pe),N=M.root,J="/",V=0;V40)throw new M.ErrnoError(32)}}return{path:J,node:N}},getPath(Q){for(var m;;){if(M.isRoot(Q)){var v=Q.mount.mountpoint;return m?v[v.length-1]!=="/"?`${v}/${m}`:v+m:v}m=m?`${Q.name}/${m}`:Q.name,Q=Q.parent}},hashName(Q,m){for(var v=0,p=0;p>>0)%M.nameTable.length},hashAddNode(Q){var m=M.hashName(Q.parent.id,Q.name);Q.name_next=M.nameTable[m],M.nameTable[m]=Q},hashRemoveNode(Q){var m=M.hashName(Q.parent.id,Q.name);if(M.nameTable[m]===Q)M.nameTable[m]=Q.name_next;else for(var v=M.nameTable[m];v;){if(v.name_next===Q){v.name_next=Q.name_next;break}v=v.name_next}},lookupNode(Q,m){var v=M.mayLookup(Q);if(v)throw new M.ErrnoError(v);for(var p=M.hashName(Q.id,m),N=M.nameTable[p];N;N=N.name_next){var J=N.name;if(N.parent.id===Q.id&&J===m)return N}return M.lookup(Q,m)},createNode(Q,m,v,p){var N=new M.FSNode(Q,m,v,p);return M.hashAddNode(N),N},destroyNode(Q){M.hashRemoveNode(Q)},isRoot(Q){return Q===Q.parent},isMountpoint(Q){return!!Q.mounted},isFile(Q){return(Q&61440)===32768},isDir(Q){return(Q&61440)===16384},isLink(Q){return(Q&61440)===40960},isChrdev(Q){return(Q&61440)===8192},isBlkdev(Q){return(Q&61440)===24576},isFIFO(Q){return(Q&61440)===4096},isSocket(Q){return(Q&49152)===49152},flagsToPermissionString(Q){var m=["r","w","rw"][Q&3];return Q&512&&(m+="w"),m},nodePermissions(Q,m){return M.ignorePermissions?0:m.includes("r")&&!(Q.mode&292)||m.includes("w")&&!(Q.mode&146)||m.includes("x")&&!(Q.mode&73)?2:0},mayLookup(Q){if(!M.isDir(Q.mode))return 54;var m=M.nodePermissions(Q,"x");return m||(Q.node_ops.lookup?0:2)},mayCreate(Q,m){try{var v=M.lookupNode(Q,m);return 20}catch{}return M.nodePermissions(Q,"wx")},mayDelete(Q,m,v){var p;try{p=M.lookupNode(Q,m)}catch(J){return J.errno}var N=M.nodePermissions(Q,"wx");if(N)return N;if(v){if(!M.isDir(p.mode))return 54;if(M.isRoot(p)||M.getPath(p)===M.cwd())return 10}else if(M.isDir(p.mode))return 31;return 0},mayOpen(Q,m){return Q?M.isLink(Q.mode)?32:M.isDir(Q.mode)&&(M.flagsToPermissionString(m)!=="r"||m&512)?31:M.nodePermissions(Q,M.flagsToPermissionString(m)):44},MAX_OPEN_FDS:4096,nextfd(){for(var Q=0;Q<=M.MAX_OPEN_FDS;Q++)if(!M.streams[Q])return Q;throw new M.ErrnoError(33)},getStreamChecked(Q){var m=M.getStream(Q);if(!m)throw new M.ErrnoError(8);return m},getStream:Q=>M.streams[Q],createStream(Q,m=-1){return Q=Object.assign(new M.FSStream,Q),m==-1&&(m=M.nextfd()),Q.fd=m,M.streams[m]=Q,Q},closeStream(Q){M.streams[Q]=null},dupStream(Q,m=-1){var v=M.createStream(Q,m);return v.stream_ops?.dup?.(v),v},chrdev_stream_ops:{open(Q){var m=M.getDevice(Q.node.rdev);Q.stream_ops=m.stream_ops,Q.stream_ops.open?.(Q)},llseek(){throw new M.ErrnoError(70)}},major:Q=>Q>>8,minor:Q=>Q&255,makedev:(Q,m)=>Q<<8|m,registerDevice(Q,m){M.devices[Q]={stream_ops:m}},getDevice:Q=>M.devices[Q],getMounts(Q){for(var m=[],v=[Q];v.length;){var p=v.pop();m.push(p),v.push(...p.mounts)}return m},syncfs(Q,m){typeof Q=="function"&&(m=Q,Q=!1),M.syncFSRequests++,M.syncFSRequests>1&&B(`warning: ${M.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`);var v=M.getMounts(M.root.mount),p=0;function N(V){return M.syncFSRequests--,m(V)}function J(V){if(V)return J.errored?void 0:(J.errored=!0,N(V));++p>=v.length&&N(null)}v.forEach(V=>{if(!V.type.syncfs)return J(null);V.type.syncfs(V,Q,J)})},mount(Q,m,v){var p=v==="/",N=!v,J;if(p&&M.root)throw new M.ErrnoError(10);if(!p&&!N){var V=M.lookupPath(v,{follow_mount:!1});if(v=V.path,J=V.node,M.isMountpoint(J))throw new M.ErrnoError(10);if(!M.isDir(J.mode))throw new M.ErrnoError(54)}var Z={type:Q,opts:m,mountpoint:v,mounts:[]},FA=Q.mount(Z);return FA.mount=Z,Z.root=FA,p?M.root=FA:J&&(J.mounted=Z,J.mount&&J.mount.mounts.push(Z)),FA},unmount(Q){var m=M.lookupPath(Q,{follow_mount:!1});if(!M.isMountpoint(m.node))throw new M.ErrnoError(28);var v=m.node,p=v.mounted,N=M.getMounts(p);Object.keys(M.nameTable).forEach(V=>{for(var Z=M.nameTable[V];Z;){var FA=Z.name_next;N.includes(Z.mount)&&M.destroyNode(Z),Z=FA}}),v.mounted=null;var J=v.mount.mounts.indexOf(p);v.mount.mounts.splice(J,1)},lookup(Q,m){return Q.node_ops.lookup(Q,m)},mknod(Q,m,v){var p=M.lookupPath(Q,{parent:!0}),N=p.node,J=X.basename(Q);if(!J||J==="."||J==="..")throw new M.ErrnoError(28);var V=M.mayCreate(N,J);if(V)throw new M.ErrnoError(V);if(!N.node_ops.mknod)throw new M.ErrnoError(63);return N.node_ops.mknod(N,J,m,v)},create(Q,m){return m=m!==void 0?m:438,m&=4095,m|=32768,M.mknod(Q,m,0)},mkdir(Q,m){return m=m!==void 0?m:511,m&=1023,m|=16384,M.mknod(Q,m,0)},mkdirTree(Q,m){for(var v=Q.split("/"),p="",N=0;N"u"&&(v=m,m=438),m|=8192,M.mknod(Q,m,v)},symlink(Q,m){if(!Ee.resolve(Q))throw new M.ErrnoError(44);var v=M.lookupPath(m,{parent:!0}),p=v.node;if(!p)throw new M.ErrnoError(44);var N=X.basename(m),J=M.mayCreate(p,N);if(J)throw new M.ErrnoError(J);if(!p.node_ops.symlink)throw new M.ErrnoError(63);return p.node_ops.symlink(p,N,Q)},rename(Q,m){var v=X.dirname(Q),p=X.dirname(m),N=X.basename(Q),J=X.basename(m),V,Z,FA;if(V=M.lookupPath(Q,{parent:!0}),Z=V.node,V=M.lookupPath(m,{parent:!0}),FA=V.node,!Z||!FA)throw new M.ErrnoError(44);if(Z.mount!==FA.mount)throw new M.ErrnoError(75);var te=M.lookupNode(Z,N),re=Ee.relative(Q,p);if(re.charAt(0)!==".")throw new M.ErrnoError(28);if(re=Ee.relative(m,v),re.charAt(0)!==".")throw new M.ErrnoError(55);var Pe;try{Pe=M.lookupNode(FA,J)}catch{}if(te!==Pe){var ze=M.isDir(te.mode),ye=M.mayDelete(Z,N,ze);if(ye)throw new M.ErrnoError(ye);if(ye=Pe?M.mayDelete(FA,J,ze):M.mayCreate(FA,J),ye)throw new M.ErrnoError(ye);if(!Z.node_ops.rename)throw new M.ErrnoError(63);if(M.isMountpoint(te)||Pe&&M.isMountpoint(Pe))throw new M.ErrnoError(10);if(FA!==Z&&(ye=M.nodePermissions(Z,"w"),ye))throw new M.ErrnoError(ye);M.hashRemoveNode(te);try{Z.node_ops.rename(te,FA,J),te.parent=FA}catch(Ge){throw Ge}finally{M.hashAddNode(te)}}},rmdir(Q){var m=M.lookupPath(Q,{parent:!0}),v=m.node,p=X.basename(Q),N=M.lookupNode(v,p),J=M.mayDelete(v,p,!0);if(J)throw new M.ErrnoError(J);if(!v.node_ops.rmdir)throw new M.ErrnoError(63);if(M.isMountpoint(N))throw new M.ErrnoError(10);v.node_ops.rmdir(v,p),M.destroyNode(N)},readdir(Q){var m=M.lookupPath(Q,{follow:!0}),v=m.node;if(!v.node_ops.readdir)throw new M.ErrnoError(54);return v.node_ops.readdir(v)},unlink(Q){var m=M.lookupPath(Q,{parent:!0}),v=m.node;if(!v)throw new M.ErrnoError(44);var p=X.basename(Q),N=M.lookupNode(v,p),J=M.mayDelete(v,p,!1);if(J)throw new M.ErrnoError(J);if(!v.node_ops.unlink)throw new M.ErrnoError(63);if(M.isMountpoint(N))throw new M.ErrnoError(10);v.node_ops.unlink(v,p),M.destroyNode(N)},readlink(Q){var m=M.lookupPath(Q),v=m.node;if(!v)throw new M.ErrnoError(44);if(!v.node_ops.readlink)throw new M.ErrnoError(28);return Ee.resolve(M.getPath(v.parent),v.node_ops.readlink(v))},stat(Q,m){var v=M.lookupPath(Q,{follow:!m}),p=v.node;if(!p)throw new M.ErrnoError(44);if(!p.node_ops.getattr)throw new M.ErrnoError(63);return p.node_ops.getattr(p)},lstat(Q){return M.stat(Q,!0)},chmod(Q,m,v){var p;if(typeof Q=="string"){var N=M.lookupPath(Q,{follow:!v});p=N.node}else p=Q;if(!p.node_ops.setattr)throw new M.ErrnoError(63);p.node_ops.setattr(p,{mode:m&4095|p.mode&-4096,timestamp:Date.now()})},lchmod(Q,m){M.chmod(Q,m,!0)},fchmod(Q,m){var v=M.getStreamChecked(Q);M.chmod(v.node,m)},chown(Q,m,v,p){var N;if(typeof Q=="string"){var J=M.lookupPath(Q,{follow:!p});N=J.node}else N=Q;if(!N.node_ops.setattr)throw new M.ErrnoError(63);N.node_ops.setattr(N,{timestamp:Date.now()})},lchown(Q,m,v){M.chown(Q,m,v,!0)},fchown(Q,m,v){var p=M.getStreamChecked(Q);M.chown(p.node,m,v)},truncate(Q,m){if(m<0)throw new M.ErrnoError(28);var v;if(typeof Q=="string"){var p=M.lookupPath(Q,{follow:!0});v=p.node}else v=Q;if(!v.node_ops.setattr)throw new M.ErrnoError(63);if(M.isDir(v.mode))throw new M.ErrnoError(31);if(!M.isFile(v.mode))throw new M.ErrnoError(28);var N=M.nodePermissions(v,"w");if(N)throw new M.ErrnoError(N);v.node_ops.setattr(v,{size:m,timestamp:Date.now()})},ftruncate(Q,m){var v=M.getStreamChecked(Q);if((v.flags&2097155)===0)throw new M.ErrnoError(28);M.truncate(v.node,m)},utime(Q,m,v){var p=M.lookupPath(Q,{follow:!0}),N=p.node;N.node_ops.setattr(N,{timestamp:Math.max(m,v)})},open(Q,m,v){if(Q==="")throw new M.ErrnoError(44);m=typeof m=="string"?_i(m):m,m&64?(v=typeof v>"u"?438:v,v=v&4095|32768):v=0;var p;if(typeof Q=="object")p=Q;else{Q=X.normalize(Q);try{var N=M.lookupPath(Q,{follow:!(m&131072)});p=N.node}catch{}}var J=!1;if(m&64)if(p){if(m&128)throw new M.ErrnoError(20)}else p=M.mknod(Q,v,0),J=!0;if(!p)throw new M.ErrnoError(44);if(M.isChrdev(p.mode)&&(m&=-513),m&65536&&!M.isDir(p.mode))throw new M.ErrnoError(54);if(!J){var V=M.mayOpen(p,m);if(V)throw new M.ErrnoError(V)}m&512&&!J&&M.truncate(p,0),m&=-131713;var Z=M.createStream({node:p,path:M.getPath(p),flags:m,seekable:!0,position:0,stream_ops:p.stream_ops,ungotten:[],error:!1});return Z.stream_ops.open&&Z.stream_ops.open(Z),Z},close(Q){if(M.isClosed(Q))throw new M.ErrnoError(8);Q.getdents&&(Q.getdents=null);try{Q.stream_ops.close&&Q.stream_ops.close(Q)}catch(m){throw m}finally{M.closeStream(Q.fd)}Q.fd=null},isClosed(Q){return Q.fd===null},llseek(Q,m,v){if(M.isClosed(Q))throw new M.ErrnoError(8);if(!Q.seekable||!Q.stream_ops.llseek)throw new M.ErrnoError(70);if(v!=0&&v!=1&&v!=2)throw new M.ErrnoError(28);return Q.position=Q.stream_ops.llseek(Q,m,v),Q.ungotten=[],Q.position},read(Q,m,v,p,N){if(p<0||N<0)throw new M.ErrnoError(28);if(M.isClosed(Q))throw new M.ErrnoError(8);if((Q.flags&2097155)===1)throw new M.ErrnoError(8);if(M.isDir(Q.node.mode))throw new M.ErrnoError(31);if(!Q.stream_ops.read)throw new M.ErrnoError(28);var J=typeof N<"u";if(!J)N=Q.position;else if(!Q.seekable)throw new M.ErrnoError(70);var V=Q.stream_ops.read(Q,m,v,p,N);return J||(Q.position+=V),V},write(Q,m,v,p,N,J){if(p<0||N<0)throw new M.ErrnoError(28);if(M.isClosed(Q))throw new M.ErrnoError(8);if((Q.flags&2097155)===0)throw new M.ErrnoError(8);if(M.isDir(Q.node.mode))throw new M.ErrnoError(31);if(!Q.stream_ops.write)throw new M.ErrnoError(28);Q.seekable&&Q.flags&1024&&M.llseek(Q,0,2);var V=typeof N<"u";if(!V)N=Q.position;else if(!Q.seekable)throw new M.ErrnoError(70);var Z=Q.stream_ops.write(Q,m,v,p,N,J);return V||(Q.position+=Z),Z},allocate(Q,m,v){if(M.isClosed(Q))throw new M.ErrnoError(8);if(m<0||v<=0)throw new M.ErrnoError(28);if((Q.flags&2097155)===0)throw new M.ErrnoError(8);if(!M.isFile(Q.node.mode)&&!M.isDir(Q.node.mode))throw new M.ErrnoError(43);if(!Q.stream_ops.allocate)throw new M.ErrnoError(138);Q.stream_ops.allocate(Q,m,v)},mmap(Q,m,v,p,N){if((p&2)!==0&&(N&2)===0&&(Q.flags&2097155)!==2)throw new M.ErrnoError(2);if((Q.flags&2097155)===1)throw new M.ErrnoError(2);if(!Q.stream_ops.mmap)throw new M.ErrnoError(43);if(!m)throw new M.ErrnoError(28);return Q.stream_ops.mmap(Q,m,v,p,N)},msync(Q,m,v,p,N){return Q.stream_ops.msync?Q.stream_ops.msync(Q,m,v,p,N):0},ioctl(Q,m,v){if(!Q.stream_ops.ioctl)throw new M.ErrnoError(59);return Q.stream_ops.ioctl(Q,m,v)},readFile(Q,m={}){if(m.flags=m.flags||0,m.encoding=m.encoding||"binary",m.encoding!=="utf8"&&m.encoding!=="binary")throw new Error(`Invalid encoding type "${m.encoding}"`);var v,p=M.open(Q,m.flags),N=M.stat(Q),J=N.size,V=new Uint8Array(J);return M.read(p,V,0,J,0),m.encoding==="utf8"?v=bt(V):m.encoding==="binary"&&(v=V),M.close(p),v},writeFile(Q,m,v={}){v.flags=v.flags||577;var p=M.open(Q,v.flags,v.mode);if(typeof m=="string"){var N=new Uint8Array(DA(m)+1),J=gt(m,N,0,N.length);M.write(p,N,0,J,void 0,v.canOwn)}else if(ArrayBuffer.isView(m))M.write(p,m,0,m.byteLength,void 0,v.canOwn);else throw new Error("Unsupported data type");M.close(p)},cwd:()=>M.currentPath,chdir(Q){var m=M.lookupPath(Q,{follow:!0});if(m.node===null)throw new M.ErrnoError(44);if(!M.isDir(m.node.mode))throw new M.ErrnoError(54);var v=M.nodePermissions(m.node,"x");if(v)throw new M.ErrnoError(v);M.currentPath=m.path},createDefaultDirectories(){M.mkdir("/tmp"),M.mkdir("/home"),M.mkdir("/home/web_user")},createDefaultDevices(){M.mkdir("/dev"),M.registerDevice(M.makedev(1,3),{read:()=>0,write:(p,N,J,V,Z)=>V}),M.mkdev("/dev/null",M.makedev(1,3)),rt.register(M.makedev(5,0),rt.default_tty_ops),rt.register(M.makedev(6,0),rt.default_tty1_ops),M.mkdev("/dev/tty",M.makedev(5,0)),M.mkdev("/dev/tty1",M.makedev(6,0));var Q=new Uint8Array(1024),m=0,v=()=>(m===0&&(m=Be(Q).byteLength),Q[--m]);M.createDevice("/dev","random",v),M.createDevice("/dev","urandom",v),M.mkdir("/dev/shm"),M.mkdir("/dev/shm/tmp")},createSpecialDirectories(){M.mkdir("/proc");var Q=M.mkdir("/proc/self");M.mkdir("/proc/self/fd"),M.mount({mount(){var m=M.createNode(Q,"fd",16895,73);return m.node_ops={lookup(v,p){var N=+p,J=M.getStreamChecked(N),V={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>J.path}};return V.parent=V,V}},m}},{},"/proc/self/fd")},createStandardStreams(Q,m,v){Q?M.createDevice("/dev","stdin",Q):M.symlink("/dev/tty","/dev/stdin"),m?M.createDevice("/dev","stdout",null,m):M.symlink("/dev/tty","/dev/stdout"),v?M.createDevice("/dev","stderr",null,v):M.symlink("/dev/tty1","/dev/stderr"),M.open("/dev/stdin",0),M.open("/dev/stdout",1),M.open("/dev/stderr",1)},staticInit(){[44].forEach(Q=>{M.genericErrors[Q]=new M.ErrnoError(Q),M.genericErrors[Q].stack=""}),M.nameTable=new Array(4096),M.mount(xe,{},"/"),M.createDefaultDirectories(),M.createDefaultDevices(),M.createSpecialDirectories(),M.filesystems={MEMFS:xe}},init(Q,m,v){M.initialized=!0,M.createStandardStreams(Q,m,v)},quit(){M.initialized=!1;for(var Q=0;Qthis.length-1||ye<0)){var Ge=ye%this.chunkSize,Vi=ye/this.chunkSize|0;return this.getter(Vi)[Ge]}}setDataGetter(ye){this.getter=ye}cacheLength(){var ye=new XMLHttpRequest;if(ye.open("HEAD",v,!1),ye.send(null),!(ye.status>=200&&ye.status<300||ye.status===304))throw new Error("Couldn't load "+v+". Status: "+ye.status);var Ge=Number(ye.getResponseHeader("Content-length")),Vi,T=(Vi=ye.getResponseHeader("Accept-Ranges"))&&Vi==="bytes",oA=(Vi=ye.getResponseHeader("Content-Encoding"))&&Vi==="gzip",YA=1024*1024;T||(YA=Ge);var pe=(ge,Bt)=>{if(ge>Bt)throw new Error("invalid range ("+ge+", "+Bt+") or no bytes requested!");if(Bt>Ge-1)throw new Error("only "+Ge+" bytes available! programmer error!");var $e=new XMLHttpRequest;if($e.open("GET",v,!1),Ge!==YA&&$e.setRequestHeader("Range","bytes="+ge+"-"+Bt),$e.responseType="arraybuffer",$e.overrideMimeType&&$e.overrideMimeType("text/plain; charset=x-user-defined"),$e.send(null),!($e.status>=200&&$e.status<300||$e.status===304))throw new Error("Couldn't load "+v+". Status: "+$e.status);return $e.response!==void 0?new Uint8Array($e.response||[]):Ve($e.responseText||"",!0)},he=this;he.setDataGetter(ge=>{var Bt=ge*YA,$e=(ge+1)*YA-1;if($e=Math.min($e,Ge-1),typeof he.chunks[ge]>"u"&&(he.chunks[ge]=pe(Bt,$e)),typeof he.chunks[ge]>"u")throw new Error("doXHR failed!");return he.chunks[ge]}),(oA||!Ge)&&(YA=Ge=1,Ge=this.getter(0).length,YA=Ge,d("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=Ge,this._chunkSize=YA,this.lengthKnown=!0}get length(){return this.lengthKnown||this.cacheLength(),this._length}get chunkSize(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}if(typeof XMLHttpRequest<"u"){throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var V,Z}else var Z={isDevice:!1,url:v};var FA=M.createFile(Q,m,Z,p,N);Z.contents?FA.contents=Z.contents:Z.url&&(FA.contents=null,FA.url=Z.url),Object.defineProperties(FA,{usedBytes:{get:function(){return this.contents.length}}});var te={},re=Object.keys(FA.stream_ops);re.forEach(ze=>{var ye=FA.stream_ops[ze];te[ze]=(...Ge)=>(M.forceLoadFile(FA),ye(...Ge))});function Pe(ze,ye,Ge,Vi,T){var oA=ze.node.contents;if(T>=oA.length)return 0;var YA=Math.min(oA.length-T,Vi);if(oA.slice)for(var pe=0;pe(M.forceLoadFile(FA),Pe(ze,ye,Ge,Vi,T)),te.mmap=(ze,ye,Ge,Vi,T)=>{M.forceLoadFile(FA);var oA=qi(ye);if(!oA)throw new M.ErrnoError(48);return Pe(ze,R,oA,ye,Ge),{ptr:oA,allocated:!0}},FA.stream_ops=te,FA}},We={DEFAULT_POLLMASK:5,calculateAt(Q,m,v){if(X.isAbs(m))return m;var p;if(Q===-100)p=M.cwd();else{var N=We.getStreamFromFD(Q);p=N.path}if(m.length==0){if(!v)throw new M.ErrnoError(44);return p}return X.join2(p,m)},doStat(Q,m,v){var p=Q(m);K[v>>2]=p.dev,K[v+4>>2]=p.mode,z[v+8>>2]=p.nlink,K[v+12>>2]=p.uid,K[v+16>>2]=p.gid,K[v+20>>2]=p.rdev,H[v+24>>3]=BigInt(p.size),K[v+32>>2]=4096,K[v+36>>2]=p.blocks;var N=p.atime.getTime(),J=p.mtime.getTime(),V=p.ctime.getTime();return H[v+40>>3]=BigInt(Math.floor(N/1e3)),z[v+48>>2]=N%1e3*1e3*1e3,H[v+56>>3]=BigInt(Math.floor(J/1e3)),z[v+64>>2]=J%1e3*1e3*1e3,H[v+72>>3]=BigInt(Math.floor(V/1e3)),z[v+80>>2]=V%1e3*1e3*1e3,H[v+88>>3]=BigInt(p.ino),0},doMsync(Q,m,v,p,N){if(!M.isFile(m.node.mode))throw new M.ErrnoError(43);if(p&2)return 0;var J=w.slice(Q,Q+v);M.msync(m,J,N,v,p)},getStreamFromFD(Q){var m=M.getStreamChecked(Q);return m},varargs:void 0,getStr(Q){var m=Re(Q);return m}};function ni(Q,m,v,p){try{if(m=We.getStr(m),m=We.calculateAt(Q,m),v&-8)return-28;var N=M.lookupPath(m,{follow:!0}),J=N.node;if(!J)return-44;var V="";return v&4&&(V+="r"),v&2&&(V+="w"),v&1&&(V+="x"),V&&M.nodePermissions(J,V)?-2:0}catch(Z){if(typeof M>"u"||Z.name!=="ErrnoError")throw Z;return-Z.errno}}function pi(){var Q=K[+We.varargs>>2];return We.varargs+=4,Q}var dn=pi;function mn(Q,m,v){We.varargs=v;try{var p=We.getStreamFromFD(Q);switch(m){case 0:{var N=pi();if(N<0)return-28;for(;M.streams[N];)N++;var J;return J=M.dupStream(p,N),J.fd}case 1:case 2:return 0;case 3:return p.flags;case 4:{var N=pi();return p.flags|=N,0}case 12:{var N=dn(),V=0;return _[N+V>>1]=2,0}case 13:case 14:return 0}return-28}catch(Z){if(typeof M>"u"||Z.name!=="ErrnoError")throw Z;return-Z.errno}}function Uo(Q,m){try{var v=We.getStreamFromFD(Q);return We.doStat(M.stat,v.path,m)}catch(p){if(typeof M>"u"||p.name!=="ErrnoError")throw p;return-p.errno}}function kn(Q,m,v){We.varargs=v;try{var p=We.getStreamFromFD(Q);switch(m){case 21509:return p.tty?0:-59;case 21505:{if(!p.tty)return-59;if(p.tty.ops.ioctl_tcgets){var N=p.tty.ops.ioctl_tcgets(p),J=dn();K[J>>2]=N.c_iflag||0,K[J+4>>2]=N.c_oflag||0,K[J+8>>2]=N.c_cflag||0,K[J+12>>2]=N.c_lflag||0;for(var V=0;V<32;V++)R[J+V+17]=N.c_cc[V]||0;return 0}return 0}case 21510:case 21511:case 21512:return p.tty?0:-59;case 21506:case 21507:case 21508:{if(!p.tty)return-59;if(p.tty.ops.ioctl_tcsets){for(var J=dn(),Z=K[J>>2],FA=K[J+4>>2],te=K[J+8>>2],re=K[J+12>>2],Pe=[],V=0;V<32;V++)Pe.push(R[J+V+17]);return p.tty.ops.ioctl_tcsets(p.tty,m,{c_iflag:Z,c_oflag:FA,c_cflag:te,c_lflag:re,c_cc:Pe})}return 0}case 21519:{if(!p.tty)return-59;var J=dn();return K[J>>2]=0,0}case 21520:return p.tty?-28:-59;case 21531:{var J=dn();return M.ioctl(p,m,J)}case 21523:{if(!p.tty)return-59;if(p.tty.ops.ioctl_tiocgwinsz){var ze=p.tty.ops.ioctl_tiocgwinsz(p.tty),J=dn();_[J>>1]=ze[0],_[J+2>>1]=ze[1]}return 0}case 21524:return p.tty?0:-59;case 21515:return p.tty?0:-59;default:return-28}}catch(ye){if(typeof M>"u"||ye.name!=="ErrnoError")throw ye;return-ye.errno}}function Wn(Q,m,v,p){try{m=We.getStr(m);var N=p&256,J=p&4096;return p=p&-6401,m=We.calculateAt(Q,m,J),We.doStat(N?M.lstat:M.stat,m,v)}catch(V){if(typeof M>"u"||V.name!=="ErrnoError")throw V;return-V.errno}}function Vo(Q,m,v,p){We.varargs=p;try{m=We.getStr(m),m=We.calculateAt(Q,m);var N=p?pi():0;return M.open(m,v,N).fd}catch(J){if(typeof M>"u"||J.name!=="ErrnoError")throw J;return-J.errno}}function vo(Q,m){try{return Q=We.getStr(Q),We.doStat(M.stat,Q,m)}catch(v){if(typeof M>"u"||v.name!=="ErrnoError")throw v;return-v.errno}}var bo=()=>{TA("")},Yn=Q=>Q%4===0&&(Q%100!==0||Q%400===0),Mo=[0,31,60,91,121,152,182,213,244,274,305,335],ne=[0,31,59,90,120,151,181,212,243,273,304,334],wi=Q=>{var m=Yn(Q.getFullYear()),v=m?Mo:ne,p=v[Q.getMonth()]+Q.getDate()-1;return p},MA=9007199254740992,me=-9007199254740992,nt=Q=>QMA?NaN:Number(Q);function Wt(Q,m){Q=nt(Q);var v=new Date(Q*1e3);K[m>>2]=v.getSeconds(),K[m+4>>2]=v.getMinutes(),K[m+8>>2]=v.getHours(),K[m+12>>2]=v.getDate(),K[m+16>>2]=v.getMonth(),K[m+20>>2]=v.getFullYear()-1900,K[m+24>>2]=v.getDay();var p=wi(v)|0;K[m+28>>2]=p,K[m+36>>2]=-(v.getTimezoneOffset()*60);var N=new Date(v.getFullYear(),0,1),J=new Date(v.getFullYear(),6,1).getTimezoneOffset(),V=N.getTimezoneOffset(),Z=(J!=V&&v.getTimezoneOffset()==Math.min(V,J))|0;K[m+32>>2]=Z}function Xe(Q,m,v,p,N,J,V){N=nt(N);try{if(isNaN(N))return 61;var Z=We.getStreamFromFD(p),FA=M.mmap(Z,Q,N,m,v),te=FA.ptr;return K[J>>2]=FA.allocated,z[V>>2]=te,0}catch(re){if(typeof M>"u"||re.name!=="ErrnoError")throw re;return-re.errno}}function oi(Q,m,v,p,N,J){J=nt(J);try{var V=We.getStreamFromFD(N);v&2&&We.doMsync(Q,V,m,p,J)}catch(Z){if(typeof M>"u"||Z.name!=="ErrnoError")throw Z;return-Z.errno}}var Di=(Q,m,v)=>gt(Q,w,m,v),Ut=(Q,m,v,p)=>{var N=new Date().getFullYear(),J=new Date(N,0,1),V=new Date(N,6,1),Z=J.getTimezoneOffset(),FA=V.getTimezoneOffset(),te=Math.max(Z,FA);z[Q>>2]=te*60,K[m>>2]=+(Z!=FA);var re=ye=>{var Ge=ye>=0?"-":"+",Vi=Math.abs(ye),T=String(Math.floor(Vi/60)).padStart(2,"0"),oA=String(Vi%60).padStart(2,"0");return`UTC${Ge}${T}${oA}`},Pe=re(Z),ze=re(FA);FADate.now(),ft=()=>2147483648,Qi=Q=>{var m=D.buffer,v=(Q-m.byteLength+65535)/65536|0;try{return D.grow(v),j(),1}catch{}},ot=Q=>{var m=w.length;Q>>>=0;var v=ft();if(Q>v)return!1;for(var p=1;p<=4;p*=2){var N=m*(1+.2/p);N=Math.min(N,Q+100663296);var J=Math.min(v,tn(Math.max(Q,N),65536)),V=Qi(J);if(V)return!0}return!1},Mt={},on=()=>a,hn=()=>{if(!hn.strings){var Q=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",m={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:Q,_:on()};for(var v in Mt)Mt[v]===void 0?delete m[v]:m[v]=Mt[v];var p=[];for(var v in m)p.push(`${v}=${m[v]}`);hn.strings=p}return hn.strings},Ai=(Q,m)=>{for(var v=0;v{var v=0;return hn().forEach((p,N)=>{var J=m+v;z[Q+N*4>>2]=J,Ai(p,J),v+=p.length+1}),0},dt=(Q,m)=>{var v=hn();z[Q>>2]=v.length;var p=0;return v.forEach(N=>p+=N.length+1),z[m>>2]=p,0},EA=Q=>{c(Q,new xt(Q))},HA=(Q,m)=>{EA(Q)},ve=HA;function Qt(Q){try{var m=We.getStreamFromFD(Q);return M.close(m),0}catch(v){if(typeof M>"u"||v.name!=="ErrnoError")throw v;return v.errno}}var yi=(Q,m,v,p)=>{for(var N=0,J=0;J>2],Z=z[m+4>>2];m+=8;var FA=M.read(Q,R,V,Z,p);if(FA<0)return-1;if(N+=FA,FA>2]=J,0}catch(V){if(typeof M>"u"||V.name!=="ErrnoError")throw V;return V.errno}}function pn(Q,m,v,p){m=nt(m);try{if(isNaN(m))return 61;var N=We.getStreamFromFD(Q);return M.llseek(N,m,v),H[p>>3]=BigInt(N.position),N.getdents&&m===0&&v===0&&(N.getdents=null),0}catch(J){if(typeof M>"u"||J.name!=="ErrnoError")throw J;return J.errno}}var Fn=(Q,m,v,p)=>{for(var N=0,J=0;J>2],Z=z[m+4>>2];m+=8;var FA=M.write(Q,R,V,Z,p);if(FA<0)return-1;if(N+=FA,FA>2]=J,0}catch(V){if(typeof M>"u"||V.name!=="ErrnoError")throw V;return V.errno}}var ln=Q=>{var m=i["_"+Q];return m},Pt=(Q,m)=>{R.set(Q,m)},$i=Q=>rn(Q),Rr=Q=>{var m=DA(Q)+1,v=$i(m);return Di(Q,v,m),v},Ft=(Q,m,v,p,N)=>{var J={string:Ge=>{var Vi=0;return Ge!=null&&Ge!==0&&(Vi=Rr(Ge)),Vi},array:Ge=>{var Vi=$i(Ge.length);return Pt(Ge,Vi),Vi}};function V(Ge){return m==="string"?Re(Ge):m==="boolean"?!!Ge:Ge}var Z=ln(Q),FA=[],te=0;if(p)for(var re=0;re(i._viz_set_y_invert=se.A)(Q),i._viz_set_reduce=Q=>(i._viz_set_reduce=se.B)(Q),i._viz_get_graphviz_version=()=>(i._viz_get_graphviz_version=se.C)(),i._free=Q=>(i._free=se.D)(Q),i._malloc=Q=>(i._malloc=se.E)(Q),i._viz_get_plugin_list=Q=>(i._viz_get_plugin_list=se.G)(Q),i._viz_create_graph=(Q,m,v)=>(i._viz_create_graph=se.H)(Q,m,v),i._viz_read_one_graph=Q=>(i._viz_read_one_graph=se.I)(Q),i._viz_string_dup=(Q,m)=>(i._viz_string_dup=se.J)(Q,m),i._viz_string_dup_html=(Q,m)=>(i._viz_string_dup_html=se.K)(Q,m),i._viz_string_free=(Q,m)=>(i._viz_string_free=se.L)(Q,m),i._viz_string_free_html=(Q,m)=>(i._viz_string_free_html=se.M)(Q,m),i._viz_add_node=(Q,m)=>(i._viz_add_node=se.N)(Q,m),i._viz_add_edge=(Q,m,v)=>(i._viz_add_edge=se.O)(Q,m,v),i._viz_add_subgraph=(Q,m)=>(i._viz_add_subgraph=se.P)(Q,m),i._viz_set_default_graph_attribute=(Q,m,v)=>(i._viz_set_default_graph_attribute=se.Q)(Q,m,v),i._viz_set_default_node_attribute=(Q,m,v)=>(i._viz_set_default_node_attribute=se.R)(Q,m,v),i._viz_set_default_edge_attribute=(Q,m,v)=>(i._viz_set_default_edge_attribute=se.S)(Q,m,v),i._viz_set_attribute=(Q,m,v)=>(i._viz_set_attribute=se.T)(Q,m,v),i._viz_free_graph=Q=>(i._viz_free_graph=se.U)(Q),i._viz_create_context=()=>(i._viz_create_context=se.V)(),i._viz_free_context=Q=>(i._viz_free_context=se.W)(Q),i._viz_layout=(Q,m,v)=>(i._viz_layout=se.X)(Q,m,v),i._viz_free_layout=(Q,m)=>(i._viz_free_layout=se.Y)(Q,m),i._viz_reset_errors=()=>(i._viz_reset_errors=se.Z)(),i._viz_render=(Q,m,v)=>(i._viz_render=se._)(Q,m,v);var vi=(Q,m)=>(vi=se.$)(Q,m),Yi=Q=>(Yi=se.aa)(Q),rn=Q=>(rn=se.ba)(Q),Hr=()=>(Hr=se.ca)();i.ccall=Ft,i.getValue=de,i.PATH=X,i.UTF8ToString=Re,i.stringToUTF8=Di,i.lengthBytesUTF8=DA,i.FS=M;var Ri,fs;VA=function Q(){Ri||Bo(),Ri||(VA=Q)};function Bo(){if(pA>0||!fs&&(fs=1,lA(),pA>0))return;function Q(){Ri||(Ri=1,i.calledRun=1,!L&&(vA(),n(i),tA()))}Q()}return Bo(),A=r,A}})(),KP=[[/^Error: (.*)/,"error"],[/^Warning: (.*)/,"warning"]];function M3A(t){return t.map(e=>{for(let A=0;A{if(typeof A.name!="string")throw new Error("image name must be a string");if(typeof A.width!="number"&&typeof A.width!="string")throw new Error("image width must be a number or string");if(typeof A.height!="number"&&typeof A.height!="string")throw new Error("image height must be a number or string");let i=t.PATH.join("/",A.name),n=` - -`;return t.FS.createPath("/",t.PATH.dirname(i)),t.FS.writeFile(i,n),i}):[]}function x3A(t,e){for(let A of e)t.FS.analyzePath(A).exists&&t.FS.unlink(A)}function L3A(t,e,A){let i;try{let n=t.lengthBytesUTF8(e);return i=t.ccall("malloc","number",["number"],[n+1]),t.stringToUTF8(e,i,n+1),t.ccall("viz_read_one_graph","number",["number"],[i])}finally{i&&t.ccall("free","number",["number"],[i])}}function F3A(t,e,A){let i=t.ccall("viz_create_graph","number",["string","number","number"],[e.name,typeof e.directed<"u"?e.directed:!0,typeof e.strict<"u"?e.strict:!1]);return HP(t,i,e),i}function HP(t,e,A){zP(t,e,A),A.nodes&&A.nodes.forEach(i=>{let n=t.ccall("viz_add_node","number",["number","string"],[e,String(i.name)]);i.attributes&&TP(t,e,n,i.attributes)}),A.edges&&A.edges.forEach(i=>{let n=t.ccall("viz_add_edge","number",["number","string","string"],[e,String(i.tail),String(i.head)]);i.attributes&&TP(t,e,n,i.attributes)}),A.subgraphs&&A.subgraphs.forEach(i=>{let n=t.ccall("viz_add_subgraph","number",["number","string"],[e,String(i.name)]);HP(t,n,i)})}function zP(t,e,A){if(A.graphAttributes)for(let[i,n]of Object.entries(A.graphAttributes))m8(t,e,n,o=>{t.ccall("viz_set_default_graph_attribute","number",["number","string","number"],[e,i,o])});if(A.nodeAttributes)for(let[i,n]of Object.entries(A.nodeAttributes))m8(t,e,n,o=>{t.ccall("viz_set_default_node_attribute","number",["number","string","number"],[e,i,o])});if(A.edgeAttributes)for(let[i,n]of Object.entries(A.edgeAttributes))m8(t,e,n,o=>{t.ccall("viz_set_default_edge_attribute","number",["number","string","number"],[e,i,o])})}function TP(t,e,A,i){for(let[n,o]of Object.entries(i))m8(t,e,o,r=>{t.ccall("viz_set_attribute","number",["number","string","number"],[A,n,r])})}function m8(t,e,A,i){let n;if(typeof A=="object"&&"html"in A?n=t.ccall("viz_string_dup_html","number",["number","string"],[e,String(A.html)]):n=t.ccall("viz_string_dup","number",["number","string"],[e,String(A)]),n==0)throw new Error("couldn't dup string");i(n),typeof A=="object"&&"html"in A?t.ccall("viz_string_free_html","number",["number","number"],[e,n]):t.ccall("viz_string_free","number",["number","number"],[e,n])}var Pk=class{constructor(e){this.module=e}get graphvizVersion(){return S3A(this.module)}get formats(){return YP(this.module,"device")}get engines(){return YP(this.module,"layout")}renderFormats(e,A,i={}){return JP(this.module,e,A,rA({engine:"dot"},i))}render(e,A={}){let i;A.format===void 0?i="dot":i=A.format;let n=JP(this.module,e,[i],rA({engine:"dot"},A));return n.status==="success"&&(n.output=n.output[i]),n}renderString(e,A={}){let i=this.render(e,A);if(i.status!=="success")throw new Error(i.errors.find(n=>n.level=="error")?.message||"render failed");return i.output}renderSVGElement(e,A={}){let i=this.renderString(e,Ye(rA({},A),{format:"svg"}));return new DOMParser().parseFromString(i,"image/svg+xml").documentElement}renderJSON(e,A={}){let i=this.renderString(e,Ye(rA({},A),{format:"json"}));return JSON.parse(i)}};function Yu(){return b3A().then(t=>new Pk(t))}var gU=jQ(rq());var vs=class{static getBaseUrlWithoutPath(){let e=window.location.href;return new URL(e).origin+"/dev-ui/"}static getApiServerBaseUrl(){return window.runtimeConfig?.backendUrl}static getWSServerUrl(){let e=this.getApiServerBaseUrl();return!e||e==""?window.location.host:e.startsWith("http://")?e.slice(7):e.startsWith("https://")?e.slice(8):e}};var H2=class t{constructor(e,A){this.http=e;this.zone=A}apiServerDomain=vs.getApiServerBaseUrl();_currentApp=new Mi("");currentApp=this._currentApp.asObservable();isLoading=new Mi(!1);getApp(){return this.currentApp}setApp(e){this._currentApp.next(e)}getLoadingState(){return this.isLoading}runSse(e){let A=this.apiServerDomain+"/run_sse";return this.isLoading.next(!0),new ct(i=>{let n=this;fetch(A,{method:"POST",headers:{"Content-Type":"application/json",Accept:"text/event-stream"},body:JSON.stringify(e)}).then(o=>{let r=o.body?.getReader(),s=new TextDecoder("utf-8"),a="",c=()=>{r?.read().then(({done:l,value:I})=>{if(this.isLoading.next(!0),l)return this.isLoading.next(!1),i.complete();let C=s.decode(I,{stream:!0});a+=C;try{a.split(/\r?\n/).filter(B=>B.startsWith("data:")).forEach(B=>{let E=B.replace(/^data:\s*/,"");JSON.parse(E),n.zone.run(()=>i.next(E))}),a=""}catch(d){d instanceof SyntaxError&&c()}c()}).catch(l=>{n.zone.run(()=>i.error(l))})};c()}).catch(o=>{n.zone.run(()=>i.error(o))})})}listApps(){if(this.apiServerDomain!=null){let e=this.apiServerDomain+"/list-apps?relative_path=./";return this.http.get(e)}return new ct}static \u0275fac=function(A){return new(A||t)(we(Ds),we(Qe))};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})};var YmA="import_session",JmA="edit_function_args";var TmA="a2a_card",KB=class t{route=f(ha);constructor(){}isImportSessionEnabled(){return this.route.queryParams.pipe(je(e=>e[YmA]==="true"))}isEditFunctionArgsEnabled(){return this.route.queryParams.pipe(je(e=>e[JmA]==="true"))}isSessionUrlEnabled(){return Me(!0)}isA2ACardEnabled(){return this.route.queryParams.pipe(je(e=>e[TmA]==="true"))}static \u0275fac=function(A){return new(A||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})};function HmA(t,e){}var z2=class{viewContainerRef;injector;id;role="dialog";panelClass="";hasBackdrop=!0;backdropClass="";disableClose=!1;width="";height="";minWidth;minHeight;maxWidth;maxHeight;positionStrategy;data=null;direction;ariaDescribedBy=null;ariaLabelledBy=null;ariaLabel=null;ariaModal=!1;autoFocus="first-tabbable";restoreFocus=!0;scrollStrategy;closeOnNavigation=!0;closeOnDestroy=!0;closeOnOverlayDetachments=!0;componentFactoryResolver;providers;container;templateContext};var rS=(()=>{class t extends J2{_elementRef=f(ee);_focusTrapFactory=f(n8);_config;_interactivityChecker=f(Mu);_ngZone=f(Qe);_overlayRef=f(LB);_focusMonitor=f(dr);_renderer=f(Wi);_platform=f(Ii);_document=f(at,{optional:!0});_portalOutlet;_focusTrap=null;_elementFocusedBeforeDialogWasOpened=null;_closeInteractionType=null;_ariaLabelledByQueue=[];_changeDetectorRef=f(It);_injector=f(Rt);_isDestroyed=!1;constructor(){super(),this._config=f(z2,{optional:!0})||new z2,this._config.ariaLabelledBy&&this._ariaLabelledByQueue.push(this._config.ariaLabelledBy)}_addAriaLabelledBy(A){this._ariaLabelledByQueue.push(A),this._changeDetectorRef.markForCheck()}_removeAriaLabelledBy(A){let i=this._ariaLabelledByQueue.indexOf(A);i>-1&&(this._ariaLabelledByQueue.splice(i,1),this._changeDetectorRef.markForCheck())}_contentAttached(){this._initializeFocusTrap(),this._handleBackdropClicks(),this._captureInitialFocus()}_captureInitialFocus(){this._trapFocus()}ngOnDestroy(){this._isDestroyed=!0,this._restoreFocus()}attachComponentPortal(A){this._portalOutlet.hasAttached();let i=this._portalOutlet.attachComponentPortal(A);return this._contentAttached(),i}attachTemplatePortal(A){this._portalOutlet.hasAttached();let i=this._portalOutlet.attachTemplatePortal(A);return this._contentAttached(),i}attachDomPortal=A=>{this._portalOutlet.hasAttached();let i=this._portalOutlet.attachDomPortal(A);return this._contentAttached(),i};_recaptureFocus(){this._containsFocus()||this._trapFocus()}_forceFocus(A,i){this._interactivityChecker.isFocusable(A)||(A.tabIndex=-1,this._ngZone.runOutsideAngular(()=>{let n=()=>{o(),r(),A.removeAttribute("tabindex")},o=this._renderer.listen(A,"blur",n),r=this._renderer.listen(A,"mousedown",n)})),A.focus(i)}_focusByCssSelector(A,i){let n=this._elementRef.nativeElement.querySelector(A);n&&this._forceFocus(n,i)}_trapFocus(){this._isDestroyed||To(()=>{let A=this._elementRef.nativeElement;switch(this._config.autoFocus){case!1:case"dialog":this._containsFocus()||A.focus();break;case!0:case"first-tabbable":this._focusTrap?.focusInitialElement()||this._focusDialogContainer();break;case"first-heading":this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role="heading"]');break;default:this._focusByCssSelector(this._config.autoFocus);break}},{injector:this._injector})}_restoreFocus(){let A=this._config.restoreFocus,i=null;if(typeof A=="string"?i=this._document.querySelector(A):typeof A=="boolean"?i=A?this._elementFocusedBeforeDialogWasOpened:null:A&&(i=A),this._config.restoreFocus&&i&&typeof i.focus=="function"){let n=pB(),o=this._elementRef.nativeElement;(!n||n===this._document.body||n===o||o.contains(n))&&(this._focusMonitor?(this._focusMonitor.focusVia(i,this._closeInteractionType),this._closeInteractionType=null):i.focus())}this._focusTrap&&this._focusTrap.destroy()}_focusDialogContainer(){this._elementRef.nativeElement.focus&&this._elementRef.nativeElement.focus()}_containsFocus(){let A=this._elementRef.nativeElement,i=pB();return A===i||A.contains(i)}_initializeFocusTrap(){this._platform.isBrowser&&(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement),this._document&&(this._elementFocusedBeforeDialogWasOpened=pB()))}_handleBackdropClicks(){this._overlayRef.backdropClick().subscribe(()=>{this._config.disableClose&&this._recaptureFocus()})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["cdk-dialog-container"]],viewQuery:function(i,n){if(i&1&&Te(fa,7),i&2){let o;XA(o=$A())&&(n._portalOutlet=o.first)}},hostAttrs:["tabindex","-1",1,"cdk-dialog-container"],hostVars:6,hostBindings:function(i,n){i&2&&Ne("id",n._config.id||null)("role",n._config.role)("aria-modal",n._config.ariaModal)("aria-labelledby",n._config.ariaLabel?null:n._ariaLabelledByQueue[0])("aria-label",n._config.ariaLabel)("aria-describedby",n._config.ariaDescribedBy||null)},features:[lt],decls:1,vars:0,consts:[["cdkPortalOutlet",""]],template:function(i,n){i&1&&_A(0,HmA,0,0,"ng-template",0)},dependencies:[fa],styles:[".cdk-dialog-container{display:block;width:100%;height:100%;min-height:inherit;max-height:inherit}"],encapsulation:2})}return t})(),Tu=class{overlayRef;config;componentInstance;componentRef;containerInstance;disableClose;closed=new OA;backdropClick;keydownEvents;outsidePointerEvents;id;_detachSubscription;constructor(e,A){this.overlayRef=e,this.config=A,this.disableClose=A.disableClose,this.backdropClick=e.backdropClick(),this.keydownEvents=e.keydownEvents(),this.outsidePointerEvents=e.outsidePointerEvents(),this.id=A.id,this.keydownEvents.subscribe(i=>{i.keyCode===27&&!this.disableClose&&!ir(i)&&(i.preventDefault(),this.close(void 0,{focusOrigin:"keyboard"}))}),this.backdropClick.subscribe(()=>{this.disableClose||this.close(void 0,{focusOrigin:"mouse"})}),this._detachSubscription=e.detachments().subscribe(()=>{A.closeOnOverlayDetachments!==!1&&this.close()})}close(e,A){if(this.containerInstance){let i=this.closed;this.containerInstance._closeInteractionType=A?.focusOrigin||"program",this._detachSubscription.unsubscribe(),this.overlayRef.dispose(),i.next(e),i.complete(),this.componentInstance=this.containerInstance=null}}updatePosition(){return this.overlayRef.updatePosition(),this}updateSize(e="",A=""){return this.overlayRef.updateSize({width:e,height:A}),this}addPanelClass(e){return this.overlayRef.addPanelClass(e),this}removePanelClass(e){return this.overlayRef.removePanelClass(e),this}},zmA=new dA("DialogScrollStrategy",{providedIn:"root",factory:()=>{let t=f(nr);return()=>t.scrollStrategies.block()}}),OmA=new dA("DialogData"),PmA=new dA("DefaultDialogConfig");var sS=(()=>{class t{_overlay=f(nr);_injector=f(Rt);_defaultOptions=f(PmA,{optional:!0});_parentDialog=f(t,{optional:!0,skipSelf:!0});_overlayContainer=f(d8);_idGenerator=f(sn);_openDialogsAtThisLevel=[];_afterAllClosedAtThisLevel=new OA;_afterOpenedAtThisLevel=new OA;_ariaHiddenElements=new Map;_scrollStrategy=f(zmA);get openDialogs(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}get afterOpened(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}afterAllClosed=jl(()=>this.openDialogs.length?this._getAfterAllClosed():this._getAfterAllClosed().pipe(Pn(void 0)));constructor(){}open(A,i){let n=this._defaultOptions||new z2;i=rA(rA({},n),i),i.id=i.id||this._idGenerator.getId("cdk-dialog-"),i.id&&this.getDialogById(i.id);let o=this._getOverlayConfig(i),r=this._overlay.create(o),s=new Tu(r,i),a=this._attachContainer(r,s,i);return s.containerInstance=a,this._attachDialogContent(A,s,a,i),this.openDialogs.length||this._hideNonDialogContentFromAssistiveTechnology(),this.openDialogs.push(s),s.closed.subscribe(()=>this._removeOpenDialog(s,!0)),this.afterOpened.next(s),s}closeAll(){oS(this.openDialogs,A=>A.close())}getDialogById(A){return this.openDialogs.find(i=>i.id===A)}ngOnDestroy(){oS(this._openDialogsAtThisLevel,A=>{A.config.closeOnDestroy===!1&&this._removeOpenDialog(A,!1)}),oS(this._openDialogsAtThisLevel,A=>A.close()),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete(),this._openDialogsAtThisLevel=[]}_getOverlayConfig(A){let i=new Bg({positionStrategy:A.positionStrategy||this._overlay.position().global().centerHorizontally().centerVertically(),scrollStrategy:A.scrollStrategy||this._scrollStrategy(),panelClass:A.panelClass,hasBackdrop:A.hasBackdrop,direction:A.direction,minWidth:A.minWidth,minHeight:A.minHeight,maxWidth:A.maxWidth,maxHeight:A.maxHeight,width:A.width,height:A.height,disposeOnNavigation:A.closeOnNavigation});return A.backdropClass&&(i.backdropClass=A.backdropClass),i}_attachContainer(A,i,n){let o=n.injector||n.viewContainerRef?.injector,r=[{provide:z2,useValue:n},{provide:Tu,useValue:i},{provide:LB,useValue:A}],s;n.container?typeof n.container=="function"?s=n.container:(s=n.container.type,r.push(...n.container.providers(n))):s=rS;let a=new dl(s,n.viewContainerRef,Rt.create({parent:o||this._injector,providers:r}));return A.attach(a).instance}_attachDialogContent(A,i,n,o){if(A instanceof wn){let r=this._createInjector(o,i,n,void 0),s={$implicit:o.data,dialogRef:i};o.templateContext&&(s=rA(rA({},s),typeof o.templateContext=="function"?o.templateContext():o.templateContext)),n.attachTemplatePortal(new ys(A,null,s,r))}else{let r=this._createInjector(o,i,n,this._injector),s=n.attachComponentPortal(new dl(A,o.viewContainerRef,r));i.componentRef=s,i.componentInstance=s.instance}}_createInjector(A,i,n,o){let r=A.injector||A.viewContainerRef?.injector,s=[{provide:OmA,useValue:A.data},{provide:Tu,useValue:i}];return A.providers&&(typeof A.providers=="function"?s.push(...A.providers(i,A,n)):s.push(...A.providers)),A.direction&&(!r||!r.get(mo,null,{optional:!0}))&&s.push({provide:mo,useValue:{value:A.direction,change:Me()}}),Rt.create({parent:r||o,providers:s})}_removeOpenDialog(A,i){let n=this.openDialogs.indexOf(A);n>-1&&(this.openDialogs.splice(n,1),this.openDialogs.length||(this._ariaHiddenElements.forEach((o,r)=>{o?r.setAttribute("aria-hidden",o):r.removeAttribute("aria-hidden")}),this._ariaHiddenElements.clear(),i&&this._getAfterAllClosed().next()))}_hideNonDialogContentFromAssistiveTechnology(){let A=this._overlayContainer.getContainerElement();if(A.parentElement){let i=A.parentElement.children;for(let n=i.length-1;n>-1;n--){let o=i[n];o!==A&&o.nodeName!=="SCRIPT"&&o.nodeName!=="STYLE"&&!o.hasAttribute("aria-live")&&(this._ariaHiddenElements.set(o,o.getAttribute("aria-hidden")),o.setAttribute("aria-hidden","true"))}}}_getAfterAllClosed(){let A=this._parentDialog;return A?A._getAfterAllClosed():this._afterAllClosedAtThisLevel}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();function oS(t,e){let A=t.length;for(;A--;)e(t[A])}var sq=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({providers:[sS],imports:[El,dg,r8,dg]})}return t})();function jmA(t,e){}var D8=class{viewContainerRef;injector;id;role="dialog";panelClass="";hasBackdrop=!0;backdropClass="";disableClose=!1;width="";height="";minWidth;minHeight;maxWidth;maxHeight;position;data=null;direction;ariaDescribedBy=null;ariaLabelledBy=null;ariaLabel=null;ariaModal=!1;autoFocus="first-tabbable";restoreFocus=!0;delayFocusTrap=!0;scrollStrategy;closeOnNavigation=!0;componentFactoryResolver;enterAnimationDuration;exitAnimationDuration},aS="mdc-dialog--open",aq="mdc-dialog--opening",cq="mdc-dialog--closing",qmA=150,VmA=75,ZmA=(()=>{class t extends rS{_animationMode=f(Si,{optional:!0});_animationStateChanged=new WA;_animationsEnabled=this._animationMode!=="NoopAnimations";_actionSectionCount=0;_hostElement=this._elementRef.nativeElement;_enterAnimationDuration=this._animationsEnabled?gq(this._config.enterAnimationDuration)??qmA:0;_exitAnimationDuration=this._animationsEnabled?gq(this._config.exitAnimationDuration)??VmA:0;_animationTimer=null;_contentAttached(){super._contentAttached(),this._startOpenAnimation()}_startOpenAnimation(){this._animationStateChanged.emit({state:"opening",totalTime:this._enterAnimationDuration}),this._animationsEnabled?(this._hostElement.style.setProperty(lq,`${this._enterAnimationDuration}ms`),this._requestAnimationFrame(()=>this._hostElement.classList.add(aq,aS)),this._waitForAnimationToComplete(this._enterAnimationDuration,this._finishDialogOpen)):(this._hostElement.classList.add(aS),Promise.resolve().then(()=>this._finishDialogOpen()))}_startExitAnimation(){this._animationStateChanged.emit({state:"closing",totalTime:this._exitAnimationDuration}),this._hostElement.classList.remove(aS),this._animationsEnabled?(this._hostElement.style.setProperty(lq,`${this._exitAnimationDuration}ms`),this._requestAnimationFrame(()=>this._hostElement.classList.add(cq)),this._waitForAnimationToComplete(this._exitAnimationDuration,this._finishDialogClose)):Promise.resolve().then(()=>this._finishDialogClose())}_updateActionSectionCount(A){this._actionSectionCount+=A,this._changeDetectorRef.markForCheck()}_finishDialogOpen=()=>{this._clearAnimationClasses(),this._openAnimationDone(this._enterAnimationDuration)};_finishDialogClose=()=>{this._clearAnimationClasses(),this._animationStateChanged.emit({state:"closed",totalTime:this._exitAnimationDuration})};_clearAnimationClasses(){this._hostElement.classList.remove(aq,cq)}_waitForAnimationToComplete(A,i){this._animationTimer!==null&&clearTimeout(this._animationTimer),this._animationTimer=setTimeout(i,A)}_requestAnimationFrame(A){this._ngZone.runOutsideAngular(()=>{typeof requestAnimationFrame=="function"?requestAnimationFrame(A):A()})}_captureInitialFocus(){this._config.delayFocusTrap||this._trapFocus()}_openAnimationDone(A){this._config.delayFocusTrap&&this._trapFocus(),this._animationStateChanged.next({state:"opened",totalTime:A})}ngOnDestroy(){super.ngOnDestroy(),this._animationTimer!==null&&clearTimeout(this._animationTimer)}attachComponentPortal(A){let i=super.attachComponentPortal(A);return i.location.nativeElement.classList.add("mat-mdc-dialog-component-host"),i}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275cmp=zA({type:t,selectors:[["mat-dialog-container"]],hostAttrs:["tabindex","-1",1,"mat-mdc-dialog-container","mdc-dialog"],hostVars:10,hostBindings:function(i,n){i&2&&(Hs("id",n._config.id),Ne("aria-modal",n._config.ariaModal)("role",n._config.role)("aria-labelledby",n._config.ariaLabel?null:n._ariaLabelledByQueue[0])("aria-label",n._config.ariaLabel)("aria-describedby",n._config.ariaDescribedBy||null),ue("_mat-animation-noopable",!n._animationsEnabled)("mat-mdc-dialog-container-with-actions",n._actionSectionCount>0))},features:[lt],decls:3,vars:0,consts:[[1,"mat-mdc-dialog-inner-container","mdc-dialog__container"],[1,"mat-mdc-dialog-surface","mdc-dialog__surface"],["cdkPortalOutlet",""]],template:function(i,n){i&1&&(S(0,"div",0)(1,"div",1),_A(2,jmA,0,0,"ng-template",2),F()())},dependencies:[fa],styles:['.mat-mdc-dialog-container{width:100%;height:100%;display:block;box-sizing:border-box;max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit;outline:0}.cdk-overlay-pane.mat-mdc-dialog-panel{max-width:var(--mat-dialog-container-max-width, 560px);min-width:var(--mat-dialog-container-min-width, 280px)}@media(max-width: 599px){.cdk-overlay-pane.mat-mdc-dialog-panel{max-width:var(--mat-dialog-container-small-max-width, calc(100vw - 32px))}}.mat-mdc-dialog-inner-container{display:flex;flex-direction:row;align-items:center;justify-content:space-around;box-sizing:border-box;height:100%;opacity:0;transition:opacity linear var(--mat-dialog-transition-duration, 0ms);max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit}.mdc-dialog--closing .mat-mdc-dialog-inner-container{transition:opacity 75ms linear;transform:none}.mdc-dialog--open .mat-mdc-dialog-inner-container{opacity:1}._mat-animation-noopable .mat-mdc-dialog-inner-container{transition:none}.mat-mdc-dialog-surface{display:flex;flex-direction:column;flex-grow:0;flex-shrink:0;box-sizing:border-box;width:100%;height:100%;position:relative;overflow-y:auto;outline:0;transform:scale(0.8);transition:transform var(--mat-dialog-transition-duration, 0ms) cubic-bezier(0, 0, 0.2, 1);max-height:inherit;min-height:inherit;min-width:inherit;max-width:inherit;box-shadow:var(--mat-dialog-container-elevation-shadow, none);border-radius:var(--mdc-dialog-container-shape, var(--mat-sys-corner-extra-large, 4px));background-color:var(--mdc-dialog-container-color, var(--mat-sys-surface, white))}[dir=rtl] .mat-mdc-dialog-surface{text-align:right}.mdc-dialog--open .mat-mdc-dialog-surface,.mdc-dialog--closing .mat-mdc-dialog-surface{transform:none}._mat-animation-noopable .mat-mdc-dialog-surface{transition:none}.mat-mdc-dialog-surface::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:2px solid rgba(0,0,0,0);border-radius:inherit;content:"";pointer-events:none}.mat-mdc-dialog-title{display:block;position:relative;flex-shrink:0;box-sizing:border-box;margin:0 0 1px;padding:var(--mat-dialog-headline-padding, 6px 24px 13px)}.mat-mdc-dialog-title::before{display:inline-block;width:0;height:40px;content:"";vertical-align:0}[dir=rtl] .mat-mdc-dialog-title{text-align:right}.mat-mdc-dialog-container .mat-mdc-dialog-title{color:var(--mdc-dialog-subhead-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mdc-dialog-subhead-font, var(--mat-sys-headline-small-font, inherit));line-height:var(--mdc-dialog-subhead-line-height, var(--mat-sys-headline-small-line-height, 1.5rem));font-size:var(--mdc-dialog-subhead-size, var(--mat-sys-headline-small-size, 1rem));font-weight:var(--mdc-dialog-subhead-weight, var(--mat-sys-headline-small-weight, 400));letter-spacing:var(--mdc-dialog-subhead-tracking, var(--mat-sys-headline-small-tracking, 0.03125em))}.mat-mdc-dialog-content{display:block;flex-grow:1;box-sizing:border-box;margin:0;overflow:auto;max-height:65vh}.mat-mdc-dialog-content>:first-child{margin-top:0}.mat-mdc-dialog-content>:last-child{margin-bottom:0}.mat-mdc-dialog-container .mat-mdc-dialog-content{color:var(--mdc-dialog-supporting-text-color, var(--mat-sys-on-surface-variant, rgba(0, 0, 0, 0.6)));font-family:var(--mdc-dialog-supporting-text-font, var(--mat-sys-body-medium-font, inherit));line-height:var(--mdc-dialog-supporting-text-line-height, var(--mat-sys-body-medium-line-height, 1.5rem));font-size:var(--mdc-dialog-supporting-text-size, var(--mat-sys-body-medium-size, 1rem));font-weight:var(--mdc-dialog-supporting-text-weight, var(--mat-sys-body-medium-weight, 400));letter-spacing:var(--mdc-dialog-supporting-text-tracking, var(--mat-sys-body-medium-tracking, 0.03125em))}.mat-mdc-dialog-container .mat-mdc-dialog-content{padding:var(--mat-dialog-content-padding, 20px 24px)}.mat-mdc-dialog-container-with-actions .mat-mdc-dialog-content{padding:var(--mat-dialog-with-actions-content-padding, 20px 24px 0)}.mat-mdc-dialog-container .mat-mdc-dialog-title+.mat-mdc-dialog-content{padding-top:0}.mat-mdc-dialog-actions{display:flex;position:relative;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;box-sizing:border-box;min-height:52px;margin:0;padding:8px;border-top:1px solid rgba(0,0,0,0);padding:var(--mat-dialog-actions-padding, 16px 24px);justify-content:var(--mat-dialog-actions-alignment, flex-end)}@media(forced-colors: active){.mat-mdc-dialog-actions{border-top-color:CanvasText}}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-start,.mat-mdc-dialog-actions[align=start]{justify-content:start}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-center,.mat-mdc-dialog-actions[align=center]{justify-content:center}.mat-mdc-dialog-actions.mat-mdc-dialog-actions-align-end,.mat-mdc-dialog-actions[align=end]{justify-content:flex-end}.mat-mdc-dialog-actions .mat-button-base+.mat-button-base,.mat-mdc-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-mdc-dialog-actions .mat-button-base+.mat-button-base,[dir=rtl] .mat-mdc-dialog-actions .mat-mdc-button-base+.mat-mdc-button-base{margin-left:0;margin-right:8px}.mat-mdc-dialog-component-host{display:contents}'],encapsulation:2})}return t})(),lq="--mat-dialog-transition-duration";function gq(t){return t==null?null:typeof t=="number"?t:t.endsWith("ms")?zs(t.substring(0,t.length-2)):t.endsWith("s")?zs(t.substring(0,t.length-1))*1e3:t==="0"?0:null}var w8=function(t){return t[t.OPEN=0]="OPEN",t[t.CLOSING=1]="CLOSING",t[t.CLOSED=2]="CLOSED",t}(w8||{}),Br=class{_ref;_containerInstance;componentInstance;componentRef;disableClose;id;_afterOpened=new OA;_beforeClosed=new OA;_result;_closeFallbackTimeout;_state=w8.OPEN;_closeInteractionType;constructor(e,A,i){this._ref=e,this._containerInstance=i,this.disableClose=A.disableClose,this.id=e.id,e.addPanelClass("mat-mdc-dialog-panel"),i._animationStateChanged.pipe(kt(n=>n.state==="opened"),On(1)).subscribe(()=>{this._afterOpened.next(),this._afterOpened.complete()}),i._animationStateChanged.pipe(kt(n=>n.state==="closed"),On(1)).subscribe(()=>{clearTimeout(this._closeFallbackTimeout),this._finishDialogClose()}),e.overlayRef.detachments().subscribe(()=>{this._beforeClosed.next(this._result),this._beforeClosed.complete(),this._finishDialogClose()}),zn(this.backdropClick(),this.keydownEvents().pipe(kt(n=>n.keyCode===27&&!this.disableClose&&!ir(n)))).subscribe(n=>{this.disableClose||(n.preventDefault(),Iq(this,n.type==="keydown"?"keyboard":"mouse"))})}close(e){this._result=e,this._containerInstance._animationStateChanged.pipe(kt(A=>A.state==="closing"),On(1)).subscribe(A=>{this._beforeClosed.next(e),this._beforeClosed.complete(),this._ref.overlayRef.detachBackdrop(),this._closeFallbackTimeout=setTimeout(()=>this._finishDialogClose(),A.totalTime+100)}),this._state=w8.CLOSING,this._containerInstance._startExitAnimation()}afterOpened(){return this._afterOpened}afterClosed(){return this._ref.closed}beforeClosed(){return this._beforeClosed}backdropClick(){return this._ref.backdropClick}keydownEvents(){return this._ref.keydownEvents}updatePosition(e){let A=this._ref.config.positionStrategy;return e&&(e.left||e.right)?e.left?A.left(e.left):A.right(e.right):A.centerHorizontally(),e&&(e.top||e.bottom)?e.top?A.top(e.top):A.bottom(e.bottom):A.centerVertically(),this._ref.updatePosition(),this}updateSize(e="",A=""){return this._ref.updateSize(e,A),this}addPanelClass(e){return this._ref.addPanelClass(e),this}removePanelClass(e){return this._ref.removePanelClass(e),this}getState(){return this._state}_finishDialogClose(){this._state=w8.CLOSED,this._ref.close(this._result,{focusOrigin:this._closeInteractionType}),this.componentInstance=null}};function Iq(t,e,A){return t._closeInteractionType=e,t.close(A)}var as=new dA("MatMdcDialogData"),WmA=new dA("mat-mdc-dialog-default-options"),XmA=new dA("mat-mdc-dialog-scroll-strategy",{providedIn:"root",factory:()=>{let t=f(nr);return()=>t.scrollStrategies.block()}});var qs=(()=>{class t{_overlay=f(nr);_defaultOptions=f(WmA,{optional:!0});_scrollStrategy=f(XmA);_parentDialog=f(t,{optional:!0,skipSelf:!0});_idGenerator=f(sn);_dialog=f(sS);_openDialogsAtThisLevel=[];_afterAllClosedAtThisLevel=new OA;_afterOpenedAtThisLevel=new OA;dialogConfigClass=D8;_dialogRefConstructor;_dialogContainerType;_dialogDataToken;get openDialogs(){return this._parentDialog?this._parentDialog.openDialogs:this._openDialogsAtThisLevel}get afterOpened(){return this._parentDialog?this._parentDialog.afterOpened:this._afterOpenedAtThisLevel}_getAfterAllClosed(){let A=this._parentDialog;return A?A._getAfterAllClosed():this._afterAllClosedAtThisLevel}afterAllClosed=jl(()=>this.openDialogs.length?this._getAfterAllClosed():this._getAfterAllClosed().pipe(Pn(void 0)));constructor(){this._dialogRefConstructor=Br,this._dialogContainerType=ZmA,this._dialogDataToken=as}open(A,i){let n;i=rA(rA({},this._defaultOptions||new D8),i),i.id=i.id||this._idGenerator.getId("mat-mdc-dialog-"),i.scrollStrategy=i.scrollStrategy||this._scrollStrategy();let o=this._dialog.open(A,Ye(rA({},i),{positionStrategy:this._overlay.position().global().centerHorizontally().centerVertically(),disableClose:!0,closeOnDestroy:!1,closeOnOverlayDetachments:!1,container:{type:this._dialogContainerType,providers:()=>[{provide:this.dialogConfigClass,useValue:i},{provide:z2,useValue:i}]},templateContext:()=>({dialogRef:n}),providers:(r,s,a)=>(n=new this._dialogRefConstructor(r,i,a),n.updatePosition(i?.position),[{provide:this._dialogContainerType,useValue:a},{provide:this._dialogDataToken,useValue:s.data},{provide:this._dialogRefConstructor,useValue:n}])}));return n.componentRef=o.componentRef,n.componentInstance=o.componentInstance,this.openDialogs.push(n),this.afterOpened.next(n),n.afterClosed().subscribe(()=>{let r=this.openDialogs.indexOf(n);r>-1&&(this.openDialogs.splice(r,1),this.openDialogs.length||this._getAfterAllClosed().next())}),n}closeAll(){this._closeDialogs(this.openDialogs)}getDialogById(A){return this.openDialogs.find(i=>i.id===A)}ngOnDestroy(){this._closeDialogs(this._openDialogsAtThisLevel),this._afterAllClosedAtThisLevel.complete(),this._afterOpenedAtThisLevel.complete()}_closeDialogs(A){let i=A.length;for(;i--;)A[i].close()}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})(),hg=(()=>{class t{dialogRef=f(Br,{optional:!0});_elementRef=f(ee);_dialog=f(qs);ariaLabel;type="button";dialogResult;_matDialogClose;constructor(){}ngOnInit(){this.dialogRef||(this.dialogRef=dq(this._elementRef,this._dialog.openDialogs))}ngOnChanges(A){let i=A._matDialogClose||A._matDialogCloseResult;i&&(this.dialogResult=i.currentValue)}_onButtonClick(A){Iq(this.dialogRef,A.screenX===0&&A.screenY===0?"keyboard":"mouse",this.dialogResult)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","mat-dialog-close",""],["","matDialogClose",""]],hostVars:2,hostBindings:function(i,n){i&1&&hA("click",function(r){return n._onButtonClick(r)}),i&2&&Ne("aria-label",n.ariaLabel||null)("type",n.type)},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],type:"type",dialogResult:[0,"mat-dialog-close","dialogResult"],_matDialogClose:[0,"matDialogClose","_matDialogClose"]},exportAs:["matDialogClose"],features:[ti]})}return t})(),Cq=(()=>{class t{_dialogRef=f(Br,{optional:!0});_elementRef=f(ee);_dialog=f(qs);constructor(){}ngOnInit(){this._dialogRef||(this._dialogRef=dq(this._elementRef,this._dialog.openDialogs)),this._dialogRef&&Promise.resolve().then(()=>{this._onAdd()})}ngOnDestroy(){this._dialogRef?._containerInstance&&Promise.resolve().then(()=>{this._onRemove()})}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t})}return t})(),bs=(()=>{class t extends Cq{id=f(sn).getId("mat-mdc-dialog-title-");_onAdd(){this._dialogRef._containerInstance?._addAriaLabelledBy?.(this.id)}_onRemove(){this._dialogRef?._containerInstance?._removeAriaLabelledBy?.(this.id)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275dir=jA({type:t,selectors:[["","mat-dialog-title",""],["","matDialogTitle",""]],hostAttrs:[1,"mat-mdc-dialog-title","mdc-dialog__title"],hostVars:1,hostBindings:function(i,n){i&2&&Hs("id",n.id)},inputs:{id:"id"},exportAs:["matDialogTitle"],features:[lt]})}return t})(),ma=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","mat-dialog-content",""],["mat-dialog-content"],["","matDialogContent",""]],hostAttrs:[1,"mat-mdc-dialog-content","mdc-dialog__content"],features:[YT([D0])]})}return t})(),pa=(()=>{class t extends Cq{align;_onAdd(){this._dialogRef._containerInstance?._updateActionSectionCount?.(1)}_onRemove(){this._dialogRef._containerInstance?._updateActionSectionCount?.(-1)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275dir=jA({type:t,selectors:[["","mat-dialog-actions",""],["mat-dialog-actions"],["","matDialogActions",""]],hostAttrs:[1,"mat-mdc-dialog-actions","mdc-dialog__actions"],hostVars:6,hostBindings:function(i,n){i&2&&ue("mat-mdc-dialog-actions-align-start",n.align==="start")("mat-mdc-dialog-actions-align-center",n.align==="center")("mat-mdc-dialog-actions-align-end",n.align==="end")},inputs:{align:"align"},features:[lt]})}return t})();function dq(t,e){let A=t.nativeElement.parentElement;for(;A&&!A.classList.contains("mat-mdc-dialog-container");)A=A.parentElement;return A?e.find(i=>i.id===A.id):null}var Bq=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({providers:[qs],imports:[sq,El,dg,it,it]})}return t})();function $mA(t,e){if(t&1&&JA(0,"img",5),t&2){let A=O(2);yA("src",A.displayContent,ja)}}function ApA(t,e){t&1&&(S(0,"div",6),AA(1," No image data provided. "),F())}function epA(t,e){if(t&1&&(S(0,"div",3),_A(1,$mA,1,1,"img",5)(2,ApA,2,0,"div",6),F()),t&2){let A=O();G(),GA(A.displayContent?1:-1),G(),GA(A.displayContent?-1:2)}}function tpA(t,e){if(t&1&&JA(0,"div",4),t&2){let A=O();yA("innerHTML",A.displayContent,RI)}}var v0=class t{constructor(e,A,i){this.dialogRef=e;this.data=A;this.sanitizer=i}displayContent=null;isSvgContent=!1;ngOnInit(){this.processImageData()}processImageData(){let e=this.data.imageData;if(!e){this.displayContent=null,this.isSvgContent=!1;return}if(e.trim().includes("e}))}return y8}function Hu(t){return npA()?.createHTML(t)||t}function Qq(t){return Error(`Unable to find icon with the name "${t}"`)}function opA(){return Error("Could not find HttpClient for use with Angular Material icons. Please add provideHttpClient() to your providers.")}function hq(t){return Error(`The URL provided to MatIconRegistry was not trusted as a resource URL via Angular's DomSanitizer. Attempted URL was "${t}".`)}function uq(t){return Error(`The literal provided to MatIconRegistry was not trusted as safe HTML by Angular's DomSanitizer. Attempted literal was "${t}".`)}var b0=class{url;svgText;options;svgElement;constructor(e,A,i){this.url=e,this.svgText=A,this.options=i}},rpA=(()=>{class t{_httpClient;_sanitizer;_errorHandler;_document;_svgIconConfigs=new Map;_iconSetConfigs=new Map;_cachedIconsByUrl=new Map;_inProgressUrlFetches=new Map;_fontCssClassesByAlias=new Map;_resolvers=[];_defaultFontSetClass=["material-icons","mat-ligature-font"];constructor(A,i,n,o){this._httpClient=A,this._sanitizer=i,this._errorHandler=o,this._document=n}addSvgIcon(A,i,n){return this.addSvgIconInNamespace("",A,i,n)}addSvgIconLiteral(A,i,n){return this.addSvgIconLiteralInNamespace("",A,i,n)}addSvgIconInNamespace(A,i,n,o){return this._addSvgIconConfig(A,i,new b0(n,null,o))}addSvgIconResolver(A){return this._resolvers.push(A),this}addSvgIconLiteralInNamespace(A,i,n,o){let r=this._sanitizer.sanitize(jr.HTML,n);if(!r)throw uq(n);let s=Hu(r);return this._addSvgIconConfig(A,i,new b0("",s,o))}addSvgIconSet(A,i){return this.addSvgIconSetInNamespace("",A,i)}addSvgIconSetLiteral(A,i){return this.addSvgIconSetLiteralInNamespace("",A,i)}addSvgIconSetInNamespace(A,i,n){return this._addSvgIconSetConfig(A,new b0(i,null,n))}addSvgIconSetLiteralInNamespace(A,i,n){let o=this._sanitizer.sanitize(jr.HTML,i);if(!o)throw uq(i);let r=Hu(o);return this._addSvgIconSetConfig(A,new b0("",r,n))}registerFontClassAlias(A,i=A){return this._fontCssClassesByAlias.set(A,i),this}classNameForFontAlias(A){return this._fontCssClassesByAlias.get(A)||A}setDefaultFontSetClass(...A){return this._defaultFontSetClass=A,this}getDefaultFontSetClass(){return this._defaultFontSetClass}getSvgIconFromUrl(A){let i=this._sanitizer.sanitize(jr.RESOURCE_URL,A);if(!i)throw hq(A);let n=this._cachedIconsByUrl.get(i);return n?Me(v8(n)):this._loadSvgIconFromConfig(new b0(A,null)).pipe(Qo(o=>this._cachedIconsByUrl.set(i,o)),je(o=>v8(o)))}getNamedSvgIcon(A,i=""){let n=fq(i,A),o=this._svgIconConfigs.get(n);if(o)return this._getSvgFromConfig(o);if(o=this._getIconConfigFromResolvers(i,A),o)return this._svgIconConfigs.set(n,o),this._getSvgFromConfig(o);let r=this._iconSetConfigs.get(i);return r?this._getSvgFromIconSetConfigs(A,r):g2(Qq(n))}ngOnDestroy(){this._resolvers=[],this._svgIconConfigs.clear(),this._iconSetConfigs.clear(),this._cachedIconsByUrl.clear()}_getSvgFromConfig(A){return A.svgText?Me(v8(this._svgElementFromConfig(A))):this._loadSvgIconFromConfig(A).pipe(je(i=>v8(i)))}_getSvgFromIconSetConfigs(A,i){let n=this._extractIconWithNameFromAnySet(A,i);if(n)return Me(n);let o=i.filter(r=>!r.svgText).map(r=>this._loadSvgIconSetFromConfig(r).pipe(mr(s=>{let c=`Loading icon set URL: ${this._sanitizer.sanitize(jr.RESOURCE_URL,r.url)} failed: ${s.message}`;return this._errorHandler.handleError(new Error(c)),Me(null)})));return nh(o).pipe(je(()=>{let r=this._extractIconWithNameFromAnySet(A,i);if(!r)throw Qq(A);return r}))}_extractIconWithNameFromAnySet(A,i){for(let n=i.length-1;n>=0;n--){let o=i[n];if(o.svgText&&o.svgText.toString().indexOf(A)>-1){let r=this._svgElementFromConfig(o),s=this._extractSvgIconFromSet(r,A,o.options);if(s)return s}}return null}_loadSvgIconFromConfig(A){return this._fetchIcon(A).pipe(Qo(i=>A.svgText=i),je(()=>this._svgElementFromConfig(A)))}_loadSvgIconSetFromConfig(A){return A.svgText?Me(null):this._fetchIcon(A).pipe(Qo(i=>A.svgText=i))}_extractSvgIconFromSet(A,i,n){let o=A.querySelector(`[id="${i}"]`);if(!o)return null;let r=o.cloneNode(!0);if(r.removeAttribute("id"),r.nodeName.toLowerCase()==="svg")return this._setSvgAttributes(r,n);if(r.nodeName.toLowerCase()==="symbol")return this._setSvgAttributes(this._toSvgElement(r),n);let s=this._svgElementFromString(Hu(""));return s.appendChild(r),this._setSvgAttributes(s,n)}_svgElementFromString(A){let i=this._document.createElement("DIV");i.innerHTML=A;let n=i.querySelector("svg");if(!n)throw Error(" tag not found");return n}_toSvgElement(A){let i=this._svgElementFromString(Hu("")),n=A.attributes;for(let o=0;oHu(c)),Vl(()=>this._inProgressUrlFetches.delete(r)),rh());return this._inProgressUrlFetches.set(r,a),a}_addSvgIconConfig(A,i,n){return this._svgIconConfigs.set(fq(A,i),n),this}_addSvgIconSetConfig(A,i){let n=this._iconSetConfigs.get(A);return n?n.push(i):this._iconSetConfigs.set(A,[i]),this}_svgElementFromConfig(A){if(!A.svgElement){let i=this._svgElementFromString(A.svgText);this._setSvgAttributes(i,A.options),A.svgElement=i}return A.svgElement}_getIconConfigFromResolvers(A,i){for(let n=0;ne?e.pathname+e.search:""}}var mq=["clip-path","color-profile","src","cursor","fill","filter","marker","marker-start","marker-mid","marker-end","mask","stroke"],gpA=mq.map(t=>`[${t}]`).join(", "),IpA=/^url\(['"]?#(.*?)['"]?\)$/,P2=(()=>{class t{_elementRef=f(ee);_iconRegistry=f(rpA);_location=f(cpA);_errorHandler=f(aa);_defaultColor;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;inline=!1;get svgIcon(){return this._svgIcon}set svgIcon(A){A!==this._svgIcon&&(A?this._updateSvgIcon(A):this._svgIcon&&this._clearSvgElement(),this._svgIcon=A)}_svgIcon;get fontSet(){return this._fontSet}set fontSet(A){let i=this._cleanupFontValue(A);i!==this._fontSet&&(this._fontSet=i,this._updateFontIconClasses())}_fontSet;get fontIcon(){return this._fontIcon}set fontIcon(A){let i=this._cleanupFontValue(A);i!==this._fontIcon&&(this._fontIcon=i,this._updateFontIconClasses())}_fontIcon;_previousFontSetClass=[];_previousFontIconClass;_svgName;_svgNamespace;_previousPath;_elementsWithExternalReferences;_currentIconFetch=Kt.EMPTY;constructor(){let A=f(new wr("aria-hidden"),{optional:!0}),i=f(apA,{optional:!0});i&&(i.color&&(this.color=this._defaultColor=i.color),i.fontSet&&(this.fontSet=i.fontSet)),A||this._elementRef.nativeElement.setAttribute("aria-hidden","true")}_splitIconName(A){if(!A)return["",""];let i=A.split(":");switch(i.length){case 1:return["",i[0]];case 2:return i;default:throw Error(`Invalid icon name: "${A}"`)}}ngOnInit(){this._updateFontIconClasses()}ngAfterViewChecked(){let A=this._elementsWithExternalReferences;if(A&&A.size){let i=this._location.getPathname();i!==this._previousPath&&(this._previousPath=i,this._prependPathToReferences(i))}}ngOnDestroy(){this._currentIconFetch.unsubscribe(),this._elementsWithExternalReferences&&this._elementsWithExternalReferences.clear()}_usingFontIcon(){return!this.svgIcon}_setSvgElement(A){this._clearSvgElement();let i=this._location.getPathname();this._previousPath=i,this._cacheChildrenWithExternalReferences(A),this._prependPathToReferences(i),this._elementRef.nativeElement.appendChild(A)}_clearSvgElement(){let A=this._elementRef.nativeElement,i=A.childNodes.length;for(this._elementsWithExternalReferences&&this._elementsWithExternalReferences.clear();i--;){let n=A.childNodes[i];(n.nodeType!==1||n.nodeName.toLowerCase()==="svg")&&n.remove()}}_updateFontIconClasses(){if(!this._usingFontIcon())return;let A=this._elementRef.nativeElement,i=(this.fontSet?this._iconRegistry.classNameForFontAlias(this.fontSet).split(/ +/):this._iconRegistry.getDefaultFontSetClass()).filter(n=>n.length>0);this._previousFontSetClass.forEach(n=>A.classList.remove(n)),i.forEach(n=>A.classList.add(n)),this._previousFontSetClass=i,this.fontIcon!==this._previousFontIconClass&&!i.includes("mat-ligature-font")&&(this._previousFontIconClass&&A.classList.remove(this._previousFontIconClass),this.fontIcon&&A.classList.add(this.fontIcon),this._previousFontIconClass=this.fontIcon)}_cleanupFontValue(A){return typeof A=="string"?A.trim().split(" ")[0]:A}_prependPathToReferences(A){let i=this._elementsWithExternalReferences;i&&i.forEach((n,o)=>{n.forEach(r=>{o.setAttribute(r.name,`url('${A}#${r.value}')`)})})}_cacheChildrenWithExternalReferences(A){let i=A.querySelectorAll(gpA),n=this._elementsWithExternalReferences=this._elementsWithExternalReferences||new Map;for(let o=0;o{let s=i[o],a=s.getAttribute(r),c=a?a.match(IpA):null;if(c){let l=n.get(s);l||(l=[],n.set(s,l)),l.push({name:r,value:c[1]})}})}_updateSvgIcon(A){if(this._svgNamespace=null,this._svgName=null,this._currentIconFetch.unsubscribe(),A){let[i,n]=this._splitIconName(A);i&&(this._svgNamespace=i),n&&(this._svgName=n),this._currentIconFetch=this._iconRegistry.getNamedSvgIcon(n,i).pipe(On(1)).subscribe(o=>this._setSvgElement(o),o=>{let r=`Error retrieving icon ${i}:${n}! ${o.message}`;this._errorHandler.handleError(new Error(r))})}}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-icon"]],hostAttrs:["role","img",1,"mat-icon","notranslate"],hostVars:10,hostBindings:function(i,n){i&2&&(Ne("data-mat-icon-type",n._usingFontIcon()?"font":"svg")("data-mat-icon-name",n._svgName||n.fontIcon)("data-mat-icon-namespace",n._svgNamespace||n.fontSet)("fontIcon",n._usingFontIcon()?n.fontIcon:null),fo(n.color?"mat-"+n.color:""),ue("mat-icon-inline",n.inline)("mat-icon-no-color",n.color!=="primary"&&n.color!=="accent"&&n.color!=="warn"))},inputs:{color:"color",inline:[2,"inline","inline",ie],svgIcon:"svgIcon",fontSet:"fontSet",fontIcon:"fontIcon"},exportAs:["matIcon"],ngContentSelectors:ipA,decls:1,vars:0,template:function(i,n){i&1&&(jt(),Fe(0))},styles:["mat-icon,mat-icon.mat-primary,mat-icon.mat-accent,mat-icon.mat-warn{color:var(--mat-icon-color, inherit)}.mat-icon{-webkit-user-select:none;user-select:none;background-repeat:no-repeat;display:inline-block;fill:currentColor;height:24px;width:24px;overflow:hidden}.mat-icon.mat-icon-inline{font-size:inherit;height:inherit;line-height:inherit;width:inherit}.mat-icon.mat-ligature-font[fontIcon]::before{content:attr(fontIcon)}[dir=rtl] .mat-icon-rtl-mirror{transform:scale(-1, 1)}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon{display:block}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button .mat-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button .mat-icon{margin:auto}"],encapsulation:2,changeDetection:0})}return t})(),pq=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[it,it]})}return t})();var CpA=["audioPlayer"],nC=class t{base64data="";audioPlayerRef;audioSrc="";constructor(){}ngOnChanges(e){e.base64data&&this.base64data&&this.setAudioSource(this.base64data)}setAudioSource(e){e.startsWith("data:")?this.audioSrc=e:this.audioSrc=`data:audio/mpeg;base64,${e}`,this.audioPlayerRef&&this.audioPlayerRef.nativeElement&&this.audioPlayerRef.nativeElement.load()}play(){this.audioPlayerRef&&this.audioPlayerRef.nativeElement&&this.audioPlayerRef.nativeElement.play()}pause(){this.audioPlayerRef&&this.audioPlayerRef.nativeElement&&this.audioPlayerRef.nativeElement.pause()}stop(){this.audioPlayerRef&&this.audioPlayerRef.nativeElement&&(this.audioPlayerRef.nativeElement.pause(),this.audioPlayerRef.nativeElement.currentTime=0)}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=zA({type:t,selectors:[["app-audio-player"]],viewQuery:function(A,i){if(A&1&&Te(CpA,5),A&2){let n;XA(n=$A())&&(i.audioPlayerRef=n.first)}},inputs:{base64data:"base64data"},standalone:!1,features:[ti],decls:3,vars:1,consts:[["audioPlayer",""],["controls","",3,"src"]],template:function(A,i){A&1&&(S(0,"div"),JA(1,"audio",1,0),F()),A&2&&(G(),yA("src",i.audioSrc,ja))},styles:[".audio-player-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;padding:15px;background-color:#f0f0f0;border-radius:8px;box-shadow:0 2px 5px #0000001a;margin:20px auto;max-width:350px}audio[_ngcontent-%COMP%]{outline:none;border-radius:5px;width:350px}.custom-controls[_ngcontent-%COMP%]{margin-top:10px;display:flex;gap:10px}.custom-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{padding:8px 15px;border:none;border-radius:5px;background-color:#007bff;color:#fff;cursor:pointer;font-size:14px;transition:background-color .2s ease}.custom-controls[_ngcontent-%COMP%] button[_ngcontent-%COMP%]:hover{background-color:#0056b3}"]})};function dpA(t,e){t&1&&JA(0,"hr",2)}function BpA(t,e){if(t&1&&(S(0,"mat-option",7),AA(1),F()),t&2){let A=e.$implicit;yA("value",A),G(),Gt(A.versionId)}}function EpA(t,e){if(t&1){let A=be();S(0,"div")(1,"img",9),hA("click",function(){RA(A);let n=O().$index,o=O();return xA(o.openViewImageDialog(o.selectedArtifacts[n].data))}),F()()}if(t&2){let A,i=O().$index,n=O();G(),yA("src",(A=n.selectedArtifacts[i].data)!==null&&A!==void 0?A:"",ja)}}function QpA(t,e){if(t&1&&(S(0,"div"),JA(1,"app-audio-player",10),F()),t&2){let A=O().$index,i=O();G(),yA("base64data",i.selectedArtifacts[A].data)}}function hpA(t,e){if(t&1){let A=be();S(0,"div",1),_A(1,dpA,1,0,"hr",2),S(2,"div",3)(3,"button",4),hA("click",function(){let n=RA(A).$index,o=O();return xA(o.openArtifact(o.selectedArtifacts[n].data,o.selectedArtifacts[n].mimeType))}),AA(4),F()(),S(5,"div",3)(6,"span"),AA(7," Version: "),F(),S(8,"div",5)(9,"mat-select",6),da("ngModelChange",function(n){let o=RA(A).$index,r=O();return Va(r.selectedArtifacts[o],n)||(r.selectedArtifacts[o]=n),xA(n)}),hA("selectionChange",function(n){let o=RA(A).$index,r=O();return xA(r.onArtifactVersionChange(n,o))}),Dn(10,BpA,2,2,"mat-option",7,to),F()(),S(12,"button",8),hA("click",function(){let n=RA(A).$index,o=O();return xA(o.downloadArtifact(o.selectedArtifacts[n]))}),S(13,"mat-icon"),AA(14,"file_download"),F(),AA(15," Download "),F()(),S(16,"div"),_A(17,EpA,2,1,"div")(18,QpA,2,1,"div"),F()()}if(t&2){let A,i=e.$implicit,n=e.$index,o=O();G(),GA(n>0?1:-1),G(3),Et(" ",o.getArtifactName(i)," "),G(5),Ca("ngModel",o.selectedArtifacts[n]),G(),yn(o.getSortedArtifactsFromId(i)),G(7),GA((A=o.selectedArtifacts[n].mediaType)===o.MediaType.IMAGE?17:A===o.MediaType.AUDIO?18:-1)}}var upA="default_artifact_name",Ou=(n=>(n.IMAGE="image",n.AUDIO="audio",n.TEXT="text",n.UNSPECIFIED="unspecified",n))(Ou||{});function M8(t){let e=t.toLowerCase();for(let A of Object.values(Ou))if(A!=="unspecified"&&e.startsWith(A+"/"))return A;return"unspecified"}function fpA(t){return t?t.startsWith("image/"):!1}function mpA(t){return t?t.startsWith("audio/"):!1}function cS(t,e){try{if(!t)return;let A=t;if(t.startsWith("data:")&&t.includes(";base64,")&&(A=A.substring(A.indexOf(";base64,")+8)),!e||!A)return;let i=atob(A),n=new Array(i.length);for(let c=0;ce.id))]}getSortedArtifactsFromId(e){return this.artifacts.filter(A=>A.id===e).sort((A,i)=>i.versionId-A.versionId)}onArtifactVersionChange(e,A){this.selectedArtifacts[A]=e.value}openViewImageDialog(e){if(!e||!e.startsWith("data:")||e.indexOf(";base64,")===-1)return;let A=this.dialog.open(v0,{maxWidth:"90vw",maxHeight:"90vh",data:{imageData:e}})}openArtifact(e,A){if(this.isArtifactImage(A)){this.openViewImageDialog(e);return}this.openBase64InNewTab(e,A)}static \u0275fac=function(A){return new(A||t)(PA(O2),PA(qs))};static \u0275cmp=zA({type:t,selectors:[["app-artifact-tab"]],inputs:{artifacts:"artifacts"},standalone:!1,features:[ti],decls:3,vars:0,consts:[[1,"artifact-container"],[1,"artifact-box"],[1,"white-separator"],[1,"artifact-metadata"],[1,"link-style-button",3,"click"],[1,"version-select-container"],[3,"ngModelChange","selectionChange","ngModel"],[3,"value"],["mat-flat-button","",1,"download-button",3,"click"],["alt","artifact.id",1,"generated-image",3,"click","src"],[3,"base64data"]],template:function(A,i){A&1&&(S(0,"div",0),Dn(1,hpA,19,4,"div",1,to),F()),A&2&&(G(),yn(i.getDistinctArtifactIds()))},dependencies:[Ea,ec,P2,Dr,NB,U2,nC],styles:[".artifact-container[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap}.artifact-box[_ngcontent-%COMP%]{padding:10px;max-width:100%;margin-left:26px;display:flex;flex-direction:column}.artifact-metadata[_ngcontent-%COMP%]{display:flex;align-items:center;margin-bottom:15px;flex-wrap:wrap;gap:5px}.download-button[_ngcontent-%COMP%]{background-color:#8ab4f8!important;margin-left:35px;width:130px;height:28px;font-size:14px}.generated-image[_ngcontent-%COMP%]{max-width:60%;border-radius:8px;cursor:pointer}hr.white-separator[_ngcontent-%COMP%]{border:none;border-top:1px solid white;margin-bottom:1.2em;margin-right:15px}.version-select-container[_ngcontent-%COMP%]{background-color:#212123;width:80px;margin-left:15px}.link-style-button[_ngcontent-%COMP%]{background:none;border:none;padding:0;font:inherit;color:#007bff!important;text-decoration:underline;cursor:pointer;outline:none}.link-style-button[_ngcontent-%COMP%]:hover{color:#0056b3;text-decoration:underline}.link-style-button[_ngcontent-%COMP%]:focus{outline:1px dotted #007bff}.link-style-button[_ngcontent-%COMP%]:active{color:#004085}.link-style-button[_ngcontent-%COMP%]:disabled{color:#6c757d;text-decoration:none;cursor:not-allowed}"]})};function wo(t){return Array.isArray(t)}function xo(t){return t!==null&&typeof t=="object"&&(t.constructor===void 0||t.constructor.name==="Object")}function lS(t){return t&&typeof t=="object"?t.op==="add":!1}function gS(t){return t&&typeof t=="object"?t.op==="remove":!1}function k8(t){return t&&typeof t=="object"?t.op==="replace":!1}function S8(t){return t&&typeof t=="object"?t.op==="copy":!1}function j2(t){return t&&typeof t=="object"?t.op==="move":!1}function Dq(t,e){return JSON.stringify(t)===JSON.stringify(e)}function wpA(t,e){return t===e}function IS(t){return t.slice(0,t.length-1)}function yq(t){return t[t.length-1]}function vq(t,e){let A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:wpA;if(t.length{e[A]=t[A]}),e}else if(xo(t)){let e=rA({},t);return Object.getOwnPropertySymbols(t).forEach(A=>{e[A]=t[A]}),e}else return t}function BS(t,e,A){if(t[e]===A)return t;{let i=dS(t);return i[e]=A,i}}function Ke(t,e){let A=t,i=0;for(;i3&&arguments[3]!==void 0?arguments[3]:!1;if(e.length===0)return A;let n=e[0],o=cs(t?t[n]:void 0,e.slice(1),A,i);if(xo(t)||wo(t))return BS(t,n,o);if(i){let r=DpA.test(n)?[]:{};return r[n]=o,r}else throw new Error("Path does not exist")}var DpA=/^\d+$/;function Pu(t,e,A){if(e.length===0)return A(t);if(!CS(t))throw new Error("Path doesn't exist");let i=e[0],n=Pu(t[i],e.slice(1),A);return BS(t,i,n)}function oC(t,e){if(e.length===0)return t;if(!CS(t))throw new Error("Path does not exist");if(e.length===1){let n=e[0];if(n in t){let o=dS(t);return wo(o)&&o.splice(parseInt(n),1),xo(o)&&delete o[n],o}else return t}let A=e[0],i=oC(t[A],e.slice(1));return BS(t,A,i)}function ju(t,e,A){let i=e.slice(0,e.length-1),n=e[e.length-1];return Pu(t,i,o=>{if(!Array.isArray(o))throw new TypeError("Array expected at path "+JSON.stringify(i));let r=dS(o);return r.splice(parseInt(n),0,A),r})}function Ms(t,e){return t===void 0?!1:e.length===0?!0:t===null?!1:Ms(t[e[0]],e.slice(1))}function ks(t){let e=t.split("/");return e.shift(),e.map(A=>A.replace(/~1/g,"/").replace(/~0/g,"~"))}function Ct(t){return t.map(bq).join("")}function bq(t){return"/"+String(t).replace(/~/g,"~0").replace(/\//g,"~1")}function qu(t,e){return t+bq(e)}function Da(t,e,A){let i=t;for(let n=0;n{let s,a=ya(o,r.path);if(r.op==="add")s=Sq(o,a);else if(r.op==="remove")s=kq(o,a);else if(r.op==="replace")s=Mq(o,a);else if(r.op==="copy")s=LpA(o,a);else if(r.op==="move")s=FpA(o,a,Vu(r.from));else if(r.op==="test")s=[];else throw new Error("Unknown JSONPatch operation "+JSON.stringify(r));let c;if(A&&A.before){let l=A.before(o,r,s);if(l&&l.revertOperations&&(s=l.revertOperations),l&&l.document&&(c=l.document),l&&l.json)throw new Error('Deprecation warning: returned object property ".json" has been renamed to ".document"')}if(i=s.concat(i),c!==void 0)return{document:c}}}),i}function Mq(t,e){return[{op:"replace",path:Ct(e),value:Ke(t,e)}]}function kq(t,e){return[{op:"add",path:Ct(e),value:Ke(t,e)}]}function Sq(t,e){return YB(t,e)||!Ms(t,e)?[{op:"remove",path:Ct(e)}]:Mq(t,e)}function LpA(t,e){return Sq(t,e)}function FpA(t,e,A){if(e.length="0"&&t<="9"}function Fq(t){return t>=" "}function Zu(t){return`,:[]/{}() -+`.includes(t)}function hS(t){return t>="a"&&t<="z"||t>="A"&&t<="Z"||t==="_"||t==="$"}function uS(t){return t>="a"&&t<="z"||t>="A"&&t<="Z"||t==="_"||t==="$"||t>="0"&&t<="9"}var fS=/^(http|https|ftp|mailto|file|data|irc):\/\/$/,mS=/^[A-Za-z0-9-._~:/?#@!$&'()*+;=]$/;function pS(t){return`,[]/{} -+`.includes(t)}function wS(t){return Wu(t)||OpA.test(t)}var OpA=/^[[{\w-]$/;function Nq(t){return t===` -`||t==="\r"||t===" "||t==="\b"||t==="\f"}function q2(t,e){let A=t.charCodeAt(e);return A===32||A===10||A===9||A===13}function _q(t,e){let A=t.charCodeAt(e);return A===32||A===9||A===13}function Gq(t,e){let A=t.charCodeAt(e);return A===160||A>=8192&&A<=8202||A===8239||A===8287||A===12288}function Wu(t){return DS(t)||F8(t)}function DS(t){return t==='"'||t==="\u201C"||t==="\u201D"}function yS(t){return t==='"'}function F8(t){return t==="'"||t==="\u2018"||t==="\u2019"||t==="`"||t==="\xB4"}function vS(t){return t==="'"}function JB(t,e){let A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,i=t.lastIndexOf(e);return i!==-1?t.substring(0,i)+(A?"":t.substring(i+1)):t}function Sc(t,e){let A=t.length;if(!q2(t,A-1))return t+e;for(;q2(t,A-1);)A--;return t.substring(0,A)+e+t.substring(A)}function Uq(t,e,A){return t.substring(0,e)+t.substring(e+A)}function Kq(t){return/[,\n][ \t\r]*$/.test(t)}var PpA={"\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},jpA={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:` -`,r:"\r",t:" "};function Rc(t){let e=0,A="";c(["```","[```","{```"]),o()||QA(),c(["```","```]","```}"]);let n=I(",");for(n&&r(),wS(t[e])&&Kq(A)?(n||(A=Sc(A,",")),u()):n&&(A=JB(A,","));t[e]==="}"||t[e]==="]";)e++,r();if(e>=t.length)return A;gA();function o(){r();let tA=E()||h()||D()||R()||w()||K(!1)||z();return r(),tA}function r(){let tA=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0,cA=e,pA=s(tA);do pA=a(),pA&&(pA=s(tA));while(pA);return e>cA}function s(tA){let cA=tA?q2:_q,pA="";for(;;)if(cA(t,e))pA+=t[e],e++;else if(Gq(t,e))pA+=" ",e++;else break;return pA.length>0?(A+=pA,!0):!1}function a(){if(t[e]==="/"&&t[e+1]==="*"){for(;e=t.length;VA||(wS(t[e])||oe?A=Sc(A,":"):lA()),o()||(VA||oe?A+="null":lA())}return t[e]==="}"?(A+="}",e++):A=Sc(A,"}"),!0}return!1}function h(){if(t[e]==="["){A+="[",e++,r(),C(",")&&r();let tA=!0;for(;e0&&arguments[0]!==void 0?arguments[0]:!1,cA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:-1,pA=t[e]==="\\";if(pA&&(e++,pA=!0),Wu(t[e])){let VA=yS(t[e])?yS:vS(t[e])?vS:F8(t[e])?F8:DS,oe=e,KA=A.length,CA='"';for(e++;;){if(e>=t.length){let TA=U(e-1);return!tA&&Zu(t.charAt(TA))?(e=oe,A=A.substring(0,KA),D(!0)):(CA=Sc(CA,'"'),A+=CA,!0)}if(e===cA)return CA=Sc(CA,'"'),A+=CA,!0;if(VA(t[e])){let TA=e,Ze=CA.length;if(CA+='"',e++,A+=CA,r(!1),tA||e>=t.length||Zu(t[e])||Wu(t[e])||V2(t[e]))return L(),!0;let He=U(TA-1),uA=t.charAt(He);if(uA===",")return e=oe,A=A.substring(0,KA),D(!1,He);if(Zu(uA))return e=oe,A=A.substring(0,KA),D(!0);A=A.substring(0,KA),e=TA+1,CA=`${CA.substring(0,Ze)}\\${CA.substring(Ze)}`}else if(tA&&pS(t[e])){if(t[e-1]===":"&&fS.test(t.substring(oe+1,e+2)))for(;e=t.length?e=t.length:vA()}else CA+=TA,e+=2}else{let TA=t.charAt(e);TA==='"'&&t[e-1]!=="\\"?(CA+=`\\${TA}`,e++):Nq(TA)?(CA+=PpA[TA],e++):(Fq(TA)||j(TA),CA+=TA,e++)}pA&&d()}}return!1}function L(){let tA=!1;for(r();t[e]==="+";){tA=!0,e++,r(),A=JB(A,'"',!0);let cA=A.length;D()?A=Uq(A,cA,1):A=Sc(A,'"')}return tA}function R(){let tA=e;if(t[e]==="-"){if(e++,H())return q(tA),!0;if(!V2(t[e]))return e=tA,!1}for(;V2(t[e]);)e++;if(t[e]==="."){if(e++,H())return q(tA),!0;if(!V2(t[e]))return e=tA,!1;for(;V2(t[e]);)e++}if(t[e]==="e"||t[e]==="E"){if(e++,(t[e]==="-"||t[e]==="+")&&e++,H())return q(tA),!0;if(!V2(t[e]))return e=tA,!1;for(;V2(t[e]);)e++}if(!H())return e=tA,!1;if(e>tA){let cA=t.slice(tA,e),pA=/^0\d/.test(cA);return A+=pA?`"${cA}"`:cA,!0}return!1}function w(){return _("true","true")||_("false","false")||_("null","null")||_("True","true")||_("False","false")||_("None","null")}function _(tA,cA){return t.slice(e,e+tA.length)===tA?(A+=cA,e+=tA.length,!0):!1}function K(tA){let cA=e;if(hS(t[e])){for(;ecA){for(;q2(t,e-1)&&e>0;)e--;let pA=t.slice(cA,e);return A+=pA==="undefined"?"null":JSON.stringify(pA),t[e]==='"'&&e++,!0}}function z(){if(t[e]==="/"){let tA=e;for(e++;e0&&q2(t,cA);)cA--;return cA}function H(){return e>=t.length||Zu(t[e])||q2(t,e)}function q(tA){A+=`${t.slice(tA,e)}0`}function j(tA){throw new M0(`Invalid character ${JSON.stringify(tA)}`,e)}function gA(){throw new M0(`Unexpected character ${JSON.stringify(t[e])}`,e)}function QA(){throw new M0("Unexpected end of json string",t.length)}function BA(){throw new M0("Object key expected",e)}function lA(){throw new M0("Colon expected",e)}function vA(){let tA=t.slice(e,e+6);throw new M0(`Invalid unicode character "${tA}"`,e)}}function qpA(t,e){return t[e]==="*"&&t[e+1]==="/"}var VpA=typeof global=="object"&&global&&global.Object===Object&&global,N8=VpA;var ZpA=typeof self=="object"&&self&&self.Object===Object&&self,WpA=N8||ZpA||Function("return this")(),gr=WpA;var XpA=gr.Symbol,Zr=XpA;var Yq=Object.prototype,$pA=Yq.hasOwnProperty,A6A=Yq.toString,Xu=Zr?Zr.toStringTag:void 0;function e6A(t){var e=$pA.call(t,Xu),A=t[Xu];try{t[Xu]=void 0;var i=!0}catch{}var n=A6A.call(t);return i&&(e?t[Xu]=A:delete t[Xu]),n}var Jq=e6A;var t6A=Object.prototype,i6A=t6A.toString;function n6A(t){return i6A.call(t)}var Tq=n6A;var o6A="[object Null]",r6A="[object Undefined]",Hq=Zr?Zr.toStringTag:void 0;function s6A(t){return t==null?t===void 0?r6A:o6A:Hq&&Hq in Object(t)?Jq(t):Tq(t)}var Ql=s6A;function a6A(t){return t!=null&&typeof t=="object"}var Vs=a6A;var c6A="[object Symbol]";function l6A(t){return typeof t=="symbol"||Vs(t)&&Ql(t)==c6A}var ac=l6A;function g6A(t,e){for(var A=-1,i=t==null?0:t.length,n=Array(i);++A0){if(++e>=$6A)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}var sV=t8A;function i8A(t){return function(){return t}}var aV=i8A;var n8A=function(){try{var t=va(Object,"defineProperty");return t({},"",{}),t}catch{}}(),HB=n8A;var o8A=HB?function(t,e){return HB(t,"toString",{configurable:!0,enumerable:!1,value:aV(e),writable:!0})}:ug,cV=o8A;var r8A=sV(cV),lV=r8A;function s8A(t,e){for(var A=-1,i=t==null?0:t.length;++A-1&&t%1==0&&t-1&&t%1==0&&t<=u8A}var OB=f8A;function m8A(t){return t!=null&&OB(t.length)&&!_8(t)}var xc=m8A;function p8A(t,e,A){if(!Kr(A))return!1;var i=typeof e;return(i=="number"?xc(A)&&zB(e,A.length):i=="string"&&e in A)?X2(A[e],t):!1}var A4=p8A;var w8A=Object.prototype;function D8A(t){var e=t&&t.constructor,A=typeof e=="function"&&e.prototype||w8A;return t===A}var A1=D8A;function y8A(t,e){for(var A=-1,i=Array(t);++A-1}var FV=O5A;function P5A(t,e){var A=this.__data__,i=i1(A,t);return i<0?(++this.size,A.push([t,e])):A[i][1]=e,this}var NV=P5A;function ZB(t){var e=-1,A=t==null?0:t.length;for(this.clear();++e0&&A(s)?e>1?qV(s,e-1,A,i,n):$B(n,s):i||(n[n.length]=s)}return n}var VV=qV;var BwA=T8(Object.getPrototypeOf,Object),P8=BwA;function EwA(t,e,A){var i=-1,n=t.length;e<0&&(e=-e>n?0:n+e),A=A>n?n:A,A<0&&(A+=n),n=e>A?0:A-e>>>0,e>>>=0;for(var o=Array(n);++is))return!1;var c=o.get(t),l=o.get(e);if(c&&l)return c==e&&l==t;var I=-1,C=!0,d=A&ByA?new KZ:void 0;for(o.set(t,e),o.set(e,t);++I=e||K<0||I&&z>=o}function u(){var _=g5();if(h(_))return D(_);s=setTimeout(u,E(_))}function D(_){return s=void 0,C&&i?d(_):(i=n=void 0,r)}function L(){s!==void 0&&clearTimeout(s),c=0,i=a=n=s=void 0}function R(){return s===void 0?r:D(g5())}function w(){var _=g5(),K=h(_);if(i=arguments,n=this,a=_,K){if(s===void 0)return B(a);if(I)return clearTimeout(s),s=setTimeout(u,e),d(a)}return s===void 0&&(s=setTimeout(u,e)),r}return w.cancel=L,w.flush=R,w}var oE=B7A;function E7A(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}var hi=E7A;function Q7A(t){return typeof t=="function"?t:ug}var I5=Q7A;function h7A(t,e){for(var A=t==null?0:t.length;A--&&e(t[A],A,t)!==!1;);return t}var gW=h7A;var u7A=r5(!0),IW=u7A;function f7A(t,e){return t&&IW(t,e,Lc)}var CW=f7A;var m7A=a5(CW,!0),dW=m7A;function p7A(t,e){var A=Gn(t)?gW:dW;return A(t,I5(e))}var LS=p7A;function w7A(t){return t&&t.length?t[0]:void 0}var Fc=w7A;function D7A(t,e){var A=-1,i=xc(t)?Array(t.length):[];return c5(t,function(n,o,r){i[++A]=e(n,o,r)}),i}var C5=D7A;function y7A(t,e){var A=Gn(t)?Z2:C5;return A(t,fg(e,3))}var FS=y7A;var v7A=Object.prototype,b7A=v7A.hasOwnProperty,M7A=l5(function(t,e,A){b7A.call(t,A)?t[A].push(e):W2(t,A,[e])}),NS=M7A;function k7A(t){var e=t==null?0:t.length;return e?ZV(t,0,-1):[]}var Fi=k7A;var S7A="[object Map]",R7A="[object Set]",x7A=Object.prototype,L7A=x7A.hasOwnProperty;function F7A(t){if(t==null)return!0;if(xc(t)&&(Gn(t)||typeof t=="string"||typeof t.splice=="function"||S0(t)||PB(t)||e1(t)))return!t.length;var e=hl(t);if(e==S7A||e==R7A)return!t.size;if(A1(t))return!H8(t).length;for(var A in t)if(L7A.call(t,A))return!1;return!0}var Oi=F7A;function N7A(t,e){return nE(t,e)}var di=N7A;function _7A(t,e){return te||o&&r&&a&&!s&&!c||i&&r&&a||!A&&a||!n)return 1;if(!i&&!o&&!c&&t=s)return a;var c=A[i];return a*(c=="desc"?-1:1)}}return t.index-e.index}var uW=T7A;function H7A(t,e,A){e.length?e=Z2(e,function(o){return Gn(o)?function(r){return XB(r,o.length===1?o[0]:o)}:o}):e=[ug];var i=-1;e=Z2(e,t1(fg));var n=C5(t,function(o,r,s){var a=Z2(e,function(c){return c(o)});return{criteria:a,index:++i,value:o}});return QW(n,function(o,r){return uW(o,r,A)})}var fW=H7A;var z7A=l5(function(t,e,A){t[A?0:1].push(e)},function(){return[[],[]]}),GS=z7A;var O7A=Math.ceil,P7A=Math.max;function j7A(t,e,A,i){for(var n=-1,o=P7A(O7A((e-t)/(A||1)),0),r=Array(o);o--;)r[i?o:++n]=t,t+=A;return r}var mW=j7A;function q7A(t){return function(e,A,i){return i&&typeof i!="number"&&A4(e,A,i)&&(A=i=void 0),e=TB(e),A===void 0?(A=e,e=0):A=TB(A),i=i===void 0?e1&&A4(t,e[0],e[1])?e=[]:A>2&&A4(e[0],e[1],e[2])&&(e=[e[0]]),fW(t,VV(e,1),[])}),US=Z7A;var W7A=9007199254740991,KS=4294967295,X7A=Math.min;function $7A(t,e){if(t=Xq(t),t<1||t>W7A)return[];var A=KS,i=X7A(t,KS);e=I5(e),t-=KS;for(var n=Y8(i,e);++AArray.isArray(t),tvA=t=>t!==null&&typeof t=="object"&&!l1(t),ivA=t=>typeof t=="string",aC=(t,e)=>t===e?!0:t!==null&&e!==null&&typeof t=="object"&&typeof e=="object"&&Object.keys(t).length===Object.keys(e).length&&Object.entries(t).every(([A,i])=>aC(i,e[A]));function Er(t){return(...e)=>{let A=e.map(o=>Yr(o)),i=A[0],n=A[1];return A.length===1?o=>t(i(o)):A.length===2?o=>t(i(o),n(o)):o=>t(...A.map(r=>r(o)))}}var r4={boolean:0,number:1,string:2},wW=3,yW=(t,e)=>typeof t==typeof e&&typeof t in r4?t>e:!1,nvA=(t,e)=>aC(t,e)||yW(t,e),vW=(t,e)=>typeof t==typeof e&&typeof t in r4?taC(t,e)||vW(t,e),o4={pipe:(...t)=>{let e=t.map(A=>Yr(A));return A=>e.reduce((i,n)=>n(i),A)},object:t=>{let e=Object.keys(t).map(A=>[A,Yr(t[A])]);return A=>{let i={};for(let[n,o]of e)i[n]=o(A);return i}},array:(...t)=>{let e=t.map(A=>Yr(A));return A=>e.map(i=>i(A))},get:(...t)=>{if(t.length===0)return e=>e??null;if(t.length===1){let e=t[0];return A=>A?.[e]??null}return e=>{let A=e;for(let i of t)A=A?.[i];return A??null}},map:t=>{let e=Yr(t);return A=>A.map(e)},mapObject:t=>{let e=Yr(t);return A=>{let i={};for(let n of Object.keys(A)){let o=e({key:n,value:A[n]});i[o.key]=o.value}return i}},mapKeys:t=>{let e=Yr(t);return A=>{let i={};for(let n of Object.keys(A)){let o=e(n);i[o]=A[n]}return i}},mapValues:t=>{let e=Yr(t);return A=>{let i={};for(let n of Object.keys(A))i[n]=e(A[n]);return i}},filter:t=>{let e=Yr(t);return A=>A.filter(i=>DW(e(i)))},sort:(t=["get"],e)=>{let A=Yr(t),i=e==="desc"?-1:1;function n(o,r){let s=A(o),a=A(r);if(typeof s!=typeof a){let c=r4[typeof s]??wW,l=r4[typeof a]??wW;return c>l?i:ca?i:so.slice().sort(n)},reverse:()=>t=>t.toReversed(),pick:(...t)=>{let e=t.map(([i,...n])=>[n[n.length-1],o4.get(...n)]),A=(i,n)=>{let o={};for(let[r,s]of n)o[r]=s(i);return o};return i=>l1(i)?i.map(n=>A(n,e)):A(i,e)},groupBy:t=>{let e=Yr(t);return A=>{let i={};for(let n of A){let o=e(n);i[o]?i[o].push(n):i[o]=[n]}return i}},keyBy:t=>{let e=Yr(t);return A=>{let i={};for(let n of A){let o=e(n);o in i||(i[o]=n)}return i}},flatten:()=>t=>t.flat(),join:(t="")=>e=>e.join(t),split:Er((t,e)=>e!==void 0?t.split(e):t.trim().split(/\s+/)),substring:Er((t,e,A)=>t.slice(Math.max(e,0),A)),uniq:()=>t=>{let e=[];for(let A of t)e.findIndex(i=>aC(i,A))===-1&&e.push(A);return e},uniqBy:t=>e=>Object.values(o4.keyBy(t)(e)),limit:t=>e=>e.slice(0,Math.max(t,0)),size:()=>t=>t.length,keys:()=>Object.keys,values:()=>Object.values,prod:()=>t=>n4(t,(e,A)=>e*A),sum:()=>t=>l1(t)?t.reduce((e,A)=>e+A,0):JS(),average:()=>t=>l1(t)?t.length>0?t.reduce((e,A)=>e+A)/t.length:null:JS(),min:()=>t=>n4(t,(e,A)=>Math.min(e,A)),max:()=>t=>n4(t,(e,A)=>Math.max(e,A)),and:Er((...t)=>n4(t,(e,A)=>!!(e&&A))),or:Er((...t)=>n4(t,(e,A)=>!!(e||A))),not:Er(t=>!t),exists:t=>{let e=t.slice(1),A=e.pop(),i=o4.get(...e);return n=>{let o=i(n);return!!o&&Object.hasOwnProperty.call(o,A)}},if:(t,e,A)=>{let i=Yr(t),n=Yr(e),o=Yr(A);return r=>DW(i(r))?n(r):o(r)},in:(t,e)=>{let A=Yr(t),i=Yr(e);return n=>{let o=A(n);return i(n).findIndex(r=>aC(r,o))!==-1}},"not in":(t,e)=>{let A=o4.in(t,e);return i=>!A(i)},regex:(t,e,A)=>{let i=new RegExp(e,A),n=Yr(t);return o=>i.test(n(o))},eq:Er(aC),gt:Er(yW),gte:Er(nvA),lt:Er(vW),lte:Er(ovA),ne:Er((t,e)=>!aC(t,e)),add:Er((t,e)=>t+e),subtract:Er((t,e)=>t-e),multiply:Er((t,e)=>t*e),divide:Er((t,e)=>t/e),mod:Er((t,e)=>t%e),pow:Er((t,e)=>t**e),abs:Er(Math.abs),round:Er((t,e=0)=>+`${Math.round(+`${t}e${e}`)}e${-e}`),number:Er(t=>{let e=Number(t);return Number.isNaN(Number(t))?null:e}),string:Er(String)},DW=t=>t!==null&&t!==0&&t!==!1,n4=(t,e)=>(l1(t)||JS(),t.length===0?null:t.reduce(e)),JS=()=>{TS("Array expected")},TS=t=>{throw new TypeError(t)},B5=[];function Yr(t,e){B5.unshift(rA(rA(rA({},o4),B5[0]),e?.functions));try{let A=l1(t)?rvA(t,B5[0]):tvA(t)?TS(`Function notation ["object", {...}] expected but got ${JSON.stringify(t)}`):()=>t;return i=>{try{return A(i)}catch(n){throw n.jsonquery=[{data:i,query:t},...n.jsonquery??[]],n}}}finally{B5.shift()}}function rvA(t,e){let[A,...i]=t,n=e[A];return n||TS(`Unknown function '${A}'`),n(...i)}var bW=[{pow:"^"},{multiply:"*",divide:"/",mod:"%"},{add:"+",subtract:"-"},{gt:">",gte:">=",lt:"<",lte:"<=",in:"in","not in":"not in"},{eq:"==",ne:"!="},{and:"and"},{or:"or"},{pipe:"|"}],svA=["|","and","or"],MW=["|","and","or","*","/","%","+","-"];function kW(t,e){if(!l1(e))throw new Error("Invalid custom operators");return e.reduce(avA,t)}function avA(t,{name:e,op:A,at:i,after:n,before:o}){if(i)return t.map(a=>Object.values(a).includes(i)?Ye(rA({},a),{[e]:A}):a);let r=n??o,s=t.findIndex(a=>Object.values(a).includes(r));if(s!==-1)return t.toSpliced(s+(n?1:0),0,{[e]:A});throw new Error("Invalid custom operator")}var cvA=/^[a-zA-Z_$][a-zA-Z\d_$]*$/,lvA=/^[a-zA-Z_$][a-zA-Z\d_$]*/,gvA=/^"(?:[^"\\]|\\.)*"/,IvA=/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/,CvA=/^(0|[1-9][0-9]*)/,dvA=/^(true|false|null)/,BvA=/^[ \n\t\r]+/;function HS(t,e){let A=e?.operators??[],i=kW(bW,A),n=Object.assign({},...i),o=svA.concat(A.filter(H=>H.vararg).map(H=>H.op)),r=MW.concat(A.filter(H=>H.leftAssociative).map(H=>H.op)),s=(H=i.length-1)=>{let q=i[H];if(!q)return c();let j=t[z]==="(",gA=s(H-1);for(;;){w();let QA=z,BA=a(q);if(!BA)break;let lA=s(H-1),vA=gA[0],tA=BA===vA&&!j;if(tA&&!r.includes(n[BA])){z=QA;break}gA=tA&&o.includes(n[BA])?[...gA,lA]:[BA,gA,lA]}return gA},a=H=>{let q=Object.keys(H).sort((j,gA)=>gA.length-j.length);for(let j of q){let gA=H[j];if(t.substring(z,z+gA.length)===gA)return z+=gA.length,w(),j}},c=()=>{if(w(),t[z]==="("){z++;let H=s();return _(")"),H}return l()},l=()=>{if(t[z]==="."){let H=[];for(;t[z]===".";)z++,H.push(B()??E()??u()??K("Property expected"));return["get",...H]}return I()},I=()=>{let H=z,q=E();if(w(),!q||t[z]!=="(")return z=H,C();z++,w();let j=t[z]!==")"?[s()]:[];for(;z{if(t[z]==="{"){z++,w();let H={},q=!0;for(;z{if(t[z]==="["){z++,w();let H=[],q=!0;for(;zR(gvA,JSON.parse),E=()=>R(lvA,H=>H),h=()=>R(IvA,JSON.parse),u=()=>R(CvA,JSON.parse),D=()=>{let H=R(dvA,JSON.parse);if(H!==void 0)return H;K("Value expected")},L=()=>{w(),z{let j=t.substring(z).match(H);if(j)return z+=j[0].length,q(j[0])},w=()=>R(BvA,H=>H),_=H=>{t[z]!==H&&K(`Character '${H}' expected`),z++},K=(H,q=z)=>{throw new SyntaxError(`${H} (pos: ${q})`)},z=0,U=s();return L(),U}var EvA=40,QvA=" ",SW=(t,e)=>{let A=e?.indentation??QvA,i=e?.operators??[],n=kW(bW,i),o=Object.assign({},...n),r=MW.concat(i.filter(d=>d.leftAssociative).map(d=>d.op)),s=(d,B,E=!1)=>l1(d)?a(d,B,E):JSON.stringify(d),a=(d,B,E)=>{let[h,...u]=d;if(h==="get"&&u.length>0)return l(u);if(h==="object")return c(u[0],B);if(h==="array"){let w=u.map(_=>s(_,B));return C(w,["[",", ","]"],[`[ -${B+A}`,`, -${B+A}`,` -${B}]`])}let D=o[h];if(D){let w=E?"(":"",_=E?")":"",K=u.map((z,U)=>{let H=z?.[0],q=n.findIndex(QA=>h in QA),j=n.findIndex(QA=>H in QA),gA=q0||h===H&&!r.includes(D);return s(z,B+A,gA)});return C(K,[w,` ${D} `,_],[w,` -${B+A}${D} `,_])}let L=u.length===1?B:B+A,R=u.map(w=>s(w,L));return C(R,[`${h}(`,", ",")"],u.length===1?[`${h}(`,`, -${B}`,")"]:[`${h}( -${L}`,`, -${L}`,` -${B})`])},c=(d,B)=>{let E=B+A,h=Object.entries(d).map(([u,D])=>`${I(u)}: ${s(D,E)}`);return C(h,["{ ",", "," }"],[`{ -${E}`,`, -${E}`,` -${B}}`])},l=d=>d.map(B=>`.${I(B)}`).join(""),I=d=>cvA.test(d)?d:JSON.stringify(d),C=(d,[B,E,h],[u,D,L])=>B.length+d.reduce((R,w)=>R+w.length+E.length,0)-E.length+h.length<=(e?.maxLineLength??EvA)?B+d.join(E)+h:u+d.join(D)+L;return s(t,"")};function RW(t,e,A){return Yr(ivA(e)?HS(e,A):e,A)(t)}var xW={prefix:"far",iconName:"lightbulb",icon:[384,512,[128161],"f0eb","M297.2 248.9C311.6 228.3 320 203.2 320 176c0-70.7-57.3-128-128-128S64 105.3 64 176c0 27.2 8.4 52.3 22.8 72.9c3.7 5.3 8.1 11.3 12.8 17.7c0 0 0 0 0 0c12.9 17.7 28.3 38.9 39.8 59.8c10.4 19 15.7 38.8 18.3 57.5L109 384c-2.2-12-5.9-23.7-11.8-34.5c-9.9-18-22.2-34.9-34.5-51.8c0 0 0 0 0 0s0 0 0 0c-5.2-7.1-10.4-14.2-15.4-21.4C27.6 247.9 16 213.3 16 176C16 78.8 94.8 0 192 0s176 78.8 176 176c0 37.3-11.6 71.9-31.4 100.3c-5 7.2-10.2 14.3-15.4 21.4c0 0 0 0 0 0s0 0 0 0c-12.3 16.8-24.6 33.7-34.5 51.8c-5.9 10.8-9.6 22.5-11.8 34.5l-48.6 0c2.6-18.7 7.9-38.6 18.3-57.5c11.5-20.9 26.9-42.1 39.8-59.8c0 0 0 0 0 0s0 0 0 0s0 0 0 0c4.7-6.4 9-12.4 12.7-17.7zM192 128c-26.5 0-48 21.5-48 48c0 8.8-7.2 16-16 16s-16-7.2-16-16c0-44.2 35.8-80 80-80c8.8 0 16 7.2 16 16s-7.2 16-16 16zm0 384c-44.2 0-80-35.8-80-80l0-16 160 0 0 16c0 44.2-35.8 80-80 80z"]};var hvA={prefix:"far",iconName:"square-check",icon:[448,512,[9745,9989,61510,"check-square"],"f14a","M64 80c-8.8 0-16 7.2-16 16l0 320c0 8.8 7.2 16 16 16l320 0c8.8 0 16-7.2 16-16l0-320c0-8.8-7.2-16-16-16L64 80zM0 96C0 60.7 28.7 32 64 32l320 0c35.3 0 64 28.7 64 64l0 320c0 35.3-28.7 64-64 64L64 480c-35.3 0-64-28.7-64-64L0 96zM337 209L209 337c-9.4 9.4-24.6 9.4-33.9 0l-64-64c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l47 47L303 175c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9z"]},zS=hvA;var OS={prefix:"far",iconName:"square",icon:[448,512,[9632,9723,9724,61590],"f0c8","M384 80c8.8 0 16 7.2 16 16l0 320c0 8.8-7.2 16-16 16L64 432c-8.8 0-16-7.2-16-16L48 96c0-8.8 7.2-16 16-16l320 0zM64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32z"]};var LW={prefix:"far",iconName:"clock",icon:[512,512,[128339,"clock-four"],"f017","M464 256A208 208 0 1 1 48 256a208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM232 120l0 136c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2 280 120c0-13.3-10.7-24-24-24s-24 10.7-24 24z"]};var E5={prefix:"fas",iconName:"trash-can",icon:[448,512,[61460,"trash-alt"],"f2ed","M135.2 17.7C140.6 6.8 151.7 0 163.8 0L284.2 0c12.1 0 23.2 6.8 28.6 17.7L320 32l96 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 96C14.3 96 0 81.7 0 64S14.3 32 32 32l96 0 7.2-14.3zM32 128l384 0 0 320c0 35.3-28.7 64-64 64L96 512c-35.3 0-64-28.7-64-64l0-320zm96 64c-8.8 0-16 7.2-16 16l0 224c0 8.8 7.2 16 16 16s16-7.2 16-16l0-224c0-8.8-7.2-16-16-16zm96 0c-8.8 0-16 7.2-16 16l0 224c0 8.8 7.2 16 16 16s16-7.2 16-16l0-224c0-8.8-7.2-16-16-16zm96 0c-8.8 0-16 7.2-16 16l0 224c0 8.8 7.2 16 16 16s16-7.2 16-16l0-224c0-8.8-7.2-16-16-16z"]};var FW={prefix:"fas",iconName:"down-left-and-up-right-to-center",icon:[512,512,["compress-alt"],"f422","M439 7c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2s-12.5 14.8-22.2 14.8l-144 0c-13.3 0-24-10.7-24-24l0-144c0-9.7 5.8-18.5 14.8-22.2s19.3-1.7 26.2 5.2l39 39L439 7zM72 272l144 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39L73 505c-9.4 9.4-24.6 9.4-33.9 0L7 473c-9.4-9.4-9.4-24.6 0-33.9l87-87L55 313c-6.9-6.9-8.9-17.2-5.2-26.2s12.5-14.8 22.2-14.8z"]};var sE={prefix:"fas",iconName:"caret-right",icon:[256,512,[],"f0da","M246.6 278.6c12.5-12.5 12.5-32.8 0-45.3l-128-128c-9.2-9.2-22.9-11.9-34.9-6.9s-19.8 16.6-19.8 29.6l0 256c0 12.9 7.8 24.6 19.8 29.6s25.7 2.2 34.9-6.9l128-128z"]};var PS={prefix:"fas",iconName:"paste",icon:[512,512,["file-clipboard"],"f0ea","M160 0c-23.7 0-44.4 12.9-55.4 32L48 32C21.5 32 0 53.5 0 80L0 400c0 26.5 21.5 48 48 48l144 0 0-272c0-44.2 35.8-80 80-80l48 0 0-16c0-26.5-21.5-48-48-48l-56.6 0C204.4 12.9 183.7 0 160 0zM272 128c-26.5 0-48 21.5-48 48l0 272 0 16c0 26.5 21.5 48 48 48l192 0c26.5 0 48-21.5 48-48l0-220.1c0-12.7-5.1-24.9-14.1-33.9l-67.9-67.9c-9-9-21.2-14.1-33.9-14.1L320 128l-48 0zM160 40a24 24 0 1 1 0 48 24 24 0 1 1 0-48z"]};var NW={prefix:"fas",iconName:"circle-notch",icon:[512,512,[],"f1ce","M222.7 32.1c5 16.9-4.6 34.8-21.5 39.8C121.8 95.6 64 169.1 64 256c0 106 86 192 192 192s192-86 192-192c0-86.9-57.8-160.4-137.1-184.1c-16.9-5-26.6-22.9-21.5-39.8s22.9-26.6 39.8-21.5C434.9 42.1 512 140 512 256c0 141.4-114.6 256-256 256S0 397.4 0 256C0 140 77.1 42.1 182.9 10.6c16.9-5 34.8 4.6 39.8 21.5z"]};var uvA={prefix:"fas",iconName:"scissors",icon:[512,512,[9984,9986,9988,"cut"],"f0c4","M256 192l-39.5-39.5c4.9-12.6 7.5-26.2 7.5-40.5C224 50.1 173.9 0 112 0S0 50.1 0 112s50.1 112 112 112c14.3 0 27.9-2.7 40.5-7.5L192 256l-39.5 39.5c-12.6-4.9-26.2-7.5-40.5-7.5C50.1 288 0 338.1 0 400s50.1 112 112 112s112-50.1 112-112c0-14.3-2.7-27.9-7.5-40.5L499.2 76.8c7.1-7.1 7.1-18.5 0-25.6c-28.3-28.3-74.1-28.3-102.4 0L256 192zm22.6 150.6L396.8 460.8c28.3 28.3 74.1 28.3 102.4 0c7.1-7.1 7.1-18.5 0-25.6L342.6 278.6l-64 64zM64 112a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zm48 240a48 48 0 1 1 0 96 48 48 0 1 1 0-96z"]},cC=uvA;var fvA={prefix:"fas",iconName:"square-caret-down",icon:[448,512,["caret-square-down"],"f150","M384 480c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0zM224 352c-6.7 0-13-2.8-17.6-7.7l-104-112c-6.5-7-8.2-17.2-4.4-25.9s12.5-14.4 22-14.4l208 0c9.5 0 18.2 5.7 22 14.4s2.1 18.9-4.4 25.9l-104 112c-4.5 4.9-10.9 7.7-17.6 7.7z"]},_W=fvA;var GW={prefix:"fas",iconName:"caret-left",icon:[256,512,[],"f0d9","M9.4 278.6c-12.5-12.5-12.5-32.8 0-45.3l128-128c9.2-9.2 22.9-11.9 34.9-6.9s19.8 16.6 19.8 29.6l0 256c0 12.9-7.8 24.6-19.8 29.6s-25.7 2.2-34.9-6.9l-128-128z"]};var mvA={prefix:"fas",iconName:"square-check",icon:[448,512,[9745,9989,61510,"check-square"],"f14a","M64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32zM337 209L209 337c-9.4 9.4-24.6 9.4-33.9 0l-64-64c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l47 47L303 175c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9z"]},jS=mvA;var pvA={prefix:"fas",iconName:"pen-to-square",icon:[512,512,["edit"],"f044","M471.6 21.7c-21.9-21.9-57.3-21.9-79.2 0L362.3 51.7l97.9 97.9 30.1-30.1c21.9-21.9 21.9-57.3 0-79.2L471.6 21.7zm-299.2 220c-6.1 6.1-10.8 13.6-13.5 21.9l-29.6 88.8c-2.9 8.6-.6 18.1 5.8 24.6s15.9 8.7 24.6 5.8l88.8-29.6c8.2-2.7 15.7-7.4 21.9-13.5L437.7 172.3 339.7 74.3 172.4 241.7zM96 64C43 64 0 107 0 160L0 416c0 53 43 96 96 96l256 0c53 0 96-43 96-96l0-96c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 96c0 17.7-14.3 32-32 32L96 448c-17.7 0-32-14.3-32-32l0-256c0-17.7 14.3-32 32-32l96 0c17.7 0 32-14.3 32-32s-14.3-32-32-32L96 64z"]},UW=pvA;var KW={prefix:"fas",iconName:"chevron-up",icon:[512,512,[],"f077","M233.4 105.4c12.5-12.5 32.8-12.5 45.3 0l192 192c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L256 173.3 86.6 342.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l192-192z"]};var qS={prefix:"fas",iconName:"angle-right",icon:[320,512,[8250],"f105","M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-160 160c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 73.4 118.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l160 160z"]};var wvA={prefix:"fas",iconName:"square-caret-up",icon:[448,512,["caret-square-up"],"f151","M64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64L64 32zM224 160c6.7 0 13 2.8 17.6 7.7l104 112c6.5 7 8.2 17.2 4.4 25.9s-12.5 14.4-22 14.4l-208 0c-9.5 0-18.2-5.7-22-14.4s-2.1-18.9 4.4-25.9l104-112c4.5-4.9 10.9-7.7 17.6-7.7z"]},YW=wvA;var VS={prefix:"fas",iconName:"caret-up",icon:[320,512,[],"f0d8","M182.6 137.4c-12.5-12.5-32.8-12.5-45.3 0l-128 128c-9.2 9.2-11.9 22.9-6.9 34.9s16.6 19.8 29.6 19.8l256 0c12.9 0 24.6-7.8 29.6-19.8s2.2-25.7-6.9-34.9l-128-128z"]};var ZS={prefix:"fas",iconName:"square",icon:[448,512,[9632,9723,9724,61590],"f0c8","M0 96C0 60.7 28.7 32 64 32H384c35.3 0 64 28.7 64 64V416c0 35.3-28.7 64-64 64H64c-35.3 0-64-28.7-64-64V96z"]};var s4={prefix:"fas",iconName:"filter",icon:[512,512,[],"f0b0","M3.9 54.9C10.5 40.9 24.5 32 40 32l432 0c15.5 0 29.5 8.9 36.1 22.9s4.6 30.5-5.2 42.5L320 320.9 320 448c0 12.1-6.8 23.2-17.7 28.6s-23.8 4.3-33.5-3l-64-48c-8.1-6-12.8-15.5-12.8-25.6l0-79.1L9 97.3C-.7 85.4-2.8 68.8 3.9 54.9z"]};var a4={prefix:"fas",iconName:"code",icon:[640,512,[],"f121","M392.8 1.2c-17-4.9-34.7 5-39.6 22l-128 448c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l128-448c4.9-17-5-34.7-22-39.6zm80.6 120.1c-12.5 12.5-12.5 32.8 0 45.3L562.7 256l-89.4 89.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l112-112c12.5-12.5 12.5-32.8 0-45.3l-112-112c-12.5-12.5-32.8-12.5-45.3 0zm-306.7 0c-12.5-12.5-32.8-12.5-45.3 0l-112 112c-12.5 12.5-12.5 32.8 0 45.3l112 112c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256l89.4-89.4c12.5-12.5 12.5-32.8 0-45.3z"]};var L0={prefix:"fas",iconName:"wrench",icon:[512,512,[128295],"f0ad","M352 320c88.4 0 160-71.6 160-160c0-15.3-2.2-30.1-6.2-44.2c-3.1-10.8-16.4-13.2-24.3-5.3l-76.8 76.8c-3 3-7.1 4.7-11.3 4.7L336 192c-8.8 0-16-7.2-16-16l0-57.4c0-4.2 1.7-8.3 4.7-11.3l76.8-76.8c7.9-7.9 5.4-21.2-5.3-24.3C382.1 2.2 367.3 0 352 0C263.6 0 192 71.6 192 160c0 19.1 3.4 37.5 9.5 54.5L19.9 396.1C7.2 408.8 0 426.1 0 444.1C0 481.6 30.4 512 67.9 512c18 0 35.3-7.2 48-19.9L297.5 310.5c17 6.2 35.4 9.5 54.5 9.5zM80 408a24 24 0 1 1 0 48 24 24 0 1 1 0-48z"]};var JW={prefix:"fas",iconName:"eye",icon:[576,512,[128065],"f06e","M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM144 256a144 144 0 1 1 288 0 144 144 0 1 1 -288 0zm144-64c0 35.3-28.7 64-64 64c-7.1 0-13.9-1.2-20.3-3.3c-5.5-1.8-11.9 1.6-11.7 7.4c.3 6.9 1.3 13.8 3.2 20.7c13.7 51.2 66.4 81.6 117.6 67.9s81.6-66.4 67.9-117.6c-11.1-41.5-47.8-69.4-88.6-71.1c-5.8-.2-9.2 6.1-7.4 11.7c2.1 6.4 3.3 13.2 3.3 20.3z"]};var lC={prefix:"fas",iconName:"pen",icon:[512,512,[128394],"f304","M362.7 19.3L314.3 67.7 444.3 197.7l48.4-48.4c25-25 25-65.5 0-90.5L453.3 19.3c-25-25-65.5-25-90.5 0zm-71 71L58.6 323.5c-10.4 10.4-18 23.3-22.2 37.4L1 481.2C-1.5 489.7 .8 498.8 7 505s15.3 8.5 23.7 6.1l120.3-35.4c14.1-4.2 27-11.8 37.4-22.2L421.7 220.3 291.7 90.3z"]};var DvA={prefix:"fas",iconName:"arrow-rotate-right",icon:[512,512,[8635,"arrow-right-rotate","arrow-rotate-forward","redo"],"f01e","M386.3 160L336 160c-17.7 0-32 14.3-32 32s14.3 32 32 32l128 0c17.7 0 32-14.3 32-32l0-128c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 51.2L414.4 97.6c-87.5-87.5-229.3-87.5-316.8 0s-87.5 229.3 0 316.8s229.3 87.5 316.8 0c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0c-62.5 62.5-163.8 62.5-226.3 0s-62.5-163.8 0-226.3s163.8-62.5 226.3 0L386.3 160z"]};var Q5=DvA;var yvA={prefix:"fas",iconName:"arrow-rotate-left",icon:[512,512,[8634,"arrow-left-rotate","arrow-rotate-back","arrow-rotate-backward","undo"],"f0e2","M125.7 160l50.3 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L48 224c-17.7 0-32-14.3-32-32L16 64c0-17.7 14.3-32 32-32s32 14.3 32 32l0 51.2L97.6 97.6c87.5-87.5 229.3-87.5 316.8 0s87.5 229.3 0 316.8s-229.3 87.5-316.8 0c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0c62.5 62.5 163.8 62.5 226.3 0s62.5-163.8 0-226.3s-163.8-62.5-226.3 0L125.7 160z"]};var h5=yvA;var vvA={prefix:"fas",iconName:"crop-simple",icon:[512,512,["crop-alt"],"f565","M128 32c0-17.7-14.3-32-32-32S64 14.3 64 32l0 32L32 64C14.3 64 0 78.3 0 96s14.3 32 32 32l32 0 0 256c0 35.3 28.7 64 64 64l224 0 0-64-224 0 0-352zM384 480c0 17.7 14.3 32 32 32s32-14.3 32-32l0-32 32 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-32 0 0-256c0-35.3-28.7-64-64-64L160 64l0 64 224 0 0 352z"]},TW=vvA;var bvA={prefix:"fas",iconName:"gear",icon:[512,512,[9881,"cog"],"f013","M495.9 166.6c3.2 8.7 .5 18.4-6.4 24.6l-43.3 39.4c1.1 8.3 1.7 16.8 1.7 25.4s-.6 17.1-1.7 25.4l43.3 39.4c6.9 6.2 9.6 15.9 6.4 24.6c-4.4 11.9-9.7 23.3-15.8 34.3l-4.7 8.1c-6.6 11-14 21.4-22.1 31.2c-5.9 7.2-15.7 9.6-24.5 6.8l-55.7-17.7c-13.4 10.3-28.2 18.9-44 25.4l-12.5 57.1c-2 9.1-9 16.3-18.2 17.8c-13.8 2.3-28 3.5-42.5 3.5s-28.7-1.2-42.5-3.5c-9.2-1.5-16.2-8.7-18.2-17.8l-12.5-57.1c-15.8-6.5-30.6-15.1-44-25.4L83.1 425.9c-8.8 2.8-18.6 .3-24.5-6.8c-8.1-9.8-15.5-20.2-22.1-31.2l-4.7-8.1c-6.1-11-11.4-22.4-15.8-34.3c-3.2-8.7-.5-18.4 6.4-24.6l43.3-39.4C64.6 273.1 64 264.6 64 256s.6-17.1 1.7-25.4L22.4 191.2c-6.9-6.2-9.6-15.9-6.4-24.6c4.4-11.9 9.7-23.3 15.8-34.3l4.7-8.1c6.6-11 14-21.4 22.1-31.2c5.9-7.2 15.7-9.6 24.5-6.8l55.7 17.7c13.4-10.3 28.2-18.9 44-25.4l12.5-57.1c2-9.1 9-16.3 18.2-17.8C227.3 1.2 241.5 0 256 0s28.7 1.2 42.5 3.5c9.2 1.5 16.2 8.7 18.2 17.8l12.5 57.1c15.8 6.5 30.6 15.1 44 25.4l55.7-17.7c8.8-2.8 18.6-.3 24.5 6.8c8.1 9.8 15.5 20.2 22.1 31.2l4.7 8.1c6.1 11 11.4 22.4 15.8 34.3zM256 336a80 80 0 1 0 0-160 80 80 0 1 0 0 160z"]},HW=bvA;var mg={prefix:"fas",iconName:"caret-down",icon:[320,512,[],"f0d7","M137.4 374.6c12.5 12.5 32.8 12.5 45.3 0l128-128c9.2-9.2 11.9-22.9 6.9-34.9s-16.6-19.8-29.6-19.8L32 192c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9l128 128z"]};var MvA={prefix:"fas",iconName:"ellipsis-vertical",icon:[128,512,["ellipsis-v"],"f142","M64 360a56 56 0 1 0 0 112 56 56 0 1 0 0-112zm0-160a56 56 0 1 0 0 112 56 56 0 1 0 0-112zM120 96A56 56 0 1 0 8 96a56 56 0 1 0 112 0z"]},WS=MvA;var c4={prefix:"fas",iconName:"arrow-right-arrow-left",icon:[448,512,[8644,"exchange"],"f0ec","M438.6 150.6c12.5-12.5 12.5-32.8 0-45.3l-96-96c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L338.7 96 32 96C14.3 96 0 110.3 0 128s14.3 32 32 32l306.7 0-41.4 41.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l96-96zm-333.3 352c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 416 416 416c17.7 0 32-14.3 32-32s-14.3-32-32-32l-306.7 0 41.4-41.4c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3l96 96z"]};var kvA={prefix:"fas",iconName:"arrow-down-short-wide",icon:[576,512,["sort-amount-desc","sort-amount-down-alt"],"f884","M151.6 469.6C145.5 476.2 137 480 128 480s-17.5-3.8-23.6-10.4l-88-96c-11.9-13-11.1-33.3 2-45.2s33.3-11.1 45.2 2L96 365.7 96 64c0-17.7 14.3-32 32-32s32 14.3 32 32l0 301.7 32.4-35.4c11.9-13 32.2-13.9 45.2-2s13.9 32.2 2 45.2l-88 96zM320 32l32 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-32 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l96 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-96 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l160 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-160 0c-17.7 0-32-14.3-32-32s14.3-32 32-32zm0 128l224 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-224 0c-17.7 0-32-14.3-32-32s14.3-32 32-32z"]};var l4=kvA;var zW={prefix:"fas",iconName:"angle-down",icon:[448,512,[8964],"f107","M201.4 374.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 306.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"]};var XS={prefix:"fas",iconName:"arrow-down",icon:[384,512,[8595],"f063","M169.4 470.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 370.8 224 64c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 306.7L54.6 265.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z"]};var SvA={prefix:"fas",iconName:"magnifying-glass",icon:[512,512,[128269,"search"],"f002","M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208zM208 352a144 144 0 1 0 0-288 144 144 0 1 0 0 288z"]},g4=SvA;var OW={prefix:"fas",iconName:"chevron-down",icon:[512,512,[],"f078","M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z"]};var F0={prefix:"fas",iconName:"copy",icon:[448,512,[],"f0c5","M208 0L332.1 0c12.7 0 24.9 5.1 33.9 14.1l67.9 67.9c9 9 14.1 21.2 14.1 33.9L448 336c0 26.5-21.5 48-48 48l-192 0c-26.5 0-48-21.5-48-48l0-288c0-26.5 21.5-48 48-48zM48 128l80 0 0 64-64 0 0 256 192 0 0-32 64 0 0 48c0 26.5-21.5 48-48 48L48 512c-26.5 0-48-21.5-48-48L0 176c0-26.5 21.5-48 48-48z"]};var gC={prefix:"fas",iconName:"plus",icon:[448,512,[10133,61543,"add"],"2b","M256 80c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 144L48 224c-17.7 0-32 14.3-32 32s14.3 32 32 32l144 0 0 144c0 17.7 14.3 32 32 32s32-14.3 32-32l0-144 144 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-144 0 0-144z"]};var PW={prefix:"fas",iconName:"xmark",icon:[384,512,[128473,10005,10006,10060,215,"close","multiply","remove","times"],"f00d","M342.6 150.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L192 210.7 86.6 105.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3L146.7 256 41.4 361.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L192 301.3 297.4 406.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L237.3 256 342.6 150.6z"]},jW=PW;var I4=PW;var qW={prefix:"fas",iconName:"rotate",icon:[512,512,[128260,"sync-alt"],"f2f1","M142.9 142.9c-17.5 17.5-30.1 38-37.8 59.8c-5.9 16.7-24.2 25.4-40.8 19.5s-25.4-24.2-19.5-40.8C55.6 150.7 73.2 122 97.6 97.6c87.2-87.2 228.3-87.5 315.8-1L455 55c6.9-6.9 17.2-8.9 26.2-5.2s14.8 12.5 14.8 22.2l0 128c0 13.3-10.7 24-24 24l-8.4 0c0 0 0 0 0 0L344 224c-9.7 0-18.5-5.8-22.2-14.8s-1.7-19.3 5.2-26.2l41.1-41.1c-62.6-61.5-163.1-61.2-225.3 1zM16 312c0-13.3 10.7-24 24-24l7.6 0 .7 0L168 288c9.7 0 18.5 5.8 22.2 14.8s1.7 19.3-5.2 26.2l-41.1 41.1c62.6 61.5 163.1 61.2 225.3-1c17.5-17.5 30.1-38 37.8-59.8c5.9-16.7 24.2-25.4 40.8-19.5s25.4 24.2 19.5 40.8c-10.8 30.6-28.4 59.3-52.9 83.8c-87.2 87.2-228.3 87.5-315.8 1L57 457c-6.9 6.9-17.2 8.9-26.2 5.2S16 449.7 16 440l0-119.6 0-.7 0-7.6z"]};var VW={prefix:"fas",iconName:"up-right-and-down-left-from-center",icon:[512,512,["expand-alt"],"f424","M344 0L488 0c13.3 0 24 10.7 24 24l0 144c0 9.7-5.8 18.5-14.8 22.2s-19.3 1.7-26.2-5.2l-39-39-87 87c-9.4 9.4-24.6 9.4-33.9 0l-32-32c-9.4-9.4-9.4-24.6 0-33.9l87-87L327 41c-6.9-6.9-8.9-17.2-5.2-26.2S334.3 0 344 0zM168 512L24 512c-13.3 0-24-10.7-24-24L0 344c0-9.7 5.8-18.5 14.8-22.2s19.3-1.7 26.2 5.2l39 39 87-87c9.4-9.4 24.6-9.4 33.9 0l32 32c9.4 9.4 9.4 24.6 0 33.9l-87 87 39 39c6.9 6.9 8.9 17.2 5.2 26.2s-12.5 14.8-22.2 14.8z"]};var $S={prefix:"fas",iconName:"clone",icon:[512,512,[],"f24d","M288 448L64 448l0-224 64 0 0-64-64 0c-35.3 0-64 28.7-64 64L0 448c0 35.3 28.7 64 64 64l224 0c35.3 0 64-28.7 64-64l0-64-64 0 0 64zm-64-96l224 0c35.3 0 64-28.7 64-64l0-224c0-35.3-28.7-64-64-64L224 0c-35.3 0-64 28.7-64 64l0 224c0 35.3 28.7 64 64 64z"]};var u5={prefix:"fas",iconName:"check",icon:[448,512,[10003,10004],"f00c","M438.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L160 338.7 393.4 105.4c12.5-12.5 32.8-12.5 45.3 0z"]};var RvA={prefix:"fas",iconName:"triangle-exclamation",icon:[512,512,[9888,"exclamation-triangle","warning"],"f071","M256 32c14.2 0 27.3 7.5 34.5 19.8l216 368c7.3 12.4 7.3 27.7 .2 40.1S486.3 480 472 480L40 480c-14.3 0-27.6-7.7-34.7-20.1s-7-27.8 .2-40.1l216-368C228.7 39.5 241.8 32 256 32zm0 128c-13.3 0-24 10.7-24 24l0 112c0 13.3 10.7 24 24 24s24-10.7 24-24l0-112c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z"]},g1=RvA;var OrA=jQ(XW(),1);var $W=Number.isNaN||function(e){return typeof e=="number"&&e!==e};function xvA(t,e){return!!(t===e||$W(t)&&$W(e))}function LvA(t,e){if(t.length!==e.length)return!1;for(var A=0;A{if(typeof n!="object"||!n.name||!n.init)throw new Error("Invalid JSEP plugin format");this.registered[n.name]||(n.init(this.jsep),this.registered[n.name]=n)})}},Ra=class t{static get version(){return"1.4.0"}static toString(){return"JavaScript Expression Parser (JSEP) v"+t.version}static addUnaryOp(e){return t.max_unop_len=Math.max(e.length,t.max_unop_len),t.unary_ops[e]=1,t}static addBinaryOp(e,A,i){return t.max_binop_len=Math.max(e.length,t.max_binop_len),t.binary_ops[e]=A,i?t.right_associative.add(e):t.right_associative.delete(e),t}static addIdentifierChar(e){return t.additional_identifier_chars.add(e),t}static addLiteral(e,A){return t.literals[e]=A,t}static removeUnaryOp(e){return delete t.unary_ops[e],e.length===t.max_unop_len&&(t.max_unop_len=t.getMaxKeyLen(t.unary_ops)),t}static removeAllUnaryOps(){return t.unary_ops={},t.max_unop_len=0,t}static removeIdentifierChar(e){return t.additional_identifier_chars.delete(e),t}static removeBinaryOp(e){return delete t.binary_ops[e],e.length===t.max_binop_len&&(t.max_binop_len=t.getMaxKeyLen(t.binary_ops)),t.right_associative.delete(e),t}static removeAllBinaryOps(){return t.binary_ops={},t.max_binop_len=0,t}static removeLiteral(e){return delete t.literals[e],t}static removeAllLiterals(){return t.literals={},t}get char(){return this.expr.charAt(this.index)}get code(){return this.expr.charCodeAt(this.index)}constructor(e){this.expr=e,this.index=0}static parse(e){return new t(e).parse()}static getMaxKeyLen(e){return Math.max(0,...Object.keys(e).map(A=>A.length))}static isDecimalDigit(e){return e>=48&&e<=57}static binaryPrecedence(e){return t.binary_ops[e]||0}static isIdentifierStart(e){return e>=65&&e<=90||e>=97&&e<=122||e>=128&&!t.binary_ops[String.fromCharCode(e)]||t.additional_identifier_chars.has(String.fromCharCode(e))}static isIdentifierPart(e){return t.isIdentifierStart(e)||t.isDecimalDigit(e)}throwError(e){let A=new Error(e+" at character "+this.index);throw A.index=this.index,A.description=e,A}runHook(e,A){if(t.hooks[e]){let i={context:this,node:A};return t.hooks.run(e,i),i.node}return A}searchHook(e){if(t.hooks[e]){let A={context:this};return t.hooks[e].find(function(i){return i.call(A.context,A),A.node}),A.node}}gobbleSpaces(){let e=this.code;for(;e===t.SPACE_CODE||e===t.TAB_CODE||e===t.LF_CODE||e===t.CR_CODE;)e=this.expr.charCodeAt(++this.index);this.runHook("gobble-spaces")}parse(){this.runHook("before-all");let e=this.gobbleExpressions(),A=e.length===1?e[0]:{type:t.COMPOUND,body:e};return this.runHook("after-all",A)}gobbleExpressions(e){let A=[],i,n;for(;this.index0;){if(t.binary_ops.hasOwnProperty(e)&&(!t.isIdentifierStart(this.code)||this.index+e.lengtho.right_a&&I.right_a?i>I.prec:i<=I.prec;for(;n.length>2&&l(n[n.length-2]);)s=n.pop(),A=n.pop().value,r=n.pop(),e={type:t.BINARY_EXP,operator:A,left:r,right:s},n.push(e);e=this.gobbleToken(),e||this.throwError("Expected expression after "+c),n.push(o,e)}for(a=n.length-1,e=n[a];a>1;)e={type:t.BINARY_EXP,operator:n[a-1].value,left:n[a-2],right:e},a-=2;return e}gobbleToken(){let e,A,i,n;if(this.gobbleSpaces(),n=this.searchHook("gobble-token"),n)return this.runHook("after-token",n);if(e=this.code,t.isDecimalDigit(e)||e===t.PERIOD_CODE)return this.gobbleNumericLiteral();if(e===t.SQUOTE_CODE||e===t.DQUOTE_CODE)n=this.gobbleStringLiteral();else if(e===t.OBRACK_CODE)n=this.gobbleArray();else{for(A=this.expr.substr(this.index,t.max_unop_len),i=A.length;i>0;){if(t.unary_ops.hasOwnProperty(A)&&(!t.isIdentifierStart(this.code)||this.index+A.length=A.length&&this.throwError("Unexpected token "+String.fromCharCode(e));break}else if(o===t.COMMA_CODE){if(this.index++,n++,n!==A.length){if(e===t.CPAREN_CODE)this.throwError("Unexpected token ,");else if(e===t.CBRACK_CODE)for(let r=A.length;r":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10,"**":11},right_associative:new Set(["**"]),additional_identifier_chars:new Set(["$","_"]),literals:{true:!0,false:!1,null:null},this_str:"this"});Ra.max_unop_len=Ra.getMaxKeyLen(Ra.unary_ops);Ra.max_binop_len=Ra.getMaxKeyLen(Ra.binary_ops);var Y0=t=>new Ra(t).parse(),oRA=Object.getOwnPropertyNames(class{});Object.getOwnPropertyNames(Ra).filter(t=>!oRA.includes(t)&&Y0[t]===void 0).forEach(t=>{Y0[t]=Ra[t]});Y0.Jsep=Ra;var rRA="ConditionalExpression",sRA={name:"ternary",init(t){t.hooks.add("after-expression",function(A){if(A.node&&this.code===t.QUMARK_CODE){this.index++;let i=A.node,n=this.gobbleExpression();if(n||this.throwError("Expected expression"),this.gobbleSpaces(),this.code===t.COLON_CODE){this.index++;let o=this.gobbleExpression();if(o||this.throwError("Expected expression"),A.node={type:rRA,test:i,consequent:n,alternate:o},i.operator&&t.binary_ops[i.operator]<=.9){let r=i;for(;r.right.operator&&t.binary_ops[r.right.operator]<=.9;)r=r.right;A.node.test=r.right,r.right=A.node,A.node=i}}else this.throwError("Expected :")}})}};Y0.plugins.register(sRA);var UAA=47,aRA=92,cRA={name:"regex",init(t){t.hooks.add("gobble-token",function(A){if(this.code===UAA){let i=++this.index,n=!1;for(;this.index=97&&a<=122||a>=65&&a<=90||a>=48&&a<=57)r+=this.char;else break}let s;try{s=new RegExp(o,r)}catch(a){this.throwError(a.message)}return A.node={type:t.LITERAL,value:s,raw:this.expr.slice(i-1,this.index)},A.node=this.gobbleTokenProperty(A.node),A.node}this.code===t.OBRACK_CODE?n=!0:n&&this.code===t.CBRACK_CODE&&(n=!1),this.index+=this.code===aRA?2:1}this.throwError("Unclosed Regex")}})}},Ux=43,lRA=45,pE={name:"assignment",assignmentOperators:new Set(["=","*=","**=","/=","%=","+=","-=","<<=",">>=",">>>=","&=","^=","|=","||=","&&=","??="]),updateOperators:[Ux,lRA],assignmentPrecedence:.9,init(t){let e=[t.IDENTIFIER,t.MEMBER_EXP];pE.assignmentOperators.forEach(i=>t.addBinaryOp(i,pE.assignmentPrecedence,!0)),t.hooks.add("gobble-token",function(n){let o=this.code;pE.updateOperators.some(r=>r===o&&r===this.expr.charCodeAt(this.index+1))&&(this.index+=2,n.node={type:"UpdateExpression",operator:o===Ux?"++":"--",argument:this.gobbleTokenProperty(this.gobbleIdentifier()),prefix:!0},(!n.node.argument||!e.includes(n.node.argument.type))&&this.throwError(`Unexpected ${n.node.operator}`))}),t.hooks.add("after-token",function(n){if(n.node){let o=this.code;pE.updateOperators.some(r=>r===o&&r===this.expr.charCodeAt(this.index+1))&&(e.includes(n.node.type)||this.throwError(`Unexpected ${n.node.operator}`),this.index+=2,n.node={type:"UpdateExpression",operator:o===Ux?"++":"--",argument:n.node,prefix:!1})}}),t.hooks.add("after-expression",function(n){n.node&&A(n.node)});function A(i){pE.assignmentOperators.has(i.operator)?(i.type="AssignmentExpression",A(i.left),A(i.right)):i.operator||Object.values(i).forEach(n=>{n&&typeof n=="object"&&A(n)})}}};Y0.plugins.register(cRA,pE);Y0.addUnaryOp("typeof");Y0.addLiteral("null",null);Y0.addLiteral("undefined",void 0);var gRA=new Set(["constructor","__proto__","__defineGetter__","__defineSetter__"]),so={evalAst(t,e){switch(t.type){case"BinaryExpression":case"LogicalExpression":return so.evalBinaryExpression(t,e);case"Compound":return so.evalCompound(t,e);case"ConditionalExpression":return so.evalConditionalExpression(t,e);case"Identifier":return so.evalIdentifier(t,e);case"Literal":return so.evalLiteral(t,e);case"MemberExpression":return so.evalMemberExpression(t,e);case"UnaryExpression":return so.evalUnaryExpression(t,e);case"ArrayExpression":return so.evalArrayExpression(t,e);case"CallExpression":return so.evalCallExpression(t,e);case"AssignmentExpression":return so.evalAssignmentExpression(t,e);default:throw SyntaxError("Unexpected expression",t)}},evalBinaryExpression(t,e){return{"||":(i,n)=>i||n(),"&&":(i,n)=>i&&n(),"|":(i,n)=>i|n(),"^":(i,n)=>i^n(),"&":(i,n)=>i&n(),"==":(i,n)=>i==n(),"!=":(i,n)=>i!=n(),"===":(i,n)=>i===n(),"!==":(i,n)=>i!==n(),"<":(i,n)=>i":(i,n)=>i>n(),"<=":(i,n)=>i<=n(),">=":(i,n)=>i>=n(),"<<":(i,n)=>i<>":(i,n)=>i>>n(),">>>":(i,n)=>i>>>n(),"+":(i,n)=>i+n(),"-":(i,n)=>i-n(),"*":(i,n)=>i*n(),"/":(i,n)=>i/n(),"%":(i,n)=>i%n()}[t.operator](so.evalAst(t.left,e),()=>so.evalAst(t.right,e))},evalCompound(t,e){let A;for(let i=0;i-so.evalAst(i,e),"!":i=>!so.evalAst(i,e),"~":i=>~so.evalAst(i,e),"+":i=>+so.evalAst(i,e),typeof:i=>typeof so.evalAst(i,e)}[t.operator](t.argument)},evalArrayExpression(t,e){return t.elements.map(A=>so.evalAst(A,e))},evalCallExpression(t,e){let A=t.arguments.map(n=>so.evalAst(n,e));return so.evalAst(t.callee,e)(...A)},evalAssignmentExpression(t,e){if(t.left.type!=="Identifier")throw SyntaxError("Invalid left-hand side in assignment");let A=t.left.name,i=so.evalAst(t.right,e);return e[A]=i,e[A]}},Jx=class{constructor(e){this.code=e,this.ast=Y0(this.code)}runInNewContext(e){let A=Object.assign(Object.create(null),e);return so.evalAst(this.ast,A)}};function u1(t,e){return t=t.slice(),t.push(e),t}function Tx(t,e){return e=e.slice(),e.unshift(t),e}var Hx=class extends Error{constructor(e){super('JSONPath should not be called with "new" (it prevents return of (unwrapped) scalar values)'),this.avoidNew=!0,this.value=e,this.name="NewError"}};function xn(t,e,A,i,n){if(!(this instanceof xn))try{return new xn(t,e,A,i,n)}catch(r){if(!r.avoidNew)throw r;return r.value}typeof t=="string"&&(n=i,i=A,A=e,e=t,t=null);let o=t&&typeof t=="object";if(t=t||{},this.json=t.json||A,this.path=t.path||e,this.resultType=t.resultType||"value",this.flatten=t.flatten||!1,this.wrap=Object.hasOwn(t,"wrap")?t.wrap:!0,this.sandbox=t.sandbox||{},this.eval=t.eval===void 0?"safe":t.eval,this.ignoreEvalErrors=typeof t.ignoreEvalErrors>"u"?!1:t.ignoreEvalErrors,this.parent=t.parent||null,this.parentProperty=t.parentProperty||null,this.callback=t.callback||i||null,this.otherTypeCallback=t.otherTypeCallback||n||function(){throw new TypeError("You must supply an otherTypeCallback callback option with the @other() operator.")},t.autostart!==!1){let r={path:o?t.path:e};o?"json"in t&&(r.json=t.json):r.json=A;let s=this.evaluate(r);if(!s||typeof s!="object")throw new Hx(s);return s}}xn.prototype.evaluate=function(t,e,A,i){let n=this.parent,o=this.parentProperty,{flatten:r,wrap:s}=this;if(this.currResultType=this.resultType,this.currEval=this.eval,this.currSandbox=this.sandbox,A=A||this.callback,this.currOtherTypeCallback=i||this.otherTypeCallback,e=e||this.json,t=t||this.path,t&&typeof t=="object"&&!Array.isArray(t)){if(!t.path&&t.path!=="")throw new TypeError('You must supply a "path" property when providing an object argument to JSONPath.evaluate().');if(!Object.hasOwn(t,"json"))throw new TypeError('You must supply a "json" property when providing an object argument to JSONPath.evaluate().');({json:e}=t),r=Object.hasOwn(t,"flatten")?t.flatten:r,this.currResultType=Object.hasOwn(t,"resultType")?t.resultType:this.currResultType,this.currSandbox=Object.hasOwn(t,"sandbox")?t.sandbox:this.currSandbox,s=Object.hasOwn(t,"wrap")?t.wrap:s,this.currEval=Object.hasOwn(t,"eval")?t.eval:this.currEval,A=Object.hasOwn(t,"callback")?t.callback:A,this.currOtherTypeCallback=Object.hasOwn(t,"otherTypeCallback")?t.otherTypeCallback:this.currOtherTypeCallback,n=Object.hasOwn(t,"parent")?t.parent:n,o=Object.hasOwn(t,"parentProperty")?t.parentProperty:o,t=t.path}if(n=n||null,o=o||null,Array.isArray(t)&&(t=xn.toPathString(t)),!t&&t!==""||!e)return;let a=xn.toPathArray(t);a[0]==="$"&&a.length>1&&a.shift(),this._hasParentSelector=null;let c=this._trace(a,e,["$"],n,o,A).filter(function(l){return l&&!l.isParentSelector});return c.length?!s&&c.length===1&&!c[0].hasArrExpr?this._getPreferredOutput(c[0]):c.reduce((l,I)=>{let C=this._getPreferredOutput(I);return r&&Array.isArray(C)?l=l.concat(C):l.push(C),l},[]):s?[]:void 0};xn.prototype._getPreferredOutput=function(t){let e=this.currResultType;switch(e){case"all":{let A=Array.isArray(t.path)?t.path:xn.toPathArray(t.path);return t.pointer=xn.toPointer(A),t.path=typeof t.path=="string"?t.path:xn.toPathString(t.path),t}case"value":case"parent":case"parentProperty":return t[e];case"path":return xn.toPathString(t[e]);case"pointer":return xn.toPointer(t.path);default:throw new TypeError("Unknown result type")}};xn.prototype._handleCallback=function(t,e,A){if(e){let i=this._getPreferredOutput(t);t.path=typeof t.path=="string"?t.path:xn.toPathString(t.path),e(i,A,t)}};xn.prototype._trace=function(t,e,A,i,n,o,r,s){let a;if(!t.length)return a={path:A,value:e,parent:i,parentProperty:n,hasArrExpr:r},this._handleCallback(a,o,"value"),a;let c=t[0],l=t.slice(1),I=[];function C(d){Array.isArray(d)?d.forEach(B=>{I.push(B)}):I.push(d)}if((typeof c!="string"||s)&&e&&Object.hasOwn(e,c))C(this._trace(l,e[c],u1(A,c),e,c,o,r));else if(c==="*")this._walk(e,d=>{C(this._trace(l,e[d],u1(A,d),e,d,o,!0,!0))});else if(c==="..")C(this._trace(l,e,A,i,n,o,r)),this._walk(e,d=>{typeof e[d]=="object"&&C(this._trace(t.slice(),e[d],u1(A,d),e,d,o,!0))});else{if(c==="^")return this._hasParentSelector=!0,{path:A.slice(0,-1),expr:l,isParentSelector:!0};if(c==="~")return a={path:u1(A,c),value:n,parent:i,parentProperty:null},this._handleCallback(a,o,"property"),a;if(c==="$")C(this._trace(l,e,A,null,null,o,r));else if(/^(-?\d*):(-?\d*):?(\d*)$/u.test(c))C(this._slice(c,l,e,A,i,n,o));else if(c.indexOf("?(")===0){if(this.currEval===!1)throw new Error("Eval [?(expr)] prevented in JSONPath expression.");let d=c.replace(/^\?\((.*?)\)$/u,"$1"),B=/@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(d);B?this._walk(e,E=>{let h=[B[2]],u=B[1]?e[E][B[1]]:e[E];this._trace(h,u,A,i,n,o,!0).length>0&&C(this._trace(l,e[E],u1(A,E),e,E,o,!0))}):this._walk(e,E=>{this._eval(d,e[E],E,A,i,n)&&C(this._trace(l,e[E],u1(A,E),e,E,o,!0))})}else if(c[0]==="("){if(this.currEval===!1)throw new Error("Eval [(expr)] prevented in JSONPath expression.");C(this._trace(Tx(this._eval(c,e,A.at(-1),A.slice(0,-1),i,n),l),e,A,i,n,o,r))}else if(c[0]==="@"){let d=!1,B=c.slice(1,-2);switch(B){case"scalar":(!e||!["object","function"].includes(typeof e))&&(d=!0);break;case"boolean":case"string":case"undefined":case"function":typeof e===B&&(d=!0);break;case"integer":Number.isFinite(e)&&!(e%1)&&(d=!0);break;case"number":Number.isFinite(e)&&(d=!0);break;case"nonFinite":typeof e=="number"&&!Number.isFinite(e)&&(d=!0);break;case"object":e&&typeof e===B&&(d=!0);break;case"array":Array.isArray(e)&&(d=!0);break;case"other":d=this.currOtherTypeCallback(e,A,i,n);break;case"null":e===null&&(d=!0);break;default:throw new TypeError("Unknown value type "+B)}if(d)return a={path:A,value:e,parent:i,parentProperty:n},this._handleCallback(a,o,"value"),a}else if(c[0]==="`"&&e&&Object.hasOwn(e,c.slice(1))){let d=c.slice(1);C(this._trace(l,e[d],u1(A,d),e,d,o,r,!0))}else if(c.includes(",")){let d=c.split(",");for(let B of d)C(this._trace(Tx(B,l),e,A,i,n,o,!0))}else!s&&e&&Object.hasOwn(e,c)&&C(this._trace(l,e[c],u1(A,c),e,c,o,r,!0))}if(this._hasParentSelector)for(let d=0;d{e(A)})};xn.prototype._slice=function(t,e,A,i,n,o,r){if(!Array.isArray(A))return;let s=A.length,a=t.split(":"),c=a[2]&&Number.parseInt(a[2])||1,l=a[0]&&Number.parseInt(a[0])||0,I=a[1]&&Number.parseInt(a[1])||s;l=l<0?Math.max(0,l+s):Math.min(s,l),I=I<0?Math.max(0,I+s):Math.min(s,I);let C=[];for(let d=l;d{C.push(E)});return C};xn.prototype._eval=function(t,e,A,i,n,o){this.currSandbox._$_parentProperty=o,this.currSandbox._$_parent=n,this.currSandbox._$_property=A,this.currSandbox._$_root=this.json,this.currSandbox._$_v=e;let r=t.includes("@path");r&&(this.currSandbox._$_path=xn.toPathString(i.concat([A])));let s=this.currEval+"Script:"+t;if(!xn.cache[s]){let a=t.replaceAll("@parentProperty","_$_parentProperty").replaceAll("@parent","_$_parent").replaceAll("@property","_$_property").replaceAll("@root","_$_root").replaceAll(/@([.\s)[])/gu,"_$_v$1");if(r&&(a=a.replaceAll("@path","_$_path")),this.currEval==="safe"||this.currEval===!0||this.currEval===void 0)xn.cache[s]=new this.safeVm.Script(a);else if(this.currEval==="native")xn.cache[s]=new this.vm.Script(a);else if(typeof this.currEval=="function"&&this.currEval.prototype&&Object.hasOwn(this.currEval.prototype,"runInNewContext")){let c=this.currEval;xn.cache[s]=new c(a)}else if(typeof this.currEval=="function")xn.cache[s]={runInNewContext:c=>this.currEval(a,c)};else throw new TypeError(`Unknown "eval" property "${this.currEval}"`)}try{return xn.cache[s].runInNewContext(this.currSandbox)}catch(a){if(this.ignoreEvalErrors)return!1;throw new Error("jsonPath: "+a.message+": "+t)}};xn.cache={};xn.toPathString=function(t){let e=t,A=e.length,i="$";for(let n=1;ntypeof e[c]=="function");let o=i.map(c=>e[c]);A=n.reduce((c,l)=>{let I=e[l].toString();return/function/u.test(I)||(I="function "+I),"var "+l+"="+I+";"+c},"")+A,!/(['"])use strict\1/u.test(A)&&!i.includes("arguments")&&(A="var arguments = undefined;"+A),A=A.replace(/;\s*$/u,"");let s=A.lastIndexOf(";"),a=s!==-1?A.slice(0,s+1)+" return "+A.slice(s+1):" return "+A;return new Function(...i,a)(...o)}};xn.prototype.vm={Script:zx};var Px=[],TAA=[];(()=>{let t="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(e=>e?parseInt(e,36):1);for(let e=0,A=0;e>1;if(t=TAA[i])e=i+1;else return!0;if(e==A)return!1}}function KAA(t){return t>=127462&&t<=127487}var YAA=8205;function HAA(t,e,A=!0,i=!0){return(A?zAA:dRA)(t,e,i)}function zAA(t,e,A){if(e==t.length)return e;e&&OAA(t.charCodeAt(e))&&PAA(t.charCodeAt(e-1))&&e--;let i=Ox(t,e);for(e+=JAA(i);e=0&&KAA(Ox(t,r));)o++,r-=2;if(o%2==0)break;e+=2}else break}return e}function dRA(t,e,A){for(;e>0;){let i=zAA(t,e-2,A);if(i=56320&&t<57344}function PAA(t){return t>=55296&&t<56320}function JAA(t){return t<65536?1:2}var In=class t{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,A,i){[e,A]=bE(this,e,A);let n=[];return this.decompose(0,e,n,2),i.length&&i.decompose(0,i.length,n,3),this.decompose(A,this.length,n,1),DE.from(n,this.length-(A-e)+i.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,A=this.length){[e,A]=bE(this,e,A);let i=[];return this.decompose(e,A,i,0),DE.from(i,A-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let A=this.scanIdentical(e,1),i=this.length-this.scanIdentical(e,-1),n=new pC(this),o=new pC(e);for(let r=A,s=A;;){if(n.next(r),o.next(r),r=0,n.lineBreak!=o.lineBreak||n.done!=o.done||n.value!=o.value)return!1;if(s+=n.value.length,n.done||s>=i)return!0}}iter(e=1){return new pC(this,e)}iterRange(e,A=this.length){return new sw(this,e,A)}iterLines(e,A){let i;if(e==null)i=this.iter();else{A==null&&(A=this.lines+1);let n=this.line(e).from;i=this.iterRange(n,Math.max(n,A==this.lines+1?this.length:A<=1?0:this.line(A-1).to))}return new aw(i)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError("A document must have at least one line");return e.length==1&&!e[0]?t.empty:e.length<=32?new cc(e):DE.from(cc.split(e,[]))}},cc=class t extends In{constructor(e,A=BRA(e)){super(),this.text=e,this.length=A}get lines(){return this.text.length}get children(){return null}lineInner(e,A,i,n){for(let o=0;;o++){let r=this.text[o],s=n+r.length;if((A?i:s)>=e)return new Vx(n,s,i,r);n=s+1,i++}}decompose(e,A,i,n){let o=e<=0&&A>=this.length?this:new t(jAA(this.text,e,A),Math.min(A,this.length)-Math.max(0,e));if(n&1){let r=i.pop(),s=rw(o.text,r.text.slice(),0,o.length);if(s.length<=32)i.push(new t(s,r.length+o.length));else{let a=s.length>>1;i.push(new t(s.slice(0,a)),new t(s.slice(a)))}}else i.push(o)}replace(e,A,i){if(!(i instanceof t))return super.replace(e,A,i);[e,A]=bE(this,e,A);let n=rw(this.text,rw(i.text,jAA(this.text,0,e)),A),o=this.length+i.length-(A-e);return n.length<=32?new t(n,o):DE.from(t.split(n,[]),o)}sliceString(e,A=this.length,i=` -`){[e,A]=bE(this,e,A);let n="";for(let o=0,r=0;o<=A&&re&&r&&(n+=i),eo&&(n+=s.slice(Math.max(0,e-o),A-o)),o=a+1}return n}flatten(e){for(let A of this.text)e.push(A)}scanIdentical(){return 0}static split(e,A){let i=[],n=-1;for(let o of e)i.push(o),n+=o.length+1,i.length==32&&(A.push(new t(i,n)),i=[],n=-1);return n>-1&&A.push(new t(i,n)),A}},DE=class t extends In{constructor(e,A){super(),this.children=e,this.length=A,this.lines=0;for(let i of e)this.lines+=i.lines}lineInner(e,A,i,n){for(let o=0;;o++){let r=this.children[o],s=n+r.length,a=i+r.lines-1;if((A?a:s)>=e)return r.lineInner(e,A,i,n);n=s+1,i=a+1}}decompose(e,A,i,n){for(let o=0,r=0;r<=A&&o=r){let c=n&((r<=e?1:0)|(a>=A?2:0));r>=e&&a<=A&&!c?i.push(s):s.decompose(e-r,A-r,i,c)}r=a+1}}replace(e,A,i){if([e,A]=bE(this,e,A),i.lines=o&&A<=s){let a=r.replace(e-o,A-o,i),c=this.lines-r.lines+a.lines;if(a.lines>4&&a.lines>c>>6){let l=this.children.slice();return l[n]=a,new t(l,this.length-(A-e)+i.length)}return super.replace(o,s,a)}o=s+1}return super.replace(e,A,i)}sliceString(e,A=this.length,i=` -`){[e,A]=bE(this,e,A);let n="";for(let o=0,r=0;oe&&o&&(n+=i),er&&(n+=s.sliceString(e-r,A-r,i)),r=a+1}return n}flatten(e){for(let A of this.children)A.flatten(e)}scanIdentical(e,A){if(!(e instanceof t))return 0;let i=0,[n,o,r,s]=A>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;n+=A,o+=A){if(n==r||o==s)return i;let a=this.children[n],c=e.children[o];if(a!=c)return i+a.scanIdentical(c,A);i+=a.length+1}}static from(e,A=e.reduce((i,n)=>i+n.length+1,-1)){let i=0;for(let d of e)i+=d.lines;if(i<32){let d=[];for(let B of e)B.flatten(d);return new cc(d,A)}let n=Math.max(32,i>>5),o=n<<1,r=n>>1,s=[],a=0,c=-1,l=[];function I(d){let B;if(d.lines>o&&d instanceof t)for(let E of d.children)I(E);else d.lines>r&&(a>r||!a)?(C(),s.push(d)):d instanceof cc&&a&&(B=l[l.length-1])instanceof cc&&d.lines+B.lines<=32?(a+=d.lines,c+=d.length+1,l[l.length-1]=new cc(B.text.concat(d.text),B.length+1+d.length)):(a+d.lines>n&&C(),a+=d.lines,c+=d.length+1,l.push(d))}function C(){a!=0&&(s.push(l.length==1?l[0]:t.from(l,c)),c=-1,a=l.length=0)}for(let d of e)I(d);return C(),s.length==1?s[0]:new t(s,A)}};In.empty=new cc([""],0);function BRA(t){let e=-1;for(let A of t)e+=A.length+1;return e}function rw(t,e,A=0,i=1e9){for(let n=0,o=0,r=!0;o=A&&(a>i&&(s=s.slice(0,i-n)),n0?1:(e instanceof cc?e.text.length:e.children.length)<<1]}nextInner(e,A){for(this.done=this.lineBreak=!1;;){let i=this.nodes.length-1,n=this.nodes[i],o=this.offsets[i],r=o>>1,s=n instanceof cc?n.text.length:n.children.length;if(r==(A>0?s:0)){if(i==0)return this.done=!0,this.value="",this;A>0&&this.offsets[i-1]++,this.nodes.pop(),this.offsets.pop()}else if((o&1)==(A>0?0:1)){if(this.offsets[i]+=A,e==0)return this.lineBreak=!0,this.value=` -`,this;e--}else if(n instanceof cc){let a=n.text[r+(A<0?-1:0)];if(this.offsets[i]+=A,a.length>Math.max(0,e))return this.value=e==0?a:A>0?a.slice(e):a.slice(0,a.length-e),this;e-=a.length}else{let a=n.children[r+(A<0?-1:0)];e>a.length?(e-=a.length,this.offsets[i]+=A):(A<0&&this.offsets[i]--,this.nodes.push(a),this.offsets.push(A>0?1:(a instanceof cc?a.text.length:a.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}},sw=class{constructor(e,A,i){this.value="",this.done=!1,this.cursor=new pC(e,A>i?-1:1),this.pos=A>i?e.length:0,this.from=Math.min(A,i),this.to=Math.max(A,i)}nextInner(e,A){if(A<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,A<0?this.pos-this.to:this.from-this.pos);let i=A<0?this.pos-this.from:this.to-this.pos;e>i&&(e=i),i-=e;let{value:n}=this.cursor.next(e);return this.pos+=(n.length+e)*A,this.value=n.length<=i?n:A<0?n.slice(n.length-i):n.slice(0,i),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}},aw=class{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:A,lineBreak:i,value:n}=this.inner.next(e);return A&&this.afterBreak?(this.value="",this.afterBreak=!1):A?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol<"u"&&(In.prototype[Symbol.iterator]=function(){return this.iter()},pC.prototype[Symbol.iterator]=sw.prototype[Symbol.iterator]=aw.prototype[Symbol.iterator]=function(){return this});var Vx=class{constructor(e,A,i,n){this.from=e,this.to=A,this.number=i,this.text=n}get length(){return this.to-this.from}};function bE(t,e,A){return e=Math.max(0,Math.min(t.length,e)),[e,Math.max(e,Math.min(t.length,A))]}function yr(t,e,A=!0,i=!0){return HAA(t,e,A,i)}function ERA(t){return t>=56320&&t<57344}function QRA(t){return t>=55296&&t<56320}function Bs(t,e){let A=t.charCodeAt(e);if(!QRA(A)||e+1==t.length)return A;let i=t.charCodeAt(e+1);return ERA(i)?(A-55296<<10)+(i-56320)+65536:A}function T4(t){return t<=65535?String.fromCharCode(t):(t-=65536,String.fromCharCode((t>>10)+55296,(t&1023)+56320))}function lc(t){return t<65536?1:2}var Zx=/\r\n?|\n/,Is=function(t){return t[t.Simple=0]="Simple",t[t.TrackDel=1]="TrackDel",t[t.TrackBefore=2]="TrackBefore",t[t.TrackAfter=3]="TrackAfter",t}(Is||(Is={})),m1=class t{constructor(e){this.sections=e}get length(){let e=0;for(let A=0;Ae)return o+(e-n);o+=s}else{if(i!=Is.Simple&&c>=e&&(i==Is.TrackDel&&ne||i==Is.TrackBefore&&ne))return null;if(c>e||c==e&&A<0&&!s)return e==n||A<0?o:o+a;o+=a}n=c}if(e>n)throw new RangeError(`Position ${e} is out of range for changeset of length ${n}`);return o}touchesRange(e,A=e){for(let i=0,n=0;i=0&&n<=A&&s>=e)return nA?"cover":!0;n=s}return!1}toString(){let e="";for(let A=0;A=0?":"+n:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(A=>typeof A!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new t(e)}static create(e){return new t(e)}},Cs=class t extends m1{constructor(e,A){super(e),this.inserted=A}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return Wx(this,(A,i,n,o,r)=>e=e.replace(n,n+(i-A),r),!1),e}mapDesc(e,A=!1){return Xx(this,e,A,!0)}invert(e){let A=this.sections.slice(),i=[];for(let n=0,o=0;n=0){A[n]=s,A[n+1]=r;let a=n>>1;for(;i.length0&&f1(i,A,o.text),o.forward(l),s+=l}let c=e[r++];for(;s>1].toJSON()))}return e}static of(e,A,i){let n=[],o=[],r=0,s=null;function a(l=!1){if(!l&&!n.length)return;rC||I<0||C>A)throw new RangeError(`Invalid change range ${I} to ${C} (in doc of length ${A})`);let B=d?typeof d=="string"?In.of(d.split(i||Zx)):d:In.empty,E=B.length;if(I==C&&E==0)return;Ir&&Ls(n,I-r,-1),Ls(n,C-I,E),f1(o,n,B),r=C}}return c(e),a(!s),s}static empty(e){return new t(e?[e,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JSON representation of ChangeSet");let A=[],i=[];for(let n=0;ns&&typeof r!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(o.length==1)A.push(o[0],0);else{for(;i.length=0&&A<=0&&A==t[n+1]?t[n]+=e:n>=0&&e==0&&t[n]==0?t[n+1]+=A:i?(t[n]+=e,t[n+1]+=A):t.push(e,A)}function f1(t,e,A){if(A.length==0)return;let i=e.length-2>>1;if(i>1])),!(A||r==t.sections.length||t.sections[r+1]<0);)s=t.sections[r++],a=t.sections[r++];e(n,c,o,l,I),n=c,o=l}}}function Xx(t,e,A,i=!1){let n=[],o=i?[]:null,r=new wC(t),s=new wC(e);for(let a=-1;;){if(r.done&&s.len||s.done&&r.len)throw new Error("Mismatched change set lengths");if(r.ins==-1&&s.ins==-1){let c=Math.min(r.len,s.len);Ls(n,c,-1),r.forward(c),s.forward(c)}else if(s.ins>=0&&(r.ins<0||a==r.i||r.off==0&&(s.len=0&&a=0){let c=0,l=r.len;for(;l;)if(s.ins==-1){let I=Math.min(l,s.len);c+=I,l-=I,s.forward(I)}else if(s.ins==0&&s.lena||r.ins>=0&&r.len>a)&&(s||i.length>c),o.forward2(a),r.forward(a)}}}}var wC=class{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i>1;return A>=e.length?In.empty:e[A]}textBit(e){let{inserted:A}=this.set,i=this.i-2>>1;return i>=A.length&&!e?In.empty:A[i].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}},wE=class t{constructor(e,A,i){this.from=e,this.to=A,this.flags=i}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get bidiLevel(){let e=this.flags&7;return e==7?null:e}get goalColumn(){let e=this.flags>>6;return e==16777215?void 0:e}map(e,A=-1){let i,n;return this.empty?i=n=e.mapPos(this.from,A):(i=e.mapPos(this.from,1),n=e.mapPos(this.to,-1)),i==this.from&&n==this.to?this:new t(i,n,this.flags)}extend(e,A=e){if(e<=this.anchor&&A>=this.anchor)return ae.range(e,A);let i=Math.abs(e-this.anchor)>Math.abs(A-this.anchor)?e:A;return ae.range(this.anchor,i)}eq(e,A=!1){return this.anchor==e.anchor&&this.head==e.head&&(!A||!this.empty||this.assoc==e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!="number"||typeof e.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return ae.range(e.anchor,e.head)}static create(e,A,i){return new t(e,A,i)}},ae=class t{constructor(e,A){this.ranges=e,this.mainIndex=A}map(e,A=-1){return e.empty?this:t.create(this.ranges.map(i=>i.map(e,A)),this.mainIndex)}eq(e,A=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let i=0;ie.toJSON()),main:this.mainIndex}}static fromJSON(e){if(!e||!Array.isArray(e.ranges)||typeof e.main!="number"||e.main>=e.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new t(e.ranges.map(A=>wE.fromJSON(A)),e.main)}static single(e,A=e){return new t([t.range(e,A)],0)}static create(e,A=0){if(e.length==0)throw new RangeError("A selection needs at least one range");for(let i=0,n=0;ne?8:0)|o)}static normalized(e,A=0){let i=e[A];e.sort((n,o)=>n.from-o.from),A=e.indexOf(i);for(let n=1;no.head?t.range(a,s):t.range(s,a))}}return new t(e,A)}};function eeA(t,e){for(let A of t.ranges)if(A.to>e)throw new RangeError("Selection points outside of document")}var sL=0,qe=class t{constructor(e,A,i,n,o){this.combine=e,this.compareInput=A,this.compare=i,this.isStatic=n,this.id=sL++,this.default=e([]),this.extensions=typeof o=="function"?o(this):o}get reader(){return this}static define(e={}){return new t(e.combine||(A=>A),e.compareInput||((A,i)=>A===i),e.compare||(e.combine?(A,i)=>A===i:aL),!!e.static,e.enables)}of(e){return new yE([],this,0,e)}compute(e,A){if(this.isStatic)throw new Error("Can't compute a static facet");return new yE(e,this,1,A)}computeN(e,A){if(this.isStatic)throw new Error("Can't compute a static facet");return new yE(e,this,2,A)}from(e,A){return A||(A=i=>i),this.compute([e],i=>A(i.field(e)))}};function aL(t,e){return t==e||t.length==e.length&&t.every((A,i)=>A===e[i])}var yE=class{constructor(e,A,i,n){this.dependencies=e,this.facet=A,this.type=i,this.value=n,this.id=sL++}dynamicSlot(e){var A;let i=this.value,n=this.facet.compareInput,o=this.id,r=e[o]>>1,s=this.type==2,a=!1,c=!1,l=[];for(let I of this.dependencies)I=="doc"?a=!0:I=="selection"?c=!0:(((A=e[I.id])!==null&&A!==void 0?A:1)&1)==0&&l.push(e[I.id]);return{create(I){return I.values[r]=i(I),1},update(I,C){if(a&&C.docChanged||c&&(C.docChanged||C.selection)||$x(I,l)){let d=i(I);if(s?!qAA(d,I.values[r],n):!n(d,I.values[r]))return I.values[r]=d,1}return 0},reconfigure:(I,C)=>{let d,B=C.config.address[o];if(B!=null){let E=gw(C,B);if(this.dependencies.every(h=>h instanceof qe?C.facet(h)===I.facet(h):h instanceof Ar?C.field(h,!1)==I.field(h,!1):!0)||(s?qAA(d=i(I),E,n):n(d=i(I),E)))return I.values[r]=E,0}else d=i(I);return I.values[r]=d,1}}}};function qAA(t,e,A){if(t.length!=e.length)return!1;for(let i=0;it[a.id]),n=A.map(a=>a.type),o=i.filter(a=>!(a&1)),r=t[e.id]>>1;function s(a){let c=[];for(let l=0;li===n),e);return e.provide&&(A.provides=e.provide(A)),A}create(e){let A=e.facet(iw).find(i=>i.field==this);return(A?.create||this.createF)(e)}slot(e){let A=e[this.id]>>1;return{create:i=>(i.values[A]=this.create(i),1),update:(i,n)=>{let o=i.values[A],r=this.updateF(o,n);return this.compareF(o,r)?0:(i.values[A]=r,1)},reconfigure:(i,n)=>{let o=i.facet(iw),r=n.facet(iw),s;return(s=o.find(a=>a.field==this))&&s!=r.find(a=>a.field==this)?(i.values[A]=s.create(i),1):n.config.address[this.id]!=null?(i.values[A]=n.field(this),0):(i.values[A]=this.create(i),1)}}}init(e){return[this,iw.of({field:this,create:e})]}get extension(){return this}},fC={lowest:4,low:3,default:2,high:1,highest:0};function G4(t){return e=>new cw(e,t)}var Dl={highest:G4(fC.highest),high:G4(fC.high),default:G4(fC.default),low:G4(fC.low),lowest:G4(fC.lowest)},cw=class{constructor(e,A){this.inner=e,this.prec=A}},bg=class t{of(e){return new K4(this,e)}reconfigure(e){return t.reconfigure.of({compartment:this,extension:e})}get(e){return e.config.compartments.get(this)}},K4=class{constructor(e,A){this.compartment=e,this.inner=A}},lw=class t{constructor(e,A,i,n,o,r){for(this.base=e,this.compartments=A,this.dynamicSlots=i,this.address=n,this.staticValues=o,this.facets=r,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(e,A,i){let n=[],o=Object.create(null),r=new Map;for(let C of uRA(e,A,r))C instanceof Ar?n.push(C):(o[C.facet.id]||(o[C.facet.id]=[])).push(C);let s=Object.create(null),a=[],c=[];for(let C of n)s[C.id]=c.length<<1,c.push(d=>C.slot(d));let l=i?.config.facets;for(let C in o){let d=o[C],B=d[0].facet,E=l&&l[C]||[];if(d.every(h=>h.type==0))if(s[B.id]=a.length<<1|1,aL(E,d))a.push(i.facet(B));else{let h=B.combine(d.map(u=>u.value));a.push(i&&B.compare(h,i.facet(B))?i.facet(B):h)}else{for(let h of d)h.type==0?(s[h.id]=a.length<<1|1,a.push(h.value)):(s[h.id]=c.length<<1,c.push(u=>h.dynamicSlot(u)));s[B.id]=c.length<<1,c.push(h=>hRA(h,B,d))}}let I=c.map(C=>C(s));return new t(e,r,I,s,a,o)}};function uRA(t,e,A){let i=[[],[],[],[],[]],n=new Map;function o(r,s){let a=n.get(r);if(a!=null){if(a<=s)return;let c=i[a].indexOf(r);c>-1&&i[a].splice(c,1),r instanceof K4&&A.delete(r.compartment)}if(n.set(r,s),Array.isArray(r))for(let c of r)o(c,s);else if(r instanceof K4){if(A.has(r.compartment))throw new RangeError("Duplicate use of compartment in extensions");let c=e.get(r.compartment)||r.inner;A.set(r.compartment,c),o(c,s)}else if(r instanceof cw)o(r.inner,r.prec);else if(r instanceof Ar)i[s].push(r),r.provides&&o(r.provides,s);else if(r instanceof yE)i[s].push(r),r.facet.extensions&&o(r.facet.extensions,fC.default);else{let c=r.extension;if(!c)throw new Error(`Unrecognized extension value in extension set (${r}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);o(c,s)}}return o(t,fC.default),i.reduce((r,s)=>r.concat(s))}function U4(t,e){if(e&1)return 2;let A=e>>1,i=t.status[A];if(i==4)throw new Error("Cyclic dependency between fields and/or facets");if(i&2)return i;t.status[A]=4;let n=t.computeSlot(t,t.config.dynamicSlots[A]);return t.status[A]=2|n}function gw(t,e){return e&1?t.config.staticValues[e>>1]:t.values[e>>1]}var VAA=qe.define(),jx=qe.define({combine:t=>t.some(e=>e),static:!0}),teA=qe.define({combine:t=>t.length?t[0]:void 0,static:!0}),ieA=qe.define(),neA=qe.define(),oeA=qe.define(),ZAA=qe.define({combine:t=>t.length?t[0]:!1}),xa=class{constructor(e,A){this.type=e,this.value=A}static define(){return new AL}},AL=class{of(e){return new xa(this,e)}},eL=class{constructor(e){this.map=e}of(e){return new Pi(this,e)}},Pi=(()=>{class t{constructor(A,i){this.type=A,this.value=i}map(A){let i=this.type.map(this.value,A);return i===void 0?void 0:i==this.value?this:new t(this.type,i)}is(A){return this.type==A}static define(A={}){return new eL(A.map||(i=>i))}static mapEffects(A,i){if(!A.length)return A;let n=[];for(let o of A){let r=o.map(i);r&&n.push(r)}return n}}return t.reconfigure=t.define(),t.appendConfig=t.define(),t})(),vg=(()=>{class t{constructor(A,i,n,o,r,s){this.startState=A,this.changes=i,this.selection=n,this.effects=o,this.annotations=r,this.scrollIntoView=s,this._doc=null,this._state=null,n&&eeA(n,i.newLength),r.some(a=>a.type==t.time)||(this.annotations=r.concat(t.time.of(Date.now())))}static create(A,i,n,o,r,s){return new t(A,i,n,o,r,s)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(A){for(let i of this.annotations)if(i.type==A)return i.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(A){let i=this.annotation(t.userEvent);return!!(i&&(i==A||i.length>A.length&&i.slice(0,A.length)==A&&i[A.length]=="."))}}return t.time=xa.define(),t.userEvent=xa.define(),t.addToHistory=xa.define(),t.remote=xa.define(),t})();function fRA(t,e){let A=[];for(let i=0,n=0;;){let o,r;if(i=t[i]))o=t[i++],r=t[i++];else if(n=0;n--){let o=i[n](t);o instanceof vg?t=o:Array.isArray(o)&&o.length==1&&o[0]instanceof vg?t=o[0]:t=seA(e,vE(o),!1)}return t}function pRA(t){let e=t.startState,A=e.facet(oeA),i=t;for(let n=A.length-1;n>=0;n--){let o=A[n](t);o&&Object.keys(o).length&&(i=reA(i,tL(e,o,t.changes.newLength),!0))}return i==t?t:vg.create(e,t.changes,t.selection,i.effects,i.annotations,i.scrollIntoView)}var wRA=[];function vE(t){return t==null?wRA:Array.isArray(t)?t:[t]}var ao=function(t){return t[t.Word=0]="Word",t[t.Space=1]="Space",t[t.Other=2]="Other",t}(ao||(ao={})),DRA=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,iL;try{iL=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch{}function yRA(t){if(iL)return iL.test(t);for(let e=0;e"\x80"&&(A.toUpperCase()!=A.toLowerCase()||DRA.test(A)))return!0}return!1}function vRA(t){return e=>{if(!/\S/.test(e))return ao.Space;if(yRA(e))return ao.Word;for(let A=0;A-1)return ao.Word;return ao.Other}}var hr=(()=>{class t{constructor(A,i,n,o,r,s){this.config=A,this.doc=i,this.selection=n,this.values=o,this.status=A.statusTemplate.slice(),this.computeSlot=r,s&&(s._state=this);for(let a=0;ao.set(l,c)),i=null),o.set(a.value.compartment,a.value.extension)):a.is(Pi.reconfigure)?(i=null,n=a.value):a.is(Pi.appendConfig)&&(i=null,n=vE(n).concat(a.value));let r;i?r=A.startState.values.slice():(i=lw.resolve(n,o,this),r=new t(i,this.doc,this.selection,i.dynamicSlots.map(()=>null),(c,l)=>l.reconfigure(c,this),null).values);let s=A.startState.facet(jx)?A.newSelection:A.newSelection.asSingle();new t(i,A.newDoc,s,r,(a,c)=>c.update(a,A),A)}replaceSelection(A){return typeof A=="string"&&(A=this.toText(A)),this.changeByRange(i=>({changes:{from:i.from,to:i.to,insert:A},range:ae.cursor(i.from+A.length)}))}changeByRange(A){let i=this.selection,n=A(i.ranges[0]),o=this.changes(n.changes),r=[n.range],s=vE(n.effects);for(let a=1;as.spec.fromJSON(a,c)))}}return t.create({doc:A.doc,selection:ae.fromJSON(A.selection),extensions:i.extensions?o.concat([i.extensions]):o})}static create(A={}){let i=lw.resolve(A.extensions||[],new Map),n=A.doc instanceof In?A.doc:In.of((A.doc||"").split(i.staticFacet(t.lineSeparator)||Zx)),o=A.selection?A.selection instanceof ae?A.selection:ae.single(A.selection.anchor,A.selection.head):ae.single(0);return eeA(o,n.length),i.staticFacet(jx)||(o=o.asSingle()),new t(i,n,o,i.dynamicSlots.map(()=>null),(r,s)=>s.create(r),null)}get tabSize(){return this.facet(t.tabSize)}get lineBreak(){return this.facet(t.lineSeparator)||` -`}get readOnly(){return this.facet(ZAA)}phrase(A,...i){for(let n of this.facet(t.phrases))if(Object.prototype.hasOwnProperty.call(n,A)){A=n[A];break}return i.length&&(A=A.replace(/\$(\$|\d*)/g,(n,o)=>{if(o=="$")return"$";let r=+(o||1);return!r||r>i.length?n:i[r-1]})),A}languageDataAt(A,i,n=-1){let o=[];for(let r of this.facet(VAA))for(let s of r(this,i,n))Object.prototype.hasOwnProperty.call(s,A)&&o.push(s[A]);return o}charCategorizer(A){return vRA(this.languageDataAt("wordChars",A).join(""))}wordAt(A){let{text:i,from:n,length:o}=this.doc.lineAt(A),r=this.charCategorizer(A),s=A-n,a=A-n;for(;s>0;){let c=yr(i,s,!1);if(r(i.slice(c,s))!=ao.Word)break;s=c}for(;ae.length?e[0]:4}),t.lineSeparator=teA,t.readOnly=ZAA,t.phrases=qe.define({compare(e,A){let i=Object.keys(e),n=Object.keys(A);return i.length==n.length&&i.every(o=>e[o]==A[o])}}),t.languageData=VAA,t.changeFilter=ieA,t.transactionFilter=neA,t.transactionExtender=oeA,t})();bg.reconfigure=Pi.define();function Wr(t,e,A={}){let i={};for(let n of t)for(let o of Object.keys(n)){let r=n[o],s=i[o];if(s===void 0)i[o]=r;else if(!(s===r||r===void 0))if(Object.hasOwnProperty.call(A,o))i[o]=A[o](s,r);else throw new Error("Config merge conflict for field "+o)}for(let n in e)i[n]===void 0&&(i[n]=e[n]);return i}var wl=class{eq(e){return this==e}range(e,A=e){return Y4.create(e,A,this)}};wl.prototype.startSide=wl.prototype.endSide=0;wl.prototype.point=!1;wl.prototype.mapMode=Is.TrackDel;var Y4=class t{constructor(e,A,i){this.from=e,this.to=A,this.value=i}static create(e,A,i){return new t(e,A,i)}};function nL(t,e){return t.from-e.from||t.value.startSide-e.value.startSide}var oL=class t{constructor(e,A,i,n){this.from=e,this.to=A,this.value=i,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(e,A,i,n=0){let o=i?this.to:this.from;for(let r=n,s=o.length;;){if(r==s)return r;let a=r+s>>1,c=o[a]-e||(i?this.value[a].endSide:this.value[a].startSide)-A;if(a==r)return c>=0?r:s;c>=0?s=a:r=a+1}}between(e,A,i,n){for(let o=this.findIndex(A,-1e9,!0),r=this.findIndex(i,1e9,!1,o);od||C==d&&c.startSide>0&&c.endSide<=0)continue;(d-C||c.endSide-c.startSide)<0||(r<0&&(r=C),c.point&&(s=Math.max(s,d-C)),i.push(c),n.push(C-r),o.push(d-r))}return{mapped:i.length?new t(n,o,i,s):null,pos:r}}},co=(()=>{class t{constructor(A,i,n,o){this.chunkPos=A,this.chunk=i,this.nextLayer=n,this.maxPoint=o}static create(A,i,n,o){return new t(A,i,n,o)}get length(){let A=this.chunk.length-1;return A<0?0:Math.max(this.chunkEnd(A),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let A=this.nextLayer.size;for(let i of this.chunk)A+=i.value.length;return A}chunkEnd(A){return this.chunkPos[A]+this.chunk[A].length}update(A){let{add:i=[],sort:n=!1,filterFrom:o=0,filterTo:r=this.length}=A,s=A.filter;if(i.length==0&&!s)return this;if(n&&(i=i.slice().sort(nL)),this.isEmpty)return i.length?t.of(i):this;let a=new Iw(this,null,-1).goto(0),c=0,l=[],I=new ds;for(;a.value||c=0){let C=i[c++];I.addInner(C.from,C.to,C.value)||l.push(C)}else a.rangeIndex==1&&a.chunkIndexthis.chunkEnd(a.chunkIndex)||ra.to||r=r&&A<=r+s.length&&s.between(r,A-r,i-r,n)===!1)return}this.nextLayer.between(A,i,n)}}iter(A=0){return J4.from([this]).goto(A)}get isEmpty(){return this.nextLayer==this}static iter(A,i=0){return J4.from(A).goto(i)}static compare(A,i,n,o,r=-1){let s=A.filter(C=>C.maxPoint>0||!C.isEmpty&&C.maxPoint>=r),a=i.filter(C=>C.maxPoint>0||!C.isEmpty&&C.maxPoint>=r),c=WAA(s,a,n),l=new mC(s,c,r),I=new mC(a,c,r);n.iterGaps((C,d,B)=>XAA(l,C,I,d,B,o)),n.empty&&n.length==0&&XAA(l,0,I,0,0,o)}static eq(A,i,n=0,o){o==null&&(o=999999999);let r=A.filter(I=>!I.isEmpty&&i.indexOf(I)<0),s=i.filter(I=>!I.isEmpty&&A.indexOf(I)<0);if(r.length!=s.length)return!1;if(!r.length)return!0;let a=WAA(r,s),c=new mC(r,a,0).goto(n),l=new mC(s,a,0).goto(n);for(;;){if(c.to!=l.to||!rL(c.active,l.active)||c.point&&(!l.point||!c.point.eq(l.point)))return!1;if(c.to>o)return!0;c.next(),l.next()}}static spans(A,i,n,o,r=-1){let s=new mC(A,null,r).goto(i),a=i,c=s.openStart;for(;;){let l=Math.min(s.to,n);if(s.point){let I=s.activeForPoint(s.to),C=s.pointFroma&&(o.span(a,l,s.active,c),c=s.openEnd(l));if(s.to>n)return c+(s.point&&s.to>n?1:0);a=s.to,s.next()}}static of(A,i=!1){let n=new ds;for(let o of A instanceof Y4?[A]:i?bRA(A):A)n.add(o.from,o.to,o.value);return n.finish()}static join(A){if(!A.length)return t.empty;let i=A[A.length-1];for(let n=A.length-2;n>=0;n--)for(let o=A[n];o!=t.empty;o=o.nextLayer)i=new t(o.chunkPos,o.chunk,i,Math.max(o.maxPoint,i.maxPoint));return i}}return t.empty=new t([],[],null,-1),t})();function bRA(t){if(t.length>1)for(let e=t[0],A=1;A0)return t.slice().sort(nL);e=i}return t}co.empty.nextLayer=co.empty;var ds=class t{finishChunk(e){this.chunks.push(new oL(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,e&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(e,A,i){this.addInner(e,A,i)||(this.nextLayer||(this.nextLayer=new t)).add(e,A,i)}addInner(e,A,i){let n=e-this.lastTo||i.startSide-this.last.endSide;if(n<=0&&(e-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return n<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=e),this.from.push(e-this.chunkStart),this.to.push(A-this.chunkStart),this.last=i,this.lastFrom=e,this.lastTo=A,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,A-e)),!0)}addChunk(e,A){if((e-this.lastTo||A.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,A.maxPoint),this.chunks.push(A),this.chunkPos.push(e);let i=A.value.length-1;return this.last=A.value[i],this.lastFrom=A.from[i]+e,this.lastTo=A.to[i]+e,!0}finish(){return this.finishInner(co.empty)}finishInner(e){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return e;let A=co.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(e):e,this.setMaxPoint);return this.from=null,A}};function WAA(t,e,A){let i=new Map;for(let o of t)for(let r=0;r=this.minPoint)break}}setRangeIndex(e){if(e==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&n.push(new Iw(r,A,i,o));return n.length==1?n[0]:new t(n)}get startSide(){return this.value?this.value.startSide:0}goto(e,A=-1e9){for(let i of this.heap)i.goto(e,A);for(let i=this.heap.length>>1;i>=0;i--)qx(this.heap,i);return this.next(),this}forward(e,A){for(let i of this.heap)i.forward(e,A);for(let i=this.heap.length>>1;i>=0;i--)qx(this.heap,i);(this.to-e||this.value.endSide-A)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let e=this.heap[0];this.from=e.from,this.to=e.to,this.value=e.value,this.rank=e.rank,e.value&&e.next(),qx(this.heap,0)}}};function qx(t,e){for(let A=t[e];;){let i=(e<<1)+1;if(i>=t.length)break;let n=t[i];if(i+1=0&&(n=t[i+1],i++),A.compare(n)<0)break;t[i]=A,t[e]=n,e=i}}var mC=class{constructor(e,A,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=J4.from(e,A,i)}goto(e,A=-1e9){return this.cursor.goto(e,A),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=e,this.endSide=A,this.openStart=-1,this.next(),this}forward(e,A){for(;this.minActive>-1&&(this.activeTo[this.minActive]-e||this.active[this.minActive].endSide-A)<0;)this.removeActive(this.minActive);this.cursor.forward(e,A)}removeActive(e){nw(this.active,e),nw(this.activeTo,e),nw(this.activeRank,e),this.minActive=$AA(this.active,this.activeTo)}addActive(e){let A=0,{value:i,to:n,rank:o}=this.cursor;for(;A0;)A++;ow(this.active,A,i),ow(this.activeTo,A,n),ow(this.activeRank,A,o),e&&ow(e,A,this.cursor.from),this.minActive=$AA(this.active,this.activeTo)}next(){let e=this.to,A=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let n=this.minActive;if(n>-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>e){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),i&&nw(i,n)}else if(this.cursor.value)if(this.cursor.from>e){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let o=this.cursor.value;if(!o.point)this.addActive(i),this.cursor.next();else if(A&&this.cursor.to==this.to&&this.cursor.from=0&&i[n]=0&&!(this.activeRank[i]e||this.activeTo[i]==e&&this.active[i].endSide>=this.point.endSide)&&A.push(this.active[i]);return A.reverse()}openEnd(e){let A=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>e;i--)A++;return A}};function XAA(t,e,A,i,n,o){t.goto(e),A.goto(i);let r=i+n,s=i,a=i-e;for(;;){let c=t.to+a-A.to,l=c||t.endSide-A.endSide,I=l<0?t.to+a:A.to,C=Math.min(I,r);if(t.point||A.point?t.point&&A.point&&(t.point==A.point||t.point.eq(A.point))&&rL(t.activeForPoint(t.to),A.activeForPoint(A.to))||o.comparePoint(s,C,t.point,A.point):C>s&&!rL(t.active,A.active)&&o.compareRange(s,C,t.active,A.active),I>r)break;(c||t.openEnd!=A.openEnd)&&o.boundChange&&o.boundChange(I),s=I,l<=0&&t.next(),l>=0&&A.next()}}function rL(t,e){if(t.length!=e.length)return!1;for(let A=0;A=e;i--)t[i+1]=t[i];t[e]=A}function $AA(t,e){let A=-1,i=1e9;for(let n=0;n=e)return n;if(n==t.length)break;o+=t.charCodeAt(n)==9?A-o%A:1,n=yr(t,n)}return i===!0?-1:t.length}var cL="\u037C",aeA=typeof Symbol>"u"?"__"+cL:Symbol.for(cL),lL=typeof Symbol>"u"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),ceA=typeof globalThis<"u"?globalThis:typeof window<"u"?window:{},Kc=class{constructor(e,A){this.rules=[];let{finish:i}=A||{};function n(r){return/^@/.test(r)?[r]:r.split(/,\s*/)}function o(r,s,a,c){let l=[],I=/^@(\w+)\b/.exec(r[0]),C=I&&I[1]=="keyframes";if(I&&s==null)return a.push(r[0]+";");for(let d in s){let B=s[d];if(/&/.test(d))o(d.split(/,\s*/).map(E=>r.map(h=>E.replace(/&/,h))).reduce((E,h)=>E.concat(h)),B,a);else if(B&&typeof B=="object"){if(!I)throw new RangeError("The value of a property ("+d+") should be a primitive value.");o(n(d),B,l,C)}else B!=null&&l.push(d.replace(/_.*/,"").replace(/[A-Z]/g,E=>"-"+E.toLowerCase())+": "+B+";")}(l.length||C)&&a.push((i&&!I&&!c?r.map(i):r).join(", ")+" {"+l.join(" ")+"}")}for(let r in e)o(n(r),e[r],this.rules)}getRules(){return this.rules.join(` -`)}static newName(){let e=ceA[aeA]||1;return ceA[aeA]=e+1,cL+e.toString(36)}static mount(e,A,i){let n=e[lL],o=i&&i.nonce;n?o&&n.setNonce(o):n=new gL(e,o),n.mount(Array.isArray(A)?A:[A],e)}},leA=new Map,gL=class{constructor(e,A){let i=e.ownerDocument||e,n=i.defaultView;if(!e.head&&e.adoptedStyleSheets&&n.CSSStyleSheet){let o=leA.get(i);if(o)return e[lL]=o;this.sheet=new n.CSSStyleSheet,leA.set(i,this)}else this.styleTag=i.createElement("style"),A&&this.styleTag.setAttribute("nonce",A);this.modules=[],e[lL]=this}mount(e,A){let i=this.sheet,n=0,o=0;for(let r=0;r-1&&(this.modules.splice(a,1),o--,a=-1),a==-1){if(this.modules.splice(o++,0,s),i)for(let c=0;c",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},MRA=typeof navigator<"u"&&/Mac/.test(navigator.platform),kRA=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(vr=0;vr<10;vr++)T0[48+vr]=T0[96+vr]=String(vr);var vr;for(vr=1;vr<=24;vr++)T0[vr+111]="F"+vr;var vr;for(vr=65;vr<=90;vr++)T0[vr]=String.fromCharCode(vr+32),ME[vr]=String.fromCharCode(vr);var vr;for(dw in T0)ME.hasOwnProperty(dw)||(ME[dw]=T0[dw]);var dw;function geA(t){var e=MRA&&t.metaKey&&t.shiftKey&&!t.ctrlKey&&!t.altKey||kRA&&t.shiftKey&&t.key&&t.key.length==1||t.key=="Unidentified",A=!e&&t.key||(t.shiftKey?ME:T0)[t.keyCode]||t.key||"Unidentified";return A=="Esc"&&(A="Escape"),A=="Del"&&(A="Delete"),A=="Left"&&(A="ArrowLeft"),A=="Up"&&(A="ArrowUp"),A=="Right"&&(A="ArrowRight"),A=="Down"&&(A="ArrowDown"),A}function Un(){var t=arguments[0];typeof t=="string"&&(t=document.createElement(t));var e=1,A=arguments[1];if(A&&typeof A=="object"&&A.nodeType==null&&!Array.isArray(A)){for(var i in A)if(Object.prototype.hasOwnProperty.call(A,i)){var n=A[i];typeof n=="string"?t.setAttribute(i,n):n!=null&&(t[i]=n)}e++}for(;e.995&&A<1.005||!isFinite(A)||Math.abs(e.width-t.offsetWidth)<1)&&(A=1),(i>.995&&i<1.005||!isFinite(i)||Math.abs(e.height-t.offsetHeight)<1)&&(i=1),{scaleX:A,scaleY:i}}function RRA(t,e,A,i,n,o,r,s){let a=t.ownerDocument,c=a.defaultView||window;for(let l=t,I=!1;l&&!I;)if(l.nodeType==1){let C,d=l==a.body,B=1,E=1;if(d)C=SRA(c);else{if(/^(fixed|sticky)$/.test(getComputedStyle(l).position)&&(I=!0),l.scrollHeight<=l.clientHeight&&l.scrollWidth<=l.clientWidth){l=l.assignedSlot||l.parentNode;continue}let D=l.getBoundingClientRect();({scaleX:B,scaleY:E}=ntA(l,D)),C={left:D.left,right:D.left+l.clientWidth*B,top:D.top,bottom:D.top+l.clientHeight*E}}let h=0,u=0;if(n=="nearest")e.top0&&e.bottom>C.bottom+u&&(u=e.bottom-C.bottom+r)):e.bottom>C.bottom&&(u=e.bottom-C.bottom+r,A<0&&e.top-u0&&e.right>C.right+h&&(h=e.right-C.right+o)):e.right>C.right&&(h=e.right-C.right+o,A<0&&e.leftC.bottom||e.leftC.right)&&(e={left:Math.max(e.left,C.left),right:Math.min(e.right,C.right),top:Math.max(e.top,C.top),bottom:Math.min(e.bottom,C.bottom)}),l=l.assignedSlot||l.parentNode}else if(l.nodeType==11)l=l.host;else break}function xRA(t){let e=t.ownerDocument,A,i;for(let n=t.parentNode;n&&!(n==e.body||A&&i);)if(n.nodeType==1)!i&&n.scrollHeight>n.clientHeight&&(i=n),!A&&n.scrollWidth>n.clientWidth&&(A=n),n=n.assignedSlot||n.parentNode;else if(n.nodeType==11)n=n.host;else break;return{x:A,y:i}}var pL=class{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(e){return this.anchorNode==e.anchorNode&&this.anchorOffset==e.anchorOffset&&this.focusNode==e.focusNode&&this.focusOffset==e.focusOffset}setRange(e){let{anchorNode:A,focusNode:i}=e;this.set(A,Math.min(e.anchorOffset,A?xg(A):0),i,Math.min(e.focusOffset,i?xg(i):0))}set(e,A,i,n){this.anchorNode=e,this.anchorOffset=A,this.focusNode=i,this.focusOffset=n}},kE=null;function otA(t){if(t.setActive)return t.setActive();if(kE)return t.focus(kE);let e=[];for(let A=t;A&&(e.push(A,A.scrollTop,A.scrollLeft),A!=A.ownerDocument);A=A.parentNode);if(t.focus(kE==null?{get preventScroll(){return kE={preventScroll:!0},!0}}:void 0),!kE){kE=!1;for(let A=0;AMath.max(1,t.scrollHeight-t.clientHeight-4)}function atA(t,e){for(let A=t,i=e;;){if(A.nodeType==3&&i>0)return{node:A,offset:i};if(A.nodeType==1&&i>0){if(A.contentEditable=="false")return null;A=A.childNodes[i-1],i=xg(A)}else if(A.parentNode&&!Rw(A))i=yC(A),A=A.parentNode;else return null}}function ctA(t,e){for(let A=t,i=e;;){if(A.nodeType==3&&iA)return I.domBoundsAround(e,A,c);if(C>=e&&n==-1&&(n=a,o=c),c>A&&I.dom.parentNode==this.dom){r=a,s=l;break}l=C,c=C+I.breakAfter}return{from:o,to:s<0?i+this.length:s,startDOM:(n?this.children[n-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:r=0?this.children[r].dom:null}}markDirty(e=!1){this.flags|=2,this.markParentsDirty(e)}markParentsDirty(e){for(let A=this.parent;A;A=A.parent){if(e&&(A.flags|=2),A.flags&1)return;A.flags|=1,e=!1}}setParent(e){this.parent!=e&&(this.parent=e,this.flags&7&&this.markParentsDirty(!0))}setDOM(e){this.dom!=e&&(this.dom&&(this.dom.cmView=null),this.dom=e,e.cmView=this)}get rootView(){for(let e=this;;){let A=e.parent;if(!A)return e;e=A}}replaceChildren(e,A,i=sF){this.markDirty();for(let n=e;nthis.pos||e==this.pos&&(A>0||this.i==0||this.children[this.i-1].breakAfter))return this.off=e-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}};function ltA(t,e,A,i,n,o,r,s,a){let{children:c}=t,l=c.length?c[e]:null,I=o.length?o[o.length-1]:null,C=I?I.breakAfter:r;if(!(e==i&&l&&!r&&!C&&o.length<2&&l.merge(A,n,o.length?I:null,A==0,s,a))){if(i0&&(!r&&o.length&&l.merge(A,l.length,o[0],!1,s,0)?l.breakAfter=o.shift().breakAfter:(A2),At={mac:heA||/Mac/.test(La.platform),windows:/Win/.test(La.platform),linux:/Linux|X11/.test(La.platform),ie:jw,ie_version:ItA?wL.documentMode||6:yL?+yL[1]:DL?+DL[1]:0,gecko:EeA,gecko_version:EeA?+(/Firefox\/(\d+)/.exec(La.userAgent)||[0,0])[1]:0,chrome:!!IL,chrome_version:IL?+IL[1]:0,ios:heA,android:/Android\b/.test(La.userAgent),webkit:QeA,safari:CtA,webkit_version:QeA?+(/\bAppleWebKit\/(\d+)/.exec(La.userAgent)||[0,0])[1]:0,tabSize:wL.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"},NRA=256,Lg=class t extends Fo{constructor(e){super(),this.text=e}get length(){return this.text.length}createDOM(e){this.setDOM(e||document.createTextNode(this.text))}sync(e,A){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(A&&A.node==this.dom&&(A.written=!0),this.dom.nodeValue=this.text)}reuseDOM(e){e.nodeType==3&&this.createDOM(e)}merge(e,A,i){return this.flags&8||i&&(!(i instanceof t)||this.length-(A-e)+i.length>NRA||i.flags&8)?!1:(this.text=this.text.slice(0,e)+(i?i.text:"")+this.text.slice(A),this.markDirty(),!0)}split(e){let A=new t(this.text.slice(e));return this.text=this.text.slice(0,e),this.markDirty(),A.flags|=this.flags&8,A}localPosFromDOM(e,A){return e==this.dom?A:A?this.text.length:0}domAtPos(e){return new Xs(this.dom,e)}domBoundsAround(e,A,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(e,A){return _RA(this.dom,e,A)}},D1=class t extends Fo{constructor(e,A=[],i=0){super(),this.mark=e,this.children=A,this.length=i;for(let n of A)n.setParent(this)}setAttrs(e){if(rtA(e),this.mark.class&&(e.className=this.mark.class),this.mark.attrs)for(let A in this.mark.attrs)e.setAttribute(A,this.mark.attrs[A]);return e}canReuseDOM(e){return super.canReuseDOM(e)&&!((this.flags|e.flags)&8)}reuseDOM(e){e.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(e),this.flags|=6)}sync(e,A){this.dom?this.flags&4&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(e,A)}merge(e,A,i,n,o,r){return i&&(!(i instanceof t&&i.mark.eq(this.mark))||e&&o<=0||Ae&&A.push(i=e&&(n=o),i=a,o++}let r=this.length-e;return this.length=e,n>-1&&(this.children.length=n,this.markDirty()),new t(this.mark,A,r)}domAtPos(e){return dtA(this,e)}coordsAt(e,A){return EtA(this,e,A)}};function _RA(t,e,A){let i=t.nodeValue.length;e>i&&(e=i);let n=e,o=e,r=0;e==0&&A<0||e==i&&A>=0?At.chrome||At.gecko||(e?(n--,r=1):o=0)?0:s.length-1];return At.safari&&!r&&a.width==0&&(a=Array.prototype.find.call(s,c=>c.width)||a),r?Pw(a,r<0):a||null}var i3=class t extends Fo{static create(e,A,i){return new t(e,A,i)}constructor(e,A,i){super(),this.widget=e,this.length=A,this.side=i,this.prevWidget=null}split(e){let A=t.create(this.widget,this.length-e,this.side);return this.length-=e,A}sync(e){(!this.dom||!this.widget.updateDOM(this.dom,e))&&(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(e)),this.widget.editable||(this.dom.contentEditable="false"))}getSide(){return this.side}merge(e,A,i,n,o,r){return i&&(!(i instanceof t)||!this.widget.compare(i.widget)||e>0&&o<=0||A0)?Xs.before(this.dom):Xs.after(this.dom,e==this.length)}domBoundsAround(){return null}coordsAt(e,A){let i=this.widget.coordsAt(this.dom,e,A);if(i)return i;let n=this.dom.getClientRects(),o=null;if(!n.length)return null;let r=this.side?this.side<0:e>0;for(let s=r?n.length-1:0;o=n[s],!(e>0?s==0:s==n.length-1||o.top0?Xs.before(this.dom):Xs.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(e){return this.dom.getBoundingClientRect()}get overrideDOMText(){return In.empty}get isHidden(){return!0}};Lg.prototype.children=i3.prototype.children=n3.prototype.children=sF;function dtA(t,e){let A=t.dom,{children:i}=t,n=0;for(let o=0;no&&e0;o--){let r=i[o-1];if(r.dom.parentNode==A)return r.domAtPos(r.length)}for(let o=n;o0&&e instanceof D1&&n.length&&(i=n[n.length-1])instanceof D1&&i.mark.eq(e.mark)?BtA(i,e.children[0],A-1):(n.push(e),e.setParent(t)),t.length+=e.length}function EtA(t,e,A){let i=null,n=-1,o=null,r=-1;function s(c,l){for(let I=0,C=0;I=l&&(d.children.length?s(d,l-C):(!o||o.isHidden&&(A>0||URA(o,d)))&&(B>l||C==B&&d.getSide()>0)?(o=d,r=l-C):(C-1?1:0)!=n.length-(A&&n.indexOf(A)>-1?1:0))return!1;for(let o of i)if(o!=A&&(n.indexOf(o)==-1||t[o]!==e[o]))return!1;return!0}function bL(t,e,A){let i=!1;if(e)for(let n in e)A&&n in A||(i=!0,n=="style"?t.style.cssText="":t.removeAttribute(n));if(A)for(let n in A)e&&e[n]==A[n]||(i=!0,n=="style"?t.style.cssText=A[n]:t.setAttribute(n,A[n]));return i}function KRA(t){let e=Object.create(null);for(let A=0;A0?3e8:-4e8:A>0?1e8:-1e8,new y1(e,A,A,i,e.widget||null,!1)}static replace(e){let A=!!e.block,i,n;if(e.isBlockGap)i=-5e8,n=4e8;else{let{start:o,end:r}=QtA(e,A);i=(o?A?-3e8:-1:5e8)-1,n=(r?A?2e8:1:-6e8)+1}return new y1(e,i,n,A,e.widget||null,!0)}static line(e){return new r3(e)}static set(e,A=!1){return co.of(e,A)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}};ut.none=co.empty;var o3=class t extends ut{constructor(e){let{start:A,end:i}=QtA(e);super(A?-1:5e8,i?1:-6e8,null,e),this.tagName=e.tagName||"span",this.class=e.class||"",this.attrs=e.attributes||null}eq(e){var A,i;return this==e||e instanceof t&&this.tagName==e.tagName&&(this.class||((A=this.attrs)===null||A===void 0?void 0:A.class))==(e.class||((i=e.attrs)===null||i===void 0?void 0:i.class))&&Lw(this.attrs,e.attrs,"class")}range(e,A=e){if(e>=A)throw new RangeError("Mark decorations may not be empty");return super.range(e,A)}};o3.prototype.point=!1;var r3=class t extends ut{constructor(e){super(-2e8,-2e8,null,e)}eq(e){return e instanceof t&&this.spec.class==e.spec.class&&Lw(this.spec.attributes,e.spec.attributes)}range(e,A=e){if(A!=e)throw new RangeError("Line decoration ranges must be zero-length");return super.range(e,A)}};r3.prototype.mapMode=Is.TrackBefore;r3.prototype.point=!0;var y1=class t extends ut{constructor(e,A,i,n,o,r){super(A,i,o,e),this.block=n,this.isReplace=r,this.mapMode=n?A<=0?Is.TrackBefore:Is.TrackAfter:Is.TrackDel}get type(){return this.startSide!=this.endSide?$s.WidgetRange:this.startSide<=0?$s.WidgetBefore:$s.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(e){return e instanceof t&&YRA(this.widget,e.widget)&&this.block==e.block&&this.startSide==e.startSide&&this.endSide==e.endSide}range(e,A=e){if(this.isReplace&&(e>A||e==A&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&A!=e)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(e,A)}};y1.prototype.point=!0;function QtA(t,e=!1){let{inclusiveStart:A,inclusiveEnd:i}=t;return A==null&&(A=t.inclusive),i==null&&(i=t.inclusive),{start:A??e,end:i??e}}function YRA(t,e){return t==e||!!(t&&e&&t.compare(e))}function yw(t,e,A,i=0){let n=A.length-1;n>=0&&A[n]+i>=t?A[n]=Math.max(A[n],e):A.push(t,e)}var Es=class t extends Fo{constructor(){super(...arguments),this.children=[],this.length=0,this.prevAttrs=void 0,this.attrs=null,this.breakAfter=0}merge(e,A,i,n,o,r){if(i){if(!(i instanceof t))return!1;this.dom||i.transferDOM(this)}return n&&this.setDeco(i?i.attrs:null),gtA(this,e,A,i?i.children.slice():[],o,r),!0}split(e){let A=new t;if(A.breakAfter=this.breakAfter,this.length==0)return A;let{i,off:n}=this.childPos(e);n&&(A.append(this.children[i].split(n),0),this.children[i].merge(n,this.children[i].length,null,!1,0,0),i++);for(let o=i;o0&&this.children[i-1].length==0;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=e,A}transferDOM(e){this.dom&&(this.markDirty(),e.setDOM(this.dom),e.prevAttrs=this.prevAttrs===void 0?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(e){Lw(this.attrs,e)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=e)}append(e,A){BtA(this,e,A)}addLineDeco(e){let A=e.spec.attributes,i=e.spec.class;A&&(this.attrs=vL(A,this.attrs||{})),i&&(this.attrs=vL({class:i},this.attrs||{}))}domAtPos(e){return dtA(this,e)}reuseDOM(e){e.nodeName=="DIV"&&(this.setDOM(e),this.flags|=6)}sync(e,A){var i;this.dom?this.flags&4&&(rtA(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),this.prevAttrs!==void 0&&(bL(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(e,A);let n=this.dom.lastChild;for(;n&&Fo.get(n)instanceof D1;)n=n.lastChild;if(!n||!this.length||n.nodeName!="BR"&&((i=Fo.get(n))===null||i===void 0?void 0:i.isEditable)==!1&&(!At.ios||!this.children.some(o=>o instanceof Lg))){let o=document.createElement("BR");o.cmIgnore=!0,this.dom.appendChild(o)}}measureTextSize(){if(this.children.length==0||this.length>20)return null;let e=0,A;for(let i of this.children){if(!(i instanceof Lg)||/[^ -~]/.test(i.text))return null;let n=t3(i.dom);if(n.length!=1)return null;e+=n[0].width,A=n[0].height}return e?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:e/this.length,textHeight:A}:null}coordsAt(e,A){let i=EtA(this,e,A);if(!this.children.length&&i&&this.parent){let{heightOracle:n}=this.parent.view.viewState,o=i.bottom-i.top;if(Math.abs(o-n.lineHeight)<2&&n.textHeight=A){if(o instanceof t)return o;if(r>A)break}n=r+o.breakAfter}return null}},DC=class t extends Fo{constructor(e,A,i){super(),this.widget=e,this.length=A,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(e,A,i,n,o,r){return i&&(!(i instanceof t)||!this.widget.compare(i.widget)||e>0&&o<=0||A0}},s3=class extends Ic{constructor(e){super(),this.height=e}toDOM(){let e=document.createElement("div");return e.className="cm-gap",this.updateDOM(e),e}eq(e){return e.height==this.height}updateDOM(e){return e.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}},V4=class t{constructor(e,A,i,n){this.doc=e,this.pos=A,this.end=i,this.disallowBlockEffectsFor=n,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=e.iter(),this.skip=A}posCovered(){if(this.content.length==0)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let e=this.content[this.content.length-1];return!(e.breakAfter||e instanceof DC&&e.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new Es),this.atCursorPos=!0),this.curLine}flushBuffer(e=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(Bw(new n3(-1),e),e.length),this.pendingBuffer=0)}addBlockWidget(e){this.flushBuffer(),this.curLine=null,this.content.push(e)}finish(e){this.pendingBuffer&&e<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,!this.posCovered()&&!(e&&this.content.length&&this.content[this.content.length-1]instanceof DC)&&this.getLine()}buildText(e,A,i){for(;e>0;){if(this.textOff==this.text.length){let{value:o,lineBreak:r,done:s}=this.cursor.next(this.skip);if(this.skip=0,s)throw new Error("Ran out of text content when drawing inline views");if(r){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,e--;continue}else this.text=o,this.textOff=0}let n=Math.min(this.text.length-this.textOff,e,512);this.flushBuffer(A.slice(A.length-i)),this.getLine().append(Bw(new Lg(this.text.slice(this.textOff,this.textOff+n)),A),i),this.atCursorPos=!0,this.textOff+=n,e-=n,i=0}}span(e,A,i,n){this.buildText(A-e,i,n),this.pos=A,this.openStart<0&&(this.openStart=n)}point(e,A,i,n,o,r){if(this.disallowBlockEffectsFor[r]&&i instanceof y1){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(A>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let s=A-e;if(i instanceof y1)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new DC(i.widget||feA.block,s,i));else{let a=i3.create(i.widget||feA.inline,s,s?0:i.startSide),c=this.atCursorPos&&!a.isEditable&&o<=n.length&&(e0),l=!a.isEditable&&(en.length||i.startSide<=0),I=this.getLine();this.pendingBuffer==2&&!c&&!a.isEditable&&(this.pendingBuffer=0),this.flushBuffer(n),c&&(I.append(Bw(new n3(1),n),o),o=n.length+Math.max(0,o-n.length)),I.append(Bw(a,n),o),this.atCursorPos=l,this.pendingBuffer=l?en.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=n.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);s&&(this.textOff+s<=this.text.length?this.textOff+=s:(this.skip+=s-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=A),this.openStart<0&&(this.openStart=o)}static build(e,A,i,n,o){let r=new t(e,A,i,o);return r.openEnd=co.spans(n,A,i,r),r.openStart<0&&(r.openStart=r.openEnd),r.finish(r.openEnd),r}};function Bw(t,e){for(let A of e)t=new D1(A,[t],t.length);return t}var feA=(()=>{class t extends Ic{constructor(A){super(),this.tag=A}eq(A){return A.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(A){return A.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}return t.inline=new t("span"),t.block=new t("div"),t})(),lo=function(t){return t[t.LTR=0]="LTR",t[t.RTL=1]="RTL",t}(lo||(lo={})),bC=lo.LTR,aF=lo.RTL;function htA(t){let e=[];for(let A=0;A=A){if(s.level==i)return r;(o<0||(n!=0?n<0?s.fromA:e[o].level>s.level))&&(o=r)}}if(o<0)throw new RangeError("Index out of range");return o}};function ftA(t,e){if(t.length!=e.length)return!1;for(let A=0;A=0;E-=3)if(Mg[E+1]==-d){let h=Mg[E+2],u=h&2?n:h&4?h&1?o:n:0;u&&(yo[I]=yo[Mg[E]]=u),s=E;break}}else{if(Mg.length==189)break;Mg[s++]=I,Mg[s++]=C,Mg[s++]=a}else if((B=yo[I])==2||B==1){let E=B==n;a=E?0:1;for(let h=s-3;h>=0;h-=3){let u=Mg[h+2];if(u&2)break;if(E)Mg[h+2]|=2;else{if(u&4)break;Mg[h+2]|=4}}}}}function PRA(t,e,A,i){for(let n=0,o=i;n<=A.length;n++){let r=n?A[n-1].to:t,s=na;)B==h&&(B=A[--E].from,h=E?A[E-1].to:t),yo[--B]=d;a=l}else o=c,a++}}}function kL(t,e,A,i,n,o,r){let s=i%2?2:1;if(i%2==n%2)for(let a=e,c=0;aa&&r.push(new Sg(a,E.from,d));let h=E.direction==bC!=!(d%2);SL(t,h?i+1:i,n,E.inner,E.from,E.to,r),a=E.to}B=E.to}else{if(B==A||(l?yo[B]!=s:yo[B]==s))break;B++}C?kL(t,a,B,i+1,n,C,r):ae;){let l=!0,I=!1;if(!c||a>o[c-1].to){let E=yo[a-1];E!=s&&(l=!1,I=E==16)}let C=!l&&s==1?[]:null,d=l?i:i+1,B=a;A:for(;;)if(c&&B==o[c-1].to){if(I)break A;let E=o[--c];if(!l)for(let h=E.from,u=c;;){if(h==e)break A;if(u&&o[u-1].to==h)h=o[--u].from;else{if(yo[h-1]==s)break A;break}}if(C)C.push(E);else{E.toyo.length;)yo[yo.length]=256;let i=[],n=e==bC?0:1;return SL(t,n,n,A,0,t.length,i),i}function mtA(t){return[new Sg(0,t,0)]}var ptA="";function qRA(t,e,A,i,n){var o;let r=i.head-t.from,s=Sg.find(e,r,(o=i.bidiLevel)!==null&&o!==void 0?o:-1,i.assoc),a=e[s],c=a.side(n,A);if(r==c){let C=s+=n?1:-1;if(C<0||C>=e.length)return null;a=e[s=C],r=a.side(!n,A),c=a.side(n,A)}let l=yr(t.text,r,a.forward(n,A));(la.to)&&(l=c),ptA=t.text.slice(Math.min(r,l),Math.max(r,l));let I=s==(n?e.length-1:0)?null:e[s+(n?1:-1)];return I&&l==c&&I.level+(n?0:1)t.some(e=>e)}),ktA=qe.define({combine:t=>t.some(e=>e)}),StA=qe.define(),Z4=class t{constructor(e,A="nearest",i="nearest",n=5,o=5,r=!1){this.range=e,this.y=A,this.x=i,this.yMargin=n,this.xMargin=o,this.isSnapshot=r}map(e){return e.empty?this:new t(this.range.map(e),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(e){return this.range.to<=e.doc.length?this:new t(ae.cursor(e.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}},Ew=Pi.define({map:(t,e)=>t.map(e)}),RtA=Pi.define();function Xr(t,e,A){let i=t.facet(vtA);i.length?i[0](e):window.onerror&&window.onerror(String(e),A,void 0,void 0,e)||(A?console.error(A+":",e):console.error(e))}var H0=qe.define({combine:t=>t.length?t[0]:!0}),ZRA=0,SE=qe.define({combine(t){return t.filter((e,A)=>{for(let i=0;i{let a=[];return r&&a.push(a3.of(c=>{let l=c.plugin(s);return l?r(l):ut.none})),o&&a.push(o(s)),a})}static fromClass(e,A){return t.define((i,n)=>new e(i,n),A)}},W4=class{constructor(e){this.spec=e,this.mustUpdate=null,this.value=null}get plugin(){return this.spec&&this.spec.plugin}update(e){if(this.value){if(this.mustUpdate){let A=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(A)}catch(i){if(Xr(A.state,i,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch{}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.plugin.create(e,this.spec.arg)}catch(A){Xr(e.state,A,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(e){var A;if(!((A=this.value)===null||A===void 0)&&A.destroy)try{this.value.destroy()}catch(i){Xr(e.state,i,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}},peA=qe.define(),RL=qe.define(),a3=qe.define(),xtA=qe.define(),gF=qe.define(),LtA=qe.define();function weA(t,e){let A=t.state.facet(LtA);if(!A.length)return A;let i=A.map(o=>o instanceof Function?o(t):o),n=[];return co.spans(i,e.from,e.to,{point(){},span(o,r,s,a){let c=o-e.from,l=r-e.from,I=n;for(let C=s.length-1;C>=0;C--,a--){let d=s[C].spec.bidiIsolate,B;if(d==null&&(d=VRA(e.text,c,l)),a>0&&I.length&&(B=I[I.length-1]).to==c&&B.direction==d)B.to=l,I=B.inner;else{let E={from:c,to:l,direction:d,inner:[]};I.push(E),I=E.inner}}}}),n}var FtA=qe.define();function IF(t){let e=0,A=0,i=0,n=0;for(let o of t.state.facet(FtA)){let r=o(t);r&&(r.left!=null&&(e=Math.max(e,r.left)),r.right!=null&&(A=Math.max(A,r.right)),r.top!=null&&(i=Math.max(i,r.top)),r.bottom!=null&&(n=Math.max(n,r.bottom)))}return{left:e,right:A,top:i,bottom:n}}var H4=qe.define(),Rg=class t{constructor(e,A,i,n){this.fromA=e,this.toA=A,this.fromB=i,this.toB=n}join(e){return new t(Math.min(this.fromA,e.fromA),Math.max(this.toA,e.toA),Math.min(this.fromB,e.fromB),Math.max(this.toB,e.toB))}addToSet(e){let A=e.length,i=this;for(;A>0;A--){let n=e[A-1];if(!(n.fromA>i.toA)){if(n.toAl)break;o+=2}if(!a)return i;new t(a.fromA,a.toA,a.fromB,a.toB).addToSet(i),r=a.toA,s=a.toB}}},Fw=class t{constructor(e,A,i){this.view=e,this.state=A,this.transactions=i,this.flags=0,this.startState=e.state,this.changes=Cs.empty(this.startState.doc.length);for(let o of i)this.changes=this.changes.compose(o.changes);let n=[];this.changes.iterChangedRanges((o,r,s,a)=>n.push(new Rg(o,r,s,a))),this.changedRanges=n}static create(e,A,i){return new t(e,A,i)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(e=>e.selection)}get empty(){return this.flags==0&&this.transactions.length==0}},Nw=class extends Fo{get length(){return this.view.state.doc.length}constructor(e){super(),this.view=e,this.decorations=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.markedForComposition=new Set,this.editContextFormatting=ut.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.setDOM(e.contentDOM),this.children=[new Es],this.children[0].setParent(this),this.updateDeco(),this.updateInner([new Rg(0,0,0,e.state.doc.length)],0,null)}update(e){var A;let i=e.changedRanges;this.minWidth>0&&i.length&&(i.every(({fromA:c,toA:l})=>lthis.minWidthTo)?(this.minWidthFrom=e.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=e.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(e);let n=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((A=this.domChanged)===null||A===void 0)&&A.newSel?n=this.domChanged.newSel.head:!ixA(e.changes,this.hasComposition)&&!e.selectionSet&&(n=e.state.selection.main.head));let o=n>-1?XRA(this.view,e.changes,n):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:c,to:l}=this.hasComposition;i=new Rg(c,l,e.changes.mapPos(c,-1),e.changes.mapPos(l,1)).addToSet(i.slice())}this.hasComposition=o?{from:o.range.fromB,to:o.range.toB}:null,(At.ie||At.chrome)&&!o&&e&&e.state.doc.lines!=e.startState.doc.lines&&(this.forceSelection=!0);let r=this.decorations,s=this.updateDeco(),a=exA(r,s,e.changes);return i=Rg.extendWithRanges(i,a),!(this.flags&7)&&i.length==0?!1:(this.updateInner(i,e.startState.doc.length,o),e.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(e,A,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(e,A,i);let{observer:n}=this.view;n.ignore(()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let r=At.chrome||At.ios?{node:n.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,r),this.flags&=-8,r&&(r.written||n.selectionRange.focusNode!=r.node)&&(this.forceSelection=!0),this.dom.style.height=""}),this.markedForComposition.forEach(r=>r.flags&=-9);let o=[];if(this.view.viewport.from||this.view.viewport.to=0?n[r]:null;if(!s)break;let{fromA:a,toA:c,fromB:l,toB:I}=s,C,d,B,E;if(i&&i.range.fromBl){let R=V4.build(this.view.state.doc,l,i.range.fromB,this.decorations,this.dynamicDecorationMap),w=V4.build(this.view.state.doc,i.range.toB,I,this.decorations,this.dynamicDecorationMap);d=R.breakAtStart,B=R.openStart,E=w.openEnd;let _=this.compositionView(i);w.breakAtStart?_.breakAfter=1:w.content.length&&_.merge(_.length,_.length,w.content[0],!1,w.openStart,0)&&(_.breakAfter=w.content[0].breakAfter,w.content.shift()),R.content.length&&_.merge(0,0,R.content[R.content.length-1],!0,0,R.openEnd)&&R.content.pop(),C=R.content.concat(_).concat(w.content)}else({content:C,breakAtStart:d,openStart:B,openEnd:E}=V4.build(this.view.state.doc,l,I,this.decorations,this.dynamicDecorationMap));let{i:h,off:u}=o.findPos(c,1),{i:D,off:L}=o.findPos(a,-1);ltA(this,D,L,h,u,C,d,B,E)}i&&this.fixCompositionDOM(i)}updateEditContextFormatting(e){this.editContextFormatting=this.editContextFormatting.map(e.changes);for(let A of e.transactions)for(let i of A.effects)i.is(RtA)&&(this.editContextFormatting=i.value)}compositionView(e){let A=new Lg(e.text.nodeValue);A.flags|=8;for(let{deco:n}of e.marks)A=new D1(n,[A],A.length);let i=new Es;return i.append(A,0),i}fixCompositionDOM(e){let A=(o,r)=>{r.flags|=8|(r.children.some(a=>a.flags&7)?1:0),this.markedForComposition.add(r);let s=Fo.get(o);s&&s!=r&&(s.dom=null),r.setDOM(o)},i=this.childPos(e.range.fromB,1),n=this.children[i.i];A(e.line,n);for(let o=e.marks.length-1;o>=-1;o--)i=n.childPos(i.off,1),n=n.children[i.i],A(o>=0?e.marks[o].node:e.text,n)}updateSelection(e=!1,A=!1){(e||!this.view.observer.selectionRange.focusNode)&&this.view.observer.readSelectionRange();let i=this.view.root.activeElement,n=i==this.dom,o=!n&&!(this.view.state.facet(H0)||this.dom.tabIndex>-1)&&Dw(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(n||A||o))return;let r=this.forceSelection;this.forceSelection=!1;let s=this.view.state.selection.main,a=this.moveToLine(this.domAtPos(s.anchor)),c=s.empty?a:this.moveToLine(this.domAtPos(s.head));if(At.gecko&&s.empty&&!this.hasComposition&&WRA(a)){let I=document.createTextNode("");this.view.observer.ignore(()=>a.node.insertBefore(I,a.node.childNodes[a.offset]||null)),a=c=new Xs(I,0),r=!0}let l=this.view.observer.selectionRange;(r||!l.focusNode||(!q4(a.node,a.offset,l.anchorNode,l.anchorOffset)||!q4(c.node,c.offset,l.focusNode,l.focusOffset))&&!this.suppressWidgetCursorChange(l,s))&&(this.view.observer.ignore(()=>{At.android&&At.chrome&&this.dom.contains(l.focusNode)&&txA(l.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let I=e3(this.view.root);if(I)if(s.empty){if(At.gecko){let C=$RA(a.node,a.offset);if(C&&C!=3){let d=(C==1?atA:ctA)(a.node,a.offset);d&&(a=new Xs(d.node,d.offset))}}I.collapse(a.node,a.offset),s.bidiLevel!=null&&I.caretBidiLevel!==void 0&&(I.caretBidiLevel=s.bidiLevel)}else if(I.extend){I.collapse(a.node,a.offset);try{I.extend(c.node,c.offset)}catch{}}else{let C=document.createRange();s.anchor>s.head&&([a,c]=[c,a]),C.setEnd(c.node,c.offset),C.setStart(a.node,a.offset),I.removeAllRanges(),I.addRange(C)}o&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())}),this.view.observer.setSelectionRange(a,c)),this.impreciseAnchor=a.precise?null:new Xs(l.anchorNode,l.anchorOffset),this.impreciseHead=c.precise?null:new Xs(l.focusNode,l.focusOffset)}suppressWidgetCursorChange(e,A){return this.hasComposition&&A.empty&&q4(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset)&&this.posFromDOM(e.focusNode,e.focusOffset)==A.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:e}=this,A=e.state.selection.main,i=e3(e.root),{anchorNode:n,anchorOffset:o}=e.observer.selectionRange;if(!i||!A.empty||!A.assoc||!i.modify)return;let r=Es.find(this,A.head);if(!r)return;let s=r.posAtStart;if(A.head==s||A.head==s+r.length)return;let a=this.coordsAt(A.head,-1),c=this.coordsAt(A.head,1);if(!a||!c||a.bottom>c.top)return;let l=this.domAtPos(A.head+A.assoc);i.collapse(l.node,l.offset),i.modify("move",A.assoc<0?"forward":"backward","lineboundary"),e.observer.readSelectionRange();let I=e.observer.selectionRange;e.docView.posFromDOM(I.anchorNode,I.anchorOffset)!=A.from&&i.collapse(n,o)}moveToLine(e){let A=this.dom,i;if(e.node!=A)return e;for(let n=e.offset;!i&&n=0;n--){let o=Fo.get(A.childNodes[n]);o instanceof Es&&(i=o.domAtPos(o.length))}return i?new Xs(i.node,i.offset,!0):e}nearest(e){for(let A=e;A;){let i=Fo.get(A);if(i&&i.rootView==this)return i;A=A.parentNode}return null}posFromDOM(e,A){let i=this.nearest(e);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(e,A)+i.posAtStart}domAtPos(e){let{i:A,off:i}=this.childCursor().findPos(e,-1);for(;A=0;r--){let s=this.children[r],a=o-s.breakAfter,c=a-s.length;if(ae||s.covers(1))&&(!i||s instanceof Es&&!(i instanceof Es&&A>=0)))i=s,n=c;else if(i&&c==e&&a==e&&s instanceof DC&&Math.abs(A)<2){if(s.deco.startSide<0)break;r&&(i=null)}o=c}return i?i.coordsAt(e-n,A):null}coordsForChar(e){let{i:A,off:i}=this.childPos(e,1),n=this.children[A];if(!(n instanceof Es))return null;for(;n.children.length;){let{i:s,off:a}=n.childPos(i,1);for(;;s++){if(s==n.children.length)return null;if((n=n.children[s]).length)break}i=a}if(!(n instanceof Lg))return null;let o=yr(n.text,i);if(o==i)return null;let r=vC(n.dom,i,o).getClientRects();for(let s=0;sMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,s=-1,a=this.view.textDirection==lo.LTR;for(let c=0,l=0;ln)break;if(c>=i){let d=I.dom.getBoundingClientRect();if(A.push(d.height),r){let B=I.dom.lastChild,E=B?t3(B):[];if(E.length){let h=E[E.length-1],u=a?h.right-d.left:d.right-h.left;u>s&&(s=u,this.minWidth=o,this.minWidthFrom=c,this.minWidthTo=C)}}}c=C+I.breakAfter}return A}textDirectionAt(e){let{i:A}=this.childPos(e,1);return getComputedStyle(this.children[A].dom).direction=="rtl"?lo.RTL:lo.LTR}measureTextSize(){for(let o of this.children)if(o instanceof Es){let r=o.measureTextSize();if(r)return r}let e=document.createElement("div"),A,i,n;return e.className="cm-line",e.style.width="99999px",e.style.position="absolute",e.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.dom.appendChild(e);let o=t3(e.firstChild)[0];A=e.getBoundingClientRect().height,i=o?o.width/27:7,n=o?o.height:A,e.remove()}),{lineHeight:A,charWidth:i,textHeight:n}}childCursor(e=this.length){let A=this.children.length;return A&&(e-=this.children[--A].length),new xw(this.children,e,A)}computeBlockGapDeco(){let e=[],A=this.view.viewState;for(let i=0,n=0;;n++){let o=n==A.viewports.length?null:A.viewports[n],r=o?o.from-1:this.length;if(r>i){let s=(A.lineBlockAt(r).bottom-A.lineBlockAt(i).top)/this.view.scaleY;e.push(ut.replace({widget:new s3(s),block:!0,inclusive:!0,isBlockGap:!0}).range(i,r))}if(!o)break;i=o.to+1}return ut.set(e)}updateDeco(){let e=1,A=this.view.state.facet(a3).map(o=>(this.dynamicDecorationMap[e++]=typeof o=="function")?o(this.view):o),i=!1,n=this.view.state.facet(xtA).map((o,r)=>{let s=typeof o=="function";return s&&(i=!0),s?o(this.view):o});for(n.length&&(this.dynamicDecorationMap[e++]=i,A.push(co.join(n))),this.decorations=[this.editContextFormatting,...A,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];eA.anchor?-1:1),n;if(!i)return;!A.empty&&(n=this.coordsAt(A.anchor,A.anchor>A.head?-1:1))&&(i={left:Math.min(i.left,n.left),top:Math.min(i.top,n.top),right:Math.max(i.right,n.right),bottom:Math.max(i.bottom,n.bottom)});let o=IF(this.view),r={left:i.left-o.left,top:i.top-o.top,right:i.right+o.right,bottom:i.bottom+o.bottom},{offsetWidth:s,offsetHeight:a}=this.view.scrollDOM;RRA(this.view.scrollDOM,r,A.head{ie.from&&(A=!0)}),A}function nxA(t,e,A=1){let i=t.charCategorizer(e),n=t.doc.lineAt(e),o=e-n.from;if(n.length==0)return ae.cursor(e);o==0?A=1:o==n.length&&(A=-1);let r=o,s=o;A<0?r=yr(n.text,o,!1):s=yr(n.text,o);let a=i(n.text.slice(r,s));for(;r>0;){let c=yr(n.text,r,!1);if(i(n.text.slice(c,r))!=a)break;r=c}for(;st?e.left-t:Math.max(0,t-e.right)}function rxA(t,e){return e.top>t?e.top-t:Math.max(0,t-e.bottom)}function dL(t,e){return t.tope.top+1}function DeA(t,e){return et.bottom?{top:t.top,left:t.left,right:t.right,bottom:e}:t}function xL(t,e,A){let i,n,o,r,s=!1,a,c,l,I;for(let B=t.firstChild;B;B=B.nextSibling){let E=t3(B);for(let h=0;hL||r==L&&o>D)&&(i=B,n=u,o=D,r=L,s=D?e0:hu.bottom&&(!l||l.bottomu.top)&&(c=B,I=u):l&&dL(l,u)?l=yeA(l,u.bottom):I&&dL(I,u)&&(I=DeA(I,u.top))}}if(l&&l.bottom>=A?(i=a,n=l):I&&I.top<=A&&(i=c,n=I),!i)return{node:t,offset:0};let C=Math.max(n.left,Math.min(n.right,e));if(i.nodeType==3)return veA(i,C,A);if(s&&i.contentEditable!="false")return xL(i,C,A);let d=Array.prototype.indexOf.call(t.childNodes,i)+(e>=(n.left+n.right)/2?1:0);return{node:t,offset:d}}function veA(t,e,A){let i=t.nodeValue.length,n=-1,o=1e9,r=0;for(let s=0;sA?l.top-A:A-l.bottom)-1;if(l.left-1<=e&&l.right+1>=e&&I=(l.left+l.right)/2,d=C;if((At.chrome||At.gecko)&&vC(t,s).getBoundingClientRect().left==l.right&&(d=!C),I<=0)return{node:t,offset:s+(d?1:0)};n=s+(d?1:0),o=I}}}return{node:t,offset:n>-1?n:r>0?t.nodeValue.length:0}}function _tA(t,e,A,i=-1){var n,o;let r=t.contentDOM.getBoundingClientRect(),s=r.top+t.viewState.paddingTop,a,{docHeight:c}=t.viewState,{x:l,y:I}=e,C=I-s;if(C<0)return 0;if(C>c)return t.state.doc.length;for(let R=t.viewState.heightOracle.textHeight/2,w=!1;a=t.elementAtHeight(C),a.type!=$s.Text;)for(;C=i>0?a.bottom+R:a.top-R,!(C>=0&&C<=c);){if(w)return A?null:0;w=!0,i=-i}I=s+C;let d=a.from;if(dt.viewport.to)return t.viewport.to==t.state.doc.length?t.state.doc.length:A?null:beA(t,r,a,l,I);let B=t.dom.ownerDocument,E=t.root.elementFromPoint?t.root:B,h=E.elementFromPoint(l,I);h&&!t.contentDOM.contains(h)&&(h=null),h||(l=Math.max(r.left+1,Math.min(r.right-1,l)),h=E.elementFromPoint(l,I),h&&!t.contentDOM.contains(h)&&(h=null));let u,D=-1;if(h&&((n=t.docView.nearest(h))===null||n===void 0?void 0:n.isEditable)!=!1){if(B.caretPositionFromPoint){let R=B.caretPositionFromPoint(l,I);R&&({offsetNode:u,offset:D}=R)}else if(B.caretRangeFromPoint){let R=B.caretRangeFromPoint(l,I);R&&({startContainer:u,startOffset:D}=R,(!t.contentDOM.contains(u)||At.safari&&sxA(u,D,l)||At.chrome&&axA(u,D,l))&&(u=void 0))}u&&(D=Math.min(xg(u),D))}if(!u||!t.docView.dom.contains(u)){let R=Es.find(t.docView,d);if(!R)return C>a.top+a.height/2?a.to:a.from;({node:u,offset:D}=xL(R.dom,l,I))}let L=t.docView.nearest(u);if(!L)return null;if(L.isWidget&&((o=L.dom)===null||o===void 0?void 0:o.nodeType)==1){let R=L.dom.getBoundingClientRect();return e.yt.defaultLineHeight*1.5){let s=t.viewState.heightOracle.textHeight,a=Math.floor((n-A.top-(t.defaultLineHeight-s)*.5)/s);o+=a*t.viewState.heightOracle.lineLength}let r=t.state.sliceDoc(A.from,A.to);return A.from+Cw(r,o,t.state.tabSize)}function sxA(t,e,A){let i,n=t;if(t.nodeType!=3||e!=(i=t.nodeValue.length))return!1;for(;;){let o=n.nextSibling;if(o){if(o.nodeName=="BR")break;return!1}else{let r=n.parentNode;if(!r||r.nodeName=="DIV")break;n=r}}return vC(t,i-1,i).getBoundingClientRect().right>A}function axA(t,e,A){if(e!=0)return!1;for(let n=t;;){let o=n.parentNode;if(!o||o.nodeType!=1||o.firstChild!=n)return!1;if(o.classList.contains("cm-line"))break;n=o}let i=t.nodeType==1?t.getBoundingClientRect():vC(t,0,Math.max(t.nodeValue.length,1)).getBoundingClientRect();return A-i.left>5}function LL(t,e,A){let i=t.lineBlockAt(e);if(Array.isArray(i.type)){let n;for(let o of i.type){if(o.from>e)break;if(!(o.toe)return o;(!n||o.type==$s.Text&&(n.type!=o.type||(A<0?o.frome)))&&(n=o)}}return n||i}return i}function cxA(t,e,A,i){let n=LL(t,e.head,e.assoc||-1),o=!i||n.type!=$s.Text||!(t.lineWrapping||n.widgetLineBreaks)?null:t.coordsAtPos(e.assoc<0&&e.head>n.from?e.head-1:e.head);if(o){let r=t.dom.getBoundingClientRect(),s=t.textDirectionAt(n.from),a=t.posAtCoords({x:A==(s==lo.LTR)?r.right-1:r.left+1,y:(o.top+o.bottom)/2});if(a!=null)return ae.cursor(a,A?-1:1)}return ae.cursor(A?n.to:n.from,A?-1:1)}function MeA(t,e,A,i){let n=t.state.doc.lineAt(e.head),o=t.bidiSpans(n),r=t.textDirectionAt(n.from);for(let s=e,a=null;;){let c=qRA(n,o,r,s,A),l=ptA;if(!c){if(n.number==(A?t.state.doc.lines:1))return s;l=` -`,n=t.state.doc.line(n.number+(A?1:-1)),o=t.bidiSpans(n),c=t.visualLineSide(n,!A)}if(a){if(!a(l))return s}else{if(!i)return c;a=i(l)}s=c}}function lxA(t,e,A){let i=t.state.charCategorizer(e),n=i(A);return o=>{let r=i(o);return n==ao.Space&&(n=r),n==r}}function gxA(t,e,A,i){let n=e.head,o=A?1:-1;if(n==(A?t.state.doc.length:0))return ae.cursor(n,e.assoc);let r=e.goalColumn,s,a=t.contentDOM.getBoundingClientRect(),c=t.coordsAtPos(n,e.assoc||-1),l=t.documentTop;if(c)r==null&&(r=c.left-a.left),s=o<0?c.top:c.bottom;else{let d=t.viewState.lineBlockAt(n);r==null&&(r=Math.min(a.right-a.left,t.defaultCharacterWidth*(n-d.from))),s=(o<0?d.top:d.bottom)+l}let I=a.left+r,C=i??t.viewState.heightOracle.textHeight>>1;for(let d=0;;d+=10){let B=s+(C+d)*o,E=_tA(t,{x:I,y:B},!1,o);if(Ba.bottom||(o<0?En)){let h=t.docView.coordsForChar(E),u=!h||B{if(e>o&&en(t)),A.from,e.head>A.from?-1:1);return i==A.from?A:ae.cursor(i,io)&&this.lineBreak(),n=r}return this.findPointBefore(i,A),this}readTextNode(e){let A=e.nodeValue;for(let i of this.points)i.node==e&&(i.pos=this.text.length+Math.min(i.offset,A.length));for(let i=0,n=this.lineSeparator?null:/\r\n?|\n/g;;){let o=-1,r=1,s;if(this.lineSeparator?(o=A.indexOf(this.lineSeparator,i),r=this.lineSeparator.length):(s=n.exec(A))&&(o=s.index,r=s[0].length),this.append(A.slice(i,o<0?A.length:o)),o<0)break;if(this.lineBreak(),r>1)for(let a of this.points)a.node==e&&a.pos>this.text.length&&(a.pos-=r-1);i=o+r}}readNode(e){if(e.cmIgnore)return;let A=Fo.get(e),i=A&&A.overrideDOMText;if(i!=null){this.findPointInside(e,i.length);for(let n=i.iter();!n.next().done;)n.lineBreak?this.lineBreak():this.append(n.value)}else e.nodeType==3?this.readTextNode(e):e.nodeName=="BR"?e.nextSibling&&this.lineBreak():e.nodeType==1&&this.readRange(e.firstChild,null)}findPointBefore(e,A){for(let i of this.points)i.node==e&&e.childNodes[i.offset]==A&&(i.pos=this.text.length)}findPointInside(e,A){for(let i of this.points)(e.nodeType==3?i.node==e:e.contains(i.node))&&(i.pos=this.text.length+(IxA(e,i.node,i.offset)?A:0))}};function IxA(t,e,A){for(;;){if(!e||A-1;let{impreciseHead:o,impreciseAnchor:r}=e.docView;if(e.state.readOnly&&A>-1)this.newSel=null;else if(A>-1&&(this.bounds=e.docView.domBoundsAround(A,i,0))){let s=o||r?[]:BxA(e),a=new FL(s,e.state);a.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=a.text,this.newSel=ExA(s,this.bounds.from)}else{let s=e.observer.selectionRange,a=o&&o.node==s.focusNode&&o.offset==s.focusOffset||!mL(e.contentDOM,s.focusNode)?e.state.selection.main.head:e.docView.posFromDOM(s.focusNode,s.focusOffset),c=r&&r.node==s.anchorNode&&r.offset==s.anchorOffset||!mL(e.contentDOM,s.anchorNode)?e.state.selection.main.anchor:e.docView.posFromDOM(s.anchorNode,s.anchorOffset),l=e.viewport;if((At.ios||At.chrome)&&e.state.selection.main.empty&&a!=c&&(l.from>0||l.toDate.now()-100?t.inputState.lastKeyCode:-1;if(e.bounds){let{from:r,to:s}=e.bounds,a=n.from,c=null;(o===8||At.android&&e.text.length=n.from&&A.to<=n.to&&(A.from!=n.from||A.to!=n.to)&&n.to-n.from-(A.to-A.from)<=4?A={from:n.from,to:n.to,insert:t.state.doc.slice(n.from,A.from).append(A.insert).append(t.state.doc.slice(A.to,n.to))}:At.chrome&&A&&A.from==A.to&&A.from==n.head&&A.insert.toString()==` - `&&t.lineWrapping&&(i&&(i=ae.single(i.main.anchor-1,i.main.head-1)),A={from:n.from,to:n.to,insert:In.of([" "])}),A)return CF(t,A,i,o);if(i&&!i.main.eq(n)){let r=!1,s="select";return t.inputState.lastSelectionTime>Date.now()-50&&(t.inputState.lastSelectionOrigin=="select"&&(r=!0),s=t.inputState.lastSelectionOrigin),t.dispatch({selection:i,scrollIntoView:r,userEvent:s}),!0}else return!1}function CF(t,e,A,i=-1){if(At.ios&&t.inputState.flushIOSKey(e))return!0;let n=t.state.selection.main;if(At.android&&(e.to==n.to&&(e.from==n.from||e.from==n.from-1&&t.state.sliceDoc(e.from,n.from)==" ")&&e.insert.length==1&&e.insert.lines==2&&FE(t.contentDOM,"Enter",13)||(e.from==n.from-1&&e.to==n.to&&e.insert.length==0||i==8&&e.insert.lengthn.head)&&FE(t.contentDOM,"Backspace",8)||e.from==n.from&&e.to==n.to+1&&e.insert.length==0&&FE(t.contentDOM,"Delete",46)))return!0;let o=e.insert.toString();t.inputState.composing>=0&&t.inputState.composing++;let r,s=()=>r||(r=CxA(t,e,A));return t.state.facet(btA).some(a=>a(t,e.from,e.to,o,s))||t.dispatch(s()),!0}function CxA(t,e,A){let i,n=t.state,o=n.selection.main;if(e.from>=o.from&&e.to<=o.to&&e.to-e.from>=(o.to-o.from)/3&&(!A||A.main.empty&&A.main.from==e.from+e.insert.length)&&t.inputState.composing<0){let s=o.frome.to?n.sliceDoc(e.to,o.to):"";i=n.replaceSelection(t.state.toText(s+e.insert.sliceString(0,void 0,t.state.lineBreak)+a))}else{let s=n.changes(e),a=A&&A.main.to<=s.newLength?A.main:void 0;if(n.selection.ranges.length>1&&t.inputState.composing>=0&&e.to<=o.to&&e.to>=o.to-10){let c=t.state.sliceDoc(e.from,e.to),l,I=A&&NtA(t,A.main.head);if(I){let B=e.insert.length-(e.to-e.from);l={from:I.from,to:I.to-B}}else l=t.state.doc.lineAt(o.head);let C=o.to-e.to,d=o.to-o.from;i=n.changeByRange(B=>{if(B.from==o.from&&B.to==o.to)return{changes:s,range:a||B.map(s)};let E=B.to-C,h=E-c.length;if(B.to-B.from!=d||t.state.sliceDoc(h,E)!=c||B.to>=l.from&&B.from<=l.to)return{range:B};let u=n.changes({from:h,to:E,insert:e.insert}),D=B.to-o.to;return{changes:u,range:a?ae.range(Math.max(0,a.anchor+D),Math.max(0,a.head+D)):B.map(u)}})}else i={changes:s,selection:a&&n.selection.replaceRange(a)}}let r="input.type";return(t.composing||t.inputState.compositionPendingChange&&t.inputState.compositionEndedAt>Date.now()-50)&&(t.inputState.compositionPendingChange=!1,r+=".compose",t.inputState.compositionFirstChange&&(r+=".start",t.inputState.compositionFirstChange=!1)),n.update(i,{userEvent:r,scrollIntoView:!0})}function dxA(t,e,A,i){let n=Math.min(t.length,e.length),o=0;for(;o0&&s>0&&t.charCodeAt(r-1)==e.charCodeAt(s-1);)r--,s--;if(i=="end"){let a=Math.max(0,o-Math.min(r,s));A-=r+a-o}if(r=r?o-A:0;o-=a,s=o+(s-r),r=o}else if(s=s?o-A:0;o-=a,r=o+(r-s),s=o}return{from:o,toA:r,toB:s}}function BxA(t){let e=[];if(t.root.activeElement!=t.contentDOM)return e;let{anchorNode:A,anchorOffset:i,focusNode:n,focusOffset:o}=t.observer.selectionRange;return A&&(e.push(new _w(A,i)),(n!=A||o!=i)&&e.push(new _w(n,o))),e}function ExA(t,e){if(t.length==0)return null;let A=t[0].pos,i=t.length==2?t[1].pos:A;return A>-1&&i>-1?ae.single(A+e,i+e):null}var _L=class{setSelectionOrigin(e){this.lastSelectionOrigin=e,this.lastSelectionTime=Date.now()}constructor(e){this.view=e,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=e.hasFocus,At.safari&&e.contentDOM.addEventListener("input",()=>null),At.gecko&&RxA(e.contentDOM.ownerDocument)}handleEvent(e){!wxA(this.view,e)||this.ignoreDuringComposition(e)||e.type=="keydown"&&this.keydown(e)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(e.type,e)):this.runHandlers(e.type,e))}runHandlers(e,A){let i=this.handlers[e];if(i){for(let n of i.observers)n(this.view,A);for(let n of i.handlers){if(A.defaultPrevented)break;if(n(this.view,A)){A.preventDefault();break}}}}ensureHandlers(e){let A=QxA(e),i=this.handlers,n=this.view.contentDOM;for(let o in A)if(o!="scroll"){let r=!A[o].handlers.length,s=i[o];s&&r!=!s.handlers.length&&(n.removeEventListener(o,this.handleEvent),s=null),s||n.addEventListener(o,this.handleEvent,{passive:r})}for(let o in i)o!="scroll"&&!A[o]&&n.removeEventListener(o,this.handleEvent);this.handlers=A}keydown(e){if(this.lastKeyCode=e.keyCode,this.lastKeyTime=Date.now(),e.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&e.keyCode!=27&&KtA.indexOf(e.keyCode)<0&&(this.tabFocusMode=-1),At.android&&At.chrome&&!e.synthetic&&(e.keyCode==13||e.keyCode==8))return this.view.observer.delayAndroidKey(e.key,e.keyCode),!0;let A;return At.ios&&!e.synthetic&&!e.altKey&&!e.metaKey&&((A=UtA.find(i=>i.keyCode==e.keyCode))&&!e.ctrlKey||hxA.indexOf(e.key)>-1&&e.ctrlKey&&!e.shiftKey)?(this.pendingIOSKey=A||e,setTimeout(()=>this.flushIOSKey(),250),!0):(e.keyCode!=229&&this.view.observer.forceFlush(),!1)}flushIOSKey(e){let A=this.pendingIOSKey;return!A||A.key=="Enter"&&e&&e.from0?!0:At.safari&&!At.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1:!1}startMouseSelection(e){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=e}update(e){this.view.observer.update(e),this.mouseSelection&&this.mouseSelection.update(e),this.draggedContent&&e.docChanged&&(this.draggedContent=this.draggedContent.map(e.changes)),e.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}};function keA(t,e){return(A,i)=>{try{return e.call(t,i,A)}catch(n){Xr(A.state,n)}}}function QxA(t){let e=Object.create(null);function A(i){return e[i]||(e[i]={observers:[],handlers:[]})}for(let i of t){let n=i.spec,o=n&&n.plugin.domEventHandlers,r=n&&n.plugin.domEventObservers;if(o)for(let s in o){let a=o[s];a&&A(s).handlers.push(keA(i.value,a))}if(r)for(let s in r){let a=r[s];a&&A(s).observers.push(keA(i.value,a))}}for(let i in yl)A(i).handlers.push(yl[i]);for(let i in Jc)A(i).observers.push(Jc[i]);return e}var UtA=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],hxA="dthko",KtA=[16,17,18,20,91,92,224,225],Qw=6;function hw(t){return Math.max(0,t)*.7+8}function uxA(t,e){return Math.max(Math.abs(t.clientX-e.clientX),Math.abs(t.clientY-e.clientY))}var GL=class{constructor(e,A,i,n){this.view=e,this.startEvent=A,this.style=i,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=A,this.scrollParents=xRA(e.contentDOM),this.atoms=e.state.facet(gF).map(r=>r(e));let o=e.contentDOM.ownerDocument;o.addEventListener("mousemove",this.move=this.move.bind(this)),o.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=A.shiftKey,this.multiple=e.state.facet(hr.allowMultipleSelections)&&fxA(e,A),this.dragging=pxA(e,A)&&TtA(A)==1?null:!1}start(e){this.dragging===!1&&this.select(e)}move(e){if(e.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&uxA(this.startEvent,e)<10)return;this.select(this.lastEvent=e);let A=0,i=0,n=0,o=0,r=this.view.win.innerWidth,s=this.view.win.innerHeight;this.scrollParents.x&&({left:n,right:r}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:o,bottom:s}=this.scrollParents.y.getBoundingClientRect());let a=IF(this.view);e.clientX-a.left<=n+Qw?A=-hw(n-e.clientX):e.clientX+a.right>=r-Qw&&(A=hw(e.clientX-r)),e.clientY-a.top<=o+Qw?i=-hw(o-e.clientY):e.clientY+a.bottom>=s-Qw&&(i=hw(e.clientY-s)),this.setScrollSpeed(A,i)}up(e){this.dragging==null&&this.select(this.lastEvent),this.dragging||e.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let e=this.view.contentDOM.ownerDocument;e.removeEventListener("mousemove",this.move),e.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(e,A){this.scrollSpeed={x:e,y:A},e||A?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:e,y:A}=this.scrollSpeed;e&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=e,e=0),A&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=A,A=0),(e||A)&&this.view.win.scrollBy(e,A),this.dragging===!1&&this.select(this.lastEvent)}skipAtoms(e){let A=null;for(let i=0;iA.isUserEvent("input.type"))?this.destroy():this.style.update(e)&&setTimeout(()=>this.select(this.lastEvent),20)}};function fxA(t,e){let A=t.state.facet(wtA);return A.length?A[0](e):At.mac?e.metaKey:e.ctrlKey}function mxA(t,e){let A=t.state.facet(DtA);return A.length?A[0](e):At.mac?!e.altKey:!e.ctrlKey}function pxA(t,e){let{main:A}=t.state.selection;if(A.empty)return!1;let i=e3(t.root);if(!i||i.rangeCount==0)return!0;let n=i.getRangeAt(0).getClientRects();for(let o=0;o=e.clientX&&r.top<=e.clientY&&r.bottom>=e.clientY)return!0}return!1}function wxA(t,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let A=e.target,i;A!=t.contentDOM;A=A.parentNode)if(!A||A.nodeType==11||(i=Fo.get(A))&&i.ignoreEvent(e))return!1;return!0}var yl=Object.create(null),Jc=Object.create(null),YtA=At.ie&&At.ie_version<15||At.ios&&At.webkit_version<604;function DxA(t){let e=t.dom.parentNode;if(!e)return;let A=e.appendChild(document.createElement("textarea"));A.style.cssText="position: fixed; left: -10000px; top: 10px",A.focus(),setTimeout(()=>{t.focus(),A.remove(),JtA(t,A.value)},50)}function qw(t,e,A){for(let i of t.facet(e))A=i(A,t);return A}function JtA(t,e){e=qw(t.state,cF,e);let{state:A}=t,i,n=1,o=A.toText(e),r=o.lines==A.selection.ranges.length;if(UL!=null&&A.selection.ranges.every(a=>a.empty)&&UL==o.toString()){let a=-1;i=A.changeByRange(c=>{let l=A.doc.lineAt(c.from);if(l.from==a)return{range:c};a=l.from;let I=A.toText((r?o.line(n++).text:e)+A.lineBreak);return{changes:{from:l.from,insert:I},range:ae.cursor(c.from+I.length)}})}else r?i=A.changeByRange(a=>{let c=o.line(n++);return{changes:{from:a.from,to:a.to,insert:c.text},range:ae.cursor(a.from+c.length)}}):i=A.replaceSelection(o);t.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}Jc.scroll=t=>{t.inputState.lastScrollTop=t.scrollDOM.scrollTop,t.inputState.lastScrollLeft=t.scrollDOM.scrollLeft};yl.keydown=(t,e)=>(t.inputState.setSelectionOrigin("select"),e.keyCode==27&&t.inputState.tabFocusMode!=0&&(t.inputState.tabFocusMode=Date.now()+2e3),!1);Jc.touchstart=(t,e)=>{t.inputState.lastTouchTime=Date.now(),t.inputState.setSelectionOrigin("select.pointer")};Jc.touchmove=t=>{t.inputState.setSelectionOrigin("select.pointer")};yl.mousedown=(t,e)=>{if(t.observer.flush(),t.inputState.lastTouchTime>Date.now()-2e3)return!1;let A=null;for(let i of t.state.facet(ytA))if(A=i(t,e),A)break;if(!A&&e.button==0&&(A=bxA(t,e)),A){let i=!t.hasFocus;t.inputState.startMouseSelection(new GL(t,e,A,i)),i&&t.observer.ignore(()=>{otA(t.contentDOM);let o=t.root.activeElement;o&&!o.contains(t.contentDOM)&&o.blur()});let n=t.inputState.mouseSelection;if(n)return n.start(e),n.dragging===!1}return!1};function SeA(t,e,A,i){if(i==1)return ae.cursor(e,A);if(i==2)return nxA(t.state,e,A);{let n=Es.find(t.docView,e),o=t.state.doc.lineAt(n?n.posAtEnd:e),r=n?n.posAtStart:o.from,s=n?n.posAtEnd:o.to;return se>=A.top&&e<=A.bottom&&t>=A.left&&t<=A.right;function yxA(t,e,A,i){let n=Es.find(t.docView,e);if(!n)return 1;let o=e-n.posAtStart;if(o==0)return 1;if(o==n.length)return-1;let r=n.coordsAt(o,-1);if(r&&ReA(A,i,r))return-1;let s=n.coordsAt(o,1);return s&&ReA(A,i,s)?1:r&&r.bottom>=i?-1:1}function xeA(t,e){let A=t.posAtCoords({x:e.clientX,y:e.clientY},!1);return{pos:A,bias:yxA(t,A,e.clientX,e.clientY)}}var vxA=At.ie&&At.ie_version<=11,LeA=null,FeA=0,NeA=0;function TtA(t){if(!vxA)return t.detail;let e=LeA,A=NeA;return LeA=t,NeA=Date.now(),FeA=!e||A>Date.now()-400&&Math.abs(e.clientX-t.clientX)<2&&Math.abs(e.clientY-t.clientY)<2?(FeA+1)%3:1}function bxA(t,e){let A=xeA(t,e),i=TtA(e),n=t.state.selection;return{update(o){o.docChanged&&(A.pos=o.changes.mapPos(A.pos),n=n.map(o.changes))},get(o,r,s){let a=xeA(t,o),c,l=SeA(t,a.pos,a.bias,i);if(A.pos!=a.pos&&!r){let I=SeA(t,A.pos,A.bias,i),C=Math.min(I.from,l.from),d=Math.max(I.to,l.to);l=C1&&(c=MxA(n,a.pos))?c:s?n.addRange(l):ae.create([l])}}}function MxA(t,e){for(let A=0;A=e)return ae.create(t.ranges.slice(0,A).concat(t.ranges.slice(A+1)),t.mainIndex==A?0:t.mainIndex-(t.mainIndex>A?1:0))}return null}yl.dragstart=(t,e)=>{let{selection:{main:A}}=t.state;if(e.target.draggable){let n=t.docView.nearest(e.target);if(n&&n.isWidget){let o=n.posAtStart,r=o+n.length;(o>=A.to||r<=A.from)&&(A=ae.range(o,r))}}let{inputState:i}=t;return i.mouseSelection&&(i.mouseSelection.dragging=!0),i.draggedContent=A,e.dataTransfer&&(e.dataTransfer.setData("Text",qw(t.state,lF,t.state.sliceDoc(A.from,A.to))),e.dataTransfer.effectAllowed="copyMove"),!1};yl.dragend=t=>(t.inputState.draggedContent=null,!1);function _eA(t,e,A,i){if(A=qw(t.state,cF,A),!A)return;let n=t.posAtCoords({x:e.clientX,y:e.clientY},!1),{draggedContent:o}=t.inputState,r=i&&o&&mxA(t,e)?{from:o.from,to:o.to}:null,s={from:n,insert:A},a=t.state.changes(r?[r,s]:s);t.focus(),t.dispatch({changes:a,selection:{anchor:a.mapPos(n,-1),head:a.mapPos(n,1)},userEvent:r?"move.drop":"input.drop"}),t.inputState.draggedContent=null}yl.drop=(t,e)=>{if(!e.dataTransfer)return!1;if(t.state.readOnly)return!0;let A=e.dataTransfer.files;if(A&&A.length){let i=Array(A.length),n=0,o=()=>{++n==A.length&&_eA(t,e,i.filter(r=>r!=null).join(t.state.lineBreak),!1)};for(let r=0;r{/[\x00-\x08\x0e-\x1f]{2}/.test(s.result)||(i[r]=s.result),o()},s.readAsText(A[r])}return!0}else{let i=e.dataTransfer.getData("Text");if(i)return _eA(t,e,i,!0),!0}return!1};yl.paste=(t,e)=>{if(t.state.readOnly)return!0;t.observer.flush();let A=YtA?null:e.clipboardData;return A?(JtA(t,A.getData("text/plain")||A.getData("text/uri-list")),!0):(DxA(t),!1)};function kxA(t,e){let A=t.dom.parentNode;if(!A)return;let i=A.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.value=e,i.focus(),i.selectionEnd=e.length,i.selectionStart=0,setTimeout(()=>{i.remove(),t.focus()},50)}function SxA(t){let e=[],A=[],i=!1;for(let n of t.selection.ranges)n.empty||(e.push(t.sliceDoc(n.from,n.to)),A.push(n));if(!e.length){let n=-1;for(let{from:o}of t.selection.ranges){let r=t.doc.lineAt(o);r.number>n&&(e.push(r.text),A.push({from:r.from,to:Math.min(t.doc.length,r.to+1)})),n=r.number}i=!0}return{text:qw(t,lF,e.join(t.lineBreak)),ranges:A,linewise:i}}var UL=null;yl.copy=yl.cut=(t,e)=>{let{text:A,ranges:i,linewise:n}=SxA(t.state);if(!A&&!n)return!1;UL=n?A:null,e.type=="cut"&&!t.state.readOnly&&t.dispatch({changes:i,scrollIntoView:!0,userEvent:"delete.cut"});let o=YtA?null:e.clipboardData;return o?(o.clearData(),o.setData("text/plain",A),!0):(kxA(t,A),!1)};var HtA=xa.define();function ztA(t,e){let A=[];for(let i of t.facet(MtA)){let n=i(t,e);n&&A.push(n)}return A.length?t.update({effects:A,annotations:HtA.of(!0)}):null}function OtA(t){setTimeout(()=>{let e=t.hasFocus;if(e!=t.inputState.notifiedFocused){let A=ztA(t.state,e);A?t.dispatch(A):t.update([])}},10)}Jc.focus=t=>{t.inputState.lastFocusTime=Date.now(),!t.scrollDOM.scrollTop&&(t.inputState.lastScrollTop||t.inputState.lastScrollLeft)&&(t.scrollDOM.scrollTop=t.inputState.lastScrollTop,t.scrollDOM.scrollLeft=t.inputState.lastScrollLeft),OtA(t)};Jc.blur=t=>{t.observer.clearSelectionRange(),OtA(t)};Jc.compositionstart=Jc.compositionupdate=t=>{t.observer.editContext||(t.inputState.compositionFirstChange==null&&(t.inputState.compositionFirstChange=!0),t.inputState.composing<0&&(t.inputState.composing=0))};Jc.compositionend=t=>{t.observer.editContext||(t.inputState.composing=-1,t.inputState.compositionEndedAt=Date.now(),t.inputState.compositionPendingKey=!0,t.inputState.compositionPendingChange=t.observer.pendingRecords().length>0,t.inputState.compositionFirstChange=null,At.chrome&&At.android?t.observer.flushSoon():t.inputState.compositionPendingChange?Promise.resolve().then(()=>t.observer.flush()):setTimeout(()=>{t.inputState.composing<0&&t.docView.hasComposition&&t.update([])},50))};Jc.contextmenu=t=>{t.inputState.lastContextMenu=Date.now()};yl.beforeinput=(t,e)=>{var A,i;if(e.inputType=="insertReplacementText"&&t.observer.editContext){let o=(A=e.dataTransfer)===null||A===void 0?void 0:A.getData("text/plain"),r=e.getTargetRanges();if(o&&r.length){let s=r[0],a=t.posAtDOM(s.startContainer,s.startOffset),c=t.posAtDOM(s.endContainer,s.endOffset);return CF(t,{from:a,to:c,insert:t.state.toText(o)},null),!0}}let n;if(At.chrome&&At.android&&(n=UtA.find(o=>o.inputType==e.inputType))&&(t.observer.delayAndroidKey(n.key,n.keyCode),n.key=="Backspace"||n.key=="Delete")){let o=((i=window.visualViewport)===null||i===void 0?void 0:i.height)||0;setTimeout(()=>{var r;(((r=window.visualViewport)===null||r===void 0?void 0:r.height)||0)>o+10&&t.hasFocus&&(t.contentDOM.blur(),t.focus())},100)}return At.ios&&e.inputType=="deleteContentForward"&&t.observer.flushSoon(),At.safari&&e.inputType=="insertText"&&t.inputState.composing>=0&&setTimeout(()=>Jc.compositionend(t,e),20),!1};var GeA=new Set;function RxA(t){GeA.has(t)||(GeA.add(t),t.addEventListener("copy",()=>{}),t.addEventListener("cut",()=>{}))}var UeA=["pre-wrap","normal","pre-line","break-spaces"],NE=!1;function KeA(){NE=!1}var KL=class{constructor(e){this.lineWrapping=e,this.doc=In.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(e,A){let i=this.doc.lineAt(A).number-this.doc.lineAt(e).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((A-e-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(e){return this.lineWrapping?(1+Math.max(0,Math.ceil((e-this.lineLength)/Math.max(1,this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(e){return this.doc=e,this}mustRefreshForWrapping(e){return UeA.indexOf(e)>-1!=this.lineWrapping}mustRefreshForHeights(e){let A=!1;for(let i=0;i-1,a=Math.round(A)!=Math.round(this.lineHeight)||this.lineWrapping!=s;if(this.lineWrapping=s,this.lineHeight=A,this.charWidth=i,this.textHeight=n,this.lineLength=o,a){this.heightSamples={};for(let c=0;c0}set outdated(e){this.flags=(e?2:0)|this.flags&-3}setHeight(e){this.height!=e&&(Math.abs(this.height-e)>bw&&(NE=!0),this.height=e)}replace(e,A,i){return t.of(i)}decomposeLeft(e,A){A.push(this)}decomposeRight(e,A){A.push(this)}applyChanges(e,A,i,n){let o=this,r=i.doc;for(let s=n.length-1;s>=0;s--){let{fromA:a,toA:c,fromB:l,toB:I}=n[s],C=o.lineAt(a,Po.ByPosNoHeight,i.setDoc(A),0,0),d=C.to>=c?C:o.lineAt(c,Po.ByPosNoHeight,i,0,0);for(I+=d.to-c,c=d.to;s>0&&C.from<=n[s-1].toA;)a=n[s-1].fromA,l=n[s-1].fromB,s--,ao*2){let s=e[A-1];s.break?e.splice(--A,1,s.left,null,s.right):e.splice(--A,1,s.left,s.right),i+=1+s.break,n-=s.size}else if(o>n*2){let s=e[i];s.break?e.splice(i,1,s.left,null,s.right):e.splice(i,1,s.left,s.right),i+=2+s.break,o-=s.size}else break;else if(n=o&&r(this.blockAt(0,i,n,o))}updateHeight(e,A=0,i=!1,n){return n&&n.from<=A&&n.more&&this.setHeight(n.heights[n.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}},Yc=class t extends Uw{constructor(e,A){super(e,A,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(e,A,i,n){return new kg(n,this.length,i,this.height,this.breaks)}replace(e,A,i){let n=i[0];return i.length==1&&(n instanceof t||n instanceof w1&&n.flags&4)&&Math.abs(this.length-n.length)<10?(n instanceof w1?n=new t(n.length,this.height):n.height=this.height,this.outdated||(n.outdated=!1),n):gc.of(i)}updateHeight(e,A=0,i=!1,n){return n&&n.from<=A&&n.more?this.setHeight(n.heights[n.index++]):(i||this.outdated)&&this.setHeight(Math.max(this.widgetHeight,e.heightForLine(this.length-this.collapsed))+this.breaks*e.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}},w1=class t extends gc{constructor(e){super(e,0)}heightMetrics(e,A){let i=e.doc.lineAt(A).number,n=e.doc.lineAt(A+this.length).number,o=n-i+1,r,s=0;if(e.lineWrapping){let a=Math.min(this.height,e.lineHeight*o);r=a/o,this.length>o+1&&(s=(this.height-a)/(this.length-o-1))}else r=this.height/o;return{firstLine:i,lastLine:n,perLine:r,perChar:s}}blockAt(e,A,i,n){let{firstLine:o,lastLine:r,perLine:s,perChar:a}=this.heightMetrics(A,n);if(A.lineWrapping){let c=n+(e0){let o=i[i.length-1];o instanceof t?i[i.length-1]=new t(o.length+n):i.push(null,new t(n-1))}if(e>0){let o=i[0];o instanceof t?i[0]=new t(e+o.length):i.unshift(new t(e-1),null)}return gc.of(i)}decomposeLeft(e,A){A.push(new t(e-1),null)}decomposeRight(e,A){A.push(null,new t(this.length-e-1))}updateHeight(e,A=0,i=!1,n){let o=A+this.length;if(n&&n.from<=A+this.length&&n.more){let r=[],s=Math.max(A,n.from),a=-1;for(n.from>A&&r.push(new t(n.from-A-1).updateHeight(e,A));s<=o&&n.more;){let l=e.doc.lineAt(s).length;r.length&&r.push(null);let I=n.heights[n.index++];a==-1?a=I:Math.abs(I-a)>=bw&&(a=-2);let C=new Yc(l,I);C.outdated=!1,r.push(C),s+=l+1}s<=o&&r.push(null,new t(o-s).updateHeight(e,s));let c=gc.of(r);return(a<0||Math.abs(c.height-this.height)>=bw||Math.abs(a-this.heightMetrics(e,A).perLine)>=bw)&&(NE=!0),Gw(this,c)}else(i||this.outdated)&&(this.setHeight(e.heightForGap(A,A+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}},JL=class extends gc{constructor(e,A,i){super(e.length+A+i.length,e.height+i.height,A|(e.outdated||i.outdated?2:0)),this.left=e,this.right=i,this.size=e.size+i.size}get break(){return this.flags&1}blockAt(e,A,i,n){let o=i+this.left.height;return es))return c;let l=A==Po.ByPosNoHeight?Po.ByPosNoHeight:Po.ByPos;return a?c.join(this.right.lineAt(s,l,i,r,s)):this.left.lineAt(s,l,i,n,o).join(c)}forEachLine(e,A,i,n,o,r){let s=n+this.left.height,a=o+this.left.length+this.break;if(this.break)e=a&&this.right.forEachLine(e,A,i,s,a,r);else{let c=this.lineAt(a,Po.ByPos,i,n,o);e=e&&c.from<=A&&r(c),A>c.to&&this.right.forEachLine(c.to+1,A,i,s,a,r)}}replace(e,A,i){let n=this.left.length+this.break;if(Athis.left.length)return this.balanced(this.left,this.right.replace(e-n,A-n,i));let o=[];e>0&&this.decomposeLeft(e,o);let r=o.length;for(let s of i)o.push(s);if(e>0&&YeA(o,r-1),A=i&&A.push(null)),e>i&&this.right.decomposeLeft(e-i,A)}decomposeRight(e,A){let i=this.left.length,n=i+this.break;if(e>=n)return this.right.decomposeRight(e-n,A);e2*A.size||A.size>2*e.size?gc.of(this.break?[e,null,A]:[e,A]):(this.left=Gw(this.left,e),this.right=Gw(this.right,A),this.setHeight(e.height+A.height),this.outdated=e.outdated||A.outdated,this.size=e.size+A.size,this.length=e.length+this.break+A.length,this)}updateHeight(e,A=0,i=!1,n){let{left:o,right:r}=this,s=A+o.length+this.break,a=null;return n&&n.from<=A+o.length&&n.more?a=o=o.updateHeight(e,A,i,n):o.updateHeight(e,A,i),n&&n.from<=s+r.length&&n.more?a=r=r.updateHeight(e,s,i,n):r.updateHeight(e,s,i),a?this.balanced(o,r):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}};function YeA(t,e){let A,i;t[e]==null&&(A=t[e-1])instanceof w1&&(i=t[e+1])instanceof w1&&t.splice(e-1,3,new w1(A.length+1+i.length))}var xxA=5,TL=class t{constructor(e,A){this.pos=e,this.oracle=A,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=e}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(e,A){if(this.lineStart>-1){let i=Math.min(A,this.lineEnd),n=this.nodes[this.nodes.length-1];n instanceof Yc?n.length+=i-this.pos:(i>this.pos||!this.isCovered)&&this.nodes.push(new Yc(i-this.pos,-1)),this.writtenTo=i,A>i&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=A}point(e,A,i){if(e=xxA)&&this.addLineDeco(n,o,r)}else A>e&&this.span(e,A);this.lineEnd>-1&&this.lineEnd-1)return;let{from:e,to:A}=this.oracle.doc.lineAt(this.pos);this.lineStart=e,this.lineEnd=A,this.writtenToe&&this.nodes.push(new Yc(this.pos-e,-1)),this.writtenTo=this.pos}blankContent(e,A){let i=new w1(A-e);return this.oracle.doc.lineAt(e).to==A&&(i.flags|=4),i}ensureLine(){this.enterLine();let e=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(e instanceof Yc)return e;let A=new Yc(0,-1);return this.nodes.push(A),A}addBlock(e){this.enterLine();let A=e.deco;A&&A.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(e),this.writtenTo=this.pos=this.pos+e.length,A&&A.endSide>0&&(this.covering=e)}addLineDeco(e,A,i){let n=this.ensureLine();n.length+=i,n.collapsed+=i,n.widgetHeight=Math.max(n.widgetHeight,e),n.breaks+=A,this.writtenTo=this.pos=this.pos+i}finish(e){let A=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(A instanceof Yc)&&!this.isCovered?this.nodes.push(new Yc(0,-1)):(this.writtenTol.clientHeight||l.scrollWidth>l.clientWidth)&&I.overflow!="visible"){let C=l.getBoundingClientRect();o=Math.max(o,C.left),r=Math.min(r,C.right),s=Math.max(s,C.top),a=Math.min(c==t.parentNode?n.innerHeight:a,C.bottom)}c=I.position=="absolute"||I.position=="fixed"?l.offsetParent:l.parentNode}else if(c.nodeType==11)c=c.host;else break;return{left:o-A.left,right:Math.max(o,r)-A.left,top:s-(A.top+e),bottom:Math.max(s,a)-(A.top+e)}}function NxA(t){let e=t.getBoundingClientRect(),A=t.ownerDocument.defaultView||window;return e.left0&&e.top0}function _xA(t,e){let A=t.getBoundingClientRect();return{left:0,right:A.right-A.left,top:e,bottom:A.bottom-(A.top+e)}}var X4=class{constructor(e,A,i,n){this.from=e,this.to=A,this.size=i,this.displaySize=n}static same(e,A){if(e.length!=A.length)return!1;for(let i=0;itypeof i!="function"&&i.class=="cm-lineWrapping");this.heightOracle=new KL(A),this.stateDeco=e.facet(a3).filter(i=>typeof i!="function"),this.heightMap=gc.empty().applyChanges(this.stateDeco,In.empty,this.heightOracle.setDoc(e.doc),[new Rg(0,0,0,e.doc.length)]);for(let i=0;i<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());i++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=ut.set(this.lineGaps.map(i=>i.draw(this,!1))),this.computeVisibleRanges()}updateForViewport(){let e=[this.viewport],{main:A}=this.state.selection;for(let i=0;i<=1;i++){let n=i?A.head:A.anchor;if(!e.some(({from:o,to:r})=>n>=o&&n<=r)){let{from:o,to:r}=this.lineBlockAt(n);e.push(new RE(o,r))}}return this.viewports=e.sort((i,n)=>i.from-n.from),this.updateScaler()}updateScaler(){let e=this.scaler;return this.scaler=this.heightMap.height<=7e6?JeA:new OL(this.heightOracle,this.heightMap,this.viewports),e.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,e=>{this.viewportLines.push(P4(e,this.scaler))})}update(e,A=null){this.state=e.state;let i=this.stateDeco;this.stateDeco=this.state.facet(a3).filter(l=>typeof l!="function");let n=e.changedRanges,o=Rg.extendWithRanges(n,LxA(i,this.stateDeco,e?e.changes:Cs.empty(this.state.doc.length))),r=this.heightMap.height,s=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);KeA(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,e.startState.doc,this.heightOracle.setDoc(this.state.doc),o),(this.heightMap.height!=r||NE)&&(e.flags|=2),s?(this.scrollAnchorPos=e.changes.mapPos(s.from,-1),this.scrollAnchorHeight=s.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=r);let a=o.length?this.mapViewport(this.viewport,e.changes):this.viewport;(A&&(A.range.heada.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,A));let c=a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,e.flags|=this.updateForViewport(),(c||!e.changes.empty||e.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,e.changes))),e.flags|=this.computeVisibleRanges(e.changes),A&&(this.scrollTarget=A),!this.mustEnforceCursorAssoc&&e.selectionSet&&e.view.lineWrapping&&e.state.selection.main.empty&&e.state.selection.main.assoc&&!e.state.facet(ktA)&&(this.mustEnforceCursorAssoc=!0)}measure(e){let A=e.contentDOM,i=window.getComputedStyle(A),n=this.heightOracle,o=i.whiteSpace;this.defaultTextDirection=i.direction=="rtl"?lo.RTL:lo.LTR;let r=this.heightOracle.mustRefreshForWrapping(o),s=A.getBoundingClientRect(),a=r||this.mustMeasureContent||this.contentDOMHeight!=s.height;this.contentDOMHeight=s.height,this.mustMeasureContent=!1;let c=0,l=0;if(s.width&&s.height){let{scaleX:R,scaleY:w}=ntA(A,s);(R>.005&&Math.abs(this.scaleX-R)>.005||w>.005&&Math.abs(this.scaleY-w)>.005)&&(this.scaleX=R,this.scaleY=w,c|=16,r=a=!0)}let I=(parseInt(i.paddingTop)||0)*this.scaleY,C=(parseInt(i.paddingBottom)||0)*this.scaleY;(this.paddingTop!=I||this.paddingBottom!=C)&&(this.paddingTop=I,this.paddingBottom=C,c|=18),this.editorWidth!=e.scrollDOM.clientWidth&&(n.lineWrapping&&(a=!0),this.editorWidth=e.scrollDOM.clientWidth,c|=16);let d=e.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=d&&(this.scrollAnchorHeight=-1,this.scrollTop=d),this.scrolledToBottom=stA(e.scrollDOM);let B=(this.printing?_xA:FxA)(A,this.paddingTop),E=B.top-this.pixelViewport.top,h=B.bottom-this.pixelViewport.bottom;this.pixelViewport=B;let u=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(u!=this.inView&&(this.inView=u,u&&(a=!0)),!this.inView&&!this.scrollTarget&&!NxA(e.dom))return 0;let D=s.width;if((this.contentDOMWidth!=D||this.editorHeight!=e.scrollDOM.clientHeight)&&(this.contentDOMWidth=s.width,this.editorHeight=e.scrollDOM.clientHeight,c|=16),a){let R=e.docView.measureVisibleLineHeights(this.viewport);if(n.mustRefreshForHeights(R)&&(r=!0),r||n.lineWrapping&&Math.abs(D-this.contentDOMWidth)>n.charWidth){let{lineHeight:w,charWidth:_,textHeight:K}=e.docView.measureTextSize();r=w>0&&n.refresh(o,w,_,K,Math.max(5,D/_),R),r&&(e.docView.minWidth=0,c|=16)}E>0&&h>0?l=Math.max(E,h):E<0&&h<0&&(l=Math.min(E,h)),KeA();for(let w of this.viewports){let _=w.from==this.viewport.from?R:e.docView.measureVisibleLineHeights(w);this.heightMap=(r?gc.empty().applyChanges(this.stateDeco,In.empty,this.heightOracle,[new Rg(0,0,0,e.state.doc.length)]):this.heightMap).updateHeight(n,0,r,new YL(w.from,_))}NE&&(c|=2)}let L=!this.viewportIsAppropriate(this.viewport,l)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return L&&(c&2&&(c|=this.updateScaler()),this.viewport=this.getViewport(l,this.scrollTarget),c|=this.updateForViewport()),(c&2||L)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(r?[]:this.lineGaps,e)),c|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,e.docView.enforceCursorAssoc()),c}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(e,A){let i=.5-Math.max(-.5,Math.min(.5,e/1e3/2)),n=this.heightMap,o=this.heightOracle,{visibleTop:r,visibleBottom:s}=this,a=new RE(n.lineAt(r-i*1e3,Po.ByHeight,o,0,0).from,n.lineAt(s+(1-i)*1e3,Po.ByHeight,o,0,0).to);if(A){let{head:c}=A.range;if(ca.to){let l=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),I=n.lineAt(c,Po.ByPos,o,0,0),C;A.y=="center"?C=(I.top+I.bottom)/2-l/2:A.y=="start"||A.y=="nearest"&&c=s+Math.max(10,Math.min(i,250)))&&n>r-2*1e3&&o>1,r=n<<1;if(this.defaultTextDirection!=lo.LTR&&!i)return[];let s=[],a=(l,I,C,d)=>{if(I-ll&&uu.from>=C.from&&u.to<=C.to&&Math.abs(u.from-l)u.fromD));if(!h){if(IL.from<=I&&L.to>=I)){let L=A.moveToLineBoundary(ae.cursor(I),!1,!0).head;L>l&&(I=L)}let u=this.gapSize(C,l,I,d),D=i||u<2e6?u:2e6;h=new X4(l,I,u,D)}s.push(h)},c=l=>{if(l.length2e6)for(let _ of e)_.from>=l.from&&_.froml.from&&a(l.from,d,l,I),BA.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(e){let A=this.stateDeco;this.lineGaps.length&&(A=A.concat(this.lineGapDeco));let i=[];co.spans(A,this.viewport.from,this.viewport.to,{span(o,r){i.push({from:o,to:r})},point(){}},20);let n=0;if(i.length!=this.visibleRanges.length)n=12;else for(let o=0;o=this.viewport.from&&e<=this.viewport.to&&this.viewportLines.find(A=>A.from<=e&&A.to>=e)||P4(this.heightMap.lineAt(e,Po.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(e){return e>=this.viewportLines[0].top&&e<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(A=>A.top<=e&&A.bottom>=e)||P4(this.heightMap.lineAt(this.scaler.fromDOM(e),Po.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(e){let A=this.lineBlockAtHeight(e+8);return A.from>=this.viewport.from||this.viewportLines[0].top-e>200?A:this.viewportLines[0]}elementAtHeight(e){return P4(this.heightMap.blockAt(this.scaler.fromDOM(e),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}},RE=class{constructor(e,A){this.from=e,this.to=A}};function GxA(t,e,A){let i=[],n=t,o=0;return co.spans(A,t,e,{span(){},point(r,s){r>n&&(i.push({from:n,to:r}),o+=r-n),n=s}},20),n=1)return e[e.length-1].to;let i=Math.floor(t*A);for(let n=0;;n++){let{from:o,to:r}=e[n],s=r-o;if(i<=s)return o+i;i-=s}}function fw(t,e){let A=0;for(let{from:i,to:n}of t.ranges){if(e<=n){A+=e-i;break}A+=n-i}return A/t.total}function UxA(t,e){for(let A of t)if(e(A))return A}var JeA={toDOM(t){return t},fromDOM(t){return t},scale:1,eq(t){return t==this}},OL=class t{constructor(e,A,i){let n=0,o=0,r=0;this.viewports=i.map(({from:s,to:a})=>{let c=A.lineAt(s,Po.ByPos,e,0,0).top,l=A.lineAt(a,Po.ByPos,e,0,0).bottom;return n+=l-c,{from:s,to:a,top:c,bottom:l,domTop:0,domBottom:0}}),this.scale=(7e6-n)/(A.height-n);for(let s of this.viewports)s.domTop=r+(s.top-o)*this.scale,r=s.domBottom=s.domTop+(s.bottom-s.top),o=s.bottom}toDOM(e){for(let A=0,i=0,n=0;;A++){let o=AA.from==e.viewports[i].from&&A.to==e.viewports[i].to):!1}};function P4(t,e){if(e.scale==1)return t;let A=e.toDOM(t.top),i=e.toDOM(t.bottom);return new kg(t.from,t.length,A,i-A,Array.isArray(t._content)?t._content.map(n=>P4(n,e)):t._content)}var mw=qe.define({combine:t=>t.join(" ")}),EL=qe.define({combine:t=>t.indexOf(!0)>-1}),PL=Kc.newName(),PtA=Kc.newName(),jtA=Kc.newName(),qtA={"&light":"."+PtA,"&dark":"."+jtA};function jL(t,e,A){return new Kc(e,{finish(i){return/&/.test(i)?i.replace(/&\w*/,n=>{if(n=="&")return t;if(!A||!A[n])throw new RangeError(`Unsupported selector: ${n}`);return A[n]}):t+" "+i}})}var KxA=jL("."+PL,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",zIndex:200},".cm-gutters-before":{insetInlineStart:0},".cm-gutters-after":{insetInlineEnd:0},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",border:"0px solid #ddd","&.cm-gutters-before":{borderRightWidth:"1px"},"&.cm-gutters-after":{borderLeftWidth:"1px"}},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-dialog":{padding:"2px 19px 4px 6px",position:"relative","& label":{fontSize:"80%"}},".cm-dialog-close":{position:"absolute",top:"3px",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",fontSize:"14px",padding:"0"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{backgroundImage:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 5%)",backgroundPosition:"center"},".cm-highlightTab":{backgroundImage:`url('data:image/svg+xml,')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},qtA),YxA={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},QL=At.ie&&At.ie_version<=11,qL=class{constructor(e){this.view=e,this.active=!1,this.editContext=null,this.selectionRange=new pL,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=e.contentDOM,this.observer=new MutationObserver(A=>{for(let i of A)this.queue.push(i);(At.ie&&At.ie_version<=11||At.ios&&e.composing)&&A.some(i=>i.type=="childList"&&i.removedNodes.length||i.type=="characterData"&&i.oldValue.length>i.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&At.android&&e.constructor.EDIT_CONTEXT!==!1&&!(At.chrome&&At.chrome_version<126)&&(this.editContext=new VL(e),e.state.facet(H0)&&(e.contentDOM.editContext=this.editContext.editContext)),QL&&(this.onCharData=A=>{this.queue.push({target:A.target,type:"characterData",oldValue:A.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var A;((A=this.view.docView)===null||A===void 0?void 0:A.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),A.length>0&&A[A.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(A=>{A.length>0&&A[A.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(e){this.view.inputState.runHandlers("scroll",e),this.intersecting&&this.view.measure()}onScroll(e){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(e)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(e){(e.type=="change"||!e.type)&&!e.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(e){if(this.gapIntersection&&(e.length!=this.gaps.length||this.gaps.some((A,i)=>A!=e[i]))){this.gapIntersection.disconnect();for(let A of e)this.gapIntersection.observe(A);this.gaps=e}}onSelectionChange(e){let A=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,n=this.selectionRange;if(i.state.facet(H0)?i.root.activeElement!=this.dom:!Dw(this.dom,n))return;let o=n.anchorNode&&i.docView.nearest(n.anchorNode);if(o&&o.ignoreEvent(e)){A||(this.selectionChanged=!1);return}(At.ie&&At.ie_version<=11||At.android&&At.chrome)&&!i.state.selection.main.empty&&n.focusNode&&q4(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:e}=this,A=e3(e.root);if(!A)return!1;let i=At.safari&&e.root.nodeType==11&&e.root.activeElement==this.dom&&JxA(this.view,A)||A;if(!i||this.selectionRange.eq(i))return!1;let n=Dw(this.dom,i);return n&&!this.selectionChanged&&e.inputState.lastFocusTime>Date.now()-200&&e.inputState.lastTouchTime{let o=this.delayedAndroidKey;o&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=o.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&o.force&&FE(this.dom,o.key,o.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(n)}(!this.delayedAndroidKey||e=="Enter")&&(this.delayedAndroidKey={key:e,keyCode:A,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}processRecords(){let e=this.pendingRecords();e.length&&(this.queue=[]);let A=-1,i=-1,n=!1;for(let o of e){let r=this.readMutation(o);r&&(r.typeOver&&(n=!0),A==-1?{from:A,to:i}=r:(A=Math.min(r.from,A),i=Math.max(r.to,i)))}return{from:A,to:i,typeOver:n}}readChange(){let{from:e,to:A,typeOver:i}=this.processRecords(),n=this.selectionChanged&&Dw(this.dom,this.selectionRange);if(e<0&&!n)return null;e>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let o=new NL(this.view,e,A,i);return this.view.docView.domChanged={newSel:o.newSel?o.newSel.main:null},o}flush(e=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;e&&this.readSelectionRange();let A=this.readChange();if(!A)return this.view.requestMeasure(),!1;let i=this.view.state,n=GtA(this.view,A);return this.view.state==i&&(A.domChanged||A.newSel&&!A.newSel.main.eq(this.view.state.selection.main))&&this.view.update([]),n}readMutation(e){let A=this.view.docView.nearest(e.target);if(!A||A.ignoreMutation(e))return null;if(A.markDirty(e.type=="attributes"),e.type=="attributes"&&(A.flags|=4),e.type=="childList"){let i=TeA(A,e.previousSibling||e.target.previousSibling,-1),n=TeA(A,e.nextSibling||e.target.nextSibling,1);return{from:i?A.posAfter(i):A.posAtStart,to:n?A.posBefore(n):A.posAtEnd,typeOver:!1}}else return e.type=="characterData"?{from:A.posAtStart,to:A.posAtEnd,typeOver:e.target.nodeValue==e.oldValue}:null}setWindow(e){e!=this.win&&(this.removeWindowListeners(this.win),this.win=e,this.addWindowListeners(this.win))}addWindowListeners(e){e.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):e.addEventListener("beforeprint",this.onPrint),e.addEventListener("scroll",this.onScroll),e.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(e){e.removeEventListener("scroll",this.onScroll),e.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):e.removeEventListener("beforeprint",this.onPrint),e.document.removeEventListener("selectionchange",this.onSelectionChange)}update(e){this.editContext&&(this.editContext.update(e),e.startState.facet(H0)!=e.state.facet(H0)&&(e.view.contentDOM.editContext=e.state.facet(H0)?this.editContext.editContext:null))}destroy(){var e,A,i;this.stop(),(e=this.intersection)===null||e===void 0||e.disconnect(),(A=this.gapIntersection)===null||A===void 0||A.disconnect(),(i=this.resizeScroll)===null||i===void 0||i.disconnect();for(let n of this.scrollTargets)n.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}};function TeA(t,e,A){for(;e;){let i=Fo.get(e);if(i&&i.parent==t)return i;let n=e.parentNode;e=n!=t.dom?n:A>0?e.nextSibling:e.previousSibling}return null}function HeA(t,e){let A=e.startContainer,i=e.startOffset,n=e.endContainer,o=e.endOffset,r=t.docView.domAtPos(t.state.selection.main.anchor);return q4(r.node,r.offset,n,o)&&([A,i,n,o]=[n,o,A,i]),{anchorNode:A,anchorOffset:i,focusNode:n,focusOffset:o}}function JxA(t,e){if(e.getComposedRanges){let n=e.getComposedRanges(t.root)[0];if(n)return HeA(t,n)}let A=null;function i(n){n.preventDefault(),n.stopImmediatePropagation(),A=n.getTargetRanges()[0]}return t.contentDOM.addEventListener("beforeinput",i,!0),t.dom.ownerDocument.execCommand("indent"),t.contentDOM.removeEventListener("beforeinput",i,!0),A?HeA(t,A):null}var VL=class{constructor(e){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(e.state);let A=this.editContext=new window.EditContext({text:e.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,e.state.selection.main.anchor))),selectionEnd:this.toContextPos(e.state.selection.main.head)});this.handlers.textupdate=i=>{let n=e.state.selection.main,{anchor:o,head:r}=n,s=this.toEditorPos(i.updateRangeStart),a=this.toEditorPos(i.updateRangeEnd);e.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:i.updateRangeStart,editorBase:s,drifted:!1});let c={from:s,to:a,insert:In.of(i.text.split(` -`))};if(c.from==this.from&&othis.to&&(c.to=o),c.from==c.to&&!c.insert.length){let l=ae.single(this.toEditorPos(i.selectionStart),this.toEditorPos(i.selectionEnd));l.main.eq(n)||e.dispatch({selection:l,userEvent:"select"});return}if((At.mac||At.android)&&c.from==r-1&&/^\. ?$/.test(i.text)&&e.contentDOM.getAttribute("autocorrect")=="off"&&(c={from:s,to:a,insert:In.of([i.text.replace("."," ")])}),this.pendingContextChange=c,!e.state.readOnly){let l=this.to-this.from+(c.to-c.from+c.insert.length);CF(e,c,ae.single(this.toEditorPos(i.selectionStart,l),this.toEditorPos(i.selectionEnd,l)))}this.pendingContextChange&&(this.revertPending(e.state),this.setSelection(e.state))},this.handlers.characterboundsupdate=i=>{let n=[],o=null;for(let r=this.toEditorPos(i.rangeStart),s=this.toEditorPos(i.rangeEnd);r{let n=[];for(let o of i.getTextFormats()){let r=o.underlineStyle,s=o.underlineThickness;if(r!="None"&&s!="None"){let a=this.toEditorPos(o.rangeStart),c=this.toEditorPos(o.rangeEnd);if(a{e.inputState.composing<0&&(e.inputState.composing=0,e.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(e.inputState.composing=-1,e.inputState.compositionFirstChange=null,this.composing){let{drifted:i}=this.composing;this.composing=null,i&&this.reset(e.state)}};for(let i in this.handlers)A.addEventListener(i,this.handlers[i]);this.measureReq={read:i=>{this.editContext.updateControlBounds(i.contentDOM.getBoundingClientRect());let n=e3(i.root);n&&n.rangeCount&&this.editContext.updateSelectionBounds(n.getRangeAt(0).getBoundingClientRect())}}}applyEdits(e){let A=0,i=!1,n=this.pendingContextChange;return e.changes.iterChanges((o,r,s,a,c)=>{if(i)return;let l=c.length-(r-o);if(n&&r>=n.to)if(n.from==o&&n.to==r&&n.insert.eq(c)){n=this.pendingContextChange=null,A+=l,this.to+=l;return}else n=null,this.revertPending(e.state);if(o+=A,r+=A,r<=this.from)this.from+=l,this.to+=l;else if(othis.to||this.to-this.from+c.length>3e4){i=!0;return}this.editContext.updateText(this.toContextPos(o),this.toContextPos(r),c.toString()),this.to+=l}A+=l}),n&&!i&&this.revertPending(e.state),!i}update(e){let A=this.pendingContextChange,i=e.startState.selection.main;this.composing&&(this.composing.drifted||!e.changes.touchesRange(i.from,i.to)&&e.transactions.some(n=>!n.isUserEvent("input.type")&&n.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=e.changes.mapPos(this.composing.editorBase)):!this.applyEdits(e)||!this.rangeIsValid(e.state)?(this.pendingContextChange=null,this.reset(e.state)):(e.docChanged||e.selectionSet||A)&&this.setSelection(e.state),(e.geometryChanged||e.docChanged||e.selectionSet)&&e.view.requestMeasure(this.measureReq)}resetRange(e){let{head:A}=e.selection.main;this.from=Math.max(0,A-1e4),this.to=Math.min(e.doc.length,A+1e4)}reset(e){this.resetRange(e),this.editContext.updateText(0,this.editContext.text.length,e.doc.sliceString(this.from,this.to)),this.setSelection(e)}revertPending(e){let A=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(A.from),this.toContextPos(A.from+A.insert.length),e.doc.sliceString(A.from,A.to))}setSelection(e){let{main:A}=e.selection,i=this.toContextPos(Math.max(this.from,Math.min(this.to,A.anchor))),n=this.toContextPos(A.head);(this.editContext.selectionStart!=i||this.editContext.selectionEnd!=n)&&this.editContext.updateSelection(i,n)}rangeIsValid(e){let{head:A}=e.selection.main;return!(this.from>0&&A-this.from<500||this.to1e4*3)}toEditorPos(e,A=this.to-this.from){e=Math.min(e,A);let i=this.composing;return i&&i.drifted?i.editorBase+(e-i.contextBase):e+this.from}toContextPos(e){let A=this.composing;return A&&A.drifted?A.contextBase+(e-A.editorBase):e-this.from}destroy(){for(let e in this.handlers)this.editContext.removeEventListener(e,this.handlers[e])}},qt=(()=>{class t{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(A={}){var i;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),A.parent&&A.parent.appendChild(this.dom);let{dispatch:n}=A;this.dispatchTransactions=A.dispatchTransactions||n&&(o=>o.forEach(r=>n(r,this)))||(o=>this.update(o)),this.dispatch=this.dispatch.bind(this),this._root=A.root||LRA(A.parent)||document,this.viewState=new Kw(A.state||hr.create(A)),A.scrollTo&&A.scrollTo.is(Ew)&&(this.viewState.scrollTarget=A.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(SE).map(o=>new W4(o));for(let o of this.plugins)o.update(this);this.observer=new qL(this),this.inputState=new _L(this),this.inputState.ensureHandlers(this.plugins),this.docView=new Nw(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((i=document.fonts)===null||i===void 0)&&i.ready&&document.fonts.ready.then(()=>this.requestMeasure())}dispatch(...A){let i=A.length==1&&A[0]instanceof vg?A:A.length==1&&Array.isArray(A[0])?A[0]:[this.state.update(...A)];this.dispatchTransactions(i,this)}update(A){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let i=!1,n=!1,o,r=this.state;for(let d of A){if(d.startState!=r)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");r=d.state}if(this.destroyed){this.viewState.state=r;return}let s=this.hasFocus,a=0,c=null;A.some(d=>d.annotation(HtA))?(this.inputState.notifiedFocused=s,a=1):s!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=s,c=ztA(r,s),c||(a=1));let l=this.observer.delayedAndroidKey,I=null;if(l?(this.observer.clearDelayedAndroidKey(),I=this.observer.readChange(),(I&&!this.state.doc.eq(r.doc)||!this.state.selection.eq(r.selection))&&(I=null)):this.observer.clear(),r.facet(hr.phrases)!=this.state.facet(hr.phrases))return this.setState(r);o=Fw.create(this,r,A),o.flags|=a;let C=this.viewState.scrollTarget;try{this.updateState=2;for(let d of A){if(C&&(C=C.map(d.changes)),d.scrollIntoView){let{main:B}=d.state.selection;C=new Z4(B.empty?B:ae.cursor(B.head,B.head>B.anchor?-1:1))}for(let B of d.effects)B.is(Ew)&&(C=B.value.clip(this.state))}this.viewState.update(o,C),this.bidiCache=Yw.update(this.bidiCache,o.changes),o.empty||(this.updatePlugins(o),this.inputState.update(o)),i=this.docView.update(o),this.state.facet(H4)!=this.styleModules&&this.mountStyles(),n=this.updateAttrs(),this.showAnnouncements(A),this.docView.updateSelection(i,A.some(d=>d.isUserEvent("select.pointer")))}finally{this.updateState=0}if(o.startState.facet(mw)!=o.state.facet(mw)&&(this.viewState.mustMeasureContent=!0),(i||n||C||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),i&&this.docViewUpdate(),!o.empty)for(let d of this.state.facet(CL))try{d(o)}catch(B){Xr(this.state,B,"update listener")}(c||I)&&Promise.resolve().then(()=>{c&&this.state==c.startState&&this.dispatch(c),I&&!GtA(this,I)&&l.force&&FE(this.contentDOM,l.key,l.keyCode)})}setState(A){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=A;return}this.updateState=2;let i=this.hasFocus;try{for(let n of this.plugins)n.destroy(this);this.viewState=new Kw(A),this.plugins=A.facet(SE).map(n=>new W4(n)),this.pluginMap.clear();for(let n of this.plugins)n.update(this);this.docView.destroy(),this.docView=new Nw(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}i&&this.focus(),this.requestMeasure()}updatePlugins(A){let i=A.startState.facet(SE),n=A.state.facet(SE);if(i!=n){let o=[];for(let r of n){let s=i.indexOf(r);if(s<0)o.push(new W4(r));else{let a=this.plugins[s];a.mustUpdate=A,o.push(a)}}for(let r of this.plugins)r.mustUpdate!=A&&r.destroy(this);this.plugins=o,this.pluginMap.clear()}else for(let o of this.plugins)o.mustUpdate=A;for(let o=0;o-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,A&&this.observer.forceFlush();let i=null,n=this.scrollDOM,o=n.scrollTop*this.scaleY,{scrollAnchorPos:r,scrollAnchorHeight:s}=this.viewState;Math.abs(o-this.viewState.scrollTop)>1&&(s=-1),this.viewState.scrollAnchorHeight=-1;try{for(let a=0;;a++){if(s<0)if(stA(n))r=-1,s=this.viewState.heightMap.height;else{let B=this.viewState.scrollAnchorAt(o);r=B.from,s=B.top}this.updateState=1;let c=this.viewState.measure(this);if(!c&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(a>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let l=[];c&4||([this.measureRequests,l]=[l,this.measureRequests]);let I=l.map(B=>{try{return B.read(this)}catch(E){return Xr(this.state,E),zeA}}),C=Fw.create(this,this.state,[]),d=!1;C.flags|=c,i?i.flags|=c:i=C,this.updateState=2,C.empty||(this.updatePlugins(C),this.inputState.update(C),this.updateAttrs(),d=this.docView.update(C),d&&this.docViewUpdate());for(let B=0;B1||E<-1){o=o+E,n.scrollTop=o/this.scaleY,s=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(i&&!i.empty)for(let a of this.state.facet(CL))a(i)}get themeClasses(){return PL+" "+(this.state.facet(EL)?jtA:PtA)+" "+this.state.facet(mw)}updateAttrs(){let A=OeA(this,peA,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),i={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(H0)?"true":"false",class:"cm-content",style:`${At.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(i["aria-readonly"]="true"),OeA(this,RL,i);let n=this.observer.ignore(()=>{let o=bL(this.contentDOM,this.contentAttrs,i),r=bL(this.dom,this.editorAttrs,A);return o||r});return this.editorAttrs=A,this.contentAttrs=i,n}showAnnouncements(A){let i=!0;for(let n of A)for(let o of n.effects)if(o.is(t.announce)){i&&(this.announceDOM.textContent=""),i=!1;let r=this.announceDOM.appendChild(document.createElement("div"));r.textContent=o.value}}mountStyles(){this.styleModules=this.state.facet(H4);let A=this.state.facet(t.cspNonce);Kc.mount(this.root,this.styleModules.concat(KxA).reverse(),A?{nonce:A}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn't allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(A){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),A){if(this.measureRequests.indexOf(A)>-1)return;if(A.key!=null){for(let i=0;in.plugin==A)||null),i&&i.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(A){return this.readMeasured(),this.viewState.elementAtHeight(A)}lineBlockAtHeight(A){return this.readMeasured(),this.viewState.lineBlockAtHeight(A)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(A){return this.viewState.lineBlockAt(A)}get contentHeight(){return this.viewState.contentHeight}moveByChar(A,i,n){return BL(this,A,MeA(this,A,i,n))}moveByGroup(A,i){return BL(this,A,MeA(this,A,i,n=>lxA(this,A.head,n)))}visualLineSide(A,i){let n=this.bidiSpans(A),o=this.textDirectionAt(A.from),r=n[i?n.length-1:0];return ae.cursor(r.side(i,o)+A.from,r.forward(!i,o)?1:-1)}moveToLineBoundary(A,i,n=!0){return cxA(this,A,i,n)}moveVertically(A,i,n){return BL(this,A,gxA(this,A,i,n))}domAtPos(A){return this.docView.domAtPos(A)}posAtDOM(A,i=0){return this.docView.posFromDOM(A,i)}posAtCoords(A,i=!0){return this.readMeasured(),_tA(this,A,i)}coordsAtPos(A,i=1){this.readMeasured();let n=this.docView.coordsAt(A,i);if(!n||n.left==n.right)return n;let o=this.state.doc.lineAt(A),r=this.bidiSpans(o),s=r[Sg.find(r,A-o.from,-1,i)];return Pw(n,s.dir==lo.LTR==i>0)}coordsForChar(A){return this.readMeasured(),this.docView.coordsForChar(A)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(A){return!this.state.facet(meA)||Athis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(A))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(A){if(A.length>TxA)return mtA(A.length);let i=this.textDirectionAt(A.from),n;for(let r of this.bidiCache)if(r.from==A.from&&r.dir==i&&(r.fresh||ftA(r.isolates,n=weA(this,A))))return r.order;n||(n=weA(this,A));let o=jRA(A.text,i,n);return this.bidiCache.push(new Yw(A.from,A.to,i,n,!0,o)),o}get hasFocus(){var A;return(this.dom.ownerDocument.hasFocus()||At.safari&&((A=this.inputState)===null||A===void 0?void 0:A.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{otA(this.contentDOM),this.docView.updateSelection()})}setRoot(A){this._root!=A&&(this._root=A,this.observer.setWindow((A.nodeType==9?A:A.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let A of this.plugins)A.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(A,i={}){return Ew.of(new Z4(typeof A=="number"?ae.cursor(A):A,i.y,i.x,i.yMargin,i.xMargin))}scrollSnapshot(){let{scrollTop:A,scrollLeft:i}=this.scrollDOM,n=this.viewState.scrollAnchorAt(A);return Ew.of(new Z4(ae.cursor(n.from),"start","start",n.top-A,i,!0))}setTabFocusMode(A){A==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof A=="boolean"?this.inputState.tabFocusMode=A?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+A)}static domEventHandlers(A){return go.define(()=>({}),{eventHandlers:A})}static domEventObservers(A){return go.define(()=>({}),{eventObservers:A})}static theme(A,i){let n=Kc.newName(),o=[mw.of(n),H4.of(jL(`.${n}`,A))];return i&&i.dark&&o.push(EL.of(!0)),o}static baseTheme(A){return Dl.lowest(H4.of(jL("."+PL,A,qtA)))}static findFromDOM(A){var i;let n=A.querySelector(".cm-content"),o=n&&Fo.get(n)||Fo.get(A);return((i=o?.rootView)===null||i===void 0?void 0:i.view)||null}}return t.styleModule=H4,t.inputHandler=btA,t.clipboardInputFilter=cF,t.clipboardOutputFilter=lF,t.scrollHandler=StA,t.focusChangeEffect=MtA,t.perLineTextDirection=meA,t.exceptionSink=vtA,t.updateListener=CL,t.editable=H0,t.mouseSelectionStyle=ytA,t.dragMovesSelection=DtA,t.clickAddsSelectionRange=wtA,t.decorations=a3,t.outerDecorations=xtA,t.atomicRanges=gF,t.bidiIsolatedRanges=LtA,t.scrollMargins=FtA,t.darkTheme=EL,t.cspNonce=qe.define({combine:e=>e.length?e[0]:""}),t.contentAttributes=RL,t.editorAttributes=peA,t.lineWrapping=t.contentAttributes.of({class:"cm-lineWrapping"}),t.announce=Pi.define(),t})(),TxA=4096,zeA={},Yw=class t{constructor(e,A,i,n,o,r){this.from=e,this.to=A,this.dir=i,this.isolates=n,this.fresh=o,this.order=r}static update(e,A){if(A.empty&&!e.some(o=>o.fresh))return e;let i=[],n=e.length?e[e.length-1].dir:lo.LTR;for(let o=Math.max(0,e.length-10);o=0;n--){let o=i[n],r=typeof o=="function"?o(t):o;r&&vL(r,A)}return A}var HxA=At.mac?"mac":At.windows?"win":At.linux?"linux":"key";function zxA(t,e){let A=t.split(/-(?!$)/),i=A[A.length-1];i=="Space"&&(i=" ");let n,o,r,s;for(let a=0;ai.concat(n),[]))),A}function ZtA(t,e,A){return WtA(VtA(t.state),e,t,A)}var p1=null,PxA=4e3;function jxA(t,e=HxA){let A=Object.create(null),i=Object.create(null),n=(r,s)=>{let a=i[r];if(a==null)i[r]=s;else if(a!=s)throw new Error("Key binding "+r+" is used both as a regular binding and as a multi-stroke prefix")},o=(r,s,a,c,l)=>{var I,C;let d=A[r]||(A[r]=Object.create(null)),B=s.split(/ (?!$)/).map(u=>zxA(u,e));for(let u=1;u{let R=p1={view:L,prefix:D,scope:r};return setTimeout(()=>{p1==R&&(p1=null)},PxA),!0}]})}let E=B.join(" ");n(E,!1);let h=d[E]||(d[E]={preventDefault:!1,stopPropagation:!1,run:((C=(I=d._any)===null||I===void 0?void 0:I.run)===null||C===void 0?void 0:C.slice())||[]});a&&h.run.push(a),c&&(h.preventDefault=!0),l&&(h.stopPropagation=!0)};for(let r of t){let s=r.scope?r.scope.split(" "):["editor"];if(r.any)for(let c of s){let l=A[c]||(A[c]=Object.create(null));l._any||(l._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:I}=r;for(let C in l)l[C].run.push(d=>I(d,ZL))}let a=r[e]||r.key;if(a)for(let c of s)o(c,a,r.run,r.preventDefault,r.stopPropagation),r.shift&&o(c,"Shift-"+a,r.shift,r.preventDefault,r.stopPropagation)}return A}var ZL=null;function WtA(t,e,A,i){ZL=e;let n=geA(e),o=Bs(n,0),r=lc(o)==n.length&&n!=" ",s="",a=!1,c=!1,l=!1;p1&&p1.view==A&&p1.scope==i&&(s=p1.prefix+" ",KtA.indexOf(e.keyCode)<0&&(c=!0,p1=null));let I=new Set,C=h=>{if(h){for(let u of h.run)if(!I.has(u)&&(I.add(u),u(A)))return h.stopPropagation&&(l=!0),!0;h.preventDefault&&(h.stopPropagation&&(l=!0),c=!0)}return!1},d=t[i],B,E;return d&&(C(d[s+pw(n,e,!r)])?a=!0:r&&(e.altKey||e.metaKey||e.ctrlKey)&&!(At.windows&&e.ctrlKey&&e.altKey)&&!(At.mac&&e.altKey&&!e.ctrlKey)&&(B=T0[e.keyCode])&&B!=n?(C(d[s+pw(B,e,!0)])||e.shiftKey&&(E=ME[e.keyCode])!=n&&E!=B&&C(d[s+pw(E,e,!1)]))&&(a=!0):r&&e.shiftKey&&C(d[s+pw(n,e,!0)])&&(a=!0),!a&&C(d._any)&&(a=!0)),c&&(a=!0),a&&l&&e.stopPropagation(),ZL=null,a}var c3=class t{constructor(e,A,i,n,o){this.className=e,this.left=A,this.top=i,this.width=n,this.height=o}draw(){let e=document.createElement("div");return e.className=this.className,this.adjust(e),e}update(e,A){return A.className!=this.className?!1:(this.adjust(e),!0)}adjust(e){e.style.left=this.left+"px",e.style.top=this.top+"px",this.width!=null&&(e.style.width=this.width+"px"),e.style.height=this.height+"px"}eq(e){return this.left==e.left&&this.top==e.top&&this.width==e.width&&this.height==e.height&&this.className==e.className}static forRange(e,A,i){if(i.empty){let n=e.coordsAtPos(i.head,i.assoc||1);if(!n)return[];let o=XtA(e);return[new t(A,n.left-o.left,n.top-o.top,null,n.bottom-n.top)]}else return qxA(e,A,i)}};function XtA(t){let e=t.scrollDOM.getBoundingClientRect();return{left:(t.textDirection==lo.LTR?e.left:e.right-t.scrollDOM.clientWidth*t.scaleX)-t.scrollDOM.scrollLeft*t.scaleX,top:e.top-t.scrollDOM.scrollTop*t.scaleY}}function jeA(t,e,A,i){let n=t.coordsAtPos(e,A*2);if(!n)return i;let o=t.dom.getBoundingClientRect(),r=(n.top+n.bottom)/2,s=t.posAtCoords({x:o.left+1,y:r}),a=t.posAtCoords({x:o.right-1,y:r});return s==null||a==null?i:{from:Math.max(i.from,Math.min(s,a)),to:Math.min(i.to,Math.max(s,a))}}function qxA(t,e,A){if(A.to<=t.viewport.from||A.from>=t.viewport.to)return[];let i=Math.max(A.from,t.viewport.from),n=Math.min(A.to,t.viewport.to),o=t.textDirection==lo.LTR,r=t.contentDOM,s=r.getBoundingClientRect(),a=XtA(t),c=r.querySelector(".cm-line"),l=c&&window.getComputedStyle(c),I=s.left+(l?parseInt(l.paddingLeft)+Math.min(0,parseInt(l.textIndent)):0),C=s.right-(l?parseInt(l.paddingRight):0),d=LL(t,i,1),B=LL(t,n,-1),E=d.type==$s.Text?d:null,h=B.type==$s.Text?B:null;if(E&&(t.lineWrapping||d.widgetLineBreaks)&&(E=jeA(t,i,1,E)),h&&(t.lineWrapping||B.widgetLineBreaks)&&(h=jeA(t,n,-1,h)),E&&h&&E.from==h.from&&E.to==h.to)return D(L(A.from,A.to,E));{let w=E?L(A.from,null,E):R(d,!1),_=h?L(null,A.to,h):R(B,!0),K=[];return(E||d).to<(h||B).from-(E&&h?1:0)||d.widgetLineBreaks>1&&w.bottom+t.defaultLineHeight/2<_.top?K.push(u(I,w.bottom,C,_.top)):w.bottom<_.top&&t.elementAtHeight((w.bottom+_.top)/2).type==$s.Text&&(w.bottom=_.top=(w.bottom+_.top)/2),D(w).concat(K).concat(D(_))}function u(w,_,K,z){return new c3(e,w-a.left,_-a.top,K-w,z-_)}function D({top:w,bottom:_,horizontal:K}){let z=[];for(let U=0;Uj&&QA.from=lA)break;pA>BA&&q(Math.max(cA,BA),w==null&&cA<=j,Math.min(pA,lA),_==null&&pA>=gA,tA.dir)}if(BA=vA.to+1,BA>=lA)break}return H.length==0&&q(j,w==null,gA,_==null,t.textDirection),{top:z,bottom:U,horizontal:H}}function R(w,_){let K=s.top+(_?w.top:w.bottom);return{top:K,bottom:K,horizontal:[]}}}function VxA(t,e){return t.constructor==e.constructor&&t.eq(e)}var WL=class{constructor(e,A){this.view=e,this.layer=A,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=e.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),A.above&&this.dom.classList.add("cm-layer-above"),A.class&&this.dom.classList.add(A.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(e.state),e.requestMeasure(this.measureReq),A.mount&&A.mount(this.dom,e)}update(e){e.startState.facet(Mw)!=e.state.facet(Mw)&&this.setOrder(e.state),(this.layer.update(e,this.dom)||e.geometryChanged)&&(this.scale(),e.view.requestMeasure(this.measureReq))}docViewUpdate(e){this.layer.updateOnDocViewUpdate!==!1&&e.requestMeasure(this.measureReq)}setOrder(e){let A=0,i=e.facet(Mw);for(;A!VxA(A,this.drawn[i]))){let A=this.dom.firstChild,i=0;for(let n of e)n.update&&A&&n.constructor&&this.drawn[i].constructor&&n.update(A,this.drawn[i])?(A=A.nextSibling,i++):this.dom.insertBefore(n.draw(),A);for(;A;){let n=A.nextSibling;A.remove(),A=n}this.drawn=e}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}},Mw=qe.define();function $tA(t){return[go.define(e=>new WL(e,t)),Mw.of(t)]}var l3=qe.define({combine(t){return Wr(t,{cursorBlinkRate:1200,drawRangeCursor:!0},{cursorBlinkRate:(e,A)=>Math.min(e,A),drawRangeCursor:(e,A)=>e||A})}});function AiA(t={}){return[l3.of(t),ZxA,WxA,XxA,ktA.of(!0)]}function eiA(t){return t.startState.facet(l3)!=t.state.facet(l3)}var ZxA=$tA({above:!0,markers(t){let{state:e}=t,A=e.facet(l3),i=[];for(let n of e.selection.ranges){let o=n==e.selection.main;if(n.empty||A.drawRangeCursor){let r=o?"cm-cursor cm-cursor-primary":"cm-cursor cm-cursor-secondary",s=n.empty?n:ae.cursor(n.head,n.head>n.anchor?-1:1);for(let a of c3.forRange(t,r,s))i.push(a)}}return i},update(t,e){t.transactions.some(i=>i.selection)&&(e.style.animationName=e.style.animationName=="cm-blink"?"cm-blink2":"cm-blink");let A=eiA(t);return A&&qeA(t.state,e),t.docChanged||t.selectionSet||A},mount(t,e){qeA(e.state,t)},class:"cm-cursorLayer"});function qeA(t,e){e.style.animationDuration=t.facet(l3).cursorBlinkRate+"ms"}var WxA=$tA({above:!1,markers(t){return t.state.selection.ranges.map(e=>e.empty?[]:c3.forRange(t,"cm-selectionBackground",e)).reduce((e,A)=>e.concat(A))},update(t,e){return t.docChanged||t.selectionSet||t.viewportChanged||eiA(t)},class:"cm-selectionLayer"}),XxA=Dl.highest(qt.theme({".cm-line":{"& ::selection, &::selection":{backgroundColor:"transparent !important"},caretColor:"transparent !important"},".cm-content":{caretColor:"transparent !important","& :focus":{caretColor:"initial !important","&::selection, & ::selection":{backgroundColor:"Highlight !important"}}}})),tiA=Pi.define({map(t,e){return t==null?null:e.mapPos(t)}}),j4=Ar.define({create(){return null},update(t,e){return t!=null&&(t=e.changes.mapPos(t)),e.effects.reduce((A,i)=>i.is(tiA)?i.value:A,t)}}),$xA=go.fromClass(class{constructor(t){this.view=t,this.cursor=null,this.measureReq={read:this.readPos.bind(this),write:this.drawCursor.bind(this)}}update(t){var e;let A=t.state.field(j4);A==null?this.cursor!=null&&((e=this.cursor)===null||e===void 0||e.remove(),this.cursor=null):(this.cursor||(this.cursor=this.view.scrollDOM.appendChild(document.createElement("div")),this.cursor.className="cm-dropCursor"),(t.startState.field(j4)!=A||t.docChanged||t.geometryChanged)&&this.view.requestMeasure(this.measureReq))}readPos(){let{view:t}=this,e=t.state.field(j4),A=e!=null&&t.coordsAtPos(e);if(!A)return null;let i=t.scrollDOM.getBoundingClientRect();return{left:A.left-i.left+t.scrollDOM.scrollLeft*t.scaleX,top:A.top-i.top+t.scrollDOM.scrollTop*t.scaleY,height:A.bottom-A.top}}drawCursor(t){if(this.cursor){let{scaleX:e,scaleY:A}=this.view;t?(this.cursor.style.left=t.left/e+"px",this.cursor.style.top=t.top/A+"px",this.cursor.style.height=t.height/A+"px"):this.cursor.style.left="-100000px"}}destroy(){this.cursor&&this.cursor.remove()}setDropPos(t){this.view.state.field(j4)!=t&&this.view.dispatch({effects:tiA.of(t)})}},{eventObservers:{dragover(t){this.setDropPos(this.view.posAtCoords({x:t.clientX,y:t.clientY}))},dragleave(t){(t.target==this.view.contentDOM||!this.view.contentDOM.contains(t.relatedTarget))&&this.setDropPos(null)},dragend(){this.setDropPos(null)},drop(){this.setDropPos(null)}}});function iiA(){return[j4,$xA]}function VeA(t,e,A,i,n){e.lastIndex=0;for(let o=t.iterRange(A,i),r=A,s;!o.next().done;r+=o.value.length)if(!o.lineBreak)for(;s=e.exec(o.value);)n(r+s.index,s)}function ALA(t,e){let A=t.visibleRanges;if(A.length==1&&A[0].from==t.viewport.from&&A[0].to==t.viewport.to)return A;let i=[];for(let{from:n,to:o}of A)n=Math.max(t.state.doc.lineAt(n).from,n-e),o=Math.min(t.state.doc.lineAt(o).to,o+e),i.length&&i[i.length-1].to>=n?i[i.length-1].to=o:i.push({from:n,to:o});return i}var XL=class{constructor(e){let{regexp:A,decoration:i,decorate:n,boundary:o,maxLength:r=1e3}=e;if(!A.global)throw new RangeError("The regular expression given to MatchDecorator should have its 'g' flag set");if(this.regexp=A,n)this.addMatch=(s,a,c,l)=>n(l,c,c+s[0].length,s,a);else if(typeof i=="function")this.addMatch=(s,a,c,l)=>{let I=i(s,a,c);I&&l(c,c+s[0].length,I)};else if(i)this.addMatch=(s,a,c,l)=>l(c,c+s[0].length,i);else throw new RangeError("Either 'decorate' or 'decoration' should be provided to MatchDecorator");this.boundary=o,this.maxLength=r}createDeco(e){let A=new ds,i=A.add.bind(A);for(let{from:n,to:o}of ALA(e,this.maxLength))VeA(e.state.doc,this.regexp,n,o,(r,s)=>this.addMatch(s,e,r,i));return A.finish()}updateDeco(e,A){let i=1e9,n=-1;return e.docChanged&&e.changes.iterChanges((o,r,s,a)=>{a>=e.view.viewport.from&&s<=e.view.viewport.to&&(i=Math.min(s,i),n=Math.max(a,n))}),e.viewportMoved||n-i>1e3?this.createDeco(e.view):n>-1?this.updateRange(e.view,A.map(e.changes),i,n):A}updateRange(e,A,i,n){for(let o of e.visibleRanges){let r=Math.max(o.from,i),s=Math.min(o.to,n);if(s>=r){let a=e.state.doc.lineAt(r),c=a.toa.from;r--)if(this.boundary.test(a.text[r-1-a.from])){l=r;break}for(;sC.push(u.range(E,h));if(a==c)for(this.regexp.lastIndex=l-a.from;(d=this.regexp.exec(a.text))&&d.indexthis.addMatch(h,e,E,B));A=A.update({filterFrom:l,filterTo:I,filter:(E,h)=>EI,add:C})}}return A}},$L=/x/.unicode!=null?"gu":"g",eLA=new RegExp(`[\0-\b --\x7F-\x9F\xAD\u061C\u200B\u200E\u200F\u2028\u2029\u202D\u202E\u2066\u2067\u2069\uFEFF\uFFF9-\uFFFC]`,$L),tLA={0:"null",7:"bell",8:"backspace",10:"newline",11:"vertical tab",13:"carriage return",27:"escape",8203:"zero width space",8204:"zero width non-joiner",8205:"zero width joiner",8206:"left-to-right mark",8207:"right-to-left mark",8232:"line separator",8237:"left-to-right override",8238:"right-to-left override",8294:"left-to-right isolate",8295:"right-to-left isolate",8297:"pop directional isolate",8233:"paragraph separator",65279:"zero width no-break space",65532:"object replacement"},hL=null;function iLA(){var t;if(hL==null&&typeof document<"u"&&document.body){let e=document.body.style;hL=((t=e.tabSize)!==null&&t!==void 0?t:e.MozTabSize)!=null}return hL||!1}var kw=qe.define({combine(t){let e=Wr(t,{render:null,specialChars:eLA,addSpecialChars:null});return(e.replaceTabs=!iLA())&&(e.specialChars=new RegExp(" |"+e.specialChars.source,$L)),e.addSpecialChars&&(e.specialChars=new RegExp(e.specialChars.source+"|"+e.addSpecialChars.source,$L)),e}});function niA(t={}){return[kw.of(t),nLA()]}var ZeA=null;function nLA(){return ZeA||(ZeA=go.fromClass(class{constructor(t){this.view=t,this.decorations=ut.none,this.decorationCache=Object.create(null),this.decorator=this.makeDecorator(t.state.facet(kw)),this.decorations=this.decorator.createDeco(t)}makeDecorator(t){return new XL({regexp:t.specialChars,decoration:(e,A,i)=>{let{doc:n}=A.state,o=Bs(e[0],0);if(o==9){let r=n.lineAt(i),s=A.state.tabSize,a=J0(r.text,s,i-r.from);return ut.replace({widget:new eF((s-a%s)*this.view.defaultCharacterWidth/this.view.scaleX)})}return this.decorationCache[o]||(this.decorationCache[o]=ut.replace({widget:new AF(t,o)}))},boundary:t.replaceTabs?void 0:/[^]/})}update(t){let e=t.state.facet(kw);t.startState.facet(kw)!=e?(this.decorator=this.makeDecorator(e),this.decorations=this.decorator.createDeco(t.view)):this.decorations=this.decorator.updateDeco(t,this.decorations)}},{decorations:t=>t.decorations}))}var oLA="\u2022";function rLA(t){return t>=32?oLA:t==10?"\u2424":String.fromCharCode(9216+t)}var AF=class extends Ic{constructor(e,A){super(),this.options=e,this.code=A}eq(e){return e.code==this.code}toDOM(e){let A=rLA(this.code),i=e.state.phrase("Control character")+" "+(tLA[this.code]||"0x"+this.code.toString(16)),n=this.options.render&&this.options.render(this.code,i,A);if(n)return n;let o=document.createElement("span");return o.textContent=A,o.title=i,o.setAttribute("aria-label",i),o.className="cm-specialChar",o}ignoreEvent(){return!1}},eF=class extends Ic{constructor(e){super(),this.width=e}eq(e){return e.width==this.width}toDOM(){let e=document.createElement("span");return e.textContent=" ",e.className="cm-tab",e.style.width=this.width+"px",e}ignoreEvent(){return!1}};function oiA(){return aLA}var sLA=ut.line({class:"cm-activeLine"}),aLA=go.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.docChanged||t.selectionSet)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=-1,A=[];for(let i of t.state.selection.ranges){let n=t.lineBlockAt(i.head);n.from>e&&(A.push(sLA.range(n.from)),e=n.from)}return ut.set(A)}},{decorations:t=>t.decorations});var tF=2e3;function cLA(t,e,A){let i=Math.min(e.line,A.line),n=Math.max(e.line,A.line),o=[];if(e.off>tF||A.off>tF||e.col<0||A.col<0){let r=Math.min(e.off,A.off),s=Math.max(e.off,A.off);for(let a=i;a<=n;a++){let c=t.doc.line(a);c.length<=s&&o.push(ae.range(c.from+r,c.to+s))}}else{let r=Math.min(e.col,A.col),s=Math.max(e.col,A.col);for(let a=i;a<=n;a++){let c=t.doc.line(a),l=Cw(c.text,r,t.tabSize,!0);if(l<0)o.push(ae.cursor(c.to));else{let I=Cw(c.text,s,t.tabSize);o.push(ae.range(c.from+l,c.from+I))}}}return o}function lLA(t,e){let A=t.coordsAtPos(t.viewport.from);return A?Math.round(Math.abs((A.left-e)/t.defaultCharacterWidth)):-1}function WeA(t,e){let A=t.posAtCoords({x:e.clientX,y:e.clientY},!1),i=t.state.doc.lineAt(A),n=A-i.from,o=n>tF?-1:n==i.length?lLA(t,e.clientX):J0(i.text,t.state.tabSize,A-i.from);return{line:i.number,col:o,off:n}}function gLA(t,e){let A=WeA(t,e),i=t.state.selection;return A?{update(n){if(n.docChanged){let o=n.changes.mapPos(n.startState.doc.line(A.line).from),r=n.state.doc.lineAt(o);A={line:r.number,col:A.col,off:Math.min(A.off,r.length)},i=i.map(n.changes)}},get(n,o,r){let s=WeA(t,n);if(!s)return i;let a=cLA(t.state,A,s);return a.length?r?ae.create(a.concat(i.ranges)):ae.create(a):i}}:null}function riA(t){let e=t?.eventFilter||(A=>A.altKey&&A.button==0);return qt.mouseSelectionStyle.of((A,i)=>e(i)?gLA(A,i):null)}var ILA={Alt:[18,t=>!!t.altKey],Control:[17,t=>!!t.ctrlKey],Shift:[16,t=>!!t.shiftKey],Meta:[91,t=>!!t.metaKey]},CLA={style:"cursor: crosshair"};function siA(t={}){let[e,A]=ILA[t.key||"Alt"],i=go.fromClass(class{constructor(n){this.view=n,this.isDown=!1}set(n){this.isDown!=n&&(this.isDown=n,this.view.update([]))}},{eventObservers:{keydown(n){this.set(n.keyCode==e||A(n))},keyup(n){(n.keyCode==e||!A(n))&&this.set(!1)},mousemove(n){this.set(A(n))}}});return[i,qt.contentAttributes.of(n=>{var o;return!((o=n.plugin(i))===null||o===void 0)&&o.isDown?CLA:null})]}var z4="-10000px",Jw=class{constructor(e,A,i,n){this.facet=A,this.createTooltipView=i,this.removeTooltipView=n,this.input=e.state.facet(A),this.tooltips=this.input.filter(r=>r);let o=null;this.tooltipViews=this.tooltips.map(r=>o=i(r,o))}update(e,A){var i;let n=e.state.facet(this.facet),o=n.filter(a=>a);if(n===this.input){for(let a of this.tooltipViews)a.update&&a.update(e);return!1}let r=[],s=A?[]:null;for(let a=0;aA[c]=a),A.length=s.length),this.input=n,this.tooltips=o,this.tooltipViews=r,!0}};function dLA(t){let e=t.dom.ownerDocument.documentElement;return{top:0,left:0,bottom:e.clientHeight,right:e.clientWidth}}var uL=qe.define({combine:t=>{var e,A,i;return{position:At.ios?"absolute":((e=t.find(n=>n.position))===null||e===void 0?void 0:e.position)||"fixed",parent:((A=t.find(n=>n.parent))===null||A===void 0?void 0:A.parent)||null,tooltipSpace:((i=t.find(n=>n.tooltipSpace))===null||i===void 0?void 0:i.tooltipSpace)||dLA}}}),XeA=new WeakMap,dF=go.fromClass(class{constructor(t){this.view=t,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let e=t.state.facet(uL);this.position=e.position,this.parent=e.parent,this.classes=t.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver=typeof ResizeObserver=="function"?new ResizeObserver(()=>this.measureSoon()):null,this.manager=new Jw(t,GE,(A,i)=>this.createTooltip(A,i),A=>{this.resizeObserver&&this.resizeObserver.unobserve(A.dom),A.dom.remove()}),this.above=this.manager.tooltips.map(A=>!!A.above),this.intersectionObserver=typeof IntersectionObserver=="function"?new IntersectionObserver(A=>{Date.now()>this.lastTransaction-50&&A.length>0&&A[A.length-1].intersectionRatio<1&&this.measureSoon()},{threshold:[1]}):null,this.observeIntersection(),t.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let t of this.manager.tooltipViews)this.intersectionObserver.observe(t.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout(()=>{this.measureTimeout=-1,this.maybeMeasure()},50))}update(t){t.transactions.length&&(this.lastTransaction=Date.now());let e=this.manager.update(t,this.above);e&&this.observeIntersection();let A=e||t.geometryChanged,i=t.state.facet(uL);if(i.position!=this.position&&!this.madeAbsolute){this.position=i.position;for(let n of this.manager.tooltipViews)n.dom.style.position=this.position;A=!0}if(i.parent!=this.parent){this.parent&&this.container.remove(),this.parent=i.parent,this.createContainer();for(let n of this.manager.tooltipViews)this.container.appendChild(n.dom);A=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);A&&this.maybeMeasure()}createTooltip(t,e){let A=t.create(this.view),i=e?e.dom:null;if(A.dom.classList.add("cm-tooltip"),t.arrow&&!A.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let n=document.createElement("div");n.className="cm-tooltip-arrow",A.dom.appendChild(n)}return A.dom.style.position=this.position,A.dom.style.top=z4,A.dom.style.left="0px",this.container.insertBefore(A.dom,i),A.mount&&A.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(A.dom),A}destroy(){var t,e,A;this.view.win.removeEventListener("resize",this.measureSoon);for(let i of this.manager.tooltipViews)i.dom.remove(),(t=i.destroy)===null||t===void 0||t.call(i);this.parent&&this.container.remove(),(e=this.resizeObserver)===null||e===void 0||e.disconnect(),(A=this.intersectionObserver)===null||A===void 0||A.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let t=1,e=1,A=!1;if(this.position=="fixed"&&this.manager.tooltipViews.length){let{dom:o}=this.manager.tooltipViews[0];if(At.gecko)A=o.offsetParent!=this.container.ownerDocument.body;else if(o.style.top==z4&&o.style.left=="0px"){let r=o.getBoundingClientRect();A=Math.abs(r.top+1e4)>1||Math.abs(r.left)>1}}if(A||this.position=="absolute")if(this.parent){let o=this.parent.getBoundingClientRect();o.width&&o.height&&(t=o.width/this.parent.offsetWidth,e=o.height/this.parent.offsetHeight)}else({scaleX:t,scaleY:e}=this.view.viewState);let i=this.view.scrollDOM.getBoundingClientRect(),n=IF(this.view);return{visible:{left:i.left+n.left,top:i.top+n.top,right:i.right-n.right,bottom:i.bottom-n.bottom},parent:this.parent?this.container.getBoundingClientRect():this.view.dom.getBoundingClientRect(),pos:this.manager.tooltips.map((o,r)=>{let s=this.manager.tooltipViews[r];return s.getCoords?s.getCoords(o.pos):this.view.coordsAtPos(o.pos)}),size:this.manager.tooltipViews.map(({dom:o})=>o.getBoundingClientRect()),space:this.view.state.facet(uL).tooltipSpace(this.view),scaleX:t,scaleY:e,makeAbsolute:A}}writeMeasure(t){var e;if(t.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let s of this.manager.tooltipViews)s.dom.style.position="absolute"}let{visible:A,space:i,scaleX:n,scaleY:o}=t,r=[];for(let s=0;s=Math.min(A.bottom,i.bottom)||I.rightMath.min(A.right,i.right)+.1)){l.style.top=z4;continue}let d=a.arrow?c.dom.querySelector(".cm-tooltip-arrow"):null,B=d?7:0,E=C.right-C.left,h=(e=XeA.get(c))!==null&&e!==void 0?e:C.bottom-C.top,u=c.offset||ELA,D=this.view.textDirection==lo.LTR,L=C.width>i.right-i.left?D?i.left:i.right-C.width:D?Math.max(i.left,Math.min(I.left-(d?14:0)+u.x,i.right-E)):Math.min(Math.max(i.left,I.left-E+(d?14:0)-u.x),i.right-E),R=this.above[s];!a.strictSide&&(R?I.top-h-B-u.yi.bottom)&&R==i.bottom-I.bottom>I.top-i.top&&(R=this.above[s]=!R);let w=(R?I.top-i.top:i.bottom-I.bottom)-B;if(wL&&z.top<_+h&&z.bottom>_&&(_=R?z.top-h-2-B:z.bottom+B+2);if(this.position=="absolute"?(l.style.top=(_-t.parent.top)/o+"px",$eA(l,(L-t.parent.left)/n)):(l.style.top=_/o+"px",$eA(l,L/n)),d){let z=I.left+(D?u.x:-u.x)-(L+14-7);d.style.left=z/n+"px"}c.overlap!==!0&&r.push({left:L,top:_,right:K,bottom:_+h}),l.classList.toggle("cm-tooltip-above",R),l.classList.toggle("cm-tooltip-below",!R),c.positioned&&c.positioned(t.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let t of this.manager.tooltipViews)t.dom.style.top=z4}},{eventObservers:{scroll(){this.maybeMeasure()}}});function $eA(t,e){let A=parseInt(t.style.left,10);(isNaN(A)||Math.abs(e-A)>1)&&(t.style.left=e+"px")}var BLA=qt.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:`${7*2}px`,position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),ELA={x:0,y:0},GE=qe.define({enables:[dF,BLA]}),Tw=qe.define({combine:t=>t.reduce((e,A)=>e.concat(A),[])}),Hw=class t{static create(e){return new t(e)}constructor(e){this.view=e,this.mounted=!1,this.dom=document.createElement("div"),this.dom.classList.add("cm-tooltip-hover"),this.manager=new Jw(e,Tw,(A,i)=>this.createHostedView(A,i),A=>A.dom.remove())}createHostedView(e,A){let i=e.create(this.view);return i.dom.classList.add("cm-tooltip-section"),this.dom.insertBefore(i.dom,A?A.dom.nextSibling:this.dom.firstChild),this.mounted&&i.mount&&i.mount(this.view),i}mount(e){for(let A of this.manager.tooltipViews)A.mount&&A.mount(e);this.mounted=!0}positioned(e){for(let A of this.manager.tooltipViews)A.positioned&&A.positioned(e)}update(e){this.manager.update(e)}destroy(){var e;for(let A of this.manager.tooltipViews)(e=A.destroy)===null||e===void 0||e.call(A)}passProp(e){let A;for(let i of this.manager.tooltipViews){let n=i[e];if(n!==void 0){if(A===void 0)A=n;else if(A!==n)return}}return A}get offset(){return this.passProp("offset")}get getCoords(){return this.passProp("getCoords")}get overlap(){return this.passProp("overlap")}get resize(){return this.passProp("resize")}},QLA=GE.compute([Tw],t=>{let e=t.facet(Tw);return e.length===0?null:{pos:Math.min(...e.map(A=>A.pos)),end:Math.max(...e.map(A=>{var i;return(i=A.end)!==null&&i!==void 0?i:A.pos})),create:Hw.create,above:e[0].above,arrow:e.some(A=>A.arrow)}}),iF=class{constructor(e,A,i,n,o){this.view=e,this.source=A,this.field=i,this.setHover=n,this.hoverTime=o,this.hoverTimeout=-1,this.restartTimeout=-1,this.pending=null,this.lastMove={x:0,y:0,target:e.dom,time:0},this.checkHover=this.checkHover.bind(this),e.dom.addEventListener("mouseleave",this.mouseleave=this.mouseleave.bind(this)),e.dom.addEventListener("mousemove",this.mousemove=this.mousemove.bind(this))}update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeout),this.restartTimeout=setTimeout(()=>this.startHover(),20))}get active(){return this.view.state.field(this.field)}checkHover(){if(this.hoverTimeout=-1,this.active.length)return;let e=Date.now()-this.lastMove.time;es.bottom||A.xs.right+e.defaultCharacterWidth)return;let a=e.bidiSpans(e.state.doc.lineAt(n)).find(l=>l.from<=n&&l.to>=n),c=a&&a.dir==lo.RTL?-1:1;o=A.x{this.pending==s&&(this.pending=null,a&&!(Array.isArray(a)&&!a.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(a)?a:[a])}))},a=>Xr(e.state,a,"hover tooltip"))}else r&&!(Array.isArray(r)&&!r.length)&&e.dispatch({effects:this.setHover.of(Array.isArray(r)?r:[r])})}get tooltip(){let e=this.view.plugin(dF),A=e?e.manager.tooltips.findIndex(i=>i.create==Hw.create):-1;return A>-1?e.manager.tooltipViews[A]:null}mousemove(e){var A,i;this.lastMove={x:e.clientX,y:e.clientY,target:e.target,time:Date.now()},this.hoverTimeout<0&&(this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime));let{active:n,tooltip:o}=this;if(n.length&&o&&!hLA(o.dom,e)||this.pending){let{pos:r}=n[0]||this.pending,s=(i=(A=n[0])===null||A===void 0?void 0:A.end)!==null&&i!==void 0?i:r;(r==s?this.view.posAtCoords(this.lastMove)!=r:!uLA(this.view,r,s,e.clientX,e.clientY))&&(this.view.dispatch({effects:this.setHover.of([])}),this.pending=null)}}mouseleave(e){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1;let{active:A}=this;if(A.length){let{tooltip:i}=this;i&&i.dom.contains(e.relatedTarget)?this.watchTooltipLeave(i.dom):this.view.dispatch({effects:this.setHover.of([])})}}watchTooltipLeave(e){let A=i=>{e.removeEventListener("mouseleave",A),this.active.length&&!this.view.dom.contains(i.relatedTarget)&&this.view.dispatch({effects:this.setHover.of([])})};e.addEventListener("mouseleave",A)}destroy(){clearTimeout(this.hoverTimeout),this.view.dom.removeEventListener("mouseleave",this.mouseleave),this.view.dom.removeEventListener("mousemove",this.mousemove)}},ww=4;function hLA(t,e){let{left:A,right:i,top:n,bottom:o}=t.getBoundingClientRect(),r;if(r=t.querySelector(".cm-tooltip-arrow")){let s=r.getBoundingClientRect();n=Math.min(s.top,n),o=Math.max(s.bottom,o)}return e.clientX>=A-ww&&e.clientX<=i+ww&&e.clientY>=n-ww&&e.clientY<=o+ww}function uLA(t,e,A,i,n,o){let r=t.scrollDOM.getBoundingClientRect(),s=t.documentTop+t.documentPadding.top+t.contentHeight;if(r.left>i||r.rightn||Math.min(r.bottom,s)=e&&a<=A}function aiA(t,e={}){let A=Pi.define(),i=Ar.define({create(){return[]},update(n,o){if(n.length&&(e.hideOnChange&&(o.docChanged||o.selection)?n=[]:e.hideOn&&(n=n.filter(r=>!e.hideOn(o,r))),o.docChanged)){let r=[];for(let s of n){let a=o.changes.mapPos(s.pos,-1,Is.TrackDel);if(a!=null){let c=Object.assign(Object.create(null),s);c.pos=a,c.end!=null&&(c.end=o.changes.mapPos(c.end)),r.push(c)}}n=r}for(let r of o.effects)r.is(A)&&(n=r.value),r.is(fLA)&&(n=[]);return n},provide:n=>Tw.from(n)});return{active:i,extension:[i,go.define(n=>new iF(n,t,i,A,e.hoverTime||300)),QLA]}}function BF(t,e){let A=t.plugin(dF);if(!A)return null;let i=A.manager.tooltips.indexOf(e);return i<0?null:A.manager.tooltipViews[i]}var fLA=Pi.define();var AtA=qe.define({combine(t){let e,A;for(let i of t)e=e||i.topContainer,A=A||i.bottomContainer;return{topContainer:e,bottomContainer:A}}});function kC(t,e){let A=t.plugin(ciA),i=A?A.specs.indexOf(e):-1;return i>-1?A.panels[i]:null}var ciA=go.fromClass(class{constructor(t){this.input=t.state.facet(MC),this.specs=this.input.filter(A=>A),this.panels=this.specs.map(A=>A(t));let e=t.state.facet(AtA);this.top=new xE(t,!0,e.topContainer),this.bottom=new xE(t,!1,e.bottomContainer),this.top.sync(this.panels.filter(A=>A.top)),this.bottom.sync(this.panels.filter(A=>!A.top));for(let A of this.panels)A.dom.classList.add("cm-panel"),A.mount&&A.mount()}update(t){let e=t.state.facet(AtA);this.top.container!=e.topContainer&&(this.top.sync([]),this.top=new xE(t.view,!0,e.topContainer)),this.bottom.container!=e.bottomContainer&&(this.bottom.sync([]),this.bottom=new xE(t.view,!1,e.bottomContainer)),this.top.syncClasses(),this.bottom.syncClasses();let A=t.state.facet(MC);if(A!=this.input){let i=A.filter(a=>a),n=[],o=[],r=[],s=[];for(let a of i){let c=this.specs.indexOf(a),l;c<0?(l=a(t.view),s.push(l)):(l=this.panels[c],l.update&&l.update(t)),n.push(l),(l.top?o:r).push(l)}this.specs=i,this.panels=n,this.top.sync(o),this.bottom.sync(r);for(let a of s)a.dom.classList.add("cm-panel"),a.mount&&a.mount()}else for(let i of this.panels)i.update&&i.update(t)}destroy(){this.top.sync([]),this.bottom.sync([])}},{provide:t=>qt.scrollMargins.of(e=>{let A=e.plugin(t);return A&&{top:A.top.scrollMargin(),bottom:A.bottom.scrollMargin()}})}),xE=class{constructor(e,A,i){this.view=e,this.top=A,this.container=i,this.dom=void 0,this.classes="",this.panels=[],this.syncClasses()}sync(e){for(let A of this.panels)A.destroy&&e.indexOf(A)<0&&A.destroy();this.panels=e,this.syncDOM()}syncDOM(){if(this.panels.length==0){this.dom&&(this.dom.remove(),this.dom=void 0);return}if(!this.dom){this.dom=document.createElement("div"),this.dom.className=this.top?"cm-panels cm-panels-top":"cm-panels cm-panels-bottom",this.dom.style[this.top?"top":"bottom"]="0";let A=this.container||this.view.dom;A.insertBefore(this.dom,this.top?A.firstChild:null)}let e=this.dom.firstChild;for(let A of this.panels)if(A.dom.parentNode==this.dom){for(;e!=A.dom;)e=etA(e);e=e.nextSibling}else this.dom.insertBefore(A.dom,e);for(;e;)e=etA(e)}scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?this.dom.getBoundingClientRect().bottom-Math.max(0,this.view.scrollDOM.getBoundingClientRect().top):Math.min(innerHeight,this.view.scrollDOM.getBoundingClientRect().bottom)-this.dom.getBoundingClientRect().top)}syncClasses(){if(!(!this.container||this.classes==this.view.themeClasses)){for(let e of this.classes.split(" "))e&&this.container.classList.remove(e);for(let e of(this.classes=this.view.themeClasses).split(" "))e&&this.container.classList.add(e)}}};function etA(t){let e=t.nextSibling;return t.remove(),e}var MC=qe.define({enables:ciA});var Fa=class extends wl{compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}eq(e){return!1}destroy(e){}};Fa.prototype.elementClass="";Fa.prototype.toDOM=void 0;Fa.prototype.mapMode=Is.TrackBefore;Fa.prototype.startSide=Fa.prototype.endSide=-1;Fa.prototype.point=!0;var Sw=qe.define(),mLA=qe.define(),pLA={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>co.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{},side:"before"},$4=qe.define();function Vw(t){return[liA(),$4.of(rA(rA({},pLA),t))]}var nF=qe.define({combine:t=>t.some(e=>e)});function liA(t){let e=[wLA];return t&&t.fixed===!1&&e.push(nF.of(!0)),e}var wLA=go.fromClass(class{constructor(t){this.view=t,this.domAfter=null,this.prevViewport=t.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters cm-gutters-before",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=t.state.facet($4).map(e=>new zw(t,e)),this.fixed=!t.state.facet(nF);for(let e of this.gutters)e.config.side=="after"?this.getDOMAfter().appendChild(e.dom):this.dom.appendChild(e.dom);this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),t.scrollDOM.insertBefore(this.dom,t.contentDOM)}getDOMAfter(){return this.domAfter||(this.domAfter=document.createElement("div"),this.domAfter.className="cm-gutters cm-gutters-after",this.domAfter.setAttribute("aria-hidden","true"),this.domAfter.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.domAfter.style.position=this.fixed?"sticky":"",this.view.scrollDOM.appendChild(this.domAfter)),this.domAfter}update(t){if(this.updateGutters(t)){let e=this.prevViewport,A=t.view.viewport,i=Math.min(e.to,A.to)-Math.max(e.from,A.from);this.syncGutters(i<(A.to-A.from)*.8)}if(t.geometryChanged){let e=this.view.contentHeight/this.view.scaleY+"px";this.dom.style.minHeight=e,this.domAfter&&(this.domAfter.style.minHeight=e)}this.view.state.facet(nF)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":"",this.domAfter&&(this.domAfter.style.position=this.fixed?"sticky":"")),this.prevViewport=t.view.viewport}syncGutters(t){let e=this.dom.nextSibling;t&&(this.dom.remove(),this.domAfter&&this.domAfter.remove());let A=co.iter(this.view.state.facet(Sw),this.view.viewport.from),i=[],n=this.gutters.map(o=>new rF(o,this.view.viewport,-this.view.documentPadding.top));for(let o of this.view.viewportLineBlocks)if(i.length&&(i=[]),Array.isArray(o.type)){let r=!0;for(let s of o.type)if(s.type==$s.Text&&r){oF(A,i,s.from);for(let a of n)a.line(this.view,s,i);r=!1}else if(s.widget)for(let a of n)a.widget(this.view,s)}else if(o.type==$s.Text){oF(A,i,o.from);for(let r of n)r.line(this.view,o,i)}else if(o.widget)for(let r of n)r.widget(this.view,o);for(let o of n)o.finish();t&&(this.view.scrollDOM.insertBefore(this.dom,e),this.domAfter&&this.view.scrollDOM.appendChild(this.domAfter))}updateGutters(t){let e=t.startState.facet($4),A=t.state.facet($4),i=t.docChanged||t.heightChanged||t.viewportChanged||!co.eq(t.startState.facet(Sw),t.state.facet(Sw),t.view.viewport.from,t.view.viewport.to);if(e==A)for(let n of this.gutters)n.update(t)&&(i=!0);else{i=!0;let n=[];for(let o of A){let r=e.indexOf(o);r<0?n.push(new zw(this.view,o)):(this.gutters[r].update(t),n.push(this.gutters[r]))}for(let o of this.gutters)o.dom.remove(),n.indexOf(o)<0&&o.destroy();for(let o of n)o.config.side=="after"?this.getDOMAfter().appendChild(o.dom):this.dom.appendChild(o.dom);this.gutters=n}return i}destroy(){for(let t of this.gutters)t.destroy();this.dom.remove(),this.domAfter&&this.domAfter.remove()}},{provide:t=>qt.scrollMargins.of(e=>{let A=e.plugin(t);if(!A||A.gutters.length==0||!A.fixed)return null;let i=A.dom.offsetWidth*e.scaleX,n=A.domAfter?A.domAfter.offsetWidth*e.scaleX:0;return e.textDirection==lo.LTR?{left:i,right:n}:{right:i,left:n}})});function ttA(t){return Array.isArray(t)?t:[t]}function oF(t,e,A){for(;t.value&&t.from<=A;)t.from==A&&e.push(t.value),t.next()}var rF=class{constructor(e,A,i){this.gutter=e,this.height=i,this.i=0,this.cursor=co.iter(e.markers,A.from)}addElement(e,A,i){let{gutter:n}=this,o=(A.top-this.height)/e.scaleY,r=A.height/e.scaleY;if(this.i==n.elements.length){let s=new Ow(e,r,o,i);n.elements.push(s),n.dom.appendChild(s.dom)}else n.elements[this.i].update(e,r,o,i);this.height=A.bottom,this.i++}line(e,A,i){let n=[];oF(this.cursor,n,A.from),i.length&&(n=n.concat(i));let o=this.gutter.config.lineMarker(e,A,n);o&&n.unshift(o);let r=this.gutter;n.length==0&&!r.config.renderEmptyElements||this.addElement(e,A,n)}widget(e,A){let i=this.gutter.config.widgetMarker(e,A.widget,A),n=i?[i]:null;for(let o of e.state.facet(mLA)){let r=o(e,A.widget,A);r&&(n||(n=[])).push(r)}n&&this.addElement(e,A,n)}finish(){let e=this.gutter;for(;e.elements.length>this.i;){let A=e.elements.pop();e.dom.removeChild(A.dom),A.destroy()}}},zw=class{constructor(e,A){this.view=e,this.config=A,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let i in A.domEventHandlers)this.dom.addEventListener(i,n=>{let o=n.target,r;if(o!=this.dom&&this.dom.contains(o)){for(;o.parentNode!=this.dom;)o=o.parentNode;let a=o.getBoundingClientRect();r=(a.top+a.bottom)/2}else r=n.clientY;let s=e.lineBlockAtHeight(r-e.documentTop);A.domEventHandlers[i](e,s,n)&&n.preventDefault()});this.markers=ttA(A.markers(e)),A.initialSpacer&&(this.spacer=new Ow(e,0,0,[A.initialSpacer(e)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(e){let A=this.markers;if(this.markers=ttA(this.config.markers(e.view)),this.spacer&&this.config.updateSpacer){let n=this.config.updateSpacer(this.spacer.markers[0],e);n!=this.spacer.markers[0]&&this.spacer.update(e.view,0,0,[n])}let i=e.view.viewport;return!co.eq(this.markers,A,i.from,i.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(e):!1)}destroy(){for(let e of this.elements)e.destroy()}},Ow=class{constructor(e,A,i,n){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(e,A,i,n)}update(e,A,i,n){this.height!=A&&(this.height=A,this.dom.style.height=A+"px"),this.above!=i&&(this.dom.style.marginTop=(this.above=i)?i+"px":""),DLA(this.markers,n)||this.setMarkers(e,n)}setMarkers(e,A){let i="cm-gutterElement",n=this.dom.firstChild;for(let o=0,r=0;;){let s=r,a=oo(s,a,c)||r(s,a,c):r}return i}})}}),A3=class extends Fa{constructor(e){super(),this.number=e}eq(e){return this.number==e.number}toDOM(){return document.createTextNode(this.number)}};function fL(t,e){return t.state.facet(LE).formatNumber(e,t.state)}var bLA=$4.compute([LE],t=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers(e){return e.state.facet(yLA)},lineMarker(e,A,i){return i.some(n=>n.toDOM)?null:new A3(fL(e,e.state.doc.lineAt(A.from).number))},widgetMarker:(e,A,i)=>{for(let n of e.state.facet(vLA)){let o=n(e,A,i);if(o)return o}return null},lineMarkerChange:e=>e.startState.facet(LE)!=e.state.facet(LE),initialSpacer(e){return new A3(fL(e,itA(e.state.doc.lines)))},updateSpacer(e,A){let i=fL(A.view,itA(A.view.state.doc.lines));return i==e.number?e:new A3(i)},domEventHandlers:t.facet(LE).domEventHandlers,side:"before"}));function giA(t={}){return[LE.of(t),liA(),bLA]}function itA(t){let e=9;for(;e{let e=[],A=-1;for(let i of t.selection.ranges){let n=t.doc.lineAt(i.head).from;n>A&&(A=n,e.push(MLA.range(n)))}return co.of(e)});function IiA(){return kLA}var SLA=0,g3=class{constructor(e,A){this.from=e,this.to=A}},fi=class{constructor(e={}){this.id=SLA++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")})}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof e!="function"&&(e=Fs.match(e)),A=>{let i=e(A);return i===void 0?null:[this,i]}}};fi.closedBy=new fi({deserialize:t=>t.split(" ")});fi.openedBy=new fi({deserialize:t=>t.split(" ")});fi.group=new fi({deserialize:t=>t.split(" ")});fi.isolate=new fi({deserialize:t=>{if(t&&t!="rtl"&&t!="ltr"&&t!="auto")throw new RangeError("Invalid value for isolate: "+t);return t||"auto"}});fi.contextHash=new fi({perNode:!0});fi.lookAhead=new fi({perNode:!0});fi.mounted=new fi({perNode:!0});var UE=class{constructor(e,A,i){this.tree=e,this.overlay=A,this.parser=i}static get(e){return e&&e.props&&e.props[fi.mounted.id]}},RLA=Object.create(null),Fs=class t{constructor(e,A,i,n=0){this.name=e,this.props=A,this.id=i,this.flags=n}static define(e){let A=e.props&&e.props.length?Object.create(null):RLA,i=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),n=new t(e.name||"",A,e.id,i);if(e.props){for(let o of e.props)if(Array.isArray(o)||(o=o(n)),o){if(o[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");A[o[0].id]=o[1]}}return n}prop(e){return this.props[e.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(e){if(typeof e=="string"){if(this.name==e)return!0;let A=this.prop(fi.group);return A?A.indexOf(e)>-1:!1}return this.id==e}static match(e){let A=Object.create(null);for(let i in e)for(let n of i.split(" "))A[n]=e[i];return i=>{for(let n=i.prop(fi.group),o=-1;o<(n?n.length:0);o++){let r=A[o<0?i.name:n[o]];if(r)return r}}}};Fs.none=new Fs("",Object.create(null),0,8);var I3=class t{constructor(e){this.types=e;for(let A=0;A0;for(let a=this.cursor(r|Jr.IncludeAnonymous);;){let c=!1;if(a.from<=o&&a.to>=n&&(!s&&a.type.isAnonymous||A(a)!==!1)){if(a.firstChild())continue;c=!0}for(;c&&i&&(s||!a.type.isAnonymous)&&i(a),!a.nextSibling();){if(!a.parent())return;c=!0}}}prop(e){return e.perNode?this.props?this.props[e.id]:void 0:this.type.prop(e)}get propValues(){let e=[];if(this.props)for(let A in this.props)e.push([+A,this.props[A]]);return e}balance(e={}){return this.children.length<=8?this:pF(Fs.none,this.children,this.positions,0,this.children.length,0,this.length,(A,i,n)=>new t(this.type,A,i,n,this.propValues),e.makeTree||((A,i,n)=>new t(Fs.none,A,i,n)))}static build(e){return LLA(e)}};ur.empty=new ur(Fs.none,[],[],0);var EF=class t{constructor(e,A){this.buffer=e,this.index=A}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new t(this.buffer,this.index)}},v1=class t{constructor(e,A,i){this.buffer=e,this.length=A,this.set=i}get type(){return Fs.none}toString(){let e=[];for(let A=0;A0));a=r[a+3]);return s}slice(e,A,i){let n=this.buffer,o=new Uint16Array(A-e),r=0;for(let s=e,a=0;s=e&&Ae;case 1:return A<=e&&i>e;case 2:return i>e;case 4:return!0}}function C3(t,e,A,i){for(var n;t.from==t.to||(A<1?t.from>=e:t.from>e)||(A>-1?t.to<=e:t.to0?s.length:-1;e!=c;e+=A){let l=s[e],I=a[e]+r.from;if(EiA(n,i,I,I+l.length)){if(l instanceof v1){if(o&Jr.ExcludeBuffers)continue;let C=l.findChild(0,l.buffer.length,A,i-I,n);if(C>-1)return new d3(new hF(r,l,e,I),null,C)}else if(o&Jr.IncludeAnonymous||!l.type.isAnonymous||mF(l)){let C;if(!(o&Jr.IgnoreMounts)&&(C=UE.get(l))&&!C.overlay)return new t(C.tree,I,e,r);let d=new t(l,I,e,r);return o&Jr.IncludeAnonymous||!d.type.isAnonymous?d:d.nextChild(A<0?l.children.length-1:0,A,i,n)}}}if(o&Jr.IncludeAnonymous||!r.type.isAnonymous||(r.index>=0?e=r.index+A:e=A<0?-1:r._parent._tree.children.length,r=r._parent,!r))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(e){return this.nextChild(0,1,e,2)}childBefore(e){return this.nextChild(this._tree.children.length-1,-1,e,-2)}enter(e,A,i=0){let n;if(!(i&Jr.IgnoreOverlays)&&(n=UE.get(this._tree))&&n.overlay){let o=e-this.from;for(let{from:r,to:s}of n.overlay)if((A>0?r<=o:r=o:s>o))return new t(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,e,A,i)}nextSignificantParent(){let e=this;for(;e.type.isAnonymous&&e._parent;)e=e._parent;return e}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}};function diA(t,e,A,i){let n=t.cursor(),o=[];if(!n.firstChild())return o;if(A!=null){for(let r=!1;!r;)if(r=n.type.is(A),!n.nextSibling())return o}for(;;){if(i!=null&&n.type.is(i))return o;if(n.type.is(e)&&o.push(n.node),!n.nextSibling())return i==null?o:[]}}function QF(t,e,A=e.length-1){for(let i=t;A>=0;i=i.parent){if(!i)return!1;if(!i.type.isAnonymous){if(e[A]&&e[A]!=i.name)return!1;A--}}return!0}var hF=class{constructor(e,A,i,n){this.parent=e,this.buffer=A,this.index=i,this.start=n}},d3=class t extends Xw{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(e,A,i){super(),this.context=e,this._parent=A,this.index=i,this.type=e.buffer.set.types[e.buffer.buffer[i]]}child(e,A,i){let{buffer:n}=this.context,o=n.findChild(this.index+4,n.buffer[this.index+3],e,A-this.context.start,i);return o<0?null:new t(this.context,this,o)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(e){return this.child(1,e,2)}childBefore(e){return this.child(-1,e,-2)}enter(e,A,i=0){if(i&Jr.ExcludeBuffers)return null;let{buffer:n}=this.context,o=n.findChild(this.index+4,n.buffer[this.index+3],A>0?1:-1,e-this.context.start,A);return o<0?null:new t(this.context,this,o)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(e){return this._parent?null:this.context.parent.nextChild(this.context.index+e,e,0,4)}get nextSibling(){let{buffer:e}=this.context,A=e.buffer[this.index+3];return A<(this._parent?e.buffer[this._parent.index+3]:e.buffer.length)?new t(this.context,this._parent,A):this.externalSibling(1)}get prevSibling(){let{buffer:e}=this.context,A=this._parent?this._parent.index+4:0;return this.index==A?this.externalSibling(-1):new t(this.context,this._parent,e.findChild(A,this.index,-1,0,4))}get tree(){return null}toTree(){let e=[],A=[],{buffer:i}=this.context,n=this.index+4,o=i.buffer[this.index+3];if(o>n){let r=i.buffer[this.index+1];e.push(i.slice(n,o,r)),A.push(0)}return new ur(this.type,e,A,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}};function QiA(t){if(!t.length)return null;let e=0,A=t[0];for(let o=1;oA.from||r.to=e){let s=new Fg(r.tree,r.overlay[0].from+o.from,-1,o);(n||(n=[i])).push(C3(s,e,A,!1))}}return n?QiA(n):i}var B3=class{get name(){return this.type.name}constructor(e,A=0){if(this.mode=A,this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,e instanceof Fg)this.yieldNode(e);else{this._tree=e.context.parent,this.buffer=e.context;for(let i=e._parent;i;i=i._parent)this.stack.unshift(i.index);this.bufferNode=e,this.yieldBuf(e.index)}}yieldNode(e){return e?(this._tree=e,this.type=e.type,this.from=e.from,this.to=e.to,!0):!1}yieldBuf(e,A){this.index=e;let{start:i,buffer:n}=this.buffer;return this.type=A||n.set.types[n.buffer[e]],this.from=i+n.buffer[e+1],this.to=i+n.buffer[e+2],!0}yield(e){return e?e instanceof Fg?(this.buffer=null,this.yieldNode(e)):(this.buffer=e.context,this.yieldBuf(e.index,e.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(e,A,i){if(!this.buffer)return this.yield(this._tree.nextChild(e<0?this._tree._tree.children.length-1:0,e,A,i,this.mode));let{buffer:n}=this.buffer,o=n.findChild(this.index+4,n.buffer[this.index+3],e,A-this.buffer.start,i);return o<0?!1:(this.stack.push(this.index),this.yieldBuf(o))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(e){return this.enterChild(1,e,2)}childBefore(e){return this.enterChild(-1,e,-2)}enter(e,A,i=this.mode){return this.buffer?i&Jr.ExcludeBuffers?!1:this.enterChild(1,e,A):this.yield(this._tree.enter(e,A,i))}parent(){if(!this.buffer)return this.yieldNode(this.mode&Jr.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let e=this.mode&Jr.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(e)}sibling(e){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+e,e,0,4,this.mode)):!1;let{buffer:A}=this.buffer,i=this.stack.length-1;if(e<0){let n=i<0?0:this.stack[i]+4;if(this.index!=n)return this.yieldBuf(A.findChild(n,this.index,-1,0,4))}else{let n=A.buffer[this.index+3];if(n<(i<0?A.buffer.length:A.buffer[this.stack[i]+3]))return this.yieldBuf(n)}return i<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+e,e,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(e){let A,i,{buffer:n}=this;if(n){if(e>0){if(this.index-1)for(let o=A+e,r=e<0?-1:i._tree.children.length;o!=r;o+=e){let s=i._tree.children[o];if(this.mode&Jr.IncludeAnonymous||s instanceof v1||!s.type.isAnonymous||mF(s))return!1}return!0}move(e,A){if(A&&this.enterChild(e,0,4))return!0;for(;;){if(this.sibling(e))return!0;if(this.atLastNode(e)||!this.parent())return!1}}next(e=!0){return this.move(1,e)}prev(e=!0){return this.move(-1,e)}moveTo(e,A=0){for(;(this.from==this.to||(A<1?this.from>=e:this.from>e)||(A>-1?this.to<=e:this.to=0;){for(let r=e;r;r=r._parent)if(r.index==n){if(n==this.index)return r;A=r,i=o+1;break A}n=this.stack[--o]}for(let n=i;n=0;o--){if(o<0)return QF(this._tree,e,n);let r=i[A.buffer[this.stack[o]]];if(!r.isAnonymous){if(e[n]&&e[n]!=r.name)return!1;n--}}return!0}};function mF(t){return t.children.some(e=>e instanceof v1||!e.type.isAnonymous||mF(e))}function LLA(t){var e;let{buffer:A,nodeSet:i,maxBufferLength:n=1024,reused:o=[],minRepeatType:r=i.types.length}=t,s=Array.isArray(A)?new EF(A,A.length):A,a=i.types,c=0,l=0;function I(w,_,K,z,U,H){let{id:q,start:j,end:gA,size:QA}=s,BA=l,lA=c;for(;QA<0;)if(s.next(),QA==-1){let VA=o[q];K.push(VA),z.push(j-w);return}else if(QA==-3){c=q;return}else if(QA==-4){l=q;return}else throw new RangeError(`Unrecognized record size: ${QA}`);let vA=a[q],tA,cA,pA=j-w;if(gA-j<=n&&(cA=h(s.pos-_,U))){let VA=new Uint16Array(cA.size-cA.skip),oe=s.pos-cA.size,KA=VA.length;for(;s.pos>oe;)KA=u(cA.start,VA,KA);tA=new v1(VA,gA-cA.start,i),pA=cA.start-w}else{let VA=s.pos-QA;s.next();let oe=[],KA=[],CA=q>=r?q:-1,TA=0,Ze=gA;for(;s.pos>VA;)CA>=0&&s.id==CA&&s.size>=0?(s.end<=Ze-n&&(B(oe,KA,j,TA,s.end,Ze,CA,BA,lA),TA=oe.length,Ze=s.end),s.next()):H>2500?C(j,VA,oe,KA):I(j,VA,oe,KA,CA,H+1);if(CA>=0&&TA>0&&TA-1&&TA>0){let He=d(vA,lA);tA=pF(vA,oe,KA,0,oe.length,0,gA-j,He,He)}else tA=E(vA,oe,KA,gA-j,BA-gA,lA)}K.push(tA),z.push(pA)}function C(w,_,K,z){let U=[],H=0,q=-1;for(;s.pos>_;){let{id:j,start:gA,end:QA,size:BA}=s;if(BA>4)s.next();else{if(q>-1&&gA=0;QA-=3)j[BA++]=U[QA],j[BA++]=U[QA+1]-gA,j[BA++]=U[QA+2]-gA,j[BA++]=BA;K.push(new v1(j,U[2]-gA,i)),z.push(gA-w)}}function d(w,_){return(K,z,U)=>{let H=0,q=K.length-1,j,gA;if(q>=0&&(j=K[q])instanceof ur){if(!q&&j.type==w&&j.length==U)return j;(gA=j.prop(fi.lookAhead))&&(H=z[q]+j.length+gA)}return E(w,K,z,U,H,_)}}function B(w,_,K,z,U,H,q,j,gA){let QA=[],BA=[];for(;w.length>z;)QA.push(w.pop()),BA.push(_.pop()+K-U);w.push(E(i.types[q],QA,BA,H-U,j-H,gA)),_.push(U-K)}function E(w,_,K,z,U,H,q){if(H){let j=[fi.contextHash,H];q=q?[j].concat(q):[j]}if(U>25){let j=[fi.lookAhead,U];q=q?[j].concat(q):[j]}return new ur(w,_,K,z,q)}function h(w,_){let K=s.fork(),z=0,U=0,H=0,q=K.end-n,j={size:0,start:0,skip:0};A:for(let gA=K.pos-w;K.pos>gA;){let QA=K.size;if(K.id==_&&QA>=0){j.size=z,j.start=U,j.skip=H,H+=4,z+=4,K.next();continue}let BA=K.pos-QA;if(QA<0||BA=r?4:0,vA=K.start;for(K.next();K.pos>BA;){if(K.size<0)if(K.size==-3)lA+=4;else break A;else K.id>=r&&(lA+=4);K.next()}U=vA,z+=QA,H+=lA}return(_<0||z==w)&&(j.size=z,j.start=U,j.skip=H),j.size>4?j:void 0}function u(w,_,K){let{id:z,start:U,end:H,size:q}=s;if(s.next(),q>=0&&z4){let gA=s.pos-(q-4);for(;s.pos>gA;)K=u(w,_,K)}_[--K]=j,_[--K]=H-w,_[--K]=U-w,_[--K]=z}else q==-3?c=z:q==-4&&(l=z);return K}let D=[],L=[];for(;s.pos>0;)I(t.start||0,t.bufferStart||0,D,L,-1,0);let R=(e=t.length)!==null&&e!==void 0?e:D.length?L[0]+D[0].length:0;return new ur(a[t.topID],D.reverse(),L.reverse(),R)}var BiA=new WeakMap;function Ww(t,e){if(!t.isAnonymous||e instanceof v1||e.type!=t)return 1;let A=BiA.get(e);if(A==null){A=1;for(let i of e.children){if(i.type!=t||!(i instanceof ur)){A=1;break}A+=Ww(t,i)}BiA.set(e,A)}return A}function pF(t,e,A,i,n,o,r,s,a){let c=0;for(let B=i;B=l)break;_+=K}if(L==R+1){if(_>l){let K=B[R];d(K.children,K.positions,0,K.children.length,E[R]+D);continue}I.push(B[R])}else{let K=E[L-1]+B[L-1].length-w;I.push(pF(t,B,E,R,L,w,K,null,a))}C.push(w+D-o)}}return d(e,A,i,n,0),(s||a)(I,C,r)}var SC=class t{constructor(e,A,i,n,o=!1,r=!1){this.from=e,this.to=A,this.tree=i,this.offset=n,this.open=(o?1:0)|(r?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(e,A=[],i=!1){let n=[new t(0,e.length,e,0,!1,i)];for(let o of A)o.to>e.length&&n.push(o);return n}static applyChanges(e,A,i=128){if(!A.length)return e;let n=[],o=1,r=e.length?e[0]:null;for(let s=0,a=0,c=0;;s++){let l=s=i)for(;r&&r.from=C.from||I<=C.to||c){let d=Math.max(C.from,a)-c,B=Math.min(C.to,I)-c;C=d>=B?null:new t(d,B,C.tree,C.offset+c,s>0,!!l)}if(C&&n.push(C),r.to>I)break;r=onew g3(n.from,n.to)):[new g3(0,0)]:[new g3(0,e.length)],this.createParse(e,A||[],i)}parse(e,A,i){let n=this.startParse(e,A,i);for(;;){let o=n.advance();if(o)return o}}},fF=class{constructor(e){this.string=e}get length(){return this.string.length}chunk(e){return this.string.slice(e)}get lineChunks(){return!1}read(e,A){return this.string.slice(e,A)}};var Gpe=new fi({perNode:!0});var FLA=0,vl=class t{constructor(e,A,i,n){this.name=e,this.set=A,this.base=i,this.modified=n,this.id=FLA++}toString(){let{name:e}=this;for(let A of this.modified)A.name&&(e=`${A.name}(${e})`);return e}static define(e,A){let i=typeof e=="string"?e:"?";if(e instanceof t&&(A=e),A?.base)throw new Error("Can not derive from a modified tag");let n=new t(i,[],null,[]);if(n.set.push(n),A)for(let o of A.set)n.set.push(o);return n}static defineModifier(e){let A=new tD(e);return i=>i.modified.indexOf(A)>-1?i:tD.get(i.base||i,i.modified.concat(A).sort((n,o)=>n.id-o.id))}},NLA=0,tD=class t{constructor(e){this.name=e,this.instances=[],this.id=NLA++}static get(e,A){if(!A.length)return e;let i=A[0].instances.find(s=>s.base==e&&_LA(A,s.modified));if(i)return i;let n=[],o=new vl(e.name,n,e,A);for(let s of A)s.instances.push(o);let r=GLA(A);for(let s of e.set)if(!s.modified.length)for(let a of r)n.push(t.get(s,a));return o}};function _LA(t,e){return t.length==e.length&&t.every((A,i)=>A==e[i])}function GLA(t){let e=[[]];for(let A=0;Ai.length-A.length)}function iD(t){let e=Object.create(null);for(let A in t){let i=t[A];Array.isArray(i)||(i=[i]);for(let n of A.split(" "))if(n){let o=[],r=2,s=n;for(let I=0;;){if(s=="..."&&I>0&&I+3==n.length){r=1;break}let C=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(s);if(!C)throw new RangeError("Invalid path: "+n);if(o.push(C[0]=="*"?"":C[0][0]=='"'?JSON.parse(C[0]):C[0]),I+=C[0].length,I==n.length)break;let d=n[I++];if(I==n.length&&d=="!"){r=0;break}if(d!="/")throw new RangeError("Invalid path: "+n);s=n.slice(I)}let a=o.length-1,c=o[a];if(!c)throw new RangeError("Invalid path: "+n);let l=new YE(i,r,a>0?o.slice(0,a):null);e[c]=l.sort(e[c])}}return fiA.add(e)}var fiA=new fi,YE=class{constructor(e,A,i,n){this.tags=e,this.mode=A,this.context=i,this.next=n}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(e){return!e||e.depth{let r=n;for(let s of o)for(let a of s.set){let c=A[a.id];if(c){r=r?r+" "+c:c;break}}return r},scope:i}}function ULA(t,e){let A=null;for(let i of t){let n=i.style(e);n&&(A=A?A+" "+n:n)}return A}function miA(t,e,A,i=0,n=t.length){let o=new DF(i,Array.isArray(e)?e:[e],A);o.highlightRange(t.cursor(),i,n,"",o.highlighters),o.flush(n)}var DF=class{constructor(e,A,i){this.at=e,this.highlighters=A,this.span=i,this.class=""}startSpan(e,A){A!=this.class&&(this.flush(e),e>this.at&&(this.at=e),this.class=A)}flush(e){e>this.at&&this.class&&this.span(this.at,e,this.class)}highlightRange(e,A,i,n,o){let{type:r,from:s,to:a}=e;if(s>=i||a<=A)return;r.isTop&&(o=this.highlighters.filter(d=>!d.scope||d.scope(r)));let c=n,l=KLA(e)||YE.empty,I=ULA(o,l.tags);if(I&&(c&&(c+=" "),c+=I,l.mode==1&&(n+=(n?" ":"")+I)),this.startSpan(Math.max(A,s),c),l.opaque)return;let C=e.tree&&e.tree.prop(fi.mounted);if(C&&C.overlay){let d=e.node.enter(C.overlay[0].from+s,1),B=this.highlighters.filter(h=>!h.scope||h.scope(C.tree.type)),E=e.firstChild();for(let h=0,u=s;;h++){let D=h=L||!e.nextSibling())););if(!D||L>i)break;u=D.to+s,u>A&&(this.highlightRange(d.cursor(),Math.max(A,D.from+s),Math.min(i,u),"",B),this.startSpan(Math.min(i,u),c))}E&&e.parent()}else if(e.firstChild()){C&&(n="");do if(!(e.to<=A)){if(e.from>=i)break;this.highlightRange(e,A,i,n,o),this.startSpan(Math.min(i,e.to),c)}while(e.nextSibling());e.parent()}}};function KLA(t){let e=t.type.prop(fiA);for(;e&&e.context&&!t.matchContext(e.context);)e=e.next;return e||null}var Oe=vl.define,$w=Oe(),b1=Oe(),hiA=Oe(b1),uiA=Oe(b1),M1=Oe(),AD=Oe(M1),wF=Oe(M1),Gg=Oe(),RC=Oe(Gg),Ng=Oe(),_g=Oe(),yF=Oe(),E3=Oe(yF),eD=Oe(),Se={comment:$w,lineComment:Oe($w),blockComment:Oe($w),docComment:Oe($w),name:b1,variableName:Oe(b1),typeName:hiA,tagName:Oe(hiA),propertyName:uiA,attributeName:Oe(uiA),className:Oe(b1),labelName:Oe(b1),namespace:Oe(b1),macroName:Oe(b1),literal:M1,string:AD,docString:Oe(AD),character:Oe(AD),attributeValue:Oe(AD),number:wF,integer:Oe(wF),float:Oe(wF),bool:Oe(M1),regexp:Oe(M1),escape:Oe(M1),color:Oe(M1),url:Oe(M1),keyword:Ng,self:Oe(Ng),null:Oe(Ng),atom:Oe(Ng),unit:Oe(Ng),modifier:Oe(Ng),operatorKeyword:Oe(Ng),controlKeyword:Oe(Ng),definitionKeyword:Oe(Ng),moduleKeyword:Oe(Ng),operator:_g,derefOperator:Oe(_g),arithmeticOperator:Oe(_g),logicOperator:Oe(_g),bitwiseOperator:Oe(_g),compareOperator:Oe(_g),updateOperator:Oe(_g),definitionOperator:Oe(_g),typeOperator:Oe(_g),controlOperator:Oe(_g),punctuation:yF,separator:Oe(yF),bracket:E3,angleBracket:Oe(E3),squareBracket:Oe(E3),paren:Oe(E3),brace:Oe(E3),content:Gg,heading:RC,heading1:Oe(RC),heading2:Oe(RC),heading3:Oe(RC),heading4:Oe(RC),heading5:Oe(RC),heading6:Oe(RC),contentSeparator:Oe(Gg),list:Oe(Gg),quote:Oe(Gg),emphasis:Oe(Gg),strong:Oe(Gg),link:Oe(Gg),monospace:Oe(Gg),strikethrough:Oe(Gg),inserted:Oe(),deleted:Oe(),changed:Oe(),invalid:Oe(),meta:eD,documentMeta:Oe(eD),annotation:Oe(eD),processingInstruction:Oe(eD),definition:vl.defineModifier("definition"),constant:vl.defineModifier("constant"),function:vl.defineModifier("function"),standard:vl.defineModifier("standard"),local:vl.defineModifier("local"),special:vl.defineModifier("special")};for(let t in Se){let e=Se[t];e instanceof vl&&(e.name=t)}var Ype=vF([{tag:Se.link,class:"tok-link"},{tag:Se.heading,class:"tok-heading"},{tag:Se.emphasis,class:"tok-emphasis"},{tag:Se.strong,class:"tok-strong"},{tag:Se.keyword,class:"tok-keyword"},{tag:Se.atom,class:"tok-atom"},{tag:Se.bool,class:"tok-bool"},{tag:Se.url,class:"tok-url"},{tag:Se.labelName,class:"tok-labelName"},{tag:Se.inserted,class:"tok-inserted"},{tag:Se.deleted,class:"tok-deleted"},{tag:Se.literal,class:"tok-literal"},{tag:Se.string,class:"tok-string"},{tag:Se.number,class:"tok-number"},{tag:[Se.regexp,Se.escape,Se.special(Se.string)],class:"tok-string2"},{tag:Se.variableName,class:"tok-variableName"},{tag:Se.local(Se.variableName),class:"tok-variableName tok-local"},{tag:Se.definition(Se.variableName),class:"tok-variableName tok-definition"},{tag:Se.special(Se.variableName),class:"tok-variableName2"},{tag:Se.definition(Se.propertyName),class:"tok-propertyName tok-definition"},{tag:Se.typeName,class:"tok-typeName"},{tag:Se.namespace,class:"tok-namespace"},{tag:Se.className,class:"tok-className"},{tag:Se.macroName,class:"tok-macroName"},{tag:Se.propertyName,class:"tok-propertyName"},{tag:Se.operator,class:"tok-operator"},{tag:Se.comment,class:"tok-comment"},{tag:Se.meta,class:"tok-meta"},{tag:Se.invalid,class:"tok-invalid"},{tag:Se.punctuation,class:"tok-punctuation"}]);var bF,JE=new fi;function YLA(t){return qe.define({combine:t?e=>e.concat(t):void 0})}var JLA=new fi,Ug=(()=>{class t{constructor(A,i,n=[],o=""){this.data=A,this.name=o,hr.prototype.hasOwnProperty("tree")||Object.defineProperty(hr.prototype,"tree",{get(){return $r(this)}}),this.parser=i,this.extension=[k1.of(this),hr.languageData.of((r,s,a)=>{let c=piA(r,s,a),l=c.type.prop(JE);if(!l)return[];let I=r.facet(l),C=c.type.prop(JLA);if(C){let d=c.resolve(s-c.from,a);for(let B of C)if(B.test(d,r)){let E=r.facet(B.facet);return B.type=="replace"?E:E.concat(I)}}return I})].concat(n)}isActiveAt(A,i,n=-1){return piA(A,i,n).type.prop(JE)==this.data}findRegions(A){let i=A.facet(k1);if(i?.data==this.data)return[{from:0,to:A.doc.length}];if(!i||!i.allowsNesting)return[];let n=[],o=(r,s)=>{if(r.prop(JE)==this.data){n.push({from:s,to:s+r.length});return}let a=r.prop(fi.mounted);if(a){if(a.tree.prop(JE)==this.data){if(a.overlay)for(let c of a.overlay)n.push({from:c.from+s,to:c.to+s});else n.push({from:s,to:s+r.length});return}else if(a.overlay){let c=n.length;if(o(a.tree,a.overlay[0].from+s),n.length>c)return}}for(let c=0;ci.isTop?A:void 0)]}),e.name)}configure(e,A){return new t(this.data,this.parser.configure(e),A||this.name)}get allowsNesting(){return this.parser.hasWrappers()}};function $r(t){let e=t.field(Ug.state,!1);return e?e.tree:ur.empty}var RF=class{constructor(e){this.doc=e,this.cursorPos=0,this.string="",this.cursor=e.iter()}get length(){return this.doc.length}syncTo(e){return this.string=this.cursor.next(e-this.cursorPos).value,this.cursorPos=e+this.string.length,this.cursorPos-this.string.length}chunk(e){return this.syncTo(e),this.string}get lineChunks(){return!0}read(e,A){let i=this.cursorPos-this.string.length;return e=this.cursorPos?this.doc.sliceString(e,A):this.string.slice(e-i,A-i)}},Q3=null,xF=class t{constructor(e,A,i=[],n,o,r,s,a){this.parser=e,this.state=A,this.fragments=i,this.tree=n,this.treeLen=o,this.viewport=r,this.skipped=s,this.scheduleOn=a,this.parse=null,this.tempSkipped=[]}static create(e,A,i){return new t(e,A,[],ur.empty,0,i,[],null)}startParse(){return this.parser.startParse(new RF(this.state.doc),this.fragments)}work(e,A){return A!=null&&A>=this.state.doc.length&&(A=void 0),this.tree!=ur.empty&&this.isDone(A??this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var i;if(typeof e=="number"){let n=Date.now()+e;e=()=>Date.now()>n}for(this.parse||(this.parse=this.startParse()),A!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>A)&&A=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&this.parse.stopAt(e),this.withContext(()=>{for(;!(A=this.parse.advance()););}),this.treeLen=e,this.tree=A,this.fragments=this.withoutTempSkipped(SC.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(e){let A=Q3;Q3=this;try{return e()}finally{Q3=A}}withoutTempSkipped(e){for(let A;A=this.tempSkipped.pop();)e=wiA(e,A.from,A.to);return e}changes(e,A){let{fragments:i,tree:n,treeLen:o,viewport:r,skipped:s}=this;if(this.takeTree(),!e.empty){let a=[];if(e.iterChangedRanges((c,l,I,C)=>a.push({fromA:c,toA:l,fromB:I,toB:C})),i=SC.applyChanges(i,a),n=ur.empty,o=0,r={from:e.mapPos(r.from,-1),to:e.mapPos(r.to,1)},this.skipped.length){s=[];for(let c of this.skipped){let l=e.mapPos(c.from,1),I=e.mapPos(c.to,-1);le.from&&(this.fragments=wiA(this.fragments,n,o),this.skipped.splice(i--,1))}return this.skipped.length>=A?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(e,A){this.skipped.push({from:e,to:A})}static getSkippingParser(e){return new class extends KE{createParse(A,i,n){let o=n[0].from,r=n[n.length-1].to;return{parsedPos:o,advance(){let a=Q3;if(a){for(let c of n)a.tempSkipped.push(c);e&&(a.scheduleOn=a.scheduleOn?Promise.all([a.scheduleOn,e]):e)}return this.parsedPos=r,new ur(Fs.none,[],[],r-o)},stoppedAt:null,stopAt(){}}}}}isDone(e){e=Math.min(e,this.state.doc.length);let A=this.fragments;return this.treeLen>=e&&A.length&&A[0].from==0&&A[0].to>=e}static get(){return Q3}};function wiA(t,e,A){return SC.applyChanges(t,[{fromA:e,toA:A,fromB:e,toB:A}])}var u3=class t{constructor(e){this.context=e,this.tree=e.tree}apply(e){if(!e.docChanged&&this.tree==this.context.tree)return this;let A=this.context.changes(e.changes,e.state),i=this.context.treeLen==e.startState.doc.length?void 0:Math.max(e.changes.mapPos(this.context.treeLen),A.viewport.to);return A.work(20,i)||A.takeTree(),new t(A)}static init(e){let A=Math.min(3e3,e.doc.length),i=xF.create(e.facet(k1).parser,e,{from:0,to:A});return i.work(20,A)||i.takeTree(),new t(i)}};Ug.state=Ar.define({create:u3.init,update(t,e){for(let A of e.effects)if(A.is(Ug.setState))return A.value;return e.startState.facet(k1)!=e.state.facet(k1)?u3.init(e.state):t.apply(e)}});var kiA=t=>{let e=setTimeout(()=>t(),500);return()=>clearTimeout(e)};typeof requestIdleCallback<"u"&&(kiA=t=>{let e=-1,A=setTimeout(()=>{e=requestIdleCallback(t,{timeout:400})},100);return()=>e<0?clearTimeout(A):cancelIdleCallback(e)});var MF=typeof navigator<"u"&&(!((bF=navigator.scheduling)===null||bF===void 0)&&bF.isInputPending)?()=>navigator.scheduling.isInputPending():null,TLA=go.fromClass(class{constructor(e){this.view=e,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(e){let A=this.view.state.field(Ug.state).context;(A.updateViewport(e.view.viewport)||this.view.viewport.to>A.treeLen)&&this.scheduleWork(),(e.docChanged||e.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(A)}scheduleWork(){if(this.working)return;let{state:e}=this.view,A=e.field(Ug.state);(A.tree!=A.context.tree||!A.context.isDone(e.doc.length))&&(this.working=kiA(this.work))}work(e){this.working=null;let A=Date.now();if(this.chunkEndn+1e3,a=o.context.work(()=>MF&&MF()||Date.now()>r,n+(s?0:1e5));this.chunkBudget-=Date.now()-A,(a||this.chunkBudget<=0)&&(o.context.takeTree(),this.view.dispatch({effects:Ug.setState.of(new u3(o.context))})),this.chunkBudget>0&&!(a&&!s)&&this.scheduleWork(),this.checkAsyncSchedule(o.context)}checkAsyncSchedule(e){e.scheduleOn&&(this.workScheduled++,e.scheduleOn.then(()=>this.scheduleWork()).catch(A=>Xr(this.view.state,A)).then(()=>this.workScheduled--),e.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),k1=qe.define({combine(t){return t.length?t[0]:null},enables:t=>[Ug.state,TLA,qt.contentAttributes.compute([t],e=>{let A=e.facet(t);return A&&A.name?{"data-language":A.name}:{}})]}),oD=class{constructor(e,A=[]){this.language=e,this.support=A,this.extension=[e,A]}};var HLA=qe.define(),FC=qe.define({combine:t=>{if(!t.length)return" ";let e=t[0];if(!e||/\S/.test(e)||Array.from(e).some(A=>A!=e[0]))throw new Error("Invalid indent unit: "+JSON.stringify(t[0]));return e}});function Ml(t){let e=t.facet(FC);return e.charCodeAt(0)==9?t.tabSize*e.length:e.length}function HE(t,e){let A="",i=t.tabSize,n=t.facet(FC)[0];if(n==" "){for(;e>=i;)A+=" ",e-=i;n=" "}for(let o=0;o=e?zLA(t,A,e):null}var xC=class{constructor(e,A={}){this.state=e,this.options=A,this.unit=Ml(e)}lineAt(e,A=1){let i=this.state.doc.lineAt(e),{simulateBreak:n,simulateDoubleBreak:o}=this.options;return n!=null&&n>=i.from&&n<=i.to?o&&n==e?{text:"",from:e}:(A<0?n-1&&(o+=r-this.countColumn(i,i.search(/\S|$/))),o}countColumn(e,A=e.length){return J0(e,this.state.tabSize,A)}lineIndent(e,A=1){let{text:i,from:n}=this.lineAt(e,A),o=this.options.overrideIndentation;if(o){let r=o(n);if(r>-1)return r}return this.countColumn(i,i.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}},KF=new fi;function zLA(t,e,A){let i=e.resolveStack(A),n=e.resolveInner(A,-1).resolve(A,0).enterUnfinishedNodesBefore(A);if(n!=i.node){let o=[];for(let r=n;r&&!(r.fromi.node.to||r.from==i.node.from&&r.type==i.node.type);r=r.parent)o.push(r);for(let r=o.length-1;r>=0;r--)i={node:o[r],next:i}}return SiA(i,t,A)}function SiA(t,e,A){for(let i=t;i;i=i.next){let n=PLA(i.node);if(n)return n(LF.create(e,A,i))}return 0}function OLA(t){return t.pos==t.options.simulateBreak&&t.options.simulateDoubleBreak}function PLA(t){let e=t.type.prop(KF);if(e)return e;let A=t.firstChild,i;if(A&&(i=A.type.prop(fi.closedBy))){let n=t.lastChild,o=n&&i.indexOf(n.name)>-1;return r=>ZLA(r,!0,1,void 0,o&&!OLA(r)?n.from:void 0)}return t.parent==null?jLA:null}function jLA(){return 0}var LF=class t extends xC{constructor(e,A,i){super(e.state,e.options),this.base=e,this.pos=A,this.context=i}get node(){return this.context.node}static create(e,A,i){return new t(e,A,i)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(e){let A=this.state.doc.lineAt(e.from);for(;;){let i=e.resolve(A.from);for(;i.parent&&i.parent.from==i.from;)i=i.parent;if(qLA(i,e))break;A=this.state.doc.lineAt(i.from)}return this.lineIndent(A.from)}continue(){return SiA(this.context.next,this.base,this.pos)}};function qLA(t,e){for(let A=e;A;A=A.parent)if(t==A)return!0;return!1}function VLA(t){let e=t.node,A=e.childAfter(e.from),i=e.lastChild;if(!A)return null;let n=t.options.simulateBreak,o=t.state.doc.lineAt(A.from),r=n==null||n<=o.from?o.to:Math.min(o.to,n);for(let s=A.to;;){let a=e.childAfter(s);if(!a||a==i)return null;if(!a.type.isSkipped){if(a.from>=r)return null;let c=/^ */.exec(o.text.slice(A.to-o.from))[0].length;return{from:A.from,to:A.to+c}}s=a.to}}function ZLA(t,e,A,i,n){let o=t.textAfter,r=o.match(/^\s*/)[0].length,s=i&&o.slice(r,r+i.length)==i||n==t.pos+r,a=e?VLA(t):null;return a?s?t.column(a.from):t.column(a.to):t.baseIndent+(s?0:t.unit*A)}function YF({except:t,units:e=1}={}){return A=>{let i=t&&t.test(A.textAfter);return A.baseIndent+(i?0:e*A.unit)}}var WLA=200;function RiA(){return hr.transactionFilter.of(t=>{if(!t.docChanged||!t.isUserEvent("input.type")&&!t.isUserEvent("input.complete"))return t;let e=t.startState.languageDataAt("indentOnInput",t.startState.selection.main.head);if(!e.length)return t;let A=t.newDoc,{head:i}=t.newSelection.main,n=A.lineAt(i);if(i>n.from+WLA)return t;let o=A.sliceString(n.from,i);if(!e.some(c=>c.test(o)))return t;let{state:r}=t,s=-1,a=[];for(let{head:c}of r.selection.ranges){let l=r.doc.lineAt(c);if(l.from==s)continue;s=l.from;let I=aD(r,l.from);if(I==null)continue;let C=/^\s*/.exec(l.text)[0],d=HE(r,I);C!=d&&a.push({from:l.from,to:l.from+C.length,insert:d})}return a.length?[t,{changes:a,sequential:!0}]:t})}var XLA=qe.define(),JF=new fi;function xiA(t){let e=t.firstChild,A=t.lastChild;return e&&e.toA)continue;if(o&&s.from=e&&c.to>A&&(o=c)}}return o}function AFA(t){let e=t.lastChild;return e&&e.to==t.to&&e.type.isError}function rD(t,e,A){for(let i of t.facet(XLA)){let n=i(t,e,A);if(n)return n}return $LA(t,e,A)}function LiA(t,e){let A=e.mapPos(t.from,1),i=e.mapPos(t.to,-1);return A>=i?void 0:{from:A,to:i}}var cD=Pi.define({map:LiA}),f3=Pi.define({map:LiA});function FiA(t){let e=[];for(let{head:A}of t.state.selection.ranges)e.some(i=>i.from<=A&&i.to>=A)||e.push(t.lineBlockAt(A));return e}var LC=Ar.define({create(){return ut.none},update(t,e){e.isUserEvent("delete")&&e.changes.iterChangedRanges((A,i)=>t=DiA(t,A,i)),t=t.map(e.changes);for(let A of e.effects)if(A.is(cD)&&!eFA(t,A.value.from,A.value.to)){let{preparePlaceholder:i}=e.state.facet(TF),n=i?ut.replace({widget:new FF(i(e.state,A.value))}):yiA;t=t.update({add:[n.range(A.value.from,A.value.to)]})}else A.is(f3)&&(t=t.update({filter:(i,n)=>A.value.from!=i||A.value.to!=n,filterFrom:A.value.from,filterTo:A.value.to}));return e.selection&&(t=DiA(t,e.selection.main.head)),t},provide:t=>qt.decorations.from(t),toJSON(t,e){let A=[];return t.between(0,e.doc.length,(i,n)=>{A.push(i,n)}),A},fromJSON(t){if(!Array.isArray(t)||t.length%2)throw new RangeError("Invalid JSON for fold state");let e=[];for(let A=0;A{ne&&(i=!0)}),i?t.update({filterFrom:e,filterTo:A,filter:(n,o)=>n>=A||o<=e}):t}function sD(t,e,A){var i;let n=null;return(i=t.field(LC,!1))===null||i===void 0||i.between(e,A,(o,r)=>{(!n||n.from>o)&&(n={from:o,to:r})}),n}function eFA(t,e,A){let i=!1;return t.between(e,e,(n,o)=>{n==e&&o==A&&(i=!0)}),i}function NiA(t,e){return t.field(LC,!1)?e:e.concat(Pi.appendConfig.of(UiA()))}var tFA=t=>{for(let e of FiA(t)){let A=rD(t.state,e.from,e.to);if(A)return t.dispatch({effects:NiA(t.state,[cD.of(A),_iA(t,A)])}),!0}return!1},iFA=t=>{if(!t.state.field(LC,!1))return!1;let e=[];for(let A of FiA(t)){let i=sD(t.state,A.from,A.to);i&&e.push(f3.of(i),_iA(t,i,!1))}return e.length&&t.dispatch({effects:e}),e.length>0};function _iA(t,e,A=!0){let i=t.state.doc.lineAt(e.from).number,n=t.state.doc.lineAt(e.to).number;return qt.announce.of(`${t.state.phrase(A?"Folded lines":"Unfolded lines")} ${i} ${t.state.phrase("to")} ${n}.`)}var nFA=t=>{let{state:e}=t,A=[];for(let i=0;i{let e=t.state.field(LC,!1);if(!e||!e.size)return!1;let A=[];return e.between(0,t.state.doc.length,(i,n)=>{A.push(f3.of({from:i,to:n}))}),t.dispatch({effects:A}),!0};var GiA=[{key:"Ctrl-Shift-[",mac:"Cmd-Alt-[",run:tFA},{key:"Ctrl-Shift-]",mac:"Cmd-Alt-]",run:iFA},{key:"Ctrl-Alt-[",run:nFA},{key:"Ctrl-Alt-]",run:oFA}],rFA={placeholderDOM:null,preparePlaceholder:null,placeholderText:"\u2026"},TF=qe.define({combine(t){return Wr(t,rFA)}});function UiA(t){let e=[LC,aFA];return t&&e.push(TF.of(t)),e}function KiA(t,e){let{state:A}=t,i=A.facet(TF),n=r=>{let s=t.lineBlockAt(t.posAtDOM(r.target)),a=sD(t.state,s.from,s.to);a&&t.dispatch({effects:f3.of(a)}),r.preventDefault()};if(i.placeholderDOM)return i.placeholderDOM(t,n,e);let o=document.createElement("span");return o.textContent=i.placeholderText,o.setAttribute("aria-label",A.phrase("folded code")),o.title=A.phrase("unfold"),o.className="cm-foldPlaceholder",o.onclick=n,o}var yiA=ut.replace({widget:new class extends Ic{toDOM(t){return KiA(t,null)}}}),FF=class extends Ic{constructor(e){super(),this.value=e}eq(e){return this.value==e.value}toDOM(e){return KiA(e,this.value)}},sFA={openText:"\u2304",closedText:"\u203A",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1},h3=class extends Fa{constructor(e,A){super(),this.config=e,this.open=A}eq(e){return this.config==e.config&&this.open==e.open}toDOM(e){if(this.config.markerDOM)return this.config.markerDOM(this.open);let A=document.createElement("span");return A.textContent=this.open?this.config.openText:this.config.closedText,A.title=e.state.phrase(this.open?"Fold line":"Unfold line"),A}};function YiA(t={}){let e=rA(rA({},sFA),t),A=new h3(e,!0),i=new h3(e,!1),n=go.fromClass(class{constructor(r){this.from=r.viewport.from,this.markers=this.buildMarkers(r)}update(r){(r.docChanged||r.viewportChanged||r.startState.facet(k1)!=r.state.facet(k1)||r.startState.field(LC,!1)!=r.state.field(LC,!1)||$r(r.startState)!=$r(r.state)||e.foldingChanged(r))&&(this.markers=this.buildMarkers(r.view))}buildMarkers(r){let s=new ds;for(let a of r.viewportLineBlocks){let c=sD(r.state,a.from,a.to)?i:rD(r.state,a.from,a.to)?A:null;c&&s.add(a.from,a.from,c)}return s.finish()}}),{domEventHandlers:o}=e;return[n,Vw({class:"cm-foldGutter",markers(r){var s;return((s=r.plugin(n))===null||s===void 0?void 0:s.markers)||co.empty},initialSpacer(){return new h3(e,!1)},domEventHandlers:Ye(rA({},o),{click:(r,s,a)=>{if(o.click&&o.click(r,s,a))return!0;let c=sD(r.state,s.from,s.to);if(c)return r.dispatch({effects:f3.of(c)}),!0;let l=rD(r.state,s.from,s.to);return l?(r.dispatch({effects:cD.of(l)}),!0):!1}})}),UiA()]}var aFA=qt.baseTheme({".cm-foldPlaceholder":{backgroundColor:"#eee",border:"1px solid #ddd",color:"#888",borderRadius:".2em",margin:"0 1px",padding:"0 1px",cursor:"pointer"},".cm-foldGutter span":{padding:"0 1px",cursor:"pointer"}}),TE=class t{constructor(e,A){this.specs=e;let i;function n(s){let a=Kc.newName();return(i||(i=Object.create(null)))["."+a]=s,a}let o=typeof A.all=="string"?A.all:A.all?n(A.all):void 0,r=A.scope;this.scope=r instanceof Ug?s=>s.prop(JE)==r.data:r?s=>s==r:void 0,this.style=vF(e.map(s=>({tag:s.tag,class:s.class||n(Object.assign({},s,{tag:null}))})),{all:o}).style,this.module=i?new Kc(i):null,this.themeType=A.themeType}static define(e,A){return new t(e,A||{})}},NF=qe.define(),JiA=qe.define({combine(t){return t.length?[t[0]]:null}});function kF(t){let e=t.facet(NF);return e.length?e:t.facet(JiA)}function HF(t,e){let A=[cFA],i;return t instanceof TE&&(t.module&&A.push(qt.styleModule.of(t.module)),i=t.themeType),e?.fallback?A.push(JiA.of(t)):i?A.push(NF.computeN([qt.darkTheme],n=>n.facet(qt.darkTheme)==(i=="dark")?[t]:[])):A.push(NF.of(t)),A}var _F=class{constructor(e){this.markCache=Object.create(null),this.tree=$r(e.state),this.decorations=this.buildDeco(e,kF(e.state)),this.decoratedTo=e.viewport.to}update(e){let A=$r(e.state),i=kF(e.state),n=i!=kF(e.startState),{viewport:o}=e.view,r=e.changes.mapPos(this.decoratedTo,1);A.length=o.to?(this.decorations=this.decorations.map(e.changes),this.decoratedTo=r):(A!=this.tree||e.viewportChanged||n)&&(this.tree=A,this.decorations=this.buildDeco(e.view,i),this.decoratedTo=o.to)}buildDeco(e,A){if(!A||!this.tree.length)return ut.none;let i=new ds;for(let{from:n,to:o}of e.visibleRanges)miA(this.tree,A,(r,s,a)=>{i.add(r,s,this.markCache[a]||(this.markCache[a]=ut.mark({class:a})))},n,o);return i.finish()}},cFA=Dl.high(go.fromClass(_F,{decorations:t=>t.decorations})),TiA=TE.define([{tag:Se.meta,color:"#404740"},{tag:Se.link,textDecoration:"underline"},{tag:Se.heading,textDecoration:"underline",fontWeight:"bold"},{tag:Se.emphasis,fontStyle:"italic"},{tag:Se.strong,fontWeight:"bold"},{tag:Se.strikethrough,textDecoration:"line-through"},{tag:Se.keyword,color:"#708"},{tag:[Se.atom,Se.bool,Se.url,Se.contentSeparator,Se.labelName],color:"#219"},{tag:[Se.literal,Se.inserted],color:"#164"},{tag:[Se.string,Se.deleted],color:"#a11"},{tag:[Se.regexp,Se.escape,Se.special(Se.string)],color:"#e40"},{tag:Se.definition(Se.variableName),color:"#00f"},{tag:Se.local(Se.variableName),color:"#30a"},{tag:[Se.typeName,Se.namespace],color:"#085"},{tag:Se.className,color:"#167"},{tag:[Se.special(Se.variableName),Se.macroName],color:"#256"},{tag:Se.definition(Se.propertyName),color:"#00c"},{tag:Se.comment,color:"#940"},{tag:Se.invalid,color:"#f00"}]),lFA=qt.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),HiA=1e4,ziA="()[]{}",OiA=qe.define({combine(t){return Wr(t,{afterCursor:!0,brackets:ziA,maxScanDistance:HiA,renderMatch:CFA})}}),gFA=ut.mark({class:"cm-matchingBracket"}),IFA=ut.mark({class:"cm-nonmatchingBracket"});function CFA(t){let e=[],A=t.matched?gFA:IFA;return e.push(A.range(t.start.from,t.start.to)),t.end&&e.push(A.range(t.end.from,t.end.to)),e}var dFA=Ar.define({create(){return ut.none},update(t,e){if(!e.docChanged&&!e.selection)return t;let A=[],i=e.state.facet(OiA);for(let n of e.state.selection.ranges){if(!n.empty)continue;let o=bl(e.state,n.head,-1,i)||n.head>0&&bl(e.state,n.head-1,1,i)||i.afterCursor&&(bl(e.state,n.head,1,i)||n.headqt.decorations.from(t)}),BFA=[dFA,lFA];function PiA(t={}){return[OiA.of(t),BFA]}var EFA=new fi;function GF(t,e,A){let i=t.prop(e<0?fi.openedBy:fi.closedBy);if(i)return i;if(t.name.length==1){let n=A.indexOf(t.name);if(n>-1&&n%2==(e<0?1:0))return[A[n+e]]}return null}function UF(t){let e=t.type.prop(EFA);return e?e(t.node):t}function bl(t,e,A,i={}){let n=i.maxScanDistance||HiA,o=i.brackets||ziA,r=$r(t),s=r.resolveInner(e,A);for(let a=s;a;a=a.parent){let c=GF(a.type,A,o);if(c&&a.from0?e>=l.from&&el.from&&e<=l.to))return QFA(t,e,A,a,l,c,o)}}return hFA(t,e,A,r,s.type,n,o)}function QFA(t,e,A,i,n,o,r){let s=i.parent,a={from:n.from,to:n.to},c=0,l=s?.cursor();if(l&&(A<0?l.childBefore(i.from):l.childAfter(i.to)))do if(A<0?l.to<=i.from:l.from>=i.to){if(c==0&&o.indexOf(l.type.name)>-1&&l.from0)return null;let c={from:A<0?e-1:e,to:A>0?e+1:e},l=t.doc.iterRange(e,A>0?t.doc.length:0),I=0;for(let C=0;!l.next().done&&C<=o;){let d=l.value;A<0&&(C+=d.length);let B=e+C*A;for(let E=A>0?0:d.length-1,h=A>0?d.length:-1;E!=h;E+=A){let u=r.indexOf(d[E]);if(!(u<0||i.resolveInner(B+E,1).type!=n))if(u%2==0==A>0)I++;else{if(I==1)return{start:c,end:{from:B+E,to:B+E+1},matched:u>>1==a>>1};I--}}A>0&&(C+=d.length)}return l.done?{start:c,matched:!1}:null}var uFA=Object.create(null),viA=[Fs.none];var biA=[],MiA=Object.create(null),fFA=Object.create(null);for(let[t,e]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])fFA[t]=mFA(uFA,e);function SF(t,e){biA.indexOf(t)>-1||(biA.push(t),console.warn(e))}function mFA(t,e){let A=[];for(let s of e.split(" ")){let a=[];for(let c of s.split(".")){let l=t[c]||Se[c];l?typeof l=="function"?a.length?a=a.map(l):SF(c,`Modifier ${c} used at start of tag`):a.length?SF(c,`Tag ${c} used as modifier`):a=Array.isArray(l)?l:[l]:SF(c,`Unknown highlighting tag ${c}`)}for(let c of a)A.push(c)}if(!A.length)return 0;let i=e.replace(/ /g,"_"),n=i+" "+A.map(s=>s.id),o=MiA[n];if(o)return o.id;let r=MiA[n]=Fs.define({id:viA.length,name:i,props:[iD({[i]:A})]});return viA.push(r),r.id}var qpe={rtl:ut.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"rtl"},bidiIsolate:lo.RTL}),ltr:ut.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"ltr"},bidiIsolate:lo.LTR}),auto:ut.mark({class:"cm-iso",inclusive:!0,attributes:{dir:"auto"},bidiIsolate:null})};var pFA=t=>{let{state:e}=t,A=e.doc.lineAt(e.selection.main.from),i=jF(t.state,A.from);return i.line?wFA(t):i.block?yFA(t):!1};function PF(t,e){return({state:A,dispatch:i})=>{if(A.readOnly)return!1;let n=t(e,A);return n?(i(A.update(n)),!0):!1}}var wFA=PF(MFA,0);var DFA=PF(enA,0);var yFA=PF((t,e)=>enA(t,e,bFA(e)),0);function jF(t,e){let A=t.languageDataAt("commentTokens",e,1);return A.length?A[0]:{}}var m3=50;function vFA(t,{open:e,close:A},i,n){let o=t.sliceDoc(i-m3,i),r=t.sliceDoc(n,n+m3),s=/\s*$/.exec(o)[0].length,a=/^\s*/.exec(r)[0].length,c=o.length-s;if(o.slice(c-e.length,c)==e&&r.slice(a,a+A.length)==A)return{open:{pos:i-s,margin:s&&1},close:{pos:n+a,margin:a&&1}};let l,I;n-i<=2*m3?l=I=t.sliceDoc(i,n):(l=t.sliceDoc(i,i+m3),I=t.sliceDoc(n-m3,n));let C=/^\s*/.exec(l)[0].length,d=/\s*$/.exec(I)[0].length,B=I.length-d-A.length;return l.slice(C,C+e.length)==e&&I.slice(B,B+A.length)==A?{open:{pos:i+C+e.length,margin:/\s/.test(l.charAt(C+e.length))?1:0},close:{pos:n-d-A.length,margin:/\s/.test(I.charAt(B-1))?1:0}}:null}function bFA(t){let e=[];for(let A of t.selection.ranges){let i=t.doc.lineAt(A.from),n=A.to<=i.to?i:t.doc.lineAt(A.to);n.from>i.from&&n.from==A.to&&(n=A.to==i.to+1?i:t.doc.lineAt(A.to-1));let o=e.length-1;o>=0&&e[o].to>i.from?e[o].to=n.to:e.push({from:i.from+/^\s*/.exec(i.text)[0].length,to:n.to})}return e}function enA(t,e,A=e.selection.ranges){let i=A.map(o=>jF(e,o.from).block);if(!i.every(o=>o))return null;let n=A.map((o,r)=>vFA(e,i[r],o.from,o.to));if(t!=2&&!n.every(o=>o))return{changes:e.changes(A.map((o,r)=>n[r]?[]:[{from:o.from,insert:i[r].open+" "},{from:o.to,insert:" "+i[r].close}]))};if(t!=1&&n.some(o=>o)){let o=[];for(let r=0,s;rn&&(o==r||r>I.from)){n=I.from;let C=/^\s*/.exec(I.text)[0].length,d=C==I.length,B=I.text.slice(C,C+c.length)==c?C:-1;Co.comment<0&&(!o.empty||o.single))){let o=[];for(let{line:s,token:a,indent:c,empty:l,single:I}of i)(I||!l)&&o.push({from:s.from+c,insert:a+" "});let r=e.changes(o);return{changes:r,selection:e.selection.map(r,1)}}else if(t!=1&&i.some(o=>o.comment>=0)){let o=[];for(let{line:r,comment:s,token:a}of i)if(s>=0){let c=r.from+s,l=c+a.length;r.text[l-r.from]==" "&&l++,o.push({from:c,to:l})}return{changes:o}}return null}function zE(t,e){return ae.create(t.ranges.map(e),t.mainIndex)}function Kg(t,e){return t.update({selection:e,scrollIntoView:!0,userEvent:"select"})}function kl({state:t,dispatch:e},A){let i=zE(t.selection,A);return i.eq(t.selection,!0)?!1:(e(Kg(t,i)),!0)}function gD(t,e){return ae.cursor(e?t.to:t.from)}function tnA(t,e){return kl(t,A=>A.empty?t.moveByChar(A,e):gD(A,e))}function Ns(t){return t.textDirectionAt(t.state.selection.main.head)==lo.LTR}var inA=t=>tnA(t,!Ns(t)),nnA=t=>tnA(t,Ns(t));function onA(t,e){return kl(t,A=>A.empty?t.moveByGroup(A,e):gD(A,e))}var kFA=t=>onA(t,!Ns(t)),SFA=t=>onA(t,Ns(t));var n6e=typeof Intl<"u"&&Intl.Segmenter?new Intl.Segmenter(void 0,{granularity:"word"}):null;function RFA(t,e,A){if(e.type.prop(A))return!0;let i=e.to-e.from;return i&&(i>2||/[^\s,.;:]/.test(t.sliceDoc(e.from,e.to)))||e.firstChild}function ID(t,e,A){let i=$r(t).resolveInner(e.head),n=A?fi.closedBy:fi.openedBy;for(let a=e.head;;){let c=A?i.childAfter(a):i.childBefore(a);if(!c)break;RFA(t,c,n)?i=c:a=A?c.to:c.from}let o=i.type.prop(n),r,s;return o&&(r=A?bl(t,i.from,1):bl(t,i.to,-1))&&r.matched?s=A?r.end.to:r.end.from:s=A?i.to:i.from,ae.cursor(s,A?-1:1)}var xFA=t=>kl(t,e=>ID(t.state,e,!Ns(t))),LFA=t=>kl(t,e=>ID(t.state,e,Ns(t)));function rnA(t,e){return kl(t,A=>{if(!A.empty)return gD(A,e);let i=t.moveVertically(A,e);return i.head!=A.head?i:t.moveToLineBoundary(A,e)})}var snA=t=>rnA(t,!1),anA=t=>rnA(t,!0);function cnA(t){let e=t.scrollDOM.clientHeightr.empty?t.moveVertically(r,e,A.height):gD(r,e));if(n.eq(i.selection))return!1;let o;if(A.selfScroll){let r=t.coordsAtPos(i.selection.main.head),s=t.scrollDOM.getBoundingClientRect(),a=s.top+A.marginTop,c=s.bottom-A.marginBottom;r&&r.top>a&&r.bottomlnA(t,!1),zF=t=>lnA(t,!0);function S1(t,e,A){let i=t.lineBlockAt(e.head),n=t.moveToLineBoundary(e,A);if(n.head==e.head&&n.head!=(A?i.to:i.from)&&(n=t.moveToLineBoundary(e,A,!1)),!A&&n.head==i.from&&i.length){let o=/^\s*/.exec(t.state.sliceDoc(i.from,Math.min(i.from+100,i.to)))[0].length;o&&e.head!=i.from+o&&(n=ae.cursor(i.from+o))}return n}var FFA=t=>kl(t,e=>S1(t,e,!0)),NFA=t=>kl(t,e=>S1(t,e,!1)),_FA=t=>kl(t,e=>S1(t,e,!Ns(t))),GFA=t=>kl(t,e=>S1(t,e,Ns(t))),UFA=t=>kl(t,e=>ae.cursor(t.lineBlockAt(e.head).from,1)),KFA=t=>kl(t,e=>ae.cursor(t.lineBlockAt(e.head).to,-1));function YFA(t,e,A){let i=!1,n=zE(t.selection,o=>{let r=bl(t,o.head,-1)||bl(t,o.head,1)||o.head>0&&bl(t,o.head-1,1)||o.headYFA(t,e,!1);function Tc(t,e){let A=zE(t.state.selection,i=>{let n=e(i);return ae.range(i.anchor,n.head,n.goalColumn,n.bidiLevel||void 0)});return A.eq(t.state.selection)?!1:(t.dispatch(Kg(t.state,A)),!0)}function gnA(t,e){return Tc(t,A=>t.moveByChar(A,e))}var InA=t=>gnA(t,!Ns(t)),CnA=t=>gnA(t,Ns(t));function dnA(t,e){return Tc(t,A=>t.moveByGroup(A,e))}var TFA=t=>dnA(t,!Ns(t)),HFA=t=>dnA(t,Ns(t));var zFA=t=>Tc(t,e=>ID(t.state,e,!Ns(t))),OFA=t=>Tc(t,e=>ID(t.state,e,Ns(t)));function BnA(t,e){return Tc(t,A=>t.moveVertically(A,e))}var EnA=t=>BnA(t,!1),QnA=t=>BnA(t,!0);function hnA(t,e){return Tc(t,A=>t.moveVertically(A,e,cnA(t).height))}var qiA=t=>hnA(t,!1),ViA=t=>hnA(t,!0),PFA=t=>Tc(t,e=>S1(t,e,!0)),jFA=t=>Tc(t,e=>S1(t,e,!1)),qFA=t=>Tc(t,e=>S1(t,e,!Ns(t))),VFA=t=>Tc(t,e=>S1(t,e,Ns(t))),ZFA=t=>Tc(t,e=>ae.cursor(t.lineBlockAt(e.head).from)),WFA=t=>Tc(t,e=>ae.cursor(t.lineBlockAt(e.head).to)),ZiA=({state:t,dispatch:e})=>(e(Kg(t,{anchor:0})),!0),WiA=({state:t,dispatch:e})=>(e(Kg(t,{anchor:t.doc.length})),!0),XiA=({state:t,dispatch:e})=>(e(Kg(t,{anchor:t.selection.main.anchor,head:0})),!0),$iA=({state:t,dispatch:e})=>(e(Kg(t,{anchor:t.selection.main.anchor,head:t.doc.length})),!0),XFA=({state:t,dispatch:e})=>(e(t.update({selection:{anchor:0,head:t.doc.length},userEvent:"select"})),!0),$FA=({state:t,dispatch:e})=>{let A=CD(t).map(({from:i,to:n})=>ae.range(i,Math.min(n+1,t.doc.length)));return e(t.update({selection:ae.create(A),userEvent:"select"})),!0},ANA=({state:t,dispatch:e})=>{let A=zE(t.selection,i=>{let n=$r(t),o=n.resolveStack(i.from,1);if(i.empty){let r=n.resolveStack(i.from,-1);r.node.from>=o.node.from&&r.node.to<=o.node.to&&(o=r)}for(let r=o;r;r=r.next){let{node:s}=r;if((s.from=i.to||s.to>i.to&&s.from<=i.from)&&r.next)return ae.range(s.to,s.from)}return i});return A.eq(t.selection)?!1:(e(Kg(t,A)),!0)},eNA=({state:t,dispatch:e})=>{let A=t.selection,i=null;return A.ranges.length>1?i=ae.create([A.main]):A.main.empty||(i=ae.create([ae.cursor(A.main.head)])),i?(e(Kg(t,i)),!0):!1};function p3(t,e){if(t.state.readOnly)return!1;let A="delete.selection",{state:i}=t,n=i.changeByRange(o=>{let{from:r,to:s}=o;if(r==s){let a=e(o);ar&&(A="delete.forward",a=lD(t,a,!0)),r=Math.min(r,a),s=Math.max(s,a)}else r=lD(t,r,!1),s=lD(t,s,!0);return r==s?{range:o}:{changes:{from:r,to:s},range:ae.cursor(r,rn(t)))i.between(e,e,(n,o)=>{ne&&(e=A?o:n)});return e}var unA=(t,e,A)=>p3(t,i=>{let n=i.from,{state:o}=t,r=o.doc.lineAt(n),s,a;if(A&&!e&&n>r.from&&nunA(t,!1,!0);var fnA=t=>unA(t,!0,!1),mnA=(t,e)=>p3(t,A=>{let i=A.head,{state:n}=t,o=n.doc.lineAt(i),r=n.charCategorizer(i);for(let s=null;;){if(i==(e?o.to:o.from)){i==A.head&&o.number!=(e?n.doc.lines:1)&&(i+=e?1:-1);break}let a=yr(o.text,i-o.from,e)+o.from,c=o.text.slice(Math.min(i,a)-o.from,Math.max(i,a)-o.from),l=r(c);if(s!=null&&l!=s)break;(c!=" "||i!=A.head)&&(s=l),i=a}return i}),pnA=t=>mnA(t,!1),tNA=t=>mnA(t,!0),iNA=t=>p3(t,e=>{let A=t.lineBlockAt(e.head).to;return e.headp3(t,e=>{let A=t.moveToLineBoundary(e,!1).head;return e.head>A?A:Math.max(0,e.head-1)}),oNA=t=>p3(t,e=>{let A=t.moveToLineBoundary(e,!0).head;return e.head{if(t.readOnly)return!1;let A=t.changeByRange(i=>({changes:{from:i.from,to:i.to,insert:In.of(["",""])},range:ae.cursor(i.from)}));return e(t.update(A,{scrollIntoView:!0,userEvent:"input"})),!0},sNA=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let A=t.changeByRange(i=>{if(!i.empty||i.from==0||i.from==t.doc.length)return{range:i};let n=i.from,o=t.doc.lineAt(n),r=n==o.from?n-1:yr(o.text,n-o.from,!1)+o.from,s=n==o.to?n+1:yr(o.text,n-o.from,!0)+o.from;return{changes:{from:r,to:s,insert:t.doc.slice(n,s).append(t.doc.slice(r,n))},range:ae.cursor(s)}});return A.changes.empty?!1:(e(t.update(A,{scrollIntoView:!0,userEvent:"move.character"})),!0)};function CD(t){let e=[],A=-1;for(let i of t.selection.ranges){let n=t.doc.lineAt(i.from),o=t.doc.lineAt(i.to);if(!i.empty&&i.to==o.from&&(o=t.doc.lineAt(i.to-1)),A>=n.number){let r=e[e.length-1];r.to=o.to,r.ranges.push(i)}else e.push({from:n.from,to:o.to,ranges:[i]});A=o.number+1}return e}function wnA(t,e,A){if(t.readOnly)return!1;let i=[],n=[];for(let o of CD(t)){if(A?o.to==t.doc.length:o.from==0)continue;let r=t.doc.lineAt(A?o.to+1:o.from-1),s=r.length+1;if(A){i.push({from:o.to,to:r.to},{from:o.from,insert:r.text+t.lineBreak});for(let a of o.ranges)n.push(ae.range(Math.min(t.doc.length,a.anchor+s),Math.min(t.doc.length,a.head+s)))}else{i.push({from:r.from,to:o.from},{from:o.to,insert:t.lineBreak+r.text});for(let a of o.ranges)n.push(ae.range(a.anchor-s,a.head-s))}}return i.length?(e(t.update({changes:i,scrollIntoView:!0,selection:ae.create(n,t.selection.mainIndex),userEvent:"move.line"})),!0):!1}var aNA=({state:t,dispatch:e})=>wnA(t,e,!1),cNA=({state:t,dispatch:e})=>wnA(t,e,!0);function DnA(t,e,A){if(t.readOnly)return!1;let i=[];for(let n of CD(t))A?i.push({from:n.from,insert:t.doc.slice(n.from,n.to)+t.lineBreak}):i.push({from:n.to,insert:t.lineBreak+t.doc.slice(n.from,n.to)});return e(t.update({changes:i,scrollIntoView:!0,userEvent:"input.copyline"})),!0}var lNA=({state:t,dispatch:e})=>DnA(t,e,!1),gNA=({state:t,dispatch:e})=>DnA(t,e,!0),INA=t=>{if(t.state.readOnly)return!1;let{state:e}=t,A=e.changes(CD(e).map(({from:n,to:o})=>(n>0?n--:o{let o;if(t.lineWrapping){let r=t.lineBlockAt(n.head),s=t.coordsAtPos(n.head,n.assoc||1);s&&(o=r.bottom+t.documentTop-s.bottom+t.defaultLineHeight/2)}return t.moveVertically(n,!0,o)}).map(A);return t.dispatch({changes:A,selection:i,scrollIntoView:!0,userEvent:"delete.line"}),!0};function CNA(t,e){if(/\(\)|\[\]|\{\}/.test(t.sliceDoc(e-1,e+1)))return{from:e,to:e};let A=$r(t).resolveInner(e),i=A.childBefore(e),n=A.childAfter(e),o;return i&&n&&i.to<=e&&n.from>=e&&(o=i.type.prop(fi.closedBy))&&o.indexOf(n.name)>-1&&t.doc.lineAt(i.to).from==t.doc.lineAt(n.from).from&&!/\S/.test(t.sliceDoc(i.to,n.from))?{from:i.to,to:n.from}:null}var AnA=ynA(!1),dNA=ynA(!0);function ynA(t){return({state:e,dispatch:A})=>{if(e.readOnly)return!1;let i=e.changeByRange(n=>{let{from:o,to:r}=n,s=e.doc.lineAt(o),a=!t&&o==r&&CNA(e,o);t&&(o=r=(r<=s.to?s:e.doc.lineAt(r)).to);let c=new xC(e,{simulateBreak:o,simulateDoubleBreak:!!a}),l=aD(c,o);for(l==null&&(l=J0(/^\s*/.exec(e.doc.lineAt(o).text)[0],e.tabSize));rs.from&&o{let n=[];for(let r=i.from;r<=i.to;){let s=t.doc.lineAt(r);s.number>A&&(i.empty||i.to>s.from)&&(e(s,n,i),A=s.number),r=s.to+1}let o=t.changes(n);return{changes:n,range:ae.range(o.mapPos(i.anchor,1),o.mapPos(i.head,1))}})}var BNA=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let A=Object.create(null),i=new xC(t,{overrideIndentation:o=>{let r=A[o];return r??-1}}),n=qF(t,(o,r,s)=>{let a=aD(i,o.from);if(a==null)return;/\S/.test(o.text)||(a=0);let c=/^\s*/.exec(o.text)[0],l=HE(t,a);(c!=l||s.fromt.readOnly?!1:(e(t.update(qF(t,(A,i)=>{i.push({from:A.from,insert:t.facet(FC)})}),{userEvent:"input.indent"})),!0),bnA=({state:t,dispatch:e})=>t.readOnly?!1:(e(t.update(qF(t,(A,i)=>{let n=/^\s*/.exec(A.text)[0];if(!n)return;let o=J0(n,t.tabSize),r=0,s=HE(t,Math.max(0,o-Ml(t)));for(;r(t.setTabFocusMode(),!0);var QNA=[{key:"Ctrl-b",run:inA,shift:InA,preventDefault:!0},{key:"Ctrl-f",run:nnA,shift:CnA},{key:"Ctrl-p",run:snA,shift:EnA},{key:"Ctrl-n",run:anA,shift:QnA},{key:"Ctrl-a",run:UFA,shift:ZFA},{key:"Ctrl-e",run:KFA,shift:WFA},{key:"Ctrl-d",run:fnA},{key:"Ctrl-h",run:OF},{key:"Ctrl-k",run:iNA},{key:"Ctrl-Alt-h",run:pnA},{key:"Ctrl-o",run:rNA},{key:"Ctrl-t",run:sNA},{key:"Ctrl-v",run:zF}],hNA=[{key:"ArrowLeft",run:inA,shift:InA,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:kFA,shift:TFA,preventDefault:!0},{mac:"Cmd-ArrowLeft",run:_FA,shift:qFA,preventDefault:!0},{key:"ArrowRight",run:nnA,shift:CnA,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:SFA,shift:HFA,preventDefault:!0},{mac:"Cmd-ArrowRight",run:GFA,shift:VFA,preventDefault:!0},{key:"ArrowUp",run:snA,shift:EnA,preventDefault:!0},{mac:"Cmd-ArrowUp",run:ZiA,shift:XiA},{mac:"Ctrl-ArrowUp",run:jiA,shift:qiA},{key:"ArrowDown",run:anA,shift:QnA,preventDefault:!0},{mac:"Cmd-ArrowDown",run:WiA,shift:$iA},{mac:"Ctrl-ArrowDown",run:zF,shift:ViA},{key:"PageUp",run:jiA,shift:qiA},{key:"PageDown",run:zF,shift:ViA},{key:"Home",run:NFA,shift:jFA,preventDefault:!0},{key:"Mod-Home",run:ZiA,shift:XiA},{key:"End",run:FFA,shift:PFA,preventDefault:!0},{key:"Mod-End",run:WiA,shift:$iA},{key:"Enter",run:AnA,shift:AnA},{key:"Mod-a",run:XFA},{key:"Backspace",run:OF,shift:OF},{key:"Delete",run:fnA},{key:"Mod-Backspace",mac:"Alt-Backspace",run:pnA},{key:"Mod-Delete",mac:"Alt-Delete",run:tNA},{mac:"Mod-Backspace",run:nNA},{mac:"Mod-Delete",run:oNA}].concat(QNA.map(t=>({mac:t.key,run:t.run,shift:t.shift}))),MnA=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:xFA,shift:zFA},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:LFA,shift:OFA},{key:"Alt-ArrowUp",run:aNA},{key:"Shift-Alt-ArrowUp",run:lNA},{key:"Alt-ArrowDown",run:cNA},{key:"Shift-Alt-ArrowDown",run:gNA},{key:"Escape",run:eNA},{key:"Mod-Enter",run:dNA},{key:"Alt-l",mac:"Ctrl-l",run:$FA},{key:"Mod-i",run:ANA,preventDefault:!0},{key:"Mod-[",run:bnA},{key:"Mod-]",run:vnA},{key:"Mod-Alt-\\",run:BNA},{key:"Shift-Mod-k",run:INA},{key:"Shift-Mod-\\",run:JFA},{key:"Mod-/",run:pFA},{key:"Alt-A",run:DFA},{key:"Ctrl-m",mac:"Shift-Alt-m",run:ENA}].concat(hNA),knA={key:"Tab",run:vnA,shift:bnA};var ED=class{constructor(e,A,i){this.from=e,this.to=A,this.diagnostic=i}},NC=class t{constructor(e,A,i){this.diagnostics=e,this.panel=A,this.selected=i}static init(e,A,i){let n=i.facet(Yg).markerFilter;n&&(e=n(e,i));let o=e.slice().sort((l,I)=>l.from-I.from||l.to-I.to),r=new ds,s=[],a=0;for(let l=0;;){let I=l==o.length?null:o[l];if(!I&&!s.length)break;let C,d;for(s.length?(C=a,d=s.reduce((E,h)=>Math.min(E,h.to),I&&I.from>C?I.from:1e8)):(C=I.from,d=I.to,s.push(I),l++);lE.from||E.to==C))s.push(E),l++,d=Math.min(E.to,d);else{d=Math.min(E.from,d);break}}let B=KnA(s);if(s.some(E=>E.from==E.to||E.from==E.to-1&&i.doc.lineAt(E.from).to==E.from))r.add(C,C,ut.widget({widget:new VF(B),diagnostics:s.slice()}));else{let E=s.reduce((h,u)=>u.markClass?h+" "+u.markClass:h,"");r.add(C,d,ut.mark({class:"cm-lintRange cm-lintRange-"+B+E,diagnostics:s.slice(),inclusiveEnd:s.some(h=>h.to>d)}))}a=d;for(let E=0;E{if(!(e&&r.diagnostics.indexOf(e)<0))if(!i)i=new ED(n,o,e||r.diagnostics[0]);else{if(r.diagnostics.indexOf(i.diagnostic)<0)return!1;i=new ED(i.from,o,i.diagnostic)}}),i}function RnA(t,e){let A=e.pos,i=e.end||A,n=t.state.facet(Yg).hideOn(t,A,i);if(n!=null)return n;let o=t.startState.doc.lineAt(e.pos);return!!(t.effects.some(r=>r.is(uD))||t.changes.touchesRange(o.from,Math.max(o.to,i)))}function xnA(t,e){return t.field(Cc,!1)?e:e.concat(Pi.appendConfig.of(JnA))}function uNA(t,e){return{effects:xnA(t,[uD.of(e)])}}var uD=Pi.define(),WF=Pi.define(),LnA=Pi.define(),Cc=Ar.define({create(){return new NC(ut.none,null,null)},update(t,e){if(e.docChanged&&t.diagnostics.size){let A=t.diagnostics.map(e.changes),i=null,n=t.panel;if(t.selected){let o=e.changes.mapPos(t.selected.from,1);i=OE(A,t.selected.diagnostic,o)||OE(A,null,o)}!A.size&&n&&e.state.facet(Yg).autoPanel&&(n=null),t=new NC(A,n,i)}for(let A of e.effects)if(A.is(uD)){let i=e.state.facet(Yg).autoPanel?A.value.length?w3.open:null:t.panel;t=NC.init(A.value,i,e.state)}else A.is(WF)?t=new NC(t.diagnostics,A.value?w3.open:null,t.selected):A.is(LnA)&&(t=new NC(t.diagnostics,t.panel,A.value));return t},provide:t=>[MC.from(t,e=>e.panel),qt.decorations.from(t,e=>e.diagnostics)]});var fNA=ut.mark({class:"cm-lintRange cm-lintRange-active"});function mNA(t,e,A){let{diagnostics:i}=t.state.field(Cc),n,o=-1,r=-1;i.between(e-(A<0?1:0),e+(A>0?1:0),(a,c,{spec:l})=>{if(e>=a&&e<=c&&(a==c||(e>a||A>0)&&(eUnA(t,A,!1)))}var pNA=t=>{let e=t.state.field(Cc,!1);(!e||!e.panel)&&t.dispatch({effects:xnA(t.state,[WF.of(!0)])});let A=kC(t,w3.open);return A&&A.dom.querySelector(".cm-panel-lint ul").focus(),!0},SnA=t=>{let e=t.state.field(Cc,!1);return!e||!e.panel?!1:(t.dispatch({effects:WF.of(!1)}),!0)},wNA=t=>{let e=t.state.field(Cc,!1);if(!e)return!1;let A=t.state.selection.main,i=e.diagnostics.iter(A.to+1);return!i.value&&(i=e.diagnostics.iter(0),!i.value||i.from==A.from&&i.to==A.to)?!1:(t.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0}),!0)};var NnA=[{key:"Mod-Shift-m",run:pNA,preventDefault:!0},{key:"F8",run:wNA}],DNA=go.fromClass(class{constructor(t){this.view=t,this.timeout=-1,this.set=!0;let{delay:e}=t.state.facet(Yg);this.lintTime=Date.now()+e,this.run=this.run.bind(this),this.timeout=setTimeout(this.run,e)}run(){clearTimeout(this.timeout);let t=Date.now();if(tPromise.resolve(i(this.view))),i=>{this.view.state.doc==e.doc&&this.view.dispatch(uNA(this.view.state,i.reduce((n,o)=>n.concat(o))))},i=>{Xr(this.view.state,i)})}}update(t){let e=t.state.facet(Yg);(t.docChanged||e!=t.startState.facet(Yg)||e.needsRefresh&&e.needsRefresh(t))&&(this.lintTime=Date.now()+e.delay,this.set||(this.set=!0,this.timeout=setTimeout(this.run,e.delay)))}force(){this.set&&(this.lintTime=Date.now(),this.run())}destroy(){clearTimeout(this.timeout)}});function yNA(t,e,A){let i=[],n=-1;for(let o of t)o.then(r=>{i.push(r),clearTimeout(n),i.length==t.length?e(i):n=setTimeout(()=>e(i),200)},A)}var Yg=qe.define({combine(t){return Object.assign({sources:t.map(e=>e.source).filter(e=>e!=null)},Wr(t.map(e=>e.config),{delay:750,markerFilter:null,tooltipFilter:null,needsRefresh:null,hideOn:()=>null},{needsRefresh:(e,A)=>e?A?i=>e(i)||A(i):e:A}))}});function _nA(t,e={}){return[Yg.of({source:t,config:e}),DNA,JnA]}function GnA(t){let e=[];if(t)A:for(let{name:A}of t){for(let i=0;io.toLowerCase()==n.toLowerCase())){e.push(n);continue A}}e.push("")}return e}function UnA(t,e,A){var i;let n=A?GnA(e.actions):[];return Un("li",{class:"cm-diagnostic cm-diagnostic-"+e.severity},Un("span",{class:"cm-diagnosticText"},e.renderMessage?e.renderMessage(t):e.message),(i=e.actions)===null||i===void 0?void 0:i.map((o,r)=>{let s=!1,a=C=>{if(C.preventDefault(),s)return;s=!0;let d=OE(t.state.field(Cc).diagnostics,e);d&&o.apply(t,d.from,d.to)},{name:c}=o,l=n[r]?c.indexOf(n[r]):-1,I=l<0?c:[c.slice(0,l),Un("u",c.slice(l,l+1)),c.slice(l+1)];return Un("button",{type:"button",class:"cm-diagnosticAction",onclick:a,onmousedown:a,"aria-label":` Action: ${c}${l<0?"":` (access key "${n[r]})"`}.`},I)}),e.source&&Un("div",{class:"cm-diagnosticSource"},e.source))}var VF=class extends Ic{constructor(e){super(),this.sev=e}eq(e){return e.sev==this.sev}toDOM(){return Un("span",{class:"cm-lintPoint cm-lintPoint-"+this.sev})}},QD=class{constructor(e,A){this.diagnostic=A,this.id="item_"+Math.floor(Math.random()*4294967295).toString(16),this.dom=UnA(e,A,!0),this.dom.id=this.id,this.dom.setAttribute("role","option")}},w3=class t{constructor(e){this.view=e,this.items=[];let A=n=>{if(n.keyCode==27)SnA(this.view),this.view.focus();else if(n.keyCode==38||n.keyCode==33)this.moveSelection((this.selectedIndex-1+this.items.length)%this.items.length);else if(n.keyCode==40||n.keyCode==34)this.moveSelection((this.selectedIndex+1)%this.items.length);else if(n.keyCode==36)this.moveSelection(0);else if(n.keyCode==35)this.moveSelection(this.items.length-1);else if(n.keyCode==13)this.view.focus();else if(n.keyCode>=65&&n.keyCode<=90&&this.selectedIndex>=0){let{diagnostic:o}=this.items[this.selectedIndex],r=GnA(o.actions);for(let s=0;s{for(let o=0;oSnA(this.view)},"\xD7")),this.update()}get selectedIndex(){let e=this.view.state.field(Cc).selected;if(!e)return-1;for(let A=0;A{for(let l of c.diagnostics){if(r.has(l))continue;r.add(l);let I=-1,C;for(let d=i;di&&(this.items.splice(i,I-i),n=!0)),A&&C.diagnostic==A.diagnostic?C.dom.hasAttribute("aria-selected")||(C.dom.setAttribute("aria-selected","true"),o=C):C.dom.hasAttribute("aria-selected")&&C.dom.removeAttribute("aria-selected"),i++}});i({sel:o.dom.getBoundingClientRect(),panel:this.list.getBoundingClientRect()}),write:({sel:s,panel:a})=>{let c=a.height/this.list.offsetHeight;s.topa.bottom&&(this.list.scrollTop+=(s.bottom-a.bottom)/c)}})):this.selectedIndex<0&&this.list.removeAttribute("aria-activedescendant"),n&&this.sync()}sync(){let e=this.list.firstChild;function A(){let i=e;e=i.nextSibling,i.remove()}for(let i of this.items)if(i.dom.parentNode==this.list){for(;e!=i.dom;)A();e=i.dom.nextSibling}else this.list.insertBefore(i.dom,e);for(;e;)A()}moveSelection(e){if(this.selectedIndex<0)return;let A=this.view.state.field(Cc),i=OE(A.diagnostics,this.items[e].diagnostic);i&&this.view.dispatch({selection:{anchor:i.from,head:i.to},scrollIntoView:!0,effects:LnA.of(i)})}static open(e){return new t(e)}};function BD(t,e='viewBox="0 0 40 40"'){return`url('data:image/svg+xml,${encodeURIComponent(t)}')`}function dD(t){return BD(``,'width="6" height="3"')}var vNA=qt.baseTheme({".cm-diagnostic":{padding:"3px 6px 3px 8px",marginLeft:"-1px",display:"block",whiteSpace:"pre-wrap"},".cm-diagnostic-error":{borderLeft:"5px solid #d11"},".cm-diagnostic-warning":{borderLeft:"5px solid orange"},".cm-diagnostic-info":{borderLeft:"5px solid #999"},".cm-diagnostic-hint":{borderLeft:"5px solid #66d"},".cm-diagnosticAction":{font:"inherit",border:"none",padding:"2px 4px",backgroundColor:"#444",color:"white",borderRadius:"3px",marginLeft:"8px",cursor:"pointer"},".cm-diagnosticSource":{fontSize:"70%",opacity:.7},".cm-lintRange":{backgroundPosition:"left bottom",backgroundRepeat:"repeat-x",paddingBottom:"0.7px"},".cm-lintRange-error":{backgroundImage:dD("#d11")},".cm-lintRange-warning":{backgroundImage:dD("orange")},".cm-lintRange-info":{backgroundImage:dD("#999")},".cm-lintRange-hint":{backgroundImage:dD("#66d")},".cm-lintRange-active":{backgroundColor:"#ffdd9980"},".cm-tooltip-lint":{padding:0,margin:0},".cm-lintPoint":{position:"relative","&:after":{content:'""',position:"absolute",bottom:0,left:"-2px",borderLeft:"3px solid transparent",borderRight:"3px solid transparent",borderBottom:"4px solid #d11"}},".cm-lintPoint-warning":{"&:after":{borderBottomColor:"orange"}},".cm-lintPoint-info":{"&:after":{borderBottomColor:"#999"}},".cm-lintPoint-hint":{"&:after":{borderBottomColor:"#66d"}},".cm-panel.cm-panel-lint":{position:"relative","& ul":{maxHeight:"100px",overflowY:"auto","& [aria-selected]":{backgroundColor:"#ddd","& u":{textDecoration:"underline"}},"&:focus [aria-selected]":{background_fallback:"#bdf",backgroundColor:"Highlight",color_fallback:"white",color:"HighlightText"},"& u":{textDecoration:"none"},padding:0,margin:0},"& [name=close]":{position:"absolute",top:"0",right:"2px",background:"inherit",border:"none",font:"inherit",padding:0,margin:0}}});function bNA(t){return t=="error"?4:t=="warning"?3:t=="info"?2:1}function KnA(t){let e="hint",A=1;for(let i of t){let n=bNA(i.severity);n>A&&(A=n,e=i.severity)}return e}var hD=class extends Fa{constructor(e){super(),this.diagnostics=e,this.severity=KnA(e)}toDOM(e){let A=document.createElement("div");A.className="cm-lint-marker cm-lint-marker-"+this.severity;let i=this.diagnostics,n=e.state.facet(fD).tooltipFilter;return n&&(i=n(i,e.state)),i.length&&(A.onmouseover=()=>kNA(e,A,i)),A}};function MNA(t,e){let A=i=>{let n=e.getBoundingClientRect();if(!(i.clientX>n.left-10&&i.clientXn.top-10&&i.clientYe.getBoundingClientRect()}}})}),e.onmouseout=e.onmousemove=null,MNA(t,e)}let{hoverTime:n}=t.state.facet(fD),o=setTimeout(i,n);e.onmouseout=()=>{clearTimeout(o),e.onmouseout=e.onmousemove=null},e.onmousemove=()=>{clearTimeout(o),o=setTimeout(i,n)}}function SNA(t,e){let A=Object.create(null);for(let n of e){let o=t.lineAt(n.from);(A[o.from]||(A[o.from]=[])).push(n)}let i=[];for(let n in A)i.push(new hD(A[n]).range(+n));return co.of(i,!0)}var RNA=Vw({class:"cm-gutter-lint",markers:t=>t.state.field(ZF),widgetMarker:(t,e,A)=>{let i=[];return t.state.field(ZF).between(A.from,A.to,(n,o,r)=>{n>A.from&&ni.is(XF)?i.value:A,t)},provide:t=>GE.from(t)}),xNA=qt.baseTheme({".cm-gutter-lint":{width:"1.4em","& .cm-gutterElement":{padding:".2em"}},".cm-lint-marker":{width:"1em",height:"1em"},".cm-lint-marker-info":{content:BD('')},".cm-lint-marker-warning":{content:BD('')},".cm-lint-marker-error":{content:BD('')}}),JnA=[Cc,qt.decorations.compute([Cc],t=>{let{selected:e,panel:A}=t.field(Cc);return!e||!A||e.from==e.to?ut.none:ut.set([fNA.range(e.from,e.to)])}),aiA(mNA,{hideOn:RnA}),vNA],fD=qe.define({combine(t){return Wr(t,{hoverTime:300,markerFilter:null,tooltipFilter:null})}});function TnA(t={}){return[fD.of(t),ZF,RNA,xNA,YnA]}var AN=class t{constructor(e,A,i,n,o,r,s,a,c,l=0,I){this.p=e,this.stack=A,this.state=i,this.reducePos=n,this.pos=o,this.score=r,this.buffer=s,this.bufferBase=a,this.curContext=c,this.lookAhead=l,this.parent=I}toString(){return`[${this.stack.filter((e,A)=>A%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(e,A,i=0){let n=e.parser.context;return new t(e,[],A,i,i,0,[],0,n?new mD(n,n.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(e,A){this.stack.push(this.state,A,this.bufferBase+this.buffer.length),this.state=e}reduce(e){var A;let i=e>>19,n=e&65535,{parser:o}=this.p,r=this.reducePos=2e3&&!(!((A=this.p.parser.nodeSet.types[n])===null||A===void 0)&&A.isAnonymous)&&(c==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=l):this.p.lastBigReductionSizea;)this.stack.pop();this.reduceContext(n,c)}storeNode(e,A,i,n=4,o=!1){if(e==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&r.buffer[s-4]==0&&r.buffer[s-1]>-1){if(A==i)return;if(r.buffer[s-2]>=A){r.buffer[s-2]=i;return}}}if(!o||this.pos==i)this.buffer.push(e,A,i,n);else{let r=this.buffer.length;if(r>0&&this.buffer[r-4]!=0){let s=!1;for(let a=r;a>0&&this.buffer[a-2]>i;a-=4)if(this.buffer[a-1]>=0){s=!0;break}if(s)for(;r>0&&this.buffer[r-2]>i;)this.buffer[r]=this.buffer[r-4],this.buffer[r+1]=this.buffer[r-3],this.buffer[r+2]=this.buffer[r-2],this.buffer[r+3]=this.buffer[r-1],r-=4,n>4&&(n-=4)}this.buffer[r]=e,this.buffer[r+1]=A,this.buffer[r+2]=i,this.buffer[r+3]=n}}shift(e,A,i,n){if(e&131072)this.pushState(e&65535,this.pos);else if((e&262144)==0){let o=e,{parser:r}=this.p;(n>this.pos||A<=r.maxNode)&&(this.pos=n,r.stateFlag(o,1)||(this.reducePos=n)),this.pushState(o,i),this.shiftContext(A,i),A<=r.maxNode&&this.buffer.push(A,i,n,4)}else this.pos=n,this.shiftContext(A,i),A<=this.p.parser.maxNode&&this.buffer.push(A,i,n,4)}apply(e,A,i,n){e&65536?this.reduce(e):this.shift(e,A,i,n)}useNode(e,A){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=e)&&(this.p.reused.push(e),i++);let n=this.pos;this.reducePos=this.pos=n+e.length,this.pushState(A,n),this.buffer.push(i,n,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,e,this,this.p.stream.reset(this.pos-e.length)))}split(){let e=this,A=e.buffer.length;for(;A>0&&e.buffer[A-2]>e.reducePos;)A-=4;let i=e.buffer.slice(A),n=e.bufferBase+A;for(;e&&n==e.bufferBase;)e=e.parent;return new t(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,n,this.curContext,this.lookAhead,e)}recoverByDelete(e,A){let i=e<=this.p.parser.maxNode;i&&this.storeNode(e,this.pos,A,4),this.storeNode(0,this.pos,A,i?8:4),this.pos=this.reducePos=A,this.score-=190}canShift(e){for(let A=new eN(this);;){let i=this.p.parser.stateSlot(A.state,4)||this.p.parser.hasAction(A.state,e);if(i==0)return!1;if((i&65536)==0)return!0;A.reduce(i)}}recoverByInsert(e){if(this.stack.length>=300)return[];let A=this.p.parser.nextStates(this.state);if(A.length>8||this.stack.length>=120){let n=[];for(let o=0,r;oa&1&&s==r)||n.push(A[o],r)}A=n}let i=[];for(let n=0;n>19,n=A&65535,o=this.stack.length-i*3;if(o<0||e.getGoto(this.stack[o],n,!1)<0){let r=this.findForcedReduction();if(r==null)return!1;A=r}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(A),!0}findForcedReduction(){let{parser:e}=this.p,A=[],i=(n,o)=>{if(!A.includes(n))return A.push(n),e.allActions(n,r=>{if(!(r&393216))if(r&65536){let s=(r>>19)-o;if(s>1){let a=r&65535,c=this.stack.length-s*3;if(c>=0&&e.getGoto(this.stack[c],a,!1)>=0)return s<<19|65536|a}}else{let s=i(r,o+1);if(s!=null)return s}})};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:e}=this.p;return e.data[e.stateSlot(this.state,1)]==65535&&!e.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(e){if(this.state!=e.state||this.stack.length!=e.stack.length)return!1;for(let A=0;Athis.lookAhead&&(this.emitLookAhead(),this.lookAhead=e)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}},mD=class{constructor(e,A){this.tracker=e,this.context=A,this.hash=e.strict?e.hash(A):0}},eN=class{constructor(e){this.start=e,this.state=e.state,this.stack=e.stack,this.base=this.stack.length}reduce(e){let A=e&65535,i=e>>19;i==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(i-1)*3;let n=this.start.p.parser.getGoto(this.stack[this.base-3],A,!0);this.state=n}},tN=class t{constructor(e,A,i){this.stack=e,this.pos=A,this.index=i,this.buffer=e.buffer,this.index==0&&this.maybeNext()}static create(e,A=e.bufferBase+e.buffer.length){return new t(e,A,A-e.bufferBase)}maybeNext(){let e=this.stack.parent;e!=null&&(this.index=this.stack.bufferBase-e.bufferBase,this.stack=e,this.buffer=e.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new t(this.stack,this.pos,this.index)}};function D3(t,e=Uint16Array){if(typeof t!="string")return t;let A=null;for(let i=0,n=0;i=92&&r--,r>=34&&r--;let a=r-32;if(a>=46&&(a-=46,s=!0),o+=a,s)break;o*=46}A?A[n++]=o:A=new e(o)}return A}var PE=class{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}},HnA=new PE,iN=class{constructor(e,A){this.input=e,this.ranges=A,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=HnA,this.rangeIndex=0,this.pos=this.chunkPos=A[0].from,this.range=A[0],this.end=A[A.length-1].to,this.readNext()}resolveOffset(e,A){let i=this.range,n=this.rangeIndex,o=this.pos+e;for(;oi.to:o>=i.to;){if(n==this.ranges.length-1)return null;let r=this.ranges[++n];o+=r.from-i.to,i=r}return o}clipPos(e){if(e>=this.range.from&&ee)return Math.max(e,A.from);return this.end}peek(e){let A=this.chunkOff+e,i,n;if(A>=0&&A=this.chunk2Pos&&is.to&&(this.chunk2=this.chunk2.slice(0,s.to-i)),n=this.chunk2.charCodeAt(0)}}return i>=this.token.lookAhead&&(this.token.lookAhead=i+1),n}acceptToken(e,A=0){let i=A?this.resolveOffset(A,-1):this.pos;if(i==null||i=this.chunk2Pos&&this.posthis.range.to?e.slice(0,this.range.to-this.pos):e,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(e=1){for(this.chunkOff+=e;this.pos+e>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();e-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=e,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(e,A){if(A?(this.token=A,A.start=e,A.lookAhead=e+1,A.value=A.extended=-1):this.token=HnA,this.pos!=e){if(this.pos=e,e==this.end)return this.setDone(),this;for(;e=this.range.to;)this.range=this.ranges[++this.rangeIndex];e>=this.chunkPos&&e=this.chunkPos&&A<=this.chunkPos+this.chunk.length)return this.chunk.slice(e-this.chunkPos,A-this.chunkPos);if(e>=this.chunk2Pos&&A<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(e-this.chunk2Pos,A-this.chunk2Pos);if(e>=this.range.from&&A<=this.range.to)return this.input.read(e,A);let i="";for(let n of this.ranges){if(n.from>=A)break;n.to>e&&(i+=this.input.read(Math.max(n.from,e),Math.min(n.to,A)))}return i}},R1=class{constructor(e,A){this.data=e,this.id=A}token(e,A){let{parser:i}=A.p;qnA(this.data,e,A,this.id,i.data,i.tokenPrecTable)}};R1.prototype.contextual=R1.prototype.fallback=R1.prototype.extend=!1;var nN=class{constructor(e,A,i){this.precTable=A,this.elseToken=i,this.data=typeof e=="string"?D3(e):e}token(e,A){let i=e.pos,n=0;for(;;){let o=e.next<0,r=e.resolveOffset(1,1);if(qnA(this.data,e,A,0,this.data,this.precTable),e.token.value>-1)break;if(this.elseToken==null)return;if(o||n++,r==null)break;e.reset(r,e.token)}n&&(e.reset(i,e.token),e.acceptToken(this.elseToken,n))}};nN.prototype.contextual=R1.prototype.fallback=R1.prototype.extend=!1;function qnA(t,e,A,i,n,o){let r=0,s=1<0){let B=t[d];if(a.allows(B)&&(e.token.value==-1||e.token.value==B||FNA(B,e.token.value,n,o))){e.acceptToken(B);break}}let l=e.next,I=0,C=t[r+2];if(e.next<0&&C>I&&t[c+C*3-3]==65535){r=t[c+C*3-1];continue A}for(;I>1,B=c+d+(d<<1),E=t[B],h=t[B+1]||65536;if(l=h)I=d+1;else{r=t[B+2],e.advance();continue A}}break}}function znA(t,e,A){for(let i=e,n;(n=t[i])!=65535;i++)if(n==A)return i-e;return-1}function FNA(t,e,A,i){let n=znA(A,i,e);return n<0||znA(A,i,t)e)&&!i.type.isError)return A<0?Math.max(0,Math.min(i.to-1,e-25)):Math.min(t.length,Math.max(i.from+1,e+25));if(A<0?i.prevSibling():i.nextSibling())break;if(!i.parent())return A<0?0:t.length}}var oN=class{constructor(e,A){this.fragments=e,this.nodeSet=A,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let e=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(e){for(this.safeFrom=e.openStart?OnA(e.tree,e.from+e.offset,1)-e.offset:e.from,this.safeTo=e.openEnd?OnA(e.tree,e.to+e.offset,-1)-e.offset:e.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(e.tree),this.start.push(-e.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(e){if(ee)return this.nextStart=r,null;if(o instanceof ur){if(r==e){if(r=Math.max(this.safeFrom,e)&&(this.trees.push(o),this.start.push(r),this.index.push(0))}else this.index[A]++,this.nextStart=r+o.length}}},rN=class{constructor(e,A){this.stream=A,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=e.tokenizers.map(i=>new PE)}getActions(e){let A=0,i=null,{parser:n}=e.p,{tokenizers:o}=n,r=n.stateSlot(e.state,3),s=e.curContext?e.curContext.hash:0,a=0;for(let c=0;cI.end+25&&(a=Math.max(I.lookAhead,a)),I.value!=0)){let C=A;if(I.extended>-1&&(A=this.addActions(e,I.extended,I.end,A)),A=this.addActions(e,I.value,I.end,A),!l.extend&&(i=I,A>C))break}}for(;this.actions.length>A;)this.actions.pop();return a&&e.setLookAhead(a),!i&&e.pos==this.stream.end&&(i=new PE,i.value=e.p.parser.eofTerm,i.start=i.end=e.pos,A=this.addActions(e,i.value,i.end,A)),this.mainToken=i,this.actions}getMainToken(e){if(this.mainToken)return this.mainToken;let A=new PE,{pos:i,p:n}=e;return A.start=i,A.end=Math.min(i+1,n.stream.end),A.value=i==n.stream.end?n.parser.eofTerm:0,A}updateCachedToken(e,A,i){let n=this.stream.clipPos(i.pos);if(A.token(this.stream.reset(n,e),i),e.value>-1){let{parser:o}=i.p;for(let r=0;r=0&&i.p.parser.dialect.allows(s>>1)){(s&1)==0?e.value=s>>1:e.extended=s>>1;break}}}else e.value=0,e.end=this.stream.clipPos(n+1)}putAction(e,A,i,n){for(let o=0;oe.bufferLength*4?new oN(i,e.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let e=this.stacks,A=this.minStackPos,i=this.stacks=[],n,o;if(this.bigReductionCount>300&&e.length==1){let[r]=e;for(;r.forceReduce()&&r.stack.length&&r.stack[r.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let r=0;rA)i.push(s);else{if(this.advanceStack(s,i,e))continue;{n||(n=[],o=[]),n.push(s);let a=this.tokens.getMainToken(s);o.push(a.value,a.end)}}break}}if(!i.length){let r=n&&NNA(n);if(r)return dc&&console.log("Finish with "+this.stackID(r)),this.stackToTree(r);if(this.parser.strict)throw dc&&n&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+A);this.recovering||(this.recovering=5)}if(this.recovering&&n){let r=this.stoppedAt!=null&&n[0].pos>this.stoppedAt?n[0]:this.runRecovery(n,o,i);if(r)return dc&&console.log("Force-finish "+this.stackID(r)),this.stackToTree(r.forceAll())}if(this.recovering){let r=this.recovering==1?1:this.recovering*3;if(i.length>r)for(i.sort((s,a)=>a.score-s.score);i.length>r;)i.pop();i.some(s=>s.reducePos>A)&&this.recovering--}else if(i.length>1){A:for(let r=0;r500&&c.buffer.length>500)if((s.score-c.score||s.buffer.length-c.buffer.length)>0)i.splice(a--,1);else{i.splice(r--,1);continue A}}}i.length>12&&i.splice(12,i.length-12)}this.minStackPos=i[0].pos;for(let r=1;r ":"";if(this.stoppedAt!=null&&n>this.stoppedAt)return e.forceReduce()?e:null;if(this.fragments){let c=e.curContext&&e.curContext.tracker.strict,l=c?e.curContext.hash:0;for(let I=this.fragments.nodeAt(n);I;){let C=this.parser.nodeSet.types[I.type.id]==I.type?o.getGoto(e.state,I.type.id):-1;if(C>-1&&I.length&&(!c||(I.prop(fi.contextHash)||0)==l))return e.useNode(I,C),dc&&console.log(r+this.stackID(e)+` (via reuse of ${o.getName(I.type.id)})`),!0;if(!(I instanceof ur)||I.children.length==0||I.positions[0]>0)break;let d=I.children[0];if(d instanceof ur&&I.positions[0]==0)I=d;else break}}let s=o.stateSlot(e.state,4);if(s>0)return e.reduce(s),dc&&console.log(r+this.stackID(e)+` (via always-reduce ${o.getName(s&65535)})`),!0;if(e.stack.length>=8400)for(;e.stack.length>6e3&&e.forceReduce(););let a=this.tokens.getActions(e);for(let c=0;cn?A.push(B):i.push(B)}return!1}advanceFully(e,A){let i=e.pos;for(;;){if(!this.advanceStack(e,null,null))return!1;if(e.pos>i)return PnA(e,A),!0}}runRecovery(e,A,i){let n=null,o=!1;for(let r=0;r ":"";if(s.deadEnd&&(o||(o=!0,s.restart(),dc&&console.log(l+this.stackID(s)+" (restarted)"),this.advanceFully(s,i))))continue;let I=s.split(),C=l;for(let d=0;I.forceReduce()&&d<10&&(dc&&console.log(C+this.stackID(I)+" (via force-reduce)"),!this.advanceFully(I,i));d++)dc&&(C=this.stackID(I)+" -> ");for(let d of s.recoverByInsert(a))dc&&console.log(l+this.stackID(d)+" (via recover-insert)"),this.advanceFully(d,i);this.stream.end>s.pos?(c==s.pos&&(c++,a=0),s.recoverByDelete(a,c),dc&&console.log(l+this.stackID(s)+` (via recover-delete ${this.parser.getName(a)})`),PnA(s,i)):(!n||n.scoree.topRules[s][1]),n=[];for(let s=0;s=0)o(l,a,s[c++]);else{let I=s[c+-l];for(let C=-l;C>0;C--)o(s[c++],a,I);c++}}}this.nodeSet=new I3(A.map((s,a)=>Fs.define({name:a>=this.minRepeatTerm?void 0:s,id:a,props:n[a],top:i.indexOf(a)>-1,error:a==0,skipped:e.skippedNodes&&e.skippedNodes.indexOf(a)>-1}))),e.propSources&&(this.nodeSet=this.nodeSet.extend(...e.propSources)),this.strict=!1,this.bufferLength=1024;let r=D3(e.tokenData);this.context=e.context,this.specializerSpecs=e.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let s=0;stypeof s=="number"?new R1(r,s):s),this.topRules=e.topRules,this.dialects=e.dialects||{},this.dynamicPrecedences=e.dynamicPrecedences||null,this.tokenPrecTable=e.tokenPrec,this.termNames=e.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(e,A,i){let n=new sN(this,e,A,i);for(let o of this.wrappers)n=o(n,e,A,i);return n}getGoto(e,A,i=!1){let n=this.goto;if(A>=n[0])return-1;for(let o=n[A+1];;){let r=n[o++],s=r&1,a=n[o++];if(s&&i)return a;for(let c=o+(r>>1);o0}validAction(e,A){return!!this.allActions(e,i=>i==A?!0:null)}allActions(e,A){let i=this.stateSlot(e,4),n=i?A(i):void 0;for(let o=this.stateSlot(e,1);n==null;o+=3){if(this.data[o]==65535)if(this.data[o+1]==1)o=z0(this.data,o+2);else break;n=A(z0(this.data,o+1))}return n}nextStates(e){let A=[];for(let i=this.stateSlot(e,1);;i+=3){if(this.data[i]==65535)if(this.data[i+1]==1)i=z0(this.data,i+2);else break;if((this.data[i+2]&1)==0){let n=this.data[i+1];A.some((o,r)=>r&1&&o==n)||A.push(this.data[i],n)}}return A}configure(e){let A=Object.assign(Object.create(t.prototype),this);if(e.props&&(A.nodeSet=this.nodeSet.extend(...e.props)),e.top){let i=this.topRules[e.top];if(!i)throw new RangeError(`Invalid top rule name ${e.top}`);A.top=i}return e.tokenizers&&(A.tokenizers=this.tokenizers.map(i=>{let n=e.tokenizers.find(o=>o.from==i);return n?n.to:i})),e.specializers&&(A.specializers=this.specializers.slice(),A.specializerSpecs=this.specializerSpecs.map((i,n)=>{let o=e.specializers.find(s=>s.from==i.external);if(!o)return i;let r=Object.assign(Object.assign({},i),{external:o.to});return A.specializers[n]=jnA(r),r})),e.contextTracker&&(A.context=e.contextTracker),e.dialect&&(A.dialect=this.parseDialect(e.dialect)),e.strict!=null&&(A.strict=e.strict),e.wrap&&(A.wrappers=A.wrappers.concat(e.wrap)),e.bufferLength!=null&&(A.bufferLength=e.bufferLength),A}hasWrappers(){return this.wrappers.length>0}getName(e){return this.termNames?this.termNames[e]:String(e<=this.maxNode&&this.nodeSet.types[e].name||e)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(e){let A=this.dynamicPrecedences;return A==null?0:A[e]||0}parseDialect(e){let A=Object.keys(this.dialects),i=A.map(()=>!1);if(e)for(let o of e.split(" ")){let r=A.indexOf(o);r>=0&&(i[r]=!0)}let n=null;for(let o=0;oi)&&A.p.parser.stateFlag(A.state,2)&&(!e||e.scoret.external(A,i)<<1|e}return t.get}var _NA=iD({String:Se.string,Number:Se.number,"True False":Se.bool,PropertyName:Se.propertyName,Null:Se.null,", :":Se.separator,"[ ]":Se.squareBracket,"{ }":Se.brace}),VnA=pD.deserialize({version:14,states:"$bOVQPOOOOQO'#Cb'#CbOnQPO'#CeOvQPO'#ClOOQO'#Cr'#CrQOQPOOOOQO'#Cg'#CgO}QPO'#CfO!SQPO'#CtOOQO,59P,59PO![QPO,59PO!aQPO'#CuOOQO,59W,59WO!iQPO,59WOVQPO,59QOqQPO'#CmO!nQPO,59`OOQO1G.k1G.kOVQPO'#CnO!vQPO,59aOOQO1G.r1G.rOOQO1G.l1G.lOOQO,59X,59XOOQO-E6k-E6kOOQO,59Y,59YOOQO-E6l-E6l",stateData:"#O~OeOS~OQSORSOSSOTSOWQO_ROgPO~OVXOgUO~O^[O~PVO[^O~O]_OVhX~OVaO~O]bO^iX~O^dO~O]_OVha~O]bO^ia~O",goto:"!kjPPPPPPkPPkqwPPPPk{!RPPP!XP!e!hXSOR^bQWQRf_TVQ_Q`WRg`QcZRicQTOQZRQe^RhbRYQR]R",nodeNames:"\u26A0 JsonText True False Null Number String } { Object Property PropertyName : , ] [ Array",maxTerm:25,nodeProps:[["isolate",-2,6,11,""],["openedBy",7,"{",14,"["],["closedBy",8,"}",15,"]"]],propSources:[_NA],skippedNodes:[0],repeatNodeCount:2,tokenData:"(|~RaXY!WYZ!W]^!Wpq!Wrs!]|}$u}!O$z!Q!R%T!R![&c![!]&t!}#O&y#P#Q'O#Y#Z'T#b#c'r#h#i(Z#o#p(r#q#r(w~!]Oe~~!`Wpq!]qr!]rs!xs#O!]#O#P!}#P;'S!];'S;=`$o<%lO!]~!}Og~~#QXrs!]!P!Q!]#O#P!]#U#V!]#Y#Z!]#b#c!]#f#g!]#h#i!]#i#j#m~#pR!Q![#y!c!i#y#T#Z#y~#|R!Q![$V!c!i$V#T#Z$V~$YR!Q![$c!c!i$c#T#Z$c~$fR!Q![!]!c!i!]#T#Z!]~$rP;=`<%l!]~$zO]~~$}Q!Q!R%T!R![&c~%YRT~!O!P%c!g!h%w#X#Y%w~%fP!Q![%i~%nRT~!Q![%i!g!h%w#X#Y%w~%zR{|&T}!O&T!Q![&Z~&WP!Q![&Z~&`PT~!Q![&Z~&hST~!O!P%c!Q![&c!g!h%w#X#Y%w~&yO[~~'OO_~~'TO^~~'WP#T#U'Z~'^P#`#a'a~'dP#g#h'g~'jP#X#Y'm~'rOR~~'uP#i#j'x~'{P#`#a(O~(RP#`#a(U~(ZOS~~(^P#f#g(a~(dP#i#j(g~(jP#X#Y(m~(rOQ~~(wOW~~(|OV~",tokenizers:[0],topRules:{JsonText:[0,1]},tokenPrec:0});var GNA=nD.define({name:"json",parser:VnA.configure({props:[KF.add({Object:YF({except:/^\s*\}/}),Array:YF({except:/^\s*\]/})}),JF.add({"Object Array":xiA})]}),languageData:{closeBrackets:{brackets:["[","{",'"']},indentOnInput:/^\s*[\}\]]$/}});function ZnA(){return new oD(GNA)}var WnA=typeof String.prototype.normalize=="function"?t=>t.normalize("NFKD"):t=>t,L1=class{constructor(e,A,i=0,n=e.length,o,r){this.test=r,this.value={from:0,to:0},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=e.iterRange(i,n),this.bufferStart=i,this.normalize=o?s=>o(WnA(s)):WnA,this.query=this.normalize(A)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return Bs(this.buffer,this.bufferPos)}next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let e=this.peek();if(e<0)return this.done=!0,this;let A=T4(e),i=this.bufferStart+this.bufferPos;this.bufferPos+=lc(e);let n=this.normalize(A);if(n.length)for(let o=0,r=i;;o++){let s=n.charCodeAt(o),a=this.match(s,r,this.bufferPos+this.bufferStart);if(o==n.length-1){if(a)return this.value=a,this;break}r==i&&othis.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine="":this.getLine(0)}next(){for(let e=this.matchPos-this.curLineStart;;){this.re.lastIndex=e;let A=this.matchPos<=this.to&&this.re.exec(this.curLine);if(A){let i=this.curLineStart+A.index,n=i+A[0].length;if(this.matchPos=MD(this.text,n+(i==n?1:0)),i==this.curLineStart+this.curLine.length&&this.nextLine(),(ithis.value.to)&&(!this.test||this.test(i,n,A)))return this.value={from:i,to:n,match:A},this;e=this.matchPos-this.curLineStart}else if(this.curLineStart+this.curLine.length=i||n.to<=A){let s=new t(A,e.sliceString(A,i));return cN.set(e,s),s}if(n.from==A&&n.to==i)return n;let{text:o,from:r}=n;return r>A&&(o=e.sliceString(A,r)+o,r=A),n.to=this.to?this.to:this.text.lineAt(e).to}next(){for(;;){let e=this.re.lastIndex=this.matchPos-this.flat.from,A=this.re.exec(this.flat.text);if(A&&!A[0]&&A.index==e&&(this.re.lastIndex=e+1,A=this.re.exec(this.flat.text)),A){let i=this.flat.from+A.index,n=i+A[0].length;if((this.flat.to>=this.to||A.index+A[0].length<=this.flat.text.length-10)&&(!this.test||this.test(i,n,A)))return this.value={from:i,to:n,match:A},this.matchPos=MD(this.text,n+(i==n?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=vD.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+this.flat.text.length*2))}}};typeof Symbol<"u"&&(yD.prototype[Symbol.iterator]=bD.prototype[Symbol.iterator]=function(){return this});function UNA(t){try{return new RegExp(t,EN),!0}catch{return!1}}function MD(t,e){if(e>=t.length)return e;let A=t.lineAt(e),i;for(;e=56320&&i<57344;)e++;return e}function lN(t){let e=String(t.state.doc.lineAt(t.state.selection.main.head).number),A=Un("input",{class:"cm-textfield",name:"line",value:e}),i=Un("form",{class:"cm-gotoLine",onkeydown:o=>{o.keyCode==27?(o.preventDefault(),t.dispatch({effects:y3.of(!1)}),t.focus()):o.keyCode==13&&(o.preventDefault(),n())},onsubmit:o=>{o.preventDefault(),n()}},Un("label",t.state.phrase("Go to line"),": ",A)," ",Un("button",{class:"cm-button",type:"submit"},t.state.phrase("go")),Un("button",{name:"close",onclick:()=>{t.dispatch({effects:y3.of(!1)}),t.focus()},"aria-label":t.state.phrase("close"),type:"button"},["\xD7"]));function n(){let o=/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(A.value);if(!o)return;let{state:r}=t,s=r.doc.lineAt(r.selection.main.head),[,a,c,l,I]=o,C=l?+l.slice(1):0,d=c?+c:s.number;if(c&&I){let h=d/100;a&&(h=h*(a=="-"?-1:1)+s.number/r.doc.lines),d=Math.round(r.doc.lines*h)}else c&&a&&(d=d*(a=="-"?-1:1)+s.number);let B=r.doc.line(Math.max(1,Math.min(r.doc.lines,d))),E=ae.cursor(B.from+Math.max(0,Math.min(C,B.length)));t.dispatch({effects:[y3.of(!1),qt.scrollIntoView(E.from,{y:"center"})],selection:E}),t.focus()}return{dom:i}}var y3=Pi.define(),XnA=Ar.define({create(){return!0},update(t,e){for(let A of e.effects)A.is(y3)&&(t=A.value);return t},provide:t=>MC.from(t,e=>e?lN:null)}),KNA=t=>{let e=kC(t,lN);if(!e){let A=[y3.of(!0)];t.state.field(XnA,!1)==null&&A.push(Pi.appendConfig.of([XnA,YNA])),t.dispatch({effects:A}),e=kC(t,lN)}return e&&e.dom.querySelector("input").select(),!0},YNA=qt.baseTheme({".cm-panel.cm-gotoLine":{padding:"2px 6px 4px",position:"relative","& label":{fontSize:"80%"},"& [name=close]":{position:"absolute",top:"0",bottom:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:"0"}}}),JNA={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},toA=qe.define({combine(t){return Wr(t,JNA,{highlightWordAroundCursor:(e,A)=>e||A,minSelectionLength:Math.min,maxMatches:Math.min})}});function ioA(t){let e=[PNA,ONA];return t&&e.push(toA.of(t)),e}var TNA=ut.mark({class:"cm-selectionMatch"}),HNA=ut.mark({class:"cm-selectionMatch cm-selectionMatch-main"});function $nA(t,e,A,i){return(A==0||t(e.sliceDoc(A-1,A))!=ao.Word)&&(i==e.doc.length||t(e.sliceDoc(i,i+1))!=ao.Word)}function zNA(t,e,A,i){return t(e.sliceDoc(A,A+1))==ao.Word&&t(e.sliceDoc(i-1,i))==ao.Word}var ONA=go.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.selectionSet||t.docChanged||t.viewportChanged)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=t.state.facet(toA),{state:A}=t,i=A.selection;if(i.ranges.length>1)return ut.none;let n=i.main,o,r=null;if(n.empty){if(!e.highlightWordAroundCursor)return ut.none;let a=A.wordAt(n.head);if(!a)return ut.none;r=A.charCategorizer(n.head),o=A.sliceDoc(a.from,a.to)}else{let a=n.to-n.from;if(a200)return ut.none;if(e.wholeWords){if(o=A.sliceDoc(n.from,n.to),r=A.charCategorizer(n.head),!($nA(r,A,n.from,n.to)&&zNA(r,A,n.from,n.to)))return ut.none}else if(o=A.sliceDoc(n.from,n.to),!o)return ut.none}let s=[];for(let a of t.visibleRanges){let c=new L1(A.doc,o,a.from,a.to);for(;!c.next().done;){let{from:l,to:I}=c.value;if((!r||$nA(r,A,l,I))&&(n.empty&&l<=n.from&&I>=n.to?s.push(HNA.range(l,I)):(l>=n.to||I<=n.from)&&s.push(TNA.range(l,I)),s.length>e.maxMatches))return ut.none}}return ut.set(s)}},{decorations:t=>t.decorations}),PNA=qt.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}}),jNA=({state:t,dispatch:e})=>{let{selection:A}=t,i=ae.create(A.ranges.map(n=>t.wordAt(n.head)||ae.cursor(n.head)),A.mainIndex);return i.eq(A)?!1:(e(t.update({selection:i})),!0)};function qNA(t,e){let{main:A,ranges:i}=t.selection,n=t.wordAt(A.head),o=n&&n.from==A.from&&n.to==A.to;for(let r=!1,s=new L1(t.doc,e,i[i.length-1].to);;)if(s.next(),s.done){if(r)return null;s=new L1(t.doc,e,0,Math.max(0,i[i.length-1].from-1)),r=!0}else{if(r&&i.some(a=>a.from==s.value.from))continue;if(o){let a=t.wordAt(s.value.from);if(!a||a.from!=s.value.from||a.to!=s.value.to)continue}return s.value}}var VNA=({state:t,dispatch:e})=>{let{ranges:A}=t.selection;if(A.some(o=>o.from===o.to))return jNA({state:t,dispatch:e});let i=t.sliceDoc(A[0].from,A[0].to);if(t.selection.ranges.some(o=>t.sliceDoc(o.from,o.to)!=i))return!1;let n=qNA(t,i);return n?(e(t.update({selection:t.selection.addRange(ae.range(n.from,n.to),!1),effects:qt.scrollIntoView(n.to)})),!0):!1},_C=qe.define({combine(t){return Wr(t,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:e=>new dN(e),scrollToMatch:e=>qt.scrollIntoView(e)})}});function noA(t){return t?[_C.of(t),BN]:BN}var kD=class{constructor(e){this.search=e.search,this.caseSensitive=!!e.caseSensitive,this.literal=!!e.literal,this.regexp=!!e.regexp,this.replace=e.replace||"",this.valid=!!this.search&&(!this.regexp||UNA(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!e.wholeWord}unquote(e){return this.literal?e:e.replace(/\\([nrt\\])/g,(A,i)=>i=="n"?` -`:i=="r"?"\r":i=="t"?" ":"\\")}eq(e){return this.search==e.search&&this.replace==e.replace&&this.caseSensitive==e.caseSensitive&&this.regexp==e.regexp&&this.wholeWord==e.wholeWord}create(){return this.regexp?new IN(this):new gN(this)}getCursor(e,A=0,i){let n=e.doc?e:hr.create({doc:e});return i==null&&(i=n.doc.length),this.regexp?qE(this,n,A,i):jE(this,n,A,i)}},SD=class{constructor(e){this.spec=e}};function jE(t,e,A,i){return new L1(e.doc,t.unquoted,A,i,t.caseSensitive?void 0:n=>n.toLowerCase(),t.wholeWord?ZNA(e.doc,e.charCategorizer(e.selection.main.head)):void 0)}function ZNA(t,e){return(A,i,n,o)=>((o>A||o+n.length=A)return null;n.push(i.value)}return n}highlight(e,A,i,n){let o=jE(this.spec,e,Math.max(0,A-this.spec.unquoted.length),Math.min(i+this.spec.unquoted.length,e.doc.length));for(;!o.next().done;)n(o.value.from,o.value.to)}};function qE(t,e,A,i){return new yD(e.doc,t.search,{ignoreCase:!t.caseSensitive,test:t.wholeWord?WNA(e.charCategorizer(e.selection.main.head)):void 0},A,i)}function RD(t,e){return t.slice(yr(t,e,!1),e)}function xD(t,e){return t.slice(e,yr(t,e))}function WNA(t){return(e,A,i)=>!i[0].length||(t(RD(i.input,i.index))!=ao.Word||t(xD(i.input,i.index))!=ao.Word)&&(t(xD(i.input,i.index+i[0].length))!=ao.Word||t(RD(i.input,i.index+i[0].length))!=ao.Word)}var IN=class extends SD{nextMatch(e,A,i){let n=qE(this.spec,e,i,e.doc.length).next();return n.done&&(n=qE(this.spec,e,0,A).next()),n.done?null:n.value}prevMatchInRange(e,A,i){for(let n=1;;n++){let o=Math.max(A,i-n*1e4),r=qE(this.spec,e,o,i),s=null;for(;!r.next().done;)s=r.value;if(s&&(o==A||s.from>o+10))return s;if(o==A)return null}}prevMatch(e,A,i){return this.prevMatchInRange(e,0,A)||this.prevMatchInRange(e,i,e.doc.length)}getReplacement(e){return this.spec.unquote(this.spec.replace).replace(/\$([$&]|\d+)/g,(A,i)=>{if(i=="&")return e.match[0];if(i=="$")return"$";for(let n=i.length;n>0;n--){let o=+i.slice(0,n);if(o>0&&o=A)return null;n.push(i.value)}return n}highlight(e,A,i,n){let o=qE(this.spec,e,Math.max(0,A-250),Math.min(i+250,e.doc.length));for(;!o.next().done;)n(o.value.from,o.value.to)}},b3=Pi.define(),QN=Pi.define(),x1=Ar.define({create(t){return new v3(CN(t).create(),null)},update(t,e){for(let A of e.effects)A.is(b3)?t=new v3(A.value.create(),t.panel):A.is(QN)&&(t=new v3(t.query,A.value?hN:null));return t},provide:t=>MC.from(t,e=>e.panel)});var v3=class{constructor(e,A){this.query=e,this.panel=A}},XNA=ut.mark({class:"cm-searchMatch"}),$NA=ut.mark({class:"cm-searchMatch cm-searchMatch-selected"}),A_A=go.fromClass(class{constructor(t){this.view=t,this.decorations=this.highlight(t.state.field(x1))}update(t){let e=t.state.field(x1);(e!=t.startState.field(x1)||t.docChanged||t.selectionSet||t.viewportChanged)&&(this.decorations=this.highlight(e))}highlight({query:t,panel:e}){if(!e||!t.spec.valid)return ut.none;let{view:A}=this,i=new ds;for(let n=0,o=A.visibleRanges,r=o.length;no[n+1].from-2*250;)a=o[++n].to;t.highlight(A.state,s,a,(c,l)=>{let I=A.state.selection.ranges.some(C=>C.from==c&&C.to==l);i.add(c,l,I?$NA:XNA)})}return i.finish()}},{decorations:t=>t.decorations});function M3(t){return e=>{let A=e.state.field(x1,!1);return A&&A.query.spec.valid?t(e,A):ND(e)}}var LD=M3((t,{query:e})=>{let{to:A}=t.state.selection.main,i=e.nextMatch(t.state,A,A);if(!i)return!1;let n=ae.single(i.from,i.to),o=t.state.facet(_C);return t.dispatch({selection:n,effects:[uN(t,i),o.scrollToMatch(n.main,t)],userEvent:"select.search"}),roA(t),!0}),FD=M3((t,{query:e})=>{let{state:A}=t,{from:i}=A.selection.main,n=e.prevMatch(A,i,i);if(!n)return!1;let o=ae.single(n.from,n.to),r=t.state.facet(_C);return t.dispatch({selection:o,effects:[uN(t,n),r.scrollToMatch(o.main,t)],userEvent:"select.search"}),roA(t),!0}),e_A=M3((t,{query:e})=>{let A=e.matchAll(t.state,1e3);return!A||!A.length?!1:(t.dispatch({selection:ae.create(A.map(i=>ae.range(i.from,i.to))),userEvent:"select.search.matches"}),!0)}),t_A=({state:t,dispatch:e})=>{let A=t.selection;if(A.ranges.length>1||A.main.empty)return!1;let{from:i,to:n}=A.main,o=[],r=0;for(let s=new L1(t.doc,t.sliceDoc(i,n));!s.next().done;){if(o.length>1e3)return!1;s.value.from==i&&(r=o.length),o.push(ae.range(s.value.from,s.value.to))}return e(t.update({selection:ae.create(o,r),userEvent:"select.search.matches"})),!0},AoA=M3((t,{query:e})=>{let{state:A}=t,{from:i,to:n}=A.selection.main;if(A.readOnly)return!1;let o=e.nextMatch(A,i,i);if(!o)return!1;let r=o,s=[],a,c,l=[];r.from==i&&r.to==n&&(c=A.toText(e.getReplacement(r)),s.push({from:r.from,to:r.to,insert:c}),r=e.nextMatch(A,r.from,r.to),l.push(qt.announce.of(A.phrase("replaced match on line $",A.doc.lineAt(i).number)+".")));let I=t.state.changes(s);return r&&(a=ae.single(r.from,r.to).map(I),l.push(uN(t,r)),l.push(A.facet(_C).scrollToMatch(a.main,t))),t.dispatch({changes:I,selection:a,effects:l,userEvent:"input.replace"}),!0}),i_A=M3((t,{query:e})=>{if(t.state.readOnly)return!1;let A=e.matchAll(t.state,1e9).map(n=>{let{from:o,to:r}=n;return{from:o,to:r,insert:e.getReplacement(n)}});if(!A.length)return!1;let i=t.state.phrase("replaced $ matches",A.length)+".";return t.dispatch({changes:A,effects:qt.announce.of(i),userEvent:"input.replace.all"}),!0});function hN(t){return t.state.facet(_C).createPanel(t)}function CN(t,e){var A,i,n,o,r;let s=t.selection.main,a=s.empty||s.to>s.from+100?"":t.sliceDoc(s.from,s.to);if(e&&!a)return e;let c=t.facet(_C);return new kD({search:((A=e?.literal)!==null&&A!==void 0?A:c.literal)?a:a.replace(/\n/g,"\\n"),caseSensitive:(i=e?.caseSensitive)!==null&&i!==void 0?i:c.caseSensitive,literal:(n=e?.literal)!==null&&n!==void 0?n:c.literal,regexp:(o=e?.regexp)!==null&&o!==void 0?o:c.regexp,wholeWord:(r=e?.wholeWord)!==null&&r!==void 0?r:c.wholeWord})}function ooA(t){let e=kC(t,hN);return e&&e.dom.querySelector("[main-field]")}function roA(t){let e=ooA(t);e&&e==t.root.activeElement&&e.select()}var ND=t=>{let e=t.state.field(x1,!1);if(e&&e.panel){let A=ooA(t);if(A&&A!=t.root.activeElement){let i=CN(t.state,e.query.spec);i.valid&&t.dispatch({effects:b3.of(i)}),A.focus(),A.select()}}else t.dispatch({effects:[QN.of(!0),e?b3.of(CN(t.state,e.query.spec)):Pi.appendConfig.of(BN)]});return!0},_D=t=>{let e=t.state.field(x1,!1);if(!e||!e.panel)return!1;let A=kC(t,hN);return A&&A.dom.contains(t.root.activeElement)&&t.focus(),t.dispatch({effects:QN.of(!1)}),!0},soA=[{key:"Mod-f",run:ND,scope:"editor search-panel"},{key:"F3",run:LD,shift:FD,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:LD,shift:FD,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:_D,scope:"editor search-panel"},{key:"Mod-Shift-l",run:t_A},{key:"Mod-Alt-g",run:KNA},{key:"Mod-d",run:VNA,preventDefault:!0}],dN=class{constructor(e){this.view=e;let A=this.query=e.state.field(x1).query.spec;this.commit=this.commit.bind(this),this.searchField=Un("input",{value:A.search,placeholder:Bc(e,"Find"),"aria-label":Bc(e,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=Un("input",{value:A.replace,placeholder:Bc(e,"Replace"),"aria-label":Bc(e,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=Un("input",{type:"checkbox",name:"case",form:"",checked:A.caseSensitive,onchange:this.commit}),this.reField=Un("input",{type:"checkbox",name:"re",form:"",checked:A.regexp,onchange:this.commit}),this.wordField=Un("input",{type:"checkbox",name:"word",form:"",checked:A.wholeWord,onchange:this.commit});function i(n,o,r){return Un("button",{class:"cm-button",name:n,onclick:o,type:"button"},r)}this.dom=Un("div",{onkeydown:n=>this.keydown(n),class:"cm-search"},[this.searchField,i("next",()=>LD(e),[Bc(e,"next")]),i("prev",()=>FD(e),[Bc(e,"previous")]),i("select",()=>e_A(e),[Bc(e,"all")]),Un("label",null,[this.caseField,Bc(e,"match case")]),Un("label",null,[this.reField,Bc(e,"regexp")]),Un("label",null,[this.wordField,Bc(e,"by word")]),...e.state.readOnly?[]:[Un("br"),this.replaceField,i("replace",()=>AoA(e),[Bc(e,"replace")]),i("replaceAll",()=>i_A(e),[Bc(e,"replace all")])],Un("button",{name:"close",onclick:()=>_D(e),"aria-label":Bc(e,"close"),type:"button"},["\xD7"])])}commit(){let e=new kD({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});e.eq(this.query)||(this.query=e,this.view.dispatch({effects:b3.of(e)}))}keydown(e){ZtA(this.view,e,"search-panel")?e.preventDefault():e.keyCode==13&&e.target==this.searchField?(e.preventDefault(),(e.shiftKey?FD:LD)(this.view)):e.keyCode==13&&e.target==this.replaceField&&(e.preventDefault(),AoA(this.view))}update(e){for(let A of e.transactions)for(let i of A.effects)i.is(b3)&&!i.value.eq(this.query)&&this.setQuery(i.value)}setQuery(e){this.query=e,this.searchField.value=e.search,this.replaceField.value=e.replace,this.caseField.checked=e.caseSensitive,this.reField.checked=e.regexp,this.wordField.checked=e.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(_C).top}};function Bc(t,e){return t.state.phrase(e)}var wD=30,DD=/[\s\.,:;?!]/;function uN(t,{from:e,to:A}){let i=t.state.doc.lineAt(e),n=t.state.doc.lineAt(A).to,o=Math.max(i.from,e-wD),r=Math.min(n,A+wD),s=t.state.sliceDoc(o,r);if(o!=i.from){for(let a=0;as.length-wD;a--)if(!DD.test(s[a-1])&&DD.test(s[a])){s=s.slice(0,a);break}}return qt.announce.of(`${t.state.phrase("current match")}. ${s} ${t.state.phrase("on line")} ${i.number}.`)}var n_A=qt.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),BN=[x1,Dl.low(A_A),n_A];var UD=class{constructor(e,A,i,n){this.state=e,this.pos=A,this.explicit=i,this.view=n,this.abortListeners=[],this.abortOnDocChange=!1}tokenBefore(e){let A=$r(this.state).resolveInner(this.pos,-1);for(;A&&e.indexOf(A.name)<0;)A=A.parent;return A?{from:A.from,to:this.pos,text:this.state.sliceDoc(A.from,this.pos),type:A.type}:null}matchBefore(e){let A=this.state.doc.lineAt(this.pos),i=Math.max(A.from,this.pos-250),n=A.text.slice(i-A.from,this.pos-A.from),o=n.search(EoA(e,!1));return o<0?null:{from:i+o,to:this.pos,text:n.slice(o)}}get aborted(){return this.abortListeners==null}addEventListener(e,A,i){e=="abort"&&this.abortListeners&&(this.abortListeners.push(A),i&&i.onDocChange&&(this.abortOnDocChange=!0))}};function aoA(t){let e=Object.keys(t).join(""),A=/\w/.test(e);return A&&(e=e.replace(/\w/g,"")),`[${A?"\\w":""}${e.replace(/[^\w\s]/g,"\\$&")}]`}function o_A(t){let e=Object.create(null),A=Object.create(null);for(let{label:n}of t){e[n[0]]=!0;for(let o=1;otypeof n=="string"?{label:n}:n),[A,i]=e.every(n=>/^\w+$/.test(n.label))?[/\w*$/,/\w+$/]:o_A(e);return n=>{let o=n.matchBefore(i);return o||n.explicit?{from:o?o.from:n.pos,options:e,validFor:A}:null}}var KD=class{constructor(e,A,i,n){this.completion=e,this.source=A,this.match=i,this.score=n}};function UC(t){return t.selection.main.from}function EoA(t,e){var A;let{source:i}=t,n=e&&i[0]!="^",o=i[i.length-1]!="$";return!n&&!o?t:new RegExp(`${n?"^":""}(?:${i})${o?"$":""}`,(A=t.flags)!==null&&A!==void 0?A:t.ignoreCase?"i":"")}var QoA=xa.define();function s_A(t,e,A,i){let{main:n}=t.selection,o=A-n.from,r=i-n.from;return Object.assign(Object.assign({},t.changeByRange(s=>{if(s!=n&&A!=i&&t.sliceDoc(s.from+o,s.from+r)!=t.sliceDoc(A,i))return{range:s};let a=t.toText(e);return{changes:{from:s.from+o,to:i==n.from?s.to:s.from+r,insert:a},range:ae.cursor(s.from+o+a.length)}})),{scrollIntoView:!0,userEvent:"input.complete"})}var coA=new WeakMap;function a_A(t){if(!Array.isArray(t))return t;let e=coA.get(t);return e||coA.set(t,e=r_A(t)),e}var YD=Pi.define(),k3=Pi.define(),pN=class{constructor(e){this.pattern=e,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let A=0;A=48&&w<=57||w>=97&&w<=122?2:w>=65&&w<=90?1:0:(_=T4(w))!=_.toLowerCase()?1:_!=_.toUpperCase()?2:0;(!D||K==1&&h||R==0&&K!=0)&&(A[I]==w||i[I]==w&&(C=!0)?r[I++]=D:r.length&&(u=!1)),R=K,D+=lc(w)}return I==a&&r[0]==0&&u?this.result(-100+(C?-200:0),r,e):d==a&&B==0?this.ret(-200-e.length+(E==e.length?0:-100),[0,E]):s>-1?this.ret(-700-e.length,[s,s+this.pattern.length]):d==a?this.ret(-900-e.length,[B,E]):I==a?this.result(-100+(C?-200:0)+-700+(u?0:-1100),r,e):A.length==2?null:this.result((n[0]?-700:0)+-200+-1100,n,e)}result(e,A,i){let n=[],o=0;for(let r of A){let s=r+(this.astral?lc(Bs(i,r)):1);o&&n[o-1]==r?n[o-1]=s:(n[o++]=r,n[o++]=s)}return this.ret(e-i.length,n)}},wN=class{constructor(e){this.pattern=e,this.matched=[],this.score=0,this.folded=e.toLowerCase()}match(e){if(e.length!1,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:c_A,filterStrict:!1,compareCompletions:(e,A)=>e.label.localeCompare(A.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(e,A)=>e&&A,closeOnBlur:(e,A)=>e&&A,icons:(e,A)=>e&&A,tooltipClass:(e,A)=>i=>loA(e(i),A(i)),optionClass:(e,A)=>i=>loA(e(i),A(i)),addToOptions:(e,A)=>e.concat(A),filterStrict:(e,A)=>e||A})}});function loA(t,e){return t?e?t+" "+e:t:e}function c_A(t,e,A,i,n,o){let r=t.textDirection==lo.RTL,s=r,a=!1,c="top",l,I,C=e.left-n.left,d=n.right-e.right,B=i.right-i.left,E=i.bottom-i.top;if(s&&C=E||D>e.top?l=A.bottom-e.top:(c="bottom",l=e.bottom-A.top)}let h=(e.bottom-e.top)/o.offsetHeight,u=(e.right-e.left)/o.offsetWidth;return{style:`${c}: ${l/h}px; max-width: ${I/u}px`,class:"cm-completionInfo-"+(a?r?"left-narrow":"right-narrow":s?"left":"right")}}function l_A(t){let e=t.addToOptions.slice();return t.icons&&e.push({render(A){let i=document.createElement("div");return i.classList.add("cm-completionIcon"),A.type&&i.classList.add(...A.type.split(/\s+/g).map(n=>"cm-completionIcon-"+n)),i.setAttribute("aria-hidden","true"),i},position:20}),e.push({render(A,i,n,o){let r=document.createElement("span");r.className="cm-completionLabel";let s=A.displayLabel||A.label,a=0;for(let c=0;ca&&r.appendChild(document.createTextNode(s.slice(a,l)));let C=r.appendChild(document.createElement("span"));C.appendChild(document.createTextNode(s.slice(l,I))),C.className="cm-completionMatchedText",a=I}return aA.position-i.position).map(A=>A.render)}function fN(t,e,A){if(t<=A)return{from:0,to:t};if(e<0&&(e=0),e<=t>>1){let n=Math.floor(e/A);return{from:n*A,to:(n+1)*A}}let i=Math.floor((t-e)/A);return{from:t-(i+1)*A,to:t-i*A}}var DN=class{constructor(e,A,i){this.view=e,this.stateField=A,this.applyCompletion=i,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:a=>this.placeInfo(a),key:this},this.space=null,this.currentClass="";let n=e.state.field(A),{options:o,selected:r}=n.open,s=e.state.facet(As);this.optionContent=l_A(s),this.optionClass=s.optionClass,this.tooltipClass=s.tooltipClass,this.range=fN(o.length,r,s.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(e.state),this.dom.addEventListener("mousedown",a=>{let{options:c}=e.state.field(A).open;for(let l=a.target,I;l&&l!=this.dom;l=l.parentNode)if(l.nodeName=="LI"&&(I=/-(\d+)$/.exec(l.id))&&+I[1]{let c=e.state.field(this.stateField,!1);c&&c.tooltip&&e.state.facet(As).closeOnBlur&&a.relatedTarget!=e.contentDOM&&e.dispatch({effects:k3.of(null)})}),this.showOptions(o,n.id)}mount(){this.updateSel()}showOptions(e,A){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(e,A,this.range)),this.list.addEventListener("scroll",()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)})}update(e){var A;let i=e.state.field(this.stateField),n=e.startState.field(this.stateField);if(this.updateTooltipClass(e.state),i!=n){let{options:o,selected:r,disabled:s}=i.open;(!n.open||n.open.options!=o)&&(this.range=fN(o.length,r,e.state.facet(As).maxRenderedOptions),this.showOptions(o,i.id)),this.updateSel(),s!=((A=n.open)===null||A===void 0?void 0:A.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!s)}}updateTooltipClass(e){let A=this.tooltipClass(e);if(A!=this.currentClass){for(let i of this.currentClass.split(" "))i&&this.dom.classList.remove(i);for(let i of A.split(" "))i&&this.dom.classList.add(i);this.currentClass=A}}positioned(e){this.space=e,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let e=this.view.state.field(this.stateField),A=e.open;if((A.selected>-1&&A.selected=this.range.to)&&(this.range=fN(A.options.length,A.selected,this.view.state.facet(As).maxRenderedOptions),this.showOptions(A.options,e.id)),this.updateSelectedOption(A.selected)){this.destroyInfo();let{completion:i}=A.options[A.selected],{info:n}=i;if(!n)return;let o=typeof n=="string"?document.createTextNode(n):n(i);if(!o)return;"then"in o?o.then(r=>{r&&this.view.state.field(this.stateField,!1)==e&&this.addInfoPane(r,i)}).catch(r=>Xr(this.view.state,r,"completion info")):this.addInfoPane(o,i)}}addInfoPane(e,A){this.destroyInfo();let i=this.info=document.createElement("div");if(i.className="cm-tooltip cm-completionInfo",e.nodeType!=null)i.appendChild(e),this.infoDestroy=null;else{let{dom:n,destroy:o}=e;i.appendChild(n),this.infoDestroy=o||null}this.dom.appendChild(i),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(e){let A=null;for(let i=this.list.firstChild,n=this.range.from;i;i=i.nextSibling,n++)i.nodeName!="LI"||!i.id?n--:n==e?i.hasAttribute("aria-selected")||(i.setAttribute("aria-selected","true"),A=i):i.hasAttribute("aria-selected")&&i.removeAttribute("aria-selected");return A&&I_A(this.list,A),A}measureInfo(){let e=this.dom.querySelector("[aria-selected]");if(!e||!this.info)return null;let A=this.dom.getBoundingClientRect(),i=this.info.getBoundingClientRect(),n=e.getBoundingClientRect(),o=this.space;if(!o){let r=this.dom.ownerDocument.documentElement;o={left:0,top:0,right:r.clientWidth,bottom:r.clientHeight}}return n.top>Math.min(o.bottom,A.bottom)-10||n.bottom{r.target==n&&r.preventDefault()});let o=null;for(let r=i.from;ri.from||i.from==0))if(o=C,typeof c!="string"&&c.header)n.appendChild(c.header(c));else{let d=n.appendChild(document.createElement("completion-section"));d.textContent=C}}let l=n.appendChild(document.createElement("li"));l.id=A+"-"+r,l.setAttribute("role","option");let I=this.optionClass(s);I&&(l.className=I);for(let C of this.optionContent){let d=C(s,this.view.state,this.view,a);d&&l.appendChild(d)}}return i.from&&n.classList.add("cm-completionListIncompleteTop"),i.tonew DN(A,t,e)}function I_A(t,e){let A=t.getBoundingClientRect(),i=e.getBoundingClientRect(),n=A.height/t.offsetHeight;i.topA.bottom&&(t.scrollTop+=(i.bottom-A.bottom)/n)}function goA(t){return(t.boost||0)*100+(t.apply?10:0)+(t.info?5:0)+(t.type?1:0)}function C_A(t,e){let A=[],i=null,n=c=>{A.push(c);let{section:l}=c.completion;if(l){i||(i=[]);let I=typeof l=="string"?l:l.name;i.some(C=>C.name==I)||i.push(typeof l=="string"?{name:I}:l)}},o=e.facet(As);for(let c of t)if(c.hasResult()){let l=c.result.getMatch;if(c.result.filter===!1)for(let I of c.result.options)n(new KD(I,c.source,l?l(I):[],1e9-A.length));else{let I=e.sliceDoc(c.from,c.to),C,d=o.filterStrict?new wN(I):new pN(I);for(let B of c.result.options)if(C=d.match(B.label)){let E=B.displayLabel?l?l(B,C.matched):[]:C.matched;n(new KD(B,c.source,E,C.score+(B.boost||0)))}}}if(i){let c=Object.create(null),l=0,I=(C,d)=>{var B,E;return((B=C.rank)!==null&&B!==void 0?B:1e9)-((E=d.rank)!==null&&E!==void 0?E:1e9)||(C.nameI.score-l.score||a(l.completion,I.completion))){let l=c.completion;!s||s.label!=l.label||s.detail!=l.detail||s.type!=null&&l.type!=null&&s.type!=l.type||s.apply!=l.apply||s.boost!=l.boost?r.push(c):goA(c.completion)>goA(s)&&(r[r.length-1]=c),s=c.completion}return r}var yN=class t{constructor(e,A,i,n,o,r){this.options=e,this.attrs=A,this.tooltip=i,this.timestamp=n,this.selected=o,this.disabled=r}setSelected(e,A){return e==this.selected||e>=this.options.length?this:new t(this.options,IoA(A,e),this.tooltip,this.timestamp,e,this.disabled)}static build(e,A,i,n,o,r){if(n&&!r&&e.some(c=>c.isPending))return n.setDisabled();let s=C_A(e,A);if(!s.length)return n&&e.some(c=>c.isPending)?n.setDisabled():null;let a=A.facet(As).selectOnOpen?0:-1;if(n&&n.selected!=a&&n.selected!=-1){let c=n.options[n.selected].completion;for(let l=0;ll.hasResult()?Math.min(c,l.from):c,1e8),create:u_A,above:o.aboveCursor},n?n.timestamp:Date.now(),a,!1)}map(e){return new t(this.options,this.attrs,Object.assign(Object.assign({},this.tooltip),{pos:e.mapPos(this.tooltip.pos)}),this.timestamp,this.selected,this.disabled)}setDisabled(){return new t(this.options,this.attrs,this.tooltip,this.timestamp,this.selected,!0)}},vN=class t{constructor(e,A,i){this.active=e,this.id=A,this.open=i}static start(){return new t(Q_A,"cm-ac-"+Math.floor(Math.random()*2e6).toString(36),null)}update(e){let{state:A}=e,i=A.facet(As),o=(i.override||A.languageDataAt("autocomplete",UC(A)).map(a_A)).map(a=>(this.active.find(l=>l.source==a)||new O0(a,this.active.some(l=>l.state!=0)?1:0)).update(e,i));o.length==this.active.length&&o.every((a,c)=>a==this.active[c])&&(o=this.active);let r=this.open,s=e.effects.some(a=>a.is(MN));r&&e.docChanged&&(r=r.map(e.changes)),e.selection||o.some(a=>a.hasResult()&&e.changes.touchesRange(a.from,a.to))||!d_A(o,this.active)||s?r=yN.build(o,A,this.id,r,i,s):r&&r.disabled&&!o.some(a=>a.isPending)&&(r=null),!r&&o.every(a=>!a.isPending)&&o.some(a=>a.hasResult())&&(o=o.map(a=>a.hasResult()?new O0(a.source,0):a));for(let a of e.effects)a.is(uoA)&&(r=r&&r.setSelected(a.value,this.id));return o==this.active&&r==this.open?this:new t(o,this.id,r)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:this.active.length?B_A:E_A}};function d_A(t,e){if(t==e)return!0;for(let A=0,i=0;;){for(;A-1&&(A["aria-activedescendant"]=t+"-"+e),A}var Q_A=[];function hoA(t,e){if(t.isUserEvent("input.complete")){let i=t.annotation(QoA);if(i&&e.activateOnCompletion(i))return 12}let A=t.isUserEvent("input.type");return A&&e.activateOnTyping?5:A?1:t.isUserEvent("delete.backward")?2:t.selection?8:t.docChanged?16:0}var O0=class t{constructor(e,A,i=!1){this.source=e,this.state=A,this.explicit=i}hasResult(){return!1}get isPending(){return this.state==1}update(e,A){let i=hoA(e,A),n=this;(i&8||i&16&&this.touches(e))&&(n=new t(n.source,0)),i&4&&n.state==0&&(n=new t(this.source,1)),n=n.updateFor(e,i);for(let o of e.effects)if(o.is(YD))n=new t(n.source,1,o.value);else if(o.is(k3))n=new t(n.source,0);else if(o.is(MN))for(let r of o.value)r.source==n.source&&(n=r);return n}updateFor(e,A){return this.map(e.changes)}map(e){return this}touches(e){return e.changes.touchesRange(UC(e.state))}},JD=class t extends O0{constructor(e,A,i,n,o,r){super(e,3,A),this.limit=i,this.result=n,this.from=o,this.to=r}hasResult(){return!0}updateFor(e,A){var i;if(!(A&3))return this.map(e.changes);let n=this.result;n.map&&!e.changes.empty&&(n=n.map(n,e.changes));let o=e.changes.mapPos(this.from),r=e.changes.mapPos(this.to,1),s=UC(e.state);if(s>r||!n||A&2&&(UC(e.startState)==this.from||sA.map(e))}}),uoA=Pi.define(),Na=Ar.define({create(){return vN.start()},update(t,e){return t.update(e)},provide:t=>[GE.from(t,e=>e.tooltip),qt.contentAttributes.from(t,e=>e.attrs)]});function kN(t,e){let A=e.completion.apply||e.completion.label,i=t.state.field(Na).active.find(n=>n.source==e.source);return i instanceof JD?(typeof A=="string"?t.dispatch(Object.assign(Object.assign({},s_A(t.state,A,i.from,i.to)),{annotations:QoA.of(e.completion)})):A(t,e.completion,i.from,i.to),!0):!1}var u_A=g_A(Na,kN);function GD(t,e="option"){return A=>{let i=A.state.field(Na,!1);if(!i||!i.open||i.open.disabled||Date.now()-i.open.timestamp-1?i.open.selected+n*(t?1:-1):t?0:r-1;return s<0?s=e=="page"?0:r-1:s>=r&&(s=e=="page"?r-1:0),A.dispatch({effects:uoA.of(s)}),!0}}var f_A=t=>{let e=t.state.field(Na,!1);return t.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestampt.state.field(Na,!1)?(t.dispatch({effects:YD.of(!0)}),!0):!1,m_A=t=>{let e=t.state.field(Na,!1);return!e||!e.active.some(A=>A.state!=0)?!1:(t.dispatch({effects:k3.of(null)}),!0)},bN=class{constructor(e,A){this.active=e,this.context=A,this.time=Date.now(),this.updates=[],this.done=void 0}},p_A=50,w_A=1e3,D_A=go.fromClass(class{constructor(t){this.view=t,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let e of t.state.field(Na).active)e.isPending&&this.startQuery(e)}update(t){let e=t.state.field(Na),A=t.state.facet(As);if(!t.selectionSet&&!t.docChanged&&t.startState.field(Na)==e)return;let i=t.transactions.some(o=>{let r=hoA(o,A);return r&8||(o.selection||o.docChanged)&&!(r&3)});for(let o=0;op_A&&Date.now()-r.time>w_A){for(let s of r.context.abortListeners)try{s()}catch(a){Xr(this.view.state,a)}r.context.abortListeners=null,this.running.splice(o--,1)}else r.updates.push(...t.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),t.transactions.some(o=>o.effects.some(r=>r.is(YD)))&&(this.pendingStart=!0);let n=this.pendingStart?50:A.activateOnTypingDelay;if(this.debounceUpdate=e.active.some(o=>o.isPending&&!this.running.some(r=>r.active.source==o.source))?setTimeout(()=>this.startUpdate(),n):-1,this.composing!=0)for(let o of t.transactions)o.isUserEvent("input.type")?this.composing=2:this.composing==2&&o.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:t}=this.view,e=t.field(Na);for(let A of e.active)A.isPending&&!this.running.some(i=>i.active.source==A.source)&&this.startQuery(A);this.running.length&&e.open&&e.open.disabled&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(As).updateSyncTime))}startQuery(t){let{state:e}=this.view,A=UC(e),i=new UD(e,A,t.explicit,this.view),n=new bN(t,i);this.running.push(n),Promise.resolve(t.source(i)).then(o=>{n.context.aborted||(n.done=o||null,this.scheduleAccept())},o=>{this.view.dispatch({effects:k3.of(null)}),Xr(this.view.state,o)})}scheduleAccept(){this.running.every(t=>t.done!==void 0)?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(As).updateSyncTime))}accept(){var t;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],A=this.view.state.facet(As),i=this.view.state.field(Na);for(let n=0;ns.source==o.active.source);if(r&&r.isPending)if(o.done==null){let s=new O0(o.active.source,0);for(let a of o.updates)s=s.update(a,A);s.isPending||e.push(s)}else this.startQuery(r)}(e.length||i.open&&i.open.disabled)&&this.view.dispatch({effects:MN.of(e)})}},{eventHandlers:{blur(t){let e=this.view.state.field(Na,!1);if(e&&e.tooltip&&this.view.state.facet(As).closeOnBlur){let A=e.open&&BF(this.view,e.open.tooltip);(!A||!A.dom.contains(t.relatedTarget))&&setTimeout(()=>this.view.dispatch({effects:k3.of(null)}),10)}},compositionstart(){this.composing=1},compositionend(){this.composing==3&&setTimeout(()=>this.view.dispatch({effects:YD.of(!1)}),20),this.composing=0}}}),y_A=typeof navigator=="object"&&/Win/.test(navigator.platform),v_A=Dl.highest(qt.domEventHandlers({keydown(t,e){let A=e.state.field(Na,!1);if(!A||!A.open||A.open.disabled||A.open.selected<0||t.key.length>1||t.ctrlKey&&!(y_A&&t.altKey)||t.metaKey)return!1;let i=A.open.options[A.open.selected],n=A.active.find(r=>r.source==i.source),o=i.completion.commitCharacters||n.result.commitCharacters;return o&&o.indexOf(t.key)>-1&&kN(e,i),!1}})),b_A=qt.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"\xB7\xB7\xB7"',opacity:.5,display:"block",textAlign:"center"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box",whiteSpace:"pre-line"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'\u0192'"}},".cm-completionIcon-class":{"&:after":{content:"'\u25CB'"}},".cm-completionIcon-interface":{"&:after":{content:"'\u25CC'"}},".cm-completionIcon-variable":{"&:after":{content:"'\u{1D465}'"}},".cm-completionIcon-constant":{"&:after":{content:"'\u{1D436}'"}},".cm-completionIcon-type":{"&:after":{content:"'\u{1D461}'"}},".cm-completionIcon-enum":{"&:after":{content:"'\u222A'"}},".cm-completionIcon-property":{"&:after":{content:"'\u25A1'"}},".cm-completionIcon-keyword":{"&:after":{content:"'\u{1F511}\uFE0E'"}},".cm-completionIcon-namespace":{"&:after":{content:"'\u25A2'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}});var S3={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},GC=Pi.define({map(t,e){let A=e.mapPos(t,-1,Is.TrackAfter);return A??void 0}}),SN=new class extends wl{};SN.startSide=1;SN.endSide=-1;var foA=Ar.define({create(){return co.empty},update(t,e){if(t=t.map(e.changes),e.selection){let A=e.state.doc.lineAt(e.selection.main.head);t=t.update({filter:i=>i>=A.from&&i<=A.to})}for(let A of e.effects)A.is(GC)&&(t=t.update({add:[SN.range(A.value,A.value+1)]}));return t}});function moA(){return[k_A,foA]}var mN="()[]{}<>\xAB\xBB\xBB\xAB\uFF3B\uFF3D\uFF5B\uFF5D";function poA(t){for(let e=0;e{if((M_A?t.composing:t.compositionStarted)||t.state.readOnly)return!1;let n=t.state.selection.main;if(i.length>2||i.length==2&&lc(Bs(i,0))==1||e!=n.from||A!=n.to)return!1;let o=R_A(t.state,i);return o?(t.dispatch(o),!0):!1}),S_A=({state:t,dispatch:e})=>{if(t.readOnly)return!1;let i=woA(t,t.selection.main.head).brackets||S3.brackets,n=null,o=t.changeByRange(r=>{if(r.empty){let s=x_A(t.doc,r.head);for(let a of i)if(a==s&&TD(t.doc,r.head)==poA(Bs(a,0)))return{changes:{from:r.head-a.length,to:r.head+a.length},range:ae.cursor(r.head-a.length)}}return{range:n=r}});return n||e(t.update(o,{scrollIntoView:!0,userEvent:"delete.backward"})),!n},DoA=[{key:"Backspace",run:S_A}];function R_A(t,e){let A=woA(t,t.selection.main.head),i=A.brackets||S3.brackets;for(let n of i){let o=poA(Bs(n,0));if(e==n)return o==n?N_A(t,n,i.indexOf(n+n+n)>-1,A):L_A(t,n,o,A.before||S3.before);if(e==o&&yoA(t,t.selection.main.from))return F_A(t,n,o)}return null}function yoA(t,e){let A=!1;return t.field(foA).between(0,t.doc.length,i=>{i==e&&(A=!0)}),A}function TD(t,e){let A=t.sliceString(e,e+2);return A.slice(0,lc(Bs(A,0)))}function x_A(t,e){let A=t.sliceString(e-2,e);return lc(Bs(A,0))==A.length?A:A.slice(1)}function L_A(t,e,A,i){let n=null,o=t.changeByRange(r=>{if(!r.empty)return{changes:[{insert:e,from:r.from},{insert:A,from:r.to}],effects:GC.of(r.to+e.length),range:ae.range(r.anchor+e.length,r.head+e.length)};let s=TD(t.doc,r.head);return!s||/\s/.test(s)||i.indexOf(s)>-1?{changes:{insert:e+A,from:r.head},effects:GC.of(r.head+e.length),range:ae.cursor(r.head+e.length)}:{range:n=r}});return n?null:t.update(o,{scrollIntoView:!0,userEvent:"input.type"})}function F_A(t,e,A){let i=null,n=t.changeByRange(o=>o.empty&&TD(t.doc,o.head)==A?{changes:{from:o.head,to:o.head+A.length,insert:A},range:ae.cursor(o.head+A.length)}:i={range:o});return i?null:t.update(n,{scrollIntoView:!0,userEvent:"input.type"})}function N_A(t,e,A,i){let n=i.stringPrefixes||S3.stringPrefixes,o=null,r=t.changeByRange(s=>{if(!s.empty)return{changes:[{insert:e,from:s.from},{insert:e,from:s.to}],effects:GC.of(s.to+e.length),range:ae.range(s.anchor+e.length,s.head+e.length)};let a=s.head,c=TD(t.doc,a),l;if(c==e){if(doA(t,a))return{changes:{insert:e+e,from:a},effects:GC.of(a+e.length),range:ae.cursor(a+e.length)};if(yoA(t,a)){let C=A&&t.sliceDoc(a,a+e.length*3)==e+e+e?e+e+e:e;return{changes:{from:a,to:a+C.length,insert:C},range:ae.cursor(a+C.length)}}}else{if(A&&t.sliceDoc(a-2*e.length,a)==e+e&&(l=BoA(t,a-2*e.length,n))>-1&&doA(t,l))return{changes:{insert:e+e+e+e,from:a},effects:GC.of(a+e.length),range:ae.cursor(a+e.length)};if(t.charCategorizer(a)(c)!=ao.Word&&BoA(t,a,n)>-1&&!__A(t,a,e,n))return{changes:{insert:e+e,from:a},effects:GC.of(a+e.length),range:ae.cursor(a+e.length)}}return{range:o=s}});return o?null:t.update(r,{scrollIntoView:!0,userEvent:"input.type"})}function doA(t,e){let A=$r(t).resolveInner(e+1);return A.parent&&A.from==e}function __A(t,e,A,i){let n=$r(t).resolveInner(e,-1),o=i.reduce((r,s)=>Math.max(r,s.length),0);for(let r=0;r<5;r++){let s=t.sliceDoc(n.from,Math.min(n.to,n.from+A.length+o)),a=s.indexOf(A);if(!a||a>-1&&i.indexOf(s.slice(0,a))>-1){let l=n.firstChild;for(;l&&l.from==n.from&&l.to-l.from>A.length+a;){if(t.sliceDoc(l.to-A.length,l.to)==A)return!1;l=l.firstChild}return!0}let c=n.to==e&&n.parent;if(!c)break;n=c}return!1}function BoA(t,e,A){let i=t.charCategorizer(e);if(i(t.sliceDoc(e-1,e))!=ao.Word)return e;for(let n of A){let o=e-n.length;if(t.sliceDoc(o,e)==n&&i(t.sliceDoc(o-1,o))!=ao.Word)return o}return-1}function voA(t={}){return[v_A,Na,As.of(t),D_A,G_A,b_A]}var RN=[{key:"Ctrl-Space",run:CoA},{mac:"Alt-`",run:CoA},{key:"Escape",run:m_A},{key:"ArrowDown",run:GD(!0)},{key:"ArrowUp",run:GD(!1)},{key:"PageDown",run:GD(!0,"page")},{key:"PageUp",run:GD(!1,"page")},{key:"Enter",run:f_A}],G_A=Dl.highest(_E.computeN([As],t=>t.facet(As).defaultKeymap?[RN]:[]));function U_A(t,e=t.state){let A=new Set;for(let{from:i,to:n}of t.visibleRanges){let o=i;for(;o<=n;){let r=e.doc.lineAt(o);A.has(r)||A.add(r),o=r.to+1}}return A}function xN(t){let e=t.selection.main.head;return t.doc.lineAt(e)}function boA(t,e){let A=0;A:for(let i=0;i=o.level&&this.markerType!=="codeOnly"?this.set(e,0,n.level):n.empty&&n.level===0&&o.level!==0?this.set(e,0,0):o.level>n.level?this.set(e,0,n.level+1):this.set(e,0,o.level)}let A=boA(e.text,this.state.tabSize),i=Math.floor(A/this.unitWidth);return this.set(e,A,i)}closestNonEmpty(e,A){let i=e.number+A;for(;A===-1?i>=1:i<=this.state.doc.lines;){if(this.has(i)){let r=this.get(i);if(!r.empty)return r}let o=this.state.doc.line(i);if(o.text.trim().length){let r=boA(o.text,this.state.tabSize),s=Math.floor(r/this.unitWidth);return this.set(o,r,s)}i+=A}let n=this.state.doc.line(A===-1?1:this.state.doc.lines);return this.set(n,0,0)}findAndSetActiveLines(){let e=xN(this.state);if(!this.has(e))return;let A=this.get(e);if(this.has(A.line.number+1)){let o=this.get(A.line.number+1);o.level>A.level&&(A=o)}if(this.has(A.line.number-1)){let o=this.get(A.line.number-1);o.level>A.level&&(A=o)}if(A.level===0)return;A.active=A.level;let i,n;for(i=A.line.number;i>1;i--){if(!this.has(i-1))continue;let o=this.get(i-1);if(o.level0&&a.push(HD("--indent-marker-bg-color",i,e,s,c)),a.push(HD("--indent-marker-active-bg-color",n,e,r-1,1)),r!==o&&a.push(HD("--indent-marker-bg-color",i,e,r,o-r))}else a.push(HD("--indent-marker-bg-color",i,e,s,o-s));return a.join(",")}var FN=class{constructor(e){this.view=e,this.unitWidth=Ml(e.state),this.currentLineNumber=xN(e.state).number,this.generate(e.state)}update(e){let A=Ml(e.state),i=A!==this.unitWidth;i&&(this.unitWidth=A);let n=xN(e.state).number,o=n!==this.currentLineNumber;this.currentLineNumber=n;let r=e.state.facet(zD).highlightActiveBlock&&o;(e.docChanged||e.viewportChanged||i||r)&&this.generate(e.state)}generate(e){let A=new ds,i=U_A(this.view,e),{hideFirstIndent:n,markerType:o,thickness:r,activeThickness:s}=e.facet(zD),a=new LN(i,e,this.unitWidth,o);for(let c of i){let l=a.get(c.number);if(!l?.level)continue;let I=Y_A(l,this.unitWidth,n,r,s);A.add(c.from,c.from,ut.line({class:"cm-indent-markers",attributes:{style:`--indent-markers: ${I}`}}))}this.decorations=A.finish()}};function MoA(t={}){return[zD.of(t),K_A(t.colors),go.fromClass(FN,{decorations:e=>e.decorations})]}var J_A=["mainAxis","crossAxis","fallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","flipAlignment"],T_A=["mainAxis","crossAxis","limiter"];function zrA(t,e){if(t==null)return{};var A,i,n=function(r,s){if(r==null)return{};var a={};for(var c in r)if({}.hasOwnProperty.call(r,c)){if(s.indexOf(c)!==-1)continue;a[c]=r[c]}return a}(t,e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);for(i=0;i{};function V_A(t){return t()}function gy(t){for(var e=0;e1&&arguments[1]!==void 0&&arguments[1])&&(qn.l={s:null,u:null,r1:[],r2:jC(!1)})}function pt(t){var e=qn,A=e.e;if(A!==null)for(var i of(e.e=null,A))rsA(i);return t!==void 0&&(e.x=t),qn=e.p,t??{}}function pQ(){return!fQ||qn!==null&&qn.l===null}function XrA(t){var e,A;return qn===null&&ef(),(A=(e=qn).c)!==null&&A!==void 0?A:e.c=new Map(function(i){for(var n=i.p;n!==null;){var o=n.c;if(o!==null)return o;n=n.p}return null}(qn)||void 0)}function iQ(t){if(typeof t!="object"||t===null||Og in t)return t;var e=K_(t);if(e!==j_A&&e!==q_A)return t;var A=new Map,i=mQ(t),n=P0(0),o=zC,r=s=>{if(zC===o)return s();var a=Go,c=zC;q1(null),KoA(o);var l=s();return q1(a),KoA(c),l};return i&&A.set("length",P0(t.length)),new Proxy(t,{defineProperty(s,a,c){"value"in c&&c.configurable!==!1&&c.enumerable!==!1&&c.writable!==!1||function(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}();var l=A.get(a);return l===void 0?l=r(()=>{var I=P0(c.value);return A.set(a,I),I}):y(l,c.value,!0),!0},deleteProperty(s,a){var c=A.get(a);if(c===void 0){if(a in s){var l=r(()=>P0(Qs));A.set(a,l),GN(n)}}else{if(i&&typeof a=="string"){var I=A.get("length"),C=Number(a);Number.isInteger(C)&&CP0(iQ(C?s[a]:Qs))),A.set(a,I)),I!==void 0){var d=g(I);return d===Qs?void 0:d}return Reflect.get(s,a,c)},getOwnPropertyDescriptor(s,a){var c=Reflect.getOwnPropertyDescriptor(s,a);if(c&&"value"in c){var l=A.get(a);l&&(c.value=g(l))}else if(c===void 0){var I=A.get(a),C=I?.v;if(I!==void 0&&C!==Qs)return{enumerable:!0,configurable:!0,value:C,writable:!0}}return c},has(s,a){var c;if(a===Og)return!0;var l=A.get(a),I=l!==void 0&&l.v!==Qs||Reflect.has(s,a);return(l!==void 0||Vn!==null&&(!I||(c=$0(s,a))!==null&&c!==void 0&&c.writable))&&(l===void 0&&(l=r(()=>P0(I?iQ(s[a]):Qs)),A.set(a,l)),g(l)===Qs)?!1:I},set(s,a,c,l){var I,C=A.get(a),d=a in s;if(i&&a==="length")for(var B=c;BP0(Qs)),A.set(B+"",E))}C===void 0?(!d||(I=$0(s,a))!==null&&I!==void 0&&I.writable)&&(y(C=r(()=>P0(void 0)),iQ(c)),A.set(a,C)):(d=C.v!==Qs,y(C,r(()=>iQ(c))));var h=Reflect.getOwnPropertyDescriptor(s,a);if(h!=null&&h.set&&h.set.call(l,c),!d){if(i&&typeof a=="string"){var u=A.get("length"),D=Number(a);Number.isInteger(D)&&D>=u.v&&y(u,D+1)}GN(n)}return!0},ownKeys(s){g(n);var a=Reflect.ownKeys(s).filter(I=>{var C=A.get(I);return C===void 0||C.v!==Qs});for(var[c,l]of A)l.v===Qs||c in s||a.push(c);return a},setPrototypeOf(){(function(){throw new Error("https://svelte.dev/e/state_prototype_fixed")})()}})}function _oA(t){try{if(t!==null&&typeof t=="object"&&Og in t)return t[Og]}catch{}return t}function eGA(t,e){return Object.is(_oA(t),_oA(e))}function wQ(t){var e=2050,A=Go!==null&&2&Go.f?Go:null;return Vn===null||A!==null&&(A.f&xl)!==0?e|=xl:Vn.f|=W_A,{ctx:qn,deps:null,effects:null,equals:ZrA,f:e,fn:t,reactions:null,rv:0,v:Qs,wv:0,parent:A??Vn,ac:null}}function Ga(t){var e=wQ(t);return BsA(e),e}function qA(t){var e=wQ(t);return e.equals=WrA,e}function $rA(t){var e=t.effects;if(e!==null){t.effects=null;for(var A=0;A1&&arguments[1]!==void 0&&arguments[1],n=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],o=jC(t);return i||(o.equals=WrA),fQ&&n&&qn!==null&&qn.l!==null&&((A=(e=qn.l).s)!==null&&A!==void 0?A:e.s=[]).push(o),o}function hc(t,e){return y(t,nA(()=>g(t))),e}function y(t,e){var A,i=arguments.length>2&&arguments[2]!==void 0&&arguments[2];return Go===null||Tg&&(Go.f&Z_A)===0||!pQ()||!(131090&Go.f)||(A=e2)!==null&&A!==void 0&&A.includes(t)||function(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}(),g_(t,i?iQ(e):e)}function g_(t,e){if(!t.equals(e)){var A=t.v;j1?TC.set(t,e):TC.set(t,A),t.v=e,2&t.f&&((t.f&IQ)!==0&&T_(t),Ul(t,(t.f&xl)===0?pc:Ad)),t.wv=EsA(),esA(t,IQ),!pQ()||Vn===null||(Vn.f&pc)===0||96&Vn.f||(Hc===null?function(i){Hc=i}([t]):Hc.push(t))}return e}function GoA(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,A=g(t),i=e===1?A++:A--;return y(t,A),i}function GN(t){y(t,t.v+1)}function esA(t,e){var A=t.reactions;if(A!==null)for(var i=pQ(),n=A.length,o=0;o0&&arguments[0]!==void 0?arguments[0]:"";return document.createTextNode(t)}function uc(t){return isA.call(t)}function Ly(t){return nsA.call(t)}function W(t,e){return uc(t)}function vt(t,e){var A=uc(t);return A instanceof Comment&&A.data===""?Ly(A):A}function IA(t){for(var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,A=t;e--;)A=Ly(A);return A}function osA(t){Vn===null&&Go===null&&function(){throw new Error("https://svelte.dev/e/effect_orphan")}(),Go!==null&&(Go.f&xl)!==0&&Vn===null&&function(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}(),j1&&function(){throw new Error("https://svelte.dev/e/effect_in_teardown")}()}function AI(t,e,A){var i=!(arguments.length>3&&arguments[3]!==void 0)||arguments[3],n=Vn,o={ctx:qn,deps:null,nodes_start:null,nodes_end:null,f:t|IQ,first:null,fn:e,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,transitions:null,wv:0,ac:null};if(A)try{Ny(o),o.f|=32768}catch(a){throw jc(o),a}else e!==null&&_y(o);if(!(A&&o.deps===null&&o.first===null&&o.nodes_start===null&&o.teardown===null&&!(524416&o.f))&&i&&(n!==null&&function(a,c){var l=c.last;l===null?c.last=c.first=a:(l.next=a,a.prev=l,c.last=a)}(o,n),Go!==null&&2&Go.f)){var r,s=Go;((r=s.effects)!==null&&r!==void 0?r:s.effects=[]).push(o)}return o}function H_(t){var e=AI(8,null,!1);return Ul(e,pc),e.teardown=t,e}function I_(t){if(osA(),Go||!Vn||(Vn.f&Ry)===0)return rsA(t);var e,A=qn;((e=A.e)!==null&&e!==void 0?e:A.e=[]).push(t)}function rsA(t){return AI(2097156,t,!1)}function es(t){return AI(4,t,!1)}function fA(t,e){var A=qn,i={effect:null,ran:!1};A.l.r1.push(i),i.effect=tf(()=>{t(),i.ran||(i.ran=!0,y(A.l.r2,!0),nA(e))})}function Qn(){var t=qn;tf(()=>{if(g(t.l.r2)){for(var e of t.l.r1){var A=e.effect;(A.f&pc)!==0&&Ul(A,Ad),nf(A)&&Ny(A),e.ran=!1}t.l.r2.v=!1}})}function tf(t){return AI(8,t,!0)}function De(t){var e=arguments.length>2&&arguments[2]!==void 0?arguments[2]:wQ,A=(arguments.length>1&&arguments[1]!==void 0?arguments[1]:[]).map(e);return eI(()=>t(...A.map(g)))}function eI(t){return AI(24|(arguments.length>1&&arguments[1]!==void 0?arguments[1]:0),t,!0)}function Vg(t){return AI(40,t,!0,!(arguments.length>1&&arguments[1]!==void 0)||arguments[1])}function ssA(t){var e=t.teardown;if(e!==null){var A=j1,i=Go;UoA(!0),q1(null);try{e.call(null)}finally{UoA(A),q1(i)}}}function asA(t){var e=arguments.length>1&&arguments[1]!==void 0&&arguments[1],A=t.first;for(t.first=t.last=null;A!==null;){var i;(i=A.ac)===null||i===void 0||i.abort(VrA);var n=A.next;(A.f&jrA)!==0?A.parent=null:jc(A,e),A=n}}function jc(t){var e=!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],A=!1;(e||262144&t.f)&&t.nodes_start!==null&&t.nodes_end!==null&&(csA(t.nodes_start,t.nodes_end),A=!0),asA(t,e&&!A),dy(t,0),Ul(t,Y_);var i=t.transitions;if(i!==null)for(var n of i)n.stop();ssA(t);var o=t.parent;o!==null&&o.first!==null&&lsA(t),t.next=t.prev=t.teardown=t.ctx=t.deps=t.fn=t.nodes_start=t.nodes_end=t.ac=null}function csA(t,e){for(;t!==null;){var A=t===e?null:Ly(t);t.remove(),t=A}}function lsA(t){var e=t.parent,A=t.prev,i=t.next;A!==null&&(A.next=i),i!==null&&(i.prev=A),e!==null&&(e.first===t&&(e.first=i),e.last===t&&(e.last=A))}function CQ(t,e){var A=[];z_(t,A,!0),gsA(A,()=>{jc(t),e&&e()})}function gsA(t,e){var A=t.length;if(A>0){var i=()=>--A||e();for(var n of t)n.out(i)}else e()}function z_(t,e,A){if((t.f&H1)===0){if(t.f^=H1,t.transitions!==null)for(var i of t.transitions)(i.is_global||A)&&e.push(i);for(var n=t.first;n!==null;){var o=n.next;z_(n,e,((n.f&Af)!==0||(n.f&Ry)!==0)&&A),n=o}}}function Iy(t){IsA(t,!0)}function IsA(t,e){if((t.f&H1)!==0){t.f^=H1;for(var A=t.first;A!==null;){var i=A.next;IsA(A,((A.f&Af)!==0||(A.f&Ry)!==0)&&e),A=i}if(t.transitions!==null)for(var n of t.transitions)(n.is_global||e)&&n.in()}}var K3=[],UN=[];function CsA(){var t=K3;K3=[],gy(t)}function Fy(t){K3.length===0&&queueMicrotask(CsA),K3.push(t)}function tGA(){var t;K3.length>0&&CsA(),UN.length>0&&(t=UN,UN=[],gy(t))}function dsA(t,e){for(;e!==null;){if(128&e.f)try{return void e.b.error(t)}catch{}e=e.parent}throw t}var Y3=!1,J3=null,HC=!1,j1=!1;function UoA(t){j1=t}var U3=[],Go=null,Tg=!1;function q1(t){Go=t}var Vn=null;function V1(t){Vn=t}var e2=null;function BsA(t){Go!==null&&Go.f&l_&&(e2===null?e2=[t]:e2.push(t))}var Aa=null,Ec=0,Hc=null,Cy=1,T3=0,zC=T3;function KoA(t){zC=t}var K1=!1,YoA=null;function EsA(){return++Cy}function nf(t){var e=t.f;if((e&IQ)!==0)return!0;if((e&Ad)!==0){var A=t.deps,i=(e&xl)!==0;if(A!==null){var n,o,r=(e&c_)!==0,s=i&&Vn!==null&&!K1,a=A.length;if(r||s){var c=t,l=c.parent;for(n=0;nt.wv)return!0}i&&(Vn===null||K1)||Ul(t,pc)}return!1}function QsA(t,e){var A,i=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],n=t.reactions;if(n!==null&&((A=e2)===null||A===void 0||!A.includes(t)))for(var o=0;o0)for(C.length=Ec+Aa.length,d=0;d0;){e++>1e3&&nGA();var A=U3,i=A.length;U3=[];for(var n=0;nn&&(i.f&X_A)!==0)break}}for(;A1&&arguments[1]!==void 0?arguments[1]:new Set;if(!(typeof t!="object"||t===null||t instanceof EventTarget||e.has(t))){for(var A in e.add(t),t instanceof Date&&t.getTime(),t)try{C_(t[A],e)}catch{}var i=K_(t);if(i!==Object.prototype&&i!==Array.prototype&&i!==Map.prototype&&i!==Set.prototype&&i!==Date.prototype){var n=PrA(i);for(var o in n){var r=n[o].get;if(r)try{r.call(t)}catch{}}}}}var JoA=!1;function psA(t){var e=Go,A=Vn;q1(null),V1(null);try{return t()}finally{q1(e),V1(A)}}function aGA(t,e,A){var i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:A;t.addEventListener(e,()=>psA(A));var n=t.__on_r;t.__on_r=n?()=>{n(),i(!0)}:()=>i(!0),JoA||(JoA=!0,document.addEventListener("reset",o=>{Promise.resolve().then(()=>{if(!o.defaultPrevented)for(var r of o.target.elements){var s;(s=r.__on_r)===null||s===void 0||s.call(r)}})},{capture:!0}))}var wsA=new Set,d_=new Set;function DsA(t,e,A){var i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};function n(o){if(i.capture||F3.call(e,o),!o.cancelBubble)return psA(()=>A?.call(this,o))}return t.startsWith("pointer")||t.startsWith("touch")||t==="wheel"?Fy(()=>{e.addEventListener(t,n,i)}):e.addEventListener(t,n,i),n}function ce(t,e,A,i,n){var o={capture:i,passive:n},r=DsA(t,e,A,o);(e===document.body||e===window||e===document||e instanceof HTMLMediaElement)&&H_(()=>{e.removeEventListener(t,r,o)})}function of(t){for(var e=0;er||i});var I=Go,C=Vn;q1(null),V1(null);try{for(var d,B=[];r!==null;){var E=r.assignedSlot||r.parentNode||r.host||null;try{var h=r["__"+n];if(h!=null&&(!r.disabled||t.target===r))if(mQ(h)){var[u,...D]=h;u.apply(r,[t,...D])}else h.call(r,t)}catch(w){d?B.push(w):d=w}if(t.cancelBubble||E===A||E===null)break;r=E}if(d){var L=function(w){queueMicrotask(()=>{throw w})};for(var R of B)L(R);throw d}}finally{t.__root=A,delete t.currentTarget,q1(I),V1(C)}}}function O_(t){var e=document.createElement("template");return e.innerHTML=t.replaceAll("",""),e.content}function qC(t,e){var A=Vn;A.nodes_start===null&&(A.nodes_start=t,A.nodes_end=e)}function wA(t,e){var A,i=!!(1&e),n=!!(2&e),o=!t.startsWith("");return()=>{A===void 0&&(A=O_(o?t:""+t),i||(A=uc(A)));var r=n||tsA?document.importNode(A,!0):A.cloneNode(!0);return i?qC(uc(r),r.lastChild):qC(r,r),r}}function tI(t,e){return function(A,i){var n,o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"svg",r=!A.startsWith(""),s=!!(1&i),a="<".concat(o,">").concat(r?A:""+A,"");return()=>{if(!n){var c=uc(O_(a));if(s)for(n=document.createDocumentFragment();uc(c);)n.appendChild(uc(c));else n=uc(c)}var l=n.cloneNode(!0);return s?qC(uc(l),l.lastChild):qC(l,l),l}}(t,e,"svg")}function Tr(){var t=xy((arguments.length>0&&arguments[0]!==void 0?arguments[0]:"")+"");return qC(t,t),t}function _o(){var t=document.createDocumentFragment(),e=document.createComment(""),A=xy();return t.append(e,A),qC(e,A),t}function iA(t,e){t!==null&&t.before(e)}var cGA=["beforeinput","click","change","dblclick","contextmenu","focusin","focusout","input","keydown","keyup","mousedown","mousemove","mouseout","mouseover","mouseup","pointerdown","pointermove","pointerout","pointerover","pointerup","touchend","touchmove","touchstart"],lGA={formnovalidate:"formNoValidate",ismap:"isMap",nomodule:"noModule",playsinline:"playsInline",readonly:"readOnly",defaultvalue:"defaultValue",defaultchecked:"defaultChecked",srcobject:"srcObject",novalidate:"noValidate",allowfullscreen:"allowFullscreen",disablepictureinpicture:"disablePictureInPicture",disableremoteplayback:"disableRemotePlayback"},gGA=["touchstart","touchmove"];function IGA(t){return gGA.includes(t)}function wt(t,e){var A,i=e==null?"":typeof e=="object"?e+"":e;i!==((A=t.__t)!==null&&A!==void 0?A:t.__t=t.nodeValue)&&(t.__t=i,t.nodeValue=i+"")}function CGA(t,e){return function(A,i){var{target:n,anchor:o,props:r={},events:s,context:a,intro:c=!0}=i;(function(){if(A2===void 0){A2=window,tsA=/Firefox/.test(navigator.userAgent);var B=Element.prototype,E=Node.prototype,h=Text.prototype;isA=$0(E,"firstChild").get,nsA=$0(E,"nextSibling").get,LoA(B)&&(B.__click=void 0,B.__className=void 0,B.__attributes=null,B.__style=void 0,B.__e=void 0),LoA(h)&&(h.__t=void 0)}})();var l=new Set,I=B=>{for(var E=0;E0&&arguments[0]!==void 0?arguments[0]:{};return new Promise(u=>{h.outro?CQ(E,()=>{jc(E),u(void 0)}):(jc(E),u(void 0))})}}(()=>{var B=o??n.appendChild(xy());return Vg(()=>{a&&(mt({}),qn.c=a),s&&(r.$$events=s),C=A(B,r)||{},a&&pt()}),()=>{for(var E of l){n.removeEventListener(E,F3);var h=VE.get(E);--h===0?(document.removeEventListener(E,F3),VE.delete(E)):VE.set(E,h)}var u;d_.delete(I),B!==o&&((u=B.parentNode)===null||u===void 0||u.removeChild(B))}});return B_.set(C,d),C}(t,e)}var VE=new Map,B_=new WeakMap;function hs(t){qn===null&&ef(),fQ&&qn.l!==null?ysA(qn).m.push(t):I_(()=>{var e=nA(t);if(typeof e=="function")return e})}function qc(t){qn===null&&ef(),hs(()=>()=>nA(t))}function dGA(){var t=qn;return t===null&&ef(),(e,A,i)=>{var n,o=(n=t.s.$$events)===null||n===void 0?void 0:n[e];if(o){var r=mQ(o)?o.slice():[o],s=function(c,l){var{bubbles:I=!1,cancelable:C=!1}=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return new CustomEvent(c,{detail:l,bubbles:I,cancelable:C})}(e,A,i);for(var a of r)a.call(t.x,s);return!s.defaultPrevented}return!0}}function BGA(t){qn===null&&ef(),qn.l===null&&function(){throw new Error("https://svelte.dev/e/lifecycle_legacy_only")}(),ysA(qn).b.push(t)}function ysA(t){var e,A=t.l;return(e=A.u)!==null&&e!==void 0?e:A.u={a:[],b:[],m:[]}}function LA(t,e){var[A,i]=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[0,0],n=t,o=null,r=null,s=Qs,a=!1,c=function(I){a=!0,l(!(arguments.length>1&&arguments[1]!==void 0)||arguments[1],I)},l=(I,C)=>{s!==(s=I)&&(s?(o?Iy(o):C&&(o=Vg(()=>C(n))),r&&CQ(r,()=>{r=null})):(r?Iy(r):C&&(r=Vg(()=>C(n,[A+1,i]))),o&&CQ(o,()=>{o=null})))};eI(()=>{a=!1,e(c),a||l(null,null)},A>0?Af:0)}function vsA(t,e,A){var i,n=t,o=Qs,r=pQ()?AGA:J_;eI(()=>{r(o,o=e())&&(i&&CQ(i),i=Vg(()=>A(n)))})}function or(t,e){return e}function qo(t,e,A,i,n){var o=arguments.length>5&&arguments[5]!==void 0?arguments[5]:null,r=t,s={flags:e,items:new Map,first:null};!(4&e)||(r=t.appendChild(xy()));var a=null,c=!1,l=qA(()=>{var I=A();return mQ(I)?I:I==null?[]:a_(I)});eI(()=>{var I=g(l),C=I.length;c&&C===0||(c=C===0,function(d,B,E,h,u,D,L){var R,w,_,K,z,U,H=!!(8&u),q=!!(3&u),j=d.length,gA=B.items,QA=B.first,BA=QA,lA=null,vA=[],tA=[];if(H)for(U=0;U0){var He=4&u&&j===0?E:null;if(H){for(U=0;U0&&Ue.length===0&&le!==null;if(xt){var tt=le.parentNode;tt.textContent="",tt.append(le),SA.clear(),F1(UA,aA[0].prev,aA[mA-1].next)}gsA(Ue,()=>{for(var de=0;de{if(w!==void 0)for(z of w){var UA;(UA=z.a)===null||UA===void 0||UA.apply()}}),Vn.first=B.first&&B.first.e,Vn.last=lA&&lA.e}(I,s,r,n,e,i,A),o!==null&&(C===0?a?Iy(a):a=Vg(()=>o(r)):a!==null&&CQ(a,()=>{a=null})),g(l))})}function EGA(t,e,A,i){1&i&&g_(t.v,e),2&i?g_(t.i,A):t.i=A}function QGA(t,e,A,i,n,o,r,s,a,c){var l=1&a?16&a?jC(n):$(n,!1,!1):n,I=2&a?jC(r):r,C={i:I,v:l,k:o,a:null,e:null,prev:A,next:i};try{return C.e=Vg(()=>s(t,l,I,c),!1),C.e.prev=A&&A.e,C.e.next=i&&i.e,A===null?e.first=C:(A.next=C,A.e.next=C.e),i!==null&&(i.prev=C,i.e.prev=C.e),C}finally{}}function ToA(t,e,A){for(var i=t.next?t.next.e.nodes_start:A,n=e?e.e.nodes_start:A,o=t.e.nodes_start;o!==i;){var r=Ly(o);n.before(o),o=r}}function F1(t,e,A){e===null?t.first=A:(e.next=A,e.e.next=A&&A.e),A!==null&&(A.prev=e,A.e.prev=e&&e.e)}function bsA(t,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],i=arguments.length>3&&arguments[3]!==void 0&&arguments[3],n=t,o="";De(()=>{var r,s=Vn;if(o!==(o=(r=e())!==null&&r!==void 0?r:"")&&(s.nodes_start!==null&&(csA(s.nodes_start,s.nodes_end),s.nodes_start=s.nodes_end=null),o!=="")){var a=o+"";A?a="".concat(a,""):i&&(a="".concat(a,""));var c=O_(a);if((A||i)&&(c=uc(c)),qC(uc(c),c.lastChild),A||i)for(;uc(c);)n.before(uc(c));else n.before(c)}})}function jo(t,e,A,i,n){var o,r=(o=e.$$slots)===null||o===void 0?void 0:o[A],s=!1;r===!0&&(r=e[A==="default"?"children":A],s=!0),r===void 0?n!==null&&n(t):r(t,s?()=>i:i)}function MsA(t,e,A){var i,n,o=t;eI(()=>{i!==(i=e())&&(n&&(CQ(n),n=null),i&&(n=Vg(()=>A(o,i))))},Af)}function Us(t,e,A){es(()=>{var i=nA(()=>e(t,A?.())||{});if(A&&i!=null&&i.update){var n=!1,o={};tf(()=>{var r=A();k(r),n&&J_(o,r)&&(o=r,i.update(r))}),n=!0}if(i!=null&&i.destroy)return()=>i.destroy()})}function hGA(t,e){var A,i=void 0;eI(()=>{i!==(i=e())&&(A&&(jc(A),A=null),i&&(A=Vg(()=>{es(()=>i(t))})))})}function ksA(t){var e,A,i="";if(typeof t=="string"||typeof t=="number")i+=t;else if(typeof t=="object")if(Array.isArray(t)){var n=t.length;for(e=0;e1&&arguments[1]!==void 0&&arguments[1]?" !important;":";",A="";for(var i in t){var n=t[i];n!=null&&n!==""&&(A+=" "+i+": "+n+e)}return A}function KN(t){return t[0]!=="-"||t[1]!=="-"?t.toLowerCase():t}function Vt(t,e,A,i,n,o){var r=t.__className;if(r!==A||r===void 0){var s=function(l,I,C){var d=l==null?"":""+l;if(I&&(d=d?d+" "+I:I),C){for(var B in C)if(C[B])d=d?d+" "+B:B;else if(d.length)for(var E=B.length,h=0;(h=d.indexOf(B,h))>=0;){var u=h+E;h!==0&&!HoA.includes(d[h-1])||u!==d.length&&!HoA.includes(d[u])?h=u:d=(h===0?"":d.substring(0,h))+d.substring(u+1)}}return d===""?null:d}(A,i,o);s==null?t.removeAttribute("class"):e?t.className=s:t.setAttribute("class",s),t.__className=A}else if(o&&n!==o)for(var a in o){var c=!!o[a];n!=null&&c===!!n[a]||t.classList.toggle(a,c)}return o}function YN(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},A=arguments.length>2?arguments[2]:void 0,i=arguments.length>3?arguments[3]:void 0;for(var n in A){var o=A[n];e[n]!==o&&(A[n]==null?t.style.removeProperty(n):t.style.setProperty(n,o,i))}}function Ll(t,e,A,i){if(t.__style!==e){var n=function(o,r){if(r){var s,a,c="";if(Array.isArray(r)?(s=r[0],a=r[1]):s=r,o){o=String(o).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var l=!1,I=0,C=!1,d=[];s&&d.push(...Object.keys(s).map(KN)),a&&d.push(...Object.keys(a).map(KN));for(var B=0,E=-1,h=o.length,u=0;u2&&arguments[2]!==void 0&&arguments[2];if(t.multiple){if(e==null)return;if(!mQ(e))return void console.warn("https://svelte.dev/e/select_multiple_invalid_value");for(var i of t.options)i.selected=e.includes(OoA(i))}else{for(i of t.options)if(eGA(OoA(i),e))return void(i.selected=!0);A&&e===void 0||(t.selectedIndex=-1)}}function uGA(t){var e=new MutationObserver(()=>{E_(t,t.__value)});e.observe(t,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),H_(()=>{e.disconnect()})}function OoA(t){return"__value"in t?t.__value:t.value}var eQ=Symbol("class"),x3=Symbol("style"),SsA=Symbol("is custom element"),RsA=Symbol("is html");function VC(t,e){var A=P_(t);A.value!==(A.value=e??void 0)&&(t.value!==e||e===0&&t.nodeName==="PROGRESS")&&(t.value=e??"")}function En(t,e,A,i){var n=P_(t);n[e]!==(n[e]=A)&&(e==="loading"&&(t[$_A]=A),A==null?t.removeAttribute(e):typeof A!="string"&&xsA(t).includes(e)?t[e]=A:t.setAttribute(e,A))}function fGA(t,e,A,i){var n,o=P_(t),r=o[SsA],s=!o[RsA],a=e||{},c=t.tagName==="OPTION";for(var l in e)l in A||(A[l]=null);A.class?A.class=Z1(A.class):(i||A[eQ])&&(A.class=null),A[x3]&&((n=A.style)!==null&&n!==void 0||(A.style=null));var I,C,d,B,E,h,u=xsA(t),D=function(R){var w=A[R];if(c&&R==="value"&&w==null)return t.value=t.__value="",a[R]=w,0;if(R==="class")return I=t.namespaceURI==="http://www.w3.org/1999/xhtml",Vt(t,I,w,i,e?.[eQ],A[eQ]),a[R]=w,a[eQ]=A[eQ],0;if(R==="style")return Ll(t,w,e?.[x3],A[x3]),a[R]=w,a[x3]=A[x3],0;if(w===(C=a[R])&&(w!==void 0||!t.hasAttribute(R))||(a[R]=w,(d=R[0]+R[1])==="$$"))return 0;if(d==="on"){var _={},K="$$"+R,z=R.slice(2);if(B=function(QA){return cGA.includes(QA)}(z),function(QA){return QA.endsWith("capture")&&QA!=="gotpointercapture"&&QA!=="lostpointercapture"}(z)&&(z=z.slice(0,-7),_.capture=!0),!B&&C){if(w!=null)return 0;t.removeEventListener(z,a[K],_),a[K]=null}if(w!=null)if(B)t["__".concat(z)]=w,of([z]);else{let QA=function(BA){a[R].call(this,BA)};var gA=QA;a[K]=DsA(z,t,QA,_)}else B&&(t["__".concat(z)]=void 0)}else if(R==="style")En(t,R,w);else if(R==="autofocus")(function(QA,BA){if(BA){var lA=document.body;QA.autofocus=!0,Fy(()=>{document.activeElement===lA&&QA.focus()})}})(t,!!w);else if(r||R!=="__value"&&(R!=="value"||w==null))if(R==="selected"&&c)(function(QA,BA){BA?QA.hasAttribute("selected")||QA.setAttribute("selected",""):QA.removeAttribute("selected")})(t,w);else if(E=R,s||(E=function(QA){var BA;return QA=QA.toLowerCase(),(BA=lGA[QA])!==null&&BA!==void 0?BA:QA}(E)),h=E==="defaultValue"||E==="defaultChecked",w!=null||r||h)h||u.includes(E)&&(r||typeof w!="string")?t[E]=w:typeof w!="function"&&En(t,E,w);else if(o[R]=null,E==="value"||E==="checked"){var U=t,H=e===void 0;if(E==="value"){var q=U.defaultValue;U.removeAttribute(E),U.defaultValue=q,U.value=U.__value=H?q:null}else{var j=U.defaultChecked;U.removeAttribute(E),U.defaultChecked=j,U.checked=!!H&&j}}else t.removeAttribute(R);else t.value=t.__value=w};for(var L in A)D(L);return a}function ry(t,e){var A=arguments.length>3?arguments[3]:void 0,i=arguments.length>4&&arguments[4]!==void 0&&arguments[4],n=arguments.length>5&&arguments[5]!==void 0?arguments[5]:wQ,o=(arguments.length>2&&arguments[2]!==void 0?arguments[2]:[]).map(n),r=void 0,s={},a=t.nodeName==="SELECT",c=!1;if(eI(()=>{var I=e(...o.map(g)),C=fGA(t,r,I,A,i);for(var d of(c&&a&&"value"in I&&E_(t,I.value),Object.getOwnPropertySymbols(s)))I[d]||jc(s[d]);for(var B of Object.getOwnPropertySymbols(I)){var E=I[B];B.description!=="@attach"||r&&E===r[B]||(s[B]&&jc(s[B]),s[B]=Vg(()=>hGA(t,()=>E))),C[B]=E}r=C}),a){var l=t;es(()=>{E_(l,r.value,!0),uGA(l)})}c=!0}function P_(t){var e;return(e=t.__attributes)!==null&&e!==void 0?e:t.__attributes={[SsA]:t.nodeName.includes("-"),[RsA]:t.namespaceURI==="http://www.w3.org/1999/xhtml"}}var PoA=new Map;function xsA(t){var e,A=PoA.get(t.nodeName);if(A)return A;PoA.set(t.nodeName,A=[]);for(var i=t,n=Element.prototype;n!==i;){for(var o in e=PrA(i))e[o].set&&A.push(o);i=K_(i)}return A}function By(t,e){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e,i=pQ();aGA(t,"input",n=>{var o=n?t.defaultValue:t.value;if(o=JN(t)?TN(o):o,A(o),i&&o!==(o=e())){var r=t.selectionStart,s=t.selectionEnd;t.value=o??"",s!==null&&(t.selectionStart=r,t.selectionEnd=Math.min(s,t.value.length))}}),nA(e)==null&&t.value&&A(JN(t)?TN(t.value):t.value),tf(()=>{var n=e();JN(t)&&n===TN(t.value)||(t.type!=="date"||n||t.value)&&n!==t.value&&(t.value=n??"")})}function JN(t){var e=t.type;return e==="number"||e==="range"}function TN(t){return t===""?null:+t}function zt(t,e,A){var i=$0(t,e);i&&i.set&&(t[e]=A,H_(()=>{t[e]=null}))}function joA(t,e){return t===e||t?.[Og]===e}function Co(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=arguments.length>1?arguments[1]:void 0,A=arguments.length>2?arguments[2]:void 0;return es(()=>{var i,n;return tf(()=>{i=n,n=[],nA(()=>{t!==A(...n)&&(e(t,...n),i&&joA(A(...i),t)&&e(null,...i))})}),()=>{Fy(()=>{n&&joA(A(...n),t)&&e(null,...n)})}}),t}function j0(t){return function(){for(var e=arguments.length,A=new Array(e),i=0;i0&&arguments[0]!==void 0&&arguments[0],e=qn,A=e.l.u;if(A){var i,n=()=>k(e.s);if(t){var o=0,r={},s=wQ(()=>{var a=!1,c=e.s;for(var l in c)c[l]!==r[l]&&(r[l]=c[l],a=!0);return a&&o++,o});n=()=>g(s)}A.b.length&&(i=()=>{qoA(e,n),gy(A.b)},osA(),AI(2097160,i,!0)),I_(()=>{var a=nA(()=>A.m.map(V_A));return()=>{for(var c of a)typeof c=="function"&&c()}}),A.a.length&&I_(()=>{qoA(e,n),gy(A.a)})}}function qoA(t,e){if(t.l.s)for(var A of t.l.s)g(A);e()}function Gy(t){var e=jC(0);return function(){return arguments.length===1?(y(e,g(e)+1),arguments[0]):(g(e),t())}}function N3(t,e){var A,i=(A=t.$$events)===null||A===void 0?void 0:A[e.type],n=mQ(i)?i.slice():i==null?[]:[i];for(var o of n)o.call(this,e)}var OD=!1,mGA={get(t,e){if(!t.exclude.includes(e))return g(t.version),e in t.special?t.special[e]():t.props[e]},set(t,e,A){if(!(e in t.special)){var i=Vn;try{V1(t.parent_effect),t.special[e]=b({get[e](){return t.props[e]}},e,4)}finally{V1(i)}}return t.special[e](A),GoA(t.version),!0},getOwnPropertyDescriptor(t,e){if(!t.exclude.includes(e))return e in t.props?{enumerable:!0,configurable:!0,value:t.props[e]}:void 0},deleteProperty:(t,e)=>(t.exclude.includes(e)||(t.exclude.push(e),GoA(t.version)),!0),has:(t,e)=>!t.exclude.includes(e)&&e in t.props,ownKeys:t=>Reflect.ownKeys(t.props).filter(e=>!t.exclude.includes(e))};function PD(t,e){return new Proxy({props:t,exclude:e,special:{},version:jC(0),parent_effect:Vn},mGA)}var pGA={get(t,e){for(var A=t.props.length;A--;){var i=t.props[A];if(R3(i)&&(i=i()),typeof i=="object"&&i!==null&&e in i)return i[e]}},set(t,e,A){for(var i=t.props.length;i--;){var n=t.props[i];R3(n)&&(n=n());var o=$0(n,e);if(o&&o.set)return o.set(A),!0}return!1},getOwnPropertyDescriptor(t,e){for(var A=t.props.length;A--;){var i=t.props[A];if(R3(i)&&(i=i()),typeof i=="object"&&i!==null&&e in i){var n=$0(i,e);return n&&!n.configurable&&(n.configurable=!0),n}}},has(t,e){if(e===Og||e===qrA)return!1;for(var A of t.props)if(R3(A)&&(A=A()),A!=null&&e in A)return!0;return!1},ownKeys(t){var e=[];for(var A of t.props)if(R3(A)&&(A=A()),A){for(var i in A)e.includes(i)||e.push(i);for(var n of Object.getOwnPropertySymbols(A))e.includes(n)||e.push(n)}return e}};function z1(){for(var t=arguments.length,e=new Array(t),A=0;A(l&&(l=!1,c=a?nA(i):i),c);if(s){var C,d,B=Og in t||qrA in t;n=(C=(d=$0(t,e))===null||d===void 0?void 0:d.set)!==null&&C!==void 0?C:B&&e in t?w=>t[e]=w:void 0}var E,h=!1;if(s?[o,h]=function(w){var _=OD;try{return OD=!1,[w(),OD]}finally{OD=_}}(()=>t[e]):o=t[e],o===void 0&&i!==void 0&&(o=I(),n&&(r&&function(){throw new Error("https://svelte.dev/e/props_invalid_value")}(),n(o))),E=r?()=>{var w=t[e];return w===void 0?I():(l=!0,w)}:()=>{var w=t[e];return w!==void 0&&(c=void 0),w===void 0?c:w},r&&!(4&A))return E;if(n){var u=t.$$legacy;return function(w,_){return arguments.length>0?(r&&_&&!u&&!h||n(_?E():w),w):E()}}var D=!1,L=(1&A?wQ:qA)(()=>(D=!1,E()));s&&g(L);var R=Vn;return function(w,_){if(arguments.length>0){var K=_?g(L):r&&s?iQ(w):w;return y(L,K),D=!0,c!==void 0&&(c=K),w}return j1&&D||(R.f&Y_)!==0?L.v:g(L)}}function Sr(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:function(i){var n=function(o){try{if(typeof window<"u"&&window.localStorage!==void 0)return window.localStorage[o]}catch{}}("debug");return n!=null&&n.endsWith("*")?i.startsWith(n.slice(0,-1)):i===n}(t);if(!e)return wGA;var A=function(i){for(var n=0,o=0;o9466848e5&&isFinite(t)&&Math.floor(t)===t&&!isNaN(new Date(t).valueOf());if(typeof t=="bigint")return Q_(Number(t));try{var e=t&&t.valueOf();if(e!==t)return Q_(e)}catch{return!1}return!1}function LsA(t){(jD=jD||window.document.createElement("div")).style.color="",jD.style.color=t;var e=jD.style.color;return e!==""?e.replace(/\s+/g,"").toLowerCase():void 0}var jD=void 0;function bGA(t){return typeof t=="string"&&t.length<99&&!!LsA(t)}function q_(t,e){if(typeof t=="number"||typeof t=="string"||typeof t=="boolean"||t===void 0)return typeof t;if(typeof t=="bigint")return"number";if(t===null)return"null";if(Array.isArray(t))return"array";if(Cn(t))return"object";var A=e.stringify(t);return A&&j_(A)?"number":A==="true"||A==="false"?"boolean":A==="null"?"null":"unknown"}var MGA=/^https?:\/\/\S+$/;function Uy(t){return typeof t=="string"&&MGA.test(t)}function DQ(t,e){if(t==="")return"";var A=t.trim();return A==="null"?null:A==="true"||A!=="false"&&(j_(A)?e.parse(A):t)}var kGA=[];function ZoA(t,e){if(t.length!==e.length)return!1;for(var A=0;A1&&arguments[1]!==void 0&&arguments[1],A={};if(!Array.isArray(t))throw new TypeError("Array expected");function i(r,s){(!Array.isArray(r)&&!Cn(r)||e&&s.length>0)&&(A[Ct(s)]=!0),Cn(r)&&Object.keys(r).forEach(a=>{i(r[a],s.concat(a))})}for(var n=Math.min(t.length,1e4),o=0;oe?t.slice(0,e):t}function WoA(t){return fe({},t)}function XoA(t){return Object.values(t)}function $oA(t,e,A,i){var n=t.slice(0),o=n.splice(e,A);return n.splice.apply(n,[e+i,0,...o]),n}function SGA(t,e,A){return t.slice(0,e).concat(A).concat(t.slice(e))}function rf(t,e){try{return e.parse(t)}catch{return e.parse(Rc(t))}}function NsA(t,e){try{return rf(t,e)}catch{return}}function sf(t,e){t=t.replace(GsA,"");try{return e(t)}catch{}try{return e("{"+t+"}")}catch{}try{return e("["+t+"]")}catch{}throw new Error("Failed to parse partial JSON")}function _sA(t){t=t.replace(GsA,"");try{return Rc(t)}catch{}try{var e=Rc("["+t+"]");return e.substring(1,e.length-1)}catch{}try{var A=Rc("{"+t+"}");return A.substring(1,A.length-1)}catch{}throw new Error("Failed to repair partial JSON")}var GsA=/,\s*$/;function dQ(t,e){var A=erA.exec(e);if(A){var i=ts(A[2]),n=function(d,B){for(var E=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,h=arguments.length>3&&arguments[3]!==void 0?arguments[3]:d.length,u=0,D=E;D"line ".concat(n+1," column ").concat(o+1))}}var r=FGA.exec(e),s=r?ts(r[1]):void 0,a=s!==void 0?s-1:void 0,c=NGA.exec(e),l=c?ts(c[1]):void 0,I=l!==void 0?l-1:void 0,C=a!==void 0&&I!==void 0?function(d,B,E){for(var h=d.indexOf(` -`),u=1;u1&&arguments[1]!==void 0?arguments[1]:void 0,A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:JSON;return H3(t)?t:{text:A.stringify(t.json,null,e)}}function ArA(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:JSON;return z3(t)?t:{json:e.parse(t.text)}}function u_(t,e,A){return RGA(t,e,A).text}function xGA(t,e){return LGA(t,e)>e}function LGA(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1/0;if(H3(t))return t.text.length;var A=t.json,i=0;return function n(o){if(Array.isArray(o)){if((i+=o.length-1+2)>e)return;for(var r=0;re)return}else if(Cn(o)){var s=Object.keys(o);i+=2+s.length+(s.length-1);for(var a=0;aKsA(TsA(String(t))),unescapeValue:t=>HsA(YsA(t))},UGA={escapeValue:t=>TsA(String(t)),unescapeValue:t=>HsA(t)},KGA={escapeValue:t=>KsA(String(t)),unescapeValue:t=>YsA(t)},YGA={escapeValue:t=>String(t),unescapeValue:t=>t};function KsA(t){return t.replace(/[^\x20-\x7F]/g,e=>{var A;return e==="\b"||e==="\f"||e===` -`||e==="\r"||e===" "?e:"\\u"+("000"+((A=e.codePointAt(0))===null||A===void 0?void 0:A.toString(16))).slice(-4)})}function YsA(t){return t.replace(/\\u[a-fA-F0-9]{4}/g,e=>{try{var A=JSON.parse('"'+e+'"');return JsA[A]||A}catch{return e}})}var JsA={'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r"," ":"\\t"},JGA={'\\"':'"',"\\\\":"\\","\\/":"/","\\b":"\b","\\f":"\f","\\n":` -`,"\\r":"\r","\\t":" "};function TsA(t){return t.replace(/["\b\f\n\r\t\\]/g,e=>JsA[e]||e)}function HsA(t){return t.replace(/\\["bfnrt\\]/g,e=>JGA[e]||e)}function BQ(t){return typeof t!="string"?String(t):t.endsWith(` -`)?t+` -`:t}function zsA(t,e){return yQ(t,A=>A.nodeName.toUpperCase()===e.toUpperCase())}function Y1(t,e,A){return yQ(t,i=>function(n,o,r){return typeof n.getAttribute=="function"&&n.getAttribute(o)===r}(i,e,A))}function yQ(t,e){return!!Z_(t,e)}function Z_(t,e){for(var A=t;A&&!e(A);)A=A.parentNode;return A}function af(t){var e,A;return(e=t==null||(A=t.ownerDocument)===null||A===void 0?void 0:A.defaultView)!==null&&e!==void 0?e:void 0}function W_(t){var e=af(t),A=e?.document.activeElement;return!!A&&yQ(A,i=>i===t)}function OsA(t,e){return Z_(t,A=>A.nodeName===e)}function zN(t){return Y1(t,"data-type","selectable-key")?Ln.key:Y1(t,"data-type","selectable-value")?Ln.value:Y1(t,"data-type","insert-selection-area-inside")?Ln.inside:Y1(t,"data-type","insert-selection-area-after")?Ln.after:Ln.multi}function sy(t){return encodeURIComponent(Ct(t))}function PsA(t){var e,A=Z_(t,n=>!(n==null||!n.hasAttribute)&&n.hasAttribute("data-path")),i=(e=A?.getAttribute("data-path"))!==null&&e!==void 0?e:void 0;return i?ks(decodeURIComponent(i)):void 0}function TGA(t){var{allElements:e,currentElement:A,direction:i,hasPrio:n=()=>!0,margin:o=10}=t,r=FS(e.filter(function(u){var D=u.getBoundingClientRect();return D.width>0&&D.height>0}),a),s=a(A);function a(u){var D=u.getBoundingClientRect();return{x:D.left+D.width/2,y:D.top+D.height/2,rect:D,element:u}}function c(u,D){var L=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,R=u.x-D.x,w=(u.y-D.y)*L;return Math.sqrt(R*R+w*w)}var l=u=>c(u,s);if(i==="Left"||i==="Right"){var I=i==="Left"?r.filter(u=>{return D=s,u.rect.left+o{return D=s,u.rect.right>D.rect.right+o;var D}),C=I.filter(u=>{return D=u,L=s,Math.abs(D.y-L.y)c(u,s,10));return d?.element}if(i==="Up"||i==="Down"){var B=i==="Up"?r.filter(u=>{return D=s,u.y+o{return D=s,u.y>D.y+o;var D}),E=B.filter(u=>n(u.element)),h=rE(E,l)||rE(B,l);return h?.element}}function X_(){var t,e,A,i;return typeof navigator<"u"&&(t=(e=(A=navigator)===null||A===void 0||(A=A.platform)===null||A===void 0?void 0:A.toUpperCase().includes("MAC"))!==null&&e!==void 0?e:(i=navigator)===null||i===void 0||(i=i.userAgentData)===null||i===void 0||(i=i.platform)===null||i===void 0?void 0:i.toUpperCase().includes("MAC"))!==null&&t!==void 0&&t}function n2(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"+",A=[];$_(t,arguments.length>2&&arguments[2]!==void 0?arguments[2]:X_)&&A.push("Ctrl"),t.altKey&&A.push("Alt"),t.shiftKey&&A.push("Shift");var i=t.key.length===1?t.key.toUpperCase():t.key;return i in HGA||A.push(i),A.join(e)}function $_(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:X_;return t.ctrlKey||t.metaKey&&e()}var HGA={Ctrl:!0,Command:!0,Control:!0,Alt:!0,Option:!0,Shift:!0};function Jt(t,e){e===void 0&&(e={});var A=e.insertAt;if(t&&typeof document<"u"){var i=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",A==="top"&&i.firstChild?i.insertBefore(n,i.firstChild):i.appendChild(n),n.styleSheet?n.styleSheet.cssText=t:n.appendChild(document.createTextNode(t))}}Jt(`.jse-absolute-popup.svelte-1r8q3m8 { - position: relative; - left: 0; - top: 0; - width: 0; - height: 0; - z-index: 1001; -} -.jse-absolute-popup.svelte-1r8q3m8 .jse-hidden-input:where(.svelte-1r8q3m8) { - position: fixed; - left: 0; - top: 0; - width: 0; - height: 0; - padding: 0; - margin: 0; - border: none; - outline: none; - overflow: hidden; -} -.jse-absolute-popup.svelte-1r8q3m8 .jse-absolute-popup-content:where(.svelte-1r8q3m8) { - position: absolute; -}`);var zGA=wA('
      '),OGA=wA('
      ');function PGA(t,e){mt(e,!1);var A=b(e,"popup",8),i=b(e,"closeAbsolutePopup",8),n=$(),o=$();function r(I){A().options&&A().options.closeOnOuterClick&&!yQ(I.target,C=>C===g(n))&&i()(A().id)}function s(I){n2(I)==="Escape"&&(I.preventDefault(),I.stopPropagation(),i()(A().id))}hs(function(){g(o)&&g(o).focus()}),Zt();var a=OGA();ce("mousedown",A2,function(I){r(I)},!0),ce("keydown",A2,s,!0),ce("wheel",A2,function(I){r(I)},!0);var c=W(a),l=I=>{var C=zGA(),d=W(C);Co(d,B=>y(o,B),()=>g(o)),MsA(IA(d,2),()=>A().component,(B,E)=>{E(B,z1(()=>A().props))}),De(B=>Ll(C,B),[()=>(g(n),k(A()),nA(()=>function(B,E){var h=B.getBoundingClientRect(),{left:u,top:D,positionAbove:L,positionLeft:R}=function(){if(E.anchor){var{anchor:w,width:_=0,height:K=0,offsetTop:z=0,offsetLeft:U=0,position:H}=E,{left:q,top:j,bottom:gA,right:QA}=w.getBoundingClientRect(),BA=H==="top"||j+K>window.innerHeight&&j>K,lA=H==="left"||q+_>window.innerWidth&&q>_;return{left:lA?QA-U:q+U,top:BA?j-z:gA+z,positionAbove:BA,positionLeft:lA}}if(typeof E.left=="number"&&typeof E.top=="number"){var{left:vA,top:tA,width:cA=0,height:pA=0}=E;return{left:vA,top:tA,positionAbove:tA+pA>window.innerHeight&&tA>pA,positionLeft:vA+cA>window.innerWidth&&vA>cA}}throw new Error('Invalid config: pass either "left" and "top", or pass "anchor"')}();return(L?"bottom: ".concat(h.top-D,"px;"):"top: ".concat(D-h.top,"px;"))+(R?"right: ".concat(h.left-u,"px;"):"left: ".concat(u-h.left,"px;"))}(g(n),A().options)))],qA),iA(I,C)};LA(c,I=>{g(n)&&I(l)}),Co(a,I=>y(n,I),()=>g(n)),ce("mousedown",a,function(I){I.stopPropagation()}),ce("keydown",a,s),iA(t,a),pt()}var jGA=wA(" ",1);function f_(t,e){mt(e,!1);var A,i,n=Sr("jsoneditor:AbsolutePopup"),o=$([],!0);function r(c){var l=g(o).findIndex(C=>C.id===c);if(l!==-1){var I=g(o)[l];I.options.onClose&&I.options.onClose(),y(o,g(o).filter(C=>C.id!==c))}}A="absolute-popup",i={openAbsolutePopup:function(c,l,I){n("open...",l,I);var C={id:nQ(),component:c,props:l||{},options:I||{}};return y(o,[...g(o),C]),C.id},closeAbsolutePopup:r},XrA().set(A,i),fA(()=>g(o),()=>{n("popups",g(o))}),Qn(),Zt(!0);var s=jGA(),a=vt(s);qo(a,1,()=>g(o),or,(c,l)=>{PGA(c,{get popup(){return g(l)},closeAbsolutePopup:r})}),jo(IA(a,2),e,"default",{},null),iA(t,s),pt()}function cf(t,e){for(var A=new Set(e),i=t.replace(/ \(copy( \d+)?\)$/,""),n=t,o=1;A.has(n);){var r="copy"+(o>1?" "+o:"");n="".concat(i," (").concat(r,")"),o++}return n}function V0(t,e){var A=e-3;return t.length>e?t.substring(0,A)+"...":t}function qGA(t){if(t==="")return"";var e=t.toLowerCase();if(e==="null")return null;if(e==="true")return!0;if(e==="false")return!1;if(e!=="undefined"){var A=Number(t),i=parseFloat(t);return isNaN(A)||isNaN(i)?t:A}}var VGA={id:"jsonquery",name:"JSONQuery",description:` -

      - Enter a JSON Query function to filter, sort, or transform the data. - You can use functions like get, filter, - sort, pick, groupBy, uniq, etcetera. - Example query: filter(.age >= 18) -

      -`,createQuery:function(t,e){var{filter:A,sort:i,projection:n}=e,o=[];A&&A.path&&A.relation&&A.value&&o.push(["filter",[(r=A.relation,HS("1 ".concat(r," 1"))[0]),qD(A.path),qGA(A.value)]]);var r;return i&&i.path&&i.direction&&o.push(["sort",qD(i.path),i.direction==="desc"?"desc":"asc"]),n&&n.paths&&(n.paths.length>1?o.push(["pick",...n.paths.map(qD)]):o.push(["map",qD(n.paths[0])])),SW(["pipe",...o])},executeQuery:function(t,e,A){var i=UsA(A,JSON)?t:function(n){var o=A.stringify(n);return o!==void 0?JSON.parse(o):void 0}(t);return e.trim()!==""?RW(i,e):i}};function qD(t){return["get",...t]}var ZGA=tI("");function WGA(t,e){mt(e,!1);var A=870711,i=$(""),n=b(e,"data",8);function o(s){if(!s||!s.raw)return"";var a=s.raw,c={};return a=a.replace(/\s(?:xml:)?id=["']?([^"')\s]+)/g,(l,I)=>{var C="fa-".concat((A+=1).toString(16));return c[I]=C,' id="'.concat(C,'"')}),a=a.replace(/#(?:([^'")\s]+)|xpointer\(id\((['"]?)([^')]+)\2\)\))/g,(l,I,C,d)=>{var B=I||d;return B&&c[B]?"#".concat(c[B]):l}),a}fA(()=>k(n()),()=>{y(i,o(n()))}),Qn();var r=ZGA();bsA(W(r),()=>g(i),!0),iA(t,r),pt()}Jt(` - .fa-icon.svelte-1mc5hvj { - display: inline-block; - fill: currentColor; - } - .fa-flip-horizontal.svelte-1mc5hvj { - transform: scale(-1, 1); - } - .fa-flip-vertical.svelte-1mc5hvj { - transform: scale(1, -1); - } - .fa-spin.svelte-1mc5hvj { - animation: svelte-1mc5hvj-fa-spin 1s 0s infinite linear; - } - .fa-inverse.svelte-1mc5hvj { - color: #fff; - } - .fa-pulse.svelte-1mc5hvj { - animation: svelte-1mc5hvj-fa-spin 1s infinite steps(8); - } - @keyframes svelte-1mc5hvj-fa-spin { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } - } -`);var XGA=tI(""),$GA=tI(""),AUA=tI(""),eUA=tI("",1);function ji(t,e){var A=PD(e,["children","$$slots","$$events","$$legacy"]),i=PD(A,["class","data","scale","spin","inverse","pulse","flip","label","style"]);mt(e,!1);var n=b(e,"class",8,""),o=b(e,"data",8),r=$(),s=b(e,"scale",8,1),a=b(e,"spin",8,!1),c=b(e,"inverse",8,!1),l=b(e,"pulse",8,!1),I=b(e,"flip",8,void 0),C=b(e,"label",8,""),d=b(e,"style",8,""),B=$(10),E=$(10),h=$(),u=$();function D(){var R=1;return s()!==void 0&&(R=Number(s())),isNaN(R)||R<=0?(console.warn('Invalid prop: prop "scale" should be a number over 0.'),1):1*R}function L(){return g(r)?Math.max(g(r).width,g(r).height)/16:1}fA(()=>(k(o()),k(d()),k(s())),()=>{y(r,function(R){var w;if(R){if(!("definition"in R)){if("iconName"in R&&"icon"in R){R.iconName;var[_,K,,,z]=R.icon;w={width:_,height:K,paths:(Array.isArray(z)?z:[z]).map(U=>({d:U}))}}else w=R[Object.keys(R)[0]];return w}console.error("`import faIconName from '@fortawesome/package-name/faIconName` not supported - Please use `import { faIconName } from '@fortawesome/package-name/faIconName'` instead")}}(o())),d(),s(),y(B,g(r)?g(r).width/L()*D():0),y(E,g(r)?g(r).height/L()*D():0),y(h,function(){var R="";d()!==null&&(R+=d());var w=D();return w===1?R.length===0?"":R:(R===""||R.endsWith(";")||(R+="; "),"".concat(R,"font-size: ").concat(w,"em"))}()),y(u,g(r)?"0 0 ".concat(g(r).width," ").concat(g(r).height):"0 0 ".concat(g(B)," ").concat(g(E)))}),Qn(),Zt(),function(R,w){var _=PD(w,["children","$$slots","$$events","$$legacy"]),K=PD(_,["class","width","height","box","spin","inverse","pulse","flip","style","label"]),z=b(w,"class",8,""),U=b(w,"width",8),H=b(w,"height",8),q=b(w,"box",8,"0 0 0 0"),j=b(w,"spin",8,!1),gA=b(w,"inverse",8,!1),QA=b(w,"pulse",8,!1),BA=b(w,"flip",8,"none"),lA=b(w,"style",8,""),vA=b(w,"label",8,""),tA=XGA();ry(tA,cA=>{var pA;return fe(fe({version:"1.1",class:"fa-icon ".concat((pA=z())!==null&&pA!==void 0?pA:""),width:U(),height:H(),"aria-label":vA(),role:vA()?"img":"presentation",viewBox:q(),style:lA()},K),{},{[eQ]:cA})},[()=>({"fa-spin":j(),"fa-pulse":QA(),"fa-inverse":gA(),"fa-flip-horizontal":BA()==="horizontal","fa-flip-vertical":BA()==="vertical"})],"svelte-1mc5hvj"),jo(W(tA),w,"default",{},null),iA(R,tA)}(t,z1({get label(){return C()},get width(){return g(B)},get height(){return g(E)},get box(){return g(u)},get style(){return g(h)},get spin(){return a()},get flip(){return I()},get inverse(){return c()},get pulse(){return l()},get class(){return n()}},()=>i,{children:(R,w)=>{var _=_o();jo(vt(_),e,"default",{},K=>{var z=eUA(),U=vt(z);qo(U,1,()=>(g(r),nA(()=>{var gA;return((gA=g(r))===null||gA===void 0?void 0:gA.paths)||[]})),or,(gA,QA)=>{var BA=$GA();ry(BA,()=>fe({},g(QA))),iA(gA,BA)});var H=IA(U);qo(H,1,()=>(g(r),nA(()=>{var gA;return((gA=g(r))===null||gA===void 0?void 0:gA.polygons)||[]})),or,(gA,QA)=>{var BA=AUA();ry(BA,()=>fe({},g(QA))),iA(gA,BA)});var q=IA(H),j=gA=>{WGA(gA,{get data(){return g(r)},set data(QA){y(r,QA)},$$legacy:!0})};LA(q,gA=>{g(r),nA(()=>{var QA;return(QA=g(r))===null||QA===void 0?void 0:QA.raw})&&gA(j)}),iA(K,z)}),iA(R,_)},$$slots:{default:!0}})),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-boolean-toggle.svelte-1ryp01u { - padding: 0; - margin: 1px 0 0; - vertical-align: top; - display: inline-flex; - color: var(--jse-value-color-boolean, #ff8c00); -} - -.jse-boolean-toggle.svelte-1ryp01u:not(.jse-readonly) { - cursor: pointer; -}`);var tUA=wA('
      ');function iUA(t,e){mt(e,!1);var A=b(e,"path",9),i=b(e,"value",9),n=b(e,"readOnly",9),o=b(e,"onPatch",9),r=b(e,"focus",9);Zt(!0);var s,a=tUA(),c=W(a),l=qA(()=>i()===!0?zS:OS);ji(c,{get data(){return g(l)}}),De(I=>{En(a,"aria-checked",i()===!0),s=Vt(a,1,"jse-boolean-toggle svelte-1ryp01u",null,s,I),En(a,"title",n()?"Boolean value ".concat(i()):"Click to toggle this boolean value")},[()=>({"jse-readonly":n()})],qA),ce("mousedown",a,function(I){I.stopPropagation(),n()||(o()([{op:"replace",path:Ct(A()),value:!i()}]),r()())}),iA(t,a),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-color-picker-popup.svelte-s1wu8v .picker_wrapper.popup, -.jse-color-picker-popup.svelte-s1wu8v .picker_wrapper.popup .picker_arrow::before, -.jse-color-picker-popup.svelte-s1wu8v .picker_wrapper.popup .picker_arrow::after { - background: var(--jse-color-picker-background, var(--jse-panel-background, #ebebeb)); - line-height: normal; -} -.jse-color-picker-popup.svelte-s1wu8v .picker_slider, -.jse-color-picker-popup.svelte-s1wu8v .picker_sl, -.jse-color-picker-popup.svelte-s1wu8v .picker_editor input, -.jse-color-picker-popup.svelte-s1wu8v .picker_sample, -.jse-color-picker-popup.svelte-s1wu8v .picker_done button { - box-shadow: var(--jse-color-picker-border-box-shadow, #cbcbcb 0 0 0 1px); -} -.jse-color-picker-popup.svelte-s1wu8v .picker_editor input { - background: var(--jse-background-color, #fff); - color: var(--jse-text-color, #4d4d4d); -} -.jse-color-picker-popup.svelte-s1wu8v .picker_done button { - background: var(--jse-button-background, #e0e0e0); - color: var(--jse-button-color, var(--jse-text-color, #4d4d4d)); -} -.jse-color-picker-popup.svelte-s1wu8v .picker_done button:hover { - background: var(--jse-button-background-highlight, #e7e7e7); -}`);var nUA=wA('
      ');function oUA(t,e){mt(e,!1);var A=b(e,"color",8),i=b(e,"onChange",8),n=b(e,"showOnTop",8),o=$(),r=()=>{};hs(Yt(function*(){var a,c=new((a=yield import("./chunk-TXJFAAIW.js"))===null||a===void 0?void 0:a.default)({parent:g(o),color:A(),popup:n()?"top":"bottom",onDone(l){var I=l.rgba[3]===1?l.hex.substring(0,7):l.hex;i()(I)}});c.show(),r=()=>{c.destroy()}})),qc(()=>{r()}),Zt();var s=nUA();Co(s,a=>y(o,a),()=>g(o)),iA(t,s),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-color-picker-button.svelte-xeg9n6 { - font-size: var(--jse-font-size-mono, 14px); - width: var(--jse-color-picker-button-size, 1em); - height: var(--jse-color-picker-button-size, 1em); - box-sizing: border-box; - padding: 0; - margin: 2px 0 0 calc(0.5 * var(--jse-padding, 10px)); - display: inline-flex; - vertical-align: top; - border: 1px solid var(--jse-text-color, #4d4d4d); - border-radius: 2px; - background: inherit; - outline: none; -} - -.jse-color-picker-button.svelte-xeg9n6:not(.jse-readonly) { - cursor: pointer; -}`);var rUA=wA('');function sUA(t,e){mt(e,!1);var A=$(void 0,!0),i=$(void 0,!0),{openAbsolutePopup:n}=$1("absolute-popup"),o=b(e,"path",9),r=b(e,"value",9),s=b(e,"readOnly",9),a=b(e,"onPatch",9),c=b(e,"focus",9);function l(B){a()([{op:"replace",path:Ct(o()),value:B}]),I()}function I(){c()()}fA(()=>k(r()),()=>{y(A,LsA(r()))}),fA(()=>(k(s()),k(r())),()=>{y(i,s()?"Color ".concat(r()):"Click to open a color picker")}),Qn(),Zt(!0);var C,d=rUA();De(B=>{var E;C=Vt(d,1,"jse-color-picker-button svelte-xeg9n6",null,C,B),Ll(d,"background: ".concat((E=g(A))!==null&&E!==void 0?E:"")),En(d,"title",g(i)),En(d,"aria-label",g(i))},[()=>({"jse-readonly":s()})],qA),ce("click",d,function(B){var E,h;if(!s()){var u=B.target,D=u.getBoundingClientRect().top,L=((E=(h=af(u))===null||h===void 0?void 0:h.innerHeight)!==null&&E!==void 0?E:0)-D<300&&D>300,R={color:r(),onChange:l,showOnTop:L};n(oUA,R,{anchor:u,closeOnOuterClick:!0,onClose:I,offsetTop:18,offsetLeft:-8,height:300})}}),iA(t,d),pt()}var ON=1e3,O3=100,VD=100,Qy=2e4,aQ=[{start:0,end:O3}],aUA=1048576,cUA=1048576,PN=10485760,jN="Insert or paste contents, enter [ insert a new array, enter { to insert a new object, or start typing to insert a new value",AG="Open context menu (Click here, right click on the selection, or use the context menu button or Ctrl+Q)",KC="hover-insert-inside",ZD="hover-insert-after",irA="hover-collection",qN="valid",nrA="repairable",Z0=336,W0=260,_3=100,orA={[Pc.asc]:"ascending",[Pc.desc]:"descending"};function jsA(t){for(var e=US(t,s=>s.start),A=[e[0]],i=0;i0&&arguments[0]!==void 0?arguments[0]:{expanded:!1};return{type:"array",expanded:t,visibleSections:aQ,items:[]}}function iG(){var{expanded:t}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{expanded:!1};return{type:"object",expanded:t,properties:{}}}var nG={createObjectDocumentState:iG,createArrayDocumentState:tG,createValueDocumentState:function(){return{type:"value"}}};function VsA(t,e,A,i){var{createObjectDocumentState:n,createArrayDocumentState:o,createValueDocumentState:r}=i;return function s(a,c,l){if(Array.isArray(a)){var I=Mr(c)?c:o();if(l.length===0)return I;var C=ts(l[0]),d=s(a[C],I.items[C],l.slice(1));return cs(I,["items",l[0]],d)}if(Cn(a)){var B=_a(c)?c:n();if(l.length===0)return B;var E=l[0],h=s(a[E],B.properties[E],l.slice(1));return cs(B,["properties",E],h)}return eG(c)?c:r()}(t,e,A)}function Qc(t,e){return P3(t,e,arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],(A,i)=>{if(A!==void 0&&i!==void 0)return Array.isArray(A)?Mr(i)?i:tG({expanded:!!ZC(i)&&i.expanded}):Cn(A)?_a(i)?i:iG({expanded:!!ZC(i)&&i.expanded}):eG(i)?i:void 0},()=>!0)}function P3(t,e,A,i,n){var o=i(t,e,A);if(Array.isArray(t)&&Mr(o)&&n(o)){var r=[];return oG(t,o.visibleSections,a=>{var c=A.concat(String(a)),l=P3(t[a],o.items[a],c,i,n);l!==void 0&&(r[a]=l)}),ZoA(r,o.items)?o:fe(fe({},o),{},{items:r})}if(Cn(t)&&_a(o)&&n(o)){var s={};return Object.keys(t).forEach(a=>{var c=A.concat(a),l=P3(t[a],o.properties[a],c,i,n);l!==void 0&&(s[a]=l)}),ZoA(Object.values(s),Object.values(o.properties))?o:fe(fe({},o),{},{properties:s})}return o}function oG(t,e,A){e.forEach(i=>{var{start:n,end:o}=i;FsA(n,Math.min(t.length,o),A)})}function j3(t,e){for(var A=t,i=[],n=0;n{var I=ZC(l)&&!l.expanded?fe(fe({},l),{},{expanded:!0}):l;return Mr(I)?function(C,d){if(function(h,u){return h.some(D=>u>=D.start&&ufunction(c,l,I,C){return P3(c,l,I,(d,B,E)=>Array.isArray(d)&&C(E)?Mr(B)?B.expanded?B:fe(fe({},B),{},{expanded:!0}):tG({expanded:!0}):Cn(d)&&C(E)?_a(B)?B.expanded?B:fe(fe({},B),{},{expanded:!0}):iG({expanded:!0}):B,d=>ZC(d)&&d.expanded)}(s,a,[],i))}function IrA(t,e,A,i){return EQ(t,e,A,(n,o)=>i?function(r,s,a){return P3(r,s,a,(c,l)=>CrA(l),()=>!0)}(n,o,A):CrA(o))}function CrA(t){return Mr(t)&&t.expanded?fe(fe({},t),{},{expanded:!1,visibleSections:aQ}):_a(t)&&t.expanded?fe(fe({},t),{},{expanded:!1}):t}function ZsA(t,e,A){var i={json:t,documentState:e},n=A.reduce((o,r)=>({json:Da(o.json,[r]),documentState:dUA(o.json,o.documentState,r)}),i);return{json:n.json,documentState:Qc(n.json,n.documentState)}}function dUA(t,e,A){if(lS(A))return drA(t,e,A,void 0);if(gS(A))return BrA(t,e,A);if(k8(A)){var i=ya(t,A.path),n=zg(t,e,i);return n?Ky(t,e,i,{type:"value",enforceString:n}):e}return S8(A)||j2(A)?function(o,r,s){if(j2(s)&&s.from===s.path)return r;var a=r,c=ya(o,s.from),l=Jg(o,a,c);return j2(s)&&(a=BrA(o,a,{path:s.from})),a=drA(o,a,{path:s.path},l),a}(t,e,A):e}function Jg(t,e,A){try{return Ke(e,j3(t,A))}catch{return}}function rG(t,e,A,i,n){var o=VsA(t,e,A,n);return Pu(o,j3(t,A),r=>{var s=Ke(t,A);return i(s,r)})}function Ky(t,e,A,i){return function(n,o,r,s,a){var c=VsA(n,o,r,a);return cs(c,j3(n,r),s)}(t,e,A,i,nG)}function EQ(t,e,A,i){return rG(t,e,A,i,nG)}function drA(t,e,A,i){var n=ya(t,A.path),o=e;return o=EQ(t,o,Fi(n),(r,s)=>{if(!Mr(s))return s;var a=ts(hi(n)),{items:c,visibleSections:l}=s;return fe(fe({},s),{},{items:a{if(!Mr(s))return s;var a=ts(hi(i)),{items:c,visibleSections:l}=s;return fe(fe({},s),{},{items:c.slice(0,a).concat(c.slice(a+1)),visibleSections:WsA(l,a,-1)})}):function(r,s,a){var c=j3(r,a);return Ms(s,c)?oC(s,j3(r,a)):s}(t,e,i)}function WsA(t,e,A){return function(i){for(var n=i.slice(0),o=1;o({start:i.start>e?i.start+A:i.start,end:i.end>e?i.end+A:i.end})))}function zg(t,e,A){var i,n=Ke(t,A),o=Jg(t,e,A),r=eG(o)?o.enforceString:void 0;return typeof r=="boolean"?r:typeof(i=n)=="string"&&typeof DQ(i,JSON)!="string"}function lf(t,e){var A=arguments.length>2&&arguments[2]!==void 0&&arguments[2],i=t.indexOf(e);return i!==-1?A?t.slice(i):t.slice(i+1):[]}function sG(t,e){var A=[];return function i(n,o,r){A.push(r),wo(n)&&Mr(o)&&o.expanded&&oG(n,o.visibleSections,s=>{i(n[s],o.items[s],r.concat(String(s)))}),xo(n)&&_a(o)&&o.expanded&&Object.keys(n).forEach(s=>{i(n[s],o.properties[s],r.concat(s))})}(t,e,[]),A}function XsA(t,e){var A=!(arguments.length>2&&arguments[2]!==void 0)||arguments[2],i=[];return function n(o,r){i.push({path:r,type:Rl.value});var s=Jg(t,e,r);if(o&&ZC(s)&&s.expanded){if(A&&i.push({path:r,type:Rl.inside}),wo(o)){var a=Mr(s)?s.visibleSections:aQ;oG(o,a,c=>{var l=r.concat(String(c));n(o[c],l),A&&i.push({path:l,type:Rl.after})})}xo(o)&&Object.keys(o).forEach(c=>{var l=r.concat(c);i.push({path:l,type:Rl.key}),n(o[c],l),A&&i.push({path:l,type:Rl.after})})}}(t,[]),i}function VN(t,e,A){var i=sG(t,e),n=i.map(Ct).indexOf(Ct(A));if(n!==-1&&n3&&arguments[3]!==void 0?arguments[3]:10240;return Sl(t,e,A,xGA({json:Ke(t,A)},i)?G3:aG)}function ZN(t,e,A){var i=Jg(t,e,A);return ZC(i)&&i.expanded?e:WC(t,e,A)}function G3(t){return t.length===0||t.length===1&&t[0]==="0"}function ErA(t){return t.length===0}function aG(){return!0}function ay(){return!1}function Ua(t){return t&&t.type===Ln.after||!1}function fr(t){return t&&t.type===Ln.inside||!1}function kr(t){return t&&t.type===Ln.key||!1}function an(t){return t&&t.type===Ln.value||!1}function Kn(t){return t&&t.type===Ln.multi||!1}function Yy(t){return Kn(t)&&di(t.focusPath,t.anchorPath)}function q3(t){return Kn(t)||Ua(t)||fr(t)||kr(t)||an(t)}function WN(t){return t&&t.type===Ln.text||!1}function W1(t,e){var A=[];return function(i,n,o){if(n){var r=OC(n),s=et(n);if(di(r,s))return o(r);if(i!==void 0){var a=AaA(r,s);if(r.length===a.length||s.length===a.length)return o(a);var c=_s(r,s),l=X0(i,c),I=P1(i,c),C=i2(i,c,l),d=i2(i,c,I);if(!(C===-1||d===-1)){var B=Ke(i,a);if(xo(B)){for(var E=Object.keys(B),h=C;h<=d;h++){var u=o(a.concat(E[h]));if(u!==void 0)return u}return}if(wo(B)){for(var D=C;D<=d;D++){var L=o(a.concat(String(D)));if(L!==void 0)return L}return}throw new Error("Failed to create selection")}}}}(t,e,i=>{A.push(i)}),A}function $sA(t){return fr(t)?t.path:Fi(et(t))}function X0(t,e){if(!Kn(e))return e.path;var A=i2(t,e,e.anchorPath);return i2(t,e,e.focusPath)A?e.focusPath:e.anchorPath}function QrA(t,e,A){var i=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(A){var n=i?et(A):X0(t,A),o=function(a,c,l){var I=sG(a,c),C=I.map(Ct),d=Ct(l),B=C.indexOf(d);if(B!==-1&&B>0)return I[B-1]}(t,e,n);if(i)return fr(A)||Ua(A)?o!==void 0?_s(n,n):void 0:o!==void 0?_s(OC(A),o):void 0;if(Ua(A)||fr(A))return Ni(n);if(kr(A)){if(o===void 0||o.length===0)return;var r=Fi(o),s=Ke(t,r);return Array.isArray(s)||Oi(o)?Ni(o):o2(o)}return an(A),o!==void 0?Ni(o):void 0}}function hrA(t,e,A,i){if(!A)return{caret:void 0,previous:void 0,next:void 0};var n=XsA(t,e,i),o=n.findIndex(r=>di(r.path,et(A))&&String(r.type)===String(A.type));return{caret:o!==-1?n[o]:void 0,previous:o!==-1&&o>0?n[o-1]:void 0,next:o!==-1&&oA[i].length;)i++;var n=A[i];return n===void 0||n.length===0||Array.isArray(Ke(t,Fi(n)))?Ni(n):o2(n)}function QQ(t,e){if(e.length===1){var A=Fc(e);if(A.op==="replace")return Ni(ya(t,A.path))}if(!Oi(e)&&e.every(r=>r.op==="move")){var i=Fc(e),n=e.slice(1);if((S8(i)||j2(i))&&i.from!==i.path&&n.every(r=>(S8(r)||j2(r))&&r.from===r.path))return o2(ya(t,i.path))}var o=e.filter(r=>r.op!=="test"&&r.op!=="remove"&&(r.op!=="move"||r.from!==r.path)&&typeof r.path=="string").map(r=>ya(t,r.path));if(!Oi(o))return{type:Ln.multi,anchorPath:Fc(o),focusPath:hi(o)}}function AaA(t,e){for(var A=0;AA.length&&e.length>A.length;return{type:Ln.multi,anchorPath:i?A.concat(t[A.length]):A,focusPath:i?A.concat(e[A.length]):A}}function eaA(t,e,A,i){if(kr(e))return String(hi(e.path));if(an(e)){var n=Ke(t,e.path);return typeof n=="string"?n:i.stringify(n,null,A)}if(Kn(e)){if(Oi(e.focusPath))return i.stringify(t,null,A);var o=$sA(e),r=Ke(t,o);if(Array.isArray(r)){if(Yy(e)){var s=Ke(t,e.focusPath);return i.stringify(s,null,A)}return W1(t,e).map(a=>{var c=Ke(t,a);return"".concat(i.stringify(c,null,A),",")}).join(` -`)}return W1(t,e).map(a=>{var c=hi(a),l=Ke(t,a);return"".concat(i.stringify(c),": ").concat(i.stringify(l,null,A),",")}).join(` -`)}}function br(t){return(kr(t)||an(t))&&t.edit===!0}function oQ(t){return kr(t)||an(t)||Kn(t)}function WD(t){return kr(t)||an(t)||Yy(t)}function D_(t){switch(t.type){case Rl.key:return o2(t.path);case Rl.value:return Ni(t.path);case Rl.after:return t2(t.path);case Rl.inside:return r2(t.path)}}function frA(t,e){switch(t){case Ln.key:return o2(e);case Ln.value:return Ni(e);case Ln.after:return t2(e);case Ln.inside:return r2(e);case Ln.multi:case Ln.text:return _s(e,e)}}function XD(t,e,A){if(e)return V3(t,e,A)||Pg(Kn(e)?Fi(e.focusPath):e.path,A)?e:void 0}function V3(t,e,A){if(t===void 0||!e)return!1;if(kr(e)||fr(e)||Ua(e))return di(e.path,A);if(an(e))return Pg(A,e.path);if(Kn(e)){var i=X0(t,e),n=P1(t,e),o=Fi(e.focusPath);if(!Pg(A,o)||A.length<=o.length)return!1;var r=i2(t,e,i),s=i2(t,e,n),a=i2(t,e,A);return a!==-1&&a>=r&&a<=s}return!1}function i2(t,e,A){var i=Fi(e.focusPath);if(!Pg(A,i)||A.length<=i.length)return-1;var n=A[i.length],o=Ke(t,i);if(xo(o))return Object.keys(o).indexOf(n);if(wo(o)){var r=ts(n);if(r');function iaA(t,e){mt(e,!1);var A=Sr("jsoneditor:EditableDiv"),i=b(e,"value",9),n=b(e,"initialValue",9),o=b(e,"shortText",9,!1),r=b(e,"label",9),s=b(e,"onChange",9),a=b(e,"onCancel",9),c=b(e,"onFind",9),l=b(e,"onPaste",9,$o),I=b(e,"onValueClass",9,()=>""),C=$(void 0,!0),d=$(void 0,!0),B=!1;function E(){return g(C)?function(D){return D.replace(/\n$/,"")}(g(C).innerText):""}function h(D){g(C)&&hc(C,g(C).innerText=BQ(D))}hs(()=>{A("onMount",{value:i(),initialValue:n()}),h(n()!==void 0?n():i()),g(C)&&function(D){if(D.firstChild!=null){var L=document.createRange(),R=window.getSelection();L.setStart(D,1),L.collapse(!0),R?.removeAllRanges(),R?.addRange(L)}else D.focus()}(g(C))}),qc(()=>{var D=E();A("onDestroy",{closed:B,value:i(),newValue:D}),B||D===i()||s()(D,O1.no)}),fA(()=>(k(I()),k(i())),()=>{y(d,I()(i()))}),Qn(),Zt(!0);var u=BUA();Co(u,D=>y(C,D),()=>g(C)),De(D=>{En(u,"aria-label",r()),Vt(u,1,D,"svelte-f9kmxj")},[()=>Z1((k(Kl),g(d),k(o()),nA(()=>Kl("jse-editable-div",g(d),{"jse-short-text":o()}))))],qA),ce("input",u,function(){var D=E();D===""&&h(""),y(d,I()(D))}),ce("keydown",u,function(D){D.stopPropagation();var L=n2(D);if(L==="Escape"&&(D.preventDefault(),B=!0,a()()),L==="Enter"||L==="Tab"){D.preventDefault(),B=!0;var R=E();s()(R,O1.nextInside)}L==="Ctrl+F"&&(D.preventDefault(),c()(!1)),L==="Ctrl+H"&&(D.preventDefault(),c()(!0))}),ce("paste",u,function(D){if(D.stopPropagation(),l()&&D.clipboardData){var L=D.clipboardData.getData("text/plain");l()(L)}}),ce("blur",u,function(){var D=document.hasFocus(),L=E();A("handleBlur",{hasFocus:D,closed:B,value:i(),newValue:L}),document.hasFocus()&&!B&&(B=!0,L!==i()&&s()(L,O1.self))}),iA(t,u),pt()}function EUA(t,e){mt(e,!1);var A=b(e,"path",9),i=b(e,"value",9),n=b(e,"selection",9),o=b(e,"mode",9),r=b(e,"parser",9),s=b(e,"normalization",9),a=b(e,"enforceString",9),c=b(e,"onPatch",9),l=b(e,"onPasteJson",9),I=b(e,"onSelect",9),C=b(e,"onFind",9),d=b(e,"focus",9),B=b(e,"findNextInside",9);function E(L){return a()?L:DQ(L,r())}function h(){I()(Ni(A())),d()()}Zt(!0);var u=qA(()=>(k(s()),k(i()),nA(()=>s().escapeValue(i())))),D=qA(()=>(k(br),k(n()),nA(()=>br(n())?n().initialValue:void 0)));iaA(t,{get value(){return g(u)},get initialValue(){return g(D)},label:"Edit value",onChange:function(L,R){c()([{op:"replace",path:Ct(A()),value:E(s().unescapeValue(L))}],(w,_,K)=>{if(!K||di(A(),et(K)))return{state:_,selection:R===O1.nextInside?B()(A()):Ni(A())}}),d()()},onCancel:h,onPaste:function(L){try{var R=r().parse(L);No(R)&&l()({path:A(),contents:R,onPasteAsJson:()=>{h();var w=[{op:"replace",path:Ct(A()),value:R}];c()(w,(_,K)=>({state:WC(_,K,A())}))}})}catch{}},get onFind(){return C()},onValueClass:function(L){return taA(E(s().unescapeValue(L)),o(),r())}}),pt()}function rQ(t,e,A){var i=Fi(e),n=Ke(t,i);if(wo(n)){var o=ts(hi(e));return A.map((c,l)=>({op:"add",path:Ct(i.concat(String(o+l))),value:c.value}))}if(xo(n)){var r=hi(e),s=Object.keys(n),a=r!==void 0?lf(s,r,!0):[];return[...A.map(c=>{var l=cf(c.key,s);return{op:"add",path:Ct(i.concat(l)),value:c.value}}),...a.map(c=>X1(i,c))]}throw new Error("Cannot create insert operations: parent must be an Object or Array")}function y_(t,e,A){var i=Ke(t,e);if(Array.isArray(i)){var n=i.length;return A.map((o,r)=>({op:"add",path:Ct(e.concat(String(n+r))),value:o.value}))}return A.map(o=>{var r=cf(o.key,Object.keys(i));return{op:"add",path:Ct(e.concat(r)),value:o.value}})}function gf(t,e,A,i){var n=cf(i,e.filter(r=>r!==A)),o=lf(e,A,!1);return[{op:"move",from:Ct(t.concat(A)),path:Ct(t.concat(n))},...o.map(r=>X1(t,r))]}function naA(t,e){var A=hi(e);if(Oi(A))throw new Error("Cannot duplicate root object");var i=Fi(A),n=hi(A),o=Ke(t,i);if(wo(o)){var r=hi(e),s=r?ts(hi(r))+1:0;return[...e.map((l,I)=>({op:"copy",from:Ct(l),path:Ct(i.concat(String(I+s)))}))]}if(xo(o)){var a=Object.keys(o),c=n!==void 0?lf(a,n,!1):[];return[...e.map(l=>{var I=cf(hi(l),a);return{op:"copy",from:Ct(l),path:Ct(i.concat(I))}}),...c.map(l=>X1(i,l))]}throw new Error("Cannot create duplicate operations: parent must be an Object or Array")}function oaA(t,e){if(an(e))return[{op:"move",from:Ct(e.path),path:""}];if(!Kn(e))throw new Error("Cannot create extract operations: parent must be an Object or Array");var A=Fi(e.focusPath),i=Ke(t,A);if(wo(i)){var n=W1(t,e).map(r=>{var s=ts(hi(r));return i[s]});return[{op:"replace",path:"",value:n}]}if(xo(i)){var o={};return W1(t,e).forEach(r=>{var s=String(hi(r));o[s]=i[s]}),[{op:"replace",path:"",value:o}]}throw new Error("Cannot extract: unsupported type of selection "+JSON.stringify(e))}function raA(t,e,A,i){if(kr(e)){var n=NsA(A,i),o=Fi(e.path),r=Ke(t,o);return gf(o,Object.keys(r),hi(e.path),typeof n=="string"?n:A)}if(an(e)||Kn(e)&&Oi(e.focusPath))try{return[{op:"replace",path:Ct(et(e)),value:sf(A,_=>rf(_,i))}]}catch{return[{op:"replace",path:Ct(et(e)),value:A}]}if(Kn(e)){var s=XN(A,i);return function(_,K,z){var U=Fc(K),H=Fi(U),q=Ke(_,H);if(wo(q)){var j=Fc(K),gA=j?ts(hi(j)):0;return[...py(K),...z.map((VA,oe)=>({op:"add",path:Ct(H.concat(String(oe+gA))),value:VA.value}))]}if(xo(q)){var QA=hi(K),BA=Fi(QA),lA=hi(QA),vA=Object.keys(q),tA=lA!==void 0?lf(vA,lA,!1):[],cA=new Set(K.map(VA=>hi(VA))),pA=vA.filter(VA=>!cA.has(VA));return[...py(K),...z.map(VA=>{var oe=cf(VA.key,pA);return{op:"add",path:Ct(BA.concat(oe)),value:VA.value}}),...tA.map(VA=>X1(BA,VA))]}throw new Error("Cannot create replace operations: parent must be an Object or Array")}(t,W1(t,e),s)}if(Ua(e)){var a=XN(A,i),c=e.path,l=Fi(c),I=Ke(t,l);if(wo(I)){var C=ts(hi(c));return rQ(t,l.concat(String(C+1)),a)}if(xo(I)){var d=String(hi(c)),B=Object.keys(I);if(Oi(B)||hi(B)===d)return y_(t,l,a);var E=B.indexOf(d),h=B[E+1];return rQ(t,l.concat(h),a)}throw new Error("Cannot create insert operations: parent must be an Object or Array")}if(fr(e)){var u=XN(A,i),D=e.path,L=Ke(t,D);if(wo(L))return rQ(t,D.concat("0"),u);if(xo(L)){var R=Object.keys(L);if(Oi(R))return y_(t,D,u);var w=Fc(R);return rQ(t,D.concat(w),u)}throw new Error("Cannot create insert operations: parent must be an Object or Array")}throw new Error("Cannot insert: unsupported type of selection "+JSON.stringify(e))}function py(t){return t.map(e=>({op:"remove",path:Ct(e)})).reverse()}function X1(t,e){return{op:"move",from:Ct(t.concat(e)),path:Ct(t.concat(e))}}function XN(t,e){var A=/^\s*{/.test(t),i=/^\s*\[/.test(t),n=NsA(t,e),o=n!==void 0?n:sf(t,r=>rf(r,e));return A&&Cn(o)||i&&Array.isArray(o)?[{key:"New item",value:o}]:Array.isArray(o)?o.map((r,s)=>({key:"New item "+s,value:r})):Cn(o)?Object.keys(o).map(r=>({key:r,value:o[r]})):[{key:"New item",value:o}]}function saA(t,e){if(kr(e)){var A=Fi(e.path),i=Ke(t,A),n=gf(A,Object.keys(i),hi(e.path),"");return{operations:n,newSelection:QQ(t,n)}}if(an(e))return{operations:[{op:"replace",path:Ct(e.path),value:""}],newSelection:e};if(Kn(e)){var o=W1(t,e),r=py(o),s=hi(o);if(Oi(s))return{operations:[{op:"replace",path:"",value:""}],newSelection:Ni([])};var a=Fi(s),c=Ke(t,a);if(wo(c)){var l=Fc(o),I=ts(hi(l));return{operations:r,newSelection:I===0?r2(a):t2(a.concat(String(I-1)))}}if(xo(c)){var C=Object.keys(c),d=Fc(o),B=hi(d),E=C.indexOf(B),h=C[E-1];return{operations:r,newSelection:E===0?r2(a):t2(a.concat(h))}}throw new Error("Cannot create remove operations: parent must be an Object or Array")}throw new Error("Cannot remove: unsupported type of selection "+JSON.stringify(e))}function aaA(t,e){var A=function(i,n){if(Oi(n)||!n.every(j2))return n;var o=[];for(var r of n){var s=mrA(ks(r.from)),a=mrA(ks(r.path));if(!s||!a)return n;o.push({from:s,path:a,operation:r})}var c=o[0].path.parent,l=Ke(i,c);if(!xo(l)||!o.every(B=>function(E,h){return di(E.from.parent,h)&&di(E.path.parent,h)}(B,c)))return n;var I=function(B,E){var h=Object.keys(E),u=h.slice();for(var D of B){var L=u.indexOf(D.from.key);L!==-1&&(u.splice(L,1),u.push(D.path.key))}for(var R=0;RB.operation,d=o.filter(B=>B.operation.from!==B.operation.path);return d.some(B=>B.path.key===I)?d.map(C):[X1(c,I),...d.map(C)]}(t,e);return R8(t,A,{before:(i,n,o)=>{if(gS(n)){var r=ks(n.path);return{revertOperations:[...o,...$N(i,r)]}}if(j2(n)){var s=ks(n.from);return{revertOperations:n.from===n.path?[n,...$N(i,s)]:[...o,...$N(i,s)]}}return{document:i}}})}function mrA(t){return t.length>0?{parent:Fi(t),key:hi(t)}:void 0}function $N(t,e){var A=Fi(e),i=hi(e),n=Ke(t,A);return xo(n)?lf(Object.keys(n),i,!1).map(o=>X1(A,o)):[]}function prA(t){var e=t.activeIndex0?0:-1,A=t.items[e],i=t.items.map((n,o)=>fe(fe({},n),{},{active:o===e}));return fe(fe({},t),{},{items:i,activeItem:A,activeIndex:e})}function wrA(t,e){var A,i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=t.toLowerCase(),o=(A=i?.maxResults)!==null&&A!==void 0?A:1/0,r=i?.columns,s=[],a=[];function c(h){s.length>=o||s.push(h)}function l(h,u){if(wo(u)){var D=a.length;a.push("0");for(var L=0;L=o)return;a.pop()}else if(xo(u)){var R=Object.keys(u),w=a.length;for(var _ of(a.push(""),R))if(a[w]=_,DrA(_,h,a,Nl.key,c),l(h,u[_]),s.length>=o)return;a.pop()}else DrA(String(u),h,a,Nl.value,c)}if(t==="")return[];if(r){if(!Array.isArray(e))throw new Error("json must be an Array when option columns is defined");for(var I=0;IB.length+1;)a.pop();l(n,Ke(C,B))}if(s.length>=o)break}return s}return l(n,e),s}function DrA(t,e,A,i,n){var o=t.toLowerCase(),r=0,s=-1,a=-1;do(a=o.indexOf(e,s))!==-1&&(s=a+e.length,n({path:A.slice(0),field:i,fieldIndex:r,start:a,end:s}),r++);while(a!==-1)}function v_(t,e,A,i){return t.substring(0,A)+e+t.substring(i)}function yrA(t,e,A){var i=t;return LS(A,n=>{i=v_(i,e,n.start,n.end)}),i}function QUA(t,e,A,i,n){var{field:o,path:r,start:s,end:a}=i;if(o===Nl.key){var c=Fi(r),l=Ke(t,c),I=hi(r),C=gf(c,Object.keys(l),I,v_(I,A,s,a));return{newSelection:QQ(t,C),operations:C}}if(o===Nl.value){var d=Ke(t,r);if(d===void 0)throw new Error("Cannot replace: path not found ".concat(Ct(r)));var B=typeof d=="string"?d:String(d),E=zg(t,e,r),h=v_(B,A,s,a),u=[{op:"replace",path:Ct(r),value:E?h:DQ(h,n)}];return{newSelection:QQ(t,u),operations:u}}throw new Error("Cannot replace: unknown type of search result field ".concat(o))}function vrA(t){return t.path.concat(t.field,String(t.fieldIndex))}function brA(t){var e=qsA(t)?t.searchResults.filter(A=>A.field===Nl.key):void 0;return e&&e.length>0?e:void 0}function MrA(t){var e=qsA(t)?t.searchResults.filter(A=>A.field===Nl.value):void 0;return e&&e.length>0?e:void 0}var hUA={createObjectDocumentState:()=>({type:"object",properties:{}}),createArrayDocumentState:()=>({type:"array",items:[]}),createValueDocumentState:()=>({type:"value"})};function caA(t,e){return e.reduce((A,i)=>function(n,o,r,s){return rG(n,o,r,s,hUA)}(t,A,i.path,(n,o)=>fe(fe({},o),{},{searchResults:o.searchResults?o.searchResults.concat(i):[i]})),void 0)}function wy(t){var e,A=(e=t?.searchResults)!==null&&e!==void 0?e:[],i=_a(t)?Object.values(t.properties).flatMap(wy):Mr(t)?t.items.flatMap(wy):[];return A.concat(i)}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-highlight.svelte-5fb7bl { - background-color: var(--jse-search-match-color, #ffe665); - outline: var(--jse-search-match-outline, none); -} -.jse-highlight.jse-active.svelte-5fb7bl { - background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); - outline: var(--jse-search-match-outline, 2px solid #e0be00); -}`);var uUA=wA(" ");function laA(t,e){mt(e,!1);var A=$(),i=b(e,"text",8),n=b(e,"searchResultItems",8);fA(()=>(k(i()),k(n())),()=>{y(A,function(r,s){var a=[],c=0;for(var l of s){var I=r.slice(c,l.start);I!==""&&a.push({resultIndex:void 0,type:"normal",text:I,active:!1});var C=r.slice(l.start,l.end);a.push({resultIndex:l.resultIndex,type:"highlight",text:C,active:l.active}),c=l.end}var d=hi(s);return d&&d.endg(A),or,(r,s)=>{var a=_o(),c=vt(a),l=C=>{var d=Tr();De(()=>wt(d,(g(s),nA(()=>g(s).text)))),iA(C,d)},I=C=>{var d,B=uUA(),E=W(B);De((h,u,D)=>{d=Vt(B,1,"jse-highlight svelte-5fb7bl",null,d,h),En(B,"data-search-result-index",u),wt(E,D)},[()=>({"jse-active":g(s).active}),()=>(g(s),nA(()=>String(g(s).resultIndex))),()=>(k(BQ),g(s),nA(()=>BQ(g(s).text)))],qA),iA(C,B)};LA(c,C=>{g(s),nA(()=>g(s).type==="normal")?C(l):C(I,!1)}),iA(r,a)}),iA(t,o),pt()}function cy(t){var e=1e3;if(t<900)return t.toFixed()+" B";var A=t/e;if(A<900)return A.toFixed(1)+" KB";var i=A/e;if(i<900)return i.toFixed(1)+" MB";var n=i/e;return n<900?n.toFixed(1)+" GB":(n/e).toFixed(1)+" TB"}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-tag.svelte-jlw0fj { - border: none; - font-size: 80%; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - color: var(--jse-tag-color, var(--jse-text-color-inverse, #fff)); - background: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); - border-radius: 2px; - cursor: pointer; - display: inline-block; - padding: 0 4px; - line-height: normal; - margin: 1px 0; -} -.jse-tag.svelte-jlw0fj:hover { - opacity: 0.8; -} -.jse-tag.disabled.svelte-jlw0fj { - opacity: 0.7; - cursor: inherit; -}`);var fUA=wA('');function ly(t,e){mt(e,!0);var A,i=Ga(()=>e.onclick?o=>{o.preventDefault(),o.stopPropagation(),e.onclick()}:void 0),n=fUA();n.__click=function(){for(var o,r=arguments.length,s=new Array(r),a=0;a2?s-2:0),c=2;c{C!==(C=r())&&(l&&(jc(l),l=null),l=Vg(()=>C(I,...a)))},Af)}(W(n),()=>{var o;return(o=e.children)!==null&&o!==void 0?o:FoA}),De(o=>A=Vt(n,1,"jse-tag svelte-jlw0fj",null,A,o),[()=>({disabled:!e.onclick})]),iA(t,n),pt()}of(["click"]);function mUA(t,e,A){typeof e.value=="string"&&g(A)&&$_(t)&&(t.preventDefault(),t.stopPropagation(),window.open(e.value,"_blank"))}function pUA(t,e){e.readOnly||(t.preventDefault(),e.onSelect(my(e.path)))}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-value.jse-string.svelte-c0g9qz { - color: var(--jse-value-color-string, #008000); -} -.jse-value.jse-object.svelte-c0g9qz, .jse-value.jse-array.svelte-c0g9qz { - min-width: 16px; - color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); -} -.jse-value.jse-number.svelte-c0g9qz { - color: var(--jse-value-color-number, #ee422e); -} -.jse-value.jse-boolean.svelte-c0g9qz { - color: var(--jse-value-color-boolean, #ff8c00); -} -.jse-value.jse-null.svelte-c0g9qz { - color: var(--jse-value-color-null, #004ed0); -} -.jse-value.jse-invalid.svelte-c0g9qz { - color: var(--jse-text-color, #4d4d4d); -} -.jse-value.jse-url.svelte-c0g9qz { - color: var(--jse-value-color-url, #008000); - text-decoration: underline; -} - -.jse-value.svelte-c0g9qz { - display: inline-block; - min-width: 2em; - padding: 0 5px; - box-sizing: border-box; - outline: none; - border-radius: 1px; - vertical-align: top; - word-break: normal; - overflow-wrap: anywhere; - white-space: pre-wrap; -} -.jse-value.jse-table-cell.svelte-c0g9qz { - overflow-wrap: normal; - white-space: nowrap; -} -.jse-value.jse-empty.svelte-c0g9qz { - min-width: 4em; - outline: 1px dotted var(--jse-tag-background, rgba(0, 0, 0, 0.2)); - -moz-outline-radius: 2px; -} -.jse-value.jse-empty.svelte-c0g9qz::after { - pointer-events: none; - color: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); - content: "value"; -}`);var wUA=wA('
      ');function DUA(t,e){mt(e,!0);var A=P0(!0),i=Ga(()=>g(A)&&typeof e.value=="string"&&e.value.length>e.truncateTextSize&&(!e.searchResultItems||!e.searchResultItems.some(d=>d.active&&d.end>e.truncateTextSize))),n=Ga(()=>g(i)&&typeof e.value=="string"?e.value.substring(0,e.truncateTextSize).trim():e.value),o=Ga(()=>Uy(e.value));function r(){y(A,!1)}var s=wUA();s.__click=[mUA,e,o],s.__dblclick=[pUA,e];var a=W(s),c=d=>{var B=Ga(()=>e.normalization.escapeValue(g(n)));laA(d,{get text(){return g(B)},get searchResultItems(){return e.searchResultItems}})},l=d=>{var B=Tr();De(E=>wt(B,E),[()=>BQ(e.normalization.escapeValue(g(n)))]),iA(d,B)};LA(a,d=>{e.searchResultItems?d(c):d(l,!1)});var I=IA(a,2),C=d=>{ly(d,{onclick:r,children:(B,E)=>{var h=Tr();De(u=>wt(h,"Show more (".concat(u??"",")")),[()=>cy(e.value.length)]),iA(B,h)},$$slots:{default:!0}})};LA(I,d=>{g(i)&&typeof e.value=="string"&&d(C)}),De(d=>{Vt(s,1,d,"svelte-c0g9qz"),En(s,"title",g(o)?"Ctrl+Click or Ctrl+Enter to open url in new window":void 0)},[()=>Z1(taA(e.value,e.mode,e.parser))]),iA(t,s),pt()}of(["click","dblclick"]);Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-tooltip.svelte-14y3y8t { - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - line-height: normal; - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); - border-radius: 3px; - background: var(--jse-context-menu-background, #656565); - color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); - white-space: nowrap; - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); -}`);var yUA=wA('
      ');function vUA(t,e){var A=b(e,"text",8),i=yUA(),n=W(i);De(()=>wt(n,A())),iA(t,i)}function hQ(t,e){var A,{text:i,openAbsolutePopup:n,closeAbsolutePopup:o}=e;function r(){A=n(vUA,{text:i},{position:"top",width:10*i.length,offsetTop:3,anchor:t,closeOnOuterClick:!0})}function s(){o(A)}return t.addEventListener("mouseenter",r),t.addEventListener("mouseleave",s),{destroy(){t.removeEventListener("mouseenter",r),t.removeEventListener("mouseleave",s)}}}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-timestamp.svelte-1jla5ec { - padding: 0; - margin: 0; - vertical-align: middle; - display: inline-flex; - color: var(--jse-value-color-number, #ee422e); -}`);var bUA=wA('
      ');function MUA(t,e){mt(e,!1);var A=$(void 0,!0),i=$1("absolute-popup"),n=b(e,"value",9);fA(()=>k(n()),()=>{y(A,"Time: ".concat(new Date(n()).toString()))}),Qn(),Zt(!0);var o=bUA();ji(W(o),{get data(){return LW}}),Us(o,(r,s)=>hQ?.(r,s),()=>fe({text:g(A)},i)),iA(t,o),pt()}function kUA(t){var e=[];return!t.isEditing&&vGA(t.value)&&e.push({component:iUA,props:t}),!t.isEditing&&bGA(t.value)&&e.push({component:sUA,props:t}),t.isEditing&&e.push({component:EUA,props:t}),t.isEditing||e.push({component:DUA,props:t}),!t.isEditing&&Q_(t.value)&&e.push({component:MUA,props:t}),e}function Ka(t){return t.map((e,A)=>RUA.test(e)?"["+e+"]":/[.[\]]/.test(e)||e===""?'["'+function(i){return i.replace(/"/g,'\\"')}(e)+'"]':(A>0?".":"")+e).join("")}function SUA(t){for(var e=[],A=0;Ao==='"',!0)),n('"')):e.push(i(o=>o==="]")),n("]")):e.push(i(o=>o==="."||o==="["));function i(o){for(var r=arguments.length>1&&arguments[1]!==void 0&&arguments[1],s="";A({x:t,y:t}),FUA={left:"right",right:"left",bottom:"top",top:"bottom"},NUA={start:"end",end:"start"};function krA(t,e,A){return PC(t,Dy(e,A))}function Jy(t,e){return typeof t=="function"?t(e):t}function XC(t){return t.split("-")[0]}function Ty(t){return t.split("-")[1]}function gaA(t){return t==="x"?"y":"x"}function IaA(t){return t==="y"?"height":"width"}var _UA=new Set(["top","bottom"]);function J1(t){return _UA.has(XC(t))?"y":"x"}function CaA(t){return gaA(J1(t))}function b_(t){return t.replace(/start|end/g,e=>NUA[e])}var SrA=["left","right"],RrA=["right","left"],GUA=["top","bottom"],UUA=["bottom","top"];function KUA(t,e,A,i){var n=Ty(t),o=function(r,s,a){switch(r){case"top":case"bottom":return a?s?RrA:SrA:s?SrA:RrA;case"left":case"right":return s?GUA:UUA;default:return[]}}(XC(t),A==="start",i);return n&&(o=o.map(r=>r+"-"+n),e&&(o=o.concat(o.map(b_)))),o}function Ay(t){return t.replace(/left|right|bottom|top/g,e=>FUA[e])}function YUA(t){return typeof t!="number"?function(e){return fe({top:0,right:0,bottom:0,left:0},e)}(t):{top:t,right:t,bottom:t,left:t}}function vy(t){var{x:e,y:A,width:i,height:n}=t;return{width:i,height:n,top:A,left:e,right:e+i,bottom:A+n,x:e,y:A}}function xrA(t,e,A){var i,{reference:n,floating:o}=t,r=J1(e),s=CaA(e),a=IaA(s),c=XC(e),l=r==="y",I=n.x+n.width/2-o.width/2,C=n.y+n.height/2-o.height/2,d=n[a]/2-o[a]/2;switch(c){case"top":i={x:I,y:n.y-o.height};break;case"bottom":i={x:I,y:n.y+n.height};break;case"right":i={x:n.x+n.width,y:C};break;case"left":i={x:n.x-o.width,y:C};break;default:i={x:n.x,y:n.y}}switch(Ty(e)){case"start":i[s]-=d*(A&&l?-1:1);break;case"end":i[s]+=d*(A&&l?-1:1)}return i}var JUA=function(){var t=Yt(function*(e,A,i){for(var{placement:n="bottom",strategy:o="absolute",middleware:r=[],platform:s}=i,a=r.filter(Boolean),c=yield s.isRTL==null?void 0:s.isRTL(A),l=yield s.getElementRects({reference:e,floating:A,strategy:o}),{x:I,y:C}=xrA(l,n,c),d=n,B={},E=0,h=0;h"u")&&(t instanceof ShadowRoot||t instanceof fc(t).ShadowRoot)}var HUA=new Set(["inline","contents"]);function Z3(t){var{overflow:e,overflowX:A,overflowY:i,display:n}=Gl(t);return/auto|scroll|overlay|hidden|clip/.test(e+i+A)&&!HUA.has(n)}var zUA=new Set(["table","td","th"]);function OUA(t){return zUA.has(uQ(t))}var PUA=[":popover-open",":modal"];function by(t){return PUA.some(e=>{try{return t.matches(e)}catch{return!1}})}var jUA=["transform","translate","scale","rotate","perspective"],qUA=["transform","translate","scale","rotate","perspective","filter"],VUA=["paint","layout","strict","content"];function S_(t){var e=lG(),A=_l(t)?Gl(t):t;return jUA.some(i=>!!A[i]&&A[i]!=="none")||!!A.containerType&&A.containerType!=="normal"||!e&&!!A.backdropFilter&&A.backdropFilter!=="none"||!e&&!!A.filter&&A.filter!=="none"||qUA.some(i=>(A.willChange||"").includes(i))||VUA.some(i=>(A.contain||"").includes(i))}function lG(){return!(typeof CSS>"u"||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}var ZUA=new Set(["html","body","#document"]);function cQ(t){return ZUA.has(uQ(t))}function Gl(t){return fc(t).getComputedStyle(t)}function zy(t){return _l(t)?{scrollLeft:t.scrollLeft,scrollTop:t.scrollTop}:{scrollLeft:t.scrollX,scrollTop:t.scrollY}}function T1(t){if(uQ(t)==="html")return t;var e=t.assignedSlot||t.parentNode||LrA(t)&&t.host||qg(t);return LrA(e)?e.host:e}function EaA(t){var e=T1(t);return cQ(e)?t.ownerDocument?t.ownerDocument.body:t.body:Zg(e)&&Z3(e)?e:EaA(e)}function W3(t,e,A){var i;e===void 0&&(e=[]),A===void 0&&(A=!0);var n=EaA(t),o=n===((i=t.ownerDocument)==null?void 0:i.body),r=fc(n);if(o){var s=R_(r);return e.concat(r,r.visualViewport||[],Z3(n)?n:[],s&&A?W3(s):[])}return e.concat(n,W3(n,[],A))}function R_(t){return t.parent&&Object.getPrototypeOf(t.parent)?t.frameElement:null}function QaA(t){var e=Gl(t),A=parseFloat(e.width)||0,i=parseFloat(e.height)||0,n=Zg(t),o=n?t.offsetWidth:A,r=n?t.offsetHeight:i,s=yy(A)!==o||yy(i)!==r;return s&&(A=o,i=r),{width:A,height:i,$:s}}function gG(t){return _l(t)?t:t.contextElement}function lQ(t){var e=gG(t);if(!Zg(e))return jg(1);var A=e.getBoundingClientRect(),{width:i,height:n,$:o}=QaA(e),r=(o?yy(A.width):A.width)/i,s=(o?yy(A.height):A.height)/n;return r&&Number.isFinite(r)||(r=1),s&&Number.isFinite(s)||(s=1),{x:r,y:s}}var WUA=jg(0);function haA(t){var e=fc(t);return lG()&&e.visualViewport?{x:e.visualViewport.offsetLeft,y:e.visualViewport.offsetTop}:WUA}function $C(t,e,A,i){e===void 0&&(e=!1),A===void 0&&(A=!1);var n=t.getBoundingClientRect(),o=gG(t),r=jg(1);e&&(i?_l(i)&&(r=lQ(i)):r=lQ(t));var s=function(w,_,K){return _===void 0&&(_=!1),!(!K||_&&K!==fc(w))&&_}(o,A,i)?haA(o):jg(0),a=(n.left+s.x)/r.x,c=(n.top+s.y)/r.y,l=n.width/r.x,I=n.height/r.y;if(o)for(var C=fc(o),d=i&&_l(i)?fc(i):i,B=C,E=R_(B);E&&i&&d!==B;){var h=lQ(E),u=E.getBoundingClientRect(),D=Gl(E),L=u.left+(E.clientLeft+parseFloat(D.paddingLeft))*h.x,R=u.top+(E.clientTop+parseFloat(D.paddingTop))*h.y;a*=h.x,c*=h.y,l*=h.x,I*=h.y,a+=L,c+=R,E=R_(B=fc(E))}return vy({width:l,height:I,x:a,y:c})}function IG(t,e){var A=zy(t).scrollLeft;return e?e.left+A:$C(qg(t)).left+A}function uaA(t,e,A){A===void 0&&(A=!1);var i=t.getBoundingClientRect();return{x:i.left+e.scrollLeft-(A?0:IG(t,i)),y:i.top+e.scrollTop}}var XUA=new Set(["absolute","fixed"]);function FrA(t,e,A){var i;if(e==="viewport")i=function(o,r){var s=fc(o),a=qg(o),c=s.visualViewport,l=a.clientWidth,I=a.clientHeight,C=0,d=0;if(c){l=c.width,I=c.height;var B=lG();(!B||B&&r==="fixed")&&(C=c.offsetLeft,d=c.offsetTop)}return{width:l,height:I,x:C,y:d}}(t,A);else if(e==="document")i=function(o){var r=qg(o),s=zy(o),a=o.ownerDocument.body,c=PC(r.scrollWidth,r.clientWidth,a.scrollWidth,a.clientWidth),l=PC(r.scrollHeight,r.clientHeight,a.scrollHeight,a.clientHeight),I=-s.scrollLeft+IG(o),C=-s.scrollTop;return Gl(a).direction==="rtl"&&(I+=PC(r.clientWidth,a.clientWidth)-c),{width:c,height:l,x:I,y:C}}(qg(t));else if(_l(e))i=function(o,r){var s=$C(o,!0,r==="fixed"),a=s.top+o.clientTop,c=s.left+o.clientLeft,l=Zg(o)?lQ(o):jg(1);return{width:o.clientWidth*l.x,height:o.clientHeight*l.y,x:c*l.x,y:a*l.y}}(e,A);else{var n=haA(t);i={x:e.x-n.x,y:e.y-n.y,width:e.width,height:e.height}}return vy(i)}function faA(t,e){var A=T1(t);return!(A===e||!_l(A)||cQ(A))&&(Gl(A).position==="fixed"||faA(A,e))}function $UA(t,e,A){var i=Zg(e),n=qg(e),o=A==="fixed",r=$C(t,!0,o,e),s={scrollLeft:0,scrollTop:0},a=jg(0);function c(){a.x=IG(n)}if(i||!i&&!o)if((uQ(e)!=="body"||Z3(n))&&(s=zy(e)),i){var l=$C(e,!0,o,e);a.x=l.x+e.clientLeft,a.y=l.y+e.clientTop}else n&&c();o&&!i&&n&&c();var I=!n||i||o?jg(0):uaA(n,s);return{x:r.left+s.scrollLeft-a.x-I.x,y:r.top+s.scrollTop-a.y-I.y,width:r.width,height:r.height}}function A_(t){return Gl(t).position==="static"}function NrA(t,e){if(!Zg(t)||Gl(t).position==="fixed")return null;if(e)return e(t);var A=t.offsetParent;return qg(t)===A&&(A=A.ownerDocument.body),A}function _rA(t,e){var A=fc(t);if(by(t))return A;if(!Zg(t)){for(var i=T1(t);i&&!cQ(i);){if(_l(i)&&!A_(i))return i;i=T1(i)}return A}for(var n=NrA(t,e);n&&OUA(n)&&A_(n);)n=NrA(n,e);return n&&cQ(n)&&A_(n)&&!S_(n)?A:n||function(o){for(var r=T1(o);Zg(r)&&!cQ(r);){if(S_(r))return r;if(by(r))return null;r=T1(r)}return null}(t)||A}var AKA={convertOffsetParentRelativeRectToViewportRelativeRect:function(t){var{elements:e,rect:A,offsetParent:i,strategy:n}=t,o=n==="fixed",r=qg(i),s=!!e&&by(e.floating);if(i===r||s&&o)return A;var a={scrollLeft:0,scrollTop:0},c=jg(1),l=jg(0),I=Zg(i);if((I||!I&&!o)&&((uQ(i)!=="body"||Z3(r))&&(a=zy(i)),Zg(i))){var C=$C(i);c=lQ(i),l.x=C.x+i.clientLeft,l.y=C.y+i.clientTop}var d=!r||I||o?jg(0):uaA(r,a,!0);return{width:A.width*c.x,height:A.height*c.y,x:A.x*c.x-a.scrollLeft*c.x+l.x+d.x,y:A.y*c.y-a.scrollTop*c.y+l.y+d.y}},getDocumentElement:qg,getClippingRect:function(t){var{element:e,boundary:A,rootBoundary:i,strategy:n}=t,o=[...A==="clippingAncestors"?by(e)?[]:function(a,c){var l=c.get(a);if(l)return l;for(var I=W3(a,[],!1).filter(u=>_l(u)&&uQ(u)!=="body"),C=null,d=Gl(a).position==="fixed",B=d?T1(a):a;_l(B)&&!cQ(B);){var E=Gl(B),h=S_(B);h||E.position!=="fixed"||(C=null),(d?!h&&!C:!h&&E.position==="static"&&C&&XUA.has(C.position)||Z3(B)&&!h&&faA(a,B))?I=I.filter(u=>u!==B):C=E,B=T1(B)}return c.set(a,I),I}(e,this._c):[].concat(A),i],r=o[0],s=o.reduce((a,c)=>{var l=FrA(e,c,n);return a.top=PC(l.top,a.top),a.right=Dy(l.right,a.right),a.bottom=Dy(l.bottom,a.bottom),a.left=PC(l.left,a.left),a},FrA(e,r,n));return{width:s.right-s.left,height:s.bottom-s.top,x:s.left,y:s.top}},getOffsetParent:_rA,getElementRects:function(){var t=Yt(function*(e){var A=this.getOffsetParent||_rA,i=this.getDimensions,n=yield i(e.floating);return{reference:$UA(e.reference,yield A(e.floating),e.strategy),floating:{x:0,y:0,width:n.width,height:n.height}}});return function(e){return t.apply(this,arguments)}}(),getClientRects:function(t){return Array.from(t.getClientRects())},getDimensions:function(t){var{width:e,height:A}=QaA(t);return{width:e,height:A}},getScale:lQ,isElement:_l,isRTL:function(t){return Gl(t).direction==="rtl"}};function GrA(t,e){return t.x===e.x&&t.y===e.y&&t.width===e.width&&t.height===e.height}function eKA(t,e,A,i){i===void 0&&(i={});var{ancestorScroll:n=!0,ancestorResize:o=!0,elementResize:r=typeof ResizeObserver=="function",layoutShift:s=typeof IntersectionObserver=="function",animationFrame:a=!1}=i,c=gG(t),l=n||o?[...c?W3(c):[],...W3(e)]:[];l.forEach(h=>{n&&h.addEventListener("scroll",A,{passive:!0}),o&&h.addEventListener("resize",A)});var I,C=c&&s?function(h,u){var D,L=null,R=qg(h);function w(){var _;clearTimeout(D),(_=L)==null||_.disconnect(),L=null}return function _(K,z){K===void 0&&(K=!1),z===void 0&&(z=1),w();var U=h.getBoundingClientRect(),{left:H,top:q,width:j,height:gA}=U;if(K||u(),j&&gA){var QA={rootMargin:-$D(q)+"px "+-$D(R.clientWidth-(H+j))+"px "+-$D(R.clientHeight-(q+gA))+"px "+-$D(H)+"px",threshold:PC(0,Dy(1,z))||1},BA=!0;try{L=new IntersectionObserver(lA,fe(fe({},QA),{},{root:R.ownerDocument}))}catch{L=new IntersectionObserver(lA,QA)}L.observe(h)}function lA(vA){var tA=vA[0].intersectionRatio;if(tA!==z){if(!BA)return _();tA?_(!1,tA):D=setTimeout(()=>{_(!1,1e-7)},1e3)}tA!==1||GrA(U,h.getBoundingClientRect())||_(),BA=!1}}(!0),w}(c,A):null,d=-1,B=null;r&&(B=new ResizeObserver(h=>{var[u]=h;u&&u.target===c&&B&&(B.unobserve(e),cancelAnimationFrame(d),d=requestAnimationFrame(()=>{var D;(D=B)==null||D.observe(e)})),A()}),c&&!a&&B.observe(c),B.observe(e));var E=a?$C(t):null;return a&&function h(){var u=$C(t);E&&!GrA(E,u)&&A(),E=u,I=requestAnimationFrame(h)}(),A(),()=>{var h;l.forEach(u=>{n&&u.removeEventListener("scroll",A),o&&u.removeEventListener("resize",A)}),C?.(),(h=B)==null||h.disconnect(),B=null,a&&cancelAnimationFrame(I)}}var tKA=function(t){return t===void 0&&(t=0),{name:"offset",options:t,fn:e=>Yt(function*(){var A,i,{x:n,y:o,placement:r,middlewareData:s}=e,a=yield function(c,l){return k_.apply(this,arguments)}(e,t);return r===((A=s.offset)==null?void 0:A.placement)&&(i=s.arrow)!=null&&i.alignmentOffset?{}:{x:n+a.x,y:o+a.y,data:fe(fe({},a),{},{placement:r})}})()}},iKA=function(t){return t===void 0&&(t={}),{name:"shift",options:t,fn:e=>Yt(function*(){var{x:A,y:i,placement:n}=e,o=Jy(t,e),{mainAxis:r=!0,crossAxis:s=!1,limiter:a={fn:L=>{var{x:R,y:w}=L;return{x:R,y:w}}}}=o,c=zrA(o,T_A),l={x:A,y:i},I=yield daA(e,c),C=J1(XC(n)),d=gaA(C),B=l[d],E=l[C];if(r){var h=d==="y"?"bottom":"right";B=krA(B+I[d==="y"?"top":"left"],B,B-I[h])}if(s){var u=C==="y"?"bottom":"right";E=krA(E+I[C==="y"?"top":"left"],E,E-I[u])}var D=a.fn(fe(fe({},e),{},{[d]:B,[C]:E}));return fe(fe({},D),{},{data:{x:D.x-A,y:D.y-i,enabled:{[d]:r,[C]:s}}})})()}},nKA=function(t){return t===void 0&&(t={}),{name:"flip",options:t,fn:e=>Yt(function*(){var A,i,{placement:n,middlewareData:o,rects:r,initialPlacement:s,platform:a,elements:c}=e,l=Jy(t,e),{mainAxis:I=!0,crossAxis:C=!0,fallbackPlacements:d,fallbackStrategy:B="bestFit",fallbackAxisSideDirection:E="none",flipAlignment:h=!0}=l,u=zrA(l,J_A);if((A=o.arrow)!=null&&A.alignmentOffset)return{};var D=XC(n),L=J1(s),R=XC(s)===s,w=yield a.isRTL==null?void 0:a.isRTL(c.floating),_=d||(R||!h?[Ay(s)]:function(pA){var VA=Ay(pA);return[b_(pA),VA,b_(VA)]}(s)),K=E!=="none";!d&&K&&_.push(...KUA(s,h,E,w));var z=[s,..._],U=yield daA(e,u),H=[],q=((i=o.flip)==null?void 0:i.overflows)||[];if(I&&H.push(U[D]),C){var j=function(pA,VA,oe){oe===void 0&&(oe=!1);var KA=Ty(pA),CA=CaA(pA),TA=IaA(CA),Ze=CA==="x"?KA===(oe?"end":"start")?"right":"left":KA==="start"?"bottom":"top";return VA.reference[TA]>VA.floating[TA]&&(Ze=Ay(Ze)),[Ze,Ay(Ze)]}(n,r,w);H.push(U[j[0]],U[j[1]])}if(q=[...q,{placement:n,overflows:H}],!H.every(pA=>pA<=0)){var gA,QA,BA=(((gA=o.flip)==null?void 0:gA.index)||0)+1,lA=z[BA];if(lA&&(!(C==="alignment"&&L!==J1(lA))||q.every(pA=>pA.overflows[0]>0&&J1(pA.placement)===L)))return{data:{index:BA,overflows:q},reset:{placement:lA}};var vA=(QA=q.filter(pA=>pA.overflows[0]<=0).sort((pA,VA)=>pA.overflows[1]-VA.overflows[1])[0])==null?void 0:QA.placement;if(!vA)switch(B){case"bestFit":var tA,cA=(tA=q.filter(pA=>{if(K){var VA=J1(pA.placement);return VA===L||VA==="y"}return!0}).map(pA=>[pA.placement,pA.overflows.filter(VA=>VA>0).reduce((VA,oe)=>VA+oe,0)]).sort((pA,VA)=>pA[1]-VA[1])[0])==null?void 0:tA[0];cA&&(vA=cA);break;case"initialPlacement":vA=s}if(n!==vA)return{reset:{placement:vA}}}return{}})()}};function oKA(t){var e,A,i={autoUpdate:!0},n=t,o=a=>fe(fe(fe({},i),t||{}),a||{}),r=a=>{e&&A&&(n=o(a),((c,l,I)=>{var C=new Map,d=fe({platform:AKA},I),B=fe(fe({},d.platform),{},{_c:C});return JUA(c,l,fe(fe({},d),{},{platform:B}))})(e,A,n).then(c=>{var l;Object.assign(A.style,{position:c.strategy,left:"".concat(c.x,"px"),top:"".concat(c.y,"px")}),!((l=n)===null||l===void 0)&&l.onComputed&&n.onComputed(c)}))},s=a=>{qc(a.subscribe(c=>{e===void 0?(e=c,r()):(Object.assign(e,c),r())}))};return[a=>{if("subscribe"in a)return s(a),{};e=a,r()},(a,c)=>{var l;A=a,n=o(c),setTimeout(()=>r(c),0),r(c);var I=()=>{l&&(l(),l=void 0)},C=function(){var{autoUpdate:d}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:n||{};I(),d!==!1&&function(){return fsA.apply(this,arguments)}().then(()=>eKA(e,A,()=>r(n),d===!0?{}:d))};return l=C(),{update(d){r(d),l=C(d)},destroy(){I()}}},r]}function rKA(t){var{loadOptions:e,filterText:A,items:i,multiple:n,value:o,itemId:r,groupBy:s,filterSelectedItems:a,itemFilter:c,convertStringItemsToObjects:l,filterGroupedItems:I,label:C}=t;if(i&&e)return i;if(!i)return[];i&&i.length>0&&typeof i[0]!="object"&&(i=l(i));var d=i.filter(B=>{var E=c(B[C],A,B);return E&&n&&o!=null&&o.length&&(E=!o.some(h=>!!a&&h[r]===B[r])),E});return s&&(d=I(d)),d}function sKA(t){return maA.apply(this,arguments)}function maA(){return(maA=Yt(function*(t){var{dispatch:e,loadOptions:A,convertStringItemsToObjects:i,filterText:n}=t,o=yield A(n).catch(r=>{console.warn("svelte-select loadOptions error :>> ",r),e("error",{type:"loadOptions",details:r})});if(o&&!o.cancelled)return o?(o&&o.length>0&&typeof o[0]!="object"&&(o=i(o)),e("loaded",{items:o})):o=[],{filteredItems:o,loading:!1,focused:!0,listOpen:!0}})).apply(this,arguments)}Jt(` - svg.svelte-qbd276 { - width: var(--chevron-icon-width, 20px); - height: var(--chevron-icon-width, 20px); - color: var(--chevron-icon-colour, currentColor); - } -`);var aKA=tI(``);Jt(` - svg.svelte-whdbu1 { - width: var(--clear-icon-width, 20px); - height: var(--clear-icon-width, 20px); - color: var(--clear-icon-color, currentColor); - } -`);var cKA=tI(``);function e_(t){iA(t,cKA())}Jt(` - .loading.svelte-1p3nqvd { - width: var(--spinner-width, 20px); - height: var(--spinner-height, 20px); - color: var(--spinner-color, var(--icons-color)); - animation: svelte-1p3nqvd-rotate 0.75s linear infinite; - transform-origin: center center; - transform: none; - } - - .circle_path.svelte-1p3nqvd { - stroke-dasharray: 90; - stroke-linecap: round; - } - - @keyframes svelte-1p3nqvd-rotate { - 100% { - transform: rotate(360deg); - } - } -`);var lKA=tI('');Jt(` - .svelte-select.svelte-82qwg8 { - /* deprecating camelCase custom props in favour of kebab-case for v5 */ - --borderRadius: var(--border-radius); - --clearSelectColor: var(--clear-select-color); - --clearSelectWidth: var(--clear-select-width); - --disabledBackground: var(--disabled-background); - --disabledBorderColor: var(--disabled-border-color); - --disabledColor: var(--disabled-color); - --disabledPlaceholderColor: var(--disabled-placeholder-color); - --disabledPlaceholderOpacity: var(--disabled-placeholder-opacity); - --errorBackground: var(--error-background); - --errorBorder: var(--error-border); - --groupItemPaddingLeft: var(--group-item-padding-left); - --groupTitleColor: var(--group-title-color); - --groupTitleFontSize: var(--group-title-font-size); - --groupTitleFontWeight: var(--group-title-font-weight); - --groupTitlePadding: var(--group-title-padding); - --groupTitleTextTransform: var(--group-title-text-transform); - --groupTitleBorderColor: var(--group-title-border-color); - --groupTitleBorderWidth: var(--group-title-border-width); - --groupTitleBorderStyle: var(--group-title-border-style); - --indicatorColor: var(--chevron-color); - --indicatorHeight: var(--chevron-height); - --indicatorWidth: var(--chevron-width); - --inputColor: var(--input-color); - --inputLeft: var(--input-left); - --inputLetterSpacing: var(--input-letter-spacing); - --inputMargin: var(--input-margin); - --inputPadding: var(--input-padding); - --itemActiveBackground: var(--item-active-background); - --itemColor: var(--item-color); - --itemFirstBorderRadius: var(--item-first-border-radius); - --itemHoverBG: var(--item-hover-bg); - --itemHoverColor: var(--item-hover-color); - --itemIsActiveBG: var(--item-is-active-bg); - --itemIsActiveColor: var(--item-is-active-color); - --itemIsNotSelectableColor: var(--item-is-not-selectable-color); - --itemPadding: var(--item-padding); - --listBackground: var(--list-background); - --listBorder: var(--list-border); - --listBorderRadius: var(--list-border-radius); - --listEmptyColor: var(--list-empty-color); - --listEmptyPadding: var(--list-empty-padding); - --listEmptyTextAlign: var(--list-empty-text-align); - --listMaxHeight: var(--list-max-height); - --listPosition: var(--list-position); - --listShadow: var(--list-shadow); - --listZIndex: var(--list-z-index); - --multiItemBG: var(--multi-item-bg); - --multiItemBorderRadius: var(--multi-item-border-radius); - --multiItemDisabledHoverBg: var(--multi-item-disabled-hover-bg); - --multiItemDisabledHoverColor: var(--multi-item-disabled-hover-color); - --multiItemHeight: var(--multi-item-height); - --multiItemMargin: var(--multi-item-margin); - --multiItemPadding: var(--multi-item-padding); - --multiSelectInputMargin: var(--multi-select-input-margin); - --multiSelectInputPadding: var(--multi-select-input-padding); - --multiSelectPadding: var(--multi-select-padding); - --placeholderColor: var(--placeholder-color); - --placeholderOpacity: var(--placeholder-opacity); - --selectedItemPadding: var(--selected-item-padding); - --spinnerColor: var(--spinner-color); - --spinnerHeight: var(--spinner-height); - --spinnerWidth: var(--spinner-width); - - --internal-padding: 0 0 0 16px; - - border: var(--border, 1px solid #d8dbdf); - border-radius: var(--border-radius, 6px); - min-height: var(--height, 42px); - position: relative; - display: flex; - align-items: stretch; - padding: var(--padding, var(--internal-padding)); - background: var(--background, #fff); - margin: var(--margin, 0); - width: var(--width, 100%); - font-size: var(--font-size, 16px); - max-height: var(--max-height); - } - - .svelte-82qwg8 { - box-sizing: var(--box-sizing, border-box); - } - - .svelte-select.svelte-82qwg8:hover { - border: var(--border-hover, 1px solid #b2b8bf); - } - - .value-container.svelte-82qwg8 { - display: flex; - flex: 1 1 0%; - flex-wrap: wrap; - align-items: center; - gap: 5px 10px; - padding: var(--value-container-padding, 5px 0); - position: relative; - overflow: var(--value-container-overflow, hidden); - align-self: stretch; - } - - .prepend.svelte-82qwg8, - .indicators.svelte-82qwg8 { - display: flex; - flex-shrink: 0; - align-items: center; - } - - .indicators.svelte-82qwg8 { - position: var(--indicators-position); - top: var(--indicators-top); - right: var(--indicators-right); - bottom: var(--indicators-bottom); - } - - input.svelte-82qwg8 { - position: absolute; - cursor: default; - border: none; - color: var(--input-color, var(--item-color)); - padding: var(--input-padding, 0); - letter-spacing: var(--input-letter-spacing, inherit); - margin: var(--input-margin, 0); - min-width: 10px; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: transparent; - font-size: var(--font-size, 16px); - } - - .svelte-82qwg8:not(.multi) > .value-container:where(.svelte-82qwg8) > input:where(.svelte-82qwg8) { - width: 100%; - height: 100%; - } - - input.svelte-82qwg8::placeholder { - color: var(--placeholder-color, #78848f); - opacity: var(--placeholder-opacity, 1); - } - - input.svelte-82qwg8:focus { - outline: none; - } - - .svelte-select.focused.svelte-82qwg8 { - border: var(--border-focused, 1px solid #006fe8); - border-radius: var(--border-radius-focused, var(--border-radius, 6px)); - } - - .disabled.svelte-82qwg8 { - background: var(--disabled-background, #ebedef); - border-color: var(--disabled-border-color, #ebedef); - color: var(--disabled-color, #c1c6cc); - } - - .disabled.svelte-82qwg8 input:where(.svelte-82qwg8)::placeholder { - color: var(--disabled-placeholder-color, #c1c6cc); - opacity: var(--disabled-placeholder-opacity, 1); - } - - .selected-item.svelte-82qwg8 { - position: relative; - overflow: var(--selected-item-overflow, hidden); - padding: var(--selected-item-padding, 0 20px 0 0); - text-overflow: ellipsis; - white-space: nowrap; - color: var(--selected-item-color, inherit); - font-size: var(--font-size, 16px); - } - - .multi.svelte-82qwg8 .selected-item:where(.svelte-82qwg8) { - position: absolute; - line-height: var(--height, 42px); - height: var(--height, 42px); - } - - .selected-item.svelte-82qwg8:focus { - outline: none; - } - - .hide-selected-item.svelte-82qwg8 { - opacity: 0; - } - - .icon.svelte-82qwg8 { - display: flex; - align-items: center; - justify-content: center; - } - - .clear-select.svelte-82qwg8 { - all: unset; - display: flex; - align-items: center; - justify-content: center; - width: var(--clear-select-width, 40px); - height: var(--clear-select-height, 100%); - color: var(--clear-select-color, var(--icons-color)); - margin: var(--clear-select-margin, 0); - pointer-events: all; - flex-shrink: 0; - } - - .clear-select.svelte-82qwg8:focus { - outline: var(--clear-select-focus-outline, 1px solid #006fe8); - } - - .loading.svelte-82qwg8 { - width: var(--loading-width, 40px); - height: var(--loading-height); - color: var(--loading-color, var(--icons-color)); - margin: var(--loading--margin, 0); - flex-shrink: 0; - } - - .chevron.svelte-82qwg8 { - width: var(--chevron-width, 40px); - height: var(--chevron-height, 40px); - background: var(--chevron-background, transparent); - pointer-events: var(--chevron-pointer-events, none); - color: var(--chevron-color, var(--icons-color)); - border: var(--chevron-border, 0 0 0 1px solid #d8dbdf); - flex-shrink: 0; - } - - .multi.svelte-82qwg8 { - padding: var(--multi-select-padding, var(--internal-padding)); - } - - .multi.svelte-82qwg8 input:where(.svelte-82qwg8) { - padding: var(--multi-select-input-padding, 0); - position: relative; - margin: var(--multi-select-input-margin, 5px 0); - flex: 1 1 40px; - } - - .svelte-select.error.svelte-82qwg8 { - border: var(--error-border, 1px solid #ff2d55); - background: var(--error-background, #fff); - } - - .a11y-text.svelte-82qwg8 { - z-index: 9999; - border: 0px; - clip: rect(1px, 1px, 1px, 1px); - height: 1px; - width: 1px; - position: absolute; - overflow: hidden; - padding: 0px; - white-space: nowrap; - } - - .multi-item.svelte-82qwg8 { - background: var(--multi-item-bg, #ebedef); - margin: var(--multi-item-margin, 0); - outline: var(--multi-item-outline, 1px solid #ddd); - border-radius: var(--multi-item-border-radius, 4px); - height: var(--multi-item-height, 25px); - line-height: var(--multi-item-height, 25px); - display: flex; - cursor: default; - padding: var(--multi-item-padding, 0 5px); - overflow: hidden; - gap: var(--multi-item-gap, 4px); - outline-offset: -1px; - max-width: var(--multi-max-width, none); - color: var(--multi-item-color, var(--item-color)); - } - - .multi-item.disabled.svelte-82qwg8:hover { - background: var(--multi-item-disabled-hover-bg, #ebedef); - color: var(--multi-item-disabled-hover-color, #c1c6cc); - } - - .multi-item-text.svelte-82qwg8 { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - .multi-item-clear.svelte-82qwg8 { - display: flex; - align-items: center; - justify-content: center; - --clear-icon-color: var(--multi-item-clear-icon-color, #000); - } - - .multi-item.active.svelte-82qwg8 { - outline: var(--multi-item-active-outline, 1px solid #006fe8); - } - - .svelte-select-list.svelte-82qwg8 { - box-shadow: var(--list-shadow, 0 2px 3px 0 rgba(44, 62, 80, 0.24)); - border-radius: var(--list-border-radius, 4px); - max-height: var(--list-max-height, 252px); - overflow-y: auto; - background: var(--list-background, #fff); - position: var(--list-position, absolute); - z-index: var(--list-z-index, 2); - border: var(--list-border); - } - - .prefloat.svelte-82qwg8 { - opacity: 0; - pointer-events: none; - } - - .list-group-title.svelte-82qwg8 { - color: var(--group-title-color, #8f8f8f); - cursor: default; - font-size: var(--group-title-font-size, 16px); - font-weight: var(--group-title-font-weight, 600); - height: var(--height, 42px); - line-height: var(--height, 42px); - padding: var(--group-title-padding, 0 20px); - text-overflow: ellipsis; - overflow-x: hidden; - white-space: nowrap; - text-transform: var(--group-title-text-transform, uppercase); - border-width: var(--group-title-border-width, medium); - border-style: var(--group-title-border-style, none); - border-color: var(--group-title-border-color, color); - } - - .empty.svelte-82qwg8 { - text-align: var(--list-empty-text-align, center); - padding: var(--list-empty-padding, 20px 0); - color: var(--list-empty-color, #78848f); - } - - .item.svelte-82qwg8 { - cursor: default; - height: var(--item-height, var(--height, 42px)); - line-height: var(--item-line-height, var(--height, 42px)); - padding: var(--item-padding, 0 20px); - color: var(--item-color, inherit); - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - transition: var(--item-transition, all 0.2s); - align-items: center; - width: 100%; - } - - .item.group-item.svelte-82qwg8 { - padding-left: var(--group-item-padding-left, 40px); - } - - .item.svelte-82qwg8:active { - background: var(--item-active-background, #b9daff); - } - - .item.active.svelte-82qwg8 { - background: var(--item-is-active-bg, #007aff); - color: var(--item-is-active-color, #fff); - } - - .item.first.svelte-82qwg8 { - border-radius: var(--item-first-border-radius, 4px 4px 0 0); - } - - .item.hover.svelte-82qwg8:not(.active) { - background: var(--item-hover-bg, #e7f2ff); - color: var(--item-hover-color, inherit); - } - - .item.not-selectable.svelte-82qwg8, - .item.hover.item.not-selectable.svelte-82qwg8, - .item.active.item.not-selectable.svelte-82qwg8, - .item.not-selectable.svelte-82qwg8:active { - color: var(--item-is-not-selectable-color, #999); - background: transparent; - } - - .required.svelte-82qwg8 { - opacity: 0; - z-index: -1; - position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; - } -`);var gKA=wA('
      '),IKA=wA('
      No options
      '),CKA=wA('
      '),dKA=wA(' ',1),BKA=wA('
      '),EKA=wA('
      '),QKA=wA("
      "),hKA=wA(''),uKA=wA(''),fKA=wA(''),mKA=wA(''),pKA=wA(''),wKA=wA('
      ');function JC(t,e){var A=function(EA){var HA={};for(var ve in EA.children&&(HA.default=!0),EA.$$slots)HA[ve]=!0;return HA}(e);mt(e,!1);var i,n=$(),o=$(),r=$(),s=$(),a=$(),c=$(),l=$(),I=$(),C=$(),d=dGA(),B=b(e,"justValue",12,null),E=b(e,"filter",8,rKA),h=b(e,"getItems",8,sKA),u=b(e,"id",8,null),D=b(e,"name",8,null),L=b(e,"container",12,void 0),R=b(e,"input",12,void 0),w=b(e,"multiple",8,!1),_=b(e,"multiFullItemClearable",8,!1),K=b(e,"disabled",8,!1),z=b(e,"focused",12,!1),U=b(e,"value",12,null),H=b(e,"filterText",12,""),q=b(e,"placeholder",8,"Please select"),j=b(e,"placeholderAlwaysShow",8,!1),gA=b(e,"items",12,null),QA=b(e,"label",8,"label"),BA=b(e,"itemFilter",8,(EA,HA,ve)=>"".concat(EA).toLowerCase().includes(HA.toLowerCase())),lA=b(e,"groupBy",8,void 0),vA=b(e,"groupFilter",8,EA=>EA),tA=b(e,"groupHeaderSelectable",8,!1),cA=b(e,"itemId",8,"value"),pA=b(e,"loadOptions",8,void 0),VA=b(e,"containerStyles",8,""),oe=b(e,"hasError",8,!1),KA=b(e,"filterSelectedItems",8,!0),CA=b(e,"required",8,!1),TA=b(e,"closeListOnChange",8,!0),Ze=b(e,"clearFilterTextOnBlur",8,!0),He=b(e,"createGroupHeaderItem",8,(EA,HA)=>({value:EA,[QA()]:EA})),uA=()=>g(l),eA=b(e,"searchable",8,!0),UA=b(e,"inputStyles",8,""),aA=b(e,"clearable",8,!0),le=b(e,"loading",12,!1),SA=b(e,"listOpen",12,!1),Ue=b(e,"debounce",8,function(EA){var HA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1;clearTimeout(i),i=setTimeout(EA,HA)}),mA=b(e,"debounceWait",8,300),sA=b(e,"hideEmptyState",8,!1),xt=b(e,"inputAttributes",24,()=>({})),tt=b(e,"listAutoWidth",8,!0),de=b(e,"showChevron",8,!1),Dt=b(e,"listOffset",8,5),_e=b(e,"hoverItemIndex",12,0),Le=b(e,"floatingConfig",24,()=>({})),bt=b(e,"class",8,""),Re=$(),$t=$(),x=$(),Y=$(),P=$();function X(EA){return EA.map((HA,ve)=>({index:ve,value:HA,label:"".concat(HA)}))}function bA(EA){var HA=[],ve={};EA.forEach(yi=>{var ri=lA()(yi);HA.includes(ri)||(HA.push(ri),ve[ri]=[],ri&&ve[ri].push(Object.assign(He()(ri,yi),{id:ri,groupHeader:!0,selectable:tA()}))),ve[ri].push(Object.assign({groupItem:!!ri},yi))});var Qt=[];return vA()(HA).forEach(yi=>{ve[yi]&&Qt.push(...ve[yi])}),Qt}function Be(){var EA=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0,HA=arguments.length>1?arguments[1]:void 0;_e(EA<0?0:EA),!HA&&lA()&&g(l)[_e()]&&!g(l)[_e()].selectable&&ni(1)}function Ee(){var EA=!0;if(U()){var HA=[],ve=[];U().forEach(Qt=>{HA.includes(Qt[cA()])?EA=!1:(HA.push(Qt[cA()]),ve.push(Qt))}),EA||U(ve)}return EA}function kA(EA){var HA=EA?EA[cA()]:U()[cA()];return gA().find(ve=>ve[cA()]===HA)}function DA(EA){return gt.apply(this,arguments)}function gt(){return(gt=Yt(function*(EA){var HA=U()[EA];U().length===1?U(void 0):U(U().filter(ve=>ve!==HA)),d("clear",HA)})).apply(this,arguments)}function Ve(EA){if(z())switch(EA.stopPropagation(),EA.key){case"Escape":EA.preventDefault(),xe();break;case"Enter":if(EA.preventDefault(),SA()){if(g(l).length===0)break;var HA=g(l)[_e()];if(U()&&!w()&&U()[cA()]===HA[cA()]){xe();break}M(g(l)[_e()])}break;case"ArrowDown":EA.preventDefault(),SA()?ni(1):(SA(!0),y(Re,void 0));break;case"ArrowUp":EA.preventDefault(),SA()?ni(-1):(SA(!0),y(Re,void 0));break;case"Tab":if(SA()&&z()){if(g(l).length===0||U()&&U()[cA()]===g(l)[_e()][cA()])return xe();EA.preventDefault(),M(g(l)[_e()]),xe()}break;case"Backspace":if(!w()||H().length>0)return;if(w()&&U()&&U().length>0){if(DA(g(Re)!==void 0?g(Re):U().length-1),g(Re)===0||g(Re)===void 0)break;y(Re,U().length>g(Re)?g(Re)-1:void 0)}break;case"ArrowLeft":if(!U()||!w()||H().length>0)return;g(Re)===void 0?y(Re,U().length-1):U().length>g(Re)&&g(Re)!==0&&y(Re,g(Re)-1);break;case"ArrowRight":if(!U()||!w()||H().length>0||g(Re)===void 0)return;g(Re)===U().length-1?y(Re,void 0):g(Re)0?SA(!0):void SA(!SA())}function qi(){d("clear",U()),U(void 0),xe(),ZA()}function xe(){Ze()&&H(""),SA(!1)}BGA(Yt(function*(){y($t,U()),y(x,H()),y(Y,w())})),hs(()=>{SA()&&z(!0),z()&&R()&&R().focus()});var nn=b(e,"ariaValues",8,EA=>"Option ".concat(EA,", selected.")),mi=b(e,"ariaListOpen",8,(EA,HA)=>"You are currently focused on option ".concat(EA,". There are ").concat(HA," results available.")),Ot=b(e,"ariaFocused",8,()=>"Select is focused, type to refine list, press down to open the menu."),Lt,ii=$(null);function _i(){clearTimeout(Lt),Lt=setTimeout(()=>{Tt=!1},100)}qc(()=>{var EA;(EA=g(ii))===null||EA===void 0||EA.remove()});var Tt=!1;function M(EA){EA&&EA.selectable!==!1&&function(HA){if(HA){H("");var ve=Object.assign({},HA);if(ve.groupHeader&&!ve.selectable)return;U(w()?U()?U().concat([ve]):[ve]:U(ve)),setTimeout(()=>{TA()&&xe(),y(Re,void 0),d("change",U()),d("select",HA)})}}(EA)}function We(EA){Tt||_e(EA)}function ni(EA){if(g(l).filter(ve=>!Object.hasOwn(ve,"selectable")||ve.selectable===!0).length===0)return _e(0);EA>0&&_e()===g(l).length-1?_e(0):EA<0&&_e()===0?_e(g(l).length-1):_e(_e()+EA);var HA=g(l)[_e()];HA&&HA.selectable===!1&&(EA!==1&&EA!==-1||ni(EA))}function pi(EA,HA,ve){if(!w())return HA&&HA[ve]===EA[ve]}var dn=Uo,mn=Uo;function Uo(EA){return{update(HA){HA.scroll&&(_i(),EA.scrollIntoView({behavior:"auto",block:"nearest"}))}}}var kn=$({strategy:"absolute",placement:"bottom-start",middleware:[tKA(Dt()),nKA(),iKA()],autoUpdate:!1}),[Wn,Vo,vo]=oKA(g(kn)),bo=$(!0);fA(()=>(k(gA()),k(U())),()=>{gA(),U()&&function(){if(typeof U()=="string"){var EA=(gA()||[]).find(HA=>HA[cA()]===U());U(EA||{[cA()]:U(),label:U()})}else w()&&Array.isArray(U())&&U().length>0&&U(U().map(HA=>typeof HA=="string"?{value:HA,label:HA}:HA))}()}),fA(()=>(k(xt()),k(eA())),()=>{!xt()&&eA()||(y(P,Object.assign({autocapitalize:"none",autocomplete:"off",autocorrect:"off",spellcheck:!1,tabindex:0,type:"text","aria-autocomplete":"list"},xt())),u()&&hc(P,g(P).id=u()),eA()||hc(P,g(P).readonly=!0))}),fA(()=>k(w()),()=>{w()&&U()&&(Array.isArray(U())?U([...U()]):U([U()]))}),fA(()=>(g(Y),k(w())),()=>{g(Y)&&!w()&&U()&&U(null)}),fA(()=>(k(w()),k(U())),()=>{w()&&U()&&U().length>1&&Ee()}),fA(()=>k(U()),()=>{U()&&(w()?JSON.stringify(U())!==JSON.stringify(g($t))&&Ee()&&d("input",U()):g($t)&&JSON.stringify(U()[cA()])===JSON.stringify(g($t)[cA()])||d("input",U()))}),fA(()=>(k(U()),k(w()),g($t)),()=>{!U()&&w()&&g($t)&&d("input",U())}),fA(()=>(k(z()),k(R())),()=>{!z()&&R()&&xe()}),fA(()=>(k(H()),g(x)),()=>{H()!==g(x)&&(pA()||H().length!==0)&&(pA()?Ue()(Yt(function*(){le(!0);var EA=yield h()({dispatch:d,loadOptions:pA(),convertStringItemsToObjects:X,filterText:H()});EA?(le(EA.loading),SA(SA()?EA.listOpen:H().length>0),z(SA()&&EA.focused),gA(lA()?bA(EA.filteredItems):EA.filteredItems)):(le(!1),z(!0),SA(!0))}),mA()):(SA(!0),w()&&y(Re,void 0)))}),fA(()=>(k(E()),k(pA()),k(H()),k(gA()),k(w()),k(U()),k(cA()),k(lA()),k(QA()),k(KA()),k(BA())),()=>{y(l,E()({loadOptions:pA(),filterText:H(),items:gA(),multiple:w(),value:U(),itemId:cA(),groupBy:lA(),label:QA(),filterSelectedItems:KA(),itemFilter:BA(),convertStringItemsToObjects:X,filterGroupedItems:bA}))}),fA(()=>(k(w()),k(SA()),k(U()),g(l)),()=>{!w()&&SA()&&U()&&g(l)&&Be(g(l).findIndex(EA=>EA[cA()]===U()[cA()]),!0)}),fA(()=>(k(SA()),k(w())),()=>{SA()&&w()&&_e(0)}),fA(()=>k(H()),()=>{H()&&_e(0)}),fA(()=>k(_e()),()=>{var EA;EA=_e(),d("hoverItem",EA)}),fA(()=>(k(w()),k(U())),()=>{y(n,w()?U()&&U().length>0:U())}),fA(()=>(g(n),k(H())),()=>{y(o,g(n)&&H().length>0)}),fA(()=>(g(n),k(aA()),k(K()),k(le())),()=>{y(r,g(n)&&aA()&&!K()&&!le())}),fA(()=>(k(j()),k(w()),k(q()),k(U())),()=>{var EA;y(s,j()&&w()||w()&&((EA=U())===null||EA===void 0?void 0:EA.length)===0?q():U()?"":q())}),fA(()=>(k(U()),k(w())),()=>{var EA,HA;y(a,U()?(EA=w(),HA=void 0,HA=EA&&U().length>0?U().map(ve=>ve[QA()]).join(", "):U()[QA()],nn()(HA)):"")}),fA(()=>(g(l),k(_e()),k(z()),k(SA())),()=>{y(c,function(){if(!g(l)||g(l).length===0)return"";var EA=g(l)[_e()];if(SA()&&EA){var HA=g(l)?g(l).length:0;return mi()(EA[QA()],HA)}return Ot()()}((g(l),_e(),z(),SA())))}),fA(()=>k(gA()),()=>{(function(EA){EA&&EA.length!==0&&!EA.some(HA=>typeof HA!="object")&&U()&&(w()?!U().some(HA=>!HA||!HA[cA()]):U()[cA()])&&(Array.isArray(U())?U(U().map(HA=>kA(HA)||HA)):U(kA()||U()))})(gA())}),fA(()=>(k(w()),k(U()),k(cA())),()=>{B((w(),U(),cA(),w()?U()?U().map(EA=>EA[cA()]):null:U()?U()[cA()]:U()))}),fA(()=>(k(w()),g($t),k(U())),()=>{w()||!g($t)||U()||d("input",U())}),fA(()=>(k(SA()),g(l),k(w()),k(U())),()=>{SA()&&g(l)&&!w()&&!U()&&Be()}),fA(()=>g(l),()=>{(function(EA){SA()&&d("filter",EA)})(g(l))}),fA(()=>(k(L()),k(Le()),g(kn)),()=>{L()&&Le()&&vo(Object.assign(g(kn),Le()))}),fA(()=>g(ii),()=>{y(I,!!g(ii))}),fA(()=>(g(ii),k(SA())),()=>{(function(EA,HA){if(!EA||!HA)return y(bo,!0);setTimeout(()=>{y(bo,!1)},0)})(g(ii),SA())}),fA(()=>(k(SA()),k(L()),g(ii)),()=>{SA()&&L()&&g(ii)&&function(){var{width:EA}=L().getBoundingClientRect();hc(ii,g(ii).style.width=tt()?EA+"px":"auto")}()}),fA(()=>k(_e()),()=>{y(C,_e())}),fA(()=>(k(R()),k(SA()),k(z())),()=>{R()&&SA()&&!z()&&ZA()}),fA(()=>(k(L()),k(Le())),()=>{var EA;L()&&((EA=Le())===null||EA===void 0?void 0:EA.autoUpdate)===void 0&&hc(kn,g(kn).autoUpdate=!0)}),Qn(),Zt();var Yn,Mo=wKA();ce("click",A2,function(EA){var HA;SA()||z()||!L()||L().contains(EA.target)||(HA=g(ii))!==null&&HA!==void 0&&HA.contains(EA.target)||rt()}),ce("keydown",A2,Ve);var ne=W(Mo),wi=EA=>{var HA,ve=CKA(),Qt=W(ve),yi=Pt=>{var $i=_o();jo(vt($i),e,"list-prepend",{},null),iA(Pt,$i)};LA(Qt,Pt=>{nA(()=>A["list-prepend"])&&Pt(yi)});var ri=IA(Qt,2),pn=Pt=>{var $i=_o();jo(vt($i),e,"list",{get filteredItems(){return g(l)}},null),iA(Pt,$i)},Fn=(Pt,$i)=>{var Rr=Xn=>{var se=_o();qo(vt(se),1,()=>g(l),or,(vi,Yi,rn)=>{var Hr,Ri=gKA(),fs=W(Ri);jo(W(fs),e,"item",{get item(){return g(Yi)},index:rn},Bo=>{var Q=Tr();De(()=>wt(Q,(g(Yi),k(QA()),nA(()=>{var m;return(m=g(Yi))===null||m===void 0?void 0:m[QA()]})))),iA(Bo,Q)}),Us(fs,(Bo,Q)=>dn?.(Bo),()=>({scroll:pi(g(Yi),U(),cA()),listDom:g(I)})),Us(fs,(Bo,Q)=>mn?.(Bo),()=>({scroll:g(C)===rn,listDom:g(I)})),De(Bo=>Hr=Vt(fs,1,"item svelte-82qwg8",null,Hr,Bo),[()=>{var Bo,Q;return{"list-group-title":g(Yi).groupHeader,active:pi(g(Yi),U(),cA()),first:(Q=rn,Q===0),hover:_e()===rn,"group-item":g(Yi).groupItem,"not-selectable":((Bo=g(Yi))===null||Bo===void 0?void 0:Bo.selectable)===!1}}],qA),ce("mouseover",Ri,()=>We(rn)),ce("focus",Ri,()=>We(rn)),ce("click",Ri,j0(()=>function(Bo){var{item:Q,i:m}=Bo;if(Q?.selectable!==!1)return U()&&!w()&&U()[cA()]===Q[cA()]?xe():void(function(v){return v.groupHeader&&v.selectable||v.selectable||!v.hasOwnProperty("selectable")}(Q)&&(_e(m),M(Q)))}({item:g(Yi),i:rn}))),ce("keydown",Ri,N1(j0(function(Bo){N3.call(this,e,Bo)}))),iA(vi,Ri)}),iA(Xn,se)},Ft=(Xn,se)=>{var vi=Yi=>{var rn=_o();jo(vt(rn),e,"empty",{},Hr=>{iA(Hr,IKA())}),iA(Yi,rn)};LA(Xn,Yi=>{sA()||Yi(vi)},se)};LA(Pt,Xn=>{g(l),nA(()=>g(l).length>0)?Xn(Rr):Xn(Ft,!1)},$i)};LA(ri,Pt=>{nA(()=>A.list)?Pt(pn):Pt(Fn,!1)});var Jn=IA(ri,2),ln=Pt=>{var $i=_o();jo(vt($i),e,"list-append",{},null),iA(Pt,$i)};LA(Jn,Pt=>{nA(()=>A["list-append"])&&Pt(ln)}),Us(ve,Pt=>Vo?.(Pt)),Co(ve,Pt=>y(ii,Pt),()=>g(ii)),es(()=>ce("scroll",ve,_i)),es(()=>ce("pointerup",ve,N1(j0(function(Pt){N3.call(this,e,Pt)})))),es(()=>ce("mousedown",ve,N1(j0(function(Pt){N3.call(this,e,Pt)})))),De(Pt=>HA=Vt(ve,1,"svelte-select-list svelte-82qwg8",null,HA,Pt),[()=>({prefloat:g(bo)})],qA),iA(EA,ve)};LA(ne,EA=>{SA()&&EA(wi)});var MA=IA(ne,2),me=W(MA),nt=EA=>{var HA=dKA(),ve=vt(HA),Qt=W(ve),yi=W(IA(ve,2));De(()=>{wt(Qt,g(a)),wt(yi,g(c))}),iA(EA,HA)};LA(me,EA=>{z()&&EA(nt)});var Wt=IA(MA,2);jo(W(Wt),e,"prepend",{},null);var Xe=IA(Wt,2),oi=W(Xe),Di=EA=>{var HA=_o(),ve=vt(HA),Qt=ri=>{var pn=_o();qo(vt(pn),1,U,or,(Fn,Jn,ln)=>{var Pt,$i=EKA(),Rr=W($i);jo(W(Rr),e,"selection",{get selection(){return g(Jn)},index:ln},se=>{var vi=Tr();De(()=>wt(vi,(g(Jn),k(QA()),nA(()=>g(Jn)[QA()])))),iA(se,vi)});var Ft=IA(Rr,2),Xn=se=>{var vi=BKA();jo(W(vi),e,"multi-clear-icon",{},Yi=>{e_(Yi)}),ce("pointerup",vi,N1(j0(()=>DA(ln)))),iA(se,vi)};LA(Ft,se=>{K()||_()||!e_||se(Xn)}),De(se=>Pt=Vt($i,1,"multi-item svelte-82qwg8",null,Pt,se),[()=>({active:g(Re)===ln,disabled:K()})],qA),ce("click",$i,N1(()=>_()?DA(ln):{})),ce("keydown",$i,N1(j0(function(se){N3.call(this,e,se)}))),iA(Fn,$i)}),iA(ri,pn)},yi=ri=>{var pn,Fn=QKA();jo(W(Fn),e,"selection",{get selection(){return U()}},Jn=>{var ln=Tr();De(()=>wt(ln,(k(U()),k(QA()),nA(()=>U()[QA()])))),iA(Jn,ln)}),De(Jn=>pn=Vt(Fn,1,"selected-item svelte-82qwg8",null,pn,Jn),[()=>({"hide-selected-item":g(o)})],qA),iA(ri,Fn)};LA(ve,ri=>{w()?ri(Qt):ri(yi,!1)}),iA(EA,HA)};LA(oi,EA=>{g(n)&&EA(Di)});var Ut=IA(oi,2);ry(Ut,()=>fe(fe({readOnly:!eA()},g(P)),{},{placeholder:g(s),style:UA(),disabled:K()}),void 0,"svelte-82qwg8"),Co(Ut,EA=>R(EA),()=>R());var cn=IA(Xe,2),ft=W(cn),Qi=EA=>{var HA=hKA();jo(W(HA),e,"loading-icon",{},ve=>{(function(Qt){iA(Qt,lKA())})(ve)}),iA(EA,HA)};LA(ft,EA=>{le()&&EA(Qi)});var ot=IA(ft,2),Mt=EA=>{var HA=uKA();jo(W(HA),e,"clear-icon",{},ve=>{e_(ve)}),ce("click",HA,qi),iA(EA,HA)};LA(ot,EA=>{g(r)&&EA(Mt)});var on=IA(ot,2),hn=EA=>{var HA=fKA();jo(W(HA),e,"chevron-icon",{get listOpen(){return SA()}},ve=>{(function(Qt){iA(Qt,aKA())})(ve)}),iA(EA,HA)};LA(on,EA=>{de()&&EA(hn)});var Ai=IA(cn,2);jo(Ai,e,"input-hidden",{get value(){return U()}},EA=>{var HA=mKA();De(ve=>{En(HA,"name",D()),VC(HA,ve)},[()=>(k(U()),nA(()=>U()?JSON.stringify(U()):null))],qA),iA(EA,HA)});var Ki=IA(Ai,2),dt=EA=>{var HA=_o();jo(vt(HA),e,"required",{get value(){return U()}},ve=>{iA(ve,pKA())}),iA(EA,HA)};return LA(Ki,EA=>{k(CA()),k(U()),nA(()=>CA()&&(!U()||U().length===0))&&EA(dt)}),es(()=>ce("pointerup",Mo,N1(tn))),Co(Mo,EA=>L(EA),()=>L()),Us(Mo,EA=>Wn?.(EA)),De(EA=>{var HA;Yn=Vt(Mo,1,"svelte-select ".concat((HA=bt())!==null&&HA!==void 0?HA:""),"svelte-82qwg8",Yn,EA),Ll(Mo,VA())},[()=>({multi:w(),disabled:K(),focused:z(),"list-open":SA(),"show-chevron":de(),error:oe()})],qA),ce("keydown",Ut,Ve),ce("blur",Ut,rt),ce("focus",Ut,ZA),By(Ut,H),iA(t,Mo),zt(e,"getFilteredItems",uA),zt(e,"handleClear",qi),pt({getFilteredItems:uA,handleClear:qi})}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -table.jse-transform-wizard.svelte-qbze6z { - border-collapse: collapse; - border-spacing: 0; - width: 100%; -} -table.jse-transform-wizard.svelte-qbze6z input:where(.svelte-qbze6z) { - font-family: inherit; - font-size: inherit; -} -table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) th:where(.svelte-qbze6z) { - font-weight: normal; - text-align: left; - width: 60px; -} -table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) { - width: 100%; - display: flex; - flex-direction: row; - margin-bottom: calc(0.5 * var(--jse-padding, 10px)); -} -table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .svelte-select .multi-item { - align-items: center; -} -table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .svelte-select .value-container { - gap: 0 !important; -} -table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .svelte-select.jse-filter-path { - flex: 4; - margin-right: calc(0.5 * var(--jse-padding, 10px)); -} -table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .svelte-select.jse-filter-relation { - flex: 1.5; - margin-right: calc(0.5 * var(--jse-padding, 10px)); -} -table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .svelte-select.jse-sort-path { - flex: 3; - margin-right: calc(0.5 * var(--jse-padding, 10px)); -} -table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .svelte-select.jse-sort-direction { - flex: 1; -} -table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .svelte-select.jse-projection-paths { - flex: 1; -} -table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .svelte-select input { - box-sizing: border-box; -} -table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .jse-filter-value:where(.svelte-qbze6z) { - flex: 4; - padding: 4px 8px; - border: var(--jse-input-border, 1px solid #d8dbdf); - border-radius: var(--jse-input-radius, 3px); - outline: none; - background: var(--jse-input-background, var(--jse-background-color, #fff)); - color: inherit; -} -table.jse-transform-wizard.svelte-qbze6z tr:where(.svelte-qbze6z) td:where(.svelte-qbze6z) .jse-horizontal:where(.svelte-qbze6z) .jse-filter-value:where(.svelte-qbze6z):focus { - border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); -}`);var DKA=wA('
      Filter
      Sort
      Pick
      ');function yKA(t,e){var A,i,n,o,r;mt(e,!1);var s=$(void 0,!0),a=$(void 0,!0),c=$(void 0,!0),l=$(void 0,!0),I=$(void 0,!0),C=$(void 0,!0),d=Sr("jsoneditor:TransformWizard"),B=b(e,"json",9),E=b(e,"queryOptions",29,()=>({})),h=b(e,"onChange",9),u=["==","!=","<","<=",">",">="].map(KA=>({value:KA,label:KA})),D=[{value:"asc",label:"ascending"},{value:"desc",label:"descending"}],L=$((A=E())!==null&&A!==void 0&&(A=A.filter)!==null&&A!==void 0&&A.path?U1(E().filter.path):void 0,!0),R=$((i=u.find(KA=>{var CA;return KA.value===((CA=E().filter)===null||CA===void 0?void 0:CA.relation)}))!==null&&i!==void 0?i:u[0],!0),w=$(((n=E())===null||n===void 0||(n=n.filter)===null||n===void 0?void 0:n.value)||"",!0),_=$((o=E())!==null&&o!==void 0&&(o=o.sort)!==null&&o!==void 0&&o.path?U1(E().sort.path):void 0,!0),K=$((r=D.find(KA=>{var CA;return KA.value===((CA=E().sort)===null||CA===void 0?void 0:CA.direction)}))!==null&&r!==void 0?r:D[0],!0);fA(()=>k(B()),()=>{y(s,Array.isArray(B()))}),fA(()=>(g(s),k(B())),()=>{y(a,g(s)?h_(B()):[])}),fA(()=>(g(s),k(B())),()=>{y(c,g(s)?h_(B(),!0):[])}),fA(()=>(g(a),U1),()=>{y(l,g(a).map(U1))}),fA(()=>(g(c),U1),()=>{y(I,g(c)?g(c).map(U1):[])}),fA(()=>(k(E()),g(I),di),()=>{var KA;y(C,(KA=E())!==null&&KA!==void 0&&(KA=KA.projection)!==null&&KA!==void 0&&KA.paths&&g(I)?E().projection.paths.map(CA=>g(I).find(TA=>di(TA.value,CA))).filter(CA=>!!CA):void 0)}),fA(()=>g(L),()=>{var KA,CA,TA;CA=(KA=g(L))===null||KA===void 0?void 0:KA.value,di((TA=E())===null||TA===void 0||(TA=TA.filter)===null||TA===void 0?void 0:TA.path,CA)||(d("changeFilterPath",CA),E(cs(E(),["filter","path"],CA,!0)),h()(E()))}),fA(()=>g(R),()=>{var KA,CA,TA;CA=(KA=g(R))===null||KA===void 0?void 0:KA.value,di((TA=E())===null||TA===void 0||(TA=TA.filter)===null||TA===void 0?void 0:TA.relation,CA)||(d("changeFilterRelation",CA),E(cs(E(),["filter","relation"],CA,!0)),h()(E()))}),fA(()=>g(w),()=>{var KA,CA;KA=g(w),di((CA=E())===null||CA===void 0||(CA=CA.filter)===null||CA===void 0?void 0:CA.value,KA)||(d("changeFilterValue",KA),E(cs(E(),["filter","value"],KA,!0)),h()(E()))}),fA(()=>g(_),()=>{var KA,CA,TA;CA=(KA=g(_))===null||KA===void 0?void 0:KA.value,di((TA=E())===null||TA===void 0||(TA=TA.sort)===null||TA===void 0?void 0:TA.path,CA)||(d("changeSortPath",CA),E(cs(E(),["sort","path"],CA,!0)),h()(E()))}),fA(()=>g(K),()=>{var KA,CA,TA;CA=(KA=g(K))===null||KA===void 0?void 0:KA.value,di((TA=E())===null||TA===void 0||(TA=TA.sort)===null||TA===void 0?void 0:TA.direction,CA)||(d("changeSortDirection",CA),E(cs(E(),["sort","direction"],CA,!0)),h()(E()))}),fA(()=>g(C),()=>{(function(KA){var CA;di((CA=E())===null||CA===void 0||(CA=CA.projection)===null||CA===void 0?void 0:CA.paths,KA)||(d("changeProjectionPaths",KA),E(cs(E(),["projection","paths"],KA,!0)),h()(E()))})(g(C)?g(C).map(KA=>KA.value):void 0)}),Qn(),Zt(!0);var z=DKA(),U=W(z),H=W(U),q=IA(W(H)),j=W(q),gA=W(j);JC(gA,{class:"jse-filter-path",showChevron:!0,get items(){return g(l)},get value(){return g(L)},set value(KA){y(L,KA)},$$legacy:!0});var QA=IA(gA,2);JC(QA,{class:"jse-filter-relation",showChevron:!0,clearable:!1,get items(){return u},get value(){return g(R)},set value(KA){y(R,KA)},$$legacy:!0});var BA=IA(QA,2),lA=IA(H),vA=IA(W(lA)),tA=W(vA),cA=W(tA);JC(cA,{class:"jse-sort-path",showChevron:!0,get items(){return g(l)},get value(){return g(_)},set value(KA){y(_,KA)},$$legacy:!0}),JC(IA(cA,2),{class:"jse-sort-direction",showChevron:!0,clearable:!1,get items(){return D},get value(){return g(K)},set value(KA){y(K,KA)},$$legacy:!0});var pA=IA(lA),VA=IA(W(pA)),oe=W(VA);JC(W(oe),{class:"jse-projection-paths",multiple:!0,showChevron:!0,get items(){return g(I)},get value(){return g(C)},set value(KA){y(C,KA)},$$legacy:!0}),By(BA,()=>g(w),KA=>y(w,KA)),iA(t,z),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-select-query-language.svelte-atm4um { - position: relative; - width: 32px; -} -.jse-select-query-language.svelte-atm4um .jse-select-query-language-container:where(.svelte-atm4um) { - position: absolute; - top: 0; - right: 0; - display: flex; - flex-direction: column; - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); -} -.jse-select-query-language.svelte-atm4um .jse-select-query-language-container:where(.svelte-atm4um) .jse-query-language:where(.svelte-atm4um) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - text-align: left; - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - white-space: nowrap; - color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); - background: var(--jse-context-menu-background, #656565); -} -.jse-select-query-language.svelte-atm4um .jse-select-query-language-container:where(.svelte-atm4um) .jse-query-language:where(.svelte-atm4um):hover { - background: var(--jse-context-menu-background-highlight, #7a7a7a); -}`);var vKA=wA(''),bKA=wA('
      ');function MKA(t,e){mt(e,!1);var A=b(e,"queryLanguages",8),i=b(e,"queryLanguageId",12),n=b(e,"onChangeQueryLanguage",8);Zt();var o=bKA();qo(W(o),5,A,or,(r,s)=>{var a,c=vKA(),l=W(c),I=B=>{ji(B,{get data(){return zS}})},C=B=>{ji(B,{get data(){return OS}})};LA(l,B=>{g(s),k(i()),nA(()=>g(s).id===i())?B(I):B(C,!1)});var d=IA(l);De(B=>{var E;a=Vt(c,1,"jse-query-language svelte-atm4um",null,a,B),En(c,"title",(g(s),nA(()=>"Select ".concat(g(s).name," as query language")))),wt(d," ".concat((g(s),(E=nA(()=>g(s).name))!==null&&E!==void 0?E:"")))},[()=>({selected:g(s).id===i()})],qA),ce("click",c,()=>{return B=g(s).id,i(B),void n()(B);var B}),iA(r,c)}),iA(t,o),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-header.svelte-1y24war { - display: flex; - background: var(--jse-theme-color, #3883fa); - color: var(--jse-menu-color, var(--jse-text-color-inverse, #fff)); -} -.jse-header.svelte-1y24war .jse-title:where(.svelte-1y24war) { - flex: 1; - padding: 5px; - vertical-align: middle; -} -.jse-header.svelte-1y24war button:where(.svelte-1y24war) { - border: none; - background: transparent; - min-width: 32px; - color: inherit; - cursor: pointer; -} -.jse-header.svelte-1y24war button:where(.svelte-1y24war):hover { - background: rgba(255, 255, 255, 0.1); -}`);var kKA=wA(''),SKA=wA('
      ');function My(t,e){mt(e,!1);var A=b(e,"title",9,"Modal"),i=b(e,"fullScreenButton",9,!1),n=b(e,"fullscreen",13,!1),o=b(e,"onClose",9,void 0);Zt(!0);var r=SKA(),s=W(r),a=W(s),c=IA(s,2);jo(c,e,"actions",{},null);var l=IA(c,2),I=d=>{var B=kKA(),E=W(B),h=qA(()=>n()?FW:VW);ji(E,{get data(){return g(h)}}),ce("click",B,()=>n(!n())),iA(d,B)};LA(l,d=>{i()&&d(I)});var C=IA(l,2);ji(W(C),{get data(){return I4}}),De(()=>wt(a,A())),ce("click",C,()=>{var d;return(d=o())===null||d===void 0?void 0:d()}),iA(t,r),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-config.svelte-1kpylsp { - border: none; - background: transparent; - min-width: 32px; - color: inherit; - cursor: pointer; -} -.jse-config.svelte-1kpylsp:hover { - background: rgba(255, 255, 255, 0.1); -} -.jse-config.hide.svelte-1kpylsp { - display: none; -}`);var RKA=wA(''),t_=Sr("jsoneditor:AutoScrollHandler");function UrA(t){var e,A;function i(s){return s<20?200:s<50?400:1200}function n(){if(t){var s=.05*(e||0);t.scrollTop+=s}}function o(s){A&&s===e||(r(),t_("startAutoScroll",s),e=s,A=setInterval(n,50))}function r(){A&&(t_("stopAutoScroll"),clearInterval(A),A=void 0,e=void 0)}return t_("createAutoScrollHandler",t),{onDrag:function(s){if(t){var a=s.clientY,{top:c,bottom:l}=t.getBoundingClientRect();al?o(i(a-l)):r()}},onDragEnd:function(){r()}}}var xKA=(t,e,A,i)=>(t/=i/2)<1?A/2*t*t+e:-A/2*(--t*(t-2)-1)+e,paA=()=>{var t,e,A,i,n,o,r,s,a,c,l,I,C;function d(h){return h.getBoundingClientRect().top-(t.getBoundingClientRect?t.getBoundingClientRect().top:0)+A}function B(h){t.scrollTo?t.scrollTo(t.scrollLeft,h):t.scrollTop=h}function E(h){c||(c=h),B(o(l=h-c,A,s,a)),C=!0,l1&&arguments[1]!==void 0?arguments[1]:{};switch(a=1e3,n=u.offset||0,I=u.callback,o=u.easing||xKA,r=u.a11y||!1,typeof u.container){case"object":t=u.container;break;case"string":t=document.querySelector(u.container);break;default:t=window.document.documentElement}switch(A=t.scrollTop,typeof h){case"number":e=void 0,r=!1,i=A+h;break;case"object":i=d(e=h);break;case"string":e=document.querySelector(h),i=d(e)}switch(s=i-A+n,typeof u.duration){case"number":a=u.duration;break;case"function":a=u.duration(s)}C?c=0:requestAnimationFrame(E)}};function sQ(t,e){var A=Date.now(),i=t();return e(Date.now()-A),i}var tQ=Sr("validation"),LKA={createObjectDocumentState:()=>({type:"object",properties:{}}),createArrayDocumentState:()=>({type:"array",items:[]}),createValueDocumentState:()=>({type:"value"})};function KrA(t,e,A,i){return rG(t,e,A,i,LKA)}function waA(t,e,A,i){if(tQ("validateJSON"),!e)return[];if(A!==i){var n=A.stringify(t);return e(n!==void 0?i.parse(n):void 0)}return e(t)}function FKA(t,e,A,i){if(tQ("validateText"),t.length>104857600)return{validationErrors:[{path:[],message:"Validation turned off: the document is too large",severity:Fl.info}]};if(t.length!==0)try{var n=sQ(()=>A.parse(t),a=>tQ("validate: parsed json in ".concat(a," ms")));if(!e)return;var o=A===i?n:sQ(()=>i.parse(t),a=>tQ("validate: parsed json with the validationParser in ".concat(a," ms"))),r=sQ(()=>e(o),a=>tQ("validate: validated json in ".concat(a," ms")));return Oi(r)?void 0:{validationErrors:r}}catch(a){var s=sQ(()=>function(c,l){if(c.length>aUA)return!1;try{return l.parse(Rc(c)),!0}catch{return!1}}(t,A),c=>tQ("validate: checked whether repairable in ".concat(c," ms")));return{parseError:dQ(t,a.message||a.toString()),isRepairable:s}}}var ey=Sr("jsoneditor:FocusTracker");function CG(t){var e,{onMount:A,onDestroy:i,getWindow:n,hasFocus:o,onFocus:r,onBlur:s}=t,a=!1;function c(){var I=o();I&&(clearTimeout(e),a||(ey("focus"),r(),a=I))}function l(){a&&(clearTimeout(e),e=setTimeout(()=>{o()||(ey("blur"),a=!1,s())}))}A(()=>{ey("mount FocusTracker");var I=n();I&&(I.addEventListener("focusin",c,!0),I.addEventListener("focusout",l,!0))}),i(()=>{ey("destroy FocusTracker");var I=n();I&&(I.removeEventListener("focusin",c,!0),I.removeEventListener("focusout",l,!0))})}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-message.svelte-czprfx { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - padding: var(--jse-padding, 10px); - display: flex; - gap: var(--jse-padding, 10px); - flex-wrap: wrap; - align-items: stretch; -} -.jse-message.jse-success.svelte-czprfx { - background: var(--message-success-background, #9ac45d); - color: var(--jse-message-success-color, #fff); -} -.jse-message.svelte-czprfx .jse-text:where(.svelte-czprfx) { - display: flex; - flex: 1; - min-width: 60%; - align-items: center; -} -.jse-message.svelte-czprfx .jse-text.jse-clickable:where(.svelte-czprfx) { - cursor: pointer; -} -.jse-message.svelte-czprfx .jse-text.jse-clickable:where(.svelte-czprfx):hover { - background-color: rgba(255, 255, 255, 0.1); -} -.jse-message.jse-error.svelte-czprfx { - background: var(--jse-message-error-background, var(--jse-error-color, #ee5341)); - color: var(--jse-message-error-color, #fff); -} -.jse-message.jse-warning.svelte-czprfx { - background: var(--jse-message-warning-background, #ffde5c); - color: var(--jse-message-warning-color, #4d4d4d); -} -.jse-message.jse-info.svelte-czprfx { - background: var(--jse-message-info-background, #4f91ff); - color: var(--jse-message-info-color, #fff); -} -.jse-message.svelte-czprfx .jse-actions:where(.svelte-czprfx) { - display: flex; - gap: var(--jse-padding, 10px); -} -.jse-message.svelte-czprfx .jse-actions:where(.svelte-czprfx) button.jse-action:where(.svelte-czprfx) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-message-action-background, rgba(255, 255, 255, 0.2)); - color: inherit; - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); -} -.jse-message.svelte-czprfx .jse-actions:where(.svelte-czprfx) button.jse-action:where(.svelte-czprfx):hover { - background: var(--jse-message-action-background-highlight, rgba(255, 255, 255, 0.3)); -}`);var NKA=wA(''),_KA=wA('
      ');function mc(t,e){mt(e,!1);var A=b(e,"type",9,"success"),i=b(e,"icon",9,void 0),n=b(e,"message",9,void 0),o=b(e,"actions",25,()=>[]),r=b(e,"onClick",9,void 0),s=b(e,"onClose",9,void 0);s()&&qc(s()),Zt(!0);var a,c=_KA(),l=W(c),I=W(l),C=W(I),d=E=>{ji(E,{get data(){return i()}})};LA(C,E=>{i()&&E(d)});var B=IA(C);qo(IA(l,2),5,o,or,(E,h)=>{var u=NKA(),D=W(u),L=w=>{ji(w,{get data(){return g(h),nA(()=>g(h).icon)}})};LA(D,w=>{g(h),nA(()=>g(h).icon)&&w(L)});var R=IA(D);De(()=>{var w;En(u,"title",(g(h),nA(()=>g(h).title))),u.disabled=(g(h),nA(()=>g(h).disabled)),wt(R," ".concat((g(h),(w=nA(()=>g(h).text))!==null&&w!==void 0?w:"")))}),ce("click",u,()=>{g(h).onClick&&g(h).onClick()}),ce("mousedown",u,()=>{g(h).onMouseDown&&g(h).onMouseDown()}),iA(E,u)}),De(E=>{var h,u;Vt(c,1,"jse-message jse-".concat((h=A())!==null&&h!==void 0?h:""),"svelte-czprfx"),a=Vt(l,1,"jse-text svelte-czprfx",null,a,E),wt(B," ".concat((u=n())!==null&&u!==void 0?u:""))},[()=>({"jse-clickable":!!r()})],qA),ce("click",l,function(){r()&&r()()}),iA(t,c),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-validation-errors-overview.svelte-1uindol { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - overflow: auto; - max-height: 25%; -} -.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) { - border-collapse: collapse; - width: 100%; -} -.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr:where(.svelte-1uindol) { - cursor: pointer; -} -.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr.jse-validation-error:where(.svelte-1uindol) { - background: var(--jse-message-error-background, var(--jse-error-color, #ee5341)); - color: var(--jse-message-error-color, #fff); -} -.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr.jse-validation-warning:where(.svelte-1uindol) { - background: var(--jse-message-warning-background, #ffde5c); - color: var(--jse-message-warning-color, #4d4d4d); -} -.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr.jse-validation-warning:where(.svelte-1uindol):hover { - filter: brightness(105%); -} -.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr.jse-validation-info:where(.svelte-1uindol) { - background: var(--jse-message-info-background, #4f91ff); - color: var(--jse-message-info-color, #fff); -} -.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr:where(.svelte-1uindol):hover { - filter: brightness(110%); -} -.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr:where(.svelte-1uindol) td:where(.svelte-1uindol) { - padding: 4px var(--jse-padding, 10px); - vertical-align: middle; -} -.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr:where(.svelte-1uindol) td.jse-validation-error-icon:where(.svelte-1uindol) { - width: 36px; - box-sizing: border-box; -} -.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr:where(.svelte-1uindol) td.jse-validation-error-action:where(.svelte-1uindol) { - width: 36px; - box-sizing: border-box; - padding: 0; -} -.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr:where(.svelte-1uindol) td.jse-validation-error-action:where(.svelte-1uindol) button.jse-validation-errors-collapse:where(.svelte-1uindol) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - width: 36px; - height: 26px; - cursor: pointer; -} -.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr:where(.svelte-1uindol) td.jse-validation-error-action:where(.svelte-1uindol) button.jse-validation-errors-collapse:where(.svelte-1uindol):hover { - background-color: rgba(255, 255, 255, 0.2); -} -.jse-validation-errors-overview.svelte-1uindol table:where(.svelte-1uindol) tr:where(.svelte-1uindol) td:where(.svelte-1uindol) div.jse-validation-errors-expand:where(.svelte-1uindol) { - display: inline-block; - position: relative; - top: 3px; -}`);var GKA=wA(''),UKA=wA(' '),KKA=wA(' '),YKA=wA('
      '),JKA=wA('
      '),TKA=wA('
      ');function dG(t,e){mt(e,!1);var A=$(void 0,!0),i=b(e,"validationErrors",9),n=b(e,"selectError",9),o=$(!0,!0);function r(){y(o,!1)}function s(){y(o,!0)}fA(()=>k(i()),()=>{y(A,i().length)}),Qn(),Zt(!0);var a=_o(),c=vt(a),l=I=>{var C=TKA(),d=W(C),B=h=>{var u=YKA(),D=W(u),L=W(D);qo(L,1,()=>(k(Ey),k(i()),k(VD),nA(()=>Ey(i(),VD))),or,(_,K,z)=>{var U=UKA(),H=W(U);ji(W(H),{get data(){return g1}});var q=IA(H),j=W(q),gA=IA(q),QA=W(gA),BA=W(IA(gA)),lA=vA=>{var tA=GKA();ji(W(tA),{get data(){return zW}}),ce("click",tA,j0(r)),iA(vA,tA)};LA(BA,vA=>{k(i()),nA(()=>z===0&&i().length>1)&&vA(lA)}),De(vA=>{var tA;Vt(U,1,"jse-validation-".concat((g(K),(tA=nA(()=>g(K).severity))!==null&&tA!==void 0?tA:"")),"svelte-1uindol"),wt(j,vA),wt(QA,(g(K),nA(()=>g(K).message)))},[()=>(k(Ka),g(K),nA(()=>Ka(g(K).path)))],qA),ce("click",U,()=>{setTimeout(()=>n()(g(K)))}),iA(_,U)});var R=IA(L),w=_=>{var K=KKA(),z=IA(W(K),2),U=W(z);De(()=>wt(U,"(and ".concat(g(A)-VD," more errors)"))),iA(_,K)};LA(R,_=>{g(A)>VD&&_(w)}),iA(h,u)},E=h=>{var u=JKA(),D=W(u),L=W(D),R=W(L);ji(W(R),{get data(){return g1}});var w=W(IA(R));ji(W(IA(w)),{get data(){return qS}}),De(_=>{var K;Vt(L,1,"jse-validation-".concat(_??""),"svelte-1uindol"),wt(w,"".concat((K=g(A))!==null&&K!==void 0?K:""," validation errors "))},[()=>(k(i()),nA(()=>{return _=i(),[Fl.error,Fl.warning,Fl.info].find(K=>_.some(z=>z.severity===K));var _}))],qA),ce("click",L,s),iA(h,u)};LA(d,h=>{g(o)||g(A)===1?h(B):h(E,!1)}),iA(I,C)};LA(c,I=>{k(Oi),k(i()),nA(()=>!Oi(i()))&&I(l)}),iA(t,a),pt()}function ky(t,e){if(t)return t.addEventListener("keydown",A),{destroy(){t.removeEventListener("keydown",A)}};function A(i){i.key==="Escape"&&(i.preventDefault(),i.stopPropagation(),e())}}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -dialog.jse-modal.svelte-1s9c2ql { - border-radius: 3px; - font-size: var(--jse-padding, 10px); - border: none; - padding: 0; - display: flex; - min-width: 0; - margin: auto; - overflow: visible; - transition: width 0.1s ease-in-out, height 0.1s ease-in-out; -} -dialog.jse-modal.jse-sort-modal.svelte-1s9c2ql { - width: 400px; -} -dialog.jse-modal.jse-repair-modal.svelte-1s9c2ql { - width: 600px; - height: 500px; -} -dialog.jse-modal.jse-jsoneditor-modal.svelte-1s9c2ql { - width: 800px; - height: 600px; -} -dialog.jse-modal.jse-transform-modal.svelte-1s9c2ql { - width: 1200px; - height: 800px; -} -dialog.jse-modal.jse-fullscreen.svelte-1s9c2ql { - width: 100%; - height: 100%; -} -dialog.jse-modal.svelte-1s9c2ql::backdrop { - background: var(--jse-overlay-background, rgba(0, 0, 0, 0.3)); -} -dialog.jse-modal[open].svelte-1s9c2ql { - animation: svelte-1s9c2ql-zoom 0.3s cubic-bezier(0.34, 1.56, 0.64, 1); -} -dialog.jse-modal[open].svelte-1s9c2ql::backdrop { - animation: svelte-1s9c2ql-fade 0.2s ease-out; -} -dialog.jse-modal.svelte-1s9c2ql .jse-modal-inner:where(.svelte-1s9c2ql) { - flex: 1; - display: flex; - flex-direction: column; - min-width: 0; - min-height: 0; - padding: 0; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - line-height: normal; - background: var(--jse-modal-background, #f5f5f5); - color: var(--jse-text-color, #4d4d4d); -} -@keyframes svelte-1s9c2ql-zoom { - from { - transform: scale(0.95); - } - to { - transform: scale(1); - } -} -@keyframes svelte-1s9c2ql-fade { - from { - opacity: 0; - } - to { - opacity: 1; - } -} -dialog.jse-modal.svelte-1s9c2ql .svelte-select { - --border: var(--jse-svelte-select-border, 1px solid #d8dbdf); - --item-is-active-bg: var(--jse-item-is-active-bg, #3883fa); - --border-radius: var(--jse-svelte-select-border-radius, 3px); - --background: var(--jse-svelte-select-background, #fff); - --padding: var(--jse-svelte-select-padding, 0 10px); - --multi-select-padding: var(--jse-svelte-select-multi-select-padding, 0 10px); - --font-size: var(--jse-svelte-select-font-size, var(--jse-font-size, 16px)); - --height: 36px; - --multi-item-height: 28px; - --multi-item-margin: 2px; - --multi-item-padding: 2px 8px; - --multi-item-border-radius: 6px; - --indicator-top: 8px; -}`);var HKA=wA('
      ');function X3(t,e){mt(e,!1);var A=b(e,"className",8,void 0),i=b(e,"fullscreen",8,!1),n=b(e,"onClose",8),o=$();function r(){n()()}hs(()=>g(o).showModal()),qc(()=>g(o).close()),Zt();var s,a=HKA(),c=W(a);jo(W(c),e,"default",{},null),Co(a,l=>y(o,l),()=>g(o)),es(()=>ce("close",a,r)),es(()=>{return ce("pointerdown",a,(l=r,function(){for(var I=arguments.length,C=new Array(I),d=0;dce("cancel",a,N1(function(l){N3.call(this,e,l)}))),Us(a,(l,I)=>ky?.(l,I),()=>r),De((l,I)=>s=Vt(a,1,l,"svelte-1s9c2ql",s,I),[()=>Z1((k(Kl),k(A()),nA(()=>Kl("jse-modal",A())))),()=>({"jse-fullscreen":i()})],qA),iA(t,a),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-modal-contents.svelte-189qksl { - flex: 1; - display: flex; - flex-direction: column; - padding: 20px; - overflow: auto; - min-width: 0; - min-height: 0; -} -.jse-modal-contents.svelte-189qksl .jse-actions:where(.svelte-189qksl) { - display: flex; - flex-direction: row; - justify-content: flex-end; - padding-top: var(--jse-padding, 10px); -} -.jse-modal-contents.svelte-189qksl .jse-actions:where(.svelte-189qksl) button.jse-primary:where(.svelte-189qksl) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); - color: var(--jse-button-primary-color, #fff); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-modal-contents.svelte-189qksl .jse-actions:where(.svelte-189qksl) button.jse-primary:where(.svelte-189qksl):hover { - background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); -} -.jse-modal-contents.svelte-189qksl .jse-actions:where(.svelte-189qksl) button.jse-primary:where(.svelte-189qksl):disabled { - background: var(--jse-button-primary-background-disabled, #9d9d9d); -} - -.jse-shortcuts.svelte-189qksl { - display: flex; - flex-wrap: wrap; - justify-content: space-around; - margin: calc(2 * var(--jse-padding, 10px)) 0; -} -.jse-shortcuts.svelte-189qksl .jse-shortcut:where(.svelte-189qksl) .jse-key:where(.svelte-189qksl) { - font-size: 200%; - color: var(--jse-theme-color, #3883fa); -}`);var zKA=wA('
      Clipboard permission is disabled by your browser. You can use:
      for copy
      for cut
      for paste
      ',1);function DaA(t,e){mt(e,!1);var A=b(e,"onClose",9),i=X_()?"\u2318":"Ctrl";Zt(!0),X3(t,{get onClose(){return A()},className:"jse-copy-paste",children:(n,o)=>{var r=zKA(),s=vt(r);My(s,{title:"Copying and pasting",get onClose(){return A()}});var a=IA(s,2),c=IA(W(a),2),l=W(c),I=W(l),C=W(I),d=IA(l,2),B=W(d),E=W(B),h=W(IA(d,2)),u=W(h),D=W(IA(c,2));De(()=>{wt(C,"".concat(i,"+C")),wt(E,"".concat(i,"+X")),wt(u,"".concat(i,"+V"))}),ce("click",D,function(){for(var L,R=arguments.length,w=new Array(R),_=0;_'),PKA=wA('
      '),jKA=wA(''),qKA=wA('
      ');function Oy(t,e){mt(e,!1);var A=b(e,"items",25,()=>[]);Zt(!0);var i=qKA(),n=W(i);jo(n,e,"left",{},null);var o=IA(n,2);qo(o,1,A,or,(r,s)=>{var a=_o(),c=vt(a),l=C=>{iA(C,OKA())},I=(C,d)=>{var B=h=>{iA(h,PKA())},E=(h,u)=>{var D=R=>{var w=jKA(),_=W(w),K=H=>{ji(H,{get data(){return g(s),nA(()=>g(s).icon)}})};LA(_,H=>{g(s),nA(()=>g(s).icon)&&H(K)});var z=IA(_,2),U=H=>{var q=Tr();De(()=>wt(q,(g(s),nA(()=>g(s).text)))),iA(H,q)};LA(z,H=>{g(s),nA(()=>g(s).text)&&H(U)}),De(()=>{var H;Vt(w,1,"jse-button ".concat((g(s),(H=nA(()=>g(s).className))!==null&&H!==void 0?H:"")),"svelte-pf7s2l"),En(w,"title",(g(s),nA(()=>g(s).title))),w.disabled=(g(s),nA(()=>g(s).disabled||!1))}),ce("click",w,function(){for(var H,q=arguments.length,j=new Array(q),gA=0;gA{var w=Tr();De(_=>wt(w,_),[()=>(g(s),nA(()=>function(_){return console.error("Unknown type of menu item",_),"???"}(g(s))))],qA),iA(R,w)};LA(h,R=>{k(q0),g(s),nA(()=>q0(g(s)))?R(D):R(L,!1)},u)};LA(C,h=>{k(p_),g(s),nA(()=>p_(g(s)))?h(B):h(E,!1)},d)};LA(c,C=>{k(G1),g(s),nA(()=>G1(g(s)))?C(l):C(I,!1)}),iA(r,a)}),jo(IA(o,2),e,"right",{},null),iA(t,i),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-json-repair-component.svelte-3golau { - flex: 1; - display: flex; - flex-direction: column; - background: var(--jse-background-color, #fff); - color: var(--jse-text-color, #4d4d4d); -} -.jse-json-repair-component.svelte-3golau .jse-info:where(.svelte-3golau) { - padding: calc(0.5 * var(--jse-padding, 10px)); - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - vertical-align: center; -} -.jse-json-repair-component.svelte-3golau .jse-json-text:where(.svelte-3golau) { - flex: 1; - border: none; - padding: 2px; - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - background: var(--jse-input-background, var(--jse-background-color, #fff)); - color: var(--jse-text-color, #4d4d4d); - resize: none; - outline: none; -}`);var VKA=wA('
      Repair invalid JSON, then click apply
      '),ZKA=wA('
      ');function WKA(t,e){mt(e,!1);var A=$(void 0,!0),i=$(void 0,!0),n=$(void 0,!0),o=$(void 0,!0),r=$(void 0,!0),s=$(void 0,!0),a=b(e,"text",13,""),c=b(e,"readOnly",9,!1),l=b(e,"onParse",9),I=b(e,"onRepair",9),C=b(e,"onChange",9,void 0),d=b(e,"onApply",9),B=b(e,"onCancel",9),E=Sr("jsoneditor:JSONRepair"),h=$(void 0,!0);function u(){if(g(h)&&g(A)){var q=g(A).position!==void 0?g(A).position:0;g(h).setSelectionRange(q,q),g(h).focus()}}function D(){d()(a())}function L(){try{a(I()(a())),C()&&C()(a())}catch{}}var R=$(void 0,!0);fA(()=>k(a()),()=>{y(A,function(q){try{return void l()(q)}catch(j){return dQ(q,j.message)}}(a()))}),fA(()=>k(a()),()=>{y(i,function(q){try{return I()(q),!0}catch{return!1}}(a()))}),fA(()=>g(A),()=>{E("error",g(A))}),fA(()=>k(B()),()=>{y(R,[{type:"space"},{type:"button",icon:I4,title:"Cancel repair",className:"jse-cancel",onClick:B()}])}),fA(()=>XS,()=>{y(n,{icon:XS,text:"Show me",title:"Scroll to the error location",onClick:u})}),fA(()=>L0,()=>{y(o,{icon:L0,text:"Auto repair",title:"Automatically repair JSON",onClick:L})}),fA(()=>(g(i),g(n),g(o)),()=>{y(r,g(i)?[g(n),g(o)]:[g(n)])}),fA(()=>k(c()),()=>{y(s,[{icon:u5,text:"Apply",title:"Apply fixed JSON",disabled:c(),onClick:D}])}),Qn(),Zt(!0);var w=ZKA(),_=W(w);Oy(_,{get items(){return g(R)},$$slots:{left:(q,j)=>{iA(q,VKA())}}});var K=IA(_,2),z=q=>{var j=qA(()=>(g(A),nA(()=>"Cannot parse JSON: ".concat(g(A).message))));mc(q,{type:"error",get icon(){return g1},get message(){return g(j)},get actions(){return g(r)}})},U=q=>{mc(q,{type:"success",message:"JSON is valid now and can be parsed.",get actions(){return g(s)}})};LA(K,q=>{g(A)?q(z):q(U,!1)});var H=IA(K,2);Co(H,q=>y(h,q),()=>g(h)),De(()=>{H.readOnly=c(),VC(H,a())}),ce("input",H,function(q){E("handleChange");var j=q.target.value;a()!==j&&(a(j),C()&&C()(a()))}),iA(t,w),pt()}function yaA(t,e){mt(e,!1);var A=b(e,"text",13),i=b(e,"onParse",9),n=b(e,"onRepair",9),o=b(e,"onApply",9),r=b(e,"onClose",9);function s(c){o()(c),r()()}function a(){r()()}Zt(!0),X3(t,{get onClose(){return r()},className:"jse-repair-modal",children:(c,l)=>{WKA(c,{get onParse(){return i()},get onRepair(){return n()},onApply:s,onCancel:a,get text(){return A()},set text(I){A(I)},$$legacy:!0})},$$slots:{default:!0}}),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -div.jse-collapsed-items.svelte-1h6hzoq { - margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - color: var(--jse-collapsed-items-link-color, rgba(0, 0, 0, 0.38)); - padding: calc(0.5 * var(--jse-padding, 10px)); - border: 8px solid transparent; - border-width: 8px 0; - background-color: var(--jse-contents-background-color, transparent); - background-image: linear-gradient(var(--jse-collapsed-items-background-color, #f5f5f5), var(--jse-collapsed-items-background-color, #f5f5f5)), linear-gradient(to bottom right, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to bottom left, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to top right, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%), linear-gradient(to top left, transparent 50.5%, var(--jse-collapsed-items-background-color, #f5f5f5) 50.5%); - background-repeat: repeat, repeat-x, repeat-x, repeat-x, repeat-x; - background-position: 0 0, 8px 0, 8px 0, 8px 100%, 8px 100%; - background-size: auto auto, 16px 16px, 16px 16px, 16px 16px, 16px 16px; - background-clip: padding-box, border-box, border-box, border-box, border-box; - background-origin: padding-box, border-box, border-box, border-box, border-box; - display: flex; -} -div.jse-collapsed-items.jse-selected.svelte-1h6hzoq { - background-color: var(--jse-selection-background-color, #d3d3d3); - --jse-collapsed-items-background-color: var(--jse-collapsed-items-selected-background-color, #c2c2c2); -} -div.jse-collapsed-items.svelte-1h6hzoq div.jse-text:where(.svelte-1h6hzoq), -div.jse-collapsed-items.svelte-1h6hzoq button.jse-expand-items:where(.svelte-1h6hzoq) { - margin: 0 calc(0.5 * var(--jse-padding, 10px)); -} -div.jse-collapsed-items.svelte-1h6hzoq div.jse-text:where(.svelte-1h6hzoq) { - display: inline; -} -div.jse-collapsed-items.svelte-1h6hzoq button.jse-expand-items:where(.svelte-1h6hzoq) { - font-family: inherit; - font-size: inherit; - color: var(--jse-collapsed-items-link-color, rgba(0, 0, 0, 0.38)); - background: none; - border: none; - padding: 0; - text-decoration: underline; - cursor: pointer; -} -div.jse-collapsed-items.svelte-1h6hzoq button.jse-expand-items:where(.svelte-1h6hzoq):hover, div.jse-collapsed-items.svelte-1h6hzoq button.jse-expand-items:where(.svelte-1h6hzoq):focus { - color: var(--jse-collapsed-items-link-color-highlight, #ee5341); -}`);var XKA=wA(''),$KA=wA('
      ');function AYA(t,e){mt(e,!1);var A=$(void 0,!0),i=$(void 0,!0),n=$(void 0,!0),o=$(void 0,!0),r=$(void 0,!0),s=b(e,"visibleSections",9),a=b(e,"sectionIndex",9),c=b(e,"total",9),l=b(e,"path",9),I=b(e,"selection",9),C=b(e,"onExpandSection",9),d=b(e,"context",9);fA(()=>(k(s()),k(a())),()=>{y(A,s()[a()])}),fA(()=>g(A),()=>{y(i,g(A).end)}),fA(()=>(k(s()),k(a()),k(c())),()=>{y(n,s()[a()+1]?s()[a()+1].start:c())}),fA(()=>(k(d()),k(I()),k(l()),g(i)),()=>{y(o,V3(d().getJson(),I(),l().concat(String(g(i)))))}),fA(()=>(g(i),g(n)),()=>{y(r,function(R,w){var _={start:R,end:Math.min(m_(R),w)},K=Math.max(hy((R+w)/2),R),z={start:K,end:Math.min(m_(K),w)},U=hy(w),H=U===w?U-O3:U,q={start:Math.max(H,R),end:w},j=[_],gA=z.start>=_.end&&z.end<=q.start;return gA&&j.push(z),q.start>=(gA?z.end:_.end)&&j.push(q),j}(g(i),g(n)))}),Qn(),Zt(!0);var B,E,h=$KA(),u=W(h),D=W(u),L=W(D);qo(IA(D,2),1,()=>g(r),or,(R,w)=>{var _=XKA(),K=W(_);De(()=>{var z,U;return wt(K,"show ".concat((g(w),(z=nA(()=>g(w).start))!==null&&z!==void 0?z:""),"-").concat((g(w),(U=nA(()=>g(w).end))!==null&&U!==void 0?U:"")))}),ce("click",_,()=>C()(l(),g(w))),iA(R,_)}),De((R,w)=>{var _,K;B=Vt(h,1,"jse-collapsed-items svelte-1h6hzoq",null,B,R),E=Ll(h,"",E,w),wt(L,"Items ".concat((_=g(i))!==null&&_!==void 0?_:"","-").concat((K=g(n))!==null&&K!==void 0?K:""))},[()=>({"jse-selected":g(o)}),()=>({"--level":(k(l()),nA(()=>l().length+2))})],qA),ce("mousemove",h,function(R){R.stopPropagation()}),iA(t,h),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-context-menu-pointer.svelte-137iwnw { - position: absolute; - top: calc(-0.5 * var(--jse-context-menu-pointer-size, calc(1em + 4px))); - right: calc(-0.5 * var(--jse-context-menu-pointer-size, calc(1em + 4px))); - width: var(--jse-context-menu-pointer-size, calc(1em + 4px)); - height: var(--jse-context-menu-pointer-size, calc(1em + 4px)); - padding: 0; - margin: 0; - cursor: pointer; - background: transparent; - border-radius: 2px; - background: var(--jse-context-menu-pointer-hover-background, #b2b2b2); - color: var(--jse-context-menu-pointer-color, var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff))); - border: none; - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); -} -.jse-context-menu-pointer.jse-root.svelte-137iwnw { - top: 0; - right: calc(-2px - var(--jse-context-menu-pointer-size, calc(1em + 4px))); -} -.jse-context-menu-pointer.jse-insert.svelte-137iwnw { - right: -1px; -} -.jse-context-menu-pointer.svelte-137iwnw:hover { - background: var(--jse-context-menu-pointer-background-highlight, var(--jse-context-menu-background-highlight, #7a7a7a)); -} -.jse-context-menu-pointer.jse-selected.svelte-137iwnw { - background: var(--jse-context-menu-pointer-background, var(--jse-context-menu-background, #656565)); -} -.jse-context-menu-pointer.jse-selected.svelte-137iwnw:hover { - background: var(--jse-context-menu-pointer-background-highlight, var(--jse-context-menu-background-highlight, #7a7a7a)); -}`);var eYA=wA('');function _1(t,e){mt(e,!1);var A=b(e,"root",9,!1),i=b(e,"insert",9,!1),n=b(e,"selected",9),o=b(e,"onContextMenu",9);Zt(!0);var r,s=eYA();ji(W(s),{get data(){return mg}}),De(a=>{r=Vt(s,1,"jse-context-menu-pointer svelte-137iwnw",null,r,a),En(s,"title",AG)},[()=>({"jse-root":A(),"jse-insert":i(),"jse-selected":n()})],qA),ce("click",s,function(a){for(var c=a.target;c&&c.nodeName!=="BUTTON";)c=c.parentNode;c&&o()({anchor:c,left:0,top:0,width:W0,height:Z0,offsetTop:2,offsetLeft:0,showTip:!0})}),iA(t,s),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-key.svelte-2iqnqn { - display: inline-block; - min-width: 2em; - padding: 0 5px; - box-sizing: border-box; - outline: none; - border-radius: 1px; - vertical-align: top; - color: var(--jse-key-color, #1a1a1a); - word-break: normal; - overflow-wrap: normal; - white-space: pre-wrap; -} -.jse-key.jse-empty.svelte-2iqnqn { - min-width: 3em; - outline: 1px dotted var(--jse-tag-background, rgba(0, 0, 0, 0.2)); - -moz-outline-radius: 2px; -} -.jse-key.jse-empty.svelte-2iqnqn::after { - pointer-events: none; - color: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); - content: "key"; -}`);var tYA=wA('
      '),iYA=wA(" ",1),nYA=wA('
      ');function vaA(t,e){mt(e,!0);var A=Ga(()=>an(e.selection)&&br(e.selection)),i=Ga(()=>e.context.onRenderValue({path:e.path,value:e.value,mode:e.context.mode,truncateTextSize:e.context.truncateTextSize,readOnly:e.context.readOnly,enforceString:e.enforceString,isEditing:g(A),parser:e.context.parser,normalization:e.context.normalization,selection:e.selection,searchResultItems:e.searchResultItems,onPatch:e.context.onPatch,onPasteJson:e.context.onPasteJson,onSelect:e.context.onSelect,onFind:e.context.onFind,findNextInside:e.context.findNextInside,focus:e.context.focus})),n=_o();qo(vt(n),17,()=>g(i),or,(o,r)=>{var s=_o(),a=vt(s),c=I=>{var C=nYA(),d=Ga(()=>g(r).action);Us(C,(B,E)=>{var h;return(h=g(d))===null||h===void 0?void 0:h(B,E)},()=>g(r).props),iA(I,C)},l=I=>{var C=_o(),d=Ga(()=>g(r).component);MsA(vt(C),()=>g(d),(B,E)=>{E(B,z1(()=>g(r).props))}),iA(I,C)};LA(a,I=>{CUA(g(r))?I(c):I(l,!1)}),iA(o,s)}),iA(t,n),pt()}var oYA={selecting:!1,selectionAnchor:void 0,selectionAnchorType:void 0,selectionFocus:void 0,dragging:!1};function i_(t){var{json:e,selection:A,deltaY:i,items:n}=t;if(!A)return{operations:void 0,updatedSelection:void 0,offset:0};var o=i<0?function(l){for(var{json:I,items:C,selection:d,deltaY:B}=l,E=X0(I,d),h=C.findIndex(_=>di(_.path,E)),u=()=>{var _;return(_=C[D-1])===null||_===void 0?void 0:_.height},D=h,L=0;u()!==void 0&&Math.abs(B)>L+u()/2;)L+=u(),D-=1;var R=C[D].path,w=D-h;return D!==h&&C[D]!==void 0?{beforePath:R,offset:w}:void 0}({json:e,selection:A,deltaY:i,items:n}):function(l){for(var I,{json:C,items:d,selection:B,deltaY:E}=l,h=P1(C,B),u=d.findIndex(H=>di(H.path,h)),D=0,L=u,R=()=>{var H;return(H=d[L+1])===null||H===void 0?void 0:H.height};R()!==void 0&&Math.abs(E)>D+R()/2;)D+=R(),L+=1;var w=Fi(h),_=Ke(C,w),K=Array.isArray(_)?L:L+1,z=(I=d[K])===null||I===void 0?void 0:I.path,U=L-u;return z?{beforePath:z,offset:U}:{append:!0,offset:U}}({json:e,selection:A,deltaY:i,items:n});if(!o||o.offset===0)return{operations:void 0,updatedSelection:void 0,offset:0};var r=function(l,I,C){if(!I)return[];var d="beforePath"in C?C.beforePath:void 0,B="append"in C?C.append:void 0,E=Fi(et(I)),h=Ke(l,E);if(!(B||d&&Pg(d,E)&&d.length>E.length))return[];var u=X0(l,I),D=P1(l,I),L=hi(u),R=hi(D),w=d?d[E.length]:void 0;if(!xo(h)){if(wo(h)){var _=ts(L),K=ts(R),z=w!==void 0?ts(w):h.length;return YS(K-_+1,z<_?gA=>({op:"move",from:Ct(E.concat(String(_+gA))),path:Ct(E.concat(String(z+gA)))}):()=>({op:"move",from:Ct(E.concat(String(_))),path:Ct(E.concat(String(z)))}))}throw new Error("Cannot create move operations: parent must be an Object or Array")}var U=Object.keys(h),H=U.indexOf(L),q=U.indexOf(R),j=B?U.length:w!==void 0?U.indexOf(w):-1;return H!==-1&&q!==-1&&j!==-1?j>H?[...U.slice(H,q+1),...U.slice(j,U.length)].map(gA=>X1(E,gA)):[...U.slice(j,H),...U.slice(q+1,U.length)].map(gA=>X1(E,gA)):[]}(e,A,o),s=Fi(X0(e,A)),a=Ke(e,s);if(Array.isArray(a)){var c=function(l){var I,C,{items:d,json:B,selection:E,offset:h}=l,u=X0(B,E),D=P1(B,E),L=d.findIndex(K=>di(K.path,u)),R=d.findIndex(K=>di(K.path,D)),w=(I=d[L+h])===null||I===void 0?void 0:I.path,_=(C=d[R+h])===null||C===void 0?void 0:C.path;return _s(w,_)}({items:n,json:e,selection:A,offset:o.offset});return{operations:r,updatedSelection:c,offset:o.offset}}return{operations:r,updatedSelection:void 0,offset:o.offset}}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -button.jse-validation-error.svelte-1a8aobl { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - padding: 0; - margin: 0; - vertical-align: top; - display: inline-flex; - color: var(--jse-error-color, #ee5341); -} - -button.jse-validation-info.svelte-1a8aobl { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - padding: 0; - margin: 0; - vertical-align: top; - display: inline-flex; - color: var(--jse-info-color, #4f91ff); -} - -button.jse-validation-warning.svelte-1a8aobl { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - padding: 0; - margin: 0; - vertical-align: top; - display: inline-flex; - color: var(--jse-warning-color, #fdc539); -}`);var rYA=wA('');function gQ(t,e){mt(e,!1);var A=$(),i=$1("absolute-popup"),n=b(e,"validationError",8),o=b(e,"onExpand",8);fA(()=>k(n()),()=>{y(A,IUA(n())&&n().isChildError?"Contains invalid data":n().message)}),Qn(),Zt();var r=rYA();ji(W(r),{get data(){return g1}}),es(()=>ce("click",r,function(){for(var s,a=arguments.length,c=new Array(a),l=0;lhQ?.(s,a),()=>fe({text:g(A)},i)),De(()=>{var s;return Vt(r,1,"jse-validation-".concat((k(n()),(s=nA(()=>n().severity))!==null&&s!==void 0?s:"")),"svelte-1a8aobl")}),iA(t,r),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-expand.svelte-oawf7x { - width: var(--jse-indent-size, calc(1em + 4px)); - padding: 0; - margin: 0; - border: none; - cursor: pointer; - background: transparent; - color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); - font-size: var(--jse-font-size-mono, 14px); - height: var(--jse-line-height, calc(1em + 4px)); -} -.jse-expand.svelte-oawf7x:hover { - opacity: 0.8; -} - -.jse-meta.svelte-oawf7x, -.jse-separator.svelte-oawf7x, -.jse-index.svelte-oawf7x, -.jse-bracket.svelte-oawf7x { - vertical-align: top; - color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); -} - -.jse-index.svelte-oawf7x { - padding: 0 calc(0.5 * var(--jse-padding, 10px)); -} - -.jse-bracket.svelte-oawf7x { - padding: 0 2px; -} -.jse-bracket.jse-expanded.svelte-oawf7x { - padding-right: var(--jse-padding, 10px); -} - -.jse-identifier.svelte-oawf7x { - vertical-align: top; - position: relative; -} - -.jse-json-node.svelte-oawf7x { - position: relative; - color: var(--jse-text-color, #4d4d4d); -} -.jse-json-node.jse-root.svelte-oawf7x { - min-height: 100%; - padding-bottom: 2px; - box-sizing: border-box; -} -.jse-json-node.jse-root.svelte-oawf7x > .jse-contents-outer:where(.svelte-oawf7x) > .jse-contents:where(.svelte-oawf7x) { - padding-left: 0; -} -.jse-json-node.svelte-oawf7x .jse-props:where(.svelte-oawf7x), -.jse-json-node.svelte-oawf7x .jse-items:where(.svelte-oawf7x) { - position: relative; -} -.jse-json-node.svelte-oawf7x .jse-header-outer:where(.svelte-oawf7x), -.jse-json-node.svelte-oawf7x .jse-footer-outer:where(.svelte-oawf7x) { - display: flex; - margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); -} -.jse-json-node.svelte-oawf7x .jse-header:where(.svelte-oawf7x) { - position: relative; -} -.jse-json-node.svelte-oawf7x .jse-header:where(.svelte-oawf7x) .jse-meta:where(.svelte-oawf7x) > .jse-meta-inner:where(.svelte-oawf7x) { - display: flex; - justify-content: center; -} -.jse-json-node.svelte-oawf7x .jse-contents-outer:where(.svelte-oawf7x) { - display: flex; - margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); -} -.jse-json-node.svelte-oawf7x .jse-header:where(.svelte-oawf7x), -.jse-json-node.svelte-oawf7x .jse-contents:where(.svelte-oawf7x) { - display: flex; - flex-direction: row; - align-items: flex-start; -} -.jse-json-node.svelte-oawf7x .jse-contents:where(.svelte-oawf7x) { - padding-left: var(--jse-indent-size, calc(1em + 4px)); - cursor: var(--jse-contents-cursor, pointer); -} -.jse-json-node.svelte-oawf7x .jse-contents:where(.svelte-oawf7x) .jse-value-outer:where(.svelte-oawf7x) { - display: inline-flex; -} -.jse-json-node.svelte-oawf7x .jse-footer:where(.svelte-oawf7x) { - display: inline-flex; - padding-left: calc(var(--jse-indent-size, calc(1em + 4px)) + 5px); -} -.jse-json-node.svelte-oawf7x .jse-header:where(.svelte-oawf7x), -.jse-json-node.svelte-oawf7x .jse-contents:where(.svelte-oawf7x), -.jse-json-node.svelte-oawf7x .jse-footer:where(.svelte-oawf7x) { - background: var(--jse-contents-background-color, transparent); -} -.jse-json-node.svelte-oawf7x .jse-insert-selection-area:where(.svelte-oawf7x) { - padding: 0 calc(0.5 * var(--jse-padding, 10px)); - flex: 1; -} -.jse-json-node.svelte-oawf7x .jse-insert-selection-area.jse-inside:where(.svelte-oawf7x) { - display: inline-flex; - align-items: center; -} -.jse-json-node.svelte-oawf7x .jse-insert-selection-area.jse-after:where(.svelte-oawf7x) { - display: flex; - align-items: flex-end; -} -.jse-json-node.svelte-oawf7x .jse-context-menu-pointer-anchor:where(.svelte-oawf7x) { - position: relative; -} -.jse-json-node.svelte-oawf7x .jse-insert-area:where(.svelte-oawf7x) { - display: flex; - position: relative; - z-index: 1; - margin-left: calc(var(--level) * var(--jse-indent-size, calc(1em + 4px))); - max-width: 250px; - min-width: 100px; - height: 0; - margin-right: calc(0.5 * var(--jse-padding, 10px)); - outline: 1px solid; -} -.jse-json-node.svelte-oawf7x .jse-insert-area.jse-hovered:where(.svelte-oawf7x) { - outline-color: var(--jse-context-menu-pointer-hover-background, #b2b2b2); -} -.jse-json-node.svelte-oawf7x .jse-key-outer:where(.svelte-oawf7x) { - position: relative; -} -.jse-json-node.svelte-oawf7x .jse-key-outer:where(.svelte-oawf7x):hover, -.jse-json-node.svelte-oawf7x .jse-value-outer:where(.svelte-oawf7x):hover, -.jse-json-node.svelte-oawf7x .jse-meta:where(.svelte-oawf7x):hover, -.jse-json-node.svelte-oawf7x .jse-footer:where(.svelte-oawf7x):hover { - background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); - cursor: var(--jse-contents-cursor, pointer); -} -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-value-outer, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-meta, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-footer { - background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); - cursor: var(--jse-contents-cursor, pointer); -} -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-value-outer .jse-value-outer, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-value-outer .jse-meta, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-meta .jse-value-outer, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-meta .jse-meta, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header .jse-value-outer, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-header .jse-meta, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents .jse-value-outer, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-items .jse-contents .jse-meta, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header .jse-value-outer, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-header .jse-meta, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents .jse-value-outer, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-props .jse-contents .jse-meta, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-footer .jse-value-outer, -.jse-json-node.jse-hovered.svelte-oawf7x:not(.jse-selected):not(.jse-selected-value) .jse-footer .jse-meta { - background: none; -} -.jse-json-node.jse-selected.svelte-oawf7x .jse-header:where(.svelte-oawf7x), -.jse-json-node.jse-selected.svelte-oawf7x .jse-contents:where(.svelte-oawf7x), -.jse-json-node.jse-selected.svelte-oawf7x .jse-footer:where(.svelte-oawf7x) { - background: var(--jse-selection-background-color, #d3d3d3); - cursor: var(--jse-contents-selected-cursor, grab); -} -.jse-json-node.jse-selected.svelte-oawf7x .jse-key-outer:where(.svelte-oawf7x):hover, -.jse-json-node.jse-selected.svelte-oawf7x .jse-value-outer:where(.svelte-oawf7x):hover, -.jse-json-node.jse-selected.svelte-oawf7x .jse-meta:where(.svelte-oawf7x):hover, -.jse-json-node.jse-selected.svelte-oawf7x .jse-footer:where(.svelte-oawf7x):hover { - background: inherit; - cursor: inherit; -} -.jse-json-node.svelte-oawf7x .jse-key-outer.jse-selected-key:where(.svelte-oawf7x) { - background: var(--jse-selection-background-color, #d3d3d3); - cursor: var(--jse-contents-selected-cursor, grab); -} -.jse-json-node.jse-selected-value.svelte-oawf7x .jse-value-outer, -.jse-json-node.jse-selected-value.svelte-oawf7x .jse-meta, -.jse-json-node.jse-selected-value.svelte-oawf7x .jse-items .jse-header, -.jse-json-node.jse-selected-value.svelte-oawf7x .jse-items .jse-contents, -.jse-json-node.jse-selected-value.svelte-oawf7x .jse-props .jse-header, -.jse-json-node.jse-selected-value.svelte-oawf7x .jse-props .jse-contents, -.jse-json-node.jse-selected-value.svelte-oawf7x .jse-footer { - background: var(--jse-selection-background-color, #d3d3d3); - cursor: var(--jse-contents-selected-cursor, grab); -} -.jse-json-node.jse-selected-value.svelte-oawf7x .jse-value-outer .jse-key-outer:hover, -.jse-json-node.jse-selected-value.svelte-oawf7x .jse-meta .jse-key-outer:hover, -.jse-json-node.jse-selected-value.svelte-oawf7x .jse-items .jse-header .jse-key-outer:hover, -.jse-json-node.jse-selected-value.svelte-oawf7x .jse-items .jse-contents .jse-key-outer:hover, -.jse-json-node.jse-selected-value.svelte-oawf7x .jse-props .jse-header .jse-key-outer:hover, -.jse-json-node.jse-selected-value.svelte-oawf7x .jse-props .jse-contents .jse-key-outer:hover, -.jse-json-node.jse-selected-value.svelte-oawf7x .jse-footer .jse-key-outer:hover { - background: inherit; - cursor: inherit; -} -.jse-json-node.jse-readonly.svelte-oawf7x { - --jse-contents-selected-cursor: pointer; -} -.jse-json-node.svelte-oawf7x .jse-insert-area.jse-selected:where(.svelte-oawf7x) { - outline-color: var(--jse-context-menu-pointer-background, var(--jse-context-menu-background, #656565)); -}`);var Io=Gy(()=>oYA),sYA=wA('
      :
      '),aYA=wA('
      [
       ',1),cYA=wA('
      [
      ]
      ',1),lYA=wA('
      '),gYA=wA('
      '),IYA=wA('
      '),CYA=wA('
      '),dYA=wA('
      '),BYA=wA(" ",1),EYA=wA('
      '),QYA=wA('
      ',1),hYA=wA('
      ',1),uYA=wA('
      :
      '),fYA=wA('
      {
      '),mYA=wA('
      {
      }
      ',1),pYA=wA('
      '),wYA=wA('
      '),DYA=wA('
      '),yYA=wA('
      '),vYA=wA('
      '),bYA=wA('
      '),MYA=wA('
      ',1),kYA=wA('
      ',1),SYA=wA('
      :
      '),RYA=wA('
      '),xYA=wA('
      '),LYA=wA('
      '),FYA=wA('
      '),NYA=wA('
      ');function x_(t,e){mt(e,!1);var A=$(void 0,!0),i=$(void 0,!0),n=b(e,"pointer",9),o=b(e,"value",9),r=b(e,"state",9),s=b(e,"validationErrors",9),a=b(e,"searchResults",9),c=b(e,"selection",9),l=b(e,"context",9),I=b(e,"onDragSelectionStart",9),C=Sr("jsoneditor:JSONNode"),d=$(void 0,!0),B=void 0,E=$(void 0,!0),h=$(void 0,!0),u=$(void 0,!0),D=$(void 0,!0),L=$(void 0,!0),R=$(void 0,!0),w=$(void 0,!0);function _(uA){uA.stopPropagation();var eA=$_(uA);l().onExpand(g(h),!g(u),eA)}function K(){l().onExpand(g(h),!0)}function z(uA,eA){var UA=gf(g(h),Object.keys(o()),uA,eA);return l().onPatch(UA),hi(ks(UA[0].path))}function U(uA){l().onDrag(uA)}function H(uA){Io().selecting&&(Io(Io().selecting=!1),uA.stopPropagation()),l().onDragEnd(),document.removeEventListener("mousemove",U,!0),document.removeEventListener("mouseup",H)}function q(){var uA;return((uA=l().findElement([]))===null||uA===void 0||(uA=uA.getBoundingClientRect())===null||uA===void 0?void 0:uA.top)||0}function j(uA,eA){var UA=q()-uA.initialContentTop;return eA.clientY-uA.initialClientY-UA}function gA(uA){if(!l().readOnly&&c()){var eA=Fi(et(c()));if(di(g(h),eA)){var UA=function(mA,sA){var xt=[];function tt(Y){var P=g(h).concat(Y),X=l().findElement(P);X!==void 0&&xt.push({path:P,height:X.clientHeight})}if(Array.isArray(o())){var de=l().getJson();if(de===void 0)return;var Dt=X0(de,mA),_e=P1(de,mA),Le=parseInt(hi(Dt),10),bt=parseInt(hi(_e),10),Re=sA.find(Y=>Le>=Y.start&&bt<=Y.end);if(!Re)return;var{start:$t,end:x}=Re;FsA($t,Math.min(o().length,x),Y=>tt(String(Y)))}else Object.keys(o()).forEach(tt);return xt}(c(),g(L)||aQ);if(C("dragSelectionStart",{selection:c(),items:UA}),UA){var aA=l().getJson();if(aA!==void 0){var le=X0(aA,c()),SA=UA.findIndex(mA=>di(mA.path,le)),{offset:Ue}=i_({json:aA,selection:l().getSelection(),deltaY:0,items:UA});y(E,{initialTarget:uA.target,initialClientY:uA.clientY,initialContentTop:q(),selectionStartIndex:SA,selectionItemsCount:W1(aA,c()).length,items:UA,offset:Ue,didMoveItems:!1}),Io(Io().dragging=!0),document.addEventListener("mousemove",QA,!0),document.addEventListener("mouseup",BA)}}else C("Cannot drag the current selection (probably spread over multiple sections)")}else I()(uA)}}function QA(uA){if(g(E)){var eA=l().getJson();if(eA===void 0)return;var UA=j(g(E),uA),{offset:aA}=i_({json:eA,selection:l().getSelection(),deltaY:UA,items:g(E).items});aA!==g(E).offset&&(C("drag selection",aA,UA),y(E,fe(fe({},g(E)),{},{offset:aA,didMoveItems:!0})))}}function BA(uA){if(g(E)){var eA=l().getJson();if(eA===void 0)return;var UA=j(g(E),uA),{operations:aA,updatedSelection:le}=i_({json:eA,selection:l().getSelection(),deltaY:UA,items:g(E).items});if(aA)l().onPatch(aA,(mA,sA)=>({state:sA,selection:le??c()}));else if(uA.target===g(E).initialTarget&&!g(E).didMoveItems){var SA=zN(uA.target),Ue=PsA(uA.target);Ue&&l().onSelect(frA(SA,Ue))}y(E,void 0),Io(Io().dragging=!1),document.removeEventListener("mousemove",QA,!0),document.removeEventListener("mouseup",BA)}}function lA(uA){uA.shiftKey||(uA.stopPropagation(),uA.preventDefault(),l().onSelect(r2(g(h))))}function vA(uA){uA.shiftKey||(uA.stopPropagation(),uA.preventDefault(),l().onSelect(t2(g(h))))}function tA(uA){l().onSelect(r2(g(h))),io(),l().onContextMenu(uA)}function cA(uA){l().onSelect(t2(g(h))),io(),l().onContextMenu(uA)}fA(()=>k(n()),()=>{y(h,ks(n()))}),fA(()=>k(n()),()=>{y(A,encodeURIComponent(n()))}),fA(()=>k(r()),()=>{y(u,!!ZC(r())&&r().expanded)}),fA(()=>(k(o()),k(r())),()=>{y(D,zg(o(),r(),[]))}),fA(()=>k(r()),()=>{y(L,Mr(r())?r().visibleSections:void 0)}),fA(()=>k(s()),()=>{var uA;y(R,(uA=s())===null||uA===void 0?void 0:uA.validationError)}),fA(()=>(k(l()),k(c()),g(h)),()=>{y(w,V3(l().getJson(),c(),g(h)))}),fA(()=>g(h),()=>{y(i,g(h).length===0)}),Qn(),Zt(!0);var pA,VA,oe=NYA(),KA=W(oe),CA=uA=>{var eA=hYA(),UA=vt(eA),aA=W(UA),le=W(aA),SA=W(le),Ue=kA=>{ji(kA,{get data(){return mg}})},mA=kA=>{ji(kA,{get data(){return sE}})};LA(SA,kA=>{g(u)?kA(Ue):kA(mA,!1)});var sA=IA(le,2);jo(sA,e,"identifier",{},null);var xt=IA(sA,2),tt=kA=>{iA(kA,sYA())};LA(xt,kA=>{g(i)||kA(tt)});var de=IA(xt,2),Dt=W(de),_e=W(Dt),Le=kA=>{var DA=aYA();ly(IA(vt(DA),2),{children:(gt,Ve)=>{var ZA=Tr();De(()=>{var rt,Ei;return wt(ZA,"".concat((k(o()),(rt=nA(()=>o().length))!==null&&rt!==void 0?rt:""),` - `).concat((k(o()),(Ei=nA(()=>o().length===1?"item":"items"))!==null&&Ei!==void 0?Ei:"")))}),iA(gt,ZA)},$$slots:{default:!0}}),iA(kA,DA)},bt=kA=>{var DA=cYA();ly(IA(vt(DA),2),{onclick:K,children:(gt,Ve)=>{var ZA=Tr();De(()=>{var rt,Ei;return wt(ZA,"".concat((k(o()),(rt=nA(()=>o().length))!==null&&rt!==void 0?rt:""),` - `).concat((k(o()),(Ei=nA(()=>o().length===1?"item":"items"))!==null&&Ei!==void 0?Ei:"")))}),iA(gt,ZA)},$$slots:{default:!0}}),iA(kA,DA)};LA(_e,kA=>{g(u)?kA(Le):kA(bt,!1)});var Re=IA(de,2),$t=kA=>{var DA=lYA();_1(W(DA),{get root(){return g(i)},selected:!0,get onContextMenu(){return k(l()),nA(()=>l().onContextMenu)}}),iA(kA,DA)};LA(Re,kA=>{k(l()),g(w),k(c()),k(an),k(Kn),k(br),k(di),k(et),g(h),nA(()=>!l().readOnly&&g(w)&&c()&&(an(c())||Kn(c()))&&!br(c())&&di(et(c()),g(h)))&&kA($t)});var x=IA(aA,2),Y=kA=>{gQ(kA,{get validationError(){return g(R)},onExpand:K})};LA(x,kA=>{g(R),g(u),nA(()=>g(R)&&(!g(u)||!g(R).isChildError))&&kA(Y)});var P=IA(x,2),X=kA=>{var DA=gYA();ce("click",DA,lA),iA(kA,DA)},bA=kA=>{var DA=IYA();ce("click",DA,vA),iA(kA,DA)};LA(P,kA=>{g(u)?kA(X):kA(bA,!1)});var Be=IA(UA,2),Ee=kA=>{var DA=QYA(),gt=vt(DA),Ve=W(gt),ZA=qi=>{var xe,nn,mi=CYA(),Ot=W(mi),Lt=qA(()=>(g(w),k(fr),k(c()),nA(()=>g(w)&&fr(c()))));_1(Ot,{insert:!0,get selected(){return g(Lt)},onContextMenu:tA}),De((ii,_i)=>{xe=Vt(mi,1,"jse-insert-area jse-inside svelte-oawf7x",null,xe,ii),En(mi,"title",jN),nn=Ll(mi,"",nn,_i)},[()=>({"jse-hovered":g(d)===KC,"jse-selected":g(w)&&fr(c())}),()=>({"--level":(g(h),nA(()=>g(h).length+1))})],qA),iA(qi,mi)};LA(Ve,qi=>{k(l()),g(d),k(KC),g(w),k(fr),k(c()),nA(()=>!l().readOnly&&(g(d)===KC||g(w)&&fr(c())))&&qi(ZA)}),qo(IA(Ve,2),1,()=>g(L)||aQ,or,(qi,xe,nn)=>{var mi=BYA(),Ot=vt(mi);qo(Ot,1,()=>(k(o()),g(xe),g(E),nA(()=>function(_i,Tt,M){var We=Tt.start,ni=Math.min(Tt.end,_i.length),pi=d5(We,ni);return M&&M.offset!==0?$oA(pi,M.selectionStartIndex,M.selectionItemsCount,M.offset).map((dn,mn)=>({index:dn,gutterIndex:mn})):pi.map(dn=>({index:dn,gutterIndex:dn}))}(o(),g(xe),g(E)))),_i=>_i.index,(_i,Tt)=>{var M=_o(),We=qA(()=>(k(Mr),k(s()),g(Tt),nA(()=>Mr(s())?s().items[g(Tt).index]:void 0))),ni=qA(()=>(k(XD),k(l()),k(c()),g(h),g(Tt),nA(()=>XD(l().getJson(),c(),g(h).concat(String(g(Tt).index)))))),pi=vt(M),dn=qA(()=>(k(qu),k(n()),g(Tt),nA(()=>qu(n(),g(Tt).index)))),mn=qA(()=>(k(Mr),k(r()),g(Tt),nA(()=>Mr(r())?r().items[g(Tt).index]:void 0))),Uo=qA(()=>(k(Mr),k(a()),g(Tt),nA(()=>Mr(a())?a().items[g(Tt).index]:void 0)));x_(pi,{get value(){return k(o()),g(Tt),nA(()=>o()[g(Tt).index])},get pointer(){return g(dn)},get state(){return g(mn)},get validationErrors(){return g(We)},get searchResults(){return g(Uo)},get selection(){return g(ni)},get context(){return l()},onDragSelectionStart:gA,$$slots:{identifier:(kn,Wn)=>{var Vo=dYA(),vo=W(Vo),bo=W(vo);De(()=>wt(bo,(g(Tt),nA(()=>g(Tt).gutterIndex)))),iA(kn,Vo)}}}),iA(_i,M)});var Lt=IA(Ot,2),ii=_i=>{var Tt=qA(()=>g(L)||aQ);AYA(_i,{get visibleSections(){return g(Tt)},sectionIndex:nn,get total(){return k(o()),nA(()=>o().length)},get path(){return g(h)},get onExpandSection(){return k(l()),nA(()=>l().onExpandSection)},get selection(){return c()},get context(){return l()}})};LA(Lt,_i=>{g(xe),k(o()),nA(()=>g(xe).end{var xe=EYA();ce("click",xe,vA),iA(qi,xe)};LA(Ei,qi=>{g(i)||qi(tn)}),iA(kA,DA)};LA(Be,kA=>{g(u)&&kA(Ee)}),ce("click",le,_),iA(uA,eA)},TA=(uA,eA)=>{var UA=le=>{var SA=kYA(),Ue=vt(SA),mA=W(Ue),sA=W(mA),xt=W(sA),tt=ZA=>{ji(ZA,{get data(){return mg}})},de=ZA=>{ji(ZA,{get data(){return sE}})};LA(xt,ZA=>{g(u)?ZA(tt):ZA(de,!1)});var Dt=IA(sA,2);jo(Dt,e,"identifier",{},null);var _e=IA(Dt,2),Le=ZA=>{iA(ZA,uYA())};LA(_e,ZA=>{g(i)||ZA(Le)});var bt=IA(_e,2),Re=W(bt),$t=W(Re),x=ZA=>{iA(ZA,fYA())},Y=ZA=>{var rt=mYA();ly(IA(vt(rt),2),{onclick:K,children:(Ei,tn)=>{var qi=Tr();De((xe,nn)=>wt(qi,"".concat(xe??"",` - `).concat(nn??"")),[()=>(k(o()),nA(()=>Object.keys(o()).length)),()=>(k(o()),nA(()=>Object.keys(o()).length===1?"prop":"props"))],qA),iA(Ei,qi)},$$slots:{default:!0}}),iA(ZA,rt)};LA($t,ZA=>{g(u)?ZA(x):ZA(Y,!1)});var P=IA(bt,2),X=ZA=>{var rt=pYA();_1(W(rt),{get root(){return g(i)},selected:!0,get onContextMenu(){return k(l()),nA(()=>l().onContextMenu)}}),iA(ZA,rt)};LA(P,ZA=>{k(l()),g(w),k(c()),k(an),k(Kn),k(br),k(di),k(et),g(h),nA(()=>!l().readOnly&&g(w)&&c()&&(an(c())||Kn(c()))&&!br(c())&&di(et(c()),g(h)))&&ZA(X)});var bA=IA(mA,2),Be=ZA=>{gQ(ZA,{get validationError(){return g(R)},onExpand:K})};LA(bA,ZA=>{g(R),g(u),nA(()=>g(R)&&(!g(u)||!g(R).isChildError))&&ZA(Be)});var Ee=IA(bA,2),kA=ZA=>{var rt=wYA();ce("click",rt,lA),iA(ZA,rt)},DA=(ZA,rt)=>{var Ei=tn=>{var qi=DYA();ce("click",qi,vA),iA(tn,qi)};LA(ZA,tn=>{g(i)||tn(Ei)},rt)};LA(Ee,ZA=>{g(u)?ZA(kA):ZA(DA,!1)});var gt=IA(Ue,2),Ve=ZA=>{var rt=MYA(),Ei=vt(rt),tn=W(Ei),qi=Ot=>{var Lt,ii,_i=yYA(),Tt=W(_i),M=qA(()=>(g(w),k(fr),k(c()),nA(()=>g(w)&&fr(c()))));_1(Tt,{insert:!0,get selected(){return g(M)},onContextMenu:tA}),De((We,ni)=>{Lt=Vt(_i,1,"jse-insert-area jse-inside svelte-oawf7x",null,Lt,We),En(_i,"title",jN),ii=Ll(_i,"",ii,ni)},[()=>({"jse-hovered":g(d)===KC,"jse-selected":g(w)&&fr(c())}),()=>({"--level":(g(h),nA(()=>g(h).length+1))})],qA),iA(Ot,_i)};LA(tn,Ot=>{k(l()),g(d),k(KC),g(w),k(fr),k(c()),nA(()=>!l().readOnly&&(g(d)===KC||g(w)&&fr(c())))&&Ot(qi)}),qo(IA(tn,2),1,()=>(k(o()),g(E),nA(()=>function(Ot,Lt){var ii=Object.keys(Ot);return Lt&&Lt.offset!==0?$oA(ii,Lt.selectionStartIndex,Lt.selectionItemsCount,Lt.offset):ii}(o(),g(E)))),or,(Ot,Lt)=>{var ii=_o(),_i=qA(()=>(k(qu),k(n()),g(Lt),nA(()=>qu(n(),g(Lt))))),Tt=qA(()=>(k(_a),k(a()),g(Lt),nA(()=>_a(a())?a().properties[g(Lt)]:void 0))),M=qA(()=>(k(_a),k(s()),g(Lt),nA(()=>_a(s())?s().properties[g(Lt)]:void 0))),We=qA(()=>(g(h),g(Lt),nA(()=>g(h).concat(g(Lt))))),ni=qA(()=>(k(XD),k(l()),k(c()),k(g(We)),nA(()=>XD(l().getJson(),c(),g(We))))),pi=vt(ii),dn=qA(()=>(k(_a),k(r()),g(Lt),nA(()=>_a(r())?r().properties[g(Lt)]:void 0)));x_(pi,{get value(){return k(o()),g(Lt),nA(()=>o()[g(Lt)])},get pointer(){return g(_i)},get state(){return g(dn)},get validationErrors(){return g(M)},get searchResults(){return g(Tt)},get selection(){return g(ni)},get context(){return l()},onDragSelectionStart:gA,$$slots:{identifier:(mn,Uo)=>{var kn,Wn=vYA(),Vo=W(Wn),vo=qA(()=>(k(brA),k(g(Tt)),nA(()=>brA(g(Tt)))));(function(bo,Yn){mt(Yn,!1);var Mo=$(void 0,!0),ne=$(void 0,!0),wi=b(Yn,"pointer",9),MA=b(Yn,"key",9),me=b(Yn,"selection",9),nt=b(Yn,"searchResultItems",9),Wt=b(Yn,"onUpdateKey",9),Xe=b(Yn,"context",9),oi=$(void 0,!0);function Di(Ai){g(ne)||Xe().readOnly||(Ai.preventDefault(),Xe().onSelect(cG(g(oi))))}function Ut(Ai,Ki){var dt=Wt()(MA(),Xe().normalization.unescapeValue(Ai)),EA=Fi(g(oi)).concat(dt);Xe().onSelect(Ki===O1.nextInside?Ni(EA):o2(EA)),Ki!==O1.self&&Xe().focus()}function cn(){Xe().onSelect(o2(g(oi))),Xe().focus()}fA(()=>k(wi()),()=>{y(oi,ks(wi()))}),fA(()=>(k(me()),g(oi)),()=>{y(Mo,kr(me())&&di(me().path,g(oi)))}),fA(()=>(g(Mo),k(me())),()=>{y(ne,g(Mo)&&br(me()))}),Qn(),Zt(!0);var ft=iYA(),Qi=vt(ft),ot=Ai=>{var Ki=qA(()=>(k(Xe()),k(MA()),nA(()=>Xe().normalization.escapeValue(MA())))),dt=qA(()=>(k(br),k(me()),nA(()=>br(me())?me().initialValue:void 0)));iaA(Ai,{get value(){return g(Ki)},get initialValue(){return g(dt)},label:"Edit key",shortText:!0,onChange:Ut,onCancel:cn,get onFind(){return k(Xe()),nA(()=>Xe().onFind)}})},Mt=Ai=>{var Ki,dt=tYA(),EA=W(dt),HA=Qt=>{var yi=qA(()=>(k(Xe()),k(MA()),nA(()=>Xe().normalization.escapeValue(MA()))));laA(Qt,{get text(){return g(yi)},get searchResultItems(){return nt()}})},ve=Qt=>{var yi=Tr();De(ri=>wt(yi,ri),[()=>(k(BQ),k(Xe()),k(MA()),nA(()=>BQ(Xe().normalization.escapeValue(MA()))))],qA),iA(Qt,yi)};LA(EA,Qt=>{nt()?Qt(HA):Qt(ve,!1)}),De(Qt=>Ki=Vt(dt,1,"jse-key svelte-2iqnqn",null,Ki,Qt),[()=>({"jse-empty":MA()===""})],qA),ce("dblclick",dt,Di),iA(Ai,dt)};LA(Qi,Ai=>{k(Xe()),g(ne),nA(()=>!Xe().readOnly&&g(ne))?Ai(ot):Ai(Mt,!1)});var on=IA(Qi,2),hn=Ai=>{_1(Ai,{selected:!0,get onContextMenu(){return k(Xe()),nA(()=>Xe().onContextMenu)}})};LA(on,Ai=>{k(Xe()),g(Mo),g(ne),nA(()=>!Xe().readOnly&&g(Mo)&&!g(ne))&&Ai(hn)}),iA(bo,ft),pt()})(Vo,{get pointer(){return g(_i)},get key(){return g(Lt)},get selection(){return g(ni)},get searchResultItems(){return g(vo)},get context(){return l()},onUpdateKey:z}),De(bo=>kn=Vt(Wn,1,"jse-key-outer svelte-oawf7x",null,kn,bo),[()=>({"jse-selected-key":kr(g(ni))&&di(g(ni).path,g(We))})],qA),iA(mn,Wn)}}}),iA(Ot,ii)});var xe=IA(Ei,2),nn=IA(W(xe),2),mi=Ot=>{var Lt=bYA();ce("click",Lt,vA),iA(Ot,Lt)};LA(nn,Ot=>{g(i)||Ot(mi)}),iA(ZA,rt)};LA(gt,ZA=>{g(u)&&ZA(Ve)}),ce("click",sA,_),iA(le,SA)},aA=le=>{var SA=LYA(),Ue=W(SA),mA=W(Ue);jo(mA,e,"identifier",{},null);var sA=IA(mA,2),xt=P=>{iA(P,SYA())};LA(sA,P=>{g(i)||P(xt)});var tt=IA(sA,2),de=W(tt),Dt=qA(()=>g(w)?c():void 0),_e=qA(()=>(k(MrA),k(a()),nA(()=>MrA(a()))));vaA(de,{get path(){return g(h)},get value(){return o()},get enforceString(){return g(D)},get selection(){return g(Dt)},get searchResultItems(){return g(_e)},get context(){return l()}});var Le=IA(tt,2),bt=P=>{var X=RYA();_1(W(X),{get root(){return g(i)},selected:!0,get onContextMenu(){return k(l()),nA(()=>l().onContextMenu)}}),iA(P,X)};LA(Le,P=>{k(l()),g(w),k(c()),k(an),k(Kn),k(br),k(di),k(et),g(h),nA(()=>!l().readOnly&&g(w)&&c()&&(an(c())||Kn(c()))&&!br(c())&&di(et(c()),g(h)))&&P(bt)});var Re=IA(Ue,2),$t=P=>{gQ(P,{get validationError(){return g(R)},onExpand:K})};LA(Re,P=>{g(R)&&P($t)});var x=IA(Re,2),Y=P=>{var X=xYA();ce("click",X,vA),iA(P,X)};LA(x,P=>{g(i)||P(Y)}),iA(le,SA)};LA(uA,le=>{k(Cn),k(o()),nA(()=>Cn(o()))?le(UA):le(aA,!1)},eA)};LA(KA,uA=>{k(o()),nA(()=>Array.isArray(o()))?uA(CA):uA(TA,!1)});var Ze=IA(KA,2),He=uA=>{var eA,UA=FYA(),aA=W(UA),le=qA(()=>(g(w),k(Ua),k(c()),nA(()=>g(w)&&Ua(c()))));_1(aA,{insert:!0,get selected(){return g(le)},onContextMenu:cA}),De(SA=>{eA=Vt(UA,1,"jse-insert-area jse-after svelte-oawf7x",null,eA,SA),En(UA,"title",jN)},[()=>({"jse-hovered":g(d)===ZD,"jse-selected":g(w)&&Ua(c())})],qA),iA(uA,UA)};LA(Ze,uA=>{k(l()),g(d),k(ZD),g(w),k(Ua),k(c()),nA(()=>!l().readOnly&&(g(d)===ZD||g(w)&&Ua(c())))&&uA(He)}),De((uA,eA,UA)=>{pA=Vt(oe,1,uA,"svelte-oawf7x",pA,eA),En(oe,"data-path",g(A)),En(oe,"aria-selected",g(w)),VA=Ll(oe,"",VA,UA)},[()=>Z1((k(Kl),g(u),k(l()),g(h),k(o()),nA(()=>Kl("jse-json-node",{"jse-expanded":g(u)},l().onClassName(g(h),o()))))),()=>({"jse-root":g(i),"jse-selected":g(w)&&Kn(c()),"jse-selected-value":g(w)&&an(c()),"jse-readonly":l().readOnly,"jse-hovered":g(d)===irA}),()=>({"--level":(g(h),nA(()=>g(h).length))})],qA),ce("mousedown",oe,function(uA){if((uA.buttons===1||uA.buttons===2)&&!((eA=uA.target).nodeName==="DIV"&&eA.contentEditable==="true"||uA.buttons===1&&zsA(uA.target,"BUTTON"))){var eA;uA.stopPropagation(),uA.preventDefault(),l().focus(),document.addEventListener("mousemove",U,!0),document.addEventListener("mouseup",H);var UA=zN(uA.target),aA=l().getJson(),le=l().getDocumentState();if(!c()||UA===Ln.after||UA===Ln.inside||c().type!==UA&&c().type!==Ln.multi||!V3(aA,c(),g(h)))if(Io(Io().selecting=!0),Io(Io().selectionAnchor=g(h)),Io(Io().selectionAnchorType=UA),Io(Io().selectionFocus=g(h)),uA.shiftKey){var SA=l().getSelection();SA&&l().onSelect(_s(OC(SA),g(h)))}else if(UA===Ln.multi)if(g(i)&&uA.target.hasAttribute("data-path")){var Ue=hi(XsA(o(),le));l().onSelect(D_(Ue))}else l().onSelect(_s(g(h),g(h)));else aA!==void 0&&l().onSelect(frA(UA,g(h)));else uA.button===0&&I()(uA)}}),ce("mousemove",oe,function(uA){if(Io().selecting){uA.preventDefault(),uA.stopPropagation(),Io().selectionFocus===void 0&&window.getSelection&&window.getSelection().empty();var eA=zN(uA.target);di(g(h),Io().selectionFocus)&&eA===Io().selectionAnchorType||(Io(Io().selectionFocus=g(h)),Io(Io().selectionAnchorType=eA),l().onSelect(_s(Io().selectionAnchor||Io().selectionFocus,Io().selectionFocus)))}}),ce("mouseover",oe,function(uA){Io().selecting||Io().dragging||(uA.stopPropagation(),Y1(uA.target,"data-type","selectable-value")?y(d,irA):Y1(uA.target,"data-type","selectable-key")?y(d,void 0):Y1(uA.target,"data-type","insert-selection-area-inside")?y(d,KC):Y1(uA.target,"data-type","insert-selection-area-after")&&y(d,ZD),clearTimeout(B))}),ce("mouseout",oe,function(uA){uA.stopPropagation(),B=window.setTimeout(()=>y(d,void 0))}),iA(t,oe),pt()}var _YA={prefix:"fas",iconName:"jsoneditor-expand",icon:[512,512,[],"","M 0,448 V 512 h 512 v -64 z M 0,0 V 64 H 512 V 0 Z M 256,96 128,224 h 256 z M 256,416 384,288 H 128 Z"]},GYA={prefix:"fas",iconName:"jsoneditor-collapse",icon:[512,512,[],"","m 0,224 v 64 h 512 v -64 z M 256,192 384,64 H 128 Z M 256,320 128,448 h 256 z"]},YrA={prefix:"fas",iconName:"jsoneditor-format",icon:[512,512,[],"","M 0,32 v 64 h 416 v -64 z M 160,160 v 64 h 352 v -64 z M 160,288 v 64 h 288 v -64 z M 0,416 v 64 h 320 v -64 z"]},UYA={prefix:"fas",iconName:"jsoneditor-compact",icon:[512,512,[],"","M 0,32 v 64 h 512 v -64 z M 0,160 v 64 h 512 v -64 z M 0,288 v 64 h 352 v -64 z"]};function KYA(t,e){t.stopPropagation(),e.onCreateObject()}function YYA(t,e){t.stopPropagation(),e.onCreateArray()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-welcome.svelte-1eamlhk { - flex: 1; - overflow: auto; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - display: flex; - flex-direction: column; - align-items: center; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-welcome.svelte-1eamlhk:last-child { - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-welcome.svelte-1eamlhk .jse-space.jse-before:where(.svelte-1eamlhk) { - flex: 1; -} -.jse-welcome.svelte-1eamlhk .jse-space.jse-after:where(.svelte-1eamlhk) { - flex: 2; -} -.jse-welcome.svelte-1eamlhk .jse-contents:where(.svelte-1eamlhk) { - display: flex; - flex-direction: column; - max-width: 300px; - margin: 2em var(--jse-padding, 10px); - gap: var(--jse-padding, 10px); -} -.jse-welcome.svelte-1eamlhk .jse-contents:where(.svelte-1eamlhk) .jse-welcome-info:where(.svelte-1eamlhk) { - color: var(--jse-panel-color-readonly, #b2b2b2); -} -.jse-welcome.svelte-1eamlhk .jse-contents:where(.svelte-1eamlhk) button:where(.svelte-1eamlhk) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); - color: var(--jse-button-primary-color, #fff); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-welcome.svelte-1eamlhk .jse-contents:where(.svelte-1eamlhk) button:where(.svelte-1eamlhk):hover { - background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); -} -.jse-welcome.svelte-1eamlhk .jse-contents:where(.svelte-1eamlhk) button:where(.svelte-1eamlhk):disabled { - background: var(--jse-button-primary-background-disabled, #9d9d9d); -}`);var JYA=(t,e)=>e.onClick(),TYA=wA('
      You can paste clipboard data using Ctrl+V, or use the following options:
      ',1),HYA=wA('
      Empty document
      ');function L_(t,e){var A=typeof t=="string"?t.toLowerCase():t,i=typeof e=="string"?e.toLowerCase():e;return(0,OrA.default)(A,i)}function baA(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:1,n=Ke(t,e);if(wo(n)){if(A===void 0)throw new Error("Cannot sort: no property selected by which to sort the array");return function(o){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],s=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:1,c=function(I,C){var d={boolean:0,number:1,string:2,undefined:4},B=3;return function(E,h){var u=Ke(E,I),D=Ke(h,I);if(typeof u!=typeof D){var L,R,w=(L=d[typeof u])!==null&&L!==void 0?L:B,_=(R=d[typeof D])!==null&&R!==void 0?R:B;return w>_?C:w<_?-C:0}return typeof u=="number"||typeof u=="boolean"?u>D?C:u1&&arguments[1]!==void 0?arguments[1]:[],s=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1,a=Ke(o,r),c=Object.keys(a).slice();c.sort((I,C)=>s*L_(I,C));var l={};return c.forEach(I=>l[I]=a[I]),[{op:"replace",path:Ct(r),value:l}]}(t,e,i);throw new Error("Cannot sort: no array or object")}of(["click"]);Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-navigation-bar-dropdown.svelte-2nnd2m { - position: absolute; - top: 100%; - left: 0; - z-index: 3; - background: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); - color: var(--jse-navigation-bar-dropdown-color, #656565); - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); - display: flex; - flex-direction: column; - max-height: 300px; - overflow: auto; - min-width: 80px; -} -.jse-navigation-bar-dropdown.svelte-2nnd2m button.jse-navigation-bar-dropdown-item:where(.svelte-2nnd2m) { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - border: none; - background: transparent; - color: inherit; - cursor: pointer; - outline: none; - text-align: left; - white-space: nowrap; - box-sizing: border-box; - padding: calc(0.5 * var(--jse-padding, 10px)) 36px; -} -.jse-navigation-bar-dropdown.svelte-2nnd2m button.jse-navigation-bar-dropdown-item:where(.svelte-2nnd2m):focus, .jse-navigation-bar-dropdown.svelte-2nnd2m button.jse-navigation-bar-dropdown-item:where(.svelte-2nnd2m):hover { - background: var(--jse-navigation-bar-background-highlight, #e5e5e5); -} -.jse-navigation-bar-dropdown.svelte-2nnd2m button.jse-navigation-bar-dropdown-item.jse-selected:where(.svelte-2nnd2m) { - background: var(--jse-navigation-bar-dropdown-color, #656565); - color: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); -}`);var zYA=wA(''),OYA=wA(''),PYA=wA('
      ');function jYA(t,e){mt(e,!1);var A=b(e,"items",9),i=b(e,"selectedItem",9),n=b(e,"onSelect",9);Zt(!0);var o=PYA(),r=W(o);qo(r,1,()=>(k(Ey),k(A()),nA(()=>Ey(A(),100))),c=>c,(c,l)=>{var I,C=zYA(),d=W(C);De((B,E,h)=>{I=Vt(C,1,"jse-navigation-bar-dropdown-item svelte-2nnd2m",null,I,B),En(C,"title",E),wt(d,h)},[()=>({"jse-selected":g(l)===i()}),()=>(g(l),nA(()=>g(l).toString())),()=>(k(V0),g(l),nA(()=>V0(g(l).toString(),30)))],qA),ce("click",C,j0(()=>n()(g(l)))),iA(c,C)});var s=IA(r,2),a=c=>{var l=OYA();En(l,"title","Limited to 100 items"),iA(c,l)};LA(s,c=>{k(A()),nA(()=>A().length>100)&&c(a)}),iA(t,o),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-navigation-bar-item.svelte-752ro1 { - position: relative; - display: flex; -} -.jse-navigation-bar-item.svelte-752ro1 button.jse-navigation-bar-button:where(.svelte-752ro1) { - font-family: inherit; - font-size: inherit; - padding: calc(0.5 * var(--jse-padding, 10px)) 2px; - border: none; - background: transparent; - color: inherit; - cursor: pointer; - outline: none; - min-width: 2em; - white-space: nowrap; -} -.jse-navigation-bar-item.svelte-752ro1 button.jse-navigation-bar-button:where(.svelte-752ro1):focus, .jse-navigation-bar-item.svelte-752ro1 button.jse-navigation-bar-button:where(.svelte-752ro1):hover { - background: var(--jse-panel-button-background-highlight, #e0e0e0); - color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); -} -.jse-navigation-bar-item.svelte-752ro1 button.jse-navigation-bar-button.jse-navigation-bar-arrow:where(.svelte-752ro1) { - padding: 2px var(--jse-padding, 10px) 0; -} -.jse-navigation-bar-item.svelte-752ro1 button.jse-navigation-bar-button.jse-navigation-bar-arrow.jse-open:where(.svelte-752ro1) { - background: var(--jse-navigation-bar-background, var(--jse-background-color, #fff)); - color: var(--jse-navigation-bar-dropdown-color, #656565); -} -.jse-navigation-bar-item.svelte-752ro1:last-child { - padding-right: var(--jse-padding, 10px); -}`);var qYA=wA(''),VYA=wA('
      ');function JrA(t,e){mt(e,!1);var A,i=$(void 0,!0),n=$(void 0,!0),{openAbsolutePopup:o,closeAbsolutePopup:r}=$1("absolute-popup"),s=b(e,"path",9),a=b(e,"index",9),c=b(e,"onSelect",9),l=b(e,"getItems",9),I=$(void 0,!0),C=$(!1,!0);function d(L){r(A),c()(g(i).concat(L))}fA(()=>(k(s()),k(a())),()=>{y(i,s().slice(0,a()))}),fA(()=>(k(s()),k(a())),()=>{y(n,s()[a()])}),Qn(),Zt(!0);var B,E=VYA(),h=W(E);ji(W(h),{get data(){return qS}});var u=IA(h,2),D=L=>{var R=qYA(),w=W(R);De(()=>wt(w,g(n))),ce("click",R,()=>d(g(n))),iA(L,R)};LA(u,L=>{g(n)!==void 0&&L(D)}),Co(E,L=>y(I,L),()=>g(I)),De(L=>B=Vt(h,1,"jse-navigation-bar-button jse-navigation-bar-arrow svelte-752ro1",null,B,L),[()=>({"jse-open":g(C)})],qA),ce("click",h,function(){if(g(I)){y(C,!0);var L={items:l()(g(i)),selectedItem:g(n),onSelect:d};A=o(jYA,L,{anchor:g(I),closeOnOuterClick:!0,onClose:()=>{y(C,!1)}})}}),iA(t,E),pt()}function BG(t){var e,A;if(navigator.clipboard)return navigator.clipboard.writeText(t);if((e=(A=document).queryCommandSupported)!==null&&e!==void 0&&e.call(A,"copy")){var i=document.createElement("textarea");i.value=t,i.style.position="fixed",i.style.opacity="0",document.body.appendChild(i),i.select();try{document.execCommand("copy")}catch(n){console.error(n)}finally{document.body.removeChild(i)}return Promise.resolve()}return console.error("Copy failed."),Promise.resolve()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-navigation-bar-path-editor.svelte-zc2wx7 { - flex: 1; - display: flex; - border: var(--jse-edit-outline, 2px solid #656565); - background: var(--jse-background-color, #fff); -} -.jse-navigation-bar-path-editor.svelte-zc2wx7 input.jse-navigation-bar-text:where(.svelte-zc2wx7) { - flex: 1; - font-family: inherit; - font-size: inherit; - padding: 0 5px 1px; - background: var(--jse-background-color, #fff); - color: var(--jse-text-color, #4d4d4d); - border: none; - outline: none; -} -.jse-navigation-bar-path-editor.svelte-zc2wx7 button:where(.svelte-zc2wx7) { - border: none; - background: var(--jse-background-color, #fff); - cursor: pointer; - font-family: inherit; - font-size: 80%; - color: inherit; -} -.jse-navigation-bar-path-editor.svelte-zc2wx7 button.jse-navigation-bar-copy.copied:where(.svelte-zc2wx7) { - color: var(--message-success-background, #9ac45d); -} -.jse-navigation-bar-path-editor.svelte-zc2wx7 button.jse-navigation-bar-validation-error:where(.svelte-zc2wx7) { - color: var(--jse-error-color, #ee5341); -} -.jse-navigation-bar-path-editor.error.svelte-zc2wx7 { - border-color: var(--jse-error-color, #ee5341); -} -.jse-navigation-bar-path-editor.error.svelte-zc2wx7 input.jse-navigation-bar-text:where(.svelte-zc2wx7) { - color: var(--jse-error-color, #ee5341); -} -.jse-navigation-bar-path-editor.svelte-zc2wx7 .jse-copied-text:where(.svelte-zc2wx7) { - background: var(--message-success-background, #9ac45d); - color: var(--jse-message-success-color, #fff); - position: relative; - margin: 2px; - padding: 0 5px; - border-radius: 3px; -}`);var ZYA=wA(''),WYA=wA('
      Copied!
      '),XYA=wA('
      ');function $YA(t,e){mt(e,!1);var A=$(),i=$1("absolute-popup"),n=b(e,"path",8),o=b(e,"pathParser",8),r=b(e,"onChange",8),s=b(e,"onClose",8),a=b(e,"onError",8),c=b(e,"pathExists",8),l=$(),I=$(),C=$(!1),d=void 0,B=$(!1);function E(){g(l).focus()}function h(H){try{var q=o().parse(H);return function(j){if(!c()(j))throw new Error("Path does not exist in current document")}(q),{path:q,error:void 0}}catch(j){return{path:void 0,error:j}}}hs(()=>{E()}),qc(()=>{clearTimeout(d)}),fA(()=>(k(o()),k(n())),()=>{y(I,o().stringify(n()))}),fA(()=>(g(C),g(I)),()=>{y(A,g(C)?h(g(I)).error:void 0)}),Qn(),Zt();var u,D=XYA(),L=W(D);Co(L,H=>y(l,H),()=>g(l));var R=IA(L,2),w=H=>{var q=ZYA();ji(W(q),{get data(){return g1}}),Us(q,(j,gA)=>hQ?.(j,gA),()=>fe({text:String(g(A)||"")},i)),iA(H,q)};LA(R,H=>{g(A)&&H(w)});var _=IA(R,2),K=H=>{iA(H,WYA())};LA(_,H=>{g(B)&&H(K)});var z,U=IA(_,2);ji(W(U),{get data(){return F0}}),De((H,q)=>{u=Vt(D,1,"jse-navigation-bar-path-editor svelte-zc2wx7",null,u,H),VC(L,g(I)),z=Vt(U,1,"jse-navigation-bar-copy svelte-zc2wx7",null,z,q)},[()=>({error:g(A)}),()=>({copied:g(B)})],qA),ce("keydown",L,j0(function(H){var q=n2(H);if(q==="Escape"&&(H.preventDefault(),s()()),q==="Enter"){H.preventDefault(),y(C,!0);var j=h(g(I));j.path!==void 0?r()(j.path):a()(j.error)}})),ce("input",L,function(H){y(I,H.currentTarget.value)}),ce("click",U,function(){BG(g(I)),y(B,!0),d=window.setTimeout(()=>y(B,!1),1e3),E()}),iA(t,D),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-navigation-bar.svelte-xs03gj { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - background: var(--jse-panel-background, #ebebeb); - color: var(--jse-panel-button-color, inherit); - padding: 0; - margin: 0; - display: flex; - overflow: auto; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-navigation-bar.svelte-xs03gj .jse-navigation-bar-edit:where(.svelte-xs03gj) { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); - color: var(--jse-panel-color-readonly, #b2b2b2); - background: transparent; - border: none; - display: flex; - cursor: pointer; - outline: none; - align-items: center; -} -.jse-navigation-bar.svelte-xs03gj .jse-navigation-bar-edit.flex:where(.svelte-xs03gj) { - flex: 1; -} -.jse-navigation-bar.svelte-xs03gj .jse-navigation-bar-edit:where(.svelte-xs03gj):focus, .jse-navigation-bar.svelte-xs03gj .jse-navigation-bar-edit:where(.svelte-xs03gj):hover, .jse-navigation-bar.svelte-xs03gj .jse-navigation-bar-edit.editing:where(.svelte-xs03gj) { - background: var(--jse-panel-button-background-highlight, #e0e0e0); - color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); - transition: color 0.2s ease-in, background 0.2s ease-in; -} -.jse-navigation-bar.svelte-xs03gj .jse-navigation-bar-edit:where(.svelte-xs03gj) .jse-navigation-bar-space:where(.svelte-xs03gj) { - flex: 1; - text-align: left; -}`);var AJA=wA(" ",1),eJA=wA('
      ');function tJA(t,e){mt(e,!1);var A=$(void 0,!0),i=$(void 0,!0),n=Sr("jsoneditor:NavigationBar"),o=b(e,"json",9),r=b(e,"selection",9),s=b(e,"onSelect",9),a=b(e,"onError",9),c=b(e,"pathParser",9),l=$(void 0,!0),I=$(!1,!0);function C(q){n("get items for path",q);var j=Ke(o(),q);if(Array.isArray(j))return d5(0,j.length).map(String);if(Cn(j)){var gA=Object.keys(j).slice(0);return gA.sort(L_),gA}return[]}function d(q){return Ms(o(),q)}function B(q){n("select path",JSON.stringify(q)),s()(_s(q,q))}function E(){y(I,!1)}function h(q){E(),B(q)}fA(()=>(k(r()),et),()=>{y(A,r()?et(r()):[])}),fA(()=>(k(o()),g(A)),()=>{y(i,No(Ke(o(),g(A))))}),fA(()=>g(A),()=>{g(A),setTimeout(()=>{if(g(l)&&g(l).scrollTo){var q=g(l).scrollWidth-g(l).clientWidth;q>0&&(n("scrollTo ",q),g(l).scrollTo({left:q,behavior:"smooth"}))}})}),Qn(),Zt(!0);var u=eJA(),D=W(u),L=q=>{var j=AJA(),gA=vt(j);qo(gA,1,()=>g(A),or,(lA,vA,tA)=>{JrA(lA,{getItems:C,get path(){return g(A)},index:tA,onSelect:B})});var QA=IA(gA,2),BA=lA=>{JrA(lA,{getItems:C,get path(){return g(A)},get index(){return g(A),nA(()=>g(A).length)},onSelect:B})};LA(QA,lA=>{g(i)&&lA(BA)}),iA(q,j)},R=q=>{$YA(q,{get path(){return g(A)},onClose:E,onChange:h,get onError(){return a()},pathExists:d,get pathParser(){return c()}})};LA(D,q=>{g(I)?q(R,!1):q(L)});var w,_=IA(D,2),K=W(_),z=W(K),U=IA(K,2),H=qA(()=>g(I)?jW:UW);ji(U,{get data(){return g(H)}}),Co(u,q=>y(l,q),()=>g(l)),De((q,j)=>{w=Vt(_,1,"jse-navigation-bar-edit svelte-xs03gj",null,w,q),En(_,"title",g(I)?"Cancel editing the selected path":"Edit the selected path"),wt(z,j)},[()=>({flex:!g(I),editing:g(I)}),()=>(k(No),k(o()),g(I),nA(()=>No(o())||g(I)?"\xA0":"Navigation bar"))],qA),ce("click",_,function(){y(I,!g(I))}),iA(t,u),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-search-box.svelte-1mxl2uo { - border: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); - border-radius: 3px; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - background: var(--jse-panel-background, #ebebeb); - color: var(--jse-panel-color-readonly, #b2b2b2); - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); - display: inline-block; - width: 400px; - max-width: 100%; - overflow: auto; -} -.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) { - display: flex; - align-items: stretch; -} -.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) button:where(.svelte-1mxl2uo), -.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) input:where(.svelte-1mxl2uo) { - font-family: inherit; - font-size: inherit; -} -.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) button:where(.svelte-1mxl2uo) { - display: block; - text-align: center; - border: none; - padding: 0 5px; - margin: 0; - cursor: pointer; - color: var(--jse-panel-button-color, inherit); - background: var(--jse-panel-button-background, transparent); -} -.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) button:where(.svelte-1mxl2uo):hover { - color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); - background: var(--jse-panel-button-background-highlight, #e0e0e0); -} -.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) input:where(.svelte-1mxl2uo) { - color: var(--jse-panel-color, var(--jse-text-color, #4d4d4d)); - border: var(--jse-input-border, 1px solid #d8dbdf); - border-radius: 3px; - background: var(--jse-input-background, var(--jse-background-color, #fff)); - height: 28px; - padding: 0 5px; - margin: 0; - flex: 1; - width: 0; - min-width: 50px; - outline: none; -} -.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) .jse-replace-toggle:where(.svelte-1mxl2uo) { - padding: var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)); - min-width: 20px; - background: var(--jse-panel-button-background-highlight, #e0e0e0); -} -.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) .jse-search-contents:where(.svelte-1mxl2uo) { - flex: 1; - display: flex; - flex-direction: column; - padding: calc(0.5 * var(--jse-padding, 10px)); - gap: calc(0.5 * var(--jse-padding, 10px)); -} -.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) .jse-search-contents:where(.svelte-1mxl2uo) .jse-search-section:where(.svelte-1mxl2uo) { - flex: 1; - display: flex; - align-items: center; - position: relative; -} -.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) .jse-search-contents:where(.svelte-1mxl2uo) .jse-search-section:where(.svelte-1mxl2uo) .jse-search-icon:where(.svelte-1mxl2uo) { - color: inherit; - cursor: inherit; - background: inherit; - width: 32px; - text-align: center; -} -.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) .jse-search-contents:where(.svelte-1mxl2uo) .jse-search-section:where(.svelte-1mxl2uo) label.jse-search-input-label:where(.svelte-1mxl2uo) { - flex: 1; - display: flex; -} -.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) .jse-search-contents:where(.svelte-1mxl2uo) .jse-search-section:where(.svelte-1mxl2uo) .jse-search-count:where(.svelte-1mxl2uo) { - color: inherit; - font-size: 80%; - visibility: hidden; - padding: 0 5px; - min-width: 36px; - text-align: center; -} -.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) .jse-search-contents:where(.svelte-1mxl2uo) .jse-search-section:where(.svelte-1mxl2uo) .jse-search-count.jse-visible:where(.svelte-1mxl2uo) { - visibility: visible; -} -.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) .jse-search-contents:where(.svelte-1mxl2uo) .jse-replace-section:where(.svelte-1mxl2uo) { - flex: 1; - display: flex; - padding-left: 32px; -} -.jse-search-box.svelte-1mxl2uo .jse-search-form:where(.svelte-1mxl2uo) .jse-search-contents:where(.svelte-1mxl2uo) .jse-replace-section:where(.svelte-1mxl2uo) button:where(.svelte-1mxl2uo) { - width: auto; -}`);var iJA=wA(''),nJA=wA('
      '),oJA=wA('');function MaA(t,e){mt(e,!1);var A=$(void 0,!0),i=$(void 0,!0),n=$(void 0,!0),o=Sr("jsoneditor:SearchBox"),r=b(e,"json",9),s=b(e,"documentState",9),a=b(e,"parser",9),c=b(e,"showSearch",9),l=b(e,"showReplace",13),I=b(e,"readOnly",9),C=b(e,"columns",9),d=b(e,"onSearch",9),B=b(e,"onFocus",9),E=b(e,"onPatch",9),h=b(e,"onClose",9),u=$("",!0),D="",L=$("",!0),R=$(!1,!0),w=$(void 0,!0),_=oE(function(SA){return TA.apply(this,arguments)},300),K=oE(function(SA){return Ze.apply(this,arguments)},300);function z(){l(!l()&&!I())}function U(SA){SA.stopPropagation();var Ue=n2(SA);Ue==="Enter"&&(SA.preventDefault(),g(u)!==D?_.flush():tA()),Ue==="Shift+Enter"&&(SA.preventDefault(),pA()),Ue==="Ctrl+Enter"&&(SA.preventDefault(),l()?gA():tA()),Ue==="Ctrl+H"&&(SA.preventDefault(),z()),Ue==="Escape"&&(SA.preventDefault(),eA())}function H(SA){n2(SA)==="Enter"&&(SA.preventDefault(),SA.stopPropagation(),gA())}function q(){return j.apply(this,arguments)}function j(){return(j=Yt(function*(){io(),yield _.flush()})).apply(this,arguments)}function gA(){return QA.apply(this,arguments)}function QA(){return(QA=Yt(function*(){var SA;if(!I()){var Ue=(SA=g(w))===null||SA===void 0?void 0:SA.activeItem;if(o("handleReplace",{replaceText:g(L),activeItem:Ue}),g(w)&&Ue&&r()!==void 0){y(w,fe(fe({},prA(g(w))),{},{activeIndex:g(i)}));var{operations:mA,newSelection:sA}=QUA(r(),s(),g(L),Ue,a());E()(mA,(xt,tt)=>({state:tt,selection:sA})),io(),yield K.flush(),yield oe()}}})).apply(this,arguments)}function BA(){return lA.apply(this,arguments)}function lA(){return(lA=Yt(function*(){if(!I()){o("handleReplaceAll",{text:g(u),replaceText:g(L)});var{operations:SA,newSelection:Ue}=function(mA,sA,xt,tt,de){for(var Dt=wrA(xt,mA,{maxResults:1/0}),_e=[],Le=0;LeY.field!==P.field?Y.field===Nl.key?1:-1:P.path.length-Y.path.length);var $t,x=[];return _e.forEach(Y=>{var{field:P,path:X,items:bA}=Y;if(P===Nl.key){var Be=Fi(X),Ee=Ke(mA,Be),kA=hi(X),DA=gf(Be,Object.keys(Ee),kA,yrA(kA,tt,bA));x=x.concat(DA),$t=QQ(mA,DA)}else{if(P!==Nl.value)throw new Error("Cannot replace: unknown type of search result field ".concat(P));var gt=Ke(mA,X);if(gt===void 0)throw new Error("Cannot replace: path not found ".concat(Ct(X)));var Ve=typeof gt=="string"?gt:String(gt),ZA=zg(mA,sA,X),rt=yrA(Ve,tt,bA),Ei=[{op:"replace",path:Ct(X),value:ZA?rt:DQ(rt,de)}];x=x.concat(Ei),$t=QQ(mA,Ei)}}),{operations:x,newSelection:$t}}(r(),s(),g(u),g(L),a());E()(SA,(mA,sA)=>({state:sA,selection:Ue})),yield oe()}})).apply(this,arguments)}function vA(SA){SA.select()}function tA(){return cA.apply(this,arguments)}function cA(){return(cA=Yt(function*(){y(w,g(w)?prA(g(w)):void 0),yield oe()})).apply(this,arguments)}function pA(){return VA.apply(this,arguments)}function VA(){return VA=Yt(function*(){y(w,g(w)?function(SA){var Ue=SA.activeIndex>0?SA.activeIndex-1:SA.items.length-1,mA=SA.items[Ue],sA=SA.items.map((xt,tt)=>fe(fe({},xt),{},{active:tt===Ue}));return fe(fe({},SA),{},{items:sA,activeItem:mA,activeIndex:Ue})}(g(w)):void 0),yield oe()}),VA.apply(this,arguments)}function oe(){return KA.apply(this,arguments)}function KA(){return(KA=Yt(function*(){var SA;o("handleFocus",g(w));var Ue=(SA=g(w))===null||SA===void 0?void 0:SA.activeItem;Ue&&r()!==void 0&&(yield B()(Ue.path,Ue.resultIndex))})).apply(this,arguments)}function CA(){return CA=Yt(function*(SA){yield He(SA,g(u),r())}),CA.apply(this,arguments)}function TA(){return TA=Yt(function*(SA){yield He(c(),SA,r()),yield oe()}),TA.apply(this,arguments)}function Ze(){return Ze=Yt(function*(SA){yield He(c(),g(u),SA)}),Ze.apply(this,arguments)}function He(SA,Ue,mA){return uA.apply(this,arguments)}function uA(){return uA=Yt(function*(SA,Ue,mA){return SA?(o("applySearch",{showSearch:SA,text:Ue}),Ue===""?(o("clearing search result"),g(w)!==void 0&&y(w,void 0),Promise.resolve()):(D=Ue,y(R,!0),new Promise(sA=>{setTimeout(()=>{var xt=wrA(Ue,mA,{maxResults:ON,columns:C()});y(w,function(tt,de){var Dt=de!=null&&de.activeItem?vrA(de.activeItem):void 0,_e=tt.findIndex(Re=>di(Dt,vrA(Re))),Le=_e!==-1?_e:de?.activeIndex!==void 0&&de?.activeIndex0?0:-1,bt=tt.map((Re,$t)=>fe(fe({resultIndex:$t},Re),{},{active:$t===Le}));return{items:bt,activeItem:bt[Le],activeIndex:Le}}(xt,g(w))),y(R,!1),sA()})}))):(g(w)&&y(w,void 0),Promise.resolve())}),uA.apply(this,arguments)}function eA(){o("handleClose"),_.cancel(),K.cancel(),He(!1,g(u),r()),h()()}fA(()=>g(w),()=>{var SA;y(A,((SA=g(w))===null||SA===void 0||(SA=SA.items)===null||SA===void 0?void 0:SA.length)||0)}),fA(()=>g(w),()=>{var SA;y(i,((SA=g(w))===null||SA===void 0?void 0:SA.activeIndex)||0)}),fA(()=>(g(A),ON),()=>{y(n,g(A)>=ON?"".concat(999,"+"):String(g(A)))}),fA(()=>(k(d()),g(w)),()=>{d()(g(w))}),fA(()=>k(c()),()=>{(function(SA){CA.apply(this,arguments)})(c())}),fA(()=>g(u),()=>{_(g(u))}),fA(()=>k(r()),()=>{K(r())}),Qn(),Zt(!0);var UA=_o(),aA=vt(UA),le=SA=>{var Ue=oJA(),mA=W(Ue),sA=W(mA),xt=kA=>{var DA=iJA(),gt=W(DA),Ve=qA(()=>l()?mg:sE);ji(gt,{get data(){return g(Ve)}}),ce("click",DA,z),iA(kA,DA)};LA(sA,kA=>{I()||kA(xt)});var tt=W(IA(sA,2)),de=W(tt),Dt=W(de),_e=kA=>{ji(kA,{get data(){return NW},spin:!0})},Le=kA=>{ji(kA,{get data(){return g4}})};LA(Dt,kA=>{g(R)?kA(_e):kA(Le,!1)});var bt=IA(de,2),Re=W(bt);es(()=>By(Re,()=>g(u),kA=>y(u,kA))),Us(Re,kA=>vA?.(kA)),es(()=>ce("paste",Re,q));var $t,x=IA(bt,2),Y=W(x),P=IA(x,2);ji(W(P),{get data(){return OW}});var X=IA(P,2);ji(W(X),{get data(){return KW}});var bA=IA(X,2);ji(W(bA),{get data(){return I4}});var Be=IA(tt,2),Ee=kA=>{var DA=nJA(),gt=W(DA),Ve=IA(gt,2),ZA=IA(Ve,2);By(gt,()=>g(L),rt=>y(L,rt)),ce("keydown",gt,H),ce("click",Ve,gA),ce("click",ZA,BA),iA(kA,DA)};LA(Be,kA=>{l()&&!I()&&kA(Ee)}),De(kA=>{var DA;$t=Vt(x,1,"jse-search-count svelte-1mxl2uo",null,$t,kA),wt(Y,"".concat(g(i)!==-1&&g(i)({"jse-visible":g(u)!==""})],qA),ce("click",P,tA),ce("click",X,pA),ce("click",bA,eA),ce("keydown",mA,U),iA(SA,Ue)};LA(aA,SA=>{c()&&SA(le)}),iA(t,UA),pt()}var $3=Symbol("path");function rJA(t,e){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1/0,i={};Array.isArray(t)&&function(o,r,s){if(o.length1?(o.length-1)/(r-1):o.length,c=0;c{Cn(o)?kaA(o,i,e):i[$3]=!0});var n=[];return $3 in i&&n.push([]),SaA(i,[],n,e),n}function kaA(t,e,A){for(var i in t){var n=t[i],o=e[i]||(e[i]={});Cn(n)&&A?kaA(n,o,A):o[$3]===void 0&&(o[$3]=!0)}}function SaA(t,e,A,i){for(var n in t){var o=e.concat(n),r=t[n];r&&r[$3]===!0&&A.push(o),xo(r)&&i&&SaA(r,o,A,i)}}function sJA(t,e,A,i,n,o){for(var r=arguments.length>6&&arguments[6]!==void 0?arguments[6]:80,s=wo(A)?A.length:0,a=function(D,L){var R=Object.values(D);if(Oi(R))return L;var w=(_,K)=>_+K;return R.reduce(w)/R.length}(i,n),c=t-r,l=e+2*r,I=D=>i[D]||n,C=0,d=o;d0&&(d-=I(--C));for(var B=C,E=0;EPg(i,o))}}function YC(t,e){var{rowIndex:A,columnIndex:i}=t;return[String(A),...e[i]]}function aJA(t,e){var[A,i]=GS(t,r=>j_(r.path[0])),n=NS(A,cJA),o=_S(n,r=>{var s={row:[],columns:{}};return r.forEach(a=>{var c=function(l,I){var C=zc(l.path,I);return C.columnIndex!==-1?C.columnIndex:-1}(a,e);c!==-1?(s.columns[c]===void 0&&(s.columns[c]=[]),s.columns[c].push(a)):s.row.push(a)}),s});return{root:i,rows:o}}function XE(t,e){if(e&&e.length!==0)return e.length===1?e[0]:{path:t,message:"Multiple validation issues: "+e.map(A=>Ka(A.path)+" "+A.message).join(", "),severity:Fl.warning}}function cJA(t){return parseInt(t.path[0],10)}function lJA(t,e,A){var i=e.some(n=>function(o,r,s){if(!o)return!1;if(r.op==="replace"){var a=ks(r.path),{rowIndex:c,columnIndex:l}=zc(a,s),I=s.findIndex(C=>di(C,o.path));if(c!==-1&&l!==-1&&l!==I)return!1}return!0}(t,n,A));return i?void 0:t}var Gs=Sr("jsoneditor:actions");function RaA(t){return F_.apply(this,arguments)}function F_(){return F_=Yt(function*(t){var{json:e,selection:A,indentation:i,readOnly:n,parser:o,onPatch:r}=t;if(!n&&e!==void 0&&A&&oQ(A)){var s=eaA(e,A,i,o);if(s!==void 0){Gs("cut",{selection:A,clipboard:s,indentation:i}),yield BG(s);var{operations:a,newSelection:c}=saA(e,A);r(a,(l,I)=>({state:I,selection:c}))}}}),F_.apply(this,arguments)}function xaA(t){return N_.apply(this,arguments)}function N_(){return N_=Yt(function*(t){var{json:e,selection:A,indentation:i,parser:n}=t,o=eaA(e,A,i,n);o!==void 0&&(Gs("copy",{clipboard:o,indentation:i}),yield BG(o))}),N_.apply(this,arguments)}function LaA(t){var{clipboardText:e,json:A,selection:i,readOnly:n,parser:o,onPatch:r,onChangeText:s,onPasteMultilineText:a,openRepairModal:c}=t;if(!n)try{l(e)}catch{c(e,C=>{Gs("repaired pasted text: ",C),l(C)})}function l(I){if(A!==void 0){var C=i||Ni([]),d=raA(A,C,I,o),B=function(E,h,u){var D=arguments.length>3&&arguments[3]!==void 0?arguments[3]:cUA;if(E.length>D)return!1;var L=/\n/.test(E);if(!L)return!1;var R=h.some(_=>_.op==="replace"&&Array.isArray(_.value)),w=h.filter(_=>_.op==="add").length>1;if(!R&&!w)return!1;try{return sf(E,u.parse),!1}catch{return!0}}(e,d,o);Gs("paste",{pastedText:I,operations:d,ensureSelection:C,pasteMultilineText:B}),r(d,(E,h)=>{var u=h;return d.filter(D=>(lS(D)||k8(D))&&No(D.value)).forEach(D=>{var L=ya(A,D.path);u=WC(E,u,L)}),{state:u}}),B&&a(I)}else Gs("paste text",{pastedText:I}),s(e,(E,h)=>{if(E)return{state:WC(E,h,[])}})}}function FaA(t){var{json:e,text:A,selection:i,keepSelection:n,readOnly:o,onChange:r,onPatch:s}=t;if(!o&&i){var a=e!==void 0&&(kr(i)||an(i))?_s(i.path,i.path):i;if(Oi(et(i)))Gs("remove root",{selection:i}),r&&r({text:"",json:void 0},e!==void 0?{text:void 0,json:e}:{text:A||"",json:e},{contentErrors:void 0,patchResult:void 0});else if(e!==void 0){var{operations:c,newSelection:l}=saA(e,a);Gs("remove",{operations:c,selection:i,newSelection:l}),s(c,(I,C)=>({state:C,selection:n?i:l}))}}}function Sy(t){var{insertType:e,selectInside:A,initialValue:i,json:n,selection:o,readOnly:r,parser:s,onPatch:a,onReplaceJson:c}=t;if(!r){var l=function(E,h,u){if(u==="object")return{};if(u==="array")return[];if(u==="structure"&&E!==void 0){var D=h?$sA(h):[],L=Ke(E,D);if(Array.isArray(L)&&!Oi(L)){var R=Fc(L);return No(R)?RS(R,w=>Array.isArray(w)?[]:Cn(w)?void 0:""):""}}return""}(n,o,e);if(n!==void 0){var I=s.stringify(l),C=raA(n,o,I,s);Gs("onInsert",{insertType:e,operations:C,newValue:l,data:I});var d=hi(C.filter(E=>E.op==="add"||E.op==="replace"));a(C,(E,h,u)=>{if(d){var D=ya(E,d.path);if(No(l))return{state:Sl(E,h,D,aG),selection:A?r2(D):u};if(l===""){var L=Oi(D)?void 0:Ke(E,Fi(D));return{state:Sl(E,h,D,ay),selection:Cn(L)?cG(D,i):my(D,i)}}}}),Gs("after patch")}else{Gs("onInsert",{insertType:e,newValue:l});var B=[];c(l,(E,h)=>({state:WC(E,h,B),selection:No(l)?r2(B):my(B)}))}}}function NaA(t){return __.apply(this,arguments)}function __(){return __=Yt(function*(t){var{char:e,selectInside:A,json:i,selection:n,readOnly:o,parser:r,onPatch:s,onReplaceJson:a,onSelect:c}=t;o||(kr(n)?c(fe(fe({},n),{},{edit:!0,initialValue:e})):e==="{"?Sy({insertType:"object",selectInside:A,initialValue:void 0,json:i,selection:n,readOnly:o,parser:r,onPatch:s,onReplaceJson:a}):e==="["?Sy({insertType:"array",selectInside:A,initialValue:void 0,json:i,selection:n,readOnly:o,parser:r,onPatch:s,onReplaceJson:a}):an(n)&&i!==void 0?No(Ke(i,n.path))||c(fe(fe({},n),{},{edit:!0,initialValue:e})):(Gs("onInsertValueWithCharacter",{char:e}),yield function(l){return G_.apply(this,arguments)}({char:e,json:i,selection:n,readOnly:o,parser:r,onPatch:s,onReplaceJson:a})))}),__.apply(this,arguments)}function G_(){return G_=Yt(function*(t){var{char:e,json:A,selection:i,readOnly:n,parser:o,onPatch:r,onReplaceJson:s}=t;n||Sy({insertType:"value",selectInside:!1,initialValue:e,json:A,selection:i,readOnly:n,parser:o,onPatch:r,onReplaceJson:s})}),G_.apply(this,arguments)}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-json-preview.svelte-1vjn89h { - flex: 1; - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - color: var(--jse-panel-color-readonly, #b2b2b2); - overflow: auto; - white-space: pre-wrap; - padding: 2px; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -}`);var gJA=wA('
      ');function _aA(t,e){mt(e,!1);var A=$(),i=$(),n=b(e,"text",8),o=b(e,"json",8),r=b(e,"indentation",8),s=b(e,"parser",8);fA(()=>(k(o()),k(n())),()=>{y(A,o()!==void 0?{json:o()}:{text:n()||""})}),fA(()=>(g(A),k(r()),k(s()),Qy),()=>{y(i,V0(u_(g(A),r(),s()),Qy))}),Qn(),Zt();var a=gJA(),c=W(a);De(()=>wt(c,g(i))),iA(t,a),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -button.jse-context-menu-button.svelte-1idfykj { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - flex: 1; - white-space: nowrap; - padding: var(--jse-padding, 10px); - color: inherit; -} -button.jse-context-menu-button.svelte-1idfykj:hover { - background: var(--jse-context-menu-background-highlight, #7a7a7a); -} -button.jse-context-menu-button.svelte-1idfykj:focus { - background: var(--jse-context-menu-background-highlight, #7a7a7a); - z-index: 1; -} -button.jse-context-menu-button.svelte-1idfykj:disabled { - color: var(--jse-context-menu-color-disabled, #9d9d9d); - background: unset; -} -button.jse-context-menu-button.left.svelte-1idfykj { - text-align: left; -} -button.jse-context-menu-button.svelte-1idfykj svg { - width: 16px; -}`);var IJA=wA('');function n_(t,e){mt(e,!1);var A=b(e,"item",8),i=b(e,"className",8,void 0),n=b(e,"onRequestClose",8);Zt();var o=IJA(),r=W(o),s=l=>{ji(l,{get data(){return k(A()),nA(()=>A().icon)}})};LA(r,l=>{k(A()),nA(()=>A().icon)&&l(s)});var a=IA(r,2),c=l=>{var I=Tr();De(()=>wt(I,(k(A()),nA(()=>A().text)))),iA(l,I)};LA(a,l=>{k(A()),nA(()=>A().text)&&l(c)}),De(l=>{Vt(o,1,l,"svelte-1idfykj"),En(o,"title",(k(A()),nA(()=>A().title))),o.disabled=(k(A()),nA(()=>A().disabled||!1))},[()=>Z1((k(Kl),k(i()),k(A()),nA(()=>Kl("jse-context-menu-button",i(),A().className))))],qA),ce("click",o,l=>{n()(),A().onClick(l)}),iA(t,o),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-dropdown-button.svelte-11rxb2m { - flex: 1; - line-height: normal; - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - position: relative; - padding: 0; - display: flex; -} -.jse-dropdown-button.svelte-11rxb2m ul:where(.svelte-11rxb2m) { - margin: 0; - padding: 0; -} -.jse-dropdown-button.svelte-11rxb2m ul:where(.svelte-11rxb2m) li:where(.svelte-11rxb2m) { - margin: 0; - padding: 0; - list-style-type: none; -} -.jse-dropdown-button.svelte-11rxb2m button.jse-open-dropdown:where(.svelte-11rxb2m) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - width: 2em; - background: var(--jse-context-menu-background, #656565); - color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); - border-radius: 0; -} -.jse-dropdown-button.svelte-11rxb2m button.jse-open-dropdown.jse-visible:where(.svelte-11rxb2m) { - background: var(--jse-context-menu-background, #656565); -} -.jse-dropdown-button.svelte-11rxb2m button.jse-open-dropdown:where(.svelte-11rxb2m):hover { - background: var(--jse-context-menu-background-highlight, #7a7a7a); -} -.jse-dropdown-button.svelte-11rxb2m button.jse-open-dropdown:where(.svelte-11rxb2m):focus { - z-index: 1; -} -.jse-dropdown-button.svelte-11rxb2m button.jse-open-dropdown:where(.svelte-11rxb2m):disabled { - color: var(--jse-context-menu-color-disabled, #9d9d9d); - background: unset; -} -.jse-dropdown-button.svelte-11rxb2m .jse-dropdown-items:where(.svelte-11rxb2m) { - display: none; - position: absolute; - top: 100%; - left: 0; - z-index: 1; - background: var(--jse-context-menu-background, #656565); - color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); -} -.jse-dropdown-button.svelte-11rxb2m .jse-dropdown-items.jse-visible:where(.svelte-11rxb2m) { - display: block; -} -.jse-dropdown-button.svelte-11rxb2m .jse-dropdown-items:where(.svelte-11rxb2m) button:where(.svelte-11rxb2m) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - width: 100%; - text-align: left; - padding: var(--jse-padding, 10px); - margin: 0; -} -.jse-dropdown-button.svelte-11rxb2m .jse-dropdown-items:where(.svelte-11rxb2m) button:where(.svelte-11rxb2m):hover { - background: var(--jse-context-menu-background-highlight, #7a7a7a); -} -.jse-dropdown-button.svelte-11rxb2m .jse-dropdown-items:where(.svelte-11rxb2m) button:where(.svelte-11rxb2m):disabled { - color: var(--jse-context-menu-color-disabled, #9d9d9d); - background: unset; -}`);var CJA=wA('
    • '),dJA=wA('
        ');Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -button.jse-context-menu-button.svelte-1idfykj { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - flex: 1; - white-space: nowrap; - padding: var(--jse-padding, 10px); - color: inherit; -} -button.jse-context-menu-button.svelte-1idfykj:hover { - background: var(--jse-context-menu-background-highlight, #7a7a7a); -} -button.jse-context-menu-button.svelte-1idfykj:focus { - background: var(--jse-context-menu-background-highlight, #7a7a7a); - z-index: 1; -} -button.jse-context-menu-button.svelte-1idfykj:disabled { - color: var(--jse-context-menu-color-disabled, #9d9d9d); - background: unset; -} -button.jse-context-menu-button.left.svelte-1idfykj { - text-align: left; -} -button.jse-context-menu-button.svelte-1idfykj svg { - width: 16px; -}`);var BJA=wA('');function o_(t,e){mt(e,!1);var A=$(),i=b(e,"item",8),n=b(e,"className",8,void 0),o=b(e,"onRequestClose",8);fA(()=>(k(i()),k(o())),()=>{y(A,i().items.map(r=>fe(fe({},r),{},{onClick:s=>{o()(),r.onClick(s)}})))}),Qn(),Zt(),function(r,s){mt(s,!1);var a=$(void 0,!0),c=b(s,"items",25,()=>[]),l=b(s,"title",9,void 0),I=b(s,"width",9,"120px"),C=$(!1,!0);function d(){y(C,!1)}function B(w){n2(w)==="Escape"&&(w.preventDefault(),y(C,!1))}hs(()=>{document.addEventListener("click",d),document.addEventListener("keydown",B)}),qc(()=>{document.removeEventListener("click",d),document.removeEventListener("keydown",B)}),fA(()=>k(c()),()=>{y(a,c().every(w=>w.disabled===!0))}),Qn(),Zt(!0);var E=dJA(),h=W(E);jo(h,s,"defaultItem",{},null);var u,D=IA(h,2);ji(W(D),{get data(){return mg}});var L,R=IA(D,2);qo(W(R),5,c,or,(w,_)=>{var K=CJA(),z=W(K),U=W(z),H=j=>{ji(j,{get data(){return g(_),nA(()=>g(_).icon)}})};LA(U,j=>{g(_),nA(()=>g(_).icon)&&j(H)});var q=IA(U);De(()=>{var j;En(z,"title",(g(_),nA(()=>g(_).title))),z.disabled=(g(_),nA(()=>g(_).disabled)),Vt(z,1,Z1((g(_),nA(()=>g(_).className))),"svelte-11rxb2m"),wt(q," ".concat((g(_),(j=nA(()=>g(_).text))!==null&&j!==void 0?j:"")))}),ce("click",z,j=>g(_).onClick(j)),iA(w,K)}),De((w,_)=>{var K;En(E,"title",l()),u=Vt(D,1,"jse-open-dropdown svelte-11rxb2m",null,u,w),D.disabled=g(a),L=Vt(R,1,"jse-dropdown-items svelte-11rxb2m",null,L,_),Ll(R,"width: ".concat((K=I())!==null&&K!==void 0?K:"",";"))},[()=>({"jse-visible":g(C)}),()=>({"jse-visible":g(C)})],qA),ce("click",D,function(){var w=g(C);setTimeout(()=>y(C,!w))}),ce("click",E,d),iA(r,E),pt()}(t,{get width(){return k(i()),nA(()=>i().width)},get items(){return g(A)},$$slots:{defaultItem:(r,s)=>{var a=BJA(),c=W(a),l=C=>{ji(C,{get data(){return k(i()),nA(()=>i().main.icon)}})};LA(c,C=>{k(i()),nA(()=>i().main.icon)&&C(l)});var I=IA(c);De(C=>{var d;Vt(a,1,C,"svelte-1idfykj"),En(a,"title",(k(i()),nA(()=>i().main.title))),a.disabled=(k(i()),nA(()=>i().main.disabled||!1)),wt(I," ".concat((k(i()),(d=nA(()=>i().main.text))!==null&&d!==void 0?d:"")))},[()=>Z1((k(Kl),k(n()),k(i()),nA(()=>Kl("jse-context-menu-button",n(),i().main.className))))],qA),ce("click",a,C=>{o()(),i().main.onClick(C)}),iA(r,a)}}}),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-contextmenu.svelte-12z7bz1 { - box-shadow: var(--jse-controls-box-shadow, 0 2px 6px 0 rgba(0, 0, 0, 0.24)); - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - background: var(--jse-context-menu-background, #656565); - color: var(--jse-context-menu-color, var(--jse-text-color-inverse, #fff)); -} -.jse-contextmenu.svelte-12z7bz1 .jse-row:where(.svelte-12z7bz1) { - display: flex; - flex-direction: row; - align-items: flex-start; - justify-content: stretch; -} -.jse-contextmenu.svelte-12z7bz1 .jse-row:where(.svelte-12z7bz1) div.jse-label:where(.svelte-12z7bz1) { - flex: 1; - white-space: nowrap; - padding: var(--jse-padding, 10px); - color: var(--jse-context-menu-color-disabled, #9d9d9d); - line-height: normal; -} -.jse-contextmenu.svelte-12z7bz1 .jse-row:where(.svelte-12z7bz1) div.jse-tip:where(.svelte-12z7bz1) { - flex: 1; - background: var(--jse-context-menu-tip-background, rgba(255, 255, 255, 0.2)); - color: var(--context-menu-tip-color, inherit); - margin: calc(0.5 * var(--jse-padding, 10px)); - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); - font-size: 80%; - line-height: 1.3em; - display: flex; - flex-direction: row; - align-items: flex-start; - gap: var(--jse-padding, 10px); - border-radius: 3px; -} -.jse-contextmenu.svelte-12z7bz1 .jse-row:where(.svelte-12z7bz1) div.jse-tip:where(.svelte-12z7bz1) div.jse-tip-icon:where(.svelte-12z7bz1) { - padding-top: calc(0.5 * var(--jse-padding, 10px)); -} -.jse-contextmenu.svelte-12z7bz1 .jse-column:where(.svelte-12z7bz1) { - flex: 1; - display: flex; - flex-direction: column; - align-items: stretch; -} -.jse-contextmenu.svelte-12z7bz1 .jse-column:where(.svelte-12z7bz1):not(:last-child) { - border-right: 1px solid var(--jse-context-menu-separator-color, #7a7a7a); -} -.jse-contextmenu.svelte-12z7bz1 .jse-separator:where(.svelte-12z7bz1) { - width: 100%; - height: 1px; - background: var(--jse-context-menu-separator-color, #7a7a7a); -}`);var EJA=wA('
        '),QJA=wA('
        '),hJA=wA('
        '),uJA=wA('
        '),fJA=wA('
        '),mJA=wA('
        '),pJA=wA('
        '),wJA=wA('');function GaA(t,e){mt(e,!1);var A=b(e,"items",9),i=b(e,"onRequestClose",9),n=b(e,"tip",9),o=$(void 0,!0);hs(()=>{var C=Array.from(g(o).querySelectorAll("button")).find(d=>!d.disabled);C&&C.focus()});var r={ArrowUp:"Up",ArrowDown:"Down",ArrowLeft:"Left",ArrowRight:"Right"};function s(C){return console.error("Unknown type of context menu item",C),"???"}Zt(!0);var a=wJA(),c=W(a);qo(c,1,A,or,(C,d)=>{var B=_o(),E=vt(B),h=D=>{n_(D,{get item(){return g(d)},get onRequestClose(){return i()}})},u=(D,L)=>{var R=_=>{o_(_,{get item(){return g(d)},get onRequestClose(){return i()}})},w=(_,K)=>{var z=H=>{var q=fJA();qo(q,5,()=>(g(d),nA(()=>g(d).items)),or,(j,gA)=>{var QA=_o(),BA=vt(QA),lA=tA=>{n_(tA,{get item(){return g(gA)},get onRequestClose(){return i()}})},vA=(tA,cA)=>{var pA=oe=>{o_(oe,{get item(){return g(gA)},get onRequestClose(){return i()}})},VA=(oe,KA)=>{var CA=Ze=>{var He=hJA();qo(He,5,()=>(g(gA),nA(()=>g(gA).items)),or,(uA,eA)=>{var UA=_o(),aA=vt(UA),le=Ue=>{n_(Ue,{className:"left",get item(){return g(eA)},get onRequestClose(){return i()}})},SA=(Ue,mA)=>{var sA=tt=>{o_(tt,{className:"left",get item(){return g(eA)},get onRequestClose(){return i()}})},xt=(tt,de)=>{var Dt=Le=>{iA(Le,EJA())},_e=(Le,bt)=>{var Re=x=>{var Y=QJA(),P=W(Y);De(()=>wt(P,(g(eA),nA(()=>g(eA).text)))),iA(x,Y)},$t=x=>{var Y=Tr();De(P=>wt(Y,P),[()=>(g(eA),nA(()=>s(g(eA))))],qA),iA(x,Y)};LA(Le,x=>{k(rrA),g(eA),nA(()=>rrA(g(eA)))?x(Re):x($t,!1)},bt)};LA(tt,Le=>{k(G1),g(eA),nA(()=>G1(g(eA)))?Le(Dt):Le(_e,!1)},de)};LA(Ue,tt=>{k(ZE),g(eA),nA(()=>ZE(g(eA)))?tt(sA):tt(xt,!1)},mA)};LA(aA,Ue=>{k(q0),g(eA),nA(()=>q0(g(eA)))?Ue(le):Ue(SA,!1)}),iA(uA,UA)}),iA(Ze,He)},TA=(Ze,He)=>{var uA=UA=>{iA(UA,uJA())},eA=UA=>{var aA=Tr();De(le=>wt(aA,le),[()=>(g(gA),nA(()=>s(g(gA))))],qA),iA(UA,aA)};LA(Ze,UA=>{k(G1),g(gA),nA(()=>G1(g(gA)))?UA(uA):UA(eA,!1)},He)};LA(oe,Ze=>{k(arA),g(gA),nA(()=>arA(g(gA)))?Ze(CA):Ze(TA,!1)},KA)};LA(tA,oe=>{k(ZE),g(gA),nA(()=>ZE(g(gA)))?oe(pA):oe(VA,!1)},cA)};LA(BA,tA=>{k(q0),g(gA),nA(()=>q0(g(gA)))?tA(lA):tA(vA,!1)}),iA(j,QA)}),iA(H,q)},U=(H,q)=>{var j=QA=>{iA(QA,mJA())},gA=QA=>{var BA=Tr();De(lA=>wt(BA,lA),[()=>(g(d),nA(()=>s(g(d))))],qA),iA(QA,BA)};LA(H,QA=>{k(G1),g(d),nA(()=>G1(g(d)))?QA(j):QA(gA,!1)},q)};LA(_,H=>{k(srA),g(d),nA(()=>srA(g(d)))?H(z):H(U,!1)},K)};LA(D,_=>{k(ZE),g(d),nA(()=>ZE(g(d)))?_(R):_(w,!1)},L)};LA(E,D=>{k(q0),g(d),nA(()=>q0(g(d)))?D(h):D(u,!1)}),iA(C,B)});var l=IA(c,2),I=C=>{var d=pJA(),B=W(d),E=W(B);ji(W(E),{get data(){return xW}});var h=W(IA(E,2));De(()=>wt(h,n())),iA(C,d)};LA(l,C=>{n()&&C(I)}),Co(a,C=>y(o,C),()=>g(o)),ce("keydown",a,function(C){var d=n2(C),B=r[d];if(B&&C.target){C.preventDefault();var E=TGA({allElements:Array.from(g(o).querySelectorAll("button:not([disabled])")),currentElement:C.target,direction:B,hasPrio:h=>h.getAttribute("data-type")!=="jse-open-dropdown"});E&&E.focus()}}),iA(t,a),pt()}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-value.jse-string.svelte-6ttr41 { - color: var(--jse-value-color-string, #008000); -} -.jse-value.jse-object.svelte-6ttr41, .jse-value.jse-array.svelte-6ttr41 { - min-width: 16px; - color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); -} -.jse-value.jse-number.svelte-6ttr41 { - color: var(--jse-value-color-number, #ee422e); -} -.jse-value.jse-boolean.svelte-6ttr41 { - color: var(--jse-value-color-boolean, #ff8c00); -} -.jse-value.jse-null.svelte-6ttr41 { - color: var(--jse-value-color-null, #004ed0); -} -.jse-value.jse-invalid.svelte-6ttr41 { - color: var(--jse-text-color, #4d4d4d); -} -.jse-value.jse-url.svelte-6ttr41 { - color: var(--jse-value-color-url, #008000); - text-decoration: underline; -} - -.jse-enum-value.svelte-6ttr41 { - background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); - border: none; - padding: 0; - font-family: inherit; - font-size: inherit; - cursor: pointer; - outline: none; -} -.jse-enum-value.jse-selected.svelte-6ttr41 { - background: var(--jse-selection-background-color, #d3d3d3); - color: inherit; -} -.jse-enum-value.jse-value.svelte-6ttr41:focus { - color: var(--jse-text-color, #4d4d4d); -}`);var $6e=wA(""),A8e=wA("");var ty,iy;function ny(t,e){return ty||(iy=new WeakMap,ty=new ResizeObserver(A=>{for(var i of A){var n=iy.get(i.target);n&&n(i.target)}})),iy.set(t,e),ty.observe(t),{destroy:()=>{iy.delete(t),ty.unobserve(t)}}}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-tree-mode.svelte-vrx1dr { - flex: 1; - display: flex; - flex-direction: column; - position: relative; - background: var(--jse-background-color, #fff); - min-width: 0; - min-height: 0; - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - color: var(--jse-text-color, #4d4d4d); - line-height: var(--jse-line-height, calc(1em + 4px)); -} -.jse-tree-mode.svelte-vrx1dr .jse-hidden-input-label:where(.svelte-vrx1dr) .jse-hidden-input:where(.svelte-vrx1dr) { - position: fixed; - top: -10px; - left: -10px; - width: 1px; - height: 1px; - padding: 0; - border: 0; - outline: none; -} -.jse-tree-mode.no-main-menu.svelte-vrx1dr { - border-top: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-tree-mode.svelte-vrx1dr .jse-search-box-container:where(.svelte-vrx1dr) { - position: relative; - height: 0; - top: var(--jse-padding, 10px); - margin-right: calc(var(--jse-padding, 10px) + 20px); - margin-left: var(--jse-padding, 10px); - text-align: right; - z-index: 3; -} -.jse-tree-mode.svelte-vrx1dr .jse-contents:where(.svelte-vrx1dr) { - flex: 1; - overflow: auto; - position: relative; - padding: 2px; - display: flex; - flex-direction: column; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-tree-mode.svelte-vrx1dr .jse-contents:where(.svelte-vrx1dr):last-child { - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-tree-mode.svelte-vrx1dr .jse-contents:where(.svelte-vrx1dr) .jse-loading-space:where(.svelte-vrx1dr) { - flex: 1; -} -.jse-tree-mode.svelte-vrx1dr .jse-contents:where(.svelte-vrx1dr) .jse-loading:where(.svelte-vrx1dr) { - flex: 2; - text-align: center; - color: var(--jse-panel-color-readonly, #b2b2b2); - box-sizing: border-box; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); -} -.jse-tree-mode.svelte-vrx1dr .jse-contents:where(.svelte-vrx1dr) .jse-search-box-background:where(.svelte-vrx1dr) { - border: 50px solid var(--jse-modal-background, #f5f5f5); - margin: -2px; - margin-bottom: 2px; - display: inline-block; -}`);var DJA=wA(" ",1),yJA=wA('
        '),vJA=wA('
        ',1),bJA=wA(' ',1),MJA=wA('
        loading...
        '),kJA=wA('
        ',1);function U_(t,e){mt(e,!1);var A=$(void 0,!0),i=Sr("jsoneditor:TreeMode"),n=typeof window>"u";i("isSSR:",n);var o=c1(),r=c1(),{openAbsolutePopup:s,closeAbsolutePopup:a}=$1("absolute-popup"),c=$(void 0,!0),l=$(void 0,!0),I=$(void 0,!0),C=!1,d=paA(),B=b(e,"readOnly",9),E=b(e,"externalContent",9),h=b(e,"externalSelection",9),u=b(e,"history",9),D=b(e,"truncateTextSize",9),L=b(e,"mainMenuBar",9),R=b(e,"navigationBar",9),w=b(e,"escapeControlCharacters",9),_=b(e,"escapeUnicodeCharacters",9),K=b(e,"parser",9),z=b(e,"parseMemoizeOne",9),U=b(e,"validator",9),H=b(e,"validationParser",9),q=b(e,"pathParser",9),j=b(e,"indentation",9),gA=b(e,"onError",9),QA=b(e,"onChange",9),BA=b(e,"onChangeMode",9),lA=b(e,"onSelect",9),vA=b(e,"onUndo",9),tA=b(e,"onRedo",9),cA=b(e,"onRenderValue",9),pA=b(e,"onRenderMenu",9),VA=b(e,"onRenderContextMenu",9),oe=b(e,"onClassName",9),KA=b(e,"onFocus",9),CA=b(e,"onBlur",9),TA=b(e,"onSortModal",9),Ze=b(e,"onTransformModal",9),He=b(e,"onJSONEditorModal",9),uA=!1,eA=$(!1,!0),UA=$(void 0,!0);CG({onMount:hs,onDestroy:qc,getWindow:()=>af(g(I)),hasFocus:()=>uA&&document.hasFocus()||W_(g(I)),onFocus:()=>{C=!0,KA()&&KA()()},onBlur:()=>{C=!1,CA()&&CA()()}});var aA=$(void 0,!0),le=$(void 0,!0),SA=void 0,Ue=!1,mA=$(w_({json:g(aA)}),!0),sA=$(q3(h())?h():void 0,!0);function xt(T){y(sA,T)}hs(()=>{if(g(sA)){var T=et(g(sA));y(mA,Sl(g(aA),g(mA),T,ay)),setTimeout(()=>Ai(T))}});var tt,de=$(void 0,!0),Dt=$(void 0,!0),_e=$(void 0,!0),Le=$(void 0,!0),bt=$(!1,!0),Re=$(!1,!0);function $t(T){y(Le,(tt=T)?caA(g(aA),tt.items):void 0)}function x(T,oA){return Y.apply(this,arguments)}function Y(){return(Y=Yt(function*(T,oA){y(mA,Sl(g(aA),g(mA),T,ay));var YA=hn(oA);yield ot(T,{element:YA})})).apply(this,arguments)}function P(){y(bt,!1),y(Re,!1),Ri()}function X(T){i("select validation error",T),y(sA,Ni(T.path)),ot(T.path)}function bA(T){var oA=arguments.length>1&&arguments[1]!==void 0?arguments[1]:ErA;i("expand"),y(mA,Sl(g(aA),g(mA),T,oA))}function Be(T,oA){y(mA,IrA(g(aA),g(mA),T,oA)),g(sA)&&function(YA,pe){return Pg(et(YA),pe)&&(et(YA).length>pe.length||fr(YA))}(g(sA),T)&&y(sA,void 0)}var Ee=$(!1,!0),kA=$([],!0),DA=$(void 0,!0),gt=aE(waA);function Ve(T,oA,YA,pe){sQ(()=>{var he;try{he=gt(T,oA,YA,pe)}catch(ge){he=[{path:[],message:"Failed to validate: "+ge.message,severity:Fl.warning}]}di(he,g(kA))||(i("validationErrors changed:",he),y(kA,he),y(DA,function(ge,Bt){var $e;return Bt.forEach(bi=>{$e=KrA(ge,$e,bi.path,(un,Ji)=>fe(fe({},Ji),{},{validationError:bi}))}),Bt.forEach(bi=>{for(var un=bi.path;un.length>0;)un=Fi(un),$e=KrA(ge,$e,un,(Ji,Tn)=>Tn.validationError?Tn:fe(fe({},Tn),{},{validationError:{isChildError:!0,path:un,message:"Contains invalid data",severity:Fl.warning}}))}),$e}(T,g(kA))))},he=>i("validationErrors updated in ".concat(he," ms")))}function ZA(){return i("validate"),SA?{parseError:SA,isRepairable:!1}:(Ve(g(aA),U(),K(),H()),Oi(g(kA))?void 0:{validationErrors:g(kA)})}function rt(){return g(aA)}function Ei(){return g(mA)}function tn(){return g(sA)}function qi(T){i("applyExternalContent",{updatedContent:T}),z3(T)?function(oA){if(oA!==void 0){var YA=!di(g(aA),oA);if(i("update external json",{isChanged:YA,currentlyText:g(aA)===void 0}),!!YA){var pe={documentState:g(mA),selection:g(sA),json:g(aA),text:g(le),textIsRepaired:g(Ee)};y(aA,oA),y(mA,Qc(oA,g(mA))),xe(g(aA)),y(le,void 0),y(Ee,!1),SA=void 0,nn(g(aA)),mi(pe)}}}(T.json):H3(T)&&function(oA){if(!(oA===void 0||z3(E()))){var YA=oA!==g(le);if(i("update external text",{isChanged:YA}),!!YA){var pe={documentState:g(mA),selection:g(sA),json:g(aA),text:g(le),textIsRepaired:g(Ee)};try{y(aA,z()(oA)),y(mA,Qc(g(aA),g(mA))),xe(g(aA)),y(le,oA),y(Ee,!1),SA=void 0}catch(he){try{y(aA,z()(Rc(oA))),y(mA,Qc(g(aA),g(mA))),xe(g(aA)),y(le,oA),y(Ee,!0),SA=void 0,nn(g(aA))}catch{y(aA,void 0),y(mA,void 0),y(le,E().text),y(Ee,!1),SA=g(le)!==void 0&&g(le)!==""?dQ(g(le),he.message||String(he)):void 0}}nn(g(aA)),mi(pe)}}}(T.text)}function xe(T){Ue||(Ue=!0,y(mA,WC(T,g(mA),[])))}function nn(T){g(sA)&&(Ms(T,OC(g(sA)))&&Ms(T,et(g(sA)))||(i("clearing selection: path does not exist anymore",g(sA)),y(sA,WE(T,g(mA)))))}function mi(T){if(T.json!==void 0||T.text!==void 0){var oA=g(aA)!==void 0&&T.json!==void 0;u().add({type:"tree",undo:{patch:oA?[{op:"replace",path:"",value:T.json}]:void 0,json:T.json,text:T.text,documentState:T.documentState,textIsRepaired:T.textIsRepaired,selection:Hg(T.selection),sortedColumn:void 0},redo:{patch:oA?[{op:"replace",path:"",value:g(aA)}]:void 0,json:g(aA),text:g(le),documentState:g(mA),textIsRepaired:g(Ee),selection:Hg(g(sA)),sortedColumn:void 0}})}}function Ot(T,oA){var YA;if(i("patch",T,oA),g(aA)===void 0)throw new Error("Cannot apply patch: no JSON");var pe=g(aA),he={json:void 0,text:g(le),documentState:g(mA),selection:Hg(g(sA)),textIsRepaired:g(Ee),sortedColumn:void 0},ge=aaA(g(aA),T),Bt=ZsA(g(aA),g(mA),T),$e=(YA=QQ(g(aA),T))!==null&&YA!==void 0?YA:g(sA),bi=typeof oA=="function"?oA(Bt.json,Bt.documentState,$e):void 0;return y(aA,bi?.json!==void 0?bi.json:Bt.json),y(mA,bi?.state!==void 0?bi.state:Bt.documentState),y(sA,bi?.selection!==void 0?bi.selection:$e),y(le,void 0),y(Ee,!1),y(Dt,void 0),y(_e,void 0),SA=void 0,nn(g(aA)),u().add({type:"tree",undo:fe({patch:ge},he),redo:{patch:T,json:void 0,text:g(le),documentState:g(mA),selection:Hg(g(sA)),sortedColumn:void 0,textIsRepaired:g(Ee)}}),{json:g(aA),previousJson:pe,undo:ge,redo:T}}function Lt(){!B()&&g(sA)&&y(sA,cG(et(g(sA))))}function ii(){if(!B()&&g(sA)){var T=et(g(sA)),oA=Ke(g(aA),T);No(oA)?function(YA,pe){i("openJSONEditorModal",{path:YA,value:pe}),uA=!0,He()({content:{json:pe},path:YA,onPatch:g(m).onPatch,onClose:()=>{uA=!1,setTimeout(Ri)}})}(T,oA):y(sA,my(T))}}function _i(){if(!B()&&an(g(sA))){var T=et(g(sA)),oA=Ct(T),YA=Ke(g(aA),T),pe=!zg(g(aA),g(mA),T),he=pe?String(YA):DQ(String(YA),K());i("handleToggleEnforceString",{enforceString:pe,value:YA,updatedValue:he}),dt([{op:"replace",path:oA,value:he}],(ge,Bt)=>({state:Ky(g(aA),Bt,T,{type:"value",enforceString:pe})}))}}function Tt(){return g(Ee)&&g(aA)!==void 0&&EA(g(aA)),g(aA)!==void 0?{json:g(aA)}:{text:g(le)||""}}function M(){return We.apply(this,arguments)}function We(){return We=Yt(function*(){var T=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];yield RaA({json:g(aA),selection:g(sA),indentation:T?j():void 0,readOnly:B(),parser:K(),onPatch:dt})}),We.apply(this,arguments)}function ni(){return pi.apply(this,arguments)}function pi(){return pi=Yt(function*(){var T=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];g(aA)!==void 0&&(yield xaA({json:g(aA),selection:g(sA),indentation:T?j():void 0,parser:K()}))}),pi.apply(this,arguments)}function dn(T){var oA;T.preventDefault(),kn((oA=T.clipboardData)===null||oA===void 0?void 0:oA.getData("text/plain"))}function mn(){return Uo.apply(this,arguments)}function Uo(){return(Uo=Yt(function*(){try{kn(yield navigator.clipboard.readText())}catch(T){console.error(T),y(eA,!0)}})).apply(this,arguments)}function kn(T){T!==void 0&&LaA({clipboardText:T,json:g(aA),selection:g(sA),readOnly:B(),parser:K(),onPatch:dt,onChangeText:HA,onPasteMultilineText:Jn,openRepairModal:Wn})}function Wn(T,oA){y(UA,{text:T,onParse:YA=>sf(YA,pe=>rf(pe,K())),onRepair:_sA,onApply:oA,onClose:Ri})}function Vo(){FaA({json:g(aA),text:g(le),selection:g(sA),keepSelection:!1,readOnly:B(),onChange:QA(),onPatch:dt})}function vo(){!B()&&g(aA)!==void 0&&g(sA)&&oQ&&!Oi(et(g(sA)))&&(i("duplicate",{selection:g(sA)}),dt(naA(g(aA),W1(g(aA),g(sA)))))}function bo(){B()||!g(sA)||!Kn(g(sA))&&!an(g(sA))||Oi(et(g(sA)))||(i("extract",{selection:g(sA)}),dt(oaA(g(aA),g(sA)),(T,oA)=>{if(No(T))return{state:ZN(T,oA,[])}}))}function Yn(T){Sy({insertType:T,selectInside:!0,initialValue:void 0,json:g(aA),selection:g(sA),readOnly:B(),parser:K(),onPatch:dt,onReplaceJson:EA})}function Mo(T){kr(g(sA))&&y(sA,Ni(g(sA).path)),g(sA)||y(sA,WE(g(aA),g(mA))),Yn(T)}function ne(T){if(!B()&&g(sA))if(WD(g(sA)))try{var oA=OC(g(sA)),YA=Ke(g(aA),oA),pe=function(ge,Bt,$e){if(Bt==="array"){if(Array.isArray(ge))return ge;if(Cn(ge))return XoA(ge);if(typeof ge=="string")try{var bi=$e.parse(ge);if(Array.isArray(bi))return bi;if(Cn(bi))return XoA(bi)}catch{return[ge]}return[ge]}if(Bt==="object"){if(Array.isArray(ge))return WoA(ge);if(Cn(ge))return ge;if(typeof ge=="string")try{var un=$e.parse(ge);if(Cn(un))return un;if(Array.isArray(un))return WoA(un)}catch{return{value:ge}}return{value:ge}}if(Bt==="value")return No(ge)?$e.stringify(ge):ge;throw new Error("Cannot convert ".concat(q_(ge,$e)," to ").concat(Bt))}(YA,T,K());if(pe===YA)return;var he=[{op:"replace",path:Ct(oA),value:pe}];i("handleConvert",{selection:g(sA),path:oA,type:T,operations:he}),dt(he,(ge,Bt)=>({state:g(sA)?WC(ge,Bt,et(g(sA))):g(mA)}))}catch(ge){gA()(ge)}else gA()(new Error("Cannot convert current selection to ".concat(T)))}function wi(){if(g(sA)){var T=QrA(g(aA),g(mA),g(sA),!1),oA=Fi(et(g(sA)));T&&!Oi(et(T))&&di(oA,Fi(et(T)))?y(sA,t2(et(T))):y(sA,r2(oA)),i("insert before",{selection:g(sA),selectionBefore:T,parentPath:oA}),io(),Pt()}}function MA(){if(g(sA)){var T=P1(g(aA),g(sA));i("insert after",T),y(sA,t2(T)),io(),Pt()}}function me(T){return nt.apply(this,arguments)}function nt(){return(nt=Yt(function*(T){yield NaA({char:T,selectInside:!0,json:g(aA),selection:g(sA),readOnly:B(),parser:K(),onPatch:dt,onReplaceJson:EA,onSelect:xt})})).apply(this,arguments)}function Wt(){if(!B()&&u().canUndo){var T=u().undo();if(uy(T)){var oA={json:g(aA),text:g(le)};y(aA,T.undo.patch?Da(g(aA),T.undo.patch):T.undo.json),y(mA,T.undo.documentState),y(sA,T.undo.selection),y(le,T.undo.text),y(Ee,T.undo.textIsRepaired),SA=void 0,i("undo",{item:T,json:g(aA),documentState:g(mA),selection:g(sA)}),Ki(oA,T.undo.patch&&T.redo.patch?{json:g(aA),previousJson:oA.json,redo:T.undo.patch,undo:T.redo.patch}:void 0),Ri(),g(sA)&&ot(et(g(sA)),{scrollToWhenVisible:!1})}else vA()(T)}}function Xe(){if(!B()&&u().canRedo){var T=u().redo();if(uy(T)){var oA={json:g(aA),text:g(le)};y(aA,T.redo.patch?Da(g(aA),T.redo.patch):T.redo.json),y(mA,T.redo.documentState),y(sA,T.redo.selection),y(le,T.redo.text),y(Ee,T.redo.textIsRepaired),SA=void 0,i("redo",{item:T,json:g(aA),documentState:g(mA),selection:g(sA)}),Ki(oA,T.undo.patch&&T.redo.patch?{json:g(aA),previousJson:oA.json,redo:T.redo.patch,undo:T.undo.patch}:void 0),Ri(),g(sA)&&ot(et(g(sA)),{scrollToWhenVisible:!1})}else tA()(T)}}function oi(T){var oA;B()||g(aA)===void 0||(uA=!0,TA()({id:o,json:g(aA),rootPath:T,onSort:(oA=Yt(function*(YA){var{operations:pe}=YA;i("onSort",T,pe),dt(pe,(he,ge)=>({state:ZN(he,ge,T),selection:Ni(T)}))}),function(YA){return oA.apply(this,arguments)}),onClose:()=>{uA=!1,setTimeout(Ri)}}))}function Di(){g(sA)&&oi(urA(g(aA),g(sA)))}function Ut(){oi([])}function cn(T){if(g(aA)!==void 0){var{id:oA,onTransform:YA,onClose:pe}=T,he=T.rootPath||[];uA=!0,Ze()({id:oA||r,json:g(aA),rootPath:he,onTransform:ge=>{YA?YA({operations:ge,json:g(aA),transformedJson:Da(g(aA),ge)}):(i("onTransform",he,ge),dt(ge,(Bt,$e)=>({state:ZN(Bt,$e,he),selection:Ni(he)})))},onClose:()=>{uA=!1,setTimeout(Ri),pe&&pe()}})}}function ft(){g(sA)&&cn({rootPath:urA(g(aA),g(sA))})}function Qi(){cn({rootPath:[]})}function ot(T){return Mt.apply(this,arguments)}function Mt(){return Mt=Yt(function*(T){var{scrollToWhenVisible:oA=!0,element:YA}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};y(mA,Sl(g(aA),g(mA),T,ay));var pe=YA??on(T);if(i("scrollTo",{path:T,elem:pe,refContents:g(c)}),!pe||!g(c))return Promise.resolve();var he=g(c).getBoundingClientRect(),ge=pe.getBoundingClientRect();if(!oA&&ge.bottom>he.top&&ge.top{d(pe,{container:g(c),offset:Bt,duration:300,callback:()=>$e()})})}),Mt.apply(this,arguments)}function on(T){var oA,YA;return io(),(oA=(YA=g(c))===null||YA===void 0?void 0:YA.querySelector('div[data-path="'.concat(sy(T),'"]')))!==null&&oA!==void 0?oA:void 0}function hn(T){var oA,YA;return io(),(oA=(YA=g(c))===null||YA===void 0?void 0:YA.querySelector('span[data-search-result-index="'.concat(T,'"]')))!==null&&oA!==void 0?oA:void 0}function Ai(T){var oA=on(T);if(oA&&g(c)){var YA=g(c).getBoundingClientRect(),pe=oA.getBoundingClientRect(),he=No(Ke(g(aA),T))?20:pe.height;pe.topYA.bottom-20&&d(oA,{container:g(c),offset:-(YA.height-he-20),duration:0})}}function Ki(T,oA){if(T.json!==void 0||T?.text!==void 0){if(g(le)!==void 0){var YA,pe={text:g(le),json:void 0};(YA=QA())===null||YA===void 0||YA(pe,T,{contentErrors:ZA(),patchResult:oA})}else if(g(aA)!==void 0){var he,ge={text:void 0,json:g(aA)};(he=QA())===null||he===void 0||he(ge,T,{contentErrors:ZA(),patchResult:oA})}}}function dt(T,oA){i("handlePatch",T,oA);var YA={json:g(aA),text:g(le)},pe=Ot(T,oA);return Ki(YA,pe),pe}function EA(T,oA){var YA={json:g(aA),text:g(le)},pe={documentState:g(mA),selection:g(sA),json:g(aA),text:g(le),textIsRepaired:g(Ee)},he=Sl(g(aA),Qc(T,g(mA)),[],G3),ge=typeof oA=="function"?oA(T,he,g(sA)):void 0;y(aA,ge?.json!==void 0?ge.json:T),y(mA,ge?.state!==void 0?ge.state:he),y(sA,ge?.selection!==void 0?ge.selection:g(sA)),y(le,void 0),y(Ee,!1),SA=void 0,nn(g(aA)),mi(pe),Ki(YA,void 0)}function HA(T,oA){i("handleChangeText");var YA={json:g(aA),text:g(le)},pe={documentState:g(mA),selection:g(sA),json:g(aA),text:g(le),textIsRepaired:g(Ee)};try{y(aA,z()(T)),y(mA,Sl(g(aA),Qc(g(aA),g(mA)),[],G3)),y(le,void 0),y(Ee,!1),SA=void 0}catch(ge){try{y(aA,z()(Rc(T))),y(mA,Sl(g(aA),Qc(g(aA),g(mA)),[],G3)),y(le,T),y(Ee,!0),SA=void 0}catch{y(aA,void 0),y(mA,w_({json:g(aA),expand:G3})),y(le,T),y(Ee,!1),SA=g(le)!==""?dQ(g(le),ge.message||String(ge)):void 0}}if(typeof oA=="function"){var he=oA(g(aA),g(mA),g(sA));y(aA,he?.json!==void 0?he.json:g(aA)),y(mA,he?.state!==void 0?he.state:g(mA)),y(sA,he?.selection!==void 0?he.selection:g(sA))}nn(g(aA)),mi(pe),Ki(YA,void 0)}function ve(T,oA){var YA=arguments.length>2&&arguments[2]!==void 0&&arguments[2];i("handleExpand",{path:T,expanded:oA,recursive:YA}),oA?bA(T,YA?aG:ErA):Be(T,YA),Ri()}function Qt(){ve([],!0,!0)}function yi(){ve([],!1,!0)}function ri(T){i("openFind",{findAndReplace:T}),y(bt,!1),y(Re,!1),io(),y(bt,!0),y(Re,T)}function pn(T,oA){i("handleExpandSection",T,oA),y(mA,function(YA,pe,he,ge){return EQ(YA,pe,he,(Bt,$e)=>{if(!Mr($e))return $e;var bi=jsA($e.visibleSections.concat(ge));return fe(fe({},$e),{},{visibleSections:bi})})}(g(aA),g(mA),T,oA))}function Fn(T){i("pasted json as text",T),y(Dt,T)}function Jn(T){i("pasted multiline text",{pastedText:T}),y(_e,T)}function ln(T){var oA,{anchor:YA,left:pe,top:he,width:ge,height:Bt,offsetTop:$e,offsetLeft:bi,showTip:un}=T,Ji=function(Sn){var{json:no,documentState:gn,selection:Nt,readOnly:Zi,onEditKey:_t,onEditValue:st,onToggleEnforceString:si,onCut:Eo,onCopy:xr,onPaste:Hn,onRemove:So,onDuplicate:zr,onExtract:t0,onInsertBefore:Ta,onInsert:Wc,onConvert:Hl,onInsertAfter:Xc,onSort:Or,onTransform:Pr}=Sn,Ha=no!==void 0,i0=!!Nt,za=!!Nt&&Oi(et(Nt)),Ko=Nt?Ke(no,et(Nt)):void 0,$n=Array.isArray(Ko)?"Edit array":Cn(Ko)?"Edit object":"Edit value",Zo=Ha&&(Kn(Nt)||kr(Nt)||an(Nt)),zl=Nt&&!za?Ke(no,Fi(et(Nt))):void 0,Id=!Zi&&Ha&&fy(Nt)&&!za&&!Array.isArray(zl),Cd=!Zi&&Ha&&Nt!==void 0&&fy(Nt),JQ=Cd&&!No(Ko),dd=!Zi&&Zo,TQ=Zo,U7=!Zi&&i0,K7=!Zi&&Ha&&Zo&&!za,Y7=!Zi&&Ha&&Nt!==void 0&&(Kn(Nt)||an(Nt))&&!za,Ol=Zo,sI=Ol?"Convert to:":"Insert:",rr=!Zi&&(fr(Nt)&&Array.isArray(Ko)||Ua(Nt)&&Array.isArray(zl)),ta=!Zi&&(Ol?WD(Nt)&&!Cn(Ko):i0),HQ=!Zi&&(Ol?WD(Nt)&&!Array.isArray(Ko):i0),zQ=!Zi&&(Ol?WD(Nt)&&No(Ko):i0),aI=Nt!==void 0&&zg(no,gn,et(Nt));function is(OQ){Zo?OQ!=="structure"&&Hl(OQ):Wc(OQ)}return[{type:"row",items:[{type:"button",onClick:()=>_t(),icon:lC,text:"Edit key",title:"Edit the key (Double-click on the key)",disabled:!Id},{type:"dropdown-button",main:{type:"button",onClick:()=>st(),icon:lC,text:$n,title:"Edit the value (Double-click on the value)",disabled:!Cd},width:"11em",items:[{type:"button",icon:lC,text:$n,title:"Edit the value (Double-click on the value)",onClick:()=>st(),disabled:!Cd},{type:"button",icon:aI?jS:ZS,text:"Enforce string",title:"Enforce keeping the value as string when it contains a numeric value",onClick:()=>si(),disabled:!JQ}]}]},{type:"separator"},{type:"row",items:[{type:"dropdown-button",main:{type:"button",onClick:()=>Eo(!0),icon:cC,text:"Cut",title:"Cut selected contents, formatted with indentation (Ctrl+X)",disabled:!dd},width:"10em",items:[{type:"button",icon:cC,text:"Cut formatted",title:"Cut selected contents, formatted with indentation (Ctrl+X)",onClick:()=>Eo(!0),disabled:!dd},{type:"button",icon:cC,text:"Cut compacted",title:"Cut selected contents, without indentation (Ctrl+Shift+X)",onClick:()=>Eo(!1),disabled:!dd}]},{type:"dropdown-button",main:{type:"button",onClick:()=>xr(!0),icon:F0,text:"Copy",title:"Copy selected contents, formatted with indentation (Ctrl+C)",disabled:!TQ},width:"12em",items:[{type:"button",icon:F0,text:"Copy formatted",title:"Copy selected contents, formatted with indentation (Ctrl+C)",onClick:()=>xr(!0),disabled:!TQ},{type:"button",icon:F0,text:"Copy compacted",title:"Copy selected contents, without indentation (Ctrl+Shift+C)",onClick:()=>xr(!1),disabled:!TQ}]},{type:"button",onClick:()=>Hn(),icon:PS,text:"Paste",title:"Paste clipboard contents (Ctrl+V)",disabled:!U7}]},{type:"separator"},{type:"row",items:[{type:"column",items:[{type:"button",onClick:()=>zr(),icon:$S,text:"Duplicate",title:"Duplicate selected contents (Ctrl+D)",disabled:!K7},{type:"button",onClick:()=>t0(),icon:TW,text:"Extract",title:"Extract selected contents",disabled:!Y7},{type:"button",onClick:()=>Or(),icon:l4,text:"Sort",title:"Sort array or object contents",disabled:Zi||!Zo},{type:"button",onClick:()=>Pr(),icon:s4,text:"Transform",title:"Transform array or object contents (filter, sort, project)",disabled:Zi||!Zo},{type:"button",onClick:()=>So(),icon:E5,text:"Remove",title:"Remove selected contents (Delete)",disabled:Zi||!Zo}]},{type:"column",items:[{type:"label",text:sI},{type:"button",onClick:()=>is("structure"),icon:Ol?c4:gC,text:"Structure",title:sI+" structure like the first item in the array",disabled:!rr},{type:"button",onClick:()=>is("object"),icon:Ol?c4:gC,text:"Object",title:sI+" object",disabled:!ta},{type:"button",onClick:()=>is("array"),icon:Ol?c4:gC,text:"Array",title:sI+" array",disabled:!HQ},{type:"button",onClick:()=>is("value"),icon:Ol?c4:gC,text:"Value",title:sI+" value",disabled:!zQ}]}]},{type:"separator"},{type:"row",items:[{type:"button",onClick:()=>Ta(),icon:YW,text:"Insert before",title:"Select area before current entry to insert or paste contents",disabled:Zi||!Zo||za},{type:"button",onClick:()=>Xc(),icon:_W,text:"Insert after",title:"Select area after current entry to insert or paste contents",disabled:Zi||!Zo||za}]}]}({json:g(aA),documentState:g(mA),selection:g(sA),readOnly:B(),onEditKey:Lt,onEditValue:ii,onToggleEnforceString:_i,onCut:M,onCopy:ni,onPaste:mn,onRemove:Vo,onDuplicate:vo,onExtract:bo,onInsertBefore:wi,onInsert:Mo,onInsertAfter:MA,onConvert:ne,onSort:Di,onTransform:ft}),Tn=(oA=VA()(Ji))!==null&&oA!==void 0?oA:Ji;if(Tn!==!1){var Ht={left:pe,top:he,offsetTop:$e,offsetLeft:bi,width:ge,height:Bt,anchor:YA,closeOnOuterClick:!0,onClose:()=>{uA=!1,Ri()}};uA=!0;var ko=s(GaA,{tip:un?"Tip: you can open this context menu via right-click or with Ctrl+Q":void 0,items:Tn,onRequestClose:()=>a(ko)},Ht)}}function Pt(T){if(!br(g(sA)))if(T&&(T.stopPropagation(),T.preventDefault()),T&&T.type==="contextmenu"&&T.target!==g(l))ln({left:T.clientX,top:T.clientY,width:W0,height:Z0,showTip:!1});else{var oA,YA=(oA=g(c))===null||oA===void 0?void 0:oA.querySelector(".jse-context-menu-pointer.jse-selected");if(YA)ln({anchor:YA,offsetTop:2,width:W0,height:Z0,showTip:!1});else{var pe,he=(pe=g(c))===null||pe===void 0?void 0:pe.getBoundingClientRect();he&&ln({top:he.top+2,left:he.left+2,width:W0,height:Z0,showTip:!1})}}}function $i(T){ln({anchor:OsA(T.target,"BUTTON"),offsetTop:0,width:W0,height:Z0,showTip:!0})}function Rr(){return Ft.apply(this,arguments)}function Ft(){return(Ft=Yt(function*(){if(i("apply pasted json",g(Dt)),g(Dt)){var{onPasteAsJson:T}=g(Dt);y(Dt,void 0),T(),setTimeout(Ri)}})).apply(this,arguments)}function Xn(){return se.apply(this,arguments)}function se(){return(se=Yt(function*(){i("apply pasted multiline text",g(_e)),g(_e)&&(kn(JSON.stringify(g(_e))),setTimeout(Ri))})).apply(this,arguments)}function vi(){i("clear pasted json"),y(Dt,void 0),Ri()}function Yi(){i("clear pasted multiline text"),y(_e,void 0),Ri()}function rn(){BA()(er.text)}function Hr(T){y(sA,T),Ri(),ot(et(T))}function Ri(){i("focus"),g(l)&&(g(l).focus(),g(l).select())}function fs(T){return function(oA,YA,pe){var he=Fi(pe),ge=[hi(pe)],Bt=Ke(oA,he),$e=Bt?VN(Bt,YA,ge):void 0;return $e?Ni(he.concat($e)):t2(pe)}(g(aA),g(mA),T)}function Bo(T){g(A)&&g(A).onDrag(T)}function Q(){g(A)&&g(A).onDragEnd()}var m=$(void 0,!0);fA(()=>g(sA),()=>{var T;T=g(sA),di(T,h())||(i("onSelect",T),lA()(T))}),fA(()=>(k(w()),k(_())),()=>{y(de,V_({escapeControlCharacters:w(),escapeUnicodeCharacters:_()}))}),fA(()=>g(bt),()=>{(function(T){g(c)&&T&&g(c).scrollTop===0&&(hc(c,g(c).style.overflowAnchor="none"),hc(c,g(c).scrollTop+=_3),setTimeout(()=>{g(c)&&hc(c,g(c).style.overflowAnchor="")}))})(g(bt))}),fA(()=>k(E()),()=>{qi(E())}),fA(()=>k(h()),()=>{(function(T){di(g(sA),T)||(i("applyExternalSelection",{selection:g(sA),externalSelection:T}),q3(T)&&y(sA,T))})(h())}),fA(()=>(g(aA),k(U()),k(K()),k(H())),()=>{Ve(g(aA),U(),K(),H())}),fA(()=>(g(c),UrA),()=>{y(A,g(c)?UrA(g(c)):void 0)}),fA(()=>(k(B()),k(D()),k(K()),g(de),k(cA()),k(oe())),()=>{y(m,{mode:er.tree,readOnly:B(),truncateTextSize:D(),parser:K(),normalization:g(de),getJson:rt,getDocumentState:Ei,getSelection:tn,findElement:on,findNextInside:fs,focus:Ri,onPatch:dt,onInsert:Yn,onExpand:ve,onSelect:xt,onFind:ri,onExpandSection:pn,onPasteJson:Fn,onRenderValue:cA(),onContextMenu:ln,onClassName:oe()||(()=>{}),onDrag:Bo,onDragEnd:Q})}),fA(()=>g(m),()=>{i("context changed",g(m))}),Qn(),Zt(!0);var v=kJA();ce("mousedown",A2,function(T){!yQ(T.target,oA=>oA===g(I))&&br(g(sA))&&(i("click outside the editor, exit edit mode"),y(sA,Hg(g(sA))),C&&g(l)&&(g(l).focus(),g(l).blur()),i("blur (outside editor)"),g(l)&&g(l).blur())});var p,N=vt(v),J=W(N),V=T=>{(function(oA,YA){mt(YA,!1);var pe=$(void 0,!0),he=$(void 0,!0),ge=$(void 0,!0),Bt=b(YA,"json",9),$e=b(YA,"selection",9),bi=b(YA,"readOnly",9),un=b(YA,"showSearch",13,!1),Ji=b(YA,"history",9),Tn=b(YA,"onExpandAll",9),Ht=b(YA,"onCollapseAll",9),ko=b(YA,"onUndo",9),Sn=b(YA,"onRedo",9),no=b(YA,"onSort",9),gn=b(YA,"onTransform",9),Nt=b(YA,"onContextMenu",9),Zi=b(YA,"onCopy",9),_t=b(YA,"onRenderMenu",9);function st(){un(!un())}var si=$(void 0,!0),Eo=$(void 0,!0),xr=$(void 0,!0),Hn=$(void 0,!0);fA(()=>k(Bt()),()=>{y(pe,Bt()!==void 0)}),fA(()=>(g(pe),k($e()),an),()=>{y(he,g(pe)&&(Kn($e())||kr($e())||an($e())))}),fA(()=>(k(Tn()),k(Bt())),()=>{y(si,{type:"button",icon:_YA,title:"Expand all",className:"jse-expand-all",onClick:Tn(),disabled:!No(Bt())})}),fA(()=>(k(Ht()),k(Bt())),()=>{y(Eo,{type:"button",icon:GYA,title:"Collapse all",className:"jse-collapse-all",onClick:Ht(),disabled:!No(Bt())})}),fA(()=>k(Bt()),()=>{y(xr,{type:"button",icon:g4,title:"Search (Ctrl+F)",className:"jse-search",onClick:st,disabled:Bt()===void 0})}),fA(()=>(k(bi()),g(si),g(Eo),k(no()),k(Bt()),k(gn()),g(xr),k(Nt()),k(ko()),k(Ji()),k(Sn()),k(Zi()),g(he)),()=>{y(Hn,bi()?[g(si),g(Eo),{type:"separator"},{type:"button",icon:F0,title:"Copy (Ctrl+C)",className:"jse-copy",onClick:Zi(),disabled:!g(he)},{type:"separator"},g(xr),{type:"space"}]:[g(si),g(Eo),{type:"separator"},{type:"button",icon:l4,title:"Sort",className:"jse-sort",onClick:no(),disabled:bi()||Bt()===void 0},{type:"button",icon:s4,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:gn(),disabled:bi()||Bt()===void 0},g(xr),{type:"button",icon:WS,title:AG,className:"jse-contextmenu",onClick:Nt()},{type:"separator"},{type:"button",icon:h5,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:ko(),disabled:!Ji().canUndo},{type:"button",icon:Q5,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:Sn(),disabled:!Ji().canRedo},{type:"space"}])}),fA(()=>(k(_t()),g(Hn)),()=>{y(ge,_t()(g(Hn))||g(Hn))}),Qn(),Zt(!0),Oy(oA,{get items(){return g(ge)}}),pt()})(T,{get json(){return g(aA)},get selection(){return g(sA)},get readOnly(){return B()},get history(){return u()},onExpandAll:Qt,onCollapseAll:yi,onUndo:Wt,onRedo:Xe,onSort:Ut,onTransform:Qi,onContextMenu:$i,onCopy:ni,get onRenderMenu(){return pA()},get showSearch(){return g(bt)},set showSearch(oA){y(bt,oA)},$$legacy:!0})};LA(J,T=>{L()&&T(V)});var Z=IA(J,2),FA=T=>{tJA(T,{get json(){return g(aA)},get selection(){return g(sA)},onSelect:Hr,get onError(){return gA()},get pathParser(){return q()}})};LA(Z,T=>{R()&&T(FA)});var te=IA(Z,2),re=T=>{var oA=bJA(),YA=vt(oA),pe=W(YA);pe.readOnly=!0,Co(pe,$e=>y(l,$e),()=>g(l));var he=IA(YA,2),ge=$e=>{var bi=_o(),un=vt(bi),Ji=Ht=>{(function(ko,Sn){mt(Sn,!0);var no=HYA();no.__click=[JYA,Sn];var gn=IA(W(no),2),Nt=IA(W(gn),2),Zi=_t=>{var st=TYA(),si=IA(vt(st),2);En(si,"title","Create an empty JSON object (press '{')"),si.__click=[KYA,Sn];var Eo=IA(si,2);En(Eo,"title","Create an empty JSON array (press '[')"),Eo.__click=[YYA,Sn],iA(_t,st)};LA(Nt,_t=>{Sn.readOnly||_t(Zi)}),iA(ko,no),pt()})(Ht,{get readOnly(){return B()},onCreateObject:()=>{Ri(),me("{")},onCreateArray:()=>{Ri(),me("[")},onClick:()=>{Ri()}})},Tn=Ht=>{var ko=DJA(),Sn=vt(ko),no=qA(()=>B()?[]:[{icon:a4,text:"Repair manually",title:'Open the document in "code" mode and repair it manually',onClick:rn}]);mc(Sn,{type:"error",message:"The loaded JSON document is invalid and could not be repaired automatically.",get actions(){return g(no)}}),_aA(IA(Sn,2),{get text(){return g(le)},get json(){return g(aA)},get indentation(){return j()},get parser(){return K()}}),iA(Ht,ko)};LA(un,Ht=>{g(le)===""||g(le)===void 0?Ht(Ji):Ht(Tn,!1)}),iA($e,bi)},Bt=$e=>{var bi=vJA(),un=vt(bi);MaA(W(un),{get json(){return g(aA)},get documentState(){return g(mA)},get parser(){return K()},get showSearch(){return g(bt)},get showReplace(){return g(Re)},get readOnly(){return B()},columns:void 0,onSearch:$t,onFocus:x,onPatch:dt,onClose:P});var Ji=IA(un,2);En(Ji,"data-jsoneditor-scrollable-contents",!0);var Tn=W(Ji),Ht=_t=>{iA(_t,yJA())};LA(Tn,_t=>{g(bt)&&_t(Ht)}),x_(IA(Tn,2),{get value(){return g(aA)},pointer:"",get state(){return g(mA)},get validationErrors(){return g(DA)},get searchResults(){return g(Le)},get selection(){return g(sA)},get context(){return g(m)},get onDragSelectionStart(){return $o}}),Co(Ji,_t=>y(c,_t),()=>g(c));var ko=IA(Ji,2),Sn=_t=>{var st=qA(()=>(g(Dt),nA(()=>"You pasted a JSON ".concat(Array.isArray(g(Dt).contents)?"array":"object"," as text")))),si=qA(()=>[{icon:L0,text:"Paste as JSON instead",title:"Replace the value with the pasted JSON",onMouseDown:Rr},{text:"Leave as is",title:"Keep the JSON embedded in the value",onClick:vi}]);mc(_t,{type:"info",get message(){return g(st)},get actions(){return g(si)}})};LA(ko,_t=>{g(Dt)&&_t(Sn)});var no=IA(ko,2),gn=_t=>{var st=qA(()=>[{icon:L0,text:"Paste as string instead",title:"Paste the clipboard data as a single string value instead of an array",onClick:Xn},{text:"Leave as is",title:"Keep the pasted array",onClick:Yi}]);mc(_t,{type:"info",message:"Multiline text was pasted as array",get actions(){return g(st)}})};LA(no,_t=>{g(_e)&&_t(gn)});var Nt=IA(no,2),Zi=_t=>{var st=qA(()=>B()?[]:[{icon:u5,text:"Ok",title:"Accept the repaired document",onClick:Tt},{icon:a4,text:"Repair manually instead",title:"Leave the document unchanged and repair it manually instead",onClick:rn}]);mc(_t,{type:"success",message:"The loaded JSON document was invalid but is successfully repaired.",get actions(){return g(st)},onClose:Ri})};LA(Nt,_t=>{g(Ee)&&_t(Zi)}),dG(IA(Nt,2),{get validationErrors(){return g(kA)},selectError:X}),iA($e,bi)};LA(he,$e=>{g(aA)===void 0?$e(ge):$e(Bt,!1)}),ce("paste",pe,dn),iA(T,oA)},Pe=T=>{iA(T,MJA())};LA(te,T=>{n?T(Pe,!1):T(re)}),Co(N,T=>y(I,T),()=>g(I));var ze=IA(N,2),ye=T=>{DaA(T,{onClose:()=>y(eA,!1)})};LA(ze,T=>{g(eA)&&T(ye)});var Ge=IA(ze,2),Vi=T=>{yaA(T,z1(()=>g(UA),{onClose:()=>{var oA;(oA=g(UA))===null||oA===void 0||oA.onClose(),y(UA,void 0)}}))};return LA(Ge,T=>{g(UA)&&T(Vi)}),De(T=>p=Vt(N,1,"jse-tree-mode svelte-vrx1dr",null,p,T),[()=>({"no-main-menu":!L()})],qA),ce("keydown",N,function(T){var oA=n2(T),YA=T.shiftKey;if(i("keydown",{combo:oA,key:T.key}),oA==="Ctrl+X"&&(T.preventDefault(),M(!0)),oA==="Ctrl+Shift+X"&&(T.preventDefault(),M(!1)),oA==="Ctrl+C"&&(T.preventDefault(),ni(!0)),oA==="Ctrl+Shift+C"&&(T.preventDefault(),ni(!1)),oA==="Ctrl+D"&&(T.preventDefault(),vo()),oA!=="Delete"&&oA!=="Backspace"||(T.preventDefault(),Vo()),oA==="Insert"&&(T.preventDefault(),Yn("structure")),oA==="Ctrl+A"&&(T.preventDefault(),y(sA,Ni([]))),oA==="Ctrl+Q"&&Pt(T),oA==="ArrowUp"||oA==="Shift+ArrowUp"){T.preventDefault();var pe=g(sA)?QrA(g(aA),g(mA),g(sA),YA)||g(sA):WE(g(aA),g(mA));y(sA,pe),Ai(et(pe))}if(oA==="ArrowDown"||oA==="Shift+ArrowDown"){T.preventDefault();var he=g(sA)?function(Ji,Tn,Ht){var ko=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(Ht){var Sn=ko?et(Ht):P1(Ji,Ht),no=No(Ke(Ji,Sn))?IrA(Ji,Tn,Sn,!0):Tn,gn=VN(Ji,Tn,Sn),Nt=VN(Ji,no,Sn);if(ko)return fr(Ht)?gn!==void 0?_s(gn,gn):void 0:Ua(Ht)?Nt!==void 0?_s(Nt,Nt):void 0:Nt!==void 0?_s(OC(Ht),Nt):void 0;if(Ua(Ht))return Nt!==void 0?Ni(Nt):void 0;if(fr(Ht)||an(Ht))return gn!==void 0?Ni(gn):void 0;if(kr(Ht)){if(gn===void 0||gn.length===0)return;var Zi=Fi(gn),_t=Ke(Ji,Zi);return Array.isArray(_t)?Ni(gn):o2(gn)}return Kn(Ht)?Nt!==void 0?Ni(Nt):gn!==void 0?Ni(gn):void 0:void 0}}(g(aA),g(mA),g(sA),YA)||g(sA):WE(g(aA),g(mA));y(sA,he),Ai(et(he))}if(oA==="ArrowLeft"||oA==="Shift+ArrowLeft"){T.preventDefault();var ge=g(sA)?function(Ji,Tn,Ht){var ko=arguments.length>3&&arguments[3]!==void 0&&arguments[3],Sn=!(arguments.length>4&&arguments[4]!==void 0)||arguments[4];if(Ht){var{caret:no,previous:gn}=hrA(Ji,Tn,Ht,Sn);if(ko)return Kn(Ht)?void 0:_s(Ht.path,Ht.path);if(no&&gn)return D_(gn);var Nt=Fi(et(Ht)),Zi=Ke(Ji,Nt);return an(Ht)&&Array.isArray(Zi)?_s(Ht.path,Ht.path):Kn(Ht)&&!Array.isArray(Zi)?o2(Ht.focusPath):void 0}}(g(aA),g(mA),g(sA),YA,!B())||g(sA):WE(g(aA),g(mA));y(sA,ge),Ai(et(ge))}if(oA==="ArrowRight"||oA==="Shift+ArrowRight"){T.preventDefault();var Bt=g(sA)&&g(aA)!==void 0?function(Ji,Tn,Ht){var ko=arguments.length>3&&arguments[3]!==void 0&&arguments[3],Sn=!(arguments.length>4&&arguments[4]!==void 0)||arguments[4];if(Ht){var{caret:no,next:gn}=hrA(Ji,Tn,Ht,Sn);return ko?Kn(Ht)?void 0:_s(Ht.path,Ht.path):no&&gn?D_(gn):Kn(Ht)?Ni(Ht.focusPath):void 0}}(g(aA),g(mA),g(sA),YA,!B())||g(sA):WE(g(aA),g(mA));y(sA,Bt),Ai(et(Bt))}if(oA==="Enter"&&g(sA)){if(Yy(g(sA))){var $e=g(sA).focusPath,bi=Ke(g(aA),Fi($e));Array.isArray(bi)&&(T.preventDefault(),y(sA,Ni($e)))}kr(g(sA))&&(T.preventDefault(),y(sA,fe(fe({},g(sA)),{},{edit:!0}))),an(g(sA))&&(T.preventDefault(),No(Ke(g(aA),g(sA).path))?ve(g(sA).path,!0):y(sA,fe(fe({},g(sA)),{},{edit:!0})))}if(oA.replace(/^Shift\+/,"").length===1&&g(sA))return T.preventDefault(),void me(T.key);if(oA==="Enter"&&(Ua(g(sA))||fr(g(sA))))return T.preventDefault(),void me("");if(oA==="Ctrl+Enter"&&an(g(sA))){var un=Ke(g(aA),g(sA).path);Uy(un)&&window.open(String(un),"_blank")}oA==="Escape"&&g(sA)&&(T.preventDefault(),y(sA,void 0)),oA==="Ctrl+F"&&(T.preventDefault(),ri(!1)),oA==="Ctrl+H"&&(T.preventDefault(),ri(!0)),oA==="Ctrl+Z"&&(T.preventDefault(),Wt()),oA==="Ctrl+Shift+Z"&&(T.preventDefault(),Xe())}),ce("mousedown",N,function(T){i("handleMouseDown",T);var oA=T.target;zsA(oA,"BUTTON")||oA.isContentEditable||(Ri(),g(sA)||g(aA)!==void 0||g(le)!==""&&g(le)!==void 0||(i("createDefaultSelection"),y(sA,Ni([]))))}),ce("contextmenu",N,Pt),iA(t,v),zt(e,"expand",bA),zt(e,"collapse",Be),zt(e,"validate",ZA),zt(e,"getJson",rt),zt(e,"patch",Ot),zt(e,"acceptAutoRepair",Tt),zt(e,"openTransformModal",cn),zt(e,"scrollTo",ot),zt(e,"findElement",on),zt(e,"findSearchResult",hn),zt(e,"focus",Ri),pt({expand:bA,collapse:Be,validate:ZA,getJson:rt,patch:Ot,acceptAutoRepair:Tt,openTransformModal:cn,scrollTo:ot,findElement:on,findSearchResult:hn,focus:Ri})}function UaA(t){return typeof(e=t)!="object"||e===null?t:new Proxy(t,{get:(A,i,n)=>UaA(Reflect.get(A,i,n)),set:()=>!1,deleteProperty:()=>!1});var e}var oy=Sr("jsoneditor:History");function KaA(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=t.maxItems||1e3,A=[],i=0;function n(){return i0}function r(){return{canUndo:n(),canRedo:o(),items:()=>A.slice().reverse(),add:a,undo:l,redo:I,clear:c}}function s(){t.onChange&&t.onChange(r())}function a(C){oy("add",C),A=[C].concat(A.slice(i)).slice(0,e),i=0,s()}function c(){oy("clear"),A=[],i=0,s()}function l(){if(n()){var C=A[i];return i+=1,oy("undo",C),s(),C}}function I(){if(o())return oy("redo",A[i-=1]),s(),A[i]}return{get:r}}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-transform-modal-inner.svelte-rrrjnb { - flex: 1; - display: flex; - flex-direction: column; - min-width: 0; - min-height: 0; -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) { - color: inherit; - flex: 1; - display: flex; - flex-direction: column; - padding: 0; - overflow: auto; - min-width: 0; - min-height: 0; -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-actions:where(.svelte-rrrjnb) { - display: flex; - flex-direction: row; - justify-content: flex-end; - padding-top: var(--jse-padding, 10px); -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-actions:where(.svelte-rrrjnb) button.jse-primary:where(.svelte-rrrjnb) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); - color: var(--jse-button-primary-color, #fff); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-actions:where(.svelte-rrrjnb) button.jse-primary:where(.svelte-rrrjnb):hover { - background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-actions:where(.svelte-rrrjnb) button.jse-primary:where(.svelte-rrrjnb):disabled { - background: var(--jse-button-primary-background-disabled, #9d9d9d); -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) { - flex: 1; - display: flex; - gap: calc(2 * var(--jse-padding, 10px)); - min-height: 0; - box-sizing: border-box; - padding: 0 calc(2 * var(--jse-padding, 10px)) var(--jse-padding, 10px); -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-query-contents:where(.svelte-rrrjnb) { - flex: 1; - display: flex; - flex-direction: column; -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-query-contents:where(.svelte-rrrjnb) .jse-description:where(.svelte-rrrjnb) p { - margin: var(--jse-padding, 10px) 0; -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-query-contents:where(.svelte-rrrjnb) .jse-description:where(.svelte-rrrjnb) p:first-child { - margin-top: 0; -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-query-contents:where(.svelte-rrrjnb) .jse-description:where(.svelte-rrrjnb) p:last-child { - margin-bottom: 0; -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-query-contents:where(.svelte-rrrjnb) .jse-description:where(.svelte-rrrjnb) code { - background: var(--jse-modal-code-background, rgba(0, 0, 0, 0.05)); - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-query-contents:where(.svelte-rrrjnb) .query-error:where(.svelte-rrrjnb) { - color: var(--jse-error-color, #ee5341); -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-query-contents:where(.svelte-rrrjnb) textarea.jse-query:where(.svelte-rrrjnb) { - flex: 1; - outline: none; - resize: vertical; -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-data-contents:where(.svelte-rrrjnb) { - flex: 1; - display: flex; - flex-direction: column; - gap: calc(2 * var(--jse-padding, 10px)); -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-data-contents:where(.svelte-rrrjnb) .jse-original-data:where(.svelte-rrrjnb) { - flex: 1; - display: flex; - flex-direction: column; - min-height: 0; - box-sizing: border-box; -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-data-contents:where(.svelte-rrrjnb) .jse-original-data.jse-hide:where(.svelte-rrrjnb) { - flex: none; -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-data-contents:where(.svelte-rrrjnb) .jse-preview-data:where(.svelte-rrrjnb) { - flex: 1; - display: flex; - flex-direction: column; - min-height: 0; - box-sizing: border-box; -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-data-contents.jse-hide-original-data:where(.svelte-rrrjnb) { - flex-direction: column; - gap: 0; - margin-bottom: 0; -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-actions:where(.svelte-rrrjnb) { - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)) calc(2 * var(--jse-padding, 10px)); -} -@media screen and (max-width: 1200px) { - .jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) { - flex-direction: column; - overflow: auto; - } - .jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-query-contents:where(.svelte-rrrjnb) textarea.jse-query:where(.svelte-rrrjnb) { - min-height: 150px; - flex: none; - } - .jse-transform-modal-inner.svelte-rrrjnb .jse-modal-contents:where(.svelte-rrrjnb) .jse-main-contents:where(.svelte-rrrjnb) .jse-data-contents:where(.svelte-rrrjnb) .jse-tree-mode { - height: 300px; - flex: none; - } -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-label:where(.svelte-rrrjnb) { - font-weight: bold; - display: block; - box-sizing: border-box; -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-label:where(.svelte-rrrjnb) .jse-label-inner:where(.svelte-rrrjnb) { - margin-top: calc(2 * var(--jse-padding, 10px)); - margin-bottom: calc(0.5 * var(--jse-padding, 10px)); - box-sizing: border-box; -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-label:where(.svelte-rrrjnb) .jse-label-inner:where(.svelte-rrrjnb) button:where(.svelte-rrrjnb) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - font-weight: bold; - padding: 0; -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-tree-mode { - flex: 1; - background: var(--jse-input-background-readonly, transparent); - box-shadow: none; - box-sizing: border-box; - --jse-main-border: var(--jse-input-border, 1px solid #d8dbdf); -} -.jse-transform-modal-inner.svelte-rrrjnb input:where(.svelte-rrrjnb), -.jse-transform-modal-inner.svelte-rrrjnb textarea:where(.svelte-rrrjnb) { - border: var(--jse-input-border, 1px solid #d8dbdf); - outline: none; - box-sizing: border-box; - padding: calc(0.5 * var(--jse-padding, 10px)); - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - color: inherit; - background: var(--jse-input-background, var(--jse-background-color, #fff)); -} -.jse-transform-modal-inner.svelte-rrrjnb input:where(.svelte-rrrjnb):focus, -.jse-transform-modal-inner.svelte-rrrjnb textarea:where(.svelte-rrrjnb):focus { - border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); -} -.jse-transform-modal-inner.svelte-rrrjnb input:where(.svelte-rrrjnb):read-only, -.jse-transform-modal-inner.svelte-rrrjnb textarea:where(.svelte-rrrjnb):read-only { - background: var(--jse-input-background-readonly, transparent); -} -.jse-transform-modal-inner.svelte-rrrjnb .jse-preview.jse-error:where(.svelte-rrrjnb) { - flex: 1; - background: var(--jse-input-background-readonly, transparent); - border: var(--jse-input-border, 1px solid #d8dbdf); - color: var(--jse-error-color, #ee5341); - padding: calc(0.5 * var(--jse-padding, 10px)); -} -.jse-transform-modal-inner.svelte-rrrjnb a { - color: var(--jse-a-color, #156fc5); -} -.jse-transform-modal-inner.svelte-rrrjnb a:hover { - color: var(--jse-a-color-highlight, #0f508d); -}`);var L3=Gy(()=>xUA),$E=Gy(()=>LUA),SJA=wA('
        '),RJA=wA(" ",1),xJA=wA('
        '),LJA=wA('
        Language
        Path
        Query
        Preview
        ',1),FJA=wA('
        ');function NJA(t,e){var A,i,n;mt(e,!1);var o=Sr("jsoneditor:TransformModal"),r=b(e,"id",25,()=>"transform-modal-"+nQ()),s=b(e,"json",9),a=b(e,"rootPath",25,()=>[]),c=b(e,"indentation",9),l=b(e,"truncateTextSize",9),I=b(e,"escapeControlCharacters",9),C=b(e,"escapeUnicodeCharacters",9),d=b(e,"parser",9),B=b(e,"parseMemoizeOne",9),E=b(e,"validationParser",9),h=b(e,"pathParser",9),u=b(e,"queryLanguages",9),D=b(e,"queryLanguageId",13),L=b(e,"onChangeQueryLanguage",9),R=b(e,"onRenderValue",9),w=b(e,"onRenderMenu",9),_=b(e,"onRenderContextMenu",9),K=b(e,"onClassName",9),z=b(e,"onTransform",9),U=b(e,"onClose",9),H=$(void 0,!0),q=$(KaA({onChange:mA=>y(q,mA)}).get(),!0),j=$(void 0,!0),gA=$(void 0,!0),QA=$(!1,!0),BA="".concat(r(),":").concat(Ct(a())),lA=(A=L3()[BA])!==null&&A!==void 0?A:{},vA=$($E().showWizard!==!1,!0),tA=$($E().showOriginal!==!1,!0),cA=$((i=lA.queryOptions)!==null&&i!==void 0?i:{},!0),pA=$(D()===lA.queryLanguageId&&lA.query?lA.query:"",!0),VA=$((n=lA.isManual)!==null&&n!==void 0&&n,!0),oe=$(void 0,!0),KA=$(void 0,!0),CA=$({text:""},!0);function TA(mA){var sA;return(sA=u().find(xt=>xt.id===mA))!==null&&sA!==void 0?sA:u()[0]}function Ze(mA){try{y(cA,mA),y(pA,TA(D()).createQuery(g(j),mA)),y(oe,void 0),y(VA,!1),o("updateQueryByWizard",{queryOptions:g(cA),query:g(pA),isManual:g(VA)})}catch(sA){y(oe,String(sA))}}function He(mA){y(pA,mA.target.value),y(VA,!0),o("handleChangeQuery",{query:g(pA),isManual:g(VA)})}g(VA)||Ze(g(cA)),hs(()=>{var mA;(mA=g(H))===null||mA===void 0||mA.focus()});var uA=oE(function(mA,sA){if(mA===void 0)return y(CA,{text:""}),void y(KA,"Error: No JSON");if(sA.trim()!=="")try{o("previewTransform",{query:sA});var xt=TA(D()).executeQuery(mA,sA,d());y(CA,{json:xt}),y(KA,void 0)}catch(tt){y(CA,{text:""}),y(KA,String(tt))}else y(CA,{json:mA})},300);function eA(){if(g(j)===void 0)return y(CA,{text:""}),void y(KA,"Error: No JSON");try{o("handleTransform",{query:g(pA)});var mA=TA(D()).executeQuery(g(j),g(pA),d());z()([{op:"replace",path:Ct(a()),value:mA}]),U()()}catch(sA){console.error(sA),y(CA,{text:""}),y(KA,String(sA))}}function UA(){y(vA,!g(vA)),$E($E().showWizard=g(vA))}function aA(){y(tA,!g(tA)),$E($E().showOriginal=g(tA))}function le(mA){mA.focus()}function SA(mA){o("handleChangeQueryLanguage",mA),D(mA),L()(mA),Ze(g(cA))}function Ue(){g(QA)?y(QA,!g(QA)):U()()}fA(()=>(k(s()),k(a())),()=>{y(j,UaA(Ke(s(),a())))}),fA(()=>g(j),()=>{y(gA,g(j)?{json:g(j)}:{text:""})}),fA(()=>(g(j),g(pA)),()=>{uA(g(j),g(pA))}),fA(()=>(L3(),g(cA),g(pA),k(D()),g(VA)),()=>{L3(L3()[BA]={queryOptions:g(cA),query:g(pA),queryLanguageId:D(),isManual:g(VA)}),o("store state in memory",BA,L3()[BA])}),Qn(),Zt(!0),X3(t,{get onClose(){return U()},className:"jse-transform-modal",get fullscreen(){return g(QA)},children:(mA,sA)=>{var xt=FJA();f_(W(xt),{children:(tt,de)=>{var Dt=LJA(),_e=vt(Dt);(function(M,We){mt(We,!1);var ni,pi=b(We,"queryLanguages",9),dn=b(We,"queryLanguageId",9),mn=b(We,"fullscreen",13),Uo=b(We,"onChangeQueryLanguage",9),kn=b(We,"onClose",9),Wn=$(void 0,!0),{openAbsolutePopup:Vo,closeAbsolutePopup:vo}=$1("absolute-popup");function bo(){var Yn={queryLanguages:pi(),queryLanguageId:dn(),onChangeQueryLanguage:Mo=>{vo(ni),Uo()(Mo)}};ni=Vo(MKA,Yn,{offsetTop:-2,offsetLeft:0,anchor:g(Wn),closeOnOuterClick:!0})}Zt(!0),My(M,{title:"Transform",fullScreenButton:!0,get onClose(){return kn()},get fullscreen(){return mn()},set fullscreen(Yn){mn(Yn)},$$slots:{actions:(Yn,Mo)=>{var ne,wi=RKA();ji(W(wi),{get data(){return HW}}),Co(wi,MA=>y(Wn,MA),()=>g(Wn)),De(MA=>ne=Vt(wi,1,"jse-config svelte-1kpylsp",null,ne,MA),[()=>({hide:pi().length<=1})],qA),ce("click",wi,bo),iA(Yn,wi)}},$$legacy:!0}),pt()})(_e,{get queryLanguages(){return u()},get queryLanguageId(){return D()},onChangeQueryLanguage:SA,get onClose(){return U()},get fullscreen(){return g(QA)},set fullscreen(M){y(QA,M)},$$legacy:!0});var Le=W(IA(_e,2)),bt=W(Le),Re=IA(W(bt),2);bsA(W(Re),()=>(k(D()),nA(()=>TA(D()).description)));var $t=IA(Re,4),x=IA($t,2),Y=W(x),P=W(Y),X=W(P),bA=qA(()=>g(vA)?mg:sE);ji(X,{get data(){return g(bA)}});var Be=IA(x,2),Ee=M=>{var We=_o(),ni=vt(We),pi=mn=>{var Uo=RJA(),kn=vt(Uo);yKA(kn,{get queryOptions(){return g(cA)},get json(){return g(j)},onChange:Ze});var Wn=IA(kn,2),Vo=vo=>{var bo=SJA(),Yn=W(bo);De(()=>wt(Yn,g(oe))),iA(vo,bo)};LA(Wn,vo=>{g(oe)&&vo(Vo)}),iA(mn,Uo)},dn=mn=>{iA(mn,Tr("(Only available for arrays, not for objects)"))};LA(ni,mn=>{g(j),nA(()=>Array.isArray(g(j)))?mn(pi):mn(dn,!1)}),iA(M,We)};LA(Be,M=>{g(vA)&&M(Ee)});var kA=IA(Be,4);Co(kA,M=>y(H,M),()=>g(H));var DA,gt,Ve=IA(bt,2),ZA=W(Ve),rt=W(ZA),Ei=W(rt),tn=W(Ei),qi=W(tn),xe=qA(()=>g(tA)?mg:sE);ji(qi,{get data(){return g(xe)}});var nn=IA(rt,2),mi=M=>{U_(M,{get externalContent(){return g(gA)},externalSelection:void 0,get history(){return g(q)},readOnly:!0,get truncateTextSize(){return l()},mainMenuBar:!1,navigationBar:!1,get indentation(){return c()},get escapeControlCharacters(){return I()},get escapeUnicodeCharacters(){return C()},get parser(){return d()},get parseMemoizeOne(){return B()},get onRenderValue(){return R()},get onRenderMenu(){return w()},get onRenderContextMenu(){return _()},onError:nA(()=>console.error),get onChange(){return $o},get onChangeMode(){return $o},get onSelect(){return $o},get onUndo(){return $o},get onRedo(){return $o},get onFocus(){return $o},get onBlur(){return $o},get onSortModal(){return $o},get onTransformModal(){return $o},get onJSONEditorModal(){return $o},get onClassName(){return K()},validator:void 0,get validationParser(){return E()},get pathParser(){return h()}})};LA(nn,M=>{g(tA)&&M(mi)});var Ot=IA(ZA,2),Lt=IA(W(Ot),2),ii=M=>{U_(M,{get externalContent(){return g(CA)},externalSelection:void 0,get history(){return g(q)},readOnly:!0,get truncateTextSize(){return l()},mainMenuBar:!1,navigationBar:!1,get indentation(){return c()},get escapeControlCharacters(){return I()},get escapeUnicodeCharacters(){return C()},get parser(){return d()},get parseMemoizeOne(){return B()},get onRenderValue(){return R()},get onRenderMenu(){return w()},get onRenderContextMenu(){return _()},onError:nA(()=>console.error),get onChange(){return $o},get onChangeMode(){return $o},get onSelect(){return $o},get onUndo(){return $o},get onRedo(){return $o},get onFocus(){return $o},get onBlur(){return $o},get onSortModal(){return $o},get onTransformModal(){return $o},get onJSONEditorModal(){return $o},get onClassName(){return K()},validator:void 0,get validationParser(){return E()},get pathParser(){return h()}})},_i=M=>{var We=xJA(),ni=W(We);De(()=>wt(ni,g(KA))),iA(M,We)};LA(Lt,M=>{g(KA)?M(_i,!1):M(ii)});var Tt=W(IA(Le,2));es(()=>ce("click",Tt,eA)),Us(Tt,M=>le?.(M)),De((M,We,ni)=>{VC($t,M),VC(kA,g(pA)),DA=Vt(Ve,1,"jse-data-contents svelte-rrrjnb",null,DA,We),gt=Vt(ZA,1,"jse-original-data svelte-rrrjnb",null,gt,ni),Tt.disabled=!!g(KA)},[()=>(k(Oi),k(a()),k(Ka),nA(()=>Oi(a())?"(document root)":Ka(a()))),()=>({"jse-hide-original-data":!g(tA)}),()=>({"jse-hide":!g(tA)})],qA),ce("click",P,UA),ce("input",kA,He),ce("click",tn,aA),iA(tt,Dt)},$$slots:{default:!0}}),Us(xt,(tt,de)=>ky?.(tt,de),()=>Ue),iA(mA,xt)},$$slots:{default:!0}}),pt()}function Oc(){}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-status-bar.svelte-1ulj7zd { - background: var(--jse-panel-background, #ebebeb); - color: var(--jse-panel-color-readonly, #b2b2b2); - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - margin: 0; - border-top: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); - display: flex; - gap: var(--jse-padding, 10px); -} -.jse-status-bar.svelte-1ulj7zd:last-child { - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-status-bar.svelte-1ulj7zd .jse-status-bar-info:where(.svelte-1ulj7zd) { - padding: 2px; -}`);var _JA=wA('
        '),GJA=wA('
        '),UJA=wA('
        '),KJA=wA('
        '),EG=TE.define([{tag:Se.propertyName,color:"var(--internal-key-color)"},{tag:Se.number,color:"var(--internal-value-color-number)"},{tag:Se.bool,color:"var(--internal-value-color-boolean)"},{tag:Se.string,color:"var(--internal-value-color-string)"},{tag:Se.keyword,color:"var(--internal-value-color-null)"}]),YJA=HF(EG),JJA=EG.style;EG.style=t=>JJA(t||[]);var TJA=[go.fromClass(class{constructor(t){this.view=t,this.indentUnit=Ml(t.state),this.initialPaddingLeft=null,this.isChrome=window?.navigator.userAgent.includes("Chrome"),this.generate(t.state)}update(t){var e=Ml(t.state);(e!==this.indentUnit||t.docChanged||t.viewportChanged)&&(this.indentUnit=e,this.generate(t.state))}generate(t){var e=new ds;this.initialPaddingLeft?this.addStyleToBuilder(e,t,this.initialPaddingLeft):this.view.requestMeasure({read:A=>{var i=A.contentDOM.querySelector(".cm-line");i&&(this.initialPaddingLeft=window.getComputedStyle(i).getPropertyValue("padding-left"),this.addStyleToBuilder(e,A.state,this.initialPaddingLeft)),this.decorations=e.finish()}}),this.decorations=e.finish()}addStyleToBuilder(t,e,A){var i=this.getVisibleLines(e);for(var n of i){var{numColumns:o,containsTab:r}=this.numColumns(n.text,e.tabSize),s="calc(".concat(o+this.indentUnit,"ch + ").concat(A,")"),a=this.isChrome?"calc(-".concat(o+this.indentUnit,"ch - ").concat(r?1:0,"px)"):"-".concat(o+this.indentUnit,"ch");t.add(n.from,n.from,ut.line({attributes:{style:"padding-left: ".concat(s,"; text-indent: ").concat(a,";")}}))}}getVisibleLines(t){var e=new Set,A=null;for(var{from:i,to:n}of this.view.visibleRanges)for(var o=i;o<=n;){var r=t.doc.lineAt(o);A!==r&&(e.add(r),A=r),o=r.to+1}return e}numColumns(t,e){var A=0,i=!1;A:for(var n=0;nt.decorations})];Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-text-mode.svelte-xt61xw { - --internal-key-color: var(--jse-key-color, #1a1a1a); - --internal-value-color-number: var(--jse-value-color-number, #ee422e); - --internal-value-color-boolean: var(--jse-value-color-boolean, #ff8c00); - --internal-value-color-string: var(--jse-value-color-string, #008000); - --internal-value-color-null: var(--jse-value-color-null, #004ed0); - flex: 1; - box-sizing: border-box; - display: flex; - flex-direction: column; - background: var(--jse-background-color, #fff); -} -.jse-text-mode.no-main-menu.svelte-xt61xw { - border-top: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) { - flex: 1; - display: flex; - position: relative; - flex-direction: column; - overflow: hidden; - min-width: 0; - min-height: 0; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw):last-child { - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-text-mode.svelte-xt61xw .jse-contents.jse-hidden:where(.svelte-xt61xw) { - visibility: hidden; - position: absolute; - top: 0; - left: 0; -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor { - flex: 1; - overflow: hidden; -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-scroller { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - line-height: var(--jse-line-height, calc(1em + 4px)); - color: var(--jse-delimiter-color, rgba(0, 0, 0, 0.38)); -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-gutters { - background: var(--jse-panel-background, #ebebeb); - color: var(--jse-panel-color-readonly, #b2b2b2); - border-right: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-activeLine, -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-activeLineGutter { - background: var(--jse-active-line-background-color, rgba(0, 0, 0, 0.06)); -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-selectionBackground { - background: var(--jse-selection-background-color, #d3d3d3); -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-searchMatch { - background-color: var(--jse-search-match-color, #ffe665); - outline: var(--jse-search-match-outline, none); -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-searchMatch.cm-searchMatch-selected { - background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); - outline: var(--jse-search-match-outline, 2px solid #e0be00); -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-selectionMatch { - background-color: var(--jse-search-match-background-color, rgba(153, 255, 119, 0.5019607843)); -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-foldPlaceholder { - background: var(--jse-tag-background, rgba(0, 0, 0, 0.2)); - color: var(--jse-tag-color, var(--jse-text-color-inverse, #fff)); - border: none; - padding: 0 var(--jse-padding, 10px); -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-tooltip { - font-size: var(--jse-font-size, 16px); - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - color: var(--jse-tooltip-color, var(--jse-text-color, #4d4d4d)); - background: var(--jse-tooltip-background, var(--jse-modal-background, #f5f5f5)); - border: var(--jse-tooltip-border, var(--jse-main-border, 1px solid #d7d7d7)); -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-diagnosticAction { - background: var(--jse-tooltip-action-button-color, var(--jse-text-color-inverse, #fff)); - background: var(--jse-tooltip-action-button-background, #4d4d4d); -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-panels { - border-bottom: var(--jse-panel-border, var(--jse-main-border, 1px solid #d7d7d7)); -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-search { - background: var(--jse-panel-background, #ebebeb); - color: var(--jse-panel-color, var(--jse-text-color, #4d4d4d)); - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-search input { - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size-text-mode-search, 80%); - color: var(--jse-input-color, var(--jse-text-color, #4d4d4d)); - border: var(--jse-input-border, 1px solid #d8dbdf); - background: var(--jse-input-background, var(--jse-background-color, #fff)); - margin-right: 2px; -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-search button { - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size-text-mode-search, 80%); - color: var(--jse-panel-button-color, inherit); - background: var(--jse-panel-button-background, transparent); - border: none; - cursor: pointer; - text-transform: capitalize; - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px); - margin: 0; -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-search button:hover { - color: var(--panel-button-color-highlight, var(--jse-text-color, #4d4d4d)); - background: var(--jse-panel-button-background-highlight, #e0e0e0); -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-search label { - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size-text-mode-search, 80%); - padding-left: var(--jse-padding, 10px); -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-search label input { - margin-right: 2px; -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-search button[name="close"] { - width: 32px; - height: 32px; - font-size: 24px; - line-height: 24px; - padding: 0; - right: 0; - top: -4px; -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .cm-editor .cm-cursor-primary { - border-color: var(--jse-text-color, #4d4d4d); -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .jse-loading-space:where(.svelte-xt61xw) { - flex: 1; -} -.jse-text-mode.svelte-xt61xw .jse-contents:where(.svelte-xt61xw) .jse-loading:where(.svelte-xt61xw) { - flex: 2; - text-align: center; - color: var(--jse-panel-color-readonly, #b2b2b2); - box-sizing: border-box; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); -} -.jse-text-mode.svelte-xt61xw .jse-contents.jse-preview:where(.svelte-xt61xw) { - flex: 1; - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - color: var(--jse-panel-color-readonly, #b2b2b2); - overflow: auto; - white-space: pre-wrap; - word-break: break-word; - padding: 2px; -}`);var HJA=wA('
        ',1),zJA=wA(" ",1),OJA=wA("
        ",1),PJA=wA('
        loading...
        '),jJA=wA("
        ");function qJA(t,e){mt(e,!1);var A=$(void 0,!0),i=$(void 0,!0),n=b(e,"readOnly",9),o=b(e,"mainMenuBar",9),r=b(e,"statusBar",9),s=b(e,"askToFormat",9),a=b(e,"externalContent",9),c=b(e,"externalSelection",9),l=b(e,"history",9),I=b(e,"indentation",9),C=b(e,"tabSize",9),d=b(e,"escapeUnicodeCharacters",9),B=b(e,"parser",9),E=b(e,"validator",9),h=b(e,"validationParser",9),u=b(e,"onChange",9),D=b(e,"onChangeMode",9),L=b(e,"onSelect",9),R=b(e,"onUndo",9),w=b(e,"onRedo",9),_=b(e,"onError",9),K=b(e,"onFocus",9),z=b(e,"onBlur",9),U=b(e,"onRenderMenu",9),H=b(e,"onSortModal",9),q=b(e,"onTransformModal",9),j=Sr("jsoneditor:TextMode"),gA={key:"Mod-i",run:de,shift:Dt,preventDefault:!0},QA=typeof window>"u";j("isSSR:",QA);var BA,lA=$(void 0,!0),vA=$(void 0,!0),tA=$(void 0,!0),cA=$(!1,!0),pA=$(s(),!0),VA=$([],!0),oe=new bg,KA=new bg,CA=new bg,TA=new bg,Ze=new bg,He=a(),uA=$(u_(He,I(),B()),!0),eA=xa.define(),UA=null;function aA(){if(!UA||UA.length===0)return!1;var MA=UA[0].startState,me=UA[UA.length-1].state,nt=UA.map(Xe=>Xe.changes).reduce((Xe,oi)=>Xe.compose(oi)),Wt={type:"text",undo:{changes:nt.invert(MA.doc).toJSON(),selection:M(MA.selection)},redo:{changes:nt.toJSON(),selection:M(me.selection)}};return j("add history item",Wt),l().add(Wt),UA=null,!0}var le=$(d(),!0);hs(Yt(function*(){if(!QA)try{BA=function(MA){var{target:me,initialText:nt,readOnly:Wt,indentation:Xe}=MA;j("Create CodeMirror editor",{readOnly:Wt,indentation:Xe});var oi=function(Ut,cn){return WN(Ut)?Ut.ranges.every(ft=>ft.anchor{y(tA,Ut.state),Ut.docChanged&&(Ut.transactions.some(cn=>!!cn.annotation(eA))||(UA=[...UA??[],Ut]),Lt()),Ut.selectionSet&&Tt()}),ZnA(),noA({top:!0}),qt.lineWrapping,KA.of(hr.readOnly.of(Wt)),TA.of(hr.tabSize.of(C())),CA.of(Ot(Xe)),Ze.of(qt.theme({},{dark:gt()}))]});return BA=new qt({state:Di,parent:me}),oi&&BA.dispatch(BA.state.update({selection:oi.main,scrollIntoView:!0})),BA}({target:g(lA),initialText:We(g(uA),g(cA))?"":g(A).escapeValue(g(uA)),readOnly:n(),indentation:I()})}catch(MA){console.error(MA)}})),qc(()=>{ii(),BA&&(j("Destroy CodeMirror editor"),BA.destroy())});var SA=c1(),Ue=c1();function mA(){BA&&(j("focus"),BA.focus())}var sA=!1;function xt(MA){return tt(MA,!1)}function tt(MA,me){j("handlePatch",MA,me);var nt=B().parse(g(uA)),Wt=Da(nt,MA),Xe=R8(nt,MA);return Ei({text:B().stringify(Wt,null,I())},me,!1),{json:Wt,previousJson:nt,undo:Xe,redo:MA}}function de(){if(j("format"),n())return!1;try{var MA=B().parse(g(uA));return Ei({text:B().stringify(MA,null,I())},!0,!1),y(pA,s()),!0}catch(me){_()(me)}return!1}function Dt(){if(j("compact"),n())return!1;try{var MA=B().parse(g(uA));return Ei({text:B().stringify(MA)},!0,!1),y(pA,!1),!0}catch(me){_()(me)}return!1}function _e(){if(j("repair"),!n())try{Ei({text:Rc(g(uA))},!0,!1),y(ni,qN),y(pi,void 0)}catch(MA){_()(MA)}}function Le(){var MA;if(!n())try{var me=B().parse(g(uA));sA=!0,H()({id:SA,json:me,rootPath:[],onSort:(MA=Yt(function*(nt){var{operations:Wt}=nt;j("onSort",Wt),tt(Wt,!0)}),function(nt){return MA.apply(this,arguments)}),onClose:()=>{sA=!1,mA()}})}catch(nt){_()(nt)}}function bt(MA){var{id:me,rootPath:nt,onTransform:Wt,onClose:Xe}=MA;try{var oi=B().parse(g(uA));sA=!0,q()({id:me||Ue,json:oi,rootPath:nt||[],onTransform:Di=>{Wt?Wt({operations:Di,json:oi,transformedJson:Da(oi,Di)}):(j("onTransform",Di),tt(Di,!0))},onClose:()=>{sA=!1,mA(),Xe&&Xe()}})}catch(Di){_()(Di)}}function Re(){n()||bt({rootPath:[]})}function $t(){BA&&(g(lA)&&g(lA).querySelector(".cm-search")?_D(BA):ND(BA))}function x(){if(n())return!1;ii();var MA=l().undo();return j("undo",MA),lrA(MA)?(BA.dispatch({annotations:eA.of("undo"),changes:Cs.fromJSON(MA.undo.changes),selection:ae.fromJSON(MA.undo.selection),scrollIntoView:!0}),!0):(R()(MA),!1)}function Y(){if(n())return!1;ii();var MA=l().redo();return j("redo",MA),lrA(MA)?(BA.dispatch({annotations:eA.of("redo"),changes:Cs.fromJSON(MA.redo.changes),selection:ae.fromJSON(MA.redo.selection),scrollIntoView:!0}),!0):(w()(MA),!1)}function P(){y(cA,!0),Ei(a(),!0,!0)}function X(){D()(er.tree)}function bA(){nn()}function Be(MA){j("select validation error",MA);var{from:me,to:nt}=Ve(MA);me!==void 0&&nt!==void 0&&(Ee(me,nt),mA())}function Ee(MA,me){j("setSelection",{anchor:MA,head:me}),BA&&BA.dispatch(BA.state.update({selection:{anchor:MA,head:me},scrollIntoView:!0}))}function kA(MA,me){if(me.state.selection.ranges.length===1){var nt=me.state.selection.ranges[0],Wt=g(uA).slice(nt.from,nt.to);if(Wt==="{"||Wt==="["){var Xe=s_.default.parse(g(uA)),oi=Object.keys(Xe.pointers).find(Ut=>{var cn;return((cn=Xe.pointers[Ut].value)===null||cn===void 0?void 0:cn.pos)===nt.from}),Di=Xe.pointers[oi];oi&&Di&&Di.value&&Di.valueEnd&&(j("pointer found, selecting inner contents of path:",oi,Di),Ee(Di.value.pos+1,Di.valueEnd.pos-1))}}}function DA(){return _nA(dn,{delay:300})}function gt(){return!!g(lA)&&getComputedStyle(g(lA)).getPropertyValue("--jse-theme").includes("dark")}function Ve(MA){var{path:me,message:nt,severity:Wt}=MA,{line:Xe,column:oi,from:Di,to:Ut}=function(cn,ft){try{var Qi=s_.default.parse(cn),ot=Ct(ft),Mt=Qi.pointers[ot];if(Mt)return{path:ft,line:Mt.key?Mt.key.line:Mt.value?Mt.value.line:0,column:Mt.key?Mt.key.column:Mt.value?Mt.value.column:0,from:Mt.key?Mt.key.pos:Mt.value?Mt.value.pos:0,to:Mt.keyEnd?Mt.keyEnd.pos:Mt.valueEnd?Mt.valueEnd.pos:0}}catch(on){console.error(on)}return{path:ft,line:0,column:0,from:0,to:0}}(g(A).escapeValue(g(uA)),me);return{path:me,line:Xe,column:oi,from:Di,to:Ut,message:nt,severity:Wt,actions:[]}}function ZA(MA,me){var{line:nt,column:Wt,position:Xe,message:oi}=MA;return{path:[],line:nt,column:Wt,from:Xe,to:Xe,severity:Fl.error,message:oi,actions:me&&!n()?[{name:"Auto repair",apply:()=>_e()}]:void 0}}function rt(MA){return{from:MA.from||0,to:MA.to||0,message:MA.message||"",actions:MA.actions,severity:MA.severity}}function Ei(MA,me,nt){var Wt=u_(MA,I(),B()),Xe=!di(MA,He),oi=He;j("setCodeMirrorContent",{isChanged:Xe,emitChange:me,forceUpdate:nt}),BA&&(Xe||nt)&&(He=MA,y(uA,Wt),We(g(uA),g(cA))||BA.dispatch({changes:{from:0,to:BA.state.doc.length,insert:g(A).escapeValue(g(uA))}}),aA(),Xe&&me&&_i(He,oi))}function tn(MA){return WN(MA)?ae.fromJSON(MA):void 0}function qi(){return xe.apply(this,arguments)}function xe(){return xe=Yt(function*(){j("refresh"),yield function(){return mi.apply(this,arguments)}()}),xe.apply(this,arguments)}function nn(){if(BA){var MA=BA?g(A).unescapeValue(BA.state.doc.toString()):"",me=MA!==g(uA);if(j("onChangeCodeMirrorValue",{isChanged:me}),me){var nt=He;y(uA,MA),He={text:g(uA)},aA(),_i(He,nt),io(),Tt()}}}function mi(){return(mi=Yt(function*(){if(io(),BA){var MA=gt();return j("updateTheme",{dark:MA}),BA.dispatch({effects:[Ze.reconfigure(qt.theme({},{dark:MA}))]}),new Promise(me=>setTimeout(me))}return Promise.resolve()})).apply(this,arguments)}function Ot(MA){var me=FC.of(typeof MA=="number"?" ".repeat(MA):MA);return MA===" "?[me]:[me,TJA]}CG({onMount:hs,onDestroy:qc,getWindow:()=>af(g(vA)),hasFocus:()=>sA&&document.hasFocus()||W_(g(vA)),onFocus:K(),onBlur:()=>{ii(),z()()}});var Lt=oE(nn,300);function ii(){Lt.flush()}function _i(MA,me){u()&&u()(MA,me,{contentErrors:mn(),patchResult:void 0})}function Tt(){L()(M(g(tA).selection))}function M(MA){return fe({type:Ln.text},MA.toJSON())}function We(MA,me){return!!MA&&MA.length>PN&&!me}var ni=$(qN,!0),pi=$(void 0,!0);function dn(){if(We(g(uA),g(cA)))return[];var MA=mn();if(crA(MA)){var{parseError:me,isRepairable:nt}=MA;return[rt(ZA(me,nt))]}return lUA(MA)?MA.validationErrors.map(Ve).map(rt):[]}function mn(){j("validate:start"),ii();var MA=Uo(g(A).escapeValue(g(uA)),E(),B(),h());return crA(MA)?(y(ni,MA.isRepairable?nrA:"invalid"),y(pi,MA.parseError),y(VA,[])):(y(ni,qN),y(pi,void 0),y(VA,MA?.validationErrors||[])),j("validate:end"),MA}var Uo=aE(FKA);function kn(){g(pi)&&function(MA){j("select parse error",MA);var me=ZA(MA,!1);Ee(me.from!=null?me.from:0,me.to!=null?me.to:0),mA()}(g(pi))}var Wn={icon:JW,text:"Show me",title:"Move to the parse error location",onClick:kn};fA(()=>k(d()),()=>{y(A,V_({escapeControlCharacters:!1,escapeUnicodeCharacters:d()}))}),fA(()=>k(a()),()=>{Ei(a(),!1,!1)}),fA(()=>k(c()),()=>{(function(MA){if(WN(MA)){var me=tn(MA);!BA||!me||g(tA)&&g(tA).selection.eq(me)||(j("applyExternalSelection",me),BA.dispatch({selection:me}))}})(c())}),fA(()=>k(E()),()=>{(function(MA){j("updateLinter",MA),BA&&BA.dispatch({effects:oe.reconfigure(DA())})})(E())}),fA(()=>k(I()),()=>{(function(MA){BA&&(j("updateIndentation",MA),BA.dispatch({effects:CA.reconfigure(Ot(MA))}))})(I())}),fA(()=>k(C()),()=>{(function(MA){BA&&(j("updateTabSize",MA),BA.dispatch({effects:TA.reconfigure(hr.tabSize.of(MA))}))})(C())}),fA(()=>k(n()),()=>{(function(MA){BA&&(j("updateReadOnly",MA),BA.dispatch({effects:[KA.reconfigure(hr.readOnly.of(MA))]}))})(n())}),fA(()=>(g(le),k(d())),()=>{g(le)!==d()&&(y(le,d()),j("forceUpdateText",{escapeUnicodeCharacters:d()}),BA&&BA.dispatch({changes:{from:0,to:BA.state.doc.length,insert:g(A).escapeValue(g(uA))}}))}),fA(()=>(g(ni),k(n()),L0),()=>{y(i,g(ni)!==nrA||n()?[Wn]:[{icon:L0,text:"Auto repair",title:"Automatically repair JSON",onClick:_e},Wn])}),Qn(),Zt(!0);var Vo,vo=jJA(),bo=W(vo),Yn=MA=>{var me=qA(()=>(g(uA),nA(()=>g(uA).length===0))),nt=qA(()=>!g(me)),Wt=qA(()=>!g(me)),Xe=qA(()=>!g(me)),oi=qA(()=>!g(me));(function(Di,Ut){mt(Ut,!1);var cn=$(void 0,!0),ft=b(Ut,"readOnly",9,!1),Qi=b(Ut,"onFormat",9),ot=b(Ut,"onCompact",9),Mt=b(Ut,"onSort",9),on=b(Ut,"onTransform",9),hn=b(Ut,"onToggleSearch",9),Ai=b(Ut,"onUndo",9),Ki=b(Ut,"onRedo",9),dt=b(Ut,"canUndo",9),EA=b(Ut,"canRedo",9),HA=b(Ut,"canFormat",9),ve=b(Ut,"canCompact",9),Qt=b(Ut,"canSort",9),yi=b(Ut,"canTransform",9),ri=b(Ut,"onRenderMenu",9),pn={type:"button",icon:g4,title:"Search (Ctrl+F)",className:"jse-search",onClick:hn()},Fn=$(void 0,!0);fA(()=>(k(ft()),k(Qi()),k(HA()),k(ot()),k(ve()),k(Mt()),k(Qt()),k(on()),k(yi()),k(Ai()),k(dt()),k(Ki()),k(EA())),()=>{y(Fn,ft()?[pn,{type:"space"}]:[{type:"button",icon:YrA,title:"Format JSON: add proper indentation and new lines (Ctrl+I)",className:"jse-format",onClick:Qi(),disabled:ft()||!HA()},{type:"button",icon:UYA,title:"Compact JSON: remove all white spacing and new lines (Ctrl+Shift+I)",className:"jse-compact",onClick:ot(),disabled:ft()||!ve()},{type:"separator"},{type:"button",icon:l4,title:"Sort",className:"jse-sort",onClick:Mt(),disabled:ft()||!Qt()},{type:"button",icon:s4,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:on(),disabled:ft()||!yi()},pn,{type:"separator"},{type:"button",icon:h5,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:Ai(),disabled:!dt()},{type:"button",icon:Q5,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:Ki(),disabled:!EA()},{type:"space"}])}),fA(()=>(k(ri()),g(Fn)),()=>{y(cn,ri()(g(Fn))||g(Fn))}),Qn(),Zt(!0),Oy(Di,{get items(){return g(cn)}}),pt()})(MA,{get readOnly(){return n()},onFormat:de,onCompact:Dt,onSort:Le,onTransform:Re,onToggleSearch:$t,onUndo:x,onRedo:Y,get canFormat(){return g(nt)},get canCompact(){return g(Wt)},get canSort(){return g(Xe)},get canTransform(){return g(oi)},get canUndo(){return k(l()),nA(()=>l().canUndo)},get canRedo(){return k(l()),nA(()=>l().canRedo)},get onRenderMenu(){return U()}})};LA(bo,MA=>{o()&&MA(Yn)});var Mo=IA(bo,2),ne=MA=>{var me,nt=OJA(),Wt=qA(()=>(g(uA),g(cA),nA(()=>We(g(uA),g(cA))))),Xe=vt(nt);Co(Xe,ft=>y(lA,ft),()=>g(lA));var oi=IA(Xe,2),Di=ft=>{var Qi=HJA(),ot=vt(Qi),Mt=qA(()=>(k(cy),k(PN),g(uA),nA(()=>"The JSON document is larger than ".concat(cy(PN),", ")+"and may crash your browser when loading it in text mode. Actual size: ".concat(cy(g(uA).length),"."))));mc(ot,{get icon(){return g1},type:"error",get message(){return g(Mt)},actions:[{text:"Open anyway",title:"Open the document in text mode. This may freeze or crash your browser.",onClick:P},{text:"Open in tree mode",title:"Open the document in tree mode. Tree mode can handle large documents.",onClick:X},{text:"Cancel",title:"Cancel opening this large document.",onClick:bA}],onClose:mA});var on=W(IA(ot,2));De(hn=>wt(on,hn),[()=>(k(V0),g(uA),k(Qy),nA(()=>V0(g(uA)||"",Qy)))],qA),iA(ft,Qi)};LA(oi,ft=>{g(Wt)&&ft(Di)});var Ut=IA(oi,2),cn=ft=>{var Qi=zJA(),ot=vt(Qi),Mt=dt=>{(function(EA,HA){mt(HA,!1);var ve=b(HA,"editorState",8),Qt=$(),yi=$(),ri=$(),pn=$(),Fn=$();fA(()=>k(ve()),()=>{var se;y(Qt,(se=ve())===null||se===void 0||(se=se.selection)===null||se===void 0||(se=se.main)===null||se===void 0?void 0:se.head)}),fA(()=>(g(Qt),k(ve())),()=>{var se;y(yi,g(Qt)!==void 0?(se=ve())===null||se===void 0||(se=se.doc)===null||se===void 0?void 0:se.lineAt(g(Qt)):void 0)}),fA(()=>g(yi),()=>{y(ri,g(yi)!==void 0?g(yi).number:void 0)}),fA(()=>(g(yi),g(Qt)),()=>{y(pn,g(yi)!==void 0&&g(Qt)!==void 0?g(Qt)-g(yi).from+1:void 0)}),fA(()=>k(ve()),()=>{var se;y(Fn,(se=ve())===null||se===void 0||(se=se.selection)===null||se===void 0||(se=se.ranges)===null||se===void 0?void 0:se.reduce((vi,Yi)=>vi+Yi.to-Yi.from,0))}),Qn(),Zt();var Jn=KJA(),ln=W(Jn),Pt=se=>{var vi=_JA(),Yi=W(vi);De(()=>{var rn;return wt(Yi,"Line: ".concat((rn=g(ri))!==null&&rn!==void 0?rn:""))}),iA(se,vi)};LA(ln,se=>{g(ri)!==void 0&&se(Pt)});var $i=IA(ln,2),Rr=se=>{var vi=GJA(),Yi=W(vi);De(()=>{var rn;return wt(Yi,"Column: ".concat((rn=g(pn))!==null&&rn!==void 0?rn:""))}),iA(se,vi)};LA($i,se=>{g(pn)!==void 0&&se(Rr)});var Ft=IA($i,2),Xn=se=>{var vi=UJA(),Yi=W(vi);De(()=>{var rn;return wt(Yi,"Selection: ".concat((rn=g(Fn))!==null&&rn!==void 0?rn:""," characters"))}),iA(se,vi)};LA(Ft,se=>{g(Fn)!==void 0&&g(Fn)>0&&se(Xn)}),iA(EA,Jn),pt()})(dt,{get editorState(){return g(tA)}})};LA(ot,dt=>{r()&&dt(Mt)});var on=IA(ot,2),hn=dt=>{mc(dt,{type:"error",get icon(){return g1},get message(){return g(pi),nA(()=>g(pi).message)},get actions(){return g(i)},onClick:kn,onClose:mA})};LA(on,dt=>{g(pi)&&dt(hn)});var Ai=IA(on,2),Ki=dt=>{var EA=qA(()=>[{icon:YrA,text:"Format",title:"Format JSON: add proper indentation and new lines (Ctrl+I)",onClick:de},{icon:I4,text:"No thanks",title:"Close this message",onClick:()=>y(pA,!1)}]);mc(dt,{type:"success",message:"Do you want to format the JSON?",get actions(){return g(EA)},onClose:mA})};LA(Ai,dt=>{g(pi),g(pA),k(trA),g(uA),nA(()=>!g(pi)&&g(pA)&&trA(g(uA)))&&dt(Ki)}),dG(IA(Ai,2),{get validationErrors(){return g(VA)},selectError:Be}),iA(ft,Qi)};LA(Ut,ft=>{g(Wt)||ft(cn)}),De(ft=>me=Vt(Xe,1,"jse-contents svelte-xt61xw",null,me,ft),[()=>({"jse-hidden":g(Wt)})],qA),iA(MA,nt)},wi=MA=>{iA(MA,PJA())};return LA(Mo,MA=>{QA?MA(wi,!1):MA(ne)}),Co(vo,MA=>y(vA,MA),()=>g(vA)),De(MA=>Vo=Vt(vo,1,"jse-text-mode svelte-xt61xw",null,Vo,MA),[()=>({"no-main-menu":!o()})],qA),iA(t,vo),zt(e,"focus",mA),zt(e,"patch",xt),zt(e,"handlePatch",tt),zt(e,"openTransformModal",bt),zt(e,"refresh",qi),zt(e,"flush",ii),zt(e,"validate",mn),pt({focus:mA,patch:xt,handlePatch:tt,openTransformModal:bt,refresh:qi,flush:ii,validate:mn})}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-inline-value.svelte-h57m0p { - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - line-height: var(--jse-line-height, calc(1em + 4px)); - border: none; - padding: 0 calc(0.5 * var(--jse-padding, 10px)); - background: transparent; - color: inherit; - cursor: inherit; -} -.jse-inline-value.jse-highlight.svelte-h57m0p { - background-color: var(--jse-search-match-color, #ffe665); - outline: var(--jse-search-match-outline, none); -} -.jse-inline-value.jse-highlight.jse-active.svelte-h57m0p { - background-color: var(--jse-search-match-active-color, var(--jse-search-match-color, #ffe665)); - outline: var(--jse-search-match-outline, 2px solid #e0be00); -}`);var VJA=wA('');Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-column-header.svelte-2i3vdx { - background: none; - border: none; - font-family: inherit; - font-size: inherit; - color: inherit; - display: flex; - gap: var(--jse-padding, 10px); - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); - width: 100%; -} -.jse-column-header.svelte-2i3vdx:hover { - background: var(--jse-table-header-background-highlight, #e8e8e8); -} -.jse-column-header.svelte-2i3vdx:not(.jse-column-header.jse-readonly) { - cursor: pointer; -} -.jse-column-header.svelte-2i3vdx span.jse-column-sort-icon:where(.svelte-2i3vdx) { - height: 1em; -}`);var ZJA=wA(''),WJA=wA('');Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-table-mode-welcome.svelte-17xl1jx { - flex: 1; - display: flex; - flex-direction: column; - overflow: auto; - align-items: center; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-table-mode-welcome.svelte-17xl1jx:last-child { - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-table-mode-welcome.svelte-17xl1jx .jse-space.jse-before:where(.svelte-17xl1jx) { - flex: 1; -} -.jse-table-mode-welcome.svelte-17xl1jx .jse-nested-arrays:where(.svelte-17xl1jx) { - display: flex; - flex-direction: column; - gap: var(--jse-padding, 10px); - max-width: 400px; - margin: 2em var(--jse-padding, 10px); - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); -} -.jse-table-mode-welcome.svelte-17xl1jx .jse-nested-arrays:where(.svelte-17xl1jx) .jse-nested-arrays-info:where(.svelte-17xl1jx) { - color: var(--jse-panel-color-readonly, #b2b2b2); -} -.jse-table-mode-welcome.svelte-17xl1jx .jse-nested-arrays:where(.svelte-17xl1jx) .jse-nested-property:where(.svelte-17xl1jx) { - display: flex; - align-items: center; - gap: var(--jse-padding, 10px); -} -.jse-table-mode-welcome.svelte-17xl1jx .jse-nested-arrays:where(.svelte-17xl1jx) .jse-nested-property:where(.svelte-17xl1jx) .jse-nested-property-path:where(.svelte-17xl1jx) { - flex: 1; -} -.jse-table-mode-welcome.svelte-17xl1jx .jse-nested-arrays:where(.svelte-17xl1jx) .jse-nested-property:where(.svelte-17xl1jx) .jse-nested-property-path:where(.svelte-17xl1jx) .jse-nested-property-count:where(.svelte-17xl1jx) { - opacity: 0.5; - white-space: nowrap; -} -.jse-table-mode-welcome.svelte-17xl1jx .jse-nested-arrays:where(.svelte-17xl1jx) button.jse-nested-array-action:where(.svelte-17xl1jx) { - text-align: left; - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); - color: var(--jse-button-primary-color, #fff); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-table-mode-welcome.svelte-17xl1jx .jse-nested-arrays:where(.svelte-17xl1jx) button.jse-nested-array-action:where(.svelte-17xl1jx):hover { - background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); -} -.jse-table-mode-welcome.svelte-17xl1jx .jse-nested-arrays:where(.svelte-17xl1jx) button.jse-nested-array-action:where(.svelte-17xl1jx):disabled { - background: var(--jse-button-primary-background-disabled, #9d9d9d); -} -.jse-table-mode-welcome.svelte-17xl1jx .jse-space.jse-after:where(.svelte-17xl1jx) { - flex: 2; -}`);var XJA=(t,e)=>e.onClick(),$JA=wA(`An empty document cannot be opened in table mode. You can go to tree mode instead, or paste - a JSON Array using Ctrl+V.`,1),ATA=(t,e,A)=>e.openJSONEditorModal(g(A)),eTA=(t,e,A)=>e.extractPath(g(A)),tTA=wA(''),iTA=wA('
        '),nTA=(t,e)=>e.onChangeMode(er.tree),oTA=wA('
        ');function rTA(t,e){mt(e,!0);var A=Ga(()=>e.json?function(E){var h=arguments.length>1&&arguments[1]!==void 0?arguments[1]:2,u=[];return function D(L,R){xo(L)&&R.length{D(L[w],R.concat(w))}),wo(L)&&u.push(R)}(E,[]),u}(e.json).slice(0,99).filter(E=>E.length>0):[]),i=Ga(()=>!Oi(g(A))),n=Ga(()=>e.json===void 0&&(e.text===""||e.text===void 0)),o=Ga(()=>g(i)?"Object with nested arrays":g(n)?"An empty document":xo(e.json)?"An object":wo(e.json)?"An empty array":"A ".concat(q_(e.json,e.parser))),r=oTA();r.__click=[XJA,e];var s=IA(W(r),2),a=W(s),c=W(a),l=IA(a,2),I=W(l),C=E=>{iA(E,Tr(`An object cannot be opened in table mode. You can open a nested array instead, or open the - document in tree mode.`))},d=(E,h)=>{var u=L=>{iA(L,$JA())},D=L=>{var R=Tr();De(()=>{var w;return wt(R,"".concat((w=g(o))!==null&&w!==void 0?w:""," cannot be opened in table mode. You can open the document in tree mode instead."))}),iA(L,R)};LA(E,L=>{g(n)&&!e.readOnly?L(u):L(D,!1)},h)};LA(I,E=>{g(i)?E(C):E(d,!1)});var B=IA(l,2);qo(B,17,()=>g(A),or,(E,h)=>{var u=iTA(),D=Ga(()=>function(H){return Ke(e.json,H).length}(g(h))),L=W(u),R=W(L),w=W(IA(R)),_=IA(L,2);_.__click=[ATA,e,h];var K=W(_),z=IA(_,2),U=H=>{var q=tTA();q.__click=[eTA,e,h],iA(H,q)};LA(z,H=>{e.readOnly||H(U)}),De(H=>{var q;wt(R,'"'.concat(H??"",'" ')),wt(w,"(".concat((q=g(D))!==null&&q!==void 0?q:""," ").concat(g(D)!==1?"items":"item",")")),wt(K,e.readOnly?"View":"Edit")},[()=>Ka(g(h))]),iA(E,u)}),IA(B,2).__click=[nTA,e],De(()=>wt(c,g(o))),iA(t,r),pt()}of(["click"]);Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-column-header.svelte-fzj761 { - background: none; - border: none; - font-family: inherit; - font-size: inherit; - color: inherit; - display: flex; - gap: var(--jse-padding, 10px); - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); - width: 100%; -} -.jse-column-header.svelte-fzj761:hover { - background: var(--jse-table-header-background-highlight, #e8e8e8); -} -.jse-column-header.svelte-fzj761:not(.jse-column-header.jse-readonly) { - cursor: pointer; -}`);var sTA=wA('');Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-table-mode.svelte-u14cgx { - flex: 1; - display: flex; - flex-direction: column; - position: relative; - background: var(--jse-background-color, #fff); - min-width: 0; - min-height: 0; - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - color: var(--jse-text-color, #4d4d4d); - line-height: var(--jse-line-height, calc(1em + 4px)); -} -.jse-table-mode.no-main-menu.svelte-u14cgx { - border-top: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-table-mode.svelte-u14cgx .jse-search-box-container:where(.svelte-u14cgx) { - position: relative; - height: 0; - top: calc(var(--jse-line-height, calc(1em + 4px)) + 2 * var(--jse-padding, 10px)); - margin-right: calc(var(--jse-padding, 10px) + 20px); - margin-left: var(--jse-padding, 10px); - text-align: right; - z-index: 3; -} -.jse-table-mode.svelte-u14cgx .jse-hidden-input-label:where(.svelte-u14cgx) { - position: fixed; - right: 0; - top: 0; - width: 0; - height: 0; -} -.jse-table-mode.svelte-u14cgx .jse-hidden-input-label:where(.svelte-u14cgx) .jse-hidden-input:where(.svelte-u14cgx) { - width: 0; - height: 0; - padding: 0; - border: 0; - outline: none; -} -.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) { - flex: 1; - align-items: flex-start; - flex-direction: column; - display: flex; - overflow: auto; - overflow-anchor: none; - scrollbar-gutter: stable; - border-left: var(--jse-main-border, 1px solid #d7d7d7); - border-right: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx):last-child { - border-bottom: var(--jse-main-border, 1px solid #d7d7d7); -} -.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) { - border-collapse: collapse; - border-spacing: 0; -} -.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-invisible-start-section:where(.svelte-u14cgx) td:where(.svelte-u14cgx), -.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-invisible-end-section:where(.svelte-u14cgx) td:where(.svelte-u14cgx) { - margin: 0; - padding: 0; -} -.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-search-box-background:where(.svelte-u14cgx) { - background: var(--jse-table-header-background, #f5f5f5); -} -.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-invisible-end-section:where(.svelte-u14cgx) td:where(.svelte-u14cgx) { - padding-bottom: var(--jse-padding, 10px); -} -.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx):hover { - background-color: var(--jse-table-row-odd-background, rgba(0, 0, 0, 0.05)); -} -.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell:where(.svelte-u14cgx) { - padding: 0 var(--jse-padding, 10px) 0 0; - vertical-align: top; - white-space: nowrap; - height: var(--jse-line-height, calc(1em + 4px)); -} -.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell.jse-table-cell-header:where(.svelte-u14cgx), .jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell.jse-table-cell-gutter:where(.svelte-u14cgx) { - font-weight: normal; - text-align: left; - color: var(--jse-text-readonly, #8d8d8d); - background: var(--jse-table-header-background, #f5f5f5); -} -.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell.jse-table-cell-header:where(.svelte-u14cgx) { - padding: 0; - position: sticky; - top: 0; -} -.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell.jse-table-cell-header:where(.svelte-u14cgx) .jse-table-root-error:where(.svelte-u14cgx) { - padding: calc(0.5 * var(--jse-padding, 10px)) var(--jse-padding, 10px) calc(0.5 * var(--jse-padding, 10px)) calc(0.5 * var(--jse-padding, 10px)); -} -.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell.jse-table-cell-gutter:where(.svelte-u14cgx) { - padding: 0 var(--jse-padding, 10px) 0 calc(0.5 * var(--jse-padding, 10px)); -} -.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell:where(.svelte-u14cgx) .jse-value-outer:where(.svelte-u14cgx) { - display: inline-block; - cursor: var(--jse-contents-cursor, pointer); -} -.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell:where(.svelte-u14cgx) .jse-value-outer:where(.svelte-u14cgx):hover { - background: var(--jse-hover-background-color, rgba(0, 0, 0, 0.06)); -} -.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell:where(.svelte-u14cgx) .jse-value-outer.jse-selected-value:where(.svelte-u14cgx) { - background: var(--jse-selection-background-color, #d3d3d3); -} -.jse-table-mode.svelte-u14cgx .jse-contents:where(.svelte-u14cgx) table.jse-table-main:where(.svelte-u14cgx) .jse-table-row:where(.svelte-u14cgx) .jse-table-cell:where(.svelte-u14cgx) .jse-context-menu-anchor:where(.svelte-u14cgx) { - display: inline-flex; - position: relative; - vertical-align: top; -} -.jse-table-mode.svelte-u14cgx .jse-contents.jse-contents-loading:where(.svelte-u14cgx) { - align-items: unset; -} -.jse-table-mode.svelte-u14cgx .jse-contents.jse-contents-loading:where(.svelte-u14cgx) .jse-loading-space:where(.svelte-u14cgx) { - flex: 1; -} -.jse-table-mode.svelte-u14cgx .jse-contents.jse-contents-loading:where(.svelte-u14cgx) .jse-loading:where(.svelte-u14cgx) { - flex: 2; - text-align: center; - color: var(--jse-panel-color-readonly, #b2b2b2); - box-sizing: border-box; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); -}`);var aTA=wA('
        '),cTA=wA(''),lTA=wA(''),gTA=wA(' '),ITA=wA('
        '),CTA=wA('
        '),dTA=wA(''),BTA=wA(''),ETA=wA('
        ',1),QTA=wA(" ",1),hTA=wA(' ',1),uTA=wA('
        loading...
        '),fTA=wA('
        ',1);function mTA(t,e){mt(e,!1);var A=$(void 0,!0),i=$(void 0,!0),n=$(void 0,!0),o=Sr("jsoneditor:TableMode"),{openAbsolutePopup:r,closeAbsolutePopup:s}=$1("absolute-popup"),a=paA(),c=c1(),l=c1(),I=typeof window>"u";o("isSSR:",I);var C=b(e,"readOnly",9),d=b(e,"externalContent",9),B=b(e,"externalSelection",9),E=b(e,"history",9),h=b(e,"truncateTextSize",9),u=b(e,"mainMenuBar",9),D=b(e,"escapeControlCharacters",9),L=b(e,"escapeUnicodeCharacters",9),R=b(e,"flattenColumns",9),w=b(e,"parser",9),_=b(e,"parseMemoizeOne",9),K=b(e,"validator",9),z=b(e,"validationParser",9),U=b(e,"indentation",9),H=b(e,"onChange",9),q=b(e,"onChangeMode",9),j=b(e,"onSelect",9),gA=b(e,"onUndo",9),QA=b(e,"onRedo",9),BA=b(e,"onRenderValue",9),lA=b(e,"onRenderMenu",9),vA=b(e,"onRenderContextMenu",9),tA=b(e,"onFocus",9),cA=b(e,"onBlur",9),pA=b(e,"onSortModal",9),VA=b(e,"onTransformModal",9),oe=b(e,"onJSONEditorModal",9),KA=$(void 0,!0),CA=$(void 0,!0),TA=$(void 0,!0),Ze=$(void 0,!0),He=$(void 0,!0);CG({onMount:hs,onDestroy:qc,getWindow:()=>af(g(CA)),hasFocus:()=>Re&&document.hasFocus()||W_(g(CA)),onFocus:()=>{$t=!0,tA()&&tA()()},onBlur:()=>{$t=!1,cA()&&cA()()}});var uA,eA=$(void 0,!0),UA=$(void 0,!0),aA=$(void 0,!0),le=$(void 0,!0),SA=$(void 0,!0),Ue=$(void 0,!0),mA=$(!1,!0),sA=$(!1,!0);function xt(p){y(Ue,(uA=p)?caA(g(eA),uA.items):void 0)}function tt(p){return de.apply(this,arguments)}function de(){return(de=Yt(function*(p){y(DA,void 0),yield dn(p)})).apply(this,arguments)}function Dt(){y(mA,!1),y(sA,!1),M()}var _e=$(1e4,!0),Le=$([],!0),bt=$(void 0,!0),Re=!1,$t=!1,x=$(!1,!0),Y=$({},!0),P=$(600,!0),X=$(0,!0),bA=18;function Be(p){y(DA,p)}function Ee(p){g(DA)&&p!==void 0&&(Ms(p,OC(g(DA)))&&Ms(p,et(g(DA)))||(o("clearing selection: path does not exist anymore",g(DA)),y(DA,void 0)))}var kA=$(g(eA)!==void 0?w_({json:g(eA)}):void 0,!0),DA=$(q3(B())?B():void 0,!0),gt=$(void 0,!0),Ve=$(!1,!0);function ZA(p){if(!C()){o("onSortByHeader",p);var N=p.sortDirection===Pc.desc?-1:1;Ot(baA(g(eA),[],p.path,N),(J,V)=>({state:V,sortedColumn:p}))}}hs(()=>{g(DA)&&Uo(et(g(DA)))});var rt=$(void 0,!0);function Ei(p){if(p.json!==void 0||p.text!==void 0){var N=g(eA)!==void 0&&p.json!==void 0;E().add({type:"tree",undo:{patch:N?[{op:"replace",path:"",value:p.json}]:void 0,json:p.json,text:p.text,documentState:p.documentState,textIsRepaired:p.textIsRepaired,selection:Hg(p.selection),sortedColumn:p.sortedColumn},redo:{patch:N?[{op:"replace",path:"",value:g(eA)}]:void 0,json:g(eA),text:g(UA),documentState:g(kA),textIsRepaired:g(Ve),selection:Hg(g(DA)),sortedColumn:g(gt)}})}}var tn=$([],!0),qi=aE(waA);function xe(p,N,J,V){sQ(()=>{var Z;try{Z=qi(p,N,J,V)}catch(FA){Z=[{path:[],message:"Failed to validate: "+FA.message,severity:Fl.warning}]}di(Z,g(tn))||(o("validationErrors changed:",Z),y(tn,Z))},Z=>o("validationErrors updated in ".concat(Z," ms")))}function nn(){return o("validate"),g(aA)?{parseError:g(aA),isRepairable:!1}:(xe(g(eA),K(),w(),z()),Oi(g(tn))?void 0:{validationErrors:g(tn)})}function mi(p,N){if(o("patch",p,N),g(eA)===void 0)throw new Error("Cannot apply patch: no JSON");var J=g(eA),V={json:void 0,text:g(UA),documentState:g(kA),selection:Hg(g(DA)),sortedColumn:g(gt),textIsRepaired:g(Ve)},Z=aaA(g(eA),p),FA=ZsA(g(eA),g(kA),p),te=lJA(g(gt),p,g(Le)),re=typeof N=="function"?N(FA.json,FA.documentState,g(DA)):void 0;return y(eA,re?.json!==void 0?re.json:FA.json),y(kA,re?.state!==void 0?re.state:FA.documentState),y(DA,re?.selection!==void 0?re.selection:g(DA)),y(gt,re?.sortedColumn!==void 0?re.sortedColumn:te),y(UA,void 0),y(Ve,!1),y(le,void 0),y(SA,void 0),y(aA,void 0),E().add({type:"tree",undo:fe({patch:Z},V),redo:{patch:p,json:void 0,text:void 0,documentState:g(kA),selection:Hg(g(DA)),sortedColumn:g(gt),textIsRepaired:g(Ve)}}),{json:g(eA),previousJson:J,undo:Z,redo:p}}function Ot(p,N){o("handlePatch",p,N);var J={json:g(eA),text:g(UA)},V=mi(p,N);return Lt(J,V),V}function Lt(p,N){if((p.json!==void 0||p?.text!==void 0)&&H()){if(g(UA)!==void 0){var J={text:g(UA),json:void 0};H()(J,p,{contentErrors:nn(),patchResult:N})}else if(g(eA)!==void 0){var V={text:void 0,json:g(eA)};H()(V,p,{contentErrors:nn(),patchResult:N})}}}function ii(p){o("pasted json as text",p),y(le,p)}function _i(p){o("pasted multiline text",{pastedText:p}),y(SA,p)}function Tt(p){var N=parseInt(p[0],10),J=[String(N+1),...p.slice(1)];return Ms(g(eA),J)?Ni(J):Ni(p)}function M(){o("focus"),g(Ze)&&(g(Ze).focus(),g(Ze).select())}function We(p){y(X,p.target.scrollTop)}function ni(){g(DA)||y(DA,function(){if(wo(g(eA))&&!Oi(g(eA))&&!Oi(g(Le)))return Ni(["0",...g(Le)[0]])}())}function pi(){if(g(Ve)&&g(eA)!==void 0){var p={json:g(eA),text:g(UA)},N={json:g(eA),documentState:g(kA),selection:g(DA),sortedColumn:g(gt),text:g(UA),textIsRepaired:g(Ve)};y(UA,void 0),y(Ve,!1),Ee(g(eA)),Ei(N),Lt(p,void 0)}return{json:g(eA),text:g(UA)}}function dn(p){var{scrollToWhenVisible:N=!0}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},J=g(mA)?_3:0,V=TrA(p,g(Le),Y,bA),Z=V-g(X)+J+bA,FA=kn(p);if(o("scrollTo",{path:p,top:V,scrollTop:g(X),elem:FA}),!g(TA))return Promise.resolve();var te=g(TA).getBoundingClientRect();if(FA&&!N){var re=FA.getBoundingClientRect();if(re.bottom>te.top&&re.top{a(FA,{container:g(TA),offset:Pe,duration:300,callback:()=>{mn(p),ze()}})}:ze=>{a(Z,{container:g(TA),offset:Pe,duration:300,callback:()=>{io(),mn(p),ze()}})})}function mn(p){var N=kn(p);if(N&&g(TA)){var J=g(TA).getBoundingClientRect(),V=N.getBoundingClientRect();if(V.right>J.right){var Z=V.right-J.right;hc(TA,g(TA).scrollLeft+=Z)}if(V.leftPe){var ze=Z-Pe;hc(TA,g(TA).scrollTop+=ze)}if(VPg(p.slice(1),FA)),Z=V?p.slice(0,1).concat(V):p;return(N=(J=g(TA))===null||J===void 0?void 0:J.querySelector('td[data-path="'.concat(sy(Z),'"]')))!==null&&N!==void 0?N:void 0}function Wn(p){var N,{anchor:J,left:V,top:Z,width:FA,height:te,offsetTop:re,offsetLeft:Pe,showTip:ze}=p,ye=function(oA){var{json:YA,documentState:pe,selection:he,readOnly:ge,onEditValue:Bt,onEditRow:$e,onToggleEnforceString:bi,onCut:un,onCopy:Ji,onPaste:Tn,onRemove:Ht,onDuplicateRow:ko,onInsertBeforeRow:Sn,onInsertAfterRow:no,onRemoveRow:gn}=oA,Nt=YA!==void 0,Zi=!!he,_t=YA!==void 0&&he?Ke(YA,et(he)):void 0,st=Nt&&(Kn(he)||kr(he)||an(he)),si=!ge&&Nt&&he!==void 0&&fy(he),Eo=si&&!No(_t),xr=!ge&&st,Hn=he!==void 0&&zg(YA,pe,et(he));return[{type:"separator"},{type:"row",items:[{type:"column",items:[{type:"label",text:"Table cell:"},{type:"dropdown-button",main:{type:"button",onClick:()=>Bt(),icon:lC,text:"Edit",title:"Edit the value (Double-click on the value)",disabled:!si},width:"11em",items:[{type:"button",icon:lC,text:"Edit",title:"Edit the value (Double-click on the value)",onClick:()=>Bt(),disabled:!si},{type:"button",icon:Hn?jS:ZS,text:"Enforce string",title:"Enforce keeping the value as string when it contains a numeric value",onClick:()=>bi(),disabled:!Eo}]},{type:"dropdown-button",main:{type:"button",onClick:()=>un(!0),icon:cC,text:"Cut",title:"Cut selected contents, formatted with indentation (Ctrl+X)",disabled:!xr},width:"10em",items:[{type:"button",icon:cC,text:"Cut formatted",title:"Cut selected contents, formatted with indentation (Ctrl+X)",onClick:()=>un(!0),disabled:ge||!st},{type:"button",icon:cC,text:"Cut compacted",title:"Cut selected contents, without indentation (Ctrl+Shift+X)",onClick:()=>un(!1),disabled:ge||!st}]},{type:"dropdown-button",main:{type:"button",onClick:()=>Ji(!0),icon:F0,text:"Copy",title:"Copy selected contents, formatted with indentation (Ctrl+C)",disabled:!st},width:"12em",items:[{type:"button",icon:F0,text:"Copy formatted",title:"Copy selected contents, formatted with indentation (Ctrl+C)",onClick:()=>Ji(!1),disabled:!st},{type:"button",icon:F0,text:"Copy compacted",title:"Copy selected contents, without indentation (Ctrl+Shift+C)",onClick:()=>Ji(!1),disabled:!st}]},{type:"button",onClick:()=>Tn(),icon:PS,text:"Paste",title:"Paste clipboard contents (Ctrl+V)",disabled:ge||!Zi},{type:"button",onClick:()=>Ht(),icon:E5,text:"Remove",title:"Remove selected contents (Delete)",disabled:ge||!st}]},{type:"column",items:[{type:"label",text:"Table row:"},{type:"button",onClick:()=>$e(),icon:lC,text:"Edit row",title:"Edit the current row",disabled:ge||!Zi||!Nt},{type:"button",onClick:()=>ko(),icon:$S,text:"Duplicate row",title:"Duplicate the current row (Ctrl+D)",disabled:ge||!Zi||!Nt},{type:"button",onClick:()=>Sn(),icon:gC,text:"Insert before",title:"Insert a row before the current row",disabled:ge||!Zi||!Nt},{type:"button",onClick:()=>no(),icon:gC,text:"Insert after",title:"Insert a row after the current row",disabled:ge||!Zi||!Nt},{type:"button",onClick:()=>gn(),icon:E5,text:"Remove row",title:"Remove current row",disabled:ge||!Zi||!Nt}]}]}]}({json:g(eA),documentState:g(kA),selection:g(DA),readOnly:C(),onEditValue:bo,onEditRow:Yn,onToggleEnforceString:Mo,onCut:Ut,onCopy:ft,onPaste:MA,onRemove:ot,onDuplicateRow:on,onInsertBeforeRow:hn,onInsertAfterRow:Ai,onRemoveRow:Ki}),Ge=(N=vA()(ye))!==null&&N!==void 0?N:ye;if(Ge!==!1){var Vi={left:V,top:Z,offsetTop:re,offsetLeft:Pe,width:FA,height:te,anchor:J,closeOnOuterClick:!0,onClose:()=>{Re=!1,M()}};Re=!0;var T=r(GaA,{tip:ze?"Tip: you can open this context menu via right-click or with Ctrl+Q":void 0,items:Ge,onRequestClose(){s(T),M()}},Vi)}}function Vo(p){if(!br(g(DA)))if(p&&(p.stopPropagation(),p.preventDefault()),p&&p.type==="contextmenu"&&p.target!==g(Ze))Wn({left:p.clientX,top:p.clientY,width:W0,height:Z0,showTip:!1});else{var N,J=(N=g(TA))===null||N===void 0?void 0:N.querySelector(".jse-table-cell.jse-selected-value");if(J)Wn({anchor:J,offsetTop:2,width:W0,height:Z0,showTip:!1});else{var V,Z=(V=g(TA))===null||V===void 0?void 0:V.getBoundingClientRect();Z&&Wn({top:Z.top+2,left:Z.left+2,width:W0,height:Z0,showTip:!1})}}}function vo(p){Wn({anchor:OsA(p.target,"BUTTON"),offsetTop:0,width:W0,height:Z0,showTip:!0})}function bo(){if(!C()&&g(DA)){var p=et(g(DA));No(Ke(g(eA),p))?pn(p):y(DA,Ni(p))}}function Yn(){!C()&&g(DA)&&pn(et(g(DA)).slice(0,1))}function Mo(){if(!C()&&an(g(DA))){var p=g(DA).path,N=Ct(p),J=Ke(g(eA),p),V=!zg(g(eA),g(kA),p),Z=V?String(J):DQ(String(J),w());o("handleToggleEnforceString",{enforceString:V,value:J,updatedValue:Z}),Ot([{op:"replace",path:N,value:Z}],(FA,te)=>({state:Ky(g(eA),te,p,{type:"value",enforceString:V})}))}}function ne(){return wi.apply(this,arguments)}function wi(){return(wi=Yt(function*(){if(o("apply pasted json",g(le)),g(le)){var{onPasteAsJson:p}=g(le);p(),setTimeout(M)}})).apply(this,arguments)}function MA(){return me.apply(this,arguments)}function me(){return(me=Yt(function*(){try{HA(yield navigator.clipboard.readText())}catch(p){console.error(p),y(x,!0)}})).apply(this,arguments)}function nt(){return Wt.apply(this,arguments)}function Wt(){return(Wt=Yt(function*(){o("apply pasted multiline text",g(SA)),g(SA)&&(HA(JSON.stringify(g(SA))),setTimeout(M))})).apply(this,arguments)}function Xe(){o("clear pasted json"),y(le,void 0),M()}function oi(){o("clear pasted multiline text"),y(SA,void 0),M()}function Di(){q()(er.text)}function Ut(p){return cn.apply(this,arguments)}function cn(){return(cn=Yt(function*(p){yield RaA({json:g(eA),selection:g(DA),indentation:p?U():void 0,readOnly:C(),parser:w(),onPatch:Ot})})).apply(this,arguments)}function ft(){return Qi.apply(this,arguments)}function Qi(){return Qi=Yt(function*(){var p=!(arguments.length>0&&arguments[0]!==void 0)||arguments[0];g(eA)!==void 0&&(yield xaA({json:g(eA),selection:g(DA),indentation:p?U():void 0,parser:w()}))}),Qi.apply(this,arguments)}function ot(){FaA({json:g(eA),text:g(UA),selection:g(DA),keepSelection:!0,readOnly:C(),onChange:H(),onPatch:Ot})}function Mt(p){C()||(o("extract",{path:p}),Ot(oaA(g(eA),Ni(p))))}function on(){(function(p){var{json:N,selection:J,columns:V,readOnly:Z,onPatch:FA}=p;if(!Z&&N!==void 0&&J&&oQ(J)){var{rowIndex:te,columnIndex:re}=zc(et(J),V);Gs("duplicate row",{rowIndex:te});var Pe=[String(te)];FA(naA(N,[Pe]),(ze,ye)=>({state:ye,selection:Ni(YC({rowIndex:te({state:Vi,selection:Ni(YC({rowIndex:Pe,columnIndex:re},V))}))}})({json:g(eA),selection:g(DA),columns:g(Le),readOnly:C(),onPatch:Ot})}function Ki(){(function(p){var{json:N,selection:J,columns:V,readOnly:Z,onPatch:FA}=p;if(!Z&&N!==void 0&&J&&oQ(J)){var{rowIndex:te,columnIndex:re}=zc(et(J),V);Gs("remove row",{rowIndex:te}),FA(py([[String(te)]]),(Pe,ze)=>{var ye=te0?te-1:void 0,Ge=ye!==void 0?Ni(YC({rowIndex:ye,columnIndex:re},V)):void 0;return Gs("remove row new selection",{rowIndex:te,newRowIndex:ye,newSelection:Ge}),{state:ze,selection:Ge}})}})({json:g(eA),selection:g(DA),columns:g(Le),readOnly:C(),onPatch:Ot})}function dt(){return(dt=Yt(function*(p){yield NaA({char:p,selectInside:!1,json:g(eA),selection:g(DA),readOnly:C(),parser:w(),onPatch:Ot,onReplaceJson:ve,onSelect:Be})})).apply(this,arguments)}function EA(p){var N;p.preventDefault(),HA((N=p.clipboardData)===null||N===void 0?void 0:N.getData("text/plain"))}function HA(p){p!==void 0&&LaA({clipboardText:p,json:g(eA),selection:g(DA),readOnly:C(),parser:w(),onPatch:Ot,onChangeText:Qt,onPasteMultilineText:_i,openRepairModal:Fn})}function ve(p,N){var J={json:g(eA),text:g(UA)},V={json:g(eA),documentState:g(kA),selection:g(DA),sortedColumn:g(gt),text:g(UA),textIsRepaired:g(Ve)},Z=Qc(p,g(kA)),FA=typeof N=="function"?N(p,Z,g(DA)):void 0;y(eA,FA?.json!==void 0?FA.json:p),y(kA,FA?.state!==void 0?FA.state:Z),y(DA,FA?.selection!==void 0?FA.selection:g(DA)),y(gt,void 0),y(UA,void 0),y(Ve,!1),y(aA,void 0),Ee(g(eA)),Ei(V),Lt(J,void 0)}function Qt(p,N){o("handleChangeText");var J={json:g(eA),text:g(UA)},V={json:g(eA),documentState:g(kA),selection:g(DA),sortedColumn:g(gt),text:g(UA),textIsRepaired:g(Ve)};try{y(eA,_()(p)),y(kA,Qc(g(eA),g(kA))),y(UA,void 0),y(Ve,!1),y(aA,void 0)}catch(FA){try{y(eA,_()(Rc(p))),y(kA,Qc(g(eA),g(kA))),y(UA,p),y(Ve,!0),y(aA,void 0)}catch{y(eA,void 0),y(kA,void 0),y(UA,p),y(Ve,!1),y(aA,g(UA)!==""?dQ(g(UA),FA.message||String(FA)):void 0)}}if(typeof N=="function"){var Z=N(g(eA),g(kA),g(DA));y(eA,Z?.json!==void 0?Z.json:g(eA)),y(kA,Z?.state!==void 0?Z.state:g(kA)),y(DA,Z?.selection!==void 0?Z.selection:g(DA))}Ee(g(eA)),Ei(V),Lt(J,void 0)}function yi(p){o("select validation error",p),y(DA,Ni(p.path)),dn(p.path)}function ri(p){if(g(eA)!==void 0){var{id:N,onTransform:J,onClose:V}=p,Z=p.rootPath||[];Re=!0,VA()({id:N||l,json:g(eA),rootPath:Z||[],onTransform:FA=>{J?J({operations:FA,json:g(eA),transformedJson:Da(g(eA),FA)}):(o("onTransform",Z,FA),Ot(FA))},onClose:()=>{Re=!1,setTimeout(M),V&&V()}})}}function pn(p){o("openJSONEditorModal",{path:p}),Re=!0,oe()({content:{json:Ke(g(eA),p)},path:p,onPatch:Ot,onClose:()=>{Re=!1,setTimeout(M)}})}function Fn(p,N){y(He,{text:p,onParse:J=>sf(J,V=>rf(V,w())),onRepair:_sA,onApply:N,onClose:M})}function Jn(){(function(p){C()||g(eA)===void 0||(Re=!0,pA()({id:c,json:g(eA),rootPath:p,onSort:N=>{var{operations:J,itemPath:V,direction:Z}=N;o("onSort",J,p,V,Z),Ot(J,(FA,te)=>({state:te,sortedColumn:{path:V,sortDirection:Z===-1?Pc.desc:Pc.asc}}))},onClose:()=>{Re=!1,setTimeout(M)}}))})([])}function ln(){ri({rootPath:[]})}function Pt(p){o("openFind",{findAndReplace:p}),y(mA,!1),y(sA,!1),io(),y(mA,!0),y(sA,p)}function $i(){if(!C()&&E().canUndo){var p=E().undo();if(uy(p)){var N={json:g(eA),text:g(UA)};y(eA,p.undo.patch?Da(g(eA),p.undo.patch):p.undo.json),y(kA,p.undo.documentState),y(DA,p.undo.selection),y(gt,p.undo.sortedColumn),y(UA,p.undo.text),y(Ve,p.undo.textIsRepaired),y(aA,void 0),o("undo",{item:p,json:g(eA)}),Lt(N,p.undo.patch&&p.redo.patch?{json:g(eA),previousJson:N.json,redo:p.undo.patch,undo:p.redo.patch}:void 0),M(),g(DA)&&dn(et(g(DA)),{scrollToWhenVisible:!1})}else gA()(p)}}function Rr(){if(!C()&&E().canRedo){var p=E().redo();if(uy(p)){var N={json:g(eA),text:g(UA)};y(eA,p.redo.patch?Da(g(eA),p.redo.patch):p.redo.json),y(kA,p.redo.documentState),y(DA,p.redo.selection),y(gt,p.redo.sortedColumn),y(UA,p.redo.text),y(Ve,p.redo.textIsRepaired),y(aA,void 0),o("redo",{item:p,json:g(eA)}),Lt(N,p.undo.patch&&p.redo.patch?{json:g(eA),previousJson:N.json,redo:p.redo.patch,undo:p.undo.patch}:void 0),M(),g(DA)&&dn(et(g(DA)),{scrollToWhenVisible:!1})}else QA()(p)}}function Ft(p){y(P,p.getBoundingClientRect().height)}fA(()=>(k(D()),k(L())),()=>{y(KA,V_({escapeControlCharacters:D(),escapeUnicodeCharacters:L()}))}),fA(()=>g(mA),()=>{(function(p){if(g(TA)){var N=p?_3:-100;g(TA).scrollTo({top:hc(TA,g(TA).scrollTop+=N),left:g(TA).scrollLeft})}})(g(mA))}),fA(()=>k(d()),()=>{(function(p){var N={json:g(eA)},J=H3(p)?p.text!==g(UA):!di(N.json,p.json);if(o("update external content",{isChanged:J}),J){var V={json:g(eA),documentState:g(kA),selection:g(DA),sortedColumn:g(gt),text:g(UA),textIsRepaired:g(Ve)};if(H3(p))try{y(eA,_()(p.text)),y(kA,Qc(g(eA),g(kA))),y(UA,p.text),y(Ve,!1),y(aA,void 0)}catch(Z){try{y(eA,_()(Rc(p.text))),y(kA,Qc(g(eA),g(kA))),y(UA,p.text),y(Ve,!0),y(aA,void 0)}catch{y(eA,void 0),y(kA,void 0),y(UA,p.text),y(Ve,!1),y(aA,g(UA)!==""?dQ(g(UA),Z.message||String(Z)):void 0)}}else y(eA,p.json),y(kA,Qc(g(eA),g(kA))),y(UA,void 0),y(Ve,!1),y(aA,void 0);Ee(g(eA)),y(gt,void 0),Ei(V)}})(d())}),fA(()=>k(B()),()=>{(function(p){di(g(DA),p)||(o("applyExternalSelection",{selection:g(DA),externalSelection:p}),q3(p)&&y(DA,p))})(B())}),fA(()=>(g(Le),g(eA),k(R()),g(_e)),()=>{y(Le,wo(g(eA))?function(p,N){var J=new Set(N.map(Ct)),V=new Set(p.map(Ct));for(var Z of J)V.has(Z)||J.delete(Z);for(var FA of V)J.has(FA)||J.add(FA);return[...J].map(ks)}(rJA(g(eA),R(),g(_e)),g(Le)):[])}),fA(()=>(g(eA),g(Le)),()=>{y(bt,!(!g(eA)||Oi(g(Le))))}),fA(()=>(g(eA),g(_e)),()=>{y(A,Array.isArray(g(eA))&&g(eA).length>g(_e))}),fA(()=>(g(X),g(P),g(eA),g(mA),_3),()=>{y(i,sJA(g(X),g(P),g(eA),Y,bA,g(mA)?_3:0))}),fA(()=>g(eA),()=>{g(eA),g(TA)&&g(TA).scrollTo({top:g(TA).scrollTop,left:g(TA).scrollLeft})}),fA(()=>g(DA),()=>{var p;p=g(DA),di(p,B())||(o("onSelect",p),j()(p))}),fA(()=>(k(C()),k(h()),k(w()),g(KA),g(eA),g(kA),k(BA())),()=>{y(rt,{mode:er.table,readOnly:C(),truncateTextSize:h(),parser:w(),normalization:g(KA),getJson:()=>g(eA),getDocumentState:()=>g(kA),findElement:kn,findNextInside:Tt,focus:M,onPatch:(p,N)=>Ot(function(J,V){return J.flatMap(Z=>{if(k8(Z)){var FA=ks(Z.path);if(FA.length>0){for(var te=[Z],re=Fi(FA);re.length>0&&!Ms(V,re);)te.unshift({op:"add",path:Ct(re),value:{}}),re=Fi(re);return te}}return Z})}(p,g(eA)),N),onSelect:Be,onFind:Pt,onPasteJson:ii,onRenderValue:BA()})}),fA(()=>(g(eA),k(K()),k(w()),k(z())),()=>{xe(g(eA),K(),w(),z())}),fA(()=>(g(tn),g(Le)),()=>{y(n,aJA(g(tn),g(Le)))}),Qn(),Zt(!0);var Xn=fTA();ce("mousedown",A2,function(p){!yQ(p.target,N=>N===g(CA))&&br(g(DA))&&(o("click outside the editor, exit edit mode"),y(DA,Hg(g(DA))),$t&&g(Ze)&&(g(Ze).focus(),g(Ze).blur()),o("blur (outside editor)"),g(Ze)&&g(Ze).blur())});var se,vi=vt(Xn),Yi=W(vi),rn=p=>{(function(N,J){mt(J,!1);var V=b(J,"containsValidArray",9),Z=b(J,"readOnly",9),FA=b(J,"showSearch",13,!1),te=b(J,"history",9),re=b(J,"onSort",9),Pe=b(J,"onTransform",9),ze=b(J,"onContextMenu",9),ye=b(J,"onUndo",9),Ge=b(J,"onRedo",9),Vi=b(J,"onRenderMenu",9);function T(){FA(!FA())}var oA=$(void 0,!0),YA=$(void 0,!0);fA(()=>(k(Z()),k(re()),k(V()),k(Pe()),k(ze()),k(ye()),k(te()),k(Ge())),()=>{y(oA,Z()?[{type:"space"}]:[{type:"button",icon:l4,title:"Sort",className:"jse-sort",onClick:re(),disabled:Z()||!V()},{type:"button",icon:s4,title:"Transform contents (filter, sort, project)",className:"jse-transform",onClick:Pe(),disabled:Z()||!V()},{type:"button",icon:g4,title:"Search (Ctrl+F)",className:"jse-search",onClick:T,disabled:!V()},{type:"button",icon:WS,title:AG,className:"jse-contextmenu",onClick:ze()},{type:"separator"},{type:"button",icon:h5,title:"Undo (Ctrl+Z)",className:"jse-undo",onClick:ye(),disabled:!te().canUndo},{type:"button",icon:Q5,title:"Redo (Ctrl+Shift+Z)",className:"jse-redo",onClick:Ge(),disabled:!te().canRedo},{type:"space"}])}),fA(()=>(k(Vi()),g(oA)),()=>{y(YA,Vi()(g(oA))||g(oA))}),Qn(),Zt(!0),Oy(N,{get items(){return g(YA)}}),pt()})(p,{get containsValidArray(){return g(bt)},get readOnly(){return C()},get history(){return E()},onSort:Jn,onTransform:ln,onUndo:$i,onRedo:Rr,onContextMenu:vo,get onRenderMenu(){return lA()},get showSearch(){return g(mA)},set showSearch(N){y(mA,N)},$$legacy:!0})};LA(Yi,p=>{u()&&p(rn)});var Hr=IA(Yi,2),Ri=p=>{var N=hTA(),J=vt(N),V=W(J);V.readOnly=!0,Co(V,re=>y(Ze,re),()=>g(Ze));var Z=IA(J,2),FA=re=>{var Pe=ETA(),ze=vt(Pe);MaA(W(ze),{get json(){return g(eA)},get documentState(){return g(kA)},get parser(){return w()},get showSearch(){return g(mA)},get showReplace(){return g(sA)},get readOnly(){return C()},get columns(){return g(Le)},onSearch:xt,onFocus:tt,onPatch:Ot,onClose:Dt});var ye=IA(ze,2),Ge=W(ye),Vi=W(Ge),T=W(Vi),oA=W(T),YA=W(oA),pe=st=>{var si=_o(),Eo=qA(()=>(k(XE),g(n),nA(()=>{var So;return XE([],(So=g(n))===null||So===void 0?void 0:So.root)}))),xr=vt(si),Hn=So=>{var zr=aTA();gQ(W(zr),{get validationError(){return g(Eo)},get onExpand(){return Oc}}),iA(So,zr)};LA(xr,So=>{g(Eo)&&So(Hn)}),iA(st,si)};LA(YA,st=>{k(Oi),g(n),nA(()=>{var si;return!Oi((si=g(n))===null||si===void 0?void 0:si.root)})&&st(pe)});var he=IA(oA);qo(he,1,()=>g(Le),or,(st,si)=>{var Eo=cTA();(function(xr,Hn){mt(Hn,!1);var So=$(void 0,!0),zr=$(void 0,!0),t0=$(void 0,!0),Ta=b(Hn,"path",9),Wc=b(Hn,"sortedColumn",9),Hl=b(Hn,"readOnly",9),Xc=b(Hn,"onSort",9);fA(()=>(k(Ta()),Ka),()=>{y(So,Oi(Ta())?"values":Ka(Ta()))}),fA(()=>(k(Wc()),k(Ta())),()=>{var $n;y(zr,Wc()&&di(Ta(),($n=Wc())===null||$n===void 0?void 0:$n.path)?Wc().sortDirection:void 0)}),fA(()=>(g(zr),orA),()=>{y(t0,g(zr)?orA[g(zr)]:void 0)}),Qn(),Zt(!0);var Or,Pr=WJA(),Ha=W(Pr),i0=W(Ha),za=IA(Ha,2),Ko=$n=>{var Zo=ZJA(),zl=W(Zo),Id=qA(()=>(g(zr),k(Pc),k(mg),k(VS),nA(()=>g(zr)===Pc.asc?mg:VS)));ji(zl,{get data(){return g(Id)}}),De(()=>En(Zo,"title","Currently sorted in ".concat(g(t0)," order"))),iA($n,Zo)};LA(za,$n=>{g(zr)!==void 0&&$n(Ko)}),De(($n,Zo)=>{Or=Vt(Pr,1,"jse-column-header svelte-2i3vdx",null,Or,$n),En(Pr,"title",Hl()?g(So):g(So)+" (Click to sort the data by this column)"),wt(i0,Zo)},[()=>({"jse-readonly":Hl()}),()=>(k(V0),g(So),k(50),nA(()=>V0(g(So),50)))],qA),ce("click",Pr,function(){Hl()||Xc()({path:Ta(),sortDirection:g(zr)===Pc.asc?Pc.desc:Pc.asc})}),iA(xr,Pr),pt()})(W(Eo),{get path(){return g(si)},get sortedColumn(){return g(gt)},get readOnly(){return C()},onSort:ZA}),iA(st,Eo)});var ge=IA(he),Bt=st=>{var si=lTA(),Eo=W(si),xr=qA(()=>(g(eA),nA(()=>Array.isArray(g(eA))?g(eA).length:0)));(function(Hn,So){mt(So,!1);var zr=b(So,"count",9),t0=b(So,"maxSampleCount",9),Ta=b(So,"readOnly",9),Wc=b(So,"onRefresh",9);Zt(!0);var Hl,Xc=sTA();ji(W(Xc),{get data(){return qW}}),De(Or=>{Hl=Vt(Xc,1,"jse-column-header svelte-fzj761",null,Hl,Or),En(Xc,"title","The Columns are created by sampling ".concat(t0()," items out of ").concat(zr(),". ")+"If you're missing a column, click here to sample all of the items instead of a subset. This is slower.")},[()=>({"jse-readonly":Ta()})],qA),ce("click",Xc,()=>Wc()()),iA(Hn,Xc),pt()})(Eo,{get count(){return g(xr)},get maxSampleCount(){return g(_e)},get readOnly(){return C()},onRefresh:()=>y(_e,1/0)}),iA(st,si)};LA(ge,st=>{g(A)&&st(Bt)});var $e,bi,un=IA(T),Ji=W(un),Tn=IA(un);qo(Tn,1,()=>(g(i),nA(()=>g(i).visibleItems)),or,(st,si,Eo)=>{var xr=BTA(),Hn=qA(()=>(g(i),nA(()=>g(i).startIndex+Eo))),So=qA(()=>(g(n),k(g(Hn)),nA(()=>g(n).rows[g(Hn)]))),zr=qA(()=>(k(XE),k(g(Hn)),k(g(So)),nA(()=>{var Or;return XE([String(g(Hn))],(Or=g(So))===null||Or===void 0?void 0:Or.row)}))),t0=qA(()=>(k(Jg),g(eA),g(Ue),k(g(Hn)),nA(()=>Jg(g(eA),g(Ue),[String(g(Hn))])))),Ta=W(xr);vsA(Ta,()=>g(Hn),Or=>{var Pr=gTA(),Ha=W(Pr),i0=IA(Ha),za=Ko=>{gQ(Ko,{get validationError(){return g(zr)},get onExpand(){return Oc}})};LA(i0,Ko=>{g(zr)&&Ko(za)}),Us(Pr,(Ko,$n)=>ny?.(Ko,$n),()=>Ko=>function($n,Zo){Y[Zo]=$n.getBoundingClientRect().height}(Ko,g(Hn))),De(()=>{var Ko;return wt(Ha,"".concat((Ko=g(Hn))!==null&&Ko!==void 0?Ko:""," "))}),iA(Or,Pr)});var Wc=IA(Ta);qo(Wc,1,()=>g(Le),or,(Or,Pr,Ha,i0)=>{var za,Ko=CTA(),$n=qA(()=>(k(g(Hn)),g(Pr),nA(()=>[String(g(Hn))].concat(g(Pr))))),Zo=qA(()=>(k(Ke),g(si),g(Pr),nA(()=>Ke(g(si),g(Pr))))),zl=qA(()=>(k(an),g(DA),k(Pg),k(g($n)),nA(()=>an(g(DA))&&Pg(g(DA).path,g($n))))),Id=qA(()=>(k(g(So)),nA(()=>{var rr;return(rr=g(So))===null||rr===void 0?void 0:rr.columns[Ha]}))),Cd=qA(()=>(k(XE),k(g($n)),k(g(Id)),nA(()=>XE(g($n),g(Id))))),JQ=W(Ko),dd=W(JQ),TQ=rr=>{var ta=qA(()=>(k(wy),k(Jg),g(si),k(g(t0)),g(Pr),nA(()=>wy(Jg(g(si),g(t0),g(Pr)))))),HQ=qA(()=>(k(g(ta)),nA(()=>!!g(ta)&&g(ta).some(aI=>aI.active)))),zQ=qA(()=>(k(Oi),k(g(ta)),nA(()=>!Oi(g(ta)))));(function(aI,is){mt(is,!1);var OQ=b(is,"path",9),OU=b(is,"value",9),PU=b(is,"parser",9),LgA=b(is,"isSelected",9),FgA=b(is,"containsSearchResult",9),NgA=b(is,"containsActiveSearchResult",9),_gA=b(is,"onEdit",9);Zt(!0);var jU,Hf=VJA(),GgA=W(Hf);De((PQ,UgA)=>{jU=Vt(Hf,1,"jse-inline-value svelte-h57m0p",null,jU,PQ),wt(GgA,UgA)},[()=>({"jse-selected":LgA(),"jse-highlight":FgA(),"jse-active":NgA()}),()=>(k(V0),k(PU()),k(OU()),k(50),nA(()=>{var PQ;return V0((PQ=PU().stringify(OU()))!==null&&PQ!==void 0?PQ:"",50)}))],qA),ce("dblclick",Hf,()=>_gA()(OQ())),iA(aI,Hf),pt()})(rr,{get path(){return g($n)},get value(){return g(Zo)},get parser(){return w()},get isSelected(){return g(zl)},get containsSearchResult(){return g(zQ)},get containsActiveSearchResult(){return g(HQ)},onEdit:pn})},U7=rr=>{var ta=qA(()=>(k(Jg),g(eA),g(Ue),k(g($n)),nA(()=>{var is;return(is=Jg(g(eA),g(Ue),g($n)))===null||is===void 0?void 0:is.searchResults}))),HQ=qA(()=>g(Zo)!==void 0?g(Zo):""),zQ=qA(()=>(k(zg),g(eA),g(kA),k(g($n)),nA(()=>zg(g(eA),g(kA),g($n))))),aI=qA(()=>g(zl)?g(DA):void 0);vaA(rr,{get path(){return g($n)},get value(){return g(HQ)},get enforceString(){return g(zQ)},get selection(){return g(aI)},get searchResultItems(){return g(ta)},get context(){return g(rt)}})};LA(dd,rr=>{k(No),k(g(Zo)),nA(()=>No(g(Zo)))?rr(TQ):rr(U7,!1)});var K7=IA(dd),Y7=rr=>{var ta=ITA();_1(W(ta),{selected:!0,onContextMenu:Wn}),iA(rr,ta)};LA(K7,rr=>{k(C()),k(g(zl)),k(br),g(DA),nA(()=>!C()&&g(zl)&&!br(g(DA)))&&rr(Y7)});var Ol=IA(JQ,2),sI=rr=>{gQ(rr,{get validationError(){return g(Cd)},get onExpand(){return Oc}})};LA(Ol,rr=>{g(Cd)&&rr(sI)}),De((rr,ta)=>{En(Ko,"data-path",rr),za=Vt(JQ,1,"jse-value-outer svelte-u14cgx",null,za,ta)},[()=>(k(sy),k(g($n)),nA(()=>sy(g($n)))),()=>({"jse-selected-value":g(zl)})],qA),iA(Or,Ko)});var Hl=IA(Wc),Xc=Or=>{iA(Or,dTA())};LA(Hl,Or=>{g(A)&&Or(Xc)}),iA(st,xr)});var Ht,ko=W(IA(Tn));Co(ye,st=>y(TA,st),()=>g(TA)),Us(ye,(st,si)=>ny?.(st,si),()=>Ft),es(()=>ce("scroll",ye,We));var Sn=IA(ye,2),no=st=>{var si=qA(()=>(g(le),nA(()=>"You pasted a JSON ".concat(Array.isArray(g(le).contents)?"array":"object"," as text")))),Eo=qA(()=>[{icon:L0,text:"Paste as JSON instead",title:"Paste the text as JSON instead of a single value",onMouseDown:ne},{text:"Leave as is",title:"Keep the pasted content as a single value",onClick:Xe}]);mc(st,{type:"info",get message(){return g(si)},get actions(){return g(Eo)}})};LA(Sn,st=>{g(le)&&st(no)});var gn=IA(Sn,2),Nt=st=>{var si=qA(()=>[{icon:L0,text:"Paste as string instead",title:"Paste the clipboard data as a single string value instead of an array",onClick:nt},{text:"Leave as is",title:"Keep the pasted array",onClick:oi}]);mc(st,{type:"info",message:"Multiline text was pasted as array",get actions(){return g(si)}})};LA(gn,st=>{g(SA)&&st(Nt)});var Zi=IA(gn,2),_t=st=>{var si=qA(()=>C()?[]:[{icon:u5,text:"Ok",title:"Accept the repaired document",onClick:pi},{icon:a4,text:"Repair manually instead",title:"Leave the document unchanged and repair it manually instead",onClick:Di}]);mc(st,{type:"success",message:"The loaded JSON document was invalid but is successfully repaired.",get actions(){return g(si)},onClose:M})};LA(Zi,st=>{g(Ve)&&st(_t)}),dG(IA(Zi,2),{get validationErrors(){return g(tn)},selectError:yi}),De((st,si,Eo)=>{$e=Vt(un,1,"jse-table-invisible-start-section svelte-u14cgx",null,$e,st),En(Ji,"colspan",(g(Le),nA(()=>g(Le).length))),bi=Ll(Ji,"",bi,si),En(ko,"colspan",(g(Le),nA(()=>g(Le).length))),Ht=Ll(ko,"",Ht,Eo)},[()=>({"jse-search-box-background":g(mA)}),()=>({height:(g(i),nA(()=>g(i).startHeight+"px"))}),()=>({height:(g(i),nA(()=>g(i).endHeight+"px"))})],qA),iA(re,Pe)},te=(re,Pe)=>{var ze=Ge=>{var Vi=QTA(),T=vt(Vi),oA=qA(()=>C()?[]:[{icon:a4,text:"Repair manually",title:'Open the document in "code" mode and repair it manually',onClick:Di}]);mc(T,{type:"error",message:"The loaded JSON document is invalid and could not be repaired automatically.",get actions(){return g(oA)}}),_aA(IA(T,2),{get text(){return g(UA)},get json(){return g(eA)},get indentation(){return U()},get parser(){return w()}}),iA(Ge,Vi)},ye=Ge=>{rTA(Ge,{get text(){return g(UA)},get json(){return g(eA)},get readOnly(){return C()},get parser(){return w()},openJSONEditorModal:pn,extractPath:Mt,get onChangeMode(){return q()},onClick:()=>{M()}})};LA(re,Ge=>{g(aA)&&g(UA)!==void 0&&g(UA)!==""?Ge(ze):Ge(ye,!1)},Pe)};LA(Z,re=>{g(bt)?re(FA):re(te,!1)}),ce("paste",V,EA),iA(p,N)},fs=p=>{iA(p,uTA())};LA(Hr,p=>{I?p(fs,!1):p(Ri)}),Co(vi,p=>y(CA,p),()=>g(CA));var Bo=IA(vi,2),Q=p=>{DaA(p,{onClose:()=>y(x,!1)})};LA(Bo,p=>{g(x)&&p(Q)});var m=IA(Bo,2),v=p=>{yaA(p,z1(()=>g(He),{onClose:()=>{var N;(N=g(He))===null||N===void 0||N.onClose(),y(He,void 0)}}))};return LA(m,p=>{g(He)&&p(v)}),De(p=>se=Vt(vi,1,"jse-table-mode svelte-u14cgx",null,se,p),[()=>({"no-main-menu":!u()})],qA),ce("mousedown",vi,function(p){if(p.buttons===1||p.buttons===2){var N=p.target;N.isContentEditable||M();var J=PsA(N);if(J){if(br(g(DA))&&V3(g(eA),g(DA),J))return;y(DA,Ni(J)),p.preventDefault()}}}),ce("keydown",vi,function(p){var N=n2(p);if(o("keydown",{combo:N,key:p.key}),N==="Ctrl+X"&&(p.preventDefault(),Ut(!0)),N==="Ctrl+Shift+X"&&(p.preventDefault(),Ut(!1)),N==="Ctrl+C"&&(p.preventDefault(),ft(!0)),N==="Ctrl+Shift+C"&&(p.preventDefault(),ft(!1)),N==="Ctrl+D"&&(p.preventDefault(),on()),N!=="Delete"&&N!=="Backspace"||(p.preventDefault(),ot()),N==="Insert"&&p.preventDefault(),N==="Ctrl+A"&&p.preventDefault(),N==="Ctrl+Q"&&Vo(p),N==="ArrowLeft"&&(p.preventDefault(),ni(),g(DA))){var J=function(Pe,ze){var{rowIndex:ye,columnIndex:Ge}=zc(et(ze),Pe);return Ge>0?Ni(YC({rowIndex:ye,columnIndex:Ge-1},Pe)):ze}(g(Le),g(DA));y(DA,J),Uo(et(J))}if(N==="ArrowRight"&&(p.preventDefault(),ni(),g(DA))){var V=function(Pe,ze){var{rowIndex:ye,columnIndex:Ge}=zc(et(ze),Pe);return Ge0?Ni(YC({rowIndex:ye-1,columnIndex:Ge},Pe)):ze}(g(Le),g(DA));y(DA,Z),Uo(et(Z))}if(N==="ArrowDown"&&(p.preventDefault(),ni(),g(DA))){var FA=function(Pe,ze,ye){var{rowIndex:Ge,columnIndex:Vi}=zc(et(ye),ze);return Gey(KA,x)}).get()),CA=$(a());function TA(x){if(grA(x)){y(CA,x.undo.mode);var Y=g(KA).items(),P=Y.findIndex(bA=>bA===x),X=P!==-1?Y[P-1]:void 0;oe("handleUndo",{index:P,item:x,items:Y,prevItem:X}),X&&i(X.redo.selection),K()(g(CA))}}function Ze(x){if(grA(x)){y(CA,x.redo.mode);var Y=g(KA).items(),P=Y.findIndex(bA=>bA===x),X=P!==-1?Y[P+1]:void 0;oe("handleRedo",{index:P,item:x,items:Y,nextItem:X}),X&&i(X.undo.selection),K()(g(CA))}}var He=$(),uA={type:"separator"},eA=$(),UA=$();function aA(x){if(g(cA))return g(cA).patch(x);if(g(pA))return g(pA).patch(x);if(g(VA))return g(VA).patch(x);throw new Error('Method patch is not available in mode "'.concat(g(CA),'"'))}function le(x,Y){if(g(cA))return g(cA).expand(x,Y);throw new Error('Method expand is not available in mode "'.concat(g(CA),'"'))}function SA(x,Y){if(g(cA))return g(cA).collapse(x,Y);throw new Error('Method collapse is not available in mode "'.concat(g(CA),'"'))}function Ue(x){if(g(VA))g(VA).openTransformModal(x);else if(g(cA))g(cA).openTransformModal(x);else{if(!g(pA))throw new Error('Method transform is not available in mode "'.concat(g(CA),'"'));g(pA).openTransformModal(x)}}function mA(){if(g(VA))return g(VA).validate();if(g(cA))return g(cA).validate();if(g(pA))return g(pA).validate();throw new Error('Method validate is not available in mode "'.concat(g(CA),'"'))}function sA(){return g(cA)?g(cA).acceptAutoRepair():A()}function xt(x){if(g(cA))return g(cA).scrollTo(x);if(g(pA))return g(pA).scrollTo(x);throw new Error('Method scrollTo is not available in mode "'.concat(g(CA),'"'))}function tt(x){if(g(cA))return g(cA).findElement(x);if(g(pA))return g(pA).findElement(x);throw new Error('Method findElement is not available in mode "'.concat(g(CA),'"'))}function de(){g(VA)?g(VA).focus():g(cA)?g(cA).focus():g(pA)&&g(pA).focus()}function Dt(){return _e.apply(this,arguments)}function _e(){return(_e=Yt(function*(){g(VA)&&(yield g(VA).refresh())})).apply(this,arguments)}fA(()=>k(a()),()=>{(function(x){if(x!==g(CA)){var Y={type:"mode",undo:{mode:g(CA),selection:void 0},redo:{mode:x,selection:void 0}};g(CA)==="text"&&g(VA)&&g(VA).flush(),oe("add history item",Y),g(KA).add(Y),y(CA,x)}})(a())}),fA(()=>(g(CA),k(K())),()=>{y(He,[{type:"button",text:"text",title:"Switch to text mode (current mode: ".concat(g(CA),")"),className:"jse-group-button jse-first"+(g(CA)===er.text?" jse-selected":""),onClick:()=>K()(er.text)},{type:"button",text:"tree",title:"Switch to tree mode (current mode: ".concat(g(CA),")"),className:"jse-group-button "+(g(CA)===er.tree?" jse-selected":""),onClick:()=>K()(er.tree)},{type:"button",text:"table",title:"Switch to table mode (current mode: ".concat(g(CA),")"),className:"jse-group-button jse-last"+(g(CA)===er.table?" jse-selected":""),onClick:()=>K()(er.table)}])}),fA(()=>(g(He),k(q()),g(CA),k(w()),k(n())),()=>{y(eA,x=>{var Y=p_(x[0])?g(He).concat(x):g(He).concat(uA,x),P=i4(Y);return q()(Y,{mode:g(CA),modal:w(),readOnly:n()})||P})}),fA(()=>(k(j()),g(CA),k(w()),k(n()),k(i())),()=>{y(UA,x=>{var Y,P=i4(x);return(Y=j()(x,{mode:g(CA),modal:w(),readOnly:n(),selection:i()}))!==null&&Y!==void 0?Y:!n()&&P})}),Qn(),Zt();var Le=_o(),bt=vt(Le),Re=x=>{Co(qJA(x,{get externalContent(){return A()},get externalSelection(){return i()},get history(){return g(KA)},get readOnly(){return n()},get indentation(){return o()},get tabSize(){return r()},get mainMenuBar(){return c()},get statusBar(){return I()},get askToFormat(){return C()},get escapeUnicodeCharacters(){return B()},get parser(){return h()},get validator(){return D()},get validationParser(){return L()},get onChange(){return _()},get onChangeMode(){return K()},get onSelect(){return z()},onUndo:TA,onRedo:Ze,get onError(){return gA()},get onFocus(){return QA()},get onBlur(){return BA()},get onRenderMenu(){return g(eA)},get onSortModal(){return lA()},get onTransformModal(){return vA()},$$legacy:!0}),Y=>y(VA,Y),()=>g(VA))},$t=(x,Y)=>{var P=bA=>{Co(mTA(bA,{get externalContent(){return A()},get externalSelection(){return i()},get history(){return g(KA)},get readOnly(){return n()},get truncateTextSize(){return s()},get mainMenuBar(){return c()},get escapeControlCharacters(){return d()},get escapeUnicodeCharacters(){return B()},get flattenColumns(){return E()},get parser(){return h()},get parseMemoizeOne(){return u()},get validator(){return D()},get validationParser(){return L()},get indentation(){return o()},get onChange(){return _()},get onChangeMode(){return K()},get onSelect(){return z()},onUndo:TA,onRedo:Ze,get onRenderValue(){return U()},get onFocus(){return QA()},get onBlur(){return BA()},get onRenderMenu(){return g(eA)},get onRenderContextMenu(){return g(UA)},get onSortModal(){return lA()},get onTransformModal(){return vA()},get onJSONEditorModal(){return tA()},$$legacy:!0}),Be=>y(pA,Be),()=>g(pA))},X=bA=>{Co(U_(bA,{get externalContent(){return A()},get externalSelection(){return i()},get history(){return g(KA)},get readOnly(){return n()},get indentation(){return o()},get truncateTextSize(){return s()},get mainMenuBar(){return c()},get navigationBar(){return l()},get escapeControlCharacters(){return d()},get escapeUnicodeCharacters(){return B()},get parser(){return h()},get parseMemoizeOne(){return u()},get validator(){return D()},get validationParser(){return L()},get pathParser(){return R()},get onError(){return gA()},get onChange(){return _()},get onChangeMode(){return K()},get onSelect(){return z()},onUndo:TA,onRedo:Ze,get onRenderValue(){return U()},get onClassName(){return H()},get onFocus(){return QA()},get onBlur(){return BA()},get onRenderMenu(){return g(eA)},get onRenderContextMenu(){return g(UA)},get onSortModal(){return lA()},get onTransformModal(){return vA()},get onJSONEditorModal(){return tA()},$$legacy:!0}),Be=>y(cA,Be),()=>g(cA))};LA(x,bA=>{g(CA),k(er),nA(()=>g(CA)===er.table)?bA(P):bA(X,!1)},Y)};return LA(bt,x=>{g(CA),k(er),nA(()=>g(CA)===er.text||String(g(CA))==="code")?x(Re):x($t,!1)}),iA(t,Le),zt(e,"patch",aA),zt(e,"expand",le),zt(e,"collapse",SA),zt(e,"transform",Ue),zt(e,"validate",mA),zt(e,"acceptAutoRepair",sA),zt(e,"scrollTo",xt),zt(e,"findElement",tt),zt(e,"focus",de),zt(e,"refresh",Dt),pt({patch:aA,expand:le,collapse:SA,transform:Ue,validate:mA,acceptAutoRepair:sA,scrollTo:xt,findElement:tt,focus:de,refresh:Dt})}Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-modal-wrapper.svelte-v0el4e { - flex: 1; - display: flex; - min-width: 0; - min-height: 0; - flex-direction: column; -} -.jse-modal-wrapper.svelte-v0el4e .jse-modal-contents:where(.svelte-v0el4e) { - flex: 1; - display: flex; - flex-direction: column; - padding: 20px; - overflow: auto; - min-width: 0; - min-height: 0; -} -.jse-modal-wrapper.svelte-v0el4e .jse-modal-contents:where(.svelte-v0el4e) .jse-actions:where(.svelte-v0el4e) { - display: flex; - flex-direction: row; - justify-content: flex-end; - padding-top: var(--jse-padding, 10px); -} -.jse-modal-wrapper.svelte-v0el4e .jse-modal-contents:where(.svelte-v0el4e) .jse-actions:where(.svelte-v0el4e) button.jse-primary:where(.svelte-v0el4e) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); - color: var(--jse-button-primary-color, #fff); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-modal-wrapper.svelte-v0el4e .jse-modal-contents:where(.svelte-v0el4e) .jse-actions:where(.svelte-v0el4e) button.jse-primary:where(.svelte-v0el4e):hover { - background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); -} -.jse-modal-wrapper.svelte-v0el4e .jse-modal-contents:where(.svelte-v0el4e) .jse-actions:where(.svelte-v0el4e) button.jse-primary:where(.svelte-v0el4e):disabled { - background: var(--jse-button-primary-background-disabled, #9d9d9d); -} -.jse-modal-wrapper.svelte-v0el4e .jse-modal-contents:where(.svelte-v0el4e) .jse-label:where(.svelte-v0el4e) { - font-weight: bold; - display: block; - box-sizing: border-box; -} -.jse-modal-wrapper.svelte-v0el4e .jse-modal-contents:where(.svelte-v0el4e) .jse-label:where(.svelte-v0el4e) .jse-label-inner:where(.svelte-v0el4e) { - margin-top: calc(2 * var(--jse-padding, 10px)); - margin-bottom: calc(0.5 * var(--jse-padding, 10px)); - box-sizing: border-box; -} -.jse-modal-wrapper.svelte-v0el4e .jse-modal-contents:where(.svelte-v0el4e) .jse-modal-inline-editor:where(.svelte-v0el4e) { - flex: 1; - min-height: 150px; - min-width: 0; - max-width: 100%; - display: flex; - --jse-theme-color: var(--jse-modal-editor-theme-color, #707070); - --jse-theme-color-highlight: var(--jse-modal-editor-theme-color-highlight, #646464); -} -.jse-modal-wrapper.svelte-v0el4e .jse-actions:where(.svelte-v0el4e) { - gap: var(--jse-padding, 10px); - align-items: center; -} -.jse-modal-wrapper.svelte-v0el4e .jse-actions:where(.svelte-v0el4e) .jse-error:where(.svelte-v0el4e) { - flex: 1; - color: var(--jse-error-color, #ee5341); -} -.jse-modal-wrapper.svelte-v0el4e .jse-actions:where(.svelte-v0el4e) button.jse-secondary:where(.svelte-v0el4e) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-secondary-background, #d3d3d3); - color: var(--jse-button-secondary-color, var(--jse-text-color, #4d4d4d)); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-modal-wrapper.svelte-v0el4e .jse-actions:where(.svelte-v0el4e) button.jse-secondary:where(.svelte-v0el4e):hover { - background: var(--jse-button-secondary-background-highlight, #e1e1e1); -} -.jse-modal-wrapper.svelte-v0el4e .jse-actions:where(.svelte-v0el4e) button.jse-secondary:where(.svelte-v0el4e):disabled { - background: var(--jse-button-secondary-background-disabled, #9d9d9d); -} -.jse-modal-wrapper.svelte-v0el4e input:where(.svelte-v0el4e) { - border: var(--jse-input-border, 1px solid #d8dbdf); - outline: none; - box-sizing: border-box; - padding: calc(0.5 * var(--jse-padding, 10px)); - font-family: var(--jse-font-family-mono, consolas, menlo, monaco, "Ubuntu Mono", "source-code-pro", monospace); - font-size: var(--jse-font-size-mono, 14px); - color: inherit; - background: var(--jse-input-background, var(--jse-background-color, #fff)); -} -.jse-modal-wrapper.svelte-v0el4e input:where(.svelte-v0el4e):focus { - border: var(--jse-input-border-focus, 1px solid var(--jse-input-border-focus, var(--jse-theme-color, #3883fa))); -} -.jse-modal-wrapper.svelte-v0el4e input:where(.svelte-v0el4e):read-only { - background: var(--jse-input-background-readonly, transparent); -}`);var pTA=wA('
        '),wTA=wA(''),DTA=wA(''),yTA=wA(''),vTA=wA('
        Path
        Contents
        ',1),bTA=wA('
        '),MTA={};Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-modal-contents.svelte-1v9c92j { - flex: 1; - display: flex; - flex-direction: column; - padding: 20px; - overflow: auto; - min-width: 0; - min-height: 0; -} -.jse-modal-contents.svelte-1v9c92j .jse-actions:where(.svelte-1v9c92j) { - display: flex; - flex-direction: row; - justify-content: flex-end; - padding-top: var(--jse-padding, 10px); -} -.jse-modal-contents.svelte-1v9c92j .jse-actions:where(.svelte-1v9c92j) button.jse-primary:where(.svelte-1v9c92j) { - border: none; - background: transparent; - color: inherit; - cursor: pointer; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - padding: 5px; - margin: 0; - background: var(--jse-button-primary-background, var(--jse-theme-color, #3883fa)); - color: var(--jse-button-primary-color, #fff); - padding: var(--jse-padding, 10px) calc(2 * var(--jse-padding, 10px)); - border-radius: 3px; -} -.jse-modal-contents.svelte-1v9c92j .jse-actions:where(.svelte-1v9c92j) button.jse-primary:where(.svelte-1v9c92j):hover { - background: var(--jse-button-primary-background-highlight, var(--jse-theme-color-highlight, #5f9dff)); -} -.jse-modal-contents.svelte-1v9c92j .jse-actions:where(.svelte-1v9c92j) button.jse-primary:where(.svelte-1v9c92j):disabled { - background: var(--jse-button-primary-background-disabled, #9d9d9d); -} -.jse-modal-contents.svelte-1v9c92j table:where(.svelte-1v9c92j) { - width: 100%; - border-collapse: collapse; - border-spacing: 0; -} -.jse-modal-contents.svelte-1v9c92j table:where(.svelte-1v9c92j) th:where(.svelte-1v9c92j), -.jse-modal-contents.svelte-1v9c92j table:where(.svelte-1v9c92j) td:where(.svelte-1v9c92j) { - text-align: left; - vertical-align: middle; - font-weight: normal; - padding-bottom: var(--jse-padding, 10px); -} -.jse-modal-contents.svelte-1v9c92j input.jse-path:where(.svelte-1v9c92j) { - width: 100%; - box-sizing: border-box; - padding: 5px 10px; - border: var(--jse-input-border, 1px solid #d8dbdf); - border-radius: var(--jse-input-radius, 3px); - font-family: inherit; - font-size: inherit; - background: inherit; - background: var(--jse-input-background-readonly, transparent); - color: inherit; - outline: none; -} -.jse-modal-contents.svelte-1v9c92j .svelte-select input { - box-sizing: border-box; -} -.jse-modal-contents.svelte-1v9c92j .jse-space:where(.svelte-1v9c92j) { - height: 200px; -} -.jse-modal-contents.svelte-1v9c92j .jse-space:where(.svelte-1v9c92j) .jse-error:where(.svelte-1v9c92j) { - color: var(--jse-error-color, #ee5341); -}`);var AQ=Gy(()=>MTA),kTA=wA('Property'),STA=wA('
        '),RTA=wA('
        Path
        Direction
        ',1);Jt(`/* over all fonts, sizes, and colors */ -/* "consolas" for Windows, "menlo" for Mac with fallback to "monaco", 'Ubuntu Mono' for Ubuntu */ -/* (at Mac this font looks too large at 14px, but 13px is too small for the font on Windows) */ -/* main, menu, modal */ -/* jsoneditor modal */ -/* tooltip in text mode */ -/* panels: navigation bar, gutter, search box */ -/* navigation-bar */ -/* context menu */ -/* contents: json key and values */ -/* contents: selected or hovered */ -/* contents: section of collapsed items in an array */ -/* contents: highlighting of search matches */ -/* contents: inline tags inside the JSON document */ -/* contents: table */ -/* controls in modals: inputs, buttons, and \`a\` */ -/* messages */ -/* svelte-select */ -/* color picker */ -.jse-main.svelte-57bmz4 { - width: 100%; - height: 100%; - min-width: 0; - min-height: 150px; - font-family: var(--jse-font-family, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif); - font-size: var(--jse-font-size, 16px); - line-height: normal; - position: relative; - display: flex; - flex-direction: row; -} -.jse-main.svelte-57bmz4:not(.jse-focus) { - --jse-selection-background-color: var(--jse-selection-background-inactive-color, #e8e8e8); - --jse-context-menu-pointer-background: var(--jse-context-menu-pointer-hover-background, #b2b2b2); -}`);var xTA=wA('
        ',1);function LTA(t,e){mt(e,!1);var A=$(void 0,!0),i=Sr("jsoneditor:JSONEditor"),n={text:""},o=void 0,r=!1,s=er.tree,a=!0,c=!0,l=!0,I=!0,C=!1,d=!1,B=!0,E=JSON,h=void 0,u=JSON,D={parse:SUA,stringify:Ka},L=[VGA],R=L[0].id,w=Oc,_=void 0,K=void 0,z=kUA,U=Oc,H=Oc,q=Oc,j=Oc,gA=ne=>{console.error(ne),alert(ne.toString())},QA=Oc,BA=Oc,lA=b(e,"content",13,n),vA=b(e,"selection",13,o),tA=b(e,"readOnly",13,r),cA=b(e,"indentation",13,2),pA=b(e,"tabSize",13,4),VA=b(e,"truncateTextSize",13,1e3),oe=b(e,"mode",13,s),KA=b(e,"mainMenuBar",13,a),CA=b(e,"navigationBar",13,c),TA=b(e,"statusBar",13,l),Ze=b(e,"askToFormat",13,I),He=b(e,"escapeControlCharacters",13,C),uA=b(e,"escapeUnicodeCharacters",13,d),eA=b(e,"flattenColumns",13,B),UA=b(e,"parser",13,E),aA=b(e,"validator",13,h),le=b(e,"validationParser",13,u),SA=b(e,"pathParser",13,D),Ue=b(e,"queryLanguages",13,L),mA=b(e,"queryLanguageId",13,R),sA=b(e,"onChangeQueryLanguage",13,w),xt=b(e,"onChange",13,_),tt=b(e,"onSelect",13,K),de=b(e,"onRenderValue",13,z),Dt=b(e,"onClassName",13,U),_e=b(e,"onRenderMenu",13,H),Le=b(e,"onRenderContextMenu",13,q),bt=b(e,"onChangeMode",13,j),Re=b(e,"onError",13,gA),$t=b(e,"onFocus",13,QA),x=b(e,"onBlur",13,BA),Y=$(nQ(),!0),P=$(!1,!0),X=$(void 0,!0),bA=$(void 0,!0),Be=$(void 0,!0),Ee=$(void 0,!0),kA=$(UA(),!0);function DA(){return lA()}function gt(ne){i("set");var wi=HN(ne);if(wi)throw new Error(wi);y(Y,nQ()),lA(ne),io()}function Ve(ne){i("update");var wi=HN(ne);if(wi)throw new Error(wi);lA(ne),io()}function ZA(ne){var wi=g(X).patch(ne);return io(),wi}function rt(ne){vA(ne),io()}function Ei(ne,wi){g(X).expand(ne,wi),io()}function tn(ne){var wi=arguments.length>1&&arguments[1]!==void 0&&arguments[1];g(X).collapse(ne,wi),io()}function qi(){var ne=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};g(X).transform(ne),io()}function xe(){return g(X).validate()}function nn(){var ne=g(X).acceptAutoRepair();return io(),ne}function mi(ne){return Ot.apply(this,arguments)}function Ot(){return(Ot=Yt(function*(ne){yield g(X).scrollTo(ne)})).apply(this,arguments)}function Lt(ne){return g(X).findElement(ne)}function ii(){g(X).focus(),io()}function _i(){return Tt.apply(this,arguments)}function Tt(){return(Tt=Yt(function*(){yield g(X).refresh()})).apply(this,arguments)}function M(ne){var wi,MA,me,nt,Wt,Xe,oi,Di,Ut,cn,ft,Qi,ot,Mt,on,hn,Ai,Ki,dt,EA,HA,ve,Qt,yi,ri,pn,Fn,Jn,ln,Pt,$i,Rr=Object.keys(ne);for(var Ft of Rr)switch(Ft){case"content":lA((wi=ne[Ft])!==null&&wi!==void 0?wi:n);break;case"selection":vA((MA=ne[Ft])!==null&&MA!==void 0?MA:o);break;case"readOnly":tA((me=ne[Ft])!==null&&me!==void 0?me:r);break;case"indentation":cA((nt=ne[Ft])!==null&&nt!==void 0?nt:2);break;case"tabSize":pA((Wt=ne[Ft])!==null&&Wt!==void 0?Wt:4);break;case"truncateTextSize":VA((Xe=ne[Ft])!==null&&Xe!==void 0?Xe:1e3);break;case"mode":oe((oi=ne[Ft])!==null&&oi!==void 0?oi:s);break;case"mainMenuBar":KA((Di=ne[Ft])!==null&&Di!==void 0?Di:a);break;case"navigationBar":CA((Ut=ne[Ft])!==null&&Ut!==void 0?Ut:c);break;case"statusBar":TA((cn=ne[Ft])!==null&&cn!==void 0?cn:l);break;case"askToFormat":Ze((ft=ne[Ft])!==null&&ft!==void 0?ft:I);break;case"escapeControlCharacters":He((Qi=ne[Ft])!==null&&Qi!==void 0?Qi:C);break;case"escapeUnicodeCharacters":uA((ot=ne[Ft])!==null&&ot!==void 0?ot:d);break;case"flattenColumns":eA((Mt=ne[Ft])!==null&&Mt!==void 0?Mt:B);break;case"parser":UA((on=ne[Ft])!==null&&on!==void 0?on:E);break;case"validator":aA((hn=ne[Ft])!==null&&hn!==void 0?hn:h);break;case"validationParser":le((Ai=ne[Ft])!==null&&Ai!==void 0?Ai:u);break;case"pathParser":SA((Ki=ne[Ft])!==null&&Ki!==void 0?Ki:D);break;case"queryLanguages":Ue((dt=ne[Ft])!==null&&dt!==void 0?dt:L);break;case"queryLanguageId":mA((EA=ne[Ft])!==null&&EA!==void 0?EA:R);break;case"onChangeQueryLanguage":sA((HA=ne[Ft])!==null&&HA!==void 0?HA:w);break;case"onChange":xt((ve=ne[Ft])!==null&&ve!==void 0?ve:_);break;case"onRenderValue":de((Qt=ne[Ft])!==null&&Qt!==void 0?Qt:z);break;case"onClassName":Dt((yi=ne[Ft])!==null&&yi!==void 0?yi:U);break;case"onRenderMenu":_e((ri=ne[Ft])!==null&&ri!==void 0?ri:H);break;case"onRenderContextMenu":Le((pn=ne[Ft])!==null&&pn!==void 0?pn:q);break;case"onChangeMode":bt((Fn=ne[Ft])!==null&&Fn!==void 0?Fn:j);break;case"onSelect":tt((Jn=ne[Ft])!==null&&Jn!==void 0?Jn:K);break;case"onError":Re((ln=ne[Ft])!==null&&ln!==void 0?ln:gA);break;case"onFocus":$t((Pt=ne[Ft])!==null&&Pt!==void 0?Pt:QA);break;case"onBlur":x(($i=ne[Ft])!==null&&$i!==void 0?$i:BA);break;default:Xn(Ft)}function Xn(se){i('Unknown property "'.concat(se,'"'))}Ue().some(se=>se.id===mA())||mA(Ue()[0].id),io()}function We(){return ni.apply(this,arguments)}function ni(){return(ni=Yt(function*(){throw new Error("class method destroy() is deprecated. It is replaced with a method destroy() in the vanilla library.")})).apply(this,arguments)}function pi(ne,wi,MA){lA(ne),xt()&&xt()(ne,wi,MA)}function dn(ne){vA(ne),tt()&&tt()(i4(ne))}function mn(){y(P,!0),$t()&&$t()()}function Uo(){y(P,!1),x()&&x()()}function kn(ne){return Wn.apply(this,arguments)}function Wn(){return(Wn=Yt(function*(ne){oe()!==ne&&(oe(ne),io(),ii(),bt()(ne))})).apply(this,arguments)}function Vo(ne){i("handleChangeQueryLanguage",ne),mA(ne),sA()(ne)}function vo(ne){var{id:wi,json:MA,rootPath:me,onTransform:nt,onClose:Wt}=ne;tA()||y(Ee,{id:wi,json:MA,rootPath:me,indentation:cA(),truncateTextSize:VA(),escapeControlCharacters:He(),escapeUnicodeCharacters:uA(),parser:UA(),parseMemoizeOne:g(A),validationParser:le(),pathParser:SA(),queryLanguages:Ue(),queryLanguageId:mA(),onChangeQueryLanguage:Vo,onRenderValue:de(),onRenderMenu:Xe=>_e()(Xe,{mode:oe(),modal:!0,readOnly:tA()}),onRenderContextMenu:Xe=>Le()(Xe,{mode:oe(),modal:!0,readOnly:tA(),selection:vA()}),onClassName:Dt(),onTransform:nt,onClose:Wt})}function bo(ne){tA()||y(Be,ne)}function Yn(ne){var{content:wi,path:MA,onPatch:me,onClose:nt}=ne;i("onJSONEditorModal",{content:wi,path:MA}),y(bA,{content:wi,path:MA,onPatch:me,readOnly:tA(),indentation:cA(),tabSize:pA(),truncateTextSize:VA(),mainMenuBar:KA(),navigationBar:CA(),statusBar:TA(),askToFormat:Ze(),escapeControlCharacters:He(),escapeUnicodeCharacters:uA(),flattenColumns:eA(),parser:UA(),validator:void 0,validationParser:le(),pathParser:SA(),onRenderValue:de(),onClassName:Dt(),onRenderMenu:_e(),onRenderContextMenu:Le(),onSortModal:bo,onTransformModal:vo,onClose:nt})}function Mo(ne){ne.stopPropagation()}return fA(()=>(k(UA()),g(kA),k(lA()),nQ),()=>{if(!UsA(UA(),g(kA))){if(i("parser changed, recreate editor"),z3(lA())){var ne=g(kA).stringify(lA().json);lA({json:ne!==void 0?UA().parse(ne):void 0})}y(kA,UA()),y(Y,nQ())}}),fA(()=>k(lA()),()=>{var ne=HN(lA());ne&&console.error("Error: "+ne)}),fA(()=>k(vA()),()=>{vA()===null&&console.warn("selection is invalid: it is null but should be undefined")}),fA(()=>k(UA()),()=>{y(A,aE(UA().parse))}),fA(()=>k(oe()),()=>{i("mode changed to",oe())}),Qn(),Zt(!0),f_(t,{children:(ne,wi)=>{var MA,me=xTA(),nt=vt(me);vsA(W(nt),()=>g(Y),ft=>{Co(HrA(ft,{get externalMode(){return oe()},get content(){return lA()},get selection(){return vA()},get readOnly(){return tA()},get indentation(){return cA()},get tabSize(){return pA()},get truncateTextSize(){return VA()},get statusBar(){return TA()},get askToFormat(){return Ze()},get mainMenuBar(){return KA()},get navigationBar(){return CA()},get escapeControlCharacters(){return He()},get escapeUnicodeCharacters(){return uA()},get flattenColumns(){return eA()},get parser(){return UA()},get parseMemoizeOne(){return g(A)},get validator(){return aA()},get validationParser(){return le()},get pathParser(){return SA()},insideModal:!1,get onError(){return Re()},onChange:pi,onChangeMode:kn,onSelect:dn,get onRenderValue(){return de()},get onClassName(){return Dt()},onFocus:mn,onBlur:Uo,get onRenderMenu(){return _e()},get onRenderContextMenu(){return Le()},onSortModal:bo,onTransformModal:vo,onJSONEditorModal:Yn,$$legacy:!0}),Qi=>y(X,Qi),()=>g(X))});var Wt=IA(nt,2),Xe=ft=>{(function(Qi,ot){var Mt,on;mt(ot,!1);var hn=$(void 0,!0),Ai=$(void 0,!0),Ki=$(void 0,!0),dt=$(void 0,!0),EA=Sr("jsoneditor:SortModal"),HA=b(ot,"id",9),ve=b(ot,"json",9),Qt=b(ot,"rootPath",9),yi=b(ot,"onSort",9),ri=b(ot,"onClose",9),pn={value:1,label:"ascending"},Fn=[pn,{value:-1,label:"descending"}],Jn="".concat(HA(),":").concat(Ct(Qt())),ln=$((Mt=AQ()[Jn])===null||Mt===void 0?void 0:Mt.selectedProperty,!0),Pt=$(((on=AQ()[Jn])===null||on===void 0?void 0:on.selectedDirection)||pn,!0),$i=$(void 0,!0);function Rr(){try{var Xn,se,vi;y($i,void 0);var Yi=((Xn=g(ln))===null||Xn===void 0?void 0:Xn.value)||((se=g(dt))===null||se===void 0||(se=se[0])===null||se===void 0?void 0:se.value)||[],rn=(vi=g(Pt))===null||vi===void 0?void 0:vi.value,Hr=baA(ve(),Qt(),Yi,rn);yi()!==void 0&&Qt()!==void 0&&yi()({operations:Hr,rootPath:Qt(),itemPath:Yi,direction:rn}),ri()()}catch(Ri){y($i,String(Ri))}}function Ft(Xn){Xn.focus()}fA(()=>(k(ve()),k(Qt())),()=>{y(hn,Ke(ve(),Qt()))}),fA(()=>g(hn),()=>{y(Ai,Array.isArray(g(hn)))}),fA(()=>(g(Ai),g(hn)),()=>{y(Ki,g(Ai)?h_(g(hn)):void 0)}),fA(()=>(g(Ki),U1),()=>{y(dt,g(Ki)?g(Ki).map(U1):void 0)}),fA(()=>(AQ(),g(ln),g(Pt)),()=>{AQ(AQ()[Jn]={selectedProperty:g(ln),selectedDirection:g(Pt)}),EA("store state in memory",Jn,AQ()[Jn])}),Qn(),Zt(!0),X3(Qi,{get onClose(){return ri()},className:"jse-sort-modal",children:(Xn,se)=>{var vi=RTA(),Yi=vt(vi),rn=qA(()=>g(Ai)?"Sort array items":"Sort object keys");My(Yi,{get title(){return g(rn)},get onClose(){return ri()}});var Hr=W(IA(Yi,2)),Ri=IA(W(Hr)),fs=W(Ri),Bo=IA(W(fs)),Q=W(Bo),m=IA(fs),v=te=>{var re=kTA(),Pe=IA(W(re));JC(W(Pe),{showChevron:!0,get items(){return g(dt)},get value(){return g(ln)},set value(ze){y(ln,ze)},$$legacy:!0}),iA(te,re)};LA(m,te=>{g(Ai),g(dt),nA(()=>{var re;return g(Ai)&&g(dt)&&((re=g(dt))===null||re===void 0?void 0:re.length)>1})&&te(v)});var p=IA(m),N=IA(W(p));JC(W(N),{showChevron:!0,clearable:!1,get items(){return Fn},get value(){return g(Pt)},set value(te){y(Pt,te)},$$legacy:!0});var J=IA(Hr,2),V=W(J),Z=te=>{var re=STA(),Pe=W(re);De(()=>wt(Pe,g($i))),iA(te,re)};LA(V,te=>{g($i)&&te(Z)});var FA=W(IA(J,2));es(()=>ce("click",FA,Rr)),Us(FA,te=>Ft?.(te)),De(te=>{VC(Q,te),FA.disabled=(g(Ai),g(dt),g(ln),nA(()=>{var re;return!!(g(Ai)&&g(dt)&&((re=g(dt))===null||re===void 0?void 0:re.length)>1)&&!g(ln)}))},[()=>(k(Qt()),k(Oi),k(Ka),nA(()=>Qt()&&!Oi(Qt())?Ka(Qt()):"(document root)"))],qA),iA(Xn,vi)},$$slots:{default:!0}}),pt()})(ft,z1(()=>g(Be),{onClose:()=>{var Qi;(Qi=g(Be))===null||Qi===void 0||Qi.onClose(),y(Be,void 0)}}))};LA(Wt,ft=>{g(Be)&&ft(Xe)});var oi=IA(Wt,2),Di=ft=>{NJA(ft,z1(()=>g(Ee),{onClose:()=>{var Qi;(Qi=g(Ee))===null||Qi===void 0||Qi.onClose(),y(Ee,void 0)}}))};LA(oi,ft=>{g(Ee)&&ft(Di)});var Ut=IA(oi,2),cn=ft=>{(function(Qi,ot){mt(ot,!1);var Mt=$(void 0,!0),on=$(void 0,!0),hn=$(void 0,!0),Ai=$(void 0,!0),Ki=Sr("jsoneditor:JSONEditorModal"),dt=b(ot,"content",9),EA=b(ot,"path",9),HA=b(ot,"onPatch",9),ve=b(ot,"readOnly",9),Qt=b(ot,"indentation",9),yi=b(ot,"tabSize",9),ri=b(ot,"truncateTextSize",9),pn=b(ot,"mainMenuBar",9),Fn=b(ot,"navigationBar",9),Jn=b(ot,"statusBar",9),ln=b(ot,"askToFormat",9),Pt=b(ot,"escapeControlCharacters",9),$i=b(ot,"escapeUnicodeCharacters",9),Rr=b(ot,"flattenColumns",9),Ft=b(ot,"parser",9),Xn=b(ot,"validator",9),se=b(ot,"validationParser",9),vi=b(ot,"pathParser",9),Yi=b(ot,"onRenderValue",9),rn=b(ot,"onClassName",9),Hr=b(ot,"onRenderMenu",9),Ri=b(ot,"onRenderContextMenu",9),fs=b(ot,"onSortModal",9),Bo=b(ot,"onTransformModal",9),Q=b(ot,"onClose",9),m=$(void 0,!0),v=$(void 0,!0),p={mode:V(dt()),content:dt(),selection:void 0,relativePath:EA()},N=$([p],!0),J=$(void 0,!0);function V(oA){return z3(oA)&&wo(oA.json)?er.table:er.tree}function Z(){var oA,YA=(oA=hi(g(N)))===null||oA===void 0?void 0:oA.selection;q3(YA)&&g(m).scrollTo(et(YA))}function FA(){if(Ki("handleApply"),!ve())try{y(J,void 0);var oA=g(Mt).relativePath,YA=g(Mt).content,pe=[{op:"replace",path:Ct(oA),value:ArA(YA,Ft()).json}];if(g(N).length>1){var he=ArA(g(N)[g(N).length-2].content,Ft()).json,ge={json:Da(he,pe)},Bt=fe(fe({},g(N)[g(N).length-2]||p),{},{content:ge});y(N,[...g(N).slice(0,g(N).length-2),Bt]),io(),Z()}else HA()(pe),Q()()}catch($e){y(J,String($e))}}function te(){if(Ki("handleClose"),g(v))y(v,!1);else if(g(N).length>1){var oA;y(N,Fi(g(N))),io(),(oA=g(m))===null||oA===void 0||oA.focus(),Z(),y(J,void 0)}else Q()()}function re(oA){Ki("handleChange",oA),ye(YA=>fe(fe({},YA),{},{content:oA}))}function Pe(oA){Ki("handleChangeSelection",oA),ye(YA=>fe(fe({},YA),{},{selection:oA}))}function ze(oA){Ki("handleChangeMode",oA),ye(YA=>fe(fe({},YA),{},{mode:oA}))}function ye(oA){var YA=oA(hi(g(N)));y(N,[...Fi(g(N)),YA])}function Ge(oA){y(J,oA.toString()),console.error(oA)}function Vi(oA){var YA,{content:pe,path:he}=oA;Ki("handleJSONEditorModal",{content:pe,path:he});var ge={mode:V(pe),content:pe,selection:void 0,relativePath:he};y(N,[...g(N),ge]),io(),(YA=g(m))===null||YA===void 0||YA.focus()}function T(oA){oA.focus()}hs(()=>{var oA;(oA=g(m))===null||oA===void 0||oA.focus()}),fA(()=>g(N),()=>{y(Mt,hi(g(N))||p)}),fA(()=>g(N),()=>{y(on,g(N).flatMap(oA=>oA.relativePath))}),fA(()=>(g(on),Ka),()=>{y(hn,Oi(g(on))?"(document root)":Ka(g(on)))}),fA(()=>k(Ft()),()=>{y(Ai,aE(Ft().parse))}),Qn(),Zt(!0),X3(Qi,{onClose:te,className:"jse-jsoneditor-modal",get fullscreen(){return g(v)},children:(oA,YA)=>{var pe=bTA();f_(W(pe),{children:(he,ge)=>{var Bt=vTA(),$e=vt(Bt),bi=qA(()=>(g(N),nA(()=>g(N).length>1?" (".concat(g(N).length,")"):"")));My($e,{get title(){var _t;return"Edit nested content ".concat((_t=g(bi))!==null&&_t!==void 0?_t:"")},fullScreenButton:!0,onClose:te,get fullscreen(){return g(v)},set fullscreen(_t){y(v,_t)},$$legacy:!0});var un=IA($e,2),Ji=IA(W(un),2),Tn=IA(Ji,4);Co(HrA(W(Tn),{get externalMode(){return g(Mt),nA(()=>g(Mt).mode)},get content(){return g(Mt),nA(()=>g(Mt).content)},get selection(){return g(Mt),nA(()=>g(Mt).selection)},get readOnly(){return ve()},get indentation(){return Qt()},get tabSize(){return yi()},get truncateTextSize(){return ri()},get statusBar(){return Jn()},get askToFormat(){return ln()},get mainMenuBar(){return pn()},get navigationBar(){return Fn()},get escapeControlCharacters(){return Pt()},get escapeUnicodeCharacters(){return $i()},get flattenColumns(){return Rr()},get parser(){return Ft()},get parseMemoizeOne(){return g(Ai)},get validator(){return Xn()},get validationParser(){return se()},get pathParser(){return vi()},insideModal:!0,onError:Ge,onChange:re,onChangeMode:ze,onSelect:Pe,get onRenderValue(){return Yi()},get onClassName(){return rn()},get onFocus(){return Oc},get onBlur(){return Oc},get onRenderMenu(){return Hr()},get onRenderContextMenu(){return Ri()},get onSortModal(){return fs()},get onTransformModal(){return Bo()},onJSONEditorModal:Vi,$$legacy:!0}),_t=>y(m,_t),()=>g(m));var Ht=W(IA(Tn,2)),ko=_t=>{var st=pTA(),si=W(st);De(()=>wt(si,g(J))),iA(_t,st)};LA(Ht,_t=>{g(J)&&_t(ko)});var Sn=IA(Ht,2),no=_t=>{var st=wTA();ji(W(st),{get data(){return GW}}),ce("click",st,te),iA(_t,st)};LA(Sn,_t=>{g(N),nA(()=>g(N).length>1)&&_t(no)});var gn=IA(Sn,2),Nt=_t=>{var st=DTA();es(()=>ce("click",st,FA)),Us(st,si=>T?.(si)),iA(_t,st)},Zi=_t=>{var st=yTA();ce("click",st,te),iA(_t,st)};LA(gn,_t=>{ve()?_t(Zi,!1):_t(Nt)}),De(()=>VC(Ji,g(hn))),iA(he,Bt)},$$slots:{default:!0}}),iA(oA,pe)},$$slots:{default:!0}}),pt()})(ft,z1(()=>g(bA),{onClose:()=>{var Qi;(Qi=g(bA))===null||Qi===void 0||Qi.onClose(),y(bA,void 0)}}))};LA(Ut,ft=>{g(bA)&&ft(cn)}),De(ft=>MA=Vt(nt,1,"jse-main svelte-57bmz4",null,MA,ft),[()=>({"jse-focus":g(P)})],qA),ce("keydown",nt,Mo),iA(ne,me)},$$slots:{default:!0}}),zt(e,"get",DA),zt(e,"set",gt),zt(e,"update",Ve),zt(e,"patch",ZA),zt(e,"select",rt),zt(e,"expand",Ei),zt(e,"collapse",tn),zt(e,"transform",qi),zt(e,"validate",xe),zt(e,"acceptAutoRepair",nn),zt(e,"scrollTo",mi),zt(e,"findElement",Lt),zt(e,"focus",ii),zt(e,"refresh",_i),zt(e,"updateProps",M),zt(e,"destroy",We),pt({get:DA,set:gt,update:Ve,patch:ZA,select:rt,expand:Ei,collapse:tn,transform:qi,validate:xe,acceptAutoRepair:nn,scrollTo:mi,findElement:Lt,focus:ii,refresh:_i,updateProps:M,destroy:We})}function YaA(t){var{target:e,props:A}=t,i=CGA(LTA,{target:e,props:A});return i.destroy=Yt(function*(){return function(n,o){var r=B_.get(n);return r?(B_.delete(n),r(o)):Promise.resolve()}(i)}),io(),i}var ed=class t{constructor(e){this.el=e}jsonString;editor=null;ngAfterViewInit(){let e={text:this.jsonString};this.editor=YaA({target:document.getElementById("json-editor"),props:{content:e,mode:er.text,mainMenuBar:!1}})}getJsonString(){return this.editor?.get().text}static \u0275fac=function(A){return new(A||t)(PA(ee))};static \u0275cmp=zA({type:t,selectors:[["app-json-editor"]],inputs:{jsonString:"jsonString"},standalone:!1,decls:1,vars:0,consts:[["id","json-editor",1,"json-editor-container","jse-theme-dark"]],template:function(A,i){A&1&&JA(0,"div",0)},styles:[".jse-theme-dark[_ngcontent-%COMP%]{--jse-theme: dark;--jse-theme-color: #2f6dd0;--jse-theme-color-highlight: #467cd2;--jse-background-color: #1e1e1e;--jse-text-color: #d4d4d4;--jse-text-color-inverse: #4d4d4d;--jse-main-border: 1px solid #4f4f4f;--jse-menu-color: #fff;--jse-modal-background: #2f2f2f;--jse-modal-overlay-background: rgba(0, 0, 0, .5);--jse-modal-code-background: #2f2f2f;--jse-tooltip-color: var(--jse-text-color);--jse-tooltip-background: #4b4b4b;--jse-tooltip-border: 1px solid #737373;--jse-tooltip-action-button-color: inherit;--jse-tooltip-action-button-background: #737373;--jse-panel-background: #333333;--jse-panel-background-border: 1px solid #464646;--jse-panel-color: var(--jse-text-color);--jse-panel-color-readonly: #737373;--jse-panel-border: 1px solid #3c3c3c;--jse-panel-button-color-highlight: #e5e5e5;--jse-panel-button-background-highlight: #464646;--jse-navigation-bar-background: #656565;--jse-navigation-bar-background-highlight: #7e7e7e;--jse-navigation-bar-dropdown-color: var(--jse-text-color);--jse-context-menu-background: #4b4b4b;--jse-context-menu-background-highlight: #595959;--jse-context-menu-separator-color: #595959;--jse-context-menu-color: var(--jse-text-color);--jse-context-menu-pointer-background: #737373;--jse-context-menu-pointer-background-highlight: #818181;--jse-context-menu-pointer-color: var(--jse-context-menu-color);--jse-key-color: #9cdcfe;--jse-value-color: var(--jse-text-color);--jse-value-color-number: #b5cea8;--jse-value-color-boolean: #569cd6;--jse-value-color-null: #569cd6;--jse-value-color-string: #ce9178;--jse-value-color-url: #ce9178;--jse-delimiter-color: #949494;--jse-edit-outline: 2px solid var(--jse-text-color);--jse-selection-background-color: #464646;--jse-selection-background-inactive-color: #333333;--jse-hover-background-color: #343434;--jse-active-line-background-color: rgba(255, 255, 255, .06);--jse-search-match-background-color: #343434;--jse-collapsed-items-background-color: #333333;--jse-collapsed-items-selected-background-color: #565656;--jse-collapsed-items-link-color: #b2b2b2;--jse-collapsed-items-link-color-highlight: #ec8477;--jse-search-match-color: #724c27;--jse-search-match-outline: 1px solid #966535;--jse-search-match-active-color: #9f6c39;--jse-search-match-active-outline: 1px solid #bb7f43;--jse-tag-background: #444444;--jse-tag-color: #bdbdbd;--jse-table-header-background: #333333;--jse-table-header-background-highlight: #424242;--jse-table-row-odd-background: rgba(255, 255, 255, .1);--jse-input-background: #3d3d3d;--jse-input-border: var(--jse-main-border);--jse-button-background: #808080;--jse-button-background-highlight: #7a7a7a;--jse-button-color: #e0e0e0;--jse-button-secondary-background: #494949;--jse-button-secondary-background-highlight: #5d5d5d;--jse-button-secondary-background-disabled: #9d9d9d;--jse-button-secondary-color: var(--jse-text-color);--jse-a-color: #55abff;--jse-a-color-highlight: #4387c9;--jse-svelte-select-background: #3d3d3d;--jse-svelte-select-border: 1px solid #4f4f4f;--list-background: #3d3d3d;--item-hover-bg: #505050;--multi-item-bg: #5b5b5b;--input-color: #d4d4d4;--multi-clear-bg: #8a8a8a;--multi-item-clear-icon-color: #d4d4d4;--multi-item-outline: 1px solid #696969;--list-shadow: 0 2px 8px 0 rgba(0, 0, 0, .4);--jse-color-picker-background: #656565;--jse-color-picker-border-box-shadow: #8c8c8c 0 0 0 1px}.json-editor-container[_ngcontent-%COMP%]{height:300px;max-height:300px}"]})};var vQ=class t{constructor(e,A){this.dialogRef=e;this.data=A;this.jsonString=JSON.stringify(A.jsonContent,null,2),this.functionName=A.functionName||""}jsonEditorComponent;jsonString="";functionName="";ngOnInit(){}onSave(){try{this.jsonString=this.jsonEditorComponent.getJsonString();let e=JSON.parse(this.jsonString);this.dialogRef.close(e)}catch(e){alert("Invalid JSON: "+e)}}onCancel(){this.dialogRef.close(null)}static \u0275fac=function(A){return new(A||t)(PA(Br),PA(as))};static \u0275cmp=zA({type:t,selectors:[["app-edit-json-dialog"]],viewQuery:function(A,i){if(A&1&&Te(ed,5),A&2){let n;XA(n=$A())&&(i.jsonEditorComponent=n.first)}},standalone:!1,decls:11,vars:3,consts:[[1,"dialog-container"],["mat-dialog-title",""],[3,"jsonString"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,i){A&1&&(S(0,"div",0)(1,"h2",1),AA(2),F(),S(3,"mat-dialog-content"),AA(4),JA(5,"app-json-editor",2),F(),S(6,"mat-dialog-actions",3)(7,"button",4),AA(8,"Cancel"),F(),S(9,"button",5),hA("click",function(){return i.onSave()}),AA(10,"Save"),F()()()),A&2&&(G(2),Gt(i.data.dialogHeader),G(2),Et(" ",i.functionName," "),G(),yA("jsonString",i.jsonString))},dependencies:[Dr,bs,ma,pa,hg,ed],styles:[".dialog-container[_ngcontent-%COMP%]{border-radius:12px;padding:18px;width:500px;box-shadow:0 8px 16px #0006}.editor[_ngcontent-%COMP%]{padding-top:12px}"]})};var _TA=["input"],GTA=["label"],UTA=["*"],KTA=new dA("mat-checkbox-default-options",{providedIn:"root",factory:TaA});function TaA(){return{color:"accent",clickAction:"check-indeterminate",disabledInteractive:!1}}var Ks=function(t){return t[t.Init=0]="Init",t[t.Checked=1]="Checked",t[t.Unchecked=2]="Unchecked",t[t.Indeterminate=3]="Indeterminate",t}(Ks||{}),YTA={provide:yc,useExisting:Ir(()=>bQ),multi:!0},QG=class{source;checked},JaA=TaA(),bQ=(()=>{class t{_elementRef=f(ee);_changeDetectorRef=f(It);_ngZone=f(Qe);_animationMode=f(Si,{optional:!0});_options=f(KTA,{optional:!0});focus(){this._inputElement.nativeElement.focus()}_createChangeEvent(A){let i=new QG;return i.source=this,i.checked=A,i}_getAnimationTargetElement(){return this._inputElement?.nativeElement}_animationClasses={uncheckedToChecked:"mdc-checkbox--anim-unchecked-checked",uncheckedToIndeterminate:"mdc-checkbox--anim-unchecked-indeterminate",checkedToUnchecked:"mdc-checkbox--anim-checked-unchecked",checkedToIndeterminate:"mdc-checkbox--anim-checked-indeterminate",indeterminateToChecked:"mdc-checkbox--anim-indeterminate-checked",indeterminateToUnchecked:"mdc-checkbox--anim-indeterminate-unchecked"};ariaLabel="";ariaLabelledby=null;ariaDescribedby;ariaExpanded;ariaControls;ariaOwns;_uniqueId;id;get inputId(){return`${this.id||this._uniqueId}-input`}required;labelPosition="after";name=null;change=new WA;indeterminateChange=new WA;value;disableRipple;_inputElement;_labelElement;tabIndex;color;disabledInteractive;_onTouched=()=>{};_currentAnimationClass="";_currentCheckState=Ks.Init;_controlValueAccessorChangeFn=()=>{};_validatorChangeFn=()=>{};constructor(){f(Rn).load(lr);let A=f(new wr("tabindex"),{optional:!0});this._options=this._options||JaA,this.color=this._options.color||JaA.color,this.tabIndex=A==null?0:parseInt(A)||0,this.id=this._uniqueId=f(sn).getId("mat-mdc-checkbox-"),this.disabledInteractive=this._options?.disabledInteractive??!1}ngOnChanges(A){A.required&&this._validatorChangeFn()}ngAfterViewInit(){this._syncIndeterminate(this._indeterminate)}get checked(){return this._checked}set checked(A){A!=this.checked&&(this._checked=A,this._changeDetectorRef.markForCheck())}_checked=!1;get disabled(){return this._disabled}set disabled(A){A!==this.disabled&&(this._disabled=A,this._changeDetectorRef.markForCheck())}_disabled=!1;get indeterminate(){return this._indeterminate}set indeterminate(A){let i=A!=this._indeterminate;this._indeterminate=A,i&&(this._indeterminate?this._transitionCheckState(Ks.Indeterminate):this._transitionCheckState(this.checked?Ks.Checked:Ks.Unchecked),this.indeterminateChange.emit(this._indeterminate)),this._syncIndeterminate(this._indeterminate)}_indeterminate=!1;_isRippleDisabled(){return this.disableRipple||this.disabled}_onLabelTextChange(){this._changeDetectorRef.detectChanges()}writeValue(A){this.checked=!!A}registerOnChange(A){this._controlValueAccessorChangeFn=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A}validate(A){return this.required&&A.value!==!0?{required:!0}:null}registerOnValidatorChange(A){this._validatorChangeFn=A}_transitionCheckState(A){let i=this._currentCheckState,n=this._getAnimationTargetElement();if(!(i===A||!n)&&(this._currentAnimationClass&&n.classList.remove(this._currentAnimationClass),this._currentAnimationClass=this._getAnimationClassForCheckStateTransition(i,A),this._currentCheckState=A,this._currentAnimationClass.length>0)){n.classList.add(this._currentAnimationClass);let o=this._currentAnimationClass;this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{n.classList.remove(o)},1e3)})}}_emitChangeEvent(){this._controlValueAccessorChangeFn(this.checked),this.change.emit(this._createChangeEvent(this.checked)),this._inputElement&&(this._inputElement.nativeElement.checked=this.checked)}toggle(){this.checked=!this.checked,this._controlValueAccessorChangeFn(this.checked)}_handleInputClick(){let A=this._options?.clickAction;!this.disabled&&A!=="noop"?(this.indeterminate&&A!=="check"&&Promise.resolve().then(()=>{this._indeterminate=!1,this.indeterminateChange.emit(this._indeterminate)}),this._checked=!this._checked,this._transitionCheckState(this._checked?Ks.Checked:Ks.Unchecked),this._emitChangeEvent()):(this.disabled&&this.disabledInteractive||!this.disabled&&A==="noop")&&(this._inputElement.nativeElement.checked=this.checked,this._inputElement.nativeElement.indeterminate=this.indeterminate)}_onInteractionEvent(A){A.stopPropagation()}_onBlur(){Promise.resolve().then(()=>{this._onTouched(),this._changeDetectorRef.markForCheck()})}_getAnimationClassForCheckStateTransition(A,i){if(this._animationMode==="NoopAnimations")return"";switch(A){case Ks.Init:if(i===Ks.Checked)return this._animationClasses.uncheckedToChecked;if(i==Ks.Indeterminate)return this._checked?this._animationClasses.checkedToIndeterminate:this._animationClasses.uncheckedToIndeterminate;break;case Ks.Unchecked:return i===Ks.Checked?this._animationClasses.uncheckedToChecked:this._animationClasses.uncheckedToIndeterminate;case Ks.Checked:return i===Ks.Unchecked?this._animationClasses.checkedToUnchecked:this._animationClasses.checkedToIndeterminate;case Ks.Indeterminate:return i===Ks.Checked?this._animationClasses.indeterminateToChecked:this._animationClasses.indeterminateToUnchecked}return""}_syncIndeterminate(A){let i=this._inputElement;i&&(i.nativeElement.indeterminate=A)}_onInputClick(){this._handleInputClick()}_onTouchTargetClick(){this._handleInputClick(),this.disabled||this._inputElement.nativeElement.focus()}_preventBubblingFromLabel(A){A.target&&this._labelElement.nativeElement.contains(A.target)&&A.stopPropagation()}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-checkbox"]],viewQuery:function(i,n){if(i&1&&(Te(_TA,5),Te(GTA,5)),i&2){let o;XA(o=$A())&&(n._inputElement=o.first),XA(o=$A())&&(n._labelElement=o.first)}},hostAttrs:[1,"mat-mdc-checkbox"],hostVars:16,hostBindings:function(i,n){i&2&&(Hs("id",n.id),Ne("tabindex",null)("aria-label",null)("aria-labelledby",null),fo(n.color?"mat-"+n.color:"mat-accent"),ue("_mat-animation-noopable",n._animationMode==="NoopAnimations")("mdc-checkbox--disabled",n.disabled)("mat-mdc-checkbox-disabled",n.disabled)("mat-mdc-checkbox-checked",n.checked)("mat-mdc-checkbox-disabled-interactive",n.disabledInteractive))},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],ariaExpanded:[2,"aria-expanded","ariaExpanded",ie],ariaControls:[0,"aria-controls","ariaControls"],ariaOwns:[0,"aria-owns","ariaOwns"],id:"id",required:[2,"required","required",ie],labelPosition:"labelPosition",name:"name",value:"value",disableRipple:[2,"disableRipple","disableRipple",ie],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?void 0:zi(A)],color:"color",disabledInteractive:[2,"disabledInteractive","disabledInteractive",ie],checked:[2,"checked","checked",ie],disabled:[2,"disabled","disabled",ie],indeterminate:[2,"indeterminate","indeterminate",ie]},outputs:{change:"change",indeterminateChange:"indeterminateChange"},exportAs:["matCheckbox"],features:[ht([YTA,{provide:w0,useExisting:t,multi:!0}]),ti],ngContentSelectors:UTA,decls:15,vars:23,consts:[["checkbox",""],["input",""],["label",""],["mat-internal-form-field","",3,"click","labelPosition"],[1,"mdc-checkbox"],[1,"mat-mdc-checkbox-touch-target",3,"click"],["type","checkbox",1,"mdc-checkbox__native-control",3,"blur","click","change","checked","indeterminate","disabled","id","required","tabIndex"],[1,"mdc-checkbox__ripple"],[1,"mdc-checkbox__background"],["focusable","false","viewBox","0 0 24 24","aria-hidden","true",1,"mdc-checkbox__checkmark"],["fill","none","d","M1.73,12.91 8.1,19.28 22.79,4.59",1,"mdc-checkbox__checkmark-path"],[1,"mdc-checkbox__mixedmark"],["mat-ripple","",1,"mat-mdc-checkbox-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleCentered"],[1,"mdc-label",3,"for"]],template:function(i,n){if(i&1){let o=be();jt(),S(0,"div",3),hA("click",function(s){return RA(o),xA(n._preventBubblingFromLabel(s))}),S(1,"div",4,0)(3,"div",5),hA("click",function(){return RA(o),xA(n._onTouchTargetClick())}),F(),S(4,"input",6,1),hA("blur",function(){return RA(o),xA(n._onBlur())})("click",function(){return RA(o),xA(n._onInputClick())})("change",function(s){return RA(o),xA(n._onInteractionEvent(s))}),F(),JA(6,"div",7),S(7,"div",8),ar(),S(8,"svg",9),JA(9,"path",10),F(),SI(),JA(10,"div",11),F(),JA(11,"div",12),F(),S(12,"label",13,2),Fe(14),F()()}if(i&2){let o=cr(2);yA("labelPosition",n.labelPosition),G(4),ue("mdc-checkbox--selected",n.checked),yA("checked",n.checked)("indeterminate",n.indeterminate)("disabled",n.disabled&&!n.disabledInteractive)("id",n.inputId)("required",n.required)("tabIndex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex),Ne("aria-label",n.ariaLabel||null)("aria-labelledby",n.ariaLabelledby)("aria-describedby",n.ariaDescribedby)("aria-checked",n.indeterminate?"mixed":null)("aria-controls",n.ariaControls)("aria-disabled",n.disabled&&n.disabledInteractive?!0:null)("aria-expanded",n.ariaExpanded)("aria-owns",n.ariaOwns)("name",n.name)("value",n.value),G(7),yA("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)("matRippleCentered",!0),G(),yA("for",n.inputId)}},dependencies:[rs,MB],styles:['.mdc-checkbox{display:inline-block;position:relative;flex:0 0 18px;box-sizing:content-box;width:18px;height:18px;line-height:0;white-space:nowrap;cursor:pointer;vertical-align:bottom;padding:calc((var(--mdc-checkbox-state-layer-size, 40px) - 18px)/2);margin:calc((var(--mdc-checkbox-state-layer-size, 40px) - var(--mdc-checkbox-state-layer-size, 40px))/2)}.mdc-checkbox:hover>.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-unselected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity));background-color:var(--mdc-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:hover>.mat-mdc-checkbox-ripple>.mat-ripple-element{background-color:var(--mdc-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control:focus+.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-unselected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity));background-color:var(--mdc-checkbox-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control:focus~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mdc-checkbox-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:active>.mdc-checkbox__native-control+.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-unselected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));background-color:var(--mdc-checkbox-unselected-pressed-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:active>.mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mdc-checkbox-unselected-pressed-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:hover .mdc-checkbox__native-control:checked+.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-selected-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity));background-color:var(--mdc-checkbox-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:hover .mdc-checkbox__native-control:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mdc-checkbox-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox .mdc-checkbox__native-control:focus:checked+.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-selected-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity));background-color:var(--mdc-checkbox-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox .mdc-checkbox__native-control:focus:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mdc-checkbox-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-checkbox:active>.mdc-checkbox__native-control:checked+.mdc-checkbox__ripple{opacity:var(--mdc-checkbox-selected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));background-color:var(--mdc-checkbox-selected-pressed-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox:active>.mdc-checkbox__native-control:checked~.mat-mdc-checkbox-ripple .mat-ripple-element{background-color:var(--mdc-checkbox-selected-pressed-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control~.mat-mdc-checkbox-ripple .mat-ripple-element,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control+.mdc-checkbox__ripple{background-color:var(--mdc-checkbox-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-checkbox .mdc-checkbox__native-control{position:absolute;margin:0;padding:0;opacity:0;cursor:inherit;width:var(--mdc-checkbox-state-layer-size, 40px);height:var(--mdc-checkbox-state-layer-size, 40px);top:calc((var(--mdc-checkbox-state-layer-size, 40px) - var(--mdc-checkbox-state-layer-size, 40px))/2);right:calc((var(--mdc-checkbox-state-layer-size, 40px) - var(--mdc-checkbox-state-layer-size, 40px))/2);left:calc((var(--mdc-checkbox-state-layer-size, 40px) - var(--mdc-checkbox-state-layer-size, 40px))/2)}.mdc-checkbox--disabled{cursor:default;pointer-events:none}@media(forced-colors: active){.mdc-checkbox--disabled{opacity:.5}}.mdc-checkbox__background{display:inline-flex;position:absolute;align-items:center;justify-content:center;box-sizing:border-box;width:18px;height:18px;border:2px solid currentColor;border-radius:2px;background-color:rgba(0,0,0,0);pointer-events:none;will-change:background-color,border-color;transition:background-color 90ms cubic-bezier(0.4, 0, 0.6, 1),border-color 90ms cubic-bezier(0.4, 0, 0.6, 1);-webkit-print-color-adjust:exact;color-adjust:exact;border-color:var(--mdc-checkbox-unselected-icon-color, var(--mat-sys-on-surface-variant));top:calc((var(--mdc-checkbox-state-layer-size, 40px) - 18px)/2);left:calc((var(--mdc-checkbox-state-layer-size, 40px) - 18px)/2)}.mdc-checkbox__native-control:enabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:enabled:indeterminate~.mdc-checkbox__background{border-color:var(--mdc-checkbox-selected-icon-color, var(--mat-sys-primary));background-color:var(--mdc-checkbox-selected-icon-color, var(--mat-sys-primary))}.mdc-checkbox--disabled .mdc-checkbox__background{border-color:var(--mdc-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-checkbox__native-control:disabled:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:disabled:indeterminate~.mdc-checkbox__background{background-color:var(--mdc-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:rgba(0,0,0,0)}.mdc-checkbox:hover>.mdc-checkbox__native-control:not(:checked)~.mdc-checkbox__background,.mdc-checkbox:hover>.mdc-checkbox__native-control:not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mdc-checkbox-unselected-hover-icon-color, var(--mat-sys-on-surface));background-color:rgba(0,0,0,0)}.mdc-checkbox:hover>.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox:hover>.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{border-color:var(--mdc-checkbox-selected-hover-icon-color, var(--mat-sys-primary));background-color:var(--mdc-checkbox-selected-hover-icon-color, var(--mat-sys-primary))}.mdc-checkbox__native-control:focus:focus:not(:checked)~.mdc-checkbox__background,.mdc-checkbox__native-control:focus:focus:not(:indeterminate)~.mdc-checkbox__background{border-color:var(--mdc-checkbox-unselected-focus-icon-color, var(--mat-sys-on-surface))}.mdc-checkbox__native-control:focus:focus:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:focus:focus:indeterminate~.mdc-checkbox__background{border-color:var(--mdc-checkbox-selected-focus-icon-color, var(--mat-sys-primary));background-color:var(--mdc-checkbox-selected-focus-icon-color, var(--mat-sys-primary))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox:hover>.mdc-checkbox__native-control~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox .mdc-checkbox__native-control:focus~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__background{border-color:var(--mdc-checkbox-disabled-unselected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{background-color:var(--mdc-checkbox-disabled-selected-icon-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));border-color:rgba(0,0,0,0)}.mdc-checkbox__checkmark{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;opacity:0;transition:opacity 180ms cubic-bezier(0.4, 0, 0.6, 1);color:var(--mdc-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}@media(forced-colors: active){.mdc-checkbox__checkmark{color:CanvasText}}.mdc-checkbox--disabled .mdc-checkbox__checkmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__checkmark{color:var(--mdc-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}@media(forced-colors: active){.mdc-checkbox--disabled .mdc-checkbox__checkmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__checkmark{color:CanvasText}}.mdc-checkbox__checkmark-path{transition:stroke-dashoffset 180ms cubic-bezier(0.4, 0, 0.6, 1);stroke:currentColor;stroke-width:3.12px;stroke-dashoffset:29.7833385;stroke-dasharray:29.7833385}.mdc-checkbox__mixedmark{width:100%;height:0;transform:scaleX(0) rotate(0deg);border-width:1px;border-style:solid;opacity:0;transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1);border-color:var(--mdc-checkbox-selected-checkmark-color, var(--mat-sys-on-primary))}@media(forced-colors: active){.mdc-checkbox__mixedmark{margin:0 1px}}.mdc-checkbox--disabled .mdc-checkbox__mixedmark,.mdc-checkbox--disabled.mat-mdc-checkbox-disabled-interactive .mdc-checkbox__mixedmark{border-color:var(--mdc-checkbox-disabled-selected-checkmark-color, var(--mat-sys-surface))}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__background,.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__background,.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__background,.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__background{animation-duration:180ms;animation-timing-function:linear}.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-unchecked-checked-checkmark-path 180ms linear;transition:none}.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-unchecked-indeterminate-mixedmark 90ms linear;transition:none}.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__checkmark-path{animation:mdc-checkbox-checked-unchecked-checkmark-path 90ms linear;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__checkmark{animation:mdc-checkbox-checked-indeterminate-checkmark 90ms linear;transition:none}.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__mixedmark{animation:mdc-checkbox-checked-indeterminate-mixedmark 90ms linear;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__checkmark{animation:mdc-checkbox-indeterminate-checked-checkmark 500ms linear;transition:none}.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-checked-mixedmark 500ms linear;transition:none}.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__mixedmark{animation:mdc-checkbox-indeterminate-unchecked-mixedmark 300ms linear;transition:none}.mdc-checkbox__native-control:checked~.mdc-checkbox__background,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background{transition:border-color 90ms cubic-bezier(0, 0, 0.2, 1),background-color 90ms cubic-bezier(0, 0, 0.2, 1)}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path,.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path{stroke-dashoffset:0}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__checkmark{transition:opacity 180ms cubic-bezier(0, 0, 0.2, 1),transform 180ms cubic-bezier(0, 0, 0.2, 1);opacity:1}.mdc-checkbox__native-control:checked~.mdc-checkbox__background>.mdc-checkbox__mixedmark{transform:scaleX(1) rotate(-45deg)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__checkmark{transform:rotate(45deg);opacity:0;transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1)}.mdc-checkbox__native-control:indeterminate~.mdc-checkbox__background>.mdc-checkbox__mixedmark{transform:scaleX(1) rotate(0deg);opacity:1}@keyframes mdc-checkbox-unchecked-checked-checkmark-path{0%,50%{stroke-dashoffset:29.7833385}50%{animation-timing-function:cubic-bezier(0, 0, 0.2, 1)}100%{stroke-dashoffset:0}}@keyframes mdc-checkbox-unchecked-indeterminate-mixedmark{0%,68.2%{transform:scaleX(0)}68.2%{animation-timing-function:cubic-bezier(0, 0, 0, 1)}100%{transform:scaleX(1)}}@keyframes mdc-checkbox-checked-unchecked-checkmark-path{from{animation-timing-function:cubic-bezier(0.4, 0, 1, 1);opacity:1;stroke-dashoffset:0}to{opacity:0;stroke-dashoffset:-29.7833385}}@keyframes mdc-checkbox-checked-indeterminate-checkmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 1);transform:rotate(0deg);opacity:1}to{transform:rotate(45deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-checked-checkmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);transform:rotate(45deg);opacity:0}to{transform:rotate(360deg);opacity:1}}@keyframes mdc-checkbox-checked-indeterminate-mixedmark{from{animation-timing-function:cubic-bezier(0, 0, 0.2, 1);transform:rotate(-45deg);opacity:0}to{transform:rotate(0deg);opacity:1}}@keyframes mdc-checkbox-indeterminate-checked-mixedmark{from{animation-timing-function:cubic-bezier(0.14, 0, 0, 1);transform:rotate(0deg);opacity:1}to{transform:rotate(315deg);opacity:0}}@keyframes mdc-checkbox-indeterminate-unchecked-mixedmark{0%{animation-timing-function:linear;transform:scaleX(1);opacity:1}32.8%,100%{transform:scaleX(0);opacity:0}}.mat-mdc-checkbox{display:inline-block;position:relative;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mat-mdc-checkbox-touch-target,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__native-control,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__ripple,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mat-mdc-checkbox-ripple::before,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__checkmark,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__checkmark>.mdc-checkbox__checkmark-path,.mat-mdc-checkbox._mat-animation-noopable>.mat-internal-form-field>.mdc-checkbox>.mdc-checkbox__background>.mdc-checkbox__mixedmark{transition:none !important;animation:none !important}.mat-mdc-checkbox label{cursor:pointer}.mat-mdc-checkbox .mat-internal-form-field{color:var(--mat-checkbox-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-checkbox-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-checkbox-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-checkbox-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-checkbox-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-checkbox-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-disabled-interactive{pointer-events:auto}.mat-mdc-checkbox.mat-mdc-checkbox-disabled.mat-mdc-checkbox-disabled-interactive input{cursor:default}.mat-mdc-checkbox.mat-mdc-checkbox-disabled label{cursor:default;color:var(--mat-checkbox-disabled-label-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-checkbox label:empty{display:none}.mat-mdc-checkbox .mdc-checkbox__ripple{opacity:0}.mat-mdc-checkbox .mat-mdc-checkbox-ripple,.mdc-checkbox__ripple{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:50%;pointer-events:none}.mat-mdc-checkbox .mat-mdc-checkbox-ripple:not(:empty),.mdc-checkbox__ripple:not(:empty){transform:translateZ(0)}.mat-mdc-checkbox-ripple .mat-ripple-element{opacity:.1}.mat-mdc-checkbox-touch-target{position:absolute;top:50%;left:50%;height:48px;width:48px;transform:translate(-50%, -50%);display:var(--mat-checkbox-touch-target-display, block)}.mat-mdc-checkbox .mat-mdc-checkbox-ripple::before{border-radius:50%}.mdc-checkbox__native-control:focus~.mat-focus-indicator::before{content:""}'],encapsulation:2,changeDetection:0})}return t})();var HaA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[bQ,it,it]})}return t})();var HTA=[[["caption"]],[["colgroup"],["col"]],"*"],zTA=["caption","colgroup, col","*"];function OTA(t,e){t&1&&Fe(0,2)}function PTA(t,e){t&1&&(S(0,"thead",0),_r(1,1),F(),S(2,"tbody",0),_r(3,2)(4,3),F(),S(5,"tfoot",0),_r(6,4),F())}function jTA(t,e){t&1&&_r(0,1)(1,2)(2,3)(3,4)}var Yl=new dA("CDK_TABLE");var Wy=(()=>{class t{template=f(wn);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","cdkCellDef",""]]})}return t})(),Xy=(()=>{class t{template=f(wn);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","cdkHeaderCellDef",""]]})}return t})(),PaA=(()=>{class t{template=f(wn);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","cdkFooterCellDef",""]]})}return t})(),MQ=(()=>{class t{_table=f(Yl,{optional:!0});_hasStickyChanged=!1;get name(){return this._name}set name(A){this._setNameInput(A)}_name;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;get stickyEnd(){return this._stickyEnd}set stickyEnd(A){A!==this._stickyEnd&&(this._stickyEnd=A,this._hasStickyChanged=!0)}_stickyEnd=!1;cell;headerCell;footerCell;cssClassFriendlyName;_columnCssClassName;constructor(){}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}_updateColumnCssClassName(){this._columnCssClassName=[`cdk-column-${this.cssClassFriendlyName}`]}_setNameInput(A){A&&(this._name=A,this.cssClassFriendlyName=A.replace(/[^a-z0-9_-]/gi,"-"),this._updateColumnCssClassName())}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","cdkColumnDef",""]],contentQueries:function(i,n,o){if(i&1&&(ci(o,Wy,5),ci(o,Xy,5),ci(o,PaA,5)),i&2){let r;XA(r=$A())&&(n.cell=r.first),XA(r=$A())&&(n.headerCell=r.first),XA(r=$A())&&(n.footerCell=r.first)}},inputs:{name:[0,"cdkColumnDef","name"],sticky:[2,"sticky","sticky",ie],stickyEnd:[2,"stickyEnd","stickyEnd",ie]},features:[ht([{provide:"MAT_SORT_HEADER_COLUMN_DEF",useExisting:t}])]})}return t})(),jy=class{constructor(e,A){A.nativeElement.classList.add(...e._columnCssClassName)}},jaA=(()=>{class t extends jy{constructor(){super(f(MQ),f(ee))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["cdk-header-cell"],["th","cdk-header-cell",""]],hostAttrs:["role","columnheader",1,"cdk-header-cell"],features:[lt]})}return t})();var qaA=(()=>{class t extends jy{constructor(){let A=f(MQ),i=f(ee);super(A,i);let n=A._table?._getCellRole();n&&i.nativeElement.setAttribute("role",n)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["cdk-cell"],["td","cdk-cell",""]],hostAttrs:[1,"cdk-cell"],features:[lt]})}return t})(),qy=class{tasks=[];endTasks=[]},Vy=new dA("_COALESCED_STYLE_SCHEDULER"),uG=(()=>{class t{_currentSchedule=null;_ngZone=f(Qe);constructor(){}schedule(A){this._createScheduleIfNeeded(),this._currentSchedule.tasks.push(A)}scheduleEnd(A){this._createScheduleIfNeeded(),this._currentSchedule.endTasks.push(A)}_createScheduleIfNeeded(){this._currentSchedule||(this._currentSchedule=new qy,this._ngZone.runOutsideAngular(()=>queueMicrotask(()=>{for(;this._currentSchedule.tasks.length||this._currentSchedule.endTasks.length;){let A=this._currentSchedule;this._currentSchedule=new qy;for(let i of A.tasks)i();for(let i of A.endTasks)i()}this._currentSchedule=null})))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac})}return t})();var fG=(()=>{class t{template=f(wn);_differs=f(rg);columns;_columnsDiffer;constructor(){}ngOnChanges(A){if(!this._columnsDiffer){let i=A.columns&&A.columns.currentValue||[];this._columnsDiffer=this._differs.find(i).create(),this._columnsDiffer.diff(i)}}getColumnsDiff(){return this._columnsDiffer.diff(this.columns)}extractCellTemplate(A){return this instanceof If?A.headerCell.template:this instanceof mG?A.footerCell.template:A.cell.template}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,features:[ti]})}return t})(),If=(()=>{class t extends fG{_table=f(Yl,{optional:!0});_hasStickyChanged=!1;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;constructor(){super(f(wn),f(rg))}ngOnChanges(A){super.ngOnChanges(A)}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","cdkHeaderRowDef",""]],inputs:{columns:[0,"cdkHeaderRowDef","columns"],sticky:[2,"cdkHeaderRowDefSticky","sticky",ie]},features:[lt,ti]})}return t})(),mG=(()=>{class t extends fG{_table=f(Yl,{optional:!0});_hasStickyChanged=!1;get sticky(){return this._sticky}set sticky(A){A!==this._sticky&&(this._sticky=A,this._hasStickyChanged=!0)}_sticky=!1;constructor(){super(f(wn),f(rg))}ngOnChanges(A){super.ngOnChanges(A)}hasStickyChanged(){let A=this._hasStickyChanged;return this.resetStickyChanged(),A}resetStickyChanged(){this._hasStickyChanged=!1}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","cdkFooterRowDef",""]],inputs:{columns:[0,"cdkFooterRowDef","columns"],sticky:[2,"cdkFooterRowDefSticky","sticky",ie]},features:[lt,ti]})}return t})(),$y=(()=>{class t extends fG{_table=f(Yl,{optional:!0});when;constructor(){super(f(wn),f(rg))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","cdkRowDef",""]],inputs:{columns:[0,"cdkRowDefColumns","columns"],when:[0,"cdkRowDefWhen","when"]},features:[lt]})}return t})(),td=(()=>{class t{_viewContainer=f(Nn);cells;context;static mostRecentCellOutlet=null;constructor(){t.mostRecentCellOutlet=this}ngOnDestroy(){t.mostRecentCellOutlet===this&&(t.mostRecentCellOutlet=null)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","cdkCellOutlet",""]]})}return t})(),pG=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["cdk-header-row"],["tr","cdk-header-row",""]],hostAttrs:["role","row",1,"cdk-header-row"],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(i,n){i&1&&_r(0,0)},dependencies:[td],encapsulation:2})}return t})();var wG=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["cdk-row"],["tr","cdk-row",""]],hostAttrs:["role","row",1,"cdk-row"],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(i,n){i&1&&_r(0,0)},dependencies:[td],encapsulation:2})}return t})(),VaA=(()=>{class t{templateRef=f(wn);_contentClassName="cdk-no-data-row";constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["ng-template","cdkNoDataRow",""]]})}return t})(),zaA=["top","bottom","left","right"],hG=class{_isNativeHtmlTable;_stickCellCss;direction;_coalescedStyleScheduler;_isBrowser;_needsPositionStickyOnElement;_positionListener;_tableInjector;_elemSizeCache=new WeakMap;_resizeObserver=globalThis?.ResizeObserver?new globalThis.ResizeObserver(e=>this._updateCachedSizes(e)):null;_updatedStickyColumnsParamsToReplay=[];_stickyColumnsReplayTimeout=null;_cachedCellWidths=[];_borderCellCss;_destroyed=!1;constructor(e,A,i,n,o=!0,r=!0,s,a){this._isNativeHtmlTable=e,this._stickCellCss=A,this.direction=i,this._coalescedStyleScheduler=n,this._isBrowser=o,this._needsPositionStickyOnElement=r,this._positionListener=s,this._tableInjector=a,this._borderCellCss={top:`${A}-border-elem-top`,bottom:`${A}-border-elem-bottom`,left:`${A}-border-elem-left`,right:`${A}-border-elem-right`}}clearStickyPositioning(e,A){(A.includes("left")||A.includes("right"))&&this._removeFromStickyColumnReplayQueue(e);let i=[];for(let n of e)n.nodeType===n.ELEMENT_NODE&&i.push(n,...Array.from(n.children));this._afterNextRender({write:()=>{for(let n of i)this._removeStickyStyle(n,A)}})}updateStickyColumns(e,A,i,n=!0,o=!0){if(!e.length||!this._isBrowser||!(A.some(h=>h)||i.some(h=>h))){this._positionListener?.stickyColumnsUpdated({sizes:[]}),this._positionListener?.stickyEndColumnsUpdated({sizes:[]});return}let r=e[0],s=r.children.length,a=this.direction==="rtl",c=a?"right":"left",l=a?"left":"right",I=A.lastIndexOf(!0),C=i.indexOf(!0),d,B,E;o&&this._updateStickyColumnReplayQueue({rows:[...e],stickyStartStates:[...A],stickyEndStates:[...i]}),this._afterNextRender({earlyRead:()=>{d=this._getCellWidths(r,n),B=this._getStickyStartColumnPositions(d,A),E=this._getStickyEndColumnPositions(d,i)},write:()=>{for(let h of e)for(let u=0;u!!h)&&(this._positionListener.stickyColumnsUpdated({sizes:I===-1?[]:d.slice(0,I+1).map((h,u)=>A[u]?h:null)}),this._positionListener.stickyEndColumnsUpdated({sizes:C===-1?[]:d.slice(C).map((h,u)=>i[u+C]?h:null).reverse()}))}})}stickRows(e,A,i){if(!this._isBrowser)return;let n=i==="bottom"?e.slice().reverse():e,o=i==="bottom"?A.slice().reverse():A,r=[],s=[],a=[];this._afterNextRender({earlyRead:()=>{for(let c=0,l=0;c{let c=o.lastIndexOf(!0);for(let l=0;l{let i=e.querySelector("tfoot");i&&(A.some(n=>!n)?this._removeStickyStyle(i,["bottom"]):this._addStickyStyle(i,"bottom",0,!1))}})}destroy(){this._stickyColumnsReplayTimeout&&clearTimeout(this._stickyColumnsReplayTimeout),this._resizeObserver?.disconnect(),this._destroyed=!0}_removeStickyStyle(e,A){for(let n of A)e.style[n]="",e.classList.remove(this._borderCellCss[n]);zaA.some(n=>A.indexOf(n)===-1&&e.style[n])?e.style.zIndex=this._getCalculatedZIndex(e):(e.style.zIndex="",this._needsPositionStickyOnElement&&(e.style.position=""),e.classList.remove(this._stickCellCss))}_addStickyStyle(e,A,i,n){e.classList.add(this._stickCellCss),n&&e.classList.add(this._borderCellCss[A]),e.style[A]=`${i}px`,e.style.zIndex=this._getCalculatedZIndex(e),this._needsPositionStickyOnElement&&(e.style.cssText+="position: -webkit-sticky; position: sticky; ")}_getCalculatedZIndex(e){let A={top:100,bottom:10,left:1,right:1},i=0;for(let n of zaA)e.style[n]&&(i+=A[n]);return i?`${i}`:""}_getCellWidths(e,A=!0){if(!A&&this._cachedCellWidths.length)return this._cachedCellWidths;let i=[],n=e.children;for(let o=0;o0;o--)A[o]&&(i[o]=n,n+=e[o]);return i}_retrieveElementSize(e){let A=this._elemSizeCache.get(e);if(A)return A;let i=e.getBoundingClientRect(),n={width:i.width,height:i.height};return this._resizeObserver&&(this._elemSizeCache.set(e,n),this._resizeObserver.observe(e,{box:"border-box"})),n}_updateStickyColumnReplayQueue(e){this._removeFromStickyColumnReplayQueue(e.rows),this._stickyColumnsReplayTimeout||this._updatedStickyColumnsParamsToReplay.push(e)}_removeFromStickyColumnReplayQueue(e){let A=new Set(e);for(let i of this._updatedStickyColumnsParamsToReplay)i.rows=i.rows.filter(n=>!A.has(n));this._updatedStickyColumnsParamsToReplay=this._updatedStickyColumnsParamsToReplay.filter(i=>!!i.rows.length)}_updateCachedSizes(e){let A=!1;for(let i of e){let n=i.borderBoxSize?.length?{width:i.borderBoxSize[0].inlineSize,height:i.borderBoxSize[0].blockSize}:{width:i.contentRect.width,height:i.contentRect.height};n.width!==this._elemSizeCache.get(i.target)?.width&&qTA(i.target)&&(A=!0),this._elemSizeCache.set(i.target,n)}A&&this._updatedStickyColumnsParamsToReplay.length&&(this._stickyColumnsReplayTimeout&&clearTimeout(this._stickyColumnsReplayTimeout),this._stickyColumnsReplayTimeout=setTimeout(()=>{if(!this._destroyed){for(let i of this._updatedStickyColumnsParamsToReplay)this.updateStickyColumns(i.rows,i.stickyStartStates,i.stickyEndStates,!0,!1);this._updatedStickyColumnsParamsToReplay=[],this._stickyColumnsReplayTimeout=null}},0))}_afterNextRender(e){this._tableInjector?To(e,{injector:this._tableInjector}):this._coalescedStyleScheduler.schedule(()=>{e.earlyRead?.(),e.write()})}};function qTA(t){return["cdk-cell","cdk-header-cell","cdk-footer-cell"].some(e=>t.classList.contains(e))}var Zy=new dA("CDK_SPL");var DG=(()=>{class t{viewContainer=f(Nn);elementRef=f(ee);constructor(){let A=f(Yl);A._rowOutlet=this,A._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","rowOutlet",""]]})}return t})(),yG=(()=>{class t{viewContainer=f(Nn);elementRef=f(ee);constructor(){let A=f(Yl);A._headerRowOutlet=this,A._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","headerRowOutlet",""]]})}return t})(),vG=(()=>{class t{viewContainer=f(Nn);elementRef=f(ee);constructor(){let A=f(Yl);A._footerRowOutlet=this,A._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","footerRowOutlet",""]]})}return t})(),bG=(()=>{class t{viewContainer=f(Nn);elementRef=f(ee);constructor(){let A=f(Yl);A._noDataRowOutlet=this,A._outletAssigned()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","noDataRowOutlet",""]]})}return t})();var MG=(()=>{class t{_differs=f(rg);_changeDetectorRef=f(It);_elementRef=f(ee);_dir=f(mo,{optional:!0});_platform=f(Ii);_viewRepeater=f(Ru);_coalescedStyleScheduler=f(Vy);_viewportRuler=f(Mc);_stickyPositioningListener=f(Zy,{optional:!0,skipSelf:!0});_document=f(at);_data;_onDestroy=new OA;_renderRows;_renderChangeSubscription;_columnDefsByName=new Map;_rowDefs;_headerRowDefs;_footerRowDefs;_dataDiffer;_defaultRowDef;_customColumnDefs=new Set;_customRowDefs=new Set;_customHeaderRowDefs=new Set;_customFooterRowDefs=new Set;_customNoDataRow;_headerRowDefChanged=!0;_footerRowDefChanged=!0;_stickyColumnStylesNeedReset=!0;_forceRecalculateCellWidths=!0;_cachedRenderRowsMap=new Map;_isNativeHtmlTable;_stickyStyler;stickyCssClass="cdk-table-sticky";needsPositionStickyOnElement=!0;_isServer;_isShowingNoDataRow=!1;_hasAllOutlets=!1;_hasInitialized=!1;_getCellRole(){if(this._cellRoleInternal===void 0){let A=this._elementRef.nativeElement.getAttribute("role");return A==="grid"||A==="treegrid"?"gridcell":"cell"}return this._cellRoleInternal}_cellRoleInternal=void 0;get trackBy(){return this._trackByFn}set trackBy(A){this._trackByFn=A}_trackByFn;get dataSource(){return this._dataSource}set dataSource(A){this._dataSource!==A&&this._switchDataSource(A)}_dataSource;get multiTemplateDataRows(){return this._multiTemplateDataRows}set multiTemplateDataRows(A){this._multiTemplateDataRows=A,this._rowOutlet&&this._rowOutlet.viewContainer.length&&(this._forceRenderDataRows(),this.updateStickyColumnStyles())}_multiTemplateDataRows=!1;get fixedLayout(){return this._fixedLayout}set fixedLayout(A){this._fixedLayout=A,this._forceRecalculateCellWidths=!0,this._stickyColumnStylesNeedReset=!0}_fixedLayout=!1;contentChanged=new WA;viewChange=new Mi({start:0,end:Number.MAX_VALUE});_rowOutlet;_headerRowOutlet;_footerRowOutlet;_noDataRowOutlet;_contentColumnDefs;_contentRowDefs;_contentHeaderRowDefs;_contentFooterRowDefs;_noDataRow;_injector=f(Rt);constructor(){f(new wr("role"),{optional:!0})||this._elementRef.nativeElement.setAttribute("role","table"),this._isServer=!this._platform.isBrowser,this._isNativeHtmlTable=this._elementRef.nativeElement.nodeName==="TABLE"}ngOnInit(){this._setupStickyStyler(),this._dataDiffer=this._differs.find([]).create((A,i)=>this.trackBy?this.trackBy(i.dataIndex,i.data):i),this._viewportRuler.change().pipe(St(this._onDestroy)).subscribe(()=>{this._forceRecalculateCellWidths=!0})}ngAfterContentInit(){this._hasInitialized=!0}ngAfterContentChecked(){this._canRender()&&this._render()}ngOnDestroy(){this._stickyStyler?.destroy(),[this._rowOutlet?.viewContainer,this._headerRowOutlet?.viewContainer,this._footerRowOutlet?.viewContainer,this._cachedRenderRowsMap,this._customColumnDefs,this._customRowDefs,this._customHeaderRowDefs,this._customFooterRowDefs,this._columnDefsByName].forEach(A=>{A?.clear()}),this._headerRowDefs=[],this._footerRowDefs=[],this._defaultRowDef=null,this._onDestroy.next(),this._onDestroy.complete(),I8(this.dataSource)&&this.dataSource.disconnect(this)}renderRows(){this._renderRows=this._getAllRenderRows();let A=this._dataDiffer.diff(this._renderRows);if(!A){this._updateNoDataRow(),this.contentChanged.next();return}let i=this._rowOutlet.viewContainer;this._viewRepeater.applyChanges(A,i,(n,o,r)=>this._getEmbeddedViewArgs(n.item,r),n=>n.item.data,n=>{n.operation===SB.INSERTED&&n.context&&this._renderCellTemplateForItem(n.record.item.rowDef,n.context)}),this._updateRowIndexContext(),A.forEachIdentityChange(n=>{let o=i.get(n.currentIndex);o.context.$implicit=n.item.data}),this._updateNoDataRow(),this.contentChanged.next(),this.updateStickyColumnStyles()}addColumnDef(A){this._customColumnDefs.add(A)}removeColumnDef(A){this._customColumnDefs.delete(A)}addRowDef(A){this._customRowDefs.add(A)}removeRowDef(A){this._customRowDefs.delete(A)}addHeaderRowDef(A){this._customHeaderRowDefs.add(A),this._headerRowDefChanged=!0}removeHeaderRowDef(A){this._customHeaderRowDefs.delete(A),this._headerRowDefChanged=!0}addFooterRowDef(A){this._customFooterRowDefs.add(A),this._footerRowDefChanged=!0}removeFooterRowDef(A){this._customFooterRowDefs.delete(A),this._footerRowDefChanged=!0}setNoDataRow(A){this._customNoDataRow=A}updateStickyHeaderRowStyles(){let A=this._getRenderedRows(this._headerRowOutlet);if(this._isNativeHtmlTable){let n=OaA(this._headerRowOutlet,"thead");n&&(n.style.display=A.length?"":"none")}let i=this._headerRowDefs.map(n=>n.sticky);this._stickyStyler.clearStickyPositioning(A,["top"]),this._stickyStyler.stickRows(A,i,"top"),this._headerRowDefs.forEach(n=>n.resetStickyChanged())}updateStickyFooterRowStyles(){let A=this._getRenderedRows(this._footerRowOutlet);if(this._isNativeHtmlTable){let n=OaA(this._footerRowOutlet,"tfoot");n&&(n.style.display=A.length?"":"none")}let i=this._footerRowDefs.map(n=>n.sticky);this._stickyStyler.clearStickyPositioning(A,["bottom"]),this._stickyStyler.stickRows(A,i,"bottom"),this._stickyStyler.updateStickyFooterContainer(this._elementRef.nativeElement,i),this._footerRowDefs.forEach(n=>n.resetStickyChanged())}updateStickyColumnStyles(){let A=this._getRenderedRows(this._headerRowOutlet),i=this._getRenderedRows(this._rowOutlet),n=this._getRenderedRows(this._footerRowOutlet);(this._isNativeHtmlTable&&!this._fixedLayout||this._stickyColumnStylesNeedReset)&&(this._stickyStyler.clearStickyPositioning([...A,...i,...n],["left","right"]),this._stickyColumnStylesNeedReset=!1),A.forEach((o,r)=>{this._addStickyColumnStyles([o],this._headerRowDefs[r])}),this._rowDefs.forEach(o=>{let r=[];for(let s=0;s{this._addStickyColumnStyles([o],this._footerRowDefs[r])}),Array.from(this._columnDefsByName.values()).forEach(o=>o.resetStickyChanged())}_outletAssigned(){!this._hasAllOutlets&&this._rowOutlet&&this._headerRowOutlet&&this._footerRowOutlet&&this._noDataRowOutlet&&(this._hasAllOutlets=!0,this._canRender()&&this._render())}_canRender(){return this._hasAllOutlets&&this._hasInitialized}_render(){this._cacheRowDefs(),this._cacheColumnDefs(),!this._headerRowDefs.length&&!this._footerRowDefs.length&&this._rowDefs.length;let i=this._renderUpdatedColumns()||this._headerRowDefChanged||this._footerRowDefChanged;this._stickyColumnStylesNeedReset=this._stickyColumnStylesNeedReset||i,this._forceRecalculateCellWidths=i,this._headerRowDefChanged&&(this._forceRenderHeaderRows(),this._headerRowDefChanged=!1),this._footerRowDefChanged&&(this._forceRenderFooterRows(),this._footerRowDefChanged=!1),this.dataSource&&this._rowDefs.length>0&&!this._renderChangeSubscription?this._observeRenderChanges():this._stickyColumnStylesNeedReset&&this.updateStickyColumnStyles(),this._checkStickyStates()}_getAllRenderRows(){let A=[],i=this._cachedRenderRowsMap;this._cachedRenderRowsMap=new Map;for(let n=0;n{let s=n&&n.has(r)?n.get(r):[];if(s.length){let a=s.shift();return a.dataIndex=i,a}else return{data:A,rowDef:r,dataIndex:i}})}_cacheColumnDefs(){this._columnDefsByName.clear(),Py(this._getOwnDefs(this._contentColumnDefs),this._customColumnDefs).forEach(i=>{this._columnDefsByName.has(i.name),this._columnDefsByName.set(i.name,i)})}_cacheRowDefs(){this._headerRowDefs=Py(this._getOwnDefs(this._contentHeaderRowDefs),this._customHeaderRowDefs),this._footerRowDefs=Py(this._getOwnDefs(this._contentFooterRowDefs),this._customFooterRowDefs),this._rowDefs=Py(this._getOwnDefs(this._contentRowDefs),this._customRowDefs);let A=this._rowDefs.filter(i=>!i.when);!this.multiTemplateDataRows&&A.length>1,this._defaultRowDef=A[0]}_renderUpdatedColumns(){let A=(r,s)=>{let a=!!s.getColumnsDiff();return r||a},i=this._rowDefs.reduce(A,!1);i&&this._forceRenderDataRows();let n=this._headerRowDefs.reduce(A,!1);n&&this._forceRenderHeaderRows();let o=this._footerRowDefs.reduce(A,!1);return o&&this._forceRenderFooterRows(),i||n||o}_switchDataSource(A){this._data=[],I8(this.dataSource)&&this.dataSource.disconnect(this),this._renderChangeSubscription&&(this._renderChangeSubscription.unsubscribe(),this._renderChangeSubscription=null),A||(this._dataDiffer&&this._dataDiffer.diff([]),this._rowOutlet&&this._rowOutlet.viewContainer.clear()),this._dataSource=A}_observeRenderChanges(){if(!this.dataSource)return;let A;I8(this.dataSource)?A=this.dataSource.connect(this):I2(this.dataSource)?A=this.dataSource:Array.isArray(this.dataSource)&&(A=Me(this.dataSource)),this._renderChangeSubscription=A.pipe(St(this._onDestroy)).subscribe(i=>{this._data=i||[],this.renderRows()})}_forceRenderHeaderRows(){this._headerRowOutlet.viewContainer.length>0&&this._headerRowOutlet.viewContainer.clear(),this._headerRowDefs.forEach((A,i)=>this._renderRow(this._headerRowOutlet,A,i)),this.updateStickyHeaderRowStyles()}_forceRenderFooterRows(){this._footerRowOutlet.viewContainer.length>0&&this._footerRowOutlet.viewContainer.clear(),this._footerRowDefs.forEach((A,i)=>this._renderRow(this._footerRowOutlet,A,i)),this.updateStickyFooterRowStyles()}_addStickyColumnStyles(A,i){let n=Array.from(i?.columns||[]).map(s=>{let a=this._columnDefsByName.get(s);return a}),o=n.map(s=>s.sticky),r=n.map(s=>s.stickyEnd);this._stickyStyler.updateStickyColumns(A,o,r,!this._fixedLayout||this._forceRecalculateCellWidths)}_getRenderedRows(A){let i=[];for(let n=0;n!o.when||o.when(i,A));else{let o=this._rowDefs.find(r=>r.when&&r.when(i,A))||this._defaultRowDef;o&&n.push(o)}return n.length,n}_getEmbeddedViewArgs(A,i){let n=A.rowDef,o={$implicit:A.data};return{templateRef:n.template,context:o,index:i}}_renderRow(A,i,n,o={}){let r=A.viewContainer.createEmbeddedView(i.template,o,n);return this._renderCellTemplateForItem(i,o),r}_renderCellTemplateForItem(A,i){for(let n of this._getCellTemplates(A))td.mostRecentCellOutlet&&td.mostRecentCellOutlet._viewContainer.createEmbeddedView(n,i);this._changeDetectorRef.markForCheck()}_updateRowIndexContext(){let A=this._rowOutlet.viewContainer;for(let i=0,n=A.length;i{let n=this._columnDefsByName.get(i);return A.extractCellTemplate(n)})}_forceRenderDataRows(){this._dataDiffer.diff([]),this._rowOutlet.viewContainer.clear(),this.renderRows()}_checkStickyStates(){let A=(i,n)=>i||n.hasStickyChanged();this._headerRowDefs.reduce(A,!1)&&this.updateStickyHeaderRowStyles(),this._footerRowDefs.reduce(A,!1)&&this.updateStickyFooterRowStyles(),Array.from(this._columnDefsByName.values()).reduce(A,!1)&&(this._stickyColumnStylesNeedReset=!0,this.updateStickyColumnStyles())}_setupStickyStyler(){let A=this._dir?this._dir.value:"ltr";this._stickyStyler=new hG(this._isNativeHtmlTable,this.stickyCssClass,A,this._coalescedStyleScheduler,this._platform.isBrowser,this.needsPositionStickyOnElement,this._stickyPositioningListener,this._injector),(this._dir?this._dir.change:Me()).pipe(St(this._onDestroy)).subscribe(i=>{this._stickyStyler.direction=i,this.updateStickyColumnStyles()})}_getOwnDefs(A){return A.filter(i=>!i._table||i._table===this)}_updateNoDataRow(){let A=this._customNoDataRow||this._noDataRow;if(!A)return;let i=this._rowOutlet.viewContainer.length===0;if(i===this._isShowingNoDataRow)return;let n=this._noDataRowOutlet.viewContainer;if(i){let o=n.createEmbeddedView(A.templateRef),r=o.rootNodes[0];o.rootNodes.length===1&&r?.nodeType===this._document.ELEMENT_NODE&&(r.setAttribute("role","row"),r.classList.add(A._contentClassName))}else n.clear();this._isShowingNoDataRow=i,this._changeDetectorRef.markForCheck()}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["cdk-table"],["table","cdk-table",""]],contentQueries:function(i,n,o){if(i&1&&(ci(o,VaA,5),ci(o,MQ,5),ci(o,$y,5),ci(o,If,5),ci(o,mG,5)),i&2){let r;XA(r=$A())&&(n._noDataRow=r.first),XA(r=$A())&&(n._contentColumnDefs=r),XA(r=$A())&&(n._contentRowDefs=r),XA(r=$A())&&(n._contentHeaderRowDefs=r),XA(r=$A())&&(n._contentFooterRowDefs=r)}},hostAttrs:[1,"cdk-table"],hostVars:2,hostBindings:function(i,n){i&2&&ue("cdk-table-fixed-layout",n.fixedLayout)},inputs:{trackBy:"trackBy",dataSource:"dataSource",multiTemplateDataRows:[2,"multiTemplateDataRows","multiTemplateDataRows",ie],fixedLayout:[2,"fixedLayout","fixedLayout",ie]},outputs:{contentChanged:"contentChanged"},exportAs:["cdkTable"],features:[ht([{provide:Yl,useExisting:t},{provide:Ru,useClass:RB},{provide:Vy,useClass:uG},{provide:Zy,useValue:null}])],ngContentSelectors:zTA,decls:5,vars:2,consts:[["role","rowgroup"],["headerRowOutlet",""],["rowOutlet",""],["noDataRowOutlet",""],["footerRowOutlet",""]],template:function(i,n){i&1&&(jt(HTA),Fe(0),Fe(1,1),_A(2,OTA,1,0)(3,PTA,7,0)(4,jTA,4,0)),i&2&&(G(2),GA(n._isServer?2:-1),G(),GA(n._isNativeHtmlTable?3:4))},dependencies:[yG,DG,bG,vG],styles:[".cdk-table-fixed-layout{table-layout:fixed}"],encapsulation:2})}return t})();function Py(t,e){return t.concat(Array.from(e))}function OaA(t,e){let A=e.toUpperCase(),i=t.viewContainer.element.nativeElement;for(;i;){let n=i.nodeType===1?i.nodeName:null;if(n===A)return i;if(n==="TABLE")break;i=i.parentNode}return null}var ZaA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[xu]})}return t})();var VTA=[[["caption"]],[["colgroup"],["col"]],"*"],ZTA=["caption","colgroup, col","*"];function WTA(t,e){t&1&&Fe(0,2)}function XTA(t,e){t&1&&(S(0,"thead",0),_r(1,1),F(),S(2,"tbody",2),_r(3,3)(4,4),F(),S(5,"tfoot",0),_r(6,5),F())}function $TA(t,e){t&1&&_r(0,1)(1,3)(2,4)(3,5)}var WaA=(()=>{class t extends MG{stickyCssClass="mat-mdc-table-sticky";needsPositionStickyOnElement=!1;static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275cmp=zA({type:t,selectors:[["mat-table"],["table","mat-table",""]],hostAttrs:[1,"mat-mdc-table","mdc-data-table__table"],hostVars:2,hostBindings:function(i,n){i&2&&ue("mdc-table-fixed-layout",n.fixedLayout)},exportAs:["matTable"],features:[ht([{provide:MG,useExisting:t},{provide:Yl,useExisting:t},{provide:Vy,useClass:uG},{provide:Ru,useClass:RB},{provide:Zy,useValue:null}]),lt],ngContentSelectors:ZTA,decls:5,vars:2,consts:[["role","rowgroup"],["headerRowOutlet",""],["role","rowgroup",1,"mdc-data-table__content"],["rowOutlet",""],["noDataRowOutlet",""],["footerRowOutlet",""]],template:function(i,n){i&1&&(jt(VTA),Fe(0),Fe(1,1),_A(2,WTA,1,0)(3,XTA,7,0)(4,$TA,4,0)),i&2&&(G(2),GA(n._isServer?2:-1),G(),GA(n._isNativeHtmlTable?3:4))},dependencies:[yG,DG,bG,vG],styles:[".mat-mdc-table-sticky{position:sticky !important}mat-table{display:block}mat-header-row{min-height:56px}mat-row,mat-footer-row{min-height:48px}mat-row,mat-header-row,mat-footer-row{display:flex;border-width:0;border-bottom-width:1px;border-style:solid;align-items:center;box-sizing:border-box}mat-cell:first-of-type,mat-header-cell:first-of-type,mat-footer-cell:first-of-type{padding-left:24px}[dir=rtl] mat-cell:first-of-type:not(:only-of-type),[dir=rtl] mat-header-cell:first-of-type:not(:only-of-type),[dir=rtl] mat-footer-cell:first-of-type:not(:only-of-type){padding-left:0;padding-right:24px}mat-cell:last-of-type,mat-header-cell:last-of-type,mat-footer-cell:last-of-type{padding-right:24px}[dir=rtl] mat-cell:last-of-type:not(:only-of-type),[dir=rtl] mat-header-cell:last-of-type:not(:only-of-type),[dir=rtl] mat-footer-cell:last-of-type:not(:only-of-type){padding-right:0;padding-left:24px}mat-cell,mat-header-cell,mat-footer-cell{flex:1;display:flex;align-items:center;overflow:hidden;word-wrap:break-word;min-height:inherit}.mat-mdc-table{min-width:100%;border:0;border-spacing:0;table-layout:auto;white-space:normal;background-color:var(--mat-table-background-color, var(--mat-sys-surface))}.mdc-data-table__cell{box-sizing:border-box;overflow:hidden;text-align:left;text-overflow:ellipsis}[dir=rtl] .mdc-data-table__cell{text-align:right}.mdc-data-table__cell,.mdc-data-table__header-cell{padding:0 16px}.mat-mdc-header-row{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:var(--mat-table-header-container-height, 56px);color:var(--mat-table-header-headline-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-table-header-headline-font, var(--mat-sys-title-small-font, Roboto, sans-serif));line-height:var(--mat-table-header-headline-line-height, var(--mat-sys-title-small-line-height));font-size:var(--mat-table-header-headline-size, var(--mat-sys-title-small-size, 14px));font-weight:var(--mat-table-header-headline-weight, var(--mat-sys-title-small-weight, 500))}.mat-mdc-row{height:var(--mat-table-row-item-container-height, 52px);color:var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)))}.mat-mdc-row,.mdc-data-table__content{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mat-table-row-item-label-text-font, var(--mat-sys-body-medium-font, Roboto, sans-serif));line-height:var(--mat-table-row-item-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-table-row-item-label-text-size, var(--mat-sys-body-medium-size, 14px));font-weight:var(--mat-table-row-item-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-footer-row{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;height:var(--mat-table-footer-container-height, 52px);color:var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface, rgba(0, 0, 0, 0.87)));font-family:var(--mat-table-footer-supporting-text-font, var(--mat-sys-body-medium-font, Roboto, sans-serif));line-height:var(--mat-table-footer-supporting-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-table-footer-supporting-text-size, var(--mat-sys-body-medium-size, 14px));font-weight:var(--mat-table-footer-supporting-text-weight, var(--mat-sys-body-medium-weight));letter-spacing:var(--mat-table-footer-supporting-text-tracking, var(--mat-sys-body-medium-tracking))}.mat-mdc-header-cell{border-bottom-color:var(--mat-table-row-item-outline-color, var(--mat-sys-outline, rgba(0, 0, 0, 0.12)));border-bottom-width:var(--mat-table-row-item-outline-width, 1px);border-bottom-style:solid;letter-spacing:var(--mat-table-header-headline-tracking, var(--mat-sys-title-small-tracking));font-weight:inherit;line-height:inherit;box-sizing:border-box;text-overflow:ellipsis;overflow:hidden;outline:none;text-align:left}[dir=rtl] .mat-mdc-header-cell{text-align:right}.mdc-data-table__row:last-child>.mat-mdc-header-cell{border-bottom:none}.mat-mdc-cell{border-bottom-color:var(--mat-table-row-item-outline-color, var(--mat-sys-outline, rgba(0, 0, 0, 0.12)));border-bottom-width:var(--mat-table-row-item-outline-width, 1px);border-bottom-style:solid;letter-spacing:var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking));line-height:inherit}.mdc-data-table__row:last-child>.mat-mdc-cell{border-bottom:none}.mat-mdc-footer-cell{letter-spacing:var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking))}mat-row.mat-mdc-row,mat-header-row.mat-mdc-header-row,mat-footer-row.mat-mdc-footer-row{border-bottom:none}.mat-mdc-table tbody,.mat-mdc-table tfoot,.mat-mdc-table thead,.mat-mdc-cell,.mat-mdc-footer-cell,.mat-mdc-header-row,.mat-mdc-row,.mat-mdc-footer-row,.mat-mdc-table .mat-mdc-header-cell{background:inherit}.mat-mdc-table mat-header-row.mat-mdc-header-row,.mat-mdc-table mat-row.mat-mdc-row,.mat-mdc-table mat-footer-row.mat-mdc-footer-cell{height:unset}mat-header-cell.mat-mdc-header-cell,mat-cell.mat-mdc-cell,mat-footer-cell.mat-mdc-footer-cell{align-self:stretch}"],encapsulation:2})}return t})(),XaA=(()=>{class t extends Wy{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275dir=jA({type:t,selectors:[["","matCellDef",""]],features:[ht([{provide:Wy,useExisting:t}]),lt]})}return t})(),$aA=(()=>{class t extends Xy{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275dir=jA({type:t,selectors:[["","matHeaderCellDef",""]],features:[ht([{provide:Xy,useExisting:t}]),lt]})}return t})();var AcA=(()=>{class t extends MQ{get name(){return this._name}set name(A){this._setNameInput(A)}_updateColumnCssClassName(){super._updateColumnCssClassName(),this._columnCssClassName.push(`mat-column-${this.cssClassFriendlyName}`)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275dir=jA({type:t,selectors:[["","matColumnDef",""]],inputs:{name:[0,"matColumnDef","name"]},features:[ht([{provide:MQ,useExisting:t},{provide:"MAT_SORT_HEADER_COLUMN_DEF",useExisting:t}]),lt]})}return t})(),ecA=(()=>{class t extends jaA{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275dir=jA({type:t,selectors:[["mat-header-cell"],["th","mat-header-cell",""]],hostAttrs:["role","columnheader",1,"mat-mdc-header-cell","mdc-data-table__header-cell"],features:[lt]})}return t})();var tcA=(()=>{class t extends qaA{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275dir=jA({type:t,selectors:[["mat-cell"],["td","mat-cell",""]],hostAttrs:[1,"mat-mdc-cell","mdc-data-table__cell"],features:[lt]})}return t})();var icA=(()=>{class t extends If{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275dir=jA({type:t,selectors:[["","matHeaderRowDef",""]],inputs:{columns:[0,"matHeaderRowDef","columns"],sticky:[2,"matHeaderRowDefSticky","sticky",ie]},features:[ht([{provide:If,useExisting:t}]),lt]})}return t})();var ncA=(()=>{class t extends $y{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275dir=jA({type:t,selectors:[["","matRowDef",""]],inputs:{columns:[0,"matRowDefColumns","columns"],when:[0,"matRowDefWhen","when"]},features:[ht([{provide:$y,useExisting:t}]),lt]})}return t})(),ocA=(()=>{class t extends pG{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275cmp=zA({type:t,selectors:[["mat-header-row"],["tr","mat-header-row",""]],hostAttrs:["role","row",1,"mat-mdc-header-row","mdc-data-table__header-row"],exportAs:["matHeaderRow"],features:[ht([{provide:pG,useExisting:t}]),lt],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(i,n){i&1&&_r(0,0)},dependencies:[td],encapsulation:2})}return t})();var rcA=(()=>{class t extends wG{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275cmp=zA({type:t,selectors:[["mat-row"],["tr","mat-row",""]],hostAttrs:["role","row",1,"mat-mdc-row","mdc-data-table__row"],exportAs:["matRow"],features:[ht([{provide:wG,useExisting:t}]),lt],decls:1,vars:0,consts:[["cdkCellOutlet",""]],template:function(i,n){i&1&&_r(0,0)},dependencies:[td],encapsulation:2})}return t})();var scA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[it,ZaA,it]})}return t})(),AHA=9007199254740991,Cf=class extends g8{_data;_renderData=new Mi([]);_filter=new Mi("");_internalPageChanges=new OA;_renderChangesSubscription=null;filteredData;get data(){return this._data.value}set data(e){e=Array.isArray(e)?e:[],this._data.next(e),this._renderChangesSubscription||this._filterData(e)}get filter(){return this._filter.value}set filter(e){this._filter.next(e),this._renderChangesSubscription||this._filterData(this.data)}get sort(){return this._sort}set sort(e){this._sort=e,this._updateChangeSubscription()}_sort;get paginator(){return this._paginator}set paginator(e){this._paginator=e,this._updateChangeSubscription()}_paginator;sortingDataAccessor=(e,A)=>{let i=e[A];if(ak(i)){let n=Number(i);return n{let i=A.active,n=A.direction;return!i||n==""?e:e.sort((o,r)=>{let s=this.sortingDataAccessor(o,i),a=this.sortingDataAccessor(r,i),c=typeof s,l=typeof a;c!==l&&(c==="number"&&(s+=""),l==="number"&&(a+=""));let I=0;return s!=null&&a!=null?s>a?I=1:s{let i=A.trim().toLowerCase();return Object.values(e).some(n=>`${n}`.toLowerCase().includes(i))};constructor(e=[]){super(),this._data=new Mi(e),this._updateChangeSubscription()}_updateChangeSubscription(){let e=this._sort?zn(this._sort.sortChange,this._sort.initialized):Me(null),A=this._paginator?zn(this._paginator.page,this._internalPageChanges,this._paginator.initialized):Me(null),i=this._data,n=Js([i,this._filter]).pipe(je(([s])=>this._filterData(s))),o=Js([n,e]).pipe(je(([s])=>this._orderData(s))),r=Js([o,A]).pipe(je(([s])=>this._pageData(s)));this._renderChangesSubscription?.unsubscribe(),this._renderChangesSubscription=r.subscribe(s=>this._renderData.next(s))}_filterData(e){return this.filteredData=this.filter==null||this.filter===""?e:e.filter(A=>this.filterPredicate(A,this.filter)),this.paginator&&this._updatePaginator(this.filteredData.length),this.filteredData}_orderData(e){return this.sort?this.sortData(e.slice(),this.sort):e}_pageData(e){if(!this.paginator)return e;let A=this.paginator.pageIndex*this.paginator.pageSize;return e.slice(A,A+this.paginator.pageSize)}_updatePaginator(e){Promise.resolve().then(()=>{let A=this.paginator;if(A&&(A.length=e,A.pageIndex>0)){let i=Math.ceil(A.length/A.pageSize)-1||0,n=Math.min(A.pageIndex,i);n!==A.pageIndex&&(A.pageIndex=n,this._internalPageChanges.next())}})}connect(){return this._renderChangesSubscription||this._updateChangeSubscription(),this._renderData}disconnect(){this._renderChangesSubscription?.unsubscribe(),this._renderChangesSubscription=null}};var acA=[{metricName:"tool_trajectory_avg_score",threshold:1},{metricName:"response_match_score",threshold:.7}];var us=[];for(let t=0;t<256;++t)us.push((t+256).toString(16).slice(1));function ccA(t,e=0){return(us[t[e+0]]+us[t[e+1]]+us[t[e+2]]+us[t[e+3]]+"-"+us[t[e+4]]+us[t[e+5]]+"-"+us[t[e+6]]+us[t[e+7]]+"-"+us[t[e+8]]+us[t[e+9]]+"-"+us[t[e+10]]+us[t[e+11]]+us[t[e+12]]+us[t[e+13]]+us[t[e+14]]+us[t[e+15]]).toLowerCase()}var kG,tHA=new Uint8Array(16);function SG(){if(!kG){if(typeof crypto>"u"||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");kG=crypto.getRandomValues.bind(crypto)}return kG(tHA)}var iHA=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),RG={randomUUID:iHA};function nHA(t,e,A){if(RG.randomUUID&&!e&&!t)return RG.randomUUID();t=t||{};let i=t.random??t.rng?.()??SG();if(i.length<16)throw new Error("Random bytes length must be >= 16");if(i[6]=i[6]&15|64,i[8]=i[8]&63|128,e){if(A=A||0,A<0||A+16>e.length)throw new RangeError(`UUID byte range ${A}:${A+15} is out of buffer bounds`);for(let n=0;n<16;++n)e[A+n]=i[n];return e}return ccA(i)}var df=nHA;var Vc=class t{constructor(e){this.http=e}apiServerDomain=vs.getApiServerBaseUrl();getEvalSets(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/apps/${e}/eval_sets`;return this.http.get(A)}return new ct}createNewEvalSet(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${e}/eval_sets/${A}`;return this.http.post(i,{})}return new ct}listEvalCases(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/evals`;return this.http.get(i,{})}return new ct}addCurrentSession(e,A,i,n,o){let r=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/add_session`;return this.http.post(r,{evalId:i,sessionId:n,userId:o})}runEval(e,A,i,n){let o=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/run_eval`;return this.http.post(o,{evalIds:i,evalMetrics:n})}listEvalResults(e){if(this.apiServerDomain!=null){let A=this.apiServerDomain+`/apps/${e}/eval_results`;return this.http.get(A,{})}return new ct}getEvalResult(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${e}/eval_results/${A}`;return this.http.get(i,{})}return new ct}getEvalCase(e,A,i){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/evals/${i}`;return this.http.get(n,{})}return new ct}updateEvalCase(e,A,i,n){let o=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/evals/${i}`;return this.http.put(o,{evalId:i,conversation:n.conversation,sessionInput:n.sessionInput,creationTimestamp:n.creationTimestamp})}deleteEvalCase(e,A,i){let n=this.apiServerDomain+`/apps/${e}/eval_sets/${A}/evals/${i}`;return this.http.delete(n,{})}static \u0275fac=function(A){return new(A||t)(we(Ds))};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})};var gcA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["ng-component"]],hostAttrs:["cdk-text-field-style-loader",""],decls:0,vars:0,template:function(i,n){},styles:["textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0 !important;box-sizing:content-box !important;height:auto !important;overflow:hidden !important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0 !important;box-sizing:content-box !important;height:0 !important}@keyframes cdk-text-field-autofill-start{/*!*/}@keyframes cdk-text-field-autofill-end{/*!*/}.cdk-text-field-autofill-monitored:-webkit-autofill{animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){animation:cdk-text-field-autofill-end 0s 1ms}"],encapsulation:2,changeDetection:0})}return t})(),lcA=bc({passive:!0}),IcA=(()=>{class t{_platform=f(Ii);_ngZone=f(Qe);_styleLoader=f(Rn);_monitoredElements=new Map;constructor(){}monitor(A){if(!this._platform.isBrowser)return sr;this._styleLoader.load(gcA);let i=ua(A),n=this._monitoredElements.get(i);if(n)return n.subject;let o=new OA,r="cdk-text-field-autofilled",s=a=>{a.animationName==="cdk-text-field-autofill-start"&&!i.classList.contains(r)?(i.classList.add(r),this._ngZone.run(()=>o.next({target:a.target,isAutofilled:!0}))):a.animationName==="cdk-text-field-autofill-end"&&i.classList.contains(r)&&(i.classList.remove(r),this._ngZone.run(()=>o.next({target:a.target,isAutofilled:!1})))};return this._ngZone.runOutsideAngular(()=>{i.addEventListener("animationstart",s,lcA),i.classList.add("cdk-text-field-autofill-monitored")}),this._monitoredElements.set(i,{subject:o,unlisten:()=>{i.removeEventListener("animationstart",s,lcA)}}),o}stopMonitoring(A){let i=ua(A),n=this._monitoredElements.get(i);n&&(n.unlisten(),n.subject.complete(),i.classList.remove("cdk-text-field-autofill-monitored"),i.classList.remove("cdk-text-field-autofilled"),this._monitoredElements.delete(i))}ngOnDestroy(){this._monitoredElements.forEach((A,i)=>this.stopMonitoring(i))}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})}return t})();var CcA=(()=>{class t{_elementRef=f(ee);_platform=f(Ii);_ngZone=f(Qe);_renderer=f(Wi);_resizeEvents=new OA;_previousValue;_initialHeight;_destroyed=new OA;_listenerCleanups;_minRows;_maxRows;_enabled=!0;_previousMinRows=-1;_textareaElement;get minRows(){return this._minRows}set minRows(A){this._minRows=zs(A),this._setMinHeight()}get maxRows(){return this._maxRows}set maxRows(A){this._maxRows=zs(A),this._setMaxHeight()}get enabled(){return this._enabled}set enabled(A){this._enabled!==A&&((this._enabled=A)?this.resizeToFitContent(!0):this.reset())}get placeholder(){return this._textareaElement.placeholder}set placeholder(A){this._cachedPlaceholderHeight=void 0,A?this._textareaElement.setAttribute("placeholder",A):this._textareaElement.removeAttribute("placeholder"),this._cacheTextareaPlaceholderHeight()}_cachedLineHeight;_cachedPlaceholderHeight;_document=f(at,{optional:!0});_hasFocus;_isViewInited=!1;constructor(){f(Rn).load(gcA),this._textareaElement=this._elementRef.nativeElement}_setMinHeight(){let A=this.minRows&&this._cachedLineHeight?`${this.minRows*this._cachedLineHeight}px`:null;A&&(this._textareaElement.style.minHeight=A)}_setMaxHeight(){let A=this.maxRows&&this._cachedLineHeight?`${this.maxRows*this._cachedLineHeight}px`:null;A&&(this._textareaElement.style.maxHeight=A)}ngAfterViewInit(){this._platform.isBrowser&&(this._initialHeight=this._textareaElement.style.height,this.resizeToFitContent(),this._ngZone.runOutsideAngular(()=>{this._listenerCleanups=[this._renderer.listen("window","resize",()=>this._resizeEvents.next()),this._renderer.listen(this._textareaElement,"focus",this._handleFocusEvent),this._renderer.listen(this._textareaElement,"blur",this._handleFocusEvent)],this._resizeEvents.pipe(yd(16)).subscribe(()=>{this._cachedLineHeight=this._cachedPlaceholderHeight=void 0,this.resizeToFitContent(!0)})}),this._isViewInited=!0,this.resizeToFitContent(!0))}ngOnDestroy(){this._listenerCleanups?.forEach(A=>A()),this._resizeEvents.complete(),this._destroyed.next(),this._destroyed.complete()}_cacheTextareaLineHeight(){if(this._cachedLineHeight)return;let A=this._textareaElement.cloneNode(!1),i=A.style;A.rows=1,i.position="absolute",i.visibility="hidden",i.border="none",i.padding="0",i.height="",i.minHeight="",i.maxHeight="",i.top=i.bottom=i.left=i.right="auto",i.overflow="hidden",this._textareaElement.parentNode.appendChild(A),this._cachedLineHeight=A.clientHeight,A.remove(),this._setMinHeight(),this._setMaxHeight()}_measureScrollHeight(){let A=this._textareaElement,i=A.style.marginBottom||"",n=this._platform.FIREFOX,o=n&&this._hasFocus,r=n?"cdk-textarea-autosize-measuring-firefox":"cdk-textarea-autosize-measuring";o&&(A.style.marginBottom=`${A.clientHeight}px`),A.classList.add(r);let s=A.scrollHeight-4;return A.classList.remove(r),o&&(A.style.marginBottom=i),s}_cacheTextareaPlaceholderHeight(){if(!this._isViewInited||this._cachedPlaceholderHeight!=null)return;if(!this.placeholder){this._cachedPlaceholderHeight=0;return}let A=this._textareaElement.value;this._textareaElement.value=this._textareaElement.placeholder,this._cachedPlaceholderHeight=this._measureScrollHeight(),this._textareaElement.value=A}_handleFocusEvent=A=>{this._hasFocus=A.type==="focus"};ngDoCheck(){this._platform.isBrowser&&this.resizeToFitContent()}resizeToFitContent(A=!1){if(!this._enabled||(this._cacheTextareaLineHeight(),this._cacheTextareaPlaceholderHeight(),!this._cachedLineHeight))return;let i=this._elementRef.nativeElement,n=i.value;if(!A&&this._minRows===this._previousMinRows&&n===this._previousValue)return;let o=this._measureScrollHeight(),r=Math.max(o,this._cachedPlaceholderHeight||0);i.style.height=`${r}px`,this._ngZone.runOutsideAngular(()=>{typeof requestAnimationFrame<"u"?requestAnimationFrame(()=>this._scrollToCaretPosition(i)):setTimeout(()=>this._scrollToCaretPosition(i))}),this._previousValue=n,this._previousMinRows=this._minRows}reset(){this._initialHeight!==void 0&&(this._textareaElement.style.height=this._initialHeight)}_noopInputHandler(){}_scrollToCaretPosition(A){let{selectionStart:i,selectionEnd:n}=A;!this._destroyed.isStopped&&this._hasFocus&&A.setSelectionRange(i,n)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["textarea","cdkTextareaAutosize",""]],hostAttrs:["rows","1",1,"cdk-textarea-autosize"],hostBindings:function(i,n){i&1&&hA("input",function(){return n._noopInputHandler()})},inputs:{minRows:[0,"cdkAutosizeMinRows","minRows"],maxRows:[0,"cdkAutosizeMaxRows","maxRows"],enabled:[2,"cdkTextareaAutosize","enabled",ie],placeholder:"placeholder"},exportAs:["cdkTextareaAutosize"]})}return t})(),dcA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({})}return t})();var rHA=new dA("MAT_INPUT_VALUE_ACCESSOR"),sHA=["button","checkbox","file","hidden","image","radio","range","reset","submit"],aHA=new dA("MAT_INPUT_CONFIG"),iI=(()=>{class t{_elementRef=f(ee);_platform=f(Ii);ngControl=f(Ac,{optional:!0,self:!0});_autofillMonitor=f(IcA);_ngZone=f(Qe);_formField=f(Gu,{optional:!0});_renderer=f(Wi);_uid=f(sn).getId("mat-input-");_previousNativeValue;_inputValueAccessor;_signalBasedValueAccessor;_previousPlaceholder;_errorStateTracker;_config=f(aHA,{optional:!0});_cleanupIosKeyup;_cleanupWebkitWheel;_formFieldDescribedBy;_isServer;_isNativeSelect;_isTextarea;_isInFormField;focused=!1;stateChanges=new OA;controlType="mat-input";autofilled=!1;get disabled(){return this._disabled}set disabled(A){this._disabled=Xo(A),this.focused&&(this.focused=!1,this.stateChanges.next())}_disabled=!1;get id(){return this._id}set id(A){this._id=A||this._uid}_id;placeholder;name;get required(){return this._required??this.ngControl?.control?.hasValidator($a.required)??!1}set required(A){this._required=Xo(A)}_required;get type(){return this._type}set type(A){let i=this._type;this._type=A||"text",this._validateType(),!this._isTextarea&&ok().has(this._type)&&(this._elementRef.nativeElement.type=this._type),this._type!==i&&this._ensureWheelDefaultBehavior()}_type="text";get errorStateMatcher(){return this._errorStateTracker.matcher}set errorStateMatcher(A){this._errorStateTracker.matcher=A}userAriaDescribedBy;get value(){return this._signalBasedValueAccessor?this._signalBasedValueAccessor.value():this._inputValueAccessor.value}set value(A){A!==this.value&&(this._signalBasedValueAccessor?this._signalBasedValueAccessor.value.set(A):this._inputValueAccessor.value=A,this.stateChanges.next())}get readonly(){return this._readonly}set readonly(A){this._readonly=Xo(A)}_readonly=!1;disabledInteractive;get errorState(){return this._errorStateTracker.errorState}set errorState(A){this._errorStateTracker.errorState=A}_neverEmptyInputTypes=["date","datetime","datetime-local","month","time","week"].filter(A=>ok().has(A));constructor(){let A=f(su,{optional:!0}),i=f(GI,{optional:!0}),n=f(bB),o=f(rHA,{optional:!0,self:!0}),r=this._elementRef.nativeElement,s=r.nodeName.toLowerCase();o?p2(o.value)?this._signalBasedValueAccessor=o:this._inputValueAccessor=o:this._inputValueAccessor=r,this._previousNativeValue=this.value,this.id=this.id,this._platform.IOS&&this._ngZone.runOutsideAngular(()=>{this._cleanupIosKeyup=this._renderer.listen(r,"keyup",this._iOSKeyupListener)}),this._errorStateTracker=new $I(n,this.ngControl,i,A,this.stateChanges),this._isServer=!this._platform.isBrowser,this._isNativeSelect=s==="select",this._isTextarea=s==="textarea",this._isInFormField=!!this._formField,this.disabledInteractive=this._config?.disabledInteractive||!1,this._isNativeSelect&&(this.controlType=r.multiple?"mat-native-select-multiple":"mat-native-select"),this._signalBasedValueAccessor&&Nh(()=>{this._signalBasedValueAccessor.value(),this.stateChanges.next()})}ngAfterViewInit(){this._platform.isBrowser&&this._autofillMonitor.monitor(this._elementRef.nativeElement).subscribe(A=>{this.autofilled=A.isAutofilled,this.stateChanges.next()})}ngOnChanges(){this.stateChanges.next()}ngOnDestroy(){this.stateChanges.complete(),this._platform.isBrowser&&this._autofillMonitor.stopMonitoring(this._elementRef.nativeElement),this._cleanupIosKeyup?.(),this._cleanupWebkitWheel?.()}ngDoCheck(){this.ngControl&&(this.updateErrorState(),this.ngControl.disabled!==null&&this.ngControl.disabled!==this.disabled&&(this.disabled=this.ngControl.disabled,this.stateChanges.next())),this._dirtyCheckNativeValue(),this._dirtyCheckPlaceholder()}focus(A){this._elementRef.nativeElement.focus(A)}updateErrorState(){this._errorStateTracker.updateErrorState()}_focusChanged(A){if(A!==this.focused){if(!this._isNativeSelect&&A&&this.disabled&&this.disabledInteractive){let i=this._elementRef.nativeElement;i.type==="number"?(i.type="text",i.setSelectionRange(0,0),i.type="number"):i.setSelectionRange(0,0)}this.focused=A,this.stateChanges.next()}}_onInput(){}_dirtyCheckNativeValue(){let A=this._elementRef.nativeElement.value;this._previousNativeValue!==A&&(this._previousNativeValue=A,this.stateChanges.next())}_dirtyCheckPlaceholder(){let A=this._getPlaceholder();if(A!==this._previousPlaceholder){let i=this._elementRef.nativeElement;this._previousPlaceholder=A,A?i.setAttribute("placeholder",A):i.removeAttribute("placeholder")}}_getPlaceholder(){return this.placeholder||null}_validateType(){sHA.indexOf(this._type)>-1}_isNeverEmpty(){return this._neverEmptyInputTypes.indexOf(this._type)>-1}_isBadInput(){let A=this._elementRef.nativeElement.validity;return A&&A.badInput}get empty(){return!this._isNeverEmpty()&&!this._elementRef.nativeElement.value&&!this._isBadInput()&&!this.autofilled}get shouldLabelFloat(){if(this._isNativeSelect){let A=this._elementRef.nativeElement,i=A.options[0];return this.focused||A.multiple||!this.empty||!!(A.selectedIndex>-1&&i&&i.label)}else return this.focused&&!this.disabled||!this.empty}setDescribedByIds(A){let i=this._elementRef.nativeElement,n=i.getAttribute("aria-describedby"),o;if(n){let r=this._formFieldDescribedBy||A;o=A.concat(n.split(" ").filter(s=>s&&!r.includes(s)))}else o=A;this._formFieldDescribedBy=A,o.length?i.setAttribute("aria-describedby",o.join(" ")):i.removeAttribute("aria-describedby")}onContainerClick(){this.focused||this.focus()}_isInlineSelect(){let A=this._elementRef.nativeElement;return this._isNativeSelect&&(A.multiple||A.size>1)}_iOSKeyupListener=A=>{let i=A.target;!i.value&&i.selectionStart===0&&i.selectionEnd===0&&(i.setSelectionRange(1,1),i.setSelectionRange(0,0))};_webkitBlinkWheelListener=()=>{};_ensureWheelDefaultBehavior(){this._cleanupWebkitWheel?.(),this._type==="number"&&(this._platform.BLINK||this._platform.WEBKIT)&&(this._cleanupWebkitWheel=this._renderer.listen(this._elementRef.nativeElement,"wheel",this._webkitBlinkWheelListener))}_getReadonlyAttribute(){return this._isNativeSelect?null:this.readonly||this.disabled&&this.disabledInteractive?"true":null}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["input","matInput",""],["textarea","matInput",""],["select","matNativeControl",""],["input","matNativeControl",""],["textarea","matNativeControl",""]],hostAttrs:[1,"mat-mdc-input-element"],hostVars:21,hostBindings:function(i,n){i&1&&hA("focus",function(){return n._focusChanged(!0)})("blur",function(){return n._focusChanged(!1)})("input",function(){return n._onInput()}),i&2&&(Hs("id",n.id)("disabled",n.disabled&&!n.disabledInteractive)("required",n.required),Ne("name",n.name||null)("readonly",n._getReadonlyAttribute())("aria-disabled",n.disabled&&n.disabledInteractive?"true":null)("aria-invalid",n.empty&&n.required?null:n.errorState)("aria-required",n.required)("id",n.id),ue("mat-input-server",n._isServer)("mat-mdc-form-field-textarea-control",n._isInFormField&&n._isTextarea)("mat-mdc-form-field-input-control",n._isInFormField)("mat-mdc-input-disabled-interactive",n.disabledInteractive)("mdc-text-field__input",n._isInFormField)("mat-mdc-native-select-inline",n._isInlineSelect()))},inputs:{disabled:"disabled",id:"id",placeholder:"placeholder",name:"name",required:"required",type:"type",errorStateMatcher:"errorStateMatcher",userAriaDescribedBy:[0,"aria-describedby","userAriaDescribedBy"],value:"value",readonly:"readonly",disabledInteractive:[2,"disabledInteractive","disabledInteractive",ie]},exportAs:["matInput"],features:[ht([{provide:_u,useExisting:t}]),ti]})}return t})(),e7=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[it,y0,y0,dcA,it]})}return t})();var Bf=class t{constructor(e,A,i){this.evalService=e;this.data=A;this.dialogRef=i}newCaseId="case"+df().slice(0,6);createNewEvalCase(){!this.newCaseId||this.newCaseId==""?alert("Cannot create eval set with empty id!"):this.evalService.addCurrentSession(this.data.appName,this.data.evalSetId,this.newCaseId,this.data.sessionId,this.data.userId).subscribe(e=>{this.dialogRef.close(!0)})}static \u0275fac=function(A){return new(A||t)(PA(Vc),PA(as),PA(Br))};static \u0275cmp=zA({type:t,selectors:[["app-add-eval-session-dialog"]],standalone:!1,decls:11,vars:1,consts:[["mat-dialog-title",""],[2,"padding-left","20px","padding-right","24px"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,i){A&1&&(S(0,"h2",0),AA(1,"Add Current Session To Eval Set"),F(),S(2,"mat-dialog-content"),AA(3,` Please enter the eval case name -`),F(),S(4,"mat-form-field",1)(5,"input",2),da("ngModelChange",function(o){return Va(i.newCaseId,o)||(i.newCaseId=o),o}),hA("keydown.enter",function(){return i.createNewEvalCase()}),F()(),S(6,"mat-dialog-actions",3)(7,"button",4),AA(8,"Cancel"),F(),S(9,"button",5),hA("click",function(){return i.createNewEvalCase()}),AA(10,"Create"),F()()),A&2&&(G(5),Ca("ngModel",i.newCaseId))},dependencies:[vc,Ea,ec,Qg,iI,Dr,bs,ma,pa,hg],encapsulation:2})};var Ef=class t{constructor(e,A,i){this.evalService=e;this.data=A;this.dialogRef=i}newSetId="evalset"+df().slice(0,6);createNewEvalSet(){!this.newSetId||this.newSetId==""?alert("Cannot create eval set with empty id!"):this.evalService.createNewEvalSet(this.data.appName,this.newSetId).subscribe(e=>{this.dialogRef.close(!0)})}static \u0275fac=function(A){return new(A||t)(PA(Vc),PA(as),PA(Br))};static \u0275cmp=zA({type:t,selectors:[["app-new-eval-set-dialog-component"]],standalone:!1,decls:11,vars:1,consts:[["mat-dialog-title",""],[2,"padding-left","20px","padding-right","24px"],["matInput","",3,"ngModelChange","keydown.enter","ngModel"],["align","end"],["mat-button","","mat-dialog-close",""],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,i){A&1&&(S(0,"h2",0),AA(1,"Create New Eval Set"),F(),S(2,"mat-dialog-content"),AA(3,` Please enter the eval set name -`),F(),S(4,"mat-form-field",1)(5,"input",2),da("ngModelChange",function(o){return Va(i.newSetId,o)||(i.newSetId=o),o}),hA("keydown.enter",function(){return i.createNewEvalSet()}),F()(),S(6,"mat-dialog-actions",3)(7,"button",4),AA(8,"Cancel"),F(),S(9,"button",5),hA("click",function(){return i.createNewEvalSet()}),AA(10,"Create"),F()()),A&2&&(G(5),Ca("ngModel",i.newSetId))},dependencies:[vc,Ea,ec,Qg,iI,Dr,bs,ma,pa,hg],encapsulation:2})};var cHA=["knob"],lHA=["valueIndicatorContainer"];function gHA(t,e){if(t&1&&(S(0,"div",2,1)(2,"div",5)(3,"span",6),AA(4),F()()()),t&2){let A=O();G(4),Gt(A.valueIndicatorText)}}var IHA=["trackActive"],CHA=["*"];function dHA(t,e){if(t&1&&JA(0,"div"),t&2){let A=e.$implicit,i=e.$index,n=O(3);fo(A===0?"mdc-slider__tick-mark--active":"mdc-slider__tick-mark--inactive"),uo("transform",n._calcTickMarkTransform(i))}}function BHA(t,e){if(t&1&&Dn(0,dHA,1,4,"div",8,Xd),t&2){let A=O(2);yn(A._tickMarks)}}function EHA(t,e){if(t&1&&(S(0,"div",6,1),_A(2,BHA,2,0),F()),t&2){let A=O();G(2),GA(A._cachedWidth?2:-1)}}function QHA(t,e){if(t&1&&JA(0,"mat-slider-visual-thumb",7),t&2){let A=O();yA("discrete",A.discrete)("thumbPosition",1)("valueIndicatorText",A.startValueIndicatorText)}}var ui=function(t){return t[t.START=1]="START",t[t.END=2]="END",t}(ui||{}),kQ=function(t){return t[t.ACTIVE=0]="ACTIVE",t[t.INACTIVE=1]="INACTIVE",t}(kQ||{}),xG=new dA("_MatSlider"),BcA=new dA("_MatSliderThumb"),hHA=new dA("_MatSliderRangeThumb"),EcA=new dA("_MatSliderVisualThumb");var uHA=(()=>{class t{_cdr=f(It);_ngZone=f(Qe);_slider=f(xG);_renderer=f(Wi);_listenerCleanups;discrete;thumbPosition;valueIndicatorText;_ripple;_knob;_valueIndicatorContainer;_sliderInput;_sliderInputEl;_hoverRippleRef;_focusRippleRef;_activeRippleRef;_isHovered=!1;_isActive=!1;_isValueIndicatorVisible=!1;_hostElement=f(ee).nativeElement;_platform=f(Ii);constructor(){}ngAfterViewInit(){let A=this._slider._getInput(this.thumbPosition);A&&(this._ripple.radius=24,this._sliderInput=A,this._sliderInputEl=this._sliderInput._hostElement,this._ngZone.runOutsideAngular(()=>{let i=this._sliderInputEl,n=this._renderer;this._listenerCleanups=[n.listen(i,"pointermove",this._onPointerMove),n.listen(i,"pointerdown",this._onDragStart),n.listen(i,"pointerup",this._onDragEnd),n.listen(i,"pointerleave",this._onMouseLeave),n.listen(i,"focus",this._onFocus),n.listen(i,"blur",this._onBlur)]}))}ngOnDestroy(){this._listenerCleanups?.forEach(A=>A())}_onPointerMove=A=>{if(this._sliderInput._isFocused)return;let i=this._hostElement.getBoundingClientRect(),n=this._slider._isCursorOnSliderThumb(A,i);this._isHovered=n,n?this._showHoverRipple():this._hideRipple(this._hoverRippleRef)};_onMouseLeave=()=>{this._isHovered=!1,this._hideRipple(this._hoverRippleRef)};_onFocus=()=>{this._hideRipple(this._hoverRippleRef),this._showFocusRipple(),this._hostElement.classList.add("mdc-slider__thumb--focused")};_onBlur=()=>{this._isActive||this._hideRipple(this._focusRippleRef),this._isHovered&&this._showHoverRipple(),this._hostElement.classList.remove("mdc-slider__thumb--focused")};_onDragStart=A=>{A.button===0&&(this._isActive=!0,this._showActiveRipple())};_onDragEnd=()=>{this._isActive=!1,this._hideRipple(this._activeRippleRef),this._sliderInput._isFocused||this._hideRipple(this._focusRippleRef),this._platform.SAFARI&&this._showHoverRipple()};_showHoverRipple(){this._isShowingRipple(this._hoverRippleRef)||(this._hoverRippleRef=this._showRipple({enterDuration:0,exitDuration:0}),this._hoverRippleRef?.element.classList.add("mat-mdc-slider-hover-ripple"))}_showFocusRipple(){this._isShowingRipple(this._focusRippleRef)||(this._focusRippleRef=this._showRipple({enterDuration:0,exitDuration:0},!0),this._focusRippleRef?.element.classList.add("mat-mdc-slider-focus-ripple"))}_showActiveRipple(){this._isShowingRipple(this._activeRippleRef)||(this._activeRippleRef=this._showRipple({enterDuration:225,exitDuration:400}),this._activeRippleRef?.element.classList.add("mat-mdc-slider-active-ripple"))}_isShowingRipple(A){return A?.state===Os.FADING_IN||A?.state===Os.VISIBLE}_showRipple(A,i){if(!this._slider.disabled&&(this._showValueIndicator(),this._slider._isRange&&this._slider._getThumb(this.thumbPosition===ui.START?ui.END:ui.START)._showValueIndicator(),!(this._slider._globalRippleOptions?.disabled&&!i)))return this._ripple.launch({animation:this._slider._noopAnimations?{enterDuration:0,exitDuration:0}:A,centered:!0,persistent:!0})}_hideRipple(A){if(A?.fadeOut(),this._isShowingAnyRipple())return;this._slider._isRange||this._hideValueIndicator();let i=this._getSibling();i._isShowingAnyRipple()||(this._hideValueIndicator(),i._hideValueIndicator())}_showValueIndicator(){this._hostElement.classList.add("mdc-slider__thumb--with-indicator")}_hideValueIndicator(){this._hostElement.classList.remove("mdc-slider__thumb--with-indicator")}_getSibling(){return this._slider._getThumb(this.thumbPosition===ui.START?ui.END:ui.START)}_getValueIndicatorContainer(){return this._valueIndicatorContainer?.nativeElement}_getKnob(){return this._knob.nativeElement}_isShowingAnyRipple(){return this._isShowingRipple(this._hoverRippleRef)||this._isShowingRipple(this._focusRippleRef)||this._isShowingRipple(this._activeRippleRef)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-slider-visual-thumb"]],viewQuery:function(i,n){if(i&1&&(Te(rs,5),Te(cHA,5),Te(lHA,5)),i&2){let o;XA(o=$A())&&(n._ripple=o.first),XA(o=$A())&&(n._knob=o.first),XA(o=$A())&&(n._valueIndicatorContainer=o.first)}},hostAttrs:[1,"mdc-slider__thumb","mat-mdc-slider-visual-thumb"],inputs:{discrete:"discrete",thumbPosition:"thumbPosition",valueIndicatorText:"valueIndicatorText"},features:[ht([{provide:EcA,useExisting:t}])],decls:4,vars:2,consts:[["knob",""],["valueIndicatorContainer",""],[1,"mdc-slider__value-indicator-container"],[1,"mdc-slider__thumb-knob"],["matRipple","",1,"mat-focus-indicator",3,"matRippleDisabled"],[1,"mdc-slider__value-indicator"],[1,"mdc-slider__value-indicator-text"]],template:function(i,n){i&1&&(_A(0,gHA,5,1,"div",2),JA(1,"div",3,0)(3,"div",4)),i&2&&(GA(n.discrete?0:-1),G(3),yA("matRippleDisabled",!0))},dependencies:[rs],styles:[".mat-mdc-slider-visual-thumb .mat-ripple{height:100%;width:100%}.mat-mdc-slider .mdc-slider__tick-marks{justify-content:start}.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--active,.mat-mdc-slider .mdc-slider__tick-marks .mdc-slider__tick-mark--inactive{position:absolute;left:2px}"],encapsulation:2,changeDetection:0})}return t})(),QcA=(()=>{class t{_ngZone=f(Qe);_cdr=f(It);_elementRef=f(ee);_dir=f(mo,{optional:!0});_globalRippleOptions=f(G2,{optional:!0});_trackActive;_thumbs;_input;_inputs;get disabled(){return this._disabled}set disabled(A){this._disabled=A;let i=this._getInput(ui.END),n=this._getInput(ui.START);i&&(i.disabled=this._disabled),n&&(n.disabled=this._disabled)}_disabled=!1;get discrete(){return this._discrete}set discrete(A){this._discrete=A,this._updateValueIndicatorUIs()}_discrete=!1;showTickMarks=!1;get min(){return this._min}set min(A){let i=isNaN(A)?this._min:A;this._min!==i&&this._updateMin(i)}_min=0;color;disableRipple=!1;_updateMin(A){let i=this._min;this._min=A,this._isRange?this._updateMinRange({old:i,new:A}):this._updateMinNonRange(A),this._onMinMaxOrStepChange()}_updateMinRange(A){let i=this._getInput(ui.END),n=this._getInput(ui.START),o=i.value,r=n.value;n.min=A.new,i.min=Math.max(A.new,n.value),n.max=Math.min(i.max,i.value),n._updateWidthInactive(),i._updateWidthInactive(),A.newA.old?this._onTranslateXChangeBySideEffect(n,i):this._onTranslateXChangeBySideEffect(i,n),o!==i.value&&this._onValueChange(i),r!==n.value&&this._onValueChange(n)}_updateMaxNonRange(A){let i=this._getInput(ui.END);if(i){let n=i.value;i.max=A,i._updateThumbUIByValue(),this._updateTrackUI(i),n!==i.value&&this._onValueChange(i)}}get step(){return this._step}set step(A){let i=isNaN(A)?this._step:A;this._step!==i&&this._updateStep(i)}_step=1;_updateStep(A){this._step=A,this._isRange?this._updateStepRange():this._updateStepNonRange(),this._onMinMaxOrStepChange()}_updateStepRange(){let A=this._getInput(ui.END),i=this._getInput(ui.START),n=A.value,o=i.value,r=i.value;A.min=this._min,i.max=this._max,A.step=this._step,i.step=this._step,this._platform.SAFARI&&(A.value=A.value,i.value=i.value),A.min=Math.max(this._min,i.value),i.max=Math.min(this._max,A.value),i._updateWidthInactive(),A._updateWidthInactive(),A.value`${A}`;_tickMarks;_noopAnimations;_dirChangeSubscription;_resizeObserver;_cachedWidth;_cachedLeft;_rippleRadius=24;startValueIndicatorText="";endValueIndicatorText="";_endThumbTransform;_startThumbTransform;_isRange=!1;_isRtl=!1;_hasViewInitialized=!1;_tickMarkTrackWidth=0;_hasAnimation=!1;_resizeTimer=null;_platform=f(Ii);constructor(){f(Rn).load(lr);let A=f(Si,{optional:!0});this._noopAnimations=A==="NoopAnimations",this._dir&&(this._dirChangeSubscription=this._dir.change.subscribe(()=>this._onDirChange()),this._isRtl=this._dir.value==="rtl")}_knobRadius=8;_inputPadding;ngAfterViewInit(){this._platform.isBrowser&&this._updateDimensions();let A=this._getInput(ui.END),i=this._getInput(ui.START);this._isRange=!!A&&!!i,this._cdr.detectChanges();let n=this._getThumb(ui.END);this._rippleRadius=n._ripple.radius,this._inputPadding=this._rippleRadius-this._knobRadius,this._isRange?this._initUIRange(A,i):this._initUINonRange(A),this._updateTrackUI(A),this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._observeHostResize(),this._cdr.detectChanges()}_initUINonRange(A){A.initProps(),A.initUI(),this._updateValueIndicatorUI(A),this._hasViewInitialized=!0,A._updateThumbUIByValue()}_initUIRange(A,i){A.initProps(),A.initUI(),i.initProps(),i.initUI(),A._updateMinMax(),i._updateMinMax(),A._updateStaticStyles(),i._updateStaticStyles(),this._updateValueIndicatorUIs(),this._hasViewInitialized=!0,A._updateThumbUIByValue(),i._updateThumbUIByValue()}ngOnDestroy(){this._dirChangeSubscription.unsubscribe(),this._resizeObserver?.disconnect(),this._resizeObserver=null}_onDirChange(){this._isRtl=this._dir?.value==="rtl",this._isRange?this._onDirChangeRange():this._onDirChangeNonRange(),this._updateTickMarkUI()}_onDirChangeRange(){let A=this._getInput(ui.END),i=this._getInput(ui.START);A._setIsLeftThumb(),i._setIsLeftThumb(),A.translateX=A._calcTranslateXByValue(),i.translateX=i._calcTranslateXByValue(),A._updateStaticStyles(),i._updateStaticStyles(),A._updateWidthInactive(),i._updateWidthInactive(),A._updateThumbUIByValue(),i._updateThumbUIByValue()}_onDirChangeNonRange(){this._getInput(ui.END)._updateThumbUIByValue()}_observeHostResize(){typeof ResizeObserver>"u"||!ResizeObserver||this._ngZone.runOutsideAngular(()=>{this._resizeObserver=new ResizeObserver(()=>{this._isActive()||(this._resizeTimer&&clearTimeout(this._resizeTimer),this._onResize())}),this._resizeObserver.observe(this._elementRef.nativeElement)})}_isActive(){return this._getThumb(ui.START)._isActive||this._getThumb(ui.END)._isActive}_getValue(A=ui.END){let i=this._getInput(A);return i?i.value:this.min}_skipUpdate(){return!!(this._getInput(ui.START)?._skipUIUpdate||this._getInput(ui.END)?._skipUIUpdate)}_updateDimensions(){this._cachedWidth=this._elementRef.nativeElement.offsetWidth,this._cachedLeft=this._elementRef.nativeElement.getBoundingClientRect().left}_setTrackActiveStyles(A){let i=this._trackActive.nativeElement.style;i.left=A.left,i.right=A.right,i.transformOrigin=A.transformOrigin,i.transform=A.transform}_calcTickMarkTransform(A){let i=A*(this._tickMarkTrackWidth/(this._tickMarks.length-1));return`translateX(${this._isRtl?this._cachedWidth-6-i:i}px`}_onTranslateXChange(A){this._hasViewInitialized&&(this._updateThumbUI(A),this._updateTrackUI(A),this._updateOverlappingThumbUI(A))}_onTranslateXChangeBySideEffect(A,i){this._hasViewInitialized&&(A._updateThumbUIByValue(),i._updateThumbUIByValue())}_onValueChange(A){this._hasViewInitialized&&(this._updateValueIndicatorUI(A),this._updateTickMarkUI(),this._cdr.detectChanges())}_onMinMaxOrStepChange(){this._hasViewInitialized&&(this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._cdr.markForCheck())}_onResize(){if(this._hasViewInitialized){if(this._updateDimensions(),this._isRange){let A=this._getInput(ui.END),i=this._getInput(ui.START);A._updateThumbUIByValue(),i._updateThumbUIByValue(),A._updateStaticStyles(),i._updateStaticStyles(),A._updateMinMax(),i._updateMinMax(),A._updateWidthInactive(),i._updateWidthInactive()}else{let A=this._getInput(ui.END);A&&A._updateThumbUIByValue()}this._updateTickMarkUI(),this._updateTickMarkTrackUI(),this._cdr.detectChanges()}}_thumbsOverlap=!1;_areThumbsOverlapping(){let A=this._getInput(ui.START),i=this._getInput(ui.END);return!A||!i?!1:i.translateX-A.translateX<20}_updateOverlappingThumbClassNames(A){let i=A.getSibling(),n=this._getThumb(A.thumbPosition);this._getThumb(i.thumbPosition)._hostElement.classList.remove("mdc-slider__thumb--top"),n._hostElement.classList.toggle("mdc-slider__thumb--top",this._thumbsOverlap)}_updateOverlappingThumbUI(A){!this._isRange||this._skipUpdate()||this._thumbsOverlap!==this._areThumbsOverlapping()&&(this._thumbsOverlap=!this._thumbsOverlap,this._updateOverlappingThumbClassNames(A))}_updateThumbUI(A){if(this._skipUpdate())return;let i=this._getThumb(A.thumbPosition===ui.END?ui.END:ui.START);i._hostElement.style.transform=`translateX(${A.translateX}px)`}_updateValueIndicatorUI(A){if(this._skipUpdate())return;let i=this.displayWith(A.value);if(this._hasViewInitialized?A._valuetext.set(i):A._hostElement.setAttribute("aria-valuetext",i),this.discrete){A.thumbPosition===ui.START?this.startValueIndicatorText=i:this.endValueIndicatorText=i;let n=this._getThumb(A.thumbPosition);i.length<3?n._hostElement.classList.add("mdc-slider__thumb--short-value"):n._hostElement.classList.remove("mdc-slider__thumb--short-value")}}_updateValueIndicatorUIs(){let A=this._getInput(ui.END),i=this._getInput(ui.START);A&&this._updateValueIndicatorUI(A),i&&this._updateValueIndicatorUI(i)}_updateTickMarkTrackUI(){if(!this.showTickMarks||this._skipUpdate())return;let A=this._step&&this._step>0?this._step:1,n=(Math.floor(this.max/A)*A-this.min)/(this.max-this.min);this._tickMarkTrackWidth=(this._cachedWidth-6)*n}_updateTrackUI(A){this._skipUpdate()||(this._isRange?this._updateTrackUIRange(A):this._updateTrackUINonRange(A))}_updateTrackUIRange(A){let i=A.getSibling();if(!i||!this._cachedWidth)return;let n=Math.abs(i.translateX-A.translateX)/this._cachedWidth;A._isLeftThumb&&this._cachedWidth?this._setTrackActiveStyles({left:"auto",right:`${this._cachedWidth-i.translateX}px`,transformOrigin:"right",transform:`scaleX(${n})`}):this._setTrackActiveStyles({left:`${i.translateX}px`,right:"auto",transformOrigin:"left",transform:`scaleX(${n})`})}_updateTrackUINonRange(A){this._isRtl?this._setTrackActiveStyles({left:"auto",right:"0px",transformOrigin:"right",transform:`scaleX(${1-A.fillPercentage})`}):this._setTrackActiveStyles({left:"0px",right:"auto",transformOrigin:"left",transform:`scaleX(${A.fillPercentage})`})}_updateTickMarkUI(){if(!this.showTickMarks||this.step===void 0||this.min===void 0||this.max===void 0)return;let A=this.step>0?this.step:1;this._isRange?this._updateTickMarkUIRange(A):this._updateTickMarkUINonRange(A)}_updateTickMarkUINonRange(A){let i=this._getValue(),n=Math.max(Math.round((i-this.min)/A),0)+1,o=Math.max(Math.round((this.max-i)/A),0)-1;this._isRtl?n++:o++,this._tickMarks=Array(n).fill(kQ.ACTIVE).concat(Array(o).fill(kQ.INACTIVE))}_updateTickMarkUIRange(A){let i=this._getValue(),n=this._getValue(ui.START),o=Math.max(Math.round((n-this.min)/A),0),r=Math.max(Math.round((i-n)/A)+1,0),s=Math.max(Math.round((this.max-i)/A),0);this._tickMarks=Array(o).fill(kQ.INACTIVE).concat(Array(r).fill(kQ.ACTIVE),Array(s).fill(kQ.INACTIVE))}_getInput(A){if(A===ui.END&&this._input)return this._input;if(this._inputs?.length)return A===ui.START?this._inputs.first:this._inputs.last}_getThumb(A){return A===ui.END?this._thumbs?.last:this._thumbs?.first}_setTransition(A){this._hasAnimation=!this._platform.IOS&&A&&!this._noopAnimations,this._elementRef.nativeElement.classList.toggle("mat-mdc-slider-with-animation",this._hasAnimation)}_isCursorOnSliderThumb(A,i){let n=i.width/2,o=i.x+n,r=i.y+n,s=A.clientX-o,a=A.clientY-r;return Math.pow(s,2)+Math.pow(a,2)LG),multi:!0};var LG=(()=>{class t{_ngZone=f(Qe);_elementRef=f(ee);_cdr=f(It);_slider=f(xG);_platform=f(Ii);_listenerCleanups;get value(){return zi(this._hostElement.value,0)}set value(A){A=isNaN(A)?0:A;let i=A+"";if(!this._hasSetInitialValue){this._initialValue=i;return}this._isActive||this._setValue(i)}_setValue(A){this._hostElement.value=A,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges(),this._slider._cdr.markForCheck()}valueChange=new WA;dragStart=new WA;dragEnd=new WA;get translateX(){return this._slider.min>=this._slider.max?(this._translateX=this._tickMarkOffset,this._translateX):(this._translateX===void 0&&(this._translateX=this._calcTranslateXByValue()),this._translateX)}set translateX(A){this._translateX=A}_translateX;thumbPosition=ui.END;get min(){return zi(this._hostElement.min,0)}set min(A){this._hostElement.min=A+"",this._cdr.detectChanges()}get max(){return zi(this._hostElement.max,0)}set max(A){this._hostElement.max=A+"",this._cdr.detectChanges()}get step(){return zi(this._hostElement.step,0)}set step(A){this._hostElement.step=A+"",this._cdr.detectChanges()}get disabled(){return ie(this._hostElement.disabled)}set disabled(A){this._hostElement.disabled=A,this._cdr.detectChanges(),this._slider.disabled!==this.disabled&&(this._slider.disabled=this.disabled)}get percentage(){return this._slider.min>=this._slider.max?this._slider._isRtl?1:0:(this.value-this._slider.min)/(this._slider.max-this._slider.min)}get fillPercentage(){return this._slider._cachedWidth?this._translateX===0?0:this.translateX/this._slider._cachedWidth:this._slider._isRtl?1:0}_hostElement=this._elementRef.nativeElement;_valuetext=Jo("");_knobRadius=8;_tickMarkOffset=3;_isActive=!1;_isFocused=!1;_setIsFocused(A){this._isFocused=A}_hasSetInitialValue=!1;_initialValue;_formControl;_destroyed=new OA;_skipUIUpdate=!1;_onChangeFn;_onTouchedFn=()=>{};_isControlInitialized=!1;constructor(){let A=f(Wi);this._ngZone.runOutsideAngular(()=>{this._listenerCleanups=[A.listen(this._hostElement,"pointerdown",this._onPointerDown.bind(this)),A.listen(this._hostElement,"pointermove",this._onPointerMove.bind(this)),A.listen(this._hostElement,"pointerup",this._onPointerUp.bind(this))]})}ngOnDestroy(){this._listenerCleanups.forEach(A=>A()),this._destroyed.next(),this._destroyed.complete(),this.dragStart.complete(),this.dragEnd.complete()}initProps(){this._updateWidthInactive(),this.disabled!==this._slider.disabled&&(this._slider.disabled=!0),this.step=this._slider.step,this.min=this._slider.min,this.max=this._slider.max,this._initValue()}initUI(){this._updateThumbUIByValue()}_initValue(){this._hasSetInitialValue=!0,this._initialValue===void 0?this.value=this._getDefaultValue():(this._hostElement.value=this._initialValue,this._updateThumbUIByValue(),this._slider._onValueChange(this),this._cdr.detectChanges())}_getDefaultValue(){return this.min}_onBlur(){this._setIsFocused(!1),this._onTouchedFn()}_onFocus(){this._slider._setTransition(!1),this._slider._updateTrackUI(this),this._setIsFocused(!0)}_onChange(){this.valueChange.emit(this.value),this._isActive&&this._updateThumbUIByValue({withAnimation:!0})}_onInput(){this._onChangeFn?.(this.value),(this._slider.step||!this._isActive)&&this._updateThumbUIByValue({withAnimation:!0}),this._slider._onValueChange(this)}_onNgControlValueChange(){(!this._isActive||!this._isFocused)&&(this._slider._onValueChange(this),this._updateThumbUIByValue()),this._slider.disabled=this._formControl.disabled}_onPointerDown(A){if(!(this.disabled||A.button!==0)){if(this._platform.IOS){let i=this._slider._isCursorOnSliderThumb(A,this._slider._getThumb(this.thumbPosition)._hostElement.getBoundingClientRect());this._isActive=i,this._updateWidthActive(),this._slider._updateDimensions();return}this._isActive=!0,this._setIsFocused(!0),this._updateWidthActive(),this._slider._updateDimensions(),this._slider.step||this._updateThumbUIByPointerEvent(A,{withAnimation:!0}),this.disabled||(this._handleValueCorrection(A),this.dragStart.emit({source:this,parent:this._slider,value:this.value}))}}_handleValueCorrection(A){this._skipUIUpdate=!0,setTimeout(()=>{this._skipUIUpdate=!1,this._fixValue(A)},0)}_fixValue(A){let i=A.clientX-this._slider._cachedLeft,n=this._slider._cachedWidth,o=this._slider.step===0?1:this._slider.step,r=Math.floor((this._slider.max-this._slider.min)/o),s=this._slider._isRtl?1-i/n:i/n,c=Math.round(s*r)/r*(this._slider.max-this._slider.min)+this._slider.min,l=Math.round(c/o)*o,I=this.value;if(l===I){this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(A,{withAnimation:this._slider._hasAnimation});return}this.value=l,this.valueChange.emit(this.value),this._onChangeFn?.(this.value),this._slider._onValueChange(this),this._slider.step>0?this._updateThumbUIByValue():this._updateThumbUIByPointerEvent(A,{withAnimation:this._slider._hasAnimation})}_onPointerMove(A){!this._slider.step&&this._isActive&&this._updateThumbUIByPointerEvent(A)}_onPointerUp(){this._isActive&&(this._isActive=!1,this._platform.SAFARI&&this._setIsFocused(!1),this.dragEnd.emit({source:this,parent:this._slider,value:this.value}),setTimeout(()=>this._updateWidthInactive(),this._platform.IOS?10:0))}_clamp(A){let i=this._tickMarkOffset,n=this._slider._cachedWidth-this._tickMarkOffset;return Math.max(Math.min(A,n),i)}_calcTranslateXByValue(){return this._slider._isRtl?(1-this.percentage)*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset:this.percentage*(this._slider._cachedWidth-this._tickMarkOffset*2)+this._tickMarkOffset}_calcTranslateXByPointerEvent(A){return A.clientX-this._slider._cachedLeft}_updateWidthActive(){}_updateWidthInactive(){this._hostElement.style.padding=`0 ${this._slider._inputPadding}px`,this._hostElement.style.width=`calc(100% + ${this._slider._inputPadding-this._tickMarkOffset*2}px)`,this._hostElement.style.left=`-${this._slider._rippleRadius-this._tickMarkOffset}px`}_updateThumbUIByValue(A){this.translateX=this._clamp(this._calcTranslateXByValue()),this._updateThumbUI(A)}_updateThumbUIByPointerEvent(A,i){this.translateX=this._clamp(this._calcTranslateXByPointerEvent(A)),this._updateThumbUI(i)}_updateThumbUI(A){this._slider._setTransition(!!A?.withAnimation),this._slider._onTranslateXChange(this)}writeValue(A){(this._isControlInitialized||A!==null)&&(this.value=A)}registerOnChange(A){this._onChangeFn=A,this._isControlInitialized=!0}registerOnTouched(A){this._onTouchedFn=A}setDisabledState(A){this.disabled=A}focus(){this._hostElement.focus()}blur(){this._hostElement.blur()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["input","matSliderThumb",""]],hostAttrs:["type","range",1,"mdc-slider__input"],hostVars:1,hostBindings:function(i,n){i&1&&hA("change",function(){return n._onChange()})("input",function(){return n._onInput()})("blur",function(){return n._onBlur()})("focus",function(){return n._onFocus()}),i&2&&Ne("aria-valuetext",n._valuetext())},inputs:{value:[2,"value","value",zi]},outputs:{valueChange:"valueChange",dragStart:"dragStart",dragEnd:"dragEnd"},exportAs:["matSliderThumb"],features:[ht([fHA,{provide:BcA,useExisting:t}])]})}return t})();var hcA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[it,Ps]})}return t})();var Qf=class t{constructor(e,A,i){this.dialogRef=e;this.fb=A;this.data=i;this.evalMetrics=this.data.evalMetrics,this.evalForm=this.fb.group({tool_trajectory_avg_score_threshold:[this.getEvalMetricThresholdFromData("tool_trajectory_avg_score"),[$a.required,$a.min(0),$a.max(1)]],response_match_score_threshold:[this.getEvalMetricThresholdFromData("response_match_score"),[$a.required,$a.min(0),$a.max(1)]]})}evalForm;evalMetrics=[];getEvalMetricThresholdFromData(e){return this.evalMetrics.find(A=>A.metricName===e)?.threshold??0}onStart(){if(this.evalForm.valid){let{tool_trajectory_avg_score_threshold:e,response_match_score_threshold:A}=this.evalForm.value;for(let i of this.evalMetrics)i.metricName==="tool_trajectory_avg_score"?i.threshold=e:i.metricName==="response_match_score"&&(i.threshold=A);this.dialogRef.close(this.evalMetrics)}}onCancel(){this.dialogRef.close(null)}static \u0275fac=function(A){return new(A||t)(PA(Br),PA(Rz),PA(as))};static \u0275cmp=zA({type:t,selectors:[["app-run-eval-config-dialog"]],standalone:!1,decls:26,vars:3,consts:[[1,"dialog-container"],["mat-dialog-title","",1,"dialog-title"],[1,"eval-form",3,"formGroup"],[1,"metric-row"],[1,"metric-name"],[1,"flex-1","pl-4"],["min","0","max","1","step","0.1","thumbLabel","",1,"threshold-slider"],["matSliderThumb","","formControlName","tool_trajectory_avg_score_threshold"],[1,"threshold-value"],["matSliderThumb","","formControlName","response_match_score_threshold"],["align","end",1,"dialog-actions"],["mat-button","",1,"cancel-button",3,"click"],["mat-button","",1,"save-button",3,"click"]],template:function(A,i){A&1&&(S(0,"div",0)(1,"h2",1),AA(2,"EVALUATION METRIC"),F(),S(3,"mat-dialog-content")(4,"form",2)(5,"div",3)(6,"div",4),AA(7,"Tool trajectory avg score: "),F(),S(8,"div",5)(9,"mat-slider",6),JA(10,"input",7),F(),S(11,"span",8),AA(12),F()()(),S(13,"div",3)(14,"div",4),AA(15,"Response match score: "),F(),S(16,"div",5)(17,"mat-slider",6),JA(18,"input",9),F(),S(19,"span",8),AA(20),F()()()()(),S(21,"mat-dialog-actions",10)(22,"button",11),hA("click",function(){return i.onCancel()}),AA(23,"Cancel"),F(),S(24,"button",12),hA("click",function(){return i.onStart()}),AA(25,"Start"),F()()()),A&2&&(G(4),yA("formGroup",i.evalForm),G(8),Et(" ",i.evalForm.controls.tool_trajectory_avg_score_threshold.value," "),G(8),Et(" ",i.evalForm.controls.response_match_score_threshold.value," "))},dependencies:[kz,vc,Ea,pz,Dr,bs,ma,pa,QcA,LG,GI,bM],styles:[".dialog-container[_ngcontent-%COMP%]{border-radius:12px;padding:18px;width:500px;box-shadow:0 8px 16px #0006}.threshold-slider[_ngcontent-%COMP%]{--mdc-slider-active-track-color: #4285f4;--mdc-slider-inactive-track-color: #616161;--mdc-slider-handle-color: #4285f4;--mdc-slider-ripple-color: #4285f4;width:100px}.metric-row[_ngcontent-%COMP%]{display:flex;flex-direction:row;align-items:center}.metric-name[_ngcontent-%COMP%]{width:250px}.threshold-value[_ngcontent-%COMP%]{margin-left:20px}.mdc-slider__thumb--with-indicator[_ngcontent-%COMP%]{background-color:var(--mdc-slider-handle-color, black);border:none!important;box-shadow:none!important}"]})};var Wg=class t{constructor(e){this.http=e}apiServerDomain=vs.getApiServerBaseUrl();createSession(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`;return this.http.post(i,null)}return new ct}listSessions(e,A){if(this.apiServerDomain!=null){let i=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`;return this.http.get(i)}return new ct}deleteSession(e,A,i){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}`;return this.http.delete(n)}getSession(e,A,i){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}`;return this.http.get(n)}importSession(e,A,i){if(this.apiServerDomain!=null){let n=this.apiServerDomain+`/apps/${A}/users/${e}/sessions`;return this.http.post(n,{appName:A,userId:e,events:i})}return new ct}static \u0275fac=function(A){return new(A||t)(we(Ds))};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})};var pHA=["determinateSpinner"];function wHA(t,e){if(t&1&&(ar(),S(0,"svg",11),JA(1,"circle",12),F()),t&2){let A=O();Ne("viewBox",A._viewBox()),G(),uo("stroke-dasharray",A._strokeCircumference(),"px")("stroke-dashoffset",A._strokeCircumference()/2,"px")("stroke-width",A._circleStrokeWidth(),"%"),Ne("r",A._circleRadius())}}var DHA=new dA("mat-progress-spinner-default-options",{providedIn:"root",factory:yHA});function yHA(){return{diameter:ucA}}var ucA=100,vHA=10,fcA=(()=>{class t{_elementRef=f(ee);_noopAnimations;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;_defaultColor="primary";_determinateCircle;constructor(){let A=f(Si,{optional:!0}),i=f(DHA);this._noopAnimations=A==="NoopAnimations"&&!!i&&!i._forceAnimations,this.mode=this._elementRef.nativeElement.nodeName.toLowerCase()==="mat-spinner"?"indeterminate":"determinate",i&&(i.color&&(this.color=this._defaultColor=i.color),i.diameter&&(this.diameter=i.diameter),i.strokeWidth&&(this.strokeWidth=i.strokeWidth))}mode;get value(){return this.mode==="determinate"?this._value:0}set value(A){this._value=Math.max(0,Math.min(100,A||0))}_value=0;get diameter(){return this._diameter}set diameter(A){this._diameter=A||0}_diameter=ucA;get strokeWidth(){return this._strokeWidth??this.diameter/10}set strokeWidth(A){this._strokeWidth=A||0}_strokeWidth;_circleRadius(){return(this.diameter-vHA)/2}_viewBox(){let A=this._circleRadius()*2+this.strokeWidth;return`0 0 ${A} ${A}`}_strokeCircumference(){return 2*Math.PI*this._circleRadius()}_strokeDashOffset(){return this.mode==="determinate"?this._strokeCircumference()*(100-this._value)/100:null}_circleStrokeWidth(){return this.strokeWidth/this.diameter*100}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-progress-spinner"],["mat-spinner"]],viewQuery:function(i,n){if(i&1&&Te(pHA,5),i&2){let o;XA(o=$A())&&(n._determinateCircle=o.first)}},hostAttrs:["role","progressbar","tabindex","-1",1,"mat-mdc-progress-spinner","mdc-circular-progress"],hostVars:18,hostBindings:function(i,n){i&2&&(Ne("aria-valuemin",0)("aria-valuemax",100)("aria-valuenow",n.mode==="determinate"?n.value:null)("mode",n.mode),fo("mat-"+n.color),uo("width",n.diameter,"px")("height",n.diameter,"px")("--mdc-circular-progress-size",n.diameter+"px")("--mdc-circular-progress-active-indicator-width",n.diameter+"px"),ue("_mat-animation-noopable",n._noopAnimations)("mdc-circular-progress--indeterminate",n.mode==="indeterminate"))},inputs:{color:"color",mode:"mode",value:[2,"value","value",zi],diameter:[2,"diameter","diameter",zi],strokeWidth:[2,"strokeWidth","strokeWidth",zi]},exportAs:["matProgressSpinner"],decls:14,vars:11,consts:[["circle",""],["determinateSpinner",""],["aria-hidden","true",1,"mdc-circular-progress__determinate-container"],["xmlns","http://www.w3.org/2000/svg","focusable","false",1,"mdc-circular-progress__determinate-circle-graphic"],["cx","50%","cy","50%",1,"mdc-circular-progress__determinate-circle"],["aria-hidden","true",1,"mdc-circular-progress__indeterminate-container"],[1,"mdc-circular-progress__spinner-layer"],[1,"mdc-circular-progress__circle-clipper","mdc-circular-progress__circle-left"],[3,"ngTemplateOutlet"],[1,"mdc-circular-progress__gap-patch"],[1,"mdc-circular-progress__circle-clipper","mdc-circular-progress__circle-right"],["xmlns","http://www.w3.org/2000/svg","focusable","false",1,"mdc-circular-progress__indeterminate-circle-graphic"],["cx","50%","cy","50%"]],template:function(i,n){if(i&1&&(_A(0,wHA,2,8,"ng-template",null,0,Fh),S(2,"div",2,1),ar(),S(4,"svg",3),JA(5,"circle",4),F()(),SI(),S(6,"div",5)(7,"div",6)(8,"div",7),_r(9,8),F(),S(10,"div",9),_r(11,8),F(),S(12,"div",10),_r(13,8),F()()()),i&2){let o=cr(1);G(4),Ne("viewBox",n._viewBox()),G(),uo("stroke-dasharray",n._strokeCircumference(),"px")("stroke-dashoffset",n._strokeDashOffset(),"px")("stroke-width",n._circleStrokeWidth(),"%"),Ne("r",n._circleRadius()),G(4),yA("ngTemplateOutlet",o),G(2),yA("ngTemplateOutlet",o),G(2),yA("ngTemplateOutlet",o)}},dependencies:[Yh],styles:[".mat-mdc-progress-spinner{display:block;overflow:hidden;line-height:0;position:relative;direction:ltr;transition:opacity 250ms cubic-bezier(0.4, 0, 0.6, 1)}.mat-mdc-progress-spinner circle{stroke-width:var(--mdc-circular-progress-active-indicator-width, 4px)}.mat-mdc-progress-spinner._mat-animation-noopable,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__determinate-circle{transition:none !important}.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-circle-graphic,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__spinner-layer,.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-container{animation:none !important}.mat-mdc-progress-spinner._mat-animation-noopable .mdc-circular-progress__indeterminate-container circle{stroke-dasharray:0 !important}@media(forced-colors: active){.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic,.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle{stroke:currentColor;stroke:CanvasText}}.mdc-circular-progress__determinate-container,.mdc-circular-progress__indeterminate-circle-graphic,.mdc-circular-progress__indeterminate-container,.mdc-circular-progress__spinner-layer{position:absolute;width:100%;height:100%}.mdc-circular-progress__determinate-container{transform:rotate(-90deg)}.mdc-circular-progress--indeterminate .mdc-circular-progress__determinate-container{opacity:0}.mdc-circular-progress__indeterminate-container{font-size:0;letter-spacing:0;white-space:nowrap;opacity:0}.mdc-circular-progress--indeterminate .mdc-circular-progress__indeterminate-container{opacity:1;animation:mdc-circular-progress-container-rotate 1568.2352941176ms linear infinite}.mdc-circular-progress__determinate-circle-graphic,.mdc-circular-progress__indeterminate-circle-graphic{fill:rgba(0,0,0,0)}.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic{stroke:var(--mdc-circular-progress-active-indicator-color, var(--mat-sys-primary))}@media(forced-colors: active){.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle,.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic{stroke:CanvasText}}.mdc-circular-progress__determinate-circle{transition:stroke-dashoffset 500ms cubic-bezier(0, 0, 0.2, 1)}.mdc-circular-progress__gap-patch{position:absolute;top:0;left:47.5%;box-sizing:border-box;width:5%;height:100%;overflow:hidden}.mdc-circular-progress__gap-patch .mdc-circular-progress__indeterminate-circle-graphic{left:-900%;width:2000%;transform:rotate(180deg)}.mdc-circular-progress__circle-clipper .mdc-circular-progress__indeterminate-circle-graphic{width:200%}.mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{left:-100%}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-left .mdc-circular-progress__indeterminate-circle-graphic{animation:mdc-circular-progress-left-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress--indeterminate .mdc-circular-progress__circle-right .mdc-circular-progress__indeterminate-circle-graphic{animation:mdc-circular-progress-right-spin 1333ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}.mdc-circular-progress__circle-clipper{display:inline-flex;position:relative;width:50%;height:100%;overflow:hidden}.mdc-circular-progress--indeterminate .mdc-circular-progress__spinner-layer{animation:mdc-circular-progress-spinner-layer-rotate 5332ms cubic-bezier(0.4, 0, 0.2, 1) infinite both}@keyframes mdc-circular-progress-container-rotate{to{transform:rotate(360deg)}}@keyframes mdc-circular-progress-spinner-layer-rotate{12.5%{transform:rotate(135deg)}25%{transform:rotate(270deg)}37.5%{transform:rotate(405deg)}50%{transform:rotate(540deg)}62.5%{transform:rotate(675deg)}75%{transform:rotate(810deg)}87.5%{transform:rotate(945deg)}100%{transform:rotate(1080deg)}}@keyframes mdc-circular-progress-left-spin{from{transform:rotate(265deg)}50%{transform:rotate(130deg)}to{transform:rotate(265deg)}}@keyframes mdc-circular-progress-right-spin{from{transform:rotate(-265deg)}50%{transform:rotate(-130deg)}to{transform:rotate(-265deg)}}"],encapsulation:2,changeDetection:0})}return t})();var mcA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[it]})}return t})();function MHA(t,e){if(t&1){let A=be();S(0,"div",1)(1,"div"),AA(2,"All eval sets"),F(),S(3,"mat-icon",2),hA("click",function(){RA(A);let n=O();return xA(n.openNewEvalSetDialog())}),AA(4,"add"),F()()}}function kHA(t,e){if(t&1){let A=be();S(0,"div")(1,"div",3)(2,"div",4),AA(3," Create New Evaluation Set "),F(),S(4,"div",5),AA(5," An evaluation set is a curated collection of evaluation cases, where each case includes input-output examples for assessing agent performance. "),F(),S(6,"div",6),hA("click",function(){RA(A);let n=O();return xA(n.openNewEvalSetDialog())}),AA(7," Create Evaluation Set "),F()()()}}function SHA(t,e){if(t&1){let A=be();S(0,"div",8),hA("click",function(){let n=RA(A).$implicit,o=O(2);return xA(o.selectEvalSet(n))}),S(1,"div",9)(2,"span",10),AA(3,"folder"),F(),S(4,"div",11),AA(5),F()(),S(6,"div")(7,"mat-icon",12),AA(8,"chevron_right"),F()()()}if(t&2){let A=e.$implicit;G(5),Gt(A)}}function RHA(t,e){if(t&1&&(S(0,"div"),Dn(1,SHA,9,1,"div",7,to),F()),t&2){let A=O();G(),yn(A.evalsets)}}function xHA(t,e){if(t&1){let A=be();S(0,"th",29)(1,"mat-checkbox",30),hA("change",function(n){RA(A);let o=O(4);return xA(n?o.toggleAllRows():null)}),F()()}if(t&2){let A=O(4);G(),yA("checked",A.selection.hasValue()&&A.isAllSelected())("indeterminate",A.selection.hasValue()&&!A.isAllSelected())}}function LHA(t,e){if(t&1){let A=be();S(0,"td",31)(1,"mat-checkbox",32),hA("click",function(n){return RA(A),xA(n.stopPropagation())})("change",function(n){let o=RA(A).$implicit,r=O(4);return xA(n?r.selection.toggle(o):null)}),F()()}if(t&2){let A=e.$implicit,i=O(4);G(),yA("checked",i.selection.isSelected(A))}}function FHA(t,e){t&1&&(S(0,"th",29),AA(1," Case ID "),F())}function NHA(t,e){if(t&1){let A=be();S(0,"td",33),hA("click",function(){let n=RA(A).$implicit,o=O(4);return xA(o.getEvalCase(n))}),AA(1),F()}if(t&2){let A,i=e.$implicit,n=O(4);ue("selected-eval-case",i===((A=n.selectedEvalCase())==null?null:A.evalId)),G(),Et(" ",i," ")}}function _HA(t,e){t&1&&(S(0,"th",29),AA(1," Result "),F())}function GHA(t,e){if(t&1){let A=be();S(0,"button",35),hA("click",function(){RA(A);let n=O().$implicit,o=O(4);return xA(o.getSession(n))}),S(1,"span",36),AA(2),F(),S(3,"div",37),AA(4),F()()}if(t&2){let A=O().$implicit,i=O(4);yA("ngClass",i.getEvalResultForCase(A)==1?"result-btn pass":"result-btn fail"),G(2),Et(" ",i.getEvalResultForCase(A)==1?"check":"close"," "),G(2),Et("",i.getEvalResultForCase(A)==1?"Pass":"Fail"," ")}}function UHA(t,e){if(t&1&&(S(0,"td",31),_A(1,GHA,5,3,"button",34),F()),t&2){let A=e.$implicit,i=O(4);G(),GA(i.getEvalResultForCase(A)?1:-1)}}function KHA(t,e){t&1&&JA(0,"tr",38)}function YHA(t,e){t&1&&JA(0,"tr",39)}function JHA(t,e){if(t&1){let A=be();S(0,"div")(1,"div",16)(2,"button",17),hA("click",function(){RA(A);let n=O(3);return xA(n.openEvalConfigDialog())}),AA(3,"Run Evaluation"),F(),S(4,"mat-icon",18),hA("click",function(){RA(A);let n=O(3);return xA(n.toggleEvalHistoryButton())}),AA(5,"history"),F()(),S(6,"div",19)(7,"table",20),y2(8,21),_A(9,xHA,2,2,"th",22)(10,LHA,2,1,"td",23),v2(),y2(11,24),_A(12,FHA,2,0,"th",22)(13,NHA,2,3,"td",25),v2(),y2(14,26),_A(15,_HA,2,0,"th",22)(16,UHA,2,1,"td",23),v2(),_A(17,KHA,1,0,"tr",27)(18,YHA,1,0,"tr",28),F()()()}if(t&2){let A=O(3);G(7),yA("dataSource",A.dataSource),G(10),yA("matHeaderRowDef",A.displayedColumns),G(),yA("matRowDefColumns",A.displayedColumns)}}function THA(t,e){if(t&1&&(S(0,"div")(1,"span",50),AA(2,"|"),F(),S(3,"span",51),AA(4),F()()),t&2){let A=O().$implicit,i=O(4);G(4),Et("",i.getFailCountForCurrentResult(A.evaluationResults.evaluationResults)," Failed")}}function HHA(t,e){if(t&1&&(S(0,"span",52),AA(1),F()),t&2){let A=e.$implicit;G(),Ob(" ",A.metricName,": ",A.threshold," ")}}function zHA(t,e){if(t&1&&(S(0,"div",46),Dn(1,HHA,2,2,"span",52,to),F()),t&2){let A=O().$implicit,i=O(4);G(),yn(i.getEvalMetrics(A))}}function OHA(t,e){if(t&1){let A=be();S(0,"div")(1,"div",53)(2,"span"),AA(3),F(),S(4,"button",54),hA("click",function(){let n=RA(A).$implicit,o=O(6);return xA(o.getHistorySession(n))}),S(5,"span",36),AA(6),F(),S(7,"div",37),AA(8),F()()()()}if(t&2){let A=e.$implicit;G(3),Et(" ",A.evalId," "),G(),yA("ngClass",A.finalEvalStatus==1?"result-btn pass":"result-btn fail"),G(2),Et(" ",A.finalEvalStatus==1?"check":"close"," "),G(2),Et("",A.finalEvalStatus==1?"PASS":"FAIL"," ")}}function PHA(t,e){if(t&1&&(S(0,"div",49),Dn(1,OHA,9,4,"div",null,to),F()),t&2){let A=O().$implicit,i=O(4);G(),yn(i.generateHistoryEvaluationDatasource(A.timestamp))}}function jHA(t,e){if(t&1){let A=be();S(0,"div")(1,"div",40)(2,"div",41)(3,"div",42)(4,"div",43),AA(5),F(),S(6,"div",44)(7,"span",45),AA(8),F(),_A(9,THA,5,1,"div"),F(),_A(10,zHA,3,0,"div",46),F(),S(11,"div",47)(12,"mat-icon",48),hA("click",function(){let n=RA(A).$implicit,o=O(4);return xA(o.toggleHistoryStatusCard(n.timestamp))}),AA(13),F()()(),_A(14,PHA,3,0,"div",49),F()()}if(t&2){let A=e.$implicit,i=O(4);G(5),Gt(i.formatTimestamp(A.timestamp)),G(3),Et("",i.getPassCountForCurrentResult(A.evaluationResults.evaluationResults)," Passed"),G(),GA(i.getFailCountForCurrentResult(A.evaluationResults.evaluationResults)>0?9:-1),G(),GA(i.getEvalMetrics(A)?10:-1),G(3),Gt(i.getEvaluationStatusCardActionButtonIcon(A.timestamp)),G(),GA(i.isEvaluationStatusCardToggled(A.timestamp)?14:-1)}}function qHA(t,e){if(t&1&&(S(0,"div"),Dn(1,jHA,15,6,"div",null,to),F()),t&2){let A=O(3);G(),yn(A.getEvalHistoryOfCurrentSetSorted())}}function VHA(t,e){if(t&1&&(S(0,"div"),_A(1,JHA,19,3,"div")(2,qHA,3,0,"div"),F()),t&2){let A=O(2);G(),GA(A.showEvalHistory()?-1:1),G(),GA(A.showEvalHistory()?2:-1)}}function ZHA(t,e){if(t&1){let A=be();S(0,"button",55),hA("click",function(){RA(A);let n=O(2);return xA(n.openNewEvalCaseDialog())}),S(1,"div",56)(2,"mat-icon"),AA(3,"add"),F(),S(4,"div",57),AA(5),F()()()}if(t&2){let A=O(2);G(5),Et(" Add current session to ",A.selectedEvalSet," ")}}function WHA(t,e){t&1&&(S(0,"div"),JA(1,"mat-spinner",58),F()),t&2&&(G(),yA("diameter",28)("strokeWidth",3))}function XHA(t,e){if(t&1){let A=be();S(0,"div")(1,"div",9)(2,"mat-icon",13),hA("click",function(){RA(A);let n=O();return xA(n.clearSelectedEvalSet())}),AA(3,"chevron_left"),F(),S(4,"div",14),hA("click",function(){RA(A);let n=O();return xA(n.clearSelectedEvalSet())}),AA(5),F()(),_A(6,VHA,3,2,"div")(7,ZHA,6,1,"button",15)(8,WHA,2,2,"div"),F()}if(t&2){let A=O();G(5),Et(" ",A.selectedEvalSet," "),G(),GA(A.evalCases.length>0&&!A.evalRunning()?6:-1),G(),GA(!A.evalRunning()&&!A.showEvalHistory()?7:-1),G(),GA(A.evalRunning()?8:-1)}}var id=class t{constructor(e,A){this.evalService=e;this.sessionService=A;this.evalCasesSubject.subscribe(i=>{!this.selectedEvalCase()&&this.deletedEvalCaseIndex>=0&&i.length>0?(this.selectNewEvalCase(i),this.deletedEvalCaseIndex=-1):i.length===0&&this.shouldReturnToSession.emit(!0)})}checkboxes;appName="";userId="";sessionId="";sessionSelected=new WA;shouldShowTab=new WA;evalNotInstalledMsg=new WA;evalCaseSelected=new WA;evalSetIdSelected=new WA;shouldReturnToSession=new WA;evalCasesSubject=new Mi([]);changeDetectorRef=f(It);flagService=f(KB);displayedColumns=["select","evalId","finalEvalStatus"];evalsets=[];selectedEvalSet="";evalCases=[];selectedEvalCase=Jo(null);deletedEvalCaseIndex=-1;dataSource=new Cf(this.evalCases);selection=new K2(!0,[]);showEvalHistory=Jo(!1);evalRunning=Jo(!1);evalMetrics=acA;currentEvalResultBySet=new Map;dialog=f(qs);appEvaluationResults={};ngOnChanges(e){e.appName&&(this.selectedEvalSet="",this.evalCases=[],this.getEvalSet(),this.getEvaluationResult())}ngOnInit(){}selectNewEvalCase(e){let A=this.deletedEvalCaseIndex;this.deletedEvalCaseIndex===e.length&&(A=0),this.getEvalCase(e[A])}getEvalSet(){this.appName!=""&&this.evalService.getEvalSets(this.appName).pipe(mr(e=>e.status===404&&e.statusText==="Not Found"?(this.shouldShowTab.emit(!1),Me(null)):Me([]))).subscribe(e=>{e!==null&&(this.shouldShowTab.emit(!0),this.evalsets=e)})}openNewEvalSetDialog(){this.dialog.open(Ef,{width:"600px",data:{appName:this.appName}}).afterClosed().subscribe(A=>{A&&this.getEvalSet()})}openNewEvalCaseDialog(){this.dialog.open(Bf,{width:"600px",data:{appName:this.appName,userId:this.userId,sessionId:this.sessionId,evalSetId:this.selectedEvalSet}}).afterClosed().subscribe(A=>{A&&this.listEvalCases()})}listEvalCases(){this.evalCases=[],this.evalService.listEvalCases(this.appName,this.selectedEvalSet).subscribe(e=>{this.evalCases=e,this.dataSource=new Cf(this.evalCases),this.evalCasesSubject.next(this.evalCases),this.changeDetectorRef.detectChanges()})}runEval(){if(this.evalRunning.set(!0),this.selection.selected.length==0){alert("No case selected!"),this.evalRunning.set(!1);return}this.evalService.runEval(this.appName,this.selectedEvalSet,this.selection.selected,this.evalMetrics).pipe(mr(e=>(e.error?.detail?.includes("not installed")&&this.evalNotInstalledMsg.emit(e.error.detail),Me([])))).subscribe(e=>{this.evalRunning.set(!1),this.currentEvalResultBySet.set(this.selectedEvalSet,e),this.getEvaluationResult()})}selectEvalSet(e){this.selectedEvalSet=e,this.listEvalCases()}clearSelectedEvalSet(){if(this.showEvalHistory()){this.toggleEvalHistoryButton();return}this.selectedEvalSet=""}isAllSelected(){let e=this.selection.selected.length,A=this.dataSource.data.length;return e===A}toggleAllRows(){if(this.isAllSelected()){this.selection.clear();return}this.selection.select(...this.dataSource.data)}getEvalResultForCase(e){let A=this.currentEvalResultBySet.get(this.selectedEvalSet)?.filter(i=>i.evalId==e);if(!(!A||A.length==0))return A[0].finalEvalStatus}formatToolUses(e){let A=[];for(let i of e)A.push({name:i.name,args:i.args});return A}addEvalCaseResultToEvents(e,A){let i=A.evalMetricResultPerInvocation,n=-1;if(i)for(let o=0;on.evalId==e)[0],i=A.sessionId;this.sessionService.getSession(this.userId,this.appName,i).subscribe(n=>{this.addEvalCaseResultToEvents(n,A);let o=this.fromApiResultToSession(n);this.sessionSelected.emit(o)})}toggleEvalHistoryButton(){this.showEvalHistory.set(!this.showEvalHistory())}getEvalHistoryOfCurrentSet(){return this.appEvaluationResults[this.appName][this.selectedEvalSet]}getEvalHistoryOfCurrentSetSorted(){let e=this.getEvalHistoryOfCurrentSet();return Object.keys(e).sort((n,o)=>o.localeCompare(n)).map(n=>({timestamp:n,evaluationResults:e[n]}))}getPassCountForCurrentResult(e){return e.filter(A=>A.finalEvalStatus==1).length}getFailCountForCurrentResult(e){return e.filter(A=>A.finalEvalStatus==2).length}formatTimestamp(e){let A=Number(e);if(isNaN(A))return"Invalid timestamp provided";let i=new Date(A*1e3);if(isNaN(i.getTime()))return"Invalid date created from timestamp";let n={month:"short",day:"numeric",year:"numeric",hour:"numeric",minute:"2-digit",hour12:!0};return new Intl.DateTimeFormat("en-US",n).format(i)}getEvaluationStatusCardActionButtonIcon(e){return this.getEvalHistoryOfCurrentSet()[e].isToggled?"keyboard_arrow_up":"keyboard_arrow_down"}toggleHistoryStatusCard(e){this.getEvalHistoryOfCurrentSet()[e].isToggled=!this.getEvalHistoryOfCurrentSet()[e].isToggled}isEvaluationStatusCardToggled(e){return this.getEvalHistoryOfCurrentSet()[e].isToggled}generateHistoryEvaluationDatasource(e){return this.getEvalHistoryOfCurrentSet()[e].evaluationResults}getHistorySession(e){this.addEvalCaseResultToEvents(e.sessionDetails,e);let A=this.fromApiResultToSession(e.sessionDetails);this.sessionSelected.emit(A)}getEvalCase(e){this.evalService.getEvalCase(this.appName,this.selectedEvalSet,e).subscribe(A=>{this.selectedEvalCase.set(A),this.evalCaseSelected.emit(A),this.evalSetIdSelected.emit(this.selectedEvalSet)})}resetEvalCase(){this.selectedEvalCase.set(null)}resetEvalResults(){this.currentEvalResultBySet.clear()}deleteEvalCase(e){this.evalService.deleteEvalCase(this.appName,this.selectedEvalSet,e).subscribe(A=>{this.deletedEvalCaseIndex=this.evalCases.indexOf(e),this.selectedEvalCase.set(null),this.listEvalCases()})}getEvaluationResult(){this.evalService.listEvalResults(this.appName).pipe(mr(e=>e.status===404&&e.statusText==="Not Found"?(this.shouldShowTab.emit(!1),Me(null)):Me([]))).subscribe(e=>{for(let A of e)this.evalService.getEvalResult(this.appName,A).subscribe(i=>{this.appEvaluationResults[this.appName]||(this.appEvaluationResults[this.appName]={}),this.appEvaluationResults[this.appName][i.evalSetId]||(this.appEvaluationResults[this.appName][i.evalSetId]={});let n=i.creationTimestamp;this.appEvaluationResults[this.appName][i.evalSetId][n]||(this.appEvaluationResults[this.appName][i.evalSetId][n]={isToggled:!1,evaluationResults:[]});let o={isToggled:!1,evaluationResults:i.evalCaseResults.map(r=>({setId:r.id,evalId:r.evalId,finalEvalStatus:r.finalEvalStatus,evalMetricResults:r.evalMetricResults,evalMetricResultPerInvocation:r.evalMetricResultPerInvocation,sessionId:r.sessionId,sessionDetails:r.sessionDetails,overallEvalMetricResults:r.overallEvalMetricResults??[]}))};this.appEvaluationResults[this.appName][i.evalSetId][n]=o})})}openEvalConfigDialog(){if(this.selection.selected.length==0){alert("No case selected!");return}this.dialog.open(Qf,{maxWidth:"90vw",maxHeight:"90vh",data:{evalMetrics:this.evalMetrics}}).afterClosed().subscribe(A=>{A&&(this.evalMetrics=A,this.runEval())})}getEvalMetrics(e){if(!e||!e.evaluationResults||!e.evaluationResults.evaluationResults)return this.evalMetrics;let A=e.evaluationResults.evaluationResults;return A.length===0?this.evalMetrics:typeof A[0].overallEvalMetricResults>"u"||!A[0].overallEvalMetricResults||A[0].overallEvalMetricResults.length===0?this.evalMetrics:A[0].overallEvalMetricResults.map(n=>({metricName:n.metricName,threshold:n.threshold}))}static \u0275fac=function(A){return new(A||t)(PA(Vc),PA(Wg))};static \u0275cmp=zA({type:t,selectors:[["app-eval-tab"]],viewQuery:function(A,i){if(A&1&&Te(bQ,5),A&2){let n;XA(n=$A())&&(i.checkboxes=n)}},inputs:{appName:"appName",userId:"userId",sessionId:"sessionId"},outputs:{sessionSelected:"sessionSelected",shouldShowTab:"shouldShowTab",evalNotInstalledMsg:"evalNotInstalledMsg",evalCaseSelected:"evalCaseSelected",evalSetIdSelected:"evalSetIdSelected",shouldReturnToSession:"shouldReturnToSession"},standalone:!1,features:[ti],decls:5,vars:4,consts:[[1,"eval-container"],[1,"eval-set-actions"],["matTooltip","Create new evaluation set",2,"cursor","pointer",3,"click"],[1,"empty-eval-info"],[1,"info-title"],[1,"info-detail"],[1,"info-create",3,"click"],[1,"eval-set-row"],[1,"eval-set-row",3,"click"],[2,"display","flex"],[1,"material-symbols-outlined",2,"margin-right","10px","padding-top","16px"],[2,"font-family","Roboto","font-size","14px","padding","16px","padding-top","20px"],[2,"padding-top","20px","color","#9AA0A6"],[2,"color","white","cursor","pointer",3,"click"],[2,"color","#9AA0A6","padding-top","2px","cursor","pointer",3,"click"],[1,"save-session-btn"],[1,"evaluation-tab-header"],[1,"run-eval-btn",3,"click"],["matTooltip","View eval run history",1,"evaluation-history-icon",3,"click"],[1,"mat-table-container",2,"margin-top","16px"],["mat-table","",3,"dataSource"],["matColumnDef","select"],["mat-header-cell","",4,"matHeaderCellDef"],["mat-cell","",4,"matCellDef"],["matColumnDef","evalId"],["mat-cell","","class","eval-case-id",3,"selected-eval-case","click",4,"matCellDef"],["matColumnDef","finalEvalStatus"],["mat-header-row","",4,"matHeaderRowDef"],["mat-row","",4,"matRowDef","matRowDefColumns"],["mat-header-cell",""],[3,"change","checked","indeterminate"],["mat-cell",""],[3,"click","change","checked"],["mat-cell","",1,"eval-case-id",3,"click"],["matTooltip","View eval run result",3,"ngClass"],["matTooltip","View eval run result",3,"click","ngClass"],[1,"material-symbols-outlined"],[2,"padding-top","4px"],["mat-header-row",""],["mat-row",""],[1,"status-card"],[1,"status-card__overview"],[1,"status-card__info"],[1,"status-card__timestamp"],[1,"status-card__summary"],[1,"status-card__passed"],[1,"status-card__metrics"],[1,"status-card__action"],[3,"click"],[1,"status-card__history-cases"],[1,"status-card__separator"],[1,"status-card__failed"],[1,"status-card__metric"],[1,"status-card__history-case"],[3,"click","ngClass"],[1,"save-session-btn",3,"click"],[1,"save-session-btn-detail"],[1,"save-session-btn-text"],[1,"eval-spinner",3,"diameter","strokeWidth"]],template:function(A,i){A&1&&(S(0,"div",0),_A(1,MHA,5,0,"div",1)(2,kHA,8,0,"div")(3,RHA,3,0,"div")(4,XHA,9,4,"div"),F()),A&2&&(G(),GA(i.selectedEvalSet==""?1:-1),G(),GA(i.evalsets.length==0?2:-1),G(),GA(i.evalsets.length>0&&i.selectedEvalSet==""?3:-1),G(),GA(i.selectedEvalSet!=""?4:-1))},dependencies:[Xa,P2,bQ,WaA,$aA,icA,AcA,XaA,ncA,ecA,tcA,ocA,rcA,_B,fcA],styles:[".eval-container[_ngcontent-%COMP%]{margin-top:20px;padding-left:25px;padding-right:25px}.eval-case-id[_ngcontent-%COMP%]{cursor:pointer}.eval-set-actions[_ngcontent-%COMP%]{display:flex;justify-content:space-between;color:#9aa0a6;font-style:normal;font-weight:700;font-size:14px}.empty-eval-info[_ngcontent-%COMP%]{margin-top:12px;background-color:#202124;border-radius:8px;box-shadow:0 2px 6px 2px #00000026,0 1px 2px #0000004d}.info-title[_ngcontent-%COMP%]{color:#e8eaed;font-family:Roboto;font-size:14px;font-weight:500;padding-top:13px;padding-right:16px;padding-left:16px}.info-detail[_ngcontent-%COMP%]{color:#e8eaed;font-family:Roboto;font-size:14px;font-weight:400;padding-top:13px;padding-right:16px;padding-left:16px;letter-spacing:.2px}.info-create[_ngcontent-%COMP%]{color:var(--Blue-300, #8ab4f8);font-size:14px;font-style:normal;font-weight:500;padding-right:16px;padding-left:16px;margin-top:19px;padding-bottom:16px;cursor:pointer}.eval-set-row[_ngcontent-%COMP%]{display:flex;justify-content:space-between;cursor:pointer}.selected-eval-case[_ngcontent-%COMP%]{font-weight:900;color:#8ab4f8}.save-session-btn[_ngcontent-%COMP%]{width:100%;background:linear-gradient(0deg,#8ab4f83d 0% 100%),#202124;border:none;border-radius:4px;margin-top:12px;cursor:pointer}.save-session-btn-detail[_ngcontent-%COMP%]{display:flex;padding:8px 16px 8px 12px;justify-content:center}.save-session-btn-text[_ngcontent-%COMP%]{padding-top:2px;color:var(--Blue-100, #d2e3fc);font-family:Google Sans;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.run-eval-btn[_ngcontent-%COMP%]{border-radius:4px;border:1px solid var(--Grey-700, #5f6368);background-color:transparent;padding:8px 24px;margin-top:16px;color:#8ab4f8;cursor:pointer}.run-eval-btn[_ngcontent-%COMP%]:hover{background-color:#202124}.result-btn[_ngcontent-%COMP%]{display:flex;background-color:transparent;border-radius:4px;border:1px solid var(--Grey-700, #5f6368);margin-top:4px;cursor:pointer}.result-btn[_ngcontent-%COMP%]:hover{background-color:#202124}.result-btn.pass[_ngcontent-%COMP%]{color:#44c265}.result-btn.fail[_ngcontent-%COMP%]{color:#ff8983}.evaluation-tab-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%}.evaluation-history-icon[_ngcontent-%COMP%]{cursor:pointer;margin-top:4px}.status-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;align-items:center;border-radius:8px;background-color:#2d2d2d;padding:12px 16px;margin-top:12px}.status-card__overview[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%}.status-card__info[_ngcontent-%COMP%]{display:flex;flex-direction:column}.status-card__timestamp[_ngcontent-%COMP%]{font-size:.9em;color:#e0e0e0;margin-bottom:5px}.status-card__summary[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:.95em;font-weight:500}.status-card__metrics[_ngcontent-%COMP%]{display:flex;align-items:center;font-size:.75em;font-weight:300;margin-top:3px}.status-card__metric[_ngcontent-%COMP%]{width:180px;color:#bbb}.status-card__failed[_ngcontent-%COMP%]{color:#ff6b6b}.status-card__separator[_ngcontent-%COMP%]{color:#666;margin:0 8px}.status-card__passed[_ngcontent-%COMP%]{color:#63e6be}.status-card__action[_ngcontent-%COMP%]{display:flex;align-items:center}.status-card__action[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{color:#bdbdbd;cursor:pointer;transition:transform .2s ease-in-out}.status-card__action[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]:hover{opacity:.8}.status-card__action[_ngcontent-%COMP%] .status-card__icon[_ngcontent-%COMP%]{color:#bdbdbd;font-size:1.2em;cursor:pointer}.status-card__action[_ngcontent-%COMP%] .status-card__icon[_ngcontent-%COMP%]:hover{opacity:.8}.status-card__history-cases[_ngcontent-%COMP%]{display:flex;flex-direction:column;margin-top:3px;justify-content:flex-start;width:100%}.status-card__history-case[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;width:100%;margin-top:15px}.eval-spinner[_ngcontent-%COMP%]{margin-top:12px}"],changeDetection:0})};function AzA(t,e){t&1&&JA(0,"div",6)}function ezA(t,e){if(t&1&&(S(0,"div",3)(1,"div",5),Dn(2,AzA,1,0,"div",6,Xd),F(),S(4,"span",7),AA(5),F(),S(6,"div",8),AA(7),S(8,"span",9),AA(9),F()(),S(10,"div",10)(11,"div",11),AA(12),F()()()),t&2){let A=e.$implicit,i=O();G(2),yn(i.getArray(A.level)),G(3),Et(" ",i.getSpanIcon(A.span.name)," "),G(),uo("width",400-A.level*20,"px"),G(),Et(" ",A.span.name," "),G(2),Et(" (",(i.toMs(A.span.end_time)-i.toMs(A.span.start_time)).toFixed(2),"ms) "),G(2),uo("left",i.getRelativeStart(A.span),"%")("width",i.getRelativeWidth(A.span),"%"),G(),Et(" ",(i.toMs(A.span.end_time)-i.toMs(A.span.start_time)).toFixed(2),"ms ")}}var hf=class t{constructor(e,A){this.dialogRef=e;this.data=A}tree=[];baseStartTimeMs=0;totalDurationMs=1;flatTree=[];traceLabelIconMap=new Map([["Invocation","start"],["agent_run","directions_run"],["tool","build"],["call_llm","chat"]]);ngOnInit(){this.tree=this.buildSpanTree(this.data.spans),this.flatTree=this.flattenTree(this.tree);let e=this.getGlobalTimes(this.data.spans);this.baseStartTimeMs=e.start,this.totalDurationMs=e.duration}buildSpanTree(e){let A=e.map(o=>rA({},o)),i=new Map,n=[];return A.forEach(o=>i.set(o.span_id,o)),A.forEach(o=>{if(o.parent_span_id&&i.has(o.parent_span_id)){let r=i.get(o.parent_span_id);r.children=r.children||[],r.children.push(o)}else n.push(o)}),n}getGlobalTimes(e){let A=Math.min(...e.map(n=>this.toMs(n.start_time))),i=Math.max(...e.map(n=>this.toMs(n.end_time)));return{start:A,duration:i-A}}toMs(e){return e/1e6}getRelativeStart(e){return(this.toMs(e.start_time)-this.baseStartTimeMs)/this.totalDurationMs*100}getRelativeWidth(e){return(this.toMs(e.end_time)-this.toMs(e.start_time))/this.totalDurationMs*100}flattenTree(e,A=0){return e.flatMap(n=>[{span:n,level:A},...n.children?this.flattenTree(n.children,A+1):[]])}getSpanIcon(e){for(let[A,i]of this.traceLabelIconMap.entries())if(e.startsWith(A))return i;return"start"}getArray(e){return Array.from({length:e})}static \u0275fac=function(A){return new(A||t)(PA(Br),PA(as))};static \u0275cmp=zA({type:t,selectors:[["app-trace-chart"]],standalone:!1,decls:9,vars:1,consts:[["mat-dialog-title",""],[2,"margin-top","8px"],[1,"trace-container"],[1,"trace-row"],["mat-button","","mat-dialog-close",""],[1,"trace-indent"],[1,"indent-connector"],[1,"material-symbols-outlined",2,"margin-right","8px"],[1,"trace-label"],[1,"trace-duration"],[1,"trace-bar-container"],[1,"trace-bar"]],template:function(A,i){A&1&&(S(0,"h2",0),AA(1),F(),S(2,"mat-dialog-content",1)(3,"div",2),Dn(4,ezA,13,10,"div",3,to),F()(),S(6,"mat-dialog-actions")(7,"button",4),AA(8,"Close"),F()()),A&2&&(G(),Et("Invocation ",i.data.invocId,""),G(3),yn(i.flatTree))},dependencies:[Dr,bs,ma,pa,hg],styles:[".trace-container[_ngcontent-%COMP%]{width:100%;white-space:nowrap;font-size:12px}.trace-label[_ngcontent-%COMP%]{width:400px;color:#e3e3e3;text-overflow:ellipsis;font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:0px}.trace-bar-container[_ngcontent-%COMP%]{width:50vw;position:relative;height:16px}.trace-bar[_ngcontent-%COMP%]{position:absolute;height:18px;background-color:#2f4d65;border-radius:4px;padding-left:4px;overflow:hidden;font-size:11px;line-height:16px;color:#8dabbf;font-family:Google Sans}.trace-duration[_ngcontent-%COMP%]{color:#888;font-weight:400;margin-left:4px}.trace-row[_ngcontent-%COMP%]{display:flex;align-items:stretch;position:relative;height:32px}.trace-indent[_ngcontent-%COMP%]{display:flex;flex-shrink:0;height:100%}.indent-connector[_ngcontent-%COMP%]{width:20px;position:relative;height:100%}.vertical-line[_ngcontent-%COMP%]{position:absolute;top:0;bottom:0;left:9px;width:1px;background-color:#ccc}.horizontal-line[_ngcontent-%COMP%]{position:absolute;top:50%;left:9px;width:10px;height:1px;background-color:#ccc}"]})};var pcA=(()=>{class t{get vertical(){return this._vertical}set vertical(A){this._vertical=Xo(A)}_vertical=!1;get inset(){return this._inset}set inset(A){this._inset=Xo(A)}_inset=!1;static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-divider"]],hostAttrs:["role","separator",1,"mat-divider"],hostVars:7,hostBindings:function(i,n){i&2&&(Ne("aria-orientation",n.vertical?"vertical":"horizontal"),ue("mat-divider-vertical",n.vertical)("mat-divider-horizontal",!n.vertical)("mat-divider-inset",n.inset))},inputs:{vertical:"vertical",inset:"inset"},decls:0,vars:0,template:function(i,n){},styles:[".mat-divider{display:block;margin:0;border-top-style:solid;border-top-color:var(--mat-divider-color, var(--mat-sys-outline));border-top-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-vertical{border-top:0;border-right-style:solid;border-right-color:var(--mat-divider-color, var(--mat-sys-outline));border-right-width:var(--mat-divider-width, 1px)}.mat-divider.mat-divider-inset{margin-left:80px}[dir=rtl] .mat-divider.mat-divider-inset{margin-left:auto;margin-right:80px}"],encapsulation:2,changeDetection:0})}return t})(),wcA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[it,it]})}return t})();var izA=["*"],nzA='.mdc-list{margin:0;padding:8px 0;list-style-type:none}.mdc-list:focus{outline:none}.mdc-list-item{display:flex;position:relative;justify-content:flex-start;overflow:hidden;padding:0;align-items:stretch;cursor:pointer;padding-left:16px;padding-right:16px;background-color:var(--mdc-list-list-item-container-color, transparent);border-radius:var(--mdc-list-list-item-container-shape, var(--mat-sys-corner-none))}.mdc-list-item.mdc-list-item--selected{background-color:var(--mdc-list-list-item-selected-container-color)}.mdc-list-item:focus{outline:0}.mdc-list-item.mdc-list-item--disabled{cursor:auto}.mdc-list-item.mdc-list-item--with-one-line{height:var(--mdc-list-list-item-one-line-container-height, 48px)}.mdc-list-item.mdc-list-item--with-one-line .mdc-list-item__start{align-self:center;margin-top:0}.mdc-list-item.mdc-list-item--with-one-line .mdc-list-item__end{align-self:center;margin-top:0}.mdc-list-item.mdc-list-item--with-two-lines{height:var(--mdc-list-list-item-two-line-container-height, 64px)}.mdc-list-item.mdc-list-item--with-two-lines .mdc-list-item__start{align-self:flex-start;margin-top:16px}.mdc-list-item.mdc-list-item--with-two-lines .mdc-list-item__end{align-self:center;margin-top:0}.mdc-list-item.mdc-list-item--with-three-lines{height:var(--mdc-list-list-item-three-line-container-height, 88px)}.mdc-list-item.mdc-list-item--with-three-lines .mdc-list-item__start{align-self:flex-start;margin-top:16px}.mdc-list-item.mdc-list-item--with-three-lines .mdc-list-item__end{align-self:flex-start;margin-top:16px}.mdc-list-item.mdc-list-item--selected::before,.mdc-list-item.mdc-list-item--selected:focus::before,.mdc-list-item:not(.mdc-list-item--selected):focus::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;content:"";pointer-events:none}a.mdc-list-item{color:inherit;text-decoration:none}.mdc-list-item__start{fill:currentColor;flex-shrink:0;pointer-events:none}.mdc-list-item--with-leading-icon .mdc-list-item__start{color:var(--mdc-list-list-item-leading-icon-color, var(--mat-sys-on-surface-variant));width:var(--mdc-list-list-item-leading-icon-size, 24px);height:var(--mdc-list-list-item-leading-icon-size, 24px);margin-left:16px;margin-right:32px}[dir=rtl] .mdc-list-item--with-leading-icon .mdc-list-item__start{margin-left:32px;margin-right:16px}.mdc-list-item--with-leading-icon:hover .mdc-list-item__start{color:var(--mdc-list-list-item-hover-leading-icon-color)}.mdc-list-item--with-leading-avatar .mdc-list-item__start{width:var(--mdc-list-list-item-leading-avatar-size, 40px);height:var(--mdc-list-list-item-leading-avatar-size, 40px);margin-left:16px;margin-right:16px;border-radius:50%}.mdc-list-item--with-leading-avatar .mdc-list-item__start,[dir=rtl] .mdc-list-item--with-leading-avatar .mdc-list-item__start{margin-left:16px;margin-right:16px;border-radius:50%}.mdc-list-item__end{flex-shrink:0;pointer-events:none}.mdc-list-item--with-trailing-meta .mdc-list-item__end{font-family:var(--mdc-list-list-item-trailing-supporting-text-font, var(--mat-sys-label-small-font));line-height:var(--mdc-list-list-item-trailing-supporting-text-line-height, var(--mat-sys-label-small-line-height));font-size:var(--mdc-list-list-item-trailing-supporting-text-size, var(--mat-sys-label-small-size));font-weight:var(--mdc-list-list-item-trailing-supporting-text-weight, var(--mat-sys-label-small-weight));letter-spacing:var(--mdc-list-list-item-trailing-supporting-text-tracking, var(--mat-sys-label-small-tracking))}.mdc-list-item--with-trailing-icon .mdc-list-item__end{color:var(--mdc-list-list-item-trailing-icon-color, var(--mat-sys-on-surface-variant));width:var(--mdc-list-list-item-trailing-icon-size, 24px);height:var(--mdc-list-list-item-trailing-icon-size, 24px)}.mdc-list-item--with-trailing-icon:hover .mdc-list-item__end{color:var(--mdc-list-list-item-hover-trailing-icon-color)}.mdc-list-item.mdc-list-item--with-trailing-meta .mdc-list-item__end{color:var(--mdc-list-list-item-trailing-supporting-text-color, var(--mat-sys-on-surface-variant))}.mdc-list-item--selected.mdc-list-item--with-trailing-icon .mdc-list-item__end{color:var(--mdc-list-list-item-selected-trailing-icon-color, var(--mat-sys-primary))}.mdc-list-item__content{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;align-self:center;flex:1;pointer-events:none}.mdc-list-item--with-two-lines .mdc-list-item__content,.mdc-list-item--with-three-lines .mdc-list-item__content{align-self:stretch}.mdc-list-item__primary-text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;color:var(--mdc-list-list-item-label-text-color, var(--mat-sys-on-surface));font-family:var(--mdc-list-list-item-label-text-font, var(--mat-sys-body-large-font));line-height:var(--mdc-list-list-item-label-text-line-height, var(--mat-sys-body-large-line-height));font-size:var(--mdc-list-list-item-label-text-size, var(--mat-sys-body-large-size));font-weight:var(--mdc-list-list-item-label-text-weight, var(--mat-sys-body-large-weight));letter-spacing:var(--mdc-list-list-item-label-text-tracking, var(--mat-sys-body-large-tracking))}.mdc-list-item:hover .mdc-list-item__primary-text{color:var(--mdc-list-list-item-hover-label-text-color, var(--mat-sys-on-surface))}.mdc-list-item:focus .mdc-list-item__primary-text{color:var(--mdc-list-list-item-focus-label-text-color, var(--mat-sys-on-surface))}.mdc-list-item--with-two-lines .mdc-list-item__primary-text,.mdc-list-item--with-three-lines .mdc-list-item__primary-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before,.mdc-list-item--with-three-lines .mdc-list-item__primary-text::before{display:inline-block;width:0;height:28px;content:"";vertical-align:0}.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after,.mdc-list-item--with-three-lines .mdc-list-item__primary-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item__secondary-text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block;margin-top:0;color:var(--mdc-list-list-item-supporting-text-color, var(--mat-sys-on-surface-variant));font-family:var(--mdc-list-list-item-supporting-text-font, var(--mat-sys-body-medium-font));line-height:var(--mdc-list-list-item-supporting-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mdc-list-list-item-supporting-text-size, var(--mat-sys-body-medium-size));font-weight:var(--mdc-list-list-item-supporting-text-weight, var(--mat-sys-body-medium-weight));letter-spacing:var(--mdc-list-list-item-supporting-text-tracking, var(--mat-sys-body-medium-tracking))}.mdc-list-item__secondary-text::before{display:inline-block;width:0;height:20px;content:"";vertical-align:0}.mdc-list-item--with-three-lines .mdc-list-item__secondary-text{white-space:normal;line-height:20px}.mdc-list-item--with-overline .mdc-list-item__secondary-text{white-space:nowrap;line-height:auto}.mdc-list-item--with-leading-radio.mdc-list-item,.mdc-list-item--with-leading-checkbox.mdc-list-item,.mdc-list-item--with-leading-icon.mdc-list-item,.mdc-list-item--with-leading-avatar.mdc-list-item{padding-left:0;padding-right:16px}[dir=rtl] .mdc-list-item--with-leading-radio.mdc-list-item,[dir=rtl] .mdc-list-item--with-leading-checkbox.mdc-list-item,[dir=rtl] .mdc-list-item--with-leading-icon.mdc-list-item,[dir=rtl] .mdc-list-item--with-leading-avatar.mdc-list-item{padding-left:16px;padding-right:0}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__primary-text,.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__primary-text,.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines .mdc-list-item__primary-text,.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines .mdc-list-item__primary-text{display:block;margin-top:0;line-height:normal;margin-bottom:-20px}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before,.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before,.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before,.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines .mdc-list-item__primary-text::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after,.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after,.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after,.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines .mdc-list-item__primary-text::after{display:inline-block;width:0;height:20px;content:"";vertical-align:-20px}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end,.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end,.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end,.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end{display:block;margin-top:0;line-height:normal}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before,.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before,.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before,.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines.mdc-list-item--with-trailing-meta .mdc-list-item__end::before{display:inline-block;width:0;height:32px;content:"";vertical-align:0}.mdc-list-item--with-trailing-icon.mdc-list-item,[dir=rtl] .mdc-list-item--with-trailing-icon.mdc-list-item{padding-left:0;padding-right:0}.mdc-list-item--with-trailing-icon .mdc-list-item__end{margin-left:16px;margin-right:16px}.mdc-list-item--with-trailing-meta.mdc-list-item{padding-left:16px;padding-right:0}[dir=rtl] .mdc-list-item--with-trailing-meta.mdc-list-item{padding-left:0;padding-right:16px}.mdc-list-item--with-trailing-meta .mdc-list-item__end{-webkit-user-select:none;user-select:none;margin-left:28px;margin-right:16px}[dir=rtl] .mdc-list-item--with-trailing-meta .mdc-list-item__end{margin-left:16px;margin-right:28px}.mdc-list-item--with-trailing-meta.mdc-list-item--with-three-lines .mdc-list-item__end,.mdc-list-item--with-trailing-meta.mdc-list-item--with-two-lines .mdc-list-item__end{display:block;line-height:normal;align-self:flex-start;margin-top:0}.mdc-list-item--with-trailing-meta.mdc-list-item--with-three-lines .mdc-list-item__end::before,.mdc-list-item--with-trailing-meta.mdc-list-item--with-two-lines .mdc-list-item__end::before{display:inline-block;width:0;height:28px;content:"";vertical-align:0}.mdc-list-item--with-leading-radio .mdc-list-item__start,.mdc-list-item--with-leading-checkbox .mdc-list-item__start{margin-left:8px;margin-right:24px}[dir=rtl] .mdc-list-item--with-leading-radio .mdc-list-item__start,[dir=rtl] .mdc-list-item--with-leading-checkbox .mdc-list-item__start{margin-left:24px;margin-right:8px}.mdc-list-item--with-leading-radio.mdc-list-item--with-two-lines .mdc-list-item__start,.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines .mdc-list-item__start{align-self:flex-start;margin-top:8px}.mdc-list-item--with-trailing-radio.mdc-list-item,.mdc-list-item--with-trailing-checkbox.mdc-list-item{padding-left:16px;padding-right:0}[dir=rtl] .mdc-list-item--with-trailing-radio.mdc-list-item,[dir=rtl] .mdc-list-item--with-trailing-checkbox.mdc-list-item{padding-left:0;padding-right:16px}.mdc-list-item--with-trailing-radio.mdc-list-item--with-leading-icon,.mdc-list-item--with-trailing-radio.mdc-list-item--with-leading-avatar,.mdc-list-item--with-trailing-checkbox.mdc-list-item--with-leading-icon,.mdc-list-item--with-trailing-checkbox.mdc-list-item--with-leading-avatar{padding-left:0}[dir=rtl] .mdc-list-item--with-trailing-radio.mdc-list-item--with-leading-icon,[dir=rtl] .mdc-list-item--with-trailing-radio.mdc-list-item--with-leading-avatar,[dir=rtl] .mdc-list-item--with-trailing-checkbox.mdc-list-item--with-leading-icon,[dir=rtl] .mdc-list-item--with-trailing-checkbox.mdc-list-item--with-leading-avatar{padding-right:0}.mdc-list-item--with-trailing-radio .mdc-list-item__end,.mdc-list-item--with-trailing-checkbox .mdc-list-item__end{margin-left:24px;margin-right:8px}[dir=rtl] .mdc-list-item--with-trailing-radio .mdc-list-item__end,[dir=rtl] .mdc-list-item--with-trailing-checkbox .mdc-list-item__end{margin-left:8px;margin-right:24px}.mdc-list-item--with-trailing-radio.mdc-list-item--with-three-lines .mdc-list-item__end,.mdc-list-item--with-trailing-checkbox.mdc-list-item--with-three-lines .mdc-list-item__end{align-self:flex-start;margin-top:8px}.mdc-list-group__subheader{margin:.75rem 16px}.mdc-list-item--disabled .mdc-list-item__start,.mdc-list-item--disabled .mdc-list-item__content,.mdc-list-item--disabled .mdc-list-item__end{opacity:1}.mdc-list-item--disabled .mdc-list-item__primary-text,.mdc-list-item--disabled .mdc-list-item__secondary-text{opacity:var(--mdc-list-list-item-disabled-label-text-opacity, 0.3)}.mdc-list-item--disabled.mdc-list-item--with-leading-icon .mdc-list-item__start{color:var(--mdc-list-list-item-disabled-leading-icon-color, var(--mat-sys-on-surface));opacity:var(--mdc-list-list-item-disabled-leading-icon-opacity, 0.38)}.mdc-list-item--disabled.mdc-list-item--with-trailing-icon .mdc-list-item__end{color:var(--mdc-list-list-item-disabled-trailing-icon-color, var(--mat-sys-on-surface));opacity:var(--mdc-list-list-item-disabled-trailing-icon-opacity, 0.38)}.mat-mdc-list-item.mat-mdc-list-item-both-leading-and-trailing,[dir=rtl] .mat-mdc-list-item.mat-mdc-list-item-both-leading-and-trailing{padding-left:0;padding-right:0}.mdc-list-item.mdc-list-item--disabled .mdc-list-item__primary-text{color:var(--mdc-list-list-item-disabled-label-text-color, var(--mat-sys-on-surface))}.mdc-list-item:hover::before{background-color:var(--mdc-list-list-item-hover-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mdc-list-list-item-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mdc-list-item.mdc-list-item--disabled::before{background-color:var(--mdc-list-list-item-disabled-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mdc-list-list-item-disabled-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-list-item:focus::before{background-color:var(--mdc-list-list-item-focus-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mdc-list-list-item-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}.mdc-list-item--disabled .mdc-radio,.mdc-list-item--disabled .mdc-checkbox{opacity:var(--mdc-list-list-item-disabled-label-text-opacity, 0.3)}.mdc-list-item--with-leading-avatar .mat-mdc-list-item-avatar{border-radius:var(--mdc-list-list-item-leading-avatar-shape, var(--mat-sys-corner-full));background-color:var(--mdc-list-list-item-leading-avatar-color, var(--mat-sys-primary-container))}.mat-mdc-list-item-icon{font-size:var(--mdc-list-list-item-leading-icon-size, 24px)}@media(forced-colors: active){a.mdc-list-item--activated::after{content:"";position:absolute;top:50%;right:16px;transform:translateY(-50%);width:10px;height:0;border-bottom:solid 10px;border-radius:10px}a.mdc-list-item--activated [dir=rtl]::after{right:auto;left:16px}}.mat-mdc-list-base{display:block}.mat-mdc-list-base .mdc-list-item__start,.mat-mdc-list-base .mdc-list-item__end,.mat-mdc-list-base .mdc-list-item__content{pointer-events:auto}.mat-mdc-list-item,.mat-mdc-list-option{width:100%;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-list-item:not(.mat-mdc-list-item-interactive),.mat-mdc-list-option:not(.mat-mdc-list-item-interactive){cursor:default}.mat-mdc-list-item .mat-divider-inset,.mat-mdc-list-option .mat-divider-inset{position:absolute;left:0;right:0;bottom:0}.mat-mdc-list-item .mat-mdc-list-item-avatar~.mat-divider-inset,.mat-mdc-list-option .mat-mdc-list-item-avatar~.mat-divider-inset{margin-left:72px}[dir=rtl] .mat-mdc-list-item .mat-mdc-list-item-avatar~.mat-divider-inset,[dir=rtl] .mat-mdc-list-option .mat-mdc-list-item-avatar~.mat-divider-inset{margin-right:72px}.mat-mdc-list-item-interactive::before{top:0;left:0;right:0;bottom:0;position:absolute;content:"";opacity:0;pointer-events:none;border-radius:inherit}.mat-mdc-list-item>.mat-focus-indicator{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-mdc-list-item:focus>.mat-focus-indicator::before{content:""}.mat-mdc-list-item.mdc-list-item--with-three-lines .mat-mdc-list-item-line.mdc-list-item__secondary-text{white-space:nowrap;line-height:normal}.mat-mdc-list-item.mdc-list-item--with-three-lines .mat-mdc-list-item-unscoped-content.mdc-list-item__secondary-text{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}mat-action-list button{background:none;color:inherit;border:none;font:inherit;outline:inherit;-webkit-tap-highlight-color:rgba(0,0,0,0);text-align:start}mat-action-list button::-moz-focus-inner{border:0}.mdc-list-item--with-leading-icon .mdc-list-item__start{margin-inline-start:var(--mat-list-list-item-leading-icon-start-space, 16px);margin-inline-end:var(--mat-list-list-item-leading-icon-end-space, 16px)}.mat-mdc-nav-list .mat-mdc-list-item{border-radius:var(--mat-list-active-indicator-shape, var(--mat-sys-corner-full));--mat-focus-indicator-border-radius:var(--mat-list-active-indicator-shape, var(--mat-sys-corner-full))}.mat-mdc-nav-list .mat-mdc-list-item.mdc-list-item--activated{background-color:var(--mat-list-active-indicator-color, var(--mat-sys-secondary-container))}',ozA=["unscopedContent"],rzA=["text"],szA=[[["","matListItemAvatar",""],["","matListItemIcon",""]],[["","matListItemTitle",""]],[["","matListItemLine",""]],"*",[["","matListItemMeta",""]],[["mat-divider"]]],azA=["[matListItemAvatar],[matListItemIcon]","[matListItemTitle]","[matListItemLine]","*","[matListItemMeta]","mat-divider"];var czA=new dA("ListOption"),lzA=(()=>{class t{_elementRef=f(ee);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","matListItemTitle",""]],hostAttrs:[1,"mat-mdc-list-item-title","mdc-list-item__primary-text"]})}return t})(),gzA=(()=>{class t{_elementRef=f(ee);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","matListItemLine",""]],hostAttrs:[1,"mat-mdc-list-item-line","mdc-list-item__secondary-text"]})}return t})(),IzA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","matListItemMeta",""]],hostAttrs:[1,"mat-mdc-list-item-meta","mdc-list-item__end"]})}return t})(),DcA=(()=>{class t{_listOption=f(czA,{optional:!0});constructor(){}_isAlignedAtStart(){return!this._listOption||this._listOption?._getTogglePosition()==="after"}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,hostVars:4,hostBindings:function(i,n){i&2&&ue("mdc-list-item__start",n._isAlignedAtStart())("mdc-list-item__end",!n._isAlignedAtStart())}})}return t})(),CzA=(()=>{class t extends DcA{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275dir=jA({type:t,selectors:[["","matListItemAvatar",""]],hostAttrs:[1,"mat-mdc-list-item-avatar"],features:[lt]})}return t})(),dzA=(()=>{class t extends DcA{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275dir=jA({type:t,selectors:[["","matListItemIcon",""]],hostAttrs:[1,"mat-mdc-list-item-icon"],features:[lt]})}return t})(),BzA=new dA("MAT_LIST_CONFIG"),NG=(()=>{class t{_isNonInteractive=!0;get disableRipple(){return this._disableRipple}set disableRipple(A){this._disableRipple=Xo(A)}_disableRipple=!1;get disabled(){return this._disabled}set disabled(A){this._disabled=Xo(A)}_disabled=!1;_defaultOptions=f(BzA,{optional:!0});static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,hostVars:1,hostBindings:function(i,n){i&2&&Ne("aria-disabled",n.disabled)},inputs:{disableRipple:"disableRipple",disabled:"disabled"}})}return t})(),EzA=(()=>{class t{_elementRef=f(ee);_ngZone=f(Qe);_listBase=f(NG,{optional:!0});_platform=f(Ii);_hostElement;_isButtonElement;_noopAnimations;_avatars;_icons;set lines(A){this._explicitLines=zs(A,null),this._updateItemLines(!1)}_explicitLines=null;get disableRipple(){return this.disabled||this._disableRipple||this._noopAnimations||!!this._listBase?.disableRipple}set disableRipple(A){this._disableRipple=Xo(A)}_disableRipple=!1;get disabled(){return this._disabled||!!this._listBase?.disabled}set disabled(A){this._disabled=Xo(A)}_disabled=!1;_subscriptions=new Kt;_rippleRenderer=null;_hasUnscopedTextContent=!1;rippleConfig;get rippleDisabled(){return this.disableRipple||!!this.rippleConfig.disabled}constructor(){f(Rn).load(lr);let A=f(G2,{optional:!0}),i=f(Si,{optional:!0});this.rippleConfig=A||{},this._hostElement=this._elementRef.nativeElement,this._isButtonElement=this._hostElement.nodeName.toLowerCase()==="button",this._noopAnimations=i==="NoopAnimations",this._listBase&&!this._listBase._isNonInteractive&&this._initInteractiveListItem(),this._isButtonElement&&!this._hostElement.hasAttribute("type")&&this._hostElement.setAttribute("type","button")}ngAfterViewInit(){this._monitorProjectedLinesAndTitle(),this._updateItemLines(!0)}ngOnDestroy(){this._subscriptions.unsubscribe(),this._rippleRenderer!==null&&this._rippleRenderer._removeTriggerEvents()}_hasIconOrAvatar(){return!!(this._avatars.length||this._icons.length)}_initInteractiveListItem(){this._hostElement.classList.add("mat-mdc-list-item-interactive"),this._rippleRenderer=new vB(this,this._ngZone,this._hostElement,this._platform,f(Rt)),this._rippleRenderer.setupTriggerEvents(this._hostElement)}_monitorProjectedLinesAndTitle(){this._ngZone.runOutsideAngular(()=>{this._subscriptions.add(zn(this._lines.changes,this._titles.changes).subscribe(()=>this._updateItemLines(!1)))})}_updateItemLines(A){if(!this._lines||!this._titles||!this._unscopedContent)return;A&&this._checkDomForUnscopedTextContent();let i=this._explicitLines??this._inferLinesFromContent(),n=this._unscopedContent.nativeElement;if(this._hostElement.classList.toggle("mat-mdc-list-item-single-line",i<=1),this._hostElement.classList.toggle("mdc-list-item--with-one-line",i<=1),this._hostElement.classList.toggle("mdc-list-item--with-two-lines",i===2),this._hostElement.classList.toggle("mdc-list-item--with-three-lines",i===3),this._hasUnscopedTextContent){let o=this._titles.length===0&&i===1;n.classList.toggle("mdc-list-item__primary-text",o),n.classList.toggle("mdc-list-item__secondary-text",!o)}else n.classList.remove("mdc-list-item__primary-text"),n.classList.remove("mdc-list-item__secondary-text")}_inferLinesFromContent(){let A=this._titles.length+this._lines.length;return this._hasUnscopedTextContent&&(A+=1),A}_checkDomForUnscopedTextContent(){this._hasUnscopedTextContent=Array.from(this._unscopedContent.nativeElement.childNodes).filter(A=>A.nodeType!==A.COMMENT_NODE).some(A=>!!(A.textContent&&A.textContent.trim()))}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,contentQueries:function(i,n,o){if(i&1&&(ci(o,CzA,4),ci(o,dzA,4)),i&2){let r;XA(r=$A())&&(n._avatars=r),XA(r=$A())&&(n._icons=r)}},hostVars:4,hostBindings:function(i,n){i&2&&(Ne("aria-disabled",n.disabled)("disabled",n._isButtonElement&&n.disabled||null),ue("mdc-list-item--disabled",n.disabled))},inputs:{lines:"lines",disableRipple:"disableRipple",disabled:"disabled"}})}return t})();var ycA=(()=>{class t extends NG{static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275cmp=zA({type:t,selectors:[["mat-list"]],hostAttrs:[1,"mat-mdc-list","mat-mdc-list-base","mdc-list"],exportAs:["matList"],features:[ht([{provide:NG,useExisting:t}]),lt],ngContentSelectors:izA,decls:1,vars:0,template:function(i,n){i&1&&(jt(),Fe(0))},styles:[nzA],encapsulation:2,changeDetection:0})}return t})(),vcA=(()=>{class t extends EzA{_lines;_titles;_meta;_unscopedContent;_itemText;get activated(){return this._activated}set activated(A){this._activated=Xo(A)}_activated=!1;_getAriaCurrent(){return this._hostElement.nodeName==="A"&&this._activated?"page":null}_hasBothLeadingAndTrailing(){return this._meta.length!==0&&(this._avatars.length!==0||this._icons.length!==0)}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275cmp=zA({type:t,selectors:[["mat-list-item"],["a","mat-list-item",""],["button","mat-list-item",""]],contentQueries:function(i,n,o){if(i&1&&(ci(o,gzA,5),ci(o,lzA,5),ci(o,IzA,5)),i&2){let r;XA(r=$A())&&(n._lines=r),XA(r=$A())&&(n._titles=r),XA(r=$A())&&(n._meta=r)}},viewQuery:function(i,n){if(i&1&&(Te(ozA,5),Te(rzA,5)),i&2){let o;XA(o=$A())&&(n._unscopedContent=o.first),XA(o=$A())&&(n._itemText=o.first)}},hostAttrs:[1,"mat-mdc-list-item","mdc-list-item"],hostVars:13,hostBindings:function(i,n){i&2&&(Ne("aria-current",n._getAriaCurrent()),ue("mdc-list-item--activated",n.activated)("mdc-list-item--with-leading-avatar",n._avatars.length!==0)("mdc-list-item--with-leading-icon",n._icons.length!==0)("mdc-list-item--with-trailing-meta",n._meta.length!==0)("mat-mdc-list-item-both-leading-and-trailing",n._hasBothLeadingAndTrailing())("_mat-animation-noopable",n._noopAnimations))},inputs:{activated:"activated"},exportAs:["matListItem"],features:[lt],ngContentSelectors:azA,decls:10,vars:0,consts:[["unscopedContent",""],[1,"mdc-list-item__content"],[1,"mat-mdc-list-item-unscoped-content",3,"cdkObserveContent"],[1,"mat-focus-indicator"]],template:function(i,n){if(i&1){let o=be();jt(szA),Fe(0),S(1,"span",1),Fe(2,1),Fe(3,2),S(4,"span",2,0),hA("cdkObserveContent",function(){return RA(o),xA(n._updateItemLines(!0))}),Fe(6,3),F()(),Fe(7,4),Fe(8,5),JA(9,"div",3)}},dependencies:[V6],encapsulation:2,changeDetection:0})}return t})();var bcA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[DB,it,Ps,Dk,wcA]})}return t})();var hzA=["button"],uzA=["*"];function fzA(t,e){if(t&1&&(S(0,"div",2),JA(1,"mat-pseudo-checkbox",6),F()),t&2){let A=O();G(),yA("disabled",A.disabled)}}var McA=new dA("MAT_BUTTON_TOGGLE_DEFAULT_OPTIONS",{providedIn:"root",factory:mzA});function mzA(){return{hideSingleSelectionIndicator:!1,hideMultipleSelectionIndicator:!1,disabledInteractive:!1}}var kcA=new dA("MatButtonToggleGroup"),pzA={provide:yc,useExisting:Ir(()=>_G),multi:!0},i7=class{source;value;constructor(e,A){this.source=e,this.value=A}},_G=(()=>{class t{_changeDetector=f(It);_dir=f(mo,{optional:!0});_multiple=!1;_disabled=!1;_disabledInteractive=!1;_selectionModel;_rawValue;_controlValueAccessorChangeFn=()=>{};_onTouched=()=>{};_buttonToggles;appearance;get name(){return this._name}set name(A){this._name=A,this._markButtonsForCheck()}_name=f(sn).getId("mat-button-toggle-group-");vertical;get value(){let A=this._selectionModel?this._selectionModel.selected:[];return this.multiple?A.map(i=>i.value):A[0]?A[0].value:void 0}set value(A){this._setSelectionByValue(A),this.valueChange.emit(this.value)}valueChange=new WA;get selected(){let A=this._selectionModel?this._selectionModel.selected:[];return this.multiple?A:A[0]||null}get multiple(){return this._multiple}set multiple(A){this._multiple=A,this._markButtonsForCheck()}get disabled(){return this._disabled}set disabled(A){this._disabled=A,this._markButtonsForCheck()}get disabledInteractive(){return this._disabledInteractive}set disabledInteractive(A){this._disabledInteractive=A,this._markButtonsForCheck()}get dir(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}change=new WA;get hideSingleSelectionIndicator(){return this._hideSingleSelectionIndicator}set hideSingleSelectionIndicator(A){this._hideSingleSelectionIndicator=A,this._markButtonsForCheck()}_hideSingleSelectionIndicator;get hideMultipleSelectionIndicator(){return this._hideMultipleSelectionIndicator}set hideMultipleSelectionIndicator(A){this._hideMultipleSelectionIndicator=A,this._markButtonsForCheck()}_hideMultipleSelectionIndicator;constructor(){let A=f(McA,{optional:!0});this.appearance=A&&A.appearance?A.appearance:"standard",this.hideSingleSelectionIndicator=A?.hideSingleSelectionIndicator??!1,this.hideMultipleSelectionIndicator=A?.hideMultipleSelectionIndicator??!1}ngOnInit(){this._selectionModel=new K2(this.multiple,void 0,!1)}ngAfterContentInit(){this._selectionModel.select(...this._buttonToggles.filter(A=>A.checked)),this.multiple||this._initializeTabIndex()}writeValue(A){this.value=A,this._changeDetector.markForCheck()}registerOnChange(A){this._controlValueAccessorChangeFn=A}registerOnTouched(A){this._onTouched=A}setDisabledState(A){this.disabled=A}_keydown(A){if(this.multiple||this.disabled)return;let n=A.target.id,o=this._buttonToggles.toArray().findIndex(s=>s.buttonId===n),r=null;switch(A.keyCode){case 32:case 13:r=this._buttonToggles.get(o)||null;break;case 38:r=this._getNextButton(o,-1);break;case 37:r=this._getNextButton(o,this.dir==="ltr"?-1:1);break;case 40:r=this._getNextButton(o,1);break;case 39:r=this._getNextButton(o,this.dir==="ltr"?1:-1);break;default:return}r&&(A.preventDefault(),r._onButtonClick(),r.focus())}_emitChangeEvent(A){let i=new i7(A,this.value);this._rawValue=i.value,this._controlValueAccessorChangeFn(i.value),this.change.emit(i)}_syncButtonToggle(A,i,n=!1,o=!1){!this.multiple&&this.selected&&!A.checked&&(this.selected.checked=!1),this._selectionModel?i?this._selectionModel.select(A):this._selectionModel.deselect(A):o=!0,o?Promise.resolve().then(()=>this._updateModelValue(A,n)):this._updateModelValue(A,n)}_isSelected(A){return this._selectionModel&&this._selectionModel.isSelected(A)}_isPrechecked(A){return typeof this._rawValue>"u"?!1:this.multiple&&Array.isArray(this._rawValue)?this._rawValue.some(i=>A.value!=null&&i===A.value):A.value===this._rawValue}_initializeTabIndex(){if(this._buttonToggles.forEach(A=>{A.tabIndex=-1}),this.selected)this.selected.tabIndex=0;else for(let A=0;Athis._selectValue(n,i))):(this._clearSelection(),this._selectValue(A,i)),!this.multiple&&i.every(n=>n.tabIndex===-1)){for(let n of i)if(!n.disabled){n.tabIndex=0;break}}}_clearSelection(){this._selectionModel.clear(),this._buttonToggles.forEach(A=>{A.checked=!1,this.multiple||(A.tabIndex=-1)})}_selectValue(A,i){for(let n of i)if(n.value===A){n.checked=!0,this._selectionModel.select(n),this.multiple||(n.tabIndex=0);break}}_updateModelValue(A,i){i&&this._emitChangeEvent(A),this.valueChange.emit(this.value)}_markButtonsForCheck(){this._buttonToggles?.forEach(A=>A._markForCheck())}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["mat-button-toggle-group"]],contentQueries:function(i,n,o){if(i&1&&ci(o,n7,5),i&2){let r;XA(r=$A())&&(n._buttonToggles=r)}},hostAttrs:[1,"mat-button-toggle-group"],hostVars:6,hostBindings:function(i,n){i&1&&hA("keydown",function(r){return n._keydown(r)}),i&2&&(Ne("role",n.multiple?"group":"radiogroup")("aria-disabled",n.disabled),ue("mat-button-toggle-vertical",n.vertical)("mat-button-toggle-group-appearance-standard",n.appearance==="standard"))},inputs:{appearance:"appearance",name:"name",vertical:[2,"vertical","vertical",ie],value:"value",multiple:[2,"multiple","multiple",ie],disabled:[2,"disabled","disabled",ie],disabledInteractive:[2,"disabledInteractive","disabledInteractive",ie],hideSingleSelectionIndicator:[2,"hideSingleSelectionIndicator","hideSingleSelectionIndicator",ie],hideMultipleSelectionIndicator:[2,"hideMultipleSelectionIndicator","hideMultipleSelectionIndicator",ie]},outputs:{valueChange:"valueChange",change:"change"},exportAs:["matButtonToggleGroup"],features:[ht([pzA,{provide:kcA,useExisting:t}])]})}return t})(),n7=(()=>{class t{_changeDetectorRef=f(It);_elementRef=f(ee);_focusMonitor=f(dr);_idGenerator=f(sn);_animationMode=f(Si,{optional:!0});_checked=!1;ariaLabel;ariaLabelledby=null;_buttonElement;buttonToggleGroup;get buttonId(){return`${this.id}-button`}id;name;value;get tabIndex(){return this._tabIndex}set tabIndex(A){A!==this._tabIndex&&(this._tabIndex=A,this._markForCheck())}_tabIndex;disableRipple;get appearance(){return this.buttonToggleGroup?this.buttonToggleGroup.appearance:this._appearance}set appearance(A){this._appearance=A}_appearance;get checked(){return this.buttonToggleGroup?this.buttonToggleGroup._isSelected(this):this._checked}set checked(A){A!==this._checked&&(this._checked=A,this.buttonToggleGroup&&this.buttonToggleGroup._syncButtonToggle(this,this._checked),this._changeDetectorRef.markForCheck())}get disabled(){return this._disabled||this.buttonToggleGroup&&this.buttonToggleGroup.disabled}set disabled(A){this._disabled=A}_disabled=!1;get disabledInteractive(){return this._disabledInteractive||this.buttonToggleGroup!==null&&this.buttonToggleGroup.disabledInteractive}set disabledInteractive(A){this._disabledInteractive=A}_disabledInteractive;change=new WA;constructor(){f(Rn).load(lr);let A=f(kcA,{optional:!0}),i=f(new wr("tabindex"),{optional:!0})||"",n=f(McA,{optional:!0});this._tabIndex=parseInt(i)||0,this.buttonToggleGroup=A,this.appearance=n&&n.appearance?n.appearance:"standard",this.disabledInteractive=n?.disabledInteractive??!1}ngOnInit(){let A=this.buttonToggleGroup;this.id=this.id||this._idGenerator.getId("mat-button-toggle-"),A&&(A._isPrechecked(this)?this.checked=!0:A._isSelected(this)!==this._checked&&A._syncButtonToggle(this,this._checked))}ngAfterViewInit(){this._animationMode!=="NoopAnimations"&&this._elementRef.nativeElement.classList.add("mat-button-toggle-animations-enabled"),this._focusMonitor.monitor(this._elementRef,!0)}ngOnDestroy(){let A=this.buttonToggleGroup;this._focusMonitor.stopMonitoring(this._elementRef),A&&A._isSelected(this)&&A._syncButtonToggle(this,!1,!1,!0)}focus(A){this._buttonElement.nativeElement.focus(A)}_onButtonClick(){if(this.disabled)return;let A=this.isSingleSelector()?!0:!this._checked;if(A!==this._checked&&(this._checked=A,this.buttonToggleGroup&&(this.buttonToggleGroup._syncButtonToggle(this,this._checked,!0),this.buttonToggleGroup._onTouched())),this.isSingleSelector()){let i=this.buttonToggleGroup._buttonToggles.find(n=>n.tabIndex===0);i&&(i.tabIndex=-1),this.tabIndex=0}this.change.emit(new i7(this,this.value))}_markForCheck(){this._changeDetectorRef.markForCheck()}_getButtonName(){return this.isSingleSelector()?this.buttonToggleGroup.name:this.name||null}isSingleSelector(){return this.buttonToggleGroup&&!this.buttonToggleGroup.multiple}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-button-toggle"]],viewQuery:function(i,n){if(i&1&&Te(hzA,5),i&2){let o;XA(o=$A())&&(n._buttonElement=o.first)}},hostAttrs:["role","presentation",1,"mat-button-toggle"],hostVars:14,hostBindings:function(i,n){i&1&&hA("focus",function(){return n.focus()}),i&2&&(Ne("aria-label",null)("aria-labelledby",null)("id",n.id)("name",null),ue("mat-button-toggle-standalone",!n.buttonToggleGroup)("mat-button-toggle-checked",n.checked)("mat-button-toggle-disabled",n.disabled)("mat-button-toggle-disabled-interactive",n.disabledInteractive)("mat-button-toggle-appearance-standard",n.appearance==="standard"))},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],id:"id",name:"name",value:"value",tabIndex:"tabIndex",disableRipple:[2,"disableRipple","disableRipple",ie],appearance:"appearance",checked:[2,"checked","checked",ie],disabled:[2,"disabled","disabled",ie],disabledInteractive:[2,"disabledInteractive","disabledInteractive",ie]},outputs:{change:"change"},exportAs:["matButtonToggle"],ngContentSelectors:uzA,decls:7,vars:13,consts:[["button",""],["type","button",1,"mat-button-toggle-button","mat-focus-indicator",3,"click","id","disabled"],[1,"mat-button-toggle-checkbox-wrapper"],[1,"mat-button-toggle-label-content"],[1,"mat-button-toggle-focus-overlay"],["matRipple","",1,"mat-button-toggle-ripple",3,"matRippleTrigger","matRippleDisabled"],["state","checked","aria-hidden","true","appearance","minimal",3,"disabled"]],template:function(i,n){if(i&1){let o=be();jt(),S(0,"button",1,0),hA("click",function(){return RA(o),xA(n._onButtonClick())}),_A(2,fzA,2,1,"div",2),S(3,"span",3),Fe(4),F()(),JA(5,"span",4)(6,"span",5)}if(i&2){let o=cr(1);yA("id",n.buttonId)("disabled",n.disabled&&!n.disabledInteractive||null),Ne("role",n.isSingleSelector()?"radio":"button")("tabindex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex)("aria-pressed",n.isSingleSelector()?null:n.checked)("aria-checked",n.isSingleSelector()?n.checked:null)("name",n._getButtonName())("aria-label",n.ariaLabel)("aria-labelledby",n.ariaLabelledby)("aria-disabled",n.disabled&&n.disabledInteractive?"true":null),G(2),GA(n.buttonToggleGroup&&(!n.buttonToggleGroup.multiple&&!n.buttonToggleGroup.hideSingleSelectionIndicator||n.buttonToggleGroup.multiple&&!n.buttonToggleGroup.hideMultipleSelectionIndicator)?2:-1),G(4),yA("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)}},dependencies:[rs,wk],styles:[".mat-button-toggle-standalone,.mat-button-toggle-group{position:relative;display:inline-flex;flex-direction:row;white-space:nowrap;overflow:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0);transform:translateZ(0);border-radius:var(--mat-legacy-button-toggle-shape)}.mat-button-toggle-standalone:not([class*=mat-elevation-z]),.mat-button-toggle-group:not([class*=mat-elevation-z]){box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12)}@media(forced-colors: active){.mat-button-toggle-standalone,.mat-button-toggle-group{outline:solid 1px}}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{border-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border:solid 1px var(--mat-standard-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard .mat-pseudo-checkbox,.mat-button-toggle-group-appearance-standard .mat-pseudo-checkbox{--mat-minimal-pseudo-checkbox-selected-checkmark-color: var(--mat-standard-button-toggle-selected-state-text-color, var(--mat-sys-on-secondary-container))}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard:not([class*=mat-elevation-z]),.mat-button-toggle-group-appearance-standard:not([class*=mat-elevation-z]){box-shadow:none}@media(forced-colors: active){.mat-button-toggle-standalone.mat-button-toggle-appearance-standard,.mat-button-toggle-group-appearance-standard{outline:0}}.mat-button-toggle-vertical{flex-direction:column}.mat-button-toggle-vertical .mat-button-toggle-label-content{display:block}.mat-button-toggle{white-space:nowrap;position:relative;color:var(--mat-legacy-button-toggle-text-color);font-family:var(--mat-legacy-button-toggle-label-text-font);font-size:var(--mat-legacy-button-toggle-label-text-size);line-height:var(--mat-legacy-button-toggle-label-text-line-height);font-weight:var(--mat-legacy-button-toggle-label-text-weight);letter-spacing:var(--mat-legacy-button-toggle-label-text-tracking);--mat-minimal-pseudo-checkbox-selected-checkmark-color: var(--mat-legacy-button-toggle-selected-state-text-color)}.mat-button-toggle.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:var(--mat-legacy-button-toggle-focus-state-layer-opacity)}.mat-button-toggle .mat-icon svg{vertical-align:top}.mat-button-toggle-checkbox-wrapper{display:inline-block;justify-content:flex-start;align-items:center;width:0;height:18px;line-height:18px;overflow:hidden;box-sizing:border-box;position:absolute;top:50%;left:16px;transform:translate3d(0, -50%, 0)}[dir=rtl] .mat-button-toggle-checkbox-wrapper{left:auto;right:16px}.mat-button-toggle-appearance-standard .mat-button-toggle-checkbox-wrapper{left:12px}[dir=rtl] .mat-button-toggle-appearance-standard .mat-button-toggle-checkbox-wrapper{left:auto;right:12px}.mat-button-toggle-checked .mat-button-toggle-checkbox-wrapper{width:18px}.mat-button-toggle-animations-enabled .mat-button-toggle-checkbox-wrapper{transition:width 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-button-toggle-vertical .mat-button-toggle-checkbox-wrapper{transition:none}.mat-button-toggle-checked{color:var(--mat-legacy-button-toggle-selected-state-text-color);background-color:var(--mat-legacy-button-toggle-selected-state-background-color)}.mat-button-toggle-disabled{pointer-events:none;color:var(--mat-legacy-button-toggle-disabled-state-text-color);background-color:var(--mat-legacy-button-toggle-disabled-state-background-color);--mat-minimal-pseudo-checkbox-disabled-selected-checkmark-color: var(--mat-legacy-button-toggle-disabled-state-text-color)}.mat-button-toggle-disabled.mat-button-toggle-checked{background-color:var(--mat-legacy-button-toggle-disabled-selected-state-background-color)}.mat-button-toggle-disabled-interactive{pointer-events:auto}.mat-button-toggle-appearance-standard{color:var(--mat-standard-button-toggle-text-color, var(--mat-sys-on-surface));background-color:var(--mat-standard-button-toggle-background-color, transparent);font-family:var(--mat-standard-button-toggle-label-text-font, var(--mat-sys-label-large-font));font-size:var(--mat-standard-button-toggle-label-text-size, var(--mat-sys-label-large-size));line-height:var(--mat-standard-button-toggle-label-text-line-height, var(--mat-sys-label-large-line-height));font-weight:var(--mat-standard-button-toggle-label-text-weight, var(--mat-sys-label-large-weight));letter-spacing:var(--mat-standard-button-toggle-label-text-tracking, var(--mat-sys-label-large-tracking))}.mat-button-toggle-group-appearance-standard .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:solid 1px var(--mat-standard-button-toggle-divider-color, var(--mat-sys-outline))}[dir=rtl] .mat-button-toggle-group-appearance-standard .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:none;border-right:solid 1px var(--mat-standard-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle-appearance-standard+.mat-button-toggle-appearance-standard{border-left:none;border-right:none;border-top:solid 1px var(--mat-standard-button-toggle-divider-color, var(--mat-sys-outline))}.mat-button-toggle-appearance-standard.mat-button-toggle-checked{color:var(--mat-standard-button-toggle-selected-state-text-color, var(--mat-sys-on-secondary-container));background-color:var(--mat-standard-button-toggle-selected-state-background-color, var(--mat-sys-secondary-container))}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled{color:var(--mat-standard-button-toggle-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-standard-button-toggle-disabled-state-background-color, transparent)}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled .mat-pseudo-checkbox{--mat-minimal-pseudo-checkbox-disabled-selected-checkmark-color: var(--mat-standard-button-toggle-disabled-selected-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-button-toggle-appearance-standard.mat-button-toggle-disabled.mat-button-toggle-checked{color:var(--mat-standard-button-toggle-disabled-selected-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent));background-color:var(--mat-standard-button-toggle-disabled-selected-state-background-color, color-mix(in srgb, var(--mat-sys-on-surface) 12%, transparent))}.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{background-color:var(--mat-standard-button-toggle-state-layer-color, var(--mat-sys-on-surface))}.mat-button-toggle-appearance-standard:hover .mat-button-toggle-focus-overlay{opacity:var(--mat-standard-button-toggle-hover-state-layer-opacity, var(--mat-sys-hover-state-layer-opacity))}.mat-button-toggle-appearance-standard.cdk-keyboard-focused .mat-button-toggle-focus-overlay{opacity:var(--mat-standard-button-toggle-focus-state-layer-opacity, var(--mat-sys-focus-state-layer-opacity))}@media(hover: none){.mat-button-toggle-appearance-standard:hover .mat-button-toggle-focus-overlay{display:none}}.mat-button-toggle-label-content{-webkit-user-select:none;user-select:none;display:inline-block;padding:0 16px;line-height:var(--mat-legacy-button-toggle-height);position:relative}.mat-button-toggle-appearance-standard .mat-button-toggle-label-content{padding:0 12px;line-height:var(--mat-standard-button-toggle-height, 40px)}.mat-button-toggle-label-content>*{vertical-align:middle}.mat-button-toggle-focus-overlay{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:inherit;pointer-events:none;opacity:0;background-color:var(--mat-legacy-button-toggle-state-layer-color)}@media(forced-colors: active){.mat-button-toggle-checked .mat-button-toggle-focus-overlay{border-bottom:solid 500px;opacity:.5;height:0}.mat-button-toggle-checked:hover .mat-button-toggle-focus-overlay{opacity:.6}.mat-button-toggle-checked.mat-button-toggle-appearance-standard .mat-button-toggle-focus-overlay{border-bottom:solid 500px}}.mat-button-toggle .mat-button-toggle-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}.mat-button-toggle-button{border:0;background:none;color:inherit;padding:0;margin:0;font:inherit;outline:none;width:100%;cursor:pointer}.mat-button-toggle-animations-enabled .mat-button-toggle-button{transition:padding 150ms 45ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-button-toggle-vertical .mat-button-toggle-button{transition:none}.mat-button-toggle-disabled .mat-button-toggle-button{cursor:default}.mat-button-toggle-button::-moz-focus-inner{border:0}.mat-button-toggle-checked .mat-button-toggle-button:has(.mat-button-toggle-checkbox-wrapper){padding-left:30px}[dir=rtl] .mat-button-toggle-checked .mat-button-toggle-button:has(.mat-button-toggle-checkbox-wrapper){padding-left:0;padding-right:30px}.mat-button-toggle-standalone.mat-button-toggle-appearance-standard{--mat-focus-indicator-border-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}.mat-button-toggle-group-appearance-standard:not(.mat-button-toggle-vertical) .mat-button-toggle:last-of-type .mat-button-toggle-button::before{border-top-right-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border-bottom-right-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}.mat-button-toggle-group-appearance-standard:not(.mat-button-toggle-vertical) .mat-button-toggle:first-of-type .mat-button-toggle-button::before{border-top-left-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border-bottom-left-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle:last-of-type .mat-button-toggle-button::before{border-bottom-right-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border-bottom-left-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}.mat-button-toggle-group-appearance-standard.mat-button-toggle-vertical .mat-button-toggle:first-of-type .mat-button-toggle-button::before{border-top-right-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full));border-top-left-radius:var(--mat-standard-button-toggle-shape, var(--mat-sys-corner-full))}"],encapsulation:2,changeDetection:0})}return t})(),ScA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[it,Ps,n7,it]})}return t})();function DzA(t,e){t&1&&(S(0,"p"),AA(1,"Conversations"),F())}function yzA(t,e){t&1&&(S(0,"p"),AA(1,"Trace"),F())}function vzA(t,e){if(t&1){let A=be();S(0,"mat-button-toggle-group",5),da("ngModelChange",function(n){RA(A);let o=O(2);return Va(o.view,n)||(o.view=n),xA(n)}),S(1,"mat-button-toggle",6),AA(2,"Events"),F(),S(3,"mat-button-toggle",7),AA(4,"Trace"),F()()}if(t&2){let A=O(2);Ca("ngModel",A.view)}}function bzA(t,e){if(t&1){let A=be();S(0,"mat-list-item",8),hA("click",function(){let n=RA(A).$implicit,o=O(3);return xA(o.selectEvent(n.key))}),S(1,"span",9),AA(2),F(),S(3,"span",10),AA(4),F()()}if(t&2){let A=e.$implicit,i=e.$index;G(2),Gt(i),G(2),Gt(A.value.title)}}function MzA(t,e){if(t&1&&(S(0,"mat-list",4),Dn(1,bzA,5,2,"mat-list-item",null,to),Za(3,"keyvalue"),F()),t&2){let A=O(2);G(),yn(Lh(3,0,A.eventsMap,A.mapOrderPreservingSort))}}function kzA(t,e){if(t&1){let A=be();S(0,"mat-list-item",8),hA("click",function(){let n=RA(A).$implicit,o=O(3);return xA(o.openDialog(n.key))}),S(1,"span",9),AA(2),F(),S(3,"span"),AA(4),F()()}if(t&2){let A=e.$implicit,i=e.$index,n=O(3);G(2),Gt(i),G(2),Et("Invocation ",n.findInvocIdFromTraceId(A.key),"")}}function SzA(t,e){if(t&1&&(S(0,"mat-list",4),Dn(1,kzA,5,2,"mat-list-item",null,to),Za(3,"keyvalue"),F()),t&2){let A=O(2);G(),yn(Lh(3,0,A.invocTraces,A.mapOrderPreservingSort))}}function RzA(t,e){if(t&1&&(S(0,"div",1)(1,"div",2),_A(2,DzA,2,0,"p")(3,yzA,2,0,"p")(4,vzA,5,1,"mat-button-toggle-group",3),F(),_A(5,MzA,4,3,"mat-list",4)(6,SzA,4,3,"mat-list",4),F()),t&2){let A=O();G(2),GA(A.isTraceView()?-1:2),G(),GA(A.isTraceView()?3:-1),G(),GA(A.traceData?4:-1),G(),GA(A.isTraceView()?-1:5),G(),GA(A.isTraceView()?6:-1)}}function xzA(t,e){t&1&&(S(0,"div")(1,"p"),AA(2,"No conversations"),F()())}var nd=class t{constructor(e){this.dialog=e}eventsMap=new Map;selectedEvent=new WA;traceData=[];llmRequest=void 0;llmResponse=void 0;llmRequestKey="gcp.vertex.agent.llm_request";llmResponseKey="gcp.vertex.agent.llm_response";isDetailsPanelOpen=!1;view="events";invocTraces=new Map;ngOnChanges(e){"traceData"in e&&this.prcessTraceDataToInvocTrace()}showJson=Array(this.eventsMap.size).fill(!1);toggleJson(e){this.showJson[e]=!this.showJson[e]}selectEvent(e){this.selectedEvent.emit(e)}isTraceView(){return this.view=="trace"}mapOrderPreservingSort=(e,A)=>0;prcessTraceDataToInvocTrace(){!this.traceData||this.traceData.length==0||(this.invocTraces=this.traceData.reduce((e,A)=>{let i=A.trace_id,n=e.get(i);return n?(n.push(A),n.sort((o,r)=>o.start_time-r.start_time)):e.set(i,[A]),e},new Map))}findInvocIdFromTraceId(e){return this.invocTraces.get(e)?.find(i=>i.attributes!==void 0&&"gcp.vertex.agent.invocation_id"in i.attributes).attributes["gcp.vertex.agent.invocation_id"]}openDialog(e){let A=this.dialog.open(hf,{width:"auto",maxWidth:"90vw",data:{spans:this.invocTraces.get(e),invocId:this.findInvocIdFromTraceId(e)}})}static \u0275fac=function(A){return new(A||t)(PA(qs))};static \u0275cmp=zA({type:t,selectors:[["app-event-tab"]],inputs:{eventsMap:"eventsMap",traceData:"traceData"},outputs:{selectedEvent:"selectedEvent"},standalone:!1,features:[ti],decls:3,vars:2,consts:[[1,"events-wrapper"],[1,"events-container"],[1,"event-header"],["name","fontStyle","aria-label","Font Style",2,"scale","0.8",3,"ngModel"],[1,"event-list"],["name","fontStyle","aria-label","Font Style",2,"scale","0.8",3,"ngModelChange","ngModel"],["value","events"],["value","trace"],[3,"click"],[1,"event-index"],[1,"event-title"]],template:function(A,i){A&1&&(S(0,"div",0),_A(1,RzA,7,5,"div",1)(2,xzA,3,0,"div"),F()),A&2&&(G(),GA(i.eventsMap.size>0?1:-1),G(),GA(i.eventsMap.size==0?2:-1))},dependencies:[Ea,ec,ycA,vcA,_G,n7,Th],styles:[".events-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px;color:#9aa0a6;font-size:14px;font-weight:700}.event-index[_ngcontent-%COMP%]{color:#80868b;font-family:Roboto;font-size:14px;font-style:normal;font-weight:400;margin-right:10px}.event-title[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace}.spacer[_ngcontent-%COMP%]{flex:1 1 auto}.events-container[_ngcontent-%COMP%]{margin-top:20px}.event-container[_ngcontent-%COMP%]{display:flex;flex-direction:row;margin-top:20px}.function-event-button[_ngcontent-%COMP%]{margin-top:11px}.event-list[_ngcontent-%COMP%]{--mat-list-active-indicator-color: orange}.event-list[_ngcontent-%COMP%]{--mdc-list-list-item-container-color: #2b2b2f}.event-list[_ngcontent-%COMP%]{--mdc-list-list-item-label-text-size: 14px}.event-list[_ngcontent-%COMP%]{--mdc-list-list-item-label-text-weight: 400}.event-list[_ngcontent-%COMP%]{--mdc-list-list-item-one-line-container-height: 52px}[_nghost-%COMP%] .mdc-list-item{border:1px solid #5f6368;cursor:pointer}[_nghost-%COMP%] .mdc-list-item:hover{background-color:#1c1b1c}.event-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between}"]})};function FzA(t,e){t&1&&(S(0,"h2",0),AA(1,"Events List"),F())}function NzA(t,e){t&1&&(S(0,"h2",0),AA(1,"Send Response To Pending Event"),F())}function _zA(t,e){t&1&&(S(0,"h2",4),AA(1,"Events List"),F())}function GzA(t,e){t&1&&(S(0,"h2",4),AA(1,"Send Response To Pending Event"),F())}function UzA(t,e){if(t&1){let A=be();S(0,"div")(1,"p"),AA(2,"Name"),F(),S(3,"p"),AA(4),F(),S(5,"p"),AA(6,"Args"),F(),S(7,"p"),AA(8),F(),S(9,"mat-form-field",5)(10,"mat-label"),AA(11,"Response"),F(),S(12,"textarea",6),da("ngModelChange",function(n){RA(A);let o=O();return Va(o.selectedEvent.response,n)||(o.selectedEvent.response=n),xA(n)}),F()()()}if(t&2){let A=O();G(4),Gt(A.selectedEvent.name),G(4),Gt(A.argsToJson(A.selectedEvent.args)),G(4),Ca("ngModel",A.selectedEvent.response)}}function KzA(t,e){if(t&1){let A=be();S(0,"button",7),hA("click",function(){RA(A);let n=O();return xA(n.sendResponse())}),AA(1),F()}if(t&2){let A=O();yA("disabled",A.sending),G(),Et(" ",A.sending?"Sending...":"Send"," ")}}var uf=class t{constructor(e,A,i){this.dialogRef=e;this.data=A;this.agentService=i;this.selectedEvent=A.event,this.appName=A.appName,this.userId=A.userId,this.sessionId=A.sessionId,this.functionCallEventId=A.functionCallEventId}selectedEvent=null;appName;userId;sessionId;functionCallEventId;sending=!1;response=[];argsToJson(e){return JSON.stringify(e)}sendResponse(){this.sending=!0;let e={appName:this.appName,userId:this.userId,sessionId:this.sessionId,newMessage:{role:"user",parts:[]}};this.selectedEvent.response&&(e.functionCallEventId=this.functionCallEventId,e.newMessage.parts.push({function_response:{id:this.selectedEvent.id,name:this.selectedEvent.name,response:{response:this.selectedEvent.response}}})),this.agentService.runSse(e).subscribe({next:A=>Ao(this,null,function*(){let i=JSON.parse(A);this.response.push(i)}),error:A=>console.error("SSE error:",A),complete:()=>{this.sending=!1,this.dialogRef.close({response:this.response,events:[this.selectedEvent]})}})}static \u0275fac=function(A){return new(A||t)(PA(Br),PA(as),PA(H2))};static \u0275cmp=zA({type:t,selectors:[["app-pending-event-dialog"]],standalone:!1,decls:10,vars:6,consts:[["mat-dialog-title",""],["mat-dialog-title","","class","dialog-title",4,"ngIf"],["mat-button","",3,"disabled"],["mat-button","","mat-dialog-close",""],["mat-dialog-title","",1,"dialog-title"],["appearance","outline",1,"response-textarea"],["matInput","",3,"ngModelChange","ngModel"],["mat-button","",3,"click","disabled"]],template:function(A,i){A&1&&(_A(0,FzA,2,0,"h2",0)(1,NzA,2,0,"h2",0)(2,_zA,2,0,"h2",1)(3,GzA,2,0,"h2",1),S(4,"mat-dialog-content"),_A(5,UzA,13,3,"div"),F(),S(6,"mat-dialog-actions"),_A(7,KzA,2,2,"button",2),S(8,"button",3),AA(9,"Close"),F()()),A&2&&(GA(i.selectedEvent?-1:0),G(),GA(i.selectedEvent?1:-1),G(),yA("ngIf",!i.selectedEvent),G(),yA("ngIf",i.selectedEvent),G(2),GA(i.selectedEvent?5:-1),G(2),GA(i.selectedEvent&&i.selectedEvent.response?7:-1))},dependencies:[Uh,vc,Ea,ec,Qg,Q8,iI,Dr,bs,ma,pa,hg],styles:[".response-textarea[_ngcontent-%COMP%]{min-width:500px;margin-top:15px}.dialog-title[_ngcontent-%COMP%]{font-weight:700;font-size:large}"]})};var SQ=class t{constructor(e,A){this.dialogRef=e;this.data=A}onConfirm(){this.dialogRef.close(!0)}onCancel(){this.dialogRef.close(!1)}static \u0275fac=function(A){return new(A||t)(PA(Br),PA(as))};static \u0275cmp=zA({type:t,selectors:[["app-delete-session-dialog"]],standalone:!1,decls:11,vars:4,consts:[[1,"confirm-delete-wrapper"],["mat-dialog-title",""],["align","end"],["mat-button","",3,"click"],["mat-button","","cdkFocusInitial","",3,"click"]],template:function(A,i){A&1&&(S(0,"div",0)(1,"h2",1),AA(2),F(),S(3,"mat-dialog-content")(4,"p"),AA(5),F()(),S(6,"mat-dialog-actions",2)(7,"button",3),hA("click",function(){return i.onCancel()}),AA(8),F(),S(9,"button",4),hA("click",function(){return i.onConfirm()}),AA(10),F()()()),A&2&&(G(2),Gt(i.data.title),G(3),Gt(i.data.message),G(3),Gt(i.data.cancelButtonText),G(2),Gt(i.data.confirmButtonText))},dependencies:[Dr,bs,ma,pa],encapsulation:2})};function YzA(t,e){if(t&1){let A=be();S(0,"div",3),hA("click",function(){let n=RA(A).$implicit,o=O();return xA(o.getSession(n.id))}),S(1,"div",4)(2,"div",5),AA(3),F(),S(4,"div",6),AA(5),F()()()}if(t&2){let A=e.$implicit,i=O();yA("ngClass",A.id===i.sessionId?"session-item current":"session-item"),G(3),Et(" ",A.id," "),G(2),Et(" ",i.getDate(A)," ")}}var od=class t{constructor(e,A){this.sessionService=e;this.dialog=A;this.refreshSessionsSubject.pipe(jn(()=>this.sessionService.listSessions(this.userId,this.appName))).subscribe(i=>{i=i.sort((n,o)=>Number(o.lastUpdateTime)-Number(n.lastUpdateTime)),this.sessionList=i})}userId="";appName="";sessionId="";sessionSelected=new WA;sessionReloaded=new WA;sessionList=[];refreshSessionsSubject=new OA;ngOnInit(){setTimeout(()=>{this.refreshSessionsSubject.next()},500)}getSession(e){this.sessionService.getSession(this.userId,this.appName,e).subscribe(A=>{let i=this.fromApiResultToSession(A);this.sessionSelected.emit(i)})}getDate(e){let A=e.lastUpdateTime;return new Date(A*1e3).toLocaleString()}fromApiResultToSession(e){return{id:e?.id??"",appName:e?.appName??"",userId:e?.userId??"",state:e?.state??[],events:e?.events??[]}}reloadSession(e){this.sessionService.getSession(this.userId,this.appName,e).subscribe(A=>{let i=this.fromApiResultToSession(A);this.sessionReloaded.emit(i)})}refreshSession(e){if(this.refreshSessionsSubject.next(),!(this.sessionList.length<=1)){let A=this.sessionList.findIndex(i=>i.id==e);return A==this.sessionList.length-1&&(A=-1),this.sessionList[A+1]}}static \u0275fac=function(A){return new(A||t)(PA(Wg),PA(qs))};static \u0275cmp=zA({type:t,selectors:[["app-session-tab"]],inputs:{userId:"userId",appName:"appName",sessionId:"sessionId"},outputs:{sessionSelected:"sessionSelected",sessionReloaded:"sessionReloaded"},standalone:!1,decls:4,vars:0,consts:[[1,"session-wrapper"],[1,"session-tab-container",2,"margin-top","16px"],[3,"ngClass"],[3,"click","ngClass"],[1,"session-info"],[1,"session-id"],[1,"session-date"]],template:function(A,i){A&1&&(S(0,"div",0)(1,"div",1),Dn(2,YzA,6,3,"div",2,to),F()()),A&2&&(G(2),yn(i.sessionList))},dependencies:[Xa],styles:[".session-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px;color:#9aa0a6;font-size:14px;font-weight:700}.session-item[_ngcontent-%COMP%]{display:flex;justify-content:space-between;border:none;background-color:#303030;border-radius:8px;margin-bottom:4px;cursor:pointer}.session-item[_ngcontent-%COMP%]:hover{background-color:#141414}.session-item.current[_ngcontent-%COMP%]{background-color:#004a77}.session-id[_ngcontent-%COMP%]{color:#e8eaed;font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:.25px}.session-date[_ngcontent-%COMP%]{color:#9aa0a6;font-family:Roboto;font-size:12px;font-style:normal;font-weight:400;line-height:16px;letter-spacing:.3px}.session-info[_ngcontent-%COMP%]{padding:11px}"]})};var RQ=class t{constructor(e){this.http=e}apiServerDomain=vs.getApiServerBaseUrl();getLatestArtifact(e,A,i,n){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}/artifacts/${n}`;return this.http.get(o)}getArtifactVersion(e,A,i,n,o){let r=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}/artifacts/${n}/versions/${o}`;return this.http.get(r)}static \u0275fac=function(A){return new(A||t)(we(Ds))};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})};var HzA={url:"",deserializer:t=>JSON.parse(t.data),serializer:t=>JSON.stringify(t)},zzA="WebSocketSubject.error must be called with an object with an error code, and an optional reason: { code: number, reason: string }",ff=class t extends md{constructor(e,A){if(super(),this._socket=null,e instanceof ct)this.destination=A,this.source=e;else{let i=this._config=Object.assign({},HzA);if(this._output=new OA,typeof e=="string")i.url=e;else for(let n in e)e.hasOwnProperty(n)&&(i[n]=e[n]);if(!i.WebSocketCtor&&WebSocket)i.WebSocketCtor=WebSocket;else if(!i.WebSocketCtor)throw new Error("no WebSocket constructor can be found");this.destination=new Al}}lift(e){let A=new t(this._config,this.destination);return A.operator=e,A.source=this,A}_resetState(){this._socket=null,this.source||(this.destination=new Al),this._output=new OA}multiplex(e,A,i){let n=this;return new ct(o=>{try{n.next(e())}catch(s){o.error(s)}let r=n.subscribe({next:s=>{try{i(s)&&o.next(s)}catch(a){o.error(a)}},error:s=>o.error(s),complete:()=>o.complete()});return()=>{try{n.next(A())}catch(s){o.error(s)}r.unsubscribe()}})}_connectSocket(){let{WebSocketCtor:e,protocol:A,url:i,binaryType:n}=this._config,o=this._output,r=null;try{r=A?new e(i,A):new e(i),this._socket=r,n&&(this._socket.binaryType=n)}catch(a){o.error(a);return}let s=new Kt(()=>{this._socket=null,r&&r.readyState===1&&r.close()});r.onopen=a=>{let{_socket:c}=this;if(!c){r.close(),this._resetState();return}let{openObserver:l}=this._config;l&&l.next(a);let I=this.destination;this.destination=o0.create(C=>{if(r.readyState===1)try{let{serializer:d}=this._config;r.send(d(C))}catch(d){this.destination.error(d)}},C=>{let{closingObserver:d}=this._config;d&&d.next(void 0),C&&C.code?r.close(C.code,C.reason):o.error(new TypeError(zzA)),this._resetState()},()=>{let{closingObserver:C}=this._config;C&&C.next(void 0),r.close(),this._resetState()}),I&&I instanceof Al&&s.add(I.subscribe(this.destination))},r.onerror=a=>{this._resetState(),o.error(a)},r.onclose=a=>{r===this._socket&&this._resetState();let{closeObserver:c}=this._config;c&&c.next(a),a.wasClean?o.complete():o.error(a)},r.onmessage=a=>{try{let{deserializer:c}=this._config;o.next(c(a))}catch(c){o.error(c)}}}_subscribe(e){let{source:A}=this;return A?A.subscribe(e):(this._socket||this._connectSocket(),this._output.subscribe(e),e.add(()=>{let{_socket:i}=this;this._output.observers.length===0&&(i&&(i.readyState===1||i.readyState===0)&&i.close(),this._resetState())}),e)}unsubscribe(){let{_socket:e}=this;e&&(e.readyState===1||e.readyState===0)&&e.close(),this._resetState(),super.unsubscribe()}};var Xg=class t{socket$;messages$=new Mi("");audioContext=new AudioContext({sampleRate:22e3});audioBuffer=[];audioIntervalId=null;lastAudioTime=0;closeReasonSubject=new OA;constructor(){}connect(e){this.socket$=new ff({url:e,serializer:A=>JSON.stringify(A),deserializer:A=>A.data,closeObserver:{next:A=>{this.emitWsCloseReason(A.reason)}}}),this.socket$.subscribe(A=>{this.handleIncomingAudio(A),this.messages$.next(A)},A=>{console.error("WebSocket error:",A)}),this.audioIntervalId=setInterval(()=>this.processBufferedAudio(),250)}sendMessage(e){if(e.blob.data=this.arrayBufferToBase64(e.blob.data.buffer),!this.socket$||this.socket$.closed){console.error("WebSocket is not open.");return}this.socket$.next(e)}closeConnection(){clearInterval(this.audioIntervalId),this.audioIntervalId=null,this.socket$&&this.socket$.complete()}getMessages(){return this.messages$.asObservable()}arrayBufferToBase64(e){let A="",i=new Uint8Array(e),n=i.byteLength;for(let o=0;on+o.length,0),A=new Uint8Array(e),i=0;for(let n of this.audioBuffer)A.set(n,i),i+=n.length;this.playPCM(A),this.audioBuffer=[]}base64ToUint8Array(e){let A=atob(this.urlSafeBase64ToBase64(e)),i=A.length,n=new Uint8Array(i);for(let o=0;o=32768&&(a-=65536),A[s]=a/32768}let i=this.audioContext.createBuffer(1,A.length,22e3);i.copyToChannel(A,0);let n=this.audioContext.createBufferSource();n.buffer=i,n.connect(this.audioContext.destination);let o=this.audioContext.currentTime,r=Math.max(this.lastAudioTime,o);n.start(r),this.lastAudioTime=r+i.duration}urlSafeBase64ToBase64(e){let A=e.replace(/_/g,"/").replace(/-/g,"+");for(;A.length%4!==0;)A+="=";return A}emitWsCloseReason(e){this.closeReasonSubject.next(e)}onCloseReason(){return this.closeReasonSubject.asObservable()}static \u0275fac=function(A){return new(A||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})};var xQ=class t{constructor(e){this.wsService=e}mediaRecorder;stream;audioContext;source;processor;audioBuffer=[];audioIntervalId=null;startRecording(){return Ao(this,null,function*(){try{this.stream=yield navigator.mediaDevices.getUserMedia({audio:!0}),this.audioContext=new AudioContext,yield this.audioContext.audioWorklet.addModule("./assets/audio-processor.js"),this.source=this.audioContext.createMediaStreamSource(this.stream);let e=new AudioWorkletNode(this.audioContext,"audio-processor");e.port.onmessage=A=>{let i=A.data,n=this.float32ToPCM(i);this.audioBuffer.push(n)},this.source.connect(e),e.connect(this.audioContext.destination),this.audioIntervalId=setInterval(()=>this.sendBufferedAudio(),250)}catch(e){console.error("Error accessing microphone:",e)}})}sendBufferedAudio(){if(this.audioBuffer.length===0)return;let e=this.audioBuffer.reduce((o,r)=>o+r.length,0),A=new Uint8Array(e),i=0;for(let o of this.audioBuffer)A.set(o,i),i+=o.length;let n={blob:{mime_type:"audio/pcm",data:A}};this.wsService.sendMessage(n),this.audioBuffer=[]}stopRecording(){this.processor&&this.processor.disconnect(),this.source&&this.source.disconnect(),this.audioContext&&this.audioContext.close(),this.stream&&this.stream.getTracks().forEach(e=>e.stop()),this.audioIntervalId&&(clearInterval(this.audioIntervalId),this.audioIntervalId=null)}float32ToPCM(e){let A=new ArrayBuffer(e.length*2),i=new DataView(A);for(let n=0;nthis.captureAndSendFrame(),1e3)}catch(A){console.error("Error accessing camera/microphone:",A)}})}captureAndSendFrame(){return Ao(this,null,function*(){try{let e=yield this.captureFrame(),i={blob:{mime_type:"image/jpeg",data:yield this.blobToUint8Array(e)}};this.wsService.sendMessage(i)}catch(e){console.error("Error capturing frame:",e)}})}blobToUint8Array(e){return Ao(this,null,function*(){let A=yield e.arrayBuffer();return new Uint8Array(A)})}captureFrame(){return Ao(this,null,function*(){return new Promise((e,A)=>{try{let i=document.createElement("canvas");i.width=this.videoElement.videoWidth,i.height=this.videoElement.videoHeight;let n=i.getContext("2d");if(!n){A(new Error("Canvas context not supported"));return}n.drawImage(this.videoElement,0,0,i.width,i.height),i.toBlob(o=>{o?e(o):A(new Error("Failed to create image blob"))},"image/png")}catch(i){A(i)}})})}sendBufferedVideo(){if(this.videoBuffer.length===0)return;let e=this.videoBuffer.reduce((o,r)=>o+r.length,0),A=new Uint8Array(e),i=0;for(let o of this.videoBuffer)A.set(o,i),i+=o.length;let n={blob:{mime_type:"image/jpeg",data:A}};this.wsService.sendMessage(n),this.videoBuffer=[]}stopRecording(e){this.mediaRecorder&&this.mediaRecorder.stop(),this.stream&&this.stream.getTracks().forEach(A=>A.stop()),clearInterval(this.videoIntervalId),this.clearVideoElement(e)}clearVideoElement(e){let A=e.nativeElement.querySelector("video");A&&this.renderer.removeChild(e.nativeElement,A)}static \u0275fac=function(A){return new(A||t)(we(Xg),we(ws))};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})};var nI=class t{constructor(e){this.http=e}apiServerDomain=vs.getApiServerBaseUrl();getEventTrace(e){let A=this.apiServerDomain+`/debug/trace/${e}`;return this.http.get(A)}getTrace(e){let A=this.apiServerDomain+`/debug/trace/session/${e}`;return this.http.get(A)}getEvent(e,A,i,n){let o=this.apiServerDomain+`/apps/${A}/users/${e}/sessions/${i}/events/${n}/graph`;return this.http.get(o)}static \u0275fac=function(A){return new(A||t)(we(Ds))};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})};var $g=class t{selectedTraceRowSource=new Mi(void 0);selectedTraceRow$=this.selectedTraceRowSource.asObservable();eventDataSource=new Mi(void 0);eventData$=this.eventDataSource.asObservable();hoveredMessageIndiciesSource=new Mi([]);hoveredMessageIndicies$=this.hoveredMessageIndiciesSource.asObservable();messagesSource=new Mi([]);messages$=this.messagesSource.asObservable();selectedRow(e){this.selectedTraceRowSource.next(e)}setEventData(e){this.eventDataSource.next(e)}setMessages(e){this.messagesSource.next(e)}setHoveredMessages(e,A){if(!e){this.hoveredMessageIndiciesSource.next([]);return}let i=e.attributes,n=i&&i["gcp.vertex.agent.event_id"],o=0,r=[];for(let s of this.messagesSource.value){if(s.role=="user"){o++;continue}if(this.eventDataSource.value?.get(s.eventId).invocationId!=A){o++;continue}if(n)if(i["gcp.vertex.agent.event_id"]==s.eventId){r.push(o),o++;continue}else{o++;continue}else{r.push(o),o++;continue}}this.hoveredMessageIndiciesSource.next(r)}resetTraceService(){this.eventDataSource.next(void 0),this.messagesSource.next([]),this.hoveredMessageIndiciesSource.next([])}static \u0275fac=function(A){return new(A||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac,providedIn:"root"})};var jzA=["*"];var qzA=new dA("MAT_CARD_CONFIG"),xcA=(()=>{class t{appearance;constructor(){let A=f(qzA,{optional:!0});this.appearance=A?.appearance||"raised"}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-card"]],hostAttrs:[1,"mat-mdc-card","mdc-card"],hostVars:4,hostBindings:function(i,n){i&2&&ue("mat-mdc-card-outlined",n.appearance==="outlined")("mdc-card--outlined",n.appearance==="outlined")},inputs:{appearance:"appearance"},exportAs:["matCard"],ngContentSelectors:jzA,decls:1,vars:0,template:function(i,n){i&1&&(jt(),Fe(0))},styles:['.mat-mdc-card{display:flex;flex-direction:column;box-sizing:border-box;position:relative;border-style:solid;border-width:0;background-color:var(--mdc-elevated-card-container-color, var(--mat-sys-surface-container-low));border-color:var(--mdc-elevated-card-container-color, var(--mat-sys-surface-container-low));border-radius:var(--mdc-elevated-card-container-shape, var(--mat-sys-corner-medium));box-shadow:var(--mdc-elevated-card-container-elevation, var(--mat-sys-level1))}.mat-mdc-card::after{position:absolute;top:0;left:0;width:100%;height:100%;border:solid 1px rgba(0,0,0,0);content:"";display:block;pointer-events:none;box-sizing:border-box;border-radius:var(--mdc-elevated-card-container-shape, var(--mat-sys-corner-medium))}.mat-mdc-card-outlined{background-color:var(--mdc-outlined-card-container-color, var(--mat-sys-surface));border-radius:var(--mdc-outlined-card-container-shape, var(--mat-sys-corner-medium));border-width:var(--mdc-outlined-card-outline-width, 1px);border-color:var(--mdc-outlined-card-outline-color, var(--mat-sys-outline-variant));box-shadow:var(--mdc-outlined-card-container-elevation, var(--mat-sys-level0))}.mat-mdc-card-outlined::after{border:none}.mdc-card__media{position:relative;box-sizing:border-box;background-repeat:no-repeat;background-position:center;background-size:cover}.mdc-card__media::before{display:block;content:""}.mdc-card__media:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.mdc-card__media:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.mat-mdc-card-actions{display:flex;flex-direction:row;align-items:center;box-sizing:border-box;min-height:52px;padding:8px}.mat-mdc-card-title{font-family:var(--mat-card-title-text-font, var(--mat-sys-title-large-font));line-height:var(--mat-card-title-text-line-height, var(--mat-sys-title-large-line-height));font-size:var(--mat-card-title-text-size, var(--mat-sys-title-large-size));letter-spacing:var(--mat-card-title-text-tracking, var(--mat-sys-title-large-tracking));font-weight:var(--mat-card-title-text-weight, var(--mat-sys-title-large-weight))}.mat-mdc-card-subtitle{color:var(--mat-card-subtitle-text-color, var(--mat-sys-on-surface));font-family:var(--mat-card-subtitle-text-font, var(--mat-sys-title-medium-font));line-height:var(--mat-card-subtitle-text-line-height, var(--mat-sys-title-medium-line-height));font-size:var(--mat-card-subtitle-text-size, var(--mat-sys-title-medium-size));letter-spacing:var(--mat-card-subtitle-text-tracking, var(--mat-sys-title-medium-tracking));font-weight:var(--mat-card-subtitle-text-weight, var(--mat-sys-title-medium-weight))}.mat-mdc-card-title,.mat-mdc-card-subtitle{display:block;margin:0}.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-title,.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-subtitle{padding:16px 16px 0}.mat-mdc-card-header{display:flex;padding:16px 16px 0}.mat-mdc-card-content{display:block;padding:0 16px}.mat-mdc-card-content:first-child{padding-top:16px}.mat-mdc-card-content:last-child{padding-bottom:16px}.mat-mdc-card-title-group{display:flex;justify-content:space-between;width:100%}.mat-mdc-card-avatar{height:40px;width:40px;border-radius:50%;flex-shrink:0;margin-bottom:16px;object-fit:cover}.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-subtitle,.mat-mdc-card-avatar~.mat-mdc-card-header-text .mat-mdc-card-title{line-height:normal}.mat-mdc-card-sm-image{width:80px;height:80px}.mat-mdc-card-md-image{width:112px;height:112px}.mat-mdc-card-lg-image{width:152px;height:152px}.mat-mdc-card-xl-image{width:240px;height:240px}.mat-mdc-card-subtitle~.mat-mdc-card-title,.mat-mdc-card-title~.mat-mdc-card-subtitle,.mat-mdc-card-header .mat-mdc-card-header-text .mat-mdc-card-title,.mat-mdc-card-header .mat-mdc-card-header-text .mat-mdc-card-subtitle,.mat-mdc-card-title-group .mat-mdc-card-title,.mat-mdc-card-title-group .mat-mdc-card-subtitle{padding-top:0}.mat-mdc-card-content>:last-child:not(.mat-mdc-card-footer){margin-bottom:0}.mat-mdc-card-actions-align-end{justify-content:flex-end}'],encapsulation:2,changeDetection:0})}return t})();var LcA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[it,it]})}return t})();var ZzA=t=>["segment",t],WzA=(t,e)=>({"segment-main":!0,expandable:t,expanded:e});function XzA(t,e){t&1&&JA(0,"div",9)}function $zA(t,e){if(t&1&&(S(0,"span",10),AA(1),F()),t&2){let A=O().$implicit;G(),Gt(A.description)}}function AOA(t,e){if(t&1&&(S(0,"section",11),JA(1,"ngx-json-viewer",12),F()),t&2){let A=O().$implicit,i=O();G(),yA("json",A.value)("expanded",i.expanded)("depth",i.depth)("_currentDepth",i._currentDepth+1)}}function eOA(t,e){if(t&1){let A=be();S(0,"section",2)(1,"section",3),hA("click",function(){let n=RA(A).$implicit,o=O();return xA(o.toggle(n))}),_A(2,XzA,1,0,"div",4),S(3,"span",5),AA(4),F(),S(5,"span",6),AA(6,": "),F(),_A(7,$zA,2,1,"span",7),F(),_A(8,AOA,2,4,"section",8),F()}if(t&2){let A=e.$implicit,i=O();yA("ngClass",qr(6,ZzA,"segment-type-"+A.type)),G(),yA("ngClass",b2(8,WzA,i.isExpandable(A),A.expanded)),G(),yA("ngIf",i.isExpandable(A)),G(2),Gt(A.key),G(3),yA("ngIf",!A.expanded||!i.isExpandable(A)),G(),yA("ngIf",A.expanded&&i.isExpandable(A))}}var FQ=(()=>{class t{constructor(){this.expanded=!0,this.depth=-1,this._currentDepth=0,this.segments=[]}ngOnChanges(){this.segments=[],this.json=this.decycle(this.json),typeof this.json=="object"?Object.keys(this.json).forEach(A=>{this.segments.push(this.parseKeyValue(A,this.json[A]))}):this.segments.push(this.parseKeyValue(`(${typeof this.json})`,this.json))}isExpandable(A){return A.type==="object"||A.type==="array"}toggle(A){this.isExpandable(A)&&(A.expanded=!A.expanded)}parseKeyValue(A,i){let n={key:A,value:i,type:void 0,description:""+i,expanded:this.isExpanded()};switch(typeof n.value){case"number":{n.type="number";break}case"boolean":{n.type="boolean";break}case"function":{n.type="function";break}case"string":{n.type="string",n.description='"'+n.value+'"';break}case"undefined":{n.type="undefined",n.description="undefined";break}case"object":{n.value===null?(n.type="null",n.description="null"):Array.isArray(n.value)?(n.type="array",n.description="Array["+n.value.length+"] "+JSON.stringify(n.value)):n.value instanceof Date?n.type="date":(n.type="object",n.description="Object "+JSON.stringify(n.value));break}}return n}isExpanded(){return this.expanded&&!(this.depth>-1&&this._currentDepth>=this.depth)}decycle(A){let i=new WeakMap;return function n(o,r){let s,a;return typeof o=="object"&&o!==null&&!(o instanceof Boolean)&&!(o instanceof Date)&&!(o instanceof Number)&&!(o instanceof RegExp)&&!(o instanceof String)?(s=i.get(o),s!==void 0?{$ref:s}:(i.set(o,r),Array.isArray(o)?(a=[],o.forEach(function(c,l){a[l]=n(c,r+"["+l+"]")})):(a={},Object.keys(o).forEach(function(c){a[c]=n(o[c],r+"["+JSON.stringify(c)+"]")})),a)):o}(A,"$")}}return t.\u0275fac=function(A){return new(A||t)},t.\u0275cmp=zA({type:t,selectors:[["ngx-json-viewer"]],inputs:{json:"json",expanded:"expanded",depth:"depth",_currentDepth:"_currentDepth"},standalone:!1,features:[ti],decls:2,vars:1,consts:[[1,"ngx-json-viewer"],[3,"ngClass",4,"ngFor","ngForOf"],[3,"ngClass"],[3,"click","ngClass"],["class","toggler",4,"ngIf"],[1,"segment-key"],[1,"segment-separator"],["class","segment-value",4,"ngIf"],["class","children",4,"ngIf"],[1,"toggler"],[1,"segment-value"],[1,"children"],[3,"json","expanded","depth","_currentDepth"]],template:function(A,i){A&1&&(S(0,"section",0),_A(1,eOA,9,11,"section",1),F()),A&2&&(G(),yA("ngForOf",i.segments))},dependencies:[Xa,Hp,Uh,t],styles:['@charset "UTF-8";.ngx-json-viewer[_ngcontent-%COMP%]{font-family:var(--ngx-json-font-family, monospace);font-size:var(--ngx-json-font-size, 1em);width:100%;height:100%;overflow:hidden;position:relative}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%]{padding:2px;margin:1px 1px 1px 12px}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%]{word-wrap:break-word}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .toggler[_ngcontent-%COMP%]{position:absolute;margin-left:-14px;margin-top:3px;font-size:.8em;line-height:1.2em;vertical-align:middle;color:var(--ngx-json-toggler, #787878)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .toggler[_ngcontent-%COMP%]:after{display:inline-block;content:"\\25ba";transition:transform .1s ease-in}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .segment-key[_ngcontent-%COMP%]{color:var(--ngx-json-key, #4E187C)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .segment-separator[_ngcontent-%COMP%]{color:var(--ngx-json-separator, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .segment-main[_ngcontent-%COMP%] .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-value, #000)}.ngx-json-viewer[_ngcontent-%COMP%] .segment[_ngcontent-%COMP%] .children[_ngcontent-%COMP%]{margin-left:12px}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-string[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-string, #FF6B6B)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-number[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-number, #009688)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-boolean[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-boolean, #B938A4)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-date[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-date, #05668D)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-array[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-array, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-object[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-object, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-function[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-function, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-null[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-null, #fff)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-undefined[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{color:var(--ngx-json-undefined, #fff)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-null[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{background-color:var(--ngx-json-null-bg, red)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-undefined[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-key[_ngcontent-%COMP%]{color:var(--ngx-json-undefined-key, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-undefined[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%] > .segment-value[_ngcontent-%COMP%]{background-color:var(--ngx-json-undefined-key, #999)}.ngx-json-viewer[_ngcontent-%COMP%] .segment-type-object[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%], .ngx-json-viewer[_ngcontent-%COMP%] .segment-type-array[_ngcontent-%COMP%] > .segment-main[_ngcontent-%COMP%]{white-space:nowrap}.ngx-json-viewer[_ngcontent-%COMP%] .expanded[_ngcontent-%COMP%] > .toggler[_ngcontent-%COMP%]:after{transform:rotate(90deg)}.ngx-json-viewer[_ngcontent-%COMP%] .expandable[_ngcontent-%COMP%], .ngx-json-viewer[_ngcontent-%COMP%] .expandable[_ngcontent-%COMP%] > .toggler[_ngcontent-%COMP%]{cursor:pointer}']}),t})(),FcA=(()=>{class t{}return t.\u0275fac=function(A){return new(A||t)},t.\u0275mod=Ce({type:t}),t.\u0275inj=Ie({imports:[f0]}),t})();var NcA=["*"],tOA=["content"],iOA=[[["mat-drawer"]],[["mat-drawer-content"]],"*"],nOA=["mat-drawer","mat-drawer-content","*"];function oOA(t,e){if(t&1){let A=be();S(0,"div",1),hA("click",function(){RA(A);let n=O();return xA(n._onBackdropClicked())}),F()}if(t&2){let A=O();ue("mat-drawer-shown",A._isShowingBackdrop())}}function rOA(t,e){t&1&&(S(0,"mat-drawer-content"),Fe(1,2),F())}var sOA=new dA("MAT_DRAWER_DEFAULT_AUTOSIZE",{providedIn:"root",factory:aOA}),_cA=new dA("MAT_DRAWER_CONTAINER");function aOA(){return!1}var YG=(()=>{class t extends D0{_platform=f(Ii);_changeDetectorRef=f(It);_container=f(TG);constructor(){let A=f(ee),i=f(Y2),n=f(Qe);super(A,i,n)}ngAfterContentInit(){this._container._contentMarginChanges.subscribe(()=>{this._changeDetectorRef.markForCheck()})}_shouldBeHidden(){if(this._platform.isBrowser)return!1;let{start:A,end:i}=this._container;return A!=null&&A.mode!=="over"&&A.opened||i!=null&&i.mode!=="over"&&i.opened}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-drawer-content"]],hostAttrs:[1,"mat-drawer-content"],hostVars:6,hostBindings:function(i,n){i&2&&(uo("margin-left",n._container._contentMargins.left,"px")("margin-right",n._container._contentMargins.right,"px"),ue("mat-drawer-content-hidden",n._shouldBeHidden()))},features:[ht([{provide:D0,useExisting:t}]),lt],ngContentSelectors:NcA,decls:1,vars:0,template:function(i,n){i&1&&(jt(),Fe(0))},encapsulation:2,changeDetection:0})}return t})(),JG=(()=>{class t{_elementRef=f(ee);_focusTrapFactory=f(n8);_focusMonitor=f(dr);_platform=f(Ii);_ngZone=f(Qe);_renderer=f(Wi);_interactivityChecker=f(Mu);_doc=f(at,{optional:!0});_container=f(_cA,{optional:!0});_focusTrap=null;_elementFocusedBeforeDrawerWasOpened=null;_eventCleanups;_isAttached;_anchor;get position(){return this._position}set position(A){A=A==="end"?"end":"start",A!==this._position&&(this._isAttached&&this._updatePositionInParent(A),this._position=A,this.onPositionChanged.emit())}_position="start";get mode(){return this._mode}set mode(A){this._mode=A,this._updateFocusTrapState(),this._modeChanged.next()}_mode="over";get disableClose(){return this._disableClose}set disableClose(A){this._disableClose=Xo(A)}_disableClose=!1;get autoFocus(){let A=this._autoFocus;return A??(this.mode==="side"?"dialog":"first-tabbable")}set autoFocus(A){(A==="true"||A==="false"||A==null)&&(A=Xo(A)),this._autoFocus=A}_autoFocus;get opened(){return this._opened}set opened(A){this.toggle(Xo(A))}_opened=!1;_openedVia;_animationStarted=new OA;_animationEnd=new OA;openedChange=new WA(!0);_openedStream=this.openedChange.pipe(kt(A=>A),je(()=>{}));openedStart=this._animationStarted.pipe(kt(()=>this.opened),vd(void 0));_closedStream=this.openedChange.pipe(kt(A=>!A),je(()=>{}));closedStart=this._animationStarted.pipe(kt(()=>!this.opened),vd(void 0));_destroyed=new OA;onPositionChanged=new WA;_content;_modeChanged=new OA;_injector=f(Rt);_changeDetectorRef=f(It);constructor(){this.openedChange.pipe(St(this._destroyed)).subscribe(A=>{A?(this._doc&&(this._elementFocusedBeforeDrawerWasOpened=this._doc.activeElement),this._takeFocus()):this._isFocusWithinDrawer()&&this._restoreFocus(this._openedVia||"program")}),this._ngZone.runOutsideAngular(()=>{let A=this._elementRef.nativeElement;oh(A,"keydown").pipe(kt(i=>i.keyCode===27&&!this.disableClose&&!ir(i)),St(this._destroyed)).subscribe(i=>this._ngZone.run(()=>{this.close(),i.stopPropagation(),i.preventDefault()})),this._eventCleanups=[this._renderer.listen(A,"transitionrun",this._handleTransitionEvent),this._renderer.listen(A,"transitionend",this._handleTransitionEvent),this._renderer.listen(A,"transitioncancel",this._handleTransitionEvent)]}),this._animationEnd.subscribe(()=>{this.openedChange.emit(this._opened)})}_forceFocus(A,i){this._interactivityChecker.isFocusable(A)||(A.tabIndex=-1,this._ngZone.runOutsideAngular(()=>{let n=()=>{o(),r(),A.removeAttribute("tabindex")},o=this._renderer.listen(A,"blur",n),r=this._renderer.listen(A,"mousedown",n)})),A.focus(i)}_focusByCssSelector(A,i){let n=this._elementRef.nativeElement.querySelector(A);n&&this._forceFocus(n,i)}_takeFocus(){if(!this._focusTrap)return;let A=this._elementRef.nativeElement;switch(this.autoFocus){case!1:case"dialog":return;case!0:case"first-tabbable":To(()=>{!this._focusTrap.focusInitialElement()&&typeof A.focus=="function"&&A.focus()},{injector:this._injector});break;case"first-heading":this._focusByCssSelector('h1, h2, h3, h4, h5, h6, [role="heading"]');break;default:this._focusByCssSelector(this.autoFocus);break}}_restoreFocus(A){this.autoFocus!=="dialog"&&(this._elementFocusedBeforeDrawerWasOpened?this._focusMonitor.focusVia(this._elementFocusedBeforeDrawerWasOpened,A):this._elementRef.nativeElement.blur(),this._elementFocusedBeforeDrawerWasOpened=null)}_isFocusWithinDrawer(){let A=this._doc.activeElement;return!!A&&this._elementRef.nativeElement.contains(A)}ngAfterViewInit(){this._isAttached=!0,this._position==="end"&&this._updatePositionInParent("end"),this._platform.isBrowser&&(this._focusTrap=this._focusTrapFactory.create(this._elementRef.nativeElement),this._updateFocusTrapState())}ngOnDestroy(){this._eventCleanups.forEach(A=>A()),this._focusTrap?.destroy(),this._anchor?.remove(),this._anchor=null,this._animationStarted.complete(),this._animationEnd.complete(),this._modeChanged.complete(),this._destroyed.next(),this._destroyed.complete()}open(A){return this.toggle(!0,A)}close(){return this.toggle(!1)}_closeViaBackdropClick(){return this._setOpen(!1,!0,"mouse")}toggle(A=!this.opened,i){A&&i&&(this._openedVia=i);let n=this._setOpen(A,!A&&this._isFocusWithinDrawer(),this._openedVia||"program");return A||(this._openedVia=null),n}_setOpen(A,i,n){return A===this._opened?Promise.resolve(A?"open":"close"):(this._opened=A,this._container?._transitionsEnabled?this._setIsAnimating(!0):setTimeout(()=>{this._animationStarted.next(),this._animationEnd.next()}),this._elementRef.nativeElement.classList.toggle("mat-drawer-opened",A),!A&&i&&this._restoreFocus(n),this._changeDetectorRef.markForCheck(),this._updateFocusTrapState(),new Promise(o=>{this.openedChange.pipe(On(1)).subscribe(r=>o(r?"open":"close"))}))}_setIsAnimating(A){this._elementRef.nativeElement.classList.toggle("mat-drawer-animating",A)}_getWidth(){return this._elementRef.nativeElement.offsetWidth||0}_updateFocusTrapState(){this._focusTrap&&(this._focusTrap.enabled=!!this._container?.hasBackdrop&&this.opened)}_updatePositionInParent(A){if(!this._platform.isBrowser)return;let i=this._elementRef.nativeElement,n=i.parentNode;A==="end"?(this._anchor||(this._anchor=this._doc.createComment("mat-drawer-anchor"),n.insertBefore(this._anchor,i)),n.appendChild(i)):this._anchor&&this._anchor.parentNode.insertBefore(i,this._anchor)}_handleTransitionEvent=A=>{let i=this._elementRef.nativeElement;A.target===i&&this._ngZone.run(()=>{A.type==="transitionrun"?this._animationStarted.next(A):(A.type==="transitionend"&&this._setIsAnimating(!1),this._animationEnd.next(A))})};static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-drawer"]],viewQuery:function(i,n){if(i&1&&Te(tOA,5),i&2){let o;XA(o=$A())&&(n._content=o.first)}},hostAttrs:["tabIndex","-1",1,"mat-drawer"],hostVars:11,hostBindings:function(i,n){i&2&&(Ne("align",null),uo("visibility",!n._container&&!n.opened?"hidden":null),ue("mat-drawer-end",n.position==="end")("mat-drawer-over",n.mode==="over")("mat-drawer-push",n.mode==="push")("mat-drawer-side",n.mode==="side"))},inputs:{position:"position",mode:"mode",disableClose:"disableClose",autoFocus:"autoFocus",opened:"opened"},outputs:{openedChange:"openedChange",_openedStream:"opened",openedStart:"openedStart",_closedStream:"closed",closedStart:"closedStart",onPositionChanged:"positionChanged"},exportAs:["matDrawer"],ngContentSelectors:NcA,decls:3,vars:0,consts:[["content",""],["cdkScrollable","",1,"mat-drawer-inner-container"]],template:function(i,n){i&1&&(jt(),S(0,"div",1,0),Fe(2),F())},dependencies:[D0],encapsulation:2,changeDetection:0})}return t})(),TG=(()=>{class t{_dir=f(mo,{optional:!0});_element=f(ee);_ngZone=f(Qe);_changeDetectorRef=f(It);_animationMode=f(Si,{optional:!0});_transitionsEnabled=!1;_allDrawers;_drawers=new ca;_content;_userContent;get start(){return this._start}get end(){return this._end}get autosize(){return this._autosize}set autosize(A){this._autosize=Xo(A)}_autosize=f(sOA);get hasBackdrop(){return this._drawerHasBackdrop(this._start)||this._drawerHasBackdrop(this._end)}set hasBackdrop(A){this._backdropOverride=A==null?null:Xo(A)}_backdropOverride;backdropClick=new WA;_start;_end;_left;_right;_destroyed=new OA;_doCheckSubject=new OA;_contentMargins={left:null,right:null};_contentMarginChanges=new OA;get scrollable(){return this._userContent||this._content}_injector=f(Rt);constructor(){let A=f(Ii),i=f(Mc);this._dir?.change.pipe(St(this._destroyed)).subscribe(()=>{this._validateDrawers(),this.updateContentMargins()}),i.change().pipe(St(this._destroyed)).subscribe(()=>this.updateContentMargins()),this._animationMode!=="NoopAnimations"&&A.isBrowser&&this._ngZone.runOutsideAngular(()=>{setTimeout(()=>{this._element.nativeElement.classList.add("mat-drawer-transition"),this._transitionsEnabled=!0},200)})}ngAfterContentInit(){this._allDrawers.changes.pipe(Pn(this._allDrawers),St(this._destroyed)).subscribe(A=>{this._drawers.reset(A.filter(i=>!i._container||i._container===this)),this._drawers.notifyOnChanges()}),this._drawers.changes.pipe(Pn(null)).subscribe(()=>{this._validateDrawers(),this._drawers.forEach(A=>{this._watchDrawerToggle(A),this._watchDrawerPosition(A),this._watchDrawerMode(A)}),(!this._drawers.length||this._isDrawerOpen(this._start)||this._isDrawerOpen(this._end))&&this.updateContentMargins(),this._changeDetectorRef.markForCheck()}),this._ngZone.runOutsideAngular(()=>{this._doCheckSubject.pipe(el(10),St(this._destroyed)).subscribe(()=>this.updateContentMargins())})}ngOnDestroy(){this._contentMarginChanges.complete(),this._doCheckSubject.complete(),this._drawers.destroy(),this._destroyed.next(),this._destroyed.complete()}open(){this._drawers.forEach(A=>A.open())}close(){this._drawers.forEach(A=>A.close())}updateContentMargins(){let A=0,i=0;if(this._left&&this._left.opened){if(this._left.mode=="side")A+=this._left._getWidth();else if(this._left.mode=="push"){let n=this._left._getWidth();A+=n,i-=n}}if(this._right&&this._right.opened){if(this._right.mode=="side")i+=this._right._getWidth();else if(this._right.mode=="push"){let n=this._right._getWidth();i+=n,A-=n}}A=A||null,i=i||null,(A!==this._contentMargins.left||i!==this._contentMargins.right)&&(this._contentMargins={left:A,right:i},this._ngZone.run(()=>this._contentMarginChanges.next(this._contentMargins)))}ngDoCheck(){this._autosize&&this._isPushed()&&this._ngZone.runOutsideAngular(()=>this._doCheckSubject.next())}_watchDrawerToggle(A){A._animationStarted.pipe(St(this._drawers.changes)).subscribe(()=>{this.updateContentMargins(),this._changeDetectorRef.markForCheck()}),A.mode!=="side"&&A.openedChange.pipe(St(this._drawers.changes)).subscribe(()=>this._setContainerClass(A.opened))}_watchDrawerPosition(A){A.onPositionChanged.pipe(St(this._drawers.changes)).subscribe(()=>{To({read:()=>this._validateDrawers()},{injector:this._injector})})}_watchDrawerMode(A){A._modeChanged.pipe(St(zn(this._drawers.changes,this._destroyed))).subscribe(()=>{this.updateContentMargins(),this._changeDetectorRef.markForCheck()})}_setContainerClass(A){let i=this._element.nativeElement.classList,n="mat-drawer-container-has-open";A?i.add(n):i.remove(n)}_validateDrawers(){this._start=this._end=null,this._drawers.forEach(A=>{A.position=="end"?(this._end!=null,this._end=A):(this._start!=null,this._start=A)}),this._right=this._left=null,this._dir&&this._dir.value==="rtl"?(this._left=this._end,this._right=this._start):(this._left=this._start,this._right=this._end)}_isPushed(){return this._isDrawerOpen(this._start)&&this._start.mode!="over"||this._isDrawerOpen(this._end)&&this._end.mode!="over"}_onBackdropClicked(){this.backdropClick.emit(),this._closeModalDrawersViaBackdrop()}_closeModalDrawersViaBackdrop(){[this._start,this._end].filter(A=>A&&!A.disableClose&&this._drawerHasBackdrop(A)).forEach(A=>A._closeViaBackdropClick())}_isShowingBackdrop(){return this._isDrawerOpen(this._start)&&this._drawerHasBackdrop(this._start)||this._isDrawerOpen(this._end)&&this._drawerHasBackdrop(this._end)}_isDrawerOpen(A){return A!=null&&A.opened}_drawerHasBackdrop(A){return this._backdropOverride==null?!!A&&A.mode!=="side":this._backdropOverride}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-drawer-container"]],contentQueries:function(i,n,o){if(i&1&&(ci(o,YG,5),ci(o,JG,5)),i&2){let r;XA(r=$A())&&(n._content=r.first),XA(r=$A())&&(n._allDrawers=r)}},viewQuery:function(i,n){if(i&1&&Te(YG,5),i&2){let o;XA(o=$A())&&(n._userContent=o.first)}},hostAttrs:[1,"mat-drawer-container"],hostVars:2,hostBindings:function(i,n){i&2&&ue("mat-drawer-container-explicit-backdrop",n._backdropOverride)},inputs:{autosize:"autosize",hasBackdrop:"hasBackdrop"},outputs:{backdropClick:"backdropClick"},exportAs:["matDrawerContainer"],features:[ht([{provide:_cA,useExisting:t}])],ngContentSelectors:nOA,decls:4,vars:2,consts:[[1,"mat-drawer-backdrop",3,"mat-drawer-shown"],[1,"mat-drawer-backdrop",3,"click"]],template:function(i,n){i&1&&(jt(iOA),_A(0,oOA,1,2,"div",0),Fe(1),Fe(2,1),_A(3,rOA,2,0,"mat-drawer-content")),i&2&&(GA(n.hasBackdrop?0:-1),G(3),GA(n._content?-1:3))},dependencies:[YG],styles:[".mat-drawer-container{position:relative;z-index:1;color:var(--mat-sidenav-content-text-color, var(--mat-sys-on-background));background-color:var(--mat-sidenav-content-background-color, var(--mat-sys-background));box-sizing:border-box;display:block;overflow:hidden}.mat-drawer-container[fullscreen]{top:0;left:0;right:0;bottom:0;position:absolute}.mat-drawer-container[fullscreen].mat-drawer-container-has-open{overflow:hidden}.mat-drawer-container.mat-drawer-container-explicit-backdrop .mat-drawer-side{z-index:3}.mat-drawer-container.ng-animate-disabled .mat-drawer-backdrop,.mat-drawer-container.ng-animate-disabled .mat-drawer-content,.ng-animate-disabled .mat-drawer-container .mat-drawer-backdrop,.ng-animate-disabled .mat-drawer-container .mat-drawer-content{transition:none}.mat-drawer-backdrop{top:0;left:0;right:0;bottom:0;position:absolute;display:block;z-index:3;visibility:hidden}.mat-drawer-backdrop.mat-drawer-shown{visibility:visible;background-color:var(--mat-sidenav-scrim-color, color-mix(in srgb, var(--mat-sys-neutral-variant20) 40%, transparent))}.mat-drawer-transition .mat-drawer-backdrop{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:background-color,visibility}@media(forced-colors: active){.mat-drawer-backdrop{opacity:.5}}.mat-drawer-content{position:relative;z-index:1;display:block;height:100%;overflow:auto}.mat-drawer-content.mat-drawer-content-hidden{opacity:0}.mat-drawer-transition .mat-drawer-content{transition-duration:400ms;transition-timing-function:cubic-bezier(0.25, 0.8, 0.25, 1);transition-property:transform,margin-left,margin-right}.mat-drawer{position:relative;z-index:4;color:var(--mat-sidenav-container-text-color, var(--mat-sys-on-surface-variant));box-shadow:var(--mat-sidenav-container-elevation-shadow, none);background-color:var(--mat-sidenav-container-background-color, var(--mat-sys-surface));border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));width:var(--mat-sidenav-container-width, 360px);display:block;position:absolute;top:0;bottom:0;z-index:3;outline:0;box-sizing:border-box;overflow-y:auto;transform:translate3d(-100%, 0, 0)}@media(forced-colors: active){.mat-drawer,[dir=rtl] .mat-drawer.mat-drawer-end{border-right:solid 1px currentColor}}@media(forced-colors: active){[dir=rtl] .mat-drawer,.mat-drawer.mat-drawer-end{border-left:solid 1px currentColor;border-right:none}}.mat-drawer.mat-drawer-side{z-index:2}.mat-drawer.mat-drawer-end{right:0;transform:translate3d(100%, 0, 0);border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0}[dir=rtl] .mat-drawer{border-top-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-left-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-right-radius:0;border-bottom-right-radius:0;transform:translate3d(100%, 0, 0)}[dir=rtl] .mat-drawer.mat-drawer-end{border-top-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-bottom-right-radius:var(--mat-sidenav-container-shape, var(--mat-sys-corner-large));border-top-left-radius:0;border-bottom-left-radius:0;left:0;right:auto;transform:translate3d(-100%, 0, 0)}.mat-drawer-transition .mat-drawer{transition:transform 400ms cubic-bezier(0.25, 0.8, 0.25, 1)}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating){visibility:hidden;box-shadow:none}.mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating) .mat-drawer-inner-container{display:none}.mat-drawer.mat-drawer-opened.mat-drawer-opened{transform:none}.mat-drawer-side{box-shadow:none;border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid}.mat-drawer-side.mat-drawer-end{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side{border-left-color:var(--mat-sidenav-container-divider-color, transparent);border-left-width:1px;border-left-style:solid;border-right:none}[dir=rtl] .mat-drawer-side.mat-drawer-end{border-right-color:var(--mat-sidenav-container-divider-color, transparent);border-right-width:1px;border-right-style:solid;border-left:none}.mat-drawer-inner-container{width:100%;height:100%;overflow:auto}.mat-sidenav-fixed{position:fixed}"],encapsulation:2,changeDetection:0})}return t})();var GcA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[it,Cl,Cl,it]})}return t})();var PG=["*"];function lOA(t,e){t&1&&Fe(0)}var gOA=["tabListContainer"],IOA=["tabList"],COA=["tabListInner"],dOA=["nextPaginator"],BOA=["previousPaginator"],EOA=t=>({animationDuration:t}),QOA=(t,e)=>({value:t,params:e});function hOA(t,e){}var uOA=["tabBodyWrapper"],fOA=["tabHeader"];function mOA(t,e){}function pOA(t,e){if(t&1&&_A(0,mOA,0,0,"ng-template",12),t&2){let A=O().$implicit;yA("cdkPortalOutlet",A.templateLabel)}}function wOA(t,e){if(t&1&&AA(0),t&2){let A=O().$implicit;Gt(A.textLabel)}}function DOA(t,e){if(t&1){let A=be();S(0,"div",7,2),hA("click",function(){let n=RA(A),o=n.$implicit,r=n.$index,s=O(),a=cr(1);return xA(s._handleClick(o,a,r))})("cdkFocusChange",function(n){let o=RA(A).$index,r=O();return xA(r._tabFocusChanged(n,o))}),JA(2,"span",8)(3,"div",9),S(4,"span",10)(5,"span",11),_A(6,pOA,1,1,null,12)(7,wOA,1,1),F()()()}if(t&2){let A=e.$implicit,i=e.$index,n=cr(1),o=O();fo(A.labelClass),ue("mdc-tab--active",o.selectedIndex===i),yA("id",o._getTabLabelId(i))("disabled",A.disabled)("fitInkBarToContent",o.fitInkBarToContent),Ne("tabIndex",o._getTabIndex(i))("aria-posinset",i+1)("aria-setsize",o._tabs.length)("aria-controls",o._getTabContentId(i))("aria-selected",o.selectedIndex===i)("aria-label",A.ariaLabel||null)("aria-labelledby",!A.ariaLabel&&A.ariaLabelledby?A.ariaLabelledby:null),G(3),yA("matRippleTrigger",n)("matRippleDisabled",A.disabled||o.disableRipple),G(3),GA(A.templateLabel?6:7)}}function yOA(t,e){t&1&&Fe(0)}function vOA(t,e){if(t&1){let A=be();S(0,"mat-tab-body",13),hA("_onCentered",function(){RA(A);let n=O();return xA(n._removeTabBodyWrapperHeight())})("_onCentering",function(n){RA(A);let o=O();return xA(o._setTabBodyWrapperHeight(n))}),F()}if(t&2){let A=e.$implicit,i=e.$index,n=O();fo(A.bodyClass),ue("mat-mdc-tab-body-active",n.selectedIndex===i),yA("id",n._getTabContentId(i))("content",A.content)("position",A.position)("origin",A.origin)("animationDuration",n.animationDuration)("preserveContent",n.preserveContent),Ne("tabindex",n.contentTabIndex!=null&&n.selectedIndex===i?n.contentTabIndex:null)("aria-labelledby",n._getTabLabelId(i))("aria-hidden",n.selectedIndex!==i)}}var bOA=new dA("MatTabContent"),MOA=(()=>{class t{template=f(wn);constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","matTabContent",""]],features:[ht([{provide:bOA,useExisting:t}])]})}return t})(),kOA=new dA("MatTabLabel"),YcA=new dA("MAT_TAB"),jG=(()=>{class t extends sP{_closestTab=f(YcA,{optional:!0});static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275dir=jA({type:t,selectors:[["","mat-tab-label",""],["","matTabLabel",""]],features:[ht([{provide:kOA,useExisting:t}]),lt]})}return t})(),JcA=new dA("MAT_TAB_GROUP"),mf=(()=>{class t{_viewContainerRef=f(Nn);_closestTabGroup=f(JcA,{optional:!0});disabled=!1;get templateLabel(){return this._templateLabel}set templateLabel(A){this._setTemplateLabelInput(A)}_templateLabel;_explicitContent=void 0;_implicitContent;textLabel="";ariaLabel;ariaLabelledby;labelClass;bodyClass;_contentPortal=null;get content(){return this._contentPortal}_stateChanges=new OA;position=null;origin=null;isActive=!1;constructor(){f(Rn).load(lr)}ngOnChanges(A){(A.hasOwnProperty("textLabel")||A.hasOwnProperty("disabled"))&&this._stateChanges.next()}ngOnDestroy(){this._stateChanges.complete()}ngOnInit(){this._contentPortal=new ys(this._explicitContent||this._implicitContent,this._viewContainerRef)}_setTemplateLabelInput(A){A&&A._closestTab===this&&(this._templateLabel=A)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-tab"]],contentQueries:function(i,n,o){if(i&1&&(ci(o,jG,5),ci(o,MOA,7,wn)),i&2){let r;XA(r=$A())&&(n.templateLabel=r.first),XA(r=$A())&&(n._explicitContent=r.first)}},viewQuery:function(i,n){if(i&1&&Te(wn,7),i&2){let o;XA(o=$A())&&(n._implicitContent=o.first)}},hostAttrs:["hidden",""],inputs:{disabled:[2,"disabled","disabled",ie],textLabel:[0,"label","textLabel"],ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],labelClass:"labelClass",bodyClass:"bodyClass"},exportAs:["matTab"],features:[ht([{provide:YcA,useExisting:t}]),ti],ngContentSelectors:PG,decls:1,vars:0,template:function(i,n){i&1&&(jt(),_A(0,lOA,1,0,"ng-template"))},encapsulation:2})}return t})(),HG="mdc-tab-indicator--active",UcA="mdc-tab-indicator--no-transition",zG=class{_items;_currentItem;constructor(e){this._items=e}hide(){this._items.forEach(e=>e.deactivateInkBar()),this._currentItem=void 0}alignToElement(e){let A=this._items.find(n=>n.elementRef.nativeElement===e),i=this._currentItem;if(A!==i&&(i?.deactivateInkBar(),A)){let n=i?.elementRef.nativeElement.getBoundingClientRect?.();A.activateInkBar(n),this._currentItem=A}}},SOA=(()=>{class t{_elementRef=f(ee);_inkBarElement;_inkBarContentElement;_fitToContent=!1;get fitInkBarToContent(){return this._fitToContent}set fitInkBarToContent(A){this._fitToContent!==A&&(this._fitToContent=A,this._inkBarElement&&this._appendInkBarElement())}activateInkBar(A){let i=this._elementRef.nativeElement;if(!A||!i.getBoundingClientRect||!this._inkBarContentElement){i.classList.add(HG);return}let n=i.getBoundingClientRect(),o=A.width/n.width,r=A.left-n.left;i.classList.add(UcA),this._inkBarContentElement.style.setProperty("transform",`translateX(${r}px) scaleX(${o})`),i.getBoundingClientRect(),i.classList.remove(UcA),i.classList.add(HG),this._inkBarContentElement.style.setProperty("transform","")}deactivateInkBar(){this._elementRef.nativeElement.classList.remove(HG)}ngOnInit(){this._createInkBarElement()}ngOnDestroy(){this._inkBarElement?.remove(),this._inkBarElement=this._inkBarContentElement=null}_createInkBarElement(){let A=this._elementRef.nativeElement.ownerDocument||document,i=this._inkBarElement=A.createElement("span"),n=this._inkBarContentElement=A.createElement("span");i.className="mdc-tab-indicator",n.className="mdc-tab-indicator__content mdc-tab-indicator__content--underline",i.appendChild(this._inkBarContentElement),this._appendInkBarElement()}_appendInkBarElement(){this._inkBarElement;let A=this._fitToContent?this._elementRef.nativeElement.querySelector(".mdc-tab__content"):this._elementRef.nativeElement;A.appendChild(this._inkBarElement)}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,inputs:{fitInkBarToContent:[2,"fitInkBarToContent","fitInkBarToContent",ie]}})}return t})();var TcA=(()=>{class t extends SOA{elementRef=f(ee);disabled=!1;focus(){this.elementRef.nativeElement.focus()}getOffsetLeft(){return this.elementRef.nativeElement.offsetLeft}getOffsetWidth(){return this.elementRef.nativeElement.offsetWidth}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275dir=jA({type:t,selectors:[["","matTabLabelWrapper",""]],hostVars:3,hostBindings:function(i,n){i&2&&(Ne("aria-disabled",!!n.disabled),ue("mat-mdc-tab-disabled",n.disabled))},inputs:{disabled:[2,"disabled","disabled",ie]},features:[lt]})}return t})(),KcA={passive:!0},ROA=650,xOA=100,LOA=(()=>{class t{_elementRef=f(ee);_changeDetectorRef=f(It);_viewportRuler=f(Mc);_dir=f(mo,{optional:!0});_ngZone=f(Qe);_platform=f(Ii);_sharedResizeObserver=f(B8);_injector=f(Rt);_renderer=f(Wi);_animationMode=f(Si,{optional:!0});_eventCleanups;_scrollDistance=0;_selectedIndexChanged=!1;_destroyed=new OA;_showPaginationControls=!1;_disableScrollAfter=!0;_disableScrollBefore=!0;_tabLabelCount;_scrollDistanceChanged;_keyManager;_currentTextContent;_stopScrolling=new OA;disablePagination=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(A){let i=isNaN(A)?0:A;this._selectedIndex!=i&&(this._selectedIndexChanged=!0,this._selectedIndex=i,this._keyManager&&this._keyManager.updateActiveItem(i))}_selectedIndex=0;selectFocusedIndex=new WA;indexFocused=new WA;constructor(){this._eventCleanups=this._ngZone.runOutsideAngular(()=>[this._renderer.listen(this._elementRef.nativeElement,"mouseleave",()=>this._stopInterval())])}ngAfterViewInit(){this._eventCleanups.push(sk(this._renderer,this._previousPaginator.nativeElement,"touchstart",()=>this._handlePaginatorPress("before"),KcA),sk(this._renderer,this._nextPaginator.nativeElement,"touchstart",()=>this._handlePaginatorPress("after"),KcA))}ngAfterContentInit(){let A=this._dir?this._dir.change:Me("ltr"),i=this._sharedResizeObserver.observe(this._elementRef.nativeElement).pipe(el(32),St(this._destroyed)),n=this._viewportRuler.change(150).pipe(St(this._destroyed)),o=()=>{this.updatePagination(),this._alignInkBarToSelectedTab()};this._keyManager=new qI(this._items).withHorizontalOrientation(this._getLayoutDirection()).withHomeAndEnd().withWrap().skipPredicate(()=>!1),this._keyManager.updateActiveItem(this._selectedIndex),To(o,{injector:this._injector}),zn(A,n,i,this._items.changes,this._itemsResized()).pipe(St(this._destroyed)).subscribe(()=>{this._ngZone.run(()=>{Promise.resolve().then(()=>{this._scrollDistance=Math.max(0,Math.min(this._getMaxScrollDistance(),this._scrollDistance)),o()})}),this._keyManager.withHorizontalOrientation(this._getLayoutDirection())}),this._keyManager.change.subscribe(r=>{this.indexFocused.emit(r),this._setTabFocus(r)})}_itemsResized(){return typeof ResizeObserver!="function"?sr:this._items.changes.pipe(Pn(this._items),jn(A=>new ct(i=>this._ngZone.runOutsideAngular(()=>{let n=new ResizeObserver(o=>i.next(o));return A.forEach(o=>n.observe(o.elementRef.nativeElement)),()=>{n.disconnect()}}))),CI(1),kt(A=>A.some(i=>i.contentRect.width>0&&i.contentRect.height>0)))}ngAfterContentChecked(){this._tabLabelCount!=this._items.length&&(this.updatePagination(),this._tabLabelCount=this._items.length,this._changeDetectorRef.markForCheck()),this._selectedIndexChanged&&(this._scrollToLabel(this._selectedIndex),this._checkScrollingControls(),this._alignInkBarToSelectedTab(),this._selectedIndexChanged=!1,this._changeDetectorRef.markForCheck()),this._scrollDistanceChanged&&(this._updateTabScrollPosition(),this._scrollDistanceChanged=!1,this._changeDetectorRef.markForCheck())}ngOnDestroy(){this._eventCleanups.forEach(A=>A()),this._keyManager?.destroy(),this._destroyed.next(),this._destroyed.complete(),this._stopScrolling.complete()}_handleKeydown(A){if(!ir(A))switch(A.keyCode){case 13:case 32:if(this.focusIndex!==this.selectedIndex){let i=this._items.get(this.focusIndex);i&&!i.disabled&&(this.selectFocusedIndex.emit(this.focusIndex),this._itemSelected(A))}break;default:this._keyManager.onKeydown(A)}}_onContentChanges(){let A=this._elementRef.nativeElement.textContent;A!==this._currentTextContent&&(this._currentTextContent=A||"",this._ngZone.run(()=>{this.updatePagination(),this._alignInkBarToSelectedTab(),this._changeDetectorRef.markForCheck()}))}updatePagination(){this._checkPaginationEnabled(),this._checkScrollingControls(),this._updateTabScrollPosition()}get focusIndex(){return this._keyManager?this._keyManager.activeItemIndex:0}set focusIndex(A){!this._isValidIndex(A)||this.focusIndex===A||!this._keyManager||this._keyManager.setActiveItem(A)}_isValidIndex(A){return this._items?!!this._items.toArray()[A]:!0}_setTabFocus(A){if(this._showPaginationControls&&this._scrollToLabel(A),this._items&&this._items.length){this._items.toArray()[A].focus();let i=this._tabListContainer.nativeElement;this._getLayoutDirection()=="ltr"?i.scrollLeft=0:i.scrollLeft=i.scrollWidth-i.offsetWidth}}_getLayoutDirection(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_updateTabScrollPosition(){if(this.disablePagination)return;let A=this.scrollDistance,i=this._getLayoutDirection()==="ltr"?-A:A;this._tabList.nativeElement.style.transform=`translateX(${Math.round(i)}px)`,(this._platform.TRIDENT||this._platform.EDGE)&&(this._tabListContainer.nativeElement.scrollLeft=0)}get scrollDistance(){return this._scrollDistance}set scrollDistance(A){this._scrollTo(A)}_scrollHeader(A){let i=this._tabListContainer.nativeElement.offsetWidth,n=(A=="before"?-1:1)*i/3;return this._scrollTo(this._scrollDistance+n)}_handlePaginatorClick(A){this._stopInterval(),this._scrollHeader(A)}_scrollToLabel(A){if(this.disablePagination)return;let i=this._items?this._items.toArray()[A]:null;if(!i)return;let n=this._tabListContainer.nativeElement.offsetWidth,{offsetLeft:o,offsetWidth:r}=i.elementRef.nativeElement,s,a;this._getLayoutDirection()=="ltr"?(s=o,a=s+r):(a=this._tabListInner.nativeElement.offsetWidth-o,s=a-r);let c=this.scrollDistance,l=this.scrollDistance+n;sl&&(this.scrollDistance+=Math.min(a-l,s-c))}_checkPaginationEnabled(){if(this.disablePagination)this._showPaginationControls=!1;else{let A=this._tabListInner.nativeElement.scrollWidth,i=this._elementRef.nativeElement.offsetWidth,n=A-i>=5;n||(this.scrollDistance=0),n!==this._showPaginationControls&&(this._showPaginationControls=n,this._changeDetectorRef.markForCheck())}}_checkScrollingControls(){this.disablePagination?this._disableScrollAfter=this._disableScrollBefore=!0:(this._disableScrollBefore=this.scrollDistance==0,this._disableScrollAfter=this.scrollDistance==this._getMaxScrollDistance(),this._changeDetectorRef.markForCheck())}_getMaxScrollDistance(){let A=this._tabListInner.nativeElement.scrollWidth,i=this._tabListContainer.nativeElement.offsetWidth;return A-i||0}_alignInkBarToSelectedTab(){let A=this._items&&this._items.length?this._items.toArray()[this.selectedIndex]:null,i=A?A.elementRef.nativeElement:null;i?this._inkBar.alignToElement(i):this._inkBar.hide()}_stopInterval(){this._stopScrolling.next()}_handlePaginatorPress(A,i){i&&i.button!=null&&i.button!==0||(this._stopInterval(),II(ROA,xOA).pipe(St(zn(this._stopScrolling,this._destroyed))).subscribe(()=>{let{maxScrollDistance:n,distance:o}=this._scrollHeader(A);(o===0||o>=n)&&this._stopInterval()}))}_scrollTo(A){if(this.disablePagination)return{maxScrollDistance:0,distance:0};let i=this._getMaxScrollDistance();return this._scrollDistance=Math.max(0,Math.min(i,A)),this._scrollDistanceChanged=!0,this._checkScrollingControls(),{maxScrollDistance:i,distance:this._scrollDistance}}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,inputs:{disablePagination:[2,"disablePagination","disablePagination",ie],selectedIndex:[2,"selectedIndex","selectedIndex",zi]},outputs:{selectFocusedIndex:"selectFocusedIndex",indexFocused:"indexFocused"}})}return t})(),FOA=(()=>{class t extends LOA{_items;_tabListContainer;_tabList;_tabListInner;_nextPaginator;_previousPaginator;_inkBar;ariaLabel;ariaLabelledby;disableRipple=!1;ngAfterContentInit(){this._inkBar=new zG(this._items),super.ngAfterContentInit()}_itemSelected(A){A.preventDefault()}static \u0275fac=(()=>{let A;return function(n){return(A||(A=Hi(t)))(n||t)}})();static \u0275cmp=zA({type:t,selectors:[["mat-tab-header"]],contentQueries:function(i,n,o){if(i&1&&ci(o,TcA,4),i&2){let r;XA(r=$A())&&(n._items=r)}},viewQuery:function(i,n){if(i&1&&(Te(gOA,7),Te(IOA,7),Te(COA,7),Te(dOA,5),Te(BOA,5)),i&2){let o;XA(o=$A())&&(n._tabListContainer=o.first),XA(o=$A())&&(n._tabList=o.first),XA(o=$A())&&(n._tabListInner=o.first),XA(o=$A())&&(n._nextPaginator=o.first),XA(o=$A())&&(n._previousPaginator=o.first)}},hostAttrs:[1,"mat-mdc-tab-header"],hostVars:4,hostBindings:function(i,n){i&2&&ue("mat-mdc-tab-header-pagination-controls-enabled",n._showPaginationControls)("mat-mdc-tab-header-rtl",n._getLayoutDirection()=="rtl")},inputs:{ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],disableRipple:[2,"disableRipple","disableRipple",ie]},features:[lt],ngContentSelectors:PG,decls:13,vars:10,consts:[["previousPaginator",""],["tabListContainer",""],["tabList",""],["tabListInner",""],["nextPaginator",""],["mat-ripple","",1,"mat-mdc-tab-header-pagination","mat-mdc-tab-header-pagination-before",3,"click","mousedown","touchend","matRippleDisabled"],[1,"mat-mdc-tab-header-pagination-chevron"],[1,"mat-mdc-tab-label-container",3,"keydown"],["role","tablist",1,"mat-mdc-tab-list",3,"cdkObserveContent"],[1,"mat-mdc-tab-labels"],["mat-ripple","",1,"mat-mdc-tab-header-pagination","mat-mdc-tab-header-pagination-after",3,"mousedown","click","touchend","matRippleDisabled"]],template:function(i,n){if(i&1){let o=be();jt(),S(0,"div",5,0),hA("click",function(){return RA(o),xA(n._handlePaginatorClick("before"))})("mousedown",function(s){return RA(o),xA(n._handlePaginatorPress("before",s))})("touchend",function(){return RA(o),xA(n._stopInterval())}),JA(2,"div",6),F(),S(3,"div",7,1),hA("keydown",function(s){return RA(o),xA(n._handleKeydown(s))}),S(5,"div",8,2),hA("cdkObserveContent",function(){return RA(o),xA(n._onContentChanges())}),S(7,"div",9,3),Fe(9),F()()(),S(10,"div",10,4),hA("mousedown",function(s){return RA(o),xA(n._handlePaginatorPress("after",s))})("click",function(){return RA(o),xA(n._handlePaginatorClick("after"))})("touchend",function(){return RA(o),xA(n._stopInterval())}),JA(12,"div",6),F()}i&2&&(ue("mat-mdc-tab-header-pagination-disabled",n._disableScrollBefore),yA("matRippleDisabled",n._disableScrollBefore||n.disableRipple),G(3),ue("_mat-animation-noopable",n._animationMode==="NoopAnimations"),G(2),Ne("aria-label",n.ariaLabel||null)("aria-labelledby",n.ariaLabelledby||null),G(5),ue("mat-mdc-tab-header-pagination-disabled",n._disableScrollAfter),yA("matRippleDisabled",n._disableScrollAfter||n.disableRipple))},dependencies:[rs,V6],styles:[".mat-mdc-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0}.mdc-tab-indicator .mdc-tab-indicator__content{transition-duration:var(--mat-tab-animation-duration, 250ms)}.mat-mdc-tab-header-pagination{-webkit-user-select:none;user-select:none;position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:rgba(0,0,0,0);touch-action:none;box-sizing:content-box;outline:0}.mat-mdc-tab-header-pagination::-moz-focus-inner{border:0}.mat-mdc-tab-header-pagination .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-header-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-controls-enabled .mat-mdc-tab-header-pagination{display:flex}.mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after{padding-left:4px}.mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-pagination-after{padding-right:4px}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-mdc-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px;border-color:var(--mat-tab-header-pagination-icon-color, var(--mat-sys-on-surface))}.mat-mdc-tab-header-pagination-disabled{box-shadow:none;cursor:default;pointer-events:none}.mat-mdc-tab-header-pagination-disabled .mat-mdc-tab-header-pagination-chevron{opacity:.4}.mat-mdc-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-mdc-tab-list{transition:none}.mat-mdc-tab-label-container{display:flex;flex-grow:1;overflow:hidden;z-index:1;border-bottom-style:solid;border-bottom-width:var(--mat-tab-header-divider-height, 1px);border-bottom-color:var(--mat-tab-header-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-group-inverted-header .mat-mdc-tab-label-container{border-bottom:none;border-top-style:solid;border-top-width:var(--mat-tab-header-divider-height, 1px);border-top-color:var(--mat-tab-header-divider-color, var(--mat-sys-surface-variant))}.mat-mdc-tab-labels{display:flex;flex:1 0 auto}[mat-align-tabs=center]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:center}[mat-align-tabs=end]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:flex-end}.cdk-drop-list .mat-mdc-tab-labels,.mat-mdc-tab-labels.cdk-drop-list{min-height:var(--mdc-secondary-navigation-tab-container-height, 48px)}.mat-mdc-tab::before{margin:5px}@media(forced-colors: active){.mat-mdc-tab[aria-disabled=true]{color:GrayText}}"],encapsulation:2})}return t})(),NOA=new dA("MAT_TABS_CONFIG"),_OA={translateTab:sc("translateTab",[js("center, void, left-origin-center, right-origin-center",po({transform:"none",visibility:"visible"})),js("left",po({transform:"translate3d(-100%, 0, 0)",minHeight:"1px",visibility:"hidden"})),js("right",po({transform:"translate3d(100%, 0, 0)",minHeight:"1px",visibility:"hidden"})),Vr("* => left, * => right, left => center, right => center",ss("{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)")),Vr("void => left-origin-center",[po({transform:"translate3d(-100%, 0, 0)",visibility:"hidden"}),ss("{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)")]),Vr("void => right-origin-center",[po({transform:"translate3d(100%, 0, 0)",visibility:"hidden"}),ss("{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)")])])},GOA=(()=>{class t extends fa{_host=f(HcA);_centeringSub=Kt.EMPTY;_leavingSub=Kt.EMPTY;constructor(){super()}ngOnInit(){super.ngOnInit(),this._centeringSub=this._host._beforeCentering.pipe(Pn(this._host._isCenterPosition(this._host._position))).subscribe(A=>{this._host._content&&A&&!this.hasAttached()&&this.attach(this._host._content)}),this._leavingSub=this._host._afterLeavingCenter.subscribe(()=>{this._host.preserveContent||this.detach()})}ngOnDestroy(){super.ngOnDestroy(),this._centeringSub.unsubscribe(),this._leavingSub.unsubscribe()}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","matTabBodyHost",""]],features:[lt]})}return t})(),HcA=(()=>{class t{_elementRef=f(ee);_dir=f(mo,{optional:!0});_positionIndex;_dirChangeSubscription=Kt.EMPTY;_position;_translateTabComplete=new OA;_onCentering=new WA;_beforeCentering=new WA;_afterLeavingCenter=new WA;_onCentered=new WA(!0);_portalHost;_content;origin;animationDuration="500ms";preserveContent=!1;set position(A){this._positionIndex=A,this._computePositionAnimationState()}constructor(){if(this._dir){let A=f(It);this._dirChangeSubscription=this._dir.change.subscribe(i=>{this._computePositionAnimationState(i),A.markForCheck()})}this._translateTabComplete.subscribe(A=>{this._isCenterPosition(A.toState)&&this._isCenterPosition(this._position)&&this._onCentered.emit(),this._isCenterPosition(A.fromState)&&!this._isCenterPosition(this._position)&&this._afterLeavingCenter.emit()})}ngOnInit(){this._position=="center"&&this.origin!=null&&(this._position=this._computePositionFromOrigin(this.origin))}ngOnDestroy(){this._dirChangeSubscription.unsubscribe(),this._translateTabComplete.complete()}_onTranslateTabStarted(A){let i=this._isCenterPosition(A.toState);this._beforeCentering.emit(i),i&&this._onCentering.emit(this._elementRef.nativeElement.clientHeight)}_getLayoutDirection(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}_isCenterPosition(A){return A=="center"||A=="left-origin-center"||A=="right-origin-center"}_computePositionAnimationState(A=this._getLayoutDirection()){this._positionIndex<0?this._position=A=="ltr"?"left":"right":this._positionIndex>0?this._position=A=="ltr"?"right":"left":this._position="center"}_computePositionFromOrigin(A){let i=this._getLayoutDirection();return i=="ltr"&&A<=0||i=="rtl"&&A>0?"left-origin-center":"right-origin-center"}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-tab-body"]],viewQuery:function(i,n){if(i&1&&Te(fa,5),i&2){let o;XA(o=$A())&&(n._portalHost=o.first)}},hostAttrs:[1,"mat-mdc-tab-body"],inputs:{_content:[0,"content","_content"],origin:"origin",animationDuration:"animationDuration",preserveContent:"preserveContent",position:"position"},outputs:{_onCentering:"_onCentering",_beforeCentering:"_beforeCentering",_afterLeavingCenter:"_afterLeavingCenter",_onCentered:"_onCentered"},decls:3,vars:6,consts:[["content",""],["cdkScrollable","",1,"mat-mdc-tab-body-content"],["matTabBodyHost",""]],template:function(i,n){if(i&1){let o=be();S(0,"div",1,0),hA("@translateTab.start",function(s){return RA(o),xA(n._onTranslateTabStarted(s))})("@translateTab.done",function(s){return RA(o),xA(n._translateTabComplete.next(s))}),_A(2,hOA,0,0,"ng-template",2),F()}i&2&&yA("@translateTab",b2(3,QOA,n._position,qr(1,EOA,n.animationDuration)))},dependencies:[GOA,D0],styles:['.mat-mdc-tab-body{top:0;left:0;right:0;bottom:0;position:absolute;display:block;overflow:hidden;outline:0;flex-basis:100%}.mat-mdc-tab-body.mat-mdc-tab-body-active{position:relative;overflow-x:hidden;overflow-y:auto;z-index:1;flex-grow:1}.mat-mdc-tab-group.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body.mat-mdc-tab-body-active{overflow-y:hidden}.mat-mdc-tab-body-content{height:100%;overflow:auto}.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body-content{overflow:hidden}.mat-mdc-tab-body-content[style*="visibility: hidden"]{display:none}'],encapsulation:2,data:{animation:[_OA.translateTab]}})}return t})(),UOA=!0,o7=(()=>{class t{_elementRef=f(ee);_changeDetectorRef=f(It);_animationMode=f(Si,{optional:!0});_allTabs;_tabBodyWrapper;_tabHeader;_tabs=new ca;_indexToSelect=0;_lastFocusedTabIndex=null;_tabBodyWrapperHeight=0;_tabsSubscription=Kt.EMPTY;_tabLabelSubscription=Kt.EMPTY;color;get fitInkBarToContent(){return this._fitInkBarToContent}set fitInkBarToContent(A){this._fitInkBarToContent=A,this._changeDetectorRef.markForCheck()}_fitInkBarToContent=!1;stretchTabs=!0;alignTabs=null;dynamicHeight=!1;get selectedIndex(){return this._selectedIndex}set selectedIndex(A){this._indexToSelect=isNaN(A)?null:A}_selectedIndex=null;headerPosition="above";get animationDuration(){return this._animationDuration}set animationDuration(A){let i=A+"";this._animationDuration=/^\d+$/.test(i)?A+"ms":i}_animationDuration;get contentTabIndex(){return this._contentTabIndex}set contentTabIndex(A){this._contentTabIndex=isNaN(A)?null:A}_contentTabIndex;disablePagination=!1;disableRipple=!1;preserveContent=!1;get backgroundColor(){return this._backgroundColor}set backgroundColor(A){if(!UOA)throw new Error("mat-tab-group background color must be set through the Sass theming API");let i=this._elementRef.nativeElement.classList;i.remove("mat-tabs-with-background",`mat-background-${this.backgroundColor}`),A&&i.add("mat-tabs-with-background",`mat-background-${A}`),this._backgroundColor=A}_backgroundColor;ariaLabel;ariaLabelledby;selectedIndexChange=new WA;focusChange=new WA;animationDone=new WA;selectedTabChange=new WA(!0);_groupId;_isServer=!f(Ii).isBrowser;constructor(){let A=f(NOA,{optional:!0});this._groupId=f(sn).getId("mat-tab-group-"),this.animationDuration=A&&A.animationDuration?A.animationDuration:"500ms",this.disablePagination=A&&A.disablePagination!=null?A.disablePagination:!1,this.dynamicHeight=A&&A.dynamicHeight!=null?A.dynamicHeight:!1,A?.contentTabIndex!=null&&(this.contentTabIndex=A.contentTabIndex),this.preserveContent=!!A?.preserveContent,this.fitInkBarToContent=A&&A.fitInkBarToContent!=null?A.fitInkBarToContent:!1,this.stretchTabs=A&&A.stretchTabs!=null?A.stretchTabs:!0,this.alignTabs=A&&A.alignTabs!=null?A.alignTabs:null}ngAfterContentChecked(){let A=this._indexToSelect=this._clampTabIndex(this._indexToSelect);if(this._selectedIndex!=A){let i=this._selectedIndex==null;if(!i){this.selectedTabChange.emit(this._createChangeEvent(A));let n=this._tabBodyWrapper.nativeElement;n.style.minHeight=n.clientHeight+"px"}Promise.resolve().then(()=>{this._tabs.forEach((n,o)=>n.isActive=o===A),i||(this.selectedIndexChange.emit(A),this._tabBodyWrapper.nativeElement.style.minHeight="")})}this._tabs.forEach((i,n)=>{i.position=n-A,this._selectedIndex!=null&&i.position==0&&!i.origin&&(i.origin=A-this._selectedIndex)}),this._selectedIndex!==A&&(this._selectedIndex=A,this._lastFocusedTabIndex=null,this._changeDetectorRef.markForCheck())}ngAfterContentInit(){this._subscribeToAllTabChanges(),this._subscribeToTabLabels(),this._tabsSubscription=this._tabs.changes.subscribe(()=>{let A=this._clampTabIndex(this._indexToSelect);if(A===this._selectedIndex){let i=this._tabs.toArray(),n;for(let o=0;o{i[A].isActive=!0,this.selectedTabChange.emit(this._createChangeEvent(A))})}this._changeDetectorRef.markForCheck()})}_subscribeToAllTabChanges(){this._allTabs.changes.pipe(Pn(this._allTabs)).subscribe(A=>{this._tabs.reset(A.filter(i=>i._closestTabGroup===this||!i._closestTabGroup)),this._tabs.notifyOnChanges()})}ngOnDestroy(){this._tabs.destroy(),this._tabsSubscription.unsubscribe(),this._tabLabelSubscription.unsubscribe()}realignInkBar(){this._tabHeader&&this._tabHeader._alignInkBarToSelectedTab()}updatePagination(){this._tabHeader&&this._tabHeader.updatePagination()}focusTab(A){let i=this._tabHeader;i&&(i.focusIndex=A)}_focusChanged(A){this._lastFocusedTabIndex=A,this.focusChange.emit(this._createChangeEvent(A))}_createChangeEvent(A){let i=new OG;return i.index=A,this._tabs&&this._tabs.length&&(i.tab=this._tabs.toArray()[A]),i}_subscribeToTabLabels(){this._tabLabelSubscription&&this._tabLabelSubscription.unsubscribe(),this._tabLabelSubscription=zn(...this._tabs.map(A=>A._stateChanges)).subscribe(()=>this._changeDetectorRef.markForCheck())}_clampTabIndex(A){return Math.min(this._tabs.length-1,Math.max(A||0,0))}_getTabLabelId(A){return`${this._groupId}-label-${A}`}_getTabContentId(A){return`${this._groupId}-content-${A}`}_setTabBodyWrapperHeight(A){if(!this.dynamicHeight||!this._tabBodyWrapperHeight)return;let i=this._tabBodyWrapper.nativeElement;i.style.height=this._tabBodyWrapperHeight+"px",this._tabBodyWrapper.nativeElement.offsetHeight&&(i.style.height=A+"px")}_removeTabBodyWrapperHeight(){let A=this._tabBodyWrapper.nativeElement;this._tabBodyWrapperHeight=A.clientHeight,A.style.height="",this.animationDone.emit()}_handleClick(A,i,n){i.focusIndex=n,A.disabled||(this.selectedIndex=n)}_getTabIndex(A){let i=this._lastFocusedTabIndex??this.selectedIndex;return A===i?0:-1}_tabFocusChanged(A,i){A&&A!=="mouse"&&A!=="touch"&&(this._tabHeader.focusIndex=i)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-tab-group"]],contentQueries:function(i,n,o){if(i&1&&ci(o,mf,5),i&2){let r;XA(r=$A())&&(n._allTabs=r)}},viewQuery:function(i,n){if(i&1&&(Te(uOA,5),Te(fOA,5)),i&2){let o;XA(o=$A())&&(n._tabBodyWrapper=o.first),XA(o=$A())&&(n._tabHeader=o.first)}},hostAttrs:[1,"mat-mdc-tab-group"],hostVars:11,hostBindings:function(i,n){i&2&&(Ne("mat-align-tabs",n.alignTabs),fo("mat-"+(n.color||"primary")),uo("--mat-tab-animation-duration",n.animationDuration),ue("mat-mdc-tab-group-dynamic-height",n.dynamicHeight)("mat-mdc-tab-group-inverted-header",n.headerPosition==="below")("mat-mdc-tab-group-stretch-tabs",n.stretchTabs))},inputs:{color:"color",fitInkBarToContent:[2,"fitInkBarToContent","fitInkBarToContent",ie],stretchTabs:[2,"mat-stretch-tabs","stretchTabs",ie],alignTabs:[0,"mat-align-tabs","alignTabs"],dynamicHeight:[2,"dynamicHeight","dynamicHeight",ie],selectedIndex:[2,"selectedIndex","selectedIndex",zi],headerPosition:"headerPosition",animationDuration:"animationDuration",contentTabIndex:[2,"contentTabIndex","contentTabIndex",zi],disablePagination:[2,"disablePagination","disablePagination",ie],disableRipple:[2,"disableRipple","disableRipple",ie],preserveContent:[2,"preserveContent","preserveContent",ie],backgroundColor:"backgroundColor",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"]},outputs:{selectedIndexChange:"selectedIndexChange",focusChange:"focusChange",animationDone:"animationDone",selectedTabChange:"selectedTabChange"},exportAs:["matTabGroup"],features:[ht([{provide:JcA,useExisting:t}])],ngContentSelectors:PG,decls:9,vars:8,consts:[["tabHeader",""],["tabBodyWrapper",""],["tabNode",""],[3,"indexFocused","selectFocusedIndex","selectedIndex","disableRipple","disablePagination","aria-label","aria-labelledby"],["role","tab","matTabLabelWrapper","","cdkMonitorElementFocus","",1,"mdc-tab","mat-mdc-tab","mat-focus-indicator",3,"id","mdc-tab--active","class","disabled","fitInkBarToContent"],[1,"mat-mdc-tab-body-wrapper"],["role","tabpanel",3,"id","mat-mdc-tab-body-active","class","content","position","origin","animationDuration","preserveContent"],["role","tab","matTabLabelWrapper","","cdkMonitorElementFocus","",1,"mdc-tab","mat-mdc-tab","mat-focus-indicator",3,"click","cdkFocusChange","id","disabled","fitInkBarToContent"],[1,"mdc-tab__ripple"],["mat-ripple","",1,"mat-mdc-tab-ripple",3,"matRippleTrigger","matRippleDisabled"],[1,"mdc-tab__content"],[1,"mdc-tab__text-label"],[3,"cdkPortalOutlet"],["role","tabpanel",3,"_onCentered","_onCentering","id","content","position","origin","animationDuration","preserveContent"]],template:function(i,n){if(i&1){let o=be();jt(),S(0,"mat-tab-header",3,0),hA("indexFocused",function(s){return RA(o),xA(n._focusChanged(s))})("selectFocusedIndex",function(s){return RA(o),xA(n.selectedIndex=s)}),Dn(2,DOA,8,17,"div",4,to),F(),_A(4,yOA,1,0),S(5,"div",5,1),Dn(7,vOA,1,13,"mat-tab-body",6,to),F()}i&2&&(yA("selectedIndex",n.selectedIndex||0)("disableRipple",n.disableRipple)("disablePagination",n.disablePagination)("aria-label",n.ariaLabel)("aria-labelledby",n.ariaLabelledby),G(2),yn(n._tabs),G(2),GA(n._isServer?4:-1),G(),ue("_mat-animation-noopable",n._animationMode==="NoopAnimations"),G(2),yn(n._tabs))},dependencies:[FOA,TcA,PO,rs,fa,HcA],styles:['.mdc-tab{min-width:90px;padding:0 24px;display:flex;flex:1 0 auto;justify-content:center;box-sizing:border-box;border:none;outline:none;text-align:center;white-space:nowrap;cursor:pointer;z-index:1}.mdc-tab__content{display:flex;align-items:center;justify-content:center;height:inherit;pointer-events:none}.mdc-tab__text-label{transition:150ms color linear;display:inline-block;line-height:1;z-index:2}.mdc-tab--active .mdc-tab__text-label{transition-delay:100ms}._mat-animation-noopable .mdc-tab__text-label{transition:none}.mdc-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.mdc-tab-indicator__content{transition:var(--mat-tab-animation-duration, 250ms) transform cubic-bezier(0.4, 0, 0.2, 1);transform-origin:left;opacity:0}.mdc-tab-indicator__content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:1}._mat-animation-noopable .mdc-tab-indicator__content,.mdc-tab-indicator--no-transition .mdc-tab-indicator__content{transition:none}.mat-mdc-tab-ripple.mat-mdc-tab-ripple{position:absolute;top:0;left:0;bottom:0;right:0;pointer-events:none}.mat-mdc-tab{-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none;background:none;height:var(--mdc-secondary-navigation-tab-container-height, 48px);font-family:var(--mat-tab-header-label-text-font, var(--mat-sys-title-small-font));font-size:var(--mat-tab-header-label-text-size, var(--mat-sys-title-small-size));letter-spacing:var(--mat-tab-header-label-text-tracking, var(--mat-sys-title-small-tracking));line-height:var(--mat-tab-header-label-text-line-height, var(--mat-sys-title-small-line-height));font-weight:var(--mat-tab-header-label-text-weight, var(--mat-sys-title-small-weight))}.mat-mdc-tab.mdc-tab{flex-grow:0}.mat-mdc-tab .mdc-tab-indicator__content--underline{border-color:var(--mdc-tab-indicator-active-indicator-color, var(--mat-sys-primary));border-top-width:var(--mdc-tab-indicator-active-indicator-height, 2px);border-radius:var(--mdc-tab-indicator-active-indicator-shape, 0)}.mat-mdc-tab:hover .mdc-tab__text-label{color:var(--mat-tab-header-inactive-hover-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab:focus .mdc-tab__text-label{color:var(--mat-tab-header-inactive-focus-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active .mdc-tab__text-label{color:var(--mat-tab-header-active-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active .mdc-tab__ripple::before,.mat-mdc-tab.mdc-tab--active .mat-ripple-element{background-color:var(--mat-tab-header-active-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab__text-label{color:var(--mat-tab-header-active-hover-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-active-hover-indicator-color, var(--mat-sys-primary))}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab__text-label{color:var(--mat-tab-header-active-focus-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-active-focus-indicator-color, var(--mat-sys-primary))}.mat-mdc-tab.mat-mdc-tab-disabled{opacity:.4;pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__content{pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__ripple::before,.mat-mdc-tab.mat-mdc-tab-disabled .mat-ripple-element{background-color:var(--mat-tab-header-disabled-ripple-color)}.mat-mdc-tab .mdc-tab__ripple::before{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;background-color:var(--mat-tab-header-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-header-inactive-label-text-color, var(--mat-sys-on-surface));display:inline-flex;align-items:center}.mat-mdc-tab .mdc-tab__content{position:relative;pointer-events:auto}.mat-mdc-tab:hover .mdc-tab__ripple::before{opacity:.04}.mat-mdc-tab.cdk-program-focused .mdc-tab__ripple::before,.mat-mdc-tab.cdk-keyboard-focused .mdc-tab__ripple::before{opacity:.12}.mat-mdc-tab .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-header-inactive-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-tab-group.mat-mdc-tab-group-stretch-tabs>.mat-mdc-tab-header .mat-mdc-tab{flex-grow:1}.mat-mdc-tab-group{display:flex;flex-direction:column;max-width:100%}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination{background-color:var(--mat-tab-header-with-background-background-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-focus-indicator::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-focus-indicator::before{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mdc-tab__ripple::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mdc-tab__ripple::before{background-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header{flex-direction:column-reverse}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header .mdc-tab-indicator__content--underline{align-self:flex-start}.mat-mdc-tab-body-wrapper{position:relative;overflow:hidden;display:flex;transition:height 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable{transition:none !important;animation:none !important}'],encapsulation:2})}return t})(),OG=class{index;tab};var zcA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[it,it]})}return t})();function KOA(t,e){t&1&&JA(0,"div",2)}var YOA=new dA("MAT_PROGRESS_BAR_DEFAULT_OPTIONS");var jcA=(()=>{class t{_elementRef=f(ee);_ngZone=f(Qe);_changeDetectorRef=f(It);_renderer=f(Wi);_cleanupTransitionEnd;_animationMode=f(Si,{optional:!0});constructor(){let A=f(YOA,{optional:!0});this._isNoopAnimation=this._animationMode==="NoopAnimations",A&&(A.color&&(this.color=this._defaultColor=A.color),this.mode=A.mode||this.mode)}_isNoopAnimation=!1;get color(){return this._color||this._defaultColor}set color(A){this._color=A}_color;_defaultColor="primary";get value(){return this._value}set value(A){this._value=PcA(A||0),this._changeDetectorRef.markForCheck()}_value=0;get bufferValue(){return this._bufferValue||0}set bufferValue(A){this._bufferValue=PcA(A||0),this._changeDetectorRef.markForCheck()}_bufferValue=0;animationEnd=new WA;get mode(){return this._mode}set mode(A){this._mode=A,this._changeDetectorRef.markForCheck()}_mode="determinate";ngAfterViewInit(){this._ngZone.runOutsideAngular(()=>{this._cleanupTransitionEnd=this._renderer.listen(this._elementRef.nativeElement,"transitionend",this._transitionendHandler)})}ngOnDestroy(){this._cleanupTransitionEnd?.()}_getPrimaryBarTransform(){return`scaleX(${this._isIndeterminate()?1:this.value/100})`}_getBufferBarFlexBasis(){return`${this.mode==="buffer"?this.bufferValue:100}%`}_isIndeterminate(){return this.mode==="indeterminate"||this.mode==="query"}_transitionendHandler=A=>{this.animationEnd.observers.length===0||!A.target||!A.target.classList.contains("mdc-linear-progress__primary-bar")||(this.mode==="determinate"||this.mode==="buffer")&&this._ngZone.run(()=>this.animationEnd.next({value:this.value}))};static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-progress-bar"]],hostAttrs:["role","progressbar","aria-valuemin","0","aria-valuemax","100","tabindex","-1",1,"mat-mdc-progress-bar","mdc-linear-progress"],hostVars:10,hostBindings:function(i,n){i&2&&(Ne("aria-valuenow",n._isIndeterminate()?null:n.value)("mode",n.mode),fo("mat-"+n.color),ue("_mat-animation-noopable",n._isNoopAnimation)("mdc-linear-progress--animation-ready",!n._isNoopAnimation)("mdc-linear-progress--indeterminate",n._isIndeterminate()))},inputs:{color:"color",value:[2,"value","value",zi],bufferValue:[2,"bufferValue","bufferValue",zi],mode:"mode"},outputs:{animationEnd:"animationEnd"},exportAs:["matProgressBar"],decls:7,vars:5,consts:[["aria-hidden","true",1,"mdc-linear-progress__buffer"],[1,"mdc-linear-progress__buffer-bar"],[1,"mdc-linear-progress__buffer-dots"],["aria-hidden","true",1,"mdc-linear-progress__bar","mdc-linear-progress__primary-bar"],[1,"mdc-linear-progress__bar-inner"],["aria-hidden","true",1,"mdc-linear-progress__bar","mdc-linear-progress__secondary-bar"]],template:function(i,n){i&1&&(S(0,"div",0),JA(1,"div",1),_A(2,KOA,1,0,"div",2),F(),S(3,"div",3),JA(4,"span",4),F(),S(5,"div",5),JA(6,"span",4),F()),i&2&&(G(),uo("flex-basis",n._getBufferBarFlexBasis()),G(),GA(n.mode==="buffer"?2:-1),G(),uo("transform",n._getPrimaryBarTransform()))},styles:[`.mat-mdc-progress-bar{display:block;text-align:start}.mat-mdc-progress-bar[mode=query]{transform:scaleX(-1)}.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__buffer-dots,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__primary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__secondary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__bar-inner.mdc-linear-progress__bar-inner{animation:none}.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__primary-bar,.mat-mdc-progress-bar._mat-animation-noopable .mdc-linear-progress__buffer-bar{transition:transform 1ms}.mdc-linear-progress{position:relative;width:100%;transform:translateZ(0);outline:1px solid rgba(0,0,0,0);overflow-x:hidden;transition:opacity 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);height:max(var(--mdc-linear-progress-track-height, 4px),var(--mdc-linear-progress-active-indicator-height, 4px))}@media(forced-colors: active){.mdc-linear-progress{outline-color:CanvasText}}.mdc-linear-progress__bar{position:absolute;top:0;bottom:0;margin:auto 0;width:100%;animation:none;transform-origin:top left;transition:transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);height:var(--mdc-linear-progress-active-indicator-height, 4px)}.mdc-linear-progress--indeterminate .mdc-linear-progress__bar{transition:none}[dir=rtl] .mdc-linear-progress__bar{right:0;transform-origin:center right}.mdc-linear-progress__bar-inner{display:inline-block;position:absolute;width:100%;animation:none;border-top-style:solid;border-color:var(--mdc-linear-progress-active-indicator-color, var(--mat-sys-primary));border-top-width:var(--mdc-linear-progress-active-indicator-height, 4px)}.mdc-linear-progress__buffer{display:flex;position:absolute;top:0;bottom:0;margin:auto 0;width:100%;overflow:hidden;height:var(--mdc-linear-progress-track-height, 4px);border-radius:var(--mdc-linear-progress-track-shape, var(--mat-sys-corner-none))}.mdc-linear-progress__buffer-dots{-webkit-mask-image:url("data:image/svg+xml,%3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' enable-background='new 0 0 5 2' xml:space='preserve' viewBox='0 0 5 2' preserveAspectRatio='xMinYMin slice'%3E%3Ccircle cx='1' cy='1' r='1'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' enable-background='new 0 0 5 2' xml:space='preserve' viewBox='0 0 5 2' preserveAspectRatio='xMinYMin slice'%3E%3Ccircle cx='1' cy='1' r='1'/%3E%3C/svg%3E");background-repeat:repeat-x;flex:auto;transform:rotate(180deg);animation:mdc-linear-progress-buffering 250ms infinite linear;background-color:var(--mdc-linear-progress-track-color, var(--mat-sys-surface-variant))}@media(forced-colors: active){.mdc-linear-progress__buffer-dots{background-color:ButtonBorder}}[dir=rtl] .mdc-linear-progress__buffer-dots{animation:mdc-linear-progress-buffering-reverse 250ms infinite linear;transform:rotate(0)}.mdc-linear-progress__buffer-bar{flex:0 1 100%;transition:flex-basis 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);background-color:var(--mdc-linear-progress-track-color, var(--mat-sys-surface-variant))}.mdc-linear-progress__primary-bar{transform:scaleX(0)}.mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar{left:-145.166611%}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar{animation:mdc-linear-progress-primary-indeterminate-translate 2s infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar>.mdc-linear-progress__bar-inner{animation:mdc-linear-progress-primary-indeterminate-scale 2s infinite linear}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--animation-ready .mdc-linear-progress__primary-bar{animation-name:mdc-linear-progress-primary-indeterminate-translate-reverse}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar{right:-145.166611%;left:auto}.mdc-linear-progress__secondary-bar{display:none}.mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar{left:-54.888891%;display:block}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar{animation:mdc-linear-progress-secondary-indeterminate-translate 2s infinite linear}.mdc-linear-progress--indeterminate.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar>.mdc-linear-progress__bar-inner{animation:mdc-linear-progress-secondary-indeterminate-scale 2s infinite linear}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--animation-ready .mdc-linear-progress__secondary-bar{animation-name:mdc-linear-progress-secondary-indeterminate-translate-reverse}[dir=rtl] .mdc-linear-progress.mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar{right:-54.888891%;left:auto}@keyframes mdc-linear-progress-buffering{from{transform:rotate(180deg) translateX(calc(var(--mdc-linear-progress-track-height, 4px) * -2.5))}}@keyframes mdc-linear-progress-primary-indeterminate-translate{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(83.67142%)}100%{transform:translateX(200.611057%)}}@keyframes mdc-linear-progress-primary-indeterminate-scale{0%{transform:scaleX(0.08)}36.65%{animation-timing-function:cubic-bezier(0.334731, 0.12482, 0.785844, 1);transform:scaleX(0.08)}69.15%{animation-timing-function:cubic-bezier(0.06, 0.11, 0.6, 1);transform:scaleX(0.661479)}100%{transform:scaleX(0.08)}}@keyframes mdc-linear-progress-secondary-indeterminate-translate{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(84.386165%)}100%{transform:translateX(160.277782%)}}@keyframes mdc-linear-progress-secondary-indeterminate-scale{0%{animation-timing-function:cubic-bezier(0.205028, 0.057051, 0.57661, 0.453971);transform:scaleX(0.08)}19.15%{animation-timing-function:cubic-bezier(0.152313, 0.196432, 0.648374, 1.004315);transform:scaleX(0.457104)}44.15%{animation-timing-function:cubic-bezier(0.257759, -0.003163, 0.211762, 1.38179);transform:scaleX(0.72796)}100%{transform:scaleX(0.08)}}@keyframes mdc-linear-progress-primary-indeterminate-translate-reverse{0%{transform:translateX(0)}20%{animation-timing-function:cubic-bezier(0.5, 0, 0.701732, 0.495819);transform:translateX(0)}59.15%{animation-timing-function:cubic-bezier(0.302435, 0.381352, 0.55, 0.956352);transform:translateX(-83.67142%)}100%{transform:translateX(-200.611057%)}}@keyframes mdc-linear-progress-secondary-indeterminate-translate-reverse{0%{animation-timing-function:cubic-bezier(0.15, 0, 0.515058, 0.409685);transform:translateX(0)}25%{animation-timing-function:cubic-bezier(0.31033, 0.284058, 0.8, 0.733712);transform:translateX(-37.651913%)}48.35%{animation-timing-function:cubic-bezier(0.4, 0.627035, 0.6, 0.902026);transform:translateX(-84.386165%)}100%{transform:translateX(-160.277782%)}}@keyframes mdc-linear-progress-buffering-reverse{from{transform:translateX(-10px)}}`],encapsulation:2,changeDetection:0})}return t})();function PcA(t,e=0,A=100){return Math.max(e,Math.min(A,t))}var qcA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[it]})}return t})();function WG(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var sd=WG();function AlA(t){sd=t}var Df={exec:()=>null};function Zn(t,e=""){let A=typeof t=="string"?t:t.source,i={replace:(n,o)=>{let r=typeof o=="string"?o:o.source;return r=r.replace(ea.caret,"$1"),A=A.replace(n,r),i},getRegex:()=>new RegExp(A,e)};return i}var ea={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] /,listReplaceTask:/^\[[ xX]\] +/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:t=>new RegExp(`^( {0,3}${t})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}#`),htmlBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}<(?:[a-z].*>|!--)`,"i")},TOA=/^(?:[ \t]*(?:\n|$))+/,HOA=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,zOA=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,yf=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,OOA=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,XG=/(?:[*+-]|\d{1,9}[.)])/,elA=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,tlA=Zn(elA).replace(/bull/g,XG).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),POA=Zn(elA).replace(/bull/g,XG).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),$G=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,jOA=/^[^\n]+/,AU=/(?!\s*\])(?:\\.|[^\[\]\\])+/,qOA=Zn(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",AU).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),VOA=Zn(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,XG).getRegex(),l7="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",eU=/|$))/,ZOA=Zn("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",eU).replace("tag",l7).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),ilA=Zn($G).replace("hr",yf).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",l7).getRegex(),WOA=Zn(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",ilA).getRegex(),tU={blockquote:WOA,code:HOA,def:qOA,fences:zOA,heading:OOA,hr:yf,html:ZOA,lheading:tlA,list:VOA,newline:TOA,paragraph:ilA,table:Df,text:jOA},VcA=Zn("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",yf).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",l7).getRegex(),XOA=Ye(rA({},tU),{lheading:POA,table:VcA,paragraph:Zn($G).replace("hr",yf).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",VcA).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",l7).getRegex()}),$OA=Ye(rA({},tU),{html:Zn(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",eU).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Df,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:Zn($G).replace("hr",yf).replace("heading",` *#{1,6} *[^ -]`).replace("lheading",tlA).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()}),APA=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,ePA=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,nlA=/^( {2,}|\\)\n(?!\s*$)/,tPA=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g,slA=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,sPA=Zn(slA,"u").replace(/punct/g,g7).getRegex(),aPA=Zn(slA,"u").replace(/punct/g,rlA).getRegex(),alA="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",cPA=Zn(alA,"gu").replace(/notPunctSpace/g,olA).replace(/punctSpace/g,iU).replace(/punct/g,g7).getRegex(),lPA=Zn(alA,"gu").replace(/notPunctSpace/g,oPA).replace(/punctSpace/g,nPA).replace(/punct/g,rlA).getRegex(),gPA=Zn("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,olA).replace(/punctSpace/g,iU).replace(/punct/g,g7).getRegex(),IPA=Zn(/\\(punct)/,"gu").replace(/punct/g,g7).getRegex(),CPA=Zn(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[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])?)+(?![-_])/).getRegex(),dPA=Zn(eU).replace("(?:-->|$)","-->").getRegex(),BPA=Zn("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",dPA).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),a7=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,EPA=Zn(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",a7).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),clA=Zn(/^!?\[(label)\]\[(ref)\]/).replace("label",a7).replace("ref",AU).getRegex(),llA=Zn(/^!?\[(ref)\](?:\[\])?/).replace("ref",AU).getRegex(),QPA=Zn("reflink|nolink(?!\\()","g").replace("reflink",clA).replace("nolink",llA).getRegex(),nU={_backpedal:Df,anyPunctuation:IPA,autolink:CPA,blockSkip:rPA,br:nlA,code:ePA,del:Df,emStrongLDelim:sPA,emStrongRDelimAst:cPA,emStrongRDelimUnd:gPA,escape:APA,link:EPA,nolink:llA,punctuation:iPA,reflink:clA,reflinkSearch:QPA,tag:BPA,text:tPA,url:Df},hPA=Ye(rA({},nU),{link:Zn(/^!?\[(label)\]\((.*?)\)/).replace("label",a7).getRegex(),reflink:Zn(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",a7).getRegex()}),qG=Ye(rA({},nU),{emStrongRDelimAst:lPA,emStrongLDelim:aPA,url:Zn(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,"i").replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\.|[^\\])*?(?:\\.|[^\s~\\]))\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},ZcA=t=>fPA[t];function A0(t,e){if(e){if(ea.escapeTest.test(t))return t.replace(ea.escapeReplace,ZcA)}else if(ea.escapeTestNoEncode.test(t))return t.replace(ea.escapeReplaceNoEncode,ZcA);return t}function WcA(t){try{t=encodeURI(t).replace(ea.percentDecode,"%")}catch{return null}return t}function XcA(t,e){let A=t.replace(ea.findPipe,(o,r,s)=>{let a=!1,c=r;for(;--c>=0&&s[c]==="\\";)a=!a;return a?"|":" |"}),i=A.split(ea.splitPipe),n=0;if(i[0].trim()||i.shift(),i.length>0&&!i.at(-1)?.trim()&&i.pop(),e)if(i.length>e)i.splice(e);else for(;i.length0?-2:-1}function $cA(t,e,A,i,n){let o=e.href,r=e.title||null,s=t[1].replace(n.other.outputLinkReplace,"$1");i.state.inLink=!0;let a={type:t[0].charAt(0)==="!"?"image":"link",raw:A,href:o,title:r,text:s,tokens:i.inlineTokens(s)};return i.state.inLink=!1,a}function pPA(t,e,A){let i=t.match(A.other.indentCodeCompensation);if(i===null)return e;let n=i[1];return e.split(` -`).map(o=>{let r=o.match(A.other.beginningSpace);if(r===null)return o;let[s]=r;return s.length>=n.length?o.slice(n.length):o}).join(` -`)}var c7=class{options;rules;lexer;constructor(t){this.options=t||sd}space(t){let e=this.rules.block.newline.exec(t);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(t){let e=this.rules.block.code.exec(t);if(e){let A=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?A:wf(A,` -`)}}}fences(t){let e=this.rules.block.fences.exec(t);if(e){let A=e[0],i=pPA(A,e[3]||"",this.rules);return{type:"code",raw:A,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:i}}}heading(t){let e=this.rules.block.heading.exec(t);if(e){let A=e[2].trim();if(this.rules.other.endingHash.test(A)){let i=wf(A,"#");(this.options.pedantic||!i||this.rules.other.endingSpaceChar.test(i))&&(A=i.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:A,tokens:this.lexer.inline(A)}}}hr(t){let e=this.rules.block.hr.exec(t);if(e)return{type:"hr",raw:wf(e[0],` -`)}}blockquote(t){let e=this.rules.block.blockquote.exec(t);if(e){let A=wf(e[0],` -`).split(` -`),i="",n="",o=[];for(;A.length>0;){let r=!1,s=[],a;for(a=0;a1,n={type:"list",raw:"",ordered:i,start:i?+A.slice(0,-1):"",loose:!1,items:[]};A=i?`\\d{1,9}\\${A.slice(-1)}`:`\\${A}`,this.options.pedantic&&(A=i?A:"[*+-]");let o=this.rules.other.listItemRegex(A),r=!1;for(;t;){let a=!1,c="",l="";if(!(e=o.exec(t))||this.rules.block.hr.test(t))break;c=e[0],t=t.substring(c.length);let I=e[2].split(` -`,1)[0].replace(this.rules.other.listReplaceTabs,u=>" ".repeat(3*u.length)),C=t.split(` -`,1)[0],d=!I.trim(),B=0;if(this.options.pedantic?(B=2,l=I.trimStart()):d?B=e[1].length+1:(B=e[2].search(this.rules.other.nonSpaceChar),B=B>4?1:B,l=I.slice(B),B+=e[1].length),d&&this.rules.other.blankLine.test(C)&&(c+=C+` -`,t=t.substring(C.length+1),a=!0),!a){let u=this.rules.other.nextBulletRegex(B),D=this.rules.other.hrRegex(B),L=this.rules.other.fencesBeginRegex(B),R=this.rules.other.headingBeginRegex(B),w=this.rules.other.htmlBeginRegex(B);for(;t;){let _=t.split(` -`,1)[0],K;if(C=_,this.options.pedantic?(C=C.replace(this.rules.other.listReplaceNesting," "),K=C):K=C.replace(this.rules.other.tabCharGlobal," "),L.test(C)||R.test(C)||w.test(C)||u.test(C)||D.test(C))break;if(K.search(this.rules.other.nonSpaceChar)>=B||!C.trim())l+=` -`+K.slice(B);else{if(d||I.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||L.test(I)||R.test(I)||D.test(I))break;l+=` -`+C}!d&&!C.trim()&&(d=!0),c+=_+` -`,t=t.substring(_.length+1),I=K.slice(B)}}n.loose||(r?n.loose=!0:this.rules.other.doubleBlankLine.test(c)&&(r=!0));let E=null,h;this.options.gfm&&(E=this.rules.other.listIsTask.exec(l),E&&(h=E[0]!=="[ ] ",l=l.replace(this.rules.other.listReplaceTask,""))),n.items.push({type:"list_item",raw:c,task:!!E,checked:h,loose:!1,text:l,tokens:[]}),n.raw+=c}let s=n.items.at(-1);if(s)s.raw=s.raw.trimEnd(),s.text=s.text.trimEnd();else return;n.raw=n.raw.trimEnd();for(let a=0;aI.type==="space"),l=c.length>0&&c.some(I=>this.rules.other.anyLine.test(I.raw));n.loose=l}if(n.loose)for(let a=0;a({text:s,tokens:this.lexer.inline(s),header:!1,align:o.align[a]})));return o}}lheading(t){let e=this.rules.block.lheading.exec(t);if(e)return{type:"heading",raw:e[0],depth:e[2].charAt(0)==="="?1:2,text:e[1],tokens:this.lexer.inline(e[1])}}paragraph(t){let e=this.rules.block.paragraph.exec(t);if(e){let A=e[1].charAt(e[1].length-1)===` -`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:A,tokens:this.lexer.inline(A)}}}text(t){let e=this.rules.block.text.exec(t);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(t){let e=this.rules.inline.escape.exec(t);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(t){let e=this.rules.inline.tag.exec(t);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(t){let e=this.rules.inline.link.exec(t);if(e){let A=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(A)){if(!this.rules.other.endAngleBracket.test(A))return;let o=wf(A.slice(0,-1),"\\");if((A.length-o.length)%2===0)return}else{let o=mPA(e[2],"()");if(o===-2)return;if(o>-1){let s=(e[0].indexOf("!")===0?5:4)+e[1].length+o;e[2]=e[2].substring(0,o),e[0]=e[0].substring(0,s).trim(),e[3]=""}}let i=e[2],n="";if(this.options.pedantic){let o=this.rules.other.pedanticHrefTitle.exec(i);o&&(i=o[1],n=o[3])}else n=e[3]?e[3].slice(1,-1):"";return i=i.trim(),this.rules.other.startAngleBracket.test(i)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(A)?i=i.slice(1):i=i.slice(1,-1)),$cA(e,{href:i&&i.replace(this.rules.inline.anyPunctuation,"$1"),title:n&&n.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(t,e){let A;if((A=this.rules.inline.reflink.exec(t))||(A=this.rules.inline.nolink.exec(t))){let i=(A[2]||A[1]).replace(this.rules.other.multipleSpaceGlobal," "),n=e[i.toLowerCase()];if(!n){let o=A[0].charAt(0);return{type:"text",raw:o,text:o}}return $cA(A,n,A[0],this.lexer,this.rules)}}emStrong(t,e,A=""){let i=this.rules.inline.emStrongLDelim.exec(t);if(!i||i[3]&&A.match(this.rules.other.unicodeAlphaNumeric))return;if(!(i[1]||i[2]||"")||!A||this.rules.inline.punctuation.exec(A)){let o=[...i[0]].length-1,r,s,a=o,c=0,l=i[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(l.lastIndex=0,e=e.slice(-1*t.length+o);(i=l.exec(e))!=null;){if(r=i[1]||i[2]||i[3]||i[4]||i[5]||i[6],!r)continue;if(s=[...r].length,i[3]||i[4]){a+=s;continue}else if((i[5]||i[6])&&o%3&&!((o+s)%3)){c+=s;continue}if(a-=s,a>0)continue;s=Math.min(s,s+a+c);let I=[...i[0]][0].length,C=t.slice(0,o+i.index+I+s);if(Math.min(o,s)%2){let B=C.slice(1,-1);return{type:"em",raw:C,text:B,tokens:this.lexer.inlineTokens(B)}}let d=C.slice(2,-2);return{type:"strong",raw:C,text:d,tokens:this.lexer.inlineTokens(d)}}}}codespan(t){let e=this.rules.inline.code.exec(t);if(e){let A=e[2].replace(this.rules.other.newLineCharGlobal," "),i=this.rules.other.nonSpaceChar.test(A),n=this.rules.other.startingSpaceChar.test(A)&&this.rules.other.endingSpaceChar.test(A);return i&&n&&(A=A.substring(1,A.length-1)),{type:"codespan",raw:e[0],text:A}}}br(t){let e=this.rules.inline.br.exec(t);if(e)return{type:"br",raw:e[0]}}del(t){let e=this.rules.inline.del.exec(t);if(e)return{type:"del",raw:e[0],text:e[2],tokens:this.lexer.inlineTokens(e[2])}}autolink(t){let e=this.rules.inline.autolink.exec(t);if(e){let A,i;return e[2]==="@"?(A=e[1],i="mailto:"+A):(A=e[1],i=A),{type:"link",raw:e[0],text:A,href:i,tokens:[{type:"text",raw:A,text:A}]}}}url(t){let e;if(e=this.rules.inline.url.exec(t)){let A,i;if(e[2]==="@")A=e[0],i="mailto:"+A;else{let n;do n=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(n!==e[0]);A=e[0],e[1]==="www."?i="http://"+e[0]:i=e[0]}return{type:"link",raw:e[0],text:A,href:i,tokens:[{type:"text",raw:A,text:A}]}}}inlineText(t){let e=this.rules.inline.text.exec(t);if(e){let A=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:A}}}},s2=class VG{tokens;options;state;tokenizer;inlineQueue;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||sd,this.options.tokenizer=this.options.tokenizer||new c7,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let A={other:ea,block:r7.normal,inline:pf.normal};this.options.pedantic?(A.block=r7.pedantic,A.inline=pf.pedantic):this.options.gfm&&(A.block=r7.gfm,this.options.breaks?A.inline=pf.breaks:A.inline=pf.gfm),this.tokenizer.rules=A}static get rules(){return{block:r7,inline:pf}}static lex(e,A){return new VG(A).lex(e)}static lexInline(e,A){return new VG(A).inlineTokens(e)}lex(e){e=e.replace(ea.carriageReturn,` -`),this.blockTokens(e,this.tokens);for(let A=0;A(n=r.call({lexer:this},e,A))?(e=e.substring(n.raw.length),A.push(n),!0):!1))continue;if(n=this.tokenizer.space(e)){e=e.substring(n.raw.length);let r=A.at(-1);n.raw.length===1&&r!==void 0?r.raw+=` -`:A.push(n);continue}if(n=this.tokenizer.code(e)){e=e.substring(n.raw.length);let r=A.at(-1);r?.type==="paragraph"||r?.type==="text"?(r.raw+=` -`+n.raw,r.text+=` -`+n.text,this.inlineQueue.at(-1).src=r.text):A.push(n);continue}if(n=this.tokenizer.fences(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.heading(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.hr(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.blockquote(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.list(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.html(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.def(e)){e=e.substring(n.raw.length);let r=A.at(-1);r?.type==="paragraph"||r?.type==="text"?(r.raw+=` -`+n.raw,r.text+=` -`+n.raw,this.inlineQueue.at(-1).src=r.text):this.tokens.links[n.tag]||(this.tokens.links[n.tag]={href:n.href,title:n.title});continue}if(n=this.tokenizer.table(e)){e=e.substring(n.raw.length),A.push(n);continue}if(n=this.tokenizer.lheading(e)){e=e.substring(n.raw.length),A.push(n);continue}let o=e;if(this.options.extensions?.startBlock){let r=1/0,s=e.slice(1),a;this.options.extensions.startBlock.forEach(c=>{a=c.call({lexer:this},s),typeof a=="number"&&a>=0&&(r=Math.min(r,a))}),r<1/0&&r>=0&&(o=e.substring(0,r+1))}if(this.state.top&&(n=this.tokenizer.paragraph(o))){let r=A.at(-1);i&&r?.type==="paragraph"?(r.raw+=` -`+n.raw,r.text+=` -`+n.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=r.text):A.push(n),i=o.length!==e.length,e=e.substring(n.raw.length);continue}if(n=this.tokenizer.text(e)){e=e.substring(n.raw.length);let r=A.at(-1);r?.type==="text"?(r.raw+=` -`+n.raw,r.text+=` -`+n.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=r.text):A.push(n);continue}if(e){let r="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(r);break}else throw new Error(r)}}return this.state.top=!0,A}inline(e,A=[]){return this.inlineQueue.push({src:e,tokens:A}),A}inlineTokens(e,A=[]){let i=e,n=null;if(this.tokens.links){let s=Object.keys(this.tokens.links);if(s.length>0)for(;(n=this.tokenizer.rules.inline.reflinkSearch.exec(i))!=null;)s.includes(n[0].slice(n[0].lastIndexOf("[")+1,-1))&&(i=i.slice(0,n.index)+"["+"a".repeat(n[0].length-2)+"]"+i.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(n=this.tokenizer.rules.inline.anyPunctuation.exec(i))!=null;)i=i.slice(0,n.index)+"++"+i.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;(n=this.tokenizer.rules.inline.blockSkip.exec(i))!=null;)i=i.slice(0,n.index)+"["+"a".repeat(n[0].length-2)+"]"+i.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);let o=!1,r="";for(;e;){o||(r=""),o=!1;let s;if(this.options.extensions?.inline?.some(c=>(s=c.call({lexer:this},e,A))?(e=e.substring(s.raw.length),A.push(s),!0):!1))continue;if(s=this.tokenizer.escape(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.tag(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.link(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(s.raw.length);let c=A.at(-1);s.type==="text"&&c?.type==="text"?(c.raw+=s.raw,c.text+=s.text):A.push(s);continue}if(s=this.tokenizer.emStrong(e,i,r)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.codespan(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.br(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.del(e)){e=e.substring(s.raw.length),A.push(s);continue}if(s=this.tokenizer.autolink(e)){e=e.substring(s.raw.length),A.push(s);continue}if(!this.state.inLink&&(s=this.tokenizer.url(e))){e=e.substring(s.raw.length),A.push(s);continue}let a=e;if(this.options.extensions?.startInline){let c=1/0,l=e.slice(1),I;this.options.extensions.startInline.forEach(C=>{I=C.call({lexer:this},l),typeof I=="number"&&I>=0&&(c=Math.min(c,I))}),c<1/0&&c>=0&&(a=e.substring(0,c+1))}if(s=this.tokenizer.inlineText(a)){e=e.substring(s.raw.length),s.raw.slice(-1)!=="_"&&(r=s.raw.slice(-1)),o=!0;let c=A.at(-1);c?.type==="text"?(c.raw+=s.raw,c.text+=s.text):A.push(s);continue}if(e){let c="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(c);break}else throw new Error(c)}}return A}},oI=class{options;parser;constructor(t){this.options=t||sd}space(t){return""}code({text:t,lang:e,escaped:A}){let i=(e||"").match(ea.notSpaceStart)?.[0],n=t.replace(ea.endingNewline,"")+` -`;return i?'
        '+(A?n:A0(n,!0))+`
        -`:"
        "+(A?n:A0(n,!0))+`
        -`}blockquote({tokens:t}){return`
        -${this.parser.parse(t)}
        -`}html({text:t}){return t}heading({tokens:t,depth:e}){return`${this.parser.parseInline(t)} -`}hr(t){return`
        -`}list(t){let e=t.ordered,A=t.start,i="";for(let r=0;r -`+i+" -`}listitem(t){let e="";if(t.task){let A=this.checkbox({checked:!!t.checked});t.loose?t.tokens[0]?.type==="paragraph"?(t.tokens[0].text=A+" "+t.tokens[0].text,t.tokens[0].tokens&&t.tokens[0].tokens.length>0&&t.tokens[0].tokens[0].type==="text"&&(t.tokens[0].tokens[0].text=A+" "+A0(t.tokens[0].tokens[0].text),t.tokens[0].tokens[0].escaped=!0)):t.tokens.unshift({type:"text",raw:A+" ",text:A+" ",escaped:!0}):e+=A+" "}return e+=this.parser.parse(t.tokens,!!t.loose),`
      • ${e}
      • -`}checkbox({checked:t}){return"'}paragraph({tokens:t}){return`

        ${this.parser.parseInline(t)}

        -`}table(t){let e="",A="";for(let n=0;n${i}`),` - -`+e+` -`+i+`
        -`}tablerow({text:t}){return` -${t} -`}tablecell(t){let e=this.parser.parseInline(t.tokens),A=t.header?"th":"td";return(t.align?`<${A} align="${t.align}">`:`<${A}>`)+e+` -`}strong({tokens:t}){return`${this.parser.parseInline(t)}`}em({tokens:t}){return`${this.parser.parseInline(t)}`}codespan({text:t}){return`${A0(t,!0)}`}br(t){return"
        "}del({tokens:t}){return`${this.parser.parseInline(t)}`}link({href:t,title:e,tokens:A}){let i=this.parser.parseInline(A),n=WcA(t);if(n===null)return i;t=n;let o='
        ",o}image({href:t,title:e,text:A,tokens:i}){i&&(A=this.parser.parseInline(i,this.parser.textRenderer));let n=WcA(t);if(n===null)return A0(A);t=n;let o=`${A}{let r=n[o].flat(1/0);A=A.concat(this.walkTokens(r,e))}):n.tokens&&(A=A.concat(this.walkTokens(n.tokens,e)))}}return A}use(...t){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return t.forEach(A=>{let i=rA({},A);if(i.async=this.defaults.async||i.async||!1,A.extensions&&(A.extensions.forEach(n=>{if(!n.name)throw new Error("extension name required");if("renderer"in n){let o=e.renderers[n.name];o?e.renderers[n.name]=function(...r){let s=n.renderer.apply(this,r);return s===!1&&(s=o.apply(this,r)),s}:e.renderers[n.name]=n.renderer}if("tokenizer"in n){if(!n.level||n.level!=="block"&&n.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let o=e[n.level];o?o.unshift(n.tokenizer):e[n.level]=[n.tokenizer],n.start&&(n.level==="block"?e.startBlock?e.startBlock.push(n.start):e.startBlock=[n.start]:n.level==="inline"&&(e.startInline?e.startInline.push(n.start):e.startInline=[n.start]))}"childTokens"in n&&n.childTokens&&(e.childTokens[n.name]=n.childTokens)}),i.extensions=e),A.renderer){let n=this.defaults.renderer||new oI(this.defaults);for(let o in A.renderer){if(!(o in n))throw new Error(`renderer '${o}' does not exist`);if(["options","parser"].includes(o))continue;let r=o,s=A.renderer[r],a=n[r];n[r]=(...c)=>{let l=s.apply(n,c);return l===!1&&(l=a.apply(n,c)),l||""}}i.renderer=n}if(A.tokenizer){let n=this.defaults.tokenizer||new c7(this.defaults);for(let o in A.tokenizer){if(!(o in n))throw new Error(`tokenizer '${o}' does not exist`);if(["options","rules","lexer"].includes(o))continue;let r=o,s=A.tokenizer[r],a=n[r];n[r]=(...c)=>{let l=s.apply(n,c);return l===!1&&(l=a.apply(n,c)),l}}i.tokenizer=n}if(A.hooks){let n=this.defaults.hooks||new s7;for(let o in A.hooks){if(!(o in n))throw new Error(`hook '${o}' does not exist`);if(["options","block"].includes(o))continue;let r=o,s=A.hooks[r],a=n[r];s7.passThroughHooks.has(o)?n[r]=c=>{if(this.defaults.async)return Promise.resolve(s.call(n,c)).then(I=>a.call(n,I));let l=s.call(n,c);return a.call(n,l)}:n[r]=(...c)=>{let l=s.apply(n,c);return l===!1&&(l=a.apply(n,c)),l}}i.hooks=n}if(A.walkTokens){let n=this.defaults.walkTokens,o=A.walkTokens;i.walkTokens=function(r){let s=[];return s.push(o.call(this,r)),n&&(s=s.concat(n.call(this,r))),s}}this.defaults=rA(rA({},this.defaults),i)}),this}setOptions(t){return this.defaults=rA(rA({},this.defaults),t),this}lexer(t,e){return s2.lex(t,e??this.defaults)}parser(t,e){return a2.parse(t,e??this.defaults)}parseMarkdown(t){return(A,i)=>{let n=rA({},i),o=rA(rA({},this.defaults),n),r=this.onError(!!o.silent,!!o.async);if(this.defaults.async===!0&&n.async===!1)return r(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof A>"u"||A===null)return r(new Error("marked(): input parameter is undefined or null"));if(typeof A!="string")return r(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(A)+", string expected"));o.hooks&&(o.hooks.options=o,o.hooks.block=t);let s=o.hooks?o.hooks.provideLexer():t?s2.lex:s2.lexInline,a=o.hooks?o.hooks.provideParser():t?a2.parse:a2.parseInline;if(o.async)return Promise.resolve(o.hooks?o.hooks.preprocess(A):A).then(c=>s(c,o)).then(c=>o.hooks?o.hooks.processAllTokens(c):c).then(c=>o.walkTokens?Promise.all(this.walkTokens(c,o.walkTokens)).then(()=>c):c).then(c=>a(c,o)).then(c=>o.hooks?o.hooks.postprocess(c):c).catch(r);try{o.hooks&&(A=o.hooks.preprocess(A));let c=s(A,o);o.hooks&&(c=o.hooks.processAllTokens(c)),o.walkTokens&&this.walkTokens(c,o.walkTokens);let l=a(c,o);return o.hooks&&(l=o.hooks.postprocess(l)),l}catch(c){return r(c)}}}onError(t,e){return A=>{if(A.message+=` -Please report this to https://github.com/markedjs/marked.`,t){let i="

        An error occurred:

        "+A0(A.message+"",!0)+"
        ";return e?Promise.resolve(i):i}if(e)return Promise.reject(A);throw A}}},rd=new wPA;function Mn(t,e){return rd.parse(t,e)}Mn.options=Mn.setOptions=function(t){return rd.setOptions(t),Mn.defaults=rd.defaults,AlA(Mn.defaults),Mn};Mn.getDefaults=WG;Mn.defaults=sd;Mn.use=function(...t){return rd.use(...t),Mn.defaults=rd.defaults,AlA(Mn.defaults),Mn};Mn.walkTokens=function(t,e){return rd.walkTokens(t,e)};Mn.parseInline=rd.parseInline;Mn.Parser=a2;Mn.parser=a2.parse;Mn.Renderer=oI;Mn.TextRenderer=oU;Mn.Lexer=s2;Mn.lexer=s2.lex;Mn.Tokenizer=c7;Mn.Hooks=s7;Mn.parse=Mn;var R7e=Mn.options,x7e=Mn.setOptions,L7e=Mn.use,F7e=Mn.walkTokens,N7e=Mn.parseInline;var _7e=a2.parse,G7e=s2.lex;var DPA=["*"],yPA="Copy",vPA="Copied",bPA=(()=>{class t{constructor(){this._buttonClick$=new OA,this.copied$=this._buttonClick$.pipe(jn(()=>zn(Me(!0),II(3e3).pipe(vd(!1)))),tl(),a0(1)),this.copiedText$=this.copied$.pipe(Pn(!1),je(A=>A?vPA:yPA))}onCopyToClipboardClick(){this._buttonClick$.next()}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275cmp=zA({type:t,selectors:[["markdown-clipboard"]],decls:4,vars:7,consts:[[1,"markdown-clipboard-button",3,"click"]],template:function(i,n){i&1&&(S(0,"button",0),Za(1,"async"),hA("click",function(){return n.onCopyToClipboardClick()}),AA(2),Za(3,"async"),F()),i&2&&(ue("copied",M2(1,3,n.copied$)),G(2),Gt(M2(3,5,n.copiedText$)))},dependencies:[Jh],encapsulation:2,changeDetection:0})}}return t})(),MPA=new dA("CLIPBOARD_OPTIONS");var rU=function(t){return t.CommandLine="command-line",t.LineHighlight="line-highlight",t.LineNumbers="line-numbers",t}(rU||{}),glA=new dA("MARKED_EXTENSIONS"),kPA=new dA("MARKED_OPTIONS"),SPA=new dA("MERMAID_OPTIONS"),RPA="[ngx-markdown] When using the `emoji` attribute you *have to* include Emoji-Toolkit files to `angular.json` or use imports. See README for more information",xPA="[ngx-markdown] When using the `katex` attribute you *have to* include KaTeX files to `angular.json` or use imports. See README for more information",LPA="[ngx-markdown] When using the `mermaid` attribute you *have to* include Mermaid files to `angular.json` or use imports. See README for more information",FPA="[ngx-markdown] When using the `clipboard` attribute you *have to* include Clipboard files to `angular.json` or use imports. See README for more information",NPA="[ngx-markdown] When using the `clipboard` attribute you *have to* provide the `viewContainerRef` parameter to `MarkdownService.render()` function",_PA="[ngx-markdown] When using the `src` attribute you *have to* pass the `HttpClient` as a parameter of the `forRoot` method. See README for more information",IlA=new dA("SECURITY_CONTEXT");var ClA=(()=>{class t{get options(){return this._options}set options(A){this._options=rA(rA({},this.DEFAULT_MARKED_OPTIONS),A)}get renderer(){return this.options.renderer}set renderer(A){this.options.renderer=A}constructor(A,i,n,o,r,s,a,c){this.clipboardOptions=A,this.extensions=i,this.mermaidOptions=o,this.platform=r,this.securityContext=s,this.http=a,this.sanitizer=c,this.DEFAULT_MARKED_OPTIONS={renderer:new oI},this.DEFAULT_KATEX_OPTIONS={delimiters:[{left:"$$",right:"$$",display:!0},{left:"$",right:"$",display:!1},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}]},this.DEFAULT_MERMAID_OPTIONS={startOnLoad:!1},this.DEFAULT_CLIPBOARD_OPTIONS={buttonComponent:void 0},this.DEFAULT_PARSE_OPTIONS={decodeHtml:!1,inline:!1,emoji:!1,mermaid:!1,markedOptions:void 0,disableSanitizer:!1},this.DEFAULT_RENDER_OPTIONS={clipboard:!1,clipboardOptions:void 0,katex:!1,katexOptions:void 0,mermaid:!1,mermaidOptions:void 0},this._reload$=new OA,this.reload$=this._reload$.asObservable(),this.options=n}parse(A,i=this.DEFAULT_PARSE_OPTIONS){let{decodeHtml:n,inline:o,emoji:r,mermaid:s,disableSanitizer:a}=i,c=rA(rA({},this.options),i.markedOptions),l=c.renderer||this.renderer||new oI;this.extensions&&(this.renderer=this.extendsRendererForExtensions(l)),s&&(this.renderer=this.extendsRendererForMermaid(l));let I=this.trimIndentation(A),C=n?this.decodeHtml(I):I,d=r?this.parseEmoji(C):C,B=this.parseMarked(d,c,o);return(a?B:this.sanitizer.sanitize(this.securityContext,B))||""}render(A,i=this.DEFAULT_RENDER_OPTIONS,n){let{clipboard:o,clipboardOptions:r,katex:s,katexOptions:a,mermaid:c,mermaidOptions:l}=i;s&&this.renderKatex(A,rA(rA({},this.DEFAULT_KATEX_OPTIONS),a)),c&&this.renderMermaid(A,rA(rA(rA({},this.DEFAULT_MERMAID_OPTIONS),this.mermaidOptions),l)),o&&this.renderClipboard(A,n,rA(rA(rA({},this.DEFAULT_CLIPBOARD_OPTIONS),this.clipboardOptions),r)),this.highlight(A)}reload(){this._reload$.next()}getSource(A){if(!this.http)throw new Error(_PA);return this.http.get(A,{responseType:"text"}).pipe(je(i=>this.handleExtension(A,i)))}highlight(A){if(!sg(this.platform)||typeof Prism>"u"||typeof Prism.highlightAllUnder>"u")return;A||(A=document);let i=A.querySelectorAll('pre code:not([class*="language-"])');Array.prototype.forEach.call(i,n=>n.classList.add("language-none")),Prism.highlightAllUnder(A)}decodeHtml(A){if(!sg(this.platform))return A;let i=document.createElement("textarea");return i.innerHTML=A,i.value}extendsRendererForExtensions(A){let i=A;return i.\u0275NgxMarkdownRendererExtendedForExtensions===!0||(this.extensions?.length>0&&Mn.use(...this.extensions),i.\u0275NgxMarkdownRendererExtendedForExtensions=!0),A}extendsRendererForMermaid(A){let i=A;if(i.\u0275NgxMarkdownRendererExtendedForMermaid===!0)return A;let n=A.code;return A.code=o=>o.lang==="mermaid"?`
        ${o.text}
        `:n(o),i.\u0275NgxMarkdownRendererExtendedForMermaid=!0,A}handleExtension(A,i){let n=A.lastIndexOf("://"),o=n>-1?A.substring(n+4):A,r=o.lastIndexOf("/"),s=r>-1?o.substring(r+1).split("?")[0]:"",a=s.lastIndexOf("."),c=a>-1?s.substring(a+1):"";return c&&c!=="md"?"```"+c+` -`+i+"\n```":i}parseMarked(A,i,n=!1){if(i.renderer){let o=rA({},i.renderer);delete o.\u0275NgxMarkdownRendererExtendedForExtensions,delete o.\u0275NgxMarkdownRendererExtendedForMermaid,delete i.renderer,Mn.use({renderer:o})}return n?Mn.parseInline(A,i):Mn.parse(A,i)}parseEmoji(A){if(!sg(this.platform))return A;if(typeof joypixels>"u"||typeof joypixels.shortnameToUnicode>"u")throw new Error(RPA);return joypixels.shortnameToUnicode(A)}renderKatex(A,i){if(sg(this.platform)){if(typeof katex>"u"||typeof renderMathInElement>"u")throw new Error(xPA);renderMathInElement(A,i)}}renderClipboard(A,i,n){if(!sg(this.platform))return;if(typeof ClipboardJS>"u")throw new Error(FPA);if(!i)throw new Error(NPA);let{buttonComponent:o,buttonTemplate:r}=n,s=A.querySelectorAll("pre");for(let a=0;aI.classList.add("hover"),l.onmouseleave=()=>I.classList.remove("hover");let C;if(o){let B=i.createComponent(o);C=B.hostView,B.changeDetectorRef.markForCheck()}else if(r)C=i.createEmbeddedView(r);else{let B=i.createComponent(bPA);C=B.hostView,B.changeDetectorRef.markForCheck()}let d;C.rootNodes.forEach(B=>{I.appendChild(B),d=new ClipboardJS(B,{text:()=>c.innerText})}),C.onDestroy(()=>d.destroy())}}renderMermaid(A,i=this.DEFAULT_MERMAID_OPTIONS){if(!sg(this.platform))return;if(typeof mermaid>"u"||typeof mermaid.initialize>"u")throw new Error(LPA);let n=A.querySelectorAll(".mermaid");n.length!==0&&(mermaid.initialize(i),mermaid.run({nodes:n}))}trimIndentation(A){if(!A)return"";let i;return A.split(` -`).map(n=>{let o=i;return n.length>0&&(o=isNaN(o)?n.search(/\S|$/):Math.min(n.search(/\S|$/),o)),isNaN(i)&&(i=o),o?n.substring(o):n}).join(` -`)}static{this.\u0275fac=function(i){return new(i||t)(we(MPA,8),we(glA,8),we(kPA,8),we(SPA,8),we(og),we(IlA),we(Ds,8),we(cl))}}static{this.\u0275prov=NA({token:t,factory:t.\u0275fac})}}return t})(),dlA=(()=>{class t{get disableSanitizer(){return this._disableSanitizer}set disableSanitizer(A){this._disableSanitizer=this.coerceBooleanProperty(A)}get inline(){return this._inline}set inline(A){this._inline=this.coerceBooleanProperty(A)}get clipboard(){return this._clipboard}set clipboard(A){this._clipboard=this.coerceBooleanProperty(A)}get emoji(){return this._emoji}set emoji(A){this._emoji=this.coerceBooleanProperty(A)}get katex(){return this._katex}set katex(A){this._katex=this.coerceBooleanProperty(A)}get mermaid(){return this._mermaid}set mermaid(A){this._mermaid=this.coerceBooleanProperty(A)}get lineHighlight(){return this._lineHighlight}set lineHighlight(A){this._lineHighlight=this.coerceBooleanProperty(A)}get lineNumbers(){return this._lineNumbers}set lineNumbers(A){this._lineNumbers=this.coerceBooleanProperty(A)}get commandLine(){return this._commandLine}set commandLine(A){this._commandLine=this.coerceBooleanProperty(A)}constructor(A,i,n){this.element=A,this.markdownService=i,this.viewContainerRef=n,this.error=new WA,this.load=new WA,this.ready=new WA,this._clipboard=!1,this._commandLine=!1,this._disableSanitizer=!1,this._emoji=!1,this._inline=!1,this._katex=!1,this._lineHighlight=!1,this._lineNumbers=!1,this._mermaid=!1,this.destroyed$=new OA}ngOnChanges(){this.loadContent()}loadContent(){if(this.data!=null){this.handleData();return}if(this.src!=null){this.handleSrc();return}}ngAfterViewInit(){!this.data&&!this.src&&this.handleTransclusion(),this.markdownService.reload$.pipe(St(this.destroyed$)).subscribe(()=>this.loadContent())}ngOnDestroy(){this.destroyed$.next(),this.destroyed$.complete()}render(A,i=!1){return Ao(this,null,function*(){let n={decodeHtml:i,inline:this.inline,emoji:this.emoji,mermaid:this.mermaid,disableSanitizer:this.disableSanitizer},o={clipboard:this.clipboard,clipboardOptions:this.getClipboardOptions(),katex:this.katex,katexOptions:this.katexOptions,mermaid:this.mermaid,mermaidOptions:this.mermaidOptions},r=yield this.markdownService.parse(A,n);this.element.nativeElement.innerHTML=r,this.handlePlugins(),this.markdownService.render(this.element.nativeElement,o,this.viewContainerRef),this.ready.emit()})}coerceBooleanProperty(A){return A!=null&&`${String(A)}`!="false"}getClipboardOptions(){if(this.clipboardButtonComponent||this.clipboardButtonTemplate)return{buttonComponent:this.clipboardButtonComponent,buttonTemplate:this.clipboardButtonTemplate}}handleData(){this.render(this.data)}handleSrc(){this.markdownService.getSource(this.src).subscribe({next:A=>{this.render(A).then(()=>{this.load.emit(A)})},error:A=>this.error.emit(A)})}handleTransclusion(){this.render(this.element.nativeElement.innerHTML,!0)}handlePlugins(){this.commandLine&&(this.setPluginClass(this.element.nativeElement,rU.CommandLine),this.setPluginOptions(this.element.nativeElement,{dataFilterOutput:this.filterOutput,dataHost:this.host,dataPrompt:this.prompt,dataOutput:this.output,dataUser:this.user})),this.lineHighlight&&this.setPluginOptions(this.element.nativeElement,{dataLine:this.line,dataLineOffset:this.lineOffset}),this.lineNumbers&&(this.setPluginClass(this.element.nativeElement,rU.LineNumbers),this.setPluginOptions(this.element.nativeElement,{dataStart:this.start}))}setPluginClass(A,i){let n=A.querySelectorAll("pre");for(let o=0;o{let s=i[r];if(s){let a=this.toLispCase(r);n.item(o).setAttribute(a,s.toString())}})}toLispCase(A){let i=A.match(/([A-Z])/g);if(!i)return A;let n=A.toString();for(let o=0,r=i.length;o{let i=UPA(A)?Ye(rA({},A),{multi:!0}):{provide:glA,useValue:A,multi:!0};return[...e,i]},[])}var BlA=(()=>{class t{static forRoot(A){return{ngModule:t,providers:[GPA(A)]}}static forChild(){return{ngModule:t}}static{this.\u0275fac=function(i){return new(i||t)}}static{this.\u0275mod=Ce({type:t})}static{this.\u0275inj=Ie({imports:[f0]})}}return t})();var JPA=["switch"],TPA=["*"];function HPA(t,e){t&1&&(S(0,"span",10),ar(),S(1,"svg",12),JA(2,"path",13),F(),S(3,"svg",14),JA(4,"path",15),F()())}var zPA=new dA("mat-slide-toggle-default-options",{providedIn:"root",factory:()=>({disableToggleValue:!1,hideIcon:!1,disabledInteractive:!1})}),OPA={provide:yc,useExisting:Ir(()=>C7),multi:!0},I7=class{source;checked;constructor(e,A){this.source=e,this.checked=A}},C7=(()=>{class t{_elementRef=f(ee);_focusMonitor=f(dr);_changeDetectorRef=f(It);defaults=f(zPA);_onChange=A=>{};_onTouched=()=>{};_validatorOnChange=()=>{};_uniqueId;_checked=!1;_createChangeEvent(A){return new I7(this,A)}_labelId;get buttonId(){return`${this.id||this._uniqueId}-button`}_switchElement;focus(){this._switchElement.nativeElement.focus()}_noopAnimations;_focused;name=null;id;labelPosition="after";ariaLabel=null;ariaLabelledby=null;ariaDescribedby;required;color;disabled=!1;disableRipple=!1;tabIndex=0;get checked(){return this._checked}set checked(A){this._checked=A,this._changeDetectorRef.markForCheck()}hideIcon;disabledInteractive;change=new WA;toggleChange=new WA;get inputId(){return`${this.id||this._uniqueId}-input`}constructor(){f(Rn).load(lr);let A=f(new wr("tabindex"),{optional:!0}),i=this.defaults,n=f(Si,{optional:!0});this.tabIndex=A==null?0:parseInt(A)||0,this.color=i.color||"accent",this._noopAnimations=n==="NoopAnimations",this.id=this._uniqueId=f(sn).getId("mat-mdc-slide-toggle-"),this.hideIcon=i.hideIcon??!1,this.disabledInteractive=i.disabledInteractive??!1,this._labelId=this._uniqueId+"-label"}ngAfterContentInit(){this._focusMonitor.monitor(this._elementRef,!0).subscribe(A=>{A==="keyboard"||A==="program"?(this._focused=!0,this._changeDetectorRef.markForCheck()):A||Promise.resolve().then(()=>{this._focused=!1,this._onTouched(),this._changeDetectorRef.markForCheck()})})}ngOnChanges(A){A.required&&this._validatorOnChange()}ngOnDestroy(){this._focusMonitor.stopMonitoring(this._elementRef)}writeValue(A){this.checked=!!A}registerOnChange(A){this._onChange=A}registerOnTouched(A){this._onTouched=A}validate(A){return this.required&&A.value!==!0?{required:!0}:null}registerOnValidatorChange(A){this._validatorOnChange=A}setDisabledState(A){this.disabled=A,this._changeDetectorRef.markForCheck()}toggle(){this.checked=!this.checked,this._onChange(this.checked)}_emitChangeEvent(){this._onChange(this.checked),this.change.emit(this._createChangeEvent(this.checked))}_handleClick(){this.disabled||(this.toggleChange.emit(),this.defaults.disableToggleValue||(this.checked=!this.checked,this._onChange(this.checked),this.change.emit(new I7(this,this.checked))))}_getAriaLabelledBy(){return this.ariaLabelledby?this.ariaLabelledby:this.ariaLabel?null:this._labelId}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-slide-toggle"]],viewQuery:function(i,n){if(i&1&&Te(JPA,5),i&2){let o;XA(o=$A())&&(n._switchElement=o.first)}},hostAttrs:[1,"mat-mdc-slide-toggle"],hostVars:13,hostBindings:function(i,n){i&2&&(Hs("id",n.id),Ne("tabindex",null)("aria-label",null)("name",null)("aria-labelledby",null),fo(n.color?"mat-"+n.color:""),ue("mat-mdc-slide-toggle-focused",n._focused)("mat-mdc-slide-toggle-checked",n.checked)("_mat-animation-noopable",n._noopAnimations))},inputs:{name:"name",id:"id",labelPosition:"labelPosition",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],required:[2,"required","required",ie],color:"color",disabled:[2,"disabled","disabled",ie],disableRipple:[2,"disableRipple","disableRipple",ie],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:zi(A)],checked:[2,"checked","checked",ie],hideIcon:[2,"hideIcon","hideIcon",ie],disabledInteractive:[2,"disabledInteractive","disabledInteractive",ie]},outputs:{change:"change",toggleChange:"toggleChange"},exportAs:["matSlideToggle"],features:[ht([OPA,{provide:w0,useExisting:t,multi:!0}]),ti],ngContentSelectors:TPA,decls:13,vars:27,consts:[["switch",""],["mat-internal-form-field","",3,"labelPosition"],["role","switch","type","button",1,"mdc-switch",3,"click","tabIndex","disabled"],[1,"mdc-switch__track"],[1,"mdc-switch__handle-track"],[1,"mdc-switch__handle"],[1,"mdc-switch__shadow"],[1,"mdc-elevation-overlay"],[1,"mdc-switch__ripple"],["mat-ripple","",1,"mat-mdc-slide-toggle-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleCentered"],[1,"mdc-switch__icons"],[1,"mdc-label",3,"click","for"],["viewBox","0 0 24 24","aria-hidden","true",1,"mdc-switch__icon","mdc-switch__icon--on"],["d","M19.69,5.23L8.96,15.96l-4.23-4.23L2.96,13.5l6,6L21.46,7L19.69,5.23z"],["viewBox","0 0 24 24","aria-hidden","true",1,"mdc-switch__icon","mdc-switch__icon--off"],["d","M20 13H4v-2h16v2z"]],template:function(i,n){if(i&1){let o=be();jt(),S(0,"div",1)(1,"button",2,0),hA("click",function(){return RA(o),xA(n._handleClick())}),JA(3,"span",3),S(4,"span",4)(5,"span",5)(6,"span",6),JA(7,"span",7),F(),S(8,"span",8),JA(9,"span",9),F(),_A(10,HPA,5,0,"span",10),F()()(),S(11,"label",11),hA("click",function(s){return RA(o),xA(s.stopPropagation())}),Fe(12),F()()}if(i&2){let o=cr(2);yA("labelPosition",n.labelPosition),G(),ue("mdc-switch--selected",n.checked)("mdc-switch--unselected",!n.checked)("mdc-switch--checked",n.checked)("mdc-switch--disabled",n.disabled)("mat-mdc-slide-toggle-disabled-interactive",n.disabledInteractive),yA("tabIndex",n.disabled&&!n.disabledInteractive?-1:n.tabIndex)("disabled",n.disabled&&!n.disabledInteractive),Ne("id",n.buttonId)("name",n.name)("aria-label",n.ariaLabel)("aria-labelledby",n._getAriaLabelledBy())("aria-describedby",n.ariaDescribedby)("aria-required",n.required||null)("aria-checked",n.checked)("aria-disabled",n.disabled&&n.disabledInteractive?"true":null),G(8),yA("matRippleTrigger",o)("matRippleDisabled",n.disableRipple||n.disabled)("matRippleCentered",!0),G(),GA(n.hideIcon?-1:10),G(),yA("for",n.buttonId),Ne("id",n._labelId)}},dependencies:[rs,MB],styles:['.mdc-switch{align-items:center;background:none;border:none;cursor:pointer;display:inline-flex;flex-shrink:0;margin:0;outline:none;overflow:visible;padding:0;position:relative;width:var(--mdc-switch-track-width, 52px)}.mdc-switch.mdc-switch--disabled{cursor:default;pointer-events:none}.mdc-switch.mat-mdc-slide-toggle-disabled-interactive{pointer-events:auto}.mdc-switch__track{overflow:hidden;position:relative;width:100%;height:var(--mdc-switch-track-height, 32px);border-radius:var(--mdc-switch-track-shape, var(--mat-sys-corner-full))}.mdc-switch--disabled.mdc-switch .mdc-switch__track{opacity:var(--mdc-switch-disabled-track-opacity, 0.12)}.mdc-switch__track::before,.mdc-switch__track::after{border:1px solid rgba(0,0,0,0);border-radius:inherit;box-sizing:border-box;content:"";height:100%;left:0;position:absolute;width:100%;border-width:var(--mat-switch-track-outline-width, 2px);border-color:var(--mat-switch-track-outline-color, var(--mat-sys-outline))}.mdc-switch--selected .mdc-switch__track::before,.mdc-switch--selected .mdc-switch__track::after{border-width:var(--mat-switch-selected-track-outline-width, 2px);border-color:var(--mat-switch-selected-track-outline-color, transparent)}.mdc-switch--disabled .mdc-switch__track::before,.mdc-switch--disabled .mdc-switch__track::after{border-width:var(--mat-switch-disabled-unselected-track-outline-width, 2px);border-color:var(--mat-switch-disabled-unselected-track-outline-color, var(--mat-sys-on-surface))}@media(forced-colors: active){.mdc-switch__track{border-color:currentColor}}.mdc-switch__track::before{transition:transform 75ms 0ms cubic-bezier(0, 0, 0.2, 1);transform:translateX(0);background:var(--mdc-switch-unselected-track-color, var(--mat-sys-surface-variant))}.mdc-switch--selected .mdc-switch__track::before{transition:transform 75ms 0ms cubic-bezier(0.4, 0, 0.6, 1);transform:translateX(100%)}[dir=rtl] .mdc-switch--selected .mdc-switch--selected .mdc-switch__track::before{transform:translateX(-100%)}.mdc-switch--selected .mdc-switch__track::before{opacity:var(--mat-switch-hidden-track-opacity, 0);transition:var(--mat-switch-hidden-track-transition, opacity 75ms)}.mdc-switch--unselected .mdc-switch__track::before{opacity:var(--mat-switch-visible-track-opacity, 1);transition:var(--mat-switch-visible-track-transition, opacity 75ms)}.mdc-switch:enabled:hover:not(:focus):not(:active) .mdc-switch__track::before{background:var(--mdc-switch-unselected-hover-track-color, var(--mat-sys-surface-variant))}.mdc-switch:enabled:focus:not(:active) .mdc-switch__track::before{background:var(--mdc-switch-unselected-focus-track-color, var(--mat-sys-surface-variant))}.mdc-switch:enabled:active .mdc-switch__track::before{background:var(--mdc-switch-unselected-pressed-track-color, var(--mat-sys-surface-variant))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__track::before,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__track::before,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__track::before,.mdc-switch.mdc-switch--disabled .mdc-switch__track::before{background:var(--mdc-switch-disabled-unselected-track-color, var(--mat-sys-surface-variant))}.mdc-switch__track::after{transform:translateX(-100%);background:var(--mdc-switch-selected-track-color, var(--mat-sys-primary))}[dir=rtl] .mdc-switch__track::after{transform:translateX(100%)}.mdc-switch--selected .mdc-switch__track::after{transform:translateX(0)}.mdc-switch--selected .mdc-switch__track::after{opacity:var(--mat-switch-visible-track-opacity, 1);transition:var(--mat-switch-visible-track-transition, opacity 75ms)}.mdc-switch--unselected .mdc-switch__track::after{opacity:var(--mat-switch-hidden-track-opacity, 0);transition:var(--mat-switch-hidden-track-transition, opacity 75ms)}.mdc-switch:enabled:hover:not(:focus):not(:active) .mdc-switch__track::after{background:var(--mdc-switch-selected-hover-track-color, var(--mat-sys-primary))}.mdc-switch:enabled:focus:not(:active) .mdc-switch__track::after{background:var(--mdc-switch-selected-focus-track-color, var(--mat-sys-primary))}.mdc-switch:enabled:active .mdc-switch__track::after{background:var(--mdc-switch-selected-pressed-track-color, var(--mat-sys-primary))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__track::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__track::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__track::after,.mdc-switch.mdc-switch--disabled .mdc-switch__track::after{background:var(--mdc-switch-disabled-selected-track-color, var(--mat-sys-on-surface))}.mdc-switch__handle-track{height:100%;pointer-events:none;position:absolute;top:0;transition:transform 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1);left:0;right:auto;transform:translateX(0);width:calc(100% - var(--mdc-switch-handle-width))}[dir=rtl] .mdc-switch__handle-track{left:auto;right:0}.mdc-switch--selected .mdc-switch__handle-track{transform:translateX(100%)}[dir=rtl] .mdc-switch--selected .mdc-switch__handle-track{transform:translateX(-100%)}.mdc-switch__handle{display:flex;pointer-events:auto;position:absolute;top:50%;transform:translateY(-50%);left:0;right:auto;transition:width 75ms cubic-bezier(0.4, 0, 0.2, 1),height 75ms cubic-bezier(0.4, 0, 0.2, 1),margin 75ms cubic-bezier(0.4, 0, 0.2, 1);width:var(--mdc-switch-handle-width);height:var(--mdc-switch-handle-height);border-radius:var(--mdc-switch-handle-shape, var(--mat-sys-corner-full))}[dir=rtl] .mdc-switch__handle{left:auto;right:0}.mat-mdc-slide-toggle .mdc-switch--unselected .mdc-switch__handle{width:var(--mat-switch-unselected-handle-size, 16px);height:var(--mat-switch-unselected-handle-size, 16px);margin:var(--mat-switch-unselected-handle-horizontal-margin, 0 8px)}.mat-mdc-slide-toggle .mdc-switch--unselected .mdc-switch__handle:has(.mdc-switch__icons){margin:var(--mat-switch-unselected-with-icon-handle-horizontal-margin, 0 4px)}.mat-mdc-slide-toggle .mdc-switch--selected .mdc-switch__handle{width:var(--mat-switch-selected-handle-size, 24px);height:var(--mat-switch-selected-handle-size, 24px);margin:var(--mat-switch-selected-handle-horizontal-margin, 0 24px)}.mat-mdc-slide-toggle .mdc-switch--selected .mdc-switch__handle:has(.mdc-switch__icons){margin:var(--mat-switch-selected-with-icon-handle-horizontal-margin, 0 24px)}.mat-mdc-slide-toggle .mdc-switch__handle:has(.mdc-switch__icons){width:var(--mat-switch-with-icon-handle-size, 24px);height:var(--mat-switch-with-icon-handle-size, 24px)}.mat-mdc-slide-toggle .mdc-switch:active:not(.mdc-switch--disabled) .mdc-switch__handle{width:var(--mat-switch-pressed-handle-size, 28px);height:var(--mat-switch-pressed-handle-size, 28px)}.mat-mdc-slide-toggle .mdc-switch--selected:active:not(.mdc-switch--disabled) .mdc-switch__handle{margin:var(--mat-switch-selected-pressed-handle-horizontal-margin, 0 22px)}.mat-mdc-slide-toggle .mdc-switch--unselected:active:not(.mdc-switch--disabled) .mdc-switch__handle{margin:var(--mat-switch-unselected-pressed-handle-horizontal-margin, 0 2px)}.mdc-switch--disabled.mdc-switch--selected .mdc-switch__handle::after{opacity:var(--mat-switch-disabled-selected-handle-opacity, 1)}.mdc-switch--disabled.mdc-switch--unselected .mdc-switch__handle::after{opacity:var(--mat-switch-disabled-unselected-handle-opacity, 0.38)}.mdc-switch__handle::before,.mdc-switch__handle::after{border:1px solid rgba(0,0,0,0);border-radius:inherit;box-sizing:border-box;content:"";width:100%;height:100%;left:0;position:absolute;top:0;transition:background-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1),border-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1);z-index:-1}@media(forced-colors: active){.mdc-switch__handle::before,.mdc-switch__handle::after{border-color:currentColor}}.mdc-switch--selected:enabled .mdc-switch__handle::after{background:var(--mdc-switch-selected-handle-color, var(--mat-sys-on-primary))}.mdc-switch--selected:enabled:hover:not(:focus):not(:active) .mdc-switch__handle::after{background:var(--mdc-switch-selected-hover-handle-color, var(--mat-sys-primary-container))}.mdc-switch--selected:enabled:focus:not(:active) .mdc-switch__handle::after{background:var(--mdc-switch-selected-focus-handle-color, var(--mat-sys-primary-container))}.mdc-switch--selected:enabled:active .mdc-switch__handle::after{background:var(--mdc-switch-selected-pressed-handle-color, var(--mat-sys-primary-container))}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:hover:not(:focus):not(:active) .mdc-switch__handle::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:focus:not(:active) .mdc-switch__handle::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled.mdc-switch--selected:active .mdc-switch__handle::after,.mdc-switch--selected.mdc-switch--disabled .mdc-switch__handle::after{background:var(--mdc-switch-disabled-selected-handle-color, var(--mat-sys-surface))}.mdc-switch--unselected:enabled .mdc-switch__handle::after{background:var(--mdc-switch-unselected-handle-color, var(--mat-sys-outline))}.mdc-switch--unselected:enabled:hover:not(:focus):not(:active) .mdc-switch__handle::after{background:var(--mdc-switch-unselected-hover-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected:enabled:focus:not(:active) .mdc-switch__handle::after{background:var(--mdc-switch-unselected-focus-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected:enabled:active .mdc-switch__handle::after{background:var(--mdc-switch-unselected-pressed-handle-color, var(--mat-sys-on-surface-variant))}.mdc-switch--unselected.mdc-switch--disabled .mdc-switch__handle::after{background:var(--mdc-switch-disabled-unselected-handle-color, var(--mat-sys-on-surface))}.mdc-switch__handle::before{background:var(--mdc-switch-handle-surface-color)}.mdc-switch__shadow{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0}.mdc-switch:enabled .mdc-switch__shadow{box-shadow:var(--mdc-switch-handle-elevation-shadow)}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:hover:not(:focus):not(:active) .mdc-switch__shadow,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:focus:not(:active) .mdc-switch__shadow,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:active .mdc-switch__shadow,.mdc-switch.mdc-switch--disabled .mdc-switch__shadow{box-shadow:var(--mdc-switch-disabled-handle-elevation-shadow)}.mdc-switch__ripple{left:50%;position:absolute;top:50%;transform:translate(-50%, -50%);z-index:-1;width:var(--mdc-switch-state-layer-size, 40px);height:var(--mdc-switch-state-layer-size, 40px)}.mdc-switch__ripple::after{content:"";opacity:0}.mdc-switch--disabled .mdc-switch__ripple::after{display:none}.mat-mdc-slide-toggle-disabled-interactive .mdc-switch__ripple::after{display:block}.mdc-switch:hover .mdc-switch__ripple::after{opacity:.04;transition:75ms opacity cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-slide-toggle.mat-mdc-slide-toggle-focused .mdc-switch .mdc-switch__ripple::after{opacity:.12}.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:focus .mdc-switch__ripple::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:active .mdc-switch__ripple::after,.mat-mdc-slide-toggle-disabled-interactive.mdc-switch--disabled:enabled:hover:not(:focus) .mdc-switch__ripple::after,.mdc-switch--unselected:enabled:hover:not(:focus) .mdc-switch__ripple::after{background:var(--mdc-switch-unselected-hover-state-layer-color, var(--mat-sys-on-surface))}.mdc-switch--unselected:enabled:focus .mdc-switch__ripple::after{background:var(--mdc-switch-unselected-focus-state-layer-color, var(--mat-sys-on-surface))}.mdc-switch--unselected:enabled:active .mdc-switch__ripple::after{background:var(--mdc-switch-unselected-pressed-state-layer-color, var(--mat-sys-on-surface));opacity:var(--mdc-switch-unselected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));transition:opacity 75ms linear}.mdc-switch--selected:enabled:hover:not(:focus) .mdc-switch__ripple::after{background:var(--mdc-switch-selected-hover-state-layer-color, var(--mat-sys-primary))}.mdc-switch--selected:enabled:focus .mdc-switch__ripple::after{background:var(--mdc-switch-selected-focus-state-layer-color, var(--mat-sys-primary))}.mdc-switch--selected:enabled:active .mdc-switch__ripple::after{background:var(--mdc-switch-selected-pressed-state-layer-color, var(--mat-sys-primary));opacity:var(--mdc-switch-selected-pressed-state-layer-opacity, var(--mat-sys-pressed-state-layer-opacity));transition:opacity 75ms linear}.mdc-switch__icons{position:relative;height:100%;width:100%;z-index:1}.mdc-switch--disabled.mdc-switch--unselected .mdc-switch__icons{opacity:var(--mdc-switch-disabled-unselected-icon-opacity, 0.38)}.mdc-switch--disabled.mdc-switch--selected .mdc-switch__icons{opacity:var(--mdc-switch-disabled-selected-icon-opacity, 0.38)}.mdc-switch__icon{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0;opacity:0;transition:opacity 30ms 0ms cubic-bezier(0.4, 0, 1, 1)}.mdc-switch--unselected .mdc-switch__icon{width:var(--mdc-switch-unselected-icon-size, 16px);height:var(--mdc-switch-unselected-icon-size, 16px);fill:var(--mdc-switch-unselected-icon-color, var(--mat-sys-surface-variant))}.mdc-switch--unselected.mdc-switch--disabled .mdc-switch__icon{fill:var(--mdc-switch-disabled-unselected-icon-color, var(--mat-sys-surface-variant))}.mdc-switch--selected .mdc-switch__icon{width:var(--mdc-switch-selected-icon-size, 16px);height:var(--mdc-switch-selected-icon-size, 16px);fill:var(--mdc-switch-selected-icon-color, var(--mat-sys-on-primary-container))}.mdc-switch--selected.mdc-switch--disabled .mdc-switch__icon{fill:var(--mdc-switch-disabled-selected-icon-color, var(--mat-sys-on-surface))}.mdc-switch--selected .mdc-switch__icon--on,.mdc-switch--unselected .mdc-switch__icon--off{opacity:1;transition:opacity 45ms 30ms cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-slide-toggle{-webkit-user-select:none;user-select:none;display:inline-block;-webkit-tap-highlight-color:rgba(0,0,0,0);outline:0}.mat-mdc-slide-toggle .mat-mdc-slide-toggle-ripple,.mat-mdc-slide-toggle .mdc-switch__ripple::after{top:0;left:0;right:0;bottom:0;position:absolute;border-radius:50%;pointer-events:none}.mat-mdc-slide-toggle .mat-mdc-slide-toggle-ripple:not(:empty),.mat-mdc-slide-toggle .mdc-switch__ripple::after:not(:empty){transform:translateZ(0)}.mat-mdc-slide-toggle.mat-mdc-slide-toggle-focused .mat-focus-indicator::before{content:""}.mat-mdc-slide-toggle .mat-internal-form-field{color:var(--mat-switch-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-switch-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-switch-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-switch-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-switch-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-switch-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-slide-toggle .mat-ripple-element{opacity:.12}.mat-mdc-slide-toggle .mat-focus-indicator::before{border-radius:50%}.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle-track,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__icon,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle::before,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__handle::after,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__track::before,.mat-mdc-slide-toggle._mat-animation-noopable .mdc-switch__track::after{transition:none}.mat-mdc-slide-toggle .mdc-switch:enabled+.mdc-label{cursor:pointer}.mat-mdc-slide-toggle .mdc-switch--disabled+label{color:var(--mdc-switch-disabled-label-text-color)}'],encapsulation:2,changeDetection:0})}return t})();var ElA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[C7,it,it]})}return t})();var jPA=["mat-menu-item",""],qPA=[[["mat-icon"],["","matMenuItemIcon",""]],"*"],VPA=["mat-icon, [matMenuItemIcon]","*"];function ZPA(t,e){t&1&&(ar(),S(0,"svg",2),JA(1,"polygon",3),F())}var WPA=["*"];function XPA(t,e){if(t&1){let A=be();S(0,"div",0),hA("click",function(){RA(A);let n=O();return xA(n.closed.emit("click"))})("animationstart",function(n){RA(A);let o=O();return xA(o._onAnimationStart(n.animationName))})("animationend",function(n){RA(A);let o=O();return xA(o._onAnimationDone(n.animationName))})("animationcancel",function(n){RA(A);let o=O();return xA(o._onAnimationDone(n.animationName))}),S(1,"div",1),Fe(2),F()()}if(t&2){let A=O();fo(A._classList),ue("mat-menu-panel-animations-disabled",A._animationsDisabled)("mat-menu-panel-exit-animation",A._panelAnimationState==="void")("mat-menu-panel-animating",A._isAnimating),yA("id",A.panelId),Ne("aria-label",A.ariaLabel||null)("aria-labelledby",A.ariaLabelledby||null)("aria-describedby",A.ariaDescribedby||null)}}var aU=new dA("MAT_MENU_PANEL"),bf=(()=>{class t{_elementRef=f(ee);_document=f(at);_focusMonitor=f(dr);_parentMenu=f(aU,{optional:!0});_changeDetectorRef=f(It);role="menuitem";disabled=!1;disableRipple=!1;_hovered=new OA;_focused=new OA;_highlighted=!1;_triggersSubmenu=!1;constructor(){f(Rn).load(lr),this._parentMenu?.addItem?.(this)}focus(A,i){this._focusMonitor&&A?this._focusMonitor.focusVia(this._getHostElement(),A,i):this._getHostElement().focus(i),this._focused.next(this)}ngAfterViewInit(){this._focusMonitor&&this._focusMonitor.monitor(this._elementRef,!1)}ngOnDestroy(){this._focusMonitor&&this._focusMonitor.stopMonitoring(this._elementRef),this._parentMenu&&this._parentMenu.removeItem&&this._parentMenu.removeItem(this),this._hovered.complete(),this._focused.complete()}_getTabIndex(){return this.disabled?"-1":"0"}_getHostElement(){return this._elementRef.nativeElement}_checkDisabled(A){this.disabled&&(A.preventDefault(),A.stopPropagation())}_handleMouseEnter(){this._hovered.next(this)}getLabel(){let A=this._elementRef.nativeElement.cloneNode(!0),i=A.querySelectorAll("mat-icon, .material-icons");for(let n=0;n{class t{_elementRef=f(ee);_changeDetectorRef=f(It);_injector=f(Rt);_keyManager;_xPosition;_yPosition;_firstItemFocusRef;_exitFallbackTimeout;_animationsDisabled;_allItems;_directDescendantItems=new ca;_classList={};_panelAnimationState="void";_animationDone=new OA;_isAnimating=!1;parentMenu;direction;overlayPanelClass;backdropClass;ariaLabel;ariaLabelledby;ariaDescribedby;get xPosition(){return this._xPosition}set xPosition(A){this._xPosition=A,this.setPositionClasses()}get yPosition(){return this._yPosition}set yPosition(A){this._yPosition=A,this.setPositionClasses()}templateRef;items;lazyContent;overlapTrigger;hasBackdrop;set panelClass(A){let i=this._previousPanelClass,n=rA({},this._classList);i&&i.length&&i.split(" ").forEach(o=>{n[o]=!1}),this._previousPanelClass=A,A&&A.length&&(A.split(" ").forEach(o=>{n[o]=!0}),this._elementRef.nativeElement.className=""),this._classList=n}_previousPanelClass;get classList(){return this.panelClass}set classList(A){this.panelClass=A}closed=new WA;close=this.closed;panelId=f(sn).getId("mat-menu-panel-");constructor(){let A=f(AjA);this.overlayPanelClass=A.overlayPanelClass||"",this._xPosition=A.xPosition,this._yPosition=A.yPosition,this.backdropClass=A.backdropClass,this.overlapTrigger=A.overlapTrigger,this.hasBackdrop=A.hasBackdrop,this._animationsDisabled=f(Si,{optional:!0})==="NoopAnimations"}ngOnInit(){this.setPositionClasses()}ngAfterContentInit(){this._updateDirectDescendants(),this._keyManager=new qI(this._directDescendantItems).withWrap().withTypeAhead().withHomeAndEnd(),this._keyManager.tabOut.subscribe(()=>this.closed.emit("tab")),this._directDescendantItems.changes.pipe(Pn(this._directDescendantItems),jn(A=>zn(...A.map(i=>i._focused)))).subscribe(A=>this._keyManager.updateActiveItem(A)),this._directDescendantItems.changes.subscribe(A=>{let i=this._keyManager;if(this._panelAnimationState==="enter"&&i.activeItem?._hasFocus()){let n=A.toArray(),o=Math.max(0,Math.min(n.length-1,i.activeItemIndex||0));n[o]&&!n[o].disabled?i.setActiveItem(o):i.setNextItemActive()}})}ngOnDestroy(){this._keyManager?.destroy(),this._directDescendantItems.destroy(),this.closed.complete(),this._firstItemFocusRef?.destroy(),clearTimeout(this._exitFallbackTimeout)}_hovered(){return this._directDescendantItems.changes.pipe(Pn(this._directDescendantItems),jn(i=>zn(...i.map(n=>n._hovered))))}addItem(A){}removeItem(A){}_handleKeydown(A){let i=A.keyCode,n=this._keyManager;switch(i){case 27:ir(A)||(A.preventDefault(),this.closed.emit("keydown"));break;case 37:this.parentMenu&&this.direction==="ltr"&&this.closed.emit("keydown");break;case 39:this.parentMenu&&this.direction==="rtl"&&this.closed.emit("keydown");break;default:(i===38||i===40)&&n.setFocusOrigin("keyboard"),n.onKeydown(A);return}}focusFirstItem(A="program"){this._firstItemFocusRef?.destroy(),this._firstItemFocusRef=To(()=>{let i=this._resolvePanel();if(!i||!i.contains(document.activeElement)){let n=this._keyManager;n.setFocusOrigin(A).setFirstItemActive(),!n.activeItem&&i&&i.focus()}},{injector:this._injector})}resetActiveItem(){this._keyManager.setActiveItem(-1)}setElevation(A){}setPositionClasses(A=this.xPosition,i=this.yPosition){this._classList=Ye(rA({},this._classList),{"mat-menu-before":A==="before","mat-menu-after":A==="after","mat-menu-above":i==="above","mat-menu-below":i==="below"}),this._changeDetectorRef.markForCheck()}_onAnimationDone(A){let i=A===d7;(i||A===sU)&&(i&&(clearTimeout(this._exitFallbackTimeout),this._exitFallbackTimeout=void 0),this._animationDone.next(i?"void":"enter"),this._isAnimating=!1)}_onAnimationStart(A){(A===sU||A===d7)&&(this._isAnimating=!0)}_setIsOpen(A){if(this._panelAnimationState=A?"enter":"void",A){if(this._keyManager.activeItemIndex===0){let i=this._resolvePanel();i&&(i.scrollTop=0)}}else this._animationsDisabled||(this._exitFallbackTimeout=setTimeout(()=>this._onAnimationDone(d7),200));this._animationsDisabled&&setTimeout(()=>{this._onAnimationDone(A?sU:d7)}),this._changeDetectorRef.markForCheck()}_updateDirectDescendants(){this._allItems.changes.pipe(Pn(this._allItems)).subscribe(A=>{this._directDescendantItems.reset(A.filter(i=>i._parentMenu===this)),this._directDescendantItems.notifyOnChanges()})}_resolvePanel(){let A=null;return this._directDescendantItems.length&&(A=this._directDescendantItems.first._getHostElement().closest('[role="menu"]')),A}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-menu"]],contentQueries:function(i,n,o){if(i&1&&(ci(o,$PA,5),ci(o,bf,5),ci(o,bf,4)),i&2){let r;XA(r=$A())&&(n.lazyContent=r.first),XA(r=$A())&&(n._allItems=r),XA(r=$A())&&(n.items=r)}},viewQuery:function(i,n){if(i&1&&Te(wn,5),i&2){let o;XA(o=$A())&&(n.templateRef=o.first)}},hostVars:3,hostBindings:function(i,n){i&2&&Ne("aria-label",null)("aria-labelledby",null)("aria-describedby",null)},inputs:{backdropClass:"backdropClass",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],xPosition:"xPosition",yPosition:"yPosition",overlapTrigger:[2,"overlapTrigger","overlapTrigger",ie],hasBackdrop:[2,"hasBackdrop","hasBackdrop",A=>A==null?null:ie(A)],panelClass:[0,"class","panelClass"],classList:"classList"},outputs:{closed:"closed",close:"close"},exportAs:["matMenu"],features:[ht([{provide:aU,useExisting:t}])],ngContentSelectors:WPA,decls:1,vars:0,consts:[["tabindex","-1","role","menu",1,"mat-mdc-menu-panel",3,"click","animationstart","animationend","animationcancel","id"],[1,"mat-mdc-menu-content"]],template:function(i,n){i&1&&(jt(),_A(0,XPA,3,12,"ng-template"))},styles:['mat-menu{display:none}.mat-mdc-menu-content{margin:0;padding:8px 0;outline:0}.mat-mdc-menu-content,.mat-mdc-menu-content .mat-mdc-menu-item .mat-mdc-menu-item-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;flex:1;white-space:normal;font-family:var(--mat-menu-item-label-text-font, var(--mat-sys-label-large-font));line-height:var(--mat-menu-item-label-text-line-height, var(--mat-sys-label-large-line-height));font-size:var(--mat-menu-item-label-text-size, var(--mat-sys-label-large-size));letter-spacing:var(--mat-menu-item-label-text-tracking, var(--mat-sys-label-large-tracking));font-weight:var(--mat-menu-item-label-text-weight, var(--mat-sys-label-large-weight))}@keyframes _mat-menu-enter{from{opacity:0;transform:scale(0.8)}to{opacity:1;transform:none}}@keyframes _mat-menu-exit{from{opacity:1}to{opacity:0}}.mat-mdc-menu-panel{min-width:112px;max-width:280px;overflow:auto;box-sizing:border-box;outline:0;animation:_mat-menu-enter 120ms cubic-bezier(0, 0, 0.2, 1);border-radius:var(--mat-menu-container-shape, var(--mat-sys-corner-extra-small));background-color:var(--mat-menu-container-color, var(--mat-sys-surface-container));box-shadow:var(--mat-menu-container-elevation-shadow, 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12));will-change:transform,opacity}.mat-mdc-menu-panel.mat-menu-panel-exit-animation{animation:_mat-menu-exit 100ms 25ms linear forwards}.mat-mdc-menu-panel.mat-menu-panel-animations-disabled{animation:none}.mat-mdc-menu-panel.mat-menu-panel-animating{pointer-events:none}.mat-mdc-menu-panel.mat-menu-panel-animating:has(.mat-mdc-menu-content:empty){display:none}@media(forced-colors: active){.mat-mdc-menu-panel{outline:solid 1px}}.mat-mdc-menu-panel .mat-divider{color:var(--mat-menu-divider-color, var(--mat-sys-surface-variant));margin-bottom:var(--mat-menu-divider-bottom-spacing, 8px);margin-top:var(--mat-menu-divider-top-spacing, 8px)}.mat-mdc-menu-item{display:flex;position:relative;align-items:center;justify-content:flex-start;overflow:hidden;padding:0;cursor:pointer;width:100%;text-align:left;box-sizing:border-box;color:inherit;font-size:inherit;background:none;text-decoration:none;margin:0;min-height:48px;padding-left:var(--mat-menu-item-leading-spacing, 12px);padding-right:var(--mat-menu-item-trailing-spacing, 12px);-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-menu-item::-moz-focus-inner{border:0}[dir=rtl] .mat-mdc-menu-item{padding-left:var(--mat-menu-item-trailing-spacing, 12px);padding-right:var(--mat-menu-item-leading-spacing, 12px)}.mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-leading-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-trailing-spacing, 12px)}[dir=rtl] .mat-mdc-menu-item:has(.material-icons,mat-icon,[matButtonIcon]){padding-left:var(--mat-menu-item-with-icon-trailing-spacing, 12px);padding-right:var(--mat-menu-item-with-icon-leading-spacing, 12px)}.mat-mdc-menu-item,.mat-mdc-menu-item:visited,.mat-mdc-menu-item:link{color:var(--mat-menu-item-label-text-color, var(--mat-sys-on-surface))}.mat-mdc-menu-item .mat-icon-no-color,.mat-mdc-menu-item .mat-mdc-menu-submenu-icon{color:var(--mat-menu-item-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-menu-item[disabled]{cursor:default;opacity:.38}.mat-mdc-menu-item[disabled]::after{display:block;position:absolute;content:"";top:0;left:0;bottom:0;right:0}.mat-mdc-menu-item:focus{outline:0}.mat-mdc-menu-item .mat-icon{flex-shrink:0;margin-right:var(--mat-menu-item-spacing, 12px);height:var(--mat-menu-item-icon-size, 24px);width:var(--mat-menu-item-icon-size, 24px)}[dir=rtl] .mat-mdc-menu-item{text-align:right}[dir=rtl] .mat-mdc-menu-item .mat-icon{margin-right:0;margin-left:var(--mat-menu-item-spacing, 12px)}.mat-mdc-menu-item:not([disabled]):hover{background-color:var(--mat-menu-item-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}.mat-mdc-menu-item:not([disabled]).cdk-program-focused,.mat-mdc-menu-item:not([disabled]).cdk-keyboard-focused,.mat-mdc-menu-item:not([disabled]).mat-mdc-menu-item-highlighted{background-color:var(--mat-menu-item-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent))}@media(forced-colors: active){.mat-mdc-menu-item{margin-top:1px}}.mat-mdc-menu-submenu-icon{width:var(--mat-menu-item-icon-size, 24px);height:10px;fill:currentColor;padding-left:var(--mat-menu-item-spacing, 12px)}[dir=rtl] .mat-mdc-menu-submenu-icon{padding-right:var(--mat-menu-item-spacing, 12px);padding-left:0}[dir=rtl] .mat-mdc-menu-submenu-icon polygon{transform:scaleX(-1);transform-origin:center}@media(forced-colors: active){.mat-mdc-menu-submenu-icon{fill:CanvasText}}.mat-mdc-menu-item .mat-mdc-menu-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none}'],encapsulation:2,changeDetection:0})}return t})(),hlA=new dA("mat-menu-scroll-strategy",{providedIn:"root",factory:()=>{let t=f(nr);return()=>t.scrollStrategies.reposition()}});function tjA(t){return()=>t.scrollStrategies.reposition()}var ijA={provide:hlA,deps:[nr],useFactory:tjA},QlA=bc({passive:!0});var vf=new WeakMap,ulA=(()=>{class t{_overlay=f(nr);_element=f(ee);_viewContainerRef=f(Nn);_menuItemInstance=f(bf,{optional:!0,self:!0});_dir=f(mo,{optional:!0});_focusMonitor=f(dr);_ngZone=f(Qe);_scrollStrategy=f(hlA);_changeDetectorRef=f(It);_portal;_overlayRef=null;_menuOpen=!1;_closingActionsSubscription=Kt.EMPTY;_hoverSubscription=Kt.EMPTY;_menuCloseSubscription=Kt.EMPTY;_pendingRemoval;_parentMaterialMenu;_parentInnerPadding;_handleTouchStart=A=>{Su(A)||(this._openedBy="touch")};_openedBy=void 0;get _deprecatedMatMenuTriggerFor(){return this.menu}set _deprecatedMatMenuTriggerFor(A){this.menu=A}get menu(){return this._menu}set menu(A){A!==this._menu&&(this._menu=A,this._menuCloseSubscription.unsubscribe(),A&&(this._parentMaterialMenu,this._menuCloseSubscription=A.close.subscribe(i=>{this._destroyMenu(i),(i==="click"||i==="tab")&&this._parentMaterialMenu&&this._parentMaterialMenu.closed.emit(i)})),this._menuItemInstance?._setTriggersSubmenu(this.triggersSubmenu()))}_menu;menuData;restoreFocus=!0;menuOpened=new WA;onMenuOpen=this.menuOpened;menuClosed=new WA;onMenuClose=this.menuClosed;constructor(){let A=f(aU,{optional:!0});this._parentMaterialMenu=A instanceof NQ?A:void 0,this._element.nativeElement.addEventListener("touchstart",this._handleTouchStart,QlA)}ngAfterContentInit(){this._handleHover()}ngOnDestroy(){this.menu&&this._ownsMenu(this.menu)&&vf.delete(this.menu),this._element.nativeElement.removeEventListener("touchstart",this._handleTouchStart,QlA),this._pendingRemoval?.unsubscribe(),this._menuCloseSubscription.unsubscribe(),this._closingActionsSubscription.unsubscribe(),this._hoverSubscription.unsubscribe(),this._overlayRef&&(this._overlayRef.dispose(),this._overlayRef=null)}get menuOpen(){return this._menuOpen}get dir(){return this._dir&&this._dir.value==="rtl"?"rtl":"ltr"}triggersSubmenu(){return!!(this._menuItemInstance&&this._parentMaterialMenu&&this.menu)}toggleMenu(){return this._menuOpen?this.closeMenu():this.openMenu()}openMenu(){let A=this.menu;if(this._menuOpen||!A)return;this._pendingRemoval?.unsubscribe();let i=vf.get(A);vf.set(A,this),i&&i!==this&&i.closeMenu();let n=this._createOverlay(A),o=n.getConfig(),r=o.positionStrategy;this._setPosition(A,r),o.hasBackdrop=A.hasBackdrop==null?!this.triggersSubmenu():A.hasBackdrop,n.hasAttached()||(n.attach(this._getPortal(A)),A.lazyContent?.attach(this.menuData)),this._closingActionsSubscription=this._menuClosingActions().subscribe(()=>this.closeMenu()),A.parentMenu=this.triggersSubmenu()?this._parentMaterialMenu:void 0,A.direction=this.dir,A.focusFirstItem(this._openedBy||"program"),this._setIsMenuOpen(!0),A instanceof NQ&&(A._setIsOpen(!0),A._directDescendantItems.changes.pipe(St(A.close)).subscribe(()=>{r.withLockedPosition(!1).reapplyLastPosition(),r.withLockedPosition(!0)}))}closeMenu(){this.menu?.close.emit()}focus(A,i){this._focusMonitor&&A?this._focusMonitor.focusVia(this._element,A,i):this._element.nativeElement.focus(i)}updatePosition(){this._overlayRef?.updatePosition()}_destroyMenu(A){let i=this._overlayRef,n=this._menu;!i||!this.menuOpen||(this._closingActionsSubscription.unsubscribe(),this._pendingRemoval?.unsubscribe(),n instanceof NQ&&this._ownsMenu(n)?(this._pendingRemoval=n._animationDone.pipe(On(1)).subscribe(()=>{i.detach(),n.lazyContent?.detach()}),n._setIsOpen(!1)):(i.detach(),n?.lazyContent?.detach()),n&&this._ownsMenu(n)&&vf.delete(n),this.restoreFocus&&(A==="keydown"||!this._openedBy||!this.triggersSubmenu())&&this.focus(this._openedBy),this._openedBy=void 0,this._setIsMenuOpen(!1))}_setIsMenuOpen(A){A!==this._menuOpen&&(this._menuOpen=A,this._menuOpen?this.menuOpened.emit():this.menuClosed.emit(),this.triggersSubmenu()&&this._menuItemInstance._setHighlighted(A),this._changeDetectorRef.markForCheck())}_createOverlay(A){if(!this._overlayRef){let i=this._getOverlayConfig(A);this._subscribeToPositions(A,i.positionStrategy),this._overlayRef=this._overlay.create(i),this._overlayRef.keydownEvents().subscribe(n=>{this.menu instanceof NQ&&this.menu._handleKeydown(n)})}return this._overlayRef}_getOverlayConfig(A){return new Bg({positionStrategy:this._overlay.position().flexibleConnectedTo(this._element).withLockedPosition().withGrowAfterOpen().withTransformOriginOn(".mat-menu-panel, .mat-mdc-menu-panel"),backdropClass:A.backdropClass||"cdk-overlay-transparent-backdrop",panelClass:A.overlayPanelClass,scrollStrategy:this._scrollStrategy(),direction:this._dir||"ltr"})}_subscribeToPositions(A,i){A.setPositionClasses&&i.positionChanges.subscribe(n=>{this._ngZone.run(()=>{let o=n.connectionPair.overlayX==="start"?"after":"before",r=n.connectionPair.overlayY==="top"?"below":"above";A.setPositionClasses(o,r)})})}_setPosition(A,i){let[n,o]=A.xPosition==="before"?["end","start"]:["start","end"],[r,s]=A.yPosition==="above"?["bottom","top"]:["top","bottom"],[a,c]=[r,s],[l,I]=[n,o],C=0;if(this.triggersSubmenu()){if(I=n=A.xPosition==="before"?"start":"end",o=l=n==="end"?"start":"end",this._parentMaterialMenu){if(this._parentInnerPadding==null){let d=this._parentMaterialMenu.items.first;this._parentInnerPadding=d?d._getHostElement().offsetTop:0}C=r==="bottom"?this._parentInnerPadding:-this._parentInnerPadding}}else A.overlapTrigger||(a=r==="top"?"bottom":"top",c=s==="top"?"bottom":"top");i.withPositions([{originX:n,originY:a,overlayX:l,overlayY:r,offsetY:C},{originX:o,originY:a,overlayX:I,overlayY:r,offsetY:C},{originX:n,originY:c,overlayX:l,overlayY:s,offsetY:-C},{originX:o,originY:c,overlayX:I,overlayY:s,offsetY:-C}])}_menuClosingActions(){let A=this._overlayRef.backdropClick(),i=this._overlayRef.detachments(),n=this._parentMaterialMenu?this._parentMaterialMenu.closed:Me(),o=this._parentMaterialMenu?this._parentMaterialMenu._hovered().pipe(kt(r=>this._menuOpen&&r!==this._menuItemInstance)):Me();return zn(A,n,o,i)}_handleMousedown(A){ku(A)||(this._openedBy=A.button===0?"mouse":void 0,this.triggersSubmenu()&&A.preventDefault())}_handleKeydown(A){let i=A.keyCode;(i===13||i===32)&&(this._openedBy="keyboard"),this.triggersSubmenu()&&(i===39&&this.dir==="ltr"||i===37&&this.dir==="rtl")&&(this._openedBy="keyboard",this.openMenu())}_handleClick(A){this.triggersSubmenu()?(A.stopPropagation(),this.openMenu()):this.toggleMenu()}_handleHover(){this.triggersSubmenu()&&this._parentMaterialMenu&&(this._hoverSubscription=this._parentMaterialMenu._hovered().subscribe(A=>{A===this._menuItemInstance&&!A.disabled&&(this._openedBy="mouse",this.openMenu())}))}_getPortal(A){return(!this._portal||this._portal.templateRef!==A.templateRef)&&(this._portal=new ys(A.templateRef,this._viewContainerRef)),this._portal}_ownsMenu(A){return vf.get(A)===this}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["","mat-menu-trigger-for",""],["","matMenuTriggerFor",""]],hostAttrs:[1,"mat-mdc-menu-trigger"],hostVars:3,hostBindings:function(i,n){i&1&&hA("click",function(r){return n._handleClick(r)})("mousedown",function(r){return n._handleMousedown(r)})("keydown",function(r){return n._handleKeydown(r)}),i&2&&Ne("aria-haspopup",n.menu?"menu":null)("aria-expanded",n.menuOpen)("aria-controls",n.menuOpen?n.menu.panelId:null)},inputs:{_deprecatedMatMenuTriggerFor:[0,"mat-menu-trigger-for","_deprecatedMatMenuTriggerFor"],menu:[0,"matMenuTriggerFor","menu"],menuData:[0,"matMenuTriggerData","menuData"],restoreFocus:[0,"matMenuTriggerRestoreFocus","restoreFocus"]},outputs:{menuOpened:"menuOpened",onMenuOpen:"onMenuOpen",menuClosed:"menuClosed",onMenuClose:"onMenuClose"},exportAs:["matMenuTrigger"]})}return t})(),flA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({providers:[ijA],imports:[Ps,it,El,Cl,it]})}return t})(),mlA={transformMenu:sc("transformMenu",[js("void",po({opacity:0,transform:"scale(0.8)"})),Vr("void => enter",ss("120ms cubic-bezier(0, 0, 0.2, 1)",po({opacity:1,transform:"scale(1)"}))),Vr("* => void",ss("100ms 25ms linear",po({opacity:0})))]),fadeInItems:sc("fadeInItems",[js("showing",po({opacity:1})),Vr("void => *",[po({opacity:0}),ss("400ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)")])])},zve=mlA.fadeInItems,Ove=mlA.transformMenu;var Mf=class t{sessionState={};constructor(){}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=zA({type:t,selectors:[["app-state-tab"]],inputs:{sessionState:"sessionState"},standalone:!1,decls:3,vars:1,consts:[[1,"state-wrapper"],[3,"json"]],template:function(A,i){A&1&&(S(0,"div",0)(1,"div"),JA(2,"ngx-json-viewer",1),F()()),A&2&&(G(2),yA("json",i.sessionState))},dependencies:[FQ],styles:[".state-wrapper[_ngcontent-%COMP%]{padding-left:25px;padding-right:25px;margin-top:16px}"]})};var kf=class t{constructor(e,A){this.el=e;this.renderer=A;this.sideDrawerMaxWidth=window.innerWidth/2}sideDrawerMinWidth=310;sideDrawerMaxWidth;resizeHandle=null;resizingEvent={isResizing:!1,startingCursorX:0,startingWidth:0};ngAfterViewInit(){this.resizeHandle=document.getElementsByClassName("resize-handler")[0],this.renderer.listen(this.resizeHandle,"mousedown",e=>this.onResizeHandleMouseDown(e)),document.documentElement.style.setProperty("--side-drawer-width","570px"),this.renderer.setStyle(this.el.nativeElement,"width","var(--side-drawer-width)")}onResizeHandleMouseDown(e){this.resizingEvent={isResizing:!0,startingCursorX:e.clientX,startingWidth:this.sideDrawerWidth},e.preventDefault()}onMouseMove(e){if(!this.resizingEvent.isResizing)return;let A=e.clientX-this.resizingEvent.startingCursorX,i=this.resizingEvent.startingWidth+A;this.sideDrawerWidth=i,this.renderer.addClass(document.body,"resizing")}onMouseUp(){this.resizingEvent.isResizing=!1,this.renderer.removeClass(document.body,"resizing")}onResize(){this.sideDrawerMaxWidth=window.innerWidth/2,this.sideDrawerWidth=this.sideDrawerWidth}set sideDrawerWidth(e){let A=Math.min(Math.max(e,this.sideDrawerMinWidth),this.sideDrawerMaxWidth);document.body.style.setProperty("--side-drawer-width",`${A}px`)}get sideDrawerWidth(){let e=getComputedStyle(document.body).getPropertyValue("--side-drawer-width"),A=parseInt(e,10);return isNaN(A)?500:A}static \u0275fac=function(A){return new(A||t)(PA(ee),PA(Wi))};static \u0275dir=jA({type:t,selectors:[["","appResizableDrawer",""]],hostBindings:function(A,i){A&1&&hA("mousemove",function(o){return i.onMouseMove(o)},!1,Wd)("mouseup",function(){return i.onMouseUp()},!1,Wd)("resize",function(){return i.onResize()},!1,wp)},standalone:!1})};var Sf=class t{constructor(e,A){this.el=e;this.renderer=A;this.bottomMaxHeight=window.innerHeight}bottomMinHeight=310;bottomMaxHeight;resizeHandle=null;resizingEvent={isResizing:!1,startingCursorY:0,startingHeight:0};ngAfterViewInit(){this.resizeHandle=document.getElementsByClassName("bottom-resize-handler")[0],this.renderer.listen(this.resizeHandle,"mousedown",e=>this.onResizeHandleMouseDown(e)),document.documentElement.style.setProperty("--bottom-panel-height","310px"),this.renderer.setStyle(this.el.nativeElement,"height","var(--bottom-panel-height)")}onResizeHandleMouseDown(e){this.resizingEvent={isResizing:!0,startingCursorY:e.clientY,startingHeight:this.bottomPanelHeight},e.preventDefault()}onMouseMove(e){if(!this.resizingEvent.isResizing)return;let A=this.resizingEvent.startingCursorY-e.clientY,i=this.resizingEvent.startingHeight+A;this.bottomPanelHeight=i,this.renderer.addClass(document.body,"resizing")}onMouseUp(){this.resizingEvent.isResizing=!1,this.renderer.removeClass(document.body,"resizing")}onResize(){this.bottomMaxHeight=window.innerHeight/2,this.bottomPanelHeight=this.bottomPanelHeight}set bottomPanelHeight(e){let A=Math.min(Math.max(e,this.bottomMinHeight),this.bottomMaxHeight);document.body.style.setProperty("--bottom-panel-height",`${A}px`)}get bottomPanelHeight(){let e=getComputedStyle(document.body).getPropertyValue("--bottom-panel-height"),A=parseInt(e,10);return isNaN(A)?500:A}static \u0275fac=function(A){return new(A||t)(PA(ee),PA(Wi))};static \u0275dir=jA({type:t,selectors:[["","appResizableBottomPanel",""]],hostBindings:function(A,i){A&1&&hA("mousemove",function(o){return i.onMouseMove(o)},!1,Wd)("mouseup",function(){return i.onMouseUp()},!1,Wd)("resize",function(){return i.onResize()},!1,wp)},standalone:!1})};var plA=new dA("CdkAccordion");var wlA=(()=>{class t{accordion=f(plA,{optional:!0,skipSelf:!0});_changeDetectorRef=f(It);_expansionDispatcher=f(xB);_openCloseAllSubscription=Kt.EMPTY;closed=new WA;opened=new WA;destroyed=new WA;expandedChange=new WA;id=f(sn).getId("cdk-accordion-child-");get expanded(){return this._expanded}set expanded(A){if(this._expanded!==A){if(this._expanded=A,this.expandedChange.emit(A),A){this.opened.emit();let i=this.accordion?this.accordion.id:this.id;this._expansionDispatcher.notify(this.id,i)}else this.closed.emit();this._changeDetectorRef.markForCheck()}}_expanded=!1;disabled=!1;_removeUniqueSelectionListener=()=>{};constructor(){}ngOnInit(){this._removeUniqueSelectionListener=this._expansionDispatcher.listen((A,i)=>{this.accordion&&!this.accordion.multi&&this.accordion.id===i&&this.id!==A&&(this.expanded=!1)}),this.accordion&&(this._openCloseAllSubscription=this._subscribeToOpenCloseAllActions())}ngOnDestroy(){this.opened.complete(),this.closed.complete(),this.destroyed.emit(),this.destroyed.complete(),this._removeUniqueSelectionListener(),this._openCloseAllSubscription.unsubscribe()}toggle(){this.disabled||(this.expanded=!this.expanded)}close(){this.disabled||(this.expanded=!1)}open(){this.disabled||(this.expanded=!0)}_subscribeToOpenCloseAllActions(){return this.accordion._openCloseAllActions.subscribe(A=>{this.disabled||(this.expanded=A)})}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["cdk-accordion-item"],["","cdkAccordionItem",""]],inputs:{expanded:[2,"expanded","expanded",ie],disabled:[2,"disabled","disabled",ie]},outputs:{closed:"closed",opened:"opened",destroyed:"destroyed",expandedChange:"expandedChange"},exportAs:["cdkAccordionItem"],features:[ht([{provide:plA,useValue:void 0}])]})}return t})(),DlA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({})}return t})();var ajA=["body"],cjA=["bodyWrapper"],ljA=[[["mat-expansion-panel-header"]],"*",[["mat-action-row"]]],gjA=["mat-expansion-panel-header","*","mat-action-row"];function IjA(t,e){}var CjA=[[["mat-panel-title"]],[["mat-panel-description"]],"*"],djA=["mat-panel-title","mat-panel-description","*"];function BjA(t,e){t&1&&(S(0,"span",1),ar(),S(1,"svg",2),JA(2,"path",3),F()())}var ylA=new dA("MAT_ACCORDION"),vlA=new dA("MAT_EXPANSION_PANEL"),EjA=(()=>{class t{_template=f(wn);_expansionPanel=f(vlA,{optional:!0});constructor(){}static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["ng-template","matExpansionPanelContent",""]]})}return t})(),blA=new dA("MAT_EXPANSION_PANEL_DEFAULT_OPTIONS"),cU=(()=>{class t extends wlA{_viewContainerRef=f(Nn);_animationsDisabled=f(Si,{optional:!0})==="NoopAnimations";_document=f(at);_ngZone=f(Qe);_elementRef=f(ee);_renderer=f(Wi);_cleanupTransitionEnd;get hideToggle(){return this._hideToggle||this.accordion&&this.accordion.hideToggle}set hideToggle(A){this._hideToggle=A}_hideToggle=!1;get togglePosition(){return this._togglePosition||this.accordion&&this.accordion.togglePosition}set togglePosition(A){this._togglePosition=A}_togglePosition;afterExpand=new WA;afterCollapse=new WA;_inputChanges=new OA;accordion=f(ylA,{optional:!0,skipSelf:!0});_lazyContent;_body;_bodyWrapper;_portal;_headerId=f(sn).getId("mat-expansion-panel-header-");constructor(){super();let A=f(blA,{optional:!0});this._expansionDispatcher=f(xB),A&&(this.hideToggle=A.hideToggle)}_hasSpacing(){return this.accordion?this.expanded&&this.accordion.displayMode==="default":!1}_getExpandedState(){return this.expanded?"expanded":"collapsed"}toggle(){this.expanded=!this.expanded}close(){this.expanded=!1}open(){this.expanded=!0}ngAfterContentInit(){this._lazyContent&&this._lazyContent._expansionPanel===this&&this.opened.pipe(Pn(null),kt(()=>this.expanded&&!this._portal),On(1)).subscribe(()=>{this._portal=new ys(this._lazyContent._template,this._viewContainerRef)}),this._setupAnimationEvents()}ngOnChanges(A){this._inputChanges.next(A)}ngOnDestroy(){super.ngOnDestroy(),this._cleanupTransitionEnd?.(),this._inputChanges.complete()}_containsFocus(){if(this._body){let A=this._document.activeElement,i=this._body.nativeElement;return A===i||i.contains(A)}return!1}_transitionEndListener=({target:A,propertyName:i})=>{A===this._bodyWrapper?.nativeElement&&i==="grid-template-rows"&&this._ngZone.run(()=>{this.expanded?this.afterExpand.emit():this.afterCollapse.emit()})};_setupAnimationEvents(){this._ngZone.runOutsideAngular(()=>{this._animationsDisabled?(this.opened.subscribe(()=>this._ngZone.run(()=>this.afterExpand.emit())),this.closed.subscribe(()=>this._ngZone.run(()=>this.afterCollapse.emit()))):setTimeout(()=>{let A=this._elementRef.nativeElement;this._cleanupTransitionEnd=this._renderer.listen(A,"transitionend",this._transitionEndListener),A.classList.add("mat-expansion-panel-animations-enabled")},200)})}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-expansion-panel"]],contentQueries:function(i,n,o){if(i&1&&ci(o,EjA,5),i&2){let r;XA(r=$A())&&(n._lazyContent=r.first)}},viewQuery:function(i,n){if(i&1&&(Te(ajA,5),Te(cjA,5)),i&2){let o;XA(o=$A())&&(n._body=o.first),XA(o=$A())&&(n._bodyWrapper=o.first)}},hostAttrs:[1,"mat-expansion-panel"],hostVars:4,hostBindings:function(i,n){i&2&&ue("mat-expanded",n.expanded)("mat-expansion-panel-spacing",n._hasSpacing())},inputs:{hideToggle:[2,"hideToggle","hideToggle",ie],togglePosition:"togglePosition"},outputs:{afterExpand:"afterExpand",afterCollapse:"afterCollapse"},exportAs:["matExpansionPanel"],features:[ht([{provide:ylA,useValue:void 0},{provide:vlA,useExisting:t}]),lt,ti],ngContentSelectors:gjA,decls:9,vars:4,consts:[["bodyWrapper",""],["body",""],[1,"mat-expansion-panel-content-wrapper"],["role","region",1,"mat-expansion-panel-content",3,"id"],[1,"mat-expansion-panel-body"],[3,"cdkPortalOutlet"]],template:function(i,n){i&1&&(jt(ljA),Fe(0),S(1,"div",2,0)(3,"div",3,1)(5,"div",4),Fe(6,1),_A(7,IjA,0,0,"ng-template",5),F(),Fe(8,2),F()()),i&2&&(G(),Ne("inert",n.expanded?null:""),G(2),yA("id",n.id),Ne("aria-labelledby",n._headerId),G(4),yA("cdkPortalOutlet",n._portal))},dependencies:[fa],styles:[".mat-expansion-panel{box-sizing:content-box;display:block;margin:0;overflow:hidden;position:relative;background:var(--mat-expansion-container-background-color, var(--mat-sys-surface));color:var(--mat-expansion-container-text-color, var(--mat-sys-on-surface));border-radius:var(--mat-expansion-container-shape, 12px)}.mat-expansion-panel.mat-expansion-panel-animations-enabled{transition:margin 225ms cubic-bezier(0.4, 0, 0.2, 1),box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel:not([class*=mat-elevation-z]){box-shadow:0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12)}.mat-accordion .mat-expansion-panel:not(.mat-expanded),.mat-accordion .mat-expansion-panel:not(.mat-expansion-panel-spacing){border-radius:0}.mat-accordion .mat-expansion-panel:first-of-type{border-top-right-radius:var(--mat-expansion-container-shape, 12px);border-top-left-radius:var(--mat-expansion-container-shape, 12px)}.mat-accordion .mat-expansion-panel:last-of-type{border-bottom-right-radius:var(--mat-expansion-container-shape, 12px);border-bottom-left-radius:var(--mat-expansion-container-shape, 12px)}@media(forced-colors: active){.mat-expansion-panel{outline:solid 1px}}.mat-expansion-panel-content-wrapper{display:grid;grid-template-rows:0fr;grid-template-columns:100%}.mat-expansion-panel-animations-enabled .mat-expansion-panel-content-wrapper{transition:grid-template-rows 225ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel.mat-expanded>.mat-expansion-panel-content-wrapper{grid-template-rows:1fr}@supports not (grid-template-rows: 0fr){.mat-expansion-panel-content-wrapper{height:0}.mat-expansion-panel.mat-expanded>.mat-expansion-panel-content-wrapper{height:auto}}.mat-expansion-panel-content{display:flex;flex-direction:column;overflow:visible;min-height:0;visibility:hidden;font-family:var(--mat-expansion-container-text-font, var(--mat-sys-body-large-font));font-size:var(--mat-expansion-container-text-size, var(--mat-sys-body-large-size));font-weight:var(--mat-expansion-container-text-weight, var(--mat-sys-body-large-weight));line-height:var(--mat-expansion-container-text-line-height, var(--mat-sys-body-large-line-height));letter-spacing:var(--mat-expansion-container-text-tracking, var(--mat-sys-body-large-tracking))}.mat-expansion-panel-animations-enabled .mat-expansion-panel-content{transition:visibility 190ms linear}.mat-expansion-panel.mat-expanded>.mat-expansion-panel-content-wrapper>.mat-expansion-panel-content{visibility:visible}.mat-expansion-panel-body{padding:0 24px 16px}.mat-expansion-panel-spacing{margin:16px 0}.mat-accordion>.mat-expansion-panel-spacing:first-child,.mat-accordion>*:first-child:not(.mat-expansion-panel) .mat-expansion-panel-spacing{margin-top:0}.mat-accordion>.mat-expansion-panel-spacing:last-child,.mat-accordion>*:last-child:not(.mat-expansion-panel) .mat-expansion-panel-spacing{margin-bottom:0}.mat-action-row{border-top-style:solid;border-top-width:1px;display:flex;flex-direction:row;justify-content:flex-end;padding:16px 8px 16px 24px;border-top-color:var(--mat-expansion-actions-divider-color, var(--mat-sys-outline))}.mat-action-row .mat-button-base,.mat-action-row .mat-mdc-button-base{margin-left:8px}[dir=rtl] .mat-action-row .mat-button-base,[dir=rtl] .mat-action-row .mat-mdc-button-base{margin-left:0;margin-right:8px}"],encapsulation:2,changeDetection:0})}return t})();var MlA=(()=>{class t{panel=f(cU,{host:!0});_element=f(ee);_focusMonitor=f(dr);_changeDetectorRef=f(It);_parentChangeSubscription=Kt.EMPTY;constructor(){f(Rn).load(lr);let A=this.panel,i=f(blA,{optional:!0}),n=f(new wr("tabindex"),{optional:!0}),o=A.accordion?A.accordion._stateChanges.pipe(kt(r=>!!(r.hideToggle||r.togglePosition))):sr;this.tabIndex=parseInt(n||"")||0,this._parentChangeSubscription=zn(A.opened,A.closed,o,A._inputChanges.pipe(kt(r=>!!(r.hideToggle||r.disabled||r.togglePosition)))).subscribe(()=>this._changeDetectorRef.markForCheck()),A.closed.pipe(kt(()=>A._containsFocus())).subscribe(()=>this._focusMonitor.focusVia(this._element,"program")),i&&(this.expandedHeight=i.expandedHeight,this.collapsedHeight=i.collapsedHeight)}expandedHeight;collapsedHeight;tabIndex=0;get disabled(){return this.panel.disabled}_toggle(){this.disabled||this.panel.toggle()}_isExpanded(){return this.panel.expanded}_getExpandedState(){return this.panel._getExpandedState()}_getPanelId(){return this.panel.id}_getTogglePosition(){return this.panel.togglePosition}_showToggle(){return!this.panel.hideToggle&&!this.panel.disabled}_getHeaderHeight(){let A=this._isExpanded();return A&&this.expandedHeight?this.expandedHeight:!A&&this.collapsedHeight?this.collapsedHeight:null}_keydown(A){switch(A.keyCode){case 32:case 13:ir(A)||(A.preventDefault(),this._toggle());break;default:this.panel.accordion&&this.panel.accordion._handleHeaderKeydown(A);return}}focus(A,i){A?this._focusMonitor.focusVia(this._element,A,i):this._element.nativeElement.focus(i)}ngAfterViewInit(){this._focusMonitor.monitor(this._element).subscribe(A=>{A&&this.panel.accordion&&this.panel.accordion._handleHeaderFocus(this)})}ngOnDestroy(){this._parentChangeSubscription.unsubscribe(),this._focusMonitor.stopMonitoring(this._element)}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-expansion-panel-header"]],hostAttrs:["role","button",1,"mat-expansion-panel-header","mat-focus-indicator"],hostVars:13,hostBindings:function(i,n){i&1&&hA("click",function(){return n._toggle()})("keydown",function(r){return n._keydown(r)}),i&2&&(Ne("id",n.panel._headerId)("tabindex",n.disabled?-1:n.tabIndex)("aria-controls",n._getPanelId())("aria-expanded",n._isExpanded())("aria-disabled",n.panel.disabled),uo("height",n._getHeaderHeight()),ue("mat-expanded",n._isExpanded())("mat-expansion-toggle-indicator-after",n._getTogglePosition()==="after")("mat-expansion-toggle-indicator-before",n._getTogglePosition()==="before"))},inputs:{expandedHeight:"expandedHeight",collapsedHeight:"collapsedHeight",tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:zi(A)]},ngContentSelectors:djA,decls:5,vars:3,consts:[[1,"mat-content"],[1,"mat-expansion-indicator"],["xmlns","http://www.w3.org/2000/svg","viewBox","0 -960 960 960","aria-hidden","true","focusable","false"],["d","M480-345 240-585l56-56 184 184 184-184 56 56-240 240Z"]],template:function(i,n){i&1&&(jt(CjA),S(0,"span",0),Fe(1),Fe(2,1),Fe(3,2),F(),_A(4,BjA,3,0,"span",1)),i&2&&(ue("mat-content-hide-toggle",!n._showToggle()),G(4),GA(n._showToggle()?4:-1))},styles:['.mat-expansion-panel-header{display:flex;flex-direction:row;align-items:center;padding:0 24px;border-radius:inherit;height:var(--mat-expansion-header-collapsed-state-height, 48px);font-family:var(--mat-expansion-header-text-font, var(--mat-sys-title-medium-font));font-size:var(--mat-expansion-header-text-size, var(--mat-sys-title-medium-size));font-weight:var(--mat-expansion-header-text-weight, var(--mat-sys-title-medium-weight));line-height:var(--mat-expansion-header-text-line-height, var(--mat-sys-title-medium-line-height));letter-spacing:var(--mat-expansion-header-text-tracking, var(--mat-sys-title-medium-tracking))}.mat-expansion-panel-animations-enabled .mat-expansion-panel-header{transition:height 225ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel-header::before{border-radius:inherit}.mat-expansion-panel-header.mat-expanded{height:var(--mat-expansion-header-expanded-state-height, 64px)}.mat-expansion-panel-header[aria-disabled=true]{color:var(--mat-expansion-header-disabled-state-text-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-expansion-panel-header:not([aria-disabled=true]){cursor:pointer}.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:var(--mat-expansion-header-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}@media(hover: none){.mat-expansion-panel:not(.mat-expanded) .mat-expansion-panel-header:not([aria-disabled=true]):hover{background:var(--mat-expansion-container-background-color, var(--mat-sys-surface))}}.mat-expansion-panel .mat-expansion-panel-header:not([aria-disabled=true]).cdk-keyboard-focused,.mat-expansion-panel .mat-expansion-panel-header:not([aria-disabled=true]).cdk-program-focused{background:var(--mat-expansion-header-focus-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-focus-state-layer-opacity) * 100%), transparent))}.mat-expansion-panel-header._mat-animation-noopable{transition:none}.mat-expansion-panel-header:focus,.mat-expansion-panel-header:hover{outline:none}.mat-expansion-panel-header.mat-expanded:focus,.mat-expansion-panel-header.mat-expanded:hover{background:inherit}.mat-expansion-panel-header.mat-expansion-toggle-indicator-before{flex-direction:row-reverse}.mat-expansion-panel-header.mat-expansion-toggle-indicator-before .mat-expansion-indicator{margin:0 16px 0 0}[dir=rtl] .mat-expansion-panel-header.mat-expansion-toggle-indicator-before .mat-expansion-indicator{margin:0 0 0 16px}.mat-content{display:flex;flex:1;flex-direction:row;overflow:hidden}.mat-content.mat-content-hide-toggle{margin-right:8px}[dir=rtl] .mat-content.mat-content-hide-toggle{margin-right:0;margin-left:8px}.mat-expansion-toggle-indicator-before .mat-content.mat-content-hide-toggle{margin-left:24px;margin-right:0}[dir=rtl] .mat-expansion-toggle-indicator-before .mat-content.mat-content-hide-toggle{margin-right:24px;margin-left:0}.mat-expansion-panel-header-title{color:var(--mat-expansion-header-text-color, var(--mat-sys-on-surface))}.mat-expansion-panel-header-title,.mat-expansion-panel-header-description{display:flex;flex-grow:1;flex-basis:0;margin-right:16px;align-items:center}[dir=rtl] .mat-expansion-panel-header-title,[dir=rtl] .mat-expansion-panel-header-description{margin-right:0;margin-left:16px}.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-title,.mat-expansion-panel-header[aria-disabled=true] .mat-expansion-panel-header-description{color:inherit}.mat-expansion-panel-header-description{flex-grow:2;color:var(--mat-expansion-header-description-color, var(--mat-sys-on-surface-variant))}.mat-expansion-panel-animations-enabled .mat-expansion-indicator{transition:transform 225ms cubic-bezier(0.4, 0, 0.2, 1)}.mat-expansion-panel-header.mat-expanded .mat-expansion-indicator{transform:rotate(180deg)}.mat-expansion-indicator::after{border-style:solid;border-width:0 2px 2px 0;content:"";display:inline-block;padding:3px;transform:rotate(45deg);vertical-align:middle;color:var(--mat-expansion-header-indicator-color, var(--mat-sys-on-surface-variant));display:var(--mat-expansion-legacy-header-indicator-display, none)}.mat-expansion-indicator svg{width:24px;height:24px;margin:0 -8px;vertical-align:middle;fill:var(--mat-expansion-header-indicator-color, var(--mat-sys-on-surface-variant));display:var(--mat-expansion-header-indicator-display, inline-block)}@media(forced-colors: active){.mat-expansion-panel-content{border-top:1px solid;border-top-left-radius:0;border-top-right-radius:0}}'],encapsulation:2,changeDetection:0})}return t})();var klA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275dir=jA({type:t,selectors:[["mat-panel-title"]],hostAttrs:[1,"mat-expansion-panel-header-title"]})}return t})();var SlA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[it,DlA,dg]})}return t})();var RlA=t=>({color:t});function hjA(t,e){t&1&&JA(0,"div",8)}function ujA(t,e){if(t&1&&(S(0,"span",14),AA(1),F()),t&2){let A=O().$implicit,i=O();uo("left",i.getRelativeStart(A.span)+5,"%"),G(),Et("",(i.toMs(A.span.end_time)-i.toMs(A.span.start_time)).toFixed(2),"ms")}}function fjA(t,e){if(t&1){let A=be();S(0,"div",5),hA("click",function(){let n=RA(A).$implicit,o=O();return xA(o.selectRow(n))})("mouseenter",function(){let n=RA(A).$implicit,o=O();return xA(o.onHover(n))})("mouseleave",function(){RA(A);let n=O();return xA(n.onHoverOut())}),S(1,"div",6)(2,"div",7),Dn(3,hjA,1,0,"div",8,Xd),F(),S(5,"span",9),AA(6),F(),S(7,"div",10),AA(8),F()(),S(9,"div",11)(10,"div",12),AA(11),F(),_A(12,ujA,2,3,"span",13),F()()}if(t&2){let A=e.$implicit,i=O();ue("selected",i.rowSelected(A)),G(3),yn(i.getArray(A.level)),G(2),yA("ngStyle",qr(14,RlA,i.isEventRow(A)?"#8AB4F8":"white")),G(),Et(" ",i.getSpanIcon(A.span.name)," "),G(),uo("width",400-A.level*20,"px"),yA("ngStyle",qr(16,RlA,i.isEventRow(A)?"#8AB4F8":"white")),G(),Et(" ",A.span.name," "),G(2),uo("left",i.getRelativeStart(A.span),"%")("width",i.getRelativeWidth(A.span),"%"),G(),Et(" ",(i.toMs(A.span.end_time)-i.toMs(A.span.start_time)).toFixed(2),"ms "),G(),GA(i.getRelativeWidth(A.span)<10?12:-1)}}var Rf=class t{constructor(e){this.traceService=e}spans=[];invocationId="";tree=[];eventData;baseStartTimeMs=0;totalDurationMs=1;flatTree=[];traceLabelIconMap=new Map([["Invocation","start"],["agent_run","directions_run"],["tool","build"],["call_llm","chat"]]);selectedRow=void 0;ngOnInit(){this.tree=this.buildSpanTree(this.spans),this.flatTree=this.flattenTree(this.tree);let e=this.getGlobalTimes(this.spans);this.baseStartTimeMs=e.start,this.totalDurationMs=e.duration,this.traceService.selectedTraceRow$.subscribe(A=>this.selectedRow=A),this.traceService.eventData$.subscribe(A=>this.eventData=A)}buildSpanTree(e){let A=e.map(o=>rA({},o)),i=new Map,n=[];return A.forEach(o=>i.set(o.span_id,o)),A.forEach(o=>{if(o.parent_span_id&&i.has(o.parent_span_id)){let r=i.get(o.parent_span_id);r.children=r.children||[],r.children.push(o)}else n.push(o)}),n}getGlobalTimes(e){let A=Math.min(...e.map(n=>this.toMs(n.start_time))),i=Math.max(...e.map(n=>this.toMs(n.end_time)));return{start:A,duration:i-A}}toMs(e){return e/1e6}getRelativeStart(e){return(this.toMs(e.start_time)-this.baseStartTimeMs)/this.totalDurationMs*100}getRelativeWidth(e){return(this.toMs(e.end_time)-this.toMs(e.start_time))/this.totalDurationMs*100}flattenTree(e,A=0){return e.flatMap(n=>[{span:n,level:A},...n.children?this.flattenTree(n.children,A+1):[]])}getSpanIcon(e){for(let[A,i]of this.traceLabelIconMap.entries())if(e.startsWith(A))return i;return"start"}getArray(e){return Array.from({length:e})}selectRow(e){if(this.selectedRow&&this.selectedRow.span_id==e.span.span_id){this.traceService.selectedRow(void 0),this.traceService.setHoveredMessages(void 0,this.invocationId);return}this.traceService.selectedRow(e.span),this.traceService.setHoveredMessages(e.span,this.invocationId)}rowSelected(e){return this.selectedRow==e.span}isEventRow(e){if(!e.span.attributes)return!1;let A=e?.span.attributes["gcp.vertex.agent.event_id"];return!!(A&&this.eventData&&this.eventData.has(A))}onHover(e){this.traceService.setHoveredMessages(e.span,this.invocationId)}onHoverOut(){this.traceService.setHoveredMessages(void 0,this.invocationId),this.selectedRow&&this.traceService.setHoveredMessages(this.selectedRow,this.invocationId)}static \u0275fac=function(A){return new(A||t)(PA($g))};static \u0275cmp=zA({type:t,selectors:[["app-trace-tree"]],inputs:{spans:"spans",invocationId:"invocationId"},standalone:!1,decls:8,vars:1,consts:[[2,"margin-top","15px"],[1,"invocation-id-container"],[1,"invocation-id"],[1,"trace-container"],[1,"trace-row",3,"selected"],[1,"trace-row",3,"click","mouseenter","mouseleave"],[1,"trace-row-left"],[1,"trace-indent"],[1,"indent-connector"],[1,"material-symbols-outlined",2,"margin-right","8px",3,"ngStyle"],[1,"trace-label",3,"ngStyle"],[1,"trace-bar-container"],[1,"trace-bar"],[2,"position","absolute","color","#8dabbf",3,"left"],[2,"position","absolute","color","#8dabbf"]],template:function(A,i){A&1&&(S(0,"div",0)(1,"div",1),AA(2,"Invocation ID: "),S(3,"div",2),AA(4),F()(),S(5,"div",3),Dn(6,fjA,13,18,"div",4,to),F()()),A&2&&(G(4),Gt(i.invocationId),G(2),yn(i.flatTree))},dependencies:[Kh],styles:[".trace-container[_ngcontent-%COMP%]{width:100%;white-space:nowrap;font-size:12px}.trace-label[_ngcontent-%COMP%]{width:400px;color:#e3e3e3;font-family:Google Sans Mono,monospace;font-size:13px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:0px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.trace-bar-container[_ngcontent-%COMP%]{width:100%;position:relative;height:16px}.trace-bar[_ngcontent-%COMP%]{position:absolute;height:18px;background-color:#2f4d65;border-radius:4px;padding-left:4px;overflow:hidden;font-size:11px;line-height:16px;color:#8dabbf;font-family:Google Sans}.trace-duration[_ngcontent-%COMP%]{color:#888;font-weight:400;margin-left:4px}.trace-row[_ngcontent-%COMP%]{display:flex;align-items:stretch;position:relative;height:32px;align-items:center;cursor:pointer}.trace-row[_ngcontent-%COMP%]:hover, .trace-row.selected[_ngcontent-%COMP%]{background-color:#3b3d3c}.trace-indent[_ngcontent-%COMP%]{display:flex;flex-shrink:0;height:100%}.indent-connector[_ngcontent-%COMP%]{width:20px;position:relative;height:100%}.vertical-line[_ngcontent-%COMP%]{position:absolute;top:0;bottom:0;left:9px;width:1px;background-color:#ccc}.horizontal-line[_ngcontent-%COMP%]{position:absolute;top:50%;left:9px;width:10px;height:1px;background-color:#ccc}.trace-row-left[_ngcontent-%COMP%]{display:flex;width:50%}.invocation-id-container[_ngcontent-%COMP%]{color:#9aa0a6;font-size:14px;font-style:normal;font-weight:700;line-height:20px;letter-spacing:0px;margin-bottom:5px}.invocation-id[_ngcontent-%COMP%]{font-family:Google Sans Mono,monospace}"]})};function pjA(t,e){if(t&1&&(S(0,"div",3)(1,"mat-expansion-panel")(2,"mat-expansion-panel-header")(3,"mat-panel-title"),AA(4),F()(),JA(5,"app-trace-tree",4),F()()),t&2){let A=e.$implicit,i=O();G(4),Et(" ",i.invocToUserMsg.get(A.key)," "),G(),yA("spans",A.value)("invocationId",i.findInvocIdFromTraceId(A.key))}}var xf=class t{traceData=[];invocTraces=new Map;invocToUserMsg=new Map;constructor(){}ngOnInit(){}ngOnChanges(e){"traceData"in e&&this.rebuildTrace()}rebuildTrace(){this.invocTraces=this.traceData.reduce((e,A)=>{let i=A.trace_id,n=e.get(i);return n?(n.push(A),n.sort((o,r)=>o.start_time-r.start_time)):e.set(i,[A]),e},new Map);for(let[e,A]of this.invocTraces)this.invocToUserMsg.set(e,this.findUserMsgFromInvocGroup(A))}getArray(e){return Array.from({length:e})}findUserMsgFromInvocGroup(e){let A=e?.find(o=>o.attributes!==void 0&&"gcp.vertex.agent.invocation_id"in o.attributes);return JSON.parse(A.attributes["gcp.vertex.agent.llm_request"]).contents.filter(o=>o.role=="user").at(-1).parts[0]?.text??"[attachment]"}findInvocIdFromTraceId(e){return this.invocTraces.get(e)?.find(i=>i.attributes!==void 0&&"gcp.vertex.agent.invocation_id"in i.attributes).attributes["gcp.vertex.agent.invocation_id"]}mapOrderPreservingSort=(e,A)=>0;static \u0275fac=function(A){return new(A||t)};static \u0275cmp=zA({type:t,selectors:[["app-trace-tab"]],inputs:{traceData:"traceData"},standalone:!1,features:[ti],decls:7,vars:3,consts:[[2,"padding-left","25px","padding-right","25px"],["mat-dialog-title","",1,"trace-title"],[1,"trace-list-wrapper"],[1,"trace-item"],[3,"spans","invocationId"]],template:function(A,i){A&1&&(S(0,"div",0)(1,"h2",1),AA(2,"Invocations"),F(),S(3,"div",2),Dn(4,pjA,6,3,"div",3,to),Za(6,"keyvalue"),F()()),A&2&&(G(4),yn(Lh(6,0,i.invocTraces,i.mapOrderPreservingSort)))},dependencies:[bs,cU,MlA,klA,Rf,Th],styles:[".trace-container[_ngcontent-%COMP%]{width:100%;white-space:nowrap;font-size:12px}.trace-title[_ngcontent-%COMP%]{color:#9aa0a6;font-size:14px;font-style:normal;font-weight:700;line-height:20px;letter-spacing:0px}.trace-label[_ngcontent-%COMP%]{width:400px;color:#e3e3e3;text-overflow:ellipsis;font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:500;line-height:20px;letter-spacing:0px}.trace-bar-container[_ngcontent-%COMP%]{width:50vw;position:relative;height:16px}.trace-bar[_ngcontent-%COMP%]{position:absolute;height:18px;background-color:#2f4d65;border-radius:4px;padding-left:4px;overflow:hidden;font-size:11px;line-height:16px;color:#8dabbf;font-family:Google Sans}.trace-duration[_ngcontent-%COMP%]{color:#888;font-weight:400;margin-left:4px}.trace-row[_ngcontent-%COMP%]{display:flex;align-items:stretch;position:relative;height:32px}.trace-indent[_ngcontent-%COMP%]{display:flex;flex-shrink:0;height:100%}.indent-connector[_ngcontent-%COMP%]{width:20px;position:relative;height:100%}.vertical-line[_ngcontent-%COMP%]{position:absolute;top:0;bottom:0;left:9px;width:1px;background-color:#ccc}.horizontal-line[_ngcontent-%COMP%]{position:absolute;top:50%;left:9px;width:10px;height:1px;background-color:#ccc}.trace-item[_ngcontent-%COMP%]{margin-top:5px}.trace-item[_ngcontent-%COMP%]{--mat-expansion-container-background-color: #333537}.trace-item[_ngcontent-%COMP%]{--mat-expansion-header-focus-state-layer-color: red}.trace-item[_ngcontent-%COMP%]{--mat-expansion-header-description-color: #8e918f}.trace-item[_ngcontent-%COMP%]{--mat-expansion-header-text-size: 15} .mat-expansion-panel-header.mat-expanded:focus{background-color:#444746!important} .mat-expansion-panel-header.mat-expanded{background-color:#444746!important} .mat-expansion-panel-header.mat-expanded:hover{background-color:#444746!important} .mat-expansion-panel-header-title{text-overflow:ellipsis;white-space:nowrap;overflow:hidden} .mat-expansion-panel-header-description{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}"]})};function DjA(t,e){if(t&1){let A=be();S(0,"div",11),hA("click",function(){RA(A);let n=O();return xA(n.openViewImageDialog(n.rawSvgString))}),F()}if(t&2){let A=O();yA("innerHtml",A.renderedEventGraph,RI)}}var Lf=class t{constructor(e,A,i,n){this.dialog=e;this.traceService=A;this.eventService=i;this.sanitizer=n}userId="";sessionId="";appName="";panelClosed=new WA;renderedEventGraph;eventData;selectedRow=void 0;rawSvgString=null;llmRequest=void 0;llmResponse=void 0;llmRequestKey="gcp.vertex.agent.llm_request";llmResponseKey="gcp.vertex.agent.llm_response";ngOnInit(){this.traceService.selectedTraceRow$.subscribe(e=>{this.selectedRow=e;let A=this.getEventIdFromSpan();A&&(this.eventService.getEventTrace(A).subscribe(i=>{this.llmRequest=JSON.parse(i[this.llmRequestKey]),this.llmResponse=JSON.parse(i[this.llmResponseKey])}),this.getEventGraph(A))}),this.traceService.eventData$.subscribe(e=>this.eventData=e)}openViewImageDialog(e){let A=this.dialog.open(v0,{maxWidth:"90vw",maxHeight:"90vh",data:{imageData:e}})}getEventDetails(){if(this.eventData&&this.selectedRow)return this.eventData.get(this.getEventIdFromSpan())}getEventIdFromSpan(){if(this.selectedRow)return this.selectedRow.attributes["gcp.vertex.agent.event_id"]}getEventGraph(e){this.eventService.getEvent(this.userId,this.appName,this.sessionId,e).subscribe(A=>Ao(this,null,function*(){if(!A.dotSrc){this.renderedEventGraph=void 0;return}let i=A.dotSrc,o=(yield Yu()).renderString(i,{format:"svg",engine:"dot"});this.rawSvgString=o,this.renderedEventGraph=this.sanitizer.bypassSecurityTrustHtml(o)}))}closePanel(){this.panelClosed.emit(!0)}static \u0275fac=function(A){return new(A||t)(PA(qs),PA($g),PA(nI),PA(cl))};static \u0275cmp=zA({type:t,selectors:[["app-trace-event"]],inputs:{userId:"userId",sessionId:"sessionId",appName:"appName"},outputs:{panelClosed:"panelClosed"},standalone:!1,decls:17,vars:4,consts:[[1,"wrapper"],["mat-stretch-tabs","false","mat-align-tabs","start"],["label","Event"],[1,"json-viewer-container"],[3,"json"],["label","Request"],["label","Response"],["label","Graph"],[1,"event-graph-container"],[3,"innerHtml"],["mat-icon-button","",1,"tab-header-action",3,"click"],[3,"click","innerHtml"]],template:function(A,i){A&1&&(S(0,"div",0)(1,"mat-tab-group",1)(2,"mat-tab",2)(3,"div",3),JA(4,"ngx-json-viewer",4),F()(),S(5,"mat-tab",5)(6,"div",3),JA(7,"ngx-json-viewer",4),F()(),S(8,"mat-tab",6)(9,"div",3),JA(10,"ngx-json-viewer",4),F()(),S(11,"mat-tab",7)(12,"div",8),_A(13,DjA,1,1,"div",9),F()()(),S(14,"button",10),hA("click",function(){return i.closePanel()}),S(15,"mat-icon"),AA(16,"close"),F()()()),A&2&&(G(4),yA("json",i.getEventDetails()),G(3),yA("json",i.llmRequest),G(3),yA("json",i.llmResponse),G(3),GA(i.renderedEventGraph?13:-1))},dependencies:[P2,kB,FQ,mf,o7],styles:[".json-viewer-container[_ngcontent-%COMP%]{padding-top:8px;padding-left:12px;padding-right:12px;background-color:#1b1b1b}.event-graph-container[_ngcontent-%COMP%]{text-align:center;padding-top:20px}.event-graph-container[_ngcontent-%COMP%] svg text{font-family:Google Sans Mono,monospace;font-size:11px}.wrapper[_ngcontent-%COMP%]{position:relative}.tab-header-action[_ngcontent-%COMP%]{position:absolute;top:0;right:0;height:48px;z-index:2;margin-right:10px}"]})};var vjA=["videoContainer"],bjA=["sideDrawer"],MjA=["autoScroll"],kjA=["messageTextarea"],SjA=["bottomPanel"],RjA=t=>({"edit-mode":t}),xjA=()=>[],LjA=(t,e)=>({"user-message":t,"bot-message":e}),FjA=(t,e)=>({"eval-pass":t,"eval-fail":e}),NjA=t=>({"eval-fail":t}),IU=t=>({"background-color":t}),_jA=(t,e)=>({"font-style":t,color:e}),LlA=t=>({"function-event-button-highlight":t}),CU=t=>({hidden:t});function GjA(t,e){if(t&1){let A=be();S(0,"span",29),hA("click",function(){RA(A);let n=O();return xA(n.toggleSidePanel())}),AA(1,"left_panel_open"),F()}}function UjA(t,e){if(t&1&&(S(0,"mat-option",18),AA(1),F()),t&2){let A=e.$implicit;yA("value",A),G(),Gt(A)}}function KjA(t,e){t&1&&Dn(0,UjA,2,2,"mat-option",18,to),t&2&&yn(e)}function YjA(t,e){if(t&1&&(S(0,"mat-option",18),AA(1),F()),t&2){let A=O();yA("value",A.selectedAppControl.value),G(),Gt(A.selectedAppControl.value)}}function JjA(t,e){t&1&&(S(0,"span",38),AA(1,"Trace"),F())}function TjA(t,e){t&1&&(S(0,"span",38),AA(1,"Events"),F())}function HjA(t,e){t&1&&(S(0,"span",38),AA(1,"State"),F())}function zjA(t,e){t&1&&(S(0,"span",38),AA(1,"Artifacts"),F())}function OjA(t,e){t&1&&(S(0,"span",38),AA(1,"Sessions"),F())}function PjA(t,e){t&1&&(S(0,"span",38),AA(1,"Eval"),F())}function jjA(t,e){if(t&1){let A=be();S(0,"mat-tab"),_A(1,PjA,2,0,"ng-template",32),S(2,"app-eval-tab",39),hA("shouldShowTab",function(n){RA(A);let o=O(2);return xA(o.handleShouldShowEvalTab(n))})("sessionSelected",function(n){RA(A);let o=O(2);return xA(o.updateWithSelectedSession(n))})("evalCaseSelected",function(n){RA(A);let o=O(2);return xA(o.updateWithSelectedEvalCase(n))})("evalSetIdSelected",function(n){RA(A);let o=O(2);return xA(o.updateSelectedEvalSetId(n))})("shouldReturnToSession",function(n){RA(A);let o=O(2);return xA(o.handleReturnToSession(n))})("evalNotInstalledMsg",function(n){RA(A);let o=O(2);return xA(o.handleEvalNotInstalled(n))}),F()()}if(t&2){let A=O(2);G(2),yA("appName",A.appName)("userId",A.userId)("sessionId",A.sessionId)}}function qjA(t,e){if(t&1){let A=be();S(0,"div",19)(1,"mat-tab-group",30),hA("selectedTabChange",function(n){RA(A);let o=O();return xA(o.handleTabChange(n))}),S(2,"mat-tab",31),_A(3,JjA,2,0,"ng-template",32),JA(4,"app-trace-tab",33),F(),S(5,"mat-tab",31),_A(6,TjA,2,0,"ng-template",32),S(7,"app-event-tab",34),hA("selectedEvent",function(n){RA(A);let o=O();return xA(o.selectEvent(n))}),F()(),S(8,"mat-tab"),_A(9,HjA,2,0,"ng-template",32),JA(10,"app-state-tab",35),F(),S(11,"mat-tab"),_A(12,zjA,2,0,"ng-template",32),JA(13,"app-artifact-tab",36),F(),S(14,"mat-tab"),_A(15,OjA,2,0,"ng-template",32),S(16,"app-session-tab",37),hA("sessionSelected",function(n){RA(A);let o=O();return xA(o.updateWithSelectedSession(n))})("sessionReloaded",function(n){RA(A);let o=O();return xA(o.updateSessionState(n))}),F()(),_A(17,jjA,3,3,"mat-tab"),F()()}if(t&2){let A=O();G(4),yA("traceData",A.traceData),G(3),yA("eventsMap",A.eventData)("traceData",A.traceData),G(3),yA("sessionState",A.currentSessionState),G(3),yA("artifacts",A.artifacts),G(3),yA("userId",A.userId)("appName",A.appName)("sessionId",A.sessionId),G(),GA(A.shouldShowEvalTab()?17:-1)}}function VjA(t,e){if(t&1){let A=be();S(0,"div",52),hA("click",function(){RA(A);let n=O(2);return xA(n.openViewImageDialog(n.rawSvgString))}),F()}if(t&2){let A=O(2);yA("innerHtml",A.renderedEventGraph,RI)}}function ZjA(t,e){if(t&1){let A=be();S(0,"div",20)(1,"div",40)(2,"div",41)(3,"mat-paginator",42),hA("page",function(n){RA(A);let o=O();return xA(o.handlePageEvent(n))}),F(),S(4,"button",43)(5,"mat-icon",44),hA("click",function(){RA(A);let n=O();return xA(n.closeSelectedEvent())}),AA(6,"close"),F()()()(),S(7,"div")(8,"mat-tab-group")(9,"mat-tab",45)(10,"div",46),_A(11,VjA,1,1,"div",47),F(),S(12,"div",48),JA(13,"ngx-json-viewer",49),F()(),S(14,"mat-tab",50)(15,"div",48),JA(16,"ngx-json-viewer",49),F()(),S(17,"mat-tab",51)(18,"div",48),JA(19,"ngx-json-viewer",49),F()()()()()}if(t&2){let A=O();G(3),yA("length",A.eventData.size)("pageSize",1)("pageIndex",A.selectedEventIndex),G(8),GA(A.renderedEventGraph?11:-1),G(2),yA("json",A.selectedEvent),G(3),yA("json",A.llmRequest),G(3),yA("json",A.llmResponse)}}function WjA(t,e){if(t&1){let A=be();S(0,"span",54),hA("click",function(){RA(A);let n=O(2);return xA(n.toggleSidePanel())}),AA(1,"left_panel_open"),F()}}function XjA(t,e){if(t&1){let A=be();S(0,"button",59),hA("click",function(){RA(A);let n=O(3);return xA(n.cancelEditEvalCase())}),AA(1,"Cancel"),F(),S(2,"button",60),hA("click",function(){RA(A);let n=O(3);return xA(n.saveEvalCase())}),AA(3," Save "),F()}if(t&2){let A=O(3);G(2),yA("disabled",!A.hasEvalCaseChanged()||A.isEvalCaseEditing())}}function $jA(t,e){if(t&1){let A=be();S(0,"span",61),hA("click",function(){RA(A);let n=O(3);return xA(n.editEvalCase())}),AA(1," edit "),F(),S(2,"span",62),hA("click",function(){RA(A);let n=O(3);return xA(n.deleteEvalCase())}),AA(3," delete "),F()}}function AqA(t,e){if(t&1&&(S(0,"div",55)(1,"div",56),AA(2,"Eval Case ID"),F(),S(3,"div",57),AA(4),F()(),S(5,"div",58),_A(6,XjA,4,1)(7,$jA,4,0),F()),t&2){let A=O(2);G(4),Gt(A.evalCase.evalId),G(2),GA(A.isEvalEditMode()?6:7)}}function eqA(t,e){if(t&1){let A=be();S(0,"span",71),hA("click",function(){RA(A);let n=O(3);return xA(n.importSession())}),AA(1," upload "),F()}}function tqA(t,e){if(t&1){let A=be();S(0,"div",55)(1,"div",56),AA(2,"Session ID"),F(),S(3,"div",57),AA(4),F()(),S(5,"div",58)(6,"div",63)(7,"mat-slide-toggle",64),hA("change",function(){RA(A);let n=O(2);return xA(n.toggleSse())}),AA(8," Token Streaming "),F()(),JA(9,"mat-divider",65),S(10,"div",66)(11,"div",67),hA("click",function(){RA(A);let n=O(2);return xA(n.onNewSessionClick())}),S(12,"mat-icon"),AA(13,"add"),F(),AA(14," New Session "),F(),S(15,"span",68),hA("click",function(){RA(A);let n=O(2);return xA(n.deleteSession(n.sessionId))}),AA(16," delete "),F(),S(17,"span",69),hA("click",function(){RA(A);let n=O(2);return xA(n.exportSession())}),AA(18," download "),F(),_A(19,eqA,2,0,"span",70),Za(20,"async"),F()()}if(t&2){let A=O(2);G(4),Gt(A.sessionId),G(3),yA("checked",A.enableSseIndicator()),G(2),yA("vertical",!0),G(10),GA(M2(20,4,A.importSessionEnabledObs)?19:-1)}}function iqA(t,e){if(t&1&&(S(0,"div",23),_A(1,WjA,2,0,"span",53)(2,AqA,8,2)(3,tqA,21,6),F()),t&2){let A=O();yA("ngClass",qr(3,RjA,A.isEvalEditMode())),G(),GA(A.showSidePanel?-1:1),G(),GA(A.evalCase?2:3)}}function nqA(t,e){t&1&&(S(0,"div",72)(1,"span"),AA(2,"Loading agents, please wait..."),F()())}function oqA(t,e){t&1&&(S(0,"span"),AA(1,"Welcome to ADK!"),JA(2,"br"),AA(3," Select an agent on the left to begin with."),F())}function rqA(t,e){if(t&1&&(AA(0," Error message: "),JA(1,"br"),S(2,"pre",74),AA(3),F()),t&2){let A=O(4);G(3),Gt(A.loadingError())}}function sqA(t,e){t&1&&(S(0,"pre",73),AA(1,"Warning: No agents found in current folder."),F())}function aqA(t,e){if(t&1&&(S(0,"div"),AA(1," Failed to load agents. To get started, run "),S(2,"pre"),AA(3,"adk web"),F(),AA(4," in the folder that contains the agents."),JA(5,"br"),_A(6,rqA,4,1)(7,sqA,2,0,"pre",73),F()),t&2){let A=O(3);G(6),GA(A.loadingError()?6:7)}}function cqA(t,e){if(t&1&&(S(0,"div",72),_A(1,oqA,4,0,"span"),Za(2,"async"),_A(3,aqA,8,1,"div"),F()),t&2){let A=O(2);G(),GA((M2(2,1,A.apps$)||cH(3,xjA)).length>0?1:3)}}function lqA(t,e){if(t&1&&_A(0,nqA,3,0,"div",72)(1,cqA,4,4,"div",72),t&2){let A=O();GA(A.isLoadingApps()?0:1)}}function gqA(t,e){if(t&1){let A=be();S(0,"button",75),hA("click",function(){RA(A);let n=O();return xA(n.openDialog())}),S(1,"mat-icon"),AA(2,"priority_high"),F()()}}function IqA(t,e){if(t&1){let A=be();S(0,"button",81),hA("click",function(){RA(A);let n=O().$index,o=O(2);return xA(o.clickEvent(n))}),S(1,"mat-icon",82),AA(2,"robot_2"),F()()}if(t&2){let A=O().$index,i=O(2);fo(i.customIconColorClass(A)),yA("matTooltip",i.getAgentNameFromEvent(A))}}function CqA(t,e){t&1&&JA(0,"mat-progress-bar",83)}function dqA(t,e){if(t&1&&JA(0,"img",88),t&2){let A=O().$implicit;yA("src",A.url,ja)}}function BqA(t,e){if(t&1&&(S(0,"mat-icon"),AA(1,"insert_drive_file"),F(),S(2,"a",89),AA(3),F()),t&2){let A=O().$implicit;G(2),yA("href",A.url,ja),G(),Gt(A.file.name)}}function EqA(t,e){if(t&1&&(S(0,"div",87),_A(1,dqA,1,1,"img",88)(2,BqA,4,2),F()),t&2){let A=e.$implicit;G(),GA(A.file.type.startsWith("image/")?1:-1),G(),GA(A.file.type.startsWith("image/")?-1:2)}}function QqA(t,e){if(t&1&&(S(0,"div",84),Dn(1,EqA,3,2,"div",87,to),F()),t&2){let A=O(2).$implicit;G(),yn(A.attachments)}}function hqA(t,e){t&1&&(S(0,"div",85),AA(1,"Thought"),F())}function uqA(t,e){if(t&1){let A=be();S(0,"div",90)(1,"textarea",92,3),da("ngModelChange",function(n){RA(A);let o=O(5);return Va(o.userEditEvalCaseMessage,n)||(o.userEditEvalCaseMessage=n),xA(n)}),hA("keydown",function(n){RA(A);let o=O(3).$implicit,r=O(2);return xA(r.handleKeydown(n,o))}),F(),S(3,"div",93)(4,"span",94),hA("click",function(){RA(A);let n=O(3).$implicit,o=O(2);return xA(o.cancelEditMessage(n))}),AA(5," close "),F(),S(6,"span",95),hA("click",function(){RA(A);let n=O(3).$implicit,o=O(2);return xA(o.saveEditMessage(n))}),AA(7," check "),F()()()}if(t&2){let A=O(5);G(),Ca("ngModel",A.userEditEvalCaseMessage)}}function fqA(t,e){if(t&1&&JA(0,"markdown",91),t&2){let A=O(3).$implicit;yA("data",A.text)("ngStyle",b2(2,_jA,A.thought?"italic":"normal",A.thought?"#9aa0a6":"white"))}}function mqA(t,e){if(t&1&&_A(0,uqA,8,1,"div",90)(1,fqA,1,5,"markdown",91),t&2){let A=O(2).$implicit;GA(A.isEditing?0:1)}}function pqA(t,e){if(t&1&&(S(0,"div"),JA(1,"div",96),F()),t&2){let A=O(2).$implicit,i=O(2);G(),yA("innerHTML",i.renderGooglerSearch(A.renderedContent),RI)}}function wqA(t,e){if(t&1&&(S(0,"code"),AA(1),F()),t&2){let A=O(2).$implicit;G(),Et(" ",A.executableCode.code," ")}}function DqA(t,e){if(t&1&&(S(0,"div")(1,"div"),AA(2),F(),S(3,"div"),AA(4),F()()),t&2){let A=O(2).$implicit;G(2),Et("Outcome: ",A.codeExecutionResult.outcome,""),G(2),Et("Output: ",A.codeExecutionResult.output,"")}}function yqA(t,e){if(t&1){let A=be();S(0,"div",97)(1,"img",98),hA("click",function(){RA(A);let n=O(4).$implicit,o=O(2);return xA(o.openViewImageDialog(n.inlineData.data))}),F()()}if(t&2){let A=O(4).$implicit;G(),yA("src",A.inlineData.data,ja)}}function vqA(t,e){if(t&1&&(S(0,"div"),JA(1,"app-audio-player",99),F()),t&2){let A=O(4).$implicit;G(),yA("base64data",A.inlineData.data)}}function bqA(t,e){if(t&1){let A=be();S(0,"div")(1,"div",100)(2,"mat-icon"),AA(3,"description"),F(),S(4,"button",101),hA("click",function(){RA(A);let n=O(4).$implicit,o=O(2);return xA(o.openBase64InNewTab(n.inlineData.data,n.inlineData.mimeType))}),AA(5),F()()()}if(t&2){let A=O(4).$implicit;G(5),Et(" ",A.inlineData.name," ")}}function MqA(t,e){if(t&1){let A=be();S(0,"div")(1,"button",101),hA("click",function(){RA(A);let n=O(4).$implicit,o=O(2);return xA(o.openBase64InNewTab(n.inlineData.data,n.inlineData.mimeType))}),AA(2),F()()}if(t&2){let A=O(4).$implicit;G(2),Et(" ",A.inlineData.name," ")}}function kqA(t,e){if(t&1&&(S(0,"div")(1,"div"),_A(2,yqA,2,1,"div",97)(3,vqA,2,1,"div")(4,bqA,6,1,"div")(5,MqA,3,1,"div"),F()()),t&2){let A,i=O(3).$implicit,n=O(2);G(2),GA((A=i.inlineData.mediaType)===n.MediaType.IMAGE?2:A===n.MediaType.AUDIO?3:A===n.MediaType.TEXT?4:5)}}function SqA(t,e){if(t&1){let A=be();S(0,"div")(1,"img",102),hA("click",function(){RA(A);let n=O(4).$implicit,o=O(2);return xA(o.openViewImageDialog(n.inlineData.data))}),F()()}if(t&2){let A=O(4).$implicit;G(),yA("src",A.inlineData.data,ja)}}function RqA(t,e){if(t&1&&(S(0,"div",87)(1,"mat-icon"),AA(2,"insert_drive_file"),F(),S(3,"a",89),AA(4),F()()),t&2){let A=O(4).$implicit;G(3),yA("href",A.inlineData.data,ja),G(),Gt(A.inlineData.displayName)}}function xqA(t,e){if(t&1&&(S(0,"div"),_A(1,SqA,2,1,"div")(2,RqA,5,2,"div",87),F()),t&2){let A=O(3).$implicit;G(),GA(A.inlineData.mimeType.startsWith("image/")?1:2)}}function LqA(t,e){if(t&1&&_A(0,kqA,6,1,"div")(1,xqA,3,1,"div"),t&2){let A=O(2).$implicit;GA(A.role==="bot"?0:1)}}function FqA(t,e){if(t&1&&(S(0,"div",105)(1,"div",106),AA(2,"Actual tool uses:"),F(),JA(3,"ngx-json-viewer",49),F(),S(4,"div",107)(5,"div",108),AA(6," Expected tool uses: "),F(),JA(7,"ngx-json-viewer",49),F()),t&2){let A=O(3).$implicit;G(3),yA("json",A.actualInvocationToolUses),G(4),yA("json",A.expectedInvocationToolUses)}}function NqA(t,e){if(t&1&&(S(0,"div",105)(1,"div",106),AA(2,"Actual response:"),F(),S(3,"div"),AA(4),F()(),S(5,"div",107)(6,"div",108),AA(7,"Expected response:"),F(),S(8,"div"),AA(9),F()()),t&2){let A=O(3).$implicit;G(4),Gt(A.actualFinalResponse),G(5),Gt(A.expectedFinalResponse)}}function _qA(t,e){if(t&1&&(S(0,"div",104)(1,"span",109),AA(2),F(),S(3,"span",110),AA(4),F()()),t&2){let A=O(3).$implicit;G(2),Et("Match score: ",A.evalScore,""),G(2),Et("Threshold: ",A.evalThreshold,"")}}function GqA(t,e){if(t&1&&(S(0,"div",86)(1,"div",103),_A(2,FqA,8,2)(3,NqA,10,2),F(),_A(4,_qA,5,2,"div",104),F()),t&2){let A=O(2).$implicit;G(2),GA(A.actualInvocationToolUses?2:A.actualFinalResponse?3:-1),G(2),GA(A.evalScore!==void 0&&A.evalThreshold!==void 0?4:-1)}}function UqA(t,e){if(t&1&&(S(0,"mat-card",78),_A(1,CqA,1,0,"mat-progress-bar",83)(2,QqA,3,0,"div",84),S(3,"div"),_A(4,hqA,2,0,"div",85),S(5,"div"),_A(6,mqA,2,1),F(),_A(7,pqA,2,1,"div"),F(),_A(8,wqA,2,1,"code")(9,DqA,5,2,"div")(10,LqA,2,1)(11,GqA,5,2,"div",86),F()),t&2){let A=O(),i=A.$implicit,n=A.$index,o=O(2);yA("ngClass",qr(11,NjA,i.evalStatus===2))("ngStyle",qr(13,IU,o.shouldMessageHighlighted(n)?"rgb(15, 82, 35)":"")),G(),GA(i.isLoading?1:-1),G(),GA(i.attachments?2:-1),G(2),GA(i.thought?4:-1),G(2),GA(i.text?6:-1),G(),GA(i.renderedContent?7:-1),G(),GA(i.executableCode?8:-1),G(),GA(i.codeExecutionResult?9:-1),G(),GA(i.inlineData?10:-1),G(),GA(i.failedMetric&&i.evalStatus===2?11:-1)}}function KqA(t,e){if(t&1){let A=be();S(0,"button",111),hA("click",function(){RA(A);let n=O().$index,o=O(2);return xA(o.clickEvent(n))}),S(1,"mat-icon"),AA(2,"bolt"),F(),AA(3),F()}if(t&2){let A=O(),i=A.$implicit,n=A.$index,o=O(2);yA("ngClass",qr(2,LlA,o.shouldMessageHighlighted(n))),G(3),Et(" ",i.functionCall.name," ")}}function YqA(t,e){if(t&1){let A=be();S(0,"button",111),hA("click",function(){RA(A);let n=O().$index,o=O(2);return xA(o.clickEvent(n))}),S(1,"mat-icon"),AA(2,"check"),F(),AA(3),F()}if(t&2){let A=O(),i=A.$implicit,n=A.$index,o=O(2);yA("ngClass",qr(2,LlA,o.shouldMessageHighlighted(n))),G(3),Et(" ",i.functionResponse.name," ")}}function JqA(t,e){if(t&1){let A=be();S(0,"div")(1,"span",112),hA("click",function(){RA(A);let n=O(2).$implicit,o=O(2);return xA(o.editEvalCaseMessage(n))}),AA(2," edit "),F(),S(3,"span",113),hA("click",function(){RA(A);let n=O(2),o=n.$implicit,r=n.$index,s=O(2);return xA(s.deleteEvalCaseMessage(o,r))}),AA(4," delete "),F()()}if(t&2){let A=O(4);G(),yA("ngClass",qr(2,CU,A.isEvalCaseEditing())),G(2),yA("ngClass",qr(4,CU,A.isEvalCaseEditing()))}}function TqA(t,e){if(t&1){let A=be();S(0,"div")(1,"span",114),hA("click",function(){RA(A);let n=O(2).$implicit,o=O(2);return xA(o.editFunctionArgs(n))}),AA(2," edit "),F()()}if(t&2){let A=O(4);G(),yA("ngClass",qr(1,CU,A.isEvalCaseEditing()))}}function HqA(t,e){if(t&1&&(_A(0,JqA,5,6,"div"),Za(1,"async"),_A(2,TqA,3,3,"div")),t&2){let A=O().$implicit,i=O(2);GA(A.text?0:M2(1,1,i.isEditFunctionArgsEnabledObs)&&A.functionCall?2:-1)}}function zqA(t,e){t&1&&(S(0,"button",43)(1,"mat-icon"),AA(2,"person"),F()())}function OqA(t,e){if(t&1&&(S(0,"div",76),_A(1,IqA,3,3,"button",77)(2,UqA,12,15,"mat-card",78)(3,KqA,4,4,"button",79)(4,YqA,4,4,"button",79),S(5,"div",76)(6,"span",80),AA(7),F(),S(8,"span"),AA(9),F()(),_A(10,HqA,3,3)(11,zqA,3,0,"button",43),F()),t&2){let A=e.$implicit,i=O(2);yA("ngClass",b2(10,LjA,A.role==="user",A.role==="bot")),G(),GA(A.role==="bot"?1:-1),G(),GA(!A.functionCall&&!A.functionResponse?2:-1),G(),GA(A.functionCall?3:-1),G(),GA(A.functionResponse?4:-1),G(),yA("ngClass",b2(13,FjA,A.evalStatus===1,A.evalStatus===2)),G(2),Gt(A.evalStatus===1?"check":A.evalStatus===2?"close":""),G(2),Gt(A.evalStatus===1?"Pass":A.evalStatus===2?"Fail":""),G(),GA(i.evalCase&&A.role==="bot"&&i.isEvalEditMode()?10:-1),G(),GA(A.role==="user"?11:-1)}}function PqA(t,e){if(t&1&&(S(0,"div",26,1),JA(2,"div",null,2),Dn(4,OqA,12,16,"div",76,to),F()),t&2){let A=O();G(4),yn(A.messages)}}function jqA(t,e){if(t&1){let A=be();S(0,"div",125),JA(1,"img",126),S(2,"button",127),hA("click",function(){RA(A);let n=O().$index,o=O(3);return xA(o.removeFile(n))}),S(3,"mat-icon",128),AA(4,"close"),F()()()}if(t&2){let A=O().$implicit;G(),yA("src",A.url,ja)}}function qqA(t,e){if(t&1){let A=be();S(0,"div",124)(1,"button",127),hA("click",function(){RA(A);let n=O().$index,o=O(3);return xA(o.removeFile(n))}),S(2,"mat-icon",128),AA(3,"close"),F()(),S(4,"div",129)(5,"mat-icon"),AA(6,"insert_drive_file"),F(),S(7,"span"),AA(8),F()()()}if(t&2){let A=O().$implicit;G(8),Gt(A.file.name)}}function VqA(t,e){if(t&1&&(S(0,"div"),_A(1,jqA,5,1,"div",125)(2,qqA,9,1,"div",124),F()),t&2){let A=e.$implicit;G(),GA(A.file.type.startsWith("image/")?1:A.file.type.startsWith("image/")?-1:2)}}function ZqA(t,e){if(t&1){let A=be();S(0,"div",124)(1,"button",127),hA("click",function(){RA(A);let n=O(3);return xA(n.removeStateUpdate())}),S(2,"mat-icon",128),AA(3,"close"),F()(),S(4,"div",129)(5,"span"),AA(6,"Updated session state"),F()()()}}function WqA(t,e){if(t&1&&(S(0,"div",117),Dn(1,VqA,3,1,"div",null,to),_A(3,ZqA,7,0,"div",124),F()),t&2){let A=O(2);G(),yn(A.selectedFiles),G(2),GA(A.updatedSessionState()?3:-1)}}function XqA(t,e){if(t&1){let A=be();S(0,"div",27)(1,"input",115,4),hA("change",function(n){RA(A);let o=O();return xA(o.onFileSelect(n))}),F(),S(3,"mat-form-field",116),_A(4,WqA,4,1,"div",117),S(5,"textarea",118),da("ngModelChange",function(n){RA(A);let o=O();return Va(o.userInput,n)||(o.userInput=n),xA(n)}),hA("keydown.enter",function(n){RA(A);let o=O();return xA(o.sendMessage(n))}),F(),S(6,"div",119)(7,"div")(8,"button",120),hA("click",function(){RA(A);let n=cr(2);return xA(n.click())}),S(9,"mat-icon"),AA(10,"attach_file"),F()(),S(11,"button",121)(12,"mat-icon"),AA(13,"more_vert"),F()(),S(14,"mat-menu",null,5)(16,"span",122),hA("click",function(){RA(A);let n=O();return xA(n.updateState())}),AA(17," Update state "),F()()(),S(18,"div")(19,"button",123),hA("click",function(){RA(A);let n=O();return xA(n.toggleAudioRecording())}),S(20,"mat-icon"),AA(21,"mic"),F()(),S(22,"button",123),hA("click",function(){RA(A);let n=O();return xA(n.toggleVideoRecording())}),S(23,"mat-icon"),AA(24,"videocam"),F()()()()()()}if(t&2){let A=cr(15),i=O();G(4),GA(i.selectedFiles.length&&i.appName!=""||i.updatedSessionState()?4:-1),G(),Ca("ngModel",i.userInput),G(6),yA("matMenuTriggerFor",A),G(8),yA("ngStyle",qr(7,IU,i.isAudioRecording?"rgb(234, 67, 53)":"rgb(51, 53, 55)"))("matTooltip",i.isAudioRecording?"Turn off microphone":"Use microphone"),G(3),yA("ngStyle",qr(9,IU,i.isVideoRecording?"rgb(234, 67, 53)":"rgb(51, 53, 55)"))("matTooltip",i.isVideoRecording?"Turn off camera":"Use camera")}}function $qA(t,e){if(t&1){let A=be();S(0,"div",28,6),JA(2,"div",130),S(3,"app-trace-event",131),hA("panelClosed",function(){RA(A);let n=O();return xA(n.closeTraceEventDetailPanel())}),F()()}if(t&2){let A=O();G(3),yA("userId",A.userId)("appName",A.appName)("sessionId",A.sessionId)}}var lU="root_agent";function AVA(t){for(t=t.replace(/-/g,"+").replace(/_/g,"/");t.length%4!==0;)t+="=";return t}var dU=class extends iC{nextPageLabel="Next Event";previousPageLabel="Previous Event";firstPageLabel="First Event";lastPageLabel="Last Event";getRangeLabel=(e,A,i)=>i===0?`Event 0 of ${i}`:(i=Math.max(i,0),`Event ${e*A+1} of ${i}`)},xlA="Restarting bidirectional streaming is not currently supported. Please refresh the page or start a new session.",Ff=class t{constructor(e,A,i,n,o,r,s,a,c,l,I,C,d,B,E){this.sanitizer=e;this.sessionService=A;this.artifactService=i;this.audioService=n;this.webSocketService=o;this.videoService=r;this.dialog=s;this.eventService=a;this.route=c;this.downloadService=l;this.evalService=I;this.traceService=C;this.location=d;this.renderer=B;this.document=E}videoContainer;sideDrawer;eventTabComponent;sessionTab;evalTab;scrollContainer;textarea;bottomPanelRef;_snackBar=f(UP);shouldShowEvalTab=Jo(!0);enableSseIndicator=Jo(!1);isChatMode=Jo(!0);isEvalCaseEditing=Jo(!1);hasEvalCaseChanged=Jo(!1);isEvalEditMode=Jo(!1);videoElement;currentMessage="";messages=[];lastTextChunk="";streamingTextMessage=null;latestThought="";artifacts=[];userInput="";userEditEvalCaseMessage="";userId="user";appName="";sessionId="";evalCase=null;updatedEvalCase=null;evalSetId="";isAudioRecording=!1;isVideoRecording=!1;longRunningEvents=[];functionCallEventId="";redirectUri=vs.getBaseUrlWithoutPath();showSidePanel=!0;useSse=!1;currentSessionState={};root_agent=lU;updatedSessionState=Jo(null);messagesSubject=new Mi([]);streamingTextMessageSubject=new Mi(null);scrollInterruptedSubject=new Mi(!0);isModelThinkingSubject=new Mi(!1);sessionHasUsedBidi=new Set;eventData=new Map;traceData=[];eventMessageIndexArray=[];renderedEventGraph;rawSvgString=null;selectedEvent=void 0;selectedEventIndex=void 0;llmRequest=void 0;llmResponse=void 0;llmRequestKey="gcp.vertex.agent.llm_request";llmResponseKey="gcp.vertex.agent.llm_response";getMediaTypeFromMimetype=M8;selectedFiles=[];previousMessageCount=0;openBase64InNewTab=cS;MediaType=Ou;router=f(Ig);activatedRoute=f(ha);selectedAppControl=new _I("",{nonNullable:!0});changeDetectorRef=f(It);agentService=f(H2);isLoadingApps=Jo(!1);loadingError=Jo("");apps$=Me([]).pipe(Qo(()=>{this.isLoadingApps.set(!0),this.selectedAppControl.disable()}),jn(()=>this.agentService.listApps().pipe(mr(e=>(this.loadingError.set(e.message),Me(void 0))))),On(1),Qo(e=>{this.isLoadingApps.set(!1),this.selectedAppControl.enable(),e?.length==1&&this.router.navigate([],{relativeTo:this.route,queryParams:{app:e[0]}})}),a0());featureFlagService=f(KB);importSessionEnabledObs=this.featureFlagService.isImportSessionEnabled();isEditFunctionArgsEnabledObs=this.featureFlagService.isEditFunctionArgsEnabled();isSessionUrlEnabledObs=this.featureFlagService.isSessionUrlEnabled();bottomPanelVisible=!1;hoveredEventMessageIndices=[];ngOnInit(){if(this.syncSelectedAppFromUrl(),this.updateSelectedAppUrl(),this.webSocketService.onCloseReason().subscribe(i=>{let n=`Please check server log for full details: -`+i;this.openSnackBar(n,"OK")}),new URL(window.location.href).searchParams.has("code")){let i=window.location.href;window.opener?.postMessage({authResponseUrl:i},window.origin),window.close()}this.agentService.getApp().subscribe(i=>{this.appName=i}),Js([this.agentService.getLoadingState(),this.isModelThinkingSubject]).subscribe(([i,n])=>{let o=this.messages[this.messages.length-1];i?!o?.isLoading&&!this.streamingTextMessage&&(this.messages.push({role:"bot",isLoading:!0}),this.messagesSubject.next(this.messages)):o?.isLoading&&!n&&(this.messages.pop(),this.messagesSubject.next(this.messages),this.changeDetectorRef.detectChanges())}),Js([this.messagesSubject,this.scrollInterruptedSubject,this.streamingTextMessageSubject]).subscribe(([i,n,o])=>{n||setTimeout(()=>{this.scrollToBottom()},100)}),this.traceService.selectedTraceRow$.subscribe(i=>{let n=i?.attributes["gcp.vertex.agent.event_id"];n&&this.eventData.has(n)?this.bottomPanelVisible=!0:this.bottomPanelVisible=!1}),this.traceService.hoveredMessageIndicies$.subscribe(i=>this.hoveredEventMessageIndices=i)}ngAfterViewInit(){this.showSidePanel=!0,this.sideDrawer.open()}scrollToBottom(){setTimeout(()=>{this.scrollContainer.nativeElement.scrollTo({top:this.scrollContainer.nativeElement.scrollHeight,behavior:"smooth"})})}selectApp(e){e!=this.appName&&(this.agentService.setApp(e),this.isSessionUrlEnabledObs.subscribe(A=>{let i=this.activatedRoute.snapshot.queryParams.session;if(!A||!i){this.createSessionAndReset();return}i&&this.sessionService.getSession(this.userId,this.appName,i).pipe(On(1),mr(n=>(this.openSnackBar("Cannot find specified session. Creating a new one.","OK"),this.createSessionAndReset(),Me(null)))).subscribe(n=>{n&&this.updateWithSelectedSession(n)})}))}createSessionAndReset(){this.createSession(),this.eventData=new Map,this.eventMessageIndexArray=[],this.messages=[],this.artifacts=[],this.userInput="",this.longRunningEvents=[]}createSession(){this.sessionService.createSession(this.userId,this.appName).subscribe(e=>{this.currentSessionState=e.state,this.sessionId=e.id,this.sessionTab.refreshSession(),this.isSessionUrlEnabledObs.subscribe(A=>{A&&this.updateSelectedSessionUrl()})})}sendMessage(e){return Ao(this,null,function*(){if(this.messages.length===0&&(this.scrollContainer.nativeElement.addEventListener("wheel",()=>{this.scrollInterruptedSubject.next(!0)}),this.scrollContainer.nativeElement.addEventListener("touchmove",()=>{this.scrollInterruptedSubject.next(!0)})),this.scrollInterruptedSubject.next(!1),e.preventDefault(),!this.userInput.trim()&&this.selectedFiles.length<=0||e instanceof KeyboardEvent&&(e.isComposing||e.keyCode===229))return;if(this.userInput.trim()&&(this.messages.push({role:"user",text:this.userInput}),this.messagesSubject.next(this.messages)),this.selectedFiles.length>0){let n=this.selectedFiles.map(o=>({file:o.file,url:o.url}));this.messages.push({role:"user",attachments:n}),this.messagesSubject.next(this.messages)}let A={appName:this.appName,userId:this.userId,sessionId:this.sessionId,newMessage:{role:"user",parts:yield this.getUserMessageParts()},streaming:this.useSse,stateDelta:this.updatedSessionState()};this.selectedFiles=[];let i=this.eventMessageIndexArray.length-1;this.streamingTextMessage=null,this.agentService.runSse(A).subscribe({next:n=>Ao(this,null,function*(){if(n.startsWith('{"error"')){this.openSnackBar(n,"OK");return}let o=JSON.parse(n);if(o.error){this.openSnackBar(o.error,"OK");return}if(o.content)for(let r of o.content.parts)i+=1,this.processPart(o,r,i),this.traceService.setEventData(this.eventData);else o.errorMessage&&this.processErrorMessage(o,i);this.changeDetectorRef.detectChanges()}),error:n=>console.error("SSE error:",n),complete:()=>{this.streamingTextMessage=null,this.sessionTab.reloadSession(this.sessionId),this.eventService.getTrace(this.sessionId).pipe(mr(n=>n.status===404?Me(null):Me([]))).subscribe(n=>{this.traceData=n,this.changeDetectorRef.detectChanges()}),this.traceService.setMessages(this.messages)}}),this.userInput="",this.updatedSessionState.set(null),this.changeDetectorRef.detectChanges()})}processErrorMessage(e,A){this.storeEvents(e,e,A),this.insertMessageBeforeLoadingMessage({text:e.errorMessage,role:"bot"})}processPart(e,A,i){let n=e.groundingMetadata?.searchEntryPoint?.renderedContent;if(A.text){this.isModelThinkingSubject.next(!1);let o=A.text;if(A.thought){if(o!==this.latestThought){this.storeEvents(A,e,i);let r={role:"bot",text:this.processThoughtText(o),thought:!0,eventId:e.id};this.insertMessageBeforeLoadingMessage(r)}this.latestThought=o}else if(this.streamingTextMessage){if(n&&(this.streamingTextMessage.renderedContent=e.groundingMetadata.searchEntryPoint.renderedContent),o==this.streamingTextMessage.text){this.storeEvents(A,e,i),this.eventMessageIndexArray[i]=o,this.streamingTextMessage=null;return}this.streamingTextMessage.text+=o,this.streamingTextMessageSubject.next(this.streamingTextMessage)}else if(this.streamingTextMessage={role:"bot",text:this.processThoughtText(o),thought:!!A.thought,eventId:e.id},n&&(this.streamingTextMessage.renderedContent=e.groundingMetadata.searchEntryPoint.renderedContent),this.insertMessageBeforeLoadingMessage(this.streamingTextMessage),!this.useSse){this.storeEvents(A,e,i),this.eventMessageIndexArray[i]=o,this.streamingTextMessage=null;return}}else A.thought?this.isModelThinkingSubject.next(!0):(this.isModelThinkingSubject.next(!1),this.storeEvents(A,e,i),this.storeMessage(A,e,i,e.author==="user"?"user":"bot"))}getUserMessageParts(){return Ao(this,null,function*(){let e=[];if(this.userInput.trim()&&e.push({text:`${this.userInput}`}),this.selectedFiles.length>0)for(let A of this.selectedFiles)e.push({inlineData:{displayName:A.file.name,data:yield this.readFileAsBytes(A.file),mimeType:A.file.type}});return e})}readFileAsBytes(e){return new Promise((A,i)=>{let n=new FileReader;n.onload=o=>{let r=o.target.result.split(",")[1];A(r)},n.onerror=i,n.readAsDataURL(e)})}updateRedirectUri(e,A){try{let i=new URL(e);return i.searchParams.set("redirect_uri",A),i.toString()}catch(i){return console.warn("Failed to update redirect URI: ",i),e}}storeMessage(e,A,i,n,o,r){if(A?.author&&this.createAgentIconColorClass(A.author),A?.longRunningToolIds&&A.longRunningToolIds.length>0){this.getAsyncFunctionsFromParts(A.longRunningToolIds,A.content.parts);let a=this.longRunningEvents[0];if(a.args.authConfig&&a.args.authConfig.exchangedAuthCredential&&a.args.authConfig.exchangedAuthCredential.oauth2){let c=a.args.authConfig.exchangedAuthCredential.oauth2.authUri,l=this.updateRedirectUri(c,this.redirectUri);this.openOAuthPopup(l).then(I=>{this.functionCallEventId=A.id,this.sendOAuthResponse(a,I,this.redirectUri)}).catch(I=>{console.error("OAuth Error:",I)})}else this.functionCallEventId=A.id}if(A?.actions&&A.actions.artifactDelta)for(let a in A.actions.artifactDelta)A.actions.artifactDelta.hasOwnProperty(a)&&this.renderArtifact(a,A.actions.artifactDelta[a]);A?.evalStatus&&this.isChatMode.set(!1);let s={role:n,evalStatus:A?.evalStatus,failedMetric:A?.failedMetric,evalScore:A?.evalScore,evalThreshold:A?.evalThreshold,actualInvocationToolUses:A?.actualInvocationToolUses,expectedInvocationToolUses:A?.expectedInvocationToolUses,actualFinalResponse:A?.actualFinalResponse,expectedFinalResponse:A?.expectedFinalResponse,invocationIndex:o!==void 0?o:void 0,finalResponsePartIndex:r?.finalResponsePartIndex!==void 0?r.finalResponsePartIndex:void 0,toolUseIndex:r?.toolUseIndex!==void 0?r.toolUseIndex:void 0};if(e.inlineData){let a=this.formatBase64Data(e.inlineData.data,e.inlineData.mimeType);s.inlineData={displayName:e.inlineData.displayName,data:a,mimeType:e.inlineData.mimeType},this.eventMessageIndexArray[i]=e.inlineData}else if(e.text)s.text=e.text,s.thought=!!e.thought,A?.groundingMetadata&&A.groundingMetadata.searchEntryPoint&&A.groundingMetadata.searchEntryPoint.renderedContent&&(s.renderedContent=A.groundingMetadata.searchEntryPoint.renderedContent),s.eventId=A?.id,this.eventMessageIndexArray[i]=e.text;else if(e.functionCall)s.functionCall=e.functionCall,s.eventId=A?.id,this.eventMessageIndexArray[i]=e.functionCall;else if(e.functionResponse)s.functionResponse=e.functionResponse,s.eventId=A?.id,this.eventMessageIndexArray[i]=e.functionResponse;else if(e.executableCode)s.executableCode=e.executableCode,this.eventMessageIndexArray[i]=e.executableCode;else if(e.codeExecutionResult&&(s.codeExecutionResult=e.codeExecutionResult,this.eventMessageIndexArray[i]=e.codeExecutionResult,A.actions&&A.actions.artifact_delta))for(let a in A.actions.artifact_delta)A.actions.artifact_delta.hasOwnProperty(a)&&this.renderArtifact(a,A.actions.artifact_delta[a]);Object.keys(e).length>0&&this.insertMessageBeforeLoadingMessage(s)}insertMessageBeforeLoadingMessage(e){this.messages[this.messages.length-1]?.isLoading?this.messages.splice(this.messages.length-1,0,e):this.messages.push(e),this.messagesSubject.next(this.messages)}formatBase64Data(e,A){let i=AVA(e);return`data:${A};base64,${i}`}renderArtifact(e,A){let i={role:"bot",inlineData:{data:"",mimeType:"image/png"}};this.insertMessageBeforeLoadingMessage(i);let n=this.messages.length-2;this.artifactService.getArtifactVersion(this.userId,this.appName,this.sessionId,e,A).subscribe(o=>{let r=o.inlineData.mimeType,s=this.formatBase64Data(o.inlineData.data,r),a=M8(r),c={name:this.createDefaultArtifactName(r),data:s,mimeType:r,mediaType:a};this.messages[n]={role:"bot",inlineData:c},this.artifacts=[...this.artifacts,{id:e,data:s,mimeType:r,versionId:A,mediaType:M8(r)}]})}storeEvents(e,A,i){let n="";e.text?n+="text:"+e.text:e.functionCall?n+="functionCall:"+e.functionCall.name:e.functionResponse?n+="functionResponse:"+e.functionResponse.name:e.executableCode?n+="executableCode:"+e.executableCode.code.slice(0,10):e.codeExecutionResult?n+="codeExecutionResult:"+e.codeExecutionResult.outcome:e.errorMessage&&(n+="errorMessage:"+e.errorMessage),A.title=n,this.eventData.set(A.id,A),this.eventData=new Map(this.eventData)}sendOAuthResponse(e,A,i){this.longRunningEvents.pop();let n={appName:this.appName,userId:this.userId,sessionId:this.sessionId,newMessage:{role:"user",parts:[]}};var o=structuredClone(e.args.authConfig);o.exchangedAuthCredential.oauth2.authResponseUri=A,o.exchangedAuthCredential.oauth2.redirectUri=i,n.functionCallEventId=this.functionCallEventId,n.newMessage.parts.push({function_response:{id:e.id,name:e.name,response:o}});let r=[];this.agentService.runSse(n).subscribe({next:s=>Ao(this,null,function*(){let a=JSON.parse(s);r.push(a)}),error:s=>console.error("SSE error:",s),complete:()=>{this.processRunSseResponse(r)}})}processRunSseResponse(e){let A=this.eventMessageIndexArray.length-1;for(let i of e)if(i.content)for(let n of i.content.parts)A+=1,this.processPart(i,n,A)}openDialog(){this.dialog.open(uf,{width:"600px",data:{event:this.longRunningEvents[0],appName:this.appName,userId:this.userId,sessionId:this.sessionId,functionCallEventId:this.functionCallEventId}}).afterClosed().subscribe(A=>{A&&(this.removeFinishedLongRunningEvents(A.events),this.processRunSseResponse(A.response))})}removeFinishedLongRunningEvents(e){let A=new Set(e.map(i=>i.id));this.longRunningEvents=this.longRunningEvents.filter(i=>!A.has(i.id))}getAgentNameFromEvent(e){let A=this.messages[e].eventId;return this.eventData.get(A)?.author??lU}customIconColorClass(e){let A=this.getAgentNameFromEvent(e);return A!==lU?`custom-icon-color-${(0,gU.default)(A).replace("#","")}`:""}createAgentIconColorClass(e){let A=(0,gU.default)(e),i=`custom-icon-color-${A.replace("#","")}`;this.injectCustomIconColorStyle(i,A)}clickEvent(e){let A=this.messages[e].eventId;this.sideDrawer.open(),this.showSidePanel=!0,this.selectedEvent=this.eventData.get(A),this.selectedEventIndex=this.getIndexOfKeyInMap(A),this.eventService.getEventTrace(this.selectedEvent.id).subscribe(i=>{this.llmRequest=JSON.parse(i[this.llmRequestKey]),this.llmResponse=JSON.parse(i[this.llmResponseKey])}),this.eventService.getEvent(this.userId,this.appName,this.sessionId,this.selectedEvent.id).subscribe(i=>Ao(this,null,function*(){if(!i.dotSrc){this.renderedEventGraph=void 0;return}let n=i.dotSrc,r=(yield Yu()).renderString(n,{format:"svg",engine:"dot"});this.rawSvgString=r,this.renderedEventGraph=this.sanitizer.bypassSecurityTrustHtml(r)}))}userMessagesLength(e){return this.messages.slice(0,e).filter(A=>A.role=="user").length}ngOnDestroy(){this.webSocketService.closeConnection()}onAppSelection(e){this.isAudioRecording&&(this.stopAudioRecording(),this.isAudioRecording=!1),this.isVideoRecording&&(this.stopVideoRecording(),this.isVideoRecording=!1),this.evalTab?.resetEvalResults(),this.traceData=[],this.bottomPanelVisible=!1}toggleAudioRecording(){this.isAudioRecording?this.stopAudioRecording():this.startAudioRecording()}startAudioRecording(){if(this.sessionHasUsedBidi.has(this.sessionId)){this.openSnackBar(xlA,"OK");return}this.isAudioRecording=!0;let e=window.location.protocol==="https:"?"wss":"ws";this.webSocketService.connect(`${e}://${vs.getWSServerUrl()}/run_live?app_name=${this.appName}&user_id=${this.userId}&session_id=${this.sessionId}`),this.audioService.startRecording(),this.messages.push({role:"user",text:"Speaking..."}),this.messages.push({role:"bot",text:"Speaking..."}),this.messagesSubject.next(this.messages),this.sessionHasUsedBidi.add(this.sessionId)}stopAudioRecording(){this.audioService.stopRecording(),this.webSocketService.closeConnection(),this.isAudioRecording=!1}toggleVideoRecording(){this.isVideoRecording?this.stopVideoRecording():this.startVideoRecording()}startVideoRecording(){if(this.sessionHasUsedBidi.has(this.sessionId)){this.openSnackBar(xlA,"OK");return}this.isVideoRecording=!0;let e=window.location.protocol==="https:"?"wss":"ws";this.webSocketService.connect(`${e}://${vs.getWSServerUrl()}/run_live?app_name=${this.appName}&user_id=${this.userId}&session_id=${this.sessionId}`),this.videoService.startRecording(this.videoContainer),this.audioService.startRecording(),this.messages.push({role:"user",text:"Speaking..."}),this.messagesSubject.next(this.messages),this.sessionHasUsedBidi.add(this.sessionId)}stopVideoRecording(){this.audioService.stopRecording(),this.videoService.stopRecording(this.videoContainer),this.webSocketService.closeConnection(),this.isVideoRecording=!1}getAsyncFunctionsFromParts(e,A){for(let i of A)i.functionCall&&e.includes(i.functionCall.id)&&this.longRunningEvents.push(i.functionCall)}openOAuthPopup(e){return new Promise((A,i)=>{if(!window.open(e,"oauthPopup","width=600,height=700")){i("Popup blocked!");return}let o=r=>{if(r.origin!==window.location.origin)return;let{authResponseUrl:s}=r.data;s?(A(s),window.removeEventListener("message",o)):console.log("OAuth failed",r)};window.addEventListener("message",o)})}toggleSidePanel(){this.showSidePanel?this.sideDrawer.close():this.sideDrawer.open(),this.showSidePanel=!this.showSidePanel}handleTabChange(e){this.isChatMode()||(this.resetEditEvalCaseVars(),this.handleReturnToSession(!0))}handleShouldShowEvalTab(e){this.shouldShowEvalTab.set(e)}handleReturnToSession(e){this.sessionTab.getSession(this.sessionId),this.evalTab.resetEvalCase(),this.isChatMode.set(!0)}handleEvalNotInstalled(e){e&&this.openSnackBar(e,"OK")}resetEventsAndMessages(){this.eventData.clear(),this.eventMessageIndexArray=[],this.messages=[],this.messagesSubject.next(this.messages),this.artifacts=[]}updateWithSelectedSession(e){if(!e||!e.id||!e.events||!e.state)return;this.traceService.resetTraceService(),this.sessionId=e.id,this.currentSessionState=e.state,this.evalCase=null,this.isChatMode.set(!0),this.isSessionUrlEnabledObs.subscribe(i=>{i&&this.updateSelectedSessionUrl()}),this.resetEventsAndMessages();let A=0;e.events.forEach(i=>{i.content?.parts?.forEach(n=>{this.storeMessage(n,i,A,i.author==="user"?"user":"bot"),A+=1,i.author&&i.author!=="user"&&this.storeEvents(n,i,A)})}),this.eventService.getTrace(this.sessionId).subscribe(i=>{this.traceData=i,this.traceService.setEventData(this.eventData),this.traceService.setMessages(this.messages)}),this.bottomPanelVisible=!1}updateWithSelectedEvalCase(e){this.evalCase=e,this.isChatMode.set(!1),this.resetEventsAndMessages();let A=0,i=0;for(let n of e.conversation){if(n.userContent?.parts)for(let o of n.userContent.parts)this.storeMessage(o,null,A,"user"),A++;if(n.intermediateData?.toolUses){let o=0;for(let r of n.intermediateData.toolUses){let s={functionCall:{name:r.name,args:r.args}};this.storeMessage(s,null,A,"bot",i,{toolUseIndex:o}),A++,o++;let a={functionResponse:{name:r.name}};this.storeMessage(a,null,A,"bot"),A++}}if(n.finalResponse?.parts){let o=0;for(let r of n.finalResponse.parts)this.storeMessage(r,null,A,"bot",i,{finalResponsePartIndex:o}),A++,o++}i++}}updateSelectedEvalSetId(e){this.evalSetId=e}editEvalCaseMessage(e){this.isEvalCaseEditing.set(!0),this.userEditEvalCaseMessage=e.text,e.isEditing=!0,setTimeout(()=>{this.textarea?.nativeElement.focus();let A=this.textarea?.nativeElement.value.length;e.text.charAt(A-1)===` -`&&A--,this.textarea?.nativeElement.setSelectionRange(A,A)},0)}editFunctionArgs(e){this.isEvalCaseEditing.set(!0),this.dialog.open(vQ,{maxWidth:"90vw",maxHeight:"90vh",data:{dialogHeader:"Edit function arguments",functionName:e.functionCall.name,jsonContent:e.functionCall.args}}).afterClosed().subscribe(i=>{this.isEvalCaseEditing.set(!1),i&&(this.hasEvalCaseChanged.set(!0),e.functionCall.args=i,this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].intermediateData.toolUses[e.toolUseIndex].args=i)})}saveEvalCase(){this.evalService.updateEvalCase(this.appName,this.evalSetId,this.updatedEvalCase.evalId,this.updatedEvalCase).subscribe(e=>{this.openSnackBar("Eval case updated","OK"),this.resetEditEvalCaseVars()})}cancelEditEvalCase(){this.resetEditEvalCaseVars(),this.updateWithSelectedEvalCase(this.evalCase)}resetEditEvalCaseVars(){this.hasEvalCaseChanged.set(!1),this.isEvalCaseEditing.set(!1),this.isEvalEditMode.set(!1),this.updatedEvalCase=null}cancelEditMessage(e){e.isEditing=!1,this.isEvalCaseEditing.set(!1)}saveEditMessage(e){this.hasEvalCaseChanged.set(!0),this.isEvalCaseEditing.set(!1),e.isEditing=!1,e.text=this.userEditEvalCaseMessage?this.userEditEvalCaseMessage:" ",this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].finalResponse.parts[e.finalResponsePartIndex]={text:this.userEditEvalCaseMessage},this.userEditEvalCaseMessage=""}handleKeydown(e,A){e.key==="Enter"&&!e.shiftKey?(e.preventDefault(),this.saveEditMessage(A)):e.key==="Escape"&&this.cancelEditMessage(A)}deleteEvalCaseMessage(e,A){this.hasEvalCaseChanged.set(!0),this.messages.splice(A,1),this.messagesSubject.next(this.messages),this.updatedEvalCase=structuredClone(this.evalCase),this.updatedEvalCase.conversation[e.invocationIndex].finalResponse.parts.splice(e.finalResponsePartIndex,1)}editEvalCase(){this.isEvalEditMode.set(!0)}deleteEvalCase(){let e={title:"Confirm delete",message:`Are you sure you want to delete ${this.evalCase.evalId}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(SQ,{width:"600px",data:e}).afterClosed().subscribe(i=>{i&&(this.evalTab.deleteEvalCase(this.evalCase.evalId),this.openSnackBar("Eval case deleted","OK"))})}updateSessionState(e){this.currentSessionState=e.state}onNewSessionClick(){this.createSession(),this.eventData.clear(),this.eventMessageIndexArray=[],this.messages=[],this.artifacts=[],this.traceData=[],this.bottomPanelVisible=!1,this.evalTab.showEvalHistory&&this.evalTab.toggleEvalHistoryButton()}onFileSelect(e){let A=e.target;if(A.files)for(let i=0;i{this.llmRequest=JSON.parse(A[this.llmRequestKey]),this.llmResponse=JSON.parse(A[this.llmResponseKey])}),this.eventService.getEvent(this.userId,this.appName,this.sessionId,this.selectedEvent.id).subscribe(A=>Ao(this,null,function*(){if(!A.dotSrc){this.renderedEventGraph=void 0;return}let i=A.dotSrc,o=(yield Yu()).renderString(i,{format:"svg",engine:"dot"});this.rawSvgString=o,this.renderedEventGraph=this.sanitizer.bypassSecurityTrustHtml(o)}))}deleteSession(e){let A={title:"Confirm delete",message:`Are you sure you want to delete this session ${this.sessionId}?`,confirmButtonText:"Delete",cancelButtonText:"Cancel"};this.dialog.open(SQ,{width:"600px",data:A}).afterClosed().subscribe(n=>{n&&this.sessionService.deleteSession(this.userId,this.appName,e).subscribe(o=>{let r=this.sessionTab.refreshSession(e);r?this.sessionTab.getSession(r.id):window.location.reload()})})}syncSelectedAppFromUrl(){Js([this.router.events.pipe(kt(e=>e instanceof nc),je(()=>this.activatedRoute.snapshot.queryParams)),this.apps$]).subscribe(([e,A])=>{if(A&&A.length){let i=e.app;i&&A.includes(i)?this.selectedAppControl.setValue(i):i&&this.openSnackBar(`Agent '${i}' not found`,"OK")}})}updateSelectedAppUrl(){this.selectedAppControl.valueChanges.pipe(tl(),kt(Boolean)).subscribe(e=>{this.selectApp(e);let A=this.activatedRoute.snapshot.queryParams.app;e!==A&&this.router.navigate([],{queryParams:{app:e},queryParamsHandling:"merge"})})}updateSelectedSessionUrl(){let e=this.router.createUrlTree([],{queryParams:{session:this.sessionId},queryParamsHandling:"merge"}).toString();this.location.replaceState(e)}handlePageEvent(e){if(e.pageIndex>=0){let A=this.getKeyAtIndexInMap(e.pageIndex);A&&this.selectEvent(A)}}closeSelectedEvent(){this.selectedEvent=void 0,this.selectedEventIndex=void 0}getIndexOfKeyInMap(e){let A=0,i=(o,r)=>0,n=Array.from(this.eventData.keys()).sort(i);for(let o of n){if(o===e)return A;A++}}getKeyAtIndexInMap(e){let A=(n,o)=>0,i=Array.from(this.eventData.keys()).sort(A);if(e>=0&&e{console.log(e),this.downloadService.downloadObjectAsJson(e,`session-${this.sessionId}.json`)})}updateState(){this.dialog.open(vQ,{maxWidth:"90vw",maxHeight:"90vh",data:{dialogHeader:"Update state",jsonContent:this.currentSessionState}}).afterClosed().subscribe(A=>{A&&this.updatedSessionState.set(A)})}removeStateUpdate(){this.updatedSessionState.set(null)}closeTraceEventDetailPanel(){this.bottomPanelVisible=!1,this.traceService.selectedRow(void 0),this.traceService.setHoveredMessages(void 0,"")}shouldMessageHighlighted(e){return this.hoveredEventMessageIndices.includes(e)}importSession(){let e=document.createElement("input");e.type="file",e.accept="application/json",e.onchange=()=>{if(!e.files||e.files.length===0)return;let A=e.files[0],i=new FileReader;i.onload=n=>{if(n.target?.result)try{let o=JSON.parse(n.target.result);if(!o.userId||!o.appName||!o.events){this.openSnackBar("Invalid session file format","OK");return}this.sessionService.importSession(o.userId,o.appName,o.events).subscribe(r=>{this.openSnackBar("Session imported","OK"),this.sessionTab.refreshSession()})}catch{this.openSnackBar("Error parsing session file","OK")}},i.readAsText(A)},e.click()}injectCustomIconColorStyle(e,A){if(this.document.getElementById(e))return;let i=this.renderer.createElement("style");this.renderer.setAttribute(i,"id",e),this.renderer.setAttribute(i,"type","text/css");let n=` - .${e} { - background-color: ${A} !important; - } - `;this.renderer.appendChild(i,this.renderer.createText(n)),this.renderer.appendChild(this.document.head,i)}static \u0275fac=function(A){return new(A||t)(PA(cl),PA(Wg),PA(RQ),PA(xQ),PA(Xg),PA(LQ),PA(qs),PA(nI),PA(ha),PA(O2),PA(Vc),PA($g),PA(Dc),PA(Wi),PA(at))};static \u0275cmp=zA({type:t,selectors:[["app-chat"]],viewQuery:function(A,i){if(A&1&&(Te(vjA,5,ee),Te(bjA,5),Te(nd,5),Te(od,5),Te(id,5),Te(MjA,5),Te(kjA,5),Te(SjA,5)),A&2){let n;XA(n=$A())&&(i.videoContainer=n.first),XA(n=$A())&&(i.sideDrawer=n.first),XA(n=$A())&&(i.eventTabComponent=n.first),XA(n=$A())&&(i.sessionTab=n.first),XA(n=$A())&&(i.evalTab=n.first),XA(n=$A())&&(i.scrollContainer=n.first),XA(n=$A())&&(i.textarea=n.first),XA(n=$A())&&(i.bottomPanelRef=n.first)}},standalone:!1,features:[ht([{provide:iC,useClass:dU}])],decls:28,vars:15,consts:[["sideDrawer",""],["autoScroll",""],["videoContainer",""],["messageTextarea",""],["fileInput",""],["moreMenu","matMenu"],["bottomPanel",""],["autosize","",1,"drawer-container"],["matTooltip","Open panel",1,"material-symbols-outlined",2,"position","absolute","width","24px","height","24px","color","#c4c7c5","cursor","pointer","margin-left","20px","margin-top","20px","z-index","9999"],["mode","side","appResizableDrawer","",1,"side-drawer"],[2,"margin-top","20px","margin-left","20px","display","flex"],[2,"width","100%"],[1,"drawer-header"],[1,"drawer-logo"],["src","assets/ADK-512-color.svg","width","32px","height","32px"],["matTooltip","Collapse panel",1,"material-symbols-outlined",2,"color","#c4c7c5","cursor","pointer","margin-right","15px",3,"click"],[1,"app-select-container"],[1,"app-select",3,"selectionChange","placeholder","formControl"],[1,"app-name-option",3,"value"],[1,"tabs-container"],[1,"details-panel-container"],[1,"resize-handler"],[1,"chat-container"],[1,"chat-toolbar",3,"ngClass"],[1,"chat-card"],["mat-fab","","color","primary",1,"fab-button"],[1,"chat-messages"],[1,"chat-input"],["appResizableBottomPanel","",1,"trace-detail-container"],["matTooltip","Open panel",1,"material-symbols-outlined",2,"position","absolute","width","24px","height","24px","color","#c4c7c5","cursor","pointer","margin-left","20px","margin-top","20px","z-index","9999",3,"click"],[3,"selectedTabChange"],[1,"tabs-header"],["mat-tab-label",""],[3,"traceData"],[3,"selectedEvent","eventsMap","traceData"],[3,"sessionState"],[3,"artifacts"],[3,"sessionSelected","sessionReloaded","userId","appName","sessionId"],[1,"tab-label"],[3,"shouldShowTab","sessionSelected","evalCaseSelected","evalSetIdSelected","shouldReturnToSession","evalNotInstalledMsg","appName","userId","sessionId"],[1,"details-content"],[2,"display","flex","justify-content","flex-end","margin-top","10px"],["aria-label","Select event",1,"event-paginator",3,"page","length","pageSize","pageIndex"],["mat-mini-fab",""],[3,"click"],["label","Event"],[1,"event-graph-container"],[3,"innerHtml"],[1,"json-viewer-container"],[3,"json"],["label","Request"],["label","Response"],[3,"click","innerHtml"],["matTooltip","Open panel",1,"material-symbols-outlined",2,"width","24px","height","24px","color","#c4c7c5","cursor","pointer","margin-left","20px","margin-top","-2px","z-index","9999"],["matTooltip","Open panel",1,"material-symbols-outlined",2,"width","24px","height","24px","color","#c4c7c5","cursor","pointer","margin-left","20px","margin-top","-2px","z-index","9999",3,"click"],[2,"display","flex"],[1,"toolbar-session-text"],[1,"toolbar-session-id"],[1,"toolbar-actions"],["mat-button","",2,"height","30px",3,"click"],["mat-flat-button","",2,"height","30px",3,"click","disabled"],["matTooltip","Edit current eval case",1,"material-symbols-outlined","toolbar-icon",3,"click"],["matTooltip","Delete current eval case",1,"material-symbols-outlined","toolbar-icon",3,"click"],[1,"toolbar-sse-toggle"],[1,"example-margin",3,"change","checked"],[2,"margin-left","8px","margin-right","8px","height","22px",3,"vertical"],[2,"display","flex","align-items","center"],[1,"toolbar-new-sesison",3,"click"],["matTooltip","Delete current session",1,"material-symbols-outlined","toolbar-icon",3,"click"],["matTooltip","Export current session",1,"material-symbols-outlined","toolbar-icon",3,"click"],["matTooltip","Import session",1,"material-symbols-outlined","toolbar-icon"],["matTooltip","Import session",1,"material-symbols-outlined","toolbar-icon",3,"click"],[1,"empty-state-container"],[1,"warning"],[1,"error"],["mat-fab","","color","primary",1,"fab-button",3,"click"],[3,"ngClass"],["mat-mini-fab","",3,"matTooltip","class"],[1,"message-card",3,"ngClass","ngStyle"],["mat-stroked-button","",1,"function-event-button",3,"ngClass"],[1,"material-symbols-outlined"],["mat-mini-fab","",3,"click","matTooltip"],["fontSet","material-symbols-outlined"],["mode","buffer",1,"loading-bar"],[1,"attachments"],[1,"thought-chip"],[1,"eval-compare-container"],[1,"attachment"],["alt","attachment",1,"image-preview-chat",3,"src"],["download","",3,"href"],[1,"edit-message-container"],[1,"message-text",3,"data","ngStyle"],["rows","4","cols","80",1,"message-textarea",3,"ngModelChange","keydown","ngModel"],[1,"edit-message-buttons-container"],["matTooltip","Cancel editing",1,"material-symbols-outlined",2,"width","24px","height","24px","color","#c4c7c5","cursor","pointer","margin-right","16px",3,"click"],["matTooltip","Save eval case message",1,"material-symbols-outlined",2,"width","24px","height","24px","color","rgb(97, 151, 202)","cursor","pointer","margin-right","16px",3,"click"],[3,"innerHTML"],[1,"generated-image-container"],["alt","image",1,"generated-image",3,"click","src"],[3,"base64data"],[1,"html-artifact-container"],[1,"link-style-button",3,"click"],["alt","image",1,"image-preview-chat",3,"click","src"],[1,"actual-expected-compare-container"],[1,"score-threshold-container"],[1,"actual-result"],[1,"eval-response-header","header-actual"],[1,"expected-result"],[1,"eval-response-header","header-expected"],[1,"header-actual"],[1,"header-expected"],["mat-stroked-button","",1,"function-event-button",3,"click","ngClass"],["matTooltip","Edit eval case message",1,"material-symbols-outlined","eval-case-edit-button",3,"click","ngClass"],["matTooltip","Delete eval case message",1,"material-symbols-outlined","eval-case-edit-button",3,"click","ngClass"],["matTooltip","Edit function arguments",1,"material-symbols-outlined","eval-case-edit-button",3,"click","ngClass"],["type","file","multiple","","hidden","",3,"change"],["appearance","outline",1,"input-field"],[1,"file-preview"],["matInput","","cdkTextareaAutosize","","cdkAutosizeMinRows","1","cdkAutosizeMaxRows","10","placeholder","Type a Message...",1,"chat-input-box",2,"caret-color","white",3,"ngModelChange","keydown.enter","ngModel"],[1,"chat-input-actions"],["mat-icon-button","","matTooltip","Upload local file",1,"function-event-button",3,"click"],["mat-icon-button","","matTooltip","More options",1,"function-event-button",3,"matMenuTriggerFor"],["mat-menu-item","",3,"click"],["mat-icon-button","","matSuffix","",3,"click","ngStyle","matTooltip"],[1,"file-container"],[1,"image-container"],["alt","preview",1,"image-preview",3,"src"],["mat-icon-button","",1,"delete-button",3,"click"],["color","warn"],[1,"file-info"],[1,"bottom-resize-handler"],[3,"panelClosed","userId","appName","sessionId"]],template:function(A,i){if(A&1){let n=be();S(0,"mat-drawer-container",7),_A(1,GjA,2,0,"span",8),S(2,"mat-drawer",9,0)(4,"div",10)(5,"div",11)(6,"div",12)(7,"div",13),JA(8,"img",14),AA(9," Agent Development Kit "),F(),S(10,"span",15),hA("click",function(){return RA(n),xA(i.toggleSidePanel())}),AA(11,"left_panel_close"),F()()()(),S(12,"div",16)(13,"mat-select",17),hA("selectionChange",function(r){return RA(n),xA(i.onAppSelection(r))}),_A(14,KjA,2,0),Za(15,"async"),_A(16,YjA,2,2,"mat-option",18),F()(),_A(17,qjA,18,9,"div",19)(18,ZjA,20,7,"div",20),JA(19,"div",21),F(),S(20,"div",22),_A(21,iqA,4,5,"div",23),S(22,"mat-card",24),_A(23,lqA,2,1)(24,gqA,3,0,"button",25)(25,PqA,6,0,"div",26)(26,XqA,25,11,"div",27),F(),_A(27,$qA,4,3,"div",28),F()()}if(A&2){let n;G(),GA(!i.showSidePanel&&i.appName===""?1:-1),G(12),yA("placeholder",i.isLoadingApps()?"Loading...":"Select an agent")("formControl",i.selectedAppControl),G(),GA((n=M2(15,13,i.apps$))?14:-1,n),G(2),GA(i.selectedAppControl.value&&i.isLoadingApps()?16:-1),G(),GA(i.appName!=""&&i.showSidePanel?17:-1),G(),GA(i.selectedEvent&&i.showSidePanel?18:-1),G(3),GA(i.appName!=""?21:-1),G(2),GA(i.selectedAppControl.value?-1:23),G(),GA(i.longRunningEvents.length>0?24:-1),G(),GA(i.appName!=""?25:-1),G(),GA(i.appName!=""&&i.isChatMode()?26:-1),G(),GA(i.bottomPanelVisible?27:-1)}},dependencies:[Xa,Kh,vc,Ea,ec,xcA,P2,Qg,bP,iI,CcA,Dr,kB,rP,oP,Ok,pcA,FQ,JG,TG,jG,mf,o7,NB,U2,_B,jcA,dlA,C7,vM,NQ,bf,ulA,nd,od,id,zu,Mf,nC,kf,Sf,xf,Lf,Jh],styles:[".expand-side-drawer[_ngcontent-%COMP%]{position:relative;top:4%;left:1%}.drawer-container[_ngcontent-%COMP%]{height:100%;background-color:#131314}.generated-image-container[_ngcontent-%COMP%]{max-width:400px}.generated-image[_ngcontent-%COMP%]{max-width:100%;min-width:40px;border-radius:8px}.chat-container[_ngcontent-%COMP%]{width:100%;height:100%;max-width:100%;margin:auto;display:flex;flex-direction:column;flex:1}.event-container[_ngcontent-%COMP%]{color:#fff}.html-artifact-container[_ngcontent-%COMP%], .drawer-header[_ngcontent-%COMP%]{width:100%;display:flex;justify-content:flex-start;align-items:center}.drawer-header[_ngcontent-%COMP%] .mat-icon[_ngcontent-%COMP%]{width:36px;height:36px;color:#bdc1c6;cursor:pointer;display:flex;align-items:center;justify-content:center}.chat-card[_ngcontent-%COMP%]{display:flex;flex-direction:column;overflow:hidden;flex:1;min-height:12%;box-shadow:none;background-color:#131314}.loading-bar[_ngcontent-%COMP%]{width:100px;margin:15px}.chat-messages[_ngcontent-%COMP%]{flex-grow:1;overflow-y:auto;padding:20px;margin-top:16px}.message-card[_ngcontent-%COMP%]{padding:5px 20px;margin:5px;border-radius:20px;max-width:80%;font-size:14px;font-weight:400;position:relative;display:inline-block}.function-event-button[_ngcontent-%COMP%]{background-color:#fff;margin:5px 5px 10px}.function-event-button-highlight[_ngcontent-%COMP%]{background-color:#0f5223;border-color:#0f5223!important;color:#fff!important}.user-message[_ngcontent-%COMP%]{display:flex;justify-content:flex-end;align-items:center}.user-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{background-color:#004a77;align-self:flex-end;color:#fff;box-shadow:none}.bot-message[_ngcontent-%COMP%]{display:flex;align-items:center}.bot-message[_ngcontent-%COMP%] .message-card[_ngcontent-%COMP%]{background-color:#303030;align-self:flex-start;color:#fff;box-shadow:none}.bot-message[_ngcontent-%COMP%]:focus-within .message-card[_ngcontent-%COMP%]{background-color:#131314;border:1px solid #8ab4f8}.message-textarea[_ngcontent-%COMP%]{background-color:#303030;max-width:100%;border:none;font-family:Google Sans,Helvetica Neue,sans-serif}.message-textarea[_ngcontent-%COMP%]:focus{background-color:#131314;outline:none}.edit-message-buttons-container[_ngcontent-%COMP%]{display:flex;justify-content:flex-end}.message-card[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%]{visibility:hidden;position:absolute;left:10px;z-index:10;background-color:#484848;overflow:hidden;border-radius:20px;padding:5px 20px;margin-bottom:10px;font-size:16px}.message-card[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .actual-result[_ngcontent-%COMP%]{border-right:2px solid #8a8686;padding-right:8px;min-width:350px;max-width:350px}.message-card[_ngcontent-%COMP%] .eval-compare-container[_ngcontent-%COMP%] .expected-result[_ngcontent-%COMP%]{padding-left:12px;min-width:350px;max-width:350px}.message-card[_ngcontent-%COMP%]:hover .eval-compare-container[_ngcontent-%COMP%]{visibility:visible}.actual-expected-compare-container[_ngcontent-%COMP%]{display:flex}.score-threshold-container[_ngcontent-%COMP%]{display:flex;justify-content:center;gap:10px;align-items:center;margin-top:15px;font-size:14px;font-weight:600}.eval-response-header[_ngcontent-%COMP%]{padding-bottom:5px;border-bottom:2px solid #8a8686;font-style:italic;font-weight:700}.header-expected[_ngcontent-%COMP%]{color:#44c265}.header-actual[_ngcontent-%COMP%]{color:#ff8983}.eval-case-edit-button[_ngcontent-%COMP%]{cursor:pointer;margin-left:4px;margin-right:4px}.eval-pass[_ngcontent-%COMP%]{display:flex;color:#44c265}.eval-fail[_ngcontent-%COMP%]{display:flex;color:#ff8983}.navigation-button-sidepanel[_ngcontent-%COMP%]{margin-left:auto;margin-right:20px}.chat-input[_ngcontent-%COMP%]{display:flex;padding:10px;width:60%;margin:0 auto}.hidden[_ngcontent-%COMP%]{visibility:hidden}.input-field[_ngcontent-%COMP%]{flex-grow:1}.input-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]{color:#fff;border:none;padding:10px;box-sizing:content-box}.input-field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%]::placeholder{color:#8e918f}.input-field[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{color:#fff;background-color:#333537}.chat-input-actions[_ngcontent-%COMP%]{width:106%;margin-top:10px;display:flex;justify-content:space-between;align-items:center;max-width:100%}.chat-input-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{margin-left:10px;margin-right:10px}.fab-button[_ngcontent-%COMP%]{position:fixed;bottom:200px;right:100px;z-index:1000}.sidepanel-toggle[_ngcontent-%COMP%]{position:relative;top:100px;z-index:1000}.side-drawer[_ngcontent-%COMP%]{background-color:#1b1b1b;color:#fff;border-radius:0}.tabs-container[_ngcontent-%COMP%]{width:100%;margin-top:20px}.tab-label[_ngcontent-%COMP%]{font-size:14px}.file-preview[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:5px;margin-top:2px;margin-bottom:8px}.file-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:5px;background:#eee;padding:5px;border-radius:4px}.image-preview[_ngcontent-%COMP%]{width:40px;height:40px;object-fit:cover;border-radius:4px}.image-preview-chat[_ngcontent-%COMP%]{max-width:90%;max-height:70vh;width:auto;height:auto;border-radius:8px;cursor:pointer;transition:transform .2s ease-in-out}button[_ngcontent-%COMP%]{margin-left:20px;margin-right:20px}.app-select[_ngcontent-%COMP%]{width:100%}.empty-state-container[_ngcontent-%COMP%]{color:#eee;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Google Sans,sans-serif;font-weight:400;letter-spacing:normal;line-height:24px;font-size:18px}.empty-state-container[_ngcontent-%COMP%] pre.warning[_ngcontent-%COMP%]{color:#ffc185}.empty-state-container[_ngcontent-%COMP%] pre.error[_ngcontent-%COMP%]{color:#ff4545}[_nghost-%COMP%] .mat-mdc-unelevated-button:not(:disabled){color:#202124;background-color:#8ab4f8}[_nghost-%COMP%] .message-text p{white-space:pre-line;word-break:break-word;overflow-wrap:break-word}[_nghost-%COMP%] .mdc-linear-progress__buffer-dots{background:#fff}[_nghost-%COMP%] .mat-mdc-select-arrow-wrapper{margin-left:4px}[_nghost-%COMP%] .mat-mdc-text-field-wrapper{border:1px solid #8e918f}[_nghost-%COMP%] .input-field .mat-mdc-text-field-wrapper{border:1px solid #8e918f;border-radius:16px}[_nghost-%COMP%] .mdc-notched-outline__leading, [_nghost-%COMP%] .mdc-notched-outline__notch, [_nghost-%COMP%] .mdc-notched-outline__trailing{border:none}[_nghost-%COMP%] .mat-mdc-form-field-icon-suffix{padding:0 10px 0 40px}[_nghost-%COMP%] .segment-key{color:#d3d3d3!important}[_nghost-%COMP%] .mat-mdc-mini-fab{background-color:#fff}[_nghost-%COMP%] .mat-mdc-mini-fab mat-icon{color:#000}.mat-mdc-select-placeholder[_ngcontent-%COMP%]{margin-left:20px}.resize-handler[_ngcontent-%COMP%]{background:#5f6368;width:4px;border-radius:4px;position:absolute;display:block;height:20%;top:40%;right:0;z-index:9999;cursor:ew-resize}.bottom-resize-handler[_ngcontent-%COMP%]{background:#5f6368;height:5px;border-radius:4px;position:absolute;display:block;width:20%;left:40%;top:0;right:0;z-index:9999;cursor:ns-resize}.trace-detail-container[_ngcontent-%COMP%]{position:relative;background-color:#1b1b1b}.trace-detail-container[_ngcontent-%COMP%] app-trace-event[_ngcontent-%COMP%]{padding-top:8px}.new-session-button[_ngcontent-%COMP%]{margin-top:0;margin-left:50px;width:130px;height:28px;font-size:14px}.app-select-container[_ngcontent-%COMP%]{width:35%;margin-top:12px;background-color:#212123;margin-left:10px;height:30px;display:flex;justify-content:space-between;padding-left:20px;padding-right:20px;border-radius:10px;padding-top:5px}.app-select-container[_ngcontent-%COMP%]{--mat-select-placeholder-text-color: #8ab4f8}.app-select-container[_ngcontent-%COMP%]{--mat-select-enabled-trigger-text-color: #8ab4f8}.app-select-container[_ngcontent-%COMP%]{--mat-select-enabled-arrow-color: #8ab4f8}.json-viewer-container[_ngcontent-%COMP%]{margin:10px}.event-paginator[_ngcontent-%COMP%]{margin-top:-8px;margin-right:auto;background-color:inherit;display:flex;justify-content:center}[_nghost-%COMP%] .mat-mdc-paginator-page-size{display:none!important}.details-panel-container[_ngcontent-%COMP%]{position:absolute;width:100%;height:98%;left:0;right:0;bottom:0;background:#242424;display:inline-block;justify-content:center;align-items:center;z-index:10}.details-content[_ngcontent-%COMP%]{color:#fff;font-size:14px}.adk-checkbox[_ngcontent-%COMP%]{position:fixed;bottom:0;left:0;right:0;margin-bottom:20px;margin-left:20px}.drawer-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between}.drawer-header[_ngcontent-%COMP%]{--mdc-filled-button-container-color: #89b4f8}.drawer-header[_ngcontent-%COMP%]{--mdc-filled-button-label-text-color: black}.chat-toolbar[_ngcontent-%COMP%]{position:sticky;top:0;height:48px;background:#1b1b1b;display:flex;align-items:center;z-index:10}.chat-toolbar.edit-mode[_ngcontent-%COMP%]{background:#44c2651a}.attachment[_ngcontent-%COMP%]{display:flex;align-items:center}.toolbar-actions[_ngcontent-%COMP%]{margin-left:auto;display:flex;align-items:center}.toolbar-session-text[_ngcontent-%COMP%]{color:#fdfdfd;font-family:Roboto;font-size:12px;font-style:normal;font-weight:500;line-height:12px;letter-spacing:.8px;text-transform:uppercase;margin-left:20px;padding-top:4px}.toolbar-session-id[_ngcontent-%COMP%]{color:#9aa0a6;font-family:Google Sans Mono,monospace;font-size:14px;font-style:normal;font-weight:400;line-height:20px;letter-spacing:.25px;margin-left:5px}.toolbar-icon[_ngcontent-%COMP%]{width:24px;height:24px;color:#c4c7c5;cursor:pointer;margin-right:16px}.toolbar-new-sesison[_ngcontent-%COMP%]{font-size:14px;margin-right:16px;color:#9aa0a6;cursor:pointer;display:flex;align-items:center}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mat-switch-label-text-size: 14px}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mat-switch-label-text-color: #9aa0a6}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mdc-switch-selected-track-color: #8ab4f9}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mdc-switch-selected-focus-track-color: #8ab4f9}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mdc-switch-selected-hover-track-color: #8ab4f9}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mdc-switch-selected-handle-color: #1b73e8}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mdc-switch-selected-focus-handle-color: #1b73e8}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mdc-switch-selected-hover-handle-color: #1b73e8}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mdc-switch-track-height: 24px}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mdc-switch-track-width: 46px}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mat-switch-track-outline-color: #1b73e8}.toolbar-sse-toggle[_ngcontent-%COMP%]{--mat-switch-with-icon-handle-size: 20px}.image-container[_ngcontent-%COMP%]{position:relative;display:inline-block;border-radius:12px;overflow:hidden}.image-preview[_ngcontent-%COMP%]{display:block;width:100%;height:auto;border-radius:12px;width:80px;height:80px}.delete-button[_ngcontent-%COMP%]{position:absolute;top:1px;right:1px;background-color:#000000b3;border:none;border-radius:50%;padding:8px;cursor:pointer;color:#fff;display:flex;align-items:center;justify-content:center;margin-right:0;scale:.7}.delete-button[_ngcontent-%COMP%] mat-icon[_ngcontent-%COMP%]{font-size:20px}.file-container[_ngcontent-%COMP%]{position:relative;display:flex;flex-direction:column;gap:8px;height:80px;background-color:#1e1e1e;border-radius:12px}.file-info[_ngcontent-%COMP%]{margin-right:60px;padding-top:20px;padding-left:16px}.thought-chip[_ngcontent-%COMP%]{border-radius:5px;background-color:#8ab4f8;width:80px;text-align:center;margin-top:5px}.event-graph-container[_ngcontent-%COMP%]{margin-top:16px;margin-bottom:16px;display:flex;justify-content:center;max-height:33%;cursor:pointer}.event-graph-container[_ngcontent-%COMP%] svg{width:100%;height:100%;display:block;object-fit:contain}.event-graph-container[_ngcontent-%COMP%] svg text{font-family:Google Sans Mono,monospace;font-size:11px}[_nghost-%COMP%] pre{white-space:pre-wrap;word-break:break-word;overflow-x:auto;max-width:100%}.link-style-button[_ngcontent-%COMP%]{background:none;border:none;padding:0;font:inherit;color:#007bff!important;text-decoration:underline;cursor:pointer;outline:none;font-size:14px}.drawer-logo[_ngcontent-%COMP%]{margin-left:9px;display:flex;align-items:center;font-size:16px;font-style:normal;font-weight:500;line-height:24px;letter-spacing:.1px}.drawer-logo[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{margin-right:9px} .mat-drawer-content{display:flex!important} .mat-drawer{border-right:1px solid #444746!important}.app-name-option[_ngcontent-%COMP%], .app-select[_ngcontent-%COMP%]{color:#9aa0a6;font-family:Google Sans Mono,monospace;font-style:normal;font-weight:400;padding-left:unset}"],changeDetection:0})};var _Q=class t{title="agent_framework_web";userId="";appName="";sessionId="";constructor(){}static \u0275fac=function(A){return new(A||t)};static \u0275cmp=zA({type:t,selectors:[["app-root"]],standalone:!1,decls:1,vars:0,template:function(A,i){A&1&&JA(0,"app-chat")},dependencies:[Ff],encapsulation:2})};var tVA=[{path:"",component:_Q}],B7=class t{static \u0275fac=function(A){return new(A||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[O6.forRoot(tVA),O6]})};function FlA(t){return new Ae(3e3,!1)}function iVA(){return new Ae(3100,!1)}function nVA(){return new Ae(3101,!1)}function oVA(t){return new Ae(3001,!1)}function rVA(t){return new Ae(3003,!1)}function sVA(t){return new Ae(3004,!1)}function _lA(t,e){return new Ae(3005,!1)}function GlA(){return new Ae(3006,!1)}function UlA(){return new Ae(3007,!1)}function KlA(t,e){return new Ae(3008,!1)}function YlA(t){return new Ae(3002,!1)}function JlA(t,e,A,i,n){return new Ae(3010,!1)}function TlA(){return new Ae(3011,!1)}function HlA(){return new Ae(3012,!1)}function zlA(){return new Ae(3200,!1)}function OlA(){return new Ae(3202,!1)}function PlA(){return new Ae(3013,!1)}function jlA(t){return new Ae(3014,!1)}function qlA(t){return new Ae(3015,!1)}function VlA(t){return new Ae(3016,!1)}function ZlA(t,e){return new Ae(3404,!1)}function aVA(t){return new Ae(3502,!1)}function WlA(t){return new Ae(3503,!1)}function XlA(){return new Ae(3300,!1)}function $lA(t){return new Ae(3504,!1)}function AgA(t){return new Ae(3301,!1)}function egA(t,e){return new Ae(3302,!1)}function tgA(t){return new Ae(3303,!1)}function igA(t,e){return new Ae(3400,!1)}function ngA(t){return new Ae(3401,!1)}function ogA(t){return new Ae(3402,!1)}function rgA(t,e){return new Ae(3505,!1)}function c2(t){switch(t.length){case 0:return new Eg;case 1:return t[0];default:return new tC(t)}}function hU(t,e,A=new Map,i=new Map){let n=[],o=[],r=-1,s=null;if(e.forEach(a=>{let c=a.get("offset"),l=c==r,I=l&&s||new Map;a.forEach((C,d)=>{let B=d,E=C;if(d!=="offset")switch(B=t.normalizePropertyName(B,n),E){case FB:E=A.get(d);break;case kc:E=i.get(d);break;default:E=t.normalizeStyleValue(d,B,E,n);break}I.set(B,E)}),l||o.push(I),s=I,r=c}),n.length)throw aVA(n);return o}function E7(t,e,A,i){switch(e){case"start":t.onStart(()=>i(A&&BU(A,"start",t)));break;case"done":t.onDone(()=>i(A&&BU(A,"done",t)));break;case"destroy":t.onDestroy(()=>i(A&&BU(A,"destroy",t)));break}}function BU(t,e,A){let i=A.totalTime,n=!!A.disabled,o=Q7(t.element,t.triggerName,t.fromState,t.toState,e||t.phaseName,i??t.totalTime,n),r=t._data;return r!=null&&(o._data=r),o}function Q7(t,e,A,i,n="",o=0,r){return{element:t,triggerName:e,fromState:A,toState:i,phaseName:n,totalTime:o,disabled:!!r}}function Ya(t,e,A){let i=t.get(e);return i||t.set(e,i=A),i}function uU(t){let e=t.indexOf(":"),A=t.substring(1,e),i=t.slice(e+1);return[A,i]}var cVA=typeof document>"u"?null:document.documentElement;function h7(t){let e=t.parentNode||t.host||null;return e===cVA?null:e}function lVA(t){return t.substring(1,6)=="ebkit"}var ad=null,NlA=!1;function sgA(t){ad||(ad=gVA()||{},NlA=ad.style?"WebkitAppearance"in ad.style:!1);let e=!0;return ad.style&&!lVA(t)&&(e=t in ad.style,!e&&NlA&&(e="Webkit"+t.charAt(0).toUpperCase()+t.slice(1)in ad.style)),e}function gVA(){return typeof document<"u"?document.body:null}function fU(t,e){for(;e;){if(e===t)return!0;e=h7(e)}return!1}function mU(t,e,A){if(A)return Array.from(t.querySelectorAll(e));let i=t.querySelector(e);return i?[i]:[]}var IVA=1e3,pU="{{",CVA="}}",wU="ng-enter",u7="ng-leave",Nf="ng-trigger",_f=".ng-trigger",DU="ng-animating",f7=".ng-animating";function e0(t){if(typeof t=="number")return t;let e=t.match(/^(-?[\.\d]+)(m?s)/);return!e||e.length<2?0:EU(parseFloat(e[1]),e[2])}function EU(t,e){switch(e){case"s":return t*IVA;default:return t}}function Gf(t,e,A){return t.hasOwnProperty("duration")?t:dVA(t,e,A)}function dVA(t,e,A){let i=/^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i,n,o=0,r="";if(typeof t=="string"){let s=t.match(i);if(s===null)return e.push(FlA(t)),{duration:0,delay:0,easing:""};n=EU(parseFloat(s[1]),s[2]);let a=s[3];a!=null&&(o=EU(parseFloat(a),s[4]));let c=s[5];c&&(r=c)}else n=t;if(!A){let s=!1,a=e.length;n<0&&(e.push(iVA()),s=!0),o<0&&(e.push(nVA()),s=!0),s&&e.splice(a,0,FlA(t))}return{duration:n,delay:o,easing:r}}function agA(t){return t.length?t[0]instanceof Map?t:t.map(e=>new Map(Object.entries(e))):[]}function Jl(t,e,A){e.forEach((i,n)=>{let o=m7(n);A&&!A.has(n)&&A.set(n,t.style[o]),t.style[o]=i})}function rI(t,e){e.forEach((A,i)=>{let n=m7(i);t.style[n]=""})}function GQ(t){return Array.isArray(t)?t.length==1?t[0]:hP(t):t}function cgA(t,e,A){let i=e.params||{},n=yU(t);n.length&&n.forEach(o=>{i.hasOwnProperty(o)||A.push(oVA(o))})}var QU=new RegExp(`${pU}\\s*(.+?)\\s*${CVA}`,"g");function yU(t){let e=[];if(typeof t=="string"){let A;for(;A=QU.exec(t);)e.push(A[1]);QU.lastIndex=0}return e}function UQ(t,e,A){let i=`${t}`,n=i.replace(QU,(o,r)=>{let s=e[r];return s==null&&(A.push(rVA(r)),s=""),s.toString()});return n==i?t:n}var BVA=/-+([a-z0-9])/g;function m7(t){return t.replace(BVA,(...e)=>e[1].toUpperCase())}function lgA(t,e){return t===0||e===0}function ggA(t,e,A){if(A.size&&e.length){let i=e[0],n=[];if(A.forEach((o,r)=>{i.has(r)||n.push(r),i.set(r,o)}),n.length)for(let o=1;or.set(s,p7(t,s)))}}return e}function Ja(t,e,A){switch(e.type){case Ci.Trigger:return t.visitTrigger(e,A);case Ci.State:return t.visitState(e,A);case Ci.Transition:return t.visitTransition(e,A);case Ci.Sequence:return t.visitSequence(e,A);case Ci.Group:return t.visitGroup(e,A);case Ci.Animate:return t.visitAnimate(e,A);case Ci.Keyframes:return t.visitKeyframes(e,A);case Ci.Style:return t.visitStyle(e,A);case Ci.Reference:return t.visitReference(e,A);case Ci.AnimateChild:return t.visitAnimateChild(e,A);case Ci.AnimateRef:return t.visitAnimateRef(e,A);case Ci.Query:return t.visitQuery(e,A);case Ci.Stagger:return t.visitStagger(e,A);default:throw sVA(e.type)}}function p7(t,e){return window.getComputedStyle(t)[e]}var TU=(()=>{class t{validateStyleProperty(A){return sgA(A)}containsElement(A,i){return fU(A,i)}getParentElement(A){return h7(A)}query(A,i,n){return mU(A,i,n)}computeStyle(A,i,n){return n||""}animate(A,i,n,o,r,s=[],a){return new Eg(n,o)}static \u0275fac=function(i){return new(i||t)};static \u0275prov=NA({token:t,factory:t.\u0275fac})}return t})(),ld=class{static NOOP=new TU},gd=class{};var EVA=new Set(["width","height","minWidth","minHeight","maxWidth","maxHeight","left","top","bottom","right","fontSize","outlineWidth","outlineOffset","paddingTop","paddingLeft","paddingBottom","paddingRight","marginTop","marginLeft","marginBottom","marginRight","borderRadius","borderWidth","borderTopWidth","borderLeftWidth","borderRightWidth","borderBottomWidth","textIndent","perspective"]),b7=class extends gd{normalizePropertyName(e,A){return m7(e)}normalizeStyleValue(e,A,i,n){let o="",r=i.toString().trim();if(EVA.has(A)&&i!==0&&i!=="0")if(typeof i=="number")o="px";else{let s=i.match(/^[+-]?[\d\.]+([a-z]*)$/);s&&s[1].length==0&&n.push(_lA(e,i))}return r+o}};var M7="*";function QVA(t,e){let A=[];return typeof t=="string"?t.split(/\s*,\s*/).forEach(i=>hVA(i,A,e)):A.push(t),A}function hVA(t,e,A){if(t[0]==":"){let a=uVA(t,A);if(typeof a=="function"){e.push(a);return}t=a}let i=t.match(/^(\*|[-\w]+)\s*()\s*(\*|[-\w]+)$/);if(i==null||i.length<4)return A.push(qlA(t)),e;let n=i[1],o=i[2],r=i[3];e.push(IgA(n,r));let s=n==M7&&r==M7;o[0]=="<"&&!s&&e.push(IgA(r,n))}function uVA(t,e){switch(t){case":enter":return"void => *";case":leave":return"* => void";case":increment":return(A,i)=>parseFloat(i)>parseFloat(A);case":decrement":return(A,i)=>parseFloat(i) *"}}var w7=new Set(["true","1"]),D7=new Set(["false","0"]);function IgA(t,e){let A=w7.has(t)||D7.has(t),i=w7.has(e)||D7.has(e);return(n,o)=>{let r=t==M7||t==n,s=e==M7||e==o;return!r&&A&&typeof n=="boolean"&&(r=n?w7.has(t):D7.has(t)),!s&&i&&typeof o=="boolean"&&(s=o?w7.has(e):D7.has(e)),r&&s}}var pgA=":self",fVA=new RegExp(`s*${pgA}s*,?`,"g");function wgA(t,e,A,i){return new RU(t).build(e,A,i)}var CgA="",RU=class{_driver;constructor(e){this._driver=e}build(e,A,i){let n=new xU(A);return this._resetContextStyleTimingState(n),Ja(this,GQ(e),n)}_resetContextStyleTimingState(e){e.currentQuerySelector=CgA,e.collectedStyles=new Map,e.collectedStyles.set(CgA,new Map),e.currentTime=0}visitTrigger(e,A){let i=A.queryCount=0,n=A.depCount=0,o=[],r=[];return e.name.charAt(0)=="@"&&A.errors.push(GlA()),e.definitions.forEach(s=>{if(this._resetContextStyleTimingState(A),s.type==Ci.State){let a=s,c=a.name;c.toString().split(/\s*,\s*/).forEach(l=>{a.name=l,o.push(this.visitState(a,A))}),a.name=c}else if(s.type==Ci.Transition){let a=this.visitTransition(s,A);i+=a.queryCount,n+=a.depCount,r.push(a)}else A.errors.push(UlA())}),{type:Ci.Trigger,name:e.name,states:o,transitions:r,queryCount:i,depCount:n,options:null}}visitState(e,A){let i=this.visitStyle(e.styles,A),n=e.options&&e.options.params||null;if(i.containsDynamicStyles){let o=new Set,r=n||{};i.styles.forEach(s=>{s instanceof Map&&s.forEach(a=>{yU(a).forEach(c=>{r.hasOwnProperty(c)||o.add(c)})})}),o.size&&A.errors.push(KlA(e.name,[...o.values()]))}return{type:Ci.State,name:e.name,style:i,options:n?{params:n}:null}}visitTransition(e,A){A.queryCount=0,A.depCount=0;let i=Ja(this,GQ(e.animation),A),n=QVA(e.expr,A.errors);return{type:Ci.Transition,matchers:n,animation:i,queryCount:A.queryCount,depCount:A.depCount,options:cd(e.options)}}visitSequence(e,A){return{type:Ci.Sequence,steps:e.steps.map(i=>Ja(this,i,A)),options:cd(e.options)}}visitGroup(e,A){let i=A.currentTime,n=0,o=e.steps.map(r=>{A.currentTime=i;let s=Ja(this,r,A);return n=Math.max(n,A.currentTime),s});return A.currentTime=n,{type:Ci.Group,steps:o,options:cd(e.options)}}visitAnimate(e,A){let i=DVA(e.timings,A.errors);A.currentAnimateTimings=i;let n,o=e.styles?e.styles:po({});if(o.type==Ci.Keyframes)n=this.visitKeyframes(o,A);else{let r=e.styles,s=!1;if(!r){s=!0;let c={};i.easing&&(c.easing=i.easing),r=po(c)}A.currentTime+=i.duration+i.delay;let a=this.visitStyle(r,A);a.isEmptyStep=s,n=a}return A.currentAnimateTimings=null,{type:Ci.Animate,timings:i,style:n,options:null}}visitStyle(e,A){let i=this._makeStyleAst(e,A);return this._validateStyleAst(i,A),i}_makeStyleAst(e,A){let i=[],n=Array.isArray(e.styles)?e.styles:[e.styles];for(let s of n)typeof s=="string"?s===kc?i.push(s):A.errors.push(YlA(s)):i.push(new Map(Object.entries(s)));let o=!1,r=null;return i.forEach(s=>{if(s instanceof Map&&(s.has("easing")&&(r=s.get("easing"),s.delete("easing")),!o)){for(let a of s.values())if(a.toString().indexOf(pU)>=0){o=!0;break}}}),{type:Ci.Style,styles:i,easing:r,offset:e.offset,containsDynamicStyles:o,options:null}}_validateStyleAst(e,A){let i=A.currentAnimateTimings,n=A.currentTime,o=A.currentTime;i&&o>0&&(o-=i.duration+i.delay),e.styles.forEach(r=>{typeof r!="string"&&r.forEach((s,a)=>{let c=A.collectedStyles.get(A.currentQuerySelector),l=c.get(a),I=!0;l&&(o!=n&&o>=l.startTime&&n<=l.endTime&&(A.errors.push(JlA(a,l.startTime,l.endTime,o,n)),I=!1),o=l.startTime),I&&c.set(a,{startTime:o,endTime:n}),A.options&&cgA(s,A.options,A.errors)})})}visitKeyframes(e,A){let i={type:Ci.Keyframes,styles:[],options:null};if(!A.currentAnimateTimings)return A.errors.push(TlA()),i;let n=1,o=0,r=[],s=!1,a=!1,c=0,l=e.steps.map(u=>{let D=this._makeStyleAst(u,A),L=D.offset!=null?D.offset:wVA(D.styles),R=0;return L!=null&&(o++,R=D.offset=L),a=a||R<0||R>1,s=s||R0&&o{let L=C>0?D==d?1:C*D:r[D],R=L*h;A.currentTime=B+E.delay+R,E.duration=R,this._validateStyleAst(u,A),u.offset=L,i.styles.push(u)}),i}visitReference(e,A){return{type:Ci.Reference,animation:Ja(this,GQ(e.animation),A),options:cd(e.options)}}visitAnimateChild(e,A){return A.depCount++,{type:Ci.AnimateChild,options:cd(e.options)}}visitAnimateRef(e,A){return{type:Ci.AnimateRef,animation:this.visitReference(e.animation,A),options:cd(e.options)}}visitQuery(e,A){let i=A.currentQuerySelector,n=e.options||{};A.queryCount++,A.currentQuery=e;let[o,r]=mVA(e.selector);A.currentQuerySelector=i.length?i+" "+o:o,Ya(A.collectedStyles,A.currentQuerySelector,new Map);let s=Ja(this,GQ(e.animation),A);return A.currentQuery=null,A.currentQuerySelector=i,{type:Ci.Query,selector:o,limit:n.limit||0,optional:!!n.optional,includeSelf:r,animation:s,originalSelector:e.selector,options:cd(e.options)}}visitStagger(e,A){A.currentQuery||A.errors.push(PlA());let i=e.timings==="full"?{duration:0,delay:0,easing:"full"}:Gf(e.timings,A.errors,!0);return{type:Ci.Stagger,animation:Ja(this,GQ(e.animation),A),timings:i,options:null}}};function mVA(t){let e=!!t.split(/\s*,\s*/).find(A=>A==pgA);return e&&(t=t.replace(fVA,"")),t=t.replace(/@\*/g,_f).replace(/@\w+/g,A=>_f+"-"+A.slice(1)).replace(/:animating/g,f7),[t,e]}function pVA(t){return t?rA({},t):null}var xU=class{errors;queryCount=0;depCount=0;currentTransition=null;currentQuery=null;currentQuerySelector=null;currentAnimateTimings=null;currentTime=0;collectedStyles=new Map;options=null;unsupportedCSSPropertiesFound=new Set;constructor(e){this.errors=e}};function wVA(t){if(typeof t=="string")return null;let e=null;if(Array.isArray(t))t.forEach(A=>{if(A instanceof Map&&A.has("offset")){let i=A;e=parseFloat(i.get("offset")),i.delete("offset")}});else if(t instanceof Map&&t.has("offset")){let A=t;e=parseFloat(A.get("offset")),A.delete("offset")}return e}function DVA(t,e){if(t.hasOwnProperty("duration"))return t;if(typeof t=="number"){let o=Gf(t,e).duration;return vU(o,0,"")}let A=t;if(A.split(/\s+/).some(o=>o.charAt(0)=="{"&&o.charAt(1)=="{")){let o=vU(0,0,"");return o.dynamic=!0,o.strValue=A,o}let n=Gf(A,e);return vU(n.duration,n.delay,n.easing)}function cd(t){return t?(t=rA({},t),t.params&&(t.params=pVA(t.params))):t={},t}function vU(t,e,A){return{duration:t,delay:e,easing:A}}function HU(t,e,A,i,n,o,r=null,s=!1){return{type:1,element:t,keyframes:e,preStyleProps:A,postStyleProps:i,duration:n,delay:o,totalTime:n+o,easing:r,subTimeline:s}}var Kf=class{_map=new Map;get(e){return this._map.get(e)||[]}append(e,A){let i=this._map.get(e);i||this._map.set(e,i=[]),i.push(...A)}has(e){return this._map.has(e)}clear(){this._map.clear()}},yVA=1,vVA=":enter",bVA=new RegExp(vVA,"g"),MVA=":leave",kVA=new RegExp(MVA,"g");function DgA(t,e,A,i,n,o=new Map,r=new Map,s,a,c=[]){return new LU().buildKeyframes(t,e,A,i,n,o,r,s,a,c)}var LU=class{buildKeyframes(e,A,i,n,o,r,s,a,c,l=[]){c=c||new Kf;let I=new FU(e,A,c,n,o,l,[]);I.options=a;let C=a.delay?e0(a.delay):0;I.currentTimeline.delayNextStep(C),I.currentTimeline.setStyles([r],null,I.errors,a),Ja(this,i,I);let d=I.timelines.filter(B=>B.containsAnimation());if(d.length&&s.size){let B;for(let E=d.length-1;E>=0;E--){let h=d[E];if(h.element===A){B=h;break}}B&&!B.allowOnlyTimelineStyles()&&B.setStyles([s],null,I.errors,a)}return d.length?d.map(B=>B.buildKeyframes()):[HU(A,[],[],[],0,C,"",!1)]}visitTrigger(e,A){}visitState(e,A){}visitTransition(e,A){}visitAnimateChild(e,A){let i=A.subInstructions.get(A.element);if(i){let n=A.createSubContext(e.options),o=A.currentTimeline.currentTime,r=this._visitSubInstructions(i,n,n.options);o!=r&&A.transformIntoNewTimeline(r)}A.previousNode=e}visitAnimateRef(e,A){let i=A.createSubContext(e.options);i.transformIntoNewTimeline(),this._applyAnimationRefDelays([e.options,e.animation.options],A,i),this.visitReference(e.animation,i),A.transformIntoNewTimeline(i.currentTimeline.currentTime),A.previousNode=e}_applyAnimationRefDelays(e,A,i){for(let n of e){let o=n?.delay;if(o){let r=typeof o=="number"?o:e0(UQ(o,n?.params??{},A.errors));i.delayNextStep(r)}}}_visitSubInstructions(e,A,i){let o=A.currentTimeline.currentTime,r=i.duration!=null?e0(i.duration):null,s=i.delay!=null?e0(i.delay):null;return r!==0&&e.forEach(a=>{let c=A.appendInstructionToTimeline(a,r,s);o=Math.max(o,c.duration+c.delay)}),o}visitReference(e,A){A.updateOptions(e.options,!0),Ja(this,e.animation,A),A.previousNode=e}visitSequence(e,A){let i=A.subContextCount,n=A,o=e.options;if(o&&(o.params||o.delay)&&(n=A.createSubContext(o),n.transformIntoNewTimeline(),o.delay!=null)){n.previousNode.type==Ci.Style&&(n.currentTimeline.snapshotCurrentStyles(),n.previousNode=k7);let r=e0(o.delay);n.delayNextStep(r)}e.steps.length&&(e.steps.forEach(r=>Ja(this,r,n)),n.currentTimeline.applyStylesToKeyframe(),n.subContextCount>i&&n.transformIntoNewTimeline()),A.previousNode=e}visitGroup(e,A){let i=[],n=A.currentTimeline.currentTime,o=e.options&&e.options.delay?e0(e.options.delay):0;e.steps.forEach(r=>{let s=A.createSubContext(e.options);o&&s.delayNextStep(o),Ja(this,r,s),n=Math.max(n,s.currentTimeline.currentTime),i.push(s.currentTimeline)}),i.forEach(r=>A.currentTimeline.mergeTimelineCollectedStyles(r)),A.transformIntoNewTimeline(n),A.previousNode=e}_visitTiming(e,A){if(e.dynamic){let i=e.strValue,n=A.params?UQ(i,A.params,A.errors):i;return Gf(n,A.errors)}else return{duration:e.duration,delay:e.delay,easing:e.easing}}visitAnimate(e,A){let i=A.currentAnimateTimings=this._visitTiming(e.timings,A),n=A.currentTimeline;i.delay&&(A.incrementTime(i.delay),n.snapshotCurrentStyles());let o=e.style;o.type==Ci.Keyframes?this.visitKeyframes(o,A):(A.incrementTime(i.duration),this.visitStyle(o,A),n.applyStylesToKeyframe()),A.currentAnimateTimings=null,A.previousNode=e}visitStyle(e,A){let i=A.currentTimeline,n=A.currentAnimateTimings;!n&&i.hasCurrentStyleProperties()&&i.forwardFrame();let o=n&&n.easing||e.easing;e.isEmptyStep?i.applyEmptyStep(o):i.setStyles(e.styles,o,A.errors,A.options),A.previousNode=e}visitKeyframes(e,A){let i=A.currentAnimateTimings,n=A.currentTimeline.duration,o=i.duration,s=A.createSubContext().currentTimeline;s.easing=i.easing,e.styles.forEach(a=>{let c=a.offset||0;s.forwardTime(c*o),s.setStyles(a.styles,a.easing,A.errors,A.options),s.applyStylesToKeyframe()}),A.currentTimeline.mergeTimelineCollectedStyles(s),A.transformIntoNewTimeline(n+o),A.previousNode=e}visitQuery(e,A){let i=A.currentTimeline.currentTime,n=e.options||{},o=n.delay?e0(n.delay):0;o&&(A.previousNode.type===Ci.Style||i==0&&A.currentTimeline.hasCurrentStyleProperties())&&(A.currentTimeline.snapshotCurrentStyles(),A.previousNode=k7);let r=i,s=A.invokeQuery(e.selector,e.originalSelector,e.limit,e.includeSelf,!!n.optional,A.errors);A.currentQueryTotal=s.length;let a=null;s.forEach((c,l)=>{A.currentQueryIndex=l;let I=A.createSubContext(e.options,c);o&&I.delayNextStep(o),c===A.element&&(a=I.currentTimeline),Ja(this,e.animation,I),I.currentTimeline.applyStylesToKeyframe();let C=I.currentTimeline.currentTime;r=Math.max(r,C)}),A.currentQueryIndex=0,A.currentQueryTotal=0,A.transformIntoNewTimeline(r),a&&(A.currentTimeline.mergeTimelineCollectedStyles(a),A.currentTimeline.snapshotCurrentStyles()),A.previousNode=e}visitStagger(e,A){let i=A.parentContext,n=A.currentTimeline,o=e.timings,r=Math.abs(o.duration),s=r*(A.currentQueryTotal-1),a=r*A.currentQueryIndex;switch(o.duration<0?"reverse":o.easing){case"reverse":a=s-a;break;case"full":a=i.currentStaggerTime;break}let l=A.currentTimeline;a&&l.delayNextStep(a);let I=l.currentTime;Ja(this,e.animation,A),A.previousNode=e,i.currentStaggerTime=n.currentTime-I+(n.startTime-i.currentTimeline.startTime)}},k7={},FU=class t{_driver;element;subInstructions;_enterClassName;_leaveClassName;errors;timelines;parentContext=null;currentTimeline;currentAnimateTimings=null;previousNode=k7;subContextCount=0;options={};currentQueryIndex=0;currentQueryTotal=0;currentStaggerTime=0;constructor(e,A,i,n,o,r,s,a){this._driver=e,this.element=A,this.subInstructions=i,this._enterClassName=n,this._leaveClassName=o,this.errors=r,this.timelines=s,this.currentTimeline=a||new S7(this._driver,A,0),s.push(this.currentTimeline)}get params(){return this.options.params}updateOptions(e,A){if(!e)return;let i=e,n=this.options;i.duration!=null&&(n.duration=e0(i.duration)),i.delay!=null&&(n.delay=e0(i.delay));let o=i.params;if(o){let r=n.params;r||(r=this.options.params={}),Object.keys(o).forEach(s=>{(!A||!r.hasOwnProperty(s))&&(r[s]=UQ(o[s],r,this.errors))})}}_copyOptions(){let e={};if(this.options){let A=this.options.params;if(A){let i=e.params={};Object.keys(A).forEach(n=>{i[n]=A[n]})}}return e}createSubContext(e=null,A,i){let n=A||this.element,o=new t(this._driver,n,this.subInstructions,this._enterClassName,this._leaveClassName,this.errors,this.timelines,this.currentTimeline.fork(n,i||0));return o.previousNode=this.previousNode,o.currentAnimateTimings=this.currentAnimateTimings,o.options=this._copyOptions(),o.updateOptions(e),o.currentQueryIndex=this.currentQueryIndex,o.currentQueryTotal=this.currentQueryTotal,o.parentContext=this,this.subContextCount++,o}transformIntoNewTimeline(e){return this.previousNode=k7,this.currentTimeline=this.currentTimeline.fork(this.element,e),this.timelines.push(this.currentTimeline),this.currentTimeline}appendInstructionToTimeline(e,A,i){let n={duration:A??e.duration,delay:this.currentTimeline.currentTime+(i??0)+e.delay,easing:""},o=new NU(this._driver,e.element,e.keyframes,e.preStyleProps,e.postStyleProps,n,e.stretchStartingKeyframe);return this.timelines.push(o),n}incrementTime(e){this.currentTimeline.forwardTime(this.currentTimeline.duration+e)}delayNextStep(e){e>0&&this.currentTimeline.delayNextStep(e)}invokeQuery(e,A,i,n,o,r){let s=[];if(n&&s.push(this.element),e.length>0){e=e.replace(bVA,"."+this._enterClassName),e=e.replace(kVA,"."+this._leaveClassName);let a=i!=1,c=this._driver.query(this.element,e,a);i!==0&&(c=i<0?c.slice(c.length+i,c.length):c.slice(0,i)),s.push(...c)}return!o&&s.length==0&&r.push(jlA(A)),s}},S7=class t{_driver;element;startTime;_elementTimelineStylesLookup;duration=0;easing=null;_previousKeyframe=new Map;_currentKeyframe=new Map;_keyframes=new Map;_styleSummary=new Map;_localTimelineStyles=new Map;_globalTimelineStyles;_pendingStyles=new Map;_backFill=new Map;_currentEmptyStepKeyframe=null;constructor(e,A,i,n){this._driver=e,this.element=A,this.startTime=i,this._elementTimelineStylesLookup=n,this._elementTimelineStylesLookup||(this._elementTimelineStylesLookup=new Map),this._globalTimelineStyles=this._elementTimelineStylesLookup.get(A),this._globalTimelineStyles||(this._globalTimelineStyles=this._localTimelineStyles,this._elementTimelineStylesLookup.set(A,this._localTimelineStyles)),this._loadKeyframe()}containsAnimation(){switch(this._keyframes.size){case 0:return!1;case 1:return this.hasCurrentStyleProperties();default:return!0}}hasCurrentStyleProperties(){return this._currentKeyframe.size>0}get currentTime(){return this.startTime+this.duration}delayNextStep(e){let A=this._keyframes.size===1&&this._pendingStyles.size;this.duration||A?(this.forwardTime(this.currentTime+e),A&&this.snapshotCurrentStyles()):this.startTime+=e}fork(e,A){return this.applyStylesToKeyframe(),new t(this._driver,e,A||this.currentTime,this._elementTimelineStylesLookup)}_loadKeyframe(){this._currentKeyframe&&(this._previousKeyframe=this._currentKeyframe),this._currentKeyframe=this._keyframes.get(this.duration),this._currentKeyframe||(this._currentKeyframe=new Map,this._keyframes.set(this.duration,this._currentKeyframe))}forwardFrame(){this.duration+=yVA,this._loadKeyframe()}forwardTime(e){this.applyStylesToKeyframe(),this.duration=e,this._loadKeyframe()}_updateStyle(e,A){this._localTimelineStyles.set(e,A),this._globalTimelineStyles.set(e,A),this._styleSummary.set(e,{time:this.currentTime,value:A})}allowOnlyTimelineStyles(){return this._currentEmptyStepKeyframe!==this._currentKeyframe}applyEmptyStep(e){e&&this._previousKeyframe.set("easing",e);for(let[A,i]of this._globalTimelineStyles)this._backFill.set(A,i||kc),this._currentKeyframe.set(A,kc);this._currentEmptyStepKeyframe=this._currentKeyframe}setStyles(e,A,i,n){A&&this._previousKeyframe.set("easing",A);let o=n&&n.params||{},r=SVA(e,this._globalTimelineStyles);for(let[s,a]of r){let c=UQ(a,o,i);this._pendingStyles.set(s,c),this._localTimelineStyles.has(s)||this._backFill.set(s,this._globalTimelineStyles.get(s)??kc),this._updateStyle(s,c)}}applyStylesToKeyframe(){this._pendingStyles.size!=0&&(this._pendingStyles.forEach((e,A)=>{this._currentKeyframe.set(A,e)}),this._pendingStyles.clear(),this._localTimelineStyles.forEach((e,A)=>{this._currentKeyframe.has(A)||this._currentKeyframe.set(A,e)}))}snapshotCurrentStyles(){for(let[e,A]of this._localTimelineStyles)this._pendingStyles.set(e,A),this._updateStyle(e,A)}getFinalKeyframe(){return this._keyframes.get(this.duration)}get properties(){let e=[];for(let A in this._currentKeyframe)e.push(A);return e}mergeTimelineCollectedStyles(e){e._styleSummary.forEach((A,i)=>{let n=this._styleSummary.get(i);(!n||A.time>n.time)&&this._updateStyle(i,A.value)})}buildKeyframes(){this.applyStylesToKeyframe();let e=new Set,A=new Set,i=this._keyframes.size===1&&this.duration===0,n=[];this._keyframes.forEach((s,a)=>{let c=new Map([...this._backFill,...s]);c.forEach((l,I)=>{l===FB?e.add(I):l===kc&&A.add(I)}),i||c.set("offset",a/this.duration),n.push(c)});let o=[...e.values()],r=[...A.values()];if(i){let s=n[0],a=new Map(s);s.set("offset",0),a.set("offset",1),n=[s,a]}return HU(this.element,n,o,r,this.duration,this.startTime,this.easing,!1)}},NU=class extends S7{keyframes;preStyleProps;postStyleProps;_stretchStartingKeyframe;timings;constructor(e,A,i,n,o,r,s=!1){super(e,A,r.delay),this.keyframes=i,this.preStyleProps=n,this.postStyleProps=o,this._stretchStartingKeyframe=s,this.timings={duration:r.duration,delay:r.delay,easing:r.easing}}containsAnimation(){return this.keyframes.length>1}buildKeyframes(){let e=this.keyframes,{delay:A,duration:i,easing:n}=this.timings;if(this._stretchStartingKeyframe&&A){let o=[],r=i+A,s=A/r,a=new Map(e[0]);a.set("offset",0),o.push(a);let c=new Map(e[0]);c.set("offset",dgA(s)),o.push(c);let l=e.length-1;for(let I=1;I<=l;I++){let C=new Map(e[I]),d=C.get("offset"),B=A+d*i;C.set("offset",dgA(B/r)),o.push(C)}i=r,A=0,n="",e=o}return HU(this.element,e,this.preStyleProps,this.postStyleProps,i,A,n,!0)}};function dgA(t,e=3){let A=Math.pow(10,e-1);return Math.round(t*A)/A}function SVA(t,e){let A=new Map,i;return t.forEach(n=>{if(n==="*"){i??=e.keys();for(let o of i)A.set(o,kc)}else for(let[o,r]of n)A.set(o,r)}),A}function BgA(t,e,A,i,n,o,r,s,a,c,l,I,C){return{type:0,element:t,triggerName:e,isRemovalTransition:n,fromState:A,fromStyles:o,toState:i,toStyles:r,timelines:s,queriedElements:a,preStyleProps:c,postStyleProps:l,totalTime:I,errors:C}}var bU={},R7=class{_triggerName;ast;_stateStyles;constructor(e,A,i){this._triggerName=e,this.ast=A,this._stateStyles=i}match(e,A,i,n){return RVA(this.ast.matchers,e,A,i,n)}buildStyles(e,A,i){let n=this._stateStyles.get("*");return e!==void 0&&(n=this._stateStyles.get(e?.toString())||n),n?n.buildStyles(A,i):new Map}build(e,A,i,n,o,r,s,a,c,l){let I=[],C=this.ast.options&&this.ast.options.params||bU,d=s&&s.params||bU,B=this.buildStyles(i,d,I),E=a&&a.params||bU,h=this.buildStyles(n,E,I),u=new Set,D=new Map,L=new Map,R=n==="void",w={params:ygA(E,C),delay:this.ast.options?.delay},_=l?[]:DgA(e,A,this.ast.animation,o,r,B,h,w,c,I),K=0;return _.forEach(z=>{K=Math.max(z.duration+z.delay,K)}),I.length?BgA(A,this._triggerName,i,n,R,B,h,[],[],D,L,K,I):(_.forEach(z=>{let U=z.element,H=Ya(D,U,new Set);z.preStyleProps.forEach(j=>H.add(j));let q=Ya(L,U,new Set);z.postStyleProps.forEach(j=>q.add(j)),U!==A&&u.add(U)}),BgA(A,this._triggerName,i,n,R,B,h,_,[...u.values()],D,L,K))}};function RVA(t,e,A,i,n){return t.some(o=>o(e,A,i,n))}function ygA(t,e){let A=rA({},e);return Object.entries(t).forEach(([i,n])=>{n!=null&&(A[i]=n)}),A}var _U=class{styles;defaultParams;normalizer;constructor(e,A,i){this.styles=e,this.defaultParams=A,this.normalizer=i}buildStyles(e,A){let i=new Map,n=ygA(e,this.defaultParams);return this.styles.styles.forEach(o=>{typeof o!="string"&&o.forEach((r,s)=>{r&&(r=UQ(r,n,A));let a=this.normalizer.normalizePropertyName(s,A);r=this.normalizer.normalizeStyleValue(s,a,r,A),i.set(s,r)})}),i}};function xVA(t,e,A){return new GU(t,e,A)}var GU=class{name;ast;_normalizer;transitionFactories=[];fallbackTransition;states=new Map;constructor(e,A,i){this.name=e,this.ast=A,this._normalizer=i,A.states.forEach(n=>{let o=n.options&&n.options.params||{};this.states.set(n.name,new _U(n.style,o,i))}),EgA(this.states,"true","1"),EgA(this.states,"false","0"),A.transitions.forEach(n=>{this.transitionFactories.push(new R7(e,n,this.states))}),this.fallbackTransition=LVA(e,this.states)}get containsQueries(){return this.ast.queryCount>0}matchTransition(e,A,i,n){return this.transitionFactories.find(r=>r.match(e,A,i,n))||null}matchStyles(e,A,i){return this.fallbackTransition.buildStyles(e,A,i)}};function LVA(t,e,A){let i=[(r,s)=>!0],n={type:Ci.Sequence,steps:[],options:null},o={type:Ci.Transition,animation:n,matchers:i,options:null,queryCount:0,depCount:0};return new R7(t,o,e)}function EgA(t,e,A){t.has(e)?t.has(A)||t.set(A,t.get(e)):t.has(A)&&t.set(e,t.get(A))}var FVA=new Kf,UU=class{bodyNode;_driver;_normalizer;_animations=new Map;_playersById=new Map;players=[];constructor(e,A,i){this.bodyNode=e,this._driver=A,this._normalizer=i}register(e,A){let i=[],n=[],o=wgA(this._driver,A,i,n);if(i.length)throw WlA(i);this._animations.set(e,o)}_buildPlayer(e,A,i){let n=e.element,o=hU(this._normalizer,e.keyframes,A,i);return this._driver.animate(n,o,e.duration,e.delay,e.easing,[],!0)}create(e,A,i={}){let n=[],o=this._animations.get(e),r,s=new Map;if(o?(r=DgA(this._driver,A,o,wU,u7,new Map,new Map,i,FVA,n),r.forEach(l=>{let I=Ya(s,l.element,new Map);l.postStyleProps.forEach(C=>I.set(C,null))})):(n.push(XlA()),r=[]),n.length)throw $lA(n);s.forEach((l,I)=>{l.forEach((C,d)=>{l.set(d,this._driver.computeStyle(I,d,kc))})});let a=r.map(l=>{let I=s.get(l.element);return this._buildPlayer(l,new Map,I)}),c=c2(a);return this._playersById.set(e,c),c.onDestroy(()=>this.destroy(e)),this.players.push(c),c}destroy(e){let A=this._getPlayer(e);A.destroy(),this._playersById.delete(e);let i=this.players.indexOf(A);i>=0&&this.players.splice(i,1)}_getPlayer(e){let A=this._playersById.get(e);if(!A)throw AgA(e);return A}listen(e,A,i,n){let o=Q7(A,"","","");return E7(this._getPlayer(e),i,o,n),()=>{}}command(e,A,i,n){if(i=="register"){this.register(e,n[0]);return}if(i=="create"){let r=n[0]||{};this.create(e,A,r);return}let o=this._getPlayer(e);switch(i){case"play":o.play();break;case"pause":o.pause();break;case"reset":o.reset();break;case"restart":o.restart();break;case"finish":o.finish();break;case"init":o.init();break;case"setPosition":o.setPosition(parseFloat(n[0]));break;case"destroy":this.destroy(e);break}}},QgA="ng-animate-queued",NVA=".ng-animate-queued",MU="ng-animate-disabled",_VA=".ng-animate-disabled",GVA="ng-star-inserted",UVA=".ng-star-inserted",KVA=[],vgA={namespaceId:"",setForRemoval:!1,setForMove:!1,hasAnimation:!1,removedBeforeQueried:!1},YVA={namespaceId:"",setForMove:!1,setForRemoval:!1,hasAnimation:!1,removedBeforeQueried:!0},Tl="__ng_removed",Yf=class{namespaceId;value;options;get params(){return this.options.params}constructor(e,A=""){this.namespaceId=A;let i=e&&e.hasOwnProperty("value"),n=i?e.value:e;if(this.value=TVA(n),i){let o=e,{value:r}=o,s=J7(o,["value"]);this.options=s}else this.options={};this.options.params||(this.options.params={})}absorbOptions(e){let A=e.params;if(A){let i=this.options.params;Object.keys(A).forEach(n=>{i[n]==null&&(i[n]=A[n])})}}},Uf="void",kU=new Yf(Uf),KU=class{id;hostElement;_engine;players=[];_triggers=new Map;_queue=[];_elementListeners=new Map;_hostClassName;constructor(e,A,i){this.id=e,this.hostElement=A,this._engine=i,this._hostClassName="ng-tns-"+e,Zc(A,this._hostClassName)}listen(e,A,i,n){if(!this._triggers.has(A))throw egA(i,A);if(i==null||i.length==0)throw tgA(A);if(!HVA(i))throw igA(i,A);let o=Ya(this._elementListeners,e,[]),r={name:A,phase:i,callback:n};o.push(r);let s=Ya(this._engine.statesByElement,e,new Map);return s.has(A)||(Zc(e,Nf),Zc(e,Nf+"-"+A),s.set(A,kU)),()=>{this._engine.afterFlush(()=>{let a=o.indexOf(r);a>=0&&o.splice(a,1),this._triggers.has(A)||s.delete(A)})}}register(e,A){return this._triggers.has(e)?!1:(this._triggers.set(e,A),!0)}_getTrigger(e){let A=this._triggers.get(e);if(!A)throw ngA(e);return A}trigger(e,A,i,n=!0){let o=this._getTrigger(A),r=new Jf(this.id,A,e),s=this._engine.statesByElement.get(e);s||(Zc(e,Nf),Zc(e,Nf+"-"+A),this._engine.statesByElement.set(e,s=new Map));let a=s.get(A),c=new Yf(i,this.id);if(!(i&&i.hasOwnProperty("value"))&&a&&c.absorbOptions(a.options),s.set(A,c),a||(a=kU),!(c.value===Uf)&&a.value===c.value){if(!PVA(a.params,c.params)){let E=[],h=o.matchStyles(a.value,a.params,E),u=o.matchStyles(c.value,c.params,E);E.length?this._engine.reportError(E):this._engine.afterFlush(()=>{rI(e,h),Jl(e,u)})}return}let C=Ya(this._engine.playersByElement,e,[]);C.forEach(E=>{E.namespaceId==this.id&&E.triggerName==A&&E.queued&&E.destroy()});let d=o.matchTransition(a.value,c.value,e,c.params),B=!1;if(!d){if(!n)return;d=o.fallbackTransition,B=!0}return this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:A,transition:d,fromState:a,toState:c,player:r,isFallbackTransition:B}),B||(Zc(e,QgA),r.onStart(()=>{KQ(e,QgA)})),r.onDone(()=>{let E=this.players.indexOf(r);E>=0&&this.players.splice(E,1);let h=this._engine.playersByElement.get(e);if(h){let u=h.indexOf(r);u>=0&&h.splice(u,1)}}),this.players.push(r),C.push(r),r}deregister(e){this._triggers.delete(e),this._engine.statesByElement.forEach(A=>A.delete(e)),this._elementListeners.forEach((A,i)=>{this._elementListeners.set(i,A.filter(n=>n.name!=e))})}clearElementCache(e){this._engine.statesByElement.delete(e),this._elementListeners.delete(e);let A=this._engine.playersByElement.get(e);A&&(A.forEach(i=>i.destroy()),this._engine.playersByElement.delete(e))}_signalRemovalForInnerTriggers(e,A){let i=this._engine.driver.query(e,_f,!0);i.forEach(n=>{if(n[Tl])return;let o=this._engine.fetchNamespacesByElement(n);o.size?o.forEach(r=>r.triggerLeaveAnimation(n,A,!1,!0)):this.clearElementCache(n)}),this._engine.afterFlushAnimationsDone(()=>i.forEach(n=>this.clearElementCache(n)))}triggerLeaveAnimation(e,A,i,n){let o=this._engine.statesByElement.get(e),r=new Map;if(o){let s=[];if(o.forEach((a,c)=>{if(r.set(c,a.value),this._triggers.has(c)){let l=this.trigger(e,c,Uf,n);l&&s.push(l)}}),s.length)return this._engine.markElementAsRemoved(this.id,e,!0,A,r),i&&c2(s).onDone(()=>this._engine.processLeaveNode(e)),!0}return!1}prepareLeaveAnimationListeners(e){let A=this._elementListeners.get(e),i=this._engine.statesByElement.get(e);if(A&&i){let n=new Set;A.forEach(o=>{let r=o.name;if(n.has(r))return;n.add(r);let a=this._triggers.get(r).fallbackTransition,c=i.get(r)||kU,l=new Yf(Uf),I=new Jf(this.id,r,e);this._engine.totalQueuedPlayers++,this._queue.push({element:e,triggerName:r,transition:a,fromState:c,toState:l,player:I,isFallbackTransition:!0})})}}removeNode(e,A){let i=this._engine;if(e.childElementCount&&this._signalRemovalForInnerTriggers(e,A),this.triggerLeaveAnimation(e,A,!0))return;let n=!1;if(i.totalAnimations){let o=i.players.length?i.playersByQueriedElement.get(e):[];if(o&&o.length)n=!0;else{let r=e;for(;r=r.parentNode;)if(i.statesByElement.get(r)){n=!0;break}}}if(this.prepareLeaveAnimationListeners(e),n)i.markElementAsRemoved(this.id,e,!1,A);else{let o=e[Tl];(!o||o===vgA)&&(i.afterFlush(()=>this.clearElementCache(e)),i.destroyInnerAnimations(e),i._onRemovalComplete(e,A))}}insertNode(e,A){Zc(e,this._hostClassName)}drainQueuedTransitions(e){let A=[];return this._queue.forEach(i=>{let n=i.player;if(n.destroyed)return;let o=i.element,r=this._elementListeners.get(o);r&&r.forEach(s=>{if(s.name==i.triggerName){let a=Q7(o,i.triggerName,i.fromState.value,i.toState.value);a._data=e,E7(i.player,s.phase,a,s.callback)}}),n.markedForDestroy?this._engine.afterFlush(()=>{n.destroy()}):A.push(i)}),this._queue=[],A.sort((i,n)=>{let o=i.transition.ast.depCount,r=n.transition.ast.depCount;return o==0||r==0?o-r:this._engine.driver.containsElement(i.element,n.element)?1:-1})}destroy(e){this.players.forEach(A=>A.destroy()),this._signalRemovalForInnerTriggers(this.hostElement,e)}},YU=class{bodyNode;driver;_normalizer;players=[];newHostElements=new Map;playersByElement=new Map;playersByQueriedElement=new Map;statesByElement=new Map;disabledNodes=new Set;totalAnimations=0;totalQueuedPlayers=0;_namespaceLookup={};_namespaceList=[];_flushFns=[];_whenQuietFns=[];namespacesByHostElement=new Map;collectedEnterElements=[];collectedLeaveElements=[];onRemovalComplete=(e,A)=>{};_onRemovalComplete(e,A){this.onRemovalComplete(e,A)}constructor(e,A,i){this.bodyNode=e,this.driver=A,this._normalizer=i}get queuedPlayers(){let e=[];return this._namespaceList.forEach(A=>{A.players.forEach(i=>{i.queued&&e.push(i)})}),e}createNamespace(e,A){let i=new KU(e,A,this);return this.bodyNode&&this.driver.containsElement(this.bodyNode,A)?this._balanceNamespaceList(i,A):(this.newHostElements.set(A,i),this.collectEnterElement(A)),this._namespaceLookup[e]=i}_balanceNamespaceList(e,A){let i=this._namespaceList,n=this.namespacesByHostElement;if(i.length-1>=0){let r=!1,s=this.driver.getParentElement(A);for(;s;){let a=n.get(s);if(a){let c=i.indexOf(a);i.splice(c+1,0,e),r=!0;break}s=this.driver.getParentElement(s)}r||i.unshift(e)}else i.push(e);return n.set(A,e),e}register(e,A){let i=this._namespaceLookup[e];return i||(i=this.createNamespace(e,A)),i}registerTrigger(e,A,i){let n=this._namespaceLookup[e];n&&n.register(A,i)&&this.totalAnimations++}destroy(e,A){e&&(this.afterFlush(()=>{}),this.afterFlushAnimationsDone(()=>{let i=this._fetchNamespace(e);this.namespacesByHostElement.delete(i.hostElement);let n=this._namespaceList.indexOf(i);n>=0&&this._namespaceList.splice(n,1),i.destroy(A),delete this._namespaceLookup[e]}))}_fetchNamespace(e){return this._namespaceLookup[e]}fetchNamespacesByElement(e){let A=new Set,i=this.statesByElement.get(e);if(i){for(let n of i.values())if(n.namespaceId){let o=this._fetchNamespace(n.namespaceId);o&&A.add(o)}}return A}trigger(e,A,i,n){if(y7(A)){let o=this._fetchNamespace(e);if(o)return o.trigger(A,i,n),!0}return!1}insertNode(e,A,i,n){if(!y7(A))return;let o=A[Tl];if(o&&o.setForRemoval){o.setForRemoval=!1,o.setForMove=!0;let r=this.collectedLeaveElements.indexOf(A);r>=0&&this.collectedLeaveElements.splice(r,1)}if(e){let r=this._fetchNamespace(e);r&&r.insertNode(A,i)}n&&this.collectEnterElement(A)}collectEnterElement(e){this.collectedEnterElements.push(e)}markElementAsDisabled(e,A){A?this.disabledNodes.has(e)||(this.disabledNodes.add(e),Zc(e,MU)):this.disabledNodes.has(e)&&(this.disabledNodes.delete(e),KQ(e,MU))}removeNode(e,A,i){if(y7(A)){let n=e?this._fetchNamespace(e):null;n?n.removeNode(A,i):this.markElementAsRemoved(e,A,!1,i);let o=this.namespacesByHostElement.get(A);o&&o.id!==e&&o.removeNode(A,i)}else this._onRemovalComplete(A,i)}markElementAsRemoved(e,A,i,n,o){this.collectedLeaveElements.push(A),A[Tl]={namespaceId:e,setForRemoval:n,hasAnimation:i,removedBeforeQueried:!1,previousTriggersValues:o}}listen(e,A,i,n,o){return y7(A)?this._fetchNamespace(e).listen(A,i,n,o):()=>{}}_buildInstruction(e,A,i,n,o){return e.transition.build(this.driver,e.element,e.fromState.value,e.toState.value,i,n,e.fromState.options,e.toState.options,A,o)}destroyInnerAnimations(e){let A=this.driver.query(e,_f,!0);A.forEach(i=>this.destroyActiveAnimationsForElement(i)),this.playersByQueriedElement.size!=0&&(A=this.driver.query(e,f7,!0),A.forEach(i=>this.finishActiveQueriedAnimationOnElement(i)))}destroyActiveAnimationsForElement(e){let A=this.playersByElement.get(e);A&&A.forEach(i=>{i.queued?i.markedForDestroy=!0:i.destroy()})}finishActiveQueriedAnimationOnElement(e){let A=this.playersByQueriedElement.get(e);A&&A.forEach(i=>i.finish())}whenRenderingDone(){return new Promise(e=>{if(this.players.length)return c2(this.players).onDone(()=>e());e()})}processLeaveNode(e){let A=e[Tl];if(A&&A.setForRemoval){if(e[Tl]=vgA,A.namespaceId){this.destroyInnerAnimations(e);let i=this._fetchNamespace(A.namespaceId);i&&i.clearElementCache(e)}this._onRemovalComplete(e,A.setForRemoval)}e.classList?.contains(MU)&&this.markElementAsDisabled(e,!1),this.driver.query(e,_VA,!0).forEach(i=>{this.markElementAsDisabled(i,!1)})}flush(e=-1){let A=[];if(this.newHostElements.size&&(this.newHostElements.forEach((i,n)=>this._balanceNamespaceList(i,n)),this.newHostElements.clear()),this.totalAnimations&&this.collectedEnterElements.length)for(let i=0;ii()),this._flushFns=[],this._whenQuietFns.length){let i=this._whenQuietFns;this._whenQuietFns=[],A.length?c2(A).onDone(()=>{i.forEach(n=>n())}):i.forEach(n=>n())}}reportError(e){throw ogA(e)}_flushAnimations(e,A){let i=new Kf,n=[],o=new Map,r=[],s=new Map,a=new Map,c=new Map,l=new Set;this.disabledNodes.forEach(lA=>{l.add(lA);let vA=this.driver.query(lA,NVA,!0);for(let tA=0;tA{let tA=wU+E++;B.set(vA,tA),lA.forEach(cA=>Zc(cA,tA))});let h=[],u=new Set,D=new Set;for(let lA=0;lAu.add(cA)):D.add(vA))}let L=new Map,R=fgA(C,Array.from(u));R.forEach((lA,vA)=>{let tA=u7+E++;L.set(vA,tA),lA.forEach(cA=>Zc(cA,tA))}),e.push(()=>{d.forEach((lA,vA)=>{let tA=B.get(vA);lA.forEach(cA=>KQ(cA,tA))}),R.forEach((lA,vA)=>{let tA=L.get(vA);lA.forEach(cA=>KQ(cA,tA))}),h.forEach(lA=>{this.processLeaveNode(lA)})});let w=[],_=[];for(let lA=this._namespaceList.length-1;lA>=0;lA--)this._namespaceList[lA].drainQueuedTransitions(A).forEach(tA=>{let cA=tA.player,pA=tA.element;if(w.push(cA),this.collectedEnterElements.length){let He=pA[Tl];if(He&&He.setForMove){if(He.previousTriggersValues&&He.previousTriggersValues.has(tA.triggerName)){let uA=He.previousTriggersValues.get(tA.triggerName),eA=this.statesByElement.get(tA.element);if(eA&&eA.has(tA.triggerName)){let UA=eA.get(tA.triggerName);UA.value=uA,eA.set(tA.triggerName,UA)}}cA.destroy();return}}let VA=!I||!this.driver.containsElement(I,pA),oe=L.get(pA),KA=B.get(pA),CA=this._buildInstruction(tA,i,KA,oe,VA);if(CA.errors&&CA.errors.length){_.push(CA);return}if(VA){cA.onStart(()=>rI(pA,CA.fromStyles)),cA.onDestroy(()=>Jl(pA,CA.toStyles)),n.push(cA);return}if(tA.isFallbackTransition){cA.onStart(()=>rI(pA,CA.fromStyles)),cA.onDestroy(()=>Jl(pA,CA.toStyles)),n.push(cA);return}let TA=[];CA.timelines.forEach(He=>{He.stretchStartingKeyframe=!0,this.disabledNodes.has(He.element)||TA.push(He)}),CA.timelines=TA,i.append(pA,CA.timelines);let Ze={instruction:CA,player:cA,element:pA};r.push(Ze),CA.queriedElements.forEach(He=>Ya(s,He,[]).push(cA)),CA.preStyleProps.forEach((He,uA)=>{if(He.size){let eA=a.get(uA);eA||a.set(uA,eA=new Set),He.forEach((UA,aA)=>eA.add(aA))}}),CA.postStyleProps.forEach((He,uA)=>{let eA=c.get(uA);eA||c.set(uA,eA=new Set),He.forEach((UA,aA)=>eA.add(aA))})});if(_.length){let lA=[];_.forEach(vA=>{lA.push(rgA(vA.triggerName,vA.errors))}),w.forEach(vA=>vA.destroy()),this.reportError(lA)}let K=new Map,z=new Map;r.forEach(lA=>{let vA=lA.element;i.has(vA)&&(z.set(vA,vA),this._beforeAnimationBuild(lA.player.namespaceId,lA.instruction,K))}),n.forEach(lA=>{let vA=lA.element;this._getPreviousPlayers(vA,!1,lA.namespaceId,lA.triggerName,null).forEach(cA=>{Ya(K,vA,[]).push(cA),cA.destroy()})});let U=h.filter(lA=>mgA(lA,a,c)),H=new Map;ugA(H,this.driver,D,c,kc).forEach(lA=>{mgA(lA,a,c)&&U.push(lA)});let j=new Map;d.forEach((lA,vA)=>{ugA(j,this.driver,new Set(lA),a,FB)}),U.forEach(lA=>{let vA=H.get(lA),tA=j.get(lA);H.set(lA,new Map([...vA?.entries()??[],...tA?.entries()??[]]))});let gA=[],QA=[],BA={};r.forEach(lA=>{let{element:vA,player:tA,instruction:cA}=lA;if(i.has(vA)){if(l.has(vA)){tA.onDestroy(()=>Jl(vA,cA.toStyles)),tA.disabled=!0,tA.overrideTotalTime(cA.totalTime),n.push(tA);return}let pA=BA;if(z.size>1){let oe=vA,KA=[];for(;oe=oe.parentNode;){let CA=z.get(oe);if(CA){pA=CA;break}KA.push(oe)}KA.forEach(CA=>z.set(CA,pA))}let VA=this._buildAnimation(tA.namespaceId,cA,K,o,j,H);if(tA.setRealPlayer(VA),pA===BA)gA.push(tA);else{let oe=this.playersByElement.get(pA);oe&&oe.length&&(tA.parentPlayer=c2(oe)),n.push(tA)}}else rI(vA,cA.fromStyles),tA.onDestroy(()=>Jl(vA,cA.toStyles)),QA.push(tA),l.has(vA)&&n.push(tA)}),QA.forEach(lA=>{let vA=o.get(lA.element);if(vA&&vA.length){let tA=c2(vA);lA.setRealPlayer(tA)}}),n.forEach(lA=>{lA.parentPlayer?lA.syncPlayerEvents(lA.parentPlayer):lA.destroy()});for(let lA=0;lA!VA.destroyed);pA.length?zVA(this,vA,pA):this.processLeaveNode(vA)}return h.length=0,gA.forEach(lA=>{this.players.push(lA),lA.onDone(()=>{lA.destroy();let vA=this.players.indexOf(lA);this.players.splice(vA,1)}),lA.play()}),gA}afterFlush(e){this._flushFns.push(e)}afterFlushAnimationsDone(e){this._whenQuietFns.push(e)}_getPreviousPlayers(e,A,i,n,o){let r=[];if(A){let s=this.playersByQueriedElement.get(e);s&&(r=s)}else{let s=this.playersByElement.get(e);if(s){let a=!o||o==Uf;s.forEach(c=>{c.queued||!a&&c.triggerName!=n||r.push(c)})}}return(i||n)&&(r=r.filter(s=>!(i&&i!=s.namespaceId||n&&n!=s.triggerName))),r}_beforeAnimationBuild(e,A,i){let n=A.triggerName,o=A.element,r=A.isRemovalTransition?void 0:e,s=A.isRemovalTransition?void 0:n;for(let a of A.timelines){let c=a.element,l=c!==o,I=Ya(i,c,[]);this._getPreviousPlayers(c,l,r,s,A.toState).forEach(d=>{let B=d.getRealPlayer();B.beforeDestroy&&B.beforeDestroy(),d.destroy(),I.push(d)})}rI(o,A.fromStyles)}_buildAnimation(e,A,i,n,o,r){let s=A.triggerName,a=A.element,c=[],l=new Set,I=new Set,C=A.timelines.map(B=>{let E=B.element;l.add(E);let h=E[Tl];if(h&&h.removedBeforeQueried)return new Eg(B.duration,B.delay);let u=E!==a,D=OVA((i.get(E)||KVA).map(K=>K.getRealPlayer())).filter(K=>{let z=K;return z.element?z.element===E:!1}),L=o.get(E),R=r.get(E),w=hU(this._normalizer,B.keyframes,L,R),_=this._buildPlayer(B,w,D);if(B.subTimeline&&n&&I.add(E),u){let K=new Jf(e,s,E);K.setRealPlayer(_),c.push(K)}return _});c.forEach(B=>{Ya(this.playersByQueriedElement,B.element,[]).push(B),B.onDone(()=>JVA(this.playersByQueriedElement,B.element,B))}),l.forEach(B=>Zc(B,DU));let d=c2(C);return d.onDestroy(()=>{l.forEach(B=>KQ(B,DU)),Jl(a,A.toStyles)}),I.forEach(B=>{Ya(n,B,[]).push(d)}),d}_buildPlayer(e,A,i){return A.length>0?this.driver.animate(e.element,A,e.duration,e.delay,e.easing,i):new Eg(e.duration,e.delay)}},Jf=class{namespaceId;triggerName;element;_player=new Eg;_containsRealPlayer=!1;_queuedCallbacks=new Map;destroyed=!1;parentPlayer=null;markedForDestroy=!1;disabled=!1;queued=!0;totalTime=0;constructor(e,A,i){this.namespaceId=e,this.triggerName=A,this.element=i}setRealPlayer(e){this._containsRealPlayer||(this._player=e,this._queuedCallbacks.forEach((A,i)=>{A.forEach(n=>E7(e,i,void 0,n))}),this._queuedCallbacks.clear(),this._containsRealPlayer=!0,this.overrideTotalTime(e.totalTime),this.queued=!1)}getRealPlayer(){return this._player}overrideTotalTime(e){this.totalTime=e}syncPlayerEvents(e){let A=this._player;A.triggerCallback&&e.onStart(()=>A.triggerCallback("start")),e.onDone(()=>this.finish()),e.onDestroy(()=>this.destroy())}_queueEvent(e,A){Ya(this._queuedCallbacks,e,[]).push(A)}onDone(e){this.queued&&this._queueEvent("done",e),this._player.onDone(e)}onStart(e){this.queued&&this._queueEvent("start",e),this._player.onStart(e)}onDestroy(e){this.queued&&this._queueEvent("destroy",e),this._player.onDestroy(e)}init(){this._player.init()}hasStarted(){return this.queued?!1:this._player.hasStarted()}play(){!this.queued&&this._player.play()}pause(){!this.queued&&this._player.pause()}restart(){!this.queued&&this._player.restart()}finish(){this._player.finish()}destroy(){this.destroyed=!0,this._player.destroy()}reset(){!this.queued&&this._player.reset()}setPosition(e){this.queued||this._player.setPosition(e)}getPosition(){return this.queued?0:this._player.getPosition()}triggerCallback(e){let A=this._player;A.triggerCallback&&A.triggerCallback(e)}};function JVA(t,e,A){let i=t.get(e);if(i){if(i.length){let n=i.indexOf(A);i.splice(n,1)}i.length==0&&t.delete(e)}return i}function TVA(t){return t??null}function y7(t){return t&&t.nodeType===1}function HVA(t){return t=="start"||t=="done"}function hgA(t,e){let A=t.style.display;return t.style.display=e??"none",A}function ugA(t,e,A,i,n){let o=[];A.forEach(a=>o.push(hgA(a)));let r=[];i.forEach((a,c)=>{let l=new Map;a.forEach(I=>{let C=e.computeStyle(c,I,n);l.set(I,C),(!C||C.length==0)&&(c[Tl]=YVA,r.push(c))}),t.set(c,l)});let s=0;return A.forEach(a=>hgA(a,o[s++])),r}function fgA(t,e){let A=new Map;if(t.forEach(s=>A.set(s,[])),e.length==0)return A;let i=1,n=new Set(e),o=new Map;function r(s){if(!s)return i;let a=o.get(s);if(a)return a;let c=s.parentNode;return A.has(c)?a=c:n.has(c)?a=i:a=r(c),o.set(s,a),a}return e.forEach(s=>{let a=r(s);a!==i&&A.get(a).push(s)}),A}function Zc(t,e){t.classList?.add(e)}function KQ(t,e){t.classList?.remove(e)}function zVA(t,e,A){c2(A).onDone(()=>t.processLeaveNode(e))}function OVA(t){let e=[];return bgA(t,e),e}function bgA(t,e){for(let A=0;An.add(o)):e.set(t,i),A.delete(t),!0}var YQ=class{_driver;_normalizer;_transitionEngine;_timelineEngine;_triggerCache={};onRemovalComplete=(e,A)=>{};constructor(e,A,i){this._driver=A,this._normalizer=i,this._transitionEngine=new YU(e.body,A,i),this._timelineEngine=new UU(e.body,A,i),this._transitionEngine.onRemovalComplete=(n,o)=>this.onRemovalComplete(n,o)}registerTrigger(e,A,i,n,o){let r=e+"-"+n,s=this._triggerCache[r];if(!s){let a=[],c=[],l=wgA(this._driver,o,a,c);if(a.length)throw ZlA(n,a);s=xVA(n,l,this._normalizer),this._triggerCache[r]=s}this._transitionEngine.registerTrigger(A,n,s)}register(e,A){this._transitionEngine.register(e,A)}destroy(e,A){this._transitionEngine.destroy(e,A)}onInsert(e,A,i,n){this._transitionEngine.insertNode(e,A,i,n)}onRemove(e,A,i){this._transitionEngine.removeNode(e,A,i)}disableAnimations(e,A){this._transitionEngine.markElementAsDisabled(e,A)}process(e,A,i,n){if(i.charAt(0)=="@"){let[o,r]=uU(i),s=n;this._timelineEngine.command(o,A,r,s)}else this._transitionEngine.trigger(e,A,i,n)}listen(e,A,i,n,o){if(i.charAt(0)=="@"){let[r,s]=uU(i);return this._timelineEngine.listen(r,A,s,o)}return this._transitionEngine.listen(e,A,i,n,o)}flush(e=-1){this._transitionEngine.flush(e)}get players(){return[...this._transitionEngine.players,...this._timelineEngine.players]}whenRenderingDone(){return this._transitionEngine.whenRenderingDone()}afterFlushAnimationsDone(e){this._transitionEngine.afterFlushAnimationsDone(e)}};function jVA(t,e){let A=null,i=null;return Array.isArray(e)&&e.length?(A=SU(e[0]),e.length>1&&(i=SU(e[e.length-1]))):e instanceof Map&&(A=SU(e)),A||i?new qVA(t,A,i):null}var qVA=(()=>{class t{_element;_startStyles;_endStyles;static initialStylesByElement=new WeakMap;_state=0;_initialStyles;constructor(A,i,n){this._element=A,this._startStyles=i,this._endStyles=n;let o=t.initialStylesByElement.get(A);o||t.initialStylesByElement.set(A,o=new Map),this._initialStyles=o}start(){this._state<1&&(this._startStyles&&Jl(this._element,this._startStyles,this._initialStyles),this._state=1)}finish(){this.start(),this._state<2&&(Jl(this._element,this._initialStyles),this._endStyles&&(Jl(this._element,this._endStyles),this._endStyles=null),this._state=1)}destroy(){this.finish(),this._state<3&&(t.initialStylesByElement.delete(this._element),this._startStyles&&(rI(this._element,this._startStyles),this._endStyles=null),this._endStyles&&(rI(this._element,this._endStyles),this._endStyles=null),Jl(this._element,this._initialStyles),this._state=3)}}return t})();function SU(t){let e=null;return t.forEach((A,i)=>{VVA(i)&&(e=e||new Map,e.set(i,A))}),e}function VVA(t){return t==="display"||t==="position"}var x7=class{element;keyframes;options;_specialStyles;_onDoneFns=[];_onStartFns=[];_onDestroyFns=[];_duration;_delay;_initialized=!1;_finished=!1;_started=!1;_destroyed=!1;_finalKeyframe;_originalOnDoneFns=[];_originalOnStartFns=[];domPlayer;time=0;parentPlayer=null;currentSnapshot=new Map;constructor(e,A,i,n){this.element=e,this.keyframes=A,this.options=i,this._specialStyles=n,this._duration=i.duration,this._delay=i.delay||0,this.time=this._duration+this._delay}_onFinish(){this._finished||(this._finished=!0,this._onDoneFns.forEach(e=>e()),this._onDoneFns=[])}init(){this._buildPlayer(),this._preparePlayerBeforeStart()}_buildPlayer(){if(this._initialized)return;this._initialized=!0;let e=this.keyframes;this.domPlayer=this._triggerWebAnimation(this.element,e,this.options),this._finalKeyframe=e.length?e[e.length-1]:new Map;let A=()=>this._onFinish();this.domPlayer.addEventListener("finish",A),this.onDestroy(()=>{this.domPlayer.removeEventListener("finish",A)})}_preparePlayerBeforeStart(){this._delay?this._resetDomPlayerState():this.domPlayer.pause()}_convertKeyframesToObject(e){let A=[];return e.forEach(i=>{A.push(Object.fromEntries(i))}),A}_triggerWebAnimation(e,A,i){return e.animate(this._convertKeyframesToObject(A),i)}onStart(e){this._originalOnStartFns.push(e),this._onStartFns.push(e)}onDone(e){this._originalOnDoneFns.push(e),this._onDoneFns.push(e)}onDestroy(e){this._onDestroyFns.push(e)}play(){this._buildPlayer(),this.hasStarted()||(this._onStartFns.forEach(e=>e()),this._onStartFns=[],this._started=!0,this._specialStyles&&this._specialStyles.start()),this.domPlayer.play()}pause(){this.init(),this.domPlayer.pause()}finish(){this.init(),this._specialStyles&&this._specialStyles.finish(),this._onFinish(),this.domPlayer.finish()}reset(){this._resetDomPlayerState(),this._destroyed=!1,this._finished=!1,this._started=!1,this._onStartFns=this._originalOnStartFns,this._onDoneFns=this._originalOnDoneFns}_resetDomPlayerState(){this.domPlayer&&this.domPlayer.cancel()}restart(){this.reset(),this.play()}hasStarted(){return this._started}destroy(){this._destroyed||(this._destroyed=!0,this._resetDomPlayerState(),this._onFinish(),this._specialStyles&&this._specialStyles.destroy(),this._onDestroyFns.forEach(e=>e()),this._onDestroyFns=[])}setPosition(e){this.domPlayer===void 0&&this.init(),this.domPlayer.currentTime=e*this.time}getPosition(){return+(this.domPlayer.currentTime??0)/this.time}get totalTime(){return this._delay+this._duration}beforeDestroy(){let e=new Map;this.hasStarted()&&this._finalKeyframe.forEach((i,n)=>{n!=="offset"&&e.set(n,this._finished?i:p7(this.element,n))}),this.currentSnapshot=e}triggerCallback(e){let A=e==="start"?this._onStartFns:this._onDoneFns;A.forEach(i=>i()),A.length=0}},L7=class{validateStyleProperty(e){return!0}validateAnimatableStyleProperty(e){return!0}containsElement(e,A){return fU(e,A)}getParentElement(e){return h7(e)}query(e,A,i){return mU(e,A,i)}computeStyle(e,A,i){return p7(e,A)}animate(e,A,i,n,o,r=[]){let s=n==0?"both":"forwards",a={duration:i,delay:n,fill:s};o&&(a.easing=o);let c=new Map,l=r.filter(d=>d instanceof x7);lgA(i,n)&&l.forEach(d=>{d.currentSnapshot.forEach((B,E)=>c.set(E,B))});let I=agA(A).map(d=>new Map(d));I=ggA(e,I,c);let C=jVA(e,I);return new x7(e,I,a,C)}};var v7="@",MgA="@.disabled",F7=class{namespaceId;delegate;engine;_onDestroy;\u0275type=0;constructor(e,A,i,n){this.namespaceId=e,this.delegate=A,this.engine=i,this._onDestroy=n}get data(){return this.delegate.data}destroyNode(e){this.delegate.destroyNode?.(e)}destroy(){this.engine.destroy(this.namespaceId,this.delegate),this.engine.afterFlushAnimationsDone(()=>{queueMicrotask(()=>{this.delegate.destroy()})}),this._onDestroy?.()}createElement(e,A){return this.delegate.createElement(e,A)}createComment(e){return this.delegate.createComment(e)}createText(e){return this.delegate.createText(e)}appendChild(e,A){this.delegate.appendChild(e,A),this.engine.onInsert(this.namespaceId,A,e,!1)}insertBefore(e,A,i,n=!0){this.delegate.insertBefore(e,A,i),this.engine.onInsert(this.namespaceId,A,e,n)}removeChild(e,A,i){this.parentNode(A)&&this.engine.onRemove(this.namespaceId,A,this.delegate)}selectRootElement(e,A){return this.delegate.selectRootElement(e,A)}parentNode(e){return this.delegate.parentNode(e)}nextSibling(e){return this.delegate.nextSibling(e)}setAttribute(e,A,i,n){this.delegate.setAttribute(e,A,i,n)}removeAttribute(e,A,i){this.delegate.removeAttribute(e,A,i)}addClass(e,A){this.delegate.addClass(e,A)}removeClass(e,A){this.delegate.removeClass(e,A)}setStyle(e,A,i,n){this.delegate.setStyle(e,A,i,n)}removeStyle(e,A,i){this.delegate.removeStyle(e,A,i)}setProperty(e,A,i){A.charAt(0)==v7&&A==MgA?this.disableAnimations(e,!!i):this.delegate.setProperty(e,A,i)}setValue(e,A){this.delegate.setValue(e,A)}listen(e,A,i,n){return this.delegate.listen(e,A,i,n)}disableAnimations(e,A){this.engine.disableAnimations(e,A)}},JU=class extends F7{factory;constructor(e,A,i,n,o){super(A,i,n,o),this.factory=e,this.namespaceId=A}setProperty(e,A,i){A.charAt(0)==v7?A.charAt(1)=="."&&A==MgA?(i=i===void 0?!0:!!i,this.disableAnimations(e,i)):this.engine.process(this.namespaceId,e,A.slice(1),i):this.delegate.setProperty(e,A,i)}listen(e,A,i,n){if(A.charAt(0)==v7){let o=ZVA(e),r=A.slice(1),s="";return r.charAt(0)!=v7&&([r,s]=WVA(r)),this.engine.listen(this.namespaceId,o,r,s,a=>{let c=a._data||-1;this.factory.scheduleListenerCallback(c,i,a)})}return this.delegate.listen(e,A,i,n)}};function ZVA(t){switch(t){case"body":return document.body;case"document":return document;case"window":return window;default:return t}}function WVA(t){let e=t.indexOf("."),A=t.substring(0,e),i=t.slice(e+1);return[A,i]}var N7=class{delegate;engine;_zone;_currentId=0;_microtaskId=1;_animationCallbacksBuffer=[];_rendererCache=new Map;_cdRecurDepth=0;constructor(e,A,i){this.delegate=e,this.engine=A,this._zone=i,A.onRemovalComplete=(n,o)=>{o?.removeChild(null,n)}}createRenderer(e,A){let i="",n=this.delegate.createRenderer(e,A);if(!e||!A?.data?.animation){let c=this._rendererCache,l=c.get(n);if(!l){let I=()=>c.delete(n);l=new F7(i,n,this.engine,I),c.set(n,l)}return l}let o=A.id,r=A.id+"-"+this._currentId;this._currentId++,this.engine.register(r,e);let s=c=>{Array.isArray(c)?c.forEach(s):this.engine.registerTrigger(o,r,e,c.name,c)};return A.data.animation.forEach(s),new JU(this,r,n,this.engine)}begin(){this._cdRecurDepth++,this.delegate.begin&&this.delegate.begin()}_scheduleCountTask(){queueMicrotask(()=>{this._microtaskId++})}scheduleListenerCallback(e,A,i){if(e>=0&&eA(i));return}let n=this._animationCallbacksBuffer;n.length==0&&queueMicrotask(()=>{this._zone.run(()=>{n.forEach(o=>{let[r,s]=o;r(s)}),this._animationCallbacksBuffer=[]})}),n.push([A,i])}end(){this._cdRecurDepth--,this._cdRecurDepth==0&&this._zone.runOutsideAngular(()=>{this._scheduleCountTask(),this.engine.flush(this._microtaskId)}),this.delegate.end&&this.delegate.end()}whenRenderingDone(){return this.engine.whenRenderingDone()}componentReplaced(e){this.engine.flush(),this.delegate.componentReplaced?.(e)}};var $VA=(()=>{class t extends YQ{constructor(A,i,n){super(A,i,n)}ngOnDestroy(){this.flush()}static \u0275fac=function(i){return new(i||t)(we(at),we(ld),we(gd))};static \u0275prov=NA({token:t,factory:t.\u0275fac})}return t})();function AZA(){return new b7}function eZA(t,e,A){return new N7(t,e,A)}var SgA=[{provide:gd,useFactory:AZA},{provide:YQ,useClass:$VA},{provide:ws,useFactory:eZA,deps:[jh,YQ,Qe]}],tZA=[{provide:ld,useClass:TU},{provide:Si,useValue:"NoopAnimations"},...SgA],kgA=[{provide:ld,useFactory:()=>new L7},{provide:Si,useFactory:()=>"BrowserAnimations"},...SgA],_7=(()=>{class t{static withConfig(A){return{ngModule:t,providers:A.disableAnimations?tZA:kgA}}static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({providers:kgA,imports:[Vh]})}return t})();var iZA=new dA("mat-chips-default-options",{providedIn:"root",factory:()=>({separatorKeyCodes:[13]})});var RgA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({providers:[bB,{provide:iZA,useValue:{separatorKeyCodes:[13]}}],imports:[it,Ps,it]})}return t})();var nZA=["input"],oZA=["formField"],rZA=["*"],zU=class{source;value;constructor(e,A){this.source=e,this.value=A}};var sZA=new dA("MatRadioGroup"),aZA=new dA("mat-radio-default-options",{providedIn:"root",factory:cZA});function cZA(){return{color:"accent",disabledInteractive:!1}}var lZA=(()=>{class t{_elementRef=f(ee);_changeDetector=f(It);_focusMonitor=f(dr);_radioDispatcher=f(xB);_defaultOptions=f(aZA,{optional:!0});_ngZone=f(Qe);_renderer=f(Wi);_uniqueId=f(sn).getId("mat-radio-");_cleanupClick;id=this._uniqueId;name;ariaLabel;ariaLabelledby;ariaDescribedby;disableRipple=!1;tabIndex=0;get checked(){return this._checked}set checked(A){this._checked!==A&&(this._checked=A,A&&this.radioGroup&&this.radioGroup.value!==this.value?this.radioGroup.selected=this:!A&&this.radioGroup&&this.radioGroup.value===this.value&&(this.radioGroup.selected=null),A&&this._radioDispatcher.notify(this.id,this.name),this._changeDetector.markForCheck())}get value(){return this._value}set value(A){this._value!==A&&(this._value=A,this.radioGroup!==null&&(this.checked||(this.checked=this.radioGroup.value===A),this.checked&&(this.radioGroup.selected=this)))}get labelPosition(){return this._labelPosition||this.radioGroup&&this.radioGroup.labelPosition||"after"}set labelPosition(A){this._labelPosition=A}_labelPosition;get disabled(){return this._disabled||this.radioGroup!==null&&this.radioGroup.disabled}set disabled(A){this._setDisabled(A)}get required(){return this._required||this.radioGroup&&this.radioGroup.required}set required(A){this._required=A}get color(){return this._color||this.radioGroup&&this.radioGroup.color||this._defaultOptions&&this._defaultOptions.color||"accent"}set color(A){this._color=A}_color;get disabledInteractive(){return this._disabledInteractive||this.radioGroup!==null&&this.radioGroup.disabledInteractive}set disabledInteractive(A){this._disabledInteractive=A}_disabledInteractive;change=new WA;radioGroup;get inputId(){return`${this.id||this._uniqueId}-input`}_checked=!1;_disabled;_required;_value=null;_removeUniqueSelectionListener=()=>{};_previousTabIndex;_inputElement;_rippleTrigger;_noopAnimations;_injector=f(Rt);constructor(){f(Rn).load(lr);let A=f(sZA,{optional:!0}),i=f(Si,{optional:!0}),n=f(new wr("tabindex"),{optional:!0});this.radioGroup=A,this._noopAnimations=i==="NoopAnimations",this._disabledInteractive=this._defaultOptions?.disabledInteractive??!1,n&&(this.tabIndex=zi(n,0))}focus(A,i){i?this._focusMonitor.focusVia(this._inputElement,i,A):this._inputElement.nativeElement.focus(A)}_markForCheck(){this._changeDetector.markForCheck()}ngOnInit(){this.radioGroup&&(this.checked=this.radioGroup.value===this._value,this.checked&&(this.radioGroup.selected=this),this.name=this.radioGroup.name),this._removeUniqueSelectionListener=this._radioDispatcher.listen((A,i)=>{A!==this.id&&i===this.name&&(this.checked=!1)})}ngDoCheck(){this._updateTabIndex()}ngAfterViewInit(){this._updateTabIndex(),this._focusMonitor.monitor(this._elementRef,!0).subscribe(A=>{!A&&this.radioGroup&&this.radioGroup._touch()}),this._ngZone.runOutsideAngular(()=>{this._cleanupClick=this._renderer.listen(this._inputElement.nativeElement,"click",this._onInputClick)})}ngOnDestroy(){this._cleanupClick?.(),this._focusMonitor.stopMonitoring(this._elementRef),this._removeUniqueSelectionListener()}_emitChangeEvent(){this.change.emit(new zU(this,this._value))}_isRippleDisabled(){return this.disableRipple||this.disabled}_onInputInteraction(A){if(A.stopPropagation(),!this.checked&&!this.disabled){let i=this.radioGroup&&this.value!==this.radioGroup.value;this.checked=!0,this._emitChangeEvent(),this.radioGroup&&(this.radioGroup._controlValueAccessorChangeFn(this.value),i&&this.radioGroup._emitChangeEvent())}}_onTouchTargetClick(A){this._onInputInteraction(A),(!this.disabled||this.disabledInteractive)&&this._inputElement?.nativeElement.focus()}_setDisabled(A){this._disabled!==A&&(this._disabled=A,this._changeDetector.markForCheck())}_onInputClick=A=>{this.disabled&&this.disabledInteractive&&A.preventDefault()};_updateTabIndex(){let A=this.radioGroup,i;if(!A||!A.selected||this.disabled?i=this.tabIndex:i=A.selected===this?this.tabIndex:-1,i!==this._previousTabIndex){let n=this._inputElement?.nativeElement;n&&(n.setAttribute("tabindex",i+""),this._previousTabIndex=i,To(()=>{queueMicrotask(()=>{A&&A.selected&&A.selected!==this&&document.activeElement===n&&(A.selected?._inputElement.nativeElement.focus(),document.activeElement===n&&this._inputElement.nativeElement.blur())})},{injector:this._injector}))}}static \u0275fac=function(i){return new(i||t)};static \u0275cmp=zA({type:t,selectors:[["mat-radio-button"]],viewQuery:function(i,n){if(i&1&&(Te(nZA,5),Te(oZA,7,ee)),i&2){let o;XA(o=$A())&&(n._inputElement=o.first),XA(o=$A())&&(n._rippleTrigger=o.first)}},hostAttrs:[1,"mat-mdc-radio-button"],hostVars:19,hostBindings:function(i,n){i&1&&hA("focus",function(){return n._inputElement.nativeElement.focus()}),i&2&&(Ne("id",n.id)("tabindex",null)("aria-label",null)("aria-labelledby",null)("aria-describedby",null),ue("mat-primary",n.color==="primary")("mat-accent",n.color==="accent")("mat-warn",n.color==="warn")("mat-mdc-radio-checked",n.checked)("mat-mdc-radio-disabled",n.disabled)("mat-mdc-radio-disabled-interactive",n.disabledInteractive)("_mat-animation-noopable",n._noopAnimations))},inputs:{id:"id",name:"name",ariaLabel:[0,"aria-label","ariaLabel"],ariaLabelledby:[0,"aria-labelledby","ariaLabelledby"],ariaDescribedby:[0,"aria-describedby","ariaDescribedby"],disableRipple:[2,"disableRipple","disableRipple",ie],tabIndex:[2,"tabIndex","tabIndex",A=>A==null?0:zi(A)],checked:[2,"checked","checked",ie],value:"value",labelPosition:"labelPosition",disabled:[2,"disabled","disabled",ie],required:[2,"required","required",ie],color:"color",disabledInteractive:[2,"disabledInteractive","disabledInteractive",ie]},outputs:{change:"change"},exportAs:["matRadioButton"],ngContentSelectors:rZA,decls:13,vars:17,consts:[["formField",""],["input",""],["mat-internal-form-field","",3,"labelPosition"],[1,"mdc-radio"],[1,"mat-mdc-radio-touch-target",3,"click"],["type","radio",1,"mdc-radio__native-control",3,"change","id","checked","disabled","required"],[1,"mdc-radio__background"],[1,"mdc-radio__outer-circle"],[1,"mdc-radio__inner-circle"],["mat-ripple","",1,"mat-radio-ripple","mat-focus-indicator",3,"matRippleTrigger","matRippleDisabled","matRippleCentered"],[1,"mat-ripple-element","mat-radio-persistent-ripple"],[1,"mdc-label",3,"for"]],template:function(i,n){if(i&1){let o=be();jt(),S(0,"div",2,0)(2,"div",3)(3,"div",4),hA("click",function(s){return RA(o),xA(n._onTouchTargetClick(s))}),F(),S(4,"input",5,1),hA("change",function(s){return RA(o),xA(n._onInputInteraction(s))}),F(),S(6,"div",6),JA(7,"div",7)(8,"div",8),F(),S(9,"div",9),JA(10,"div",10),F()(),S(11,"label",11),Fe(12),F()()}i&2&&(yA("labelPosition",n.labelPosition),G(2),ue("mdc-radio--disabled",n.disabled),G(2),yA("id",n.inputId)("checked",n.checked)("disabled",n.disabled&&!n.disabledInteractive)("required",n.required),Ne("name",n.name)("value",n.value)("aria-label",n.ariaLabel)("aria-labelledby",n.ariaLabelledby)("aria-describedby",n.ariaDescribedby)("aria-disabled",n.disabled&&n.disabledInteractive?"true":null),G(5),yA("matRippleTrigger",n._rippleTrigger.nativeElement)("matRippleDisabled",n._isRippleDisabled())("matRippleCentered",!0),G(2),yA("for",n.inputId))},dependencies:[rs,MB],styles:['.mat-mdc-radio-button{-webkit-tap-highlight-color:rgba(0,0,0,0)}.mat-mdc-radio-button .mdc-radio{display:inline-block;position:relative;flex:0 0 auto;box-sizing:content-box;width:20px;height:20px;cursor:pointer;will-change:opacity,transform,border-color,color;padding:calc((var(--mdc-radio-state-layer-size, 40px) - 20px)/2)}.mat-mdc-radio-button .mdc-radio:hover .mdc-radio__native-control:not([disabled]):not(:focus)~.mdc-radio__background::before{opacity:.04;transform:scale(1)}.mat-mdc-radio-button .mdc-radio:hover .mdc-radio__native-control:not([disabled])~.mdc-radio__background .mdc-radio__outer-circle{border-color:var(--mdc-radio-unselected-hover-icon-color, var(--mat-sys-on-surface))}.mat-mdc-radio-button .mdc-radio:hover .mdc-radio__native-control:enabled:checked+.mdc-radio__background .mdc-radio__outer-circle,.mat-mdc-radio-button .mdc-radio:hover .mdc-radio__native-control:enabled:checked+.mdc-radio__background .mdc-radio__inner-circle{border-color:var(--mdc-radio-selected-hover-icon-color, var(--mat-sys-primary))}.mat-mdc-radio-button .mdc-radio:active .mdc-radio__native-control:enabled:not(:checked)+.mdc-radio__background .mdc-radio__outer-circle{border-color:var(--mdc-radio-unselected-pressed-icon-color, var(--mat-sys-on-surface))}.mat-mdc-radio-button .mdc-radio:active .mdc-radio__native-control:enabled:checked+.mdc-radio__background .mdc-radio__outer-circle,.mat-mdc-radio-button .mdc-radio:active .mdc-radio__native-control:enabled:checked+.mdc-radio__background .mdc-radio__inner-circle{border-color:var(--mdc-radio-selected-pressed-icon-color, var(--mat-sys-primary))}.mat-mdc-radio-button .mdc-radio__background{display:inline-block;position:relative;box-sizing:border-box;width:20px;height:20px}.mat-mdc-radio-button .mdc-radio__background::before{position:absolute;transform:scale(0, 0);border-radius:50%;opacity:0;pointer-events:none;content:"";transition:opacity 90ms cubic-bezier(0.4, 0, 0.6, 1),transform 90ms cubic-bezier(0.4, 0, 0.6, 1);width:var(--mdc-radio-state-layer-size, 40px);height:var(--mdc-radio-state-layer-size, 40px);top:calc(-1*(var(--mdc-radio-state-layer-size, 40px) - 20px)/2);left:calc(-1*(var(--mdc-radio-state-layer-size, 40px) - 20px)/2)}.mat-mdc-radio-button .mdc-radio__outer-circle{position:absolute;top:0;left:0;box-sizing:border-box;width:100%;height:100%;border-width:2px;border-style:solid;border-radius:50%;transition:border-color 90ms cubic-bezier(0.4, 0, 0.6, 1)}.mat-mdc-radio-button .mdc-radio__inner-circle{position:absolute;top:0;left:0;box-sizing:border-box;width:100%;height:100%;transform:scale(0, 0);border-width:10px;border-style:solid;border-radius:50%;transition:transform 90ms cubic-bezier(0.4, 0, 0.6, 1),border-color 90ms cubic-bezier(0.4, 0, 0.6, 1)}.mat-mdc-radio-button .mdc-radio__native-control{position:absolute;margin:0;padding:0;opacity:0;top:0;right:0;left:0;cursor:inherit;z-index:1;width:var(--mdc-radio-state-layer-size, 40px);height:var(--mdc-radio-state-layer-size, 40px)}.mat-mdc-radio-button .mdc-radio__native-control:checked+.mdc-radio__background,.mat-mdc-radio-button .mdc-radio__native-control:disabled+.mdc-radio__background{transition:opacity 90ms cubic-bezier(0, 0, 0.2, 1),transform 90ms cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-radio-button .mdc-radio__native-control:checked+.mdc-radio__background .mdc-radio__outer-circle,.mat-mdc-radio-button .mdc-radio__native-control:disabled+.mdc-radio__background .mdc-radio__outer-circle{transition:border-color 90ms cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-radio-button .mdc-radio__native-control:checked+.mdc-radio__background .mdc-radio__inner-circle,.mat-mdc-radio-button .mdc-radio__native-control:disabled+.mdc-radio__background .mdc-radio__inner-circle{transition:transform 90ms cubic-bezier(0, 0, 0.2, 1),border-color 90ms cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-radio-button .mdc-radio__native-control:focus+.mdc-radio__background::before{transform:scale(1);opacity:.12;transition:opacity 90ms cubic-bezier(0, 0, 0.2, 1),transform 90ms cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-radio-button .mdc-radio__native-control:disabled:not(:checked)+.mdc-radio__background .mdc-radio__outer-circle{border-color:var(--mdc-radio-disabled-unselected-icon-color, var(--mat-sys-on-surface));opacity:var(--mdc-radio-disabled-unselected-icon-opacity, 0.38)}.mat-mdc-radio-button .mdc-radio__native-control:disabled+.mdc-radio__background{cursor:default}.mat-mdc-radio-button .mdc-radio__native-control:disabled+.mdc-radio__background .mdc-radio__inner-circle,.mat-mdc-radio-button .mdc-radio__native-control:disabled+.mdc-radio__background .mdc-radio__outer-circle{border-color:var(--mdc-radio-disabled-selected-icon-color, var(--mat-sys-on-surface));opacity:var(--mdc-radio-disabled-selected-icon-opacity, 0.38)}.mat-mdc-radio-button .mdc-radio__native-control:enabled:not(:checked)+.mdc-radio__background .mdc-radio__outer-circle{border-color:var(--mdc-radio-unselected-icon-color, var(--mat-sys-on-surface-variant))}.mat-mdc-radio-button .mdc-radio__native-control:enabled:checked+.mdc-radio__background .mdc-radio__outer-circle,.mat-mdc-radio-button .mdc-radio__native-control:enabled:checked+.mdc-radio__background .mdc-radio__inner-circle{border-color:var(--mdc-radio-selected-icon-color, var(--mat-sys-primary))}.mat-mdc-radio-button .mdc-radio__native-control:enabled:focus:checked+.mdc-radio__background .mdc-radio__inner-circle,.mat-mdc-radio-button .mdc-radio__native-control:enabled:focus:checked+.mdc-radio__background .mdc-radio__outer-circle{border-color:var(--mdc-radio-selected-focus-icon-color, var(--mat-sys-primary))}.mat-mdc-radio-button .mdc-radio__native-control:checked+.mdc-radio__background .mdc-radio__inner-circle{transform:scale(0.5);transition:transform 90ms cubic-bezier(0, 0, 0.2, 1),border-color 90ms cubic-bezier(0, 0, 0.2, 1)}.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled{pointer-events:auto}.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled .mdc-radio__native-control:not(:checked)+.mdc-radio__background .mdc-radio__outer-circle{border-color:var(--mdc-radio-disabled-unselected-icon-color, var(--mat-sys-on-surface));opacity:var(--mdc-radio-disabled-unselected-icon-opacity, 0.38)}.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled:hover .mdc-radio__native-control:checked+.mdc-radio__background .mdc-radio__inner-circle,.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled:hover .mdc-radio__native-control:checked+.mdc-radio__background .mdc-radio__outer-circle,.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled .mdc-radio__native-control:checked:focus+.mdc-radio__background .mdc-radio__inner-circle,.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled .mdc-radio__native-control:checked:focus+.mdc-radio__background .mdc-radio__outer-circle,.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled .mdc-radio__native-control+.mdc-radio__background .mdc-radio__inner-circle,.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled .mdc-radio__native-control+.mdc-radio__background .mdc-radio__outer-circle{border-color:var(--mdc-radio-disabled-selected-icon-color, var(--mat-sys-on-surface));opacity:var(--mdc-radio-disabled-selected-icon-opacity, 0.38)}.mat-mdc-radio-button._mat-animation-noopable .mdc-radio__background::before,.mat-mdc-radio-button._mat-animation-noopable .mdc-radio__outer-circle,.mat-mdc-radio-button._mat-animation-noopable .mdc-radio__inner-circle{transition:none !important}.mat-mdc-radio-button .mdc-radio__background::before{background-color:var(--mat-radio-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-radio-button.mat-mdc-radio-checked .mat-ripple-element,.mat-mdc-radio-button.mat-mdc-radio-checked .mdc-radio__background::before{background-color:var(--mat-radio-checked-ripple-color, var(--mat-sys-primary))}.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled .mat-ripple-element,.mat-mdc-radio-button.mat-mdc-radio-disabled-interactive .mdc-radio--disabled .mdc-radio__background::before{background-color:var(--mat-radio-ripple-color, var(--mat-sys-on-surface))}.mat-mdc-radio-button .mat-internal-form-field{color:var(--mat-radio-label-text-color, var(--mat-sys-on-surface));font-family:var(--mat-radio-label-text-font, var(--mat-sys-body-medium-font));line-height:var(--mat-radio-label-text-line-height, var(--mat-sys-body-medium-line-height));font-size:var(--mat-radio-label-text-size, var(--mat-sys-body-medium-size));letter-spacing:var(--mat-radio-label-text-tracking, var(--mat-sys-body-medium-tracking));font-weight:var(--mat-radio-label-text-weight, var(--mat-sys-body-medium-weight))}.mat-mdc-radio-button .mdc-radio--disabled+label{color:var(--mat-radio-disabled-label-color, color-mix(in srgb, var(--mat-sys-on-surface) 38%, transparent))}.mat-mdc-radio-button .mat-radio-ripple{top:0;left:0;right:0;bottom:0;position:absolute;pointer-events:none;border-radius:50%}.mat-mdc-radio-button .mat-radio-ripple .mat-ripple-element{opacity:.14}.mat-mdc-radio-button .mat-radio-ripple::before{border-radius:50%}.mat-mdc-radio-button .mdc-radio .mdc-radio__native-control:focus:enabled:not(:checked)~.mdc-radio__background .mdc-radio__outer-circle{border-color:var(--mdc-radio-unselected-focus-icon-color, var(--mat-sys-on-surface))}.mat-mdc-radio-button.cdk-focused .mat-focus-indicator::before{content:""}.mat-mdc-radio-disabled{cursor:default;pointer-events:none}.mat-mdc-radio-disabled.mat-mdc-radio-disabled-interactive{pointer-events:auto}.mat-mdc-radio-touch-target{position:absolute;top:50%;left:50%;height:48px;width:48px;transform:translate(-50%, -50%);display:var(--mat-radio-touch-target-display, block)}[dir=rtl] .mat-mdc-radio-touch-target{left:auto;right:50%;transform:translate(50%, -50%)}'],encapsulation:2,changeDetection:0})}return t})(),xgA=(()=>{class t{static \u0275fac=function(i){return new(i||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[it,Ps,lZA,it]})}return t})();var G7=class t{static \u0275fac=function(A){return new(A||t)};static \u0275mod=Ce({type:t});static \u0275inj=Ie({imports:[f0,B6,LcA,pq,y0,e7,AC,_P,bcA,FcA,GcA,zcA,xgA,u8,hcA,HaA,scA,SlA,f8,qcA,_7,mcA,BlA.forRoot(),ElA,xz,RgA,Bq,ScA,flA]})};var Tf=class t{static \u0275fac=function(A){return new(A||t)};static \u0275mod=Ce({type:t,bootstrap:[_Q]});static \u0275inj=Ie({providers:[Wg,H2,Xg,xQ,LQ,nI,Vc,RQ,O2,$g],imports:[G7,Vh,B6,IM,B7,e7,y0,AC,_7]})};fetch("./assets/config/runtime-config.json").then(t=>t.json()).then(t=>{window.runtimeConfig=t,Wp().bootstrapModule(Tf).catch(e=>console.error(e))});Wp().bootstrapModule(Tf).catch(t=>console.error(t)); diff --git a/src/google/adk/cli/browser/polyfills-B6TNHZQ6.js b/src/google/adk/cli/browser/polyfills-B6TNHZQ6.js index 21c405ad38..9590af5094 100644 --- a/src/google/adk/cli/browser/polyfills-B6TNHZQ6.js +++ b/src/google/adk/cli/browser/polyfills-B6TNHZQ6.js @@ -1,17 +1,2 @@ -/** - * Copyright 2025 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ var ce=globalThis;function te(t){return(ce.__Zone_symbol_prefix||"__zone_symbol__")+t}function ht(){let t=ce.performance;function n(I){t&&t.mark&&t.mark(I)}function a(I,s){t&&t.measure&&t.measure(I,s)}n("Zone");class e{static __symbol__=te;static assertZonePatched(){if(ce.Promise!==S.ZoneAwarePromise)throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)")}static get root(){let s=e.current;for(;s.parent;)s=s.parent;return s}static get current(){return b.zone}static get currentTask(){return D}static __load_patch(s,i,r=!1){if(S.hasOwnProperty(s)){let E=ce[te("forceDuplicateZoneCheck")]===!0;if(!r&&E)throw Error("Already loaded patch: "+s)}else if(!ce["__Zone_disable_"+s]){let E="Zone:"+s;n(E),S[s]=i(ce,e,R),a(E,E)}}get parent(){return this._parent}get name(){return this._name}_parent;_name;_properties;_zoneDelegate;constructor(s,i){this._parent=s,this._name=i?i.name||"unnamed":"",this._properties=i&&i.properties||{},this._zoneDelegate=new f(this,this._parent&&this._parent._zoneDelegate,i)}get(s){let i=this.getZoneWith(s);if(i)return i._properties[s]}getZoneWith(s){let i=this;for(;i;){if(i._properties.hasOwnProperty(s))return i;i=i._parent}return null}fork(s){if(!s)throw new Error("ZoneSpec required!");return this._zoneDelegate.fork(this,s)}wrap(s,i){if(typeof s!="function")throw new Error("Expecting function got: "+s);let r=this._zoneDelegate.intercept(this,s,i),E=this;return function(){return E.runGuarded(r,this,arguments,i)}}run(s,i,r,E){b={parent:b,zone:this};try{return this._zoneDelegate.invoke(this,s,i,r,E)}finally{b=b.parent}}runGuarded(s,i=null,r,E){b={parent:b,zone:this};try{try{return this._zoneDelegate.invoke(this,s,i,r,E)}catch(x){if(this._zoneDelegate.handleError(this,x))throw x}}finally{b=b.parent}}runTask(s,i,r){if(s.zone!=this)throw new Error("A task can only be run in the zone of creation! (Creation: "+(s.zone||J).name+"; Execution: "+this.name+")");let E=s,{type:x,data:{isPeriodic:ee=!1,isRefreshable:M=!1}={}}=s;if(s.state===q&&(x===U||x===k))return;let he=s.state!=A;he&&E._transitionTo(A,d);let _e=D;D=E,b={parent:b,zone:this};try{x==k&&s.data&&!ee&&!M&&(s.cancelFn=void 0);try{return this._zoneDelegate.invokeTask(this,E,i,r)}catch(Q){if(this._zoneDelegate.handleError(this,Q))throw Q}}finally{let Q=s.state;if(Q!==q&&Q!==X)if(x==U||ee||M&&Q===p)he&&E._transitionTo(d,A,p);else{let Te=E._zoneDelegates;this._updateTaskCount(E,-1),he&&E._transitionTo(q,A,q),M&&(E._zoneDelegates=Te)}b=b.parent,D=_e}}scheduleTask(s){if(s.zone&&s.zone!==this){let r=this;for(;r;){if(r===s.zone)throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${s.zone.name}`);r=r.parent}}s._transitionTo(p,q);let i=[];s._zoneDelegates=i,s._zone=this;try{s=this._zoneDelegate.scheduleTask(this,s)}catch(r){throw s._transitionTo(X,p,q),this._zoneDelegate.handleError(this,r),r}return s._zoneDelegates===i&&this._updateTaskCount(s,1),s.state==p&&s._transitionTo(d,p),s}scheduleMicroTask(s,i,r,E){return this.scheduleTask(new g(F,s,i,r,E,void 0))}scheduleMacroTask(s,i,r,E,x){return this.scheduleTask(new g(k,s,i,r,E,x))}scheduleEventTask(s,i,r,E,x){return this.scheduleTask(new g(U,s,i,r,E,x))}cancelTask(s){if(s.zone!=this)throw new Error("A task can only be cancelled in the zone of creation! (Creation: "+(s.zone||J).name+"; Execution: "+this.name+")");if(!(s.state!==d&&s.state!==A)){s._transitionTo(V,d,A);try{this._zoneDelegate.cancelTask(this,s)}catch(i){throw s._transitionTo(X,V),this._zoneDelegate.handleError(this,i),i}return this._updateTaskCount(s,-1),s._transitionTo(q,V),s.runCount=-1,s}}_updateTaskCount(s,i){let r=s._zoneDelegates;i==-1&&(s._zoneDelegates=null);for(let E=0;EI.hasTask(i,r),onScheduleTask:(I,s,i,r)=>I.scheduleTask(i,r),onInvokeTask:(I,s,i,r,E,x)=>I.invokeTask(i,r,E,x),onCancelTask:(I,s,i,r)=>I.cancelTask(i,r)};class f{get zone(){return this._zone}_zone;_taskCounts={microTask:0,macroTask:0,eventTask:0};_parentDelegate;_forkDlgt;_forkZS;_forkCurrZone;_interceptDlgt;_interceptZS;_interceptCurrZone;_invokeDlgt;_invokeZS;_invokeCurrZone;_handleErrorDlgt;_handleErrorZS;_handleErrorCurrZone;_scheduleTaskDlgt;_scheduleTaskZS;_scheduleTaskCurrZone;_invokeTaskDlgt;_invokeTaskZS;_invokeTaskCurrZone;_cancelTaskDlgt;_cancelTaskZS;_cancelTaskCurrZone;_hasTaskDlgt;_hasTaskDlgtOwner;_hasTaskZS;_hasTaskCurrZone;constructor(s,i,r){this._zone=s,this._parentDelegate=i,this._forkZS=r&&(r&&r.onFork?r:i._forkZS),this._forkDlgt=r&&(r.onFork?i:i._forkDlgt),this._forkCurrZone=r&&(r.onFork?this._zone:i._forkCurrZone),this._interceptZS=r&&(r.onIntercept?r:i._interceptZS),this._interceptDlgt=r&&(r.onIntercept?i:i._interceptDlgt),this._interceptCurrZone=r&&(r.onIntercept?this._zone:i._interceptCurrZone),this._invokeZS=r&&(r.onInvoke?r:i._invokeZS),this._invokeDlgt=r&&(r.onInvoke?i:i._invokeDlgt),this._invokeCurrZone=r&&(r.onInvoke?this._zone:i._invokeCurrZone),this._handleErrorZS=r&&(r.onHandleError?r:i._handleErrorZS),this._handleErrorDlgt=r&&(r.onHandleError?i:i._handleErrorDlgt),this._handleErrorCurrZone=r&&(r.onHandleError?this._zone:i._handleErrorCurrZone),this._scheduleTaskZS=r&&(r.onScheduleTask?r:i._scheduleTaskZS),this._scheduleTaskDlgt=r&&(r.onScheduleTask?i:i._scheduleTaskDlgt),this._scheduleTaskCurrZone=r&&(r.onScheduleTask?this._zone:i._scheduleTaskCurrZone),this._invokeTaskZS=r&&(r.onInvokeTask?r:i._invokeTaskZS),this._invokeTaskDlgt=r&&(r.onInvokeTask?i:i._invokeTaskDlgt),this._invokeTaskCurrZone=r&&(r.onInvokeTask?this._zone:i._invokeTaskCurrZone),this._cancelTaskZS=r&&(r.onCancelTask?r:i._cancelTaskZS),this._cancelTaskDlgt=r&&(r.onCancelTask?i:i._cancelTaskDlgt),this._cancelTaskCurrZone=r&&(r.onCancelTask?this._zone:i._cancelTaskCurrZone),this._hasTaskZS=null,this._hasTaskDlgt=null,this._hasTaskDlgtOwner=null,this._hasTaskCurrZone=null;let E=r&&r.onHasTask,x=i&&i._hasTaskZS;(E||x)&&(this._hasTaskZS=E?r:c,this._hasTaskDlgt=i,this._hasTaskDlgtOwner=this,this._hasTaskCurrZone=this._zone,r.onScheduleTask||(this._scheduleTaskZS=c,this._scheduleTaskDlgt=i,this._scheduleTaskCurrZone=this._zone),r.onInvokeTask||(this._invokeTaskZS=c,this._invokeTaskDlgt=i,this._invokeTaskCurrZone=this._zone),r.onCancelTask||(this._cancelTaskZS=c,this._cancelTaskDlgt=i,this._cancelTaskCurrZone=this._zone))}fork(s,i){return this._forkZS?this._forkZS.onFork(this._forkDlgt,this.zone,s,i):new e(s,i)}intercept(s,i,r){return this._interceptZS?this._interceptZS.onIntercept(this._interceptDlgt,this._interceptCurrZone,s,i,r):i}invoke(s,i,r,E,x){return this._invokeZS?this._invokeZS.onInvoke(this._invokeDlgt,this._invokeCurrZone,s,i,r,E,x):i.apply(r,E)}handleError(s,i){return this._handleErrorZS?this._handleErrorZS.onHandleError(this._handleErrorDlgt,this._handleErrorCurrZone,s,i):!0}scheduleTask(s,i){let r=i;if(this._scheduleTaskZS)this._hasTaskZS&&r._zoneDelegates.push(this._hasTaskDlgtOwner),r=this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt,this._scheduleTaskCurrZone,s,i),r||(r=i);else if(i.scheduleFn)i.scheduleFn(i);else if(i.type==F)z(i);else throw new Error("Task is missing scheduleFn.");return r}invokeTask(s,i,r,E){return this._invokeTaskZS?this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt,this._invokeTaskCurrZone,s,i,r,E):i.callback.apply(r,E)}cancelTask(s,i){let r;if(this._cancelTaskZS)r=this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt,this._cancelTaskCurrZone,s,i);else{if(!i.cancelFn)throw Error("Task is not cancelable");r=i.cancelFn(i)}return r}hasTask(s,i){try{this._hasTaskZS&&this._hasTaskZS.onHasTask(this._hasTaskDlgt,this._hasTaskCurrZone,s,i)}catch(r){this.handleError(s,r)}}_updateTaskCount(s,i){let r=this._taskCounts,E=r[s],x=r[s]=E+i;if(x<0)throw new Error("More tasks executed then were scheduled.");if(E==0||x==0){let ee={microTask:r.microTask>0,macroTask:r.macroTask>0,eventTask:r.eventTask>0,change:s};this.hasTask(this._zone,ee)}}}class g{type;source;invoke;callback;data;scheduleFn;cancelFn;_zone=null;runCount=0;_zoneDelegates=null;_state="notScheduled";constructor(s,i,r,E,x,ee){if(this.type=s,this.source=i,this.data=E,this.scheduleFn=x,this.cancelFn=ee,!r)throw new Error("callback is not defined");this.callback=r;let M=this;s===U&&E&&E.useG?this.invoke=g.invokeTask:this.invoke=function(){return g.invokeTask.call(ce,M,this,arguments)}}static invokeTask(s,i,r){s||(s=this),K++;try{return s.runCount++,s.zone.runTask(s,i,r)}finally{K==1&&$(),K--}}get zone(){return this._zone}get state(){return this._state}cancelScheduleRequest(){this._transitionTo(q,p)}_transitionTo(s,i,r){if(this._state===i||this._state===r)this._state=s,s==q&&(this._zoneDelegates=null);else throw new Error(`${this.type} '${this.source}': can not transition to '${s}', expecting state '${i}'${r?" or '"+r+"'":""}, was '${this._state}'.`)}toString(){return this.data&&typeof this.data.handleId<"u"?this.data.handleId.toString():Object.prototype.toString.call(this)}toJSON(){return{type:this.type,state:this.state,source:this.source,zone:this.zone.name,runCount:this.runCount}}}let T=te("setTimeout"),y=te("Promise"),w=te("then"),_=[],P=!1,L;function H(I){if(L||ce[y]&&(L=ce[y].resolve(0)),L){let s=L[w];s||(s=L.then),s.call(L,I)}else ce[T](I,0)}function z(I){K===0&&_.length===0&&H($),I&&_.push(I)}function $(){if(!P){for(P=!0;_.length;){let I=_;_=[];for(let s=0;sb,onUnhandledError:W,microtaskDrainDone:W,scheduleMicroTask:z,showUncaughtError:()=>!e[te("ignoreConsoleErrorUncaughtError")],patchEventTarget:()=>[],patchOnProperties:W,patchMethod:()=>W,bindArguments:()=>[],patchThen:()=>W,patchMacroTask:()=>W,patchEventPrototype:()=>W,isIEOrEdge:()=>!1,getGlobalObjects:()=>{},ObjectDefineProperty:()=>W,ObjectGetOwnPropertyDescriptor:()=>{},ObjectCreate:()=>{},ArraySlice:()=>[],patchClass:()=>W,wrapWithCurrentZone:()=>W,filterProperties:()=>[],attachOriginToPatched:()=>W,_redefineProperty:()=>W,patchCallbacks:()=>W,nativeScheduleMicroTask:H},b={parent:null,zone:new e(null,null)},D=null,K=0;function W(){}return a("Zone","Zone"),e}function dt(){let t=globalThis,n=t[te("forceDuplicateZoneCheck")]===!0;if(t.Zone&&(n||typeof t.Zone.__symbol__!="function"))throw new Error("Zone already loaded.");return t.Zone??=ht(),t.Zone}var pe=Object.getOwnPropertyDescriptor,Me=Object.defineProperty,Ae=Object.getPrototypeOf,_t=Object.create,Tt=Array.prototype.slice,je="addEventListener",He="removeEventListener",Ne=te(je),Ze=te(He),ae="true",le="false",ve=te("");function Ve(t,n){return Zone.current.wrap(t,n)}function xe(t,n,a,e,c){return Zone.current.scheduleMacroTask(t,n,a,e,c)}var j=te,we=typeof window<"u",be=we?window:void 0,Y=we&&be||globalThis,Et="removeAttribute";function Fe(t,n){for(let a=t.length-1;a>=0;a--)typeof t[a]=="function"&&(t[a]=Ve(t[a],n+"_"+a));return t}function gt(t,n){let a=t.constructor.name;for(let e=0;e{let y=function(){return T.apply(this,Fe(arguments,a+"."+c))};return fe(y,T),y})(f)}}}function et(t){return t?t.writable===!1?!1:!(typeof t.get=="function"&&typeof t.set>"u"):!0}var tt=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,De=!("nw"in Y)&&typeof Y.process<"u"&&Y.process.toString()==="[object process]",Ge=!De&&!tt&&!!(we&&be.HTMLElement),nt=typeof Y.process<"u"&&Y.process.toString()==="[object process]"&&!tt&&!!(we&&be.HTMLElement),Ce={},kt=j("enable_beforeunload"),Xe=function(t){if(t=t||Y.event,!t)return;let n=Ce[t.type];n||(n=Ce[t.type]=j("ON_PROPERTY"+t.type));let a=this||t.target||Y,e=a[n],c;if(Ge&&a===be&&t.type==="error"){let f=t;c=e&&e.call(this,f.message,f.filename,f.lineno,f.colno,f.error),c===!0&&t.preventDefault()}else c=e&&e.apply(this,arguments),t.type==="beforeunload"&&Y[kt]&&typeof c=="string"?t.returnValue=c:c!=null&&!c&&t.preventDefault();return c};function Ye(t,n,a){let e=pe(t,n);if(!e&&a&&pe(a,n)&&(e={enumerable:!0,configurable:!0}),!e||!e.configurable)return;let c=j("on"+n+"patched");if(t.hasOwnProperty(c)&&t[c])return;delete e.writable,delete e.value;let f=e.get,g=e.set,T=n.slice(2),y=Ce[T];y||(y=Ce[T]=j("ON_PROPERTY"+T)),e.set=function(w){let _=this;if(!_&&t===Y&&(_=Y),!_)return;typeof _[y]=="function"&&_.removeEventListener(T,Xe),g?.call(_,null),_[y]=w,typeof w=="function"&&_.addEventListener(T,Xe,!1)},e.get=function(){let w=this;if(!w&&t===Y&&(w=Y),!w)return null;let _=w[y];if(_)return _;if(f){let P=f.call(this);if(P)return e.set.call(this,P),typeof w[Et]=="function"&&w.removeAttribute(n),P}return null},Me(t,n,e),t[c]=!0}function rt(t,n,a){if(n)for(let e=0;efunction(g,T){let y=a(g,T);return y.cbIdx>=0&&typeof T[y.cbIdx]=="function"?xe(y.name,T[y.cbIdx],y,c):f.apply(g,T)})}function fe(t,n){t[j("OriginalDelegate")]=n}var $e=!1,Le=!1;function yt(){if($e)return Le;$e=!0;try{let t=be.navigator.userAgent;(t.indexOf("MSIE ")!==-1||t.indexOf("Trident/")!==-1||t.indexOf("Edge/")!==-1)&&(Le=!0)}catch{}return Le}function Je(t){return typeof t=="function"}function Ke(t){return typeof t=="number"}var pt={useG:!0},ne={},ot={},st=new RegExp("^"+ve+"(\\w+)(true|false)$"),it=j("propagationStopped");function ct(t,n){let a=(n?n(t):t)+le,e=(n?n(t):t)+ae,c=ve+a,f=ve+e;ne[t]={},ne[t][le]=c,ne[t][ae]=f}function vt(t,n,a,e){let c=e&&e.add||je,f=e&&e.rm||He,g=e&&e.listeners||"eventListeners",T=e&&e.rmAll||"removeAllListeners",y=j(c),w="."+c+":",_="prependListener",P="."+_+":",L=function(p,d,A){if(p.isRemoved)return;let V=p.callback;typeof V=="object"&&V.handleEvent&&(p.callback=k=>V.handleEvent(k),p.originalDelegate=V);let X;try{p.invoke(p,d,[A])}catch(k){X=k}let F=p.options;if(F&&typeof F=="object"&&F.once){let k=p.originalDelegate?p.originalDelegate:p.callback;d[f].call(d,A.type,k,F)}return X};function H(p,d,A){if(d=d||t.event,!d)return;let V=p||d.target||t,X=V[ne[d.type][A?ae:le]];if(X){let F=[];if(X.length===1){let k=L(X[0],V,d);k&&F.push(k)}else{let k=X.slice();for(let U=0;U{throw U})}}}let z=function(p){return H(this,p,!1)},$=function(p){return H(this,p,!0)};function J(p,d){if(!p)return!1;let A=!0;d&&d.useG!==void 0&&(A=d.useG);let V=d&&d.vh,X=!0;d&&d.chkDup!==void 0&&(X=d.chkDup);let F=!1;d&&d.rt!==void 0&&(F=d.rt);let k=p;for(;k&&!k.hasOwnProperty(c);)k=Ae(k);if(!k&&p[c]&&(k=p),!k||k[y])return!1;let U=d&&d.eventNameToString,S={},R=k[y]=k[c],b=k[j(f)]=k[f],D=k[j(g)]=k[g],K=k[j(T)]=k[T],W;d&&d.prepend&&(W=k[j(d.prepend)]=k[d.prepend]);function I(o,u){return u?typeof o=="boolean"?{capture:o,passive:!0}:o?typeof o=="object"&&o.passive!==!1?{...o,passive:!0}:o:{passive:!0}:o}let s=function(o){if(!S.isExisting)return R.call(S.target,S.eventName,S.capture?$:z,S.options)},i=function(o){if(!o.isRemoved){let u=ne[o.eventName],v;u&&(v=u[o.capture?ae:le]);let C=v&&o.target[v];if(C){for(let m=0;mre.zone.cancelTask(re);o.call(Ee,"abort",ie,{once:!0}),re.removeAbortListener=()=>Ee.removeEventListener("abort",ie)}if(S.target=null,me&&(me.taskData=null),Be&&(S.options.once=!0),typeof re.options!="boolean"&&(re.options=se),re.target=N,re.capture=Se,re.eventName=Z,B&&(re.originalDelegate=G),O?ge.unshift(re):ge.push(re),m)return N}};return k[c]=l(R,w,ee,M,F),W&&(k[_]=l(W,P,E,M,F,!0)),k[f]=function(){let o=this||t,u=arguments[0];d&&d.transferEventName&&(u=d.transferEventName(u));let v=arguments[2],C=v?typeof v=="boolean"?!0:v.capture:!1,m=arguments[1];if(!m)return b.apply(this,arguments);if(V&&!V(b,m,o,arguments))return;let O=ne[u],N;O&&(N=O[C?ae:le]);let Z=N&&o[N];if(Z)for(let G=0;Gfunction(c,f){c[it]=!0,e&&e.apply(c,f)})}function Pt(t,n){n.patchMethod(t,"queueMicrotask",a=>function(e,c){Zone.current.scheduleMicroTask("queueMicrotask",c[0])})}var Re=j("zoneTask");function ke(t,n,a,e){let c=null,f=null;n+=e,a+=e;let g={};function T(w){let _=w.data;_.args[0]=function(){return w.invoke.apply(this,arguments)};let P=c.apply(t,_.args);return Ke(P)?_.handleId=P:(_.handle=P,_.isRefreshable=Je(P.refresh)),w}function y(w){let{handle:_,handleId:P}=w.data;return f.call(t,_??P)}c=ue(t,n,w=>function(_,P){if(Je(P[0])){let L={isRefreshable:!1,isPeriodic:e==="Interval",delay:e==="Timeout"||e==="Interval"?P[1]||0:void 0,args:P},H=P[0];P[0]=function(){try{return H.apply(this,arguments)}finally{let{handle:A,handleId:V,isPeriodic:X,isRefreshable:F}=L;!X&&!F&&(V?delete g[V]:A&&(A[Re]=null))}};let z=xe(n,P[0],L,T,y);if(!z)return z;let{handleId:$,handle:J,isRefreshable:q,isPeriodic:p}=z.data;if($)g[$]=z;else if(J&&(J[Re]=z,q&&!p)){let d=J.refresh;J.refresh=function(){let{zone:A,state:V}=z;return V==="notScheduled"?(z._state="scheduled",A._updateTaskCount(z,1)):V==="running"&&(z._state="scheduling"),d.call(this)}}return J??$??z}else return w.apply(t,P)}),f=ue(t,a,w=>function(_,P){let L=P[0],H;Ke(L)?(H=g[L],delete g[L]):(H=L?.[Re],H?L[Re]=null:H=L),H?.type?H.cancelFn&&H.zone.cancelTask(H):w.apply(t,P)})}function Rt(t,n){let{isBrowser:a,isMix:e}=n.getGlobalObjects();if(!a&&!e||!t.customElements||!("customElements"in t))return;let c=["connectedCallback","disconnectedCallback","adoptedCallback","attributeChangedCallback","formAssociatedCallback","formDisabledCallback","formResetCallback","formStateRestoreCallback"];n.patchCallbacks(n,t.customElements,"customElements","define",c)}function Ct(t,n){if(Zone[n.symbol("patchEventTarget")])return;let{eventNames:a,zoneSymbolEventNames:e,TRUE_STR:c,FALSE_STR:f,ZONE_SYMBOL_PREFIX:g}=n.getGlobalObjects();for(let y=0;yf.target===t);if(e.length===0)return n;let c=e[0].ignoreProperties;return n.filter(f=>c.indexOf(f)===-1)}function Qe(t,n,a,e){if(!t)return;let c=lt(t,n,a);rt(t,c,e)}function Ie(t){return Object.getOwnPropertyNames(t).filter(n=>n.startsWith("on")&&n.length>2).map(n=>n.substring(2))}function Dt(t,n){if(De&&!nt||Zone[t.symbol("patchEvents")])return;let a=n.__Zone_ignore_on_properties,e=[];if(Ge){let c=window;e=e.concat(["Document","SVGElement","Element","HTMLElement","HTMLBodyElement","HTMLMediaElement","HTMLFrameSetElement","HTMLFrameElement","HTMLIFrameElement","HTMLMarqueeElement","Worker"]);let f=[];Qe(c,Ie(c),a&&a.concat(f),Ae(c))}e=e.concat(["XMLHttpRequest","XMLHttpRequestEventTarget","IDBIndex","IDBRequest","IDBOpenDBRequest","IDBDatabase","IDBTransaction","IDBCursor","WebSocket"]);for(let c=0;c{let a=n[t.__symbol__("legacyPatch")];a&&a()}),t.__load_patch("timers",n=>{let a="set",e="clear";ke(n,a,e,"Timeout"),ke(n,a,e,"Interval"),ke(n,a,e,"Immediate")}),t.__load_patch("requestAnimationFrame",n=>{ke(n,"request","cancel","AnimationFrame"),ke(n,"mozRequest","mozCancel","AnimationFrame"),ke(n,"webkitRequest","webkitCancel","AnimationFrame")}),t.__load_patch("blocking",(n,a)=>{let e=["alert","prompt","confirm"];for(let c=0;cfunction(w,_){return a.current.run(g,n,_,y)})}}),t.__load_patch("EventTarget",(n,a,e)=>{wt(n,e),Ct(n,e);let c=n.XMLHttpRequestEventTarget;c&&c.prototype&&e.patchEventTarget(n,e,[c.prototype])}),t.__load_patch("MutationObserver",(n,a,e)=>{ye("MutationObserver"),ye("WebKitMutationObserver")}),t.__load_patch("IntersectionObserver",(n,a,e)=>{ye("IntersectionObserver")}),t.__load_patch("FileReader",(n,a,e)=>{ye("FileReader")}),t.__load_patch("on_property",(n,a,e)=>{Dt(e,n)}),t.__load_patch("customElements",(n,a,e)=>{Rt(n,e)}),t.__load_patch("XHR",(n,a)=>{w(n);let e=j("xhrTask"),c=j("xhrSync"),f=j("xhrListener"),g=j("xhrScheduled"),T=j("xhrURL"),y=j("xhrErrorBeforeScheduled");function w(_){let P=_.XMLHttpRequest;if(!P)return;let L=P.prototype;function H(R){return R[e]}let z=L[Ne],$=L[Ze];if(!z){let R=_.XMLHttpRequestEventTarget;if(R){let b=R.prototype;z=b[Ne],$=b[Ze]}}let J="readystatechange",q="scheduled";function p(R){let b=R.data,D=b.target;D[g]=!1,D[y]=!1;let K=D[f];z||(z=D[Ne],$=D[Ze]),K&&$.call(D,J,K);let W=D[f]=()=>{if(D.readyState===D.DONE)if(!b.aborted&&D[g]&&R.state===q){let s=D[a.__symbol__("loadfalse")];if(D.status!==0&&s&&s.length>0){let i=R.invoke;R.invoke=function(){let r=D[a.__symbol__("loadfalse")];for(let E=0;Efunction(R,b){return R[c]=b[2]==!1,R[T]=b[1],V.apply(R,b)}),X="XMLHttpRequest.send",F=j("fetchTaskAborting"),k=j("fetchTaskScheduling"),U=ue(L,"send",()=>function(R,b){if(a.current[k]===!0||R[c])return U.apply(R,b);{let D={target:R,url:R[T],isPeriodic:!1,args:b,aborted:!1},K=xe(X,d,D,p,A);R&&R[y]===!0&&!D.aborted&&K.state===q&&K.invoke()}}),S=ue(L,"abort",()=>function(R,b){let D=H(R);if(D&&typeof D.type=="string"){if(D.cancelFn==null||D.data&&D.data.aborted)return;D.zone.cancelTask(D)}else if(a.current[F]===!0)return S.apply(R,b)})}}),t.__load_patch("geolocation",n=>{n.navigator&&n.navigator.geolocation&>(n.navigator.geolocation,["getCurrentPosition","watchPosition"])}),t.__load_patch("PromiseRejectionEvent",(n,a)=>{function e(c){return function(f){at(n,c).forEach(T=>{let y=n.PromiseRejectionEvent;if(y){let w=new y(c,{promise:f.promise,reason:f.rejection});T.invoke(w)}})}}n.PromiseRejectionEvent&&(a[j("unhandledPromiseRejectionHandler")]=e("unhandledrejection"),a[j("rejectionHandledHandler")]=e("rejectionhandled"))}),t.__load_patch("queueMicrotask",(n,a,e)=>{Pt(n,e)})}function Ot(t){t.__load_patch("ZoneAwarePromise",(n,a,e)=>{let c=Object.getOwnPropertyDescriptor,f=Object.defineProperty;function g(h){if(h&&h.toString===Object.prototype.toString){let l=h.constructor&&h.constructor.name;return(l||"")+": "+JSON.stringify(h)}return h?h.toString():Object.prototype.toString.call(h)}let T=e.symbol,y=[],w=n[T("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")]!==!1,_=T("Promise"),P=T("then"),L="__creationTrace__";e.onUnhandledError=h=>{if(e.showUncaughtError()){let l=h&&h.rejection;l?console.error("Unhandled Promise rejection:",l instanceof Error?l.message:l,"; Zone:",h.zone.name,"; Task:",h.task&&h.task.source,"; Value:",l,l instanceof Error?l.stack:void 0):console.error(h)}},e.microtaskDrainDone=()=>{for(;y.length;){let h=y.shift();try{h.zone.runGuarded(()=>{throw h.throwOriginal?h.rejection:h})}catch(l){z(l)}}};let H=T("unhandledPromiseRejectionHandler");function z(h){e.onUnhandledError(h);try{let l=a[H];typeof l=="function"&&l.call(this,h)}catch{}}function $(h){return h&&typeof h.then=="function"}function J(h){return h}function q(h){return M.reject(h)}let p=T("state"),d=T("value"),A=T("finally"),V=T("parentPromiseValue"),X=T("parentPromiseState"),F="Promise.then",k=null,U=!0,S=!1,R=0;function b(h,l){return o=>{try{I(h,l,o)}catch(u){I(h,!1,u)}}}let D=function(){let h=!1;return function(o){return function(){h||(h=!0,o.apply(null,arguments))}}},K="Promise resolved with itself",W=T("currentTaskTrace");function I(h,l,o){let u=D();if(h===o)throw new TypeError(K);if(h[p]===k){let v=null;try{(typeof o=="object"||typeof o=="function")&&(v=o&&o.then)}catch(C){return u(()=>{I(h,!1,C)})(),h}if(l!==S&&o instanceof M&&o.hasOwnProperty(p)&&o.hasOwnProperty(d)&&o[p]!==k)i(o),I(h,o[p],o[d]);else if(l!==S&&typeof v=="function")try{v.call(o,u(b(h,l)),u(b(h,!1)))}catch(C){u(()=>{I(h,!1,C)})()}else{h[p]=l;let C=h[d];if(h[d]=o,h[A]===A&&l===U&&(h[p]=h[X],h[d]=h[V]),l===S&&o instanceof Error){let m=a.currentTask&&a.currentTask.data&&a.currentTask.data[L];m&&f(o,W,{configurable:!0,enumerable:!1,writable:!0,value:m})}for(let m=0;m{try{let O=h[d],N=!!o&&A===o[A];N&&(o[V]=O,o[X]=C);let Z=l.run(m,void 0,N&&m!==q&&m!==J?[]:[O]);I(o,!0,Z)}catch(O){I(o,!1,O)}},o)}let E="function ZoneAwarePromise() { [native code] }",x=function(){},ee=n.AggregateError;class M{static toString(){return E}static resolve(l){return l instanceof M?l:I(new this(null),U,l)}static reject(l){return I(new this(null),S,l)}static withResolvers(){let l={};return l.promise=new M((o,u)=>{l.resolve=o,l.reject=u}),l}static any(l){if(!l||typeof l[Symbol.iterator]!="function")return Promise.reject(new ee([],"All promises were rejected"));let o=[],u=0;try{for(let m of l)u++,o.push(M.resolve(m))}catch{return Promise.reject(new ee([],"All promises were rejected"))}if(u===0)return Promise.reject(new ee([],"All promises were rejected"));let v=!1,C=[];return new M((m,O)=>{for(let N=0;N{v||(v=!0,m(Z))},Z=>{C.push(Z),u--,u===0&&(v=!0,O(new ee(C,"All promises were rejected")))})})}static race(l){let o,u,v=new this((O,N)=>{o=O,u=N});function C(O){o(O)}function m(O){u(O)}for(let O of l)$(O)||(O=this.resolve(O)),O.then(C,m);return v}static all(l){return M.allWithCallback(l)}static allSettled(l){return(this&&this.prototype instanceof M?this:M).allWithCallback(l,{thenCallback:u=>({status:"fulfilled",value:u}),errorCallback:u=>({status:"rejected",reason:u})})}static allWithCallback(l,o){let u,v,C=new this((Z,G)=>{u=Z,v=G}),m=2,O=0,N=[];for(let Z of l){$(Z)||(Z=this.resolve(Z));let G=O;try{Z.then(B=>{N[G]=o?o.thenCallback(B):B,m--,m===0&&u(N)},B=>{o?(N[G]=o.errorCallback(B),m--,m===0&&u(N)):v(B)})}catch(B){v(B)}m++,O++}return m-=2,m===0&&u(N),C}constructor(l){let o=this;if(!(o instanceof M))throw new Error("Must be an instanceof Promise.");o[p]=k,o[d]=[];try{let u=D();l&&l(u(b(o,U)),u(b(o,S)))}catch(u){I(o,!1,u)}}get[Symbol.toStringTag](){return"Promise"}get[Symbol.species](){return M}then(l,o){let u=this.constructor?.[Symbol.species];(!u||typeof u!="function")&&(u=this.constructor||M);let v=new u(x),C=a.current;return this[p]==k?this[d].push(C,v,l,o):r(this,C,v,l,o),v}catch(l){return this.then(null,l)}finally(l){let o=this.constructor?.[Symbol.species];(!o||typeof o!="function")&&(o=M);let u=new o(x);u[A]=A;let v=a.current;return this[p]==k?this[d].push(v,u,l,l):r(this,v,u,l,l),u}}M.resolve=M.resolve,M.reject=M.reject,M.race=M.race,M.all=M.all;let he=n[_]=n.Promise;n.Promise=M;let _e=T("thenPatched");function Q(h){let l=h.prototype,o=c(l,"then");if(o&&(o.writable===!1||!o.configurable))return;let u=l.then;l[P]=u,h.prototype.then=function(v,C){return new M((O,N)=>{u.call(this,O,N)}).then(v,C)},h[_e]=!0}e.patchThen=Q;function Te(h){return function(l,o){let u=h.apply(l,o);if(u instanceof M)return u;let v=u.constructor;return v[_e]||Q(v),u}}return he&&(Q(he),ue(n,"fetch",h=>Te(h))),Promise[a.__symbol__("uncaughtPromiseErrors")]=y,M})}function Nt(t){t.__load_patch("toString",n=>{let a=Function.prototype.toString,e=j("OriginalDelegate"),c=j("Promise"),f=j("Error"),g=function(){if(typeof this=="function"){let _=this[e];if(_)return typeof _=="function"?a.call(_):Object.prototype.toString.call(_);if(this===Promise){let P=n[c];if(P)return a.call(P)}if(this===Error){let P=n[f];if(P)return a.call(P)}}return a.call(this)};g[e]=a,Function.prototype.toString=g;let T=Object.prototype.toString,y="[object Promise]";Object.prototype.toString=function(){return typeof Promise=="function"&&this instanceof Promise?y:T.call(this)}})}function Zt(t,n,a,e,c){let f=Zone.__symbol__(e);if(n[f])return;let g=n[f]=n[e];n[e]=function(T,y,w){return y&&y.prototype&&c.forEach(function(_){let P=`${a}.${e}::`+_,L=y.prototype;try{if(L.hasOwnProperty(_)){let H=t.ObjectGetOwnPropertyDescriptor(L,_);H&&H.value?(H.value=t.wrapWithCurrentZone(H.value,P),t._redefineProperty(y.prototype,_,H)):L[_]&&(L[_]=t.wrapWithCurrentZone(L[_],P))}else L[_]&&(L[_]=t.wrapWithCurrentZone(L[_],P))}catch{}}),g.call(n,T,y,w)},t.attachOriginToPatched(n[e],g)}function Lt(t){t.__load_patch("util",(n,a,e)=>{let c=Ie(n);e.patchOnProperties=rt,e.patchMethod=ue,e.bindArguments=Fe,e.patchMacroTask=mt;let f=a.__symbol__("BLACK_LISTED_EVENTS"),g=a.__symbol__("UNPATCHED_EVENTS");n[g]&&(n[f]=n[g]),n[f]&&(a[f]=a[g]=n[f]),e.patchEventPrototype=bt,e.patchEventTarget=vt,e.isIEOrEdge=yt,e.ObjectDefineProperty=Me,e.ObjectGetOwnPropertyDescriptor=pe,e.ObjectCreate=_t,e.ArraySlice=Tt,e.patchClass=ye,e.wrapWithCurrentZone=Ve,e.filterProperties=lt,e.attachOriginToPatched=fe,e._redefineProperty=Object.defineProperty,e.patchCallbacks=Zt,e.getGlobalObjects=()=>({globalSources:ot,zoneSymbolEventNames:ne,eventNames:c,isBrowser:Ge,isMix:nt,isNode:De,TRUE_STR:ae,FALSE_STR:le,ZONE_SYMBOL_PREFIX:ve,ADD_EVENT_LISTENER_STR:je,REMOVE_EVENT_LISTENER_STR:He})})}function It(t){Ot(t),Nt(t),Lt(t)}var ut=dt();It(ut);St(ut); diff --git a/src/google/adk/cli/browser/styles-4VDSPQ37.css b/src/google/adk/cli/browser/styles-4VDSPQ37.css deleted file mode 100644 index 05ef49a176..0000000000 --- a/src/google/adk/cli/browser/styles-4VDSPQ37.css +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright 2025 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -html{color-scheme:dark}html{--mat-sys-background: light-dark(#fcf9f8, #131314);--mat-sys-error: light-dark(#ba1a1a, #ffb4ab);--mat-sys-error-container: light-dark(#ffdad6, #93000a);--mat-sys-inverse-on-surface: light-dark(#f3f0f0, #313030);--mat-sys-inverse-primary: light-dark(#c1c7cd, #595f65);--mat-sys-inverse-surface: light-dark(#313030, #e5e2e2);--mat-sys-on-background: light-dark(#1c1b1c, #e5e2e2);--mat-sys-on-error: light-dark(#ffffff, #690005);--mat-sys-on-error-container: light-dark(#410002, #ffdad6);--mat-sys-on-primary: light-dark(#ffffff, #2b3136);--mat-sys-on-primary-container: light-dark(#161c21, #dde3e9);--mat-sys-on-primary-fixed: light-dark(#161c21, #161c21);--mat-sys-on-primary-fixed-variant: light-dark(#41474d, #41474d);--mat-sys-on-secondary: light-dark(#ffffff, #003061);--mat-sys-on-secondary-container: light-dark(#001b3c, #d5e3ff);--mat-sys-on-secondary-fixed: light-dark(#001b3c, #001b3c);--mat-sys-on-secondary-fixed-variant: light-dark(#0f4784, #0f4784);--mat-sys-on-surface: light-dark(#1c1b1c, #e5e2e2);--mat-sys-on-surface-variant: light-dark(#44474a, #e1e2e6);--mat-sys-on-tertiary: light-dark(#ffffff, #2b3136);--mat-sys-on-tertiary-container: light-dark(#161c21, #dde3e9);--mat-sys-on-tertiary-fixed: light-dark(#161c21, #161c21);--mat-sys-on-tertiary-fixed-variant: light-dark(#41474d, #41474d);--mat-sys-outline: light-dark(#74777b, #8e9194);--mat-sys-outline-variant: light-dark(#c4c7ca, #44474a);--mat-sys-primary: light-dark(#595f65, #c1c7cd);--mat-sys-primary-container: light-dark(#dde3e9, #41474d);--mat-sys-primary-fixed: light-dark(#dde3e9, #dde3e9);--mat-sys-primary-fixed-dim: light-dark(#c1c7cd, #c1c7cd);--mat-sys-scrim: light-dark(#000000, #000000);--mat-sys-secondary: light-dark(#305f9d, #a7c8ff);--mat-sys-secondary-container: light-dark(#d5e3ff, #0f4784);--mat-sys-secondary-fixed: light-dark(#d5e3ff, #d5e3ff);--mat-sys-secondary-fixed-dim: light-dark(#a7c8ff, #a7c8ff);--mat-sys-shadow: light-dark(#000000, #000000);--mat-sys-surface: light-dark(#fcf9f8, #131314);--mat-sys-surface-bright: light-dark(#fcf9f8, #393939);--mat-sys-surface-container: light-dark(#f0eded, #201f20);--mat-sys-surface-container-high: light-dark(#eae7e7, #2a2a2a);--mat-sys-surface-container-highest: light-dark(#e5e2e2, #393939);--mat-sys-surface-container-low: light-dark(#f6f3f3, #1c1b1c);--mat-sys-surface-container-lowest: light-dark(#ffffff, #0e0e0e);--mat-sys-surface-dim: light-dark(#dcd9d9, #131314);--mat-sys-surface-tint: light-dark(#595f65, #c1c7cd);--mat-sys-surface-variant: light-dark(#e1e2e6, #44474a);--mat-sys-tertiary: light-dark(#595f65, #c1c7cd);--mat-sys-tertiary-container: light-dark(#dde3e9, #41474d);--mat-sys-tertiary-fixed: light-dark(#dde3e9, #dde3e9);--mat-sys-tertiary-fixed-dim: light-dark(#c1c7cd, #c1c7cd);--mat-sys-neutral-variant20: #2d3134;--mat-sys-neutral10: #1c1b1c}html{--mat-sys-level0: 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12)}html{--mat-sys-level1: 0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12)}html{--mat-sys-level2: 0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12)}html{--mat-sys-level3: 0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12)}html{--mat-sys-level4: 0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12)}html{--mat-sys-level5: 0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12)}html{--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px}html{--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12}html{font-family:Google Sans,Helvetica Neue,sans-serif!important}body{height:100vh;margin:0}markdown p{margin-block-start:.5em;margin-block-end:.5em}:root{--mat-sys-primary: black;--mdc-checkbox-selected-icon-color: white;--mat-sys-background: #131314;--mat-tab-header-active-label-text-color: #8AB4F8;--mat-tab-header-active-hover-label-text-color: #8AB4F8;--mat-tab-header-active-focus-label-text-color: #8AB4F8;--mat-tab-header-label-text-weight: 500;--mdc-text-button-label-text-color: #89b4f8}:root{--mdc-dialog-container-color: #2b2b2f}:root{--mdc-dialog-subhead-color: white}:root{--mdc-circular-progress-active-indicator-color: #a8c7fa}:root{--mdc-circular-progress-size: 80} diff --git a/src/google/adk/cli/browser/styles-EVMPSV3U.css b/src/google/adk/cli/browser/styles-EVMPSV3U.css new file mode 100644 index 0000000000..bc44fcfbea --- /dev/null +++ b/src/google/adk/cli/browser/styles-EVMPSV3U.css @@ -0,0 +1 @@ +html{color-scheme:dark}html{--mat-sys-background: light-dark(#fcf9f8, #131314);--mat-sys-error: light-dark(#ba1a1a, #ffb4ab);--mat-sys-error-container: light-dark(#ffdad6, #93000a);--mat-sys-inverse-on-surface: light-dark(#f3f0f0, #313030);--mat-sys-inverse-primary: light-dark(#c1c7cd, #595f65);--mat-sys-inverse-surface: light-dark(#313030, #e5e2e2);--mat-sys-on-background: light-dark(#1c1b1c, #e5e2e2);--mat-sys-on-error: light-dark(#ffffff, #690005);--mat-sys-on-error-container: light-dark(#410002, #ffdad6);--mat-sys-on-primary: light-dark(#ffffff, #2b3136);--mat-sys-on-primary-container: light-dark(#161c21, #dde3e9);--mat-sys-on-primary-fixed: light-dark(#161c21, #161c21);--mat-sys-on-primary-fixed-variant: light-dark(#41474d, #41474d);--mat-sys-on-secondary: light-dark(#ffffff, #003061);--mat-sys-on-secondary-container: light-dark(#001b3c, #d5e3ff);--mat-sys-on-secondary-fixed: light-dark(#001b3c, #001b3c);--mat-sys-on-secondary-fixed-variant: light-dark(#0f4784, #0f4784);--mat-sys-on-surface: light-dark(#1c1b1c, #e5e2e2);--mat-sys-on-surface-variant: light-dark(#44474a, #e1e2e6);--mat-sys-on-tertiary: light-dark(#ffffff, #2b3136);--mat-sys-on-tertiary-container: light-dark(#161c21, #dde3e9);--mat-sys-on-tertiary-fixed: light-dark(#161c21, #161c21);--mat-sys-on-tertiary-fixed-variant: light-dark(#41474d, #41474d);--mat-sys-outline: light-dark(#74777b, #8e9194);--mat-sys-outline-variant: light-dark(#c4c7ca, #44474a);--mat-sys-primary: light-dark(#595f65, #c1c7cd);--mat-sys-primary-container: light-dark(#dde3e9, #41474d);--mat-sys-primary-fixed: light-dark(#dde3e9, #dde3e9);--mat-sys-primary-fixed-dim: light-dark(#c1c7cd, #c1c7cd);--mat-sys-scrim: light-dark(#000000, #000000);--mat-sys-secondary: light-dark(#305f9d, #a7c8ff);--mat-sys-secondary-container: light-dark(#d5e3ff, #0f4784);--mat-sys-secondary-fixed: light-dark(#d5e3ff, #d5e3ff);--mat-sys-secondary-fixed-dim: light-dark(#a7c8ff, #a7c8ff);--mat-sys-shadow: light-dark(#000000, #000000);--mat-sys-surface: light-dark(#fcf9f8, #131314);--mat-sys-surface-bright: light-dark(#fcf9f8, #393939);--mat-sys-surface-container: light-dark(#f0eded, #201f20);--mat-sys-surface-container-high: light-dark(#eae7e7, #2a2a2a);--mat-sys-surface-container-highest: light-dark(#e5e2e2, #393939);--mat-sys-surface-container-low: light-dark(#f6f3f3, #1c1b1c);--mat-sys-surface-container-lowest: light-dark(#ffffff, #0e0e0e);--mat-sys-surface-dim: light-dark(#dcd9d9, #131314);--mat-sys-surface-tint: light-dark(#595f65, #c1c7cd);--mat-sys-surface-variant: light-dark(#e1e2e6, #44474a);--mat-sys-tertiary: light-dark(#595f65, #c1c7cd);--mat-sys-tertiary-container: light-dark(#dde3e9, #41474d);--mat-sys-tertiary-fixed: light-dark(#dde3e9, #dde3e9);--mat-sys-tertiary-fixed-dim: light-dark(#c1c7cd, #c1c7cd);--mat-sys-neutral-variant20: #2d3134;--mat-sys-neutral10: #1c1b1c}html{--mat-sys-level0: 0px 0px 0px 0px rgba(0, 0, 0, .2), 0px 0px 0px 0px rgba(0, 0, 0, .14), 0px 0px 0px 0px rgba(0, 0, 0, .12)}html{--mat-sys-level1: 0px 2px 1px -1px rgba(0, 0, 0, .2), 0px 1px 1px 0px rgba(0, 0, 0, .14), 0px 1px 3px 0px rgba(0, 0, 0, .12)}html{--mat-sys-level2: 0px 3px 3px -2px rgba(0, 0, 0, .2), 0px 3px 4px 0px rgba(0, 0, 0, .14), 0px 1px 8px 0px rgba(0, 0, 0, .12)}html{--mat-sys-level3: 0px 3px 5px -1px rgba(0, 0, 0, .2), 0px 6px 10px 0px rgba(0, 0, 0, .14), 0px 1px 18px 0px rgba(0, 0, 0, .12)}html{--mat-sys-level4: 0px 5px 5px -3px rgba(0, 0, 0, .2), 0px 8px 10px 1px rgba(0, 0, 0, .14), 0px 3px 14px 2px rgba(0, 0, 0, .12)}html{--mat-sys-level5: 0px 7px 8px -4px rgba(0, 0, 0, .2), 0px 12px 17px 2px rgba(0, 0, 0, .14), 0px 5px 22px 4px rgba(0, 0, 0, .12)}html{--mat-sys-corner-extra-large: 28px;--mat-sys-corner-extra-large-top: 28px 28px 0 0;--mat-sys-corner-extra-small: 4px;--mat-sys-corner-extra-small-top: 4px 4px 0 0;--mat-sys-corner-full: 9999px;--mat-sys-corner-large: 16px;--mat-sys-corner-large-end: 0 16px 16px 0;--mat-sys-corner-large-start: 16px 0 0 16px;--mat-sys-corner-large-top: 16px 16px 0 0;--mat-sys-corner-medium: 12px;--mat-sys-corner-none: 0;--mat-sys-corner-small: 8px}html{--mat-sys-dragged-state-layer-opacity: .16;--mat-sys-focus-state-layer-opacity: .12;--mat-sys-hover-state-layer-opacity: .08;--mat-sys-pressed-state-layer-opacity: .12}html{font-family:Google Sans,Helvetica Neue,sans-serif!important}body{height:100vh;margin:0}markdown p{margin-block-start:.5em;margin-block-end:.5em}:root{--mat-sys-primary: black;--mdc-checkbox-selected-icon-color: white;--mat-sys-background: #131314;--mat-tab-header-active-label-text-color: #8AB4F8;--mat-tab-header-active-hover-label-text-color: #8AB4F8;--mat-tab-header-active-focus-label-text-color: #8AB4F8;--mat-tab-header-label-text-weight: 500;--mdc-text-button-label-text-color: #89b4f8}:root{--mdc-dialog-subhead-font-family: "Google Sans";--mdc-dialog-subhead-font-style: normal;--mdc-dialog-subhead-font-weight: 400;--mdc-dialog-subhead-font-size: 24px;--mdc-dialog-subhead-line-height: 32px;--mdc-dialog-subhead-color: #E3E3E3}:root{--mdc-dialog-container-color: #2b2b2f}:root{--mdc-dialog-subhead-color: white}.mat-mdc-dialog-container .mat-mdc-dialog-title.mdc-dialog__title{font-family:var(--mdc-dialog-subhead-font-family);font-style:var(--mdc-dialog-subhead-font-style);font-weight:var(--mdc-dialog-subhead-font-weight);font-size:var(--mdc-dialog-subhead-font-size);line-height:var(--mdc-dialog-subhead-line-height);color:var(--mdc-dialog-subhead-color)}:root{--chat-panel-function-event-button-background-color: white;--chat-panel-function-event-button-highlight-background-color: rgb( 15, 82, 35 );--chat-panel-function-event-button-highlight-border-color: rgb(15, 82, 35);--chat-panel-function-event-button-highlight-color: white;--chat-panel-user-message-message-card-background-color: #004a77;--chat-panel-user-message-message-card-color: white;--chat-panel-bot-message-message-card-background-color: #303030;--chat-panel-bot-message-message-card-color: white;--chat-panel-bot-message-focus-within-message-card-background-color: #131314;--chat-panel-bot-message-focus-within-message-card-border-color: #8ab4f8;--chat-panel-message-textarea-background-color: #303030;--chat-panel-message-textarea-focus-background-color: #131314;--chat-panel-eval-compare-container-background-color: #484848;--chat-panel-actual-result-border-right-color: #8a8686;--chat-panel-eval-response-header-border-bottom-color: #8a8686;--chat-panel-header-expected-color: #44c265;--chat-panel-header-actual-color: #ff8983;--chat-panel-eval-pass-color: #44c265;--chat-panel-eval-fail-color: #ff8983;--chat-panel-input-field-textarea-color: white;--chat-panel-input-field-textarea-placeholder-color: #8e918f;--chat-panel-input-field-textarea-caret-color: white;--chat-panel-input-field-button-color: white;--chat-panel-input-field-button-background-color: rgb(51, 53, 55);--chat-panel-mat-mdc-mini-fab-background-color: white;--chat-panel-mat-mdc-mini-fab-mat-icon-color: black;--chat-panel-input-field-mat-mdc-text-field-wrapper-border-color: #8e918f;--chat-panel-delete-button-background-color: rgba(0, 0, 0, .7);--chat-panel-delete-button-color: white;--chat-panel-file-container-background-color: #1e1e1e;--chat-panel-thought-chip-background-color: #8ab4f8;--chat-panel-link-style-button-color: #007bff;--artifact-tab-download-button-background-color: #8ab4f8;--artifact-tab-white-separator-border-top-color: white;--artifact-tab-version-select-container-background-color: #212123;--artifact-tab-link-style-button-color: #007bff;--artifact-tab-link-style-button-hover-color: #0056b3;--artifact-tab-link-style-button-focus-outline-color: #007bff;--artifact-tab-link-style-button-active-color: #004085;--artifact-tab-link-style-button-disabled-color: #6c757d;--audio-player-container-background-color: #f0f0f0;--audio-player-container-box-shadow-color: rgba(0, 0, 0, .1);--audio-player-custom-controls-button-background-color: #007bff;--audio-player-custom-controls-button-color: white;--audio-player-custom-controls-button-hover-background-color: #0056b3;--chat-drawer-container-background-color: #131314;--chat-event-container-color: white;--chat-card-background-color: #131314;--chat-function-event-button-background-color: white;--chat-function-event-button-highlight-background-color: rgb(15, 82, 35);--chat-function-event-button-highlight-border-color: rgb(15, 82, 35);--chat-function-event-button-highlight-color: white;--chat-user-message-message-card-background-color: #004a77;--chat-user-message-message-card-color: white;--chat-bot-message-message-card-background-color: #303030;--chat-bot-message-message-card-color: white;--chat-bot-message-focus-within-message-card-background-color: #131314;--chat-bot-message-focus-within-message-card-border-color: #8ab4f8;--chat-message-textarea-background-color: #303030;--chat-message-textarea-focus-background-color: #131314;--chat-eval-compare-container-background-color: #484848;--chat-actual-result-border-right-color: #8a8686;--chat-eval-response-header-border-bottom-color: #8a8686;--chat-header-expected-color: #44c265;--chat-header-actual-color: #ff8983;--chat-eval-pass-color: #44c265;--chat-eval-fail-color: #ff8983;--chat-side-drawer-background-color: #1b1b1b;--chat-side-drawer-color: white;--chat-file-item-background-color: #eee;--chat-empty-state-container-color: #eee;--chat-warning-color: #ffc185;--chat-error-color: #ff4545;--chat-mat-mdc-unelevated-button-color: #202124;--chat-mat-mdc-unelevated-button-background-color: #8ab4f8;--chat-mdc-linear-progress-buffer-dots-background-color: white;--chat-mat-mdc-text-field-wrapper-border-color: #8e918f;--chat-segment-key-color: lightgray;--chat-bottom-resize-handler-background-color: #5f6368;--chat-trace-detail-container-background-color: #1b1b1b;--chat-toolbar-background-color: #1b1b1b;--chat-toolbar-edit-mode-background-color: #44c2651a;--chat-toolbar-session-text-color: #fdfdfd;--chat-toolbar-session-id-color: #9aa0a6;--chat-toolbar-icon-color: #c4c7c5;--chat-toolbar-new-session-color: #9aa0a6;--chat-toolbar-sse-toggle-label-text-color: #9aa0a6;--chat-toolbar-sse-toggle-selected-track-color: #8ab4f9;--chat-toolbar-sse-toggle-selected-handle-color: #1b73e8;--chat-toolbar-sse-toggle-track-outline-color: #1b73e8;--chat-mat-drawer-border-right-color: #444746;--edit-json-dialog-container-box-shadow-color: rgba(0, 0, 0, .4);--eval-tab-eval-set-actions-color: #9aa0a6;--eval-tab-empty-eval-info-background-color: #202124;--eval-tab-empty-eval-info-box-shadow-color1: rgba(0, 0, 0, .15);--eval-tab-empty-eval-info-box-shadow-color2: rgba(0, 0, 0, .3);--eval-tab-info-title-color: #e8eaed;--eval-tab-info-detail-color: #e8eaed;--eval-tab-info-create-color: #8ab4f8;--eval-tab-selected-eval-case-color: #8ab4f8;--eval-tab-save-session-btn-background-color1: rgba(138, 180, 248, .24);--eval-tab-save-session-btn-background-color2: #202124;--eval-tab-save-session-btn-text-color: #d2e3fc;--eval-tab-run-eval-btn-border-color: #5f6368;--eval-tab-run-eval-btn-color: #8ab4f8;--eval-tab-run-eval-btn-hover-background-color: #202124;--eval-tab-result-btn-border-color: #5f6368;--eval-tab-result-btn-hover-background-color: #202124;--eval-tab-result-btn-pass-color: #44c265;--eval-tab-result-btn-fail-color: #ff8983;--eval-tab-status-card-background-color: #2d2d2d;--eval-tab-status-card-timestamp-color: #e0e0e0;--eval-tab-status-card-metric-color: #bbb;--eval-tab-status-card-failed-color: #ff6b6b;--eval-tab-status-card-separator-color: #666;--eval-tab-status-card-passed-color: #63e6be;--eval-tab-status-card-action-mat-icon-color: #bdbdbd;--eval-tab-status-card-icon-color: #bdbdbd;--run-eval-config-dialog-container-box-shadow-color: rgba(0, 0, 0, .4);--run-eval-config-dialog-threshold-slider-active-track-color: #4285f4;--run-eval-config-dialog-threshold-slider-inactive-track-color: #616161;--run-eval-config-dialog-threshold-slider-handle-color: #4285f4;--run-eval-config-dialog-threshold-slider-ripple-color: #4285f4;--run-eval-config-dialog-mdc-slider-thumb-background-color: black;--event-tab-events-wrapper-color: #9aa0a6;--event-tab-event-index-color: #80868b;--event-tab-event-list-active-indicator-color: orange;--event-tab-event-list-list-item-container-color: #2b2b2f;--event-tab-mdc-list-item-border-color: #5f6368;--event-tab-mdc-list-item-hover-background-color: #1c1b1c;--trace-chart-trace-label-color: #e3e3e3;--trace-chart-trace-bar-background-color: #2f4d65;--trace-chart-trace-bar-color: #8dabbf;--trace-chart-trace-duration-color: #888;--trace-chart-vertical-line-background-color: #ccc;--trace-chart-horizontal-line-background-color: #ccc;--session-tab-session-wrapper-color: #9aa0a6;--session-tab-session-item-background-color: #303030;--session-tab-session-item-hover-background-color: #141414;--session-tab-session-item-current-background-color: #004a77;--session-tab-session-id-color: #e8eaed;--session-tab-session-date-color: #9aa0a6;--side-panel-button-filled-container-color: #89b4f8;--side-panel-button-filled-label-text-color: black;--side-panel-mat-icon-color: #bdc1c6;--side-panel-resize-handler-background-color: #5f6368;--side-panel-details-panel-container-background-color: #242424;--side-panel-details-content-color: white;--side-panel-powered-by-adk-color: grey;--side-panel-app-select-container-background-color: #212123;--side-panel-select-placeholder-text-color: #8ab4f8;--side-panel-select-enabled-trigger-text-color: #8ab4f8;--side-panel-select-enabled-arrow-color: #8ab4f8;--side-panel-app-name-option-color: #9aa0a6;--trace-tab-trace-title-color: #9aa0a6;--trace-tab-trace-label-color: #e3e3e3;--trace-tab-trace-bar-background-color: #2f4d65;--trace-tab-trace-bar-color: #8dabbf;--trace-tab-trace-duration-color: #888;--trace-tab-vertical-line-background-color: #ccc;--trace-tab-horizontal-line-background-color: #ccc;--trace-tab-trace-item-container-background-color: #333537;--trace-tab-trace-item-header-focus-state-layer-color: red;--trace-tab-trace-item-header-description-color: #8e918f;--trace-tab-mat-expansion-panel-header-focus-background-color: #444746;--trace-tab-mat-expansion-panel-header-background-color: #444746;--trace-tab-mat-expansion-panel-header-hover-background-color: #444746;--trace-event-json-viewer-container-background-color: #1b1b1b;--trace-tree-trace-label-color: #e3e3e3;--trace-tree-trace-bar-background-color: #2f4d65;--trace-tree-trace-bar-color: #8dabbf;--trace-tree-short-trace-bar-duration-color: #8dabbf;--trace-tree-trace-duration-color: #888;--trace-tree-trace-row-hover-background-color: #3b3d3c;--trace-tree-trace-row-selected-background-color: #3b3d3c;--trace-tree-vertical-line-background-color: #ccc;--trace-tree-horizontal-line-background-color: #ccc;--trace-tree-invocation-id-container-color: #9aa0a6;--trace-tree-trace-row-left-span-div-color: white;--trace-tree-trace-row-left-is-event-row-color: #8ab4f8}:root{--mdc-circular-progress-active-indicator-color: #a8c7fa}:root{--mdc-circular-progress-size: 80}:root{--mat-form-field-disabled-input-text-placeholder-color: orange}:root{--mdc-filled-text-field-active-indicator-color: red}:root{--mdc-outlined-text-field-outline-color: #cccccc}:root{--mdc-outlined-text-field-input-text-color: #cccccc}:root{--mdc-outlined-text-field-label-text-color: #cccccc}:root{--mdc-outlined-text-field-hover-label-text-color: #cccccc}:root{--mdc-outlined-text-field-focus-label-text-color: #cccccc}:root{--mdc-outlined-text-field-disabled-label-text-color: #cccccc}:root{--mdc-outlined-text-field-disabled-input-text-color: #cccccc}:root{--mdc-outlined-text-field-disabled-outline-color: #cccccc}:root{--mdc-outlined-text-field-caret-color: #cccccc}.mdc-line-ripple{display:none} diff --git a/src/google/adk/cli/cli.py b/src/google/adk/cli/cli.py index c14bd7836e..97ffd98999 100644 --- a/src/google/adk/cli/cli.py +++ b/src/google/adk/cli/cli.py @@ -34,6 +34,7 @@ from ..sessions.in_memory_session_service import InMemorySessionService from ..sessions.session import Session from ..utils.context_utils import Aclosing +from ..utils.env_utils import is_env_enabled from .utils import envs from .utils.agent_loader import AgentLoader @@ -160,7 +161,8 @@ async def run_cli( root_agent = AgentLoader(agents_dir=agent_parent_dir).load_agent( agent_folder_name ) - envs.load_dotenv_for_agent(agent_folder_name, agent_parent_dir) + if not is_env_enabled('ADK_DISABLE_LOAD_DOTENV'): + envs.load_dotenv_for_agent(agent_folder_name, agent_parent_dir) if input_file: session = await run_input_file( app_name=agent_folder_name, @@ -181,10 +183,7 @@ async def run_cli( content = event.content if not content or not content.parts or not content.parts[0].text: continue - if event.author == 'user': - click.echo(f'[user]: {content.parts[0].text}') - else: - click.echo(f'[{event.author}]: {content.parts[0].text}') + click.echo(f'[{event.author}]: {content.parts[0].text}') await run_interactively( root_agent, diff --git a/src/google/adk/cli/cli_deploy.py b/src/google/adk/cli/cli_deploy.py index d26b3c9660..335c786b9f 100644 --- a/src/google/adk/cli/cli_deploy.py +++ b/src/google/adk/cli/cli_deploy.py @@ -13,6 +13,7 @@ # limitations under the License. from __future__ import annotations +from datetime import datetime import json import os import shutil @@ -63,7 +64,7 @@ """ _AGENT_ENGINE_APP_TEMPLATE: Final[str] = """ -from vertexai.preview.reasoning_engines import AdkApp +from vertexai.agent_engines import AdkApp if {is_config_agent}: from google.adk.agents import config_agent_utils @@ -74,14 +75,298 @@ # This path is used to support the file structure in Agent Engine. root_agent = config_agent_utils.from_config("./{temp_folder}/{app_name}/root_agent.yaml") else: - from {app_name}.agent import root_agent + from .agent import {adk_app_object} + +if {express_mode}: # Whether or not to use Express Mode + import os + import vertexai + vertexai.init(api_key=os.environ.get("GOOGLE_API_KEY")) adk_app = AdkApp( - agent=root_agent, - enable_tracing={trace_to_cloud_option}, + {adk_app_type}={adk_app_object}, + enable_tracing={trace_to_cloud_option}, ) """ +_AGENT_ENGINE_CLASS_METHODS = [ + { + 'name': 'get_session', + 'description': ( + 'Deprecated. Use async_get_session instead.\n\n Get a' + ' session for the given user.\n ' + ), + 'parameters': { + 'properties': { + 'user_id': {'type': 'string'}, + 'session_id': {'type': 'string'}, + }, + 'required': ['user_id', 'session_id'], + 'type': 'object', + }, + 'api_mode': '', + }, + { + 'name': 'list_sessions', + 'description': ( + 'Deprecated. Use async_list_sessions instead.\n\n List' + ' sessions for the given user.\n ' + ), + 'parameters': { + 'properties': {'user_id': {'type': 'string'}}, + 'required': ['user_id'], + 'type': 'object', + }, + 'api_mode': '', + }, + { + 'name': 'create_session', + 'description': ( + 'Deprecated. Use async_create_session instead.\n\n Creates a' + ' new session.\n ' + ), + 'parameters': { + 'properties': { + 'user_id': {'type': 'string'}, + 'session_id': {'type': 'string', 'nullable': True}, + 'state': {'type': 'object', 'nullable': True}, + }, + 'required': ['user_id'], + 'type': 'object', + }, + 'api_mode': '', + }, + { + 'name': 'delete_session', + 'description': ( + 'Deprecated. Use async_delete_session instead.\n\n Deletes a' + ' session for the given user.\n ' + ), + 'parameters': { + 'properties': { + 'user_id': {'type': 'string'}, + 'session_id': {'type': 'string'}, + }, + 'required': ['user_id', 'session_id'], + 'type': 'object', + }, + 'api_mode': '', + }, + { + 'name': 'async_get_session', + 'description': ( + 'Get a session for the given user.\n\n Args:\n ' + ' user_id (str):\n Required. The ID of the user.\n ' + ' session_id (str):\n Required. The ID of' + ' the session.\n **kwargs (dict[str, Any]):\n ' + ' Optional. Additional keyword arguments to pass to the\n ' + ' session service.\n\n Returns:\n ' + ' Session: The session instance (if any). It returns None if the\n ' + ' session is not found.\n\n Raises:\n ' + ' RuntimeError: If the session is not found.\n ' + ), + 'parameters': { + 'properties': { + 'user_id': {'type': 'string'}, + 'session_id': {'type': 'string'}, + }, + 'required': ['user_id', 'session_id'], + 'type': 'object', + }, + 'api_mode': 'async', + }, + { + 'name': 'async_list_sessions', + 'description': ( + 'List sessions for the given user.\n\n Args:\n ' + ' user_id (str):\n Required. The ID of the user.\n ' + ' **kwargs (dict[str, Any]):\n Optional.' + ' Additional keyword arguments to pass to the\n ' + ' session service.\n\n Returns:\n ' + ' ListSessionsResponse: The list of sessions.\n ' + ), + 'parameters': { + 'properties': {'user_id': {'type': 'string'}}, + 'required': ['user_id'], + 'type': 'object', + }, + 'api_mode': 'async', + }, + { + 'name': 'async_create_session', + 'description': ( + 'Creates a new session.\n\n Args:\n user_id' + ' (str):\n Required. The ID of the user.\n ' + ' session_id (str):\n Optional. The ID of the' + ' session. If not provided, an ID\n will be be' + ' generated for the session.\n state (dict[str, Any]):\n' + ' Optional. The initial state of the session.\n ' + ' **kwargs (dict[str, Any]):\n Optional.' + ' Additional keyword arguments to pass to the\n ' + ' session service.\n\n Returns:\n Session: The' + ' newly created session instance.\n ' + ), + 'parameters': { + 'properties': { + 'user_id': {'type': 'string'}, + 'session_id': {'type': 'string', 'nullable': True}, + 'state': {'type': 'object', 'nullable': True}, + }, + 'required': ['user_id'], + 'type': 'object', + }, + 'api_mode': 'async', + }, + { + 'name': 'async_delete_session', + 'description': ( + 'Deletes a session for the given user.\n\n Args:\n ' + ' user_id (str):\n Required. The ID of the user.\n ' + ' session_id (str):\n Required. The ID of' + ' the session.\n **kwargs (dict[str, Any]):\n ' + ' Optional. Additional keyword arguments to pass to the\n ' + ' session service.\n ' + ), + 'parameters': { + 'properties': { + 'user_id': {'type': 'string'}, + 'session_id': {'type': 'string'}, + }, + 'required': ['user_id', 'session_id'], + 'type': 'object', + }, + 'api_mode': 'async', + }, + { + 'name': 'async_add_session_to_memory', + 'description': ( + 'Generates memories.\n\n Args:\n session' + ' (Dict[str, Any]):\n Required. The session to use' + ' for generating memories. It should\n be a' + ' dictionary representing an ADK Session object, e.g.\n ' + ' session.model_dump(mode="json").\n ' + ), + 'parameters': { + 'properties': { + 'session': {'additionalProperties': True, 'type': 'object'} + }, + 'required': ['session'], + 'type': 'object', + }, + 'api_mode': 'async', + }, + { + 'name': 'async_search_memory', + 'description': ( + 'Searches memories for the given user.\n\n Args:\n ' + ' user_id: The id of the user.\n query: The query to' + ' match the memories on.\n\n Returns:\n A' + ' SearchMemoryResponse containing the matching memories.\n ' + ), + 'parameters': { + 'properties': { + 'user_id': {'type': 'string'}, + 'query': {'type': 'string'}, + }, + 'required': ['user_id', 'query'], + 'type': 'object', + }, + 'api_mode': 'async', + }, + { + 'name': 'stream_query', + 'description': ( + 'Deprecated. Use async_stream_query instead.\n\n Streams' + ' responses from the ADK application in response to a message.\n\n ' + ' Args:\n message (Union[str, Dict[str, Any]]):\n ' + ' Required. The message to stream responses for.\n ' + ' user_id (str):\n Required. The ID of the' + ' user.\n session_id (str):\n Optional.' + ' The ID of the session. If not provided, a new\n ' + ' session will be created for the user.\n run_config' + ' (Optional[Dict[str, Any]]):\n Optional. The run' + ' config to use for the query. If you want to\n pass' + ' in a `run_config` pydantic object, you can pass in a dict\n ' + ' representing it as' + ' `run_config.model_dump(mode="json")`.\n **kwargs' + ' (dict[str, Any]):\n Optional. Additional keyword' + ' arguments to pass to the\n runner.\n\n ' + ' Yields:\n The output of querying the ADK' + ' application.\n ' + ), + 'parameters': { + 'properties': { + 'message': { + 'anyOf': [ + {'type': 'string'}, + {'additionalProperties': True, 'type': 'object'}, + ] + }, + 'user_id': {'type': 'string'}, + 'session_id': {'type': 'string', 'nullable': True}, + 'run_config': {'type': 'object', 'nullable': True}, + }, + 'required': ['message', 'user_id'], + 'type': 'object', + }, + 'api_mode': 'stream', + }, + { + 'name': 'async_stream_query', + 'description': ( + 'Streams responses asynchronously from the ADK application.\n\n ' + ' Args:\n message (str):\n Required.' + ' The message to stream responses for.\n user_id' + ' (str):\n Required. The ID of the user.\n ' + ' session_id (str):\n Optional. The ID of the' + ' session. If not provided, a new\n session will be' + ' created for the user.\n run_config (Optional[Dict[str,' + ' Any]]):\n Optional. The run config to use for the' + ' query. If you want to\n pass in a `run_config`' + ' pydantic object, you can pass in a dict\n ' + ' representing it as `run_config.model_dump(mode="json")`.\n ' + ' **kwargs (dict[str, Any]):\n Optional.' + ' Additional keyword arguments to pass to the\n ' + ' runner.\n\n Yields:\n Event dictionaries' + ' asynchronously.\n ' + ), + 'parameters': { + 'properties': { + 'message': { + 'anyOf': [ + {'type': 'string'}, + {'additionalProperties': True, 'type': 'object'}, + ] + }, + 'user_id': {'type': 'string'}, + 'session_id': {'type': 'string', 'nullable': True}, + 'run_config': {'type': 'object', 'nullable': True}, + }, + 'required': ['message', 'user_id'], + 'type': 'object', + }, + 'api_mode': 'async_stream', + }, + { + 'name': 'streaming_agent_run_with_events', + 'description': ( + 'Streams responses asynchronously from the ADK application.\n\n ' + ' In general, you should use `async_stream_query` instead, as it' + ' has a\n more structured API and works with the respective' + ' ADK services that\n you have defined for the AdkApp. This' + ' method is primarily meant for\n invocation from' + ' AgentSpace.\n\n Args:\n request_json (str):\n ' + ' Required. The request to stream responses for.\n ' + ' ' + ), + 'parameters': { + 'properties': {'request_json': {'type': 'string'}}, + 'required': ['request_json'], + 'type': 'object', + }, + 'api_mode': 'async_stream', + }, +] + def _resolve_project(project_in_option: Optional[str]) -> str: if project_in_option: @@ -342,10 +627,12 @@ def to_cloud_run( def to_agent_engine( *, agent_folder: str, - temp_folder: str, + temp_folder: Optional[str] = None, adk_app: str, staging_bucket: str, - trace_to_cloud: bool, + trace_to_cloud: Optional[bool] = None, + api_key: Optional[str] = None, + adk_app_object: Optional[str] = None, agent_engine_id: Optional[str] = None, absolutize_imports: bool = True, project: Optional[str] = None, @@ -370,12 +657,11 @@ def to_agent_engine( The contents of `adk_app` should look something like: ``` - from agent import root_agent - from vertexai.preview.reasoning_engines import AdkApp + from agent import + from vertexai.agent_engines import AdkApp adk_app = AdkApp( - agent=root_agent, - enable_tracing=True, + agent=, # or `app=` ) ``` @@ -388,6 +674,11 @@ def to_agent_engine( instance. staging_bucket (str): The GCS bucket for staging the deployment artifacts. trace_to_cloud (bool): Whether to enable Cloud Trace. + api_key (str): Optional. The API key to use for Express Mode. + If not provided, the API key from the GOOGLE_API_KEY environment variable + will be used. It will only be used if GOOGLE_GENAI_USE_VERTEXAI is true. + adk_app_object (str): Optional. The Python object corresponding to the root + ADK agent or app. Defaults to `root_agent` if not specified. agent_engine_id (str): Optional. The ID of the Agent Engine instance to update. If not specified, a new Agent Engine instance will be created. absolutize_imports (bool): Optional. Default is True. Whether to absolutize @@ -409,7 +700,22 @@ def to_agent_engine( `agent_folder` will be used. """ app_name = os.path.basename(agent_folder) - agent_src_path = os.path.join(temp_folder, app_name) + display_name = display_name or app_name + parent_folder = os.path.dirname(agent_folder) + if parent_folder != os.getcwd(): + click.echo(f'Please deploy from the project dir: {parent_folder}') + return + tmp_app_name = app_name + '_tmp' + datetime.now().strftime('%Y%m%d_%H%M%S') + temp_folder = temp_folder or tmp_app_name + agent_src_path = os.path.join(parent_folder, temp_folder) + click.echo(f'Staging all files in: {agent_src_path}') + adk_app_object = adk_app_object or 'root_agent' + if adk_app_object not in ['root_agent', 'app']: + click.echo( + f'Invalid adk_app_object: {adk_app_object}. Please use "root_agent"' + ' or "app".' + ) + return # remove agent_src_path if it exists if os.path.exists(agent_src_path): click.echo('Removing existing files') @@ -427,17 +733,12 @@ def to_agent_engine( shutil.copytree(agent_folder, agent_src_path, ignore=ignore_patterns) click.echo('Copying agent source code complete.') - click.echo('Initializing Vertex AI...') - import sys - - import vertexai - from vertexai import agent_engines - - sys.path.append(temp_folder) # To register the adk_app operations project = _resolve_project(project) click.echo('Resolving files and dependencies...') agent_config = {} + if staging_bucket: + agent_config['staging_bucket'] = staging_bucket if not agent_engine_config_file: # Attempt to read the agent engine config from .agent_engine_config.json in the dir (if any). agent_engine_config_file = os.path.join( @@ -460,10 +761,6 @@ def to_agent_engine( f'Overriding description in agent engine config with {description}' ) agent_config['description'] = description - if agent_config.get('extra_packages'): - agent_config['extra_packages'].append(temp_folder) - else: - agent_config['extra_packages'] = [temp_folder] if not requirements_file: # Attempt to read requirements from requirements.txt in the dir (if any). @@ -471,21 +768,26 @@ def to_agent_engine( if not os.path.exists(requirements_txt_path): click.echo(f'Creating {requirements_txt_path}...') with open(requirements_txt_path, 'w', encoding='utf-8') as f: - f.write('google-cloud-aiplatform[adk,agent_engines]') + f.write( + 'google-cloud-aiplatform[adk,agent_engines] @ ' + 'git+https://github.com/googleapis/python-aiplatform.git@' + 'bf1851e59cb34e63b509a2a610e72691e1c4ca28' + ) click.echo(f'Created {requirements_txt_path}') - agent_config['requirements'] = agent_config.get( + agent_config['requirements_file'] = agent_config.get( 'requirements', requirements_txt_path, ) else: - if 'requirements' in agent_config: + if 'requirements_file' in agent_config: click.echo( 'Overriding requirements in agent engine config with ' f'{requirements_file}' ) - agent_config['requirements'] = requirements_file + agent_config['requirements_file'] = requirements_file + agent_config['requirements_file'] = f'{temp_folder}/requirements.txt' - env_vars = None + env_vars = {} if not env_file: # Attempt to read the env variables from .env in the dir (if any). env_file = os.path.join(agent_folder, '.env') @@ -518,6 +820,20 @@ def to_agent_engine( else: region = env_region click.echo(f'{region=} set by GOOGLE_CLOUD_LOCATION in {env_file}') + if api_key: + if 'GOOGLE_API_KEY' in env_vars: + click.secho( + 'Ignoring GOOGLE_API_KEY in .env as `--api_key` was' + ' explicitly passed and takes precedence', + fg='yellow', + ) + else: + env_vars['GOOGLE_GENAI_USE_VERTEXAI'] = '1' + env_vars['GOOGLE_API_KEY'] = api_key + elif not project: + if 'GOOGLE_API_KEY' in env_vars: + api_key = env_vars['GOOGLE_API_KEY'] + click.echo(f'api_key set by GOOGLE_API_KEY in {env_file}') if env_vars: if 'env_vars' in agent_config: click.echo( @@ -527,11 +843,20 @@ def to_agent_engine( # Set env_vars in agent_config to None if it is not set. agent_config['env_vars'] = agent_config.get('env_vars', env_vars) - vertexai.init( - project=project, - location=region, - staging_bucket=staging_bucket, - ) + import vertexai + + if project and region: + click.echo('Initializing Vertex AI...') + client = vertexai.Client(project=project, location=region) + elif api_key: + click.echo('Initializing Vertex AI in Express Mode with API key...') + client = vertexai.Client(api_key=api_key) + else: + click.echo( + 'No project/region or api_key provided. ' + 'Please specify either project/region or api_key.' + ) + return click.echo('Vertex AI initialized.') is_config_agent = False @@ -541,6 +866,16 @@ def to_agent_engine( is_config_agent = True adk_app_file = os.path.join(temp_folder, f'{adk_app}.py') + if adk_app_object == 'root_agent': + adk_app_type = 'agent' + elif adk_app_object == 'app': + adk_app_type = 'app' + else: + click.echo( + f'Invalid adk_app_object: {adk_app_object}. Please use "root_agent"' + ' or "app".' + ) + return with open(adk_app_file, 'w', encoding='utf-8') as f: f.write( _AGENT_ENGINE_APP_TEMPLATE.format( @@ -549,55 +884,36 @@ def to_agent_engine( is_config_agent=is_config_agent, temp_folder=temp_folder, agent_folder=agent_folder, + adk_app_object=adk_app_object, + adk_app_type=adk_app_type, + express_mode=api_key is not None, ) ) click.echo(f'Created {adk_app_file}') click.echo('Files and dependencies resolved') if absolutize_imports: - for root, _, files in os.walk(agent_src_path): - for file in files: - if file.endswith('.py'): - absolutize_imports_path = os.path.join(root, file) - try: - click.echo( - f'Running `absolufy-imports {absolutize_imports_path}`' - ) - subprocess.run( - ['absolufy-imports', absolutize_imports_path], - cwd=temp_folder, - ) - except Exception as e: - click.echo(f'The following exception was raised: {e}') - + click.echo( + 'Agent Engine deployments have switched to source-based deployment, ' + 'so it is no longer necessary to absolutize imports.' + ) click.echo('Deploying to agent engine...') - agent_config['agent_engine'] = agent_engines.ModuleAgent( - module_name=adk_app, - agent_name='adk_app', - register_operations={ - '': [ - 'get_session', - 'list_sessions', - 'create_session', - 'delete_session', - ], - 'async': [ - 'async_get_session', - 'async_list_sessions', - 'async_create_session', - 'async_delete_session', - ], - 'async_stream': ['async_stream_query'], - 'stream': ['stream_query', 'streaming_agent_run_with_events'], - }, - sys_paths=[temp_folder[1:]], - agent_framework='google-adk', - ) + agent_config['entrypoint_module'] = f'{temp_folder}.{adk_app}' + agent_config['entrypoint_object'] = 'adk_app' + agent_config['source_packages'] = [temp_folder] + agent_config['class_methods'] = _AGENT_ENGINE_CLASS_METHODS + agent_config['agent_framework'] = 'google-adk' if not agent_engine_id: - agent_engines.create(**agent_config) + agent_engine = client.agent_engines.create(config=agent_config) + click.secho( + f'✅ Created agent engine: {agent_engine.api_resource.name}', + fg='green', + ) else: - resource_name = f'projects/{project}/locations/{region}/reasoningEngines/{agent_engine_id}' - agent_engines.update(resource_name=resource_name, **agent_config) + if project and region and not agent_engine_id.startswith('projects/'): + agent_engine_id = f'projects/{project}/locations/{region}/agentEngines/{agent_engine_id}' + client.agent_engines.update(name=agent_engine_id, config=agent_config) + click.secho(f'✅ Updated agent engine: {agent_engine_id}', fg='green') finally: click.echo(f'Cleaning up the temp folder: {temp_folder}') shutil.rmtree(temp_folder) diff --git a/src/google/adk/cli/cli_eval.py b/src/google/adk/cli/cli_eval.py index 6914125d6c..cce160ae36 100644 --- a/src/google/adk/cli/cli_eval.py +++ b/src/google/adk/cli/cli_eval.py @@ -15,38 +15,27 @@ from __future__ import annotations import importlib.util -import inspect -import json import logging import os import sys from typing import Any -from typing import AsyncGenerator from typing import Optional -import uuid -from typing_extensions import deprecated +import click +from google.genai import types as genai_types from ..agents.llm_agent import Agent -from ..artifacts.base_artifact_service import BaseArtifactService from ..evaluation.base_eval_service import BaseEvalService from ..evaluation.base_eval_service import EvaluateConfig from ..evaluation.base_eval_service import EvaluateRequest -from ..evaluation.base_eval_service import InferenceConfig from ..evaluation.base_eval_service import InferenceRequest from ..evaluation.base_eval_service import InferenceResult from ..evaluation.constants import MISSING_EVAL_DEPENDENCIES_MESSAGE -from ..evaluation.eval_case import EvalCase -from ..evaluation.eval_config import BaseCriterion -from ..evaluation.eval_config import EvalConfig +from ..evaluation.eval_case import get_all_tool_calls +from ..evaluation.eval_case import IntermediateDataType from ..evaluation.eval_metrics import EvalMetric -from ..evaluation.eval_metrics import EvalMetricResult -from ..evaluation.eval_metrics import EvalMetricResultPerInvocation -from ..evaluation.eval_metrics import JudgeModelOptions from ..evaluation.eval_result import EvalCaseResult -from ..evaluation.evaluator import EvalStatus -from ..evaluation.evaluator import Evaluator -from ..sessions.base_session_service import BaseSessionService +from ..evaluation.eval_sets_manager import EvalSetsManager from ..utils.context_utils import Aclosing logger = logging.getLogger("google_adk." + __name__) @@ -66,10 +55,6 @@ RESPONSE_MATCH_SCORE_KEY: 0.8, } -_DEFAULT_EVAL_CONFIG = EvalConfig( - criteria={"tool_trajectory_avg_score": 1.0, "response_match_score": 0.8} -) - def _import_from_path(module_name, file_path): spec = importlib.util.spec_from_file_location(module_name, file_path) @@ -85,52 +70,6 @@ def _get_agent_module(agent_module_file_path: str): return _import_from_path(module_name, file_path) -def get_evaluation_criteria_or_default( - eval_config_file_path: str, -) -> EvalConfig: - """Returns EvalConfig read from the config file, if present. - - Otherwise a default one is returned. - """ - if eval_config_file_path: - with open(eval_config_file_path, "r", encoding="utf-8") as f: - content = f.read() - return EvalConfig.model_validate_json(content) - - logger.info("No config file supplied. Using default criteria.") - return _DEFAULT_EVAL_CONFIG - - -def get_eval_metrics_from_config(eval_config: EvalConfig) -> list[EvalMetric]: - """Returns a list of EvalMetrics mapped from the EvalConfig.""" - eval_metric_list = [] - if eval_config.criteria: - for metric_name, criterion in eval_config.criteria.items(): - if isinstance(criterion, float): - eval_metric_list.append( - EvalMetric( - metric_name=metric_name, - threshold=criterion, - criterion=BaseCriterion(threshold=criterion), - ) - ) - elif isinstance(criterion, BaseCriterion): - eval_metric_list.append( - EvalMetric( - metric_name=metric_name, - threshold=criterion.threshold, - criterion=criterion, - ) - ) - else: - raise ValueError( - f"Unexpected criterion type. {type(criterion).__name__} not" - " supported." - ) - - return eval_metric_list - - def get_root_agent(agent_module_file_path: str) -> Agent: """Returns root agent given the agent module.""" agent_module = _get_agent_module(agent_module_file_path) @@ -218,168 +157,138 @@ async def _collect_eval_results( return eval_results -@deprecated( - "This method is deprecated and will be removed in fututre release. Please" - " use LocalEvalService to define your custom evals." -) -async def run_evals( - eval_cases_by_eval_set_id: dict[str, list[EvalCase]], - root_agent: Agent, - reset_func: Optional[Any], - eval_metrics: list[EvalMetric], - session_service: Optional[BaseSessionService] = None, - artifact_service: Optional[BaseArtifactService] = None, -) -> AsyncGenerator[EvalCaseResult, None]: - """Returns a stream of EvalCaseResult for each eval case that was evaluated. +def _convert_content_to_text( + content: Optional[genai_types.Content], +) -> str: + if content and content.parts: + return "\n".join([p.text for p in content.parts if p.text]) + return "" - Args: - eval_cases_by_eval_set_id: Eval cases categorized by eval set id to which - they belong. - root_agent: Agent to use for inferencing. - reset_func: If present, this will be called before invoking the agent before - every inferencing step. - eval_metrics: A list of metrics that should be used during evaluation. - session_service: The session service to use during inferencing. - artifact_service: The artifact service to use during inferencing. - """ + +def _convert_tool_calls_to_text( + intermediate_data: Optional[IntermediateDataType], +) -> str: + tool_calls = get_all_tool_calls(intermediate_data) + return "\n".join([str(t) for t in tool_calls]) + + +def pretty_print_eval_result(eval_result: EvalCaseResult): + """Pretty prints eval result.""" try: - from ..evaluation.evaluation_generator import EvaluationGenerator + import pandas as pd + from tabulate import tabulate except ModuleNotFoundError as e: raise ModuleNotFoundError(MISSING_EVAL_DEPENDENCIES_MESSAGE) from e - for eval_set_id, eval_cases in eval_cases_by_eval_set_id.items(): - for eval_case in eval_cases: - eval_name = eval_case.eval_id - initial_session = eval_case.session_input - user_id = initial_session.user_id if initial_session else "test_user_id" - - try: - print(f"Running Eval: {eval_set_id}:{eval_name}") - session_id = f"{EVAL_SESSION_ID_PREFIX}{str(uuid.uuid4())}" - - inference_result = ( - await EvaluationGenerator._generate_inferences_from_root_agent( - invocations=eval_case.conversation, - root_agent=root_agent, - reset_func=reset_func, - initial_session=initial_session, - session_id=session_id, - session_service=session_service, - artifact_service=artifact_service, - ) + click.echo(f"Eval Set Id: {eval_result.eval_set_id}") + click.echo(f"Eval Id: {eval_result.eval_id}") + click.echo(f"Overall Eval Status: {eval_result.final_eval_status.name}") + + for metric_result in eval_result.overall_eval_metric_results: + click.echo( + "---------------------------------------------------------------------" + ) + click.echo( + f"Metric: {metric_result.metric_name}, " + f"Status: {metric_result.eval_status.name}, " + f"Score: {metric_result.score}, " + f"Threshold: {metric_result.threshold}" + ) + if metric_result.details and metric_result.details.rubric_scores: + click.echo("Rubric Scores:") + rubrics_by_id = { + r["rubric_id"]: r["rubric_content"]["text_property"] + for r in metric_result.criterion.rubrics + } + for rubric_score in metric_result.details.rubric_scores: + rubric = rubrics_by_id.get(rubric_score.rubric_id) + click.echo( + f"Rubric: {rubric}, " + f"Score: {rubric_score.score}, " + f"Reasoning: {rubric_score.rationale}" ) - # Initialize the per-invocation metric results to an empty list. - # We will fill this as we evaluate each metric. - eval_metric_result_per_invocation = [] - for actual, expected in zip(inference_result, eval_case.conversation): - eval_metric_result_per_invocation.append( - EvalMetricResultPerInvocation( - actual_invocation=actual, - expected_invocation=expected, - eval_metric_results=[], - ) + data = [] + for per_invocation_result in eval_result.eval_metric_result_per_invocation: + actual_invocation = per_invocation_result.actual_invocation + expected_invocation = per_invocation_result.expected_invocation + row_data = { + "prompt": _convert_content_to_text(actual_invocation.user_content), + "expected_response": ( + _convert_content_to_text(expected_invocation.final_response) + if expected_invocation + else None + ), + "actual_response": _convert_content_to_text( + actual_invocation.final_response + ), + "expected_tool_calls": ( + _convert_tool_calls_to_text(expected_invocation.intermediate_data) + if expected_invocation + else None + ), + "actual_tool_calls": _convert_tool_calls_to_text( + actual_invocation.intermediate_data + ), + } + for metric_result in per_invocation_result.eval_metric_results: + row_data[metric_result.metric_name] = ( + f"Status: {metric_result.eval_status.name}, " + f"Score: {metric_result.score}" + ) + if metric_result.details and metric_result.details.rubric_scores: + rubrics_by_id = { + r["rubric_id"]: r["rubric_content"]["text_property"] + for r in metric_result.criterion.rubrics + } + for rubric_score in metric_result.details.rubric_scores: + rubric = rubrics_by_id.get(rubric_score.rubric_id) + row_data[f"Rubric: {rubric}"] = ( + f"Reasoning: {rubric_score.rationale}, " + f"Score: {rubric_score.score}" ) + data.append(row_data) + if data: + click.echo( + "---------------------------------------------------------------------" + ) + click.echo("Invocation Details:") + df = pd.DataFrame(data) - overall_eval_metric_results = [] - - for eval_metric in eval_metrics: - metric_evaluator = _get_evaluator(eval_metric) - - if inspect.iscoroutinefunction(metric_evaluator.evaluate_invocations): - evaluation_result = await metric_evaluator.evaluate_invocations( - actual_invocations=inference_result, - expected_invocations=eval_case.conversation, - ) - else: - evaluation_result = metric_evaluator.evaluate_invocations( - actual_invocations=inference_result, - expected_invocations=eval_case.conversation, - ) - - overall_eval_metric_results.append( - EvalMetricResult( - metric_name=eval_metric.metric_name, - threshold=eval_metric.threshold, - score=evaluation_result.overall_score, - eval_status=evaluation_result.overall_eval_status, - ) - ) - for index, per_invocation_result in enumerate( - evaluation_result.per_invocation_results - ): - eval_metric_result_per_invocation[index].eval_metric_results.append( - EvalMetricResult( - metric_name=eval_metric.metric_name, - threshold=eval_metric.threshold, - score=per_invocation_result.score, - eval_status=per_invocation_result.eval_status, - ) - ) - - final_eval_status = EvalStatus.NOT_EVALUATED - # Go over the all the eval statuses and mark the final eval status as - # passed if all of them pass, otherwise mark the final eval status to - # failed. - for overall_eval_metric_result in overall_eval_metric_results: - overall_eval_status = overall_eval_metric_result.eval_status - if overall_eval_status == EvalStatus.PASSED: - final_eval_status = EvalStatus.PASSED - elif overall_eval_status == EvalStatus.NOT_EVALUATED: - continue - elif overall_eval_status == EvalStatus.FAILED: - final_eval_status = EvalStatus.FAILED - break - else: - raise ValueError("Unknown eval status.") - - yield EvalCaseResult( - eval_set_file=eval_set_id, - eval_set_id=eval_set_id, - eval_id=eval_name, - final_eval_status=final_eval_status, - eval_metric_results=[], - overall_eval_metric_results=overall_eval_metric_results, - eval_metric_result_per_invocation=eval_metric_result_per_invocation, - session_id=session_id, - user_id=user_id, - ) + # Identify columns where ALL values are exactly None + columns_to_keep = [] + for col in df.columns: + # Check if all elements in the column are NOT None + if not df[col].apply(lambda x: x is None).all(): + columns_to_keep.append(col) + + # Select only the columns to keep + df_result = df[columns_to_keep] - if final_eval_status == EvalStatus.PASSED: - result = "✅ Passed" - else: - result = "❌ Failed" + for col in df_result.columns: + if df_result[col].dtype == "object": + df_result[col] = df_result[col].str.wrap(40) - print(f"Result: {result}\n") - except ModuleNotFoundError as e: - raise ModuleNotFoundError(MISSING_EVAL_DEPENDENCIES_MESSAGE) from e - except Exception: - # Catching the general exception, so that we don't block other eval - # cases. - logger.exception("Eval failed for `%s:%s`", eval_set_id, eval_name) + click.echo( + tabulate(df_result, headers="keys", tablefmt="grid", maxcolwidths=25) + ) + click.echo("\n\n") # Few empty lines for visual clarity -def _get_evaluator(eval_metric: EvalMetric) -> Evaluator: +def get_eval_sets_manager( + eval_storage_uri: Optional[str], agents_dir: str +) -> EvalSetsManager: + """Returns an instance of EvalSetsManager.""" try: - from ..evaluation.final_response_match_v2 import FinalResponseMatchV2Evaluator - from ..evaluation.response_evaluator import ResponseEvaluator - from ..evaluation.safety_evaluator import SafetyEvaluatorV1 - from ..evaluation.trajectory_evaluator import TrajectoryEvaluator - except ModuleNotFoundError as e: - raise ModuleNotFoundError(MISSING_EVAL_DEPENDENCIES_MESSAGE) from e - if eval_metric.metric_name == TOOL_TRAJECTORY_SCORE_KEY: - return TrajectoryEvaluator(threshold=eval_metric.threshold) - elif ( - eval_metric.metric_name == RESPONSE_MATCH_SCORE_KEY - or eval_metric.metric_name == RESPONSE_EVALUATION_SCORE_KEY - ): - return ResponseEvaluator( - threshold=eval_metric.threshold, metric_name=eval_metric.metric_name + from ..evaluation.local_eval_sets_manager import LocalEvalSetsManager + from .utils import evals + except ModuleNotFoundError as mnf: + raise click.ClickException(MISSING_EVAL_DEPENDENCIES_MESSAGE) from mnf + + if eval_storage_uri: + gcs_eval_managers = evals.create_gcs_eval_managers_from_uri( + eval_storage_uri ) - elif eval_metric.metric_name == SAFETY_V1_KEY: - return SafetyEvaluatorV1(eval_metric) - elif eval_metric.metric_name == FINAL_RESPONSE_MATCH_V2: - eval_metric.judge_model_options = JudgeModelOptions() - return FinalResponseMatchV2Evaluator(eval_metric) - - raise ValueError(f"Unsupported eval metric: {eval_metric}") + return gcs_eval_managers.eval_sets_manager + else: + return LocalEvalSetsManager(agents_dir=agents_dir) diff --git a/src/google/adk/cli/cli_tools_click.py b/src/google/adk/cli/cli_tools_click.py index 019b328483..5a71384b17 100644 --- a/src/google/adk/cli/cli_tools_click.py +++ b/src/google/adk/cli/cli_tools_click.py @@ -15,12 +15,14 @@ from __future__ import annotations import asyncio -import collections from contextlib import asynccontextmanager from datetime import datetime import functools +import hashlib +import json import logging import os +from pathlib import Path import tempfile from typing import Optional @@ -119,6 +121,159 @@ def deploy(): pass +@main.group() +def conformance(): + """Conformance testing tools for ADK.""" + pass + + +@conformance.command("record", cls=HelpfulCommand) +@click.argument( + "paths", + nargs=-1, + type=click.Path( + exists=True, dir_okay=True, file_okay=False, resolve_path=True + ), +) +@click.pass_context +def cli_conformance_record( + ctx, + paths: tuple[str, ...], +): + """Generate ADK conformance test YAML files from TestCaseInput specifications. + + NOTE: this is work in progress. + + This command reads TestCaseInput specifications from input.yaml files, + executes the specified test cases against agents, and generates conformance + test files with recorded agent interactions as test.yaml files. + + Expected directory structure: + category/name/input.yaml (TestCaseInput) -> category/name/test.yaml (TestCase) + + PATHS: One or more directories containing test case specifications. + If no paths are provided, defaults to 'tests/' directory. + + Examples: + + Use default directory: adk conformance record + + Custom directories: adk conformance record tests/core tests/tools + """ + + try: + from .conformance.cli_record import run_conformance_record + except ImportError as e: + click.secho( + f"Error: Missing conformance testing dependencies: {e}", + fg="red", + err=True, + ) + click.secho( + "Please install the required conformance testing package dependencies.", + fg="yellow", + err=True, + ) + ctx.exit(1) + + # Default to tests/ directory if no paths provided + test_paths = [Path(p) for p in paths] if paths else [Path("tests").resolve()] + asyncio.run(run_conformance_record(test_paths)) + + +@conformance.command("test", cls=HelpfulCommand) +@click.argument( + "paths", + nargs=-1, + type=click.Path( + exists=True, file_okay=False, dir_okay=True, resolve_path=True + ), +) +@click.option( + "--mode", + type=click.Choice(["replay", "live"], case_sensitive=False), + default="replay", + show_default=True, + help=( + "Test mode: 'replay' verifies against recorded interactions, 'live'" + " runs evaluation-based verification." + ), +) +@click.pass_context +def cli_conformance_test( + ctx, + paths: tuple[str, ...], + mode: str, +): + """Run conformance tests to verify agent behavior consistency. + + Validates that agents produce consistent outputs by comparing against recorded + interactions or evaluating live execution results. + + PATHS can be any number of folder paths. Each folder can either: + - Contain a spec.yaml file directly (single test case) + - Contain subdirectories with spec.yaml files (multiple test cases) + + If no paths are provided, defaults to searching the 'tests' folder. + + TEST MODES: + + \b + replay : Verifies agent interactions match previously recorded behaviors + exactly. Compares LLM requests/responses and tool calls/results. + live : Runs evaluation-based verification (not yet implemented) + + DIRECTORY STRUCTURE: + + Test cases must follow this structure: + + \b + category/ + test_name/ + spec.yaml # Test specification + generated-recordings.yaml # Recorded interactions (replay mode) + generated-session.yaml # Session data (replay mode) + + EXAMPLES: + + \b + # Run all tests in current directory's 'tests' folder + adk conformance test + + \b + # Run tests from specific folders + adk conformance test tests/core tests/tools + + \b + # Run a single test case + adk conformance test tests/core/description_001 + + \b + # Run in live mode (when available) + adk conformance test --mode=live tests/core + """ + + try: + from .conformance.cli_test import run_conformance_test + except ImportError as e: + click.secho( + f"Error: Missing conformance testing dependencies: {e}", + fg="red", + err=True, + ) + click.secho( + "Please install the required conformance testing package dependencies.", + fg="yellow", + err=True, + ) + ctx.exit(1) + + # Convert to Path objects, use default if empty (paths are already resolved by Click) + test_paths = [Path(p) for p in paths] if paths else [Path("tests").resolve()] + + asyncio.run(run_conformance_test(test_paths=test_paths, mode=mode.lower())) + + @main.command("create", cls=HelpfulCommand) @click.option( "--model", @@ -237,8 +392,8 @@ def validate_exclusive(ctx, param, value): ), help=( "The json file that contains a previously saved session (by" - "--save_session option). The previous session will be re-displayed. And" - " user can continue to interact with the agent." + " --save_session option). The previous session will be re-displayed." + " And user can continue to interact with the agent." ), callback=validate_exclusive, ) @@ -280,6 +435,34 @@ def cli_run( ) +def eval_options(): + """Decorator to add common eval options to click commands.""" + + def decorator(func): + @click.option( + "--eval_storage_uri", + type=str, + help=( + "Optional. The evals storage URI to store agent evals," + " supported URIs: gs://." + ), + default=None, + ) + @click.option( + "--log_level", + type=LOG_LEVELS, + default="INFO", + help="Optional. Set the logging level", + ) + @functools.wraps(func) + def wrapper(*args, **kwargs): + return func(*args, **kwargs) + + return wrapper + + return decorator + + @main.command("eval", cls=HelpfulCommand) @click.argument( "agent_module_file_path", @@ -296,21 +479,14 @@ def cli_run( default=False, help="Optional. Whether to print detailed results on console or not.", ) -@click.option( - "--eval_storage_uri", - type=str, - help=( - "Optional. The evals storage URI to store agent evals," - " supported URIs: gs://." - ), - default=None, -) +@eval_options() def cli_eval( agent_module_file_path: str, eval_set_file_path_or_id: list[str], config_file_path: str, print_detailed_results: bool, eval_storage_uri: Optional[str] = None, + log_level: str = "INFO", ): """Evaluates an agent given the eval sets. @@ -342,7 +518,7 @@ def cli_eval( This will only run eval_1, eval_2 and eval_3 from sample_eval_set_file.json. - *Eval Set Id* + *Eval Set ID* For each eval set, all evals will be run by default. If you want to run only specific evals from a eval set, first create a comma @@ -367,12 +543,13 @@ def cli_eval( PRINT_DETAILED_RESULTS: Prints detailed results on the console. """ envs.load_dotenv_for_agent(agent_module_file_path, ".") + logs.setup_adk_logger(getattr(logging, log_level.upper())) try: from ..evaluation.base_eval_service import InferenceConfig from ..evaluation.base_eval_service import InferenceRequest - from ..evaluation.eval_metrics import EvalMetric - from ..evaluation.eval_metrics import JudgeModelOptions + from ..evaluation.eval_config import get_eval_metrics_from_config + from ..evaluation.eval_config import get_evaluation_criteria_or_default from ..evaluation.eval_result import EvalCaseResult from ..evaluation.evaluator import EvalStatus from ..evaluation.in_memory_eval_sets_manager import InMemoryEvalSetsManager @@ -380,12 +557,12 @@ def cli_eval( from ..evaluation.local_eval_set_results_manager import LocalEvalSetResultsManager from ..evaluation.local_eval_sets_manager import load_eval_set_from_file from ..evaluation.local_eval_sets_manager import LocalEvalSetsManager + from ..evaluation.user_simulator_provider import UserSimulatorProvider from .cli_eval import _collect_eval_results from .cli_eval import _collect_inferences - from .cli_eval import get_eval_metrics_from_config - from .cli_eval import get_evaluation_criteria_or_default from .cli_eval import get_root_agent from .cli_eval import parse_and_get_evals_to_run + from .cli_eval import pretty_print_eval_result except ModuleNotFoundError as mnf: raise click.ClickException(MISSING_EVAL_DEPENDENCIES_MESSAGE) from mnf @@ -470,11 +647,16 @@ def cli_eval( ) ) + user_simulator_provider = UserSimulatorProvider( + user_simulator_config=eval_config.user_simulator_config + ) + try: eval_service = LocalEvalService( root_agent=root_agent, eval_sets_manager=eval_sets_manager, eval_set_results_manager=eval_set_results_manager, + user_simulator_provider=user_simulator_provider, ) inference_results = asyncio.run( @@ -518,17 +700,170 @@ def cli_eval( for eval_result in eval_results: eval_result: EvalCaseResult click.echo( - "*********************************************************************" + "********************************************************************" ) - click.echo( - eval_result.model_dump_json( - indent=2, - exclude_unset=True, - exclude_defaults=True, - exclude_none=True, - ) + pretty_print_eval_result(eval_result) + + +@main.group("eval_set") +def eval_set(): + """Manage Eval Sets.""" + pass + + +@eval_set.command("create", cls=HelpfulCommand) +@click.argument( + "agent_module_file_path", + type=click.Path( + exists=True, dir_okay=True, file_okay=False, resolve_path=True + ), +) +@click.argument("eval_set_id", type=str, required=True) +@eval_options() +def cli_create_eval_set( + agent_module_file_path: str, + eval_set_id: str, + eval_storage_uri: Optional[str] = None, + log_level: str = "INFO", +): + """Creates an empty EvalSet given the agent_module_file_path and eval_set_id.""" + from .cli_eval import get_eval_sets_manager + + logs.setup_adk_logger(getattr(logging, log_level.upper())) + app_name = os.path.basename(agent_module_file_path) + agents_dir = os.path.dirname(agent_module_file_path) + eval_sets_manager = get_eval_sets_manager(eval_storage_uri, agents_dir) + + try: + eval_sets_manager.create_eval_set( + app_name=app_name, eval_set_id=eval_set_id + ) + click.echo(f"Eval set '{eval_set_id}' created for app '{app_name}'.") + except ValueError as e: + raise click.ClickException(str(e)) + + +@eval_set.command("add_eval_case", cls=HelpfulCommand) +@click.argument( + "agent_module_file_path", + type=click.Path( + exists=True, dir_okay=True, file_okay=False, resolve_path=True + ), +) +@click.argument("eval_set_id", type=str, required=True) +@click.option( + "--scenarios_file", + type=click.Path( + exists=True, dir_okay=False, file_okay=True, resolve_path=True + ), + help="A path to file containing JSON serialized ConversationScenarios.", + required=True, +) +@click.option( + "--session_input_file", + type=click.Path( + exists=True, dir_okay=False, file_okay=True, resolve_path=True + ), + help="Path to session file containing SessionInput in JSON format.", + required=True, +) +@eval_options() +def cli_add_eval_case( + agent_module_file_path: str, + eval_set_id: str, + scenarios_file: str, + eval_storage_uri: Optional[str] = None, + session_input_file: Optional[str] = None, + log_level: str = "INFO", +): + """Adds eval cases to the given eval set. + + There are several ways that an eval case can be created, for now this method + only supports adding one using a conversation scenarios file. + + If an eval case for the generated id already exists, then we skip adding it. + """ + logs.setup_adk_logger(getattr(logging, log_level.upper())) + try: + from ..evaluation.conversation_scenarios import ConversationScenarios + from ..evaluation.eval_case import EvalCase + from ..evaluation.eval_case import SessionInput + from .cli_eval import get_eval_sets_manager + except ModuleNotFoundError as mnf: + raise click.ClickException(MISSING_EVAL_DEPENDENCIES_MESSAGE) from mnf + + app_name = os.path.basename(agent_module_file_path) + agents_dir = os.path.dirname(agent_module_file_path) + eval_sets_manager = get_eval_sets_manager(eval_storage_uri, agents_dir) + + try: + with open(session_input_file, "r") as f: + session_input = SessionInput.model_validate_json(f.read()) + + with open(scenarios_file, "r") as f: + conversation_scenarios = ConversationScenarios.model_validate_json( + f.read() ) + for scenario in conversation_scenarios.scenarios: + scenario_str = json.dumps(scenario.model_dump(), sort_keys=True) + eval_id = hashlib.sha256(scenario_str.encode("utf-8")).hexdigest()[:8] + eval_case = EvalCase( + eval_id=eval_id, + conversation_scenario=scenario, + session_input=session_input, + creation_timestamp=datetime.now().timestamp(), + ) + + if ( + eval_sets_manager.get_eval_case( + app_name=app_name, eval_set_id=eval_set_id, eval_case_id=eval_id + ) + is None + ): + eval_sets_manager.add_eval_case( + app_name=app_name, eval_set_id=eval_set_id, eval_case=eval_case + ) + click.echo( + f"Eval case '{eval_case.eval_id}' added to eval set" + f" '{eval_set_id}'." + ) + else: + click.echo( + f"Eval case '{eval_case.eval_id}' already exists in eval set" + f" '{eval_set_id}', skipped adding." + ) + except Exception as e: + raise click.ClickException(f"Failed to add eval case(s): {e}") from e + + +def web_options(): + """Decorator to add web UI options to click commands.""" + + def decorator(func): + @click.option( + "--logo-text", + type=str, + help="Optional. The text to display in the logo of the web UI.", + default=None, + ) + @click.option( + "--logo-image-url", + type=str, + help=( + "Optional. The URL of the image to display in the logo of the" + " web UI." + ), + default=None, + ) + @functools.wraps(func) + def wrapper(*args, **kwargs): + return func(*args, **kwargs) + + return wrapper + + return decorator + def adk_services_options(): """Decorator to add ADK services options to click commands.""" @@ -576,7 +911,7 @@ def wrapper(*args, **kwargs): def deprecated_adk_services_options(): - """Depracated ADK services options.""" + """Deprecated ADK services options.""" def warn(alternative_param, ctx, param, value): if value: @@ -655,6 +990,16 @@ def decorator(func): default=False, help="Optional. Whether to enable cloud trace for telemetry.", ) + @click.option( + "--otel_to_cloud", + is_flag=True, + show_default=True, + default=False, + help=( + "EXPERIMENTAL Optional. Whether to write OTel data to Google Cloud" + " Observability services - Cloud Trace and Cloud Logging." + ), + ) @click.option( "--reload/--no-reload", default=True, @@ -686,6 +1031,26 @@ def decorator(func): ), default=None, ) + @click.option( + "--extra_plugins", + help=( + "Optional. Comma-separated list of extra plugin classes or" + " instances to enable (e.g., my.module.MyPluginClass or" + " my.module.my_plugin_instance)." + ), + multiple=True, + ) + @click.option( + "--url_prefix", + type=str, + help=( + "Optional. URL path prefix when the application is mounted behind a" + " reverse proxy or API gateway (e.g., '/api/v1', '/adk'). This" + " ensures generated URLs and redirects work correctly when the app" + " is not served at the root path. Must start with '/' if provided." + ), + default=None, + ) @functools.wraps(func) @click.pass_context def wrapper(ctx, *args, **kwargs): @@ -706,6 +1071,7 @@ def wrapper(ctx, *args, **kwargs): @main.command("web") @fast_api_common_options() +@web_options() @adk_services_options() @deprecated_adk_services_options() @click.argument( @@ -722,7 +1088,9 @@ def cli_web( allow_origins: Optional[list[str]] = None, host: str = "127.0.0.1", port: int = 8000, + url_prefix: Optional[str] = None, trace_to_cloud: bool = False, + otel_to_cloud: bool = False, reload: bool = True, session_service_uri: Optional[str] = None, artifact_service_uri: Optional[str] = None, @@ -731,6 +1099,9 @@ def cli_web( artifact_storage_uri: Optional[str] = None, # Deprecated a2a: bool = False, reload_agents: bool = False, + extra_plugins: Optional[list[str]] = None, + logo_text: Optional[str] = None, + logo_image_url: Optional[str] = None, ): """Starts a FastAPI server with Web UI for agents. @@ -776,11 +1147,16 @@ async def _lifespan(app: FastAPI): allow_origins=allow_origins, web=True, trace_to_cloud=trace_to_cloud, + otel_to_cloud=otel_to_cloud, lifespan=_lifespan, a2a=a2a, host=host, port=port, + url_prefix=url_prefix, reload_agents=reload_agents, + extra_plugins=extra_plugins, + logo_text=logo_text, + logo_image_url=logo_image_url, ) config = uvicorn.Config( app, @@ -813,7 +1189,9 @@ def cli_api_server( allow_origins: Optional[list[str]] = None, host: str = "127.0.0.1", port: int = 8000, + url_prefix: Optional[str] = None, trace_to_cloud: bool = False, + otel_to_cloud: bool = False, reload: bool = True, session_service_uri: Optional[str] = None, artifact_service_uri: Optional[str] = None, @@ -822,6 +1200,7 @@ def cli_api_server( artifact_storage_uri: Optional[str] = None, # Deprecated a2a: bool = False, reload_agents: bool = False, + extra_plugins: Optional[list[str]] = None, ): """Starts a FastAPI server for agents. @@ -846,10 +1225,13 @@ def cli_api_server( allow_origins=allow_origins, web=False, trace_to_cloud=trace_to_cloud, + otel_to_cloud=otel_to_cloud, a2a=a2a, host=host, port=port, + url_prefix=url_prefix, reload_agents=reload_agents, + extra_plugins=extra_plugins, ), host=host, port=port, @@ -1080,26 +1462,46 @@ def cli_deploy_cloud_run( @deploy.command("agent_engine") +@click.option( + "--api_key", + type=str, + default=None, + help=( + "Optional. The API key to use for Express Mode. If not" + " provided, the API key from the GOOGLE_API_KEY environment variable" + " will be used. It will only be used if GOOGLE_GENAI_USE_VERTEXAI is" + " true. (It will override GOOGLE_API_KEY in the .env file if it" + " exists.)" + ), +) @click.option( "--project", type=str, + default=None, help=( - "Required. Google Cloud project to deploy the agent. It will override" - " GOOGLE_CLOUD_PROJECT in the .env file (if it exists)." + "Optional. Google Cloud project to deploy the agent. It will override" + " GOOGLE_CLOUD_PROJECT in the .env file (if it exists). It will be" + " ignored if api_key is set." ), ) @click.option( "--region", type=str, + default=None, help=( - "Required. Google Cloud region to deploy the agent. It will override" - " GOOGLE_CLOUD_LOCATION in the .env file (if it exists)." + "Optional. Google Cloud region to deploy the agent. It will override" + " GOOGLE_CLOUD_LOCATION in the .env file (if it exists). It will be" + " ignored if api_key is set." ), ) @click.option( "--staging_bucket", type=str, - help="Required. GCS bucket for staging the deployment artifacts.", + default=None, + help=( + "Optional. GCS bucket for staging the deployment artifacts. It will be" + " ignored if api_key is set." + ), ) @click.option( "--agent_engine_id", @@ -1107,17 +1509,20 @@ def cli_deploy_cloud_run( default=None, help=( "Optional. ID of the Agent Engine instance to update if it exists" - " (default: None, which means a new instance will be created)." - " The corresponding resource name in Agent Engine will be:" + " (default: None, which means a new instance will be created). If" + " project and region are set, this should be the resource ID, and the" + " corresponding resource name in Agent Engine will be:" " `projects/{project}/locations/{region}/reasoningEngines/{agent_engine_id}`." + " If api_key is set, then agent_engine_id is required to be the full" + " resource name (i.e. `projects/*/locations/*/reasoningEngines/*`)." ), ) @click.option( - "--trace_to_cloud", + "--trace_to_cloud/--no-trace_to_cloud", type=bool, is_flag=True, show_default=True, - default=False, + default=None, help="Optional. Whether to enable Cloud Trace for Agent Engine.", ) @click.option( @@ -1146,15 +1551,20 @@ def cli_deploy_cloud_run( @click.option( "--temp_folder", type=str, - default=os.path.join( - tempfile.gettempdir(), - "agent_engine_deploy_src", - datetime.now().strftime("%Y%m%d_%H%M%S"), - ), + default=None, help=( "Optional. Temp folder for the generated Agent Engine source files." " If the folder already exists, its contents will be removed." - " (default: a timestamped folder in the system temp directory)." + " (default: a timestamped folder in the current working directory)." + ), +) +@click.option( + "--adk_app_object", + type=str, + default=None, + help=( + "Optional. Python object corresponding to the root ADK agent or app." + " It can only be `root_agent` or `app`. (default: `root_agent`)" ), ) @click.option( @@ -1179,12 +1589,8 @@ def cli_deploy_cloud_run( @click.option( "--absolutize_imports", type=bool, - default=True, - help=( - "Optional. Whether to absolutize imports. If True, all relative imports" - " will be converted to absolute import statements (default: True)." - " NOTE: This flag is temporary and will be removed in the future." - ), + default=False, + help=" NOTE: This flag is deprecated and will be removed in the future.", ) @click.option( "--agent_engine_config_file", @@ -1205,15 +1611,17 @@ def cli_deploy_cloud_run( ) def cli_deploy_agent_engine( agent: str, - project: str, - region: str, - staging_bucket: str, + project: Optional[str], + region: Optional[str], + staging_bucket: Optional[str], agent_engine_id: Optional[str], - trace_to_cloud: bool, + trace_to_cloud: Optional[bool], + api_key: Optional[str], display_name: str, description: str, adk_app: str, - temp_folder: str, + adk_app_object: Optional[str], + temp_folder: Optional[str], env_file: str, requirements_file: str, absolutize_imports: bool, @@ -1223,9 +1631,13 @@ def cli_deploy_agent_engine( Example: + # With Express Mode API Key + adk deploy agent_engine --api_key=[api_key] my_agent + + # With Google Cloud Project and Region adk deploy agent_engine --project=[project] --region=[region] --staging_bucket=[staging_bucket] --display_name=[app_name] - path/to/my_agent + my_agent """ try: cli_deploy.to_agent_engine( @@ -1235,6 +1647,8 @@ def cli_deploy_agent_engine( staging_bucket=staging_bucket, agent_engine_id=agent_engine_id, trace_to_cloud=trace_to_cloud, + api_key=api_key, + adk_app_object=adk_app_object, display_name=display_name, description=description, adk_app=adk_app, diff --git a/src/google/adk/cli/conformance/_generated_file_utils.py b/src/google/adk/cli/conformance/_generated_file_utils.py new file mode 100644 index 0000000000..1a0bd6db3e --- /dev/null +++ b/src/google/adk/cli/conformance/_generated_file_utils.py @@ -0,0 +1,55 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Loading utilities for conformance testing.""" + +from __future__ import annotations + +from pathlib import Path +from typing import Any +from typing import Optional + +import click +import yaml + +from ...sessions.session import Session +from .test_case import TestSpec + + +def load_test_case(test_case_dir: Path) -> TestSpec: + """Load TestSpec from spec.yaml file.""" + spec_file = test_case_dir / "spec.yaml" + with open(spec_file, "r", encoding="utf-8") as f: + data: dict[str, Any] = yaml.safe_load(f) + return TestSpec.model_validate(data) + + +def load_recorded_session(test_case_dir: Path) -> Optional[Session]: + """Load recorded session data from generated-session.yaml file.""" + session_file = test_case_dir / "generated-session.yaml" + if not session_file.exists(): + return None + + with open(session_file, "r", encoding="utf-8") as f: + session_data = yaml.safe_load(f) + if not session_data: + return None + + try: + return Session.model_validate(session_data) + except Exception as e: + click.secho( + f"Warning: Failed to parse session data: {e}", fg="yellow", err=True + ) + return None diff --git a/src/google/adk/cli/conformance/_replay_validators.py b/src/google/adk/cli/conformance/_replay_validators.py new file mode 100644 index 0000000000..c9e69f3146 --- /dev/null +++ b/src/google/adk/cli/conformance/_replay_validators.py @@ -0,0 +1,181 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Validation logic for conformance test replay mode.""" + +from __future__ import annotations + +from dataclasses import dataclass +import difflib +import json +from typing import Optional + +from ...events.event import Event +from ...sessions.session import Session + + +@dataclass +class ComparisonResult: + """Result of comparing two objects during conformance testing.""" + + success: bool + error_message: Optional[str] = None + + +def _generate_mismatch_message( + context: str, actual_value: str, recorded_value: str +) -> str: + """Generate a generic mismatch error message.""" + return ( + f"{context} mismatch - \nActual: \n{actual_value} \nRecorded:" + f" \n{recorded_value}" + ) + + +def _generate_diff_message( + context: str, actual_dict: dict, recorded_dict: dict +) -> str: + """Generate a diff-based error message for comparison failures.""" + # Convert to pretty-printed JSON for better readability + actual_json = json.dumps(actual_dict, indent=2, sort_keys=True) + recorded_json = json.dumps(recorded_dict, indent=2, sort_keys=True) + + # Generate unified diff + diff_lines = list( + difflib.unified_diff( + recorded_json.splitlines(keepends=True), + actual_json.splitlines(keepends=True), + fromfile=f"recorded {context}\n", + tofile=f"actual {context}\n", + lineterm="", + ) + ) + + if diff_lines: + return f"{context} mismatch:\n" + "".join(diff_lines) + else: + # Fallback to generic format if diff doesn't work + return _generate_mismatch_message(context, actual_json, recorded_json) + + +def compare_event( + actual_event: Event, recorded_event: Event, index: int +) -> ComparisonResult: + """Compare a single actual event with a recorded event.""" + # Comprehensive exclude dict for all fields that can differ between runs + excluded_fields = { + # Event-level fields that vary per run + "id": True, + "timestamp": True, + "invocation_id": True, + "long_running_tool_ids": True, + # Content fields that vary per run + "content": { + "parts": { + "__all__": { + "thought_signature": True, + "function_call": {"id": True}, + "function_response": {"id": True}, + } + } + }, + # Action fields that vary per run + "actions": { + "state_delta": { + "_adk_recordings_config": True, + "_adk_replay_config": True, + }, + "requested_auth_configs": True, + "requested_tool_confirmations": True, + }, + } + + # Compare events using model dumps with comprehensive exclude dict + actual_dict = actual_event.model_dump( + exclude_none=True, exclude=excluded_fields + ) + recorded_dict = recorded_event.model_dump( + exclude_none=True, exclude=excluded_fields + ) + + if actual_dict != recorded_dict: + return ComparisonResult( + success=False, + error_message=_generate_diff_message( + f"event {index}", actual_dict, recorded_dict + ), + ) + + return ComparisonResult(success=True) + + +def compare_events( + actual_events: list[Event], recorded_events: list[Event] +) -> ComparisonResult: + """Compare actual events with recorded events.""" + if len(actual_events) != len(recorded_events): + return ComparisonResult( + success=False, + error_message=_generate_mismatch_message( + "Event count", str(len(actual_events)), str(len(recorded_events)) + ), + ) + + for i, (actual, recorded) in enumerate(zip(actual_events, recorded_events)): + result = compare_event(actual, recorded, i) + if not result.success: + return result + + return ComparisonResult(success=True) + + +def compare_session( + actual_session: Session, recorded_session: Session +) -> ComparisonResult: + """Compare actual session with recorded session using comprehensive exclude list. + + Returns: + ComparisonResult with success status and optional error message + """ + # Comprehensive exclude dict for all fields that can differ between runs + excluded_fields = { + # Session-level fields that vary per run + "id": True, + "last_update_time": True, + # State fields that contain ADK internal configuration + "state": { + "_adk_recordings_config": True, + "_adk_replay_config": True, + }, + # Events comparison handled separately + "events": True, + } + + # Compare sessions using model dumps with comprehensive exclude dict + actual_dict = actual_session.model_dump( + exclude_none=True, exclude=excluded_fields + ) + recorded_dict = recorded_session.model_dump( + exclude_none=True, exclude=excluded_fields + ) + + if actual_dict != recorded_dict: + return ComparisonResult( + success=False, + error_message=_generate_diff_message( + "session", actual_dict, recorded_dict + ), + ) + + return ComparisonResult(success=True) diff --git a/src/google/adk/cli/conformance/adk_web_server_client.py b/src/google/adk/cli/conformance/adk_web_server_client.py index f79cdda8fe..88fe2ead0c 100644 --- a/src/google/adk/cli/conformance/adk_web_server_client.py +++ b/src/google/adk/cli/conformance/adk_web_server_client.py @@ -22,6 +22,7 @@ from typing import Any from typing import AsyncGenerator from typing import Dict +from typing import Literal from typing import Optional import httpx @@ -175,37 +176,92 @@ async def delete_session( ) response.raise_for_status() + async def update_session( + self, + *, + app_name: str, + user_id: str, + session_id: str, + state_delta: Dict[str, Any], + ) -> Session: + """Update session state without running the agent. + + Args: + app_name: Name of the application + user_id: User identifier + session_id: Session identifier to update + state_delta: The state changes to apply to the session + + Returns: + The updated Session object + + Raises: + httpx.HTTPStatusError: If the request fails or session not found + """ + async with self._get_client() as client: + response = await client.patch( + f"/apps/{app_name}/users/{user_id}/sessions/{session_id}", + json={"state_delta": state_delta}, + ) + response.raise_for_status() + return Session.model_validate(response.json()) + async def run_agent( self, request: RunAgentRequest, + mode: Optional[Literal["record", "replay"]] = None, + test_case_dir: Optional[str] = None, + user_message_index: Optional[int] = None, ) -> AsyncGenerator[Event, None]: """Run an agent with streaming Server-Sent Events response. Args: request: The RunAgentRequest containing agent execution parameters + mode: Optional conformance mode ("record" or "replay") to trigger recording + test_case_dir: Optional test case directory path for conformance recording + user_message_index: Optional user message index for conformance recording Yields: Event objects streamed from the agent execution Raises: + ValueError: If mode is provided but test_case_dir or user_message_index is None httpx.HTTPStatusError: If the request fails json.JSONDecodeError: If event data cannot be parsed """ - # TODO: Prepare headers for conformance tracking - headers = {} + # Add recording parameters to state_delta for conformance tests + if mode: + if test_case_dir is None or user_message_index is None: + raise ValueError( + "test_case_dir and user_message_index must be provided when mode is" + " specified" + ) + + # Modify request state_delta in place + if request.state_delta is None: + request.state_delta = {} + + if mode == "replay": + request.state_delta["_adk_replay_config"] = { + "dir": str(test_case_dir), + "user_message_index": user_message_index, + } + else: # record mode + request.state_delta["_adk_recordings_config"] = { + "dir": str(test_case_dir), + "user_message_index": user_message_index, + } async with self._get_client() as client: async with client.stream( "POST", "/run_sse", json=request.model_dump(by_alias=True, exclude_none=True), - headers=headers, ) as response: response.raise_for_status() async for line in response.aiter_lines(): if line.startswith("data:") and (data := line[5:].strip()): - try: - event_data = json.loads(data) - yield Event.model_validate(event_data) - except (json.JSONDecodeError, ValueError) as exc: - logger.warning("Failed to parse event data: %s", exc) + event_data = json.loads(data) + yield Event.model_validate(event_data) + else: + logger.debug("Non data line received: %s", line) diff --git a/src/google/adk/cli/conformance/cli_record.py b/src/google/adk/cli/conformance/cli_record.py new file mode 100644 index 0000000000..4a071e280f --- /dev/null +++ b/src/google/adk/cli/conformance/cli_record.py @@ -0,0 +1,161 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""CLI commands for ADK conformance testing.""" + +from __future__ import annotations + +from pathlib import Path + +import click +from google.genai import types + +from ...utils.yaml_utils import dump_pydantic_to_yaml +from ..adk_web_server import RunAgentRequest +from ._generated_file_utils import load_test_case +from .adk_web_server_client import AdkWebServerClient +from .test_case import TestCase + + +async def _create_conformance_test_files( + test_case: TestCase, + user_id: str = "adk_conformance_test_user", +) -> Path: + """Generate conformance test files from TestCase.""" + # Clean existing generated files + test_case_dir = test_case.dir + + # Remove existing generated files to ensure clean state + generated_session_file = test_case_dir / "generated-session.yaml" + generated_recordings_file = test_case_dir / "generated-recordings.yaml" + + generated_session_file.unlink(missing_ok=True) + generated_recordings_file.unlink(missing_ok=True) + + async with AdkWebServerClient() as client: + # Create a new session for the test + session = await client.create_session( + app_name=test_case.test_spec.agent, + user_id=user_id, + state=test_case.test_spec.initial_state, + ) + + # Run the agent with the user messages + for user_message_index, user_message in enumerate( + test_case.test_spec.user_messages + ): + # Create content from UserMessage object + if user_message.content is not None: + content = user_message.content + elif user_message.text is not None: + content = types.UserContent(parts=[types.Part(text=user_message.text)]) + else: + raise ValueError( + f"UserMessage at index {user_message_index} has neither text nor" + " content" + ) + + async for _ in client.run_agent( + RunAgentRequest( + app_name=test_case.test_spec.agent, + user_id=user_id, + session_id=session.id, + new_message=content, + state_delta=user_message.state_delta, + ), + mode="record", + test_case_dir=str(test_case_dir), + user_message_index=user_message_index, + ): + pass + + # Retrieve the updated session + updated_session = await client.get_session( + app_name=test_case.test_spec.agent, + user_id=user_id, + session_id=session.id, + ) + + # Save session.yaml + dump_pydantic_to_yaml( + updated_session, + generated_session_file, + sort_keys=False, # Output keys in the declaration order. + exclude={ + "state": {"_adk_recordings_config": True}, + "events": { + "__all__": { + "actions": {"state_delta": {"_adk_recordings_config": True}} + } + }, + }, + ) + + return generated_session_file + + +async def run_conformance_record(paths: list[Path]) -> None: + """Generate conformance tests from TestCaseInput files. + + Args: + paths: list of directories containing test cases input files (spec.yaml). + """ + click.echo("Generating ADK conformance tests...") + + # Look for spec.yaml files and load TestCase objects + test_cases: dict[Path, TestCase] = {} + + for test_dir in paths: + if not test_dir.exists(): + continue + + for spec_file in test_dir.rglob("spec.yaml"): + try: + test_case_dir = spec_file.parent + category = test_case_dir.parent.name + name = test_case_dir.name + test_spec = load_test_case(test_case_dir) + test_case = TestCase( + category=category, + name=name, + dir=test_case_dir, + test_spec=test_spec, + ) + test_cases[test_case_dir] = test_case + click.echo(f"Loaded test spec: {category}/{name}") + except Exception as e: + click.secho(f"Failed to load {spec_file}: {e}", fg="red", err=True) + + # Process all loaded test cases + if test_cases: + click.echo(f"\nProcessing {len(test_cases)} test cases...") + + for test_case in test_cases.values(): + try: + await _create_conformance_test_files(test_case) + click.secho( + "Generated conformance test files for:" + f" {test_case.category}/{test_case.name}", + fg="green", + ) + except Exception as e: + click.secho( + f"Failed to generate {test_case.category}/{test_case.name}: {e}", + fg="red", + err=True, + ) + else: + click.secho("No test specs found to process.", fg="yellow") + + click.secho("\nConformance test generation complete!", fg="blue") diff --git a/src/google/adk/cli/conformance/cli_test.py b/src/google/adk/cli/conformance/cli_test.py new file mode 100644 index 0000000000..552a120cc7 --- /dev/null +++ b/src/google/adk/cli/conformance/cli_test.py @@ -0,0 +1,354 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""CLI implementation for ADK conformance testing.""" + +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path +import textwrap +from typing import Optional + +import click +from google.genai import types + +from ..adk_web_server import RunAgentRequest +from ._generated_file_utils import load_recorded_session +from ._generated_file_utils import load_test_case +from ._replay_validators import compare_events +from ._replay_validators import compare_session +from .adk_web_server_client import AdkWebServerClient +from .test_case import TestCase +from .test_case import TestSpec + + +@dataclass +class _TestResult: + """Result of running a single conformance test.""" + + category: str + name: str + success: bool + error_message: Optional[str] = None + + +@dataclass +class _ConformanceTestSummary: + """Summary of all conformance test results.""" + + total_tests: int + passed_tests: int + failed_tests: int + results: list[_TestResult] + + @property + def success_rate(self) -> float: + """Calculate the success rate as a percentage.""" + if self.total_tests == 0: + return 0.0 + return (self.passed_tests / self.total_tests) * 100 + + +class ConformanceTestRunner: + """Runs conformance tests in replay mode.""" + + def __init__( + self, + test_paths: list[Path], + client: AdkWebServerClient, + mode: str = "replay", + user_id: str = "adk_conformance_test_user", + ): + self.test_paths = test_paths + self.mode = mode + self.client = client + self.user_id = user_id + + def _discover_test_cases(self) -> list[TestCase]: + """Discover test cases from specified folder paths.""" + test_cases = [] + for test_path in self.test_paths: + if not test_path.exists() or not test_path.is_dir(): + click.secho(f"Invalid path: {test_path}", fg="yellow", err=True) + continue + + for spec_file in test_path.rglob("spec.yaml"): + test_case_dir = spec_file.parent + category = test_case_dir.parent.name + name = test_case_dir.name + + # Skip if recordings missing in replay mode + if ( + self.mode == "replay" + and not (test_case_dir / "generated-recordings.yaml").exists() + ): + click.secho( + f"Skipping {category}/{name}: no recordings", + fg="yellow", + err=True, + ) + continue + + test_spec = load_test_case(test_case_dir) + test_cases.append( + TestCase( + category=category, + name=name, + dir=test_case_dir, + test_spec=test_spec, + ) + ) + + return sorted(test_cases, key=lambda tc: (tc.category, tc.name)) + + async def _run_user_messages( + self, session_id: str, test_case: TestCase + ) -> None: + """Run all user messages for a test case.""" + for user_message_index, user_message in enumerate( + test_case.test_spec.user_messages + ): + # Create content from UserMessage object + if user_message.content is not None: + content = user_message.content + elif user_message.text is not None: + content = types.UserContent(parts=[types.Part(text=user_message.text)]) + else: + raise ValueError( + f"UserMessage at index {user_message_index} has neither text nor" + " content" + ) + + request = RunAgentRequest( + app_name=test_case.test_spec.agent, + user_id=self.user_id, + session_id=session_id, + new_message=content, + streaming=False, + state_delta=user_message.state_delta, + ) + + # Run the agent but don't collect events here + async for _ in self.client.run_agent( + request, + mode="replay", + test_case_dir=str(test_case.dir), + user_message_index=user_message_index, + ): + pass + + async def _validate_test_results( + self, session_id: str, test_case: TestCase + ) -> _TestResult: + """Validate test results by comparing with recorded data.""" + # Get final session and use its events for comparison + final_session = await self.client.get_session( + app_name=test_case.test_spec.agent, + user_id=self.user_id, + session_id=session_id, + ) + if not final_session: + return _TestResult( + category=test_case.category, + name=test_case.name, + success=False, + error_message="No final session available for comparison", + ) + + # Load recorded session data for comparison + recorded_session = load_recorded_session(test_case.dir) + if not recorded_session: + return _TestResult( + category=test_case.category, + name=test_case.name, + success=False, + error_message="No recorded session found for replay comparison", + ) + + # Compare events and session + events_result = compare_events( + final_session.events, recorded_session.events + ) + session_result = compare_session(final_session, recorded_session) + + # Determine overall success + success = events_result.success and session_result.success + error_messages = [] + if not events_result.success and events_result.error_message: + error_messages.append(f"Event mismatch: {events_result.error_message}") + if not session_result.success and session_result.error_message: + error_messages.append(f"Session mismatch: {session_result.error_message}") + + return _TestResult( + category=test_case.category, + name=test_case.name, + success=success, + error_message="\n\n".join(error_messages) if error_messages else None, + ) + + async def _run_test_case_replay(self, test_case: TestCase) -> _TestResult: + """Run a single test case in replay mode.""" + try: + # Create session + session = await self.client.create_session( + app_name=test_case.test_spec.agent, + user_id=self.user_id, + state=test_case.test_spec.initial_state, + ) + + # Run each user message + try: + await self._run_user_messages(session.id, test_case) + except Exception as e: + return _TestResult( + category=test_case.category, + name=test_case.name, + success=False, + error_message=f"Replay verification failed: {e}", + ) + + # Validate results and return test result + result = await self._validate_test_results(session.id, test_case) + + # Clean up session + await self.client.delete_session( + app_name=test_case.test_spec.agent, + user_id=self.user_id, + session_id=session.id, + ) + + return result + + except Exception as e: + return _TestResult( + category=test_case.category, + name=test_case.name, + success=False, + error_message=f"Test setup failed: {e}", + ) + + async def run_all_tests(self) -> _ConformanceTestSummary: + """Run all discovered test cases.""" + test_cases = self._discover_test_cases() + if not test_cases: + click.secho("No test cases found!", fg="yellow", err=True) + return _ConformanceTestSummary( + total_tests=0, + passed_tests=0, + failed_tests=0, + results=[], + ) + + click.echo(f""" +Found {len(test_cases)} test cases to run in {self.mode} mode +""") + + results: list[_TestResult] = [] + for test_case in test_cases: + click.echo(f"Running {test_case.category}/{test_case.name}...", nl=False) + if self.mode == "replay": + result = await self._run_test_case_replay(test_case) + else: + # TODO: Implement live mode + result = _TestResult( + category=test_case.category, + name=test_case.name, + success=False, + error_message="Live mode not yet implemented", + ) + results.append(result) + _print_test_case_result(result) + + passed = sum(1 for r in results if r.success) + return _ConformanceTestSummary( + total_tests=len(results), + passed_tests=passed, + failed_tests=len(results) - passed, + results=results, + ) + + +async def run_conformance_test( + test_paths: list[Path], + mode: str = "replay", +) -> None: + """Run conformance tests.""" + _print_test_header(mode) + + async with AdkWebServerClient() as client: + runner = ConformanceTestRunner(test_paths, client, mode) + summary = await runner.run_all_tests() + + _print_test_summary(summary) + + +def _print_test_header(mode: str) -> None: + """Print the conformance test header.""" + click.echo("=" * 50) + click.echo(f"Running ADK conformance tests in {mode} mode...") + click.echo("=" * 50) + + +def _print_test_case_result(result: _TestResult) -> None: + """Print the result of a single test case.""" + if result.success: + click.secho(" ✓ PASS", fg="green") + else: + click.secho(" ✗ FAIL", fg="red") + if result.error_message: + click.secho(f"Error: {result.error_message}", fg="red", err=True) + + +def _print_test_result_details(result: _TestResult) -> None: + """Print detailed information about a failed test result.""" + click.secho(f"\n✗ {result.category}/{result.name}\n", fg="red") + if result.error_message: + indented_message = textwrap.indent(result.error_message, " ") + click.secho(indented_message, fg="red", err=True) + + +def _print_test_summary(summary: _ConformanceTestSummary) -> None: + """Print the conformance test summary results.""" + # Print summary + click.echo("\n" + "=" * 50) + click.echo("CONFORMANCE TEST SUMMARY") + click.echo("=" * 50) + + if summary.total_tests == 0: + click.secho("No tests were run.", fg="yellow") + return + + click.echo(f"Total tests: {summary.total_tests}") + click.secho(f"Passed: {summary.passed_tests}", fg="green") + + if summary.failed_tests > 0: + click.secho(f"Failed: {summary.failed_tests}", fg="red") + else: + click.echo(f"Failed: {summary.failed_tests}") + + click.echo(f"Success rate: {summary.success_rate:.1f}%") + + # List failed tests + failed_tests = [r for r in summary.results if not r.success] + if failed_tests: + click.echo("\nFailed tests:") + for result in failed_tests: + _print_test_result_details(result) + + # Exit with error code if any tests failed + if summary.failed_tests > 0: + raise click.ClickException(f"{summary.failed_tests} test(s) failed") + else: + click.secho("\nAll tests passed! 🎉", fg="green") diff --git a/src/google/adk/cli/conformance/test_case.py b/src/google/adk/cli/conformance/test_case.py new file mode 100644 index 0000000000..30aa9366d7 --- /dev/null +++ b/src/google/adk/cli/conformance/test_case.py @@ -0,0 +1,73 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from dataclasses import dataclass +from pathlib import Path +from typing import Any +from typing import Optional + +from google.genai import types +from pydantic import BaseModel +from pydantic import ConfigDict +from pydantic import Field + + +class UserMessage(BaseModel): + + # oneof fields - start + text: Optional[str] = None + """The user message in text.""" + + content: Optional[types.UserContent] = None + """The user message in types.Content.""" + # oneof fields - end + + state_delta: Optional[dict[str, Any]] = None + """The state changes when running this user message.""" + + +class TestSpec(BaseModel): + """Test specification for conformance test cases. + + This is the human-authored specification that defines what should be tested. + Category and name are inferred from folder structure. + """ + + model_config = ConfigDict( + extra="forbid", + ) + + description: str + """Human-readable description of what this test validates.""" + + agent: str + """Name of the ADK agent to test against.""" + + initial_state: dict[str, Any] = Field(default_factory=dict) + """The initial state key-value pairs in the creation_session request.""" + + user_messages: list[UserMessage] = Field(default_factory=list) + """Sequence of user messages to send to the agent during test execution.""" + + +@dataclass +class TestCase: + """Represents a single conformance test case.""" + + category: str + name: str + dir: Path + test_spec: TestSpec diff --git a/src/google/adk/cli/fast_api.py b/src/google/adk/cli/fast_api.py index 7d93b54360..7ff10c5414 100644 --- a/src/google/adk/cli/fast_api.py +++ b/src/google/adk/cli/fast_api.py @@ -33,18 +33,15 @@ from starlette.types import Lifespan from watchdog.observers import Observer -from ..artifacts.gcs_artifact_service import GcsArtifactService from ..artifacts.in_memory_artifact_service import InMemoryArtifactService from ..auth.credential_service.in_memory_credential_service import InMemoryCredentialService from ..evaluation.local_eval_set_results_manager import LocalEvalSetResultsManager from ..evaluation.local_eval_sets_manager import LocalEvalSetsManager from ..memory.in_memory_memory_service import InMemoryMemoryService -from ..memory.vertex_ai_memory_bank_service import VertexAiMemoryBankService from ..runners import Runner from ..sessions.in_memory_session_service import InMemorySessionService -from ..sessions.vertex_ai_session_service import VertexAiSessionService -from ..utils.feature_decorator import working_in_progress from .adk_web_server import AdkWebServer +from .service_registry import get_service_registry from .utils import envs from .utils import evals from .utils.agent_change_handler import AgentChangeEventHandler @@ -66,9 +63,14 @@ def get_fast_api_app( a2a: bool = False, host: str = "127.0.0.1", port: int = 8000, + url_prefix: Optional[str] = None, trace_to_cloud: bool = False, + otel_to_cloud: bool = False, reload_agents: bool = False, lifespan: Optional[Lifespan[FastAPI]] = None, + extra_plugins: Optional[list[str]] = None, + logo_text: Optional[str] = None, + logo_image_url: Optional[str] = None, ) -> FastAPI: # Set up eval managers. if eval_storage_uri: @@ -81,54 +83,14 @@ def get_fast_api_app( eval_sets_manager = LocalEvalSetsManager(agents_dir=agents_dir) eval_set_results_manager = LocalEvalSetResultsManager(agents_dir=agents_dir) - def _parse_agent_engine_resource_name(agent_engine_id_or_resource_name): - if not agent_engine_id_or_resource_name: - raise click.ClickException( - "Agent engine resource name or resource id can not be empty." - ) - - # "projects/my-project/locations/us-central1/reasoningEngines/1234567890", - if "/" in agent_engine_id_or_resource_name: - # Validate resource name. - if len(agent_engine_id_or_resource_name.split("/")) != 6: - raise click.ClickException( - "Agent engine resource name is mal-formatted. It should be of" - " format :" - " projects/{project_id}/locations/{location}/reasoningEngines/{resource_id}" - ) - project = agent_engine_id_or_resource_name.split("/")[1] - location = agent_engine_id_or_resource_name.split("/")[3] - agent_engine_id = agent_engine_id_or_resource_name.split("/")[-1] - else: - envs.load_dotenv_for_agent("", agents_dir) - project = os.environ["GOOGLE_CLOUD_PROJECT"] - location = os.environ["GOOGLE_CLOUD_LOCATION"] - agent_engine_id = agent_engine_id_or_resource_name - return project, location, agent_engine_id + service_registry = get_service_registry() # Build the Memory service if memory_service_uri: - if memory_service_uri.startswith("rag://"): - from ..memory.vertex_ai_rag_memory_service import VertexAiRagMemoryService - - rag_corpus = memory_service_uri.split("://")[1] - if not rag_corpus: - raise click.ClickException("Rag corpus can not be empty.") - envs.load_dotenv_for_agent("", agents_dir) - memory_service = VertexAiRagMemoryService( - rag_corpus=f'projects/{os.environ["GOOGLE_CLOUD_PROJECT"]}/locations/{os.environ["GOOGLE_CLOUD_LOCATION"]}/ragCorpora/{rag_corpus}' - ) - elif memory_service_uri.startswith("agentengine://"): - agent_engine_id_or_resource_name = memory_service_uri.split("://")[1] - project, location, agent_engine_id = _parse_agent_engine_resource_name( - agent_engine_id_or_resource_name - ) - memory_service = VertexAiMemoryBankService( - project=project, - location=location, - agent_engine_id=agent_engine_id, - ) - else: + memory_service = service_registry.create_memory_service( + memory_service_uri, agents_dir=agents_dir + ) + if not memory_service: raise click.ClickException( "Unsupported memory service URI: %s" % memory_service_uri ) @@ -137,34 +99,27 @@ def _parse_agent_engine_resource_name(agent_engine_id_or_resource_name): # Build the Session service if session_service_uri: - if session_service_uri.startswith("agentengine://"): - agent_engine_id_or_resource_name = session_service_uri.split("://")[1] - project, location, agent_engine_id = _parse_agent_engine_resource_name( - agent_engine_id_or_resource_name - ) - session_service = VertexAiSessionService( - project=project, - location=location, - agent_engine_id=agent_engine_id, - ) - else: + session_kwargs = session_db_kwargs or {} + session_service = service_registry.create_session_service( + session_service_uri, agents_dir=agents_dir, **session_kwargs + ) + if not session_service: + # Fallback to DatabaseSessionService if the service registry doesn't + # support the session service URI scheme. from ..sessions.database_session_service import DatabaseSessionService - # Database session additional settings - if session_db_kwargs is None: - session_db_kwargs = {} session_service = DatabaseSessionService( - db_url=session_service_uri, **session_db_kwargs + db_url=session_service_uri, **session_kwargs ) else: session_service = InMemorySessionService() # Build the Artifact service if artifact_service_uri: - if artifact_service_uri.startswith("gs://"): - gcs_bucket = artifact_service_uri.split("://")[1] - artifact_service = GcsArtifactService(bucket_name=gcs_bucket) - else: + artifact_service = service_registry.create_artifact_service( + artifact_service_uri, agents_dir=agents_dir + ) + if not artifact_service: raise click.ClickException( "Unsupported artifact service URI: %s" % artifact_service_uri ) @@ -186,12 +141,18 @@ def _parse_agent_engine_resource_name(agent_engine_id_or_resource_name): eval_sets_manager=eval_sets_manager, eval_set_results_manager=eval_set_results_manager, agents_dir=agents_dir, + extra_plugins=extra_plugins, + logo_text=logo_text, + logo_image_url=logo_image_url, + url_prefix=url_prefix, ) # Callbacks & other optional args for when constructing the FastAPI instance extra_fast_api_args = {} - if trace_to_cloud: + # TODO - Remove separate trace_to_cloud logic once otel_to_cloud stops being + # EXPERIMENTAL. + if trace_to_cloud and not otel_to_cloud: from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter def register_processors(provider: TracerProvider) -> None: @@ -241,45 +202,95 @@ def tear_down_observer(observer: Observer, _: AdkWebServer): app = adk_web_server.get_fast_api_app( lifespan=lifespan, allow_origins=allow_origins, + otel_to_cloud=otel_to_cloud, **extra_fast_api_args, ) - @working_in_progress("builder_save is not ready for use.") @app.post("/builder/save", response_model_exclude_none=True) - async def builder_build(files: list[UploadFile]) -> bool: + async def builder_build( + files: list[UploadFile], tmp: Optional[bool] = False + ) -> bool: base_path = Path.cwd() / agents_dir - for file in files: + if not file.filename: + logger.exception("Agent name is missing in the input files") + return False + agent_name, filename = file.filename.split("/") + agent_dir = os.path.join(base_path, agent_name) try: # File name format: {app_name}/{agent_name}.yaml - if not file.filename: - logger.exception("Agent name is missing in the input files") - return False - - agent_name, filename = file.filename.split("/") - - agent_dir = os.path.join(base_path, agent_name) - os.makedirs(agent_dir, exist_ok=True) - file_path = os.path.join(agent_dir, filename) - - with open(file_path, "wb") as buffer: - shutil.copyfileobj(file.file, buffer) - + if tmp: + agent_dir = os.path.join(agent_dir, "tmp/" + agent_name) + os.makedirs(agent_dir, exist_ok=True) + file_path = os.path.join(agent_dir, filename) + with open(file_path, "wb") as buffer: + shutil.copyfileobj(file.file, buffer) + + else: + source_dir = os.path.join(agent_dir, "tmp/" + agent_name) + destination_dir = agent_dir + for item in os.listdir(source_dir): + source_item = os.path.join(source_dir, item) + destination_item = os.path.join(destination_dir, item) + if os.path.isdir(source_item): + shutil.copytree(source_item, destination_item, dirs_exist_ok=True) + # Check if the item is a file + elif os.path.isfile(source_item): + shutil.copy2(source_item, destination_item) except Exception as e: logger.exception("Error in builder_build: %s", e) return False return True - @working_in_progress("builder_get is not ready for use.") + @app.post("/builder/app/{app_name}/cancel", response_model_exclude_none=True) + async def builder_cancel(app_name: str) -> bool: + base_path = Path.cwd() / agents_dir + agent_dir = os.path.join(base_path, app_name) + destination_dir = os.path.join(agent_dir, "tmp/" + app_name) + source_dir = agent_dir + source_items = set(os.listdir(source_dir)) + try: + for item in os.listdir(destination_dir): + if item in source_items: + continue + # If it doesn't exist in the source, delete it from the destination + item_path = os.path.join(destination_dir, item) + if os.path.isdir(item_path): + shutil.rmtree(item_path) + elif os.path.isfile(item_path): + os.remove(item_path) + + for item in os.listdir(source_dir): + source_item = os.path.join(source_dir, item) + destination_item = os.path.join(destination_dir, item) + if item == "tmp" and os.path.isdir(source_item): + continue + if os.path.isdir(source_item): + shutil.copytree(source_item, destination_item, dirs_exist_ok=True) + # Check if the item is a file + elif os.path.isfile(source_item): + shutil.copy2(source_item, destination_item) + except Exception as e: + logger.exception("Error in builder_build: %s", e) + return False + return True + @app.get( "/builder/app/{app_name}", response_model_exclude_none=True, response_class=PlainTextResponse, ) - async def get_agent_builder(app_name: str, file_path: Optional[str] = None): + async def get_agent_builder( + app_name: str, + file_path: Optional[str] = None, + tmp: Optional[bool] = False, + ): base_path = Path.cwd() / agents_dir agent_dir = base_path / app_name + if tmp: + agent_dir = agent_dir / "tmp" + agent_dir = agent_dir / app_name if not file_path: file_name = "root_agent.yaml" root_file_path = agent_dir / file_name diff --git a/src/google/adk/cli/plugins/__init__.py b/src/google/adk/cli/plugins/__init__.py new file mode 100644 index 0000000000..0a2669d7a2 --- /dev/null +++ b/src/google/adk/cli/plugins/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/google/adk/cli/plugins/recordings_plugin.py b/src/google/adk/cli/plugins/recordings_plugin.py new file mode 100644 index 0000000000..8ee368925a --- /dev/null +++ b/src/google/adk/cli/plugins/recordings_plugin.py @@ -0,0 +1,400 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Recording plugin for ADK conformance testing.""" + +from __future__ import annotations + +import logging +from pathlib import Path +from typing import Any +from typing import Optional +from typing import TYPE_CHECKING + +from google.genai import types +from pydantic import BaseModel +from pydantic import Field +from typing_extensions import override +import yaml + +from ...agents.callback_context import CallbackContext +from ...models.llm_request import LlmRequest +from ...models.llm_response import LlmResponse +from ...plugins.base_plugin import BasePlugin +from ...utils.yaml_utils import dump_pydantic_to_yaml +from .recordings_schema import LlmRecording +from .recordings_schema import Recording +from .recordings_schema import Recordings +from .recordings_schema import ToolRecording + +if TYPE_CHECKING: + from ...agents.invocation_context import InvocationContext + from ...tools.base_tool import BaseTool + from ...tools.tool_context import ToolContext + +logger = logging.getLogger("google_adk." + __name__) + + +class _InvocationRecordingState(BaseModel): + """Per-invocation recording state to isolate concurrent runs.""" + + test_case_path: str + user_message_index: int + records: Recordings + + # Track pending recordings per agent/call + # key: agent_name + pending_llm_recordings: dict[str, Recording] = Field(default_factory=dict) + # key: function_call_id + pending_tool_recordings: dict[str, Recording] = Field(default_factory=dict) + + # Ordered list of pending recordings to maintain chronological order + pending_recordings_order: list[Recording] = Field(default_factory=list) + + +class RecordingsPlugin(BasePlugin): + """Plugin for recording ADK agent interactions.""" + + def __init__(self, *, name: str = "adk_recordings") -> None: + super().__init__(name=name) + + # Track recording state per invocation to support concurrent runs + # key: invocation_id -> _InvocationRecordingState + self._invocation_states: dict[str, _InvocationRecordingState] = {} + + @override + async def before_run_callback( + self, *, invocation_context: InvocationContext + ) -> Optional[types.Content]: + """Always create fresh per-invocation recording state when enabled.""" + ctx = CallbackContext(invocation_context) + if self._is_record_mode_on(ctx): + # Always create/overwrite the state for this invocation + self._create_invocation_state(ctx) + return None + + @override + async def before_model_callback( + self, *, callback_context: CallbackContext, llm_request: LlmRequest + ) -> Optional[LlmResponse]: + """Create pending LLM recording awaiting response. + + Uses per-invocation recording state. Assumes state was created in + before_run; raises if missing to surface misuse. + """ + if not self._is_record_mode_on(callback_context): + return None + + if (state := self._get_invocation_state(callback_context)) is None: + raise ValueError( + "Recording state not initialized. Ensure before_run created it." + ) + + pending_recording = Recording( + user_message_index=state.user_message_index, + agent_name=callback_context.agent_name, + llm_recording=LlmRecording( + llm_request=llm_request, + llm_response=None, + ), + ) + + # Store in both lookup dict and chronological list + state.pending_llm_recordings[callback_context.agent_name] = ( + pending_recording + ) + state.pending_recordings_order.append(pending_recording) + + logger.debug( + "Created pending LLM recording for agent %s: model=%s, contents=%d", + callback_context.agent_name, + llm_request.model, + len(llm_request.contents), + ) + + return None # Continue LLM execution + + @override + async def after_model_callback( + self, *, callback_context: CallbackContext, llm_response: LlmResponse + ) -> Optional[LlmResponse]: + """Complete pending LLM recording for the invocation specified in session state.""" + if not self._is_record_mode_on(callback_context): + return None + + if (state := self._get_invocation_state(callback_context)) is None: + raise ValueError( + "Recording state not initialized. Ensure before_run created it." + ) + + agent_name = callback_context.agent_name + if pending_recording := state.pending_llm_recordings.pop(agent_name, None): + if pending_recording.llm_recording is not None: + pending_recording.llm_recording.llm_response = llm_response + logger.debug("Completed LLM recording for agent %s", agent_name) + else: + logger.warning( + "No pending LLM recording found for agent %s, skipping response", + agent_name, + ) + + return None # Continue LLM execution + + @override + async def before_tool_callback( + self, + *, + tool: BaseTool, + tool_args: dict[str, Any], + tool_context: ToolContext, + ) -> Optional[dict]: + """Create pending tool recording for the invocation specified in session state.""" + if not self._is_record_mode_on(tool_context): + return None + + if not (function_call_id := tool_context.function_call_id): + logger.warning( + "No function_call_id provided for tool %s, skipping recording", + tool.name, + ) + return None # Continue tool execution + + if (state := self._get_invocation_state(tool_context)) is None: + raise ValueError( + "Recording state not initialized. Ensure before_run created it." + ) + + pending_recording = Recording( + user_message_index=state.user_message_index, + agent_name=tool_context.agent_name, + tool_recording=ToolRecording( + tool_call=types.FunctionCall( + id=function_call_id, name=tool.name, args=tool_args + ), + tool_response=None, + ), + ) + + # Store in both lookup dict and chronological list + state.pending_tool_recordings[function_call_id] = pending_recording + state.pending_recordings_order.append(pending_recording) + + logger.debug( + "Created pending tool recording for agent %s: tool=%s, id=%s", + tool_context.agent_name, + tool.name, + function_call_id, + ) + + return None # Continue tool execution + + @override + async def after_tool_callback( + self, + *, + tool: BaseTool, + tool_args: dict[str, Any], + tool_context: ToolContext, + result: dict, + ) -> Optional[dict]: + """Complete pending tool recording for the invocation specified in session state.""" + if not self._is_record_mode_on(tool_context): + return None + + if not (function_call_id := tool_context.function_call_id): + logger.warning( + "No function_call_id provided for tool %s result, skipping" + " completion", + tool.name, + ) + return None # Continue tool execution + + if (state := self._get_invocation_state(tool_context)) is None: + raise ValueError( + "Recording state not initialized. Ensure before_run created it." + ) + + if pending_recording := state.pending_tool_recordings.pop( + function_call_id, None + ): + if pending_recording.tool_recording is not None: + pending_recording.tool_recording.tool_response = types.FunctionResponse( + id=function_call_id, + name=tool.name, + response=result if isinstance(result, dict) else {"result": result}, + ) + logger.debug( + "Completed tool recording for agent %s: tool=%s, id=%s", + pending_recording.agent_name, + tool.name, + function_call_id, + ) + else: + logger.warning( + "No pending tool recording found for id %s, skipping result", + function_call_id, + ) + + return None # Continue tool execution + + @override + async def on_tool_error_callback( + self, + *, + tool: BaseTool, + tool_args: dict[str, Any], + tool_context: ToolContext, + error: Exception, + ) -> Optional[dict]: + """Handle tool error callback with state guard. + + Recording schema does not yet capture errors; we only validate state. + """ + if not self._is_record_mode_on(tool_context): + return None + + if (state := self._get_invocation_state(tool_context)) is None: + raise ValueError( + "Recording state not initialized. Ensure before_run created it." + ) + + logger.debug( + "Tool error occurred for agent %s: tool=%s, id=%s, error=%s", + tool_context.agent_name, + tool.name, + tool_context.function_call_id, + str(error), + ) + return None + + @override + async def after_run_callback( + self, *, invocation_context: InvocationContext + ) -> None: + """Finalize and persist recordings, then clean per-invocation state.""" + ctx = CallbackContext(invocation_context) + if not self._is_record_mode_on(ctx): + return None + + if (state := self._get_invocation_state(ctx)) is None: + raise ValueError( + "Recording state not initialized. Ensure before_run created it." + ) + + try: + for pending in state.pending_recordings_order: + if pending.llm_recording is not None: + if pending.llm_recording.llm_response is not None: + state.records.recordings.append(pending) + else: + logger.warning( + "Incomplete LLM recording for agent %s, skipping", + pending.agent_name, + ) + elif pending.tool_recording is not None: + if pending.tool_recording.tool_response is not None: + state.records.recordings.append(pending) + else: + logger.warning( + "Incomplete tool recording for agent %s, skipping", + pending.agent_name, + ) + + dump_pydantic_to_yaml( + state.records, + f"{state.test_case_path}/generated-recordings.yaml", + sort_keys=False, + ) + logger.info( + "Saved %d recordings to %s/generated-recordings.yaml", + len(state.records.recordings), + state.test_case_path, + ) + except Exception as e: + logger.error("Failed to save interactions: %s", e) + finally: + # Cleanup per-invocation recording state + self._invocation_states.pop(ctx.invocation_id, None) + + # Private helpers (placed after public callbacks) + def _is_record_mode_on(self, callback_context: CallbackContext) -> bool: + """Check if recording mode is enabled for this invocation. + + Args: + callback_context: The callback context containing session state. + + Returns: + True if recording mode is enabled, False otherwise. + """ + # TODO: Investigate how to support with `temp:` states. + session_state = callback_context.state + if not (config := session_state.get("_adk_recordings_config")): + return False + + case_dir = config.get("dir") + msg_index = config.get("user_message_index") + + return case_dir and msg_index is not None + + def _get_invocation_state( + self, callback_context: CallbackContext + ) -> Optional[_InvocationRecordingState]: + """Get existing recording state for this invocation.""" + invocation_id = callback_context.invocation_id + return self._invocation_states.get(invocation_id) + + def _create_invocation_state( + self, callback_context: CallbackContext + ) -> _InvocationRecordingState: + """Create and store recording state for this invocation.""" + invocation_id = callback_context.invocation_id + session_state = callback_context.state + + config = session_state.get("_adk_recordings_config", {}) + case_dir = config.get("dir") + msg_index = config.get("user_message_index") + + if not case_dir or msg_index is None: + raise ValueError("Recording parameters are missing from session state") + + # Load or create recordings + recordings_file = Path(case_dir) / "generated-recordings.yaml" + + if recordings_file.exists(): + try: + with recordings_file.open("r", encoding="utf-8") as f: + recordings_data = yaml.safe_load(f) + records = Recordings.model_validate(recordings_data) + except Exception as e: + logger.error( + "Failed to load recordings from %s: %s", recordings_file, e + ) + records = Recordings(recordings=[]) + else: + records = Recordings(recordings=[]) + + # Create and store invocation state + state = _InvocationRecordingState( + test_case_path=case_dir, + user_message_index=msg_index, + records=records, + ) + self._invocation_states[invocation_id] = state + logger.debug( + "Created recording state for invocation %s: case_dir=%s, msg_index=%s", + invocation_id, + case_dir, + msg_index, + ) + return state diff --git a/src/google/adk/cli/plugins/recordings_schema.py b/src/google/adk/cli/plugins/recordings_schema.py new file mode 100644 index 0000000000..4ae8d060e8 --- /dev/null +++ b/src/google/adk/cli/plugins/recordings_schema.py @@ -0,0 +1,88 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Pydantic models for ADK recordings.""" + +from __future__ import annotations + +from typing import Optional + +from google.genai import types +from pydantic import BaseModel +from pydantic import ConfigDict +from pydantic import Field + +from ...models.llm_request import LlmRequest +from ...models.llm_response import LlmResponse + + +class LlmRecording(BaseModel): + """Paired LLM request and response.""" + + model_config = ConfigDict( + extra="forbid", + ) + + llm_request: Optional[LlmRequest] = None + """Required. The LLM request.""" + + llm_response: Optional[LlmResponse] = None + """Required. The LLM response.""" + + +class ToolRecording(BaseModel): + """Paired tool call and response.""" + + model_config = ConfigDict( + extra="forbid", + ) + + tool_call: Optional[types.FunctionCall] = None + """Required. The tool call.""" + + tool_response: Optional[types.FunctionResponse] = None + """Required. The tool response.""" + + +class Recording(BaseModel): + """Single interaction recording, ordered by request timestamp.""" + + model_config = ConfigDict( + extra="forbid", + ) + + user_message_index: int + """Index of the user message this recording belongs to (0-based).""" + + agent_name: str + """Name of the agent.""" + + # oneof fields - start + llm_recording: Optional[LlmRecording] = None + """LLM request-response pair.""" + + tool_recording: Optional[ToolRecording] = None + """Tool call-response pair.""" + # oneof fields - end + + +class Recordings(BaseModel): + """All recordings in chronological order.""" + + model_config = ConfigDict( + extra="forbid", + ) + + recordings: list[Recording] = Field(default_factory=list) + """Chronological list of all recordings.""" diff --git a/src/google/adk/cli/plugins/replay_plugin.py b/src/google/adk/cli/plugins/replay_plugin.py new file mode 100644 index 0000000000..1ca63f6dd3 --- /dev/null +++ b/src/google/adk/cli/plugins/replay_plugin.py @@ -0,0 +1,382 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Replay plugin for ADK conformance testing.""" + +from __future__ import annotations + +import logging +from pathlib import Path +from typing import Any +from typing import Optional +from typing import TYPE_CHECKING + +from google.genai import types +from pydantic import BaseModel +from pydantic import Field +from typing_extensions import override +import yaml + +from ...agents.callback_context import CallbackContext +from ...models.llm_request import LlmRequest +from ...models.llm_response import LlmResponse +from ...plugins.base_plugin import BasePlugin +from .recordings_schema import LlmRecording +from .recordings_schema import Recording +from .recordings_schema import Recordings +from .recordings_schema import ToolRecording + +if TYPE_CHECKING: + from ...agents.invocation_context import InvocationContext + from ...tools.base_tool import BaseTool + from ...tools.tool_context import ToolContext + +logger = logging.getLogger("google_adk." + __name__) + + +class ReplayVerificationError(Exception): + """Exception raised when replay verification fails.""" + + pass + + +class ReplayConfigError(Exception): + """Exception raised when replay configuration is invalid or missing.""" + + pass + + +class _InvocationReplayState(BaseModel): + """Per-invocation replay state to isolate concurrent runs.""" + + test_case_path: str + user_message_index: int + recordings: Recordings + + # Per-agent replay indices for parallel execution + # key: agent_name -> current replay index for that agent + agent_replay_indices: dict[str, int] = Field(default_factory=dict) + + +class ReplayPlugin(BasePlugin): + """Plugin for replaying ADK agent interactions from recordings.""" + + def __init__(self, *, name: str = "adk_replay") -> None: + super().__init__(name=name) + + # Track replay state per invocation to support concurrent runs + # key: invocation_id -> _InvocationReplayState + self._invocation_states: dict[str, _InvocationReplayState] = {} + + @override + async def before_run_callback( + self, *, invocation_context: InvocationContext + ) -> Optional[types.Content]: + """Load replay recordings when enabled.""" + ctx = CallbackContext(invocation_context) + if self._is_replay_mode_on(ctx): + # Load the replay state for this invocation + self._load_invocation_state(ctx) + return None + + @override + async def before_model_callback( + self, *, callback_context: CallbackContext, llm_request: LlmRequest + ) -> Optional[LlmResponse]: + """Replay LLM response from recordings instead of making real call.""" + if not self._is_replay_mode_on(callback_context): + return None + + if (state := self._get_invocation_state(callback_context)) is None: + raise ReplayConfigError( + "Replay state not initialized. Ensure before_run created it." + ) + + agent_name = callback_context.agent_name + + # Verify and get the next LLM recording for this specific agent + recording = self._verify_and_get_next_llm_recording_for_agent( + state, agent_name, llm_request + ) + + logger.debug("Verified and replaying LLM response for agent %s", agent_name) + + # Return the recorded response + return recording.llm_response + + @override + async def before_tool_callback( + self, + *, + tool: BaseTool, + tool_args: dict[str, Any], + tool_context: ToolContext, + ) -> Optional[dict]: + """Replay tool response from recordings instead of executing tool.""" + if not self._is_replay_mode_on(tool_context): + return None + + if (state := self._get_invocation_state(tool_context)) is None: + raise ReplayConfigError( + "Replay state not initialized. Ensure before_run created it." + ) + + agent_name = tool_context.agent_name + + # Verify and get the next tool recording for this specific agent + recording = self._verify_and_get_next_tool_recording_for_agent( + state, agent_name, tool.name, tool_args + ) + + from google.adk.tools.agent_tool import AgentTool + + if not isinstance(tool, AgentTool): + # TODO: support replay requests and responses from AgentTool. + await tool.run_async(args=tool_args, tool_context=tool_context) + + logger.debug( + "Verified and replaying tool response for agent %s: tool=%s", + agent_name, + tool.name, + ) + + # Return the recorded response + return recording.tool_response.response + + @override + async def after_run_callback( + self, *, invocation_context: InvocationContext + ) -> None: + """Clean up replay state after invocation completes.""" + ctx = CallbackContext(invocation_context) + if not self._is_replay_mode_on(ctx): + return None + + # Clean up per-invocation replay state + self._invocation_states.pop(ctx.invocation_id, None) + logger.debug("Cleaned up replay state for invocation %s", ctx.invocation_id) + + # Private helpers + def _is_replay_mode_on(self, callback_context: CallbackContext) -> bool: + """Check if replay mode is enabled for this invocation.""" + session_state = callback_context.state + if not (config := session_state.get("_adk_replay_config")): + return False + + case_dir = config.get("dir") + msg_index = config.get("user_message_index") + + return case_dir and msg_index is not None + + def _get_invocation_state( + self, callback_context: CallbackContext + ) -> Optional[_InvocationReplayState]: + """Get existing replay state for this invocation.""" + invocation_id = callback_context.invocation_id + return self._invocation_states.get(invocation_id) + + def _load_invocation_state( + self, callback_context: CallbackContext + ) -> _InvocationReplayState: + """Load and store replay state for this invocation.""" + invocation_id = callback_context.invocation_id + session_state = callback_context.state + + config = session_state.get("_adk_replay_config", {}) + case_dir = config.get("dir") + msg_index = config.get("user_message_index") + + if not case_dir or msg_index is None: + raise ReplayConfigError( + "Replay parameters are missing from session state" + ) + + # Load recordings + recordings_file = Path(case_dir) / "generated-recordings.yaml" + + if not recordings_file.exists(): + raise ReplayConfigError(f"Recordings file not found: {recordings_file}") + + try: + with recordings_file.open("r", encoding="utf-8") as f: + recordings_data = yaml.safe_load(f) + recordings = Recordings.model_validate(recordings_data) + except Exception as e: + raise ReplayConfigError( + f"Failed to load recordings from {recordings_file}: {e}" + ) from e + + # Load and store invocation state + state = _InvocationReplayState( + test_case_path=case_dir, + user_message_index=msg_index, + recordings=recordings, + ) + self._invocation_states[invocation_id] = state + logger.debug( + "Loaded replay state for invocation %s: case_dir=%s, msg_index=%s, " + "recordings=%d", + invocation_id, + case_dir, + msg_index, + len(recordings.recordings), + ) + return state + + def _get_next_recording_for_agent( + self, + state: _InvocationReplayState, + agent_name: str, + ) -> Recording: + """Get the next recording for the specific agent in strict order.""" + # Get current agent index + current_agent_index = state.agent_replay_indices.get(agent_name, 0) + + # Filter ALL recordings for this agent and user message index (strict order) + agent_recordings = [ + recording + for recording in state.recordings.recordings + if ( + recording.agent_name == agent_name + and recording.user_message_index == state.user_message_index + ) + ] + + # Check if we have enough recordings for this agent + if current_agent_index >= len(agent_recordings): + raise ReplayVerificationError( + f"Runtime sent more requests than expected for agent '{agent_name}'" + f" at user_message_index {state.user_message_index}. Expected" + f" {len(agent_recordings)}, but got request at index" + f" {current_agent_index}" + ) + + # Get the expected recording + expected_recording = agent_recordings[current_agent_index] + + # Advance agent index + state.agent_replay_indices[agent_name] = current_agent_index + 1 + + return expected_recording + + def _verify_and_get_next_llm_recording_for_agent( + self, + state: _InvocationReplayState, + agent_name: str, + llm_request: LlmRequest, + ) -> LlmRecording: + """Verify and get the next LLM recording for the specific agent.""" + current_agent_index = state.agent_replay_indices.get(agent_name, 0) + expected_recording = self._get_next_recording_for_agent(state, agent_name) + + # Verify this is an LLM recording + if not expected_recording.llm_recording: + raise ReplayVerificationError( + f"Expected LLM recording for agent '{agent_name}' at index " + f"{current_agent_index}, but found tool recording" + ) + + # Strict verification of LLM request + self._verify_llm_request_match( + expected_recording.llm_recording.llm_request, + llm_request, + agent_name, + current_agent_index, + ) + + return expected_recording.llm_recording + + def _verify_and_get_next_tool_recording_for_agent( + self, + state: _InvocationReplayState, + agent_name: str, + tool_name: str, + tool_args: dict[str, Any], + ) -> ToolRecording: + """Verify and get the next tool recording for the specific agent.""" + current_agent_index = state.agent_replay_indices.get(agent_name, 0) + expected_recording = self._get_next_recording_for_agent(state, agent_name) + + # Verify this is a tool recording + if not expected_recording.tool_recording: + raise ReplayVerificationError( + f"Expected tool recording for agent '{agent_name}' at index " + f"{current_agent_index}, but found LLM recording" + ) + + # Strict verification of tool call + self._verify_tool_call_match( + expected_recording.tool_recording.tool_call, + tool_name, + tool_args, + agent_name, + current_agent_index, + ) + + return expected_recording.tool_recording + + def _verify_llm_request_match( + self, + recorded_request: LlmRequest, + current_request: LlmRequest, + agent_name: str, + agent_index: int, + ) -> None: + """Verify that the current LLM request exactly matches the recorded one.""" + # Comprehensive exclude dict for all fields that can differ between runs + excluded_fields = { + "live_connect_config": True, + "config": { # some config fields can vary per run + "http_options": True, + "labels": True, + }, + } + + # Compare using model dumps with nested exclude dict + recorded_dict = recorded_request.model_dump( + exclude_none=True, exclude=excluded_fields, exclude_defaults=True + ) + current_dict = current_request.model_dump( + exclude_none=True, exclude=excluded_fields, exclude_defaults=True + ) + + if recorded_dict != current_dict: + raise ReplayVerificationError( + f"""LLM request mismatch for agent '{agent_name}' (index {agent_index}): +recorded: {recorded_dict} +current: {current_dict}""" + ) + + def _verify_tool_call_match( + self, + recorded_call: types.FunctionCall, + tool_name: str, + tool_args: dict[str, Any], + agent_name: str, + agent_index: int, + ) -> None: + """Verify that the current tool call exactly matches the recorded one.""" + if recorded_call.name != tool_name: + raise ReplayVerificationError( + f"""Tool name mismatch for agent '{agent_name}' at index {agent_index}: +recorded: '{recorded_call.name}' +current: '{tool_name}'""" + ) + + if recorded_call.args != tool_args: + raise ReplayVerificationError( + f"""Tool args mismatch for agent '{agent_name}' at index {agent_index}: +recorded: {recorded_call.args} +current: {tool_args}""" + ) diff --git a/src/google/adk/cli/service_registry.py b/src/google/adk/cli/service_registry.py new file mode 100644 index 0000000000..bc95bad285 --- /dev/null +++ b/src/google/adk/cli/service_registry.py @@ -0,0 +1,224 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import os +from typing import Any +from typing import Dict +from typing import Protocol +from urllib.parse import urlparse + +from ..artifacts.base_artifact_service import BaseArtifactService +from ..memory.base_memory_service import BaseMemoryService +from ..sessions.base_session_service import BaseSessionService + + +def _load_gcp_config( + agents_dir: str | None, service_name: str +) -> tuple[str, str]: + """Loads GCP project and location from environment.""" + if not agents_dir: + raise ValueError(f"agents_dir must be provided for {service_name}") + + from .utils import envs + + envs.load_dotenv_for_agent("", agents_dir) + + project = os.environ.get("GOOGLE_CLOUD_PROJECT") + location = os.environ.get("GOOGLE_CLOUD_LOCATION") + + if not project or not location: + raise ValueError("GOOGLE_CLOUD_PROJECT or GOOGLE_CLOUD_LOCATION not set.") + + return project, location + + +def _parse_agent_engine_kwargs( + uri_part: str, agents_dir: str | None +) -> dict[str, Any]: + """Helper to parse agent engine resource name.""" + if not uri_part: + raise ValueError( + "Agent engine resource name or resource id can not be empty." + ) + if "/" in uri_part: + parts = uri_part.split("/") + if not ( + len(parts) == 6 + and parts[0] == "projects" + and parts[2] == "locations" + and parts[4] == "reasoningEngines" + ): + raise ValueError( + "Agent engine resource name is mal-formatted. It should be of" + " format :" + " projects/{project_id}/locations/{location}/reasoningEngines/{resource_id}" + ) + project = parts[1] + location = parts[3] + agent_engine_id = parts[5] + else: + project, location = _load_gcp_config( + agents_dir, "short-form agent engine IDs" + ) + agent_engine_id = uri_part + return { + "project": project, + "location": location, + "agent_engine_id": agent_engine_id, + } + + +class ServiceFactory(Protocol): + """Protocol for service factory functions.""" + + def __call__( + self, uri: str, **kwargs + ) -> BaseSessionService | BaseArtifactService | BaseMemoryService: + ... + + +class ServiceRegistry: + """Registry for custom service URI schemes.""" + + def __init__(self): + self._session_factories: Dict[str, ServiceFactory] = {} + self._artifact_factories: Dict[str, ServiceFactory] = {} + self._memory_factories: Dict[str, ServiceFactory] = {} + + def register_session_service( + self, scheme: str, factory: ServiceFactory + ) -> None: + """Register a factory for a custom session service URI scheme. + + Args: + scheme: URI scheme (e.g., 'custom') + factory: Callable that takes (uri, **kwargs) and returns + BaseSessionService + """ + self._session_factories[scheme] = factory + + def register_artifact_service( + self, scheme: str, factory: ServiceFactory + ) -> None: + """Register a factory for a custom artifact service URI scheme.""" + self._artifact_factories[scheme] = factory + + def register_memory_service( + self, scheme: str, factory: ServiceFactory + ) -> None: + """Register a factory for a custom memory service URI scheme.""" + self._memory_factories[scheme] = factory + + def create_session_service( + self, uri: str, **kwargs + ) -> BaseSessionService | None: + """Create session service from URI using registered factories.""" + scheme = urlparse(uri).scheme + if scheme and scheme in self._session_factories: + return self._session_factories[scheme](uri, **kwargs) + return None + + def create_artifact_service( + self, uri: str, **kwargs + ) -> BaseArtifactService | None: + """Create artifact service from URI using registered factories.""" + scheme = urlparse(uri).scheme + if scheme and scheme in self._artifact_factories: + return self._artifact_factories[scheme](uri, **kwargs) + return None + + def create_memory_service( + self, uri: str, **kwargs + ) -> BaseMemoryService | None: + """Create memory service from URI using registered factories.""" + scheme = urlparse(uri).scheme + if scheme and scheme in self._memory_factories: + return self._memory_factories[scheme](uri, **kwargs) + return None + + +def _register_builtin_services(registry: ServiceRegistry) -> None: + """Register built-in service implementations.""" + + # -- Session Services -- + def agentengine_session_factory(uri: str, **kwargs): + from ..sessions.vertex_ai_session_service import VertexAiSessionService + + parsed = urlparse(uri) + params = _parse_agent_engine_kwargs( + parsed.netloc + parsed.path, kwargs.get("agents_dir") + ) + return VertexAiSessionService(**params) + + def database_session_factory(uri: str, **kwargs): + from ..sessions.database_session_service import DatabaseSessionService + + kwargs_copy = kwargs.copy() + kwargs_copy.pop("agents_dir", None) + return DatabaseSessionService(db_url=uri, **kwargs_copy) + + registry.register_session_service("agentengine", agentengine_session_factory) + for scheme in ["sqlite", "postgresql", "mysql"]: + registry.register_session_service(scheme, database_session_factory) + + # -- Artifact Services -- + def gcs_artifact_factory(uri: str, **kwargs): + from ..artifacts.gcs_artifact_service import GcsArtifactService + + kwargs_copy = kwargs.copy() + kwargs_copy.pop("agents_dir", None) + parsed_uri = urlparse(uri) + bucket_name = parsed_uri.netloc + return GcsArtifactService(bucket_name=bucket_name, **kwargs_copy) + + registry.register_artifact_service("gs", gcs_artifact_factory) + + # -- Memory Services -- + def rag_memory_factory(uri: str, **kwargs): + from ..memory.vertex_ai_rag_memory_service import VertexAiRagMemoryService + + rag_corpus = urlparse(uri).netloc + if not rag_corpus: + raise ValueError("Rag corpus can not be empty.") + agents_dir = kwargs.get("agents_dir") + project, location = _load_gcp_config(agents_dir, "RAG memory service") + return VertexAiRagMemoryService( + rag_corpus=( + f"projects/{project}/locations/{location}/ragCorpora/{rag_corpus}" + ) + ) + + def agentengine_memory_factory(uri: str, **kwargs): + from ..memory.vertex_ai_memory_bank_service import VertexAiMemoryBankService + + parsed = urlparse(uri) + params = _parse_agent_engine_kwargs( + parsed.netloc + parsed.path, kwargs.get("agents_dir") + ) + return VertexAiMemoryBankService(**params) + + registry.register_memory_service("rag", rag_memory_factory) + registry.register_memory_service("agentengine", agentengine_memory_factory) + + +# Global registry instance +_global_registry = ServiceRegistry() +_register_builtin_services(_global_registry) + + +def get_service_registry() -> ServiceRegistry: + """Get the global service registry instance.""" + return _global_registry diff --git a/src/google/adk/cli/utils/agent_loader.py b/src/google/adk/cli/utils/agent_loader.py index 0e5ed08da3..0755c9147c 100644 --- a/src/google/adk/cli/utils/agent_loader.py +++ b/src/google/adk/cli/utils/agent_loader.py @@ -15,6 +15,7 @@ from __future__ import annotations import importlib +import importlib.util import logging import os from pathlib import Path @@ -94,7 +95,7 @@ def _load_from_module_or_package( if e.name == agent_name: logger.debug("Module %s itself not found.", agent_name) else: - # it's the case the module imported by {agent_name}.agent module is not + # the module imported by {agent_name}.agent module is not # found e.msg = f"Fail to load '{agent_name}' module. " + e.msg raise e @@ -141,8 +142,7 @@ def _load_from_submodule( if e.name == f"{agent_name}.agent" or e.name == agent_name: logger.debug("Module %s.agent not found.", agent_name) else: - # it's the case the module imported by {agent_name}.agent module is not - # found + # the module imported by {agent_name}.agent module is not found e.msg = f"Fail to load '{agent_name}.agent' module. " + e.msg raise e except Exception as e: @@ -205,24 +205,96 @@ def _perform_load(self, agent_name: str) -> Union[BaseAgent, App]: envs.load_dotenv_for_agent(actual_agent_name, str(agents_dir)) if root_agent := self._load_from_module_or_package(actual_agent_name): + self._record_origin_metadata( + loaded=root_agent, + expected_app_name=actual_agent_name, + module_name=actual_agent_name, + agents_dir=agents_dir, + ) return root_agent if root_agent := self._load_from_submodule(actual_agent_name): + self._record_origin_metadata( + loaded=root_agent, + expected_app_name=actual_agent_name, + module_name=f"{actual_agent_name}.agent", + agents_dir=agents_dir, + ) return root_agent if root_agent := self._load_from_yaml_config(actual_agent_name, agents_dir): + self._record_origin_metadata( + loaded=root_agent, + expected_app_name=actual_agent_name, + module_name=None, + agents_dir=agents_dir, + ) return root_agent # If no root_agent was found by any pattern + # Check if user might be in the wrong directory + hint = "" + agents_path = Path(agents_dir) + if ( + agents_path.joinpath("agent.py").is_file() + or agents_path.joinpath("root_agent.yaml").is_file() + ): + hint = ( + "\n\nHINT: It looks like this command might be running from inside an" + " agent directory. Run it from the parent directory that contains" + " your agent folder (for example the project root) so the loader can" + " locate your agents." + ) + raise ValueError( f"No root_agent found for '{agent_name}'. Searched in" f" '{actual_agent_name}.agent.root_agent'," f" '{actual_agent_name}.root_agent' and" - f" '{actual_agent_name}/root_agent.yaml'. Ensure" - f" '{agents_dir}/{actual_agent_name}' is structured correctly, an .env" - " file can be loaded if present, and a root_agent is exposed." + f" '{actual_agent_name}/root_agent.yaml'.\n\nExpected directory" + f" structure:\n /\n {actual_agent_name}/\n " + " agent.py (with root_agent) OR\n root_agent.yaml\n\nThen run:" + f" adk web \n\nEnsure '{agents_dir}/{actual_agent_name}' is" + " structured correctly, an .env file can be loaded if present, and a" + f" root_agent is exposed.{hint}" ) + def _record_origin_metadata( + self, + *, + loaded: Union[BaseAgent, App], + expected_app_name: str, + module_name: Optional[str], + agents_dir: str, + ) -> None: + """Annotates loaded agent/App with its origin for later diagnostics.""" + + # Do not attach metadata for built-in agents (double underscore names). + if expected_app_name.startswith("__"): + return + + origin_path: Optional[Path] = None + if module_name: + spec = importlib.util.find_spec(module_name) + if spec and spec.origin: + module_origin = Path(spec.origin).resolve() + origin_path = ( + module_origin.parent if module_origin.is_file() else module_origin + ) + + if origin_path is None: + candidate = Path(agents_dir, expected_app_name) + origin_path = candidate if candidate.exists() else Path(agents_dir) + + def _attach_metadata(target: Union[BaseAgent, App]) -> None: + setattr(target, "_adk_origin_app_name", expected_app_name) + setattr(target, "_adk_origin_path", origin_path) + + if isinstance(loaded, App): + _attach_metadata(loaded) + _attach_metadata(loaded.root_agent) + else: + _attach_metadata(loaded) + @override def load_agent(self, agent_name: str) -> Union[BaseAgent, App]: """Load an agent module (with caching & .env) and return its root_agent.""" diff --git a/src/google/adk/cli/utils/evals.py b/src/google/adk/cli/utils/evals.py index 305d475448..715c07c147 100644 --- a/src/google/adk/cli/utils/evals.py +++ b/src/google/adk/cli/utils/evals.py @@ -14,19 +14,14 @@ from __future__ import annotations -import dataclasses import os -from typing import Any -from typing import Tuple -from google.genai import types as genai_types from pydantic import alias_generators from pydantic import BaseModel from pydantic import ConfigDict -from typing_extensions import deprecated -from ...evaluation.eval_case import IntermediateData from ...evaluation.eval_case import Invocation +from ...evaluation.evaluation_generator import EvaluationGenerator from ...evaluation.gcs_eval_set_results_manager import GcsEvalSetResultsManager from ...evaluation.gcs_eval_sets_manager import GcsEvalSetsManager from ...sessions.session import Session @@ -44,83 +39,6 @@ class GcsEvalManagers(BaseModel): eval_set_results_manager: GcsEvalSetResultsManager -@deprecated('Use convert_session_to_eval_invocations instead.') -def convert_session_to_eval_format(session: Session) -> list[dict[str, Any]]: - """Converts a session data into eval format. - - Args: - session: The session that should be converted. - - Returns: - list: A single evaluation dataset in the required format. - """ - eval_case = [] - events = session.events if session and session.events else [] - - for event in events: - if event.author == 'user': - if not event.content or not event.content.parts: - continue - - # Extract user query - content = event.content - parts = content.parts - - query = parts[0].text or '' - - # Find the corresponding tool usage or response for the query - expected_tool_use = [] - intermediate_agent_responses = [] - - # Check subsequent events to extract tool uses or responses for this turn. - for subsequent_event in events[events.index(event) + 1 :]: - event_author = subsequent_event.author or 'agent' - if event_author == 'user': - # We found an event where the author was the user. This means that a - # new turn has started. So close this turn here. - break - - if not subsequent_event.content or not subsequent_event.content.parts: - continue - - for subsequent_part in subsequent_event.content.parts: - # Some events have both function call and reference - - if subsequent_part.function_call: - tool_name = subsequent_part.function_call.name or '' - tool_input = subsequent_part.function_call.args or {} - expected_tool_use.append({ - 'tool_name': tool_name, - 'tool_input': tool_input, - }) - elif subsequent_part.text: - # Also keep track of all the natural language responses that - # agent (or sub agents) generated. - intermediate_agent_responses.append( - {'author': event_author, 'text': subsequent_part.text} - ) - - # If we are here then either we are done reading all the events or we - # encountered an event that had content authored by the end-user. - # This, basically means an end of turn. - # We assume that the last natural language intermediate response is the - # final response from the agent/model. We treat that as a reference. - eval_case.append({ - 'query': query, - 'expected_tool_use': expected_tool_use, - 'expected_intermediate_agent_responses': intermediate_agent_responses[ - :-1 - ], - 'reference': ( - intermediate_agent_responses[-1]['text'] - if intermediate_agent_responses - else '' - ), - }) - - return eval_case - - def convert_session_to_eval_invocations(session: Session) -> list[Invocation]: """Converts a session data into a list of Invocation. @@ -130,71 +48,8 @@ def convert_session_to_eval_invocations(session: Session) -> list[Invocation]: Returns: list: A list of invocation. """ - invocations: list[Invocation] = [] events = session.events if session and session.events else [] - - for event in events: - if event.author == 'user': - if not event.content or not event.content.parts: - continue - - # The content present in this event is the user content. - user_content = event.content - invocation_id = event.invocation_id - invocaton_timestamp = event.timestamp - - # Find the corresponding tool usage or response for the query - tool_uses: list[genai_types.FunctionCall] = [] - intermediate_responses: list[Tuple[str, list[genai_types.Part]]] = [] - - # Check subsequent events to extract tool uses or responses for this turn. - for subsequent_event in events[events.index(event) + 1 :]: - event_author = subsequent_event.author or 'agent' - if event_author == 'user': - # We found an event where the author was the user. This means that a - # new turn has started. So close this turn here. - break - - if not subsequent_event.content or not subsequent_event.content.parts: - continue - - intermediate_response_parts = [] - for subsequent_part in subsequent_event.content.parts: - # Some events have both function call and reference - if subsequent_part.function_call: - tool_uses.append(subsequent_part.function_call) - elif subsequent_part.text: - # Also keep track of all the natural language responses that - # agent (or sub agents) generated. - intermediate_response_parts.append(subsequent_part) - - if intermediate_response_parts: - # Only add an entry if there any intermediate entries. - intermediate_responses.append( - (event_author, intermediate_response_parts) - ) - - # If we are here then either we are done reading all the events or we - # encountered an event that had content authored by the end-user. - # This, basically means an end of turn. - # We assume that the last natural language intermediate response is the - # final response from the agent/model. We treat that as a reference. - invocations.append( - Invocation( - user_content=user_content, - invocation_id=invocation_id, - creation_timestamp=invocaton_timestamp, - intermediate_data=IntermediateData( - tool_uses=tool_uses, - intermediate_responses=intermediate_responses[:-1], - ), - final_response=genai_types.Content( - parts=intermediate_responses[-1][1] - ), - ) - ) - - return invocations + return EvaluationGenerator.convert_events_to_eval_invocations(events) def create_gcs_eval_managers_from_uri( diff --git a/src/google/adk/code_executors/__init__.py b/src/google/adk/code_executors/__init__.py index 41d406f63d..edeaf5d272 100644 --- a/src/google/adk/code_executors/__init__.py +++ b/src/google/adk/code_executors/__init__.py @@ -12,6 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import annotations + import logging from .base_code_executor import BaseCodeExecutor @@ -29,6 +31,7 @@ 'VertexAiCodeExecutor', 'ContainerCodeExecutor', 'GkeCodeExecutor', + 'AgentEngineSandboxCodeExecutor', ] @@ -63,4 +66,14 @@ def __getattr__(name: str): 'GkeCodeExecutor requires additional dependencies. ' 'Please install with: pip install "google-adk[extensions]"' ) from e + elif name == 'AgentEngineSandboxCodeExecutor': + try: + from .agent_engine_sandbox_code_executor import AgentEngineSandboxCodeExecutor + + return AgentEngineSandboxCodeExecutor + except ImportError as e: + raise ImportError( + 'AgentEngineSandboxCodeExecutor requires additional dependencies. ' + 'Please install with: pip install "google-adk[extensions]"' + ) from e raise AttributeError(f"module '{__name__}' has no attribute '{name}'") diff --git a/src/google/adk/code_executors/agent_engine_sandbox_code_executor.py b/src/google/adk/code_executors/agent_engine_sandbox_code_executor.py new file mode 100644 index 0000000000..135c56bcbc --- /dev/null +++ b/src/google/adk/code_executors/agent_engine_sandbox_code_executor.py @@ -0,0 +1,188 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import json +import logging +import mimetypes +import re +from typing import Optional + +from typing_extensions import override +import vertexai +from vertexai import types + +from ..agents.invocation_context import InvocationContext +from ..utils.feature_decorator import experimental +from .base_code_executor import BaseCodeExecutor +from .code_execution_utils import CodeExecutionInput +from .code_execution_utils import CodeExecutionResult +from .code_execution_utils import File + +logger = logging.getLogger('google_adk.' + __name__) + + +@experimental +class AgentEngineSandboxCodeExecutor(BaseCodeExecutor): + """A code executor that uses Agent Engine Code Execution Sandbox to execute code. + + Attributes: + sandbox_resource_name: If set, load the existing resource name of the code + interpreter extension instead of creating a new one. Format: + projects/123/locations/us-central1/reasoningEngines/456/sandboxEnvironments/789 + """ + + sandbox_resource_name: str = None + + def __init__( + self, + sandbox_resource_name: Optional[str] = None, + agent_engine_resource_name: Optional[str] = None, + **data, + ): + """Initializes the AgentEngineSandboxCodeExecutor. + + Args: + sandbox_resource_name: If set, load the existing resource name of code + execution sandbox, if not set, create a new one. Format: + projects/123/locations/us-central1/reasoningEngines/456/ + sandboxEnvironments/789 + agent_engine_resource_name: The resource name of the agent engine to use + to create the code execution sandbox. Format: + projects/123/locations/us-central1/reasoningEngines/456, when both + sandbox_resource_name and agent_engine_resource_name are set, + agent_engine_resource_name will be ignored. + **data: Additional keyword arguments to be passed to the base class. + """ + super().__init__(**data) + sandbox_resource_name_pattern = r'^projects/([a-zA-Z0-9-_]+)/locations/([a-zA-Z0-9-_]+)/reasoningEngines/(\d+)/sandboxEnvironments/(\d+)$' + agent_engine_resource_name_pattern = r'^projects/([a-zA-Z0-9-_]+)/locations/([a-zA-Z0-9-_]+)/reasoningEngines/(\d+)$' + + if sandbox_resource_name is not None: + self.sandbox_resource_name = sandbox_resource_name + self._project_id, self._location = ( + self._get_project_id_and_location_from_resource_name( + sandbox_resource_name, sandbox_resource_name_pattern + ) + ) + elif agent_engine_resource_name is not None: + self._project_id, self._location = ( + self._get_project_id_and_location_from_resource_name( + agent_engine_resource_name, agent_engine_resource_name_pattern + ) + ) + # @TODO - Add TTL for sandbox creation after it is available + # in SDK. + operation = self._get_api_client().agent_engines.sandboxes.create( + spec={'code_execution_environment': {}}, + name=agent_engine_resource_name, + config=types.CreateAgentEngineSandboxConfig( + display_name='default_sandbox' + ), + ) + self.sandbox_resource_name = operation.response.name + else: + raise ValueError( + 'Either sandbox_resource_name or agent_engine_resource_name must be' + ' set.' + ) + + @override + def execute_code( + self, + invocation_context: InvocationContext, + code_execution_input: CodeExecutionInput, + ) -> CodeExecutionResult: + # Execute the code. + input_data = { + 'code': code_execution_input.code, + } + if code_execution_input.input_files: + input_data['files'] = [ + { + 'name': f.name, + 'contents': f.content, + 'mimeType': f.mime_type, + } + for f in code_execution_input.input_files + ] + + code_execution_response = ( + self._get_api_client().agent_engines.sandboxes.execute_code( + name=self.sandbox_resource_name, + input_data=input_data, + ) + ) + logger.debug('Executed code:\n```\n%s\n```', code_execution_input.code) + saved_files = [] + stdout = '' + stderr = '' + for output in code_execution_response.outputs: + if output.mime_type == 'application/json' and ( + output.metadata is None + or output.metadata.attributes is None + or 'file_name' not in output.metadata.attributes + ): + json_output_data = json.loads(output.data.decode('utf-8')) + stdout = json_output_data.get('stdout', '') + stderr = json_output_data.get('stderr', '') + else: + file_name = '' + if ( + output.metadata is not None + and output.metadata.attributes is not None + ): + file_name = output.metadata.attributes.get('file_name', b'').decode( + 'utf-8' + ) + mime_type = output.mime_type + if not mime_type: + mime_type, _ = mimetypes.guess_type(file_name) + saved_files.append( + File( + name=file_name, + content=output.data, + mime_type=mime_type, + ) + ) + + # Collect the final result. + return CodeExecutionResult( + stdout=stdout, + stderr=stderr, + output_files=saved_files, + ) + + def _get_api_client(self): + """Instantiates an API client for the given project and location. + + It needs to be instantiated inside each request so that the event loop + management can be properly propagated. + + Returns: + An API client for the given project and location. + """ + return vertexai.Client(project=self._project_id, location=self._location) + + def _get_project_id_and_location_from_resource_name( + self, resource_name: str, pattern: str + ) -> tuple[str, str]: + """Extracts the project ID and location from the resource name.""" + match = re.fullmatch(pattern, resource_name) + + if not match: + raise ValueError(f'resource name {resource_name} is not valid.') + + return match.groups()[0], match.groups()[1] diff --git a/src/google/adk/code_executors/built_in_code_executor.py b/src/google/adk/code_executors/built_in_code_executor.py index 35a50c9067..402d9f557a 100644 --- a/src/google/adk/code_executors/built_in_code_executor.py +++ b/src/google/adk/code_executors/built_in_code_executor.py @@ -19,7 +19,7 @@ from ..agents.invocation_context import InvocationContext from ..models import LlmRequest -from ..utils.model_name_utils import is_gemini_2_model +from ..utils.model_name_utils import is_gemini_2_or_above from .base_code_executor import BaseCodeExecutor from .code_execution_utils import CodeExecutionInput from .code_execution_utils import CodeExecutionResult @@ -42,7 +42,7 @@ def execute_code( def process_llm_request(self, llm_request: LlmRequest) -> None: """Pre-process the LLM request for Gemini 2.0+ models to use the code execution tool.""" - if is_gemini_2_model(llm_request.model): + if is_gemini_2_or_above(llm_request.model): llm_request.config = llm_request.config or types.GenerateContentConfig() llm_request.config.tools = llm_request.config.tools or [] llm_request.config.tools.append( diff --git a/src/google/adk/code_executors/code_execution_utils.py b/src/google/adk/code_executors/code_execution_utils.py index 8a20218378..86aa085acf 100644 --- a/src/google/adk/code_executors/code_execution_utils.py +++ b/src/google/adk/code_executors/code_execution_utils.py @@ -14,6 +14,8 @@ """Utility functions for code execution.""" +from __future__ import annotations + import base64 import binascii import copy @@ -34,9 +36,9 @@ class File: The name of the file with file extension (e.g., "file.csv"). """ - content: str + content: str | bytes """ - The base64-encoded bytes of the file content. + The base64-encoded bytes of the file content or the original bytes of the file content. """ mime_type: str = 'text/plain' @@ -120,12 +122,12 @@ def extract_code_and_truncate_content( the code blocks. Returns: - The first code block if found, otherwise None. + The first code block if found; otherwise, None. """ if not content or not content.parts: return - # Extract the code from the executable code parts if there're no associated + # Extract the code from the executable code parts if there are no associated # code execution result parts. for idx, part in enumerate(content.parts): if part.executable_code and ( diff --git a/src/google/adk/code_executors/container_code_executor.py b/src/google/adk/code_executors/container_code_executor.py index d12fee13d5..c2554954fc 100644 --- a/src/google/adk/code_executors/container_code_executor.py +++ b/src/google/adk/code_executors/container_code_executor.py @@ -131,6 +131,7 @@ def execute_code( ['python3', '-c', code_execution_input.code], demux=True, ) + logger.debug('Executed code:\n```\n%s\n```', code_execution_input.code) if exec_result.output and exec_result.output[0]: output = exec_result.output[0].decode('utf-8') diff --git a/src/google/adk/code_executors/gke_code_executor.py b/src/google/adk/code_executors/gke_code_executor.py index c9ba4e9ce5..d07253c267 100644 --- a/src/google/adk/code_executors/gke_code_executor.py +++ b/src/google/adk/code_executors/gke_code_executor.py @@ -162,6 +162,7 @@ def execute_code( logger.info( f"Submitted Job '{job_name}' to namespace '{self.namespace}'." ) + logger.debug("Executing code:\n```\n%s\n```", code_execution_input.code) return self._watch_job_completion(job_name) except ApiException as e: diff --git a/src/google/adk/code_executors/unsafe_local_code_executor.py b/src/google/adk/code_executors/unsafe_local_code_executor.py index 416bf15446..6dd2ae9d8c 100644 --- a/src/google/adk/code_executors/unsafe_local_code_executor.py +++ b/src/google/adk/code_executors/unsafe_local_code_executor.py @@ -16,6 +16,7 @@ from contextlib import redirect_stdout import io +import logging import re from typing import Any @@ -27,6 +28,8 @@ from .code_execution_utils import CodeExecutionInput from .code_execution_utils import CodeExecutionResult +logger = logging.getLogger('google_adk.' + __name__) + def _prepare_globals(code: str, globals_: dict[str, Any]) -> None: """Prepare globals for code execution, injecting __name__ if needed.""" @@ -60,6 +63,7 @@ def execute_code( invocation_context: InvocationContext, code_execution_input: CodeExecutionInput, ) -> CodeExecutionResult: + logger.debug('Executing code:\n```\n%s\n```', code_execution_input.code) # Execute the code. output = '' error = '' diff --git a/src/google/adk/code_executors/vertex_ai_code_executor.py b/src/google/adk/code_executors/vertex_ai_code_executor.py index b1dd58ce7b..68c3252665 100644 --- a/src/google/adk/code_executors/vertex_ai_code_executor.py +++ b/src/google/adk/code_executors/vertex_ai_code_executor.py @@ -152,6 +152,7 @@ def execute_code( code_execution_input.input_files, code_execution_input.execution_id, ) + logger.debug('Executed code:\n```\n%s\n```', code_execution_input.code) # Save output file as artifacts. saved_files = [] @@ -187,11 +188,13 @@ def execute_code( ) # Collect the final result. - return CodeExecutionResult( + result = CodeExecutionResult( stdout=code_execution_result.get('execution_result', ''), stderr=code_execution_result.get('execution_error', ''), output_files=saved_files, ) + logger.debug('Code execution result: %s', result) + return result def _execute_code_interpreter( self, diff --git a/src/google/adk/dependencies/__init__.py b/src/google/adk/dependencies/__init__.py new file mode 100644 index 0000000000..0a2669d7a2 --- /dev/null +++ b/src/google/adk/dependencies/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/google/adk/dependencies/rouge_scorer.py b/src/google/adk/dependencies/rouge_scorer.py new file mode 100644 index 0000000000..cc987deb88 --- /dev/null +++ b/src/google/adk/dependencies/rouge_scorer.py @@ -0,0 +1,17 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from rouge_score import rouge_scorer diff --git a/src/google/adk/dependencies/vertexai.py b/src/google/adk/dependencies/vertexai.py new file mode 100644 index 0000000000..4f254d87a8 --- /dev/null +++ b/src/google/adk/dependencies/vertexai.py @@ -0,0 +1,19 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import vertexai +from vertexai.preview import example_stores +from vertexai.preview import rag diff --git a/src/google/adk/errors/already_exists_error.py b/src/google/adk/errors/already_exists_error.py new file mode 100644 index 0000000000..35878ca090 --- /dev/null +++ b/src/google/adk/errors/already_exists_error.py @@ -0,0 +1,28 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + + +class AlreadyExistsError(Exception): + """Represents an error that occurs when an entity already exists.""" + + def __init__(self, message="The resource already exists."): + """Initializes the AlreadyExistsError exception. + + Args: + message (str): An optional custom message to describe the error. + """ + self.message = message + super().__init__(self.message) diff --git a/src/google/adk/evaluation/_eval_sets_manager_utils.py b/src/google/adk/evaluation/_eval_sets_manager_utils.py index b7e12dd37e..737f769e73 100644 --- a/src/google/adk/evaluation/_eval_sets_manager_utils.py +++ b/src/google/adk/evaluation/_eval_sets_manager_utils.py @@ -28,7 +28,7 @@ def get_eval_set_from_app_and_id( eval_sets_manager: EvalSetsManager, app_name: str, eval_set_id: str ) -> EvalSet: - """Returns an EvalSet if found, otherwise raises NotFoundError.""" + """Returns an EvalSet if found; otherwise, raises NotFoundError.""" eval_set = eval_sets_manager.get_eval_set(app_name, eval_set_id) if not eval_set: raise NotFoundError(f"Eval set `{eval_set_id}` not found.") @@ -38,7 +38,7 @@ def get_eval_set_from_app_and_id( def get_eval_case_from_eval_set( eval_set: EvalSet, eval_case_id: str ) -> Optional[EvalCase]: - """Returns an EvalCase if found, otherwise None.""" + """Returns an EvalCase if found; otherwise, None.""" eval_case_to_find = None # Look up the eval case by eval_case_id diff --git a/src/google/adk/evaluation/agent_evaluator.py b/src/google/adk/evaluation/agent_evaluator.py index 124315712e..8c8359f2f2 100644 --- a/src/google/adk/evaluation/agent_evaluator.py +++ b/src/google/adk/evaluation/agent_evaluator.py @@ -34,8 +34,13 @@ from ..agents.base_agent import BaseAgent from ..utils.context_utils import Aclosing from .constants import MISSING_EVAL_DEPENDENCIES_MESSAGE -from .eval_case import IntermediateData +from .eval_case import get_all_tool_calls +from .eval_case import IntermediateDataType from .eval_case import Invocation +from .eval_config import EvalConfig +from .eval_config import get_eval_metrics_from_config +from .eval_config import get_evaluation_criteria_or_default +from .eval_metrics import BaseCriterion from .eval_metrics import EvalMetric from .eval_metrics import EvalMetricResult from .eval_metrics import PrebuiltMetrics @@ -44,7 +49,8 @@ from .eval_sets_manager import EvalSetsManager from .evaluator import EvalStatus from .in_memory_eval_sets_manager import InMemoryEvalSetsManager -from .local_eval_sets_manager import convert_eval_set_to_pydanctic_schema +from .local_eval_sets_manager import convert_eval_set_to_pydantic_schema +from .user_simulator_provider import UserSimulatorProvider logger = logging.getLogger("google_adk." + __name__) @@ -71,12 +77,6 @@ EXPECTED_TOOL_USE_COLUMN = "expected_tool_use" -DEFAULT_CRITERIA = { - TOOL_TRAJECTORY_SCORE_KEY: 1.0, # 1-point scale; 1.0 is perfect. - RESPONSE_MATCH_SCORE_KEY: 0.8, # Rouge-1 text match; 0.8 is default. -} - - def load_json(file_path: str) -> Union[Dict, List]: with open(file_path, "r") as f: return json.load(f) @@ -98,28 +98,18 @@ class AgentEvaluator: """An evaluator for Agents, mainly intended for helping with test cases.""" @staticmethod - def find_config_for_test_file(test_file: str): + def find_config_for_test_file(test_file: str) -> EvalConfig: """Find the test_config.json file in the same folder as the test file.""" test_folder = os.path.dirname(test_file) config_path = os.path.join(test_folder, "test_config.json") - if os.path.exists(config_path): - config_data = load_json(config_path) - if "criteria" in config_data and isinstance( - config_data["criteria"], dict - ): - return config_data["criteria"] - else: - raise ValueError( - f"Invalid format for test_config.json at {config_path}. Expected a" - " 'criteria' dictionary." - ) - return DEFAULT_CRITERIA + return get_evaluation_criteria_or_default(config_path) @staticmethod async def evaluate_eval_set( agent_module: str, eval_set: EvalSet, - criteria: dict[str, float], + criteria: Optional[dict[str, float]] = None, + eval_config: Optional[EvalConfig] = None, num_runs: int = NUM_RUNS, agent_name: Optional[str] = None, print_detailed_results: bool = True, @@ -129,10 +119,11 @@ async def evaluate_eval_set( Args: agent_module: The path to python module that contains the definition of the agent. There is convention in place here, where the code is going to - look for 'root_agent' in the loaded module. + look for 'root_agent' or `get_agent_async` in the loaded module. eval_set: The eval set. - criteria: Evauation criterias, a dictionary of metric names to their - respective thresholds. + criteria: Evaluation criteria, a dictionary of metric names to their + respective thresholds. This field is deprecated. + eval_config: The evauation config. num_runs: Number of times all entries in the eval dataset should be assessed. agent_name: The name of the agent, if trying to evaluate something other @@ -140,12 +131,28 @@ async def evaluate_eval_set( print_detailed_results: Whether to print detailed results for each metric evaluation. """ - agent_for_eval = AgentEvaluator._get_agent_for_eval( + if criteria: + logger.warning( + "`criteria` field is deprecated and will be removed in future" + " iterations. For now, we will automatically map values in `criteria`" + " to `eval_config`, but you should move to using `eval_config` field." + ) + base_criteria = { + k: BaseCriterion(threshold=v) for k, v in criteria.items() + } + eval_config = EvalConfig(criteria=base_criteria) + + if eval_config is None: + raise ValueError("`eval_config` is required.") + + agent_for_eval = await AgentEvaluator._get_agent_for_eval( module_name=agent_module, agent_name=agent_name ) - eval_metrics = [ - EvalMetric(metric_name=n, threshold=t) for n, t in criteria.items() - ] + eval_metrics = get_eval_metrics_from_config(eval_config) + + user_simulator_provider = UserSimulatorProvider( + user_simulator_config=eval_config.user_simulator_config + ) # Step 1: Perform evals, basically inferencing and evaluation of metrics eval_results_by_eval_id = await AgentEvaluator._get_eval_results_by_eval_id( @@ -153,6 +160,7 @@ async def evaluate_eval_set( eval_set=eval_set, eval_metrics=eval_metrics, num_runs=num_runs, + user_simulator_provider=user_simulator_provider, ) # Step 2: Post-process the results! @@ -198,7 +206,7 @@ async def evaluate( Args: agent_module: The path to python module that contains the definition of the agent. There is convention in place here, where the code is going to - look for 'root_agent' in the loaded module. + look for 'root_agent' or 'get_agent_async' in the loaded module. eval_dataset_file_path_or_dir: The eval data set. This can be either a string representing full path to the file containing eval dataset, or a directory that is recursively explored for all files that have a @@ -225,15 +233,15 @@ async def evaluate( initial_session = AgentEvaluator._get_initial_session(initial_session_file) for test_file in test_files: - criteria = AgentEvaluator.find_config_for_test_file(test_file) + eval_config = AgentEvaluator.find_config_for_test_file(test_file) eval_set = AgentEvaluator._load_eval_set_from_file( - test_file, criteria, initial_session + test_file, eval_config, initial_session ) await AgentEvaluator.evaluate_eval_set( agent_module=agent_module, eval_set=eval_set, - criteria=criteria, + eval_config=eval_config, num_runs=num_runs, agent_name=agent_name, print_detailed_results=print_detailed_results, @@ -251,11 +259,11 @@ def migrate_eval_data_to_new_schema( "One of old_eval_data_file or new_eval_data_file is empty." ) - criteria = AgentEvaluator.find_config_for_test_file(old_eval_data_file) + eval_config = AgentEvaluator.find_config_for_test_file(old_eval_data_file) initial_session = AgentEvaluator._get_initial_session(initial_session_file) eval_set = AgentEvaluator._get_eval_set_from_old_format( - old_eval_data_file, criteria, initial_session + old_eval_data_file, eval_config, initial_session ) with open(new_eval_data_file, "w") as f: @@ -264,7 +272,7 @@ def migrate_eval_data_to_new_schema( @staticmethod def _load_eval_set_from_file( eval_set_file: str, - criteria: dict[str, float], + eval_config: EvalConfig, initial_session: dict[str, Any], ) -> EvalSet: """Loads an EvalSet from the given file.""" @@ -275,7 +283,7 @@ def _load_eval_set_from_file( try: eval_set = EvalSet.model_validate_json(content) assert len(initial_session) == 0, ( - "Intial session should be specified as a part of EvalSet file." + "Initial session should be specified as a part of EvalSet file." " Explicit initial session is only needed, when specifying data in" " the older schema." ) @@ -291,23 +299,23 @@ def _load_eval_set_from_file( # If we are here, the data must be specified in the older format. return AgentEvaluator._get_eval_set_from_old_format( - eval_set_file, criteria, initial_session + eval_set_file, eval_config, initial_session ) @staticmethod def _get_eval_set_from_old_format( eval_set_file: str, - criteria: dict[str, float], + eval_config: EvalConfig, initial_session: dict[str, Any], ) -> EvalSet: data = AgentEvaluator._load_dataset(eval_set_file)[0] - AgentEvaluator._validate_input([data], criteria) + AgentEvaluator._validate_input([data], eval_config.criteria) eval_data = { "name": eval_set_file, "data": data, "initial_session": initial_session, } - return convert_eval_set_to_pydanctic_schema( + return convert_eval_set_to_pydantic_schema( eval_set_id=str(uuid.uuid4()), eval_set_in_json_format=[eval_data] ) @@ -445,7 +453,11 @@ def _print_details( ), }) - print(tabulate(pd.DataFrame(data), headers="keys", tablefmt="grid")) + print( + tabulate( + pd.DataFrame(data), headers="keys", tablefmt="grid", maxcolwidths=25 + ) + ) print("\n\n") # Few empty lines for visual clarity @staticmethod @@ -457,20 +469,40 @@ def _convert_content_to_text(content: Optional[genai_types.Content]) -> str: @staticmethod def _convert_tool_calls_to_text( - intermediate_data: Optional[IntermediateData], + intermediate_data: Optional[IntermediateDataType], ) -> str: - if intermediate_data and intermediate_data.tool_uses: - return "\n".join([str(t) for t in intermediate_data.tool_uses]) + tool_calls = get_all_tool_calls(intermediate_data) - return "" + return "\n".join([str(t) for t in tool_calls]) @staticmethod - def _get_agent_for_eval( + async def _get_agent_for_eval( module_name: str, agent_name: Optional[str] = None ) -> BaseAgent: module_path = f"{module_name}" agent_module = importlib.import_module(module_path) - root_agent = agent_module.agent.root_agent + + # One of the two things should be satisfied, either the module should have + # an "agent" as a member in it or the module name itself should end with + # ".agent". + if not (hasattr(agent_module, "agent") or module_name.endswith(".agent")): + raise ValueError( + f"Module {module_name} does not have a member named `agent` or the" + " name should endwith `.agent`." + ) + + agent_module_with_agent = ( + agent_module.agent if hasattr(agent_module, "agent") else agent_module + ) + if hasattr(agent_module_with_agent, "root_agent"): + root_agent = agent_module_with_agent.root_agent + elif hasattr(agent_module_with_agent, "get_agent_async"): + root_agent, _ = await agent_module_with_agent.get_agent_async() + else: + raise ValueError( + f"Module {module_name} does not have a root_agent or" + " get_agent_async method." + ) agent_for_eval = root_agent if agent_name: @@ -503,6 +535,7 @@ async def _get_eval_results_by_eval_id( eval_set: EvalSet, eval_metrics: list[EvalMetric], num_runs: int, + user_simulator_provider: UserSimulatorProvider, ) -> dict[str, list[EvalCaseResult]]: """Returns EvalCaseResults grouped by eval case id. @@ -526,6 +559,7 @@ async def _get_eval_results_by_eval_id( eval_sets_manager=AgentEvaluator._get_eval_sets_manager( app_name=app_name, eval_set=eval_set ), + user_simulator_provider=user_simulator_provider, ) inference_requests = [ @@ -628,7 +662,7 @@ def _process_metrics_and_get_failures( scores = [ m.eval_metric_result.score for m in eval_metric_results_with_invocations - if m.eval_metric_result.score + if m.eval_metric_result.score is not None ] if scores: diff --git a/src/google/adk/evaluation/app_details.py b/src/google/adk/evaluation/app_details.py new file mode 100644 index 0000000000..d0839c5727 --- /dev/null +++ b/src/google/adk/evaluation/app_details.py @@ -0,0 +1,63 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.genai import types as genai_types +from pydantic import Field + +from .common import EvalBaseModel + + +class AgentDetails(EvalBaseModel): + """Details about the individual agent in the App. + + This could be a root agent or the sub-agents in the Agent Tree. + """ + + name: str + """The name of the Agent that uniquely identifies it in the App.""" + + instructions: str = Field(default="") + """The instructions set on the Agent.""" + + tool_declarations: genai_types.ToolListUnion = Field(default_factory=list) + """A list of tools available to the Agent.""" + + +class AppDetails(EvalBaseModel): + """Contains details about the App (the agentic system). + + This structure is only a projection of the actual app. Only details + that are relevant to the Eval System are captured here. + """ + + agent_details: dict[str, AgentDetails] = Field( + default_factory=dict, + ) + """A mapping from the agent name to the details of that agent.""" + + def get_developer_instructions(self, agent_name: str) -> str: + """Returns a string containing the developer instructions.""" + if agent_name not in self.agent_details: + raise ValueError(f"`{agent_name}` not found in the agentic system.") + + return self.agent_details[agent_name].instructions + + def get_tools_by_agent_name(self) -> dict[str, genai_types.ToolListUnion]: + """Returns a dictionary of tools available to an agent in the App, keyed to the name of the Agent.""" + return { + name: details.tool_declarations + for name, details in self.agent_details.items() + } diff --git a/src/google/adk/evaluation/base_eval_service.py b/src/google/adk/evaluation/base_eval_service.py index 3d576ab2d6..bb1c3b23a4 100644 --- a/src/google/adk/evaluation/base_eval_service.py +++ b/src/google/adk/evaluation/base_eval_service.py @@ -31,7 +31,7 @@ class EvaluateConfig(BaseModel): - """Contains configurations need to run an evaluations.""" + """Contains configurations needed to run evaluations.""" model_config = ConfigDict( alias_generator=alias_generators.to_camel, @@ -94,11 +94,11 @@ class InferenceRequest(BaseModel): description="""The name of the app to which the eval case belongs to.""" ) - eval_set_id: str = Field(description="""Id of the eval set.""") + eval_set_id: str = Field(description="""ID of the eval set.""") eval_case_ids: Optional[list[str]] = Field( default=None, - description="""Id of the eval cases for which inferences need to be + description="""ID of the eval cases for which inferences need to be generated. All the eval case ids should belong to the EvalSet. @@ -133,10 +133,10 @@ class InferenceResult(BaseModel): description="""The name of the app to which the eval case belongs to.""" ) - eval_set_id: str = Field(description="""Id of the eval set.""") + eval_set_id: str = Field(description="""ID of the eval set.""") eval_case_id: str = Field( - description="""Id of the eval case for which inferences were generated.""", + description="""ID of the eval case for which inferences were generated.""", ) inferences: Optional[list[Invocation]] = Field( @@ -145,7 +145,7 @@ class InferenceResult(BaseModel): ) session_id: Optional[str] = Field( - description="""Id of the inference session.""" + description="""ID of the inference session.""" ) status: InferenceStatus = Field( diff --git a/src/google/adk/evaluation/common.py b/src/google/adk/evaluation/common.py index 3f349d576f..e3808b267c 100644 --- a/src/google/adk/evaluation/common.py +++ b/src/google/adk/evaluation/common.py @@ -22,5 +22,6 @@ class EvalBaseModel(pydantic.BaseModel): model_config = pydantic.ConfigDict( alias_generator=alias_generators.to_camel, populate_by_name=True, - extra='forbid', + extra="forbid", + arbitrary_types_allowed=True, ) diff --git a/src/google/adk/evaluation/conversation_scenarios.py b/src/google/adk/evaluation/conversation_scenarios.py new file mode 100644 index 0000000000..fc5d365316 --- /dev/null +++ b/src/google/adk/evaluation/conversation_scenarios.py @@ -0,0 +1,60 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from pydantic import Field + +from .common import EvalBaseModel + + +class ConversationScenario(EvalBaseModel): + """Scenario for a conversation between a simulated user and the Agent under test.""" + + starting_prompt: str + """Starting prompt for the conversation. + + This prompt acts as the fixed first user message that is given to the Agent. + Any subsequent user messages are obtained by the system that is simulating the + user. + """ + + conversation_plan: str + """A plan that user simulation system needs to follow as it plays out the conversation. + + Example: + For a Travel Agent that has tools that let it book a flight and car, a sample + starting prompt could be: + + `I need to book a flight.` + + A conversation plan could look like: + + First, you want to book a one-way flight from SFO to LAX for next Tuesday. + You prefer a morning flight and your budget is under $150. If the agent finds + a valid flight, confirm the booking. Once confirmed, your next goal is to rent + a standard-size car for three days from the airport. Once both tasks are done, + your overall goal is complete. + """ + + +class ConversationScenarios(EvalBaseModel): + """A simple container for the list of ConversationScenario. + + Mainly serves the purpose of helping with serialization and deserialization. + """ + + scenarios: list[ConversationScenario] = Field( + default_factory=list, description="""A list of ConversationScenario.""" + ) diff --git a/src/google/adk/evaluation/eval_case.py b/src/google/adk/evaluation/eval_case.py index 2229230cd2..065681b199 100644 --- a/src/google/adk/evaluation/eval_case.py +++ b/src/google/adk/evaluation/eval_case.py @@ -16,23 +16,19 @@ from typing import Any from typing import Optional +from typing import Union from google.genai import types as genai_types -from pydantic import alias_generators -from pydantic import BaseModel -from pydantic import ConfigDict from pydantic import Field +from pydantic import model_validator +from typing_extensions import TypeAlias +from .app_details import AppDetails +from .common import EvalBaseModel +from .conversation_scenarios import ConversationScenario from .eval_rubrics import Rubric -class EvalBaseModel(BaseModel): - model_config = ConfigDict( - alias_generator=alias_generators.to_camel, - populate_by_name=True, - ) - - class IntermediateData(EvalBaseModel): """Container for intermediate data that an agent would generate as it responds with a final answer.""" @@ -54,6 +50,33 @@ class IntermediateData(EvalBaseModel): """ +class InvocationEvent(EvalBaseModel): + """An immutable record representing a specific point in the agent's invocation. + + It captures agent's replies, requests to use tools (function calls), and tool + results. + + This structure is a simple projection of the actual `Event` datamodel that + is intended for the Eval System. + """ + + author: str + """The name of the agent that authored/owned this event.""" + + content: Optional[genai_types.Content] + """The content of the event.""" + + +class InvocationEvents(EvalBaseModel): + """A container for events that occur during the course of an invocation.""" + + invocation_events: list[InvocationEvent] = Field(default_factory=list) + """A list of invocation events.""" + + +IntermediateDataType: TypeAlias = Union[IntermediateData, InvocationEvents] + + class Invocation(EvalBaseModel): """Represents a single invocation.""" @@ -66,7 +89,7 @@ class Invocation(EvalBaseModel): final_response: Optional[genai_types.Content] = None """Final response from the agent.""" - intermediate_data: Optional[IntermediateData] = None + intermediate_data: Optional[IntermediateDataType] = None """Intermediate steps generated as a part of Agent execution. For a multi-agent system, it is also helpful to inspect the route that @@ -81,6 +104,13 @@ class Invocation(EvalBaseModel): ) """A list of rubrics that are applicable to only this invocation.""" + app_details: Optional[AppDetails] = Field(default=None) + """Details about the App that was used for this invocation.""" + + +SessionState: TypeAlias = dict[str, Any] +"""The state of the session.""" + class SessionInput(EvalBaseModel): """Values that help initialize a Session.""" @@ -91,18 +121,33 @@ class SessionInput(EvalBaseModel): user_id: str """The user id.""" - state: dict[str, Any] = Field(default_factory=dict) + state: SessionState = Field(default_factory=dict) """The state of the session.""" +StaticConversation: TypeAlias = list[Invocation] +"""A conversation where the user's queries for each invocation are already specified.""" + + class EvalCase(EvalBaseModel): """An eval case.""" eval_id: str """Unique identifier for the evaluation case.""" - conversation: list[Invocation] - """A conversation between the user and the Agent. The conversation can have any number of invocations.""" + conversation: Optional[StaticConversation] = None + """A static conversation between the user and the Agent. + + While creating an eval case you should specify either a `conversation` or a + `conversation_scenario`, but not both. + """ + + conversation_scenario: Optional[ConversationScenario] = None + """A conversation scenario that should be used by a UserSimulator. + + While creating an eval case you should specify either a `conversation` or a + `conversation_scenario`, but not both. + """ session_input: Optional[SessionInput] = None """Session input that will be passed on to the Agent during eval. @@ -117,3 +162,93 @@ class EvalCase(EvalBaseModel): default=None, ) """A list of rubrics that are applicable to all the invocations in the conversation of this eval case.""" + + final_session_state: Optional[SessionState] = Field(default_factory=dict) + """The expected final session state at the end of the conversation.""" + + @model_validator(mode="after") + def ensure_conversation_xor_conversation_scenario(self) -> EvalCase: + if (self.conversation is None) == (self.conversation_scenario is None): + raise ValueError( + "Exactly one of conversation and conversation_scenario must be" + " provided in an EvalCase." + ) + return self + + +def get_all_tool_calls( + intermediate_data: Optional[IntermediateDataType], +) -> list[genai_types.FunctionCall]: + """A utility method to retrieve tools calls from intermediate data.""" + if not intermediate_data: + return [] + + tool_calls = [] + if isinstance(intermediate_data, IntermediateData): + tool_calls = intermediate_data.tool_uses + elif isinstance(intermediate_data, InvocationEvents): + # Go over each event in the list of events + for invocation_event in intermediate_data.invocation_events: + # Check if the event has content and some parts. + if invocation_event.content and invocation_event.content.parts: + for p in invocation_event.content.parts: + # For each part, we check if any of those part is a function call. + if p.function_call: + tool_calls.append(p.function_call) + else: + raise ValueError( + f"Unsupported type for intermediate_data `{intermediate_data}`" + ) + + return tool_calls + + +def get_all_tool_responses( + intermediate_data: Optional[IntermediateDataType], +) -> list[genai_types.FunctionResponse]: + """A utility method to retrieve tools responses from intermediate data.""" + if not intermediate_data: + return [] + + tool_responses = [] + if isinstance(intermediate_data, IntermediateData): + tool_responses = intermediate_data.tool_responses + elif isinstance(intermediate_data, InvocationEvents): + # Go over each event in the list of events + for invocation_event in intermediate_data.invocation_events: + # Check if the event has content and some parts. + if invocation_event.content and invocation_event.content.parts: + for p in invocation_event.content.parts: + # For each part, we check if any of those part is a function response. + if p.function_response: + tool_responses.append(p.function_response) + else: + raise ValueError( + f"Unsupported type for intermediate_data `{intermediate_data}`" + ) + + return tool_responses + + +ToolCallAndResponse: TypeAlias = tuple[ + genai_types.FunctionCall, Optional[genai_types.FunctionResponse] +] +"""A Tuple representing a Function call and corresponding optional function response.""" + + +def get_all_tool_calls_with_responses( + intermediate_data: Optional[IntermediateDataType], +) -> list[ToolCallAndResponse]: + """Returns tool calls with the corresponding responses, if available.""" + tool_responses_by_call_id: dict[str, genai_types.FunctionResponse] = { + tool_response.id: tool_response + for tool_response in get_all_tool_responses(intermediate_data) + } + + tool_call_and_responses: list[ToolCallAndResponse] = [] + + for tool_call in get_all_tool_calls(intermediate_data): + response = tool_responses_by_call_id.get(tool_call.id, None) + tool_call_and_responses.append((tool_call, response)) + + return tool_call_and_responses diff --git a/src/google/adk/evaluation/eval_config.py b/src/google/adk/evaluation/eval_config.py index cc2de90e11..d5b94af5e1 100644 --- a/src/google/adk/evaluation/eval_config.py +++ b/src/google/adk/evaluation/eval_config.py @@ -14,6 +14,9 @@ from __future__ import annotations +import logging +import os +from typing import Optional from typing import Union from pydantic import alias_generators @@ -21,8 +24,12 @@ from pydantic import ConfigDict from pydantic import Field +from ..evaluation.eval_metrics import EvalMetric from .eval_metrics import BaseCriterion from .eval_metrics import Threshold +from .user_simulator import BaseUserSimulatorConfig + +logger = logging.getLogger("google_adk." + __name__) class EvalConfig(BaseModel): @@ -64,3 +71,61 @@ class EvalConfig(BaseModel): } """, ) + + user_simulator_config: Optional[BaseUserSimulatorConfig] = Field( + default=None, + description="Config to be used by the user simulator.", + ) + + +_DEFAULT_EVAL_CONFIG = EvalConfig( + criteria={"tool_trajectory_avg_score": 1.0, "response_match_score": 0.8} +) + + +def get_evaluation_criteria_or_default( + eval_config_file_path: Optional[str], +) -> EvalConfig: + """Returns EvalConfig read from the config file, if present. + + Otherwise a default one is returned. + """ + if eval_config_file_path and os.path.exists(eval_config_file_path): + with open(eval_config_file_path, "r", encoding="utf-8") as f: + content = f.read() + return EvalConfig.model_validate_json(content) + + logger.info( + "No config file supplied or file not found. Using default criteria." + ) + return _DEFAULT_EVAL_CONFIG + + +def get_eval_metrics_from_config(eval_config: EvalConfig) -> list[EvalMetric]: + """Returns a list of EvalMetrics mapped from the EvalConfig.""" + eval_metric_list = [] + if eval_config.criteria: + for metric_name, criterion in eval_config.criteria.items(): + if isinstance(criterion, float): + eval_metric_list.append( + EvalMetric( + metric_name=metric_name, + threshold=criterion, + criterion=BaseCriterion(threshold=criterion), + ) + ) + elif isinstance(criterion, BaseCriterion): + eval_metric_list.append( + EvalMetric( + metric_name=metric_name, + threshold=criterion.threshold, + criterion=criterion, + ) + ) + else: + raise ValueError( + f"Unexpected criterion type. {type(criterion).__name__} not" + " supported." + ) + + return eval_metric_list diff --git a/src/google/adk/evaluation/eval_metrics.py b/src/google/adk/evaluation/eval_metrics.py index 66f7299f24..321e2cc1d9 100644 --- a/src/google/adk/evaluation/eval_metrics.py +++ b/src/google/adk/evaluation/eval_metrics.py @@ -48,6 +48,14 @@ class PrebuiltMetrics(Enum): FINAL_RESPONSE_MATCH_V2 = "final_response_match_v2" + RUBRIC_BASED_FINAL_RESPONSE_QUALITY_V1 = ( + "rubric_based_final_response_quality_v1" + ) + + HALLUCINATIONS_V1 = "hallucinations_v1" + + RUBRIC_BASED_TOOL_USE_QUALITY_V1 = "rubric_based_tool_use_quality_v1" + MetricName: TypeAlias = Union[str, PrebuiltMetrics] Threshold: TypeAlias = float @@ -124,6 +132,24 @@ class RubricsBasedCriterion(BaseCriterion): ) +class HallucinationsCriterion(BaseCriterion): + """Criterion to use when evaluating agents response for hallucinations.""" + + judge_model_options: JudgeModelOptions = Field( + default_factory=JudgeModelOptions, + description="Options for the judge model.", + ) + + evaluate_intermediate_nl_responses: bool = Field( + default=False, + description=( + "Whether any intermediate NL responses should be evaluated" + " for hallucinations or not. By default, the metric only evaluates" + " final response from the Agent for hallucinations." + ), + ) + + class EvalMetric(EvalBaseModel): """A metric used to evaluate a particular aspect of an eval case.""" @@ -190,15 +216,16 @@ class EvalMetricResultPerInvocation(EvalBaseModel): ) ) - expected_invocation: Invocation = Field( + expected_invocation: Optional[Invocation] = Field( + default=None, description=( "The expected invocation, usually the reference or golden invocation." - ) + ), ) eval_metric_results: list[EvalMetricResult] = Field( default=[], - description="Eval resutls for each applicable metric.", + description="Eval results for each applicable metric.", ) diff --git a/src/google/adk/evaluation/eval_sets_manager.py b/src/google/adk/evaluation/eval_sets_manager.py index 445cafd82f..94ca147653 100644 --- a/src/google/adk/evaluation/eval_sets_manager.py +++ b/src/google/adk/evaluation/eval_sets_manager.py @@ -23,7 +23,7 @@ class EvalSetsManager(ABC): - """An interface to manage an Eval Sets.""" + """An interface to manage Eval Sets.""" @abstractmethod def get_eval_set(self, app_name: str, eval_set_id: str) -> Optional[EvalSet]: @@ -54,7 +54,7 @@ def list_eval_sets(self, app_name: str) -> list[str]: def get_eval_case( self, app_name: str, eval_set_id: str, eval_case_id: str ) -> Optional[EvalCase]: - """Returns an EvalCase if found, otherwise None.""" + """Returns an EvalCase if found; otherwise, None.""" @abstractmethod def add_eval_case(self, app_name: str, eval_set_id: str, eval_case: EvalCase): diff --git a/src/google/adk/evaluation/evaluation_generator.py b/src/google/adk/evaluation/evaluation_generator.py index 7f1c94f133..970ebd8f9a 100644 --- a/src/google/adk/evaluation/evaluation_generator.py +++ b/src/google/adk/evaluation/evaluation_generator.py @@ -14,16 +14,20 @@ from __future__ import annotations +import copy import importlib from typing import Any +from typing import AsyncGenerator from typing import Optional import uuid +from google.genai.types import Content from pydantic import BaseModel from ..agents.llm_agent import Agent from ..artifacts.base_artifact_service import BaseArtifactService from ..artifacts.in_memory_artifact_service import InMemoryArtifactService +from ..events.event import Event from ..memory.base_memory_service import BaseMemoryService from ..memory.in_memory_memory_service import InMemoryMemoryService from ..runners import Runner @@ -31,17 +35,27 @@ from ..sessions.in_memory_session_service import InMemorySessionService from ..sessions.session import Session from ..utils.context_utils import Aclosing +from .app_details import AgentDetails +from .app_details import AppDetails from .eval_case import EvalCase -from .eval_case import IntermediateData from .eval_case import Invocation +from .eval_case import InvocationEvent +from .eval_case import InvocationEvents from .eval_case import SessionInput from .eval_set import EvalSet +from .request_intercepter_plugin import _RequestIntercepterPlugin +from .user_simulator import Status as UserSimulatorStatus +from .user_simulator import UserSimulator +from .user_simulator_provider import UserSimulatorProvider + +_USER_AUTHOR = "user" +_DEFAULT_AUTHOR = "agent" class EvalCaseResponses(BaseModel): """Contains multiple responses associated with an EvalCase. - Multiple responses are a result of repeated requests to genereate inferences. + Multiple responses are a result of repeated requests to generate inferences. """ eval_case: EvalCase @@ -71,11 +85,13 @@ async def generate_responses( results = [] for eval_case in eval_set.eval_cases: + # assume only static conversations are needed + user_simulator = UserSimulatorProvider().provide(eval_case) responses = [] for _ in range(repeat_num): response_invocations = await EvaluationGenerator._process_query( - eval_case.conversation, agent_module_path, + user_simulator, agent_name, eval_case.session_input, ) @@ -115,8 +131,8 @@ def generate_responses_from_session(session_path, eval_dataset): @staticmethod async def _process_query( - invocations: list[Invocation], module_name: str, + user_simulator: UserSimulator, agent_name: Optional[str] = None, initial_session: Optional[SessionInput] = None, ) -> list[Invocation]: @@ -133,13 +149,44 @@ async def _process_query( assert agent_to_evaluate, f"Sub-Agent `{agent_name}` not found." return await EvaluationGenerator._generate_inferences_from_root_agent( - invocations, agent_to_evaluate, reset_func, initial_session + agent_to_evaluate, + user_simulator=user_simulator, + reset_func=reset_func, + initial_session=initial_session, ) + @staticmethod + async def _generate_inferences_for_single_user_invocation( + runner: Runner, + user_id: str, + session_id: str, + user_content: Content, + ) -> AsyncGenerator[Event, None]: + invocation_id = None + + async with Aclosing( + runner.run_async( + user_id=user_id, + session_id=session_id, + new_message=user_content, + ) + ) as agen: + + async for event in agen: + if not invocation_id: + invocation_id = event.invocation_id + yield Event( + content=user_content, + author=_USER_AUTHOR, + invocation_id=invocation_id, + ) + + yield event + @staticmethod async def _generate_inferences_from_root_agent( - invocations: list[Invocation], root_agent: Agent, + user_simulator: UserSimulator, reset_func: Optional[Any] = None, initial_session: Optional[SessionInput] = None, session_id: Optional[str] = None, @@ -147,7 +194,8 @@ async def _generate_inferences_from_root_agent( artifact_service: Optional[BaseArtifactService] = None, memory_service: Optional[BaseMemoryService] = None, ) -> list[Invocation]: - """Scrapes the root agent given the list of Invocations.""" + """Scrapes the root agent in coordination with the user simulator.""" + if not session_service: session_service = InMemorySessionService() @@ -170,56 +218,155 @@ async def _generate_inferences_from_root_agent( if not artifact_service: artifact_service = InMemoryArtifactService() - runner = Runner( + # Reset agent state for each query + if callable(reset_func): + reset_func() + + request_intercepter_plugin = _RequestIntercepterPlugin( + name="request_intercepter_plugin" + ) + async with Runner( app_name=app_name, agent=root_agent, artifact_service=artifact_service, session_service=session_service, memory_service=memory_service, - ) + plugins=[request_intercepter_plugin], + ) as runner: + events = [] + while True: + next_user_message = await user_simulator.get_next_user_message( + copy.deepcopy(events) + ) + if next_user_message.status == UserSimulatorStatus.SUCCESS: + async for ( + event + ) in EvaluationGenerator._generate_inferences_for_single_user_invocation( + runner, user_id, session_id, next_user_message.user_message + ): + events.append(event) + else: # no message generated + break - # Reset agent state for each query - if callable(reset_func): - reset_func() + app_details_by_invocation_id = ( + EvaluationGenerator._get_app_details_by_invocation_id( + events, request_intercepter_plugin + ) + ) + return EvaluationGenerator.convert_events_to_eval_invocations( + events, app_details_by_invocation_id + ) - response_invocations = [] + @staticmethod + def convert_events_to_eval_invocations( + events: list[Event], + app_details_per_invocation: Optional[dict[str, AppDetails]] = None, + ) -> list[Invocation]: + """Converts a list of events to eval invocations.""" + events_by_invocation_id = ( + EvaluationGenerator._collect_events_by_invocation_id(events) + ) - for invocation in invocations: + invocations = [] + for invocation_id, events in events_by_invocation_id.items(): final_response = None - user_content = invocation.user_content - tool_uses = [] - invocation_id = "" - - async with Aclosing( - runner.run_async( - user_id=user_id, session_id=session_id, new_message=user_content - ) - ) as agen: - async for event in agen: - invocation_id = ( - event.invocation_id if not invocation_id else invocation_id - ) - - if ( - event.is_final_response() - and event.content - and event.content.parts - ): + user_content = "" + invocation_timestamp = 0 + app_details = None + if ( + app_details_per_invocation + and invocation_id in app_details_per_invocation + ): + app_details = app_details_per_invocation[invocation_id] + + events_to_add = [] + + for event in events: + current_author = (event.author or _DEFAULT_AUTHOR).lower() + + if current_author == _USER_AUTHOR: + # If the author is the user, then we just identify it and move on + # to the next event. + user_content = event.content + invocation_timestamp = event.timestamp + continue + + if event.content and event.content.parts: + if event.is_final_response(): final_response = event.content - elif event.get_function_calls(): - for call in event.get_function_calls(): - tool_uses.append(call) - - response_invocations.append( + else: + for p in event.content.parts: + if p.function_call or p.function_response or p.text: + events_to_add.append(event) + break + + invocation_events = [ + InvocationEvent(author=e.author, content=e.content) + for e in events_to_add + ] + invocations.append( Invocation( invocation_id=invocation_id, user_content=user_content, final_response=final_response, - intermediate_data=IntermediateData(tool_uses=tool_uses), + intermediate_data=InvocationEvents( + invocation_events=invocation_events + ), + creation_timestamp=invocation_timestamp, + app_details=app_details, ) ) - return response_invocations + return invocations + + @staticmethod + def _get_app_details_by_invocation_id( + events: list[Event], request_intercepter: _RequestIntercepterPlugin + ) -> dict[str, AppDetails]: + """Creates an AppDetails object from the list of events.""" + events_by_invocation_id = ( + EvaluationGenerator._collect_events_by_invocation_id(events) + ) + app_details_by_invocation_id = {} + + for invocation_id, events in events_by_invocation_id.items(): + app_details = AppDetails(agent_details={}) + app_details_by_invocation_id[invocation_id] = app_details + + for event in events: + if event.author == _USER_AUTHOR: + continue + + llm_request = request_intercepter.get_model_request(event) + + if not llm_request: + continue + + if event.author not in app_details.agent_details: + agent_name = event.author + app_details.agent_details[agent_name] = AgentDetails( + name=agent_name, + instructions=llm_request.config.system_instruction, + tool_declarations=llm_request.config.tools or [], + ) + + return app_details_by_invocation_id + + @staticmethod + def _collect_events_by_invocation_id(events: list[Event]) -> dict[str, Event]: + # Group Events by invocation id. Events that share the same invocation id + # belong to the same invocation. + events_by_invocation_id: dict[str, list[Event]] = {} + + for event in events: + invocation_id = event.invocation_id + + if invocation_id not in events_by_invocation_id: + events_by_invocation_id[invocation_id] = [] + + events_by_invocation_id[invocation_id].append(event) + + return events_by_invocation_id @staticmethod def _process_query_with_session(session_data, data): diff --git a/src/google/adk/evaluation/evaluator.py b/src/google/adk/evaluation/evaluator.py index 07ee958445..7a97855bec 100644 --- a/src/google/adk/evaluation/evaluator.py +++ b/src/google/adk/evaluation/evaluator.py @@ -23,6 +23,7 @@ from .eval_case import Invocation from .eval_metrics import BaseCriterion from .eval_metrics import EvalStatus +from .eval_rubrics import RubricScore # Redefining the type here for backward compatibility. EvalStatus: TypeAlias = EvalStatus @@ -32,9 +33,10 @@ class PerInvocationResult(BaseModel): """Metric evaluation score per invocation.""" actual_invocation: Invocation - expected_invocation: Invocation + expected_invocation: Optional[Invocation] = None score: Optional[float] = None eval_status: EvalStatus = EvalStatus.NOT_EVALUATED + rubric_scores: Optional[list[RubricScore]] = None class EvaluationResult(BaseModel): @@ -45,17 +47,30 @@ class EvaluationResult(BaseModel): """Overall status, based on each invocation.""" per_invocation_results: list[PerInvocationResult] = [] + """Detailed results per invocation.""" + + overall_rubric_scores: Optional[list[RubricScore]] = None + """Overall rubric, based on each invocation.""" class Evaluator(ABC): - """A merics evaluator interface.""" + """A metrics evaluator interface.""" criterion_type: ClassVar[type[BaseCriterion]] = BaseCriterion def evaluate_invocations( self, actual_invocations: list[Invocation], - expected_invocations: list[Invocation], + expected_invocations: Optional[list[Invocation]], ) -> EvaluationResult: - """Returns EvaluationResult after performing evaluations using actual and expected invocations.""" + """Returns EvaluationResult after performing evaluations using actual and expected invocations. + + Args: + actual_invocations: These are the invocations that are obtained from the + agent under test. + expected_invocations: An optional list of invocations, if specified, + usually act as a benchmark/golden response. If these are specified + usually the expectation is that the length of this list and actual + invocaiton is the same. + """ raise NotImplementedError() diff --git a/src/google/adk/evaluation/final_response_match_v1.py b/src/google/adk/evaluation/final_response_match_v1.py index 4d94d03a36..83d0d4fc01 100644 --- a/src/google/adk/evaluation/final_response_match_v1.py +++ b/src/google/adk/evaluation/final_response_match_v1.py @@ -17,9 +17,9 @@ from typing import Optional from google.genai import types as genai_types -from rouge_score import rouge_scorer from typing_extensions import override +from ..dependencies.rouge_scorer import rouge_scorer from .eval_case import Invocation from .eval_metrics import EvalMetric from .eval_metrics import Interval @@ -59,8 +59,11 @@ def get_metric_info() -> MetricInfo: def evaluate_invocations( self, actual_invocations: list[Invocation], - expected_invocations: list[Invocation], + expected_invocations: Optional[list[Invocation]], ) -> EvaluationResult: + if expected_invocations is None: + raise ValueError("expected_invocations is required for this metric.") + total_score = 0.0 num_invocations = 0 per_invocation_results = [] diff --git a/src/google/adk/evaluation/final_response_match_v2.py b/src/google/adk/evaluation/final_response_match_v2.py index 827f397b8c..ea90c37487 100644 --- a/src/google/adk/evaluation/final_response_match_v2.py +++ b/src/google/adk/evaluation/final_response_match_v2.py @@ -33,6 +33,7 @@ from .eval_metrics import PrebuiltMetrics from .evaluator import EvaluationResult from .evaluator import PerInvocationResult +from .llm_as_judge import AutoRaterScore from .llm_as_judge import LlmAsJudge from .llm_as_judge_utils import get_eval_status from .llm_as_judge_utils import get_text_from_content @@ -146,7 +147,11 @@ def __init__( self, eval_metric: EvalMetric, ): - super().__init__(eval_metric, FinalResponseMatchV2Evaluator.criterion_type) + super().__init__( + eval_metric, + FinalResponseMatchV2Evaluator.criterion_type, + expected_invocations_required=True, + ) self._auto_rater_prompt_template = _FINAL_RESPONSE_MATCH_V2_PROMPT @staticmethod @@ -165,8 +170,13 @@ def get_metric_info() -> MetricInfo: @override def format_auto_rater_prompt( - self, actual_invocation: Invocation, expected_invocation: Invocation + self, + actual_invocation: Invocation, + expected_invocation: Optional[Invocation], ) -> str: + if expected_invocation is None: + raise ValueError("expected_invocation is required for this metric.") + reference = get_text_from_content(expected_invocation.final_response) response = get_text_from_content(actual_invocation.final_response) user_prompt = get_text_from_content(expected_invocation.user_content) @@ -179,17 +189,17 @@ def format_auto_rater_prompt( @override def convert_auto_rater_response_to_score( self, llm_response: LlmResponse - ) -> Optional[float]: + ) -> AutoRaterScore: response_text = get_text_from_content(llm_response.content) if response_text is None: - return None + return AutoRaterScore() label = _parse_critique(response_text) if label == Label.VALID: - return 1.0 + return AutoRaterScore(score=1.0) elif label == Label.INVALID: - return 0.0 + return AutoRaterScore(score=0.0) else: - return None + return AutoRaterScore() @override def aggregate_per_invocation_samples( diff --git a/src/google/adk/evaluation/gcs_eval_sets_manager.py b/src/google/adk/evaluation/gcs_eval_sets_manager.py index b7b5b8bc02..cc8a572697 100644 --- a/src/google/adk/evaluation/gcs_eval_sets_manager.py +++ b/src/google/adk/evaluation/gcs_eval_sets_manager.py @@ -84,7 +84,12 @@ def _write_eval_set_to_blob(self, blob_name: str, eval_set: EvalSet): """Writes an EvalSet to GCS.""" blob = self.bucket.blob(blob_name) blob.upload_from_string( - eval_set.model_dump_json(indent=2), + eval_set.model_dump_json( + indent=2, + exclude_unset=True, + exclude_defaults=True, + exclude_none=True, + ), content_type="application/json", ) @@ -103,9 +108,9 @@ def create_eval_set(self, app_name: str, eval_set_id: str) -> EvalSet: """Creates an empty EvalSet and saves it to GCS. Raises: - ValueError: If eval set id is not valid or an eval set already exists. + ValueError: If Eval Set ID is not valid or an eval set already exists. """ - self._validate_id(id_name="Eval Set Id", id_value=eval_set_id) + self._validate_id(id_name="Eval Set ID", id_value=eval_set_id) new_eval_set_blob_name = self._get_eval_set_blob_name(app_name, eval_set_id) if self.bucket.blob(new_eval_set_blob_name).exists(): raise ValueError( diff --git a/src/google/adk/evaluation/hallucinations_v1.py b/src/google/adk/evaluation/hallucinations_v1.py new file mode 100644 index 0000000000..01fbc3a09c --- /dev/null +++ b/src/google/adk/evaluation/hallucinations_v1.py @@ -0,0 +1,767 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import dataclasses +import json +import logging +import re +import statistics +from typing import ClassVar +from typing import Optional + +from google.genai import types as genai_types +from pydantic import ValidationError +from typing_extensions import override + +from ..models.base_llm import BaseLlm +from ..models.llm_request import LlmRequest +from ..models.llm_response import LlmResponse +from ..models.registry import LLMRegistry +from ..utils.context_utils import Aclosing +from ..utils.feature_decorator import experimental +from .app_details import AppDetails +from .eval_case import Invocation +from .eval_case import InvocationEvent +from .eval_case import InvocationEvents +from .eval_metrics import EvalMetric +from .eval_metrics import HallucinationsCriterion +from .eval_metrics import Interval +from .eval_metrics import MetricInfo +from .eval_metrics import MetricValueInfo +from .eval_metrics import PrebuiltMetrics +from .evaluator import EvalStatus +from .evaluator import EvaluationResult +from .evaluator import Evaluator +from .evaluator import PerInvocationResult +from .llm_as_judge_utils import get_eval_status +from .llm_as_judge_utils import get_text_from_content +from .llm_as_judge_utils import get_tool_declarations_as_json_str + +logger = logging.getLogger("google_adk." + __name__) + +_HALLUCINATIONS_V1_SEGMENTER_PROMPT = """ +You are a helpful and harmless AI assistant. You will be provided with a model-generated response. +Your task is to segment the provided response sentence by sentence so that we could analyze each sentence in the future. + +**Instructions:** +1. Overall, you should decompose the whole provided response into individual sentences. You should make sure the output covers ALL the sentences in the provided response block. +2. You should COPY each sentence as it is, WORD BY WORD. DO NOT modify the sentence or the surrounding punctuations. +3. If there are bullet points in the response, you should segment each bullet point into DIFFERENT sentences. If one bullet point has sub bullet points, you should further decompose sub bullet points into DIFFERENT sentences. +For example, if there are responses like "it has three criteria: * aaa. * bbb. * ccc", you should segment them into FOUR sentences: "it has three criteria", "aaa", "bbb", "ccc". Bullet points could start with numbers (1/2/3/etc) or symbols like "*", "-" etc. +4. When encoutering tables, you should include the whole table in ONE sentence output. +5. Each sentence should be meaningful to further analyze on. DO NOT ONLY put symbols themselves into a sentence. +6. You should ONLY output segmented sentences in the provided response. DO NOT make up any new sentences. + +**Input Format:** + +The input will be the model-generated response: +* **Response:** The model-generated response to be analyzed. + +**Output Format:** + +For each decomposed sentence, wrap them with and like the following: +... +... + +**Example:** + +**Input:** + +**Response Begin** +There are three kinds of fruits: +1. Apples are red. +2. Bananas are green. +3. Pears are purple. + +For prices: +* Bananas are cheaper than apples. + +Enjoy your fruit! +**Response End** + +**Output:** +There are three kinds of fruits: +1. Apples are red. +2. Bananas are green. +3. Pears are purple. +For prices: +* Bananas are cheaper than apples. +Enjoy your fruit! + +**Now, given the following response, please segment the response into sentences:** + +**Input:** + +**Response Begin** +{response} +**Response End** + +**Your Sentence Segmentation Output:** +""".strip() + +_HALLUCINATIONS_V1_VALIDATOR_PROMPT = """ +You are a helpful and harmless AI assistant. You will be provided with a textual context and sentences from a model-generated response. +Your task is to analyze sentence by sentence and classify each sentence according to its relationship with the provided context. + +**Instructions:** + +1. **Read the textual context carefully.** +2. **For each sentence, assign one of the following labels:** + * **`supported`**: The sentence is entailed by the given context. Provide a supporting excerpt from the context. The supporting except must *fully* entail the sentence. + * **`unsupported`**: The sentence is not entailed by the given context. No excerpt is needed for this label. + * **`contradictory`**: The sentence is falsified by the given context. Provide a contradicting excerpt from the context. + * **`disputed`**: The given context contains both supporting and contradicting information. Provide both supporting and contradicting excerpt from the context. + * **`not_applicable`**: The sentence does not require factual attribution (e.g., opinions, planning steps, greetings, questions, disclaimers, mathematical calculation). +3. **For each label, provide a short rationale explaining your decision.** The rationale should be separate from the excerpt. +4. **Be very strict with your `supported`, `contradictory` and `disputed` decisions.** Unless you can find straightforward, indisputable evidence excepts *in the context* that a sentence is `supported`, `contradictory` or `disputed`, consider it `unsupported`. You should not employ world knowledge unless it is truly trivial. +5. "tool_outputs" blocks contain code execution results of the "tool_code" blocks immediately above them. If any sentence is based on "tool_outputs" results, first analyze if the corresponding "tool_code" is supported and if the results are error-free. Only if the "tool_code" block is supported, you can treat code execution results as correct. +6. If you need to cite multiple supporting excerpts, simply concatenate them. Excerpt could be summary from the context if it is too long. + +**Input Format:** + +The input will consist of two parts, clearly separated: + +* **Context:** The textual context used to generate the response. +* **Sentences:** The sentences from the model-generated response to be analyzed. Each sentence will be wrapped in .... + +**Output Format:** + +For each sentence, output a block of text with the following fields: + +* sentence: The sentence being analyzed. Please directly copy the sentence which is provided. +* label: One of `supported`, `unsupported`, `contradictory`, `disputed` or `not_applicable`. +* rationale: A brief explanation for the assessment +* supporting_excerpt: A relevant excerpt from the context that supports the sentence. Only required for `supported` and `disputed` labels. +* contradicting_excerpt: A relevant excerpt from the context that contradicts with the sentence. Only required for `contradictory` and `disputed` labels. + +**Example:** + +**Input:** + +**Context Begin** +Apples are red fruits. Bananas are yellow fruits. Pears are purple fruits. Pears are blue fruits. +**Context End** + +**Sentences Begin** +Apples are red. +Bananas are green. +Pears are purple. +Bananas are cheaper than apples. +Enjoy your fruit! +**Sentences End** + +**Output:** +sentence: Apples are red. +label: supported +rationale: The context explicitly states that apples are red. +supporting_excerpt: Apples are red fruits. +contradicting_excerpt: null + +sentence: Bananas are green. +label: contradictory +rationale: The context states that bananas are yellow, not green. +supporting_excerpt: null +contradicting_excerpt: Bananas are yellow fruits. + +sentence: Pears are purple. +label: disputed +rationale: The context states that pears are purple but it also states that pears are blue. +supporting_excerpt: Pears are purple fruits +contradicting_excerpt: Pears are blue fruits + +sentence: Bananas are cheaper than apples. +label: unsupported +rationale: The context does not mention the price of bananas or apples. +supporting_excerpt: null +contradicting_excerpt: null + +sentence: Enjoy your fruit! +label: not_applicable +rationale: This is a general expression and does not require factual attribution. +supporting_excerpt: null +contradicting_excerpt: null + +**Now, please analyze the following context and sentences:** + +**Input:** + +**Context Begin** +{context} +**Context End** + +**Sentences Begin** +{sentences} +**Sentences End** + +**Output:** +""".strip() + +_POSITIVE_LABELS = frozenset(["supported", "not_applicable"]) + +_NEGATIVE_LABELS = frozenset(["unsupported", "contradictory", "disputed"]) + + +@dataclasses.dataclass(frozen=True) +class EvaluationStep: + """The context and natural language response to be evaluated at a step.""" + + context: str + nl_response: str + + +def _parse_sentences(response_text: str) -> list[str]: + """Parses sentences from LLM response.""" + return re.findall(r"(.*?)", response_text, re.DOTALL) + + +def _parse_validation_results( + response_text: str, +) -> list[dict[str, Optional[str]]]: + """Parses sentence validation results from LLM response.""" + results = [] + pattern = re.compile( + r"sentence:(.*?)\nlabel:(.*?)\nrationale:(.*?)\nsupporting_excerpt:(.*?)\ncontradicting_excerpt:(.*?)(?=\nsentence:|\Z)", + re.DOTALL | re.IGNORECASE, + ) + for match in pattern.finditer(response_text.strip()): + try: + sentence, label, rationale, sup_exc, con_exc = match.groups() + results.append({ + "sentence": sentence.strip(), + "label": label.strip(), + "rationale": rationale.strip(), + "supporting_excerpt": ( + sup_exc.strip() if sup_exc.strip().lower() != "null" else None + ), + "contradicting_excerpt": ( + con_exc.strip() if con_exc.strip().lower() != "null" else None + ), + }) + except Exception: # pylint: disable=broad-except + logger.warning( + "Failed to parse sentence validation block: %s", match.group(0) + ) + return results + + +@experimental +class HallucinationsV1Evaluator(Evaluator): + """Evaluates whether a model response contains any false, contradictory, or unsupported claims. + + The metric follows a two-step process: + 1. Segmenter: Segments the agent response into individual sentences. + 2. Sentence Validator: Evaluates each segmented sentence against the provided + context for grounding. + + The metric computes the Accuracy Score (AS): the percentage of sentences that + are supported or not_applicable. + """ + + criterion_type: ClassVar[type[HallucinationsCriterion]] = ( + HallucinationsCriterion + ) + + def __init__(self, eval_metric: EvalMetric): + self._eval_metric = eval_metric + + expected_criterion_type_error = ValueError( + f"`{eval_metric.metric_name}` metric expects a criterion of type" + f" `{HallucinationsV1Evaluator.criterion_type}`." + ) + + try: + if self._eval_metric.criterion is None: + raise expected_criterion_type_error + + self._criterion = HallucinationsV1Evaluator.criterion_type.model_validate( + self._eval_metric.criterion.model_dump() + ) + except ValidationError as e: + raise expected_criterion_type_error from e + + self._judge_model_options = self._criterion.judge_model_options + self._judge_model = self._setup_auto_rater() + self.segmenter_prompt = _HALLUCINATIONS_V1_SEGMENTER_PROMPT + self.sentence_validator_prompt = _HALLUCINATIONS_V1_VALIDATOR_PROMPT + self._model = self._judge_model_options.judge_model + self._model_config = self._judge_model_options.judge_model_config + + def _setup_auto_rater(self) -> BaseLlm: + model_id = self._judge_model_options.judge_model + llm_registry = LLMRegistry() + llm_class = llm_registry.resolve(model_id) + return llm_class(model=model_id) + + @staticmethod + def get_metric_info() -> MetricInfo: + return MetricInfo( + metric_name=PrebuiltMetrics.HALLUCINATIONS_V1.value, + description=( + "This metric assesses whether a model response contains any false," + " contradictory, or unsupported claims using a LLM as judge. Value" + " range for this metric is [0,1], with values closer to 1 more" + " desirable." + ), + metric_value_info=MetricValueInfo( + interval=Interval(min_value=0.0, max_value=1.0) + ), + ) + + def _create_context_for_step( + self, + app_details: Optional[AppDetails], + invocation: Invocation, + events: list[InvocationEvent], + ) -> str: + """Creates context string for sentence validation based on a list of events. + + Given an invocation and a list of events, this method creates a context + string that is used to evaluate the natural language responses (NL + responses) generated by the agent. The context is constructed by combining + the developer instructions, user query, tool definitions, and tool + invocations and their results. + + The general format for the context has two parts. First, the header block: + ``` + Developer instructions: + : + + ... + : + + + User prompt: + + + Tool definitions: + + ``` + + Second, is the step-block, which occurs once for each previous step. Recall + that in the list of all invocation events, a step is the sequence of + events that occurs between NL responses. + ``` + tool_calls: + + + tool_outputs: + + + + ``` + + The following is an example of a context string: + ``` + Developer instructions: + You are a helpful agent that can tell the time and get the weather. + + User prompt: + Get the current time and weather of San Francisco. + + Tool definitions: + [ + { + "name": "get_current_time", + "description": '''Gets the current time in the timezone. + + Args: + timezone: The timezone to get the time of. + + Returns: + The time in the timezone. + ''', + "parameters": { + "type": "object", + "properties": { + "timezone": { + "description": "The timezone to get the time of.", + "type": "string" + } + } + } + }, + { + "name": "get_weather", + "description": '''Gets the weather of the given place at the given + time. + + Args: + location: The location for which to retrieve weather information. + time: The specific time point for the weather data. + + Returns: + The weather at the given time and place. + ''', + "parameters": { + "type": "object", + "properties": { + "location": { + "description": "The location for which to retrieve weather + information.", + "type": "string" + }, + "time": { + "description": "The specific time point for the weather data.", + "type": "string" + } + } + } + }, + ] + + tool_calls: + [ + { + "name": "get_current_time", + "args": {"timezone": "PST"}, + }, + ] + + tool_outputs: + "10:30 AM PST Sep 12, 2025" + ``` + + Args: + app_details: App details to get developer instructions and tool + definitions. + invocation: Invocation to get user prompt. + events: The list of events that occurred before the current step. + + Returns: + The context string to include in the sentence validation prompt. + """ + developer_instructions = "" + tool_declarations = "Agent has no tools." + if app_details: + instructions = [] + for agent_name in app_details.agent_details: + agent_instructions = app_details.get_developer_instructions(agent_name) + if agent_instructions: + instructions.append(agent_name + ":\n" + agent_instructions) + developer_instructions = "\n\n".join(instructions) + tool_declarations = get_tool_declarations_as_json_str(app_details) + + context_parts = [] + context_parts.append(f"Developer instructions:\n{developer_instructions}\n") + context_parts.append( + f"User prompt:\n{get_text_from_content(invocation.user_content)}\n" + ) + context_parts.append("Tool definitions:") + context_parts.append(f"{tool_declarations}\n") + + for event in events: + if not event.content or not event.content.parts: + continue + tool_calls = [ + part.function_call + for part in event.content.parts + if part.function_call + ] + tool_responses = [ + part.function_response + for part in event.content.parts + if part.function_response + ] + nl_responses = [part.text for part in event.content.parts if part.text] + + if nl_responses: + context_parts.append("\n".join(nl_responses) + "\n") + + if tool_calls: + context_parts.append("tool_calls:") + context_parts.append( + json.dumps( + [ + tool_call.model_dump(exclude_none=True) + for tool_call in tool_calls + ], + indent=2, + ) + + "\n" + ) + if tool_responses: + context_parts.append("tool_outputs:") + context_parts.append( + json.dumps( + [ + tool_response.model_dump(exclude_none=True) + for tool_response in tool_responses + ], + indent=2, + ) + + "\n" + ) + + return "\n".join(context_parts) + + async def _evaluate_nl_response( + self, nl_response: str, context: str + ) -> tuple[Optional[float], str]: + """Runs segmentation and validation for a single NL response.""" + # Segmentation step: split the NL response into sentences. + segmenter_llm_request = LlmRequest( + model=self._model, + contents=[ + genai_types.Content( + parts=[ + genai_types.Part( + text=self.segmenter_prompt.format(response=nl_response) + ) + ], + role="user", + ) + ], + config=self._model_config, + ) + try: + async with Aclosing( + self._judge_model.generate_content_async(segmenter_llm_request) + ) as agen: + segmenter_response = await agen.__anext__() + sentences = _parse_sentences( + get_text_from_content(segmenter_response.content) + ) + except Exception as e: + return None, f"Error during sentence segmentation: {e}" + + if not sentences: + return None, "No sentences produced by segmenter." + + sentences_str = "\n".join([f"{s}" for s in sentences]) + + # Evaluation step: evaluate each sentence against the context. + validator_llm_request = LlmRequest( + model=self._model, + contents=[ + genai_types.Content( + parts=[ + genai_types.Part( + text=self.sentence_validator_prompt.format( + context=context, sentences=sentences_str + ) + ) + ], + role="user", + ) + ], + config=self._model_config, + ) + try: + async with Aclosing( + self._judge_model.generate_content_async(validator_llm_request) + ) as agen: + validator_response = await agen.__anext__() + validation_results = _parse_validation_results( + get_text_from_content(validator_response.content) + ) + except Exception as e: + return None, f"Error during sentence validation: {e}" + + scores = [] + for result in validation_results: + label = result.get("label") + if label is None: + logger.debug("No label found for sentence: %s", result) + continue + + label = label.strip().lower() + if label in _POSITIVE_LABELS: + scores.append(1) + elif label in _NEGATIVE_LABELS: + scores.append(0) + else: + logger.debug("Unexpected label: %s", label) + + accuracy_score = statistics.mean(scores) if scores else None + return accuracy_score, json.dumps(validation_results, indent=2) + + def _get_steps_to_evaluate(self, actual: Invocation) -> list[EvaluationStep]: + """Gathers all NL responses and their contexts for evaluation. + + An invocation may look like: + ``` + { + "invocation_id": "1234", + "user_content": { + "parts": [{"text": "User query."}], + }, + "final_response": { + "parts": [{"text": "Final response."}], + }, + "app_details": { + "agent_details": { + "root": { + "name": "root", + "instructions": "Root agent instructions.", + "tool_declarations": [] + } + } + }, + "intermediate_data": { + "invocation_events": [ + { + "author": "root", + "content": { + "parts": [{"text": "Intermediate response 1."}], + } + }, + { + "author": "root", + "content": { + "parts": [ + { + "function_call": { + "name": "tool_1", + "args": { + "arg_1": "value_1" + } + } + }, + { + "function_response": { + "response": "Tool response" + } + }, + { + "text": "Intermediate response 2." + }, + ] + } + } + ] + } + } + ``` + + Args: + actual: The actual invocation to evaluate. + + Returns: + EvaluationSteps, one for each NL response to evaluate. + """ + step_evaluations = [] + events_for_context: list[InvocationEvent] = [] + all_events = [] + if isinstance(actual.intermediate_data, InvocationEvents): + all_events = actual.intermediate_data.invocation_events or [] + + if self._criterion.evaluate_intermediate_nl_responses: + for event in all_events: + nl_parts = ( + [p.text for p in event.content.parts if p.text] + if event.content and event.content.parts + else [] + ) + if nl_parts: + context = self._create_context_for_step( + actual.app_details, actual, events_for_context + ) + for nl_response in nl_parts: + step_evaluations.append( + EvaluationStep(nl_response=nl_response, context=context) + ) + events_for_context.append(event) + else: + events_for_context = all_events + + final_response_text = get_text_from_content(actual.final_response) + if final_response_text: + context = self._create_context_for_step( + actual.app_details, actual, events_for_context + ) + step_evaluations.append( + EvaluationStep(nl_response=final_response_text, context=context) + ) + return step_evaluations + + def _aggregate_invocation_results( + self, + per_invocation_results: list[PerInvocationResult], + ) -> EvaluationResult: + """Aggregates the per invocation results to get the overall score.""" + valid_results = [r for r in per_invocation_results if r.score is not None] + if not valid_results: + return EvaluationResult( + overall_score=None, + overall_eval_status=EvalStatus.NOT_EVALUATED, + per_invocation_results=per_invocation_results, + ) + + overall_fs_score = statistics.mean([r.score for r in valid_results]) + return EvaluationResult( + overall_score=overall_fs_score, + overall_eval_status=get_eval_status( + overall_fs_score, self._eval_metric.threshold + ), + per_invocation_results=per_invocation_results, + ) + + @override + async def evaluate_invocations( + self, + actual_invocations: list[Invocation], + expected_invocations: Optional[list[Invocation]], + ) -> EvaluationResult: + # expected_invocations are not required by the metric and if they are not + # supplied, we provide an a list of None to rest of the code. + expected_invocations = ( + [None] * len(actual_invocations) + if expected_invocations is None + else expected_invocations + ) + per_invocation_results = [] + for actual, expected in zip(actual_invocations, expected_invocations): + step_evaluations = self._get_steps_to_evaluate(actual) + + if not step_evaluations: + per_invocation_results.append( + PerInvocationResult( + actual_invocation=actual, + expected_invocation=expected, + score=None, + eval_status=EvalStatus.NOT_EVALUATED, + rubric_scores=[], + ) + ) + continue + + scores_per_step = [] + for step in step_evaluations: + fs_score, _ = await self._evaluate_nl_response( + step.nl_response, step.context + ) + if fs_score is not None: + scores_per_step.append(fs_score) + + invocation_score = ( + statistics.mean(scores_per_step) if scores_per_step else None + ) + + per_invocation_results.append( + PerInvocationResult( + actual_invocation=actual, + expected_invocation=expected, + score=invocation_score, + eval_status=get_eval_status( + invocation_score, self._eval_metric.threshold + ), + rubric_scores=[], + ) + ) + + if per_invocation_results: + return self._aggregate_invocation_results(per_invocation_results) + return EvaluationResult() diff --git a/src/google/adk/evaluation/llm_as_judge.py b/src/google/adk/evaluation/llm_as_judge.py index cf86ffbbbd..a33e827778 100644 --- a/src/google/adk/evaluation/llm_as_judge.py +++ b/src/google/adk/evaluation/llm_as_judge.py @@ -26,15 +26,24 @@ from ..models.llm_response import LlmResponse from ..models.registry import LLMRegistry from ..utils.context_utils import Aclosing +from ..utils.feature_decorator import experimental +from .common import EvalBaseModel from .eval_case import Invocation from .eval_metrics import BaseCriterion from .eval_metrics import EvalMetric +from .eval_metrics import RubricScore from .evaluator import EvaluationResult from .evaluator import Evaluator from .evaluator import PerInvocationResult from .llm_as_judge_utils import get_eval_status +class AutoRaterScore(EvalBaseModel): + score: Optional[float] = None + rubric_scores: Optional[list[RubricScore]] = None + + +@experimental class LlmAsJudge(Evaluator): """Evaluator based on a LLM. @@ -51,9 +60,13 @@ class LlmAsJudge(Evaluator): """ def __init__( - self, eval_metric: EvalMetric, criterion_type: type[BaseCriterion] + self, + eval_metric: EvalMetric, + criterion_type: type[BaseCriterion], + expected_invocations_required=False, ): self._eval_metric = eval_metric + self._expected_invocations_required = expected_invocations_required expected_criterion_type_error = ValueError( f"`{eval_metric.metric_name}` metric expects a criterion of type" @@ -75,14 +88,14 @@ def __init__( @abstractmethod def format_auto_rater_prompt( - self, actual: Invocation, expected: Invocation + self, actual: Invocation, expected: Optional[Invocation] ) -> str: """Formats the auto-rater prompt to evaluate the given invocation.""" @abstractmethod def convert_auto_rater_response_to_score( self, auto_rater_response: LlmResponse - ) -> Optional[float]: + ) -> AutoRaterScore: """Parses auto_rater_response and returns the corresponding score, or None if the score cannot be determined.""" @abstractmethod @@ -103,8 +116,19 @@ def aggregate_invocation_results( async def evaluate_invocations( self, actual_invocations: list[Invocation], - expected_invocations: list[Invocation], + expected_invocations: Optional[list[Invocation]], ) -> EvaluationResult: + if self._expected_invocations_required and expected_invocations is None: + raise ValueError("expected_invocations is needed by this metric.") + + # If expected_invocation are not required by the metric and if they are not + # supplied, we provide an a list of None. + expected_invocations = ( + [None] * len(actual_invocations) + if expected_invocations is None + else expected_invocations + ) + per_invocation_results = [] for actual, expected in zip(actual_invocations, expected_invocations): auto_rater_prompt = self.format_auto_rater_prompt(actual, expected) @@ -126,15 +150,18 @@ async def evaluate_invocations( ) as agen: async for llm_response in agen: # Non-streaming call, so there is only one response content. - score = self.convert_auto_rater_response_to_score(llm_response) + auto_rater_score = self.convert_auto_rater_response_to_score( + llm_response + ) invocation_result_samples.append( PerInvocationResult( actual_invocation=actual, expected_invocation=expected, - score=score, + score=auto_rater_score.score, eval_status=get_eval_status( - score, self._criterion.threshold + auto_rater_score.score, self._eval_metric.threshold ), + rubric_scores=auto_rater_score.rubric_scores, ) ) if not invocation_result_samples: diff --git a/src/google/adk/evaluation/llm_as_judge_utils.py b/src/google/adk/evaluation/llm_as_judge_utils.py index c5b780fc86..5d17b0c494 100644 --- a/src/google/adk/evaluation/llm_as_judge_utils.py +++ b/src/google/adk/evaluation/llm_as_judge_utils.py @@ -15,10 +15,17 @@ from __future__ import annotations import enum +import statistics from typing import Optional +from typing import Union from google.genai import types as genai_types +from .app_details import AppDetails +from .common import EvalBaseModel +from .eval_case import get_all_tool_calls_with_responses +from .eval_case import IntermediateDataType +from .eval_metrics import RubricScore from .evaluator import EvalStatus @@ -46,3 +53,97 @@ def get_eval_status(score: Optional[float], threshold: float) -> EvalStatus: if score is None: return EvalStatus.NOT_EVALUATED return EvalStatus.PASSED if score >= threshold else EvalStatus.FAILED + + +def get_average_rubric_score( + rubric_scores: list[RubricScore], +) -> Optional[float]: + """Returns a single score value from the given list of rubric scores. + + It is possible that none of the rubric score actually contain a score value, + if that happens then None is returned. + + If non-zero score values are present, then a mean value is returned as the + aggregated value. + """ + rubric_scores = [ + rubric_score.score + for rubric_score in rubric_scores + if rubric_score.score is not None + ] + + return statistics.mean(rubric_scores) if rubric_scores else None + + +class _ToolDeclarations(EvalBaseModel): + """Internal data model used for serializing Tool declarations.""" + + tool_declarations: dict[str, genai_types.ToolListUnion] + + +def get_tool_declarations_as_json_str( + app_details: AppDetails, +) -> str: + """Returns a JSON string representation of Tool declarations. + + The output of this method is usually intended to be sent to the LLM. + """ + tool_declarations = _ToolDeclarations( + tool_declarations=app_details.get_tools_by_agent_name() + ) + return tool_declarations.model_dump_json( + indent=2, + exclude_unset=True, + exclude_defaults=True, + exclude_none=True, + ) + + +class _ToolCallAndResponse(EvalBaseModel): + """Internal data model to capture one single tool call and response.""" + + step: int + tool_call: genai_types.FunctionCall + tool_response: Union[genai_types.FunctionResponse, str] + + +class _ToolCallsAndResponses(EvalBaseModel): + """Internal data model used for serializing Tool call and responses.""" + + tool_calls_and_response: list[_ToolCallAndResponse] + + +def get_tool_calls_and_responses_as_json_str( + intermediate_data: Optional[IntermediateDataType], +) -> str: + """Returns a JSON string representation of tool calls and corresponding responses. + + The output of this method is usually intended to be sent to the LLM. + """ + raw_tool_calls_and_response = get_all_tool_calls_with_responses( + intermediate_data + ) + + if not raw_tool_calls_and_response: + return "No intermediate steps were taken." + + tool_calls_and_responses = [] + for idx, (tool_call, tool_response) in enumerate(raw_tool_calls_and_response): + tool_calls_and_responses.append( + _ToolCallAndResponse( + step=idx, + tool_call=tool_call, + tool_response=tool_response if tool_response else "None", + ) + ) + + internal_tool_calls_and_responses = _ToolCallsAndResponses( + tool_calls_and_response=tool_calls_and_responses + ) + + return internal_tool_calls_and_responses.model_dump_json( + indent=2, + exclude_unset=True, + exclude_defaults=True, + exclude_none=True, + ) diff --git a/src/google/adk/evaluation/llm_backed_user_simulator.py b/src/google/adk/evaluation/llm_backed_user_simulator.py new file mode 100644 index 0000000000..511d9f3c1c --- /dev/null +++ b/src/google/adk/evaluation/llm_backed_user_simulator.py @@ -0,0 +1,277 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import logging +from typing import ClassVar +from typing import Optional + +from google.genai import types as genai_types +from pydantic import Field +from typing_extensions import override + +from ..events.event import Event +from ..models.llm_request import LlmRequest +from ..models.registry import LLMRegistry +from ..utils.context_utils import Aclosing +from ..utils.feature_decorator import experimental +from .conversation_scenarios import ConversationScenario +from .evaluator import Evaluator +from .user_simulator import BaseUserSimulatorConfig +from .user_simulator import NextUserMessage +from .user_simulator import Status +from .user_simulator import UserSimulator + +logger = logging.getLogger("google_adk." + __name__) + +_AUTHOR_USER = "user" +_STOP_SIGNAL = "" + +_USER_AGENT_INSTRUCTIONS_TEMPLATE = """You are a Simulated User designed to test an AI Agent. + +Your single most important job is to react logically to the Agent's last message. +The Conversation Plan is your canonical grounding, not a script; your response MUST be dictated by what the Agent just said. + +# Primary Operating Loop + +You MUST follow this three-step process while thinking: + +Step 1: Analyze what the Agent just said or did. Specifically, is the Agent asking you a question, reporting a successful or unsuccessful operation, or saying something incorrect or unexpected? + +Step 2: Choose one action based on your analysis: +* ANSWER any questions the Agent asked. +* ADVANCE to the next request as per the Conversation Plan if the Agent succeeds in satisfying your current request. +* INTERVENE if the Agent is yet to complete your current request and the Conversation Plan requires you to modify it. +* CORRECT the Agent if it is making a mistake or failing. +* END the conversation if any of the below stopping conditions are met: + - The Agent has completed all your requests from the Conversation Plan. + - The Agent has failed to fulfill a request *more than once*. + - The Agent has performed an incorrect operation and informs you that it is unable to correct it. + - The Agent ends the conversation on its own by transferring you to a *human/live agent* (NOT another AI Agent). + +Step 3: Formulate a response based on the chosen action and the below Action Protocols and output it. + +# Action Protocols + +**PROTOCOL: ANSWER** +* Only answer the Agent's questions using information from the Conversation Plan. +* Do NOT provide any additional information the Agent did not explicitly ask for. +* If you do not have the information requested by the Agent, inform the Agent. Do NOT make up information that is not in the Conversation Plan. +* Do NOT advance to the next request in the Conversation Plan. + +**PROTOCOL: ADVANCE** +* Make the next request from the Conversation Plan. +* Skip redundant requests already fulfilled by the Agent. + +**PROTOCOL: INTERVENE** +* Change your current request as directed by the Conversation Plan with natural phrasing. + +**PROTOCOL: CORRECT** +* Challenge illogical or incorrect statements made by the Agent. +* If the Agent did an incorrect operation, ask the Agent to fix it. +* If this is the FIRST time the Agent failed to satisfy your request, ask the Agent to try again. + +**PROTOCOL: END** +* End the conversation only when any of the stopping conditions are met; do NOT end prematurely. +* Output `{stop_signal}` to indicate that the conversation with the AI Agents is over. + +# Conversation Plan + +{conversation_plan} + +# Conversation History + +{conversation_history} +""" + + +class LlmBackedUserSimulatorConfig(BaseUserSimulatorConfig): + """Contains configurations required by an LLM backed user simulator.""" + + model: str = Field( + default="gemini-2.5-flash", + description="The model to use for user simulation.", + ) + + model_configuration: genai_types.GenerateContentConfig = Field( + default_factory=lambda: genai_types.GenerateContentConfig( + thinking_config=genai_types.ThinkingConfig( + include_thoughts=True, + thinking_budget=10240, + ) + ), + description="The configuration for the model.", + ) + + max_allowed_invocations: int = Field( + default=20, + description="""Maximum number of invocations allowed by the simulated +interaction. This property allows us to stop a run-off conversation, where the +agent and the user simulator get into a never ending loop. The initial fixed +prompt is also counted as an invocation. + +(Not recommended) If you don't want a limit, you can set the value to -1.""", + ) + + +@experimental +class LlmBackedUserSimulator(UserSimulator): + """A UserSimulator that uses an LLM to generate messages on behalf of the user.""" + + config_type: ClassVar[type[LlmBackedUserSimulatorConfig]] = ( + LlmBackedUserSimulatorConfig + ) + + def __init__( + self, + *, + config: BaseUserSimulatorConfig, + conversation_scenario: ConversationScenario, + ): + super().__init__(config, config_type=LlmBackedUserSimulator.config_type) + self._conversation_scenario = conversation_scenario + self._invocation_count = 0 + llm_registry = LLMRegistry() + llm_class = llm_registry.resolve(self._config.model) + self._llm = llm_class(model=self._config.model) + + @classmethod + def _summarize_conversation( + cls, + events: list[Event], + ) -> str: + """Summarize the conversation to add to the prompt. + + Removes tool calls, responses, and thoughts. + + Args: + events: The conversation history to rewrite. + + Returns: + The summarized conversation history as a string. + """ + rewritten_dialogue = [] + for e in events: + if not e.content or not e.content.parts: + continue + author = e.author + for part in e.content.parts: + if part.text and not part.thought: + rewritten_dialogue.append(f"{author}: {part.text}") + + return "\n\n".join(rewritten_dialogue) + + async def _get_llm_response( + self, + rewritten_dialogue: str, + ) -> str: + """Sends a user message generation request to the LLM and returns the full response.""" + if self._invocation_count == 0: + # first invocation - send the static starting prompt + return self._conversation_scenario.starting_prompt + + user_agent_instructions = _USER_AGENT_INSTRUCTIONS_TEMPLATE.format( + stop_signal=_STOP_SIGNAL, + conversation_plan=self._conversation_scenario.conversation_plan, + conversation_history=rewritten_dialogue, + ) + + llm_request = LlmRequest( + model=self._config.model, + config=self._config.model_configuration, + contents=[ + genai_types.Content( + parts=[ + genai_types.Part(text=user_agent_instructions), + ], + role=_AUTHOR_USER, + ), + ], + ) + + response = "" + async with Aclosing(self._llm.generate_content_async(llm_request)) as agen: + async for llm_response in agen: + generated_content: genai_types.Content = llm_response.content + if not generated_content.parts: + continue + for part in generated_content.parts: + if part.text and not part.thought: + response += part.text + return response + + @override + async def get_next_user_message( + self, + events: list[Event], + ) -> NextUserMessage: + """Returns the next user message to send to the agent with help from a LLM. + + Args: + events: The unaltered conversation history between the user and the + agent(s) under evaluation. + + Returns: + A NextUserMessage object containing the next user message to send to the + agent, or a status indicating why no message was generated. + + Raises: + RuntimeError: If the user agent fails to generate a message. This is not a + valid result for the LLM backed user simulator and is different from the + NO_MESSAGE_GENERATED status. + """ + # check invocation limit + invocation_limit = self._config.max_allowed_invocations + if invocation_limit >= 0 and self._invocation_count >= invocation_limit: + logger.warning( + "LlmBackedUserSimulator invocation limit (%d) reached!", + invocation_limit, + ) + return NextUserMessage(status=Status.TURN_LIMIT_REACHED) + + # rewrite events for the user simulator + rewritten_dialogue = self._summarize_conversation(events) + + # query the LLM for the next user message + response = await self._get_llm_response(rewritten_dialogue) + self._invocation_count += 1 + + # is the conversation over? (Has the user simulator output the stop signal?) + if _STOP_SIGNAL.lower() in response.lower(): + logger.info( + "Stopping user message generation as the stop signal was detected." + ) + return NextUserMessage(status=Status.STOP_SIGNAL_DETECTED) + + # is the response non-empty? + if response: + return NextUserMessage( + status=Status.SUCCESS, + # return message as user content + user_message=genai_types.Content( + parts=[genai_types.Part(text=response)], role=_AUTHOR_USER + ), + ) + + # if we are here, the user agent failed to generate a message, which is not + # a valid result for the LLM backed user simulator. + raise RuntimeError("Failed to generate a user message") + + @override + def get_simulation_evaluator( + self, + ) -> Optional[Evaluator]: + """Returns an Evaluator that evaluates if the simulation was successful or not.""" + raise NotImplementedError() diff --git a/src/google/adk/evaluation/local_eval_service.py b/src/google/adk/evaluation/local_eval_service.py index fa50f70d23..000964d9a7 100644 --- a/src/google/adk/evaluation/local_eval_service.py +++ b/src/google/adk/evaluation/local_eval_service.py @@ -40,6 +40,7 @@ from .eval_case import Invocation from .eval_metrics import EvalMetric from .eval_metrics import EvalMetricResult +from .eval_metrics import EvalMetricResultDetails from .eval_metrics import EvalMetricResultPerInvocation from .eval_result import EvalCaseResult from .eval_set import EvalCase @@ -48,8 +49,10 @@ from .evaluation_generator import EvaluationGenerator from .evaluator import EvalStatus from .evaluator import EvaluationResult +from .evaluator import PerInvocationResult from .metric_evaluator_registry import DEFAULT_METRIC_EVALUATOR_REGISTRY from .metric_evaluator_registry import MetricEvaluatorRegistry +from .user_simulator_provider import UserSimulatorProvider logger = logging.getLogger('google_adk.' + __name__) @@ -73,6 +76,7 @@ def __init__( artifact_service: Optional[BaseArtifactService] = None, eval_set_results_manager: Optional[EvalSetResultsManager] = None, session_id_supplier: Callable[[], str] = _get_session_id, + user_simulator_provider: UserSimulatorProvider = UserSimulatorProvider(), ): self._root_agent = root_agent self._eval_sets_manager = eval_sets_manager @@ -86,6 +90,7 @@ def __init__( self._artifact_service = artifact_service self._eval_set_results_manager = eval_set_results_manager self._session_id_supplier = session_id_supplier + self._user_simulator_provider = user_simulator_provider @override async def perform_inference( @@ -125,7 +130,7 @@ async def perform_inference( async def run_inference(eval_case): async with semaphore: - return await self._perform_inference_sigle_eval_item( + return await self._perform_inference_single_eval_item( app_name=inference_request.app_name, eval_set_id=inference_request.eval_set_id, eval_case=eval_case, @@ -178,10 +183,10 @@ async def run_evaluation(inference_result): async def _evaluate_single_inference_result( self, inference_result: InferenceResult, evaluate_config: EvaluateConfig ) -> tuple[InferenceResult, EvalCaseResult]: - """Returns EvalCaseResult for the given inference result. + """Returns the inference result and its corresponding EvalCaseResult. A single inference result can have multiple invocations. For each - invocaiton, this method evaluates the metrics present in evaluate config. + invocation, this method evaluates the metrics present in evaluate config. The EvalCaseResult contains scores for each metric per invocation and the overall score. @@ -204,13 +209,21 @@ async def _evaluate_single_inference_result( # We also keep track of the overall score for a metric, derived from all # invocation. For example, if we were keeping track the metric that compares - # how well is the final resposne as compared to a golden answer, then each + # how well is the final response as compared to a golden answer, then each # invocation will have the value of this metric. We will also have an # overall score using aggregation strategy across all invocations. This # would be the score for the eval case. overall_eval_metric_results = [] - if len(inference_result.inferences) != len(eval_case.conversation): + user_id = ( + eval_case.session_input.user_id + if eval_case.session_input and eval_case.session_input.user_id + else 'test_user_id' + ) + + if eval_case.conversation_scenario is None and len( + inference_result.inferences + ) != len(eval_case.conversation): raise ValueError( 'Inferences should match conversations in eval case. Found' f'{len(inference_result.inferences)} inferences ' @@ -218,13 +231,13 @@ async def _evaluate_single_inference_result( ) # Pre-creating the EvalMetricResults entries for each invocation. - for actual, expected in zip( - inference_result.inferences, eval_case.conversation - ): + for idx, actual in enumerate(inference_result.inferences): eval_metric_result_per_invocation.append( EvalMetricResultPerInvocation( actual_invocation=actual, - expected_invocation=expected, + expected_invocation=eval_case.conversation[idx] + if eval_case.conversation + else None, # We will fill this as we evaluate each metric per invocation. eval_metric_results=[], ) @@ -232,24 +245,45 @@ async def _evaluate_single_inference_result( for eval_metric in evaluate_config.eval_metrics: # Perform evaluation of the metric. - evaluation_result = await self._evaluate_metric( - eval_metric=eval_metric, - actual_invocations=inference_result.inferences, - expected_invocations=eval_case.conversation, - ) + try: + evaluation_result = await self._evaluate_metric( + eval_metric=eval_metric, + actual_invocations=inference_result.inferences, + expected_invocations=eval_case.conversation, + ) + except Exception as e: + # We intentionally catch the Exception as we don't want failures to + # affect other metric evaluation. + logger.error( + "Metric evaluation failed for metric `%s` for eval case id '%s'" + ' with following error `%s`', + eval_metric.metric_name, + eval_case.eval_id, + e, + exc_info=True, + ) + # We use an empty result. + evaluation_result = EvaluationResult( + overall_eval_status=EvalStatus.NOT_EVALUATED + ) - # Track overall scrore across all invocations. + # Track overall score across all invocations. + eval_metric_result_details = EvalMetricResultDetails( + rubric_scores=evaluation_result.overall_rubric_scores + ) overall_eval_metric_results.append( EvalMetricResult( - metric_name=eval_metric.metric_name, - threshold=eval_metric.threshold, score=evaluation_result.overall_score, eval_status=evaluation_result.overall_eval_status, + details=eval_metric_result_details, + **eval_metric.model_dump(), ) ) - if len(evaluation_result.per_invocation_results) != len( - eval_metric_result_per_invocation + if ( + evaluation_result.overall_eval_status != EvalStatus.NOT_EVALUATED + and len(evaluation_result.per_invocation_results) + != len(eval_metric_result_per_invocation) ): raise ValueError( 'Eval metric should return results for each invocation. Found ' @@ -258,27 +292,29 @@ async def _evaluate_single_inference_result( ) # Track score across individual invocations. - for invocation_result, invocation in zip( - evaluation_result.per_invocation_results, - eval_metric_result_per_invocation, - ): + for idx, invocation in enumerate(eval_metric_result_per_invocation): + invocation_result = ( + evaluation_result.per_invocation_results[idx] + if evaluation_result.overall_eval_status != EvalStatus.NOT_EVALUATED + else PerInvocationResult( + actual_invocation=invocation.actual_invocation + ) + ) + eval_metric_result_details = EvalMetricResultDetails( + rubric_scores=invocation_result.rubric_scores + ) invocation.eval_metric_results.append( EvalMetricResult( - metric_name=eval_metric.metric_name, - threshold=eval_metric.threshold, score=invocation_result.score, eval_status=invocation_result.eval_status, + details=eval_metric_result_details, + **eval_metric.model_dump(), ) ) final_eval_status = self._generate_final_eval_status( overall_eval_metric_results ) - user_id = ( - eval_case.session_input.user_id - if eval_case.session_input and eval_case.session_input.user_id - else 'test_user_id' - ) eval_case_result = EvalCaseResult( eval_set_file=inference_result.eval_set_id, @@ -302,7 +338,7 @@ async def _evaluate_metric( self, eval_metric: EvalMetric, actual_invocations: list[Invocation], - expected_invocations: list[Invocation], + expected_invocations: Optional[list[Invocation]], ) -> EvaluationResult: """Returns EvaluationResult obtained from evaluating a metric using an Evaluator.""" @@ -330,8 +366,8 @@ def _generate_final_eval_status( self, overall_eval_metric_results: list[EvalMetricResult] ) -> EvalStatus: final_eval_status = EvalStatus.NOT_EVALUATED - # Go over the all the eval statuses and mark the final eval status as - # passed if all of them pass, otherwise mark the final eval status to + # Go over all the eval statuses and mark the final eval status as + # passed if all of them pass; otherwise, mark the final eval status to # failed. for overall_eval_metric_result in overall_eval_metric_results: overall_eval_status = overall_eval_metric_result.eval_status @@ -347,7 +383,7 @@ def _generate_final_eval_status( return final_eval_status - async def _perform_inference_sigle_eval_item( + async def _perform_inference_single_eval_item( self, app_name: str, eval_set_id: str, @@ -366,8 +402,8 @@ async def _perform_inference_sigle_eval_item( try: inferences = ( await EvaluationGenerator._generate_inferences_from_root_agent( - invocations=eval_case.conversation, root_agent=root_agent, + user_simulator=self._user_simulator_provider.provide(eval_case), initial_session=initial_session, session_id=session_id, session_service=self._session_service, @@ -383,9 +419,10 @@ async def _perform_inference_sigle_eval_item( # We intentionally catch the Exception as we don't failures to affect # other inferences. logger.error( - 'Inference failed for eval case `%s` with error %s', + 'Inference failed for eval case `%s` with error %s.', eval_case.eval_id, e, + exc_info=True, ) inference_result.status = InferenceStatus.FAILURE inference_result.error_message = str(e) diff --git a/src/google/adk/evaluation/local_eval_sets_manager.py b/src/google/adk/evaluation/local_eval_sets_manager.py index a68eb85368..da5225efe6 100644 --- a/src/google/adk/evaluation/local_eval_sets_manager.py +++ b/src/google/adk/evaluation/local_eval_sets_manager.py @@ -85,11 +85,11 @@ def _convert_invocation_to_pydantic_schema( ) -def convert_eval_set_to_pydanctic_schema( +def convert_eval_set_to_pydantic_schema( eval_set_id: str, eval_set_in_json_format: list[dict[str, Any]], ) -> EvalSet: - r"""Returns an pydantic EvalSet generated from the json representation. + r"""Returns a pydantic EvalSet generated from the json representation. Args: eval_set_id: Eval set id. @@ -183,7 +183,7 @@ def load_eval_set_from_file( except ValidationError: # We assume that the eval data was specified in the old format and try # to convert it to the new format. - return convert_eval_set_to_pydanctic_schema( + return convert_eval_set_to_pydantic_schema( eval_set_id, json.loads(content) ) @@ -209,9 +209,9 @@ def create_eval_set(self, app_name: str, eval_set_id: str) -> EvalSet: """Creates and returns an empty EvalSet given the app_name and eval_set_id. Raises: - ValueError: If eval set id is not valid or an eval set already exists. + ValueError: If Eval Set ID is not valid or an eval set already exists. """ - self._validate_id(id_name="Eval Set Id", id_value=eval_set_id) + self._validate_id(id_name="Eval Set ID", id_value=eval_set_id) # Define the file path new_eval_set_path = self._get_eval_set_file_path(app_name, eval_set_id) @@ -265,7 +265,7 @@ def list_eval_sets(self, app_name: str) -> list[str]: def get_eval_case( self, app_name: str, eval_set_id: str, eval_case_id: str ) -> Optional[EvalCase]: - """Returns an EvalCase if found, otherwise None.""" + """Returns an EvalCase if found; otherwise, None.""" eval_set = self.get_eval_set(app_name, eval_set_id) if not eval_set: return None @@ -324,8 +324,16 @@ def _validate_id(self, id_name: str, id_value: str): ) def _write_eval_set_to_path(self, eval_set_path: str, eval_set: EvalSet): + os.makedirs(os.path.dirname(eval_set_path), exist_ok=True) with open(eval_set_path, "w", encoding="utf-8") as f: - f.write(eval_set.model_dump_json(indent=2)) + f.write( + eval_set.model_dump_json( + indent=2, + exclude_unset=True, + exclude_defaults=True, + exclude_none=True, + ) + ) def _save_eval_set(self, app_name: str, eval_set_id: str, eval_set: EvalSet): eval_set_file_path = self._get_eval_set_file_path(app_name, eval_set_id) diff --git a/src/google/adk/evaluation/metric_evaluator_registry.py b/src/google/adk/evaluation/metric_evaluator_registry.py index e2bcd5f81a..0e8c54d8fb 100644 --- a/src/google/adk/evaluation/metric_evaluator_registry.py +++ b/src/google/adk/evaluation/metric_evaluator_registry.py @@ -23,7 +23,10 @@ from .eval_metrics import PrebuiltMetrics from .evaluator import Evaluator from .final_response_match_v2 import FinalResponseMatchV2Evaluator +from .hallucinations_v1 import HallucinationsV1Evaluator from .response_evaluator import ResponseEvaluator +from .rubric_based_final_response_quality_v1 import RubricBasedFinalResponseQualityV1Evaluator +from .rubric_based_tool_use_quality_v1 import RubricBasedToolUseV1Evaluator from .safety_evaluator import SafetyEvaluatorV1 from .trajectory_evaluator import TrajectoryEvaluator @@ -111,6 +114,18 @@ def _get_default_metric_evaluator_registry() -> MetricEvaluatorRegistry: metric_info=FinalResponseMatchV2Evaluator.get_metric_info(), evaluator=FinalResponseMatchV2Evaluator, ) + metric_evaluator_registry.register_evaluator( + metric_info=RubricBasedFinalResponseQualityV1Evaluator.get_metric_info(), + evaluator=RubricBasedFinalResponseQualityV1Evaluator, + ) + metric_evaluator_registry.register_evaluator( + metric_info=HallucinationsV1Evaluator.get_metric_info(), + evaluator=HallucinationsV1Evaluator, + ) + metric_evaluator_registry.register_evaluator( + metric_info=RubricBasedToolUseV1Evaluator.get_metric_info(), + evaluator=RubricBasedToolUseV1Evaluator, + ) return metric_evaluator_registry diff --git a/src/google/adk/evaluation/request_intercepter_plugin.py b/src/google/adk/evaluation/request_intercepter_plugin.py new file mode 100644 index 0000000000..374a30f67a --- /dev/null +++ b/src/google/adk/evaluation/request_intercepter_plugin.py @@ -0,0 +1,94 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import logging +from typing import Optional +import uuid + +from typing_extensions import override + +from ..agents.callback_context import CallbackContext +from ..models.llm_request import LlmRequest +from ..models.llm_response import LlmResponse +from ..plugins.base_plugin import BasePlugin + +logger = logging.getLogger("google_adk." + __name__) + +_LLM_REQUEST_ID_KEY = "__llm_request_key__" + + +class _RequestIntercepterPlugin(BasePlugin): + """A plugin that intercepts requests that are made to the model and couples them with the model response. + + NOTE: This implementation is intended for eval systems internal usage. Do not + take direct depdency on it. + + Context behind the creation of this intercepter: + Some of the newer AutoRater backed metrics need access the pieces of + information that were presented to the model like instructions and the list + of available tools. + + We intercept the llm_request using this intercepter and make it available to + eval system. + + How is it done? + The class maintains a cache of llm_requests that pass through it. Each request + is given a unique id. The id is put in custom_metadata field of the response. + Eval systems have access to the response and can use the request id to + get the llm_request. + """ + + def __init__(self, name: str): + super().__init__(name=name) + self._llm_requests_cache: dict[str, LlmRequest] = {} + + @override + async def before_model_callback( + self, *, callback_context: CallbackContext, llm_request: LlmRequest + ) -> Optional[LlmResponse]: + # We add the llm_request to the call back context so that we can fetch + # it later. + request_id = str(uuid.uuid4()) + self._llm_requests_cache[request_id] = llm_request + callback_context.state[_LLM_REQUEST_ID_KEY] = request_id + + @override + async def after_model_callback( + self, *, callback_context: CallbackContext, llm_response: LlmResponse + ) -> Optional[LlmResponse]: + # Fetch the request_id from the callback_context + if callback_context and _LLM_REQUEST_ID_KEY in callback_context.state: + if llm_response.custom_metadata is None: + llm_response.custom_metadata = {} + + llm_response.custom_metadata[_LLM_REQUEST_ID_KEY] = ( + callback_context.state[_LLM_REQUEST_ID_KEY] + ) + + def get_model_request( + self, llm_response: LlmResponse + ) -> Optional[LlmRequest]: + """Fetches the request object, if found.""" + if ( + llm_response.custom_metadata + and _LLM_REQUEST_ID_KEY in llm_response.custom_metadata + ): + request_id = llm_response.custom_metadata[_LLM_REQUEST_ID_KEY] + + if request_id in self._llm_requests_cache: + return self._llm_requests_cache[request_id] + else: + logger.warning("`%s` not found in llm_request_cache.", request_id) diff --git a/src/google/adk/evaluation/response_evaluator.py b/src/google/adk/evaluation/response_evaluator.py index fa6be8bf67..d51c3829fc 100644 --- a/src/google/adk/evaluation/response_evaluator.py +++ b/src/google/adk/evaluation/response_evaluator.py @@ -17,8 +17,8 @@ from typing import Optional from typing_extensions import override -from vertexai import types as vertexai_types +from ..dependencies.vertexai import vertexai from .eval_case import Invocation from .eval_metrics import EvalMetric from .eval_metrics import Interval @@ -30,13 +30,15 @@ from .final_response_match_v1 import RougeEvaluator from .vertex_ai_eval_facade import _VertexAiEvalFacade +vertexai_types = vertexai.types + class ResponseEvaluator(Evaluator): """Evaluates Agent's responses. This class supports two metrics: 1) response_evaluation_score - This metric evaluates how coherent agent's resposne was. + This metric evaluates how coherent agent's response was. Value range of this metric is [1,5], with values closer to 5 more desirable. @@ -81,7 +83,7 @@ def get_metric_info(metric_name: str) -> MetricInfo: return MetricInfo( metric_name=PrebuiltMetrics.RESPONSE_EVALUATION_SCORE.value, description=( - "This metric evaluates how coherent agent's resposne was. Value" + "This metric evaluates how coherent agent's response was. Value" " range of this metric is [1,5], with values closer to 5 more" " desirable." ), @@ -98,7 +100,7 @@ def get_metric_info(metric_name: str) -> MetricInfo: def evaluate_invocations( self, actual_invocations: list[Invocation], - expected_invocations: list[Invocation], + expected_invocations: Optional[list[Invocation]], ) -> EvaluationResult: # If the metric is response_match_score, just use the RougeEvaluator. if self._metric_name == PrebuiltMetrics.RESPONSE_MATCH_SCORE.value: @@ -110,5 +112,7 @@ def evaluate_invocations( ) return _VertexAiEvalFacade( - threshold=self._threshold, metric_name=self._metric_name + threshold=self._threshold, + metric_name=self._metric_name, + expected_invocations_required=True, ).evaluate_invocations(actual_invocations, expected_invocations) diff --git a/src/google/adk/evaluation/rubric_based_evaluator.py b/src/google/adk/evaluation/rubric_based_evaluator.py new file mode 100644 index 0000000000..0e90996057 --- /dev/null +++ b/src/google/adk/evaluation/rubric_based_evaluator.py @@ -0,0 +1,390 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import abc +import logging +import re +from typing import Optional + +from typing_extensions import override + +from ..models.llm_response import LlmResponse +from ..utils.feature_decorator import experimental +from .common import EvalBaseModel +from .eval_metrics import BaseCriterion +from .eval_metrics import EvalMetric +from .eval_rubrics import Rubric +from .eval_rubrics import RubricScore +from .evaluator import EvaluationResult +from .evaluator import PerInvocationResult +from .llm_as_judge import AutoRaterScore +from .llm_as_judge import LlmAsJudge +from .llm_as_judge_utils import get_average_rubric_score +from .llm_as_judge_utils import get_eval_status +from .llm_as_judge_utils import get_text_from_content + +logger = logging.getLogger("google_adk." + __name__) + + +class RubricResponse(EvalBaseModel): + """Internal data model to represent a rubric's response from the auto-rater.""" + + property_text: Optional[str] = None + rationale: Optional[str] = None + score: Optional[float] = None + + +class AutoRaterResponseParser(abc.ABC): + """An interface for parsing auto rater's response.""" + + @abc.abstractmethod + def parse(self, auto_rater_response: str) -> list[RubricResponse]: + """Parses the auto rater's response.""" + raise NotImplementedError + + +_PROPERTY_PATTERN = r"(?<=Property: )(.*)" +_RATIONALE_PATTERN = r"(?<=Rationale: )(.*)" +_VERDICT_PATTERN = r"(?<=Verdict: )(.*)" + + +class DefaultAutoRaterResponseParser(AutoRaterResponseParser): + """The default implementation of the AutoRaterResponseParser.""" + + def parse(self, auto_rater_response: str) -> list[RubricResponse]: + """Returns a list of RubricResponse parsed from the AutoRater's response.""" + properties = re.findall(_PROPERTY_PATTERN, auto_rater_response) + rationales = re.findall(_RATIONALE_PATTERN, auto_rater_response) + scores = [] + + for verdict in re.findall(_VERDICT_PATTERN, auto_rater_response): + if "yes" in verdict.lower(): + score = 1.0 + elif "no" in verdict.lower(): + score = 0.0 + else: + score = None + + scores.append(score) + + rubric_responses = [] + for p, r, s in zip(properties, rationales, scores): + rubric_responses.append( + RubricResponse(property_text=p.strip(), rationale=r.strip(), score=s) + ) + + return rubric_responses + + +class PerInvocationResultsAggregator(abc.ABC): + """An interface for aggregating per invocation samples. + + AutoRaters that are backed by an LLM are known to have certain degree of + unreliabilty to their responses. In order to counter that we sample the + autorater more than once for a single invocation. + + The aggregator helps convert those multiple samples into a single result. + """ + + @abc.abstractmethod + def aggregate( + self, + per_invocation_samples: list[PerInvocationResult], + threshold: float, + ) -> PerInvocationResult: + """Aggregates per invocation samples into a single result.""" + raise NotImplementedError + + +class MajorityVotePerInvocationResultsAggregator( + PerInvocationResultsAggregator +): + """Aggregates per invocation samples using majority vote.""" + + def aggregate( + self, + per_invocation_samples: list[PerInvocationResult], + threshold: float, + ) -> PerInvocationResult: + """Returns a combined result for the invocation using majority vote. + + This method takes all those samples for a single invocation and combines + them to genreate one single result for the invocation. + + This method specifically uses majority vote to aggregate scores for a + rubric. Take following Invocation and Rubric for example: + + Invocation: + User: Is it going to be cold in Seattle tomorrow? + Weather Agent: No, it will be moderately warm as predicted temperature + for Seattle, WA tomorrow is 88F. + + Rubric: Agent's reponse was concise and to the point. + + We will sample the AutoRater 5 times, and the AutoRater responds + with (skipping the rationale field for now): + Sample 1: + Verdict: Yes + Sample 2: + Verdict: No + Sample 3: + Verdict: Yes + Sample 4: + Verdict: Yes + Sample 5: + Verdict: No + + This method will use majority vote and combine the results of 5 samples + into one, and it will report "Yes" as the final verdict. + """ + score_category_by_rubric_id = {} + + # We go over each rubric for each sample, and categorize the rubric into + # one of the following buckets: + # - Bucket 0: No score was generated for the rubric + # - Bucket 1: Score was generated and it was positive (1.0) + # - Bucket 2: Score was generated and it was negative (0.0) + for sample in per_invocation_samples: + if not sample.rubric_scores: + continue + + for rubric_score in sample.rubric_scores: + rubric_id = rubric_score.rubric_id + if rubric_id not in score_category_by_rubric_id: + score_category_by_rubric_id[rubric_id] = ([], [], []) + + if rubric_score.score is None: # No score + score_category_by_rubric_id[rubric_id][0].append(rubric_score) + elif rubric_score.score == 1.0: # Positive Result + score_category_by_rubric_id[rubric_id][1].append(rubric_score) + else: # Negative result + score_category_by_rubric_id[rubric_id][2].append(rubric_score) + + aggregated_rubric_scores = [] + for rubric_id in score_category_by_rubric_id: + no_scores, positives, negatives = score_category_by_rubric_id[rubric_id] + + if not positives and not negatives: + # There has to be at least a no score rubric! + aggregated_rubric_scores.append(no_scores[0]) + + # This is where we are taking a majority vote. + elif len(positives) > len(negatives): + aggregated_rubric_scores.append(positives[0]) + else: + aggregated_rubric_scores.append(negatives[0]) + + aggregated_overall_score = get_average_rubric_score( + aggregated_rubric_scores + ) + + return PerInvocationResult( + actual_invocation=per_invocation_samples[0].actual_invocation, + expected_invocation=per_invocation_samples[0].expected_invocation, + score=aggregated_overall_score, + rubric_scores=aggregated_rubric_scores, + eval_status=get_eval_status(aggregated_overall_score, threshold), + ) + + +class InvocationResultsSummarizer(abc.ABC): + """An interface for summarizing per invocation results.""" + + @abc.abstractmethod + def summarize( + self, per_invocation_results: list[PerInvocationResult], threshold: float + ) -> EvaluationResult: + """Summaries per invocation results into a single result.""" + raise NotImplementedError + + +class MeanInvocationResultsSummarizer(InvocationResultsSummarizer): + """Summarizes per invocation results using mean score.""" + + def summarize( + self, per_invocation_results: list[PerInvocationResult], threshold: float + ) -> EvaluationResult: + """Summarizes per invocation evaluation results into a single score. + + A single eval case can have multiple invocations and the eval metric is + assessed for each invocation. But, we do want to summarize and make a + statement on how the eval case as a whole performed on the metric. + + This method helps us aggreate rubric scores across invocation. + + This method calculates the mean score of a rubric across several + invocations. + """ + + unaggregated_rubric_scores = [] # Later used to calculate average. + + # Collect rubric scores by id, so that we can calculate average score + # for each rubric id. + rubric_scores_by_id = {} + for sample in per_invocation_results: + if not sample.rubric_scores: + continue + + for rubric_score in sample.rubric_scores: + rubric_id = rubric_score.rubric_id + if rubric_id not in rubric_scores_by_id: + rubric_scores_by_id[rubric_id] = [] + + rubric_scores_by_id[rubric_id].append(rubric_score) + unaggregated_rubric_scores.append(rubric_score) + + aggregated_rubric_scores = [] + for rubric_id, rubric_scores in rubric_scores_by_id.items(): + overall_score = get_average_rubric_score(rubric_scores) + aggregated_rubric_scores.append( + RubricScore( + rubric_id=rubric_id, + score=overall_score, + # There is no real way for us generate a rationale here, so we + # make is clear to the consumer of the result. + rationale=( + "This is an aggregated score derived from individual entries." + " Please refer to individual entries in each invocation for" + " actual rationale from the model." + ), + ) + ) + + # Use unaggregate rubric score to calculate overall score. + aggregated_overall_score = get_average_rubric_score( + unaggregated_rubric_scores + ) + return EvaluationResult( + overall_score=aggregated_overall_score, + overall_eval_status=get_eval_status( + aggregated_overall_score, threshold + ), + per_invocation_results=per_invocation_results, + overall_rubric_scores=aggregated_rubric_scores, + ) + + +def _normalize_text(text: str) -> str: + """Returns a normalized version of the passed in text.""" + if not isinstance(text, str): + return "" + return text.lower().strip() + + +@experimental +class RubricBasedEvaluator(LlmAsJudge): + """A base class for rubric based evaluators.""" + + def __init__( + self, + eval_metric: EvalMetric, + criterion_type: type[BaseCriterion], + auto_rater_response_parser: AutoRaterResponseParser = ( + DefaultAutoRaterResponseParser() + ), + per_invocation_results_aggregator: PerInvocationResultsAggregator = ( + MajorityVotePerInvocationResultsAggregator() + ), + invocation_results_summarizer: InvocationResultsSummarizer = ( + MeanInvocationResultsSummarizer() + ), + ): + """Initializes the RubricBasedEvaluator. + + Args: + eval_metric: The evaluation metric configuration. + criterion_type: The type of the criterion used for this evaluator. + auto_rater_response_parser: An object that parses the auto-rater's + response text and extracts rubric scores. + per_invocation_results_aggregator: An object that aggregates multiple + samples for a single invocation into a single result. This is useful in + cases where the auto-rater is an LLM and multiple samples are generated + to account for the unreliability of the LLM. + invocation_results_summarizer: An object that summarizes the results of + all invocations in an eval case into a single result. + """ + super().__init__( + eval_metric, + criterion_type=criterion_type, + ) + self._auto_rater_prompt_template = "" + self._auto_rater_response_parser = auto_rater_response_parser + self._per_invocation_results_aggregator = per_invocation_results_aggregator + self._invocation_results_summarizer = invocation_results_summarizer + + assert self._criterion.rubrics, "Rubrics are required." + + self._rubrics: list[Rubric] = self._criterion.rubrics + + self._normalized_rubric_to_id_map = { + _normalize_text(r.rubric_content.text_property): r.rubric_id + for r in self._rubrics + } + + @override + def convert_auto_rater_response_to_score( + self, auto_rater_response: LlmResponse + ) -> AutoRaterScore: + """Returns an AutoRaterScore generated from AutoRater's response.""" + response_text = get_text_from_content(auto_rater_response.content) + rubric_responses = self._auto_rater_response_parser.parse(response_text) + rubric_scores = [] + + for rubric_response in rubric_responses: + normalized_rubric = _normalize_text(rubric_response.property_text) + rubric_id = self._normalized_rubric_to_id_map.get(normalized_rubric, None) + if rubric_id: + rubric_scores.append( + RubricScore( + rubric_id=rubric_id, + rationale=rubric_response.rationale, + score=rubric_response.score, + ) + ) + else: + logger.warning( + f"Rubric {rubric_response.property_text} not found in the rubrics" + " provided to the metric." + ) + + aggregated_score = get_average_rubric_score(rubric_scores) + return AutoRaterScore(score=aggregated_score, rubric_scores=rubric_scores) + + @override + def aggregate_per_invocation_samples( + self, + per_invocation_samples: list[PerInvocationResult], + ) -> PerInvocationResult: + """Returns a combined result by aggregating multiple samples for the same invocation. + + AutoRaters that are backed by an LLM are known to have certain degree of + unreliabilty to their responses. In order to counter that we sample the + autorater more than once for a single invocation. + + The aggregator helps convert those multiple samples into a single result. + """ + return self._per_invocation_results_aggregator.aggregate( + per_invocation_samples, self._eval_metric.threshold + ) + + @override + def aggregate_invocation_results( + self, per_invocation_results: list[PerInvocationResult] + ) -> EvaluationResult: + """Summarizes per invocation evaluation results into a single score.""" + return self._invocation_results_summarizer.summarize( + per_invocation_results, self._eval_metric.threshold + ) diff --git a/src/google/adk/evaluation/rubric_based_final_response_quality_v1.py b/src/google/adk/evaluation/rubric_based_final_response_quality_v1.py new file mode 100644 index 0000000000..1b4cb68197 --- /dev/null +++ b/src/google/adk/evaluation/rubric_based_final_response_quality_v1.py @@ -0,0 +1,323 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import logging +from typing import ClassVar +from typing import Optional + +from typing_extensions import override + +from ..utils.feature_decorator import experimental +from .eval_case import Invocation +from .eval_case import InvocationEvents +from .eval_metrics import EvalMetric +from .eval_metrics import Interval +from .eval_metrics import MetricInfo +from .eval_metrics import MetricValueInfo +from .eval_metrics import PrebuiltMetrics +from .eval_metrics import RubricsBasedCriterion +from .llm_as_judge_utils import get_text_from_content +from .llm_as_judge_utils import get_tool_calls_and_responses_as_json_str +from .llm_as_judge_utils import get_tool_declarations_as_json_str +from .rubric_based_evaluator import RubricBasedEvaluator + +logger = logging.getLogger("google_adk." + __name__) + +_RUBRIC_BASED_FINAL_RESPONSE_QUALITY_V1_PROMPT = """ +SPECIAL INSTRUCTION: think silently. Silent thinking token budget: 10240 tokens. + +# Mission +Your mission is to evaluate the final answer quality of responses generated by an AI agent. You will be presented with a user prompt (), the agent's response () to that user prompt, and a set of properties () that you must use to objectively assess the validity of the agent's response. +Only respond to the properties provided. Do not make up new properties. + +# Rubric +"yes": The model's response fulfilled the property, OR the property's condition was not applicable to the response. +"no": The model's response met the conditions for the property to be applicable, but failed to fulfill it, or the property applies to a claim in the model's response that cannot be unambiguously verified using trusted evidence. + +# Key Evaluation Principles +Your evaluation must follow a two-part process: first, collect trusted evidence from the agent's work, and second, judge the final answer against it. +1. **Establish Trusted Evidence from Tool Calls**: You must first examine the agent's tool calls to determine if they are procedurally sound, meaning that the agent used the appropriate tools with logical parameters to address the user's prompt. + * Your ONLY sources of truth are the and the direct output ('tool_response') from PROCEDURALLY SOUND tool calls found in the . Examples of procedural flaws include: + * The agent failed to call a tool that will enable it to answer the user's prompt despite having all the necessary parameters to do so. + * The agent called the tool with incorrect or missing parameters. + * The agent called a tool that does not exist, or called a tool with a parameter that does not exist. + * The agent's sequence of tool calls contains a logical error. + * The following kinds of information ABSOLUTELY CANNOT BE USED to derive trusted evidence: + * The agent's final answer. + * The agent's reasoning, summaries, or any interpretations of the tool responses by the agent. + * Any tool call that is flawed (e.g., queries the wrong file, contains incorrect logic). + * You may not have access to the same tools as the agent, so do not attempt to call any tools yourself. +2. **Judge Consistency with the Evidence**: Once you have collected trusted evidence from tool calls, you must determine whether the agent's is consistent with it. A claim in the final answer is only considered correct if it can be unambiguously verified using this evidence. + * If the necessary evidence is missing because the agent failed to make a correct and sound tool call, the final answer must be judged as failing the property. + +While judging the final answer against the evidence, be flexible about how it is conveyed. Accept answers that are semantically equivalent (e.g., different phrasing) as long as they still fulfill the property. For numbers, accept answers that are numerically equivalent, allowing for minor differences in rounding or precision, as long as they do not alter a final conclusion (e.g., the outcome of a statistical test). + +For each property follow these internal steps: +1. Understand the property and the key evaluation principles. +2. Outline your plan to evaluate the property by applying the Key Evaluation Principles. +3. Collect and list the trusted evidence you will use to evaluate the property. Note any procedural flaws in the tool calls. +4. Judge the consistency of the final answer with the property and the trusted evidence. +5. Review your analysis from the previous steps to form a final judgment and determine the verdict. +6. Output the final verdict in the required output format. + +# Output Format (repeat this format for every property, starting with a new line): +Property: [Repeat the property, word for word, without making any changes. Keep everything including punctuation and capitalization as-is.] +Evidence: [List all trusted evidence from tool calls or the user prompt that is relevant to the property (referencing the Step Index). Alternatively, if either no trusted evidence is required, or no trusted evidence exists (e.g., flawed process, missing tool call, tool error), explain why.] +Rationale: [Explain your reasoning, detailing how the evidence (or lack thereof) supports or contradicts the final answer, or why the property is not applicable.] +Verdict: [yes|no] + +REMEMBER: Your answer will help improve the AI agent. It is important to determine the fulfillment of the properties correctly. Even answering "no" will improve the agent! Respond in pure text, not json. + +# Example +## Input + + + You are an AI agent who is an expert in HR data analysis. + If a company has fewer than 100 employees, then the final answer should alert the user that there are fewer than 100 employees. + If you have sufficient information and tools to respond to the user's question, then do not ask for further clarification. + + + {{ + 'name': 'load_hr_data_from_file', + 'description': 'Reads a data file from the company's HR database into a Pandas DataFrame.' + 'parameters': [ + {{ + 'type': 'string', + 'name': 'file_name', + 'description': 'The name of the data file.' + }}, + ], + 'required': ['file_name'] + }}, + {{ + 'name': 'get_manager', + 'description': 'Returns the manager of a given employee.', + 'parameters': [ + {{ + 'type': 'string', + 'name': 'employee_name', + 'description': 'The name of the employee.' + }}, + ], + 'required': ['employee_name'] + }} + + + Using the employees.csv file, determine: + 1. the total number of employees + 2. the name of Alice Smith's manager + 3. the name of the employee with the highest salary, and their gender + 4. the average salary for the "Marketing" department + Please format your final answer as a numbered list. + + + + + [ + {{ + "step_index": 0, + "tool_call": "df = load_hr_data_from_file('employees.csv')\nprint(len(df))", + "tool_response": "110", + }}, + {{ + "step_index": 1, + "tool_call": "print(df[df['Department'] == 'Engineering']['Salary'].mean())", + "tool_response": "155000", + }}, + {{ + "step_index": 2, + "tool_call="print(df.loc[df['Salary'].idxmax(), 'Name'])", + "tool_response": "John Smith", + }}, + ] + + + 1. The total number of employees is 110. + 2. Please provide Alice Smith's employee ID so that I can find her manager. + 3. The employee with the highest salary is John Doe, and this employee's gender is male. + 4. The average salary for the Marketing department is 155000. + + + + +* The final answer correctly identifies the total number of employees. +* The final answer correctly identifies the name of Alice Smith's manager, or correctly states that it cannot be determined and why. +* The final answer correctly states the average salary for the Marketing department. +* The final answer correctly identifies the employee with the highest salary. +* The final answer correctly identifies the gender of the employee with the highest salary, or correctly states that it cannot be determined and why. +* The final answer is formatted as a numbered list. +* If the company has fewer than 100 employees, then the final answer states that it has fewer than 100 employees. + + +## Output +Property: The final answer correctly identifies the total number of employees. +Evidence: The trusted evidence is "110 employees". The tool call in Step 0 is procedurally sound and provides the total number of employees (110) by calling the load_hr_data_from_file tool with the correct file name. +Rationale: The final answer's claim ("110 employees") is fully consistent with the trusted evidence. +Verdict: yes + +Property: The final answer correctly identifies the name of Alice Smith's manager, or correctly states that it cannot be determined and why. +Evidence: No trusted evidence exists. The agent did not perform a tool call to determine the manager of Alice Smith, despite having the necessary information (the employee name) and access to the necessary tools (get_manager) to do so. +Rationale: The agent incorrectly stated that the final answer cannot be determined, despite having the necessary information (the employee name) and tools (get_manager) to determine it. +Verdict: no + +Property: The final answer correctly states the average salary for the Marketing department. +Evidence: No trusted evidence exists for the Marketing department's average salary. The tool call in Step 1 is procedurally flawed; the agent searched for "Engineering" instead of "Marketing". +Rationale: There is no trusted evidence for the Marketing department's average salary. +Verdict: no + +Property: The final answer correctly identifies the employee with the highest salary. +Evidence: The trusted evidence is "John Smith". The tool call in Step 2 produces trusted evidence for the employee with the highest salary by calling the load_hr_data_from_file tool with the correct file name and then using the idxmax() method to find the employee with the highest salary. +Rationale: The final answer's claim ("John Doe") is inconsistent with the trusted evidence ("John Smith"). +Verdict: no + +Property: The final answer correctly identifies the gender of the employee with the highest salary, or correctly states that it cannot be determined and why. +Evidence: No trusted evidence exists. The agent did not perform a tool call to determine the gender of the employee with the highest salary. +Rationale: There is no trusted evidence to confirm the gender of the employee with the highest salary that the final answer states (male). Even if the gender is coincidentally actually male, the claim in the final answer cannot be unambiguously verified using the evidence. +Verdict: no + +Property: If the company has fewer than 100 employees, then the final answer should state that it has fewer than 100 employees. +Evidence: The trusted evidence is "110 employees". The tool call in Step 0 correctly counts the total number of employees as 110 by calling the load_hr_data_from_file tool with the correct file name. +Rationale: The total number of employees is 110, so the condition for this property (fewer than 100 employees) was not met. Therefore, the property is not applicable to this response. +Verdict: yes + +Property: The final answer is formatted as a numbered list. +Evidence: N/A. Trusted evidence from tool calls or the user prompt is not required in order to determine the format of the final answer. +Rationale: The final answer is formatted as a numbered list from 1 to 4, e.g. "1. The total number of employees is 110\n2...". +Verdict: yes + +# Your Turn +## Input + + + {developer_instructions} + + + + {tool_declarations} + + + + {user_input} + + + + + + {response_steps} + + + {final_response} + + + + +{rubrics} + + +## Output +""" + + +@experimental +class RubricBasedFinalResponseQualityV1Evaluator(RubricBasedEvaluator): + """An Evaluator for rubric based assessment of the agent's final response using a LLM. + + The evaluator uses a set of rubrics to assess the quality of the agent's + final response. + + Example: For a weather agent that responds to weather related queries of the + user, one could specify following rubrics: + + Rubric 1: Agent's response is direct and to the point. + Rubric 2: Agent's response accurately inferred user's underlying goal from + ambiguous queries (e.g. "is it a beach weather?" would mean sun, warmth and + low wind) + + For each rubric, this evaluator will generate a confidence score between 0 + and 1, where 0 means that agent's response did not satisfy the rubric at all + and 1 means complete adherence. Value closer to 1 are desirable. + + A combined score using individual rubric confidences will also be generated. + Like individual rubric confidence scores, the range for this value will be + between 0 and 1, and it will have the same interpretation. + """ + + criterion_type: ClassVar[type[RubricsBasedCriterion]] = RubricsBasedCriterion + + def __init__(self, eval_metric: EvalMetric): + super().__init__( + eval_metric, + criterion_type=RubricBasedFinalResponseQualityV1Evaluator.criterion_type, + ) + self._auto_rater_prompt_template = ( + _RUBRIC_BASED_FINAL_RESPONSE_QUALITY_V1_PROMPT + ) + + @staticmethod + def get_metric_info() -> MetricInfo: + return MetricInfo( + metric_name=PrebuiltMetrics.RUBRIC_BASED_FINAL_RESPONSE_QUALITY_V1.value, + description=( + "This metric assess if the agent's final response against a set of" + " rubrics using LLM as a judge. Value range for this metric is" + " [0,1], with values closer to 1 more desirable." + ), + metric_value_info=MetricValueInfo( + interval=Interval(min_value=0.0, max_value=1.0) + ), + ) + + @override + def format_auto_rater_prompt( + self, actual_invocation: Invocation, _: Optional[Invocation] + ) -> str: + """Returns the autorater prompt.""" + + user_input = get_text_from_content(actual_invocation.user_content) + final_response = get_text_from_content(actual_invocation.final_response) + rubrics = "\n* ".join( + [r.rubric_content.text_property for r in self._rubrics] + ) + + developer_instructions = "" + tool_declarations = "Agent has no tools." + response_steps = get_tool_calls_and_responses_as_json_str( + actual_invocation.intermediate_data + ) + + app_details = actual_invocation.app_details + if app_details: + if ( + isinstance(actual_invocation.intermediate_data, InvocationEvents) + and actual_invocation.intermediate_data.invocation_events + ): + developer_instructions = app_details.get_developer_instructions( + agent_name=actual_invocation.intermediate_data.invocation_events[ + 0 + ].author + ) + tool_declarations = get_tool_declarations_as_json_str(app_details) + + auto_rater_prompt = self._auto_rater_prompt_template.format( + developer_instructions=developer_instructions, + tool_declarations=tool_declarations, + user_input=user_input, + response_steps=response_steps, + final_response=final_response, + rubrics=rubrics, + ) + + return auto_rater_prompt diff --git a/src/google/adk/evaluation/rubric_based_tool_use_quality_v1.py b/src/google/adk/evaluation/rubric_based_tool_use_quality_v1.py new file mode 100644 index 0000000000..fe1f1e6e6b --- /dev/null +++ b/src/google/adk/evaluation/rubric_based_tool_use_quality_v1.py @@ -0,0 +1,207 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import logging +from typing import ClassVar +from typing import Optional + +from typing_extensions import override + +from ..utils.feature_decorator import experimental +from .eval_case import Invocation +from .eval_metrics import EvalMetric +from .eval_metrics import Interval +from .eval_metrics import MetricInfo +from .eval_metrics import MetricValueInfo +from .eval_metrics import PrebuiltMetrics +from .eval_metrics import RubricsBasedCriterion +from .llm_as_judge_utils import get_text_from_content +from .llm_as_judge_utils import get_tool_calls_and_responses_as_json_str +from .llm_as_judge_utils import get_tool_declarations_as_json_str +from .rubric_based_evaluator import RubricBasedEvaluator + +logger = logging.getLogger("google_adk." + __name__) + +_RUBRIC_BASED_TOOL_USE_QUALITY_V1_PROMPT = """# Mission +- Your mission is to evaluate the quality of responses generated by an AI agent. You will be presented with a user prompt (), the agent's response () to that user prompt, and a set of properties () that you must use to objectively assess the validity of the agent's response. +- Only use the properties provided. Do not make up new properties. +- IMPORTANT: Assess all of the provided properties. Do not drop any of the properties from your response. +- The primary focus of this rating task is to check correctness of the agent's responses w.r.t. each of the properties. + +# Rubric +"yes": The agent's response fulfilled the property or the property is not applicable to the response. +"no": The agent's response did not fulfill the property. + +# For each property started with a new line, follow these steps: +STEP 1: Repeat the property, word for word, without making any changes. Keep everything including punctuation and capitalization as-is. +STEP 2: Determine the steps needed to **exactly**, **precisely** and **completely** determine whether the agent's response fulfilled the property. +STEP 3: Follow the steps outlined in STEP 2, thinking out loud. +STEP 4: Review the thoughts and the original property. +STEP 5: Output the final verdict. +Property: [[Repeat the property in STEP 1 again.]] +Rationale: [[Explain your reasoning for the verdict.]] +Verdict: [[yes|no]] + +# Output format (repeat this format for every property started with a new line): +STEP 1: ... +STEP 2: ... +STEP 3: ... +STEP 4: ... +STEP 5: ... +Property: ... +Rationale: ... +Verdict: ... + + +# Example output 1 + +STEP 1: Does the agent run function call 'default_api.grammar_check'? +STEP 2: I need to check if the agent runs the function call with exact function name as 'default_api.grammar_check'. +STEP 3: The response includes a function call 'default_api.grammar_check'. +STEP 4: The function call format and the function name are correct. +STEP 5: yes +Property: Does the agent run function call 'default_api.grammar_check'? +Rationale: The agent's response contains the function call 'default_api.grammar_check' within a proper code block and with the correct function name. +Verdict: yes + +STEP 1: Does the agent provide function call 'default_api.grammar_check' with input parameter 'sentence' that is valid compared to the reference 'sentence'= 'the dog walks on the a park' and based on the following guideline? Guideline for 'sentence': 'The wording can differ. The agent response is valid if it conveys similar core content as the reference response. Less efficient and minor inaccurate phrasing is acceptable. The default value is None, if the reference response includes this parameter with value equal to the default value but it is not provided in the agent response, then evaluate it as valid.' +STEP 2: I need to check if the function call 'default_api.grammar_check' includes the parameter 'sentence' and whether the value assigned to 'sentence' is valid according to the provided guideline. The reference value is 'the dog walks on the a park'. According to the guideline, the wording can differ as long as the core content is similar. +STEP 3: The agent's response includes the function call `default_api.grammar_check(sentence="the dog walks on the a park")`. The parameter 'sentence' is present, and the value assigned to it is "the dog walks on the a park", which is identical to the reference value. +STEP 4: The parameter 'sentence' is present and its value is exactly the same as the reference value. +STEP 5: yes +Property: Does the agent provide function call 'default_api.grammar_check' with input parameter 'sentence' that is valid compared to the reference 'sentence'= 'the dog walks on the a park' and based on the following guideline? Guideline for 'sentence': 'The wording can differ. The agent response is valid if it conveys similar core content as the reference response. Less efficient and minor inaccurate phrasing is acceptable. The default value is None, if the reference response includes this parameter with value equal to the default value but it is not provided in the agent response, then evaluate it as valid.' +Rationale: The agent's response includes the 'sentence' parameter in the function call 'default_api.grammar_check', and the value assigned to it is exactly the same as the reference value, thus satisfying the given guideline. +Verdict: yes + +# Example output 2 + +STEP 1: Does the agent run function call 'default_api.search_via_perplexity'? +STEP 2: I need to check if the agent runs the function call with exact function name as 'default_api.search_via_perplexity'. +STEP 3: The response includes a function call `default_api.get_web_search_results`, which does not match 'default_api.search_via_perplexity'. +STEP 4: The function name does not match. +STEP 5: no +Property: Does the agent run function call 'default_api.search_via_perplexity'? +Rationale: The agent called 'default_api.get_web_search_results', not 'default_api.search_via_perplexity'. +Verdict: no + +STEP 1: Does the agent provide function call 'default_api.search_via_perplexity' with input parameter 'keyword' that is valid compared to the reference 'keyword'= 'GPT-4o vs GPT-3.5 cost comparison' and based on the following guideline? Guideline for 'keyword': 'The wording can differ. The agent response is valid if it conveys similar core content as the reference response. Less efficient and minor inaccurate phrasing is acceptable.' +STEP 2: Since the previous property is no, this property is not applicable. +STEP 3: N/A +STEP 4: N/A +STEP 5: yes +Property: Does the agent provide function call 'default_api.search_via_perplexity' with input parameter 'keyword' that is valid compared to the reference 'keyword'= 'GPT-4o vs GPT-3.5 cost comparison' and based on the following guideline? Guideline for 'keyword': 'The wording can differ. The agent response is valid if it conveys similar core content as the reference response. Less efficient and minor inaccurate phrasing is acceptable.' +Rationale: The agent did not use the function call 'default_api.search_via_perplexity'. +Verdict: yes + + +# Available tools, user input, response and properties: + +{tool_declarations} + + + +{user_input} + + + +{tool_usage} + + + +{rubrics} + + +REMEMBER: Your answer will help improve the AI agent. It is important to determine the fulfillment of the properties correctly. Even answering "no" will improve the agent! Respond in pure text, not json. +IMPORTANT: Make sure for each of the property listed, follow the example steps and output "Property: ..." on a new line and "Verdict: ..." on another new line. +""" + + +@experimental +class RubricBasedToolUseV1Evaluator(RubricBasedEvaluator): + """An Evaluator for rubric based assessment of the agent's usage of Tools. + + Example: Lets take an example of a Weather Agent that has access to two tools: + 1: GeoCoding Tool: Coverts a city name, address or zip code into geographic + cordinates. + 2: GetWeather Tool: Gets weather for the next 10 days for the given geographic + cordinates. + + For this agent, one can create following Rubrics that could focus on tool use + + Rubric 1: A call is made to GeoCoding Tool. + Rubric 2: A call is made to GetWeather Tool. + Rubric 3: The call to GetWeather Tool happens after the GeoCoding Tool. + Rubric 4: The input to GeoCoding Tool can be mapped back to user prompt. + Rubric 5: The input to GetWeather Tool comes from the output of GeoCoding + Tool.) + + For each rubric, this evaluator will generate a confidence score between 0 + and 1, where 0 means that agent's response did not satisfy the rubric at all + and 1 means complete adherence. Value closer to 1 are desirable. + + A combined score using individual rubric confidences will also be generated. + Like individual rubric confidence scores, the range for this value will be + between 0 and 1, and it will have the same interpretation. + """ + + criterion_type: ClassVar[type[RubricsBasedCriterion]] = RubricsBasedCriterion + + def __init__(self, eval_metric: EvalMetric): + super().__init__( + eval_metric, + criterion_type=RubricBasedToolUseV1Evaluator.criterion_type, + ) + self._auto_rater_prompt_template = _RUBRIC_BASED_TOOL_USE_QUALITY_V1_PROMPT + + @staticmethod + def get_metric_info() -> MetricInfo: + return MetricInfo( + metric_name=PrebuiltMetrics.RUBRIC_BASED_TOOL_USE_QUALITY_V1.value, + description=( + "This metric assess if the agent's usage of tools against a set of" + " rubrics using LLM as a judge. Value range for this metric is" + " [0,1], with values closer to 1 more desirable." + ), + metric_value_info=MetricValueInfo( + interval=Interval(min_value=0.0, max_value=1.0) + ), + ) + + @override + def format_auto_rater_prompt( + self, actual_invocation: Invocation, _: Optional[Invocation] + ) -> str: + """Returns the autorater prompt.""" + + user_input = get_text_from_content(actual_invocation.user_content) + tool_usage = get_tool_calls_and_responses_as_json_str( + actual_invocation.intermediate_data + ) + rubrics = "\n* ".join( + [r.rubric_content.text_property for r in self._rubrics] + ) + + app_details = actual_invocation.app_details + tool_declarations = "Agent has no tools." + if app_details: + tool_declarations = get_tool_declarations_as_json_str(app_details) + + return self._auto_rater_prompt_template.format( + tool_declarations=tool_declarations, + user_input=user_input, + tool_usage=tool_usage, + rubrics=rubrics, + ) diff --git a/src/google/adk/evaluation/safety_evaluator.py b/src/google/adk/evaluation/safety_evaluator.py index f24931a254..614a66068f 100644 --- a/src/google/adk/evaluation/safety_evaluator.py +++ b/src/google/adk/evaluation/safety_evaluator.py @@ -14,9 +14,11 @@ from __future__ import annotations +from typing import Optional + from typing_extensions import override -from vertexai import types as vertexai_types +from ..dependencies.vertexai import vertexai from .eval_case import Invocation from .eval_metrics import EvalMetric from .eval_metrics import Interval @@ -27,6 +29,8 @@ from .evaluator import Evaluator from .vertex_ai_eval_facade import _VertexAiEvalFacade +vertexai_types = vertexai.types + class SafetyEvaluatorV1(Evaluator): """Evaluates safety (harmlessness) of an Agent's Response. @@ -64,7 +68,7 @@ def get_metric_info() -> MetricInfo: def evaluate_invocations( self, actual_invocations: list[Invocation], - expected_invocations: list[Invocation], + expected_invocations: Optional[list[Invocation]], ) -> EvaluationResult: return _VertexAiEvalFacade( threshold=self._eval_metric.threshold, diff --git a/src/google/adk/evaluation/static_user_simulator.py b/src/google/adk/evaluation/static_user_simulator.py new file mode 100644 index 0000000000..4c5e2cb54d --- /dev/null +++ b/src/google/adk/evaluation/static_user_simulator.py @@ -0,0 +1,79 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import logging +from typing import Optional + +from typing_extensions import override + +from ..events.event import Event +from ..utils.feature_decorator import experimental +from .eval_case import StaticConversation +from .evaluator import Evaluator +from .user_simulator import BaseUserSimulatorConfig +from .user_simulator import NextUserMessage +from .user_simulator import Status +from .user_simulator import UserSimulator + +logger = logging.getLogger("google_adk." + __name__) + + +@experimental +class StaticUserSimulator(UserSimulator): + """A UserSimulator that returns a static list of user messages.""" + + def __init__(self, *, static_conversation: StaticConversation): + super().__init__( + BaseUserSimulatorConfig(), config_type=BaseUserSimulatorConfig + ) + self.static_conversation = static_conversation + self.invocation_idx = 0 + + @override + async def get_next_user_message( + self, + events: list[Event], + ) -> NextUserMessage: + """Returns the next user message to send to the agent from a static list. + + Args: + events: The unaltered conversation history between the user and the + agent(s) under evaluation. + + Returns: + A NextUserMessage object containing the next user message to send to the + agent, or a status indicating why no message was generated. + """ + # check if we have reached the end of the list of invocations + if self.invocation_idx >= len(self.static_conversation): + return NextUserMessage(status=Status.STOP_SIGNAL_DETECTED) + + # return the next message in the static list + next_user_content = self.static_conversation[ + self.invocation_idx + ].user_content + self.invocation_idx += 1 + return NextUserMessage( + status=Status.SUCCESS, + user_message=next_user_content, + ) + + @override + def get_simulation_evaluator( + self, + ) -> Optional[Evaluator]: + """The StaticUserSimulator does not require an evaluator.""" + return None diff --git a/src/google/adk/evaluation/trajectory_evaluator.py b/src/google/adk/evaluation/trajectory_evaluator.py index 8f7508d447..6c1fff2850 100644 --- a/src/google/adk/evaluation/trajectory_evaluator.py +++ b/src/google/adk/evaluation/trajectory_evaluator.py @@ -14,22 +14,18 @@ from __future__ import annotations -from typing import Any from typing import Optional from google.genai import types as genai_types -import pandas as pd -from tabulate import tabulate -from typing_extensions import deprecated from typing_extensions import override +from .eval_case import get_all_tool_calls from .eval_case import Invocation from .eval_metrics import EvalMetric from .eval_metrics import Interval from .eval_metrics import MetricInfo from .eval_metrics import MetricValueInfo from .eval_metrics import PrebuiltMetrics -from .evaluation_constants import EvalConstants from .evaluator import EvalStatus from .evaluator import EvaluationResult from .evaluator import Evaluator @@ -75,22 +71,20 @@ def get_metric_info() -> MetricInfo: def evaluate_invocations( self, actual_invocations: list[Invocation], - expected_invocations: list[Invocation], + expected_invocations: Optional[list[Invocation]], ) -> EvaluationResult: """Returns EvaluationResult after performing evaluations using actual and expected invocations.""" + if expected_invocations is None: + raise ValueError("expected_invocations is needed by this metric.") + total_tool_use_accuracy = 0.0 num_invocations = 0 per_invocation_results = [] for actual, expected in zip(actual_invocations, expected_invocations): - actual_tool_uses = ( - actual.intermediate_data.tool_uses if actual.intermediate_data else [] - ) - expected_tool_uses = ( - expected.intermediate_data.tool_uses - if expected.intermediate_data - else [] - ) + actual_tool_uses = get_all_tool_calls(actual.intermediate_data) + expected_tool_uses = get_all_tool_calls(expected.intermediate_data) + tool_use_accuracy = ( 1.0 if self._are_tool_calls_equal(actual_tool_uses, expected_tool_uses) @@ -133,170 +127,3 @@ def _are_tool_calls_equal( def _get_eval_status(self, score: float): return EvalStatus.PASSED if score >= self._threshold else EvalStatus.FAILED - - @staticmethod - @deprecated( - "This method has been deprecated and will be removed soon. Please use" - " evaluate_invocations instead." - ) - def evaluate( - eval_dataset: list[list[dict[str, Any]]], - *, - print_detailed_results: bool = False, - ): - r"""Returns the mean tool use accuracy of the eval dataset. - - Tool use accuracy is calculated by comparing the expected and the actual - tool use trajectories. An exact match scores a 1, 0 otherwise. The final - number is an average of these individual scores. - - Value range: [0, 1], where 0 means none of the tool use entries aligned, - and 1 would mean all of them aligned. Higher value is good. - - Args: - eval_dataset: The dataset that will be evaluated. - print_detailed_results: Prints detailed results on the console. This is - usually helpful during debugging. - - A note on eval_dataset: - The dataset should be a list session, where each session is represented - as a list of interaction that need evaluation. Each evaluation is - represented as a dictionary that is expected to have values for the - following keys: - 1) query - 2) response - 3) acutal_tool_use - 4) expected_tool_use - - Here is a sample eval_dataset value with one entry: - - [ - [ - { - "query": "Roll a 16 sided dice for me", - "response": "I rolled a 16 sided die and got 13.\n", - "expected_tool_use": [ - { - "tool_name": "roll_die", - "tool_input": { - "sides": 16 - } - } - ], - "acutal_tool_use": [ - { - "tool_name": "roll_die", - "tool_input": { - "sides": 16 - } - } - ] - } - ] - ] - """ - if not eval_dataset: - raise ValueError("The evaluation dataset is empty.") - - results_df = pd.DataFrame( - columns=[ - "query", - "response", - "actual_tool_use", - "expected_tool_use", - "tool_use_accuracy", - ] - ) - failures = [] - - for conversation in eval_dataset: - for index, row in enumerate(conversation): - new_row, failure = TrajectoryEvaluator._evaluate_row(row) - results_df = pd.concat( - [results_df, pd.DataFrame([new_row])], ignore_index=True - ) - if failure: - failure["turn"] = index + 1 - failures.append(failure) - - TrajectoryEvaluator._report_failures(failures) - - if print_detailed_results: - TrajectoryEvaluator._print_results(results_df) - - return results_df["tool_use_accuracy"].mean() - - @staticmethod - def _evaluate_row(row): - # We don't evaluate the mock tool outputs. - expected = TrajectoryEvaluator._remove_tool_outputs( - row["expected_tool_use"] - ) - actual = row["actual_tool_use"] - tool_use_accuracy = ( - 1.0 if TrajectoryEvaluator.are_tools_equal(actual, expected) else 0.0 - ) - - new_row = { - "query": row["query"], - "response": row["response"], - "actual_tool_use": actual, - "expected_tool_use": expected, - "tool_use_accuracy": tool_use_accuracy, - } - failure = ( - None - if tool_use_accuracy == 1.0 - else {"query": row["query"], "actual": actual, "expected": expected} - ) - return new_row, failure - - @staticmethod - @deprecated( - "are_tools_equal is deprecated and will be removed soon. Please use" - " TrajectoryEvaluator._are_tool_calls_equal instead." - ) - def are_tools_equal(list_a_original, list_b_original): - # Remove other entries that we don't want to evaluate - list_a = [ - {"tool_name": tool["tool_name"], "tool_input": tool["tool_input"]} - for tool in list_a_original - ] - - list_b = [ - {"tool_name": tool["tool_name"], "tool_input": tool["tool_input"]} - for tool in list_b_original - ] - - return list_a == list_b - - @staticmethod - def _remove_tool_outputs(tool_use_list): - """Removes 'mock_tool_output' from each dictionary in the list.""" - result = [] - for tool_use in tool_use_list: - new_tool_use = ( - tool_use.copy() - ) # Create a copy to avoid modifying the original - new_tool_use.pop( - EvalConstants.MOCK_TOOL_OUTPUT, None - ) # Remove 'tool_output' if it exists - result.append(new_tool_use) - return result - - @staticmethod - def _report_failures(failures): - if failures: - print("Failures:") - for failure in failures: - print(f"""{{ - "turn": {failure["turn"]}, - "query": '{failure["query"]}', - "actual": {failure["actual"]}, - "expected_tool_use": {failure["expected"]}, -}} -""") - - @staticmethod - def _print_results(results_df): - print(tabulate(results_df, headers="keys", tablefmt="grid")) diff --git a/src/google/adk/evaluation/user_simulator.py b/src/google/adk/evaluation/user_simulator.py new file mode 100644 index 0000000000..c5ab013d7c --- /dev/null +++ b/src/google/adk/evaluation/user_simulator.py @@ -0,0 +1,116 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from abc import ABC +import enum +from typing import Optional + +from google.genai import types as genai_types +from pydantic import alias_generators +from pydantic import BaseModel +from pydantic import ConfigDict +from pydantic import Field +from pydantic import model_validator +from pydantic import ValidationError + +from ..events.event import Event +from ..utils.feature_decorator import experimental +from .common import EvalBaseModel +from .evaluator import Evaluator + + +class BaseUserSimulatorConfig(BaseModel): + """Base class for configurations pertaining to user simulator.""" + + model_config = ConfigDict( + alias_generator=alias_generators.to_camel, + populate_by_name=True, + extra="allow", + ) + + +class Status(enum.Enum): + """The resulting status of get_next_user_message().""" + + SUCCESS = "success" + TURN_LIMIT_REACHED = "turn_limit_reached" + STOP_SIGNAL_DETECTED = "stop_signal_detected" + NO_MESSAGE_GENERATED = "no_message_generated" + + +class NextUserMessage(EvalBaseModel): + status: Status = Field( + description="""The resulting status of `get_next_user_message()`. + +The caller of `get_next_user_message()` should inspect this field to determine +if the user simulator was able to successfully generate a message or why it was +not able to do so.""" + ) + + user_message: Optional[genai_types.Content] = Field( + description="""The next user message.""", default=None + ) + + @model_validator(mode="after") + def ensure_user_message_iff_success(self) -> NextUserMessage: + if (self.status == Status.SUCCESS) == (self.user_message is None): + raise ValueError( + "A user_message should be provided if and only if the status is" + " SUCCESS" + ) + return self + + +@experimental +class UserSimulator(ABC): + """A user simulator for the purposes of automating interaction with an Agent. + + Typically, you must create one user simulator instance per eval case. + """ + + def __init__( + self, + config: BaseUserSimulatorConfig, + config_type: type[BaseUserSimulatorConfig], + ): + # Unpack the config to a specific type needed by the class implementing this + # interface. + try: + self._config = config_type.model_validate(config.model_dump()) + except ValidationError as e: + raise ValueError(f"Expect config of type `{config_type}`.") from e + + async def get_next_user_message( + self, + events: list[Event], + ) -> NextUserMessage: + """Returns the next user message to send to the agent. + + Args: + events: The unaltered conversation history between the user and the + agent(s) under evaluation. + + Returns: + A NextUserMessage object containing the next user message to send to the + agent, or a status indicating why no message was generated. + """ + raise NotImplementedError() + + def get_simulation_evaluator( + self, + ) -> Optional[Evaluator]: + """Returns an instance of an Evaluator that evaluates if the user simulation was successful or not.""" + raise NotImplementedError() diff --git a/src/google/adk/evaluation/user_simulator_provider.py b/src/google/adk/evaluation/user_simulator_provider.py new file mode 100644 index 0000000000..1aea8c8c92 --- /dev/null +++ b/src/google/adk/evaluation/user_simulator_provider.py @@ -0,0 +1,77 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Optional + +from ..utils.feature_decorator import experimental +from .eval_case import EvalCase +from .llm_backed_user_simulator import LlmBackedUserSimulator +from .static_user_simulator import StaticUserSimulator +from .user_simulator import BaseUserSimulatorConfig +from .user_simulator import UserSimulator + + +@experimental +class UserSimulatorProvider: + """Provides a UserSimulator instance per EvalCase, mixing configuration data + from the EvalConfig with per-EvalCase conversation data.""" + + def __init__( + self, + user_simulator_config: Optional[BaseUserSimulatorConfig] = None, + ): + if user_simulator_config is None: + user_simulator_config = BaseUserSimulatorConfig() + elif not isinstance(user_simulator_config, BaseUserSimulatorConfig): + # assume that the user simulator will fully validate the config it gets. + raise ValueError(f"Expect config of type `{BaseUserSimulatorConfig}`.") + self._user_simulator_config = user_simulator_config + + def provide(self, eval_case: EvalCase) -> UserSimulator: + """Provide an appropriate user simulator based on the type of conversation data in the EvalCase + + Args: + eval_case: An EvalCase containing a `conversation` xor a + `conversation_scenario`. + + Returns: + A StaticUserSimulator or an LlmBackedUserSimulator based on the type of + the conversation data. + + Raises: + ValueError: If no conversation data or multiple types of conversation data + are provided. + """ + if eval_case.conversation is None: + if eval_case.conversation_scenario is None: + raise ValueError( + "Neither static invocations nor conversation scenario provided in" + " EvalCase. Provide exactly one." + ) + + return LlmBackedUserSimulator( + config=self._user_simulator_config, + conversation_scenario=eval_case.conversation_scenario, + ) + + else: # eval_case.conversation is not None + if eval_case.conversation_scenario is not None: + raise ValueError( + "Both static invocations and conversation scenario provided in" + " EvalCase. Provide exactly one." + ) + + return StaticUserSimulator(static_conversation=eval_case.conversation) diff --git a/src/google/adk/evaluation/vertex_ai_eval_facade.py b/src/google/adk/evaluation/vertex_ai_eval_facade.py index 492fe4484b..cd676aee44 100644 --- a/src/google/adk/evaluation/vertex_ai_eval_facade.py +++ b/src/google/adk/evaluation/vertex_ai_eval_facade.py @@ -21,15 +21,17 @@ from google.genai import types as genai_types import pandas as pd from typing_extensions import override -from vertexai import Client as VertexAiClient -from vertexai import types as vertexai_types +from ..dependencies.vertexai import vertexai from .eval_case import Invocation from .evaluator import EvalStatus from .evaluator import EvaluationResult from .evaluator import Evaluator from .evaluator import PerInvocationResult +vertexai_types = vertexai.types +VertexAiClient = vertexai.Client + _ERROR_MESSAGE_SUFFIX = """ You should specify both project id and location. This metric uses Vertex Gen AI Eval SDK, and it requires google cloud credentials. @@ -53,23 +55,38 @@ class _VertexAiEvalFacade(Evaluator): """ def __init__( - self, threshold: float, metric_name: vertexai_types.PrebuiltMetric + self, + threshold: float, + metric_name: vertexai_types.PrebuiltMetric, + expected_invocations_required=False, ): self._threshold = threshold self._metric_name = metric_name + self._expected_invocations_required = expected_invocations_required @override def evaluate_invocations( self, actual_invocations: list[Invocation], - expected_invocations: list[Invocation], + expected_invocations: Optional[list[Invocation]], ) -> EvaluationResult: + if self._expected_invocations_required and expected_invocations is None: + raise ValueError("expected_invocations is needed by this metric.") + + # If expected_invocation are not required by the metric and if they are not + # supplied, we provide an a list of None. + expected_invocations = ( + [None] * len(actual_invocations) + if expected_invocations is None + else expected_invocations + ) + total_score = 0.0 num_invocations = 0 per_invocation_results = [] for actual, expected in zip(actual_invocations, expected_invocations): - prompt = self._get_text(expected.user_content) - reference = self._get_text(expected.final_response) + prompt = self._get_text(actual.user_content) + reference = self._get_text(expected.final_response) if expected else None response = self._get_text(actual.final_response) eval_case = { "prompt": prompt, diff --git a/src/google/adk/events/event.py b/src/google/adk/events/event.py index 8114d31823..cca086430b 100644 --- a/src/google/adk/events/event.py +++ b/src/google/adk/events/event.py @@ -84,7 +84,7 @@ def is_final_response(self) -> bool: NOTE: This method is ONLY for use by Agent Development Kit. - Note that when multiple agents participage in one invocation, there could be + Note that when multiple agents participate in one invocation, there could be one event has `is_final_response()` as True for each participating agent. """ if self.actions.skip_summarization or self.long_running_tool_ids: diff --git a/src/google/adk/events/event_actions.py b/src/google/adk/events/event_actions.py index a46ad16e98..da55c87306 100644 --- a/src/google/adk/events/event_actions.py +++ b/src/google/adk/events/event_actions.py @@ -17,6 +17,7 @@ from typing import Any from typing import Optional +from google.genai.types import Content from pydantic import alias_generators from pydantic import BaseModel from pydantic import ConfigDict @@ -26,6 +27,26 @@ from ..tools.tool_confirmation import ToolConfirmation +class EventCompaction(BaseModel): + """The compaction of the events.""" + + model_config = ConfigDict( + extra='forbid', + alias_generator=alias_generators.to_camel, + populate_by_name=True, + ) + """The pydantic model config.""" + + start_timestamp: float + """The start timestamp of the compacted events, in seconds.""" + + end_timestamp: float + """The end timestamp of the compacted events, in seconds.""" + + compacted_content: Content + """The compacted content of the events.""" + + class EventActions(BaseModel): """Represents the actions attached to an event.""" @@ -72,3 +93,17 @@ class EventActions(BaseModel): ) """A dict of tool confirmation requested by this event, keyed by function call id.""" + + compaction: Optional[EventCompaction] = None + """The compaction of the events.""" + + end_of_agent: Optional[bool] = None + """If true, the current agent has finished its current run. Note that there + can be multiple events with end_of_agent=True for the same agent within one + invocation when there is a loop.""" + + agent_state: Optional[dict[str, Any]] = None + """The agent state at the current event.""" + + rewind_before_invocation_id: Optional[str] = None + """The invocation id to rewind to. This is only set for rewind event.""" diff --git a/src/google/adk/examples/vertex_ai_example_store.py b/src/google/adk/examples/vertex_ai_example_store.py index 718003ae2e..92a6de7e33 100644 --- a/src/google/adk/examples/vertex_ai_example_store.py +++ b/src/google/adk/examples/vertex_ai_example_store.py @@ -12,10 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import annotations + from google.genai import types from typing_extensions import override -from vertexai.preview import example_stores +from ..dependencies.vertexai import example_stores from .base_example_provider import BaseExampleProvider from .example import Example diff --git a/src/google/adk/flows/llm_flows/_code_execution.py b/src/google/adk/flows/llm_flows/_code_execution.py index 5c0a5777f0..bfa84db69d 100644 --- a/src/google/adk/flows/llm_flows/_code_execution.py +++ b/src/google/adk/flows/llm_flows/_code_execution.py @@ -19,6 +19,8 @@ import base64 import copy import dataclasses +import datetime +import logging import os import re from typing import AsyncGenerator @@ -46,6 +48,8 @@ if TYPE_CHECKING: from ...models.llm_request import LlmRequest +logger = logging.getLogger('google_adk.' + __name__) + @dataclasses.dataclass class DataFileUtil: @@ -201,7 +205,7 @@ async def _run_pre_processor( # [Step 1] Extract data files from the session_history and store them in # memory. Meanwhile, mutate the inline data file to text part in session # history from all turns. - all_input_files = _extrac_and_replace_inline_files( + all_input_files = _extract_and_replace_inline_files( code_executor_context, llm_request ) @@ -244,6 +248,7 @@ async def _run_pre_processor( ), ), ) + logger.debug('Executed code:\n```\n%s\n```', code_str) # Update the processing results to code executor context. code_executor_context.update_code_execution_result( invocation_context.invocation_id, @@ -275,6 +280,43 @@ async def _run_post_processor( return if isinstance(code_executor, BuiltInCodeExecutor): + event_actions = EventActions() + + # If an image is generated, save it to the artifact service and add it to + # the event actions. + for part in llm_response.content.parts: + if part.inline_data and part.inline_data.mime_type.startswith('image/'): + if invocation_context.artifact_service is None: + raise ValueError('Artifact service is not initialized.') + + if part.inline_data.display_name: + file_name = part.inline_data.display_name + else: + now = datetime.datetime.now().astimezone() + timestamp = now.strftime('%Y%m%d_%H%M%S') + file_extension = part.inline_data.mime_type.split('/')[-1] + file_name = f'{timestamp}.{file_extension}' + + version = await invocation_context.artifact_service.save_artifact( + app_name=invocation_context.app_name, + user_id=invocation_context.user_id, + session_id=invocation_context.session.id, + filename=file_name, + artifact=types.Part.from_bytes( + data=part.inline_data.data, + mime_type=part.inline_data.mime_type, + ), + ) + event_actions.artifact_delta[file_name] = version + part.inline_data = None + part.text = f'Saved as artifact: {file_name}. ' + + yield Event( + invocation_id=invocation_context.invocation_id, + author=agent.name, + branch=invocation_context.branch, + actions=event_actions, + ) return code_executor_context = CodeExecutorContext(invocation_context.session.state) @@ -314,6 +356,7 @@ async def _run_post_processor( ), ), ) + logger.debug('Executed code:\n```\n%s\n```', code_str) code_executor_context.update_code_execution_result( invocation_context.invocation_id, code_str, @@ -329,7 +372,7 @@ async def _run_post_processor( llm_response.content = None -def _extrac_and_replace_inline_files( +def _extract_and_replace_inline_files( code_executor_context: CodeExecutorContext, llm_request: LlmRequest, ) -> list[File]: @@ -360,7 +403,7 @@ def _extrac_and_replace_inline_files( text='\nAvailable file: `%s`\n' % file_name ) - # Add the inlne data as input file to the code executor context. + # Add the inline data as input file to the code executor context. file = File( name=file_name, content=CodeExecutionUtils.get_encoded_file_content( @@ -427,7 +470,7 @@ async def _post_process_code_execution_result( session_id=invocation_context.session.id, filename=output_file.name, artifact=types.Part.from_bytes( - data=base64.b64decode(output_file.content), + data=get_content_as_bytes(output_file.content), mime_type=output_file.mime_type, ), ) @@ -442,6 +485,25 @@ async def _post_process_code_execution_result( ) +def get_content_as_bytes(output_content: str | bytes) -> bytes: + """Converts output_content to bytes. + + - If output_content is already bytes, it's returned as is. + - If output_content is a string: convert base64-decoded to bytes. + + Args: + output_content: The content, which can be a str or bytes. + + Returns: + The content as a bytes object. + """ + if isinstance(output_content, bytes): + # Already bytes, no conversion needed. + return output_content + + return base64.b64decode(output_content) + + def _get_data_file_preprocessing_code(file: File) -> Optional[str]: """Returns the code to explore the data file.""" diff --git a/src/google/adk/flows/llm_flows/_output_schema_processor.py b/src/google/adk/flows/llm_flows/_output_schema_processor.py index da793f8f9e..2298c04427 100644 --- a/src/google/adk/flows/llm_flows/_output_schema_processor.py +++ b/src/google/adk/flows/llm_flows/_output_schema_processor.py @@ -25,6 +25,7 @@ from ...events.event import Event from ...models.llm_request import LlmRequest from ...tools.set_model_response_tool import SetModelResponseTool +from ...utils.output_schema_utils import can_use_output_schema_with_tools from ._base_llm_processor import BaseLlmRequestProcessor @@ -38,11 +39,14 @@ async def run_async( from ...agents.llm_agent import LlmAgent agent = invocation_context.agent - if not isinstance(agent, LlmAgent): - return - # Check if we need the processor: output_schema + tools - if not agent.output_schema or not agent.tools: + # Check if we need the processor: output_schema + tools + cannot use output + # schema with tools + if ( + not agent.output_schema + or not agent.tools + or can_use_output_schema_with_tools(agent.model) + ): return # Add the set_model_response tool to handle structured output @@ -107,7 +111,7 @@ def get_structured_model_response(function_response_event: Event) -> str | None: for func_response in function_response_event.get_function_responses(): if func_response.name == 'set_model_response': # Convert dict to JSON string - return json.dumps(func_response.response) + return json.dumps(func_response.response, ensure_ascii=False) return None diff --git a/src/google/adk/flows/llm_flows/auto_flow.py b/src/google/adk/flows/llm_flows/auto_flow.py index 32272c9d33..7d6eac8092 100644 --- a/src/google/adk/flows/llm_flows/auto_flow.py +++ b/src/google/adk/flows/llm_flows/auto_flow.py @@ -32,7 +32,7 @@ class AutoFlow(SingleFlow): For peer-agent transfers, it's only enabled when all below conditions are met: - The parent agent is also an LlmAgent. - - `disallow_transfer_to_peer` option of this agent is False (default). + - `disallow_transfer_to_peers` option of this agent is False (default). Depending on the target agent type, the transfer may be automatically reversed. (see Runner._find_agent_to_run method for which agent will remain diff --git a/src/google/adk/flows/llm_flows/base_llm_flow.py b/src/google/adk/flows/llm_flows/base_llm_flow.py index 1c36a1a050..93a432045b 100644 --- a/src/google/adk/flows/llm_flows/base_llm_flow.py +++ b/src/google/adk/flows/llm_flows/base_llm_flow.py @@ -41,10 +41,11 @@ from ...models.base_llm_connection import BaseLlmConnection from ...models.llm_request import LlmRequest from ...models.llm_response import LlmResponse -from ...telemetry import trace_call_llm -from ...telemetry import trace_send_data -from ...telemetry import tracer +from ...telemetry.tracing import trace_call_llm +from ...telemetry.tracing import trace_send_data +from ...telemetry.tracing import tracer from ...tools.base_toolset import BaseToolset +from ...tools.google_search_tool import google_search from ...tools.tool_context import ToolContext from ...utils.context_utils import Aclosing from .audio_cache_manager import AudioCacheManager @@ -250,7 +251,7 @@ async def _send_to_model( invocation_context.transcription_cache = [] if not invocation_context.run_config.input_audio_transcription: # if the live model's input transcription is not enabled, then - # we use our onwn audio transcriber to achieve that. + # we use our own audio transcriber to achieve that. invocation_context.transcription_cache.append( TranscriptionEntry(role='user', data=live_request.blob) ) @@ -299,7 +300,7 @@ def get_author_for_event(llm_response): async for llm_response in agen: if llm_response.live_session_resumption_update: logger.info( - 'Update session resumption hanlde:' + 'Update session resumption handle:' f' {llm_response.live_session_resumption_update}.' ) invocation_context.live_session_resumption_handle = ( @@ -376,6 +377,47 @@ async def _run_one_step_async( if invocation_context.end_invocation: return + # Resume the LLM agent based on the last event from the current branch. + # 1. User content: continue the normal flow + # 2. Function call: call the tool and get the response event. + events = invocation_context._get_events( + current_invocation=True, current_branch=True + ) + + # Long running tool calls should have been handled before this point. + # If there are still long running tool calls, it means the agent is paused + # before, and its branch hasn't been resumed yet. + if ( + invocation_context.is_resumable + and events + and len(events) > 1 + # TODO: here we are using the last 2 events to decide whether to pause + # the invocation. But this is just being optmisitic, we should find a + # way to pause when the long running tool call is followed by more than + # one text responses. + and ( + invocation_context.should_pause_invocation(events[-1]) + or invocation_context.should_pause_invocation(events[-2]) + ) + ): + return + + if ( + invocation_context.is_resumable + and events + and events[-1].get_function_calls() + ): + model_response_event = events[-1] + async with Aclosing( + self._postprocess_handle_function_calls_async( + invocation_context, model_response_event, llm_request + ) + ) as agen: + async for event in agen: + event.id = Event.new_id() + yield event + return + # Calls the LLM. model_response_event = Event( id=Event.new_id(), @@ -411,7 +453,9 @@ async def _preprocess_async( agent = invocation_context.agent if not isinstance(agent, LlmAgent): - return + raise TypeError( + f'Expected agent to be an LlmAgent, but got {type(agent)}' + ) # Runs processors. for processor in self.request_processors: @@ -422,6 +466,11 @@ async def _preprocess_async( yield event # Run processors for tools. + + # We may need to wrap some built-in tools if there are other tools + # because the built-in tools cannot be used together with other tools. + # TODO(b/448114567): Remove once the workaround is no longer needed. + multiple_tools = len(agent.tools) > 1 for tool_union in agent.tools: tool_context = ToolContext(invocation_context) @@ -435,7 +484,10 @@ async def _preprocess_async( # Then process all tools from this tool union tools = await _convert_tool_union_to_tools( - tool_union, ReadonlyContext(invocation_context) + tool_union, + ReadonlyContext(invocation_context), + agent.model, + multiple_tools, ) for tool in tools: await tool.process_llm_request( @@ -529,6 +581,7 @@ async def _postprocess_live( and not llm_response.turn_complete and not llm_response.input_transcription and not llm_response.output_transcription + and not llm_response.usage_metadata ): return @@ -760,8 +813,6 @@ async def _handle_before_model_callback( from ...agents.llm_agent import LlmAgent agent = invocation_context.agent - if not isinstance(agent, LlmAgent): - return callback_context = CallbackContext( invocation_context, event_actions=model_response_event.actions @@ -799,8 +850,26 @@ async def _handle_after_model_callback( from ...agents.llm_agent import LlmAgent agent = invocation_context.agent - if not isinstance(agent, LlmAgent): - return + + # Add grounding metadata to the response if needed. + # TODO(b/448114567): Remove this function once the workaround is no longer needed. + async def _maybe_add_grounding_metadata( + response: Optional[LlmResponse] = None, + ) -> Optional[LlmResponse]: + readonly_context = ReadonlyContext(invocation_context) + tools = await agent.canonical_tools(readonly_context) + if not any(tool.name == 'google_search_agent' for tool in tools): + return response + ground_metadata = invocation_context.session.state.get( + 'temp:_adk_grounding_metadata', None + ) + if not ground_metadata: + return response + + if not response: + response = llm_response + response.grounding_metadata = ground_metadata + return response callback_context = CallbackContext( invocation_context, event_actions=model_response_event.actions @@ -814,12 +883,12 @@ async def _handle_after_model_callback( ) ) if callback_response: - return callback_response + return await _maybe_add_grounding_metadata(callback_response) # If no overrides are provided from the plugins, further run the canonical # callbacks. if not agent.canonical_after_model_callbacks: - return + return await _maybe_add_grounding_metadata() for callback in agent.canonical_after_model_callbacks: callback_response = callback( callback_context=callback_context, llm_response=llm_response @@ -827,7 +896,8 @@ async def _handle_after_model_callback( if inspect.isawaitable(callback_response): callback_response = await callback_response if callback_response: - return callback_response + return await _maybe_add_grounding_metadata(callback_response) + return await _maybe_add_grounding_metadata() def _finalize_model_response_event( self, diff --git a/src/google/adk/flows/llm_flows/basic.py b/src/google/adk/flows/llm_flows/basic.py index f1539052cc..1468a7cab8 100644 --- a/src/google/adk/flows/llm_flows/basic.py +++ b/src/google/adk/flows/llm_flows/basic.py @@ -25,6 +25,7 @@ from ...agents.invocation_context import InvocationContext from ...events.event import Event from ...models.llm_request import LlmRequest +from ...utils.output_schema_utils import can_use_output_schema_with_tools from ._base_llm_processor import BaseLlmRequestProcessor @@ -37,8 +38,6 @@ async def run_async( from ...agents.llm_agent import LlmAgent agent = invocation_context.agent - if not isinstance(agent, LlmAgent): - return llm_request.model = ( agent.canonical_model @@ -54,8 +53,9 @@ async def run_async( # support output_schema and tools together. we have a workaround to support # both output_schema and tools at the same time. see # _output_schema_processor.py for details - if agent.output_schema and not agent.tools: - llm_request.set_output_schema(agent.output_schema) + if agent.output_schema: + if not agent.tools or can_use_output_schema_with_tools(agent.model): + llm_request.set_output_schema(agent.output_schema) llm_request.live_connect_config.response_modalities = ( invocation_context.run_config.response_modalities @@ -81,6 +81,9 @@ async def run_async( llm_request.live_connect_config.session_resumption = ( invocation_context.run_config.session_resumption ) + llm_request.live_connect_config.context_window_compression = ( + invocation_context.run_config.context_window_compression + ) # TODO: handle tool append here, instead of in BaseTool.process_llm_request. diff --git a/src/google/adk/flows/llm_flows/contents.py b/src/google/adk/flows/llm_flows/contents.py index 93d9a332ae..da4cee945f 100644 --- a/src/google/adk/flows/llm_flows/contents.py +++ b/src/google/adk/flows/llm_flows/contents.py @@ -40,8 +40,10 @@ async def run_async( from ...agents.llm_agent import LlmAgent agent = invocation_context.agent - if not isinstance(agent, LlmAgent): - return + + # Preserve all contents that were added by instruction processor + # (since llm_request.contents will be completely reassigned below) + instruction_related_contents = llm_request.contents if agent.include_contents == 'default': # Include full conversation history @@ -58,6 +60,11 @@ async def run_async( agent.name, ) + # Add instruction-related contents to proper position in conversation + await _add_instructions_to_user_content( + invocation_context, llm_request, instruction_related_contents + ) + # Maintain async generator behavior if False: # Ensures it behaves as a generator yield # This is a no-op but maintains generator structure @@ -71,7 +78,7 @@ def _rearrange_events_for_async_function_responses_in_history( ) -> list[Event]: """Rearrange the async function_response events in the history.""" - function_call_id_to_response_events_index: dict[str, list[Event]] = {} + function_call_id_to_response_events_index: dict[str, int] = {} for i, event in enumerate(events): function_responses = event.get_function_responses() if function_responses: @@ -128,7 +135,8 @@ def _rearrange_events_for_latest_function_response( Returns: A list of events with the latest function_response rearranged. """ - if not events: + if len(events) < 2: + # No need to process, since there is no function_call. return events function_responses = events[-1].get_function_responses() @@ -206,7 +214,8 @@ def _contains_empty_content(event: Event) -> bool: """Check if an event should be skipped due to missing or empty content. This can happen to the evnets that only changed session state. - When both content and transcriptions are empty, the event will be considered as empty. + When both content and transcriptions are empty, the event will be considered + as empty. Args: event: The event to check. @@ -214,6 +223,9 @@ def _contains_empty_content(event: Event) -> bool: Returns: True if the event should be skipped, False otherwise. """ + if event.actions and event.actions.compaction: + return False + return ( not event.content or not event.content.role @@ -222,6 +234,64 @@ def _contains_empty_content(event: Event) -> bool: ) and (not event.output_transcription and not event.input_transcription) +def _process_compaction_events(events: list[Event]) -> list[Event]: + """Processes events by applying compaction. + + Identifies compacted ranges and filters out events that are covered by + compaction summaries. + + Args: + events: A list of events to process. + + Returns: + A list of events with compaction applied. + """ + # example of compaction events: + # [event_1(timestamp=1), event_2(timestamp=2), + # compaction_1(event_1, event_2, timestamp=3), event_3(timestamp=4), + # compaction_2(event_2, event_3, timestamp=5), event_4(timestamp=6)] + # for each compaction event, it only covers the events at most between the + # current compaction and the previous compaction. So during copmaction, we + # don't have to go across compaction boundaries. + # Compaction events are always strictly in order based on event timestamp. + events_to_process = [] + last_compaction_start_time = float('inf') + + # Iterate in reverse to easily handle overlapping compactions. + for event in reversed(events): + if event.actions and event.actions.compaction: + compaction = event.actions.compaction + if ( + compaction.start_timestamp is not None + and compaction.end_timestamp is not None + ): + # Create a new event for the compacted summary. + new_event = Event( + timestamp=compaction.end_timestamp, + author='model', + content=compaction.compacted_content, + branch=event.branch, + invocation_id=event.invocation_id, + actions=event.actions, + ) + # Prepend to maintain chronological order in the final list. + events_to_process.insert(0, new_event) + # Update the boundary for filtering. Events with timestamps greater than + # or equal to this start time have been compacted. + last_compaction_start_time = min( + last_compaction_start_time, compaction.start_timestamp + ) + elif event.timestamp < last_compaction_start_time: + # This event is not a compaction and is before the current compaction + # range. Prepend to maintain chronological order. + events_to_process.insert(0, event) + else: + # skip the event + pass + + return events_to_process + + def _get_contents( current_branch: Optional[str], events: list[Event], agent_name: str = '' ) -> list[types.Content]: @@ -240,10 +310,30 @@ def _get_contents( accumulated_input_transcription = '' accumulated_output_transcription = '' + # Filter out events that are annulled by a rewind. + # By iterating backward, when a rewind event is found, we skip all events + # from that point back to the `rewind_before_invocation_id`, thus removing + # them from the history used for the LLM request. + rewind_filtered_events = [] + i = len(events) - 1 + while i >= 0: + event = events[i] + if event.actions and event.actions.rewind_before_invocation_id: + rewind_invocation_id = event.actions.rewind_before_invocation_id + for j in range(0, i, 1): + if events[j].invocation_id == rewind_invocation_id: + i = j + break + else: + rewind_filtered_events.append(event) + i -= 1 + rewind_filtered_events.reverse() + # Parse the events, leaving the contents and the function calls and # responses from the current agent. raw_filtered_events = [] - for event in events: + has_compaction_events = False + for event in rewind_filtered_events: if _contains_empty_content(event): continue if not _is_event_belongs_to_branch(current_branch, event): @@ -256,20 +346,27 @@ def _get_contents( # Skip request confirmation events. continue + if event.actions and event.actions.compaction: + has_compaction_events = True raw_filtered_events.append(event) + if has_compaction_events: + events_to_process = _process_compaction_events(raw_filtered_events) + else: + events_to_process = raw_filtered_events + filtered_events = [] # aggregate transcription events - for i in range(len(raw_filtered_events)): - event = raw_filtered_events[i] + for i in range(len(events_to_process)): + event = events_to_process[i] if not event.content: # Convert transcription into normal event if event.input_transcription and event.input_transcription.text: accumulated_input_transcription += event.input_transcription.text if ( - i != len(raw_filtered_events) - 1 - and raw_filtered_events[i + 1].input_transcription - and raw_filtered_events[i + 1].input_transcription.text + i != len(events_to_process) - 1 + and events_to_process[i + 1].input_transcription + and events_to_process[i + 1].input_transcription.text ): continue event = event.model_copy(deep=True) @@ -282,9 +379,9 @@ def _get_contents( elif event.output_transcription and event.output_transcription.text: accumulated_output_transcription += event.output_transcription.text if ( - i != len(raw_filtered_events) - 1 - and raw_filtered_events[i + 1].output_transcription - and raw_filtered_events[i + 1].output_transcription.text + i != len(events_to_process) - 1 + and events_to_process[i + 1].output_transcription + and events_to_process[i + 1].output_transcription.text ): continue event = event.model_copy(deep=True) @@ -313,8 +410,9 @@ def _get_contents( contents = [] for event in result_events: content = copy.deepcopy(event.content) - remove_client_function_call_id(content) - contents.append(content) + if content: + remove_client_function_call_id(content) + contents.append(content) return contents @@ -343,6 +441,8 @@ def _get_current_turn_contents( # Find the latest event that starts the current turn and process from there for i in range(len(events) - 1, -1, -1): event = events[i] + if not event.content: + continue if event.author == 'user' or _is_other_agent_reply(agent_name, event): return _get_contents(current_branch, events[i:], agent_name) @@ -494,7 +594,12 @@ def _is_event_belongs_to_branch( """ if not invocation_branch or not event.branch: return True - return invocation_branch.startswith(event.branch) + # We use dot to delimit branch nodes. To avoid simple prefix match + # (e.g. agent_0 unexpectedly matching agent_00), require either perfect branch + # match, or match prefix with an additional explicit '.' + return invocation_branch == event.branch or invocation_branch.startswith( + f'{event.branch}.' + ) def _is_function_call_event(event: Event, function_name: str) -> bool: @@ -539,12 +644,13 @@ def _is_live_model_audio_event(event: Event) -> bool: Part( inline_data=Blob( data=b'\x01\x00\x00...', - mime_type='audio/pcm' + mime_type='audio/pcm;rate=24000' ) ), ], role='model' - ) grounding_metadata=None partial=None turn_complete=None finish_reason=None error_code=None error_message=None ... + ) grounding_metadata=None partial=None turn_complete=None finish_reason=None + error_code=None error_message=None ... """ if not event.content: return False @@ -552,8 +658,69 @@ def _is_live_model_audio_event(event: Event) -> bool: return False # If it's audio data, then one event only has one part of audio. for part in event.content.parts: - if part.inline_data and part.inline_data.mime_type == 'audio/pcm': + if ( + part.inline_data + and part.inline_data.mime_type + and part.inline_data.mime_type.startswith('audio/') + ): return True - if part.file_data and part.file_data.mime_type == 'audio/pcm': + if ( + part.file_data + and part.file_data.mime_type + and part.file_data.mime_type.startswith('audio/') + ): return True return False + + +def _content_contains_function_response(content: types.Content) -> bool: + """Checks whether the content includes any function response parts.""" + if not content.parts: + return False + for part in content.parts: + if part.function_response: + return True + return False + + +async def _add_instructions_to_user_content( + invocation_context: InvocationContext, + llm_request: LlmRequest, + instruction_contents: list, +) -> None: + """Insert instruction-related contents at proper position in conversation. + + This function inserts instruction-related contents (passed as parameter) at + the + proper position in the conversation flow, specifically before the last + continuous + batch of user content to maintain conversation context. + + Args: + invocation_context: The invocation context + llm_request: The LLM request to modify + instruction_contents: List of instruction-related contents to insert + """ + if not instruction_contents: + return + + # Find the insertion point: before the last continuous batch of user content + # Walk backwards to find the first non-user content, then insert after it + insert_index = len(llm_request.contents) + + if llm_request.contents: + for i in range(len(llm_request.contents) - 1, -1, -1): + content = llm_request.contents[i] + if content.role != 'user': + insert_index = i + 1 + break + if _content_contains_function_response(content): + insert_index = i + 1 + break + insert_index = i + else: + # No contents remaining, just append at the end + insert_index = 0 + + # Insert all instruction contents at the proper position using efficient slicing + llm_request.contents[insert_index:insert_index] = instruction_contents diff --git a/src/google/adk/flows/llm_flows/context_cache_processor.py b/src/google/adk/flows/llm_flows/context_cache_processor.py new file mode 100644 index 0000000000..e08a73955f --- /dev/null +++ b/src/google/adk/flows/llm_flows/context_cache_processor.py @@ -0,0 +1,161 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Context cache processor for LLM requests.""" + +from __future__ import annotations + +import logging +from typing import AsyncGenerator +from typing import Optional +from typing import TYPE_CHECKING + +from ...events.event import Event +from ...models.cache_metadata import CacheMetadata +from ._base_llm_processor import BaseLlmRequestProcessor + +if TYPE_CHECKING: + from ...agents.invocation_context import InvocationContext + from ...models.llm_request import LlmRequest + +logger = logging.getLogger('google_adk.' + __name__) + + +class ContextCacheRequestProcessor(BaseLlmRequestProcessor): + """Request processor that enables context caching for LLM requests. + + This processor sets up context caching configuration for agents that have + context caching enabled and finds the latest cache metadata from session + events. The actual cache management is handled by the model-specific cache + managers (e.g., GeminiContextCacheManager). + """ + + async def run_async( + self, invocation_context: 'InvocationContext', llm_request: 'LlmRequest' + ) -> AsyncGenerator[Event, None]: + """Process LLM request to enable context caching. + + Args: + invocation_context: Invocation context containing agent and session info + llm_request: Request to process for caching + + Yields: + Event: No events are yielded by this processor + """ + agent = invocation_context.agent + + # Return early if no cache config + if not invocation_context.context_cache_config: + return + + # Set cache config to request + llm_request.cache_config = invocation_context.context_cache_config + + # Find latest cache metadata and previous token count from session events + latest_cache_metadata, previous_token_count = ( + self._find_cache_info_from_events( + invocation_context, agent.name, invocation_context.invocation_id + ) + ) + + if latest_cache_metadata: + llm_request.cache_metadata = latest_cache_metadata + logger.debug( + 'Found cache metadata for agent %s: %s', + agent.name, + latest_cache_metadata, + ) + + if previous_token_count is not None: + llm_request.cacheable_contents_token_count = previous_token_count + logger.debug( + 'Found previous prompt token count for agent %s: %d', + agent.name, + previous_token_count, + ) + + logger.debug('Context caching enabled for agent %s', agent.name) + + # This processor yields no events + return + yield # AsyncGenerator requires a yield in function body + + def _find_cache_info_from_events( + self, + invocation_context: 'InvocationContext', + agent_name: str, + current_invocation_id: str, + ) -> tuple[Optional[CacheMetadata], Optional[int]]: + """Find cache metadata and previous token count from session events. + + Args: + invocation_context: Context containing session with events + agent_name: Name of agent to find cache info for + current_invocation_id: Current invocation ID to compare for increment + + Returns: + Tuple of (cache_metadata, previous_prompt_token_count) + cache_metadata: Latest cache metadata with invocations_used incremented + only if this is a different invocation and has active cache + previous_prompt_token_count: Most recent prompt token count from + LLM response + """ + if not invocation_context.session or not invocation_context.session.events: + return None, None + + cache_metadata = None + previous_token_count = None + + # Search events from most recent to oldest using index traversal + events = invocation_context.session.events + for i in range(len(events) - 1, -1, -1): + event = events[i] + if event.author != agent_name: + continue + + # Look for cache metadata (only in actual LLM response events) + if cache_metadata is None and event.cache_metadata is not None: + # Check if this is a different invocation and has active cache + if ( + event.invocation_id + and event.invocation_id != current_invocation_id + and event.cache_metadata.cache_name is not None + ): + # Different invocation with active cache - increment invocations_used + cache_metadata = event.cache_metadata.model_copy( + update={ + 'invocations_used': event.cache_metadata.invocations_used + 1 + } + ) + else: + # Same invocation or no active cache - return copy as-is + cache_metadata = event.cache_metadata.model_copy() + + # Look for previous prompt token count (from actual LLM response events) + if ( + previous_token_count is None + and event.usage_metadata + and event.usage_metadata.prompt_token_count is not None + ): + previous_token_count = event.usage_metadata.prompt_token_count + + # Stop early if we found both pieces of information + if cache_metadata is not None and previous_token_count is not None: + break + + return cache_metadata, previous_token_count + + +# Create processor instance for use in flows +request_processor = ContextCacheRequestProcessor() diff --git a/src/google/adk/flows/llm_flows/functions.py b/src/google/adk/flows/llm_flows/functions.py index 0d4dc71dc6..c5d2eea96b 100644 --- a/src/google/adk/flows/llm_flows/functions.py +++ b/src/google/adk/flows/llm_flows/functions.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Handles function callings for LLM flow.""" +"""Handles function calling for LLM flow.""" from __future__ import annotations @@ -35,9 +35,9 @@ from ...auth.auth_tool import AuthToolArguments from ...events.event import Event from ...events.event_actions import EventActions -from ...telemetry import trace_merged_tool_calls -from ...telemetry import trace_tool_call -from ...telemetry import tracer +from ...telemetry.tracing import trace_merged_tool_calls +from ...telemetry.tracing import trace_tool_call +from ...telemetry.tracing import tracer from ...tools.base_tool import BaseTool from ...tools.tool_confirmation import ToolConfirmation from ...tools.tool_context import ToolContext @@ -215,8 +215,6 @@ async def handle_function_call_list_async( from ...agents.llm_agent import LlmAgent agent = invocation_context.agent - if not isinstance(agent, LlmAgent): - return None # Filter function calls filtered_calls = [ @@ -277,20 +275,70 @@ async def _execute_single_function_call_async( tool_confirmation: Optional[ToolConfirmation] = None, ) -> Optional[Event]: """Execute a single function call with thread safety for state modifications.""" - tool, tool_context = _get_tool_and_context( - invocation_context, - function_call, - tools_dict, - tool_confirmation, + + async def _run_on_tool_error_callbacks( + *, + tool: BaseTool, + tool_args: dict[str, Any], + tool_context: ToolContext, + error: Exception, + ) -> Optional[dict[str, Any]]: + """Runs the on_tool_error_callbacks for the given tool.""" + error_response = ( + await invocation_context.plugin_manager.run_on_tool_error_callback( + tool=tool, + tool_args=tool_args, + tool_context=tool_context, + error=error, + ) + ) + if error_response is not None: + return error_response + + for callback in agent.canonical_on_tool_error_callbacks: + error_response = callback( + tool=tool, + args=tool_args, + tool_context=tool_context, + error=error, + ) + if inspect.isawaitable(error_response): + error_response = await error_response + if error_response is not None: + return error_response + + return None + + # Do not use "args" as the variable name, because it is a reserved keyword + # in python debugger. + # Make a deep copy to avoid being modified. + function_args = ( + copy.deepcopy(function_call.args) if function_call.args else {} ) - with tracer.start_as_current_span(f'execute_tool {tool.name}'): - # Do not use "args" as the variable name, because it is a reserved keyword - # in python debugger. - # Make a deep copy to avoid being modified. - function_args = ( - copy.deepcopy(function_call.args) if function_call.args else {} + tool_context = _create_tool_context( + invocation_context, function_call, tool_confirmation + ) + + try: + tool = _get_tool(function_call, tools_dict) + except ValueError as tool_error: + tool = BaseTool(name=function_call.name, description='Tool not found') + error_response = await _run_on_tool_error_callbacks( + tool=tool, + tool_args=function_args, + tool_context=tool_context, + error=tool_error, ) + if error_response is not None: + return __build_response_event( + tool, error_response, tool_context, invocation_context + ) + else: + raise tool_error + + async def _run_with_trace(): + nonlocal function_args # Step 1: Check if plugin before_tool_callback overrides the function # response. @@ -319,13 +367,11 @@ async def _execute_single_function_call_async( tool, args=function_args, tool_context=tool_context ) except Exception as tool_error: - error_response = ( - await invocation_context.plugin_manager.run_on_tool_error_callback( - tool=tool, - tool_args=function_args, - tool_context=tool_context, - error=tool_error, - ) + error_response = await _run_on_tool_error_callbacks( + tool=tool, + tool_args=function_args, + tool_context=tool_context, + error=tool_error, ) if error_response is not None: function_response = error_response @@ -377,13 +423,23 @@ async def _execute_single_function_call_async( function_response_event = __build_response_event( tool, function_response, tool_context, invocation_context ) - trace_tool_call( - tool=tool, - args=function_args, - function_response_event=function_response_event, - ) return function_response_event + with tracer.start_as_current_span(f'execute_tool {tool.name}'): + try: + function_response_event = await _run_with_trace() + trace_tool_call( + tool=tool, + args=function_args, + function_response_event=function_response_event, + ) + return function_response_event + except: + trace_tool_call( + tool=tool, args=function_args, function_response_event=None + ) + raise + async def handle_function_calls_live( invocation_context: InvocationContext, @@ -453,13 +509,17 @@ async def _execute_single_function_call_live( tool, tool_context = _get_tool_and_context( invocation_context, function_call, tools_dict ) - with tracer.start_as_current_span(f'execute_tool {tool.name}'): + + function_args = ( + copy.deepcopy(function_call.args) if function_call.args else {} + ) + + async def _run_with_trace(): + nonlocal function_args + # Do not use "args" as the variable name, because it is a reserved keyword # in python debugger. # Make a deep copy to avoid being modified. - function_args = ( - copy.deepcopy(function_call.args) if function_call.args else {} - ) function_response = None # Handle before_tool_callbacks - iterate through the canonical callback @@ -513,13 +573,23 @@ async def _execute_single_function_call_live( function_response_event = __build_response_event( tool, function_response, tool_context, invocation_context ) - trace_tool_call( - tool=tool, - args=function_args, - function_response_event=function_response_event, - ) return function_response_event + with tracer.start_as_current_span(f'execute_tool {tool.name}'): + try: + function_response_event = await _run_with_trace() + trace_tool_call( + tool=tool, + args=function_args, + function_response_event=function_response_event, + ) + return function_response_event + except: + trace_tool_call( + tool=tool, args=function_args, function_response_event=None + ) + raise + async def _process_function_live_helper( tool, @@ -641,24 +711,52 @@ async def run_tool_and_update_queue(tool, function_args, tool_context): return function_response -def _get_tool_and_context( - invocation_context: InvocationContext, - function_call: types.FunctionCall, - tools_dict: dict[str, BaseTool], - tool_confirmation: Optional[ToolConfirmation] = None, +def _get_tool( + function_call: types.FunctionCall, tools_dict: dict[str, BaseTool] ): + """Returns the tool corresponding to the function call.""" if function_call.name not in tools_dict: - raise ValueError( - f'Function {function_call.name} is not found in the tools_dict.' + available = list(tools_dict.keys()) + error_msg = ( + f"Tool '{function_call.name}' not found.\nAvailable tools:" + f" {', '.join(available)}\n\nPossible causes:\n 1. LLM hallucinated" + ' the function name - review agent instruction clarity\n 2. Tool not' + ' registered - verify agent.tools list\n 3. Name mismatch - check for' + ' typos\n\nSuggested fixes:\n - Review agent instruction to ensure' + ' tool usage is clear\n - Verify tool is included in agent.tools' + ' list\n - Check for typos in function name' ) + raise ValueError(error_msg) + + return tools_dict[function_call.name] - tool_context = ToolContext( + +def _create_tool_context( + invocation_context: InvocationContext, + function_call: types.FunctionCall, + tool_confirmation: Optional[ToolConfirmation] = None, +): + """Creates a ToolContext object.""" + return ToolContext( invocation_context=invocation_context, function_call_id=function_call.id, tool_confirmation=tool_confirmation, ) - tool = tools_dict[function_call.name] + +def _get_tool_and_context( + invocation_context: InvocationContext, + function_call: types.FunctionCall, + tools_dict: dict[str, BaseTool], + tool_confirmation: Optional[ToolConfirmation] = None, +): + """Returns the tool and tool context corresponding to the function call.""" + tool = _get_tool(function_call, tools_dict) + tool_context = _create_tool_context( + invocation_context, + function_call, + tool_confirmation, + ) return (tool, tool_context) diff --git a/src/google/adk/flows/llm_flows/identity.py b/src/google/adk/flows/llm_flows/identity.py index 9a9482159e..1b026c513e 100644 --- a/src/google/adk/flows/llm_flows/identity.py +++ b/src/google/adk/flows/llm_flows/identity.py @@ -34,10 +34,10 @@ async def run_async( self, invocation_context: InvocationContext, llm_request: LlmRequest ) -> AsyncGenerator[Event, None]: agent = invocation_context.agent - si = [f'You are an agent. Your internal name is "{agent.name}".'] + si = f'You are an agent. Your internal name is "{agent.name}".' if agent.description: - si.append(f' The description about you is "{agent.description}"') - llm_request.append_instructions(si) + si += f' The description about you is "{agent.description}".' + llm_request.append_instructions([si]) # Maintain async generator behavior if False: # Ensures it behaves as a generator diff --git a/src/google/adk/flows/llm_flows/instructions.py b/src/google/adk/flows/llm_flows/instructions.py index 77a1afe2bd..587c164687 100644 --- a/src/google/adk/flows/llm_flows/instructions.py +++ b/src/google/adk/flows/llm_flows/instructions.py @@ -16,16 +16,14 @@ from __future__ import annotations -import re from typing import AsyncGenerator -from typing import Generator from typing import TYPE_CHECKING +from google.genai import _transformers from typing_extensions import override from ...agents.readonly_context import ReadonlyContext from ...events.event import Event -from ...sessions.state import State from ...utils import instructions_utils from ._base_llm_processor import BaseLlmRequestProcessor @@ -37,6 +35,28 @@ class _InstructionsLlmRequestProcessor(BaseLlmRequestProcessor): """Handles instructions and global instructions for LLM flow.""" + async def _process_agent_instruction( + self, agent, invocation_context: InvocationContext + ) -> str: + """Process agent instruction with state injection. + + Args: + agent: The agent with instruction to process + invocation_context: The invocation context + + Returns: + The processed instruction text + """ + raw_si, bypass_state_injection = await agent.canonical_instruction( + ReadonlyContext(invocation_context) + ) + si = raw_si + if not bypass_state_injection: + si = await instructions_utils.inject_session_state( + raw_si, ReadonlyContext(invocation_context) + ) + return si + @override async def run_async( self, invocation_context: InvocationContext, llm_request: LlmRequest @@ -45,15 +65,12 @@ async def run_async( from ...agents.llm_agent import LlmAgent agent = invocation_context.agent - if not isinstance(agent, LlmAgent): - return root_agent: BaseAgent = agent.root_agent - # Appends global instructions if set. - if ( - isinstance(root_agent, LlmAgent) and root_agent.global_instruction - ): # not empty str + # Handle global instructions (DEPRECATED - use GlobalInstructionPlugin instead) + # TODO: Remove this code block when global_instruction field is removed + if isinstance(root_agent, LlmAgent) and root_agent.global_instruction: raw_si, bypass_state_injection = ( await root_agent.canonical_global_instruction( ReadonlyContext(invocation_context) @@ -66,21 +83,29 @@ async def run_async( ) llm_request.append_instructions([si]) - # Appends agent instructions if set. - if agent.instruction: # not empty str - raw_si, bypass_state_injection = await agent.canonical_instruction( - ReadonlyContext(invocation_context) - ) - si = raw_si - if not bypass_state_injection: - si = await instructions_utils.inject_session_state( - raw_si, ReadonlyContext(invocation_context) - ) + # Handle static_instruction - add via append_instructions + if agent.static_instruction: + # Convert ContentUnion to Content using genai transformer + static_content = _transformers.t_content(agent.static_instruction) + llm_request.append_instructions(static_content) + + # Handle instruction based on whether static_instruction exists + if agent.instruction and not agent.static_instruction: + # Only add to system instructions if no static instruction exists + si = await self._process_agent_instruction(agent, invocation_context) llm_request.append_instructions([si]) + elif agent.instruction and agent.static_instruction: + # Static instruction exists, so add dynamic instruction to content + from google.genai import types + + si = await self._process_agent_instruction(agent, invocation_context) + # Create user content for dynamic instruction + dynamic_content = types.Content(role='user', parts=[types.Part(text=si)]) + llm_request.contents.append(dynamic_content) # Maintain async generator behavior - if False: # Ensures it behaves as a generator - yield # This is a no-op but maintains generator structure + return + yield # This line ensures it behaves as a generator but is never reached request_processor = _InstructionsLlmRequestProcessor() diff --git a/src/google/adk/flows/llm_flows/request_confirmation.py b/src/google/adk/flows/llm_flows/request_confirmation.py index 7bf9759563..358cae80b3 100644 --- a/src/google/adk/flows/llm_flows/request_confirmation.py +++ b/src/google/adk/flows/llm_flows/request_confirmation.py @@ -47,9 +47,9 @@ async def run_async( from ...agents.llm_agent import LlmAgent agent = invocation_context.agent - if not isinstance(agent, LlmAgent): - return - events = invocation_context.session.events + + # Only look at events in the current branch. + events = invocation_context._get_events(current_branch=True) if not events: return diff --git a/src/google/adk/flows/llm_flows/single_flow.py b/src/google/adk/flows/llm_flows/single_flow.py index 2644ebc046..2b91b40031 100644 --- a/src/google/adk/flows/llm_flows/single_flow.py +++ b/src/google/adk/flows/llm_flows/single_flow.py @@ -23,6 +23,7 @@ from . import _output_schema_processor from . import basic from . import contents +from . import context_cache_processor from . import identity from . import instructions from . import request_confirmation @@ -48,6 +49,8 @@ def __init__(self): instructions.request_processor, identity.request_processor, contents.request_processor, + # Context cache processor sets up cache config and finds existing cache metadata + context_cache_processor.request_processor, # Some implementations of NL Planning mark planning contents as thoughts # in the post processor. Since these need to be unmarked, NL Planning # should be after contents. diff --git a/src/google/adk/memory/vertex_ai_memory_bank_service.py b/src/google/adk/memory/vertex_ai_memory_bank_service.py index 69629eb9ce..6667c2de21 100644 --- a/src/google/adk/memory/vertex_ai_memory_bank_service.py +++ b/src/google/adk/memory/vertex_ai_memory_bank_service.py @@ -14,17 +14,15 @@ from __future__ import annotations -import json import logging -from typing import Any -from typing import Dict from typing import Optional from typing import TYPE_CHECKING -from google.genai import Client from google.genai import types from typing_extensions import override +import vertexai +from ..utils.vertex_ai_utils import get_express_mode_api_key from .base_memory_service import BaseMemoryService from .base_memory_service import SearchMemoryResponse from .memory_entry import MemoryEntry @@ -43,6 +41,8 @@ def __init__( project: Optional[str] = None, location: Optional[str] = None, agent_engine_id: Optional[str] = None, + *, + express_mode_api_key: Optional[str] = None, ): """Initializes a VertexAiMemoryBankService. @@ -52,15 +52,22 @@ def __init__( agent_engine_id: The ID of the agent engine to use for the Memory Bank. e.g. '456' in 'projects/my-project/locations/us-central1/reasoningEngines/456'. + express_mode_api_key: The API key to use for Express Mode. If not + provided, the API key from the GOOGLE_API_KEY environment variable will + be used. It will only be used if GOOGLE_GENAI_USE_VERTEXAI is true. + Do not use Google AI Studio API key for this field. For more details, + visit + https://cloud.google.com/vertex-ai/generative-ai/docs/start/express-mode/overview """ self._project = project self._location = location self._agent_engine_id = agent_engine_id + self._express_mode_api_key = get_express_mode_api_key( + project, location, express_mode_api_key + ) @override async def add_session_to_memory(self, session: Session): - api_client = self._get_api_client() - if not self._agent_engine_id: raise ValueError('Agent Engine ID is required for Memory Bank.') @@ -72,62 +79,53 @@ async def add_session_to_memory(self, session: Session): events.append({ 'content': event.content.model_dump(exclude_none=True, mode='json') }) - request_dict = { - 'direct_contents_source': { - 'events': events, - }, - 'scope': { - 'app_name': session.app_name, - 'user_id': session.user_id, - }, - } - if events: - api_response = await api_client.async_request( - http_method='POST', - path=f'reasoningEngines/{self._agent_engine_id}/memories:generate', - request_dict=request_dict, + client = self._get_api_client() + operation = client.agent_engines.memories.generate( + name='reasoningEngines/' + self._agent_engine_id, + direct_contents_source={'events': events}, + scope={ + 'app_name': session.app_name, + 'user_id': session.user_id, + }, + config={'wait_for_completion': False}, ) logger.info('Generate memory response received.') - logger.debug('Generate memory response: %s', api_response) + logger.debug('Generate memory response: %s', operation) else: logger.info('No events to add to memory.') @override async def search_memory(self, *, app_name: str, user_id: str, query: str): - api_client = self._get_api_client() - - api_response = await api_client.async_request( - http_method='POST', - path=f'reasoningEngines/{self._agent_engine_id}/memories:retrieve', - request_dict={ - 'scope': { - 'app_name': app_name, - 'user_id': user_id, - }, - 'similarity_search_params': { - 'search_query': query, - }, + if not self._agent_engine_id: + raise ValueError('Agent Engine ID is required for Memory Bank.') + + client = self._get_api_client() + retrieved_memories_iterator = client.agent_engines.memories.retrieve( + name='reasoningEngines/' + self._agent_engine_id, + scope={ + 'app_name': app_name, + 'user_id': user_id, + }, + similarity_search_params={ + 'search_query': query, }, ) - api_response = _convert_api_response(api_response) - logger.info('Search memory response received.') - logger.debug('Search memory response: %s', api_response) - if not api_response or not api_response.get('retrievedMemories', None): - return SearchMemoryResponse() + logger.info('Search memory response received.') memory_events = [] - for memory in api_response.get('retrievedMemories', []): + for retrieved_memory in retrieved_memories_iterator: # TODO: add more complex error handling + logger.debug('Retrieved memory: %s', retrieved_memory) memory_events.append( MemoryEntry( author='user', content=types.Content( - parts=[types.Part(text=memory.get('memory').get('fact'))], + parts=[types.Part(text=retrieved_memory.memory.fact)], role='user', ), - timestamp=memory.get('updateTime'), + timestamp=retrieved_memory.memory.update_time.isoformat(), ) ) return SearchMemoryResponse(memories=memory_events) @@ -137,21 +135,14 @@ def _get_api_client(self): It needs to be instantiated inside each request so that the event loop management can be properly propagated. - Returns: - An API client for the given project and location. + An API client for the given project and location or express mode api key. """ - client = Client( - vertexai=True, project=self._project, location=self._location + return vertexai.Client( + project=self._project, + location=self._location, + api_key=self._express_mode_api_key, ) - return client._api_client - - -def _convert_api_response(api_response) -> Dict[str, Any]: - """Converts the API response to a JSON object based on the type.""" - if hasattr(api_response, 'body'): - return json.loads(api_response.body) - return api_response def _should_filter_out_event(content: types.Content) -> bool: diff --git a/src/google/adk/memory/vertex_ai_rag_memory_service.py b/src/google/adk/memory/vertex_ai_rag_memory_service.py index 611cdb3813..dd491a620e 100644 --- a/src/google/adk/memory/vertex_ai_rag_memory_service.py +++ b/src/google/adk/memory/vertex_ai_rag_memory_service.py @@ -24,9 +24,9 @@ from google.genai import types from typing_extensions import override -from vertexai.preview import rag from . import _utils +from ..dependencies.vertexai import rag from .base_memory_service import BaseMemoryService from .base_memory_service import SearchMemoryResponse from .memory_entry import MemoryEntry diff --git a/src/google/adk/models/__init__.py b/src/google/adk/models/__init__.py index fc86c197ca..9f3c2a2c48 100644 --- a/src/google/adk/models/__init__.py +++ b/src/google/adk/models/__init__.py @@ -14,7 +14,9 @@ """Defines the interface to support a model.""" +from .apigee_llm import ApigeeLlm from .base_llm import BaseLlm +from .gemma_llm import Gemma from .google_llm import Gemini from .llm_request import LlmRequest from .llm_response import LlmResponse @@ -23,9 +25,11 @@ __all__ = [ 'BaseLlm', 'Gemini', + 'Gemma', 'LLMRegistry', ] -for regex in Gemini.supported_models(): - LLMRegistry.register(Gemini) +LLMRegistry.register(Gemini) +LLMRegistry.register(Gemma) +LLMRegistry.register(ApigeeLlm) diff --git a/src/google/adk/models/apigee_llm.py b/src/google/adk/models/apigee_llm.py new file mode 100644 index 0000000000..0229f97623 --- /dev/null +++ b/src/google/adk/models/apigee_llm.py @@ -0,0 +1,230 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from __future__ import annotations + +from functools import cached_property +import logging +import os +import re +from typing import Optional +from typing import TYPE_CHECKING + +from google.adk import version as adk_version +from google.genai import Client +from google.genai import types +from typing_extensions import override + +from ..utils.env_utils import is_env_enabled +from .google_llm import Gemini + +if TYPE_CHECKING: + from .llm_request import LlmRequest + +logger = logging.getLogger('google_adk.' + __name__) + +_APIGEE_PROXY_URL_ENV_VARIABLE_NAME = 'APIGEE_PROXY_URL' +_GOOGLE_GENAI_USE_VERTEXAI_ENV_VARIABLE_NAME = 'GOOGLE_GENAI_USE_VERTEXAI' + + +class ApigeeLlm(Gemini): + """A BaseLlm implementation for calling Apigee proxy. + + Attributes: + model: The name of the Gemini model. + """ + + def __init__( + self, + *, + model: str, + proxy_url: str | None = None, + custom_headers: dict[str, str] | None = None, + retry_options: Optional[types.HttpRetryOptions] = None, + ): + """Initializes the Apigee LLM backend. + + Args: + model: The model string specifies the LLM provider (e.g., Vertex AI, + Gemini), API version, and the model ID. Supported format: + `apigee/[/][/]` + + Components + `provider` (optional): `vertex_ai` or `gemini`. If omitted, behavior + depends on the `GOOGLE_GENAI_USE_VERTEXAI` environment variable. If + that is not set to TRUE or 1, it defaults to `gemini`. `provider` + takes precedence over `GOOGLE_GENAI_USE_VERTEXAI`. + `version` (optional): The API version (e.g., `v1`, `v1beta`). If + omitted, the default version for the provider is used. + `model_id` (required): The model identifier (e.g., + `gemini-2.5-flash`). + + Examples + - `apigee/gemini-2.5-flash` + - `apigee/v1/gemini-2.5-flash` + - `apigee/vertex_ai/gemini-2.5-flash` + - `apigee/gemini/v1/gemini-2.5-flash` + - `apigee/vertex_ai/v1beta/gemini-2.5-flash` + + proxy_url: The URL of the Apigee proxy. + custom_headers: A dictionary of headers to be sent with the request. + retry_options: Allow google-genai to retry failed responses. + """ + + super().__init__(model=model, retry_options=retry_options) + # Validate the model string. Create a helper method to validate the model + # string. + if not _validate_model_string(model): + raise ValueError(f'Invalid model string: {model}') + + self._isvertexai = _identify_vertexai(model) + self._api_version = _identify_api_version(model) + self._proxy_url = proxy_url or os.environ.get( + _APIGEE_PROXY_URL_ENV_VARIABLE_NAME + ) + self._custom_headers = custom_headers or {} + self._user_agent = f'google-adk/{adk_version.__version__}' + + @classmethod + @override + def supported_models(cls) -> list[str]: + """Provides the list of supported models. + + Returns: + A list of supported models. + """ + + return [ + r'apigee\/.*', + ] + + @cached_property + def api_client(self) -> Client: + """Provides the api client. + + Returns: + The api client. + """ + + kwargs_for_http_options = {} + if self._api_version: + kwargs_for_http_options['api_version'] = self._api_version + http_options = types.HttpOptions( + base_url=self._proxy_url, + headers=self._merge_tracking_headers(self._custom_headers), + retry_options=self.retry_options, + **kwargs_for_http_options, + ) + + return Client( + vertexai=self._isvertexai, + http_options=http_options, + ) + + @override + async def _preprocess_request(self, llm_request: LlmRequest) -> None: + llm_request.model = _get_model_id(llm_request.model) + await super()._preprocess_request(llm_request) + + +def _identify_vertexai(model: str) -> bool: + """Returns True if the model spec starts with apigee/vertex_ai.""" + return not model.startswith('apigee/gemini/') and ( + model.startswith('apigee/vertex_ai/') + or is_env_enabled(_GOOGLE_GENAI_USE_VERTEXAI_ENV_VARIABLE_NAME) + ) + + +def _identify_api_version(model: str) -> str: + """Returns the api version for the model spec.""" + model = model.removeprefix('apigee/') + components = model.split('/') + + if len(components) == 3: + # Format: // + return components[1] + if len(components) == 2: + # Format: / or / + # _validate_model_string ensures that if the first component is not a + # provider, it can be a version. + if components[0] not in ('vertex_ai', 'gemini') and components[ + 0 + ].startswith('v'): + return components[0] + return '' + + +def _get_model_id(model: str) -> str: + """Returns the model ID for the model spec.""" + model = model.removeprefix('apigee/') + components = model.split('/') + + # Model_id is the last component in the model string. + return components[-1] + + +def _validate_model_string(model: str) -> bool: + """Validates the model string for Apigee LLM. + + The model string specifies the LLM provider (e.g., Vertex AI, Gemini), API + version, and the model ID. + + Args: + model: The model string. Supported format: + `apigee/[/][/]` + + Returns: + True if the model string is valid, False otherwise. + """ + if not model.startswith('apigee/'): + return False + + # Remove leading "apigee/" from the model string. + model = model.removeprefix('apigee/') + + # The string has to be non-empty. i.e. the model_id cannot be empty. + if not model: + return False + + components = model.split('/') + # If the model string has exactly 1 component, it means only the model_id is + # present. This is a valid format. + if len(components) == 1: + return True + + # If the model string has more than 3 components, it is invalid. + if len(components) > 3: + return False + + # If the model string has 3 components, it means only the provider, version, + # and model_id are present. This is a valid format. + if len(components) == 3: + # Format: // + if components[0] not in ('vertex_ai', 'gemini'): + return False + if not components[1].startswith('v'): + return False + return True + + # If the model string has 2 components, it means either the provider or the + # version (but not both), and model_id are present. + if len(components) == 2: + if components[0] in ['vertex_ai', 'gemini']: + return True + if components[0].startswith('v'): + return True + return False + + return False diff --git a/src/google/adk/models/base_llm_connection.py b/src/google/adk/models/base_llm_connection.py index 22ca3b360d..afce550b13 100644 --- a/src/google/adk/models/base_llm_connection.py +++ b/src/google/adk/models/base_llm_connection.py @@ -30,7 +30,7 @@ async def send_history(self, history: list[types.Content]): """Sends the conversation history to the model. You call this method right after setting up the model connection. - The model will respond if the last content is from user, otherwise it will + The model will respond if the last content is from user; otherwise, it will wait for new user input before responding. Args: diff --git a/src/google/adk/models/cache_metadata.py b/src/google/adk/models/cache_metadata.py new file mode 100644 index 0000000000..1652522138 --- /dev/null +++ b/src/google/adk/models/cache_metadata.py @@ -0,0 +1,121 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import time +from typing import Optional + +from pydantic import BaseModel +from pydantic import ConfigDict +from pydantic import Field + + +class CacheMetadata(BaseModel): + """Metadata for context cache associated with LLM responses. + + This class stores cache identification, usage tracking, and lifecycle + information for a particular cache instance. It can be in two states: + + 1. Active cache state: cache_name is set, all fields populated + 2. Fingerprint-only state: cache_name is None, only fingerprint and + contents_count are set for prefix matching + + Token counts (cached and total) are available in the LlmResponse.usage_metadata + and should be accessed from there to avoid duplication. + + Attributes: + cache_name: The full resource name of the cached content (e.g., + 'projects/123/locations/us-central1/cachedContents/456'). + None when no active cache exists (fingerprint-only state). + expire_time: Unix timestamp when the cache expires. None when no + active cache exists. + fingerprint: Hash of cacheable contents (instruction + tools + contents). + Always present for prefix matching. + invocations_used: Number of invocations this cache has been used for. + None when no active cache exists. + contents_count: Number of contents. When active cache exists, this is + the count of cached contents. When no active cache exists, this is + the total count of contents in the request. + created_at: Unix timestamp when the cache was created. None when + no active cache exists. + """ + + model_config = ConfigDict( + extra="forbid", + frozen=True, # Cache metadata should be immutable + ) + + cache_name: Optional[str] = Field( + default=None, + description=( + "Full resource name of the cached content (None if no active cache)" + ), + ) + + expire_time: Optional[float] = Field( + default=None, + description="Unix timestamp when cache expires (None if no active cache)", + ) + + fingerprint: str = Field( + description="Hash of cacheable contents used to detect changes" + ) + + invocations_used: Optional[int] = Field( + default=None, + ge=0, + description=( + "Number of invocations this cache has been used for (None if no" + " active cache)" + ), + ) + + contents_count: int = Field( + ge=0, + description=( + "Number of contents (cached contents when active cache exists, " + "total contents in request when no active cache)" + ), + ) + + created_at: Optional[float] = Field( + default=None, + description=( + "Unix timestamp when cache was created (None if no active cache)" + ), + ) + + @property + def expire_soon(self) -> bool: + """Check if the cache will expire soon (with 2-minute buffer).""" + if self.expire_time is None: + return False + buffer_seconds = 120 # 2 minutes buffer for processing time + return time.time() > (self.expire_time - buffer_seconds) + + def __str__(self) -> str: + """String representation for logging and debugging.""" + if self.cache_name is None: + return ( + f"Fingerprint-only: {self.contents_count} contents, " + f"fingerprint={self.fingerprint[:8]}..." + ) + cache_id = self.cache_name.split("/")[-1] + time_until_expiry_minutes = (self.expire_time - time.time()) / 60 + return ( + f"Cache {cache_id}: used {self.invocations_used} invocations, " + f"cached {self.contents_count} contents, " + f"expires in {time_until_expiry_minutes:.1f}min" + ) diff --git a/src/google/adk/models/gemini_context_cache_manager.py b/src/google/adk/models/gemini_context_cache_manager.py new file mode 100644 index 0000000000..136890be0b --- /dev/null +++ b/src/google/adk/models/gemini_context_cache_manager.py @@ -0,0 +1,465 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Manages context cache lifecycle for Gemini models.""" + +from __future__ import annotations + +import hashlib +import json +import logging +import time +from typing import Optional + +from google.genai import Client +from google.genai import types + +from ..utils.feature_decorator import experimental +from .cache_metadata import CacheMetadata +from .llm_request import LlmRequest +from .llm_response import LlmResponse + +logger = logging.getLogger("google_adk." + __name__) + + +@experimental +class GeminiContextCacheManager: + """Manages context cache lifecycle for Gemini models. + + This manager handles cache creation, validation, cleanup, and metadata + population for Gemini context caching. It uses content hashing to determine + cache compatibility and implements efficient caching strategies. + """ + + def __init__(self, genai_client: Client): + """Initialize cache manager with shared client. + + Args: + genai_client: The GenAI client to use for cache operations. + """ + self.genai_client = genai_client + + async def handle_context_caching( + self, llm_request: LlmRequest + ) -> Optional[CacheMetadata]: + """Handle context caching for Gemini models. + + Validates existing cache or creates a new one if needed. Applies + the cache to the request by setting cached_content and removing cached + contents from the request. + + Args: + llm_request: Request that may contain cache config and metadata. + Modified in-place to use the cache. + + Returns: + Cache metadata to be included in response, or None if caching failed + """ + # Check if we have existing cache metadata and if it's valid + if llm_request.cache_metadata: + logger.debug( + "Found existing cache metadata: %s", + llm_request.cache_metadata, + ) + if await self._is_cache_valid(llm_request): + # Valid cache found - use it + logger.debug( + "Cache is valid, reusing cache: %s", + llm_request.cache_metadata.cache_name, + ) + cache_name = llm_request.cache_metadata.cache_name + cache_contents_count = llm_request.cache_metadata.contents_count + self._apply_cache_to_request( + llm_request, cache_name, cache_contents_count + ) + return llm_request.cache_metadata.model_copy() + else: + # Invalid cache - clean it up and check if we should create new one + old_cache_metadata = llm_request.cache_metadata + + # Only cleanup if there's an active cache + if old_cache_metadata.cache_name is not None: + logger.debug( + "Cache is invalid, cleaning up: %s", + old_cache_metadata.cache_name, + ) + await self.cleanup_cache(old_cache_metadata.cache_name) + + # Calculate current fingerprint using contents count from old metadata + cache_contents_count = old_cache_metadata.contents_count + current_fingerprint = self._generate_cache_fingerprint( + llm_request, cache_contents_count + ) + + # If fingerprints match, create new cache (expired but same content) + if current_fingerprint == old_cache_metadata.fingerprint: + logger.debug( + "Fingerprints match after invalidation, creating new cache" + ) + cache_metadata = await self._create_new_cache_with_contents( + llm_request, cache_contents_count + ) + if cache_metadata: + self._apply_cache_to_request( + llm_request, cache_metadata.cache_name, cache_contents_count + ) + return cache_metadata + + # Fingerprints don't match - recalculate with total contents + logger.debug( + "Fingerprints don't match, returning fingerprint-only metadata" + ) + total_contents_count = len(llm_request.contents) + fingerprint_for_all = self._generate_cache_fingerprint( + llm_request, total_contents_count + ) + return CacheMetadata( + fingerprint=fingerprint_for_all, + contents_count=total_contents_count, + ) + + # No existing cache metadata - return fingerprint-only metadata + # We don't create cache without previous fingerprint to match + logger.debug( + "No existing cache metadata, creating fingerprint-only metadata" + ) + total_contents_count = len(llm_request.contents) + fingerprint = self._generate_cache_fingerprint( + llm_request, total_contents_count + ) + return CacheMetadata( + fingerprint=fingerprint, + contents_count=total_contents_count, + ) + + def _find_count_of_contents_to_cache( + self, contents: list[types.Content] + ) -> int: + """Find the number of contents to cache based on user content strategy. + + Strategy: Find the last continuous batch of user contents and cache + all contents before them. + + Args: + contents: List of contents from the LLM request + + Returns: + Number of contents to cache (can be 0 if all contents are user contents) + """ + if not contents: + return 0 + + # Find the last continuous batch of user contents + last_user_batch_start = len(contents) + + # Scan backwards to find the start of the last user content batch + for i in range(len(contents) - 1, -1, -1): + if contents[i].role == "user": + last_user_batch_start = i + else: + # Found non-user content, stop the batch + break + + # Cache all contents before the last user batch + # This ensures we always have some user content to send to the API + return last_user_batch_start + + async def _is_cache_valid(self, llm_request: LlmRequest) -> bool: + """Check if the cache from request metadata is still valid. + + Validates that it's an active cache (not fingerprint-only), checks expiry, + cache intervals, and fingerprint compatibility. + + Args: + llm_request: Request containing cache metadata to validate + + Returns: + True if cache is valid, False otherwise + """ + cache_metadata = llm_request.cache_metadata + if not cache_metadata: + return False + + # Fingerprint-only metadata is not a valid active cache + if cache_metadata.cache_name is None: + return False + + # Check if cache has expired + if time.time() >= cache_metadata.expire_time: + logger.info("Cache expired: %s", cache_metadata.cache_name) + return False + + # Check if cache has been used for too many invocations + if ( + cache_metadata.invocations_used + > llm_request.cache_config.cache_intervals + ): + logger.info( + "Cache exceeded cache intervals: %s (%d > %d intervals)", + cache_metadata.cache_name, + cache_metadata.invocations_used, + llm_request.cache_config.cache_intervals, + ) + return False + + # Check if fingerprint matches using cached contents count + current_fingerprint = self._generate_cache_fingerprint( + llm_request, cache_metadata.contents_count + ) + if current_fingerprint != cache_metadata.fingerprint: + logger.debug("Cache content fingerprint mismatch") + return False + + return True + + def _generate_cache_fingerprint( + self, llm_request: LlmRequest, cache_contents_count: int + ) -> str: + """Generate a fingerprint for cache validation. + + Includes system instruction, tools, tool_config, and first N contents. + + Args: + llm_request: Request to generate fingerprint for + cache_contents_count: Number of contents to include in fingerprint + + Returns: + 16-character hexadecimal fingerprint representing the cached state + """ + # Create fingerprint from system instruction, tools, tool_config, and first N contents + fingerprint_data = {} + + if llm_request.config and llm_request.config.system_instruction: + fingerprint_data["system_instruction"] = ( + llm_request.config.system_instruction + ) + + if llm_request.config and llm_request.config.tools: + # Simplified: just dump types.Tool instances to JSON + tools_data = [] + for tool in llm_request.config.tools: + if isinstance(tool, types.Tool): + tools_data.append(tool.model_dump()) + fingerprint_data["tools"] = tools_data + + if llm_request.config and llm_request.config.tool_config: + fingerprint_data["tool_config"] = ( + llm_request.config.tool_config.model_dump() + ) + + # Include first N contents in fingerprint + if cache_contents_count > 0 and llm_request.contents: + contents_data = [] + for i in range(min(cache_contents_count, len(llm_request.contents))): + content = llm_request.contents[i] + contents_data.append(content.model_dump()) + fingerprint_data["cached_contents"] = contents_data + + # Generate hash using str() instead of json.dumps() to handle bytes + fingerprint_str = str(fingerprint_data) + return hashlib.sha256(fingerprint_str.encode()).hexdigest()[:16] + + async def _create_new_cache_with_contents( + self, llm_request: LlmRequest, cache_contents_count: int + ) -> Optional[CacheMetadata]: + """Create a new cache with specified number of contents. + + Args: + llm_request: Request to create cache for + cache_contents_count: Number of contents to include in cache + + Returns: + Cache metadata if successful, None otherwise + """ + # Check if we have token count from previous response for cache size validation + if llm_request.cacheable_contents_token_count is None: + logger.info( + "No previous token count available, skipping cache creation for" + " initial request" + ) + return None + + if ( + llm_request.cacheable_contents_token_count + < llm_request.cache_config.min_tokens + ): + logger.info( + "Previous request too small for caching (%d < %d tokens)", + llm_request.cacheable_contents_token_count, + llm_request.cache_config.min_tokens, + ) + return None + + try: + # Create cache using Gemini API directly + return await self._create_gemini_cache(llm_request, cache_contents_count) + except Exception as e: + logger.warning("Failed to create cache: %s", e) + return None + + def _estimate_request_tokens(self, llm_request: LlmRequest) -> int: + """Estimate token count for the request. + + This is a rough estimation based on content text length. + + Args: + llm_request: Request to estimate tokens for + + Returns: + Estimated token count + """ + total_chars = 0 + + # System instruction + if llm_request.config and llm_request.config.system_instruction: + total_chars += len(llm_request.config.system_instruction) + + # Tools + if llm_request.config and llm_request.config.tools: + for tool in llm_request.config.tools: + if isinstance(tool, types.Tool): + tool_str = json.dumps(tool.model_dump()) + total_chars += len(tool_str) + + # Contents + for content in llm_request.contents: + for part in content.parts: + if part.text: + total_chars += len(part.text) + + # Rough estimate: 4 characters per token + return total_chars // 4 + + async def _create_gemini_cache( + self, llm_request: LlmRequest, cache_contents_count: int + ) -> CacheMetadata: + """Create cache using Gemini API. + + Args: + llm_request: Request to create cache for + cache_contents_count: Number of contents to cache + + Returns: + Cache metadata with precise creation timestamp + """ + from ..telemetry.tracing import tracer + + with tracer.start_as_current_span("create_cache") as span: + # Prepare cache contents (first N contents + system instruction + tools) + cache_contents = llm_request.contents[:cache_contents_count] + + cache_config = types.CreateCachedContentConfig( + contents=cache_contents, + ttl=llm_request.cache_config.ttl_string, + display_name=( + f"adk-cache-{int(time.time())}-{cache_contents_count}contents" + ), + ) + + # Add system instruction if present + if llm_request.config and llm_request.config.system_instruction: + cache_config.system_instruction = llm_request.config.system_instruction + logger.debug( + "Added system instruction to cache config (length=%d)", + len(llm_request.config.system_instruction), + ) + + # Add tools if present + if llm_request.config and llm_request.config.tools: + cache_config.tools = llm_request.config.tools + + # Add tool config if present + if llm_request.config and llm_request.config.tool_config: + cache_config.tool_config = llm_request.config.tool_config + + span.set_attribute("cache_contents_count", cache_contents_count) + span.set_attribute("model", llm_request.model) + span.set_attribute("ttl_seconds", llm_request.cache_config.ttl_seconds) + + logger.debug( + "Creating cache with model %s and config: %s", + llm_request.model, + cache_config, + ) + cached_content = await self.genai_client.aio.caches.create( + model=llm_request.model, + config=cache_config, + ) + # Set precise creation timestamp right after cache creation + created_at = time.time() + logger.info("Cache created successfully: %s", cached_content.name) + + span.set_attribute("cache_name", cached_content.name) + + # Return complete cache metadata with precise timing + return CacheMetadata( + cache_name=cached_content.name, + expire_time=created_at + llm_request.cache_config.ttl_seconds, + fingerprint=self._generate_cache_fingerprint( + llm_request, cache_contents_count + ), + invocations_used=1, + contents_count=cache_contents_count, + created_at=created_at, + ) + + async def cleanup_cache(self, cache_name: str) -> None: + """Clean up cache by deleting it. + + Args: + cache_name: Name of cache to delete + """ + logger.debug("Attempting to delete cache: %s", cache_name) + try: + await self.genai_client.aio.caches.delete(name=cache_name) + logger.info("Cache cleaned up: %s", cache_name) + except Exception as e: + logger.warning("Failed to cleanup cache %s: %s", cache_name, e) + + def _apply_cache_to_request( + self, + llm_request: LlmRequest, + cache_name: str, + cache_contents_count: int, + ) -> None: + """Apply cache to the request by modifying it to use cached content. + + Args: + llm_request: Request to modify + cache_name: Name of cache to use + cache_contents_count: Number of contents that are cached + """ + # Remove system instruction, tools, and tool config from request config since they're in cache + if llm_request.config: + llm_request.config.system_instruction = None + llm_request.config.tools = None + llm_request.config.tool_config = None + + # Set cached content reference + llm_request.config.cached_content = cache_name + + # Remove cached contents from the request (keep only uncached contents) + llm_request.contents = llm_request.contents[cache_contents_count:] + + def populate_cache_metadata_in_response( + self, llm_response: LlmResponse, cache_metadata: CacheMetadata + ) -> None: + """Populate cache metadata in LLM response. + + Args: + llm_response: Response to populate metadata in + cache_metadata: Cache metadata to copy into response + """ + # Create a copy of cache metadata for the response + llm_response.cache_metadata = cache_metadata.model_copy() diff --git a/src/google/adk/models/gemini_llm_connection.py b/src/google/adk/models/gemini_llm_connection.py index 509128b060..e23ce19ac8 100644 --- a/src/google/adk/models/gemini_llm_connection.py +++ b/src/google/adk/models/gemini_llm_connection.py @@ -40,7 +40,7 @@ async def send_history(self, history: list[types.Content]): """Sends the conversation history to the gemini model. You call this method right after setting up the model connection. - The model will respond if the last content is from user, otherwise it will + The model will respond if the last content is from user; otherwise, it will wait for new user input before responding. Args: @@ -148,6 +148,8 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: # partial content and emit responses as needed. async for message in agen: logger.debug('Got LLM Live message: %s', message) + if message.usage_metadata: + yield LlmResponse(usage_metadata=message.usage_metadata) if message.server_content: content = message.server_content.model_turn if content and content.parts: @@ -205,7 +207,7 @@ async def receive(self) -> AsyncGenerator[LlmResponse, None]: ] yield LlmResponse(content=types.Content(role='model', parts=parts)) if message.session_resumption_update: - logger.info('Redeived session reassumption message: %s', message) + logger.info('Received session resumption message: %s', message) yield ( LlmResponse( live_session_resumption_update=message.session_resumption_update diff --git a/src/google/adk/models/gemma_llm.py b/src/google/adk/models/gemma_llm.py new file mode 100644 index 0000000000..3233d66f99 --- /dev/null +++ b/src/google/adk/models/gemma_llm.py @@ -0,0 +1,331 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from functools import cached_property +import json +import logging +import re +from typing import Any +from typing import AsyncGenerator + +from google.adk.models.google_llm import Gemini +from google.adk.models.llm_request import LlmRequest +from google.adk.models.llm_response import LlmResponse +from google.adk.utils.variant_utils import GoogleLLMVariant +from google.genai import types +from google.genai.types import Content +from google.genai.types import FunctionDeclaration +from google.genai.types import Part +from pydantic import AliasChoices +from pydantic import BaseModel +from pydantic import Field +from pydantic import ValidationError +from typing_extensions import override + +logger = logging.getLogger('google_adk.' + __name__) + + +class GemmaFunctionCallModel(BaseModel): + """Flexible Pydantic model for parsing inline Gemma function call responses.""" + + name: str = Field(validation_alias=AliasChoices('name', 'function')) + parameters: dict[str, Any] = Field( + validation_alias=AliasChoices('parameters', 'args') + ) + + +class Gemma(Gemini): + """Integration for Gemma models exposed via the Gemini API. + + Only Gemma 3 models are supported at this time. For agentic use cases, + use of gemma-3-27b-it and gemma-3-12b-it are strongly recommended. + + For full documentation, see: https://ai.google.dev/gemma/docs/core/ + + NOTE: Gemma does **NOT** support system instructions. Any system instructions + will be replaced with an initial *user* prompt in the LLM request. If system + instructions change over the course of agent execution, the initial content + **SHOULD** be replaced. Special care is warranted here. + See: https://ai.google.dev/gemma/docs/core/prompt-structure#system-instructions + + NOTE: Gemma's function calling support is limited. It does not have full access to the + same built-in tools as Gemini. It also does not have special API support for tools and + functions. Rather, tools must be passed in via a `user` prompt, and extracted from model + responses based on approximate shape. + + NOTE: Vertex AI API support for Gemma is not currently included. This **ONLY** supports + usage via the Gemini API. + """ + + model: str = ( + 'gemma-3-27b-it' # Others: [gemma-3-1b-it, gemma-3-4b-it, gemma-3-12b-it] + ) + + @classmethod + @override + def supported_models(cls) -> list[str]: + """Provides the list of supported models. + + Returns: + A list of supported models. + """ + + return [ + r'gemma-3.*', + ] + + @cached_property + def _api_backend(self) -> GoogleLLMVariant: + return GoogleLLMVariant.GEMINI_API + + def _move_function_calls_into_system_instruction( + self, llm_request: LlmRequest + ): + if llm_request.model is None or not llm_request.model.startswith('gemma-3'): + return + + # Iterate through the existing contents to find and convert function calls and responses + # from text parts, as Gemma models don't directly support function calling. + new_contents: list[Content] = [] + for content_item in llm_request.contents: + ( + new_parts_for_content, + has_function_response_part, + has_function_call_part, + ) = _convert_content_parts_for_gemma(content_item) + + if has_function_response_part: + if new_parts_for_content: + new_contents.append(Content(role='user', parts=new_parts_for_content)) + elif has_function_call_part: + if new_parts_for_content: + new_contents.append( + Content(role='model', parts=new_parts_for_content) + ) + else: + new_contents.append(content_item) + + llm_request.contents = new_contents + + if not llm_request.config.tools: + return + + all_function_declarations: list[FunctionDeclaration] = [] + for tool_item in llm_request.config.tools: + if isinstance(tool_item, types.Tool) and tool_item.function_declarations: + all_function_declarations.extend(tool_item.function_declarations) + + if all_function_declarations: + system_instruction = _build_gemma_function_system_instruction( + all_function_declarations + ) + llm_request.append_instructions([system_instruction]) + + llm_request.config.tools = [] + + def _extract_function_calls_from_response(self, llm_response: LlmResponse): + if llm_response.partial or (llm_response.turn_complete is True): + return + + if not llm_response.content: + return + + if not llm_response.content.parts: + return + + if len(llm_response.content.parts) > 1: + return + + response_text = llm_response.content.parts[0].text + if not response_text: + return + + try: + json_candidate = None + + markdown_code_block_pattern = re.compile( + r'```(?:(json|tool_code))?\s*(.*?)\s*```', re.DOTALL + ) + block_match = markdown_code_block_pattern.search(response_text) + + if block_match: + json_candidate = block_match.group(2).strip() + else: + found, json_text = _get_last_valid_json_substring(response_text) + if found: + json_candidate = json_text + + if not json_candidate: + return + + function_call_parsed = GemmaFunctionCallModel.model_validate_json( + json_candidate + ) + function_call = types.FunctionCall( + name=function_call_parsed.name, + args=function_call_parsed.parameters, + ) + function_call_part = Part(function_call=function_call) + llm_response.content.parts = [function_call_part] + except (json.JSONDecodeError, ValidationError) as e: + logger.debug( + f'Error attempting to parse JSON into function call. Leaving as text' + f' response. %s', + e, + ) + except Exception as e: + logger.warning('Error processing Gemma function call response: %s', e) + + @override + async def _preprocess_request(self, llm_request: LlmRequest) -> None: + self._move_function_calls_into_system_instruction(llm_request=llm_request) + + if system_instruction := llm_request.config.system_instruction: + contents = llm_request.contents + instruction_content = Content( + role='user', parts=[Part.from_text(text=system_instruction)] + ) + + # NOTE: if history is preserved, we must include the system instructions ONLY once at the beginning + # of any chain of contents. + if contents: + if contents[0] != instruction_content: + # only prepend if it hasn't already been done + llm_request.contents = [instruction_content] + contents + + llm_request.config.system_instruction = None + + return await super()._preprocess_request(llm_request) + + @override + async def generate_content_async( + self, llm_request: LlmRequest, stream: bool = False + ) -> AsyncGenerator[LlmResponse, None]: + """Sends a request to the Gemma model. + + Args: + llm_request: LlmRequest, the request to send to the Gemini model. + stream: bool = False, whether to do streaming call. + + Yields: + LlmResponse: The model response. + """ + # print(f'{llm_request=}') + assert llm_request.model.startswith('gemma-'), ( + f'Requesting a non-Gemma model ({llm_request.model}) with the Gemma LLM' + ' is not supported.' + ) + + async for response in super().generate_content_async(llm_request, stream): + self._extract_function_calls_from_response(response) + yield response + + +def _convert_content_parts_for_gemma( + content_item: Content, +) -> tuple[list[Part], bool, bool]: + """Converts function call/response parts within a content item to text parts. + + Args: + content_item: The original Content item. + + Returns: + A tuple containing: + - A list of new Part objects with function calls/responses converted to text. + - A boolean indicating if any function response parts were found. + - A boolean indicating if any function call parts were found. + """ + new_parts: list[Part] = [] + has_function_response_part = False + has_function_call_part = False + + for part in content_item.parts: + if func_response := part.function_response: + has_function_response_part = True + response_text = ( + f'Invoking tool `{func_response.name}` produced:' + f' `{json.dumps(func_response.response)}`.' + ) + new_parts.append(Part.from_text(text=response_text)) + elif func_call := part.function_call: + has_function_call_part = True + new_parts.append( + Part.from_text(text=func_call.model_dump_json(exclude_none=True)) + ) + else: + new_parts.append(part) + return new_parts, has_function_response_part, has_function_call_part + + +def _build_gemma_function_system_instruction( + function_declarations: list[FunctionDeclaration], +) -> str: + """Constructs the system instruction string for Gemma function calling.""" + if not function_declarations: + return '' + + system_instruction_prefix = 'You have access to the following functions:\n[' + instruction_parts = [] + for func in function_declarations: + instruction_parts.append(func.model_dump_json(exclude_none=True)) + + separator = ',\n' + system_instruction = ( + f'{system_instruction_prefix}{separator.join(instruction_parts)}\n]\n' + ) + + system_instruction += ( + 'When you call a function, you MUST respond in the format of: ' + """{"name": function name, "parameters": dictionary of argument name and its value}\n""" + 'When you call a function, you MUST NOT include any other text in the' + ' response.\n' + ) + return system_instruction + + +def _get_last_valid_json_substring(text: str) -> tuple[bool, str | None]: + """Attempts to find and return the last valid JSON object in a string. + + This function is designed to extract JSON that might be embedded in a larger + text, potentially with introductory or concluding remarks. It will always chose + the last block of valid json found within the supplied text (if it exists). + + Args: + text: The input string to search for JSON objects. + + Returns: + A tuple: + - bool: True if a valid JSON substring was found, False otherwise. + - str | None: The last valid JSON substring found, or None if none was + found. + """ + decoder = json.JSONDecoder() + last_json_str = None + start_pos = 0 + while start_pos < len(text): + try: + first_brace_index = text.index('{', start_pos) + _, end_index = decoder.raw_decode(text[first_brace_index:]) + last_json_str = text[first_brace_index : first_brace_index + end_index] + start_pos = first_brace_index + end_index + except json.JSONDecodeError: + start_pos = first_brace_index + 1 + except ValueError: + break + + if last_json_str: + return True, last_json_str + return False, None diff --git a/src/google/adk/models/google_llm.py b/src/google/adk/models/google_llm.py index 1bcd66dd94..84f8cf516c 100644 --- a/src/google/adk/models/google_llm.py +++ b/src/google/adk/models/google_llm.py @@ -16,6 +16,7 @@ from __future__ import annotations import contextlib +import copy from functools import cached_property import logging import os @@ -28,7 +29,6 @@ from google.genai import Client from google.genai import types -from google.genai.types import FinishReason from typing_extensions import override from .. import version @@ -60,6 +60,8 @@ class Gemini(BaseLlm): model: str = 'gemini-2.5-flash' + speech_config: Optional[types.SpeechConfig] = None + retry_options: Optional[types.HttpRetryOptions] = None """Allow Gemini to retry failed responses. @@ -110,6 +112,24 @@ async def generate_content_async( """ await self._preprocess_request(llm_request) self._maybe_append_user_content(llm_request) + + # Handle context caching if configured + cache_metadata = None + cache_manager = None + if llm_request.cache_config: + from ..telemetry.tracing import tracer + from .gemini_context_cache_manager import GeminiContextCacheManager + + with tracer.start_as_current_span('handle_context_caching') as span: + cache_manager = GeminiContextCacheManager(self.api_client) + cache_metadata = await cache_manager.handle_context_caching(llm_request) + if cache_metadata: + if cache_metadata.cache_name: + span.set_attribute('cache_action', 'active_cache') + span.set_attribute('cache_name', cache_metadata.cache_name) + else: + span.set_attribute('cache_action', 'fingerprint_only') + logger.info( 'Sending out request, model: %s, backend: %s, stream: %s', llm_request.model, @@ -150,6 +170,11 @@ async def generate_content_async( async for llm_response in aggregator_gen: yield llm_response if (close_result := aggregator.close()) is not None: + # Populate cache metadata in the final aggregated response for streaming + if cache_metadata: + cache_manager.populate_cache_metadata_in_response( + close_result, cache_metadata + ) yield close_result else: @@ -160,7 +185,13 @@ async def generate_content_async( ) logger.info('Response received from the model.') logger.debug(_build_response_log(response)) - yield LlmResponse.create(response) + + llm_response = LlmResponse.create(response) + if cache_metadata: + cache_manager.populate_cache_metadata_in_response( + llm_response, cache_metadata + ) + yield llm_response @cached_property def api_client(self) -> Client: @@ -240,6 +271,9 @@ async def connect(self, llm_request: LlmRequest) -> BaseLlmConnection: self._live_api_version ) + if self.speech_config is not None: + llm_request.live_connect_config.speech_config = self.speech_config + llm_request.live_connect_config.system_instruction = types.Content( role='system', parts=[ @@ -280,18 +314,19 @@ async def _preprocess_request(self, llm_request: LlmRequest) -> None: if not content.parts: continue for part in content.parts: - _remove_display_name_if_present(part.inline_data) - _remove_display_name_if_present(part.file_data) + # Create copies to avoid mutating the original objects + if part.inline_data: + part.inline_data = copy.copy(part.inline_data) + _remove_display_name_if_present(part.inline_data) + if part.file_data: + part.file_data = copy.copy(part.file_data) + _remove_display_name_if_present(part.file_data) # Initialize config if needed if llm_request.config and llm_request.config.tools: # Check if computer use is configured for tool in llm_request.config.tools: - if ( - isinstance(tool, (types.Tool, types.ToolDict)) - and hasattr(tool, 'computer_use') - and tool.computer_use - ): + if isinstance(tool, types.Tool) and tool.computer_use: llm_request.config.system_instruction = None await self._adapt_computer_use_tool(llm_request) @@ -329,10 +364,19 @@ def _build_function_declaration_log( def _build_request_log(req: LlmRequest) -> str: - function_decls: list[types.FunctionDeclaration] = cast( - list[types.FunctionDeclaration], - req.config.tools[0].function_declarations if req.config.tools else [], - ) + # Find which tool contains function_declarations + function_decls: list[types.FunctionDeclaration] = [] + function_decl_tool_index: Optional[int] = None + + if req.config.tools: + for idx, tool in enumerate(req.config.tools): + if tool.function_declarations: + function_decls = cast( + list[types.FunctionDeclaration], tool.function_declarations + ) + function_decl_tool_index = idx + break + function_logs = ( [ _build_function_declaration_log(func_decl) @@ -353,12 +397,35 @@ def _build_request_log(req: LlmRequest) -> str: for content in req.contents ] + # Build exclusion dict for config logging + tools_exclusion = ( + {function_decl_tool_index: {'function_declarations'}} + if function_decl_tool_index is not None + else True + ) + + try: + config_log = str( + req.config.model_dump( + exclude_none=True, + exclude={ + 'system_instruction': True, + 'tools': tools_exclusion if req.config.tools else True, + }, + ) + ) + except Exception: + config_log = repr(req.config) + return f""" LLM Request: ----------------------------------------------------------- System Instruction: {req.config.system_instruction} ----------------------------------------------------------- +Config: +{config_log} +----------------------------------------------------------- Contents: {_NEW_LINE.join(contents_logs)} ----------------------------------------------------------- diff --git a/src/google/adk/models/lite_llm.py b/src/google/adk/models/lite_llm.py index 4c6be95d38..3874216d42 100644 --- a/src/google/adk/models/lite_llm.py +++ b/src/google/adk/models/lite_llm.py @@ -64,9 +64,25 @@ _NEW_LINE = "\n" _EXCLUDED_PART_FIELD = {"inline_data": {"data"}} +# Mapping of LiteLLM finish_reason strings to FinishReason enum values +# Note: tool_calls/function_call map to STOP because: +# 1. FinishReason.TOOL_CALL enum does not exist (as of google-genai 0.8.0) +# 2. Tool calls represent normal completion (model stopped to invoke tools) +# 3. Gemini native responses use STOP for tool calls (see lite_llm.py:910) +_FINISH_REASON_MAPPING = { + "length": types.FinishReason.MAX_TOKENS, + "stop": types.FinishReason.STOP, + "tool_calls": ( + types.FinishReason.STOP + ), # Normal completion with tool invocation + "function_call": types.FinishReason.STOP, # Legacy function call variant + "content_filter": types.FinishReason.SAFETY, +} + -class ChatCompletionFileUrlObject(TypedDict): +class ChatCompletionFileUrlObject(TypedDict, total=False): file_data: str + file_id: str format: str @@ -85,6 +101,7 @@ class UsageMetadataChunk(BaseModel): prompt_tokens: int completion_tokens: int total_tokens: int + cached_prompt_tokens: int = 0 class LiteLLMClient: @@ -154,6 +171,106 @@ def _safe_json_serialize(obj) -> str: return str(obj) +def _part_has_payload(part: types.Part) -> bool: + """Checks whether a Part contains usable payload for the model.""" + if part.text: + return True + if part.inline_data and part.inline_data.data: + return True + if part.file_data and (part.file_data.file_uri or part.file_data.data): + return True + return False + + +def _append_fallback_user_content_if_missing( + llm_request: LlmRequest, +) -> None: + """Ensures there is a user message with content for LiteLLM backends. + + Args: + llm_request: The request that may need a fallback user message. + """ + for content in reversed(llm_request.contents): + if content.role == "user": + parts = content.parts or [] + if any(_part_has_payload(part) for part in parts): + return + if not parts: + content.parts = [] + content.parts.append( + types.Part.from_text( + text="Handle the requests as specified in the System Instruction." + ) + ) + return + llm_request.contents.append( + types.Content( + role="user", + parts=[ + types.Part.from_text( + text=( + "Handle the requests as specified in the System" + " Instruction." + ) + ), + ], + ) + ) + + +def _extract_cached_prompt_tokens(usage: Any) -> int: + """Extracts cached prompt tokens from LiteLLM usage. + + Providers expose cached token metrics in different shapes. Common patterns: + - usage["prompt_tokens_details"]["cached_tokens"] (OpenAI/Azure style) + - usage["prompt_tokens_details"] is a list of dicts with cached_tokens + - usage["cached_prompt_tokens"] (LiteLLM-normalized for some providers) + - usage["cached_tokens"] (flat) + + Args: + usage: Usage dictionary from LiteLLM response. + + Returns: + Integer number of cached prompt tokens if present; otherwise 0. + """ + try: + usage_dict = usage + if hasattr(usage, "model_dump"): + usage_dict = usage.model_dump() + elif isinstance(usage, str): + try: + usage_dict = json.loads(usage) + except json.JSONDecodeError: + return 0 + + if not isinstance(usage_dict, dict): + return 0 + + details = usage_dict.get("prompt_tokens_details") + if isinstance(details, dict): + value = details.get("cached_tokens") + if isinstance(value, int): + return value + elif isinstance(details, list): + total = sum( + item.get("cached_tokens", 0) + for item in details + if isinstance(item, dict) + and isinstance(item.get("cached_tokens"), int) + ) + if total > 0: + return total + + for key in ("cached_prompt_tokens", "cached_tokens"): + value = usage_dict.get(key) + if isinstance(value, int): + return value + except (TypeError, AttributeError) as e: + logger.debug("Error extracting cached prompt tokens: %s", e) + + return 0 + + def _content_to_message_param( content: types.Content, ) -> Union[Message, list[Message]]: @@ -251,36 +368,39 @@ def _get_content( ): base64_string = base64.b64encode(part.inline_data.data).decode("utf-8") data_uri = f"data:{part.inline_data.mime_type};base64,{base64_string}" + # LiteLLM providers extract the MIME type from the data URI; avoid + # passing a separate `format` field that some backends reject. if part.inline_data.mime_type.startswith("image"): - # Use full MIME type (e.g., "image/png") for providers that validate it - format_type = part.inline_data.mime_type content_objects.append({ "type": "image_url", - "image_url": {"url": data_uri, "format": format_type}, + "image_url": {"url": data_uri}, }) elif part.inline_data.mime_type.startswith("video"): - # Use full MIME type (e.g., "video/mp4") for providers that validate it - format_type = part.inline_data.mime_type content_objects.append({ "type": "video_url", - "video_url": {"url": data_uri, "format": format_type}, + "video_url": {"url": data_uri}, }) elif part.inline_data.mime_type.startswith("audio"): - # Use full MIME type (e.g., "audio/mpeg") for providers that validate it - format_type = part.inline_data.mime_type content_objects.append({ "type": "audio_url", - "audio_url": {"url": data_uri, "format": format_type}, + "audio_url": {"url": data_uri}, }) elif part.inline_data.mime_type == "application/pdf": - format_type = part.inline_data.mime_type content_objects.append({ "type": "file", - "file": {"file_data": data_uri, "format": format_type}, + "file": {"file_data": data_uri}, }) else: raise ValueError("LiteLlm(BaseLlm) does not support this content part.") + elif part.file_data and part.file_data.file_uri: + file_object: ChatCompletionFileUrlObject = { + "file_id": part.file_data.file_uri, + } + content_objects.append({ + "type": "file", + "file": file_object, + }) return content_objects @@ -311,8 +431,8 @@ def _to_litellm_role(role: Optional[str]) -> Literal["user", "assistant"]: def _schema_to_dict(schema: types.Schema) -> dict: - """ - Recursively converts a types.Schema to a pure-python dict + """Recursively converts a types.Schema to a pure-python dict + with all enum values written as lower-case strings. Args: @@ -437,10 +557,17 @@ def _model_response_to_chunk( for tool_call in message.get("tool_calls"): # aggregate tool_call if tool_call.type == "function": + func_name = tool_call.function.name + func_args = tool_call.function.arguments + + # Ignore empty chunks that don't carry any information. + if not func_name and not func_args: + continue + yield FunctionChunk( id=tool_call.id, - name=tool_call.function.name, - args=tool_call.function.arguments, + name=func_name, + args=func_args, index=tool_call.index, ), finish_reason @@ -460,6 +587,7 @@ def _model_response_to_chunk( prompt_tokens=response["usage"].get("prompt_tokens", 0), completion_tokens=response["usage"].get("completion_tokens", 0), total_tokens=response["usage"].get("total_tokens", 0), + cached_prompt_tokens=_extract_cached_prompt_tokens(response["usage"]), ), None @@ -476,30 +604,49 @@ def _model_response_to_generate_content_response( """ message = None - if response.get("choices", None): - message = response["choices"][0].get("message", None) + finish_reason = None + if (choices := response.get("choices")) and choices: + first_choice = choices[0] + message = first_choice.get("message", None) + finish_reason = first_choice.get("finish_reason", None) if not message: raise ValueError("No message in response") - llm_response = _message_to_generate_content_response(message) + llm_response = _message_to_generate_content_response( + message, model_version=response.model + ) + if finish_reason: + # If LiteLLM already provides a FinishReason enum (e.g., for Gemini), use + # it directly. Otherwise, map the finish_reason string to the enum. + if isinstance(finish_reason, types.FinishReason): + llm_response.finish_reason = finish_reason + else: + finish_reason_str = str(finish_reason).lower() + llm_response.finish_reason = _FINISH_REASON_MAPPING.get( + finish_reason_str, types.FinishReason.OTHER + ) if response.get("usage", None): llm_response.usage_metadata = types.GenerateContentResponseUsageMetadata( prompt_token_count=response["usage"].get("prompt_tokens", 0), candidates_token_count=response["usage"].get("completion_tokens", 0), total_token_count=response["usage"].get("total_tokens", 0), + cached_content_token_count=_extract_cached_prompt_tokens( + response["usage"] + ), ) return llm_response def _message_to_generate_content_response( - message: Message, is_partial: bool = False + message: Message, *, is_partial: bool = False, model_version: str = None ) -> LlmResponse: """Converts a litellm message to LlmResponse. Args: message: The message to convert. is_partial: Whether the message is partial. + model_version: The model version used to generate the response. Returns: The LlmResponse. @@ -520,7 +667,9 @@ def _message_to_generate_content_response( parts.append(part) return LlmResponse( - content=types.Content(role="model", parts=parts), partial=is_partial + content=types.Content(role="model", parts=parts), + partial=is_partial, + model_version=model_version, ) @@ -538,7 +687,8 @@ def _get_completion_inputs( llm_request: The LlmRequest to convert. Returns: - The litellm inputs (message list, tool dictionary, response format and generation params). + The litellm inputs (message list, tool dictionary, response format and + generation params). """ # 1. Construct messages messages: List[Message] = [] @@ -774,10 +924,11 @@ def __init__(self, model: str, **kwargs): model: The name of the LiteLlm model. **kwargs: Additional arguments to pass to the litellm completion api. """ + drop_params = kwargs.pop("drop_params", None) super().__init__(model=model, **kwargs) # Warn if using Gemini via LiteLLM _warn_gemini_via_litellm(model) - self._additional_args = kwargs + self._additional_args = dict(kwargs) # preventing generation call with llm_client # and overriding messages, tools and stream which are managed internally self._additional_args.pop("llm_client", None) @@ -785,6 +936,8 @@ def __init__(self, model: str, **kwargs): self._additional_args.pop("tools", None) # public api called from runner determines to stream or not self._additional_args.pop("stream", None) + if drop_params is not None: + self._additional_args["drop_params"] = drop_params async def generate_content_async( self, llm_request: LlmRequest, stream: bool = False @@ -800,6 +953,7 @@ async def generate_content_async( """ self._maybe_append_user_content(llm_request) + _append_fallback_user_content_if_missing(llm_request) logger.debug(_build_request_log(llm_request)) messages, tools, response_format, generation_params = ( @@ -811,7 +965,7 @@ async def generate_content_async( tools = None completion_args = { - "model": self.model, + "model": llm_request.model or self.model, "messages": messages, "tools": tools, "response_format": response_format, @@ -826,6 +980,7 @@ async def generate_content_async( # Track function calls by index function_calls = {} # index -> {name, args, id} completion_args["stream"] = True + completion_args["stream_options"] = {"include_usage": True} aggregated_llm_response = None aggregated_llm_response_with_tool_call = None usage_metadata = None @@ -861,12 +1016,14 @@ async def generate_content_async( content=chunk.text, ), is_partial=True, + model_version=part.model, ) elif isinstance(chunk, UsageMetadataChunk): usage_metadata = types.GenerateContentResponseUsageMetadata( prompt_token_count=chunk.prompt_tokens, candidates_token_count=chunk.completion_tokens, total_token_count=chunk.total_tokens, + cached_content_token_count=chunk.cached_prompt_tokens, ) if ( @@ -892,14 +1049,16 @@ async def generate_content_async( role="assistant", content=text, tool_calls=tool_calls, - ) + ), + model_version=part.model, ) ) text = "" function_calls.clear() elif finish_reason == "stop" and text: aggregated_llm_response = _message_to_generate_content_response( - ChatCompletionAssistantMessage(role="assistant", content=text) + ChatCompletionAssistantMessage(role="assistant", content=text), + model_version=part.model, ) text = "" diff --git a/src/google/adk/models/llm_request.py b/src/google/adk/models/llm_request.py index b83fd1d999..04a61fd9eb 100644 --- a/src/google/adk/models/llm_request.py +++ b/src/google/adk/models/llm_request.py @@ -14,14 +14,18 @@ from __future__ import annotations +import logging from typing import Optional +from typing import Union from google.genai import types from pydantic import BaseModel from pydantic import ConfigDict from pydantic import Field +from ..agents.context_cache_config import ContextCacheConfig from ..tools.base_tool import BaseTool +from .cache_metadata import CacheMetadata def _find_tool_with_function_declarations( @@ -52,6 +56,8 @@ class LlmRequest(BaseModel): contents: The contents to send to the model. config: Additional config for the generate content request. tools_dict: The tools dictionary. + cache_config: Context cache configuration for this request. + cache_metadata: Cache metadata from previous requests, used for cache management. """ model_config = ConfigDict(arbitrary_types_allowed=True) @@ -76,17 +82,156 @@ class LlmRequest(BaseModel): tools_dict: dict[str, BaseTool] = Field(default_factory=dict, exclude=True) """The tools dictionary.""" - def append_instructions(self, instructions: list[str]) -> None: + cache_config: Optional[ContextCacheConfig] = None + """Context cache configuration for this request.""" + + cache_metadata: Optional[CacheMetadata] = None + """Cache metadata from previous requests, used for cache management.""" + + cacheable_contents_token_count: Optional[int] = None + """Token count from previous request's prompt, used for cache size validation.""" + + def append_instructions( + self, instructions: Union[list[str], types.Content] + ) -> list[types.Content]: """Appends instructions to the system instruction. Args: - instructions: The instructions to append. + instructions: The instructions to append. Can be: + - list[str]: Strings to append/concatenate to system instruction + - types.Content: Content object to append to system instruction + + Returns: + List of user contents from non-text parts (when instructions is types.Content + with non-text parts). Empty list otherwise. + + Note: Model API requires system_instruction to be a string. Non-text parts + in Content are processed with references in system_instruction and returned + as user contents. + + Behavior: + - list[str]: concatenates with existing system_instruction using \\n\\n + - types.Content: extracts text parts with references to non-text parts, + returns non-text parts as user contents """ - if self.config.system_instruction: - self.config.system_instruction += '\n\n' + '\n\n'.join(instructions) - else: - self.config.system_instruction = '\n\n'.join(instructions) + # Handle Content object + if isinstance(instructions, types.Content): + text_parts = [] + user_contents = [] + + # Process all parts, creating references for non-text parts + non_text_count = 0 + for part in instructions.parts: + if part.text: + # Text part - add to system instruction + text_parts.append(part.text) + elif part.inline_data: + # Inline data part - create reference and user content + reference_id = f"inline_data_{non_text_count}" + non_text_count += 1 + + # Create descriptive reference based on mime_type and display_name + display_info = [] + if part.inline_data.display_name: + display_info.append(f"'{part.inline_data.display_name}'") + if part.inline_data.mime_type: + display_info.append(f"type: {part.inline_data.mime_type}") + + display_text = f" ({', '.join(display_info)})" if display_info else "" + reference_text = ( + f"[Reference to inline binary data: {reference_id}{display_text}]" + ) + text_parts.append(reference_text) + + # Create user content with reference and data + user_content = types.Content( + role="user", + parts=[ + types.Part.from_text( + text=f"Referenced inline data: {reference_id}" + ), + types.Part(inline_data=part.inline_data), + ], + ) + user_contents.append(user_content) + + elif part.file_data: + # File data part - create reference and user content + reference_id = f"file_data_{non_text_count}" + non_text_count += 1 + + # Create descriptive reference based on file_uri and display_name + display_info = [] + if part.file_data.display_name: + display_info.append(f"'{part.file_data.display_name}'") + if part.file_data.file_uri: + display_info.append(f"URI: {part.file_data.file_uri}") + if part.file_data.mime_type: + display_info.append(f"type: {part.file_data.mime_type}") + + display_text = f" ({', '.join(display_info)})" if display_info else "" + reference_text = ( + f"[Reference to file data: {reference_id}{display_text}]" + ) + text_parts.append(reference_text) + + # Create user content with reference and file data + user_content = types.Content( + role="user", + parts=[ + types.Part.from_text( + text=f"Referenced file data: {reference_id}" + ), + types.Part(file_data=part.file_data), + ], + ) + user_contents.append(user_content) + + # Handle text parts for system instruction + if text_parts: + new_text = "\n\n".join(text_parts) + if not self.config.system_instruction: + self.config.system_instruction = new_text + elif isinstance(self.config.system_instruction, str): + self.config.system_instruction += "\n\n" + new_text + else: + # Log warning for unsupported system_instruction types + logging.warning( + "Cannot append to system_instruction of unsupported type: %s. " + "Only string system_instruction is supported.", + type(self.config.system_instruction), + ) + + # Add user contents directly to llm_request.contents + if user_contents: + self.contents.extend(user_contents) + + return user_contents + + # Handle list of strings + if isinstance(instructions, list) and all( + isinstance(inst, str) for inst in instructions + ): + if not instructions: # Handle empty list + return [] + + new_text = "\n\n".join(instructions) + if not self.config.system_instruction: + self.config.system_instruction = new_text + elif isinstance(self.config.system_instruction, str): + self.config.system_instruction += "\n\n" + new_text + else: + # Log warning for unsupported system_instruction types + logging.warning( + "Cannot append to system_instruction of unsupported type: %s. " + "Only string system_instruction is supported.", + type(self.config.system_instruction), + ) + return [] + + # Invalid input + raise TypeError("instructions must be list[str] or types.Content") def append_tools(self, tools: list[BaseTool]) -> None: """Appends tools to the request. @@ -128,4 +273,4 @@ def set_output_schema(self, base_model: type[BaseModel]) -> None: """ self.config.response_schema = base_model - self.config.response_mime_type = 'application/json' + self.config.response_mime_type = "application/json" diff --git a/src/google/adk/models/llm_response.py b/src/google/adk/models/llm_response.py index fd14ff2d87..dfe77fffdd 100644 --- a/src/google/adk/models/llm_response.py +++ b/src/google/adk/models/llm_response.py @@ -22,6 +22,8 @@ from pydantic import BaseModel from pydantic import ConfigDict +from .cache_metadata import CacheMetadata + class LlmResponse(BaseModel): """LLM response class that provides the first candidate response from the @@ -42,6 +44,8 @@ class LlmResponse(BaseModel): custom_metadata: The custom metadata of the LlmResponse. input_transcription: Audio transcription of user input. output_transcription: Audio transcription of model output. + avg_logprobs: Average log probability of the generated tokens. + logprobs_result: Detailed log probabilities for chosen and top candidate tokens. """ model_config = ConfigDict( @@ -51,6 +55,9 @@ class LlmResponse(BaseModel): ) """The pydantic model config.""" + model_version: Optional[str] = None + """Output only. The model version used to generate the response.""" + content: Optional[types.Content] = None """The generative content of the response. @@ -109,6 +116,25 @@ class LlmResponse(BaseModel): output_transcription: Optional[types.Transcription] = None """Audio transcription of model output.""" + avg_logprobs: Optional[float] = None + """Average log probability of the generated tokens.""" + + logprobs_result: Optional[types.LogprobsResult] = None + """Detailed log probabilities for chosen and top candidate tokens.""" + + cache_metadata: Optional[CacheMetadata] = None + """Context cache metadata if caching was used for this response. + + Contains cache identification, usage tracking, and lifecycle information. + This field is automatically populated when context caching is enabled. + """ + + citation_metadata: Optional[types.CitationMetadata] = None + """Citation metadata for the response. + + This field is automatically populated when citation is enabled. + """ + @staticmethod def create( generate_content_response: types.GenerateContentResponse, @@ -125,19 +151,29 @@ def create( usage_metadata = generate_content_response.usage_metadata if generate_content_response.candidates: candidate = generate_content_response.candidates[0] - if candidate.content and candidate.content.parts: + if ( + candidate.content and candidate.content.parts + ) or candidate.finish_reason == types.FinishReason.STOP: return LlmResponse( content=candidate.content, grounding_metadata=candidate.grounding_metadata, usage_metadata=usage_metadata, finish_reason=candidate.finish_reason, + citation_metadata=candidate.citation_metadata, + avg_logprobs=candidate.avg_logprobs, + logprobs_result=candidate.logprobs_result, + model_version=generate_content_response.model_version, ) else: return LlmResponse( error_code=candidate.finish_reason, error_message=candidate.finish_message, + citation_metadata=candidate.citation_metadata, usage_metadata=usage_metadata, finish_reason=candidate.finish_reason, + avg_logprobs=candidate.avg_logprobs, + logprobs_result=candidate.logprobs_result, + model_version=generate_content_response.model_version, ) else: if generate_content_response.prompt_feedback: @@ -146,10 +182,12 @@ def create( error_code=prompt_feedback.block_reason, error_message=prompt_feedback.block_reason_message, usage_metadata=usage_metadata, + model_version=generate_content_response.model_version, ) else: return LlmResponse( error_code='UNKNOWN_ERROR', error_message='Unknown error.', usage_metadata=usage_metadata, + model_version=generate_content_response.model_version, ) diff --git a/src/google/adk/plugins/__init__.py b/src/google/adk/plugins/__init__.py index b0c771ede5..c824622091 100644 --- a/src/google/adk/plugins/__init__.py +++ b/src/google/adk/plugins/__init__.py @@ -13,5 +13,13 @@ # limitations under the License. from .base_plugin import BasePlugin +from .logging_plugin import LoggingPlugin +from .plugin_manager import PluginManager +from .reflect_retry_tool_plugin import ReflectAndRetryToolPlugin -__all__ = ['BasePlugin'] +__all__ = [ + 'BasePlugin', + 'LoggingPlugin', + 'PluginManager', + 'ReflectAndRetryToolPlugin', +] diff --git a/src/google/adk/plugins/base_plugin.py b/src/google/adk/plugins/base_plugin.py index c35c08f676..fb3e3c00f8 100644 --- a/src/google/adk/plugins/base_plugin.py +++ b/src/google/adk/plugins/base_plugin.py @@ -173,7 +173,7 @@ async def on_event_callback( async def after_run_callback( self, *, invocation_context: InvocationContext - ) -> Optional[None]: + ) -> None: """Callback executed after an ADK runner run has completed. This is the final callback in the ADK lifecycle, suitable for cleanup, final @@ -211,17 +211,14 @@ async def after_agent_callback( ) -> Optional[types.Content]: """Callback executed after an agent's primary logic has completed. - This callback can be used to inspect, log, or modify the agent's final - result before it is returned. - Args: agent: The agent that has just run. callback_context: The context for the agent invocation. Returns: - An optional `types.Content` object. If a value is returned, it will - replace the agent's original result. Returning `None` uses the original, - unmodified result. + An optional `types.Content` object. The content to return to the user. + When the content is present, the provided content will be used as agent + response and appended to event history as agent response. """ pass diff --git a/src/google/adk/plugins/bigquery_logging_plugin.py b/src/google/adk/plugins/bigquery_logging_plugin.py new file mode 100644 index 0000000000..6a9f4db77a --- /dev/null +++ b/src/google/adk/plugins/bigquery_logging_plugin.py @@ -0,0 +1,612 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from __future__ import annotations + +import asyncio +import dataclasses +from datetime import datetime +from datetime import timezone +import json +import logging +import threading +from typing import Any +from typing import Callable +from typing import Dict +from typing import List +from typing import Optional +from typing import TYPE_CHECKING + +import google.api_core.client_info +import google.auth +from google.auth import exceptions as auth_exceptions +from google.cloud import bigquery +from google.cloud import exceptions as cloud_exceptions +from google.genai import types + +from .. import version +from ..agents.base_agent import BaseAgent +from ..agents.callback_context import CallbackContext +from ..events.event import Event +from ..models.llm_request import LlmRequest +from ..models.llm_response import LlmResponse +from ..tools.base_tool import BaseTool +from ..tools.tool_context import ToolContext +from .base_plugin import BasePlugin + +if TYPE_CHECKING: + from ..agents.invocation_context import InvocationContext + + +@dataclasses.dataclass +class BigQueryLoggerConfig: + """Configuration for the BigQueryAgentAnalyticsPlugin. + + Attributes: + enabled: Whether the plugin is enabled. + event_allowlist: List of event types to log. If None, all are allowed + except those in event_denylist. + event_denylist: List of event types to not log. Takes precedence over + event_allowlist. + content_formatter: Function to format or redact the 'content' field before + logging. + """ + + enabled: bool = True + event_allowlist: Optional[List[str]] = None + event_denylist: Optional[List[str]] = None + content_formatter: Optional[Callable[[Any], str]] = None + + +def _get_event_type(event: Event) -> str: + if event.author == "user": + return "USER_INPUT" + if event.get_function_calls(): + return "TOOL_CALL" + if event.get_function_responses(): + return "TOOL_RESULT" + if event.content and event.content.parts: + return "MODEL_RESPONSE" + if event.error_message: + return "ERROR" + return "SYSTEM" # Fallback for other event types + + +def _format_content( + content: Optional[types.Content], max_length: int = 200 +) -> str: + """Format content for logging, truncating if too long.""" + if not content or not content.parts: + return "None" + parts = [] + for part in content.parts: + if part.text: + text = part.text.strip() + if len(text) > max_length: + text = text[:max_length] + "..." + parts.append(f"text: '{text}'") + elif part.function_call: + parts.append(f"function_call: {part.function_call.name}") + elif part.function_response: + parts.append(f"function_response: {part.function_response.name}") + elif part.code_execution_result: + parts.append("code_execution_result") + else: + parts.append("other_part") + return " | ".join(parts) + + +def _format_args(args: dict[str, Any], max_length: int = 300) -> str: + """Format arguments dictionary for logging.""" + if not args: + return "{}" + formatted = str(args) + if len(formatted) > max_length: + formatted = formatted[:max_length] + "...}" + return formatted + + +class BigQueryAgentAnalyticsPlugin(BasePlugin): + """A plugin that logs ADK events to a BigQuery table. + + This plugin captures critical events during an agent invocation and logs them + as structured data to the specified BigQuery table. This allows for + persistent storage, auditing, and analysis of agent interactions. + + The plugin logs the following information at each callback point: + - User messages and invocation context + - Agent execution flow (start and completion) + - LLM requests and responses (including token usage in content) + - Tool calls with arguments and results + - Events yielded by agents + - Errors during model and tool execution + + Each log entry includes a timestamp, event type, agent name, session ID, + invocation ID, user ID, content payload, and any error messages. + + Logging behavior can be customized using the BigQueryLoggerConfig. + """ + + def __init__( + self, + project_id: str, + dataset_id: str, + table_id: str = "agent_events", + config: Optional[BigQueryLoggerConfig] = None, + **kwargs, + ): + super().__init__(name=kwargs.get("name", "BigQueryAgentAnalyticsPlugin")) + self._project_id = project_id + self._dataset_id = dataset_id + self._table_id = table_id + self._config = config if config else BigQueryLoggerConfig() + self._bq_client: bigquery.Client | None = None + self._client_init_lock = threading.Lock() + self._init_done = False + self._init_succeeded = False + + if not self._config.enabled: + logging.info( + "BigQueryAgentAnalyticsPlugin %s is disabled by configuration.", + self.name, + ) + return + + logging.debug( + "DEBUG: BigQueryAgentAnalyticsPlugin INSTANTIATED (Name: %s)", self.name + ) + + def _ensure_initialized_sync(self): + """Synchronous initialization of BQ client and table.""" + if not self._config.enabled: + return + + with self._client_init_lock: + if self._init_done: + return + self._init_done = True + try: + credentials, _ = google.auth.default( + scopes=["https://www.googleapis.com/auth/bigquery"] + ) + client_info = google.api_core.client_info.ClientInfo( + user_agent=f"google-adk-bq-logger/{version.__version__}" + ) + self._bq_client = bigquery.Client( + project=self._project_id, + credentials=credentials, + client_info=client_info, + ) + logging.info( + "BigQuery client initialized for project %s", self._project_id + ) + dataset_ref = self._bq_client.dataset(self._dataset_id) + self._bq_client.create_dataset(dataset_ref, exists_ok=True) + logging.info("Dataset %s ensured to exist.", self._dataset_id) + table_ref = dataset_ref.table(self._table_id) + # Schema without separate token columns + schema = [ + bigquery.SchemaField("timestamp", "TIMESTAMP"), + bigquery.SchemaField("event_type", "STRING"), + bigquery.SchemaField("agent", "STRING"), + bigquery.SchemaField("session_id", "STRING"), + bigquery.SchemaField("invocation_id", "STRING"), + bigquery.SchemaField("user_id", "STRING"), + bigquery.SchemaField("content", "STRING"), + bigquery.SchemaField("error_message", "STRING"), + ] + table = bigquery.Table(table_ref, schema=schema) + self._bq_client.create_table(table, exists_ok=True) + logging.info("Table %s ensured to exist.", self._table_id) + self._init_succeeded = True + except ( + auth_exceptions.GoogleAuthError, + cloud_exceptions.GoogleCloudError, + ) as e: + logging.exception( + "Failed to initialize BigQuery client or table: %s", e + ) + self._init_succeeded = False + + async def _log_to_bigquery_async(self, event_dict: dict[str, Any]): + if not self._config.enabled: + return + + event_type = event_dict.get("event_type") + + # Check denylist + if ( + self._config.event_denylist + and event_type in self._config.event_denylist + ): + return + + # Check allowlist + if ( + self._config.event_allowlist + and event_type not in self._config.event_allowlist + ): + return + + # Apply custom content formatter + if self._config.content_formatter and "content" in event_dict: + try: + event_dict["content"] = self._config.content_formatter( + event_dict["content"] + ) + except Exception as e: + logging.warning( + "Error applying custom content formatter for event type %s: %s", + event_type, + e, + ) + # Optionally log a generic message or the error + + def _sync_log(): + self._ensure_initialized_sync() + if not self._init_succeeded or not self._bq_client: + return + table_ref = self._bq_client.dataset(self._dataset_id).table( + self._table_id + ) + default_row = { + "timestamp": datetime.now(timezone.utc).isoformat(), + "event_type": None, + "agent": None, + "session_id": None, + "invocation_id": None, + "user_id": None, + "content": None, + "error_message": None, + } + insert_row = {**default_row, **event_dict} + + errors = self._bq_client.insert_rows_json(table_ref, [insert_row]) + if errors: + logging.error( + "Errors occurred while inserting to BigQuery table %s.%s: %s", + self._dataset_id, + self._table_id, + errors, + ) + + try: + await asyncio.to_thread(_sync_log) + except ( + cloud_exceptions.GoogleCloudError, + auth_exceptions.GoogleAuthError, + ) as e: + logging.exception("Failed to log to BigQuery: %s", e) + + async def on_user_message_callback( + self, + *, + invocation_context: InvocationContext, + user_message: types.Content, + ) -> Optional[types.Content]: + """Log user message and invocation start.""" + event_dict = { + "timestamp": datetime.now(timezone.utc).isoformat(), + "event_type": "USER_MESSAGE_RECEIVED", + "agent": invocation_context.agent.name, + "session_id": invocation_context.session.id, + "invocation_id": invocation_context.invocation_id, + "user_id": invocation_context.session.user_id, + "content": f"User Content: {_format_content(user_message)}", + } + await self._log_to_bigquery_async(event_dict) + return None + + async def before_run_callback( + self, *, invocation_context: InvocationContext + ) -> Optional[types.Content]: + """Log invocation start.""" + event_dict = { + "timestamp": datetime.now(timezone.utc).isoformat(), + "event_type": "INVOCATION_STARTING", + "agent": invocation_context.agent.name, + "session_id": invocation_context.session.id, + "invocation_id": invocation_context.invocation_id, + "user_id": invocation_context.session.user_id, + "content": None, + } + await self._log_to_bigquery_async(event_dict) + return None + + async def on_event_callback( + self, *, invocation_context: InvocationContext, event: Event + ) -> Optional[Event]: + """Logs event data to BigQuery.""" + event_dict = { + "timestamp": datetime.fromtimestamp( + event.timestamp, timezone.utc + ).isoformat(), + "event_type": _get_event_type(event), + "agent": event.author, + "session_id": invocation_context.session.id, + "invocation_id": invocation_context.invocation_id, + "user_id": invocation_context.session.user_id, + "content": ( + json.dumps( + [part.model_dump(mode="json") for part in event.content.parts] + ) + if event.content and event.content.parts + else None + ), + "error_message": event.error_message, + } + await self._log_to_bigquery_async(event_dict) + return None + + async def after_run_callback( + self, *, invocation_context: InvocationContext + ) -> Optional[None]: + """Log invocation completion.""" + event_dict = { + "timestamp": datetime.now(timezone.utc).isoformat(), + "event_type": "INVOCATION_COMPLETED", + "agent": invocation_context.agent.name, + "session_id": invocation_context.session.id, + "invocation_id": invocation_context.invocation_id, + "user_id": invocation_context.session.user_id, + "content": None, + } + await self._log_to_bigquery_async(event_dict) + return None + + async def before_agent_callback( + self, *, agent: BaseAgent, callback_context: CallbackContext + ) -> Optional[types.Content]: + """Log agent execution start.""" + event_dict = { + "timestamp": datetime.now(timezone.utc).isoformat(), + "event_type": "AGENT_STARTING", + "agent": agent.name, + "session_id": callback_context.session.id, + "invocation_id": callback_context.invocation_id, + "user_id": callback_context.session.user_id, + "content": f"Agent Name: {callback_context.agent_name}", + } + await self._log_to_bigquery_async(event_dict) + return None + + async def after_agent_callback( + self, *, agent: BaseAgent, callback_context: CallbackContext + ) -> Optional[types.Content]: + """Log agent execution completion.""" + event_dict = { + "timestamp": datetime.now(timezone.utc).isoformat(), + "event_type": "AGENT_COMPLETED", + "agent": agent.name, + "session_id": callback_context.session.id, + "invocation_id": callback_context.invocation_id, + "user_id": callback_context.session.user_id, + "content": f"Agent Name: {callback_context.agent_name}", + } + await self._log_to_bigquery_async(event_dict) + return None + + async def before_model_callback( + self, *, callback_context: CallbackContext, llm_request: LlmRequest + ) -> Optional[LlmResponse]: + """Log LLM request before sending to model, including the full system instruction.""" + + content_parts = [ + f"Model: {llm_request.model or 'default'}", + ] + + # Log Full System Instruction + system_instruction_text = "None" + if llm_request.config and hasattr(llm_request.config, "system_instruction"): + si = llm_request.config.system_instruction + if si: + if isinstance(si, str): + system_instruction_text = si + elif hasattr(si, "__iter__"): # Handles list, tuple, etc. of parts + # Join parts together to form the complete system instruction + system_instruction_text = "".join( + part.text for part in si if hasattr(part, "text") + ) + else: + system_instruction_text = str(si) + else: + system_instruction_text = "Empty" + + content_parts.append(f"System Prompt: {system_instruction_text}") + + # Log Generation Config Parameters + if llm_request.config: + config = llm_request.config + params_to_log = {} + if hasattr(config, "temperature") and config.temperature is not None: + params_to_log["temperature"] = config.temperature + if hasattr(config, "top_p") and config.top_p is not None: + params_to_log["top_p"] = config.top_p + if hasattr(config, "top_k") and config.top_k is not None: + params_to_log["top_k"] = config.top_k + if ( + hasattr(config, "max_output_tokens") + and config.max_output_tokens is not None + ): + params_to_log["max_output_tokens"] = config.max_output_tokens + + if params_to_log: + params_str = ", ".join([f"{k}={v}" for k, v in params_to_log.items()]) + content_parts.append(f"Params: {{{params_str}}}") + + if llm_request.tools_dict: + content_parts.append( + f"Available Tools: {list(llm_request.tools_dict.keys())}" + ) + + final_content = " | ".join(content_parts) + + event_dict = { + "timestamp": datetime.now(timezone.utc).isoformat(), + "event_type": "LLM_REQUEST", + "agent": callback_context.agent_name, + "session_id": callback_context.session.id, + "invocation_id": callback_context.invocation_id, + "user_id": callback_context.session.user_id, + "content": final_content, + } + await self._log_to_bigquery_async(event_dict) + return None + + async def after_model_callback( + self, *, callback_context: CallbackContext, llm_response: LlmResponse + ) -> Optional[LlmResponse]: + """Log LLM response after receiving from model.""" + content_parts = [] + content = llm_response.content + is_tool_call = False + if content and content.parts: + is_tool_call = any(part.function_call for part in content.parts) + + if is_tool_call: + # Explicitly state Tool Name + fc_names = [] + if content and content.parts: + fc_names = [ + part.function_call.name + for part in content.parts + if part.function_call + ] + content_parts.append(f"Tool Name: {', '.join(fc_names)}") + else: + # This is a text response + text_content = _format_content( + llm_response.content + ) # This returns something like "text: 'The actual message...'" + content_parts.append(f"Tool Name: text_response, {text_content}") + + if llm_response.usage_metadata: + prompt_tokens = getattr( + llm_response.usage_metadata, "prompt_token_count", "N/A" + ) + candidates_tokens = getattr( + llm_response.usage_metadata, "candidates_token_count", "N/A" + ) + total_tokens = getattr( + llm_response.usage_metadata, "total_token_count", "N/A" + ) + token_usage_str = ( + f"Token Usage: {{prompt: {prompt_tokens}, candidates:" + f" {candidates_tokens}, total: {total_tokens}}}" + ) + content_parts.append(token_usage_str) + + final_content = " | ".join(content_parts) + + event_dict = { + "timestamp": datetime.now(timezone.utc).isoformat(), + "event_type": "LLM_RESPONSE", + "agent": callback_context.agent_name, + "session_id": callback_context.session.id, + "invocation_id": callback_context.invocation_id, + "user_id": callback_context.session.user_id, + "content": final_content, + "error_message": ( + llm_response.error_message if llm_response.error_code else None + ), + } + await self._log_to_bigquery_async(event_dict) + return None + + async def before_tool_callback( + self, + *, + tool: BaseTool, + tool_args: dict[str, Any], + tool_context: ToolContext, + ) -> Optional[None]: + """Log tool execution start.""" + event_dict = { + "timestamp": datetime.now(timezone.utc).isoformat(), + "event_type": "TOOL_STARTING", + "agent": tool_context.agent_name, + "session_id": tool_context.session.id, + "invocation_id": tool_context.invocation_id, + "user_id": tool_context.session.user_id, + "content": ( + f"Tool Name: {tool.name}, Description: {tool.description}," + f" Arguments: {_format_args(tool_args)}" + ), + } + await self._log_to_bigquery_async(event_dict) + return None + + async def after_tool_callback( + self, + *, + tool: BaseTool, + tool_args: dict[str, Any], + tool_context: ToolContext, + result: dict[str, Any], + ) -> None: + """Log tool execution completion.""" + event_dict = { + "timestamp": datetime.now(timezone.utc).isoformat(), + "event_type": "TOOL_COMPLETED", + "agent": tool_context.agent_name, + "session_id": tool_context.session.id, + "invocation_id": tool_context.invocation_id, + "user_id": tool_context.session.user_id, + "content": f"Tool Name: {tool.name}, Result: {_format_args(result)}", + } + await self._log_to_bigquery_async(event_dict) + return None + + async def on_model_error_callback( + self, + *, + callback_context: CallbackContext, + llm_request: LlmRequest, + error: Exception, + ) -> Optional[LlmResponse]: + """Log LLM error.""" + event_dict = { + "timestamp": datetime.now(timezone.utc).isoformat(), + "event_type": "LLM_ERROR", + "agent": callback_context.agent_name, + "session_id": callback_context.session.id, + "invocation_id": callback_context.invocation_id, + "user_id": callback_context.session.user_id, + "error_message": str(error), + } + await self._log_to_bigquery_async(event_dict) + return None + + async def on_tool_error_callback( + self, + *, + tool: BaseTool, + tool_args: dict[str, Any], + tool_context: ToolContext, + error: Exception, + ) -> None: + """Log tool error.""" + event_dict = { + "timestamp": datetime.now(timezone.utc).isoformat(), + "event_type": "TOOL_ERROR", + "agent": tool_context.agent_name, + "session_id": tool_context.session.id, + "invocation_id": tool_context.invocation_id, + "user_id": tool_context.session.user_id, + "content": ( + f"Tool Name: {tool.name}, Arguments: {_format_args(tool_args)}" + ), + "error_message": str(error), + } + await self._log_to_bigquery_async(event_dict) + return None diff --git a/src/google/adk/plugins/context_filter_plugin.py b/src/google/adk/plugins/context_filter_plugin.py new file mode 100644 index 0000000000..b778de02ad --- /dev/null +++ b/src/google/adk/plugins/context_filter_plugin.py @@ -0,0 +1,88 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import logging +from typing import Callable +from typing import List +from typing import Optional + +from ..agents.callback_context import CallbackContext +from ..events.event import Event +from ..models.llm_request import LlmRequest +from ..models.llm_response import LlmResponse +from .base_plugin import BasePlugin + +logger = logging.getLogger("google_adk." + __name__) + + +class ContextFilterPlugin(BasePlugin): + """A plugin that filters the LLM context to reduce its size.""" + + def __init__( + self, + num_invocations_to_keep: Optional[int] = None, + custom_filter: Optional[Callable[[List[Event]], List[Event]]] = None, + name: str = "context_filter_plugin", + ): + """Initializes the context management plugin. + + Args: + num_invocations_to_keep: The number of last invocations to keep. An + invocation is defined as one or more consecutive user messages followed + by a model response. + custom_filter: A function to filter the context. + name: The name of the plugin instance. + """ + super().__init__(name) + self._num_invocations_to_keep = num_invocations_to_keep + self._custom_filter = custom_filter + + async def before_model_callback( + self, *, callback_context: CallbackContext, llm_request: LlmRequest + ) -> Optional[LlmResponse]: + """Filters the LLM request's context before it is sent to the model.""" + try: + contents = llm_request.contents + + if ( + self._num_invocations_to_keep is not None + and self._num_invocations_to_keep > 0 + ): + num_model_turns = sum(1 for c in contents if c.role == "model") + if num_model_turns >= self._num_invocations_to_keep: + model_turns_to_find = self._num_invocations_to_keep + split_index = 0 + for i in range(len(contents) - 1, -1, -1): + if contents[i].role == "model": + model_turns_to_find -= 1 + if model_turns_to_find == 0: + start_index = i + while ( + start_index > 0 and contents[start_index - 1].role == "user" + ): + start_index -= 1 + split_index = start_index + break + contents = contents[split_index:] + + if self._custom_filter: + contents = self._custom_filter(contents) + + llm_request.contents = contents + except Exception as e: + logger.error(f"Failed to reduce context for request: {e}") + + return None diff --git a/src/google/adk/plugins/global_instruction_plugin.py b/src/google/adk/plugins/global_instruction_plugin.py new file mode 100644 index 0000000000..ed2a6d4821 --- /dev/null +++ b/src/google/adk/plugins/global_instruction_plugin.py @@ -0,0 +1,130 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import inspect +from typing import Optional +from typing import TYPE_CHECKING +from typing import Union + +from google.adk.agents.callback_context import CallbackContext +from google.adk.agents.readonly_context import ReadonlyContext +from google.adk.models.llm_request import LlmRequest +from google.adk.models.llm_response import LlmResponse +from google.adk.plugins.base_plugin import BasePlugin +from google.adk.utils import instructions_utils + +if TYPE_CHECKING: + from google.adk.agents.llm_agent import InstructionProvider + from google.adk.agents.llm_agent import LlmAgent + + +class GlobalInstructionPlugin(BasePlugin): + """Plugin that provides global instructions functionality at the App level. + + This plugin replaces the deprecated global_instruction field on LlmAgent. + Global instructions are applied to all agents in the application, providing + a consistent way to set application-wide instructions, identity, or + personality. + + The plugin operates through the before_model_callback, allowing it to modify + LLM requests before they are sent to the model. + """ + + def __init__( + self, + global_instruction: Union[str, InstructionProvider] = "", + name: str = "global_instruction", + ) -> None: + """Initialize the GlobalInstructionPlugin. + + Args: + global_instruction: The instruction to apply globally. Can be a string or + an InstructionProvider function that takes ReadonlyContext and returns a + string (sync or async). + name: The name of the plugin (defaults to "global_instruction"). + """ + super().__init__(name=name) + self.global_instruction = global_instruction + + async def before_model_callback( + self, *, callback_context: CallbackContext, llm_request: LlmRequest + ) -> Optional[LlmResponse]: + """Apply global instructions to the LLM request. + + This callback is executed before each request is sent to the model, + allowing the plugin to inject global instructions into the request. + + Args: + callback_context: The context for the current agent call. + llm_request: The prepared request object to be sent to the model. + + Returns: + None to allow the LLM request to proceed normally. + """ + # Only process if we have a global instruction configured + if not self.global_instruction: + return None + + # Resolve the global instruction (handle both string and InstructionProvider) + final_global_instruction = await self._resolve_global_instruction( + callback_context + ) + + if not final_global_instruction: + return None + + # Make the global instruction the leading system instruction. + existing_instruction = llm_request.config.system_instruction + + if not existing_instruction: + llm_request.config.system_instruction = final_global_instruction + return None + + if isinstance(existing_instruction, str): + llm_request.config.system_instruction = ( + f"{final_global_instruction}\n\n{existing_instruction}" + ) + else: # It's an Iterable + # Convert to list to allow prepending + new_instruction_list = [final_global_instruction] + new_instruction_list.extend(list(existing_instruction)) + llm_request.config.system_instruction = new_instruction_list + + return None + + async def _resolve_global_instruction( + self, readonly_context: ReadonlyContext + ) -> str: + """Resolve the global instruction, handling both string and InstructionProvider. + + Args: + readonly_context: The readonly context for resolving instructions. + + Returns: + The fully resolved and processed global instruction string, ready to use. + """ + if isinstance(self.global_instruction, str): + # For string instructions, apply state injection + return await instructions_utils.inject_session_state( + self.global_instruction, readonly_context + ) + else: + # Handle InstructionProvider (callable) + # InstructionProvider already handles state internally, no injection needed + instruction = self.global_instruction(readonly_context) + if inspect.isawaitable(instruction): + instruction = await instruction + return instruction diff --git a/src/google/adk/plugins/logging_plugin.py b/src/google/adk/plugins/logging_plugin.py index 7f9b2e31a2..72d1ca83e2 100644 --- a/src/google/adk/plugins/logging_plugin.py +++ b/src/google/adk/plugins/logging_plugin.py @@ -16,12 +16,12 @@ from typing import Any from typing import Optional +from typing import TYPE_CHECKING from google.genai import types from ..agents.base_agent import BaseAgent from ..agents.callback_context import CallbackContext -from ..agents.invocation_context import InvocationContext from ..events.event import Event from ..models.llm_request import LlmRequest from ..models.llm_response import LlmResponse @@ -29,6 +29,9 @@ from ..tools.tool_context import ToolContext from .base_plugin import BasePlugin +if TYPE_CHECKING: + from ..agents.invocation_context import InvocationContext + class LoggingPlugin(BasePlugin): """A plugin that logs important information at each callback point. diff --git a/src/google/adk/plugins/plugin_manager.py b/src/google/adk/plugins/plugin_manager.py index 217dbb8be6..634f904385 100644 --- a/src/google/adk/plugins/plugin_manager.py +++ b/src/google/adk/plugins/plugin_manager.py @@ -102,7 +102,7 @@ def get_plugin(self, plugin_name: str) -> Optional[BasePlugin]: plugin_name: The name of the plugin to retrieve. Returns: - The plugin instance if found, otherwise `None`. + The plugin instance if found; otherwise, `None`. """ return next((p for p in self.plugins if p.name == plugin_name), None) diff --git a/src/google/adk/plugins/reflect_retry_tool_plugin.py b/src/google/adk/plugins/reflect_retry_tool_plugin.py new file mode 100644 index 0000000000..a3a0cc2572 --- /dev/null +++ b/src/google/adk/plugins/reflect_retry_tool_plugin.py @@ -0,0 +1,382 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import asyncio +from enum import Enum +import json +from typing import Any +from typing import Optional + +from pydantic import BaseModel + +from ..tools.base_tool import BaseTool +from ..tools.tool_context import ToolContext +from ..utils.feature_decorator import experimental +from .base_plugin import BasePlugin + +REFLECT_AND_RETRY_RESPONSE_TYPE = "ERROR_HANDLED_BY_REFLECT_AND_RETRY_PLUGIN" +GLOBAL_SCOPE_KEY = "__global_reflect_and_retry_scope__" + +# A mapping from a tool's name to its consecutive failure count. +PerToolFailuresCounter = dict[str, int] + + +class TrackingScope(Enum): + """Defines the lifecycle scope for tracking tool failure counts.""" + + INVOCATION = "invocation" + GLOBAL = "global" + + +class ToolFailureResponse(BaseModel): + """Response containing tool failure details and retry guidance.""" + + response_type: str = REFLECT_AND_RETRY_RESPONSE_TYPE + error_type: str = "" + error_details: str = "" + retry_count: int = 0 + reflection_guidance: str = "" + + +@experimental +class ReflectAndRetryToolPlugin(BasePlugin): + """Provides self-healing, concurrent-safe error recovery for tool failures. + + This plugin intercepts tool failures, provides structured guidance to the LLM + for reflection and correction, and retries the operation up to a configurable + limit. + + **Key Features:** + + - **Concurrency Safe:** Uses locking to safely handle parallel tool + executions + - **Configurable Scope:** Tracks failures per-invocation (default) or globally + using the `TrackingScope` enum. + - **Extensible Scoping:** The `_get_scope_key` method can be overridden to + implement custom tracking logic (e.g., per-user or per-session). + - **Granular Tracking:** Failure counts are tracked per-tool within the + defined scope. A success with one tool resets its counter without affecting + others. + - **Custom Error Extraction:** Supports detecting errors in normal tool + responses + that + don't throw exceptions, by overriding the `extract_error_from_result` + method. + + **Example:** + ```python + from my_project.plugins import ReflectAndRetryToolPlugin, TrackingScope + + # Example 1: (MOST COMMON USAGE): + # Track failures only within the current agent invocation (default). + error_handling_plugin = ReflectAndRetryToolPlugin(max_retries=3) + + # Example 2: + # Track failures globally across all turns and users. + global_error_handling_plugin = ReflectAndRetryToolPlugin(max_retries=5, + scope=TrackingScope.GLOBAL) + + # Example 3: + # Retry on failures but do not throw exceptions. + error_handling_plugin = + ReflectAndRetryToolPlugin(max_retries=3, + throw_exception_if_retry_exceeded=False) + + # Example 4: + # Track failures in successful tool responses that contain errors. + class CustomRetryPlugin(ReflectAndRetryToolPlugin): + async def extract_error_from_result(self, *, tool, tool_args,tool_context, + result): + # Detect error based on response content + if result.get('status') == 'error': + return result + return None # No error detected + error_handling_plugin = CustomRetryPlugin(max_retries=5) + ``` + """ + + def __init__( + self, + name: str = "reflect_retry_tool_plugin", + max_retries: int = 3, + throw_exception_if_retry_exceeded: bool = True, + tracking_scope: TrackingScope = TrackingScope.INVOCATION, + ): + """Initializes the ReflectAndRetryToolPlugin. + + Args: + name: Plugin instance identifier. + max_retries: Maximum consecutive failures before giving up (0 = no + retries). + throw_exception_if_retry_exceeded: If True, raises the final exception + when the retry limit is reached. If False, returns guidance instead. + tracking_scope: Determines the lifecycle of the error tracking state. + Defaults to `TrackingScope.INVOCATION` tracking per-invocation. + """ + super().__init__(name) + if max_retries < 0: + raise ValueError("max_retries must be a non-negative integer.") + self.max_retries = max_retries + self.throw_exception_if_retry_exceeded = throw_exception_if_retry_exceeded + self.scope = tracking_scope + self._scoped_failure_counters: dict[str, PerToolFailuresCounter] = {} + self._lock = asyncio.Lock() + + async def after_tool_callback( + self, + *, + tool: BaseTool, + tool_args: dict[str, Any], + tool_context: ToolContext, + result: Any, + ) -> Optional[dict[str, Any]]: + """Handles successful tool calls or extracts and processes errors. + + Args: + tool: The tool that was called. + tool_args: The arguments passed to the tool. + tool_context: The context of the tool call. + result: The result of the tool call. + + Returns: + An optional dictionary containing reflection guidance if an error is + detected, or None if the tool call was successful or the + response is already a reflection message. + """ + if ( + isinstance(result, dict) + and result.get("response_type") == REFLECT_AND_RETRY_RESPONSE_TYPE + ): + return None + + error = await self.extract_error_from_result( + tool=tool, tool_args=tool_args, tool_context=tool_context, result=result + ) + + if error: + return await self._handle_tool_error(tool, tool_args, tool_context, error) + + # On success, reset the failure count for this specific tool within + # its scope. + await self._reset_failures_for_tool(tool_context, tool.name) + return None + + async def extract_error_from_result( + self, + *, + tool: BaseTool, + tool_args: dict[str, Any], + tool_context: ToolContext, + result: Any, + ) -> Optional[dict[str, Any]]: + """Extracts an error from a successful tool result and triggers retry logic. + + This is useful when tool call finishes successfully but the result contains + an error object like {"error": ...} that should be handled by the plugin. + + By overriding this method, you can trigger retry logic on these successful + results that contain errors. + + Args: + tool: The tool that was called. + tool_args: The arguments passed to the tool. + tool_context: The context of the tool call. + result: The result of the tool call. + + Returns: + The extracted error if any, or None if no error was detected. + """ + return None + + async def on_tool_error_callback( + self, + *, + tool: BaseTool, + tool_args: dict[str, Any], + tool_context: ToolContext, + error: Exception, + ) -> Optional[dict[str, Any]]: + """Handles tool exceptions by providing reflection guidance. + + Args: + tool: The tool that was called. + tool_args: The arguments passed to the tool. + tool_context: The context of the tool call. + error: The exception raised by the tool. + + Returns: + An optional dictionary containing reflection guidance for the error. + """ + return await self._handle_tool_error(tool, tool_args, tool_context, error) + + async def _handle_tool_error( + self, + tool: BaseTool, + tool_args: dict[str, Any], + tool_context: ToolContext, + error: Any, + ) -> Optional[dict[str, Any]]: + """Central, thread-safe logic for processing tool errors. + + Args: + tool: The tool that was called. + tool_args: The arguments passed to the tool. + tool_context: The context of the tool call. + error: The error to be handled. + + Returns: + An optional dictionary containing reflection guidance for the error. + """ + if self.max_retries == 0: + if self.throw_exception_if_retry_exceeded: + raise error + return self._get_tool_retry_exceed_msg(tool, error, tool_args) + + scope_key = self._get_scope_key(tool_context) + async with self._lock: + tool_failure_counter = self._scoped_failure_counters.setdefault( + scope_key, {} + ) + current_retries = tool_failure_counter.get(tool.name, 0) + 1 + tool_failure_counter[tool.name] = current_retries + + if current_retries <= self.max_retries: + return self._create_tool_reflection_response( + tool, tool_args, error, current_retries + ) + + # Max Retry exceeded + if self.throw_exception_if_retry_exceeded: + raise error + else: + return self._get_tool_retry_exceed_msg(tool, tool_args, error) + + def _get_scope_key(self, tool_context: ToolContext) -> str: + """Returns a unique key for the state dictionary based on the scope. + + This method can be overridden in a subclass to implement custom scoping + logic, for example, tracking failures on a per-user or per-session basis. + """ + if self.scope is TrackingScope.INVOCATION: + return tool_context.invocation_id + elif self.scope is TrackingScope.GLOBAL: + return GLOBAL_SCOPE_KEY + raise ValueError(f"Unknown scope: {self.scope}") + + async def _reset_failures_for_tool( + self, tool_context: ToolContext, tool_name: str + ) -> None: + """Atomically resets the failure count for a tool and cleans up state.""" + scope = self._get_scope_key(tool_context) + async with self._lock: + if scope in self._scoped_failure_counters: + state = self._scoped_failure_counters[scope] + state.pop(tool_name, None) + + def _ensure_exception(self, error: Any) -> Exception: + """Ensures the given error is an Exception instance, wrapping if not.""" + return error if isinstance(error, Exception) else Exception(str(error)) + + def _format_error_details(self, error: Any) -> str: + """Formats error details for inclusion in the reflection message.""" + if isinstance(error, Exception): + return f"{type(error).__name__}: {str(error)}" + return str(error) + + def _create_tool_reflection_response( + self, + tool: BaseTool, + tool_args: dict[str, Any], + error: Any, + retry_count: int, + ) -> dict[str, Any]: + """Generates structured reflection guidance for tool failures.""" + args_summary = json.dumps(tool_args, indent=2, default=str) + error_details = self._format_error_details(error) + + reflection_message = f""" +The call to tool `{tool.name}` failed. + +**Error Details:** +``` +{error_details} +``` + +**Tool Arguments Used:** +```json +{args_summary} +``` + +**Reflection Guidance:** +This is retry attempt **{retry_count} of {self.max_retries}**. Analyze the error and the arguments you provided. Do not repeat the exact same call. Consider the following before your next attempt: + +1. **Invalid Parameters**: Does the error suggest that one or more arguments are incorrect, badly formatted, or missing? Review the tool's schema and your arguments. +2. **State or Preconditions**: Did a previous step fail or not produce the necessary state/resource for this tool to succeed? +3. **Alternative Approach**: Is this the right tool for the job? Could another tool or a different sequence of steps achieve the goal? +4. **Simplify the Task**: Can you break the problem down into smaller, simpler steps? +5. **Wrong Function Name**: Does the error indicates the tool is not found? Please check again and only use available tools. + +Formulate a new plan based on your analysis and try a corrected or different approach. +""" + + return ToolFailureResponse( + error_type=( + type(error).__name__ + if isinstance(error, Exception) + else "ToolError" + ), + error_details=str(error), + retry_count=retry_count, + reflection_guidance=reflection_message.strip(), + ).model_dump(mode="json") + + def _get_tool_retry_exceed_msg( + self, + tool: BaseTool, + tool_args: dict[str, Any], + error: Exception, + ) -> dict[str, Any]: + """Generates guidance when the maximum retry limit is exceeded.""" + error_details = self._format_error_details(error) + args_summary = json.dumps(tool_args, indent=2, default=str) + + reflection_message = f""" +The tool `{tool.name}` has failed consecutively {self.max_retries} times and the retry limit has been exceeded. + +**Last Error:** +``` +{error_details} +``` + +**Last Arguments Used:** +```json +{args_summary} +``` + +**Final Instruction:** +**Do not attempt to use the `{tool.name}` tool again for this task.** You must now try a different approach. Acknowledge the failure and devise a new strategy, potentially using other available tools or informing the user that the task cannot be completed. +""" + + return ToolFailureResponse( + error_type=( + type(error).__name__ + if isinstance(error, Exception) + else "ToolError" + ), + error_details=str(error), + retry_count=self.max_retries, + reflection_guidance=reflection_message.strip(), + ).model_dump(mode="json") diff --git a/src/google/adk/plugins/save_files_as_artifacts_plugin.py b/src/google/adk/plugins/save_files_as_artifacts_plugin.py new file mode 100644 index 0000000000..c207c61087 --- /dev/null +++ b/src/google/adk/plugins/save_files_as_artifacts_plugin.py @@ -0,0 +1,114 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import copy +import logging +from typing import Optional + +from google.genai import types + +from ..agents.invocation_context import InvocationContext +from .base_plugin import BasePlugin + +logger = logging.getLogger('google_adk.' + __name__) + + +class SaveFilesAsArtifactsPlugin(BasePlugin): + """A plugin that saves files embedded in user messages as artifacts. + + This is useful to allow users to upload files in the chat experience and have + those files available to the agent within the current session. + + We use Blob.display_name to determine the file name. By default, artifacts are + session-scoped. For cross-session persistence, prefix the filename with + "user:". + Artifacts with the same name will be overwritten. A placeholder with the + artifact name will be put in place of the embedded file in the user message + so the model knows where to find the file. You may want to add load_artifacts + tool to the agent, or load the artifacts in your own tool to use the files. + """ + + def __init__(self, name: str = 'save_files_as_artifacts_plugin'): + """Initialize the save files as artifacts plugin. + + Args: + name: The name of the plugin instance. + """ + super().__init__(name) + + async def on_user_message_callback( + self, + *, + invocation_context: InvocationContext, + user_message: types.Content, + ) -> Optional[types.Content]: + """Process user message and save any attached files as artifacts.""" + if not invocation_context.artifact_service: + logger.warning( + 'Artifact service is not set. SaveFilesAsArtifactsPlugin' + ' will not be enabled.' + ) + return user_message + + if not user_message.parts: + return None + + new_parts = [] + modified = False + + for i, part in enumerate(user_message.parts): + if part.inline_data is None: + new_parts.append(part) + continue + + try: + # Use display_name if available, otherwise generate a filename + file_name = part.inline_data.display_name + if not file_name: + file_name = f'artifact_{invocation_context.invocation_id}_{i}' + logger.info( + f'No display_name found, using generated filename: {file_name}' + ) + + # Store original filename for display to user/ placeholder + display_name = file_name + + # Create a copy to stop mutation of the saved artifact if the original part is modified + await invocation_context.artifact_service.save_artifact( + app_name=invocation_context.app_name, + user_id=invocation_context.user_id, + session_id=invocation_context.session.id, + filename=file_name, + artifact=copy.copy(part), + ) + + # Replace the inline data with a placeholder text (using the clean name) + new_parts.append( + types.Part(text=f'[Uploaded Artifact: "{display_name}"]') + ) + modified = True + logger.info(f'Successfully saved artifact: {file_name}') + + except Exception as e: + logger.error(f'Failed to save artifact for part {i}: {e}') + # Keep the original part if saving fails + new_parts.append(part) + continue + + if modified: + return types.Content(role=user_message.role, parts=new_parts) + else: + return None diff --git a/src/google/adk/runners.py b/src/google/adk/runners.py index 7213f920d3..f016272b32 100644 --- a/src/google/adk/runners.py +++ b/src/google/adk/runners.py @@ -15,7 +15,9 @@ from __future__ import annotations import asyncio +import inspect import logging +from pathlib import Path import queue from typing import Any from typing import AsyncGenerator @@ -25,16 +27,21 @@ from typing import Optional import warnings +from google.adk.apps.compaction import _run_compaction_for_sliding_window +from google.adk.artifacts import artifact_util from google.genai import types from .agents.active_streaming_tool import ActiveStreamingTool from .agents.base_agent import BaseAgent +from .agents.base_agent import BaseAgentState +from .agents.context_cache_config import ContextCacheConfig from .agents.invocation_context import InvocationContext from .agents.invocation_context import new_invocation_context_id from .agents.live_request_queue import LiveRequestQueue from .agents.llm_agent import LlmAgent from .agents.run_config import RunConfig from .apps.app import App +from .apps.app import ResumabilityConfig from .artifacts.base_artifact_service import BaseArtifactService from .artifacts.in_memory_artifact_service import InMemoryArtifactService from .auth.credential_service.base_credential_service import BaseCredentialService @@ -51,8 +58,9 @@ from .sessions.base_session_service import BaseSessionService from .sessions.in_memory_session_service import InMemorySessionService from .sessions.session import Session -from .telemetry import tracer +from .telemetry.tracing import tracer from .tools.base_toolset import BaseToolset +from .utils._debug_output import print_event from .utils.context_utils import Aclosing logger = logging.getLogger('google_adk.' + __name__) @@ -73,6 +81,8 @@ class Runner: session_service: The session service for the runner. memory_service: The memory service for the runner. credential_service: The credential service for the runner. + context_cache_config: The context cache config for the runner. + resumability_config: The resumability config for the application. """ app_name: str @@ -89,6 +99,10 @@ class Runner: """The memory service for the runner.""" credential_service: Optional[BaseCredentialService] = None """The credential service for the runner.""" + context_cache_config: Optional[ContextCacheConfig] = None + """The context cache config for the runner.""" + resumability_config: Optional[ResumabilityConfig] = None + """The resumability config for the application.""" def __init__( self, @@ -109,11 +123,11 @@ def __init__( `ValueError`. Providing `app` is the recommended way to create a runner. Args: + app: An optional `App` instance. If provided, `app_name` and `agent` + should not be specified. app_name: The application name of the runner. Required if `app` is not provided. agent: The root agent to run. Required if `app` is not provided. - app: An optional `App` instance. If provided, `app_name` and `agent` - should not be specified. plugins: Deprecated. A list of plugins for the runner. Please use the `app` argument to provide plugins instead. artifact_service: The artifact service for the runner. @@ -125,14 +139,25 @@ def __init__( ValueError: If `app` is provided along with `app_name` or `plugins`, or if `app` is not provided but either `app_name` or `agent` is missing. """ - self.app_name, self.agent, plugins = self._validate_runner_params( - app, app_name, agent, plugins - ) + self.app = app + ( + self.app_name, + self.agent, + self.context_cache_config, + self.resumability_config, + plugins, + ) = self._validate_runner_params(app, app_name, agent, plugins) self.artifact_service = artifact_service self.session_service = session_service self.memory_service = memory_service self.credential_service = credential_service self.plugin_manager = PluginManager(plugins=plugins) + ( + self._agent_origin_app_name, + self._agent_origin_dir, + ) = self._infer_agent_origin(self.agent) + self._app_name_alignment_hint: Optional[str] = None + self._enforce_app_name_alignment() def _validate_runner_params( self, @@ -140,7 +165,13 @@ def _validate_runner_params( app_name: Optional[str], agent: Optional[BaseAgent], plugins: Optional[List[BasePlugin]], - ) -> tuple[str, BaseAgent, Optional[List[BasePlugin]]]: + ) -> tuple[ + str, + BaseAgent, + Optional[ContextCacheConfig], + Optional[ResumabilityConfig], + Optional[List[BasePlugin]], + ]: """Validates and extracts runner parameters. Args: @@ -150,7 +181,8 @@ def _validate_runner_params( plugins: A list of plugins for the runner. Returns: - A tuple containing (app_name, agent, plugins). + A tuple containing (app_name, agent, context_cache_config, + resumability_config, plugins). Raises: ValueError: If parameters are invalid. @@ -170,10 +202,15 @@ def _validate_runner_params( app_name = app.name agent = app.root_agent plugins = app.plugins + context_cache_config = app.context_cache_config + resumability_config = app.resumability_config elif not app_name or not agent: raise ValueError( 'Either app or both app_name and agent must be provided.' ) + else: + context_cache_config = None + resumability_config = None if plugins: warnings.warn( @@ -181,7 +218,61 @@ def _validate_runner_params( ' to provide plugins instead.', DeprecationWarning, ) - return app_name, agent, plugins + return app_name, agent, context_cache_config, resumability_config, plugins + + def _infer_agent_origin( + self, agent: BaseAgent + ) -> tuple[Optional[str], Optional[Path]]: + module = inspect.getmodule(agent.__class__) + if not module: + return None, None + module_file = getattr(module, '__file__', None) + if not module_file: + return None, None + module_path = Path(module_file).resolve() + project_root = Path.cwd() + try: + relative_path = module_path.relative_to(project_root) + except ValueError: + return None, module_path.parent + origin_dir = module_path.parent + if 'agents' not in relative_path.parts: + return None, origin_dir + origin_name = origin_dir.name + if origin_name.startswith('.'): + return None, origin_dir + return origin_name, origin_dir + + def _enforce_app_name_alignment(self) -> None: + origin_name = self._agent_origin_app_name + origin_dir = self._agent_origin_dir + if not origin_name or origin_name.startswith('__'): + self._app_name_alignment_hint = None + return + if origin_name == self.app_name: + self._app_name_alignment_hint = None + return + origin_location = str(origin_dir) if origin_dir else origin_name + mismatch_details = ( + 'The runner is configured with app name ' + f'"{self.app_name}", but the root agent was loaded from ' + f'"{origin_location}", which implies app name "{origin_name}".' + ) + resolution = ( + 'Ensure the runner app_name matches that directory or pass app_name ' + 'explicitly when constructing the runner.' + ) + self._app_name_alignment_hint = f'{mismatch_details} {resolution}' + logger.warning('App name mismatch detected. %s', mismatch_details) + + def _format_session_not_found_message(self, session_id: str) -> str: + message = f'Session not found: {session_id}' + if not self._app_name_alignment_hint: + return message + return ( + f'{message}. {self._app_name_alignment_hint} ' + 'The mismatch prevents the runner from locating the session.' + ) def run( self, @@ -248,7 +339,8 @@ async def run_async( *, user_id: str, session_id: str, - new_message: types.Content, + invocation_id: Optional[str] = None, + new_message: Optional[types.Content] = None, state_delta: Optional[dict[str, Any]] = None, run_config: Optional[RunConfig] = None, ) -> AsyncGenerator[Event, None]: @@ -257,48 +349,67 @@ async def run_async( Args: user_id: The user ID of the session. session_id: The session ID of the session. + invocation_id: The invocation ID of the session, set this to resume an + interrupted invocation. new_message: A new message to append to the session. + state_delta: Optional state changes to apply to the session. run_config: The run config for the agent. Yields: The events generated by the agent. + + Raises: + ValueError: If the session is not found; If both invocation_id and + new_message are None. """ run_config = run_config or RunConfig() + if new_message and not new_message.role: + new_message.role = 'user' + async def _run_with_trace( - new_message: types.Content, + new_message: Optional[types.Content] = None, + invocation_id: Optional[str] = None, ) -> AsyncGenerator[Event, None]: with tracer.start_as_current_span('invocation'): session = await self.session_service.get_session( app_name=self.app_name, user_id=user_id, session_id=session_id ) if not session: - raise ValueError(f'Session not found: {session_id}') - - invocation_context = self._new_invocation_context( - session, - new_message=new_message, - run_config=run_config, - ) - root_agent = self.agent - - # Modify user message before execution. - modified_user_message = await invocation_context.plugin_manager.run_on_user_message_callback( - invocation_context=invocation_context, user_message=new_message - ) - if modified_user_message is not None: - new_message = modified_user_message - - if new_message: - await self._append_new_message_to_session( - session, - new_message, - invocation_context, - run_config.save_input_blobs_as_artifacts, - state_delta, + message = self._format_session_not_found_message(session_id) + raise ValueError(message) + if not invocation_id and not new_message: + raise ValueError('Both invocation_id and new_message are None.') + + if invocation_id: + if ( + not self.resumability_config + or not self.resumability_config.is_resumable + ): + raise ValueError( + f'invocation_id: {invocation_id} is provided but the app is not' + ' resumable.' + ) + invocation_context = await self._setup_context_for_resumed_invocation( + session=session, + new_message=new_message, + invocation_id=invocation_id, + run_config=run_config, + state_delta=state_delta, + ) + if invocation_context.end_of_agents.get( + invocation_context.agent.name + ): + # Directly return if the current agent in invocation context is + # already final. + return + else: + invocation_context = await self._setup_context_for_new_invocation( + session=session, + new_message=new_message, # new_message is not None. + run_config=run_config, + state_delta=state_delta, ) - - invocation_context.agent = self._find_agent_to_run(session, root_agent) async def execute(ctx: InvocationContext) -> AsyncGenerator[Event]: async with Aclosing(ctx.agent.run_async(ctx)) as agen: @@ -315,11 +426,182 @@ async def execute(ctx: InvocationContext) -> AsyncGenerator[Event]: ) as agen: async for event in agen: yield event + # Run compaction after all events are yielded from the agent. + # (We don't compact in the middle of an invocation, we only compact at the end of an invocation.) + if self.app and self.app.events_compaction_config: + logger.info('Running event compactor.') + # Run compaction in a separate task to avoid blocking the main thread. + # So the users can still finish the event loop from the agent while the + # compaction is running. + asyncio.create_task( + _run_compaction_for_sliding_window( + self.app, session, self.session_service + ) + ) - async with Aclosing(_run_with_trace(new_message)) as agen: + async with Aclosing(_run_with_trace(new_message, invocation_id)) as agen: async for event in agen: yield event + async def rewind_async( + self, + *, + user_id: str, + session_id: str, + rewind_before_invocation_id: str, + ) -> None: + """Rewinds the session to before the specified invocation.""" + session = await self.session_service.get_session( + app_name=self.app_name, user_id=user_id, session_id=session_id + ) + if not session: + raise ValueError(f'Session not found: {session_id}') + + rewind_event_index = -1 + for i, event in enumerate(session.events): + if event.invocation_id == rewind_before_invocation_id: + rewind_event_index = i + break + + if rewind_event_index == -1: + raise ValueError( + f'Invocation ID not found: {rewind_before_invocation_id}' + ) + + # Compute state delta to reverse changes + state_delta = await self._compute_state_delta_for_rewind( + session, rewind_event_index + ) + + # Compute artifact delta to reverse changes + artifact_delta = await self._compute_artifact_delta_for_rewind( + session, rewind_event_index + ) + + # Create rewind event + rewind_event = Event( + invocation_id=new_invocation_context_id(), + author='user', + actions=EventActions( + rewind_before_invocation_id=rewind_before_invocation_id, + state_delta=state_delta, + artifact_delta=artifact_delta, + ), + ) + + logger.info('Rewinding session to invocation: %s', rewind_event) + + await self.session_service.append_event(session=session, event=rewind_event) + + async def _compute_state_delta_for_rewind( + self, session: Session, rewind_event_index: int + ) -> dict[str, Any]: + """Computes the state delta to reverse changes.""" + state_at_rewind_point: dict[str, Any] = {} + for i in range(rewind_event_index): + if session.events[i].actions.state_delta: + for k, v in session.events[i].actions.state_delta.items(): + if k.startswith('app:') or k.startswith('user:'): + continue + if v is None: + state_at_rewind_point.pop(k, None) + else: + state_at_rewind_point[k] = v + + current_state = session.state + rewind_state_delta = {} + + # 1. Add/update keys in rewind_state_delta to match state_at_rewind_point. + for key, value_at_rewind in state_at_rewind_point.items(): + if key not in current_state or current_state[key] != value_at_rewind: + rewind_state_delta[key] = value_at_rewind + + # 2. Set keys to None in rewind_state_delta if they are in current_state + # but not in state_at_rewind_point. These keys were added after the + # rewind point and need to be removed. + for key in current_state: + if key.startswith('app:') or key.startswith('user:'): + continue + if key not in state_at_rewind_point: + rewind_state_delta[key] = None + + return rewind_state_delta + + async def _compute_artifact_delta_for_rewind( + self, session: Session, rewind_event_index: int + ) -> dict[str, int]: + """Computes the artifact delta to reverse changes.""" + if not self.artifact_service: + return {} + + versions_at_rewind_point: dict[str, int] = {} + for i in range(rewind_event_index): + event = session.events[i] + if event.actions.artifact_delta: + versions_at_rewind_point.update(event.actions.artifact_delta) + + current_versions: dict[str, int] = {} + for event in session.events: + if event.actions.artifact_delta: + current_versions.update(event.actions.artifact_delta) + + rewind_artifact_delta = {} + for filename, vn in current_versions.items(): + if filename.startswith('user:'): + # User artifacts are not restored on rewind. + continue + vt = versions_at_rewind_point.get(filename) + if vt == vn: + continue + + rewind_artifact_delta[filename] = vn + 1 + if vt is None: + # Artifact did not exist at rewind point. Mark it as inaccessible. + artifact = types.Part( + inline_data=types.Blob( + mime_type='application/octet-stream', data=b'' + ) + ) + else: + # Artifact version changed after rewind point. Restore to version at + # rewind point. + artifact_uri = artifact_util.get_artifact_uri( + app_name=self.app_name, + user_id=session.user_id, + session_id=session.id, + filename=filename, + version=vt, + ) + artifact = types.Part(file_data=types.FileData(file_uri=artifact_uri)) + await self.artifact_service.save_artifact( + app_name=self.app_name, + user_id=session.user_id, + session_id=session.id, + filename=filename, + artifact=artifact, + ) + + return rewind_artifact_delta + + async def _run_compaction_default(self, session: Session): + """Runs compaction for other types of compactors. + + This method calls `maybe_compact_events` on the compactor with all + events in the session. + + Args: + session: The session containing events to compact. + """ + compaction_event = ( + await self.app.events_compaction_config.compactor.maybe_compact_events( + events=session.events + ) + ) + if compaction_event: + await self.session_service.append_event( + session=session, event=compaction_event + ) + def _should_append_event(self, event: Event, is_live_call: bool) -> bool: """Checks if an event should be appended to the session.""" # Don't append audio response from model in live mode to session. @@ -389,6 +671,7 @@ async def _exec_with_plugin( async def _append_new_message_to_session( self, + *, session: Session, new_message: types.Content, invocation_context: InvocationContext, @@ -402,11 +685,21 @@ async def _append_new_message_to_session( new_message: The new message to append. invocation_context: The invocation context for the message. save_input_blobs_as_artifacts: Whether to save input blobs as artifacts. + state_delta: Optional state changes to apply to the session. """ if not new_message.parts: raise ValueError('No parts in the new_message.') if self.artifact_service and save_input_blobs_as_artifacts: + # Issue deprecation warning + warnings.warn( + "The 'save_input_blobs_as_artifacts' parameter is deprecated. Use" + ' SaveFilesAsArtifactsPlugin instead for better control and' + ' flexibility. See google.adk.plugins.SaveFilesAsArtifactsPlugin for' + ' migration guidance.', + DeprecationWarning, + stacklevel=3, + ) # The runner directly saves the artifacts (if applicable) in the # user message and replaces the artifact data with a file name # placeholder. @@ -438,6 +731,11 @@ async def _append_new_message_to_session( author='user', content=new_message, ) + # If new_message is a function response, find the matching function call + # and use its branch as the new event's branch. + if function_call := invocation_context._find_matching_function_call(event): + event.branch = function_call.branch + await self.session_service.append_event(session=session, event=event) async def run_live( @@ -473,6 +771,10 @@ async def run_live( Either `session` or both `user_id` and `session_id` must be provided. """ run_config = run_config or RunConfig() + # Some native audio models requires the modality to be set. So we set it to + # AUDIO by default. + if run_config.response_modalities is None: + run_config.response_modalities = ['AUDIO'] if session is None and (user_id is None or session_id is None): raise ValueError( 'Either session or user_id and session_id must be provided.' @@ -576,13 +878,22 @@ def _find_agent_to_run( message) """ # If the last event is a function response, should send this response to - # the agent that returned the corressponding function call regardless the + # the agent that returned the corresponding function call regardless the # type of the agent. e.g. a remote a2a agent may surface a credential # request as a special long running function tool call. event = find_matching_function_call(session.events) if event and event.author: return root_agent.find_agent(event.author) - for event in filter(lambda e: e.author != 'user', reversed(session.events)): + + def _event_filter(event: Event) -> bool: + """Filters out user-authored events and agent state change events.""" + if event.author == 'user': + return False + if event.actions.agent_state is not None or event.actions.end_of_agent: + return False + return True + + for event in filter(_event_filter, reversed(session.events)): if event.author == root_agent.name: # Found root agent. return root_agent @@ -621,10 +932,228 @@ def _is_transferable_across_agent_tree(self, agent_to_run: BaseAgent) -> bool: agent = agent.parent_agent return True + async def run_debug( + self, + user_messages: str | list[str], + *, + user_id: str = 'debug_user_id', + session_id: str = 'debug_session_id', + run_config: RunConfig | None = None, + quiet: bool = False, + verbose: bool = False, + ) -> list[Event]: + """Debug helper for quick agent experimentation and testing. + + This convenience method is designed for developers getting started with ADK + who want to quickly test agents without dealing with session management, + content formatting, or event streaming. It automatically handles common + boilerplate while hiding complexity. + + IMPORTANT: This is for debugging and experimentation only. For production + use, please use the standard run_async() method which provides full control + over session management, event streaming, and error handling. + + Args: + user_messages: Message(s) to send to the agent. Can be: + - Single string: "What is 2+2?" + - List of strings: ["Hello!", "What's my name?"] + user_id: User identifier. Defaults to "debug_user_id". + session_id: Session identifier for conversation persistence. + Defaults to "debug_session_id". Reuse the same ID to continue a conversation. + run_config: Optional configuration for the agent execution. + quiet: If True, suppresses console output. Defaults to False (output shown). + verbose: If True, shows detailed tool calls and responses. Defaults to False + for cleaner output showing only final agent responses. + + Returns: + list[Event]: All events from all messages. + + Raises: + ValueError: If session creation/retrieval fails. + + Examples: + Quick debugging: + >>> runner = InMemoryRunner(agent=my_agent) + >>> await runner.run_debug("What is 2+2?") + + Multiple queries in conversation: + >>> await runner.run_debug(["Hello!", "What's my name?"]) + + Continue a debug session: + >>> await runner.run_debug("What did we discuss?") # Continues default session + + Separate debug sessions: + >>> await runner.run_debug("Hi", user_id="alice", session_id="debug1") + >>> await runner.run_debug("Hi", user_id="bob", session_id="debug2") + + Capture events for inspection: + >>> events = await runner.run_debug("Analyze this") + >>> for event in events: + ... inspect_event(event) + + Note: + For production applications requiring: + - Custom session/memory services (Spanner, Cloud SQL, etc.) + - Fine-grained event processing and streaming + - Error recovery and resumability + - Performance optimization + Please use run_async() with proper configuration. + """ + session = await self.session_service.get_session( + app_name=self.app_name, user_id=user_id, session_id=session_id + ) + if not session: + session = await self.session_service.create_session( + app_name=self.app_name, user_id=user_id, session_id=session_id + ) + if not quiet: + print(f'\n ### Created new session: {session_id}') + elif not quiet: + print(f'\n ### Continue session: {session_id}') + + collected_events: list[Event] = [] + + if isinstance(user_messages, str): + user_messages = [user_messages] + + for message in user_messages: + if not quiet: + print(f'\nUser > {message}') + + async for event in self.run_async( + user_id=user_id, + session_id=session.id, + new_message=types.UserContent(parts=[types.Part(text=message)]), + run_config=run_config, + ): + if not quiet: + print_event(event, verbose=verbose) + + collected_events.append(event) + + return collected_events + + async def _setup_context_for_new_invocation( + self, + *, + session: Session, + new_message: types.Content, + run_config: RunConfig, + state_delta: Optional[dict[str, Any]], + ) -> InvocationContext: + """Sets up the context for a new invocation. + + Args: + session: The session to setup the invocation context for. + new_message: The new message to process and append to the session. + run_config: The run config of the agent. + state_delta: Optional state changes to apply to the session. + + Returns: + The invocation context for the new invocation. + """ + # Step 1: Create invocation context in memory. + invocation_context = self._new_invocation_context( + session, + new_message=new_message, + run_config=run_config, + ) + # Step 2: Handle new message, by running callbacks and appending to + # session. + await self._handle_new_message( + session=session, + new_message=new_message, + invocation_context=invocation_context, + run_config=run_config, + state_delta=state_delta, + ) + # Step 3: Set agent to run for the invocation. + invocation_context.agent = self._find_agent_to_run(session, self.agent) + return invocation_context + + async def _setup_context_for_resumed_invocation( + self, + *, + session: Session, + new_message: Optional[types.Content], + invocation_id: Optional[str], + run_config: RunConfig, + state_delta: Optional[dict[str, Any]], + ) -> InvocationContext: + """Sets up the context for a resumed invocation. + + Args: + session: The session to setup the invocation context for. + new_message: The new message to process and append to the session. + invocation_id: The invocation id to resume. + run_config: The run config of the agent. + state_delta: Optional state changes to apply to the session. + + Returns: + The invocation context for the resumed invocation. + + Raises: + ValueError: If the session has no events to resume; If no user message is + available for resuming the invocation; Or if the app is not resumable. + """ + if not session.events: + raise ValueError(f'Session {session.id} has no events to resume.') + + # Step 1: Maybe retrive a previous user message for the invocation. + user_message = new_message or self._find_user_message_for_invocation( + session.events, invocation_id + ) + if not user_message: + raise ValueError( + f'No user message available for resuming invocation: {invocation_id}' + ) + # Step 2: Create invocation context. + invocation_context = self._new_invocation_context( + session, + new_message=user_message, + run_config=run_config, + invocation_id=invocation_id, + ) + # Step 3: Maybe handle new message. + if new_message: + await self._handle_new_message( + session=session, + new_message=user_message, + invocation_context=invocation_context, + run_config=run_config, + state_delta=state_delta, + ) + # Step 4: Populate agent states for the current invocation. + invocation_context.populate_invocation_agent_states() + # Step 5: Set agent to run for the invocation. + # + # If the root agent is not found in end_of_agents, it means the invocation + # started from a sub-agent and paused on a sub-agent. + # We should find the appropriate agent to run to continue the invocation. + if self.agent.name not in invocation_context.end_of_agents: + invocation_context.agent = self._find_agent_to_run(session, self.agent) + return invocation_context + + def _find_user_message_for_invocation( + self, events: list[Event], invocation_id: str + ) -> Optional[types.Content]: + """Finds the user message that started a specific invocation.""" + for event in events: + if ( + event.invocation_id == invocation_id + and event.author == 'user' + and event.content + and event.content.parts + and event.content.parts[0].text + ): + return event.content + return None + def _new_invocation_context( self, session: Session, *, + invocation_id: Optional[str] = None, new_message: Optional[types.Content] = None, live_request_queue: Optional[LiveRequestQueue] = None, run_config: Optional[RunConfig] = None, @@ -633,6 +1162,7 @@ def _new_invocation_context( Args: session: The session for the context. + invocation_id: The invocation id for the context. new_message: The new message for the context. live_request_queue: The live request queue for the context. run_config: The run config for the context. @@ -641,7 +1171,7 @@ def _new_invocation_context( The new invocation context. """ run_config = run_config or RunConfig() - invocation_id = new_invocation_context_id() + invocation_id = invocation_id or new_invocation_context_id() if run_config.support_cfc and isinstance(self.agent, LlmAgent): model_name = self.agent.canonical_model.model @@ -659,12 +1189,14 @@ def _new_invocation_context( memory_service=self.memory_service, credential_service=self.credential_service, plugin_manager=self.plugin_manager, + context_cache_config=self.context_cache_config, invocation_id=invocation_id, agent=self.agent, session=session, user_content=new_message, live_request_queue=live_request_queue, run_config=run_config, + resumability_config=self.resumability_config, ) def _new_invocation_context_for_live( @@ -701,6 +1233,42 @@ def _new_invocation_context_for_live( run_config=run_config, ) + async def _handle_new_message( + self, + *, + session: Session, + new_message: types.Content, + invocation_context: InvocationContext, + run_config: RunConfig, + state_delta: Optional[dict[str, Any]], + ) -> None: + """Handles a new message by running callbacks and appending to session. + + Args: + session: The session of the new message. + new_message: The new message to process and append to the session. + invocation_context: The invocation context to use for the message + handling. + run_config: The run config of the agent. + state_delta: Optional state changes to apply to the session. + """ + modified_user_message = ( + await invocation_context.plugin_manager.run_on_user_message_callback( + invocation_context=invocation_context, user_message=new_message + ) + ) + if modified_user_message is not None: + new_message = modified_user_message + + if new_message: + await self._append_new_message_to_session( + session=session, + new_message=new_message, + invocation_context=invocation_context, + save_input_blobs_as_artifacts=run_config.save_input_blobs_as_artifacts, + state_delta=state_delta, + ) + def _collect_toolset(self, agent: BaseAgent) -> set[BaseToolset]: toolsets = set() if isinstance(agent, LlmAgent): @@ -725,6 +1293,19 @@ async def _cleanup_toolsets(self, toolsets_to_close: set[BaseToolset]): logger.info('Successfully closed toolset: %s', type(toolset).__name__) except asyncio.TimeoutError: logger.warning('Toolset %s cleanup timed out', type(toolset).__name__) + except asyncio.CancelledError as e: + # Handle cancel scope issues in Python 3.10 and 3.11 with anyio + # + # Root cause: MCP library uses anyio.CancelScope() in RequestResponder.__enter__() + # and __exit__() methods. When asyncio.wait_for() creates a new task for cleanup, + # the cancel scope is entered in one task context but exited in another. + # + # Python 3.12+ fixes: Enhanced task context management (Task.get_context()), + # improved context propagation across task boundaries, and better cancellation + # handling prevent the cross-task cancel scope violation. + logger.warning( + 'Toolset %s cleanup cancelled: %s', type(toolset).__name__, e + ) except Exception as e: logger.error('Error closing toolset %s: %s', type(toolset).__name__, e) @@ -732,6 +1313,15 @@ async def close(self): """Closes the runner.""" await self._cleanup_toolsets(self._collect_toolset(self.agent)) + async def __aenter__(self): + """Async context manager entry.""" + return self + + async def __aexit__(self, exc_type, exc_val, exc_tb): + """Async context manager exit.""" + await self.close() + return False # Don't suppress exceptions from the async with block + class InMemoryRunner(Runner): """An in-memory Runner for testing and development. @@ -750,7 +1340,7 @@ def __init__( self, agent: Optional[BaseAgent] = None, *, - app_name: Optional[str] = 'InMemoryRunner', + app_name: Optional[str] = None, plugins: Optional[list[BasePlugin]] = None, app: Optional[App] = None, ): @@ -761,6 +1351,8 @@ def __init__( app_name: The application name of the runner. Defaults to 'InMemoryRunner'. """ + if app is None and app_name is None: + app_name = 'InMemoryRunner' super().__init__( app_name=app_name, agent=agent, diff --git a/src/google/adk/sessions/_session_util.py b/src/google/adk/sessions/_session_util.py index 2cc65949cb..0b2f99eef2 100644 --- a/src/google/adk/sessions/_session_util.py +++ b/src/google/adk/sessions/_session_util.py @@ -16,23 +16,34 @@ from typing import Any from typing import Optional +from typing import Type +from typing import TypeVar -from google.genai import types +from .state import State +M = TypeVar("M") -def decode_content( - content: Optional[dict[str, Any]], -) -> Optional[types.Content]: - """Decodes a content object from a JSON dictionary.""" - if not content: + +def decode_model( + data: Optional[dict[str, Any]], model_cls: Type[M] +) -> Optional[M]: + """Decodes a pydantic model object from a JSON dictionary.""" + if data is None: return None - return types.Content.model_validate(content) + return model_cls.model_validate(data) -def decode_grounding_metadata( - grounding_metadata: Optional[dict[str, Any]], -) -> Optional[types.GroundingMetadata]: - """Decodes a grounding metadata object from a JSON dictionary.""" - if not grounding_metadata: - return None - return types.GroundingMetadata.model_validate(grounding_metadata) +def extract_state_delta( + state: dict[str, Any], +) -> dict[str, dict[str, Any]]: + """Extracts app, user, and session state deltas from a state dictionary.""" + deltas = {"app": {}, "user": {}, "session": {}} + if state: + for key in state.keys(): + if key.startswith(State.APP_PREFIX): + deltas["app"][key.removeprefix(State.APP_PREFIX)] = state[key] + elif key.startswith(State.USER_PREFIX): + deltas["user"][key.removeprefix(State.USER_PREFIX)] = state[key] + elif not key.startswith(State.TEMP_PREFIX): + deltas["session"][key] = state[key] + return deltas diff --git a/src/google/adk/sessions/base_session_service.py b/src/google/adk/sessions/base_session_service.py index 25e46ba199..f2f6f9f22d 100644 --- a/src/google/adk/sessions/base_session_service.py +++ b/src/google/adk/sessions/base_session_service.py @@ -12,6 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import annotations + import abc from typing import Any from typing import Optional @@ -81,9 +83,18 @@ async def get_session( @abc.abstractmethod async def list_sessions( - self, *, app_name: str, user_id: str + self, *, app_name: str, user_id: Optional[str] = None ) -> ListSessionsResponse: - """Lists all the sessions.""" + """Lists all the sessions for a user. + + Args: + app_name: The name of the app. + user_id: The ID of the user. If not provided, lists all sessions for all + users. + + Returns: + A ListSessionsResponse containing the sessions. + """ @abc.abstractmethod async def delete_session( @@ -95,11 +106,24 @@ async def append_event(self, session: Session, event: Event) -> Event: """Appends an event to a session object.""" if event.partial: return event - self.__update_session_state(session, event) + event = self._trim_temp_delta_state(event) + self._update_session_state(session, event) session.events.append(event) return event - def __update_session_state(self, session: Session, event: Event) -> None: + def _trim_temp_delta_state(self, event: Event) -> Event: + """Removes temporary state delta keys from the event.""" + if not event.actions or not event.actions.state_delta: + return event + + event.actions.state_delta = { + key: value + for key, value in event.actions.state_delta.items() + if not key.startswith(State.TEMP_PREFIX) + } + return event + + def _update_session_state(self, session: Session, event: Event) -> None: """Updates the session state based on the event.""" if not event.actions or not event.actions.state_delta: return diff --git a/src/google/adk/sessions/database_session_service.py b/src/google/adk/sessions/database_session_service.py index 959524c689..89502d53ff 100644 --- a/src/google/adk/sessions/database_session_service.py +++ b/src/google/adk/sessions/database_session_service.py @@ -23,6 +23,7 @@ from typing import Optional import uuid +from google.genai import types from sqlalchemy import Boolean from sqlalchemy import delete from sqlalchemy import Dialect @@ -52,7 +53,9 @@ from tzlocal import get_localzone from . import _session_util +from ..errors.already_exists_error import AlreadyExistsError from ..events.event import Event +from ..events.event_actions import EventActions from .base_session_service import BaseSessionService from .base_session_service import GetSessionConfig from .base_session_service import ListSessionsResponse @@ -112,6 +115,8 @@ class DynamicPickleType(TypeDecorator): impl = PickleType def load_dialect_impl(self, dialect): + if dialect.name == "mysql": + return dialect.type_descriptor(mysql.LONGBLOB) if dialect.name == "spanner+spanner": from google.cloud.sqlalchemy_spanner.sqlalchemy_spanner import SpannerPickleType @@ -121,14 +126,14 @@ def load_dialect_impl(self, dialect): def process_bind_param(self, value, dialect): """Ensures the pickled value is a bytes object before passing it to the database dialect.""" if value is not None: - if dialect.name == "spanner+spanner": + if dialect.name in ("spanner+spanner", "mysql"): return pickle.dumps(value) return value def process_result_value(self, value, dialect): """Ensures the raw bytes from the database are unpickled back into a Python object.""" if value is not None: - if dialect.name == "spanner+spanner": + if dialect.name in ("spanner+spanner", "mysql"): return pickle.loads(value) return value @@ -250,6 +255,12 @@ class StorageEvent(Base): custom_metadata: Mapped[dict[str, Any]] = mapped_column( DynamicJSON, nullable=True ) + usage_metadata: Mapped[dict[str, Any]] = mapped_column( + DynamicJSON, nullable=True + ) + citation_metadata: Mapped[dict[str, Any]] = mapped_column( + DynamicJSON, nullable=True + ) partial: Mapped[bool] = mapped_column(Boolean, nullable=True) turn_complete: Mapped[bool] = mapped_column(Boolean, nullable=True) @@ -316,6 +327,14 @@ def from_event(cls, session: Session, event: Event) -> StorageEvent: ) if event.custom_metadata: storage_event.custom_metadata = event.custom_metadata + if event.usage_metadata: + storage_event.usage_metadata = event.usage_metadata.model_dump( + exclude_none=True, mode="json" + ) + if event.citation_metadata: + storage_event.citation_metadata = event.citation_metadata.model_dump( + exclude_none=True, mode="json" + ) return storage_event def to_event(self) -> Event: @@ -324,19 +343,27 @@ def to_event(self) -> Event: invocation_id=self.invocation_id, author=self.author, branch=self.branch, - actions=self.actions, + # This is needed as previous ADK version pickled actions might not have + # value defined in the current version of the EventActions model. + actions=EventActions().model_copy(update=self.actions.model_dump()), timestamp=self.timestamp.timestamp(), - content=_session_util.decode_content(self.content), long_running_tool_ids=self.long_running_tool_ids, partial=self.partial, turn_complete=self.turn_complete, error_code=self.error_code, error_message=self.error_message, interrupted=self.interrupted, - grounding_metadata=_session_util.decode_grounding_metadata( - self.grounding_metadata - ), custom_metadata=self.custom_metadata, + content=_session_util.decode_model(self.content, types.Content), + grounding_metadata=_session_util.decode_model( + self.grounding_metadata, types.GroundingMetadata + ), + usage_metadata=_session_util.decode_model( + self.usage_metadata, types.GenerateContentResponseUsageMetadata + ), + citation_metadata=_session_util.decode_model( + self.citation_metadata, types.CitationMetadata + ), ) @@ -442,20 +469,20 @@ async def create_session( # 5. Return the session with self.database_session_factory() as sql_session: - + if session_id and sql_session.get( + StorageSession, (app_name, user_id, session_id) + ): + raise AlreadyExistsError( + f"Session with id {session_id} already exists." + ) # Fetch app and user states from storage storage_app_state = sql_session.get(StorageAppState, (app_name)) - storage_user_state = sql_session.get( - StorageUserState, (app_name, user_id) - ) - - app_state = storage_app_state.state if storage_app_state else {} - user_state = storage_user_state.state if storage_user_state else {} - - # Create state tables if not exist if not storage_app_state: storage_app_state = StorageAppState(app_name=app_name, state={}) sql_session.add(storage_app_state) + storage_user_state = sql_session.get( + StorageUserState, (app_name, user_id) + ) if not storage_user_state: storage_user_state = StorageUserState( app_name=app_name, user_id=user_id, state={} @@ -463,19 +490,16 @@ async def create_session( sql_session.add(storage_user_state) # Extract state deltas - app_state_delta, user_state_delta, session_state = _extract_state_delta( - state - ) + state_deltas = _session_util.extract_state_delta(state) + app_state_delta = state_deltas["app"] + user_state_delta = state_deltas["user"] + session_state = state_deltas["session"] # Apply state delta - app_state.update(app_state_delta) - user_state.update(user_state_delta) - - # Store app and user state if app_state_delta: - storage_app_state.state = app_state + storage_app_state.state = storage_app_state.state | app_state_delta if user_state_delta: - storage_user_state.state = user_state + storage_user_state.state = storage_user_state.state | user_state_delta # Store the session storage_session = StorageSession( @@ -490,7 +514,9 @@ async def create_session( sql_session.refresh(storage_session) # Merge states for response - merged_state = _merge_state(app_state, user_state, session_state) + merged_state = _merge_state( + storage_app_state.state, storage_user_state.state, session_state + ) session = storage_session.to_session(state=merged_state) return session @@ -513,19 +539,18 @@ async def get_session( if storage_session is None: return None + query = sql_session.query(StorageEvent).filter( + StorageEvent.app_name == app_name, + StorageEvent.user_id == user_id, + StorageEvent.session_id == storage_session.id, + ) + if config and config.after_timestamp: after_dt = datetime.fromtimestamp(config.after_timestamp) - timestamp_filter = StorageEvent.timestamp >= after_dt - else: - timestamp_filter = True + query = query.filter(StorageEvent.timestamp >= after_dt) storage_events = ( - sql_session.query(StorageEvent) - .filter(StorageEvent.app_name == app_name) - .filter(StorageEvent.session_id == storage_session.id) - .filter(StorageEvent.user_id == user_id) - .filter(timestamp_filter) - .order_by(StorageEvent.timestamp.desc()) + query.order_by(StorageEvent.timestamp.desc()) .limit( config.num_recent_events if config and config.num_recent_events @@ -554,30 +579,42 @@ async def get_session( @override async def list_sessions( - self, *, app_name: str, user_id: str + self, *, app_name: str, user_id: Optional[str] = None ) -> ListSessionsResponse: with self.database_session_factory() as sql_session: - results = ( - sql_session.query(StorageSession) - .filter(StorageSession.app_name == app_name) - .filter(StorageSession.user_id == user_id) - .all() + query = sql_session.query(StorageSession).filter( + StorageSession.app_name == app_name ) + if user_id is not None: + query = query.filter(StorageSession.user_id == user_id) + results = query.all() - # Fetch states from storage + # Fetch app state from storage storage_app_state = sql_session.get(StorageAppState, (app_name)) - storage_user_state = sql_session.get( - StorageUserState, (app_name, user_id) - ) - app_state = storage_app_state.state if storage_app_state else {} - user_state = storage_user_state.state if storage_user_state else {} + + # Fetch user state(s) from storage + user_states_map = {} + if user_id is not None: + storage_user_state = sql_session.get( + StorageUserState, (app_name, user_id) + ) + if storage_user_state: + user_states_map[user_id] = storage_user_state.state + else: + all_user_states_for_app = ( + sql_session.query(StorageUserState) + .filter(StorageUserState.app_name == app_name) + .all() + ) + for storage_user_state in all_user_states_for_app: + user_states_map[storage_user_state.user_id] = storage_user_state.state sessions = [] for storage_session in results: session_state = storage_session.state + user_state = user_states_map.get(storage_session.user_id, {}) merged_state = _merge_state(app_state, user_state, session_state) - sessions.append(storage_session.to_session(state=merged_state)) return ListSessionsResponse(sessions=sessions) @@ -599,6 +636,9 @@ async def append_event(self, session: Session, event: Event) -> Event: if event.partial: return event + # Trim temp state before persisting + event = self._trim_temp_delta_state(event) + # 1. Check if timestamp is stale # 2. Update session attributes based on event config # 3. Store event to table @@ -622,30 +662,21 @@ async def append_event(self, session: Session, event: Event) -> Event: StorageUserState, (session.app_name, session.user_id) ) - app_state = storage_app_state.state if storage_app_state else {} - user_state = storage_user_state.state if storage_user_state else {} - session_state = storage_session.state - # Extract state delta - app_state_delta = {} - user_state_delta = {} - session_state_delta = {} - if event.actions: - if event.actions.state_delta: - app_state_delta, user_state_delta, session_state_delta = ( - _extract_state_delta(event.actions.state_delta) - ) - - # Merge state and update storage - if app_state_delta: - app_state.update(app_state_delta) - storage_app_state.state = app_state - if user_state_delta: - user_state.update(user_state_delta) - storage_user_state.state = user_state - if session_state_delta: - session_state.update(session_state_delta) - storage_session.state = session_state + if event.actions and event.actions.state_delta: + state_deltas = _session_util.extract_state_delta( + event.actions.state_delta + ) + app_state_delta = state_deltas["app"] + user_state_delta = state_deltas["user"] + session_state_delta = state_deltas["session"] + # Merge state and update storage + if app_state_delta: + storage_app_state.state = storage_app_state.state | app_state_delta + if user_state_delta: + storage_user_state.state = storage_user_state.state | user_state_delta + if session_state_delta: + storage_session.state = storage_session.state | session_state_delta sql_session.add(StorageEvent.from_event(session, event)) @@ -660,21 +691,6 @@ async def append_event(self, session: Session, event: Event) -> Event: return event -def _extract_state_delta(state: dict[str, Any]): - app_state_delta = {} - user_state_delta = {} - session_state_delta = {} - if state: - for key in state.keys(): - if key.startswith(State.APP_PREFIX): - app_state_delta[key.removeprefix(State.APP_PREFIX)] = state[key] - elif key.startswith(State.USER_PREFIX): - user_state_delta[key.removeprefix(State.USER_PREFIX)] = state[key] - elif not key.startswith(State.TEMP_PREFIX): - session_state_delta[key] = state[key] - return app_state_delta, user_state_delta, session_state_delta - - def _merge_state(app_state, user_state, session_state): # Merge states for response merged_state = copy.deepcopy(session_state) diff --git a/src/google/adk/sessions/in_memory_session_service.py b/src/google/adk/sessions/in_memory_session_service.py index bbb480ae45..6ba7f0bb01 100644 --- a/src/google/adk/sessions/in_memory_session_service.py +++ b/src/google/adk/sessions/in_memory_session_service.py @@ -22,6 +22,8 @@ from typing_extensions import override +from . import _session_util +from ..errors.already_exists_error import AlreadyExistsError from ..events.event import Event from .base_session_service import BaseSessionService from .base_session_service import GetSessionConfig @@ -88,6 +90,21 @@ def _create_session_impl( state: Optional[dict[str, Any]] = None, session_id: Optional[str] = None, ) -> Session: + if session_id and self._get_session_impl( + app_name=app_name, user_id=user_id, session_id=session_id + ): + raise AlreadyExistsError(f'Session with id {session_id} already exists.') + state_deltas = _session_util.extract_state_delta(state) + app_state_delta = state_deltas['app'] + user_state_delta = state_deltas['user'] + session_state = state_deltas['session'] + if app_state_delta: + self.app_state.setdefault(app_name, {}).update(app_state_delta) + if user_state_delta: + self.user_state.setdefault(app_name, {}).setdefault(user_id, {}).update( + user_state_delta + ) + session_id = ( session_id.strip() if session_id and session_id.strip() @@ -97,7 +114,7 @@ def _create_session_impl( app_name=app_name, user_id=user_id, id=session_id, - state=state or {}, + state=session_state or {}, last_update_time=time.time(), ) @@ -174,11 +191,13 @@ def _get_session_impl( if i >= 0: copied_session.events = copied_session.events[i + 1 :] + # Return a copy of the session object with merged state. return self._merge_state(app_name, user_id, copied_session) def _merge_state( self, app_name: str, user_id: str, copied_session: Session ) -> Session: + """Merges app and user state into session state.""" # Merge app state if app_name in self.app_state: for key in self.app_state[app_name].keys(): @@ -201,31 +220,41 @@ def _merge_state( @override async def list_sessions( - self, *, app_name: str, user_id: str + self, *, app_name: str, user_id: Optional[str] = None ) -> ListSessionsResponse: return self._list_sessions_impl(app_name=app_name, user_id=user_id) def list_sessions_sync( - self, *, app_name: str, user_id: str + self, *, app_name: str, user_id: Optional[str] = None ) -> ListSessionsResponse: logger.warning('Deprecated. Please migrate to the async method.') return self._list_sessions_impl(app_name=app_name, user_id=user_id) def _list_sessions_impl( - self, *, app_name: str, user_id: str + self, *, app_name: str, user_id: Optional[str] = None ) -> ListSessionsResponse: empty_response = ListSessionsResponse() if app_name not in self.sessions: return empty_response - if user_id not in self.sessions[app_name]: + if user_id is not None and user_id not in self.sessions[app_name]: return empty_response sessions_without_events = [] - for session in self.sessions[app_name][user_id].values(): - copied_session = copy.deepcopy(session) - copied_session.events = [] - copied_session = self._merge_state(app_name, user_id, copied_session) - sessions_without_events.append(copied_session) + + if user_id is None: + for user_id in self.sessions[app_name]: + for session_id in self.sessions[app_name][user_id]: + session = self.sessions[app_name][user_id][session_id] + copied_session = copy.deepcopy(session) + copied_session.events = [] + copied_session = self._merge_state(app_name, user_id, copied_session) + sessions_without_events.append(copied_session) + else: + for session in self.sessions[app_name][user_id].values(): + copied_session = copy.deepcopy(session) + copied_session.events = [] + copied_session = self._merge_state(app_name, user_id, copied_session) + sessions_without_events.append(copied_session) return ListSessionsResponse(sessions=sessions_without_events) @override @@ -259,11 +288,9 @@ def _delete_session_impl( @override async def append_event(self, session: Session, event: Event) -> Event: - # Update the in-memory session. - await super().append_event(session=session, event=event) - session.last_update_time = event.timestamp + if event.partial: + return event - # Update the storage session app_name = session.app_name user_id = session.user_id session_id = session.id @@ -283,21 +310,29 @@ def _warning(message: str) -> None: _warning(f'session_id {session_id} not in sessions[app_name][user_id]') return event - if event.actions and event.actions.state_delta: - for key in event.actions.state_delta: - if key.startswith(State.APP_PREFIX): - self.app_state.setdefault(app_name, {})[ - key.removeprefix(State.APP_PREFIX) - ] = event.actions.state_delta[key] - - if key.startswith(State.USER_PREFIX): - self.user_state.setdefault(app_name, {}).setdefault(user_id, {})[ - key.removeprefix(State.USER_PREFIX) - ] = event.actions.state_delta[key] + # Update the in-memory session. + await super().append_event(session=session, event=event) + session.last_update_time = event.timestamp + # Update the storage session storage_session = self.sessions[app_name][user_id].get(session_id) - await super().append_event(session=storage_session, event=event) - + storage_session.events.append(event) storage_session.last_update_time = event.timestamp + if event.actions and event.actions.state_delta: + state_deltas = _session_util.extract_state_delta( + event.actions.state_delta + ) + app_state_delta = state_deltas['app'] + user_state_delta = state_deltas['user'] + session_state_delta = state_deltas['session'] + if app_state_delta: + self.app_state.setdefault(app_name, {}).update(app_state_delta) + if user_state_delta: + self.user_state.setdefault(app_name, {}).setdefault(user_id, {}).update( + user_state_delta + ) + if session_state_delta: + storage_session.state.update(session_state_delta) + return event diff --git a/src/google/adk/sessions/state.py b/src/google/adk/sessions/state.py index 86eb673aca..e56f33ce78 100644 --- a/src/google/adk/sessions/state.py +++ b/src/google/adk/sessions/state.py @@ -12,11 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import annotations + from typing import Any class State: - """A state dict that maintain the current value and the pending-commit delta.""" + """A state dict that maintains the current value and the pending-commit delta.""" APP_PREFIX = "app:" USER_PREFIX = "user:" diff --git a/src/google/adk/sessions/vertex_ai_session_service.py b/src/google/adk/sessions/vertex_ai_session_service.py index 29681622d2..e0651f0ebb 100644 --- a/src/google/adk/sessions/vertex_ai_session_service.py +++ b/src/google/adk/sessions/vertex_ai_session_service.py @@ -13,40 +13,38 @@ # limitations under the License. from __future__ import annotations +import asyncio +import datetime import json import logging -import os import re from typing import Any -from typing import Dict from typing import Optional -import urllib.parse +from typing import Union -from dateutil import parser +from google.genai import types from google.genai.errors import ClientError from tenacity import retry from tenacity import retry_if_result -from tenacity import RetryError from tenacity import stop_after_attempt from tenacity import wait_exponential from typing_extensions import override - -from google import genai +import vertexai from . import _session_util from ..events.event import Event from ..events.event_actions import EventActions +from ..utils.vertex_ai_utils import get_express_mode_api_key from .base_session_service import BaseSessionService from .base_session_service import GetSessionConfig from .base_session_service import ListSessionsResponse from .session import Session -isoparse = parser.isoparse logger = logging.getLogger('google_adk.' + __name__) class VertexAiSessionService(BaseSessionService): - """Connects to the Vertex AI Agent Engine Session Service using GenAI API client. + """Connects to the Vertex AI Agent Engine Session Service using Agent Engine SDK. https://cloud.google.com/vertex-ai/generative-ai/docs/agent-engine/sessions/overview """ @@ -56,6 +54,8 @@ def __init__( project: Optional[str] = None, location: Optional[str] = None, agent_engine_id: Optional[str] = None, + *, + express_mode_api_key: Optional[str] = None, ): """Initializes the VertexAiSessionService. @@ -63,24 +63,19 @@ def __init__( project: The project id of the project to use. location: The location of the project to use. agent_engine_id: The resource ID of the agent engine to use. + express_mode_api_key: The API key to use for Express Mode. If not + provided, the API key from the GOOGLE_API_KEY environment variable will + be used. It will only be used if GOOGLE_GENAI_USE_VERTEXAI is true. + Do not use Google AI Studio API key for this field. For more details, + visit + https://cloud.google.com/vertex-ai/generative-ai/docs/start/express-mode/overview """ self._project = project self._location = location self._agent_engine_id = agent_engine_id - - async def _get_session_api_response( - self, - reasoning_engine_id: str, - session_id: str, - api_client: genai.ApiClient, - ): - get_session_api_response = await api_client.async_request( - http_method='GET', - path=f'reasoningEngines/{reasoning_engine_id}/sessions/{session_id}', - request_dict={}, + self._express_mode_api_key = get_express_mode_api_key( + project, location, express_mode_api_key ) - get_session_api_response = _convert_api_response(get_session_api_response) - return get_session_api_response @override async def create_session( @@ -90,92 +85,50 @@ async def create_session( user_id: str, state: Optional[dict[str, Any]] = None, session_id: Optional[str] = None, + **kwargs: Any, ) -> Session: + """Creates a new session. + + Args: + app_name: The name of the application. + user_id: The ID of the user. + state: The initial state of the session. + session_id: The ID of the session. + **kwargs: Additional arguments to pass to the session creation. E.g. set + expire_time='2025-10-01T00:00:00Z' to set the session expiration time. + See https://cloud.google.com/vertex-ai/generative-ai/docs/reference/rest/v1beta1/projects.locations.reasoningEngines.sessions + for more details. + Returns: + The created session. + """ + if session_id: raise ValueError( 'User-provided Session id is not supported for' ' VertexAISessionService.' ) + reasoning_engine_id = self._get_reasoning_engine_id(app_name) api_client = self._get_api_client() - session_json_dict = {'user_id': user_id} - if state: - session_json_dict['session_state'] = state + config = {'session_state': state} if state else {} + config.update(kwargs) - api_response = await api_client.async_request( - http_method='POST', - path=f'reasoningEngines/{reasoning_engine_id}/sessions', - request_dict=session_json_dict, + api_response = await api_client.aio.agent_engines.sessions.create( + name=f'reasoningEngines/{reasoning_engine_id}', + user_id=user_id, + config=config, ) - api_response = _convert_api_response(api_response) - logger.info('Create session response received.') logger.debug('Create session response: %s', api_response) + get_session_response = api_response.response + session_id = get_session_response.name.split('/')[-1] - session_id = api_response['name'].split('/')[-3] - operation_id = api_response['name'].split('/')[-1] - if _is_vertex_express_mode(self._project, self._location): - # Express mode doesn't support LRO, so we need to poll - # the session resource. - # TODO: remove this once LRO polling is supported in Express mode. - @retry( - stop=stop_after_attempt(5), - wait=wait_exponential(multiplier=1, min=1, max=3), - retry=retry_if_result(lambda response: not response), - reraise=True, - ) - async def _poll_session_resource(): - try: - return await self._get_session_api_response( - reasoning_engine_id, session_id, api_client - ) - except ClientError: - logger.info('Polling session resource') - return None - - try: - await _poll_session_resource() - except Exception as exc: - raise ValueError('Failed to create session.') from exc - else: - - @retry( - stop=stop_after_attempt(5), - wait=wait_exponential(multiplier=1, min=1, max=3), - retry=retry_if_result( - lambda response: not response.get('done', False), - ), - reraise=True, - ) - async def _poll_lro(): - lro_response = await api_client.async_request( - http_method='GET', - path=f'operations/{operation_id}', - request_dict={}, - ) - lro_response = _convert_api_response(lro_response) - return lro_response - - try: - await _poll_lro() - except RetryError as exc: - raise TimeoutError( - f'Timeout waiting for operation {operation_id} to complete.' - ) from exc - except Exception as exc: - raise ValueError('Failed to create session.') from exc - - get_session_api_response = await self._get_session_api_response( - reasoning_engine_id, session_id, api_client - ) session = Session( - app_name=str(app_name), - user_id=str(user_id), - id=str(session_id), - state=get_session_api_response.get('sessionState', {}), - last_update_time=isoparse( - get_session_api_response['updateTime'] - ).timestamp(), + app_name=app_name, + user_id=user_id, + id=session_id, + state=getattr(get_session_response, 'session_state', None) or {}, + last_update_time=get_session_response.update_time.timestamp(), ) return session @@ -190,131 +143,82 @@ async def get_session( ) -> Optional[Session]: reasoning_engine_id = self._get_reasoning_engine_id(app_name) api_client = self._get_api_client() + session_resource_name = ( + f'reasoningEngines/{reasoning_engine_id}/sessions/{session_id}' + ) + + # Get session resource and events in parallel. + list_events_kwargs = {} + if config and not config.num_recent_events and config.after_timestamp: + # Filter events based on timestamp. + list_events_kwargs['config'] = { + 'filter': 'timestamp>="{}"'.format( + datetime.datetime.fromtimestamp( + config.after_timestamp, tz=datetime.timezone.utc + ).isoformat() + ) + } - # Get session resource - get_session_api_response = await self._get_session_api_response( - reasoning_engine_id, session_id, api_client + get_session_response, events_iterator = await asyncio.gather( + api_client.aio.agent_engines.sessions.get(name=session_resource_name), + api_client.aio.agent_engines.sessions.events.list( + name=session_resource_name, + **list_events_kwargs, + ), ) - if get_session_api_response['userId'] != user_id: - raise ValueError(f'Session not found: {session_id}') + if get_session_response.user_id != user_id: + raise ValueError( + f'Session {session_id} does not belong to user {user_id}.' + ) - session_id = get_session_api_response['name'].split('/')[-1] - update_timestamp = isoparse( - get_session_api_response['updateTime'] - ).timestamp() + update_timestamp = get_session_response.update_time.timestamp() session = Session( - app_name=str(app_name), - user_id=str(user_id), - id=str(session_id), - state=get_session_api_response.get('sessionState', {}), + app_name=app_name, + user_id=user_id, + id=session_id, + state=getattr(get_session_response, 'session_state', None) or {}, last_update_time=update_timestamp, ) - - list_events_api_response = await api_client.async_request( - http_method='GET', - path=f'reasoningEngines/{reasoning_engine_id}/sessions/{session_id}/events', - request_dict={}, - ) - converted_api_response = _convert_api_response(list_events_api_response) - - # Handles empty response case where there are no events to fetch - if not converted_api_response or converted_api_response.get( - 'httpHeaders', None - ): - return session - session.events += [ _from_api_event(event) - for event in converted_api_response['sessionEvents'] - ] - - while converted_api_response.get('nextPageToken', None): - page_token = converted_api_response.get('nextPageToken', None) - list_events_api_response = await api_client.async_request( - http_method='GET', - path=f'reasoningEngines/{reasoning_engine_id}/sessions/{session_id}/events?pageToken={page_token}', - request_dict={}, - ) - converted_api_response = _convert_api_response(list_events_api_response) - - # Handles empty response case where there are no more events to fetch - if not converted_api_response or converted_api_response.get( - 'httpHeaders', None - ): - break - session.events += [ - _from_api_event(event) - for event in converted_api_response['sessionEvents'] - ] - - session.events = [ - event for event in session.events if event.timestamp <= update_timestamp + for event in events_iterator + if event.timestamp.timestamp() <= update_timestamp ] - session.events.sort(key=lambda event: event.timestamp) - # Filter events based on config if config: + # Filter events based on num_recent_events. if config.num_recent_events: session.events = session.events[-config.num_recent_events :] - elif config.after_timestamp: - i = len(session.events) - 1 - while i >= 0: - if session.events[i].timestamp < config.after_timestamp: - break - i -= 1 - if i >= 0: - session.events = session.events[i:] return session @override async def list_sessions( - self, *, app_name: str, user_id: str + self, *, app_name: str, user_id: Optional[str] = None ) -> ListSessionsResponse: reasoning_engine_id = self._get_reasoning_engine_id(app_name) api_client = self._get_api_client() - base_path = f'reasoningEngines/{reasoning_engine_id}/sessions' sessions = [] - page_token = None - while True: - path = base_path - query_params = {} - if user_id: - query_params['filter'] = f'user_id="{user_id}"' - if page_token: - query_params['pageToken'] = page_token - - if query_params: - path = f'{path}?{urllib.parse.urlencode(query_params)}' - - list_sessions_api_response = await api_client.async_request( - http_method='GET', - path=path, - request_dict={}, + config = {} + if user_id is not None: + config['filter'] = f'user_id="{user_id}"' + sessions_iterator = await api_client.aio.agent_engines.sessions.list( + name=f'reasoningEngines/{reasoning_engine_id}', + config=config, + ) + + for api_session in sessions_iterator: + sessions.append( + Session( + app_name=app_name, + user_id=api_session.user_id, + id=api_session.name.split('/')[-1], + state=getattr(api_session, 'session_state', None) or {}, + last_update_time=api_session.update_time.timestamp(), + ) ) - converted_api_response = _convert_api_response(list_sessions_api_response) - - # Handles empty response case - if not converted_api_response or converted_api_response.get( - 'httpHeaders', None - ): - break - - for api_session in converted_api_response.get('sessions', []): - session = Session( - app_name=app_name, - user_id=user_id, - id=api_session['name'].split('/')[-1], - state=api_session.get('sessionState', {}), - last_update_time=isoparse(api_session['updateTime']).timestamp(), - ) - sessions.append(session) - - page_token = converted_api_response.get('nextPageToken') - if not page_token: - break return ListSessionsResponse(sessions=sessions) @@ -325,10 +229,8 @@ async def delete_session( api_client = self._get_api_client() try: - await api_client.async_request( - http_method='DELETE', - path=f'reasoningEngines/{reasoning_engine_id}/sessions/{session_id}', - request_dict={}, + await api_client.aio.agent_engines.sessions.delete( + name=f'reasoningEngines/{reasoning_engine_id}/sessions/{session_id}', ) except Exception as e: logger.error('Error deleting session %s: %s', session_id, e) @@ -341,10 +243,57 @@ async def append_event(self, session: Session, event: Event) -> Event: reasoning_engine_id = self._get_reasoning_engine_id(session.app_name) api_client = self._get_api_client() - await api_client.async_request( - http_method='POST', - path=f'reasoningEngines/{reasoning_engine_id}/sessions/{session.id}:appendEvent', - request_dict=_convert_event_to_json(event), + + config = {} + if event.content: + config['content'] = event.content.model_dump( + exclude_none=True, mode='json' + ) + if event.actions: + config['actions'] = { + 'skip_summarization': event.actions.skip_summarization, + 'state_delta': event.actions.state_delta, + 'artifact_delta': event.actions.artifact_delta, + 'transfer_agent': event.actions.transfer_to_agent, + 'escalate': event.actions.escalate, + 'requested_auth_configs': { + k: json.loads(v.model_dump_json(exclude_none=True, by_alias=True)) + for k, v in event.actions.requested_auth_configs.items() + }, + # TODO: add requested_tool_confirmations, compaction, agent_state once + # they are available in the API. + } + if event.error_code: + config['error_code'] = event.error_code + if event.error_message: + config['error_message'] = event.error_message + + metadata_dict = { + 'partial': event.partial, + 'turn_complete': event.turn_complete, + 'interrupted': event.interrupted, + 'branch': event.branch, + 'custom_metadata': event.custom_metadata, + 'long_running_tool_ids': ( + list(event.long_running_tool_ids) + if event.long_running_tool_ids + else None + ), + } + if event.grounding_metadata: + metadata_dict['grounding_metadata'] = event.grounding_metadata.model_dump( + exclude_none=True, mode='json' + ) + config['event_metadata'] = metadata_dict + + await api_client.aio.agent_engines.sessions.events.append( + name=f'reasoningEngines/{reasoning_engine_id}/sessions/{session.id}', + author=event.author, + invocation_id=event.invocation_id, + timestamp=datetime.datetime.fromtimestamp( + event.timestamp, tz=datetime.timezone.utc + ), + config=config, ) return event @@ -358,7 +307,7 @@ def _get_reasoning_engine_id(self, app_name: str): pattern = r'^projects/([a-zA-Z0-9-_]+)/locations/([a-zA-Z0-9-_]+)/reasoningEngines/(\d+)$' match = re.fullmatch(pattern, app_name) - if not bool(match): + if not match: raise ValueError( f'App name {app_name} is not valid. It should either be the full' ' ReasoningEngine resource name, or the reasoning engine id.' @@ -368,137 +317,78 @@ def _get_reasoning_engine_id(self, app_name: str): def _api_client_http_options_override( self, - ) -> Optional[genai.types.HttpOptions]: + ) -> Optional[Union[types.HttpOptions, types.HttpOptionsDict]]: return None - def _get_api_client(self): + def _get_api_client(self) -> vertexai.Client: """Instantiates an API client for the given project and location. - It needs to be instantiated inside each request so that the event loop - management can be properly propagated. + Returns: + An API client for the given project and location or express mode api key. """ - api_client = genai.Client( - vertexai=True, project=self._project, location=self._location - )._api_client - - if new_options := self._api_client_http_options_override(): - api_client._http_options = new_options - return api_client - - -def _is_vertex_express_mode( - project: Optional[str], location: Optional[str] -) -> bool: - """Check if Vertex AI and API key are both enabled replacing project and location, meaning the user is using the Vertex Express Mode.""" - return ( - os.environ.get('GOOGLE_GENAI_USE_VERTEXAI', '0').lower() in ['true', '1'] - and os.environ.get('GOOGLE_API_KEY', None) is not None - and project is None - and location is None - ) - - -def _convert_api_response(api_response): - """Converts the API response to a JSON object based on the type.""" - if hasattr(api_response, 'body'): - return json.loads(api_response.body) - return api_response - - -def _convert_event_to_json(event: Event) -> Dict[str, Any]: - metadata_json = { - 'partial': event.partial, - 'turn_complete': event.turn_complete, - 'interrupted': event.interrupted, - 'branch': event.branch, - 'custom_metadata': event.custom_metadata, - 'long_running_tool_ids': ( - list(event.long_running_tool_ids) - if event.long_running_tool_ids - else None - ), - } - if event.grounding_metadata: - metadata_json['grounding_metadata'] = event.grounding_metadata.model_dump( - exclude_none=True, mode='json' + return vertexai.Client( + project=self._project, + location=self._location, + http_options=self._api_client_http_options_override(), + api_key=self._express_mode_api_key, ) - event_json = { - 'author': event.author, - 'invocation_id': event.invocation_id, - 'timestamp': { - 'seconds': int(event.timestamp), - 'nanos': int( - (event.timestamp - int(event.timestamp)) * 1_000_000_000 - ), - }, - 'error_code': event.error_code, - 'error_message': event.error_message, - 'event_metadata': metadata_json, - } - - if event.actions: - actions_json = { - 'skip_summarization': event.actions.skip_summarization, - 'state_delta': event.actions.state_delta, - 'artifact_delta': event.actions.artifact_delta, - 'transfer_agent': event.actions.transfer_to_agent, - 'escalate': event.actions.escalate, - 'requested_auth_configs': event.actions.requested_auth_configs, + +def _from_api_event(api_event_obj: vertexai.types.SessionEvent) -> Event: + """Converts an API event object to an Event object.""" + actions = getattr(api_event_obj, 'actions', None) + if actions: + actions_dict = actions.model_dump(exclude_none=True, mode='python') + rename_map = {'transfer_agent': 'transfer_to_agent'} + renamed_actions_dict = { + rename_map.get(k, k): v for k, v in actions_dict.items() } - event_json['actions'] = actions_json - if event.content: - event_json['content'] = event.content.model_dump( - exclude_none=True, mode='json' + event_actions = EventActions.model_validate(renamed_actions_dict) + else: + event_actions = EventActions() + + event_metadata = getattr(api_event_obj, 'event_metadata', None) + if event_metadata: + long_running_tool_ids_list = getattr( + event_metadata, 'long_running_tool_ids', None ) - if event.error_code: - event_json['error_code'] = event.error_code - if event.error_message: - event_json['error_message'] = event.error_message - return event_json - - -def _from_api_event(api_event: Dict[str, Any]) -> Event: - event_actions = EventActions() - if api_event.get('actions', None): - event_actions = EventActions( - skip_summarization=api_event['actions'].get('skipSummarization', None), - state_delta=api_event['actions'].get('stateDelta', {}), - artifact_delta=api_event['actions'].get('artifactDelta', {}), - transfer_to_agent=api_event['actions'].get('transferAgent', None), - escalate=api_event['actions'].get('escalate', None), - requested_auth_configs=api_event['actions'].get( - 'requestedAuthConfigs', {} - ), + long_running_tool_ids = ( + set(long_running_tool_ids_list) if long_running_tool_ids_list else None ) - - event = Event( - id=api_event['name'].split('/')[-1], - invocation_id=api_event['invocationId'], - author=api_event['author'], + partial = getattr(event_metadata, 'partial', None) + turn_complete = getattr(event_metadata, 'turn_complete', None) + interrupted = getattr(event_metadata, 'interrupted', None) + branch = getattr(event_metadata, 'branch', None) + custom_metadata = getattr(event_metadata, 'custom_metadata', None) + grounding_metadata = _session_util.decode_model( + getattr(event_metadata, 'grounding_metadata', None), + types.GroundingMetadata, + ) + else: + long_running_tool_ids = None + partial = None + turn_complete = None + interrupted = None + branch = None + custom_metadata = None + grounding_metadata = None + + return Event( + id=api_event_obj.name.split('/')[-1], + invocation_id=api_event_obj.invocation_id, + author=api_event_obj.author, actions=event_actions, - content=_session_util.decode_content(api_event.get('content', None)), - timestamp=isoparse(api_event['timestamp']).timestamp(), - error_code=api_event.get('errorCode', None), - error_message=api_event.get('errorMessage', None), + content=_session_util.decode_model( + getattr(api_event_obj, 'content', None), types.Content + ), + timestamp=api_event_obj.timestamp.timestamp(), + error_code=getattr(api_event_obj, 'error_code', None), + error_message=getattr(api_event_obj, 'error_message', None), + partial=partial, + turn_complete=turn_complete, + interrupted=interrupted, + branch=branch, + custom_metadata=custom_metadata, + grounding_metadata=grounding_metadata, + long_running_tool_ids=long_running_tool_ids, ) - - if api_event.get('eventMetadata', None): - long_running_tool_ids_list = api_event['eventMetadata'].get( - 'longRunningToolIds', None - ) - event.partial = api_event['eventMetadata'].get('partial', None) - event.turn_complete = api_event['eventMetadata'].get('turnComplete', None) - event.interrupted = api_event['eventMetadata'].get('interrupted', None) - event.branch = api_event['eventMetadata'].get('branch', None) - event.custom_metadata = api_event['eventMetadata'].get( - 'customMetadata', None - ) - event.grounding_metadata = _session_util.decode_grounding_metadata( - api_event['eventMetadata'].get('groundingMetadata', None) - ) - event.long_running_tool_ids = ( - set(long_running_tool_ids_list) if long_running_tool_ids_list else None - ) - - return event diff --git a/src/google/adk/telemetry/__init__.py b/src/google/adk/telemetry/__init__.py new file mode 100644 index 0000000000..722296e6f2 --- /dev/null +++ b/src/google/adk/telemetry/__init__.py @@ -0,0 +1,27 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from .tracing import trace_call_llm +from .tracing import trace_merged_tool_calls +from .tracing import trace_send_data +from .tracing import trace_tool_call +from .tracing import tracer + +__all__ = [ + 'trace_call_llm', + 'trace_merged_tool_calls', + 'trace_send_data', + 'trace_tool_call', + 'tracer', +] diff --git a/src/google/adk/telemetry/google_cloud.py b/src/google/adk/telemetry/google_cloud.py new file mode 100644 index 0000000000..fbad8cea3e --- /dev/null +++ b/src/google/adk/telemetry/google_cloud.py @@ -0,0 +1,162 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import logging +import os +from typing import cast +from typing import Optional +from typing import TYPE_CHECKING + +import google.auth +from opentelemetry.sdk._logs import LogRecordProcessor +from opentelemetry.sdk._logs.export import BatchLogRecordProcessor +from opentelemetry.sdk.metrics.export import MetricReader +from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader +from opentelemetry.sdk.resources import OTELResourceDetector +from opentelemetry.sdk.resources import Resource +from opentelemetry.sdk.trace import SpanProcessor +from opentelemetry.sdk.trace.export import BatchSpanProcessor + +from ..utils.feature_decorator import experimental +from .setup import OTelHooks + +if TYPE_CHECKING: + from google.auth.credentials import Credentials + +logger = logging.getLogger('google_adk.' + __name__) + +_GCP_LOG_NAME_ENV_VARIABLE_NAME = 'GOOGLE_CLOUD_DEFAULT_LOG_NAME' +_DEFAULT_LOG_NAME = 'adk-otel' + + +@experimental +def get_gcp_exporters( + enable_cloud_tracing: bool = False, + enable_cloud_metrics: bool = False, + enable_cloud_logging: bool = False, + google_auth: Optional[tuple[Credentials, str]] = None, +) -> OTelHooks: + """Returns GCP OTel exporters to be used in the app. + + Args: + enable_tracing: whether to enable tracing to Cloud Trace. + enable_metrics: whether to enable raporting metrics to Cloud Monitoring. + enable_logging: whether to enable sending logs to Cloud Logging. + google_auth: optional custom credentials and project_id. google.auth.default() used when this is omitted. + """ + + credentials, project_id = ( + google_auth if google_auth is not None else google.auth.default() + ) + if TYPE_CHECKING: + credentials = cast(Credentials, credentials) + project_id = cast(str, project_id) + + if not project_id: + logger.warning( + 'Cannot determine GCP Project. OTel GCP Exporters cannot be set up.' + ' Please make sure to log into correct GCP Project.' + ) + return OTelHooks() + + span_processors: list[SpanProcessor] = [] + if enable_cloud_tracing: + exporter = _get_gcp_span_exporter(credentials) + span_processors.append(exporter) + + metric_readers: list[MetricReader] = [] + if enable_cloud_metrics: + exporter = _get_gcp_metrics_exporter(project_id) + if exporter: + metric_readers.append(exporter) + + log_record_processors: list[LogRecordProcessor] = [] + if enable_cloud_logging: + exporter = _get_gcp_logs_exporter(project_id) + if exporter: + log_record_processors.append(exporter) + + return OTelHooks( + span_processors=span_processors, + metric_readers=metric_readers, + log_record_processors=log_record_processors, + ) + + +def _get_gcp_span_exporter(credentials: Credentials) -> SpanProcessor: + """Adds OTEL span exporter to telemetry.googleapis.com""" + + from google.auth.transport.requests import AuthorizedSession + from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter + + return BatchSpanProcessor( + OTLPSpanExporter( + session=AuthorizedSession(credentials=credentials), + endpoint='https://telemetry.googleapis.com/v1/traces', + ) + ) + + +def _get_gcp_metrics_exporter(project_id: str) -> MetricReader: + from opentelemetry.exporter.cloud_monitoring import CloudMonitoringMetricsExporter + + return PeriodicExportingMetricReader( + CloudMonitoringMetricsExporter(project_id=project_id), + export_interval_millis=5000, + ) + + +def _get_gcp_logs_exporter(project_id: str) -> LogRecordProcessor: + from opentelemetry.exporter.cloud_logging import CloudLoggingExporter + + default_log_name = os.environ.get( + _GCP_LOG_NAME_ENV_VARIABLE_NAME, _DEFAULT_LOG_NAME + ) + return BatchLogRecordProcessor( + CloudLoggingExporter( + project_id=project_id, default_log_name=default_log_name + ), + ) + + +def get_gcp_resource(project_id: Optional[str] = None) -> Resource: + """Returns OTEL with attributes specified in the following order (attributes specified later, overwrite those specified earlier): + 1. Populates gcp.project_id attribute from the project_id argument if present. + 2. OTELResourceDetector populates resource labels from environment variables like OTEL_SERVICE_NAME and OTEL_RESOURCE_ATTRIBUTES. + 3. GCP detector adds attributes corresponding to a correct monitored resource if ADK runs on one of supported platforms (e.g. GCE, GKE, CloudRun). + + Args: + project_id: project id to fill out as `gcp.project_id` on the OTEL resource. + This may be overwritten by OTELResourceDetector, if `gcp.project_id` is present in `OTEL_RESOURCE_ATTRIBUTES` env var. + """ + resource = Resource( + attributes={'gcp.project_id': project_id} + if project_id is not None + else {} + ) + resource = resource.merge(OTELResourceDetector().detect()) + try: + from opentelemetry.resourcedetector.gcp_resource_detector import GoogleCloudResourceDetector + + resource = resource.merge( + GoogleCloudResourceDetector(raise_on_error=False).detect() + ) + except ImportError: + logger.warning( + 'Cloud not import opentelemetry.resourcedetector.gcp_resource_detector' + ' GCE, GKE or CloudRun related resource attributes may be missing' + ) + return resource diff --git a/src/google/adk/telemetry/setup.py b/src/google/adk/telemetry/setup.py new file mode 100644 index 0000000000..eac5c96142 --- /dev/null +++ b/src/google/adk/telemetry/setup.py @@ -0,0 +1,175 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from dataclasses import dataclass +from dataclasses import field +import os +from typing import Optional + +from opentelemetry import _events +from opentelemetry import _logs +from opentelemetry import metrics +from opentelemetry import trace +from opentelemetry.sdk._events import EventLoggerProvider +from opentelemetry.sdk._logs import LoggerProvider +from opentelemetry.sdk._logs import LogRecordProcessor +from opentelemetry.sdk._logs.export import BatchLogRecordProcessor +import opentelemetry.sdk.environment_variables as otel_env +from opentelemetry.sdk.metrics import MeterProvider +from opentelemetry.sdk.metrics.export import MetricReader +from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader +from opentelemetry.sdk.resources import OTELResourceDetector +from opentelemetry.sdk.resources import Resource +from opentelemetry.sdk.trace import SpanProcessor +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import BatchSpanProcessor + +from ..utils.feature_decorator import experimental + + +@dataclass +class OTelHooks: + span_processors: list[SpanProcessor] = field(default_factory=list) + metric_readers: list[MetricReader] = field(default_factory=list) + log_record_processors: list[LogRecordProcessor] = field(default_factory=list) + + +@experimental() +def maybe_set_otel_providers( + otel_hooks_to_setup: list[OTelHooks] = None, + otel_resource: Optional[Resource] = None, +): + """Sets up OTel providers if hooks for a given telemetry type were + passed. + + Additionally adds generic OTLP exporters based on following env variables: + OTEL_EXPORTER_OTLP_ENDPOINT + OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + OTEL_EXPORTER_OTLP_METRICS_ENDPOINT + OTEL_EXPORTER_OTLP_LOGS_ENDPOINT + See https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/ + for how they are used. + + If a provider for a specific telemetry type was already globally set - + this function will not override it or register more exporters. + + Args: + otel_hooks_to_setup: per-telemetry-type processors and readers to be added + to OTel providers. If no hooks for a specific telemetry type are passed - + provider will not be set. + otel_resource: OTel resource to use in providers. + If empty - default OTel resource detection will be used. + """ + otel_hooks_to_setup = otel_hooks_to_setup or [] + otel_resource = otel_resource or _get_otel_resource() + + # Add generic OTel exporters based on OTel env variables. + otel_hooks_to_setup.append(_get_otel_exporters()) + + span_processors = [] + metric_readers = [] + log_record_processors = [] + for otel_hooks in otel_hooks_to_setup: + for span_processor in otel_hooks.span_processors: + span_processors.append(span_processor) + for metric_reader in otel_hooks.metric_readers: + metric_readers.append(metric_reader) + for log_record_processor in otel_hooks.log_record_processors: + log_record_processors.append(log_record_processor) + + # Try to set up OTel tracing. + # If the TracerProvider was already set outside of ADK, this would be a no-op + # and results in a warning. In such case we rely on user setup. + if span_processors: + new_tracer_provider = TracerProvider(resource=otel_resource) + for exporter in span_processors: + new_tracer_provider.add_span_processor(exporter) + trace.set_tracer_provider(new_tracer_provider) + + # Try to set up OTel metrics. + # If the MeterProvider was already set outside of ADK, this would be a no-op + # and results in a warning. In such case we rely on user setup. + if metric_readers: + metrics.set_meter_provider( + MeterProvider( + metric_readers=metric_readers, + resource=otel_resource, + ) + ) + + # Try to set up OTel logging. + # If the LoggerProvider was already set outside of ADK, this would be a no-op + # and results in a warning. In such case we rely on user setup. + if log_record_processors: + new_logger_provider = LoggerProvider( + resource=otel_resource, + ) + for exporter in log_record_processors: + new_logger_provider.add_log_record_processor(exporter) + _logs.set_logger_provider(new_logger_provider) + # Add event provider to logger provider to support gen_ai events. + event_logger_provider = EventLoggerProvider(new_logger_provider) + _events.set_event_logger_provider(event_logger_provider) + + +def _get_otel_resource() -> Resource: + # The OTELResourceDetector populates resource labels from + # environment variables like OTEL_SERVICE_NAME and OTEL_RESOURCE_ATTRIBUTES. + return OTELResourceDetector().detect() + + +def _get_otel_exporters() -> OTelHooks: + span_processors = [] + if os.getenv(otel_env.OTEL_EXPORTER_OTLP_ENDPOINT) or os.getenv( + otel_env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + ): + span_processors.append(_get_otel_span_exporter()) + + metric_readers = [] + if os.getenv(otel_env.OTEL_EXPORTER_OTLP_ENDPOINT) or os.getenv( + otel_env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT + ): + metric_readers.append(_get_otel_metrics_exporter()) + + log_record_processors = [] + if os.getenv(otel_env.OTEL_EXPORTER_OTLP_ENDPOINT) or os.getenv( + otel_env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT + ): + log_record_processors.append(_get_otel_logs_exporter()) + + return OTelHooks( + span_processors=span_processors, + metric_readers=metric_readers, + log_record_processors=log_record_processors, + ) + + +def _get_otel_span_exporter() -> SpanProcessor: + from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter + + return BatchSpanProcessor(OTLPSpanExporter()) + + +def _get_otel_metrics_exporter() -> MetricReader: + from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter + + return PeriodicExportingMetricReader(OTLPMetricExporter()) + + +def _get_otel_logs_exporter() -> LogRecordProcessor: + from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter + + return BatchLogRecordProcessor(OTLPLogExporter()) diff --git a/src/google/adk/telemetry.py b/src/google/adk/telemetry/tracing.py similarity index 53% rename from src/google/adk/telemetry.py rename to src/google/adk/telemetry/tracing.py index 8c6f417229..bda9fd0be8 100644 --- a/src/google/adk/telemetry.py +++ b/src/google/adk/telemetry/tracing.py @@ -24,18 +24,44 @@ from __future__ import annotations import json +import os from typing import Any +from typing import Optional +from typing import TYPE_CHECKING from google.genai import types from opentelemetry import trace -from .agents.invocation_context import InvocationContext -from .events.event import Event -from .models.llm_request import LlmRequest -from .models.llm_response import LlmResponse -from .tools.base_tool import BaseTool - -tracer = trace.get_tracer('gcp.vertex.agent') +from .. import version +from ..events.event import Event + +# By default some ADK spans include attributes with potential PII data. +# This env, when set to false, allows to disable populating those attributes. +ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS = 'ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS' +# TODO: Replace with constant from opentelemetry.semconv when it reaches version 1.37 in g3. +GEN_AI_AGENT_DESCRIPTION = 'gen_ai.agent.description' +GEN_AI_AGENT_NAME = 'gen_ai.agent.name' +GEN_AI_CONVERSATION_ID = 'gen_ai.conversation.id' +GEN_AI_OPERATION_NAME = 'gen_ai.operation.name' +GEN_AI_TOOL_CALL_ID = 'gen_ai.tool.call.id' +GEN_AI_TOOL_DESCRIPTION = 'gen_ai.tool.description' +GEN_AI_TOOL_NAME = 'gen_ai.tool.name' +GEN_AI_TOOL_TYPE = 'gen_ai.tool.type' + +# Needed to avoid circular imports +if TYPE_CHECKING: + from ..agents.base_agent import BaseAgent + from ..agents.invocation_context import InvocationContext + from ..models.llm_request import LlmRequest + from ..models.llm_response import LlmResponse + from ..tools.base_tool import BaseTool + +tracer = trace.get_tracer( + instrumenting_module_name='gcp.vertex.agent', + instrumenting_library_version=version.__version__, + # TODO: Replace with constant from opentelemetry.semconv when it reaches version 1.37 in g3. + schema_url='https://opentelemetry.io/schemas/1.37.0', +) def _safe_json_serialize(obj) -> str: @@ -57,10 +83,43 @@ def _safe_json_serialize(obj) -> str: return '' +def trace_agent_invocation( + span: trace.Span, agent: BaseAgent, ctx: InvocationContext +) -> None: + """Sets span attributes immediately available on agent invocation according to OTEL semconv version 1.37. + + Args: + span: Span on which attributes are set. + agent: Agent from which attributes are gathered. + ctx: InvocationContext from which attrbiutes are gathered. + + Inference related fields are not set, due to their planned removal from invoke_agent span: + https://github.com/open-telemetry/semantic-conventions/issues/2632 + + `gen_ai.agent.id` is not set because currently it's unclear what attributes this field should have, specifically: + - In which scope should it be unique (globally, given project, given agentic flow, given deployment). + - Should it be unchanging between deployments, and how this should this be achieved. + + `gen_ai.data_source.id` is not set because it's not available. + Closest type which could contain this information is types.GroundingMetadata, which does not have an ID. + + `server.*` attributes are not set pending confirmation from aabmass. + """ + + # Required + span.set_attribute(GEN_AI_OPERATION_NAME, 'invoke_agent') + + # Conditionally Required + span.set_attribute(GEN_AI_AGENT_DESCRIPTION, agent.description) + + span.set_attribute(GEN_AI_AGENT_NAME, agent.name) + span.set_attribute(GEN_AI_CONVERSATION_ID, ctx.session.id) + + def trace_tool_call( tool: BaseTool, args: dict[str, Any], - function_response_event: Event, + function_response_event: Optional[Event], ): """Traces tool call. @@ -70,40 +129,57 @@ def trace_tool_call( function_response_event: The event with the function response details. """ span = trace.get_current_span() - span.set_attribute('gen_ai.system', 'gcp.vertex.agent') - span.set_attribute('gen_ai.operation.name', 'execute_tool') - span.set_attribute('gen_ai.tool.name', tool.name) - span.set_attribute('gen_ai.tool.description', tool.description) + + span.set_attribute(GEN_AI_OPERATION_NAME, 'execute_tool') + + span.set_attribute(GEN_AI_TOOL_DESCRIPTION, tool.description) + span.set_attribute(GEN_AI_TOOL_NAME, tool.name) + + # e.g. FunctionTool + span.set_attribute(GEN_AI_TOOL_TYPE, tool.__class__.__name__) + + # Setting empty llm request and response (as UI expect these) while not + # applicable for tool_response. + span.set_attribute('gcp.vertex.agent.llm_request', '{}') + span.set_attribute('gcp.vertex.agent.llm_response', '{}') + + if _should_add_request_response_to_spans(): + span.set_attribute( + 'gcp.vertex.agent.tool_call_args', + _safe_json_serialize(args), + ) + else: + span.set_attribute('gcp.vertex.agent.tool_call_args', {}) + + # Tracing tool response tool_call_id = '' tool_response = '' - if function_response_event.content.parts: - function_response = function_response_event.content.parts[ - 0 - ].function_response + if ( + function_response_event is not None + and function_response_event.content is not None + and function_response_event.content.parts + ): + response_parts = function_response_event.content.parts + function_response = response_parts[0].function_response if function_response is not None: - tool_call_id = function_response.id - tool_response = function_response.response + if function_response.id is not None: + tool_call_id = function_response.id + if function_response.response is not None: + tool_response = function_response.response - span.set_attribute('gen_ai.tool.call.id', tool_call_id) + span.set_attribute(GEN_AI_TOOL_CALL_ID, tool_call_id) if not isinstance(tool_response, dict): tool_response = {'result': tool_response} - span.set_attribute( - 'gcp.vertex.agent.tool_call_args', - _safe_json_serialize(args), - ) - span.set_attribute('gcp.vertex.agent.event_id', function_response_event.id) - span.set_attribute( - 'gcp.vertex.agent.tool_response', - _safe_json_serialize(tool_response), - ) - # Setting empty llm request and response (as UI expect these) while not - # applicable for tool_response. - span.set_attribute('gcp.vertex.agent.llm_request', '{}') - span.set_attribute( - 'gcp.vertex.agent.llm_response', - '{}', - ) + if function_response_event is not None: + span.set_attribute('gcp.vertex.agent.event_id', function_response_event.id) + if _should_add_request_response_to_spans(): + span.set_attribute( + 'gcp.vertex.agent.tool_response', + _safe_json_serialize(tool_response), + ) + else: + span.set_attribute('gcp.vertex.agent.tool_response', {}) def trace_merged_tool_calls( @@ -121,12 +197,13 @@ def trace_merged_tool_calls( """ span = trace.get_current_span() - span.set_attribute('gen_ai.system', 'gcp.vertex.agent') - span.set_attribute('gen_ai.operation.name', 'execute_tool') - span.set_attribute('gen_ai.tool.name', '(merged tools)') - span.set_attribute('gen_ai.tool.description', '(merged tools)') - span.set_attribute('gen_ai.tool.call.id', response_event_id) + span.set_attribute(GEN_AI_OPERATION_NAME, 'execute_tool') + span.set_attribute(GEN_AI_TOOL_NAME, '(merged tools)') + span.set_attribute(GEN_AI_TOOL_DESCRIPTION, '(merged tools)') + span.set_attribute(GEN_AI_TOOL_CALL_ID, response_event_id) + + # TODO(b/441461932): See if these are still necessary span.set_attribute('gcp.vertex.agent.tool_call_args', 'N/A') span.set_attribute('gcp.vertex.agent.event_id', response_event_id) try: @@ -136,10 +213,13 @@ def trace_merged_tool_calls( except Exception: # pylint: disable=broad-exception-caught function_response_event_json = '' - span.set_attribute( - 'gcp.vertex.agent.tool_response', - function_response_event_json, - ) + if _should_add_request_response_to_spans(): + span.set_attribute( + 'gcp.vertex.agent.tool_response', + function_response_event_json, + ) + else: + span.set_attribute('gcp.vertex.agent.tool_response', {}) # Setting empty llm request and response (as UI expect these) while not # applicable for tool_response. span.set_attribute('gcp.vertex.agent.llm_request', '{}') @@ -179,10 +259,13 @@ def trace_call_llm( ) span.set_attribute('gcp.vertex.agent.event_id', event_id) # Consider removing once GenAI SDK provides a way to record this info. - span.set_attribute( - 'gcp.vertex.agent.llm_request', - _safe_json_serialize(_build_llm_request_for_trace(llm_request)), - ) + if _should_add_request_response_to_spans(): + span.set_attribute( + 'gcp.vertex.agent.llm_request', + _safe_json_serialize(_build_llm_request_for_trace(llm_request)), + ) + else: + span.set_attribute('gcp.vertex.agent.llm_request', {}) # Consider removing once GenAI SDK provides a way to record this info. if llm_request.config: if llm_request.config.top_p: @@ -201,10 +284,13 @@ def trace_call_llm( except Exception: # pylint: disable=broad-exception-caught llm_response_json = '' - span.set_attribute( - 'gcp.vertex.agent.llm_response', - llm_response_json, - ) + if _should_add_request_response_to_spans(): + span.set_attribute( + 'gcp.vertex.agent.llm_response', + llm_response_json, + ) + else: + span.set_attribute('gcp.vertex.agent.llm_response', {}) if llm_response.usage_metadata is not None: span.set_attribute( @@ -217,9 +303,13 @@ def trace_call_llm( llm_response.usage_metadata.candidates_token_count, ) if llm_response.finish_reason: + try: + finish_reason_str = llm_response.finish_reason.value.lower() + except AttributeError: + finish_reason_str = str(llm_response.finish_reason).lower() span.set_attribute( 'gen_ai.response.finish_reasons', - [llm_response.finish_reason.value.lower()], + [finish_reason_str], ) @@ -245,15 +335,18 @@ def trace_send_data( span.set_attribute('gcp.vertex.agent.event_id', event_id) # Once instrumentation is added to the GenAI SDK, consider whether this # information still needs to be recorded by the Agent Development Kit. - span.set_attribute( - 'gcp.vertex.agent.data', - _safe_json_serialize([ - types.Content(role=content.role, parts=content.parts).model_dump( - exclude_none=True - ) - for content in data - ]), - ) + if _should_add_request_response_to_spans(): + span.set_attribute( + 'gcp.vertex.agent.data', + _safe_json_serialize([ + types.Content(role=content.role, parts=content.parts).model_dump( + exclude_none=True + ) + for content in data + ]), + ) + else: + span.set_attribute('gcp.vertex.agent.data', {}) def _build_llm_request_for_trace(llm_request: LlmRequest) -> dict[str, Any]: @@ -269,7 +362,7 @@ def _build_llm_request_for_trace(llm_request: LlmRequest) -> dict[str, Any]: Returns: A dictionary representation of the LLM request. """ - # Some fields in LlmRequest are function pointers and can not be serialized. + # Some fields in LlmRequest are function pointers and cannot be serialized. result = { 'model': llm_request.model, 'config': llm_request.config.model_dump( @@ -286,3 +379,14 @@ def _build_llm_request_for_trace(llm_request: LlmRequest) -> dict[str, Any]: ) ) return result + + +# Defaults to true for now to preserve backward compatibility. +# Once prompt and response logging is well established in ADK, we might start +# a deprecation of request/response content in spans by switching the default +# to false. +def _should_add_request_response_to_spans() -> bool: + disabled_via_env_var = os.getenv( + ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS, 'true' + ).lower() in ('false', '0') + return not disabled_via_env_var diff --git a/src/google/adk/tools/__init__.py b/src/google/adk/tools/__init__.py index bb26d4941a..f5250d0a17 100644 --- a/src/google/adk/tools/__init__.py +++ b/src/google/adk/tools/__init__.py @@ -18,11 +18,13 @@ from .agent_tool import AgentTool from .apihub_tool.apihub_toolset import APIHubToolset from .base_tool import BaseTool +from .discovery_engine_search_tool import DiscoveryEngineSearchTool from .enterprise_search_tool import enterprise_web_search_tool as enterprise_web_search from .example_tool import ExampleTool from .exit_loop_tool import exit_loop from .function_tool import FunctionTool from .get_user_choice_tool import get_user_choice_tool as get_user_choice +from .google_maps_grounding_tool import google_maps_grounding from .google_search_tool import google_search from .load_artifacts_tool import load_artifacts_tool as load_artifacts from .load_memory_tool import load_memory_tool as load_memory @@ -38,7 +40,9 @@ 'APIHubToolset', 'AuthToolArguments', 'BaseTool', + 'DiscoveryEngineSearchTool', 'enterprise_web_search', + 'google_maps_grounding', 'google_search', 'url_context', 'VertexAiSearchTool', @@ -63,7 +67,9 @@ ) else: from .mcp_tool.mcp_toolset import MCPToolset + from .mcp_tool.mcp_toolset import McpToolset __all__.extend([ 'MCPToolset', + 'McpToolset', ]) diff --git a/src/google/adk/tools/_forwarding_artifact_service.py b/src/google/adk/tools/_forwarding_artifact_service.py index 44607cd1dc..c9f94208a4 100644 --- a/src/google/adk/tools/_forwarding_artifact_service.py +++ b/src/google/adk/tools/_forwarding_artifact_service.py @@ -14,12 +14,14 @@ from __future__ import annotations +from typing import Any from typing import Optional from typing import TYPE_CHECKING from google.genai import types from typing_extensions import override +from ..artifacts.base_artifact_service import ArtifactVersion from ..artifacts.base_artifact_service import BaseArtifactService if TYPE_CHECKING: @@ -39,9 +41,10 @@ async def save_artifact( *, app_name: str, user_id: str, - session_id: str, filename: str, artifact: types.Part, + session_id: Optional[str] = None, + custom_metadata: Optional[dict[str, Any]] = None, ) -> int: return await self.tool_context.save_artifact( filename=filename, artifact=artifact @@ -53,8 +56,8 @@ async def load_artifact( *, app_name: str, user_id: str, - session_id: str, filename: str, + session_id: Optional[str] = None, version: Optional[int] = None, ) -> Optional[types.Part]: return await self.tool_context.load_artifact( @@ -63,13 +66,18 @@ async def load_artifact( @override async def list_artifact_keys( - self, *, app_name: str, user_id: str, session_id: str + self, *, app_name: str, user_id: str, session_id: Optional[str] = None ) -> list[str]: return await self.tool_context.list_artifacts() @override async def delete_artifact( - self, *, app_name: str, user_id: str, session_id: str, filename: str + self, + *, + app_name: str, + user_id: str, + filename: str, + session_id: Optional[str] = None, ) -> None: del app_name, user_id, session_id if self._invocation_context.artifact_service is None: @@ -83,7 +91,12 @@ async def delete_artifact( @override async def list_versions( - self, *, app_name: str, user_id: str, session_id: str, filename: str + self, + *, + app_name: str, + user_id: str, + filename: str, + session_id: Optional[str] = None, ) -> list[int]: del app_name, user_id, session_id if self._invocation_context.artifact_service is None: @@ -94,3 +107,26 @@ async def list_versions( session_id=self._invocation_context.session.id, filename=filename, ) + + @override + async def list_artifact_versions( + self, + *, + app_name: str, + user_id: str, + filename: str, + session_id: Optional[str] = None, + ) -> list[ArtifactVersion]: + raise NotImplementedError("list_artifact_versions is not implemented yet.") + + @override + async def get_artifact_version( + self, + *, + app_name: str, + user_id: str, + filename: str, + session_id: Optional[str] = None, + version: Optional[int] = None, + ) -> Optional[ArtifactVersion]: + raise NotImplementedError("get_artifact_version is not implemented yet.") diff --git a/src/google/adk/tools/_function_parameter_parse_util.py b/src/google/adk/tools/_function_parameter_parse_util.py index ca92436ae1..53557a2c14 100644 --- a/src/google/adk/tools/_function_parameter_parse_util.py +++ b/src/google/adk/tools/_function_parameter_parse_util.py @@ -15,6 +15,7 @@ from __future__ import annotations +from enum import Enum import inspect import logging import types as typing_types @@ -53,23 +54,6 @@ def _is_builtin_primitive_or_compound( return annotation in _py_builtin_type_to_schema_type.keys() -def _update_for_default_if_mldev(schema: types.Schema): - if schema.default is not None: - # TODO(kech): Remove this workaround once mldev supports default value. - schema.default = None - logger.warning( - 'Default value is not supported in function declaration schema for' - ' Google AI.' - ) - - -def _raise_if_schema_unsupported( - variant: GoogleLLMVariant, schema: types.Schema -): - if variant == GoogleLLMVariant.GEMINI_API: - _update_for_default_if_mldev(schema) - - def _is_default_value_compatible( default_value: Any, annotation: inspect.Parameter.annotation ) -> bool: @@ -135,7 +119,19 @@ def _parse_schema_from_parameter( raise ValueError(default_value_error_msg) schema.default = param.default schema.type = _py_builtin_type_to_schema_type[param.annotation] - _raise_if_schema_unsupported(variant, schema) + return schema + if isinstance(param.annotation, type) and issubclass(param.annotation, Enum): + schema.type = types.Type.STRING + schema.enum = [e.value for e in param.annotation] + if param.default is not inspect.Parameter.empty: + default_value = ( + param.default.value + if isinstance(param.default, Enum) + else param.default + ) + if default_value not in schema.enum: + raise ValueError(default_value_error_msg) + schema.default = default_value return schema if ( get_origin(param.annotation) is Union @@ -176,7 +172,6 @@ def _parse_schema_from_parameter( if not _is_default_value_compatible(param.default, param.annotation): raise ValueError(default_value_error_msg) schema.default = param.default - _raise_if_schema_unsupported(variant, schema) return schema if isinstance(param.annotation, _GenericAlias) or isinstance( param.annotation, typing_types.GenericAlias @@ -189,7 +184,6 @@ def _parse_schema_from_parameter( if not _is_default_value_compatible(param.default, param.annotation): raise ValueError(default_value_error_msg) schema.default = param.default - _raise_if_schema_unsupported(variant, schema) return schema if origin is Literal: if not all(isinstance(arg, str) for arg in args): @@ -202,7 +196,6 @@ def _parse_schema_from_parameter( if not _is_default_value_compatible(param.default, param.annotation): raise ValueError(default_value_error_msg) schema.default = param.default - _raise_if_schema_unsupported(variant, schema) return schema if origin is list: schema.type = types.Type.ARRAY @@ -219,7 +212,6 @@ def _parse_schema_from_parameter( if not _is_default_value_compatible(param.default, param.annotation): raise ValueError(default_value_error_msg) schema.default = param.default - _raise_if_schema_unsupported(variant, schema) return schema if origin is Union: schema.any_of = [] @@ -265,7 +257,6 @@ def _parse_schema_from_parameter( if not _is_default_value_compatible(param.default, param.annotation): raise ValueError(default_value_error_msg) schema.default = param.default - _raise_if_schema_unsupported(variant, schema) return schema # all other generic alias will be invoked in raise branch if ( @@ -290,14 +281,12 @@ def _parse_schema_from_parameter( ), func_name, ) - _raise_if_schema_unsupported(variant, schema) return schema if param.annotation is None: # https://swagger.io/docs/specification/v3_0/data-models/data-types/#null # null is not a valid type in schema, use object instead. schema.type = types.Type.OBJECT schema.nullable = True - _raise_if_schema_unsupported(variant, schema) return schema raise ValueError( f'Failed to parse the parameter {param} of function {func_name} for' diff --git a/src/google/adk/tools/_gemini_schema_util.py b/src/google/adk/tools/_gemini_schema_util.py index 3903c26702..3e7b7cfd9a 100644 --- a/src/google/adk/tools/_gemini_schema_util.py +++ b/src/google/adk/tools/_gemini_schema_util.py @@ -76,29 +76,42 @@ def _to_snake_case(text: str) -> str: return text -def _sanitize_schema_type(schema: dict[str, Any]) -> dict[str, Any]: - if ("type" not in schema or not schema["type"]) and schema.keys().isdisjoint( - schema - ): - schema["type"] = "object" - if isinstance(schema.get("type"), list): - nullable = False - non_null_type = None - for t in schema["type"]: - if t == "null": - nullable = True - elif not non_null_type: - non_null_type = t - if not non_null_type: - non_null_type = "object" - if nullable: - schema["type"] = [non_null_type, "null"] +def _dereference_schema(schema: dict[str, Any]) -> dict[str, Any]: + """Resolves $ref pointers in a JSON schema.""" + + defs = schema.get("$defs", {}) + + def _resolve_refs(sub_schema: Any) -> Any: + if isinstance(sub_schema, dict): + if "$ref" in sub_schema: + ref_key = sub_schema["$ref"].split("/")[-1] + if ref_key in defs: + # Found the reference, replace it with the definition. + resolved = defs[ref_key].copy() + # Merge properties from the reference, allowing overrides. + sub_schema_copy = sub_schema.copy() + del sub_schema_copy["$ref"] + resolved.update(sub_schema_copy) + # Recursively resolve refs in the newly inserted part. + return _resolve_refs(resolved) + else: + # Reference not found, return as is. + return sub_schema + else: + # No $ref, so traverse deeper into the dictionary. + return {key: _resolve_refs(value) for key, value in sub_schema.items()} + elif isinstance(sub_schema, list): + # Traverse into lists. + return [_resolve_refs(item) for item in sub_schema] else: - schema["type"] = non_null_type - elif schema.get("type") == "null": - schema["type"] = ["object", "null"] + # Not a dict or list, return as is. + return sub_schema - return schema + dereferenced_schema = _resolve_refs(schema) + # Remove the definitions block after resolving. + if "$defs" in dereferenced_schema: + del dereferenced_schema["$defs"] + return dereferenced_schema def _sanitize_schema_formats_for_gemini( @@ -106,12 +119,17 @@ def _sanitize_schema_formats_for_gemini( ) -> dict[str, Any]: """Filters the schema to only include fields that are supported by JSONSchema.""" supported_fields: set[str] = set(_ExtendedJSONSchema.model_fields.keys()) - schema_field_names: set[str] = {"items"} # 'additional_properties' to come + # Gemini rejects schemas that include `additionalProperties`, so drop it. + supported_fields.discard("additional_properties") + schema_field_names: set[str] = {"items"} list_schema_field_names: set[str] = { "any_of", # 'one_of', 'all_of', 'not' to come } snake_case_schema = {} - dict_schema_field_names: tuple[str] = ("properties",) # 'defs' to come + dict_schema_field_names: tuple[str, ...] = ( + "properties", + "defs", + ) for field_name, field_value in schema.items(): field_name = _to_snake_case(field_name) if field_name in schema_field_names: @@ -142,20 +160,25 @@ def _sanitize_schema_formats_for_gemini( elif field_name in supported_fields and field_value is not None: snake_case_schema[field_name] = field_value - return _sanitize_schema_type(snake_case_schema) + # If the schema is empty, assume it has the type of object + if not snake_case_schema: + snake_case_schema["type"] = "object" + + return snake_case_schema def _to_gemini_schema(openapi_schema: dict[str, Any]) -> Schema: - """Converts an OpenAPI schema dictionary to a Gemini Schema object.""" + """Converts an OpenAPI v3.1. schema dictionary to a Gemini Schema object.""" if openapi_schema is None: return None if not isinstance(openapi_schema, dict): raise TypeError("openapi_schema must be a dictionary") - openapi_schema = _sanitize_schema_formats_for_gemini(openapi_schema) + dereferenced_schema = _dereference_schema(openapi_schema) + sanitized_schema = _sanitize_schema_formats_for_gemini(dereferenced_schema) return Schema.from_json_schema( - json_schema=_ExtendedJSONSchema.model_validate(openapi_schema), + json_schema=_ExtendedJSONSchema.model_validate(sanitized_schema), api_option=get_google_llm_variant(), ) diff --git a/src/google/adk/tools/_google_credentials.py b/src/google/adk/tools/_google_credentials.py index 427a4cc251..c61f942f5c 100644 --- a/src/google/adk/tools/_google_credentials.py +++ b/src/google/adk/tools/_google_credentials.py @@ -70,7 +70,7 @@ class BaseGoogleCredentialsConfig(BaseModel): `google.auth.load_credentials_from_file(...)`. See more details in https://cloud.google.com/iam/docs/service-account-creds#user-managed-keys. - When the deployed environment cannot provide a pre-existing credential, + When the deployed environment cannot provide a preexisting credential, consider setting below client_id, client_secret and scope for end users to go through oauth flow, so that agent can access the user data. """ diff --git a/src/google/adk/tools/agent_tool.py b/src/google/adk/tools/agent_tool.py index affc81bc76..dad15d0727 100644 --- a/src/google/adk/tools/agent_tool.py +++ b/src/google/adk/tools/agent_tool.py @@ -128,8 +128,13 @@ async def run_async( role='user', parts=[types.Part.from_text(text=args['request'])], ) + invocation_context = tool_context._invocation_context + parent_app_name = ( + invocation_context.app_name if invocation_context else None + ) + child_app_name = parent_app_name or self.agent.name runner = Runner( - app_name=self.agent.name, + app_name=child_app_name, agent=self.agent, artifact_service=ForwardingArtifactService(tool_context), session_service=InMemorySessionService(), @@ -137,10 +142,16 @@ async def run_async( credential_service=tool_context._invocation_context.credential_service, plugins=list(tool_context._invocation_context.plugin_manager.plugins), ) + + state_dict = { + k: v + for k, v in tool_context.state.to_dict().items() + if not k.startswith('_adk') # Filter out adk internal states + } session = await runner.session_service.create_session( - app_name=self.agent.name, + app_name=child_app_name, user_id=tool_context._invocation_context.user_id, - state=tool_context.state.to_dict(), + state=state_dict, ) last_content = None diff --git a/src/google/adk/tools/apihub_tool/apihub_toolset.py b/src/google/adk/tools/apihub_tool/apihub_toolset.py index ba4d3f4887..fe9e38bd96 100644 --- a/src/google/adk/tools/apihub_tool/apihub_toolset.py +++ b/src/google/adk/tools/apihub_tool/apihub_toolset.py @@ -114,7 +114,7 @@ def __init__( apihub_resource_name: The resource name of the API in API Hub. Example: ``projects/test-project/locations/us-central1/apis/test-api``. access_token: Google Access token. Generate with gcloud cli - ``gcloud auth auth print-access-token``. Used for fetching API Specs from API Hub. + ``gcloud auth print-access-token``. Used for fetching API Specs from API Hub. service_account_json: The service account config as a json string. Required if not using default service credential. It is used for creating the API Hub client and fetching the API Specs from API Hub. diff --git a/src/google/adk/tools/apihub_tool/clients/apihub_client.py b/src/google/adk/tools/apihub_tool/clients/apihub_client.py index 9bee236e33..84bde60297 100644 --- a/src/google/adk/tools/apihub_tool/clients/apihub_client.py +++ b/src/google/adk/tools/apihub_tool/clients/apihub_client.py @@ -37,7 +37,7 @@ class BaseAPIHubClient(ABC): @abstractmethod def get_spec_content(self, resource_name: str) -> str: - """From a given resource name, get the soec in the API Hub.""" + """From a given resource name, get the spec in the API Hub.""" raise NotImplementedError() diff --git a/src/google/adk/tools/apihub_tool/clients/secret_client.py b/src/google/adk/tools/apihub_tool/clients/secret_client.py index d5015b8aa7..f4d1486155 100644 --- a/src/google/adk/tools/apihub_tool/clients/secret_client.py +++ b/src/google/adk/tools/apihub_tool/clients/secret_client.py @@ -29,7 +29,7 @@ class SecretManagerClient: This class provides a simplified interface for retrieving secrets from Secret Manager, handling authentication using either a service account - JSON keyfile (passed as a string) or a pre-existing authorization token. + JSON keyfile (passed as a string) or a preexisting authorization token. Attributes: _credentials: Google Cloud credentials object (ServiceAccountCredentials diff --git a/src/google/adk/tools/authenticated_function_tool.py b/src/google/adk/tools/authenticated_function_tool.py index 67cc5885f7..01e44ed000 100644 --- a/src/google/adk/tools/authenticated_function_tool.py +++ b/src/google/adk/tools/authenticated_function_tool.py @@ -58,7 +58,7 @@ def __init__( the tool doesn't configure any credentials (auth_config.raw_auth_credential is missing) or the credentials configured is not enough to authenticate the tool (e.g. an OAuth - client id and client secrect is configured.) and needs client input + client id and client secret are configured) and needs client input (e.g. client need to involve the end user in an oauth flow and get back the oauth response.) """ diff --git a/src/google/adk/tools/base_authenticated_tool.py b/src/google/adk/tools/base_authenticated_tool.py index 4858e49534..6279d4f725 100644 --- a/src/google/adk/tools/base_authenticated_tool.py +++ b/src/google/adk/tools/base_authenticated_tool.py @@ -57,7 +57,7 @@ def __init__( the tool doesn't configure any credentials (auth_config.raw_auth_credential is missing) or the credentials configured is not enough to authenticate the tool (e.g. an OAuth - client id and client secrect is configured.) and needs client input + client id and client secret are configured) and needs client input (e.g. client need to involve the end user in an oauth flow and get back the oauth response.) """ @@ -69,10 +69,9 @@ def __init__( if auth_config and auth_config.auth_scheme: self._credentials_manager = CredentialManager(auth_config=auth_config) else: - logger.warning( - "auth_config or auth_config.auth_scheme is missing. Will skip" - " authentication.Using FunctionTool instead if authentication is not" - " required." + logger.debug( + "auth_config or auth_config.auth_scheme is missing, so authentication" + " will be skipped." ) self._credentials_manager = None self._response_for_auth_required = response_for_auth_required diff --git a/src/google/adk/tools/bigquery/bigquery_toolset.py b/src/google/adk/tools/bigquery/bigquery_toolset.py index 627c0bbc24..f38bf95f62 100644 --- a/src/google/adk/tools/bigquery/bigquery_toolset.py +++ b/src/google/adk/tools/bigquery/bigquery_toolset.py @@ -80,8 +80,11 @@ async def get_tools( metadata_tool.get_table_info, metadata_tool.list_dataset_ids, metadata_tool.list_table_ids, + metadata_tool.get_job_info, query_tool.get_execute_sql(self._tool_settings), query_tool.forecast, + query_tool.analyze_contribution, + query_tool.detect_anomalies, data_insights_tool.ask_data_insights, ] ] diff --git a/src/google/adk/tools/bigquery/client.py b/src/google/adk/tools/bigquery/client.py index 328afbb67c..b23626f8bb 100644 --- a/src/google/adk/tools/bigquery/client.py +++ b/src/google/adk/tools/bigquery/client.py @@ -29,16 +29,30 @@ def get_bigquery_client( *, project: Optional[str], credentials: Credentials, + location: Optional[str] = None, user_agent: Optional[str] = None, ) -> bigquery.Client: - """Get a BigQuery client.""" + """Get a BigQuery client. + + Args: + project: The GCP project ID. + credentials: The credentials to use for the request. + location: The location of the BigQuery client. + user_agent: The user agent to use for the request. + + Returns: + A BigQuery client. + """ user_agent = f"{USER_AGENT} {user_agent}" if user_agent else USER_AGENT client_info = google.api_core.client_info.ClientInfo(user_agent=user_agent) bigquery_client = bigquery.Client( - project=project, credentials=credentials, client_info=client_info + project=project, + credentials=credentials, + location=location, + client_info=client_info, ) return bigquery_client diff --git a/src/google/adk/tools/bigquery/config.py b/src/google/adk/tools/bigquery/config.py index 823c88e74c..f8e3089d5b 100644 --- a/src/google/adk/tools/bigquery/config.py +++ b/src/google/adk/tools/bigquery/config.py @@ -37,7 +37,7 @@ class WriteMode(Enum): """Only protected write operations are allowed in a BigQuery session. In this mode write operations in the anonymous dataset of a BigQuery session - are allowed. For example, a temporaray table can be created, manipulated and + are allowed. For example, a temporary table can be created, manipulated and deleted in the anonymous dataset during Agent interaction, while protecting permanent tables from being modified or deleted. To learn more about BigQuery sessions, see https://cloud.google.com/bigquery/docs/sessions-intro. @@ -82,6 +82,15 @@ class BigQueryToolConfig(BaseModel): operations (such as query execution) in a specific project. """ + location: Optional[str] = None + """BigQuery location to use for the data and compute. + + This can be set if the BigQuery tools are expected to process data in a + particular BigQuery location. If not set, then location would be automatically + determined based on the data location in the query. For all supported + locations, see https://cloud.google.com/bigquery/docs/locations. + """ + @field_validator('application_name') @classmethod def validate_application_name(cls, v): diff --git a/src/google/adk/tools/bigquery/data_insights_tool.py b/src/google/adk/tools/bigquery/data_insights_tool.py index cba4362ff0..0d7280c236 100644 --- a/src/google/adk/tools/bigquery/data_insights_tool.py +++ b/src/google/adk/tools/bigquery/data_insights_tool.py @@ -11,6 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import annotations import json from typing import Any @@ -148,6 +149,7 @@ def ask_data_insights( "systemInstruction": instructions, "options": {"chart": {"image": {"noImage": {}}}}, }, + "clientIdEnum": "GOOGLE_ADK", } resp = _get_stream( diff --git a/src/google/adk/tools/bigquery/metadata_tool.py b/src/google/adk/tools/bigquery/metadata_tool.py index 44fcdfbb33..65c7efc200 100644 --- a/src/google/adk/tools/bigquery/metadata_tool.py +++ b/src/google/adk/tools/bigquery/metadata_tool.py @@ -50,6 +50,7 @@ def list_dataset_ids( bq_client = client.get_bigquery_client( project=project_id, credentials=credentials, + location=settings.location, user_agent=settings.application_name, ) @@ -121,6 +122,7 @@ def get_dataset_info( bq_client = client.get_bigquery_client( project=project_id, credentials=credentials, + location=settings.location, user_agent=settings.application_name, ) dataset = bq_client.get_dataset( @@ -159,6 +161,7 @@ def list_table_ids( bq_client = client.get_bigquery_client( project=project_id, credentials=credentials, + location=settings.location, user_agent=settings.application_name, ) @@ -281,6 +284,7 @@ def get_table_info( bq_client = client.get_bigquery_client( project=project_id, credentials=credentials, + location=settings.location, user_agent=settings.application_name, ) return bq_client.get_table( @@ -293,3 +297,297 @@ def get_table_info( "status": "ERROR", "error_details": str(ex), } + + +def get_job_info( + project_id: str, + job_id: str, + credentials: Credentials, + settings: BigQueryToolConfig, +) -> dict: + """Get metadata information about a BigQuery job. Including slot usage, + job configuration, job statistics, job status, original query etc. + + Args: + project_id (str): The Google Cloud project id containing the job. + job_id (str): The BigQuery job id. + credentials (Credentials): The credentials to use for the request. + settings (BigQueryToolConfig): The BigQuery tool settings. + + Returns: + dict: Dictionary representing the properties of the job. + + Examples: + >>> user may give job id in fomat of: project_id:region.job_id + like bigquery-public-data:US.bquxjob_12345678_1234567890 + >>> get_job_info("bigquery-public-data", "bquxjob_12345678_1234567890") + { + "get_job_info_response": { + "configuration": { + "jobType": "QUERY", + "query": { + "destinationTable": { + "datasetId": "_fd6de55d5d5c13fcfb0449cbf933bb695b2c3085", + "projectId": "projectid", + "tableId": "anonfbbe65d6_9782_469b_9f56_1392560314b2" + }, + "priority": "INTERACTIVE", + "query": "SELECT * FROM `projectid.dataset_id.table_id` WHERE TIMESTAMP_TRUNC(_PARTITIONTIME, DAY) = TIMESTAMP(\"2025-10-29\") LIMIT 1000", + "useLegacySql": false, + "writeDisposition": "WRITE_TRUNCATE" + } + }, + "etag": "EdeYv9sdcO7tD9HsffvcuQ==", + "id": "projectid:US.job-id", + "jobCreationReason": { + "code": "REQUESTED" + }, + "jobReference": { + "jobId": "job-id", + "location": "US", + "projectId": "projectid" + }, + "kind": "bigquery#job", + "principal_subject": "user:abc@google.com", + "selfLink": "https://bigquery.googleapis.com/bigquery/v2/projects/projectid/jobs/job-id?location=US", + "statistics": { + "creationTime": 1761760370152, + "endTime": 1761760371250, + "finalExecutionDurationMs": "489", + "query": { + "billingTier": 1, + "cacheHit": false, + "estimatedBytesProcessed": "5597805", + "metadataCacheStatistics": { + "tableMetadataCacheUsage": [ + { + "explanation": "Table does not have CMETA.", + "tableReference": { + "datasetId": "datasetId", + "projectId": "projectid", + "tableId": "tableId" + }, + "unusedReason": "OTHER_REASON" + } + ] + }, + "queryPlan": [ + { + "completedParallelInputs": "3", + "computeMode": "BIGQUERY", + "computeMsAvg": "13", + "computeMsMax": "15", + "computeRatioAvg": 0.054852320675105488, + "computeRatioMax": 0.063291139240506333, + "endMs": "1761760370422", + "id": "0", + "name": "S00: Input", + "parallelInputs": "8", + "readMsAvg": "18", + "readMsMax": "21", + "readRatioAvg": 0.0759493670886076, + "readRatioMax": 0.088607594936708861, + "recordsRead": "1690", + "recordsWritten": "1690", + "shuffleOutputBytes": "1031149", + "shuffleOutputBytesSpilled": "0", + "slotMs": "157", + "startMs": "1761760370388", + "status": "COMPLETE", + "steps": [ + { + "kind": "READ", + "substeps": [ + "$2:extendedFields.$is_not_null, $3:extendedFields.traceId, $4:span.$is_not_null, $5:span.spanKind, $6:span.endTime, $7:span.startTime, $8:span.parentSpanId, $9:span.spanId, $10:span.name, $11:span.childSpanCount.$is_not_null, $12:span.childSpanCount.value, $13:span.sameProcessAsParentSpan.$is_not_null, $14:span.sameProcessAsParentSpan.value, $15:span.status.$is_not_null, $16:span.status.message, $17:span.status.code", + "FROM projectid.dataset_id.table_id", + "WHERE equal(timestamp_trunc($1, 3), 1761696000.000000000)" + ] + }, + { + "kind": "LIMIT", + "substeps": [ + "1000" + ] + }, + { + "kind": "WRITE", + "substeps": [ + "$2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17", + "TO __stage00_output" + ] + } + ], + "waitMsAvg": "1", + "waitMsMax": "1", + "waitRatioAvg": 0.0042194092827004216, + "waitRatioMax": 0.0042194092827004216, + "writeMsAvg": "2", + "writeMsMax": "2", + "writeRatioAvg": 0.0084388185654008432, + "writeRatioMax": 0.0084388185654008432 + }, + { + "completedParallelInputs": "1", + "computeMode": "BIGQUERY", + "computeMsAvg": "22", + "computeMsMax": "22", + "computeRatioAvg": 0.092827004219409287, + "computeRatioMax": 0.092827004219409287, + "endMs": "1761760370428", + "id": "1", + "inputStages": [ + "0" + ], + "name": "S01: Compute+", + "parallelInputs": "1", + "readMsAvg": "0", + "readMsMax": "0", + "readRatioAvg": 0, + "readRatioMax": 0, + "recordsRead": "1001", + "recordsWritten": "1000", + "shuffleOutputBytes": "800157", + "shuffleOutputBytesSpilled": "0", + "slotMs": "29", + "startMs": "1761760370398", + "status": "COMPLETE", + "steps": [ + { + "kind": "READ", + "substeps": [ + "$2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17", + "FROM __stage00_output" + ] + }, + { + "kind": "COMPUTE", + "substeps": [ + "$130 := MAKE_STRUCT($3, $2)", + "$131 := MAKE_STRUCT($10, $9, $8, MAKE_STRUCT($29, $28, $27), $7, $6, MAKE_STRUCT(...), MAKE_STRUCT(...), MAKE_STRUCT(...), ...)" + ] + }, + { + "kind": "LIMIT", + "substeps": [ + "1000" + ] + }, + { + "kind": "WRITE", + "substeps": [ + "$130, $131", + "TO __stage01_output" + ] + } + ], + "waitMsAvg": "7", + "waitMsMax": "7", + "waitRatioAvg": 0.029535864978902954, + "waitRatioMax": 0.029535864978902954, + "writeMsAvg": "4", + "writeMsMax": "4", + "writeRatioAvg": 0.016877637130801686, + "writeRatioMax": 0.016877637130801686 + }, + { + "completedParallelInputs": "1", + "computeMode": "BIGQUERY", + "computeMsAvg": "33", + "computeMsMax": "33", + "computeRatioAvg": 0.13924050632911392, + "computeRatioMax": 0.13924050632911392, + "endMs": "1761760370745", + "id": "2", + "inputStages": [ + "1" + ], + "name": "S02: Output", + "parallelInputs": "1", + "readMsAvg": "0", + "readMsMax": "0", + "readRatioAvg": 0, + "readRatioMax": 0, + "recordsRead": "1000", + "recordsWritten": "1000", + "shuffleOutputBytes": "459829", + "shuffleOutputBytesSpilled": "0", + "slotMs": "106", + "startMs": "1761760370667", + "status": "COMPLETE", + "steps": [ + { + "kind": "READ", + "substeps": [ + "$130, $131", + "FROM __stage01_output" + ] + }, + { + "kind": "WRITE", + "substeps": [ + "$130, $131", + "TO __stage02_output" + ] + } + ], + "waitMsAvg": "237", + "waitMsMax": "237", + "waitRatioAvg": 1, + "waitRatioMax": 1, + "writeMsAvg": "55", + "writeMsMax": "55", + "writeRatioAvg": 0.2320675105485232, + "writeRatioMax": 0.2320675105485232 + } + ], + "referencedTables": [ + { + "datasetId": "dataset_id", + "projectId": "projectid", + "tableId": "table_id" + } + ], + "statementType": "SELECT", + "timeline": [ + { + "completedUnits": "5", + "elapsedMs": "492", + "estimatedRunnableUnits": "0", + "pendingUnits": "5", + "totalSlotMs": "293" + } + ], + "totalBytesBilled": "10485760", + "totalBytesProcessed": "5597805", + "totalPartitionsProcessed": "2", + "totalSlotMs": "293", + "transferredBytes": "0" + }, + "startTime": 1761760370268, + "totalBytesProcessed": "5597805", + "totalSlotMs": "293" + }, + "status": { + "state": "DONE" + }, + "user_email": "abc@google.com" + } + } + """ + try: + bq_client = client.get_bigquery_client( + project=project_id, + credentials=credentials, + location=settings.location, + user_agent=settings.application_name, + ) + job = bq_client.get_job(job_id) + # We need to use _properties to get the job info because it contains all + # the job info. + # pylint: disable=protected-access + return job._properties + except Exception as ex: + return { + "status": "ERROR", + "error_details": str(ex), + } diff --git a/src/google/adk/tools/bigquery/query_tool.py b/src/google/adk/tools/bigquery/query_tool.py index f4a82871f9..4a4913d3d7 100644 --- a/src/google/adk/tools/bigquery/query_tool.py +++ b/src/google/adk/tools/bigquery/query_tool.py @@ -19,6 +19,7 @@ import types from typing import Callable from typing import Optional +import uuid from google.auth.credentials import Credentials from google.cloud import bigquery @@ -37,6 +38,7 @@ def execute_sql( credentials: Credentials, settings: BigQueryToolConfig, tool_context: ToolContext, + dry_run: bool = False, ) -> dict: """Run a BigQuery or BigQuery ML SQL query in the project and return the result. @@ -47,12 +49,17 @@ def execute_sql( credentials (Credentials): The credentials to use for the request. settings (BigQueryToolConfig): The settings for the tool. tool_context (ToolContext): The context for the tool. + dry_run (bool, default False): If True, the query will not be executed. + Instead, the query will be validated and information about the query + will be returned. Defaults to False. Returns: - dict: Dictionary representing the result of the query. - If the result contains the key "result_is_likely_truncated" with - value True, it means that there may be additional rows matching the - query not returned in the result. + dict: If `dry_run` is False, dictionary representing the result of the + query. If the result contains the key "result_is_likely_truncated" + with value True, it means that there may be additional rows matching + the query not returned in the result. + If `dry_run` is True, dictionary with "dry_run_info" field + containing query information returned by BigQuery. Examples: Fetch data or insights from a table: @@ -77,6 +84,39 @@ def execute_sql( } ] } + + Validate a query and estimate costs without executing it: + + >>> execute_sql( + ... "my_project", + ... "SELECT island FROM " + ... "bigquery-public-data.ml_datasets.penguins", + ... dry_run=True + ... ) + { + "status": "SUCCESS", + "dry_run_info": { + "configuration": { + "dryRun": True, + "jobType": "QUERY", + "query": { + "destinationTable": { + "datasetId": "_...", + "projectId": "my_project", + "tableId": "anon..." + }, + "priority": "INTERACTIVE", + "query": "SELECT island FROM bigquery-public-data.ml_datasets.penguins", + "useLegacySql": False, + "writeDisposition": "WRITE_TRUNCATE" + } + }, + "jobReference": { + "location": "US", + "projectId": "my_project" + } + } + } """ try: # Validate compute project if applicable @@ -97,6 +137,7 @@ def execute_sql( bq_client = client.get_bigquery_client( project=project_id, credentials=credentials, + location=settings.location, user_agent=settings.application_name, ) @@ -117,7 +158,7 @@ def execute_sql( elif settings.write_mode == WriteMode.PROTECTED: # In protected write mode, write operation only to a temporary artifact is # allowed. This artifact must have been created in a BigQuery session. In - # such a scenario the session info (session id and the anonymous dataset + # such a scenario, the session info (session id and the anonymous dataset # containing the artifact) is persisted in the tool context. bq_session_info = tool_context.state.get(BIGQUERY_SESSION_INFO_KEY, None) if bq_session_info: @@ -166,6 +207,18 @@ def execute_sql( } # Finally execute the query and fetch the result + if dry_run: + job_config_kwargs = {"dry_run": True} + if bq_connection_properties: + job_config_kwargs["connection_properties"] = bq_connection_properties + job_config = bigquery.QueryJobConfig(**job_config_kwargs) + dry_run_job = bq_client.query( + query, + project=project_id, + job_config=job_config, + ) + return {"status": "SUCCESS", "dry_run_info": dry_run_job.to_api_repr()} + job_config = ( bigquery.QueryJobConfig(connection_properties=bq_connection_properties) if bq_connection_properties @@ -213,12 +266,17 @@ def _execute_sql_write_mode(*args, **kwargs) -> dict: credentials (Credentials): The credentials to use for the request. settings (BigQueryToolConfig): The settings for the tool. tool_context (ToolContext): The context for the tool. + dry_run (bool, default False): If True, the query will not be executed. + Instead, the query will be validated and information about the query + will be returned. Defaults to False. Returns: - dict: Dictionary representing the result of the query. - If the result contains the key "result_is_likely_truncated" with - value True, it means that there may be additional rows matching the - query not returned in the result. + dict: If `dry_run` is False, dictionary representing the result of the + query. If the result contains the key "result_is_likely_truncated" + with value True, it means that there may be additional rows matching + the query not returned in the result. + If `dry_run` is True, dictionary with "dry_run_info" field + containing query information returned by BigQuery. Examples: Fetch data or insights from a table: @@ -244,6 +302,39 @@ def _execute_sql_write_mode(*args, **kwargs) -> dict: ] } + Validate a query and estimate costs without executing it: + + >>> execute_sql( + ... "my_project", + ... "SELECT island FROM " + ... "bigquery-public-data.ml_datasets.penguins", + ... dry_run=True + ... ) + { + "status": "SUCCESS", + "dry_run_info": { + "configuration": { + "dryRun": True, + "jobType": "QUERY", + "query": { + "destinationTable": { + "datasetId": "_...", + "projectId": "my_project", + "tableId": "anon..." + }, + "priority": "INTERACTIVE", + "query": "SELECT island FROM bigquery-public-data.ml_datasets.penguins", + "useLegacySql": False, + "writeDisposition": "WRITE_TRUNCATE" + } + }, + "jobReference": { + "location": "US", + "projectId": "my_project" + } + } + } + Create a table with schema prescribed: >>> execute_sql("my_project", @@ -395,12 +486,17 @@ def _execute_sql_protected_write_mode(*args, **kwargs) -> dict: credentials (Credentials): The credentials to use for the request. settings (BigQueryToolConfig): The settings for the tool. tool_context (ToolContext): The context for the tool. + dry_run (bool, default False): If True, the query will not be executed. + Instead, the query will be validated and information about the query + will be returned. Defaults to False. Returns: - dict: Dictionary representing the result of the query. - If the result contains the key "result_is_likely_truncated" with - value True, it means that there may be additional rows matching the - query not returned in the result. + dict: If `dry_run` is False, dictionary representing the result of the + query. If the result contains the key "result_is_likely_truncated" + with value True, it means that there may be additional rows matching + the query not returned in the result. + If `dry_run` is True, dictionary with "dry_run_info" field + containing query information returned by BigQuery. Examples: Fetch data or insights from a table: @@ -426,6 +522,39 @@ def _execute_sql_protected_write_mode(*args, **kwargs) -> dict: ] } + Validate a query and estimate costs without executing it: + + >>> execute_sql( + ... "my_project", + ... "SELECT island FROM " + ... "bigquery-public-data.ml_datasets.penguins", + ... dry_run=True + ... ) + { + "status": "SUCCESS", + "dry_run_info": { + "configuration": { + "dryRun": True, + "jobType": "QUERY", + "query": { + "destinationTable": { + "datasetId": "_...", + "projectId": "my_project", + "tableId": "anon..." + }, + "priority": "INTERACTIVE", + "query": "SELECT island FROM bigquery-public-data.ml_datasets.penguins", + "useLegacySql": False, + "writeDisposition": "WRITE_TRUNCATE" + } + }, + "jobReference": { + "location": "US", + "projectId": "my_project" + } + } + } + Create a temporary table with schema prescribed: >>> execute_sql("my_project", @@ -604,11 +733,12 @@ def forecast( history_data: str, timestamp_col: str, data_col: str, + horizon: int = 10, + id_cols: Optional[list[str]] = None, + *, credentials: Credentials, settings: BigQueryToolConfig, tool_context: ToolContext, - horizon: int = 10, - id_cols: Optional[list[str]] = None, ) -> dict: """Run a BigQuery AI time series forecast using AI.FORECAST. @@ -622,14 +752,14 @@ def forecast( each data point. data_col (str): The name of the column containing the numerical values to be forecasted. - credentials (Credentials): The credentials to use for the request. - settings (BigQueryToolConfig): The settings for the tool. - tool_context (ToolContext): The context for the tool. horizon (int, optional): The number of time steps to forecast into the future. Defaults to 10. id_cols (list, optional): The column names of the id columns to indicate each time series when there are multiple time series in the table. All elements must be strings. Defaults to None. + credentials (Credentials): The credentials to use for the request. + settings (BigQueryToolConfig): The settings for the tool. + tool_context (ToolContext): The context for the tool. Returns: dict: Dictionary representing the result of the forecast. The result @@ -763,3 +893,429 @@ def forecast( ) """ return execute_sql(project_id, query, credentials, settings, tool_context) + + +def analyze_contribution( + project_id: str, + input_data: str, + contribution_metric: str, + dimension_id_cols: list[str], + is_test_col: str, + credentials: Credentials, + settings: BigQueryToolConfig, + tool_context: ToolContext, + top_k_insights: int = 30, + pruning_method: str = "PRUNE_REDUNDANT_INSIGHTS", +) -> dict: + """Run a BigQuery ML contribution analysis using ML.CREATE_MODEL and ML.GET_INSIGHTS. + + Args: + project_id (str): The GCP project id in which the query should be + executed. + input_data (str): The data that contain the test and control data to + analyze. Can be a fully qualified BigQuery table ID or a SQL query. + dimension_id_cols (list[str]): The column names of the dimension columns. + contribution_metric (str): The name of the column that contains the metric + to analyze. Provides the expression to use to calculate the metric you + are analyzing. To calculate a summable metric, the expression must be in + the form SUM(metric_column_name), where metric_column_name is a numeric + data type. To calculate a summable ratio metric, the expression must be + in the form + SUM(numerator_metric_column_name)/SUM(denominator_metric_column_name), + where numerator_metric_column_name and denominator_metric_column_name + are numeric data types. To calculate a summable by category metric, the + expression must be in the form + SUM(metric_sum_column_name)/COUNT(DISTINCT categorical_column_name). The + summed column must be a numeric data type. The categorical column must + have type BOOL, DATE, DATETIME, TIME, TIMESTAMP, STRING, or INT64. + is_test_col (str): The name of the column to use to determine whether a + given row is test data or control data. The column must have a BOOL data + type. + credentials: The credentials to use for the request. + settings: The settings for the tool. + tool_context: The context for the tool. + top_k_insights (int, optional): The number of top insights to return, + ranked by apriori support. Defaults to 30. + pruning_method (str, optional): The method to use for pruning redundant + insights. Can be 'NO_PRUNING' or 'PRUNE_REDUNDANT_INSIGHTS'. Defaults to + "PRUNE_REDUNDANT_INSIGHTS". + + Returns: + dict: Dictionary representing the result of the contribution analysis. + + Examples: + Analyze the contribution of different dimensions to the total sales: + + >>> analyze_contribution( + ... project_id="my-gcp-project", + ... input_data="my-dataset.my-sales-table", + ... dimension_id_cols=["store_id", "product_category"], + ... contribution_metric="SUM(total_sales)", + ... is_test_col="is_test" + ... ) + The return is: + { + "status": "SUCCESS", + "rows": [ + { + "store_id": "S1", + "product_category": "Electronics", + "contributors": ["S1", "Electronics"], + "metric_test": 120, + "metric_control": 100, + "difference": 20, + "relative_difference": 0.2, + "unexpected_difference": 5, + "relative_unexpected_difference": 0.043, + "apriori_support": 0.15 + }, + ... + ] + } + + Analyze the contribution of different dimensions to the total sales using + a SQL query as input: + + >>> analyze_contribution( + ... project_id="my-gcp-project", + ... input_data="SELECT store_id, product_category, total_sales, " + ... "is_test FROM `my-project.my-dataset.my-sales-table` " + ... "WHERE transaction_date > '2025-01-01'" + ... dimension_id_cols=["store_id", "product_category"], + ... contribution_metric="SUM(total_sales)", + ... is_test_col="is_test" + ... ) + The return is: + { + "status": "SUCCESS", + "rows": [ + { + "store_id": "S2", + "product_category": "Groceries", + "contributors": ["S2", "Groceries"], + "metric_test": 250, + "metric_control": 200, + "difference": 50, + "relative_difference": 0.25, + "unexpected_difference": 10, + "relative_unexpected_difference": 0.041, + "apriori_support": 0.22 + }, + ... + ] + } + """ + if not all(isinstance(item, str) for item in dimension_id_cols): + return { + "status": "ERROR", + "error_details": "All elements in dimension_id_cols must be strings.", + } + + # Generate a unique temporary model name + model_name = ( + f"contribution_analysis_model_{str(uuid.uuid4()).replace('-', '_')}" + ) + + id_cols_str = "[" + ", ".join([f"'{col}'" for col in dimension_id_cols]) + "]" + options = [ + "MODEL_TYPE = 'CONTRIBUTION_ANALYSIS'", + f"CONTRIBUTION_METRIC = '{contribution_metric}'", + f"IS_TEST_COL = '{is_test_col}'", + f"DIMENSION_ID_COLS = {id_cols_str}", + ] + + options.append(f"TOP_K_INSIGHTS_BY_APRIORI_SUPPORT = {top_k_insights}") + + upper_pruning = pruning_method.upper() + if upper_pruning not in ["NO_PRUNING", "PRUNE_REDUNDANT_INSIGHTS"]: + return { + "status": "ERROR", + "error_details": f"Invalid pruning_method: {pruning_method}", + } + options.append(f"PRUNING_METHOD = '{upper_pruning}'") + + options_str = ", ".join(options) + + trimmed_upper_input_data = input_data.strip().upper() + if trimmed_upper_input_data.startswith( + "SELECT" + ) or trimmed_upper_input_data.startswith("WITH"): + input_data_source = f"({input_data})" + else: + input_data_source = f"SELECT * FROM `{input_data}`" + + create_model_query = f""" + CREATE TEMP MODEL {model_name} + OPTIONS ({options_str}) + AS {input_data_source} + """ + + get_insights_query = f""" + SELECT * FROM ML.GET_INSIGHTS(MODEL {model_name}) + """ + + # Create a session and run the create model query. + original_write_mode = settings.write_mode + try: + if original_write_mode == WriteMode.BLOCKED: + raise ValueError("analyze_contribution is not allowed in this session.") + elif original_write_mode != WriteMode.PROTECTED: + # Running create temp model requires a session. So we set the write mode + # to PROTECTED to run the create model query and job query in the same + # session. + settings.write_mode = WriteMode.PROTECTED + + result = execute_sql( + project_id, + create_model_query, + credentials, + settings, + tool_context, + ) + if result["status"] != "SUCCESS": + return result + + result = execute_sql( + project_id, + get_insights_query, + credentials, + settings, + tool_context, + ) + except Exception as ex: # pylint: disable=broad-except + return { + "status": "ERROR", + "error_details": f"Error during analyze_contribution: {str(ex)}", + } + finally: + # Restore the original write mode. + settings.write_mode == original_write_mode + + return result + + +def detect_anomalies( + project_id: str, + history_data: str, + times_series_timestamp_col: str, + times_series_data_col: str, + horizon: Optional[int] = 10, + target_data: Optional[str] = None, + times_series_id_cols: Optional[list[str]] = None, + anomaly_prob_threshold: Optional[float] = 0.95, + *, + credentials: Credentials, + settings: BigQueryToolConfig, + tool_context: ToolContext, +) -> dict: + """Run a BigQuery time series ARIMA_PLUS model training and anomaly detection using CREATE MODEL and ML.DETECT_ANOMALIES clauses. + + Args: + project_id (str): The GCP project id in which the query should be + executed. + history_data (str): The table id of the BigQuery table containing the + history time series data or a query statement that select the history + data. + times_series_timestamp_col (str): The name of the colum containing the + timestamp for each data point. + times_series_data_col (str): The name of the column containing the + numerical values to be forecasted and anomaly detected. + horizon (int, optional): The number of time steps to forecast into the + future. Defaults to 10. + target_data (str, optional): The table id of the BigQuery table containing + the target time series data or a query statement that select the target + data. + times_series_id_cols (list, optional): The column names of the id columns + to indicate each time series when there are multiple time series in the + table. All elements must be strings. Defaults to None. + anomaly_prob_threshold (float, optional): The probability threshold to + determine if a data point is an anomaly. Defaults to 0.95. + credentials (Credentials): The credentials to use for the request. + settings (BigQueryToolConfig): The settings for the tool. + tool_context (ToolContext): The context for the tool. + + Returns: + dict: Dictionary representing the result of the anomaly detection. The + result contains the boolean value if the data point is anomaly or + not, lower bound, upper bound and anomaly probability for each data + point and also the probability of whether the data point is anomaly + or not. + + Examples: + Detect Anomalies daily sales based on historical data from a BigQuery + table: + + >>> detect_anomalies( + ... project_id="my-gcp-project", + ... history_data="my-dataset.my-sales-table", + ... times_series_timestamp_col="sale_date", + ... times_series_data_col="daily_sales" + ... ) + { + "status": "SUCCESS", + "rows": [ + { + "ts_timestamp": "2021-01-01 00:00:01 UTC", + "ts_data": 125.3, + "is_anomaly": TRUE, + "lower_bound": 129.5, + "upper_bound": 133.6 , + "anomaly_probability": 0.93 + }, + ... + ] + } + + Detect Anomalies on multiple time series using a SQL query as input: + + >>> history_query = ( + ... "SELECT unique_id, timestamp, value " + ... "FROM `my-project.my-dataset.my-timeseries-table` " + ... "WHERE timestamp > '1980-01-01'" + ... ) + >>> detect_anomalies( + ... project_id="my-gcp-project", + ... history_data=history_query, + ... times_series_timestamp_col="timestamp", + ... times_series_data_col="value", + ... times_series_id_cols=["unique_id"] + ... ) + { + "status": "SUCCESS", + "rows": [ + { + "unique_id": "T1", + "ts_timestamp": "2021-01-01 00:00:01 UTC", + "ts_data": 125.3, + "is_anomaly": TRUE, + "lower_bound": 129.5, + "upper_bound": 133.6 , + "anomaly_probability": 0.93 + }, + ... + ] + } + + Error Scenarios: + When an element in `times_series_id_cols` is not a string: + + >>> detect_anomalies( + ... project_id="my-gcp-project", + ... history_data="my-dataset.my-sales-table", + ... times_series_timestamp_col="sale_date", + ... times_series_data_col="daily_sales", + ... times_series_id_cols=["store_id", 123] + ... ) + { + "status": "ERROR", + "error_details": "All elements in times_series_id_cols must be + strings." + } + + When `history_data` refers to a table that does not exist: + + >>> detect_anomalies( + ... project_id="my-gcp-project", + ... history_data="my-dataset.non-existent-table", + ... times_series_timestamp_col="sale_date", + ... times_series_data_col="daily_sales" + ... ) + { + "status": "ERROR", + "error_details": "Not found: Table + my-gcp-project:my-dataset.non-existent-table was not found in + location US" + } + """ + trimmed_upper_history_data = history_data.strip().upper() + if trimmed_upper_history_data.startswith( + "SELECT" + ) or trimmed_upper_history_data.startswith("WITH"): + history_data_source = f"({history_data})" + else: + history_data_source = f"SELECT * FROM `{history_data}`" + + options = [ + "MODEL_TYPE = 'ARIMA_PLUS'", + f"TIME_SERIES_TIMESTAMP_COL = '{times_series_timestamp_col}'", + f"TIME_SERIES_DATA_COL = '{times_series_data_col}'", + f"HORIZON = {horizon}", + ] + + if times_series_id_cols: + if not all(isinstance(item, str) for item in times_series_id_cols): + return { + "status": "ERROR", + "error_details": ( + "All elements in times_series_id_cols must be strings." + ), + } + times_series_id_cols_str = ( + "[" + ", ".join([f"'{col}'" for col in times_series_id_cols]) + "]" + ) + options.append(f"TIME_SERIES_ID_COL = {times_series_id_cols_str}") + + options_str = ", ".join(options) + + model_name = f"detect_anomalies_model_{str(uuid.uuid4()).replace('-', '_')}" + + create_model_query = f""" + CREATE TEMP MODEL {model_name} + OPTIONS ({options_str}) + AS {history_data_source} + """ + + anomaly_detection_query = f""" + SELECT * FROM ML.DETECT_ANOMALIES(MODEL {model_name}, STRUCT({anomaly_prob_threshold} AS anomaly_prob_threshold)) + """ + if target_data: + trimmed_upper_target_data = target_data.strip().upper() + if trimmed_upper_target_data.startswith( + "SELECT" + ) or trimmed_upper_target_data.startswith("WITH"): + target_data_source = f"({target_data})" + else: + target_data_source = f"SELECT * FROM `{target_data}`" + + anomaly_detection_query = f""" + SELECT * FROM ML.DETECT_ANOMALIES(MODEL {model_name}, STRUCT({anomaly_prob_threshold} AS anomaly_prob_threshold), {target_data_source}) + """ + + # Create a session and run the create model query. + original_write_mode = settings.write_mode + try: + if settings.write_mode == WriteMode.BLOCKED: + raise ValueError("anomaly detection is not allowed in this session.") + elif original_write_mode != WriteMode.PROTECTED: + # Running create temp model requires a session. So we set the write mode + # to PROTECTED to run the create model query and job query in the same + # session. + settings.write_mode = WriteMode.PROTECTED + + result = execute_sql( + project_id, + create_model_query, + credentials, + settings, + tool_context, + ) + if result["status"] != "SUCCESS": + return result + + result = execute_sql( + project_id, + anomaly_detection_query, + credentials, + settings, + tool_context, + ) + except Exception as ex: # pylint: disable=broad-except + return { + "status": "ERROR", + "error_details": f"Error during anomaly detection: {str(ex)}", + } + finally: + # Restore the original write mode. + settings.write_mode == original_write_mode + + return result diff --git a/src/google/adk/tools/computer_use/computer_use_toolset.py b/src/google/adk/tools/computer_use/computer_use_toolset.py index 8834b5a453..4a5f0295bc 100644 --- a/src/google/adk/tools/computer_use/computer_use_toolset.py +++ b/src/google/adk/tools/computer_use/computer_use_toolset.py @@ -190,11 +190,7 @@ async def process_llm_request( # Check if computer use is already configured for tool in llm_request.config.tools: - if ( - isinstance(tool, (types.Tool, types.ToolDict)) - and hasattr(tool, "computer_use") - and tool.computer_use - ): + if isinstance(tool, types.Tool) and tool.computer_use: logger.debug("Computer use already configured in LLM request") return @@ -206,9 +202,7 @@ async def process_llm_request( types.Environment.ENVIRONMENT_BROWSER, ) llm_request.config.tools.append( - types.Tool( - computer_use=types.ToolComputerUse(environment=environment) - ) + types.Tool(computer_use=types.ComputerUse(environment=environment)) ) logger.debug( "Added computer use tool with environment: %s", diff --git a/src/google/adk/tools/crewai_tool.py b/src/google/adk/tools/crewai_tool.py index 9dfe7cc752..eaef479274 100644 --- a/src/google/adk/tools/crewai_tool.py +++ b/src/google/adk/tools/crewai_tool.py @@ -14,6 +14,10 @@ from __future__ import annotations +import inspect +from typing import Any +from typing import Callable + from google.genai import types from typing_extensions import override @@ -21,6 +25,7 @@ from .function_tool import FunctionTool from .tool_configs import BaseToolConfig from .tool_configs import ToolArgsConfig +from .tool_context import ToolContext try: from crewai.tools import BaseTool as CrewaiBaseTool @@ -29,7 +34,7 @@ if sys.version_info < (3, 10): raise ImportError( - "Crewai Tools require Python 3.10+. Please upgrade your Python version." + 'Crewai Tools require Python 3.10+. Please upgrade your Python version.' ) from e else: raise ImportError( @@ -55,12 +60,72 @@ def __init__(self, tool: CrewaiBaseTool, *, name: str, description: str): elif tool.name: # Right now, CrewAI tool name contains white spaces. White spaces are # not supported in our framework. So we replace them with "_". - self.name = tool.name.replace(" ", "_").lower() + self.name = tool.name.replace(' ', '_').lower() if description: self.description = description elif tool.description: self.description = tool.description + @override + async def run_async( + self, *, args: dict[str, Any], tool_context: ToolContext + ) -> Any: + """Override run_async to handle CrewAI-specific parameter filtering. + + CrewAI tools use **kwargs pattern, so we need special parameter filtering + logic that allows all parameters to pass through while removing only + reserved parameters like 'self' and 'tool_context'. + + Note: 'tool_context' is removed from the initial args dictionary to prevent + duplicates, but is re-added if the function signature explicitly requires it + as a parameter. + """ + # Preprocess arguments (includes Pydantic model conversion) + args_to_call = self._preprocess_args(args) + + signature = inspect.signature(self.func) + valid_params = {param for param in signature.parameters} + + # Check if function accepts **kwargs + has_kwargs = any( + param.kind == inspect.Parameter.VAR_KEYWORD + for param in signature.parameters.values() + ) + + if has_kwargs: + # For functions with **kwargs, we pass all arguments. We defensively + # remove arguments like `self` that are managed by the framework and not + # intended to be passed through **kwargs. + args_to_call.pop('self', None) + # We also remove `tool_context` that might have been passed in `args`, + # as it will be explicitly injected later if it's a valid parameter. + args_to_call.pop('tool_context', None) + else: + # For functions without **kwargs, use the original filtering. + args_to_call = { + k: v for k, v in args_to_call.items() if k in valid_params + } + + # Inject tool_context if it's an explicit parameter. This will add it + # or overwrite any value that might have been passed in `args`. + if 'tool_context' in valid_params: + args_to_call['tool_context'] = tool_context + + # Check for missing mandatory arguments + mandatory_args = self._get_mandatory_args() + missing_mandatory_args = [ + arg for arg in mandatory_args if arg not in args_to_call + ] + + if missing_mandatory_args: + missing_mandatory_args_str = '\n'.join(missing_mandatory_args) + error_str = f"""Invoking `{self.name}()` failed as the following mandatory input parameters are not present: +{missing_mandatory_args_str} +You could retry calling this tool, but it is IMPORTANT for you to provide all the mandatory parameters.""" + return {'error': error_str} + + return await self._invoke_callable(self.func, args_to_call) + @override def _get_declaration(self) -> types.FunctionDeclaration: """Build the function declaration for the tool.""" @@ -93,8 +158,8 @@ class CrewaiToolConfig(BaseToolConfig): tool: str """The fully qualified path of the CrewAI tool instance.""" - name: str = "" + name: str = '' """The name of the tool.""" - description: str = "" + description: str = '' """The description of the tool.""" diff --git a/src/google/adk/tools/discovery_engine_search_tool.py b/src/google/adk/tools/discovery_engine_search_tool.py new file mode 100644 index 0000000000..0e771ece4f --- /dev/null +++ b/src/google/adk/tools/discovery_engine_search_tool.py @@ -0,0 +1,136 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Any +from typing import Optional + +from google.api_core.exceptions import GoogleAPICallError +import google.auth +from google.cloud import discoveryengine_v1beta as discoveryengine +from google.genai import types + +from .function_tool import FunctionTool + + +class DiscoveryEngineSearchTool(FunctionTool): + """Tool for searching the discovery engine.""" + + def __init__( + self, + data_store_id: Optional[str] = None, + data_store_specs: Optional[ + list[types.VertexAISearchDataStoreSpec] + ] = None, + search_engine_id: Optional[str] = None, + filter: Optional[str] = None, + max_results: Optional[int] = None, + ): + """Initializes the DiscoveryEngineSearchTool. + + Args: + data_store_id: The Vertex AI search data store resource ID in the format + of + "projects/{project}/locations/{location}/collections/{collection}/dataStores/{dataStore}". + data_store_specs: Specifications that define the specific DataStores to be + searched. It should only be set if engine is used. + search_engine_id: The Vertex AI search engine resource ID in the format of + "projects/{project}/locations/{location}/collections/{collection}/engines/{engine}". + filter: The filter to be applied to the search request. Default is None. + max_results: The maximum number of results to return. Default is None. + """ + super().__init__(self.discovery_engine_search) + if (data_store_id is None and search_engine_id is None) or ( + data_store_id is not None and search_engine_id is not None + ): + raise ValueError( + "Either data_store_id or search_engine_id must be specified." + ) + if data_store_specs is not None and search_engine_id is None: + raise ValueError( + "search_engine_id must be specified if data_store_specs is specified." + ) + + self._serving_config = ( + f"{data_store_id or search_engine_id}/servingConfigs/default_config" + ) + self._data_store_specs = data_store_specs + self._search_engine_id = search_engine_id + self._filter = filter + self._max_results = max_results + + credentials, _ = google.auth.default() + self._discovery_engine_client = discoveryengine.SearchServiceClient( + credentials=credentials + ) + + def discovery_engine_search( + self, + query: str, + ) -> dict[str, Any]: + """Search through Vertex AI Search's discovery engine search API. + + Args: + query: The search query. + + Returns: + A dictionary containing the status of the request and the list of search + results, which contains the title, url and content. + """ + request = discoveryengine.SearchRequest( + serving_config=self._serving_config, + query=query, + content_search_spec=discoveryengine.SearchRequest.ContentSearchSpec( + search_result_mode=discoveryengine.SearchRequest.ContentSearchSpec.SearchResultMode.CHUNKS, + chunk_spec=discoveryengine.SearchRequest.ContentSearchSpec.ChunkSpec( + num_previous_chunks=0, + num_next_chunks=0, + ), + ), + ) + + if self._data_store_specs: + request.data_store_specs = self._data_store_specs + if self._filter: + request.filter = self._filter + if self._max_results: + request.page_size = self._max_results + + results = [] + try: + response = self._discovery_engine_client.search(request) + for item in response.results: + chunk = item.chunk + if not chunk: + continue + + title = "" + uri = "" + doc_metadata = chunk.document_metadata + if doc_metadata: + title = doc_metadata.title + uri = doc_metadata.uri + # Prioritize URI from struct_data if it exists. + if doc_metadata.struct_data and "uri" in doc_metadata.struct_data: + uri = doc_metadata.struct_data["uri"] + + results.append({ + "title": title, + "url": uri, + "content": chunk.content, + }) + except GoogleAPICallError as e: + return {"status": "error", "error_message": str(e)} + return {"status": "success", "results": results} diff --git a/src/google/adk/tools/enterprise_search_tool.py b/src/google/adk/tools/enterprise_search_tool.py index f27b7de67f..7980f8f028 100644 --- a/src/google/adk/tools/enterprise_search_tool.py +++ b/src/google/adk/tools/enterprise_search_tool.py @@ -52,7 +52,7 @@ async def process_llm_request( if is_gemini_model(llm_request.model): if is_gemini_1_model(llm_request.model) and llm_request.config.tools: raise ValueError( - 'Enterprise web search tool can not be used with other tools in' + 'Enterprise web search tool cannot be used with other tools in' ' Gemini 1.x.' ) llm_request.config = llm_request.config or types.GenerateContentConfig() diff --git a/src/google/adk/tools/function_tool.py b/src/google/adk/tools/function_tool.py index 088b2fe137..b8b87e4ff1 100644 --- a/src/google/adk/tools/function_tool.py +++ b/src/google/adk/tools/function_tool.py @@ -18,16 +18,18 @@ import logging from typing import Any from typing import Callable +from typing import get_args +from typing import get_origin from typing import Optional from typing import Union from google.genai import types +import pydantic from typing_extensions import override from ..utils.context_utils import Aclosing from ._automatic_function_calling_util import build_function_declaration from .base_tool import BaseTool -from .tool_confirmation import ToolConfirmation from .tool_context import ToolContext logger = logging.getLogger('google_adk.' + __name__) @@ -95,11 +97,69 @@ def _get_declaration(self) -> Optional[types.FunctionDeclaration]: return function_decl + def _preprocess_args(self, args: dict[str, Any]) -> dict[str, Any]: + """Preprocess and convert function arguments before invocation. + + Currently handles: + - Converting JSON dictionaries to Pydantic model instances where expected + + Future extensions could include: + - Type coercion for other complex types + - Validation and sanitization + - Custom conversion logic + + Args: + args: Raw arguments from the LLM tool call + + Returns: + Processed arguments ready for function invocation + """ + signature = inspect.signature(self.func) + converted_args = args.copy() + + for param_name, param in signature.parameters.items(): + if param_name in args and param.annotation != inspect.Parameter.empty: + target_type = param.annotation + + # Handle Optional[PydanticModel] types + if get_origin(param.annotation) is Union: + union_args = get_args(param.annotation) + # Find the non-None type in Optional[T] (which is Union[T, None]) + non_none_types = [arg for arg in union_args if arg is not type(None)] + if len(non_none_types) == 1: + target_type = non_none_types[0] + + # Check if the target type is a Pydantic model + if inspect.isclass(target_type) and issubclass( + target_type, pydantic.BaseModel + ): + # Skip conversion if the value is None and the parameter is Optional + if args[param_name] is None: + continue + + # Convert to Pydantic model if it's not already the correct type + if not isinstance(args[param_name], target_type): + try: + converted_args[param_name] = target_type.model_validate( + args[param_name] + ) + except Exception as e: + logger.warning( + f"Failed to convert argument '{param_name}' to Pydantic model" + f' {target_type.__name__}: {e}' + ) + # Keep the original value if conversion fails + pass + + return converted_args + @override async def run_async( self, *, args: dict[str, Any], tool_context: ToolContext ) -> Any: - args_to_call = args.copy() + # Preprocess arguments (includes Pydantic model conversion) + args_to_call = self._preprocess_args(args) + signature = inspect.signature(self.func) valid_params = {param for param in signature.parameters} if 'tool_context' in valid_params: @@ -111,7 +171,7 @@ async def run_async( # Before invoking the function, we check for if the list of args passed in # has all the mandatory arguments or not. # If the check fails, then we don't invoke the tool and let the Agent know - # that there was a missing a input parameter. This will basically help + # that there was a missing input parameter. This will basically help # the underlying model fix the issue and retry. mandatory_args = self._get_mandatory_args() missing_mandatory_args = [ @@ -145,6 +205,7 @@ async def run_async( ' ToolConfirmation payload.' ), ) + tool_context.actions.skip_summarization = True return { 'error': ( 'This tool call requires confirmation, please approve or' @@ -163,7 +224,7 @@ async def _invoke_callable( # Functions are callable objects, but not all callable objects are functions # checking coroutine function is not enough. We also need to check whether - # Callable's __call__ function is a coroutine funciton + # Callable's __call__ function is a coroutine function is_async = inspect.iscoroutinefunction(target) or ( hasattr(target, '__call__') and inspect.iscoroutinefunction(target.__call__) diff --git a/src/google/adk/tools/google_api_tool/google_api_tool.py b/src/google/adk/tools/google_api_tool/google_api_tool.py index d2bac5686d..04d1ebb4b6 100644 --- a/src/google/adk/tools/google_api_tool/google_api_tool.py +++ b/src/google/adk/tools/google_api_tool/google_api_tool.py @@ -39,6 +39,8 @@ def __init__( client_id: Optional[str] = None, client_secret: Optional[str] = None, service_account: Optional[ServiceAccount] = None, + *, + additional_headers: Optional[Dict[str, str]] = None, ): super().__init__( name=rest_api_tool.name, @@ -46,9 +48,11 @@ def __init__( is_long_running=rest_api_tool.is_long_running, ) self._rest_api_tool = rest_api_tool + if additional_headers: + self._rest_api_tool.set_default_headers(additional_headers) if service_account is not None: self.configure_sa_auth(service_account) - else: + elif client_id is not None and client_secret is not None: self.configure_auth(client_id, client_secret) @override @@ -57,7 +61,7 @@ def _get_declaration(self) -> FunctionDeclaration: @override async def run_async( - self, *, args: dict[str, Any], tool_context: Optional[ToolContext] + self, *, args: Dict[str, Any], tool_context: Optional[ToolContext] ) -> Dict[str, Any]: return await self._rest_api_tool.run_async( args=args, tool_context=tool_context diff --git a/src/google/adk/tools/google_api_tool/google_api_toolset.py b/src/google/adk/tools/google_api_tool/google_api_toolset.py index 7e5de3e595..714e654229 100644 --- a/src/google/adk/tools/google_api_tool/google_api_toolset.py +++ b/src/google/adk/tools/google_api_tool/google_api_toolset.py @@ -14,6 +14,7 @@ from __future__ import annotations +from typing import Dict from typing import List from typing import Optional from typing import Union @@ -45,6 +46,8 @@ class GoogleApiToolset(BaseToolset): tool_filter: Optional filter to include only specific tools or use a predicate function. service_account: Optional service account for authentication. tool_name_prefix: Optional prefix to add to all tool names in this toolset. + additional_headers: Optional dict of HTTP headers to inject into every request + executed by this toolset. """ def __init__( @@ -56,6 +59,8 @@ def __init__( tool_filter: Optional[Union[ToolPredicate, List[str]]] = None, service_account: Optional[ServiceAccount] = None, tool_name_prefix: Optional[str] = None, + *, + additional_headers: Optional[Dict[str, str]] = None, ): super().__init__(tool_filter=tool_filter, tool_name_prefix=tool_name_prefix) self.api_name = api_name @@ -63,6 +68,7 @@ def __init__( self._client_id = client_id self._client_secret = client_secret self._service_account = service_account + self._additional_headers = additional_headers self._openapi_toolset = self._load_toolset_with_oidc_auth() @override @@ -72,7 +78,11 @@ async def get_tools( """Get all tools in the toolset.""" return [ GoogleApiTool( - tool, self._client_id, self._client_secret, self._service_account + tool, + self._client_id, + self._client_secret, + self._service_account, + additional_headers=self._additional_headers, ) for tool in await self._openapi_toolset.get_tools(readonly_context) if self._is_tool_selected(tool, readonly_context) diff --git a/src/google/adk/tools/google_maps_grounding_tool.py b/src/google/adk/tools/google_maps_grounding_tool.py new file mode 100644 index 0000000000..30cf8f3a85 --- /dev/null +++ b/src/google/adk/tools/google_maps_grounding_tool.py @@ -0,0 +1,68 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from google.genai import types +from typing_extensions import override + +from ..utils.model_name_utils import is_gemini_1_model +from ..utils.model_name_utils import is_gemini_model +from .base_tool import BaseTool +from .tool_context import ToolContext + +if TYPE_CHECKING: + from ..models import LlmRequest + + +class GoogleMapsGroundingTool(BaseTool): + """A built-in tool that is automatically invoked by Gemini 2 models to ground query results with Google Maps. + + This tool operates internally within the model and does not require or perform + local code execution. + + Only available for use with the VertexAI Gemini API (e.g. + GOOGLE_GENAI_USE_VERTEXAI=TRUE) + """ + + def __init__(self): + # Name and description are not used because this is a model built-in tool. + super().__init__(name='google_maps', description='google_maps') + + @override + async def process_llm_request( + self, + *, + tool_context: ToolContext, + llm_request: LlmRequest, + ) -> None: + llm_request.config = llm_request.config or types.GenerateContentConfig() + llm_request.config.tools = llm_request.config.tools or [] + if is_gemini_1_model(llm_request.model): + raise ValueError( + 'Google Maps grounding tool can not be used with Gemini 1.x models.' + ) + elif is_gemini_model(llm_request.model): + llm_request.config.tools.append( + types.Tool(google_maps=types.GoogleMaps()) + ) + else: + raise ValueError( + f'Google maps tool is not supported for model {llm_request.model}' + ) + + +google_maps_grounding = GoogleMapsGroundingTool() diff --git a/src/google/adk/tools/google_search_agent_tool.py b/src/google/adk/tools/google_search_agent_tool.py new file mode 100644 index 0000000000..77cb6fedf9 --- /dev/null +++ b/src/google/adk/tools/google_search_agent_tool.py @@ -0,0 +1,140 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import Any +from typing import Union + +from google.genai import types +from typing_extensions import override + +from ..agents.llm_agent import LlmAgent +from ..memory.in_memory_memory_service import InMemoryMemoryService +from ..models.base_llm import BaseLlm +from ..utils.context_utils import Aclosing +from ._forwarding_artifact_service import ForwardingArtifactService +from .agent_tool import AgentTool +from .google_search_tool import google_search +from .tool_context import ToolContext + + +def create_google_search_agent(model: Union[str, BaseLlm]) -> LlmAgent: + """Create a sub-agent that only uses google_search tool.""" + return LlmAgent( + name='google_search_agent', + model=model, + description=( + 'An agent for performing Google search using the `google_search` tool' + ), + instruction=""" + You are a specialized Google search agent. + + When given a search query, use the `google_search` tool to find the related information. + """, + tools=[google_search], + ) + + +class GoogleSearchAgentTool(AgentTool): + """A tool that wraps a sub-agent that only uses google_search tool. + + This is a workaround to support using google_search tool with other tools. + TODO(b/448114567): Remove once the workaround is no longer needed. + + Attributes: + model: The model to use for the sub-agent. + """ + + def __init__(self, agent: LlmAgent): + self.agent = agent + super().__init__(agent=self.agent) + + @override + async def run_async( + self, + *, + args: dict[str, Any], + tool_context: ToolContext, + ) -> Any: + from ..agents.llm_agent import LlmAgent + from ..runners import Runner + from ..sessions.in_memory_session_service import InMemorySessionService + + if isinstance(self.agent, LlmAgent) and self.agent.input_schema: + input_value = self.agent.input_schema.model_validate(args) + content = types.Content( + role='user', + parts=[ + types.Part.from_text( + text=input_value.model_dump_json(exclude_none=True) + ) + ], + ) + else: + content = types.Content( + role='user', + parts=[types.Part.from_text(text=args['request'])], + ) + runner = Runner( + app_name=self.agent.name, + agent=self.agent, + artifact_service=ForwardingArtifactService(tool_context), + session_service=InMemorySessionService(), + memory_service=InMemoryMemoryService(), + credential_service=tool_context._invocation_context.credential_service, + plugins=list(tool_context._invocation_context.plugin_manager.plugins), + ) + + state_dict = { + k: v + for k, v in tool_context.state.to_dict().items() + if not k.startswith('_adk') # Filter out adk internal states + } + session = await runner.session_service.create_session( + app_name=self.agent.name, + user_id=tool_context._invocation_context.user_id, + state=state_dict, + ) + + last_content = None + last_grounding_metadata = None + async with Aclosing( + runner.run_async( + user_id=session.user_id, session_id=session.id, new_message=content + ) + ) as agen: + async for event in agen: + # Forward state delta to parent session. + if event.actions.state_delta: + tool_context.state.update(event.actions.state_delta) + if event.content: + last_content = event.content + last_grounding_metadata = event.grounding_metadata + + if not last_content: + return '' + merged_text = '\n'.join(p.text for p in last_content.parts if p.text) + if isinstance(self.agent, LlmAgent) and self.agent.output_schema: + tool_result = self.agent.output_schema.model_validate_json( + merged_text + ).model_dump(exclude_none=True) + else: + tool_result = merged_text + + if last_grounding_metadata: + tool_context.state['temp:_adk_grounding_metadata'] = ( + last_grounding_metadata + ) + return tool_result diff --git a/src/google/adk/tools/google_search_tool.py b/src/google/adk/tools/google_search_tool.py index 4f64bc4a14..8d73ced8d2 100644 --- a/src/google/adk/tools/google_search_tool.py +++ b/src/google/adk/tools/google_search_tool.py @@ -35,9 +35,17 @@ class GoogleSearchTool(BaseTool): local code execution. """ - def __init__(self): + def __init__(self, *, bypass_multi_tools_limit: bool = False): + """Initializes the Google search tool. + + Args: + bypass_multi_tools_limit: Whether to bypass the multi tools limitation, + so that the tool can be used with other tools in the same agent. + """ + # Name and description are not used because this is a model built-in tool. super().__init__(name='google_search', description='google_search') + self.bypass_multi_tools_limit = bypass_multi_tools_limit @override async def process_llm_request( @@ -51,7 +59,7 @@ async def process_llm_request( if is_gemini_1_model(llm_request.model): if llm_request.config.tools: raise ValueError( - 'Google search tool can not be used with other tools in Gemini 1.x.' + 'Google search tool cannot be used with other tools in Gemini 1.x.' ) llm_request.config.tools.append( types.Tool(google_search_retrieval=types.GoogleSearchRetrieval()) diff --git a/src/google/adk/tools/google_tool.py b/src/google/adk/tools/google_tool.py index 9776fa0f57..68f11dd503 100644 --- a/src/google/adk/tools/google_tool.py +++ b/src/google/adk/tools/google_tool.py @@ -52,10 +52,10 @@ def __init__( """Initialize the Google API tool. Args: - func: callable that impelments the tool's logic, can accept one + func: callable that implements the tool's logic, can accept one 'credential" parameter credentials_config: credentials config used to call Google API. If None, - then we don't hanlde the auth logic + then we don't handle the auth logic tool_settings: Tool-specific settings. This settings should be provided by each toolset that uses this class to create customized tools. """ diff --git a/src/google/adk/tools/langchain_tool.py b/src/google/adk/tools/langchain_tool.py index 44f884ff6e..33f52b95a4 100644 --- a/src/google/adk/tools/langchain_tool.py +++ b/src/google/adk/tools/langchain_tool.py @@ -18,8 +18,8 @@ from typing import Union from google.genai import types -from langchain.agents import Tool from langchain_core.tools import BaseTool as LangchainBaseTool +from langchain_core.tools import Tool from langchain_core.tools.structured import StructuredTool from typing_extensions import override diff --git a/src/google/adk/tools/load_artifacts_tool.py b/src/google/adk/tools/load_artifacts_tool.py index db28aefb9e..09a1429294 100644 --- a/src/google/adk/tools/load_artifacts_tool.py +++ b/src/google/adk/tools/load_artifacts_tool.py @@ -15,6 +15,7 @@ from __future__ import annotations import json +import logging from typing import Any from typing import TYPE_CHECKING @@ -27,6 +28,8 @@ from ..models.llm_request import LlmRequest from .tool_context import ToolContext +logger = logging.getLogger('google_adk.' + __name__) + class LoadArtifactsTool(BaseTool): """A tool that loads the artifacts and adds them to the session.""" @@ -59,7 +62,13 @@ async def run_async( self, *, args: dict[str, Any], tool_context: ToolContext ) -> Any: artifact_names: list[str] = args.get('artifact_names', []) - return {'artifact_names': artifact_names} + return { + 'artifact_names': artifact_names, + 'status': ( + 'artifact contents temporarily inserted and removed. to access' + ' these artifacts, call load_artifacts tool again.' + ), + } @override async def process_llm_request( @@ -85,8 +94,10 @@ async def _append_artifacts_to_llm_request( {json.dumps(artifact_names)} When the user asks questions about any of the artifacts, you should call the - `load_artifacts` function to load the artifact. Do not generate any text other - than the function call. + `load_artifacts` function to load the artifact. Always call load_artifacts + before answering questions related to the artifacts, regardless of whether the + artifacts have been loaded before. Do not depend on prior answers about the + artifacts. """]) # Attach the content of the artifacts if the model requests them. @@ -96,7 +107,18 @@ async def _append_artifacts_to_llm_request( if function_response and function_response.name == 'load_artifacts': artifact_names = function_response.response['artifact_names'] for artifact_name in artifact_names: + # Try session-scoped first (default behavior) artifact = await tool_context.load_artifact(artifact_name) + + # If not found and name doesn't already have user: prefix, + # try cross-session artifacts with user: prefix + if artifact is None and not artifact_name.startswith('user:'): + prefixed_name = f'user:{artifact_name}' + artifact = await tool_context.load_artifact(prefixed_name) + + if artifact is None: + logger.warning('Artifact "%s" not found, skipping', artifact_name) + continue llm_request.contents.append( types.Content( role='user', diff --git a/src/google/adk/tools/mcp_tool/mcp_tool.py b/src/google/adk/tools/mcp_tool/mcp_tool.py index d53fa09c9b..efbffc7f25 100644 --- a/src/google/adk/tools/mcp_tool/mcp_tool.py +++ b/src/google/adk/tools/mcp_tool/mcp_tool.py @@ -15,14 +15,21 @@ from __future__ import annotations import base64 +import inspect import logging +import sys +from typing import Any +from typing import Callable +from typing import Dict from typing import Optional +from typing import Union import warnings from fastapi.openapi.models import APIKeyIn from google.genai.types import FunctionDeclaration from typing_extensions import override +from ...agents.readonly_context import ReadonlyContext from .._gemini_schema_util import _to_gemini_schema from .mcp_session_manager import MCPSessionManager from .mcp_session_manager import retry_on_closed_resource @@ -32,8 +39,6 @@ try: from mcp.types import Tool as McpBaseTool except ImportError as e: - import sys - if sys.version_info < (3, 10): raise ImportError( "MCP Tool requires Python 3.10 or above. Please upgrade your Python" @@ -70,8 +75,12 @@ def __init__( mcp_session_manager: MCPSessionManager, auth_scheme: Optional[AuthScheme] = None, auth_credential: Optional[AuthCredential] = None, + require_confirmation: Union[bool, Callable[..., bool]] = False, + header_provider: Optional[ + Callable[[ReadonlyContext], Dict[str, str]] + ] = None, ): - """Initializes an MCPTool. + """Initializes an McpTool. This tool wraps an MCP Tool interface and uses a session manager to communicate with the MCP server. @@ -81,6 +90,10 @@ def __init__( mcp_session_manager: The MCP session manager to use for communication. auth_scheme: The authentication scheme to use. auth_credential: The authentication credential to use. + require_confirmation: Whether this tool requires confirmation. A boolean + or a callable that takes the function's arguments and returns a + boolean. If the callable returns True, the tool will require + confirmation from the user. Raises: ValueError: If mcp_tool or mcp_session_manager is None. @@ -96,6 +109,8 @@ def __init__( ) self._mcp_tool = mcp_tool self._mcp_session_manager = mcp_session_manager + self._require_confirmation = require_confirmation + self._header_provider = header_provider @override def _get_declaration(self) -> FunctionDeclaration: @@ -104,18 +119,76 @@ def _get_declaration(self) -> FunctionDeclaration: Returns: FunctionDeclaration: The Gemini function declaration for the tool. """ - schema_dict = self._mcp_tool.inputSchema - parameters = _to_gemini_schema(schema_dict) + input_schema = self._mcp_tool.inputSchema + parameters = _to_gemini_schema(input_schema) function_decl = FunctionDeclaration( - name=self.name, description=self.description, parameters=parameters + name=self.name, + description=self.description, + parameters=parameters, ) return function_decl + @property + def raw_mcp_tool(self) -> McpBaseTool: + """Returns the raw MCP tool.""" + return self._mcp_tool + + async def _invoke_callable( + self, target: Callable[..., Any], args_to_call: dict[str, Any] + ) -> Any: + """Invokes a callable, handling both sync and async cases.""" + + # Functions are callable objects, but not all callable objects are functions + # checking coroutine function is not enough. We also need to check whether + # Callable's __call__ function is a coroutine funciton + is_async = inspect.iscoroutinefunction(target) or ( + hasattr(target, "__call__") + and inspect.iscoroutinefunction(target.__call__) + ) + if is_async: + return await target(**args_to_call) + else: + return target(**args_to_call) + + @override + async def run_async( + self, *, args: dict[str, Any], tool_context: ToolContext + ) -> Any: + if isinstance(self._require_confirmation, Callable): + require_confirmation = await self._invoke_callable( + self._require_confirmation, args + ) + else: + require_confirmation = bool(self._require_confirmation) + + if require_confirmation: + if not tool_context.tool_confirmation: + args_to_show = args.copy() + if "tool_context" in args_to_show: + args_to_show.pop("tool_context") + + tool_context.request_confirmation( + hint=( + f"Please approve or reject the tool call {self.name}() by" + " responding with a FunctionResponse with an expected" + " ToolConfirmation payload." + ), + ) + return { + "error": ( + "This tool call requires confirmation, please approve or" + " reject." + ) + } + elif not tool_context.tool_confirmation.confirmed: + return {"error": "This tool call is rejected."} + return await super().run_async(args=args, tool_context=tool_context) + @retry_on_closed_resource @override async def _run_async_impl( self, *, args, tool_context: ToolContext, credential: AuthCredential - ): + ) -> Dict[str, Any]: """Runs the tool asynchronously. Args: @@ -126,13 +199,27 @@ async def _run_async_impl( Any: The response from the tool. """ # Extract headers from credential for session pooling - headers = await self._get_headers(tool_context, credential) + auth_headers = await self._get_headers(tool_context, credential) + dynamic_headers = None + if self._header_provider: + dynamic_headers = self._header_provider( + ReadonlyContext(tool_context._invocation_context) + ) + + headers: Dict[str, str] = {} + if auth_headers: + headers.update(auth_headers) + if dynamic_headers: + headers.update(dynamic_headers) + final_headers = headers if headers else None # Get the session from the session manager - session = await self._mcp_session_manager.create_session(headers=headers) + session = await self._mcp_session_manager.create_session( + headers=final_headers + ) - response = await session.call_tool(self.name, arguments=args) - return response + response = await session.call_tool(self._mcp_tool.name, arguments=args) + return response.model_dump(exclude_none=True, mode="json") async def _get_headers( self, tool_context: ToolContext, credential: AuthCredential @@ -197,7 +284,7 @@ async def _get_headers( != APIKeyIn.header ): error_msg = ( - "MCPTool only supports header-based API key authentication." + "McpTool only supports header-based API key authentication." " Configured location:" f" {self._credentials_manager._auth_config.auth_scheme.in_}" ) diff --git a/src/google/adk/tools/mcp_tool/mcp_toolset.py b/src/google/adk/tools/mcp_tool/mcp_toolset.py index 7a1a054ca6..dff67eb628 100644 --- a/src/google/adk/tools/mcp_tool/mcp_toolset.py +++ b/src/google/adk/tools/mcp_tool/mcp_toolset.py @@ -16,6 +16,8 @@ import logging import sys +from typing import Callable +from typing import Dict from typing import List from typing import Optional from typing import TextIO @@ -69,7 +71,7 @@ class McpToolset(BaseToolset): Usage:: - toolset = MCPToolset( + toolset = McpToolset( connection_params=StdioServerParameters( command='npx', args=["-y", "@modelcontextprotocol/server-filesystem"], @@ -100,11 +102,16 @@ def __init__( StreamableHTTPConnectionParams, ], tool_filter: Optional[Union[ToolPredicate, List[str]]] = None, + tool_name_prefix: Optional[str] = None, errlog: TextIO = sys.stderr, auth_scheme: Optional[AuthScheme] = None, auth_credential: Optional[AuthCredential] = None, + require_confirmation: Union[bool, Callable[..., bool]] = False, + header_provider: Optional[ + Callable[[ReadonlyContext], Dict[str, str]] + ] = None, ): - """Initializes the MCPToolset. + """Initializes the McpToolset. Args: connection_params: The connection parameters to the MCP server. Can be: @@ -118,17 +125,25 @@ def __init__( tool_filter: Optional filter to select specific tools. Can be either: - A list of tool names to include - A ToolPredicate function for custom filtering logic + tool_name_prefix: A prefix to be added to the name of each tool in this + toolset. errlog: TextIO stream for error logging. auth_scheme: The auth scheme of the tool for tool calling auth_credential: The auth credential of the tool for tool calling + require_confirmation: Whether tools in this toolset require + confirmation. Can be a single boolean or a callable to apply to all + tools. + header_provider: A callable that takes a ReadonlyContext and returns a + dictionary of headers to be used for the MCP session. """ - super().__init__(tool_filter=tool_filter) + super().__init__(tool_filter=tool_filter, tool_name_prefix=tool_name_prefix) if not connection_params: - raise ValueError("Missing connection params in MCPToolset.") + raise ValueError("Missing connection params in McpToolset.") self._connection_params = connection_params self._errlog = errlog + self._header_provider = header_provider # Create the session manager that will handle the MCP connection self._mcp_session_manager = MCPSessionManager( @@ -137,6 +152,7 @@ def __init__( ) self._auth_scheme = auth_scheme self._auth_credential = auth_credential + self._require_confirmation = require_confirmation @retry_on_closed_resource async def get_tools( @@ -152,8 +168,13 @@ async def get_tools( Returns: List[BaseTool]: A list of tools available under the specified context. """ + headers = ( + self._header_provider(readonly_context) + if self._header_provider and readonly_context + else None + ) # Get session from session manager - session = await self._mcp_session_manager.create_session() + session = await self._mcp_session_manager.create_session(headers=headers) # Fetch available tools from the MCP server tools_response: ListToolsResult = await session.list_tools() @@ -166,6 +187,8 @@ async def get_tools( mcp_session_manager=self._mcp_session_manager, auth_scheme=self._auth_scheme, auth_credential=self._auth_credential, + require_confirmation=self._require_confirmation, + header_provider=self._header_provider, ) if self._is_tool_selected(mcp_tool, readonly_context): @@ -183,14 +206,14 @@ async def close(self) -> None: await self._mcp_session_manager.close() except Exception as e: # Log the error but don't re-raise to avoid blocking shutdown - print(f"Warning: Error during MCPToolset cleanup: {e}", file=self._errlog) + print(f"Warning: Error during McpToolset cleanup: {e}", file=self._errlog) @override @classmethod def from_config( - cls: type[MCPToolset], config: ToolArgsConfig, config_abs_path: str - ) -> MCPToolset: - """Creates an MCPToolset from a configuration object.""" + cls: type[McpToolset], config: ToolArgsConfig, config_abs_path: str + ) -> McpToolset: + """Creates an McpToolset from a configuration object.""" mcp_toolset_config = McpToolsetConfig.model_validate(config.model_dump()) if mcp_toolset_config.stdio_server_params: @@ -202,11 +225,12 @@ def from_config( elif mcp_toolset_config.streamable_http_connection_params: connection_params = mcp_toolset_config.streamable_http_connection_params else: - raise ValueError("No connection params found in MCPToolsetConfig.") + raise ValueError("No connection params found in McpToolsetConfig.") return cls( connection_params=connection_params, tool_filter=mcp_toolset_config.tool_filter, + tool_name_prefix=mcp_toolset_config.tool_name_prefix, auth_scheme=mcp_toolset_config.auth_scheme, auth_credential=mcp_toolset_config.auth_credential, ) @@ -225,7 +249,7 @@ def __init__(self, *args, **kwargs): class McpToolsetConfig(BaseToolConfig): - """The config for MCPToolset.""" + """The config for McpToolset.""" stdio_server_params: Optional[StdioServerParameters] = None @@ -239,6 +263,8 @@ class McpToolsetConfig(BaseToolConfig): tool_filter: Optional[List[str]] = None + tool_name_prefix: Optional[str] = None + auth_scheme: Optional[AuthScheme] = None auth_credential: Optional[AuthCredential] = None diff --git a/src/google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py b/src/google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py index f7a577afb2..06d692a2b0 100644 --- a/src/google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py +++ b/src/google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py @@ -164,8 +164,8 @@ def _dedupe_param_names(self): def _process_return_value(self) -> Parameter: """Returns a Parameter object representing the return type.""" responses = self._operation.responses or {} - # Default to Any if no 2xx response or if schema is missing - return_schema = Schema(type='Any') + # Default to empty schema if no 2xx response or if schema is missing + return_schema = Schema() # Take the 20x response with the smallest response code. valid_codes = list( diff --git a/src/google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py b/src/google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py index 2c02d55510..2f16e8ba87 100644 --- a/src/google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py +++ b/src/google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py @@ -134,6 +134,7 @@ def __init__( # Private properties self.credential_exchanger = AutoAuthCredentialExchanger() + self._default_headers: Dict[str, str] = {} if should_parse_operation: self._operation_parser = OperationParser(self.operation) @@ -216,6 +217,10 @@ def configure_auth_credential( auth_credential = AuthCredential.model_validate_json(auth_credential) self.auth_credential = auth_credential + def set_default_headers(self, headers: Dict[str, str]): + """Sets default headers that are merged into every request.""" + self._default_headers = headers + def _prepare_auth_request_params( self, auth_scheme: AuthScheme, @@ -335,6 +340,9 @@ def _prepare_request_params( k: v for k, v in query_params.items() if v is not None } + for key, value in self._default_headers.items(): + header_params.setdefault(key, value) + request_params: Dict[str, Any] = { "method": method, "url": url, diff --git a/src/google/adk/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.py b/src/google/adk/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.py index 74166b00ee..38f4d7ecdb 100644 --- a/src/google/adk/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.py +++ b/src/google/adk/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.py @@ -268,9 +268,9 @@ async def prepare_auth_credentials( ) # here exchangers are doing two different thing: - # for service account the exchanger is doing actualy token exchange - # while for oauth2 it's actually doing the credentail conversion - # from OAuth2 credential to HTTP credentails for setting credential in + # for service account the exchanger is doing actual token exchange + # while for oauth2 it's actually doing the credential conversion + # from OAuth2 credential to HTTP credentials for setting credential in # http header # TODO cleanup the logic: # 1. service account token exchanger should happen before we store them in diff --git a/src/google/adk/tools/preload_memory_tool.py b/src/google/adk/tools/preload_memory_tool.py index 943e9dd7d1..88d21112c2 100644 --- a/src/google/adk/tools/preload_memory_tool.py +++ b/src/google/adk/tools/preload_memory_tool.py @@ -14,6 +14,7 @@ from __future__ import annotations +import logging from typing import TYPE_CHECKING from typing_extensions import override @@ -25,6 +26,8 @@ if TYPE_CHECKING: from ..models import LlmRequest +logger = logging.getLogger('google_adk.' + __name__) + class PreloadMemoryTool(BaseTool): """A tool that preloads the memory for the current user. @@ -56,7 +59,12 @@ async def process_llm_request( return user_query: str = user_content.parts[0].text - response = await tool_context.search_memory(user_query) + try: + response = await tool_context.search_memory(user_query) + except Exception: + logging.warning('Failed to preload memory for query: %s', user_query) + return + if not response.memories: return diff --git a/src/google/adk/tools/retrieval/vertex_ai_rag_retrieval.py b/src/google/adk/tools/retrieval/vertex_ai_rag_retrieval.py index 64c835f74c..15cf3b00c4 100644 --- a/src/google/adk/tools/retrieval/vertex_ai_rag_retrieval.py +++ b/src/google/adk/tools/retrieval/vertex_ai_rag_retrieval.py @@ -22,9 +22,9 @@ from google.genai import types from typing_extensions import override -from vertexai.preview import rag -from ...utils.model_name_utils import is_gemini_2_model +from ...dependencies.vertexai import rag +from ...utils.model_name_utils import is_gemini_2_or_above from ..tool_context import ToolContext from .base_retrieval_tool import BaseRetrievalTool @@ -63,7 +63,7 @@ async def process_llm_request( llm_request: LlmRequest, ) -> None: # Use Gemini built-in Vertex AI RAG tool for Gemini 2 models. - if is_gemini_2_model(llm_request.model): + if is_gemini_2_or_above(llm_request.model): llm_request.config = ( types.GenerateContentConfig() if not llm_request.config diff --git a/src/google/adk/tools/spanner/query_tool.py b/src/google/adk/tools/spanner/query_tool.py index e317a0ce35..f6fa5a34ac 100644 --- a/src/google/adk/tools/spanner/query_tool.py +++ b/src/google/adk/tools/spanner/query_tool.py @@ -14,17 +14,12 @@ from __future__ import annotations -import json - from google.auth.credentials import Credentials -from google.cloud.spanner_admin_database_v1.types import DatabaseDialect -from . import client +from . import utils from ..tool_context import ToolContext from .settings import SpannerToolSettings -DEFAULT_MAX_EXECUTED_QUERY_RESULT_ROWS = 50 - def execute_sql( project_id: str, @@ -68,47 +63,12 @@ def execute_sql( Note: This is running with Read-Only Transaction for query that only read data. """ - - try: - # Get Spanner client - spanner_client = client.get_spanner_client( - project=project_id, credentials=credentials - ) - instance = spanner_client.instance(instance_id) - database = instance.database(database_id) - - if database.database_dialect == DatabaseDialect.POSTGRESQL: - return { - "status": "ERROR", - "error_details": "PostgreSQL dialect is not supported.", - } - - with database.snapshot() as snapshot: - result_set = snapshot.execute_sql(query) - rows = [] - counter = ( - settings.max_executed_query_result_rows - if settings and settings.max_executed_query_result_rows > 0 - else DEFAULT_MAX_EXECUTED_QUERY_RESULT_ROWS - ) - for row in result_set: - try: - # if the json serialization of the row succeeds, use it as is - json.dumps(row) - except: - row = str(row) - - rows.append(row) - counter -= 1 - if counter <= 0: - break - - result = {"status": "SUCCESS", "rows": rows} - if counter <= 0: - result["result_is_likely_truncated"] = True - return result - except Exception as ex: - return { - "status": "ERROR", - "error_details": str(ex), - } + return utils.execute_sql( + project_id, + instance_id, + database_id, + query, + credentials, + settings, + tool_context, + ) diff --git a/src/google/adk/tools/spanner/search_tool.py b/src/google/adk/tools/spanner/search_tool.py new file mode 100644 index 0000000000..b3cf797edf --- /dev/null +++ b/src/google/adk/tools/spanner/search_tool.py @@ -0,0 +1,442 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import json +from typing import Any +from typing import Dict +from typing import List +from typing import Optional + +from google.adk.tools.spanner import client +from google.adk.tools.spanner.settings import SpannerToolSettings +from google.adk.tools.tool_context import ToolContext +from google.auth.credentials import Credentials +from google.cloud.spanner_admin_database_v1.types import DatabaseDialect +from google.cloud.spanner_v1.database import Database + +# Embedding options +_SPANNER_EMBEDDING_MODEL_NAME = "spanner_embedding_model_name" +_VERTEX_AI_EMBEDDING_MODEL_ENDPOINT = "vertex_ai_embedding_model_endpoint" + +# Search options +_TOP_K = "top_k" +_DISTANCE_TYPE = "distance_type" +_NEAREST_NEIGHBORS_ALGORITHM = "nearest_neighbors_algorithm" +_EXACT_NEAREST_NEIGHBORS = "EXACT_NEAREST_NEIGHBORS" +_APPROXIMATE_NEAREST_NEIGHBORS = "APPROXIMATE_NEAREST_NEIGHBORS" +_NUM_LEAVES_TO_SEARCH = "num_leaves_to_search" + +# Constants +_DISTANCE_ALIAS = "distance" +_GOOGLESQL_PARAMETER_TEXT_QUERY = "query" +_POSTGRESQL_PARAMETER_TEXT_QUERY = "1" +_GOOGLESQL_PARAMETER_QUERY_EMBEDDING = "embedding" +_POSTGRESQL_PARAMETER_QUERY_EMBEDDING = "1" + + +def _generate_googlesql_for_embedding_query( + spanner_embedding_model_name: str, +) -> str: + return f""" + SELECT embeddings.values + FROM ML.PREDICT( + MODEL {spanner_embedding_model_name}, + (SELECT CAST(@{_GOOGLESQL_PARAMETER_TEXT_QUERY} AS STRING) as content) + ) + """ + + +def _generate_postgresql_for_embedding_query( + vertex_ai_embedding_model_endpoint: str, +) -> str: + return f""" + SELECT spanner.FLOAT32_ARRAY( spanner.ML_PREDICT_ROW( + '{vertex_ai_embedding_model_endpoint}', + JSONB_BUILD_OBJECT( + 'instances', + JSONB_BUILD_ARRAY( JSONB_BUILD_OBJECT( + 'content', + ${_POSTGRESQL_PARAMETER_TEXT_QUERY}::TEXT + )) + ) + ) -> 'predictions'->0->'embeddings'->'values' ) + """ + + +def _get_embedding_for_query( + database: Database, + dialect: DatabaseDialect, + spanner_embedding_model_name: Optional[str], + vertex_ai_embedding_model_endpoint: Optional[str], + query: str, +) -> List[float]: + """Gets the embedding for the query.""" + if dialect == DatabaseDialect.POSTGRESQL: + embedding_query = _generate_postgresql_for_embedding_query( + vertex_ai_embedding_model_endpoint + ) + params = {f"p{_POSTGRESQL_PARAMETER_TEXT_QUERY}": query} + else: + embedding_query = _generate_googlesql_for_embedding_query( + spanner_embedding_model_name + ) + params = {_GOOGLESQL_PARAMETER_TEXT_QUERY: query} + with database.snapshot() as snapshot: + result_set = snapshot.execute_sql(embedding_query, params=params) + return result_set.one()[0] + + +def _get_postgresql_distance_function(distance_type: str) -> str: + return { + "COSINE_DISTANCE": "spanner.cosine_distance", + "EUCLIDEAN_DISTANCE": "spanner.euclidean_distance", + "DOT_PRODUCT": "spanner.dot_product", + }[distance_type] + + +def _get_googlesql_distance_function(distance_type: str, ann: bool) -> str: + if ann: + return { + "COSINE_DISTANCE": "APPROX_COSINE_DISTANCE", + "EUCLIDEAN_DISTANCE": "APPROX_EUCLIDEAN_DISTANCE", + "DOT_PRODUCT": "APPROX_DOT_PRODUCT", + }[distance_type] + return { + "COSINE_DISTANCE": "COSINE_DISTANCE", + "EUCLIDEAN_DISTANCE": "EUCLIDEAN_DISTANCE", + "DOT_PRODUCT": "DOT_PRODUCT", + }[distance_type] + + +def _generate_sql_for_knn( + dialect: DatabaseDialect, + table_name: str, + embedding_column_to_search: str, + columns, + additional_filter: Optional[str], + distance_type: str, + top_k: int, +) -> str: + """Generates a SQL query for kNN search.""" + if dialect == DatabaseDialect.POSTGRESQL: + distance_function = _get_postgresql_distance_function(distance_type) + embedding_parameter = f"${_POSTGRESQL_PARAMETER_QUERY_EMBEDDING}" + else: + distance_function = _get_googlesql_distance_function( + distance_type, ann=False + ) + embedding_parameter = f"@{_GOOGLESQL_PARAMETER_QUERY_EMBEDDING}" + columns = columns + [f"""{distance_function}( + {embedding_column_to_search}, + {embedding_parameter}) AS {_DISTANCE_ALIAS} + """] + columns = ", ".join(columns) + if additional_filter is None: + additional_filter = "1=1" + + optional_limit_clause = "" + if top_k > 0: + optional_limit_clause = f"""LIMIT {top_k}""" + return f""" + SELECT {columns} + FROM {table_name} + WHERE {additional_filter} + ORDER BY {_DISTANCE_ALIAS} + {optional_limit_clause} + """ + + +def _generate_sql_for_ann( + dialect: DatabaseDialect, + table_name: str, + embedding_column_to_search: str, + columns, + additional_filter: Optional[str], + distance_type: str, + top_k: int, + num_leaves_to_search: int, +): + """Generates a SQL query for ANN search.""" + if dialect == DatabaseDialect.POSTGRESQL: + raise NotImplementedError( + f"{_APPROXIMATE_NEAREST_NEIGHBORS} is not supported for PostgreSQL" + " dialect." + ) + distance_function = _get_googlesql_distance_function(distance_type, ann=True) + columns = columns + [f"""{distance_function}( + {embedding_column_to_search}, + @{_GOOGLESQL_PARAMETER_QUERY_EMBEDDING}, + options => JSON '{{"num_leaves_to_search": {num_leaves_to_search}}}' + ) AS {_DISTANCE_ALIAS} + """] + columns = ", ".join(columns) + query_filter = f"{embedding_column_to_search} IS NOT NULL" + if additional_filter is not None: + query_filter = f"{query_filter} AND {additional_filter}" + + return f""" + SELECT {columns} + FROM {table_name} + WHERE {query_filter} + ORDER BY {_DISTANCE_ALIAS} + LIMIT {top_k} + """ + + +def similarity_search( + project_id: str, + instance_id: str, + database_id: str, + table_name: str, + query: str, + embedding_column_to_search: str, + columns: List[str], + embedding_options: Dict[str, str], + credentials: Credentials, + settings: SpannerToolSettings, + tool_context: ToolContext, + additional_filter: Optional[str] = None, + search_options: Optional[Dict[str, Any]] = None, +) -> Dict[str, Any]: + # fmt: off + """Similarity search in Spanner using a text query. + + The function will use embedding service (provided from options) to embed + the text query automatically, then use the embedding vector to do similarity + search and to return requested data. This is suitable when the Spanner table + contains a column that stores the embeddings of the data that we want to + search the `query` against. + + Args: + project_id (str): The GCP project id in which the spanner database + resides. + instance_id (str): The instance id of the spanner database. + database_id (str): The database id of the spanner database. + table_name (str): The name of the table used for vector search. + query (str): The user query for which the tool will find the top similar + content. The query will be embedded and used for vector search. + embedding_column_to_search (str): The name of the column that contains the + embeddings of the documents. The tool will do similarity search on this + column. + columns (List[str]): A list of column names, representing the additional + columns to return in the search results. + embedding_options (Dict[str, str]): A dictionary of options to use for + the embedding service. The following options are supported: + - spanner_embedding_model_name: (For GoogleSQL dialect) The + name of the embedding model that is registered in Spanner via a + `CREATE MODEL` statement. For more details, see + https://cloud.google.com/spanner/docs/ml-tutorial-embeddings#generate_and_store_text_embeddings + - vertex_ai_embedding_model_endpoint: (For PostgreSQL dialect) + The fully qualified endpoint of the Vertex AI embedding model, + in the format of + `projects/$project/locations/$location/publishers/google/models/$model_name`, + where $project is the project hosting the Vertex AI endpoint, + $location is the location of the endpoint, and $model_name is + the name of the text embedding model. + credentials (Credentials): The credentials to use for the request. + settings (SpannerToolSettings): The configuration for the tool. + tool_context (ToolContext): The context for the tool. + additional_filter (Optional[str]): An optional filter to apply to the + search query. If provided, this will be added to the WHERE clause of the + final query. + search_options (Optional[Dict[str, Any]]): A dictionary of options to use + for the similarity search. The following options are supported: + - top_k: The number of most similar documents to return. The + default value is 4. + - distance_type: The distance type to use to perform the + similarity search. Valid values include "COSINE_DISTANCE", + "EUCLIDEAN_DISTANCE", and "DOT_PRODUCT". Default value is + "COSINE_DISTANCE". + - nearest_neighbors_algorithm: The nearest neighbors search + algorithm to use. Valid values include "EXACT_NEAREST_NEIGHBORS" + and "APPROXIMATE_NEAREST_NEIGHBORS". Default value is + "EXACT_NEAREST_NEIGHBORS". + - num_leaves_to_search: (Only applies when the + nearest_neighbors_algorithm is APPROXIMATE_NEAREST_NEIGHBORS.) + The number of leaves to search in the vector index. + + Returns: + Dict[str, Any]: A dictionary representing the result of the search. + On success, it contains {"status": "SUCCESS", "rows": [...]}. The last + column of each row is the distance between the query and the column + embedding (i.e. the embedding_column_to_search). + On error, it contains {"status": "ERROR", "error_details": "..."}. + + Examples: + Search for relevant products given a user's text description and a filter + on the price: + >>> similarity_search( + ... project_id="my-project", + ... instance_id="my-instance", + ... database_id="my-database", + ... table_name="my-product-table", + ... query="Tools that can help me clean my house.", + ... embedding_column_to_search="product_description_embedding", + ... columns=["product_name", "product_description", "price_in_cents"], + ... credentials=credentials, + ... settings=settings, + ... tool_context=tool_context, + ... additional_filter="price_in_cents < 100000", + ... embedding_options={ + ... "spanner_embedding_model_name": "my_embedding_model" + ... }, + ... search_options={ + ... "top_k": 2, + ... "distance_type": "COSINE_DISTANCE" + ... } + ... ) + { + "status": "SUCCESS", + "rows": [ + ( + "Powerful Robot Vacuum", + "This is a powerful robot vacuum that can clean carpets and wood floors.", + 99999, + 0.31, + ), + ( + "Nice Mop", + "Great for cleaning different surfaces.", + 5099, + 0.45, + ), + ], + } + """ + # fmt: on + try: + # Get Spanner client + spanner_client = client.get_spanner_client( + project=project_id, credentials=credentials + ) + instance = spanner_client.instance(instance_id) + database = instance.database(database_id) + + assert database.database_dialect in [ + DatabaseDialect.GOOGLE_STANDARD_SQL, + DatabaseDialect.POSTGRESQL, + ], ( + "Unsupported database dialect: %s" % database.database_dialect + ) + + if embedding_options is None: + embedding_options = {} + if search_options is None: + search_options = {} + spanner_embedding_model_name = embedding_options.get( + _SPANNER_EMBEDDING_MODEL_NAME + ) + if ( + database.database_dialect == DatabaseDialect.GOOGLE_STANDARD_SQL + and spanner_embedding_model_name is None + ): + raise ValueError( + f"embedding_options['{_SPANNER_EMBEDDING_MODEL_NAME}']" + " must be specified for GoogleSQL dialect." + ) + vertex_ai_embedding_model_endpoint = embedding_options.get( + _VERTEX_AI_EMBEDDING_MODEL_ENDPOINT + ) + if ( + database.database_dialect == DatabaseDialect.POSTGRESQL + and vertex_ai_embedding_model_endpoint is None + ): + raise ValueError( + f"embedding_options['{_VERTEX_AI_EMBEDDING_MODEL_ENDPOINT}']" + " must be specified for PostgreSQL dialect." + ) + + # Use cosine distance by default. + distance_type = search_options.get(_DISTANCE_TYPE) + if distance_type is None: + distance_type = "COSINE_DISTANCE" + + top_k = search_options.get(_TOP_K) + if top_k is None: + top_k = 4 + + # Use EXACT_NEAREST_NEIGHBORS (i.e. kNN) by default. + nearest_neighbors_algorithm = search_options.get( + _NEAREST_NEIGHBORS_ALGORITHM, _EXACT_NEAREST_NEIGHBORS + ) + if nearest_neighbors_algorithm not in ( + _EXACT_NEAREST_NEIGHBORS, + _APPROXIMATE_NEAREST_NEIGHBORS, + ): + raise NotImplementedError( + f"Unsupported search_options['{_NEAREST_NEIGHBORS_ALGORITHM}']:" + f" {nearest_neighbors_algorithm}" + ) + + embedding = _get_embedding_for_query( + database, + database.database_dialect, + spanner_embedding_model_name, + vertex_ai_embedding_model_endpoint, + query, + ) + + if nearest_neighbors_algorithm == _EXACT_NEAREST_NEIGHBORS: + sql = _generate_sql_for_knn( + database.database_dialect, + table_name, + embedding_column_to_search, + columns, + additional_filter, + distance_type, + top_k, + ) + else: + num_leaves_to_search = search_options.get(_NUM_LEAVES_TO_SEARCH) + if num_leaves_to_search is None: + num_leaves_to_search = 1000 + sql = _generate_sql_for_ann( + database.database_dialect, + table_name, + embedding_column_to_search, + columns, + additional_filter, + distance_type, + top_k, + num_leaves_to_search, + ) + + if database.database_dialect == DatabaseDialect.POSTGRESQL: + params = {f"p{_POSTGRESQL_PARAMETER_QUERY_EMBEDDING}": embedding} + else: + params = {_GOOGLESQL_PARAMETER_QUERY_EMBEDDING: embedding} + + with database.snapshot() as snapshot: + result_set = snapshot.execute_sql(sql, params=params) + rows = [] + result = {} + for row in result_set: + try: + # if the json serialization of the row succeeds, use it as is + json.dumps(row) + except: + row = str(row) + + rows.append(row) + + result["status"] = "SUCCESS" + result["rows"] = rows + return result + except Exception as ex: + return { + "status": "ERROR", + "error_details": str(ex), + } diff --git a/src/google/adk/tools/spanner/spanner_toolset.py b/src/google/adk/tools/spanner/spanner_toolset.py index 29e5a63871..861314abb3 100644 --- a/src/google/adk/tools/spanner/spanner_toolset.py +++ b/src/google/adk/tools/spanner/spanner_toolset.py @@ -19,10 +19,11 @@ from typing import Union from google.adk.agents.readonly_context import ReadonlyContext +from google.adk.tools.spanner import metadata_tool +from google.adk.tools.spanner import query_tool +from google.adk.tools.spanner import search_tool from typing_extensions import override -from . import metadata_tool -from . import query_tool from ...tools.base_tool import BaseTool from ...tools.base_toolset import BaseToolset from ...tools.base_toolset import ToolPredicate @@ -113,6 +114,13 @@ async def get_tools( tool_settings=self._tool_settings, ) ) + all_tools.append( + GoogleTool( + func=search_tool.similarity_search, + credentials_config=self._credentials_config, + tool_settings=self._tool_settings, + ) + ) return [ tool diff --git a/src/google/adk/tools/spanner/utils.py b/src/google/adk/tools/spanner/utils.py new file mode 100644 index 0000000000..64c03859e1 --- /dev/null +++ b/src/google/adk/tools/spanner/utils.py @@ -0,0 +1,107 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import json +from typing import Optional + +from google.auth.credentials import Credentials +from google.cloud.spanner_admin_database_v1.types import DatabaseDialect + +from . import client +from ..tool_context import ToolContext +from .settings import SpannerToolSettings + +DEFAULT_MAX_EXECUTED_QUERY_RESULT_ROWS = 50 + + +def execute_sql( + project_id: str, + instance_id: str, + database_id: str, + query: str, + credentials: Credentials, + settings: SpannerToolSettings, + tool_context: ToolContext, + params: Optional[dict] = None, + params_types: Optional[dict] = None, +) -> dict: + """Utility function to run a Spanner Read-Only query in the spanner database and return the result. + + Args: + project_id (str): The GCP project id in which the spanner database + resides. + instance_id (str): The instance id of the spanner database. + database_id (str): The database id of the spanner database. + query (str): The Spanner SQL query to be executed. + credentials (Credentials): The credentials to use for the request. + settings (SpannerToolSettings): The settings for the tool. + tool_context (ToolContext): The context for the tool. + params (dict): values for parameter replacement. Keys must match the + names used in ``query``. + params_types (dict): maps explicit types for one or more param values. + + Returns: + dict: Dictionary with the result of the query. + If the result contains the key "result_is_likely_truncated" with + value True, it means that there may be additional rows matching the + query not returned in the result. + """ + + try: + # Get Spanner client + spanner_client = client.get_spanner_client( + project=project_id, credentials=credentials + ) + instance = spanner_client.instance(instance_id) + database = instance.database(database_id) + + if database.database_dialect == DatabaseDialect.POSTGRESQL: + return { + "status": "ERROR", + "error_details": "PostgreSQL dialect is not supported.", + } + + with database.snapshot() as snapshot: + result_set = snapshot.execute_sql( + sql=query, params=params, param_types=params_types + ) + rows = [] + counter = ( + settings.max_executed_query_result_rows + if settings and settings.max_executed_query_result_rows > 0 + else DEFAULT_MAX_EXECUTED_QUERY_RESULT_ROWS + ) + for row in result_set: + try: + # if the json serialization of the row succeeds, use it as is + json.dumps(row) + except: + row = str(row) + + rows.append(row) + counter -= 1 + if counter <= 0: + break + + result = {"status": "SUCCESS", "rows": rows} + if counter <= 0: + result["result_is_likely_truncated"] = True + return result + except Exception as ex: + return { + "status": "ERROR", + "error_details": str(ex), + } diff --git a/src/google/adk/tools/url_context_tool.py b/src/google/adk/tools/url_context_tool.py index 95d6536026..10ce142bb1 100644 --- a/src/google/adk/tools/url_context_tool.py +++ b/src/google/adk/tools/url_context_tool.py @@ -20,7 +20,7 @@ from typing_extensions import override from ..utils.model_name_utils import is_gemini_1_model -from ..utils.model_name_utils import is_gemini_2_model +from ..utils.model_name_utils import is_gemini_2_or_above from .base_tool import BaseTool from .tool_context import ToolContext @@ -49,8 +49,8 @@ async def process_llm_request( llm_request.config = llm_request.config or types.GenerateContentConfig() llm_request.config.tools = llm_request.config.tools or [] if is_gemini_1_model(llm_request.model): - raise ValueError('Url context tool can not be used in Gemini 1.x.') - elif is_gemini_2_model(llm_request.model): + raise ValueError('Url context tool cannot be used in Gemini 1.x.') + elif is_gemini_2_or_above(llm_request.model): llm_request.config.tools.append( types.Tool(url_context=types.UrlContext()) ) diff --git a/src/google/adk/tools/vertex_ai_search_tool.py b/src/google/adk/tools/vertex_ai_search_tool.py index 1a658ef62c..aff5be1552 100644 --- a/src/google/adk/tools/vertex_ai_search_tool.py +++ b/src/google/adk/tools/vertex_ai_search_tool.py @@ -47,6 +47,7 @@ def __init__( search_engine_id: Optional[str] = None, filter: Optional[str] = None, max_results: Optional[int] = None, + bypass_multi_tools_limit: bool = False, ): """Initializes the Vertex AI Search tool. @@ -58,6 +59,10 @@ def __init__( searched. It should only be set if engine is used. search_engine_id: The Vertex AI search engine resource ID in the format of "projects/{project}/locations/{location}/collections/{collection}/engines/{engine}". + filter: The filter to apply to the search results. + max_results: The maximum number of results to return. + bypass_multi_tools_limit: Whether to bypass the multi tools limitation, + so that the tool can be used with other tools in the same agent. Raises: ValueError: If both data_store_id and search_engine_id are not specified @@ -80,6 +85,7 @@ def __init__( self.search_engine_id = search_engine_id self.filter = filter self.max_results = max_results + self.bypass_multi_tools_limit = bypass_multi_tools_limit @override async def process_llm_request( @@ -91,7 +97,7 @@ async def process_llm_request( if is_gemini_model(llm_request.model): if is_gemini_1_model(llm_request.model) and llm_request.config.tools: raise ValueError( - 'Vertex AI search tool can not be used with other tools in Gemini' + 'Vertex AI search tool cannot be used with other tools in Gemini' ' 1.x.' ) llm_request.config = llm_request.config or types.GenerateContentConfig() diff --git a/src/google/adk/utils/_debug_output.py b/src/google/adk/utils/_debug_output.py new file mode 100644 index 0000000000..e0182adeff --- /dev/null +++ b/src/google/adk/utils/_debug_output.py @@ -0,0 +1,108 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from ..events.event import Event + +# Constants for debug output truncation +_ARGS_MAX_LEN = 50 # Keep arg previews short for readability +_RESPONSE_MAX_LEN = 100 # Show more of response for context +_CODE_OUTPUT_MAX_LEN = 100 # Code execution output preview length + + +def _truncate(text: str, max_len: int) -> str: + """Truncate text to max length, appending '...' if truncated. + + Args: + text: The text to truncate. + max_len: Maximum length before truncation. + + Returns: + The truncated text with '...' appended if it exceeds max_len. + """ + return text[:max_len] + '...' if len(text) > max_len else text + + +def print_event(event: Event, *, verbose: bool = False) -> None: + """Print an event to stdout in a user-friendly format. + + Args: + event: The event to print. + verbose: If True, shows detailed tool calls and responses. If False, + shows only text responses for cleaner output. + """ + if not event.content or not event.content.parts: + return + + # Collect consecutive text parts to avoid repeating author prefix + text_buffer: list[str] = [] + + def flush_text() -> None: + """Flush accumulated text parts as a single output.""" + if text_buffer: + combined_text = ''.join(text_buffer) + print(f'{event.author} > {combined_text}') + text_buffer.clear() + + for part in event.content.parts: + # Text parts are always shown regardless of verbose setting + # because they contain the actual agent responses users expect + if part.text: + text_buffer.append(part.text) + else: + # Flush any accumulated text before handling non-text parts + flush_text() + + # Non-text parts (tool calls, code, etc.) are hidden by default + # to reduce clutter and show only what matters: the final results + if verbose: + # Tool invocations show the behind-the-scenes processing + if part.function_call: + print( + f'{event.author} > [Calling tool:' + f' {part.function_call.name}(' + f'{_truncate(str(part.function_call.args), _ARGS_MAX_LEN)})]' + ) + # Handle function response parts (tool results) + elif part.function_response: + print( + f'{event.author} > [Tool result:' + f' {_truncate(str(part.function_response.response), _RESPONSE_MAX_LEN)}]' + ) + # Handle executable code parts + elif part.executable_code: + lang = part.executable_code.language or 'code' + print(f'{event.author} > [Executing {lang} code...]') + # Handle code execution result parts + elif part.code_execution_result: + output = part.code_execution_result.output or 'result' + print( + f'{event.author} > [Code output:' + f' {_truncate(str(output), _CODE_OUTPUT_MAX_LEN)}]' + ) + # Handle inline data (images, files) + elif part.inline_data: + mime_type = part.inline_data.mime_type or 'data' + print(f'{event.author} > [Inline data: {mime_type}]') + # Handle file data + elif part.file_data: + uri = part.file_data.file_uri or 'file' + print(f'{event.author} > [File: {uri}]') + + # Flush any remaining text at the end + flush_text() diff --git a/src/google/adk/utils/cache_performance_analyzer.py b/src/google/adk/utils/cache_performance_analyzer.py new file mode 100644 index 0000000000..39c93ffc34 --- /dev/null +++ b/src/google/adk/utils/cache_performance_analyzer.py @@ -0,0 +1,168 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Cache performance analysis utilities for ADK context caching system. + +This module provides tools to analyze cache performance metrics from event +history, including hit ratios, cost savings, and cache refresh patterns. +""" + +from __future__ import annotations + +from typing import Any +from typing import Dict +from typing import List +from typing import Optional + +from google.adk.models.cache_metadata import CacheMetadata +from google.adk.sessions.base_session_service import BaseSessionService +from google.adk.utils.feature_decorator import experimental + + +@experimental +class CachePerformanceAnalyzer: + """Analyzes cache performance through event history.""" + + def __init__(self, session_service: BaseSessionService): + self.session_service = session_service + + async def _get_agent_cache_history( + self, + session_id: str, + user_id: str, + app_name: str, + agent_name: Optional[str] = None, + ) -> List[CacheMetadata]: + """Get cache usage history for agent from events. + + Args: + session_id: Session to analyze + user_id: User ID for session lookup + app_name: App name for session lookup + agent_name: Agent to get history for. If None, gets all cache events. + + Returns: + List of cache metadata in chronological order + """ + session = await self.session_service.get_session( + session_id=session_id, + app_name=app_name, + user_id=user_id, + ) + cache_history = [] + + for event in session.events: + # Check if event has cache metadata and optionally filter by agent + if event.cache_metadata is not None and ( + agent_name is None or event.author == agent_name + ): + cache_history.append(event.cache_metadata) + + return cache_history + + async def analyze_agent_cache_performance( + self, session_id: str, user_id: str, app_name: str, agent_name: str + ) -> Dict[str, Any]: + """Analyze cache performance for agent. + + Args: + session_id: Session to analyze + user_id: User ID for session lookup + app_name: App name for session lookup + agent_name: Agent to analyze + + Returns: + Performance analysis dictionary containing: + - status: "active" if cache data found, "no_cache_data" if none + - requests_with_cache: Number of requests that used caching + - avg_invocations_used: Average number of invocations each cache was used + - latest_cache: Resource name of most recent cache used + - cache_refreshes: Number of unique cache instances created + - total_invocations: Total number of invocations across all caches + - total_prompt_tokens: Total prompt tokens across all requests + - total_cached_tokens: Total cached content tokens across all requests + - cache_hit_ratio_percent: Percentage of tokens served from cache + - cache_utilization_ratio_percent: Percentage of requests with cache hits + - avg_cached_tokens_per_request: Average cached tokens per request + - total_requests: Total number of requests processed + - requests_with_cache_hits: Number of requests that had cache hits + """ + cache_history = await self._get_agent_cache_history( + session_id, user_id, app_name, agent_name + ) + + if not cache_history: + return {"status": "no_cache_data"} + + # Get all events for token analysis + session = await self.session_service.get_session( + session_id=session_id, + app_name=app_name, + user_id=user_id, + ) + + # Collect token metrics from events + total_prompt_tokens = 0 + total_cached_tokens = 0 + requests_with_cache_hits = 0 + total_requests = 0 + + for event in session.events: + if event.author == agent_name and event.usage_metadata: + total_requests += 1 + if event.usage_metadata.prompt_token_count: + total_prompt_tokens += event.usage_metadata.prompt_token_count + if event.usage_metadata.cached_content_token_count: + total_cached_tokens += event.usage_metadata.cached_content_token_count + requests_with_cache_hits += 1 + + # Calculate cache metrics + cache_hit_ratio_percent = ( + (total_cached_tokens / total_prompt_tokens) * 100 + if total_prompt_tokens > 0 + else 0.0 + ) + + cache_utilization_ratio_percent = ( + (requests_with_cache_hits / total_requests) * 100 + if total_requests > 0 + else 0.0 + ) + + avg_cached_tokens_per_request = ( + total_cached_tokens / total_requests if total_requests > 0 else 0.0 + ) + + invocations_used = [c.invocations_used for c in cache_history] + total_invocations = sum(invocations_used) + + return { + "status": "active", + "requests_with_cache": len(cache_history), + "avg_invocations_used": ( + sum(invocations_used) / len(invocations_used) + if invocations_used + else 0 + ), + "latest_cache": cache_history[-1].cache_name, + "cache_refreshes": len(set(c.cache_name for c in cache_history)), + "total_invocations": total_invocations, + "total_prompt_tokens": total_prompt_tokens, + "total_cached_tokens": total_cached_tokens, + "cache_hit_ratio_percent": cache_hit_ratio_percent, + "cache_utilization_ratio_percent": cache_utilization_ratio_percent, + "avg_cached_tokens_per_request": avg_cached_tokens_per_request, + "total_requests": total_requests, + "requests_with_cache_hits": requests_with_cache_hits, + } diff --git a/src/google/adk/utils/env_utils.py b/src/google/adk/utils/env_utils.py new file mode 100644 index 0000000000..bb37b6585c --- /dev/null +++ b/src/google/adk/utils/env_utils.py @@ -0,0 +1,59 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Utilities for environment variable handling. + +This module is for ADK internal use only. +Please do not rely on the implementation details. +""" + +from __future__ import annotations + +import os + + +def is_env_enabled(env_var_name: str, default: str = '0') -> bool: + """Check if an environment variable is enabled. + + An environment variable is considered enabled if its value (case-insensitive) + is 'true' or '1'. + + Args: + env_var_name: The name of the environment variable to check. + default: The default value to use if the environment variable is not set. + Defaults to '0'. + + Returns: + True if the environment variable is enabled, False otherwise. + + Examples: + >>> os.environ['MY_FLAG'] = 'true' + >>> is_env_enabled('MY_FLAG') + True + + >>> os.environ['MY_FLAG'] = '1' + >>> is_env_enabled('MY_FLAG') + True + + >>> os.environ['MY_FLAG'] = 'false' + >>> is_env_enabled('MY_FLAG') + False + + >>> is_env_enabled('NONEXISTENT_FLAG') + False + + >>> is_env_enabled('NONEXISTENT_FLAG', default='1') + True + """ + return os.environ.get(env_var_name, default).lower() in ['true', '1'] diff --git a/src/google/adk/utils/model_name_utils.py b/src/google/adk/utils/model_name_utils.py index 172639fdea..641988d48d 100644 --- a/src/google/adk/utils/model_name_utils.py +++ b/src/google/adk/utils/model_name_utils.py @@ -19,13 +19,16 @@ import re from typing import Optional +from packaging.version import InvalidVersion +from packaging.version import Version + def extract_model_name(model_string: str) -> str: """Extract the actual model name from either simple or path-based format. Args: - model_string: Either a simple model name like "gemini-2.5-pro" or - a path-based model name like "projects/.../models/gemini-2.0-flash-001" + model_string: Either a simple model name like "gemini-2.5-pro" or a + path-based model name like "projects/.../models/gemini-2.0-flash-001" Returns: The extracted model name (e.g., "gemini-2.5-pro") @@ -38,6 +41,10 @@ def extract_model_name(model_string: str) -> str: if match: return match.group(1) + # Handle 'models/' prefixed names like "models/gemini-2.5-pro" + if model_string.startswith('models/'): + return model_string[len('models/') :] + # If it's not a path-based model, return as-is (simple model name) return model_string @@ -74,17 +81,29 @@ def is_gemini_1_model(model_string: Optional[str]) -> bool: return re.match(r'^gemini-1\.\d+', model_name) is not None -def is_gemini_2_model(model_string: Optional[str]) -> bool: - """Check if the model is a Gemini 2.x model using regex patterns. +def is_gemini_2_or_above(model_string: Optional[str]) -> bool: + """Check if the model is a Gemini 2.0 or newer model using semantic versions. Args: model_string: Either a simple model name or path-based model name Returns: - True if it's a Gemini 2.x model, False otherwise + True if it's a Gemini 2.0+ model, False otherwise """ if not model_string: return False model_name = extract_model_name(model_string) - return re.match(r'^gemini-2\.\d+', model_name) is not None + if not model_name.startswith('gemini-'): + return False + + version_string = model_name[len('gemini-') :].split('-', 1)[0] + if not version_string: + return False + + try: + parsed_version = Version(version_string) + except InvalidVersion: + return False + + return parsed_version.major >= 2 diff --git a/src/google/adk/utils/output_schema_utils.py b/src/google/adk/utils/output_schema_utils.py new file mode 100644 index 0000000000..ae14686e38 --- /dev/null +++ b/src/google/adk/utils/output_schema_utils.py @@ -0,0 +1,38 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Utilities for Output Schema. + +This module is for ADK internal use only. +Please do not rely on the implementation details. +""" + +from __future__ import annotations + +from typing import Union + +from ..models.base_llm import BaseLlm +from .model_name_utils import is_gemini_2_or_above +from .variant_utils import get_google_llm_variant +from .variant_utils import GoogleLLMVariant + + +def can_use_output_schema_with_tools(model: Union[str, BaseLlm]): + """Returns True if output schema with tools is supported.""" + model_string = model if isinstance(model, str) else model.model + + return ( + get_google_llm_variant() == GoogleLLMVariant.VERTEX_AI + and is_gemini_2_or_above(model_string) + ) diff --git a/src/google/adk/utils/variant_utils.py b/src/google/adk/utils/variant_utils.py index 5de82b426e..c0b4bc6e39 100644 --- a/src/google/adk/utils/variant_utils.py +++ b/src/google/adk/utils/variant_utils.py @@ -21,7 +21,8 @@ from __future__ import annotations from enum import Enum -import os + +from .env_utils import is_env_enabled _GOOGLE_LLM_VARIANT_VERTEX_AI = 'VERTEX_AI' _GOOGLE_LLM_VARIANT_GEMINI_API = 'GEMINI_API' @@ -42,10 +43,6 @@ class GoogleLLMVariant(Enum): def get_google_llm_variant() -> GoogleLLMVariant: return ( GoogleLLMVariant.VERTEX_AI - if os.environ.get('GOOGLE_GENAI_USE_VERTEXAI', '0').lower() - in [ - 'true', - '1', - ] + if is_env_enabled('GOOGLE_GENAI_USE_VERTEXAI') else GoogleLLMVariant.GEMINI_API ) diff --git a/src/google/adk/utils/vertex_ai_utils.py b/src/google/adk/utils/vertex_ai_utils.py new file mode 100644 index 0000000000..f3973ff425 --- /dev/null +++ b/src/google/adk/utils/vertex_ai_utils.py @@ -0,0 +1,43 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Utilities for Vertex AI. Includes helper functions for Express Mode. + +This module is for ADK internal use only. +Please do not rely on the implementation details. +""" + +from __future__ import annotations + +import os +from typing import Optional + +from ..utils.env_utils import is_env_enabled + + +def get_express_mode_api_key( + project: Optional[str], + location: Optional[str], + express_mode_api_key: Optional[str], +) -> Optional[str]: + """Validates and returns the API key for Express Mode.""" + if (project or location) and express_mode_api_key: + raise ValueError( + 'Cannot specify project or location and express_mode_api_key. ' + 'Either use project and location, or just the express_mode_api_key.' + ) + if is_env_enabled('GOOGLE_GENAI_USE_VERTEXAI'): + return express_mode_api_key or os.environ.get('GOOGLE_API_KEY', None) + else: + return None diff --git a/src/google/adk/utils/yaml_utils.py b/src/google/adk/utils/yaml_utils.py index 0598927d88..556e705f42 100644 --- a/src/google/adk/utils/yaml_utils.py +++ b/src/google/adk/utils/yaml_utils.py @@ -15,11 +15,16 @@ from __future__ import annotations from pathlib import Path +from typing import Optional +from typing import TYPE_CHECKING from typing import Union from pydantic import BaseModel import yaml +if TYPE_CHECKING: + from pydantic.main import IncEx + def dump_pydantic_to_yaml( model: BaseModel, @@ -28,6 +33,8 @@ def dump_pydantic_to_yaml( indent: int = 2, sort_keys: bool = True, exclude_none: bool = True, + exclude_defaults: bool = True, + exclude: Optional[IncEx] = None, ) -> None: """Dump a Pydantic model to a YAML file with multiline strings using | style. @@ -37,8 +44,16 @@ def dump_pydantic_to_yaml( indent: Number of spaces for indentation (default: 2). sort_keys: Whether to sort dictionary keys (default: True). exclude_none: Exclude fields with None values (default: True). + exclude_defaults: Exclude fields with default values (default: True). + exclude: Fields to exclude from the output. Can be a set of field names or + a nested dict for fine-grained exclusion (default: None). """ - model_dict = model.model_dump(exclude_none=exclude_none, mode='json') + model_dict = model.model_dump( + exclude_none=exclude_none, + exclude_defaults=exclude_defaults, + exclude=exclude, + mode='json', + ) file_path = Path(file_path) file_path.parent.mkdir(parents=True, exist_ok=True) @@ -55,7 +70,7 @@ def increase_indent(self, flow=False, indentless=False): return super(_MultilineDumper, self).increase_indent(flow, False) def multiline_str_representer(dumper, data): - if '\n' in data: + if '\n' in data or '"' in data or "'" in data: return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|') return dumper.represent_scalar('tag:yaml.org,2002:str', data) @@ -69,5 +84,6 @@ def multiline_str_representer(dumper, data): Dumper=_MultilineDumper, indent=indent, sort_keys=sort_keys, - default_flow_style=False, + width=1000000, # Essentially disable text wraps + allow_unicode=True, # Do not escape non-ascii characters. ) diff --git a/src/google/adk/version.py b/src/google/adk/version.py index 868199f63b..0a21522cb6 100644 --- a/src/google/adk/version.py +++ b/src/google/adk/version.py @@ -13,4 +13,4 @@ # limitations under the License. # version: major.minor.patch -__version__ = "1.14.0" +__version__ = "1.18.0" diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 6dc1f3d1bb..45e720a579 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -114,6 +114,6 @@ def pytest_generate_tests(metafunc: Metafunc): def _is_explicitly_marked(mark_name: str, metafunc: Metafunc) -> bool: if hasattr(metafunc.function, 'pytestmark'): for mark in metafunc.function.pytestmark: - if mark.name == 'parametrize' and mark.args[0] == mark_name: + if mark.name == 'parametrize' and mark_name in mark.args[0]: return True return False diff --git a/tests/integration/fixture/bigquery_agent/README.md b/tests/integration/fixture/bigquery_agent/README.md new file mode 100644 index 0000000000..e36be3aed4 --- /dev/null +++ b/tests/integration/fixture/bigquery_agent/README.md @@ -0,0 +1,67 @@ +# Instructions + +## Run Evaluation + +1. Set environment variables in your terminal: + + ```shell + export GOOGLE_GENAI_USE_VERTEXAI=FALSE + export GOOGLE_API_KEY= + export GOOGLE_CLOUD_PROJECT= + ``` +1. Change to the current directory: + + ```shell + cd third_party/py/google/adk/tests/integration/fixture/bigquery_agent/ + ``` +1. Customize the evaluation dataset to the environment `GOOGLE_CLOUD_PROJECT` + by replacing the placeholder to the real project set in your environment: + + ```shell + sed -e "s:\${GOOGLE_CLOUD_PROJECT}:${GOOGLE_CLOUD_PROJECT}:g" simple.test.json -i + ``` +1. Run the following command as per https://google.github.io/adk-docs/evaluate/#3-adk-eval-run-evaluations-via-the-cli: + + ```shell + adk eval . simple.test.json --config_file_path=test_config.json + ``` + + If it fails, re-run with `--print_detailed_results` flag to see more details + on turn-by-turn evaluation. + +## Generate Evaluation dataset + +1. Set environment variables in your terminal: + + ```shell + export GOOGLE_GENAI_USE_VERTEXAI=FALSE + export GOOGLE_API_KEY= + export GOOGLE_CLOUD_PROJECT= + ``` +1. Set up google [application default credentials](https://cloud.google.com/docs/authentication/provide-credentials-adc) + on your machine. + + ```shell + gcloud auth application-default login + ``` +1. Change to the directory containing agent folder: + + ```shell + cd third_party/py/google/adk/tests/integration/fixture/ + ``` +1. Run the following command to start the ADK web app: + + ```shell + adk web + ``` +1. Open the ADK web UI in your browser http://127.0.0.1:8000/dev-ui/?app=bigquery_agent. +1. Create an evaluation dataset by following [these steps](https://google.github.io/adk-docs/evaluate/#1-adk-web-run-evaluations-via-the-web-ui). + This would generate file `bigquery_agent/simple.evalset.json`. +1. Note that this evaluation data would be tied to the agent interaction in the + `GOOGLE_CLOUD_PROJECT` set in your environment. To normalize it by replacing + the real project set in your environment to a placeholder, let's run the + following command: + + ```shell + sed -e "s:${GOOGLE_CLOUD_PROJECT}:\${GOOGLE_CLOUD_PROJECT}:g" bigquery_agent/simple.evalset.json > bigquery_agent/simple.test.json + ``` \ No newline at end of file diff --git a/tests/integration/fixture/bigquery_agent/__init__.py b/tests/integration/fixture/bigquery_agent/__init__.py new file mode 100644 index 0000000000..c48963cdc7 --- /dev/null +++ b/tests/integration/fixture/bigquery_agent/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/tests/integration/fixture/bigquery_agent/agent.py b/tests/integration/fixture/bigquery_agent/agent.py new file mode 100644 index 0000000000..c53806f94d --- /dev/null +++ b/tests/integration/fixture/bigquery_agent/agent.py @@ -0,0 +1,75 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import os + +from google.adk.agents.llm_agent import LlmAgent +from google.adk.tools.bigquery.bigquery_credentials import BigQueryCredentialsConfig +from google.adk.tools.bigquery.bigquery_toolset import BigQueryToolset +from google.adk.tools.bigquery.config import BigQueryToolConfig +from google.adk.tools.bigquery.config import WriteMode +import google.auth + +# Check necessary environment variables +if not (google_cloud_project_id := os.getenv("GOOGLE_CLOUD_PROJECT")): + raise ValueError( + "GOOGLE_CLOUD_PROJECT environment variable is not set. Please set it" + " to the GCP project ID where your BigQuery jobs would be run." + ) + +# Define an appropriate application name +BIGQUERY_AGENT_NAME = "adk_eval_bigquery_agent" + + +# Define BigQuery tool config with write mode set to allowed. Note that this is +# only to demonstrate the full capability of the BigQuery tools. In production +# you may want to change to BLOCKED (default write mode, effectively makes the +# tool read-only) or PROTECTED (only allows writes in the anonymous dataset of a +# BigQuery session) write mode. +tool_config = BigQueryToolConfig( + write_mode=WriteMode.BLOCKED, + application_name=BIGQUERY_AGENT_NAME, + compute_project_id=google_cloud_project_id, +) + +# Initialize the tools to use the application default credentials. +# https://cloud.google.com/docs/authentication/provide-credentials-adc +application_default_credentials, _ = google.auth.default() +credentials_config = BigQueryCredentialsConfig( + credentials=application_default_credentials +) + +bigquery_toolset = BigQueryToolset( + credentials_config=credentials_config, bigquery_tool_config=tool_config +) + +# The variable name `root_agent` determines what your root agent is for the +# debug CLI +root_agent = LlmAgent( + model="gemini-2.5-flash", + name=BIGQUERY_AGENT_NAME, + description=( + "Agent to answer questions about BigQuery data and models and execute" + " SQL queries." + ), + instruction=f"""\ + You are a data science agent with access to several BigQuery tools. + Make use of those tools to answer the user's questions. + + You must use the project id {google_cloud_project_id} for running SQL + queries and generating data insights + """, + tools=[bigquery_toolset], +) diff --git a/tests/integration/fixture/bigquery_agent/simple.test.json b/tests/integration/fixture/bigquery_agent/simple.test.json new file mode 100644 index 0000000000..18c91b51bd --- /dev/null +++ b/tests/integration/fixture/bigquery_agent/simple.test.json @@ -0,0 +1,538 @@ +{ + "eval_set_id": "simple", + "name": "simple", + "description": null, + "eval_cases": [ + { + "eval_id": "penguins exploration", + "conversation": [ + { + "invocation_id": "e-81734a2f-60dc-4c7e-9b05-29a2c18b7651", + "user_content": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "Hi, what can you do?" + } + ], + "role": "user" + }, + "final_response": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "I can help you with BigQuery. I can:\n* List datasets and tables in a project\n* Get information about datasets and tables\n* Execute SQL queries\n* Forecast time series data\n* Answer questions about data in BigQuery tables using natural language.\n\nWhat would you like to do?\n" + } + ], + "role": null + }, + "intermediate_data": { + "tool_uses": [], + "tool_responses": [], + "intermediate_responses": [] + }, + "creation_timestamp": 1757645225.080524 + }, + { + "invocation_id": "e-78026d6b-f3d5-4807-8122-8872efb024d6", + "user_content": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "which tools do you have access to?" + } + ], + "role": "user" + }, + "final_response": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": "CqsCAdHtim-ZZuTPQdEgbCYXWniB28PuU35grogIwz7a2X0PG9eopcLAT0hXOv90Zu5b9Q4iREsIAcV3znUrCjwMwRrW_G3QYH7jfaK5oEvunfD-yOUj-V9wjc_hAyKon4ogXs7nxX9v_sAfz1uh48cmiMBcNcJd1dkiBbCufChWQbHFsVghXAnetSRm21H2rRgPuxvpf4_mWXzxgYZddOuf6bYmUI3kEcwQDqbocOk2u-ghG44KnFAXOhqBBu8eUeJM8m7uUWevEtxXIclJ14crWCjWADzAof80VX_rLucQ5sPE5wfTvlFIDECuGapnxmxAVB8hNCw9iwlJEhNUVVSbPPfvjwDSq9s99w-Rbu8yLDA5YwSru-q1qIrxbXTWuNlh9fwCdKDQAgiXUo0=", + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "I have access to the following tools:\n\n* `get_dataset_info(project_id, dataset_id)`: Get metadata information about a BigQuery dataset.\n* `get_table_info(project_id, dataset_id, table_id)`: Get metadata information about a BigQuery table.\n* `list_dataset_ids(project_id)`: List BigQuery dataset IDs in a Google Cloud project.\n* `list_table_ids(project_id, dataset_id)`: List table IDs in a BigQuery dataset.\n* `execute_sql(project_id, query)`: Run a BigQuery or BigQuery ML SQL query in the project and return the result.\n* `forecast(project_id, history_data, timestamp_col, data_col, horizon, id_cols=None)`: Run a BigQuery AI time series forecast using AI.FORECAST.\n* `ask_data_insights(project_id, user_query_with_context, table_references)`: Answers questions about structured data in BigQuery tables using natural language." + } + ], + "role": null + }, + "intermediate_data": { + "tool_uses": [], + "tool_responses": [], + "intermediate_responses": [] + }, + "creation_timestamp": 1757645280.602244 + }, + { + "invocation_id": "e-47aa5d37-6bba-4a2d-8eae-e79f47f347c4", + "user_content": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "Are there any ML datasets in the bigquery public data?" + } + ], + "role": "user" + }, + "final_response": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": "Cq8DAdHtim9T93wEXUnP9hCJ0SGm79kvsT5VJBWIL1xr8Z0TBLYIQSVqogdU3mB3XkwHkqKT7hBGBY11yuHwfcohBakiOco71gRXOlhf0XGlNZNIUUObnOdY2swLsmpJDbOtRLxgU9OZ0JhHlC0fkrQj9Ab2wt5A8VFkuBUQaEB-XcJYes8Zo0TfU79nrlKrfIINPHsXEuBdq4biDipPss57EZwgs8HiwdeUCXeMwcYS1NFquYUmFLqnsAf9Xik5k3yEx9iQyF7VtOPNGp9sKC2zh7Euz5bpgiHjRTV41hw5QWQk8Q38hKOS7G2jLLXPO8v63sn9LgIzCHNJUd9j-IU8v5gtgU9CNfG4o7icU7GD77KrJx6etaxHQiwSfMjPR_6tZ_ft4-eIh7kRQdJo-GrtyDJJBNV-5s61G0qMGqbS7JY4RfH5_cT8UUSEamkU1eJGN7pZIAKc7FXaCHlGUOQClx-9D7XXQMDd2gVk1pyQvMeruzmykywSGPffnDZJQ9kVwW9pl6urnk8hX4ZGnXM_DTjaFZFF_Gb1dhpr0Uuy0LWk1IqcfbS95YJIFipFXPo=", + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "Yes, there are a few ML-related datasets in the `bigquery-public-data` project:\n\n* `aml_ai_input_dataset`\n* `bigqueryml_ncaa`\n* `ml_datasets`\n* `ml_datasets_uscentral1`" + } + ], + "role": null + }, + "intermediate_data": { + "tool_uses": [ + { + "id": "adk-4d524ad4-6a3b-49dd-a44e-763f956f89c1", + "args": { + "project_id": "bigquery-public-data" + }, + "name": "list_dataset_ids" + } + ], + "tool_responses": [], + "intermediate_responses": [] + }, + "creation_timestamp": 1757645323.568069 + }, + { + "invocation_id": "e-76115967-fe7b-4aee-92c8-39d3fd1b35c0", + "user_content": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "When was ml_datasets created and which location it is in?" + } + ], + "role": "user" + }, + "final_response": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "The `ml_datasets` dataset was created on `1553208775542` (which is March 21, 2019, 19:12:55 UTC) and is located in the `US` region." + } + ], + "role": null + }, + "intermediate_data": { + "tool_uses": [ + { + "id": "adk-2cba4269-dde6-4b62-a38a-1004f05452a0", + "args": { + "dataset_id": "ml_datasets", + "project_id": "bigquery-public-data" + }, + "name": "get_dataset_info" + } + ], + "tool_responses": [], + "intermediate_responses": [] + }, + "creation_timestamp": 1757645409.36703 + }, + { + "invocation_id": "e-9a5e0a24-f7cb-4e50-9a61-430a11837e82", + "user_content": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "alright, which tables does it have?" + } + ], + "role": "user" + }, + "final_response": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "The `ml_datasets` dataset contains the following tables:\n\n* `census_adult_income`\n* `census_adult_income_kmeans_predictions`\n* `credit_card_default`\n* `holidays_and_events_for_forecasting`\n* `iris`\n* `penguins`\n* `ulb_fraud_detection`" + } + ], + "role": null + }, + "intermediate_data": { + "tool_uses": [ + { + "id": "adk-089bf143-422f-4516-b6d9-810773b03de7", + "args": { + "dataset_id": "ml_datasets", + "project_id": "bigquery-public-data" + }, + "name": "list_table_ids" + } + ], + "tool_responses": [], + "intermediate_responses": [] + }, + "creation_timestamp": 1757645478.923206 + }, + { + "invocation_id": "e-05b241ed-9678-49dc-8ead-25baab6d4002", + "user_content": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "tell me more details about the penguins table" + } + ], + "role": "user" + }, + "final_response": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "The `penguins` table was created on `1619804743188` (which is April 30, 2021, 00:25:43 UTC) and contains 344 rows. It has the following schema:\n\n* `species`: STRING (REQUIRED)\n* `island`: STRING (NULLABLE)\n* `culmen_length_mm`: FLOAT (NULLABLE)\n* `culmen_depth_mm`: FLOAT (NULLABLE)\n* `flipper_length_mm`: FLOAT (NULLABLE)\n* `body_mass_g`: FLOAT (NULLABLE)\n* `sex`: STRING (NULLABLE)" + } + ], + "role": null + }, + "intermediate_data": { + "tool_uses": [ + { + "id": "adk-8893d916-9445-4458-8998-ea3e283d534d", + "args": { + "dataset_id": "ml_datasets", + "project_id": "bigquery-public-data", + "table_id": "penguins" + }, + "name": "get_table_info" + } + ], + "tool_responses": [], + "intermediate_responses": [] + }, + "creation_timestamp": 1757645526.958228 + }, + { + "invocation_id": "e-d7b85acb-b7f3-4b61-b66d-bba77c01e13e", + "user_content": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "can you tell me population of penguins per island?" + } + ], + "role": "user" + }, + "final_response": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "Here is the population of penguins per island:\n\n* **Dream:** 124\n* **Biscoe:** 168\n* **Torgersen:** 52" + } + ], + "role": null + }, + "intermediate_data": { + "tool_uses": [ + { + "id": "adk-33ff1809-bbfb-45e7-a07c-25fc9c932260", + "args": { + "query": "SELECT island, COUNT(*) AS population FROM bigquery-public-data.ml_datasets.penguins GROUP BY island", + "project_id": "${GOOGLE_CLOUD_PROJECT}" + }, + "name": "execute_sql" + } + ], + "tool_responses": [], + "intermediate_responses": [] + }, + "creation_timestamp": 1757645563.777316 + }, + { + "invocation_id": "e-3b46dd99-4d25-45e5-b16c-2f055de56f47", + "user_content": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "can you get me insights about any correlation between body mass and flipper length of penguins?" + } + ], + "role": "user" + }, + "final_response": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "Based on the data, there appears to be a positive correlation between the body mass and flipper length of penguins. Generally, as the flipper length in millimeters increases, the body mass in grams also tends to increase." + } + ], + "role": null + }, + "intermediate_data": { + "tool_uses": [ + { + "id": "adk-266b6452-50b8-4d3b-ae23-d09effa41e0b", + "args": { + "project_id": "${GOOGLE_CLOUD_PROJECT}", + "user_query_with_context": "Is there any correlation between body mass and flipper length of penguins?", + "table_references": [ + { + "datasetId": "ml_datasets", + "tableId": "penguins", + "projectId": "bigquery-public-data" + } + ] + }, + "name": "ask_data_insights" + } + ], + "tool_responses": [], + "intermediate_responses": [] + }, + "creation_timestamp": 1757645706.447186 + }, + { + "invocation_id": "e-357fb858-adae-4a7c-80fc-fcadf52a20fd", + "user_content": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "how do the penguins tables in ml_datasets and ml_datasets_uscentral compare?" + } + ], + "role": "user" + }, + "final_response": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "Here's a comparison of the `penguins` tables in `ml_datasets` and `ml_datasets_uscentral1`:\n\n**`bigquery-public-data:ml_datasets.penguins`**\n\n* **Creation Time:** 1619804743188 (April 30, 2021, 00:25:43 UTC)\n* **Location:** US\n* **Number of Rows:** 344\n* **Schema:**\n * `species`: STRING (REQUIRED)\n * `island`: STRING (NULLABLE)\n * `culmen_length_mm`: FLOAT (NULLABLE)\n * `culmen_depth_mm`: FLOAT (NULLABLE)\n * `flipper_length_mm`: FLOAT (NULLABLE)\n * `body_mass_g`: FLOAT (NULLABLE)\n * `sex`: STRING (NULLABLE)\n\n**`bigquery-public-data:ml_datasets_uscentral1.penguins`**\n\n* **Creation Time:** 1634583926374 (October 18, 2021, 23:05:26 UTC)\n* **Location:** us-central1\n* **Number of Rows:** 344\n* **Schema:** (Identical to `ml_datasets.penguins`)\n * `species`: STRING (REQUIRED)\n * `island`: STRING (NULLABLE)\n * `culmen_length_mm`: FLOAT (NULLABLE)\n * `culmen_depth_mm`: FLOAT (NULLABLE)\n * `flipper_length_mm`: FLOAT (NULLABLE)\n * `body_mass_g`: FLOAT (NULLABLE)\n * `sex`: STRING (NULLABLE)\n\n**Key Differences:**\n\n* **Creation Time:** The table in `ml_datasets` was created earlier (April 2021) than the one in `ml_datasets_uscentral1` (October 2021).\n* **Location:** The `ml_datasets.penguins` table is in the `US` multi-region, while `ml_datasets_uscentral1.penguins` is specifically in the `us-central1` region.\n\n**Similarities:**\n\n* Both tables have the **same number of rows (344)**.\n* Both tables have an **identical schema**, with the same column names, types, and modes.\n\nIt appears that `bigquery-public-data:ml_datasets_uscentral1.penguins` is likely a regional copy or a later version of the `bigquery-public-data:ml_datasets.penguins` table." + } + ], + "role": null + }, + "intermediate_data": { + "tool_uses": [ + { + "id": "adk-8ff49a41-b42a-4f2b-8408-bda00712791b", + "args": { + "project_id": "bigquery-public-data", + "dataset_id": "ml_datasets", + "table_id": "penguins" + }, + "name": "get_table_info" + }, + { + "id": "adk-c0e9a831-300d-4805-a127-6df1d7afc712", + "args": { + "project_id": "bigquery-public-data", + "dataset_id": "ml_datasets_uscentral1", + "table_id": "penguins" + }, + "name": "get_table_info" + } + ], + "tool_responses": [], + "intermediate_responses": [] + }, + "creation_timestamp": 1757646232.887191 + }, + { + "invocation_id": "e-72ddf0dd-4fee-41dd-adb6-26cd98baeb25", + "user_content": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "can you tell the population per island from the uscentral1 table?" + } + ], + "role": "user" + }, + "final_response": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "Here is the population of penguins per island from the `ml_datasets_uscentral1` table:\n\n* **Dream:** 124\n* **Biscoe:** 168\n* **Torgersen:** 52" + } + ], + "role": null + }, + "intermediate_data": { + "tool_uses": [ + { + "id": "adk-febf7cf1-3465-4393-9882-ef860502238f", + "args": { + "project_id": "${GOOGLE_CLOUD_PROJECT}", + "query": "SELECT island, COUNT(*) AS population FROM `bigquery-public-data`.`ml_datasets_uscentral1`.`penguins` GROUP BY island" + }, + "name": "execute_sql" + } + ], + "tool_responses": [], + "intermediate_responses": [] + }, + "creation_timestamp": 1757646339.73431 + } + ], + "session_input": { + "app_name": "bigquery_agent", + "user_id": "user", + "state": {} + }, + "creation_timestamp": 1757648114.6285758 + } + ], + "creation_timestamp": 1757648101.7927744 +} \ No newline at end of file diff --git a/tests/integration/fixture/bigquery_agent/test_config.json b/tests/integration/fixture/bigquery_agent/test_config.json new file mode 100644 index 0000000000..2fa55b54c3 --- /dev/null +++ b/tests/integration/fixture/bigquery_agent/test_config.json @@ -0,0 +1,6 @@ +{ + "criteria": { + "tool_trajectory_avg_score": 0.7, + "response_match_score": 0.7 + } +} diff --git a/tests/integration/fixture/context_variable_agent/agent.py b/tests/integration/fixture/context_variable_agent/agent.py index cef56ccb1e..04e19314f9 100644 --- a/tests/integration/fixture/context_variable_agent/agent.py +++ b/tests/integration/fixture/context_variable_agent/agent.py @@ -43,7 +43,7 @@ def echo_info(customer_id: str) -> str: def build_global_instruction(invocation_context: InvocationContext) -> str: return ( - 'This is the gloabl agent instruction for invocation:' + 'This is the global agent instruction for invocation:' f' {invocation_context.invocation_id}.' ) diff --git a/tests/integration/fixture/flow_complex_spark/agent.py b/tests/integration/fixture/flow_complex_spark/agent.py index 18ce62ff8c..02fbfaebac 100644 --- a/tests/integration/fixture/flow_complex_spark/agent.py +++ b/tests/integration/fixture/flow_complex_spark/agent.py @@ -41,7 +41,7 @@ + Don't ask for clarifications from the user. + Do not ask the user for clarifications or if they have any other questions. + All headers should be bolded. -+ If you have steps in the plan that depend on other information, make sure they are 2 diferent sections in the plan. ++ If you have steps in the plan that depend on other information, make sure they are 2 different sections in the plan. + At the end mention that you will start researching. # Instruction on replying format @@ -68,7 +68,7 @@ # Instruction on replying format -Your reply should be a numbered lsit. +Your reply should be a numbered list. For each question, reply in the following format: "[question_generation_agent]: [generated questions]" @@ -92,7 +92,7 @@ " question." ), instruction="""\ -Inspect all the questions after "[question_generation_agent]: " and asnwer them. +Inspect all the questions after "[question_generation_agent]: " and answer them. # Instruction on replying format diff --git a/tests/integration/fixture/flow_complex_spark/sample.session.json b/tests/integration/fixture/flow_complex_spark/sample.session.json index 31575a84b4..ed3a200d3f 100644 --- a/tests/integration/fixture/flow_complex_spark/sample.session.json +++ b/tests/integration/fixture/flow_complex_spark/sample.session.json @@ -52,7 +52,7 @@ "response": { "status": "ok", "target_agent_name": "research_assistant", - "message": "Transfered to research_assistant" + "message": "Transferred to research_assistant" } } } @@ -165,7 +165,7 @@ "response": { "status": "ok", "target_agent_name": "spark_assistant", - "message": "Transfered to spark_assistant" + "message": "Transferred to spark_assistant" } } } diff --git a/tests/integration/fixture/hello_world_agent/test_config.json b/tests/integration/fixture/hello_world_agent/test_config.json index 87393e0285..c7fba6a4b1 100644 --- a/tests/integration/fixture/hello_world_agent/test_config.json +++ b/tests/integration/fixture/hello_world_agent/test_config.json @@ -1,7 +1,6 @@ { "criteria": { "tool_trajectory_avg_score": 1.0, - "response_match_score": 0.5, - "safety_v1": 0.8 + "response_match_score": 0.5 } } diff --git a/tests/integration/fixture/hello_world_agent_async/__init__.py b/tests/integration/fixture/hello_world_agent_async/__init__.py new file mode 100644 index 0000000000..c48963cdc7 --- /dev/null +++ b/tests/integration/fixture/hello_world_agent_async/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from . import agent diff --git a/tests/integration/fixture/hello_world_agent_async/agent.py b/tests/integration/fixture/hello_world_agent_async/agent.py new file mode 100644 index 0000000000..b105065cc0 --- /dev/null +++ b/tests/integration/fixture/hello_world_agent_async/agent.py @@ -0,0 +1,104 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Hello world agent from agent 1.0 revised to be defined with get_agent_async +# instead of root_agent - https://colab.sandbox.google.com/drive/1Zq-nqmgK0nCERCv8jKIaoeTTgbNn6oSo?resourcekey=0-GYaz9pFT4wY8CI8Cvjy5GA#scrollTo=u3X3XwDOaCv9 +import contextlib +import random +from typing import Optional + +from google.adk import Agent +from google.adk.agents import llm_agent +from google.genai import types + + +def roll_die(sides: int) -> int: + """Roll a die and return the rolled result. + + Args: + sides: The integer number of sides the die has. + + Returns: + An integer of the result of rolling the die. + """ + return random.randint(1, sides) + + +def check_prime(nums: list[int]) -> list[str]: + """Check if a given list of numbers are prime. + + Args: + nums: The list of numbers to check. + + Returns: + A str indicating which number is prime. + """ + primes = set() + for number in nums: + number = int(number) + if number <= 1: + continue + is_prime = True + for i in range(2, int(number**0.5) + 1): + if number % i == 0: + is_prime = False + break + if is_prime: + primes.add(number) + return ( + 'No prime numbers found.' + if not primes + else f"{', '.join(str(num) for num in primes)} are prime numbers." + ) + + +async def get_agent_async() -> ( + tuple[llm_agent.LlmAgent, Optional[contextlib.AsyncExitStack]] +): + """Returns the root agent.""" + root_agent = Agent( + model='gemini-2.0-flash-001', + name='data_processing_agent', + instruction=""" + You roll dice and answer questions about the outcome of the dice rolls. + You can roll dice of different sizes. + You can use multiple tools in parallel by calling functions in parallel(in one request and in one round). + The only things you do are roll dice for the user and discuss the outcomes. + It is ok to discuss previous dice roles, and comment on the dice rolls. + When you are asked to roll a die, you must call the roll_die tool with the number of sides. Be sure to pass in an integer. Do not pass in a string. + You should never roll a die on your own. + When checking prime numbers, call the check_prime tool with a list of integers. Be sure to pass in a list of integers. You should never pass in a string. + You should not check prime numbers before calling the tool. + When you are asked to roll a die and check prime numbers, you should always make the following two function calls: + 1. You should first call the roll_die tool to get a roll. Wait for the function response before calling the check_prime tool. + 2. After you get the function response from roll_die tool, you should call the check_prime tool with the roll_die result. + 2.1 If user asks you to check primes based on previous rolls, make sure you include the previous rolls in the list. + 3. When you respond, you must include the roll_die result from step 1. + You should always perform the previous 3 steps when asking for a roll and checking prime numbers. + You should not rely on the previous history on prime results. + """, + tools=[ + roll_die, + check_prime, + ], + generate_content_config=types.GenerateContentConfig( + safety_settings=[ + types.SafetySetting( # avoid false alarm about rolling dice. + category=types.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, + threshold=types.HarmBlockThreshold.OFF, + ), + ] + ), + ) + return root_agent, None diff --git a/tests/integration/fixture/hello_world_agent_async/roll_die.test.json b/tests/integration/fixture/hello_world_agent_async/roll_die.test.json new file mode 100644 index 0000000000..7e787d409a --- /dev/null +++ b/tests/integration/fixture/hello_world_agent_async/roll_die.test.json @@ -0,0 +1,55 @@ +{ + "eval_set_id": "56540925-a5ff-49fe-a4e1-589fe78066f2", + "name": "56540925-a5ff-49fe-a4e1-589fe78066f2", + "description": null, + "eval_cases": [ + { + "eval_id": "tests/integration/fixture/hello_world_agent_async/roll_die.test.json", + "conversation": [ + { + "invocation_id": "b01f67f0-9f23-44d6-bbe4-36ea235cb9fb", + "user_content": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "code_execution_result": null, + "executable_code": null, + "file_data": null, + "function_call": null, + "function_response": null, + "inline_data": null, + "text": "Hi who are you?" + } + ], + "role": "user" + }, + "final_response": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "code_execution_result": null, + "executable_code": null, + "file_data": null, + "function_call": null, + "function_response": null, + "inline_data": null, + "text": "I am a data processing agent. I can roll dice and check if the results are prime numbers. What would you like me to do? \n" + } + ], + "role": "model" + }, + "intermediate_data": { + "tool_uses": [], + "intermediate_responses": [] + }, + "creation_timestamp": 1747341775.8937013 + } + ], + "session_input": null, + "creation_timestamp": 1747341775.8937826 + } + ], + "creation_timestamp": 1747341775.8937957 +} \ No newline at end of file diff --git a/tests/integration/fixture/hello_world_agent_async/test_config.json b/tests/integration/fixture/hello_world_agent_async/test_config.json new file mode 100644 index 0000000000..c7fba6a4b1 --- /dev/null +++ b/tests/integration/fixture/hello_world_agent_async/test_config.json @@ -0,0 +1,6 @@ +{ + "criteria": { + "tool_trajectory_avg_score": 1.0, + "response_match_score": 0.5 + } +} diff --git a/tests/integration/fixture/home_automation_agent/test_config.json b/tests/integration/fixture/home_automation_agent/test_config.json index 56817a7edf..a46bb7cd0b 100644 --- a/tests/integration/fixture/home_automation_agent/test_config.json +++ b/tests/integration/fixture/home_automation_agent/test_config.json @@ -1,6 +1,6 @@ { "criteria": { "tool_trajectory_avg_score": 1.0, - "safety_v1": 0.8 + "response_match_score": 0.3 } } diff --git a/tests/integration/fixture/tool_agent/agent.py b/tests/integration/fixture/tool_agent/agent.py index a89d20899e..2f914750a6 100644 --- a/tests/integration/fixture/tool_agent/agent.py +++ b/tests/integration/fixture/tool_agent/agent.py @@ -90,17 +90,17 @@ def complex_function_list_dict( raise ValueError("Wrong param") -def repetive_call_1(param: str): - return f"Call repetive_call_2 tool with param {param + '_repetive'}" +def repetitive_call_1(param: str): + return f"Call repetitive_call_2 tool with param {param + '_repetitive'}" -def repetive_call_2(param: str): +def repetitive_call_2(param: str): return param test_case_retrieval = FilesRetrieval( name="test_case_retrieval", - description="General guidence for agent test cases", + description="General guidance for agent test cases", input_dir=os.path.join(os.path.dirname(__file__), "files"), ) @@ -109,7 +109,7 @@ def repetive_call_2(param: str): rag_corpora=[ "projects/1096655024998/locations/us-central1/ragCorpora/4985766262475849728" ], - description="General guidence for agent test cases", + description="General guidance for agent test cases", ) invalid_rag_retrieval = VertexAiRagRetrieval( @@ -131,7 +131,7 @@ def repetive_call_2(param: str): shell_tool = LangchainTool(ShellTool()) docs_tool = CrewaiTool( - name="direcotry_read_tool", + name="directory_read_tool", description="use this to find files for you.", tool=DirectoryReadTool(directory="."), ) @@ -194,8 +194,8 @@ def repetive_call_2(param: str): list_str_param_function, return_list_str_function, # complex_function_list_dict, - repetive_call_1, - repetive_call_2, + repetitive_call_1, + repetitive_call_2, test_case_retrieval, valid_rag_retrieval, invalid_rag_retrieval, diff --git a/tests/integration/fixture/trip_planner_agent/agent.py b/tests/integration/fixture/trip_planner_agent/agent.py index ea8a33ab46..5c4a9f2988 100644 --- a/tests/integration/fixture/trip_planner_agent/agent.py +++ b/tests/integration/fixture/trip_planner_agent/agent.py @@ -105,6 +105,6 @@ instruction=""" Your goal is to plan the best trip according to information listed above. You describe why did you choose the city, list top 3 - attactions and provide a detailed itinerary for each day.""", + attractions and provide a detailed itinerary for each day.""", sub_agents=[identify_agent, gather_agent, plan_agent], ) diff --git a/tests/integration/fixture/trip_planner_agent/trip_inquiry_multi_turn.test.json b/tests/integration/fixture/trip_planner_agent/trip_inquiry_multi_turn.test.json new file mode 100644 index 0000000000..610f5a3efd --- /dev/null +++ b/tests/integration/fixture/trip_planner_agent/trip_inquiry_multi_turn.test.json @@ -0,0 +1,116 @@ +{ + "eval_set_id": "e7996ccc-16bc-46bf-9a24-0a3ecc3dacd7", + "name": "e7996ccc-16bc-46bf-9a24-0a3ecc3dacd7", + "description": null, + "eval_cases": [ + { + "eval_id": "tests/integration/fixture/trip_planner_agent/trip_inquiry.test.json", + "conversation": [ + { + "invocation_id": "d7ff8ec1-290b-48c5-b3aa-05cb8f27b8ae", + "user_content": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "Hi, who are you? What can you do?" + } + ], + "role": "user" + }, + "final_response": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "I am trip_planner, and my goal is to plan the best trip ever. I can describe why a city was chosen, list its top attractions, and provide a detailed itinerary for each day of the trip.\n" + } + ], + "role": "model" + }, + "intermediate_data": { + "tool_uses": [], + "intermediate_responses": [] + }, + "creation_timestamp": 1750190885.419684 + }, + { + "invocation_id": "f515ff57-ff21-488f-ab92-7d7de5bb76fe", + "user_content": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "I want to travel from San Francisco to an European country in fall next year. I am considering London and Paris. What is your advice?" + } + ], + "role": "user" + }, + "final_response": { + "parts": [ + { + "video_metadata": null, + "thought": null, + "inline_data": null, + "file_data": null, + "thought_signature": null, + "code_execution_result": null, + "executable_code": null, + "function_call": null, + "function_response": null, + "text": "Okay, I can help you analyze London and Paris to determine which city is better for your trip next fall. I will consider weather patterns, seasonal events, travel costs (including flights from San Francisco), and your interests (food, shopping, and museums). After gathering this information, I'll provide a detailed report on my chosen city.\n" + } + ], + "role": "model" + }, + "intermediate_data": { + "tool_uses": [ + { + "id": null, + "args": { + "agent_name": "indentify_agent" + }, + "name": "transfer_to_agent" + } + ], + "intermediate_responses": [] + }, + "creation_timestamp": 1750190885.4197457 + } + ], + "session_input": { + "app_name": "trip_planner_agent", + "user_id": "test_user", + "state": { + "origin": "San Francisco", + "interests": "Food, Shopping, Museums", + "range": "1000 miles", + "cities": "" + } + }, + "creation_timestamp": 1750190885.4197533 + } + ], + "creation_timestamp": 1750190885.4197605 +} \ No newline at end of file diff --git a/tests/integration/models/test_gemma_llm.py b/tests/integration/models/test_gemma_llm.py new file mode 100644 index 0000000000..81b9672a18 --- /dev/null +++ b/tests/integration/models/test_gemma_llm.py @@ -0,0 +1,57 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from google.adk.models.gemma_llm import Gemma +from google.adk.models.llm_request import LlmRequest +from google.adk.models.llm_response import LlmResponse +from google.genai import types +from google.genai.types import Content +from google.genai.types import Part +import pytest + +DEFAULT_GEMMA_MODEL = "gemma-3-1b-it" + + +@pytest.fixture +def gemma_llm(): + return Gemma(model=DEFAULT_GEMMA_MODEL) + + +@pytest.fixture +def gemma_request(): + return LlmRequest( + model=DEFAULT_GEMMA_MODEL, + contents=[ + Content( + role="user", + parts=[ + Part.from_text(text="You are a helpful assistant."), + Part.from_text(text="Hello!"), + ], + ) + ], + config=types.GenerateContentConfig( + temperature=0.1, + response_modalities=[types.Modality.TEXT], + system_instruction="Talk like a pirate.", + ), + ) + + +@pytest.mark.asyncio +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI"]) +async def test_generate_content_async(gemma_llm, gemma_request): + async for response in gemma_llm.generate_content_async(gemma_request): + assert isinstance(response, LlmResponse) + assert response.content.parts[0].text diff --git a/tests/integration/models/test_litellm_with_function.py b/tests/integration/models/test_litellm_with_function.py index e4ac787e7b..b06c8f826c 100644 --- a/tests/integration/models/test_litellm_with_function.py +++ b/tests/integration/models/test_litellm_with_function.py @@ -83,7 +83,7 @@ def llm_request(): @pytest.mark.asyncio -async def test_generate_content_asyn_with_function( +async def test_generate_content_async_with_function( oss_llm_with_function, llm_request ): responses = [ @@ -98,7 +98,7 @@ async def test_generate_content_asyn_with_function( @pytest.mark.asyncio -async def test_generate_content_asyn_stream_with_function( +async def test_generate_content_async_stream_with_function( oss_llm_with_function, llm_request ): responses = [ diff --git a/tests/integration/test_evalute_agent_in_fixture.py b/tests/integration/test_evalute_agent_in_fixture.py index 344ba0994b..bd09549eee 100644 --- a/tests/integration/test_evalute_agent_in_fixture.py +++ b/tests/integration/test_evalute_agent_in_fixture.py @@ -64,8 +64,8 @@ async def test_evaluate_agents_long_running_4_runs_per_eval_item( await AgentEvaluator.evaluate( agent_module=agent_name, eval_dataset_file_path_or_dir=evalfile, - # Using a slightly higher value helps us manange the variances that may + # Using a slightly higher value helps us manage the variances that may # happen in each eval. - # This, of course, comes at a cost of incrased test run times. + # This, of course, comes at a cost of increased test run times. num_runs=4, ) diff --git a/tests/integration/test_multi_agent.py b/tests/integration/test_multi_agent.py index 4e1470401f..2033a07bfa 100644 --- a/tests/integration/test_multi_agent.py +++ b/tests/integration/test_multi_agent.py @@ -21,7 +21,7 @@ async def test_eval_agent(): await AgentEvaluator.evaluate( agent_module="tests.integration.fixture.trip_planner_agent", eval_dataset_file_path_or_dir=( - "tests/integration/fixture/trip_planner_agent/trip_inquiry.test.json" + "tests/integration/fixture/trip_planner_agent/trip_inquiry_multi_turn.test.json" ), num_runs=4, ) diff --git a/tests/integration/test_single_agent.py b/tests/integration/test_single_agent.py index 183005eda8..769e55765d 100644 --- a/tests/integration/test_single_agent.py +++ b/tests/integration/test_single_agent.py @@ -23,3 +23,23 @@ async def test_eval_agent(): eval_dataset_file_path_or_dir="tests/integration/fixture/home_automation_agent/simple_test.test.json", num_runs=4, ) + + +@pytest.mark.asyncio +async def test_eval_agent_with_agent_suffix_in_module_name(): + await AgentEvaluator.evaluate( + agent_module="tests.integration.fixture.home_automation_agent.agent", + eval_dataset_file_path_or_dir="tests/integration/fixture/home_automation_agent/simple_test.test.json", + num_runs=4, + ) + + +@pytest.mark.asyncio +async def test_eval_agent_async(): + await AgentEvaluator.evaluate( + agent_module="tests.integration.fixture.hello_world_agent_async", + eval_dataset_file_path_or_dir=( + "tests/integration/fixture/hello_world_agent_async/roll_die.test.json" + ), + num_runs=4, + ) diff --git a/tests/integration/test_tools.py b/tests/integration/test_tools.py index 39662484ec..a9f99791bc 100644 --- a/tests/integration/test_tools.py +++ b/tests/integration/test_tools.py @@ -106,12 +106,12 @@ def test_complex_function_calls_success(agent_runner: TestRunner): [{"agent": tool_agent.agent.root_agent}], indirect=True, ) -def test_repetive_call_success(agent_runner: TestRunner): +def test_repetitive_call_success(agent_runner: TestRunner): _call_function_and_assert( agent_runner, - "repetive_call_1", + "repetitive_call_1", "test", - "test_repetive", + "test_repetitive", ) diff --git a/tests/unittests/a2a/converters/test_request_converter.py b/tests/unittests/a2a/converters/test_request_converter.py index 115b231230..b56e3ccb1a 100644 --- a/tests/unittests/a2a/converters/test_request_converter.py +++ b/tests/unittests/a2a/converters/test_request_converter.py @@ -27,7 +27,7 @@ try: from a2a.server.agent_execution import RequestContext from google.adk.a2a.converters.request_converter import _get_user_id - from google.adk.a2a.converters.request_converter import convert_a2a_request_to_adk_run_args + from google.adk.a2a.converters.request_converter import convert_a2a_request_to_agent_run_request from google.adk.runners import RunConfig from google.genai import types as genai_types except ImportError as e: @@ -143,11 +143,11 @@ def test_get_user_id_with_none_context_id(self): assert result == "A2A_USER_None" -class TestConvertA2aRequestToAdkRunArgs: - """Test cases for convert_a2a_request_to_adk_run_args function.""" +class TestConvertA2aRequestToAgentRunRequest: + """Test cases for convert_a2a_request_to_agent_run_request function.""" def test_convert_a2a_request_basic(self): - """Test basic conversion of A2A request to ADK run args.""" + """Test basic conversion of A2A request to ADK AgentRunRequest.""" # Arrange mock_part1 = Mock() mock_part2 = Mock() @@ -165,6 +165,7 @@ def test_convert_a2a_request_basic(self): request.message = mock_message request.context_id = "test_context_123" request.call_context = mock_call_context + request.metadata = {"test_key": "test_value"} # Create proper genai_types.Part objects instead of mocks mock_genai_part1 = genai_types.Part(text="test part 1") @@ -173,16 +174,21 @@ def test_convert_a2a_request_basic(self): mock_convert_part.side_effect = [mock_genai_part1, mock_genai_part2] # Act - result = convert_a2a_request_to_adk_run_args(request, mock_convert_part) + result = convert_a2a_request_to_agent_run_request( + request, mock_convert_part + ) # Assert assert result is not None - assert result["user_id"] == "test_user" - assert result["session_id"] == "test_context_123" - assert isinstance(result["new_message"], genai_types.Content) - assert result["new_message"].role == "user" - assert result["new_message"].parts == [mock_genai_part1, mock_genai_part2] - assert isinstance(result["run_config"], RunConfig) + assert result.user_id == "test_user" + assert result.session_id == "test_context_123" + assert isinstance(result.new_message, genai_types.Content) + assert result.new_message.role == "user" + assert result.new_message.parts == [mock_genai_part1, mock_genai_part2] + assert isinstance(result.run_config, RunConfig) + assert result.run_config.custom_metadata == { + "a2a_metadata": {"test_key": "test_value"} + } # Verify calls assert mock_convert_part.call_count == 2 @@ -197,7 +203,7 @@ def test_convert_a2a_request_no_message_raises_error(self): # Act & Assert with pytest.raises(ValueError, match="Request message cannot be None"): - convert_a2a_request_to_adk_run_args(request) + convert_a2a_request_to_agent_run_request(request) def test_convert_a2a_request_empty_parts(self): """Test conversion with empty parts list.""" @@ -210,18 +216,21 @@ def test_convert_a2a_request_empty_parts(self): request.message = mock_message request.context_id = "test_context_123" request.call_context = None + request.metadata = {} # Act - result = convert_a2a_request_to_adk_run_args(request, mock_convert_part) + result = convert_a2a_request_to_agent_run_request( + request, mock_convert_part + ) # Assert assert result is not None - assert result["user_id"] == "A2A_USER_test_context_123" - assert result["session_id"] == "test_context_123" - assert isinstance(result["new_message"], genai_types.Content) - assert result["new_message"].role == "user" - assert result["new_message"].parts == [] - assert isinstance(result["run_config"], RunConfig) + assert result.user_id == "A2A_USER_test_context_123" + assert result.session_id == "test_context_123" + assert isinstance(result.new_message, genai_types.Content) + assert result.new_message.role == "user" + assert result.new_message.parts == [] + assert isinstance(result.run_config, RunConfig) # Verify convert_part wasn't called mock_convert_part.assert_not_called() @@ -237,6 +246,7 @@ def test_convert_a2a_request_none_context_id(self): request.message = mock_message request.context_id = None request.call_context = None + request.metadata = {} # Create proper genai_types.Part object instead of mock mock_genai_part = genai_types.Part(text="test part") @@ -244,16 +254,18 @@ def test_convert_a2a_request_none_context_id(self): mock_convert_part.return_value = mock_genai_part # Act - result = convert_a2a_request_to_adk_run_args(request, mock_convert_part) + result = convert_a2a_request_to_agent_run_request( + request, mock_convert_part + ) # Assert assert result is not None - assert result["user_id"] == "A2A_USER_None" - assert result["session_id"] is None - assert isinstance(result["new_message"], genai_types.Content) - assert result["new_message"].role == "user" - assert result["new_message"].parts == [mock_genai_part] - assert isinstance(result["run_config"], RunConfig) + assert result.user_id == "A2A_USER_None" + assert result.session_id is None + assert isinstance(result.new_message, genai_types.Content) + assert result.new_message.role == "user" + assert result.new_message.parts == [mock_genai_part] + assert isinstance(result.run_config, RunConfig) def test_convert_a2a_request_no_auth(self): """Test conversion when no authentication is available.""" @@ -266,6 +278,7 @@ def test_convert_a2a_request_no_auth(self): request.message = mock_message request.context_id = "session_123" request.call_context = None + request.metadata = {} # Create proper genai_types.Part object instead of mock mock_genai_part = genai_types.Part(text="test part") @@ -273,16 +286,18 @@ def test_convert_a2a_request_no_auth(self): mock_convert_part.return_value = mock_genai_part # Act - result = convert_a2a_request_to_adk_run_args(request, mock_convert_part) + result = convert_a2a_request_to_agent_run_request( + request, mock_convert_part + ) # Assert assert result is not None - assert result["user_id"] == "A2A_USER_session_123" - assert result["session_id"] == "session_123" - assert isinstance(result["new_message"], genai_types.Content) - assert result["new_message"].role == "user" - assert result["new_message"].parts == [mock_genai_part] - assert isinstance(result["run_config"], RunConfig) + assert result.user_id == "A2A_USER_session_123" + assert result.session_id == "session_123" + assert isinstance(result.new_message, genai_types.Content) + assert result.new_message.role == "user" + assert result.new_message.parts == [mock_genai_part] + assert isinstance(result.run_config, RunConfig) class TestIntegration: @@ -305,6 +320,7 @@ def test_end_to_end_conversion_with_auth_user(self): request.call_context = mock_call_context request.message = mock_message request.context_id = "mysession" + request.metadata = {} # Create proper genai_types.Part object instead of mock mock_genai_part = genai_types.Part(text="test part") @@ -312,16 +328,18 @@ def test_end_to_end_conversion_with_auth_user(self): mock_convert_part.return_value = mock_genai_part # Act - result = convert_a2a_request_to_adk_run_args(request, mock_convert_part) + result = convert_a2a_request_to_agent_run_request( + request, mock_convert_part + ) # Assert assert result is not None - assert result["user_id"] == "auth_user" # Should use authenticated user - assert result["session_id"] == "mysession" - assert isinstance(result["new_message"], genai_types.Content) - assert result["new_message"].role == "user" - assert result["new_message"].parts == [mock_genai_part] - assert isinstance(result["run_config"], RunConfig) + assert result.user_id == "auth_user" # Should use authenticated user + assert result.session_id == "mysession" + assert isinstance(result.new_message, genai_types.Content) + assert result.new_message.role == "user" + assert result.new_message.parts == [mock_genai_part] + assert isinstance(result.run_config, RunConfig) def test_end_to_end_conversion_with_fallback_user(self): """Test end-to-end conversion with fallback user ID.""" @@ -334,6 +352,7 @@ def test_end_to_end_conversion_with_fallback_user(self): request.call_context = None request.message = mock_message request.context_id = "test_session_456" + request.metadata = {} # Create proper genai_types.Part object instead of mock mock_genai_part = genai_types.Part(text="test part") @@ -341,15 +360,17 @@ def test_end_to_end_conversion_with_fallback_user(self): mock_convert_part.return_value = mock_genai_part # Act - result = convert_a2a_request_to_adk_run_args(request, mock_convert_part) + result = convert_a2a_request_to_agent_run_request( + request, mock_convert_part + ) # Assert assert result is not None assert ( - result["user_id"] == "A2A_USER_test_session_456" - ) # Should fallback to context ID - assert result["session_id"] == "test_session_456" - assert isinstance(result["new_message"], genai_types.Content) - assert result["new_message"].role == "user" - assert result["new_message"].parts == [mock_genai_part] - assert isinstance(result["run_config"], RunConfig) + result.user_id == "A2A_USER_test_session_456" + ) # Should fall back to context ID + assert result.session_id == "test_session_456" + assert isinstance(result.new_message, genai_types.Content) + assert result.new_message.role == "user" + assert result.new_message.parts == [mock_genai_part] + assert isinstance(result.run_config, RunConfig) diff --git a/tests/unittests/a2a/executor/test_a2a_agent_executor.py b/tests/unittests/a2a/executor/test_a2a_agent_executor.py index 11d6b3a7c2..4bcc7a91d7 100644 --- a/tests/unittests/a2a/executor/test_a2a_agent_executor.py +++ b/tests/unittests/a2a/executor/test_a2a_agent_executor.py @@ -31,10 +31,13 @@ from a2a.types import Message from a2a.types import TaskState from a2a.types import TextPart + from google.adk.a2a.converters.request_converter import AgentRunRequest from google.adk.a2a.executor.a2a_agent_executor import A2aAgentExecutor from google.adk.a2a.executor.a2a_agent_executor import A2aAgentExecutorConfig from google.adk.events.event import Event + from google.adk.runners import RunConfig from google.adk.runners import Runner + from google.genai.types import Content except ImportError as e: if sys.version_info < (3, 10): # Imports are not needed since tests will be skipped due to pytestmark. @@ -58,9 +61,13 @@ def setup_method(self): self.mock_a2a_part_converter = Mock() self.mock_gen_ai_part_converter = Mock() + self.mock_request_converter = Mock() + self.mock_event_converter = Mock() self.mock_config = A2aAgentExecutorConfig( a2a_part_converter=self.mock_a2a_part_converter, gen_ai_part_converter=self.mock_gen_ai_part_converter, + request_converter=self.mock_request_converter, + event_converter=self.mock_event_converter, ) self.executor = A2aAgentExecutor( runner=self.mock_runner, config=self.mock_config @@ -84,71 +91,73 @@ async def _create_async_generator(self, items): async def test_execute_success_new_task(self): """Test successful execution of a new task.""" # Setup - with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_a2a_request_to_adk_run_args" - ) as mock_convert: - mock_convert.return_value = { - "user_id": "test-user", - "session_id": "test-session", - "new_message": Mock(), - "run_config": Mock(), - } - - # Mock session service - mock_session = Mock() - mock_session.id = "test-session" - self.mock_runner.session_service.get_session = AsyncMock( - return_value=mock_session - ) + self.mock_request_converter.return_value = AgentRunRequest( + user_id="test-user", + session_id="test-session", + new_message=Mock(spec=Content), + run_config=Mock(spec=RunConfig), + ) + # Mock session service + mock_session = Mock() + mock_session.id = "test-session" + self.mock_runner.session_service.get_session = AsyncMock( + return_value=mock_session + ) - # Mock invocation context - mock_invocation_context = Mock() - self.mock_runner._new_invocation_context.return_value = ( - mock_invocation_context - ) + # Mock invocation context + mock_invocation_context = Mock() + self.mock_runner._new_invocation_context.return_value = ( + mock_invocation_context + ) + + # Mock agent run with proper async generator + mock_event = Mock(spec=Event) - # Mock agent run with proper async generator - mock_event = Mock(spec=Event) - - # Configure run_async to return the async generator when awaited - async def mock_run_async(**kwargs): - async for item in self._create_async_generator([mock_event]): - yield item - - self.mock_runner.run_async = mock_run_async - - with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_event_to_a2a_events" - ) as mock_convert_events: - mock_convert_events.return_value = [] - - # Execute - await self.executor.execute(self.mock_context, self.mock_event_queue) - - # Verify task submitted event was enqueued - assert self.mock_event_queue.enqueue_event.call_count >= 3 - submitted_event = self.mock_event_queue.enqueue_event.call_args_list[0][ - 0 - ][0] - assert submitted_event.status.state == TaskState.submitted - assert submitted_event.final == False - - # Verify working event was enqueued - working_event = self.mock_event_queue.enqueue_event.call_args_list[1][ - 0 - ][0] - assert working_event.status.state == TaskState.working - assert working_event.final == False - - # Verify final event was enqueued with proper message field - final_event = self.mock_event_queue.enqueue_event.call_args_list[-1][0][ - 0 - ] - assert final_event.final == True - # The TaskResultAggregator is created with default state (working), and since no messages - # are processed, it will publish a status event with the current state - assert hasattr(final_event.status, "message") - assert final_event.status.state == TaskState.working + # Configure run_async to return the async generator when awaited + async def mock_run_async(**kwargs): + async for item in self._create_async_generator([mock_event]): + yield item + + self.mock_runner.run_async = mock_run_async + self.mock_event_converter.return_value = [] + + # Execute + await self.executor.execute(self.mock_context, self.mock_event_queue) + + # Verify request converter was called with proper arguments + self.mock_request_converter.assert_called_once_with( + self.mock_context, self.mock_a2a_part_converter + ) + + # Verify event converter was called with proper arguments + self.mock_event_converter.assert_called_once_with( + mock_event, + mock_invocation_context, + self.mock_context.task_id, + self.mock_context.context_id, + self.mock_gen_ai_part_converter, + ) + + # Verify task submitted event was enqueued + assert self.mock_event_queue.enqueue_event.call_count >= 3 + submitted_event = self.mock_event_queue.enqueue_event.call_args_list[0][0][ + 0 + ] + assert submitted_event.status.state == TaskState.submitted + assert submitted_event.final == False + + # Verify working event was enqueued + working_event = self.mock_event_queue.enqueue_event.call_args_list[1][0][0] + assert working_event.status.state == TaskState.working + assert working_event.final == False + + # Verify final event was enqueued with proper message field + final_event = self.mock_event_queue.enqueue_event.call_args_list[-1][0][0] + assert final_event.final == True + # The TaskResultAggregator is created with default state (working), and since no messages + # are processed, it will publish a status event with the current state + assert hasattr(final_event.status, "message") + assert final_event.status.state == TaskState.working @pytest.mark.asyncio async def test_execute_no_message_error(self): @@ -164,73 +173,76 @@ async def test_execute_existing_task(self): self.mock_context.current_task = Mock() self.mock_context.task_id = "existing-task-id" - with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_a2a_request_to_adk_run_args" - ) as mock_convert: - mock_convert.return_value = { - "user_id": "test-user", - "session_id": "test-session", - "new_message": Mock(), - "run_config": Mock(), - } - - # Mock session service - mock_session = Mock() - mock_session.id = "test-session" - self.mock_runner.session_service.get_session = AsyncMock( - return_value=mock_session - ) + self.mock_request_converter.return_value = AgentRunRequest( + user_id="test-user", + session_id="test-session", + new_message=Mock(spec=Content), + run_config=Mock(spec=RunConfig), + ) - # Mock invocation context - mock_invocation_context = Mock() - self.mock_runner._new_invocation_context.return_value = ( - mock_invocation_context - ) + # Mock session service + mock_session = Mock() + mock_session.id = "test-session" + self.mock_runner.session_service.get_session = AsyncMock( + return_value=mock_session + ) + + # Mock invocation context + mock_invocation_context = Mock() + self.mock_runner._new_invocation_context.return_value = ( + mock_invocation_context + ) + + # Mock agent run with proper async generator + mock_event = Mock(spec=Event) - # Mock agent run with proper async generator - mock_event = Mock(spec=Event) - - # Configure run_async to return the async generator when awaited - async def mock_run_async(**kwargs): - async for item in self._create_async_generator([mock_event]): - yield item - - self.mock_runner.run_async = mock_run_async - - with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_event_to_a2a_events" - ) as mock_convert_events: - mock_convert_events.return_value = [] - - # Execute - await self.executor.execute(self.mock_context, self.mock_event_queue) - - # Verify no submitted event (first call should be working event) - working_event = self.mock_event_queue.enqueue_event.call_args_list[0][ - 0 - ][0] - assert working_event.status.state == TaskState.working - assert working_event.final == False - - # Verify final event was enqueued with proper message field - final_event = self.mock_event_queue.enqueue_event.call_args_list[-1][0][ - 0 - ] - assert final_event.final == True - # The TaskResultAggregator is created with default state (working), and since no messages - # are processed, it will publish a status event with the current state - assert hasattr(final_event.status, "message") - assert final_event.status.state == TaskState.working + # Configure run_async to return the async generator when awaited + async def mock_run_async(**kwargs): + async for item in self._create_async_generator([mock_event]): + yield item + + self.mock_runner.run_async = mock_run_async + self.mock_event_converter.return_value = [] + + # Execute + await self.executor.execute(self.mock_context, self.mock_event_queue) + + # Verify request converter was called with proper arguments + self.mock_request_converter.assert_called_once_with( + self.mock_context, self.mock_a2a_part_converter + ) + + # Verify event converter was called with proper arguments + self.mock_event_converter.assert_called_once_with( + mock_event, + mock_invocation_context, + self.mock_context.task_id, + self.mock_context.context_id, + self.mock_gen_ai_part_converter, + ) + + # Verify no submitted event (first call should be working event) + working_event = self.mock_event_queue.enqueue_event.call_args_list[0][0][0] + assert working_event.status.state == TaskState.working + assert working_event.final == False + + # Verify final event was enqueued with proper message field + final_event = self.mock_event_queue.enqueue_event.call_args_list[-1][0][0] + assert final_event.final == True + # The TaskResultAggregator is created with default state (working), and since no messages + # are processed, it will publish a status event with the current state + assert hasattr(final_event.status, "message") + assert final_event.status.state == TaskState.working @pytest.mark.asyncio async def test_prepare_session_new_session(self): """Test session preparation when session doesn't exist.""" - run_args = { - "user_id": "test-user", - "session_id": None, - "new_message": Mock(), - "run_config": Mock(), - } + run_args = AgentRunRequest( + user_id="test-user", + session_id=None, + new_message=Mock(spec=Content), + run_config=Mock(spec=RunConfig), + ) # Mock session service self.mock_runner.session_service.get_session = AsyncMock(return_value=None) @@ -247,18 +259,18 @@ async def test_prepare_session_new_session(self): # Verify session was created assert result == mock_session - assert run_args["session_id"] is not None + assert run_args.session_id is not None self.mock_runner.session_service.create_session.assert_called_once() @pytest.mark.asyncio async def test_prepare_session_existing_session(self): """Test session preparation when session exists.""" - run_args = { - "user_id": "test-user", - "session_id": "existing-session", - "new_message": Mock(), - "run_config": Mock(), - } + run_args = AgentRunRequest( + user_id="test-user", + session_id="existing-session", + new_message=Mock(spec=Content), + run_config=Mock(spec=RunConfig), + ) # Mock session service mock_session = Mock() @@ -397,63 +409,55 @@ def create_runner(): executor = A2aAgentExecutor(runner=create_runner, config=self.mock_config) - with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_a2a_request_to_adk_run_args" - ) as mock_convert: - mock_convert.return_value = { - "user_id": "test-user", - "session_id": "test-session", - "new_message": Mock(), - "run_config": Mock(), - } - - # Mock session service - mock_session = Mock() - mock_session.id = "test-session" - self.mock_runner.session_service.get_session = AsyncMock( - return_value=mock_session - ) + self.mock_request_converter.return_value = AgentRunRequest( + user_id="test-user", + session_id="test-session", + new_message=Mock(spec=Content), + run_config=Mock(spec=RunConfig), + ) - # Mock invocation context - mock_invocation_context = Mock() - self.mock_runner._new_invocation_context.return_value = ( - mock_invocation_context - ) + # Mock session service + mock_session = Mock() + mock_session.id = "test-session" + self.mock_runner.session_service.get_session = AsyncMock( + return_value=mock_session + ) - # Mock agent run with proper async generator - mock_event = Mock(spec=Event) - - async def mock_run_async(**kwargs): - async for item in self._create_async_generator([mock_event]): - yield item - - self.mock_runner.run_async = mock_run_async - - with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_event_to_a2a_events" - ) as mock_convert_events: - mock_convert_events.return_value = [] - - # Execute - await executor.execute(self.mock_context, self.mock_event_queue) - - # Verify task submitted event was enqueued - assert self.mock_event_queue.enqueue_event.call_count >= 3 - submitted_event = self.mock_event_queue.enqueue_event.call_args_list[0][ - 0 - ][0] - assert submitted_event.status.state == TaskState.submitted - assert submitted_event.final == False - - # Verify final event was enqueued with proper message field - final_event = self.mock_event_queue.enqueue_event.call_args_list[-1][0][ - 0 - ] - assert final_event.final == True - # The TaskResultAggregator is created with default state (working), and since no messages - # are processed, it will publish a status event with the current state - assert hasattr(final_event.status, "message") - assert final_event.status.state == TaskState.working + # Mock invocation context + mock_invocation_context = Mock() + self.mock_runner._new_invocation_context.return_value = ( + mock_invocation_context + ) + + # Mock agent run with proper async generator + mock_event = Mock(spec=Event) + + async def mock_run_async(**kwargs): + async for item in self._create_async_generator([mock_event]): + yield item + + self.mock_runner.run_async = mock_run_async + + self.mock_event_converter.return_value = [] + + # Execute + await executor.execute(self.mock_context, self.mock_event_queue) + + # Verify task submitted event was enqueued + assert self.mock_event_queue.enqueue_event.call_count >= 3 + submitted_event = self.mock_event_queue.enqueue_event.call_args_list[0][0][ + 0 + ] + assert submitted_event.status.state == TaskState.submitted + assert submitted_event.final == False + + # Verify final event was enqueued with proper message field + final_event = self.mock_event_queue.enqueue_event.call_args_list[-1][0][0] + assert final_event.final == True + # The TaskResultAggregator is created with default state (working), and since no messages + # are processed, it will publish a status event with the current state + assert hasattr(final_event.status, "message") + assert final_event.status.state == TaskState.working @pytest.mark.asyncio async def test_execute_with_async_callable_runner(self): @@ -464,63 +468,55 @@ async def create_runner(): executor = A2aAgentExecutor(runner=create_runner, config=self.mock_config) - with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_a2a_request_to_adk_run_args" - ) as mock_convert: - mock_convert.return_value = { - "user_id": "test-user", - "session_id": "test-session", - "new_message": Mock(), - "run_config": Mock(), - } - - # Mock session service - mock_session = Mock() - mock_session.id = "test-session" - self.mock_runner.session_service.get_session = AsyncMock( - return_value=mock_session - ) + self.mock_request_converter.return_value = AgentRunRequest( + user_id="test-user", + session_id="test-session", + new_message=Mock(spec=Content), + run_config=Mock(spec=RunConfig), + ) - # Mock invocation context - mock_invocation_context = Mock() - self.mock_runner._new_invocation_context.return_value = ( - mock_invocation_context - ) + # Mock session service + mock_session = Mock() + mock_session.id = "test-session" + self.mock_runner.session_service.get_session = AsyncMock( + return_value=mock_session + ) + + # Mock invocation context + mock_invocation_context = Mock() + self.mock_runner._new_invocation_context.return_value = ( + mock_invocation_context + ) + + # Mock agent run with proper async generator + mock_event = Mock(spec=Event) + + async def mock_run_async(**kwargs): + async for item in self._create_async_generator([mock_event]): + yield item + + self.mock_runner.run_async = mock_run_async - # Mock agent run with proper async generator - mock_event = Mock(spec=Event) - - async def mock_run_async(**kwargs): - async for item in self._create_async_generator([mock_event]): - yield item - - self.mock_runner.run_async = mock_run_async - - with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_event_to_a2a_events" - ) as mock_convert_events: - mock_convert_events.return_value = [] - - # Execute - await executor.execute(self.mock_context, self.mock_event_queue) - - # Verify task submitted event was enqueued - assert self.mock_event_queue.enqueue_event.call_count >= 3 - submitted_event = self.mock_event_queue.enqueue_event.call_args_list[0][ - 0 - ][0] - assert submitted_event.status.state == TaskState.submitted - assert submitted_event.final == False - - # Verify final event was enqueued with proper message field - final_event = self.mock_event_queue.enqueue_event.call_args_list[-1][0][ - 0 - ] - assert final_event.final == True - # The TaskResultAggregator is created with default state (working), and since no messages - # are processed, it will publish a status event with the current state - assert hasattr(final_event.status, "message") - assert final_event.status.state == TaskState.working + self.mock_event_converter.return_value = [] + + # Execute + await executor.execute(self.mock_context, self.mock_event_queue) + + # Verify task submitted event was enqueued + assert self.mock_event_queue.enqueue_event.call_count >= 3 + submitted_event = self.mock_event_queue.enqueue_event.call_args_list[0][0][ + 0 + ] + assert submitted_event.status.state == TaskState.submitted + assert submitted_event.final == False + + # Verify final event was enqueued with proper message field + final_event = self.mock_event_queue.enqueue_event.call_args_list[-1][0][0] + assert final_event.final == True + # The TaskResultAggregator is created with default state (working), and since no messages + # are processed, it will publish a status event with the current state + assert hasattr(final_event.status, "message") + assert final_event.status.state == TaskState.working @pytest.mark.asyncio async def test_handle_request_integration(self): @@ -529,83 +525,75 @@ async def test_handle_request_integration(self): self.mock_context.task_id = "test-task-id" # Setup detailed mocks + self.mock_request_converter.return_value = AgentRunRequest( + user_id="test-user", + session_id="test-session", + new_message=Mock(spec=Content), + run_config=Mock(spec=RunConfig), + ) + + # Mock session service + mock_session = Mock() + mock_session.id = "test-session" + self.mock_runner.session_service.get_session = AsyncMock( + return_value=mock_session + ) + + # Mock invocation context + mock_invocation_context = Mock() + self.mock_runner._new_invocation_context.return_value = ( + mock_invocation_context + ) + + # Mock agent run with multiple events using proper async generator + mock_events = [Mock(spec=Event), Mock(spec=Event)] + + # Configure run_async to return the async generator when awaited + async def mock_run_async(**kwargs): + async for item in self._create_async_generator(mock_events): + yield item + + self.mock_runner.run_async = mock_run_async + + self.mock_event_converter.return_value = [Mock()] + with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_a2a_request_to_adk_run_args" - ) as mock_convert: - mock_convert.return_value = { - "user_id": "test-user", - "session_id": "test-session", - "new_message": Mock(), - "run_config": Mock(), - } - - # Mock session service - mock_session = Mock() - mock_session.id = "test-session" - self.mock_runner.session_service.get_session = AsyncMock( - return_value=mock_session + "google.adk.a2a.executor.a2a_agent_executor.TaskResultAggregator" + ) as mock_aggregator_class: + mock_aggregator = Mock() + mock_aggregator.task_state = TaskState.working + # Mock the task_status_message property to return None by default + mock_aggregator.task_status_message = None + mock_aggregator_class.return_value = mock_aggregator + + # Execute + await self.executor._handle_request( + self.mock_context, self.mock_event_queue ) - # Mock invocation context - mock_invocation_context = Mock() - self.mock_runner._new_invocation_context.return_value = ( - mock_invocation_context - ) + # Verify working event was enqueued + working_events = [ + call[0][0] + for call in self.mock_event_queue.enqueue_event.call_args_list + if hasattr(call[0][0], "status") + and call[0][0].status.state == TaskState.working + ] + assert len(working_events) >= 1 - # Mock agent run with multiple events using proper async generator - mock_events = [Mock(spec=Event), Mock(spec=Event)] - - # Configure run_async to return the async generator when awaited - async def mock_run_async(**kwargs): - async for item in self._create_async_generator(mock_events): - yield item - - self.mock_runner.run_async = mock_run_async - - with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_event_to_a2a_events" - ) as mock_convert_events: - mock_convert_events.return_value = [Mock()] - - with patch( - "google.adk.a2a.executor.a2a_agent_executor.TaskResultAggregator" - ) as mock_aggregator_class: - mock_aggregator = Mock() - mock_aggregator.task_state = TaskState.working - # Mock the task_status_message property to return None by default - mock_aggregator.task_status_message = None - mock_aggregator_class.return_value = mock_aggregator - - # Execute - await self.executor._handle_request( - self.mock_context, self.mock_event_queue - ) - - # Verify working event was enqueued - working_events = [ - call[0][0] - for call in self.mock_event_queue.enqueue_event.call_args_list - if hasattr(call[0][0], "status") - and call[0][0].status.state == TaskState.working - ] - assert len(working_events) >= 1 - - # Verify aggregator processed events - assert mock_aggregator.process_event.call_count == len(mock_events) - - # Verify final event has message field from aggregator and state is completed when aggregator state is working - final_events = [ - call[0][0] - for call in self.mock_event_queue.enqueue_event.call_args_list - if hasattr(call[0][0], "final") and call[0][0].final == True - ] - assert len(final_events) >= 1 - final_event = final_events[-1] # Get the last final event - assert ( - final_event.status.message == mock_aggregator.task_status_message - ) - # When aggregator state is working but no message, final event should be working - assert final_event.status.state == TaskState.working + # Verify aggregator processed events + assert mock_aggregator.process_event.call_count == len(mock_events) + + # Verify final event has message field from aggregator and state is completed when aggregator state is working + final_events = [ + call[0][0] + for call in self.mock_event_queue.enqueue_event.call_args_list + if hasattr(call[0][0], "final") and call[0][0].final == True + ] + assert len(final_events) >= 1 + final_event = final_events[-1] # Get the last final event + assert final_event.status.message == mock_aggregator.task_status_message + # When aggregator state is working but no message, final event should be working + assert final_event.status.state == TaskState.working @pytest.mark.asyncio async def test_cancel_with_task_id(self): @@ -637,31 +625,26 @@ async def test_execute_with_exception_handling(self): None # Make sure it goes through submitted event creation ) - with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_a2a_request_to_adk_run_args" - ) as mock_convert: - mock_convert.side_effect = Exception("Test error") + self.mock_request_converter.side_effect = Exception("Test error") - # Execute (should not raise since we catch the exception) - await self.executor.execute(self.mock_context, self.mock_event_queue) + # Execute (should not raise since we catch the exception) + await self.executor.execute(self.mock_context, self.mock_event_queue) - # Verify both submitted and failure events were enqueued - # First call should be submitted event, last should be failure event - assert self.mock_event_queue.enqueue_event.call_count >= 2 + # Verify both submitted and failure events were enqueued + # First call should be submitted event, last should be failure event + assert self.mock_event_queue.enqueue_event.call_count >= 2 - # Check submitted event (first) - submitted_event = self.mock_event_queue.enqueue_event.call_args_list[0][ - 0 - ][0] - assert submitted_event.status.state == TaskState.submitted - assert submitted_event.final == False + # Check submitted event (first) + submitted_event = self.mock_event_queue.enqueue_event.call_args_list[0][0][ + 0 + ] + assert submitted_event.status.state == TaskState.submitted + assert submitted_event.final == False - # Check failure event (last) - failure_event = self.mock_event_queue.enqueue_event.call_args_list[-1][0][ - 0 - ] - assert failure_event.status.state == TaskState.failed - assert failure_event.final == True + # Check failure event (last) + failure_event = self.mock_event_queue.enqueue_event.call_args_list[-1][0][0] + assert failure_event.status.state == TaskState.failed + assert failure_event.final == True @pytest.mark.asyncio async def test_handle_request_with_aggregator_message(self): @@ -680,69 +663,63 @@ async def test_handle_request_with_aggregator_message(self): test_message.parts = [Mock(spec=TextPart)] # Setup detailed mocks - with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_a2a_request_to_adk_run_args" - ) as mock_convert: - mock_convert.return_value = { - "user_id": "test-user", - "session_id": "test-session", - "new_message": Mock(), - "run_config": Mock(), - } - - # Mock session service - mock_session = Mock() - mock_session.id = "test-session" - self.mock_runner.session_service.get_session = AsyncMock( - return_value=mock_session - ) + self.mock_request_converter.return_value = AgentRunRequest( + user_id="test-user", + session_id="test-session", + new_message=Mock(spec=Content), + run_config=Mock(spec=RunConfig), + ) - # Mock invocation context - mock_invocation_context = Mock() - self.mock_runner._new_invocation_context.return_value = ( - mock_invocation_context + # Mock session service + mock_session = Mock() + mock_session.id = "test-session" + self.mock_runner.session_service.get_session = AsyncMock( + return_value=mock_session + ) + + # Mock invocation context + mock_invocation_context = Mock() + self.mock_runner._new_invocation_context.return_value = ( + mock_invocation_context + ) + + # Mock agent run with multiple events using proper async generator + mock_events = [Mock(spec=Event), Mock(spec=Event)] + + # Configure run_async to return the async generator when awaited + async def mock_run_async(**kwargs): + async for item in self._create_async_generator(mock_events): + yield item + + self.mock_runner.run_async = mock_run_async + + self.mock_event_converter.return_value = [Mock()] + + with patch( + "google.adk.a2a.executor.a2a_agent_executor.TaskResultAggregator" + ) as mock_aggregator_class: + mock_aggregator = Mock() + mock_aggregator.task_state = TaskState.completed + # Mock the task_status_message property to return a test message + mock_aggregator.task_status_message = test_message + mock_aggregator_class.return_value = mock_aggregator + + # Execute + await self.executor._handle_request( + self.mock_context, self.mock_event_queue ) - # Mock agent run with multiple events using proper async generator - mock_events = [Mock(spec=Event), Mock(spec=Event)] - - # Configure run_async to return the async generator when awaited - async def mock_run_async(**kwargs): - async for item in self._create_async_generator(mock_events): - yield item - - self.mock_runner.run_async = mock_run_async - - with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_event_to_a2a_events" - ) as mock_convert_events: - mock_convert_events.return_value = [Mock()] - - with patch( - "google.adk.a2a.executor.a2a_agent_executor.TaskResultAggregator" - ) as mock_aggregator_class: - mock_aggregator = Mock() - mock_aggregator.task_state = TaskState.completed - # Mock the task_status_message property to return a test message - mock_aggregator.task_status_message = test_message - mock_aggregator_class.return_value = mock_aggregator - - # Execute - await self.executor._handle_request( - self.mock_context, self.mock_event_queue - ) - - # Verify final event has message field from aggregator - final_events = [ - call[0][0] - for call in self.mock_event_queue.enqueue_event.call_args_list - if hasattr(call[0][0], "final") and call[0][0].final == True - ] - assert len(final_events) >= 1 - final_event = final_events[-1] # Get the last final event - assert final_event.status.message == test_message - # When aggregator state is completed (not working), final event should be completed - assert final_event.status.state == TaskState.completed + # Verify final event has message field from aggregator + final_events = [ + call[0][0] + for call in self.mock_event_queue.enqueue_event.call_args_list + if hasattr(call[0][0], "final") and call[0][0].final == True + ] + assert len(final_events) >= 1 + final_event = final_events[-1] # Get the last final event + assert final_event.status.message == test_message + # When aggregator state is completed (not working), final event should be completed + assert final_event.status.state == TaskState.completed @pytest.mark.asyncio async def test_handle_request_with_non_working_aggregator_state(self): @@ -761,69 +738,63 @@ async def test_handle_request_with_non_working_aggregator_state(self): test_message.parts = [Mock(spec=TextPart)] # Setup detailed mocks - with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_a2a_request_to_adk_run_args" - ) as mock_convert: - mock_convert.return_value = { - "user_id": "test-user", - "session_id": "test-session", - "new_message": Mock(), - "run_config": Mock(), - } - - # Mock session service - mock_session = Mock() - mock_session.id = "test-session" - self.mock_runner.session_service.get_session = AsyncMock( - return_value=mock_session - ) + self.mock_request_converter.return_value = AgentRunRequest( + user_id="test-user", + session_id="test-session", + new_message=Mock(spec=Content), + run_config=Mock(spec=RunConfig), + ) + + # Mock session service + mock_session = Mock() + mock_session.id = "test-session" + self.mock_runner.session_service.get_session = AsyncMock( + return_value=mock_session + ) + + # Mock invocation context + mock_invocation_context = Mock() + self.mock_runner._new_invocation_context.return_value = ( + mock_invocation_context + ) - # Mock invocation context - mock_invocation_context = Mock() - self.mock_runner._new_invocation_context.return_value = ( - mock_invocation_context + # Mock agent run with multiple events using proper async generator + mock_events = [Mock(spec=Event), Mock(spec=Event)] + + # Configure run_async to return the async generator when awaited + async def mock_run_async(**kwargs): + async for item in self._create_async_generator(mock_events): + yield item + + self.mock_runner.run_async = mock_run_async + + self.mock_event_converter.return_value = [Mock()] + + with patch( + "google.adk.a2a.executor.a2a_agent_executor.TaskResultAggregator" + ) as mock_aggregator_class: + mock_aggregator = Mock() + # Test with failed state - should preserve failed state + mock_aggregator.task_state = TaskState.failed + mock_aggregator.task_status_message = test_message + mock_aggregator_class.return_value = mock_aggregator + + # Execute + await self.executor._handle_request( + self.mock_context, self.mock_event_queue ) - # Mock agent run with multiple events using proper async generator - mock_events = [Mock(spec=Event), Mock(spec=Event)] - - # Configure run_async to return the async generator when awaited - async def mock_run_async(**kwargs): - async for item in self._create_async_generator(mock_events): - yield item - - self.mock_runner.run_async = mock_run_async - - with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_event_to_a2a_events" - ) as mock_convert_events: - mock_convert_events.return_value = [Mock()] - - with patch( - "google.adk.a2a.executor.a2a_agent_executor.TaskResultAggregator" - ) as mock_aggregator_class: - mock_aggregator = Mock() - # Test with failed state - should preserve failed state - mock_aggregator.task_state = TaskState.failed - mock_aggregator.task_status_message = test_message - mock_aggregator_class.return_value = mock_aggregator - - # Execute - await self.executor._handle_request( - self.mock_context, self.mock_event_queue - ) - - # Verify final event preserves the non-working state - final_events = [ - call[0][0] - for call in self.mock_event_queue.enqueue_event.call_args_list - if hasattr(call[0][0], "final") and call[0][0].final == True - ] - assert len(final_events) >= 1 - final_event = final_events[-1] # Get the last final event - assert final_event.status.message == test_message - # When aggregator state is failed (not working), final event should keep failed state - assert final_event.status.state == TaskState.failed + # Verify final event preserves the non-working state + final_events = [ + call[0][0] + for call in self.mock_event_queue.enqueue_event.call_args_list + if hasattr(call[0][0], "final") and call[0][0].final == True + ] + assert len(final_events) >= 1 + final_event = final_events[-1] # Get the last final event + assert final_event.status.message == test_message + # When aggregator state is failed (not working), final event should keep failed state + assert final_event.status.state == TaskState.failed @pytest.mark.asyncio async def test_handle_request_with_working_state_publishes_artifact_and_completed( @@ -846,84 +817,77 @@ async def test_handle_request_with_working_state_publishes_artifact_and_complete test_message.parts = [Part(root=TextPart(text="test content"))] # Setup detailed mocks - with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_a2a_request_to_adk_run_args" - ) as mock_convert: - mock_convert.return_value = { - "user_id": "test-user", - "session_id": "test-session", - "new_message": Mock(), - "run_config": Mock(), - } - - # Mock session service - mock_session = Mock() - mock_session.id = "test-session" - self.mock_runner.session_service.get_session = AsyncMock( - return_value=mock_session - ) + self.mock_request_converter.return_value = AgentRunRequest( + user_id="test-user", + session_id="test-session", + new_message=Mock(spec=Content), + run_config=Mock(spec=RunConfig), + ) + + # Mock session service + mock_session = Mock() + mock_session.id = "test-session" + self.mock_runner.session_service.get_session = AsyncMock( + return_value=mock_session + ) + + # Mock invocation context + mock_invocation_context = Mock() + self.mock_runner._new_invocation_context.return_value = ( + mock_invocation_context + ) + + # Mock agent run with multiple events using proper async generator + mock_events = [Mock(spec=Event), Mock(spec=Event)] + + # Configure run_async to return the async generator when awaited + async def mock_run_async(**kwargs): + async for item in self._create_async_generator(mock_events): + yield item + + self.mock_runner.run_async = mock_run_async + + self.mock_event_converter.return_value = [Mock()] - # Mock invocation context - mock_invocation_context = Mock() - self.mock_runner._new_invocation_context.return_value = ( - mock_invocation_context + with patch( + "google.adk.a2a.executor.a2a_agent_executor.TaskResultAggregator" + ) as mock_aggregator_class: + mock_aggregator = Mock() + # Test with working state - should publish artifact update and completed status + mock_aggregator.task_state = TaskState.working + mock_aggregator.task_status_message = test_message + mock_aggregator_class.return_value = mock_aggregator + + # Execute + await self.executor._handle_request( + self.mock_context, self.mock_event_queue ) - # Mock agent run with multiple events using proper async generator - mock_events = [Mock(spec=Event), Mock(spec=Event)] - - # Configure run_async to return the async generator when awaited - async def mock_run_async(**kwargs): - async for item in self._create_async_generator(mock_events): - yield item - - self.mock_runner.run_async = mock_run_async - - with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_event_to_a2a_events" - ) as mock_convert_events: - mock_convert_events.return_value = [Mock()] - - with patch( - "google.adk.a2a.executor.a2a_agent_executor.TaskResultAggregator" - ) as mock_aggregator_class: - mock_aggregator = Mock() - # Test with working state - should publish artifact update and completed status - mock_aggregator.task_state = TaskState.working - mock_aggregator.task_status_message = test_message - mock_aggregator_class.return_value = mock_aggregator - - # Execute - await self.executor._handle_request( - self.mock_context, self.mock_event_queue - ) - - # Verify artifact update event was published - artifact_events = [ - call[0][0] - for call in self.mock_event_queue.enqueue_event.call_args_list - if hasattr(call[0][0], "artifact") - and call[0][0].last_chunk == True - ] - assert len(artifact_events) == 1 - artifact_event = artifact_events[0] - assert artifact_event.task_id == "test-task-id" - assert artifact_event.context_id == "test-context-id" - # Check that artifact parts correspond to message parts - assert len(artifact_event.artifact.parts) == len(test_message.parts) - assert artifact_event.artifact.parts == test_message.parts - - # Verify final status event was published with completed state - final_events = [ - call[0][0] - for call in self.mock_event_queue.enqueue_event.call_args_list - if hasattr(call[0][0], "final") and call[0][0].final == True - ] - assert len(final_events) >= 1 - final_event = final_events[-1] # Get the last final event - assert final_event.status.state == TaskState.completed - assert final_event.task_id == "test-task-id" - assert final_event.context_id == "test-context-id" + # Verify artifact update event was published + artifact_events = [ + call[0][0] + for call in self.mock_event_queue.enqueue_event.call_args_list + if hasattr(call[0][0], "artifact") and call[0][0].last_chunk == True + ] + assert len(artifact_events) == 1 + artifact_event = artifact_events[0] + assert artifact_event.task_id == "test-task-id" + assert artifact_event.context_id == "test-context-id" + # Check that artifact parts correspond to message parts + assert len(artifact_event.artifact.parts) == len(test_message.parts) + assert artifact_event.artifact.parts == test_message.parts + + # Verify final status event was published with completed state + final_events = [ + call[0][0] + for call in self.mock_event_queue.enqueue_event.call_args_list + if hasattr(call[0][0], "final") and call[0][0].final == True + ] + assert len(final_events) >= 1 + final_event = final_events[-1] # Get the last final event + assert final_event.status.state == TaskState.completed + assert final_event.task_id == "test-task-id" + assert final_event.context_id == "test-context-id" @pytest.mark.asyncio async def test_handle_request_with_non_working_state_publishes_status_only( @@ -946,76 +910,69 @@ async def test_handle_request_with_non_working_state_publishes_status_only( test_message.parts = [Part(root=TextPart(text="test content"))] # Setup detailed mocks + self.mock_request_converter.return_value = AgentRunRequest( + user_id="test-user", + session_id="test-session", + new_message=Mock(spec=Content), + run_config=Mock(spec=RunConfig), + ) + + # Mock session service + mock_session = Mock() + mock_session.id = "test-session" + self.mock_runner.session_service.get_session = AsyncMock( + return_value=mock_session + ) + + # Mock invocation context + mock_invocation_context = Mock() + self.mock_runner._new_invocation_context.return_value = ( + mock_invocation_context + ) + + # Mock agent run with multiple events using proper async generator + mock_events = [Mock(spec=Event), Mock(spec=Event)] + + # Configure run_async to return the async generator when awaited + async def mock_run_async(**kwargs): + async for item in self._create_async_generator(mock_events): + yield item + + self.mock_runner.run_async = mock_run_async + + self.mock_event_converter.return_value = [Mock()] + with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_a2a_request_to_adk_run_args" - ) as mock_convert: - mock_convert.return_value = { - "user_id": "test-user", - "session_id": "test-session", - "new_message": Mock(), - "run_config": Mock(), - } - - # Mock session service - mock_session = Mock() - mock_session.id = "test-session" - self.mock_runner.session_service.get_session = AsyncMock( - return_value=mock_session + "google.adk.a2a.executor.a2a_agent_executor.TaskResultAggregator" + ) as mock_aggregator_class: + mock_aggregator = Mock() + # Test with auth_required state - should publish only status event + mock_aggregator.task_state = TaskState.auth_required + mock_aggregator.task_status_message = test_message + mock_aggregator_class.return_value = mock_aggregator + + # Execute + await self.executor._handle_request( + self.mock_context, self.mock_event_queue ) - # Mock invocation context - mock_invocation_context = Mock() - self.mock_runner._new_invocation_context.return_value = ( - mock_invocation_context - ) + # Verify no artifact update event was published + artifact_events = [ + call[0][0] + for call in self.mock_event_queue.enqueue_event.call_args_list + if hasattr(call[0][0], "artifact") and call[0][0].last_chunk == True + ] + assert len(artifact_events) == 0 - # Mock agent run with multiple events using proper async generator - mock_events = [Mock(spec=Event), Mock(spec=Event)] - - # Configure run_async to return the async generator when awaited - async def mock_run_async(**kwargs): - async for item in self._create_async_generator(mock_events): - yield item - - self.mock_runner.run_async = mock_run_async - - with patch( - "google.adk.a2a.executor.a2a_agent_executor.convert_event_to_a2a_events" - ) as mock_convert_events: - mock_convert_events.return_value = [Mock()] - - with patch( - "google.adk.a2a.executor.a2a_agent_executor.TaskResultAggregator" - ) as mock_aggregator_class: - mock_aggregator = Mock() - # Test with auth_required state - should publish only status event - mock_aggregator.task_state = TaskState.auth_required - mock_aggregator.task_status_message = test_message - mock_aggregator_class.return_value = mock_aggregator - - # Execute - await self.executor._handle_request( - self.mock_context, self.mock_event_queue - ) - - # Verify no artifact update event was published - artifact_events = [ - call[0][0] - for call in self.mock_event_queue.enqueue_event.call_args_list - if hasattr(call[0][0], "artifact") - and call[0][0].last_chunk == True - ] - assert len(artifact_events) == 0 - - # Verify final status event was published with the actual state and message - final_events = [ - call[0][0] - for call in self.mock_event_queue.enqueue_event.call_args_list - if hasattr(call[0][0], "final") and call[0][0].final == True - ] - assert len(final_events) >= 1 - final_event = final_events[-1] # Get the last final event - assert final_event.status.state == TaskState.auth_required - assert final_event.status.message == test_message - assert final_event.task_id == "test-task-id" - assert final_event.context_id == "test-context-id" + # Verify final status event was published with the actual state and message + final_events = [ + call[0][0] + for call in self.mock_event_queue.enqueue_event.call_args_list + if hasattr(call[0][0], "final") and call[0][0].final == True + ] + assert len(final_events) >= 1 + final_event = final_events[-1] # Get the last final event + assert final_event.status.state == TaskState.auth_required + assert final_event.status.message == test_message + assert final_event.task_id == "test-task-id" + assert final_event.context_id == "test-context-id" diff --git a/tests/unittests/a2a/logs/test_log_utils.py b/tests/unittests/a2a/logs/test_log_utils.py index 13019ab749..d4c0128c41 100644 --- a/tests/unittests/a2a/logs/test_log_utils.py +++ b/tests/unittests/a2a/logs/test_log_utils.py @@ -138,34 +138,20 @@ def test_other_part_type(self): class TestBuildA2ARequestLog: """Test suite for build_a2a_request_log function.""" - def test_request_with_parts_and_config(self): - """Test request logging with message parts and configuration.""" + def test_request_with_parts(self): + """Test request logging of message parts.""" # Create mock request with all components - req = SendMessageRequest( - id="req-123", - method="message/send", - jsonrpc="2.0", - params=MessageSendParams( - message=A2AMessage( - message_id="msg-456", - role="user", - task_id="task-789", - context_id="ctx-101", - parts=[ - A2APart(root=A2ATextPart(text="Part 1")), - A2APart(root=A2ATextPart(text="Part 2")), - ], - metadata={"msg_key": "msg_value"}, - ), - configuration=MessageSendConfiguration( - accepted_output_modes=["text", "image"], - blocking=True, - history_length=10, - push_notification_config=None, - ), - metadata={"key1": "value1"}, - ), + req = A2AMessage( + message_id="msg-456", + role="user", + task_id="task-789", + context_id="ctx-101", + parts=[ + A2APart(root=A2ATextPart(text="Part 1")), + A2APart(root=A2ATextPart(text="Part 2")), + ], + metadata={"msg_key": "msg_value"}, ) with patch( @@ -176,61 +162,40 @@ def test_request_with_parts_and_config(self): result = build_a2a_request_log(req) # Verify all components are present - assert "req-123" in result - assert "message/send" in result - assert "2.0" in result assert "msg-456" in result assert "user" in result assert "task-789" in result assert "ctx-101" in result assert "Part 0:" in result assert "Part 1:" in result - assert '"blocking": true' in result - assert '"history_length": 10' in result - assert '"key1": "value1"' in result def test_request_without_parts(self): """Test request logging without message parts.""" req = Mock() - req.id = "req-123" - req.method = "message/send" - req.jsonrpc = "2.0" - - req.params.message.message_id = "msg-456" - req.params.message.role = "user" - req.params.message.task_id = "task-789" - req.params.message.context_id = "ctx-101" - req.params.message.parts = None # No parts - req.params.message.metadata = None # No message metadata - req.params.configuration = None # No configuration - req.params.metadata = None # No metadata + req.message_id = "msg-456" + req.role = "user" + req.task_id = "task-789" + req.context_id = "ctx-101" + req.parts = None # No parts + req.metadata = None # No message metadata result = build_a2a_request_log(req) assert "No parts" in result - assert "Configuration:\nNone" in result - # When metadata is None, it's not included in the output - assert "Metadata:" not in result def test_request_with_empty_parts_list(self): """Test request logging with empty parts list.""" req = Mock() - req.id = "req-123" - req.method = "sendMessage" - req.jsonrpc = "2.0" - req.params.message.message_id = "msg-456" - req.params.message.role = "user" - req.params.message.task_id = "task-789" - req.params.message.context_id = "ctx-101" - req.params.message.parts = [] # Empty parts list - req.params.message.metadata = None # No message metadata - - req.params.configuration = None - req.params.metadata = None + req.message_id = "msg-456" + req.role = "user" + req.task_id = "task-789" + req.context_id = "ctx-101" + req.parts = [] # Empty parts list + req.metadata = None # No message metadata result = build_a2a_request_log(req) @@ -240,61 +205,19 @@ def test_request_with_empty_parts_list(self): class TestBuildA2AResponseLog: """Test suite for build_a2a_response_log function.""" - def test_error_response(self): - """Test error response logging.""" - - resp = Mock() - resp.root.error.code = 500 - resp.root.error.message = "Internal Server Error" - resp.root.error.data = {"details": "Something went wrong"} - resp.root.id = "resp-error" - resp.root.jsonrpc = "2.0" - - result = build_a2a_response_log(resp) - - assert "Type: ERROR" in result - assert "Error Code: 500" in result - assert "Internal Server Error" in result - assert '"details": "Something went wrong"' in result - assert "resp-error" in result - assert "2.0" in result - - def test_error_response_no_data(self): - """Test error response logging without error data.""" - - resp = Mock() - resp.root.error.code = 404 - resp.root.error.message = "Not Found" - resp.root.error.data = None - resp.root.id = "resp-404" - resp.root.jsonrpc = "2.0" - - result = build_a2a_response_log(resp) - - assert "Type: ERROR" in result - assert "Error Code: 404" in result - assert "Not Found" in result - assert "Error Data: None" in result - - def test_success_response_with_task(self): + def test_success_response_with_client_event(self): """Test success response logging with Task result.""" # Use module-level imported types consistently task_status = TaskStatus(state=TaskState.working) task = A2ATask(id="task-123", context_id="ctx-456", status=task_status) - resp = Mock() - resp.root.result = task - resp.root.id = "resp-789" - resp.root.jsonrpc = "2.0" - - # Remove error attribute to ensure success path - delattr(resp.root, "error") + resp = (task, None) result = build_a2a_response_log(resp) assert "Type: SUCCESS" in result - assert "Result Type: Task" in result + assert "Result Type: ClientEvent" in result assert "Task ID: task-123" in result assert "Context ID: ctx-456" in result # Handle both structured format and JSON fallback due to potential isinstance failures @@ -327,13 +250,7 @@ def test_success_response_with_task_and_status_message(self): artifacts=None, ) - resp = Mock() - resp.root.result = task - resp.root.id = "resp-789" - resp.root.jsonrpc = "2.0" - - # Remove error attribute to ensure success path - delattr(resp.root, "error") + resp = (task, None) result = build_a2a_response_log(resp) @@ -359,13 +276,7 @@ def test_success_response_with_message(self): parts=[A2APart(root=A2ATextPart(text="Message part 1"))], ) - resp = Mock() - resp.root.result = message - resp.root.id = "resp-101" - resp.root.jsonrpc = "2.0" - - # Remove error attribute to ensure success path - delattr(resp.root, "error") + resp = message result = build_a2a_response_log(resp) @@ -395,13 +306,7 @@ def test_success_response_with_message_no_parts(self): message.parts = None # No parts message.model_dump_json.return_value = '{"message": "empty"}' - resp = Mock() - resp.root.result = message - resp.root.id = "resp-empty" - resp.root.jsonrpc = "2.0" - - # Remove error attribute to ensure success path - delattr(resp.root, "error") + resp = message result = build_a2a_response_log(resp) @@ -415,13 +320,7 @@ def test_success_response_with_other_result_type(self): other_result.__class__.__name__ = "OtherResult" other_result.model_dump_json.return_value = '{"other": "data"}' - resp = Mock() - resp.root.result = other_result - resp.root.id = "resp-other" - resp.root.jsonrpc = "2.0" - - # Remove error attribute to ensure success path - delattr(resp.root, "error") + resp = other_result result = build_a2a_response_log(resp) @@ -438,13 +337,7 @@ def test_success_response_without_model_dump_json(self): # Don't add model_dump_json method del other_result.model_dump_json - resp = Mock() - resp.root.result = other_result - resp.root.id = "resp-simple" - resp.root.jsonrpc = "2.0" - - # Remove error attribute to ensure success path - delattr(resp.root, "error") + resp = other_result result = build_a2a_response_log(resp) @@ -473,19 +366,13 @@ def test_build_a2a_request_log_with_message_metadata(self): """Test request logging with message metadata.""" req = Mock() - req.id = "req-with-metadata" - req.method = "sendMessage" - req.jsonrpc = "2.0" - - req.params.message.message_id = "msg-with-metadata" - req.params.message.role = "user" - req.params.message.task_id = "task-metadata" - req.params.message.context_id = "ctx-metadata" - req.params.message.parts = [] - req.params.message.metadata = {"msg_type": "test", "priority": "high"} - - req.params.configuration = None - req.params.metadata = None + + req.message_id = "msg-with-metadata" + req.role = "user" + req.task_id = "task-metadata" + req.context_id = "ctx-metadata" + req.parts = [] + req.metadata = {"msg_type": "test", "priority": "high"} result = build_a2a_request_log(req) diff --git a/tests/unittests/a2a/utils/test_agent_card_builder.py b/tests/unittests/a2a/utils/test_agent_card_builder.py index 64414730db..e0b62468e5 100644 --- a/tests/unittests/a2a/utils/test_agent_card_builder.py +++ b/tests/unittests/a2a/utils/test_agent_card_builder.py @@ -331,7 +331,7 @@ def test_replace_pronouns_basic(self): assert result == "I should do my work and it will be mine." def test_replace_pronouns_case_insensitive(self): - """Test _replace_pronouns with case insensitive matching.""" + """Test _replace_pronouns with case-insensitive matching.""" # Arrange text = "YOU should do YOUR work and it will be YOURS." @@ -1073,7 +1073,7 @@ def test_extract_examples_from_instruction_with_different_patterns(self): assert result is None def test_extract_examples_from_instruction_case_insensitive(self): - """Test _extract_examples_from_instruction with case insensitive matching.""" + """Test _extract_examples_from_instruction with case-insensitive matching.""" # Arrange instruction = ( 'example query: "What is the weather?" example response: "The weather' diff --git a/tests/unittests/a2a/utils/test_agent_to_a2a.py b/tests/unittests/a2a/utils/test_agent_to_a2a.py index 1106bf9673..ee80b0233b 100644 --- a/tests/unittests/a2a/utils/test_agent_to_a2a.py +++ b/tests/unittests/a2a/utils/test_agent_to_a2a.py @@ -103,6 +103,51 @@ def test_to_a2a_default_parameters( "startup", mock_app.add_event_handler.call_args[0][1] ) + @patch("google.adk.a2a.utils.agent_to_a2a.A2aAgentExecutor") + @patch("google.adk.a2a.utils.agent_to_a2a.DefaultRequestHandler") + @patch("google.adk.a2a.utils.agent_to_a2a.InMemoryTaskStore") + @patch("google.adk.a2a.utils.agent_to_a2a.AgentCardBuilder") + @patch("google.adk.a2a.utils.agent_to_a2a.Starlette") + def test_to_a2a_with_custom_runner( + self, + mock_starlette_class, + mock_card_builder_class, + mock_task_store_class, + mock_request_handler_class, + mock_agent_executor_class, + ): + """Test to_a2a with a custom runner.""" + # Arrange + mock_app = Mock(spec=Starlette) + mock_starlette_class.return_value = mock_app + mock_task_store = Mock(spec=InMemoryTaskStore) + mock_task_store_class.return_value = mock_task_store + mock_agent_executor = Mock(spec=A2aAgentExecutor) + mock_agent_executor_class.return_value = mock_agent_executor + mock_request_handler = Mock(spec=DefaultRequestHandler) + mock_request_handler_class.return_value = mock_request_handler + mock_card_builder = Mock(spec=AgentCardBuilder) + mock_card_builder_class.return_value = mock_card_builder + custom_runner = Mock(spec=Runner) + + # Act + result = to_a2a(self.mock_agent, runner=custom_runner) + + # Assert + assert result == mock_app + mock_starlette_class.assert_called_once() + mock_task_store_class.assert_called_once() + mock_agent_executor_class.assert_called_once_with(runner=custom_runner) + mock_request_handler_class.assert_called_once_with( + agent_executor=mock_agent_executor, task_store=mock_task_store + ) + mock_card_builder_class.assert_called_once_with( + agent=self.mock_agent, rpc_url="http://localhost:8000/" + ) + mock_app.add_event_handler.assert_called_once_with( + "startup", mock_app.add_event_handler.call_args[0][1] + ) + @patch("google.adk.a2a.utils.agent_to_a2a.A2aAgentExecutor") @patch("google.adk.a2a.utils.agent_to_a2a.DefaultRequestHandler") @patch("google.adk.a2a.utils.agent_to_a2a.InMemoryTaskStore") diff --git a/tests/unittests/agents/test_agent_clone.py b/tests/unittests/agents/test_agent_clone.py index 3091454b39..0a3d0a65f4 100644 --- a/tests/unittests/agents/test_agent_clone.py +++ b/tests/unittests/agents/test_agent_clone.py @@ -274,7 +274,7 @@ def test_clone_invalid_field(): """Test that cloning with invalid fields raises an error.""" original = LlmAgent(name="test_agent", description="Test agent") - with pytest.raises(ValueError, match="Cannot update non-existent fields"): + with pytest.raises(ValueError, match="Cannot update nonexistent fields"): original.clone(update={"invalid_field": "value"}) diff --git a/tests/unittests/agents/test_base_agent.py b/tests/unittests/agents/test_base_agent.py index e0ea5940b2..663179f670 100644 --- a/tests/unittests/agents/test_base_agent.py +++ b/tests/unittests/agents/test_base_agent.py @@ -23,8 +23,10 @@ from unittest import mock from google.adk.agents.base_agent import BaseAgent +from google.adk.agents.base_agent import BaseAgentState from google.adk.agents.callback_context import CallbackContext from google.adk.agents.invocation_context import InvocationContext +from google.adk.apps.app import ResumabilityConfig from google.adk.events.event import Event from google.adk.plugins.base_plugin import BasePlugin from google.adk.plugins.plugin_manager import PluginManager @@ -854,3 +856,106 @@ def test_set_parent_agent_for_sub_agent_twice( if __name__ == '__main__': pytest.main([__file__]) + + +class _TestAgentState(BaseAgentState): + test_field: str = '' + + +@pytest.mark.asyncio +async def test_load_agent_state_not_resumable(): + agent = BaseAgent(name='test_agent') + session_service = InMemorySessionService() + session = await session_service.create_session( + app_name='test_app', user_id='test_user' + ) + ctx = InvocationContext( + invocation_id='test_invocation', + agent=agent, + session=session, + session_service=session_service, + ) + + # Test case 1: resumability_config is None + state = agent._load_agent_state(ctx, _TestAgentState) + assert state is None + + # Test case 2: is_resumable is False + ctx.resumability_config = ResumabilityConfig(is_resumable=False) + state = agent._load_agent_state(ctx, _TestAgentState) + assert state is None + + +@pytest.mark.asyncio +async def test_load_agent_state_with_resume(): + agent = BaseAgent(name='test_agent') + session_service = InMemorySessionService() + session = await session_service.create_session( + app_name='test_app', user_id='test_user' + ) + ctx = InvocationContext( + invocation_id='test_invocation', + agent=agent, + session=session, + session_service=session_service, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + + # Test case 1: agent state not in context + state = agent._load_agent_state(ctx, _TestAgentState) + assert state is None + + # Test case 2: agent state in context + persisted_state = _TestAgentState(test_field='resumed') + ctx.agent_states[agent.name] = persisted_state.model_dump(mode='json') + + state = agent._load_agent_state(ctx, _TestAgentState) + assert state == persisted_state + + +@pytest.mark.asyncio +async def test_create_agent_state_event(): + agent = BaseAgent(name='test_agent') + session_service = InMemorySessionService() + session = await session_service.create_session( + app_name='test_app', user_id='test_user' + ) + ctx = InvocationContext( + invocation_id='test_invocation', + agent=agent, + session=session, + session_service=session_service, + ) + + ctx.branch = 'test_branch' + + # Test case 1: set agent state in context + state = _TestAgentState(test_field='checkpoint') + ctx.set_agent_state(agent.name, agent_state=state) + event = agent._create_agent_state_event(ctx) + assert event is not None + assert event.invocation_id == ctx.invocation_id + assert event.author == agent.name + assert event.branch == 'test_branch' + assert event.actions is not None + assert event.actions.agent_state is not None + assert event.actions.agent_state == state.model_dump(mode='json') + assert not event.actions.end_of_agent + + # Test case 2: set end_of_agent in context + ctx.set_agent_state(agent.name, end_of_agent=True) + event = agent._create_agent_state_event(ctx) + assert event is not None + assert event.invocation_id == ctx.invocation_id + assert event.author == agent.name + assert event.branch == 'test_branch' + assert event.actions is not None + assert event.actions.end_of_agent + assert event.actions.agent_state is None + + # Test case 3: reset agent state and end_of_agent in context + ctx.set_agent_state(agent.name) + event = agent._create_agent_state_event(ctx) + assert event is not None + assert event.actions.agent_state is None + assert not event.actions.end_of_agent diff --git a/tests/unittests/agents/test_context_cache_config.py b/tests/unittests/agents/test_context_cache_config.py new file mode 100644 index 0000000000..c9e4a6f883 --- /dev/null +++ b/tests/unittests/agents/test_context_cache_config.py @@ -0,0 +1,178 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for ContextCacheConfig.""" + +from google.adk.agents.context_cache_config import ContextCacheConfig +from pydantic import ValidationError +import pytest + + +class TestContextCacheConfig: + """Test suite for ContextCacheConfig.""" + + def test_default_values(self): + """Test that default values are set correctly.""" + config = ContextCacheConfig() + + assert config.cache_intervals == 10 + assert config.ttl_seconds == 1800 # 30 minutes + assert config.min_tokens == 0 + + def test_custom_values(self): + """Test creating config with custom values.""" + config = ContextCacheConfig( + cache_intervals=15, ttl_seconds=3600, min_tokens=1024 + ) + + assert config.cache_intervals == 15 + assert config.ttl_seconds == 3600 + assert config.min_tokens == 1024 + + def test_cache_intervals_validation(self): + """Test cache_intervals validation constraints.""" + # Valid range + config = ContextCacheConfig(cache_intervals=1) + assert config.cache_intervals == 1 + + config = ContextCacheConfig(cache_intervals=100) + assert config.cache_intervals == 100 + + # Invalid: too low + with pytest.raises(ValidationError) as exc_info: + ContextCacheConfig(cache_intervals=0) + assert "greater than or equal to 1" in str(exc_info.value) + + # Invalid: too high + with pytest.raises(ValidationError) as exc_info: + ContextCacheConfig(cache_intervals=101) + assert "less than or equal to 100" in str(exc_info.value) + + def test_ttl_seconds_validation(self): + """Test ttl_seconds validation constraints.""" + # Valid range + config = ContextCacheConfig(ttl_seconds=1) + assert config.ttl_seconds == 1 + + config = ContextCacheConfig(ttl_seconds=86400) # 24 hours + assert config.ttl_seconds == 86400 + + # Invalid: zero or negative + with pytest.raises(ValidationError) as exc_info: + ContextCacheConfig(ttl_seconds=0) + assert "greater than 0" in str(exc_info.value) + + with pytest.raises(ValidationError) as exc_info: + ContextCacheConfig(ttl_seconds=-1) + assert "greater than 0" in str(exc_info.value) + + def test_min_tokens_validation(self): + """Test min_tokens validation constraints.""" + # Valid values + config = ContextCacheConfig(min_tokens=0) + assert config.min_tokens == 0 + + config = ContextCacheConfig(min_tokens=1024) + assert config.min_tokens == 1024 + + # Invalid: negative + with pytest.raises(ValidationError) as exc_info: + ContextCacheConfig(min_tokens=-1) + assert "greater than or equal to 0" in str(exc_info.value) + + def test_ttl_string_property(self): + """Test ttl_string property returns correct format.""" + config = ContextCacheConfig(ttl_seconds=1800) + assert config.ttl_string == "1800s" + + config = ContextCacheConfig(ttl_seconds=3600) + assert config.ttl_string == "3600s" + + def test_str_representation(self): + """Test string representation for logging.""" + config = ContextCacheConfig( + cache_intervals=15, ttl_seconds=3600, min_tokens=1024 + ) + + expected = ( + "ContextCacheConfig(cache_intervals=15, ttl=3600s, min_tokens=1024)" + ) + assert str(config) == expected + + def test_str_representation_defaults(self): + """Test string representation with default values.""" + config = ContextCacheConfig() + + expected = "ContextCacheConfig(cache_intervals=10, ttl=1800s, min_tokens=0)" + assert str(config) == expected + + def test_pydantic_model_validation(self): + """Test that Pydantic model validation works correctly.""" + # Test extra fields are forbidden + with pytest.raises(ValidationError) as exc_info: + ContextCacheConfig(cache_intervals=10, extra_field="not_allowed") + assert "extra" in str(exc_info.value).lower() + + def test_field_descriptions(self): + """Test that fields have proper descriptions.""" + config = ContextCacheConfig() + schema = config.model_json_schema() + + assert "cache_intervals" in schema["properties"] + assert ( + "Maximum number of invocations" + in schema["properties"]["cache_intervals"]["description"] + ) + + assert "ttl_seconds" in schema["properties"] + assert ( + "Time-to-live for cache" + in schema["properties"]["ttl_seconds"]["description"] + ) + + assert "min_tokens" in schema["properties"] + assert ( + "Minimum estimated request tokens" + in schema["properties"]["min_tokens"]["description"] + ) + + def test_immutability_config(self): + """Test that the model config is set correctly.""" + config = ContextCacheConfig() + assert config.model_config["extra"] == "forbid" + + def test_realistic_scenarios(self): + """Test realistic configuration scenarios.""" + # Quick caching for development + dev_config = ContextCacheConfig( + cache_intervals=5, ttl_seconds=600, min_tokens=0 # 10 minutes + ) + assert dev_config.cache_intervals == 5 + assert dev_config.ttl_seconds == 600 + + # Production caching + prod_config = ContextCacheConfig( + cache_intervals=20, ttl_seconds=7200, min_tokens=2048 # 2 hours + ) + assert prod_config.cache_intervals == 20 + assert prod_config.ttl_seconds == 7200 + assert prod_config.min_tokens == 2048 + + # Conservative caching + conservative_config = ContextCacheConfig( + cache_intervals=3, ttl_seconds=300, min_tokens=4096 # 5 minutes + ) + assert conservative_config.cache_intervals == 3 + assert conservative_config.ttl_seconds == 300 + assert conservative_config.min_tokens == 4096 diff --git a/tests/unittests/agents/test_gemini_context_cache_manager.py b/tests/unittests/agents/test_gemini_context_cache_manager.py new file mode 100644 index 0000000000..0443843ae1 --- /dev/null +++ b/tests/unittests/agents/test_gemini_context_cache_manager.py @@ -0,0 +1,629 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for GeminiContextCacheManager.""" + +import time +from unittest.mock import AsyncMock +from unittest.mock import MagicMock +from unittest.mock import patch + +from google.adk.agents.context_cache_config import ContextCacheConfig +from google.adk.models.cache_metadata import CacheMetadata +from google.adk.models.gemini_context_cache_manager import GeminiContextCacheManager +from google.adk.models.llm_request import LlmRequest +from google.adk.models.llm_response import LlmResponse +from google.genai import Client +from google.genai import types +import pytest + + +class TestGeminiContextCacheManager: + """Test suite for GeminiContextCacheManager.""" + + def setup_method(self): + """Set up test fixtures.""" + mock_client = AsyncMock(spec=Client) + self.manager = GeminiContextCacheManager(mock_client) + self.cache_config = ContextCacheConfig( + cache_intervals=10, + ttl_seconds=1800, + min_tokens=0, # Allow caching for tests + ) + + def create_llm_request(self, cache_metadata=None, contents_count=3): + """Helper to create test LlmRequest.""" + contents = [] + for i in range(contents_count): + contents.append( + types.Content( + role="user", parts=[types.Part(text=f"Test message {i}")] + ) + ) + + # Create tools for testing fingerprinting + tools = [ + types.Tool( + function_declarations=[ + types.FunctionDeclaration( + name="test_tool", + description="A test tool", + parameters=types.Schema( + type=types.Type.OBJECT, + properties={ + "param": types.Schema(type=types.Type.STRING) + }, + ), + ) + ] + ) + ] + + tool_config = types.ToolConfig( + function_calling_config=types.FunctionCallingConfig(mode="AUTO") + ) + + return LlmRequest( + model="gemini-2.0-flash", + contents=contents, + config=types.GenerateContentConfig( + system_instruction="Test instruction", + tools=tools, + tool_config=tool_config, + ), + cache_config=self.cache_config, + cache_metadata=cache_metadata, + ) + + def create_cache_metadata( + self, invocations_used=0, expired=False, contents_count=3 + ): + """Helper to create test CacheMetadata.""" + current_time = time.time() + expire_time = current_time - 300 if expired else current_time + 1800 + + return CacheMetadata( + cache_name="projects/test/locations/us-central1/cachedContents/test123", + expire_time=expire_time, + fingerprint="test_fingerprint", + invocations_used=invocations_used, + contents_count=contents_count, + created_at=current_time - 600, + ) + + def test_init(self): + """Test manager initialization.""" + mock_client = MagicMock(spec=Client) + manager = GeminiContextCacheManager(mock_client) + assert manager is not None + assert manager.genai_client == mock_client + + async def test_handle_context_caching_no_existing_cache(self): + """Test handling context caching with no existing cache returns fingerprint-only metadata.""" + llm_request = self.create_llm_request(contents_count=5) + + with patch.object( + self.manager, "_generate_cache_fingerprint", return_value="test_fp" + ): + result = await self.manager.handle_context_caching(llm_request) + + assert result is not None + # Should return fingerprint-only metadata (no active cache) + assert result.cache_name is None + assert result.expire_time is None + assert result.invocations_used is None + assert result.created_at is None + assert result.fingerprint == "test_fp" + assert result.contents_count == 5 # Total contents count + + # No cache should be created + self.manager.genai_client.aio.caches.create.assert_not_called() + + async def test_handle_context_caching_valid_existing_cache(self): + """Test handling context caching with valid existing cache.""" + + # Create request with existing valid cache + existing_cache = self.create_cache_metadata(invocations_used=5) + llm_request = self.create_llm_request(cache_metadata=existing_cache) + + with patch.object(self.manager, "_is_cache_valid", return_value=True): + result = await self.manager.handle_context_caching(llm_request) + + assert result is not None + # Verify that existing cache metadata is preserved (copied) + assert result.cache_name == existing_cache.cache_name + assert ( + result.invocations_used == existing_cache.invocations_used + ) # Should preserve original invocations_used + assert ( + result.expire_time == existing_cache.expire_time + ) # Should preserve original expire_time + assert ( + result.fingerprint == existing_cache.fingerprint + ) # Should preserve original fingerprint + assert ( + result.created_at == existing_cache.created_at + ) # Should preserve original created_at + + # Verify it's a copy, not the same object + assert result is not existing_cache + + # Should not create new cache + self.manager.genai_client.aio.caches.create.assert_not_called() + + async def test_handle_context_caching_invalid_cache_fingerprint_match(self): + """Test invalid cache with matching fingerprint creates new cache.""" + # Setup mocks + mock_cached_content = AsyncMock() + mock_cached_content.name = ( + "projects/test/locations/us-central1/cachedContents/new456" + ) + self.manager.genai_client.aio.caches.create = AsyncMock( + return_value=mock_cached_content + ) + + # Create request with invalid existing cache + existing_cache = self.create_cache_metadata( + invocations_used=15 + ) # Exceeds cache_intervals + llm_request = self.create_llm_request(cache_metadata=existing_cache) + llm_request.cacheable_contents_token_count = ( + 2048 # Add token count for cache creation + ) + + with ( + patch.object(self.manager, "_is_cache_valid", return_value=False), + patch.object(self.manager, "cleanup_cache") as mock_cleanup, + patch.object( + self.manager, + "_generate_cache_fingerprint", + return_value="test_fingerprint", # Match old fingerprint + ), + ): + + result = await self.manager.handle_context_caching(llm_request) + + assert result is not None + # Should create new cache when fingerprints match + assert ( + result.cache_name + == "projects/test/locations/us-central1/cachedContents/new456" + ) + mock_cleanup.assert_called_once_with(existing_cache.cache_name) + self.manager.genai_client.aio.caches.create.assert_called_once() + + async def test_handle_context_caching_invalid_cache_fingerprint_mismatch( + self, + ): + """Test invalid cache with mismatched fingerprint returns fingerprint-only metadata.""" + # Create request with invalid existing cache + existing_cache = self.create_cache_metadata( + invocations_used=15, contents_count=3 + ) # Exceeds cache_intervals + llm_request = self.create_llm_request( + cache_metadata=existing_cache, contents_count=5 + ) + + with ( + patch.object(self.manager, "_is_cache_valid", return_value=False), + patch.object(self.manager, "cleanup_cache") as mock_cleanup, + patch.object( + self.manager, + "_generate_cache_fingerprint", + side_effect=["old_fp", "new_fp"], # Different fingerprints + ), + ): + + result = await self.manager.handle_context_caching(llm_request) + + assert result is not None + # Should return fingerprint-only metadata + assert result.cache_name is None + assert result.expire_time is None + assert result.invocations_used is None + assert result.created_at is None + assert result.fingerprint == "new_fp" + assert result.contents_count == 5 # Total contents count + mock_cleanup.assert_called_once_with(existing_cache.cache_name) + self.manager.genai_client.aio.caches.create.assert_not_called() + + async def test_is_cache_valid_fingerprint_mismatch(self): + """Test cache validation with fingerprint mismatch.""" + cache_metadata = self.create_cache_metadata() + llm_request = self.create_llm_request(cache_metadata=cache_metadata) + + with patch.object( + self.manager, + "_generate_cache_fingerprint", + return_value="different_fingerprint", + ): + result = await self.manager._is_cache_valid(llm_request) + + assert result is False + + async def test_is_cache_valid_expired_cache(self): + """Test cache validation with expired cache.""" + cache_metadata = self.create_cache_metadata(expired=True) + llm_request = self.create_llm_request(cache_metadata=cache_metadata) + + with patch.object( + self.manager, + "_generate_cache_fingerprint", + return_value="test_fingerprint", + ): + result = await self.manager._is_cache_valid(llm_request) + + assert result is False + + async def test_is_cache_valid_fingerprint_only_metadata(self): + """Test cache validation with fingerprint-only metadata (no active cache).""" + # Create fingerprint-only metadata (cache_name is None) + cache_metadata = CacheMetadata( + fingerprint="test_fingerprint", + contents_count=5, + ) + llm_request = self.create_llm_request(cache_metadata=cache_metadata) + + result = await self.manager._is_cache_valid(llm_request) + + assert ( + result is False + ) # Fingerprint-only metadata is not a valid active cache + + async def test_is_cache_valid_cache_intervals_exceeded(self): + """Test cache validation with max invocations exceeded.""" + cache_metadata = self.create_cache_metadata( + invocations_used=15 + ) # Exceeds cache_intervals=10 + llm_request = self.create_llm_request(cache_metadata=cache_metadata) + + with patch.object( + self.manager, + "_generate_cache_fingerprint", + return_value="test_fingerprint", + ): + result = await self.manager._is_cache_valid(llm_request) + + assert result is False + + async def test_is_cache_valid_all_checks_pass(self): + """Test cache validation when all checks pass.""" + cache_metadata = self.create_cache_metadata( + invocations_used=5 + ) # Within cache_intervals=10 + llm_request = self.create_llm_request(cache_metadata=cache_metadata) + + with patch.object( + self.manager, + "_generate_cache_fingerprint", + return_value="test_fingerprint", + ): + result = await self.manager._is_cache_valid(llm_request) + + assert result is True + + async def test_cleanup_cache(self): + """Test cache cleanup functionality.""" + cache_name = "projects/test/locations/us-central1/cachedContents/test123" + + await self.manager.cleanup_cache(cache_name) + + self.manager.genai_client.aio.caches.delete.assert_called_once_with( + name=cache_name + ) + + def test_generate_cache_fingerprint(self): + """Test cache fingerprint generation includes tools and tool_config.""" + llm_request = self.create_llm_request() + cache_contents_count = 2 # Cache all but last content + + fingerprint1 = self.manager._generate_cache_fingerprint( + llm_request, cache_contents_count + ) + fingerprint2 = self.manager._generate_cache_fingerprint( + llm_request, cache_contents_count + ) + + # Same request should generate same fingerprint + assert fingerprint1 == fingerprint2 + assert isinstance(fingerprint1, str) + assert len(fingerprint1) > 0 + + # Test that tool_config and tools are included in fingerprint + # Create request without tools/tool_config + llm_request_no_tools = LlmRequest( + model="gemini-2.0-flash", + contents=[types.Content(role="user", parts=[types.Part(text="Test")])], + config=types.GenerateContentConfig( + system_instruction="Test instruction" + ), + cache_config=self.cache_config, + ) + + fingerprint_no_tools = self.manager._generate_cache_fingerprint( + llm_request_no_tools, cache_contents_count + ) + + # Should be different from request with tools + assert fingerprint1 != fingerprint_no_tools + + def test_generate_cache_fingerprint_different_requests(self): + """Test that different requests generate different fingerprints.""" + llm_request1 = self.create_llm_request() + + llm_request2 = LlmRequest( + model="gemini-2.0-flash", + contents=[ + types.Content( + role="user", parts=[types.Part(text="Different message")] + ) + ], + config=types.GenerateContentConfig( + system_instruction="Different instruction" + ), + cache_config=self.cache_config, + ) + + cache_contents_count = 2 + fingerprint1 = self.manager._generate_cache_fingerprint( + llm_request1, cache_contents_count + ) + fingerprint2 = self.manager._generate_cache_fingerprint( + llm_request2, cache_contents_count + ) + + assert fingerprint1 != fingerprint2 + + def test_generate_cache_fingerprint_tool_config_variations(self): + """Test that different tool configs generate different fingerprints.""" + # Request with AUTO mode + llm_request_auto = self.create_llm_request() + + # Request with NONE mode + tool_config_none = types.ToolConfig( + function_calling_config=types.FunctionCallingConfig(mode="NONE") + ) + + llm_request_none = LlmRequest( + model="gemini-2.0-flash", + contents=[types.Content(role="user", parts=[types.Part(text="Test")])], + config=types.GenerateContentConfig( + system_instruction="Test instruction", + tools=llm_request_auto.config.tools, + tool_config=tool_config_none, + ), + cache_config=self.cache_config, + ) + + cache_contents_count = 2 + fingerprint_auto = self.manager._generate_cache_fingerprint( + llm_request_auto, cache_contents_count + ) + fingerprint_none = self.manager._generate_cache_fingerprint( + llm_request_none, cache_contents_count + ) + + assert fingerprint_auto != fingerprint_none + + async def test_populate_cache_metadata_in_response_no_invocations_increment( + self, + ): + """Test that populate_cache_metadata_in_response doesn't increment invocations_used.""" + # Create mock response with usage metadata + usage_metadata = MagicMock() + usage_metadata.cached_content_token_count = 800 + usage_metadata.prompt_token_count = 1000 + + llm_response = MagicMock(spec=LlmResponse) + llm_response.usage_metadata = usage_metadata + + cache_metadata = self.create_cache_metadata(invocations_used=3) + + self.manager.populate_cache_metadata_in_response( + llm_response, cache_metadata + ) + + # Verify response metadata preserves the original invocations_used (no increment) + updated_metadata = llm_response.cache_metadata + assert ( + updated_metadata.invocations_used == 3 + ) # Should preserve original value + assert updated_metadata.cache_name == cache_metadata.cache_name + assert updated_metadata.fingerprint == cache_metadata.fingerprint + assert updated_metadata.expire_time == cache_metadata.expire_time + assert updated_metadata.created_at == cache_metadata.created_at + + async def test_populate_cache_metadata_no_usage_metadata(self): + """Test populating cache metadata when no usage metadata.""" + llm_response = MagicMock(spec=LlmResponse) + llm_response.usage_metadata = None + + cache_metadata = self.create_cache_metadata(invocations_used=3) + + self.manager.populate_cache_metadata_in_response( + llm_response, cache_metadata + ) + + # Should still create metadata even without usage info + updated_metadata = llm_response.cache_metadata + assert ( + updated_metadata.invocations_used == 3 + ) # Should preserve original value + assert updated_metadata.cache_name == cache_metadata.cache_name + + async def test_create_new_cache_with_proper_ttl(self): + """Test that new cache is created with proper TTL.""" + mock_cached_content = AsyncMock() + mock_cached_content.name = ( + "projects/test/locations/us-central1/cachedContents/test123" + ) + self.manager.genai_client.aio.caches.create = AsyncMock( + return_value=mock_cached_content + ) + + llm_request = self.create_llm_request() + + cache_contents_count = max(0, len(llm_request.contents) - 1) + + with patch.object( + self.manager, "_generate_cache_fingerprint", return_value="test_fp" + ): + await self.manager._create_gemini_cache(llm_request, cache_contents_count) + + # Verify cache creation call includes TTL + create_call = self.manager.genai_client.aio.caches.create.call_args + assert create_call is not None + cache_config = create_call[1]["config"] + assert cache_config.ttl == "1800s" # From cache_config + + def test_all_but_last_content_caching(self): + """Test that cache content counting works correctly.""" + # Test with multiple contents + llm_request_multi = self.create_llm_request(contents_count=5) + + # Test cache contents count calculation + cache_contents_count = max(0, len(llm_request_multi.contents) - 1) + + assert cache_contents_count == 4 # 5 contents, so cache 4 contents + + # Test with single content + llm_request_single = self.create_llm_request(contents_count=1) + single_cache_contents_count = max(0, len(llm_request_single.contents) - 1) + + assert single_cache_contents_count == 0 # Single content, cache 0 contents + + def test_edge_cases(self): + """Test various edge cases.""" + # Test with None cache_config + llm_request_no_config = LlmRequest( + model="gemini-2.0-flash", + contents=[types.Content(role="user", parts=[types.Part(text="Test")])], + config=types.GenerateContentConfig(system_instruction="Test"), + cache_config=None, + ) + + # Should handle gracefully + cache_contents_count = 2 + fingerprint = self.manager._generate_cache_fingerprint( + llm_request_no_config, cache_contents_count + ) + assert isinstance(fingerprint, str) + + # Test with empty contents + llm_request_empty = LlmRequest( + model="gemini-2.0-flash", + contents=[], + config=types.GenerateContentConfig(system_instruction="Test"), + cache_config=self.cache_config, + ) + + empty_cache_contents_count = 0 + fingerprint = self.manager._generate_cache_fingerprint( + llm_request_empty, empty_cache_contents_count + ) + assert isinstance(fingerprint, str) + + def test_parameter_types_enforcement(self): + """Test that method calls with correct parameter types work properly.""" + # Create proper objects + usage_metadata = MagicMock() + usage_metadata.cached_content_token_count = 500 + usage_metadata.prompt_token_count = 1000 + + llm_response = MagicMock(spec=LlmResponse) + llm_response.usage_metadata = usage_metadata + + cache_metadata = self.create_cache_metadata(invocations_used=3) + + # This should work fine (correct types and order) + self.manager.populate_cache_metadata_in_response( + llm_response, cache_metadata + ) + updated_metadata = llm_response.cache_metadata + assert updated_metadata.invocations_used == 3 # No increment in this method + + # Document expected types for integration tests + assert isinstance(cache_metadata, CacheMetadata) + assert hasattr( + llm_response, "usage_metadata" + ) # LlmResponse should have this + assert not hasattr( + cache_metadata, "usage_metadata" + ) # CacheMetadata should NOT have this + + def create_llm_request_with_token_count( + self, token_count=None, cache_metadata=None + ): + """Helper to create LlmRequest with cacheable_contents_token_count.""" + llm_request = self.create_llm_request(cache_metadata=cache_metadata) + llm_request.cacheable_contents_token_count = token_count + return llm_request + + async def test_cache_creation_with_sufficient_token_count(self): + """Test that fingerprint-only metadata is returned even with sufficient tokens.""" + # With new prefix matching logic, no cache is created without existing metadata + # Create request with sufficient token count + llm_request = self.create_llm_request_with_token_count(token_count=2048) + + with patch.object( + self.manager, "_generate_cache_fingerprint", return_value="test_fp" + ): + result = await self.manager.handle_context_caching(llm_request) + + # Should return fingerprint-only metadata (no cache creation) + assert result is not None + assert result.cache_name is None # Fingerprint-only state + assert result.fingerprint == "test_fp" + assert result.contents_count == 3 + self.manager.genai_client.aio.caches.create.assert_not_called() + + async def test_cache_creation_with_insufficient_token_count(self): + """Test that fingerprint-only metadata is returned even with insufficient tokens.""" + # Set higher minimum token requirement + self.manager.cache_config = ContextCacheConfig( + cache_intervals=10, + ttl_seconds=1800, + min_tokens=2048, + ) + + # Create request with insufficient token count + llm_request = self.create_llm_request_with_token_count(token_count=1024) + llm_request.cache_config = self.manager.cache_config + + with patch.object( + self.manager, "_generate_cache_fingerprint", return_value="test_fp" + ): + result = await self.manager.handle_context_caching(llm_request) + + # Should return fingerprint-only metadata + assert result is not None + assert result.cache_name is None + assert result.fingerprint == "test_fp" + self.manager.genai_client.aio.caches.create.assert_not_called() + + async def test_cache_creation_without_token_count(self): + """Test that fingerprint-only metadata is returned even without token count.""" + # Create request without token count (initial request) + llm_request = self.create_llm_request_with_token_count(token_count=None) + + with patch.object( + self.manager, "_generate_cache_fingerprint", return_value="test_fp" + ): + result = await self.manager.handle_context_caching(llm_request) + + # Should return fingerprint-only metadata + assert result is not None + assert result.cache_name is None + assert result.fingerprint == "test_fp" + self.manager.genai_client.aio.caches.create.assert_not_called() diff --git a/tests/unittests/agents/test_invocation_context.py b/tests/unittests/agents/test_invocation_context.py new file mode 100644 index 0000000000..620453e817 --- /dev/null +++ b/tests/unittests/agents/test_invocation_context.py @@ -0,0 +1,536 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from unittest.mock import Mock + +from google.adk.agents.base_agent import BaseAgent +from google.adk.agents.base_agent import BaseAgentState +from google.adk.agents.invocation_context import InvocationContext +from google.adk.apps import ResumabilityConfig +from google.adk.events.event import Event +from google.adk.events.event_actions import EventActions +from google.adk.sessions.base_session_service import BaseSessionService +from google.adk.sessions.session import Session +from google.genai.types import Content +from google.genai.types import FunctionCall +from google.genai.types import Part +import pytest + +from .. import testing_utils + + +class TestInvocationContext: + """Test suite for InvocationContext.""" + + @pytest.fixture + def mock_events(self): + """Create mock events for testing.""" + event1 = Mock(spec=Event) + event1.invocation_id = 'inv_1' + event1.branch = 'agent_1' + + event2 = Mock(spec=Event) + event2.invocation_id = 'inv_1' + event2.branch = 'agent_2' + + event3 = Mock(spec=Event) + event3.invocation_id = 'inv_2' + event3.branch = 'agent_1' + + event4 = Mock(spec=Event) + event4.invocation_id = 'inv_2' + event4.branch = 'agent_2' + + return [event1, event2, event3, event4] + + @pytest.fixture + def mock_invocation_context(self, mock_events): + """Create a mock invocation context for testing.""" + ctx = InvocationContext( + session_service=Mock(spec=BaseSessionService), + agent=Mock(spec=BaseAgent), + invocation_id='inv_1', + branch='agent_1', + session=Mock(spec=Session, events=mock_events), + ) + return ctx + + def test_get_events_returns_all_events_by_default( + self, mock_invocation_context, mock_events + ): + """Tests that get_events returns all events when no filters are applied.""" + events = mock_invocation_context._get_events() + assert events == mock_events + + def test_get_events_filters_by_current_invocation( + self, mock_invocation_context, mock_events + ): + """Tests that get_events correctly filters by the current invocation.""" + event1, event2, _, _ = mock_events + events = mock_invocation_context._get_events(current_invocation=True) + assert events == [event1, event2] + + def test_get_events_filters_by_current_branch( + self, mock_invocation_context, mock_events + ): + """Tests that get_events correctly filters by the current branch.""" + event1, _, event3, _ = mock_events + events = mock_invocation_context._get_events(current_branch=True) + assert events == [event1, event3] + + def test_get_events_filters_by_invocation_and_branch( + self, mock_invocation_context, mock_events + ): + """Tests that get_events filters by invocation and branch.""" + event1, _, _, _ = mock_events + events = mock_invocation_context._get_events( + current_invocation=True, + current_branch=True, + ) + assert events == [event1] + + def test_get_events_with_no_events_in_session(self, mock_invocation_context): + """Tests get_events when the session has no events.""" + mock_invocation_context.session.events = [] + events = mock_invocation_context._get_events() + assert not events + + def test_get_events_with_no_matching_events(self, mock_invocation_context): + """Tests get_events when no events match the filters.""" + mock_invocation_context.invocation_id = 'inv_3' + mock_invocation_context.branch = 'branch_C' + + # Filter by invocation + events = mock_invocation_context._get_events(current_invocation=True) + assert not events + + # Filter by branch + events = mock_invocation_context._get_events(current_branch=True) + assert not events + + # Filter by both + events = mock_invocation_context._get_events( + current_invocation=True, + current_branch=True, + ) + assert not events + + +class TestInvocationContextWithAppResumablity: + """Test suite for InvocationContext regarding app resumability.""" + + @pytest.fixture + def long_running_function_call(self) -> FunctionCall: + """A long running function call.""" + return FunctionCall( + id='tool_call_id_1', + name='long_running_function_call', + args={}, + ) + + @pytest.fixture + def event_to_pause(self, long_running_function_call) -> Event: + """An event with a long running function call.""" + return Event( + invocation_id='inv_1', + author='agent', + content=testing_utils.ModelContent( + [Part(function_call=long_running_function_call)] + ), + long_running_tool_ids=[long_running_function_call.id], + ) + + def _create_test_invocation_context( + self, resumability_config + ) -> InvocationContext: + """Create a mock invocation context for testing.""" + ctx = InvocationContext( + session_service=Mock(spec=BaseSessionService), + agent=Mock(spec=BaseAgent), + invocation_id='inv_1', + session=Mock(spec=Session), + resumability_config=resumability_config, + ) + return ctx + + def test_should_pause_invocation_with_resumable_app(self, event_to_pause): + """Tests should_pause_invocation with a resumable app.""" + mock_invocation_context = self._create_test_invocation_context( + ResumabilityConfig(is_resumable=True) + ) + + assert mock_invocation_context.should_pause_invocation(event_to_pause) + + def test_should_not_pause_invocation_with_non_resumable_app( + self, event_to_pause + ): + """Tests should_pause_invocation with a non-resumable app.""" + invocation_context = self._create_test_invocation_context( + ResumabilityConfig(is_resumable=False) + ) + + assert not invocation_context.should_pause_invocation(event_to_pause) + + def test_should_not_pause_invocation_with_no_long_running_tool_ids( + self, event_to_pause + ): + """Tests should_pause_invocation with no long running tools.""" + invocation_context = self._create_test_invocation_context( + ResumabilityConfig(is_resumable=True) + ) + nonpausable_event = event_to_pause.model_copy( + update={'long_running_tool_ids': []} + ) + + assert not invocation_context.should_pause_invocation(nonpausable_event) + + def test_should_not_pause_invocation_with_no_function_calls( + self, event_to_pause + ): + """Tests should_pause_invocation with a non-model event.""" + mock_invocation_context = self._create_test_invocation_context( + ResumabilityConfig(is_resumable=True) + ) + nonpausable_event = event_to_pause.model_copy( + update={'content': testing_utils.UserContent('test text part')} + ) + + assert not mock_invocation_context.should_pause_invocation( + nonpausable_event + ) + + def test_is_resumable_true(self): + """Tests that is_resumable is True when resumability is enabled.""" + invocation_context = self._create_test_invocation_context( + ResumabilityConfig(is_resumable=True) + ) + assert invocation_context.is_resumable + + def test_is_resumable_false(self): + """Tests that is_resumable is False when resumability is disabled.""" + invocation_context = self._create_test_invocation_context( + ResumabilityConfig(is_resumable=False) + ) + assert not invocation_context.is_resumable + + def test_is_resumable_no_config(self): + """Tests that is_resumable is False when no resumability config is set.""" + invocation_context = self._create_test_invocation_context(None) + assert not invocation_context.is_resumable + + def test_populate_invocation_agent_states_not_resumable(self): + """Tests that populate_invocation_agent_states does nothing if not resumable.""" + invocation_context = self._create_test_invocation_context( + ResumabilityConfig(is_resumable=False) + ) + event = Event( + invocation_id='inv_1', + author='agent1', + actions=EventActions(end_of_agent=True, agent_state=None), + ) + invocation_context.session.events = [event] + invocation_context.populate_invocation_agent_states() + assert not invocation_context.agent_states + assert not invocation_context.end_of_agents + + def test_populate_invocation_agent_states_end_of_agent(self): + """Tests that populate_invocation_agent_states handles end_of_agent.""" + invocation_context = self._create_test_invocation_context( + ResumabilityConfig(is_resumable=True) + ) + event = Event( + invocation_id='inv_1', + author='agent1', + actions=EventActions(end_of_agent=True, agent_state=None), + ) + invocation_context.session.events = [event] + invocation_context.populate_invocation_agent_states() + assert not invocation_context.agent_states + assert invocation_context.end_of_agents == {'agent1': True} + + def test_populate_invocation_agent_states_with_agent_state(self): + """Tests that populate_invocation_agent_states handles agent_state.""" + invocation_context = self._create_test_invocation_context( + ResumabilityConfig(is_resumable=True) + ) + event = Event( + invocation_id='inv_1', + author='agent1', + actions=EventActions( + end_of_agent=False, + agent_state=BaseAgentState().model_dump(mode='json'), + ), + ) + invocation_context.session.events = [event] + invocation_context.populate_invocation_agent_states() + assert invocation_context.agent_states == {'agent1': {}} + assert invocation_context.end_of_agents == {'agent1': False} + + def test_populate_invocation_agent_states_with_agent_state_and_end_of_agent( + self, + ): + """Tests that populate_invocation_agent_states handles agent_state and end_of_agent.""" + invocation_context = self._create_test_invocation_context( + ResumabilityConfig(is_resumable=True) + ) + event = Event( + invocation_id='inv_1', + author='agent1', + actions=EventActions( + end_of_agent=True, + agent_state=BaseAgentState().model_dump(mode='json'), + ), + ) + invocation_context.session.events = [event] + invocation_context.populate_invocation_agent_states() + # When both agent_state and end_of_agent are set, agent_state should be + # cleared, as end_of_agent is of a higher priority. + assert not invocation_context.agent_states + assert invocation_context.end_of_agents == {'agent1': True} + + def test_populate_invocation_agent_states_with_content_no_state(self): + """Tests that populate_invocation_agent_states creates default state.""" + invocation_context = self._create_test_invocation_context( + ResumabilityConfig(is_resumable=True) + ) + event = Event( + invocation_id='inv_1', + author='agent1', + actions=EventActions(end_of_agent=False, agent_state=None), + content=Content(role='model', parts=[Part(text='hi')]), + ) + invocation_context.session.events = [event] + invocation_context.populate_invocation_agent_states() + assert invocation_context.agent_states == {'agent1': BaseAgentState()} + assert invocation_context.end_of_agents == {'agent1': False} + + def test_populate_invocation_agent_states_user_message_event(self): + """Tests that populate_invocation_agent_states ignores user message events for default state.""" + invocation_context = self._create_test_invocation_context( + ResumabilityConfig(is_resumable=True) + ) + event = Event( + invocation_id='inv_1', + author='user', + actions=EventActions(end_of_agent=False, agent_state=None), + content=Content(role='user', parts=[Part(text='hi')]), + ) + invocation_context.session.events = [event] + invocation_context.populate_invocation_agent_states() + assert not invocation_context.agent_states + assert not invocation_context.end_of_agents + + def test_populate_invocation_agent_states_no_content(self): + """Tests that populate_invocation_agent_states ignores events with no content if no state.""" + invocation_context = self._create_test_invocation_context( + ResumabilityConfig(is_resumable=True) + ) + event = Event( + invocation_id='inv_1', + author='agent1', + actions=EventActions(end_of_agent=None, agent_state=None), + content=None, + ) + invocation_context.session.events = [event] + invocation_context.populate_invocation_agent_states() + assert not invocation_context.agent_states + assert not invocation_context.end_of_agents + + def test_set_agent_state_with_end_of_agent_true(self): + """Tests that set_agent_state clears agent_state and sets end_of_agent to True.""" + invocation_context = self._create_test_invocation_context( + ResumabilityConfig(is_resumable=True) + ) + invocation_context.agent_states['agent1'] = {} + invocation_context.end_of_agents['agent1'] = False + + # Set state with end_of_agent=True, which should clear the existing + # agent_state. + invocation_context.set_agent_state('agent1', end_of_agent=True) + assert 'agent1' not in invocation_context.agent_states + assert invocation_context.end_of_agents['agent1'] + + def test_set_agent_state_with_agent_state(self): + """Tests that set_agent_state sets agent_state and sets end_of_agent to False.""" + agent_state = BaseAgentState() + invocation_context = self._create_test_invocation_context( + ResumabilityConfig(is_resumable=True) + ) + invocation_context.end_of_agents['agent1'] = True + + # Set state with agent_state=agent_state, which should set the agent_state + # and reset the end_of_agent flag to False. + invocation_context.set_agent_state('agent1', agent_state=agent_state) + assert invocation_context.agent_states['agent1'] == agent_state.model_dump( + mode='json' + ) + assert invocation_context.end_of_agents['agent1'] is False + + def test_reset_agent_state(self): + """Tests that set_agent_state clears agent_state and end_of_agent.""" + invocation_context = self._create_test_invocation_context( + ResumabilityConfig(is_resumable=True) + ) + invocation_context.agent_states['agent1'] = {} + invocation_context.end_of_agents['agent1'] = True + + # Reset state, which should clear the agent_state and end_of_agent flag. + invocation_context.set_agent_state('agent1') + assert 'agent1' not in invocation_context.agent_states + assert 'agent1' not in invocation_context.end_of_agents + + def test_reset_sub_agent_states(self): + """Tests that reset_sub_agent_states resets sub-agent states.""" + sub_sub_agent_1 = BaseAgent(name='sub_sub_agent_1') + sub_agent_1 = BaseAgent(name='sub_agent_1', sub_agents=[sub_sub_agent_1]) + sub_agent_2 = BaseAgent(name='sub_agent_2') + root_agent = BaseAgent( + name='root_agent', sub_agents=[sub_agent_1, sub_agent_2] + ) + + invocation_context = self._create_test_invocation_context( + ResumabilityConfig(is_resumable=True) + ) + invocation_context.agent = root_agent + invocation_context.set_agent_state( + 'sub_agent_1', agent_state=BaseAgentState() + ) + invocation_context.set_agent_state('sub_agent_2', end_of_agent=True) + invocation_context.set_agent_state( + 'sub_sub_agent_1', agent_state=BaseAgentState() + ) + + assert 'sub_agent_1' in invocation_context.agent_states + assert 'sub_agent_2' in invocation_context.end_of_agents + assert 'sub_sub_agent_1' in invocation_context.agent_states + + invocation_context.reset_sub_agent_states('root_agent') + + assert 'sub_agent_1' not in invocation_context.agent_states + assert 'sub_agent_1' not in invocation_context.end_of_agents + assert 'sub_agent_2' not in invocation_context.agent_states + assert 'sub_agent_2' not in invocation_context.end_of_agents + assert 'sub_sub_agent_1' not in invocation_context.agent_states + assert 'sub_sub_agent_1' not in invocation_context.end_of_agents + + +class TestFindMatchingFunctionCall: + """Test suite for find_matching_function_call.""" + + @pytest.fixture + def test_invocation_context(self): + """Create a mock invocation context for testing.""" + + def _create_invocation_context(events): + return InvocationContext( + session_service=Mock(spec=BaseSessionService), + agent=Mock(spec=BaseAgent, name='agent'), + invocation_id='inv_1', + session=Mock(spec=Session, events=events), + ) + + return _create_invocation_context + + def test_find_matching_function_call_found(self, test_invocation_context): + """Tests that a matching function call is found.""" + fc = Part.from_function_call(name='some_tool', args={}) + fc.function_call.id = 'test_function_call_id' + fc_event = Event( + invocation_id='inv_1', + author='agent', + content=testing_utils.ModelContent([fc]), + ) + fr = Part.from_function_response( + name='some_tool', response={'result': 'ok'} + ) + fr.function_response.id = 'test_function_call_id' + fr_event = Event( + invocation_id='inv_1', + author='agent', + content=Content(role='user', parts=[fr]), + ) + invocation_context = test_invocation_context([fc_event, fr_event]) + matching_fc_event = invocation_context._find_matching_function_call( + fr_event + ) + assert testing_utils.simplify_content( + matching_fc_event.content + ) == testing_utils.simplify_content(fc_event.content) + + def test_find_matching_function_call_not_found(self, test_invocation_context): + """Tests that no matching function call is returned if id doesn't match.""" + fc = Part.from_function_call(name='some_tool', args={}) + fc.function_call.id = 'another_function_call_id' + fc_event = Event( + invocation_id='inv_1', + author='agent', + content=testing_utils.ModelContent([fc]), + ) + fr = Part.from_function_response( + name='some_tool', response={'result': 'ok'} + ) + fr.function_response.id = 'test_function_call_id' + fr_event = Event( + invocation_id='inv_1', + author='agent', + content=Content(role='user', parts=[fr]), + ) + invocation_context = test_invocation_context([fc_event, fr_event]) + match = invocation_context._find_matching_function_call(fr_event) + assert match is None + + def test_find_matching_function_call_no_call_events( + self, test_invocation_context + ): + """Tests that no matching function call is returned if there are no call events.""" + fr = Part.from_function_response( + name='some_tool', response={'result': 'ok'} + ) + fr.function_response.id = 'test_function_call_id' + fr_event = Event( + invocation_id='inv_1', + author='agent', + content=Content(role='user', parts=[fr]), + ) + invocation_context = test_invocation_context([fr_event]) + match = invocation_context._find_matching_function_call(fr_event) + assert match is None + + def test_find_matching_function_call_no_response_in_event( + self, test_invocation_context + ): + """Tests result is None if function_response_event has no function response.""" + fr_event_no_fr = Event( + author='agent', + content=Content(role='user', parts=[Part(text='user message')]), + ) + fc = Part.from_function_call(name='some_tool', args={}) + fc.function_call.id = 'test_function_call_id' + fc_event = Event( + invocation_id='inv_1', + author='agent', + content=testing_utils.ModelContent([fc]), + ) + fr = Part.from_function_response( + name='some_tool', response={'result': 'ok'} + ) + fr.function_response.id = 'test_function_call_id' + fr_event = Event( + invocation_id='inv_1', + author='agent', + content=Content(role='user', parts=[Part(text='user message')]), + ) + invocation_context = test_invocation_context([fc_event, fr_event]) + match = invocation_context._find_matching_function_call(fr_event_no_fr) + assert match is None diff --git a/tests/unittests/agents/test_llm_agent_error_messages.py b/tests/unittests/agents/test_llm_agent_error_messages.py new file mode 100644 index 0000000000..1b6f135e12 --- /dev/null +++ b/tests/unittests/agents/test_llm_agent_error_messages.py @@ -0,0 +1,89 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for enhanced error messages in agent handling.""" +from google.adk.agents import LlmAgent +import pytest + + +def test_agent_not_found_enhanced_error(): + """Verify enhanced error message for agent not found.""" + root_agent = LlmAgent( + name='root', + model='gemini-2.0-flash', + sub_agents=[ + LlmAgent(name='agent_a', model='gemini-2.0-flash'), + LlmAgent(name='agent_b', model='gemini-2.0-flash'), + ], + ) + + with pytest.raises(ValueError) as exc_info: + root_agent._LlmAgent__get_agent_to_run('nonexistent_agent') + + error_msg = str(exc_info.value) + + # Verify error message components + assert 'nonexistent_agent' in error_msg + assert 'Available agents:' in error_msg + assert 'agent_a' in error_msg + assert 'agent_b' in error_msg + assert 'Possible causes:' in error_msg + assert 'Suggested fixes:' in error_msg + + +def test_agent_tree_traversal(): + """Verify agent tree traversal helper works correctly.""" + root_agent = LlmAgent( + name='orchestrator', + model='gemini-2.0-flash', + sub_agents=[ + LlmAgent( + name='parent_agent', + model='gemini-2.0-flash', + sub_agents=[ + LlmAgent(name='child_agent', model='gemini-2.0-flash'), + ], + ), + ], + ) + + available_agents = root_agent._get_available_agent_names() + + # Verify all agents in tree are found + assert 'orchestrator' in available_agents + assert 'parent_agent' in available_agents + assert 'child_agent' in available_agents + assert len(available_agents) == 3 + + +def test_agent_not_found_shows_all_agents(): + """Verify error message shows all agents (no truncation).""" + # Create 100 sub-agents + sub_agents = [ + LlmAgent(name=f'agent_{i}', model='gemini-2.0-flash') for i in range(100) + ] + + root_agent = LlmAgent( + name='root', model='gemini-2.0-flash', sub_agents=sub_agents + ) + + with pytest.raises(ValueError) as exc_info: + root_agent._LlmAgent__get_agent_to_run('nonexistent') + + error_msg = str(exc_info.value) + + # Verify all agents are shown (no truncation) + assert 'agent_0' in error_msg # First agent shown + assert 'agent_99' in error_msg # Last agent also shown + assert 'showing first 20 of' not in error_msg # No truncation message diff --git a/tests/unittests/agents/test_llm_agent_fields.py b/tests/unittests/agents/test_llm_agent_fields.py index 55162cd421..95e1708635 100644 --- a/tests/unittests/agents/test_llm_agent_fields.py +++ b/tests/unittests/agents/test_llm_agent_fields.py @@ -19,6 +19,7 @@ from typing import Literal from typing import Optional from typing import Union +from unittest import mock from google.adk.agents.callback_context import CallbackContext from google.adk.agents.invocation_context import InvocationContext @@ -28,6 +29,9 @@ from google.adk.models.llm_request import LlmRequest from google.adk.models.registry import LLMRegistry from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.tools.google_search_tool import google_search +from google.adk.tools.google_search_tool import GoogleSearchTool +from google.adk.tools.vertex_ai_search_tool import VertexAiSearchTool from google.genai import types from google.genai.types import Part from pydantic import BaseModel @@ -170,27 +174,7 @@ async def _global_instruction_provider(ctx: ReadonlyContext) -> str: assert bypass_state_injection -def test_output_schema_will_disable_transfer(caplog: pytest.LogCaptureFixture): - with caplog.at_level('WARNING'): - - class Schema(BaseModel): - pass - - agent = LlmAgent( - name='test_agent', - output_schema=Schema, - ) - - # Transfer is automatically disabled - assert agent.disallow_transfer_to_parent - assert agent.disallow_transfer_to_peers - assert ( - 'output_schema cannot co-exist with agent transfer configurations.' - in caplog.text - ) - - -def test_output_schema_with_sub_agents_will_throw(): +def test_output_schema_with_sub_agents_will_not_throw(): class Schema(BaseModel): pass @@ -198,12 +182,18 @@ class Schema(BaseModel): name='sub_agent', ) - with pytest.raises(ValueError): - _ = LlmAgent( - name='test_agent', - output_schema=Schema, - sub_agents=[sub_agent], - ) + agent = LlmAgent( + name='test_agent', + output_schema=Schema, + sub_agents=[sub_agent], + ) + + # Transfer is not disabled + assert not agent.disallow_transfer_to_parent + assert not agent.disallow_transfer_to_peers + + assert agent.output_schema == Schema + assert agent.sub_agents == [sub_agent] def test_output_schema_with_tools_will_not_throw(): @@ -286,6 +276,150 @@ def test_allow_transfer_by_default(): assert not agent.disallow_transfer_to_peers +# TODO(b/448114567): Remove TestCanonicalTools once the workaround +# is no longer needed. +class TestCanonicalTools: + """Unit tests for canonical_tools in LlmAgent.""" + + @staticmethod + def _my_tool(sides: int) -> int: + return sides + + async def test_handle_google_search_with_other_tools(self): + """Test that google_search is wrapped into an agent.""" + agent = LlmAgent( + name='test_agent', + model='gemini-pro', + tools=[ + self._my_tool, + GoogleSearchTool(bypass_multi_tools_limit=True), + ], + ) + ctx = await _create_readonly_context(agent) + tools = await agent.canonical_tools(ctx) + + assert len(tools) == 2 + assert tools[0].name == '_my_tool' + assert tools[0].__class__.__name__ == 'FunctionTool' + assert tools[1].name == 'google_search_agent' + assert tools[1].__class__.__name__ == 'GoogleSearchAgentTool' + + async def test_handle_google_search_with_other_tools_no_bypass(self): + """Test that google_search is not wrapped into an agent.""" + agent = LlmAgent( + name='test_agent', + model='gemini-pro', + tools=[ + self._my_tool, + GoogleSearchTool(bypass_multi_tools_limit=False), + ], + ) + ctx = await _create_readonly_context(agent) + tools = await agent.canonical_tools(ctx) + + assert len(tools) == 2 + assert tools[0].name == '_my_tool' + assert tools[0].__class__.__name__ == 'FunctionTool' + assert tools[1].name == 'google_search' + assert tools[1].__class__.__name__ == 'GoogleSearchTool' + + async def test_handle_google_search_only(self): + """Test that google_search is not wrapped into an agent.""" + agent = LlmAgent( + name='test_agent', + model='gemini-pro', + tools=[ + google_search, + ], + ) + ctx = await _create_readonly_context(agent) + tools = await agent.canonical_tools(ctx) + + assert len(tools) == 1 + assert tools[0].name == 'google_search' + assert tools[0].__class__.__name__ == 'GoogleSearchTool' + + async def test_function_tool_only(self): + """Test that function tool is not affected.""" + agent = LlmAgent( + name='test_agent', + model='gemini-pro', + tools=[ + self._my_tool, + ], + ) + ctx = await _create_readonly_context(agent) + tools = await agent.canonical_tools(ctx) + + assert len(tools) == 1 + assert tools[0].name == '_my_tool' + assert tools[0].__class__.__name__ == 'FunctionTool' + + @mock.patch( + 'google.auth.default', + mock.MagicMock(return_value=('credentials', 'project')), + ) + async def test_handle_vais_with_other_tools(self): + """Test that VertexAiSearchTool is replaced with Discovery Engine Search.""" + agent = LlmAgent( + name='test_agent', + model='gemini-pro', + tools=[ + self._my_tool, + VertexAiSearchTool( + data_store_id='test_data_store_id', + bypass_multi_tools_limit=True, + ), + ], + ) + ctx = await _create_readonly_context(agent) + tools = await agent.canonical_tools(ctx) + + assert len(tools) == 2 + assert tools[0].name == '_my_tool' + assert tools[0].__class__.__name__ == 'FunctionTool' + assert tools[1].name == 'discovery_engine_search' + assert tools[1].__class__.__name__ == 'DiscoveryEngineSearchTool' + + async def test_handle_vais_with_other_tools_no_bypass(self): + """Test that VertexAiSearchTool is not replaced.""" + agent = LlmAgent( + name='test_agent', + model='gemini-pro', + tools=[ + self._my_tool, + VertexAiSearchTool( + data_store_id='test_data_store_id', + bypass_multi_tools_limit=False, + ), + ], + ) + ctx = await _create_readonly_context(agent) + tools = await agent.canonical_tools(ctx) + + assert len(tools) == 2 + assert tools[0].name == '_my_tool' + assert tools[0].__class__.__name__ == 'FunctionTool' + assert tools[1].name == 'vertex_ai_search' + assert tools[1].__class__.__name__ == 'VertexAiSearchTool' + + async def test_handle_vais_only(self): + """Test that VertexAiSearchTool is not wrapped into an agent.""" + agent = LlmAgent( + name='test_agent', + model='gemini-pro', + tools=[ + VertexAiSearchTool(data_store_id='test_data_store_id'), + ], + ) + ctx = await _create_readonly_context(agent) + tools = await agent.canonical_tools(ctx) + + assert len(tools) == 1 + assert tools[0].name == 'vertex_ai_search' + assert tools[0].__class__.__name__ == 'VertexAiSearchTool' + + def test_output_schema_with_union(): """Tests if agent can have a Union type in output_schema.""" diff --git a/tests/unittests/agents/test_llm_agent_include_contents.py b/tests/unittests/agents/test_llm_agent_include_contents.py index d4d76cf4e3..851474fc07 100644 --- a/tests/unittests/agents/test_llm_agent_include_contents.py +++ b/tests/unittests/agents/test_llm_agent_include_contents.py @@ -219,9 +219,10 @@ async def test_include_contents_none_sequential_agents(): runner = testing_utils.InMemoryRunner(sequential_agent) events = runner.run("Original user request") - assert len(events) == 2 - assert events[0].author == "agent1" - assert events[1].author == "agent2" + simplified_events = [event for event in events if event.content] + assert len(simplified_events) == 2 + assert simplified_events[0].author == "agent1" + assert simplified_events[1].author == "agent2" # Agent1 sees original user request agent1_contents = testing_utils.simplify_contents( diff --git a/tests/unittests/agents/test_loop_agent.py b/tests/unittests/agents/test_loop_agent.py index a69a9ddf37..746135d08b 100644 --- a/tests/unittests/agents/test_loop_agent.py +++ b/tests/unittests/agents/test_loop_agent.py @@ -19,6 +19,8 @@ from google.adk.agents.base_agent import BaseAgent from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.loop_agent import LoopAgent +from google.adk.agents.loop_agent import LoopAgentState +from google.adk.apps import ResumabilityConfig from google.adk.events.event import Event from google.adk.events.event_actions import EventActions from google.adk.sessions.in_memory_session_service import InMemorySessionService @@ -26,6 +28,10 @@ import pytest from typing_extensions import override +from .. import testing_utils + +END_OF_AGENT = testing_utils.END_OF_AGENT + class _TestingAgent(BaseAgent): @@ -72,13 +78,13 @@ async def _run_async_impl( author=self.name, invocation_id=ctx.invocation_id, content=types.Content( - parts=[types.Part(text=f'I have done my job after escalation!!')] + parts=[types.Part(text='I have done my job after escalation!!')] ), ) async def _create_parent_invocation_context( - test_name: str, agent: BaseAgent + test_name: str, agent: BaseAgent, resumable: bool = False ) -> InvocationContext: session_service = InMemorySessionService() session = await session_service.create_session( @@ -89,11 +95,13 @@ async def _create_parent_invocation_context( agent=agent, session=session, session_service=session_service, + resumability_config=ResumabilityConfig(is_resumable=resumable), ) @pytest.mark.asyncio -async def test_run_async(request: pytest.FixtureRequest): +@pytest.mark.parametrize('resumable', [True, False]) +async def test_run_async(request: pytest.FixtureRequest, resumable: bool): agent = _TestingAgent(name=f'{request.function.__name__}_test_agent') loop_agent = LoopAgent( name=f'{request.function.__name__}_test_loop_agent', @@ -103,19 +111,81 @@ async def test_run_async(request: pytest.FixtureRequest): ], ) parent_ctx = await _create_parent_invocation_context( - request.function.__name__, loop_agent + request.function.__name__, loop_agent, resumable=resumable + ) + events = [e async for e in loop_agent.run_async(parent_ctx)] + + simplified_events = testing_utils.simplify_resumable_app_events(events) + if resumable: + expected_events = [ + ( + loop_agent.name, + {'current_sub_agent': agent.name, 'times_looped': 0}, + ), + (agent.name, f'Hello, async {agent.name}!'), + ( + loop_agent.name, + {'current_sub_agent': agent.name, 'times_looped': 1}, + ), + (agent.name, f'Hello, async {agent.name}!'), + (loop_agent.name, END_OF_AGENT), + ] + else: + expected_events = [ + (agent.name, f'Hello, async {agent.name}!'), + (agent.name, f'Hello, async {agent.name}!'), + ] + assert simplified_events == expected_events + + +@pytest.mark.asyncio +async def test_resume_async(request: pytest.FixtureRequest): + agent_1 = _TestingAgent(name=f'{request.function.__name__}_test_agent_1') + agent_2 = _TestingAgent(name=f'{request.function.__name__}_test_agent_2') + loop_agent = LoopAgent( + name=f'{request.function.__name__}_test_loop_agent', + max_iterations=2, + sub_agents=[ + agent_1, + agent_2, + ], ) + parent_ctx = await _create_parent_invocation_context( + request.function.__name__, loop_agent, resumable=True + ) + parent_ctx.agent_states[loop_agent.name] = LoopAgentState( + current_sub_agent=agent_2.name, times_looped=1 + ).model_dump(mode='json') + events = [e async for e in loop_agent.run_async(parent_ctx)] - assert len(events) == 2 - assert events[0].author == agent.name - assert events[1].author == agent.name - assert events[0].content.parts[0].text == f'Hello, async {agent.name}!' - assert events[1].content.parts[0].text == f'Hello, async {agent.name}!' + simplified_events = testing_utils.simplify_resumable_app_events(events) + expected_events = [ + (agent_2.name, f'Hello, async {agent_2.name}!'), + (loop_agent.name, END_OF_AGENT), + ] + assert simplified_events == expected_events @pytest.mark.asyncio -async def test_run_async_with_escalate_action(request: pytest.FixtureRequest): +async def test_run_async_skip_if_no_sub_agent(request: pytest.FixtureRequest): + loop_agent = LoopAgent( + name=f'{request.function.__name__}_test_loop_agent', + max_iterations=2, + sub_agents=[], + ) + parent_ctx = await _create_parent_invocation_context( + request.function.__name__, loop_agent + ) + events = [e async for e in loop_agent.run_async(parent_ctx)] + assert not events + + +@pytest.mark.asyncio +@pytest.mark.parametrize('resumable', [True, False]) +async def test_run_async_with_escalate_action( + request: pytest.FixtureRequest, resumable: bool +): non_escalating_agent = _TestingAgent( name=f'{request.function.__name__}_test_non_escalating_agent' ) @@ -130,20 +200,52 @@ async def test_run_async_with_escalate_action(request: pytest.FixtureRequest): sub_agents=[non_escalating_agent, escalating_agent, ignored_agent], ) parent_ctx = await _create_parent_invocation_context( - request.function.__name__, loop_agent + request.function.__name__, loop_agent, resumable=resumable ) events = [e async for e in loop_agent.run_async(parent_ctx)] - # Only two events are generated because the sub escalating_agent escalates. - assert len(events) == 3 - assert events[0].author == non_escalating_agent.name - assert events[1].author == escalating_agent.name - assert events[0].content.parts[0].text == ( - f'Hello, async {non_escalating_agent.name}!' - ) - assert events[1].content.parts[0].text == ( - f'Hello, async {escalating_agent.name}!' - ) - assert ( - events[2].content.parts[0].text == 'I have done my job after escalation!!' - ) + simplified_events = testing_utils.simplify_resumable_app_events(events) + + if resumable: + expected_events = [ + ( + loop_agent.name, + { + 'current_sub_agent': non_escalating_agent.name, + 'times_looped': 0, + }, + ), + ( + non_escalating_agent.name, + f'Hello, async {non_escalating_agent.name}!', + ), + ( + loop_agent.name, + {'current_sub_agent': escalating_agent.name, 'times_looped': 0}, + ), + ( + escalating_agent.name, + f'Hello, async {escalating_agent.name}!', + ), + ( + escalating_agent.name, + 'I have done my job after escalation!!', + ), + (loop_agent.name, END_OF_AGENT), + ] + else: + expected_events = [ + ( + non_escalating_agent.name, + f'Hello, async {non_escalating_agent.name}!', + ), + ( + escalating_agent.name, + f'Hello, async {escalating_agent.name}!', + ), + ( + escalating_agent.name, + 'I have done my job after escalation!!', + ), + ] + assert simplified_events == expected_events diff --git a/tests/unittests/agents/test_mcp_instruction_provider.py b/tests/unittests/agents/test_mcp_instruction_provider.py new file mode 100644 index 0000000000..1f2d098c2a --- /dev/null +++ b/tests/unittests/agents/test_mcp_instruction_provider.py @@ -0,0 +1,210 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Unit tests for McpInstructionProvider.""" +import sys +from unittest.mock import AsyncMock +from unittest.mock import MagicMock +from unittest.mock import patch + +from google.adk.agents.readonly_context import ReadonlyContext +import pytest + +# Skip all tests in this module if Python version is less than 3.10 +pytestmark = pytest.mark.skipif( + sys.version_info < (3, 10), + reason="MCP instruction provider requires Python 3.10+", +) + +# Import dependencies with version checking +try: + from google.adk.agents.mcp_instruction_provider import McpInstructionProvider +except ImportError as e: + if sys.version_info < (3, 10): + # Create dummy classes to prevent NameError during test collection + # Tests will be skipped anyway due to pytestmark + class DummyClass: + pass + + McpInstructionProvider = DummyClass + else: + raise e + + +class TestMcpInstructionProvider: + """Unit tests for McpInstructionProvider.""" + + def setup_method(self): + """Sets up the test environment.""" + self.connection_params = {"host": "localhost", "port": 8000} + self.prompt_name = "test_prompt" + self.mock_mcp_session_manager_cls = patch( + "google.adk.agents.mcp_instruction_provider.MCPSessionManager" + ).start() + self.mock_mcp_session_manager = ( + self.mock_mcp_session_manager_cls.return_value + ) + self.mock_session = MagicMock() + self.mock_session.list_prompts = AsyncMock() + self.mock_session.get_prompt = AsyncMock() + self.mock_mcp_session_manager.create_session = AsyncMock( + return_value=self.mock_session + ) + self.provider = McpInstructionProvider( + self.connection_params, self.prompt_name + ) + + @pytest.mark.asyncio + async def test_call_success_no_args(self): + """Tests __call__ with a prompt that has no arguments.""" + mock_prompt = MagicMock() + mock_prompt.name = self.prompt_name + mock_prompt.arguments = None + self.mock_session.list_prompts.return_value = MagicMock( + prompts=[mock_prompt] + ) + + mock_msg1 = MagicMock() + mock_msg1.content.type = "text" + mock_msg1.content.text = "instruction part 1. " + mock_msg2 = MagicMock() + mock_msg2.content.type = "text" + mock_msg2.content.text = "instruction part 2" + self.mock_session.get_prompt.return_value = MagicMock( + messages=[mock_msg1, mock_msg2] + ) + + mock_invocation_context = MagicMock() + mock_invocation_context.session.state = {} + context = ReadonlyContext(mock_invocation_context) + + # Call + instruction = await self.provider(context) + + # Assert + assert instruction == "instruction part 1. instruction part 2" + self.mock_session.get_prompt.assert_called_once_with( + self.prompt_name, arguments={} + ) + + @pytest.mark.asyncio + async def test_call_success_with_args(self): + """Tests __call__ with a prompt that has arguments.""" + mock_arg1 = MagicMock() + mock_arg1.name = "arg1" + mock_prompt = MagicMock() + mock_prompt.name = self.prompt_name + mock_prompt.arguments = [mock_arg1] + self.mock_session.list_prompts.return_value = MagicMock( + prompts=[mock_prompt] + ) + + mock_msg = MagicMock() + mock_msg.content.type = "text" + mock_msg.content.text = "instruction with arg1" + self.mock_session.get_prompt.return_value = MagicMock(messages=[mock_msg]) + + mock_invocation_context = MagicMock() + mock_invocation_context.session.state = {"arg1": "value1", "arg2": "value2"} + context = ReadonlyContext(mock_invocation_context) + + instruction = await self.provider(context) + + assert instruction == "instruction with arg1" + self.mock_session.get_prompt.assert_called_once_with( + self.prompt_name, arguments={"arg1": "value1"} + ) + + @pytest.mark.asyncio + async def test_call_prompt_not_found_in_list_prompts(self): + """Tests __call__ when list_prompts doesn't return the prompt.""" + self.mock_session.list_prompts.return_value = MagicMock(prompts=[]) + + mock_msg = MagicMock() + mock_msg.content.type = "text" + mock_msg.content.text = "instruction" + self.mock_session.get_prompt.return_value = MagicMock(messages=[mock_msg]) + + mock_invocation_context = MagicMock() + mock_invocation_context.session.state = {"arg1": "value1"} + context = ReadonlyContext(mock_invocation_context) + + instruction = await self.provider(context) + + assert instruction == "instruction" + self.mock_session.get_prompt.assert_called_once_with( + self.prompt_name, arguments={} + ) + + @pytest.mark.asyncio + async def test_call_get_prompt_returns_no_messages(self): + """Tests __call__ when get_prompt returns no messages.""" + # Setup mocks + self.mock_session.list_prompts.return_value = MagicMock(prompts=[]) + self.mock_session.get_prompt.return_value = MagicMock(messages=[]) + + mock_invocation_context = MagicMock() + mock_invocation_context.session.state = {} + context = ReadonlyContext(mock_invocation_context) + + # Call and assert + with pytest.raises( + ValueError, match="Failed to load MCP prompt 'test_prompt'." + ): + await self.provider(context) + + # Assert + self.mock_session.get_prompt.assert_called_once_with( + self.prompt_name, arguments={} + ) + + @pytest.mark.asyncio + async def test_call_ignore_non_text_messages(self): + """Tests __call__ ignores non-text messages.""" + # Setup mocks + mock_prompt = MagicMock() + mock_prompt.name = self.prompt_name + mock_prompt.arguments = None + self.mock_session.list_prompts.return_value = MagicMock( + prompts=[mock_prompt] + ) + + mock_msg1 = MagicMock() + mock_msg1.content.type = "text" + mock_msg1.content.text = "instruction part 1. " + + mock_msg2 = MagicMock() + mock_msg2.content.type = "image" + mock_msg2.content.text = "ignored" + + mock_msg3 = MagicMock() + mock_msg3.content.type = "text" + mock_msg3.content.text = "instruction part 2" + + self.mock_session.get_prompt.return_value = MagicMock( + messages=[mock_msg1, mock_msg2, mock_msg3] + ) + + mock_invocation_context = MagicMock() + mock_invocation_context.session.state = {} + context = ReadonlyContext(mock_invocation_context) + + # Call + instruction = await self.provider(context) + + # Assert + assert instruction == "instruction part 1. instruction part 2" + self.mock_session.get_prompt.assert_called_once_with( + self.prompt_name, arguments={} + ) diff --git a/tests/unittests/agents/test_parallel_agent.py b/tests/unittests/agents/test_parallel_agent.py index 3b0168a88d..5b6c046f54 100644 --- a/tests/unittests/agents/test_parallel_agent.py +++ b/tests/unittests/agents/test_parallel_agent.py @@ -18,9 +18,12 @@ from typing import AsyncGenerator from google.adk.agents.base_agent import BaseAgent +from google.adk.agents.base_agent import BaseAgentState from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.parallel_agent import ParallelAgent from google.adk.agents.sequential_agent import SequentialAgent +from google.adk.agents.sequential_agent import SequentialAgentState +from google.adk.apps.app import ResumabilityConfig from google.adk.events.event import Event from google.adk.sessions.in_memory_session_service import InMemorySessionService from google.genai import types @@ -49,10 +52,12 @@ async def _run_async_impl( ) -> AsyncGenerator[Event, None]: await asyncio.sleep(self.delay) yield self.event(ctx) + if ctx.is_resumable: + ctx.set_agent_state(self.name, end_of_agent=True) async def _create_parent_invocation_context( - test_name: str, agent: BaseAgent + test_name: str, agent: BaseAgent, is_resumable: bool = False ) -> InvocationContext: session_service = InMemorySessionService() session = await session_service.create_session( @@ -63,11 +68,13 @@ async def _create_parent_invocation_context( agent=agent, session=session, session_service=session_service, + resumability_config=ResumabilityConfig(is_resumable=is_resumable), ) @pytest.mark.asyncio -async def test_run_async(request: pytest.FixtureRequest): +@pytest.mark.parametrize('is_resumable', [True, False]) +async def test_run_async(request: pytest.FixtureRequest, is_resumable: bool): agent1 = _TestingAgent( name=f'{request.function.__name__}_test_agent_1', delay=0.5, @@ -81,23 +88,43 @@ async def test_run_async(request: pytest.FixtureRequest): ], ) parent_ctx = await _create_parent_invocation_context( - request.function.__name__, parallel_agent + request.function.__name__, parallel_agent, is_resumable=is_resumable ) events = [e async for e in parallel_agent.run_async(parent_ctx)] - assert len(events) == 2 - # agent2 generates an event first, then agent1. Because they run in parallel - # and agent1 has a delay. - assert events[0].author == agent2.name - assert events[1].author == agent1.name - assert events[0].branch.endswith(f'{parallel_agent.name}.{agent2.name}') - assert events[1].branch.endswith(f'{parallel_agent.name}.{agent1.name}') - assert events[0].content.parts[0].text == f'Hello, async {agent2.name}!' - assert events[1].content.parts[0].text == f'Hello, async {agent1.name}!' + if is_resumable: + assert len(events) == 4 + + assert events[0].author == parallel_agent.name + assert not events[0].actions.end_of_agent + + # agent2 generates an event first, then agent1. Because they run in parallel + # and agent1 has a delay. + assert events[1].author == agent2.name + assert events[2].author == agent1.name + assert events[1].branch == f'{parallel_agent.name}.{agent2.name}' + assert events[2].branch == f'{parallel_agent.name}.{agent1.name}' + assert events[1].content.parts[0].text == f'Hello, async {agent2.name}!' + assert events[2].content.parts[0].text == f'Hello, async {agent1.name}!' + + assert events[3].author == parallel_agent.name + assert events[3].actions.end_of_agent + else: + assert len(events) == 2 + + assert events[0].author == agent2.name + assert events[1].author == agent1.name + assert events[0].branch == f'{parallel_agent.name}.{agent2.name}' + assert events[1].branch == f'{parallel_agent.name}.{agent1.name}' + assert events[0].content.parts[0].text == f'Hello, async {agent2.name}!' + assert events[1].content.parts[0].text == f'Hello, async {agent1.name}!' @pytest.mark.asyncio -async def test_run_async_branches(request: pytest.FixtureRequest): +@pytest.mark.parametrize('is_resumable', [True, False]) +async def test_run_async_branches( + request: pytest.FixtureRequest, is_resumable: bool +): agent1 = _TestingAgent( name=f'{request.function.__name__}_test_agent_1', delay=0.5, @@ -116,28 +143,124 @@ async def test_run_async_branches(request: pytest.FixtureRequest): ], ) parent_ctx = await _create_parent_invocation_context( - request.function.__name__, parallel_agent + request.function.__name__, parallel_agent, is_resumable=is_resumable ) events = [e async for e in parallel_agent.run_async(parent_ctx)] - assert len(events) == 3 - assert ( - events[0].author == agent2.name - and events[0].branch == f'{parallel_agent.name}.{sequential_agent.name}' + if is_resumable: + assert len(events) == 8 + + # 1. parallel agent checkpoint + assert events[0].author == parallel_agent.name + assert not events[0].actions.end_of_agent + + # 2. sequential agent checkpoint + assert events[1].author == sequential_agent.name + assert not events[1].actions.end_of_agent + assert events[1].actions.agent_state['current_sub_agent'] == agent2.name + assert events[1].branch == f'{parallel_agent.name}.{sequential_agent.name}' + + # 3. agent 2 event + assert events[2].author == agent2.name + assert events[2].branch == f'{parallel_agent.name}.{sequential_agent.name}' + + # 4. sequential agent checkpoint + assert events[3].author == sequential_agent.name + assert not events[3].actions.end_of_agent + assert events[3].actions.agent_state['current_sub_agent'] == agent3.name + assert events[3].branch == f'{parallel_agent.name}.{sequential_agent.name}' + + # 5. agent 3 event + assert events[4].author == agent3.name + assert events[4].branch == f'{parallel_agent.name}.{sequential_agent.name}' + + # 6. sequential agent checkpoint (end) + assert events[5].author == sequential_agent.name + assert events[5].actions.end_of_agent + assert events[5].branch == f'{parallel_agent.name}.{sequential_agent.name}' + + # Descendants of the same sub-agent should have the same branch. + assert events[1].branch == events[2].branch + assert events[2].branch == events[3].branch + assert events[3].branch == events[4].branch + assert events[4].branch == events[5].branch + + # 7. agent 1 event + assert events[6].author == agent1.name + assert events[6].branch == f'{parallel_agent.name}.{agent1.name}' + + # Sub-agents should have different branches. + assert events[6].branch != events[1].branch + + # 8. parallel agent checkpoint (end) + assert events[7].author == parallel_agent.name + assert events[7].actions.end_of_agent + else: + assert len(events) == 3 + + # 1. agent 2 event + assert events[0].author == agent2.name + assert events[0].branch == f'{parallel_agent.name}.{sequential_agent.name}' + + # 2. agent 3 event + assert events[1].author == agent3.name + assert events[1].branch == f'{parallel_agent.name}.{sequential_agent.name}' + + # 3. agent 1 event + assert events[2].author == agent1.name + assert events[2].branch == f'{parallel_agent.name}.{agent1.name}' + + +@pytest.mark.asyncio +async def test_resume_async_branches(request: pytest.FixtureRequest): + agent1 = _TestingAgent( + name=f'{request.function.__name__}_test_agent_1', delay=0.5 ) - assert ( - events[1].author == agent3.name - and events[0].branch == f'{parallel_agent.name}.{sequential_agent.name}' + agent2 = _TestingAgent(name=f'{request.function.__name__}_test_agent_2') + agent3 = _TestingAgent(name=f'{request.function.__name__}_test_agent_3') + sequential_agent = SequentialAgent( + name=f'{request.function.__name__}_test_sequential_agent', + sub_agents=[agent2, agent3], + ) + parallel_agent = ParallelAgent( + name=f'{request.function.__name__}_test_parallel_agent', + sub_agents=[ + sequential_agent, + agent1, + ], + ) + parent_ctx = await _create_parent_invocation_context( + request.function.__name__, parallel_agent, is_resumable=True ) - # Descendants of the same sub-agent should have the same branch. - assert events[0].branch == events[1].branch - assert ( - events[2].author == agent1.name - and events[2].branch == f'{parallel_agent.name}.{agent1.name}' + parent_ctx.agent_states[parallel_agent.name] = BaseAgentState().model_dump( + mode='json' ) - # Sub-agents should have different branches. - assert events[2].branch != events[1].branch - assert events[2].branch != events[0].branch + parent_ctx.agent_states[sequential_agent.name] = SequentialAgentState( + current_sub_agent=agent3.name + ).model_dump(mode='json') + + events = [e async for e in parallel_agent.run_async(parent_ctx)] + + assert len(events) == 4 + + # The sequential agent resumes from agent3. + # 1. Agent 3 event + assert events[0].author == agent3.name + assert events[0].branch == f'{parallel_agent.name}.{sequential_agent.name}' + + # 2. Sequential agent checkpoint (end) + assert events[1].author == sequential_agent.name + assert events[1].actions.end_of_agent + assert events[1].branch == f'{parallel_agent.name}.{sequential_agent.name}' + + # Agent 1 runs in parallel but has a delay. + # 3. Agent 1 event + assert events[2].author == agent1.name + assert events[2].branch == f'{parallel_agent.name}.{agent1.name}' + + # 4. Parallel agent checkpoint (end) + assert events[3].author == parallel_agent.name + assert events[3].actions.end_of_agent class _TestingAgentWithMultipleEvents(_TestingAgent): @@ -184,6 +307,19 @@ async def test_generating_one_event_per_agent_at_once( # Asserts on event are done in _TestingAgentWithMultipleEvents. +@pytest.mark.asyncio +async def test_run_async_skip_if_no_sub_agent(request: pytest.FixtureRequest): + parallel_agent = ParallelAgent( + name=f'{request.function.__name__}_test_parallel_agent', + sub_agents=[], + ) + parent_ctx = await _create_parent_invocation_context( + request.function.__name__, parallel_agent + ) + events = [e async for e in parallel_agent.run_async(parent_ctx)] + assert not events + + class _TestingAgentWithException(_TestingAgent): """Mock agent for testing.""" diff --git a/tests/unittests/agents/test_remote_a2a_agent.py b/tests/unittests/agents/test_remote_a2a_agent.py index 3068b257c7..fc93e8dd5d 100644 --- a/tests/unittests/agents/test_remote_a2a_agent.py +++ b/tests/unittests/agents/test_remote_a2a_agent.py @@ -23,6 +23,7 @@ from google.adk.events.event import Event from google.adk.sessions.session import Session +from google.genai import types as genai_types import httpx import pytest @@ -34,13 +35,21 @@ # Import dependencies with version checking try: from a2a.client.client import ClientConfig + from a2a.client.client import Consumer from a2a.client.client_factory import ClientFactory from a2a.types import AgentCapabilities from a2a.types import AgentCard from a2a.types import AgentSkill + from a2a.types import Artifact from a2a.types import Message as A2AMessage + from a2a.types import Part as A2ATaskStatus from a2a.types import SendMessageSuccessResponse from a2a.types import Task as A2ATask + from a2a.types import TaskArtifactUpdateEvent + from a2a.types import TaskState + from a2a.types import TaskStatus + from a2a.types import TaskStatusUpdateEvent + from a2a.types import TextPart from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.remote_a2a_agent import A2A_METADATA_PREFIX from google.adk.agents.remote_a2a_agent import AgentCardResolutionError @@ -59,6 +68,9 @@ class DummyTypes: A2AMessage = DummyTypes() SendMessageSuccessResponse = DummyTypes() A2ATask = DummyTypes() + TaskStatusUpdateEvent = DummyTypes() + Artifact = DummyTypes() + TaskArtifactUpdateEvent = DummyTypes() InvocationContext = DummyTypes() RemoteA2aAgent = DummyTypes() AgentCardResolutionError = Exception @@ -246,6 +258,50 @@ async def test_ensure_factory_reuses_existing_client(self): assert client == existing_client assert agent._httpx_client_needs_cleanup is False + @pytest.mark.asyncio + async def test_ensure_httpx_client_updates_factory_with_new_client(self): + """Test that _ensure_httpx_client updates factory with new client.""" + agent = RemoteA2aAgent( + name="test_agent", + agent_card=create_test_agent_card(), + a2a_client_factory=ClientFactory( + ClientConfig(httpx_client=None), + ), + ) + assert agent._a2a_client_factory._config.httpx_client is None + + client = await agent._ensure_httpx_client() + + assert client is not None + assert agent._httpx_client == client + assert agent._httpx_client_needs_cleanup is True + assert agent._a2a_client_factory._config.httpx_client == client + + @pytest.mark.asyncio + async def test_ensure_httpx_client_reregisters_transports_with_new_client( + self, + ): + """Test that _ensure_httpx_client registers transports with new client.""" + factory = ClientFactory( + ClientConfig(httpx_client=None), + ) + factory.register("transport_label", lambda: "test") + agent = RemoteA2aAgent( + name="test_agent", + agent_card=create_test_agent_card(), + a2a_client_factory=factory, + ) + assert agent._a2a_client_factory._config.httpx_client is None + assert "transport_label" in agent._a2a_client_factory._registry + + client = await agent._ensure_httpx_client() + + assert client is not None + assert agent._httpx_client == client + assert agent._httpx_client_needs_cleanup is True + assert agent._a2a_client_factory._config.httpx_client == client + assert "transport_label" in agent._a2a_client_factory._registry + @pytest.mark.asyncio async def test_resolve_agent_card_from_url_success(self): """Test successful agent card resolution from URL.""" @@ -304,7 +360,7 @@ async def test_resolve_agent_card_from_file_success(self): @pytest.mark.asyncio async def test_resolve_agent_card_from_file_not_found(self): - """Test agent card resolution from non-existent file raises error.""" + """Test agent card resolution from nonexistent file raises error.""" agent = RemoteA2aAgent( name="test_agent", agent_card="/path/to/nonexistent.json" ) @@ -640,17 +696,126 @@ async def test_handle_a2a_response_success_with_message(self): assert A2A_METADATA_PREFIX + "context_id" in result.custom_metadata @pytest.mark.asyncio - async def test_handle_a2a_response_success_with_task(self): - """Test successful A2A response handling with task.""" + async def test_handle_a2a_response_with_task_completed_and_no_update(self): + """Test successful A2A response handling with non-streeaming task and no update.""" + mock_a2a_task = Mock(spec=A2ATask) + mock_a2a_task.id = "task-123" + mock_a2a_task.context_id = "context-123" + mock_a2a_task.status = Mock(spec=A2ATaskStatus) + mock_a2a_task.status.state = TaskState.completed + + # Create a proper Event mock that can handle custom_metadata + mock_a2a_part = Mock(spec=TextPart) + mock_event = Event( + author=self.agent.name, + invocation_id=self.mock_context.invocation_id, + branch=self.mock_context.branch, + content=genai_types.Content(role="model", parts=[mock_a2a_part]), + ) + + with patch( + "google.adk.agents.remote_a2a_agent.convert_a2a_task_to_event" + ) as mock_convert: + mock_convert.return_value = mock_event + + result = await self.agent._handle_a2a_response( + (mock_a2a_task, None), self.mock_context + ) + + assert result == mock_event + mock_convert.assert_called_once_with( + mock_a2a_task, + self.agent.name, + self.mock_context, + ) + # Check the parts are not updated as Thought + assert result.content.parts[0].thought is None + # Check that metadata was added + assert result.custom_metadata is not None + assert A2A_METADATA_PREFIX + "task_id" in result.custom_metadata + assert A2A_METADATA_PREFIX + "context_id" in result.custom_metadata + + def test_construct_message_parts_from_session_preserves_order(self): + """Test that message parts are in correct order with multi-part messages. + + This test verifies the fix for the bug where _present_other_agent_message + creates multi-part messages with "For context:" prefix, and ensures the + parts are in the correct chronological order (not reversed). + """ + # Create mock events with multiple parts + # Event 1: User message + user_part = Mock() + user_part.text = "User question" + user_content = Mock() + user_content.parts = [user_part] + user_event = Mock() + user_event.content = user_content + user_event.author = "user" + + # Event 2: Other agent message (will be transformed by + # _present_other_agent_message) + other_agent_part1 = Mock() + other_agent_part1.text = "For context:" + other_agent_part2 = Mock() + other_agent_part2.text = "[other_agent] said: Response text" + other_agent_content = Mock() + other_agent_content.parts = [other_agent_part1, other_agent_part2] + other_agent_event = Mock() + other_agent_event.content = other_agent_content + other_agent_event.author = "other_agent" + + self.mock_session.events = [user_event, other_agent_event] + + with patch( + "google.adk.agents.remote_a2a_agent._present_other_agent_message" + ) as mock_present: + # Mock _present_other_agent_message to return the transformed event + mock_present.return_value = other_agent_event + + # Mock the converter to track the order of parts + converted_parts = [] + + def mock_converter(part): + mock_a2a_part = Mock() + mock_a2a_part.original_text = part.text + converted_parts.append(mock_a2a_part) + return mock_a2a_part + + self.mock_genai_part_converter.side_effect = mock_converter + + result = self.agent._construct_message_parts_from_session( + self.mock_context + ) + + # Verify the parts are in correct order + assert len(result) == 2 # Returns tuple of (parts, context_id) + assert len(result[0]) == 3 # 1 user part + 2 other agent parts + assert result[1] is None # context_id + + # Verify order: user part, then "For context:", then agent message + assert converted_parts[0].original_text == "User question" + assert converted_parts[1].original_text == "For context:" + assert ( + converted_parts[2].original_text + == "[other_agent] said: Response text" + ) + + @pytest.mark.asyncio + async def test_handle_a2a_response_with_task_submitted_and_no_update(self): + """Test successful A2A response handling with streaming task and no update.""" mock_a2a_task = Mock(spec=A2ATask) mock_a2a_task.id = "task-123" mock_a2a_task.context_id = "context-123" + mock_a2a_task.status = Mock(spec=A2ATaskStatus) + mock_a2a_task.status.state = TaskState.submitted # Create a proper Event mock that can handle custom_metadata + mock_a2a_part = Mock(spec=TextPart) mock_event = Event( author=self.agent.name, invocation_id=self.mock_context.invocation_id, branch=self.mock_context.branch, + content=genai_types.Content(role="model", parts=[mock_a2a_part]), ) with patch( @@ -668,11 +833,174 @@ async def test_handle_a2a_response_success_with_task(self): self.agent.name, self.mock_context, ) + # Check the parts are updated as Thought + assert result.content.parts[0].thought is True + assert result.content.parts[0].thought_signature is None + # Check that metadata was added + assert result.custom_metadata is not None + assert A2A_METADATA_PREFIX + "task_id" in result.custom_metadata + assert A2A_METADATA_PREFIX + "context_id" in result.custom_metadata + + @pytest.mark.asyncio + async def test_handle_a2a_response_with_task_status_update_with_message(self): + """Test handling of a task status update with a message.""" + mock_a2a_task = Mock(spec=A2ATask) + mock_a2a_task.id = "task-123" + mock_a2a_task.context_id = "context-123" + + mock_a2a_message = Mock(spec=A2AMessage) + mock_update = Mock(spec=TaskStatusUpdateEvent) + mock_update.status = Mock(TaskStatus) + mock_update.status.state = TaskState.completed + mock_update.status.message = mock_a2a_message + + # Create a proper Event mock that can handle custom_metadata + mock_a2a_part = Mock(spec=TextPart) + mock_event = Event( + author=self.agent.name, + invocation_id=self.mock_context.invocation_id, + branch=self.mock_context.branch, + content=genai_types.Content(role="model", parts=[mock_a2a_part]), + ) + + with patch( + "google.adk.agents.remote_a2a_agent.convert_a2a_message_to_event" + ) as mock_convert: + mock_convert.return_value = mock_event + + result = await self.agent._handle_a2a_response( + (mock_a2a_task, mock_update), self.mock_context + ) + + assert result == mock_event + mock_convert.assert_called_once_with( + mock_a2a_message, + self.agent.name, + self.mock_context, + ) + # Check that metadata was added + assert result.custom_metadata is not None + assert result.content.parts[0].thought is None + assert A2A_METADATA_PREFIX + "task_id" in result.custom_metadata + assert A2A_METADATA_PREFIX + "context_id" in result.custom_metadata + + @pytest.mark.asyncio + async def test_handle_a2a_response_with_task_status_working_update_with_message( + self, + ): + """Test handling of a task status update with a message.""" + mock_a2a_task = Mock(spec=A2ATask) + mock_a2a_task.id = "task-123" + mock_a2a_task.context_id = "context-123" + + mock_a2a_message = Mock(spec=A2AMessage) + mock_update = Mock(spec=TaskStatusUpdateEvent) + mock_update.status = Mock(TaskStatus) + mock_update.status.state = TaskState.working + mock_update.status.message = mock_a2a_message + + # Create a proper Event mock that can handle custom_metadata + mock_a2a_part = Mock(spec=TextPart) + mock_event = Event( + author=self.agent.name, + invocation_id=self.mock_context.invocation_id, + branch=self.mock_context.branch, + content=genai_types.Content(role="model", parts=[mock_a2a_part]), + ) + + with patch( + "google.adk.agents.remote_a2a_agent.convert_a2a_message_to_event" + ) as mock_convert: + mock_convert.return_value = mock_event + + result = await self.agent._handle_a2a_response( + (mock_a2a_task, mock_update), self.mock_context + ) + + assert result == mock_event + mock_convert.assert_called_once_with( + mock_a2a_message, + self.agent.name, + self.mock_context, + ) + # Check that metadata was added + assert result.custom_metadata is not None + assert result.content.parts[0].thought is True + assert A2A_METADATA_PREFIX + "task_id" in result.custom_metadata + assert A2A_METADATA_PREFIX + "context_id" in result.custom_metadata + + @pytest.mark.asyncio + async def test_handle_a2a_response_with_task_status_update_no_message(self): + """Test handling of a task status update with no message.""" + mock_a2a_task = Mock(spec=A2ATask) + mock_a2a_task.id = "task-123" + + mock_update = Mock(spec=TaskStatusUpdateEvent) + mock_update.status = Mock(TaskStatus) + mock_update.status.state = TaskState.completed + mock_update.status.message = None + + result = await self.agent._handle_a2a_response( + (mock_a2a_task, mock_update), self.mock_context + ) + + assert result is None + + @pytest.mark.asyncio + async def test_handle_a2a_response_with_artifact_update(self): + """Test successful A2A response handling with artifact update.""" + mock_a2a_task = Mock(spec=A2ATask) + mock_a2a_task.id = "task-123" + mock_a2a_task.context_id = "context-123" + + mock_artifact = Mock(spec=Artifact) + mock_update = Mock(spec=TaskArtifactUpdateEvent) + mock_update.artifact = mock_artifact + mock_update.append = False + mock_update.last_chunk = True + + # Create a proper Event mock that can handle custom_metadata + mock_event = Event( + author=self.agent.name, + invocation_id=self.mock_context.invocation_id, + branch=self.mock_context.branch, + ) + + with patch( + "google.adk.agents.remote_a2a_agent.convert_a2a_task_to_event" + ) as mock_convert: + mock_convert.return_value = mock_event + + result = await self.agent._handle_a2a_response( + (mock_a2a_task, mock_update), self.mock_context + ) + + assert result == mock_event + mock_convert.assert_called_once_with( + mock_a2a_task, self.agent.name, self.mock_context + ) # Check that metadata was added assert result.custom_metadata is not None assert A2A_METADATA_PREFIX + "task_id" in result.custom_metadata assert A2A_METADATA_PREFIX + "context_id" in result.custom_metadata + @pytest.mark.asyncio + async def test_handle_a2a_response_with_partial_artifact_update(self): + """Test that partial artifact updates are ignored.""" + mock_a2a_task = Mock(spec=A2ATask) + mock_a2a_task.id = "task-123" + + mock_update = Mock(spec=TaskArtifactUpdateEvent) + mock_update.artifact = Mock(spec=Artifact) + mock_update.append = True + mock_update.last_chunk = False + + result = await self.agent._handle_a2a_response( + (mock_a2a_task, mock_update), self.mock_context + ) + + assert result is None + class TestRemoteA2aAgentMessageHandlingFromFactory: """Test message handling functionality.""" @@ -820,17 +1148,61 @@ async def test_handle_a2a_response_success_with_message(self): assert A2A_METADATA_PREFIX + "context_id" in result.custom_metadata @pytest.mark.asyncio - async def test_handle_a2a_response_success_with_task(self): - """Test successful A2A response handling with task.""" + async def test_handle_a2a_response_with_task_completed_and_no_update(self): + """Test successful A2A response handling with non-streeaming task and no update.""" + mock_a2a_task = Mock(spec=A2ATask) + mock_a2a_task.id = "task-123" + mock_a2a_task.context_id = "context-123" + mock_a2a_task.status = Mock(spec=A2ATaskStatus) + mock_a2a_task.status.state = TaskState.completed + + # Create a proper Event mock that can handle custom_metadata + mock_a2a_part = Mock(spec=TextPart) + mock_event = Event( + author=self.agent.name, + invocation_id=self.mock_context.invocation_id, + branch=self.mock_context.branch, + content=genai_types.Content(role="model", parts=[mock_a2a_part]), + ) + + with patch( + "google.adk.agents.remote_a2a_agent.convert_a2a_task_to_event" + ) as mock_convert: + mock_convert.return_value = mock_event + + result = await self.agent._handle_a2a_response( + (mock_a2a_task, None), self.mock_context + ) + + assert result == mock_event + mock_convert.assert_called_once_with( + mock_a2a_task, + self.agent.name, + self.mock_context, + ) + # Check the parts are not updated as Thought + assert result.content.parts[0].thought is None + # Check that metadata was added + assert result.custom_metadata is not None + assert A2A_METADATA_PREFIX + "task_id" in result.custom_metadata + assert A2A_METADATA_PREFIX + "context_id" in result.custom_metadata + + @pytest.mark.asyncio + async def test_handle_a2a_response_with_task_submitted_and_no_update(self): + """Test successful A2A response handling with streaming task and no update.""" mock_a2a_task = Mock(spec=A2ATask) mock_a2a_task.id = "task-123" mock_a2a_task.context_id = "context-123" + mock_a2a_task.status = Mock(spec=A2ATaskStatus) + mock_a2a_task.status.state = TaskState.submitted # Create a proper Event mock that can handle custom_metadata + mock_a2a_part = Mock(spec=TextPart) mock_event = Event( author=self.agent.name, invocation_id=self.mock_context.invocation_id, branch=self.mock_context.branch, + content=genai_types.Content(role="model", parts=[mock_a2a_part]), ) with patch( @@ -842,6 +1214,154 @@ async def test_handle_a2a_response_success_with_task(self): (mock_a2a_task, None), self.mock_context ) + assert result == mock_event + mock_convert.assert_called_once_with( + mock_a2a_task, + self.agent.name, + self.mock_context, + ) + # Check the parts are updated as Thought + assert result.content.parts[0].thought is True + assert result.content.parts[0].thought_signature is None + # Check that metadata was added + assert result.custom_metadata is not None + assert A2A_METADATA_PREFIX + "task_id" in result.custom_metadata + assert A2A_METADATA_PREFIX + "context_id" in result.custom_metadata + + @pytest.mark.asyncio + async def test_handle_a2a_response_with_task_status_update_with_message(self): + """Test handling of a task status update with a message.""" + mock_a2a_task = Mock(spec=A2ATask) + mock_a2a_task.id = "task-123" + mock_a2a_task.context_id = "context-123" + + mock_a2a_message = Mock(spec=A2AMessage) + mock_update = Mock(spec=TaskStatusUpdateEvent) + mock_update.status = Mock(TaskStatus) + mock_update.status.state = TaskState.completed + mock_update.status.message = mock_a2a_message + + # Create a proper Event mock that can handle custom_metadata + mock_a2a_part = Mock(spec=TextPart) + mock_event = Event( + author=self.agent.name, + invocation_id=self.mock_context.invocation_id, + branch=self.mock_context.branch, + content=genai_types.Content(role="model", parts=[mock_a2a_part]), + ) + + with patch( + "google.adk.agents.remote_a2a_agent.convert_a2a_message_to_event" + ) as mock_convert: + mock_convert.return_value = mock_event + + result = await self.agent._handle_a2a_response( + (mock_a2a_task, mock_update), self.mock_context + ) + + assert result == mock_event + mock_convert.assert_called_once_with( + mock_a2a_message, + self.agent.name, + self.mock_context, + ) + # Check that metadata was added + assert result.custom_metadata is not None + assert result.content.parts[0].thought is None + assert A2A_METADATA_PREFIX + "task_id" in result.custom_metadata + assert A2A_METADATA_PREFIX + "context_id" in result.custom_metadata + + @pytest.mark.asyncio + async def test_handle_a2a_response_with_task_status_working_update_with_message( + self, + ): + """Test handling of a task status update with a message.""" + mock_a2a_task = Mock(spec=A2ATask) + mock_a2a_task.id = "task-123" + mock_a2a_task.context_id = "context-123" + + mock_a2a_message = Mock(spec=A2AMessage) + mock_update = Mock(spec=TaskStatusUpdateEvent) + mock_update.status = Mock(TaskStatus) + mock_update.status.state = TaskState.working + mock_update.status.message = mock_a2a_message + + # Create a proper Event mock that can handle custom_metadata + mock_a2a_part = Mock(spec=TextPart) + mock_event = Event( + author=self.agent.name, + invocation_id=self.mock_context.invocation_id, + branch=self.mock_context.branch, + content=genai_types.Content(role="model", parts=[mock_a2a_part]), + ) + + with patch( + "google.adk.agents.remote_a2a_agent.convert_a2a_message_to_event" + ) as mock_convert: + mock_convert.return_value = mock_event + + result = await self.agent._handle_a2a_response( + (mock_a2a_task, mock_update), self.mock_context + ) + + assert result == mock_event + mock_convert.assert_called_once_with( + mock_a2a_message, + self.agent.name, + self.mock_context, + ) + # Check that metadata was added + assert result.custom_metadata is not None + assert result.content.parts[0].thought is True + assert A2A_METADATA_PREFIX + "task_id" in result.custom_metadata + assert A2A_METADATA_PREFIX + "context_id" in result.custom_metadata + + @pytest.mark.asyncio + async def test_handle_a2a_response_with_task_status_update_no_message(self): + """Test handling of a task status update with no message.""" + mock_a2a_task = Mock(spec=A2ATask) + mock_a2a_task.id = "task-123" + + mock_update = Mock(spec=TaskStatusUpdateEvent) + mock_update.status = Mock(TaskStatus) + mock_update.status.state = TaskState.completed + mock_update.status.message = None + + result = await self.agent._handle_a2a_response( + (mock_a2a_task, mock_update), self.mock_context + ) + + assert result is None + + @pytest.mark.asyncio + async def test_handle_a2a_response_with_artifact_update(self): + """Test successful A2A response handling with artifact update.""" + mock_a2a_task = Mock(spec=A2ATask) + mock_a2a_task.id = "task-123" + mock_a2a_task.context_id = "context-123" + + mock_artifact = Mock(spec=Artifact) + mock_update = Mock(spec=TaskArtifactUpdateEvent) + mock_update.artifact = mock_artifact + mock_update.append = False + mock_update.last_chunk = True + + # Create a proper Event mock that can handle custom_metadata + mock_event = Event( + author=self.agent.name, + invocation_id=self.mock_context.invocation_id, + branch=self.mock_context.branch, + ) + + with patch( + "google.adk.agents.remote_a2a_agent.convert_a2a_task_to_event" + ) as mock_convert: + mock_convert.return_value = mock_event + + result = await self.agent._handle_a2a_response( + (mock_a2a_task, mock_update), self.mock_context + ) + assert result == mock_event mock_convert.assert_called_once_with( mock_a2a_task, self.agent.name, self.mock_context @@ -851,6 +1371,23 @@ async def test_handle_a2a_response_success_with_task(self): assert A2A_METADATA_PREFIX + "task_id" in result.custom_metadata assert A2A_METADATA_PREFIX + "context_id" in result.custom_metadata + @pytest.mark.asyncio + async def test_handle_a2a_response_with_partial_artifact_update(self): + """Test that partial artifact updates are ignored.""" + mock_a2a_task = Mock(spec=A2ATask) + mock_a2a_task.id = "task-123" + + mock_update = Mock(spec=TaskArtifactUpdateEvent) + mock_update.artifact = Mock(spec=Artifact) + mock_update.append = True + mock_update.last_chunk = False + + result = await self.agent._handle_a2a_response( + (mock_a2a_task, mock_update), self.mock_context + ) + + assert result is None + class TestRemoteA2aAgentExecution: """Test agent execution functionality.""" @@ -974,6 +1511,7 @@ async def test_run_async_impl_successful_request(self): # Add model_dump to mock_response for metadata mock_response.model_dump.return_value = {"test": "response"} + # Execute events = [] async for event in self.agent._run_async_impl( self.mock_context @@ -1166,6 +1704,7 @@ async def test_run_async_impl_successful_request(self): "test": "response" } + # Execute events = [] async for event in self.agent._run_async_impl( self.mock_context diff --git a/tests/unittests/agents/test_resumable_llm_agent.py b/tests/unittests/agents/test_resumable_llm_agent.py new file mode 100644 index 0000000000..36e84dfc29 --- /dev/null +++ b/tests/unittests/agents/test_resumable_llm_agent.py @@ -0,0 +1,416 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Union + +from google.adk.agents.base_agent import BaseAgent +from google.adk.agents.base_agent import BaseAgentState +from google.adk.agents.invocation_context import InvocationContext +from google.adk.agents.llm_agent import LlmAgent +from google.adk.agents.run_config import RunConfig +from google.adk.apps.app import ResumabilityConfig +from google.adk.events.event import Event +from google.adk.events.event_actions import EventActions +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.genai.types import Content +from google.genai.types import Part +import pytest + +from .. import testing_utils + + +def transfer_call_part(agent_name: str) -> Part: + return Part.from_function_call( + name="transfer_to_agent", args={"agent_name": agent_name} + ) + + +TRANSFER_RESPONSE_PART = Part.from_function_response( + name="transfer_to_agent", response={"result": None} +) + + +def tool_call_part(tool_name: str) -> Part: + part = Part.from_function_call(name=tool_name, args={}) + part.function_call.id = f"{tool_name}_id" + return part + + +def tool_response_part(tool_name: str) -> Part: + part = Part.from_function_response(name=tool_name, response={"result": "ok"}) + part.function_response.id = f"{tool_name}_id" + return part + + +def tool_response_part_no_id(tool_name: str) -> Part: + part = Part.from_function_response(name=tool_name, response={"result": "ok"}) + return part + + +END_OF_AGENT = testing_utils.END_OF_AGENT + + +def some_tool(): + return {"result": "ok"} + + +async def _create_resumable_invocation_context( + invocation_id: str, agent: BaseAgent, events: list[Event] +) -> InvocationContext: + session_service = InMemorySessionService() + session = await session_service.create_session( + app_name="test_app", user_id="test_user" + ) + for event in events: + await session_service.append_event(session, event) + return InvocationContext( + invocation_id=invocation_id, + agent=agent, + session=session, + session_service=session_service, + resumability_config=ResumabilityConfig(is_resumable=True), + run_config=RunConfig(), + ) + + +async def _resume_and_get_events( + agent: BaseAgent, invocation_context: InvocationContext +) -> list[(str, Union[Part, str])]: + events = [] + async for event in agent.run_async(invocation_context): + await invocation_context.session_service.append_event( + invocation_context.session, event + ) + events.append(event) + return testing_utils.simplify_resumable_app_events(events) + + +class TestResumableLlmAgent: + """Test suite for resumable LlmAgent.""" + + @pytest.fixture + @pytest.mark.asyncio + async def resumable_invocation_context(self): + """Creates an invocation context for the specified agent.""" + + async def factory(agent: BaseAgent, events: list[Event]): + return await _create_resumable_invocation_context( + invocation_id="test_invocation", agent=agent, events=events + ) + + return factory + + @pytest.fixture + def mock_model(self): + """Provides a mock model for the test.""" + + def factory(responses: list[Part]): + return testing_utils.MockModel.create(responses=responses) + + return factory + + @pytest.mark.asyncio + async def test_resume_from_transfer_call( + self, resumable_invocation_context, mock_model + ): + """Tests that the agent resumes from the correct sub-agent after a transfer.""" + sub_agent_1 = LlmAgent( + name="sub_agent_1", + model=mock_model([ + "response from sub_agent_1", + ]), + ) + root_agent = LlmAgent( + name="root_agent", + model=mock_model(["response from root"]), + sub_agents=[sub_agent_1], + ) + past_events = [ + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content( + parts=[ + transfer_call_part("sub_agent_1"), + ] + ), + ) + ] + ctx = await resumable_invocation_context(root_agent, past_events) + # Initialize the agent state for the root agent. + ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") + + assert await _resume_and_get_events(root_agent, ctx) == [ + ("root_agent", TRANSFER_RESPONSE_PART), + ("sub_agent_1", "response from sub_agent_1"), + ("sub_agent_1", END_OF_AGENT), + ("root_agent", END_OF_AGENT), + ] + + @pytest.mark.asyncio + async def test_resume_from_transfer_response( + self, resumable_invocation_context, mock_model + ): + """Tests that the agent resumes from the correct sub-agent after a transfer.""" + sub_agent_1 = LlmAgent( + name="sub_agent_1", + model=mock_model([ + "response from sub_agent_1", + ]), + ) + root_agent = LlmAgent( + name="root_agent", + model=mock_model(["response from root"]), + sub_agents=[sub_agent_1], + ) + past_events = [ + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content( + parts=[ + TRANSFER_RESPONSE_PART, + ] + ), + actions=EventActions(transfer_to_agent="sub_agent_1"), + ) + ] + ctx: InvocationContext = await resumable_invocation_context( + root_agent, past_events + ) + # Initialize the agent state for the root agent. + ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") + + assert await _resume_and_get_events(root_agent, ctx) == [ + ("sub_agent_1", "response from sub_agent_1"), + ("sub_agent_1", END_OF_AGENT), + ("root_agent", END_OF_AGENT), + ] + + @pytest.mark.asyncio + async def test_resume_from_model_response( + self, resumable_invocation_context, mock_model + ): + """Tests that no sub-agent is resumed when there has been no transfer.""" + root_agent = LlmAgent( + name="root_agent", + model=mock_model([ + "second response from root", + ]), + ) + past_events = [ + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content(parts=[Part(text="initial response from root")]), + ) + ] + ctx = await resumable_invocation_context(root_agent, past_events) + # Initialize the agent state for the root agent. + ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") + + assert await _resume_and_get_events(root_agent, ctx) == [ + ("root_agent", "second response from root"), + ("root_agent", END_OF_AGENT), + ] + + @pytest.mark.asyncio + async def test_resume_from_tool_call( + self, resumable_invocation_context, mock_model + ): + """Tests that the agent resumes from a tool call successfully.""" + root_agent = LlmAgent( + name="root_agent", + model=mock_model(["response after tool call"]), + tools=[some_tool], + ) + past_events = [ + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content(parts=[tool_call_part("some_tool")]), + ), + ] + ctx = await resumable_invocation_context(root_agent, past_events) + # Initialize the agent state for the root agent. + ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") + + assert await _resume_and_get_events(root_agent, ctx) == [ + ("root_agent", tool_response_part_no_id("some_tool")), + ("root_agent", "response after tool call"), + ("root_agent", END_OF_AGENT), + ] + + @pytest.mark.asyncio + async def test_resume_after_tool_response( + self, resumable_invocation_context, mock_model + ): + """Tests that the agent does not resume a sub-agent when the user responds to the current agent.""" + root_agent = LlmAgent( + name="root_agent", + model=mock_model([ + "response after tool call", + ]), + tools=[some_tool], + ) + + past_events = [ + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content(parts=[tool_call_part("some_tool")]), + ), + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content(parts=[tool_response_part("some_tool")]), + ), + ] + ctx = await resumable_invocation_context(root_agent, past_events) + # Initialize the agent state for the root agent. + ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") + + assert await _resume_and_get_events(root_agent, ctx) == [ + ("root_agent", "response after tool call"), + ("root_agent", END_OF_AGENT), + ] + + @pytest.mark.asyncio + async def test_resume_root_agent_on_user_provided_function_response( + self, resumable_invocation_context, mock_model + ): + """Tests that the agent resumes the correct sub-agent after a user responds to its tool call.""" + + def sub_agent_tool(): + return {"result": "ok"} + + sub_agent_1 = LlmAgent( + name="sub_agent_1", + model=mock_model([ + "response from sub_agent_1 after tool call", + ]), + tools=[sub_agent_tool], + ) + root_agent = LlmAgent( + name="root_agent", + model=mock_model(["response from root after tool call"]), + sub_agents=[sub_agent_1], + tools=[some_tool], + ) + past_events = [ + Event( + author="root_agent", + invocation_id="test_invocation", + actions=EventActions(transfer_to_agent="sub_agent_1"), + ), + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content(parts=[transfer_call_part("sub_agent_1")]), + ), + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content(parts=[TRANSFER_RESPONSE_PART]), + actions=EventActions(transfer_to_agent="sub_agent_1"), + ), + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content(parts=[tool_call_part("some_tool")]), + ), + Event( + author="sub_agent_1", + invocation_id="test_invocation", + content=Content(parts=[tool_call_part("sub_agent_tool")]), + ), + Event( + author="user", + invocation_id="test_invocation", + content=Content(parts=[tool_response_part("some_tool")]), + ), + ] + ctx = await resumable_invocation_context(root_agent, past_events) + # Initialize the agent state for the root agent and sub_agent_1. + ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") + ctx.agent_states[sub_agent_1.name] = BaseAgentState().model_dump( + mode="json" + ) + + assert await _resume_and_get_events(root_agent, ctx) == [ + ("root_agent", "response from root after tool call"), + ("root_agent", END_OF_AGENT), + ] + + @pytest.mark.asyncio + async def test_resume_subagent_on_user_provided_function_response( + self, resumable_invocation_context, mock_model + ): + """Tests that the agent resumes the correct sub-agent after a user responds to its tool call.""" + + def sub_agent_tool(): + return {"result": "ok"} + + sub_agent_1 = LlmAgent( + name="sub_agent_1", + model=mock_model([ + "response from sub_agent_1 after tool call", + ]), + tools=[sub_agent_tool], + ) + root_agent = LlmAgent( + name="root_agent", + model=mock_model(["response from root after tool call"]), + sub_agents=[sub_agent_1], + ) + past_events = [ + Event( + author="root_agent", + invocation_id="test_invocation", + actions=EventActions(transfer_to_agent="sub_agent_1"), + ), + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content(parts=[transfer_call_part("sub_agent_1")]), + ), + Event( + author="root_agent", + invocation_id="test_invocation", + content=Content(parts=[TRANSFER_RESPONSE_PART]), + actions=EventActions(transfer_to_agent="sub_agent_1"), + ), + Event( + author="sub_agent_1", + invocation_id="test_invocation", + content=Content(parts=[tool_call_part("sub_agent_tool")]), + ), + Event( + author="user", + invocation_id="test_invocation", + content=Content(parts=[tool_response_part("sub_agent_tool")]), + ), + ] + ctx = await resumable_invocation_context(root_agent, past_events) + # Initialize the agent state for the root agent and sub_agent_1. + ctx.agent_states[root_agent.name] = BaseAgentState().model_dump(mode="json") + ctx.agent_states[sub_agent_1.name] = BaseAgentState().model_dump( + mode="json" + ) + + assert await _resume_and_get_events(root_agent, ctx) == [ + ("sub_agent_1", "response from sub_agent_1 after tool call"), + ("sub_agent_1", END_OF_AGENT), + ("root_agent", END_OF_AGENT), + ] diff --git a/tests/unittests/agents/test_run_config.py b/tests/unittests/agents/test_run_config.py index 11f9bad2fa..ebf173ec86 100644 --- a/tests/unittests/agents/test_run_config.py +++ b/tests/unittests/agents/test_run_config.py @@ -1,4 +1,17 @@ -import logging +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import sys from unittest.mock import ANY from unittest.mock import patch @@ -31,3 +44,23 @@ def test_validate_max_llm_calls_too_large(): ValueError, match=f"max_llm_calls should be less than {sys.maxsize}." ): RunConfig.validate_max_llm_calls(sys.maxsize) + + +def test_audio_transcription_configs_are_not_shared_between_instances(): + config1 = RunConfig() + config2 = RunConfig() + + # Validate output_audio_transcription + assert config1.output_audio_transcription is not None + assert config2.output_audio_transcription is not None + assert ( + config1.output_audio_transcription + is not config2.output_audio_transcription + ) + + # Validate input_audio_transcription + assert config1.input_audio_transcription is not None + assert config2.input_audio_transcription is not None + assert ( + config1.input_audio_transcription is not config2.input_audio_transcription + ) diff --git a/tests/unittests/agents/test_sequential_agent.py b/tests/unittests/agents/test_sequential_agent.py index d73c3192eb..9703e0ca29 100644 --- a/tests/unittests/agents/test_sequential_agent.py +++ b/tests/unittests/agents/test_sequential_agent.py @@ -19,6 +19,8 @@ from google.adk.agents.base_agent import BaseAgent from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.sequential_agent import SequentialAgent +from google.adk.agents.sequential_agent import SequentialAgentState +from google.adk.apps import ResumabilityConfig from google.adk.events.event import Event from google.adk.sessions.in_memory_session_service import InMemorySessionService from google.genai import types @@ -54,7 +56,7 @@ async def _run_live_impl( async def _create_parent_invocation_context( - test_name: str, agent: BaseAgent + test_name: str, agent: BaseAgent, resumable: bool = False ) -> InvocationContext: session_service = InMemorySessionService() session = await session_service.create_session( @@ -65,6 +67,7 @@ async def _create_parent_invocation_context( agent=agent, session=session, session_service=session_service, + resumability_config=ResumabilityConfig(is_resumable=resumable), ) @@ -91,6 +94,92 @@ async def test_run_async(request: pytest.FixtureRequest): assert events[1].content.parts[0].text == f'Hello, async {agent_2.name}!' +@pytest.mark.asyncio +async def test_run_async_skip_if_no_sub_agent(request: pytest.FixtureRequest): + sequential_agent = SequentialAgent( + name=f'{request.function.__name__}_test_agent', + sub_agents=[], + ) + parent_ctx = await _create_parent_invocation_context( + request.function.__name__, sequential_agent + ) + events = [e async for e in sequential_agent.run_async(parent_ctx)] + + assert not events + + +@pytest.mark.asyncio +async def test_run_async_with_resumability(request: pytest.FixtureRequest): + agent_1 = _TestingAgent(name=f'{request.function.__name__}_test_agent_1') + agent_2 = _TestingAgent(name=f'{request.function.__name__}_test_agent_2') + sequential_agent = SequentialAgent( + name=f'{request.function.__name__}_test_agent', + sub_agents=[ + agent_1, + agent_2, + ], + ) + parent_ctx = await _create_parent_invocation_context( + request.function.__name__, sequential_agent, resumable=True + ) + events = [e async for e in sequential_agent.run_async(parent_ctx)] + + # 5 events: + # 1. SequentialAgent checkpoint event for agent 1 + # 2. Agent 1 event + # 3. SequentialAgent checkpoint event for agent 2 + # 4. Agent 2 event + # 5. SequentialAgent final checkpoint event + assert len(events) == 5 + assert events[0].author == sequential_agent.name + assert not events[0].actions.end_of_agent + assert events[0].actions.agent_state['current_sub_agent'] == agent_1.name + + assert events[1].author == agent_1.name + assert events[1].content.parts[0].text == f'Hello, async {agent_1.name}!' + + assert events[2].author == sequential_agent.name + assert not events[2].actions.end_of_agent + assert events[2].actions.agent_state['current_sub_agent'] == agent_2.name + + assert events[3].author == agent_2.name + assert events[3].content.parts[0].text == f'Hello, async {agent_2.name}!' + + assert events[4].author == sequential_agent.name + assert events[4].actions.end_of_agent + + +@pytest.mark.asyncio +async def test_resume_async(request: pytest.FixtureRequest): + agent_1 = _TestingAgent(name=f'{request.function.__name__}_test_agent_1') + agent_2 = _TestingAgent(name=f'{request.function.__name__}_test_agent_2') + sequential_agent = SequentialAgent( + name=f'{request.function.__name__}_test_agent', + sub_agents=[ + agent_1, + agent_2, + ], + ) + parent_ctx = await _create_parent_invocation_context( + request.function.__name__, sequential_agent, resumable=True + ) + parent_ctx.agent_states[sequential_agent.name] = SequentialAgentState( + current_sub_agent=agent_2.name + ).model_dump(mode='json') + + events = [e async for e in sequential_agent.run_async(parent_ctx)] + + # 2 events: + # 1. Agent 2 event + # 2. SequentialAgent final checkpoint event + assert len(events) == 2 + assert events[0].author == agent_2.name + assert events[0].content.parts[0].text == f'Hello, async {agent_2.name}!' + + assert events[1].author == sequential_agent.name + assert events[1].actions.end_of_agent + + @pytest.mark.asyncio async def test_run_live(request: pytest.FixtureRequest): agent_1 = _TestingAgent(name=f'{request.function.__name__}_test_agent_1') diff --git a/tests/unittests/apps/test_apps.py b/tests/unittests/apps/test_apps.py index 76c7280888..d5b23d5a6d 100644 --- a/tests/unittests/apps/test_apps.py +++ b/tests/unittests/apps/test_apps.py @@ -15,7 +15,9 @@ from unittest.mock import Mock from google.adk.agents.base_agent import BaseAgent +from google.adk.agents.context_cache_config import ContextCacheConfig from google.adk.apps.app import App +from google.adk.apps.app import ResumabilityConfig from google.adk.plugins.base_plugin import BasePlugin @@ -38,3 +40,131 @@ def test_app_initialization_with_plugins(self): assert app.name == "test_app" assert app.root_agent == mock_agent assert app.plugins == [mock_plugin] + + def test_app_initialization_without_cache_config(self): + """Test that the app is initialized correctly without context cache config.""" + mock_agent = Mock(spec=BaseAgent) + app = App(name="test_app", root_agent=mock_agent) + assert app.name == "test_app" + assert app.root_agent == mock_agent + assert app.context_cache_config is None + + def test_app_initialization_with_cache_config(self): + """Test that the app is initialized correctly with context cache config.""" + mock_agent = Mock(spec=BaseAgent) + cache_config = ContextCacheConfig( + cache_intervals=15, ttl_seconds=3600, min_tokens=1024 + ) + + app = App( + name="test_app", + root_agent=mock_agent, + context_cache_config=cache_config, + ) + + assert app.name == "test_app" + assert app.root_agent == mock_agent + assert app.context_cache_config == cache_config + assert app.context_cache_config.cache_intervals == 15 + assert app.context_cache_config.ttl_seconds == 3600 + assert app.context_cache_config.min_tokens == 1024 + + def test_app_initialization_with_resumability_config(self): + """Test that the app is initialized correctly with app config.""" + mock_agent = Mock(spec=BaseAgent) + resumability_config = ResumabilityConfig( + is_resumable=True, + ) + app = App( + name="test_app", + root_agent=mock_agent, + resumability_config=resumability_config, + ) + + assert app.name == "test_app" + assert app.root_agent == mock_agent + assert app.resumability_config == resumability_config + assert app.resumability_config.is_resumable + + def test_app_with_all_components(self): + """Test app with all components: agent, plugins, and cache config.""" + mock_agent = Mock(spec=BaseAgent) + mock_plugin = Mock(spec=BasePlugin) + cache_config = ContextCacheConfig( + cache_intervals=20, ttl_seconds=7200, min_tokens=2048 + ) + resumability_config = ResumabilityConfig( + is_resumable=True, + ) + + app = App( + name="full_test_app", + root_agent=mock_agent, + plugins=[mock_plugin], + context_cache_config=cache_config, + resumability_config=resumability_config, + ) + + assert app.name == "full_test_app" + assert app.root_agent == mock_agent + assert app.plugins == [mock_plugin] + assert app.context_cache_config == cache_config + assert app.resumability_config == resumability_config + assert app.resumability_config.is_resumable + + def test_app_cache_config_defaults(self): + """Test that cache config has proper defaults when created.""" + mock_agent = Mock(spec=BaseAgent) + cache_config = ContextCacheConfig() # Use defaults + + app = App( + name="default_cache_app", + root_agent=mock_agent, + context_cache_config=cache_config, + ) + + assert app.context_cache_config.cache_intervals == 10 # Default + assert app.context_cache_config.ttl_seconds == 1800 # Default 30 minutes + assert app.context_cache_config.min_tokens == 0 # Default + + def test_app_context_cache_config_is_optional(self): + """Test that context_cache_config is truly optional.""" + mock_agent = Mock(spec=BaseAgent) + + # Should work without context_cache_config + app = App(name="no_cache_app", root_agent=mock_agent) + assert app.context_cache_config is None + + # Should work with explicit None + app = App( + name="explicit_none_app", + root_agent=mock_agent, + context_cache_config=None, + ) + assert app.context_cache_config is None + + def test_app_resumability_config_defaults(self): + """Test that app config has proper defaults when created.""" + mock_agent = Mock(spec=BaseAgent) + + app = App( + name="default_resumability_config_app", + root_agent=mock_agent, + resumability_config=ResumabilityConfig(), + ) + assert app.resumability_config is not None + assert not app.resumability_config.is_resumable # Default + + def test_app_resumability_config_is_optional(self): + """Test that resumability_config is truly optional.""" + mock_agent = Mock(spec=BaseAgent) + + app = App(name="no_resumability_config_app", root_agent=mock_agent) + assert app.resumability_config is None + + app = App( + name="explicit_none_resumability_config_app", + root_agent=mock_agent, + resumability_config=None, + ) + assert app.resumability_config is None diff --git a/tests/unittests/apps/test_compaction.py b/tests/unittests/apps/test_compaction.py new file mode 100644 index 0000000000..fc7d1a68ff --- /dev/null +++ b/tests/unittests/apps/test_compaction.py @@ -0,0 +1,334 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest +from unittest.mock import AsyncMock +from unittest.mock import Mock + +from google.adk.agents.base_agent import BaseAgent +from google.adk.apps.app import App +from google.adk.apps.app import EventsCompactionConfig +from google.adk.apps.compaction import _run_compaction_for_sliding_window +from google.adk.apps.llm_event_summarizer import LlmEventSummarizer +from google.adk.events.event import Event +from google.adk.events.event_actions import EventActions +from google.adk.events.event_actions import EventCompaction +from google.adk.flows.llm_flows import contents +from google.adk.sessions.base_session_service import BaseSessionService +from google.adk.sessions.session import Session +from google.genai.types import Content +from google.genai.types import Part +import pytest + + +@pytest.mark.parametrize( + 'env_variables', ['GOOGLE_AI', 'VERTEX'], indirect=True +) +class TestCompaction(unittest.IsolatedAsyncioTestCase): + + def setUp(self): + self.mock_session_service = AsyncMock(spec=BaseSessionService) + self.mock_compactor = AsyncMock(spec=LlmEventSummarizer) + + def _create_event( + self, timestamp: float, invocation_id: str, text: str + ) -> Event: + return Event( + timestamp=timestamp, + invocation_id=invocation_id, + author='user', + content=Content(role='user', parts=[Part(text=text)]), + ) + + def _create_compacted_event( + self, start_ts: float, end_ts: float, summary_text: str + ) -> Event: + compaction = EventCompaction( + start_timestamp=start_ts, + end_timestamp=end_ts, + compacted_content=Content( + role='model', parts=[Part(text=summary_text)] + ), + ) + return Event( + timestamp=end_ts, + author='compactor', + content=compaction.compacted_content, + actions=EventActions(compaction=compaction), + invocation_id=Event.new_id(), + ) + + async def test_run_compaction_for_sliding_window_no_events(self): + app = App(name='test', root_agent=Mock(spec=BaseAgent)) + session = Session(app_name='test', user_id='u1', id='s1', events=[]) + await _run_compaction_for_sliding_window( + app, session, self.mock_session_service + ) + self.mock_compactor.maybe_summarize_events.assert_not_called() + self.mock_session_service.append_event.assert_not_called() + + async def test_run_compaction_for_sliding_window_not_enough_new_invocations( + self, + ): + app = App( + name='test', + root_agent=Mock(spec=BaseAgent), + events_compaction_config=EventsCompactionConfig( + summarizer=self.mock_compactor, + compaction_interval=3, + overlap_size=1, + ), + ) + # Only two new invocations ('inv1', 'inv2'), less than compaction_interval=3. + session = Session( + app_name='test', + user_id='u1', + id='s1', + events=[ + self._create_event(1.0, 'inv1', 'e1'), + self._create_event(2.0, 'inv2', 'e2'), + ], + ) + await _run_compaction_for_sliding_window( + app, session, self.mock_session_service + ) + self.mock_compactor.maybe_summarize_events.assert_not_called() + self.mock_session_service.append_event.assert_not_called() + + async def test_run_compaction_for_sliding_window_first_compaction(self): + app = App( + name='test', + root_agent=Mock(spec=BaseAgent), + events_compaction_config=EventsCompactionConfig( + summarizer=self.mock_compactor, + compaction_interval=2, + overlap_size=1, + ), + ) + events = [ + self._create_event(1.0, 'inv1', 'e1'), + self._create_event(2.0, 'inv2', 'e2'), + self._create_event(3.0, 'inv3', 'e3'), + self._create_event(4.0, 'inv4', 'e4'), + ] + session = Session(app_name='test', user_id='u1', id='s1', events=events) + + mock_compacted_event = self._create_compacted_event( + 1.0, 4.0, 'Summary inv1-inv4' + ) + self.mock_compactor.maybe_summarize_events.return_value = ( + mock_compacted_event + ) + + await _run_compaction_for_sliding_window( + app, session, self.mock_session_service + ) + + # Expected events to compact: inv1, inv2, inv3, inv4 + compacted_events_arg = self.mock_compactor.maybe_summarize_events.call_args[ + 1 + ]['events'] + self.assertEqual( + [e.invocation_id for e in compacted_events_arg], + ['inv1', 'inv2', 'inv3', 'inv4'], + ) + self.mock_session_service.append_event.assert_called_once_with( + session=session, event=mock_compacted_event + ) + + async def test_run_compaction_for_sliding_window_with_overlap(self): + app = App( + name='test', + root_agent=Mock(spec=BaseAgent), + events_compaction_config=EventsCompactionConfig( + summarizer=self.mock_compactor, + compaction_interval=2, + overlap_size=1, + ), + ) + # inv1-inv2 are already compacted. Last compacted end timestamp is 2.0. + initial_events = [ + self._create_event(1.0, 'inv1', 'e1'), + self._create_event(2.0, 'inv2', 'e2'), + self._create_compacted_event(1.0, 2.0, 'Summary inv1-inv2'), + ] + # Add new invocations inv3, inv4, inv5 + new_events = [ + self._create_event(3.0, 'inv3', 'e3'), + self._create_event(4.0, 'inv4', 'e4'), + self._create_event(5.0, 'inv5', 'e5'), + ] + session = Session( + app_name='test', + user_id='u1', + id='s1', + events=initial_events + new_events, + ) + + mock_compacted_event = self._create_compacted_event( + 2.0, 5.0, 'Summary inv2-inv5' + ) + self.mock_compactor.maybe_summarize_events.return_value = ( + mock_compacted_event + ) + + await _run_compaction_for_sliding_window( + app, session, self.mock_session_service + ) + + # New invocations are inv3, inv4, inv5 (3 new) > threshold (2). + # Overlap size is 1, so start from 1 inv before inv3, which is inv2. + # Compact range: inv2 to inv5. + compacted_events_arg = self.mock_compactor.maybe_summarize_events.call_args[ + 1 + ]['events'] + self.assertEqual( + [e.invocation_id for e in compacted_events_arg], + ['inv2', 'inv3', 'inv4', 'inv5'], + ) + self.mock_session_service.append_event.assert_called_once_with( + session=session, event=mock_compacted_event + ) + + async def test_run_compaction_for_sliding_window_no_compaction_event_returned( + self, + ): + app = App( + name='test', + root_agent=Mock(spec=BaseAgent), + events_compaction_config=EventsCompactionConfig( + summarizer=self.mock_compactor, + compaction_interval=1, + overlap_size=0, + ), + ) + events = [self._create_event(1.0, 'inv1', 'e1')] + session = Session(app_name='test', user_id='u1', id='s1', events=events) + + self.mock_compactor.maybe_summarize_events.return_value = None + + await _run_compaction_for_sliding_window( + app, session, self.mock_session_service + ) + + self.mock_compactor.maybe_summarize_events.assert_called_once() + self.mock_session_service.append_event.assert_not_called() + + def test_get_contents_with_multiple_compactions(self): + + # Event timestamps: 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 + # Compaction 1: covers 1.0 to 4.0 (summary at 4.0) + # Compaction 2: covers 6.0 to 9.0 (summary at 9.0) + events = [ + self._create_event(1.0, 'inv1', 'Event 1'), + self._create_event(2.0, 'inv2', 'Event 2'), + self._create_event(3.0, 'inv3', 'Event 3'), + self._create_event(4.0, 'inv4', 'Event 4'), + self._create_compacted_event(1.0, 4.0, 'Summary 1-4'), + self._create_event(5.0, 'inv5', 'Event 5'), + self._create_event(6.0, 'inv6', 'Event 6'), + self._create_event(7.0, 'inv7', 'Event 7'), + self._create_event(8.0, 'inv8', 'Event 8'), + self._create_event(9.0, 'inv9', 'Event 9'), + self._create_compacted_event(6.0, 9.0, 'Summary 6-9'), + self._create_event(10.0, 'inv10', 'Event 10'), + ] + + result_contents = contents._get_contents(None, events) + + # Expected contents: + # Summary 1-4 (at timestamp 4.0) + # Event 5 (at timestamp 5.0) + # Summary 6-9 (at timestamp 9.0) + # Event 10 (at timestamp 10.0) + expected_texts = [ + 'Summary 1-4', + 'Event 5', + 'Summary 6-9', + 'Event 10', + ] + actual_texts = [c.parts[0].text for c in result_contents] + self.assertEqual(actual_texts, expected_texts) + # Verify timestamps are in order + + def test_get_contents_no_compaction(self): + + events = [ + self._create_event(1.0, 'inv1', 'Event 1'), + self._create_event(2.0, 'inv2', 'Event 2'), + self._create_event(3.0, 'inv3', 'Event 3'), + ] + + result_contents = contents._get_contents(None, events) + expected_texts = ['Event 1', 'Event 2', 'Event 3'] + actual_texts = [c.parts[0].text for c in result_contents] + self.assertEqual(actual_texts, expected_texts) + + def test_get_contents_single_compaction_at_start(self): + + events = [ + self._create_event(1.0, 'inv1', 'Event 1'), + self._create_event(2.0, 'inv2', 'Event 2'), + self._create_compacted_event(1.0, 2.0, 'Summary 1-2'), + self._create_event(3.0, 'inv3', 'Event 3'), + ] + + result_contents = contents._get_contents(None, events) + expected_texts = ['Summary 1-2', 'Event 3'] + actual_texts = [c.parts[0].text for c in result_contents] + self.assertEqual(actual_texts, expected_texts) + + def test_get_contents_single_compaction_in_middle(self): + + events = [ + self._create_event(1.0, 'inv1', 'Event 1'), + self._create_event(2.0, 'inv2', 'Event 2'), + self._create_compacted_event(1.0, 2.0, 'Summary 1-2'), + self._create_event(3.0, 'inv3', 'Event 3'), + self._create_event(4.0, 'inv4', 'Event 4'), + self._create_compacted_event(3.0, 4.0, 'Summary 3-4'), + self._create_event(5.0, 'inv5', 'Event 5'), + ] + + result_contents = contents._get_contents(None, events) + expected_texts = ['Summary 1-2', 'Summary 3-4', 'Event 5'] + actual_texts = [c.parts[0].text for c in result_contents] + self.assertEqual(actual_texts, expected_texts) + + def test_get_contents_compaction_at_end(self): + + events = [ + self._create_event(1.0, 'inv1', 'Event 1'), + self._create_event(2.0, 'inv2', 'Event 2'), + self._create_event(3.0, 'inv3', 'Event 3'), + self._create_compacted_event(2.0, 3.0, 'Summary 2-3'), + ] + + result_contents = contents._get_contents(None, events) + expected_texts = ['Event 1', 'Summary 2-3'] + actual_texts = [c.parts[0].text for c in result_contents] + self.assertEqual(actual_texts, expected_texts) + + def test_get_contents_compaction_at_beginning(self): + + events = [ + self._create_compacted_event(1.0, 2.0, 'Summary 1-2'), + self._create_event(3.0, 'inv3', 'Event 3'), + self._create_event(4.0, 'inv4', 'Event 4'), + ] + + result_contents = contents._get_contents(None, events) + expected_texts = ['Summary 1-2', 'Event 3', 'Event 4'] + actual_texts = [c.parts[0].text for c in result_contents] + self.assertEqual(actual_texts, expected_texts) diff --git a/tests/unittests/apps/test_llm_event_summarizer.py b/tests/unittests/apps/test_llm_event_summarizer.py new file mode 100644 index 0000000000..4ced5d3f0b --- /dev/null +++ b/tests/unittests/apps/test_llm_event_summarizer.py @@ -0,0 +1,162 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest +from unittest.mock import AsyncMock +from unittest.mock import Mock + +from google.adk.apps.llm_event_summarizer import LlmEventSummarizer +from google.adk.events.event import Event +from google.adk.events.event_actions import EventActions +from google.adk.events.event_actions import EventCompaction +from google.adk.models.base_llm import BaseLlm +from google.adk.models.llm_request import LlmRequest +from google.genai.types import Content +from google.genai.types import FunctionCall +from google.genai.types import FunctionResponse +from google.genai.types import Part +import pytest + + +@pytest.mark.parametrize( + 'env_variables', ['GOOGLE_AI', 'VERTEX'], indirect=True +) +class TestLlmEventSummarizer(unittest.IsolatedAsyncioTestCase): + + def setUp(self): + self.mock_llm = AsyncMock(spec=BaseLlm) + self.mock_llm.model = 'test-model' + self.compactor = LlmEventSummarizer(llm=self.mock_llm) + + def _create_event( + self, timestamp: float, text: str, author: str = 'user' + ) -> Event: + return Event( + timestamp=timestamp, + author=author, + content=Content(parts=[Part(text=text)]), + ) + + async def test_maybe_compact_events_success(self): + events = [ + self._create_event(1.0, 'Hello', 'user'), + self._create_event(2.0, 'Hi there!', 'model'), + ] + expected_conversation_history = 'user: Hello\\nmodel: Hi there!' + expected_prompt = self.compactor._DEFAULT_PROMPT_TEMPLATE.format( + conversation_history=expected_conversation_history + ) + mock_llm_response = Mock(content=Content(parts=[Part(text='Summary')])) + + async def async_gen(): + yield mock_llm_response + + self.mock_llm.generate_content_async.return_value = async_gen() + + compacted_event = await self.compactor.maybe_summarize_events(events=events) + + self.assertIsNotNone(compacted_event) + self.assertEqual( + compacted_event.actions.compaction.compacted_content.parts[0].text, + 'Summary', + ) + self.assertEqual(compacted_event.author, 'user') + self.assertIsNotNone(compacted_event.actions) + self.assertIsNotNone(compacted_event.actions.compaction) + self.assertEqual(compacted_event.actions.compaction.start_timestamp, 1.0) + self.assertEqual(compacted_event.actions.compaction.end_timestamp, 2.0) + self.assertEqual( + compacted_event.actions.compaction.compacted_content.parts[0].text, + 'Summary', + ) + + self.mock_llm.generate_content_async.assert_called_once() + args, kwargs = self.mock_llm.generate_content_async.call_args + llm_request = args[0] + self.assertIsInstance(llm_request, LlmRequest) + self.assertEqual(llm_request.model, 'test-model') + self.assertEqual(llm_request.contents[0].role, 'user') + self.assertEqual(llm_request.contents[0].parts[0].text, expected_prompt) + self.assertFalse(kwargs['stream']) + + async def test_maybe_compact_events_empty_llm_response(self): + events = [ + self._create_event(1.0, 'Hello', 'user'), + ] + mock_llm_response = Mock(content=None) + + async def async_gen(): + yield mock_llm_response + + self.mock_llm.generate_content_async.return_value = async_gen() + + compacted_event = await self.compactor.maybe_summarize_events(events=events) + self.assertIsNone(compacted_event) + + async def test_maybe_compact_events_empty_input(self): + compacted_event = await self.compactor.maybe_summarize_events(events=[]) + self.assertIsNone(compacted_event) + self.mock_llm.generate_content_async.assert_not_called() + + def test_format_events_for_prompt(self): + events = [ + self._create_event(1.0, 'User says...', 'user'), + self._create_event(2.0, 'Model replies...', 'model'), + self._create_event(3.0, 'Another user input', 'user'), + self._create_event(4.0, 'More model text', 'model'), + # Event with no content + Event(timestamp=5.0, author='user'), + # Event with empty content part + Event( + timestamp=6.0, + author='model', + content=Content(parts=[Part(text='')]), + ), + # Event with function call + Event( + timestamp=7.0, + author='model', + content=Content( + parts=[ + Part( + function_call=FunctionCall( + id='call_1', name='tool', args={} + ) + ) + ] + ), + ), + # Event with function response + Event( + timestamp=8.0, + author='model', + content=Content( + parts=[ + Part( + function_response=FunctionResponse( + id='call_1', + name='tool', + response={'result': 'done'}, + ) + ) + ] + ), + ), + ] + expected_formatted_history = ( + 'user: User says...\\nmodel: Model replies...\\nuser: Another user' + ' input\\nmodel: More model text' + ) + formatted_history = self.compactor._format_events_for_prompt(events) + self.assertEqual(formatted_history, expected_formatted_history) diff --git a/tests/unittests/artifacts/test_artifact_service.py b/tests/unittests/artifacts/test_artifact_service.py index a710180ec4..4102cd2281 100644 --- a/tests/unittests/artifacts/test_artifact_service.py +++ b/tests/unittests/artifacts/test_artifact_service.py @@ -14,11 +14,15 @@ """Tests for the artifact service.""" +from datetime import datetime import enum +from typing import Any from typing import Optional from typing import Union from unittest import mock +from unittest.mock import patch +from google.adk.artifacts.base_artifact_service import ArtifactVersion from google.adk.artifacts.gcs_artifact_service import GcsArtifactService from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService from google.genai import types @@ -26,6 +30,9 @@ Enum = enum.Enum +# Define a fixed datetime object to be returned by datetime.now() +FIXED_DATETIME = datetime(2025, 1, 1, 12, 0, 0) + class ArtifactServiceType(Enum): IN_MEMORY = "IN_MEMORY" @@ -49,6 +56,8 @@ def __init__(self, name: str) -> None: self.name = name self.content: Optional[bytes] = None self.content_type: Optional[str] = None + self.time_created = FIXED_DATETIME + self.metadata: dict[str, Any] = {} def upload_from_string( self, data: Union[str, bytes], content_type: Optional[str] = None @@ -113,6 +122,13 @@ def blob(self, blob_name: str) -> MockBlob: self.blobs[blob_name] = MockBlob(blob_name) return self.blobs[blob_name] + def get_blob(self, blob_name: str) -> Optional[MockBlob]: + """Mocks getting a blob from storage if it exists and has content.""" + blob = self.blobs.get(blob_name) + if blob and blob.content is not None: + return blob + return None + class MockClient: """Mocks the GCS Client.""" @@ -131,9 +147,11 @@ def list_blobs(self, bucket: MockBucket, prefix: Optional[str] = None): """Mocks listing blobs in a bucket, optionally with a prefix.""" if prefix: return [ - blob for name, blob in bucket.blobs.items() if name.startswith(prefix) + blob + for name, blob in bucket.blobs.items() + if name.startswith(prefix) and blob.content is not None ] - return list(bucket.blobs.values()) + return [blob for blob in bucket.blobs.values() if blob.content is not None] def mock_gcs_artifact_service(): @@ -195,6 +213,15 @@ async def test_save_load_delete(service_type): == artifact ) + # Attempt to load a version that doesn't exist + assert not await artifact_service.load_artifact( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=filename, + version=3, + ) + await artifact_service.delete_artifact( app_name=app_name, user_id=user_id, @@ -277,3 +304,243 @@ async def test_list_versions(service_type): ) assert response_versions == list(range(4)) + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "service_type", [ArtifactServiceType.IN_MEMORY, ArtifactServiceType.GCS] +) +async def test_list_keys_preserves_user_prefix(service_type): + """Tests that list_artifact_keys preserves 'user:' prefix in returned names.""" + artifact_service = get_artifact_service(service_type) + artifact = types.Part.from_bytes(data=b"test_data", mime_type="text/plain") + app_name = "app0" + user_id = "user0" + session_id = "123" + + # Save artifacts with "user:" prefix (cross-session artifacts) + await artifact_service.save_artifact( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename="user:document.pdf", + artifact=artifact, + ) + + await artifact_service.save_artifact( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename="user:image.png", + artifact=artifact, + ) + + # Save session-scoped artifact without prefix + await artifact_service.save_artifact( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename="session_file.txt", + artifact=artifact, + ) + + # List artifacts should return names with "user:" prefix for user-scoped artifacts + artifact_keys = await artifact_service.list_artifact_keys( + app_name=app_name, user_id=user_id, session_id=session_id + ) + + # Should contain prefixed names and session file + expected_keys = ["user:document.pdf", "user:image.png", "session_file.txt"] + assert sorted(artifact_keys) == sorted(expected_keys) + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "service_type", [ArtifactServiceType.IN_MEMORY, ArtifactServiceType.GCS] +) +async def test_list_artifact_versions_and_get_artifact_version(service_type): + """Tests listing artifact versions and getting a specific version.""" + artifact_service = get_artifact_service(service_type) + app_name = "app0" + user_id = "user0" + session_id = "123" + filename = "filename" + versions = [ + types.Part.from_bytes( + data=i.to_bytes(2, byteorder="big"), mime_type="text/plain" + ) + for i in range(4) + ] + + with patch( + "google.adk.artifacts.base_artifact_service.datetime" + ) as mock_datetime: + mock_datetime.now.return_value = FIXED_DATETIME + + for i in range(4): + custom_metadata = {"key": "value" + str(i)} + await artifact_service.save_artifact( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=filename, + artifact=versions[i], + custom_metadata=custom_metadata, + ) + + artifact_versions = await artifact_service.list_artifact_versions( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=filename, + ) + + expected_artifact_versions = [] + for i in range(4): + metadata = {"key": "value" + str(i)} + if service_type == ArtifactServiceType.GCS: + uri = ( + f"gs://test_bucket/{app_name}/{user_id}/{session_id}/{filename}/{i}" + ) + else: + uri = f"memory://apps/{app_name}/users/{user_id}/sessions/{session_id}/artifacts/{filename}/versions/{i}" + expected_artifact_versions.append( + ArtifactVersion( + version=i, + canonical_uri=uri, + custom_metadata=metadata, + mime_type="text/plain", + create_time=FIXED_DATETIME.timestamp(), + ) + ) + assert artifact_versions == expected_artifact_versions + + # Get latest artifact version when version is not specified + assert ( + await artifact_service.get_artifact_version( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=filename, + ) + == expected_artifact_versions[-1] + ) + + # Get artifact version by version number + assert ( + await artifact_service.get_artifact_version( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=filename, + version=2, + ) + == expected_artifact_versions[2] + ) + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "service_type", [ArtifactServiceType.IN_MEMORY, ArtifactServiceType.GCS] +) +async def test_list_artifact_versions_with_user_prefix(service_type): + """Tests listing artifact versions with user prefix.""" + artifact_service = get_artifact_service(service_type) + app_name = "app0" + user_id = "user0" + session_id = "123" + user_scoped_filename = "user:document.pdf" + versions = [ + types.Part.from_bytes( + data=i.to_bytes(2, byteorder="big"), mime_type="text/plain" + ) + for i in range(4) + ] + + with patch( + "google.adk.artifacts.base_artifact_service.datetime" + ) as mock_datetime: + mock_datetime.now.return_value = FIXED_DATETIME + + for i in range(4): + custom_metadata = {"key": "value" + str(i)} + # Save artifacts with "user:" prefix (cross-session artifacts) + await artifact_service.save_artifact( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=user_scoped_filename, + artifact=versions[i], + custom_metadata=custom_metadata, + ) + + artifact_versions = await artifact_service.list_artifact_versions( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=user_scoped_filename, + ) + + expected_artifact_versions = [] + for i in range(4): + metadata = {"key": "value" + str(i)} + if service_type == ArtifactServiceType.GCS: + uri = f"gs://test_bucket/{app_name}/{user_id}/user/{user_scoped_filename}/{i}" + else: + uri = f"memory://apps/{app_name}/users/{user_id}/artifacts/{user_scoped_filename}/versions/{i}" + expected_artifact_versions.append( + ArtifactVersion( + version=i, + canonical_uri=uri, + custom_metadata=metadata, + mime_type="text/plain", + create_time=FIXED_DATETIME.timestamp(), + ) + ) + assert artifact_versions == expected_artifact_versions + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "service_type", [ArtifactServiceType.IN_MEMORY, ArtifactServiceType.GCS] +) +async def test_get_artifact_version_artifact_does_not_exist(service_type): + """Tests getting an artifact version when artifact does not exist.""" + artifact_service = get_artifact_service(service_type) + assert not await artifact_service.get_artifact_version( + app_name="test_app", + user_id="test_user", + session_id="session_id", + filename="filename", + ) + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "service_type", [ArtifactServiceType.IN_MEMORY, ArtifactServiceType.GCS] +) +async def test_get_artifact_version_out_of_index(service_type): + """Tests loading an artifact with an out-of-index version.""" + artifact_service = get_artifact_service(service_type) + app_name = "app0" + user_id = "user0" + session_id = "123" + filename = "filename" + artifact = types.Part.from_bytes(data=b"test_data", mime_type="text/plain") + + await artifact_service.save_artifact( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=filename, + artifact=artifact, + ) + + # Attempt to get a version that doesn't exist + assert not await artifact_service.get_artifact_version( + app_name=app_name, + user_id=user_id, + session_id=session_id, + filename=filename, + version=3, + ) diff --git a/tests/unittests/artifacts/test_artifact_util.py b/tests/unittests/artifacts/test_artifact_util.py new file mode 100644 index 0000000000..995bf015da --- /dev/null +++ b/tests/unittests/artifacts/test_artifact_util.py @@ -0,0 +1,109 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for artifact_util.""" + +from google.adk.artifacts import artifact_util +from google.genai import types +import pytest + + +def test_parse_session_scoped_artifact_uri(): + """Tests parsing a valid session-scoped artifact URI.""" + uri = "artifact://apps/app1/users/user1/sessions/session1/artifacts/file1/versions/123" + parsed = artifact_util.parse_artifact_uri(uri) + assert parsed is not None + assert parsed.app_name == "app1" + assert parsed.user_id == "user1" + assert parsed.session_id == "session1" + assert parsed.filename == "file1" + assert parsed.version == 123 + + +def test_parse_user_scoped_artifact_uri(): + """Tests parsing a valid user-scoped artifact URI.""" + uri = "artifact://apps/app2/users/user2/artifacts/file2/versions/456" + parsed = artifact_util.parse_artifact_uri(uri) + assert parsed is not None + assert parsed.app_name == "app2" + assert parsed.user_id == "user2" + assert parsed.session_id is None + assert parsed.filename == "file2" + assert parsed.version == 456 + + +@pytest.mark.parametrize( + "invalid_uri", + [ + "http://example.com", + "artifact://invalid", + "artifact://app1/user1/sessions/session1/artifacts/file1", + "artifact://apps/app1/users/user1/sessions/session1/artifacts/file1", + "artifact://apps/app1/users/user1/artifacts/file1", + ], +) +def test_parse_invalid_artifact_uri(invalid_uri): + """Tests parsing invalid artifact URIs.""" + assert artifact_util.parse_artifact_uri(invalid_uri) is None + + +def test_get_session_scoped_artifact_uri(): + """Tests constructing a session-scoped artifact URI.""" + uri = artifact_util.get_artifact_uri( + app_name="app1", + user_id="user1", + session_id="session1", + filename="file1", + version=123, + ) + assert ( + uri + == "artifact://apps/app1/users/user1/sessions/session1/artifacts/file1/versions/123" + ) + + +def test_get_user_scoped_artifact_uri(): + """Tests constructing a user-scoped artifact URI.""" + uri = artifact_util.get_artifact_uri( + app_name="app2", user_id="user2", filename="file2", version=456 + ) + assert uri == "artifact://apps/app2/users/user2/artifacts/file2/versions/456" + + +def test_is_artifact_ref_true(): + """Tests is_artifact_ref with a valid artifact reference.""" + artifact = types.Part( + file_data=types.FileData( + file_uri="artifact://apps/a/u/s/f/v/1", mime_type="text/plain" + ) + ) + assert artifact_util.is_artifact_ref(artifact) is True + + +@pytest.mark.parametrize( + "part", + [ + types.Part(text="hello"), + types.Part(inline_data=types.Blob(data=b"123", mime_type="text/plain")), + types.Part( + file_data=types.FileData( + file_uri="http://example.com", mime_type="text/plain" + ) + ), + types.Part(), + ], +) +def test_is_artifact_ref_false(part): + """Tests is_artifact_ref with non-reference parts.""" + assert artifact_util.is_artifact_ref(part) is False diff --git a/tests/unittests/auth/exchanger/test_credential_exchanger_registry.py b/tests/unittests/auth/exchanger/test_credential_exchanger_registry.py index 66b8582322..32c4812c2f 100644 --- a/tests/unittests/auth/exchanger/test_credential_exchanger_registry.py +++ b/tests/unittests/auth/exchanger/test_credential_exchanger_registry.py @@ -126,7 +126,7 @@ def test_get_exchanger_returns_correct_instance(self): assert isinstance(retrieved_exchanger, BaseCredentialExchanger) def test_get_exchanger_nonexistent_type_returns_none(self): - """Test that get_exchanger returns None for non-existent credential types.""" + """Test that get_exchanger returns None for nonexistent credential types.""" registry = CredentialExchangerRegistry() # Try to get an exchanger that was never registered diff --git a/tests/unittests/auth/exchanger/test_oauth2_credential_exchanger.py b/tests/unittests/auth/exchanger/test_oauth2_credential_exchanger.py index 31288511e6..1156bead70 100644 --- a/tests/unittests/auth/exchanger/test_oauth2_credential_exchanger.py +++ b/tests/unittests/auth/exchanger/test_oauth2_credential_exchanger.py @@ -17,11 +17,14 @@ from unittest.mock import patch from authlib.oauth2.rfc6749 import OAuth2Token +from fastapi.openapi.models import OAuth2 +from fastapi.openapi.models import OAuthFlowClientCredentials +from fastapi.openapi.models import OAuthFlows from google.adk.auth.auth_credential import AuthCredential from google.adk.auth.auth_credential import AuthCredentialTypes from google.adk.auth.auth_credential import OAuth2Auth from google.adk.auth.auth_schemes import OpenIdConnectWithConfig -from google.adk.auth.exchanger.base_credential_exchanger import CredentialExchangError +from google.adk.auth.exchanger.base_credential_exchanger import CredentialExchangeError from google.adk.auth.exchanger.oauth2_credential_exchanger import OAuth2CredentialExchanger import pytest @@ -114,7 +117,7 @@ async def test_exchange_missing_auth_scheme(self): try: await exchanger.exchange(credential, None) assert False, "Should have raised ValueError" - except CredentialExchangError as e: + except CredentialExchangeError as e: assert "auth_scheme is required" in str(e) @patch("google.adk.auth.oauth2_credential_util.OAuth2Session") @@ -218,3 +221,116 @@ async def test_exchange_authlib_not_available(self): # Should return original credential when authlib is not available assert result == credential assert result.oauth2.access_token is None + + @patch("google.adk.auth.oauth2_credential_util.OAuth2Session") + @pytest.mark.asyncio + async def test_exchange_client_credentials_success(self, mock_oauth2_session): + """Test successful client credentials exchange.""" + # Setup mock + mock_client = Mock() + mock_oauth2_session.return_value = mock_client + mock_tokens = OAuth2Token({ + "access_token": "client_access_token", + "expires_at": int(time.time()) + 3600, + "expires_in": 3600, + }) + mock_client.fetch_token.return_value = mock_tokens + + # Create OAuth2 scheme with client credentials flow + flows = OAuthFlows( + clientCredentials=OAuthFlowClientCredentials( + tokenUrl="https://example.com/token", + scopes={"read": "Read access", "write": "Write access"}, + ) + ) + scheme = OAuth2(flows=flows) + + credential = AuthCredential( + auth_type=AuthCredentialTypes.OAUTH2, + oauth2=OAuth2Auth( + client_id="test_client_id", + client_secret="test_client_secret", + ), + ) + + exchanger = OAuth2CredentialExchanger() + result = await exchanger.exchange(credential, scheme) + + # Verify client credentials exchange was successful + assert result.oauth2.access_token == "client_access_token" + mock_client.fetch_token.assert_called_once_with( + "https://example.com/token", + grant_type="client_credentials", + ) + + @patch("google.adk.auth.oauth2_credential_util.OAuth2Session") + @pytest.mark.asyncio + async def test_exchange_client_credentials_failure(self, mock_oauth2_session): + """Test client credentials exchange failure.""" + # Setup mock to raise exception during fetch_token + mock_client = Mock() + mock_oauth2_session.return_value = mock_client + mock_client.fetch_token.side_effect = Exception( + "Client credentials fetch failed" + ) + + # Create OAuth2 scheme with client credentials flow + flows = OAuthFlows( + clientCredentials=OAuthFlowClientCredentials( + tokenUrl="https://example.com/token", scopes={"read": "Read access"} + ) + ) + scheme = OAuth2(flows=flows) + + credential = AuthCredential( + auth_type=AuthCredentialTypes.OAUTH2, + oauth2=OAuth2Auth( + client_id="test_client_id", + client_secret="test_client_secret", + ), + ) + + exchanger = OAuth2CredentialExchanger() + result = await exchanger.exchange(credential, scheme) + + # Should return original credential when client credentials exchange fails + assert result == credential + assert result.oauth2.access_token is None + mock_client.fetch_token.assert_called_once() + + @pytest.mark.asyncio + async def test_determine_grant_type_client_credentials(self): + """Test grant type determination for client credentials.""" + flows = OAuthFlows( + clientCredentials=OAuthFlowClientCredentials( + tokenUrl="https://example.com/token", scopes={"read": "Read access"} + ) + ) + scheme = OAuth2(flows=flows) + + exchanger = OAuth2CredentialExchanger() + grant_type = exchanger._determine_grant_type(scheme) + + from google.adk.auth.auth_schemes import OAuthGrantType + + assert grant_type == OAuthGrantType.CLIENT_CREDENTIALS + + @pytest.mark.asyncio + async def test_determine_grant_type_openid_connect(self): + """Test grant type determination for OpenID Connect (defaults to auth code).""" + scheme = OpenIdConnectWithConfig( + type_="openIdConnect", + openId_connect_url=( + "https://example.com/.well-known/openid_configuration" + ), + authorization_endpoint="https://example.com/auth", + token_endpoint="https://example.com/token", + scopes=["openid"], + ) + + exchanger = OAuth2CredentialExchanger() + grant_type = exchanger._determine_grant_type(scheme) + + from google.adk.auth.auth_schemes import OAuthGrantType + + assert grant_type == OAuthGrantType.AUTHORIZATION_CODE diff --git a/tests/unittests/auth/test_auth_handler.py b/tests/unittests/auth/test_auth_handler.py index 0a2a2f7802..b1ef070667 100644 --- a/tests/unittests/auth/test_auth_handler.py +++ b/tests/unittests/auth/test_auth_handler.py @@ -419,7 +419,7 @@ def test_get_auth_response_exists( assert result == oauth2_credentials_with_auth_uri def test_get_auth_response_not_exists(self, auth_config): - """Test retrieving a non-existent auth response from state.""" + """Test retrieving a nonexistent auth response from state.""" handler = AuthHandler(auth_config) state = MockState() diff --git a/tests/unittests/auth/test_credential_manager.py b/tests/unittests/auth/test_credential_manager.py index fd97860467..ab021d1eaa 100644 --- a/tests/unittests/auth/test_credential_manager.py +++ b/tests/unittests/auth/test_credential_manager.py @@ -12,10 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. +from unittest.mock import ANY from unittest.mock import AsyncMock from unittest.mock import Mock from unittest.mock import patch +from fastapi.openapi.models import OAuth2 +from fastapi.openapi.models import OAuthFlowAuthorizationCode +from fastapi.openapi.models import OAuthFlowImplicit +from fastapi.openapi.models import OAuthFlows from google.adk.auth.auth_credential import AuthCredential from google.adk.auth.auth_credential import AuthCredentialTypes from google.adk.auth.auth_credential import OAuth2Auth @@ -23,8 +28,11 @@ from google.adk.auth.auth_credential import ServiceAccountCredential from google.adk.auth.auth_schemes import AuthScheme from google.adk.auth.auth_schemes import AuthSchemeType +from google.adk.auth.auth_schemes import ExtendedOAuth2 from google.adk.auth.auth_tool import AuthConfig from google.adk.auth.credential_manager import CredentialManager +from google.adk.auth.credential_manager import ServiceAccountCredentialExchanger +from google.adk.auth.oauth2_discovery import AuthorizationServerMetadata import pytest @@ -99,6 +107,9 @@ async def test_load_auth_credentials_no_credential(self): auth_config = Mock(spec=AuthConfig) auth_config.raw_auth_credential = None auth_config.exchanged_auth_credential = None + # Add auth_scheme for the _is_client_credentials_flow method + auth_config.auth_scheme = Mock() + auth_config.auth_scheme.flows = None callback_context = Mock() @@ -391,36 +402,54 @@ async def test_validate_credential_oauth2_missing_oauth2_field(self): await manager._validate_credential() @pytest.mark.asyncio - async def test_exchange_credentials_service_account(self): - """Test _exchange_credential with service account credential.""" - mock_service_account = Mock(spec=ServiceAccount) - mock_credential = Mock(spec=AuthCredential) - mock_credential.auth_type = AuthCredentialTypes.SERVICE_ACCOUNT + async def test_validate_credential_oauth2_missing_scheme_info( + self, extended_oauth2_scheme + ): + """Test _validate_credential with OAuth2 missing scheme info.""" + mock_raw_credential = Mock(spec=AuthCredential) + mock_raw_credential.auth_type = AuthCredentialTypes.OAUTH2 + mock_raw_credential.oauth2 = Mock(spec=OAuth2Auth) auth_config = Mock(spec=AuthConfig) - auth_config.auth_scheme = Mock() + auth_config.raw_auth_credential = mock_raw_credential + auth_config.auth_scheme = extended_oauth2_scheme - # Mock exchanger - mock_exchanger = Mock() - mock_exchanger.exchange = AsyncMock(return_value=mock_credential) + manager = CredentialManager(auth_config) + + with patch.object( + manager, + "_populate_auth_scheme", + return_value=False, + ) and pytest.raises(ValueError, match="OAuth scheme info is missing"): + await manager._validate_credential() + + @pytest.mark.asyncio + async def test_exchange_credentials_service_account( + self, service_account_credential, oauth2_auth_scheme + ): + """Test _exchange_credential with service account credential.""" + auth_config = Mock(spec=AuthConfig) + auth_config.auth_scheme = oauth2_auth_scheme + + exchanged_credential = Mock(spec=AuthCredential) manager = CredentialManager(auth_config) - # Mock the exchanger registry to return our mock exchanger with patch.object( - manager._exchanger_registry, - "get_exchanger", - return_value=mock_exchanger, - ): + ServiceAccountCredentialExchanger, + "exchange_credential", + return_value=exchanged_credential, + autospec=True, + ) as mock_exchange_credential: result, was_exchanged = await manager._exchange_credential( - mock_credential + service_account_credential ) - mock_exchanger.exchange.assert_called_once_with( - mock_credential, auth_config.auth_scheme - ) - assert result == mock_credential - assert was_exchanged is True + mock_exchange_credential.assert_called_once_with( + ANY, oauth2_auth_scheme, service_account_credential + ) + assert result == exchanged_credential + assert was_exchanged is True @pytest.mark.asyncio async def test_exchange_credential_no_exchanger(self): @@ -445,6 +474,198 @@ async def test_exchange_credential_no_exchanger(self): assert result == mock_credential assert was_exchanged is False + @pytest.fixture + def auth_server_metadata(self): + """Create AuthorizationServerMetadata object.""" + return AuthorizationServerMetadata( + issuer="https://auth.example.com", + authorization_endpoint="https://auth.example.com/authorize", + token_endpoint="https://auth.example.com/token", + scopes_supported=["read", "write"], + ) + + @pytest.fixture + def extended_oauth2_scheme(self): + """Create ExtendedOAuth2 object with empty endpoints.""" + return ExtendedOAuth2( + issuer_url="https://auth.example.com", + flows=OAuthFlows( + authorizationCode=OAuthFlowAuthorizationCode( + authorizationUrl="", + tokenUrl="", + ) + ), + ) + + @pytest.fixture + def implicit_oauth2_scheme(self): + """Create OAuth2 object with implicit flow.""" + return OAuth2( + flows=OAuthFlows( + implicit=OAuthFlowImplicit( + authorizationUrl="https://auth.example.com/authorize" + ) + ) + ) + + @pytest.mark.asyncio + async def test_populate_auth_scheme_success( + self, auth_server_metadata, extended_oauth2_scheme + ): + """Test _populate_auth_scheme successfully populates missing info.""" + auth_config = Mock(spec=AuthConfig) + auth_config.auth_scheme = extended_oauth2_scheme + + manager = CredentialManager(auth_config) + with patch.object( + manager._discovery_manager, + "discover_auth_server_metadata", + return_value=auth_server_metadata, + ): + assert await manager._populate_auth_scheme() + + assert ( + manager._auth_config.auth_scheme.flows.authorizationCode.authorizationUrl + == "https://auth.example.com/authorize" + ) + assert ( + manager._auth_config.auth_scheme.flows.authorizationCode.tokenUrl + == "https://auth.example.com/token" + ) + + @pytest.mark.asyncio + async def test_populate_auth_scheme_fail(self, extended_oauth2_scheme): + """Test _populate_auth_scheme when auto-discovery fails.""" + auth_config = Mock(spec=AuthConfig) + auth_config.auth_scheme = extended_oauth2_scheme + + manager = CredentialManager(auth_config) + with patch.object( + manager._discovery_manager, + "discover_auth_server_metadata", + return_value=None, + ): + assert not await manager._populate_auth_scheme() + + assert ( + not manager._auth_config.auth_scheme.flows.authorizationCode.authorizationUrl + ) + assert not manager._auth_config.auth_scheme.flows.authorizationCode.tokenUrl + + @pytest.mark.asyncio + async def test_populate_auth_scheme_noop(self, implicit_oauth2_scheme): + """Test _populate_auth_scheme when auth scheme info not missing.""" + auth_config = Mock(spec=AuthConfig) + auth_config.auth_scheme = implicit_oauth2_scheme + + manager = CredentialManager(auth_config) + assert not await manager._populate_auth_scheme() # no-op + + assert manager._auth_config.auth_scheme == implicit_oauth2_scheme + + def test_is_client_credentials_flow_oauth2_with_client_credentials(self): + """Test _is_client_credentials_flow returns True for OAuth2 with client credentials.""" + from fastapi.openapi.models import OAuth2 + from fastapi.openapi.models import OAuthFlowClientCredentials + from fastapi.openapi.models import OAuthFlows + + # Create OAuth2 scheme with client credentials flow + auth_scheme = OAuth2( + flows=OAuthFlows( + clientCredentials=OAuthFlowClientCredentials( + tokenUrl="https://example.com/token" + ) + ) + ) + + auth_config = Mock(spec=AuthConfig) + auth_config.auth_scheme = auth_scheme + auth_config.raw_auth_credential = None + auth_config.exchanged_auth_credential = None + + manager = CredentialManager(auth_config) + + assert manager._is_client_credentials_flow() is True + + def test_is_client_credentials_flow_oauth2_without_client_credentials(self): + """Test _is_client_credentials_flow returns False for OAuth2 without client credentials.""" + from fastapi.openapi.models import OAuth2 + from fastapi.openapi.models import OAuthFlowAuthorizationCode + from fastapi.openapi.models import OAuthFlows + + # Create OAuth2 scheme with authorization code flow only + auth_scheme = OAuth2( + flows=OAuthFlows( + authorizationCode=OAuthFlowAuthorizationCode( + authorizationUrl="https://example.com/auth", + tokenUrl="https://example.com/token", + ) + ) + ) + + auth_config = Mock(spec=AuthConfig) + auth_config.auth_scheme = auth_scheme + auth_config.raw_auth_credential = None + auth_config.exchanged_auth_credential = None + + manager = CredentialManager(auth_config) + + assert manager._is_client_credentials_flow() is False + + def test_is_client_credentials_flow_oidc_with_client_credentials(self): + """Test _is_client_credentials_flow returns True for OIDC with client credentials.""" + from google.adk.auth.auth_schemes import OpenIdConnectWithConfig + + # Create OIDC scheme with client credentials support + auth_scheme = OpenIdConnectWithConfig( + authorization_endpoint="https://example.com/auth", + token_endpoint="https://example.com/token", + grant_types_supported=["authorization_code", "client_credentials"], + ) + + auth_config = Mock(spec=AuthConfig) + auth_config.auth_scheme = auth_scheme + auth_config.raw_auth_credential = None + auth_config.exchanged_auth_credential = None + + manager = CredentialManager(auth_config) + + assert manager._is_client_credentials_flow() is True + + def test_is_client_credentials_flow_oidc_without_client_credentials(self): + """Test _is_client_credentials_flow returns False for OIDC without client credentials.""" + from google.adk.auth.auth_schemes import OpenIdConnectWithConfig + + # Create OIDC scheme without client credentials support + auth_scheme = OpenIdConnectWithConfig( + authorization_endpoint="https://example.com/auth", + token_endpoint="https://example.com/token", + grant_types_supported=["authorization_code"], + ) + + auth_config = Mock(spec=AuthConfig) + auth_config.auth_scheme = auth_scheme + auth_config.raw_auth_credential = None + auth_config.exchanged_auth_credential = None + + manager = CredentialManager(auth_config) + + assert manager._is_client_credentials_flow() is False + + def test_is_client_credentials_flow_other_scheme(self): + """Test _is_client_credentials_flow returns False for other auth schemes.""" + # Create a non-OAuth2/OIDC scheme + auth_scheme = Mock() + + auth_config = Mock(spec=AuthConfig) + auth_config.auth_scheme = auth_scheme + auth_config.raw_auth_credential = None + auth_config.exchanged_auth_credential = None + + manager = CredentialManager(auth_config) + + assert manager._is_client_credentials_flow() is False + @pytest.fixture def oauth2_auth_scheme(): diff --git a/tests/unittests/auth/test_oauth2_discovery.py b/tests/unittests/auth/test_oauth2_discovery.py new file mode 100644 index 0000000000..473ac61030 --- /dev/null +++ b/tests/unittests/auth/test_oauth2_discovery.py @@ -0,0 +1,285 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import json +from unittest.mock import call +from unittest.mock import Mock +from unittest.mock import patch + +from google.adk.auth.oauth2_discovery import AuthorizationServerMetadata +from google.adk.auth.oauth2_discovery import OAuth2DiscoveryManager +from google.adk.auth.oauth2_discovery import ProtectedResourceMetadata +import httpx +import pytest + + +class TestOAuth2Discovery: + """Tests for the OAuth2DiscoveryManager class.""" + + @pytest.fixture + def auth_server_metadata(self): + """Create AuthorizationServerMetadata object.""" + return AuthorizationServerMetadata( + issuer="https://auth.example.com", + authorization_endpoint="https://auth.example.com/authorize", + token_endpoint="https://auth.example.com/token", + scopes_supported=["read", "write"], + ) + + @pytest.fixture + def resource_metadata(self): + """Create ProtectedResourceMetadata object.""" + return ProtectedResourceMetadata( + resource="https://resource.example.com", + authorization_servers=["https://auth.example.com"], + ) + + @pytest.fixture + def mock_failed_response(self): + """Create a mock HTTP response with a failure status.""" + response = Mock() + response.raise_for_status.side_effect = httpx.HTTPError("Failed") + return response + + @pytest.fixture + def mock_empty_response(self): + """Create a mock HTTP response with an empty JSON body.""" + response = Mock() + response.json = lambda: {} + return response + + @pytest.fixture + def mock_invalid_json_response(self): + """Create a mock HTTP response with an invalid JSON body.""" + response = Mock() + response.json.side_effect = json.decoder.JSONDecodeError( + "Invalid JSON", "invalid_json", 0 + ) + return response + + def mock_success_response(self, json_data): + """Create a mock HTTP successful response with auth server metadata.""" + response = Mock() + response.json = json_data.model_dump + return response + + @patch("httpx.AsyncClient.get") + @pytest.mark.asyncio + async def test_discover_auth_server_metadata_failed( + self, + mock_get, + mock_failed_response, + ): + """Test discovering auth server metadata with failed response.""" + + mock_get.side_effect = mock_failed_response + discovery_manager = OAuth2DiscoveryManager() + result = await discovery_manager.discover_auth_server_metadata( + "https://auth.example.com" + ) + assert not result + mock_get.assert_has_calls([ + call( + "https://auth.example.com/.well-known/oauth-authorization-server", + timeout=5, + ), + call( + "https://auth.example.com/.well-known/openid-configuration", + timeout=5, + ), + ]) + + @pytest.mark.asyncio + async def test_discover_metadata_invalid_url(self): + """Test discovering resource/auth metadata with an invalid URL.""" + discovery_manager = OAuth2DiscoveryManager() + result = await discovery_manager.discover_auth_server_metadata("bad_url") + assert not result + result = await discovery_manager.discover_resource_metadata("bad_url") + assert not result + + @patch("httpx.AsyncClient.get") + @pytest.mark.asyncio + async def test_discover_auth_server_metadata_without_path( + self, + mock_get, + auth_server_metadata, + mock_empty_response, + ): + """Test discovering auth server metadata with an issuer URL without a path.""" + + mock_get.side_effect = [ + mock_empty_response, + self.mock_success_response(auth_server_metadata), + ] + discovery_manager = OAuth2DiscoveryManager() + result = await discovery_manager.discover_auth_server_metadata( + "https://auth.example.com/" + ) + assert result == auth_server_metadata + mock_get.assert_has_calls([ + call( + "https://auth.example.com/.well-known/oauth-authorization-server", + timeout=5, + ), + call( + "https://auth.example.com/.well-known/openid-configuration", + timeout=5, + ), + ]) + + @patch("httpx.AsyncClient.get") + @pytest.mark.asyncio + async def test_discover_auth_server_metadata_with_path( + self, + mock_get, + auth_server_metadata, + mock_failed_response, + mock_invalid_json_response, + ): + """Test discovering auth server metadata with an issuer URL with a path.""" + + auth_server_metadata.issuer = "https://auth.example.com/oauth" + mock_get.side_effect = [ + mock_failed_response, + mock_invalid_json_response, + self.mock_success_response(auth_server_metadata), + ] + discovery_manager = OAuth2DiscoveryManager() + result = await discovery_manager.discover_auth_server_metadata( + "https://auth.example.com/oauth" + ) + assert result == auth_server_metadata + mock_get.assert_has_calls([ + call( + "https://auth.example.com/.well-known/oauth-authorization-server/oauth", + timeout=5, + ), + call( + "https://auth.example.com/.well-known/openid-configuration/oauth", + timeout=5, + ), + call( + "https://auth.example.com/oauth/.well-known/openid-configuration", + timeout=5, + ), + ]) + + @patch("httpx.AsyncClient.get") + @pytest.mark.asyncio + async def test_discover_auth_server_metadata_discard_mismatched_issuer( + self, + mock_get, + auth_server_metadata, + ): + """Test discover_auth_server_metadata() discards response with mismatched issuer.""" + + bad_auth_server_metadata = auth_server_metadata.model_copy( + update={"issuer": "https://bad.example.com"} + ) + mock_get.side_effect = [ + self.mock_success_response(bad_auth_server_metadata), + self.mock_success_response(auth_server_metadata), + ] + discovery_manager = OAuth2DiscoveryManager() + result = await discovery_manager.discover_auth_server_metadata( + "https://auth.example.com" + ) + assert result == auth_server_metadata + mock_get.assert_has_calls([ + call( + "https://auth.example.com/.well-known/oauth-authorization-server", + timeout=5, + ), + call( + "https://auth.example.com/.well-known/openid-configuration", + timeout=5, + ), + ]) + + @patch("httpx.AsyncClient.get") + @pytest.mark.asyncio + async def test_discover_resource_metadata_failed( + self, + mock_get, + mock_failed_response, + ): + """Test discovering resource metadata fails.""" + + mock_get.return_value = mock_failed_response + discovery_manager = OAuth2DiscoveryManager() + result = await discovery_manager.discover_resource_metadata( + "https://resource.example.com" + ) + assert not result + mock_get.assert_called_once_with( + "https://resource.example.com/.well-known/oauth-protected-resource", + timeout=5, + ) + + @patch("httpx.AsyncClient.get") + @pytest.mark.asyncio + async def test_discover_resource_metadata_without_path( + self, mock_get, resource_metadata + ): + """Test discovering resource metadata with a resource URL without a path.""" + mock_get.return_value = self.mock_success_response(resource_metadata) + discovery_manager = OAuth2DiscoveryManager() + result = await discovery_manager.discover_resource_metadata( + "https://resource.example.com/" + ) + assert result == resource_metadata + mock_get.assert_called_once_with( + "https://resource.example.com/.well-known/oauth-protected-resource", + timeout=5, + ) + + @patch("httpx.AsyncClient.get") + @pytest.mark.asyncio + async def test_discover_resource_metadata_with_path( + self, mock_get, resource_metadata + ): + """Test discovering resource metadata with a resource URL with a path.""" + resource_metadata.resource = "https://resource.example.com/tenant1" + mock_get.return_value = self.mock_success_response(resource_metadata) + discovery_manager = OAuth2DiscoveryManager() + result = await discovery_manager.discover_resource_metadata( + "https://resource.example.com/tenant1" + ) + assert result == resource_metadata + mock_get.assert_called_once_with( + "https://resource.example.com/.well-known/oauth-protected-resource/tenant1", + timeout=5, + ) + + @patch("httpx.AsyncClient.get") + @pytest.mark.asyncio + async def test_discover_resource_metadata_discard_mismatched_resource( + self, + mock_get, + resource_metadata, + ): + """Test discover_resource_metadata() discards response with mismatched resource.""" + + resource_metadata.resource = "https://bad.example.com" + mock_get.return_value = self.mock_success_response(resource_metadata) + discovery_manager = OAuth2DiscoveryManager() + result = await discovery_manager.discover_resource_metadata( + "https://resource.example.com" + ) + assert not result + mock_get.assert_called_once_with( + "https://resource.example.com/.well-known/oauth-protected-resource", + timeout=5, + ) diff --git a/tests/unittests/cli/conformance/test_adk_web_server_client.py b/tests/unittests/cli/conformance/test_adk_web_server_client.py index 642b10a144..b2bfc43c6d 100644 --- a/tests/unittests/cli/conformance/test_adk_web_server_client.py +++ b/tests/unittests/cli/conformance/test_adk_web_server_client.py @@ -127,6 +127,43 @@ async def test_delete_session(): mock_response.raise_for_status.assert_called_once() +@pytest.mark.asyncio +async def test_update_session(): + client = AdkWebServerClient() + + # Mock the HTTP response + mock_response = MagicMock() + mock_response.json.return_value = { + "id": "test_session", + "app_name": "test_app", + "user_id": "test_user", + "events": [], + "state": {"key": "updated_value", "new_key": "new_value"}, + } + + with patch("httpx.AsyncClient") as mock_client_class: + mock_client = AsyncMock() + mock_client.patch.return_value = mock_response + mock_client_class.return_value = mock_client + + state_delta = {"key": "updated_value", "new_key": "new_value"} + session = await client.update_session( + app_name="test_app", + user_id="test_user", + session_id="test_session", + state_delta=state_delta, + ) + + assert isinstance(session, Session) + assert session.id == "test_session" + assert session.state == {"key": "updated_value", "new_key": "new_value"} + mock_client.patch.assert_called_once_with( + "/apps/test_app/users/test_user/sessions/test_session", + json={"state_delta": state_delta}, + ) + mock_response.raise_for_status.assert_called_once() + + @pytest.mark.asyncio async def test_run_agent(): client = AdkWebServerClient() diff --git a/tests/unittests/cli/test_fast_api.py b/tests/unittests/cli/test_fast_api.py index d1e8dcabc2..f4a84179be 100755 --- a/tests/unittests/cli/test_fast_api.py +++ b/tests/unittests/cli/test_fast_api.py @@ -22,12 +22,14 @@ import time from typing import Any from typing import Optional +from unittest.mock import AsyncMock from unittest.mock import MagicMock from unittest.mock import patch from fastapi.testclient import TestClient from google.adk.agents.base_agent import BaseAgent from google.adk.agents.run_config import RunConfig +from google.adk.apps.app import App from google.adk.cli.fast_api import get_fast_api_app from google.adk.evaluation.eval_case import EvalCase from google.adk.evaluation.eval_case import Invocation @@ -37,7 +39,9 @@ from google.adk.events.event import Event from google.adk.events.event_actions import EventActions from google.adk.runners import Runner -from google.adk.sessions.base_session_service import ListSessionsResponse +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.sessions.session import Session +from google.adk.sessions.state import State from google.genai import types from pydantic import BaseModel import pytest @@ -150,28 +154,6 @@ class _MockEvalCaseResult(BaseModel): eval_metric_result_per_invocation: list = {} -# Mock for the run_evals function, tailored for test_run_eval -async def mock_run_evals_for_fast_api(*args, **kwargs): - # This is what the test_run_eval expects for its assertions - yield _MockEvalCaseResult( - eval_set_id="test_eval_set_id", # Matches expected in verify_eval_case_result - eval_id="test_eval_case_id", # Matches expected - final_eval_status=1, # Matches expected (assuming 1 is PASSED) - user_id="test_user", # Placeholder, adapt if needed - session_id="test_session_for_eval_case", # Placeholder - eval_set_file="test_eval_set_file", # Placeholder - overall_eval_metric_results=[{ # Matches expected - "metricName": "tool_trajectory_avg_score", - "threshold": 0.5, - "score": 1.0, - "evalStatus": 1, - }], - # Provide other fields if RunEvalResult or subsequent processing needs them - eval_metric_results=[], - eval_metric_result_per_invocation=[], - ) - - ################################################# # Test Fixtures ################################################# @@ -213,82 +195,8 @@ def list_agents(self): @pytest.fixture def mock_session_service(): - """Create a mock session service that uses an in-memory dictionary.""" - - # In-memory database to store sessions during testing - session_data = { - "test_app": { - "test_user": { - "test_session": { - "id": "test_session", - "app_name": "test_app", - "user_id": "test_user", - "events": [], - "state": {}, - "created_at": time.time(), - } - } - } - } - - # Mock session service class that operates on the in-memory database - class MockSessionService: - - async def get_session(self, app_name, user_id, session_id): - """Retrieve a session by ID.""" - if ( - app_name in session_data - and user_id in session_data[app_name] - and session_id in session_data[app_name][user_id] - ): - return session_data[app_name][user_id][session_id] - return None - - async def create_session( - self, app_name, user_id, state=None, session_id=None - ): - """Create a new session.""" - if session_id is None: - session_id = f"session_{int(time.time())}" - - # Initialize app_name and user_id if they don't exist - if app_name not in session_data: - session_data[app_name] = {} - if user_id not in session_data[app_name]: - session_data[app_name][user_id] = {} - - # Create the session - session = { - "id": session_id, - "app_name": app_name, - "user_id": user_id, - "events": [], - "state": state or {}, - } - - session_data[app_name][user_id][session_id] = session - return session - - async def list_sessions(self, app_name, user_id): - """List all sessions for a user.""" - if app_name not in session_data or user_id not in session_data[app_name]: - return {"sessions": []} - - return ListSessionsResponse( - sessions=list(session_data[app_name][user_id].values()) - ) - - async def delete_session(self, app_name, user_id, session_id): - """Delete a session.""" - if ( - app_name in session_data - and user_id in session_data[app_name] - and session_id in session_data[app_name][user_id] - ): - del session_data[app_name][user_id][session_id] - - # Return an instance of our mock service - return MockSessionService() + """Create an in-memory session service instance for testing.""" + return InMemorySessionService() @pytest.fixture @@ -344,7 +252,7 @@ async def delete_artifact(self, app_name, user_id, session_id, filename): @pytest.fixture def mock_memory_service(): """Create a mock memory service.""" - return MagicMock() + return AsyncMock() @pytest.fixture @@ -434,10 +342,6 @@ def test_app( "google.adk.cli.fast_api.LocalEvalSetResultsManager", return_value=mock_eval_set_results_manager, ), - patch( - "google.adk.cli.cli_eval.run_evals", # Patch where it's imported in fast_api.py - new=mock_run_evals_for_fast_api, - ), ): # Get the FastAPI app, but don't actually run it app = get_fast_api_app( @@ -472,7 +376,7 @@ async def create_test_session( state={}, ) - logger.info(f"Created test session: {session['id']}") + logger.info(f"Created test session: {session.id}") return test_session_info @@ -585,10 +489,6 @@ def test_app_with_a2a( "google.adk.cli.fast_api.LocalEvalSetResultsManager", return_value=mock_eval_set_results_manager, ), - patch( - "google.adk.cli.cli_eval.run_evals", - new=mock_run_evals_for_fast_api, - ), patch("a2a.server.tasks.InMemoryTaskStore") as mock_task_store, patch( "google.adk.a2a.executor.a2a_agent_executor.A2aAgentExecutor" @@ -665,6 +565,22 @@ def test_create_session_with_id(test_app, test_session_info): logger.info(f"Created session with ID: {data['id']}") +def test_create_session_with_id_already_exists(test_app, test_session_info): + """Test creating a session with an ID that already exists.""" + session_id = "existing_session_id" + url = f"/apps/{test_session_info['app_name']}/users/{test_session_info['user_id']}/sessions/{session_id}" + + # Create the session for the first time + response = test_app.post(url, json={"state": {}}) + assert response.status_code == 200 + + # Attempt to create it again + response = test_app.post(url, json={"state": {}}) + assert response.status_code == 409 + assert "Session already exists" in response.json()["detail"] + logger.info("Verified 409 on duplicate session creation.") + + def test_create_session_without_id(test_app, test_session_info): """Test creating a session with a generated ID.""" url = f"/apps/{test_session_info['app_name']}/users/{test_session_info['user_id']}/sessions" @@ -724,6 +640,78 @@ def test_delete_session(test_app, create_test_session): logger.info("Session deleted successfully") +def test_update_session(test_app, create_test_session): + """Test patching a session state.""" + info = create_test_session + url = f"/apps/{info['app_name']}/users/{info['user_id']}/sessions/{info['session_id']}" + + # Get the original session + response = test_app.get(url) + assert response.status_code == 200 + original_session = response.json() + original_state = original_session.get("state", {}) + + # Prepare state delta + state_delta = {"test_key": "test_value", "counter": 42} + + # Patch the session + response = test_app.patch(url, json={"state_delta": state_delta}) + assert response.status_code == 200 + + # Verify the response + patched_session = response.json() + assert patched_session["id"] == info["session_id"] + + # Verify state was updated correctly + expected_state = {**original_state, **state_delta} + assert patched_session["state"] == expected_state + + # Verify the session was actually updated in storage + response = test_app.get(url) + assert response.status_code == 200 + retrieved_session = response.json() + assert retrieved_session["state"] == expected_state + + # Verify an event was created for the state change + events = retrieved_session.get("events", []) + assert len(events) > len(original_session.get("events", [])) + + # Find the state patch event (looking for "p-" prefix pattern) + state_patch_events = [ + event + for event in events + if event.get("invocationId", "").startswith("p-") + ] + + assert len(state_patch_events) == 1, ( + f"Expected 1 state_patch event, found {len(state_patch_events)}. Events:" + f" {events}" + ) + state_patch_event = state_patch_events[0] + assert state_patch_event["author"] == "user" + + # Check for actions in both camelCase and snake_case + actions = state_patch_event.get("actions") + assert actions is not None, f"No actions found in event: {state_patch_event}" + state_delta_in_event = actions.get("stateDelta") + assert state_delta_in_event == state_delta + + logger.info("Session state patched successfully") + + +def test_patch_session_not_found(test_app, test_session_info): + """Test patching a non-existent session.""" + info = test_session_info + url = f"/apps/{info['app_name']}/users/{info['user_id']}/sessions/nonexistent" + + state_delta = {"test_key": "test_value"} + response = test_app.patch(url, json={"state_delta": state_delta}) + + assert response.status_code == 404 + assert "Session not found" in response.json()["detail"] + logger.info("Patch session not found test passed") + + def test_agent_run(test_app, create_test_session): """Test running an agent with a message.""" info = create_test_session @@ -755,7 +743,7 @@ def test_agent_run(test_app, create_test_session): ) # Third event should have interrupted flag - assert data[2]["interrupted"] == True + assert data[2]["interrupted"] is True logger.info("Agent run test completed successfully") @@ -916,6 +904,56 @@ def test_debug_trace(test_app): logger.info("Debug trace test completed successfully") +def test_get_event_graph_returns_dot_src_for_app_agent(): + """Ensure graph endpoint unwraps App instances before building the graph.""" + from google.adk.cli.adk_web_server import AdkWebServer + + root_agent = DummyAgent(name="dummy_agent") + app_agent = App(name="test_app", root_agent=root_agent) + + class Loader: + + def load_agent(self, app_name): + return app_agent + + def list_agents(self): + return [app_agent.name] + + session_service = AsyncMock() + session = Session( + id="session_id", + app_name="test_app", + user_id="user", + state={}, + events=[Event(author="dummy_agent")], + ) + event_id = session.events[0].id + session_service.get_session.return_value = session + + adk_web_server = AdkWebServer( + agent_loader=Loader(), + session_service=session_service, + memory_service=MagicMock(), + artifact_service=MagicMock(), + credential_service=MagicMock(), + eval_sets_manager=MagicMock(), + eval_set_results_manager=MagicMock(), + agents_dir=".", + ) + + fast_api_app = adk_web_server.get_fast_api_app( + setup_observer=lambda _observer, _server: None, + tear_down_observer=lambda _observer, _server: None, + ) + + client = TestClient(fast_api_app) + response = client.get( + f"/apps/test_app/users/user/sessions/session_id/events/{event_id}/graph" + ) + assert response.status_code == 200 + assert "dotSrc" in response.json() + + @pytest.mark.skipif( sys.version_info < (3, 10), reason="A2A requires Python 3.10+" ) @@ -939,5 +977,18 @@ def test_a2a_disabled_by_default(test_app): logger.info("A2A disabled by default test passed") +def test_patch_memory(test_app, create_test_session, mock_memory_service): + """Test adding a session to memory.""" + info = create_test_session + url = f"/apps/{info['app_name']}/users/{info['user_id']}/memory" + payload = {"session_id": info["session_id"]} + response = test_app.patch(url, json=payload) + + # Verify the response + assert response.status_code == 200 + mock_memory_service.add_session_to_memory.assert_called_once() + logger.info("Add session to memory test completed successfully") + + if __name__ == "__main__": pytest.main(["-xvs", __file__]) diff --git a/tests/unittests/cli/test_service_registry.py b/tests/unittests/cli/test_service_registry.py new file mode 100644 index 0000000000..b877703a08 --- /dev/null +++ b/tests/unittests/cli/test_service_registry.py @@ -0,0 +1,169 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from unittest.mock import patch + +import pytest + + +@pytest.fixture(autouse=True) +def mock_services(): + """Mock all service implementation classes to avoid real instantiation.""" + with ( + patch( + "google.adk.sessions.vertex_ai_session_service.VertexAiSessionService" + ) as mock_vertex_session, + patch( + "google.adk.sessions.database_session_service.DatabaseSessionService" + ) as mock_db_session, + patch( + "google.adk.artifacts.gcs_artifact_service.GcsArtifactService" + ) as mock_gcs_artifact, + patch( + "google.adk.memory.vertex_ai_rag_memory_service.VertexAiRagMemoryService" + ) as mock_rag_memory, + patch( + "google.adk.memory.vertex_ai_memory_bank_service.VertexAiMemoryBankService" + ) as mock_agentengine_memory, + ): + yield { + "vertex_session": mock_vertex_session, + "db_session": mock_db_session, + "gcs_artifact": mock_gcs_artifact, + "rag_memory": mock_rag_memory, + "agentengine_memory": mock_agentengine_memory, + } + + +@pytest.fixture +def registry(): + from google.adk.cli.service_registry import get_service_registry + + return get_service_registry() + + +# Session Service Tests +def test_create_session_service_sqlite(registry, mock_services): + registry.create_session_service("sqlite:///test.db") + mock_services["db_session"].assert_called_once_with( + db_url="sqlite:///test.db" + ) + + +def test_create_session_service_sqlite_with_kwargs(registry, mock_services): + registry.create_session_service( + "sqlite:///test.db", pool_size=10, agents_dir="foo" + ) + mock_services["db_session"].assert_called_once_with( + db_url="sqlite:///test.db", pool_size=10 + ) + + +def test_create_session_service_postgresql(registry, mock_services): + registry.create_session_service("postgresql://user:pass@host/db") + mock_services["db_session"].assert_called_once_with( + db_url="postgresql://user:pass@host/db" + ) + + +@patch("google.adk.cli.utils.envs.load_dotenv_for_agent") +def test_create_session_service_agentengine_short( + mock_load_dotenv, registry, mock_services, monkeypatch +): + monkeypatch.setenv("GOOGLE_CLOUD_PROJECT", "test-project") + monkeypatch.setenv("GOOGLE_CLOUD_LOCATION", "us-central1") + registry.create_session_service( + "agentengine://123", agents_dir="/path/to/agents" + ) + mock_services["vertex_session"].assert_called_once_with( + project="test-project", location="us-central1", agent_engine_id="123" + ) + mock_load_dotenv.assert_called_once_with("", "/path/to/agents") + + +def test_create_session_service_agentengine_full(registry, mock_services): + uri = "agentengine://projects/p/locations/l/reasoningEngines/123" + registry.create_session_service(uri, agents_dir="/path/to/agents") + mock_services["vertex_session"].assert_called_once_with( + project="p", location="l", agent_engine_id="123" + ) + + +# Artifact Service Tests +def test_create_artifact_service_gcs(registry, mock_services): + registry.create_artifact_service( + "gs://my-bucket/path/prefix", agents_dir="foo", other_kwarg="bar" + ) + mock_services["gcs_artifact"].assert_called_once_with( + bucket_name="my-bucket", other_kwarg="bar" + ) + + +# Memory Service Tests +@patch("google.adk.cli.utils.envs.load_dotenv_for_agent") +def test_create_memory_service_rag( + mock_load_dotenv, registry, mock_services, monkeypatch +): + monkeypatch.setenv("GOOGLE_CLOUD_PROJECT", "test-project") + monkeypatch.setenv("GOOGLE_CLOUD_LOCATION", "us-central1") + registry.create_memory_service( + "rag://corpus-123", agents_dir="/path/to/agents" + ) + mock_services["rag_memory"].assert_called_once_with( + rag_corpus=( + "projects/test-project/locations/us-central1/ragCorpora/corpus-123" + ) + ) + mock_load_dotenv.assert_called_once_with("", "/path/to/agents") + + +@patch("google.adk.cli.utils.envs.load_dotenv_for_agent") +def test_create_memory_service_agentengine_short( + mock_load_dotenv, registry, mock_services, monkeypatch +): + monkeypatch.setenv("GOOGLE_CLOUD_PROJECT", "test-project") + monkeypatch.setenv("GOOGLE_CLOUD_LOCATION", "us-central1") + registry.create_memory_service( + "agentengine://456", agents_dir="/path/to/agents" + ) + mock_services["agentengine_memory"].assert_called_once_with( + project="test-project", location="us-central1", agent_engine_id="456" + ) + mock_load_dotenv.assert_called_once_with("", "/path/to/agents") + + +def test_create_memory_service_agentengine_full(registry, mock_services): + uri = "agentengine://projects/p/locations/l/reasoningEngines/456" + registry.create_memory_service(uri, agents_dir="/path/to/agents") + mock_services["agentengine_memory"].assert_called_once_with( + project="p", location="l", agent_engine_id="456" + ) + + +# General Tests +def test_unsupported_scheme(registry, mock_services): + session_service = registry.create_session_service("unsupported://foo") + artifact_service = registry.create_artifact_service("unsupported://foo") + memory_service = registry.create_memory_service("unsupported://foo") + assert session_service is None + assert artifact_service is None + assert memory_service is None + for service in [ + "vertex_session", + "db_session", + "gcs_artifact", + "rag_memory", + "agentengine_memory", + ]: + mock_services[service].assert_not_called() diff --git a/tests/unittests/cli/utils/test_agent_loader.py b/tests/unittests/cli/utils/test_agent_loader.py index 4e6e254ec0..c314329631 100644 --- a/tests/unittests/cli/utils/test_agent_loader.py +++ b/tests/unittests/cli/utils/test_agent_loader.py @@ -286,7 +286,7 @@ def test_agent_not_found_error(self): loader = AgentLoader(temp_dir) agents_dir = temp_dir # For use in the expected message string - # Try to load non-existent agent + # Try to load nonexistent agent with pytest.raises(ValueError) as exc_info: loader.load_agent("nonexistent_agent") @@ -328,12 +328,12 @@ def __init__(self): assert "No root_agent found for 'broken_agent'" in str(exc_info.value) def test_agent_internal_module_not_found_error(self): - """Test error when an agent tries to import a non-existent module.""" + """Test error when an agent tries to import a nonexistent module.""" with tempfile.TemporaryDirectory() as temp_dir: temp_path = Path(temp_dir) agent_name = "importer_agent" - # Create agent that imports a non-existent module + # Create agent that imports a nonexistent module agent_file = temp_path / f"{agent_name}.py" agent_file.write_text(dedent(f""" from google.adk.agents.base_agent import BaseAgent @@ -526,7 +526,7 @@ def test_yaml_agent_not_found_error(self): loader = AgentLoader(temp_dir) agents_dir = temp_dir # For use in the expected message string - # Try to load non-existent YAML agent + # Try to load nonexistent YAML agent with pytest.raises(ValueError) as exc_info: loader.load_agent("nonexistent_yaml_agent") diff --git a/tests/unittests/cli/utils/test_cli_deploy.py b/tests/unittests/cli/utils/test_cli_deploy.py index b2a31f70f3..696344eb44 100644 --- a/tests/unittests/cli/utils/test_cli_deploy.py +++ b/tests/unittests/cli/utils/test_cli_deploy.py @@ -95,34 +95,6 @@ def _factory(include_requirements: bool, include_env: bool) -> Path: return _factory -@pytest.fixture -def mock_vertex_ai( - monkeypatch: pytest.MonkeyPatch, -) -> Generator[mock.MagicMock, None, None]: - """Mocks the entire vertexai module and its sub-modules.""" - mock_vertexai = mock.MagicMock() - mock_agent_engines = mock.MagicMock() - mock_vertexai.agent_engines = mock_agent_engines - mock_vertexai.init = mock.MagicMock() - mock_agent_engines.create = mock.MagicMock() - mock_agent_engines.ModuleAgent = mock.MagicMock( - return_value="mock-agent-engine-object" - ) - - sys.modules["vertexai"] = mock_vertexai - sys.modules["vertexai.agent_engines"] = mock_agent_engines - - mock_dotenv = mock.MagicMock() - mock_dotenv.dotenv_values = mock.MagicMock(return_value={"FILE_VAR": "value"}) - sys.modules["dotenv"] = mock_dotenv - - yield mock_vertexai - - del sys.modules["vertexai"] - del sys.modules["vertexai.agent_engines"] - del sys.modules["dotenv"] - - # _resolve_project def test_resolve_project_with_option() -> None: """It should return the explicit project value untouched.""" @@ -216,80 +188,6 @@ def test_get_service_option_by_adk_version( assert actual.rstrip() == expected.rstrip() -@pytest.mark.usefixtures("mock_vertex_ai") -@pytest.mark.parametrize("has_reqs", [True, False]) -@pytest.mark.parametrize("has_env", [True, False]) -def test_to_agent_engine_happy_path( - monkeypatch: pytest.MonkeyPatch, - agent_dir: Callable[[bool, bool], Path], - tmp_path: Path, - has_reqs: bool, - has_env: bool, -) -> None: - """ - Tests the happy path for the `to_agent_engine` function. - """ - src_dir = agent_dir(has_reqs, has_env) - temp_folder = tmp_path / "build" - app_name = src_dir.name - rmtree_recorder = _Recorder() - - monkeypatch.setattr(shutil, "rmtree", rmtree_recorder) - - cli_deploy.to_agent_engine( - agent_folder=str(src_dir), - temp_folder=str(temp_folder), - adk_app="my_adk_app", - staging_bucket="gs://my-staging-bucket", - trace_to_cloud=True, - project="my-gcp-project", - region="us-central1", - display_name="My Test Agent", - description="A test agent.", - ) - - assert (temp_folder / app_name / "agent.py").is_file() - assert (temp_folder / app_name / "__init__.py").is_file() - - adk_app_path = temp_folder / "my_adk_app.py" - assert adk_app_path.is_file() - content = adk_app_path.read_text() - assert f"from {app_name}.agent import root_agent" in content - assert "adk_app = AdkApp(" in content - assert "enable_tracing=True" in content - - reqs_path = temp_folder / app_name / "requirements.txt" - assert reqs_path.is_file() - if not has_reqs: - assert "google-cloud-aiplatform[adk,agent_engines]" in reqs_path.read_text() - - vertexai = sys.modules["vertexai"] - vertexai.init.assert_called_once_with( - project="my-gcp-project", - location="us-central1", - staging_bucket="gs://my-staging-bucket", - ) - - dotenv = sys.modules["dotenv"] - if has_env: - dotenv.dotenv_values.assert_called_once() - expected_env_vars = {"FILE_VAR": "value"} - else: - dotenv.dotenv_values.assert_not_called() - expected_env_vars = None - - vertexai.agent_engines.create.assert_called_once() - create_kwargs = vertexai.agent_engines.create.call_args.kwargs - assert create_kwargs["agent_engine"] == "mock-agent-engine-object" - assert create_kwargs["display_name"] == "My Test Agent" - assert create_kwargs["description"] == "A test agent." - assert create_kwargs["requirements"] == str(reqs_path) - assert create_kwargs["extra_packages"] == [str(temp_folder)] - assert create_kwargs["env_vars"] == expected_env_vars - - assert str(rmtree_recorder.get_last_call_args()[0]) == str(temp_folder) - - @pytest.mark.parametrize("include_requirements", [True, False]) def test_to_gke_happy_path( monkeypatch: pytest.MonkeyPatch, diff --git a/tests/unittests/cli/utils/test_cli_eval.py b/tests/unittests/cli/utils/test_cli_eval.py new file mode 100644 index 0000000000..8ff33dd9a1 --- /dev/null +++ b/tests/unittests/cli/utils/test_cli_eval.py @@ -0,0 +1,51 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Unit tests for utilities in cli_eval.""" + +from __future__ import annotations + +from types import SimpleNamespace +from unittest import mock + + +def test_get_eval_sets_manager_local(monkeypatch): + mock_local_manager = mock.MagicMock() + monkeypatch.setattr( + "google.adk.evaluation.local_eval_sets_manager.LocalEvalSetsManager", + lambda *a, **k: mock_local_manager, + ) + from google.adk.cli.cli_eval import get_eval_sets_manager + + manager = get_eval_sets_manager(eval_storage_uri=None, agents_dir="some/dir") + assert manager == mock_local_manager + + +def test_get_eval_sets_manager_gcs(monkeypatch): + mock_gcs_manager = mock.MagicMock() + mock_create_gcs = mock.MagicMock() + mock_create_gcs.return_value = SimpleNamespace( + eval_sets_manager=mock_gcs_manager + ) + monkeypatch.setattr( + "google.adk.cli.utils.evals.create_gcs_eval_managers_from_uri", + mock_create_gcs, + ) + from google.adk.cli.cli_eval import get_eval_sets_manager + + manager = get_eval_sets_manager( + eval_storage_uri="gs://bucket", agents_dir="some/dir" + ) + assert manager == mock_gcs_manager + mock_create_gcs.assert_called_once_with("gs://bucket") diff --git a/tests/unittests/cli/utils/test_cli_tools_click.py b/tests/unittests/cli/utils/test_cli_tools_click.py index 138289ed2e..be9015ca87 100644 --- a/tests/unittests/cli/utils/test_cli_tools_click.py +++ b/tests/unittests/cli/utils/test_cli_tools_click.py @@ -18,6 +18,7 @@ from __future__ import annotations import builtins +import json from pathlib import Path from types import SimpleNamespace from typing import Any @@ -620,6 +621,141 @@ def test_cli_eval_with_eval_set_id( assert len(eval_set_results) == 2 +def test_cli_create_eval_set(tmp_path: Path): + app_name = "test_app" + eval_set_id = "test_eval_set" + agent_path = tmp_path / app_name + agent_path.mkdir() + (agent_path / "__init__.py").touch() + + runner = CliRunner() + result = runner.invoke( + cli_tools_click.main, + ["eval_set", "create", str(agent_path), eval_set_id], + ) + + assert result.exit_code == 0 + eval_set_file = agent_path / f"{eval_set_id}.evalset.json" + assert eval_set_file.exists() + with open(eval_set_file, "r") as f: + eval_set_data = json.load(f) + assert eval_set_data["eval_set_id"] == eval_set_id + assert eval_set_data["eval_cases"] == [] + + +def test_cli_add_eval_case_with_session(tmp_path: Path): + app_name = "test_app_add_2" + eval_set_id = "test_eval_set_add_2" + agent_path = tmp_path / app_name + agent_path.mkdir() + (agent_path / "__init__.py").touch() + + scenarios_file = tmp_path / "scenarios2.json" + scenarios_file.write_text( + '{"scenarios": [{"starting_prompt": "hello", "conversation_plan":' + ' "world"}]}' + ) + session_file = tmp_path / "session2.json" + session_file.write_text( + '{"app_name": "test_app_add_2", "user_id": "test_user", "state": {}}' + ) + + runner = CliRunner() + runner.invoke( + cli_tools_click.main, + ["eval_set", "create", str(agent_path), eval_set_id], + catch_exceptions=False, + ) + result = runner.invoke( + cli_tools_click.main, + [ + "eval_set", + "add_eval_case", + str(agent_path), + eval_set_id, + "--scenarios_file", + str(scenarios_file), + "--session_input_file", + str(session_file), + ], + catch_exceptions=False, + ) + + assert result.exit_code == 0 + eval_set_file = agent_path / f"{eval_set_id}.evalset.json" + assert eval_set_file.exists() + with open(eval_set_file, "r") as f: + eval_set_data = json.load(f) + assert len(eval_set_data["eval_cases"]) == 1 + eval_case = eval_set_data["eval_cases"][0] + assert eval_case["eval_id"] == "0a1a5048" + assert eval_case["session_input"]["app_name"] == "test_app_add_2" + + +def test_cli_add_eval_case_skip_existing(tmp_path: Path): + app_name = "test_app_add_3" + eval_set_id = "test_eval_set_add_3" + agent_path = tmp_path / app_name + agent_path.mkdir() + (agent_path / "__init__.py").touch() + + scenarios_file = tmp_path / "scenarios3.json" + scenarios_file.write_text( + '{"scenarios": [{"starting_prompt": "hello", "conversation_plan":' + ' "world"}]}' + ) + session_file = tmp_path / "session3.json" + session_file.write_text( + '{"app_name": "test_app_add_3", "user_id": "test_user", "state": {}}' + ) + + runner = CliRunner() + runner.invoke( + cli_tools_click.main, + ["eval_set", "create", str(agent_path), eval_set_id], + catch_exceptions=False, + ) + result1 = runner.invoke( + cli_tools_click.main, + [ + "eval_set", + "add_eval_case", + str(agent_path), + eval_set_id, + "--scenarios_file", + str(scenarios_file), + "--session_input_file", + str(session_file), + ], + catch_exceptions=False, + ) + eval_set_file = agent_path / f"{eval_set_id}.evalset.json" + with open(eval_set_file, "r") as f: + eval_set_data1 = json.load(f) + + result2 = runner.invoke( + cli_tools_click.main, + [ + "eval_set", + "add_eval_case", + str(agent_path), + eval_set_id, + "--scenarios_file", + str(scenarios_file), + "--session_input_file", + str(session_file), + ], + catch_exceptions=False, + ) + with open(eval_set_file, "r") as f: + eval_set_data2 = json.load(f) + + assert result1.exit_code == 0 + assert result2.exit_code == 0 + assert len(eval_set_data1["eval_cases"]) == 1 + assert len(eval_set_data2["eval_cases"]) == 1 + + def test_cli_deploy_cloud_run_gcloud_arg_conflict( tmp_path: Path, monkeypatch: pytest.MonkeyPatch ) -> None: diff --git a/tests/unittests/cli/utils/test_evals.py b/tests/unittests/cli/utils/test_evals.py index e73a4cbd30..0438278cda 100644 --- a/tests/unittests/cli/utils/test_evals.py +++ b/tests/unittests/cli/utils/test_evals.py @@ -14,421 +14,50 @@ """Tests for utilities in eval.""" - -from google.adk.cli.utils.evals import convert_session_to_eval_format -from google.adk.events.event import Event -from google.adk.sessions.session import Session -from google.genai import types - - -def build_event(author: str, parts_content: list[dict]) -> Event: - """Builds an Event object with specified parts.""" - parts = [] - for p_data in parts_content: - part_args = {} - if "text" in p_data: - part_args["text"] = p_data["text"] - if "func_name" in p_data: - part_args["function_call"] = types.FunctionCall( - name=p_data.get("func_name"), args=p_data.get("func_args") - ) - # Add other part types here if needed for future tests - parts.append(types.Part(**part_args)) - return Event(author=author, content=types.Content(parts=parts)) - - -def test_convert_empty_session(): - """Test conversion function with empty events list in Session.""" - # Pydantic models require mandatory fields for instantiation - session_empty_events = Session( - id="s1", app_name="app", user_id="u1", events=[] +import os +from unittest import mock + +from google.adk.cli.utils import evals +from google.adk.evaluation.gcs_eval_set_results_manager import GcsEvalSetResultsManager +from google.adk.evaluation.gcs_eval_sets_manager import GcsEvalSetsManager +import pytest + + +@mock.patch.dict(os.environ, {'GOOGLE_CLOUD_PROJECT': 'test-project'}) +@mock.patch( + 'google.adk.cli.utils.evals.GcsEvalSetResultsManager', + autospec=True, +) +@mock.patch( + 'google.adk.cli.utils.evals.GcsEvalSetsManager', + autospec=True, +) +def test_create_gcs_eval_managers_from_uri_success( + mock_gcs_eval_sets_manager, mock_gcs_eval_set_results_manager +): + mock_gcs_eval_sets_manager.return_value = mock.MagicMock( + spec=GcsEvalSetsManager + ) + mock_gcs_eval_set_results_manager.return_value = mock.MagicMock( + spec=GcsEvalSetResultsManager ) - assert not convert_session_to_eval_format(session_empty_events) - - -def test_convert_none_session(): - """Test conversion function with None Session.""" - assert not convert_session_to_eval_format(None) - - -def test_convert_session_skips_initial_non_user_events(): - """Test conversion function with only user events.""" - events = [ - build_event("model", [{"text": "Hello"}]), - build_event("user", [{"text": "How are you?"}]), - ] - session = Session(id="s1", app_name="app", user_id="u1", events=events) - expected = [ - { - "query": "How are you?", - "expected_tool_use": [], - "expected_intermediate_agent_responses": [], - "reference": "", - }, - ] - assert convert_session_to_eval_format(session) == expected - - -def test_convert_single_turn_text_only(): - """Test a single user query followed by a single agent text response.""" - events = [ - build_event("user", [{"text": "What is the time?"}]), - build_event("root_agent", [{"text": "It is 3 PM."}]), - ] - session = Session(id="s1", app_name="app", user_id="u1", events=events) - expected = [{ - "query": "What is the time?", - "expected_tool_use": [], - "expected_intermediate_agent_responses": [], - "reference": "It is 3 PM.", - }] - assert convert_session_to_eval_format(session) == expected - - -def test_convert_single_turn_tool_only(): - """Test a single user query followed by a single agent tool call.""" - events = [ - build_event("user", [{"text": "Get weather for Seattle"}]), - build_event( - "root_agent", - [{"func_name": "get_weather", "func_args": {"city": "Seattle"}}], - ), - ] - session = Session(id="s1", app_name="app", user_id="u1", events=events) - expected = [{ - "query": "Get weather for Seattle", - "expected_tool_use": [ - {"tool_name": "get_weather", "tool_input": {"city": "Seattle"}} - ], - "expected_intermediate_agent_responses": [], - "reference": "", - }] - assert convert_session_to_eval_format(session) == expected - - -def test_convert_single_turn_multiple_tools_and_texts(): - """Test a turn with multiple agent responses (tools and text).""" - events = [ - build_event("user", [{"text": "Do task A then task B"}]), - build_event( - "root_agent", [{"text": "Okay, starting task A."}] - ), # Intermediate Text 1 - build_event( - "root_agent", [{"func_name": "task_A", "func_args": {"param": 1}}] - ), # Tool 1 - build_event( - "root_agent", [{"text": "Task A done. Now starting task B."}] - ), # Intermediate Text 2 - build_event( - "another_agent", [{"func_name": "task_B", "func_args": {}}] - ), # Tool 2 - build_event( - "root_agent", [{"text": "All tasks completed."}] - ), # Final Text (Reference) - ] - session = Session(id="s1", app_name="app", user_id="u1", events=events) - expected = [{ - "query": "Do task A then task B", - "expected_tool_use": [ - {"tool_name": "task_A", "tool_input": {"param": 1}}, - {"tool_name": "task_B", "tool_input": {}}, - ], - "expected_intermediate_agent_responses": [ - {"author": "root_agent", "text": "Okay, starting task A."}, - { - "author": "root_agent", - "text": "Task A done. Now starting task B.", - }, - ], - "reference": "All tasks completed.", - }] - assert convert_session_to_eval_format(session) == expected - - -def test_convert_multi_turn_session(): - """Test a session with multiple user/agent turns.""" - events = [ - build_event("user", [{"text": "Query 1"}]), - build_event("agent", [{"text": "Response 1"}]), - build_event("user", [{"text": "Query 2"}]), - build_event("agent", [{"func_name": "tool_X", "func_args": {}}]), - build_event("agent", [{"text": "Response 2"}]), - ] - session = Session(id="s1", app_name="app", user_id="u1", events=events) - expected = [ - { # Turn 1 - "query": "Query 1", - "expected_tool_use": [], - "expected_intermediate_agent_responses": [], - "reference": "Response 1", - }, - { # Turn 2 - "query": "Query 2", - "expected_tool_use": [{"tool_name": "tool_X", "tool_input": {}}], - "expected_intermediate_agent_responses": [], - "reference": "Response 2", - }, - ] - assert convert_session_to_eval_format(session) == expected - - -def test_convert_agent_event_multiple_parts(): - """Test an agent event with both text and tool call parts.""" - events = [ - build_event("user", [{"text": "Do something complex"}]), - # Build event with multiple dicts in parts_content list - build_event( - "agent", - [ - {"text": "Okay, doing it."}, - {"func_name": "complex_tool", "func_args": {"value": True}}, - ], - ), - build_event("agent", [{"text": "Finished."}]), - ] - session = Session(id="s1", app_name="app", user_id="u1", events=events) - expected = [{ - "query": "Do something complex", - "expected_tool_use": [ - {"tool_name": "complex_tool", "tool_input": {"value": True}} - ], - "expected_intermediate_agent_responses": [{ - "author": "agent", - "text": "Okay, doing it.", - }], # Text from first part of agent event - "reference": "Finished.", # Text from second agent event - }] - assert convert_session_to_eval_format(session) == expected - - -def test_convert_handles_missing_content_or_parts(): - """Test that events missing content or parts are skipped gracefully.""" - events = [ - build_event("user", [{"text": "Query 1"}]), - Event(author="agent", content=None), # Agent event missing content - build_event("agent", [{"text": "Response 1"}]), - Event(author="user", content=None), # User event missing content - build_event("user", [{"text": "Query 2"}]), - Event( - author="agent", content=types.Content(parts=[]) - ), # Agent event with empty parts list - build_event("agent", [{"text": "Response 2"}]), - # User event with content but no parts (or None parts) - Event(author="user", content=types.Content(parts=None)), - build_event("user", [{"text": "Query 3"}]), - build_event("agent", [{"text": "Response 3"}]), - ] - session = Session(id="s1", app_name="app", user_id="u1", events=events) - expected = [ - { # Turn 1 (from Query 1) - "query": "Query 1", - "expected_tool_use": [], - "expected_intermediate_agent_responses": [], - "reference": "Response 1", - }, - { # Turn 2 (from Query 2 - user event with None content was skipped) - "query": "Query 2", - "expected_tool_use": [], - "expected_intermediate_agent_responses": [], - "reference": "Response 2", - }, - { # Turn 3 (from Query 3 - user event with None parts was skipped) - "query": "Query 3", - "expected_tool_use": [], - "expected_intermediate_agent_responses": [], - "reference": "Response 3", - }, - ] - assert convert_session_to_eval_format(session) == expected - - -def test_convert_handles_missing_tool_name_or_args(): - """Test tool calls with missing name or args.""" - events = [ - build_event("user", [{"text": "Call tools"}]), - # Event where FunctionCall has name=None - Event( - author="agent", - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall(name=None, args={"a": 1}) - ) - ] - ), - ), - # Event where FunctionCall has args=None - Event( - author="agent", - content=types.Content( - parts=[ - types.Part( - function_call=types.FunctionCall(name="tool_B", args=None) - ) - ] - ), - ), - # Event where FunctionCall part exists but FunctionCall object is None - # (should skip) - Event( - author="agent", - content=types.Content( - parts=[types.Part(function_call=None, text="some text")] - ), - ), - build_event("agent", [{"text": "Done"}]), - ] - session = Session(id="s1", app_name="app", user_id="u1", events=events) - expected = [{ - "query": "Call tools", - "expected_tool_use": [ - {"tool_name": "", "tool_input": {"a": 1}}, # Defaults name to "" - {"tool_name": "tool_B", "tool_input": {}}, # Defaults args to {} - ], - "expected_intermediate_agent_responses": [{ - "author": "agent", - "text": "some text", - }], # Text part from the event where function_call was None - "reference": "Done", - }] - assert convert_session_to_eval_format(session) == expected - - -def test_convert_handles_missing_user_query_text(): - """Test user event where the first part has no text.""" - events = [ - # Event where user part has text=None - Event( - author="user", content=types.Content(parts=[types.Part(text=None)]) - ), - build_event("agent", [{"text": "Response 1"}]), - # Event where user part has text="" - build_event("user", [{"text": ""}]), - build_event("agent", [{"text": "Response 2"}]), - ] - session = Session(id="s1", app_name="app", user_id="u1", events=events) - expected = [ - { - "query": "", # Defaults to "" if text is None - "expected_tool_use": [], - "expected_intermediate_agent_responses": [], - "reference": "Response 1", - }, - { - "query": "", # Defaults to "" if text is "" - "expected_tool_use": [], - "expected_intermediate_agent_responses": [], - "reference": "Response 2", - }, - ] - assert convert_session_to_eval_format(session) == expected - - -def test_convert_handles_empty_agent_text(): - """Test agent responses with empty string text.""" - events = [ - build_event("user", [{"text": "Query"}]), - build_event("agent", [{"text": "Okay"}]), - build_event("agent", [{"text": ""}]), # Empty text - build_event("agent", [{"text": "Done"}]), - ] - session = Session(id="s1", app_name="app", user_id="u1", events=events) - expected = [{ - "query": "Query", - "expected_tool_use": [], - "expected_intermediate_agent_responses": [ - {"author": "agent", "text": "Okay"}, - ], - "reference": "Done", - }] - assert convert_session_to_eval_format(session) == expected + managers = evals.create_gcs_eval_managers_from_uri('gs://test-bucket') -def test_convert_complex_sample_session(): - """Test using the complex sample session provided earlier.""" - events = [ - build_event("user", [{"text": "What can you do?"}]), - build_event( - "root_agent", - [{"text": "I can roll dice and check if numbers are prime. \n"}], - ), - build_event( - "user", - [{ - "text": ( - "Roll a 8 sided dice and then check if 90 is a prime number" - " or not." - ) - }], - ), - build_event( - "root_agent", - [{ - "func_name": "transfer_to_agent", - "func_args": {"agent_name": "roll_agent"}, - }], - ), - # Skipping FunctionResponse events as they don't have text/functionCall - # parts used by converter - build_event( - "roll_agent", [{"func_name": "roll_die", "func_args": {"sides": 8}}] - ), - # Skipping FunctionResponse - build_event( - "roll_agent", - [ - {"text": "I rolled a 2. Now, I'll check if 90 is prime. \n\n"}, - { - "func_name": "transfer_to_agent", - "func_args": {"agent_name": "prime_agent"}, - }, - ], - ), - # Skipping FunctionResponse - build_event( - "prime_agent", - [{"func_name": "check_prime", "func_args": {"nums": [90]}}], - ), - # Skipping FunctionResponse - build_event("prime_agent", [{"text": "90 is not a prime number. \n"}]), - ] - session = Session( - id="some_id", - app_name="hello_world_ma", - user_id="user", - events=events, + assert managers is not None + mock_gcs_eval_sets_manager.assert_called_once_with( + bucket_name='test-bucket', project='test-project' ) - expected = [ - { - "query": "What can you do?", - "expected_tool_use": [], - "expected_intermediate_agent_responses": [], - "reference": "I can roll dice and check if numbers are prime. \n", - }, - { - "query": ( - "Roll a 8 sided dice and then check if 90 is a prime number or" - " not." - ), - "expected_tool_use": [ - { - "tool_name": "transfer_to_agent", - "tool_input": {"agent_name": "roll_agent"}, - }, - {"tool_name": "roll_die", "tool_input": {"sides": 8}}, - { - "tool_name": "transfer_to_agent", - "tool_input": {"agent_name": "prime_agent"}, - }, # From combined event - {"tool_name": "check_prime", "tool_input": {"nums": [90]}}, - ], - "expected_intermediate_agent_responses": [{ - "author": "roll_agent", - "text": "I rolled a 2. Now, I'll check if 90 is prime. \n\n", - }], # Text from combined event - "reference": "90 is not a prime number. \n", - }, - ] + mock_gcs_eval_set_results_manager.assert_called_once_with( + bucket_name='test-bucket', project='test-project' + ) + assert managers.eval_sets_manager == mock_gcs_eval_sets_manager.return_value + assert ( + managers.eval_set_results_manager + == mock_gcs_eval_set_results_manager.return_value + ) + - actual = convert_session_to_eval_format(session) - assert actual == expected +def test_create_gcs_eval_managers_from_uri_failure(): + with pytest.raises(ValueError): + evals.create_gcs_eval_managers_from_uri('unsupported-uri') diff --git a/tests/unittests/code_executors/test_agent_engine_sandbox_code_executor.py b/tests/unittests/code_executors/test_agent_engine_sandbox_code_executor.py new file mode 100644 index 0000000000..b1f922952a --- /dev/null +++ b/tests/unittests/code_executors/test_agent_engine_sandbox_code_executor.py @@ -0,0 +1,122 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import json +from unittest.mock import MagicMock +from unittest.mock import patch + +from google.adk.agents.invocation_context import InvocationContext +from google.adk.code_executors.agent_engine_sandbox_code_executor import AgentEngineSandboxCodeExecutor +from google.adk.code_executors.code_execution_utils import CodeExecutionInput +import pytest + + +@pytest.fixture +def mock_invocation_context() -> InvocationContext: + """Fixture for a mock InvocationContext.""" + mock = MagicMock(spec=InvocationContext) + mock.invocation_id = "test-invocation-123" + return mock + + +class TestAgentEngineSandboxCodeExecutor: + """Unit tests for the AgentEngineSandboxCodeExecutor.""" + + def test_init_with_sandbox_overrides(self): + """Tests that class attributes can be overridden at instantiation.""" + executor = AgentEngineSandboxCodeExecutor( + sandbox_resource_name="projects/123/locations/us-central1/reasoningEngines/456/sandboxEnvironments/789", + ) + assert executor.sandbox_resource_name == ( + "projects/123/locations/us-central1/reasoningEngines/456/sandboxEnvironments/789" + ) + + def test_init_with_sandbox_overrides_throws_error(self): + """Tests that class attributes can be overridden at instantiation.""" + with pytest.raises(ValueError): + AgentEngineSandboxCodeExecutor( + sandbox_resource_name="projects/123/locations/us-central1/reasoningEgines/456/sandboxes/789", + ) + + def test_init_with_agent_engine_overrides_throws_error(self): + """Tests that class attributes can be overridden at instantiation.""" + with pytest.raises(ValueError): + AgentEngineSandboxCodeExecutor( + agent_engine_resource_name=( + "projects/123/locations/us-central1/reason/456" + ), + ) + + @patch( + "google.adk.code_executors.agent_engine_sandbox_code_executor.vertexai" + ) + def test_execute_code_success( + self, + mock_vertexai, + mock_invocation_context, + ): + # Setup Mocks + mock_api_client = MagicMock() + mock_vertexai.Client.return_value = mock_api_client + mock_response = MagicMock() + mock_json_output = MagicMock() + mock_json_output.mime_type = "application/json" + mock_json_output.data = json.dumps( + {"stdout": "hello world", "stderr": ""} + ).encode("utf-8") + mock_json_output.metadata = None + + mock_file_output = MagicMock() + mock_file_output.mime_type = "text/plain" + mock_file_output.data = b"file content" + mock_file_output.metadata = MagicMock() + mock_file_output.metadata.attributes = {"file_name": b"file.txt"} + + mock_png_file_output = MagicMock() + mock_png_file_output.mime_type = "image/png" + sample_png_bytes = b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x06\x00\x00\x00\x1f\x15\xc4\x89" + mock_png_file_output.data = sample_png_bytes + mock_png_file_output.metadata = MagicMock() + mock_png_file_output.metadata.attributes = {"file_name": b"file.png"} + + mock_response.outputs = [ + mock_json_output, + mock_file_output, + mock_png_file_output, + ] + mock_api_client.agent_engines.sandboxes.execute_code.return_value = ( + mock_response + ) + + # Execute + executor = AgentEngineSandboxCodeExecutor( + sandbox_resource_name="projects/123/locations/us-central1/reasoningEngines/456/sandboxEnvironments/789" + ) + code_input = CodeExecutionInput(code='print("hello world")') + result = executor.execute_code(mock_invocation_context, code_input) + + # Assert + assert result.stdout == "hello world" + assert not result.stderr + assert result.output_files[0].mime_type == "text/plain" + assert result.output_files[0].content == b"file content" + + assert result.output_files[0].name == "file.txt" + assert result.output_files[1].mime_type == "image/png" + assert result.output_files[1].name == "file.png" + assert result.output_files[1].content == sample_png_bytes + mock_api_client.agent_engines.sandboxes.execute_code.assert_called_once_with( + name="projects/123/locations/us-central1/reasoningEngines/456/sandboxEnvironments/789", + input_data={"code": 'print("hello world")'}, + ) diff --git a/tests/unittests/code_executors/test_code_executor_context.py b/tests/unittests/code_executors/test_code_executor_context.py index 5f3a237d34..6a85b7a81a 100644 --- a/tests/unittests/code_executors/test_code_executor_context.py +++ b/tests/unittests/code_executors/test_code_executor_context.py @@ -26,7 +26,7 @@ def empty_state() -> State: @pytest.fixture def context_with_data() -> CodeExecutorContext: - """Fixture for a CodeExecutorContext with some pre-populated data.""" + """Fixture for a CodeExecutorContext with some prepopulated data.""" state_data = { "_code_execution_context": { "execution_session_id": "session123", diff --git a/tests/unittests/conftest.py b/tests/unittests/conftest.py index 2b93226dbd..59b66bd622 100644 --- a/tests/unittests/conftest.py +++ b/tests/unittests/conftest.py @@ -38,7 +38,7 @@ } -@fixture(autouse=True) +@fixture def env_variables(request: FixtureRequest): # Set up the environment env_name: str = request.param @@ -56,6 +56,35 @@ def env_variables(request: FixtureRequest): os.environ[key] = original_val +# Store original environment variables to restore later +_original_env = {} + + +@hookimpl(tryfirst=True) +def pytest_sessionstart(session): + """Set up environment variables at the beginning of the test session.""" + if not ENV_SETUPS: + return + # Use the first env setup to initialize environment for module-level imports + env_name = next(iter(ENV_SETUPS.keys())) + envs = ENV_SETUPS[env_name] + global _original_env + _original_env = {key: os.environ.get(key) for key in envs} + os.environ.update(envs) + + +@hookimpl(trylast=True) +def pytest_sessionfinish(session): + """Restore original environment variables at the end of the test session.""" + global _original_env + for key, original_val in _original_env.items(): + if original_val is None: + os.environ.pop(key, None) + else: + os.environ[key] = original_val + _original_env = {} + + @hookimpl(tryfirst=True) def pytest_generate_tests(metafunc: Metafunc): """Generate test cases for each environment setup.""" diff --git a/tests/unittests/evaluation/test_app_details.py b/tests/unittests/evaluation/test_app_details.py new file mode 100644 index 0000000000..b96581f5fb --- /dev/null +++ b/tests/unittests/evaluation/test_app_details.py @@ -0,0 +1,73 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.evaluation.app_details import AgentDetails +from google.adk.evaluation.app_details import AppDetails +from google.genai import types as genai_types +from pytest import raises + + +def test_get_developer_instructions_existing_agent(): + agent_details = { + 'agent1': AgentDetails( + name='agent1', instructions='instruction for agent1' + ), + 'agent2': AgentDetails( + name='agent2', instructions='instruction for agent2' + ), + } + app_details = AppDetails( + agent_details=agent_details, + ) + + # Test for existing agent + instructions = app_details.get_developer_instructions('agent1') + assert instructions == 'instruction for agent1' + + +def test_get_developer_instructions_non_existing_Agent(): + agent_details = { + 'agent1': AgentDetails( + name='agent1', instructions='instruction for agent1' + ), + 'agent2': AgentDetails( + name='agent2', instructions='instruction for agent2' + ), + } + app_details = AppDetails( + agent_details=agent_details, + ) + + # Test for existing agent + with raises(ValueError, match='`agent3` not found in the agentic system.'): + app_details.get_developer_instructions('agent3') + + +def test_get_tools_by_agent_name(): + tool1 = genai_types.Tool( + function_declarations=[genai_types.FunctionDeclaration(name='tool1_func')] + ) + agent_details = { + 'agent1': AgentDetails(name='agent1', tool_declarations=[tool1]), + 'agent2': AgentDetails(name='agent2', tool_declarations=[]), + } + app_details = AppDetails( + agent_details=agent_details, + ) + + tools = app_details.get_tools_by_agent_name() + expected_tools = {'agent1': [tool1], 'agent2': []} + assert tools == expected_tools diff --git a/tests/unittests/evaluation/test_eval_case.py b/tests/unittests/evaluation/test_eval_case.py new file mode 100644 index 0000000000..4784a9a0aa --- /dev/null +++ b/tests/unittests/evaluation/test_eval_case.py @@ -0,0 +1,283 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.evaluation.conversation_scenarios import ConversationScenario +from google.adk.evaluation.eval_case import EvalCase +from google.adk.evaluation.eval_case import get_all_tool_calls +from google.adk.evaluation.eval_case import get_all_tool_calls_with_responses +from google.adk.evaluation.eval_case import get_all_tool_responses +from google.adk.evaluation.eval_case import IntermediateData +from google.adk.evaluation.eval_case import InvocationEvent +from google.adk.evaluation.eval_case import InvocationEvents +from google.genai import types as genai_types +import pytest + + +def test_get_all_tool_calls_with_none_input(): + """Tests that an empty list is returned when intermediate_data is None.""" + assert get_all_tool_calls(None) == [] + + +def test_get_all_tool_calls_with_intermediate_data_no_tools(): + """Tests IntermediateData with no tool calls.""" + intermediate_data = IntermediateData(tool_uses=[]) + assert get_all_tool_calls(intermediate_data) == [] + + +def test_get_all_tool_calls_with_intermediate_data(): + """Tests that tool calls are correctly extracted from IntermediateData.""" + tool_call1 = genai_types.FunctionCall( + name='search', args={'query': 'weather'} + ) + tool_call2 = genai_types.FunctionCall(name='lookup', args={'id': '123'}) + intermediate_data = IntermediateData(tool_uses=[tool_call1, tool_call2]) + assert get_all_tool_calls(intermediate_data) == [tool_call1, tool_call2] + + +def test_get_all_tool_calls_with_empty_invocation_events(): + """Tests InvocationEvents with an empty list of invocation events.""" + intermediate_data = InvocationEvents(invocation_events=[]) + assert get_all_tool_calls(intermediate_data) == [] + + +def test_get_all_tool_calls_with_invocation_events_no_tools(): + """Tests InvocationEvents containing events without any tool calls.""" + invocation_event = InvocationEvent( + author='agent', + content=genai_types.Content( + parts=[genai_types.Part(text='Thinking...')], role='model' + ), + ) + intermediate_data = InvocationEvents(invocation_events=[invocation_event]) + assert get_all_tool_calls(intermediate_data) == [] + + +def test_get_all_tool_calls_with_invocation_events(): + """Tests that tool calls are correctly extracted from a InvocationSteps object.""" + tool_call1 = genai_types.FunctionCall( + name='search', args={'query': 'weather'} + ) + tool_call2 = genai_types.FunctionCall(name='lookup', args={'id': '123'}) + + invocation_event1 = InvocationEvent( + author='agent1', + content=genai_types.Content( + parts=[genai_types.Part(function_call=tool_call1)], + role='model', + ), + ) + invocation_event2 = InvocationEvent( + author='agent2', + content=genai_types.Content( + parts=[ + genai_types.Part(text='Found something.'), + genai_types.Part(function_call=tool_call2), + ], + role='model', + ), + ) + intermediate_data = InvocationEvents( + invocation_events=[invocation_event1, invocation_event2] + ) + assert get_all_tool_calls(intermediate_data) == [tool_call1, tool_call2] + + +def test_get_all_tool_calls_with_unsupported_type(): + """Tests that a ValueError is raised for unsupported intermediate_data types.""" + with pytest.raises( + ValueError, match='Unsupported type for intermediate_data' + ): + get_all_tool_calls('this is not a valid type') + + +def test_get_all_tool_responses_with_none_input(): + """Tests that an empty list is returned when intermediate_data is None.""" + assert get_all_tool_responses(None) == [] + + +def test_get_all_tool_responses_with_empty_invocation_events(): + """Tests InvocationEvents with an empty list of events.""" + intermediate_data = InvocationEvents(invocation_events=[]) + assert get_all_tool_responses(intermediate_data) == [] + + +def test_get_all_tool_responses_with_invocation_events_no_tools(): + """Tests InvocationEvents containing events without any tool responses.""" + invocation_event = InvocationEvent( + author='agent', + content=genai_types.Content( + parts=[genai_types.Part(text='Thinking...')], role='model' + ), + ) + intermediate_data = InvocationEvents(invocation_events=[invocation_event]) + assert get_all_tool_responses(intermediate_data) == [] + + +def test_get_all_tool_responses_with_invocation_events(): + """Tests that tool responses are correctly extracted from a InvocationEvents object.""" + tool_response1 = genai_types.FunctionResponse( + name='search', response={'result': 'weather is good'} + ) + tool_response2 = genai_types.FunctionResponse( + name='lookup', response={'id': '123'} + ) + invocation_event1 = InvocationEvent( + author='agent1', + content=genai_types.Content( + parts=[genai_types.Part(function_response=tool_response1)], + role='model', + ), + ) + invocation_event2 = InvocationEvent( + author='agent2', + content=genai_types.Content( + parts=[ + genai_types.Part(text='Found something.'), + genai_types.Part(function_response=tool_response2), + ], + role='model', + ), + ) + intermediate_data = InvocationEvents( + invocation_events=[invocation_event1, invocation_event2] + ) + assert get_all_tool_responses(intermediate_data) == [ + tool_response1, + tool_response2, + ] + + +def test_get_all_tool_responses_with_unsupported_type(): + """Tests that a ValueError is raised for unsupported intermediate_data types.""" + with pytest.raises( + ValueError, match='Unsupported type for intermediate_data' + ): + get_all_tool_responses('this is not a valid type') + + +def test_get_all_tool_calls_with_responses_with_none_input(): + """Tests that an empty list is returned when intermediate_data is None.""" + assert get_all_tool_calls_with_responses(None) == [] + + +def test_get_all_tool_calls_with_responses_with_intermediate_data_no_tool_calls(): + """Tests get_all_tool_calls_with_responses with IntermediateData with no tool calls.""" + # No tool calls + intermediate_data = IntermediateData(tool_uses=[], tool_responses=[]) + assert get_all_tool_calls_with_responses(intermediate_data) == [] + + +def test_get_all_tool_calls_with_responses_with_intermediate_data_with_tool_calls(): + """Tests get_all_tool_calls_with_responses with IntermediateData with tools.""" + # With matching and non-matching tool calls + tool_call1 = genai_types.FunctionCall( + name='search', args={'query': 'weather'}, id='call1' + ) + tool_response1 = genai_types.FunctionResponse( + name='search', response={'result': 'sunny'}, id='call1' + ) + tool_call2 = genai_types.FunctionCall( + name='lookup', args={'id': '123'}, id='call2' + ) + intermediate_data = IntermediateData( + tool_uses=[tool_call1, tool_call2], tool_responses=[tool_response1] + ) + assert get_all_tool_calls_with_responses(intermediate_data) == [ + (tool_call1, tool_response1), + (tool_call2, None), + ] + + +def test_get_all_tool_calls_with_responses_with_steps_no_tool_calls(): + """Tests get_all_tool_calls_with_responses with Steps that don't have tool calls.""" + # No tool calls + intermediate_data = InvocationEvents(invocation_events=[]) + assert get_all_tool_calls_with_responses(intermediate_data) == [] + + +def test_get_all_tool_calls_with_responses_with_invocation_events(): + """Tests get_all_tool_calls_with_responses with InvocationEvents.""" + # No tools + intermediate_data = InvocationEvents(invocation_events=[]) + assert get_all_tool_calls_with_responses(intermediate_data) == [] + + # With matching and non-matching tool calls + tool_call1 = genai_types.FunctionCall( + name='search', args={'query': 'weather'}, id='call1' + ) + tool_response1 = genai_types.FunctionResponse( + name='search', response={'result': 'sunny'}, id='call1' + ) + tool_call2 = genai_types.FunctionCall( + name='lookup', args={'id': '123'}, id='call2' + ) + invocation_event1 = InvocationEvent( + author='agent', + content=genai_types.Content( + parts=[ + genai_types.Part(function_call=tool_call1), + genai_types.Part(function_call=tool_call2), + ], + role='model', + ), + ) + invocation_event2 = InvocationEvent( + author='tool', + content=genai_types.Content( + parts=[genai_types.Part(function_response=tool_response1)], + role='tool', + ), + ) + intermediate_data = InvocationEvents( + invocation_events=[invocation_event1, invocation_event2] + ) + assert get_all_tool_calls_with_responses(intermediate_data) == [ + (tool_call1, tool_response1), + (tool_call2, None), + ] + + +def test_conversation_and_conversation_scenario_mutual_exclusion(): + """Tests the ensure_conversation_xor_conversation_scenario validator.""" + test_conversation_scenario = ConversationScenario( + starting_prompt='', conversation_plan='' + ) + + with pytest.raises( + ValueError, + match=( + 'Exactly one of conversation and conversation_scenario must be' + ' provided in an EvalCase.' + ), + ): + EvalCase(eval_id='test_id') + + with pytest.raises( + ValueError, + match=( + 'Exactly one of conversation and conversation_scenario must be' + ' provided in an EvalCase.' + ), + ): + EvalCase( + eval_id='test_id', + conversation=[], + conversation_scenario=test_conversation_scenario, + ) + + # these two should not cause exceptions + EvalCase(eval_id='test_id', conversation=[]) + EvalCase(eval_id='test_id', conversation_scenario=test_conversation_scenario) diff --git a/tests/unittests/cli/test_cli_eval.py b/tests/unittests/evaluation/test_eval_config.py similarity index 80% rename from tests/unittests/cli/test_cli_eval.py rename to tests/unittests/evaluation/test_eval_config.py index 2b284ded2a..a1f9c8af0a 100644 --- a/tests/unittests/cli/test_cli_eval.py +++ b/tests/unittests/evaluation/test_eval_config.py @@ -14,12 +14,10 @@ from __future__ import annotations -from unittest import mock - -from google.adk.cli.cli_eval import _DEFAULT_EVAL_CONFIG -from google.adk.cli.cli_eval import get_eval_metrics_from_config -from google.adk.cli.cli_eval import get_evaluation_criteria_or_default +from google.adk.evaluation.eval_config import _DEFAULT_EVAL_CONFIG from google.adk.evaluation.eval_config import EvalConfig +from google.adk.evaluation.eval_config import get_eval_metrics_from_config +from google.adk.evaluation.eval_config import get_evaluation_criteria_or_default from google.adk.evaluation.eval_rubrics import Rubric from google.adk.evaluation.eval_rubrics import RubricContent @@ -28,13 +26,24 @@ def test_get_evaluation_criteria_or_default_returns_default(): assert get_evaluation_criteria_or_default("") == _DEFAULT_EVAL_CONFIG -def test_get_evaluation_criteria_or_default_reads_from_file(): +def test_get_evaluation_criteria_or_default_reads_from_file(mocker): + mocker.patch("os.path.exists", return_value=True) eval_config = EvalConfig( criteria={"tool_trajectory_avg_score": 0.5, "response_match_score": 0.5} ) - mock_open = mock.mock_open(read_data=eval_config.model_dump_json()) - with mock.patch("builtins.open", mock_open): - assert get_evaluation_criteria_or_default("dummy_path") == eval_config + mocker.patch( + "builtins.open", mocker.mock_open(read_data=eval_config.model_dump_json()) + ) + assert get_evaluation_criteria_or_default("dummy_path") == eval_config + + +def test_get_evaluation_criteria_or_default_returns_default_if_file_not_found( + mocker, +): + mocker.patch("os.path.exists", return_value=False) + assert ( + get_evaluation_criteria_or_default("dummy_path") == _DEFAULT_EVAL_CONFIG + ) def test_get_eval_metrics_from_config(): diff --git a/tests/unittests/evaluation/test_evaluation_generator.py b/tests/unittests/evaluation/test_evaluation_generator.py new file mode 100644 index 0000000000..27372f12c2 --- /dev/null +++ b/tests/unittests/evaluation/test_evaluation_generator.py @@ -0,0 +1,457 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.evaluation.app_details import AgentDetails +from google.adk.evaluation.app_details import AppDetails +from google.adk.evaluation.evaluation_generator import EvaluationGenerator +from google.adk.evaluation.request_intercepter_plugin import _RequestIntercepterPlugin +from google.adk.evaluation.user_simulator import NextUserMessage +from google.adk.evaluation.user_simulator import Status as UserSimulatorStatus +from google.adk.evaluation.user_simulator import UserSimulator +from google.adk.events.event import Event +from google.adk.models.llm_request import LlmRequest +from google.genai import types +import pytest + + +def _build_event( + author: str, parts: list[types.Part], invocation_id: str +) -> Event: + """Builds an Event object with specified parts.""" + + return Event( + author=author, + content=types.Content(parts=parts), + invocation_id=invocation_id, + ) + + +class TestConvertEventsToEvalInvocation: + """Test cases for EvaluationGenerator.convert_events_to_eval_invocations method.""" + + def test_convert_events_to_eval_invocations_empty( + self, + ): + """Tests conversion with an empty list of events.""" + invocations = EvaluationGenerator.convert_events_to_eval_invocations([]) + assert invocations == [] + + def test_convert_single_turn_text_only( + self, + ): + """Tests a single turn with a text response.""" + events = [ + _build_event("user", [types.Part(text="Hello")], "inv1"), + _build_event("agent", [types.Part(text="Hi there!")], "inv1"), + ] + + invocations = EvaluationGenerator.convert_events_to_eval_invocations(events) + + assert len(invocations) == 1 + invocation = invocations[0] + assert invocation.invocation_id == "inv1" + assert invocation.user_content.parts[0].text == "Hello" + assert invocation.final_response.parts[0].text == "Hi there!" + assert len(invocation.intermediate_data.invocation_events) == 0 + + def test_convert_single_turn_tool_call( + self, + ): + """Tests a single turn with a tool call.""" + events = [ + _build_event("user", [types.Part(text="what is the weather?")], "inv1"), + _build_event( + "agent", + [ + types.Part( + function_call=types.FunctionCall( + name="get_weather", args={} + ) + ) + ], + "inv1", + ), + ] + + invocations = EvaluationGenerator.convert_events_to_eval_invocations(events) + + assert len(invocations) == 1 + invocation = invocations[0] + assert invocation.user_content.parts[0].text == "what is the weather?" + assert invocation.final_response is None + events = invocation.intermediate_data.invocation_events + assert len(events) == 1 + assert events[0].author == "agent" + assert events[0].content.parts[0].function_call.name == "get_weather" + + def test_convert_single_turn_tool_and_text_response( + self, + ): + """Tests a single turn with a tool call and a final text response.""" + events = [ + _build_event("user", [types.Part(text="what is the weather?")], "inv1"), + _build_event( + "agent", + [ + types.Part( + function_call=types.FunctionCall( + name="get_weather", args={} + ) + ) + ], + "inv1", + ), + _build_event("agent", [types.Part(text="It is sunny in SF.")], "inv1"), + ] + + invocations = EvaluationGenerator.convert_events_to_eval_invocations(events) + + assert len(invocations) == 1 + invocation = invocations[0] + assert invocation.final_response.parts[0].text == "It is sunny in SF." + events = invocation.intermediate_data.invocation_events + assert len(events) == 1 + assert events[0].content.parts[0].function_call.name == "get_weather" + + def test_multi_turn( + self, + ): + """Tests a conversation with multiple turns.""" + events = [ + _build_event("user", [types.Part(text="Hello")], "inv1"), + _build_event("agent", [types.Part(text="Hi there!")], "inv1"), + _build_event("user", [types.Part(text="How are you?")], "inv2"), + _build_event("agent", [types.Part(text="I am fine.")], "inv2"), + ] + + invocations = EvaluationGenerator.convert_events_to_eval_invocations(events) + + assert len(invocations) == 2 + assert invocations[0].user_content.parts[0].text == "Hello" + assert invocations[0].final_response.parts[0].text == "Hi there!" + assert invocations[1].user_content.parts[0].text == "How are you?" + assert invocations[1].final_response.parts[0].text == "I am fine." + + def test_multi_agent( + self, + ): + """Tests a multi-agent scenario creating multiple steps.""" + events = [ + _build_event("user", [types.Part(text="Do something")], "inv1"), + _build_event( + "root_agent", + [ + types.Part( + function_call=types.FunctionCall(name="tool1", args={}) + ) + ], + "inv1", + ), + _build_event( + "sub_agent_1", + [ + types.Part( + function_call=types.FunctionCall(name="tool2", args={}) + ) + ], + "inv1", + ), + _build_event( + "sub_agent_1", + [ + types.Part( + function_call=types.FunctionCall(name="tool3", args={}) + ), + types.Part(text="intermediate response"), + ], + "inv1", + ), + _build_event( + "sub_agent_2", + [ + types.Part( + function_call=types.FunctionCall(name="tool4", args={}) + ) + ], + "inv1", + ), + _build_event("root_agent", [types.Part(text="All done.")], "inv1"), + ] + + invocations = EvaluationGenerator.convert_events_to_eval_invocations(events) + + assert len(invocations) == 1 + invocation = invocations[0] + assert invocation.final_response.parts[0].text == "All done." + events = invocation.intermediate_data.invocation_events + + assert len(events) == 4 + assert events[0].author == "root_agent" + assert events[1].author == "sub_agent_1" + assert events[2].author == "sub_agent_1" + assert events[3].author == "sub_agent_2" + + +class TestGetAppDetailsByInvocationId: + """Test cases for EvaluationGenerator._get_app_details_by_invocation_id method.""" + + def test_get_app_details_by_invocation_id_empty(self, mocker): + """Tests with an empty list of events.""" + mock_request_intercepter = mocker.MagicMock(spec=_RequestIntercepterPlugin) + app_details = EvaluationGenerator._get_app_details_by_invocation_id( + [], mock_request_intercepter + ) + assert app_details == {} + + def test_get_app_details_by_invocation_id_no_model_requests(self, mocker): + """Tests when request_intercepter returns no model requests.""" + mock_request_intercepter = mocker.MagicMock(spec=_RequestIntercepterPlugin) + mock_request_intercepter.get_model_request.return_value = None + events = [ + _build_event("user", [types.Part(text="Hello")], "inv1"), + _build_event("agent", [types.Part(text="Hi there!")], "inv1"), + ] + app_details = EvaluationGenerator._get_app_details_by_invocation_id( + events, mock_request_intercepter + ) + assert app_details == {"inv1": AppDetails(agent_details={})} + mock_request_intercepter.get_model_request.assert_called_once_with( + events[1] + ) + + def test_get_app_details_single_invocation_single_agent(self, mocker): + """Tests a single invocation with one agent.""" + mock_request_intercepter = mocker.MagicMock(spec=_RequestIntercepterPlugin) + mock_llm_request = LlmRequest(model="test") + mock_llm_request.config.system_instruction = "instruction1" + mock_llm_request.config.tools = [types.Tool()] + mock_request_intercepter.get_model_request.return_value = mock_llm_request + + events = [ + _build_event("user", [types.Part(text="Hello")], "inv1"), + _build_event("agent", [types.Part(text="Hi there!")], "inv1"), + ] + app_details = EvaluationGenerator._get_app_details_by_invocation_id( + events, mock_request_intercepter + ) + + expected_app_details = { + "inv1": AppDetails( + agent_details={ + "agent": AgentDetails( + name="agent", + instructions="instruction1", + tool_declarations=[types.Tool()], + ) + } + ) + } + assert app_details == expected_app_details + mock_request_intercepter.get_model_request.assert_called_once_with( + events[1] + ) + + def test_get_app_details_multiple_invocations_multiple_agents(self, mocker): + """Tests multiple invocations with multiple agents.""" + mock_request_intercepter = mocker.MagicMock(spec=_RequestIntercepterPlugin) + + def get_model_request_side_effect(event): + mock_llm_request = LlmRequest(model="test") + if event.invocation_id == "inv1" and event.author == "agent1": + mock_llm_request.config.system_instruction = "instruction1" + mock_llm_request.config.tools = [ + types.Tool( + function_declarations=[types.FunctionDeclaration(name="tool1")] + ) + ] + return mock_llm_request + if event.invocation_id == "inv2" and event.author == "agent2": + mock_llm_request.config.system_instruction = "instruction2" + return mock_llm_request + return None + + mock_request_intercepter.get_model_request.side_effect = ( + get_model_request_side_effect + ) + + events = [ + _build_event("user", [types.Part(text="Hello")], "inv1"), + _build_event("agent1", [types.Part(text="Hi there!")], "inv1"), + _build_event("user", [types.Part(text="Hello again")], "inv2"), + _build_event("agent2", [types.Part(text="Hi again!")], "inv2"), + _build_event( + "agent1", [types.Part(text="Hi again from agent1")], "inv2" + ), # no request + ] + app_details = EvaluationGenerator._get_app_details_by_invocation_id( + events, mock_request_intercepter + ) + + expected_app_details = { + "inv1": AppDetails( + agent_details={ + "agent1": AgentDetails( + name="agent1", + instructions="instruction1", + tool_declarations=[ + types.Tool( + function_declarations=[ + types.FunctionDeclaration(name="tool1") + ] + ) + ], + ) + } + ), + "inv2": AppDetails( + agent_details={ + "agent2": AgentDetails( + name="agent2", + instructions="instruction2", + tool_declarations=[], + ) + } + ), + } + assert app_details == expected_app_details + assert mock_request_intercepter.get_model_request.call_count == 3 + + +class TestGenerateInferencesForSingleUserInvocation: + """Test cases for EvaluationGenerator._generate_inferences_for_single_user_invocation method.""" + + @pytest.mark.asyncio + async def test_generate_inferences_with_mock_runner(self, mocker): + """Tests inference generation with a mocked runner.""" + runner = mocker.MagicMock() + + agent_parts = [types.Part(text="Agent response")] + + async def mock_run_async(*args, **kwargs): + yield _build_event( + author="agent", + parts=agent_parts, + invocation_id="inv1", + ) + + runner.run_async.return_value = mock_run_async() + + user_content = types.Content(parts=[types.Part(text="User query")]) + + events = [ + event + async for event in EvaluationGenerator._generate_inferences_for_single_user_invocation( + runner, "test_user", "test_session", user_content + ) + ] + + assert len(events) == 2 + assert events[0].author == "user" + assert events[0].content == user_content + assert events[0].invocation_id == "inv1" + assert events[1].author == "agent" + assert events[1].content.parts == agent_parts + + runner.run_async.assert_called_once_with( + user_id="test_user", + session_id="test_session", + new_message=user_content, + ) + + +@pytest.fixture +def mock_runner(mocker): + """Provides a mock Runner for testing.""" + mock_runner_cls = mocker.patch( + "google.adk.evaluation.evaluation_generator.Runner" + ) + mock_runner_instance = mocker.AsyncMock() + mock_runner_instance.__aenter__.return_value = mock_runner_instance + mock_runner_cls.return_value = mock_runner_instance + yield mock_runner_instance + + +@pytest.fixture +def mock_session_service(mocker): + """Provides a mock InMemorySessionService for testing.""" + mock_session_service_cls = mocker.patch( + "google.adk.evaluation.evaluation_generator.InMemorySessionService" + ) + mock_session_service_instance = mocker.MagicMock() + mock_session_service_instance.create_session = mocker.AsyncMock() + mock_session_service_cls.return_value = mock_session_service_instance + yield mock_session_service_instance + + +class TestGenerateInferencesFromRootAgent: + """Test cases for EvaluationGenerator._generate_inferences_from_root_agent method.""" + + @pytest.mark.asyncio + async def test_generates_inferences_with_user_simulator( + self, mocker, mock_runner, mock_session_service + ): + """Tests that inferences are generated by interacting with a user simulator.""" + mock_agent = mocker.MagicMock() + mock_user_sim = mocker.MagicMock(spec=UserSimulator) + + # Mock user simulator will produce one message, then stop. + async def get_next_user_message_side_effect(*args, **kwargs): + if mock_user_sim.get_next_user_message.call_count == 1: + return NextUserMessage( + status=UserSimulatorStatus.SUCCESS, + user_message=types.Content(parts=[types.Part(text="message 1")]), + ) + return NextUserMessage(status=UserSimulatorStatus.STOP_SIGNAL_DETECTED) + + mock_user_sim.get_next_user_message = mocker.AsyncMock( + side_effect=get_next_user_message_side_effect + ) + + mock_generate_inferences = mocker.patch( + "google.adk.evaluation.evaluation_generator.EvaluationGenerator._generate_inferences_for_single_user_invocation" + ) + mocker.patch( + "google.adk.evaluation.evaluation_generator.EvaluationGenerator._get_app_details_by_invocation_id" + ) + mocker.patch( + "google.adk.evaluation.evaluation_generator.EvaluationGenerator.convert_events_to_eval_invocations" + ) + + # Each call to _generate_inferences_for_single_user_invocation will + # yield one user and one agent event. + async def mock_generate_inferences_side_effect( + runner, user_id, session_id, user_content + ): + yield _build_event("user", user_content.parts, "inv1") + yield _build_event("agent", [types.Part(text="agent_response")], "inv1") + + mock_generate_inferences.side_effect = mock_generate_inferences_side_effect + + await EvaluationGenerator._generate_inferences_from_root_agent( + root_agent=mock_agent, + user_simulator=mock_user_sim, + ) + + # Check that user simulator was called until it stopped. + assert mock_user_sim.get_next_user_message.call_count == 2 + + # Check that we generated inferences for each user message. + assert mock_generate_inferences.call_count == 1 + + # Check the content of the user messages passed to inference generation + mock_generate_inferences.assert_called_once() + called_with_content = mock_generate_inferences.call_args.args[3] + assert called_with_content.parts[0].text == "message 1" diff --git a/tests/unittests/evaluation/test_final_response_match_v2.py b/tests/unittests/evaluation/test_final_response_match_v2.py index 382b7a7d64..a40dbe091d 100644 --- a/tests/unittests/evaluation/test_final_response_match_v2.py +++ b/tests/unittests/evaluation/test_final_response_match_v2.py @@ -17,12 +17,13 @@ from google.adk.evaluation.eval_case import Invocation from google.adk.evaluation.eval_metrics import BaseCriterion from google.adk.evaluation.eval_metrics import EvalMetric +from google.adk.evaluation.eval_metrics import EvalStatus from google.adk.evaluation.eval_metrics import JudgeModelOptions from google.adk.evaluation.eval_metrics import PrebuiltMetrics -from google.adk.evaluation.evaluator import EvalStatus from google.adk.evaluation.evaluator import PerInvocationResult from google.adk.evaluation.final_response_match_v2 import _parse_critique from google.adk.evaluation.final_response_match_v2 import FinalResponseMatchV2Evaluator +from google.adk.evaluation.llm_as_judge import AutoRaterScore from google.adk.evaluation.llm_as_judge_utils import Label from google.adk.models.llm_response import LlmResponse from google.genai import types as genai_types @@ -206,8 +207,10 @@ def test_convert_auto_rater_response_to_score_valid(): role="model", ) ) - score = evaluator.convert_auto_rater_response_to_score(llm_response) - assert score == 1.0 + auto_rater_score = evaluator.convert_auto_rater_response_to_score( + llm_response + ) + assert auto_rater_score == AutoRaterScore(score=1.0) def test_convert_auto_rater_response_to_score_invalid(): @@ -224,8 +227,10 @@ def test_convert_auto_rater_response_to_score_invalid(): role="model", ) ) - score = evaluator.convert_auto_rater_response_to_score(llm_response) - assert score == 0.0 + auto_rater_score = evaluator.convert_auto_rater_response_to_score( + llm_response + ) + assert auto_rater_score == AutoRaterScore(score=0.0) def test_convert_auto_rater_response_to_score_invalid_json(): @@ -236,8 +241,10 @@ def test_convert_auto_rater_response_to_score_invalid_json(): role="model", ) ) - score = evaluator.convert_auto_rater_response_to_score(llm_response) - assert score is None + auto_rater_score = evaluator.convert_auto_rater_response_to_score( + llm_response + ) + assert auto_rater_score == AutoRaterScore() def test_convert_auto_rater_response_to_score_missing_key(): @@ -248,8 +255,10 @@ def test_convert_auto_rater_response_to_score_missing_key(): role="model", ) ) - score = evaluator.convert_auto_rater_response_to_score(llm_response) - assert score is None + auto_rater_score = evaluator.convert_auto_rater_response_to_score( + llm_response + ) + assert auto_rater_score == AutoRaterScore() def test_aggregate_per_invocation_samples_none_evaluated(): diff --git a/tests/unittests/evaluation/test_gcs_eval_sets_manager.py b/tests/unittests/evaluation/test_gcs_eval_sets_manager.py index 8cb7b7ecb3..1f26148727 100644 --- a/tests/unittests/evaluation/test_gcs_eval_sets_manager.py +++ b/tests/unittests/evaluation/test_gcs_eval_sets_manager.py @@ -101,7 +101,7 @@ def test_gcs_eval_sets_manager_create_eval_set_invalid_id( app_name = "test_app" eval_set_id = "invalid-id" - with pytest.raises(ValueError, match="Invalid Eval Set Id"): + with pytest.raises(ValueError, match="Invalid Eval Set ID"): gcs_eval_sets_manager.create_eval_set(app_name, eval_set_id) def test_gcs_eval_sets_manager_list_eval_sets_success( diff --git a/tests/unittests/evaluation/test_hallucinations_v1.py b/tests/unittests/evaluation/test_hallucinations_v1.py new file mode 100644 index 0000000000..42953743da --- /dev/null +++ b/tests/unittests/evaluation/test_hallucinations_v1.py @@ -0,0 +1,1578 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import json + +from google.adk.evaluation.app_details import AgentDetails +from google.adk.evaluation.app_details import AppDetails +from google.adk.evaluation.eval_case import Invocation +from google.adk.evaluation.eval_case import InvocationEvent +from google.adk.evaluation.eval_case import InvocationEvents +from google.adk.evaluation.eval_metrics import EvalMetric +from google.adk.evaluation.eval_metrics import HallucinationsCriterion +from google.adk.evaluation.eval_metrics import JudgeModelOptions +from google.adk.evaluation.evaluator import EvalStatus +from google.adk.evaluation.hallucinations_v1 import _parse_sentences +from google.adk.evaluation.hallucinations_v1 import _parse_validation_results +from google.adk.evaluation.hallucinations_v1 import HallucinationsV1Evaluator +from google.genai import types as genai_types +import pytest + + +@pytest.fixture +def mock_llm_registry(mocker): + """Mocks LLMRegistry to avoid actual model loading during tests.""" + MockLLMRegistry = mocker.patch( + "google.adk.evaluation.hallucinations_v1.LLMRegistry" + ) + MockLLMRegistry.return_value.resolve.return_value = mocker.MagicMock() + yield + + +@pytest.fixture +def hallucinations_metric(mock_llm_registry): + """Provides a HallucinationsV1Evaluator instance for testing.""" + judge_model_options = JudgeModelOptions( + judge_model="gemini-2.5-flash", + judge_model_config=genai_types.GenerateContentConfig(temperature=0), + num_samples=1, + ) + criterion = HallucinationsCriterion( + threshold=0.5, + judge_model_options=judge_model_options, + evaluate_intermediate_nl_responses=True, + ) + eval_metric = EvalMetric( + metric_name="hallucinations_v1", threshold=0.5, criterion=criterion + ) + metric = HallucinationsV1Evaluator(eval_metric) + return metric + + +class TestParseSentences: + """Test cases for parsing sentences from segmenter response.""" + + def test_parse_sentences_empty(self): + """Tests _parse_sentences method with empty text.""" + text_empty = "" + assert not _parse_sentences(text_empty) + + def test_parse_sentences_no_sentence(self): + """Tests _parse_sentences method with no sentence.""" + text_no_sentence = "This is a sentence." + assert not _parse_sentences(text_no_sentence) + + def test_parse_sentences_one_sentence(self): + """Tests _parse_sentences method with one sentence.""" + text_one_sentence = "This is a sentence." + assert _parse_sentences(text_one_sentence) == ["This is a sentence."] + + def test_parse_sentences_multiple_sentences(self): + """Tests _parse_sentences method with multiple sentences.""" + text_multiple_sentences = ( + "Sentence 1.Sentence 2." + ) + assert _parse_sentences(text_multiple_sentences) == [ + "Sentence 1.", + "Sentence 2.", + ] + + def test_parse_sentences_with_bullets(self): + """Tests _parse_sentences method with sentences containing bullets.""" + text_with_bullets = """There are three kinds of fruits: +1. Apples are red. +2. Bananas are green. +3. Pears are purple.""" + assert _parse_sentences(text_with_bullets) == [ + "There are three kinds of fruits:", + "1. Apples are red.", + "2. Bananas are green.", + "3. Pears are purple.", + ] + + def test_parse_sentences_with_newlines(self): + """Tests _parse_sentences method with sentences containing newlines.""" + text_with_newlines = """This is a sentence with +\n\nnewlines. +This sentence will not be parsed""" + assert _parse_sentences(text_with_newlines) == [ + "This is a sentence with\n\n\nnewlines." + ] + + +class TestParseValidationResults: + """Test cases for parsing validation results from LLM response.""" + + def test_parse_validation_results(self): + """Tests _parse_validation_results method.""" + text = """sentence: Apples are red. +label: supported +rationale: The context explicitly states that apples are red. +supporting_excerpt: Apples are red fruits. +contradicting_excerpt: null + +sentence: Bananas are green. +label: contradictory +rationale: The context states that bananas are yellow, not green. +supporting_excerpt: null +contradicting_excerpt: Bananas are yellow fruits. + +sentence: Pears are purple. +label: disputed +rationale: The context states that pears are purple but it also states that pears are blue. +supporting_excerpt: Pears are purple fruits +contradicting_excerpt: Pears are blue fruits +""" + expected = [ + { + "sentence": "Apples are red.", + "label": "supported", + "rationale": "The context explicitly states that apples are red.", + "supporting_excerpt": "Apples are red fruits.", + "contradicting_excerpt": None, + }, + { + "sentence": "Bananas are green.", + "label": "contradictory", + "rationale": ( + "The context states that bananas are yellow, not green." + ), + "supporting_excerpt": None, + "contradicting_excerpt": "Bananas are yellow fruits.", + }, + { + "sentence": "Pears are purple.", + "label": "disputed", + "rationale": ( + "The context states that pears are purple but it also states" + " that pears are blue." + ), + "supporting_excerpt": "Pears are purple fruits", + "contradicting_excerpt": "Pears are blue fruits", + }, + ] + assert _parse_validation_results(text) == expected + + def test_parse_validation_results_empty(self): + """Tests _parse_validation_results with empty input.""" + text = "" + assert not _parse_validation_results(text) + + +class TestEvaluateNlResponse: + """Test cases for _evaluate_nl_response method.""" + + def _create_genai_response(self, text, mocker): + response_mock = mocker.MagicMock() + response_mock.content = genai_types.Content( + parts=[genai_types.Part(text=text)] + ) + return response_mock + + @pytest.mark.asyncio + async def test_evaluate_nl_response_unexpected_labels( + self, hallucinations_metric, mocker + ): + """Tests _evaluate_nl_response with unexpected labels.""" + metric = hallucinations_metric + seg_response = self._create_genai_response( + "sentence 1sentence 2", mocker + ) + val_response_text = """sentence: sentence 1 +label: +rationale: r1 +supporting_excerpt: null +contradicting_excerpt: null + +sentence: sentence 2 +label: unexpected +rationale: r2 +supporting_excerpt: null +contradicting_excerpt: null +""" + val_response = self._create_genai_response(val_response_text, mocker) + + async def seg_gen(): + yield seg_response + + async def val_gen(): + yield val_response + + metric._judge_model.generate_content_async = mocker.MagicMock( + side_effect=[ + seg_gen(), + val_gen(), + ] + ) + score, _ = await metric._evaluate_nl_response("nl", "ctx") + assert score is None + + @pytest.mark.asyncio + async def test_evaluate_nl_response_missing_label( + self, hallucinations_metric, mocker + ): + """Tests _evaluate_nl_response with missing labels in validation results.""" + metric = hallucinations_metric + seg_response = self._create_genai_response( + "sentence 1", mocker + ) + val_response = self._create_genai_response("val_response", mocker) + + async def seg_gen(): + yield seg_response + + async def val_gen(): + yield val_response + + metric._judge_model.generate_content_async = mocker.MagicMock( + side_effect=[ + seg_gen(), + val_gen(), + ] + ) + score, _ = await metric._evaluate_nl_response("nl", "ctx") + assert score is None + + +@pytest.fixture +def create_context_data(): + """Provides data for TestCreateContext.""" + app_details = AppDetails( + agent_details={ + "root": AgentDetails( + name="root", + instructions="Root agent instructions.", + tool_declarations=[ + genai_types.Tool( + function_declarations=[ + genai_types.FunctionDeclaration(name="tool1") + ] + ) + ], + ), + }, + ) + user_content = genai_types.Content( + parts=[genai_types.Part(text="User query.")] + ) + events = [ + InvocationEvent( + author="root", + content=genai_types.Content( + parts=[ + genai_types.Part( + function_call=genai_types.FunctionCall( + id="1", name="tool1", args={} + ) + ) + ] + ), + ), + InvocationEvent( + author="root", + content=genai_types.Content( + parts=[ + genai_types.Part( + function_response=genai_types.FunctionResponse( + id="1", + name="tool1", + response={"result": "tool1 response"}, + ) + ) + ] + ), + ), + InvocationEvent( + author="root", + content=genai_types.Content( + parts=[ + genai_types.Part(text="Intermediate NL response."), + genai_types.Part( + function_call=genai_types.FunctionCall( + id="2", name="tool1", args={} + ) + ), + ] + ), + ), + InvocationEvent( + author="root", + content=genai_types.Content( + parts=[ + genai_types.Part( + function_response=genai_types.FunctionResponse( + id="2", + name="tool1", + response={"result": "tool1 response 2"}, + ) + ) + ] + ), + ), + ] + invocation = Invocation( + app_details=app_details, + user_content=user_content, + intermediate_data=InvocationEvents(invocation_events=events), + ) + return app_details, events, invocation + + +class TestCreateContext: + """Test cases for creating the context in the validator prompt.""" + + def test_create_context_for_intermediate_step( + self, hallucinations_metric, create_context_data + ): + """Tests _create_context_for_step method.""" + app_details, events, invocation = create_context_data + context = hallucinations_metric._create_context_for_step( + app_details, invocation, events[:2] + ) + expected_context = R"""Developer instructions: +root: +Root agent instructions. + +User prompt: +User query. + +Tool definitions: +{ + "tool_declarations": { + "root": [ + { + "function_declarations": [ + { + "name": "tool1" + } + ] + } + ] + } +} + +tool_calls: +[ + { + "id": "1", + "args": {}, + "name": "tool1" + } +] + +tool_outputs: +[ + { + "id": "1", + "name": "tool1", + "response": { + "result": "tool1 response" + } + } +] + """ + assert context.strip() == expected_context.strip() + + def test_create_context_for_final_step( + self, hallucinations_metric, create_context_data + ): + """Tests _create_context_for_step method.""" + app_details, events, invocation = create_context_data + context = hallucinations_metric._create_context_for_step( + app_details, invocation, events + ) + expected_context = R"""Developer instructions: +root: +Root agent instructions. + +User prompt: +User query. + +Tool definitions: +{ + "tool_declarations": { + "root": [ + { + "function_declarations": [ + { + "name": "tool1" + } + ] + } + ] + } +} + +tool_calls: +[ + { + "id": "1", + "args": {}, + "name": "tool1" + } +] + +tool_outputs: +[ + { + "id": "1", + "name": "tool1", + "response": { + "result": "tool1 response" + } + } +] + +Intermediate NL response. + +tool_calls: +[ + { + "id": "2", + "args": {}, + "name": "tool1" + } +] + +tool_outputs: +[ + { + "id": "2", + "name": "tool1", + "response": { + "result": "tool1 response 2" + } + } +] + """ + assert context.strip() == expected_context.strip() + + +@pytest.fixture +def agent_tree_data(): + """Provides data for TestEvaluateInvocationsAgentTree.""" + app_details = AppDetails( + agent_details={ + "root": AgentDetails( + name="root", + instructions="Root agent instructions.", + tool_declarations=[ + genai_types.Tool( + function_declarations=[ + genai_types.FunctionDeclaration(name="tool_root") + ] + ) + ], + ), + "agent1": AgentDetails( + name="agent1", + instructions="Agent1 instructions.", + tool_declarations=[ + genai_types.Tool( + function_declarations=[ + genai_types.FunctionDeclaration(name="tool_agent1") + ] + ) + ], + ), + "agent2": AgentDetails( + name="agent2", + instructions="Agent2 instructions.", + tool_declarations=[], + ), + }, + ) + user_content = genai_types.Content( + parts=[genai_types.Part(text="User query for agent tree.")] + ) + events = [ + InvocationEvent( + author="root", + content=genai_types.Content( + parts=[genai_types.Part(text="Hi, I am root.")] + ), + ), + InvocationEvent( + author="root", + content=genai_types.Content( + parts=[ + genai_types.Part( + function_call=genai_types.FunctionCall( + name="tool_root", args={} + ) + ) + ] + ), + ), + InvocationEvent( + author="root", + content=genai_types.Content( + parts=[ + genai_types.Part( + function_response=genai_types.FunctionResponse( + name="tool_root", + response={"result": "tool_root response"}, + ) + ) + ] + ), + ), + InvocationEvent( + author="agent1", + content=genai_types.Content( + parts=[ + genai_types.Part( + function_call=genai_types.FunctionCall( + name="tool_agent1", args={"q": 1} + ) + ) + ] + ), + ), + InvocationEvent( + author="agent1", + content=genai_types.Content( + parts=[ + genai_types.Part( + function_response=genai_types.FunctionResponse( + name="tool_agent1", response={"r": 2} + ) + ) + ] + ), + ), + InvocationEvent( + author="agent2", + content=genai_types.Content( + parts=[genai_types.Part(text="Agent2 response.")] + ), + ), + ] + invocation = Invocation( + app_details=app_details, + user_content=user_content, + intermediate_data=InvocationEvents(invocation_events=events), + final_response=genai_types.Content( + parts=[genai_types.Part(text="Final agent tree response.")] + ), + ) + expected_invocation = Invocation( + app_details=app_details, + user_content=user_content, + final_response=genai_types.Content( + parts=[genai_types.Part(text="Final agent tree response.")] + ), + ) + return invocation, expected_invocation + + +class TestEvaluateInvocationsAgentTree: + """Test cases for agent tree.""" + + @pytest.mark.asyncio + async def test_evaluate_invocations_multi_agents( + self, hallucinations_metric, agent_tree_data, mocker + ): + """Tests evaluate_invocations with agent tree and checks contexts.""" + invocation, expected_invocation = agent_tree_data + metric = hallucinations_metric + expected_context0 = R"""Developer instructions: +root: +Root agent instructions. + +agent1: +Agent1 instructions. + +agent2: +Agent2 instructions. + +User prompt: +User query for agent tree. + +Tool definitions: +{ + "tool_declarations": { + "root": [ + { + "function_declarations": [ + { + "name": "tool_root" + } + ] + } + ], + "agent1": [ + { + "function_declarations": [ + { + "name": "tool_agent1" + } + ] + } + ], + "agent2": [] + } +}""" + expected_context5 = R"""Developer instructions: +root: +Root agent instructions. + +agent1: +Agent1 instructions. + +agent2: +Agent2 instructions. + +User prompt: +User query for agent tree. + +Tool definitions: +{ + "tool_declarations": { + "root": [ + { + "function_declarations": [ + { + "name": "tool_root" + } + ] + } + ], + "agent1": [ + { + "function_declarations": [ + { + "name": "tool_agent1" + } + ] + } + ], + "agent2": [] + } +} + +Hi, I am root. + +tool_calls: +[ + { + "args": {}, + "name": "tool_root" + } +] + +tool_outputs: +[ + { + "name": "tool_root", + "response": { + "result": "tool_root response" + } + } +] + +tool_calls: +[ + { + "args": { + "q": 1 + }, + "name": "tool_agent1" + } +] + +tool_outputs: +[ + { + "name": "tool_agent1", + "response": { + "r": 2 + } + } +]""" + expected_context6 = R"""Developer instructions: +root: +Root agent instructions. + +agent1: +Agent1 instructions. + +agent2: +Agent2 instructions. + +User prompt: +User query for agent tree. + +Tool definitions: +{ + "tool_declarations": { + "root": [ + { + "function_declarations": [ + { + "name": "tool_root" + } + ] + } + ], + "agent1": [ + { + "function_declarations": [ + { + "name": "tool_agent1" + } + ] + } + ], + "agent2": [] + } +} + +Hi, I am root. + +tool_calls: +[ + { + "args": {}, + "name": "tool_root" + } +] + +tool_outputs: +[ + { + "name": "tool_root", + "response": { + "result": "tool_root response" + } + } +] + +tool_calls: +[ + { + "args": { + "q": 1 + }, + "name": "tool_agent1" + } +] + +tool_outputs: +[ + { + "name": "tool_agent1", + "response": { + "r": 2 + } + } +] + +Agent2 response. +""" + + async def mock_evaluate_nl_response(nl_response, context): + if nl_response == "Hi, I am root.": + assert context.strip() == expected_context0.strip() + return 1.0, json.dumps( + [{"sentence": "Hi, I am root.", "label": "supported"}] + ) + elif nl_response == "Agent2 response.": + assert context.strip() == expected_context5.strip() + return 0.5, json.dumps( + [{"sentence": "Agent2 response.", "label": "unsupported"}] + ) + elif nl_response == "Final agent tree response.": + assert context.strip() == expected_context6.strip() + return 0.0, json.dumps([{ + "sentence": "Final agent tree response.", + "label": "contradictory", + }]) + return None, "error" + + mocker.patch( + "google.adk.evaluation.hallucinations_v1.HallucinationsV1Evaluator._evaluate_nl_response", + side_effect=mock_evaluate_nl_response, + ) + result = await metric.evaluate_invocations( + [invocation], [expected_invocation] + ) + + assert result.overall_score == pytest.approx(0.5) + assert len(result.per_invocation_results) == 1 + per_invocation_result = result.per_invocation_results[0] + assert per_invocation_result.score == pytest.approx(0.5) + + @pytest.mark.asyncio + async def test_evaluate_invocations_agent_tree_skip_intermediate( + self, mock_llm_registry, agent_tree_data, mocker + ): + """Tests evaluate_invocations with agent tree skipping intermediate steps.""" + invocation, expected_invocation = agent_tree_data + judge_model_options = JudgeModelOptions( + judge_model="gemini-2.5-flash", + judge_model_config=genai_types.GenerateContentConfig(temperature=0), + num_samples=1, + ) + criterion = HallucinationsCriterion( + threshold=0.5, + judge_model_options=judge_model_options, + evaluate_intermediate_nl_responses=False, + ) + eval_metric = EvalMetric( + metric_name="hallucinations_v1", threshold=0.5, criterion=criterion + ) + metric = HallucinationsV1Evaluator(eval_metric) + expected_context = R"""Developer instructions: +root: +Root agent instructions. + +agent1: +Agent1 instructions. + +agent2: +Agent2 instructions. + +User prompt: +User query for agent tree. + +Tool definitions: +{ + "tool_declarations": { + "root": [ + { + "function_declarations": [ + { + "name": "tool_root" + } + ] + } + ], + "agent1": [ + { + "function_declarations": [ + { + "name": "tool_agent1" + } + ] + } + ], + "agent2": [] + } +} + +Hi, I am root. + +tool_calls: +[ + { + "args": {}, + "name": "tool_root" + } +] + +tool_outputs: +[ + { + "name": "tool_root", + "response": { + "result": "tool_root response" + } + } +] + +tool_calls: +[ + { + "args": { + "q": 1 + }, + "name": "tool_agent1" + } +] + +tool_outputs: +[ + { + "name": "tool_agent1", + "response": { + "r": 2 + } + } +] + +Agent2 response. +""" + + async def mock_evaluate_nl_response(nl_response, context): + # Expect only the final response to be evaluated. + assert nl_response == "Final agent tree response." + assert context.strip() == expected_context.strip() + return 0.0, json.dumps([{ + "sentence": "Final agent tree response.", + "label": "contradictory", + }]) + + mocker.patch( + "google.adk.evaluation.hallucinations_v1.HallucinationsV1Evaluator._evaluate_nl_response", + side_effect=mock_evaluate_nl_response, + ) + result = await metric.evaluate_invocations( + [invocation], [expected_invocation] + ) + + assert result.overall_score == 0.0 + assert len(result.per_invocation_results) == 1 + per_invocation_result = result.per_invocation_results[0] + assert per_invocation_result.score == 0.0 + + +@pytest.fixture +def time_weather_data(): + """Provides data for TestEvaluateInvocationsTimeWeather.""" + app_details = AppDetails( + agent_details={ + "root": AgentDetails( + name="root", + instructions=( + "You are an agent that can get the current time and weather." + ), + tool_declarations=[ + genai_types.Tool( + function_declarations=[ + genai_types.FunctionDeclaration( + name="get_current_time", + ), + genai_types.FunctionDeclaration(name="get_weather"), + ] + ) + ], + ), + }, + ) + user_content = genai_types.Content( + parts=[ + genai_types.Part( + text="Get the current time and weather of San Francisco." + ) + ] + ) + response1 = ( + "The time in San Francisco is currently 10:30am PST. The date is" + " September 21, 2025. I will now get the weather." + ) + response2 = ( + "It is currently September 19, 2025, 10:30am PST in San Francisco. The" + " weather is 65F with partly cloudy skies." + ) + events = [ + InvocationEvent( + author="root", + content=genai_types.Content( + parts=[ + genai_types.Part( + function_call=genai_types.FunctionCall( + name="get_current_time", + args={"location": "San Francisco, CA"}, + ) + ) + ] + ), + ), + InvocationEvent( + author="root", + content=genai_types.Content( + parts=[ + genai_types.Part( + function_response=genai_types.FunctionResponse( + name="get_current_time", + response={"time": "10:30 AM PST Sep 19, 2025"}, + ) + ) + ] + ), + ), + InvocationEvent( + author="root", + content=genai_types.Content( + parts=[ + genai_types.Part(text=response1), + genai_types.Part( + function_call=genai_types.FunctionCall( + name="get_weather", + args={ + "location": "San Francisco, CA", + "time": "10:30 AM PST Sep 19, 2025", + }, + ) + ), + ] + ), + ), + InvocationEvent( + author="root", + content=genai_types.Content( + parts=[ + genai_types.Part( + function_response=genai_types.FunctionResponse( + name="get_weather", + response={"weather": "Partly cloudy, 65F"}, + ) + ) + ] + ), + ), + ] + invocation = Invocation( + app_details=app_details, + user_content=user_content, + intermediate_data=InvocationEvents(invocation_events=events), + final_response=genai_types.Content( + parts=[genai_types.Part(text=response2)] + ), + ) + return invocation, response1, response2 + + +class TestEvaluateInvocationsTimeWeather: + """Test cases for time/weather agent.""" + + @pytest.mark.asyncio + async def test_evaluate_invocations_time_weather( + self, hallucinations_metric, time_weather_data, mocker + ): + """Tests evaluate_invocations with time/weather agent.""" + invocation, response1, response2 = time_weather_data + metric = hallucinations_metric + expected_context_1 = R"""Developer instructions: +root: +You are an agent that can get the current time and weather. + +User prompt: +Get the current time and weather of San Francisco. + +Tool definitions: +{ + "tool_declarations": { + "root": [ + { + "function_declarations": [ + { + "name": "get_current_time" + }, + { + "name": "get_weather" + } + ] + } + ] + } +} + +tool_calls: +[ + { + "args": { + "location": "San Francisco, CA" + }, + "name": "get_current_time" + } +] + +tool_outputs: +[ + { + "name": "get_current_time", + "response": { + "time": "10:30 AM PST Sep 19, 2025" + } + } +] +""" + expected_context_2 = R"""Developer instructions: +root: +You are an agent that can get the current time and weather. + +User prompt: +Get the current time and weather of San Francisco. + +Tool definitions: +{ + "tool_declarations": { + "root": [ + { + "function_declarations": [ + { + "name": "get_current_time" + }, + { + "name": "get_weather" + } + ] + } + ] + } +} + +tool_calls: +[ + { + "args": { + "location": "San Francisco, CA" + }, + "name": "get_current_time" + } +] + +tool_outputs: +[ + { + "name": "get_current_time", + "response": { + "time": "10:30 AM PST Sep 19, 2025" + } + } +] + +The time in San Francisco is currently 10:30am PST. The date is September 21, 2025. I will now get the weather. + +tool_calls: +[ + { + "args": { + "location": "San Francisco, CA", + "time": "10:30 AM PST Sep 19, 2025" + }, + "name": "get_weather" + } +] + +tool_outputs: +[ + { + "name": "get_weather", + "response": { + "weather": "Partly cloudy, 65F" + } + } +] +""" + + async def mock_evaluate_nl_response(nl_response, context): + if nl_response == response1: + assert context.strip() == expected_context_1.strip() + sentence1, sentence2, sentence3, _ = response1.split(".") + return 2.0 / 3.0, json.dumps([ + {"sentence": sentence1, "label": "supported"}, + {"sentence": sentence2, "label": "contradictory"}, + {"sentence": sentence3, "label": "supported"}, + ]) + elif nl_response == response2: + assert context.strip() == expected_context_2.strip() + sentence1, sentence2, _ = response2.split(".") + return 1.0, json.dumps([ + {"sentence": sentence1, "label": "supported"}, + {"sentence": sentence2, "label": "supported"}, + ]) + return None, "error" + + mocker.patch( + "google.adk.evaluation.hallucinations_v1.HallucinationsV1Evaluator._evaluate_nl_response", + side_effect=mock_evaluate_nl_response, + ) + result = await metric.evaluate_invocations([invocation], [invocation]) + + assert result.overall_score == pytest.approx(5 / 6) + assert len(result.per_invocation_results) == 1 + per_invocation_result = result.per_invocation_results[0] + assert per_invocation_result.score == pytest.approx(5 / 6) + + @pytest.mark.asyncio + async def test_evaluate_invocations_time_weather_skip_intermediate( + self, mock_llm_registry, time_weather_data, mocker + ): + """Tests evaluate_invocations with time/weather agent.""" + invocation, _, response2 = time_weather_data + judge_model_options = JudgeModelOptions( + judge_model="gemini-2.5-flash", + judge_model_config=genai_types.GenerateContentConfig(temperature=0), + num_samples=1, + ) + criterion = HallucinationsCriterion( + threshold=0.5, + judge_model_options=judge_model_options, + evaluate_intermediate_nl_responses=False, + ) + eval_metric = EvalMetric( + metric_name="hallucinations_v1", threshold=0.5, criterion=criterion + ) + metric = HallucinationsV1Evaluator(eval_metric) + expected_context = R"""Developer instructions: +root: +You are an agent that can get the current time and weather. + +User prompt: +Get the current time and weather of San Francisco. + +Tool definitions: +{ + "tool_declarations": { + "root": [ + { + "function_declarations": [ + { + "name": "get_current_time" + }, + { + "name": "get_weather" + } + ] + } + ] + } +} + +tool_calls: +[ + { + "args": { + "location": "San Francisco, CA" + }, + "name": "get_current_time" + } +] + +tool_outputs: +[ + { + "name": "get_current_time", + "response": { + "time": "10:30 AM PST Sep 19, 2025" + } + } +] + +The time in San Francisco is currently 10:30am PST. The date is September 21, 2025. I will now get the weather. + +tool_calls: +[ + { + "args": { + "location": "San Francisco, CA", + "time": "10:30 AM PST Sep 19, 2025" + }, + "name": "get_weather" + } +] + +tool_outputs: +[ + { + "name": "get_weather", + "response": { + "weather": "Partly cloudy, 65F" + } + } +] +""" + + async def mock_evaluate_nl_response(nl_response, context): + # Expect only the final response to be evaluated. + assert nl_response == response2 + assert context.strip() == expected_context.strip() + sentence1, sentence2, _ = response2.split(".") + return 1.0, json.dumps([ + {"sentence": sentence1, "label": "supported"}, + {"sentence": sentence2, "label": "supported"}, + ]) + + mocker.patch( + "google.adk.evaluation.hallucinations_v1.HallucinationsV1Evaluator._evaluate_nl_response", + side_effect=mock_evaluate_nl_response, + ) + result = await metric.evaluate_invocations([invocation], [invocation]) + + assert result.overall_score == 1.0 + assert len(result.per_invocation_results) == 1 + per_invocation_result = result.per_invocation_results[0] + assert per_invocation_result.score == 1.0 + + +@pytest.mark.asyncio +async def test_evaluate_invocations_success_path(hallucinations_metric, mocker): + metric = hallucinations_metric + app_details = AppDetails( + agent_details={ + "root": AgentDetails( + name="root", + instructions="Root agent instructions.", + tool_declarations=[], + ), + }, + ) + user_content = genai_types.Content( + parts=[genai_types.Part(text="User query.")] + ) + actual_invocation = Invocation( + app_details=app_details, + user_content=user_content, + intermediate_data=InvocationEvents( + invocation_events=[ + InvocationEvent( + author="root", + content=genai_types.Content( + parts=[ + genai_types.Part(text="Intermediate NL response."), + ] + ), + ), + InvocationEvent( + author="root", + content=genai_types.Content( + parts=[ + genai_types.Part( + text="Another intermediate NL response." + ), + ] + ), + ), + ] + ), + final_response=genai_types.Content( + parts=[genai_types.Part(text="Final response.")] + ), + ) + expected_invocation = Invocation( + app_details=app_details, + user_content=user_content, + final_response=genai_types.Content( + parts=[genai_types.Part(text="Final response.")] + ), + ) + + async def mock_evaluate_nl_response(nl_response, context): + if nl_response == "Intermediate NL response.": + return 1.0, json.dumps( + [{"sentence": "Intermediate NL response.", "label": "supported"}] + ) + elif nl_response == "Another intermediate NL response.": + return 0.5, json.dumps([{ + "sentence": "Another intermediate NL response.", + "label": "unsupported", + }]) + elif nl_response == "Final response.": + return 0.0, json.dumps( + [{"sentence": "Final response.", "label": "contradictory"}] + ) + return None, "error" + + mocker.patch( + "google.adk.evaluation.hallucinations_v1.HallucinationsV1Evaluator._evaluate_nl_response", + side_effect=mock_evaluate_nl_response, + ) + result = await metric.evaluate_invocations( + [actual_invocation], [expected_invocation] + ) + + assert result.overall_score == pytest.approx(0.5) + assert len(result.per_invocation_results) == 1 + per_invocation_result = result.per_invocation_results[0] + assert per_invocation_result.score == pytest.approx(0.5) + + +@pytest.mark.asyncio +async def test_evaluate_invocations_no_nl_response(hallucinations_metric): + metric = hallucinations_metric + app_details = AppDetails( + agent_details={ + "root": AgentDetails( + name="root", + instructions="Root agent instructions.", + tool_declarations=[], + ), + }, + ) + user_content = genai_types.Content( + parts=[genai_types.Part(text="User query.")] + ) + actual_invocation = Invocation( + app_details=app_details, + user_content=user_content, + intermediate_data=InvocationEvents( + invocation_events=[ + InvocationEvent( + author="root", + content=genai_types.Content( + parts=[ + genai_types.Part( + function_call=genai_types.FunctionCall( + name="tool1", args={} + ) + ) + ] + ), + ), + ] + ), + final_response=None, + ) + expected_invocation = Invocation( + app_details=app_details, + user_content=user_content, + ) + + result = await metric.evaluate_invocations( + [actual_invocation], [expected_invocation] + ) + assert result.overall_score is None + assert len(result.per_invocation_results) == 1 + per_invocation_result = result.per_invocation_results[0] + assert per_invocation_result.score is None + assert per_invocation_result.eval_status == EvalStatus.NOT_EVALUATED + + +@pytest.mark.asyncio +async def test_evaluate_all_invocations_not_evaluated( + hallucinations_metric, mocker +): + metric = hallucinations_metric + app_details = AppDetails( + agent_details={ + "root": AgentDetails( + name="root", + instructions="Root agent instructions.", + tool_declarations=[], + ), + }, + ) + user_content = genai_types.Content( + parts=[genai_types.Part(text="User query.")] + ) + actual_invocation = Invocation( + app_details=app_details, + user_content=user_content, + intermediate_data=InvocationEvents( + invocation_events=[ + InvocationEvent( + author="root", + content=genai_types.Content( + parts=[ + genai_types.Part(text="Intermediate NL response."), + ] + ), + ), + ] + ), + final_response=genai_types.Content( + parts=[genai_types.Part(text="Final response.")] + ), + ) + expected_invocation = Invocation( + app_details=app_details, + user_content=user_content, + final_response=genai_types.Content( + parts=[genai_types.Part(text="Final response.")] + ), + ) + + async def mock_evaluate_nl_response(nl_response, context): + return None, "Judge model error." + + mocker.patch( + "google.adk.evaluation.hallucinations_v1.HallucinationsV1Evaluator._evaluate_nl_response", + side_effect=mock_evaluate_nl_response, + ) + result = await metric.evaluate_invocations( + [actual_invocation, actual_invocation], + [expected_invocation, expected_invocation], + ) + + assert len(result.per_invocation_results) == 2 + assert result.per_invocation_results[0].score is None + assert ( + result.per_invocation_results[0].eval_status == EvalStatus.NOT_EVALUATED + ) + assert result.per_invocation_results[1].score is None + assert ( + result.per_invocation_results[1].eval_status == EvalStatus.NOT_EVALUATED + ) + assert result.overall_score is None + assert result.overall_eval_status == EvalStatus.NOT_EVALUATED + + +@pytest.mark.asyncio +async def test_evaluate_invocations_partial_failure( + hallucinations_metric, mocker +): + metric = hallucinations_metric + app_details = AppDetails( + agent_details={ + "root": AgentDetails( + name="root", + instructions="Root agent instructions.", + tool_declarations=[], + ), + }, + ) + user_content = genai_types.Content( + parts=[genai_types.Part(text="User query.")] + ) + actual_invocation = Invocation( + app_details=app_details, + user_content=user_content, + intermediate_data=InvocationEvents( + invocation_events=[ + InvocationEvent( + author="root", + content=genai_types.Content( + parts=[ + genai_types.Part(text="Intermediate NL response."), + ] + ), + ), + ] + ), + final_response=genai_types.Content( + parts=[genai_types.Part(text="Final response.")] + ), + ) + expected_invocation = Invocation( + app_details=app_details, + user_content=user_content, + final_response=genai_types.Content( + parts=[genai_types.Part(text="Final response.")] + ), + ) + + async def mock_evaluate_nl_response(nl_response, context): + if nl_response == "Intermediate NL response.": + return 0.8, json.dumps( + [{"sentence": "Intermediate NL response.", "label": "supported"}] + ) + elif nl_response == "Final response.": + return None, "some error during evaluation" + return None, "error" + + mocker.patch( + "google.adk.evaluation.hallucinations_v1.HallucinationsV1Evaluator._evaluate_nl_response", + side_effect=mock_evaluate_nl_response, + ) + result = await metric.evaluate_invocations( + [actual_invocation], [expected_invocation] + ) + + assert result.overall_score == 0.8 + assert len(result.per_invocation_results) == 1 + per_invocation_result = result.per_invocation_results[0] + assert per_invocation_result.score == 0.8 diff --git a/tests/unittests/evaluation/test_llm_as_judge.py b/tests/unittests/evaluation/test_llm_as_judge.py index d03d88b28e..eb5a11543b 100644 --- a/tests/unittests/evaluation/test_llm_as_judge.py +++ b/tests/unittests/evaluation/test_llm_as_judge.py @@ -15,7 +15,6 @@ from __future__ import annotations from typing import Optional -from unittest.mock import MagicMock from google.adk.evaluation.eval_case import Invocation from google.adk.evaluation.eval_metrics import EvalMetric @@ -24,6 +23,7 @@ from google.adk.evaluation.evaluator import EvalStatus from google.adk.evaluation.evaluator import EvaluationResult from google.adk.evaluation.evaluator import PerInvocationResult +from google.adk.evaluation.llm_as_judge import AutoRaterScore from google.adk.evaluation.llm_as_judge import LlmAsJudge from google.adk.evaluation.llm_as_judge_utils import get_eval_status from google.adk.evaluation.llm_as_judge_utils import get_text_from_content @@ -41,8 +41,8 @@ def format_auto_rater_prompt( def convert_auto_rater_response_to_score( self, llm_response: LlmResponse - ) -> Optional[float]: - return 1.0 + ) -> AutoRaterScore: + return AutoRaterScore(score=1.0) def aggregate_per_invocation_samples( self, @@ -127,8 +127,8 @@ def test_llm_as_judge_init_unregistered_model(): @pytest.fixture -def mock_judge_model(): - mock_judge_model = MagicMock() +def mock_judge_model(mocker): + mock_judge_model = mocker.MagicMock() async def mock_generate_content_async(llm_request): yield LlmResponse( @@ -143,30 +143,30 @@ async def mock_generate_content_async(llm_request): @pytest.mark.asyncio async def test_evaluate_invocations_with_mock( - mock_llm_as_judge, mock_judge_model + mock_llm_as_judge, mock_judge_model, mocker ): mock_llm_as_judge._judge_model = mock_judge_model - mock_format_auto_rater_prompt = MagicMock( + mock_format_auto_rater_prompt = mocker.MagicMock( wraps=mock_llm_as_judge.format_auto_rater_prompt ) mock_llm_as_judge.format_auto_rater_prompt = mock_format_auto_rater_prompt - mock_convert_auto_rater_response_to_score = MagicMock( + mock_convert_auto_rater_response_to_score = mocker.MagicMock( wraps=mock_llm_as_judge.convert_auto_rater_response_to_score ) mock_llm_as_judge.convert_auto_rater_response_to_score = ( mock_convert_auto_rater_response_to_score ) - mock_aggregate_per_invocation_samples = MagicMock( + mock_aggregate_per_invocation_samples = mocker.MagicMock( wraps=mock_llm_as_judge.aggregate_per_invocation_samples ) mock_llm_as_judge.aggregate_per_invocation_samples = ( mock_aggregate_per_invocation_samples ) - mock_aggregate_invocation_results = MagicMock( + mock_aggregate_invocation_results = mocker.MagicMock( wraps=mock_llm_as_judge.aggregate_invocation_results ) mock_llm_as_judge.aggregate_invocation_results = ( diff --git a/tests/unittests/evaluation/test_llm_as_judge_utils.py b/tests/unittests/evaluation/test_llm_as_judge_utils.py new file mode 100644 index 0000000000..2e3472f5ca --- /dev/null +++ b/tests/unittests/evaluation/test_llm_as_judge_utils.py @@ -0,0 +1,290 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import json + +from google.adk.evaluation.app_details import AgentDetails +from google.adk.evaluation.app_details import AppDetails +from google.adk.evaluation.eval_case import IntermediateData +from google.adk.evaluation.eval_case import InvocationEvent +from google.adk.evaluation.eval_case import InvocationEvents +from google.adk.evaluation.eval_rubrics import RubricScore +from google.adk.evaluation.evaluator import EvalStatus +from google.adk.evaluation.llm_as_judge_utils import get_average_rubric_score +from google.adk.evaluation.llm_as_judge_utils import get_eval_status +from google.adk.evaluation.llm_as_judge_utils import get_text_from_content +from google.adk.evaluation.llm_as_judge_utils import get_tool_calls_and_responses_as_json_str +from google.adk.evaluation.llm_as_judge_utils import get_tool_declarations_as_json_str +from google.genai import types as genai_types + + +def test_get_text_from_content_with_none(): + """Tests get_text_from_content with None as input.""" + assert get_text_from_content(None) is None + + +def test_get_text_from_content_with_content_and_none_parts(): + """Tests get_text_from_content with Content that has None for parts.""" + content = genai_types.Content(parts=None) + assert get_text_from_content(content) is None + + +def test_get_text_from_content_with_empty_parts(): + """Tests get_text_from_content with an empty parts list.""" + content = genai_types.Content(parts=[]) + assert get_text_from_content(content) == None + + +def test_get_text_from_content_with_parts_but_no_text(): + """Tests get_text_from_content with parts that do not contain text.""" + content = genai_types.Content( + parts=[ + genai_types.Part( + function_call=genai_types.FunctionCall(name="test_func") + ) + ] + ) + assert get_text_from_content(content) == "" + + +def test_get_text_from_content_with_single_text_part(): + """Tests get_text_from_content with a single text part.""" + content = genai_types.Content(parts=[genai_types.Part(text="Hello")]) + assert get_text_from_content(content) == "Hello" + + +def test_get_text_from_content_with_multiple_text_parts(): + """Tests get_text_from_content with multiple text parts.""" + content = genai_types.Content( + parts=[genai_types.Part(text="Hello"), genai_types.Part(text="World")] + ) + assert get_text_from_content(content) == "Hello\nWorld" + + +def test_get_text_from_content_with_mixed_parts(): + """Tests get_text_from_content with a mix of text and non-text parts.""" + content = genai_types.Content( + parts=[ + genai_types.Part(text="Hello"), + genai_types.Part( + function_call=genai_types.FunctionCall(name="test_func") + ), + genai_types.Part(text="World"), + ] + ) + assert get_text_from_content(content) == "Hello\nWorld" + + +def test_get_eval_status_with_none_score(): + """Tests get_eval_status returns NOT_EVALUATED for a None score.""" + assert get_eval_status(score=None, threshold=0.5) == EvalStatus.NOT_EVALUATED + + +def test_get_eval_status_when_score_is_greater_than_threshold(): + """Tests get_eval_status returns PASSED when score > threshold.""" + assert get_eval_status(score=0.8, threshold=0.5) == EvalStatus.PASSED + + +def test_get_eval_status_when_score_is_equal_to_threshold(): + """Tests get_eval_status returns PASSED when score == threshold.""" + assert get_eval_status(score=0.5, threshold=0.5) == EvalStatus.PASSED + + +def test_get_eval_status_when_score_is_less_than_threshold(): + """Tests get_eval_status returns FAILED when score < threshold.""" + assert get_eval_status(score=0.4, threshold=0.5) == EvalStatus.FAILED + + +def test_get_average_rubric_score_with_empty_list(): + """Tests get_average_rubric_score returns None for an empty list.""" + assert get_average_rubric_score([]) is None + + +def test_get_average_rubric_score_with_all_none_scores(): + """Tests get_average_rubric_score returns None when all scores are None.""" + rubric_scores = [ + RubricScore(rubric_id="1", score=None), + RubricScore(rubric_id="2", score=None), + ] + assert get_average_rubric_score(rubric_scores) is None + + +def test_get_average_rubric_score_with_single_score(): + """Tests get_average_rubric_score with a single valid score.""" + rubric_scores = [RubricScore(rubric_id="1", score=0.8)] + assert get_average_rubric_score(rubric_scores) == 0.8 + + +def test_get_average_rubric_score_with_multiple_scores(): + """Tests get_average_rubric_score with multiple valid scores.""" + rubric_scores = [ + RubricScore(rubric_id="1", score=0.8), + RubricScore(rubric_id="2", score=0.6), + ] + assert get_average_rubric_score(rubric_scores) == 0.7 + + +def test_get_average_rubric_score_with_mixed_scores(): + """Tests get_average_rubric_score with a mix of valid and None scores.""" + rubric_scores = [ + RubricScore(rubric_id="1", score=0.8), + RubricScore(rubric_id="2", score=None), + RubricScore(rubric_id="3", score=0.6), + ] + assert get_average_rubric_score(rubric_scores) == 0.7 + + +def test_get_tool_declarations_as_json_str_with_no_agents(): + """Tests get_tool_declarations_as_json_str with no agents.""" + app_details = AppDetails(agent_details={}) + expected_json = {"tool_declarations": {}} + actual_json_str = get_tool_declarations_as_json_str(app_details) + assert json.loads(actual_json_str) == expected_json + + +def test_get_tool_declarations_as_json_str_with_agent_no_tools(): + """Tests get_tool_declarations_as_json_str with an agent that has no tools.""" + agent_details = {"agent1": AgentDetails(name="agent1", tool_declarations=[])} + app_details = AppDetails(agent_details=agent_details) + expected_json = {"tool_declarations": {"agent1": []}} + actual_json_str = get_tool_declarations_as_json_str(app_details) + assert json.loads(actual_json_str) == expected_json + + +def test_get_tool_declarations_as_json_str_with_agent_with_tools(): + """Tests get_tool_declarations_as_json_str with an agent that has tools.""" + tool1 = genai_types.Tool( + function_declarations=[ + genai_types.FunctionDeclaration( + name="test_func", description="A test function." + ) + ] + ) + agent_details = { + "agent1": AgentDetails(name="agent1", tool_declarations=[tool1]) + } + app_details = AppDetails(agent_details=agent_details) + expected_json = { + "tool_declarations": { + "agent1": [{ + "function_declarations": [{ + "name": "test_func", + "description": "A test function.", + }] + }] + } + } + actual_json_str = get_tool_declarations_as_json_str(app_details) + assert json.loads(actual_json_str) == expected_json + + +def test_get_tool_declarations_as_json_str_with_multiple_agents(): + """Tests get_tool_declarations_as_json_str with multiple agents.""" + tool1 = genai_types.Tool( + function_declarations=[ + genai_types.FunctionDeclaration( + name="test_func1", description="A test function 1." + ) + ] + ) + agent_details = { + "agent1": AgentDetails(name="agent1", tool_declarations=[tool1]), + "agent2": AgentDetails(name="agent2", tool_declarations=[]), + } + app_details = AppDetails(agent_details=agent_details) + expected_json = { + "tool_declarations": { + "agent1": [{ + "function_declarations": [{ + "name": "test_func1", + "description": "A test function 1.", + }] + }], + "agent2": [], + } + } + actual_json_str = get_tool_declarations_as_json_str(app_details) + assert json.loads(actual_json_str) == expected_json + + +def test_get_tool_calls_and_responses_as_json_str_with_none(): + """Tests get_tool_calls_and_responses_as_json_str with None.""" + assert ( + get_tool_calls_and_responses_as_json_str(None) + == "No intermediate steps were taken." + ) + + +def test_get_tool_calls_and_responses_as_json_str_with_intermediate_data_no_tools(): + """Tests get_tool_calls_and_responses_as_json_str with IntermediateData and no tools.""" + intermediate_data = IntermediateData(tool_uses=[], tool_responses=[]) + assert ( + get_tool_calls_and_responses_as_json_str(intermediate_data) + == "No intermediate steps were taken." + ) + + intermediate_data = InvocationEvents(invocation_events=[]) + assert ( + get_tool_calls_and_responses_as_json_str(intermediate_data) + == "No intermediate steps were taken." + ) + + +def test_get_tool_calls_and_responses_as_json_str_with_invocation_events_multiple_calls(): + """Tests get_tool_calls_and_responses_as_json_str with multiple calls in InvocationEvents.""" + tool_call1 = genai_types.FunctionCall(name="func1", args={}, id="call1") + tool_call2 = genai_types.FunctionCall(name="func2", args={}, id="call2") + tool_response1 = genai_types.FunctionResponse( + name="func1", response={"status": "ok"}, id="call1" + ) + invocation_event1 = InvocationEvent( + author="agent", + content=genai_types.Content( + parts=[ + genai_types.Part(function_call=tool_call1), + genai_types.Part(function_call=tool_call2), + ] + ), + ) + invocation_event2 = InvocationEvent( + author="tool", + content=genai_types.Content( + parts=[genai_types.Part(function_response=tool_response1)] + ), + ) + intermediate_data = InvocationEvents( + invocation_events=[invocation_event1, invocation_event2] + ) + json_str = get_tool_calls_and_responses_as_json_str(intermediate_data) + expected_json = { + "tool_calls_and_response": [ + { + "step": 0, + "tool_call": {"name": "func1", "args": {}, "id": "call1"}, + "tool_response": { + "name": "func1", + "response": {"status": "ok"}, + "id": "call1", + }, + }, + { + "step": 1, + "tool_call": {"name": "func2", "args": {}, "id": "call2"}, + "tool_response": "None", + }, + ] + } + assert json.loads(json_str) == expected_json diff --git a/tests/unittests/evaluation/test_llm_backed_user_simulator.py b/tests/unittests/evaluation/test_llm_backed_user_simulator.py new file mode 100644 index 0000000000..6ef3969e70 --- /dev/null +++ b/tests/unittests/evaluation/test_llm_backed_user_simulator.py @@ -0,0 +1,249 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.evaluation import conversation_scenarios +from google.adk.evaluation.llm_backed_user_simulator import LlmBackedUserSimulator +from google.adk.evaluation.llm_backed_user_simulator import LlmBackedUserSimulatorConfig +from google.adk.evaluation.user_simulator import Status +from google.adk.events.event import Event +from google.genai import types +import pytest + +_INPUT_EVENTS = [ + Event( + author="user", + content=types.Content( + parts=[types.Part(text="Can you help me?")], role="user" + ), + invocation_id="inv1", + ), + Event( + author="helpful_assistant", + content=types.Content( + parts=[ + types.Part( + text="I'll get the user's name and greet them first.", + thought=True, + ), + types.Part( + function_call=types.FunctionCall(name="get_user_name") + ), + types.Part( + function_response=types.FunctionResponse( + name="get_user_name", + response={"name": "John Doe"}, + ) + ), + types.Part(text="Hi John, what can I do for you?"), + ], + role="model", + ), + invocation_id="inv1", + ), +] + +_INPUT_EVENTS_LONG = _INPUT_EVENTS + [ + Event( + author="user", + content=types.Content( + parts=[types.Part(text="I need to book a flight.")], role="user" + ), + invocation_id="inv2", + ), + Event( + author="helpful_assistant", + content=types.Content( + parts=[ + types.Part( + text="Sure, what is your departure date and destination?", + ), + ], + role="model", + ), + invocation_id="inv2", + ), +] + +_EXPECTED_REWRITTEN_DIALOGUE = """user: Can you help me? + +helpful_assistant: Hi John, what can I do for you?""" + +_EXPECTED_REWRITTEN_DIALOGUE_LONG = _EXPECTED_REWRITTEN_DIALOGUE + """ + +user: I need to book a flight. + +helpful_assistant: Sure, what is your departure date and destination?""" + + +class TestHelperMethods: + """Test cases for LlmBackedUserSimulator helper methods.""" + + def test_convert_conversation_to_user_sim_pov(self): + """Tests _convert_conversation_to_user_sim_pov method.""" + rewritten_dialogue = LlmBackedUserSimulator._summarize_conversation( + _INPUT_EVENTS + ) + assert rewritten_dialogue == _EXPECTED_REWRITTEN_DIALOGUE + rewritten_dialogue = LlmBackedUserSimulator._summarize_conversation( + _INPUT_EVENTS_LONG + ) + assert rewritten_dialogue == _EXPECTED_REWRITTEN_DIALOGUE_LONG + + +async def to_async_iter(items): + for item in items: + yield item + + +@pytest.fixture +def mock_llm_agent(mocker): + """Provides a mock LLM agent.""" + mock_llm_registry_cls = mocker.patch( + "google.adk.evaluation.llm_backed_user_simulator.LLMRegistry" + ) + mock_llm_registry = mocker.MagicMock() + mock_llm_registry_cls.return_value = mock_llm_registry + mock_agent = mocker.MagicMock() + mock_llm_registry.resolve.return_value.return_value = mock_agent + return mock_agent + + +@pytest.fixture +def conversation_scenario(): + """Provides a test conversation scenario.""" + return conversation_scenarios.ConversationScenario( + starting_prompt="Hello", conversation_plan="test plan" + ) + + +@pytest.fixture +def simulator(mock_llm_agent, conversation_scenario): + """Provides an LlmBackedUserSimulator instance for testing.""" + config = LlmBackedUserSimulatorConfig( + model="test-model", + model_configuration=types.GenerateContentConfig(), + ) + sim = LlmBackedUserSimulator( + config=config, conversation_scenario=conversation_scenario + ) + sim._invocation_count = 1 # Bypass starting prompt by default for tests + return sim + + +class TestLlmBackedUserSimulator: + """Test cases for LlmBackedUserSimulator main methods.""" + + @pytest.mark.asyncio + async def test_get_llm_response_return_value( + self, simulator, mock_llm_agent, mocker + ): + """Tests that _get_llm_response returns the full response correctly.""" + mock_llm_response = mocker.MagicMock() + mock_llm_response.content = types.Content( + parts=[ + types.Part(text="some thought", thought=True), + types.Part(text="Hello world!"), + ] + ) + mock_llm_agent.generate_content_async.return_value = to_async_iter( + [mock_llm_response] + ) + response = await simulator._get_llm_response(rewritten_dialogue="") + assert response == "Hello world!" + + @pytest.mark.asyncio + async def test_get_next_user_message_first_invocation( + self, simulator, mock_llm_agent, conversation_scenario + ): + """Tests that the first invocation returns the starting prompt.""" + simulator._invocation_count = 0 # override testing default + next_user_message = await simulator.get_next_user_message(events=[]) + + expected_user_message = types.Content( + parts=[types.Part(text=conversation_scenario.starting_prompt)], + role="user", + ) + assert next_user_message.status == Status.SUCCESS + assert next_user_message.user_message == expected_user_message + mock_llm_agent.generate_content_async.assert_not_called() + + @pytest.mark.asyncio + async def test_turn_limit_reached(self, conversation_scenario): + """Tests get_next_user_message when the turn limit is reached.""" + config = LlmBackedUserSimulatorConfig( + max_allowed_invocations=1, + ) + simulator = LlmBackedUserSimulator( + config=config, conversation_scenario=conversation_scenario + ) + simulator._invocation_count = 1 + + next_user_message = await simulator.get_next_user_message( + events=_INPUT_EVENTS + ) + + assert next_user_message.status == Status.TURN_LIMIT_REACHED + assert next_user_message.user_message is None + + @pytest.mark.asyncio + async def test_stop_signal_detected(self, simulator, mock_llm_agent, mocker): + """Tests get_next_user_message when the stop signal is detected.""" + mock_llm_response = mocker.MagicMock() + mock_llm_response.content = types.Content( + parts=[types.Part(text="Thanks! Bye!")] + ) + mock_llm_agent.generate_content_async.return_value = to_async_iter( + [mock_llm_response] + ) + + next_user_message = await simulator.get_next_user_message( + events=_INPUT_EVENTS + ) + + assert next_user_message.status == Status.STOP_SIGNAL_DETECTED + assert next_user_message.user_message is None + + @pytest.mark.asyncio + async def test_no_message_generated(self, simulator, mock_llm_agent): + """Tests get_next_user_message when no message is generated.""" + mock_llm_agent.generate_content_async.return_value = to_async_iter([]) + + with pytest.raises(RuntimeError, match="Failed to generate a user message"): + await simulator.get_next_user_message(events=_INPUT_EVENTS) + + @pytest.mark.asyncio + async def test_get_next_user_message_success( + self, simulator, mock_llm_agent, mocker + ): + """Tests get_next_user_message when the user message is generated successfully.""" + mock_llm_response = mocker.MagicMock() + mock_llm_response.content = types.Content( + parts=[types.Part(text="I need to book a flight.")] + ) + mock_llm_agent.generate_content_async.return_value = to_async_iter( + [mock_llm_response] + ) + + next_user_message = await simulator.get_next_user_message( + events=_INPUT_EVENTS + ) + + expected_user_message = types.Content( + parts=[types.Part(text="I need to book a flight.")], role="user" + ) + + assert next_user_message.status == Status.SUCCESS + assert next_user_message.user_message == expected_user_message diff --git a/tests/unittests/evaluation/test_local_eval_service.py b/tests/unittests/evaluation/test_local_eval_service.py index 49ebead2e7..cf2ca342f3 100644 --- a/tests/unittests/evaluation/test_local_eval_service.py +++ b/tests/unittests/evaluation/test_local_eval_service.py @@ -12,7 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -from unittest import mock +from __future__ import annotations + +import asyncio +import sys +from typing import Optional from google.adk.agents.llm_agent import LlmAgent from google.adk.errors.not_found_error import NotFoundError @@ -21,6 +25,7 @@ from google.adk.evaluation.base_eval_service import InferenceConfig from google.adk.evaluation.base_eval_service import InferenceRequest from google.adk.evaluation.base_eval_service import InferenceResult +from google.adk.evaluation.base_eval_service import InferenceStatus from google.adk.evaluation.eval_case import Invocation from google.adk.evaluation.eval_metrics import EvalMetric from google.adk.evaluation.eval_metrics import EvalMetricResult @@ -44,8 +49,8 @@ @pytest.fixture -def mock_eval_sets_manager(): - return mock.create_autospec(EvalSetsManager) +def mock_eval_sets_manager(mocker): + return mocker.create_autospec(EvalSetsManager) @pytest.fixture @@ -55,8 +60,8 @@ def dummy_agent(): @pytest.fixture -def mock_eval_set_results_manager(): - return mock.create_autospec(EvalSetResultsManager) +def mock_eval_set_results_manager(mocker): + return mocker.create_autospec(EvalSetResultsManager) @pytest.fixture @@ -66,6 +71,10 @@ def eval_service( DEFAULT_METRIC_EVALUATOR_REGISTRY.register_evaluator( metric_info=FakeEvaluator.get_metric_info(), evaluator=FakeEvaluator ) + DEFAULT_METRIC_EVALUATOR_REGISTRY.register_evaluator( + metric_info=FakeSingleSidedEvaluator.get_metric_info(), + evaluator=FakeSingleSidedEvaluator, + ) return LocalEvalService( root_agent=dummy_agent, eval_sets_manager=mock_eval_sets_manager, @@ -91,8 +100,10 @@ def get_metric_info() -> MetricInfo: def evaluate_invocations( self, actual_invocations: list[Invocation], - expected_invocations: list[Invocation], + expected_invocations: Optional[list[Invocation]], ): + if expected_invocations is None: + raise ValueError("expected_invocations is required for this metric.") per_invocation_results = [] for actual, expected in zip(actual_invocations, expected_invocations): per_invocation_results.append( @@ -110,11 +121,48 @@ def evaluate_invocations( ) +class FakeSingleSidedEvaluator(Evaluator): + + def __init__(self, eval_metric: EvalMetric): + self._eval_metric = eval_metric + + @staticmethod + def get_metric_info() -> MetricInfo: + return MetricInfo( + metric_name="fake_single_sided_metric", + description="Fake single sided metric description", + metric_value_info=MetricValueInfo( + interval=Interval(min_value=0.0, max_value=1.0) + ), + ) + + def evaluate_invocations( + self, + actual_invocations: list[Invocation], + expected_invocations: Optional[list[Invocation]], + ): + per_invocation_results = [] + for actual in actual_invocations: + per_invocation_results.append( + PerInvocationResult( + actual_invocation=actual, + score=0.995, + eval_status=EvalStatus.PASSED, + ) + ) + return EvaluationResult( + overall_score=0.95, + overall_eval_status=EvalStatus.PASSED, + per_invocation_results=per_invocation_results, + ) + + @pytest.mark.asyncio async def test_perform_inference_success( eval_service, dummy_agent, mock_eval_sets_manager, + mocker, ): eval_set = EvalSet( eval_set_id="test_eval_set", @@ -125,8 +173,8 @@ async def test_perform_inference_success( ) mock_eval_sets_manager.get_eval_set.return_value = eval_set - mock_inference_result = mock.MagicMock() - eval_service._perform_inference_sigle_eval_item = mock.AsyncMock( + mock_inference_result = mocker.MagicMock() + eval_service._perform_inference_single_eval_item = mocker.AsyncMock( return_value=mock_inference_result ) @@ -146,7 +194,7 @@ async def test_perform_inference_success( mock_eval_sets_manager.get_eval_set.assert_called_once_with( app_name="test_app", eval_set_id="test_eval_set" ) - assert eval_service._perform_inference_sigle_eval_item.call_count == 2 + assert eval_service._perform_inference_single_eval_item.call_count == 2 @pytest.mark.asyncio @@ -154,6 +202,7 @@ async def test_perform_inference_with_case_ids( eval_service, dummy_agent, mock_eval_sets_manager, + mocker, ): eval_set = EvalSet( eval_set_id="test_eval_set", @@ -165,8 +214,8 @@ async def test_perform_inference_with_case_ids( ) mock_eval_sets_manager.get_eval_set.return_value = eval_set - mock_inference_result = mock.MagicMock() - eval_service._perform_inference_sigle_eval_item = mock.AsyncMock( + mock_inference_result = mocker.MagicMock() + eval_service._perform_inference_single_eval_item = mocker.AsyncMock( return_value=mock_inference_result ) @@ -182,13 +231,13 @@ async def test_perform_inference_with_case_ids( results.append(result) assert len(results) == 2 - eval_service._perform_inference_sigle_eval_item.assert_any_call( + eval_service._perform_inference_single_eval_item.assert_any_call( app_name="test_app", eval_set_id="test_eval_set", eval_case=eval_set.eval_cases[0], root_agent=dummy_agent, ) - eval_service._perform_inference_sigle_eval_item.assert_any_call( + eval_service._perform_inference_single_eval_item.assert_any_call( app_name="test_app", eval_set_id="test_eval_set", eval_case=eval_set.eval_cases[2], @@ -216,21 +265,29 @@ async def test_perform_inference_eval_set_not_found( @pytest.mark.asyncio async def test_evaluate_success( - eval_service, mock_eval_sets_manager, mock_eval_set_results_manager + eval_service, mock_eval_sets_manager, mock_eval_set_results_manager, mocker ): + invocation = Invocation( + user_content=genai_types.Content( + parts=[genai_types.Part(text="test user content.")] + ), + final_response=genai_types.Content( + parts=[genai_types.Part(text="test final response.")] + ), + ) inference_results = [ InferenceResult( app_name="test_app", eval_set_id="test_eval_set", eval_case_id="case1", - inferences=[], + inferences=[invocation.model_copy(deep=True)], session_id="session1", ), InferenceResult( app_name="test_app", eval_set_id="test_eval_set", eval_case_id="case2", - inferences=[], + inferences=[invocation.model_copy(deep=True)], session_id="session2", ), ] @@ -240,8 +297,9 @@ async def test_evaluate_success( evaluate_config=EvaluateConfig(eval_metrics=[eval_metric], parallelism=2), ) - mock_eval_case = mock.MagicMock(spec=EvalCase) - mock_eval_case.conversation = [] + mock_eval_case = mocker.MagicMock(spec=EvalCase) + mock_eval_case.conversation = [invocation.model_copy(deep=True)] + mock_eval_case.conversation_scenario = None mock_eval_case.session_input = None mock_eval_sets_manager.get_eval_case.return_value = mock_eval_case @@ -287,7 +345,7 @@ async def test_evaluate_eval_case_not_found( @pytest.mark.asyncio async def test_evaluate_single_inference_result( - eval_service, mock_eval_sets_manager, mock_eval_set_results_manager + eval_service, mock_eval_sets_manager, mock_eval_set_results_manager, mocker ): invocation = Invocation( user_content=genai_types.Content( @@ -311,12 +369,13 @@ async def test_evaluate_single_inference_result( eval_metric = EvalMetric(metric_name="fake_metric", threshold=0.5) evaluate_config = EvaluateConfig(eval_metrics=[eval_metric], parallelism=1) - mock_eval_case = mock.MagicMock(spec=EvalCase) + mock_eval_case = mocker.MagicMock(spec=EvalCase) mock_eval_case.conversation = [ invocation.model_copy(deep=True), invocation.model_copy(deep=True), invocation.model_copy(deep=True), ] + mock_eval_case.conversation_scenario = None mock_eval_case.session_input = None mock_eval_sets_manager.get_eval_case.return_value = mock_eval_case @@ -348,6 +407,119 @@ async def test_evaluate_single_inference_result( assert metric_result.eval_status == EvalStatus.PASSED +@pytest.mark.asyncio +async def test_evaluate_single_inference_result_for_conversation_scenario( + eval_service, mock_eval_sets_manager, mocker +): + """To be removed once evaluation is implemented for conversation scenarios.""" + invocation = Invocation( + user_content=genai_types.Content( + parts=[genai_types.Part(text="test user content.")] + ), + final_response=genai_types.Content( + parts=[genai_types.Part(text="test final response.")] + ), + ) + inference_result = InferenceResult( + app_name="test_app", + eval_set_id="test_eval_set", + eval_case_id="case1", + inferences=[ + invocation.model_copy(deep=True), + invocation.model_copy(deep=True), + invocation.model_copy(deep=True), + ], + session_id="session1", + ) + eval_metric = EvalMetric( + metric_name="fake_single_sided_metric", threshold=0.5 + ) + evaluate_config = EvaluateConfig(eval_metrics=[eval_metric], parallelism=1) + + mock_eval_case = mocker.MagicMock(spec=EvalCase) + mock_eval_case.conversation = None + mock_eval_case.conversation_scenario = mocker.MagicMock() + mock_eval_case.session_input = None + mock_eval_sets_manager.get_eval_case.return_value = mock_eval_case + + _, result = await eval_service._evaluate_single_inference_result( + inference_result=inference_result, evaluate_config=evaluate_config + ) + assert isinstance(result, EvalCaseResult) + assert result.eval_id == "case1" + assert result.final_eval_status == EvalStatus.PASSED + assert len(result.overall_eval_metric_results) == 1 + assert ( + result.overall_eval_metric_results[0].metric_name + == "fake_single_sided_metric" + ) + assert result.overall_eval_metric_results[0].score == 0.95 + mock_eval_sets_manager.get_eval_case.assert_called_once_with( + app_name="test_app", eval_set_id="test_eval_set", eval_case_id="case1" + ) + + assert len(result.eval_metric_result_per_invocation) == 3 + for i in range(3): + invocation_result = result.eval_metric_result_per_invocation[i] + assert invocation_result.actual_invocation == inference_result.inferences[i] + assert invocation_result.expected_invocation == None + assert len(invocation_result.eval_metric_results) == 1 + metric_result = invocation_result.eval_metric_results[0] + assert metric_result.metric_name == "fake_single_sided_metric" + assert metric_result.score == 0.995 + assert metric_result.eval_status == EvalStatus.PASSED + + +@pytest.mark.asyncio +async def test_evaluate_single_inference_result_for_conversation_scenario_with_unsupported_metric( + eval_service, mock_eval_sets_manager, mocker +): + """To be removed once evaluation is implemented for conversation scenarios.""" + invocation = Invocation( + user_content=genai_types.Content( + parts=[genai_types.Part(text="test user content.")] + ), + final_response=genai_types.Content( + parts=[genai_types.Part(text="test final response.")] + ), + ) + inference_result = InferenceResult( + app_name="test_app", + eval_set_id="test_eval_set", + eval_case_id="case1", + inferences=[ + invocation.model_copy(deep=True), + invocation.model_copy(deep=True), + invocation.model_copy(deep=True), + ], + session_id="session1", + ) + eval_metric = EvalMetric(metric_name="fake_metric", threshold=0.5) + evaluate_config = EvaluateConfig(eval_metrics=[eval_metric], parallelism=1) + + mock_eval_case = mocker.MagicMock(spec=EvalCase) + mock_eval_case.eval_id = "case1" + mock_eval_case.conversation = None + mock_eval_case.conversation_scenario = mocker.MagicMock() + mock_eval_case.session_input = None + mock_eval_sets_manager.get_eval_case.return_value = mock_eval_case + + _, result = await eval_service._evaluate_single_inference_result( + inference_result=inference_result, evaluate_config=evaluate_config + ) + assert isinstance(result, EvalCaseResult) + assert result.eval_id == "case1" + assert result.final_eval_status == EvalStatus.NOT_EVALUATED + assert len(result.overall_eval_metric_results) == 1 + assert result.overall_eval_metric_results[0].metric_name == "fake_metric" + assert result.overall_eval_metric_results[0].score is None + mock_eval_sets_manager.get_eval_case.assert_called_once_with( + app_name="test_app", eval_set_id="test_eval_set", eval_case_id="case1" + ) + + assert len(result.eval_metric_result_per_invocation) == 3 + + def test_generate_final_eval_status_doesn_t_throw_on(eval_service): # How to fix if this test case fails? # This test case has failed mainly because a new EvalStatus got added. You @@ -355,9 +527,151 @@ def test_generate_final_eval_status_doesn_t_throw_on(eval_service): # eval case. # We go over all the possible values of EvalStatus one by one and expect - # the _generate_final_eval_status to handle it without throwing an exeception. + # the _generate_final_eval_status to handle it without throwing an exception. for status in EvalStatus: eval_metric_result = EvalMetricResult( metric_name="metric1", threshold=0.5, eval_status=status ) eval_service._generate_final_eval_status([eval_metric_result]) + + +@pytest.mark.asyncio +@pytest.mark.skipif( + sys.version_info < (3, 10), reason="MCP tool requires Python 3.10+" +) +async def test_mcp_stdio_agent_no_runtime_error(mocker): + """Test that LocalEvalService can handle MCP stdio agents without RuntimeError. + + This is a regression test for GitHub issue #2196: + "RuntimeError: Attempted to exit cancel scope in a different task than it was + entered in" + + The fix ensures that Runner.close() is called to properly cleanup MCP + connections. + """ + import tempfile + + from google.adk.evaluation.local_eval_service import LocalEvalService + from google.adk.tools.mcp_tool.mcp_session_manager import StdioConnectionParams + from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset + from mcp import StdioServerParameters + + # Mock LLM responses to avoid real API calls + from tests.unittests.testing_utils import MockModel + + mock_responses = [ + genai_types.Content( + parts=[genai_types.Part(text="Mocked response from test agent")] + ) + ] + mock_model = MockModel.create(responses=mock_responses) + + # Create a test agent with MCP stdio toolset and mocked model + test_dir = tempfile.mkdtemp() + try: + agent = LlmAgent( + model=mock_model, + name="test_mcp_agent", + instruction="Test agent for MCP stdio regression test.", + tools=[ + MCPToolset( + connection_params=StdioConnectionParams( + server_params=StdioServerParameters( + command="npx", + args=[ + "-y", + "@modelcontextprotocol/server-filesystem", + test_dir, + ], + ), + timeout=5, + ), + tool_filter=["read_file", "list_directory"], + ) + ], + ) + + # Create a mock eval sets manager that returns an eval case + mock_eval_sets_manager = mocker.create_autospec(EvalSetsManager) + test_eval_case = EvalCase( + eval_id="test_mcp_case", + conversation=[ + Invocation( + user_content=genai_types.Content( + parts=[genai_types.Part(text="List directory contents")] + ), + ) + ], + ) + mock_eval_sets_manager.get_eval_case.return_value = test_eval_case + eval_set = EvalSet( + eval_set_id="test_set", + eval_cases=[test_eval_case], + ) + mock_eval_sets_manager.get_eval_set.return_value = eval_set + + # Create LocalEvalService with MCP agent + eval_service = LocalEvalService( + root_agent=agent, + eval_sets_manager=mock_eval_sets_manager, + ) + + # Create inference request to actually trigger the code path with the fix + inference_request = InferenceRequest( + app_name="test_app", + eval_set_id="test_set", + inference_config=InferenceConfig(parallelism=1), + ) + + # The main test: actually call perform_inference which will trigger + # _generate_inferences_from_root_agent where the fix is located + + # Note: In Python 3.10 and 3.11, there may be asyncio.CancelledError during cleanup + # due to anyio cancel scope context violations when MCP toolsets are cleaned up + # via asyncio.wait_for() in different task contexts. Python 3.12+ enhanced task + # context management (Task.get_context(), improved context propagation) resolves this. + + try: + results = [] + async for result in eval_service.perform_inference(inference_request): + results.append(result) + # We should get at least one result since we mocked the LLM + break + + # Test passes if we get here without the cancel scope RuntimeError + # With mocked model, we should get successful inference results + assert len(results) >= 1 + + except RuntimeError as e: + # If we get a RuntimeError about cancel scope, the fix isn't working + if "cancel scope" in str(e) and "different task" in str(e): + pytest.fail(f"MCP stdio RuntimeError regression detected: {e}") + else: + # Other RuntimeErrors might be acceptable + pass + except asyncio.CancelledError as e: + # In Python 3.10 and 3.11, anyio cancel scope context violations may manifest as CancelledError + # when MCP RequestResponder.__exit__() is called in a different task than __enter__() + if ( + hasattr(e, "args") + and len(e.args) > 0 + and "cancel scope" in str(e.args[0]) + ): + pytest.fail(f"MCP stdio cancel scope error regression detected: {e}") + else: + # Re-raise other CancelledErrors + raise + except Exception as e: + # Check if this is the specific cancel scope error we're testing for + if "cancel scope" in str(e) and "different task" in str(e): + pytest.fail(f"MCP stdio RuntimeError regression detected: {e}") + # Other exceptions are acceptable for this test + + # The main goal is to ensure the test completes without the specific + # RuntimeError about cancel scopes. If we reach here, the fix is working. + + finally: + # Cleanup + import shutil + + shutil.rmtree(test_dir, ignore_errors=True) diff --git a/tests/unittests/evaluation/test_local_eval_set_results_manager.py b/tests/unittests/evaluation/test_local_eval_set_results_manager.py index 3411d9b7a8..45500d71c5 100644 --- a/tests/unittests/evaluation/test_local_eval_set_results_manager.py +++ b/tests/unittests/evaluation/test_local_eval_set_results_manager.py @@ -19,7 +19,6 @@ import shutil import tempfile import time -from unittest.mock import patch from google.adk.errors.not_found_error import NotFoundError from google.adk.evaluation._eval_set_results_manager_utils import _sanitize_eval_set_result_name @@ -68,12 +67,11 @@ def setup(self): eval_case_results=self.eval_case_results, creation_timestamp=self.timestamp, ) - - def teardown(self): + yield shutil.rmtree(self.temp_dir) - @patch("time.time") - def test_save_eval_set_result(self, mock_time): + def test_save_eval_set_result(self, mocker): + mock_time = mocker.patch("time.time") mock_time.return_value = self.timestamp self.manager.save_eval_set_result( self.app_name, self.eval_set_id, self.eval_case_results @@ -93,8 +91,8 @@ def test_save_eval_set_result(self, mock_time): expected_eval_set_result_json = self.eval_set_result.model_dump_json() assert expected_eval_set_result_json == actual_eval_set_result_json - @patch("time.time") - def test_get_eval_set_result(self, mock_time): + def test_get_eval_set_result(self, mocker): + mock_time = mocker.patch("time.time") mock_time.return_value = self.timestamp self.manager.save_eval_set_result( self.app_name, self.eval_set_id, self.eval_case_results @@ -104,15 +102,15 @@ def test_get_eval_set_result(self, mock_time): ) assert retrieved_result == self.eval_set_result - @patch("time.time") - def test_get_eval_set_result_not_found(self, mock_time): + def test_get_eval_set_result_not_found(self, mocker): + mock_time = mocker.patch("time.time") mock_time.return_value = self.timestamp with pytest.raises(NotFoundError) as e: self.manager.get_eval_set_result(self.app_name, "non_existent_id") - @patch("time.time") - def test_list_eval_set_results(self, mock_time): + def test_list_eval_set_results(self, mocker): + mock_time = mocker.patch("time.time") mock_time.return_value = self.timestamp # Save two eval set results for the same app self.manager.save_eval_set_result( diff --git a/tests/unittests/evaluation/test_local_eval_sets_manager.py b/tests/unittests/evaluation/test_local_eval_sets_manager.py index 08a5ee9d3f..fd31a9e5fd 100644 --- a/tests/unittests/evaluation/test_local_eval_sets_manager.py +++ b/tests/unittests/evaluation/test_local_eval_sets_manager.py @@ -24,7 +24,7 @@ from google.adk.evaluation.eval_case import Invocation from google.adk.evaluation.eval_set import EvalSet from google.adk.evaluation.local_eval_sets_manager import _EVAL_SET_FILE_EXTENSION -from google.adk.evaluation.local_eval_sets_manager import convert_eval_set_to_pydanctic_schema +from google.adk.evaluation.local_eval_sets_manager import convert_eval_set_to_pydantic_schema from google.adk.evaluation.local_eval_sets_manager import load_eval_set_from_file from google.adk.evaluation.local_eval_sets_manager import LocalEvalSetsManager from google.genai import types as genai_types @@ -32,10 +32,10 @@ import pytest -class TestConvertEvalSetToPydancticSchema: - """Tests convert_eval_set_to_pydanctic_schema method.""" +class TestConvertEvalSetToPydanticSchema: + """Tests convert_eval_set_to_pydantic_schema method.""" - def test_convert_eval_set_to_pydanctic_schema_complete(self): + def test_convert_eval_set_to_pydantic_schema_complete(self): eval_set_id = "test_eval_set" eval_set_in_json_format = [{ "name": "roll_17_sided_dice_twice", @@ -71,7 +71,7 @@ def test_convert_eval_set_to_pydanctic_schema_complete(self): }, }] - eval_set = convert_eval_set_to_pydanctic_schema( + eval_set = convert_eval_set_to_pydantic_schema( eval_set_id, eval_set_in_json_format ) @@ -93,14 +93,14 @@ def test_convert_eval_set_to_pydanctic_schema_complete(self): == 1 ) - def test_convert_eval_set_to_pydanctic_schema_minimal(self): + def test_convert_eval_set_to_pydantic_schema_minimal(self): eval_set_id = "test_eval_set" eval_set_in_json_format = [{ "name": "minimal_case", "data": [{"query": "Hello", "reference": "World"}], }] - eval_set = convert_eval_set_to_pydanctic_schema( + eval_set = convert_eval_set_to_pydantic_schema( eval_set_id, eval_set_in_json_format ) @@ -117,7 +117,7 @@ def test_convert_eval_set_to_pydanctic_schema_minimal(self): == "World" ) - def test_convert_eval_set_to_pydanctic_schema_empty_tool_use_and_intermediate_responses( + def test_convert_eval_set_to_pydantic_schema_empty_tool_use_and_intermediate_responses( self, ): eval_set_id = "test_eval_set" @@ -131,7 +131,7 @@ def test_convert_eval_set_to_pydanctic_schema_empty_tool_use_and_intermediate_re }], }] - eval_set = convert_eval_set_to_pydanctic_schema( + eval_set = convert_eval_set_to_pydantic_schema( eval_set_id, eval_set_in_json_format ) @@ -150,7 +150,7 @@ def test_convert_eval_set_to_pydanctic_schema_empty_tool_use_and_intermediate_re == 0 ) - def test_convert_eval_set_to_pydanctic_schema_empty_initial_session(self): + def test_convert_eval_set_to_pydantic_schema_empty_initial_session(self): eval_set_id = "test_eval_set" eval_set_in_json_format = [{ "name": "empty_session", @@ -158,14 +158,14 @@ def test_convert_eval_set_to_pydanctic_schema_empty_initial_session(self): "initial_session": {}, }] - eval_set = convert_eval_set_to_pydanctic_schema( + eval_set = convert_eval_set_to_pydantic_schema( eval_set_id, eval_set_in_json_format ) assert eval_set.eval_set_id == eval_set_id assert eval_set.eval_cases[0].session_input is None - def test_convert_eval_set_to_pydanctic_schema_invalid_data(self): + def test_convert_eval_set_to_pydantic_schema_invalid_data(self): # This test implicitly checks for potential validation errors during Pydantic # object creation eval_set_id = "test_eval_set" @@ -190,7 +190,7 @@ def test_convert_eval_set_to_pydanctic_schema_invalid_data(self): }] with pytest.raises(ValidationError): - convert_eval_set_to_pydanctic_schema(eval_set_id, eval_set_in_json_format) + convert_eval_set_to_pydantic_schema(eval_set_id, eval_set_in_json_format) class TestLoadEvalSetFromFile: @@ -300,14 +300,14 @@ def test_load_eval_set_from_file_invalid_json(self, tmp_path): def test_load_eval_set_from_file_invalid_data(self, tmp_path, mocker): # Create a dummy file with invalid data that fails both Pydantic validation # and the old format conversion. We mock the - # convert_eval_set_to_pydanctic_schema function to raise a ValueError + # convert_eval_set_to_pydantic_schema function to raise a ValueError # so that we can assert that the exception is raised. file_path = tmp_path / "invalid_data.json" with open(file_path, "w", encoding="utf-8") as f: f.write('{"invalid": "data"}') mocker.patch( - "google.adk.evaluation.local_eval_sets_manager.convert_eval_set_to_pydanctic_schema", + "google.adk.evaluation.local_eval_sets_manager.convert_eval_set_to_pydantic_schema", side_effect=ValueError(), ) @@ -392,7 +392,7 @@ def test_local_eval_sets_manager_create_eval_set_invalid_id( app_name = "test_app" eval_set_id = "invalid-id" - with pytest.raises(ValueError, match="Invalid Eval Set Id"): + with pytest.raises(ValueError, match="Invalid Eval Set ID"): local_eval_sets_manager.create_eval_set(app_name, eval_set_id) def test_local_eval_sets_manager_create_eval_set_already_exists( diff --git a/tests/unittests/evaluation/test_request_intercepter_plugin.py b/tests/unittests/evaluation/test_request_intercepter_plugin.py new file mode 100644 index 0000000000..3fa0aa50c6 --- /dev/null +++ b/tests/unittests/evaluation/test_request_intercepter_plugin.py @@ -0,0 +1,71 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.agents.callback_context import CallbackContext +from google.adk.evaluation.request_intercepter_plugin import _LLM_REQUEST_ID_KEY +from google.adk.evaluation.request_intercepter_plugin import _RequestIntercepterPlugin +from google.adk.models.llm_request import LlmRequest +from google.adk.models.llm_response import LlmResponse +from google.genai import types + + +class TestRequestIntercepterPlugin: + + async def test_intercept_request_and_response(self, mocker): + plugin = _RequestIntercepterPlugin(name="test_plugin") + llm_request = LlmRequest( + model="test_model", + contents=[ + types.Content( + role="user", + parts=[types.Part(text="hello")], + ) + ], + ) + mock_invocation_context = mocker.MagicMock() + mock_invocation_context.session.state = {} + callback_context = CallbackContext(mock_invocation_context) + llm_response = LlmResponse() + + # Test before_model_callback + await plugin.before_model_callback( + callback_context=callback_context, llm_request=llm_request + ) + assert _LLM_REQUEST_ID_KEY in callback_context.state + request_id = callback_context.state[_LLM_REQUEST_ID_KEY] + assert isinstance(request_id, str) + + # Test after_model_callback + await plugin.after_model_callback( + callback_context=callback_context, llm_response=llm_response + ) + assert llm_response.custom_metadata is not None + assert _LLM_REQUEST_ID_KEY in llm_response.custom_metadata + assert llm_response.custom_metadata[_LLM_REQUEST_ID_KEY] == request_id + + # Test get_model_request + retrieved_request = plugin.get_model_request(llm_response) + assert retrieved_request == llm_request + + def test_get_model_request_not_found(self): + plugin = _RequestIntercepterPlugin(name="test_plugin") + llm_response = LlmResponse() + assert plugin.get_model_request(llm_response) is None + + llm_response_with_metadata = LlmResponse( + custom_metadata={_LLM_REQUEST_ID_KEY: "non_existent_id"} + ) + assert plugin.get_model_request(llm_response_with_metadata) is None diff --git a/tests/unittests/evaluation/test_response_evaluator.py b/tests/unittests/evaluation/test_response_evaluator.py index bace9c6a44..548ae2209a 100644 --- a/tests/unittests/evaluation/test_response_evaluator.py +++ b/tests/unittests/evaluation/test_response_evaluator.py @@ -12,26 +12,29 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import annotations + """Tests for the Response Evaluator.""" -from unittest.mock import patch +from google.adk.dependencies.vertexai import vertexai from google.adk.evaluation.eval_case import Invocation from google.adk.evaluation.eval_metrics import PrebuiltMetrics from google.adk.evaluation.evaluator import EvalStatus from google.adk.evaluation.response_evaluator import ResponseEvaluator from google.genai import types as genai_types import pytest -from vertexai import types as vertexai_types + +vertexai_types = vertexai.types -@patch( - "google.adk.evaluation.vertex_ai_eval_facade._VertexAiEvalFacade._perform_eval" -) class TestResponseEvaluator: """A class to help organize "patch" that are applicable to all tests.""" - def test_evaluate_invocations_rouge_metric(self, mock_perform_eval): + def test_evaluate_invocations_rouge_metric(self, mocker): """Test evaluate_invocations function for Rouge metric.""" + mock_perform_eval = mocker.patch( + "google.adk.evaluation.vertex_ai_eval_facade._VertexAiEvalFacade._perform_eval" + ) actual_invocations = [ Invocation( user_content=genai_types.Content( @@ -67,10 +70,11 @@ def test_evaluate_invocations_rouge_metric(self, mock_perform_eval): assert evaluation_result.overall_eval_status == EvalStatus.FAILED mock_perform_eval.assert_not_called() # Ensure _perform_eval was not called - def test_evaluate_invocations_coherence_metric_passed( - self, mock_perform_eval - ): + def test_evaluate_invocations_coherence_metric_passed(self, mocker): """Test evaluate_invocations function for Coherence metric.""" + mock_perform_eval = mocker.patch( + "google.adk.evaluation.vertex_ai_eval_facade._VertexAiEvalFacade._perform_eval" + ) actual_invocations = [ Invocation( user_content=genai_types.Content( @@ -115,7 +119,7 @@ def test_evaluate_invocations_coherence_metric_passed( vertexai_types.PrebuiltMetric.COHERENCE.name ] - def test_get_metric_info_response_evaluation_score(self, mock_perform_eval): + def test_get_metric_info_response_evaluation_score(self): """Test get_metric_info function for response evaluation metric.""" metric_info = ResponseEvaluator.get_metric_info( PrebuiltMetrics.RESPONSE_EVALUATION_SCORE.value @@ -127,7 +131,7 @@ def test_get_metric_info_response_evaluation_score(self, mock_perform_eval): assert metric_info.metric_value_info.interval.min_value == 1.0 assert metric_info.metric_value_info.interval.max_value == 5.0 - def test_get_metric_info_response_match_score(self, mock_perform_eval): + def test_get_metric_info_response_match_score(self): """Test get_metric_info function for response match metric.""" metric_info = ResponseEvaluator.get_metric_info( PrebuiltMetrics.RESPONSE_MATCH_SCORE.value @@ -136,7 +140,7 @@ def test_get_metric_info_response_match_score(self, mock_perform_eval): assert metric_info.metric_value_info.interval.min_value == 0.0 assert metric_info.metric_value_info.interval.max_value == 1.0 - def test_get_metric_info_invalid(self, mock_perform_eval): + def test_get_metric_info_invalid(self): """Test get_metric_info function for invalid metric.""" with pytest.raises(ValueError): ResponseEvaluator.get_metric_info("invalid_metric") diff --git a/tests/unittests/evaluation/test_rubric_based_evaluator.py b/tests/unittests/evaluation/test_rubric_based_evaluator.py new file mode 100644 index 0000000000..b538b7575a --- /dev/null +++ b/tests/unittests/evaluation/test_rubric_based_evaluator.py @@ -0,0 +1,554 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.evaluation.eval_case import Invocation +from google.adk.evaluation.eval_metrics import EvalMetric +from google.adk.evaluation.eval_metrics import JudgeModelOptions +from google.adk.evaluation.eval_metrics import PrebuiltMetrics +from google.adk.evaluation.eval_metrics import RubricsBasedCriterion +from google.adk.evaluation.eval_rubrics import Rubric +from google.adk.evaluation.eval_rubrics import RubricContent +from google.adk.evaluation.eval_rubrics import RubricScore +from google.adk.evaluation.evaluator import EvalStatus +from google.adk.evaluation.evaluator import PerInvocationResult +from google.adk.evaluation.llm_as_judge_utils import get_average_rubric_score +from google.adk.evaluation.rubric_based_evaluator import DefaultAutoRaterResponseParser +from google.adk.evaluation.rubric_based_evaluator import MajorityVotePerInvocationResultsAggregator +from google.adk.evaluation.rubric_based_evaluator import MeanInvocationResultsSummarizer +from google.adk.evaluation.rubric_based_evaluator import RubricBasedEvaluator +from google.adk.models.llm_response import LlmResponse +from google.genai import types as genai_types +import pytest + + +class FakeRubricBasedEvaluator(RubricBasedEvaluator): + """A fake implementation of RubricBasedEvaluator intended for testing.""" + + def __init__( + self, + eval_metric: EvalMetric, + ): + super().__init__(eval_metric, criterion_type=RubricsBasedCriterion) + + def format_auto_rater_prompt( + self, actual: Invocation, expected: Invocation + ) -> str: + return "fake response" + + +def _create_per_invocation_result( + rubric_scores: list[RubricScore], +) -> PerInvocationResult: + """Helper to create a PerInvocationResult.""" + return PerInvocationResult( + actual_invocation=Invocation( + user_content=genai_types.Content( + parts=[genai_types.Part(text="part_1")] + ) + ), + expected_invocation=Invocation( + user_content=genai_types.Content( + parts=[genai_types.Part(text="part_2")] + ) + ), + score=get_average_rubric_score(rubric_scores), + rubric_scores=rubric_scores, + eval_status=EvalStatus.NOT_EVALUATED, + ) + + +class TestDefaultAutoRaterResponseParser: + """Test cases for DefaultAutoRaterResponseParser.""" + + def test_parse_auto_rater_response_with_empty_string(self): + """Tests _parse_auto_rater_response with an empty string.""" + assert DefaultAutoRaterResponseParser().parse("") == [] + + def test_parse_auto_rater_response_with_malformed_string(self): + """Tests _parse_auto_rater_response with a malformed string.""" + response = "This is just some random text without the expected format." + assert DefaultAutoRaterResponseParser().parse(response) == [] + + def test_parse_auto_rater_response_with_single_yes_verdict(self): + """Tests _parse_auto_rater_response with a single 'yes' verdict.""" + response = """ + Property: Is the response good? + Rationale: It was good. + Verdict: yes + """ + parsed = DefaultAutoRaterResponseParser().parse(response) + assert len(parsed) == 1 + assert parsed[0].property_text == "Is the response good?" + assert parsed[0].rationale == "It was good." + assert parsed[0].score == 1.0 + + def test_parse_auto_rater_response_with_single_no_verdict(self): + """Tests _parse_auto_rater_response with a single 'no' verdict.""" + response = """ + Property: Is the response bad? + Rationale: It was bad. + Verdict: no + """ + parsed = DefaultAutoRaterResponseParser().parse(response) + assert len(parsed) == 1 + assert parsed[0].property_text == "Is the response bad?" + assert parsed[0].rationale == "It was bad." + assert parsed[0].score == 0.0 + + def test_parse_auto_rater_response_with_invalid_verdict(self): + """Tests _parse_auto_rater_response with an invalid verdict.""" + response = """ + Property: Is it unclear? + Rationale: I cannot tell. + Verdict: maybe + """ + parsed = DefaultAutoRaterResponseParser().parse(response) + assert len(parsed) == 1 + assert parsed[0].property_text == "Is it unclear?" + assert parsed[0].rationale == "I cannot tell." + assert parsed[0].score is None + + def test_parse_auto_rater_response_with_multiple_verdicts(self): + """Tests _parse_auto_rater_response with multiple verdicts.""" + response = """ + Property: Is the response good? + Rationale: It was good. + Verdict: yes + + Property: Is the response bad? + Rationale: It was not bad. + Verdict: no + """ + parsed = DefaultAutoRaterResponseParser().parse(response) + assert len(parsed) == 2 + assert parsed[0].property_text == "Is the response good?" + assert parsed[0].rationale == "It was good." + assert parsed[0].score == 1.0 + assert parsed[1].property_text == "Is the response bad?" + assert parsed[1].rationale == "It was not bad." + assert parsed[1].score == 0.0 + + def test_parse_auto_rater_response_with_incomplete_entry(self): + """Tests _parse_auto_rater_response with an incomplete entry.""" + response = """ + Property: Is the response good? + Rationale: It was good. + Verdict: yes + + Property: Is the response bad? + Rationale: It was not bad. + """ # Missing Verdict + parsed = DefaultAutoRaterResponseParser().parse(response) + assert len(parsed) == 1 # zip will only create one item + assert parsed[0].property_text == "Is the response good?" + + def test_parse_auto_rater_response_with_case_insensitive_verdict(self): + """Tests _parse_auto_rater_response is case-insensitive for verdicts.""" + response = """ + Property: Is the response good? + Rationale: It was good. + Verdict: Yes + Property: Is the response bad? + Rationale: It was bad. + Verdict: NO + """ + parsed = DefaultAutoRaterResponseParser().parse(response) + assert len(parsed) == 2 + assert parsed[0].score == 1.0 + assert parsed[1].score == 0.0 + + +class TestMajorityVotePerInvocationResultsAggregator: + + def test_aggregate_per_invocation_samples_with_no_rubric_scores( + self, + ): + """Tests aggregation when samples have no rubric scores.""" + samples = [ + _create_per_invocation_result([]), + _create_per_invocation_result([]), + ] + + result = MajorityVotePerInvocationResultsAggregator().aggregate( + samples, threshold=0.5 + ) + + assert result.score is None + assert result.rubric_scores == [] + + def test_aggregate_per_invocation_samples_with_majority_positive( + self, + ): + """Tests aggregation with a majority of positive scores.""" + samples = [ + _create_per_invocation_result([RubricScore(rubric_id="1", score=1.0)]), + _create_per_invocation_result([RubricScore(rubric_id="1", score=1.0)]), + _create_per_invocation_result([RubricScore(rubric_id="1", score=0.0)]), + ] + + result = MajorityVotePerInvocationResultsAggregator().aggregate( + samples, threshold=0.5 + ) + + assert result.score == 1.0 + assert len(result.rubric_scores) == 1 + assert result.rubric_scores[0].rubric_id == "1" + assert result.rubric_scores[0].score == 1.0 + + def test_aggregate_per_invocation_samples_with_majority_negative( + self, + ): + """Tests aggregation with a majority of negative scores.""" + samples = [ + _create_per_invocation_result([RubricScore(rubric_id="1", score=1.0)]), + _create_per_invocation_result([RubricScore(rubric_id="1", score=0.0)]), + _create_per_invocation_result([RubricScore(rubric_id="1", score=0.0)]), + ] + + result = MajorityVotePerInvocationResultsAggregator().aggregate( + samples, threshold=0.5 + ) + + assert result.score == 0.0 + assert len(result.rubric_scores) == 1 + assert result.rubric_scores[0].rubric_id == "1" + assert result.rubric_scores[0].score == 0.0 + + def test_aggregate_per_invocation_samples_with_tie_verdicts( + self, + ): + """Tests aggregation with a tie, where negative should win.""" + samples = [ + _create_per_invocation_result([RubricScore(rubric_id="1", score=1.0)]), + _create_per_invocation_result([RubricScore(rubric_id="1", score=0.0)]), + ] + + result = MajorityVotePerInvocationResultsAggregator().aggregate( + samples, threshold=0.5 + ) + + assert result.score == 0.0 + assert len(result.rubric_scores) == 1 + assert result.rubric_scores[0].rubric_id == "1" + assert result.rubric_scores[0].score == 0.0 + + def test_aggregate_per_invocation_samples_with_all_none_scores( + self, + ): + """Tests aggregation when all samples have a score of None.""" + samples = [ + _create_per_invocation_result( + [RubricScore(rubric_id="1", score=None, rationale="r1")] + ), + _create_per_invocation_result( + [RubricScore(rubric_id="1", score=None, rationale="r2")] + ), + ] + + result = MajorityVotePerInvocationResultsAggregator().aggregate( + samples, threshold=0.5 + ) + + assert result.score is None + assert len(result.rubric_scores) == 1 + assert result.rubric_scores[0].rubric_id == "1" + assert result.rubric_scores[0].score is None + assert result.rubric_scores[0].rationale == "r1" + + def test_aggregate_per_invocation_samples_with_multiple_rubrics( + self, + ): + """Tests aggregation with multiple rubrics.""" + samples = [ + _create_per_invocation_result([ + RubricScore(rubric_id="1", score=1.0), + RubricScore(rubric_id="2", score=0.0), + ]), + _create_per_invocation_result([ + RubricScore(rubric_id="1", score=1.0), + RubricScore(rubric_id="2", score=0.0), + ]), + _create_per_invocation_result([ + RubricScore(rubric_id="1", score=0.0), + RubricScore(rubric_id="2", score=1.0), + ]), + ] + + result = MajorityVotePerInvocationResultsAggregator().aggregate( + samples, threshold=0.5 + ) + + assert result.score == 0.5 + assert len(result.rubric_scores) == 2 + rubric1_score = next( + (s for s in result.rubric_scores if s.rubric_id == "1"), None + ) + rubric2_score = next( + (s for s in result.rubric_scores if s.rubric_id == "2"), None + ) + assert rubric1_score is not None + assert rubric1_score.score == 1.0 + assert rubric2_score is not None + assert rubric2_score.score == 0.0 + + +class TestMeanInvocationResultsSummarizer: + """Test cases for MeanInvocationResultsSummarizer.""" + + def test_summarize_with_empty_list( + self, + ): + """Tests aggregate_invocation_results with an empty list.""" + result = MeanInvocationResultsSummarizer().summarize([], threshold=0.5) + assert result.overall_score is None + assert result.overall_rubric_scores == [] + assert result.per_invocation_results == [] + + def test_summarize_with_no_rubric_scores( + self, + ): + """Tests aggregate_invocation_results with samples that have no rubric scores.""" + invocations = [ + _create_per_invocation_result([]), + _create_per_invocation_result([]), + ] + result = MeanInvocationResultsSummarizer().summarize( + invocations, threshold=0.5 + ) + assert result.overall_score is None + assert result.overall_rubric_scores == [] + assert result.per_invocation_results == invocations + + def test_summarize_with_single_invocation( + self, + ): + """Tests aggregate_invocation_results with a single invocation result.""" + invocations = [ + _create_per_invocation_result([ + RubricScore(rubric_id="1", score=1.0), + RubricScore(rubric_id="2", score=0.0), + ]) + ] + result = MeanInvocationResultsSummarizer().summarize( + invocations, threshold=0.5 + ) + assert result.overall_score == 0.5 + assert len(result.overall_rubric_scores) == 2 + rubric1_score = next( + s for s in result.overall_rubric_scores if s.rubric_id == "1" + ) + rubric2_score = next( + s for s in result.overall_rubric_scores if s.rubric_id == "2" + ) + assert rubric1_score.score == 1.0 + assert rubric2_score.score == 0.0 + + def test_summarize_with_multiple_invocations_single_rubric( + self, + ): + """Tests aggregate_invocation_results with multiple invocations for a single rubric.""" + invocations = [ + _create_per_invocation_result([RubricScore(rubric_id="1", score=1.0)]), + _create_per_invocation_result([RubricScore(rubric_id="1", score=0.0)]), + _create_per_invocation_result([RubricScore(rubric_id="1", score=1.0)]), + ] + result = MeanInvocationResultsSummarizer().summarize( + invocations, threshold=0.5 + ) + assert result.overall_score == pytest.approx(2 / 3) + assert len(result.overall_rubric_scores) == 1 + assert result.overall_rubric_scores[0].rubric_id == "1" + assert result.overall_rubric_scores[0].score == pytest.approx(2 / 3) + + def test_summarize_with_multiple_invocations_and_rubrics( + self, + ): + """Tests aggregate_invocation_results with multiple invocations and rubrics.""" + invocations = [ + _create_per_invocation_result([ + RubricScore(rubric_id="1", score=1.0), + RubricScore(rubric_id="2", score=0.0), + ]), + _create_per_invocation_result([ + RubricScore(rubric_id="1", score=0.0), + RubricScore(rubric_id="2", score=1.0), + ]), + ] + result = MeanInvocationResultsSummarizer().summarize( + invocations, threshold=0.5 + ) + assert result.overall_score == 0.5 + assert len(result.overall_rubric_scores) == 2 + rubric1_score = next( + s for s in result.overall_rubric_scores if s.rubric_id == "1" + ) + rubric2_score = next( + s for s in result.overall_rubric_scores if s.rubric_id == "2" + ) + assert rubric1_score.score == 0.5 + assert rubric2_score.score == 0.5 + + def test_summarize_with_none_scores( + self, + ): + """Tests aggregate_invocation_results with some None scores.""" + invocations = [ + _create_per_invocation_result([ + RubricScore(rubric_id="1", score=1.0), + RubricScore(rubric_id="2", score=None), + ]), + _create_per_invocation_result([ + RubricScore(rubric_id="1", score=0.0), + RubricScore(rubric_id="2", score=1.0), + ]), + ] + result = MeanInvocationResultsSummarizer().summarize( + invocations, threshold=0.5 + ) + assert result.overall_score == pytest.approx(2 / 3) + assert len(result.overall_rubric_scores) == 2 + rubric1_score = next( + s for s in result.overall_rubric_scores if s.rubric_id == "1" + ) + rubric2_score = next( + s for s in result.overall_rubric_scores if s.rubric_id == "2" + ) + assert rubric1_score.score == 0.5 + assert rubric2_score.score == 1.0 + + +class TestRubricBasedEvaluator: + """Tests for RubricBasedEvaluator.""" + + @pytest.fixture + def evaluator(self) -> FakeRubricBasedEvaluator: + """Returns a RubricBasedFinalResponseQualityV1Evaluator.""" + rubrics = [ + Rubric( + rubric_id="1", + rubric_content=RubricContent(text_property="Is the response good?"), + ), + Rubric( + rubric_id="2", + rubric_content=RubricContent(text_property="Is the response bad?"), + ), + ] + judge_model_options = JudgeModelOptions( + judge_model_config=None, + num_samples=3, + ) + criterion = RubricsBasedCriterion( + threshold=0.5, rubrics=rubrics, judge_model_options=judge_model_options + ) + metric = EvalMetric( + metric_name=PrebuiltMetrics.RUBRIC_BASED_FINAL_RESPONSE_QUALITY_V1.value, + threshold=0.5, + criterion=criterion, + ) + return FakeRubricBasedEvaluator(metric) + + def test_convert_auto_rater_response_to_score_with_empty_response( + self, + evaluator: RubricBasedEvaluator, + ): + """Tests convert_auto_rater_response_to_score with an empty response.""" + response = LlmResponse( + content=genai_types.Content(parts=[genai_types.Part(text="")]) + ) + auto_rater_score = evaluator.convert_auto_rater_response_to_score(response) + assert auto_rater_score.score is None + assert auto_rater_score.rubric_scores == [] + + def test_convert_auto_rater_response_to_score_with_malformed_response( + self, + evaluator: RubricBasedEvaluator, + ): + """Tests convert_auto_rater_response_to_score with a malformed response.""" + response = LlmResponse( + content=genai_types.Content( + parts=[genai_types.Part(text="This is not a valid format.")] + ) + ) + auto_rater_score = evaluator.convert_auto_rater_response_to_score(response) + assert auto_rater_score.score is None + assert auto_rater_score.rubric_scores == [] + + def test_convert_auto_rater_response_to_score_with_mixed_verdicts( + self, + evaluator: RubricBasedEvaluator, + ): + """Tests convert_auto_rater_response_to_score with mixed verdicts.""" + response_text = """ + Property: Is the response good? + Rationale: It was good. + Verdict: yes + Property: Is the response bad? + Rationale: It was bad. + Verdict: no + """ + response = LlmResponse( + content=genai_types.Content( + parts=[genai_types.Part(text=response_text)] + ) + ) + auto_rater_score = evaluator.convert_auto_rater_response_to_score(response) + assert auto_rater_score.score == 0.5 + assert len(auto_rater_score.rubric_scores) == 2 + assert auto_rater_score.rubric_scores[0].score == 1.0 + assert auto_rater_score.rubric_scores[1].score == 0.0 + + def test_convert_auto_rater_response_to_score_with_invalid_verdict( + self, + evaluator: RubricBasedEvaluator, + ): + """Tests convert_auto_rater_response_to_score with an invalid verdict.""" + response_text = """ + Property: Is the response good? + Rationale: It was good. + Verdict: yes + Property: Is the response bad? + Rationale: I cannot tell. + Verdict: invalid + """ + response = LlmResponse( + content=genai_types.Content( + parts=[genai_types.Part(text=response_text)] + ) + ) + auto_rater_score = evaluator.convert_auto_rater_response_to_score(response) + assert auto_rater_score.score == 1.0 + assert len(auto_rater_score.rubric_scores) == 2 + assert auto_rater_score.rubric_scores[0].score == 1.0 + assert auto_rater_score.rubric_scores[1].score is None + + def test_convert_auto_rater_response_to_score_with_unknown_property( + self, + evaluator: RubricBasedEvaluator, + ): + """Tests convert_auto_rater_response_to_score with an unknown property.""" + response_text = """ + Property: Is the response amazing? + Rationale: It was amazing. + Verdict: yes + """ + response = LlmResponse( + content=genai_types.Content( + parts=[genai_types.Part(text=response_text)] + ) + ) + auto_rater_score = evaluator.convert_auto_rater_response_to_score(response) + assert auto_rater_score.score is None + assert len(auto_rater_score.rubric_scores) == 0 diff --git a/tests/unittests/evaluation/test_rubric_based_final_response_quality_v1.py b/tests/unittests/evaluation/test_rubric_based_final_response_quality_v1.py new file mode 100644 index 0000000000..2c2120df3f --- /dev/null +++ b/tests/unittests/evaluation/test_rubric_based_final_response_quality_v1.py @@ -0,0 +1,224 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.evaluation.app_details import AgentDetails +from google.adk.evaluation.app_details import AppDetails +from google.adk.evaluation.eval_case import IntermediateData +from google.adk.evaluation.eval_case import Invocation +from google.adk.evaluation.eval_case import InvocationEvent +from google.adk.evaluation.eval_case import InvocationEvents +from google.adk.evaluation.eval_metrics import EvalMetric +from google.adk.evaluation.eval_metrics import JudgeModelOptions +from google.adk.evaluation.eval_metrics import PrebuiltMetrics +from google.adk.evaluation.eval_metrics import RubricsBasedCriterion +from google.adk.evaluation.eval_rubrics import Rubric +from google.adk.evaluation.eval_rubrics import RubricContent +from google.adk.evaluation.eval_rubrics import RubricScore +from google.adk.evaluation.evaluator import EvalStatus +from google.adk.evaluation.evaluator import PerInvocationResult +from google.adk.evaluation.llm_as_judge_utils import get_average_rubric_score +from google.adk.evaluation.rubric_based_final_response_quality_v1 import RubricBasedFinalResponseQualityV1Evaluator +from google.genai import types as genai_types +import pytest + + +@pytest.fixture +def evaluator() -> RubricBasedFinalResponseQualityV1Evaluator: + """Returns a RubricBasedFinalResponseQualityV1Evaluator.""" + rubrics = [ + Rubric( + rubric_id="1", + rubric_content=RubricContent(text_property="Is the response good?"), + ), + Rubric( + rubric_id="2", + rubric_content=RubricContent(text_property="Is the response bad?"), + ), + ] + judge_model_options = JudgeModelOptions( + judge_model_config=None, + num_samples=3, + ) + criterion = RubricsBasedCriterion( + threshold=0.5, rubrics=rubrics, judge_model_options=judge_model_options + ) + metric = EvalMetric( + metric_name=PrebuiltMetrics.RUBRIC_BASED_FINAL_RESPONSE_QUALITY_V1.value, + threshold=0.5, + criterion=criterion, + ) + return RubricBasedFinalResponseQualityV1Evaluator(metric) + + +def _create_per_invocation_result( + rubric_scores: list[RubricScore], +) -> PerInvocationResult: + """Helper to create a PerInvocationResult.""" + return PerInvocationResult( + actual_invocation=Invocation( + user_content=genai_types.Content( + parts=[genai_types.Part(text="part_1")] + ) + ), + expected_invocation=Invocation( + user_content=genai_types.Content( + parts=[genai_types.Part(text="part_2")] + ) + ), + score=get_average_rubric_score(rubric_scores), + rubric_scores=rubric_scores, + eval_status=EvalStatus.NOT_EVALUATED, + ) + + +def test_format_auto_rater_prompt_with_basic_invocation( + evaluator: RubricBasedFinalResponseQualityV1Evaluator, +): + """Tests format_auto_rater_prompt with a basic invocation.""" + invocation = Invocation( + user_content=genai_types.Content( + parts=[genai_types.Part(text="User input here.")] + ), + final_response=genai_types.Content( + parts=[genai_types.Part(text="Final agent response.")] + ), + ) + prompt = evaluator.format_auto_rater_prompt(invocation, None) + + assert "User input here." in prompt + assert "Final agent response." in prompt + assert "Is the response good?" in prompt + assert "Is the response bad?" in prompt + assert "\n \n " in prompt + assert ( + "\n Agent has no tools.\n " in prompt + ) + assert ( + "\n No intermediate steps were taken.\n " + " " + ) in prompt + + +def test_format_auto_rater_prompt_with_app_details( + evaluator: RubricBasedFinalResponseQualityV1Evaluator, +): + """Tests format_auto_rater_prompt with app_details in invocation.""" + tool = genai_types.Tool( + function_declarations=[ + genai_types.FunctionDeclaration( + name="test_func", description="A test function." + ) + ] + ) + app_details = AppDetails( + agent_details={ + "agent1": AgentDetails( + name="agent1", + instructions="This is an agent instruction.", + tool_declarations=[tool], + ) + }, + ) + invocation = Invocation( + user_content=genai_types.Content( + parts=[genai_types.Part(text="User input here.")] + ), + final_response=genai_types.Content( + parts=[genai_types.Part(text="Final agent response.")] + ), + app_details=app_details, + intermediate_data=InvocationEvents( + invocation_events=[InvocationEvent(author="agent1", content=None)] + ), + ) + prompt = evaluator.format_auto_rater_prompt(invocation, None) + + assert "This is an agent instruction." in prompt + assert '"name": "test_func"' in prompt + assert '"description": "A test function."' in prompt + + +def test_format_auto_rater_prompt_with_intermediate_data( + evaluator: RubricBasedFinalResponseQualityV1Evaluator, +): + """Tests format_auto_rater_prompt with intermediate_data in invocation.""" + tool_call = genai_types.FunctionCall( + name="test_func", args={"arg1": "val1"}, id="call1" + ) + tool_response = genai_types.FunctionResponse( + name="test_func", response={"result": "ok"}, id="call1" + ) + intermediate_data = IntermediateData( + tool_uses=[tool_call], tool_responses=[tool_response] + ) + invocation = Invocation( + user_content=genai_types.Content( + parts=[genai_types.Part(text="User input here.")] + ), + final_response=genai_types.Content( + parts=[genai_types.Part(text="Final agent response.")] + ), + intermediate_data=intermediate_data, + ) + prompt = evaluator.format_auto_rater_prompt(invocation, None) + + assert '"step": 0' in prompt + assert '"tool_call":' in prompt + assert '"name": "test_func"' in prompt + assert '"tool_response":' in prompt + assert '"result": "ok"' in prompt + + +def test_format_auto_rater_prompt_with_app_details_no_tools( + evaluator: RubricBasedFinalResponseQualityV1Evaluator, +): + """Tests format_auto_rater_prompt with app_details but no tools.""" + app_details = AppDetails( + agent_details={ + "agent1": AgentDetails(name="agent1", tool_declarations=[]) + }, + ) + invocation = Invocation( + user_content=genai_types.Content( + parts=[genai_types.Part(text="User input here.")] + ), + final_response=genai_types.Content( + parts=[genai_types.Part(text="Final agent response.")] + ), + app_details=app_details, + ) + prompt = evaluator.format_auto_rater_prompt(invocation, None) + + assert '"tool_declarations": {\n "agent1": []\n }' in prompt + + +def test_format_auto_rater_prompt_with_intermediate_data_no_tools( + evaluator: RubricBasedFinalResponseQualityV1Evaluator, +): + """Tests format_auto_rater_prompt with intermediate_data but no tool calls.""" + intermediate_data = IntermediateData(tool_uses=[], tool_responses=[]) + invocation = Invocation( + user_content=genai_types.Content( + parts=[genai_types.Part(text="User input here.")] + ), + final_response=genai_types.Content( + parts=[genai_types.Part(text="Final agent response.")] + ), + intermediate_data=intermediate_data, + ) + prompt = evaluator.format_auto_rater_prompt(invocation, None) + + assert "No intermediate steps were taken." in prompt diff --git a/tests/unittests/evaluation/test_rubric_based_tool_use_quality_v1.py b/tests/unittests/evaluation/test_rubric_based_tool_use_quality_v1.py new file mode 100644 index 0000000000..aed20a3a7a --- /dev/null +++ b/tests/unittests/evaluation/test_rubric_based_tool_use_quality_v1.py @@ -0,0 +1,150 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.evaluation.app_details import AgentDetails +from google.adk.evaluation.app_details import AppDetails +from google.adk.evaluation.eval_case import IntermediateData +from google.adk.evaluation.eval_case import Invocation +from google.adk.evaluation.eval_metrics import EvalMetric +from google.adk.evaluation.eval_metrics import JudgeModelOptions +from google.adk.evaluation.eval_metrics import PrebuiltMetrics +from google.adk.evaluation.eval_metrics import RubricsBasedCriterion +from google.adk.evaluation.eval_rubrics import Rubric +from google.adk.evaluation.eval_rubrics import RubricContent +from google.adk.evaluation.rubric_based_tool_use_quality_v1 import RubricBasedToolUseV1Evaluator +from google.genai import types as genai_types +import pytest + + +@pytest.fixture +def evaluator() -> RubricBasedToolUseV1Evaluator: + """Returns a RubricBasedToolUseV1Evaluator.""" + rubrics = [ + Rubric( + rubric_id="1", + rubric_content=RubricContent( + text_property="Did the agent use the correct tool?" + ), + ), + Rubric( + rubric_id="2", + rubric_content=RubricContent( + text_property="Were the tool parameters correct?" + ), + ), + ] + judge_model_options = JudgeModelOptions( + judge_model_config=None, + num_samples=3, + ) + criterion = RubricsBasedCriterion( + threshold=0.5, rubrics=rubrics, judge_model_options=judge_model_options + ) + metric = EvalMetric( + metric_name=PrebuiltMetrics.RUBRIC_BASED_TOOL_USE_QUALITY_V1.value, + threshold=0.5, + criterion=criterion, + ) + return RubricBasedToolUseV1Evaluator(metric) + + +def test_format_auto_rater_prompt_with_basic_invocation( + evaluator: RubricBasedToolUseV1Evaluator, +): + """Tests format_auto_rater_prompt with a basic invocation.""" + invocation = Invocation( + user_content=genai_types.Content( + parts=[genai_types.Part(text="User input here.")] + ), + ) + prompt = evaluator.format_auto_rater_prompt(invocation, None) + + assert "User input here." in prompt + assert "Did the agent use the correct tool?" in prompt + assert "Were the tool parameters correct?" in prompt + assert "\nAgent has no tools.\n" in prompt + assert "\nNo intermediate steps were taken.\n" in prompt + + +def test_format_auto_rater_prompt_with_app_details( + evaluator: RubricBasedToolUseV1Evaluator, +): + """Tests format_auto_rater_prompt with app_details in invocation.""" + tool = genai_types.Tool( + function_declarations=[ + genai_types.FunctionDeclaration( + name="test_func", description="A test function." + ) + ] + ) + app_details = AppDetails( + agent_details={ + "agent1": AgentDetails( + name="agent1", + tool_declarations=[tool], + ) + }, + ) + invocation = Invocation( + user_content=genai_types.Content( + parts=[genai_types.Part(text="User input here.")] + ), + app_details=app_details, + ) + prompt = evaluator.format_auto_rater_prompt(invocation, None) + + assert '"name": "test_func"' in prompt + assert '"description": "A test function."' in prompt + + +def test_format_auto_rater_prompt_with_intermediate_data( + evaluator: RubricBasedToolUseV1Evaluator, +): + """Tests format_auto_rater_prompt with intermediate_data in invocation.""" + tool_call = genai_types.FunctionCall( + name="test_func", args={"arg1": "val1"}, id="call1" + ) + tool_response = genai_types.FunctionResponse( + name="test_func", response={"result": "ok"}, id="call1" + ) + intermediate_data = IntermediateData( + tool_uses=[tool_call], tool_responses=[tool_response] + ) + invocation = Invocation( + user_content=genai_types.Content( + parts=[genai_types.Part(text="User input here.")] + ), + intermediate_data=intermediate_data, + ) + prompt = evaluator.format_auto_rater_prompt(invocation, None) + + assert '"step": 0' in prompt + assert '"tool_call":' in prompt + assert '"name": "test_func"' in prompt + assert '"tool_response":' in prompt + assert '"result": "ok"' in prompt + + +def test_get_metric_info(evaluator: RubricBasedToolUseV1Evaluator): + """Tests the get_metric_info method.""" + metric_info = evaluator.get_metric_info() + assert ( + metric_info.metric_name + == PrebuiltMetrics.RUBRIC_BASED_TOOL_USE_QUALITY_V1.value + ) + assert "agent's usage of tools" in metric_info.description + assert metric_info.metric_value_info.interval.min_value == 0.0 + assert metric_info.metric_value_info.interval.max_value == 1.0 diff --git a/tests/unittests/evaluation/test_safety_evaluator.py b/tests/unittests/evaluation/test_safety_evaluator.py index 5cc95b1d2b..69a1594474 100644 --- a/tests/unittests/evaluation/test_safety_evaluator.py +++ b/tests/unittests/evaluation/test_safety_evaluator.py @@ -13,27 +13,26 @@ # limitations under the License. """Tests for the Response Evaluator.""" -from unittest.mock import patch +from google.adk.dependencies.vertexai import vertexai from google.adk.evaluation.eval_case import Invocation from google.adk.evaluation.eval_metrics import EvalMetric from google.adk.evaluation.eval_metrics import PrebuiltMetrics from google.adk.evaluation.evaluator import EvalStatus from google.adk.evaluation.safety_evaluator import SafetyEvaluatorV1 from google.genai import types as genai_types -from vertexai import types as vertexai_types + +vertexai_types = vertexai.types -@patch( - "google.adk.evaluation.vertex_ai_eval_facade._VertexAiEvalFacade._perform_eval" -) class TestSafetyEvaluatorV1: """A class to help organize "patch" that are applicable to all tests.""" - def test_evaluate_invocations_coherence_metric_passed( - self, mock_perform_eval - ): + def test_evaluate_invocations_coherence_metric_passed(self, mocker): """Test evaluate_invocations function for Coherence metric.""" + mock_perform_eval = mocker.patch( + "google.adk.evaluation.vertex_ai_eval_facade._VertexAiEvalFacade._perform_eval" + ) actual_invocations = [ Invocation( user_content=genai_types.Content( @@ -78,7 +77,7 @@ def test_evaluate_invocations_coherence_metric_passed( vertexai_types.PrebuiltMetric.SAFETY.name ] - def test_get_metric_info(self, mock_perform_eval): + def test_get_metric_info(self): """Test get_metric_info function for Safety metric.""" metric_info = SafetyEvaluatorV1.get_metric_info() assert metric_info.metric_name == PrebuiltMetrics.SAFETY_V1.value diff --git a/tests/unittests/evaluation/test_static_user_simulator.py b/tests/unittests/evaluation/test_static_user_simulator.py new file mode 100644 index 0000000000..5cc70c80e6 --- /dev/null +++ b/tests/unittests/evaluation/test_static_user_simulator.py @@ -0,0 +1,54 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.evaluation import static_user_simulator +from google.adk.evaluation import user_simulator +from google.adk.evaluation.eval_case import Invocation +from google.genai import types +import pytest + + +class TestStaticUserSimulator: + """Test cases for StaticUserSimulator.""" + + @pytest.mark.asyncio + async def test_get_next_user_message(self): + """Tests that the provided messages are returned in order followed by the stop signal.""" + conversation = [ + Invocation( + invocation_id="inv1", + user_content=types.Content(parts=[types.Part(text="message 1")]), + ), + Invocation( + invocation_id="inv2", + user_content=types.Content(parts=[types.Part(text="message 2")]), + ), + ] + simulator = static_user_simulator.StaticUserSimulator( + static_conversation=conversation + ) + + next_message_1 = await simulator.get_next_user_message(events=[]) + assert user_simulator.Status.SUCCESS == next_message_1.status + assert "message 1" == next_message_1.user_message.parts[0].text + + next_message_2 = await simulator.get_next_user_message(events=[]) + assert user_simulator.Status.SUCCESS == next_message_2.status + assert "message 2" == next_message_2.user_message.parts[0].text + + next_message_3 = await simulator.get_next_user_message(events=[]) + assert user_simulator.Status.STOP_SIGNAL_DETECTED == next_message_3.status + assert next_message_3.user_message is None diff --git a/tests/unittests/evaluation/test_trajectory_evaluator.py b/tests/unittests/evaluation/test_trajectory_evaluator.py index a8053dd13d..2f20b7ebb7 100644 --- a/tests/unittests/evaluation/test_trajectory_evaluator.py +++ b/tests/unittests/evaluation/test_trajectory_evaluator.py @@ -14,263 +14,18 @@ """Testings for the Trajectory Evaluator.""" -import math +from google.adk.evaluation.eval_case import IntermediateData +from google.adk.evaluation.eval_case import Invocation from google.adk.evaluation.eval_metrics import PrebuiltMetrics +from google.adk.evaluation.evaluator import EvalStatus from google.adk.evaluation.trajectory_evaluator import TrajectoryEvaluator +from google.genai import types as genai_types import pytest -# Define reusable tool call structures -TOOL_ROLL_DICE_16 = {"tool_name": "roll_die", "tool_input": {"sides": 16}} -TOOL_ROLL_DICE_6 = {"tool_name": "roll_die", "tool_input": {"sides": 6}} -TOOL_GET_WEATHER = { - "tool_name": "get_weather", - "tool_input": {"location": "Paris"}, -} -TOOL_GET_WEATHER_SF = { - "tool_name": "get_weather", - "tool_input": {"location": "SF"}, -} - -# Sample data for turns -TURN_MATCH = { - "query": "Q1", - "response": "R1", - "actual_tool_use": [TOOL_ROLL_DICE_16], - "expected_tool_use": [TOOL_ROLL_DICE_16], -} -TURN_MISMATCH_INPUT = { - "query": "Q2", - "response": "R2", - "actual_tool_use": [TOOL_ROLL_DICE_6], - "expected_tool_use": [TOOL_ROLL_DICE_16], -} -TURN_MISMATCH_NAME = { - "query": "Q3", - "response": "R3", - "actual_tool_use": [TOOL_GET_WEATHER], - "expected_tool_use": [TOOL_ROLL_DICE_16], -} -TURN_MATCH_MULTIPLE = { - "query": "Q4", - "response": "R4", - "actual_tool_use": [TOOL_GET_WEATHER, TOOL_ROLL_DICE_6], - "expected_tool_use": [TOOL_GET_WEATHER, TOOL_ROLL_DICE_6], -} -TURN_MISMATCH_ORDER = { - "query": "Q5", - "response": "R5", - "actual_tool_use": [TOOL_ROLL_DICE_6, TOOL_GET_WEATHER], - "expected_tool_use": [TOOL_GET_WEATHER, TOOL_ROLL_DICE_6], -} -TURN_MISMATCH_LENGTH_ACTUAL_LONGER = { - "query": "Q6", - "response": "R6", - "actual_tool_use": [TOOL_GET_WEATHER, TOOL_ROLL_DICE_6], - "expected_tool_use": [TOOL_GET_WEATHER], -} -TURN_MISMATCH_LENGTH_EXPECTED_LONGER = { - "query": "Q7", - "response": "R7", - "actual_tool_use": [TOOL_GET_WEATHER], - "expected_tool_use": [TOOL_GET_WEATHER, TOOL_ROLL_DICE_6], -} -TURN_MATCH_WITH_MOCK_OUTPUT = { - "query": "Q8", - "response": "R8", - "actual_tool_use": [TOOL_GET_WEATHER_SF], - "expected_tool_use": [ - {**TOOL_GET_WEATHER_SF, "mock_tool_output": "Sunny"} - ], # Add mock output to expected -} -TURN_MATCH_EMPTY_TOOLS = { - "query": "Q9", - "response": "R9", - "actual_tool_use": [], - "expected_tool_use": [], -} -TURN_MISMATCH_EMPTY_VS_NONEMPTY = { - "query": "Q10", - "response": "R10", - "actual_tool_use": [], - "expected_tool_use": [TOOL_GET_WEATHER], -} - - -def test_evaluate_none_dataset_raises_value_error(): - """Tests evaluate function raises ValueError for an empty list.""" - with pytest.raises(ValueError, match="The evaluation dataset is empty."): - TrajectoryEvaluator.evaluate(None) - - -def test_evaluate_empty_dataset_raises_value_error(): - """Tests evaluate function raises ValueError for an empty list.""" - with pytest.raises(ValueError, match="The evaluation dataset is empty."): - TrajectoryEvaluator.evaluate([]) - - -def test_evaluate_single_turn_match(): - """Tests evaluate function with one conversation, one turn, perfect match.""" - eval_dataset = [[TURN_MATCH]] - assert TrajectoryEvaluator.evaluate(eval_dataset) == 1.0 - - -def test_evaluate_single_turn_mismatch(): - """Tests evaluate function with one conversation, one turn, mismatch.""" - eval_dataset = [[TURN_MISMATCH_INPUT]] - assert TrajectoryEvaluator.evaluate(eval_dataset) == 0.0 - - -def test_evaluate_multiple_turns_all_match(): - """Tests evaluate function with one conversation, multiple turns, all match.""" - eval_dataset = [[TURN_MATCH, TURN_MATCH_MULTIPLE, TURN_MATCH_EMPTY_TOOLS]] - assert TrajectoryEvaluator.evaluate(eval_dataset) == 1.0 - - -def test_evaluate_multiple_turns_mixed(): - """Tests evaluate function with one conversation, mixed match/mismatch turns.""" - eval_dataset = [ - [TURN_MATCH, TURN_MISMATCH_NAME, TURN_MATCH_MULTIPLE, TURN_MISMATCH_ORDER] - ] - # Expected: (1.0 + 0.0 + 1.0 + 0.0) / 4 = 0.5 - assert TrajectoryEvaluator.evaluate(eval_dataset) == 0.5 - - -def test_evaluate_multiple_conversations_mixed(): - """Tests evaluate function with multiple conversations, mixed turns.""" - eval_dataset = [ - [TURN_MATCH, TURN_MISMATCH_INPUT], # Conv 1: 1.0, 0.0 -> Avg 0.5 - [TURN_MATCH_MULTIPLE], # Conv 2: 1.0 -> Avg 1.0 - [ - TURN_MISMATCH_ORDER, - TURN_MISMATCH_LENGTH_ACTUAL_LONGER, - TURN_MATCH, - ], # Conv 3: 0.0, 0.0, 1.0 -> Avg 1/3 - ] - # Expected: (1.0 + 0.0 + 1.0 + 0.0 + 0.0 + 1.0) / 6 = 3.0 / 6 = 0.5 - assert TrajectoryEvaluator.evaluate(eval_dataset) == 0.5 - - -def test_evaluate_ignores_mock_tool_output_in_expected(): - """Tests evaluate function correctly compares even if expected has mock_tool_output.""" - eval_dataset = [[TURN_MATCH_WITH_MOCK_OUTPUT]] - assert TrajectoryEvaluator.evaluate(eval_dataset) == 1.0 - - -def test_evaluate_match_empty_tool_lists(): - """Tests evaluate function correctly matches empty tool lists.""" - eval_dataset = [[TURN_MATCH_EMPTY_TOOLS]] - assert TrajectoryEvaluator.evaluate(eval_dataset) == 1.0 - - -def test_evaluate_mismatch_empty_vs_nonempty(): - """Tests evaluate function correctly mismatches empty vs non-empty tool lists.""" - eval_dataset = [[TURN_MISMATCH_EMPTY_VS_NONEMPTY]] - assert TrajectoryEvaluator.evaluate(eval_dataset) == 0.0 - eval_dataset_rev = [[{ - **TURN_MISMATCH_EMPTY_VS_NONEMPTY, # Swap actual/expected - "actual_tool_use": [TOOL_GET_WEATHER], - "expected_tool_use": [], - }]] - assert TrajectoryEvaluator.evaluate(eval_dataset_rev) == 0.0 - - -def test_evaluate_dataset_with_empty_conversation(): - """Tests evaluate function handles dataset containing an empty conversation list.""" - eval_dataset = [[TURN_MATCH], []] # One valid conversation, one empty - # Should only evaluate the first conversation -> 1.0 / 1 turn = 1.0 - assert TrajectoryEvaluator.evaluate(eval_dataset) == 1.0 - - -def test_evaluate_dataset_only_empty_conversation(): - """Tests evaluate function handles dataset with only an empty conversation.""" - eval_dataset = [[]] - # No rows evaluated, mean of empty series is NaN - # Depending on desired behavior, this could be 0.0 or NaN. The code returns - # NaN. - assert math.isnan(TrajectoryEvaluator.evaluate(eval_dataset)) - - -def test_evaluate_print_detailed_results(capsys): - """Tests evaluate function runs with print_detailed_results=True and prints something.""" - eval_dataset = [[TURN_MATCH, TURN_MISMATCH_INPUT]] - TrajectoryEvaluator.evaluate(eval_dataset, print_detailed_results=True) - captured = capsys.readouterr() - assert "query" in captured.out # Check if the results table header is printed - assert "R1" in captured.out # Check if some data is printed - assert "Failures:" in captured.out # Check if failures header is printed - assert "Q2" in captured.out # Check if the failing query is printed - - -def test_evaluate_no_failures_print(capsys): - """Tests evaluate function does not print Failures section when all turns match.""" - eval_dataset = [[TURN_MATCH]] - TrajectoryEvaluator.evaluate(eval_dataset, print_detailed_results=True) - captured = capsys.readouterr() - assert "query" in captured.out # Results table should still print - assert "Failures:" not in captured.out # Failures section should NOT print - - -def test_are_tools_equal_identical(): - """Tests are_tools_equal function with identical lists.""" - list_a = [TOOL_GET_WEATHER, TOOL_ROLL_DICE_6] - list_b = [TOOL_GET_WEATHER, TOOL_ROLL_DICE_6] - assert TrajectoryEvaluator.are_tools_equal(list_a, list_b) - - -def test_are_tools_equal_empty(): - """Tests are_tools_equal function with empty lists.""" - assert TrajectoryEvaluator.are_tools_equal([], []) - - -def test_are_tools_equal_different_order(): - """Tests are_tools_equal function with same tools, different order.""" - list_a = [TOOL_ROLL_DICE_6, TOOL_GET_WEATHER] - list_b = [TOOL_GET_WEATHER, TOOL_ROLL_DICE_6] - assert not TrajectoryEvaluator.are_tools_equal(list_a, list_b) - - -def test_are_tools_equal_different_length(): - """Tests are_tools_equal function with lists of different lengths.""" - list_a = [TOOL_GET_WEATHER, TOOL_ROLL_DICE_6] - list_b = [TOOL_GET_WEATHER] - assert not TrajectoryEvaluator.are_tools_equal(list_a, list_b) - - -def test_are_tools_equal_different_input_values(): - """Tests are_tools_equal function with different input values.""" - list_a = [TOOL_ROLL_DICE_16] - list_b = [TOOL_ROLL_DICE_6] - assert not TrajectoryEvaluator.are_tools_equal(list_a, list_b) - - -def test_are_tools_equal_different_tool_names(): - """Tests are_tools_equal function with different tool names.""" - list_a = [TOOL_ROLL_DICE_16] - list_b = [TOOL_GET_WEATHER] - assert not TrajectoryEvaluator.are_tools_equal(list_a, list_b) - - -def test_are_tools_equal_ignores_extra_keys(): - """Tests are_tools_equal function ignores keys other than tool_name/tool_input.""" - list_a = [{ - "tool_name": "get_weather", - "tool_input": {"location": "Paris"}, - "extra_key": "abc", - }] - list_b = [{ - "tool_name": "get_weather", - "tool_input": {"location": "Paris"}, - "other_key": 123, - }] - assert TrajectoryEvaluator.are_tools_equal(list_a, list_b) - - -def test_are_tools_equal_one_empty_one_not(): - """Tests are_tools_equal function with one empty list and one non-empty list.""" - list_a = [] - list_b = [TOOL_GET_WEATHER] - assert not TrajectoryEvaluator.are_tools_equal(list_a, list_b) +_USER_CONTENT = genai_types.Content( + parts=[genai_types.Part(text="User input here.")] +) def test_get_metric_info(): @@ -281,3 +36,149 @@ def test_get_metric_info(): ) assert metric_info.metric_value_info.interval.min_value == 0.0 assert metric_info.metric_value_info.interval.max_value == 1.0 + + +@pytest.fixture +def evaluator() -> TrajectoryEvaluator: + """Returns a TrajectoryEvaluator.""" + return TrajectoryEvaluator(threshold=0.5) + + +def test_evaluate_invocations_equal_tool_calls(evaluator: TrajectoryEvaluator): + """Tests evaluate_invocations with equal tool calls.""" + tool_call = genai_types.FunctionCall(name="test_func", args={"arg1": "val1"}) + intermediate_data = IntermediateData(tool_uses=[tool_call]) + invocation = Invocation( + user_content=_USER_CONTENT, intermediate_data=intermediate_data + ) + result = evaluator.evaluate_invocations([invocation], [invocation]) + assert result.overall_score == 1.0 + assert result.overall_eval_status == EvalStatus.PASSED + assert len(result.per_invocation_results) == 1 + assert result.per_invocation_results[0].score == 1.0 + assert result.per_invocation_results[0].eval_status == EvalStatus.PASSED + + +def test_evaluate_invocations_different_tool_call_names( + evaluator: TrajectoryEvaluator, +): + """Tests evaluate_invocations with different tool call names.""" + tool_call1 = genai_types.FunctionCall( + name="test_func1", args={"arg1": "val1"} + ) + tool_call2 = genai_types.FunctionCall( + name="test_func2", args={"arg1": "val1"} + ) + invocation1 = Invocation( + user_content=_USER_CONTENT, + intermediate_data=IntermediateData(tool_uses=[tool_call1]), + ) + invocation2 = Invocation( + user_content=_USER_CONTENT, + intermediate_data=IntermediateData(tool_uses=[tool_call2]), + ) + result = evaluator.evaluate_invocations([invocation1], [invocation2]) + assert result.overall_score == 0.0 + assert result.overall_eval_status == EvalStatus.FAILED + assert result.per_invocation_results[0].score == 0.0 + assert result.per_invocation_results[0].eval_status == EvalStatus.FAILED + + +def test_evaluate_invocations_different_tool_call_args( + evaluator: TrajectoryEvaluator, +): + """Tests evaluate_invocations with different tool call args.""" + tool_call1 = genai_types.FunctionCall(name="test_func", args={"arg1": "val1"}) + tool_call2 = genai_types.FunctionCall(name="test_func", args={"arg1": "val2"}) + invocation1 = Invocation( + user_content=_USER_CONTENT, + intermediate_data=IntermediateData(tool_uses=[tool_call1]), + ) + invocation2 = Invocation( + user_content=_USER_CONTENT, + intermediate_data=IntermediateData(tool_uses=[tool_call2]), + ) + result = evaluator.evaluate_invocations([invocation1], [invocation2]) + assert result.overall_score == 0.0 + assert result.overall_eval_status == EvalStatus.FAILED + assert result.per_invocation_results[0].score == 0.0 + assert result.per_invocation_results[0].eval_status == EvalStatus.FAILED + + +def test_evaluate_invocations_different_number_of_tool_calls( + evaluator: TrajectoryEvaluator, +): + """Tests evaluate_invocations with different number of tool calls.""" + tool_call1 = genai_types.FunctionCall(name="test_func", args={"arg1": "val1"}) + tool_call2 = genai_types.FunctionCall(name="test_func", args={"arg1": "val1"}) + invocation1 = Invocation( + user_content=_USER_CONTENT, + intermediate_data=IntermediateData(tool_uses=[tool_call1]), + ) + invocation2 = Invocation( + user_content=_USER_CONTENT, + intermediate_data=IntermediateData(tool_uses=[tool_call1, tool_call2]), + ) + result = evaluator.evaluate_invocations([invocation1], [invocation2]) + assert result.overall_score == 0.0 + assert result.overall_eval_status == EvalStatus.FAILED + assert result.per_invocation_results[0].score == 0.0 + assert result.per_invocation_results[0].eval_status == EvalStatus.FAILED + + +def test_evaluate_invocations_no_tool_calls(evaluator: TrajectoryEvaluator): + """Tests evaluate_invocations with no tool calls.""" + invocation = Invocation( + user_content=_USER_CONTENT, intermediate_data=IntermediateData() + ) + result = evaluator.evaluate_invocations([invocation], [invocation]) + assert result.overall_score == 1.0 + assert result.overall_eval_status == EvalStatus.PASSED + assert result.per_invocation_results[0].score == 1.0 + assert result.per_invocation_results[0].eval_status == EvalStatus.PASSED + + +def test_evaluate_invocations_multiple_invocations( + evaluator: TrajectoryEvaluator, +): + """Tests evaluate_invocations with multiple invocations.""" + tool_call1 = genai_types.FunctionCall( + name="test_func1", args={"arg1": "val1"} + ) + tool_call2 = genai_types.FunctionCall( + name="test_func2", args={"arg1": "val1"} + ) + inv1_actual = Invocation( + user_content=_USER_CONTENT, + intermediate_data=IntermediateData(tool_uses=[tool_call1]), + ) + inv1_expected = Invocation( + user_content=_USER_CONTENT, + intermediate_data=IntermediateData(tool_uses=[tool_call1]), + ) + inv2_actual = Invocation( + user_content=_USER_CONTENT, + intermediate_data=IntermediateData(tool_uses=[tool_call1]), + ) + inv2_expected = Invocation( + user_content=_USER_CONTENT, + intermediate_data=IntermediateData(tool_uses=[tool_call2]), + ) + result = evaluator.evaluate_invocations( + [inv1_actual, inv2_actual], [inv1_expected, inv2_expected] + ) + assert result.overall_score == 0.5 + assert result.overall_eval_status == EvalStatus.PASSED + assert len(result.per_invocation_results) == 2 + assert result.per_invocation_results[0].score == 1.0 + assert result.per_invocation_results[0].eval_status == EvalStatus.PASSED + assert result.per_invocation_results[1].score == 0.0 + assert result.per_invocation_results[1].eval_status == EvalStatus.FAILED + + +def test_evaluate_invocations_no_invocations(evaluator: TrajectoryEvaluator): + """Tests evaluate_invocations with no invocations.""" + result = evaluator.evaluate_invocations([], []) + assert result.overall_score is None + assert result.overall_eval_status == EvalStatus.NOT_EVALUATED + assert not result.per_invocation_results diff --git a/tests/unittests/evaluation/test_user_simulator.py b/tests/unittests/evaluation/test_user_simulator.py new file mode 100644 index 0000000000..c3e1e606ee --- /dev/null +++ b/tests/unittests/evaluation/test_user_simulator.py @@ -0,0 +1,45 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.evaluation.user_simulator import NextUserMessage +from google.adk.evaluation.user_simulator import Status +from google.genai.types import Content +import pytest + + +def test_next_user_message_validation(): + """Tests post-init validation of NextUserMessage.""" + with pytest.raises( + ValueError, + match=( + "A user_message should be provided if and only if the status is" + " SUCCESS" + ), + ): + NextUserMessage(status=Status.SUCCESS) + + with pytest.raises( + ValueError, + match=( + "A user_message should be provided if and only if the status is" + " SUCCESS" + ), + ): + NextUserMessage(status=Status.TURN_LIMIT_REACHED, user_message=Content()) + + # these two should not cause exceptions + NextUserMessage(status=Status.SUCCESS, user_message=Content()) + NextUserMessage(status=Status.TURN_LIMIT_REACHED) diff --git a/tests/unittests/evaluation/test_user_simulator_provider.py b/tests/unittests/evaluation/test_user_simulator_provider.py new file mode 100644 index 0000000000..7cff4241b6 --- /dev/null +++ b/tests/unittests/evaluation/test_user_simulator_provider.py @@ -0,0 +1,79 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from google.adk.evaluation import conversation_scenarios +from google.adk.evaluation import eval_case +from google.adk.evaluation import user_simulator_provider +from google.adk.evaluation.llm_backed_user_simulator import LlmBackedUserSimulator +from google.adk.evaluation.llm_backed_user_simulator import LlmBackedUserSimulatorConfig +from google.adk.evaluation.static_user_simulator import StaticUserSimulator +from google.genai import types +import pytest + +_TEST_CONVERSATION = [ + eval_case.Invocation( + invocation_id='inv1', + user_content=types.Content(parts=[types.Part(text='Hello!')]), + ), +] + +_TEST_CONVERSATION_SCENARIO = conversation_scenarios.ConversationScenario( + starting_prompt='Hello!', conversation_plan='test plan' +) + + +class TestUserSimulatorProvider: + """Test cases for the UserSimulatorProvider.""" + + def test_provide_static_user_simulator(self): + """Tests the case when a StaticUserSimulator should be provided.""" + provider = user_simulator_provider.UserSimulatorProvider() + test_eval_case = eval_case.EvalCase( + eval_id='test_eval_id', + conversation=_TEST_CONVERSATION, + ) + simulator = provider.provide(test_eval_case) + assert isinstance(simulator, StaticUserSimulator) + assert simulator.static_conversation == _TEST_CONVERSATION + + def test_provide_llm_backed_user_simulator(self, mocker): + """Tests the case when a LlmBackedUserSimulator should be provided.""" + mock_llm_registry = mocker.patch( + 'google.adk.evaluation.llm_backed_user_simulator.LLMRegistry', + autospec=True, + ) + mock_llm_registry.return_value.resolve.return_value = mocker.Mock() + # Test case 1: No config in provider. + provider = user_simulator_provider.UserSimulatorProvider() + test_eval_case = eval_case.EvalCase( + eval_id='test_eval_id', + conversation_scenario=_TEST_CONVERSATION_SCENARIO, + ) + simulator = provider.provide(test_eval_case) + assert isinstance(simulator, LlmBackedUserSimulator) + assert simulator._conversation_scenario == _TEST_CONVERSATION_SCENARIO + + # Test case 2: Config in provider. + llm_config = LlmBackedUserSimulatorConfig( + model='test_model', + ) + provider = user_simulator_provider.UserSimulatorProvider( + user_simulator_config=llm_config + ) + simulator = provider.provide(test_eval_case) + assert isinstance(simulator, LlmBackedUserSimulator) + assert simulator._conversation_scenario == _TEST_CONVERSATION_SCENARIO + assert simulator._config.model == 'test_model' diff --git a/tests/unittests/evaluation/test_vertex_ai_eval_facade.py b/tests/unittests/evaluation/test_vertex_ai_eval_facade.py index 8fd1705c49..a628b65fbc 100644 --- a/tests/unittests/evaluation/test_vertex_ai_eval_facade.py +++ b/tests/unittests/evaluation/test_vertex_ai_eval_facade.py @@ -12,27 +12,30 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import annotations + """Tests for the Response Evaluator.""" import math import random -from unittest.mock import patch +from google.adk.dependencies.vertexai import vertexai from google.adk.evaluation.eval_case import Invocation from google.adk.evaluation.evaluator import EvalStatus from google.adk.evaluation.vertex_ai_eval_facade import _VertexAiEvalFacade from google.genai import types as genai_types import pytest -from vertexai import types as vertexai_types + +vertexai_types = vertexai.types -@patch( - "google.adk.evaluation.vertex_ai_eval_facade._VertexAiEvalFacade._perform_eval" -) class TestVertexAiEvalFacade: """A class to help organize "patch" that are applicable to all tests.""" - def test_evaluate_invocations_metric_passed(self, mock_perform_eval): + def test_evaluate_invocations_metric_passed(self, mocker): """Test evaluate_invocations function for a metric.""" + mock_perform_eval = mocker.patch( + "google.adk.evaluation.vertex_ai_eval_facade._VertexAiEvalFacade._perform_eval" + ) actual_invocations = [ Invocation( user_content=genai_types.Content( @@ -77,8 +80,11 @@ def test_evaluate_invocations_metric_passed(self, mock_perform_eval): vertexai_types.PrebuiltMetric.COHERENCE.name ] - def test_evaluate_invocations_metric_failed(self, mock_perform_eval): + def test_evaluate_invocations_metric_failed(self, mocker): """Test evaluate_invocations function for a metric.""" + mock_perform_eval = mocker.patch( + "google.adk.evaluation.vertex_ai_eval_facade._VertexAiEvalFacade._perform_eval" + ) actual_invocations = [ Invocation( user_content=genai_types.Content( @@ -133,9 +139,12 @@ def test_evaluate_invocations_metric_failed(self, mock_perform_eval): ], ) def test_evaluate_invocations_metric_no_score( - self, mock_perform_eval, summary_metric_with_no_score + self, mocker, summary_metric_with_no_score ): """Test evaluate_invocations function for a metric.""" + mock_perform_eval = mocker.patch( + "google.adk.evaluation.vertex_ai_eval_facade._VertexAiEvalFacade._perform_eval" + ) actual_invocations = [ Invocation( user_content=genai_types.Content( @@ -180,10 +189,11 @@ def test_evaluate_invocations_metric_no_score( vertexai_types.PrebuiltMetric.COHERENCE.name ] - def test_evaluate_invocations_metric_multiple_invocations( - self, mock_perform_eval - ): + def test_evaluate_invocations_metric_multiple_invocations(self, mocker): """Test evaluate_invocations function for a metric with multiple invocations.""" + mock_perform_eval = mocker.patch( + "google.adk.evaluation.vertex_ai_eval_facade._VertexAiEvalFacade._perform_eval" + ) num_invocations = 6 actual_invocations = [] expected_invocations = [] diff --git a/tests/unittests/flows/llm_flows/test_agent_transfer.py b/tests/unittests/flows/llm_flows/test_agent_transfer.py index 5268d0ca0a..19225ce793 100644 --- a/tests/unittests/flows/llm_flows/test_agent_transfer.py +++ b/tests/unittests/flows/llm_flows/test_agent_transfer.py @@ -14,9 +14,14 @@ from google.adk.agents.llm_agent import Agent from google.adk.agents.loop_agent import LoopAgent +from google.adk.agents.loop_agent import LoopAgentState from google.adk.agents.sequential_agent import SequentialAgent +from google.adk.agents.sequential_agent import SequentialAgentState +from google.adk.apps.app import App +from google.adk.apps.app import ResumabilityConfig from google.adk.tools.exit_loop_tool import exit_loop from google.genai.types import Part +import pytest from ... import testing_utils @@ -31,71 +36,113 @@ def transfer_call_part(agent_name: str) -> Part: name='transfer_to_agent', response={'result': None} ) +END_OF_AGENT = testing_utils.END_OF_AGENT -def test_auto_to_auto(): + +@pytest.mark.parametrize('is_resumable', [True, False]) +def test_auto_to_auto(is_resumable: bool): response = [ transfer_call_part('sub_agent_1'), 'response1', 'response2', ] - mockModel = testing_utils.MockModel.create(responses=response) + mock_model = testing_utils.MockModel.create(responses=response) # root (auto) - sub_agent_1 (auto) - sub_agent_1 = Agent(name='sub_agent_1', model=mockModel) + sub_agent_1 = Agent(name='sub_agent_1', model=mock_model) root_agent = Agent( name='root_agent', - model=mockModel, + model=mock_model, sub_agents=[sub_agent_1], ) - - runner = testing_utils.InMemoryRunner(root_agent) - - # Asserts the transfer. - assert testing_utils.simplify_events(runner.run('test1')) == [ - ('root_agent', transfer_call_part('sub_agent_1')), - ('root_agent', TRANSFER_RESPONSE_PART), - ('sub_agent_1', 'response1'), - ] - - # sub_agent_1 should still be the current agent. - assert testing_utils.simplify_events(runner.run('test2')) == [ - ('sub_agent_1', 'response2'), - ] - - -def test_auto_to_single(): + app = App( + name='test_app', + root_agent=root_agent, + resumability_config=ResumabilityConfig(is_resumable=is_resumable), + ) + runner = testing_utils.InMemoryRunner(app=app) + + if not is_resumable: + # Asserts the transfer. + assert testing_utils.simplify_events(runner.run('test1')) == [ + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + ('sub_agent_1', 'response1'), + ] + + # sub_agent_1 should still be the current agent. + assert testing_utils.simplify_events(runner.run('test2')) == [ + ('sub_agent_1', 'response2'), + ] + else: + assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + ('sub_agent_1', 'response1'), + ('sub_agent_1', END_OF_AGENT), + ('root_agent', END_OF_AGENT), + ] + # Same session, different invocation. + assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ + ('sub_agent_1', 'response2'), + ('sub_agent_1', END_OF_AGENT), + ] + + +@pytest.mark.parametrize('is_resumable', [True, False]) +def test_auto_to_single(is_resumable: bool): response = [ transfer_call_part('sub_agent_1'), 'response1', 'response2', ] - mockModel = testing_utils.MockModel.create(responses=response) + mock_model = testing_utils.MockModel.create(responses=response) # root (auto) - sub_agent_1 (single) sub_agent_1 = Agent( name='sub_agent_1', - model=mockModel, + model=mock_model, disallow_transfer_to_parent=True, disallow_transfer_to_peers=True, ) root_agent = Agent( - name='root_agent', model=mockModel, sub_agents=[sub_agent_1] + name='root_agent', model=mock_model, sub_agents=[sub_agent_1] ) - - runner = testing_utils.InMemoryRunner(root_agent) - - # Asserts the responses. - assert testing_utils.simplify_events(runner.run('test1')) == [ - ('root_agent', transfer_call_part('sub_agent_1')), - ('root_agent', TRANSFER_RESPONSE_PART), - ('sub_agent_1', 'response1'), - ] - - # root_agent should still be the current agent, because sub_agent_1 is single. - assert testing_utils.simplify_events(runner.run('test2')) == [ - ('root_agent', 'response2'), - ] - - -def test_auto_to_auto_to_single(): + app = App( + name='test_app', + root_agent=root_agent, + resumability_config=ResumabilityConfig(is_resumable=is_resumable), + ) + runner = testing_utils.InMemoryRunner(app=app) + + if not is_resumable: + # Asserts the responses. + assert testing_utils.simplify_events(runner.run('test1')) == [ + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + ('sub_agent_1', 'response1'), + ] + + # root_agent should still be the current agent, because sub_agent_1 is + # single. + assert testing_utils.simplify_events(runner.run('test2')) == [ + ('root_agent', 'response2'), + ] + else: + assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + ('sub_agent_1', 'response1'), + ('sub_agent_1', END_OF_AGENT), + ('root_agent', END_OF_AGENT), + ] + # Same session, different invocation. + assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ + ('root_agent', 'response2'), + ('root_agent', END_OF_AGENT), + ] + + +@pytest.mark.parametrize('is_resumable', [True, False]) +def test_auto_to_auto_to_single(is_resumable: bool): response = [ transfer_call_part('sub_agent_1'), # sub_agent_1 transfers to sub_agent_1_1. @@ -103,41 +150,63 @@ def test_auto_to_auto_to_single(): 'response1', 'response2', ] - mockModel = testing_utils.MockModel.create(responses=response) + mock_model = testing_utils.MockModel.create(responses=response) # root (auto) - sub_agent_1 (auto) - sub_agent_1_1 (single) sub_agent_1_1 = Agent( name='sub_agent_1_1', - model=mockModel, + model=mock_model, disallow_transfer_to_parent=True, disallow_transfer_to_peers=True, ) sub_agent_1 = Agent( - name='sub_agent_1', model=mockModel, sub_agents=[sub_agent_1_1] + name='sub_agent_1', model=mock_model, sub_agents=[sub_agent_1_1] ) root_agent = Agent( - name='root_agent', model=mockModel, sub_agents=[sub_agent_1] + name='root_agent', model=mock_model, sub_agents=[sub_agent_1] ) - - runner = testing_utils.InMemoryRunner(root_agent) - - # Asserts the responses. - assert testing_utils.simplify_events(runner.run('test1')) == [ - ('root_agent', transfer_call_part('sub_agent_1')), - ('root_agent', TRANSFER_RESPONSE_PART), - ('sub_agent_1', transfer_call_part('sub_agent_1_1')), - ('sub_agent_1', TRANSFER_RESPONSE_PART), - ('sub_agent_1_1', 'response1'), - ] - - # sub_agent_1 should still be the current agent. sub_agent_1_1 is single so it should - # not be the current agent, otherwise the conversation will be tied to - # sub_agent_1_1 forever. - assert testing_utils.simplify_events(runner.run('test2')) == [ - ('sub_agent_1', 'response2'), - ] - - -def test_auto_to_sequential(): + app = App( + name='test_app', + root_agent=root_agent, + resumability_config=ResumabilityConfig(is_resumable=is_resumable), + ) + runner = testing_utils.InMemoryRunner(app=app) + + if not is_resumable: + # Asserts the responses. + assert testing_utils.simplify_events(runner.run('test1')) == [ + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + ('sub_agent_1', transfer_call_part('sub_agent_1_1')), + ('sub_agent_1', TRANSFER_RESPONSE_PART), + ('sub_agent_1_1', 'response1'), + ] + + # sub_agent_1 should still be the current agent. sub_agent_1_1 is single so + # it should not be the current agent; otherwise, the conversation will be + # tied to sub_agent_1_1 forever. + assert testing_utils.simplify_events(runner.run('test2')) == [ + ('sub_agent_1', 'response2'), + ] + else: + assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + ('sub_agent_1', transfer_call_part('sub_agent_1_1')), + ('sub_agent_1', TRANSFER_RESPONSE_PART), + ('sub_agent_1_1', 'response1'), + ('sub_agent_1_1', END_OF_AGENT), + ('sub_agent_1', END_OF_AGENT), + ('root_agent', END_OF_AGENT), + ] + # Same session, different invocation. + assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ + ('sub_agent_1', 'response2'), + ('sub_agent_1', END_OF_AGENT), + ] + + +@pytest.mark.parametrize('is_resumable', [True, False]) +def test_auto_to_sequential(is_resumable: bool): response = [ transfer_call_part('sub_agent_1'), # sub_agent_1 responds directly instead of transferring. @@ -145,18 +214,18 @@ def test_auto_to_sequential(): 'response2', 'response3', ] - mockModel = testing_utils.MockModel.create(responses=response) + mock_model = testing_utils.MockModel.create(responses=response) # root (auto) - sub_agent_1 (sequential) - sub_agent_1_1 (single) # \ sub_agent_1_2 (single) sub_agent_1_1 = Agent( name='sub_agent_1_1', - model=mockModel, + model=mock_model, disallow_transfer_to_parent=True, disallow_transfer_to_peers=True, ) sub_agent_1_2 = Agent( name='sub_agent_1_2', - model=mockModel, + model=mock_model, disallow_transfer_to_parent=True, disallow_transfer_to_peers=True, ) @@ -166,27 +235,62 @@ def test_auto_to_sequential(): ) root_agent = Agent( name='root_agent', - model=mockModel, + model=mock_model, sub_agents=[sub_agent_1], ) - - runner = testing_utils.InMemoryRunner(root_agent) - - # Asserts the transfer. - assert testing_utils.simplify_events(runner.run('test1')) == [ - ('root_agent', transfer_call_part('sub_agent_1')), - ('root_agent', TRANSFER_RESPONSE_PART), - ('sub_agent_1_1', 'response1'), - ('sub_agent_1_2', 'response2'), - ] - - # root_agent should still be the current agent because sub_agent_1 is sequential. - assert testing_utils.simplify_events(runner.run('test2')) == [ - ('root_agent', 'response3'), - ] - - -def test_auto_to_sequential_to_auto(): + app = App( + name='test_app', + root_agent=root_agent, + resumability_config=ResumabilityConfig(is_resumable=is_resumable), + ) + runner = testing_utils.InMemoryRunner(app=app) + + if not is_resumable: + # Asserts the transfer. + assert testing_utils.simplify_events(runner.run('test1')) == [ + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + ('sub_agent_1_1', 'response1'), + ('sub_agent_1_2', 'response2'), + ] + + # root_agent should still be the current agent because sub_agent_1 is + # sequential. + assert testing_utils.simplify_events(runner.run('test2')) == [ + ('root_agent', 'response3'), + ] + else: + assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + ( + 'sub_agent_1', + SequentialAgentState(current_sub_agent='sub_agent_1_1').model_dump( + mode='json' + ), + ), + ('sub_agent_1_1', 'response1'), + ('sub_agent_1_1', END_OF_AGENT), + ( + 'sub_agent_1', + SequentialAgentState(current_sub_agent='sub_agent_1_2').model_dump( + mode='json' + ), + ), + ('sub_agent_1_2', 'response2'), + ('sub_agent_1_2', END_OF_AGENT), + ('sub_agent_1', END_OF_AGENT), + ('root_agent', END_OF_AGENT), + ] + # Same session, different invocation. + assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ + ('root_agent', 'response3'), + ('root_agent', END_OF_AGENT), + ] + + +@pytest.mark.parametrize('is_resumable', [True, False]) +def test_auto_to_sequential_to_auto(is_resumable: bool): response = [ transfer_call_part('sub_agent_1'), # sub_agent_1 responds directly instead of transferring. @@ -196,25 +300,25 @@ def test_auto_to_sequential_to_auto(): 'response3', 'response4', ] - mockModel = testing_utils.MockModel.create(responses=response) + mock_model = testing_utils.MockModel.create(responses=response) # root (auto) - sub_agent_1 (seq) - sub_agent_1_1 (single) # \ sub_agent_1_2 (auto) - sub_agent_1_2_1 (auto) # \ sub_agent_1_3 (single) sub_agent_1_1 = Agent( name='sub_agent_1_1', - model=mockModel, + model=mock_model, disallow_transfer_to_parent=True, disallow_transfer_to_peers=True, ) - sub_agent_1_2_1 = Agent(name='sub_agent_1_2_1', model=mockModel) + sub_agent_1_2_1 = Agent(name='sub_agent_1_2_1', model=mock_model) sub_agent_1_2 = Agent( name='sub_agent_1_2', - model=mockModel, + model=mock_model, sub_agents=[sub_agent_1_2_1], ) sub_agent_1_3 = Agent( name='sub_agent_1_3', - model=mockModel, + model=mock_model, disallow_transfer_to_parent=True, disallow_transfer_to_peers=True, ) @@ -224,30 +328,76 @@ def test_auto_to_sequential_to_auto(): ) root_agent = Agent( name='root_agent', - model=mockModel, + model=mock_model, sub_agents=[sub_agent_1], ) - - runner = testing_utils.InMemoryRunner(root_agent) - - # Asserts the transfer. - assert testing_utils.simplify_events(runner.run('test1')) == [ - ('root_agent', transfer_call_part('sub_agent_1')), - ('root_agent', TRANSFER_RESPONSE_PART), - ('sub_agent_1_1', 'response1'), - ('sub_agent_1_2', transfer_call_part('sub_agent_1_2_1')), - ('sub_agent_1_2', TRANSFER_RESPONSE_PART), - ('sub_agent_1_2_1', 'response2'), - ('sub_agent_1_3', 'response3'), - ] - - # root_agent should still be the current agent because sub_agent_1 is sequential. - assert testing_utils.simplify_events(runner.run('test2')) == [ - ('root_agent', 'response4'), - ] - - -def test_auto_to_loop(): + app = App( + name='test_app', + root_agent=root_agent, + resumability_config=ResumabilityConfig(is_resumable=is_resumable), + ) + runner = testing_utils.InMemoryRunner(app=app) + + if not is_resumable: + # Asserts the transfer. + assert testing_utils.simplify_events(runner.run('test1')) == [ + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + ('sub_agent_1_1', 'response1'), + ('sub_agent_1_2', transfer_call_part('sub_agent_1_2_1')), + ('sub_agent_1_2', TRANSFER_RESPONSE_PART), + ('sub_agent_1_2_1', 'response2'), + ('sub_agent_1_3', 'response3'), + ] + + # root_agent should still be the current agent because sub_agent_1 is + # sequential. + assert testing_utils.simplify_events(runner.run('test2')) == [ + ('root_agent', 'response4'), + ] + else: + assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + ( + 'sub_agent_1', + SequentialAgentState(current_sub_agent='sub_agent_1_1').model_dump( + mode='json' + ), + ), + ('sub_agent_1_1', 'response1'), + ('sub_agent_1_1', END_OF_AGENT), + ( + 'sub_agent_1', + SequentialAgentState(current_sub_agent='sub_agent_1_2').model_dump( + mode='json' + ), + ), + ('sub_agent_1_2', transfer_call_part('sub_agent_1_2_1')), + ('sub_agent_1_2', TRANSFER_RESPONSE_PART), + ('sub_agent_1_2_1', 'response2'), + ('sub_agent_1_2_1', END_OF_AGENT), + ('sub_agent_1_2', END_OF_AGENT), + ( + 'sub_agent_1', + SequentialAgentState(current_sub_agent='sub_agent_1_3').model_dump( + mode='json' + ), + ), + ('sub_agent_1_3', 'response3'), + ('sub_agent_1_3', END_OF_AGENT), + ('sub_agent_1', END_OF_AGENT), + ('root_agent', END_OF_AGENT), + ] + # Same session, different invocation. + assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ + ('root_agent', 'response4'), + ('root_agent', END_OF_AGENT), + ] + + +@pytest.mark.parametrize('is_resumable', [True, False]) +def test_auto_to_loop(is_resumable: bool): response = [ transfer_call_part('sub_agent_1'), # sub_agent_1 responds directly instead of transferring. @@ -258,18 +408,18 @@ def test_auto_to_loop(): 'response4', 'response5', ] - mockModel = testing_utils.MockModel.create(responses=response) + mock_model = testing_utils.MockModel.create(responses=response) # root (auto) - sub_agent_1 (loop) - sub_agent_1_1 (single) # \ sub_agent_1_2 (single) sub_agent_1_1 = Agent( name='sub_agent_1_1', - model=mockModel, + model=mock_model, disallow_transfer_to_parent=True, disallow_transfer_to_peers=True, ) sub_agent_1_2 = Agent( name='sub_agent_1_2', - model=mockModel, + model=mock_model, disallow_transfer_to_parent=True, disallow_transfer_to_peers=True, tools=[exit_loop], @@ -280,32 +430,158 @@ def test_auto_to_loop(): ) root_agent = Agent( name='root_agent', - model=mockModel, + model=mock_model, sub_agents=[sub_agent_1], ) - - runner = testing_utils.InMemoryRunner(root_agent) - - # Asserts the transfer. - assert testing_utils.simplify_events(runner.run('test1')) == [ - # Transfers to sub_agent_1. - ('root_agent', transfer_call_part('sub_agent_1')), - ('root_agent', TRANSFER_RESPONSE_PART), - # Loops. - ('sub_agent_1_1', 'response1'), - ('sub_agent_1_2', 'response2'), - ('sub_agent_1_1', 'response3'), - # Exits. - ('sub_agent_1_2', Part.from_function_call(name='exit_loop', args={})), - ( - 'sub_agent_1_2', - Part.from_function_response( - name='exit_loop', response={'result': None} - ), - ), - ] - - # root_agent should still be the current agent because sub_agent_1 is loop. - assert testing_utils.simplify_events(runner.run('test2')) == [ - ('root_agent', 'response4'), + app = App( + name='test_app', + root_agent=root_agent, + resumability_config=ResumabilityConfig(is_resumable=is_resumable), + ) + runner = testing_utils.InMemoryRunner(app=app) + + if not is_resumable: + # Asserts the transfer. + assert testing_utils.simplify_events(runner.run('test1')) == [ + # Transfers to sub_agent_1. + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + # Loops. + ('sub_agent_1_1', 'response1'), + ('sub_agent_1_2', 'response2'), + ('sub_agent_1_1', 'response3'), + # Exits. + ('sub_agent_1_2', Part.from_function_call(name='exit_loop', args={})), + ( + 'sub_agent_1_2', + Part.from_function_response( + name='exit_loop', response={'result': None} + ), + ), + ] + + # root_agent should still be the current agent because sub_agent_1 is loop. + assert testing_utils.simplify_events(runner.run('test2')) == [ + ('root_agent', 'response4'), + ] + else: + assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ + # Transfers to sub_agent_1. + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + # Loops. + ( + 'sub_agent_1', + LoopAgentState(current_sub_agent='sub_agent_1_1').model_dump( + mode='json' + ), + ), + ('sub_agent_1_1', 'response1'), + ('sub_agent_1_1', END_OF_AGENT), + ( + 'sub_agent_1', + LoopAgentState(current_sub_agent='sub_agent_1_2').model_dump( + mode='json' + ), + ), + ('sub_agent_1_2', 'response2'), + ('sub_agent_1_2', END_OF_AGENT), + ( + 'sub_agent_1', + LoopAgentState( + current_sub_agent='sub_agent_1_1', times_looped=1 + ).model_dump(mode='json'), + ), + ('sub_agent_1_1', 'response3'), + ('sub_agent_1_1', END_OF_AGENT), + ( + 'sub_agent_1', + LoopAgentState( + current_sub_agent='sub_agent_1_2', times_looped=1 + ).model_dump(mode='json'), + ), + # Exits. + ('sub_agent_1_2', Part.from_function_call(name='exit_loop', args={})), + ( + 'sub_agent_1_2', + Part.from_function_response( + name='exit_loop', response={'result': None} + ), + ), + ('sub_agent_1_2', END_OF_AGENT), + ('sub_agent_1', END_OF_AGENT), + ('root_agent', END_OF_AGENT), + ] + # Same session, different invocation. + assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ + ('root_agent', 'response4'), + ('root_agent', END_OF_AGENT), + ] + + +@pytest.mark.parametrize('is_resumable', [True, False]) +def test_auto_to_auto_to_auto_forms_transfer_loop(is_resumable: bool): + response = [ + transfer_call_part('sub_agent_1'), + transfer_call_part('sub_agent_2'), + transfer_call_part('root_agent'), + 'response from root', + 'response 2 from root', ] + mock_model = testing_utils.MockModel.create(responses=response) + # root (auto) - sub_agent_1 (auto) - sub_agent_2 (auto) - root (auto) + sub_agent_1 = Agent(name='sub_agent_1', model=mock_model) + sub_agent_2 = Agent(name='sub_agent_2', model=mock_model) + root_agent = Agent( + name='root_agent', + model=mock_model, + sub_agents=[sub_agent_1, sub_agent_2], + ) + app = App( + name='test_app', + root_agent=root_agent, + resumability_config=ResumabilityConfig(is_resumable=is_resumable), + ) + runner = testing_utils.InMemoryRunner(app=app) + + if not is_resumable: + # Asserts the transfer. + assert testing_utils.simplify_events(runner.run('test1')) == [ + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + ('sub_agent_1', transfer_call_part('sub_agent_2')), + ('sub_agent_1', TRANSFER_RESPONSE_PART), + ('sub_agent_2', transfer_call_part('root_agent')), + ('sub_agent_2', TRANSFER_RESPONSE_PART), + ('root_agent', 'response from root'), + ] + + # root_agent should be the current agent. + assert testing_utils.simplify_events(runner.run('test2')) == [ + ('root_agent', 'response 2 from root'), + ] + else: + assert testing_utils.simplify_resumable_app_events(runner.run('test1')) == [ + ('root_agent', transfer_call_part('sub_agent_1')), + ('root_agent', TRANSFER_RESPONSE_PART), + ('sub_agent_1', transfer_call_part('sub_agent_2')), + ('sub_agent_1', TRANSFER_RESPONSE_PART), + ('sub_agent_2', transfer_call_part('root_agent')), + ('sub_agent_2', TRANSFER_RESPONSE_PART), + ('root_agent', 'response from root'), + ( + 'root_agent', + END_OF_AGENT, + ), # First time root_agent marked as ended. + ('sub_agent_2', END_OF_AGENT), + ('sub_agent_1', END_OF_AGENT), + ( + 'root_agent', + END_OF_AGENT, + ), # Second time root_agent marked as ended. + ] + # Same session, different invocation. + assert testing_utils.simplify_resumable_app_events(runner.run('test2')) == [ + ('root_agent', 'response 2 from root'), + ('root_agent', END_OF_AGENT), + ] diff --git a/tests/unittests/flows/llm_flows/test_base_llm_flow.py b/tests/unittests/flows/llm_flows/test_base_llm_flow.py index 8ae885362f..81ef925a39 100644 --- a/tests/unittests/flows/llm_flows/test_base_llm_flow.py +++ b/tests/unittests/flows/llm_flows/test_base_llm_flow.py @@ -14,18 +14,25 @@ """Unit tests for BaseLlmFlow toolset integration.""" +from unittest import mock from unittest.mock import AsyncMock from google.adk.agents.llm_agent import Agent +from google.adk.events.event import Event from google.adk.flows.llm_flows.base_llm_flow import BaseLlmFlow +from google.adk.models.google_llm import Gemini from google.adk.models.llm_request import LlmRequest from google.adk.models.llm_response import LlmResponse +from google.adk.plugins.base_plugin import BasePlugin from google.adk.tools.base_toolset import BaseToolset +from google.adk.tools.google_search_tool import GoogleSearchTool from google.genai import types import pytest from ... import testing_utils +google_search = GoogleSearchTool(bypass_multi_tools_limit=True) + class BaseLlmFlowForTesting(BaseLlmFlow): """Test implementation of BaseLlmFlow for testing purposes.""" @@ -88,7 +95,6 @@ async def close(self): async def test_preprocess_handles_mixed_tools_and_toolsets(): """Test that _preprocess_async properly handles both tools and toolsets.""" from google.adk.tools.base_tool import BaseTool - from google.adk.tools.function_tool import FunctionTool # Create a mock tool class _MockTool(BaseTool): @@ -148,3 +154,262 @@ def _test_function(): # Verify that process_llm_request was called on both tools and toolsets assert mock_tool.process_llm_request_called assert mock_toolset.process_llm_request_called + + +# TODO(b/448114567): Remove the following test_preprocess_with_google_search +# tests once the workaround is no longer needed. +@pytest.mark.asyncio +async def test_preprocess_with_google_search_only(): + """Test _preprocess_async with only the google_search tool.""" + agent = Agent(name='test_agent', model='gemini-pro', tools=[google_search]) + invocation_context = await testing_utils.create_invocation_context( + agent=agent, user_content='test message' + ) + flow = BaseLlmFlowForTesting() + llm_request = LlmRequest(model='gemini-pro') + async for _ in flow._preprocess_async(invocation_context, llm_request): + pass + + assert len(llm_request.config.tools) == 1 + assert llm_request.config.tools[0].google_search is not None + + +@pytest.mark.asyncio +async def test_preprocess_with_google_search_workaround(): + """Test _preprocess_async with google_search and another tool.""" + + def _my_tool(sides: int) -> int: + """A simple tool.""" + return sides + + agent = Agent( + name='test_agent', model='gemini-pro', tools=[_my_tool, google_search] + ) + invocation_context = await testing_utils.create_invocation_context( + agent=agent, user_content='test message' + ) + flow = BaseLlmFlowForTesting() + llm_request = LlmRequest(model='gemini-pro') + async for _ in flow._preprocess_async(invocation_context, llm_request): + pass + + assert len(llm_request.config.tools) == 1 + declarations = llm_request.config.tools[0].function_declarations + assert len(declarations) == 2 + assert {d.name for d in declarations} == {'_my_tool', 'google_search_agent'} + + +@pytest.mark.asyncio +async def test_preprocess_calls_convert_tool_union_to_tools(): + """Test that _preprocess_async calls _convert_tool_union_to_tools.""" + + class _MockTool: + process_llm_request = AsyncMock() + + mock_tool_instance = _MockTool() + + def _my_tool(sides: int) -> int: + """A simple tool.""" + return sides + + with mock.patch( + 'google.adk.agents.llm_agent._convert_tool_union_to_tools', + new_callable=AsyncMock, + ) as mock_convert: + mock_convert.return_value = [mock_tool_instance] + + model = Gemini(model='gemini-2') + agent = Agent( + name='test_agent', model=model, tools=[_my_tool, google_search] + ) + invocation_context = await testing_utils.create_invocation_context( + agent=agent, user_content='test message' + ) + flow = BaseLlmFlowForTesting() + llm_request = LlmRequest(model='gemini-2') + + async for _ in flow._preprocess_async(invocation_context, llm_request): + pass + + mock_convert.assert_called_with( + google_search, + mock.ANY, # ReadonlyContext(invocation_context) + model, + True, # multiple_tools + ) + + +# TODO(b/448114567): Remove the following +# test_handle_after_model_callback_grounding tests once the workaround +# is no longer needed. +def dummy_tool(): + pass + + +@pytest.mark.parametrize( + 'tools, state_metadata, expect_metadata', + [ + ([], None, False), + ([google_search, dummy_tool], {'foo': 'bar'}, True), + ([dummy_tool], {'foo': 'bar'}, False), + ([google_search, dummy_tool], None, False), + ], + ids=[ + 'no_search_no_grounding', + 'with_search_with_grounding', + 'no_search_with_grounding', + 'with_search_no_grounding', + ], +) +@pytest.mark.asyncio +async def test_handle_after_model_callback_grounding_with_no_callbacks( + tools, state_metadata, expect_metadata +): + """Test handling grounding metadata when there are no callbacks.""" + agent = Agent(name='test_agent', tools=tools) + invocation_context = await testing_utils.create_invocation_context( + agent=agent + ) + if state_metadata: + invocation_context.session.state['temp:_adk_grounding_metadata'] = ( + state_metadata + ) + + llm_response = LlmResponse( + content=types.Content(parts=[types.Part.from_text(text='response')]) + ) + event = Event( + id=Event.new_id(), + invocation_id=invocation_context.invocation_id, + author=agent.name, + ) + flow = BaseLlmFlowForTesting() + + result = await flow._handle_after_model_callback( + invocation_context, llm_response, event + ) + + if expect_metadata: + llm_response.grounding_metadata = state_metadata + assert result == llm_response + else: + assert result is None + + +@pytest.mark.parametrize( + 'tools, state_metadata, expect_metadata', + [ + ([], None, False), + ([google_search, dummy_tool], {'foo': 'bar'}, True), + ([dummy_tool], {'foo': 'bar'}, False), + ([google_search, dummy_tool], None, False), + ], + ids=[ + 'no_search_no_grounding', + 'with_search_with_grounding', + 'no_search_with_grounding', + 'with_search_no_grounding', + ], +) +@pytest.mark.asyncio +async def test_handle_after_model_callback_grounding_with_callback_override( + tools, state_metadata, expect_metadata +): + """Test handling grounding metadata when there is a callback override.""" + agent_response = LlmResponse( + content=types.Content(parts=[types.Part.from_text(text='agent')]) + ) + agent_callback = AsyncMock(return_value=agent_response) + + agent = Agent( + name='test_agent', tools=tools, after_model_callback=[agent_callback] + ) + invocation_context = await testing_utils.create_invocation_context( + agent=agent + ) + if state_metadata: + invocation_context.session.state['temp:_adk_grounding_metadata'] = ( + state_metadata + ) + + llm_response = LlmResponse( + content=types.Content(parts=[types.Part.from_text(text='response')]) + ) + event = Event( + id=Event.new_id(), + invocation_id=invocation_context.invocation_id, + author=agent.name, + ) + flow = BaseLlmFlowForTesting() + + result = await flow._handle_after_model_callback( + invocation_context, llm_response, event + ) + + if expect_metadata: + agent_response.grounding_metadata = state_metadata + + assert result == agent_response + agent_callback.assert_called_once() + + +@pytest.mark.parametrize( + 'tools, state_metadata, expect_metadata', + [ + ([], None, False), + ([google_search, dummy_tool], {'foo': 'bar'}, True), + ([dummy_tool], {'foo': 'bar'}, False), + ([google_search, dummy_tool], None, False), + ], + ids=[ + 'no_search_no_grounding', + 'with_search_with_grounding', + 'no_search_with_grounding', + 'with_search_no_grounding', + ], +) +@pytest.mark.asyncio +async def test_handle_after_model_callback_grounding_with_plugin_override( + tools, state_metadata, expect_metadata +): + """Test handling grounding metadata when there is a plugin override.""" + plugin_response = LlmResponse( + content=types.Content(parts=[types.Part.from_text(text='plugin')]) + ) + + class _MockPlugin(BasePlugin): + + def __init__(self): + super().__init__(name='mock_plugin') + + after_model_callback = AsyncMock(return_value=plugin_response) + + plugin = _MockPlugin() + agent = Agent(name='test_agent', tools=tools) + invocation_context = await testing_utils.create_invocation_context( + agent=agent, plugins=[plugin] + ) + if state_metadata: + invocation_context.session.state['temp:_adk_grounding_metadata'] = ( + state_metadata + ) + + llm_response = LlmResponse( + content=types.Content(parts=[types.Part.from_text(text='response')]) + ) + event = Event( + id=Event.new_id(), + invocation_id=invocation_context.invocation_id, + author=agent.name, + ) + flow = BaseLlmFlowForTesting() + + result = await flow._handle_after_model_callback( + invocation_context, llm_response, event + ) + + if expect_metadata: + plugin_response.grounding_metadata = state_metadata + + assert result == plugin_response + plugin.after_model_callback.assert_called_once() diff --git a/tests/unittests/flows/llm_flows/test_basic_processor.py b/tests/unittests/flows/llm_flows/test_basic_processor.py index 770f358949..e0be77818a 100644 --- a/tests/unittests/flows/llm_flows/test_basic_processor.py +++ b/tests/unittests/flows/llm_flows/test_basic_processor.py @@ -14,6 +14,8 @@ """Tests for basic LLM request processor.""" +from unittest import mock + from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.llm_agent import LlmAgent from google.adk.agents.run_config import RunConfig @@ -80,7 +82,7 @@ async def test_sets_output_schema_when_no_tools(self): assert llm_request.config.response_mime_type == 'application/json' @pytest.mark.asyncio - async def test_skips_output_schema_when_tools_present(self): + async def test_skips_output_schema_when_tools_present(self, mocker): """Test that processor skips output_schema when agent has tools.""" agent = LlmAgent( name='test_agent', @@ -93,6 +95,11 @@ async def test_skips_output_schema_when_tools_present(self): llm_request = LlmRequest() processor = _BasicLlmRequestProcessor() + can_use_output_schema_with_tools = mocker.patch( + 'google.adk.flows.llm_flows.basic.can_use_output_schema_with_tools', + mock.MagicMock(return_value=False), + ) + # Process the request events = [] async for event in processor.run_async(invocation_context, llm_request): @@ -102,6 +109,40 @@ async def test_skips_output_schema_when_tools_present(self): assert llm_request.config.response_schema is None assert llm_request.config.response_mime_type != 'application/json' + # Should have checked if output schema can be used with tools + can_use_output_schema_with_tools.assert_called_once_with(agent.model) + + @pytest.mark.asyncio + async def test_sets_output_schema_when_tools_present(self, mocker): + """Test that processor skips output_schema when agent has tools.""" + agent = LlmAgent( + name='test_agent', + model='gemini-2.5-flash', + output_schema=OutputSchema, + tools=[FunctionTool(func=dummy_tool)], # Has tools + ) + + invocation_context = await _create_invocation_context(agent) + llm_request = LlmRequest() + processor = _BasicLlmRequestProcessor() + + can_use_output_schema_with_tools = mocker.patch( + 'google.adk.flows.llm_flows.basic.can_use_output_schema_with_tools', + mock.MagicMock(return_value=True), + ) + + # Process the request + events = [] + async for event in processor.run_async(invocation_context, llm_request): + events.append(event) + + # Should have set response_schema since output schema can be used with tools + assert llm_request.config.response_schema == OutputSchema + assert llm_request.config.response_mime_type == 'application/json' + + # Should have checked if output schema can be used with tools + can_use_output_schema_with_tools.assert_called_once_with(agent.model) + @pytest.mark.asyncio async def test_no_output_schema_no_tools(self): """Test that processor works normally when agent has no output_schema or tools.""" diff --git a/tests/unittests/flows/llm_flows/test_code_execution.py b/tests/unittests/flows/llm_flows/test_code_execution.py new file mode 100644 index 0000000000..f28726e41b --- /dev/null +++ b/tests/unittests/flows/llm_flows/test_code_execution.py @@ -0,0 +1,150 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Unit tests for Code Execution logic.""" + +import datetime +from unittest.mock import AsyncMock +from unittest.mock import MagicMock +from unittest.mock import patch + +from google.adk.agents.llm_agent import Agent +from google.adk.code_executors.base_code_executor import BaseCodeExecutor +from google.adk.code_executors.built_in_code_executor import BuiltInCodeExecutor +from google.adk.code_executors.code_execution_utils import CodeExecutionResult +from google.adk.flows.llm_flows._code_execution import response_processor +from google.adk.models.llm_response import LlmResponse +from google.genai import types +import pytest + +from ... import testing_utils + + +@pytest.mark.asyncio +@patch('google.adk.flows.llm_flows._code_execution.datetime') +async def test_builtin_code_executor_image_artifact_creation(mock_datetime): + """Test BuiltInCodeExecutor creates artifacts for images in response.""" + mock_now = datetime.datetime(2025, 1, 1, 12, 0, 0) + mock_datetime.datetime.now.return_value.astimezone.return_value = mock_now + code_executor = BuiltInCodeExecutor() + agent = Agent(name='test_agent', code_executor=code_executor) + invocation_context = await testing_utils.create_invocation_context( + agent=agent, user_content='test message' + ) + invocation_context.artifact_service = MagicMock() + invocation_context.artifact_service.save_artifact = AsyncMock( + return_value='v1' + ) + llm_response = LlmResponse( + content=types.Content( + parts=[ + types.Part( + inline_data=types.Blob( + mime_type='image/png', + data=b'image1', + display_name='image_1.png', + ) + ), + types.Part(text='this is text'), + types.Part( + inline_data=types.Blob(mime_type='image/jpeg', data=b'image2') + ), + ] + ) + ) + + events = [] + async for event in response_processor.run_async( + invocation_context, llm_response + ): + events.append(event) + + expected_timestamp = mock_now.strftime('%Y%m%d_%H%M%S') + expected_filename2 = f'{expected_timestamp}.jpeg' + + assert invocation_context.artifact_service.save_artifact.call_count == 2 + invocation_context.artifact_service.save_artifact.assert_any_call( + app_name=invocation_context.app_name, + user_id=invocation_context.user_id, + session_id=invocation_context.session.id, + filename='image_1.png', + artifact=types.Part.from_bytes(data=b'image1', mime_type='image/png'), + ) + invocation_context.artifact_service.save_artifact.assert_any_call( + app_name=invocation_context.app_name, + user_id=invocation_context.user_id, + session_id=invocation_context.session.id, + filename=expected_filename2, + artifact=types.Part.from_bytes(data=b'image2', mime_type='image/jpeg'), + ) + + assert len(events) == 1 + assert events[0].actions.artifact_delta == { + 'image_1.png': 'v1', + expected_filename2: 'v1', + } + assert not events[0].content + assert llm_response.content is not None + assert len(llm_response.content.parts) == 3 + assert ( + llm_response.content.parts[0].text == 'Saved as artifact: image_1.png. ' + ) + assert not llm_response.content.parts[0].inline_data + assert llm_response.content.parts[1].text == 'this is text' + assert ( + llm_response.content.parts[2].text + == f'Saved as artifact: {expected_filename2}. ' + ) + assert not llm_response.content.parts[2].inline_data + + +@pytest.mark.asyncio +@patch('google.adk.flows.llm_flows._code_execution.logger') +async def test_logs_executed_code(mock_logger): + """Test that the response processor logs the code it executes.""" + mock_code_executor = MagicMock(spec=BaseCodeExecutor) + mock_code_executor.code_block_delimiters = [('```python\n', '\n```')] + mock_code_executor.error_retry_attempts = 2 + mock_code_executor.stateful = False + mock_code_executor.execute_code.return_value = CodeExecutionResult( + stdout='hello' + ) + + agent = Agent(name='test_agent', code_executor=mock_code_executor) + invocation_context = await testing_utils.create_invocation_context( + agent=agent, user_content='test message' + ) + invocation_context.artifact_service = MagicMock() + invocation_context.artifact_service.save_artifact = AsyncMock() + + llm_response = LlmResponse( + content=types.Content( + parts=[ + types.Part(text='Here is some code:'), + types.Part(text='```python\nprint("hello")\n```'), + ] + ) + ) + + _ = [ + event + async for event in response_processor.run_async( + invocation_context, llm_response + ) + ] + + mock_code_executor.execute_code.assert_called_once() + mock_logger.debug.assert_called_once_with( + 'Executed code:\n```\n%s\n```', 'print("hello")' + ) diff --git a/tests/unittests/flows/llm_flows/test_contents.py b/tests/unittests/flows/llm_flows/test_contents.py index 7283a0ce7f..9e77407b27 100644 --- a/tests/unittests/flows/llm_flows/test_contents.py +++ b/tests/unittests/flows/llm_flows/test_contents.py @@ -324,6 +324,63 @@ async def test_confirmation_events_are_filtered(): ] +@pytest.mark.asyncio +async def test_rewind_events_are_filtered_out(): + """Test that events are filtered based on rewind action.""" + agent = Agent(model="gemini-2.5-flash", name="test_agent") + llm_request = LlmRequest(model="gemini-2.5-flash") + invocation_context = await testing_utils.create_invocation_context( + agent=agent + ) + + events = [ + Event( + invocation_id="inv1", + author="user", + content=types.UserContent("First message"), + ), + Event( + invocation_id="inv1", + author="test_agent", + content=types.ModelContent("First response"), + ), + Event( + invocation_id="inv2", + author="user", + content=types.UserContent("Second message"), + ), + Event( + invocation_id="inv2", + author="test_agent", + content=types.ModelContent("Second response"), + ), + Event( + invocation_id="rewind_inv", + author="test_agent", + actions=EventActions(rewind_before_invocation_id="inv2"), + ), + Event( + invocation_id="inv3", + author="user", + content=types.UserContent("Third message"), + ), + ] + invocation_context.session.events = events + + # Process the request + async for _ in contents.request_processor.run_async( + invocation_context, llm_request + ): + pass + + # Verify rewind correctly filters conversation history + assert llm_request.contents == [ + types.UserContent("First message"), + types.ModelContent("First response"), + types.UserContent("Third message"), + ] + + @pytest.mark.asyncio async def test_events_with_empty_content_are_skipped(): """Test that events with empty content (state-only changes) are skipped.""" diff --git a/tests/unittests/flows/llm_flows/test_contents_branch.py b/tests/unittests/flows/llm_flows/test_contents_branch.py index 736909fb39..2347354127 100644 --- a/tests/unittests/flows/llm_flows/test_contents_branch.py +++ b/tests/unittests/flows/llm_flows/test_contents_branch.py @@ -58,6 +58,18 @@ async def test_branch_filtering_child_sees_parent(): content=types.ModelContent("Child agent response"), branch="parent_agent.child_agent", # Current branch - should be included ), + Event( + invocation_id="inv4", + author="child_agent", + content=types.ModelContent("Excluded response 1"), + branch="parent_agent.child_agent000", # Prefix match BUT not itself/ancestor - should be excluded + ), + Event( + invocation_id="inv5", + author="child_agent", + content=types.ModelContent("Excluded response 2"), + branch="parent_agent.child", # Prefix match BUT not itself/ancestor - should be excluded + ), ] invocation_context.session.events = events diff --git a/tests/unittests/flows/llm_flows/test_context_cache_processor.py b/tests/unittests/flows/llm_flows/test_context_cache_processor.py new file mode 100644 index 0000000000..13602a6d48 --- /dev/null +++ b/tests/unittests/flows/llm_flows/test_context_cache_processor.py @@ -0,0 +1,646 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for ContextCacheRequestProcessor.""" + +import time +from unittest.mock import MagicMock + +from google.adk.agents.context_cache_config import ContextCacheConfig +from google.adk.agents.invocation_context import InvocationContext +from google.adk.agents.llm_agent import LlmAgent +from google.adk.events.event import Event +from google.adk.flows.llm_flows.context_cache_processor import ContextCacheRequestProcessor +from google.adk.models.cache_metadata import CacheMetadata +from google.adk.models.llm_request import LlmRequest +from google.adk.sessions.base_session_service import BaseSessionService +from google.adk.sessions.session import Session +from google.genai import types +import pytest + + +class TestContextCacheRequestProcessor: + """Test suite for ContextCacheRequestProcessor.""" + + def setup_method(self): + """Set up test fixtures.""" + self.processor = ContextCacheRequestProcessor() + self.cache_config = ContextCacheConfig( + cache_intervals=10, ttl_seconds=1800, min_tokens=1024 + ) + + def create_invocation_context( + self, + agent, + context_cache_config=None, + session_events=None, + invocation_id="test_invocation", + ): + """Helper to create InvocationContext.""" + mock_session = Session( + id="test_session", + app_name="test_app", + user_id="test_user", + events=session_events or [], + ) + + mock_session_service = MagicMock(spec=BaseSessionService) + + return InvocationContext( + agent=agent, + session=mock_session, + session_service=mock_session_service, + context_cache_config=context_cache_config, + invocation_id=invocation_id, + ) + + def create_cache_metadata( + self, invocations_used=1, cache_name="test-cache", contents_count=3 + ): + """Helper to create CacheMetadata.""" + return CacheMetadata( + cache_name=( + f"projects/test/locations/us-central1/cachedContents/{cache_name}" + ), + expire_time=time.time() + 1800, + fingerprint="test_fingerprint", + invocations_used=invocations_used, + contents_count=contents_count, + created_at=time.time() - 600, + ) + + async def test_no_cache_config(self): + """Test processor with no cache config.""" + agent = LlmAgent(name="test_agent") + invocation_context = self.create_invocation_context( + agent, context_cache_config=None + ) + + llm_request = LlmRequest( + model="gemini-2.0-flash", + contents=[ + types.Content( + role="user", + parts=[types.Part(text="Hello")], + ) + ], + ) + + # Process should complete without adding cache config + events = [] + async for event in self.processor.run_async( + invocation_context, llm_request + ): + events.append(event) + + assert len(events) == 0 # No events yielded + assert llm_request.cache_config is None + + async def test_with_cache_config_no_session_events(self): + """Test processor with cache config but no session events.""" + agent = LlmAgent(name="test_agent") + invocation_context = self.create_invocation_context( + agent, context_cache_config=self.cache_config + ) + + llm_request = LlmRequest( + model="gemini-2.0-flash", + contents=[ + types.Content( + role="user", + parts=[types.Part(text="Hello")], + ) + ], + ) + + # Process should add cache config but no metadata + events = [] + async for event in self.processor.run_async( + invocation_context, llm_request + ): + events.append(event) + + assert len(events) == 0 # No events yielded + assert llm_request.cache_config == self.cache_config + assert llm_request.cache_metadata is None + + async def test_with_cache_metadata_same_invocation(self): + """Test processor finds cache metadata from same invocation.""" + agent = LlmAgent(name="test_agent") + cache_metadata = self.create_cache_metadata(invocations_used=5) + + # Event with same invocation ID + events = [ + Event( + author="test_agent", + cache_metadata=cache_metadata, + invocation_id="test_invocation", + ) + ] + + invocation_context = self.create_invocation_context( + agent, + context_cache_config=self.cache_config, + session_events=events, + invocation_id="test_invocation", + ) + + llm_request = LlmRequest( + model="gemini-2.0-flash", + contents=[ + types.Content( + role="user", + parts=[types.Part(text="Hello")], + ) + ], + ) + + # Process should add cache config and metadata (same invocation, no increment) + async for event in self.processor.run_async( + invocation_context, llm_request + ): + pass + + assert llm_request.cache_config == self.cache_config + assert llm_request.cache_metadata == cache_metadata + assert llm_request.cache_metadata.invocations_used == 5 # No increment + + async def test_with_cache_metadata_different_invocation(self): + """Test processor finds cache metadata from different invocation.""" + agent = LlmAgent(name="test_agent") + cache_metadata = self.create_cache_metadata(invocations_used=5) + + # Event with different invocation ID + events = [ + Event( + author="test_agent", + cache_metadata=cache_metadata, + invocation_id="previous_invocation", + ) + ] + + invocation_context = self.create_invocation_context( + agent, + context_cache_config=self.cache_config, + session_events=events, + invocation_id="current_invocation", + ) + + llm_request = LlmRequest( + model="gemini-2.0-flash", + contents=[ + types.Content( + role="user", + parts=[types.Part(text="Hello")], + ) + ], + ) + + # Process should add cache config and increment invocations_used + async for event in self.processor.run_async( + invocation_context, llm_request + ): + pass + + assert llm_request.cache_config == self.cache_config + assert llm_request.cache_metadata is not None + assert llm_request.cache_metadata.invocations_used == 6 # Incremented + + async def test_cache_metadata_agent_filtering(self): + """Test that cache metadata is filtered by agent name.""" + agent = LlmAgent(name="target_agent") + target_cache = self.create_cache_metadata( + invocations_used=3, cache_name="target" + ) + other_cache = self.create_cache_metadata( + invocations_used=7, cache_name="other" + ) + + events = [ + Event( + author="other_agent", + cache_metadata=other_cache, + invocation_id="other_invocation", + ), + Event( + author="target_agent", + cache_metadata=target_cache, + invocation_id="target_invocation", + ), + ] + + invocation_context = self.create_invocation_context( + agent, + context_cache_config=self.cache_config, + session_events=events, + invocation_id="current_invocation", + ) + + llm_request = LlmRequest( + model="gemini-2.0-flash", + contents=[ + types.Content( + role="user", + parts=[types.Part(text="Hello")], + ) + ], + ) + + # Should only use target_agent's cache metadata + async for event in self.processor.run_async( + invocation_context, llm_request + ): + pass + + assert llm_request.cache_metadata is not None + assert llm_request.cache_metadata.cache_name == target_cache.cache_name + assert llm_request.cache_metadata.invocations_used == 4 # target_cache + 1 + + async def test_latest_cache_metadata_selected(self): + """Test that the latest cache metadata is selected.""" + agent = LlmAgent(name="test_agent") + older_cache = self.create_cache_metadata( + invocations_used=2, cache_name="older" + ) + newer_cache = self.create_cache_metadata( + invocations_used=5, cache_name="newer" + ) + + # Events in chronological order (older first) + events = [ + Event( + author="test_agent", + cache_metadata=older_cache, + invocation_id="older_invocation", + ), + Event( + author="test_agent", + cache_metadata=newer_cache, + invocation_id="newer_invocation", + ), + ] + + invocation_context = self.create_invocation_context( + agent, + context_cache_config=self.cache_config, + session_events=events, + invocation_id="current_invocation", + ) + + llm_request = LlmRequest( + model="gemini-2.0-flash", + contents=[ + types.Content( + role="user", + parts=[types.Part(text="Hello")], + ) + ], + ) + + # Should use the newer (latest) cache metadata + async for event in self.processor.run_async( + invocation_context, llm_request + ): + pass + + assert llm_request.cache_metadata is not None + assert llm_request.cache_metadata.cache_name == newer_cache.cache_name + assert llm_request.cache_metadata.invocations_used == 6 # newer_cache + 1 + + async def test_no_cache_metadata_events(self): + """Test when session has events but no cache metadata.""" + agent = LlmAgent(name="test_agent") + + events = [ + Event(author="test_agent", cache_metadata=None), + Event(author="other_agent", cache_metadata=None), + ] + + invocation_context = self.create_invocation_context( + agent, + context_cache_config=self.cache_config, + session_events=events, + ) + + llm_request = LlmRequest( + model="gemini-2.0-flash", + contents=[ + types.Content( + role="user", + parts=[types.Part(text="Hello")], + ) + ], + ) + + # Should add cache config but no metadata + async for event in self.processor.run_async( + invocation_context, llm_request + ): + pass + + assert llm_request.cache_config == self.cache_config + assert llm_request.cache_metadata is None + + async def test_empty_session(self): + """Test with empty session.""" + agent = LlmAgent(name="test_agent") + + invocation_context = self.create_invocation_context( + agent, + context_cache_config=self.cache_config, + session_events=[], + ) + + llm_request = LlmRequest( + model="gemini-2.0-flash", + contents=[ + types.Content( + role="user", + parts=[types.Part(text="Hello")], + ) + ], + ) + + # Should add cache config but no metadata + async for event in self.processor.run_async( + invocation_context, llm_request + ): + pass + + assert llm_request.cache_config == self.cache_config + assert llm_request.cache_metadata is None + + async def test_processor_yields_no_events(self): + """Test that processor yields no events.""" + agent = LlmAgent(name="test_agent") + + invocation_context = self.create_invocation_context( + agent, context_cache_config=self.cache_config + ) + + llm_request = LlmRequest( + model="gemini-2.0-flash", + contents=[ + types.Content( + role="user", + parts=[types.Part(text="Hello")], + ) + ], + ) + + events = [] + async for event in self.processor.run_async( + invocation_context, llm_request + ): + events.append(event) + + # Processor should never yield events + assert len(events) == 0 + + async def test_mixed_events_scenario(self): + """Test complex scenario with mixed events.""" + agent = LlmAgent(name="test_agent") + cache_metadata = self.create_cache_metadata(invocations_used=10) + + events = [ + Event(author="other_agent", cache_metadata=None), + Event(author="test_agent", cache_metadata=None), # No cache metadata + Event( + author="different_agent", cache_metadata=cache_metadata + ), # Wrong agent + Event( + author="test_agent", + cache_metadata=cache_metadata, + invocation_id="prev", + ), + ] + + invocation_context = self.create_invocation_context( + agent, + context_cache_config=self.cache_config, + session_events=events, + invocation_id="current", + ) + + llm_request = LlmRequest( + model="gemini-2.0-flash", + contents=[ + types.Content( + role="user", + parts=[types.Part(text="Hello")], + ) + ], + ) + + async for event in self.processor.run_async( + invocation_context, llm_request + ): + pass + + # Should find the test_agent's cache metadata and increment it + assert llm_request.cache_config == self.cache_config + assert llm_request.cache_metadata is not None + assert llm_request.cache_metadata.invocations_used == 11 # 10 + 1 + + async def test_cacheable_contents_token_count_extraction(self): + """Test that previous prompt token count is extracted and set.""" + agent = LlmAgent(name="test_agent") + + # Create event with usage metadata + event_with_tokens = Event( + author="test_agent", + usage_metadata=types.UsageMetadata( + prompt_token_count=1024, + response_token_count=256, + total_token_count=1280, + ), + ) + + events = [event_with_tokens] + + invocation_context = self.create_invocation_context( + agent, + context_cache_config=self.cache_config, + session_events=events, + ) + + llm_request = LlmRequest( + model="gemini-2.0-flash", + contents=[ + types.Content( + role="user", + parts=[types.Part(text="Hello")], + ) + ], + ) + + async for event in self.processor.run_async( + invocation_context, llm_request + ): + pass + + # Should extract token count from the event + assert llm_request.cacheable_contents_token_count == 1024 + + async def test_cacheable_contents_token_count_no_usage_metadata(self): + """Test when no usage metadata is available.""" + agent = LlmAgent(name="test_agent") + + events = [ + Event(author="test_agent", usage_metadata=None), + Event(author="other_agent"), + ] + + invocation_context = self.create_invocation_context( + agent, + context_cache_config=self.cache_config, + session_events=events, + ) + + llm_request = LlmRequest( + model="gemini-2.0-flash", + contents=[ + types.Content( + role="user", + parts=[types.Part(text="Hello")], + ) + ], + ) + + async for event in self.processor.run_async( + invocation_context, llm_request + ): + pass + + # Should not set token count when no usage metadata + assert llm_request.cacheable_contents_token_count is None + + async def test_cacheable_contents_token_count_agent_filtering(self): + """Test that token count is filtered by agent name.""" + agent = LlmAgent(name="target_agent") + + events = [ + Event( + author="other_agent", + usage_metadata=types.UsageMetadata(prompt_token_count=2048), + ), + Event( + author="target_agent", + usage_metadata=types.UsageMetadata(prompt_token_count=1024), + ), + ] + + invocation_context = self.create_invocation_context( + agent, + context_cache_config=self.cache_config, + session_events=events, + ) + + llm_request = LlmRequest( + model="gemini-2.0-flash", + contents=[ + types.Content( + role="user", + parts=[types.Part(text="Hello")], + ) + ], + ) + + async for event in self.processor.run_async( + invocation_context, llm_request + ): + pass + + # Should use target_agent's token count, not other_agent's + assert llm_request.cacheable_contents_token_count == 1024 + + async def test_cacheable_contents_token_count_latest_selected(self): + """Test that the most recent token count is selected.""" + agent = LlmAgent(name="test_agent") + + events = [ + Event( + author="test_agent", + usage_metadata=types.UsageMetadata(prompt_token_count=512), + ), + Event( + author="test_agent", + usage_metadata=types.UsageMetadata(prompt_token_count=1024), + ), + ] + + invocation_context = self.create_invocation_context( + agent, + context_cache_config=self.cache_config, + session_events=events, + ) + + llm_request = LlmRequest( + model="gemini-2.0-flash", + contents=[ + types.Content( + role="user", + parts=[types.Part(text="Hello")], + ) + ], + ) + + async for event in self.processor.run_async( + invocation_context, llm_request + ): + pass + + # Should use the latest (most recent) token count + assert llm_request.cacheable_contents_token_count == 1024 + + async def test_cache_metadata_and_token_count_both_found(self): + """Test that both cache metadata and token count are found in single pass.""" + agent = LlmAgent(name="test_agent") + cache_metadata = self.create_cache_metadata(invocations_used=5) + + events = [ + Event( + author="test_agent", + cache_metadata=cache_metadata, + usage_metadata=types.UsageMetadata(prompt_token_count=1024), + invocation_id="previous_invocation", + ), + ] + + invocation_context = self.create_invocation_context( + agent, + context_cache_config=self.cache_config, + session_events=events, + invocation_id="current_invocation", + ) + + llm_request = LlmRequest( + model="gemini-2.0-flash", + contents=[ + types.Content( + role="user", + parts=[types.Part(text="Hello")], + ) + ], + ) + + async for event in self.processor.run_async( + invocation_context, llm_request + ): + pass + + # Should find both cache metadata and token count + assert llm_request.cache_metadata is not None + assert llm_request.cache_metadata.invocations_used == 6 # 5 + 1 + assert llm_request.cacheable_contents_token_count == 1024 diff --git a/tests/unittests/flows/llm_flows/test_functions_error_messages.py b/tests/unittests/flows/llm_flows/test_functions_error_messages.py new file mode 100644 index 0000000000..44b563b6c7 --- /dev/null +++ b/tests/unittests/flows/llm_flows/test_functions_error_messages.py @@ -0,0 +1,88 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for enhanced error messages in function tool handling.""" +from google.adk.flows.llm_flows.functions import _get_tool +from google.adk.tools import BaseTool +from google.genai import types +import pytest + + +# Mock tool for testing error messages +class MockTool(BaseTool): + """Mock tool for testing error messages.""" + + def __init__(self, name: str = 'mock_tool'): + super().__init__(name=name, description=f'Mock tool: {name}') + + def call(self, *args, **kwargs): + return 'mock_response' + + +def test_tool_not_found_enhanced_error(): + """Verify enhanced error message for tool not found.""" + function_call = types.FunctionCall(name='nonexistent_tool', args={}) + tools_dict = { + 'get_weather': MockTool(name='get_weather'), + 'calculate_sum': MockTool(name='calculate_sum'), + 'search_database': MockTool(name='search_database'), + } + + with pytest.raises(ValueError) as exc_info: + _get_tool(function_call, tools_dict) + + error_msg = str(exc_info.value) + + # Verify error message components + assert 'nonexistent_tool' in error_msg + assert 'Available tools:' in error_msg + assert 'get_weather' in error_msg + assert 'Possible causes:' in error_msg + assert 'Suggested fixes:' in error_msg + + +def test_tool_not_found_with_different_name(): + """Verify error message contains basic information.""" + function_call = types.FunctionCall(name='completely_different', args={}) + tools_dict = { + 'get_weather': MockTool(name='get_weather'), + 'calculate_sum': MockTool(name='calculate_sum'), + } + + with pytest.raises(ValueError) as exc_info: + _get_tool(function_call, tools_dict) + + error_msg = str(exc_info.value) + + # Verify error message contains basic information + assert 'completely_different' in error_msg + assert 'Available tools:' in error_msg + + +def test_tool_not_found_shows_all_tools(): + """Verify error message shows all tools (no truncation).""" + function_call = types.FunctionCall(name='nonexistent', args={}) + + # Create 100 tools + tools_dict = {f'tool_{i}': MockTool(name=f'tool_{i}') for i in range(100)} + + with pytest.raises(ValueError) as exc_info: + _get_tool(function_call, tools_dict) + + error_msg = str(exc_info.value) + + # Verify all tools are shown (no truncation) + assert 'tool_0' in error_msg # First tool shown + assert 'tool_99' in error_msg # Last tool also shown + assert 'showing first 20 of' not in error_msg # No truncation message diff --git a/tests/unittests/flows/llm_flows/test_functions_sequential.py b/tests/unittests/flows/llm_flows/test_functions_sequential.py index a88d90f3d1..5ae073c615 100644 --- a/tests/unittests/flows/llm_flows/test_functions_sequential.py +++ b/tests/unittests/flows/llm_flows/test_functions_sequential.py @@ -64,13 +64,13 @@ def increase_by_one(x: int) -> int: assert testing_utils.simplify_contents(mockModel.requests[0].contents) == [ ('user', 'test') ] - # 3 items: user content, functaion call / response for the 1st call + # 3 items: user content, function call / response for the 1st call assert testing_utils.simplify_contents(mockModel.requests[1].contents) == [ ('user', 'test'), ('model', function_call({'x': 1})), ('user', function_response({'result': 2})), ] - # 5 items: user content, functaion call / response for two calls + # 5 items: user content, function call / response for two calls assert testing_utils.simplify_contents(mockModel.requests[2].contents) == [ ('user', 'test'), ('model', function_call({'x': 1})), @@ -78,7 +78,7 @@ def increase_by_one(x: int) -> int: ('model', function_call({'x': 2})), ('user', function_response({'result': 3})), ] - # 7 items: user content, functaion call / response for three calls + # 7 items: user content, function call / response for three calls assert testing_utils.simplify_contents(mockModel.requests[3].contents) == [ ('user', 'test'), ('model', function_call({'x': 1})), diff --git a/tests/unittests/flows/llm_flows/test_functions_simple.py b/tests/unittests/flows/llm_flows/test_functions_simple.py index b8599486b1..9fa1151387 100644 --- a/tests/unittests/flows/llm_flows/test_functions_simple.py +++ b/tests/unittests/flows/llm_flows/test_functions_simple.py @@ -32,7 +32,7 @@ def test_simple_function(): function_call_1 = types.Part.from_function_call( name='increase_by_one', args={'x': 1} ) - function_respones_2 = types.Part.from_function_response( + function_responses_2 = types.Part.from_function_response( name='increase_by_one', response={'result': 2} ) responses: list[types.Content] = [ @@ -54,7 +54,7 @@ def increase_by_one(x: int) -> int: runner = testing_utils.InMemoryRunner(agent) assert testing_utils.simplify_events(runner.run('test')) == [ ('root_agent', function_call_1), - ('root_agent', function_respones_2), + ('root_agent', function_responses_2), ('root_agent', 'response1'), ] @@ -65,7 +65,7 @@ def increase_by_one(x: int) -> int: assert testing_utils.simplify_contents(mock_model.requests[1].contents) == [ ('user', 'test'), ('model', function_call_1), - ('user', function_respones_2), + ('user', function_responses_2), ] # Asserts the function calls. diff --git a/tests/unittests/flows/llm_flows/test_identity.py b/tests/unittests/flows/llm_flows/test_identity.py index cb0239b752..62557613bb 100644 --- a/tests/unittests/flows/llm_flows/test_identity.py +++ b/tests/unittests/flows/llm_flows/test_identity.py @@ -64,7 +64,8 @@ async def test_with_description(): ): pass - assert request.config.system_instruction == "\n\n".join([ - 'You are an agent. Your internal name is "agent".', - ' The description about you is "test description"', - ]) + assert ( + request.config.system_instruction + == """\ +You are an agent. Your internal name is "agent". The description about you is "test description".""" + ) diff --git a/tests/unittests/flows/llm_flows/test_instructions.py b/tests/unittests/flows/llm_flows/test_instructions.py index cf5be5dca3..dc6fe17638 100644 --- a/tests/unittests/flows/llm_flows/test_instructions.py +++ b/tests/unittests/flows/llm_flows/test_instructions.py @@ -12,10 +12,20 @@ # See the License for the specific language governing permissions and # limitations under the License. +from typing import Any +from typing import Optional + +from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.llm_agent import Agent +from google.adk.agents.llm_agent import LlmAgent from google.adk.agents.readonly_context import ReadonlyContext +from google.adk.agents.run_config import RunConfig from google.adk.flows.llm_flows import instructions +from google.adk.flows.llm_flows.contents import _add_instructions_to_user_content +from google.adk.flows.llm_flows.contents import request_processor as contents_processor +from google.adk.flows.llm_flows.instructions import request_processor from google.adk.models.llm_request import LlmRequest +from google.adk.sessions.in_memory_session_service import InMemorySessionService from google.adk.sessions.session import Session from google.genai import types import pytest @@ -23,6 +33,24 @@ from ... import testing_utils +async def _create_invocation_context( + agent: LlmAgent, state: Optional[dict[str, Any]] = None +) -> InvocationContext: + """Helper to create InvocationContext with session.""" + session_service = InMemorySessionService() + session = await session_service.create_session( + app_name="test_app", user_id="test_user", state=state + ) + return InvocationContext( + invocation_id="test_invocation_id", + agent=agent, + session=session, + session_service=session_service, + run_config=RunConfig(), + branch="main", + ) + + @pytest.mark.asyncio async def test_build_system_instruction(): request = LlmRequest( @@ -308,3 +336,861 @@ async def test_build_system_instruction_with_namespace(): assert request.config.system_instruction == ( """Use the echo_info tool to echo 1234567890, app_value, user_value, {a:key}.""" ) + + +@pytest.mark.asyncio +async def test_instruction_processor_respects_bypass_state_injection(): + """Test that instruction processor respects bypass_state_injection flag.""" + + # Test callable instruction (bypass_state_injection=True) + def _instruction_provider(ctx: ReadonlyContext) -> str: + # Already includes state, should bypass further state injection + return f'instruction with state: {ctx.state["test_var"]}' + + agent = Agent( + model="gemini-1.5-flash", + name="test_agent", + instruction=_instruction_provider, + ) + + request = LlmRequest( + model="gemini-1.5-flash", + config=types.GenerateContentConfig(system_instruction=""), + ) + + invocation_context = await testing_utils.create_invocation_context( + agent=agent + ) + invocation_context.session = Session( + app_name="test_app", + user_id="test_user", + id="test_id", + state={"test_var": "test_value"}, + ) + + # Verify canonical_instruction returns bypass_state_injection=True + raw_si, bypass_flag = await agent.canonical_instruction( + ReadonlyContext(invocation_context) + ) + assert bypass_flag == True + assert raw_si == "instruction with state: test_value" + + # Run the instruction processor + async for _ in instructions.request_processor.run_async( + invocation_context, request + ): + pass + + # System instruction should be exactly what the provider returned + # (no additional state injection should occur) + assert ( + request.config.system_instruction == "instruction with state: test_value" + ) + + +@pytest.mark.asyncio +async def test_string_instruction_respects_bypass_state_injection(): + """Test that string instructions get state injection (bypass_state_injection=False).""" + + agent = Agent( + model="gemini-1.5-flash", + name="test_agent", + instruction="Base instruction with {test_var}", # String instruction + ) + + request = LlmRequest( + model="gemini-1.5-flash", + config=types.GenerateContentConfig(system_instruction=""), + ) + + invocation_context = await testing_utils.create_invocation_context( + agent=agent + ) + invocation_context.session = Session( + app_name="test_app", + user_id="test_user", + id="test_id", + state={"test_var": "test_value"}, + ) + + # Verify canonical_instruction returns bypass_state_injection=False + raw_si, bypass_flag = await agent.canonical_instruction( + ReadonlyContext(invocation_context) + ) + assert bypass_flag == False + assert raw_si == "Base instruction with {test_var}" + + # Run the instruction processor + async for _ in instructions.request_processor.run_async( + invocation_context, request + ): + pass + + # System instruction should have state injected + assert request.config.system_instruction == "Base instruction with test_value" + + +@pytest.mark.asyncio +async def test_global_instruction_processor_respects_bypass_state_injection(): + """Test that global instruction processor respects bypass_state_injection flag.""" + + # Test callable global instruction (bypass_state_injection=True) + def _global_instruction_provider(ctx: ReadonlyContext) -> str: + # Already includes state, should bypass further state injection + return f'global instruction with state: {ctx.state["test_var"]}' + + sub_agent = Agent( + model="gemini-1.5-flash", + name="sub_agent", + instruction="Sub agent instruction", + ) + root_agent = Agent( + model="gemini-1.5-flash", + name="root_agent", + global_instruction=_global_instruction_provider, + sub_agents=[sub_agent], + ) + + request = LlmRequest( + model="gemini-1.5-flash", + config=types.GenerateContentConfig(system_instruction=""), + ) + + invocation_context = await testing_utils.create_invocation_context( + agent=sub_agent + ) + invocation_context.session = Session( + app_name="test_app", + user_id="test_user", + id="test_id", + state={"test_var": "test_value"}, + ) + + # Verify canonical_global_instruction returns bypass_state_injection=True + raw_gi, bypass_flag = await root_agent.canonical_global_instruction( + ReadonlyContext(invocation_context) + ) + assert bypass_flag == True + assert raw_gi == "global instruction with state: test_value" + + # Run the instruction processor + async for _ in instructions.request_processor.run_async( + invocation_context, request + ): + pass + + # System instruction should be exactly what the provider returned plus sub instruction + # (no additional state injection should occur on global instruction) + assert ( + request.config.system_instruction + == "global instruction with state: test_value\n\nSub agent instruction" + ) + + +@pytest.mark.asyncio +async def test_string_global_instruction_respects_bypass_state_injection(): + """Test that string global instructions get state injection (bypass_state_injection=False).""" + + sub_agent = Agent( + model="gemini-1.5-flash", + name="sub_agent", + instruction="Sub agent instruction", + ) + root_agent = Agent( + model="gemini-1.5-flash", + name="root_agent", + global_instruction="Global instruction with {test_var}", # String instruction + sub_agents=[sub_agent], + ) + + request = LlmRequest( + model="gemini-1.5-flash", + config=types.GenerateContentConfig(system_instruction=""), + ) + + invocation_context = await testing_utils.create_invocation_context( + agent=sub_agent + ) + invocation_context.session = Session( + app_name="test_app", + user_id="test_user", + id="test_id", + state={"test_var": "test_value"}, + ) + + # Verify canonical_global_instruction returns bypass_state_injection=False + raw_gi, bypass_flag = await root_agent.canonical_global_instruction( + ReadonlyContext(invocation_context) + ) + assert bypass_flag == False + assert raw_gi == "Global instruction with {test_var}" + + # Run the instruction processor + async for _ in instructions.request_processor.run_async( + invocation_context, request + ): + pass + + # System instruction should have state injected on global instruction + assert ( + request.config.system_instruction + == "Global instruction with test_value\n\nSub agent instruction" + ) + + +# Static Instruction Tests (moved from test_static_instructions.py) + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +def test_static_instruction_field_exists(llm_backend): + """Test that static_instruction field exists and works with types.Content.""" + static_content = types.Content( + role="user", parts=[types.Part(text="This is a static instruction")] + ) + agent = LlmAgent(name="test_agent", static_instruction=static_content) + assert agent.static_instruction == static_content + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +def test_static_instruction_supports_string(llm_backend): + """Test that static_instruction field supports simple strings.""" + static_str = "This is a static instruction as a string" + agent = LlmAgent(name="test_agent", static_instruction=static_str) + assert agent.static_instruction == static_str + assert isinstance(agent.static_instruction, str) + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +def test_static_instruction_supports_part(llm_backend): + """Test that static_instruction field supports types.Part.""" + static_part = types.Part(text="This is a static instruction as Part") + agent = LlmAgent(name="test_agent", static_instruction=static_part) + assert agent.static_instruction == static_part + assert isinstance(agent.static_instruction, types.Part) + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +def test_static_instruction_supports_file(llm_backend): + """Test that static_instruction field supports types.File.""" + static_file = types.File(uri="gs://bucket/file.txt", mime_type="text/plain") + agent = LlmAgent(name="test_agent", static_instruction=static_file) + assert agent.static_instruction == static_file + assert isinstance(agent.static_instruction, types.File) + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +def test_static_instruction_supports_list_of_parts(llm_backend): + """Test that static_instruction field supports list[PartUnion].""" + static_parts_list = [ + types.Part(text="First part"), + types.Part(text="Second part"), + ] + agent = LlmAgent(name="test_agent", static_instruction=static_parts_list) + assert agent.static_instruction == static_parts_list + assert isinstance(agent.static_instruction, list) + assert len(agent.static_instruction) == 2 + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +def test_static_instruction_supports_list_of_strings(llm_backend): + """Test that static_instruction field supports list of strings.""" + static_strings_list = ["First instruction", "Second instruction"] + agent = LlmAgent(name="test_agent", static_instruction=static_strings_list) + assert agent.static_instruction == static_strings_list + assert isinstance(agent.static_instruction, list) + assert all(isinstance(s, str) for s in agent.static_instruction) + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +def test_static_instruction_supports_multiple_parts(llm_backend): + """Test that static_instruction supports multiple parts including files.""" + static_content = types.Content( + role="user", + parts=[ + types.Part(text="Here is the document:"), + types.Part( + inline_data=types.Blob( + data=b"fake_file_content", mime_type="text/plain" + ) + ), + types.Part(text="Please analyze this document."), + ], + ) + agent = LlmAgent(name="test_agent", static_instruction=static_content) + assert agent.static_instruction == static_content + assert len(agent.static_instruction.parts) == 3 + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +def test_static_instruction_outputs_placeholders_literally(llm_backend): + """Test that static instructions output placeholders literally without processing.""" + static_content = types.Content( + role="user", + parts=[ + types.Part(text="Hello {name}, you have {count} messages"), + ], + ) + agent = LlmAgent(name="test_agent", static_instruction=static_content) + assert "{name}" in agent.static_instruction.parts[0].text + assert "{count}" in agent.static_instruction.parts[0].text + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +@pytest.mark.asyncio +async def test_static_instruction_added_to_contents(llm_backend): + """Test that static instructions are added to llm_request.config.system_instruction.""" + static_content = types.Content( + role="user", parts=[types.Part(text="Static instruction content")] + ) + agent = LlmAgent(name="test_agent", static_instruction=static_content) + + invocation_context = await _create_invocation_context(agent) + + llm_request = LlmRequest() + + # Run the instruction processor + async for _ in request_processor.run_async(invocation_context, llm_request): + pass + + # Static instruction should be added to system instructions, not contents + assert len(llm_request.contents) == 0 + assert llm_request.config.system_instruction == "Static instruction content" + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +@pytest.mark.asyncio +async def test_static_instruction_string_added_to_system(llm_backend): + """Test that string static instructions are added to system_instruction.""" + agent = LlmAgent( + name="test_agent", static_instruction="Static instruction as string" + ) + + invocation_context = await _create_invocation_context(agent) + + llm_request = LlmRequest() + + # Run the instruction processor + async for _ in request_processor.run_async(invocation_context, llm_request): + pass + + # Static instruction should be added to system instructions, not contents + assert len(llm_request.contents) == 0 + assert llm_request.config.system_instruction == "Static instruction as string" + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +@pytest.mark.asyncio +async def test_static_instruction_part_converted_to_system(llm_backend): + """Test that Part static instructions are converted and added to system_instruction.""" + static_part = types.Part(text="Static instruction from Part") + agent = LlmAgent(name="test_agent", static_instruction=static_part) + + invocation_context = await _create_invocation_context(agent) + llm_request = LlmRequest() + + # Run the instruction processor + async for _ in request_processor.run_async(invocation_context, llm_request): + pass + + # Part should be converted to Content and text extracted to system instruction + assert llm_request.config.system_instruction == "Static instruction from Part" + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +@pytest.mark.asyncio +async def test_static_instruction_list_of_parts_converted_to_system( + llm_backend, +): + """Test that list of Parts is converted and added to system_instruction.""" + static_parts_list = [ + types.Part(text="First part"), + types.Part(text="Second part"), + ] + agent = LlmAgent(name="test_agent", static_instruction=static_parts_list) + + invocation_context = await _create_invocation_context(agent) + llm_request = LlmRequest() + + # Run the instruction processor + async for _ in request_processor.run_async(invocation_context, llm_request): + pass + + # List of parts should be converted to Content with text extracted + assert llm_request.config.system_instruction == "First part\n\nSecond part" + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +@pytest.mark.asyncio +async def test_static_instruction_list_of_strings_converted_to_system( + llm_backend, +): + """Test that list of strings is converted and added to system_instruction.""" + static_strings_list = ["First instruction", "Second instruction"] + agent = LlmAgent(name="test_agent", static_instruction=static_strings_list) + + invocation_context = await _create_invocation_context(agent) + llm_request = LlmRequest() + + # Run the instruction processor + async for _ in request_processor.run_async(invocation_context, llm_request): + pass + + # List of strings should be converted to Content with text extracted + assert ( + llm_request.config.system_instruction + == "First instruction\n\nSecond instruction" + ) + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +@pytest.mark.asyncio +async def test_dynamic_instruction_without_static_goes_to_system(llm_backend): + """Test that dynamic instructions go to system when no static instruction exists.""" + agent = LlmAgent(name="test_agent", instruction="Dynamic instruction content") + + invocation_context = await _create_invocation_context(agent) + + llm_request = LlmRequest() + + # Run the instruction processor + async for _ in request_processor.run_async(invocation_context, llm_request): + pass + + # Dynamic instruction should be added to system instructions + assert llm_request.config.system_instruction == "Dynamic instruction content" + assert len(llm_request.contents) == 0 + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +@pytest.mark.asyncio +async def test_dynamic_instruction_with_static_not_in_system(llm_backend): + """Test that dynamic instructions don't go to system when static instruction exists.""" + static_content = types.Content( + role="user", parts=[types.Part(text="Static instruction content")] + ) + agent = LlmAgent( + name="test_agent", + instruction="Dynamic instruction content", + static_instruction=static_content, + ) + + invocation_context = await _create_invocation_context(agent) + + llm_request = LlmRequest() + + # Run the instruction processor + async for _ in request_processor.run_async(invocation_context, llm_request): + pass + + # Static instruction should be in system instructions + # Dynamic instruction should be added as user content by instruction processor + assert len(llm_request.contents) == 1 + assert llm_request.config.system_instruction == "Static instruction content" + + # Check that dynamic instruction was added as user content + assert llm_request.contents[0].role == "user" + assert len(llm_request.contents[0].parts) == 1 + assert llm_request.contents[0].parts[0].text == "Dynamic instruction content" + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +@pytest.mark.asyncio +async def test_dynamic_instruction_with_string_static_not_in_system( + llm_backend, +): + """Test that dynamic instructions go to user content when string static_instruction exists.""" + agent = LlmAgent( + name="test_agent", + instruction="Dynamic instruction content", + static_instruction="Static instruction as string", + ) + + invocation_context = await _create_invocation_context(agent) + + llm_request = LlmRequest() + + # Run the instruction processor + async for _ in request_processor.run_async(invocation_context, llm_request): + pass + + # Static instruction should be in system instructions + assert llm_request.config.system_instruction == "Static instruction as string" + + # Dynamic instruction should be added as user content + assert len(llm_request.contents) == 1 + assert llm_request.contents[0].role == "user" + assert len(llm_request.contents[0].parts) == 1 + assert llm_request.contents[0].parts[0].text == "Dynamic instruction content" + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +@pytest.mark.asyncio +async def test_dynamic_instructions_added_to_user_content(llm_backend): + """Test that dynamic instructions are added to user content when static exists.""" + static_content = types.Content( + role="user", parts=[types.Part(text="Static instruction")] + ) + agent = LlmAgent( + name="test_agent", + instruction="Dynamic instruction", + static_instruction=static_content, + ) + + invocation_context = await _create_invocation_context(agent) + + llm_request = LlmRequest() + + # Run the instruction processor to add dynamic instruction + async for _ in request_processor.run_async(invocation_context, llm_request): + pass + + # Add some existing user content to simulate conversation history + llm_request.contents.append( + types.Content(role="user", parts=[types.Part(text="Hello world")]) + ) + + # Run the content processor to move instructions to proper position + async for _ in contents_processor.run_async(invocation_context, llm_request): + pass + + # Dynamic instruction should be inserted before the last continuous batch of user content + assert len(llm_request.contents) == 2 + assert llm_request.contents[0].role == "user" + assert len(llm_request.contents[0].parts) == 1 + assert llm_request.contents[0].parts[0].text == "Dynamic instruction" + assert llm_request.contents[1].role == "user" + assert len(llm_request.contents[1].parts) == 1 + assert llm_request.contents[1].parts[0].text == "Hello world" + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +@pytest.mark.asyncio +async def test_dynamic_instructions_create_user_content_when_none_exists( + llm_backend, +): + """Test that dynamic instructions create user content when none exists.""" + static_content = types.Content( + role="user", parts=[types.Part(text="Static instruction")] + ) + agent = LlmAgent( + name="test_agent", + instruction="Dynamic instruction", + static_instruction=static_content, + ) + + invocation_context = await _create_invocation_context(agent) + + llm_request = LlmRequest() + # No existing content + + # Run the instruction processor to add dynamic instruction + async for _ in request_processor.run_async(invocation_context, llm_request): + pass + + # Run the content processor to handle any positioning (no change expected for single content) + async for _ in contents_processor.run_async(invocation_context, llm_request): + pass + + # Dynamic instruction should create new user content + assert len(llm_request.contents) == 1 + assert llm_request.contents[0].role == "user" + assert len(llm_request.contents[0].parts) == 1 + assert llm_request.contents[0].parts[0].text == "Dynamic instruction" + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +@pytest.mark.asyncio +async def test_no_dynamic_instructions_when_no_static(llm_backend): + """Test that no dynamic instructions are added to content when no static instructions exist.""" + agent = LlmAgent(name="test_agent", instruction="Dynamic instruction only") + + invocation_context = await _create_invocation_context(agent) + + llm_request = LlmRequest() + # Add some existing user content + original_content = types.Content( + role="user", parts=[types.Part(text="Hello world")] + ) + llm_request.contents = [original_content] + + # Run the content processor function + await _add_instructions_to_user_content(invocation_context, llm_request, []) + + # Content should remain unchanged + assert len(llm_request.contents) == 1 + assert llm_request.contents[0].role == "user" + assert len(llm_request.contents[0].parts) == 1 + assert llm_request.contents[0].parts[0].text == "Hello world" + + +@pytest.mark.asyncio +async def test_instructions_insert_after_function_response(): + """Ensure instruction insertion does not split tool_use/tool_result pairs.""" + agent = LlmAgent(name="test_agent") + invocation_context = await _create_invocation_context(agent) + + tool_call = types.Part.from_function_call( + name="echo_tool", args={"echo": "value"} + ) + tool_response = types.Part.from_function_response( + name="echo_tool", response={"result": "value"} + ) + + llm_request = LlmRequest( + contents=[ + types.Content(role="assistant", parts=[tool_call]), + types.Content(role="user", parts=[tool_response]), + ] + ) + instruction_contents = [ + types.Content( + role="user", parts=[types.Part.from_text(text="Dynamic instruction")] + ) + ] + + await _add_instructions_to_user_content( + invocation_context, llm_request, instruction_contents + ) + + assert len(llm_request.contents) == 3 + assert llm_request.contents[0].parts[0].function_call + assert llm_request.contents[1].parts[0].function_response + assert llm_request.contents[2].parts[0].text == "Dynamic instruction" + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +@pytest.mark.asyncio +async def test_static_instruction_with_files_and_text(llm_backend): + """Test that static instruction can contain files and text together.""" + static_content = types.Content( + role="user", + parts=[ + types.Part(text="Analyze this image:"), + types.Part( + inline_data=types.Blob( + data=b"fake_image_data", mime_type="image/png" + ) + ), + types.Part(text="Focus on the key elements."), + ], + ) + agent = LlmAgent(name="test_agent", static_instruction=static_content) + + invocation_context = await _create_invocation_context(agent) + llm_request = LlmRequest() + + # Run the instruction processor + async for _ in request_processor.run_async(invocation_context, llm_request): + pass + + # Static instruction should contain text parts with references to non-text parts + assert len(llm_request.contents) == 1 + assert ( + llm_request.config.system_instruction + == "Analyze this image:\n\n[Reference to inline binary data:" + " inline_data_0 (type: image/png)]\n\nFocus on the key elements." + ) + + # The non-text part should be in user content + assert llm_request.contents[0].role == "user" + assert len(llm_request.contents[0].parts) == 2 + assert ( + llm_request.contents[0].parts[0].text + == "Referenced inline data: inline_data_0" + ) + assert llm_request.contents[0].parts[1].inline_data + assert llm_request.contents[0].parts[1].inline_data.data == b"fake_image_data" + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +@pytest.mark.asyncio +async def test_static_instruction_non_text_parts_moved_to_user_content( + llm_backend, +): + """Test that non-text parts from static instruction are moved to user content.""" + static_content = types.Content( + role="user", + parts=[ + types.Part(text="Analyze this image:"), + types.Part( + inline_data=types.Blob( + data=b"fake_image_data", + mime_type="image/png", + display_name="test_image.png", + ) + ), + types.Part( + file_data=types.FileData( + file_uri="files/test123", + mime_type="text/plain", + display_name="test_file.txt", + ) + ), + types.Part(text="Focus on the key elements."), + ], + ) + agent = LlmAgent(name="test_agent", static_instruction=static_content) + + invocation_context = await _create_invocation_context(agent) + llm_request = LlmRequest() + + # Run the instruction processor + async for _ in request_processor.run_async(invocation_context, llm_request): + pass + + # Run the contents processor to move non-text parts + async for _ in contents_processor.run_async(invocation_context, llm_request): + pass + + # System instruction should contain text with references + expected_system = ( + "Analyze this image:\n\n[Reference to inline binary data: inline_data_0" + " ('test_image.png', type: image/png)]\n\n[Reference to file data:" + " file_data_1 ('test_file.txt', URI: files/test123, type:" + " text/plain)]\n\nFocus on the key elements." + ) + assert llm_request.config.system_instruction == expected_system + + # Non-text parts should be moved to user content + assert len(llm_request.contents) == 2 + + # Check first content object (inline_data) + inline_content = llm_request.contents[0] + assert inline_content.role == "user" + assert len(inline_content.parts) == 2 + assert inline_content.parts[0].text == "Referenced inline data: inline_data_0" + assert inline_content.parts[1].inline_data + assert inline_content.parts[1].inline_data.data == b"fake_image_data" + assert inline_content.parts[1].inline_data.mime_type == "image/png" + assert inline_content.parts[1].inline_data.display_name == "test_image.png" + + # Check second content object (file_data) + file_content = llm_request.contents[1] + assert file_content.role == "user" + assert len(file_content.parts) == 2 + assert file_content.parts[0].text == "Referenced file data: file_data_1" + assert file_content.parts[1].file_data + assert file_content.parts[1].file_data.file_uri == "files/test123" + assert file_content.parts[1].file_data.mime_type == "text/plain" + assert file_content.parts[1].file_data.display_name == "test_file.txt" + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +@pytest.mark.asyncio +async def test_static_instruction_reference_id_generation(llm_backend): + """Test that reference IDs are generated correctly for non-text parts.""" + static_content = types.Content( + role="user", + parts=[ + types.Part(text="Multiple files:"), + types.Part( + inline_data=types.Blob(data=b"data1", mime_type="image/png") + ), + types.Part( + file_data=types.FileData( + file_uri="files/test1", mime_type="text/plain" + ) + ), + types.Part( + inline_data=types.Blob(data=b"data2", mime_type="image/jpeg") + ), + ], + ) + agent = LlmAgent(name="test_agent", static_instruction=static_content) + + invocation_context = await _create_invocation_context(agent) + llm_request = LlmRequest() + + # Run the instruction processor + async for _ in request_processor.run_async(invocation_context, llm_request): + pass + + # Run the contents processor to move non-text parts + async for _ in contents_processor.run_async(invocation_context, llm_request): + pass + + # System instruction should contain sequential reference IDs + expected_system = ( + "Multiple files:\n\n[Reference to inline binary data: inline_data_0" + " (type: image/png)]\n\n[Reference to file data: file_data_1 (URI:" + " files/test1, type: text/plain)]\n\n[Reference to inline binary data:" + " inline_data_2 (type: image/jpeg)]" + ) + assert llm_request.config.system_instruction == expected_system + + # All non-text parts should be in user content + assert len(llm_request.contents) == 3 + # Each non-text part gets its own content object with 2 parts (text description + actual part) + for content in llm_request.contents: + assert len(content.parts) == 2 + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +@pytest.mark.asyncio +async def test_static_instruction_only_text_parts(llm_backend): + """Test that static instruction with only text parts works normally.""" + static_content = types.Content( + role="user", + parts=[ + types.Part(text="First part"), + types.Part(text="Second part"), + ], + ) + agent = LlmAgent(name="test_agent", static_instruction=static_content) + + invocation_context = await _create_invocation_context(agent) + llm_request = LlmRequest() + + # Run the instruction processor + async for _ in request_processor.run_async(invocation_context, llm_request): + pass + + # Only text should be in system instruction + assert llm_request.config.system_instruction == "First part\n\nSecond part" + # No user content should be created + assert len(llm_request.contents) == 0 + + +@pytest.mark.parametrize("llm_backend", ["GOOGLE_AI", "VERTEX"]) +@pytest.mark.asyncio +async def test_static_instruction_only_non_text_parts(llm_backend): + """Test that static instruction with only non-text parts works correctly.""" + static_content = types.Content( + role="user", + parts=[ + types.Part( + inline_data=types.Blob(data=b"data", mime_type="image/png") + ), + types.Part( + file_data=types.FileData( + file_uri="files/test", mime_type="text/plain" + ) + ), + ], + ) + agent = LlmAgent(name="test_agent", static_instruction=static_content) + + invocation_context = await _create_invocation_context(agent) + llm_request = LlmRequest() + + # Run the instruction processor + async for _ in request_processor.run_async(invocation_context, llm_request): + pass + + # Run the contents processor to move non-text parts + async for _ in contents_processor.run_async(invocation_context, llm_request): + pass + + # System instruction should contain only references + expected_system = ( + "[Reference to inline binary data: inline_data_0 (type:" + " image/png)]\n\n[Reference to file data: file_data_1 (URI: files/test," + " type: text/plain)]" + ) + assert llm_request.config.system_instruction == expected_system + + # All parts should be in user content + assert len(llm_request.contents) == 2 + # Each non-text part gets its own content object with 2 parts (text description + actual part) + for content in llm_request.contents: + assert len(content.parts) == 2 diff --git a/tests/unittests/flows/llm_flows/test_output_schema_processor.py b/tests/unittests/flows/llm_flows/test_output_schema_processor.py index 70eedcc696..f7ad8eb32a 100644 --- a/tests/unittests/flows/llm_flows/test_output_schema_processor.py +++ b/tests/unittests/flows/llm_flows/test_output_schema_processor.py @@ -14,14 +14,13 @@ """Tests for output schema processor functionality.""" -import json +from unittest import mock from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.llm_agent import LlmAgent from google.adk.agents.run_config import RunConfig from google.adk.flows.llm_flows.single_flow import SingleFlow from google.adk.models.llm_request import LlmRequest -from google.adk.models.llm_response import LlmResponse from google.adk.sessions.in_memory_session_service import InMemorySessionService from google.adk.tools.function_tool import FunctionTool from pydantic import BaseModel @@ -72,6 +71,24 @@ async def test_output_schema_with_tools_validation_removed(): assert len(agent.tools) == 1 +@pytest.mark.asyncio +async def test_output_schema_with_sub_agents(): + """Test that LlmAgent now allows output_schema with sub_agents.""" + sub_agent = LlmAgent( + name='sub_agent', + model='gemini-1.5-flash', + ) + agent = LlmAgent( + name='test_agent', + model='gemini-1.5-flash', + output_schema=PersonSchema, + sub_agents=[sub_agent], + ) + + assert agent.output_schema == PersonSchema + assert len(agent.sub_agents) == 1 + + @pytest.mark.asyncio async def test_basic_processor_skips_output_schema_with_tools(): """Test that basic processor doesn't set output_schema when tools are present.""" @@ -127,7 +144,16 @@ async def test_basic_processor_sets_output_schema_without_tools(): @pytest.mark.asyncio -async def test_output_schema_request_processor(): +@pytest.mark.parametrize( + 'output_schema_with_tools_allowed', + [ + False, + True, + ], +) +async def test_output_schema_request_processor( + output_schema_with_tools_allowed, mocker +): """Test that output schema processor adds set_model_response tool.""" from google.adk.flows.llm_flows._output_schema_processor import _OutputSchemaRequestProcessor @@ -143,16 +169,29 @@ async def test_output_schema_request_processor(): llm_request = LlmRequest() processor = _OutputSchemaRequestProcessor() + can_use_output_schema_with_tools = mocker.patch( + 'google.adk.flows.llm_flows._output_schema_processor.can_use_output_schema_with_tools', + mock.MagicMock(return_value=output_schema_with_tools_allowed), + ) + # Process the request events = [] async for event in processor.run_async(invocation_context, llm_request): events.append(event) - # Should have added set_model_response tool - assert 'set_model_response' in llm_request.tools_dict + if not output_schema_with_tools_allowed: + # Should have added set_model_response tool if output schema with tools is + # allowed + assert 'set_model_response' in llm_request.tools_dict + # Should have added instruction about using set_model_response + assert 'set_model_response' in llm_request.config.system_instruction + else: + # Should skip modifying LlmRequest + assert not llm_request.tools_dict + assert not llm_request.config.system_instruction - # Should have added instruction about using set_model_response - assert 'set_model_response' in llm_request.config.system_instruction + # Should have checked if output schema can be used with tools + can_use_output_schema_with_tools.assert_called_once_with(agent.model) @pytest.mark.asyncio @@ -254,6 +293,39 @@ async def test_output_schema_helper_functions(): assert extracted_json is None +@pytest.mark.asyncio +async def test_get_structured_model_response_with_non_ascii(): + """Test get_structured_model_response with non-ASCII characters.""" + from google.adk.events.event import Event + from google.adk.flows.llm_flows._output_schema_processor import get_structured_model_response + from google.genai import types + + # Test with a dictionary containing non-ASCII characters + test_dict = {'city': 'São Paulo'} + expected_json = '{"city": "São Paulo"}' + + # Create a function response event + function_response_event = Event( + author='test_agent', + content=types.Content( + role='user', + parts=[ + types.Part( + function_response=types.FunctionResponse( + name='set_model_response', response=test_dict + ) + ) + ], + ), + ) + + # Get the structured response + extracted_json = get_structured_model_response(function_response_event) + + # Assert that the output is the expected JSON string without escaped characters + assert extracted_json == expected_json + + @pytest.mark.asyncio async def test_end_to_end_integration(): """Test the complete output schema with tools integration.""" diff --git a/tests/unittests/flows/llm_flows/test_tool_callbacks.py b/tests/unittests/flows/llm_flows/test_tool_callbacks.py index 59845b6148..b839a3c95c 100644 --- a/tests/unittests/flows/llm_flows/test_tool_callbacks.py +++ b/tests/unittests/flows/llm_flows/test_tool_callbacks.py @@ -20,6 +20,7 @@ from google.genai import types from google.genai.types import Part from pydantic import BaseModel +import pytest from ... import testing_utils @@ -28,7 +29,13 @@ def simple_function(input_str: str) -> str: return {'result': input_str} +def simple_function_with_error() -> str: + raise SystemError('simple_function_with_error') + + class MockBeforeToolCallback(BaseModel): + """Mock before tool callback.""" + mock_response: dict[str, object] modify_tool_request: bool = False @@ -45,6 +52,8 @@ def __call__( class MockAfterToolCallback(BaseModel): + """Mock after tool callback.""" + mock_response: dict[str, object] modify_tool_request: bool = False modify_tool_response: bool = False @@ -65,6 +74,24 @@ def __call__( return self.mock_response +class MockOnToolErrorCallback(BaseModel): + """Mock on tool error callback.""" + + mock_response: dict[str, object] + modify_tool_response: bool = False + + def __call__( + self, + tool: BaseTool, + args: dict[str, Any], + tool_context: ToolContext, + error: Exception, + ) -> dict[str, object]: + if self.modify_tool_response: + return self.mock_response + return None + + def noop_callback( **kwargs, ) -> dict[str, object]: @@ -72,6 +99,7 @@ def noop_callback( def test_before_tool_callback(): + """Test that the before_tool_callback is called before the tool is called.""" responses = [ types.Part.from_function_call(name='simple_function', args={}), 'response1', @@ -100,6 +128,7 @@ def test_before_tool_callback(): def test_before_tool_callback_noop(): + """Test that the before_tool_callback is a no-op when not overridden.""" responses = [ types.Part.from_function_call( name='simple_function', args={'input_str': 'simple_function_call'} @@ -134,6 +163,7 @@ def test_before_tool_callback_noop(): def test_before_tool_callback_modify_tool_request(): + """Test that the before_tool_callback modifies the tool request.""" responses = [ types.Part.from_function_call(name='simple_function', args={}), 'response1', @@ -164,6 +194,7 @@ def test_before_tool_callback_modify_tool_request(): def test_after_tool_callback(): + """Test that the after_tool_callback is called after the tool is called.""" responses = [ types.Part.from_function_call( name='simple_function', args={'input_str': 'simple_function_call'} @@ -199,6 +230,7 @@ def test_after_tool_callback(): def test_after_tool_callback_noop(): + """Test that the after_tool_callback is a no-op when not overridden.""" responses = [ types.Part.from_function_call( name='simple_function', args={'input_str': 'simple_function_call'} @@ -233,6 +265,7 @@ def test_after_tool_callback_noop(): def test_after_tool_callback_modify_tool_response(): + """Test that the after_tool_callback modifies the tool response.""" responses = [ types.Part.from_function_call( name='simple_function', args={'input_str': 'simple_function_call'} @@ -267,3 +300,135 @@ def test_after_tool_callback_modify_tool_response(): ), ('root_agent', 'response1'), ] + + +async def test_on_tool_error_callback_tool_not_found_noop(): + """Test that the on_tool_error_callback is a no-op when the tool is not found.""" + responses = [ + types.Part.from_function_call( + name='nonexistent_function', + args={'input_str': 'simple_function_call'}, + ), + 'response1', + ] + mock_model = testing_utils.MockModel.create(responses=responses) + agent = Agent( + name='root_agent', + model=mock_model, + on_tool_error_callback=noop_callback, + tools=[simple_function], + ) + + runner = testing_utils.InMemoryRunner(agent) + with pytest.raises(ValueError): + await runner.run_async('test') + + +def test_on_tool_error_callback_tool_not_found_modify_tool_response(): + """Test that the on_tool_error_callback modifies the tool response when the tool is not found.""" + responses = [ + types.Part.from_function_call( + name='nonexistent_function', + args={'input_str': 'simple_function_call'}, + ), + 'response1', + ] + mock_model = testing_utils.MockModel.create(responses=responses) + agent = Agent( + name='root_agent', + model=mock_model, + on_tool_error_callback=MockOnToolErrorCallback( + mock_response={'result': 'on_tool_error_callback_response'}, + modify_tool_response=True, + ), + tools=[simple_function], + ) + + runner = testing_utils.InMemoryRunner(agent) + assert testing_utils.simplify_events(runner.run('test')) == [ + ( + 'root_agent', + Part.from_function_call( + name='nonexistent_function', + args={'input_str': 'simple_function_call'}, + ), + ), + ( + 'root_agent', + Part.from_function_response( + name='nonexistent_function', + response={'result': 'on_tool_error_callback_response'}, + ), + ), + ('root_agent', 'response1'), + ] + + +async def test_on_tool_error_callback_tool_error_noop(): + """Test that the on_tool_error_callback is a no-op when the tool returns an error.""" + responses = [ + types.Part.from_function_call( + name='simple_function_with_error', + args={}, + ), + 'response1', + ] + mock_model = testing_utils.MockModel.create(responses=responses) + agent = Agent( + name='root_agent', + model=mock_model, + on_tool_error_callback=noop_callback, + tools=[simple_function_with_error], + ) + + runner = testing_utils.InMemoryRunner(agent) + with pytest.raises(SystemError): + await runner.run_async('test') + + +def test_on_tool_error_callback_tool_error_modify_tool_response(): + """Test that the on_tool_error_callback modifies the tool response when the tool returns an error.""" + + async def async_on_tool_error_callback( + tool: BaseTool, + args: dict[str, Any], + tool_context: ToolContext, + error: Exception, + ) -> dict[str, object]: + if tool.name == 'simple_function_with_error': + return {'result': 'async_on_tool_error_callback_response'} + return None + + responses = [ + types.Part.from_function_call( + name='simple_function_with_error', + args={}, + ), + 'response1', + ] + mock_model = testing_utils.MockModel.create(responses=responses) + agent = Agent( + name='root_agent', + model=mock_model, + on_tool_error_callback=async_on_tool_error_callback, + tools=[simple_function_with_error], + ) + + runner = testing_utils.InMemoryRunner(agent) + assert testing_utils.simplify_events(runner.run('test')) == [ + ( + 'root_agent', + Part.from_function_call( + name='simple_function_with_error', + args={}, + ), + ), + ( + 'root_agent', + Part.from_function_response( + name='simple_function_with_error', + response={'result': 'async_on_tool_error_callback_response'}, + ), + ), + ('root_agent', 'response1'), + ] diff --git a/tests/unittests/flows/llm_flows/test_tool_telemetry.py b/tests/unittests/flows/llm_flows/test_tool_telemetry.py index c8a156b4d9..ebae3ac5fa 100644 --- a/tests/unittests/flows/llm_flows/test_tool_telemetry.py +++ b/tests/unittests/flows/llm_flows/test_tool_telemetry.py @@ -17,10 +17,10 @@ from typing import Optional from unittest import mock -from google.adk import telemetry from google.adk.agents.llm_agent import Agent from google.adk.events.event import Event from google.adk.flows.llm_flows.functions import handle_function_calls_async +from google.adk.telemetry import tracing from google.adk.tools.function_tool import FunctionTool from google.genai import types @@ -65,7 +65,7 @@ async def test_simple_function_with_mocked_tracer(monkeypatch): mock_start_as_current_span_func.return_value = returned_context_manager_mock monkeypatch.setattr( - telemetry.tracer, 'start_as_current_span', mock_start_as_current_span_func + tracing.tracer, 'start_as_current_span', mock_start_as_current_span_func ) mock_adk_trace_tool_call = mock.Mock() diff --git a/tests/unittests/memory/test_vertex_ai_memory_bank_service.py b/tests/unittests/memory/test_vertex_ai_memory_bank_service.py index 2916b44209..6a1f0ccb5c 100644 --- a/tests/unittests/memory/test_vertex_ai_memory_bank_service.py +++ b/tests/unittests/memory/test_vertex_ai_memory_bank_service.py @@ -12,8 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import re -from typing import Any +from datetime import datetime +from typing import Optional from unittest import mock from google.adk.events.event import Event @@ -70,119 +70,117 @@ ) -RETRIEVE_MEMORIES_REGEX = r'^reasoningEngines/([^/]+)/memories:retrieve$' -GENERATE_MEMORIES_REGEX = r'^reasoningEngines/([^/]+)/memories:generate$' - - -class MockApiClient: - """Mocks the API Client.""" - - def __init__(self) -> None: - """Initializes MockClient.""" - self.async_request = mock.AsyncMock() - self.async_request.side_effect = self._mock_async_request - - async def _mock_async_request( - self, http_method: str, path: str, request_dict: dict[str, Any] - ): - """Mocks the API Client request method.""" - if http_method == 'POST': - if re.match(GENERATE_MEMORIES_REGEX, path): - return {} - elif re.match(RETRIEVE_MEMORIES_REGEX, path): - if ( - request_dict.get('scope', None) - and request_dict['scope'].get('app_name', None) == MOCK_APP_NAME - ): - return { - 'retrievedMemories': [ - { - 'memory': { - 'fact': 'test_content', - }, - 'updateTime': '2024-12-12T12:12:12.123456Z', - }, - ], - } - else: - return {'retrievedMemories': []} - else: - raise ValueError(f'Unsupported path: {path}') - else: - raise ValueError(f'Unsupported http method: {http_method}') - - -def mock_vertex_ai_memory_bank_service(): +def mock_vertex_ai_memory_bank_service( + project: Optional[str] = 'test-project', + location: Optional[str] = 'test-location', + agent_engine_id: Optional[str] = '123', + express_mode_api_key: Optional[str] = None, +): """Creates a mock Vertex AI Memory Bank service for testing.""" return VertexAiMemoryBankService( - project='test-project', - location='test-location', - agent_engine_id='123', + project=project, + location=location, + agent_engine_id=agent_engine_id, + express_mode_api_key=express_mode_api_key, ) @pytest.fixture -def mock_get_api_client(): - api_client = MockApiClient() +def mock_vertexai_client(): with mock.patch( - 'google.adk.memory.vertex_ai_memory_bank_service.VertexAiMemoryBankService._get_api_client', - return_value=api_client, - ): - yield api_client + 'google.adk.memory.vertex_ai_memory_bank_service.vertexai.Client' + ) as mock_client_constructor: + mock_client = mock.MagicMock() + mock_client.agent_engines.memories.generate = mock.MagicMock() + mock_client.agent_engines.memories.retrieve = mock.MagicMock() + mock_client_constructor.return_value = mock_client + yield mock_client @pytest.mark.asyncio -@pytest.mark.usefixtures('mock_get_api_client') -async def test_add_session_to_memory(mock_get_api_client): +async def test_initialize_with_project_location_and_api_key_error(): + with pytest.raises(ValueError) as excinfo: + mock_vertex_ai_memory_bank_service( + project='test-project', + location='test-location', + express_mode_api_key='test-api-key', + ) + assert ( + 'Cannot specify project or location and express_mode_api_key. Either use' + ' project and location, or just the express_mode_api_key.' + in str(excinfo.value) + ) + + +@pytest.mark.asyncio +async def test_add_session_to_memory(mock_vertexai_client): memory_service = mock_vertex_ai_memory_bank_service() await memory_service.add_session_to_memory(MOCK_SESSION) - mock_get_api_client.async_request.assert_awaited_once_with( - http_method='POST', - path='reasoningEngines/123/memories:generate', - request_dict={ - 'direct_contents_source': { - 'events': [ - { - 'content': { - 'parts': [ - {'text': 'test_content'}, - ], - }, - }, - ], - }, - 'scope': {'app_name': MOCK_APP_NAME, 'user_id': MOCK_USER_ID}, + mock_vertexai_client.agent_engines.memories.generate.assert_called_once_with( + name='reasoningEngines/123', + direct_contents_source={ + 'events': [ + { + 'content': { + 'parts': [{'text': 'test_content'}], + } + } + ] }, + scope={'app_name': MOCK_APP_NAME, 'user_id': MOCK_USER_ID}, + config={'wait_for_completion': False}, ) @pytest.mark.asyncio -@pytest.mark.usefixtures('mock_get_api_client') -async def test_add_empty_session_to_memory(mock_get_api_client): +async def test_add_empty_session_to_memory(mock_vertexai_client): memory_service = mock_vertex_ai_memory_bank_service() await memory_service.add_session_to_memory(MOCK_SESSION_WITH_EMPTY_EVENTS) - mock_get_api_client.async_request.assert_not_called() + mock_vertexai_client.agent_engines.memories.generate.assert_not_called() @pytest.mark.asyncio -@pytest.mark.usefixtures('mock_get_api_client') -async def test_search_memory(mock_get_api_client): +async def test_search_memory(mock_vertexai_client): + retrieved_memory = mock.MagicMock() + retrieved_memory.memory.fact = 'test_content' + retrieved_memory.memory.update_time = datetime( + 2024, 12, 12, 12, 12, 12, 123456 + ) + + mock_vertexai_client.agent_engines.memories.retrieve.return_value = [ + retrieved_memory + ] memory_service = mock_vertex_ai_memory_bank_service() result = await memory_service.search_memory( app_name=MOCK_APP_NAME, user_id=MOCK_USER_ID, query='query' ) - mock_get_api_client.async_request.assert_awaited_once_with( - http_method='POST', - path='reasoningEngines/123/memories:retrieve', - request_dict={ - 'scope': {'app_name': MOCK_APP_NAME, 'user_id': MOCK_USER_ID}, - 'similarity_search_params': {'search_query': 'query'}, - }, + mock_vertexai_client.agent_engines.memories.retrieve.assert_called_once_with( + name='reasoningEngines/123', + scope={'app_name': MOCK_APP_NAME, 'user_id': MOCK_USER_ID}, + similarity_search_params={'search_query': 'query'}, ) assert len(result.memories) == 1 assert result.memories[0].content.parts[0].text == 'test_content' + + +@pytest.mark.asyncio +async def test_search_memory_empty_results(mock_vertexai_client): + mock_vertexai_client.agent_engines.memories.retrieve.return_value = [] + memory_service = mock_vertex_ai_memory_bank_service() + + result = await memory_service.search_memory( + app_name=MOCK_APP_NAME, user_id=MOCK_USER_ID, query='query' + ) + + mock_vertexai_client.agent_engines.memories.retrieve.assert_called_once_with( + name='reasoningEngines/123', + scope={'app_name': MOCK_APP_NAME, 'user_id': MOCK_USER_ID}, + similarity_search_params={'search_query': 'query'}, + ) + + assert len(result.memories) == 0 diff --git a/tests/unittests/models/test_apigee_llm.py b/tests/unittests/models/test_apigee_llm.py new file mode 100644 index 0000000000..eeafd5bedc --- /dev/null +++ b/tests/unittests/models/test_apigee_llm.py @@ -0,0 +1,414 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import os +from unittest import mock +from unittest.mock import AsyncMock + +from google.adk.models.apigee_llm import ApigeeLlm +from google.adk.models.llm_request import LlmRequest +from google.genai import types +from google.genai.types import Content +from google.genai.types import Part +import pytest + +BASE_MODEL_ID = 'gemini-2.5-flash' +APIGEE_GEMINI_MODEL_ID = 'apigee/gemini/v1/' + BASE_MODEL_ID +APIGEE_VERTEX_MODEL_ID = 'apigee/vertex_ai/v1beta/gemini-pro' +VERTEX_BASE_MODEL_ID = 'gemini-pro' +PROXY_URL = 'https://test.apigee.net' + + +@pytest.fixture +def llm_request(): + """Provides a sample LlmRequest for testing.""" + return LlmRequest( + model=APIGEE_GEMINI_MODEL_ID, + contents=[ + types.Content( + role='user', parts=[types.Part.from_text(text='Test prompt')] + ) + ], + ) + + +@pytest.mark.asyncio +@mock.patch('google.adk.models.apigee_llm.Client') +async def test_generate_content_async_non_streaming( + mock_client_constructor, llm_request +): + """Tests the generate_content_async method for non-streaming responses.""" + apigee_llm_instance = ApigeeLlm( + model=APIGEE_GEMINI_MODEL_ID, + proxy_url=PROXY_URL, + ) + mock_client_instance = mock.Mock() + mock_response = types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=Content( + parts=[Part.from_text(text='Test response')], + role='model', + ) + ) + ] + ) + mock_client_instance.aio.models.generate_content = AsyncMock( + return_value=mock_response + ) + mock_client_constructor.return_value = mock_client_instance + + response_generator = apigee_llm_instance.generate_content_async(llm_request) + responses = [resp async for resp in response_generator] + + assert len(responses) == 1 + llm_response = responses[0] + assert llm_response.content.parts[0].text == 'Test response' + assert llm_response.content.role == 'model' + + mock_client_constructor.assert_called_once() + _, kwargs = mock_client_constructor.call_args + assert not kwargs['vertexai'] + http_options = kwargs['http_options'] + assert http_options.base_url == PROXY_URL + assert http_options.api_version == 'v1' + assert 'user-agent' in http_options.headers + assert 'x-goog-api-client' in http_options.headers + + mock_client_instance.aio.models.generate_content.assert_called_once_with( + model=BASE_MODEL_ID, + contents=llm_request.contents, + config=llm_request.config, + ) + + +@pytest.mark.asyncio +@mock.patch('google.adk.models.apigee_llm.Client') +async def test_generate_content_async_streaming( + mock_client_constructor, llm_request +): + """Tests the generate_content_async method for streaming responses.""" + apigee_llm_instance = ApigeeLlm( + model=APIGEE_GEMINI_MODEL_ID, + proxy_url=PROXY_URL, + ) + mock_client_instance = mock.Mock() + mock_responses = [ + types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=Content( + parts=[Part.from_text(text='Hello')], + ) + ) + ] + ), + types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=Content( + parts=[Part.from_text(text=',')], + ) + ) + ] + ), + types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=Content( + parts=[Part.from_text(text=' world!')], + ) + ) + ] + ), + ] + + async def mock_stream_generator(): + for r in mock_responses: + yield r + + mock_client_instance.aio.models.generate_content_stream = AsyncMock( + return_value=mock_stream_generator() + ) + mock_client_constructor.return_value = mock_client_instance + + response_generator = apigee_llm_instance.generate_content_async( + llm_request, stream=True + ) + responses = [resp async for resp in response_generator] + + assert responses + full_text_parts = [] + for r in responses: + for p in r.content.parts: + if p.text: + full_text_parts.append(p.text) + full_text = ''.join(full_text_parts) + assert 'Hello, world!' in full_text + + mock_client_instance.aio.models.generate_content_stream.assert_called_once_with( + model=BASE_MODEL_ID, + contents=llm_request.contents, + config=llm_request.config, + ) + + +@pytest.mark.asyncio +@mock.patch('google.adk.models.apigee_llm.Client') +async def test_generate_content_async_with_custom_headers( + mock_client_constructor, llm_request +): + """Tests that custom headers are passed in the request.""" + custom_headers = { + 'X-Custom-Header': 'custom-value', + } + apigee_llm = ApigeeLlm( + model=APIGEE_GEMINI_MODEL_ID, + proxy_url=PROXY_URL, + custom_headers=custom_headers, + ) + mock_client_instance = mock.Mock() + mock_response = types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=Content( + parts=[Part.from_text(text='Test response')], + role='model', + ) + ) + ] + ) + mock_client_instance.aio.models.generate_content = AsyncMock( + return_value=mock_response + ) + mock_client_constructor.return_value = mock_client_instance + + response_generator = apigee_llm.generate_content_async(llm_request) + _ = [resp async for resp in response_generator] # Consume generator + + mock_client_constructor.assert_called_once() + _, kwargs = mock_client_constructor.call_args + http_options = kwargs['http_options'] + assert http_options.headers['X-Custom-Header'] == 'custom-value' + assert 'user-agent' in http_options.headers + + +@pytest.mark.asyncio +@mock.patch('google.adk.models.apigee_llm.Client') +async def test_vertex_model_path_parsing(mock_client_constructor): + """Tests that Vertex AI model paths are parsed correctly.""" + apigee_llm = ApigeeLlm(model=APIGEE_VERTEX_MODEL_ID, proxy_url=PROXY_URL) + llm_request = LlmRequest( + model=APIGEE_VERTEX_MODEL_ID, + contents=[ + types.Content( + role='user', parts=[types.Part.from_text(text='Test prompt')] + ) + ], + ) + mock_client_instance = mock.Mock() + mock_client_instance.aio.models.generate_content = AsyncMock( + return_value=types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=Content( + parts=[Part.from_text(text='Test response')], + role='model', + ) + ) + ] + ) + ) + mock_client_constructor.return_value = mock_client_instance + + _ = [resp async for resp in apigee_llm.generate_content_async(llm_request)] + + mock_client_constructor.assert_called_once() + _, kwargs = mock_client_constructor.call_args + assert kwargs['vertexai'] + assert kwargs['http_options'].api_version == 'v1beta' + + mock_client_instance.aio.models.generate_content.assert_called_once() + call_kwargs = ( + mock_client_instance.aio.models.generate_content.call_args.kwargs + ) + assert call_kwargs['model'] == VERTEX_BASE_MODEL_ID + + +@pytest.mark.asyncio +@mock.patch('google.adk.models.apigee_llm.Client') +async def test_proxy_url_from_env_variable(mock_client_constructor): + """Tests that proxy_url is read from environment variable.""" + with mock.patch.dict( + os.environ, {'APIGEE_PROXY_URL': 'https://env.proxy.url'} + ): + apigee_llm = ApigeeLlm(model=APIGEE_GEMINI_MODEL_ID) + llm_request = LlmRequest( + model=APIGEE_GEMINI_MODEL_ID, + contents=[ + types.Content( + role='user', parts=[types.Part.from_text(text='Test prompt')] + ) + ], + ) + mock_client_instance = mock.Mock() + mock_client_instance.aio.models.generate_content = AsyncMock( + return_value=types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=Content( + parts=[Part.from_text(text='Test response')], + role='model', + ) + ) + ] + ) + ) + mock_client_constructor.return_value = mock_client_instance + + _ = [resp async for resp in apigee_llm.generate_content_async(llm_request)] + + mock_client_constructor.assert_called_once() + _, kwargs = mock_client_constructor.call_args + assert kwargs['http_options'].base_url == 'https://env.proxy.url' + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + ( + 'model_string', + 'use_vertexai_env', + 'expected_is_vertexai', + 'expected_api_version', + 'expected_model_id', + ), + [ + ('apigee/gemini-2.5-flash', None, False, None, 'gemini-2.5-flash'), + ('apigee/gemini-2.5-flash', 'true', True, None, 'gemini-2.5-flash'), + ('apigee/gemini-2.5-flash', '1', True, None, 'gemini-2.5-flash'), + ('apigee/gemini-2.5-flash', 'false', False, None, 'gemini-2.5-flash'), + ('apigee/gemini-2.5-flash', '0', False, None, 'gemini-2.5-flash'), + ( + 'apigee/v1/gemini-2.5-flash', + None, + False, + 'v1', + 'gemini-2.5-flash', + ), + ( + 'apigee/v1/gemini-2.5-flash', + 'true', + True, + 'v1', + 'gemini-2.5-flash', + ), + ( + 'apigee/vertex_ai/gemini-2.5-flash', + None, + True, + None, + 'gemini-2.5-flash', + ), + ( + 'apigee/vertex_ai/gemini-2.5-flash', + 'false', + True, + None, + 'gemini-2.5-flash', + ), + ( + 'apigee/gemini/v1/gemini-2.5-flash', + 'true', + False, + 'v1', + 'gemini-2.5-flash', + ), + ( + 'apigee/vertex_ai/v1beta/gemini-2.5-flash', + 'false', + True, + 'v1beta', + 'gemini-2.5-flash', + ), + ], +) +@mock.patch('google.adk.models.apigee_llm.Client') +async def test_model_string_parsing_and_client_initialization( + mock_client_constructor, + model_string, + use_vertexai_env, + expected_is_vertexai, + expected_api_version, + expected_model_id, +): + """Tests model string parsing and genai.Client initialization.""" + env_vars = {} + if use_vertexai_env is not None: + env_vars['GOOGLE_GENAI_USE_VERTEXAI'] = use_vertexai_env + + # The ApigeeLlm is initialized in the 'with' block to make sure that the mock + # of the environment variable is active. + with mock.patch.dict(os.environ, env_vars, clear=True): + apigee_llm = ApigeeLlm(model=model_string, proxy_url=PROXY_URL) + request = LlmRequest(model=model_string, contents=[]) + + mock_client_instance = mock.Mock() + mock_client_instance.aio.models.generate_content = AsyncMock( + return_value=types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=Content(parts=[Part.from_text(text='')]) + ) + ] + ) + ) + mock_client_constructor.return_value = mock_client_instance + + _ = [resp async for resp in apigee_llm.generate_content_async(request)] + + mock_client_constructor.assert_called_once() + _, kwargs = mock_client_constructor.call_args + assert kwargs['vertexai'] == expected_is_vertexai + http_options = kwargs['http_options'] + assert http_options.api_version == expected_api_version + + ( + mock_client_instance.aio.models.generate_content.assert_called_once_with( + model=expected_model_id, + contents=request.contents, + config=request.config, + ) + ) + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'invalid_model_string', + [ + 'apigee/openai/v1/gpt', + 'apigee/', # Missing model_id + 'apigee', # Invalid format + 'gemini-pro', # Invalid format + 'apigee/vertex_ai/v1/model/extra', # Too many components + 'apigee/unknown/model', + ], +) +async def test_invalid_model_strings_raise_value_error(invalid_model_string): + """Tests that invalid model strings raise a ValueError.""" + with pytest.raises( + ValueError, match=f'Invalid model string: {invalid_model_string}' + ): + ApigeeLlm(model=invalid_model_string, proxy_url=PROXY_URL) diff --git a/tests/unittests/models/test_cache_metadata.py b/tests/unittests/models/test_cache_metadata.py new file mode 100644 index 0000000000..496c15592f --- /dev/null +++ b/tests/unittests/models/test_cache_metadata.py @@ -0,0 +1,319 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for CacheMetadata.""" + +import time + +from google.adk.models.cache_metadata import CacheMetadata +from pydantic import ValidationError +import pytest + + +class TestCacheMetadata: + """Test suite for CacheMetadata.""" + + def test_required_fields(self): + """Test that all required fields must be provided.""" + # Valid creation with all required fields + metadata = CacheMetadata( + cache_name="projects/123/locations/us-central1/cachedContents/456", + expire_time=time.time() + 1800, + fingerprint="abc123", + invocations_used=5, + contents_count=3, + ) + + assert ( + metadata.cache_name + == "projects/123/locations/us-central1/cachedContents/456" + ) + assert metadata.expire_time > time.time() + assert metadata.fingerprint == "abc123" + assert metadata.invocations_used == 5 + assert metadata.contents_count == 3 + assert metadata.created_at is None # Optional field + + def test_optional_created_at(self): + """Test that created_at is optional.""" + current_time = time.time() + + metadata = CacheMetadata( + cache_name="projects/123/locations/us-central1/cachedContents/456", + expire_time=time.time() + 1800, + fingerprint="abc123", + invocations_used=3, + contents_count=2, + created_at=current_time, + ) + + assert metadata.created_at == current_time + + def test_invocations_used_validation(self): + """Test invocations_used validation constraints.""" + # Valid: zero or positive + metadata = CacheMetadata( + cache_name="projects/123/locations/us-central1/cachedContents/456", + expire_time=time.time() + 1800, + fingerprint="abc123", + invocations_used=0, + contents_count=1, + ) + assert metadata.invocations_used == 0 + + metadata = CacheMetadata( + cache_name="projects/123/locations/us-central1/cachedContents/456", + expire_time=time.time() + 1800, + fingerprint="abc123", + invocations_used=10, + contents_count=1, + ) + assert metadata.invocations_used == 10 + + # Invalid: negative + with pytest.raises(ValidationError) as exc_info: + CacheMetadata( + cache_name="projects/123/locations/us-central1/cachedContents/456", + expire_time=time.time() + 1800, + fingerprint="abc123", + invocations_used=-1, + contents_count=1, + ) + assert "greater than or equal to 0" in str(exc_info.value) + + def test_contents_count_validation(self): + """Test contents_count validation constraints.""" + # Valid: zero or positive + metadata = CacheMetadata( + cache_name="projects/123/locations/us-central1/cachedContents/456", + expire_time=time.time() + 1800, + fingerprint="abc123", + invocations_used=1, + contents_count=0, + ) + assert metadata.contents_count == 0 + + metadata = CacheMetadata( + cache_name="projects/123/locations/us-central1/cachedContents/456", + expire_time=time.time() + 1800, + fingerprint="abc123", + invocations_used=1, + contents_count=10, + ) + assert metadata.contents_count == 10 + + # Invalid: negative + with pytest.raises(ValidationError) as exc_info: + CacheMetadata( + cache_name="projects/123/locations/us-central1/cachedContents/456", + expire_time=time.time() + 1800, + fingerprint="abc123", + invocations_used=1, + contents_count=-1, + ) + assert "greater than or equal to 0" in str(exc_info.value) + + def test_expire_soon_property(self): + """Test expire_soon property.""" + # Cache that expires in 10 minutes (should not expire soon) + future_time = time.time() + 600 # 10 minutes + metadata = CacheMetadata( + cache_name="projects/123/locations/us-central1/cachedContents/456", + expire_time=future_time, + fingerprint="abc123", + invocations_used=1, + contents_count=1, + ) + assert not metadata.expire_soon + + # Cache that expires in 1 minute (should expire soon) + soon_time = time.time() + 60 # 1 minute + metadata = CacheMetadata( + cache_name="projects/123/locations/us-central1/cachedContents/456", + expire_time=soon_time, + fingerprint="abc123", + invocations_used=1, + contents_count=1, + ) + assert metadata.expire_soon + + def test_str_representation(self): + """Test string representation.""" + current_time = time.time() + expire_time = current_time + 1800 # 30 minutes + + metadata = CacheMetadata( + cache_name="projects/123/locations/us-central1/cachedContents/test456", + expire_time=expire_time, + fingerprint="abc123", + invocations_used=7, + contents_count=4, + ) + + str_repr = str(metadata) + assert "test456" in str_repr # Cache ID + assert "used 7 invocations" in str_repr + assert "cached 4 contents" in str_repr + assert "expires in" in str_repr + + def test_immutability(self): + """Test that CacheMetadata is immutable (frozen).""" + metadata = CacheMetadata( + cache_name="projects/123/locations/us-central1/cachedContents/456", + expire_time=time.time() + 1800, + fingerprint="abc123", + invocations_used=5, + contents_count=3, + ) + + # Should not be able to modify fields + with pytest.raises(ValidationError): + metadata.invocations_used = 10 + + def test_model_config(self): + """Test that model config is set correctly.""" + metadata = CacheMetadata( + cache_name="projects/123/locations/us-central1/cachedContents/456", + expire_time=time.time() + 1800, + fingerprint="abc123", + invocations_used=5, + contents_count=3, + ) + + assert metadata.model_config["extra"] == "forbid" + assert metadata.model_config["frozen"] == True + + def test_field_descriptions(self): + """Test that fields have proper descriptions.""" + metadata = CacheMetadata( + cache_name="projects/123/locations/us-central1/cachedContents/456", + expire_time=time.time() + 1800, + fingerprint="abc123", + invocations_used=5, + contents_count=3, + ) + schema = metadata.model_json_schema() + + assert "invocations_used" in schema["properties"] + assert ( + "Number of invocations" + in schema["properties"]["invocations_used"]["description"] + ) + + assert "contents_count" in schema["properties"] + assert ( + "Number of contents" + in schema["properties"]["contents_count"]["description"] + ) + + def test_realistic_cache_scenarios(self): + """Test realistic cache scenarios.""" + current_time = time.time() + + # Fresh cache + fresh_cache = CacheMetadata( + cache_name="projects/123/locations/us-central1/cachedContents/fresh123", + expire_time=current_time + 1800, + fingerprint="fresh_fingerprint", + invocations_used=1, + contents_count=5, + created_at=current_time, + ) + assert fresh_cache.invocations_used == 1 + assert not fresh_cache.expire_soon + + # Well-used cache + used_cache = CacheMetadata( + cache_name="projects/123/locations/us-central1/cachedContents/used456", + expire_time=current_time + 600, + fingerprint="used_fingerprint", + invocations_used=8, + contents_count=3, + created_at=current_time - 1200, + ) + assert used_cache.invocations_used == 8 + + # Expiring cache + expiring_cache = CacheMetadata( + cache_name=( + "projects/123/locations/us-central1/cachedContents/expiring789" + ), + expire_time=current_time + 60, # 1 minute + fingerprint="expiring_fingerprint", + invocations_used=15, + contents_count=10, + ) + assert expiring_cache.expire_soon + + def test_cache_name_extraction(self): + """Test cache name ID extraction in string representation.""" + metadata = CacheMetadata( + cache_name=( + "projects/123/locations/us-central1/cachedContents/extracted_id" + ), + expire_time=time.time() + 1800, + fingerprint="abc123", + invocations_used=1, + contents_count=2, + ) + + str_repr = str(metadata) + assert "extracted_id" in str_repr + + def test_no_performance_metrics(self): + """Test that performance metrics are not in CacheMetadata.""" + metadata = CacheMetadata( + cache_name="projects/123/locations/us-central1/cachedContents/456", + expire_time=time.time() + 1800, + fingerprint="abc123", + invocations_used=5, + contents_count=3, + ) + + # Verify that token counts are NOT in CacheMetadata + # (they should be in LlmResponse.usage_metadata) + assert not hasattr(metadata, "cached_tokens") + assert not hasattr(metadata, "total_tokens") + assert not hasattr(metadata, "prompt_tokens") + + def test_missing_required_fields(self): + """Test validation when truly required fields are missing.""" + # Only fingerprint and contents_count are required now + # Other fields are optional (for fingerprint-only state) + required_fields = [ + "fingerprint", + "contents_count", + ] + + base_args = { + "fingerprint": "abc123", + "contents_count": 2, + } + + for field in required_fields: + args = base_args.copy() + del args[field] + + with pytest.raises(ValidationError): + CacheMetadata(**args) + + # Test that optional fields can be omitted (fingerprint-only state) + metadata = CacheMetadata( + fingerprint="abc123", + contents_count=5, + ) + assert metadata.cache_name is None + assert metadata.expire_time is None + assert metadata.invocations_used is None + assert metadata.created_at is None diff --git a/tests/unittests/models/test_gemini_llm_connection.py b/tests/unittests/models/test_gemini_llm_connection.py index 2327115033..7710cce980 100644 --- a/tests/unittests/models/test_gemini_llm_connection.py +++ b/tests/unittests/models/test_gemini_llm_connection.py @@ -109,3 +109,73 @@ async def test_close(gemini_connection, mock_gemini_session): await gemini_connection.close() mock_gemini_session.close.assert_called_once() + + +@pytest.mark.asyncio +async def test_receive_usage_metadata_and_server_content( + gemini_connection, mock_gemini_session +): + """Test receive with usage metadata and server content in one message.""" + usage_metadata = types.UsageMetadata( + prompt_token_count=10, + cached_content_token_count=5, + response_token_count=20, + total_token_count=35, + thoughts_token_count=2, + prompt_tokens_details=[ + types.ModalityTokenCount(modality='text', token_count=10) + ], + cache_tokens_details=[ + types.ModalityTokenCount(modality='text', token_count=5) + ], + response_tokens_details=[ + types.ModalityTokenCount(modality='text', token_count=20) + ], + ) + mock_content = types.Content( + role='model', parts=[types.Part.from_text(text='response text')] + ) + mock_server_content = mock.Mock() + mock_server_content.model_turn = mock_content + mock_server_content.interrupted = False + mock_server_content.input_transcription = None + mock_server_content.output_transcription = None + mock_server_content.turn_complete = False + + mock_message = mock.AsyncMock() + mock_message.usage_metadata = usage_metadata + mock_message.server_content = mock_server_content + mock_message.tool_call = None + mock_message.session_resumption_update = None + + async def mock_receive_generator(): + yield mock_message + + receive_mock = mock.Mock(return_value=mock_receive_generator()) + mock_gemini_session.receive = receive_mock + + responses = [resp async for resp in gemini_connection.receive()] + + assert responses + + usage_response = next((r for r in responses if r.usage_metadata), None) + assert usage_response is not None + content_response = next((r for r in responses if r.content), None) + assert content_response is not None + + expected_usage = types.GenerateContentResponseUsageMetadata( + prompt_token_count=10, + cached_content_token_count=5, + candidates_token_count=None, + total_token_count=35, + thoughts_token_count=2, + prompt_tokens_details=[ + types.ModalityTokenCount(modality='text', token_count=10) + ], + cache_tokens_details=[ + types.ModalityTokenCount(modality='text', token_count=5) + ], + candidates_tokens_details=None, + ) + assert usage_response.usage_metadata == expected_usage + assert content_response.content == mock_content diff --git a/tests/unittests/models/test_gemma_llm.py b/tests/unittests/models/test_gemma_llm.py new file mode 100644 index 0000000000..2cf98306b9 --- /dev/null +++ b/tests/unittests/models/test_gemma_llm.py @@ -0,0 +1,506 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from google.adk.models.gemma_llm import Gemma +from google.adk.models.llm_request import LlmRequest +from google.adk.models.llm_response import LlmResponse +from google.genai import types +from google.genai.types import Content +from google.genai.types import Part +import pytest + + +@pytest.fixture +def llm_request(): + return LlmRequest( + model="gemma-3-4b-it", + contents=[Content(role="user", parts=[Part.from_text(text="Hello")])], + config=types.GenerateContentConfig( + temperature=0.1, + response_modalities=[types.Modality.TEXT], + system_instruction="You are a helpful assistant", + ), + ) + + +@pytest.fixture +def llm_request_with_duplicate_instruction(): + return LlmRequest( + model="gemma-3-1b-it", + contents=[ + Content( + role="user", + parts=[Part.from_text(text="Talk like a pirate.")], + ), + Content(role="user", parts=[Part.from_text(text="Hello")]), + ], + config=types.GenerateContentConfig( + response_modalities=[types.Modality.TEXT], + system_instruction="Talk like a pirate.", + ), + ) + + +@pytest.fixture +def llm_request_with_tools(): + return LlmRequest( + model="gemma-3-1b-it", + contents=[Content(role="user", parts=[Part.from_text(text="Hello")])], + config=types.GenerateContentConfig( + tools=[ + types.Tool( + function_declarations=[ + types.FunctionDeclaration( + name="search_web", + description="Search the web for a query.", + parameters=types.Schema( + type=types.Type.OBJECT, + properties={ + "query": types.Schema(type=types.Type.STRING) + }, + required=["query"], + ), + ), + types.FunctionDeclaration( + name="get_current_time", + description="Gets the current time.", + parameters=types.Schema( + type=types.Type.OBJECT, properties={} + ), + ), + ] + ) + ], + ), + ) + + +@pytest.mark.asyncio +async def test_not_gemma_model(): + llm = Gemma() + llm_request_bad_model = LlmRequest( + model="not-a-gemma-model", + ) + with pytest.raises(AssertionError, match=r".*model.*"): + async for _ in llm.generate_content_async(llm_request_bad_model): + pass + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "llm_request", + ["llm_request", "llm_request_with_duplicate_instruction"], + indirect=True, +) +async def test_preprocess_request(llm_request): + llm = Gemma() + want_content_text = llm_request.config.system_instruction + + await llm._preprocess_request(llm_request) + + # system instruction should be cleared + assert not llm_request.config.system_instruction + # should be two content bits now (deduped, if needed) + assert len(llm_request.contents) == 2 + # first message in contents should be "user": + assert llm_request.contents[0].role == "user" + assert llm_request.contents[0].parts[0].text == want_content_text + + +@pytest.mark.asyncio +async def test_preprocess_request_with_tools(llm_request_with_tools): + + gemma = Gemma() + await gemma._preprocess_request(llm_request_with_tools) + + assert not llm_request_with_tools.config.tools + + # The original user content should now be the second item + assert llm_request_with_tools.contents[1].role == "user" + assert llm_request_with_tools.contents[1].parts[0].text == "Hello" + + sys_instruct_text = llm_request_with_tools.contents[0].parts[0].text + assert sys_instruct_text is not None + assert "You have access to the following functions" in sys_instruct_text + assert ( + """{"description":"Search the web for a query.","name":"search_web",""" + in sys_instruct_text + ) + assert ( + """{"description":"Gets the current time.","name":"get_current_time","parameters":{"properties":{}""" + in sys_instruct_text + ) + + +@pytest.mark.asyncio +async def test_preprocess_request_with_function_response(): + # Simulate an LlmRequest with a function response + func_response_data = types.FunctionResponse( + name="search_web", response={"results": [{"title": "ADK"}]} + ) + llm_request = LlmRequest( + model="gemma-3-1b-it", + contents=[ + types.Content( + role="model", + parts=[types.Part(function_response=func_response_data)], + ) + ], + config=types.GenerateContentConfig(), + ) + + gemma = Gemma() + await gemma._preprocess_request(llm_request) + + # Assertions: function response converted to user role text content + assert llm_request.contents + assert len(llm_request.contents) == 1 + assert llm_request.contents[0].role == "user" + assert llm_request.contents[0].parts + assert ( + llm_request.contents[0].parts[0].text + == 'Invoking tool `search_web` produced: `{"results": [{"title":' + ' "ADK"}]}`.' + ) + assert llm_request.contents[0].parts[0].function_response is None + assert llm_request.contents[0].parts[0].function_call is None + + +@pytest.mark.asyncio +async def test_preprocess_request_with_function_call(): + func_call_data = types.FunctionCall(name="get_current_time", args={}) + llm_request = LlmRequest( + model="gemma-3-1b-it", + contents=[ + types.Content( + role="user", parts=[types.Part(function_call=func_call_data)] + ) + ], + ) + + gemma = Gemma() + await gemma._preprocess_request(llm_request) + + assert len(llm_request.contents) == 1 + assert llm_request.contents[0].role == "model" + expected_text = func_call_data.model_dump_json(exclude_none=True) + assert llm_request.contents[0].parts + got_part = llm_request.contents[0].parts[0] + assert got_part.text == expected_text + assert got_part.function_call is None + assert got_part.function_response is None + + +@pytest.mark.asyncio +async def test_preprocess_request_with_mixed_content(): + func_call = types.FunctionCall(name="get_weather", args={"city": "London"}) + func_response = types.FunctionResponse( + name="get_weather", response={"temp": "15C"} + ) + + llm_request = LlmRequest( + model="gemma-3-1b-it", + contents=[ + types.Content( + role="user", parts=[types.Part.from_text(text="Hello!")] + ), + types.Content( + role="model", parts=[types.Part(function_call=func_call)] + ), + types.Content( + role="some_function", + parts=[types.Part(function_response=func_response)], + ), + types.Content( + role="user", parts=[types.Part.from_text(text="How are you?")] + ), + ], + ) + + gemma = Gemma() + await gemma._preprocess_request(llm_request) + + # Assertions + assert len(llm_request.contents) == 4 + + # First part: original user text + assert llm_request.contents[0].role == "user" + assert llm_request.contents[0].parts + assert llm_request.contents[0].parts[0].text == "Hello!" + + # Second part: function call converted to model text + assert llm_request.contents[1].role == "model" + assert llm_request.contents[1].parts + assert llm_request.contents[1].parts[0].text == func_call.model_dump_json( + exclude_none=True + ) + + # Third part: function response converted to user text + assert llm_request.contents[2].role == "user" + assert llm_request.contents[2].parts + assert ( + llm_request.contents[2].parts[0].text + == 'Invoking tool `get_weather` produced: `{"temp": "15C"}`.' + ) + + # Fourth part: original user text + assert llm_request.contents[3].role == "user" + assert llm_request.contents[3].parts + assert llm_request.contents[3].parts[0].text == "How are you?" + + +def test_process_response(): + # Simulate a response from Gemma that should be converted to a FunctionCall + json_function_call_str = ( + '{"name": "search_web", "parameters": {"query": "latest news"}}' + ) + llm_response = LlmResponse( + content=Content( + role="model", parts=[Part.from_text(text=json_function_call_str)] + ) + ) + + gemma = Gemma() + gemma._extract_function_calls_from_response(llm_response=llm_response) + + # Assert that the content was transformed into a FunctionCall + assert llm_response.content + assert llm_response.content.parts + assert len(llm_response.content.parts) == 1 + part = llm_response.content.parts[0] + assert part.function_call is not None + assert part.function_call.name == "search_web" + assert part.function_call.args == {"query": "latest news"} + # Assert that the entire part matches the expected structure + expected_function_call = types.FunctionCall( + name="search_web", args={"query": "latest news"} + ) + expected_part = Part(function_call=expected_function_call) + assert part == expected_part + assert part.text is None # Ensure text part is cleared + + +def test_process_response_invalid_json_text(): + # Simulate a response with plain text that is not JSON + original_text = "This is a regular text response." + llm_response = LlmResponse( + content=Content(role="model", parts=[Part.from_text(text=original_text)]) + ) + + gemma = Gemma() + gemma._extract_function_calls_from_response(llm_response=llm_response) + + # Assert that the content remains unchanged + assert llm_response.content + assert llm_response.content.parts + assert len(llm_response.content.parts) == 1 + assert llm_response.content.parts[0].text == original_text + assert llm_response.content.parts[0].function_call is None + + +def test_process_response_malformed_json(): + # Simulate a response with valid JSON but not in the function call format + malformed_json_str = '{"not_a_function": "value", "another_field": 123}' + llm_response = LlmResponse( + content=Content( + role="model", parts=[Part.from_text(text=malformed_json_str)] + ) + ) + gemma = Gemma() + gemma._extract_function_calls_from_response(llm_response=llm_response) + + # Assert that the content remains unchanged because it doesn't match the expected schema + assert llm_response.content + assert llm_response.content.parts + assert len(llm_response.content.parts) == 1 + assert llm_response.content.parts[0].text == malformed_json_str + assert llm_response.content.parts[0].function_call is None + + +def test_process_response_empty_content_or_multiple_parts(): + gemma = Gemma() + + # Test case 1: LlmResponse with no content + llm_response_no_content = LlmResponse(content=None) + gemma._extract_function_calls_from_response( + llm_response=llm_response_no_content + ) + assert llm_response_no_content.content is None + + # Test case 2: LlmResponse with empty parts list + llm_response_empty_parts = LlmResponse( + content=Content(role="model", parts=[]) + ) + gemma._extract_function_calls_from_response( + llm_response=llm_response_empty_parts + ) + assert llm_response_empty_parts.content + assert not llm_response_empty_parts.content.parts + + # Test case 3: LlmResponse with multiple parts + llm_response_multiple_parts = LlmResponse( + content=Content( + role="model", + parts=[ + Part.from_text(text="part one"), + Part.from_text(text="part two"), + ], + ) + ) + original_parts = list( + llm_response_multiple_parts.content.parts + ) # Copy for comparison + gemma._extract_function_calls_from_response( + llm_response=llm_response_multiple_parts + ) + assert llm_response_multiple_parts.content + assert ( + llm_response_multiple_parts.content.parts == original_parts + ) # Should remain unchanged + + # Test case 4: LlmResponse with one part, but empty text + llm_response_empty_text_part = LlmResponse( + content=Content(role="model", parts=[Part.from_text(text="")]) + ) + gemma._extract_function_calls_from_response( + llm_response=llm_response_empty_text_part + ) + assert llm_response_empty_text_part.content + assert llm_response_empty_text_part.content.parts + assert llm_response_empty_text_part.content.parts[0].text == "" + assert llm_response_empty_text_part.content.parts[0].function_call is None + + +def test_process_response_with_markdown_json_block(): + # Simulate a response from Gemma with a JSON function call in a markdown block + json_function_call_str = """ +```json +{"name": "search_web", "parameters": {"query": "latest news"}} +```""" + llm_response = LlmResponse( + content=Content( + role="model", parts=[Part.from_text(text=json_function_call_str)] + ) + ) + + gemma = Gemma() + gemma._extract_function_calls_from_response(llm_response) + + assert llm_response.content + assert llm_response.content.parts + assert len(llm_response.content.parts) == 1 + part = llm_response.content.parts[0] + assert part.function_call is not None + assert part.function_call.name == "search_web" + assert part.function_call.args == {"query": "latest news"} + assert part.text is None + + +def test_process_response_with_markdown_tool_code_block(): + # Simulate a response from Gemma with a JSON function call in a 'tool_code' markdown block + json_function_call_str = """ +Some text before. +```tool_code +{"name": "get_current_time", "parameters": {}} +``` +And some text after.""" + llm_response = LlmResponse( + content=Content( + role="model", parts=[Part.from_text(text=json_function_call_str)] + ) + ) + + gemma = Gemma() + gemma._extract_function_calls_from_response(llm_response) + + assert llm_response.content + assert llm_response.content.parts + assert len(llm_response.content.parts) == 1 + part = llm_response.content.parts[0] + assert part.function_call is not None + assert part.function_call.name == "get_current_time" + assert part.function_call.args == {} + assert part.text is None + + +def test_process_response_with_embedded_json(): + # Simulate a response with valid JSON embedded in text + embedded_json_str = ( + 'Please call the tool: {"name": "search_web", "parameters": {"query":' + ' "new features"}} thanks!' + ) + llm_response = LlmResponse( + content=Content( + role="model", parts=[Part.from_text(text=embedded_json_str)] + ) + ) + + gemma = Gemma() + gemma._extract_function_calls_from_response(llm_response) + + assert llm_response.content + assert llm_response.content.parts + assert len(llm_response.content.parts) == 1 + part = llm_response.content.parts[0] + assert part.function_call is not None + assert part.function_call.name == "search_web" + assert part.function_call.args == {"query": "new features"} + assert part.text is None + + +def test_process_response_flexible_parsing(): + # Test with "function" and "args" keys as supported by GemmaFunctionCallModel + flexible_json_str = '{"function": "do_something", "args": {"value": 123}}' + llm_response = LlmResponse( + content=Content( + role="model", parts=[Part.from_text(text=flexible_json_str)] + ) + ) + + gemma = Gemma() + gemma._extract_function_calls_from_response(llm_response) + + assert llm_response.content + assert llm_response.content.parts + assert len(llm_response.content.parts) == 1 + part = llm_response.content.parts[0] + assert part.function_call is not None + assert part.function_call.name == "do_something" + assert part.function_call.args == {"value": 123} + assert part.text is None + + +def test_process_response_last_json_object(): + # Simulate a response with multiple JSON objects, ensuring the last valid one is picked + multiple_json_str = ( + 'I thought about {"name": "first_call", "parameters": {"a": 1}} but then' + ' decided to call: {"name": "second_call", "parameters": {"b": 2}}' + ) + llm_response = LlmResponse( + content=Content( + role="model", parts=[Part.from_text(text=multiple_json_str)] + ) + ) + + gemma = Gemma() + gemma._extract_function_calls_from_response(llm_response) + + assert llm_response.content + assert llm_response.content.parts + assert len(llm_response.content.parts) == 1 + part = llm_response.content.parts[0] + assert part.function_call is not None + assert part.function_call.name == "second_call" + assert part.function_call.args == {"b": 2} + assert part.text is None diff --git a/tests/unittests/models/test_google_llm.py b/tests/unittests/models/test_google_llm.py index e37f856e4a..f3356975f5 100644 --- a/tests/unittests/models/test_google_llm.py +++ b/tests/unittests/models/test_google_llm.py @@ -19,9 +19,12 @@ from unittest.mock import AsyncMock from google.adk import version as adk_version +from google.adk.agents.context_cache_config import ContextCacheConfig +from google.adk.models.cache_metadata import CacheMetadata from google.adk.models.gemini_llm_connection import GeminiLlmConnection from google.adk.models.google_llm import _AGENT_ENGINE_TELEMETRY_ENV_VARIABLE_NAME from google.adk.models.google_llm import _AGENT_ENGINE_TELEMETRY_TAG +from google.adk.models.google_llm import _build_request_log from google.adk.models.google_llm import Gemini from google.adk.models.llm_request import LlmRequest from google.adk.models.llm_response import LlmResponse @@ -84,6 +87,37 @@ def llm_request(): ) +@pytest.fixture +def cache_metadata(): + import time + + return CacheMetadata( + cache_name="projects/test/locations/us-central1/cachedContents/test123", + expire_time=time.time() + 3600, + fingerprint="test_fingerprint", + invocations_used=2, + contents_count=3, + created_at=time.time() - 600, + ) + + +@pytest.fixture +def llm_request_with_cache(cache_metadata): + return LlmRequest( + model="gemini-1.5-flash", + contents=[Content(role="user", parts=[Part.from_text(text="Hello")])], + config=types.GenerateContentConfig( + temperature=0.1, + response_modalities=[types.Modality.TEXT], + system_instruction="You are a helpful assistant", + ), + cache_config=ContextCacheConfig( + cache_intervals=10, ttl_seconds=3600, min_tokens=100 + ), + cache_metadata=cache_metadata, + ) + + @pytest.fixture def llm_request_with_computer_use(): return LlmRequest( @@ -95,7 +129,7 @@ def llm_request_with_computer_use(): system_instruction="You are a helpful assistant", tools=[ types.Tool( - computer_use=types.ToolComputerUse( + computer_use=types.ComputerUse( environment=types.Environment.ENVIRONMENT_BROWSER ) ) @@ -1455,7 +1489,7 @@ async def test_computer_use_removes_system_instruction(): system_instruction="You are a helpful assistant", tools=[ types.Tool( - computer_use=types.ToolComputerUse( + computer_use=types.ComputerUse( environment=types.Environment.ENVIRONMENT_BROWSER ) ) @@ -1600,3 +1634,413 @@ async def test_adapt_computer_use_tool_no_wait(): # Verify tools_dict is unchanged assert llm_request.tools_dict == original_tools_dict assert "wait_5_seconds" not in llm_request.tools_dict + + +@pytest.mark.asyncio +async def test_generate_content_async_with_cache_metadata_integration( + gemini_llm, llm_request_with_cache, cache_metadata +): + """Test integration between Google LLM and cache manager with proper parameter order. + + This test specifically validates that the cache manager's populate_cache_metadata_in_response + method is called with the correct parameter order: (llm_response, cache_metadata). + + This test would have caught the parameter order bug where cache_metadata and llm_response + were passed in the wrong order, causing 'CacheMetadata' object has no attribute 'usage_metadata' errors. + """ + + # Create a mock response with usage metadata including cached tokens + generate_content_response = types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=Content( + role="model", + parts=[Part.from_text(text="Hello, how can I help you?")], + ), + finish_reason=types.FinishReason.STOP, + ) + ], + usage_metadata=types.GenerateContentResponseUsageMetadata( + prompt_token_count=1500, + candidates_token_count=150, + cached_content_token_count=800, # This is the key field that was always 0 due to the bug + total_token_count=1650, + ), + ) + + with mock.patch.object(gemini_llm, "api_client") as mock_client: + # Create a mock coroutine that returns the generate_content_response + async def mock_coro(): + return generate_content_response + + mock_client.aio.models.generate_content.return_value = mock_coro() + + # Mock the cache manager module to verify correct method call + with mock.patch( + "google.adk.models.gemini_context_cache_manager.GeminiContextCacheManager" + ) as MockCacheManagerClass: + mock_cache_manager = MockCacheManagerClass.return_value + # Configure cache manager to handle context caching + mock_cache_manager.handle_context_caching = AsyncMock( + return_value=cache_metadata + ) + + responses = [ + resp + async for resp in gemini_llm.generate_content_async( + llm_request_with_cache, stream=False + ) + ] + + # Verify the response was processed + assert len(responses) == 1 + response = responses[0] + assert isinstance(response, LlmResponse) + assert response.content.parts[0].text == "Hello, how can I help you?" + + # CRITICAL TEST: Verify populate_cache_metadata_in_response was called with correct parameter order + mock_cache_manager.populate_cache_metadata_in_response.assert_called_once() + call_args = ( + mock_cache_manager.populate_cache_metadata_in_response.call_args + ) + + # The first argument should be the LlmResponse (not CacheMetadata) + first_arg = call_args[0][0] # First positional argument + second_arg = call_args[0][1] # Second positional argument + + # Verify correct parameter order: (llm_response, cache_metadata) + assert isinstance(first_arg, LlmResponse), ( + f"First parameter should be LlmResponse, got {type(first_arg)}. " + "This indicates parameters are in wrong order." + ) + assert isinstance(second_arg, CacheMetadata), ( + f"Second parameter should be CacheMetadata, got {type(second_arg)}. " + "This indicates parameters are in wrong order." + ) + + # Verify the LlmResponse has the expected usage metadata + assert first_arg.usage_metadata is not None + assert first_arg.usage_metadata.cached_content_token_count == 800 + assert first_arg.usage_metadata.prompt_token_count == 1500 + assert first_arg.usage_metadata.candidates_token_count == 150 + + # Verify cache metadata is preserved + assert second_arg.cache_name == cache_metadata.cache_name + assert second_arg.invocations_used == cache_metadata.invocations_used + + +def test_build_request_log_with_config_multiple_tool_types(): + """Test that _build_request_log includes config with multiple tool types.""" + func_decl = types.FunctionDeclaration( + name="test_function", + description="A test function", + parameters={"type": "object", "properties": {}}, + ) + + tool = types.Tool( + function_declarations=[func_decl], + google_search=types.GoogleSearch(), + code_execution=types.ToolCodeExecution(), + ) + + llm_request = LlmRequest( + model="gemini-1.5-flash", + contents=[Content(role="user", parts=[Part.from_text(text="Hello")])], + config=types.GenerateContentConfig( + temperature=0.7, + max_output_tokens=500, + system_instruction="You are a helpful assistant", + tools=[tool], + ), + ) + + log_output = _build_request_log(llm_request) + + # Verify config section exists + assert "Config:" in log_output + + # Verify config contains expected fields (using Python dict format with single quotes) + assert "'temperature': 0.7" in log_output + assert "'max_output_tokens': 500" in log_output + + # Verify config contains other tool types (not function_declarations) + assert "'google_search'" in log_output + assert "'code_execution'" in log_output + + # Verify function_declarations is NOT in config section + # (it should only be in the Functions section) + config_section = log_output.split("Functions:")[0] + assert "'function_declarations'" not in config_section + + # Verify function is in Functions section + assert "Functions:" in log_output + assert "test_function" in log_output + + # Verify system instruction is NOT in config section + assert ( + "'system_instruction'" + not in log_output.split("Contents:")[0].split("Config:")[1] + ) + + +def test_build_request_log_function_declarations_in_second_tool(): + """Test that function_declarations in non-first tool are handled correctly.""" + func_decl = types.FunctionDeclaration( + name="my_function", + description="A test function", + parameters={"type": "object", "properties": {}}, + ) + + # First tool has only google_search + tool1 = types.Tool(google_search=types.GoogleSearch()) + + # Second tool has function_declarations + tool2 = types.Tool( + function_declarations=[func_decl], + code_execution=types.ToolCodeExecution(), + ) + + llm_request = LlmRequest( + model="gemini-1.5-flash", + contents=[Content(role="user", parts=[Part.from_text(text="Hello")])], + config=types.GenerateContentConfig( + temperature=0.5, + system_instruction="You are a helpful assistant", + tools=[tool1, tool2], + ), + ) + + log_output = _build_request_log(llm_request) + + # Verify function is in Functions section + assert "Functions:" in log_output + assert "my_function" in log_output + + # Verify function_declarations is NOT in config section + config_section = log_output.split("Functions:")[0] + assert "'function_declarations'" not in config_section + + # Verify both tools are in config but without function_declarations (Python dict format) + assert "'google_search'" in log_output + assert "'code_execution'" in log_output + + # Verify config has the expected structure without parsing + config_section = log_output.split("Config:")[1].split("---")[0] + # Should have 2 tools (two dict entries in the tools list) + assert config_section.count("'google_search'") == 1 + assert config_section.count("'code_execution'") == 1 + # Function declarations should NOT be in config section + assert "'function_declarations'" not in config_section + + +def test_build_request_log_fallback_to_repr_on_all_failures(monkeypatch): + """Test that _build_request_log falls back to repr() if model_dump fails.""" + + llm_request = LlmRequest( + model="gemini-1.5-flash", + contents=[Content(role="user", parts=[Part.from_text(text="Hello")])], + config=types.GenerateContentConfig( + temperature=0.7, + system_instruction="You are a helpful assistant", + ), + ) + + # Mock model_dump at class level to raise exception + def mock_model_dump(*args, **kwargs): + raise Exception("dump failed") + + monkeypatch.setattr( + types.GenerateContentConfig, "model_dump", mock_model_dump + ) + + log_output = _build_request_log(llm_request) + + # Should still succeed using repr() + assert "Config:" in log_output + assert "GenerateContentConfig" in log_output + + +@pytest.mark.asyncio +async def test_connect_uses_gemini_speech_config_when_request_is_none( + gemini_llm, llm_request +): + """Tests that Gemini's speech_config is used when live_connect_config's is None.""" + # Arrange: Set a speech_config on the Gemini instance with the voice "Kore" + gemini_llm.speech_config = types.SpeechConfig( + voice_config=types.VoiceConfig( + prebuilt_voice_config=types.PrebuiltVoiceConfig( + voice_name="Kore", + ) + ) + ) + llm_request.live_connect_config = ( + types.LiveConnectConfig() + ) # speech_config is None + + mock_live_session = mock.AsyncMock() + + with mock.patch.object(gemini_llm, "_live_api_client") as mock_live_client: + + class MockLiveConnect: + + async def __aenter__(self): + return mock_live_session + + async def __aexit__(self, *args): + pass + + mock_live_client.aio.live.connect.return_value = MockLiveConnect() + + # Act + async with gemini_llm.connect(llm_request) as connection: + # Assert + mock_live_client.aio.live.connect.assert_called_once() + call_args = mock_live_client.aio.live.connect.call_args + config_arg = call_args.kwargs["config"] + + # Verify the speech_config from the Gemini instance was used + assert config_arg.speech_config is not None + assert ( + config_arg.speech_config.voice_config.prebuilt_voice_config.voice_name + == "Kore" + ) + assert isinstance(connection, GeminiLlmConnection) + + +@pytest.mark.asyncio +async def test_connect_uses_request_speech_config_when_gemini_is_none( + gemini_llm, llm_request +): + """Tests that request's speech_config is used when Gemini's is None.""" + # Arrange: Set a speech_config on the request instance with the voice "Kore" + gemini_llm.speech_config = None + request_speech_config = types.SpeechConfig( + voice_config=types.VoiceConfig( + prebuilt_voice_config=types.PrebuiltVoiceConfig( + voice_name="Kore", + ) + ) + ) + llm_request.live_connect_config = types.LiveConnectConfig( + speech_config=request_speech_config + ) + + mock_live_session = mock.AsyncMock() + + with mock.patch.object(gemini_llm, "_live_api_client") as mock_live_client: + + class MockLiveConnect: + + async def __aenter__(self): + return mock_live_session + + async def __aexit__(self, *args): + pass + + mock_live_client.aio.live.connect.return_value = MockLiveConnect() + + # Act + async with gemini_llm.connect(llm_request) as connection: + # Assert + mock_live_client.aio.live.connect.assert_called_once() + call_args = mock_live_client.aio.live.connect.call_args + config_arg = call_args.kwargs["config"] + + # Verify the speech_config from the request instance was used + assert config_arg.speech_config is not None + assert ( + config_arg.speech_config.voice_config.prebuilt_voice_config.voice_name + == "Kore" + ) + assert isinstance(connection, GeminiLlmConnection) + + +@pytest.mark.asyncio +async def test_connect_request_gemini_config_overrides_speech_config( + gemini_llm, llm_request +): + """Tests that live_connect_config's speech_config is preserved even if Gemini has one.""" + # Arrange: Set different speech_configs on both the Gemini instance ("Puck") and the request ("Zephyr") + gemini_llm.speech_config = types.SpeechConfig( + voice_config=types.VoiceConfig( + prebuilt_voice_config=types.PrebuiltVoiceConfig( + voice_name="Puck", + ) + ) + ) + request_speech_config = types.SpeechConfig( + voice_config=types.VoiceConfig( + prebuilt_voice_config=types.PrebuiltVoiceConfig( + voice_name="Zephyr", + ) + ) + ) + llm_request.live_connect_config = types.LiveConnectConfig( + speech_config=request_speech_config + ) + + mock_live_session = mock.AsyncMock() + + with mock.patch.object(gemini_llm, "_live_api_client") as mock_live_client: + + class MockLiveConnect: + + async def __aenter__(self): + return mock_live_session + + async def __aexit__(self, *args): + pass + + mock_live_client.aio.live.connect.return_value = MockLiveConnect() + + # Act + async with gemini_llm.connect(llm_request) as connection: + # Assert + mock_live_client.aio.live.connect.assert_called_once() + call_args = mock_live_client.aio.live.connect.call_args + config_arg = call_args.kwargs["config"] + + # Verify the speech_config from the request ("Zephyr") was overwritten by Gemini's speech_config ("Puck") + assert config_arg.speech_config is not None + assert ( + config_arg.speech_config.voice_config.prebuilt_voice_config.voice_name + == "Puck" + ) + assert isinstance(connection, GeminiLlmConnection) + + +@pytest.mark.asyncio +async def test_connect_speech_config_remains_none_when_both_are_none( + gemini_llm, llm_request +): + """Tests that speech_config is None when neither Gemini nor the request has it.""" + # Arrange: Ensure both Gemini instance and request have no speech_config + gemini_llm.speech_config = None + llm_request.live_connect_config = ( + types.LiveConnectConfig() + ) # speech_config is None + + mock_live_session = mock.AsyncMock() + + with mock.patch.object(gemini_llm, "_live_api_client") as mock_live_client: + + class MockLiveConnect: + + async def __aenter__(self): + return mock_live_session + + async def __aexit__(self, *args): + pass + + mock_live_client.aio.live.connect.return_value = MockLiveConnect() + + # Act + async with gemini_llm.connect(llm_request) as connection: + # Assert + mock_live_client.aio.live.connect.assert_called_once() + call_args = mock_live_client.aio.live.connect.call_args + config_arg = call_args.kwargs["config"] + + # Verify the final speech_config is still None + assert config_arg.speech_config is None + assert isinstance(connection, GeminiLlmConnection) diff --git a/tests/unittests/models/test_litellm.py b/tests/unittests/models/test_litellm.py index a46d0f7d55..aefa2c67e5 100644 --- a/tests/unittests/models/test_litellm.py +++ b/tests/unittests/models/test_litellm.py @@ -19,6 +19,7 @@ import warnings from google.adk.models.lite_llm import _content_to_message_param +from google.adk.models.lite_llm import _FINISH_REASON_MAPPING from google.adk.models.lite_llm import _function_declaration_to_tool_param from google.adk.models.lite_llm import _get_content from google.adk.models.lite_llm import _message_to_generate_content_response @@ -89,6 +90,7 @@ STREAMING_MODEL_RESPONSE = [ ModelResponse( + model="test_model", choices=[ StreamingChoices( finish_reason=None, @@ -97,9 +99,10 @@ content="zero, ", ), ) - ] + ], ), ModelResponse( + model="test_model", choices=[ StreamingChoices( finish_reason=None, @@ -108,9 +111,10 @@ content="one, ", ), ) - ] + ], ), ModelResponse( + model="test_model", choices=[ StreamingChoices( finish_reason=None, @@ -119,9 +123,10 @@ content="two:", ), ) - ] + ], ), ModelResponse( + model="test_model", choices=[ StreamingChoices( finish_reason=None, @@ -140,9 +145,10 @@ ], ), ) - ] + ], ), ModelResponse( + model="test_model", choices=[ StreamingChoices( finish_reason=None, @@ -161,14 +167,15 @@ ], ), ) - ] + ], ), ModelResponse( + model="test_model", choices=[ StreamingChoices( finish_reason="tool_use", ) - ] + ], ), ] @@ -267,9 +274,81 @@ ] +STREAM_WITH_EMPTY_CHUNK = [ + ModelResponse( + choices=[ + StreamingChoices( + finish_reason=None, + delta=Delta( + role="assistant", + tool_calls=[ + ChatCompletionDeltaToolCall( + type="function", + id="call_abc", + function=Function( + name="test_function", + arguments='{"test_arg":', + ), + index=0, + ) + ], + ), + ) + ] + ), + ModelResponse( + choices=[ + StreamingChoices( + finish_reason=None, + delta=Delta( + role="assistant", + tool_calls=[ + ChatCompletionDeltaToolCall( + type="function", + id=None, + function=Function( + name=None, + arguments=' "value"}', + ), + index=0, + ) + ], + ), + ) + ] + ), + # This is the problematic empty chunk that should be ignored. + ModelResponse( + choices=[ + StreamingChoices( + finish_reason=None, + delta=Delta( + role="assistant", + tool_calls=[ + ChatCompletionDeltaToolCall( + type="function", + id=None, + function=Function( + name=None, + arguments="", + ), + index=0, + ) + ], + ), + ) + ] + ), + ModelResponse( + choices=[StreamingChoices(finish_reason="tool_calls", delta=Delta())] + ), +] + + @pytest.fixture def mock_response(): return ModelResponse( + model="test_model", choices=[ Choices( message=ChatCompletionAssistantMessage( @@ -287,7 +366,7 @@ def mock_response(): ], ) ) - ] + ], ) @@ -457,6 +536,7 @@ async def test_generate_content_async(mock_acompletion, lite_llm_instance): "test_arg": "test_value" } assert response.content.parts[1].function_call.id == "test_tool_call_id" + assert response.model_version == "test_model" mock_acompletion.assert_called_once() @@ -477,6 +557,88 @@ async def test_generate_content_async(mock_acompletion, lite_llm_instance): ) +@pytest.mark.asyncio +async def test_generate_content_async_with_model_override( + mock_acompletion, lite_llm_instance +): + llm_request = LlmRequest( + model="overridden_model", + contents=[ + types.Content( + role="user", parts=[types.Part.from_text(text="Test prompt")] + ) + ], + ) + + async for response in lite_llm_instance.generate_content_async(llm_request): + assert response.content.role == "model" + assert response.content.parts[0].text == "Test response" + + mock_acompletion.assert_called_once() + + _, kwargs = mock_acompletion.call_args + assert kwargs["model"] == "overridden_model" + assert kwargs["messages"][0]["role"] == "user" + assert kwargs["messages"][0]["content"] == "Test prompt" + + +@pytest.mark.asyncio +async def test_generate_content_async_without_model_override( + mock_acompletion, lite_llm_instance +): + llm_request = LlmRequest( + model=None, + contents=[ + types.Content( + role="user", parts=[types.Part.from_text(text="Test prompt")] + ) + ], + ) + + async for response in lite_llm_instance.generate_content_async(llm_request): + assert response.content.role == "model" + + mock_acompletion.assert_called_once() + + _, kwargs = mock_acompletion.call_args + assert kwargs["model"] == "test_model" + + +@pytest.mark.asyncio +async def test_generate_content_async_adds_fallback_user_message( + mock_acompletion, lite_llm_instance +): + llm_request = LlmRequest( + contents=[ + types.Content( + role="user", + parts=[], + ) + ] + ) + + async for _ in lite_llm_instance.generate_content_async(llm_request): + pass + + mock_acompletion.assert_called_once() + + _, kwargs = mock_acompletion.call_args + user_messages = [ + message for message in kwargs["messages"] if message["role"] == "user" + ] + assert any( + message.get("content") + == "Handle the requests as specified in the System Instruction." + for message in user_messages + ) + assert ( + sum(1 for content in llm_request.contents if content.role == "user") == 1 + ) + assert llm_request.contents[-1].parts[0].text == ( + "Handle the requests as specified in the System Instruction." + ) + + litellm_append_user_content_test_cases = [ pytest.param( LlmRequest( @@ -901,6 +1063,7 @@ async def test_generate_content_async_with_usage_metadata( "prompt_tokens": 10, "completion_tokens": 5, "total_tokens": 15, + "cached_tokens": 8, }, ) mock_acompletion.return_value = mock_response_with_usage_metadata @@ -921,6 +1084,7 @@ async def test_generate_content_async_with_usage_metadata( assert response.usage_metadata.prompt_token_count == 10 assert response.usage_metadata.candidates_token_count == 5 assert response.usage_metadata.total_token_count == 15 + assert response.usage_metadata.cached_content_token_count == 8 mock_acompletion.assert_called_once() @@ -934,6 +1098,47 @@ def test_content_to_message_param_user_message(): assert message["content"] == "Test prompt" +def test_content_to_message_param_user_message_with_file_uri(): + file_part = types.Part.from_uri( + file_uri="gs://bucket/document.pdf", mime_type="application/pdf" + ) + content = types.Content( + role="user", + parts=[ + types.Part.from_text(text="Summarize this file."), + file_part, + ], + ) + + message = _content_to_message_param(content) + assert message["role"] == "user" + assert isinstance(message["content"], list) + assert message["content"][0]["type"] == "text" + assert message["content"][0]["text"] == "Summarize this file." + assert message["content"][1]["type"] == "file" + assert message["content"][1]["file"]["file_id"] == "gs://bucket/document.pdf" + assert "format" not in message["content"][1]["file"] + + +def test_content_to_message_param_user_message_file_uri_only(): + file_part = types.Part.from_uri( + file_uri="gs://bucket/only.pdf", mime_type="application/pdf" + ) + content = types.Content( + role="user", + parts=[ + file_part, + ], + ) + + message = _content_to_message_param(content) + assert message["role"] == "user" + assert isinstance(message["content"], list) + assert message["content"][0]["type"] == "file" + assert message["content"][0]["file"]["file_id"] == "gs://bucket/only.pdf" + assert "format" not in message["content"][0]["file"] + + def test_content_to_message_param_multi_part_function_response(): part1 = types.Part.from_function_response( name="function_one", @@ -1067,6 +1272,19 @@ def test_message_to_generate_content_response_tool_call(): assert response.content.parts[0].function_call.id == "test_tool_call_id" +def test_message_to_generate_content_response_with_model(): + message = ChatCompletionAssistantMessage( + role="assistant", + content="Test response", + ) + response = _message_to_generate_content_response( + message, model_version="gemini-2.5-pro" + ) + assert response.content.role == "model" + assert response.content.parts[0].text == "Test response" + assert response.model_version == "gemini-2.5-pro" + + def test_get_content_text(): parts = [types.Part.from_text(text="Test text")] content = _get_content(parts) @@ -1083,7 +1301,7 @@ def test_get_content_image(): content[0]["image_url"]["url"] == "data:image/png;base64,dGVzdF9pbWFnZV9kYXRh" ) - assert content[0]["image_url"]["format"] == "image/png" + assert "format" not in content[0]["image_url"] def test_get_content_video(): @@ -1096,7 +1314,7 @@ def test_get_content_video(): content[0]["video_url"]["url"] == "data:video/mp4;base64,dGVzdF92aWRlb19kYXRh" ) - assert content[0]["video_url"]["format"] == "video/mp4" + assert "format" not in content[0]["video_url"] def test_get_content_pdf(): @@ -1109,7 +1327,20 @@ def test_get_content_pdf(): content[0]["file"]["file_data"] == "data:application/pdf;base64,dGVzdF9wZGZfZGF0YQ==" ) - assert content[0]["file"]["format"] == "application/pdf" + assert "format" not in content[0]["file"] + + +def test_get_content_file_uri(): + parts = [ + types.Part.from_uri( + file_uri="gs://bucket/document.pdf", + mime_type="application/pdf", + ) + ] + content = _get_content(parts) + assert content[0]["type"] == "file" + assert content[0]["file"]["file_id"] == "gs://bucket/document.pdf" + assert "format" not in content[0]["file"] def test_get_content_audio(): @@ -1122,7 +1353,7 @@ def test_get_content_audio(): content[0]["audio_url"]["url"] == "data:audio/mpeg;base64,dGVzdF9hdWRpb19kYXRh" ) - assert content[0]["audio_url"]["format"] == "audio/mpeg" + assert "format" not in content[0]["audio_url"] def test_to_litellm_role(): @@ -1290,6 +1521,23 @@ async def test_acompletion_additional_args(mock_acompletion, mock_client): assert kwargs["api_base"] == "some://url" +@pytest.mark.asyncio +async def test_acompletion_with_drop_params(mock_acompletion, mock_client): + lite_llm_instance = LiteLlm( + model="test_model", llm_client=mock_client, drop_params=True + ) + + async for _ in lite_llm_instance.generate_content_async( + LLM_REQUEST_WITH_FUNCTION_DECLARATION + ): + pass + + mock_acompletion.assert_called_once() + + _, kwargs = mock_acompletion.call_args + assert kwargs["drop_params"] is True + + @pytest.mark.asyncio async def test_completion_additional_args(mock_completion, mock_client): lite_llm_instance = LiteLlm( @@ -1332,6 +1580,28 @@ async def test_completion_additional_args(mock_completion, mock_client): assert kwargs["api_base"] == "some://url" +@pytest.mark.asyncio +async def test_completion_with_drop_params(mock_completion, mock_client): + lite_llm_instance = LiteLlm( + model="test_model", llm_client=mock_client, drop_params=True + ) + + mock_completion.return_value = iter(STREAMING_MODEL_RESPONSE) + + responses = [ + response + async for response in lite_llm_instance.generate_content_async( + LLM_REQUEST_WITH_FUNCTION_DECLARATION, stream=True + ) + ] + assert len(responses) == 4 + + mock_completion.assert_called_once() + + _, kwargs = mock_completion.call_args + assert kwargs["drop_params"] is True + + @pytest.mark.asyncio async def test_generate_content_async_stream( mock_completion, lite_llm_instance @@ -1348,16 +1618,20 @@ async def test_generate_content_async_stream( assert len(responses) == 4 assert responses[0].content.role == "model" assert responses[0].content.parts[0].text == "zero, " + assert responses[0].model_version == "test_model" assert responses[1].content.role == "model" assert responses[1].content.parts[0].text == "one, " + assert responses[1].model_version == "test_model" assert responses[2].content.role == "model" assert responses[2].content.parts[0].text == "two:" + assert responses[2].model_version == "test_model" assert responses[3].content.role == "model" assert responses[3].content.parts[-1].function_call.name == "test_function" assert responses[3].content.parts[-1].function_call.args == { "test_arg": "test_value" } assert responses[3].content.parts[-1].function_call.id == "test_tool_call_id" + assert responses[3].model_version == "test_model" mock_completion.assert_called_once() _, kwargs = mock_completion.call_args @@ -1445,6 +1719,45 @@ async def test_generate_content_async_stream_with_usage_metadata( ) +@pytest.mark.asyncio +async def test_generate_content_async_stream_with_usage_metadata( + mock_completion, lite_llm_instance +): + """Tests that cached prompt tokens are propagated in streaming mode.""" + streaming_model_response_with_usage_metadata = [ + *STREAMING_MODEL_RESPONSE, + ModelResponse( + usage={ + "prompt_tokens": 10, + "completion_tokens": 5, + "total_tokens": 15, + "cached_tokens": 8, + }, + choices=[ + StreamingChoices( + finish_reason=None, + ) + ], + ), + ] + + mock_completion.return_value = iter( + streaming_model_response_with_usage_metadata + ) + + responses = [ + response + async for response in lite_llm_instance.generate_content_async( + LLM_REQUEST_WITH_FUNCTION_DECLARATION, stream=True + ) + ] + assert len(responses) == 4 + assert responses[3].usage_metadata.prompt_token_count == 10 + assert responses[3].usage_metadata.candidates_token_count == 5 + assert responses[3].usage_metadata.total_token_count == 15 + assert responses[3].usage_metadata.cached_content_token_count == 8 + + @pytest.mark.asyncio async def test_generate_content_async_multiple_function_calls( mock_completion, lite_llm_instance @@ -1591,6 +1904,34 @@ async def test_generate_content_async_non_compliant_multiple_function_calls( assert final_response.content.parts[1].function_call.args == {"arg": "value2"} +@pytest.mark.asyncio +async def test_generate_content_async_stream_with_empty_chunk( + mock_completion, lite_llm_instance +): + """Tests that empty tool call chunks in a stream are ignored.""" + mock_completion.return_value = iter(STREAM_WITH_EMPTY_CHUNK) + + responses = [ + response + async for response in lite_llm_instance.generate_content_async( + LLM_REQUEST_WITH_FUNCTION_DECLARATION, stream=True + ) + ] + + assert len(responses) == 1 + final_response = responses[0] + assert final_response.content.role == "model" + + # Crucially, assert that only ONE tool call was generated, + # proving the empty chunk was ignored. + assert len(final_response.content.parts) == 1 + + function_call = final_response.content.parts[0].function_call + assert function_call.name == "test_function" + assert function_call.id == "call_abc" + assert function_call.args == {"test_arg": "value"} + + @pytest.mark.asyncio def test_get_completion_inputs_generation_params(): # Test that generation_params are extracted and mapped correctly @@ -1704,6 +2045,36 @@ def test_function_declaration_to_tool_param_edge_cases(): assert "required" not in result["function"]["parameters"] +@pytest.mark.parametrize( + "usage, expected_tokens", + [ + ({"prompt_tokens_details": {"cached_tokens": 123}}, 123), + ( + { + "prompt_tokens_details": [ + {"cached_tokens": 50}, + {"cached_tokens": 25}, + ] + }, + 75, + ), + ({"cached_prompt_tokens": 45}, 45), + ({"cached_tokens": 67}, 67), + ({"prompt_tokens": 100}, 0), + ({}, 0), + ("not a dict", 0), + (None, 0), + ({"prompt_tokens_details": {"cached_tokens": "not a number"}}, 0), + (json.dumps({"cached_tokens": 89}), 89), + (json.dumps({"some_key": "some_value"}), 0), + ], +) +def test_extract_cached_prompt_tokens(usage, expected_tokens): + from google.adk.models.lite_llm import _extract_cached_prompt_tokens + + assert _extract_cached_prompt_tokens(usage) == expected_tokens + + def test_gemini_via_litellm_warning(monkeypatch): """Test that Gemini via LiteLLM shows warning.""" # Ensure environment variable is not set @@ -1750,3 +2121,113 @@ def test_non_gemini_litellm_no_warning(): # Test with non-Gemini model LiteLlm(model="openai/gpt-4o") assert len(w) == 0 + + +@pytest.mark.parametrize( + "finish_reason,response_content,expected_content,has_tool_calls", + [ + ("length", "Test response", "Test response", False), + ("stop", "Complete response", "Complete response", False), + ( + "tool_calls", + "", + "", + True, + ), + ("content_filter", "", "", False), + ], + ids=["length", "stop", "tool_calls", "content_filter"], +) +@pytest.mark.asyncio +async def test_finish_reason_propagation( + mock_acompletion, + lite_llm_instance, + finish_reason, + response_content, + expected_content, + has_tool_calls, +): + """Test that finish_reason is properly propagated from LiteLLM response.""" + tool_calls = None + if has_tool_calls: + tool_calls = [ + ChatCompletionMessageToolCall( + type="function", + id="test_id", + function=Function( + name="test_function", + arguments='{"arg": "value"}', + ), + ) + ] + + mock_response = ModelResponse( + choices=[ + Choices( + message=ChatCompletionAssistantMessage( + role="assistant", + content=response_content, + tool_calls=tool_calls, + ), + finish_reason=finish_reason, + ) + ] + ) + mock_acompletion.return_value = mock_response + + llm_request = LlmRequest( + contents=[ + types.Content( + role="user", parts=[types.Part.from_text(text="Test prompt")] + ) + ], + ) + + async for response in lite_llm_instance.generate_content_async(llm_request): + assert response.content.role == "model" + # Verify finish_reason is mapped to FinishReason enum + assert isinstance(response.finish_reason, types.FinishReason) + # Verify correct enum mapping using the actual mapping from lite_llm + assert response.finish_reason == _FINISH_REASON_MAPPING[finish_reason] + if expected_content: + assert response.content.parts[0].text == expected_content + if has_tool_calls: + assert len(response.content.parts) > 0 + assert response.content.parts[-1].function_call.name == "test_function" + + mock_acompletion.assert_called_once() + + +@pytest.mark.asyncio +async def test_finish_reason_unknown_maps_to_other( + mock_acompletion, lite_llm_instance +): + """Test that unknown finish_reason values map to FinishReason.OTHER.""" + mock_response = ModelResponse( + choices=[ + Choices( + message=ChatCompletionAssistantMessage( + role="assistant", + content="Test response", + ), + finish_reason="unknown_reason_type", + ) + ] + ) + mock_acompletion.return_value = mock_response + + llm_request = LlmRequest( + contents=[ + types.Content( + role="user", parts=[types.Part.from_text(text="Test prompt")] + ) + ], + ) + + async for response in lite_llm_instance.generate_content_async(llm_request): + assert response.content.role == "model" + # Unknown finish_reason should map to OTHER + assert isinstance(response.finish_reason, types.FinishReason) + assert response.finish_reason == types.FinishReason.OTHER + + mock_acompletion.assert_called_once() diff --git a/tests/unittests/models/test_llm_request.py b/tests/unittests/models/test_llm_request.py index 7894229682..2c2f6a0a09 100644 --- a/tests/unittests/models/test_llm_request.py +++ b/tests/unittests/models/test_llm_request.py @@ -156,6 +156,194 @@ def third_tool(value: int) -> int: assert 'third_tool' in request.tools_dict +def test_append_instructions_with_string_list(): + """Test that append_instructions works with list of strings (existing behavior).""" + request = LlmRequest() + + # Initially system_instruction should be None + assert request.config.system_instruction is None + + # Append first set of instructions + request.append_instructions(['First instruction', 'Second instruction']) + + # Should be joined with double newlines + expected = 'First instruction\n\nSecond instruction' + assert request.config.system_instruction == expected + assert len(request.contents) == 0 + + +def test_append_instructions_with_string_list_multiple_calls(): + """Test multiple calls to append_instructions with string lists.""" + request = LlmRequest() + + # First call + request.append_instructions(['First instruction']) + assert request.config.system_instruction == 'First instruction' + + # Second call should append with double newlines + request.append_instructions(['Second instruction', 'Third instruction']) + expected = 'First instruction\n\nSecond instruction\n\nThird instruction' + assert request.config.system_instruction == expected + + +def test_append_instructions_with_content(): + """Test that append_instructions works with types.Content (new behavior).""" + request = LlmRequest() + + # Create a Content object + content = types.Content( + role='user', parts=[types.Part(text='This is content-based instruction')] + ) + + # Append content + request.append_instructions(content) + + # Should be set as system_instruction + assert len(request.contents) == 0 + assert request.config.system_instruction == content + + +def test_append_instructions_with_content_multiple_calls(): + """Test multiple calls to append_instructions with Content objects.""" + request = LlmRequest() + + # Add some existing content first + existing_content = types.Content( + role='user', parts=[types.Part(text='Existing content')] + ) + request.contents.append(existing_content) + + # First Content instruction + content1 = types.Content( + role='user', parts=[types.Part(text='First instruction')] + ) + request.append_instructions(content1) + + # Should be set as system_instruction, existing content unchanged + assert len(request.contents) == 1 + assert request.contents[0] == existing_content + assert request.config.system_instruction == content1 + + # Second Content instruction + content2 = types.Content( + role='user', parts=[types.Part(text='Second instruction')] + ) + request.append_instructions(content2) + + # Second Content should be merged with first in system_instruction + assert len(request.contents) == 1 + assert request.contents[0] == existing_content + assert isinstance(request.config.system_instruction, types.Content) + assert len(request.config.system_instruction.parts) == 2 + assert request.config.system_instruction.parts[0].text == 'First instruction' + assert request.config.system_instruction.parts[1].text == 'Second instruction' + + +def test_append_instructions_with_content_multipart(): + """Test append_instructions with Content containing multiple parts.""" + request = LlmRequest() + + # Create Content with multiple parts (text and potentially files) + content = types.Content( + role='user', + parts=[ + types.Part(text='Text instruction'), + types.Part(text='Additional text part'), + ], + ) + + request.append_instructions(content) + + assert len(request.contents) == 0 + assert request.config.system_instruction == content + assert len(request.config.system_instruction.parts) == 2 + assert request.config.system_instruction.parts[0].text == 'Text instruction' + assert ( + request.config.system_instruction.parts[1].text == 'Additional text part' + ) + + +def test_append_instructions_mixed_string_and_content(): + """Test mixing string list and Content instructions.""" + request = LlmRequest() + + # First add string instructions + request.append_instructions(['String instruction']) + assert request.config.system_instruction == 'String instruction' + + # Then add Content instruction + content = types.Content( + role='user', parts=[types.Part(text='Content instruction')] + ) + request.append_instructions(content) + + # String and Content should be merged in system_instruction + assert len(request.contents) == 0 + assert isinstance(request.config.system_instruction, types.Content) + assert len(request.config.system_instruction.parts) == 2 + assert request.config.system_instruction.parts[0].text == 'String instruction' + assert ( + request.config.system_instruction.parts[1].text == 'Content instruction' + ) + + +def test_append_instructions_empty_string_list(): + """Test append_instructions with empty list of strings.""" + request = LlmRequest() + + # Empty list should not modify anything + request.append_instructions([]) + + assert request.config.system_instruction is None + assert len(request.contents) == 0 + + +def test_append_instructions_invalid_input(): + """Test append_instructions with invalid input types.""" + request = LlmRequest() + + # Test with invalid types + with pytest.raises( + TypeError, match='instructions must be list\\[str\\] or types.Content' + ): + request.append_instructions('single string') # Should be list[str] + + with pytest.raises( + TypeError, match='instructions must be list\\[str\\] or types.Content' + ): + request.append_instructions(123) # Invalid type + + with pytest.raises( + TypeError, match='instructions must be list\\[str\\] or types.Content' + ): + request.append_instructions( + ['valid string', 123] + ) # Mixed valid/invalid in list + + +def test_append_instructions_content_preserves_role_and_parts(): + """Test that Content objects have text extracted regardless of role or parts.""" + request = LlmRequest() + + # Create Content with specific role and parts + content = types.Content( + role='system', # Different role + parts=[ + types.Part(text='System instruction'), + types.Part(text='Additional system part'), + ], + ) + + request.append_instructions(content) + + # Text should be extracted and concatenated to system_instruction string + assert len(request.contents) == 0 + assert ( + request.config.system_instruction + == 'System instruction\n\nAdditional system part' + ) + + async def _create_tool_context() -> ToolContext: """Helper to create a ToolContext for testing.""" session_service = InMemorySessionService() @@ -308,3 +496,343 @@ def third_tool(value: int) -> int: assert 'dummy_tool' in request.tools_dict assert 'another_tool' in request.tools_dict assert 'third_tool' in request.tools_dict + + +# Updated tests for simplified string-only append_instructions behavior + + +def test_append_instructions_with_content(): + """Test that append_instructions extracts text from types.Content.""" + request = LlmRequest() + + # Create a Content object + content = types.Content( + role='user', parts=[types.Part(text='This is content-based instruction')] + ) + + # Append content + request.append_instructions(content) + + # Should extract text and set as system_instruction string + assert len(request.contents) == 0 + assert ( + request.config.system_instruction == 'This is content-based instruction' + ) + + +def test_append_instructions_with_content_multiple_calls(): + """Test multiple calls to append_instructions with Content objects.""" + request = LlmRequest() + + # Add some existing content first + existing_content = types.Content( + role='user', parts=[types.Part(text='Existing content')] + ) + request.contents.append(existing_content) + + # First Content instruction + content1 = types.Content( + role='user', parts=[types.Part(text='First instruction')] + ) + request.append_instructions(content1) + + # Should extract text and set as system_instruction, existing content unchanged + assert len(request.contents) == 1 + assert request.contents[0] == existing_content + assert request.config.system_instruction == 'First instruction' + + # Second Content instruction + content2 = types.Content( + role='user', parts=[types.Part(text='Second instruction')] + ) + request.append_instructions(content2) + + # Second Content text should be appended to existing string + assert len(request.contents) == 1 + assert request.contents[0] == existing_content + assert ( + request.config.system_instruction + == 'First instruction\n\nSecond instruction' + ) + + +def test_append_instructions_with_content_multipart(): + """Test append_instructions with Content containing multiple text parts.""" + request = LlmRequest() + + # Create Content with multiple text parts + content = types.Content( + role='user', + parts=[ + types.Part(text='Text instruction'), + types.Part(text='Additional text part'), + ], + ) + + request.append_instructions(content) + + # Should extract and join all text parts + assert len(request.contents) == 0 + assert ( + request.config.system_instruction + == 'Text instruction\n\nAdditional text part' + ) + + +def test_append_instructions_mixed_string_and_content(): + """Test mixing string list and Content instructions.""" + request = LlmRequest() + + # First add string instructions + request.append_instructions(['String instruction']) + assert request.config.system_instruction == 'String instruction' + + # Then add Content instruction + content = types.Content( + role='user', parts=[types.Part(text='Content instruction')] + ) + request.append_instructions(content) + + # Content text should be appended to existing string + assert len(request.contents) == 0 + assert ( + request.config.system_instruction + == 'String instruction\n\nContent instruction' + ) + + +def test_append_instructions_content_extracts_text_only(): + """Test that Content objects have text extracted regardless of role.""" + request = LlmRequest() + + # Create Content with specific role and parts + content = types.Content( + role='system', # Different role + parts=[ + types.Part(text='System instruction'), + types.Part(text='Additional system part'), + ], + ) + + request.append_instructions(content) + + # Only text should be extracted and concatenated + assert len(request.contents) == 0 + assert ( + request.config.system_instruction + == 'System instruction\n\nAdditional system part' + ) + + +def test_append_instructions_content_with_non_text_parts(): + """Test that non-text parts in Content are processed with references.""" + request = LlmRequest() + + # Create Content with text and non-text parts + content = types.Content( + role='user', + parts=[ + types.Part(text='Text instruction'), + types.Part( + inline_data=types.Blob(data=b'file_data', mime_type='text/plain') + ), + types.Part(text='More text'), + ], + ) + + user_contents = request.append_instructions(content) + + # Text parts should be extracted with references to non-text parts + expected_system = ( + 'Text instruction\n\n' + '[Reference to inline binary data: inline_data_0 (type: text/plain)]\n\n' + 'More text' + ) + assert request.config.system_instruction == expected_system + + # Should return user content for the non-text part + assert len(user_contents) == 1 + assert user_contents[0].role == 'user' + assert len(user_contents[0].parts) == 2 + assert ( + user_contents[0].parts[0].text == 'Referenced inline data: inline_data_0' + ) + assert user_contents[0].parts[1].inline_data.data == b'file_data' + + +def test_append_instructions_content_no_text_parts(): + """Test that Content with no text parts processes non-text parts with references.""" + request = LlmRequest() + + # Set initial system instruction + request.config.system_instruction = 'Initial' + + # Create Content with only non-text parts + content = types.Content( + role='user', + parts=[ + types.Part( + inline_data=types.Blob(data=b'file_data', mime_type='text/plain') + ), + ], + ) + + user_contents = request.append_instructions(content) + + # Should add reference to non-text part to system instruction + expected_system = ( + 'Initial\n\n[Reference to inline binary data: inline_data_0 (type:' + ' text/plain)]' + ) + assert request.config.system_instruction == expected_system + + # Should return user content for the non-text part + assert len(user_contents) == 1 + assert user_contents[0].role == 'user' + assert len(user_contents[0].parts) == 2 + assert ( + user_contents[0].parts[0].text == 'Referenced inline data: inline_data_0' + ) + assert user_contents[0].parts[1].inline_data.data == b'file_data' + + +def test_append_instructions_content_empty_text_parts(): + """Test that Content with empty text parts are skipped.""" + request = LlmRequest() + + # Create Content with empty and non-empty text parts + content = types.Content( + role='user', + parts=[ + types.Part(text='Valid text'), + types.Part(text=''), # Empty text + types.Part(text=None), # None text + types.Part(text='More valid text'), + ], + ) + + request.append_instructions(content) + + # Only non-empty text should be extracted + assert request.config.system_instruction == 'Valid text\n\nMore valid text' + + +def test_append_instructions_warning_unsupported_system_instruction_type( + caplog, +): + """Test that warnings are logged for unsupported system_instruction types.""" + import logging + + request = LlmRequest() + + # Set unsupported type as system_instruction + request.config.system_instruction = {'unsupported': 'dict'} + + with caplog.at_level(logging.WARNING): + # Try appending Content - should log warning and skip + content = types.Content(role='user', parts=[types.Part(text='Test')]) + request.append_instructions(content) + + # Should remain unchanged + assert request.config.system_instruction == {'unsupported': 'dict'} + + # Try appending strings - should also log warning and skip + request.append_instructions(['Test string']) + + # Should remain unchanged + assert request.config.system_instruction == {'unsupported': 'dict'} + + # Check that warnings were logged + assert ( + len( + [record for record in caplog.records if record.levelname == 'WARNING'] + ) + >= 1 + ) + assert ( + 'Cannot append to system_instruction of unsupported type' in caplog.text + ) + + +@pytest.mark.parametrize('llm_backend', ['GOOGLE_AI', 'VERTEX']) +def test_append_instructions_with_mixed_content(llm_backend): + """Test append_instructions with mixed text and non-text content.""" + request = LlmRequest() + + # Create static instruction with mixed content + static_content = types.Content( + role='user', + parts=[ + types.Part(text='Analyze this:'), + types.Part( + inline_data=types.Blob( + data=b'test_data', + mime_type='image/png', + display_name='test.png', + ) + ), + types.Part(text='Focus on details.'), + types.Part( + file_data=types.FileData( + file_uri='files/doc123', + mime_type='text/plain', + display_name='document.txt', + ) + ), + ], + ) + + user_contents = request.append_instructions(static_content) + + # System instruction should contain text with references + expected_system = ( + 'Analyze this:\n\n[Reference to inline binary data: inline_data_0' + " ('test.png', type: image/png)]\n\nFocus on details.\n\n[Reference to" + " file data: file_data_1 ('document.txt', URI: files/doc123, type:" + ' text/plain)]' + ) + assert request.config.system_instruction == expected_system + + # Should return user contents for non-text parts + assert len(user_contents) == 2 + + # Check inline_data content + assert user_contents[0].role == 'user' + assert len(user_contents[0].parts) == 2 + assert ( + user_contents[0].parts[0].text == 'Referenced inline data: inline_data_0' + ) + assert user_contents[0].parts[1].inline_data.data == b'test_data' + assert user_contents[0].parts[1].inline_data.display_name == 'test.png' + + # Check file_data content + assert user_contents[1].role == 'user' + assert len(user_contents[1].parts) == 2 + assert user_contents[1].parts[0].text == 'Referenced file data: file_data_1' + assert user_contents[1].parts[1].file_data.file_uri == 'files/doc123' + assert user_contents[1].parts[1].file_data.display_name == 'document.txt' + + +@pytest.mark.parametrize('llm_backend', ['GOOGLE_AI', 'VERTEX']) +def test_append_instructions_with_only_text_parts(llm_backend): + """Test append_instructions with only text parts.""" + request = LlmRequest() + + static_content = types.Content( + role='user', + parts=[ + types.Part(text='First instruction'), + types.Part(text='Second instruction'), + ], + ) + + user_contents = request.append_instructions(static_content) + + # Should only have text in system instruction + assert ( + request.config.system_instruction + == 'First instruction\n\nSecond instruction' + ) + + # Should return empty list since no non-text parts + assert user_contents == [] diff --git a/tests/unittests/models/test_llm_response.py b/tests/unittests/models/test_llm_response.py new file mode 100644 index 0000000000..85d58cfd14 --- /dev/null +++ b/tests/unittests/models/test_llm_response.py @@ -0,0 +1,351 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for LlmResponse, including log probabilities feature.""" + +from google.adk.models.llm_response import LlmResponse +from google.genai import types + + +def test_llm_response_create_with_logprobs(): + """Test LlmResponse.create() extracts logprobs from candidate.""" + avg_logprobs = -0.75 + logprobs_result = types.LogprobsResult( + chosen_candidates=[], top_candidates=[] + ) + + generate_content_response = types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=types.Content(parts=[types.Part(text='Response text')]), + finish_reason=types.FinishReason.STOP, + avg_logprobs=avg_logprobs, + logprobs_result=logprobs_result, + ) + ] + ) + + response = LlmResponse.create(generate_content_response) + + assert response.avg_logprobs == avg_logprobs + assert response.logprobs_result == logprobs_result + assert response.content.parts[0].text == 'Response text' + assert response.finish_reason == types.FinishReason.STOP + + +def test_llm_response_create_without_logprobs(): + """Test LlmResponse.create() handles missing logprobs gracefully.""" + generate_content_response = types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=types.Content(parts=[types.Part(text='Response text')]), + finish_reason=types.FinishReason.STOP, + avg_logprobs=None, + logprobs_result=None, + ) + ] + ) + + response = LlmResponse.create(generate_content_response) + + assert response.avg_logprobs is None + assert response.logprobs_result is None + assert response.content.parts[0].text == 'Response text' + + +def test_llm_response_create_error_case_with_logprobs(): + """Test LlmResponse.create() includes logprobs in error cases.""" + avg_logprobs = -2.1 + + generate_content_response = types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=None, # No content - error case + finish_reason=types.FinishReason.SAFETY, + finish_message='Safety filter triggered', + avg_logprobs=avg_logprobs, + logprobs_result=None, + ) + ] + ) + + response = LlmResponse.create(generate_content_response) + + assert response.avg_logprobs == avg_logprobs + assert response.logprobs_result is None + assert response.error_code == types.FinishReason.SAFETY + assert response.error_message == 'Safety filter triggered' + + +def test_llm_response_create_no_candidates(): + """Test LlmResponse.create() with no candidates.""" + generate_content_response = types.GenerateContentResponse( + candidates=[], + prompt_feedback=types.GenerateContentResponsePromptFeedback( + block_reason=types.BlockedReason.SAFETY, + block_reason_message='Prompt blocked for safety', + ), + ) + + response = LlmResponse.create(generate_content_response) + + # No candidates means no logprobs + assert response.avg_logprobs is None + assert response.logprobs_result is None + assert response.error_code == types.BlockedReason.SAFETY + assert response.error_message == 'Prompt blocked for safety' + + +def test_llm_response_create_with_concrete_logprobs_result(): + """Test LlmResponse.create() with detailed logprobs_result containing actual token data.""" + # Create realistic logprobs data + chosen_candidates = [ + types.LogprobsResultCandidate( + token='The', log_probability=-0.1, token_id=123 + ), + types.LogprobsResultCandidate( + token=' capital', log_probability=-0.5, token_id=456 + ), + types.LogprobsResultCandidate( + token=' of', log_probability=-0.2, token_id=789 + ), + ] + + top_candidates = [ + types.LogprobsResultTopCandidates( + candidates=[ + types.LogprobsResultCandidate( + token='The', log_probability=-0.1, token_id=123 + ), + types.LogprobsResultCandidate( + token='A', log_probability=-2.3, token_id=124 + ), + types.LogprobsResultCandidate( + token='This', log_probability=-3.1, token_id=125 + ), + ] + ), + types.LogprobsResultTopCandidates( + candidates=[ + types.LogprobsResultCandidate( + token=' capital', log_probability=-0.5, token_id=456 + ), + types.LogprobsResultCandidate( + token=' city', log_probability=-1.2, token_id=457 + ), + types.LogprobsResultCandidate( + token=' main', log_probability=-2.8, token_id=458 + ), + ] + ), + ] + + avg_logprobs = -0.27 # Average of -0.1, -0.5, -0.2 + logprobs_result = types.LogprobsResult( + chosen_candidates=chosen_candidates, top_candidates=top_candidates + ) + + generate_content_response = types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=types.Content( + parts=[types.Part(text='The capital of France is Paris.')] + ), + finish_reason=types.FinishReason.STOP, + avg_logprobs=avg_logprobs, + logprobs_result=logprobs_result, + ) + ] + ) + + response = LlmResponse.create(generate_content_response) + + assert response.avg_logprobs == avg_logprobs + assert response.logprobs_result is not None + + # Test chosen candidates + assert len(response.logprobs_result.chosen_candidates) == 3 + assert response.logprobs_result.chosen_candidates[0].token == 'The' + assert response.logprobs_result.chosen_candidates[0].log_probability == -0.1 + assert response.logprobs_result.chosen_candidates[0].token_id == 123 + assert response.logprobs_result.chosen_candidates[1].token == ' capital' + assert response.logprobs_result.chosen_candidates[1].log_probability == -0.5 + assert response.logprobs_result.chosen_candidates[1].token_id == 456 + + # Test top candidates + assert len(response.logprobs_result.top_candidates) == 2 + assert ( + len(response.logprobs_result.top_candidates[0].candidates) == 3 + ) # 3 alternatives for first token + assert response.logprobs_result.top_candidates[0].candidates[0].token == 'The' + assert ( + response.logprobs_result.top_candidates[0].candidates[0].token_id == 123 + ) + assert response.logprobs_result.top_candidates[0].candidates[1].token == 'A' + assert ( + response.logprobs_result.top_candidates[0].candidates[1].token_id == 124 + ) + assert ( + response.logprobs_result.top_candidates[0].candidates[2].token == 'This' + ) + assert ( + response.logprobs_result.top_candidates[0].candidates[2].token_id == 125 + ) + + +def test_llm_response_create_with_partial_logprobs_result(): + """Test LlmResponse.create() with logprobs_result having only chosen_candidates.""" + chosen_candidates = [ + types.LogprobsResultCandidate( + token='Hello', log_probability=-0.05, token_id=111 + ), + types.LogprobsResultCandidate( + token=' world', log_probability=-0.8, token_id=222 + ), + ] + + logprobs_result = types.LogprobsResult( + chosen_candidates=chosen_candidates, + top_candidates=[], # Empty top candidates + ) + + generate_content_response = types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=types.Content(parts=[types.Part(text='Hello world')]), + finish_reason=types.FinishReason.STOP, + avg_logprobs=-0.425, # Average of -0.05 and -0.8 + logprobs_result=logprobs_result, + ) + ] + ) + + response = LlmResponse.create(generate_content_response) + + assert response.avg_logprobs == -0.425 + assert response.logprobs_result is not None + assert len(response.logprobs_result.chosen_candidates) == 2 + assert len(response.logprobs_result.top_candidates) == 0 + assert response.logprobs_result.chosen_candidates[0].token == 'Hello' + assert response.logprobs_result.chosen_candidates[1].token == ' world' + + +def test_llm_response_create_with_citation_metadata(): + """Test LlmResponse.create() extracts citation_metadata from candidate.""" + citation_metadata = types.CitationMetadata( + citations=[ + types.Citation( + start_index=0, + end_index=10, + uri='https://example.com', + ) + ] + ) + + generate_content_response = types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=types.Content(parts=[types.Part(text='Response text')]), + finish_reason=types.FinishReason.STOP, + citation_metadata=citation_metadata, + ) + ] + ) + + response = LlmResponse.create(generate_content_response) + + assert response.citation_metadata == citation_metadata + assert response.content.parts[0].text == 'Response text' + + +def test_llm_response_create_without_citation_metadata(): + """Test LlmResponse.create() handles missing citation_metadata gracefully.""" + generate_content_response = types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=types.Content(parts=[types.Part(text='Response text')]), + finish_reason=types.FinishReason.STOP, + citation_metadata=None, + ) + ] + ) + + response = LlmResponse.create(generate_content_response) + + assert response.citation_metadata is None + assert response.content.parts[0].text == 'Response text' + + +def test_llm_response_create_error_case_with_citation_metadata(): + """Test LlmResponse.create() includes citation_metadata in error cases.""" + citation_metadata = types.CitationMetadata( + citations=[ + types.Citation( + start_index=0, + end_index=10, + uri='https://example.com', + ) + ] + ) + + generate_content_response = types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=None, # No content - blocked case + finish_reason=types.FinishReason.RECITATION, + finish_message='Response blocked due to recitation triggered', + citation_metadata=citation_metadata, + ) + ] + ) + + response = LlmResponse.create(generate_content_response) + + assert response.citation_metadata == citation_metadata + assert response.error_code == types.FinishReason.RECITATION + assert ( + response.error_message == 'Response blocked due to recitation triggered' + ) + + +def test_llm_response_create_empty_content_with_stop_reason(): + """Test LlmResponse.create() with empty content and stop finish reason.""" + generate_content_response = types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=types.Content(parts=[]), + finish_reason=types.FinishReason.STOP, + ) + ] + ) + + response = LlmResponse.create(generate_content_response) + + assert response.error_code is None + assert response.content is not None + + +def test_llm_response_create_includes_model_version(): + """Test LlmResponse.create() includes model version.""" + generate_content_response = types.GenerateContentResponse( + model_version='gemini-2.0-flash', + candidates=[ + types.Candidate( + content=types.Content(parts=[types.Part(text='Response text')]), + finish_reason=types.FinishReason.STOP, + ) + ], + ) + response = LlmResponse.create(generate_content_response) + assert response.model_version == 'gemini-2.0-flash' diff --git a/tests/unittests/plugins/__init__.py b/tests/unittests/plugins/__init__.py new file mode 100644 index 0000000000..0a2669d7a2 --- /dev/null +++ b/tests/unittests/plugins/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/tests/unittests/plugins/test_bigquery_logging_plugin.py b/tests/unittests/plugins/test_bigquery_logging_plugin.py new file mode 100644 index 0000000000..519af32e48 --- /dev/null +++ b/tests/unittests/plugins/test_bigquery_logging_plugin.py @@ -0,0 +1,508 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import asyncio +import datetime +import json +import logging +from unittest import mock + +from google.adk.agents import base_agent +from google.adk.agents import callback_context as callback_context_lib +from google.adk.agents import invocation_context as invocation_context_lib +from google.adk.events import event as event_lib +from google.adk.models import llm_request as llm_request_lib +from google.adk.models import llm_response as llm_response_lib +from google.adk.plugins import bigquery_logging_plugin +from google.adk.plugins import plugin_manager as plugin_manager_lib +from google.adk.sessions import base_session_service as base_session_service_lib +from google.adk.sessions import session as session_lib +from google.adk.tools import base_tool as base_tool_lib +from google.adk.tools import tool_context as tool_context_lib +import google.auth +from google.auth import exceptions as auth_exceptions +from google.cloud import bigquery +from google.genai import types +import pytest + +BigQueryLoggerConfig = bigquery_logging_plugin.BigQueryLoggerConfig + + +class PluginTestBase: + """Base class for plugin tests with common context setup.""" + + def setup_method(self, method): + self.mock_session = mock.create_autospec(session_lib.Session, instance=True) + self.mock_session.id = "session-123" + self.mock_session.user_id = "user-456" + self.mock_session.app_name = "test_app" + self.mock_session.state = {} + self.mock_agent = mock.create_autospec(base_agent.BaseAgent, instance=True) + self.mock_agent.name = "MyTestAgent" + mock_session_service = mock.create_autospec( + base_session_service_lib.BaseSessionService, instance=True + ) + mock_plugin_manager = mock.create_autospec( + plugin_manager_lib.PluginManager, instance=True + ) + self.invocation_context = invocation_context_lib.InvocationContext( + agent=self.mock_agent, + session=self.mock_session, + invocation_id="inv-789", + session_service=mock_session_service, + plugin_manager=mock_plugin_manager, + ) + self.callback_context = callback_context_lib.CallbackContext( + invocation_context=self.invocation_context + ) + self.tool_context = tool_context_lib.ToolContext( + invocation_context=self.invocation_context + ) + + def teardown_method(self, method): + mock.patch.stopall() + + +class TestBigQueryAgentAnalyticsPlugin(PluginTestBase): + """Tests for the BigQueryAgentAnalyticsPlugin.""" + + def setup_method(self, method): + super().setup_method(method) + self.project_id = "test-gcp-project" + self.dataset_id = "adk_logs" + self.table_id = "agent_events" + + # Mock Google Auth default credentials + self._auth_patch = mock.patch.object(google.auth, "default", autospec=True) + self.mock_auth_default = self._auth_patch.start() + self.mock_auth_default.return_value = (mock.Mock(), self.project_id) + + # Mock BigQuery Client class + self._bq_client_patch = mock.patch.object(bigquery, "Client", autospec=True) + self.mock_bq_client_cls = self._bq_client_patch.start() + self.mock_bq_client = self.mock_bq_client_cls.return_value + self.mock_bq_client.create_dataset.return_value = None + self.mock_bq_client.create_table.return_value = None + self.mock_bq_client.insert_rows_json.return_value = [] # No errors + self.mock_table_ref = mock.Mock() + self.mock_table_ref.dataset_id = self.dataset_id + self.mock_table_ref.table_id = self.table_id + self.mock_dataset_ref = mock.Mock() + self.mock_dataset_ref.table.return_value = self.mock_table_ref + self.mock_bq_client.dataset.return_value = self.mock_dataset_ref + + # Patch asyncio.to_thread to run the function synchronously + self._asyncio_to_thread_patch = mock.patch( + "asyncio.to_thread", + side_effect=lambda func, *args, **kwargs: func(*args, **kwargs), + ) + self._asyncio_to_thread_patch.start() + + self.plugin = asyncio.run(self._create_plugin()) + + async def _create_plugin(self, config=None): + plugin = bigquery_logging_plugin.BigQueryAgentAnalyticsPlugin( + project_id=self.project_id, + dataset_id=self.dataset_id, + table_id=self.table_id, + config=config, + ) + if config is None or config.enabled: + # Trigger lazy initialization by calling an async method once. + await plugin._log_to_bigquery_async({"event_type": "INIT"}) + self.mock_bq_client.insert_rows_json.reset_mock() + return plugin + + def _get_logged_entry(self): + """Helper to get the single logged entry from the mocked client.""" + self.mock_bq_client.insert_rows_json.assert_called_once() + args, _ = self.mock_bq_client.insert_rows_json.call_args + rows = args[1] + assert len(rows) == 1 + return rows[0] + + def _assert_common_fields(self, log_entry, event_type): + assert log_entry["event_type"] == event_type + assert log_entry["agent"] == "MyTestAgent" + assert log_entry["session_id"] == "session-123" + assert log_entry["invocation_id"] == "inv-789" + assert log_entry["user_id"] == "user-456" + assert log_entry["timestamp"] is not None + + @pytest.mark.asyncio + async def test_plugin_disabled(self): + self.mock_bq_client_cls.reset_mock() + config = BigQueryLoggerConfig(enabled=False) + plugin = await self._create_plugin(config) + user_message = types.Content(parts=[types.Part(text="Test")]) + await plugin.on_user_message_callback( + invocation_context=self.invocation_context, user_message=user_message + ) + self.mock_bq_client_cls.assert_not_called() + self.mock_bq_client.insert_rows_json.assert_not_called() + + @pytest.mark.asyncio + async def test_event_allowlist(self): + config = BigQueryLoggerConfig(event_allowlist=["LLM_REQUEST"]) + plugin = await self._create_plugin(config) + + # This should be logged + llm_request = llm_request_lib.LlmRequest( + model="gemini-pro", + contents=[types.Content(parts=[types.Part(text="Prompt")])], + ) + await plugin.before_model_callback( + callback_context=self.callback_context, llm_request=llm_request + ) + self.mock_bq_client.insert_rows_json.assert_called_once() + self.mock_bq_client.insert_rows_json.reset_mock() + + # This should NOT be logged + user_message = types.Content(parts=[types.Part(text="What is up?")]) + await plugin.on_user_message_callback( + invocation_context=self.invocation_context, user_message=user_message + ) + self.mock_bq_client.insert_rows_json.assert_not_called() + + @pytest.mark.asyncio + async def test_event_denylist(self): + config = BigQueryLoggerConfig(event_denylist=["USER_MESSAGE_RECEIVED"]) + plugin = await self._create_plugin(config) + + # This should NOT be logged + user_message = types.Content(parts=[types.Part(text="What is up?")]) + await plugin.on_user_message_callback( + invocation_context=self.invocation_context, user_message=user_message + ) + self.mock_bq_client.insert_rows_json.assert_not_called() + + # This should be logged + await plugin.before_run_callback(invocation_context=self.invocation_context) + self.mock_bq_client.insert_rows_json.assert_called_once() + + @pytest.mark.asyncio + async def test_content_formatter(self): + def redact_content(content): + return "[REDACTED]" + + config = BigQueryLoggerConfig(content_formatter=redact_content) + plugin = await self._create_plugin(config) + + user_message = types.Content(parts=[types.Part(text="Secret message")]) + await plugin.on_user_message_callback( + invocation_context=self.invocation_context, user_message=user_message + ) + + log_entry = self._get_logged_entry() + self._assert_common_fields(log_entry, "USER_MESSAGE_RECEIVED") + assert log_entry["content"] == "[REDACTED]" + + @pytest.mark.asyncio + async def test_content_formatter_error(self): + def error_formatter(content): + raise ValueError("Formatter failed") + + config = BigQueryLoggerConfig(content_formatter=error_formatter) + plugin = await self._create_plugin(config) + + user_message = types.Content(parts=[types.Part(text="Test")]) + with mock.patch.object(logging, "warning") as mock_log_warning: + await plugin.on_user_message_callback( + invocation_context=self.invocation_context, user_message=user_message + ) + mock_log_warning.assert_called_once_with( + "Error applying custom content formatter for event type %s: %s", + "USER_MESSAGE_RECEIVED", + mock.ANY, + ) + + log_entry = self._get_logged_entry() + # Content should be a string, even if formatter failed + assert isinstance(log_entry["content"], str) + assert "User Content: text: 'Test'" in log_entry["content"] + + @pytest.mark.asyncio + async def test_on_user_message_callback_logs_correctly(self): + user_message = types.Content(parts=[types.Part(text="What is up?")]) + await self.plugin.on_user_message_callback( + invocation_context=self.invocation_context, user_message=user_message + ) + + log_entry = self._get_logged_entry() + self._assert_common_fields(log_entry, "USER_MESSAGE_RECEIVED") + assert log_entry["content"] == "User Content: text: 'What is up?'" + + @pytest.mark.asyncio + async def test_on_event_callback_tool_call(self): + tool_fc = types.FunctionCall(name="get_weather", args={"location": "Paris"}) + event = event_lib.Event( + author="MyTestAgent", + content=types.Content(parts=[types.Part(function_call=tool_fc)]), + timestamp=datetime.datetime( + 2025, 10, 22, 10, 0, 0, tzinfo=datetime.timezone.utc + ).timestamp(), + ) + await self.plugin.on_event_callback( + invocation_context=self.invocation_context, event=event + ) + + log_entry = self._get_logged_entry() + self._assert_common_fields(log_entry, "TOOL_CALL") + logged_content = json.loads(log_entry["content"]) + assert logged_content[0]["function_call"]["args"] == {"location": "Paris"} + assert logged_content[0]["function_call"]["name"] == "get_weather" + assert log_entry["timestamp"] == "2025-10-22T10:00:00+00:00" + + @pytest.mark.asyncio + async def test_on_event_callback_model_response(self): + event = event_lib.Event( + author="MyTestAgent", + content=types.Content(parts=[types.Part(text="Hello there!")]), + timestamp=datetime.datetime( + 2025, 10, 22, 11, 0, 0, tzinfo=datetime.timezone.utc + ).timestamp(), + ) + await self.plugin.on_event_callback( + invocation_context=self.invocation_context, event=event + ) + + log_entry = self._get_logged_entry() + self._assert_common_fields(log_entry, "MODEL_RESPONSE") + logged_content = json.loads(log_entry["content"]) + assert logged_content[0]["text"] == "Hello there!" + assert log_entry["timestamp"] == "2025-10-22T11:00:00+00:00" + + @pytest.mark.asyncio + async def test_bigquery_client_initialization_failure(self): + # Simulate auth failure + self.mock_auth_default.side_effect = auth_exceptions.GoogleAuthError( + "Auth failed" + ) + self.mock_bq_client.insert_rows_json.reset_mock() + + # Re-instantiate the plugin so init is re-attempted + plugin_with_fail = bigquery_logging_plugin.BigQueryAgentAnalyticsPlugin( + project_id=self.project_id, + dataset_id=self.dataset_id, + table_id=self.table_id, + ) + + # Trigger a callback; initialization happens lazily + with mock.patch.object(logging, "exception") as mock_log_exception: + await plugin_with_fail.before_run_callback( + invocation_context=self.invocation_context + ) + mock_log_exception.assert_called_once() + + # Ensure insert_rows_json was never called because init failed + self.mock_bq_client.insert_rows_json.assert_not_called() + + @pytest.mark.asyncio + async def test_bigquery_insert_error_does_not_raise(self): + # Simulate an insert error in the future result + self.mock_bq_client.insert_rows_json.return_value = [{"errors": ["error"]}] + + with mock.patch.object(logging, "error") as mock_log_error: + await self.plugin.on_user_message_callback( + invocation_context=self.invocation_context, + user_message=types.Content(parts=[types.Part(text="Test")]), + ) + # The plugin should handle the error internally without raising + mock_log_error.assert_called_with( + "Errors occurred while inserting to BigQuery table %s.%s: %s", + self.dataset_id, + self.table_id, + [{"errors": ["error"]}], + ) + + self.mock_bq_client.insert_rows_json.assert_called_once() + + @pytest.mark.asyncio + async def test_before_run_callback_logs_correctly(self): + await self.plugin.before_run_callback( + invocation_context=self.invocation_context + ) + log_entry = self._get_logged_entry() + self._assert_common_fields(log_entry, "INVOCATION_STARTING") + assert log_entry["content"] is None + + @pytest.mark.asyncio + async def test_after_run_callback_logs_correctly(self): + await self.plugin.after_run_callback( + invocation_context=self.invocation_context + ) + log_entry = self._get_logged_entry() + self._assert_common_fields(log_entry, "INVOCATION_COMPLETED") + assert log_entry["content"] is None + + @pytest.mark.asyncio + async def test_before_agent_callback_logs_correctly(self): + await self.plugin.before_agent_callback( + agent=self.mock_agent, callback_context=self.callback_context + ) + log_entry = self._get_logged_entry() + self._assert_common_fields(log_entry, "AGENT_STARTING") + assert log_entry["content"] == "Agent Name: MyTestAgent" + + @pytest.mark.asyncio + async def test_after_agent_callback_logs_correctly(self): + await self.plugin.after_agent_callback( + agent=self.mock_agent, callback_context=self.callback_context + ) + log_entry = self._get_logged_entry() + self._assert_common_fields(log_entry, "AGENT_COMPLETED") + assert log_entry["content"] == "Agent Name: MyTestAgent" + + @pytest.mark.asyncio + async def test_before_model_callback_logs_correctly(self): + llm_request = llm_request_lib.LlmRequest( + model="gemini-pro", + contents=[types.Content(parts=[types.Part(text="Prompt")])], + config=types.GenerateContentConfig( + temperature=0.5, + top_p=0.9, + max_output_tokens=100, + system_instruction="Be helpful", + ), + tools_dict={ + "my_tool": mock.create_autospec( + base_tool_lib.BaseTool, instance=True + ) + }, # Fixed mock + ) + + await self.plugin.before_model_callback( + callback_context=self.callback_context, llm_request=llm_request + ) + log_entry = self._get_logged_entry() + self._assert_common_fields(log_entry, "LLM_REQUEST") + assert "Model: gemini-pro" in log_entry["content"] + assert "System Prompt: Be helpful" in log_entry["content"] + assert ( + "Params: {temperature=0.5, top_p=0.9, max_output_tokens=100}" + in log_entry["content"] + ) + assert "Available Tools: ['my_tool']" in log_entry["content"] + + @pytest.mark.asyncio + async def test_after_model_callback_text_response(self): + llm_response = llm_response_lib.LlmResponse( + content=types.Content(parts=[types.Part(text="Model response")]), + usage_metadata=types.UsageMetadata( + prompt_token_count=10, + total_token_count=15, + ), + ) + await self.plugin.after_model_callback( + callback_context=self.callback_context, llm_response=llm_response + ) + log_entry = self._get_logged_entry() + self._assert_common_fields(log_entry, "LLM_RESPONSE") + assert ( + "Tool Name: text_response, text: 'Model response'" + in log_entry["content"] + ) + # Adjusted assertion to expect None for candidates + assert "Token Usage: {prompt: 10" in log_entry["content"] + assert log_entry["error_message"] is None + + @pytest.mark.asyncio + async def test_after_model_callback_tool_call(self): + llm_response = llm_response_lib.LlmResponse( + content=types.Content( + parts=[ + types.Part( + function_call=types.FunctionCall(name="tool1", args={}) + ) + ] + ), + ) + await self.plugin.after_model_callback( + callback_context=self.callback_context, llm_response=llm_response + ) + log_entry = self._get_logged_entry() + self._assert_common_fields(log_entry, "LLM_RESPONSE") + assert "Tool Name: tool1" in log_entry["content"] + + @pytest.mark.asyncio + async def test_before_tool_callback_logs_correctly(self): + mock_tool = mock.create_autospec(base_tool_lib.BaseTool, instance=True) + mock_tool.name = "MyTool" + mock_tool.description = "Does something" + tool_args = {"param": "value"} + await self.plugin.before_tool_callback( + tool=mock_tool, tool_args=tool_args, tool_context=self.tool_context + ) + log_entry = self._get_logged_entry() + self._assert_common_fields(log_entry, "TOOL_STARTING") + assert "Tool Name: MyTool" in log_entry["content"] + assert "Description: Does something" in log_entry["content"] + assert "Arguments: {'param': 'value'}" in log_entry["content"] + + @pytest.mark.asyncio + async def test_after_tool_callback_logs_correctly(self): + mock_tool = mock.create_autospec(base_tool_lib.BaseTool, instance=True) + mock_tool.name = "MyTool" + tool_args = {"param": "value"} + result = {"status": "success"} + await self.plugin.after_tool_callback( + tool=mock_tool, + tool_args=tool_args, + tool_context=self.tool_context, + result=result, + ) + log_entry = self._get_logged_entry() + self._assert_common_fields(log_entry, "TOOL_COMPLETED") + assert "Tool Name: MyTool" in log_entry["content"] + assert "Result: {'status': 'success'}" in log_entry["content"] + + @pytest.mark.asyncio + async def test_on_model_error_callback_logs_correctly(self): + llm_request = llm_request_lib.LlmRequest( + model="gemini-pro", + contents=[types.Content(parts=[types.Part(text="Prompt")])], + ) + error = ValueError("LLM failed") + await self.plugin.on_model_error_callback( + callback_context=self.callback_context, + llm_request=llm_request, + error=error, + ) + log_entry = self._get_logged_entry() + self._assert_common_fields(log_entry, "LLM_ERROR") + assert ( + log_entry["content"] is None + or "Request Content: " in log_entry["content"] + ) + assert log_entry["error_message"] == "LLM failed" + + @pytest.mark.asyncio + async def test_on_tool_error_callback_logs_correctly(self): + mock_tool = mock.create_autospec(base_tool_lib.BaseTool, instance=True) + mock_tool.name = "MyTool" + tool_args = {"param": "value"} + error = TimeoutError("Tool timed out") + await self.plugin.on_tool_error_callback( + tool=mock_tool, + tool_args=tool_args, + tool_context=self.tool_context, + error=error, + ) + log_entry = self._get_logged_entry() + self._assert_common_fields(log_entry, "TOOL_ERROR") + assert "Tool Name: MyTool" in log_entry["content"] + assert "Arguments: {'param': 'value'}" in log_entry["content"] + assert log_entry["error_message"] == "Tool timed out" diff --git a/tests/unittests/plugins/test_context_filtering_plugin.py b/tests/unittests/plugins/test_context_filtering_plugin.py new file mode 100644 index 0000000000..f9c8222ea3 --- /dev/null +++ b/tests/unittests/plugins/test_context_filtering_plugin.py @@ -0,0 +1,185 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Unit tests for the ContextFilteringPlugin.""" + +from unittest.mock import Mock + +from google.adk.agents.callback_context import CallbackContext +from google.adk.models.llm_request import LlmRequest +from google.adk.plugins.context_filter_plugin import ContextFilterPlugin +from google.genai import types +import pytest + + +def _create_content(role: str, text: str) -> types.Content: + return types.Content(parts=[types.Part(text=text)], role=role) + + +@pytest.mark.asyncio +async def test_filter_last_n_invocations(): + """Tests that the context is truncated to the last N invocations.""" + plugin = ContextFilterPlugin(num_invocations_to_keep=1) + contents = [ + _create_content("user", "user_prompt_1"), + _create_content("model", "model_response_1"), + _create_content("user", "user_prompt_2"), + _create_content("model", "model_response_2"), + ] + llm_request = LlmRequest(contents=contents) + + await plugin.before_model_callback( + callback_context=Mock(spec=CallbackContext), llm_request=llm_request + ) + + assert len(llm_request.contents) == 2 + assert llm_request.contents[0].parts[0].text == "user_prompt_2" + assert llm_request.contents[1].parts[0].text == "model_response_2" + + +@pytest.mark.asyncio +async def test_filter_with_function(): + """Tests that a custom filter function is applied to the context.""" + + def remove_model_responses(contents): + return [c for c in contents if c.role != "model"] + + plugin = ContextFilterPlugin(custom_filter=remove_model_responses) + contents = [ + _create_content("user", "user_prompt_1"), + _create_content("model", "model_response_1"), + _create_content("user", "user_prompt_2"), + _create_content("model", "model_response_2"), + ] + llm_request = LlmRequest(contents=contents) + + await plugin.before_model_callback( + callback_context=Mock(spec=CallbackContext), llm_request=llm_request + ) + + assert len(llm_request.contents) == 2 + assert all(c.role == "user" for c in llm_request.contents) + + +@pytest.mark.asyncio +async def test_filter_with_function_and_last_n_invocations(): + """Tests that both filtering methods are applied correctly.""" + + def remove_first_invocation(contents): + return contents[2:] + + plugin = ContextFilterPlugin( + num_invocations_to_keep=1, custom_filter=remove_first_invocation + ) + contents = [ + _create_content("user", "user_prompt_1"), + _create_content("model", "model_response_1"), + _create_content("user", "user_prompt_2"), + _create_content("model", "model_response_2"), + _create_content("user", "user_prompt_3"), + _create_content("model", "model_response_3"), + ] + llm_request = LlmRequest(contents=contents) + + await plugin.before_model_callback( + callback_context=Mock(spec=CallbackContext), llm_request=llm_request + ) + + assert len(llm_request.contents) == 0 + + +@pytest.mark.asyncio +async def test_no_filtering_when_no_options_provided(): + """Tests that no filtering occurs when no options are provided.""" + plugin = ContextFilterPlugin() + contents = [ + _create_content("user", "user_prompt_1"), + _create_content("model", "model_response_1"), + ] + llm_request = LlmRequest(contents=contents) + original_contents = list(llm_request.contents) + + await plugin.before_model_callback( + callback_context=Mock(spec=CallbackContext), llm_request=llm_request + ) + + assert llm_request.contents == original_contents + + +@pytest.mark.asyncio +async def test_last_n_invocations_with_multiple_user_turns(): + """Tests filtering with multiple user turns in a single invocation.""" + plugin = ContextFilterPlugin(num_invocations_to_keep=1) + contents = [ + _create_content("user", "user_prompt_1"), + _create_content("model", "model_response_1"), + _create_content("user", "user_prompt_2a"), + _create_content("user", "user_prompt_2b"), + _create_content("model", "model_response_2"), + ] + llm_request = LlmRequest(contents=contents) + + await plugin.before_model_callback( + callback_context=Mock(spec=CallbackContext), llm_request=llm_request + ) + + assert len(llm_request.contents) == 3 + assert llm_request.contents[0].parts[0].text == "user_prompt_2a" + assert llm_request.contents[1].parts[0].text == "user_prompt_2b" + assert llm_request.contents[2].parts[0].text == "model_response_2" + + +@pytest.mark.asyncio +async def test_last_n_invocations_more_than_existing_invocations(): + """Tests that no filtering occurs if last_n_invocations is greater than + + the number of invocations. + """ + plugin = ContextFilterPlugin(num_invocations_to_keep=3) + contents = [ + _create_content("user", "user_prompt_1"), + _create_content("model", "model_response_1"), + _create_content("user", "user_prompt_2"), + _create_content("model", "model_response_2"), + ] + llm_request = LlmRequest(contents=contents) + original_contents = list(llm_request.contents) + + await plugin.before_model_callback( + callback_context=Mock(spec=CallbackContext), llm_request=llm_request + ) + + assert llm_request.contents == original_contents + + +@pytest.mark.asyncio +async def test_filter_function_raises_exception(): + """Tests that the plugin handles exceptions from the filter function.""" + + def faulty_filter(contents): + raise ValueError("Filter error") + + plugin = ContextFilterPlugin(custom_filter=faulty_filter) + contents = [ + _create_content("user", "user_prompt_1"), + _create_content("model", "model_response_1"), + ] + llm_request = LlmRequest(contents=contents) + original_contents = list(llm_request.contents) + + await plugin.before_model_callback( + callback_context=Mock(spec=CallbackContext), llm_request=llm_request + ) + + assert llm_request.contents == original_contents diff --git a/tests/unittests/plugins/test_global_instruction_plugin.py b/tests/unittests/plugins/test_global_instruction_plugin.py new file mode 100644 index 0000000000..851f3a9334 --- /dev/null +++ b/tests/unittests/plugins/test_global_instruction_plugin.py @@ -0,0 +1,208 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from unittest.mock import Mock + +from google.adk.agents.callback_context import CallbackContext +from google.adk.agents.invocation_context import InvocationContext +from google.adk.agents.llm_agent import Agent +from google.adk.agents.readonly_context import ReadonlyContext +from google.adk.models.llm_request import LlmRequest +from google.adk.plugins.global_instruction_plugin import GlobalInstructionPlugin +from google.adk.sessions.session import Session +from google.genai import types +import pytest + + +@pytest.mark.asyncio +async def test_global_instruction_plugin_with_string(): + """Test GlobalInstructionPlugin with a string global instruction.""" + plugin = GlobalInstructionPlugin( + global_instruction=( + "You are a helpful assistant with a friendly personality." + ) + ) + + # Create mock objects + mock_session = Session( + app_name="test_app", user_id="test_user", id="test_session", state={} + ) + + mock_invocation_context = Mock(spec=InvocationContext) + mock_invocation_context.session = mock_session + + mock_callback_context = Mock(spec=CallbackContext) + mock_callback_context._invocation_context = mock_invocation_context + + llm_request = LlmRequest( + model="gemini-1.5-flash", + config=types.GenerateContentConfig(system_instruction=""), + ) + + # Execute the plugin's before_model_callback + result = await plugin.before_model_callback( + callback_context=mock_callback_context, llm_request=llm_request + ) + + # Plugin should return None to allow normal processing + assert result is None + + # System instruction should now contain the global instruction + assert ( + "You are a helpful assistant with a friendly personality." + in llm_request.config.system_instruction + ) + + +@pytest.mark.asyncio +async def test_global_instruction_plugin_with_instruction_provider(): + """Test GlobalInstructionPlugin with an InstructionProvider function.""" + + async def build_global_instruction(readonly_context: ReadonlyContext) -> str: + return f"You are assistant for user {readonly_context.session.user_id}." + + plugin = GlobalInstructionPlugin(global_instruction=build_global_instruction) + + # Create mock objects + mock_session = Session( + app_name="test_app", user_id="alice", id="test_session", state={} + ) + + mock_invocation_context = Mock(spec=InvocationContext) + + mock_callback_context = Mock(spec=CallbackContext) + mock_callback_context._invocation_context = mock_invocation_context + mock_callback_context.session = mock_session + + llm_request = LlmRequest( + model="gemini-1.5-flash", + config=types.GenerateContentConfig(system_instruction=""), + ) + + # Execute the plugin's before_model_callback + result = await plugin.before_model_callback( + callback_context=mock_callback_context, llm_request=llm_request + ) + + # Plugin should return None to allow normal processing + assert result is None + + # System instruction should contain the dynamically generated instruction + assert ( + "You are assistant for user alice." + in llm_request.config.system_instruction + ) + + +@pytest.mark.asyncio +async def test_global_instruction_plugin_empty_instruction(): + """Test GlobalInstructionPlugin with empty global instruction.""" + plugin = GlobalInstructionPlugin(global_instruction="") + + # Create mock objects + mock_session = Session( + app_name="test_app", user_id="test_user", id="test_session", state={} + ) + + mock_invocation_context = Mock(spec=InvocationContext) + mock_invocation_context.session = mock_session + + mock_callback_context = Mock(spec=CallbackContext) + mock_callback_context._invocation_context = mock_invocation_context + + llm_request = LlmRequest( + model="gemini-1.5-flash", + config=types.GenerateContentConfig( + system_instruction="Original instruction" + ), + ) + + # Execute the plugin's before_model_callback + result = await plugin.before_model_callback( + callback_context=mock_callback_context, llm_request=llm_request + ) + + # Plugin should return None to allow normal processing + assert result is None + + # System instruction should remain unchanged + assert llm_request.config.system_instruction == "Original instruction" + + +@pytest.mark.asyncio +async def test_global_instruction_plugin_leads_existing(): + """Test that GlobalInstructionPlugin prepends global instructions.""" + plugin = GlobalInstructionPlugin( + global_instruction="You are a helpful assistant." + ) + + # Create mock objects + mock_session = Session( + app_name="test_app", user_id="test_user", id="test_session", state={} + ) + + mock_invocation_context = Mock(spec=InvocationContext) + mock_invocation_context.session = mock_session + + mock_callback_context = Mock(spec=CallbackContext) + mock_callback_context._invocation_context = mock_invocation_context + + llm_request = LlmRequest( + model="gemini-1.5-flash", + config=types.GenerateContentConfig( + system_instruction="Existing instructions." + ), + ) + + # Execute the plugin's before_model_callback + result = await plugin.before_model_callback( + callback_context=mock_callback_context, llm_request=llm_request + ) + + # Plugin should return None to allow normal processing + assert result is None + + # System instruction should contain global instruction before existing ones + expected = "You are a helpful assistant.\n\nExisting instructions." + assert llm_request.config.system_instruction == expected + + +@pytest.mark.asyncio +async def test_global_instruction_plugin_prepends_to_list(): + """Test GlobalInstructionPlugin prepends to a list of instructions.""" + plugin = GlobalInstructionPlugin(global_instruction="Global instruction.") + + mock_session = Session( + app_name="test_app", user_id="test_user", id="test_session", state={} + ) + + mock_invocation_context = Mock(spec=InvocationContext) + mock_invocation_context.session = mock_session + + mock_callback_context = Mock(spec=CallbackContext) + mock_callback_context._invocation_context = mock_invocation_context + + llm_request = LlmRequest( + model="gemini-1.5-flash", + config=types.GenerateContentConfig( + system_instruction=["Existing instruction."] + ), + ) + + await plugin.before_model_callback( + callback_context=mock_callback_context, llm_request=llm_request + ) + + expected = ["Global instruction.", "Existing instruction."] + assert llm_request.config.system_instruction == expected diff --git a/tests/unittests/plugins/test_reflect_retry_tool_plugin.py b/tests/unittests/plugins/test_reflect_retry_tool_plugin.py new file mode 100644 index 0000000000..1e15f33899 --- /dev/null +++ b/tests/unittests/plugins/test_reflect_retry_tool_plugin.py @@ -0,0 +1,583 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from typing import Any +from unittest import IsolatedAsyncioTestCase +from unittest.mock import Mock + +from google.adk.agents.llm_agent import LlmAgent +from google.adk.plugins.reflect_retry_tool_plugin import REFLECT_AND_RETRY_RESPONSE_TYPE +from google.adk.plugins.reflect_retry_tool_plugin import ReflectAndRetryToolPlugin +from google.adk.tools.base_tool import BaseTool +from google.adk.tools.tool_context import ToolContext +from google.genai import types + +from .. import testing_utils + + +class MockTool(BaseTool): + """Mock tool for testing purposes.""" + + def __init__(self, name: str = "mock_tool"): + self.name = name + self.description = f"Mock tool named {name}" + + async def run(self, **kwargs) -> Any: + return "mock result" + + +class CustomErrorExtractionPlugin(ReflectAndRetryToolPlugin): + """Custom plugin for testing error extraction from tool responses.""" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.error_conditions = {} + + def set_error_condition(self, condition_func): + """Set a custom error condition function for testing.""" + self.error_condition = condition_func + + async def extract_error_from_result( + self, *, tool, tool_args, tool_context, result + ): + """Extract error based on custom conditions set for testing.""" + if hasattr(self, "error_condition"): + return self.error_condition(result) + return None + + +# Inheriting from IsolatedAsyncioTestCase ensures these tests works in Python +# 3.9. See https://github.com/pytest-dev/pytest-asyncio/issues/1039 +# Without this, the tests will fail with a "RuntimeError: There is no current +# event loop in thread 'MainThread'." +class TestReflectAndRetryToolPlugin(IsolatedAsyncioTestCase): + """Comprehensive tests for ReflectAndRetryToolPlugin focusing on behavior.""" + + def get_plugin(self): + """Create a default plugin instance for testing.""" + return ReflectAndRetryToolPlugin() + + def get_custom_plugin(self): + """Create a plugin with custom parameters.""" + return ReflectAndRetryToolPlugin( + name="custom_plugin", + max_retries=5, + throw_exception_if_retry_exceeded=False, + ) + + def get_mock_tool(self): + """Create a mock tool for testing.""" + return MockTool("test_tool_id") + + def get_mock_tool_context(self): + """Create a mock tool context.""" + return Mock(spec=ToolContext) + + def get_custom_error_plugin(self): + """Create a custom error extraction plugin for testing.""" + return CustomErrorExtractionPlugin(max_retries=3) + + def get_sample_tool_args(self): + """Sample tool arguments for testing.""" + return {"param1": "value1", "param2": 42, "param3": True} + + async def test_plugin_initialization_default(self): + """Test plugin initialization with default parameters.""" + plugin = self.get_plugin() + + self.assertEqual(plugin.name, "reflect_retry_tool_plugin") + self.assertEqual(plugin.max_retries, 3) + self.assertIs(plugin.throw_exception_if_retry_exceeded, True) + + async def test_plugin_initialization_custom(self): + """Test plugin initialization with custom parameters.""" + plugin = ReflectAndRetryToolPlugin( + name="custom_name", + max_retries=10, + throw_exception_if_retry_exceeded=False, + ) + + self.assertEqual(plugin.name, "custom_name") + self.assertEqual(plugin.max_retries, 10) + self.assertIsNot(plugin.throw_exception_if_retry_exceeded, True) + + async def test_after_tool_callback_successful_call(self): + """Test after_tool_callback with successful tool call.""" + plugin = self.get_plugin() + mock_tool = self.get_mock_tool() + mock_tool_context = self.get_mock_tool_context() + sample_tool_args = self.get_sample_tool_args() + result = {"success": True, "data": "test_data"} + + callback_result = await plugin.after_tool_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + result=result, + ) + + # Should return None for successful calls + self.assertIsNone(callback_result) + + async def test_after_tool_callback_ignore_retry_response(self): + """Test that retry responses are ignored in after_tool_callback.""" + plugin = self.get_plugin() + mock_tool = self.get_mock_tool() + mock_tool_context = self.get_mock_tool_context() + sample_tool_args = self.get_sample_tool_args() + retry_result = {"response_type": REFLECT_AND_RETRY_RESPONSE_TYPE} + + callback_result = await plugin.after_tool_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + result=retry_result, + ) + + # Retry responses should be ignored + self.assertIsNone(callback_result) + + async def test_on_tool_error_callback_max_retries_zero(self): + """Test error callback when max_retries is 0. + + This should return None so that the exception is rethrown + """ + mock_tool = self.get_mock_tool() + mock_tool_context = self.get_mock_tool_context() + sample_tool_args = self.get_sample_tool_args() + plugin = ReflectAndRetryToolPlugin(max_retries=0) + error = ValueError("Test error") + + with self.assertRaises(ValueError) as cm: + await plugin.on_tool_error_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + error=error, + ) + + # Should re-raise the original exception when max_retries is 0 + self.assertIs(cm.exception, error) + + async def test_on_tool_error_callback_first_failure(self): + """Test first tool failure creates reflection response.""" + plugin = self.get_plugin() + mock_tool = self.get_mock_tool() + mock_tool_context = self.get_mock_tool_context() + sample_tool_args = self.get_sample_tool_args() + error = ValueError("Test error message") + + result = await plugin.on_tool_error_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + error=error, + ) + + self.assertIsNotNone(result) + self.assertEqual(result["response_type"], REFLECT_AND_RETRY_RESPONSE_TYPE) + self.assertEqual(result["error_type"], "ValueError") + self.assertEqual(result["error_details"], "Test error message") + self.assertEqual(result["retry_count"], 1) + self.assertIn("test_tool_id", result["reflection_guidance"]) + self.assertIn("Test error message", result["reflection_guidance"]) + + async def test_retry_behavior_with_consecutive_failures(self): + """Test the retry behavior with consecutive failures.""" + plugin = self.get_plugin() + mock_tool = self.get_mock_tool() + mock_tool_context = self.get_mock_tool_context() + sample_tool_args = self.get_sample_tool_args() + error = RuntimeError("Runtime error") + + # First failure + result1 = await plugin.on_tool_error_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + error=error, + ) + self.assertEqual(result1["retry_count"], 1) + + # Second failure - should have different retry count based on plugin logic + result2 = await plugin.on_tool_error_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + error=error, + ) + # The plugin's internal logic determines the exact retry count + self.assertIsNotNone(result2) + self.assertEqual(result2["response_type"], REFLECT_AND_RETRY_RESPONSE_TYPE) + self.assertEqual(result2["retry_count"], 2) + + async def test_different_tools_behavior(self): + """Test behavior when using different tools.""" + plugin = self.get_plugin() + mock_tool_context = self.get_mock_tool_context() + sample_tool_args = self.get_sample_tool_args() + tool1 = MockTool("tool1") + tool2 = MockTool("tool2") + error = ValueError("Test error") + + # First failure on tool1 + result1 = await plugin.on_tool_error_callback( + tool=tool1, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + error=error, + ) + self.assertEqual(result1["retry_count"], 1) + + # Failure on tool2 + result2 = await plugin.on_tool_error_callback( + tool=tool2, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + error=error, + ) + # Since tool is different, retry count should start over. + self.assertIsNotNone(result2) + self.assertEqual(result2["response_type"], REFLECT_AND_RETRY_RESPONSE_TYPE) + self.assertEqual(result2["retry_count"], 1) + + async def test_max_retries_exceeded_with_exception(self): + """Test that original exception is raised when max retries exceeded.""" + mock_tool = self.get_mock_tool() + mock_tool_context = self.get_mock_tool_context() + sample_tool_args = self.get_sample_tool_args() + plugin = ReflectAndRetryToolPlugin( + max_retries=1, throw_exception_if_retry_exceeded=True + ) + error = ConnectionError("Connection failed") + + # First call should succeed and return a retry response + await plugin.on_tool_error_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + error=error, + ) + + # Second call should exceed max_retries and raise + with self.assertRaises(ConnectionError) as cm: + await plugin.on_tool_error_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + error=error, + ) + + # Verify exception properties + self.assertIs(cm.exception, error) + + async def test_max_retries_exceeded_without_exception(self): + """Test max retries exceeded returns failure message when exception is disabled.""" + mock_tool = self.get_mock_tool() + mock_tool_context = self.get_mock_tool_context() + sample_tool_args = self.get_sample_tool_args() + plugin = ReflectAndRetryToolPlugin( + max_retries=2, throw_exception_if_retry_exceeded=False + ) + error = TimeoutError("Timeout occurred") + + # Call until we exceed the retry limit + result = None + for _ in range(3): + result = await plugin.on_tool_error_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + error=error, + ) + + # Should get a retry exceeded message on the last call + self.assertIsNotNone(result) + self.assertEqual(result["response_type"], REFLECT_AND_RETRY_RESPONSE_TYPE) + self.assertEqual(result["error_type"], "TimeoutError") + self.assertIn( + "the retry limit has been exceeded", result["reflection_guidance"] + ) + self.assertIn("Do not attempt to use the", result["reflection_guidance"]) + + async def test_successful_call_resets_retry_behavior(self): + """Test that successful calls reset the retry behavior.""" + plugin = self.get_plugin() + mock_tool = self.get_mock_tool() + mock_tool_context = self.get_mock_tool_context() + sample_tool_args = self.get_sample_tool_args() + error = ValueError("Test error") + + # First failure + result1 = await plugin.on_tool_error_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + error=error, + ) + self.assertEqual(result1["retry_count"], 1) + + # Successful call + await plugin.after_tool_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + result={"success": True}, + ) + + # Next failure should start fresh + result2 = await plugin.on_tool_error_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + error=error, + ) + self.assertEqual(result2["retry_count"], 1) # Should restart from 1 + + async def test_none_result_handling(self): + """Test handling of None results in after_tool_callback.""" + plugin = self.get_plugin() + mock_tool = self.get_mock_tool() + mock_tool_context = self.get_mock_tool_context() + sample_tool_args = self.get_sample_tool_args() + + # None result should be handled gracefully + callback_result = await plugin.after_tool_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + result=None, + ) + + self.assertIsNone(callback_result) + + async def test_empty_tool_args_handling(self): + """Test handling of empty tool arguments.""" + plugin = self.get_plugin() + mock_tool = self.get_mock_tool() + mock_tool_context = self.get_mock_tool_context() + empty_args = {} + error = ValueError("Test error") + + result = await plugin.on_tool_error_callback( + tool=mock_tool, + tool_args=empty_args, + tool_context=mock_tool_context, + error=error, + ) + + self.assertIsNotNone(result) + # Empty args should be represented in the response + self.assertIn("{}", result["reflection_guidance"]) + + async def test_retry_count_progression(self): + """Test that retry counts progress correctly for the same tool.""" + mock_tool_context = self.get_mock_tool_context() + sample_tool_args = self.get_sample_tool_args() + plugin = ReflectAndRetryToolPlugin(max_retries=5) + error = ValueError("Test error") + tool = MockTool("single_tool") + + for i in range(1, 4): + result = await plugin.on_tool_error_callback( + tool=tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + error=error, + ) + self.assertEqual(result["retry_count"], i) + + async def test_max_retries_parameter_behavior(self): + """Test that max_retries parameter affects behavior correctly.""" + mock_tool = self.get_mock_tool() + mock_tool_context = self.get_mock_tool_context() + sample_tool_args = self.get_sample_tool_args() + # Test with very low max_retries + plugin = ReflectAndRetryToolPlugin( + max_retries=1, throw_exception_if_retry_exceeded=False + ) + error = ValueError("Test error") + + # First call is fine + await plugin.on_tool_error_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + error=error, + ) + + # Second call exceeds limit + result = await plugin.on_tool_error_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + error=error, + ) + + # Should hit max retries quickly with max_retries=1 + self.assertIn( + "the retry limit has been exceeded.", result["reflection_guidance"] + ) + + async def test_default_extract_error_returns_none(self): + """Test that default extract_error_from_result returns None.""" + plugin = self.get_plugin() + mock_tool = self.get_mock_tool() + mock_tool_context = self.get_mock_tool_context() + sample_tool_args = self.get_sample_tool_args() + result = {"status": "success", "data": "some data"} + + error = await plugin.extract_error_from_result( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + result=result, + ) + self.assertIsNone(error) + + async def test_custom_error_detection_and_success_handling(self): + """Test custom error detection, success handling, and retry progression.""" + custom_error_plugin = self.get_custom_error_plugin() + mock_tool = self.get_mock_tool() + mock_tool_context = self.get_mock_tool_context() + sample_tool_args = self.get_sample_tool_args() + custom_error_plugin.set_error_condition( + lambda result: result if result.get("status") == "error" else None + ) + + # Test error detection + error_result = {"status": "error", "message": "Something went wrong"} + callback_result = await custom_error_plugin.after_tool_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + result=error_result, + ) + self.assertIsNotNone(callback_result) + self.assertEqual( + callback_result["response_type"], REFLECT_AND_RETRY_RESPONSE_TYPE + ) + self.assertEqual(callback_result["retry_count"], 1) + + # Test success handling + success_result = {"status": "success", "data": "operation completed"} + callback_result = await custom_error_plugin.after_tool_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + result=success_result, + ) + self.assertIsNone(callback_result) + + async def test_retry_state_management(self): + """Test retry state management with custom errors and mixed error types.""" + custom_error_plugin = self.get_custom_error_plugin() + mock_tool = self.get_mock_tool() + mock_tool_context = self.get_mock_tool_context() + sample_tool_args = self.get_sample_tool_args() + custom_error_plugin.set_error_condition( + lambda result: result if result.get("failed") else None + ) + + # Custom error followed by exception + custom_error = {"failed": True, "reason": "Network timeout"} + result1 = await custom_error_plugin.after_tool_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + result=custom_error, + ) + self.assertEqual(result1["retry_count"], 1) + + # Exception should increment retry count + exception = ValueError("Invalid parameter") + result2 = await custom_error_plugin.on_tool_error_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + error=exception, + ) + self.assertEqual(result2["retry_count"], 2) + + # Success should reset + success = {"result": "success"} + result3 = await custom_error_plugin.after_tool_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + result=success, + ) + self.assertIsNone(result3) + + # Next error should start fresh + result4 = await custom_error_plugin.after_tool_callback( + tool=mock_tool, + tool_args=sample_tool_args, + tool_context=mock_tool_context, + result=custom_error, + ) + self.assertEqual(result4["retry_count"], 1) + + async def test_hallucinating_tool_name(self): + """Test that hallucinating tool name is handled correctly.""" + wrong_function_call = types.Part.from_function_call( + name="increase_by_one", args={"x": 1} + ) + correct_function_call = types.Part.from_function_call( + name="increase", args={"x": 1} + ) + responses: list[types.Content] = [ + wrong_function_call, + correct_function_call, + "response1", + ] + mock_model = testing_utils.MockModel.create(responses=responses) + + function_called = 0 + + def increase(x: int) -> int: + nonlocal function_called + function_called += 1 + return x + 1 + + agent = LlmAgent(name="root_agent", model=mock_model, tools=[increase]) + runner = testing_utils.TestInMemoryRunner( + agent=agent, plugins=[self.get_plugin()] + ) + + events = await runner.run_async_with_new_session("test") + + # Assert that the first event is a function call with the wrong name + assert events[0].content.parts[0].function_call.name == "increase_by_one" + + # Assert that the second event is a function response with the + # reflection_guidance + assert ( + events[1].content.parts[0].function_response.response["error_type"] + == "ValueError" + ) + assert ( + events[1].content.parts[0].function_response.response["retry_count"] + == 1 + ) + assert ( + "Wrong Function Name" + in events[1] + .content.parts[0] + .function_response.response["reflection_guidance"] + ) + + # Assert that the third event is a function call with the correct name + assert events[2].content.parts[0].function_call.name == "increase" + self.assertEqual(function_called, 1) diff --git a/tests/unittests/plugins/test_save_files_as_artifacts.py b/tests/unittests/plugins/test_save_files_as_artifacts.py new file mode 100644 index 0000000000..80b2ae019e --- /dev/null +++ b/tests/unittests/plugins/test_save_files_as_artifacts.py @@ -0,0 +1,297 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +from unittest.mock import AsyncMock +from unittest.mock import Mock + +from google.adk.agents.invocation_context import InvocationContext +from google.adk.plugins.save_files_as_artifacts_plugin import SaveFilesAsArtifactsPlugin +from google.genai import types +import pytest + + +class TestSaveFilesAsArtifactsPlugin: + """Test suite for SaveFilesAsArtifactsPlugin.""" + + def setup_method(self): + """Set up test fixtures.""" + self.plugin = SaveFilesAsArtifactsPlugin() + + # Mock invocation context + self.mock_context = Mock(spec=InvocationContext) + self.mock_context.artifact_service = AsyncMock() + self.mock_context.app_name = "test_app" + self.mock_context.user_id = "test_user" + self.mock_context.invocation_id = "test_invocation_123" + self.mock_context.session = Mock() + self.mock_context.session.id = "test_session" + + @pytest.mark.asyncio + async def test_save_files_with_display_name(self): + """Test saving files when inline_data has display_name.""" + # Create a message with inline data + inline_data = types.Blob( + display_name="test_document.pdf", + data=b"test data", + mime_type="application/pdf", + ) + + original_part = types.Part(inline_data=inline_data) + user_message = types.Content(parts=[original_part]) + + # Execute the plugin + result = await self.plugin.on_user_message_callback( + invocation_context=self.mock_context, user_message=user_message + ) + + # Verify artifact was saved with correct filename (session-scoped by default) + self.mock_context.artifact_service.save_artifact.assert_called_once_with( + app_name="test_app", + user_id="test_user", + session_id="test_session", + filename="test_document.pdf", + artifact=original_part, + ) + + # Verify message was modified with placeholder (clean name) + assert result.parts[0].text == '[Uploaded Artifact: "test_document.pdf"]' + + @pytest.mark.asyncio + async def test_save_files_without_display_name(self): + """Test saving files when inline_data has no display_name.""" + # Create inline data without display_name + inline_data = types.Blob( + display_name=None, data=b"test data", mime_type="application/pdf" + ) + + original_part = types.Part(inline_data=inline_data) + user_message = types.Content(parts=[original_part]) + + # Execute the plugin + result = await self.plugin.on_user_message_callback( + invocation_context=self.mock_context, user_message=user_message + ) + + # Verify artifact was saved with generated filename (session-scoped by default) + expected_filename = "artifact_test_invocation_123_0" + self.mock_context.artifact_service.save_artifact.assert_called_once_with( + app_name="test_app", + user_id="test_user", + session_id="test_session", + filename=expected_filename, + artifact=original_part, + ) + + # Verify message was modified with generated filename (clean name) + generated_display_name = "artifact_test_invocation_123_0" + assert ( + result.parts[0].text + == f'[Uploaded Artifact: "{generated_display_name}"]' + ) + + @pytest.mark.asyncio + async def test_multiple_files_in_message(self): + """Test handling multiple files in a single message.""" + # Create message with multiple inline data parts + inline_data1 = types.Blob( + display_name="file1.txt", data=b"file1 content", mime_type="text/plain" + ) + + inline_data2 = types.Blob( + display_name="file2.jpg", data=b"file2 content", mime_type="image/jpeg" + ) + + user_message = types.Content( + parts=[ + types.Part(inline_data=inline_data1), + types.Part(text="Some text between files"), + types.Part(inline_data=inline_data2), + ] + ) + + # Execute the plugin + result = await self.plugin.on_user_message_callback( + invocation_context=self.mock_context, user_message=user_message + ) + + # Verify both artifacts were saved + assert self.mock_context.artifact_service.save_artifact.call_count == 2 + + # Check first file + first_call = ( + self.mock_context.artifact_service.save_artifact.call_args_list[0] + ) + assert first_call[1]["filename"] == "file1.txt" + + # Check second file + second_call = ( + self.mock_context.artifact_service.save_artifact.call_args_list[1] + ) + assert second_call[1]["filename"] == "file2.jpg" + + # Verify message parts were modified correctly (clean names) + assert result.parts[0].text == '[Uploaded Artifact: "file1.txt"]' + assert result.parts[1].text == "Some text between files" # Unchanged + assert result.parts[2].text == '[Uploaded Artifact: "file2.jpg"]' + + @pytest.mark.asyncio + async def test_no_artifact_service(self): + """Test behavior when artifact service is not available.""" + # Set artifact service to None + self.mock_context.artifact_service = None + + inline_data = types.Blob( + display_name="test.pdf", data=b"test data", mime_type="application/pdf" + ) + + user_message = types.Content(parts=[types.Part(inline_data=inline_data)]) + + # Execute the plugin + result = await self.plugin.on_user_message_callback( + invocation_context=self.mock_context, user_message=user_message + ) + + # Should return original message unchanged + assert result == user_message + assert result.parts[0].inline_data == inline_data + + @pytest.mark.asyncio + async def test_no_parts_in_message(self): + """Test behavior when message has no parts.""" + user_message = types.Content(parts=[]) + + # Execute the plugin + result = await self.plugin.on_user_message_callback( + invocation_context=self.mock_context, user_message=user_message + ) + + # Should return None to proceed with original message + assert result is None + + # Should not try to save any artifacts + self.mock_context.artifact_service.save_artifact.assert_not_called() + + @pytest.mark.asyncio + async def test_parts_without_inline_data(self): + """Test behavior with parts that don't have inline_data.""" + user_message = types.Content( + parts=[types.Part(text="Hello world"), types.Part(text="No files here")] + ) + + # Execute the plugin + result = await self.plugin.on_user_message_callback( + invocation_context=self.mock_context, user_message=user_message + ) + + # Should return None to proceed with original message + assert result is None + + # Should not try to save any artifacts + self.mock_context.artifact_service.save_artifact.assert_not_called() + + @pytest.mark.asyncio + async def test_save_artifact_failure(self): + """Test behavior when saving artifact fails.""" + # Mock save_artifact to raise an exception + self.mock_context.artifact_service.save_artifact.side_effect = Exception( + "Storage error" + ) + + inline_data = types.Blob( + display_name="test.pdf", data=b"test data", mime_type="application/pdf" + ) + + original_part = types.Part(inline_data=inline_data) + user_message = types.Content(parts=[original_part]) + + # Execute the plugin - should not raise exception + result = await self.plugin.on_user_message_callback( + invocation_context=self.mock_context, user_message=user_message + ) + + # Should return None when saving fails (no modifications made) + assert result is None + + @pytest.mark.asyncio + async def test_mixed_success_and_failure(self): + """Test behavior when some files save successfully and others fail.""" + # Mock save_artifact to succeed on first call, fail on second + save_calls = 0 + + def mock_save_artifact(*_args, **_kwargs): + nonlocal save_calls + save_calls += 1 + if save_calls == 2: + raise Exception("Storage error on second file") + return AsyncMock() + + self.mock_context.artifact_service.save_artifact.side_effect = ( + mock_save_artifact + ) + + inline_data1 = types.Blob( + display_name="success.pdf", + data=b"success data", + mime_type="application/pdf", + ) + + inline_data2 = types.Blob( + display_name="failure.pdf", + data=b"failure data", + mime_type="application/pdf", + ) + + original_part2 = types.Part(inline_data=inline_data2) + user_message = types.Content( + parts=[types.Part(inline_data=inline_data1), original_part2] + ) + + # Execute the plugin + result = await self.plugin.on_user_message_callback( + invocation_context=self.mock_context, user_message=user_message + ) + + # First file should be replaced with placeholder (clean name) + assert result.parts[0].text == '[Uploaded Artifact: "success.pdf"]' + + # Second file should remain unchanged due to failure + assert result.parts[1] == original_part2 + assert result.parts[1].inline_data == inline_data2 + + @pytest.mark.asyncio + async def test_placeholder_text_format(self): + """Test that placeholder text is formatted correctly.""" + inline_data = types.Blob( + display_name="test file with spaces.docx", + data=b"document data", + mime_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document", + ) + + user_message = types.Content(parts=[types.Part(inline_data=inline_data)]) + + # Execute the plugin + result = await self.plugin.on_user_message_callback( + invocation_context=self.mock_context, user_message=user_message + ) + + # Verify exact format of placeholder text (clean name) + expected_text = '[Uploaded Artifact: "test file with spaces.docx"]' + assert result.parts[0].text == expected_text + + def test_plugin_name_default(self): + """Test that plugin has correct default name.""" + plugin = SaveFilesAsArtifactsPlugin() + assert plugin.name == "save_files_as_artifacts_plugin" diff --git a/tests/unittests/runners/__init__.py b/tests/unittests/runners/__init__.py new file mode 100644 index 0000000000..0a2669d7a2 --- /dev/null +++ b/tests/unittests/runners/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/tests/unittests/runners/test_pause_invocation.py b/tests/unittests/runners/test_pause_invocation.py new file mode 100644 index 0000000000..79a42c1967 --- /dev/null +++ b/tests/unittests/runners/test_pause_invocation.py @@ -0,0 +1,528 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for the resumption flow with different agent structures.""" + +import asyncio +from typing import AsyncGenerator + +from google.adk.agents.base_agent import BaseAgent +from google.adk.agents.invocation_context import InvocationContext +from google.adk.agents.llm_agent import LlmAgent +from google.adk.agents.loop_agent import LoopAgent +from google.adk.agents.loop_agent import LoopAgentState +from google.adk.agents.parallel_agent import ParallelAgent +from google.adk.agents.sequential_agent import SequentialAgent +from google.adk.agents.sequential_agent import SequentialAgentState +from google.adk.apps.app import App +from google.adk.apps.app import ResumabilityConfig +from google.adk.events.event import Event +from google.adk.tools.exit_loop_tool import exit_loop +from google.adk.tools.function_tool import FunctionTool +from google.adk.tools.long_running_tool import LongRunningFunctionTool +from google.genai.types import Part +import pytest + +from .. import testing_utils + + +def _transfer_call_part(agent_name: str) -> Part: + return Part.from_function_call( + name="transfer_to_agent", args={"agent_name": agent_name} + ) + + +def test_tool() -> str: + return "result" + + +class _TestingAgent(BaseAgent): + """A testing agent that generates an event after a delay.""" + + delay: float = 0 + """The delay before the agent generates an event.""" + + def event(self, ctx: InvocationContext): + return Event( + author=self.name, + branch=ctx.branch, + invocation_id=ctx.invocation_id, + content=testing_utils.ModelContent( + parts=[Part.from_text(text="Delayed message")] + ), + ) + + async def _run_async_impl( + self, ctx: InvocationContext + ) -> AsyncGenerator[Event, None]: + await asyncio.sleep(self.delay) + yield self.event(ctx) + + +_TRANSFER_RESPONSE_PART = Part.from_function_response( + name="transfer_to_agent", response={"result": None} +) +END_OF_AGENT = testing_utils.END_OF_AGENT + + +class BasePauseInvocationTest: + """Base class for pausing invocation tests with common fixtures.""" + + @pytest.fixture + def agent(self) -> BaseAgent: + """Provides a BaseAgent for the test.""" + return BaseAgent(name="test_agent") + + @pytest.fixture + def app(self, agent: BaseAgent) -> App: + """Provides an App for the test.""" + return App( + name="test_app", + root_agent=agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + + @pytest.fixture + def runner(self, app: App) -> testing_utils.InMemoryRunner: + """Provides an in-memory runner for the agent.""" + return testing_utils.InMemoryRunner(app=app) + + @staticmethod + def mock_model(responses: list[Part]) -> testing_utils.MockModel: + """Provides a mock model with predefined responses.""" + return testing_utils.MockModel.create(responses=responses) + + +class TestPauseInvocationWithSingleLlmAgent(BasePauseInvocationTest): + """Tests the resumption flow with a single LlmAgent.""" + + @pytest.fixture + def agent(self) -> BaseAgent: + """Provides a BaseAgent for the test.""" + return LlmAgent( + name="root_agent", + model=self.mock_model( + responses=[Part.from_function_call(name="test_tool", args={})] + ), + tools=[LongRunningFunctionTool(func=test_tool)], + ) + + @pytest.mark.asyncio + def test_pause_on_long_running_function_call( + self, + runner: testing_utils.InMemoryRunner, + ): + """Tests that a single LlmAgent pauses on long running function call.""" + assert testing_utils.simplify_resumable_app_events(runner.run("test")) == [ + ("root_agent", Part.from_function_call(name="test_tool", args={})), + ( + "root_agent", + Part.from_function_response( + name="test_tool", response={"result": "result"} + ), + ), + ] + + +class TestPauseInvocationWithSequentialAgent(BasePauseInvocationTest): + """Tests pausing invocation with a SequentialAgent.""" + + @pytest.fixture + def agent(self) -> BaseAgent: + """Provides a BaseAgent for the test.""" + sub_agent1 = LlmAgent( + name="sub_agent_1", + model=self.mock_model( + responses=[Part.from_function_call(name="test_tool", args={})] + ), + tools=[LongRunningFunctionTool(func=test_tool)], + ) + sub_agent2 = LlmAgent( + name="sub_agent_2", + model=self.mock_model( + responses=[Part.from_function_call(name="test_tool", args={})] + ), + tools=[LongRunningFunctionTool(func=test_tool)], + ) + return SequentialAgent( + name="root_agent", + sub_agents=[sub_agent1, sub_agent2], + ) + + @pytest.mark.asyncio + def test_pause_first_agent_on_long_running_function_call( + self, + runner: testing_utils.InMemoryRunner, + ): + """Tests that a SequentialAgent pauses on the first sub-agent.""" + assert testing_utils.simplify_resumable_app_events(runner.run("test")) == [ + ( + "root_agent", + SequentialAgentState(current_sub_agent="sub_agent_1").model_dump( + mode="json" + ), + ), + ("sub_agent_1", Part.from_function_call(name="test_tool", args={})), + ( + "sub_agent_1", + Part.from_function_response( + name="test_tool", response={"result": "result"} + ), + ), + ] + + @pytest.mark.asyncio + def test_pause_second_agent_on_long_running_function_call( + self, + runner: testing_utils.InMemoryRunner, + ): + """Tests that a single LlmAgent pauses on long running function call.""" + # Change the base sequential agent, so that the first agent does not pause. + runner.root_agent.sub_agents[0].tools = [FunctionTool(func=test_tool)] + runner.root_agent.sub_agents[0].model = self.mock_model( + responses=[ + Part.from_function_call(name="test_tool", args={}), + Part.from_text(text="model response after tool call"), + ] + ) + assert testing_utils.simplify_resumable_app_events(runner.run("test")) == [ + ( + "root_agent", + SequentialAgentState(current_sub_agent="sub_agent_1").model_dump( + mode="json" + ), + ), + ("sub_agent_1", Part.from_function_call(name="test_tool", args={})), + ( + "sub_agent_1", + Part.from_function_response( + name="test_tool", response={"result": "result"} + ), + ), + ("sub_agent_1", "model response after tool call"), + ("sub_agent_1", END_OF_AGENT), + ( + "root_agent", + SequentialAgentState(current_sub_agent="sub_agent_2").model_dump( + mode="json" + ), + ), + ("sub_agent_2", Part.from_function_call(name="test_tool", args={})), + ( + "sub_agent_2", + Part.from_function_response( + name="test_tool", response={"result": "result"} + ), + ), + ] + + +class TestPauseInvocationWithParallelAgent(BasePauseInvocationTest): + """Tests pausing invocation with a ParallelAgent.""" + + @pytest.fixture + def agent(self) -> BaseAgent: + """Provides a BaseAgent for the test.""" + sub_agent1 = LlmAgent( + name="sub_agent_1", + model=self.mock_model( + responses=[Part.from_function_call(name="test_tool", args={})] + ), + tools=[LongRunningFunctionTool(func=test_tool)], + ) + sub_agent2 = _TestingAgent( + name="sub_agent_2", + delay=0.5, + ) + return ParallelAgent( + name="root_agent", + sub_agents=[sub_agent1, sub_agent2], + ) + + @pytest.mark.asyncio + def test_pause_on_long_running_function_call( + self, + runner: testing_utils.InMemoryRunner, + ): + """Tests that a ParallelAgent pauses on long running function call.""" + simplified_event_parts = testing_utils.simplify_resumable_app_events( + runner.run("test") + ) + assert ( + "sub_agent_1", + Part.from_function_call(name="test_tool", args={}), + ) in simplified_event_parts + assert ("sub_agent_2", "Delayed message") in simplified_event_parts + + +class TestPauseInvocationWithNestedParallelAgent(BasePauseInvocationTest): + """Tests pausing invocation with a nested ParallelAgent.""" + + @pytest.fixture + def agent(self) -> BaseAgent: + """Provides a BaseAgent for the test.""" + nested_sub_agent_1 = LlmAgent( + name="nested_sub_agent_1", + model=self.mock_model( + responses=[Part.from_function_call(name="test_tool", args={})] + ), + tools=[LongRunningFunctionTool(func=test_tool)], + ) + nested_sub_agent_2 = _TestingAgent( + name="nested_sub_agent_2", + delay=0.5, + ) + nested_parallel_agent = ParallelAgent( + name="nested_parallel_agent", + sub_agents=[nested_sub_agent_1, nested_sub_agent_2], + ) + sub_agent_1 = _TestingAgent( + name="sub_agent_1", + delay=0.5, + ) + return ParallelAgent( + name="root_agent", + sub_agents=[sub_agent_1, nested_parallel_agent], + ) + + @pytest.mark.asyncio + def test_pause_on_long_running_function_call( + self, + runner: testing_utils.InMemoryRunner, + ): + """Tests that a nested ParallelAgent pauses on long running function call.""" + simplified_event_parts = testing_utils.simplify_resumable_app_events( + runner.run("test") + ) + assert ( + "nested_sub_agent_1", + Part.from_function_call(name="test_tool", args={}), + ) in simplified_event_parts + assert ("sub_agent_1", "Delayed message") in simplified_event_parts + assert ("nested_sub_agent_2", "Delayed message") in simplified_event_parts + + @pytest.mark.asyncio + def test_pause_on_multiple_long_running_function_calls( + self, + runner: testing_utils.InMemoryRunner, + ): + """Tests that a ParallelAgent pauses on long running function calls.""" + runner.root_agent.sub_agents[0] = LlmAgent( + name="sub_agent_1", + model=self.mock_model( + responses=[ + Part.from_function_call(name="test_tool", args={}), + ] + ), + tools=[LongRunningFunctionTool(func=test_tool)], + ) + simplified_events = testing_utils.simplify_resumable_app_events( + runner.run("test") + ) + assert ( + "sub_agent_1", + Part.from_function_call(name="test_tool", args={}), + ) in simplified_events + assert ("sub_agent_1", END_OF_AGENT) not in simplified_events + assert ( + "nested_sub_agent_1", + Part.from_function_call(name="test_tool", args={}), + ) in simplified_events + assert ("nested_sub_agent_1", END_OF_AGENT) not in simplified_events + + +class TestPauseInvocationWithLoopAgent(BasePauseInvocationTest): + """Tests pausing invocation with a LoopAgent.""" + + @pytest.fixture + def agent(self) -> BaseAgent: + """Provides a BaseAgent for the test.""" + sub_agent_1 = LlmAgent( + name="sub_agent_1", + model=self.mock_model( + responses=[ + Part.from_text(text="sub agent 1 response"), + ] + ), + ) + sub_agent_2 = LlmAgent( + name="sub_agent_2", + model=self.mock_model( + responses=[ + Part.from_function_call(name="test_tool", args={}), + ] + ), + tools=[LongRunningFunctionTool(func=test_tool)], + ) + sub_agent_3 = LlmAgent( + name="sub_agent_3", + model=self.mock_model( + responses=[ + Part.from_function_call(name="exit_loop", args={}), + ] + ), + tools=[exit_loop], + ) + return LoopAgent( + name="root_agent", + sub_agents=[sub_agent_1, sub_agent_2, sub_agent_3], + max_iterations=2, + ) + + @pytest.mark.asyncio + def test_pause_on_long_running_function_call( + self, + runner: testing_utils.InMemoryRunner, + ): + """Tests that a LoopAgent pauses on long running function call.""" + assert testing_utils.simplify_resumable_app_events(runner.run("test")) == [ + ( + "root_agent", + LoopAgentState(current_sub_agent="sub_agent_1").model_dump( + mode="json" + ), + ), + ("sub_agent_1", "sub agent 1 response"), + ("sub_agent_1", END_OF_AGENT), + ( + "root_agent", + LoopAgentState(current_sub_agent="sub_agent_2").model_dump( + mode="json" + ), + ), + ("sub_agent_2", Part.from_function_call(name="test_tool", args={})), + ( + "sub_agent_2", + Part.from_function_response( + name="test_tool", response={"result": "result"} + ), + ), + ] + + +class TestPauseInvocationWithLlmAgentTree(BasePauseInvocationTest): + """Tests the pausing invocation with a tree of LlmAgents.""" + + @pytest.fixture + def agent(self) -> LlmAgent: + """Provides an LlmAgent with sub-agents for the test.""" + sub_llm_agent_1 = LlmAgent( + name="sub_llm_agent_1", + model=self.mock_model( + responses=[ + _transfer_call_part("sub_llm_agent_2"), + "llm response not used", + ] + ), + ) + sub_llm_agent_2 = LlmAgent( + name="sub_llm_agent_2", + model=self.mock_model( + responses=[ + Part.from_function_call(name="test_tool", args={}), + "llm response not used", + ] + ), + tools=[LongRunningFunctionTool(func=test_tool)], + ) + return LlmAgent( + name="root_agent", + model=self.mock_model( + responses=[ + _transfer_call_part("sub_llm_agent_1"), + "llm response not used", + ] + ), + sub_agents=[sub_llm_agent_1, sub_llm_agent_2], + ) + + @pytest.mark.asyncio + def test_pause_on_long_running_function_call( + self, + runner: testing_utils.InMemoryRunner, + ): + """Tests that a tree of resumable LlmAgents yields checkpoint events.""" + assert testing_utils.simplify_resumable_app_events(runner.run("test")) == [ + ("root_agent", _transfer_call_part("sub_llm_agent_1")), + ("root_agent", _TRANSFER_RESPONSE_PART), + ("sub_llm_agent_1", _transfer_call_part("sub_llm_agent_2")), + ("sub_llm_agent_1", _TRANSFER_RESPONSE_PART), + ("sub_llm_agent_2", Part.from_function_call(name="test_tool", args={})), + ( + "sub_llm_agent_2", + Part.from_function_response( + name="test_tool", response={"result": "result"} + ), + ), + ] + + +class TestPauseInvocationWithWithTransferLoop(BasePauseInvocationTest): + """Tests pausing the invocation when the agent transfer forms a loop.""" + + @pytest.fixture + def agent(self) -> LlmAgent: + """Provides an LlmAgent with sub-agents for the test.""" + sub_llm_agent_1 = LlmAgent( + name="sub_llm_agent_1", + model=self.mock_model( + responses=[ + _transfer_call_part("sub_llm_agent_2"), + "llm response not used", + ] + ), + ) + sub_llm_agent_2 = LlmAgent( + name="sub_llm_agent_2", + model=self.mock_model( + responses=[ + _transfer_call_part("root_agent"), + "llm response not used", + ] + ), + ) + return LlmAgent( + name="root_agent", + model=self.mock_model( + responses=[ + _transfer_call_part("sub_llm_agent_1"), + Part.from_function_call(name="test_tool", args={}), + "llm response not used", + ] + ), + sub_agents=[sub_llm_agent_1, sub_llm_agent_2], + tools=[LongRunningFunctionTool(func=test_tool)], + ) + + @pytest.mark.asyncio + def test_pause_on_long_running_function_call( + self, + runner: testing_utils.InMemoryRunner, + ): + """Tests that a tree of resumable LlmAgents yields checkpoint events.""" + assert testing_utils.simplify_resumable_app_events(runner.run("test")) == [ + ("root_agent", _transfer_call_part("sub_llm_agent_1")), + ("root_agent", _TRANSFER_RESPONSE_PART), + ("sub_llm_agent_1", _transfer_call_part("sub_llm_agent_2")), + ("sub_llm_agent_1", _TRANSFER_RESPONSE_PART), + ("sub_llm_agent_2", _transfer_call_part("root_agent")), + ("sub_llm_agent_2", _TRANSFER_RESPONSE_PART), + ("root_agent", Part.from_function_call(name="test_tool", args={})), + ( + "root_agent", + Part.from_function_response( + name="test_tool", response={"result": "result"} + ), + ), + ] diff --git a/tests/unittests/runners/test_resume_invocation.py b/tests/unittests/runners/test_resume_invocation.py new file mode 100644 index 0000000000..9c380ab594 --- /dev/null +++ b/tests/unittests/runners/test_resume_invocation.py @@ -0,0 +1,254 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for edge cases of resuming invocations.""" + +import copy + +from google.adk.agents.llm_agent import LlmAgent +from google.adk.apps.app import App +from google.adk.apps.app import ResumabilityConfig +from google.adk.tools.long_running_tool import LongRunningFunctionTool +from google.genai.types import FunctionResponse +from google.genai.types import Part +import pytest + +from .. import testing_utils + + +def transfer_call_part(agent_name: str) -> Part: + return Part.from_function_call( + name="transfer_to_agent", args={"agent_name": agent_name} + ) + + +TRANSFER_RESPONSE_PART = Part.from_function_response( + name="transfer_to_agent", response={"result": None} +) + + +def test_tool() -> dict[str, str]: + return {"result": "test tool result"} + + +@pytest.mark.asyncio +async def test_resume_invocation_from_sub_agent(): + """A test case for an edge case, where an invocation-to-resume starts from a sub-agent. + + For example: + invocation1: root_agent -> sub_agent + invocation2: sub_agent [paused][resume] + """ + # Step 1: Setup + # root_agent -> sub_agent + sub_agent = LlmAgent( + name="sub_agent", + model=testing_utils.MockModel.create( + responses=[ + "first response from sub_agent", + "second response from sub_agent", + "third response from sub_agent", + ] + ), + ) + root_agent = LlmAgent( + name="root_agent", + model=testing_utils.MockModel.create( + responses=[transfer_call_part(sub_agent.name)] + ), + sub_agents=[sub_agent], + ) + runner = testing_utils.InMemoryRunner( + app=App( + name="test_app", + root_agent=root_agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + ) + + # Step 2: Run the first invocation + # Expect the invocation to start from root_agent and transferred to sub_agent. + invocation_1_events = await runner.run_async("test user query") + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(invocation_1_events) + ) == [ + ( + root_agent.name, + transfer_call_part(sub_agent.name), + ), + ( + root_agent.name, + TRANSFER_RESPONSE_PART, + ), + ( + sub_agent.name, + "first response from sub_agent", + ), + ( + sub_agent.name, + testing_utils.END_OF_AGENT, + ), + ( + root_agent.name, + testing_utils.END_OF_AGENT, + ), + ] + + # Step 3: Run the second invocation + # Expect the invocation to directly start from sub_agent. + invocation_2_events = await runner.run_async( + "test user query 2", + ) + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(invocation_2_events) + ) == [ + ( + sub_agent.name, + "second response from sub_agent", + ), + (sub_agent.name, testing_utils.END_OF_AGENT), + ] + # Asserts the invocation will be a no-op if the current agent in context is + # already final. + assert not await runner.run_async( + invocation_id=invocation_2_events[0].invocation_id + ) + + # Step 4: Copy all session.events[:-1] to a new session + # This is to simulate the case where we pause on the second invocation. + session_id = runner.session_id + session = await runner.runner.session_service.get_session( + app_name="test_app", user_id="test_user", session_id=session_id + ) + new_session = await runner.runner.session_service.create_session( + app_name=session.app_name, user_id=session.user_id + ) + for event in session.events[:-1]: + await runner.runner.session_service.append_event(new_session, event) + runner.session_id = new_session.id + + # Step 5: Resume the second invocation + resumed_invocation_2_events = await runner.run_async( + invocation_id=invocation_2_events[0].invocation_id + ) + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(resumed_invocation_2_events) + ) == [ + ( + sub_agent.name, + "third response from sub_agent", + ), + (sub_agent.name, testing_utils.END_OF_AGENT), + ] + + +@pytest.mark.asyncio +async def test_resume_any_invocation(): + """A test case for resuming a previous invocation instead of the last one.""" + # Step 1: Setup + long_running_test_tool = LongRunningFunctionTool( + func=test_tool, + ) + root_agent = LlmAgent( + name="root_agent", + model=testing_utils.MockModel.create( + responses=[ + Part.from_function_call(name="test_tool", args={}), + "llm response in invocation 2", + Part.from_function_call(name="test_tool", args={}), + "llm response after resuming invocation 1", + ] + ), + tools=[long_running_test_tool], + ) + runner = testing_utils.InMemoryRunner( + app=App( + name="test_app", + root_agent=root_agent, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + ) + + # Step 2: Run the first invocation, which pauses on the long running function. + invocation_1_events = await runner.run_async("test user query") + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(invocation_1_events) + ) == [ + ( + root_agent.name, + Part.from_function_call(name="test_tool", args={}), + ), + ( + root_agent.name, + Part.from_function_response( + name="test_tool", response={"result": "test tool result"} + ), + ), + ] + + # Step 3: Run the second invocation, expect it to finish normally. + invocation_2_events = await runner.run_async( + "test user query 2", + ) + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(invocation_2_events) + ) == [ + ( + root_agent.name, + "llm response in invocation 2", + ), + (root_agent.name, testing_utils.END_OF_AGENT), + ] + + # Step 4: Run the third invocation, which also pauses on the long running + # function. + invocation_3_events = await runner.run_async( + "test user query 3", + ) + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(invocation_3_events) + ) == [ + ( + root_agent.name, + Part.from_function_call(name="test_tool", args={}), + ), + ( + root_agent.name, + Part.from_function_response( + name="test_tool", response={"result": "test tool result"} + ), + ), + ] + + # Step 5: Resume the first invocation with long running function response. + resumed_invocation_1_events = await runner.run_async( + invocation_id=invocation_1_events[0].invocation_id, + new_message=testing_utils.UserContent( + Part( + function_response=FunctionResponse( + id=invocation_1_events[0].content.parts[0].function_call.id, + name="test_tool", + response={"result": "test tool update"}, + ) + ), + ), + ) + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(resumed_invocation_1_events) + ) == [ + ( + root_agent.name, + "llm response after resuming invocation 1", + ), + (root_agent.name, testing_utils.END_OF_AGENT), + ] diff --git a/tests/unittests/runners/test_run_tool_confirmation.py b/tests/unittests/runners/test_run_tool_confirmation.py new file mode 100644 index 0000000000..d6acb66959 --- /dev/null +++ b/tests/unittests/runners/test_run_tool_confirmation.py @@ -0,0 +1,941 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for HITL flows with different agent structures.""" + +import copy +from unittest import mock + +from google.adk.agents.base_agent import BaseAgent +from google.adk.agents.base_agent import BaseAgentState +from google.adk.agents.llm_agent import LlmAgent +from google.adk.agents.parallel_agent import ParallelAgent +from google.adk.agents.sequential_agent import SequentialAgent +from google.adk.agents.sequential_agent import SequentialAgentState +from google.adk.apps.app import App +from google.adk.apps.app import ResumabilityConfig +from google.adk.flows.llm_flows.functions import REQUEST_CONFIRMATION_FUNCTION_CALL_NAME +from google.adk.tools.function_tool import FunctionTool +from google.adk.tools.tool_context import ToolContext +from google.genai.types import FunctionCall +from google.genai.types import FunctionResponse +from google.genai.types import GenerateContentResponse +from google.genai.types import Part +import pytest + +from .. import testing_utils + +HINT_TEXT = ( + "Please approve or reject the tool call _test_function() by" + " responding with a FunctionResponse with an" + " expected ToolConfirmation payload." +) + +TOOL_CALL_ERROR_RESPONSE = { + "error": "This tool call requires confirmation, please approve or reject." +} + + +def _create_llm_response_from_tools( + tools: list[FunctionTool], +) -> GenerateContentResponse: + """Creates a mock LLM response containing a function call.""" + parts = [ + Part(function_call=FunctionCall(name=tool.name, args={})) + for tool in tools + ] + return testing_utils.LlmResponse( + content=testing_utils.ModelContent(parts=parts) + ) + + +def _create_llm_response_from_text(text: str) -> GenerateContentResponse: + """Creates a mock LLM response containing text.""" + return testing_utils.LlmResponse( + content=testing_utils.ModelContent(parts=[Part(text=text)]) + ) + + +def _test_function( + tool_context: ToolContext, +) -> dict[str, str]: + return {"result": f"confirmed={tool_context.tool_confirmation.confirmed}"} + + +def _test_request_confirmation_function_with_custom_schema( + tool_context: ToolContext, +) -> dict[str, str]: + """A test tool function that requests confirmation, but with a custom payload schema.""" + if not tool_context.tool_confirmation: + tool_context.request_confirmation( + hint="test hint for request_confirmation with custom payload schema", + payload={ + "test_custom_payload": { + "int_field": 0, + "str_field": "", + "bool_field": False, + } + }, + ) + return TOOL_CALL_ERROR_RESPONSE + return { + "result": f"confirmed={tool_context.tool_confirmation.confirmed}", + "custom_payload": tool_context.tool_confirmation.payload, + } + + +class BaseHITLTest: + """Base class for HITL tests with common fixtures.""" + + @pytest.fixture + def runner(self, agent: BaseAgent) -> testing_utils.InMemoryRunner: + """Provides an in-memory runner for the agent.""" + return testing_utils.InMemoryRunner(root_agent=agent) + + +class TestHITLConfirmationFlowWithSingleAgent(BaseHITLTest): + """Tests the HITL confirmation flow with a single LlmAgent.""" + + @pytest.fixture + def tools(self) -> list[FunctionTool]: + """Provides the tools for the agent.""" + return [FunctionTool(func=_test_function, require_confirmation=True)] + + @pytest.fixture + def llm_responses( + self, tools: list[FunctionTool] + ) -> list[GenerateContentResponse]: + """Provides mock LLM responses for the tests.""" + return [ + _create_llm_response_from_tools(tools), + _create_llm_response_from_text("test llm response after tool call"), + ] + + @pytest.fixture + def mock_model( + self, llm_responses: list[GenerateContentResponse] + ) -> testing_utils.MockModel: + """Provides a mock model with predefined responses.""" + return testing_utils.MockModel(responses=llm_responses) + + @pytest.fixture + def agent( + self, mock_model: testing_utils.MockModel, tools: list[FunctionTool] + ) -> LlmAgent: + """Provides a single LlmAgent for the test.""" + return LlmAgent(name="root_agent", model=mock_model, tools=tools) + + @pytest.mark.asyncio + @pytest.mark.parametrize("tool_call_confirmed", [True, False]) + async def test_confirmation_flow( + self, + runner: testing_utils.InMemoryRunner, + agent: LlmAgent, + tool_call_confirmed: bool, + ): + """Tests HITL flow where all tool calls are confirmed.""" + user_query = testing_utils.UserContent("test user query") + events = await runner.run_async(user_query) + tools = agent.tools + + expected_parts = [ + ( + agent.name, + Part(function_call=FunctionCall(name=tools[0].name, args={})), + ), + ( + agent.name, + Part( + function_call=FunctionCall( + name=REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, + args={ + "originalFunctionCall": { + "name": tools[0].name, + "id": mock.ANY, + "args": {}, + }, + "toolConfirmation": { + "hint": HINT_TEXT, + "confirmed": False, + }, + }, + ) + ), + ), + ( + agent.name, + Part( + function_response=FunctionResponse( + name=tools[0].name, response=TOOL_CALL_ERROR_RESPONSE + ) + ), + ), + ] + + simplified = testing_utils.simplify_events(copy.deepcopy(events)) + for i, (agent_name, part) in enumerate(expected_parts): + assert simplified[i][0] == agent_name + assert simplified[i][1] == part + + ask_for_confirmation_function_call_id = ( + events[1].content.parts[0].function_call.id + ) + invocation_id = events[1].invocation_id + user_confirmation = testing_utils.UserContent( + Part( + function_response=FunctionResponse( + id=ask_for_confirmation_function_call_id, + name=REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, + response={"confirmed": tool_call_confirmed}, + ) + ) + ) + events = await runner.run_async(user_confirmation) + + expected_parts_final = [ + ( + agent.name, + Part( + function_response=FunctionResponse( + name=tools[0].name, + response={"result": f"confirmed={tool_call_confirmed}"} + if tool_call_confirmed + else {"error": "This tool call is rejected."}, + ) + ), + ), + (agent.name, "test llm response after tool call"), + ] + for event in events: + assert event.invocation_id != invocation_id + assert ( + testing_utils.simplify_events(copy.deepcopy(events)) + == expected_parts_final + ) + + +class TestHITLConfirmationFlowWithCustomPayloadSchema(BaseHITLTest): + """Tests the HITL confirmation flow with a single agent, for custom confirmation payload schema.""" + + @pytest.fixture + def tools(self) -> list[FunctionTool]: + """Provides the tools for the agent.""" + return [ + FunctionTool( + func=_test_request_confirmation_function_with_custom_schema + ) + ] + + @pytest.fixture + def llm_responses( + self, tools: list[FunctionTool] + ) -> list[GenerateContentResponse]: + """Provides mock LLM responses for the tests.""" + return [ + _create_llm_response_from_tools(tools), + _create_llm_response_from_text("test llm response after tool call"), + _create_llm_response_from_text( + "test llm response after final tool call" + ), + ] + + @pytest.fixture + def mock_model( + self, llm_responses: list[GenerateContentResponse] + ) -> testing_utils.MockModel: + """Provides a mock model with predefined responses.""" + return testing_utils.MockModel(responses=llm_responses) + + @pytest.fixture + def agent( + self, mock_model: testing_utils.MockModel, tools: list[FunctionTool] + ) -> LlmAgent: + """Provides a single LlmAgent for the test.""" + return LlmAgent(name="root_agent", model=mock_model, tools=tools) + + @pytest.mark.asyncio + @pytest.mark.parametrize("tool_call_confirmed", [True, False]) + async def test_confirmation_flow( + self, + runner: testing_utils.InMemoryRunner, + agent: LlmAgent, + tool_call_confirmed: bool, + ): + """Tests HITL flow with custom payload schema.""" + tools = agent.tools + user_query = testing_utils.UserContent("test user query") + events = await runner.run_async(user_query) + + expected_parts = [ + ( + agent.name, + Part(function_call=FunctionCall(name=tools[0].name, args={})), + ), + ( + agent.name, + Part( + function_call=FunctionCall( + name=REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, + args={ + "originalFunctionCall": { + "name": tools[0].name, + "id": mock.ANY, + "args": {}, + }, + "toolConfirmation": { + "hint": ( + "test hint for request_confirmation with" + " custom payload schema" + ), + "confirmed": False, + "payload": { + "test_custom_payload": { + "int_field": 0, + "str_field": "", + "bool_field": False, + } + }, + }, + }, + ) + ), + ), + ( + agent.name, + Part( + function_response=FunctionResponse( + name=tools[0].name, response=TOOL_CALL_ERROR_RESPONSE + ) + ), + ), + (agent.name, "test llm response after tool call"), + ] + + simplified = testing_utils.simplify_events(copy.deepcopy(events)) + for i, (agent_name, part) in enumerate(expected_parts): + assert simplified[i][0] == agent_name + assert simplified[i][1] == part + + ask_for_confirmation_function_call_id = ( + events[1].content.parts[0].function_call.id + ) + invocation_id = events[1].invocation_id + custom_payload = { + "test_custom_payload": { + "int_field": 123, + "str_field": "test_str", + "bool_field": True, + } + } + user_confirmation = testing_utils.UserContent( + Part( + function_response=FunctionResponse( + id=ask_for_confirmation_function_call_id, + name=REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, + response={ + "confirmed": tool_call_confirmed, + "payload": custom_payload, + }, + ) + ) + ) + events = await runner.run_async(user_confirmation) + + expected_response = { + "result": f"confirmed={tool_call_confirmed}", + "custom_payload": custom_payload, + } + expected_parts_final = [ + ( + agent.name, + Part( + function_response=FunctionResponse( + name=tools[0].name, + response=expected_response, + ) + ), + ), + (agent.name, "test llm response after final tool call"), + ] + for event in events: + assert event.invocation_id != invocation_id + assert ( + testing_utils.simplify_events(copy.deepcopy(events)) + == expected_parts_final + ) + + +class TestHITLConfirmationFlowWithResumableApp: + """Tests the HITL confirmation flow with a resumable app.""" + + @pytest.fixture + def tools(self) -> list[FunctionTool]: + """Provides the tools for the agent.""" + return [FunctionTool(func=_test_function, require_confirmation=True)] + + @pytest.fixture + def llm_responses( + self, tools: list[FunctionTool] + ) -> list[GenerateContentResponse]: + """Provides mock LLM responses for the tests.""" + return [ + _create_llm_response_from_tools(tools), + _create_llm_response_from_text("test llm response after tool call"), + ] + + @pytest.fixture + def mock_model( + self, llm_responses: list[GenerateContentResponse] + ) -> testing_utils.MockModel: + """Provides a mock model with predefined responses.""" + return testing_utils.MockModel(responses=llm_responses) + + @pytest.fixture + def agent( + self, mock_model: testing_utils.MockModel, tools: list[FunctionTool] + ) -> LlmAgent: + """Provides a single LlmAgent for the test.""" + return LlmAgent(name="root_agent", model=mock_model, tools=tools) + + @pytest.fixture + def runner(self, agent: LlmAgent) -> testing_utils.InMemoryRunner: + """Provides an in-memory runner for the agent.""" + # Mark the app as resumable. So that the invocation will be paused when + # tool confirmation is requested. + app = App( + name="test_app", + resumability_config=ResumabilityConfig(is_resumable=True), + root_agent=agent, + ) + return testing_utils.InMemoryRunner(app=app) + + @pytest.mark.asyncio + async def test_pause_and_resume_on_request_confirmation( + self, + runner: testing_utils.InMemoryRunner, + agent: LlmAgent, + ): + """Tests HITL flow where all tool calls are confirmed.""" + events = runner.run("test user query") + + # Verify that the invocation is paused when tool confirmation is requested. + # The tool call returns error response, and summarization was skipped. + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(events) + ) == [ + ( + agent.name, + Part(function_call=FunctionCall(name=agent.tools[0].name, args={})), + ), + ( + agent.name, + Part( + function_call=FunctionCall( + name=REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, + args={ + "originalFunctionCall": { + "name": agent.tools[0].name, + "id": mock.ANY, + "args": {}, + }, + "toolConfirmation": { + "hint": HINT_TEXT, + "confirmed": False, + }, + }, + ) + ), + ), + ( + agent.name, + Part( + function_response=FunctionResponse( + name=agent.tools[0].name, response=TOOL_CALL_ERROR_RESPONSE + ) + ), + ), + ] + ask_for_confirmation_function_call_id = ( + events[1].content.parts[0].function_call.id + ) + invocation_id = events[1].invocation_id + user_confirmation = testing_utils.UserContent( + Part( + function_response=FunctionResponse( + id=ask_for_confirmation_function_call_id, + name=REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, + response={"confirmed": True}, + ) + ) + ) + events = await runner.run_async( + user_confirmation, invocation_id=invocation_id + ) + expected_parts_final = [ + ( + agent.name, + Part( + function_response=FunctionResponse( + name=agent.tools[0].name, + response={"result": "confirmed=True"}, + ) + ), + ), + (agent.name, "test llm response after tool call"), + (agent.name, testing_utils.END_OF_AGENT), + ] + for event in events: + assert event.invocation_id == invocation_id + assert ( + testing_utils.simplify_resumable_app_events(copy.deepcopy(events)) + == expected_parts_final + ) + + +class TestHITLConfirmationFlowWithSequentialAgentAndResumableApp: + """Tests the HITL confirmation flow with a resumable sequential agent app.""" + + @pytest.fixture + def tools(self) -> list[FunctionTool]: + """Provides the tools for the agent.""" + return [FunctionTool(func=_test_function, require_confirmation=True)] + + @pytest.fixture + def llm_responses( + self, tools: list[FunctionTool] + ) -> list[GenerateContentResponse]: + """Provides mock LLM responses for the tests.""" + return [ + _create_llm_response_from_tools(tools), + _create_llm_response_from_text("test llm response after tool call"), + _create_llm_response_from_text("test llm response from second agent"), + ] + + @pytest.fixture + def mock_model( + self, llm_responses: list[GenerateContentResponse] + ) -> testing_utils.MockModel: + """Provides a mock model with predefined responses.""" + return testing_utils.MockModel(responses=llm_responses) + + @pytest.fixture + def agent( + self, mock_model: testing_utils.MockModel, tools: list[FunctionTool] + ) -> SequentialAgent: + """Provides a single LlmAgent for the test.""" + return SequentialAgent( + name="root_agent", + sub_agents=[ + LlmAgent(name="agent1", model=mock_model, tools=tools), + LlmAgent(name="agent2", model=mock_model, tools=[]), + ], + ) + + @pytest.fixture + def runner(self, agent: SequentialAgent) -> testing_utils.InMemoryRunner: + """Provides an in-memory runner for the agent.""" + # Mark the app as resumable. So that the invocation will be paused when + # tool confirmation is requested. + app = App( + name="test_app", + resumability_config=ResumabilityConfig(is_resumable=True), + root_agent=agent, + ) + return testing_utils.InMemoryRunner(app=app) + + @pytest.mark.asyncio + async def test_pause_and_resume_on_request_confirmation( + self, + runner: testing_utils.InMemoryRunner, + agent: SequentialAgent, + ): + """Tests HITL flow where all tool calls are confirmed.""" + + # Test setup: + # - root_agent is a SequentialAgent with two sub-agents: sub_agent1 and + # sub_agent2. + # - sub_agent1 has a tool call that asks for HITL confirmation. + # - sub_agent2 does not have any tool calls. + # - The test will: + # - Run the query and verify that the invocation is paused when tool + # confirmation is requested, at sub_agent1. + # - Resume the invocation and execute the tool call from sub_agent1. + # - Verify that root_agent continues to run sub_agent2. + + events = runner.run("test user query") + sub_agent1 = agent.sub_agents[0] + sub_agent2 = agent.sub_agents[1] + + # Step 1: + # Verify that the invocation is paused when tool confirmation is requested. + # So that no intermediate llm response is generated. + # And the second sub agent is not started. + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(events) + ) == [ + ( + agent.name, + SequentialAgentState(current_sub_agent=sub_agent1.name).model_dump( + mode="json" + ), + ), + ( + sub_agent1.name, + Part( + function_call=FunctionCall( + name=sub_agent1.tools[0].name, args={} + ) + ), + ), + ( + sub_agent1.name, + Part( + function_call=FunctionCall( + name=REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, + args={ + "originalFunctionCall": { + "name": sub_agent1.tools[0].name, + "id": mock.ANY, + "args": {}, + }, + "toolConfirmation": { + "hint": HINT_TEXT, + "confirmed": False, + }, + }, + ) + ), + ), + ( + sub_agent1.name, + Part( + function_response=FunctionResponse( + name=sub_agent1.tools[0].name, + response=TOOL_CALL_ERROR_RESPONSE, + ) + ), + ), + ] + ask_for_confirmation_function_call_id = ( + events[2].content.parts[0].function_call.id + ) + invocation_id = events[2].invocation_id + + # Step 2: + # Resume the invocation and confirm the tool call from sub_agent1, and + # sub_agent2 will continue. + user_confirmation = testing_utils.UserContent( + Part( + function_response=FunctionResponse( + id=ask_for_confirmation_function_call_id, + name=REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, + response={"confirmed": True}, + ) + ) + ) + events = await runner.run_async( + user_confirmation, invocation_id=invocation_id + ) + expected_parts_final = [ + ( + sub_agent1.name, + Part( + function_response=FunctionResponse( + name=sub_agent1.tools[0].name, + response={"result": "confirmed=True"}, + ) + ), + ), + (sub_agent1.name, "test llm response after tool call"), + (sub_agent1.name, testing_utils.END_OF_AGENT), + ( + agent.name, + SequentialAgentState(current_sub_agent=sub_agent2.name).model_dump( + mode="json" + ), + ), + (sub_agent2.name, "test llm response from second agent"), + (sub_agent2.name, testing_utils.END_OF_AGENT), + (agent.name, testing_utils.END_OF_AGENT), + ] + for event in events: + assert event.invocation_id == invocation_id + assert ( + testing_utils.simplify_resumable_app_events(copy.deepcopy(events)) + == expected_parts_final + ) + + +class TestHITLConfirmationFlowWithParallelAgentAndResumableApp: + """Tests the HITL confirmation flow with a resumable sequential agent app.""" + + @pytest.fixture + def tools(self) -> list[FunctionTool]: + """Provides the tools for the agent.""" + return [FunctionTool(func=_test_function, require_confirmation=True)] + + @pytest.fixture + def llm_responses( + self, tools: list[FunctionTool] + ) -> list[GenerateContentResponse]: + """Provides mock LLM responses for the tests.""" + return [ + _create_llm_response_from_tools(tools), + _create_llm_response_from_text("test llm response after tool call"), + ] + + @pytest.fixture + def agent( + self, + tools: list[FunctionTool], + llm_responses: list[GenerateContentResponse], + ) -> ParallelAgent: + """Provides a single ParallelAgent for the test.""" + return ParallelAgent( + name="root_agent", + sub_agents=[ + LlmAgent( + name="agent1", + model=testing_utils.MockModel(responses=llm_responses), + tools=tools, + ), + LlmAgent( + name="agent2", + model=testing_utils.MockModel(responses=llm_responses), + tools=tools, + ), + ], + ) + + @pytest.fixture + def runner(self, agent: ParallelAgent) -> testing_utils.InMemoryRunner: + """Provides an in-memory runner for the agent.""" + # Mark the app as resumable. So that the invocation will be paused when + # tool confirmation is requested. + app = App( + name="test_app", + resumability_config=ResumabilityConfig(is_resumable=True), + root_agent=agent, + ) + return testing_utils.InMemoryRunner(app=app) + + @pytest.mark.asyncio + async def test_pause_and_resume_on_request_confirmation( + self, + runner: testing_utils.InMemoryRunner, + agent: ParallelAgent, + ): + """Tests HITL flow where all tool calls are confirmed.""" + events = runner.run("test user query") + + # Test setup: + # - root_agent is a ParallelAgent with two sub-agents: sub_agent1 and + # sub_agent2. + # - Both sub_agents have a tool call that asks for HITL confirmation. + # - The test will: + # - Run the query and verify that each branch is paused when tool + # confirmation is requested. + # - Resume the invocation and execute the tool call of each branch. + + sub_agent1 = agent.sub_agents[0] + sub_agent2 = agent.sub_agents[1] + + # Verify that each branch is paused after the long running tool call. + # So that no intermediate llm response is generated. + root_agent_events = [event for event in events if event.branch is None] + sub_agent1_branch_events = [ + event + for event in events + if event.branch == f"{agent.name}.{sub_agent1.name}" + ] + sub_agent2_branch_events = [ + event + for event in events + if event.branch == f"{agent.name}.{sub_agent2.name}" + ] + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(root_agent_events) + ) == [ + ( + agent.name, + BaseAgentState().model_dump(mode="json"), + ), + ] + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(sub_agent1_branch_events) + ) == [ + ( + sub_agent1.name, + Part( + function_call=FunctionCall( + name=sub_agent1.tools[0].name, args={} + ) + ), + ), + ( + sub_agent1.name, + Part( + function_call=FunctionCall( + name=REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, + args={ + "originalFunctionCall": { + "name": sub_agent1.tools[0].name, + "id": mock.ANY, + "args": {}, + }, + "toolConfirmation": { + "hint": HINT_TEXT, + "confirmed": False, + }, + }, + ) + ), + ), + ( + sub_agent1.name, + Part( + function_response=FunctionResponse( + name=sub_agent1.tools[0].name, + response=TOOL_CALL_ERROR_RESPONSE, + ) + ), + ), + ] + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(sub_agent2_branch_events) + ) == [ + ( + sub_agent2.name, + Part( + function_call=FunctionCall( + name=sub_agent2.tools[0].name, args={} + ) + ), + ), + ( + sub_agent2.name, + Part( + function_call=FunctionCall( + name=REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, + args={ + "originalFunctionCall": { + "name": sub_agent2.tools[0].name, + "id": mock.ANY, + "args": {}, + }, + "toolConfirmation": { + "hint": HINT_TEXT, + "confirmed": False, + }, + }, + ) + ), + ), + ( + sub_agent2.name, + Part( + function_response=FunctionResponse( + name=sub_agent2.tools[0].name, + response=TOOL_CALL_ERROR_RESPONSE, + ) + ), + ), + ] + + ask_for_confirmation_function_call_ids = [ + sub_agent1_branch_events[1].content.parts[0].function_call.id, + sub_agent2_branch_events[1].content.parts[0].function_call.id, + ] + assert ( + sub_agent1_branch_events[1].invocation_id + == sub_agent2_branch_events[1].invocation_id + ) + invocation_id = sub_agent1_branch_events[1].invocation_id + + # Resume the invocation and confirm the tool call from sub_agent1. + user_confirmations = [ + testing_utils.UserContent( + Part( + function_response=FunctionResponse( + id=id, + name=REQUEST_CONFIRMATION_FUNCTION_CALL_NAME, + response={"confirmed": True}, + ) + ) + ) + for id in ask_for_confirmation_function_call_ids + ] + + events = await runner.run_async( + user_confirmations[0], invocation_id=invocation_id + ) + for event in events: + assert event.invocation_id == invocation_id + + root_agent_events = [event for event in events if event.branch is None] + sub_agent1_branch_events = [ + event + for event in events + if event.branch == f"{agent.name}.{sub_agent1.name}" + ] + sub_agent2_branch_events = [ + event + for event in events + if event.branch == f"{agent.name}.{sub_agent2.name}" + ] + + # Verify that sub_agent1 is resumed and final; sub_agent2 is still paused; + # root_agent is not final. + assert not root_agent_events + assert not sub_agent2_branch_events + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(sub_agent1_branch_events) + ) == [ + ( + sub_agent1.name, + Part( + function_response=FunctionResponse( + name=sub_agent1.tools[0].name, + response={"result": "confirmed=True"}, + ) + ), + ), + (sub_agent1.name, "test llm response after tool call"), + (sub_agent1.name, testing_utils.END_OF_AGENT), + ] + + # Resume the invocation again and confirm the tool call from sub_agent2. + events = await runner.run_async( + user_confirmations[1], invocation_id=invocation_id + ) + for event in events: + assert event.invocation_id == invocation_id + + # Verify that sub_agent2 is resumed and final; root_agent is final. + assert testing_utils.simplify_resumable_app_events( + copy.deepcopy(events) + ) == [ + ( + sub_agent2.name, + Part( + function_response=FunctionResponse( + name=sub_agent2.tools[0].name, + response={"result": "confirmed=True"}, + ) + ), + ), + (sub_agent2.name, "test llm response after tool call"), + (sub_agent2.name, testing_utils.END_OF_AGENT), + (agent.name, testing_utils.END_OF_AGENT), + ] diff --git a/tests/unittests/runners/test_runner_debug.py b/tests/unittests/runners/test_runner_debug.py new file mode 100644 index 0000000000..4660bda95d --- /dev/null +++ b/tests/unittests/runners/test_runner_debug.py @@ -0,0 +1,917 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for Runner.run_debug helper method.""" + +from __future__ import annotations + +from unittest import mock + +from google.adk.agents import Agent +from google.adk.agents.run_config import RunConfig +from google.adk.runners import InMemoryRunner +import pytest + + +class TestRunDebug: + """Tests for Runner.run_debug method.""" + + @pytest.mark.asyncio + async def test_run_debug_single_query(self): + """Test run_debug with a single string query.""" + # Setup + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="You are a helpful assistant.", + ) + runner = InMemoryRunner(agent=agent) + + # Mock the runner's run_async to return controlled events + mock_event = mock.Mock() + mock_event.author = "test_agent" + mock_event.content = mock.Mock() + mock_event.content.parts = [mock.Mock(text="Hello! I can help you.")] + + async def mock_run_async(*args, **kwargs): + yield mock_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + # Execute + events = await runner.run_debug("Hello, how are you?", quiet=True) + + # Assertions + assert len(events) == 1 + assert events[0].author == "test_agent" + assert events[0].content.parts[0].text == "Hello! I can help you." + + # Verify session was created with defaults + session = await runner.session_service.get_session( + app_name=runner.app_name, + user_id="debug_user_id", + session_id="debug_session_id", + ) + assert session is not None + + @pytest.mark.asyncio + async def test_run_debug_multiple_queries(self): + """Test run_debug with multiple queries in sequence.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="You are a test bot.", + ) + runner = InMemoryRunner(agent=agent) + + # Mock responses for multiple queries + responses = ["First response", "Second response"] + call_count = 0 + + async def mock_run_async(*args, **kwargs): + nonlocal call_count + mock_event = mock.Mock() + mock_event.author = "test_agent" + mock_event.content = mock.Mock() + mock_event.content.parts = [mock.Mock(text=responses[call_count])] + call_count += 1 + yield mock_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + # Execute with multiple queries + events = await runner.run_debug( + ["First query", "Second query"], quiet=True + ) + + # Assertions + assert len(events) == 2 + assert events[0].content.parts[0].text == "First response" + assert events[1].content.parts[0].text == "Second response" + + @pytest.mark.asyncio + async def test_run_debug_always_returns_events(self): + """Test that run_debug always returns events.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Test agent.", + ) + runner = InMemoryRunner(agent=agent) + + async def mock_run_async(*args, **kwargs): + mock_event = mock.Mock() + mock_event.author = "test_agent" + mock_event.content = mock.Mock() + mock_event.content.parts = [mock.Mock(text="Response")] + yield mock_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + # Test that events are always returned + events = await runner.run_debug("Query", quiet=True) + assert isinstance(events, list) + assert len(events) == 1 + + @pytest.mark.asyncio + async def test_run_debug_quiet_mode(self, capsys): + """Test that quiet=True suppresses printing.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Test agent.", + ) + runner = InMemoryRunner(agent=agent) + + async def mock_run_async(*args, **kwargs): + mock_event = mock.Mock() + mock_event.author = "test_agent" + mock_event.content = mock.Mock() + mock_event.content.parts = [mock.Mock(text="This should not be printed")] + yield mock_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + # Execute with quiet=True + await runner.run_debug("Test query", quiet=True) + + # Check that nothing was printed + captured = capsys.readouterr() + assert "This should not be printed" not in captured.out + assert "User >" not in captured.out + assert "Session:" not in captured.out + + @pytest.mark.asyncio + async def test_run_debug_custom_session_id(self): + """Test run_debug with custom session_id.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Test agent.", + ) + runner = InMemoryRunner(agent=agent) + + async def mock_run_async(*args, **kwargs): + mock_event = mock.Mock() + mock_event.author = "test_agent" + mock_event.content = mock.Mock() + mock_event.content.parts = [mock.Mock(text="Response")] + yield mock_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + # Execute with custom session ID + await runner.run_debug( + "Query", session_id="custom_debug_session", quiet=True + ) + + # Verify session was created with custom ID + session = await runner.session_service.get_session( + app_name=runner.app_name, + user_id="debug_user_id", + session_id="custom_debug_session", + ) + assert session is not None + assert session.id == "custom_debug_session" + + @pytest.mark.asyncio + async def test_run_debug_custom_user_id(self): + """Test run_debug with custom user_id.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Test agent.", + ) + runner = InMemoryRunner(agent=agent) + + async def mock_run_async(*args, **kwargs): + mock_event = mock.Mock() + mock_event.author = "test_agent" + mock_event.content = mock.Mock() + mock_event.content.parts = [mock.Mock(text="Response")] + yield mock_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + # Execute with custom user_id + await runner.run_debug("Query", user_id="test_user_123", quiet=True) + + # Verify session was created with custom user_id + session = await runner.session_service.get_session( + app_name=runner.app_name, + user_id="test_user_123", + session_id="debug_session_id", + ) + assert session is not None + + @pytest.mark.asyncio + async def test_run_debug_with_run_config(self): + """Test that run_config is properly passed through to run_async.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Test agent.", + ) + runner = InMemoryRunner(agent=agent) + + run_config_used = None + + async def mock_run_async(*args, **kwargs): + nonlocal run_config_used + run_config_used = kwargs.get("run_config") + mock_event = mock.Mock() + mock_event.author = "test_agent" + mock_event.content = mock.Mock() + mock_event.content.parts = [mock.Mock(text="Response")] + yield mock_event + + with mock.patch.object( + runner, "run_async", side_effect=mock_run_async + ) as mock_method: + # Create a custom run_config + custom_config = RunConfig(support_cfc=True) + + # Execute with custom run_config + await runner.run_debug("Query", run_config=custom_config, quiet=True) + + # Verify run_config was passed to run_async + assert mock_method.called + call_args = mock_method.call_args + assert call_args is not None + assert "run_config" in call_args.kwargs + assert call_args.kwargs["run_config"] == custom_config + + @pytest.mark.asyncio + async def test_run_debug_session_persistence(self): + """Test that multiple calls to run_debug maintain conversation context.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Remember previous messages.", + ) + runner = InMemoryRunner(agent=agent) + + call_count = 0 + responses = ["First response", "Second response remembering first"] + + async def mock_run_async(*args, **kwargs): + nonlocal call_count + mock_event = mock.Mock() + mock_event.author = "test_agent" + mock_event.content = mock.Mock() + mock_event.content.parts = [mock.Mock(text=responses[call_count])] + call_count += 1 + yield mock_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + # First call + events1 = await runner.run_debug("First message", quiet=True) + assert events1[0].content.parts[0].text == "First response" + + # Second call to same session + events2 = await runner.run_debug("Second message", quiet=True) + assert ( + events2[0].content.parts[0].text + == "Second response remembering first" + ) + + # Verify both calls used the same session + session = await runner.session_service.get_session( + app_name=runner.app_name, + user_id="debug_user_id", + session_id="debug_session_id", + ) + assert session is not None + + @pytest.mark.asyncio + async def test_run_debug_filters_none_text(self): + """Test that run_debug filters out 'None' text and empty parts.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Test agent.", + ) + runner = InMemoryRunner(agent=agent) + + async def mock_run_async(*args, **kwargs): + # Yield events with various text values + events = [ + mock.Mock( + author="test_agent", + content=mock.Mock(parts=[mock.Mock(text="Valid text")]), + ), + mock.Mock( + author="test_agent", + content=mock.Mock(parts=[mock.Mock(text="None")]), + ), # Should be filtered + mock.Mock( + author="test_agent", + content=mock.Mock(parts=[mock.Mock(text="")]), + ), # Should be filtered + mock.Mock( + author="test_agent", + content=mock.Mock(parts=[mock.Mock(text="Another valid")]), + ), + ] + for event in events: + yield event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + # Execute and capture output + events = await runner.run_debug("Query", quiet=True) + + # All 4 events should be returned (filtering is for printing only) + assert len(events) == 4 + + # But when printing, "None" and empty strings should be filtered + # This is tested implicitly by the implementation + + @pytest.mark.asyncio + async def test_run_debug_with_existing_session(self): + """Test that run_debug retrieves existing session when AlreadyExistsError occurs.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Test agent.", + ) + runner = InMemoryRunner(agent=agent) + + # First create a session + await runner.session_service.create_session( + app_name=runner.app_name, + user_id="debug_user_id", + session_id="existing_session", + ) + + async def mock_run_async(*args, **kwargs): + mock_event = mock.Mock() + mock_event.author = "test_agent" + mock_event.content = mock.Mock() + mock_event.content.parts = [mock.Mock(text="Using existing session")] + yield mock_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + # Execute with same session ID (should retrieve existing) + events = await runner.run_debug( + "Query", session_id="existing_session", quiet=True + ) + + assert len(events) == 1 + assert events[0].content.parts[0].text == "Using existing session" + + @pytest.mark.asyncio + async def test_run_debug_with_tool_calls(self, capsys): + """Test that run_debug properly handles and prints tool calls.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Test agent with tools.", + ) + runner = InMemoryRunner(agent=agent) + + async def mock_run_async(*args, **kwargs): + # First event: tool call + mock_call_event = mock.Mock() + mock_call_event.author = "test_agent" + mock_call_event.content = mock.Mock() + mock_function_call = mock.Mock() + mock_function_call.name = "calculate" + mock_function_call.args = {"operation": "add", "a": 5, "b": 3} + mock_part_call = mock.Mock() + mock_part_call.text = None + mock_part_call.function_call = mock_function_call + mock_part_call.function_response = None + mock_call_event.content.parts = [mock_part_call] + yield mock_call_event + + # Second event: tool response + mock_resp_event = mock.Mock() + mock_resp_event.author = "test_agent" + mock_resp_event.content = mock.Mock() + mock_function_response = mock.Mock() + mock_function_response.response = {"result": 8} + mock_part_resp = mock.Mock() + mock_part_resp.text = None + mock_part_resp.function_call = None + mock_part_resp.function_response = mock_function_response + mock_resp_event.content.parts = [mock_part_resp] + yield mock_resp_event + + # Third event: final text response + mock_text_event = mock.Mock() + mock_text_event.author = "test_agent" + mock_text_event.content = mock.Mock() + mock_text_event.content.parts = [mock.Mock(text="The result is 8")] + yield mock_text_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + # Execute with verbose=True to see tool calls + events = await runner.run_debug("Calculate 5 + 3", verbose=True) + + # Check output was printed + captured = capsys.readouterr() + assert "[Calling tool: calculate" in captured.out + assert "[Tool result:" in captured.out + assert "The result is 8" in captured.out + + # Check events were collected + assert len(events) == 3 + + @pytest.mark.asyncio + async def test_run_debug_with_executable_code(self, capsys): + """Test that run_debug properly handles executable code parts.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Test agent with code execution.", + ) + runner = InMemoryRunner(agent=agent) + + async def mock_run_async(*args, **kwargs): + # Event with executable code + mock_event = mock.Mock() + mock_event.author = "test_agent" + mock_event.content = mock.Mock() + + mock_exec_code = mock.Mock() + mock_exec_code.language = "python" + mock_exec_code.code = "print('Hello World')" + + mock_part = mock.Mock() + mock_part.text = None + mock_part.function_call = None + mock_part.function_response = None + mock_part.executable_code = mock_exec_code + mock_part.code_execution_result = None + mock_part.inline_data = None + mock_part.file_data = None + + mock_event.content.parts = [mock_part] + yield mock_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + events = await runner.run_debug("Run some code", verbose=True) + + captured = capsys.readouterr() + assert "[Executing python code...]" in captured.out + assert len(events) == 1 + + @pytest.mark.asyncio + async def test_run_debug_with_code_execution_result(self, capsys): + """Test that run_debug properly handles code execution result parts.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Test agent with code results.", + ) + runner = InMemoryRunner(agent=agent) + + async def mock_run_async(*args, **kwargs): + # Event with code execution result + mock_event = mock.Mock() + mock_event.author = "test_agent" + mock_event.content = mock.Mock() + + mock_result = mock.Mock() + mock_result.output = "Hello World\n42" + + mock_part = mock.Mock() + mock_part.text = None + mock_part.function_call = None + mock_part.function_response = None + mock_part.executable_code = None + mock_part.code_execution_result = mock_result + mock_part.inline_data = None + mock_part.file_data = None + + mock_event.content.parts = [mock_part] + yield mock_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + events = await runner.run_debug( + "Show code output", + verbose=True, + ) + + captured = capsys.readouterr() + assert "[Code output: Hello World\n42]" in captured.out + assert len(events) == 1 + + @pytest.mark.asyncio + async def test_run_debug_with_inline_data(self, capsys): + """Test that run_debug properly handles inline data parts.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Test agent with inline data.", + ) + runner = InMemoryRunner(agent=agent) + + async def mock_run_async(*args, **kwargs): + # Event with inline data (e.g., image) + mock_event = mock.Mock() + mock_event.author = "test_agent" + mock_event.content = mock.Mock() + + mock_inline = mock.Mock() + mock_inline.mime_type = "image/png" + mock_inline.data = b"fake_image_data" + + mock_part = mock.Mock() + mock_part.text = None + mock_part.function_call = None + mock_part.function_response = None + mock_part.executable_code = None + mock_part.code_execution_result = None + mock_part.inline_data = mock_inline + mock_part.file_data = None + + mock_event.content.parts = [mock_part] + yield mock_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + events = await runner.run_debug("Show image", verbose=True) + + captured = capsys.readouterr() + assert "[Inline data: image/png]" in captured.out + assert len(events) == 1 + + @pytest.mark.asyncio + async def test_run_debug_with_file_data(self, capsys): + """Test that run_debug properly handles file data parts.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Test agent with file data.", + ) + runner = InMemoryRunner(agent=agent) + + async def mock_run_async(*args, **kwargs): + # Event with file data + mock_event = mock.Mock() + mock_event.author = "test_agent" + mock_event.content = mock.Mock() + + mock_file = mock.Mock() + mock_file.file_uri = "gs://bucket/path/to/file.pdf" + + mock_part = mock.Mock() + mock_part.text = None + mock_part.function_call = None + mock_part.function_response = None + mock_part.executable_code = None + mock_part.code_execution_result = None + mock_part.inline_data = None + mock_part.file_data = mock_file + + mock_event.content.parts = [mock_part] + yield mock_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + events = await runner.run_debug("Reference file", verbose=True) + + captured = capsys.readouterr() + assert "[File: gs://bucket/path/to/file.pdf]" in captured.out + assert len(events) == 1 + + @pytest.mark.asyncio + async def test_run_debug_with_mixed_parts(self, capsys): + """Test that run_debug handles events with multiple part types.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Test agent with mixed parts.", + ) + runner = InMemoryRunner(agent=agent) + + async def mock_run_async(*args, **kwargs): + # Event with multiple part types + mock_event = mock.Mock() + mock_event.author = "test_agent" + mock_event.content = mock.Mock() + + # Text part + mock_text_part = mock.Mock() + mock_text_part.text = "Here's your result:" + mock_text_part.function_call = None + mock_text_part.function_response = None + mock_text_part.executable_code = None + mock_text_part.code_execution_result = None + mock_text_part.inline_data = None + mock_text_part.file_data = None + + # Code execution part + mock_code_part = mock.Mock() + mock_code_part.text = None + mock_code_part.function_call = None + mock_code_part.function_response = None + mock_exec_code = mock.Mock() + mock_exec_code.language = "python" + mock_code_part.executable_code = mock_exec_code + mock_code_part.code_execution_result = None + mock_code_part.inline_data = None + mock_code_part.file_data = None + + # Result part + mock_result_part = mock.Mock() + mock_result_part.text = None + mock_result_part.function_call = None + mock_result_part.function_response = None + mock_result_part.executable_code = None + mock_result = mock.Mock() + mock_result.output = "42" + mock_result_part.code_execution_result = mock_result + mock_result_part.inline_data = None + mock_result_part.file_data = None + + mock_event.content.parts = [ + mock_text_part, + mock_code_part, + mock_result_part, + ] + yield mock_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + events = await runner.run_debug("Mixed response", verbose=True) + + captured = capsys.readouterr() + assert "Here's your result:" in captured.out + assert "[Executing python code...]" in captured.out + assert "[Code output: 42]" in captured.out + assert len(events) == 1 + + @pytest.mark.asyncio + async def test_run_debug_with_long_output_truncation(self, capsys): + """Test that run_debug properly truncates long outputs.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Test agent with long outputs.", + ) + runner = InMemoryRunner(agent=agent) + + async def mock_run_async(*args, **kwargs): + # Tool call with long args + mock_call_event = mock.Mock() + mock_call_event.author = "test_agent" + mock_call_event.content = mock.Mock() + + mock_function_call = mock.Mock() + mock_function_call.name = "process" + # Create a long argument string + mock_function_call.args = {"data": "x" * 100} + + mock_part_call = mock.Mock() + mock_part_call.text = None + mock_part_call.function_call = mock_function_call + mock_part_call.function_response = None + mock_part_call.executable_code = None + mock_part_call.code_execution_result = None + mock_part_call.inline_data = None + mock_part_call.file_data = None + + mock_call_event.content.parts = [mock_part_call] + yield mock_call_event + + # Tool response with long result + mock_resp_event = mock.Mock() + mock_resp_event.author = "test_agent" + mock_resp_event.content = mock.Mock() + + mock_function_response = mock.Mock() + # Create a long response string + mock_function_response.response = {"result": "y" * 200} + + mock_part_resp = mock.Mock() + mock_part_resp.text = None + mock_part_resp.function_call = None + mock_part_resp.function_response = mock_function_response + mock_part_resp.executable_code = None + mock_part_resp.code_execution_result = None + mock_part_resp.inline_data = None + mock_part_resp.file_data = None + + mock_resp_event.content.parts = [mock_part_resp] + yield mock_resp_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + events = await runner.run_debug("Process data", verbose=True) + + captured = capsys.readouterr() + # Check that args are truncated at 50 chars + assert "..." in captured.out + assert "[Calling tool: process(" in captured.out + # Check that response is truncated at 100 chars + assert "[Tool result:" in captured.out + assert len(events) == 2 + + @pytest.mark.asyncio + async def test_run_debug_verbose_flag_false(self, capsys): + """Test that run_debug hides tool calls when verbose=False (default).""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Test agent with tools.", + ) + runner = InMemoryRunner(agent=agent) + + async def mock_run_async(*args, **kwargs): + # Tool call event + mock_call_event = mock.Mock() + mock_call_event.author = "test_agent" + mock_call_event.content = mock.Mock() + + mock_function_call = mock.Mock() + mock_function_call.name = "get_weather" + mock_function_call.args = {"city": "Tokyo"} + + mock_part_call = mock.Mock() + mock_part_call.text = None + mock_part_call.function_call = mock_function_call + mock_part_call.function_response = None + mock_part_call.executable_code = None + mock_part_call.code_execution_result = None + mock_part_call.inline_data = None + mock_part_call.file_data = None + + mock_call_event.content.parts = [mock_part_call] + yield mock_call_event + + # Tool response event + mock_resp_event = mock.Mock() + mock_resp_event.author = "test_agent" + mock_resp_event.content = mock.Mock() + + mock_function_response = mock.Mock() + mock_function_response.response = {"weather": "Clear, 25°C"} + + mock_part_resp = mock.Mock() + mock_part_resp.text = None + mock_part_resp.function_call = None + mock_part_resp.function_response = mock_function_response + mock_part_resp.executable_code = None + mock_part_resp.code_execution_result = None + mock_part_resp.inline_data = None + mock_part_resp.file_data = None + + mock_resp_event.content.parts = [mock_part_resp] + yield mock_resp_event + + # Final text response + mock_text_event = mock.Mock() + mock_text_event.author = "test_agent" + mock_text_event.content = mock.Mock() + mock_text_event.content.parts = [ + mock.Mock(text="The weather in Tokyo is clear and 25°C.") + ] + yield mock_text_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + events = await runner.run_debug( + "What's the weather?", + verbose=False, # Default - should NOT show tool calls + ) + + captured = capsys.readouterr() + # Should NOT show tool call details + assert "[Calling tool:" not in captured.out + assert "[Tool result:" not in captured.out + # Should show final text response + assert "The weather in Tokyo is clear and 25°C." in captured.out + assert len(events) == 3 + + @pytest.mark.asyncio + async def test_run_debug_verbose_flag_true(self, capsys): + """Test that run_debug shows tool calls when verbose=True.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Test agent with tools.", + ) + runner = InMemoryRunner(agent=agent) + + async def mock_run_async(*args, **kwargs): + # Tool call event + mock_call_event = mock.Mock() + mock_call_event.author = "test_agent" + mock_call_event.content = mock.Mock() + + mock_function_call = mock.Mock() + mock_function_call.name = "calculate" + mock_function_call.args = {"expression": "42 * 3.14"} + + mock_part_call = mock.Mock() + mock_part_call.text = None + mock_part_call.function_call = mock_function_call + mock_part_call.function_response = None + mock_part_call.executable_code = None + mock_part_call.code_execution_result = None + mock_part_call.inline_data = None + mock_part_call.file_data = None + + mock_call_event.content.parts = [mock_part_call] + yield mock_call_event + + # Tool response event + mock_resp_event = mock.Mock() + mock_resp_event.author = "test_agent" + mock_resp_event.content = mock.Mock() + + mock_function_response = mock.Mock() + mock_function_response.response = {"result": 131.88} + + mock_part_resp = mock.Mock() + mock_part_resp.text = None + mock_part_resp.function_call = None + mock_part_resp.function_response = mock_function_response + mock_part_resp.executable_code = None + mock_part_resp.code_execution_result = None + mock_part_resp.inline_data = None + mock_part_resp.file_data = None + + mock_resp_event.content.parts = [mock_part_resp] + yield mock_resp_event + + # Final text response + mock_text_event = mock.Mock() + mock_text_event.author = "test_agent" + mock_text_event.content = mock.Mock() + mock_text_event.content.parts = [mock.Mock(text="The result is 131.88")] + yield mock_text_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + events = await runner.run_debug( + "Calculate 42 * 3.14", + verbose=True, # Should show tool calls + ) + + captured = capsys.readouterr() + # Should show tool call details + assert ( + "[Calling tool: calculate({'expression': '42 * 3.14'})]" + in captured.out + ) + assert "[Tool result: {'result': 131.88}]" in captured.out + # Should also show final text response + assert "The result is 131.88" in captured.out + assert len(events) == 3 + + @pytest.mark.asyncio + async def test_run_debug_with_empty_parts_list(self, capsys): + """Test that run_debug handles events with empty parts list gracefully.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Test agent.", + ) + runner = InMemoryRunner(agent=agent) + + async def mock_run_async(*_args, **_kwargs): + # Event with empty parts list + mock_event = mock.Mock() + mock_event.author = "test_agent" + mock_event.content = mock.Mock() + mock_event.content.parts = [] # Empty parts list + yield mock_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + events = await runner.run_debug("Test query") + + captured = capsys.readouterr() + # Should handle gracefully without crashing + assert "User > Test query" in captured.out + assert len(events) == 1 + # Should not print any agent response since parts is empty + assert "test_agent >" not in captured.out + + @pytest.mark.asyncio + async def test_run_debug_with_none_event_content(self, capsys): + """Test that run_debug handles events with None content gracefully.""" + agent = Agent( + name="test_agent", + model="gemini-2.5-flash-lite", + instruction="Test agent.", + ) + runner = InMemoryRunner(agent=agent) + + async def mock_run_async(*_args, **_kwargs): + # Event with None content + mock_event = mock.Mock() + mock_event.author = "test_agent" + mock_event.content = None # None content + yield mock_event + + with mock.patch.object(runner, "run_async", side_effect=mock_run_async): + events = await runner.run_debug("Test query") + + captured = capsys.readouterr() + # Should handle gracefully without crashing + assert "User > Test query" in captured.out + assert len(events) == 1 + # Should not print any agent response since content is None + assert "test_agent >" not in captured.out diff --git a/tests/unittests/runners/test_runner_rewind.py b/tests/unittests/runners/test_runner_rewind.py new file mode 100644 index 0000000000..ae325e5ad9 --- /dev/null +++ b/tests/unittests/runners/test_runner_rewind.py @@ -0,0 +1,248 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for runner.rewind_async.""" + +from google.adk.agents.base_agent import BaseAgent +from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService +from google.adk.events.event import Event +from google.adk.events.event import EventActions +from google.adk.runners import Runner +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.genai import types +import pytest + + +class TestRunnerRewind: + """Tests for runner.rewind_async.""" + + runner: Runner + + def setup_method(self): + """Set up test fixtures.""" + root_agent = BaseAgent(name="test_agent") + session_service = InMemorySessionService() + artifact_service = InMemoryArtifactService() + self.runner = Runner( + app_name="test_app", + agent=root_agent, + session_service=session_service, + artifact_service=artifact_service, + ) + + @pytest.mark.asyncio + async def test_rewind_async_with_state_and_artifacts(self): + """Tests rewind_async rewinds state and artifacts.""" + runner = self.runner + user_id = "test_user" + session_id = "test_session" + + # 1. Setup session and initial artifacts + session = await runner.session_service.create_session( + app_name=runner.app_name, user_id=user_id, session_id=session_id + ) + + # invocation1 + await runner.artifact_service.save_artifact( + app_name=runner.app_name, + user_id=user_id, + session_id=session_id, + filename="f1", + artifact=types.Part.from_text(text="f1v0"), + ) + event1 = Event( + invocation_id="invocation1", + author="agent", + content=types.Content(parts=[types.Part.from_text(text="event1")]), + actions=EventActions( + state_delta={"k1": "v1"}, artifact_delta={"f1": 0} + ), + ) + await runner.session_service.append_event(session=session, event=event1) + + # invocation2 + await runner.artifact_service.save_artifact( + app_name=runner.app_name, + user_id=user_id, + session_id=session_id, + filename="f1", + artifact=types.Part.from_text(text="f1v1"), + ) + await runner.artifact_service.save_artifact( + app_name=runner.app_name, + user_id=user_id, + session_id=session_id, + filename="f2", + artifact=types.Part.from_text(text="f2v0"), + ) + event2 = Event( + invocation_id="invocation2", + author="agent", + content=types.Content(parts=[types.Part.from_text(text="event2")]), + actions=EventActions( + state_delta={"k1": "v2", "k2": "v2"}, + artifact_delta={"f1": 1, "f2": 0}, + ), + ) + await runner.session_service.append_event(session=session, event=event2) + + # invocation3 + event3 = Event( + invocation_id="invocation3", + author="agent", + content=types.Content(parts=[types.Part.from_text(text="event3")]), + actions=EventActions(state_delta={"k2": "v3"}), + ) + await runner.session_service.append_event(session=session, event=event3) + + session = await runner.session_service.get_session( + app_name=runner.app_name, user_id=user_id, session_id=session_id + ) + assert session.state == {"k1": "v2", "k2": "v3"} + assert await runner.artifact_service.load_artifact( + app_name=runner.app_name, + user_id=user_id, + session_id=session_id, + filename="f1", + ) == types.Part.from_text(text="f1v1") + assert await runner.artifact_service.load_artifact( + app_name=runner.app_name, + user_id=user_id, + session_id=session_id, + filename="f2", + ) == types.Part.from_text(text="f2v0") + + # 2. Rewind before invocation2 + await runner.rewind_async( + user_id=user_id, + session_id=session_id, + rewind_before_invocation_id="invocation2", + ) + + # 3. Verify state and artifacts are rewinded + session = await runner.session_service.get_session( + app_name=runner.app_name, user_id=user_id, session_id=session_id + ) + # After rewind before invocation2, only event1 state delta should apply. + assert session.state["k1"] == "v1" + assert not session.state["k2"] + # f1 should be rewinded to v0 + assert await runner.artifact_service.load_artifact( + app_name=runner.app_name, + user_id=user_id, + session_id=session_id, + filename="f1", + ) == types.Part.from_text(text="f1v0") + # f2 should not exist + assert ( + await runner.artifact_service.load_artifact( + app_name=runner.app_name, + user_id=user_id, + session_id=session_id, + filename="f2", + ) + is None + ) + + @pytest.mark.asyncio + async def test_rewind_async_not_first_invocation(self): + """Tests rewind_async rewinds state and artifacts to invocation2.""" + runner = self.runner + user_id = "test_user" + session_id = "test_session" + + # 1. Setup session and initial artifacts + session = await runner.session_service.create_session( + app_name=runner.app_name, user_id=user_id, session_id=session_id + ) + # invocation1 + await runner.artifact_service.save_artifact( + app_name=runner.app_name, + user_id=user_id, + session_id=session_id, + filename="f1", + artifact=types.Part.from_text(text="f1v0"), + ) + event1 = Event( + invocation_id="invocation1", + author="agent", + content=types.Content(parts=[types.Part.from_text(text="event1")]), + actions=EventActions( + state_delta={"k1": "v1"}, artifact_delta={"f1": 0} + ), + ) + await runner.session_service.append_event(session=session, event=event1) + + # invocation2 + await runner.artifact_service.save_artifact( + app_name=runner.app_name, + user_id=user_id, + session_id=session_id, + filename="f1", + artifact=types.Part.from_text(text="f1v1"), + ) + await runner.artifact_service.save_artifact( + app_name=runner.app_name, + user_id=user_id, + session_id=session_id, + filename="f2", + artifact=types.Part.from_text(text="f2v0"), + ) + event2 = Event( + invocation_id="invocation2", + author="agent", + content=types.Content(parts=[types.Part.from_text(text="event2")]), + actions=EventActions( + state_delta={"k1": "v2", "k2": "v2"}, + artifact_delta={"f1": 1, "f2": 0}, + ), + ) + await runner.session_service.append_event(session=session, event=event2) + + # invocation3 + event3 = Event( + invocation_id="invocation3", + author="agent", + content=types.Content(parts=[types.Part.from_text(text="event3")]), + actions=EventActions(state_delta={"k2": "v3"}), + ) + await runner.session_service.append_event(session=session, event=event3) + + # 2. Rewind before invocation3 + await runner.rewind_async( + user_id=user_id, + session_id=session_id, + rewind_before_invocation_id="invocation3", + ) + + # 3. Verify state and artifacts are rewinded + session = await runner.session_service.get_session( + app_name=runner.app_name, user_id=user_id, session_id=session_id + ) + # After rewind before invocation3, event1 and event2 state deltas should apply. + assert session.state == {"k1": "v2", "k2": "v2"} + # f1 should be v1 + assert await runner.artifact_service.load_artifact( + app_name=runner.app_name, + user_id=user_id, + session_id=session_id, + filename="f1", + ) == types.Part.from_text(text="f1v1") + # f2 should be v0 + assert await runner.artifact_service.load_artifact( + app_name=runner.app_name, + user_id=user_id, + session_id=session_id, + filename="f2", + ) == types.Part.from_text(text="f2v0") diff --git a/tests/unittests/sessions/test_dynamic_pickle_type.py b/tests/unittests/sessions/test_dynamic_pickle_type.py new file mode 100644 index 0000000000..e4eb084f88 --- /dev/null +++ b/tests/unittests/sessions/test_dynamic_pickle_type.py @@ -0,0 +1,181 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from __future__ import annotations + +import pickle +from unittest import mock + +from google.adk.sessions.database_session_service import DynamicPickleType +import pytest +from sqlalchemy import create_engine +from sqlalchemy.dialects import mysql + + +@pytest.fixture +def pickle_type(): + """Fixture for DynamicPickleType instance.""" + return DynamicPickleType() + + +def test_load_dialect_impl_mysql(pickle_type): + """Test that MySQL dialect uses LONGBLOB.""" + # Mock the MySQL dialect + mock_dialect = mock.Mock() + mock_dialect.name = "mysql" + + # Mock the return value of type_descriptor + mock_longblob_type = mock.Mock() + mock_dialect.type_descriptor.return_value = mock_longblob_type + + impl = pickle_type.load_dialect_impl(mock_dialect) + + # Verify type_descriptor was called once with mysql.LONGBLOB + mock_dialect.type_descriptor.assert_called_once_with(mysql.LONGBLOB) + # Verify the return value is what we expect + assert impl == mock_longblob_type + + +def test_load_dialect_impl_spanner(pickle_type): + """Test that Spanner dialect uses SpannerPickleType.""" + # Mock the spanner dialect + mock_dialect = mock.Mock() + mock_dialect.name = "spanner+spanner" + + with mock.patch( + "google.cloud.sqlalchemy_spanner.sqlalchemy_spanner.SpannerPickleType" + ) as mock_spanner_type: + pickle_type.load_dialect_impl(mock_dialect) + mock_dialect.type_descriptor.assert_called_once_with(mock_spanner_type) + + +def test_load_dialect_impl_default(pickle_type): + """Test that other dialects use default PickleType.""" + engine = create_engine("sqlite:///:memory:") + dialect = engine.dialect + impl = pickle_type.load_dialect_impl(dialect) + # Should return the default impl (PickleType) + assert impl == pickle_type.impl + + +@pytest.mark.parametrize( + "dialect_name", + [ + pytest.param("mysql", id="mysql"), + pytest.param("spanner+spanner", id="spanner"), + ], +) +def test_process_bind_param_pickle_dialects(pickle_type, dialect_name): + """Test that MySQL and Spanner dialects pickle the value.""" + mock_dialect = mock.Mock() + mock_dialect.name = dialect_name + + test_data = {"key": "value", "nested": [1, 2, 3]} + result = pickle_type.process_bind_param(test_data, mock_dialect) + + # Should be pickled bytes + assert isinstance(result, bytes) + # Should be able to unpickle back to original + assert pickle.loads(result) == test_data + + +def test_process_bind_param_default(pickle_type): + """Test that other dialects return value as-is.""" + mock_dialect = mock.Mock() + mock_dialect.name = "sqlite" + + test_data = {"key": "value"} + result = pickle_type.process_bind_param(test_data, mock_dialect) + + # Should return value unchanged (SQLAlchemy's PickleType handles it) + assert result == test_data + + +def test_process_bind_param_none(pickle_type): + """Test that None values are handled correctly.""" + mock_dialect = mock.Mock() + mock_dialect.name = "mysql" + + result = pickle_type.process_bind_param(None, mock_dialect) + assert result is None + + +@pytest.mark.parametrize( + "dialect_name", + [ + pytest.param("mysql", id="mysql"), + pytest.param("spanner+spanner", id="spanner"), + ], +) +def test_process_result_value_pickle_dialects(pickle_type, dialect_name): + """Test that MySQL and Spanner dialects unpickle the value.""" + mock_dialect = mock.Mock() + mock_dialect.name = dialect_name + + test_data = {"key": "value", "nested": [1, 2, 3]} + pickled_data = pickle.dumps(test_data) + + result = pickle_type.process_result_value(pickled_data, mock_dialect) + + # Should be unpickled back to original + assert result == test_data + + +def test_process_result_value_default(pickle_type): + """Test that other dialects return value as-is.""" + mock_dialect = mock.Mock() + mock_dialect.name = "sqlite" + + test_data = {"key": "value"} + result = pickle_type.process_result_value(test_data, mock_dialect) + + # Should return value unchanged (SQLAlchemy's PickleType handles it) + assert result == test_data + + +def test_process_result_value_none(pickle_type): + """Test that None values are handled correctly.""" + mock_dialect = mock.Mock() + mock_dialect.name = "mysql" + + result = pickle_type.process_result_value(None, mock_dialect) + assert result is None + + +@pytest.mark.parametrize( + "dialect_name", + [ + pytest.param("mysql", id="mysql"), + pytest.param("spanner+spanner", id="spanner"), + ], +) +def test_roundtrip_pickle_dialects(pickle_type, dialect_name): + """Test full roundtrip for MySQL and Spanner: bind -> result.""" + mock_dialect = mock.Mock() + mock_dialect.name = dialect_name + + original_data = { + "string": "test", + "number": 42, + "list": [1, 2, 3], + "nested": {"a": 1, "b": 2}, + } + + # Simulate bind (Python -> DB) + bound_value = pickle_type.process_bind_param(original_data, mock_dialect) + assert isinstance(bound_value, bytes) + + # Simulate result (DB -> Python) + result_value = pickle_type.process_result_value(bound_value, mock_dialect) + assert result_value == original_data diff --git a/tests/unittests/sessions/test_session_service.py b/tests/unittests/sessions/test_session_service.py index c2a3a1d98f..45d4fcc591 100644 --- a/tests/unittests/sessions/test_session_service.py +++ b/tests/unittests/sessions/test_session_service.py @@ -16,6 +16,7 @@ from datetime import timezone import enum +from google.adk.errors.already_exists_error import AlreadyExistsError from google.adk.events.event import Event from google.adk.events.event_actions import EventActions from google.adk.sessions.base_session_service import GetSessionConfig @@ -90,7 +91,7 @@ async def test_create_get_session(service_type): await session_service.get_session( app_name=app_name, user_id=user_id, session_id=session.id ) - != session + is None ) @@ -116,147 +117,250 @@ async def test_create_and_list_sessions(service_type): app_name=app_name, user_id=user_id ) sessions = list_sessions_response.sessions - for i in range(len(sessions)): - assert sessions[i].id == session_ids[i] - assert sessions[i].state == {'key': 'value' + session_ids[i]} + assert len(sessions) == len(session_ids) + assert {s.id for s in sessions} == set(session_ids) + for session in sessions: + assert session.state == {'key': 'value' + session.id} @pytest.mark.asyncio @pytest.mark.parametrize( 'service_type', [SessionServiceType.IN_MEMORY, SessionServiceType.DATABASE] ) -async def test_session_state(service_type): +async def test_list_sessions_all_users(service_type): session_service = get_session_service(service_type) app_name = 'my_app' user_id_1 = 'user1' user_id_2 = 'user2' - user_id_malicious = 'malicious' - session_id_11 = 'session11' - session_id_12 = 'session12' - session_id_2 = 'session2' - state_11 = {'key11': 'value11'} - state_12 = {'key12': 'value12'} - - session_11 = await session_service.create_session( + + await session_service.create_session( app_name=app_name, user_id=user_id_1, - state=state_11, - session_id=session_id_11, + session_id='session1a', + state={'key': 'value1a'}, ) await session_service.create_session( app_name=app_name, user_id=user_id_1, - state=state_12, - session_id=session_id_12, + session_id='session1b', + state={'key': 'value1b'}, ) await session_service.create_session( - app_name=app_name, user_id=user_id_2, session_id=session_id_2 + app_name=app_name, + user_id=user_id_2, + session_id='session2a', + state={'key': 'value2a'}, ) - await session_service.create_session( - app_name=app_name, user_id=user_id_malicious, session_id=session_id_11 + # List sessions for user1 - should contain merged state + list_sessions_response_1 = await session_service.list_sessions( + app_name=app_name, user_id=user_id_1 ) + sessions_1 = list_sessions_response_1.sessions + assert len(sessions_1) == 2 + sessions_1_map = {s.id: s for s in sessions_1} + assert sessions_1_map['session1a'].state == {'key': 'value1a'} + assert sessions_1_map['session1b'].state == {'key': 'value1b'} - assert session_11.state.get('key11') == 'value11' + # List sessions for user2 - should contain merged state + list_sessions_response_2 = await session_service.list_sessions( + app_name=app_name, user_id=user_id_2 + ) + sessions_2 = list_sessions_response_2.sessions + assert len(sessions_2) == 1 + assert sessions_2[0].id == 'session2a' + assert sessions_2[0].state == {'key': 'value2a'} + + # List sessions for all users - should contain merged state + list_sessions_response_all = await session_service.list_sessions( + app_name=app_name, user_id=None + ) + sessions_all = list_sessions_response_all.sessions + assert len(sessions_all) == 3 + sessions_all_map = {s.id: s for s in sessions_all} + assert sessions_all_map['session1a'].state == {'key': 'value1a'} + assert sessions_all_map['session1b'].state == {'key': 'value1b'} + assert sessions_all_map['session2a'].state == {'key': 'value2a'} + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'service_type', [SessionServiceType.IN_MEMORY, SessionServiceType.DATABASE] +) +async def test_app_state_is_shared_by_all_users_of_app(service_type): + session_service = get_session_service(service_type) + app_name = 'my_app' + # User 1 creates a session, establishing app:k1 + session1 = await session_service.create_session( + app_name=app_name, user_id='u1', session_id='s1', state={'app:k1': 'v1'} + ) + # User 1 appends an event to session1, establishing app:k2 event = Event( - invocation_id='invocation', + invocation_id='inv1', author='user', - content=types.Content(role='user', parts=[types.Part(text='text')]), - actions=EventActions( - state_delta={ - 'app:key': 'value', - 'user:key1': 'value1', - 'temp:key': 'temp', - 'key11': 'value11_new', - } - ), + actions=EventActions(state_delta={'app:k2': 'v2'}), ) - await session_service.append_event(session=session_11, event=event) - - # User and app state is stored, temp state is filtered. - assert session_11.state.get('app:key') == 'value' - assert session_11.state.get('key11') == 'value11_new' - assert session_11.state.get('user:key1') == 'value1' - assert not session_11.state.get('temp:key') + await session_service.append_event(session=session1, event=event) - session_12 = await session_service.get_session( - app_name=app_name, user_id=user_id_1, session_id=session_id_12 + # User 2 creates a new session session2, it should see app:k1 and app:k2 + session2 = await session_service.create_session( + app_name=app_name, user_id='u2', session_id='s2' ) - # After getting a new instance, the session_12 got the user and app state, - # even append_event is not applied to it, temp state has no effect - assert session_12.state.get('key12') == 'value12' - assert not session_12.state.get('temp:key') + assert session2.state == {'app:k1': 'v1', 'app:k2': 'v2'} - # The user1's state is not visible to user2, app state is visible - session_2 = await session_service.get_session( - app_name=app_name, user_id=user_id_2, session_id=session_id_2 + # If we get session session1 again, it should also see both + session1_got = await session_service.get_session( + app_name=app_name, user_id='u1', session_id='s1' ) - assert session_2.state.get('app:key') == 'value' - assert not session_2.state.get('user:key1') + assert session1_got.state.get('app:k1') == 'v1' + assert session1_got.state.get('app:k2') == 'v2' - assert not session_2.state.get('user:key1') - # The change to session_11 is persisted - session_11 = await session_service.get_session( - app_name=app_name, user_id=user_id_1, session_id=session_id_11 +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'service_type', [SessionServiceType.IN_MEMORY, SessionServiceType.DATABASE] +) +async def test_user_state_is_shared_only_by_user_sessions(service_type): + session_service = get_session_service(service_type) + app_name = 'my_app' + # User 1 creates a session, establishing user:k1 for user 1 + session1 = await session_service.create_session( + app_name=app_name, user_id='u1', session_id='s1', state={'user:k1': 'v1'} ) - assert session_11.state.get('key11') == 'value11_new' - assert session_11.state.get('user:key1') == 'value1' - assert not session_11.state.get('temp:key') + # User 1 appends an event to session1, establishing user:k2 for user 1 + event = Event( + invocation_id='inv1', + author='user', + actions=EventActions(state_delta={'user:k2': 'v2'}), + ) + await session_service.append_event(session=session1, event=event) - # Make sure a malicious user cannot obtain a session and events not belonging to them - session_mismatch = await session_service.get_session( - app_name=app_name, user_id=user_id_malicious, session_id=session_id_11 + # Another session for User 1 should see user:k1 and user:k2 + session1b = await session_service.create_session( + app_name=app_name, user_id='u1', session_id='s1b' ) + assert session1b.state == {'user:k1': 'v1', 'user:k2': 'v2'} - assert len(session_mismatch.events) == 0 + # A session for User 2 should NOT see user:k1 or user:k2 + session2 = await session_service.create_session( + app_name=app_name, user_id='u2', session_id='s2' + ) + assert session2.state == {} @pytest.mark.asyncio @pytest.mark.parametrize( 'service_type', [SessionServiceType.IN_MEMORY, SessionServiceType.DATABASE] ) -async def test_create_new_session_will_merge_states(service_type): +async def test_session_state_is_not_shared(service_type): session_service = get_session_service(service_type) app_name = 'my_app' - user_id = 'user' - session_id_1 = 'session1' - session_id_2 = 'session2' - state_1 = {'key1': 'value1'} + # User 1 creates a session session1, establishing sk1 only for session1 + session1 = await session_service.create_session( + app_name=app_name, user_id='u1', session_id='s1', state={'sk1': 'v1'} + ) + # User 1 appends an event to session1, establishing sk2 only for session1 + event = Event( + invocation_id='inv1', + author='user', + actions=EventActions(state_delta={'sk2': 'v2'}), + ) + await session_service.append_event(session=session1, event=event) + + # Getting session1 should show sk1 and sk2 + session1_got = await session_service.get_session( + app_name=app_name, user_id='u1', session_id='s1' + ) + assert session1_got.state.get('sk1') == 'v1' + assert session1_got.state.get('sk2') == 'v2' - session_1 = await session_service.create_session( - app_name=app_name, user_id=user_id, state=state_1, session_id=session_id_1 + # Creating another session session1b for User 1 should NOT see sk1 or sk2 + session1b = await session_service.create_session( + app_name=app_name, user_id='u1', session_id='s1b' ) + assert session1b.state == {} + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'service_type', [SessionServiceType.IN_MEMORY, SessionServiceType.DATABASE] +) +async def test_temp_state_is_not_persisted_in_state_or_events(service_type): + session_service = get_session_service(service_type) + app_name = 'my_app' + user_id = 'u1' + session = await session_service.create_session( + app_name=app_name, user_id=user_id, session_id='s1' + ) event = Event( - invocation_id='invocation', + invocation_id='inv1', author='user', - content=types.Content(role='user', parts=[types.Part(text='text')]), - actions=EventActions( - state_delta={ - 'app:key': 'value', - 'user:key1': 'value1', - 'temp:key': 'temp', - } - ), + actions=EventActions(state_delta={'temp:k1': 'v1', 'sk': 'v2'}), + ) + await session_service.append_event(session=session, event=event) + + # Refetch session and check state and event + session_got = await session_service.get_session( + app_name=app_name, user_id=user_id, session_id='s1' ) - await session_service.append_event(session=session_1, event=event) + # Check session state does not contain temp keys + assert session_got.state.get('sk') == 'v2' + assert 'temp:k1' not in session_got.state + # Check event as stored in session does not contain temp keys in state_delta + assert 'temp:k1' not in session_got.events[0].actions.state_delta + assert session_got.events[0].actions.state_delta.get('sk') == 'v2' - # User and app state is stored, temp state is filtered. - assert session_1.state.get('app:key') == 'value' - assert session_1.state.get('key1') == 'value1' - assert session_1.state.get('user:key1') == 'value1' - assert not session_1.state.get('temp:key') - session_2 = await session_service.create_session( - app_name=app_name, user_id=user_id, state={}, session_id=session_id_2 +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'service_type', [SessionServiceType.IN_MEMORY, SessionServiceType.DATABASE] +) +async def test_get_session_respects_user_id(service_type): + session_service = get_session_service(service_type) + app_name = 'my_app' + # u1 creates session 's1' and adds an event + session1 = await session_service.create_session( + app_name=app_name, user_id='u1', session_id='s1' ) - # Session 2 has the persisted states - assert session_2.state.get('app:key') == 'value' - assert session_2.state.get('user:key1') == 'value1' - assert not session_2.state.get('key1') - assert not session_2.state.get('temp:key') + event = Event(invocation_id='inv1', author='user') + await session_service.append_event(session1, event) + # u2 creates a session with the same session_id 's1' + await session_service.create_session( + app_name=app_name, user_id='u2', session_id='s1' + ) + # Check that getting s1 for u2 returns u2's session (with no events) + # not u1's session. + session2_got = await session_service.get_session( + app_name=app_name, user_id='u2', session_id='s1' + ) + assert session2_got.user_id == 'u2' + assert len(session2_got.events) == 0 + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + 'service_type', [SessionServiceType.IN_MEMORY, SessionServiceType.DATABASE] +) +async def test_create_session_with_existing_id_raises_error(service_type): + session_service = get_session_service(service_type) + app_name = 'my_app' + user_id = 'test_user' + session_id = 'existing_session' + + # Create the first session + await session_service.create_session( + app_name=app_name, + user_id=user_id, + session_id=session_id, + ) + + # Attempt to create a session with the same ID + with pytest.raises(AlreadyExistsError): + await session_service.create_session( + app_name=app_name, + user_id=user_id, + session_id=session_id, + ) @pytest.mark.asyncio @@ -329,6 +433,14 @@ async def test_append_event_complete(service_type): error_code='error_code', error_message='error_message', interrupted=True, + grounding_metadata=types.GroundingMetadata( + web_search_queries=['query1'], + ), + usage_metadata=types.GenerateContentResponseUsageMetadata( + prompt_token_count=1, candidates_token_count=1, total_token_count=2 + ), + citation_metadata=types.CitationMetadata(), + custom_metadata={'custom_key': 'custom_value'}, ) await session_service.append_event(session=session, event=event) @@ -408,36 +520,20 @@ async def test_get_session_with_config(service_type): @pytest.mark.parametrize( 'service_type', [SessionServiceType.IN_MEMORY, SessionServiceType.DATABASE] ) -async def test_append_event_with_fields(service_type): +async def test_partial_events_are_not_persisted(service_type): session_service = get_session_service(service_type) app_name = 'my_app' - user_id = 'test_user' + user_id = 'user' session = await session_service.create_session( - app_name=app_name, user_id=user_id, state={} - ) - - event = Event( - invocation_id='invocation', - author='user', - content=types.Content(role='user', parts=[types.Part(text='text')]), - long_running_tool_ids={'tool1', 'tool2'}, - partial=False, - turn_complete=True, - error_code='ERROR_CODE', - error_message='error message', - interrupted=True, - grounding_metadata=types.GroundingMetadata( - web_search_queries=['query1'], - ), - custom_metadata={'custom_key': 'custom_value'}, + app_name=app_name, user_id=user_id ) + event = Event(author='user', partial=True) await session_service.append_event(session, event) - retrieved_session = await session_service.get_session( + # Check in-memory session + assert len(session.events) == 0 + # Check persisted session + session_got = await session_service.get_session( app_name=app_name, user_id=user_id, session_id=session.id ) - assert retrieved_session - assert len(retrieved_session.events) == 1 - retrieved_event = retrieved_session.events[0] - - assert retrieved_event == event + assert len(session_got.events) == 0 diff --git a/tests/unittests/sessions/test_vertex_ai_session_service.py b/tests/unittests/sessions/test_vertex_ai_session_service.py index f72394c44c..fd004199cd 100644 --- a/tests/unittests/sessions/test_vertex_ai_session_service.py +++ b/tests/unittests/sessions/test_vertex_ai_session_service.py @@ -12,21 +12,26 @@ # See the License for the specific language governing permissions and # limitations under the License. +import copy import re -import this +import types from typing import Any from typing import List from typing import Optional from typing import Tuple from unittest import mock -from urllib import parse from dateutil.parser import isoparse +from fastapi.openapi import models as openapi_models +from google.adk.auth import auth_schemes +from google.adk.auth.auth_tool import AuthConfig from google.adk.events.event import Event from google.adk.events.event_actions import EventActions +from google.adk.sessions.base_session_service import GetSessionConfig from google.adk.sessions.session import Session from google.adk.sessions.vertex_ai_session_service import VertexAiSessionService -from google.genai import types +from google.api_core import exceptions as api_core_exceptions +from google.genai import types as genai_types import pytest MOCK_SESSION_JSON_1 = { @@ -34,28 +39,28 @@ 'projects/test-project/locations/test-location/' 'reasoningEngines/123/sessions/1' ), - 'createTime': '2024-12-12T12:12:12.123456Z', - 'updateTime': '2024-12-12T12:12:12.123456Z', - 'sessionState': { + 'create_time': '2024-12-12T12:12:12.123456Z', + 'update_time': '2024-12-12T12:12:12.123456Z', + 'session_state': { 'key': {'value': 'test_value'}, }, - 'userId': 'user', + 'user_id': 'user', } MOCK_SESSION_JSON_2 = { 'name': ( 'projects/test-project/locations/test-location/' 'reasoningEngines/123/sessions/2' ), - 'updateTime': '2024-12-13T12:12:12.123456Z', - 'userId': 'user', + 'update_time': '2024-12-13T12:12:12.123456Z', + 'user_id': 'user', } MOCK_SESSION_JSON_3 = { 'name': ( 'projects/test-project/locations/test-location/' 'reasoningEngines/123/sessions/3' ), - 'updateTime': '2024-12-14T12:12:12.123456Z', - 'userId': 'user2', + 'update_time': '2024-12-14T12:12:12.123456Z', + 'user_id': 'user2', } MOCK_EVENT_JSON = [ { @@ -63,7 +68,7 @@ 'projects/test-project/locations/test-location/' 'reasoningEngines/123/sessions/1/events/123' ), - 'invocationId': '123', + 'invocation_id': '123', 'author': 'user', 'timestamp': '2024-12-12T12:12:12.123456Z', 'content': { @@ -72,17 +77,17 @@ ], }, 'actions': { - 'stateDelta': { + 'state_delta': { 'key': {'value': 'test_value'}, }, - 'transferAgent': 'agent', + 'transfer_agent': 'agent', }, - 'eventMetadata': { + 'event_metadata': { 'partial': False, - 'turnComplete': True, + 'turn_complete': True, 'interrupted': False, 'branch': '', - 'longRunningToolIds': ['tool1'], + 'long_running_tool_ids': ['tool1'], }, }, ] @@ -92,7 +97,7 @@ 'projects/test-project/locations/test-location/' 'reasoningEngines/123/sessions/2/events/123' ), - 'invocationId': '222', + 'invocation_id': '222', 'author': 'user', 'timestamp': '2024-12-12T12:12:12.123456Z', }, @@ -103,9 +108,9 @@ 'projects/test-project/locations/test-location/' 'reasoningEngines/123/sessions/2/events/456' ), - 'invocationId': '333', + 'invocation_id': '333', 'author': 'user', - 'timestamp': '2024-12-12T12:12:12.123456Z', + 'timestamp': '2024-12-12T12:12:13.123456Z', }, ] MOCK_SESSION_JSON_PAGE1 = { @@ -113,31 +118,33 @@ 'projects/test-project/locations/test-location/' 'reasoningEngines/123/sessions/page1' ), - 'updateTime': '2024-12-15T12:12:12.123456Z', - 'userId': 'user_with_pages', + 'update_time': '2024-12-15T12:12:12.123456Z', + 'user_id': 'user_with_pages', } MOCK_SESSION_JSON_PAGE2 = { 'name': ( 'projects/test-project/locations/test-location/' 'reasoningEngines/123/sessions/page2' ), - 'updateTime': '2024-12-16T12:12:12.123456Z', - 'userId': 'user_with_pages', + 'update_time': '2024-12-16T12:12:12.123456Z', + 'user_id': 'user_with_pages', } MOCK_SESSION = Session( app_name='123', user_id='user', id='1', - state=MOCK_SESSION_JSON_1['sessionState'], - last_update_time=isoparse(MOCK_SESSION_JSON_1['updateTime']).timestamp(), + state=MOCK_SESSION_JSON_1['session_state'], + last_update_time=isoparse(MOCK_SESSION_JSON_1['update_time']).timestamp(), events=[ Event( id='123', invocation_id='123', author='user', timestamp=isoparse(MOCK_EVENT_JSON[0]['timestamp']).timestamp(), - content=types.Content(parts=[types.Part(text='test_content')]), + content=genai_types.Content( + parts=[genai_types.Part(text='test_content')] + ), actions=EventActions( transfer_to_agent='agent', state_delta={'key': {'value': 'test_value'}}, @@ -155,7 +162,7 @@ app_name='123', user_id='user', id='2', - last_update_time=isoparse(MOCK_SESSION_JSON_2['updateTime']).timestamp(), + last_update_time=isoparse(MOCK_SESSION_JSON_2['update_time']).timestamp(), events=[ Event( id='123', @@ -173,12 +180,52 @@ ) -SESSION_REGEX = r'^reasoningEngines/([^/]+)/sessions/([^/]+)$' -SESSIONS_REGEX = r'^reasoningEngines/([^/]+)/sessions\?.*$' -EVENTS_REGEX = ( - r'^reasoningEngines/([^/]+)/sessions/([^/]+)/events(?:\?pageToken=([^/]+))?' -) -LRO_REGEX = r'^operations/([^/]+)$' +class PydanticNamespace(types.SimpleNamespace): + + def model_dump(self, exclude_none=True, mode='python'): + d = {} + for k, v in self.__dict__.items(): + if exclude_none and v is None: + continue + if isinstance(v, PydanticNamespace): + d[k] = v.model_dump(exclude_none=exclude_none, mode=mode) + elif isinstance(v, list): + d[k] = [ + i.model_dump(exclude_none=exclude_none, mode=mode) + if isinstance(i, PydanticNamespace) + else i + for i in v + ] + else: + d[k] = v + return d + + +def _convert_to_object(data): + if isinstance(data, dict): + kwargs = {} + for key, value in data.items(): + if key in [ + 'timestamp', + 'update_time', + 'create_time', + ] and isinstance(value, str): + kwargs[key] = isoparse(value) + elif key in [ + 'session_state', + 'state_delta', + 'artifact_delta', + 'custom_metadata', + 'requested_auth_configs', + ]: + kwargs[key] = value + else: + kwargs[key] = _convert_to_object(value) + return PydanticNamespace(**kwargs) + elif isinstance(data, list): + return [_convert_to_object(item) for item in data] + else: + return data class MockApiClient: @@ -186,117 +233,147 @@ class MockApiClient: def __init__(self) -> None: """Initializes MockClient.""" - this.session_dict: dict[str, Any] = {} - this.event_dict: dict[str, Tuple[List[Any], Optional[str]]] = {} - - async def async_request( - self, http_method: str, path: str, request_dict: dict[str, Any] + self.session_dict: dict[str, Any] = {} + self.event_dict: dict[str, Tuple[List[Any], Optional[str]]] = {} + self.aio = mock.Mock() + self.aio.agent_engines.sessions.get.side_effect = self._get_session + self.aio.agent_engines.sessions.list.side_effect = self._list_sessions + self.aio.agent_engines.sessions.delete.side_effect = self._delete_session + self.aio.agent_engines.sessions.create.side_effect = self._create_session + self.aio.agent_engines.sessions.events.list.side_effect = self._list_events + self.aio.agent_engines.sessions.events.append.side_effect = ( + self._append_event + ) + self.last_create_session_config: dict[str, Any] = {} + + async def _get_session(self, name: str): + session_id = name.split('/')[-1] + if session_id in self.session_dict: + return _convert_to_object(self.session_dict[session_id]) + raise api_core_exceptions.NotFound(f'Session not found: {session_id}') + + async def _list_sessions(self, name: str, config: dict[str, Any]): + filter_val = config.get('filter', '') + user_id_match = re.search(r'user_id="([^"]+)"', filter_val) + if user_id_match: + user_id = user_id_match.group(1) + if user_id == 'user_with_pages': + return [ + _convert_to_object(MOCK_SESSION_JSON_PAGE1), + _convert_to_object(MOCK_SESSION_JSON_PAGE2), + ] + return [ + _convert_to_object(session) + for session in self.session_dict.values() + if session['user_id'] == user_id + ] + + # No user filter, return all sessions + return [ + _convert_to_object(session) for session in self.session_dict.values() + ] + + async def _delete_session(self, name: str): + session_id = name.split('/')[-1] + self.session_dict.pop(session_id) + + async def _create_session( + self, name: str, user_id: str, config: dict[str, Any] ): - """Mocks the API Client request method""" - if http_method == 'GET': - if re.match(SESSION_REGEX, path): - match = re.match(SESSION_REGEX, path) - if match: - session_id = match.group(2) - if session_id in self.session_dict: - return self.session_dict[session_id] - else: - raise ValueError(f'Session not found: {session_id}') - elif re.match(SESSIONS_REGEX, path): - parsed_url = parse.urlparse(path) - query_params = parse.parse_qs(parsed_url.query) - filter_val = query_params.get('filter', [''])[0] - user_id_match = re.search(r'user_id="([^"]+)"', filter_val) - if not user_id_match: - raise ValueError(f'Could not find user_id in filter: {filter_val}') - user_id = user_id_match.group(1) - - if user_id == 'user_with_pages': - page_token = query_params.get('pageToken', [None])[0] - if page_token == 'my_token': - return {'sessions': [MOCK_SESSION_JSON_PAGE2]} - else: - return { - 'sessions': [MOCK_SESSION_JSON_PAGE1], - 'nextPageToken': 'my_token', - } - return { - 'sessions': [ - session - for session in self.session_dict.values() - if session['userId'] == user_id - ], - } - elif re.match(EVENTS_REGEX, path): - match = re.match(EVENTS_REGEX, path) - if match: - session_id = match.group(2) - if match.group(3): - page_token = match.group(3) - if page_token == 'my_token': - response = {'sessionEvents': MOCK_EVENT_JSON_3} - response['nextPageToken'] = 'my_token2' - return response - else: - return {} - events_tuple = self.event_dict.get(session_id, ([], None)) - response = {'sessionEvents': events_tuple[0]} - if events_tuple[1]: - response['nextPageToken'] = events_tuple[1] - return response - elif re.match(LRO_REGEX, path): - # Mock long-running operation as completed - return { - 'name': path, - 'done': True, - 'response': self.session_dict['4'], # Return the created session - } - else: - raise ValueError(f'Unsupported path: {path}') - elif http_method == 'POST': - new_session_id = '4' - self.session_dict[new_session_id] = { - 'name': ( - 'projects/test-project/locations/test-location/' - 'reasoningEngines/123/sessions/' - + new_session_id - ), - 'userId': request_dict['user_id'], - 'sessionState': request_dict.get('session_state', {}), - 'updateTime': '2024-12-12T12:12:12.123456Z', - } - return { - 'name': ( - 'projects/test_project/locations/test_location/' - 'reasoningEngines/123/sessions/' - + new_session_id - + '/operations/111' - ), - 'done': False, - } - elif http_method == 'DELETE': - match = re.match(SESSION_REGEX, path) + self.last_create_session_config = config + new_session_id = '4' + self.session_dict[new_session_id] = { + 'name': ( + 'projects/test-project/locations/test-location/' + 'reasoningEngines/123/sessions/' + + new_session_id + ), + 'user_id': user_id, + 'session_state': config.get('session_state', {}), + 'update_time': '2024-12-12T12:12:12.123456Z', + } + return _convert_to_object({ + 'name': ( + 'projects/test_project/locations/test_location/' + 'reasoningEngines/123/sessions/' + + new_session_id + + '/operations/111' + ), + 'done': True, + 'response': self.session_dict['4'], + }) + + async def _list_events(self, name: str, **kwargs): + session_id = name.split('/')[-1] + events = [] + if session_id in self.event_dict: + events_tuple = self.event_dict[session_id] + events.extend(events_tuple[0]) + if events_tuple[1] == 'my_token': + events.extend(MOCK_EVENT_JSON_3) + + config = kwargs.get('config', {}) + filter_str = config.get('filter', None) + if filter_str: + match = re.search(r'timestamp>="([^"]+)"', filter_str) if match: - self.session_dict.pop(match.group(2)) + after_timestamp_str = match.group(1) + after_timestamp = isoparse(after_timestamp_str) + events = [ + event + for event in events + if isoparse(event['timestamp']) >= after_timestamp + ] + return [_convert_to_object(event) for event in events] + + async def _append_event( + self, + name: str, + author: str, + invocation_id: str, + timestamp: Any, + config: dict[str, Any], + ): + session_id = name.split('/')[-1] + event_list, token = self.event_dict.get(session_id, ([], None)) + event_id = str(len(event_list) + 1000) # generate unique ID + + event_timestamp_str = timestamp.isoformat().replace('+00:00', 'Z') + event_json = { + 'name': f'{name}/events/{event_id}', + 'invocation_id': invocation_id, + 'author': author, + 'timestamp': event_timestamp_str, + } + event_json.update(config) + + if session_id in self.session_dict: + self.session_dict[session_id]['update_time'] = event_timestamp_str + + if session_id in self.event_dict: + self.event_dict[session_id][0].append(event_json) else: - raise ValueError(f'Unsupported http method: {http_method}') + self.event_dict[session_id] = ([event_json], None) -def mock_vertex_ai_session_service(agent_engine_id: Optional[str] = None): +def mock_vertex_ai_session_service( + project: Optional[str] = 'test-project', + location: Optional[str] = 'test-location', + agent_engine_id: Optional[str] = None, + express_mode_api_key: Optional[str] = None, +): """Creates a mock Vertex AI Session service for testing.""" - if agent_engine_id: - return VertexAiSessionService( - project='test-project', - location='test-location', - agent_engine_id=agent_engine_id, - ) return VertexAiSessionService( - project='test-project', location='test-location' + project=project, + location=location, + agent_engine_id=agent_engine_id, + express_mode_api_key=express_mode_api_key, ) @pytest.fixture -def mock_get_api_client(): +def mock_api_client_instance(): + """Creates a mock API client instance for testing.""" api_client = MockApiClient() api_client.session_dict = { '1': MOCK_SESSION_JSON_1, @@ -306,44 +383,59 @@ def mock_get_api_client(): 'page2': MOCK_SESSION_JSON_PAGE2, } api_client.event_dict = { - '1': (MOCK_EVENT_JSON, None), - '2': (MOCK_EVENT_JSON_2, 'my_token'), + '1': (copy.deepcopy(MOCK_EVENT_JSON), None), + '2': (copy.deepcopy(MOCK_EVENT_JSON_2), 'my_token'), } + return api_client + + +@pytest.fixture +def mock_get_api_client(mock_api_client_instance): + """Mocks the _get_api_client method to return a mock API client.""" with mock.patch( 'google.adk.sessions.vertex_ai_session_service.VertexAiSessionService._get_api_client', - return_value=api_client, + return_value=mock_api_client_instance, ): yield +@pytest.mark.asyncio +async def test_initialize_with_project_location_and_api_key_error(): + with pytest.raises(ValueError) as excinfo: + mock_vertex_ai_session_service( + project='test-project', + location='test-location', + express_mode_api_key='test-api-key', + ) + assert ( + 'Cannot specify project or location and express_mode_api_key. Either use' + ' project and location, or just the express_mode_api_key.' + in str(excinfo.value) + ) + + @pytest.mark.asyncio @pytest.mark.usefixtures('mock_get_api_client') @pytest.mark.parametrize('agent_engine_id', [None, '123']) async def test_get_empty_session(agent_engine_id): - if agent_engine_id: - session_service = mock_vertex_ai_session_service(agent_engine_id) - else: - session_service = mock_vertex_ai_session_service() - with pytest.raises(ValueError) as excinfo: + session_service = mock_vertex_ai_session_service(agent_engine_id) + with pytest.raises(api_core_exceptions.NotFound) as excinfo: await session_service.get_session( app_name='123', user_id='user', session_id='0' ) - assert str(excinfo.value) == 'Session not found: 0' + assert str(excinfo.value) == '404 Session not found: 0' @pytest.mark.asyncio @pytest.mark.usefixtures('mock_get_api_client') @pytest.mark.parametrize('agent_engine_id', [None, '123']) async def test_get_another_user_session(agent_engine_id): - if agent_engine_id: - session_service = mock_vertex_ai_session_service(agent_engine_id) - else: - session_service = mock_vertex_ai_session_service() + session_service = mock_vertex_ai_session_service(agent_engine_id) with pytest.raises(ValueError) as excinfo: await session_service.get_session( app_name='123', user_id='user2', session_id='1' ) - assert str(excinfo.value) == 'Session not found: 1' + assert str(excinfo.value) == 'Session 1 does not belong to user user2.' @pytest.mark.asyncio @@ -361,11 +453,11 @@ async def test_get_and_delete_session(): await session_service.delete_session( app_name='123', user_id='user', session_id='1' ) - with pytest.raises(ValueError) as excinfo: + with pytest.raises(api_core_exceptions.NotFound) as excinfo: await session_service.get_session( app_name='123', user_id='user', session_id='1' ) - assert str(excinfo.value) == 'Session not found: 1' + assert str(excinfo.value) == '404 Session not found: 1' @pytest.mark.asyncio @@ -381,6 +473,23 @@ async def test_get_session_with_page_token(): ) +@pytest.mark.asyncio +@pytest.mark.usefixtures('mock_get_api_client') +async def test_get_session_with_after_timestamp_filter(): + session_service = mock_vertex_ai_session_service() + session = await session_service.get_session( + app_name='123', + user_id='user', + session_id='2', + config=GetSessionConfig( + after_timestamp=isoparse('2024-12-12T12:12:13.0Z').timestamp() + ), + ) + assert session is not None + assert len(session.events) == 1 + assert session.events[0].id == '456' + + @pytest.mark.asyncio @pytest.mark.usefixtures('mock_get_api_client') async def test_list_sessions(): @@ -403,6 +512,15 @@ async def test_list_sessions_with_pagination(): assert sessions.sessions[1].id == 'page2' +@pytest.mark.asyncio +@pytest.mark.usefixtures('mock_get_api_client') +async def test_list_sessions_all_users(): + session_service = mock_vertex_ai_session_service() + sessions = await session_service.list_sessions(app_name='123', user_id=None) + assert len(sessions.sessions) == 5 + assert {s.id for s in sessions.sessions} == {'1', '2', '3', 'page1', 'page2'} + + @pytest.mark.asyncio @pytest.mark.usefixtures('mock_get_api_client') async def test_create_session(): @@ -435,3 +553,65 @@ async def test_create_session_with_custom_session_id(): assert str(excinfo.value) == ( 'User-provided Session id is not supported for VertexAISessionService.' ) + + +@pytest.mark.asyncio +@pytest.mark.usefixtures('mock_get_api_client') +async def test_create_session_with_custom_config(mock_api_client_instance): + session_service = mock_vertex_ai_session_service() + + expire_time = '2025-12-12T12:12:12.123456Z' + await session_service.create_session( + app_name='123', user_id='user', expire_time=expire_time + ) + assert ( + mock_api_client_instance.last_create_session_config['expire_time'] + == expire_time + ) + + +@pytest.mark.asyncio +@pytest.mark.usefixtures('mock_get_api_client') +async def test_append_event(): + session_service = mock_vertex_ai_session_service() + session_before_append = await session_service.get_session( + app_name='123', user_id='user', session_id='1' + ) + event_to_append = Event( + invocation_id='new_invocation', + author='model', + timestamp=1734005533.0, + content=genai_types.Content(parts=[genai_types.Part(text='new_content')]), + actions=EventActions( + transfer_to_agent='another_agent', + state_delta={'new_key': 'new_value'}, + skip_summarization=True, + requested_auth_configs={ + 'test_auth': AuthConfig( + auth_scheme=auth_schemes.OAuth2( + flows=openapi_models.OAuthFlows( + implicit=openapi_models.OAuthFlowImplicit( + authorizationUrl='http://test.com/auth', + scopes={}, + ) + ) + ), + ), + }, + ), + error_code='1', + error_message='test_error', + branch='test_branch', + custom_metadata={'custom': 'data'}, + long_running_tool_ids={'tool2'}, + ) + + await session_service.append_event(session_before_append, event_to_append) + + retrieved_session = await session_service.get_session( + app_name='123', user_id='user', session_id='1' + ) + + assert len(retrieved_session.events) == 2 + event_to_append.id = retrieved_session.events[1].id + assert retrieved_session.events[1] == event_to_append diff --git a/tests/unittests/streaming/test_live_streaming_configs.py b/tests/unittests/streaming/test_live_streaming_configs.py index c5b3606776..ecb253e09f 100644 --- a/tests/unittests/streaming/test_live_streaming_configs.py +++ b/tests/unittests/streaming/test_live_streaming_configs.py @@ -586,3 +586,59 @@ def test_streaming_with_session_resumption_config(): llm_request_sent_to_mock.live_connect_config.session_resumption.transparent is True ) + + +def test_streaming_with_context_window_compression_config(): + """Test streaming with context window compression config.""" + response = LlmResponse(turn_complete=True) + + mock_model = testing_utils.MockModel.create([response]) + + root_agent = Agent( + name='root_agent', + model=mock_model, + tools=[], + ) + + runner = testing_utils.InMemoryRunner( + root_agent=root_agent, response_modalities=['AUDIO'] + ) + + # Create run config with context window compression + run_config = RunConfig( + context_window_compression=types.ContextWindowCompressionConfig( + trigger_tokens=1000, + sliding_window=types.SlidingWindow(target_tokens=500), + ) + ) + + live_request_queue = LiveRequestQueue() + live_request_queue.send_realtime( + blob=types.Blob(data=b'\x00\xFF', mime_type='audio/pcm') + ) + + res_events = runner.run_live(live_request_queue, run_config) + + assert res_events is not None, 'Expected a list of events, got None.' + assert ( + len(res_events) > 0 + ), 'Expected at least one response, but got an empty list.' + assert len(mock_model.requests) == 1 + + # Get the request that was captured + llm_request_sent_to_mock = mock_model.requests[0] + + # Assert that the request contained the correct configuration + assert llm_request_sent_to_mock.live_connect_config is not None + assert ( + llm_request_sent_to_mock.live_connect_config.context_window_compression + is not None + ) + assert ( + llm_request_sent_to_mock.live_connect_config.context_window_compression.trigger_tokens + == 1000 + ) + assert ( + llm_request_sent_to_mock.live_connect_config.context_window_compression.sliding_window.target_tokens + == 500 + ) diff --git a/tests/unittests/telemetry/test_functional.py b/tests/unittests/telemetry/test_functional.py index 54db282a6c..f3b29c54fe 100644 --- a/tests/unittests/telemetry/test_functional.py +++ b/tests/unittests/telemetry/test_functional.py @@ -12,18 +12,22 @@ # See the License for the specific language governing permissions and # limitations under the License. +import asyncio import gc import sys -from unittest import mock -from google.adk import telemetry from google.adk.agents import base_agent from google.adk.agents.llm_agent import Agent from google.adk.models.base_llm import BaseLlm +from google.adk.models.llm_response import LlmResponse +from google.adk.telemetry import tracing from google.adk.tools import FunctionTool from google.adk.utils.context_utils import Aclosing +from google.genai.types import Content from google.genai.types import Part -from opentelemetry.version import __version__ +from opentelemetry.sdk.trace import TracerProvider +from opentelemetry.sdk.trace.export import SimpleSpanProcessor +from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter import pytest from ..testing_utils import MockModel @@ -63,27 +67,27 @@ async def test_runner(test_agent: Agent) -> TestInMemoryRunner: @pytest.fixture -def mock_start_as_current_span(monkeypatch: pytest.MonkeyPatch) -> mock.Mock: - mock_context_manager = mock.MagicMock() - mock_context_manager.__enter__.return_value = mock.Mock() - mock_start_as_current_span = mock.Mock() - mock_start_as_current_span.return_value = mock_context_manager +def span_exporter(monkeypatch: pytest.MonkeyPatch) -> InMemorySpanExporter: + tracer_provider = TracerProvider() + span_exporter = InMemorySpanExporter() + tracer_provider.add_span_processor(SimpleSpanProcessor(span_exporter)) + real_tracer = tracer_provider.get_tracer(__name__) def do_replace(tracer): monkeypatch.setattr( - tracer, 'start_as_current_span', mock_start_as_current_span + tracer, 'start_as_current_span', real_tracer.start_as_current_span ) - do_replace(telemetry.tracer) + do_replace(tracing.tracer) do_replace(base_agent.tracer) - return mock_start_as_current_span + return span_exporter @pytest.mark.asyncio async def test_tracer_start_as_current_span( test_runner: TestInMemoryRunner, - mock_start_as_current_span: mock.Mock, + span_exporter: InMemorySpanExporter, ): """Test creation of multiple spans in an E2E runner invocation. @@ -112,18 +116,49 @@ def wrapped_firstiter(coro): pass # Assert - expected_start_as_current_span_calls = [ - mock.call('invocation'), - mock.call('execute_tool some_tool'), - mock.call('agent_run [some_root_agent]'), - mock.call('call_llm'), - mock.call('call_llm'), + spans = span_exporter.get_finished_spans() + assert list(sorted(span.name for span in spans)) == [ + 'call_llm', + 'call_llm', + 'execute_tool some_tool', + 'invocation', + 'invoke_agent some_root_agent', ] - mock_start_as_current_span.assert_has_calls( - expected_start_as_current_span_calls, - any_order=True, + +@pytest.mark.asyncio +async def test_exception_preserves_attributes( + test_model: BaseLlm, span_exporter: InMemorySpanExporter +): + """Test when an exception occurs during tool execution, span attributes are still present on spans where they are expected.""" + + # Arrange + async def some_tool(): + raise ValueError('This tool always fails') + + test_agent = Agent( + name='some_root_agent', + model=test_model, + tools=[ + FunctionTool(some_tool), + ], ) - assert mock_start_as_current_span.call_count == len( - expected_start_as_current_span_calls + + test_runner = TestInMemoryRunner(test_agent) + + # Act + with pytest.raises(ValueError, match='This tool always fails'): + async with Aclosing( + test_runner.run_async_with_new_session_agen('') + ) as agen: + async for _ in agen: + pass + + # Assert + spans = span_exporter.get_finished_spans() + assert len(spans) > 1 + assert all( + span.attributes is not None and len(span.attributes) > 0 + for span in spans + if span.name != 'invocation' # not expected to have attributes ) diff --git a/tests/unittests/telemetry/test_google_cloud.py b/tests/unittests/telemetry/test_google_cloud.py new file mode 100644 index 0000000000..318be63041 --- /dev/null +++ b/tests/unittests/telemetry/test_google_cloud.py @@ -0,0 +1,91 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +from typing import Optional +from unittest import mock + +from google.adk.telemetry.google_cloud import get_gcp_exporters +from google.adk.telemetry.google_cloud import get_gcp_resource +import pytest + + +@pytest.mark.parametrize("enable_cloud_tracing", [True, False]) +@pytest.mark.parametrize("enable_cloud_metrics", [True, False]) +@pytest.mark.parametrize("enable_cloud_logging", [True, False]) +def test_get_gcp_exporters( + enable_cloud_tracing: bool, + enable_cloud_metrics: bool, + enable_cloud_logging: bool, + monkeypatch: pytest.MonkeyPatch, +): + """ + Test initializing correct providers in setup_otel + when enabling telemetry via Google O11y. + """ + # Arrange. + # Mocking google.auth.default to improve the test time. + auth_mock = mock.MagicMock() + auth_mock.return_value = ("", "project-id") + monkeypatch.setattr( + "google.auth.default", + auth_mock, + ) + + # Act. + otel_hooks = get_gcp_exporters( + enable_cloud_tracing=enable_cloud_tracing, + enable_cloud_metrics=enable_cloud_metrics, + enable_cloud_logging=enable_cloud_logging, + ) + + # Assert. + # If given telemetry type was enabled, + # the corresponding provider should be set. + assert len(otel_hooks.span_processors) == (1 if enable_cloud_tracing else 0) + assert len(otel_hooks.metric_readers) == (1 if enable_cloud_metrics else 0) + assert len(otel_hooks.log_record_processors) == ( + 1 if enable_cloud_logging else 0 + ) + + +@pytest.mark.parametrize("project_id_in_arg", ["project_id_in_arg", None]) +@pytest.mark.parametrize("project_id_on_env", ["project_id_on_env", None]) +def test_get_gcp_resource( + project_id_in_arg: Optional[str], + project_id_on_env: Optional[str], + monkeypatch: pytest.MonkeyPatch, +): + # Arrange. + if project_id_on_env is not None: + monkeypatch.setenv( + "OTEL_RESOURCE_ATTRIBUTES", f"gcp.project_id={project_id_on_env}" + ) + + # Act. + otel_resource = get_gcp_resource(project_id_in_arg) + + # Assert. + expected_project_id = ( + project_id_on_env + if project_id_on_env is not None + else project_id_in_arg + if project_id_in_arg is not None + else None + ) + assert otel_resource is not None + assert ( + otel_resource.attributes.get("gcp.project_id", None) + == expected_project_id + ) diff --git a/tests/unittests/telemetry/test_setup.py b/tests/unittests/telemetry/test_setup.py new file mode 100644 index 0000000000..a7e54d2578 --- /dev/null +++ b/tests/unittests/telemetry/test_setup.py @@ -0,0 +1,107 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +from unittest import mock + +from google.adk.telemetry.setup import maybe_set_otel_providers +import pytest + + +@pytest.fixture +def mock_os_environ(): + initial_env = os.environ.copy() + with mock.patch.dict(os.environ, initial_env, clear=False) as m: + yield m + + +@pytest.mark.parametrize( + "env_vars, should_setup_trace, should_setup_metrics, should_setup_logs", + [ + ( + {"OTEL_EXPORTER_OTLP_TRACES_ENDPOINT": "some-endpoint"}, + True, + False, + False, + ), + ( + {"OTEL_EXPORTER_OTLP_METRICS_ENDPOINT": "some-endpoint"}, + False, + True, + False, + ), + ( + {"OTEL_EXPORTER_OTLP_LOGS_ENDPOINT": "some-endpoint"}, + False, + False, + True, + ), + ( + { + "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT": "some-endpoint", + "OTEL_EXPORTER_OTLP_METRICS_ENDPOINT": "some-endpoint", + "OTEL_EXPORTER_OTLP_LOGS_ENDPOINT": "some-endpoint", + }, + True, + True, + True, + ), + ( + {"OTEL_EXPORTER_OTLP_ENDPOINT": "some-endpoint"}, + True, + True, + True, + ), + ], +) +def test_maybe_set_otel_providers( + env_vars: dict[str, str], + should_setup_trace: bool, + should_setup_metrics: bool, + should_setup_logs: bool, + monkeypatch: pytest.MonkeyPatch, + mock_os_environ, # pylint: disable=unused-argument,redefined-outer-name +): + """ + Test initializing correct providers in setup_otel + when providing OTel env variables. + """ + # Arrange. + for k, v in env_vars.items(): + os.environ[k] = v + trace_provider_mock = mock.MagicMock() + monkeypatch.setattr( + "opentelemetry.trace.set_tracer_provider", + trace_provider_mock, + ) + meter_provider_mock = mock.MagicMock() + monkeypatch.setattr( + "opentelemetry.metrics.set_meter_provider", + meter_provider_mock, + ) + logs_provider_mock = mock.MagicMock() + monkeypatch.setattr( + "opentelemetry._logs.set_logger_provider", + logs_provider_mock, + ) + + # Act. + maybe_set_otel_providers() + + # Assert. + # If given telemetry type was enabled, + # the corresponding provider should be set. + assert trace_provider_mock.call_count == (1 if should_setup_trace else 0) + assert meter_provider_mock.call_count == (1 if should_setup_metrics else 0) + assert logs_provider_mock.call_count == (1 if should_setup_logs else 0) diff --git a/tests/unittests/telemetry/test_spans.py b/tests/unittests/telemetry/test_spans.py index dedeefe74b..38a8358f59 100644 --- a/tests/unittests/telemetry/test_spans.py +++ b/tests/unittests/telemetry/test_spans.py @@ -13,6 +13,7 @@ # limitations under the License. import json +import os from typing import Any from typing import Dict from typing import Optional @@ -23,9 +24,11 @@ from google.adk.models.llm_request import LlmRequest from google.adk.models.llm_response import LlmResponse from google.adk.sessions.in_memory_session_service import InMemorySessionService -from google.adk.telemetry import trace_call_llm -from google.adk.telemetry import trace_merged_tool_calls -from google.adk.telemetry import trace_tool_call +from google.adk.telemetry.tracing import ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS +from google.adk.telemetry.tracing import trace_agent_invocation +from google.adk.telemetry.tracing import trace_call_llm +from google.adk.telemetry.tracing import trace_merged_tool_calls +from google.adk.telemetry.tracing import trace_tool_call from google.adk.tools.base_tool import BaseTool from google.genai import types import pytest @@ -80,6 +83,30 @@ async def _create_invocation_context( return invocation_context +@pytest.mark.asyncio +async def test_trace_agent_invocation(mock_span_fixture): + """Test trace_agent_invocation sets span attributes correctly.""" + agent = LlmAgent(name='test_llm_agent', model='gemini-pro') + agent.description = 'Test agent description' + invocation_context = await _create_invocation_context(agent) + + trace_agent_invocation(mock_span_fixture, agent, invocation_context) + + expected_calls = [ + mock.call('gen_ai.operation.name', 'invoke_agent'), + mock.call('gen_ai.agent.description', agent.description), + mock.call('gen_ai.agent.name', agent.name), + mock.call( + 'gen_ai.conversation.id', + invocation_context.session.id, + ), + ] + mock_span_fixture.set_attribute.assert_has_calls( + expected_calls, any_order=True + ) + assert mock_span_fixture.set_attribute.call_count == len(expected_calls) + + @pytest.mark.asyncio async def test_trace_call_llm(monkeypatch, mock_span_fixture): """Test trace_call_llm sets all telemetry attributes correctly with normal content.""" @@ -90,6 +117,7 @@ async def test_trace_call_llm(monkeypatch, mock_span_fixture): agent = LlmAgent(name='test_agent') invocation_context = await _create_invocation_context(agent) llm_request = LlmRequest( + model='gemini-pro', contents=[ types.Content( role='user', @@ -97,7 +125,6 @@ async def test_trace_call_llm(monkeypatch, mock_span_fixture): ), ], config=types.GenerateContentConfig( - system_instruction='You are a helpful assistant.', top_p=0.95, max_output_tokens=1024, ), @@ -117,6 +144,7 @@ async def test_trace_call_llm(monkeypatch, mock_span_fixture): mock.call('gen_ai.system', 'gcp.vertex.agent'), mock.call('gen_ai.request.top_p', 0.95), mock.call('gen_ai.request.max_tokens', 1024), + mock.call('gcp.vertex.agent.llm_response', mock.ANY), mock.call('gen_ai.usage.input_tokens', 50), mock.call('gen_ai.usage.output_tokens', 50), mock.call('gen_ai.response.finish_reasons', ['stop']), @@ -139,6 +167,7 @@ async def test_trace_call_llm_with_binary_content( agent = LlmAgent(name='test_agent') invocation_context = await _create_invocation_context(agent) llm_request = LlmRequest( + model='gemini-pro', contents=[ types.Content( role='user', @@ -166,7 +195,7 @@ async def test_trace_call_llm_with_binary_content( ], ), ], - config=types.GenerateContentConfig(system_instruction=''), + config=types.GenerateContentConfig(), ) llm_response = LlmResponse(turn_complete=True) trace_call_llm(invocation_context, 'test_event_id', llm_request, llm_response) @@ -228,12 +257,11 @@ def test_trace_tool_call_with_scalar_response( ) # Assert - assert mock_span_fixture.set_attribute.call_count == 10 expected_calls = [ - mock.call('gen_ai.system', 'gcp.vertex.agent'), mock.call('gen_ai.operation.name', 'execute_tool'), mock.call('gen_ai.tool.name', mock_tool_fixture.name), mock.call('gen_ai.tool.description', mock_tool_fixture.description), + mock.call('gen_ai.tool.type', 'BaseTool'), mock.call('gen_ai.tool.call.id', test_tool_call_id), mock.call('gcp.vertex.agent.tool_call_args', json.dumps(test_args)), mock.call('gcp.vertex.agent.event_id', test_event_id), @@ -245,6 +273,7 @@ def test_trace_tool_call_with_scalar_response( mock.call('gcp.vertex.agent.llm_response', '{}'), ] + assert mock_span_fixture.set_attribute.call_count == len(expected_calls) mock_span_fixture.set_attribute.assert_has_calls( expected_calls, any_order=True ) @@ -289,10 +318,10 @@ def test_trace_tool_call_with_dict_response( # Assert expected_calls = [ - mock.call('gen_ai.system', 'gcp.vertex.agent'), mock.call('gen_ai.operation.name', 'execute_tool'), mock.call('gen_ai.tool.name', mock_tool_fixture.name), mock.call('gen_ai.tool.description', mock_tool_fixture.description), + mock.call('gen_ai.tool.type', 'BaseTool'), mock.call('gen_ai.tool.call.id', test_tool_call_id), mock.call('gcp.vertex.agent.tool_call_args', json.dumps(test_args)), mock.call('gcp.vertex.agent.event_id', test_event_id), @@ -303,7 +332,7 @@ def test_trace_tool_call_with_dict_response( mock.call('gcp.vertex.agent.llm_response', '{}'), ] - assert mock_span_fixture.set_attribute.call_count == 10 + assert mock_span_fixture.set_attribute.call_count == len(expected_calls) mock_span_fixture.set_attribute.assert_has_calls( expected_calls, any_order=True ) @@ -328,7 +357,6 @@ def test_trace_merged_tool_calls_sets_correct_attributes( ) expected_calls = [ - mock.call('gen_ai.system', 'gcp.vertex.agent'), mock.call('gen_ai.operation.name', 'execute_tool'), mock.call('gen_ai.tool.name', '(merged tools)'), mock.call('gen_ai.tool.description', '(merged tools)'), @@ -340,8 +368,152 @@ def test_trace_merged_tool_calls_sets_correct_attributes( mock.call('gcp.vertex.agent.llm_response', '{}'), ] - assert mock_span_fixture.set_attribute.call_count == 10 + assert mock_span_fixture.set_attribute.call_count == len(expected_calls) mock_span_fixture.set_attribute.assert_has_calls( expected_calls, any_order=True ) mock_event_fixture.model_dumps_json.assert_called_once_with(exclude_none=True) + + +@pytest.mark.asyncio +async def test_call_llm_disabling_request_response_content( + monkeypatch, mock_span_fixture +): + """Test trace_call_llm doesn't set request and response attributes if env is set to false""" + # Arrange + monkeypatch.setenv(ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS, 'false') + monkeypatch.setattr( + 'opentelemetry.trace.get_current_span', lambda: mock_span_fixture + ) + + agent = LlmAgent(name='test_agent') + invocation_context = await _create_invocation_context(agent) + llm_request = LlmRequest( + model='gemini-pro', + contents=[ + types.Content( + role='user', + parts=[types.Part(text='Hello, how are you?')], + ), + ], + ) + llm_response = LlmResponse( + turn_complete=True, + finish_reason=types.FinishReason.STOP, + ) + + # Act + trace_call_llm(invocation_context, 'test_event_id', llm_request, llm_response) + + # Assert + assert not any( + call_obj.args[0] == 'gcp.vertex.agent.llm_request' + and call_obj.args[1] != {} + for call_obj in mock_span_fixture.set_attribute.call_args_list + ), "Attribute 'gcp.vertex.agent.llm_request' was incorrectly set on the span." + + assert not any( + call_obj.args[0] == 'gcp.vertex.agent.llm_response' + and call_obj.args[1] != {} + for call_obj in mock_span_fixture.set_attribute.call_args_list + ), ( + "Attribute 'gcp.vertex.agent.llm_response' was incorrectly set on the" + ' span.' + ) + + +def test_trace_tool_call_disabling_request_response_content( + monkeypatch, + mock_span_fixture, + mock_tool_fixture, + mock_event_fixture, +): + """Test trace_tool_call doesn't set request and response attributes if env is set to false""" + # Arrange + monkeypatch.setenv(ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS, 'false') + monkeypatch.setattr( + 'opentelemetry.trace.get_current_span', lambda: mock_span_fixture + ) + + test_args: Dict[str, Any] = {'query': 'details', 'id_list': [1, 2, 3]} + test_tool_call_id: str = 'tool_call_id_002' + test_event_id: str = 'event_id_dict_002' + dict_function_response: Dict[str, Any] = { + 'data': 'structured_data', + 'count': 5, + } + + mock_event_fixture.id = test_event_id + mock_event_fixture.content = types.Content( + role='user', + parts=[ + types.Part( + function_response=types.FunctionResponse( + id=test_tool_call_id, + name='test_function_1', + response=dict_function_response, + ) + ), + ], + ) + + # Act + trace_tool_call( + tool=mock_tool_fixture, + args=test_args, + function_response_event=mock_event_fixture, + ) + + # Assert + assert not any( + call_obj.args[0] == 'gcp.vertex.agent.tool_call_args' + and call_obj.args[1] != {} + for call_obj in mock_span_fixture.set_attribute.call_args_list + ), ( + "Attribute 'gcp.vertex.agent.tool_call_args' was incorrectly set on the" + ' span.' + ) + + assert not any( + call_obj.args[0] == 'gcp.vertex.agent.tool_response' + and call_obj.args[1] != {} + for call_obj in mock_span_fixture.set_attribute.call_args_list + ), ( + "Attribute 'gcp.vertex.agent.tool_response' was incorrectly set on the" + ' span.' + ) + + +def test_trace_merged_tool_disabling_request_response_content( + monkeypatch, + mock_span_fixture, + mock_event_fixture, +): + """Test trace_merged_tool doesn't set request and response attributes if env is set to false""" + # Arrange + monkeypatch.setenv(ADK_CAPTURE_MESSAGE_CONTENT_IN_SPANS, 'false') + monkeypatch.setattr( + 'opentelemetry.trace.get_current_span', lambda: mock_span_fixture + ) + + test_response_event_id = 'merged_evt_id_001' + custom_event_json_output = ( + '{"custom_event_payload": true, "details": "merged_details"}' + ) + mock_event_fixture.model_dumps_json.return_value = custom_event_json_output + + # Act + trace_merged_tool_calls( + response_event_id=test_response_event_id, + function_response_event=mock_event_fixture, + ) + + # Assert + assert not any( + call_obj.args[0] == 'gcp.vertex.agent.tool_response' + and call_obj.args[1] != {} + for call_obj in mock_span_fixture.set_attribute.call_args_list + ), ( + "Attribute 'gcp.vertex.agent.tool_response' was incorrectly set on the" + ' span.' + ) diff --git a/tests/unittests/test_runners.py b/tests/unittests/test_runners.py index 01b86ae98f..d78061ddf2 100644 --- a/tests/unittests/test_runners.py +++ b/tests/unittests/test_runners.py @@ -12,13 +12,18 @@ # See the License for the specific language governing permissions and # limitations under the License. +from pathlib import Path +import textwrap from typing import Optional from google.adk.agents.base_agent import BaseAgent +from google.adk.agents.context_cache_config import ContextCacheConfig from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.llm_agent import LlmAgent from google.adk.apps.app import App +from google.adk.apps.app import ResumabilityConfig from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService +from google.adk.cli.utils.agent_loader import AgentLoader from google.adk.events.event import Event from google.adk.plugins.base_plugin import BasePlugin from google.adk.runners import Runner @@ -156,6 +161,120 @@ def setup_method(self): artifact_service=self.artifact_service, ) + +@pytest.mark.asyncio +async def test_session_not_found_message_includes_alignment_hint(): + + class RunnerWithMismatch(Runner): + + def _infer_agent_origin( + self, agent: BaseAgent + ) -> tuple[Optional[str], Optional[Path]]: + del agent + return "expected_app", Path("/workspace/agents/expected_app") + + session_service = InMemorySessionService() + runner = RunnerWithMismatch( + app_name="configured_app", + agent=MockLlmAgent("root_agent"), + session_service=session_service, + artifact_service=InMemoryArtifactService(), + ) + + agen = runner.run_async( + user_id="user", + session_id="missing", + new_message=types.Content(role="user", parts=[]), + ) + + with pytest.raises(ValueError) as excinfo: + await agen.__anext__() + + await agen.aclose() + + message = str(excinfo.value) + assert "Session not found" in message + assert "configured_app" in message + assert "expected_app" in message + assert "Ensure the runner app_name matches" in message + + +@pytest.mark.asyncio +async def test_runner_allows_nested_agent_directories(tmp_path, monkeypatch): + project_root = tmp_path / "workspace" + agent_dir = project_root / "agents" / "examples" / "001_hello_world" + agent_dir.mkdir(parents=True) + # Make package structure importable. + for pkg_dir in [ + project_root / "agents", + project_root / "agents" / "examples", + agent_dir, + ]: + (pkg_dir / "__init__.py").write_text("", encoding="utf-8") + # Extra directories that previously confused origin inference, e.g. virtualenv. + (project_root / "agents" / ".venv").mkdir() + + agent_source = textwrap.dedent("""\ + from google.adk.events.event import Event + from google.adk.agents.base_agent import BaseAgent + from google.genai import types + + + class SimpleAgent(BaseAgent): + + def __init__(self): + super().__init__(name='simplest_agent', sub_agents=[]) + + async def _run_async_impl(self, invocation_context): + yield Event( + invocation_id=invocation_context.invocation_id, + author=self.name, + content=types.Content( + role='model', + parts=[types.Part(text='hello from nested')], + ), + ) + + + root_agent = SimpleAgent() + """) + (agent_dir / "agent.py").write_text(agent_source, encoding="utf-8") + + monkeypatch.chdir(project_root) + loader = AgentLoader(agents_dir="agents/examples") + loaded_agent = loader.load_agent("001_hello_world") + + assert isinstance(loaded_agent, BaseAgent) + session_service = InMemorySessionService() + artifact_service = InMemoryArtifactService() + runner = Runner( + app_name="001_hello_world", + agent=loaded_agent, + session_service=session_service, + artifact_service=artifact_service, + ) + assert runner._app_name_alignment_hint is None + + session = await session_service.create_session( + app_name="001_hello_world", + user_id="user", + ) + agen = runner.run_async( + user_id=session.user_id, + session_id=session.id, + new_message=types.Content( + role="user", + parts=[types.Part(text="hi")], + ), + ) + event = await agen.__anext__() + await agen.aclose() + + assert event.author == "simplest_agent" + assert event.content + assert event.content.parts + assert event.content.parts[0].text == "hello from nested" + def test_find_agent_to_run_with_function_response_scenario(self): """Test finding agent when last event is function response.""" # Create a function call from sub_agent1 @@ -467,5 +586,194 @@ def test_runner_init_raises_error_without_app_and_agent(self): ) +class TestRunnerCacheConfig: + """Tests for Runner cache config extraction and handling.""" + + def setup_method(self): + """Set up test fixtures.""" + self.session_service = InMemorySessionService() + self.artifact_service = InMemoryArtifactService() + self.root_agent = MockLlmAgent("root_agent") + + def test_runner_extracts_cache_config_from_app(self): + """Test that Runner extracts cache config from App.""" + cache_config = ContextCacheConfig( + cache_intervals=15, ttl_seconds=3600, min_tokens=1024 + ) + + app = App( + name="test_app", + root_agent=self.root_agent, + context_cache_config=cache_config, + ) + + runner = Runner( + app=app, + session_service=self.session_service, + artifact_service=self.artifact_service, + ) + + assert runner.context_cache_config == cache_config + assert runner.context_cache_config.cache_intervals == 15 + assert runner.context_cache_config.ttl_seconds == 3600 + assert runner.context_cache_config.min_tokens == 1024 + + def test_runner_with_app_without_cache_config(self): + """Test Runner with App that has no cache config.""" + app = App( + name="test_app", root_agent=self.root_agent, context_cache_config=None + ) + + runner = Runner( + app=app, + session_service=self.session_service, + artifact_service=self.artifact_service, + ) + + assert runner.context_cache_config is None + + def test_runner_without_app_has_no_cache_config(self): + """Test Runner created without App has no cache config.""" + runner = Runner( + app_name="test_app", + agent=self.root_agent, + session_service=self.session_service, + artifact_service=self.artifact_service, + ) + + assert runner.context_cache_config is None + + def test_runner_cache_config_passed_to_invocation_context(self): + """Test that cache config is passed to InvocationContext.""" + cache_config = ContextCacheConfig( + cache_intervals=20, ttl_seconds=7200, min_tokens=2048 + ) + + app = App( + name="test_app", + root_agent=self.root_agent, + context_cache_config=cache_config, + ) + + runner = Runner( + app=app, + session_service=self.session_service, + artifact_service=self.artifact_service, + ) + + # Create a mock session + mock_session = Session( + id=TEST_SESSION_ID, + app_name=TEST_APP_ID, + user_id=TEST_USER_ID, + events=[], + ) + + # Create invocation context using runner's method + invocation_context = runner._new_invocation_context(mock_session) + + assert invocation_context.context_cache_config == cache_config + assert invocation_context.context_cache_config.cache_intervals == 20 + + def test_runner_validate_params_return_order(self): + """Test that _validate_runner_params returns values in correct order.""" + cache_config = ContextCacheConfig(cache_intervals=25) + + app = App( + name="order_test_app", + root_agent=self.root_agent, + context_cache_config=cache_config, + resumability_config=ResumabilityConfig(is_resumable=True), + ) + + runner = Runner( + app=app, + session_service=self.session_service, + artifact_service=self.artifact_service, + ) + + # Test the validation method directly + app_name, agent, context_cache_config, resumability_config, plugins = ( + runner._validate_runner_params(app, None, None, None) + ) + + assert app_name == "order_test_app" + assert agent == self.root_agent + assert context_cache_config == cache_config + assert context_cache_config.cache_intervals == 25 + assert resumability_config == app.resumability_config + assert plugins == [] + + def test_runner_validate_params_without_app(self): + """Test _validate_runner_params without App returns None for cache config.""" + runner = Runner( + app_name="test_app", + agent=self.root_agent, + session_service=self.session_service, + artifact_service=self.artifact_service, + ) + + app_name, agent, context_cache_config, resumability_config, plugins = ( + runner._validate_runner_params(None, "test_app", self.root_agent, None) + ) + + assert app_name == "test_app" + assert agent == self.root_agent + assert context_cache_config is None + assert resumability_config is None + assert plugins is None + + def test_runner_app_name_and_agent_extracted_correctly(self): + """Test that app_name and agent are correctly extracted from App.""" + cache_config = ContextCacheConfig() + + app = App( + name="extracted_app", + root_agent=self.root_agent, + context_cache_config=cache_config, + ) + + runner = Runner( + app=app, + session_service=self.session_service, + artifact_service=self.artifact_service, + ) + + assert runner.app_name == "extracted_app" + assert runner.agent == self.root_agent + assert runner.context_cache_config == cache_config + + def test_runner_realistic_cache_config_scenario(self): + """Test realistic scenario with production-like cache config.""" + # Production cache config + production_cache_config = ContextCacheConfig( + cache_intervals=30, ttl_seconds=14400, min_tokens=4096 # 4 hours + ) + + app = App( + name="production_app", + root_agent=self.root_agent, + context_cache_config=production_cache_config, + ) + + runner = Runner( + app=app, + session_service=self.session_service, + artifact_service=self.artifact_service, + ) + + # Verify all settings are preserved + assert runner.context_cache_config.cache_intervals == 30 + assert runner.context_cache_config.ttl_seconds == 14400 + assert runner.context_cache_config.ttl_string == "14400s" + assert runner.context_cache_config.min_tokens == 4096 + + # Verify string representation + expected_str = ( + "ContextCacheConfig(cache_intervals=30, ttl=14400s, min_tokens=4096)" + ) + assert str(runner.context_cache_config) == expected_str + + if __name__ == "__main__": pytest.main([__file__]) diff --git a/tests/unittests/testing_utils.py b/tests/unittests/testing_utils.py index 0cc637871b..950e70b94c 100644 --- a/tests/unittests/testing_utils.py +++ b/tests/unittests/testing_utils.py @@ -16,6 +16,7 @@ import contextlib from typing import AsyncGenerator from typing import Generator +from typing import Optional from typing import Union from google.adk.agents.invocation_context import InvocationContext @@ -23,6 +24,7 @@ from google.adk.agents.llm_agent import Agent from google.adk.agents.llm_agent import LlmAgent from google.adk.agents.run_config import RunConfig +from google.adk.apps.app import App from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService from google.adk.events.event import Event from google.adk.memory.in_memory_memory_service import InMemoryMemoryService @@ -119,7 +121,32 @@ def append_user_content( # Extracts the contents from the events and transform them into a list of # (author, simplified_content) tuples. def simplify_events(events: list[Event]) -> list[(str, types.Part)]: - return [(event.author, simplify_content(event.content)) for event in events] + return [ + (event.author, simplify_content(event.content)) + for event in events + if event.content + ] + + +END_OF_AGENT = 'end_of_agent' + + +# Extracts the contents from the events and transform them into a list of +# (author, simplified_content OR AgentState OR "end_of_agent") tuples. +# +# Could be used to compare events for testing resumability. +def simplify_resumable_app_events( + events: list[Event], +) -> list[(str, Union[types.Part, str])]: + results = [] + for event in events: + if event.content: + results.append((event.author, simplify_content(event.content))) + elif event.actions.end_of_agent: + results.append((event.author, END_OF_AGENT)) + elif event.actions.agent_state is not None: + results.append((event.author, event.actions.agent_state)) + return results # Simplifies the contents into a list of (author, simplified_content) tuples. @@ -189,31 +216,52 @@ class InMemoryRunner: def __init__( self, - root_agent: Union[Agent, LlmAgent], + root_agent: Optional[Union[Agent, LlmAgent]] = None, response_modalities: list[str] = None, plugins: list[BasePlugin] = [], + app: Optional[App] = None, ): - self.root_agent = root_agent - self.runner = Runner( - app_name='test_app', - agent=root_agent, - artifact_service=InMemoryArtifactService(), - session_service=InMemorySessionService(), - memory_service=InMemoryMemoryService(), - plugins=plugins, - ) + """Initializes the InMemoryRunner. + + Args: + root_agent: The root agent to run, won't be used if app is provided. + response_modalities: The response modalities of the runner. + plugins: The plugins to use in the runner, won't be used if app is + provided. + app: The app to use in the runner. + """ + if not app: + self.app_name = 'test_app' + self.root_agent = root_agent + self.runner = Runner( + app_name='test_app', + agent=root_agent, + artifact_service=InMemoryArtifactService(), + session_service=InMemorySessionService(), + memory_service=InMemoryMemoryService(), + plugins=plugins, + ) + else: + self.app_name = app.name + self.root_agent = app.root_agent + self.runner = Runner( + app=app, + artifact_service=InMemoryArtifactService(), + session_service=InMemorySessionService(), + memory_service=InMemoryMemoryService(), + ) self.session_id = None @property def session(self) -> Session: if not self.session_id: session = self.runner.session_service.create_session_sync( - app_name='test_app', user_id='test_user' + app_name=self.app_name, user_id='test_user' ) self.session_id = session.id return session return self.runner.session_service.get_session_sync( - app_name='test_app', user_id='test_user', session_id=self.session_id + app_name=self.app_name, user_id='test_user', session_id=self.session_id ) def run(self, new_message: types.ContentUnion) -> list[Event]: @@ -225,12 +273,17 @@ def run(self, new_message: types.ContentUnion) -> list[Event]: ) ) - async def run_async(self, new_message: types.ContentUnion) -> list[Event]: + async def run_async( + self, + new_message: Optional[types.ContentUnion] = None, + invocation_id: Optional[str] = None, + ) -> list[Event]: events = [] async for event in self.runner.run_async( user_id=self.session.user_id, session_id=self.session.id, - new_message=get_user_content(new_message), + invocation_id=invocation_id, + new_message=get_user_content(new_message) if new_message else None, ): events.append(event) return events diff --git a/tests/unittests/tools/bigquery/test_bigquery_client.py b/tests/unittests/tools/bigquery/test_bigquery_client.py index 6decb6eb5f..15e2decde1 100644 --- a/tests/unittests/tools/bigquery/test_bigquery_client.py +++ b/tests/unittests/tools/bigquery/test_bigquery_client.py @@ -23,8 +23,8 @@ from google.oauth2.credentials import Credentials -def test_bigquery_client_project(): - """Test BigQuery client project.""" +def test_bigquery_client_default(): + """Test the default BigQuery client properties.""" # Trigger the BigQuery client creation client = get_bigquery_client( project="test-gcp-project", @@ -33,6 +33,7 @@ def test_bigquery_client_project(): # Verify that the client has the desired project set assert client.project == "test-gcp-project" + assert client.location is None def test_bigquery_client_project_set_explicit(): @@ -153,3 +154,17 @@ def test_bigquery_client_user_agent_custom(): } actual_user_agents = set(client_info_arg.user_agent.split()) assert expected_user_agents.issubset(actual_user_agents) + + +def test_bigquery_client_location_custom(): + """Test BigQuery client custom location.""" + # Trigger the BigQuery client creation + client = get_bigquery_client( + project="test-gcp-project", + credentials=mock.create_autospec(Credentials, instance=True), + location="us-central1", + ) + + # Verify that the client has the desired project set + assert client.project == "test-gcp-project" + assert client.location == "us-central1" diff --git a/tests/unittests/tools/bigquery/test_bigquery_metadata_tool.py b/tests/unittests/tools/bigquery/test_bigquery_metadata_tool.py index 9de1654b1a..5da01893eb 100644 --- a/tests/unittests/tools/bigquery/test_bigquery_metadata_tool.py +++ b/tests/unittests/tools/bigquery/test_bigquery_metadata_tool.py @@ -136,6 +136,36 @@ def test_get_table_info_no_default_auth(mock_default_auth, mock_get_table): mock_default_auth.assert_not_called() +@mock.patch.dict(os.environ, {}, clear=True) +@mock.patch("google.cloud.bigquery.Client.get_job", autospec=True) +@mock.patch("google.auth.default", autospec=True) +def test_get_job_info_no_default_auth(mock_default_auth, mock_get_job): + """Test get_job_info tool invocation involves no default auth.""" + mock_credentials = mock.create_autospec(Credentials, instance=True) + tool_settings = BigQueryToolConfig() + + # Simulate the behavior of default auth - on purpose throw exception when + # the default auth is called + mock_default_auth.side_effect = DefaultCredentialsError( + "Your default credentials were not found" + ) + + mock_get_job.return_value = mock.create_autospec( + bigquery.QueryJob, instance=True + ) + result = metadata_tool.get_job_info( + "my_project_id", + "my_job_id", + mock_credentials, + tool_settings, + ) + assert result != { + "status": "ERROR", + "error_details": "Your default credentials were not found", + } + mock_default_auth.assert_not_called() + + @mock.patch( "google.adk.tools.bigquery.client.get_bigquery_client", autospec=True ) @@ -148,7 +178,7 @@ def test_list_dataset_ids_bq_client_creation(mock_get_bigquery_client): metadata_tool.list_dataset_ids(bq_project, bq_credentials, tool_settings) mock_get_bigquery_client.assert_called_once() - assert len(mock_get_bigquery_client.call_args.kwargs) == 3 + assert len(mock_get_bigquery_client.call_args.kwargs) == 4 assert mock_get_bigquery_client.call_args.kwargs["project"] == bq_project assert ( mock_get_bigquery_client.call_args.kwargs["credentials"] == bq_credentials @@ -174,7 +204,7 @@ def test_get_dataset_info_bq_client_creation(mock_get_bigquery_client): bq_project, bq_dataset, bq_credentials, tool_settings ) mock_get_bigquery_client.assert_called_once() - assert len(mock_get_bigquery_client.call_args.kwargs) == 3 + assert len(mock_get_bigquery_client.call_args.kwargs) == 4 assert mock_get_bigquery_client.call_args.kwargs["project"] == bq_project assert ( mock_get_bigquery_client.call_args.kwargs["credentials"] == bq_credentials @@ -200,7 +230,7 @@ def test_list_table_ids_bq_client_creation(mock_get_bigquery_client): bq_project, bq_dataset, bq_credentials, tool_settings ) mock_get_bigquery_client.assert_called_once() - assert len(mock_get_bigquery_client.call_args.kwargs) == 3 + assert len(mock_get_bigquery_client.call_args.kwargs) == 4 assert mock_get_bigquery_client.call_args.kwargs["project"] == bq_project assert ( mock_get_bigquery_client.call_args.kwargs["credentials"] == bq_credentials @@ -227,7 +257,7 @@ def test_get_table_info_bq_client_creation(mock_get_bigquery_client): bq_project, bq_dataset, bq_table, bq_credentials, tool_settings ) mock_get_bigquery_client.assert_called_once() - assert len(mock_get_bigquery_client.call_args.kwargs) == 3 + assert len(mock_get_bigquery_client.call_args.kwargs) == 4 assert mock_get_bigquery_client.call_args.kwargs["project"] == bq_project assert ( mock_get_bigquery_client.call_args.kwargs["credentials"] == bq_credentials diff --git a/tests/unittests/tools/bigquery/test_bigquery_query_tool.py b/tests/unittests/tools/bigquery/test_bigquery_query_tool.py index 48b6e3929d..b41a55a945 100644 --- a/tests/unittests/tools/bigquery/test_bigquery_query_tool.py +++ b/tests/unittests/tools/bigquery/test_bigquery_query_tool.py @@ -28,6 +28,8 @@ from google.adk.tools.bigquery import BigQueryToolset from google.adk.tools.bigquery.config import BigQueryToolConfig from google.adk.tools.bigquery.config import WriteMode +from google.adk.tools.bigquery.query_tool import analyze_contribution +from google.adk.tools.bigquery.query_tool import detect_anomalies from google.adk.tools.bigquery.query_tool import execute_sql from google.adk.tools.bigquery.query_tool import forecast from google.adk.tools.tool_context import ToolContext @@ -95,12 +97,17 @@ async def test_execute_sql_declaration_read_only(tool_settings): credentials (Credentials): The credentials to use for the request. settings (BigQueryToolConfig): The settings for the tool. tool_context (ToolContext): The context for the tool. + dry_run (bool, default False): If True, the query will not be executed. + Instead, the query will be validated and information about the query + will be returned. Defaults to False. Returns: - dict: Dictionary representing the result of the query. - If the result contains the key "result_is_likely_truncated" with - value True, it means that there may be additional rows matching the - query not returned in the result. + dict: If `dry_run` is False, dictionary representing the result of the + query. If the result contains the key "result_is_likely_truncated" + with value True, it means that there may be additional rows matching + the query not returned in the result. + If `dry_run` is True, dictionary with "dry_run_info" field + containing query information returned by BigQuery. Examples: Fetch data or insights from a table: @@ -124,6 +131,39 @@ async def test_execute_sql_declaration_read_only(tool_settings): "population": 52 } ] + } + + Validate a query and estimate costs without executing it: + + >>> execute_sql( + ... "my_project", + ... "SELECT island FROM " + ... "bigquery-public-data.ml_datasets.penguins", + ... dry_run=True + ... ) + { + "status": "SUCCESS", + "dry_run_info": { + "configuration": { + "dryRun": True, + "jobType": "QUERY", + "query": { + "destinationTable": { + "datasetId": "_...", + "projectId": "my_project", + "tableId": "anon..." + }, + "priority": "INTERACTIVE", + "query": "SELECT island FROM bigquery-public-data.ml_datasets.penguins", + "useLegacySql": False, + "writeDisposition": "WRITE_TRUNCATE" + } + }, + "jobReference": { + "location": "US", + "projectId": "my_project" + } + } }""") @@ -156,12 +196,17 @@ async def test_execute_sql_declaration_write(tool_settings): credentials (Credentials): The credentials to use for the request. settings (BigQueryToolConfig): The settings for the tool. tool_context (ToolContext): The context for the tool. + dry_run (bool, default False): If True, the query will not be executed. + Instead, the query will be validated and information about the query + will be returned. Defaults to False. Returns: - dict: Dictionary representing the result of the query. - If the result contains the key "result_is_likely_truncated" with - value True, it means that there may be additional rows matching the - query not returned in the result. + dict: If `dry_run` is False, dictionary representing the result of the + query. If the result contains the key "result_is_likely_truncated" + with value True, it means that there may be additional rows matching + the query not returned in the result. + If `dry_run` is True, dictionary with "dry_run_info" field + containing query information returned by BigQuery. Examples: Fetch data or insights from a table: @@ -187,6 +232,39 @@ async def test_execute_sql_declaration_write(tool_settings): ] } + Validate a query and estimate costs without executing it: + + >>> execute_sql( + ... "my_project", + ... "SELECT island FROM " + ... "bigquery-public-data.ml_datasets.penguins", + ... dry_run=True + ... ) + { + "status": "SUCCESS", + "dry_run_info": { + "configuration": { + "dryRun": True, + "jobType": "QUERY", + "query": { + "destinationTable": { + "datasetId": "_...", + "projectId": "my_project", + "tableId": "anon..." + }, + "priority": "INTERACTIVE", + "query": "SELECT island FROM bigquery-public-data.ml_datasets.penguins", + "useLegacySql": False, + "writeDisposition": "WRITE_TRUNCATE" + } + }, + "jobReference": { + "location": "US", + "projectId": "my_project" + } + } + } + Create a table with schema prescribed: >>> execute_sql("my_project", @@ -355,12 +433,17 @@ async def test_execute_sql_declaration_protected_write(tool_settings): credentials (Credentials): The credentials to use for the request. settings (BigQueryToolConfig): The settings for the tool. tool_context (ToolContext): The context for the tool. + dry_run (bool, default False): If True, the query will not be executed. + Instead, the query will be validated and information about the query + will be returned. Defaults to False. Returns: - dict: Dictionary representing the result of the query. - If the result contains the key "result_is_likely_truncated" with - value True, it means that there may be additional rows matching the - query not returned in the result. + dict: If `dry_run` is False, dictionary representing the result of the + query. If the result contains the key "result_is_likely_truncated" + with value True, it means that there may be additional rows matching + the query not returned in the result. + If `dry_run` is True, dictionary with "dry_run_info" field + containing query information returned by BigQuery. Examples: Fetch data or insights from a table: @@ -386,6 +469,39 @@ async def test_execute_sql_declaration_protected_write(tool_settings): ] } + Validate a query and estimate costs without executing it: + + >>> execute_sql( + ... "my_project", + ... "SELECT island FROM " + ... "bigquery-public-data.ml_datasets.penguins", + ... dry_run=True + ... ) + { + "status": "SUCCESS", + "dry_run_info": { + "configuration": { + "dryRun": True, + "jobType": "QUERY", + "query": { + "destinationTable": { + "datasetId": "_...", + "projectId": "my_project", + "tableId": "anon..." + }, + "priority": "INTERACTIVE", + "query": "SELECT island FROM bigquery-public-data.ml_datasets.penguins", + "useLegacySql": False, + "writeDisposition": "WRITE_TRUNCATE" + } + }, + "jobReference": { + "location": "US", + "projectId": "my_project" + } + } + } + Create a temporary table with schema prescribed: >>> execute_sql("my_project", @@ -759,8 +875,9 @@ def test_execute_sql_non_select_stmt_write_protected_persistent_target( ): """Test execute_sql tool for non-SELECT query when writes are protected. - This is a special case when the destination table is a persistent/permananent - one and the protected write is enabled. In this case the operation should fail. + This is a special case when the destination table is a persistent/permanent + one and the protected write is enabled. In this case the operation should + fail. """ project = "my_project" query_result = [] @@ -798,6 +915,35 @@ def test_execute_sql_non_select_stmt_write_protected_persistent_target( } +def test_execute_sql_dry_run_true(): + """Test execute_sql tool with dry_run=True.""" + project = "my_project" + query = "SELECT 123 AS num" + credentials = mock.create_autospec(Credentials, instance=True) + tool_settings = BigQueryToolConfig(write_mode=WriteMode.ALLOWED) + tool_context = mock.create_autospec(ToolContext, instance=True) + api_repr = { + "configuration": {"dryRun": True, "query": {"query": query}}, + "jobReference": {"projectId": project, "location": "US"}, + } + + with mock.patch("google.cloud.bigquery.Client", autospec=False) as Client: + bq_client = Client.return_value + + query_job = mock.create_autospec(bigquery.QueryJob) + query_job.to_api_repr.return_value = api_repr + bq_client.query.return_value = query_job + + result = execute_sql( + project, query, credentials, tool_settings, tool_context, dry_run=True + ) + assert result == {"status": "SUCCESS", "dry_run_info": api_repr} + bq_client.query.assert_called_once() + _, mock_kwargs = bq_client.query.call_args + assert mock_kwargs["job_config"].dry_run == True + bq_client.query_and_wait.assert_not_called() + + @pytest.mark.parametrize( ("write_mode",), [ @@ -1000,7 +1146,7 @@ def test_execute_sql_bq_client_creation(mock_get_bigquery_client): execute_sql(project, query, credentials, tool_settings, tool_context) mock_get_bigquery_client.assert_called_once() - assert len(mock_get_bigquery_client.call_args.kwargs) == 3 + assert len(mock_get_bigquery_client.call_args.kwargs) == 4 assert mock_get_bigquery_client.call_args.kwargs["project"] == project assert mock_get_bigquery_client.call_args.kwargs["credentials"] == credentials assert ( @@ -1129,3 +1275,315 @@ def test_forecast_with_invalid_id_cols(): assert result["status"] == "ERROR" assert "All elements in id_cols must be strings." in result["error_details"] + + +# analyze_contribution calls execute_sql twice. We need to test that the +# queries are properly constructed and call execute_sql with the correct +# parameters exactly twice. +@mock.patch("google.adk.tools.bigquery.query_tool.execute_sql", autospec=True) +@mock.patch("uuid.uuid4", autospec=True) +def test_analyze_contribution_with_table_id(mock_uuid, mock_execute_sql): + """Test analyze_contribution tool invocation with a table id.""" + mock_credentials = mock.MagicMock(spec=Credentials) + mock_settings = BigQueryToolConfig(write_mode=WriteMode.PROTECTED) + mock_tool_context = mock.create_autospec(ToolContext, instance=True) + mock_uuid.return_value = "test_uuid" + mock_execute_sql.return_value = {"status": "SUCCESS"} + + analyze_contribution( + project_id="test-project", + input_data="test-dataset.test-table", + dimension_id_cols=["dim1", "dim2"], + contribution_metric="SUM(metric)", + is_test_col="is_test", + credentials=mock_credentials, + settings=mock_settings, + tool_context=mock_tool_context, + ) + + expected_create_model_query = """ + CREATE TEMP MODEL contribution_analysis_model_test_uuid + OPTIONS (MODEL_TYPE = 'CONTRIBUTION_ANALYSIS', CONTRIBUTION_METRIC = 'SUM(metric)', IS_TEST_COL = 'is_test', DIMENSION_ID_COLS = ['dim1', 'dim2'], TOP_K_INSIGHTS_BY_APRIORI_SUPPORT = 30, PRUNING_METHOD = 'PRUNE_REDUNDANT_INSIGHTS') + AS SELECT * FROM `test-dataset.test-table` + """ + + expected_get_insights_query = """ + SELECT * FROM ML.GET_INSIGHTS(MODEL contribution_analysis_model_test_uuid) + """ + + assert mock_execute_sql.call_count == 2 + mock_execute_sql.assert_any_call( + "test-project", + expected_create_model_query, + mock_credentials, + mock_settings, + mock_tool_context, + ) + mock_execute_sql.assert_any_call( + "test-project", + expected_get_insights_query, + mock_credentials, + mock_settings, + mock_tool_context, + ) + + +# analyze_contribution calls execute_sql twice. We need to test that the +# queries are properly constructed and call execute_sql with the correct +# parameters exactly twice. +@mock.patch("google.adk.tools.bigquery.query_tool.execute_sql", autospec=True) +@mock.patch("uuid.uuid4", autospec=True) +def test_analyze_contribution_with_query_statement(mock_uuid, mock_execute_sql): + """Test analyze_contribution tool invocation with a query statement.""" + mock_credentials = mock.MagicMock(spec=Credentials) + mock_settings = BigQueryToolConfig(write_mode=WriteMode.PROTECTED) + mock_tool_context = mock.create_autospec(ToolContext, instance=True) + mock_uuid.return_value = "test_uuid" + mock_execute_sql.return_value = {"status": "SUCCESS"} + + input_data_query = "SELECT * FROM `test-dataset.test-table`" + analyze_contribution( + project_id="test-project", + input_data=input_data_query, + dimension_id_cols=["dim1", "dim2"], + contribution_metric="SUM(metric)", + is_test_col="is_test", + credentials=mock_credentials, + settings=mock_settings, + tool_context=mock_tool_context, + ) + + expected_create_model_query = f""" + CREATE TEMP MODEL contribution_analysis_model_test_uuid + OPTIONS (MODEL_TYPE = 'CONTRIBUTION_ANALYSIS', CONTRIBUTION_METRIC = 'SUM(metric)', IS_TEST_COL = 'is_test', DIMENSION_ID_COLS = ['dim1', 'dim2'], TOP_K_INSIGHTS_BY_APRIORI_SUPPORT = 30, PRUNING_METHOD = 'PRUNE_REDUNDANT_INSIGHTS') + AS ({input_data_query}) + """ + + expected_get_insights_query = """ + SELECT * FROM ML.GET_INSIGHTS(MODEL contribution_analysis_model_test_uuid) + """ + + assert mock_execute_sql.call_count == 2 + mock_execute_sql.assert_any_call( + "test-project", + expected_create_model_query, + mock_credentials, + mock_settings, + mock_tool_context, + ) + mock_execute_sql.assert_any_call( + "test-project", + expected_get_insights_query, + mock_credentials, + mock_settings, + mock_tool_context, + ) + + +def test_analyze_contribution_with_invalid_dimension_id_cols(): + """Test analyze_contribution tool invocation with invalid dimension_id_cols.""" + mock_credentials = mock.MagicMock(spec=Credentials) + mock_settings = BigQueryToolConfig() + mock_tool_context = mock.create_autospec(ToolContext, instance=True) + + result = analyze_contribution( + project_id="test-project", + input_data="test-dataset.test-table", + dimension_id_cols=["dim1", 123], + contribution_metric="metric", + is_test_col="is_test", + credentials=mock_credentials, + settings=mock_settings, + tool_context=mock_tool_context, + ) + + assert result["status"] == "ERROR" + assert ( + "All elements in dimension_id_cols must be strings." + in result["error_details"] + ) + + +# detect_anomalies calls execute_sql twice. We need to test that +# the queries are properly constructed and call execute_sql with the correct +# parameters exactly twice. +@mock.patch("google.adk.tools.bigquery.query_tool.execute_sql", autospec=True) +@mock.patch("uuid.uuid4", autospec=True) +def test_detect_anomalies_with_table_id(mock_uuid, mock_execute_sql): + """Test time series anomaly detection tool invocation with a table id.""" + mock_credentials = mock.MagicMock(spec=Credentials) + mock_settings = BigQueryToolConfig(write_mode=WriteMode.PROTECTED) + mock_tool_context = mock.create_autospec(ToolContext, instance=True) + mock_uuid.return_value = "test_uuid" + mock_execute_sql.return_value = {"status": "SUCCESS"} + + history_data_query = "SELECT * FROM `test-dataset.test-table`" + detect_anomalies( + project_id="test-project", + history_data=history_data_query, + times_series_timestamp_col="ts_timestamp", + times_series_data_col="ts_data", + credentials=mock_credentials, + settings=mock_settings, + tool_context=mock_tool_context, + ) + + expected_create_model_query = """ + CREATE TEMP MODEL detect_anomalies_model_test_uuid + OPTIONS (MODEL_TYPE = 'ARIMA_PLUS', TIME_SERIES_TIMESTAMP_COL = 'ts_timestamp', TIME_SERIES_DATA_COL = 'ts_data', HORIZON = 10) + AS (SELECT * FROM `test-dataset.test-table`) + """ + + expected_anomaly_detection_query = """ + SELECT * FROM ML.DETECT_ANOMALIES(MODEL detect_anomalies_model_test_uuid, STRUCT(0.95 AS anomaly_prob_threshold)) + """ + + assert mock_execute_sql.call_count == 2 + mock_execute_sql.assert_any_call( + "test-project", + expected_create_model_query, + mock_credentials, + mock_settings, + mock_tool_context, + ) + mock_execute_sql.assert_any_call( + "test-project", + expected_anomaly_detection_query, + mock_credentials, + mock_settings, + mock_tool_context, + ) + + +# detect_anomalies calls execute_sql twice. We need to test that +# the queries are properly constructed and call execute_sql with the correct +# parameters exactly twice. +@mock.patch("google.adk.tools.bigquery.query_tool.execute_sql", autospec=True) +@mock.patch("uuid.uuid4", autospec=True) +def test_detect_anomalies_with_custom_params(mock_uuid, mock_execute_sql): + """Test time series anomaly detection tool invocation with a table id.""" + mock_credentials = mock.MagicMock(spec=Credentials) + mock_settings = BigQueryToolConfig(write_mode=WriteMode.PROTECTED) + mock_tool_context = mock.create_autospec(ToolContext, instance=True) + mock_uuid.return_value = "test_uuid" + mock_execute_sql.return_value = {"status": "SUCCESS"} + + history_data_query = "SELECT * FROM `test-dataset.test-table`" + detect_anomalies( + project_id="test-project", + history_data=history_data_query, + times_series_timestamp_col="ts_timestamp", + times_series_data_col="ts_data", + times_series_id_cols=["dim1", "dim2"], + horizon=20, + anomaly_prob_threshold=0.8, + credentials=mock_credentials, + settings=mock_settings, + tool_context=mock_tool_context, + ) + + expected_create_model_query = """ + CREATE TEMP MODEL detect_anomalies_model_test_uuid + OPTIONS (MODEL_TYPE = 'ARIMA_PLUS', TIME_SERIES_TIMESTAMP_COL = 'ts_timestamp', TIME_SERIES_DATA_COL = 'ts_data', HORIZON = 20, TIME_SERIES_ID_COL = ['dim1', 'dim2']) + AS (SELECT * FROM `test-dataset.test-table`) + """ + + expected_anomaly_detection_query = """ + SELECT * FROM ML.DETECT_ANOMALIES(MODEL detect_anomalies_model_test_uuid, STRUCT(0.8 AS anomaly_prob_threshold)) + """ + + assert mock_execute_sql.call_count == 2 + mock_execute_sql.assert_any_call( + "test-project", + expected_create_model_query, + mock_credentials, + mock_settings, + mock_tool_context, + ) + mock_execute_sql.assert_any_call( + "test-project", + expected_anomaly_detection_query, + mock_credentials, + mock_settings, + mock_tool_context, + ) + + +# detect_anomalies calls execute_sql twice. We need to test that +# the queries are properly constructed and call execute_sql with the correct +# parameters exactly twice. +@mock.patch("google.adk.tools.bigquery.query_tool.execute_sql", autospec=True) +@mock.patch("uuid.uuid4", autospec=True) +def test_detect_anomalies_on_target_table(mock_uuid, mock_execute_sql): + """Test time series anomaly detection tool with target data is provided.""" + mock_credentials = mock.MagicMock(spec=Credentials) + mock_settings = BigQueryToolConfig(write_mode=WriteMode.PROTECTED) + mock_tool_context = mock.create_autospec(ToolContext, instance=True) + mock_uuid.return_value = "test_uuid" + mock_execute_sql.return_value = {"status": "SUCCESS"} + + history_data_query = "SELECT * FROM `test-dataset.history-table`" + target_data_query = "SELECT * FROM `test-dataset.target-table`" + detect_anomalies( + project_id="test-project", + history_data=history_data_query, + times_series_timestamp_col="ts_timestamp", + times_series_data_col="ts_data", + times_series_id_cols=["dim1", "dim2"], + horizon=20, + target_data=target_data_query, + anomaly_prob_threshold=0.8, + credentials=mock_credentials, + settings=mock_settings, + tool_context=mock_tool_context, + ) + + expected_create_model_query = """ + CREATE TEMP MODEL detect_anomalies_model_test_uuid + OPTIONS (MODEL_TYPE = 'ARIMA_PLUS', TIME_SERIES_TIMESTAMP_COL = 'ts_timestamp', TIME_SERIES_DATA_COL = 'ts_data', HORIZON = 20, TIME_SERIES_ID_COL = ['dim1', 'dim2']) + AS (SELECT * FROM `test-dataset.history-table`) + """ + + expected_anomaly_detection_query = """ + SELECT * FROM ML.DETECT_ANOMALIES(MODEL detect_anomalies_model_test_uuid, STRUCT(0.8 AS anomaly_prob_threshold), (SELECT * FROM `test-dataset.target-table`)) + """ + + assert mock_execute_sql.call_count == 2 + mock_execute_sql.assert_any_call( + "test-project", + expected_create_model_query, + mock_credentials, + mock_settings, + mock_tool_context, + ) + mock_execute_sql.assert_any_call( + "test-project", + expected_anomaly_detection_query, + mock_credentials, + mock_settings, + mock_tool_context, + ) + + +def test_detect_anomalies__with_invalid_id_cols(): + """Test time series anomaly detection tool invocation with invalid times_series_id_cols.""" + mock_credentials = mock.MagicMock(spec=Credentials) + mock_settings = BigQueryToolConfig() + mock_tool_context = mock.create_autospec(ToolContext, instance=True) + + result = detect_anomalies( + project_id="test-project", + history_data="test-dataset.test-table", + times_series_timestamp_col="ts_timestamp", + times_series_data_col="ts_data", + times_series_id_cols=["dim1", 123], + credentials=mock_credentials, + settings=mock_settings, + tool_context=mock_tool_context, + ) + + assert result["status"] == "ERROR" + assert ( + "All elements in times_series_id_cols must be strings." + in result["error_details"] + ) diff --git a/tests/unittests/tools/bigquery/test_bigquery_toolset.py b/tests/unittests/tools/bigquery/test_bigquery_toolset.py index 74e913f587..2d890fb51a 100644 --- a/tests/unittests/tools/bigquery/test_bigquery_toolset.py +++ b/tests/unittests/tools/bigquery/test_bigquery_toolset.py @@ -41,7 +41,7 @@ async def test_bigquery_toolset_tools_default(): tools = await toolset.get_tools() assert tools is not None - assert len(tools) == 7 + assert len(tools) == 10 assert all([isinstance(tool, GoogleTool) for tool in tools]) expected_tool_names = set([ @@ -49,9 +49,12 @@ async def test_bigquery_toolset_tools_default(): "get_dataset_info", "list_table_ids", "get_table_info", + "get_job_info", "execute_sql", "ask_data_insights", "forecast", + "analyze_contribution", + "detect_anomalies", ]) actual_tool_names = set([tool.name for tool in tools]) assert actual_tool_names == expected_tool_names diff --git a/tests/unittests/tools/computer_use/test_computer_use_toolset.py b/tests/unittests/tools/computer_use/test_computer_use_toolset.py index 803dddd066..6367b46ce4 100644 --- a/tests/unittests/tools/computer_use/test_computer_use_toolset.py +++ b/tests/unittests/tools/computer_use/test_computer_use_toolset.py @@ -370,7 +370,7 @@ async def test_process_llm_request_with_existing_computer_use( config=types.GenerateContentConfig( tools=[ types.Tool( - computer_use=types.ToolComputerUse( + computer_use=types.ComputerUse( environment=types.Environment.ENVIRONMENT_BROWSER ) ) diff --git a/tests/unittests/tools/google_api_tool/test_google_api_tool.py b/tests/unittests/tools/google_api_tool/test_google_api_tool.py index 0d9c1f9efb..9e4761fe0a 100644 --- a/tests/unittests/tools/google_api_tool/test_google_api_tool.py +++ b/tests/unittests/tools/google_api_tool/test_google_api_tool.py @@ -56,6 +56,14 @@ def test_init(self, mock_rest_api_tool): assert tool.is_long_running is False assert tool._rest_api_tool == mock_rest_api_tool + def test_init_with_additional_headers(self, mock_rest_api_tool): + """Test GoogleApiTool initialization with additional headers.""" + headers = {"developer-token": "test-token"} + + GoogleApiTool(mock_rest_api_tool, additional_headers=headers) + + mock_rest_api_tool.set_default_headers.assert_called_once_with(headers) + def test_get_declaration(self, mock_rest_api_tool): """Test _get_declaration method.""" tool = GoogleApiTool(mock_rest_api_tool) diff --git a/tests/unittests/tools/google_api_tool/test_google_api_toolset.py b/tests/unittests/tools/google_api_tool/test_google_api_toolset.py index 9dc89ff69c..5da0cb4bcb 100644 --- a/tests/unittests/tools/google_api_tool/test_google_api_toolset.py +++ b/tests/unittests/tools/google_api_tool/test_google_api_toolset.py @@ -126,12 +126,14 @@ def test_init( client_id = "test_client_id" client_secret = "test_client_secret" + additional_headers = {"developer-token": "abc123"} tool_set = GoogleApiToolset( api_name=TEST_API_NAME, api_version=TEST_API_VERSION, client_id=client_id, client_secret=client_secret, + additional_headers=additional_headers, ) assert tool_set.api_name == TEST_API_NAME @@ -141,6 +143,7 @@ def test_init( assert tool_set._service_account is None assert tool_set.tool_filter is None assert tool_set._openapi_toolset == mock_openapi_toolset_instance + assert tool_set._additional_headers == additional_headers mock_converter_class.assert_called_once_with( TEST_API_NAME, TEST_API_VERSION @@ -191,6 +194,7 @@ async def test_get_tools( client_id = "cid" client_secret = "csecret" sa_mock = mock.MagicMock(spec=ServiceAccount) + additional_headers = {"developer-token": "token"} tool_set = GoogleApiToolset( api_name=TEST_API_NAME, @@ -198,6 +202,7 @@ async def test_get_tools( client_id=client_id, client_secret=client_secret, service_account=sa_mock, + additional_headers=additional_headers, ) tools = await tool_set.get_tools(mock_readonly_context) @@ -209,7 +214,11 @@ async def test_get_tools( for i, rest_tool in enumerate(mock_rest_api_tools): mock_google_api_tool_class.assert_any_call( - rest_tool, client_id, client_secret, sa_mock + rest_tool, + client_id, + client_secret, + sa_mock, + additional_headers=additional_headers, ) assert tools[i] is mock_google_api_tool_instances[i] diff --git a/tests/unittests/tools/mcp_tool/test_mcp_tool.py b/tests/unittests/tools/mcp_tool/test_mcp_tool.py index d32593749b..c1fbb5bc63 100644 --- a/tests/unittests/tools/mcp_tool/test_mcp_tool.py +++ b/tests/unittests/tools/mcp_tool/test_mcp_tool.py @@ -36,6 +36,9 @@ from google.adk.tools.mcp_tool.mcp_tool import MCPTool from google.adk.tools.tool_context import ToolContext from google.genai.types import FunctionDeclaration + from google.genai.types import Type + from mcp.types import CallToolResult + from mcp.types import TextContent except ImportError as e: if sys.version_info < (3, 10): # Create dummy classes to prevent NameError during test collection @@ -47,6 +50,9 @@ class DummyClass: MCPTool = DummyClass ToolContext = DummyClass FunctionDeclaration = DummyClass + Type = DummyClass + CallToolResult = DummyClass + TextContent = DummyClass else: raise e @@ -66,6 +72,7 @@ def __init__(self, name="test_tool", description="Test tool description"): }, "required": ["param1"], } + self.outputSchema = None class TestMCPTool: @@ -141,6 +148,7 @@ def test_get_declaration(self): assert declaration.name == "test_tool" assert declaration.description == "Test tool description" assert declaration.parameters is not None + assert declaration.response is None @pytest.mark.asyncio async def test_run_async_impl_no_auth(self): @@ -150,9 +158,11 @@ async def test_run_async_impl_no_auth(self): mcp_session_manager=self.mock_session_manager, ) - # Mock the session response - expected_response = {"result": "success"} - self.mock_session.call_tool = AsyncMock(return_value=expected_response) + # Mock the session response - must return CallToolResult + mcp_response = CallToolResult( + content=[TextContent(type="text", text="success")] + ) + self.mock_session.call_tool = AsyncMock(return_value=mcp_response) tool_context = Mock(spec=ToolContext) args = {"param1": "test_value"} @@ -161,7 +171,8 @@ async def test_run_async_impl_no_auth(self): args=args, tool_context=tool_context, credential=None ) - assert result == expected_response + # Verify the result matches the model_dump output + assert result == mcp_response.model_dump(exclude_none=True, mode="json") self.mock_session_manager.create_session.assert_called_once_with( headers=None ) @@ -184,9 +195,11 @@ async def test_run_async_impl_with_oauth2(self): auth_type=AuthCredentialTypes.OAUTH2, oauth2=oauth2_auth ) - # Mock the session response - expected_response = {"result": "success"} - self.mock_session.call_tool = AsyncMock(return_value=expected_response) + # Mock the session response - must return CallToolResult + mcp_response = CallToolResult( + content=[TextContent(type="text", text="success")] + ) + self.mock_session.call_tool = AsyncMock(return_value=mcp_response) tool_context = Mock(spec=ToolContext) args = {"param1": "test_value"} @@ -195,7 +208,7 @@ async def test_run_async_impl_with_oauth2(self): args=args, tool_context=tool_context, credential=credential ) - assert result == expected_response + assert result == mcp_response.model_dump(exclude_none=True, mode="json") # Check that headers were passed correctly self.mock_session_manager.create_session.assert_called_once() call_args = self.mock_session_manager.create_session.call_args @@ -322,7 +335,7 @@ async def test_get_headers_api_key_with_query_scheme_raises_error(self): with pytest.raises( ValueError, - match="MCPTool only supports header-based API key authentication", + match="McpTool only supports header-based API key authentication", ): await tool._get_headers(tool_context, auth_credential) @@ -354,7 +367,7 @@ async def test_get_headers_api_key_with_cookie_scheme_raises_error(self): with pytest.raises( ValueError, - match="MCPTool only supports header-based API key authentication", + match="McpTool only supports header-based API key authentication", ): await tool._get_headers(tool_context, auth_credential) @@ -460,9 +473,11 @@ async def test_run_async_impl_with_api_key_header_auth(self): auth_credential=auth_credential, ) - # Mock the session response - expected_response = {"result": "authenticated_success"} - self.mock_session.call_tool = AsyncMock(return_value=expected_response) + # Mock the session response - must return CallToolResult + mcp_response = CallToolResult( + content=[TextContent(type="text", text="authenticated_success")] + ) + self.mock_session.call_tool = AsyncMock(return_value=mcp_response) tool_context = Mock(spec=ToolContext) args = {"param1": "test_value"} @@ -471,7 +486,7 @@ async def test_run_async_impl_with_api_key_header_auth(self): args=args, tool_context=tool_context, credential=auth_credential ) - assert result == expected_response + assert result == mcp_response.model_dump(exclude_none=True, mode="json") # Check that headers were passed correctly with custom API key header self.mock_session_manager.create_session.assert_called_once() call_args = self.mock_session_manager.create_session.call_args @@ -545,10 +560,93 @@ async def test_get_headers_api_key_error_logging(self): mock_logger.error.assert_called_once() logged_message = mock_logger.error.call_args[0][0] assert ( - "MCPTool only supports header-based API key authentication" + "McpTool only supports header-based API key authentication" in logged_message ) + @pytest.mark.asyncio + async def test_run_async_require_confirmation_true_no_confirmation(self): + """Test require_confirmation=True with no confirmation in context.""" + tool = MCPTool( + mcp_tool=self.mock_mcp_tool, + mcp_session_manager=self.mock_session_manager, + require_confirmation=True, + ) + tool_context = Mock(spec=ToolContext) + tool_context.tool_confirmation = None + tool_context.request_confirmation = Mock() + args = {"param1": "test_value"} + + result = await tool.run_async(args=args, tool_context=tool_context) + + assert result == { + "error": ( + "This tool call requires confirmation, please approve or reject." + ) + } + tool_context.request_confirmation.assert_called_once() + + @pytest.mark.asyncio + async def test_run_async_require_confirmation_true_rejected(self): + """Test require_confirmation=True with rejection in context.""" + tool = MCPTool( + mcp_tool=self.mock_mcp_tool, + mcp_session_manager=self.mock_session_manager, + require_confirmation=True, + ) + tool_context = Mock(spec=ToolContext) + tool_context.tool_confirmation = Mock(confirmed=False) + args = {"param1": "test_value"} + + result = await tool.run_async(args=args, tool_context=tool_context) + + assert result == {"error": "This tool call is rejected."} + + @pytest.mark.asyncio + async def test_run_async_require_confirmation_true_confirmed(self): + """Test require_confirmation=True with confirmation in context.""" + tool = MCPTool( + mcp_tool=self.mock_mcp_tool, + mcp_session_manager=self.mock_session_manager, + require_confirmation=True, + ) + tool_context = Mock(spec=ToolContext) + tool_context.tool_confirmation = Mock(confirmed=True) + args = {"param1": "test_value"} + + with patch( + "google.adk.tools.base_authenticated_tool.BaseAuthenticatedTool.run_async", + new_callable=AsyncMock, + ) as mock_super_run_async: + await tool.run_async(args=args, tool_context=tool_context) + mock_super_run_async.assert_called_once_with( + args=args, tool_context=tool_context + ) + + @pytest.mark.asyncio + async def test_run_async_require_confirmation_callable_true_no_confirmation( + self, + ): + """Test require_confirmation=callable with no confirmation in context.""" + tool = MCPTool( + mcp_tool=self.mock_mcp_tool, + mcp_session_manager=self.mock_session_manager, + require_confirmation=lambda **kwargs: True, + ) + tool_context = Mock(spec=ToolContext) + tool_context.tool_confirmation = None + tool_context.request_confirmation = Mock() + args = {"param1": "test_value"} + + result = await tool.run_async(args=args, tool_context=tool_context) + + assert result == { + "error": ( + "This tool call requires confirmation, please approve or reject." + ) + } + tool_context.request_confirmation.assert_called_once() + def test_init_validation(self): """Test that initialization validates required parameters.""" # This test ensures that the MCPTool properly handles its dependencies @@ -557,3 +655,80 @@ def test_init_validation(self): with pytest.raises(TypeError): MCPTool(mcp_tool=self.mock_mcp_tool) # Missing session manager + + @pytest.mark.asyncio + async def test_run_async_impl_with_header_provider_no_auth(self): + """Test running tool with header_provider but no auth.""" + expected_headers = {"X-Tenant-ID": "test-tenant"} + header_provider = Mock(return_value=expected_headers) + tool = MCPTool( + mcp_tool=self.mock_mcp_tool, + mcp_session_manager=self.mock_session_manager, + header_provider=header_provider, + ) + + # Mock the session response - must return CallToolResult + mcp_response = CallToolResult( + content=[TextContent(type="text", text="success")] + ) + self.mock_session.call_tool = AsyncMock(return_value=mcp_response) + + tool_context = Mock(spec=ToolContext) + tool_context._invocation_context = Mock() + args = {"param1": "test_value"} + + result = await tool._run_async_impl( + args=args, tool_context=tool_context, credential=None + ) + + assert result == mcp_response.model_dump(exclude_none=True, mode="json") + header_provider.assert_called_once() + self.mock_session_manager.create_session.assert_called_once_with( + headers=expected_headers + ) + self.mock_session.call_tool.assert_called_once_with( + "test_tool", arguments=args + ) + + @pytest.mark.asyncio + async def test_run_async_impl_with_header_provider_and_oauth2(self): + """Test running tool with header_provider and OAuth2 auth.""" + dynamic_headers = {"X-Tenant-ID": "test-tenant"} + header_provider = Mock(return_value=dynamic_headers) + tool = MCPTool( + mcp_tool=self.mock_mcp_tool, + mcp_session_manager=self.mock_session_manager, + header_provider=header_provider, + ) + + oauth2_auth = OAuth2Auth(access_token="test_access_token") + credential = AuthCredential( + auth_type=AuthCredentialTypes.OAUTH2, oauth2=oauth2_auth + ) + + # Mock the session response - must return CallToolResult + mcp_response = CallToolResult( + content=[TextContent(type="text", text="success")] + ) + self.mock_session.call_tool = AsyncMock(return_value=mcp_response) + + tool_context = Mock(spec=ToolContext) + tool_context._invocation_context = Mock() + args = {"param1": "test_value"} + + result = await tool._run_async_impl( + args=args, tool_context=tool_context, credential=credential + ) + + assert result == mcp_response.model_dump(exclude_none=True, mode="json") + header_provider.assert_called_once() + self.mock_session_manager.create_session.assert_called_once() + call_args = self.mock_session_manager.create_session.call_args + headers = call_args[1]["headers"] + assert headers == { + "Authorization": "Bearer test_access_token", + "X-Tenant-ID": "test-tenant", + } + self.mock_session.call_tool.assert_called_once_with( + "test_tool", arguments=args + ) diff --git a/tests/unittests/tools/mcp_tool/test_mcp_toolset.py b/tests/unittests/tools/mcp_tool/test_mcp_toolset.py index d5e6ae2438..8f43a3d691 100644 --- a/tests/unittests/tools/mcp_tool/test_mcp_toolset.py +++ b/tests/unittests/tools/mcp_tool/test_mcp_toolset.py @@ -29,6 +29,7 @@ # Import dependencies with version checking try: + from google.adk.agents.readonly_context import ReadonlyContext from google.adk.tools.mcp_tool.mcp_session_manager import MCPSessionManager from google.adk.tools.mcp_tool.mcp_session_manager import SseConnectionParams from google.adk.tools.mcp_tool.mcp_session_manager import StdioConnectionParams @@ -55,6 +56,7 @@ def __init__(self, command="test_command", args=None): StreamableHTTPConnectionParams = DummyClass MCPTool = DummyClass MCPToolset = DummyClass + ReadonlyContext = DummyClass else: raise e @@ -245,6 +247,31 @@ def file_tools_filter(tool, context): assert tools[0].name == "read_file" assert tools[1].name == "write_file" + @pytest.mark.asyncio + async def test_get_tools_with_header_provider(self): + """Test get_tools with a header_provider.""" + mock_tools = [MockMCPTool("tool1"), MockMCPTool("tool2")] + self.mock_session.list_tools = AsyncMock( + return_value=MockListToolsResult(mock_tools) + ) + mock_readonly_context = Mock(spec=ReadonlyContext) + expected_headers = {"X-Tenant-ID": "test-tenant"} + header_provider = Mock(return_value=expected_headers) + + toolset = MCPToolset( + connection_params=self.mock_stdio_params, + header_provider=header_provider, + ) + toolset._mcp_session_manager = self.mock_session_manager + + tools = await toolset.get_tools(readonly_context=mock_readonly_context) + + assert len(tools) == 2 + header_provider.assert_called_once_with(mock_readonly_context) + self.mock_session_manager.create_session.assert_called_once_with( + headers=expected_headers + ) + @pytest.mark.asyncio async def test_close_success(self): """Test successful cleanup.""" @@ -274,7 +301,7 @@ async def test_close_with_exception(self): # Should log the error error_output = custom_errlog.getvalue() - assert "Warning: Error during MCPToolset cleanup" in error_output + assert "Warning: Error during McpToolset cleanup" in error_output assert "Cleanup error" in error_output @pytest.mark.asyncio diff --git a/tests/unittests/tools/openapi_tool/common/test_common.py b/tests/unittests/tools/openapi_tool/common/test_common.py index 5dc85781b7..47aeb79fdb 100644 --- a/tests/unittests/tools/openapi_tool/common/test_common.py +++ b/tests/unittests/tools/openapi_tool/common/test_common.py @@ -167,7 +167,6 @@ def test_api_parameter_model_serializer(self): 'List[Dict[str, Any]]', ), ({'type': 'object'}, Dict[str, Any], 'Dict[str, Any]'), - ({'type': 'unknown'}, Any, 'Any'), ({}, Any, 'Any'), ], ) diff --git a/tests/unittests/tools/openapi_tool/openapi_spec_parser/test.yaml b/tests/unittests/tools/openapi_tool/openapi_spec_parser/test.yaml index 0cea00362c..1cc139a66c 100644 --- a/tests/unittests/tools/openapi_tool/openapi_spec_parser/test.yaml +++ b/tests/unittests/tools/openapi_tool/openapi_spec_parser/test.yaml @@ -871,7 +871,7 @@ components: type: string iCalUID: description: |- - Event unique identifier as defined in RFC5545. It is used to uniquely identify events accross calendaring systems and must be supplied when importing events via the import method. + Event unique identifier as defined in RFC5545. It is used to uniquely identify events across calendaring systems and must be supplied when importing events via the import method. Note that the iCalUID and the id are not identical and only one of them should be supplied at event creation time. One difference in their semantics is that in recurring events, all occurrences of one event have different ids while they all share the same iCalUIDs. To retrieve an event using its iCalUID, call the events.list method using the iCalUID parameter. To retrieve an event using its id, call the events.get method. type: string id: diff --git a/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py b/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py index c4cbea7b9b..02b496bc53 100644 --- a/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py +++ b/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_rest_api_tool.py @@ -686,6 +686,65 @@ def test_prepare_request_params_unknown_parameter( # Make sure unknown parameters are ignored and do not raise errors. assert "unknown_param" not in request_params["params"] + def test_prepare_request_params_merges_default_headers( + self, + sample_endpoint, + sample_auth_credential, + sample_auth_scheme, + sample_operation, + ): + tool = RestApiTool( + name="test_tool", + description="Test Tool", + endpoint=sample_endpoint, + operation=sample_operation, + auth_credential=sample_auth_credential, + auth_scheme=sample_auth_scheme, + ) + tool.set_default_headers({"developer-token": "token"}) + + request_params = tool._prepare_request_params([], {}) + + assert request_params["headers"]["developer-token"] == "token" + + def test_prepare_request_params_preserves_existing_headers( + self, + sample_endpoint, + sample_auth_credential, + sample_auth_scheme, + sample_operation, + sample_api_parameters, + ): + tool = RestApiTool( + name="test_tool", + description="Test Tool", + endpoint=sample_endpoint, + operation=sample_operation, + auth_credential=sample_auth_credential, + auth_scheme=sample_auth_scheme, + ) + tool.set_default_headers({ + "Content-Type": "text/plain", + "developer-token": "token", + "User-Agent": "custom-default", + }) + + header_param = ApiParameter( + original_name="User-Agent", + py_name="user_agent", + param_location="header", + param_schema=OpenAPISchema(type="string"), + ) + + params = sample_api_parameters + [header_param] + kwargs = {"test_body_param": "value", "user_agent": "api-client"} + + request_params = tool._prepare_request_params(params, kwargs) + + assert request_params["headers"]["Content-Type"] == "application/json" + assert request_params["headers"]["developer-token"] == "token" + assert request_params["headers"]["User-Agent"] == "api-client" + def test_prepare_request_params_base_url_handling( self, sample_auth_credential, sample_auth_scheme, sample_operation ): diff --git a/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_tool_auth_handler.py b/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_tool_auth_handler.py index e405ce5b88..16b0d3b848 100644 --- a/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_tool_auth_handler.py +++ b/tests/unittests/tools/openapi_tool/openapi_spec_parser/test_tool_auth_handler.py @@ -150,11 +150,11 @@ async def test_openid_connect_with_auth_response( tool_context = create_mock_tool_context() mock_auth_handler = MagicMock() - returned_credentail = AuthCredential( + returned_credential = AuthCredential( auth_type=AuthCredentialTypes.OPEN_ID_CONNECT, oauth2=OAuth2Auth(auth_response_uri='test_auth_response_uri'), ) - mock_auth_handler.get_auth_response.return_value = returned_credentail + mock_auth_handler.get_auth_response.return_value = returned_credential mock_auth_handler_path = 'google.adk.tools.tool_context.AuthHandler' monkeypatch.setattr( mock_auth_handler_path, lambda *args, **kwargs: mock_auth_handler @@ -176,7 +176,7 @@ async def test_openid_connect_with_auth_response( stored_credential = credential_store.get_credential( openid_connect_scheme, openid_connect_credential ) - assert stored_credential == returned_credentail + assert stored_credential == returned_credential mock_auth_handler.get_auth_response.assert_called_once() diff --git a/tests/unittests/tools/spanner/test_search_tool.py b/tests/unittests/tools/spanner/test_search_tool.py new file mode 100644 index 0000000000..1b330b01d5 --- /dev/null +++ b/tests/unittests/tools/spanner/test_search_tool.py @@ -0,0 +1,301 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from unittest.mock import MagicMock +from unittest.mock import patch + +from google.adk.tools.spanner import search_tool +from google.cloud.spanner_admin_database_v1.types import DatabaseDialect +import pytest + + +@pytest.fixture +def mock_credentials(): + return MagicMock() + + +@pytest.fixture +def mock_spanner_ids(): + return { + "project_id": "test-project", + "instance_id": "test-instance", + "database_id": "test-database", + "table_name": "test-table", + } + + +@patch("google.adk.tools.spanner.client.get_spanner_client") +def test_similarity_search_knn_success( + mock_get_spanner_client, mock_spanner_ids, mock_credentials +): + """Test similarity_search function with kNN success.""" + mock_spanner_client = MagicMock() + mock_instance = MagicMock() + mock_database = MagicMock() + mock_snapshot = MagicMock() + mock_embedding_result = MagicMock() + mock_embedding_result.one.return_value = ([0.1, 0.2, 0.3],) + # First call to execute_sql is for getting the embedding + # Second call is for the kNN search + mock_snapshot.execute_sql.side_effect = [ + mock_embedding_result, + iter([("result1",), ("result2",)]), + ] + mock_database.snapshot.return_value.__enter__.return_value = mock_snapshot + mock_database.database_dialect = DatabaseDialect.GOOGLE_STANDARD_SQL + mock_instance.database.return_value = mock_database + mock_spanner_client.instance.return_value = mock_instance + mock_get_spanner_client.return_value = mock_spanner_client + + result = search_tool.similarity_search( + project_id=mock_spanner_ids["project_id"], + instance_id=mock_spanner_ids["instance_id"], + database_id=mock_spanner_ids["database_id"], + table_name=mock_spanner_ids["table_name"], + query="test query", + embedding_column_to_search="embedding_col", + columns=["col1"], + embedding_options={"spanner_embedding_model_name": "test_model"}, + credentials=mock_credentials, + settings=MagicMock(), + tool_context=MagicMock(), + ) + assert result["status"] == "SUCCESS", result + assert result["rows"] == [("result1",), ("result2",)] + + # Check the generated SQL for kNN search + call_args = mock_snapshot.execute_sql.call_args + sql = call_args.args[0] + assert "COSINE_DISTANCE" in sql + assert "@embedding" in sql + assert call_args.kwargs == {"params": {"embedding": [0.1, 0.2, 0.3]}} + + +@patch("google.adk.tools.spanner.client.get_spanner_client") +def test_similarity_search_ann_success( + mock_get_spanner_client, mock_spanner_ids, mock_credentials +): + """Test similarity_search function with ANN success.""" + mock_spanner_client = MagicMock() + mock_instance = MagicMock() + mock_database = MagicMock() + mock_snapshot = MagicMock() + mock_embedding_result = MagicMock() + mock_embedding_result.one.return_value = ([0.1, 0.2, 0.3],) + # First call to execute_sql is for getting the embedding + # Second call is for the ANN search + mock_snapshot.execute_sql.side_effect = [ + mock_embedding_result, + iter([("ann_result1",), ("ann_result2",)]), + ] + mock_database.snapshot.return_value.__enter__.return_value = mock_snapshot + mock_database.database_dialect = DatabaseDialect.GOOGLE_STANDARD_SQL + mock_instance.database.return_value = mock_database + mock_spanner_client.instance.return_value = mock_instance + mock_get_spanner_client.return_value = mock_spanner_client + + result = search_tool.similarity_search( + project_id=mock_spanner_ids["project_id"], + instance_id=mock_spanner_ids["instance_id"], + database_id=mock_spanner_ids["database_id"], + table_name=mock_spanner_ids["table_name"], + query="test query", + embedding_column_to_search="embedding_col", + columns=["col1"], + embedding_options={"spanner_embedding_model_name": "test_model"}, + credentials=mock_credentials, + settings=MagicMock(), + tool_context=MagicMock(), + search_options={ + "nearest_neighbors_algorithm": "APPROXIMATE_NEAREST_NEIGHBORS" + }, + ) + assert result["status"] == "SUCCESS", result + assert result["rows"] == [("ann_result1",), ("ann_result2",)] + call_args = mock_snapshot.execute_sql.call_args + sql = call_args.args[0] + assert "APPROX_COSINE_DISTANCE" in sql + assert "@embedding" in sql + assert call_args.kwargs == {"params": {"embedding": [0.1, 0.2, 0.3]}} + + +@patch("google.adk.tools.spanner.client.get_spanner_client") +def test_similarity_search_error( + mock_get_spanner_client, mock_spanner_ids, mock_credentials +): + """Test similarity_search function with a generic error.""" + mock_get_spanner_client.side_effect = Exception("Test Exception") + result = search_tool.similarity_search( + project_id=mock_spanner_ids["project_id"], + instance_id=mock_spanner_ids["instance_id"], + database_id=mock_spanner_ids["database_id"], + table_name=mock_spanner_ids["table_name"], + query="test query", + embedding_column_to_search="embedding_col", + embedding_options={"spanner_embedding_model_name": "test_model"}, + columns=["col1"], + credentials=mock_credentials, + settings=MagicMock(), + tool_context=MagicMock(), + ) + assert result["status"] == "ERROR" + assert result["error_details"] == "Test Exception" + + +@patch("google.adk.tools.spanner.client.get_spanner_client") +def test_similarity_search_postgresql_knn_success( + mock_get_spanner_client, mock_spanner_ids, mock_credentials +): + """Test similarity_search with PostgreSQL dialect for kNN.""" + mock_spanner_client = MagicMock() + mock_instance = MagicMock() + mock_database = MagicMock() + mock_snapshot = MagicMock() + mock_embedding_result = MagicMock() + mock_embedding_result.one.return_value = ([0.1, 0.2, 0.3],) + mock_snapshot.execute_sql.side_effect = [ + mock_embedding_result, + iter([("pg_result",)]), + ] + mock_database.snapshot.return_value.__enter__.return_value = mock_snapshot + mock_database.database_dialect = DatabaseDialect.POSTGRESQL + mock_instance.database.return_value = mock_database + mock_spanner_client.instance.return_value = mock_instance + mock_get_spanner_client.return_value = mock_spanner_client + + result = search_tool.similarity_search( + project_id=mock_spanner_ids["project_id"], + instance_id=mock_spanner_ids["instance_id"], + database_id=mock_spanner_ids["database_id"], + table_name=mock_spanner_ids["table_name"], + query="test query", + embedding_column_to_search="embedding_col", + columns=["col1"], + embedding_options={"vertex_ai_embedding_model_endpoint": "test_endpoint"}, + credentials=mock_credentials, + settings=MagicMock(), + tool_context=MagicMock(), + ) + assert result["status"] == "SUCCESS", result + assert result["rows"] == [("pg_result",)] + call_args = mock_snapshot.execute_sql.call_args + sql = call_args.args[0] + assert "spanner.cosine_distance" in sql + assert "$1" in sql + assert call_args.kwargs == {"params": {"p1": [0.1, 0.2, 0.3]}} + + +@patch("google.adk.tools.spanner.client.get_spanner_client") +def test_similarity_search_postgresql_ann_unsupported( + mock_get_spanner_client, mock_spanner_ids, mock_credentials +): + """Test similarity_search with unsupported ANN for PostgreSQL dialect.""" + mock_spanner_client = MagicMock() + mock_instance = MagicMock() + mock_database = MagicMock() + mock_database.database_dialect = DatabaseDialect.POSTGRESQL + mock_instance.database.return_value = mock_database + mock_spanner_client.instance.return_value = mock_instance + mock_get_spanner_client.return_value = mock_spanner_client + + result = search_tool.similarity_search( + project_id=mock_spanner_ids["project_id"], + instance_id=mock_spanner_ids["instance_id"], + database_id=mock_spanner_ids["database_id"], + table_name=mock_spanner_ids["table_name"], + query="test query", + embedding_column_to_search="embedding_col", + columns=["col1"], + embedding_options={"vertex_ai_embedding_model_endpoint": "test_endpoint"}, + credentials=mock_credentials, + settings=MagicMock(), + tool_context=MagicMock(), + search_options={ + "nearest_neighbors_algorithm": "APPROXIMATE_NEAREST_NEIGHBORS" + }, + ) + assert result["status"] == "ERROR" + assert ( + result["error_details"] + == "APPROXIMATE_NEAREST_NEIGHBORS is not supported for PostgreSQL" + " dialect." + ) + + +@patch("google.adk.tools.spanner.client.get_spanner_client") +def test_similarity_search_missing_spanner_embedding_model_name_error( + mock_get_spanner_client, mock_spanner_ids, mock_credentials +): + """Test similarity_search with missing spanner_embedding_model_name.""" + mock_spanner_client = MagicMock() + mock_instance = MagicMock() + mock_database = MagicMock() + mock_database.database_dialect = DatabaseDialect.GOOGLE_STANDARD_SQL + mock_instance.database.return_value = mock_database + mock_spanner_client.instance.return_value = mock_instance + mock_get_spanner_client.return_value = mock_spanner_client + + result = search_tool.similarity_search( + project_id=mock_spanner_ids["project_id"], + instance_id=mock_spanner_ids["instance_id"], + database_id=mock_spanner_ids["database_id"], + table_name=mock_spanner_ids["table_name"], + query="test query", + embedding_column_to_search="embedding_col", + columns=["col1"], + embedding_options={}, + credentials=mock_credentials, + settings=MagicMock(), + tool_context=MagicMock(), + ) + assert result["status"] == "ERROR" + assert ( + "embedding_options['spanner_embedding_model_name'] must be" + " specified for GoogleSQL dialect." + in result["error_details"] + ) + + +@patch("google.adk.tools.spanner.client.get_spanner_client") +def test_similarity_search_missing_vertex_ai_embedding_model_endpoint_error( + mock_get_spanner_client, mock_spanner_ids, mock_credentials +): + """Test similarity_search with missing vertex_ai_embedding_model_endpoint.""" + mock_spanner_client = MagicMock() + mock_instance = MagicMock() + mock_database = MagicMock() + mock_database.database_dialect = DatabaseDialect.POSTGRESQL + mock_instance.database.return_value = mock_database + mock_spanner_client.instance.return_value = mock_instance + mock_get_spanner_client.return_value = mock_spanner_client + + result = search_tool.similarity_search( + project_id=mock_spanner_ids["project_id"], + instance_id=mock_spanner_ids["instance_id"], + database_id=mock_spanner_ids["database_id"], + table_name=mock_spanner_ids["table_name"], + query="test query", + embedding_column_to_search="embedding_col", + columns=["col1"], + embedding_options={}, + credentials=mock_credentials, + settings=MagicMock(), + tool_context=MagicMock(), + ) + assert result["status"] == "ERROR" + assert ( + "embedding_options['vertex_ai_embedding_model_endpoint'] must " + "be specified for PostgreSQL dialect." + in result["error_details"] + ) diff --git a/tests/unittests/tools/spanner/test_spanner_toolset.py b/tests/unittests/tools/spanner/test_spanner_toolset.py index 73a780f8cf..163832559d 100644 --- a/tests/unittests/tools/spanner/test_spanner_toolset.py +++ b/tests/unittests/tools/spanner/test_spanner_toolset.py @@ -37,7 +37,7 @@ async def test_spanner_toolset_tools_default(): tools = await toolset.get_tools() assert tools is not None - assert len(tools) == 6 + assert len(tools) == 7 assert all([isinstance(tool, GoogleTool) for tool in tools]) expected_tool_names = set([ @@ -47,6 +47,7 @@ async def test_spanner_toolset_tools_default(): "list_named_schemas", "get_table_schema", "execute_sql", + "similarity_search", ]) actual_tool_names = set([tool.name for tool in tools]) assert actual_tool_names == expected_tool_names diff --git a/tests/unittests/tools/test_agent_tool.py b/tests/unittests/tools/test_agent_tool.py index 9a16253ee7..50775ee4c0 100644 --- a/tests/unittests/tools/test_agent_tool.py +++ b/tests/unittests/tools/test_agent_tool.py @@ -12,19 +12,25 @@ # See the License for the specific language governing permissions and # limitations under the License. - +from typing import Any from typing import Literal -from typing import Union from typing import Optional - +from typing import Union from google.adk.agents.callback_context import CallbackContext +from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.llm_agent import Agent +from google.adk.agents.run_config import RunConfig from google.adk.agents.sequential_agent import SequentialAgent +from google.adk.artifacts.in_memory_artifact_service import InMemoryArtifactService +from google.adk.memory.in_memory_memory_service import InMemoryMemoryService from google.adk.models.llm_request import LlmRequest from google.adk.models.llm_response import LlmResponse from google.adk.plugins.base_plugin import BasePlugin +from google.adk.plugins.plugin_manager import PluginManager +from google.adk.sessions.in_memory_session_service import InMemorySessionService from google.adk.tools.agent_tool import AgentTool +from google.adk.tools.tool_context import ToolContext from google.genai import types from google.genai.types import Part from pydantic import BaseModel @@ -54,6 +60,120 @@ def change_state_callback(callback_context: CallbackContext): print('change_state_callback: ', callback_context.state) +@mark.asyncio +async def test_agent_tool_inherits_parent_app_name(monkeypatch): + parent_app_name = 'parent_app' + captured: dict[str, str] = {} + + class RecordingSessionService(InMemorySessionService): + + async def create_session( + self, + *, + app_name: str, + user_id: str, + state: Optional[dict[str, Any]] = None, + session_id: Optional[str] = None, + ): + captured['session_app_name'] = app_name + return await super().create_session( + app_name=app_name, + user_id=user_id, + state=state, + session_id=session_id, + ) + + monkeypatch.setattr( + 'google.adk.sessions.in_memory_session_service.InMemorySessionService', + RecordingSessionService, + ) + + async def _empty_async_generator(): + if False: + yield None + + class StubRunner: + + def __init__( + self, + *, + app_name: str, + agent: Agent, + artifact_service, + session_service, + memory_service, + credential_service, + plugins, + ): + del artifact_service, memory_service, credential_service + captured['runner_app_name'] = app_name + self.agent = agent + self.session_service = session_service + self.plugin_manager = PluginManager(plugins=plugins) + self.app_name = app_name + + def run_async( + self, + *, + user_id: str, + session_id: str, + invocation_id: Optional[str] = None, + new_message: Optional[types.Content] = None, + state_delta: Optional[dict[str, Any]] = None, + run_config: Optional[RunConfig] = None, + ): + del ( + user_id, + session_id, + invocation_id, + new_message, + state_delta, + run_config, + ) + return _empty_async_generator() + + monkeypatch.setattr('google.adk.runners.Runner', StubRunner) + + tool_agent = Agent( + name='tool_agent', + model='test-model', + ) + agent_tool = AgentTool(agent=tool_agent) + root_agent = Agent( + name='root_agent', + model='test-model', + tools=[agent_tool], + ) + + artifact_service = InMemoryArtifactService() + parent_session_service = InMemorySessionService() + parent_session = await parent_session_service.create_session( + app_name=parent_app_name, + user_id='user', + ) + invocation_context = InvocationContext( + artifact_service=artifact_service, + session_service=parent_session_service, + memory_service=InMemoryMemoryService(), + plugin_manager=PluginManager(), + invocation_id='invocation-id', + agent=root_agent, + session=parent_session, + run_config=RunConfig(), + ) + tool_context = ToolContext(invocation_context) + + assert tool_context._invocation_context.app_name == parent_app_name + + await agent_tool.run_async( + args={'request': 'hello'}, + tool_context=tool_context, + ) + + assert captured['runner_app_name'] == parent_app_name + assert captured['session_app_name'] == parent_app_name + + def test_no_schema(): mock_model = testing_utils.MockModel.create( responses=[ @@ -181,7 +301,8 @@ def test_update_state(): assert runner.session.state['state_1'] == 'changed_value' -def test_update_artifacts(): +@mark.asyncio +async def test_update_artifacts(): """The agent tool can read and write artifacts.""" async def before_tool_agent(callback_context: CallbackContext): @@ -222,12 +343,21 @@ async def after_main_agent(callback_context: CallbackContext): runner = testing_utils.InMemoryRunner(root_agent) runner.run('test1') - artifacts_path = f'test_app/test_user/{runner.session_id}' - assert runner.runner.artifact_service.artifacts == { - f'{artifacts_path}/artifact_1': [Part.from_text(text='test')], - f'{artifacts_path}/artifact_2': [Part.from_text(text='test 2')], - f'{artifacts_path}/artifact_3': [Part.from_text(text='test 2 3')], - } + async def load_artifact(filename: str): + return await runner.runner.artifact_service.load_artifact( + app_name='test_app', + user_id='test_user', + session_id=runner.session_id, + filename=filename, + ) + + assert await runner.runner.artifact_service.list_artifact_keys( + app_name='test_app', user_id='test_user', session_id=runner.session_id + ) == ['artifact_1', 'artifact_2', 'artifact_3'] + + assert await load_artifact('artifact_1') == Part.from_text(text='test') + assert await load_artifact('artifact_2') == Part.from_text(text='test 2') + assert await load_artifact('artifact_3') == Part.from_text(text='test 2 3') @mark.parametrize( @@ -239,7 +369,7 @@ async def after_main_agent(callback_context: CallbackContext): ], indirect=True, ) -def test_custom_schema(): +def test_custom_schema(env_variables): class CustomInput(BaseModel): custom_input: str @@ -451,7 +581,9 @@ class CustomOutput2(BaseModel): ], indirect=True, ) -def test_agent_tool_response_schema_no_output_schema_vertex_ai(): +def test_agent_tool_response_schema_no_output_schema_vertex_ai( + env_variables, +): """Test AgentTool with no output schema has string response schema for VERTEX_AI.""" tool_agent = Agent( name='tool_agent', @@ -476,7 +608,9 @@ def test_agent_tool_response_schema_no_output_schema_vertex_ai(): ], indirect=True, ) -def test_agent_tool_response_schema_with_output_schema_vertex_ai(): +def test_agent_tool_response_schema_with_output_schema_vertex_ai( + env_variables, +): """Test AgentTool with output schema has object response schema for VERTEX_AI.""" class CustomOutput(BaseModel): @@ -504,7 +638,9 @@ class CustomOutput(BaseModel): ], indirect=True, ) -def test_agent_tool_response_schema_gemini_api(): +def test_agent_tool_response_schema_gemini_api( + env_variables, +): """Test AgentTool with GEMINI_API variant has no response schema.""" class CustomOutput(BaseModel): @@ -531,7 +667,9 @@ class CustomOutput(BaseModel): ], indirect=True, ) -def test_agent_tool_response_schema_with_input_schema_vertex_ai(): +def test_agent_tool_response_schema_with_input_schema_vertex_ai( + env_variables, +): """Test AgentTool with input and output schemas for VERTEX_AI.""" class CustomInput(BaseModel): @@ -565,7 +703,9 @@ class CustomOutput(BaseModel): ], indirect=True, ) -def test_agent_tool_response_schema_with_input_schema_no_output_vertex_ai(): +def test_agent_tool_response_schema_with_input_schema_no_output_vertex_ai( + env_variables, +): """Test AgentTool with input schema but no output schema for VERTEX_AI.""" class CustomInput(BaseModel): diff --git a/tests/unittests/tools/test_build_function_declaration.py b/tests/unittests/tools/test_build_function_declaration.py index edf3c7128e..f57c3d3838 100644 --- a/tests/unittests/tools/test_build_function_declaration.py +++ b/tests/unittests/tools/test_build_function_declaration.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +from enum import Enum from typing import Dict from typing import List @@ -22,6 +23,7 @@ # TODO: crewai requires python 3.10 as minimum # from crewai_tools import FileReadTool from pydantic import BaseModel +import pytest def test_string_input(): @@ -220,6 +222,34 @@ def simple_function( assert function_decl.parameters.properties['input_dir'].items.type == 'OBJECT' +def test_enums(): + + class InputEnum(Enum): + AGENT = 'agent' + TOOL = 'tool' + + def simple_function(input: InputEnum = InputEnum.AGENT): + return input.value + + function_decl = _automatic_function_calling_util.build_function_declaration( + func=simple_function + ) + + assert function_decl.name == 'simple_function' + assert function_decl.parameters.type == 'OBJECT' + assert function_decl.parameters.properties['input'].type == 'STRING' + assert function_decl.parameters.properties['input'].default == 'agent' + assert function_decl.parameters.properties['input'].enum == ['agent', 'tool'] + + def simple_function_with_wrong_enum(input: InputEnum = 'WRONG_ENUM'): + return input.value + + with pytest.raises(ValueError): + _automatic_function_calling_util.build_function_declaration( + func=simple_function_with_wrong_enum + ) + + def test_basemodel_list(): class ChildInput(BaseModel): input_str: str @@ -360,7 +390,7 @@ def function_string_return(param: str) -> str: assert function_decl.response.type == types.Type.STRING -def test_fucntion_with_no_response_annotations(): +def test_function_with_no_response_annotations(): """Test a function that has no response annotations.""" def transfer_to_agent(agent_name: str, tool_context: ToolContext): diff --git a/tests/unittests/tools/test_crewai_tool.py b/tests/unittests/tools/test_crewai_tool.py new file mode 100644 index 0000000000..8fa8a722c4 --- /dev/null +++ b/tests/unittests/tools/test_crewai_tool.py @@ -0,0 +1,182 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from unittest.mock import MagicMock + +import pytest + +# Skip entire module if Python < 3.10 (must be before crewai_tool import) +pytest.importorskip( + "google.adk.tools.crewai_tool", reason="Requires Python 3.10+" +) + +from google.adk.agents.invocation_context import InvocationContext +from google.adk.sessions.session import Session +from google.adk.tools.crewai_tool import CrewaiTool +from google.adk.tools.tool_context import ToolContext + + +@pytest.fixture +def mock_tool_context() -> ToolContext: + """Fixture that provides a mock ToolContext for testing.""" + mock_invocation_context = MagicMock(spec=InvocationContext) + mock_invocation_context.session = MagicMock(spec=Session) + mock_invocation_context.session.state = MagicMock() + return ToolContext(invocation_context=mock_invocation_context) + + +def _simple_crewai_tool(*args, **kwargs): + """Simple CrewAI-style tool that accepts any keyword arguments.""" + return { + "search_query": kwargs.get("search_query"), + "other_param": kwargs.get("other_param"), + } + + +def _crewai_tool_with_context(tool_context: ToolContext, *args, **kwargs): + """CrewAI tool with explicit tool_context parameter.""" + return { + "search_query": kwargs.get("search_query"), + "tool_context_present": bool(tool_context), + } + + +class MockCrewaiBaseTool: + """Mock CrewAI BaseTool for testing.""" + + def __init__(self, run_func, name="mock_tool", description="Mock tool"): + self.run = run_func + self.name = name + self.description = description + self.args_schema = MagicMock() + self.args_schema.model_json_schema.return_value = { + "type": "object", + "properties": { + "search_query": {"type": "string", "description": "Search query"} + }, + } + + +def test_crewai_tool_initialization(): + """Test CrewaiTool initialization with various parameters.""" + mock_crewai_tool = MockCrewaiBaseTool(_simple_crewai_tool) + + # Test with custom name and description + tool = CrewaiTool( + mock_crewai_tool, + name="custom_search_tool", + description="Custom search tool description", + ) + + assert tool.name == "custom_search_tool" + assert tool.description == "Custom search tool description" + assert tool.tool == mock_crewai_tool + + +def test_crewai_tool_initialization_with_tool_defaults(): + """Test CrewaiTool initialization using tool's default name and description.""" + mock_crewai_tool = MockCrewaiBaseTool( + _simple_crewai_tool, + name="Serper Dev Tool", + description="Search the internet with Serper", + ) + + # Test with empty name and description (should use tool defaults) + tool = CrewaiTool(mock_crewai_tool, name="", description="") + + assert ( + tool.name == "serper_dev_tool" + ) # Spaces replaced with underscores, lowercased + assert tool.description == "Search the internet with Serper" + + +@pytest.mark.asyncio +async def test_crewai_tool_basic_functionality(mock_tool_context): + """Test basic CrewaiTool functionality with **kwargs parameter passing.""" + mock_crewai_tool = MockCrewaiBaseTool(_simple_crewai_tool) + tool = CrewaiTool(mock_crewai_tool, name="test_tool", description="Test tool") + + # Test that **kwargs parameters are passed through correctly + result = await tool.run_async( + args={"search_query": "test query", "other_param": "test value"}, + tool_context=mock_tool_context, + ) + + assert result["search_query"] == "test query" + assert result["other_param"] == "test value" + + +@pytest.mark.asyncio +async def test_crewai_tool_with_tool_context(mock_tool_context): + """Test CrewaiTool with a tool that has explicit tool_context parameter.""" + mock_crewai_tool = MockCrewaiBaseTool(_crewai_tool_with_context) + tool = CrewaiTool( + mock_crewai_tool, name="context_tool", description="Context tool" + ) + + # Test that tool_context is properly injected + result = await tool.run_async( + args={"search_query": "test query"}, + tool_context=mock_tool_context, + ) + + assert result["search_query"] == "test query" + assert result["tool_context_present"] is True + + +@pytest.mark.asyncio +async def test_crewai_tool_parameter_filtering(mock_tool_context): + """Test that CrewaiTool filters parameters for non-**kwargs functions.""" + + def explicit_params_func(arg1: str, arg2: int): + """Function with explicit parameters (no **kwargs).""" + return {"arg1": arg1, "arg2": arg2} + + mock_crewai_tool = MockCrewaiBaseTool(explicit_params_func) + tool = CrewaiTool( + mock_crewai_tool, name="explicit_tool", description="Explicit tool" + ) + + # Test that unexpected parameters are filtered out + result = await tool.run_async( + args={ + "arg1": "test", + "arg2": 42, + "unexpected_param": "should_be_filtered", + }, + tool_context=mock_tool_context, + ) + + assert result == {"arg1": "test", "arg2": 42} + # Verify unexpected parameter was filtered out + assert "unexpected_param" not in result + + +@pytest.mark.asyncio +async def test_crewai_tool_get_declaration(): + """Test that CrewaiTool properly builds function declarations.""" + mock_crewai_tool = MockCrewaiBaseTool(_simple_crewai_tool) + tool = CrewaiTool(mock_crewai_tool, name="test_tool", description="Test tool") + + # Test function declaration generation + declaration = tool._get_declaration() + + # Verify the declaration object structure and content + assert declaration is not None + assert declaration.name == "test_tool" + assert declaration.description == "Test tool" + assert declaration.parameters is not None + + # Verify that the args_schema was used to build the declaration + mock_crewai_tool.args_schema.model_json_schema.assert_called_once() diff --git a/tests/unittests/tools/test_discovery_engine_search_tool.py b/tests/unittests/tools/test_discovery_engine_search_tool.py new file mode 100644 index 0000000000..d10da252c7 --- /dev/null +++ b/tests/unittests/tools/test_discovery_engine_search_tool.py @@ -0,0 +1,138 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from unittest import mock + +from google.adk.tools.discovery_engine_search_tool import DiscoveryEngineSearchTool +from google.api_core import exceptions +from google.cloud import discoveryengine_v1beta as discoveryengine +import pytest + + +@mock.patch( + "google.auth.default", + mock.MagicMock(return_value=("credentials", "project")), +) +class TestDiscoveryEngineSearchTool: + """Test the DiscoveryEngineSearchTool class.""" + + def test_init_with_data_store_id(self): + """Test initialization with data_store_id.""" + tool = DiscoveryEngineSearchTool(data_store_id="test_data_store") + assert ( + tool._serving_config == "test_data_store/servingConfigs/default_config" + ) + + def test_init_with_search_engine_id(self): + """Test initialization with search_engine_id.""" + tool = DiscoveryEngineSearchTool(search_engine_id="test_search_engine") + assert ( + tool._serving_config + == "test_search_engine/servingConfigs/default_config" + ) + + def test_init_with_no_ids_raises_error(self): + """Test that initialization with no IDs raises ValueError.""" + with pytest.raises( + ValueError, + match="Either data_store_id or search_engine_id must be specified.", + ): + DiscoveryEngineSearchTool() + + def test_init_with_both_ids_raises_error(self): + """Test that initialization with both IDs raises ValueError.""" + with pytest.raises( + ValueError, + match="Either data_store_id or search_engine_id must be specified.", + ): + DiscoveryEngineSearchTool( + data_store_id="test_data_store", + search_engine_id="test_search_engine", + ) + + def test_init_with_data_store_specs_without_search_engine_id_raises_error( + self, + ): + """Test that data_store_specs without search_engine_id raises ValueError.""" + with pytest.raises( + ValueError, + match=( + "search_engine_id must be specified if data_store_specs is" + " specified." + ), + ): + DiscoveryEngineSearchTool( + data_store_id="test_data_store", data_store_specs=[{"id": "123"}] + ) + + @mock.patch( + "google.cloud.discoveryengine_v1beta.SearchServiceClient", + ) + def test_discovery_engine_search_success(self, mock_search_client): + """Test successful discovery engine search.""" + mock_response = discoveryengine.SearchResponse() + mock_response.results = [ + discoveryengine.SearchResponse.SearchResult( + chunk=discoveryengine.Chunk( + document_metadata={ + "title": "Test Title", + "uri": "gs://test_bucket/test_file", + "struct_data": { + "key1": "value1", + "uri": "http://example.com", + }, + }, + content="Test Content", + ) + ) + ] + mock_search_client.return_value.search.return_value = mock_response + + tool = DiscoveryEngineSearchTool(data_store_id="test_data_store") + result = tool.discovery_engine_search("test query") + + assert result["status"] == "success" + assert len(result["results"]) == 1 + assert result["results"][0]["title"] == "Test Title" + assert result["results"][0]["url"] == "http://example.com" + assert result["results"][0]["content"] == "Test Content" + + @mock.patch( + "google.cloud.discoveryengine_v1beta.SearchServiceClient", + ) + def test_discovery_engine_search_api_error(self, mock_search_client): + """Test discovery engine search with API error.""" + mock_search_client.return_value.search.side_effect = ( + exceptions.GoogleAPICallError("API error") + ) + + tool = DiscoveryEngineSearchTool(data_store_id="test_data_store") + result = tool.discovery_engine_search("test query") + + assert result["status"] == "error" + assert result["error_message"] == "None API error" + + @mock.patch( + "google.cloud.discoveryengine_v1beta.SearchServiceClient", + ) + def test_discovery_engine_search_no_results(self, mock_search_client): + """Test discovery engine search with no results.""" + mock_response = discoveryengine.SearchResponse() + mock_search_client.return_value.search.return_value = mock_response + + tool = DiscoveryEngineSearchTool(data_store_id="test_data_store") + result = tool.discovery_engine_search("test query") + + assert result["status"] == "success" + assert not result["results"] diff --git a/tests/unittests/tools/test_enterprise_web_search_tool.py b/tests/unittests/tools/test_enterprise_web_search_tool.py index 390da4a78b..9eabcf0bab 100644 --- a/tests/unittests/tools/test_enterprise_web_search_tool.py +++ b/tests/unittests/tools/test_enterprise_web_search_tool.py @@ -93,6 +93,4 @@ async def test_process_llm_request_failure_with_multiple_tools_gemini_1_models() await tool.process_llm_request( tool_context=tool_context, llm_request=llm_request ) - assert 'can not be used with other tools in Gemini 1.x.' in str( - exc_info.value - ) + assert 'cannot be used with other tools in Gemini 1.x.' in str(exc_info.value) diff --git a/tests/unittests/tools/test_function_tool.py b/tests/unittests/tools/test_function_tool.py index e7854a2c87..78610d330d 100644 --- a/tests/unittests/tools/test_function_tool.py +++ b/tests/unittests/tools/test_function_tool.py @@ -22,6 +22,15 @@ import pytest +@pytest.fixture +def mock_tool_context() -> ToolContext: + """Fixture that provides a mock ToolContext for testing.""" + mock_invocation_context = MagicMock(spec=InvocationContext) + mock_invocation_context.session = MagicMock(spec=Session) + mock_invocation_context.session.state = MagicMock() + return ToolContext(invocation_context=mock_invocation_context) + + def function_for_testing_with_no_args(): """Function for testing with no args.""" pass @@ -30,14 +39,14 @@ def function_for_testing_with_no_args(): async def async_function_for_testing_with_1_arg_and_tool_context( arg1, tool_context ): - """Async function for testing with 1 arge and tool context.""" + """Async function for testing with 1 arg and tool context.""" assert arg1 assert tool_context return arg1 async def async_function_for_testing_with_2_arg_and_no_tool_context(arg1, arg2): - """Async function for testing with 2 arge and no tool context.""" + """Async function for testing with 2 args and no tool context.""" assert arg1 assert arg2 return arg1 @@ -56,7 +65,7 @@ async def __call__(self, arg1, arg2): def function_for_testing_with_1_arg_and_tool_context(arg1, tool_context): - """Function for testing with 1 arge and tool context.""" + """Function for testing with 1 arg and tool context.""" assert arg1 assert tool_context return arg1 @@ -72,7 +81,7 @@ async def __call__(self, arg1, tool_context): def function_for_testing_with_2_arg_and_no_tool_context(arg1, arg2): - """Function for testing with 2 arge and no tool context.""" + """Function for testing with 2 args and no tool context.""" assert arg1 assert arg2 return arg1 @@ -274,7 +283,7 @@ async def test_run_async_missing_all_arg_async_func(): @pytest.mark.asyncio async def test_run_async_with_optional_args_not_set_sync_func(): - """Test that run_async calls the function for sync funciton with optional args not set.""" + """Test that run_async calls the function for sync function with optional args not set.""" def func_with_optional_args(arg1, arg2=None, *, arg3, arg4=None, **kwargs): return f"{arg1},{arg3}" @@ -287,7 +296,7 @@ def func_with_optional_args(arg1, arg2=None, *, arg3, arg4=None, **kwargs): @pytest.mark.asyncio async def test_run_async_with_optional_args_not_set_async_func(): - """Test that run_async calls the function for async funciton with optional args not set.""" + """Test that run_async calls the function for async function with optional args not set.""" async def async_func_with_optional_args( arg1, arg2=None, *, arg3, arg4=None, **kwargs @@ -394,3 +403,28 @@ def sample_func(arg1: str): tool_context=tool_context_mock, ) assert result == {"received_arg": "hello"} + + +@pytest.mark.asyncio +async def test_run_async_parameter_filtering(mock_tool_context): + """Test that parameter filtering works correctly for functions with explicit parameters.""" + + def explicit_params_func(arg1: str, arg2: int): + """Function with explicit parameters (no **kwargs).""" + return {"arg1": arg1, "arg2": arg2} + + tool = FunctionTool(explicit_params_func) + + # Test that unexpected parameters are still filtered out for non-kwargs functions + result = await tool.run_async( + args={ + "arg1": "test", + "arg2": 42, + "unexpected_param": "should_be_filtered", + }, + tool_context=mock_tool_context, + ) + + assert result == {"arg1": "test", "arg2": 42} + # Explicitly verify that unexpected_param was filtered out and not passed to the function + assert "unexpected_param" not in result diff --git a/tests/unittests/tools/test_function_tool_pydantic.py b/tests/unittests/tools/test_function_tool_pydantic.py new file mode 100644 index 0000000000..1af5d68345 --- /dev/null +++ b/tests/unittests/tools/test_function_tool_pydantic.py @@ -0,0 +1,284 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Pydantic model conversion tests + +from typing import Optional +from unittest.mock import MagicMock + +from google.adk.agents.invocation_context import InvocationContext +from google.adk.sessions.session import Session +from google.adk.tools.function_tool import FunctionTool +from google.adk.tools.tool_context import ToolContext +import pydantic +import pytest + + +class UserModel(pydantic.BaseModel): + """Test Pydantic model for user data.""" + + name: str + age: int + email: Optional[str] = None + + +class PreferencesModel(pydantic.BaseModel): + """Test Pydantic model for preferences.""" + + theme: str = "light" + notifications: bool = True + + +def sync_function_with_pydantic_model(user: UserModel) -> dict: + """Sync function that takes a Pydantic model.""" + return { + "name": user.name, + "age": user.age, + "email": user.email, + "type": str(type(user).__name__), + } + + +async def async_function_with_pydantic_model(user: UserModel) -> dict: + """Async function that takes a Pydantic model.""" + return { + "name": user.name, + "age": user.age, + "email": user.email, + "type": str(type(user).__name__), + } + + +def function_with_optional_pydantic_model( + user: UserModel, preferences: Optional[PreferencesModel] = None +) -> dict: + """Function with required and optional Pydantic models.""" + result = { + "user_name": user.name, + "user_type": str(type(user).__name__), + } + if preferences: + result.update({ + "theme": preferences.theme, + "notifications": preferences.notifications, + "preferences_type": str(type(preferences).__name__), + }) + return result + + +def function_with_mixed_args( + name: str, user: UserModel, count: int = 5 +) -> dict: + """Function with mixed argument types including Pydantic model.""" + return { + "name": name, + "user_name": user.name, + "user_type": str(type(user).__name__), + "count": count, + } + + +def test_preprocess_args_with_dict_to_pydantic_conversion(): + """Test _preprocess_args converts dict to Pydantic model.""" + tool = FunctionTool(sync_function_with_pydantic_model) + + input_args = { + "user": {"name": "Alice", "age": 30, "email": "alice@example.com"} + } + + processed_args = tool._preprocess_args(input_args) + + # Check that the dict was converted to a Pydantic model + assert "user" in processed_args + user = processed_args["user"] + assert isinstance(user, UserModel) + assert user.name == "Alice" + assert user.age == 30 + assert user.email == "alice@example.com" + + +def test_preprocess_args_with_existing_pydantic_model(): + """Test _preprocess_args leaves existing Pydantic model unchanged.""" + tool = FunctionTool(sync_function_with_pydantic_model) + + # Create an existing Pydantic model + existing_user = UserModel(name="Bob", age=25) + input_args = {"user": existing_user} + + processed_args = tool._preprocess_args(input_args) + + # Check that the existing model was not changed (same object) + assert "user" in processed_args + user = processed_args["user"] + assert user is existing_user + assert isinstance(user, UserModel) + assert user.name == "Bob" + + +def test_preprocess_args_with_optional_pydantic_model_none(): + """Test _preprocess_args handles None for optional Pydantic models.""" + tool = FunctionTool(function_with_optional_pydantic_model) + + input_args = {"user": {"name": "Charlie", "age": 35}, "preferences": None} + + processed_args = tool._preprocess_args(input_args) + + # Check user conversion + assert isinstance(processed_args["user"], UserModel) + assert processed_args["user"].name == "Charlie" + + # Check preferences remains None + assert processed_args["preferences"] is None + + +def test_preprocess_args_with_optional_pydantic_model_dict(): + """Test _preprocess_args converts dict for optional Pydantic models.""" + tool = FunctionTool(function_with_optional_pydantic_model) + + input_args = { + "user": {"name": "Diana", "age": 28}, + "preferences": {"theme": "dark", "notifications": False}, + } + + processed_args = tool._preprocess_args(input_args) + + # Check both conversions + assert isinstance(processed_args["user"], UserModel) + assert processed_args["user"].name == "Diana" + + assert isinstance(processed_args["preferences"], PreferencesModel) + assert processed_args["preferences"].theme == "dark" + assert processed_args["preferences"].notifications is False + + +def test_preprocess_args_with_mixed_types(): + """Test _preprocess_args handles mixed argument types correctly.""" + tool = FunctionTool(function_with_mixed_args) + + input_args = { + "name": "test_name", + "user": {"name": "Eve", "age": 40}, + "count": 10, + } + + processed_args = tool._preprocess_args(input_args) + + # Check that only Pydantic model was converted + assert processed_args["name"] == "test_name" # string unchanged + assert processed_args["count"] == 10 # int unchanged + + # Check Pydantic model conversion + assert isinstance(processed_args["user"], UserModel) + assert processed_args["user"].name == "Eve" + assert processed_args["user"].age == 40 + + +def test_preprocess_args_with_invalid_data_graceful_failure(): + """Test _preprocess_args handles invalid data gracefully.""" + tool = FunctionTool(sync_function_with_pydantic_model) + + # Invalid data that can't be converted to UserModel + input_args = {"user": "invalid_string"} # string instead of dict/model + + processed_args = tool._preprocess_args(input_args) + + # Should keep original value when conversion fails + assert processed_args["user"] == "invalid_string" + + +def test_preprocess_args_with_non_pydantic_parameters(): + """Test _preprocess_args ignores non-Pydantic parameters.""" + + def simple_function(name: str, age: int) -> dict: + return {"name": name, "age": age} + + tool = FunctionTool(simple_function) + + input_args = {"name": "test", "age": 25} + processed_args = tool._preprocess_args(input_args) + + # Should remain unchanged (no Pydantic models to convert) + assert processed_args == input_args + + +@pytest.mark.asyncio +async def test_run_async_with_pydantic_model_conversion_sync_function(): + """Test run_async with Pydantic model conversion for sync function.""" + tool = FunctionTool(sync_function_with_pydantic_model) + + tool_context_mock = MagicMock(spec=ToolContext) + invocation_context_mock = MagicMock(spec=InvocationContext) + session_mock = MagicMock(spec=Session) + invocation_context_mock.session = session_mock + tool_context_mock.invocation_context = invocation_context_mock + + args = {"user": {"name": "Frank", "age": 45, "email": "frank@example.com"}} + + result = await tool.run_async(args=args, tool_context=tool_context_mock) + + # Verify the function received a proper Pydantic model + assert result["name"] == "Frank" + assert result["age"] == 45 + assert result["email"] == "frank@example.com" + assert result["type"] == "UserModel" + + +@pytest.mark.asyncio +async def test_run_async_with_pydantic_model_conversion_async_function(): + """Test run_async with Pydantic model conversion for async function.""" + tool = FunctionTool(async_function_with_pydantic_model) + + tool_context_mock = MagicMock(spec=ToolContext) + invocation_context_mock = MagicMock(spec=InvocationContext) + session_mock = MagicMock(spec=Session) + invocation_context_mock.session = session_mock + tool_context_mock.invocation_context = invocation_context_mock + + args = {"user": {"name": "Grace", "age": 32}} + + result = await tool.run_async(args=args, tool_context=tool_context_mock) + + # Verify the function received a proper Pydantic model + assert result["name"] == "Grace" + assert result["age"] == 32 + assert result["email"] is None # default value + assert result["type"] == "UserModel" + + +@pytest.mark.asyncio +async def test_run_async_with_optional_pydantic_models(): + """Test run_async with optional Pydantic models.""" + tool = FunctionTool(function_with_optional_pydantic_model) + + tool_context_mock = MagicMock(spec=ToolContext) + invocation_context_mock = MagicMock(spec=InvocationContext) + session_mock = MagicMock(spec=Session) + invocation_context_mock.session = session_mock + tool_context_mock.invocation_context = invocation_context_mock + + # Test with both required and optional models + args = { + "user": {"name": "Henry", "age": 50}, + "preferences": {"theme": "dark", "notifications": True}, + } + + result = await tool.run_async(args=args, tool_context=tool_context_mock) + + assert result["user_name"] == "Henry" + assert result["user_type"] == "UserModel" + assert result["theme"] == "dark" + assert result["notifications"] is True + assert result["preferences_type"] == "PreferencesModel" + assert result["preferences_type"] == "PreferencesModel" + assert result["preferences_type"] == "PreferencesModel" diff --git a/tests/unittests/tools/test_gemini_schema_util.py b/tests/unittests/tools/test_gemini_schema_util.py index 31057a41ad..ff38f07ae2 100644 --- a/tests/unittests/tools/test_gemini_schema_util.py +++ b/tests/unittests/tools/test_gemini_schema_util.py @@ -65,8 +65,9 @@ def test_to_gemini_schema_array_string_types(self): "nonnullable_string": {"type": ["string"]}, "nullable_string": {"type": ["string", "null"]}, "nullable_number": {"type": ["null", "integer"]}, - "object_nullable": {"type": "null"}, + "nullable_object": {"type": ["object", "null"]}, "multi_types_nullable": {"type": ["string", "null", "integer"]}, + "only_null": {"type": "null"}, "empty_default_object": {}, }, } @@ -84,12 +85,18 @@ def test_to_gemini_schema_array_string_types(self): assert gemini_schema.properties["nullable_number"].type == Type.INTEGER assert gemini_schema.properties["nullable_number"].nullable - assert gemini_schema.properties["object_nullable"].type == Type.OBJECT - assert gemini_schema.properties["object_nullable"].nullable + assert gemini_schema.properties["nullable_object"].type == Type.OBJECT + assert gemini_schema.properties["nullable_object"].nullable - assert gemini_schema.properties["multi_types_nullable"].type == Type.STRING + assert gemini_schema.properties["multi_types_nullable"].any_of == [ + Schema(type=Type.STRING), + Schema(type=Type.INTEGER), + ] assert gemini_schema.properties["multi_types_nullable"].nullable + assert gemini_schema.properties["only_null"].type is None + assert gemini_schema.properties["only_null"].nullable + assert gemini_schema.properties["empty_default_object"].type == Type.OBJECT assert gemini_schema.properties["empty_default_object"].nullable is None @@ -146,6 +153,14 @@ def test_to_gemini_schema_any_of(self): assert gemini_schema.any_of[0].type == Type.STRING assert gemini_schema.any_of[1].type == Type.INTEGER + def test_to_gemini_schema_any_of_nullable(self): + openapi_schema = { + "anyOf": [{"type": "string"}, {"type": "null"}], + } + gemini_schema = _to_gemini_schema(openapi_schema) + assert gemini_schema.type == Type.STRING + assert gemini_schema.nullable + def test_to_gemini_schema_general_list(self): openapi_schema = { "type": "array", @@ -185,7 +200,7 @@ def test_to_gemini_schema_nested_dict(self): }, } gemini_schema = _to_gemini_schema(openapi_schema) - # Since metadata is not properties nor item, it will call to_gemini_schema recursively. + # Since metadata is neither properties nor item, it will call to_gemini_schema recursively. assert isinstance(gemini_schema.properties["metadata"], Schema) assert ( gemini_schema.properties["metadata"].type == Type.OBJECT @@ -224,6 +239,64 @@ def test_to_gemini_schema_remove_unrecognized_fields(self): assert gemini_schema.type == Type.STRING assert not gemini_schema.format + def test_to_gemini_schema_nested_dict_with_defs_and_ref(self): + """Test that nested dict with $defs and $refs is converted correctly.""" + openapi_schema = { + "$defs": { + "DeviceEnum": { + "enum": ["GLOBAL", "desktop", "mobile"], + "title": "DeviceEnum", + "type": "string", + }, + "DomainPayload": { + "properties": { + "adDomain": { + "description": "List of one or many domains.", + "items": {"type": "string"}, + "title": "Addomain", + "type": "array", + }, + "device": { + "$ref": "#/$defs/DeviceEnum", + "default": "GLOBAL", + "description": ( + "Filter by device. All devices are returned by" + " default." + ), + }, + }, + "required": ["adDomain"], + "title": "DomainPayload", + "type": "object", + }, + }, + "properties": {"payload": {"$ref": "#/$defs/DomainPayload"}}, + "required": ["payload"], + "title": "query_domainsArguments", + "type": "object", + } + gemini_schema = _to_gemini_schema(openapi_schema) + assert gemini_schema.type == Type.OBJECT + assert gemini_schema.properties["payload"].type == Type.OBJECT + assert ( + gemini_schema.properties["payload"].properties["adDomain"].type + == Type.ARRAY + ) + assert ( + gemini_schema.properties["payload"].properties["adDomain"].items.type + == Type.STRING + ) + assert ( + gemini_schema.properties["payload"].properties["device"].type + == Type.STRING + ) + assert gemini_schema.properties["payload"].properties["device"].enum == [ + "GLOBAL", + "desktop", + "mobile", + ] + assert gemini_schema.properties["payload"].required == ["adDomain"] + def test_sanitize_integer_formats(self): """Test that int32 and int64 formats are preserved for integer types""" openapi_schema = { @@ -471,12 +544,14 @@ def test_sanitize_schema_formats_for_gemini_nullable(self): "properties": { "case_id": { "description": "The ID of the case.", - "title": "Case Id", + "title": "Case ID", "type": "string", }, "next_page_token": { - "anyOf": [{"type": "string"}, {"type": "null"}], - "default": None, + "any_of": [ + {"type": "string"}, + {"type": ["object", "null"]}, + ], "description": ( "The nextPageToken to fetch the next page of results." ), @@ -492,7 +567,7 @@ def test_sanitize_schema_formats_for_gemini_nullable(self): "properties": { "case_id": { "description": "The ID of the case.", - "title": "Case Id", + "title": "Case ID", "type": "string", }, "next_page_token": { diff --git a/tests/unittests/tools/test_google_search_agent_tool.py b/tests/unittests/tools/test_google_search_agent_tool.py new file mode 100644 index 0000000000..dc9d960490 --- /dev/null +++ b/tests/unittests/tools/test_google_search_agent_tool.py @@ -0,0 +1,139 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from google.adk.agents.invocation_context import InvocationContext +from google.adk.agents.llm_agent import Agent +from google.adk.models.llm_response import LlmResponse +from google.adk.sessions.in_memory_session_service import InMemorySessionService +from google.adk.tools.google_search_agent_tool import GoogleSearchAgentTool +from google.adk.tools.tool_context import ToolContext +from google.genai import types +from google.genai.types import Part +from pytest import mark + +from .. import testing_utils + +function_call_no_schema = Part.from_function_call( + name='tool_agent', args={'request': 'test1'} +) + +grounding_metadata = types.GroundingMetadata(web_search_queries=['test query']) + + +# TODO(b/448114567): Remove test_grounding_metadata_ tests once the workaround +# is no longer needed. + + +@mark.asyncio +async def test_grounding_metadata_is_stored_in_state_during_invocation(): + """Verify grounding_metadata is stored in the state during invocation.""" + + # Mock model for the tool_agent that returns grounding_metadata + tool_agent_model = testing_utils.MockModel.create( + responses=[ + LlmResponse( + content=types.Content( + parts=[Part.from_text(text='response from tool')] + ), + grounding_metadata=grounding_metadata, + ) + ] + ) + + tool_agent = Agent( + name='tool_agent', + model=tool_agent_model, + ) + + agent_tool = GoogleSearchAgentTool(agent=tool_agent) + + session_service = InMemorySessionService() + session = await session_service.create_session( + app_name='test_app', user_id='test_user' + ) + + invocation_context = InvocationContext( + invocation_id='invocation_id', + agent=tool_agent, + session=session, + session_service=session_service, + ) + tool_context = ToolContext(invocation_context=invocation_context) + tool_result = await agent_tool.run_async( + args=function_call_no_schema.function_call.args, tool_context=tool_context + ) + + # Verify the tool result + assert tool_result == 'response from tool' + + # Verify grounding_metadata is stored in the state + assert tool_context.state['temp:_adk_grounding_metadata'] == ( + grounding_metadata + ) + + +@mark.asyncio +async def test_grounding_metadata_is_not_stored_in_state_after_invocation(): + """Verify grounding_metadata is not stored in the state after invocation.""" + + # Mock model for the tool_agent that returns grounding_metadata + tool_agent_model = testing_utils.MockModel.create( + responses=[ + LlmResponse( + content=types.Content( + parts=[Part.from_text(text='response from tool')] + ), + grounding_metadata=grounding_metadata, + ) + ] + ) + + tool_agent = Agent( + name='tool_agent', + model=tool_agent_model, + ) + + # Mock model for the root_agent + root_agent_model = testing_utils.MockModel.create( + responses=[ + function_call_no_schema, # Call the tool_agent + 'Final response from root', + ] + ) + + root_agent = Agent( + name='root_agent', + model=root_agent_model, + tools=[GoogleSearchAgentTool(agent=tool_agent)], + ) + + runner = testing_utils.InMemoryRunner(root_agent) + events = runner.run('test input') + + # Find the function response event + function_response_event = None + for event in events: + if event.get_function_responses(): + function_response_event = event + break + + # Verify the function response + assert function_response_event is not None + function_responses = function_response_event.get_function_responses() + assert len(function_responses) == 1 + tool_output = function_responses[0].response + assert tool_output == {'result': 'response from tool'} + + # Verify grounding_metadata is not stored in the root_agent's state + assert 'temp:_adk_grounding_metadata' not in runner.session.state diff --git a/tests/unittests/tools/test_google_search_tool.py b/tests/unittests/tools/test_google_search_tool.py index 9623875aaa..2f090abb17 100644 --- a/tests/unittests/tools/test_google_search_tool.py +++ b/tests/unittests/tools/test_google_search_tool.py @@ -186,7 +186,7 @@ async def test_process_llm_request_with_gemini_1_model_and_existing_tools_raises with pytest.raises( ValueError, match=( - 'Google search tool can not be used with other tools in Gemini 1.x' + 'Google search tool cannot be used with other tools in Gemini 1.x' ), ): await tool.process_llm_request( @@ -215,7 +215,7 @@ async def test_process_llm_request_with_path_based_gemini_1_model_and_existing_t with pytest.raises( ValueError, match=( - 'Google search tool can not be used with other tools in Gemini 1.x' + 'Google search tool cannot be used with other tools in Gemini 1.x' ), ): await tool.process_llm_request( diff --git a/tests/unittests/tools/test_langchain_tool.py b/tests/unittests/tools/test_langchain_tool.py index 998b3131ef..fdcadff87d 100644 --- a/tests/unittests/tools/test_langchain_tool.py +++ b/tests/unittests/tools/test_langchain_tool.py @@ -15,7 +15,7 @@ from unittest.mock import MagicMock from google.adk.tools.langchain_tool import LangchainTool -from langchain.tools import tool +from langchain_core.tools import tool from langchain_core.tools.structured import StructuredTool from pydantic import BaseModel import pytest diff --git a/tests/unittests/tools/test_mcp_toolset.py b/tests/unittests/tools/test_mcp_toolset.py new file mode 100644 index 0000000000..95c552ef41 --- /dev/null +++ b/tests/unittests/tools/test_mcp_toolset.py @@ -0,0 +1,89 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Unit tests for McpToolset.""" + +import sys +from unittest.mock import AsyncMock +from unittest.mock import MagicMock + +import pytest + +# Skip all tests in this module if Python version is less than 3.10 +pytestmark = pytest.mark.skipif( + sys.version_info < (3, 10), reason="MCP tool requires Python 3.10+" +) + +# Import dependencies with version checking +try: + from google.adk.tools.mcp_tool.mcp_toolset import McpToolset +except ImportError as e: + if sys.version_info < (3, 10): + # Create dummy classes to prevent NameError during test collection + # Tests will be skipped anyway due to pytestmark + class DummyClass: + pass + + McpToolset = DummyClass + else: + raise e + + +@pytest.mark.asyncio +async def test_mcp_toolset_with_prefix(): + """Test that McpToolset correctly applies the tool_name_prefix.""" + # Mock the connection parameters + mock_connection_params = MagicMock() + + # Mock the MCPSessionManager and its create_session method + mock_session_manager = MagicMock() + mock_session = MagicMock() + + # Mock the list_tools response from the MCP server + mock_tool1 = MagicMock() + mock_tool1.name = "tool1" + mock_tool1.description = "tool 1 desc" + mock_tool2 = MagicMock() + mock_tool2.name = "tool2" + mock_tool2.description = "tool 2 desc" + list_tools_result = MagicMock() + list_tools_result.tools = [mock_tool1, mock_tool2] + mock_session.list_tools = AsyncMock(return_value=list_tools_result) + mock_session_manager.create_session = AsyncMock(return_value=mock_session) + + # Create an instance of McpToolset with a prefix + toolset = McpToolset( + connection_params=mock_connection_params, + tool_name_prefix="my_prefix", + ) + + # Replace the internal session manager with our mock + toolset._mcp_session_manager = mock_session_manager + + # Get the tools from the toolset + tools = await toolset.get_tools() + + # The get_tools method in McpToolset returns MCPTool objects, which are + # instances of BaseTool. The prefixing is handled by the BaseToolset, + # so we need to call get_tools_with_prefix to get the prefixed tools. + prefixed_tools = await toolset.get_tools_with_prefix() + + # Assert that the tools are prefixed correctly + assert len(prefixed_tools) == 2 + assert prefixed_tools[0].name == "my_prefix_tool1" + assert prefixed_tools[1].name == "my_prefix_tool2" + + # Assert that the original tools are not modified + assert tools[0].name == "tool1" + assert tools[1].name == "tool2" diff --git a/tests/unittests/tools/test_url_context_tool.py b/tests/unittests/tools/test_url_context_tool.py index cbbbb0c9a1..eaa7391593 100644 --- a/tests/unittests/tools/test_url_context_tool.py +++ b/tests/unittests/tools/test_url_context_tool.py @@ -146,7 +146,7 @@ async def test_process_llm_request_with_gemini_1_model_raises_error(self): ) with pytest.raises( - ValueError, match='Url context tool can not be used in Gemini 1.x' + ValueError, match='Url context tool cannot be used in Gemini 1.x' ): await tool.process_llm_request( tool_context=tool_context, llm_request=llm_request @@ -166,7 +166,7 @@ async def test_process_llm_request_with_path_based_gemini_1_model_raises_error( ) with pytest.raises( - ValueError, match='Url context tool can not be used in Gemini 1.x' + ValueError, match='Url context tool cannot be used in Gemini 1.x' ): await tool.process_llm_request( tool_context=tool_context, llm_request=llm_request diff --git a/tests/unittests/tools/test_vertex_ai_search_tool.py b/tests/unittests/tools/test_vertex_ai_search_tool.py index 12ee2f60f4..0df19288a3 100644 --- a/tests/unittests/tools/test_vertex_ai_search_tool.py +++ b/tests/unittests/tools/test_vertex_ai_search_tool.py @@ -207,7 +207,7 @@ async def test_process_llm_request_with_gemini_1_and_other_tools_raises_error( with pytest.raises( ValueError, match=( - 'Vertex AI search tool can not be used with other tools in' + 'Vertex AI search tool cannot be used with other tools in' ' Gemini 1.x' ), ): @@ -237,7 +237,7 @@ async def test_process_llm_request_with_path_based_gemini_1_and_other_tools_rais with pytest.raises( ValueError, match=( - 'Vertex AI search tool can not be used with other tools in' + 'Vertex AI search tool cannot be used with other tools in' ' Gemini 1.x' ), ): diff --git a/tests/unittests/utils/test_cache_performance_analyzer.py b/tests/unittests/utils/test_cache_performance_analyzer.py new file mode 100644 index 0000000000..b1ee58c6d1 --- /dev/null +++ b/tests/unittests/utils/test_cache_performance_analyzer.py @@ -0,0 +1,450 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for CachePerformanceAnalyzer.""" + +import time +from unittest.mock import AsyncMock +from unittest.mock import MagicMock + +from google.adk.events.event import Event +from google.adk.models.cache_metadata import CacheMetadata +from google.adk.sessions.base_session_service import BaseSessionService +from google.adk.sessions.session import Session +from google.adk.utils.cache_performance_analyzer import CachePerformanceAnalyzer +from google.genai import types +import pytest + + +class TestCachePerformanceAnalyzer: + """Test suite for CachePerformanceAnalyzer.""" + + def setup_method(self): + """Set up test fixtures.""" + self.mock_session_service = MagicMock(spec=BaseSessionService) + self.analyzer = CachePerformanceAnalyzer(self.mock_session_service) + + def create_cache_metadata( + self, invocations_used=1, cache_name="test-cache", contents_count=5 + ): + """Helper to create test CacheMetadata.""" + return CacheMetadata( + cache_name=( + f"projects/test/locations/us-central1/cachedContents/{cache_name}" + ), + expire_time=time.time() + 1800, + fingerprint="test_fingerprint", + invocations_used=invocations_used, + contents_count=contents_count, + created_at=time.time() - 600, + ) + + def create_mock_usage_metadata( + self, prompt_tokens=1000, cached_tokens=500, candidates_tokens=100 + ): + """Helper to create mock usage metadata.""" + return types.GenerateContentResponseUsageMetadata( + prompt_token_count=prompt_tokens, + cached_content_token_count=cached_tokens, + candidates_token_count=candidates_tokens, + total_token_count=prompt_tokens + candidates_tokens, + ) + + def create_mock_event( + self, author="test_agent", cache_metadata=None, usage_metadata=None + ): + """Helper to create mock event.""" + event = Event(author=author, cache_metadata=cache_metadata) + if usage_metadata: + event.usage_metadata = usage_metadata + return event + + def test_init(self): + """Test analyzer initialization.""" + assert self.analyzer.session_service == self.mock_session_service + + async def test_get_agent_cache_history_empty_session(self): + """Test getting cache history from empty session.""" + mock_session = Session( + id="test_session", + app_name="test_app", + user_id="test_user", + events=[], + ) + self.mock_session_service.get_session = AsyncMock(return_value=mock_session) + + result = await self.analyzer._get_agent_cache_history( + "test_session", "test_user", "test_app", "test_agent" + ) + + assert result == [] + + async def test_get_agent_cache_history_no_cache_events(self): + """Test getting cache history when no events have cache metadata.""" + events = [ + self.create_mock_event(author="test_agent"), + self.create_mock_event(author="other_agent"), + self.create_mock_event(author="test_agent"), + ] + + mock_session = Session( + id="test_session", + app_name="test_app", + user_id="test_user", + events=events, + ) + self.mock_session_service.get_session = AsyncMock(return_value=mock_session) + + result = await self.analyzer._get_agent_cache_history( + "test_session", "test_user", "test_app", "test_agent" + ) + + assert result == [] + + async def test_get_agent_cache_history_specific_agent(self): + """Test getting cache history for specific agent.""" + cache1 = self.create_cache_metadata(invocations_used=1, cache_name="cache1") + cache2 = self.create_cache_metadata(invocations_used=3, cache_name="cache2") + cache3 = self.create_cache_metadata(invocations_used=5, cache_name="cache3") + + events = [ + self.create_mock_event(author="test_agent", cache_metadata=cache1), + self.create_mock_event(author="other_agent", cache_metadata=cache2), + self.create_mock_event(author="test_agent", cache_metadata=cache3), + self.create_mock_event(author="test_agent"), # No cache metadata + ] + + mock_session = Session( + id="test_session", + app_name="test_app", + user_id="test_user", + events=events, + ) + self.mock_session_service.get_session = AsyncMock(return_value=mock_session) + + result = await self.analyzer._get_agent_cache_history( + "test_session", "test_user", "test_app", "test_agent" + ) + + # Should only return cache metadata for test_agent + assert len(result) == 2 + assert result[0] == cache1 + assert result[1] == cache3 + + async def test_get_agent_cache_history_all_agents(self): + """Test getting cache history for all agents.""" + cache1 = self.create_cache_metadata(invocations_used=1, cache_name="cache1") + cache2 = self.create_cache_metadata(invocations_used=3, cache_name="cache2") + + events = [ + self.create_mock_event(author="agent1", cache_metadata=cache1), + self.create_mock_event(author="agent2", cache_metadata=cache2), + self.create_mock_event(author="agent1"), # No cache metadata + ] + + mock_session = Session( + id="test_session", + app_name="test_app", + user_id="test_user", + events=events, + ) + self.mock_session_service.get_session = AsyncMock(return_value=mock_session) + + # Pass None for agent_name to get all agents + result = await self.analyzer._get_agent_cache_history( + "test_session", "test_user", "test_app", None + ) + + # Should return cache metadata for all agents + assert len(result) == 2 + assert result[0] == cache1 + assert result[1] == cache2 + + async def test_analyze_agent_cache_performance_no_cache_data(self): + """Test analysis with no cache data.""" + mock_session = Session( + id="test_session", + app_name="test_app", + user_id="test_user", + events=[], + ) + self.mock_session_service.get_session = AsyncMock(return_value=mock_session) + + result = await self.analyzer.analyze_agent_cache_performance( + "test_session", "test_user", "test_app", "test_agent" + ) + + assert result["status"] == "no_cache_data" + + async def test_analyze_agent_cache_performance_with_cache_data(self): + """Test comprehensive analysis with cache data and token metrics.""" + cache1 = self.create_cache_metadata(invocations_used=2, cache_name="cache1") + cache2 = self.create_cache_metadata(invocations_used=5, cache_name="cache2") + cache3 = self.create_cache_metadata(invocations_used=8, cache_name="cache3") + + usage1 = self.create_mock_usage_metadata( + prompt_tokens=1000, cached_tokens=800 + ) + usage2 = self.create_mock_usage_metadata( + prompt_tokens=1500, cached_tokens=1200 + ) + usage3 = self.create_mock_usage_metadata(prompt_tokens=800, cached_tokens=0) + + events = [ + self.create_mock_event( + author="test_agent", cache_metadata=cache1, usage_metadata=usage1 + ), + self.create_mock_event(author="other_agent", cache_metadata=cache2), + self.create_mock_event( + author="test_agent", cache_metadata=cache2, usage_metadata=usage2 + ), + self.create_mock_event( + author="test_agent", cache_metadata=cache3, usage_metadata=usage3 + ), + ] + + mock_session = Session( + id="test_session", + app_name="test_app", + user_id="test_user", + events=events, + ) + self.mock_session_service.get_session = AsyncMock(return_value=mock_session) + + result = await self.analyzer.analyze_agent_cache_performance( + "test_session", "test_user", "test_app", "test_agent" + ) + + # Basic cache metrics + assert result["status"] == "active" + assert result["requests_with_cache"] == 3 + assert result["cache_refreshes"] == 3 # 3 unique cache names + assert result["total_invocations"] == 15 # 2 + 5 + 8 + + expected_avg_invocations = (2 + 5 + 8) / 3 # 5.0 + assert result["avg_invocations_used"] == expected_avg_invocations + + # Token metrics + assert result["total_prompt_tokens"] == 3300 # 1000 + 1500 + 800 + assert result["total_cached_tokens"] == 2000 # 800 + 1200 + 0 + assert result["total_requests"] == 3 + assert ( + result["requests_with_cache_hits"] == 2 + ) # Only first two have cached tokens + + # Calculated metrics + expected_hit_ratio = (2000 / 3300) * 100 # ~60.6% + expected_utilization = (2 / 3) * 100 # ~66.7% + expected_avg_cached = 2000 / 3 # ~666.7 + + assert abs(result["cache_hit_ratio_percent"] - expected_hit_ratio) < 0.01 + assert ( + abs(result["cache_utilization_ratio_percent"] - expected_utilization) + < 0.01 + ) + assert ( + abs(result["avg_cached_tokens_per_request"] - expected_avg_cached) + < 0.01 + ) + + async def test_analyze_agent_cache_performance_single_cache(self): + """Test analysis with single cache instance.""" + cache = self.create_cache_metadata( + invocations_used=10, cache_name="single_cache" + ) + usage = self.create_mock_usage_metadata( + prompt_tokens=2000, cached_tokens=1500 + ) + + events = [ + self.create_mock_event( + author="test_agent", cache_metadata=cache, usage_metadata=usage + ), + ] + + mock_session = Session( + id="test_session", + app_name="test_app", + user_id="test_user", + events=events, + ) + self.mock_session_service.get_session = AsyncMock(return_value=mock_session) + + result = await self.analyzer.analyze_agent_cache_performance( + "test_session", "test_user", "test_app", "test_agent" + ) + + assert result["status"] == "active" + assert result["requests_with_cache"] == 1 + assert result["avg_invocations_used"] == 10.0 + assert result["cache_refreshes"] == 1 + assert result["total_invocations"] == 10 + assert result["latest_cache"] == cache.cache_name + + # Token metrics for single request + assert result["total_prompt_tokens"] == 2000 + assert result["total_cached_tokens"] == 1500 + assert result["cache_hit_ratio_percent"] == 75.0 # 1500/2000 * 100 + assert result["cache_utilization_ratio_percent"] == 100.0 # 1/1 * 100 + assert result["avg_cached_tokens_per_request"] == 1500.0 + + async def test_analyze_agent_cache_performance_no_token_data(self): + """Test analysis when events have no usage_metadata.""" + cache = self.create_cache_metadata(invocations_used=5) + + events = [ + self.create_mock_event(author="test_agent", cache_metadata=cache), + ] + + mock_session = Session( + id="test_session", + app_name="test_app", + user_id="test_user", + events=events, + ) + self.mock_session_service.get_session = AsyncMock(return_value=mock_session) + + result = await self.analyzer.analyze_agent_cache_performance( + "test_session", "test_user", "test_app", "test_agent" + ) + + # Should still work but with zero token metrics + assert result["status"] == "active" + assert result["requests_with_cache"] == 1 + assert result["total_prompt_tokens"] == 0 + assert result["total_cached_tokens"] == 0 + assert result["cache_hit_ratio_percent"] == 0.0 + assert result["cache_utilization_ratio_percent"] == 0.0 + assert result["avg_cached_tokens_per_request"] == 0.0 + + async def test_analyze_agent_cache_performance_zero_invocations(self): + """Test analysis with zero invocations.""" + cache = self.create_cache_metadata( + invocations_used=0, cache_name="zero_cache" + ) + usage = self.create_mock_usage_metadata( + prompt_tokens=1000, cached_tokens=500 + ) + + events = [ + self.create_mock_event( + author="test_agent", cache_metadata=cache, usage_metadata=usage + ), + ] + + mock_session = Session( + id="test_session", + app_name="test_app", + user_id="test_user", + events=events, + ) + self.mock_session_service.get_session = AsyncMock(return_value=mock_session) + + result = await self.analyzer.analyze_agent_cache_performance( + "test_session", "test_user", "test_app", "test_agent" + ) + + assert result["status"] == "active" + assert result["avg_invocations_used"] == 0.0 + assert result["total_invocations"] == 0 + + # Token metrics should still work + assert result["total_prompt_tokens"] == 1000 + assert result["total_cached_tokens"] == 500 + + async def test_session_service_integration(self): + """Test integration with session service.""" + cache_metadata = self.create_cache_metadata(invocations_used=7) + + events = [ + self.create_mock_event( + author="integration_agent", cache_metadata=cache_metadata + ), + ] + + mock_session = Session( + id="integration_session", + app_name="integration_app", + user_id="integration_user", + events=events, + ) + + # Configure the mock to return the session + self.mock_session_service.get_session = AsyncMock(return_value=mock_session) + + result = await self.analyzer.analyze_agent_cache_performance( + "integration_session", + "integration_user", + "integration_app", + "integration_agent", + ) + + # Verify the session service was called with correct parameters (twice internally) + assert self.mock_session_service.get_session.call_count == 2 + self.mock_session_service.get_session.assert_called_with( + session_id="integration_session", + app_name="integration_app", + user_id="integration_user", + ) + + assert result["status"] == "active" + assert result["requests_with_cache"] == 1 + + async def test_mixed_agents_filtering(self): + """Test that analysis correctly filters by agent name.""" + target_cache = self.create_cache_metadata( + invocations_used=3, cache_name="target" + ) + other_cache = self.create_cache_metadata( + invocations_used=5, cache_name="other" + ) + + target_usage = self.create_mock_usage_metadata( + prompt_tokens=1000, cached_tokens=800 + ) + other_usage = self.create_mock_usage_metadata( + prompt_tokens=2000, cached_tokens=1600 + ) + + events = [ + self.create_mock_event( + author="target_agent", + cache_metadata=target_cache, + usage_metadata=target_usage, + ), + self.create_mock_event( + author="other_agent", + cache_metadata=other_cache, + usage_metadata=other_usage, + ), + self.create_mock_event(author="target_agent"), # No cache data + ] + + mock_session = Session( + id="test_session", + app_name="test_app", + user_id="test_user", + events=events, + ) + self.mock_session_service.get_session = AsyncMock(return_value=mock_session) + + result = await self.analyzer.analyze_agent_cache_performance( + "test_session", "test_user", "test_app", "target_agent" + ) + + # Should only include target_agent's data + assert result["requests_with_cache"] == 1 + assert result["total_invocations"] == 3 + assert result["total_prompt_tokens"] == 1000 # Only target_agent's tokens + assert result["total_cached_tokens"] == 800 # Only target_agent's tokens diff --git a/tests/unittests/utils/test_env_utils.py b/tests/unittests/utils/test_env_utils.py new file mode 100644 index 0000000000..954065a662 --- /dev/null +++ b/tests/unittests/utils/test_env_utils.py @@ -0,0 +1,49 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from google.adk.utils.env_utils import is_env_enabled +import pytest + + +@pytest.mark.parametrize( + 'env_value,expected', + [ + ('true', True), + ('TRUE', True), + ('TrUe', True), + ('1', True), + ('false', False), + ('FALSE', False), + ('0', False), + ('', False), + ], +) +def test_is_env_enabled(monkeypatch, env_value, expected): + """Test is_env_enabled with various environment variable values.""" + monkeypatch.setenv('TEST_FLAG', env_value) + assert is_env_enabled('TEST_FLAG') is expected + + +@pytest.mark.parametrize( + 'default,expected', + [ + ('0', False), + ('1', True), + ('true', True), + ], +) +def test_is_env_enabled_with_defaults(monkeypatch, default, expected): + """Test is_env_enabled when env var is not set with different defaults.""" + monkeypatch.delenv('TEST_FLAG', raising=False) + assert is_env_enabled('TEST_FLAG', default=default) is expected diff --git a/tests/unittests/utils/test_model_name_utils.py b/tests/unittests/utils/test_model_name_utils.py index 4e4ddd06a8..127589d4a6 100644 --- a/tests/unittests/utils/test_model_name_utils.py +++ b/tests/unittests/utils/test_model_name_utils.py @@ -16,7 +16,7 @@ from google.adk.utils.model_name_utils import extract_model_name from google.adk.utils.model_name_utils import is_gemini_1_model -from google.adk.utils.model_name_utils import is_gemini_2_model +from google.adk.utils.model_name_utils import is_gemini_2_or_above from google.adk.utils.model_name_utils import is_gemini_model @@ -42,6 +42,11 @@ def test_extract_model_name_path_based_model(self): path_model_3 = 'projects/test-project/locations/europe-west1/publishers/google/models/claude-3-sonnet' assert extract_model_name(path_model_3) == 'claude-3-sonnet' + def test_extract_model_name_with_models_prefix(self): + """Test extraction of model names with 'models/' prefix.""" + assert extract_model_name('models/gemini-2.5-pro') == 'gemini-2.5-pro' + assert extract_model_name('models/gemini-1.5-flash') == 'gemini-1.5-flash' + def test_extract_model_name_invalid_path(self): """Test that invalid path formats return the original string.""" invalid_paths = [ @@ -115,7 +120,7 @@ def test_is_gemini_model_edge_cases(self): assert is_gemini_model('gemini_1_5_flash') is False def test_is_gemini_model_case_sensitivity(self): - """Test that model detection is case sensitive.""" + """Test that model detection is case-sensitive.""" assert is_gemini_model('Gemini-2.5-pro') is False assert is_gemini_model('GEMINI-2.5-pro') is False assert is_gemini_model('gemini-2.5-PRO') is True # Only the start matters @@ -165,46 +170,51 @@ def test_is_gemini_1_model_edge_cases(self): class TestIsGemini2Model: - """Test the is_gemini_2_model function.""" - - def test_is_gemini_2_model_simple_names(self): - """Test Gemini 2.x model detection with simple model names.""" - assert is_gemini_2_model('gemini-2.0-flash') is True - assert is_gemini_2_model('gemini-2.5-pro') is True - assert is_gemini_2_model('gemini-2.0-flash-001') is True - assert is_gemini_2_model('gemini-2.9-experimental') is True - assert is_gemini_2_model('gemini-1.5-flash') is False - assert is_gemini_2_model('gemini-1.0-pro') is False - assert is_gemini_2_model('gemini-3.0-pro') is False # Only 2.x versions - assert is_gemini_2_model('claude-3-sonnet') is False - - def test_is_gemini_2_model_path_based_names(self): - """Test Gemini 2.x model detection with path-based model names.""" + """Test the is_gemini_2_or_above function.""" + + def test_is_gemini_2_or_above_simple_names(self): + """Test Gemini 2.0+ model detection with simple model names.""" + assert is_gemini_2_or_above('gemini-2.0-flash') is True + assert is_gemini_2_or_above('gemini-2.5-pro') is True + assert is_gemini_2_or_above('gemini-2.0-flash-001') is True + assert is_gemini_2_or_above('gemini-2.9-experimental') is True + assert is_gemini_2_or_above('gemini-2-pro') is True + assert is_gemini_2_or_above('gemini-2') is True + assert is_gemini_2_or_above('gemini-3.0-pro') is True + assert is_gemini_2_or_above('gemini-1.5-flash') is False + assert is_gemini_2_or_above('gemini-1.0-pro') is False + assert is_gemini_2_or_above('claude-3-sonnet') is False + + def test_is_gemini_2_or_above_path_based_names(self): + """Test Gemini 2.0+ model detection with path-based model names.""" gemini_2_path = 'projects/265104255505/locations/us-central1/publishers/google/models/gemini-2.0-flash-001' - assert is_gemini_2_model(gemini_2_path) is True + assert is_gemini_2_or_above(gemini_2_path) is True gemini_2_path_2 = 'projects/12345/locations/us-east1/publishers/google/models/gemini-2.5-pro-preview' - assert is_gemini_2_model(gemini_2_path_2) is True + assert is_gemini_2_or_above(gemini_2_path_2) is True gemini_1_path = 'projects/265104255505/locations/us-central1/publishers/google/models/gemini-1.5-flash-001' - assert is_gemini_2_model(gemini_1_path) is False + assert is_gemini_2_or_above(gemini_1_path) is False + + gemini_3_path = 'projects/12345/locations/us-east1/publishers/google/models/gemini-3.0-pro' + assert is_gemini_2_or_above(gemini_3_path) is True - def test_is_gemini_2_model_edge_cases(self): - """Test edge cases for Gemini 2.x model detection.""" + def test_is_gemini_2_or_above_edge_cases(self): + """Test edge cases for Gemini 2.0+ model detection.""" # Test with None - assert is_gemini_2_model(None) is False + assert is_gemini_2_or_above(None) is False # Test with empty string - assert is_gemini_2_model('') is False + assert is_gemini_2_or_above('') is False # Test with model names containing gemini-2 but not starting with it - assert is_gemini_2_model('my-gemini-2.5-model') is False - assert is_gemini_2_model('custom-gemini-2.0-flash') is False + assert is_gemini_2_or_above('my-gemini-2.5-model') is False + assert is_gemini_2_or_above('custom-gemini-2.0-flash') is False # Test with invalid versions - assert is_gemini_2_model('gemini-2') is False # Missing dot - assert is_gemini_2_model('gemini-2-pro') is False # Missing dot - assert is_gemini_2_model('gemini-2.') is False # Missing version number + assert is_gemini_2_or_above('gemini-2.') is False # Missing version number + assert is_gemini_2_or_above('gemini-0.9-test') is False + assert is_gemini_2_or_above('gemini-one') is False class TestModelNameUtilsIntegration: @@ -216,32 +226,34 @@ def test_model_classification_consistency(self): 'gemini-1.5-flash', 'gemini-2.0-flash', 'gemini-2.5-pro', + 'gemini-3.0-pro', 'projects/123/locations/us-central1/publishers/google/models/gemini-1.5-pro', 'projects/123/locations/us-central1/publishers/google/models/gemini-2.0-flash', + 'projects/123/locations/us-central1/publishers/google/models/gemini-3.0-pro', 'claude-3-sonnet', 'gpt-4', ] for model in test_models: - # A model can only be either Gemini 1.x or Gemini 2.x, not both + # A model can only be either Gemini 1.x or Gemini 2.0+, not both if is_gemini_1_model(model): - assert not is_gemini_2_model( + assert not is_gemini_2_or_above( model - ), f'Model {model} classified as both Gemini 1.x and 2.x' + ), f'Model {model} classified as both Gemini 1.x and 2.0+' assert is_gemini_model( model ), f'Model {model} is Gemini 1.x but not classified as Gemini' - if is_gemini_2_model(model): + if is_gemini_2_or_above(model): assert not is_gemini_1_model( model - ), f'Model {model} classified as both Gemini 1.x and 2.x' + ), f'Model {model} classified as both Gemini 1.x and 2.0+' assert is_gemini_model( model - ), f'Model {model} is Gemini 2.x but not classified as Gemini' + ), f'Model {model} is Gemini 2.0+ but not classified as Gemini' - # If it's neither Gemini 1.x nor 2.x, it should not be classified as Gemini - if not is_gemini_1_model(model) and not is_gemini_2_model(model): + # If it's neither Gemini 1.x nor 2.0+, it should not be classified as Gemini + if not is_gemini_1_model(model) and not is_gemini_2_or_above(model): if model and 'gemini-' not in extract_model_name(model): assert not is_gemini_model( model @@ -262,6 +274,10 @@ def test_path_vs_simple_model_consistency(self): 'gemini-2.5-pro', 'projects/123/locations/us-central1/publishers/google/models/gemini-2.5-pro', ), + ( + 'gemini-3.0-pro', + 'projects/123/locations/us-central1/publishers/google/models/gemini-3.0-pro', + ), ( 'claude-3-sonnet', 'projects/123/locations/us-central1/publishers/google/models/claude-3-sonnet', @@ -278,7 +294,9 @@ def test_path_vs_simple_model_consistency(self): f'Inconsistent Gemini 1.x classification for {simple_model} vs' f' {path_model}' ) - assert is_gemini_2_model(simple_model) == is_gemini_2_model(path_model), ( - f'Inconsistent Gemini 2.x classification for {simple_model} vs' + assert is_gemini_2_or_above(simple_model) == is_gemini_2_or_above( + path_model + ), ( + f'Inconsistent Gemini 2.0+ classification for {simple_model} vs' f' {path_model}' ) diff --git a/tests/unittests/utils/test_output_schema_utils.py b/tests/unittests/utils/test_output_schema_utils.py new file mode 100644 index 0000000000..ca7f88d91d --- /dev/null +++ b/tests/unittests/utils/test_output_schema_utils.py @@ -0,0 +1,50 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from google.adk.models.anthropic_llm import Claude +from google.adk.models.google_llm import Gemini +from google.adk.utils.output_schema_utils import can_use_output_schema_with_tools +import pytest + + +@pytest.mark.parametrize( + "model, env_value, expected", + [ + ("gemini-2.5-pro", "1", True), + ("gemini-2.5-pro", "0", False), + ("gemini-2.5-pro", None, False), + (Gemini(model="gemini-2.5-pro"), "1", True), + (Gemini(model="gemini-2.5-pro"), "0", False), + (Gemini(model="gemini-2.5-pro"), None, False), + ("gemini-2.0-flash", "1", True), + ("gemini-2.0-flash", "0", False), + ("gemini-2.0-flash", None, False), + ("gemini-1.5-pro", "1", False), + ("gemini-1.5-pro", "0", False), + ("gemini-1.5-pro", None, False), + (Claude(model="claude-3.7-sonnet"), "1", False), + (Claude(model="claude-3.7-sonnet"), "0", False), + (Claude(model="claude-3.7-sonnet"), None, False), + ], +) +def test_can_use_output_schema_with_tools( + monkeypatch, model, env_value, expected +): + """Test can_use_output_schema_with_tools.""" + if env_value is not None: + monkeypatch.setenv("GOOGLE_GENAI_USE_VERTEXAI", env_value) + else: + monkeypatch.delenv("GOOGLE_GENAI_USE_VERTEXAI", raising=False) + assert can_use_output_schema_with_tools(model) == expected diff --git a/tests/unittests/utils/test_streaming_utils.py b/tests/unittests/utils/test_streaming_utils.py index 057c05e97d..8ed9375f4b 100644 --- a/tests/unittests/utils/test_streaming_utils.py +++ b/tests/unittests/utils/test_streaming_utils.py @@ -179,3 +179,24 @@ async def test_close_with_error(self): assert closed_response.content.parts[0].text == "Error" assert closed_response.error_code == types.FinishReason.RECITATION assert closed_response.error_message == "Recitation error" + + @pytest.mark.asyncio + async def test_process_response_with_none_content(self): + """Test that StreamingResponseAggregator handles content=None.""" + aggregator = streaming_utils.StreamingResponseAggregator() + response = types.GenerateContentResponse( + candidates=[ + types.Candidate( + content=types.Content(parts=[]), + finish_reason=types.FinishReason.STOP, + ) + ] + ) + results = [] + async for r in aggregator.process_response(response): + results.append(r) + assert len(results) == 1 + assert results[0].content is not None + + closed_response = aggregator.close() + assert closed_response is None diff --git a/tests/unittests/utils/test_vertex_ai_utils.py b/tests/unittests/utils/test_vertex_ai_utils.py new file mode 100644 index 0000000000..6a9d1fceb2 --- /dev/null +++ b/tests/unittests/utils/test_vertex_ai_utils.py @@ -0,0 +1,91 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tests for vertex_utils.""" + +from unittest import mock + +from google.adk.utils import vertex_ai_utils +import pytest + + +def test_get_express_mode_api_key_value_error(): + with pytest.raises(ValueError) as excinfo: + vertex_ai_utils.get_express_mode_api_key( + project='test-project', location=None, express_mode_api_key='key' + ) + assert ( + 'Cannot specify project or location and express_mode_api_key. Either use' + ' project and location, or just the express_mode_api_key.' + in str(excinfo.value) + ) + with pytest.raises(ValueError) as excinfo: + vertex_ai_utils.get_express_mode_api_key( + project=None, location='test-location', express_mode_api_key='key' + ) + assert ( + 'Cannot specify project or location and express_mode_api_key. Either use' + ' project and location, or just the express_mode_api_key.' + in str(excinfo.value) + ) + with pytest.raises(ValueError) as excinfo: + vertex_ai_utils.get_express_mode_api_key( + project='test-project', + location='test-location', + express_mode_api_key='key', + ) + assert ( + 'Cannot specify project or location and express_mode_api_key. Either use' + ' project and location, or just the express_mode_api_key.' + in str(excinfo.value) + ) + + +@pytest.mark.parametrize( + ( + 'use_vertexai_env', + 'google_api_key_env', + 'express_mode_api_key', + 'expected', + ), + [ + ('true', None, 'express_key', 'express_key'), + ('1', 'google_key', 'express_key', 'express_key'), + ('true', 'google_key', None, 'google_key'), + ('1', None, None, None), + ('false', 'google_key', 'express_key', None), + ('0', 'google_key', None, None), + (None, 'google_key', 'express_key', None), + ], +) +def test_get_express_mode_api_key( + use_vertexai_env, + google_api_key_env, + express_mode_api_key, + expected, +): + env_vars = {} + if use_vertexai_env: + env_vars['GOOGLE_GENAI_USE_VERTEXAI'] = use_vertexai_env + if google_api_key_env: + env_vars['GOOGLE_API_KEY'] = google_api_key_env + with mock.patch.dict('os.environ', env_vars, clear=True): + assert ( + vertex_ai_utils.get_express_mode_api_key( + project=None, + location=None, + express_mode_api_key=express_mode_api_key, + ) + == expected + ) diff --git a/tests/unittests/utils/test_yaml_utils.py b/tests/unittests/utils/test_yaml_utils.py index 93a4be7adb..6d4c105bd1 100644 --- a/tests/unittests/utils/test_yaml_utils.py +++ b/tests/unittests/utils/test_yaml_utils.py @@ -123,3 +123,32 @@ def test_empty_list_formatting(tmp_path: Path): name: Test """ assert yaml_file.read_text(encoding="utf-8") == expected + + +def test_non_ascii_character_preservation(tmp_path: Path): + """Test that non-ASCII characters are preserved in YAML output.""" + model = SimpleModel( + name="你好世界", # Chinese + age=30, + active=True, + multiline_text="🌍 Hello World 🌏\nこんにちは世界\nHola Mundo 🌎", + items=["Château", "naïve", "café", "🎉"], + ) + yaml_file = tmp_path / "test.yaml" + + dump_pydantic_to_yaml(model, yaml_file) + + assert yaml_file.read_text(encoding="utf-8") == """\ +active: true +age: 30 +items: + - Château + - naïve + - café + - 🎉 +multiline_text: |- + 🌍 Hello World 🌏 + こんにちは世界 + Hola Mundo 🌎 +name: 你好世界 +""" From 08987ad824f2c84a406db5550bf0e2bf7840e2c1 Mon Sep 17 00:00:00 2001 From: Dylan Snyder <114695692+dylan-apex@users.noreply.github.com> Date: Wed, 21 Jan 2026 12:37:15 -0600 Subject: [PATCH 8/9] missing env_variables fixture --- tests/unittests/tools/test_agent_tool.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unittests/tools/test_agent_tool.py b/tests/unittests/tools/test_agent_tool.py index 9f95afa59e..9e3a230e2f 100644 --- a/tests/unittests/tools/test_agent_tool.py +++ b/tests/unittests/tools/test_agent_tool.py @@ -427,7 +427,7 @@ class CustomOutput(BaseModel): ['GOOGLE_AI', 'VERTEX'], indirect=True, ) -def test_custom_schema_with_union(): +def test_custom_schema_with_union(env_variables): """Tests if agent can have a Union type in output_schema.""" class CustomInput(BaseModel): From 3a37fa5fdc856ea810acd0439780d09710ac6d37 Mon Sep 17 00:00:00 2001 From: Dylan Snyder <114695692+dylan-apex@users.noreply.github.com> Date: Wed, 21 Jan 2026 12:37:22 -0600 Subject: [PATCH 9/9] autoformat.sh --- contributing/samples/gepa/experiment.py | 1 - contributing/samples/gepa/run_experiment.py | 1 - tests/unittests/agents/test_llm_agent_fields.py | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/contributing/samples/gepa/experiment.py b/contributing/samples/gepa/experiment.py index f3751206a8..2710c3894c 100644 --- a/contributing/samples/gepa/experiment.py +++ b/contributing/samples/gepa/experiment.py @@ -43,7 +43,6 @@ from tau_bench.types import EnvRunResult from tau_bench.types import RunConfig import tau_bench_agent as tau_bench_agent_lib - import utils diff --git a/contributing/samples/gepa/run_experiment.py b/contributing/samples/gepa/run_experiment.py index d857da9635..e31db15788 100644 --- a/contributing/samples/gepa/run_experiment.py +++ b/contributing/samples/gepa/run_experiment.py @@ -25,7 +25,6 @@ from absl import flags import experiment from google.genai import types - import utils _OUTPUT_DIR = flags.DEFINE_string( diff --git a/tests/unittests/agents/test_llm_agent_fields.py b/tests/unittests/agents/test_llm_agent_fields.py index 22bdc48774..076ab0bdd6 100644 --- a/tests/unittests/agents/test_llm_agent_fields.py +++ b/tests/unittests/agents/test_llm_agent_fields.py @@ -26,10 +26,10 @@ from google.adk.agents.invocation_context import InvocationContext from google.adk.agents.llm_agent import LlmAgent from google.adk.agents.readonly_context import ReadonlyContext +from google.adk.events.event import Event from google.adk.models.anthropic_llm import Claude from google.adk.models.google_llm import Gemini from google.adk.models.lite_llm import LiteLlm -from google.adk.events.event import Event from google.adk.models.llm_request import LlmRequest from google.adk.models.registry import LLMRegistry from google.adk.planners.built_in_planner import BuiltInPlanner

        1Ju$rq<>B1h!mmp010k#;ri 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%0A(Kg2D+*Ysf@8kLADw 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