google-adk 1.1.0__tar.gz → 1.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. {google_adk-1.1.0 → google_adk-1.2.0}/PKG-INFO +7 -7
  2. {google_adk-1.1.0 → google_adk-1.2.0}/README.md +2 -2
  3. {google_adk-1.1.0 → google_adk-1.2.0}/pyproject.toml +20 -19
  4. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/agents/base_agent.py +0 -2
  5. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/agents/invocation_context.py +3 -3
  6. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/agents/parallel_agent.py +17 -7
  7. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/agents/sequential_agent.py +8 -8
  8. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/auth/auth_preprocessor.py +18 -17
  9. google_adk-1.2.0/src/google/adk/cli/agent_graph.py +290 -0
  10. google_adk-1.2.0/src/google/adk/cli/browser/assets/ADK-512-color.svg +9 -0
  11. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/browser/index.html +2 -2
  12. google_adk-1.1.0/src/google/adk/cli/browser/main-PKDNKWJE.js → google_adk-1.2.0/src/google/adk/cli/browser/main-CS5OLUMF.js +59 -59
  13. google_adk-1.2.0/src/google/adk/cli/browser/polyfills-FFHMD2TL.js +17 -0
  14. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/cli.py +9 -9
  15. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/cli_deploy.py +157 -0
  16. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/cli_tools_click.py +228 -99
  17. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/fast_api.py +119 -34
  18. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/utils/agent_loader.py +60 -44
  19. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/utils/envs.py +1 -1
  20. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/code_executors/unsafe_local_code_executor.py +11 -0
  21. google_adk-1.2.0/src/google/adk/errors/not_found_error.py +28 -0
  22. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/evaluation/agent_evaluator.py +1 -1
  23. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/evaluation/eval_sets_manager.py +36 -6
  24. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/evaluation/evaluation_generator.py +5 -4
  25. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/evaluation/local_eval_sets_manager.py +101 -6
  26. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/flows/llm_flows/agent_transfer.py +2 -2
  27. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/flows/llm_flows/base_llm_flow.py +19 -0
  28. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/flows/llm_flows/contents.py +4 -4
  29. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/flows/llm_flows/functions.py +140 -127
  30. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/memory/vertex_ai_rag_memory_service.py +2 -2
  31. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/models/anthropic_llm.py +7 -10
  32. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/models/google_llm.py +46 -18
  33. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/models/lite_llm.py +63 -26
  34. google_adk-1.2.0/src/google/adk/py.typed +0 -0
  35. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/sessions/_session_util.py +10 -16
  36. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/sessions/database_session_service.py +81 -66
  37. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/sessions/vertex_ai_session_service.py +32 -6
  38. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/telemetry.py +91 -24
  39. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/_automatic_function_calling_util.py +31 -25
  40. google_adk-1.1.0/src/google/adk/tools/function_parameter_parse_util.py → google_adk-1.2.0/src/google/adk/tools/_function_parameter_parse_util.py +9 -3
  41. google_adk-1.2.0/src/google/adk/tools/_gemini_schema_util.py +158 -0
  42. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/apihub_tool/apihub_toolset.py +3 -2
  43. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/application_integration_tool/clients/connections_client.py +7 -0
  44. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/application_integration_tool/integration_connector_tool.py +5 -7
  45. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/base_tool.py +4 -8
  46. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/bigquery/__init__.py +11 -1
  47. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/bigquery/bigquery_credentials.py +9 -4
  48. google_adk-1.2.0/src/google/adk/tools/bigquery/bigquery_toolset.py +86 -0
  49. google_adk-1.2.0/src/google/adk/tools/bigquery/client.py +33 -0
  50. google_adk-1.2.0/src/google/adk/tools/bigquery/metadata_tool.py +249 -0
  51. google_adk-1.2.0/src/google/adk/tools/bigquery/query_tool.py +76 -0
  52. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/function_tool.py +4 -4
  53. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/langchain_tool.py +20 -13
  54. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/load_memory_tool.py +1 -0
  55. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/mcp_tool/conversion_utils.py +4 -2
  56. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/mcp_tool/mcp_session_manager.py +63 -5
  57. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/mcp_tool/mcp_tool.py +3 -2
  58. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/mcp_tool/mcp_toolset.py +15 -8
  59. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/openapi_tool/common/common.py +4 -43
  60. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/openapi_tool/openapi_spec_parser/__init__.py +0 -2
  61. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/openapi_tool/openapi_spec_parser/openapi_spec_parser.py +4 -2
  62. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/openapi_tool/openapi_spec_parser/operation_parser.py +4 -2
  63. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/openapi_tool/openapi_spec_parser/rest_api_tool.py +7 -127
  64. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/openapi_tool/openapi_spec_parser/tool_auth_handler.py +2 -7
  65. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/transfer_to_agent_tool.py +8 -1
  66. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/vertex_ai_search_tool.py +8 -1
  67. google_adk-1.2.0/src/google/adk/utils/__init__.py +13 -0
  68. google_adk-1.2.0/src/google/adk/utils/variant_utils.py +51 -0
  69. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/version.py +1 -1
  70. google_adk-1.1.0/src/google/adk/cli/agent_graph.py +0 -148
  71. google_adk-1.1.0/src/google/adk/cli/browser/polyfills-B6TNHZQ6.js +0 -17
  72. {google_adk-1.1.0 → google_adk-1.2.0}/LICENSE +0 -0
  73. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/__init__.py +0 -0
  74. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/agents/__init__.py +0 -0
  75. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/agents/active_streaming_tool.py +0 -0
  76. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/agents/callback_context.py +0 -0
  77. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/agents/langgraph_agent.py +0 -0
  78. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/agents/live_request_queue.py +0 -0
  79. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/agents/llm_agent.py +0 -0
  80. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/agents/loop_agent.py +0 -0
  81. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/agents/readonly_context.py +0 -0
  82. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/agents/run_config.py +0 -0
  83. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/agents/transcription_entry.py +0 -0
  84. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/artifacts/__init__.py +0 -0
  85. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/artifacts/base_artifact_service.py +0 -0
  86. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/artifacts/gcs_artifact_service.py +0 -0
  87. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/artifacts/in_memory_artifact_service.py +0 -0
  88. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/auth/__init__.py +0 -0
  89. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/auth/auth_credential.py +0 -0
  90. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/auth/auth_handler.py +0 -0
  91. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/auth/auth_schemes.py +0 -0
  92. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/auth/auth_tool.py +0 -0
  93. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/__init__.py +0 -0
  94. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/__main__.py +0 -0
  95. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/browser/adk_favicon.svg +0 -0
  96. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/browser/assets/audio-processor.js +0 -0
  97. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/browser/assets/config/runtime-config.json +0 -0
  98. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/browser/styles-4VDSPQ37.css +0 -0
  99. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/cli_create.py +0 -0
  100. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/cli_eval.py +0 -0
  101. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/utils/__init__.py +0 -0
  102. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/utils/cleanup.py +0 -0
  103. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/utils/common.py +0 -0
  104. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/utils/evals.py +0 -0
  105. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/cli/utils/logs.py +0 -0
  106. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/code_executors/__init__.py +0 -0
  107. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/code_executors/base_code_executor.py +0 -0
  108. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/code_executors/built_in_code_executor.py +0 -0
  109. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/code_executors/code_execution_utils.py +0 -0
  110. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/code_executors/code_executor_context.py +0 -0
  111. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/code_executors/container_code_executor.py +0 -0
  112. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/code_executors/vertex_ai_code_executor.py +0 -0
  113. {google_adk-1.1.0/src/google/adk/flows → google_adk-1.2.0/src/google/adk/errors}/__init__.py +0 -0
  114. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/evaluation/__init__.py +0 -0
  115. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/evaluation/eval_case.py +0 -0
  116. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/evaluation/eval_metrics.py +0 -0
  117. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/evaluation/eval_result.py +0 -0
  118. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/evaluation/eval_set.py +0 -0
  119. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/evaluation/eval_set_results_manager.py +0 -0
  120. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/evaluation/evaluation_constants.py +0 -0
  121. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/evaluation/evaluator.py +0 -0
  122. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/evaluation/local_eval_set_results_manager.py +0 -0
  123. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/evaluation/response_evaluator.py +0 -0
  124. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/evaluation/trajectory_evaluator.py +0 -0
  125. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/events/__init__.py +0 -0
  126. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/events/event.py +0 -0
  127. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/events/event_actions.py +0 -0
  128. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/examples/__init__.py +0 -0
  129. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/examples/base_example_provider.py +0 -0
  130. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/examples/example.py +0 -0
  131. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/examples/example_util.py +0 -0
  132. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/examples/vertex_ai_example_store.py +0 -0
  133. {google_adk-1.1.0/src/google/adk/tools/apihub_tool/clients → google_adk-1.2.0/src/google/adk/flows}/__init__.py +0 -0
  134. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/flows/llm_flows/__init__.py +0 -0
  135. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/flows/llm_flows/_base_llm_processor.py +0 -0
  136. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/flows/llm_flows/_code_execution.py +0 -0
  137. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/flows/llm_flows/_nl_planning.py +0 -0
  138. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/flows/llm_flows/audio_transcriber.py +0 -0
  139. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/flows/llm_flows/auto_flow.py +0 -0
  140. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/flows/llm_flows/basic.py +0 -0
  141. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/flows/llm_flows/identity.py +0 -0
  142. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/flows/llm_flows/instructions.py +0 -0
  143. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/flows/llm_flows/single_flow.py +0 -0
  144. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/memory/__init__.py +0 -0
  145. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/memory/_utils.py +0 -0
  146. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/memory/base_memory_service.py +0 -0
  147. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/memory/in_memory_memory_service.py +0 -0
  148. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/memory/memory_entry.py +0 -0
  149. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/models/__init__.py +0 -0
  150. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/models/base_llm.py +0 -0
  151. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/models/base_llm_connection.py +0 -0
  152. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/models/gemini_llm_connection.py +0 -0
  153. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/models/llm_request.py +0 -0
  154. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/models/llm_response.py +0 -0
  155. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/models/registry.py +0 -0
  156. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/planners/__init__.py +0 -0
  157. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/planners/base_planner.py +0 -0
  158. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/planners/built_in_planner.py +0 -0
  159. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/planners/plan_re_act_planner.py +0 -0
  160. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/runners.py +0 -0
  161. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/sessions/__init__.py +0 -0
  162. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/sessions/base_session_service.py +0 -0
  163. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/sessions/in_memory_session_service.py +0 -0
  164. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/sessions/session.py +0 -0
  165. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/sessions/state.py +0 -0
  166. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/__init__.py +0 -0
  167. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/_memory_entry_utils.py +0 -0
  168. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/agent_tool.py +0 -0
  169. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/apihub_tool/__init__.py +0 -0
  170. {google_adk-1.1.0/src/google/adk/utils → google_adk-1.2.0/src/google/adk/tools/apihub_tool/clients}/__init__.py +0 -0
  171. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/apihub_tool/clients/apihub_client.py +0 -0
  172. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/apihub_tool/clients/secret_client.py +0 -0
  173. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/application_integration_tool/__init__.py +0 -0
  174. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/application_integration_tool/application_integration_toolset.py +0 -0
  175. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/application_integration_tool/clients/integration_client.py +0 -0
  176. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/base_toolset.py +0 -0
  177. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/bigquery/bigquery_tool.py +0 -0
  178. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/crewai_tool.py +0 -0
  179. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/enterprise_search_tool.py +0 -0
  180. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/example_tool.py +0 -0
  181. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/exit_loop_tool.py +0 -0
  182. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/get_user_choice_tool.py +0 -0
  183. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/google_api_tool/__init__.py +0 -0
  184. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/google_api_tool/google_api_tool.py +0 -0
  185. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/google_api_tool/google_api_toolset.py +0 -0
  186. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/google_api_tool/google_api_toolsets.py +0 -0
  187. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/google_api_tool/googleapi_to_openapi_converter.py +0 -0
  188. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/google_search_tool.py +0 -0
  189. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/load_artifacts_tool.py +0 -0
  190. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/load_web_page.py +0 -0
  191. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/long_running_tool.py +0 -0
  192. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/mcp_tool/__init__.py +0 -0
  193. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/openapi_tool/__init__.py +0 -0
  194. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/openapi_tool/auth/__init__.py +0 -0
  195. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/openapi_tool/auth/auth_helpers.py +0 -0
  196. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/openapi_tool/auth/credential_exchangers/__init__.py +0 -0
  197. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/openapi_tool/auth/credential_exchangers/auto_auth_credential_exchanger.py +0 -0
  198. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/openapi_tool/auth/credential_exchangers/base_credential_exchanger.py +0 -0
  199. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/openapi_tool/auth/credential_exchangers/oauth2_exchanger.py +0 -0
  200. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/openapi_tool/auth/credential_exchangers/service_account_exchanger.py +0 -0
  201. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/openapi_tool/common/__init__.py +0 -0
  202. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/openapi_tool/openapi_spec_parser/openapi_toolset.py +0 -0
  203. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/preload_memory_tool.py +0 -0
  204. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/retrieval/__init__.py +0 -0
  205. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/retrieval/base_retrieval_tool.py +0 -0
  206. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/retrieval/files_retrieval.py +0 -0
  207. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/retrieval/llama_index_retrieval.py +0 -0
  208. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/retrieval/vertex_ai_rag_retrieval.py +0 -0
  209. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/tool_context.py +0 -0
  210. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/tools/toolbox_toolset.py +0 -0
  211. {google_adk-1.1.0 → google_adk-1.2.0}/src/google/adk/utils/instructions_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: google-adk
3
- Version: 1.1.0
3
+ Version: 1.2.0
4
4
  Summary: Agent Development Kit
5
5
  Author-email: Google LLC <googleapis-packages@google.com>
6
6
  Requires-Python: >=3.9
@@ -23,13 +23,13 @@ Requires-Dist: authlib>=1.5.1
23
23
  Requires-Dist: click>=8.1.8
24
24
  Requires-Dist: fastapi>=0.115.0
25
25
  Requires-Dist: google-api-python-client>=2.157.0
26
- Requires-Dist: google-cloud-aiplatform>=1.87.0
26
+ Requires-Dist: google-cloud-aiplatform[agent-engines]>=1.95.1
27
27
  Requires-Dist: google-cloud-secret-manager>=2.22.0
28
28
  Requires-Dist: google-cloud-speech>=2.30.0
29
29
  Requires-Dist: google-cloud-storage>=2.18.0, <3.0.0
30
- Requires-Dist: google-genai>=1.14.0
30
+ Requires-Dist: google-genai>=1.17.0
31
31
  Requires-Dist: graphviz>=0.20.2
32
- Requires-Dist: mcp>=1.5.0;python_version>='3.10'
32
+ Requires-Dist: mcp>=1.8.0;python_version>='3.10'
33
33
  Requires-Dist: opentelemetry-api>=1.31.0
34
34
  Requires-Dist: opentelemetry-exporter-gcp-trace>=1.9.0
35
35
  Requires-Dist: opentelemetry-sdk>=1.31.0
@@ -65,7 +65,7 @@ Requires-Dist: toolbox-core>=0.1.0 ; extra == "extensions"
65
65
  Requires-Dist: anthropic>=0.43.0 ; extra == "test"
66
66
  Requires-Dist: langchain-community>=0.3.17 ; extra == "test"
67
67
  Requires-Dist: langgraph>=0.2.60 ; extra == "test"
68
- Requires-Dist: litellm>=1.63.11 ; extra == "test"
68
+ Requires-Dist: litellm>=1.71.2 ; extra == "test"
69
69
  Requires-Dist: llama-index-readers-file>=0.4.0 ; extra == "test"
70
70
  Requires-Dist: pytest-asyncio>=0.25.0 ; extra == "test"
71
71
  Requires-Dist: pytest-mock>=3.14.0 ; extra == "test"
@@ -126,8 +126,8 @@ Agent Development Kit (ADK) is a flexible and modular framework for developing a
126
126
  ## 🤖 Agent2Agent (A2A) Protocol and ADK Integration
127
127
 
128
128
  For remote agent-to-agent communication, ADK integrates with the
129
- [A2A protocol](https://github.com/google/A2A/).
130
- See this [example](https://github.com/google/A2A/tree/main/samples/python/agents/google_adk)
129
+ [A2A protocol](https://github.com/google-a2a/A2A/).
130
+ See this [example](https://github.com/google-a2a/a2a-samples/tree/main/samples/python/agents/google_adk)
131
131
  for how they can work together.
132
132
 
133
133
  ## 🚀 Installation
@@ -43,8 +43,8 @@ Agent Development Kit (ADK) is a flexible and modular framework for developing a
43
43
  ## 🤖 Agent2Agent (A2A) Protocol and ADK Integration
44
44
 
45
45
  For remote agent-to-agent communication, ADK integrates with the
46
- [A2A protocol](https://github.com/google/A2A/).
47
- See this [example](https://github.com/google/A2A/tree/main/samples/python/agents/google_adk)
46
+ [A2A protocol](https://github.com/google-a2a/A2A/).
47
+ See this [example](https://github.com/google-a2a/a2a-samples/tree/main/samples/python/agents/google_adk)
48
48
  for how they can work together.
49
49
 
50
50
  ## 🚀 Installation
@@ -25,26 +25,26 @@ classifiers = [ # List of https://pypi.org/classifiers/
25
25
  ]
26
26
  dependencies = [
27
27
  # go/keep-sorted start
28
- "authlib>=1.5.1", # For RestAPI Tool
29
- "click>=8.1.8", # For CLI tools
30
- "fastapi>=0.115.0", # FastAPI framework
31
- "google-api-python-client>=2.157.0", # Google API client discovery
32
- "google-cloud-aiplatform>=1.87.0", # For VertexAI integrations, e.g. example store.
33
- "google-cloud-secret-manager>=2.22.0", # Fetching secrets in RestAPI Tool
34
- "google-cloud-speech>=2.30.0", # For Audio Transcription
35
- "google-cloud-storage>=2.18.0, <3.0.0", # For GCS Artifact service
36
- "google-genai>=1.14.0", # Google GenAI SDK
37
- "graphviz>=0.20.2", # Graphviz for graph rendering
38
- "mcp>=1.5.0;python_version>='3.10'", # For MCP Toolset
39
- "opentelemetry-api>=1.31.0", # OpenTelemetry
28
+ "authlib>=1.5.1", # For RestAPI Tool
29
+ "click>=8.1.8", # For CLI tools
30
+ "fastapi>=0.115.0", # FastAPI framework
31
+ "google-api-python-client>=2.157.0", # Google API client discovery
32
+ "google-cloud-aiplatform[agent_engines]>=1.95.1", # For VertexAI integrations, e.g. example store.
33
+ "google-cloud-secret-manager>=2.22.0", # Fetching secrets in RestAPI Tool
34
+ "google-cloud-speech>=2.30.0", # For Audio Transcription
35
+ "google-cloud-storage>=2.18.0, <3.0.0", # For GCS Artifact service
36
+ "google-genai>=1.17.0", # Google GenAI SDK
37
+ "graphviz>=0.20.2", # Graphviz for graph rendering
38
+ "mcp>=1.8.0;python_version>='3.10'", # For MCP Toolset
39
+ "opentelemetry-api>=1.31.0", # OpenTelemetry
40
40
  "opentelemetry-exporter-gcp-trace>=1.9.0",
41
41
  "opentelemetry-sdk>=1.31.0",
42
- "pydantic>=2.0, <3.0.0", # For data validation/models
43
- "python-dotenv>=1.0.0", # To manage environment variables
44
- "PyYAML>=6.0.2", # For APIHubToolset.
45
- "sqlalchemy>=2.0", # SQL database ORM
46
- "tzlocal>=5.3", # Time zone utilities
47
- "uvicorn>=0.34.0", # ASGI server for FastAPI
42
+ "pydantic>=2.0, <3.0.0", # For data validation/models
43
+ "python-dotenv>=1.0.0", # To manage environment variables
44
+ "PyYAML>=6.0.2", # For APIHubToolset.
45
+ "sqlalchemy>=2.0", # SQL database ORM
46
+ "tzlocal>=5.3", # Time zone utilities
47
+ "uvicorn>=0.34.0", # ASGI server for FastAPI
48
48
  # go/keep-sorted end
49
49
  ]
50
50
  dynamic = ["version"]
@@ -83,7 +83,7 @@ test = [
83
83
  "anthropic>=0.43.0", # For anthropic model tests
84
84
  "langchain-community>=0.3.17",
85
85
  "langgraph>=0.2.60", # For LangGraphAgent
86
- "litellm>=1.63.11", # For LiteLLM tests
86
+ "litellm>=1.71.2", # For LiteLLM tests
87
87
  "llama-index-readers-file>=0.4.0", # For retrieval tests
88
88
 
89
89
  "pytest-asyncio>=0.25.0",
@@ -145,6 +145,7 @@ exclude = ['src/**/*.sh']
145
145
 
146
146
  [tool.flit.module]
147
147
  name = "google.adk"
148
+ include = ["py.typed"]
148
149
 
149
150
  [tool.isort]
150
151
  profile = "google"
@@ -246,8 +246,6 @@ class BaseAgent(BaseModel):
246
246
  ) -> InvocationContext:
247
247
  """Creates a new invocation context for this agent."""
248
248
  invocation_context = parent_context.model_copy(update={'agent': self})
249
- if parent_context.branch:
250
- invocation_context.branch = f'{parent_context.branch}.{self.name}'
251
249
  return invocation_context
252
250
 
253
251
  @property
@@ -39,9 +39,9 @@ class LlmCallsLimitExceededError(Exception):
39
39
  class _InvocationCostManager(BaseModel):
40
40
  """A container to keep track of the cost of invocation.
41
41
 
42
- While we don't expected the metrics captured here to be a direct
43
- representatative of monetary cost incurred in executing the current
44
- invocation, but they, in someways have an indirect affect.
42
+ While we don't expect the metrics captured here to be a direct
43
+ representative of monetary cost incurred in executing the current
44
+ invocation, they in some ways have an indirect effect.
45
45
  """
46
46
 
47
47
  _number_of_llm_calls: int = 0
@@ -26,14 +26,20 @@ from ..events.event import Event
26
26
  from .base_agent import BaseAgent
27
27
 
28
28
 
29
- def _set_branch_for_current_agent(
30
- current_agent: BaseAgent, invocation_context: InvocationContext
31
- ):
29
+ def _create_branch_ctx_for_sub_agent(
30
+ agent: BaseAgent,
31
+ sub_agent: BaseAgent,
32
+ invocation_context: InvocationContext,
33
+ ) -> InvocationContext:
34
+ """Create isolated branch for every sub-agent."""
35
+ invocation_context = invocation_context.model_copy()
36
+ branch_suffix = f"{agent.name}.{sub_agent.name}"
32
37
  invocation_context.branch = (
33
- f"{invocation_context.branch}.{current_agent.name}"
38
+ f"{invocation_context.branch}.{branch_suffix}"
34
39
  if invocation_context.branch
35
- else current_agent.name
40
+ else branch_suffix
36
41
  )
42
+ return invocation_context
37
43
 
38
44
 
39
45
  async def _merge_agent_run(
@@ -90,8 +96,12 @@ class ParallelAgent(BaseAgent):
90
96
  async def _run_async_impl(
91
97
  self, ctx: InvocationContext
92
98
  ) -> AsyncGenerator[Event, None]:
93
- _set_branch_for_current_agent(self, ctx)
94
- agent_runs = [agent.run_async(ctx) for agent in self.sub_agents]
99
+ agent_runs = [
100
+ sub_agent.run_async(
101
+ _create_branch_ctx_for_sub_agent(self, sub_agent, ctx)
102
+ )
103
+ for sub_agent in self.sub_agents
104
+ ]
95
105
  async for event in _merge_agent_run(agent_runs):
96
106
  yield event
97
107
 
@@ -27,7 +27,7 @@ from .llm_agent import LlmAgent
27
27
 
28
28
 
29
29
  class SequentialAgent(BaseAgent):
30
- """A shell agent that run its sub-agents in sequence."""
30
+ """A shell agent that runs its sub-agents in sequence."""
31
31
 
32
32
  @override
33
33
  async def _run_async_impl(
@@ -43,11 +43,11 @@ class SequentialAgent(BaseAgent):
43
43
  ) -> AsyncGenerator[Event, None]:
44
44
  """Implementation for live SequentialAgent.
45
45
 
46
- Compared to non-live case, live agents process a continous streams of audio
47
- or video, so it doesn't have a way to tell if it's finished and should pass
48
- to next agent or not. So we introduce a task_compelted() function so the
46
+ Compared to the non-live case, live agents process a continuous stream of audio
47
+ or video, so there is no way to tell if it's finished and should pass
48
+ to the next agent or not. So we introduce a task_completed() function so the
49
49
  model can call this function to signal that it's finished the task and we
50
- can move on to next agent.
50
+ can move on to the next agent.
51
51
 
52
52
  Args:
53
53
  ctx: The invocation context of the agent.
@@ -66,10 +66,10 @@ class SequentialAgent(BaseAgent):
66
66
  # Use function name to dedupe.
67
67
  if task_completed.__name__ not in sub_agent.tools:
68
68
  sub_agent.tools.append(task_completed)
69
- sub_agent.instruction += f"""If you finished the user' request
70
- according to its description, call {task_completed.__name__} function
69
+ sub_agent.instruction += f"""If you finished the user's request
70
+ according to its description, call the {task_completed.__name__} function
71
71
  to exit so the next agents can take over. When calling this function,
72
- do not generate any text other than the function call.'"""
72
+ do not generate any text other than the function call."""
73
73
 
74
74
  for sub_agent in self.sub_agents:
75
75
  async for event in sub_agent.run_live(ctx):
@@ -100,23 +100,24 @@ class _AuthLlmRequestProcessor(BaseLlmRequestProcessor):
100
100
  function_calls = event.get_function_calls()
101
101
  if not function_calls:
102
102
  continue
103
- for function_call in function_calls:
104
- function_response_event = None
105
- if function_call.id in tools_to_resume:
106
- function_response_event = await functions.handle_function_calls_async(
107
- invocation_context,
108
- event,
109
- {
110
- tool.name: tool
111
- for tool in await agent.canonical_tools(
112
- ReadonlyContext(invocation_context)
113
- )
114
- },
115
- # there could be parallel function calls that require auth
116
- # auth response would be a dict keyed by function call id
117
- tools_to_resume,
118
- )
119
- if function_response_event:
103
+
104
+ if any([
105
+ function_call.id in tools_to_resume
106
+ for function_call in function_calls
107
+ ]):
108
+ if function_response_event := await functions.handle_function_calls_async(
109
+ invocation_context,
110
+ event,
111
+ {
112
+ tool.name: tool
113
+ for tool in await agent.canonical_tools(
114
+ ReadonlyContext(invocation_context)
115
+ )
116
+ },
117
+ # there could be parallel function calls that require auth
118
+ # auth response would be a dict keyed by function call id
119
+ tools_to_resume,
120
+ ):
120
121
  yield function_response_event
121
122
  return
122
123
  return
@@ -0,0 +1,290 @@
1
+ # Copyright 2025 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ import logging
18
+ from typing import Union
19
+
20
+ import graphviz
21
+
22
+ from ..agents import BaseAgent
23
+ from ..agents import LoopAgent
24
+ from ..agents import ParallelAgent
25
+ from ..agents import SequentialAgent
26
+ from ..agents.llm_agent import LlmAgent
27
+ from ..tools.agent_tool import AgentTool
28
+ from ..tools.base_tool import BaseTool
29
+ from ..tools.function_tool import FunctionTool
30
+
31
+ logger = logging.getLogger('google_adk.' + __name__)
32
+
33
+ try:
34
+ from ..tools.retrieval.base_retrieval_tool import BaseRetrievalTool
35
+ except ModuleNotFoundError:
36
+ retrieval_tool_module_loaded = False
37
+ else:
38
+ retrieval_tool_module_loaded = True
39
+
40
+
41
+ async def build_graph(
42
+ graph: graphviz.Digraph,
43
+ agent: BaseAgent,
44
+ highlight_pairs,
45
+ parent_agent=None,
46
+ ):
47
+ """
48
+ Build a graph of the agent and its sub-agents.
49
+ Args:
50
+ graph: The graph to build on.
51
+ agent: The agent to build the graph for.
52
+ highlight_pairs: A list of pairs of nodes to highlight.
53
+ parent_agent: The parent agent of the current agent. This is specifically used when building Workflow Agents to directly connect a node to nodes inside a Workflow Agent.
54
+
55
+ Returns:
56
+ None
57
+ """
58
+ dark_green = '#0F5223'
59
+ light_green = '#69CB87'
60
+ light_gray = '#cccccc'
61
+ white = '#ffffff'
62
+
63
+ def get_node_name(tool_or_agent: Union[BaseAgent, BaseTool]):
64
+ if isinstance(tool_or_agent, BaseAgent):
65
+ # Added Workflow Agent checks for different agent types
66
+ if isinstance(tool_or_agent, SequentialAgent):
67
+ return tool_or_agent.name + f' (Sequential Agent)'
68
+ elif isinstance(tool_or_agent, LoopAgent):
69
+ return tool_or_agent.name + f' (Loop Agent)'
70
+ elif isinstance(tool_or_agent, ParallelAgent):
71
+ return tool_or_agent.name + f' (Parallel Agent)'
72
+ else:
73
+ return tool_or_agent.name
74
+ elif isinstance(tool_or_agent, BaseTool):
75
+ return tool_or_agent.name
76
+ else:
77
+ raise ValueError(f'Unsupported tool type: {tool_or_agent}')
78
+
79
+ def get_node_caption(tool_or_agent: Union[BaseAgent, BaseTool]):
80
+
81
+ if isinstance(tool_or_agent, BaseAgent):
82
+ return '🤖 ' + tool_or_agent.name
83
+ elif retrieval_tool_module_loaded and isinstance(
84
+ tool_or_agent, BaseRetrievalTool
85
+ ):
86
+ return '🔎 ' + tool_or_agent.name
87
+ elif isinstance(tool_or_agent, FunctionTool):
88
+ return '🔧 ' + tool_or_agent.name
89
+ elif isinstance(tool_or_agent, AgentTool):
90
+ return '🤖 ' + tool_or_agent.name
91
+ elif isinstance(tool_or_agent, BaseTool):
92
+ return '🔧 ' + tool_or_agent.name
93
+ else:
94
+ logger.warning(
95
+ 'Unsupported tool, type: %s, obj: %s',
96
+ type(tool_or_agent),
97
+ tool_or_agent,
98
+ )
99
+ return f'❓ Unsupported tool type: {type(tool_or_agent)}'
100
+
101
+ def get_node_shape(tool_or_agent: Union[BaseAgent, BaseTool]):
102
+ if isinstance(tool_or_agent, BaseAgent):
103
+ return 'ellipse'
104
+
105
+ elif retrieval_tool_module_loaded and isinstance(
106
+ tool_or_agent, BaseRetrievalTool
107
+ ):
108
+ return 'cylinder'
109
+ elif isinstance(tool_or_agent, FunctionTool):
110
+ return 'box'
111
+ elif isinstance(tool_or_agent, BaseTool):
112
+ return 'box'
113
+ else:
114
+ logger.warning(
115
+ 'Unsupported tool, type: %s, obj: %s',
116
+ type(tool_or_agent),
117
+ tool_or_agent,
118
+ )
119
+ return 'cylinder'
120
+
121
+ def should_build_agent_cluster(tool_or_agent: Union[BaseAgent, BaseTool]):
122
+ if isinstance(tool_or_agent, BaseAgent):
123
+ if isinstance(tool_or_agent, SequentialAgent):
124
+ return True
125
+ elif isinstance(tool_or_agent, LoopAgent):
126
+ return True
127
+ elif isinstance(tool_or_agent, ParallelAgent):
128
+ return True
129
+ else:
130
+ return False
131
+ elif retrieval_tool_module_loaded and isinstance(
132
+ tool_or_agent, BaseRetrievalTool
133
+ ):
134
+ return False
135
+ elif isinstance(tool_or_agent, FunctionTool):
136
+ return False
137
+ elif isinstance(tool_or_agent, BaseTool):
138
+ return False
139
+ else:
140
+ logger.warning(
141
+ 'Unsupported tool, type: %s, obj: %s',
142
+ type(tool_or_agent),
143
+ tool_or_agent,
144
+ )
145
+ return False
146
+
147
+ def build_cluster(child: graphviz.Digraph, agent: BaseAgent, name: str):
148
+ if isinstance(agent, LoopAgent):
149
+ # Draw the edge from the parent agent to the first sub-agent
150
+ draw_edge(parent_agent.name, agent.sub_agents[0].name)
151
+ length = len(agent.sub_agents)
152
+ currLength = 0
153
+ # Draw the edges between the sub-agents
154
+ for sub_agent_int_sequential in agent.sub_agents:
155
+ build_graph(child, sub_agent_int_sequential, highlight_pairs)
156
+ # Draw the edge between the current sub-agent and the next one
157
+ # If it's the last sub-agent, draw an edge to the first one to indicating a loop
158
+ draw_edge(
159
+ agent.sub_agents[currLength].name,
160
+ agent.sub_agents[
161
+ 0 if currLength == length - 1 else currLength + 1
162
+ ].name,
163
+ )
164
+ currLength += 1
165
+ elif isinstance(agent, SequentialAgent):
166
+ # Draw the edge from the parent agent to the first sub-agent
167
+ draw_edge(parent_agent.name, agent.sub_agents[0].name)
168
+ length = len(agent.sub_agents)
169
+ currLength = 0
170
+
171
+ # Draw the edges between the sub-agents
172
+ for sub_agent_int_sequential in agent.sub_agents:
173
+ build_graph(child, sub_agent_int_sequential, highlight_pairs)
174
+ # Draw the edge between the current sub-agent and the next one
175
+ # If it's the last sub-agent, don't draw an edge to avoid a loop
176
+ draw_edge(
177
+ agent.sub_agents[currLength].name,
178
+ agent.sub_agents[currLength + 1].name,
179
+ ) if currLength != length - 1 else None
180
+ currLength += 1
181
+
182
+ elif isinstance(agent, ParallelAgent):
183
+ # Draw the edge from the parent agent to every sub-agent
184
+ for sub_agent in agent.sub_agents:
185
+ build_graph(child, sub_agent, highlight_pairs)
186
+ draw_edge(parent_agent.name, sub_agent.name)
187
+ else:
188
+ for sub_agent in agent.sub_agents:
189
+ build_graph(child, sub_agent, highlight_pairs)
190
+ draw_edge(agent.name, sub_agent.name)
191
+
192
+ child.attr(
193
+ label=name,
194
+ style='rounded',
195
+ color=white,
196
+ fontcolor=light_gray,
197
+ )
198
+
199
+ def draw_node(tool_or_agent: Union[BaseAgent, BaseTool]):
200
+ name = get_node_name(tool_or_agent)
201
+ shape = get_node_shape(tool_or_agent)
202
+ caption = get_node_caption(tool_or_agent)
203
+ asCluster = should_build_agent_cluster(tool_or_agent)
204
+ child = None
205
+ if highlight_pairs:
206
+ for highlight_tuple in highlight_pairs:
207
+ if name in highlight_tuple:
208
+ # if in highlight, draw highlight node
209
+ if asCluster:
210
+ cluster = graphviz.Digraph(
211
+ name='cluster_' + name
212
+ ) # adding "cluster_" to the name makes the graph render as a cluster subgraph
213
+ build_cluster(cluster, agent, name)
214
+ graph.subgraph(cluster)
215
+ else:
216
+ graph.node(
217
+ name,
218
+ caption,
219
+ style='filled,rounded',
220
+ fillcolor=dark_green,
221
+ color=dark_green,
222
+ shape=shape,
223
+ fontcolor=light_gray,
224
+ )
225
+ return
226
+ # if not in highlight, draw non-highlight node
227
+ if asCluster:
228
+
229
+ cluster = graphviz.Digraph(
230
+ name='cluster_' + name
231
+ ) # adding "cluster_" to the name makes the graph render as a cluster subgraph
232
+ build_cluster(cluster, agent, name)
233
+ graph.subgraph(cluster)
234
+
235
+ else:
236
+ graph.node(
237
+ name,
238
+ caption,
239
+ shape=shape,
240
+ style='rounded',
241
+ color=light_gray,
242
+ fontcolor=light_gray,
243
+ )
244
+
245
+ return
246
+
247
+ def draw_edge(from_name, to_name):
248
+ if highlight_pairs:
249
+ for highlight_from, highlight_to in highlight_pairs:
250
+ if from_name == highlight_from and to_name == highlight_to:
251
+ graph.edge(from_name, to_name, color=light_green)
252
+ return
253
+ elif from_name == highlight_to and to_name == highlight_from:
254
+ graph.edge(from_name, to_name, color=light_green, dir='back')
255
+ return
256
+ # if no need to highlight, color gray
257
+ if should_build_agent_cluster(agent):
258
+
259
+ graph.edge(
260
+ from_name,
261
+ to_name,
262
+ color=light_gray,
263
+ )
264
+ else:
265
+ graph.edge(from_name, to_name, arrowhead='none', color=light_gray)
266
+
267
+ draw_node(agent)
268
+ for sub_agent in agent.sub_agents:
269
+
270
+ build_graph(graph, sub_agent, highlight_pairs, agent)
271
+ if not should_build_agent_cluster(
272
+ sub_agent
273
+ ) and not should_build_agent_cluster(
274
+ agent
275
+ ): # This is to avoid making a node for a Workflow Agent
276
+ draw_edge(agent.name, sub_agent.name)
277
+ if isinstance(agent, LlmAgent):
278
+ for tool in await agent.canonical_tools():
279
+ draw_node(tool)
280
+ draw_edge(agent.name, get_node_name(tool))
281
+
282
+
283
+ async def get_agent_graph(root_agent, highlights_pairs, image=False):
284
+ print('build graph')
285
+ graph = graphviz.Digraph(graph_attr={'rankdir': 'LR', 'bgcolor': '#333537'})
286
+ await build_graph(graph, root_agent, highlights_pairs)
287
+ if image:
288
+ return graph.pipe(format='png')
289
+ else:
290
+ return graph
@@ -0,0 +1,9 @@
1
+ <svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M16.3306 19.6098C16.6842 20.0341 16.6268 20.6646 16.2026 21.0182L13.5619 23.2187L16.2026 25.4193C16.6268 25.7728 16.6842 26.4034 16.3306 26.8277C15.977 27.2519 15.3465 27.3093 14.9222 26.9557L11.4173 24.035C10.9076 23.6102 10.9076 22.8273 11.4173 22.4025L14.9222 19.4818C15.3465 19.1282 15.977 19.1855 16.3306 19.6098Z" fill="#EA4335"/>
3
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M21.0444 19.6098C20.6908 20.0341 20.7482 20.6646 21.1724 21.0182L23.8131 23.2187L21.1724 25.4193C20.7482 25.7728 20.6908 26.4034 21.0444 26.8277C21.398 27.2519 22.0285 27.3093 22.4528 26.9557L25.9577 24.035C26.4674 23.6102 26.4674 22.8273 25.9577 22.4025L22.4528 19.4818C22.0285 19.1282 21.398 19.1855 21.0444 19.6098Z" fill="#EA4335"/>
4
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M19.75 6C22.3043 6 24.375 8.07068 24.375 10.625C24.375 13.1793 22.3043 15.25 19.75 15.25H13.25C12.6977 15.25 12.25 15.6977 12.25 16.25C12.25 16.8023 12.6977 17.25 13.25 17.25H19.75C23.4089 17.25 26.375 14.2839 26.375 10.625C26.375 6.96611 23.4089 4 19.75 4H13.25C12.6977 4 12.25 4.44772 12.25 5C12.25 5.55228 12.6977 6 13.25 6H19.75Z" fill="#34A853"/>
5
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M7 20.625H8.625C9.17728 20.625 9.625 20.1773 9.625 19.625C9.625 19.0727 9.17728 18.625 8.625 18.625H6.625C5.72754 18.625 5 19.3525 5 20.25V26.25C5 27.1475 5.72754 27.875 6.625 27.875H8.625C9.17728 27.875 9.625 27.4273 9.625 26.875C9.625 26.3227 9.17728 25.875 8.625 25.875H7V20.625Z" fill="#FBBC04"/>
6
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M11.625 6C9.07068 6 7 8.07068 7 10.625C7 13.1793 9.07068 15.25 11.625 15.25H19.3196C19.8105 15.25 20.2084 15.648 20.2084 16.1389C20.2084 16.7525 19.711 17.25 19.0973 17.25H11.625C7.96611 17.25 5 14.2839 5 10.625C5 6.96611 7.96611 4 11.625 4H18.125C18.6773 4 19.125 4.44772 19.125 5C19.125 5.55228 18.6773 6 18.125 6H11.625Z" fill="#4285F4"/>
7
+ <path d="M13 10.625C13 11.2463 12.4963 11.75 11.875 11.75C11.2537 11.75 10.75 11.2463 10.75 10.625C10.75 10.0037 11.2537 9.5 11.875 9.5C12.4963 9.5 13 10.0037 13 10.625Z" fill="#4285F4"/>
8
+ <path d="M20.75 10.625C20.75 11.2463 20.2463 11.75 19.625 11.75C19.0037 11.75 18.5 11.2463 18.5 10.625C18.5 10.0037 19.0037 9.5 19.625 9.5C20.2463 9.5 20.75 10.0037 20.75 10.625Z" fill="#4285F4"/>
9
+ </svg>
@@ -23,11 +23,11 @@
23
23
  <link rel="icon" type="image/x-icon" href="adk_favicon.svg">
24
24
  <link rel="preconnect" href="https://fonts.googleapis.com">
25
25
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
26
- <style>@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2) format('woff2');unicode-range:U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2) format('woff2');unicode-range:U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v40/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}</style>
26
+ <style>@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2) format('woff2');unicode-range:U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Open Sans';font-style:italic;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2) format('woff2');unicode-range:U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2) format('woff2');unicode-range:U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2) format('woff2');unicode-range:U+1F00-1FFF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2) format('woff2');unicode-range:U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2) format('woff2');unicode-range:U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2) format('woff2');unicode-range:U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2) format('woff2');unicode-range:U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2) format('woff2');unicode-range:U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;}@font-face{font-family:'Open Sans';font-style:normal;font-weight:300 800;font-stretch:100%;font-display:swap;src:url(https://fonts.gstatic.com/s/opensans/v43/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;}</style>
27
27
  <style>@font-face{font-family:'Material Icons';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialicons/v143/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2) format('woff2');}.material-icons{font-family:'Material Icons';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
28
28
  <style>@font-face{font-family:'Material Symbols Outlined';font-style:normal;font-weight:400;src:url(https://fonts.gstatic.com/s/materialsymbolsoutlined/v247/kJF1BvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oDMzByHX9rA6RzaxHMPdY43zj-jCxv3fzvRNU22ZXGJpEpjC_1v-p_4MrImHCIJIZrDCvHOej.woff2) format('woff2');}.material-symbols-outlined{font-family:'Material Symbols Outlined';font-weight:normal;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;-webkit-font-feature-settings:'liga';-webkit-font-smoothing:antialiased;}</style>
29
29
  <style>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}: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}</style><link rel="stylesheet" href="./styles-4VDSPQ37.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="./styles-4VDSPQ37.css"></noscript></head>
30
30
  <body>
31
31
  <app-root></app-root>
32
- <script src="./polyfills-B6TNHZQ6.js" type="module"></script><script src="./main-PKDNKWJE.js" type="module"></script></body>
32
+ <script src="./polyfills-FFHMD2TL.js" type="module"></script><script src="./main-CS5OLUMF.js" type="module"></script></body>
33
33
  </html>